@libs-ui/components-popover 0.2.357-15 → 0.2.357-16

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.
@@ -19,6 +19,8 @@ export class LibsUiComponentsPopoverComponent {
19
19
  windowMouseUp;
20
20
  windowMousemove;
21
21
  popoverOverlayComponent;
22
+ // Rect của container tại lần định vị overlay gần nhất — mốc so sánh để phát hiện container dịch chuyển/đổi kích thước (vd: resize window làm layout reflow).
23
+ rectContainerLastPositioned;
22
24
  subsEventPopup = new Subscription();
23
25
  onDestroy = new Subject();
24
26
  functionsControl;
@@ -138,7 +140,7 @@ export class LibsUiComponentsPopoverComponent {
138
140
  }
139
141
  this.addPopoverContent();
140
142
  });
141
- this.windowResize.pipe(debounceTime(500)).subscribe(this.updatePopoverOverlayPosition.bind(this));
143
+ this.windowResize.pipe(debounceTime(100)).subscribe(this.updatePopoverOverlayPosition.bind(this));
142
144
  }
143
145
  // #region FUNCTIONS
144
146
  get FunctionsControl() {
@@ -152,7 +154,9 @@ export class LibsUiComponentsPopoverComponent {
152
154
  }
153
155
  const instance = this.popoverOverlayComponent.instance;
154
156
  const nativeEl = this.elementRefCustom() || this.Element;
155
- instance.setConfig(nativeEl.getBoundingClientRect(), { ...(this.config() || {}), ...this.getDefaultConfigs() }, this.isAddContentToParentDocument());
157
+ const rectContainer = nativeEl.getBoundingClientRect();
158
+ this.rectContainerLastPositioned = rectContainer;
159
+ instance.setConfig(rectContainer, { ...(this.config() || {}), ...this.getDefaultConfigs() }, this.isAddContentToParentDocument());
156
160
  });
157
161
  }
158
162
  async updatePopoverOverlayPosition() {
@@ -161,12 +165,18 @@ export class LibsUiComponentsPopoverComponent {
161
165
  if (!this.popoverOverlayComponent?.instance || !this.config() || !this.functionsControl) {
162
166
  return;
163
167
  }
168
+ const rectContainer = await this.functionsControl.getRectContainer();
169
+ // Container đã dịch chuyển/đổi kích thước so với lần định vị gần nhất (vd: resize window làm layout reflow ngang lẫn dọc)
170
+ // → định vị lại ngay; các điều kiện switch bên dưới chỉ phát hiện lệch dọc/tràn mép phải nên không bắt được trường hợp này.
171
+ if (this.checkRectContainerMoved(rectContainer)) {
172
+ this.updatePopoverOverlay();
173
+ return;
174
+ }
164
175
  const viewPort = getViewport();
165
176
  const rectListView = await this.functionsControl.getRectContent();
166
177
  if (!rectListView) {
167
178
  return;
168
179
  }
169
- const rectContainer = await this.functionsControl.getRectContainer();
170
180
  const distanceListViewAndContainer = this.config()?.ignoreArrow === false ? 14 : 4;
171
181
  switch (this.directionPopover()) {
172
182
  case 'right':
@@ -189,6 +199,14 @@ export class LibsUiComponentsPopoverComponent {
189
199
  }
190
200
  }, 250));
191
201
  }
202
+ checkRectContainerMoved(rectContainer) {
203
+ const rectLast = this.rectContainerLastPositioned;
204
+ if (!rectLast) {
205
+ return false;
206
+ }
207
+ // Dung sai 1px để bỏ qua sai số subpixel khi trình duyệt làm tròn.
208
+ return Math.abs(rectLast.top - rectContainer.top) > 1 || Math.abs(rectLast.left - rectContainer.left) > 1 || Math.abs(rectLast.width - rectContainer.width) > 1 || Math.abs(rectLast.height - rectContainer.height) > 1;
209
+ }
192
210
  get Element() {
193
211
  if (this.initEventInElementRefCustom() && this.elementRefCustom()) {
194
212
  return this.elementRefCustom();
@@ -207,7 +225,8 @@ export class LibsUiComponentsPopoverComponent {
207
225
  this.outEvent.emit('show');
208
226
  const instance = this.popoverOverlayComponent.instance;
209
227
  nativeEl = nativeEl || this.elementRefCustom() || this.Element;
210
- instance.setConfig(nativeEl.getBoundingClientRect(), { ...(this.config() || {}), ...this.getDefaultConfigs() }, this.isAddContentToParentDocument());
228
+ this.rectContainerLastPositioned = nativeEl.getBoundingClientRect();
229
+ instance.setConfig(this.rectContainerLastPositioned, { ...(this.config() || {}), ...this.getDefaultConfigs() }, this.isAddContentToParentDocument());
211
230
  const flagsMouses = {
212
231
  isMouseEnter: true,
213
232
  isMouseEnterContent: false,
@@ -312,6 +331,7 @@ export class LibsUiComponentsPopoverComponent {
312
331
  }
313
332
  this.dynamicService.remove(this.popoverOverlayComponent);
314
333
  this.popoverOverlayComponent = undefined;
334
+ this.rectContainerLastPositioned = undefined;
315
335
  this.firstClick.set(false);
316
336
  }
317
337
  ngOnDestroy() {
@@ -328,4 +348,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
328
348
  type: Component,
329
349
  args: [{ selector: 'libs_ui-components-popover,[LibsUiComponentsPopoverDirective]', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content />\n", styles: ["::ng-deep .popover-text-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}::ng-deep .cursor-pointer{cursor:pointer}\n"] }]
330
350
  }], ctorParameters: () => [] });
331
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcG9wb3Zlci9zcmMvcG9wb3Zlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcG9wb3Zlci9zcmMvcG9wb3Zlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFvQix1QkFBdUIsRUFBRSxTQUFTLEVBQWdCLFVBQVUsRUFBcUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFcEwsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDcEYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLEdBQUcsRUFBRSx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xILE9BQU8sRUFBYyxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUs5RSxPQUFPLEVBQUUsdUNBQXVDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7QUFVdEYsTUFBTSxPQUFPLGdDQUFnQztJQUMzQyxtQkFBbUI7SUFDWCxVQUFVLENBQTBCO0lBQ3BDLFVBQVUsQ0FBMEI7SUFDcEMsVUFBVSxDQUEwQjtJQUNwQyxZQUFZLENBQTBCO0lBQ3RDLFdBQVcsQ0FBMEI7SUFDckMsZUFBZSxDQUEwQjtJQUN6QyxXQUFXLENBQTBCO0lBQ3JDLGFBQWEsQ0FBMEI7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LENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNwQyxDQUFDO3dHQXpYVSxnQ0FBZ0M7NEZBQWhDLGdDQUFnQyx3OUVDdEI3QyxrQkFDQTs7NEZEcUJhLGdDQUFnQztrQkFSNUMsU0FBUzsrQkFFRSwrREFBK0QsY0FHN0QsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgQ29tcG9uZW50UmVmLCBFbGVtZW50UmVmLCBPbkRlc3Ryb3ksIE9uSW5pdCwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQYXRoT2YgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IExpYnNVaUR5bmFtaWNDb21wb25lbnRTZXJ2aWNlIH0gZnJvbSAnQGxpYnMtdWkvc2VydmljZXMtZHluYW1pYy1jb21wb25lbnQnO1xuaW1wb3J0IHsgY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lciwgZ2V0LCBnZXRFdmVudE5hbWVIYW5kbGVDbGljaywgZ2V0Vmlld3BvcnQsIGlzTmlsLCBzZXQgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGdldFBvcG92ZXJUaW1lckRlc3Ryb3lJblF1ZXJ5VXJsIH0gZnJvbSAnLi9kZWZpbmVzL2NvbnN0YW50cy5kZWZpbmUnO1xuaW1wb3J0IHsgSUZsYWdNb3VzZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9mbGFnLW1vdXNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL2Z1bmN0aW9uLWNvbnRyb2wuaW50ZXJmYWNlJztcbmltcG9ydCB7IElQb3BvdmVyT3ZlcmxheSB9IGZyb20gJy4vaW50ZXJmYWNlcy9vdmVybGF5LmludGVyZmFjZSc7XG5pbXBvcnQgeyBUWVBFX1BPUE9WRVJfRElSRUNUSU9OLCBUWVBFX1BPUE9WRVJfRVZFTlQsIFRZUEVfUE9QT1ZFUl9NT0RFLCBUWVBFX1BPUE9WRVJfVFlQRSB9IGZyb20gJy4vaW50ZXJmYWNlcy9wb3BvdmVyLnR5cGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJPdmVybGF5Q29tcG9uZW50IH0gZnJvbSAnLi9vdmVybGF5L292ZXJsYXkuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLXBvcG92ZXIsW0xpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXScsXG4gIHRlbXBsYXRlVXJsOiAnLi9wb3BvdmVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3BvcG92ZXIuY29tcG9uZW50LnNjc3MnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJpdmF0ZSBtb3VzZUVudGVyITogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PjtcbiAgcHJpdmF0ZSBtb3VzZVdoZWVsITogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PjtcbiAgcHJpdmF0ZSBtb3VzZUNsaWNrITogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PjtcbiAgcHJpdmF0ZSB3aW5kb3dSZXNpemUhOiBPYnNlcnZhYmxlPE1vdXNlRXZlbnQ+O1xuICBwcml2YXRlIHdpbmRvd1doZWVsITogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PjtcbiAgcHJpdmF0ZSB3aW5kb3dNb3VzZURvd24hOiBPYnNlcnZhYmxlPE1vdXNlRXZlbnQ+O1xuICBwcml2YXRlIHdpbmRvd0NsaWNrITogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PjtcbiAgcHJpdmF0ZSB3aW5kb3dNb3VzZVVwITogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PjtcbiAgcHJpdmF0ZSB3aW5kb3dNb3VzZW1vdmUhOiBPYnNlcnZhYmxlPE1vdXNlRXZlbnQ+O1xuICBwcml2YXRlIHBvcG92ZXJPdmVybGF5Q29tcG9uZW50ITogQ29tcG9uZW50UmVmPExpYnNVaUNvbXBvbmVudHNQb3BvdmVyT3ZlcmxheUNvbXBvbmVudD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc3Vic0V2ZW50UG9wdXAgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25EZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBmdW5jdGlvbnNDb250cm9sPzogSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBmaXJzdENsaWNrID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250ZW50SW5uZXJIdG1sID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRpbWVyID0gc2lnbmFsPFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpcmVjdGlvblBvcG92ZXIgPSBzaWduYWw8VFlQRV9QT1BPVkVSX0RJUkVDVElPTiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAvLyAjcmVnaW9uIElOUFVUXG4gIHJlYWRvbmx5IGRlYnVnSWQgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGZsYWdNb3VzZSA9IGlucHV0PElGbGFnTW91c2UsIElGbGFnTW91c2UgfCB1bmRlZmluZWQ+KFxuICAgIHsgaXNNb3VzZUVudGVyOiBmYWxzZSwgaXNNb3VzZUVudGVyQ29udGVudDogZmFsc2UsIGlzQ29udGFpbmVySGFzU2Nyb2xsOiBmYWxzZSB9LFxuICAgIHtcbiAgICAgIHRyYW5zZm9ybTogKHZhbHVlOiBhbnkpID0+IHZhbHVlID8/IHsgaXNNb3VzZUVudGVyOiBmYWxzZSwgaXNNb3VzZUVudGVyQ29udGVudDogZmFsc2UsIGlzQ29udGFpbmVySGFzU2Nyb2xsOiBmYWxzZSB9LFxuICAgIH1cbiAgKTtcbiAgcmVhZG9ubHkgdHlwZSA9IGlucHV0PFRZUEVfUE9QT1ZFUl9UWVBFLCBUWVBFX1BPUE9WRVJfVFlQRSB8IHVuZGVmaW5lZD4oJ290aGVyJywgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gJ290aGVyJyB9KTtcbiAgcmVhZG9ubHkgbW9kZSA9IGlucHV0PFRZUEVfUE9QT1ZFUl9NT0RFLCBUWVBFX1BPUE9WRVJfTU9ERSB8IHVuZGVmaW5lZD4oJ2hvdmVyJywgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gJ2hvdmVyJyB9KTtcbiAgcmVhZG9ubHkgY29uZmlnID0gaW5wdXQoe30sIHsgdHJhbnNmb3JtOiAodmFsdWU6IElQb3BvdmVyT3ZlcmxheSB8IHVuZGVmaW5lZCkgPT4gdmFsdWUgPz8ge30gfSk7XG4gIHJlYWRvbmx5IGlnbm9yZVNob3dQb3BvdmVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgZWxlbWVudFJlZkN1c3RvbSA9IGlucHV0PEhUTUxFbGVtZW50PigpO1xuICByZWFkb25seSBpbml0RXZlbnRJbkVsZW1lbnRSZWZDdXN0b20gPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZSA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZCwgc3RyaW5nIHwgdW5kZWZpbmVkPignJywgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gJycgfSk7XG4gIHJlYWRvbmx5IGlnbm9yZUhpZGRlblBvcG92ZXJDb250ZW50V2hlbk1vdXNlTGVhdmUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUN1cnNvclBvaW50ZXJNb2RlTGlrZUNsaWNrID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgaXNBZGRDb250ZW50VG9QYXJlbnREb2N1bWVudCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUNsaWNrT3V0c2lkZSA9IGlucHV0PGJvb2xlYW4+KCk7XG5cbiAgLy8gI3JlZ2lvbiBPVVRQVVRcbiAgcmVhZG9ubHkgb3V0RXZlbnQgPSBvdXRwdXQ8VFlQRV9QT1BPVkVSX0VWRU5UPigpO1xuICByZWFkb25seSBvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlID0gb3V0cHV0PElGbGFnTW91c2U+KCk7XG4gIHJlYWRvbmx5IG91dEV2ZW50UG9wb3ZlckNvbnRlbnQgPSBvdXRwdXQ8VFlQRV9QT1BPVkVSX0RJUkVDVElPTj4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuXG4gIC8vICNyZWdpb24gSU5KRUNUXG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkeW5hbWljU2VydmljZSA9IGluamVjdChMaWJzVWlEeW5hbWljQ29tcG9uZW50U2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgbGV0IGNsYXNzRGVmYXVsdDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoY2xhc3NEZWZhdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjbGFzc0RlZmF1bHQgPSB0aGlzLkVsZW1lbnQuY2xhc3NOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRSZWZDdXN0b20oKSAhPT0gdGhpcy5FbGVtZW50ICYmIHRoaXMuRWxlbWVudC50YWdOYW1lICE9PSAnc3ZnJykge1xuICAgICAgICAgIHRoaXMuRWxlbWVudC5jbGFzc05hbWUgPSBjbGFzc0RlZmF1bHQgfHwgJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudHlwZSgpID09PSAndGV4dCcpIHtcbiAgICAgICAgICB0aGlzLkVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncG9wb3Zlci10ZXh0LWVsbGlwc2lzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubW9kZSgpLmluY2x1ZGVzKCdjbGljaycpICYmICF0aGlzLmlnbm9yZUN1cnNvclBvaW50ZXJNb2RlTGlrZUNsaWNrKCkpIHtcbiAgICAgICAgICB0aGlzLkVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnY3Vyc29yLXBvaW50ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jbGFzc0luY2x1ZGUoKSkge1xuICAgICAgICAgIHRoaXMuY2xhc3NJbmNsdWRlKClcbiAgICAgICAgICAgID8uc3BsaXQoJyAnKVxuICAgICAgICAgICAgLmZvckVhY2goKGNsYXNzTmFtZSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWNsYXNzTmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLkVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yLCB0aGlzLkVsZW1lbnQsIHRoaXMuRWxlbWVudC50YWdOYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHRoaXMuY29uZmlnKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5wb3BvdmVyT3ZlcmxheUNvbXBvbmVudD8uaW5zdGFuY2UgJiYgIWZpcnN0KSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVQb3BvdmVyT3ZlcmxheVBvc2l0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5vdXRFdmVudFBvcG92ZXJDb250ZW50LnN1YnNjcmliZSgoZGlyZWN0aW9uKSA9PiB0aGlzLmRpcmVjdGlvblBvcG92ZXIuc2V0KGRpcmVjdGlvbikpO1xuICAgIHRoaXMuZnVuY3Rpb25zQ29udHJvbCA9IHtcbiAgICAgIHJlbW92ZVBvcG92ZXJPdmVybGF5OiB0aGlzLnJlbW92ZVBvcG92ZXJPdmVybGF5LmJpbmQodGhpcyksXG4gICAgICB1cGRhdGVQb3BvdmVyT3ZlcmxheVBvc2l0aW9uOiB0aGlzLnVwZGF0ZVBvcG92ZXJPdmVybGF5UG9zaXRpb24uYmluZCh0aGlzKSxcbiAgICAgIGdldFJlY3RDb250YWluZXI6IGFzeW5jICgpID0+ICh0aGlzLmVsZW1lbnRSZWZDdXN0b20oKSB8fCB0aGlzLkVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgZ2V0UmVjdENvbnRlbnQ6IGFzeW5jICgpID0+IHRoaXMucG9wb3Zlck92ZXJsYXlDb21wb25lbnQ/Lmluc3RhbmNlPy5Db250YWluZXJFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgIHNob3dQb3BvdmVyOiB0aGlzLmFkZFBvcG92ZXJDb250ZW50LmJpbmQodGhpcyksXG4gICAgICB1cGRhdGVQb3BvdmVyT3ZlcmxheTogdGhpcy51cGRhdGVQb3BvdmVyT3ZlcmxheS5iaW5kKHRoaXMpLFxuICAgIH07XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQodGhpcy5GdW5jdGlvbnNDb250cm9sKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICBjb25zdCBuYXRpdmVFbCA9IHRoaXMuRWxlbWVudDtcbiAgICB0aGlzLm1vdXNlRW50ZXIgPSB0aGlzLmluaXRPYnNlcnZhYmxlKG5hdGl2ZUVsLCAnbW91c2VlbnRlcicpO1xuICAgIHRoaXMuaW5pdE9ic2VydmFibGUobmF0aXZlRWwsICdjbGljaycpLnN1YnNjcmliZSgpO1xuICAgIHRoaXMubW91c2VDbGljayA9IHRoaXMuaW5pdE9ic2VydmFibGUobmF0aXZlRWwsIGdldEV2ZW50TmFtZUhhbmRsZUNsaWNrKTtcbiAgICB0aGlzLm1vdXNlV2hlZWwgPSB0aGlzLmluaXRPYnNlcnZhYmxlKHdpbmRvdywgJ3doZWVsJyk7XG4gICAgdGhpcy53aW5kb3dSZXNpemUgPSB0aGlzLmluaXRPYnNlcnZhYmxlKHdpbmRvdywgJ3Jlc2l6ZScpO1xuICAgIHRoaXMud2luZG93V2hlZWwgPSB0aGlzLmluaXRPYnNlcnZhYmxlKHdpbmRvdywgJ3doZWVsJyk7XG4gICAgdGhpcy53aW5kb3dNb3VzZURvd24gPSB0aGlzLmluaXRPYnNlcnZhYmxlKHdpbmRvdywgJ21vdXNlZG93bicpO1xuICAgIHRoaXMud2luZG93Q2xpY2sgPSB0aGlzLmluaXRPYnNlcnZhYmxlKHdpbmRvdywgZ2V0RXZlbnROYW1lSGFuZGxlQ2xpY2spO1xuICAgIHRoaXMud2luZG93TW91c2VVcCA9IHRoaXMuaW5pdE9ic2VydmFibGUod2luZG93LCAnbW91c2V1cCcpO1xuICAgIHRoaXMud2luZG93TW91c2Vtb3ZlID0gdGhpcy5pbml0T2JzZXJ2YWJsZSh3aW5kb3csICdtb3VzZW1vdmUnKTtcbiAgICB0aGlzLm1vdXNlRW50ZXIuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5tb2RlKCkuaW5jbHVkZXMoJ2hvdmVyJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy50eXBlKCkgPT09ICd0ZXh0JyAmJiBuYXRpdmVFbD8uY2xpZW50V2lkdGggPj0gbmF0aXZlRWwuc2Nyb2xsV2lkdGggJiYgIXRoaXMucG9wb3Zlck92ZXJsYXlDb21wb25lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5hZGRQb3BvdmVyQ29udGVudCgpO1xuICAgIH0pO1xuICAgIHRoaXMubW91c2VDbGljay5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5maXJzdENsaWNrLnVwZGF0ZSgodmFsKSA9PiAodGhpcy5pZ25vcmVTaG93UG9wb3ZlcigpID8gZmFsc2UgOiAhdmFsKSk7XG4gICAgICB0aGlzLm91dEV2ZW50LmVtaXQoJ2NsaWNrJyk7XG5cbiAgICAgIGlmICghdGhpcy5tb2RlKCkuc3RhcnRzV2l0aCgnY2xpY2snKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ2NsaWNrLXRvZ2dsZScgJiYgIXRoaXMuZmlyc3RDbGljaygpKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlUG9wb3Zlck92ZXJsYXkoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmFkZFBvcG92ZXJDb250ZW50KCk7XG4gICAgfSk7XG4gICAgdGhpcy53aW5kb3dSZXNpemUucGlwZShkZWJvdW5jZVRpbWUoNTAwKSkuc3Vic2NyaWJlKHRoaXMudXBkYXRlUG9wb3Zlck92ZXJsYXlQb3NpdGlvbi5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8vICNyZWdpb24gRlVOQ1RJT05TXG4gIHB1YmxpYyBnZXQgRnVuY3Rpb25zQ29udHJvbCgpOiBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgICByZXR1cm4gdGhpcy5mdW5jdGlvbnNDb250cm9sIGFzIElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQ7XG4gIH1cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVQb3BvdmVyT3ZlcmxheSgpIHtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIGlmICghdGhpcy5wb3BvdmVyT3ZlcmxheUNvbXBvbmVudD8uaW5zdGFuY2UgfHwgIXRoaXMuY29uZmlnKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLnBvcG92ZXJPdmVybGF5Q29tcG9uZW50Lmluc3RhbmNlO1xuICAgICAgY29uc3QgbmF0aXZlRWwgPSB0aGlzLmVsZW1lbnRSZWZDdXN0b20oKSB8fCB0aGlzLkVsZW1lbnQ7XG5cbiAgICAgIGluc3RhbmNlLnNldENvbmZpZyhuYXRpdmVFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgeyAuLi4odGhpcy5jb25maWcoKSB8fCB7fSksIC4uLnRoaXMuZ2V0RGVmYXVsdENvbmZpZ3MoKSB9LCB0aGlzLmlzQWRkQ29udGVudFRvUGFyZW50RG9jdW1lbnQoKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZVBvcG92ZXJPdmVybGF5UG9zaXRpb24oKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIoKSk7XG4gICAgdGhpcy50aW1lci5zZXQoXG4gICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnBvcG92ZXJPdmVybGF5Q29tcG9uZW50Py5pbnN0YW5jZSB8fCAhdGhpcy5jb25maWcoKSB8fCAhdGhpcy5mdW5jdGlvbnNDb250cm9sKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZpZXdQb3J0ID0gZ2V0Vmlld3BvcnQoKTtcbiAgICAgICAgY29uc3QgcmVjdExpc3RWaWV3ID0gYXdhaXQgdGhpcy5mdW5jdGlvbnNDb250cm9sLmdldFJlY3RDb250ZW50KCk7XG5cbiAgICAgICAgaWYgKCFyZWN0TGlzdFZpZXcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVjdENvbnRhaW5lciA9IGF3YWl0IHRoaXMuZnVuY3Rpb25zQ29udHJvbC5nZXRSZWN0Q29udGFpbmVyKCk7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlTGlzdFZpZXdBbmRDb250YWluZXIgPSB0aGlzLmNvbmZpZygpPy5pZ25vcmVBcnJvdyA9PT0gZmFsc2UgPyAxNCA6IDQ7XG4gICAgICAgIHN3aXRjaCAodGhpcy5kaXJlY3Rpb25Qb3BvdmVyKCkpIHtcbiAgICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgcmVjdExpc3RWaWV3LnRvcCArIHJlY3RMaXN0Vmlldy5oZWlnaHQgPiB2aWV3UG9ydC5oZWlnaHQgfHxcbiAgICAgICAgICAgICAgcmVjdExpc3RWaWV3LnRvcCA8IHJlY3RDb250YWluZXIudG9wICsgcmVjdENvbnRhaW5lci5oZWlnaHQgfHxcbiAgICAgICAgICAgICAgcmVjdExpc3RWaWV3LnRvcCAtIChyZWN0Q29udGFpbmVyLnRvcCArIHJlY3RDb250YWluZXIuaGVpZ2h0KSA+IGRpc3RhbmNlTGlzdFZpZXdBbmRDb250YWluZXIgfHxcbiAgICAgICAgICAgICAgcmVjdExpc3RWaWV3LmxlZnQgKyByZWN0TGlzdFZpZXcud2lkdGggPiB2aWV3UG9ydC53aWR0aFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9wb3Zlck92ZXJsYXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgcmVjdENvbnRhaW5lci50b3AgLSAocmVjdExpc3RWaWV3LnRvcCArIHJlY3RMaXN0Vmlldy5oZWlnaHQpID4gZGlzdGFuY2VMaXN0Vmlld0FuZENvbnRhaW5lciB8fFxuICAgICAgICAgICAgICByZWN0TGlzdFZpZXcudG9wICsgcmVjdExpc3RWaWV3LmhlaWdodCArIGRpc3RhbmNlTGlzdFZpZXdBbmRDb250YWluZXIgPiByZWN0Q29udGFpbmVyLnRvcCArIDIgfHxcbiAgICAgICAgICAgICAgcmVjdExpc3RWaWV3LmxlZnQgKyByZWN0TGlzdFZpZXcud2lkdGggPiB2aWV3UG9ydC53aWR0aFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9wb3Zlck92ZXJsYXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9LCAyNTApXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgaWYgKHRoaXMuaW5pdEV2ZW50SW5FbGVtZW50UmVmQ3VzdG9tKCkgJiYgdGhpcy5lbGVtZW50UmVmQ3VzdG9tKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWZDdXN0b20oKSBhcyBIVE1MRWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIHx8IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0T2JzZXJ2YWJsZShlbDogYW55LCBldmVudE5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8TW91c2VFdmVudD4ge1xuICAgIHJldHVybiBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZWwsIGV2ZW50TmFtZSkucGlwZShcbiAgICAgIHRhcCgoZSkgPT4gIXRoaXMuaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnQoKSAmJiBlLnN0b3BQcm9wYWdhdGlvbigpKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRQb3BvdmVyQ29udGVudChuYXRpdmVFbD86IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMucG9wb3Zlck92ZXJsYXlDb21wb25lbnQgfHwgdGhpcy5pZ25vcmVTaG93UG9wb3ZlcigpIHx8ICF0aGlzLmNvbmZpZygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wb3BvdmVyT3ZlcmxheUNvbXBvbmVudCA9IHRoaXMuZHluYW1pY1NlcnZpY2UucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoTGlic1VpQ29tcG9uZW50c1BvcG92ZXJPdmVybGF5Q29tcG9uZW50KTtcbiAgICB0aGlzLmR5bmFtaWNTZXJ2aWNlLmFkZFRvQm9keSh0aGlzLnBvcG92ZXJPdmVybGF5Q29tcG9uZW50LCB0aGlzLmlzQWRkQ29udGVudFRvUGFyZW50RG9jdW1lbnQoKSB8fCB0aGlzLmNvbmZpZygpLmlzQWRkQ29udGVudFRvUGFyZW50RG9jdW1lbnQpO1xuICAgIHRoaXMub3V0RXZlbnQuZW1pdCgnc2hvdycpO1xuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5wb3BvdmVyT3ZlcmxheUNvbXBvbmVudC5pbnN0YW5jZTtcblxuICAgIG5hdGl2ZUVsID0gbmF0aXZlRWwgfHwgdGhpcy5lbGVtZW50UmVmQ3VzdG9tKCkgfHwgdGhpcy5FbGVtZW50O1xuICAgIGluc3RhbmNlLnNldENvbmZpZyhuYXRpdmVFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgeyAuLi4odGhpcy5jb25maWcoKSB8fCB7fSksIC4uLnRoaXMuZ2V0RGVmYXVsdENvbmZpZ3MoKSB9LCB0aGlzLmlzQWRkQ29udGVudFRvUGFyZW50RG9jdW1lbnQoKSk7XG4gICAgY29uc3QgZmxhZ3NNb3VzZXM6IElGbGFnTW91c2UgPSB7XG4gICAgICBpc01vdXNlRW50ZXI6IHRydWUsXG4gICAgICBpc01vdXNlRW50ZXJDb250ZW50OiBmYWxzZSxcbiAgICAgIGlzQ29udGFpbmVySGFzU2Nyb2xsOiBuYXRpdmVFbC5vZmZzZXRIZWlnaHQgPCBuYXRpdmVFbC5zY3JvbGxIZWlnaHQsXG4gICAgfTtcbiAgICBjb25zdCBuYXRpdmVFbENvbnRhaW5lciA9IGluc3RhbmNlLkVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBtb3VzZUVudGVyQ29udGVudCA9IHRoaXMuaW5pdE9ic2VydmFibGUobmF0aXZlRWxDb250YWluZXIsICdtb3VzZWVudGVyJyk7XG4gICAgY29uc3QgbW91c2VMZWF2ZUNvbnRlbnQgPSB0aGlzLmluaXRPYnNlcnZhYmxlKG5hdGl2ZUVsQ29udGFpbmVyLCAnbW91c2VsZWF2ZScpO1xuICAgIHRoaXMuc3Vic0V2ZW50UG9wdXAuYWRkKFxuICAgICAgaW5zdGFuY2Uub3V0RXZlbnQuc3Vic2NyaWJlKChkaXJlY3Rpb246IFRZUEVfUE9QT1ZFUl9ESVJFQ1RJT04pID0+IHtcbiAgICAgICAgdGhpcy5vdXRFdmVudFBvcG92ZXJDb250ZW50LmVtaXQoZGlyZWN0aW9uKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic0V2ZW50UG9wdXAuYWRkKFxuICAgICAgbW91c2VFbnRlckNvbnRlbnQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5vdXRFdmVudC5lbWl0KCdtb3VzZWVudGVyLWNvbnRlbnQnKTtcbiAgICAgICAgZmxhZ3NNb3VzZXMuaXNNb3VzZUVudGVyQ29udGVudCA9IHRydWU7XG4gICAgICAgIHRoaXMub3V0Q2hhbmdTdGFnZUZsYWdNb3VzZS5lbWl0KGZsYWdzTW91c2VzKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic0V2ZW50UG9wdXAuYWRkKFxuICAgICAgdGhpcy5tb3VzZUVudGVyLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMub3V0RXZlbnQuZW1pdCgnbW91c2VlbnRlci1lbGVtZW50Jyk7XG4gICAgICAgIHRoaXMub3V0Q2hhbmdTdGFnZUZsYWdNb3VzZS5lbWl0KGZsYWdzTW91c2VzKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic0V2ZW50UG9wdXAuYWRkKFxuICAgICAgdGhpcy5tb3VzZVdoZWVsLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGZsYWdzTW91c2VzLmlzQ29udGFpbmVySGFzU2Nyb2xsID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKG5hdGl2ZUVsLm9mZnNldEhlaWdodCA8IG5hdGl2ZUVsLnNjcm9sbEhlaWdodCkge1xuICAgICAgICAgIGZsYWdzTW91c2VzLmlzQ29udGFpbmVySGFzU2Nyb2xsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGZsYWdzTW91c2VzLmlzTW91c2VFbnRlciAmJiBmbGFnc01vdXNlcy5pc0NvbnRhaW5lckhhc1Njcm9sbCkgfHwgZmxhZ3NNb3VzZXMuaXNNb3VzZUVudGVyQ29udGVudCB8fCB0aGlzLmZsYWdNb3VzZSgpLmlzTW91c2VFbnRlciB8fCB0aGlzLmZsYWdNb3VzZSgpLmlzTW91c2VFbnRlckNvbnRlbnQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVQb3BvdmVyT3ZlcmxheSgpO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuaGFuZGxlck1vdXNlTGVhdmVSZW1vdmVQb3BvdmVyT3ZlcmxheSh0aGlzLndpbmRvd01vdXNlbW92ZSwgZmxhZ3NNb3VzZXMsICdpc01vdXNlRW50ZXInLCAnaXNNb3VzZUVudGVyQ29udGVudCcsICdtb3VzZWxlYXZlLWVsZW1lbnQnKTtcbiAgICB0aGlzLmhhbmRsZXJNb3VzZUxlYXZlUmVtb3ZlUG9wb3Zlck92ZXJsYXkobW91c2VMZWF2ZUNvbnRlbnQsIGZsYWdzTW91c2VzLCAnaXNNb3VzZUVudGVyQ29udGVudCcsICdpc01vdXNlRW50ZXInLCAnbW91c2VsZWF2ZS1jb250ZW50Jyk7XG5cbiAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdjbGlja19vcGVuX2FuZF9jbGlja19wYW5lbF9jb250ZW50X2hpZGRlbicpIHtcbiAgICAgIHRoaXMuc3Vic0V2ZW50UG9wdXAuYWRkKFxuICAgICAgICB0aGlzLmluaXRPYnNlcnZhYmxlKG5hdGl2ZUVsQ29udGFpbmVyLCAnY2xpY2snKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVtb3ZlUG9wb3Zlck92ZXJsYXkoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVyV2luZG93RXZlbnRSZW1vdmVQb3BvdmVyT3ZlcmxheSh0aGlzLndpbmRvd0NsaWNrLCBmbGFnc01vdXNlcyk7XG4gICAgdGhpcy5oYW5kbGVyV2luZG93RXZlbnRSZW1vdmVQb3BvdmVyT3ZlcmxheSh0aGlzLndpbmRvd01vdXNlRG93biwgZmxhZ3NNb3VzZXMpO1xuICAgIHRoaXMuaGFuZGxlcldpbmRvd0V2ZW50UmVtb3ZlUG9wb3Zlck92ZXJsYXkodGhpcy53aW5kb3dNb3VzZVVwLCBmbGFnc01vdXNlcyk7XG4gICAgdGhpcy5oYW5kbGVyV2luZG93RXZlbnRSZW1vdmVQb3BvdmVyT3ZlcmxheSh0aGlzLndpbmRvd1doZWVsLCBmbGFnc01vdXNlcyk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZXJXaW5kb3dFdmVudFJlbW92ZVBvcG92ZXJPdmVybGF5KG9iczogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PiwgZmxhZ3NNb3VzZXM6IElGbGFnTW91c2UpIHtcbiAgICB0aGlzLnN1YnNFdmVudFBvcHVwLmFkZChcbiAgICAgIG9icy5waXBlKGRlYm91bmNlVGltZSgxMCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmIChmbGFnc01vdXNlcy5pc01vdXNlRW50ZXIgfHwgZmxhZ3NNb3VzZXMuaXNNb3VzZUVudGVyQ29udGVudCB8fCB0aGlzLmlnbm9yZUNsaWNrT3V0c2lkZSgpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZsYWdNb3VzZSgpICYmICh0aGlzLmZsYWdNb3VzZSgpLmlzTW91c2VFbnRlciB8fCB0aGlzLmZsYWdNb3VzZSgpLmlzTW91c2VFbnRlckNvbnRlbnQpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlyc3RDbGljay5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnJlbW92ZVBvcG92ZXJPdmVybGF5KCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZXJNb3VzZUxlYXZlUmVtb3ZlUG9wb3Zlck92ZXJsYXkob2JzOiBPYnNlcnZhYmxlPE1vdXNlRXZlbnQ+LCBmbGFnc01vdXNlczogSUZsYWdNb3VzZSwgZmxhZ0tleUNoYW5nZVZhbHVlOiBQYXRoT2Y8SUZsYWdNb3VzZT4sIGZsYWdLZXlDaGVjazogUGF0aE9mPElGbGFnTW91c2U+LCBvdXRFdmVudDogVFlQRV9QT1BPVkVSX0VWRU5UKSB7XG4gICAgdGhpcy5zdWJzRXZlbnRQb3B1cC5hZGQoXG4gICAgICBvYnNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKCgpID0+IHRoaXMub3V0RXZlbnQuZW1pdChvdXRFdmVudCkpLFxuICAgICAgICAgIGRlYm91bmNlVGltZShnZXRQb3BvdmVyVGltZXJEZXN0cm95SW5RdWVyeVVybCgpIHx8IHRoaXMuY29uZmlnKCk/LnRpbWVyRGVzdHJveSB8fCAwKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBvdXRFdmVudCA9PT0gJ21vdXNlbGVhdmUtZWxlbWVudCcgJiZcbiAgICAgICAgICAgIChjaGVja01vdXNlT3ZlckluQ29udGFpbmVyKGUsIHRoaXMuRWxlbWVudCkgfHwgY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lcih7IGNsaWVudFg6IGUuY2xpZW50WCArIDIsIGNsaWVudFk6IGUuY2xpZW50WSArIDIgfSwgdGhpcy5FbGVtZW50KSB8fCBjaGVja01vdXNlT3ZlckluQ29udGFpbmVyKHsgY2xpZW50WDogZS5jbGllbnRYIC0gMiwgY2xpZW50WTogZS5jbGllbnRZIC0gMiB9LCB0aGlzLkVsZW1lbnQpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXQoZmxhZ3NNb3VzZXMsIGZsYWdLZXlDaGFuZ2VWYWx1ZSwgZmFsc2UpO1xuICAgICAgICAgIHRoaXMub3V0Q2hhbmdTdGFnZUZsYWdNb3VzZS5lbWl0KGZsYWdzTW91c2VzKTtcbiAgICAgICAgICBpZiAodGhpcy5mbGFnTW91c2UoKSAmJiAodGhpcy5mbGFnTW91c2UoKS5pc01vdXNlRW50ZXIgfHwgdGhpcy5mbGFnTW91c2UoKS5pc01vdXNlRW50ZXJDb250ZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChnZXQoZmxhZ3NNb3VzZXMsIGZsYWdLZXlDaGVjaykgfHwgdGhpcy5pZ25vcmVIaWRkZW5Qb3BvdmVyQ29udGVudFdoZW5Nb3VzZUxlYXZlKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5yZW1vdmVQb3BvdmVyT3ZlcmxheSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRDb25maWdzKCk6IElQb3BvdmVyT3ZlcmxheSB7XG4gICAgY29uc3QgY29uZmlnVmFsdWUgPSB0aGlzLmNvbmZpZygpIHx8IHt9O1xuICAgIGlmIChpc05pbChjb25maWdWYWx1ZS5jb250ZW50KSB8fCAoY29uZmlnVmFsdWUuY29udGVudCA9PT0gdGhpcy5jb250ZW50SW5uZXJIdG1sKCkgJiYgdGhpcy5jb250ZW50SW5uZXJIdG1sKCkgIT09IHRoaXMuRWxlbWVudC5pbm5lckhUTUwpKSB7XG4gICAgICBjb25maWdWYWx1ZS5jb250ZW50ID0gdGhpcy5FbGVtZW50LmlubmVySFRNTDtcbiAgICB9XG4gICAgdGhpcy5jb250ZW50SW5uZXJIdG1sLnNldCh0aGlzLkVsZW1lbnQuaW5uZXJIVE1MKTtcbiAgICBpZiAoIWNvbmZpZ1ZhbHVlLm1heFdpZHRoKSB7XG4gICAgICBjb25maWdWYWx1ZS5tYXhXaWR0aCA9IDI1MDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZ1ZhbHVlLm1heEhlaWdodCA9PT0gdW5kZWZpbmVkIHx8IGNvbmZpZ1ZhbHVlLm1heEhlaWdodCA9PT0gMCkge1xuICAgICAgY29uZmlnVmFsdWUubWF4SGVpZ2h0ID0gMTQwO1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZ1ZhbHVlLmRpcmVjdGlvbikge1xuICAgICAgY29uZmlnVmFsdWUuZGlyZWN0aW9uID0gJ2JvdHRvbSc7XG4gICAgfVxuICAgIGlmICghY29uZmlnVmFsdWUucG9zaXRpb24pIHtcbiAgICAgIGNvbmZpZ1ZhbHVlLnBvc2l0aW9uID0ge1xuICAgICAgICBtb2RlOiAnY2VudGVyJyxcbiAgICAgICAgZGlzdGFuY2U6IDAsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBjb25maWdWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlUG9wb3Zlck92ZXJsYXkoKSB7XG4gICAgaWYgKHRoaXMucG9wb3Zlck92ZXJsYXlDb21wb25lbnQpIHtcbiAgICAgIHRoaXMub3V0RXZlbnQuZW1pdCgncmVtb3ZlJyk7XG4gICAgICB0aGlzLnN1YnNFdmVudFBvcHVwLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnN1YnNFdmVudFBvcHVwID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLmR5bmFtaWNTZXJ2aWNlLnJlbW92ZSh0aGlzLnBvcG92ZXJPdmVybGF5Q29tcG9uZW50KTtcbiAgICB0aGlzLnBvcG92ZXJPdmVybGF5Q29tcG9uZW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZmlyc3RDbGljay5zZXQoZmFsc2UpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIoKSk7XG4gICAgdGhpcy5yZW1vdmVQb3BvdmVyT3ZlcmxheSgpO1xuICAgIHRoaXMub25EZXN0cm95Lm5leHQoKTtcbiAgICB0aGlzLm9uRGVzdHJveS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuc3Vic0V2ZW50UG9wdXAudW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiPG5nLWNvbnRlbnQgLz5cbiJdfQ==
351
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcG9wb3Zlci9zcmMvcG9wb3Zlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcG9wb3Zlci9zcmMvcG9wb3Zlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFvQix1QkFBdUIsRUFBRSxTQUFTLEVBQWdCLFVBQVUsRUFBcUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFcEwsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDcEYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLEdBQUcsRUFBRSx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xILE9BQU8sRUFBYyxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUs5RSxPQUFPLEVBQUUsdUNBQXVDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7QUFVdEYsTUFBTSxPQUFPLGdDQUFnQztJQUMzQyxtQkFBbUI7SUFDWCxVQUFVLENBQTBCO0lBQ3BDLFVBQVUsQ0FBMEI7SUFDcEMsVUFBVSxDQUEwQjtJQUNwQyxZQUFZLENBQTBCO0lBQ3RDLFdBQVcsQ0FBMEI7SUFDckMsZUFBZSxDQUEwQjtJQUN6QyxXQUFXLENBQTBCO0lBQ3JDLGFBQWEsQ0FBMEI7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RUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDcEMsQ0FBQzt3R0E5WVUsZ0NBQWdDOzRGQUFoQyxnQ0FBZ0MsdzlFQ3RCN0Msa0JBQ0E7OzRGRHFCYSxnQ0FBZ0M7a0JBUjVDLFNBQVM7K0JBRUUsK0RBQStELGNBRzdELElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIENvbXBvbmVudFJlZiwgRWxlbWVudFJlZiwgT25EZXN0cm95LCBPbkluaXQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUJvdW5kaW5nQ2xpZW50UmVjdCwgUGF0aE9mIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5pbXBvcnQgeyBMaWJzVWlEeW5hbWljQ29tcG9uZW50U2VydmljZSB9IGZyb20gJ0BsaWJzLXVpL3NlcnZpY2VzLWR5bmFtaWMtY29tcG9uZW50JztcbmltcG9ydCB7IGNoZWNrTW91c2VPdmVySW5Db250YWluZXIsIGdldCwgZ2V0RXZlbnROYW1lSGFuZGxlQ2xpY2ssIGdldFZpZXdwb3J0LCBpc05pbCwgc2V0IH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBnZXRQb3BvdmVyVGltZXJEZXN0cm95SW5RdWVyeVVybCB9IGZyb20gJy4vZGVmaW5lcy9jb25zdGFudHMuZGVmaW5lJztcbmltcG9ydCB7IElGbGFnTW91c2UgfSBmcm9tICcuL2ludGVyZmFjZXMvZmxhZy1tb3VzZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9mdW5jdGlvbi1jb250cm9sLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJUG9wb3Zlck92ZXJsYXkgfSBmcm9tICcuL2ludGVyZmFjZXMvb3ZlcmxheS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVFlQRV9QT1BPVkVSX0RJUkVDVElPTiwgVFlQRV9QT1BPVkVSX0VWRU5ULCBUWVBFX1BPUE9WRVJfTU9ERSwgVFlQRV9QT1BPVkVSX1RZUEUgfSBmcm9tICcuL2ludGVyZmFjZXMvcG9wb3Zlci50eXBlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNQb3BvdmVyT3ZlcmxheUNvbXBvbmVudCB9IGZyb20gJy4vb3ZlcmxheS9vdmVybGF5LmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyLFtMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZV0nLFxuICB0ZW1wbGF0ZVVybDogJy4vcG9wb3Zlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9wb3BvdmVyLmNvbXBvbmVudC5zY3NzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICAvLyAjcmVnaW9uIFBST1BFUlRZXG4gIHByaXZhdGUgbW91c2VFbnRlciE6IE9ic2VydmFibGU8TW91c2VFdmVudD47XG4gIHByaXZhdGUgbW91c2VXaGVlbCE6IE9ic2VydmFibGU8TW91c2VFdmVudD47XG4gIHByaXZhdGUgbW91c2VDbGljayE6IE9ic2VydmFibGU8TW91c2VFdmVudD47XG4gIHByaXZhdGUgd2luZG93UmVzaXplITogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PjtcbiAgcHJpdmF0ZSB3aW5kb3dXaGVlbCE6IE9ic2VydmFibGU8TW91c2VFdmVudD47XG4gIHByaXZhdGUgd2luZG93TW91c2VEb3duITogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PjtcbiAgcHJpdmF0ZSB3aW5kb3dDbGljayE6IE9ic2VydmFibGU8TW91c2VFdmVudD47XG4gIHByaXZhdGUgd2luZG93TW91c2VVcCE6IE9ic2VydmFibGU8TW91c2VFdmVudD47XG4gIHByaXZhdGUgd2luZG93TW91c2Vtb3ZlITogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PjtcbiAgcHJpdmF0ZSBwb3BvdmVyT3ZlcmxheUNvbXBvbmVudCE6IENvbXBvbmVudFJlZjxMaWJzVWlDb21wb25lbnRzUG9wb3Zlck92ZXJsYXlDb21wb25lbnQ+IHwgdW5kZWZpbmVkO1xuICAvLyBSZWN0IGPhu6dhIGNvbnRhaW5lciB04bqhaSBs4bqnbiDEkeG7i25oIHbhu4sgb3ZlcmxheSBn4bqnbiBuaOG6pXQg4oCUIG3hu5FjIHNvIHPDoW5oIMSR4buDIHBow6F0IGhp4buHbiBjb250YWluZXIgZOG7i2NoIGNodXnhu4NuL8SR4buVaSBrw61jaCB0aMaw4bubYyAodmQ6IHJlc2l6ZSB3aW5kb3cgbMOgbSBsYXlvdXQgcmVmbG93KS5cbiAgcHJpdmF0ZSByZWN0Q29udGFpbmVyTGFzdFBvc2l0aW9uZWQ/OiBJQm91bmRpbmdDbGllbnRSZWN0O1xuICBwcml2YXRlIHN1YnNFdmVudFBvcHVwID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgZnVuY3Rpb25zQ29udHJvbD86IElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlyc3RDbGljayA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGVudElubmVySHRtbCA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0aW1lciA9IHNpZ25hbDxSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkaXJlY3Rpb25Qb3BvdmVyID0gc2lnbmFsPFRZUEVfUE9QT1ZFUl9ESVJFQ1RJT04gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgLy8gI3JlZ2lvbiBJTlBVVFxuICByZWFkb25seSBkZWJ1Z0lkID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBmbGFnTW91c2UgPSBpbnB1dDxJRmxhZ01vdXNlLCBJRmxhZ01vdXNlIHwgdW5kZWZpbmVkPihcbiAgICB7IGlzTW91c2VFbnRlcjogZmFsc2UsIGlzTW91c2VFbnRlckNvbnRlbnQ6IGZhbHNlLCBpc0NvbnRhaW5lckhhc1Njcm9sbDogZmFsc2UgfSxcbiAgICB7XG4gICAgICB0cmFuc2Zvcm06ICh2YWx1ZTogYW55KSA9PiB2YWx1ZSA/PyB7IGlzTW91c2VFbnRlcjogZmFsc2UsIGlzTW91c2VFbnRlckNvbnRlbnQ6IGZhbHNlLCBpc0NvbnRhaW5lckhhc1Njcm9sbDogZmFsc2UgfSxcbiAgICB9XG4gICk7XG4gIHJlYWRvbmx5IHR5cGUgPSBpbnB1dDxUWVBFX1BPUE9WRVJfVFlQRSwgVFlQRV9QT1BPVkVSX1RZUEUgfCB1bmRlZmluZWQ+KCdvdGhlcicsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/ICdvdGhlcicgfSk7XG4gIHJlYWRvbmx5IG1vZGUgPSBpbnB1dDxUWVBFX1BPUE9WRVJfTU9ERSwgVFlQRV9QT1BPVkVSX01PREUgfCB1bmRlZmluZWQ+KCdob3ZlcicsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/ICdob3ZlcicgfSk7XG4gIHJlYWRvbmx5IGNvbmZpZyA9IGlucHV0KHt9LCB7IHRyYW5zZm9ybTogKHZhbHVlOiBJUG9wb3Zlck92ZXJsYXkgfCB1bmRlZmluZWQpID0+IHZhbHVlID8/IHt9IH0pO1xuICByZWFkb25seSBpZ25vcmVTaG93UG9wb3ZlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGVsZW1lbnRSZWZDdXN0b20gPSBpbnB1dDxIVE1MRWxlbWVudD4oKTtcbiAgcmVhZG9ubHkgaW5pdEV2ZW50SW5FbGVtZW50UmVmQ3VzdG9tID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGUgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/ICcnIH0pO1xuICByZWFkb25seSBpZ25vcmVIaWRkZW5Qb3BvdmVyQ29udGVudFdoZW5Nb3VzZUxlYXZlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVDdXJzb3JQb2ludGVyTW9kZUxpa2VDbGljayA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlzQWRkQ29udGVudFRvUGFyZW50RG9jdW1lbnQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVDbGlja091dHNpZGUgPSBpbnB1dDxib29sZWFuPigpO1xuXG4gIC8vICNyZWdpb24gT1VUUFVUXG4gIHJlYWRvbmx5IG91dEV2ZW50ID0gb3V0cHV0PFRZUEVfUE9QT1ZFUl9FVkVOVD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdTdGFnZUZsYWdNb3VzZSA9IG91dHB1dDxJRmxhZ01vdXNlPigpO1xuICByZWFkb25seSBvdXRFdmVudFBvcG92ZXJDb250ZW50ID0gb3V0cHV0PFRZUEVfUE9QT1ZFUl9ESVJFQ1RJT04+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcblxuICAvLyAjcmVnaW9uIElOSkVDVFxuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgZHluYW1pY1NlcnZpY2UgPSBpbmplY3QoTGlic1VpRHluYW1pY0NvbXBvbmVudFNlcnZpY2UpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGxldCBjbGFzc0RlZmF1bHQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGNsYXNzRGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY2xhc3NEZWZhdWx0ID0gdGhpcy5FbGVtZW50LmNsYXNzTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lbGVtZW50UmVmQ3VzdG9tKCkgIT09IHRoaXMuRWxlbWVudCAmJiB0aGlzLkVsZW1lbnQudGFnTmFtZSAhPT0gJ3N2ZycpIHtcbiAgICAgICAgICB0aGlzLkVsZW1lbnQuY2xhc3NOYW1lID0gY2xhc3NEZWZhdWx0IHx8ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnR5cGUoKSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgdGhpcy5FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3BvcG92ZXItdGV4dC1lbGxpcHNpcycpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKS5pbmNsdWRlcygnY2xpY2snKSAmJiAhdGhpcy5pZ25vcmVDdXJzb3JQb2ludGVyTW9kZUxpa2VDbGljaygpKSB7XG4gICAgICAgICAgdGhpcy5FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2N1cnNvci1wb2ludGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2xhc3NJbmNsdWRlKCkpIHtcbiAgICAgICAgICB0aGlzLmNsYXNzSW5jbHVkZSgpXG4gICAgICAgICAgICA/LnNwbGl0KCcgJylcbiAgICAgICAgICAgIC5mb3JFYWNoKChjbGFzc05hbWUpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFjbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5FbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnJvciwgdGhpcy5FbGVtZW50LCB0aGlzLkVsZW1lbnQudGFnTmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbmZpZygpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucG9wb3Zlck92ZXJsYXlDb21wb25lbnQ/Lmluc3RhbmNlICYmICFmaXJzdCkge1xuICAgICAgICAgIHRoaXMudXBkYXRlUG9wb3Zlck92ZXJsYXlQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMub3V0RXZlbnRQb3BvdmVyQ29udGVudC5zdWJzY3JpYmUoKGRpcmVjdGlvbikgPT4gdGhpcy5kaXJlY3Rpb25Qb3BvdmVyLnNldChkaXJlY3Rpb24pKTtcbiAgICB0aGlzLmZ1bmN0aW9uc0NvbnRyb2wgPSB7XG4gICAgICByZW1vdmVQb3BvdmVyT3ZlcmxheTogdGhpcy5yZW1vdmVQb3BvdmVyT3ZlcmxheS5iaW5kKHRoaXMpLFxuICAgICAgdXBkYXRlUG9wb3Zlck92ZXJsYXlQb3NpdGlvbjogdGhpcy51cGRhdGVQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLmJpbmQodGhpcyksXG4gICAgICBnZXRSZWN0Q29udGFpbmVyOiBhc3luYyAoKSA9PiAodGhpcy5lbGVtZW50UmVmQ3VzdG9tKCkgfHwgdGhpcy5FbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgIGdldFJlY3RDb250ZW50OiBhc3luYyAoKSA9PiB0aGlzLnBvcG92ZXJPdmVybGF5Q29tcG9uZW50Py5pbnN0YW5jZT8uQ29udGFpbmVyRWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICBzaG93UG9wb3ZlcjogdGhpcy5hZGRQb3BvdmVyQ29udGVudC5iaW5kKHRoaXMpLFxuICAgICAgdXBkYXRlUG9wb3Zlck92ZXJsYXk6IHRoaXMudXBkYXRlUG9wb3Zlck92ZXJsYXkuYmluZCh0aGlzKSxcbiAgICB9O1xuICAgIHRoaXMub3V0RnVuY3Rpb25zQ29udHJvbC5lbWl0KHRoaXMuRnVuY3Rpb25zQ29udHJvbCk7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgY29uc3QgbmF0aXZlRWwgPSB0aGlzLkVsZW1lbnQ7XG4gICAgdGhpcy5tb3VzZUVudGVyID0gdGhpcy5pbml0T2JzZXJ2YWJsZShuYXRpdmVFbCwgJ21vdXNlZW50ZXInKTtcbiAgICB0aGlzLmluaXRPYnNlcnZhYmxlKG5hdGl2ZUVsLCAnY2xpY2snKS5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm1vdXNlQ2xpY2sgPSB0aGlzLmluaXRPYnNlcnZhYmxlKG5hdGl2ZUVsLCBnZXRFdmVudE5hbWVIYW5kbGVDbGljayk7XG4gICAgdGhpcy5tb3VzZVdoZWVsID0gdGhpcy5pbml0T2JzZXJ2YWJsZSh3aW5kb3csICd3aGVlbCcpO1xuICAgIHRoaXMud2luZG93UmVzaXplID0gdGhpcy5pbml0T2JzZXJ2YWJsZSh3aW5kb3csICdyZXNpemUnKTtcbiAgICB0aGlzLndpbmRvd1doZWVsID0gdGhpcy5pbml0T2JzZXJ2YWJsZSh3aW5kb3csICd3aGVlbCcpO1xuICAgIHRoaXMud2luZG93TW91c2VEb3duID0gdGhpcy5pbml0T2JzZXJ2YWJsZSh3aW5kb3csICdtb3VzZWRvd24nKTtcbiAgICB0aGlzLndpbmRvd0NsaWNrID0gdGhpcy5pbml0T2JzZXJ2YWJsZSh3aW5kb3csIGdldEV2ZW50TmFtZUhhbmRsZUNsaWNrKTtcbiAgICB0aGlzLndpbmRvd01vdXNlVXAgPSB0aGlzLmluaXRPYnNlcnZhYmxlKHdpbmRvdywgJ21vdXNldXAnKTtcbiAgICB0aGlzLndpbmRvd01vdXNlbW92ZSA9IHRoaXMuaW5pdE9ic2VydmFibGUod2luZG93LCAnbW91c2Vtb3ZlJyk7XG4gICAgdGhpcy5tb3VzZUVudGVyLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMubW9kZSgpLmluY2x1ZGVzKCdob3ZlcicpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudHlwZSgpID09PSAndGV4dCcgJiYgbmF0aXZlRWw/LmNsaWVudFdpZHRoID49IG5hdGl2ZUVsLnNjcm9sbFdpZHRoICYmICF0aGlzLnBvcG92ZXJPdmVybGF5Q29tcG9uZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWRkUG9wb3ZlckNvbnRlbnQoKTtcbiAgICB9KTtcbiAgICB0aGlzLm1vdXNlQ2xpY2suc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZmlyc3RDbGljay51cGRhdGUoKHZhbCkgPT4gKHRoaXMuaWdub3JlU2hvd1BvcG92ZXIoKSA/IGZhbHNlIDogIXZhbCkpO1xuICAgICAgdGhpcy5vdXRFdmVudC5lbWl0KCdjbGljaycpO1xuXG4gICAgICBpZiAoIXRoaXMubW9kZSgpLnN0YXJ0c1dpdGgoJ2NsaWNrJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdjbGljay10b2dnbGUnICYmICF0aGlzLmZpcnN0Q2xpY2soKSkge1xuICAgICAgICB0aGlzLnJlbW92ZVBvcG92ZXJPdmVybGF5KCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5hZGRQb3BvdmVyQ29udGVudCgpO1xuICAgIH0pO1xuICAgIHRoaXMud2luZG93UmVzaXplLnBpcGUoZGVib3VuY2VUaW1lKDEwMCkpLnN1YnNjcmliZSh0aGlzLnVwZGF0ZVBvcG92ZXJPdmVybGF5UG9zaXRpb24uYmluZCh0aGlzKSk7XG4gIH1cblxuICAvLyAjcmVnaW9uIEZVTkNUSU9OU1xuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCB7XG4gICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25zQ29udHJvbCBhcyBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50O1xuICB9XG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlUG9wb3Zlck92ZXJsYXkoKSB7XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICBpZiAoIXRoaXMucG9wb3Zlck92ZXJsYXlDb21wb25lbnQ/Lmluc3RhbmNlIHx8ICF0aGlzLmNvbmZpZygpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5wb3BvdmVyT3ZlcmxheUNvbXBvbmVudC5pbnN0YW5jZTtcbiAgICAgIGNvbnN0IG5hdGl2ZUVsID0gdGhpcy5lbGVtZW50UmVmQ3VzdG9tKCkgfHwgdGhpcy5FbGVtZW50O1xuICAgICAgY29uc3QgcmVjdENvbnRhaW5lciA9IG5hdGl2ZUVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICB0aGlzLnJlY3RDb250YWluZXJMYXN0UG9zaXRpb25lZCA9IHJlY3RDb250YWluZXI7XG4gICAgICBpbnN0YW5jZS5zZXRDb25maWcocmVjdENvbnRhaW5lciwgeyAuLi4odGhpcy5jb25maWcoKSB8fCB7fSksIC4uLnRoaXMuZ2V0RGVmYXVsdENvbmZpZ3MoKSB9LCB0aGlzLmlzQWRkQ29udGVudFRvUGFyZW50RG9jdW1lbnQoKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZVBvcG92ZXJPdmVybGF5UG9zaXRpb24oKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIoKSk7XG4gICAgdGhpcy50aW1lci5zZXQoXG4gICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnBvcG92ZXJPdmVybGF5Q29tcG9uZW50Py5pbnN0YW5jZSB8fCAhdGhpcy5jb25maWcoKSB8fCAhdGhpcy5mdW5jdGlvbnNDb250cm9sKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY3RDb250YWluZXIgPSBhd2FpdCB0aGlzLmZ1bmN0aW9uc0NvbnRyb2wuZ2V0UmVjdENvbnRhaW5lcigpO1xuICAgICAgICAvLyBDb250YWluZXIgxJHDoyBk4buLY2ggY2h1eeG7g24vxJHhu5VpIGvDrWNoIHRoxrDhu5tjIHNvIHbhu5tpIGzhuqduIMSR4buLbmggduG7iyBn4bqnbiBuaOG6pXQgKHZkOiByZXNpemUgd2luZG93IGzDoG0gbGF5b3V0IHJlZmxvdyBuZ2FuZyBs4bqrbiBk4buNYylcbiAgICAgICAgLy8g4oaSIMSR4buLbmggduG7iyBs4bqhaSBuZ2F5OyBjw6FjIMSRaeG7gXUga2nhu4duIHN3aXRjaCBiw6puIGTGsOG7m2kgY2jhu4kgcGjDoXQgaGnhu4duIGzhu4djaCBk4buNYy90csOgbiBtw6lwIHBo4bqjaSBuw6puIGtow7RuZyBi4bqvdCDEkcaw4bujYyB0csaw4budbmcgaOG7o3AgbsOgeS5cbiAgICAgICAgaWYgKHRoaXMuY2hlY2tSZWN0Q29udGFpbmVyTW92ZWQocmVjdENvbnRhaW5lcikpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBvcG92ZXJPdmVybGF5KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZpZXdQb3J0ID0gZ2V0Vmlld3BvcnQoKTtcbiAgICAgICAgY29uc3QgcmVjdExpc3RWaWV3ID0gYXdhaXQgdGhpcy5mdW5jdGlvbnNDb250cm9sLmdldFJlY3RDb250ZW50KCk7XG5cbiAgICAgICAgaWYgKCFyZWN0TGlzdFZpZXcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlzdGFuY2VMaXN0Vmlld0FuZENvbnRhaW5lciA9IHRoaXMuY29uZmlnKCk/Lmlnbm9yZUFycm93ID09PSBmYWxzZSA/IDE0IDogNDtcbiAgICAgICAgc3dpdGNoICh0aGlzLmRpcmVjdGlvblBvcG92ZXIoKSkge1xuICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICByZWN0TGlzdFZpZXcudG9wICsgcmVjdExpc3RWaWV3LmhlaWdodCA+IHZpZXdQb3J0LmhlaWdodCB8fFxuICAgICAgICAgICAgICByZWN0TGlzdFZpZXcudG9wIDwgcmVjdENvbnRhaW5lci50b3AgKyByZWN0Q29udGFpbmVyLmhlaWdodCB8fFxuICAgICAgICAgICAgICByZWN0TGlzdFZpZXcudG9wIC0gKHJlY3RDb250YWluZXIudG9wICsgcmVjdENvbnRhaW5lci5oZWlnaHQpID4gZGlzdGFuY2VMaXN0Vmlld0FuZENvbnRhaW5lciB8fFxuICAgICAgICAgICAgICByZWN0TGlzdFZpZXcubGVmdCArIHJlY3RMaXN0Vmlldy53aWR0aCA+IHZpZXdQb3J0LndpZHRoXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3BvdmVyT3ZlcmxheSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICByZWN0Q29udGFpbmVyLnRvcCAtIChyZWN0TGlzdFZpZXcudG9wICsgcmVjdExpc3RWaWV3LmhlaWdodCkgPiBkaXN0YW5jZUxpc3RWaWV3QW5kQ29udGFpbmVyIHx8XG4gICAgICAgICAgICAgIHJlY3RMaXN0Vmlldy50b3AgKyByZWN0TGlzdFZpZXcuaGVpZ2h0ICsgZGlzdGFuY2VMaXN0Vmlld0FuZENvbnRhaW5lciA+IHJlY3RDb250YWluZXIudG9wICsgMiB8fFxuICAgICAgICAgICAgICByZWN0TGlzdFZpZXcubGVmdCArIHJlY3RMaXN0Vmlldy53aWR0aCA+IHZpZXdQb3J0LndpZHRoXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3BvdmVyT3ZlcmxheSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0sIDI1MClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1JlY3RDb250YWluZXJNb3ZlZChyZWN0Q29udGFpbmVyOiBJQm91bmRpbmdDbGllbnRSZWN0KTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVjdExhc3QgPSB0aGlzLnJlY3RDb250YWluZXJMYXN0UG9zaXRpb25lZDtcbiAgICBpZiAoIXJlY3RMYXN0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIER1bmcgc2FpIDFweCDEkeG7gyBi4buPIHF1YSBzYWkgc+G7kSBzdWJwaXhlbCBraGkgdHLDrG5oIGR1eeG7h3QgbMOgbSB0csOybi5cbiAgICByZXR1cm4gTWF0aC5hYnMocmVjdExhc3QudG9wIC0gcmVjdENvbnRhaW5lci50b3ApID4gMSB8fCBNYXRoLmFicyhyZWN0TGFzdC5sZWZ0IC0gcmVjdENvbnRhaW5lci5sZWZ0KSA+IDEgfHwgTWF0aC5hYnMocmVjdExhc3Qud2lkdGggLSByZWN0Q29udGFpbmVyLndpZHRoKSA+IDEgfHwgTWF0aC5hYnMocmVjdExhc3QuaGVpZ2h0IC0gcmVjdENvbnRhaW5lci5oZWlnaHQpID4gMTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgaWYgKHRoaXMuaW5pdEV2ZW50SW5FbGVtZW50UmVmQ3VzdG9tKCkgJiYgdGhpcy5lbGVtZW50UmVmQ3VzdG9tKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWZDdXN0b20oKSBhcyBIVE1MRWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIHx8IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0T2JzZXJ2YWJsZShlbDogYW55LCBldmVudE5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8TW91c2VFdmVudD4ge1xuICAgIHJldHVybiBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZWwsIGV2ZW50TmFtZSkucGlwZShcbiAgICAgIHRhcCgoZSkgPT4gIXRoaXMuaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnQoKSAmJiBlLnN0b3BQcm9wYWdhdGlvbigpKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRQb3BvdmVyQ29udGVudChuYXRpdmVFbD86IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMucG9wb3Zlck92ZXJsYXlDb21wb25lbnQgfHwgdGhpcy5pZ25vcmVTaG93UG9wb3ZlcigpIHx8ICF0aGlzLmNvbmZpZygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wb3BvdmVyT3ZlcmxheUNvbXBvbmVudCA9IHRoaXMuZHluYW1pY1NlcnZpY2UucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoTGlic1VpQ29tcG9uZW50c1BvcG92ZXJPdmVybGF5Q29tcG9uZW50KTtcbiAgICB0aGlzLmR5bmFtaWNTZXJ2aWNlLmFkZFRvQm9keSh0aGlzLnBvcG92ZXJPdmVybGF5Q29tcG9uZW50LCB0aGlzLmlzQWRkQ29udGVudFRvUGFyZW50RG9jdW1lbnQoKSB8fCB0aGlzLmNvbmZpZygpLmlzQWRkQ29udGVudFRvUGFyZW50RG9jdW1lbnQpO1xuICAgIHRoaXMub3V0RXZlbnQuZW1pdCgnc2hvdycpO1xuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5wb3BvdmVyT3ZlcmxheUNvbXBvbmVudC5pbnN0YW5jZTtcblxuICAgIG5hdGl2ZUVsID0gbmF0aXZlRWwgfHwgdGhpcy5lbGVtZW50UmVmQ3VzdG9tKCkgfHwgdGhpcy5FbGVtZW50O1xuICAgIHRoaXMucmVjdENvbnRhaW5lckxhc3RQb3NpdGlvbmVkID0gbmF0aXZlRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaW5zdGFuY2Uuc2V0Q29uZmlnKHRoaXMucmVjdENvbnRhaW5lckxhc3RQb3NpdGlvbmVkLCB7IC4uLih0aGlzLmNvbmZpZygpIHx8IHt9KSwgLi4udGhpcy5nZXREZWZhdWx0Q29uZmlncygpIH0sIHRoaXMuaXNBZGRDb250ZW50VG9QYXJlbnREb2N1bWVudCgpKTtcbiAgICBjb25zdCBmbGFnc01vdXNlczogSUZsYWdNb3VzZSA9IHtcbiAgICAgIGlzTW91c2VFbnRlcjogdHJ1ZSxcbiAgICAgIGlzTW91c2VFbnRlckNvbnRlbnQ6IGZhbHNlLFxuICAgICAgaXNDb250YWluZXJIYXNTY3JvbGw6IG5hdGl2ZUVsLm9mZnNldEhlaWdodCA8IG5hdGl2ZUVsLnNjcm9sbEhlaWdodCxcbiAgICB9O1xuICAgIGNvbnN0IG5hdGl2ZUVsQ29udGFpbmVyID0gaW5zdGFuY2UuRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IG1vdXNlRW50ZXJDb250ZW50ID0gdGhpcy5pbml0T2JzZXJ2YWJsZShuYXRpdmVFbENvbnRhaW5lciwgJ21vdXNlZW50ZXInKTtcbiAgICBjb25zdCBtb3VzZUxlYXZlQ29udGVudCA9IHRoaXMuaW5pdE9ic2VydmFibGUobmF0aXZlRWxDb250YWluZXIsICdtb3VzZWxlYXZlJyk7XG4gICAgdGhpcy5zdWJzRXZlbnRQb3B1cC5hZGQoXG4gICAgICBpbnN0YW5jZS5vdXRFdmVudC5zdWJzY3JpYmUoKGRpcmVjdGlvbjogVFlQRV9QT1BPVkVSX0RJUkVDVElPTikgPT4ge1xuICAgICAgICB0aGlzLm91dEV2ZW50UG9wb3ZlckNvbnRlbnQuZW1pdChkaXJlY3Rpb24pO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzRXZlbnRQb3B1cC5hZGQoXG4gICAgICBtb3VzZUVudGVyQ29udGVudC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLm91dEV2ZW50LmVtaXQoJ21vdXNlZW50ZXItY29udGVudCcpO1xuICAgICAgICBmbGFnc01vdXNlcy5pc01vdXNlRW50ZXJDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vdXRDaGFuZ1N0YWdlRmxhZ01vdXNlLmVtaXQoZmxhZ3NNb3VzZXMpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzRXZlbnRQb3B1cC5hZGQoXG4gICAgICB0aGlzLm1vdXNlRW50ZXIuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5vdXRFdmVudC5lbWl0KCdtb3VzZWVudGVyLWVsZW1lbnQnKTtcbiAgICAgICAgdGhpcy5vdXRDaGFuZ1N0YWdlRmxhZ01vdXNlLmVtaXQoZmxhZ3NNb3VzZXMpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzRXZlbnRQb3B1cC5hZGQoXG4gICAgICB0aGlzLm1vdXNlV2hlZWwuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgZmxhZ3NNb3VzZXMuaXNDb250YWluZXJIYXNTY3JvbGwgPSBmYWxzZTtcblxuICAgICAgICBpZiAobmF0aXZlRWwub2Zmc2V0SGVpZ2h0IDwgbmF0aXZlRWwuc2Nyb2xsSGVpZ2h0KSB7XG4gICAgICAgICAgZmxhZ3NNb3VzZXMuaXNDb250YWluZXJIYXNTY3JvbGwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoZmxhZ3NNb3VzZXMuaXNNb3VzZUVudGVyICYmIGZsYWdzTW91c2VzLmlzQ29udGFpbmVySGFzU2Nyb2xsKSB8fCBmbGFnc01vdXNlcy5pc01vdXNlRW50ZXJDb250ZW50IHx8IHRoaXMuZmxhZ01vdXNlKCkuaXNNb3VzZUVudGVyIHx8IHRoaXMuZmxhZ01vdXNlKCkuaXNNb3VzZUVudGVyQ29udGVudCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZVBvcG92ZXJPdmVybGF5KCk7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5oYW5kbGVyTW91c2VMZWF2ZVJlbW92ZVBvcG92ZXJPdmVybGF5KHRoaXMud2luZG93TW91c2Vtb3ZlLCBmbGFnc01vdXNlcywgJ2lzTW91c2VFbnRlcicsICdpc01vdXNlRW50ZXJDb250ZW50JywgJ21vdXNlbGVhdmUtZWxlbWVudCcpO1xuICAgIHRoaXMuaGFuZGxlck1vdXNlTGVhdmVSZW1vdmVQb3BvdmVyT3ZlcmxheShtb3VzZUxlYXZlQ29udGVudCwgZmxhZ3NNb3VzZXMsICdpc01vdXNlRW50ZXJDb250ZW50JywgJ2lzTW91c2VFbnRlcicsICdtb3VzZWxlYXZlLWNvbnRlbnQnKTtcblxuICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ2NsaWNrX29wZW5fYW5kX2NsaWNrX3BhbmVsX2NvbnRlbnRfaGlkZGVuJykge1xuICAgICAgdGhpcy5zdWJzRXZlbnRQb3B1cC5hZGQoXG4gICAgICAgIHRoaXMuaW5pdE9ic2VydmFibGUobmF0aXZlRWxDb250YWluZXIsICdjbGljaycpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVQb3BvdmVyT3ZlcmxheSgpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZXJXaW5kb3dFdmVudFJlbW92ZVBvcG92ZXJPdmVybGF5KHRoaXMud2luZG93Q2xpY2ssIGZsYWdzTW91c2VzKTtcbiAgICB0aGlzLmhhbmRsZXJXaW5kb3dFdmVudFJlbW92ZVBvcG92ZXJPdmVybGF5KHRoaXMud2luZG93TW91c2VEb3duLCBmbGFnc01vdXNlcyk7XG4gICAgdGhpcy5oYW5kbGVyV2luZG93RXZlbnRSZW1vdmVQb3BvdmVyT3ZlcmxheSh0aGlzLndpbmRvd01vdXNlVXAsIGZsYWdzTW91c2VzKTtcbiAgICB0aGlzLmhhbmRsZXJXaW5kb3dFdmVudFJlbW92ZVBvcG92ZXJPdmVybGF5KHRoaXMud2luZG93V2hlZWwsIGZsYWdzTW91c2VzKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlcldpbmRvd0V2ZW50UmVtb3ZlUG9wb3Zlck92ZXJsYXkob2JzOiBPYnNlcnZhYmxlPE1vdXNlRXZlbnQ+LCBmbGFnc01vdXNlczogSUZsYWdNb3VzZSkge1xuICAgIHRoaXMuc3Vic0V2ZW50UG9wdXAuYWRkKFxuICAgICAgb2JzLnBpcGUoZGVib3VuY2VUaW1lKDEwKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKGZsYWdzTW91c2VzLmlzTW91c2VFbnRlciB8fCBmbGFnc01vdXNlcy5pc01vdXNlRW50ZXJDb250ZW50IHx8IHRoaXMuaWdub3JlQ2xpY2tPdXRzaWRlKCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmxhZ01vdXNlKCkgJiYgKHRoaXMuZmxhZ01vdXNlKCkuaXNNb3VzZUVudGVyIHx8IHRoaXMuZmxhZ01vdXNlKCkuaXNNb3VzZUVudGVyQ29udGVudCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXJzdENsaWNrLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMucmVtb3ZlUG9wb3Zlck92ZXJsYXkoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlck1vdXNlTGVhdmVSZW1vdmVQb3BvdmVyT3ZlcmxheShvYnM6IE9ic2VydmFibGU8TW91c2VFdmVudD4sIGZsYWdzTW91c2VzOiBJRmxhZ01vdXNlLCBmbGFnS2V5Q2hhbmdlVmFsdWU6IFBhdGhPZjxJRmxhZ01vdXNlPiwgZmxhZ0tleUNoZWNrOiBQYXRoT2Y8SUZsYWdNb3VzZT4sIG91dEV2ZW50OiBUWVBFX1BPUE9WRVJfRVZFTlQpIHtcbiAgICB0aGlzLnN1YnNFdmVudFBvcHVwLmFkZChcbiAgICAgIG9ic1xuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5vdXRFdmVudC5lbWl0KG91dEV2ZW50KSksXG4gICAgICAgICAgZGVib3VuY2VUaW1lKGdldFBvcG92ZXJUaW1lckRlc3Ryb3lJblF1ZXJ5VXJsKCkgfHwgdGhpcy5jb25maWcoKT8udGltZXJEZXN0cm95IHx8IDApXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG91dEV2ZW50ID09PSAnbW91c2VsZWF2ZS1lbGVtZW50JyAmJlxuICAgICAgICAgICAgKGNoZWNrTW91c2VPdmVySW5Db250YWluZXIoZSwgdGhpcy5FbGVtZW50KSB8fCBjaGVja01vdXNlT3ZlckluQ29udGFpbmVyKHsgY2xpZW50WDogZS5jbGllbnRYICsgMiwgY2xpZW50WTogZS5jbGllbnRZICsgMiB9LCB0aGlzLkVsZW1lbnQpIHx8IGNoZWNrTW91c2VPdmVySW5Db250YWluZXIoeyBjbGllbnRYOiBlLmNsaWVudFggLSAyLCBjbGllbnRZOiBlLmNsaWVudFkgLSAyIH0sIHRoaXMuRWxlbWVudCkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHNldChmbGFnc01vdXNlcywgZmxhZ0tleUNoYW5nZVZhbHVlLCBmYWxzZSk7XG4gICAgICAgICAgdGhpcy5vdXRDaGFuZ1N0YWdlRmxhZ01vdXNlLmVtaXQoZmxhZ3NNb3VzZXMpO1xuICAgICAgICAgIGlmICh0aGlzLmZsYWdNb3VzZSgpICYmICh0aGlzLmZsYWdNb3VzZSgpLmlzTW91c2VFbnRlciB8fCB0aGlzLmZsYWdNb3VzZSgpLmlzTW91c2VFbnRlckNvbnRlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGdldChmbGFnc01vdXNlcywgZmxhZ0tleUNoZWNrKSB8fCB0aGlzLmlnbm9yZUhpZGRlblBvcG92ZXJDb250ZW50V2hlbk1vdXNlTGVhdmUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnJlbW92ZVBvcG92ZXJPdmVybGF5KCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdENvbmZpZ3MoKTogSVBvcG92ZXJPdmVybGF5IHtcbiAgICBjb25zdCBjb25maWdWYWx1ZSA9IHRoaXMuY29uZmlnKCkgfHwge307XG4gICAgaWYgKGlzTmlsKGNvbmZpZ1ZhbHVlLmNvbnRlbnQpIHx8IChjb25maWdWYWx1ZS5jb250ZW50ID09PSB0aGlzLmNvbnRlbnRJbm5lckh0bWwoKSAmJiB0aGlzLmNvbnRlbnRJbm5lckh0bWwoKSAhPT0gdGhpcy5FbGVtZW50LmlubmVySFRNTCkpIHtcbiAgICAgIGNvbmZpZ1ZhbHVlLmNvbnRlbnQgPSB0aGlzLkVsZW1lbnQuaW5uZXJIVE1MO1xuICAgIH1cbiAgICB0aGlzLmNvbnRlbnRJbm5lckh0bWwuc2V0KHRoaXMuRWxlbWVudC5pbm5lckhUTUwpO1xuICAgIGlmICghY29uZmlnVmFsdWUubWF4V2lkdGgpIHtcbiAgICAgIGNvbmZpZ1ZhbHVlLm1heFdpZHRoID0gMjUwO1xuICAgIH1cbiAgICBpZiAoY29uZmlnVmFsdWUubWF4SGVpZ2h0ID09PSB1bmRlZmluZWQgfHwgY29uZmlnVmFsdWUubWF4SGVpZ2h0ID09PSAwKSB7XG4gICAgICBjb25maWdWYWx1ZS5tYXhIZWlnaHQgPSAxNDA7XG4gICAgfVxuICAgIGlmICghY29uZmlnVmFsdWUuZGlyZWN0aW9uKSB7XG4gICAgICBjb25maWdWYWx1ZS5kaXJlY3Rpb24gPSAnYm90dG9tJztcbiAgICB9XG4gICAgaWYgKCFjb25maWdWYWx1ZS5wb3NpdGlvbikge1xuICAgICAgY29uZmlnVmFsdWUucG9zaXRpb24gPSB7XG4gICAgICAgIG1vZGU6ICdjZW50ZXInLFxuICAgICAgICBkaXN0YW5jZTogMCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZ1ZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZW1vdmVQb3BvdmVyT3ZlcmxheSgpIHtcbiAgICBpZiAodGhpcy5wb3BvdmVyT3ZlcmxheUNvbXBvbmVudCkge1xuICAgICAgdGhpcy5vdXRFdmVudC5lbWl0KCdyZW1vdmUnKTtcbiAgICAgIHRoaXMuc3Vic0V2ZW50UG9wdXAudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuc3Vic0V2ZW50UG9wdXAgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMuZHluYW1pY1NlcnZpY2UucmVtb3ZlKHRoaXMucG9wb3Zlck92ZXJsYXlDb21wb25lbnQpO1xuICAgIHRoaXMucG9wb3Zlck92ZXJsYXlDb21wb25lbnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5yZWN0Q29udGFpbmVyTGFzdFBvc2l0aW9uZWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5maXJzdENsaWNrLnNldChmYWxzZSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcigpKTtcbiAgICB0aGlzLnJlbW92ZVBvcG92ZXJPdmVybGF5KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kubmV4dCgpO1xuICAgIHRoaXMub25EZXN0cm95LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5zdWJzRXZlbnRQb3B1cC51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8bmctY29udGVudCAvPlxuIl19
@@ -340,6 +340,8 @@ class LibsUiComponentsPopoverComponent {
340
340
  windowMouseUp;
341
341
  windowMousemove;
342
342
  popoverOverlayComponent;
343
+ // Rect của container tại lần định vị overlay gần nhất — mốc so sánh để phát hiện container dịch chuyển/đổi kích thước (vd: resize window làm layout reflow).
344
+ rectContainerLastPositioned;
343
345
  subsEventPopup = new Subscription();
344
346
  onDestroy = new Subject();
345
347
  functionsControl;
@@ -459,7 +461,7 @@ class LibsUiComponentsPopoverComponent {
459
461
  }
460
462
  this.addPopoverContent();
461
463
  });
462
- this.windowResize.pipe(debounceTime(500)).subscribe(this.updatePopoverOverlayPosition.bind(this));
464
+ this.windowResize.pipe(debounceTime(100)).subscribe(this.updatePopoverOverlayPosition.bind(this));
463
465
  }
464
466
  // #region FUNCTIONS
465
467
  get FunctionsControl() {
@@ -473,7 +475,9 @@ class LibsUiComponentsPopoverComponent {
473
475
  }
474
476
  const instance = this.popoverOverlayComponent.instance;
475
477
  const nativeEl = this.elementRefCustom() || this.Element;
476
- instance.setConfig(nativeEl.getBoundingClientRect(), { ...(this.config() || {}), ...this.getDefaultConfigs() }, this.isAddContentToParentDocument());
478
+ const rectContainer = nativeEl.getBoundingClientRect();
479
+ this.rectContainerLastPositioned = rectContainer;
480
+ instance.setConfig(rectContainer, { ...(this.config() || {}), ...this.getDefaultConfigs() }, this.isAddContentToParentDocument());
477
481
  });
478
482
  }
479
483
  async updatePopoverOverlayPosition() {
@@ -482,12 +486,18 @@ class LibsUiComponentsPopoverComponent {
482
486
  if (!this.popoverOverlayComponent?.instance || !this.config() || !this.functionsControl) {
483
487
  return;
484
488
  }
489
+ const rectContainer = await this.functionsControl.getRectContainer();
490
+ // Container đã dịch chuyển/đổi kích thước so với lần định vị gần nhất (vd: resize window làm layout reflow ngang lẫn dọc)
491
+ // → định vị lại ngay; các điều kiện switch bên dưới chỉ phát hiện lệch dọc/tràn mép phải nên không bắt được trường hợp này.
492
+ if (this.checkRectContainerMoved(rectContainer)) {
493
+ this.updatePopoverOverlay();
494
+ return;
495
+ }
485
496
  const viewPort = getViewport();
486
497
  const rectListView = await this.functionsControl.getRectContent();
487
498
  if (!rectListView) {
488
499
  return;
489
500
  }
490
- const rectContainer = await this.functionsControl.getRectContainer();
491
501
  const distanceListViewAndContainer = this.config()?.ignoreArrow === false ? 14 : 4;
492
502
  switch (this.directionPopover()) {
493
503
  case 'right':
@@ -510,6 +520,14 @@ class LibsUiComponentsPopoverComponent {
510
520
  }
511
521
  }, 250));
512
522
  }
523
+ checkRectContainerMoved(rectContainer) {
524
+ const rectLast = this.rectContainerLastPositioned;
525
+ if (!rectLast) {
526
+ return false;
527
+ }
528
+ // Dung sai 1px để bỏ qua sai số subpixel khi trình duyệt làm tròn.
529
+ return Math.abs(rectLast.top - rectContainer.top) > 1 || Math.abs(rectLast.left - rectContainer.left) > 1 || Math.abs(rectLast.width - rectContainer.width) > 1 || Math.abs(rectLast.height - rectContainer.height) > 1;
530
+ }
513
531
  get Element() {
514
532
  if (this.initEventInElementRefCustom() && this.elementRefCustom()) {
515
533
  return this.elementRefCustom();
@@ -528,7 +546,8 @@ class LibsUiComponentsPopoverComponent {
528
546
  this.outEvent.emit('show');
529
547
  const instance = this.popoverOverlayComponent.instance;
530
548
  nativeEl = nativeEl || this.elementRefCustom() || this.Element;
531
- instance.setConfig(nativeEl.getBoundingClientRect(), { ...(this.config() || {}), ...this.getDefaultConfigs() }, this.isAddContentToParentDocument());
549
+ this.rectContainerLastPositioned = nativeEl.getBoundingClientRect();
550
+ instance.setConfig(this.rectContainerLastPositioned, { ...(this.config() || {}), ...this.getDefaultConfigs() }, this.isAddContentToParentDocument());
532
551
  const flagsMouses = {
533
552
  isMouseEnter: true,
534
553
  isMouseEnterContent: false,
@@ -633,6 +652,7 @@ class LibsUiComponentsPopoverComponent {
633
652
  }
634
653
  this.dynamicService.remove(this.popoverOverlayComponent);
635
654
  this.popoverOverlayComponent = undefined;
655
+ this.rectContainerLastPositioned = undefined;
636
656
  this.firstClick.set(false);
637
657
  }
638
658
  ngOnDestroy() {
@@ -1 +1 @@
1
- {"version":3,"file":"libs-ui-components-popover.mjs","sources":["../../../../../libs-ui/components/popover/src/defines/constants.define.ts","../../../../../libs-ui/components/popover/src/overlay/overlay.component.ts","../../../../../libs-ui/components/popover/src/overlay/overlay.component.html","../../../../../libs-ui/components/popover/src/popover.component.ts","../../../../../libs-ui/components/popover/src/popover.component.html","../../../../../libs-ui/components/popover/src/libs-ui-components-popover.ts"],"sourcesContent":["import { get, UtilsUrlSearchParams } from '@libs-ui/utils';\nimport { TYPE_POPOVER_DIRECTION } from '../interfaces/popover.type';\n\nexport const KEY_QUERY_POPOVER_TIMER_DESTROY = 'popover-timer-destroy';\n\nconst timerDestroy = parseInt(new UtilsUrlSearchParams(location.href).get(KEY_QUERY_POPOVER_TIMER_DESTROY) || '0');\n\nexport const getPopoverTimerDestroyInQueryUrl = (): number => {\n return timerDestroy;\n};\n\nexport const getListDirections = (direction: TYPE_POPOVER_DIRECTION): Array<TYPE_POPOVER_DIRECTION> => {\n return get(\n {\n bottom: ['bottom', 'top', 'right', 'left'],\n right: ['right', 'left', 'bottom', 'top'],\n left: ['left', 'right', 'bottom', 'top'],\n top: ['top', 'bottom', 'right', 'left'],\n } as Record<TYPE_POPOVER_DIRECTION, Array<TYPE_POPOVER_DIRECTION>>,\n direction\n );\n};\n","import { AsyncPipe, NgStyle, NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, OnDestroy, inject, signal, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { LibsUiComponentsScrollOverlayDirective } from '@libs-ui/components-scroll-overlay';\nimport { IBoundingClientRect } from '@libs-ui/interfaces-types';\nimport { UtilsUrlSearchParams, cloneDeep, cloneIBoundingClientRect, getViewport } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { Subject, interval, take } from 'rxjs';\nimport { getListDirections } from '../defines/constants.define';\nimport { IPopoverOverlay } from '../interfaces/overlay.interface';\nimport { TYPE_POPOVER_DIRECTION } from '../interfaces/popover.type';\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-popover-overlay',\n templateUrl: './overlay.component.html',\n styleUrls: ['./overlay.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TranslateModule, NgStyle, AsyncPipe, LibsUiComponentsScrollOverlayDirective, NgTemplateOutlet],\n})\nexport class LibsUiComponentsPopoverOverlayComponent implements OnDestroy {\n /* PROPERTIES */\n protected currentDirection = signal<TYPE_POPOVER_DIRECTION>('bottom');\n protected arrowClass = signal<string>('');\n protected top = signal<number>(0);\n protected left = signal<number>(0);\n protected arrowLeft = signal<number>(0);\n protected arrowTop = signal<number>(0);\n protected config = signal<IPopoverOverlay>({});\n private readonly timeout = signal<ReturnType<typeof setTimeout> | undefined>(undefined);\n private readonly destroyRef = inject(DestroyRef);\n\n // #region OUTPUT\n readonly outEvent: Subject<TYPE_POPOVER_DIRECTION> = new Subject();\n\n /* VIEW CHILD */\n private readonly container = viewChild.required<ElementRef>('container');\n\n // #region INJECT\n private readonly elementRef = inject(ElementRef);\n\n // #region FUNCTIONS\n public get ElementRef() {\n return this.elementRef;\n }\n\n public get ContainerElement() {\n return this.container().nativeElement;\n }\n\n public setConfig(rectOrigin: IBoundingClientRect, config: IPopoverOverlay, isAddContentToParentDocument?: boolean) {\n isAddContentToParentDocument = isAddContentToParentDocument || config.isAddContentToParentDocument;\n rectOrigin = cloneIBoundingClientRect(rectOrigin);\n this.config.set(cloneDeep(config));\n\n this.container().nativeElement.style.opacity = 0;\n if (this.config().widthByParent) {\n this.config.update((config) => ({ ...config, width: rectOrigin.width - (config?.parentBorderWidth || 0) * 2 }));\n }\n let viewPort = getViewport();\n let rectFrame: IBoundingClientRect | undefined = undefined;\n\n if (isAddContentToParentDocument) {\n viewPort = getViewport(window.parent);\n const url = new UtilsUrlSearchParams(location.href);\n const iframeId = url.get('iframeId');\n\n rectFrame = window.parent.document.getElementById(`iframe-${iframeId}`)?.getBoundingClientRect();\n if (rectFrame) {\n rectOrigin.top += rectFrame.top;\n rectOrigin.left += rectFrame.left;\n }\n }\n\n if (this.config().maxHeight === null) {\n this.config.update((config) => ({ ...config, maxHeight: viewPort.height - rectOrigin.top - 44 }));\n }\n\n clearTimeout(this.timeout());\n this.setVariableCss();\n this.setDirections(rectOrigin, viewPort, rectFrame);\n let rectContent = cloneIBoundingClientRect(this.container().nativeElement.getBoundingClientRect());\n\n if (rectFrame) {\n rectContent.top += rectFrame.top;\n rectContent.left += rectFrame.left;\n }\n\n interval(250)\n .pipe(take(4), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n const rect = cloneIBoundingClientRect(this.container().nativeElement.getBoundingClientRect());\n\n if (rectFrame) {\n rect.top += rectFrame.top;\n rect.left += rectFrame.left;\n }\n if (rect.width !== rectContent.width || rect.height !== rectContent.height || rect.top !== rectContent.top || rect.left !== rectContent.left) {\n clearTimeout(this.timeout());\n this.setDirections(rectOrigin, viewPort, rectFrame);\n rectContent = rect;\n }\n });\n }\n\n private setDirections(rectOrigin: IBoundingClientRect, viewPort: { width: number; height: number }, rectFrame?: IBoundingClientRect) {\n const directions = getListDirections(this.config().direction || 'bottom');\n const positionLast = directions.length - 1;\n\n this.timeout.set(\n setTimeout(async () => {\n const rectContent = cloneIBoundingClientRect(this.container().nativeElement.getBoundingClientRect());\n\n if (rectFrame) {\n rectContent.top += rectFrame.top;\n rectContent.left += rectFrame.left;\n }\n for (const index in directions) {\n if (await this.loopDirection(rectOrigin, rectContent, directions[index], positionLast === +index, viewPort)) {\n return;\n }\n }\n\n const directionByHeight = viewPort.height - rectOrigin.top - rectOrigin.height > rectOrigin.top - 4 ? 'bottom' : 'top';\n\n this.loopDirection(rectOrigin, rectContent, directionByHeight, true, viewPort);\n this.container().nativeElement.style.opacity = 1;\n }, 50)\n );\n }\n\n private loopDirection(rectOrigin: IBoundingClientRect, rectContent: IBoundingClientRect, direction: TYPE_POPOVER_DIRECTION, isLast: boolean, viewPort: { width: number; height: number }): Promise<boolean> {\n return new Promise((resolve) => {\n const positionMode = this.config().position?.mode || 'start';\n const { position } = this.config();\n let result = this.setPosition(direction, rectOrigin, rectContent, viewPort, isLast);\n\n if (!result) {\n if (position) {\n position.mode = positionMode === 'center' || positionMode === 'start' ? 'end' : 'start';\n if (!this.config().ignoreArrow && position.autoUpdatePosition) {\n position.distance = position.mode === 'end' ? position.autoUpdatePosition.endDistance : position.autoUpdatePosition.startDistance;\n }\n this.config.update((config) => ({ ...config }));\n }\n result = this.setPosition(direction, rectOrigin, rectContent, viewPort, isLast);\n }\n if (!result && positionMode === 'center') {\n if (position) {\n position.mode = position.mode === 'start' ? 'end' : 'start';\n this.config.update((config) => ({ ...config }));\n }\n result = this.setPosition(direction, rectOrigin, rectContent, viewPort, isLast);\n }\n if (!result) {\n if (position) {\n position.mode = positionMode;\n this.config.update((config) => ({ ...config }));\n }\n\n return resolve(false);\n }\n this.setAndEmitEvent(direction);\n\n return resolve(true);\n });\n }\n\n private setAndEmitEvent(direction: TYPE_POPOVER_DIRECTION) {\n this.currentDirection.set(direction);\n this.setVariableCss();\n this.setClassArrow(direction);\n this.container().nativeElement.style.opacity = 1;\n this.outEvent.next(direction);\n }\n\n private setPosition(direction: TYPE_POPOVER_DIRECTION, rectOrigin: IBoundingClientRect, rectContent: IBoundingClientRect, viewPort: { width: number; height: number }, isLast: boolean): boolean {\n const halfSquare = 6;\n const distanceArrow = 4;\n let bottomPositionRectContent = 0;\n let positionTop = 0;\n let positionLeft = 0;\n let top = 0;\n let left = 0;\n const configValue = this.config();\n\n switch (direction) {\n case 'bottom':\n positionTop = rectOrigin.top + rectOrigin.height + distanceArrow;\n positionLeft = rectOrigin.left + rectOrigin.width / 2 - halfSquare;\n top = positionTop + halfSquare;\n left = positionLeft - rectContent.width / 2 + halfSquare;\n if (configValue.ignoreArrow) {\n top = top - halfSquare - distanceArrow;\n }\n top += configValue.directionDistance || 0;\n if (configValue.position?.mode === 'start') {\n left = rectOrigin.left + (configValue.position.distance || 0);\n }\n if (configValue.position?.mode === 'end') {\n left = rectOrigin.left + rectOrigin.width - rectContent.width + (configValue.position.distance || 0);\n }\n left += configValue.parentBorderWidth || 0;\n\n this.arrowLeft.set(positionLeft - left);\n this.arrowTop.set(-6);\n this.top.set(top);\n this.left.set(left);\n\n if (top + rectContent.height < viewPort.height && left >= 0 && left + rectContent.width < viewPort.width) {\n return true;\n }\n if (isLast) {\n if (this.config) {\n this.config.update((config) => ({ ...config, maxHeight: viewPort.height - rectOrigin.top - rectOrigin.height }));\n }\n this.left.set(this.getLeftPositionIsLast(isLast, left >= 0 ? left : 0, viewPort, rectOrigin, rectContent, halfSquare));\n\n return true;\n }\n\n return false;\n\n case 'right':\n positionTop = rectOrigin.top + rectOrigin.height / 2 - halfSquare;\n positionLeft = rectOrigin.left + rectOrigin.width + distanceArrow;\n top = positionTop - rectContent.height / 2 + halfSquare;\n left = positionLeft + halfSquare;\n\n if (configValue.ignoreArrow) {\n left = positionLeft - distanceArrow;\n }\n\n left += configValue.directionDistance || 0;\n if (configValue.position?.mode === 'start') {\n top = rectOrigin.top + (configValue.position?.distance || 0);\n }\n\n if (configValue.position?.mode === 'end') {\n top = rectOrigin.top + rectOrigin.height - rectContent.height + (configValue.position.distance || 0);\n }\n\n bottomPositionRectContent = top + rectContent.height;\n\n if (bottomPositionRectContent > viewPort.height) {\n top = top - (bottomPositionRectContent - viewPort.height);\n }\n\n this.arrowTop.set(positionTop - top + 2);\n this.arrowLeft.set(-9);\n\n this.top.set(top);\n this.left.set(left);\n if (top > 0 && left + rectContent.width < viewPort.width) {\n return true;\n }\n if (isLast) {\n if (this.config) {\n this.config.update((config) => ({ ...config, maxHeight: viewPort.height }));\n }\n this.left.set(this.getLeftPositionIsLast(isLast, left >= 0 ? left : 0, viewPort, rectOrigin, rectContent, halfSquare));\n\n return true;\n }\n\n return false;\n\n case 'left':\n positionTop = rectOrigin.top + rectOrigin.height / 2 - halfSquare;\n positionLeft = rectOrigin.left - halfSquare * 2 - distanceArrow;\n top = positionTop - rectContent.height / 2 + halfSquare;\n left = positionLeft - rectContent.width + halfSquare;\n if (configValue.ignoreArrow) {\n left = left + halfSquare + distanceArrow;\n }\n\n left -= configValue?.directionDistance || 0;\n if (configValue.position?.mode === 'start') {\n top = rectOrigin.top + (configValue.position.distance || 0);\n }\n\n if (configValue.position?.mode === 'end') {\n top = rectOrigin.top + rectOrigin.height - rectContent.height + (configValue.position.distance || 0);\n }\n\n bottomPositionRectContent = top + rectContent.height;\n\n if (bottomPositionRectContent > viewPort.height) {\n top = top - (bottomPositionRectContent - viewPort.height);\n }\n\n this.arrowTop.set(positionTop - top + 2);\n this.arrowLeft.set(rectContent.width - 3);\n\n this.top.set(top);\n this.left.set(left);\n if (left > 0 && top > 0) {\n return true;\n }\n\n if (isLast) {\n if (this.config) {\n this.config.update((config) => ({ ...config, maxHeight: viewPort.height }));\n }\n this.left.set(this.getLeftPositionIsLast(isLast, left >= 0 ? left : 0, viewPort, rectOrigin, rectContent, halfSquare));\n\n return true;\n }\n\n return false;\n\n case 'top':\n positionTop = rectOrigin.top - halfSquare * 2 - distanceArrow;\n positionLeft = rectOrigin.left + rectOrigin.width / 2 - halfSquare;\n top = positionTop - rectContent.height + halfSquare;\n left = positionLeft - rectContent.width / 2 + halfSquare;\n\n if (configValue.ignoreArrow) {\n top = top + halfSquare + distanceArrow;\n }\n\n top -= configValue.directionDistance || 0;\n\n if (configValue.position && configValue.position?.mode === 'start') {\n left = rectOrigin.left + (configValue.position.distance || 0);\n }\n\n if (configValue.position && configValue.position?.mode === 'end') {\n left = rectOrigin.left + rectOrigin.width - rectContent.width + (configValue.position.distance || 0);\n }\n\n left += configValue.parentBorderWidth || 0;\n this.arrowLeft.set(positionLeft - left);\n this.arrowTop.set(rectContent.height);\n this.top.set(top);\n this.left.set(left);\n if (top > 0 && left >= 0 && left + rectContent.width < viewPort.width) {\n return true;\n }\n\n if (isLast) {\n this.config.update((config) => ({ ...config, maxHeight: rectOrigin.top - 4 }));\n this.left.set(this.getLeftPositionIsLast(isLast, left >= 0 ? left : 0, viewPort, rectOrigin, rectContent, halfSquare));\n\n return true;\n }\n\n return false;\n }\n }\n\n private setClassArrow(direction: TYPE_POPOVER_DIRECTION) {\n if (direction === 'right') {\n return this.arrowClass.set('libs-ui-popover-overlay-arrow-right');\n }\n if (direction === 'left') {\n return this.arrowClass.set('libs-ui-popover-overlay-arrow-left');\n }\n if (direction === 'top') {\n return this.arrowClass.set('libs-ui-popover-overlay-arrow-down');\n }\n\n return this.arrowClass.set('libs-ui-popover-overlay-arrow-up');\n }\n\n private setVariableCss() {\n const configValue = this.config();\n this.ContainerElement.style.setProperty('--libs-ui-popover-overlay-time-animation-time', `${configValue.animationConfig?.time || 0.4}s`);\n this.ContainerElement.style.setProperty('--libs-ui-popover-overlay-time-animation-distance', `${this.currentDirection() === 'top' ? '-' : ''}${configValue.animationConfig?.distance || 12}px`);\n }\n\n private getLeftPositionIsLast(isLast: boolean, currentLeft: number, viewPort: { width: number; height: number }, rectOrigin: IBoundingClientRect, rectContent: IBoundingClientRect, halfSquare: number): number {\n if (viewPort.width - (rectOrigin.left + rectOrigin.width + rectContent.width + halfSquare) > 0) {\n return rectOrigin.left + rectOrigin.width + halfSquare;\n }\n return currentLeft;\n }\n\n ngOnDestroy() {\n clearTimeout(this.timeout());\n }\n}\n","<div\n #container\n class=\"libs-ui-popover-overlay {{ config().classInclude || '' }}\"\n [class.libs-ui-popover-overlay-white-theme]=\"config().whiteTheme\"\n [class.libs-ui-popover-overlay-animation-move]=\"config().animationConfig\"\n [ngStyle]=\"config().ngStyles || {}\"\n [style.width]=\"config().width ? config().width + 'px' : 'auto'\"\n [style.maxWidth.px]=\"config().maxWidth\"\n [style.maxHeight.px]=\"config().maxHeight\"\n [style.top.px]=\"top()\"\n [style.left.px]=\"left()\"\n [style.zIndex]=\"config().zIndex || 10\">\n @if (config()) {\n @if (!config().ignoreArrow) {\n <div class=\"relative\">\n <svg\n [class]=\"'libs-ui-popover-overlay-arrow ' + arrowClass() + (config().whiteTheme ? ' libs-ui-popover-overlay-white-theme ' : '')\"\n [style.top.px]=\"arrowTop()\"\n [style.left.px]=\"arrowLeft()\"\n [attr.direction]=\"outEvent | async\">\n <polygon points=\"0,0 6,6 12,0\" />\n Sorry, your browser does not support inline SVG.\n </svg>\n </div>\n }\n @if (config().template; as templateConfig) {\n <div\n LibsUiComponentsScrollOverlayDirective\n class=\"libs-ui-popover-overlay-body {{ config().classIncludeOverlayBody || '' }}\"\n [attr.isTemplate]=\"true\"\n [style.max-height]=\"config().maxHeight + 'px'\">\n <ng-container *ngTemplateOutlet=\"templateConfig; context: { itemContext: config().itemContext }\" />\n </div>\n } @else {\n @let constHtmlContent = config().content || ' ';\n <div\n class=\"libs-ui-popover-overlay-body libs-ui-font-h7r {{ config().classIncludeOverlayBody || '' }}\"\n LibsUiComponentsScrollOverlayDirective\n [options]=\"config().scrollOverlayOptions\"\n [style.maxHeight.px]=\"config().maxHeight\"\n [style.paddingTop.px]=\"config().paddingTop ?? 8\"\n [style.paddingRight.px]=\"config().paddingRight ?? 8\"\n [style.paddingLeft.px]=\"config().paddingLeft ?? 8\"\n [style.paddingBottom.px]=\"config().paddingBottom ?? 8\"\n [innerHtml]=\"constHtmlContent | translate\"></div>\n }\n }\n</div>\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AfterContentInit, ChangeDetectionStrategy, Component, ComponentRef, ElementRef, OnDestroy, OnInit, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { PathOf } from '@libs-ui/interfaces-types';\nimport { LibsUiDynamicComponentService } from '@libs-ui/services-dynamic-component';\nimport { checkMouseOverInContainer, get, getEventNameHandleClick, getViewport, isNil, set } from '@libs-ui/utils';\nimport { Observable, Subject, Subscription, fromEvent } from 'rxjs';\nimport { debounceTime, takeUntil, tap } from 'rxjs/operators';\nimport { getPopoverTimerDestroyInQueryUrl } from './defines/constants.define';\nimport { IFlagMouse } from './interfaces/flag-mouse.interface';\nimport { IPopoverFunctionControlEvent } from './interfaces/function-control.interface';\nimport { IPopoverOverlay } from './interfaces/overlay.interface';\nimport { TYPE_POPOVER_DIRECTION, TYPE_POPOVER_EVENT, TYPE_POPOVER_MODE, TYPE_POPOVER_TYPE } from './interfaces/popover.type';\nimport { LibsUiComponentsPopoverOverlayComponent } from './overlay/overlay.component';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-popover,[LibsUiComponentsPopoverDirective]',\n templateUrl: './popover.component.html',\n styleUrl: './popover.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LibsUiComponentsPopoverComponent implements OnInit, AfterContentInit, OnDestroy {\n // #region PROPERTY\n private mouseEnter!: Observable<MouseEvent>;\n private mouseWheel!: Observable<MouseEvent>;\n private mouseClick!: Observable<MouseEvent>;\n private windowResize!: Observable<MouseEvent>;\n private windowWheel!: Observable<MouseEvent>;\n private windowMouseDown!: Observable<MouseEvent>;\n private windowClick!: Observable<MouseEvent>;\n private windowMouseUp!: Observable<MouseEvent>;\n private windowMousemove!: Observable<MouseEvent>;\n private popoverOverlayComponent!: ComponentRef<LibsUiComponentsPopoverOverlayComponent> | undefined;\n private subsEventPopup = new Subscription();\n private readonly onDestroy = new Subject<void>();\n private functionsControl?: IPopoverFunctionControlEvent;\n private readonly firstClick = signal<boolean>(false);\n private readonly contentInnerHtml = signal<string>('');\n private readonly timer = signal<ReturnType<typeof setTimeout> | undefined>(undefined);\n private readonly directionPopover = signal<TYPE_POPOVER_DIRECTION | undefined>(undefined);\n\n // #region INPUT\n readonly debugId = input<string>();\n readonly flagMouse = input<IFlagMouse, IFlagMouse | undefined>(\n { isMouseEnter: false, isMouseEnterContent: false, isContainerHasScroll: false },\n {\n transform: (value: any) => value ?? { isMouseEnter: false, isMouseEnterContent: false, isContainerHasScroll: false },\n }\n );\n readonly type = input<TYPE_POPOVER_TYPE, TYPE_POPOVER_TYPE | undefined>('other', { transform: (value) => value ?? 'other' });\n readonly mode = input<TYPE_POPOVER_MODE, TYPE_POPOVER_MODE | undefined>('hover', { transform: (value) => value ?? 'hover' });\n readonly config = input({}, { transform: (value: IPopoverOverlay | undefined) => value ?? {} });\n readonly ignoreShowPopover = input<boolean>();\n readonly elementRefCustom = input<HTMLElement>();\n readonly initEventInElementRefCustom = input<boolean, boolean | undefined>(false, { transform: (value) => value ?? false });\n readonly classInclude = input<string | undefined, string | undefined>('', { transform: (value) => value ?? '' });\n readonly ignoreHiddenPopoverContentWhenMouseLeave = input<boolean>();\n readonly ignoreStopPropagationEvent = input<boolean>();\n readonly ignoreCursorPointerModeLikeClick = input<boolean>();\n readonly isAddContentToParentDocument = input<boolean>();\n readonly ignoreClickOutside = input<boolean>();\n\n // #region OUTPUT\n readonly outEvent = output<TYPE_POPOVER_EVENT>();\n readonly outChangStageFlagMouse = output<IFlagMouse>();\n readonly outEventPopoverContent = output<TYPE_POPOVER_DIRECTION>();\n readonly outFunctionsControl = output<IPopoverFunctionControlEvent>();\n\n // #region INJECT\n private readonly elementRef = inject(ElementRef);\n private readonly dynamicService = inject(LibsUiDynamicComponentService);\n\n constructor() {\n let classDefault: string | undefined = undefined;\n effect(() => {\n try {\n if (classDefault === undefined) {\n classDefault = this.Element.className;\n }\n if (this.elementRefCustom() !== this.Element && this.Element.tagName !== 'svg') {\n this.Element.className = classDefault || '';\n }\n if (this.type() === 'text') {\n this.Element.classList.add('popover-text-ellipsis');\n }\n if (this.mode().includes('click') && !this.ignoreCursorPointerModeLikeClick()) {\n this.Element.classList.add('cursor-pointer');\n }\n if (this.classInclude()) {\n this.classInclude()\n ?.split(' ')\n .forEach((className) => {\n if (!className) {\n return;\n }\n this.Element.classList.add(className);\n });\n }\n } catch (error) {\n console.log(error, this.Element, this.Element.tagName);\n }\n });\n\n let first = true;\n effect(() => {\n this.config();\n untracked(() => {\n if (this.popoverOverlayComponent?.instance && !first) {\n this.updatePopoverOverlayPosition();\n }\n first = false;\n });\n });\n }\n\n ngOnInit(): void {\n this.outEventPopoverContent.subscribe((direction) => this.directionPopover.set(direction));\n this.functionsControl = {\n removePopoverOverlay: this.removePopoverOverlay.bind(this),\n updatePopoverOverlayPosition: this.updatePopoverOverlayPosition.bind(this),\n getRectContainer: async () => (this.elementRefCustom() || this.Element).getBoundingClientRect(),\n getRectContent: async () => this.popoverOverlayComponent?.instance?.ContainerElement?.getBoundingClientRect(),\n showPopover: this.addPopoverContent.bind(this),\n updatePopoverOverlay: this.updatePopoverOverlay.bind(this),\n };\n this.outFunctionsControl.emit(this.FunctionsControl);\n }\n\n ngAfterContentInit() {\n const nativeEl = this.Element;\n this.mouseEnter = this.initObservable(nativeEl, 'mouseenter');\n this.initObservable(nativeEl, 'click').subscribe();\n this.mouseClick = this.initObservable(nativeEl, getEventNameHandleClick);\n this.mouseWheel = this.initObservable(window, 'wheel');\n this.windowResize = this.initObservable(window, 'resize');\n this.windowWheel = this.initObservable(window, 'wheel');\n this.windowMouseDown = this.initObservable(window, 'mousedown');\n this.windowClick = this.initObservable(window, getEventNameHandleClick);\n this.windowMouseUp = this.initObservable(window, 'mouseup');\n this.windowMousemove = this.initObservable(window, 'mousemove');\n this.mouseEnter.subscribe(() => {\n if (!this.mode().includes('hover')) {\n return;\n }\n\n if (this.type() === 'text' && nativeEl?.clientWidth >= nativeEl.scrollWidth && !this.popoverOverlayComponent) {\n return;\n }\n this.addPopoverContent();\n });\n this.mouseClick.subscribe(() => {\n this.firstClick.update((val) => (this.ignoreShowPopover() ? false : !val));\n this.outEvent.emit('click');\n\n if (!this.mode().startsWith('click')) {\n return;\n }\n\n if (this.mode() === 'click-toggle' && !this.firstClick()) {\n this.removePopoverOverlay();\n\n return;\n }\n this.addPopoverContent();\n });\n this.windowResize.pipe(debounceTime(500)).subscribe(this.updatePopoverOverlayPosition.bind(this));\n }\n\n // #region FUNCTIONS\n public get FunctionsControl(): IPopoverFunctionControlEvent {\n return this.functionsControl as IPopoverFunctionControlEvent;\n }\n private async updatePopoverOverlay() {\n const timer = setTimeout(() => {\n clearTimeout(timer);\n if (!this.popoverOverlayComponent?.instance || !this.config()) {\n return;\n }\n const instance = this.popoverOverlayComponent.instance;\n const nativeEl = this.elementRefCustom() || this.Element;\n\n instance.setConfig(nativeEl.getBoundingClientRect(), { ...(this.config() || {}), ...this.getDefaultConfigs() }, this.isAddContentToParentDocument());\n });\n }\n\n private async updatePopoverOverlayPosition() {\n clearTimeout(this.timer());\n this.timer.set(\n setTimeout(async () => {\n if (!this.popoverOverlayComponent?.instance || !this.config() || !this.functionsControl) {\n return;\n }\n const viewPort = getViewport();\n const rectListView = await this.functionsControl.getRectContent();\n\n if (!rectListView) {\n return;\n }\n const rectContainer = await this.functionsControl.getRectContainer();\n const distanceListViewAndContainer = this.config()?.ignoreArrow === false ? 14 : 4;\n switch (this.directionPopover()) {\n case 'right':\n case 'left':\n case 'bottom':\n if (\n rectListView.top + rectListView.height > viewPort.height ||\n rectListView.top < rectContainer.top + rectContainer.height ||\n rectListView.top - (rectContainer.top + rectContainer.height) > distanceListViewAndContainer ||\n rectListView.left + rectListView.width > viewPort.width\n ) {\n this.updatePopoverOverlay();\n }\n break;\n\n case 'top':\n if (\n rectContainer.top - (rectListView.top + rectListView.height) > distanceListViewAndContainer ||\n rectListView.top + rectListView.height + distanceListViewAndContainer > rectContainer.top + 2 ||\n rectListView.left + rectListView.width > viewPort.width\n ) {\n this.updatePopoverOverlay();\n }\n break;\n }\n }, 250)\n );\n }\n\n protected get Element(): HTMLElement {\n if (this.initEventInElementRefCustom() && this.elementRefCustom()) {\n return this.elementRefCustom() as HTMLElement;\n }\n return this.elementRef.nativeElement.firstElementChild || this.elementRef.nativeElement;\n }\n\n private initObservable(el: any, eventName: string): Observable<MouseEvent> {\n return fromEvent<MouseEvent>(el, eventName).pipe(\n tap((e) => !this.ignoreStopPropagationEvent() && e.stopPropagation()),\n takeUntil(this.onDestroy)\n );\n }\n\n private async addPopoverContent(nativeEl?: HTMLElement) {\n if (this.popoverOverlayComponent || this.ignoreShowPopover() || !this.config()) {\n return;\n }\n\n this.popoverOverlayComponent = this.dynamicService.resolveComponentFactory(LibsUiComponentsPopoverOverlayComponent);\n this.dynamicService.addToBody(this.popoverOverlayComponent, this.isAddContentToParentDocument() || this.config().isAddContentToParentDocument);\n this.outEvent.emit('show');\n const instance = this.popoverOverlayComponent.instance;\n\n nativeEl = nativeEl || this.elementRefCustom() || this.Element;\n instance.setConfig(nativeEl.getBoundingClientRect(), { ...(this.config() || {}), ...this.getDefaultConfigs() }, this.isAddContentToParentDocument());\n const flagsMouses: IFlagMouse = {\n isMouseEnter: true,\n isMouseEnterContent: false,\n isContainerHasScroll: nativeEl.offsetHeight < nativeEl.scrollHeight,\n };\n const nativeElContainer = instance.ElementRef.nativeElement;\n const mouseEnterContent = this.initObservable(nativeElContainer, 'mouseenter');\n const mouseLeaveContent = this.initObservable(nativeElContainer, 'mouseleave');\n this.subsEventPopup.add(\n instance.outEvent.subscribe((direction: TYPE_POPOVER_DIRECTION) => {\n this.outEventPopoverContent.emit(direction);\n })\n );\n\n this.subsEventPopup.add(\n mouseEnterContent.subscribe(() => {\n this.outEvent.emit('mouseenter-content');\n flagsMouses.isMouseEnterContent = true;\n this.outChangStageFlagMouse.emit(flagsMouses);\n })\n );\n\n this.subsEventPopup.add(\n this.mouseEnter.subscribe(() => {\n this.outEvent.emit('mouseenter-element');\n this.outChangStageFlagMouse.emit(flagsMouses);\n })\n );\n\n this.subsEventPopup.add(\n this.mouseWheel.subscribe(() => {\n flagsMouses.isContainerHasScroll = false;\n\n if (nativeEl.offsetHeight < nativeEl.scrollHeight) {\n flagsMouses.isContainerHasScroll = true;\n }\n if ((flagsMouses.isMouseEnter && flagsMouses.isContainerHasScroll) || flagsMouses.isMouseEnterContent || this.flagMouse().isMouseEnter || this.flagMouse().isMouseEnterContent) {\n return;\n }\n this.removePopoverOverlay();\n })\n );\n this.handlerMouseLeaveRemovePopoverOverlay(this.windowMousemove, flagsMouses, 'isMouseEnter', 'isMouseEnterContent', 'mouseleave-element');\n this.handlerMouseLeaveRemovePopoverOverlay(mouseLeaveContent, flagsMouses, 'isMouseEnterContent', 'isMouseEnter', 'mouseleave-content');\n\n if (this.mode() === 'click_open_and_click_panel_content_hidden') {\n this.subsEventPopup.add(\n this.initObservable(nativeElContainer, 'click').subscribe(() => {\n this.removePopoverOverlay();\n })\n );\n }\n\n this.handlerWindowEventRemovePopoverOverlay(this.windowClick, flagsMouses);\n this.handlerWindowEventRemovePopoverOverlay(this.windowMouseDown, flagsMouses);\n this.handlerWindowEventRemovePopoverOverlay(this.windowMouseUp, flagsMouses);\n this.handlerWindowEventRemovePopoverOverlay(this.windowWheel, flagsMouses);\n }\n\n private handlerWindowEventRemovePopoverOverlay(obs: Observable<MouseEvent>, flagsMouses: IFlagMouse) {\n this.subsEventPopup.add(\n obs.pipe(debounceTime(10)).subscribe(() => {\n if (flagsMouses.isMouseEnter || flagsMouses.isMouseEnterContent || this.ignoreClickOutside()) {\n return;\n }\n if (this.flagMouse() && (this.flagMouse().isMouseEnter || this.flagMouse().isMouseEnterContent)) {\n return;\n }\n this.firstClick.set(false);\n this.removePopoverOverlay();\n })\n );\n }\n\n private handlerMouseLeaveRemovePopoverOverlay(obs: Observable<MouseEvent>, flagsMouses: IFlagMouse, flagKeyChangeValue: PathOf<IFlagMouse>, flagKeyCheck: PathOf<IFlagMouse>, outEvent: TYPE_POPOVER_EVENT) {\n this.subsEventPopup.add(\n obs\n .pipe(\n tap(() => this.outEvent.emit(outEvent)),\n debounceTime(getPopoverTimerDestroyInQueryUrl() || this.config()?.timerDestroy || 0)\n )\n .subscribe((e: MouseEvent) => {\n if (\n outEvent === 'mouseleave-element' &&\n (checkMouseOverInContainer(e, this.Element) || checkMouseOverInContainer({ clientX: e.clientX + 2, clientY: e.clientY + 2 }, this.Element) || checkMouseOverInContainer({ clientX: e.clientX - 2, clientY: e.clientY - 2 }, this.Element))\n ) {\n return;\n }\n set(flagsMouses, flagKeyChangeValue, false);\n this.outChangStageFlagMouse.emit(flagsMouses);\n if (this.flagMouse() && (this.flagMouse().isMouseEnter || this.flagMouse().isMouseEnterContent)) {\n return;\n }\n\n if (get(flagsMouses, flagKeyCheck) || this.ignoreHiddenPopoverContentWhenMouseLeave()) {\n return;\n }\n this.removePopoverOverlay();\n })\n );\n }\n\n private getDefaultConfigs(): IPopoverOverlay {\n const configValue = this.config() || {};\n if (isNil(configValue.content) || (configValue.content === this.contentInnerHtml() && this.contentInnerHtml() !== this.Element.innerHTML)) {\n configValue.content = this.Element.innerHTML;\n }\n this.contentInnerHtml.set(this.Element.innerHTML);\n if (!configValue.maxWidth) {\n configValue.maxWidth = 250;\n }\n if (configValue.maxHeight === undefined || configValue.maxHeight === 0) {\n configValue.maxHeight = 140;\n }\n if (!configValue.direction) {\n configValue.direction = 'bottom';\n }\n if (!configValue.position) {\n configValue.position = {\n mode: 'center',\n distance: 0,\n };\n }\n\n return configValue;\n }\n\n private async removePopoverOverlay() {\n if (this.popoverOverlayComponent) {\n this.outEvent.emit('remove');\n this.subsEventPopup.unsubscribe();\n this.subsEventPopup = new Subscription();\n }\n this.dynamicService.remove(this.popoverOverlayComponent);\n this.popoverOverlayComponent = undefined;\n this.firstClick.set(false);\n }\n\n ngOnDestroy() {\n clearTimeout(this.timer());\n this.removePopoverOverlay();\n this.onDestroy.next();\n this.onDestroy.complete();\n this.subsEventPopup.unsubscribe();\n }\n}\n","<ng-content />\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"libs-ui-components-popover.mjs","sources":["../../../../../libs-ui/components/popover/src/defines/constants.define.ts","../../../../../libs-ui/components/popover/src/overlay/overlay.component.ts","../../../../../libs-ui/components/popover/src/overlay/overlay.component.html","../../../../../libs-ui/components/popover/src/popover.component.ts","../../../../../libs-ui/components/popover/src/popover.component.html","../../../../../libs-ui/components/popover/src/libs-ui-components-popover.ts"],"sourcesContent":["import { get, UtilsUrlSearchParams } from '@libs-ui/utils';\nimport { TYPE_POPOVER_DIRECTION } from '../interfaces/popover.type';\n\nexport const KEY_QUERY_POPOVER_TIMER_DESTROY = 'popover-timer-destroy';\n\nconst timerDestroy = parseInt(new UtilsUrlSearchParams(location.href).get(KEY_QUERY_POPOVER_TIMER_DESTROY) || '0');\n\nexport const getPopoverTimerDestroyInQueryUrl = (): number => {\n return timerDestroy;\n};\n\nexport const getListDirections = (direction: TYPE_POPOVER_DIRECTION): Array<TYPE_POPOVER_DIRECTION> => {\n return get(\n {\n bottom: ['bottom', 'top', 'right', 'left'],\n right: ['right', 'left', 'bottom', 'top'],\n left: ['left', 'right', 'bottom', 'top'],\n top: ['top', 'bottom', 'right', 'left'],\n } as Record<TYPE_POPOVER_DIRECTION, Array<TYPE_POPOVER_DIRECTION>>,\n direction\n );\n};\n","import { AsyncPipe, NgStyle, NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, OnDestroy, inject, signal, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { LibsUiComponentsScrollOverlayDirective } from '@libs-ui/components-scroll-overlay';\nimport { IBoundingClientRect } from '@libs-ui/interfaces-types';\nimport { UtilsUrlSearchParams, cloneDeep, cloneIBoundingClientRect, getViewport } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { Subject, interval, take } from 'rxjs';\nimport { getListDirections } from '../defines/constants.define';\nimport { IPopoverOverlay } from '../interfaces/overlay.interface';\nimport { TYPE_POPOVER_DIRECTION } from '../interfaces/popover.type';\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-popover-overlay',\n templateUrl: './overlay.component.html',\n styleUrls: ['./overlay.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TranslateModule, NgStyle, AsyncPipe, LibsUiComponentsScrollOverlayDirective, NgTemplateOutlet],\n})\nexport class LibsUiComponentsPopoverOverlayComponent implements OnDestroy {\n /* PROPERTIES */\n protected currentDirection = signal<TYPE_POPOVER_DIRECTION>('bottom');\n protected arrowClass = signal<string>('');\n protected top = signal<number>(0);\n protected left = signal<number>(0);\n protected arrowLeft = signal<number>(0);\n protected arrowTop = signal<number>(0);\n protected config = signal<IPopoverOverlay>({});\n private readonly timeout = signal<ReturnType<typeof setTimeout> | undefined>(undefined);\n private readonly destroyRef = inject(DestroyRef);\n\n // #region OUTPUT\n readonly outEvent: Subject<TYPE_POPOVER_DIRECTION> = new Subject();\n\n /* VIEW CHILD */\n private readonly container = viewChild.required<ElementRef>('container');\n\n // #region INJECT\n private readonly elementRef = inject(ElementRef);\n\n // #region FUNCTIONS\n public get ElementRef() {\n return this.elementRef;\n }\n\n public get ContainerElement() {\n return this.container().nativeElement;\n }\n\n public setConfig(rectOrigin: IBoundingClientRect, config: IPopoverOverlay, isAddContentToParentDocument?: boolean) {\n isAddContentToParentDocument = isAddContentToParentDocument || config.isAddContentToParentDocument;\n rectOrigin = cloneIBoundingClientRect(rectOrigin);\n this.config.set(cloneDeep(config));\n\n this.container().nativeElement.style.opacity = 0;\n if (this.config().widthByParent) {\n this.config.update((config) => ({ ...config, width: rectOrigin.width - (config?.parentBorderWidth || 0) * 2 }));\n }\n let viewPort = getViewport();\n let rectFrame: IBoundingClientRect | undefined = undefined;\n\n if (isAddContentToParentDocument) {\n viewPort = getViewport(window.parent);\n const url = new UtilsUrlSearchParams(location.href);\n const iframeId = url.get('iframeId');\n\n rectFrame = window.parent.document.getElementById(`iframe-${iframeId}`)?.getBoundingClientRect();\n if (rectFrame) {\n rectOrigin.top += rectFrame.top;\n rectOrigin.left += rectFrame.left;\n }\n }\n\n if (this.config().maxHeight === null) {\n this.config.update((config) => ({ ...config, maxHeight: viewPort.height - rectOrigin.top - 44 }));\n }\n\n clearTimeout(this.timeout());\n this.setVariableCss();\n this.setDirections(rectOrigin, viewPort, rectFrame);\n let rectContent = cloneIBoundingClientRect(this.container().nativeElement.getBoundingClientRect());\n\n if (rectFrame) {\n rectContent.top += rectFrame.top;\n rectContent.left += rectFrame.left;\n }\n\n interval(250)\n .pipe(take(4), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n const rect = cloneIBoundingClientRect(this.container().nativeElement.getBoundingClientRect());\n\n if (rectFrame) {\n rect.top += rectFrame.top;\n rect.left += rectFrame.left;\n }\n if (rect.width !== rectContent.width || rect.height !== rectContent.height || rect.top !== rectContent.top || rect.left !== rectContent.left) {\n clearTimeout(this.timeout());\n this.setDirections(rectOrigin, viewPort, rectFrame);\n rectContent = rect;\n }\n });\n }\n\n private setDirections(rectOrigin: IBoundingClientRect, viewPort: { width: number; height: number }, rectFrame?: IBoundingClientRect) {\n const directions = getListDirections(this.config().direction || 'bottom');\n const positionLast = directions.length - 1;\n\n this.timeout.set(\n setTimeout(async () => {\n const rectContent = cloneIBoundingClientRect(this.container().nativeElement.getBoundingClientRect());\n\n if (rectFrame) {\n rectContent.top += rectFrame.top;\n rectContent.left += rectFrame.left;\n }\n for (const index in directions) {\n if (await this.loopDirection(rectOrigin, rectContent, directions[index], positionLast === +index, viewPort)) {\n return;\n }\n }\n\n const directionByHeight = viewPort.height - rectOrigin.top - rectOrigin.height > rectOrigin.top - 4 ? 'bottom' : 'top';\n\n this.loopDirection(rectOrigin, rectContent, directionByHeight, true, viewPort);\n this.container().nativeElement.style.opacity = 1;\n }, 50)\n );\n }\n\n private loopDirection(rectOrigin: IBoundingClientRect, rectContent: IBoundingClientRect, direction: TYPE_POPOVER_DIRECTION, isLast: boolean, viewPort: { width: number; height: number }): Promise<boolean> {\n return new Promise((resolve) => {\n const positionMode = this.config().position?.mode || 'start';\n const { position } = this.config();\n let result = this.setPosition(direction, rectOrigin, rectContent, viewPort, isLast);\n\n if (!result) {\n if (position) {\n position.mode = positionMode === 'center' || positionMode === 'start' ? 'end' : 'start';\n if (!this.config().ignoreArrow && position.autoUpdatePosition) {\n position.distance = position.mode === 'end' ? position.autoUpdatePosition.endDistance : position.autoUpdatePosition.startDistance;\n }\n this.config.update((config) => ({ ...config }));\n }\n result = this.setPosition(direction, rectOrigin, rectContent, viewPort, isLast);\n }\n if (!result && positionMode === 'center') {\n if (position) {\n position.mode = position.mode === 'start' ? 'end' : 'start';\n this.config.update((config) => ({ ...config }));\n }\n result = this.setPosition(direction, rectOrigin, rectContent, viewPort, isLast);\n }\n if (!result) {\n if (position) {\n position.mode = positionMode;\n this.config.update((config) => ({ ...config }));\n }\n\n return resolve(false);\n }\n this.setAndEmitEvent(direction);\n\n return resolve(true);\n });\n }\n\n private setAndEmitEvent(direction: TYPE_POPOVER_DIRECTION) {\n this.currentDirection.set(direction);\n this.setVariableCss();\n this.setClassArrow(direction);\n this.container().nativeElement.style.opacity = 1;\n this.outEvent.next(direction);\n }\n\n private setPosition(direction: TYPE_POPOVER_DIRECTION, rectOrigin: IBoundingClientRect, rectContent: IBoundingClientRect, viewPort: { width: number; height: number }, isLast: boolean): boolean {\n const halfSquare = 6;\n const distanceArrow = 4;\n let bottomPositionRectContent = 0;\n let positionTop = 0;\n let positionLeft = 0;\n let top = 0;\n let left = 0;\n const configValue = this.config();\n\n switch (direction) {\n case 'bottom':\n positionTop = rectOrigin.top + rectOrigin.height + distanceArrow;\n positionLeft = rectOrigin.left + rectOrigin.width / 2 - halfSquare;\n top = positionTop + halfSquare;\n left = positionLeft - rectContent.width / 2 + halfSquare;\n if (configValue.ignoreArrow) {\n top = top - halfSquare - distanceArrow;\n }\n top += configValue.directionDistance || 0;\n if (configValue.position?.mode === 'start') {\n left = rectOrigin.left + (configValue.position.distance || 0);\n }\n if (configValue.position?.mode === 'end') {\n left = rectOrigin.left + rectOrigin.width - rectContent.width + (configValue.position.distance || 0);\n }\n left += configValue.parentBorderWidth || 0;\n\n this.arrowLeft.set(positionLeft - left);\n this.arrowTop.set(-6);\n this.top.set(top);\n this.left.set(left);\n\n if (top + rectContent.height < viewPort.height && left >= 0 && left + rectContent.width < viewPort.width) {\n return true;\n }\n if (isLast) {\n if (this.config) {\n this.config.update((config) => ({ ...config, maxHeight: viewPort.height - rectOrigin.top - rectOrigin.height }));\n }\n this.left.set(this.getLeftPositionIsLast(isLast, left >= 0 ? left : 0, viewPort, rectOrigin, rectContent, halfSquare));\n\n return true;\n }\n\n return false;\n\n case 'right':\n positionTop = rectOrigin.top + rectOrigin.height / 2 - halfSquare;\n positionLeft = rectOrigin.left + rectOrigin.width + distanceArrow;\n top = positionTop - rectContent.height / 2 + halfSquare;\n left = positionLeft + halfSquare;\n\n if (configValue.ignoreArrow) {\n left = positionLeft - distanceArrow;\n }\n\n left += configValue.directionDistance || 0;\n if (configValue.position?.mode === 'start') {\n top = rectOrigin.top + (configValue.position?.distance || 0);\n }\n\n if (configValue.position?.mode === 'end') {\n top = rectOrigin.top + rectOrigin.height - rectContent.height + (configValue.position.distance || 0);\n }\n\n bottomPositionRectContent = top + rectContent.height;\n\n if (bottomPositionRectContent > viewPort.height) {\n top = top - (bottomPositionRectContent - viewPort.height);\n }\n\n this.arrowTop.set(positionTop - top + 2);\n this.arrowLeft.set(-9);\n\n this.top.set(top);\n this.left.set(left);\n if (top > 0 && left + rectContent.width < viewPort.width) {\n return true;\n }\n if (isLast) {\n if (this.config) {\n this.config.update((config) => ({ ...config, maxHeight: viewPort.height }));\n }\n this.left.set(this.getLeftPositionIsLast(isLast, left >= 0 ? left : 0, viewPort, rectOrigin, rectContent, halfSquare));\n\n return true;\n }\n\n return false;\n\n case 'left':\n positionTop = rectOrigin.top + rectOrigin.height / 2 - halfSquare;\n positionLeft = rectOrigin.left - halfSquare * 2 - distanceArrow;\n top = positionTop - rectContent.height / 2 + halfSquare;\n left = positionLeft - rectContent.width + halfSquare;\n if (configValue.ignoreArrow) {\n left = left + halfSquare + distanceArrow;\n }\n\n left -= configValue?.directionDistance || 0;\n if (configValue.position?.mode === 'start') {\n top = rectOrigin.top + (configValue.position.distance || 0);\n }\n\n if (configValue.position?.mode === 'end') {\n top = rectOrigin.top + rectOrigin.height - rectContent.height + (configValue.position.distance || 0);\n }\n\n bottomPositionRectContent = top + rectContent.height;\n\n if (bottomPositionRectContent > viewPort.height) {\n top = top - (bottomPositionRectContent - viewPort.height);\n }\n\n this.arrowTop.set(positionTop - top + 2);\n this.arrowLeft.set(rectContent.width - 3);\n\n this.top.set(top);\n this.left.set(left);\n if (left > 0 && top > 0) {\n return true;\n }\n\n if (isLast) {\n if (this.config) {\n this.config.update((config) => ({ ...config, maxHeight: viewPort.height }));\n }\n this.left.set(this.getLeftPositionIsLast(isLast, left >= 0 ? left : 0, viewPort, rectOrigin, rectContent, halfSquare));\n\n return true;\n }\n\n return false;\n\n case 'top':\n positionTop = rectOrigin.top - halfSquare * 2 - distanceArrow;\n positionLeft = rectOrigin.left + rectOrigin.width / 2 - halfSquare;\n top = positionTop - rectContent.height + halfSquare;\n left = positionLeft - rectContent.width / 2 + halfSquare;\n\n if (configValue.ignoreArrow) {\n top = top + halfSquare + distanceArrow;\n }\n\n top -= configValue.directionDistance || 0;\n\n if (configValue.position && configValue.position?.mode === 'start') {\n left = rectOrigin.left + (configValue.position.distance || 0);\n }\n\n if (configValue.position && configValue.position?.mode === 'end') {\n left = rectOrigin.left + rectOrigin.width - rectContent.width + (configValue.position.distance || 0);\n }\n\n left += configValue.parentBorderWidth || 0;\n this.arrowLeft.set(positionLeft - left);\n this.arrowTop.set(rectContent.height);\n this.top.set(top);\n this.left.set(left);\n if (top > 0 && left >= 0 && left + rectContent.width < viewPort.width) {\n return true;\n }\n\n if (isLast) {\n this.config.update((config) => ({ ...config, maxHeight: rectOrigin.top - 4 }));\n this.left.set(this.getLeftPositionIsLast(isLast, left >= 0 ? left : 0, viewPort, rectOrigin, rectContent, halfSquare));\n\n return true;\n }\n\n return false;\n }\n }\n\n private setClassArrow(direction: TYPE_POPOVER_DIRECTION) {\n if (direction === 'right') {\n return this.arrowClass.set('libs-ui-popover-overlay-arrow-right');\n }\n if (direction === 'left') {\n return this.arrowClass.set('libs-ui-popover-overlay-arrow-left');\n }\n if (direction === 'top') {\n return this.arrowClass.set('libs-ui-popover-overlay-arrow-down');\n }\n\n return this.arrowClass.set('libs-ui-popover-overlay-arrow-up');\n }\n\n private setVariableCss() {\n const configValue = this.config();\n this.ContainerElement.style.setProperty('--libs-ui-popover-overlay-time-animation-time', `${configValue.animationConfig?.time || 0.4}s`);\n this.ContainerElement.style.setProperty('--libs-ui-popover-overlay-time-animation-distance', `${this.currentDirection() === 'top' ? '-' : ''}${configValue.animationConfig?.distance || 12}px`);\n }\n\n private getLeftPositionIsLast(isLast: boolean, currentLeft: number, viewPort: { width: number; height: number }, rectOrigin: IBoundingClientRect, rectContent: IBoundingClientRect, halfSquare: number): number {\n if (viewPort.width - (rectOrigin.left + rectOrigin.width + rectContent.width + halfSquare) > 0) {\n return rectOrigin.left + rectOrigin.width + halfSquare;\n }\n return currentLeft;\n }\n\n ngOnDestroy() {\n clearTimeout(this.timeout());\n }\n}\n","<div\n #container\n class=\"libs-ui-popover-overlay {{ config().classInclude || '' }}\"\n [class.libs-ui-popover-overlay-white-theme]=\"config().whiteTheme\"\n [class.libs-ui-popover-overlay-animation-move]=\"config().animationConfig\"\n [ngStyle]=\"config().ngStyles || {}\"\n [style.width]=\"config().width ? config().width + 'px' : 'auto'\"\n [style.maxWidth.px]=\"config().maxWidth\"\n [style.maxHeight.px]=\"config().maxHeight\"\n [style.top.px]=\"top()\"\n [style.left.px]=\"left()\"\n [style.zIndex]=\"config().zIndex || 10\">\n @if (config()) {\n @if (!config().ignoreArrow) {\n <div class=\"relative\">\n <svg\n [class]=\"'libs-ui-popover-overlay-arrow ' + arrowClass() + (config().whiteTheme ? ' libs-ui-popover-overlay-white-theme ' : '')\"\n [style.top.px]=\"arrowTop()\"\n [style.left.px]=\"arrowLeft()\"\n [attr.direction]=\"outEvent | async\">\n <polygon points=\"0,0 6,6 12,0\" />\n Sorry, your browser does not support inline SVG.\n </svg>\n </div>\n }\n @if (config().template; as templateConfig) {\n <div\n LibsUiComponentsScrollOverlayDirective\n class=\"libs-ui-popover-overlay-body {{ config().classIncludeOverlayBody || '' }}\"\n [attr.isTemplate]=\"true\"\n [style.max-height]=\"config().maxHeight + 'px'\">\n <ng-container *ngTemplateOutlet=\"templateConfig; context: { itemContext: config().itemContext }\" />\n </div>\n } @else {\n @let constHtmlContent = config().content || ' ';\n <div\n class=\"libs-ui-popover-overlay-body libs-ui-font-h7r {{ config().classIncludeOverlayBody || '' }}\"\n LibsUiComponentsScrollOverlayDirective\n [options]=\"config().scrollOverlayOptions\"\n [style.maxHeight.px]=\"config().maxHeight\"\n [style.paddingTop.px]=\"config().paddingTop ?? 8\"\n [style.paddingRight.px]=\"config().paddingRight ?? 8\"\n [style.paddingLeft.px]=\"config().paddingLeft ?? 8\"\n [style.paddingBottom.px]=\"config().paddingBottom ?? 8\"\n [innerHtml]=\"constHtmlContent | translate\"></div>\n }\n }\n</div>\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AfterContentInit, ChangeDetectionStrategy, Component, ComponentRef, ElementRef, OnDestroy, OnInit, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { IBoundingClientRect, PathOf } from '@libs-ui/interfaces-types';\nimport { LibsUiDynamicComponentService } from '@libs-ui/services-dynamic-component';\nimport { checkMouseOverInContainer, get, getEventNameHandleClick, getViewport, isNil, set } from '@libs-ui/utils';\nimport { Observable, Subject, Subscription, fromEvent } from 'rxjs';\nimport { debounceTime, takeUntil, tap } from 'rxjs/operators';\nimport { getPopoverTimerDestroyInQueryUrl } from './defines/constants.define';\nimport { IFlagMouse } from './interfaces/flag-mouse.interface';\nimport { IPopoverFunctionControlEvent } from './interfaces/function-control.interface';\nimport { IPopoverOverlay } from './interfaces/overlay.interface';\nimport { TYPE_POPOVER_DIRECTION, TYPE_POPOVER_EVENT, TYPE_POPOVER_MODE, TYPE_POPOVER_TYPE } from './interfaces/popover.type';\nimport { LibsUiComponentsPopoverOverlayComponent } from './overlay/overlay.component';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-popover,[LibsUiComponentsPopoverDirective]',\n templateUrl: './popover.component.html',\n styleUrl: './popover.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LibsUiComponentsPopoverComponent implements OnInit, AfterContentInit, OnDestroy {\n // #region PROPERTY\n private mouseEnter!: Observable<MouseEvent>;\n private mouseWheel!: Observable<MouseEvent>;\n private mouseClick!: Observable<MouseEvent>;\n private windowResize!: Observable<MouseEvent>;\n private windowWheel!: Observable<MouseEvent>;\n private windowMouseDown!: Observable<MouseEvent>;\n private windowClick!: Observable<MouseEvent>;\n private windowMouseUp!: Observable<MouseEvent>;\n private windowMousemove!: Observable<MouseEvent>;\n private popoverOverlayComponent!: ComponentRef<LibsUiComponentsPopoverOverlayComponent> | undefined;\n // Rect của container tại lần định vị overlay gần nhất — mốc so sánh để phát hiện container dịch chuyển/đổi kích thước (vd: resize window làm layout reflow).\n private rectContainerLastPositioned?: IBoundingClientRect;\n private subsEventPopup = new Subscription();\n private readonly onDestroy = new Subject<void>();\n private functionsControl?: IPopoverFunctionControlEvent;\n private readonly firstClick = signal<boolean>(false);\n private readonly contentInnerHtml = signal<string>('');\n private readonly timer = signal<ReturnType<typeof setTimeout> | undefined>(undefined);\n private readonly directionPopover = signal<TYPE_POPOVER_DIRECTION | undefined>(undefined);\n\n // #region INPUT\n readonly debugId = input<string>();\n readonly flagMouse = input<IFlagMouse, IFlagMouse | undefined>(\n { isMouseEnter: false, isMouseEnterContent: false, isContainerHasScroll: false },\n {\n transform: (value: any) => value ?? { isMouseEnter: false, isMouseEnterContent: false, isContainerHasScroll: false },\n }\n );\n readonly type = input<TYPE_POPOVER_TYPE, TYPE_POPOVER_TYPE | undefined>('other', { transform: (value) => value ?? 'other' });\n readonly mode = input<TYPE_POPOVER_MODE, TYPE_POPOVER_MODE | undefined>('hover', { transform: (value) => value ?? 'hover' });\n readonly config = input({}, { transform: (value: IPopoverOverlay | undefined) => value ?? {} });\n readonly ignoreShowPopover = input<boolean>();\n readonly elementRefCustom = input<HTMLElement>();\n readonly initEventInElementRefCustom = input<boolean, boolean | undefined>(false, { transform: (value) => value ?? false });\n readonly classInclude = input<string | undefined, string | undefined>('', { transform: (value) => value ?? '' });\n readonly ignoreHiddenPopoverContentWhenMouseLeave = input<boolean>();\n readonly ignoreStopPropagationEvent = input<boolean>();\n readonly ignoreCursorPointerModeLikeClick = input<boolean>();\n readonly isAddContentToParentDocument = input<boolean>();\n readonly ignoreClickOutside = input<boolean>();\n\n // #region OUTPUT\n readonly outEvent = output<TYPE_POPOVER_EVENT>();\n readonly outChangStageFlagMouse = output<IFlagMouse>();\n readonly outEventPopoverContent = output<TYPE_POPOVER_DIRECTION>();\n readonly outFunctionsControl = output<IPopoverFunctionControlEvent>();\n\n // #region INJECT\n private readonly elementRef = inject(ElementRef);\n private readonly dynamicService = inject(LibsUiDynamicComponentService);\n\n constructor() {\n let classDefault: string | undefined = undefined;\n effect(() => {\n try {\n if (classDefault === undefined) {\n classDefault = this.Element.className;\n }\n if (this.elementRefCustom() !== this.Element && this.Element.tagName !== 'svg') {\n this.Element.className = classDefault || '';\n }\n if (this.type() === 'text') {\n this.Element.classList.add('popover-text-ellipsis');\n }\n if (this.mode().includes('click') && !this.ignoreCursorPointerModeLikeClick()) {\n this.Element.classList.add('cursor-pointer');\n }\n if (this.classInclude()) {\n this.classInclude()\n ?.split(' ')\n .forEach((className) => {\n if (!className) {\n return;\n }\n this.Element.classList.add(className);\n });\n }\n } catch (error) {\n console.log(error, this.Element, this.Element.tagName);\n }\n });\n\n let first = true;\n effect(() => {\n this.config();\n untracked(() => {\n if (this.popoverOverlayComponent?.instance && !first) {\n this.updatePopoverOverlayPosition();\n }\n first = false;\n });\n });\n }\n\n ngOnInit(): void {\n this.outEventPopoverContent.subscribe((direction) => this.directionPopover.set(direction));\n this.functionsControl = {\n removePopoverOverlay: this.removePopoverOverlay.bind(this),\n updatePopoverOverlayPosition: this.updatePopoverOverlayPosition.bind(this),\n getRectContainer: async () => (this.elementRefCustom() || this.Element).getBoundingClientRect(),\n getRectContent: async () => this.popoverOverlayComponent?.instance?.ContainerElement?.getBoundingClientRect(),\n showPopover: this.addPopoverContent.bind(this),\n updatePopoverOverlay: this.updatePopoverOverlay.bind(this),\n };\n this.outFunctionsControl.emit(this.FunctionsControl);\n }\n\n ngAfterContentInit() {\n const nativeEl = this.Element;\n this.mouseEnter = this.initObservable(nativeEl, 'mouseenter');\n this.initObservable(nativeEl, 'click').subscribe();\n this.mouseClick = this.initObservable(nativeEl, getEventNameHandleClick);\n this.mouseWheel = this.initObservable(window, 'wheel');\n this.windowResize = this.initObservable(window, 'resize');\n this.windowWheel = this.initObservable(window, 'wheel');\n this.windowMouseDown = this.initObservable(window, 'mousedown');\n this.windowClick = this.initObservable(window, getEventNameHandleClick);\n this.windowMouseUp = this.initObservable(window, 'mouseup');\n this.windowMousemove = this.initObservable(window, 'mousemove');\n this.mouseEnter.subscribe(() => {\n if (!this.mode().includes('hover')) {\n return;\n }\n\n if (this.type() === 'text' && nativeEl?.clientWidth >= nativeEl.scrollWidth && !this.popoverOverlayComponent) {\n return;\n }\n this.addPopoverContent();\n });\n this.mouseClick.subscribe(() => {\n this.firstClick.update((val) => (this.ignoreShowPopover() ? false : !val));\n this.outEvent.emit('click');\n\n if (!this.mode().startsWith('click')) {\n return;\n }\n\n if (this.mode() === 'click-toggle' && !this.firstClick()) {\n this.removePopoverOverlay();\n\n return;\n }\n this.addPopoverContent();\n });\n this.windowResize.pipe(debounceTime(100)).subscribe(this.updatePopoverOverlayPosition.bind(this));\n }\n\n // #region FUNCTIONS\n public get FunctionsControl(): IPopoverFunctionControlEvent {\n return this.functionsControl as IPopoverFunctionControlEvent;\n }\n private async updatePopoverOverlay() {\n const timer = setTimeout(() => {\n clearTimeout(timer);\n if (!this.popoverOverlayComponent?.instance || !this.config()) {\n return;\n }\n const instance = this.popoverOverlayComponent.instance;\n const nativeEl = this.elementRefCustom() || this.Element;\n const rectContainer = nativeEl.getBoundingClientRect();\n\n this.rectContainerLastPositioned = rectContainer;\n instance.setConfig(rectContainer, { ...(this.config() || {}), ...this.getDefaultConfigs() }, this.isAddContentToParentDocument());\n });\n }\n\n private async updatePopoverOverlayPosition() {\n clearTimeout(this.timer());\n this.timer.set(\n setTimeout(async () => {\n if (!this.popoverOverlayComponent?.instance || !this.config() || !this.functionsControl) {\n return;\n }\n const rectContainer = await this.functionsControl.getRectContainer();\n // Container đã dịch chuyển/đổi kích thước so với lần định vị gần nhất (vd: resize window làm layout reflow ngang lẫn dọc)\n // → định vị lại ngay; các điều kiện switch bên dưới chỉ phát hiện lệch dọc/tràn mép phải nên không bắt được trường hợp này.\n if (this.checkRectContainerMoved(rectContainer)) {\n this.updatePopoverOverlay();\n return;\n }\n const viewPort = getViewport();\n const rectListView = await this.functionsControl.getRectContent();\n\n if (!rectListView) {\n return;\n }\n const distanceListViewAndContainer = this.config()?.ignoreArrow === false ? 14 : 4;\n switch (this.directionPopover()) {\n case 'right':\n case 'left':\n case 'bottom':\n if (\n rectListView.top + rectListView.height > viewPort.height ||\n rectListView.top < rectContainer.top + rectContainer.height ||\n rectListView.top - (rectContainer.top + rectContainer.height) > distanceListViewAndContainer ||\n rectListView.left + rectListView.width > viewPort.width\n ) {\n this.updatePopoverOverlay();\n }\n break;\n\n case 'top':\n if (\n rectContainer.top - (rectListView.top + rectListView.height) > distanceListViewAndContainer ||\n rectListView.top + rectListView.height + distanceListViewAndContainer > rectContainer.top + 2 ||\n rectListView.left + rectListView.width > viewPort.width\n ) {\n this.updatePopoverOverlay();\n }\n break;\n }\n }, 250)\n );\n }\n\n private checkRectContainerMoved(rectContainer: IBoundingClientRect): boolean {\n const rectLast = this.rectContainerLastPositioned;\n if (!rectLast) {\n return false;\n }\n // Dung sai 1px để bỏ qua sai số subpixel khi trình duyệt làm tròn.\n return Math.abs(rectLast.top - rectContainer.top) > 1 || Math.abs(rectLast.left - rectContainer.left) > 1 || Math.abs(rectLast.width - rectContainer.width) > 1 || Math.abs(rectLast.height - rectContainer.height) > 1;\n }\n\n protected get Element(): HTMLElement {\n if (this.initEventInElementRefCustom() && this.elementRefCustom()) {\n return this.elementRefCustom() as HTMLElement;\n }\n return this.elementRef.nativeElement.firstElementChild || this.elementRef.nativeElement;\n }\n\n private initObservable(el: any, eventName: string): Observable<MouseEvent> {\n return fromEvent<MouseEvent>(el, eventName).pipe(\n tap((e) => !this.ignoreStopPropagationEvent() && e.stopPropagation()),\n takeUntil(this.onDestroy)\n );\n }\n\n private async addPopoverContent(nativeEl?: HTMLElement) {\n if (this.popoverOverlayComponent || this.ignoreShowPopover() || !this.config()) {\n return;\n }\n\n this.popoverOverlayComponent = this.dynamicService.resolveComponentFactory(LibsUiComponentsPopoverOverlayComponent);\n this.dynamicService.addToBody(this.popoverOverlayComponent, this.isAddContentToParentDocument() || this.config().isAddContentToParentDocument);\n this.outEvent.emit('show');\n const instance = this.popoverOverlayComponent.instance;\n\n nativeEl = nativeEl || this.elementRefCustom() || this.Element;\n this.rectContainerLastPositioned = nativeEl.getBoundingClientRect();\n instance.setConfig(this.rectContainerLastPositioned, { ...(this.config() || {}), ...this.getDefaultConfigs() }, this.isAddContentToParentDocument());\n const flagsMouses: IFlagMouse = {\n isMouseEnter: true,\n isMouseEnterContent: false,\n isContainerHasScroll: nativeEl.offsetHeight < nativeEl.scrollHeight,\n };\n const nativeElContainer = instance.ElementRef.nativeElement;\n const mouseEnterContent = this.initObservable(nativeElContainer, 'mouseenter');\n const mouseLeaveContent = this.initObservable(nativeElContainer, 'mouseleave');\n this.subsEventPopup.add(\n instance.outEvent.subscribe((direction: TYPE_POPOVER_DIRECTION) => {\n this.outEventPopoverContent.emit(direction);\n })\n );\n\n this.subsEventPopup.add(\n mouseEnterContent.subscribe(() => {\n this.outEvent.emit('mouseenter-content');\n flagsMouses.isMouseEnterContent = true;\n this.outChangStageFlagMouse.emit(flagsMouses);\n })\n );\n\n this.subsEventPopup.add(\n this.mouseEnter.subscribe(() => {\n this.outEvent.emit('mouseenter-element');\n this.outChangStageFlagMouse.emit(flagsMouses);\n })\n );\n\n this.subsEventPopup.add(\n this.mouseWheel.subscribe(() => {\n flagsMouses.isContainerHasScroll = false;\n\n if (nativeEl.offsetHeight < nativeEl.scrollHeight) {\n flagsMouses.isContainerHasScroll = true;\n }\n if ((flagsMouses.isMouseEnter && flagsMouses.isContainerHasScroll) || flagsMouses.isMouseEnterContent || this.flagMouse().isMouseEnter || this.flagMouse().isMouseEnterContent) {\n return;\n }\n this.removePopoverOverlay();\n })\n );\n this.handlerMouseLeaveRemovePopoverOverlay(this.windowMousemove, flagsMouses, 'isMouseEnter', 'isMouseEnterContent', 'mouseleave-element');\n this.handlerMouseLeaveRemovePopoverOverlay(mouseLeaveContent, flagsMouses, 'isMouseEnterContent', 'isMouseEnter', 'mouseleave-content');\n\n if (this.mode() === 'click_open_and_click_panel_content_hidden') {\n this.subsEventPopup.add(\n this.initObservable(nativeElContainer, 'click').subscribe(() => {\n this.removePopoverOverlay();\n })\n );\n }\n\n this.handlerWindowEventRemovePopoverOverlay(this.windowClick, flagsMouses);\n this.handlerWindowEventRemovePopoverOverlay(this.windowMouseDown, flagsMouses);\n this.handlerWindowEventRemovePopoverOverlay(this.windowMouseUp, flagsMouses);\n this.handlerWindowEventRemovePopoverOverlay(this.windowWheel, flagsMouses);\n }\n\n private handlerWindowEventRemovePopoverOverlay(obs: Observable<MouseEvent>, flagsMouses: IFlagMouse) {\n this.subsEventPopup.add(\n obs.pipe(debounceTime(10)).subscribe(() => {\n if (flagsMouses.isMouseEnter || flagsMouses.isMouseEnterContent || this.ignoreClickOutside()) {\n return;\n }\n if (this.flagMouse() && (this.flagMouse().isMouseEnter || this.flagMouse().isMouseEnterContent)) {\n return;\n }\n this.firstClick.set(false);\n this.removePopoverOverlay();\n })\n );\n }\n\n private handlerMouseLeaveRemovePopoverOverlay(obs: Observable<MouseEvent>, flagsMouses: IFlagMouse, flagKeyChangeValue: PathOf<IFlagMouse>, flagKeyCheck: PathOf<IFlagMouse>, outEvent: TYPE_POPOVER_EVENT) {\n this.subsEventPopup.add(\n obs\n .pipe(\n tap(() => this.outEvent.emit(outEvent)),\n debounceTime(getPopoverTimerDestroyInQueryUrl() || this.config()?.timerDestroy || 0)\n )\n .subscribe((e: MouseEvent) => {\n if (\n outEvent === 'mouseleave-element' &&\n (checkMouseOverInContainer(e, this.Element) || checkMouseOverInContainer({ clientX: e.clientX + 2, clientY: e.clientY + 2 }, this.Element) || checkMouseOverInContainer({ clientX: e.clientX - 2, clientY: e.clientY - 2 }, this.Element))\n ) {\n return;\n }\n set(flagsMouses, flagKeyChangeValue, false);\n this.outChangStageFlagMouse.emit(flagsMouses);\n if (this.flagMouse() && (this.flagMouse().isMouseEnter || this.flagMouse().isMouseEnterContent)) {\n return;\n }\n\n if (get(flagsMouses, flagKeyCheck) || this.ignoreHiddenPopoverContentWhenMouseLeave()) {\n return;\n }\n this.removePopoverOverlay();\n })\n );\n }\n\n private getDefaultConfigs(): IPopoverOverlay {\n const configValue = this.config() || {};\n if (isNil(configValue.content) || (configValue.content === this.contentInnerHtml() && this.contentInnerHtml() !== this.Element.innerHTML)) {\n configValue.content = this.Element.innerHTML;\n }\n this.contentInnerHtml.set(this.Element.innerHTML);\n if (!configValue.maxWidth) {\n configValue.maxWidth = 250;\n }\n if (configValue.maxHeight === undefined || configValue.maxHeight === 0) {\n configValue.maxHeight = 140;\n }\n if (!configValue.direction) {\n configValue.direction = 'bottom';\n }\n if (!configValue.position) {\n configValue.position = {\n mode: 'center',\n distance: 0,\n };\n }\n\n return configValue;\n }\n\n private async removePopoverOverlay() {\n if (this.popoverOverlayComponent) {\n this.outEvent.emit('remove');\n this.subsEventPopup.unsubscribe();\n this.subsEventPopup = new Subscription();\n }\n this.dynamicService.remove(this.popoverOverlayComponent);\n this.popoverOverlayComponent = undefined;\n this.rectContainerLastPositioned = undefined;\n this.firstClick.set(false);\n }\n\n ngOnDestroy() {\n clearTimeout(this.timer());\n this.removePopoverOverlay();\n this.onDestroy.next();\n this.onDestroy.complete();\n this.subsEventPopup.unsubscribe();\n }\n}\n","<ng-content />\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@libs-ui/components-popover",
3
- "version": "0.2.357-15",
3
+ "version": "0.2.357-16",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=18.0.0",
6
6
  "@angular/core": ">=18.0.0",
7
- "@libs-ui/utils": "0.2.357-15",
8
- "@libs-ui/interfaces-types": "0.2.357-15",
9
- "@libs-ui/components-scroll-overlay": "0.2.357-15",
7
+ "@libs-ui/utils": "0.2.357-16",
8
+ "@libs-ui/interfaces-types": "0.2.357-16",
9
+ "@libs-ui/components-scroll-overlay": "0.2.357-16",
10
10
  "@ngx-translate/core": "^15.0.0",
11
11
  "rxjs": "~7.8.0",
12
- "@libs-ui/services-dynamic-component": "0.2.357-15"
12
+ "@libs-ui/services-dynamic-component": "0.2.357-16"
13
13
  },
14
14
  "sideEffects": false,
15
15
  "module": "fesm2022/libs-ui-components-popover.mjs",
@@ -15,6 +15,7 @@ export declare class LibsUiComponentsPopoverComponent implements OnInit, AfterCo
15
15
  private windowMouseUp;
16
16
  private windowMousemove;
17
17
  private popoverOverlayComponent;
18
+ private rectContainerLastPositioned?;
18
19
  private subsEventPopup;
19
20
  private readonly onDestroy;
20
21
  private functionsControl?;
@@ -48,6 +49,7 @@ export declare class LibsUiComponentsPopoverComponent implements OnInit, AfterCo
48
49
  get FunctionsControl(): IPopoverFunctionControlEvent;
49
50
  private updatePopoverOverlay;
50
51
  private updatePopoverOverlayPosition;
52
+ private checkRectContainerMoved;
51
53
  protected get Element(): HTMLElement;
52
54
  private initObservable;
53
55
  private addPopoverContent;