@libs-ui/components-inputs-mention 0.2.357-2 → 0.2.357-20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -9
- package/esm2022/interfaces/mention.interface.mjs +1 -1
- package/esm2022/list/list.component.mjs +7 -4
- package/esm2022/mention.directive.mjs +4 -2
- package/fesm2022/libs-ui-components-inputs-mention.mjs +9 -4
- package/fesm2022/libs-ui-components-inputs-mention.mjs.map +1 -1
- package/interfaces/mention.interface.d.ts +2 -1
- package/list/list.component.d.ts +1 -0
- package/package.json +7 -9
package/README.md
CHANGED
|
@@ -289,6 +289,39 @@ export class RteIntegrationComponent {
|
|
|
289
289
|
}
|
|
290
290
|
```
|
|
291
291
|
|
|
292
|
+
### 6. Gắn dữ liệu bổ sung vào node mention — `mentionInsertData`
|
|
293
|
+
|
|
294
|
+
Chỉ dùng cho editor (quill2x). Các key trả về được merge vào `IMentionInsert.data` và trở thành attribute của node mention. Kết hợp với blot `mention` của quill2x để render chip giàu (icon + nhãn) thay cho text thuần.
|
|
295
|
+
|
|
296
|
+
```typescript
|
|
297
|
+
import { Component } from '@angular/core';
|
|
298
|
+
import { IMentionConfig } from '@libs-ui/components-inputs-mention';
|
|
299
|
+
import { IQuill2xMentionChipPiece } from '@libs-ui/components-inputs-quill2x';
|
|
300
|
+
|
|
301
|
+
@Component({
|
|
302
|
+
standalone: true,
|
|
303
|
+
template: `<libs_ui-components-inputs-quill2x [dataConfigMention]="config" />`,
|
|
304
|
+
})
|
|
305
|
+
export class MentionChipComponent {
|
|
306
|
+
readonly config: IMentionConfig = {
|
|
307
|
+
items: [{ id: '1', name: 'Deal ABC' }],
|
|
308
|
+
triggerChar: '@',
|
|
309
|
+
labelKey: 'name',
|
|
310
|
+
mentionSelect: (item: any) => `@${item.name}`,
|
|
311
|
+
mentionInsertData: (item: any) => {
|
|
312
|
+
const pieces: Array<IQuill2xMentionChipPiece> = [
|
|
313
|
+
{ className: 'libs-ui-icon-deal' },
|
|
314
|
+
{ className: 'libs-ui-font-h7r', text: item.name },
|
|
315
|
+
];
|
|
316
|
+
|
|
317
|
+
return { chip: JSON.stringify(pieces) };
|
|
318
|
+
},
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
> ⚠️ **id/feId/value không bị ghi đè**: các key gốc của node mention luôn thắng, kể cả khi `mentionInsertData` trả về trùng tên. `chip` JSON hỏng → blot tự fallback về hiển thị text `value`.
|
|
324
|
+
|
|
292
325
|
## @Input()
|
|
293
326
|
|
|
294
327
|
| Input | Type | Default | Mô tả | Ví dụ |
|
|
@@ -357,6 +390,12 @@ export interface IMentionItem {
|
|
|
357
390
|
mentionSelect?: (item: unknown, triggerChar?: string) => string;
|
|
358
391
|
/** Hàm lọc danh sách items theo search string */
|
|
359
392
|
mentionFilter?: (searchString: string, items?: Array<unknown>) => Array<unknown> | undefined;
|
|
393
|
+
/**
|
|
394
|
+
* Chỉ áp dụng cho editor (quill2x): dữ liệu bổ sung gắn kèm vào node mention khi chèn.
|
|
395
|
+
* Các key trả về được merge vào `IMentionInsert.data` (id/feId/value luôn thắng, không bị ghi đè).
|
|
396
|
+
* Dùng để blot render dạng chip giàu — xem ví dụ 6.
|
|
397
|
+
*/
|
|
398
|
+
mentionInsertData?: (item: unknown) => Record<string, string>;
|
|
360
399
|
/** Sự kiện DOM trên mention span đã chèn kích hoạt mentionActionByEvent */
|
|
361
400
|
mentionEventName?: 'click' | 'mouseenter';
|
|
362
401
|
/** Callback được gọi khi sự kiện mentionEventName xảy ra trên span mention */
|
|
@@ -372,6 +411,10 @@ export interface IMentionItem {
|
|
|
372
411
|
* Dùng cho rich text editor tích hợp sâu (Quill, ProseMirror).
|
|
373
412
|
*/
|
|
374
413
|
export interface IMentionInsert {
|
|
414
|
+
/**
|
|
415
|
+
* id/feId/value là bộ attribute gốc của node mention.
|
|
416
|
+
* Các key khác (kiểu string) do `IMentionItem.mentionInsertData()` cấp thêm — vd `chip` cho quill2x.
|
|
417
|
+
*/
|
|
375
418
|
data: {
|
|
376
419
|
/** ID định danh duy nhất (từ item.id hoặc uuid tự sinh) */
|
|
377
420
|
id: string;
|
|
@@ -379,7 +422,7 @@ export interface IMentionInsert {
|
|
|
379
422
|
feId: string;
|
|
380
423
|
/** Giá trị text được chèn (kết quả của mentionSelect) */
|
|
381
424
|
value: string;
|
|
382
|
-
}
|
|
425
|
+
} & Record<string, string>;
|
|
383
426
|
/** Số ký tự cần xóa tính từ vị trí con trỏ để thay bằng mention node */
|
|
384
427
|
lengthKey: number;
|
|
385
428
|
}
|
|
@@ -439,11 +482,3 @@ Khi không truyền đủ các option, directive áp dụng các giá trị mặ
|
|
|
439
482
|
⚠️ **timeDelayInit với lazy-loaded editor**: Khi dùng cùng Quill hoặc editor khởi tạo bất đồng bộ, truyền `[timeDelayInit]="500"` hoặc giá trị phù hợp để đảm bảo editor đã render xong trước khi directive gắn event.
|
|
440
483
|
|
|
441
484
|
⚠️ **disableSearch để load data từ API**: Khi muốn tự load danh sách từ API dựa trên từ khóa, set `disableSearch: true` trong config và lắng nghe `(outSearchTerm)` để gọi API. Sau khi nhận kết quả, cập nhật `mentionConfig.items` để danh sách hiển thị mới.
|
|
442
|
-
|
|
443
|
-
## Demo
|
|
444
|
-
|
|
445
|
-
```bash
|
|
446
|
-
npx nx serve core-ui
|
|
447
|
-
```
|
|
448
|
-
|
|
449
|
-
Truy cập: `http://localhost:4500/inputs/mention`
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudGlvbi5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL21lbnRpb24vc3JjL2ludGVyZmFjZXMvbWVudGlvbi5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNZW50aW9uQ29uZmlnIGV4dGVuZHMgSU1lbnRpb25JdGVtIHtcbiAgZGlzYWJsZVN0eWxlPzogYm9vbGVhbjtcbiAgaWZyYW1lPzogc3RyaW5nO1xuICBtZW50aW9uPzogQXJyYXk8SU1lbnRpb25JdGVtPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTWVudGlvbkl0ZW0ge1xuICB0cmlnZ2VyQ2hhcj86IHN0cmluZztcblxuICAvLyBvcHRpb24gdG8gc3BlY2lmeSB0aGUgZmllbGQgaW4gdGhlIG9iamVjdHMgdG8gYmUgdXNlZCBhcyB0aGUgaXRlbSBsYWJlbFxuICBsYWJlbEtleT86IHN0cmluZztcblxuICAvLyBvcHRpb24gdG8gbGltaXQgdGhlIG51bWJlciBvZiBpdGVtcyBzaG93biBpbiB0aGUgcG9wLXVwIG1lbnVcbiAgZGlzYWJsZVNvcnQ/OiBib29sZWFuO1xuXG4gIC8vIG9wdGlvbiB0byBkaXNhYmxlIGludGVybmFsIGZpbHRlcmluZy4gY2FuIGJlIHVzZWQgdG8gc2hvdyB0aGUgZnVsbCBsaXN0IHJldHVybmVkXG4gIC8vIGZyb20gYW4gYXN5bmMgb3BlcmF0aW9uXG4gIGRpc2FibGVTZWFyY2g/OiBib29sZWFuO1xuXG4gIC8vIGRpc3BsYXkgbWVudSBhYm92ZSB0ZXh0IGluc3RlYWQgb2YgYmVsb3dcbiAgZHJvcFVwPzogYm9vbGVhbjtcblxuICAvLyB3aGV0aGVyIHRvIGFsbG93IHNwYWNlIHdoaWxlIG1lbnRpb25pbmcgb3Igbm90XG4gIGFsbG93U3BhY2U/OiBib29sZWFuO1xuICBsaW1pdFNwYWNlU2VhcmNoUXVlcnk/
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudGlvbi5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL21lbnRpb24vc3JjL2ludGVyZmFjZXMvbWVudGlvbi5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNZW50aW9uQ29uZmlnIGV4dGVuZHMgSU1lbnRpb25JdGVtIHtcbiAgZGlzYWJsZVN0eWxlPzogYm9vbGVhbjtcbiAgaWZyYW1lPzogc3RyaW5nO1xuICBtZW50aW9uPzogQXJyYXk8SU1lbnRpb25JdGVtPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTWVudGlvbkl0ZW0ge1xuICB0cmlnZ2VyQ2hhcj86IHN0cmluZztcblxuICAvLyBvcHRpb24gdG8gc3BlY2lmeSB0aGUgZmllbGQgaW4gdGhlIG9iamVjdHMgdG8gYmUgdXNlZCBhcyB0aGUgaXRlbSBsYWJlbFxuICBsYWJlbEtleT86IHN0cmluZztcblxuICAvLyBvcHRpb24gdG8gbGltaXQgdGhlIG51bWJlciBvZiBpdGVtcyBzaG93biBpbiB0aGUgcG9wLXVwIG1lbnVcbiAgZGlzYWJsZVNvcnQ/OiBib29sZWFuO1xuXG4gIC8vIG9wdGlvbiB0byBkaXNhYmxlIGludGVybmFsIGZpbHRlcmluZy4gY2FuIGJlIHVzZWQgdG8gc2hvdyB0aGUgZnVsbCBsaXN0IHJldHVybmVkXG4gIC8vIGZyb20gYW4gYXN5bmMgb3BlcmF0aW9uXG4gIGRpc2FibGVTZWFyY2g/OiBib29sZWFuO1xuXG4gIC8vIGRpc3BsYXkgbWVudSBhYm92ZSB0ZXh0IGluc3RlYWQgb2YgYmVsb3dcbiAgZHJvcFVwPzogYm9vbGVhbjtcblxuICAvLyB3aGV0aGVyIHRvIGFsbG93IHNwYWNlIHdoaWxlIG1lbnRpb25pbmcgb3Igbm90XG4gIGFsbG93U3BhY2U/OiBib29sZWFuO1xuICBsaW1pdFNwYWNlU2VhcmNoUXVlcnk/OiBudW1iZXI7XG5cbiAgLy8gb3B0aW9uIHRvIGluY2x1ZGUgdGhlIHRyaWdnZXIgY2hhciBpbiB0aGUgc2VhcmNoVGVybSBldmVudFxuICByZXR1cm5UcmlnZ2VyPzogYm9vbGVhbjtcblxuICAvLyBvcHRpb25hbCBmdW5jdGlvbiB0byBmb3JtYXQgdGhlIHNlbGVjdGVkIGl0ZW0gYmVmb3JlIGluc2VydGluZyB0aGUgdGV4dFxuICBtZW50aW9uU2VsZWN0PzogKGl0ZW06IHVua25vd24sIHRyaWdnZXJDaGFyPzogc3RyaW5nKSA9PiBzdHJpbmc7XG5cbiAgLy8gb3B0aW9uYWwgKGVkaXRvci9xdWlsbDJ4IG9ubHkpOiBk4buvIGxp4buHdSBi4buVIHN1bmcgZ+G6r24gdsOgbyBibG90IG1lbnRpb24ga2hpIGNow6huIOKAlCB2ZCBgY2hpcGAgKEpTT04gcGllY2VzKVxuICAvLyDEkeG7gyBibG90IHJlbmRlciBk4bqhbmcgY2hpcCBnacOgdSAoaWNvbiArIG5ow6NuKSB0aGF5IHbDrCB0ZXh0IHRodeG6p24uIE1lcmdlIHbDoG8gSU1lbnRpb25JbnNlcnQuZGF0YS5cbiAgbWVudGlvbkluc2VydERhdGE/OiAoaXRlbTogdW5rbm93bikgPT4gUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvLyBvcHRpb25hbCBmdW5jdGlvbiB0byBjdXN0b21pemUgdGhlIHNlYXJjaCBpbXBsZW1lbnRhdGlvblxuICBtZW50aW9uRmlsdGVyPzogKHNlYXJjaFN0cmluZzogc3RyaW5nLCBpdGVtcz86IEFycmF5PHVua25vd24+KSA9PiBBcnJheTx1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuICBtZW50aW9uRXZlbnROYW1lPzogJ2NsaWNrJyB8ICdtb3VzZWVudGVyJztcbiAgbWVudGlvbkFjdGlvbkJ5RXZlbnQ/OiAoaXRlbTogdW5rbm93biwgdHJpZ2dlckNoYXJzPzogc3RyaW5nKSA9PiB2b2lkO1xuICBpdGVtczogQXJyYXk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj47XG5cbiAgekluZGV4PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElOb2RlSW5zZXJ0IHtcbiAgZWxlbWVudFNwYW46IEhUTUxTcGFuRWxlbWVudDtcbiAgc3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBpdGVtPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgdHJpZ2dlckNoYXI/OiBzdHJpbmc7XG4gIG1hbnVhbEFkZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1lbnRpb25JbnNlcnQge1xuICAvLyBpZC9mZUlkL3ZhbHVlIGzDoCBi4buZIGF0dHIgZ+G7kWMgY+G7p2EgYmxvdDsga2V5IGtow6FjICh2ZCBgY2hpcGApIGRvIGNvbmZpZy5tZW50aW9uSW5zZXJ0RGF0YSBj4bqlcCB0aMOqbS5cbiAgZGF0YToge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZmVJZDogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gIH0gJiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBsZW5ndGhLZXk6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTWVudGlvbkZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgYWRkTWVudGlvbjogKGlucHV0RXZlbnQ6IGJvb2xlYW4pID0+IHZvaWQ7XG59XG4iXX0=
|
|
@@ -2,6 +2,7 @@ import { NgTemplateOutlet } from '@angular/common';
|
|
|
2
2
|
import { ChangeDetectionStrategy, Component, model, signal, viewChild, viewChildren } from '@angular/core';
|
|
3
3
|
import { LibsUiComponentsAvatarComponent } from '@libs-ui/components-avatar';
|
|
4
4
|
import { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';
|
|
5
|
+
import { LibsUiComponentsScrollOverlayDirective } from '@libs-ui/components-scroll-overlay';
|
|
5
6
|
import { set, UtilsKeyCodeConstant } from '@libs-ui/utils';
|
|
6
7
|
import { fromEvent, Subject, takeUntil } from 'rxjs';
|
|
7
8
|
import { getCaretCoordinates } from '../defines/caret-coords.define';
|
|
@@ -27,6 +28,8 @@ export class LibsUiComponentsInputsMentionListComponent {
|
|
|
27
28
|
listTemplate = signal(undefined);
|
|
28
29
|
/* VIEW CHILD */
|
|
29
30
|
elementEl = viewChild('elementRef');
|
|
31
|
+
// Vùng cuộn thực tế (scroll-overlay) — elementEl chỉ còn vai trò định vị/khung.
|
|
32
|
+
contentEl = viewChild('contentRef');
|
|
30
33
|
itemsEl = viewChildren('itemRef');
|
|
31
34
|
ngOnInit() {
|
|
32
35
|
if (this.isIframe()) {
|
|
@@ -145,7 +148,7 @@ export class LibsUiComponentsInputsMentionListComponent {
|
|
|
145
148
|
}
|
|
146
149
|
scrollContent() {
|
|
147
150
|
setTimeout(() => {
|
|
148
|
-
const element = this.
|
|
151
|
+
const element = this.contentEl();
|
|
149
152
|
if (element?.nativeElement) {
|
|
150
153
|
element.nativeElement.scrollTop = 0;
|
|
151
154
|
}
|
|
@@ -156,10 +159,10 @@ export class LibsUiComponentsInputsMentionListComponent {
|
|
|
156
159
|
this.onDestroy.complete();
|
|
157
160
|
}
|
|
158
161
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsMentionListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
159
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsMentionListComponent, isStandalone: true, selector: "libs_ui-components-inputs-mention-list", inputs: { labelKey: { classPropertyName: "labelKey", publicName: "labelKey", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, isIframe: { classPropertyName: "isIframe", publicName: "isIframe", isSignal: true, isRequired: true, transformFunction: null }, defaultAvatar: { classPropertyName: "defaultAvatar", publicName: "defaultAvatar", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { labelKey: "labelKeyChange", zIndex: "zIndexChange", isIframe: "isIframeChange", defaultAvatar: "defaultAvatarChange" }, viewQueries: [{ propertyName: "elementEl", first: true, predicate: ["elementRef"], descendants: true, isSignal: true }, { propertyName: "itemsEl", predicate: ["itemRef"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #elementRef\n class=\"libs-ui-mention-list\"\n [style.zIndex]=\"zIndex()\"\n [class.hidden]=\"hidden()\">\n @for (item of items(); track item) {\n
|
|
162
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsMentionListComponent, isStandalone: true, selector: "libs_ui-components-inputs-mention-list", inputs: { labelKey: { classPropertyName: "labelKey", publicName: "labelKey", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, isIframe: { classPropertyName: "isIframe", publicName: "isIframe", isSignal: true, isRequired: true, transformFunction: null }, defaultAvatar: { classPropertyName: "defaultAvatar", publicName: "defaultAvatar", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { labelKey: "labelKeyChange", zIndex: "zIndexChange", isIframe: "isIframeChange", defaultAvatar: "defaultAvatarChange" }, viewQueries: [{ propertyName: "elementEl", first: true, predicate: ["elementRef"], descendants: true, isSignal: true }, { propertyName: "contentEl", first: true, predicate: ["contentRef"], descendants: true, isSignal: true }, { propertyName: "itemsEl", predicate: ["itemRef"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Kh\u1ED1i ngo\u00E0i gi\u1EEF vai tr\u00F2 \u0111\u1ECBnh v\u1ECB (absolute theo caret) \u2014 v\u00F9ng cu\u1ED9n t\u00E1ch v\u00E0o content b\u00EAn trong \u0111\u1EC3\n scroll-overlay directive wrap content m\u00E0 kh\u00F4ng ph\u00E1 containing block c\u1EE7a positionElement(). -->\n<div\n #elementRef\n class=\"libs-ui-mention-list\"\n [style.zIndex]=\"zIndex()\"\n [class.hidden]=\"hidden()\">\n <div\n #contentRef\n class=\"libs-ui-mention-list-content\"\n LibsUiComponentsScrollOverlayDirective>\n @for (item of items(); track item) {\n <div\n #itemRef\n class=\"libs-ui-mention-list-item\"\n [class.libs-ui-mention-list-item-active]=\"$index === activeIndex()\"\n (mousedown)=\"handlerClick($event, $index)\"\n (mouseenter)=\"handleActiveItem($event, $index)\">\n @if (listTemplate()) {\n <ng-container\n [ngTemplateOutlet]=\"listTemplate()\"\n [ngTemplateOutletContext]=\"{ item: item, index: $index }\"></ng-container>\n } @else {\n <div class=\"px-[12px] py-[6px] flex items-center\">\n <libs_ui-components-avatar\n [size]=\"24\"\n [linkAvatar]=\"item.avatar\"\n [linkAvatarError]=\"defaultAvatar()\"\n [getLastTextAfterSpace]=\"true\"\n [textAvatar]=\"item.name\"\n [idGenColor]=\"item.id\" />\n <libs_ui-components-popover\n [classInclude]=\"'libs-ui-font-h5r'\"\n [type]=\"'text'\"\n [ignoreShowPopover]=\"true\"\n [config]=\"{ width: 250 }\">\n <!-- // ta.m \u1EA9n show tooltip v\u00EC ch\u01B0a x\u1EED l\u00FD \u0111c v\u1ECB tr\u00ED -->\n {{ item.name + ' (' + item.username + ')' }}\n </libs_ui-components-popover>\n </div>\n }\n </div>\n }\n </div>\n</div>\n", styles: [".libs-ui-mention-list{position:absolute;top:-999px;left:-9999px;z-index:1202;float:left;width:315px;padding:4px 0;background-color:#fff;border:solid 1px #e6e8ed;border-radius:5px;box-shadow:0 2px 10px 1px #3333331a}.libs-ui-mention-list .libs-ui-mention-list-content{max-height:180px}.libs-ui-mention-list .libs-ui-mention-list-item{background:#fff;cursor:pointer}.libs-ui-mention-list .libs-ui-mention-list-item:hover,.libs-ui-mention-list .libs-ui-mention-list-item-active{background-color:var(--libs-ui-color-light-3, #f4f8ff)}\n"], dependencies: [{ kind: "component", type: LibsUiComponentsAvatarComponent, selector: "libs_ui-components-avatar", inputs: ["typeShape", "classInclude", "size", "linkAvatar", "linkAvatarError", "classImageInclude", "zIndexPreviewImage", "clickPreviewImage", "idGenColor", "getLastTextAfterSpace", "textAvatar", "textAvatarClassInclude", "containerTextAvatarClassInclude"], outputs: ["outAvatarError", "outEventPreviewImage"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
160
163
|
}
|
|
161
164
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsMentionListComponent, decorators: [{
|
|
162
165
|
type: Component,
|
|
163
|
-
args: [{ selector: 'libs_ui-components-inputs-mention-list', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [LibsUiComponentsAvatarComponent, LibsUiComponentsPopoverComponent, NgTemplateOutlet], template: "<div\n #elementRef\n class=\"libs-ui-mention-list\"\n [style.zIndex]=\"zIndex()\"\n [class.hidden]=\"hidden()\">\n @for (item of items(); track item) {\n
|
|
166
|
+
args: [{ selector: 'libs_ui-components-inputs-mention-list', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [LibsUiComponentsAvatarComponent, LibsUiComponentsPopoverComponent, NgTemplateOutlet, LibsUiComponentsScrollOverlayDirective], template: "<!-- Kh\u1ED1i ngo\u00E0i gi\u1EEF vai tr\u00F2 \u0111\u1ECBnh v\u1ECB (absolute theo caret) \u2014 v\u00F9ng cu\u1ED9n t\u00E1ch v\u00E0o content b\u00EAn trong \u0111\u1EC3\n scroll-overlay directive wrap content m\u00E0 kh\u00F4ng ph\u00E1 containing block c\u1EE7a positionElement(). -->\n<div\n #elementRef\n class=\"libs-ui-mention-list\"\n [style.zIndex]=\"zIndex()\"\n [class.hidden]=\"hidden()\">\n <div\n #contentRef\n class=\"libs-ui-mention-list-content\"\n LibsUiComponentsScrollOverlayDirective>\n @for (item of items(); track item) {\n <div\n #itemRef\n class=\"libs-ui-mention-list-item\"\n [class.libs-ui-mention-list-item-active]=\"$index === activeIndex()\"\n (mousedown)=\"handlerClick($event, $index)\"\n (mouseenter)=\"handleActiveItem($event, $index)\">\n @if (listTemplate()) {\n <ng-container\n [ngTemplateOutlet]=\"listTemplate()\"\n [ngTemplateOutletContext]=\"{ item: item, index: $index }\"></ng-container>\n } @else {\n <div class=\"px-[12px] py-[6px] flex items-center\">\n <libs_ui-components-avatar\n [size]=\"24\"\n [linkAvatar]=\"item.avatar\"\n [linkAvatarError]=\"defaultAvatar()\"\n [getLastTextAfterSpace]=\"true\"\n [textAvatar]=\"item.name\"\n [idGenColor]=\"item.id\" />\n <libs_ui-components-popover\n [classInclude]=\"'libs-ui-font-h5r'\"\n [type]=\"'text'\"\n [ignoreShowPopover]=\"true\"\n [config]=\"{ width: 250 }\">\n <!-- // ta.m \u1EA9n show tooltip v\u00EC ch\u01B0a x\u1EED l\u00FD \u0111c v\u1ECB tr\u00ED -->\n {{ item.name + ' (' + item.username + ')' }}\n </libs_ui-components-popover>\n </div>\n }\n </div>\n }\n </div>\n</div>\n", styles: [".libs-ui-mention-list{position:absolute;top:-999px;left:-9999px;z-index:1202;float:left;width:315px;padding:4px 0;background-color:#fff;border:solid 1px #e6e8ed;border-radius:5px;box-shadow:0 2px 10px 1px #3333331a}.libs-ui-mention-list .libs-ui-mention-list-content{max-height:180px}.libs-ui-mention-list .libs-ui-mention-list-item{background:#fff;cursor:pointer}.libs-ui-mention-list .libs-ui-mention-list-item:hover,.libs-ui-mention-list .libs-ui-mention-list-item-active{background-color:var(--libs-ui-color-light-3, #f4f8ff)}\n"] }]
|
|
164
167
|
}] });
|
|
165
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL21lbnRpb24vc3JjL2xpc3QvbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL21lbnRpb24vc3JjL2xpc3QvbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBcUIsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUksT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0UsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0UsT0FBTyxFQUFFLEdBQUcsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFXbEcsTUFBTSxPQUFPLDBDQUEwQztJQUNyRCxtQkFBbUI7SUFDWixLQUFLLEdBQUcsTUFBTSxDQUE0QyxFQUFFLENBQUMsQ0FBQztJQUM5RCxXQUFXLEdBQUcsTUFBTSxDQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDaEMsUUFBUSxHQUFHLE1BQU0sQ0FBVSxLQUFLLENB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IjpbImltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgbW9kZWwsIE9uRGVzdHJveSwgT25Jbml0LCBzaWduYWwsIHZpZXdDaGlsZCwgdmlld0NoaWxkcmVuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQXZhdGFyQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1hdmF0YXInO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgc2V0LCBVdGlsc0tleUNvZGVDb25zdGFudCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IGZyb21FdmVudCwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBnZXRDYXJldENvb3JkaW5hdGVzIH0gZnJvbSAnLi4vZGVmaW5lcy9jYXJldC1jb29yZHMuZGVmaW5lJztcbmltcG9ydCB7IGdldENvbnRlbnRFZGl0YWJsZUNhcmV0Q29vcmRzLCBpc0lucHV0T3JUZXh0QXJlYUVsZW1lbnQgfSBmcm9tICcuLi9kZWZpbmVzL3V0aWxzLmRlZmluZSc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtbWVudGlvbi1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9saXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbTGlic1VpQ29tcG9uZW50c0F2YXRhckNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIE5nVGVtcGxhdGVPdXRsZXRdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkxpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHVibGljIGl0ZW1zID0gc2lnbmFsPEFycmF5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+PihbXSk7XG4gIHB1YmxpYyBhY3RpdmVJbmRleCA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwdWJsaWMgaGlkZGVuID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIHN0eWxlT2ZmID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIHBhcmVudEhhbmRsZXJLZXlEb3duID0gc2lnbmFsPCgoZTogRXZlbnQsIGVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQgfCB1bmRlZmluZWQpID0+IHVua25vd24pIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHByb3RlY3RlZCBkcm9wVXAgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29vcmRzID0gc2lnbmFsPHsgdG9wOiBudW1iZXI7IGxlZnQ6IG51bWJlcjsgYm90dG9tPzogbnVtYmVyIH0+KHsgdG9wOiAwLCBsZWZ0OiAwLCBib3R0b206IDAgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2Zmc2V0ID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmF0aXZlUGFyZW50RWxlbWVudCA9IHNpZ25hbDxIVE1MSW5wdXRFbGVtZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gI3JlZ2lvbiBJTlBVVFxuICBsYWJlbEtleSA9IG1vZGVsPHN0cmluZz4oJ2xhYmVsJyk7XG4gIHpJbmRleCA9IG1vZGVsPG51bWJlcj4oMTAwMCk7XG4gIGlzSWZyYW1lID0gbW9kZWwucmVxdWlyZWQ8Ym9vbGVhbj4oKTtcbiAgZGVmYXVsdEF2YXRhciA9IG1vZGVsPHN0cmluZz4oKTtcbiAgbGlzdFRlbXBsYXRlID0gc2lnbmFsPGFueT4odW5kZWZpbmVkKTtcblxuICAvKiBWSUVXIENISUxEICovXG4gIHJlYWRvbmx5IGVsZW1lbnRFbCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignZWxlbWVudFJlZicpO1xuICByZWFkb25seSBpdGVtc0VsID0gdmlld0NoaWxkcmVuPEVsZW1lbnRSZWY+KCdpdGVtUmVmJyk7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuaXNJZnJhbWUoKSkge1xuICAgICAgdGhpcy5pbml0RXZlbnQod2luZG93LnBhcmVudCwgJ3doZWVsJyk7XG4gICAgICB0aGlzLmluaXRFdmVudCh3aW5kb3cucGFyZW50LCAncmVzaXplJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaW5pdEV2ZW50KHdpbmRvdywgJ3doZWVsJyk7XG4gICAgdGhpcy5pbml0RXZlbnQod2luZG93LCAncmVzaXplJyk7XG4gIH1cblxuICAvKiBGVU5DVElPTlMgKi9cbiAgcHJpdmF0ZSBpbml0RXZlbnQoZWxlbWVudDogV2luZG93LCBldmVudE5hbWU6IHN0cmluZykge1xuICAgIGZyb21FdmVudDxFdmVudD4oZWxlbWVudCwgZXZlbnROYW1lKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95KSlcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnROYW1lID09PSAncmVzaXplJyB8fCAhdGhpcy5lbGVtZW50RWwoKT8ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVyTGlzdGVuQ2xvc2UoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlckxpc3RlbkNsb3NlKGV2ZW50OiBFdmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgIT09IHRoaXMuZWxlbWVudEVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuaGlkZGVuLnNldCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvLyBsb3RzIG9mIGNvbmZ1c2lvbiBoZXJlIGJldHdlZW4gcmVsYXRpdmUgY29vcmRpbmF0ZXMgYW5kIGNvbnRhaW5lcnNcbiAgcG9zaXRpb24obmF0aXZlUGFyZW50RWxlbWVudDogSFRNTElucHV0RWxlbWVudCwgaWZyYW1lPzogSFRNTElGcmFtZUVsZW1lbnQsIGxlZnREaXY/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5hdGl2ZVBhcmVudEVsZW1lbnQuc2V0KG5hdGl2ZVBhcmVudEVsZW1lbnQpO1xuICAgIGlmIChpc0lucHV0T3JUZXh0QXJlYUVsZW1lbnQobmF0aXZlUGFyZW50RWxlbWVudCkpIHtcbiAgICAgIC8vIHBhcmVudCBlbGVtZW50cyBuZWVkIHRvIGhhdmUgcG9zdGl0aW9uOnJlbGF0aXZlIGZvciB0aGlzIHRvIHdvcmsgY29ycmVjdGx5P1xuICAgICAgdGhpcy5jb29yZHMuc2V0KGdldENhcmV0Q29vcmRpbmF0ZXMobmF0aXZlUGFyZW50RWxlbWVudCwgbmF0aXZlUGFyZW50RWxlbWVudC5zZWxlY3Rpb25TdGFydCkpO1xuICAgICAgdGhpcy5jb29yZHMudXBkYXRlKChpdGVtKSA9PiAoe1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICB0b3A6IG5hdGl2ZVBhcmVudEVsZW1lbnQub2Zmc2V0VG9wICsgaXRlbS50b3AgLSBuYXRpdmVQYXJlbnRFbGVtZW50LnNjcm9sbFRvcCxcbiAgICAgICAgbGVmdDogbmF0aXZlUGFyZW50RWxlbWVudC5vZmZzZXRMZWZ0ICsgaXRlbS5sZWZ0IC0gbmF0aXZlUGFyZW50RWxlbWVudC5zY3JvbGxMZWZ0ICsgbmF0aXZlUGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LFxuICAgICAgfSkpO1xuXG4gICAgICAvLyBnZXRDcmV0Q29vcmRpbmF0ZXMoKSBmb3IgdGV4dC9pbnB1dCBlbGVtZW50cyBuZWVkcyBhbiBhZGRpdGlvbmFsIG9mZnNldCB0byBwb3NpdGlvbiB0aGUgbGlzdCBjb3JyZWN0bHlcbiAgICAgIHRoaXMub2Zmc2V0LnNldCh0aGlzLmdldEJsb2NrQ3Vyc29yRGltZW5zaW9ucyhuYXRpdmVQYXJlbnRFbGVtZW50KS5oZWlnaHQpO1xuICAgICAgdGhpcy5wb3NpdGlvbkVsZW1lbnQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlmcmFtZSkge1xuICAgICAgY29uc3QgY29udGV4dDogeyBpZnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50OyBwYXJlbnQ6IEVsZW1lbnQgfCBudWxsOyB3aW5kb3dQYXJlbnQ/OiBib29sZWFuIH0gPSB7IGlmcmFtZTogaWZyYW1lLCBwYXJlbnQ6IHdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuYm9keSwgd2luZG93UGFyZW50OiB0cnVlIH07XG4gICAgICBjb25zdCBjYXJldFJlbGF0aXZlVG9WaWV3ID0gZ2V0Q29udGVudEVkaXRhYmxlQ2FyZXRDb29yZHMoY29udGV4dCk7XG4gICAgICBjb25zdCBkb2MgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gKHdpbmRvdy5zY3JvbGxYIHx8IGRvYy5zY3JvbGxMZWZ0KSAtIChkb2MuY2xpZW50TGVmdCB8fCAwKTtcbiAgICAgIHRoaXMuY29vcmRzLnVwZGF0ZSgoaXRlbSkgPT4gKHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgbGVmdDogY2FyZXRSZWxhdGl2ZVRvVmlldy5sZWZ0IC0gc2Nyb2xsTGVmdCAtIChsZWZ0RGl2IHx8IDApLFxuICAgICAgICBib3R0b206IHdpbmRvdy5wYXJlbnQuaW5uZXJIZWlnaHQgLSBjYXJldFJlbGF0aXZlVG9WaWV3LnRvcCArIDE4LFxuICAgICAgfSkpO1xuICAgICAgaWYgKGNhcmV0UmVsYXRpdmVUb1ZpZXcuYm90dG9tICYmIGNhcmV0UmVsYXRpdmVUb1ZpZXcuYm90dG9tICE9PSAtMSkge1xuICAgICAgICB0aGlzLmNvb3Jkcy51cGRhdGUoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBib3R0b206IGNhcmV0UmVsYXRpdmVUb1ZpZXcuYm90dG9tLFxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICB0aGlzLnBvc2l0aW9uRWxlbWVudCgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRvYyA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICBjb25zdCBzY3JvbGxMZWZ0ID0gKHdpbmRvdy5zY3JvbGxYIHx8IGRvYy5zY3JvbGxMZWZ0KSAtIChkb2MuY2xpZW50TGVmdCB8fCAwKTtcbiAgICBjb25zdCBzY3JvbGxUb3AgPSAod2luZG93LnNjcm9sbFggfHwgZG9jLnNjcm9sbFRvcCkgLSAoZG9jLmNsaWVudFRvcCB8fCAwKTtcbiAgICAvLyBib3VuZGluZyByZWN0YW5nbGVzIGFyZSByZWxhdGl2ZSB0byB2aWV3LCBvZmZzZXRzIGFyZSByZWxhdGl2ZSB0byBjb250YWluZXI/XG4gICAgY29uc3QgY2FyZXRSZWxhdGl2ZVRvVmlldyA9IGdldENvbnRlbnRFZGl0YWJsZUNhcmV0Q29vcmRzKHsgaWZyYW1lLCBwYXJlbnQ6IG51bGwgfSk7XG5cbiAgICB0aGlzLmNvb3Jkcy51cGRhdGUoKGl0ZW0pID0+ICh7XG4gICAgICAuLi5pdGVtLFxuICAgICAgdG9wOiBjYXJldFJlbGF0aXZlVG9WaWV3LnRvcCAtIHNjcm9sbFRvcCArIDEwLFxuICAgICAgbGVmdDogY2FyZXRSZWxhdGl2ZVRvVmlldy5sZWZ0IC0gc2Nyb2xsTGVmdCAtIChsZWZ0RGl2IHx8IDApLFxuICAgICAgYm90dG9tOiBjYXJldFJlbGF0aXZlVG9WaWV3LmJvdHRvbSxcbiAgICB9KSk7XG4gICAgdGhpcy5wb3NpdGlvbkVsZW1lbnQoKTtcbiAgfVxuXG4gIGdldCBBY3RpdmVJdGVtKCkge1xuICAgIHJldHVybiB0aGlzLml0ZW1zKClbdGhpcy5hY3RpdmVJbmRleCgpXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xpY2soZXZlbnQ6IEV2ZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5hY3RpdmVJbmRleC5zZXQoaW5kZXgpO1xuICAgIHNldChldmVudCBhcyBLZXlib2FyZEV2ZW50LCAna2V5Q29kZScsIFV0aWxzS2V5Q29kZUNvbnN0YW50LkVOVEVSKTtcbiAgICB0aGlzLnBhcmVudEhhbmRsZXJLZXlEb3duKCk/LihldmVudCwgdGhpcy5uYXRpdmVQYXJlbnRFbGVtZW50KCkpO1xuICB9XG5cbiAgYWN0aXZhdGVOZXh0SXRlbSgpIHtcbiAgICB0aGlzLmFjdGl2ZUluZGV4LnNldCh0aGlzLml0ZW1zKCkubGVuZ3RoIC0gMSA+IHRoaXMuYWN0aXZlSW5kZXgoKSA/IHRoaXMuYWN0aXZlSW5kZXgoKSArIDEgOiB0aGlzLmFjdGl2ZUluZGV4KCkpO1xuICAgIHRoaXMuc2Nyb2xsVG9BY3RpdmUoKTtcbiAgfVxuXG4gIGFjdGl2YXRlUHJldmlvdXNJdGVtKCkge1xuICAgIHRoaXMuYWN0aXZlSW5kZXguc2V0KHRoaXMuYWN0aXZlSW5kZXgoKSA+IDAgPyB0aGlzLmFjdGl2ZUluZGV4KCkgLSAxIDogdGhpcy5hY3RpdmVJbmRleCgpKTtcbiAgICB0aGlzLnNjcm9sbFRvQWN0aXZlKCk7XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uRWxlbWVudChsZWZ0OiBudW1iZXIgPSB0aGlzLmNvb3JkcygpLmxlZnQsIHRvcDogbnVtYmVyID0gdGhpcy5jb29yZHMoKS50b3AsIGRyb3BVcDogYm9vbGVhbiA9IHRoaXMuZHJvcFVwKCksIGJvdHRvbTogbnVtYmVyID0gdGhpcy5jb29yZHMoKS5ib3R0b20gfHwgMCkge1xuICAgIGNvbnN0IGVsID0gdGhpcy5lbGVtZW50RWwoKT8ubmF0aXZlRWxlbWVudDtcblxuICAgIHRvcCArPSBkcm9wVXAgPyAwIDogdGhpcy5vZmZzZXQoKTsgLy8gdG9wIG9mIGxpc3QgaXMgbmV4dCBsaW5lXG4gICAgZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGVsLnN0eWxlLmxlZnQgPSBsZWZ0ICsgJ3B4JztcbiAgICBlbC5zdHlsZS50b3AgPSBib3R0b20gIT09IC0xID8gJ2F1dG8nIDogdG9wICsgJ3B4JztcbiAgICBlbC5zdHlsZS5ib3R0b20gPSBib3R0b20gPT09IC0xID8gJ2F1dG8nIDogYm90dG9tICsgJ3B4JztcbiAgICB0aGlzLm5hdGl2ZVBhcmVudEVsZW1lbnQoKT8ubm9ybWFsaXplKCk7XG4gIH1cblxuICBwcml2YXRlIGdldEJsb2NrQ3Vyc29yRGltZW5zaW9ucyhuYXRpdmVQYXJlbnRFbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgY29uc3QgcGFyZW50U3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobmF0aXZlUGFyZW50RWxlbWVudCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaGVpZ2h0OiBwYXJzZUZsb2F0KHBhcmVudFN0eWxlcy5saW5lSGVpZ2h0KSxcbiAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KHBhcmVudFN0eWxlcy5mb250U2l6ZSksXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVBY3RpdmVJdGVtKGV2ZW50OiBFdmVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuYWN0aXZlSW5kZXguc2V0KGluZGV4KTtcbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsVG9BY3RpdmUoKSB7XG4gICAgaWYgKCF0aGlzLml0ZW1zRWwoKSB8fCB0aGlzLml0ZW1zRWwoKS5sZW5ndGggPD0gdGhpcy5hY3RpdmVJbmRleCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXRlbXNFbCgpW3RoaXMuYWN0aXZlSW5kZXgoKV0ubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldygpO1xuICB9XG5cbiAgc2Nyb2xsQ29udGVudCgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRFbCgpO1xuICAgICAgaWYgKGVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IDA7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPGRpdlxuICAjZWxlbWVudFJlZlxuICBjbGFzcz1cImxpYnMtdWktbWVudGlvbi1saXN0XCJcbiAgW3N0eWxlLnpJbmRleF09XCJ6SW5kZXgoKVwiXG4gIFtjbGFzcy5oaWRkZW5dPVwiaGlkZGVuKClcIj5cbiAgQGZvciAoaXRlbSBvZiBpdGVtcygpOyB0cmFjayBpdGVtKSB7XG4gICAgPGRpdlxuICAgICAgI2l0ZW1SZWZcbiAgICAgIGNsYXNzPVwibGlicy11aS1tZW50aW9uLWxpc3QtaXRlbVwiXG4gICAgICBbY2xhc3MubGlicy11aS1tZW50aW9uLWxpc3QtaXRlbS1hY3RpdmVdPVwiJGluZGV4ID09PSBhY3RpdmVJbmRleCgpXCJcbiAgICAgIChtb3VzZWRvd24pPVwiaGFuZGxlckNsaWNrKCRldmVudCwgJGluZGV4KVwiXG4gICAgICAobW91c2VlbnRlcik9XCJoYW5kbGVBY3RpdmVJdGVtKCRldmVudCwgJGluZGV4KVwiPlxuICAgICAgQGlmIChsaXN0VGVtcGxhdGUoKSkge1xuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibGlzdFRlbXBsYXRlKClcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGl0ZW06IGl0ZW0sIGluZGV4OiAkaW5kZXggfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJweC1bMTJweF0gcHktWzZweF0gZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWF2YXRhclxuICAgICAgICAgICAgW3NpemVdPVwiMjRcIlxuICAgICAgICAgICAgW2xpbmtBdmF0YXJdPVwiaXRlbS5hdmF0YXJcIlxuICAgICAgICAgICAgW2xpbmtBdmF0YXJFcnJvcl09XCJkZWZhdWx0QXZhdGFyKClcIlxuICAgICAgICAgICAgW2dldExhc3RUZXh0QWZ0ZXJTcGFjZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFt0ZXh0QXZhdGFyXT1cIml0ZW0ubmFtZVwiXG4gICAgICAgICAgICBbaWRHZW5Db2xvcl09XCJpdGVtLmlkXCIgLz5cbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ2xpYnMtdWktZm9udC1oNXInXCJcbiAgICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICBbaWdub3JlU2hvd1BvcG92ZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cInsgd2lkdGg6IDI1MCB9XCI+XG4gICAgICAgICAgICA8IS0tIC8vIHRhLm0g4bqpbiBzaG93IHRvb2x0aXAgdsOsIGNoxrBhIHjhu60gbMO9IMSRYyB24buLIHRyw60gLS0+XG4gICAgICAgICAgICB7eyBpdGVtLm5hbWUgKyAnICgnICsgaXRlbS51c2VybmFtZSArICcpJyB9fVxuICAgICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLXBvcG92ZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cbiJdfQ==
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL21lbnRpb24vc3JjL2xpc3QvbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL21lbnRpb24vc3JjL2xpc3QvbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBcUIsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUksT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0UsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0UsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFFLEdBQUcsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFXbEcsTUFBTSxPQUFPLDBDQUEwQztJQUNyRCxtQkFBbUI7SUFDWixLQUFLLEdBQUcsTUFBTSxDQUE0QyxFQUFFLENBQUMsQ0FBQztJQUM5RCxXQUFXLEdBQUcsTUFBTSxDQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sR0FBRyxNQUFNLENBQVUsS0FB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UzsrQkFFRSx3Q0FBd0MsY0FHdEMsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDLENBQUMsK0JBQStCLEVBQUUsZ0NBQWdDLEVBQUUsZ0JBQWdCLEVBQUUsc0NBQXNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIG1vZGVsLCBPbkRlc3Ryb3ksIE9uSW5pdCwgc2lnbmFsLCB2aWV3Q2hpbGQsIHZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0F2YXRhckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYXZhdGFyJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zY3JvbGwtb3ZlcmxheSc7XG5pbXBvcnQgeyBzZXQsIFV0aWxzS2V5Q29kZUNvbnN0YW50IH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGdldENhcmV0Q29vcmRpbmF0ZXMgfSBmcm9tICcuLi9kZWZpbmVzL2NhcmV0LWNvb3Jkcy5kZWZpbmUnO1xuaW1wb3J0IHsgZ2V0Q29udGVudEVkaXRhYmxlQ2FyZXRDb29yZHMsIGlzSW5wdXRPclRleHRBcmVhRWxlbWVudCB9IGZyb20gJy4uL2RlZmluZXMvdXRpbHMuZGVmaW5lJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWlucHV0cy1tZW50aW9uLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2xpc3QuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtMaWJzVWlDb21wb25lbnRzQXZhdGFyQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgTmdUZW1wbGF0ZU91dGxldCwgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmVdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkxpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHVibGljIGl0ZW1zID0gc2lnbmFsPEFycmF5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+PihbXSk7XG4gIHB1YmxpYyBhY3RpdmVJbmRleCA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwdWJsaWMgaGlkZGVuID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIHN0eWxlT2ZmID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIHBhcmVudEhhbmRsZXJLZXlEb3duID0gc2lnbmFsPCgoZTogRXZlbnQsIGVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQgfCB1bmRlZmluZWQpID0+IHVua25vd24pIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHByb3RlY3RlZCBkcm9wVXAgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29vcmRzID0gc2lnbmFsPHsgdG9wOiBudW1iZXI7IGxlZnQ6IG51bWJlcjsgYm90dG9tPzogbnVtYmVyIH0+KHsgdG9wOiAwLCBsZWZ0OiAwLCBib3R0b206IDAgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2Zmc2V0ID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmF0aXZlUGFyZW50RWxlbWVudCA9IHNpZ25hbDxIVE1MSW5wdXRFbGVtZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gI3JlZ2lvbiBJTlBVVFxuICBsYWJlbEtleSA9IG1vZGVsPHN0cmluZz4oJ2xhYmVsJyk7XG4gIHpJbmRleCA9IG1vZGVsPG51bWJlcj4oMTAwMCk7XG4gIGlzSWZyYW1lID0gbW9kZWwucmVxdWlyZWQ8Ym9vbGVhbj4oKTtcbiAgZGVmYXVsdEF2YXRhciA9IG1vZGVsPHN0cmluZz4oKTtcbiAgbGlzdFRlbXBsYXRlID0gc2lnbmFsPGFueT4odW5kZWZpbmVkKTtcblxuICAvKiBWSUVXIENISUxEICovXG4gIHJlYWRvbmx5IGVsZW1lbnRFbCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignZWxlbWVudFJlZicpO1xuICAvLyBWw7luZyBjdeG7mW4gdGjhu7FjIHThur8gKHNjcm9sbC1vdmVybGF5KSDigJQgZWxlbWVudEVsIGNo4buJIGPDsm4gdmFpIHRyw7IgxJHhu4tuaCB24buLL2todW5nLlxuICByZWFkb25seSBjb250ZW50RWwgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2NvbnRlbnRSZWYnKTtcbiAgcmVhZG9ubHkgaXRlbXNFbCA9IHZpZXdDaGlsZHJlbjxFbGVtZW50UmVmPignaXRlbVJlZicpO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLmlzSWZyYW1lKCkpIHtcbiAgICAgIHRoaXMuaW5pdEV2ZW50KHdpbmRvdy5wYXJlbnQsICd3aGVlbCcpO1xuICAgICAgdGhpcy5pbml0RXZlbnQod2luZG93LnBhcmVudCwgJ3Jlc2l6ZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmluaXRFdmVudCh3aW5kb3csICd3aGVlbCcpO1xuICAgIHRoaXMuaW5pdEV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpO1xuICB9XG5cbiAgLyogRlVOQ1RJT05TICovXG4gIHByaXZhdGUgaW5pdEV2ZW50KGVsZW1lbnQ6IFdpbmRvdywgZXZlbnROYW1lOiBzdHJpbmcpIHtcbiAgICBmcm9tRXZlbnQ8RXZlbnQ+KGVsZW1lbnQsIGV2ZW50TmFtZSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gJ3Jlc2l6ZScgfHwgIXRoaXMuZWxlbWVudEVsKCk/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlckxpc3RlbkNsb3NlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZXJMaXN0ZW5DbG9zZShldmVudDogRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSB0aGlzLmVsZW1lbnRFbCgpPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICB0aGlzLmhpZGRlbi5zZXQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gbG90cyBvZiBjb25mdXNpb24gaGVyZSBiZXR3ZWVuIHJlbGF0aXZlIGNvb3JkaW5hdGVzIGFuZCBjb250YWluZXJzXG4gIHBvc2l0aW9uKG5hdGl2ZVBhcmVudEVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQsIGlmcmFtZT86IEhUTUxJRnJhbWVFbGVtZW50LCBsZWZ0RGl2PzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uYXRpdmVQYXJlbnRFbGVtZW50LnNldChuYXRpdmVQYXJlbnRFbGVtZW50KTtcbiAgICBpZiAoaXNJbnB1dE9yVGV4dEFyZWFFbGVtZW50KG5hdGl2ZVBhcmVudEVsZW1lbnQpKSB7XG4gICAgICAvLyBwYXJlbnQgZWxlbWVudHMgbmVlZCB0byBoYXZlIHBvc3RpdGlvbjpyZWxhdGl2ZSBmb3IgdGhpcyB0byB3b3JrIGNvcnJlY3RseT9cbiAgICAgIHRoaXMuY29vcmRzLnNldChnZXRDYXJldENvb3JkaW5hdGVzKG5hdGl2ZVBhcmVudEVsZW1lbnQsIG5hdGl2ZVBhcmVudEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQpKTtcbiAgICAgIHRoaXMuY29vcmRzLnVwZGF0ZSgoaXRlbSkgPT4gKHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgdG9wOiBuYXRpdmVQYXJlbnRFbGVtZW50Lm9mZnNldFRvcCArIGl0ZW0udG9wIC0gbmF0aXZlUGFyZW50RWxlbWVudC5zY3JvbGxUb3AsXG4gICAgICAgIGxlZnQ6IG5hdGl2ZVBhcmVudEVsZW1lbnQub2Zmc2V0TGVmdCArIGl0ZW0ubGVmdCAtIG5hdGl2ZVBhcmVudEVsZW1lbnQuc2Nyb2xsTGVmdCArIG5hdGl2ZVBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCxcbiAgICAgIH0pKTtcblxuICAgICAgLy8gZ2V0Q3JldENvb3JkaW5hdGVzKCkgZm9yIHRleHQvaW5wdXQgZWxlbWVudHMgbmVlZHMgYW4gYWRkaXRpb25hbCBvZmZzZXQgdG8gcG9zaXRpb24gdGhlIGxpc3QgY29ycmVjdGx5XG4gICAgICB0aGlzLm9mZnNldC5zZXQodGhpcy5nZXRCbG9ja0N1cnNvckRpbWVuc2lvbnMobmF0aXZlUGFyZW50RWxlbWVudCkuaGVpZ2h0KTtcbiAgICAgIHRoaXMucG9zaXRpb25FbGVtZW50KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpZnJhbWUpIHtcbiAgICAgIGNvbnN0IGNvbnRleHQ6IHsgaWZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudDsgcGFyZW50OiBFbGVtZW50IHwgbnVsbDsgd2luZG93UGFyZW50PzogYm9vbGVhbiB9ID0geyBpZnJhbWU6IGlmcmFtZSwgcGFyZW50OiB3aW5kb3cucGFyZW50LmRvY3VtZW50LmJvZHksIHdpbmRvd1BhcmVudDogdHJ1ZSB9O1xuICAgICAgY29uc3QgY2FyZXRSZWxhdGl2ZVRvVmlldyA9IGdldENvbnRlbnRFZGl0YWJsZUNhcmV0Q29vcmRzKGNvbnRleHQpO1xuICAgICAgY29uc3QgZG9jID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9ICh3aW5kb3cuc2Nyb2xsWCB8fCBkb2Muc2Nyb2xsTGVmdCkgLSAoZG9jLmNsaWVudExlZnQgfHwgMCk7XG4gICAgICB0aGlzLmNvb3Jkcy51cGRhdGUoKGl0ZW0pID0+ICh7XG4gICAgICAgIC4uLml0ZW0sXG4gICAgICAgIGxlZnQ6IGNhcmV0UmVsYXRpdmVUb1ZpZXcubGVmdCAtIHNjcm9sbExlZnQgLSAobGVmdERpdiB8fCAwKSxcbiAgICAgICAgYm90dG9tOiB3aW5kb3cucGFyZW50LmlubmVySGVpZ2h0IC0gY2FyZXRSZWxhdGl2ZVRvVmlldy50b3AgKyAxOCxcbiAgICAgIH0pKTtcbiAgICAgIGlmIChjYXJldFJlbGF0aXZlVG9WaWV3LmJvdHRvbSAmJiBjYXJldFJlbGF0aXZlVG9WaWV3LmJvdHRvbSAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5jb29yZHMudXBkYXRlKChpdGVtKSA9PiAoe1xuICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgYm90dG9tOiBjYXJldFJlbGF0aXZlVG9WaWV3LmJvdHRvbSxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgICAgdGhpcy5wb3NpdGlvbkVsZW1lbnQoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkb2MgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgY29uc3Qgc2Nyb2xsTGVmdCA9ICh3aW5kb3cuc2Nyb2xsWCB8fCBkb2Muc2Nyb2xsTGVmdCkgLSAoZG9jLmNsaWVudExlZnQgfHwgMCk7XG4gICAgY29uc3Qgc2Nyb2xsVG9wID0gKHdpbmRvdy5zY3JvbGxYIHx8IGRvYy5zY3JvbGxUb3ApIC0gKGRvYy5jbGllbnRUb3AgfHwgMCk7XG4gICAgLy8gYm91bmRpbmcgcmVjdGFuZ2xlcyBhcmUgcmVsYXRpdmUgdG8gdmlldywgb2Zmc2V0cyBhcmUgcmVsYXRpdmUgdG8gY29udGFpbmVyP1xuICAgIGNvbnN0IGNhcmV0UmVsYXRpdmVUb1ZpZXcgPSBnZXRDb250ZW50RWRpdGFibGVDYXJldENvb3Jkcyh7IGlmcmFtZSwgcGFyZW50OiBudWxsIH0pO1xuXG4gICAgdGhpcy5jb29yZHMudXBkYXRlKChpdGVtKSA9PiAoe1xuICAgICAgLi4uaXRlbSxcbiAgICAgIHRvcDogY2FyZXRSZWxhdGl2ZVRvVmlldy50b3AgLSBzY3JvbGxUb3AgKyAxMCxcbiAgICAgIGxlZnQ6IGNhcmV0UmVsYXRpdmVUb1ZpZXcubGVmdCAtIHNjcm9sbExlZnQgLSAobGVmdERpdiB8fCAwKSxcbiAgICAgIGJvdHRvbTogY2FyZXRSZWxhdGl2ZVRvVmlldy5ib3R0b20sXG4gICAgfSkpO1xuICAgIHRoaXMucG9zaXRpb25FbGVtZW50KCk7XG4gIH1cblxuICBnZXQgQWN0aXZlSXRlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcygpW3RoaXMuYWN0aXZlSW5kZXgoKV07XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNsaWNrKGV2ZW50OiBFdmVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuYWN0aXZlSW5kZXguc2V0KGluZGV4KTtcbiAgICBzZXQoZXZlbnQgYXMgS2V5Ym9hcmRFdmVudCwgJ2tleUNvZGUnLCBVdGlsc0tleUNvZGVDb25zdGFudC5FTlRFUik7XG4gICAgdGhpcy5wYXJlbnRIYW5kbGVyS2V5RG93bigpPy4oZXZlbnQsIHRoaXMubmF0aXZlUGFyZW50RWxlbWVudCgpKTtcbiAgfVxuXG4gIGFjdGl2YXRlTmV4dEl0ZW0oKSB7XG4gICAgdGhpcy5hY3RpdmVJbmRleC5zZXQodGhpcy5pdGVtcygpLmxlbmd0aCAtIDEgPiB0aGlzLmFjdGl2ZUluZGV4KCkgPyB0aGlzLmFjdGl2ZUluZGV4KCkgKyAxIDogdGhpcy5hY3RpdmVJbmRleCgpKTtcbiAgICB0aGlzLnNjcm9sbFRvQWN0aXZlKCk7XG4gIH1cblxuICBhY3RpdmF0ZVByZXZpb3VzSXRlbSgpIHtcbiAgICB0aGlzLmFjdGl2ZUluZGV4LnNldCh0aGlzLmFjdGl2ZUluZGV4KCkgPiAwID8gdGhpcy5hY3RpdmVJbmRleCgpIC0gMSA6IHRoaXMuYWN0aXZlSW5kZXgoKSk7XG4gICAgdGhpcy5zY3JvbGxUb0FjdGl2ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkVsZW1lbnQobGVmdDogbnVtYmVyID0gdGhpcy5jb29yZHMoKS5sZWZ0LCB0b3A6IG51bWJlciA9IHRoaXMuY29vcmRzKCkudG9wLCBkcm9wVXA6IGJvb2xlYW4gPSB0aGlzLmRyb3BVcCgpLCBib3R0b206IG51bWJlciA9IHRoaXMuY29vcmRzKCkuYm90dG9tIHx8IDApIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuZWxlbWVudEVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICB0b3AgKz0gZHJvcFVwID8gMCA6IHRoaXMub2Zmc2V0KCk7IC8vIHRvcCBvZiBsaXN0IGlzIG5leHQgbGluZVxuICAgIGVsLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBlbC5zdHlsZS5sZWZ0ID0gbGVmdCArICdweCc7XG4gICAgZWwuc3R5bGUudG9wID0gYm90dG9tICE9PSAtMSA/ICdhdXRvJyA6IHRvcCArICdweCc7XG4gICAgZWwuc3R5bGUuYm90dG9tID0gYm90dG9tID09PSAtMSA/ICdhdXRvJyA6IGJvdHRvbSArICdweCc7XG4gICAgdGhpcy5uYXRpdmVQYXJlbnRFbGVtZW50KCk/Lm5vcm1hbGl6ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCbG9ja0N1cnNvckRpbWVuc2lvbnMobmF0aXZlUGFyZW50RWxlbWVudDogSFRNTElucHV0RWxlbWVudCkge1xuICAgIGNvbnN0IHBhcmVudFN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5hdGl2ZVBhcmVudEVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChwYXJlbnRTdHlsZXMubGluZUhlaWdodCksXG4gICAgICB3aWR0aDogcGFyc2VGbG9hdChwYXJlbnRTdHlsZXMuZm9udFNpemUpLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlQWN0aXZlSXRlbShldmVudDogRXZlbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmFjdGl2ZUluZGV4LnNldChpbmRleCk7XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbFRvQWN0aXZlKCkge1xuICAgIGlmICghdGhpcy5pdGVtc0VsKCkgfHwgdGhpcy5pdGVtc0VsKCkubGVuZ3RoIDw9IHRoaXMuYWN0aXZlSW5kZXgoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLml0ZW1zRWwoKVt0aGlzLmFjdGl2ZUluZGV4KCldLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoKTtcbiAgfVxuXG4gIHNjcm9sbENvbnRlbnQoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5jb250ZW50RWwoKTtcbiAgICAgIGlmIChlbGVtZW50Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5vbkRlc3Ryb3kubmV4dCgpO1xuICAgIHRoaXMub25EZXN0cm95LmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIjwhLS0gS2jhu5FpIG5nb8OgaSBnaeG7ryB2YWkgdHLDsiDEkeG7i25oIHbhu4sgKGFic29sdXRlIHRoZW8gY2FyZXQpIOKAlCB2w7luZyBjdeG7mW4gdMOhY2ggdsOgbyBjb250ZW50IGLDqm4gdHJvbmcgxJHhu4NcbiAgICAgc2Nyb2xsLW92ZXJsYXkgZGlyZWN0aXZlIHdyYXAgY29udGVudCBtw6Aga2jDtG5nIHBow6EgY29udGFpbmluZyBibG9jayBj4bunYSBwb3NpdGlvbkVsZW1lbnQoKS4gLS0+XG48ZGl2XG4gICNlbGVtZW50UmVmXG4gIGNsYXNzPVwibGlicy11aS1tZW50aW9uLWxpc3RcIlxuICBbc3R5bGUuekluZGV4XT1cInpJbmRleCgpXCJcbiAgW2NsYXNzLmhpZGRlbl09XCJoaWRkZW4oKVwiPlxuICA8ZGl2XG4gICAgI2NvbnRlbnRSZWZcbiAgICBjbGFzcz1cImxpYnMtdWktbWVudGlvbi1saXN0LWNvbnRlbnRcIlxuICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlPlxuICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXMoKTsgdHJhY2sgaXRlbSkge1xuICAgICAgPGRpdlxuICAgICAgICAjaXRlbVJlZlxuICAgICAgICBjbGFzcz1cImxpYnMtdWktbWVudGlvbi1saXN0LWl0ZW1cIlxuICAgICAgICBbY2xhc3MubGlicy11aS1tZW50aW9uLWxpc3QtaXRlbS1hY3RpdmVdPVwiJGluZGV4ID09PSBhY3RpdmVJbmRleCgpXCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJoYW5kbGVyQ2xpY2soJGV2ZW50LCAkaW5kZXgpXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwiaGFuZGxlQWN0aXZlSXRlbSgkZXZlbnQsICRpbmRleClcIj5cbiAgICAgICAgQGlmIChsaXN0VGVtcGxhdGUoKSkge1xuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxpc3RUZW1wbGF0ZSgpXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGl0ZW06IGl0ZW0sIGluZGV4OiAkaW5kZXggfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtWzEycHhdIHB5LVs2cHhdIGZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWF2YXRhclxuICAgICAgICAgICAgICBbc2l6ZV09XCIyNFwiXG4gICAgICAgICAgICAgIFtsaW5rQXZhdGFyXT1cIml0ZW0uYXZhdGFyXCJcbiAgICAgICAgICAgICAgW2xpbmtBdmF0YXJFcnJvcl09XCJkZWZhdWx0QXZhdGFyKClcIlxuICAgICAgICAgICAgICBbZ2V0TGFzdFRleHRBZnRlclNwYWNlXT1cInRydWVcIlxuICAgICAgICAgICAgICBbdGV4dEF2YXRhcl09XCJpdGVtLm5hbWVcIlxuICAgICAgICAgICAgICBbaWRHZW5Db2xvcl09XCJpdGVtLmlkXCIgLz5cbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIidsaWJzLXVpLWZvbnQtaDVyJ1wiXG4gICAgICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJ7IHdpZHRoOiAyNTAgfVwiPlxuICAgICAgICAgICAgICA8IS0tIC8vIHRhLm0g4bqpbiBzaG93IHRvb2x0aXAgdsOsIGNoxrBhIHjhu60gbMO9IMSRYyB24buLIHRyw60gLS0+XG4gICAgICAgICAgICAgIHt7IGl0ZW0ubmFtZSArICcgKCcgKyBpdGVtLnVzZXJuYW1lICsgJyknIH19XG4gICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
@@ -484,7 +484,9 @@ export class LibsUiComponentsInputsMentionDirective {
|
|
|
484
484
|
}
|
|
485
485
|
}
|
|
486
486
|
else {
|
|
487
|
-
|
|
487
|
+
// Editor (quill2x): merge dữ liệu bổ sung từ config (vd chip pieces) vào data blot.
|
|
488
|
+
const extraData = activeConfig.mentionInsertData ? activeConfig.mentionInsertData(itemActive) : {};
|
|
489
|
+
this.outInsertMention.emit({ data: { ...extraData, id, value: text, feId }, lengthKey: pos - (this.startPos() || 0) });
|
|
488
490
|
}
|
|
489
491
|
}
|
|
490
492
|
ngOnDestroy() {
|
|
@@ -503,4 +505,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
503
505
|
standalone: true,
|
|
504
506
|
}]
|
|
505
507
|
}], ctorParameters: () => [] });
|
|
506
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudGlvbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL21lbnRpb24vc3JjL21lbnRpb24uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQStCLFNBQVMsRUFBRSxVQUFVLEVBQTBCLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdKLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRS9KLE9BQU8sRUFBRSwwQ0FBMEMsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQU9uRixNQUFNLE9BQU8sc0NBQXNDO0lBQ2pELG1CQUFtQjtJQUNGLGdCQUFnQixHQUFHLE1BQU0sQ0FBdUUsU0FBUyxDQUFDLENBQUM7SUFDM0csV0FBVyxHQUFHLE1BQU0sQ0FBbUIsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELFlBQVksR0FBRyxNQUFNLENBQTZCLFNBQVMsQ0FB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RSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzRyxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsQ0FBQzt3R0F0aEJVLHNDQUFzQzs0RkFBdEMsc0NBQXNDOzs0RkFBdEMsc0NBQXNDO2tCQUxsRCxTQUFTO21CQUFDO29CQUNULDhEQUE4RDtvQkFDOUQsUUFBUSxFQUFFLDBDQUEwQztvQkFDcEQsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50UmVmLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIE9uRGVzdHJveSwgVGVtcGxhdGVSZWYsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUV2ZW50LCBUWVBFX1RFTVBMQVRFX1JFRiB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuaW1wb3J0IHsgTGlic1VpRHluYW1pY0NvbXBvbmVudFNlcnZpY2UgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1keW5hbWljLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBVdGlsc0tleUNvZGVDb25zdGFudCwgZ2V0LCBpc05pbCwgdXVpZCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFN1YmplY3QsIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBERUZBVUxUX0NPTkZJRywgYnVpbGRUZW1wbGF0ZSB9IGZyb20gJy4vZGVmaW5lcy90ZW1wbGF0ZS5kZWZpbmUnO1xuaW1wb3J0IHsgZ2V0Q2FyZXRQb3NpdGlvbiwgZ2V0VGV4dEJlZm9yZUN1cnNvciwgZ2V0VmFsdWUsIGdldFdpbmRvd1NlbGVjdGlvbiwgaW5zZXJ0VGV4dEF0Q2FyZXQsIGluc2VydFZhbHVlLCBzZXRDYXJldFBvc2l0aW9uIH0gZnJvbSAnLi9kZWZpbmVzL3V0aWxzLmRlZmluZSc7XG5pbXBvcnQgeyBJTWVudGlvbkNvbmZpZywgSU1lbnRpb25GdW5jdGlvbkNvbnRyb2xFdmVudCwgSU1lbnRpb25JbnNlcnQsIElOb2RlSW5zZXJ0IH0gZnJvbSAnLi9pbnRlcmZhY2VzL21lbnRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNZW50aW9uTGlzdENvbXBvbmVudCB9IGZyb20gJy4vbGlzdC9saXN0LmNvbXBvbmVudCc7XG5cbkBEaXJlY3RpdmUoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1tMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkRpcmVjdGl2ZV0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkRpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJpdmF0ZSByZWFkb25seSBsaXN0Q29tcG9uZW50UmVmID0gc2lnbmFsPENvbXBvbmVudFJlZjxMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkxpc3RDb21wb25lbnQ+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IG5vZGVzSW5zZXJ0ID0gc2lnbmFsPFNldDxJTm9kZUluc2VydD4+KG5ldyBTZXQoKSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZlQ29uZmlnID0gc2lnbmFsPElNZW50aW9uQ29uZmlnIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyaWdnZXJDaGFycyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBJTWVudGlvbkNvbmZpZz4+KHt9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWFyY2hTdHJpbmcgPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhcnRQb3MgPSBzaWduYWw8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXJ0Tm9kZSA9IHNpZ25hbDxhbnk+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VhcmNoTGlzdCA9IHNpZ25hbDxMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkxpc3RDb21wb25lbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VhcmNoaW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpZnJhbWUgPSBzaWduYWw8YW55Pih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxhc3RLZXlDb2RlID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpc0VkaXRvciA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaWZyYW1lSWQgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnQgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgZHluYW1pY0NvbXBvbmVudFNlcnZpY2UgPSBpbmplY3QoTGlic1VpRHluYW1pY0NvbXBvbmVudFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gI3JlZ2lvbiBJTlBVVFxuICByZWFkb25seSB0aW1lRGVsYXlJbml0ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDAsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gMCB9KTtcbiAgcmVhZG9ubHkgbWVudGlvbkNvbmZpZyA9IGlucHV0PElNZW50aW9uQ29uZmlnPigpO1xuICByZWFkb25seSBtZW50aW9uTGlzdFRlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8VFlQRV9URU1QTEFURV9SRUY+PigpO1xuXG4gIC8vICNyZWdpb24gT1VUUFVUXG4gIHJlYWRvbmx5IG91dFNlYXJjaFRlcm0gPSBvdXRwdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBvdXRJdGVtU2VsZWN0ZWQgPSBvdXRwdXQ8dW5rbm93bj4oKTtcbiAgcmVhZG9ubHkgb3V0VG9nZ2xlID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dEluc2VydE1lbnRpb24gPSBvdXRwdXQ8SU1lbnRpb25JbnNlcnQ+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uQ29udHJvbCA9IG91dHB1dDxJTWVudGlvbkZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB0aGlzLm1lbnRpb25Db25maWcoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLnVwZGF0ZUNvbmZpZygpKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5tZW50aW9uQ29uZmlnKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgaXNDb250ZW50RWRpdGFibGUgPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpO1xuICAgICAgdGhpcy5pc0VkaXRvci5zZXQoIWlzQ29udGVudEVkaXRhYmxlKTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSAhdGhpcy5pc0VkaXRvcigpID8gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgOiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcucWwtZWRpdG9yW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nKTtcbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZXJLZXlkb3duLmJpbmQodGhpcykoZXZlbnQsIGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChldmVudDogSW5wdXRFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlcklucHV0LmJpbmQodGhpcykoZXZlbnQsIGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlckJsdXIuYmluZCh0aGlzKShldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlckZvY3VzLmJpbmQodGhpcykoZXZlbnQsIGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3V0RnVuY3Rpb25Db250cm9sLmVtaXQoe1xuICAgICAgICBhZGRNZW50aW9uOiAoKSA9PiB7XG4gICAgICAgICAgaW5zZXJ0VGV4dEF0Q2FyZXQoZWxlbWVudCwgYCR7dGhpcy5tZW50aW9uQ29uZmlnKCk/LnRyaWdnZXJDaGFyfWApO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVyS2V5ZG93bih7IGtleTogdGhpcy5tZW50aW9uQ29uZmlnKCk/LnRyaWdnZXJDaGFyLCBrZXlDb2RlOiBVdGlsc0tleUNvZGVDb25zdGFudC5CQUNLU1BBQ0UsIHNoaWZ0S2V5OiB0cnVlLCBpbnB1dEV2ZW50OiB0cnVlIH0sIGVsZW1lbnQpO1xuICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LCB0aGlzLnRpbWVEZWxheUluaXQoKSk7XG4gIH1cblxuICAvKiBGVU5DVElPTlMgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZUNvbmZpZygpIHtcbiAgICBjb25zdCBtZW50aW9uQ29uZmlnID0gdGhpcy5tZW50aW9uQ29uZmlnKCk7XG4gICAgaWYgKCFtZW50aW9uQ29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudHJpZ2dlckNoYXJzLnNldCh7fSk7XG4gICAgdGhpcy5hZGRDb25maWcobWVudGlvbkNvbmZpZyk7XG4gICAgaWYgKG1lbnRpb25Db25maWcubWVudGlvbikge1xuICAgICAgbWVudGlvbkNvbmZpZy5tZW50aW9uLmZvckVhY2goKGNvbmZpZykgPT4gdGhpcy5hZGRDb25maWcoY29uZmlnKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRDb25maWcoY29uZmlnOiBJTWVudGlvbkNvbmZpZykge1xuICAgIGNvbnN0IGRlZmF1bHRzID0geyAuLi5ERUZBVUxUX0NPTkZJRyB9O1xuICAgIGNvbnN0IGxhYmVsS2V5ID0gY29uZmlnLmxhYmVsS2V5IHx8ICdsYWJlbCc7XG4gICAgY29uZmlnID0gT2JqZWN0LmFzc2lnbihkZWZhdWx0cywgY29uZmlnKTtcbiAgICBpZiAoY29uZmlnLml0ZW1zICYmIGNvbmZpZy5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbmZpZy5pdGVtc1swXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uZmlnLml0ZW1zLmZvckVhY2goKGxhYmVsKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+PiA9IHt9O1xuICAgICAgICAgIG9iamVjdFtsYWJlbEtleV0gPSBsYWJlbDtcbiAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChsYWJlbEtleSkge1xuICAgICAgICAvLyByZW1vdmUgaXRlbXMgd2l0aG91dCBhbiBsYWJlbEtleSAoYXMgaXQncyByZXF1aXJlZCB0byBmaWx0ZXIgdGhlIGxpc3QpXG4gICAgICAgIGNvbmZpZy5pdGVtcyA9IGNvbmZpZy5pdGVtcy5maWx0ZXIoKGUpID0+IGVbbGFiZWxLZXldKTtcbiAgICAgICAgaWYgKCFjb25maWcuZGlzYWJsZVNvcnQpIHtcbiAgICAgICAgICBjb25maWcuaXRlbXMuc29ydCgoYSwgYikgPT4gKGFbbGFiZWxLZXldIHx8ICcnKS5sb2NhbGVDb21wYXJlKGJbbGFiZWxLZXldIHx8ICcnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy50cmlnZ2VyQ2hhcnMudXBkYXRlKChpdGVtKSA9PiAoe1xuICAgICAgLi4uaXRlbSxcbiAgICAgIFtjb25maWcudHJpZ2dlckNoYXIgfHwgJ0AnXTogY29uZmlnLFxuICAgIH0pKTtcbiAgICBpZiAodGhpcy5hY3RpdmVDb25maWcoKSAmJiB0aGlzLmFjdGl2ZUNvbmZpZygpPy50cmlnZ2VyQ2hhciA9PT0gY29uZmlnLnRyaWdnZXJDaGFyKSB7XG4gICAgICB0aGlzLmFjdGl2ZUNvbmZpZy5zZXQoY29uZmlnKTtcbiAgICAgIHRoaXMudXBkYXRlU2VhcmNoTGlzdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRJZnJhbWUoaWZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudCkge1xuICAgIHRoaXMuaWZyYW1lLnNldChpZnJhbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKGdldDx1bmtub3duPihldmVudCwgJ3dhc0NsaWNrJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQmx1cihldmVudDogRXZlbnQpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgIHRoaXMuc3RvcFNlYXJjaCgpO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlcklucHV0KGV2ZW50OiBJbnB1dEV2ZW50LCBuYXRpdmVFbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICBjb25zdCBkYXRhID0gZ2V0KGV2ZW50LCAnZGF0YScpO1xuICAgIGlmICh0aGlzLmxhc3RLZXlDb2RlKCkgPT09IFV0aWxzS2V5Q29kZUNvbnN0YW50LkJVRkZFUkVEICYmIGRhdGEpIHtcbiAgICAgIGNvbnN0IGtleUNvZGUgPSBkYXRhLmNoYXJDb2RlQXQoMCk7XG4gICAgICB0aGlzLmhhbmRsZXJLZXlkb3duKHsga2V5Q29kZSwgaW5wdXRFdmVudDogdHJ1ZSB9LCBuYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlcktleWRvd24oZXZlbnQ6IGFueSwgbmF0aXZlRWxlbWVudDogSFRNTElucHV0RWxlbWVudCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KTogYW55IHtcbiAgICB0aGlzLmxhc3RLZXlDb2RlLnNldChldmVudC5rZXlDb2RlKTtcbiAgICBpZiAoZXZlbnQuaXNDb21wb3NpbmcgfHwgZXZlbnQua2V5Q29kZSA9PT0gVXRpbHNLZXlDb2RlQ29uc3RhbnQuQlVGRkVSRUQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YWw6IGFueSA9IGdldFZhbHVlKG5hdGl2ZUVsZW1lbnQpO1xuICAgIGxldCBwb3M6IGFueSA9IGdldENhcmV0UG9zaXRpb24obmF0aXZlRWxlbWVudCwgdGhpcy5pZnJhbWUoKSk7XG4gICAgbGV0IGNoYXJQcmVzc2VkID0gZXZlbnQua2V5O1xuICAgIGlmICghdGhpcy5pc0VkaXRvcigpKSB7XG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gVXRpbHNLZXlDb2RlQ29uc3RhbnQuQkFDS1NQQUNFKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kRW1wdHlUb0xhc3ROb2RlKHBvcywgdmFsLmxlbmd0aCwgbmF0aXZlRWxlbWVudCk7XG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYWRkTm9kZVplcm9XaWR0aFNwYWNlKG5hdGl2ZUVsZW1lbnQpLCAwKTtcbiAgICB9XG4gICAgaWYgKCFjaGFyUHJlc3NlZCkge1xuICAgICAgY29uc3QgY2hhckNvZGUgPSBldmVudC53aGljaCB8fCBldmVudC5rZXlDb2RlO1xuICAgICAgY2hhclByZXNzZWQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LndoaWNoIHx8IGV2ZW50LmtleUNvZGUpO1xuICAgICAgaWYgKCFldmVudC5zaGlmdEtleSAmJiBjaGFyQ29kZSA+PSA2NSAmJiBjaGFyQ29kZSA8PSA5MCkge1xuICAgICAgICBjaGFyUHJlc3NlZCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUgKyAzMik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChldmVudC5rZXlDb2RlID09PSBVdGlsc0tleUNvZGVDb25zdGFudC5FTlRFUiAmJiBldmVudC53YXNDbGljayAmJiBwb3MgPCAodGhpcy5zdGFydFBvcygpIHx8IDApKSB7XG4gICAgICBwb3MgPSB0aGlzLnN0YXJ0Tm9kZSgpLmxlbmd0aDtcbiAgICAgIHNldENhcmV0UG9zaXRpb24odGhpcy5zdGFydE5vZGUoKSwgcG9zLCB0aGlzLmlmcmFtZSgpKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy50cmlnZ2VyQ2hhcnMoKVtjaGFyUHJlc3NlZF07XG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgdGhpcy5hY3RpdmVDb25maWcuc2V0KGNvbmZpZyk7XG4gICAgICB0aGlzLnN0YXJ0UG9zLnNldChldmVudC5pbnB1dEV2ZW50ID8gcG9zIC0gMSA6IHBvcyk7XG4gICAgICB0aGlzLnN0YXJ0Tm9kZS5zZXQoZ2V0V2luZG93U2VsZWN0aW9uKHRoaXMuaWZyYW1lKCkpPy5hbmNob3JOb2RlKTtcbiAgICAgIHRoaXMuc2VhcmNoaW5nLnNldCh0cnVlKTtcbiAgICAgIHRoaXMuc2VhcmNoU3RyaW5nLnNldCgnJyk7XG4gICAgICB0aGlzLnNob3dTZWFyY2hMaXN0KG5hdGl2ZUVsZW1lbnQpO1xuICAgICAgdGhpcy51cGRhdGVTZWFyY2hMaXN0KCk7XG4gICAgICBpZiAoY29uZmlnLnJldHVyblRyaWdnZXIpIHtcbiAgICAgICAgdGhpcy5vdXRTZWFyY2hUZXJtLmVtaXQoY29uZmlnLnRyaWdnZXJDaGFyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW1TZXQgb2YgdGhpcy5ub2Rlc0luc2VydCgpKSB7XG4gICAgICAgIGlmICghbmF0aXZlRWxlbWVudC5jb250YWlucyhpdGVtU2V0LmVsZW1lbnRTcGFuKSkge1xuICAgICAgICAgIGl0ZW1TZXQuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHRoaXMubm9kZXNJbnNlcnQoKS5kZWxldGUoaXRlbVNldCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBzdGFydFBvcyA9IHRoaXMuc3RhcnRQb3MoKTtcbiAgICBpZiAoaXNOaWwoc3RhcnRQb3MpIHx8IHN0YXJ0UG9zIDwgMCB8fCAhdGhpcy5zZWFyY2hpbmcoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZWFyY2hMaXN0ID0gdGhpcy5zZWFyY2hMaXN0KCk7XG4gICAgaWYgKHBvcyA8PSBzdGFydFBvcykge1xuICAgICAgaWYgKHNlYXJjaExpc3QpIHtcbiAgICAgICAgc2VhcmNoTGlzdC5oaWRkZW4uc2V0KHRydWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gVXRpbHNLZXlDb2RlQ29uc3RhbnQuU0hJRlQgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBwb3MgPD0gc3RhcnRQb3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmFjdGl2ZUNvbmZpZygpPy5hbGxvd1NwYWNlICYmIGV2ZW50LmtleUNvZGUgPT09IFV0aWxzS2V5Q29kZUNvbnN0YW50LlNQQUNFKSB7XG4gICAgICB0aGlzLnN0YXJ0UG9zLnNldCgtMSk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXlDb2RlID09PSBVdGlsc0tleUNvZGVDb25zdGFudC5CQUNLU1BBQ0UgJiYgcG9zID4gMCkge1xuICAgICAgcG9zLS07XG4gICAgICBpZiAocG9zID09PSB0aGlzLnN0YXJ0UG9zKCkpIHtcbiAgICAgICAgdGhpcy5zdG9wU2VhcmNoKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzZWFyY2hMaXN0Py5oaWRkZW4oKSkge1xuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IFV0aWxzS2V5Q29kZUNvbnN0YW50LlRBQiB8fCBldmVudC5rZXlDb2RlID09PSBVdGlsc0tleUNvZGVDb25zdGFudC5FTlRFUikge1xuICAgICAgICB0aGlzLnN0b3BTZWFyY2goKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXNlYXJjaExpc3Q/LmhpZGRlbigpICYmIHRoaXMuYWN0aXZlQ29uZmlnKCkpIHtcbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBVdGlsc0tleUNvZGVDb25zdGFudC5UQUIgfHwgZXZlbnQua2V5Q29kZSA9PT0gVXRpbHNLZXlDb2RlQ29uc3RhbnQuRU5URVIpIHtcbiAgICAgICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICAvLyBlbWl0IHRoZSBzZWxlY3RlZCBsaXN0IGl0ZW1cbiAgICAgICAgdGhpcy5vdXRJdGVtU2VsZWN0ZWQuZW1pdChzZWFyY2hMaXN0Py5BY3RpdmVJdGVtKTtcbiAgICAgICAgLy8gb3B0aW9uYWwgZnVuY3Rpb24gdG8gZm9ybWF0IHRoZSBzZWxlY3RlZCBpdGVtIGJlZm9yZSBpbnNlcnRpbmcgdGhlIHRleHRcbiAgICAgICAgdGhpcy5pbnNlcnRNZW50aW9uKG5hdGl2ZUVsZW1lbnQsIHBvcyk7XG4gICAgICAgIC8vIGZpcmUgaW5wdXQgZXZlbnQgc28gYW5ndWxhciBiaW5kaW5ncyBhcmUgdXBkYXRlZFxuICAgICAgICBpZiAoJ0V2ZW50JyBpbiB3aW5kb3cpIHtcbiAgICAgICAgICAvLyB0aGlzIHNlZW1zIGJhY2t3YXJkcywgYnV0IGZpcmUgdGhlIGV2ZW50IGZyb20gdGhpcyBlbGVtZW50cyBuYXRpdmVFbGVtZW50IChub3QgdGhlXG4gICAgICAgICAgLy8gb25lIHByb3ZpZGVkIHRoYXQgbWF5IGJlIGluIGFuIGlmcmFtZSwgYXMgaXQgd29uJ3QgYmUgcHJvcG9nYXRlKVxuICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZXZlbnQgdXNpbmcgdGhlIG1vZGVybiBFdmVudCBjb25zdHJ1Y3RvclxuICAgICAgICAgIGNvbnN0IGV2dCA9IG5ldyBFdmVudCh0aGlzLmlmcmFtZSgpID8gJ2NoYW5nZScgOiAnaW5wdXQnLCB7XG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV2ZW50IG9uIHRoZSBuYXRpdmUgZWxlbWVudFxuICAgICAgICAgIG5hdGl2ZUVsZW1lbnQuZGlzcGF0Y2hFdmVudChldnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhcnRQb3Muc2V0KC0xKTtcbiAgICAgICAgdGhpcy5zdG9wU2VhcmNoKCk7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gVXRpbHNLZXlDb2RlQ29uc3RhbnQuRVNDQVBFKSB7XG4gICAgICAgIHRoaXMuc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgdGhpcy5zdG9wU2VhcmNoKCk7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IFV0aWxzS2V5Q29kZUNvbnN0YW50LkRPV05fQVJST1cpIHtcbiAgICAgICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICBzZWFyY2hMaXN0Py5hY3RpdmF0ZU5leHRJdGVtKCk7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IFV0aWxzS2V5Q29kZUNvbnN0YW50LlVQX0FSUk9XKSB7XG4gICAgICAgIHRoaXMuc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgc2VhcmNoTGlzdD8uYWN0aXZhdGVQcmV2aW91c0l0ZW0oKTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFyUHJlc3NlZC5sZW5ndGggIT09IDEgJiYgZXZlbnQua2V5Q29kZSAhPT0gVXRpbHNLZXlDb2RlQ29uc3RhbnQuQkFDS1NQQUNFKSB7XG4gICAgICB0aGlzLnN0b3BFdmVudChldmVudCk7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNlYXJjaGluZygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBtZW50aW9uID0gdmFsLnN1YnN0cmluZygodGhpcy5zdGFydFBvcygpIHx8IDApICsgMSwgcG9zKTtcblxuICAgIGlmIChldmVudC5rZXlDb2RlICE9PSBVdGlsc0tleUNvZGVDb25zdGFudC5CQUNLU1BBQ0UgJiYgIWV2ZW50LmlucHV0RXZlbnQpIHtcbiAgICAgIG1lbnRpb24gKz0gY2hhclByZXNzZWQ7XG4gICAgfVxuICAgIGNvbnN0IHNlYXJjaFN0cmluZyA9IG1lbnRpb24ucmVwbGFjZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCksICcgJykucmVwbGFjZShTdHJpbmcuZnJvbUNoYXJDb2RlKDApLCAnJyk7XG4gICAgdGhpcy5zZWFyY2hTdHJpbmcuc2V0KHNlYXJjaFN0cmluZy50cmltKCkpO1xuICAgIGNvbnN0IGxpbWl0U3BhY2VTZWFyY2hRdWVyeSA9IHRoaXMuYWN0aXZlQ29uZmlnKCk/LmxpbWl0U3BhY2VTZWFyY2hRdWVyeTtcbiAgICBpZiAobGltaXRTcGFjZVNlYXJjaFF1ZXJ5ICYmIHNlYXJjaFN0cmluZy5zcGxpdCgnICcpLmxlbmd0aCAtIDEgPiBsaW1pdFNwYWNlU2VhcmNoUXVlcnkpIHtcbiAgICAgIHRoaXMuc2VhcmNoU3RyaW5nLnNldCgnJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmFjdGl2ZUNvbmZpZygpPy5yZXR1cm5UcmlnZ2VyKSB7XG4gICAgICBjb25zdCB0cmlnZ2VyQ2hhciA9IHRoaXMuc2VhcmNoU3RyaW5nKCkgfHwgZXZlbnQua2V5Q29kZSA9PT0gVXRpbHNLZXlDb2RlQ29uc3RhbnQuQkFDS1NQQUNFID8gdmFsLnN1YnN0cmluZyh0aGlzLnN0YXJ0UG9zKCksICh0aGlzLnN0YXJ0UG9zKCkgfHwgMCkgKyAxKSA6ICcnO1xuXG4gICAgICB0aGlzLm91dFNlYXJjaFRlcm0uZW1pdCh0cmlnZ2VyQ2hhciArIHRoaXMuc2VhcmNoU3RyaW5nKCkpO1xuICAgICAgdGhpcy51cGRhdGVTZWFyY2hMaXN0KCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vdXRTZWFyY2hUZXJtLmVtaXQodGhpcy5zZWFyY2hTdHJpbmcoKSk7XG4gICAgdGhpcy51cGRhdGVTZWFyY2hMaXN0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckZvY3VzKGU/OiBFdmVudCwgbmF0aXZlRWxlbWVudDogSFRNTElucHV0RWxlbWVudCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XG4gICAgZT8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBub2RlID0gZ2V0V2luZG93U2VsZWN0aW9uKHRoaXMuaWZyYW1lKCkpPy5hbmNob3JOb2RlO1xuXG4gICAgICBpZiAobm9kZT8ubm9kZVR5cGUgIT09IDMpIHtcbiAgICAgICAgdGhpcy5zdG9wU2VhcmNoKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdGV4dEJlZm9yZUN1cnNvciA9IGdldFRleHRCZWZvcmVDdXJzb3IoKSB8fCAnJztcblxuICAgICAgY29uc3QgdHJpZ2dlckNoYXJzID0gT2JqZWN0LmtleXModGhpcy50cmlnZ2VyQ2hhcnMoKSkubWFwKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIGNvbmZpZzogdGhpcy50cmlnZ2VyQ2hhcnMoKVtrZXldLFxuICAgICAgICAgIGluZGV4OiB0ZXh0QmVmb3JlQ3Vyc29yLmxhc3RJbmRleE9mKGtleSksXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG1hdGNoaW5nQ2hhcmFjdGVycyA9IHRyaWdnZXJDaGFycy5yZWR1Y2UoKHByZSwgY3VycmVudCkgPT4gKHByZSAmJiBjdXJyZW50ICYmIGN1cnJlbnQuaW5kZXggPiBwcmUuaW5kZXggPyBjdXJyZW50IDogcHJlKSwgdHJpZ2dlckNoYXJzWzBdKTtcblxuICAgICAgaWYgKG1hdGNoaW5nQ2hhcmFjdGVycy5pbmRleCA8IDApIHtcbiAgICAgICAgdGhpcy5zdG9wU2VhcmNoKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VhcmNoID0gdGV4dEJlZm9yZUN1cnNvcj8uc3Vic3RyaW5nKG1hdGNoaW5nQ2hhcmFjdGVycy5pbmRleCwgdGV4dEJlZm9yZUN1cnNvci5sZW5ndGgpO1xuXG4gICAgICBpZiAoIXNlYXJjaCkge1xuICAgICAgICB0aGlzLnN0b3BTZWFyY2goKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBwb3MgPSBnZXRDYXJldFBvc2l0aW9uKG5hdGl2ZUVsZW1lbnQsIHRoaXMuaWZyYW1lKCkpO1xuXG4gICAgICB0aGlzLmFjdGl2ZUNvbmZpZy5zZXQobWF0Y2hpbmdDaGFyYWN0ZXJzLmNvbmZpZyk7XG4gICAgICB0aGlzLnN0YXJ0UG9zLnNldChwb3MgLSAodGV4dEJlZm9yZUN1cnNvci5sZW5ndGggLSBtYXRjaGluZ0NoYXJhY3RlcnMuaW5kZXgpKTtcbiAgICAgIHRoaXMuc2VhcmNoU3RyaW5nLnNldChzZWFyY2gucmVwbGFjZShtYXRjaGluZ0NoYXJhY3RlcnMua2V5LCAnJykpO1xuICAgICAgdGhpcy5zZWFyY2hpbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5oYW5kbGVyS2V5ZG93bih7IGtleUNvZGU6ICcnLmNoYXJDb2RlQXQoMCksIGlucHV0RXZlbnQ6IGZhbHNlIH0sIG5hdGl2ZUVsZW1lbnQpO1xuICAgICAgY29uc3QgZGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICBkaXZFbGVtZW50LnN0eWxlLndpZHRoID0gJ21heC1jb250ZW50JztcbiAgICAgIGRpdkVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgZGl2RWxlbWVudC5pbm5lclRleHQgPSBzZWFyY2g7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdkVsZW1lbnQpO1xuICAgICAgbGV0IGlmcmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmcmFtZSA9IHRoaXMubWVudGlvbkNvbmZpZygpPy5pZnJhbWUgPyAod2luZG93LnBhcmVudC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm1lbnRpb25Db25maWcoKT8uaWZyYW1lIGFzIHN0cmluZykgYXMgSFRNTElGcmFtZUVsZW1lbnQpIDogdW5kZWZpbmVkO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VhcmNoTGlzdCA9IHRoaXMuc2VhcmNoTGlzdCgpO1xuICAgICAgaWYgKHNlYXJjaExpc3QpIHtcbiAgICAgICAgc2VhcmNoTGlzdC5wb3NpdGlvbihuYXRpdmVFbGVtZW50LCBpZnJhbWUsIGRpdkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpO1xuICAgICAgfVxuICAgICAgZGl2RWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIG5hdGl2ZUVsZW1lbnQubm9ybWFsaXplKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BTZWFyY2goKSB7XG4gICAgY29uc3Qgc2VhcmNoTGlzdCA9IHRoaXMuc2VhcmNoTGlzdCgpO1xuICAgIGlmIChzZWFyY2hMaXN0ICYmICFzZWFyY2hMaXN0LmhpZGRlbigpKSB7XG4gICAgICBzZWFyY2hMaXN0LmhpZGRlbi5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLm91dFRvZ2dsZS5lbWl0KGZhbHNlKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmVDb25maWcuc2V0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5zZWFyY2hpbmcuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU2VhcmNoTGlzdCgpIHtcbiAgICBjb25zdCBtYXRjaGVzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IGFjdGl2ZUNvbmZpZyA9IHRoaXMuYWN0aXZlQ29uZmlnKCk7XG4gICAgY29uc3Qgc2VhcmNoU3RyaW5nID0gdGhpcy5zZWFyY2hTdHJpbmcoKTtcbiAgICBjb25zdCBzZWFyY2hMaXN0ID0gdGhpcy5zZWFyY2hMaXN0KCk7XG4gICAgLy8gZGlzYWJsaW5nIHRoZSBzZWFyY2ggcmVsaWVzIG9uIHRoZSBhc3luYyBvcGVyYXRpb24gdG8gZG8gdGhlIGZpbHRlcmluZ1xuICAgIGlmIChhY3RpdmVDb25maWc/Lml0ZW1zICYmICFhY3RpdmVDb25maWcuZGlzYWJsZVNlYXJjaCAmJiAhaXNOaWwoc2VhcmNoU3RyaW5nKSAmJiBhY3RpdmVDb25maWcubGFiZWxLZXkgJiYgYWN0aXZlQ29uZmlnLm1lbnRpb25GaWx0ZXIpIHtcbiAgICAgIG1hdGNoZXMucHVzaCguLi4oYWN0aXZlQ29uZmlnLm1lbnRpb25GaWx0ZXIoc2VhcmNoU3RyaW5nLCBhY3RpdmVDb25maWcuaXRlbXMpIGFzIGFueSkpO1xuICAgIH1cbiAgICAvLyB1cGRhdGUgdGhlIHNlYXJjaCBsaXN0XG4gICAgaWYgKCFzZWFyY2hMaXN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNlYXJjaExpc3QuaXRlbXMuc2V0KG1hdGNoZXMpO1xuICAgIHNlYXJjaExpc3QuaGlkZGVuLnNldCghbWF0Y2hlcy5sZW5ndGgpO1xuICAgIHNlYXJjaExpc3QuYWN0aXZlSW5kZXguc2V0KDApO1xuICAgIHNlYXJjaExpc3Quc2Nyb2xsQ29udGVudCgpO1xuICAgIHRoaXMub3V0VG9nZ2xlLmVtaXQoISFtYXRjaGVzLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIHNob3dTZWFyY2hMaXN0KG5hdGl2ZUVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICBsZXQgaWZyYW1lID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1lbnRpb25Db25maWcgPSB0aGlzLm1lbnRpb25Db25maWcoKTtcbiAgICB0cnkge1xuICAgICAgaWZyYW1lID0gbWVudGlvbkNvbmZpZz8uaWZyYW1lID8gKHdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobWVudGlvbkNvbmZpZz8uaWZyYW1lIGFzIHN0cmluZykgYXMgSFRNTElGcmFtZUVsZW1lbnQpIDogdW5kZWZpbmVkO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgfVxuICAgIGlmICghbWVudGlvbkNvbmZpZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm91dFRvZ2dsZS5lbWl0KHRydWUpO1xuICAgIGxldCBmaXJzdFRpbWUgPSBmYWxzZTtcblxuICAgIGlmICghdGhpcy5saXN0Q29tcG9uZW50UmVmKCkpIHtcbiAgICAgIGZpcnN0VGltZSA9IHRydWU7XG4gICAgICB0aGlzLmxpc3RDb21wb25lbnRSZWYuc2V0KHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoTGlic1VpQ29tcG9uZW50c0lucHV0c01lbnRpb25MaXN0Q29tcG9uZW50KSk7XG4gICAgICB0aGlzLnNlYXJjaExpc3Quc2V0KHRoaXMubGlzdENvbXBvbmVudFJlZigpPy5pbnN0YW5jZSk7XG4gICAgfVxuICAgIHRoaXMuc2VhcmNoTGlzdCgpPy5sYWJlbEtleS5zZXQodGhpcy5hY3RpdmVDb25maWcoKT8ubGFiZWxLZXkgfHwgJycpO1xuICAgIHRoaXMuc2VhcmNoTGlzdCgpPy5zdHlsZU9mZi5zZXQodGhpcy5tZW50aW9uQ29uZmlnKCk/LmRpc2FibGVTdHlsZSB8fCBmYWxzZSk7XG4gICAgdGhpcy5zZWFyY2hMaXN0KCk/LmFjdGl2ZUluZGV4LnNldCgwKTtcbiAgICB0aGlzLnNlYXJjaExpc3QoKT8uekluZGV4LnNldCh0aGlzLm1lbnRpb25Db25maWcoKT8uekluZGV4IHx8IDI1MDApO1xuICAgIHRoaXMuc2VhcmNoTGlzdCgpPy5pc0lmcmFtZS5zZXQoISFpZnJhbWUpO1xuICAgIHRoaXMuc2VhcmNoTGlzdCgpPy5saXN0VGVtcGxhdGUuc2V0KHRoaXMubWVudGlvbkxpc3RUZW1wbGF0ZSgpKTtcbiAgICB0aGlzLnNlYXJjaExpc3QoKT8ucGFyZW50SGFuZGxlcktleURvd24uc2V0KHRoaXMuaGFuZGxlcktleWRvd24uYmluZCh0aGlzKSk7XG4gICAgdGhpcy5zZWFyY2hMaXN0KCk/LnBvc2l0aW9uKG5hdGl2ZUVsZW1lbnQsIGlmcmFtZSk7XG4gICAgaWYgKGZpcnN0VGltZSAmJiB0aGlzLmxpc3RDb21wb25lbnRSZWYoKSkge1xuICAgICAgdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5hZGRUb0JvZHkodGhpcy5saXN0Q29tcG9uZW50UmVmKCksICEhaWZyYW1lKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lMaXN0U2VhcmNoKCkge1xuICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVtb3ZlKHRoaXMubGlzdENvbXBvbmVudFJlZiwgdGhpcy5pZnJhbWVJZCgpKTtcbiAgICB0aGlzLmxpc3RDb21wb25lbnRSZWYuc2V0KHVuZGVmaW5lZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBwZW5kRW1wdHlUb0xhc3ROb2RlKHBvc2l0aW9uOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyLCBuYXRpdmVFbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICBjb25zdCBlbXB0eSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdcXHUwMEEwJyk7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZ2V0V2luZG93U2VsZWN0aW9uKHRoaXMuaWZyYW1lKCkpO1xuICAgIGNvbnN0IGFuY2hvck5vZGUgPSBzZWxlY3Rpb24/LmFuY2hvck5vZGU7XG5cbiAgICBpZiAodGhpcy5pc0VkaXRvcigpKSB7XG4gICAgICBjb25zdCBwYXJlbnROb2RlID0gYW5jaG9yTm9kZT8ucGFyZW50Tm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICBpZiAocGFyZW50Tm9kZT8uZ2V0QXR0cmlidXRlPy4oJ2lkJykpIHtcbiAgICAgICAgaWYgKCFwYXJlbnROb2RlLm5leHRTaWJsaW5nPy50ZXh0Q29udGVudD8ubGVuZ3RoKSB7XG4gICAgICAgICAgcGFyZW50Tm9kZT8ucGFyZW50Tm9kZT8uaW5zZXJ0QmVmb3JlKGVtcHR5LCBwYXJlbnROb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICAgICAgICByYW5nZS5zZXRTdGFydChwYXJlbnROb2RlLm5leHRTaWJsaW5nIGFzIE5vZGUsIDApO1xuICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgc2VsPy5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgc2VsPy5hZGRSYW5nZShyYW5nZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHByZU5vZGUgPSBudWxsO1xuICAgIGNvbnN0IGFuY2hvck9mZnNldCA9IHNlbGVjdGlvbj8uYW5jaG9yT2Zmc2V0O1xuXG4gICAgaWYgKCFhbmNob3JOb2RlIHx8ICFhbmNob3JPZmZzZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYW5jaG9yTm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnI3RleHQnKSB7XG4gICAgICBuYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKGVtcHR5KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBBcnJheS5mcm9tKG5hdGl2ZUVsZW1lbnQuY2hpbGROb2RlcykpIHtcbiAgICAgIGlmIChhbmNob3JOb2RlLm5vZGVUeXBlID09PSAzICYmIGFuY2hvck5vZGUgPT09IG5vZGUgJiYgcHJlTm9kZT8uZ2V0QXR0cmlidXRlPy4oJ2lkJykgJiYgKCFhbmNob3JOb2RlLnRleHRDb250ZW50Py5sZW5ndGggfHwgYW5jaG9yTm9kZS50ZXh0Q29udGVudC5sZW5ndGggPT09IDEpICYmIHBvc2l0aW9uID09PSBsZW5ndGgpIHtcbiAgICAgICAgbmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChlbXB0eSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcHJlTm9kZSA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkTm9kZVplcm9XaWR0aFNwYWNlKG5hdGl2ZUVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQgPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgIGNvbnN0IGVtcHR5ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ1xcdTIwMGInKTtcbiAgICBsZXQgcHJlTm9kZSA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgQXJyYXkuZnJvbShuYXRpdmVFbGVtZW50LmNoaWxkTm9kZXMpKSB7XG4gICAgICBjb25zdCB0eXBlZE5vZGU6IGFueSA9IG5vZGU7XG5cbiAgICAgIGlmIChwcmVOb2RlPy5nZXRBdHRyaWJ1dGU/LignaWQnKSAmJiB0eXBlZE5vZGU/LmdldEF0dHJpYnV0ZT8uKCdpZCcpKSB7XG4gICAgICAgIG5hdGl2ZUVsZW1lbnQuaW5zZXJ0QmVmb3JlKGVtcHR5LCBwcmVOb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgIH1cblxuICAgICAgcHJlTm9kZSA9IHR5cGVkTm9kZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluc2VydE1lbnRpb24obmF0aXZlRWxlbWVudDogSFRNTElucHV0RWxlbWVudCwgcG9zOiBudW1iZXIpIHtcbiAgICBjb25zdCBhY3RpdmVDb25maWcgPSB0aGlzLmFjdGl2ZUNvbmZpZygpO1xuICAgIGlmICghYWN0aXZlQ29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNlYXJjaExpc3QgPSB0aGlzLnNlYXJjaExpc3QoKTtcbiAgICBsZXQgdGV4dCA9ICcnO1xuICAgIGNvbnN0IGZlSWQgPSB1dWlkKCk7XG4gICAgY29uc3QgaWQgPSBzZWFyY2hMaXN0Py5BY3RpdmVJdGVtLmlkIHx8IHV1aWQoKTtcbiAgICBjb25zdCBpdGVtQWN0aXZlID0gc2VhcmNoTGlzdD8uQWN0aXZlSXRlbTtcbiAgICBjb25zdCB7IHRyaWdnZXJDaGFyLCBtZW50aW9uRXZlbnROYW1lLCBtZW50aW9uQWN0aW9uQnlFdmVudCB9ID0gYWN0aXZlQ29uZmlnO1xuXG4gICAgaWYgKGFjdGl2ZUNvbmZpZy5tZW50aW9uU2VsZWN0KSB7XG4gICAgICB0ZXh0ID0gYWN0aXZlQ29uZmlnLm1lbnRpb25TZWxlY3Qoc2VhcmNoTGlzdD8uQWN0aXZlSXRlbSwgYWN0aXZlQ29uZmlnLnRyaWdnZXJDaGFyKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzRWRpdG9yKCkpIHtcbiAgICAgIGxldCBzcGFuOiBIVE1MU3BhbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdURVhUQVJFQScpO1xuXG4gICAgICBzcGFuLmlubmVyVGV4dCA9IHRleHQ7XG4gICAgICB0ZXh0ID0gc3Bhbi5pbm5lckhUTUw7XG4gICAgICBzcGFuLnJlbW92ZSgpO1xuICAgICAgdGV4dCA9IGJ1aWxkVGVtcGxhdGUodGV4dCwgaWQsIGZlSWQpO1xuICAgICAgc3BhbiA9IGluc2VydFZhbHVlKG5hdGl2ZUVsZW1lbnQsIHRoaXMuc3RhcnRQb3MoKSB8fCAwLCBwb3MsIHRleHQsIHRoaXMuaWZyYW1lKCkpIGFzIEhUTUxTcGFuRWxlbWVudDtcbiAgICAgIGlmIChzcGFuKSB7XG4gICAgICAgIGNvbnN0IGRhdGE6IElOb2RlSW5zZXJ0ID0ge1xuICAgICAgICAgIGVsZW1lbnRTcGFuOiBzcGFuLFxuICAgICAgICAgIHN1YnNjcmlwdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICAgIGl0ZW06IGl0ZW1BY3RpdmUsXG4gICAgICAgICAgdHJpZ2dlckNoYXI6IHRyaWdnZXJDaGFyLFxuICAgICAgICAgIG1hbnVhbEFkZDogdHJ1ZSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLm5vZGVzSW5zZXJ0KCkuYWRkKGRhdGEpO1xuICAgICAgICBpZiAobWVudGlvbkV2ZW50TmFtZSkge1xuICAgICAgICAgIGRhdGEuc3Vic2NyaXB0aW9uID0gZnJvbUV2ZW50PElFdmVudD4oc3BhbiwgbWVudGlvbkV2ZW50TmFtZSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICB0YXAoKGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCkpLFxuICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG1lbnRpb25BY3Rpb25CeUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgbWVudGlvbkFjdGlvbkJ5RXZlbnQoaXRlbUFjdGl2ZSwgdHJpZ2dlckNoYXIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm91dEluc2VydE1lbnRpb24uZW1pdCh7IGRhdGE6IHsgaWQsIHZhbHVlOiB0ZXh0LCBmZUlkIH0sIGxlbmd0aEtleTogcG9zIC0gKHRoaXMuc3RhcnRQb3MoKSB8fCAwKSB9KTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3lMaXN0U2VhcmNoKCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kubmV4dCgpO1xuICAgIHRoaXMub25EZXN0cm95LmNvbXBsZXRlKCk7XG4gIH1cbn1cbiJdfQ==
|
|
508
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudGlvbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL21lbnRpb24vc3JjL21lbnRpb24uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQStCLFNBQVMsRUFBRSxVQUFVLEVBQTBCLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdKLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRS9KLE9BQU8sRUFBRSwwQ0FBMEMsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQU9uRixNQUFNLE9BQU8sc0NBQXNDO0lBQ2pELG1CQUFtQjtJQUNGLGdCQUFnQixHQUFHLE1BQU0sQ0FBdUUsU0FBUyxDQUFDLENBQUM7SUFDM0csV0FBVyxHQUFHLE1BQU0sQ0FBbUIsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELFlBQVksR0FBRyxNQUFNLENBQTZCLFNBQVMsQ0FB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Q0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLFNBQVMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6SCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsQ0FBQzt3R0F6aEJVLHNDQUFzQzs0RkFBdEMsc0NBQXNDOzs0RkFBdEMsc0NBQXNDO2tCQUxsRCxTQUFTO21CQUFDO29CQUNULDhEQUE4RDtvQkFDOUQsUUFBUSxFQUFFLDBDQUEwQztvQkFDcEQsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50UmVmLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIE9uRGVzdHJveSwgVGVtcGxhdGVSZWYsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUV2ZW50LCBUWVBFX1RFTVBMQVRFX1JFRiB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuaW1wb3J0IHsgTGlic1VpRHluYW1pY0NvbXBvbmVudFNlcnZpY2UgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1keW5hbWljLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBVdGlsc0tleUNvZGVDb25zdGFudCwgZ2V0LCBpc05pbCwgdXVpZCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFN1YmplY3QsIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBERUZBVUxUX0NPTkZJRywgYnVpbGRUZW1wbGF0ZSB9IGZyb20gJy4vZGVmaW5lcy90ZW1wbGF0ZS5kZWZpbmUnO1xuaW1wb3J0IHsgZ2V0Q2FyZXRQb3NpdGlvbiwgZ2V0VGV4dEJlZm9yZUN1cnNvciwgZ2V0VmFsdWUsIGdldFdpbmRvd1NlbGVjdGlvbiwgaW5zZXJ0VGV4dEF0Q2FyZXQsIGluc2VydFZhbHVlLCBzZXRDYXJldFBvc2l0aW9uIH0gZnJvbSAnLi9kZWZpbmVzL3V0aWxzLmRlZmluZSc7XG5pbXBvcnQgeyBJTWVudGlvbkNvbmZpZywgSU1lbnRpb25GdW5jdGlvbkNvbnRyb2xFdmVudCwgSU1lbnRpb25JbnNlcnQsIElOb2RlSW5zZXJ0IH0gZnJvbSAnLi9pbnRlcmZhY2VzL21lbnRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNZW50aW9uTGlzdENvbXBvbmVudCB9IGZyb20gJy4vbGlzdC9saXN0LmNvbXBvbmVudCc7XG5cbkBEaXJlY3RpdmUoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1tMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkRpcmVjdGl2ZV0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkRpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJpdmF0ZSByZWFkb25seSBsaXN0Q29tcG9uZW50UmVmID0gc2lnbmFsPENvbXBvbmVudFJlZjxMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkxpc3RDb21wb25lbnQ+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IG5vZGVzSW5zZXJ0ID0gc2lnbmFsPFNldDxJTm9kZUluc2VydD4+KG5ldyBTZXQoKSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZlQ29uZmlnID0gc2lnbmFsPElNZW50aW9uQ29uZmlnIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyaWdnZXJDaGFycyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBJTWVudGlvbkNvbmZpZz4+KHt9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWFyY2hTdHJpbmcgPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhcnRQb3MgPSBzaWduYWw8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXJ0Tm9kZSA9IHNpZ25hbDxhbnk+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VhcmNoTGlzdCA9IHNpZ25hbDxMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkxpc3RDb21wb25lbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VhcmNoaW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpZnJhbWUgPSBzaWduYWw8YW55Pih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxhc3RLZXlDb2RlID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpc0VkaXRvciA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaWZyYW1lSWQgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnQgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgZHluYW1pY0NvbXBvbmVudFNlcnZpY2UgPSBpbmplY3QoTGlic1VpRHluYW1pY0NvbXBvbmVudFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gI3JlZ2lvbiBJTlBVVFxuICByZWFkb25seSB0aW1lRGVsYXlJbml0ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDAsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gMCB9KTtcbiAgcmVhZG9ubHkgbWVudGlvbkNvbmZpZyA9IGlucHV0PElNZW50aW9uQ29uZmlnPigpO1xuICByZWFkb25seSBtZW50aW9uTGlzdFRlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8VFlQRV9URU1QTEFURV9SRUY+PigpO1xuXG4gIC8vICNyZWdpb24gT1VUUFVUXG4gIHJlYWRvbmx5IG91dFNlYXJjaFRlcm0gPSBvdXRwdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBvdXRJdGVtU2VsZWN0ZWQgPSBvdXRwdXQ8dW5rbm93bj4oKTtcbiAgcmVhZG9ubHkgb3V0VG9nZ2xlID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dEluc2VydE1lbnRpb24gPSBvdXRwdXQ8SU1lbnRpb25JbnNlcnQ+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uQ29udHJvbCA9IG91dHB1dDxJTWVudGlvbkZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB0aGlzLm1lbnRpb25Db25maWcoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLnVwZGF0ZUNvbmZpZygpKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5tZW50aW9uQ29uZmlnKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgaXNDb250ZW50RWRpdGFibGUgPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpO1xuICAgICAgdGhpcy5pc0VkaXRvci5zZXQoIWlzQ29udGVudEVkaXRhYmxlKTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSAhdGhpcy5pc0VkaXRvcigpID8gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgOiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcucWwtZWRpdG9yW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nKTtcbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZXJLZXlkb3duLmJpbmQodGhpcykoZXZlbnQsIGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChldmVudDogSW5wdXRFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlcklucHV0LmJpbmQodGhpcykoZXZlbnQsIGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlckJsdXIuYmluZCh0aGlzKShldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlckZvY3VzLmJpbmQodGhpcykoZXZlbnQsIGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3V0RnVuY3Rpb25Db250cm9sLmVtaXQoe1xuICAgICAgICBhZGRNZW50aW9uOiAoKSA9PiB7XG4gICAgICAgICAgaW5zZXJ0VGV4dEF0Q2FyZXQoZWxlbWVudCwgYCR7dGhpcy5tZW50aW9uQ29uZmlnKCk/LnRyaWdnZXJDaGFyfWApO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVyS2V5ZG93bih7IGtleTogdGhpcy5tZW50aW9uQ29uZmlnKCk/LnRyaWdnZXJDaGFyLCBrZXlDb2RlOiBVdGlsc0tleUNvZGVDb25zdGFudC5CQUNLU1BBQ0UsIHNoaWZ0S2V5OiB0cnVlLCBpbnB1dEV2ZW50OiB0cnVlIH0sIGVsZW1lbnQpO1xuICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LCB0aGlzLnRpbWVEZWxheUluaXQoKSk7XG4gIH1cblxuICAvKiBGVU5DVElPTlMgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZUNvbmZpZygpIHtcbiAgICBjb25zdCBtZW50aW9uQ29uZmlnID0gdGhpcy5tZW50aW9uQ29uZmlnKCk7XG4gICAgaWYgKCFtZW50aW9uQ29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudHJpZ2dlckNoYXJzLnNldCh7fSk7XG4gICAgdGhpcy5hZGRDb25maWcobWVudGlvbkNvbmZpZyk7XG4gICAgaWYgKG1lbnRpb25Db25maWcubWVudGlvbikge1xuICAgICAgbWVudGlvbkNvbmZpZy5tZW50aW9uLmZvckVhY2goKGNvbmZpZykgPT4gdGhpcy5hZGRDb25maWcoY29uZmlnKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRDb25maWcoY29uZmlnOiBJTWVudGlvbkNvbmZpZykge1xuICAgIGNvbnN0IGRlZmF1bHRzID0geyAuLi5ERUZBVUxUX0NPTkZJRyB9O1xuICAgIGNvbnN0IGxhYmVsS2V5ID0gY29uZmlnLmxhYmVsS2V5IHx8ICdsYWJlbCc7XG4gICAgY29uZmlnID0gT2JqZWN0LmFzc2lnbihkZWZhdWx0cywgY29uZmlnKTtcbiAgICBpZiAoY29uZmlnLml0ZW1zICYmIGNvbmZpZy5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbmZpZy5pdGVtc1swXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uZmlnLml0ZW1zLmZvckVhY2goKGxhYmVsKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+PiA9IHt9O1xuICAgICAgICAgIG9iamVjdFtsYWJlbEtleV0gPSBsYWJlbDtcbiAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChsYWJlbEtleSkge1xuICAgICAgICAvLyByZW1vdmUgaXRlbXMgd2l0aG91dCBhbiBsYWJlbEtleSAoYXMgaXQncyByZXF1aXJlZCB0byBmaWx0ZXIgdGhlIGxpc3QpXG4gICAgICAgIGNvbmZpZy5pdGVtcyA9IGNvbmZpZy5pdGVtcy5maWx0ZXIoKGUpID0+IGVbbGFiZWxLZXldKTtcbiAgICAgICAgaWYgKCFjb25maWcuZGlzYWJsZVNvcnQpIHtcbiAgICAgICAgICBjb25maWcuaXRlbXMuc29ydCgoYSwgYikgPT4gKGFbbGFiZWxLZXldIHx8ICcnKS5sb2NhbGVDb21wYXJlKGJbbGFiZWxLZXldIHx8ICcnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy50cmlnZ2VyQ2hhcnMudXBkYXRlKChpdGVtKSA9PiAoe1xuICAgICAgLi4uaXRlbSxcbiAgICAgIFtjb25maWcudHJpZ2dlckNoYXIgfHwgJ0AnXTogY29uZmlnLFxuICAgIH0pKTtcbiAgICBpZiAodGhpcy5hY3RpdmVDb25maWcoKSAmJiB0aGlzLmFjdGl2ZUNvbmZpZygpPy50cmlnZ2VyQ2hhciA9PT0gY29uZmlnLnRyaWdnZXJDaGFyKSB7XG4gICAgICB0aGlzLmFjdGl2ZUNvbmZpZy5zZXQoY29uZmlnKTtcbiAgICAgIHRoaXMudXBkYXRlU2VhcmNoTGlzdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRJZnJhbWUoaWZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudCkge1xuICAgIHRoaXMuaWZyYW1lLnNldChpZnJhbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKGdldDx1bmtub3duPihldmVudCwgJ3dhc0NsaWNrJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQmx1cihldmVudDogRXZlbnQpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgIHRoaXMuc3RvcFNlYXJjaCgpO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlcklucHV0KGV2ZW50OiBJbnB1dEV2ZW50LCBuYXRpdmVFbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICBjb25zdCBkYXRhID0gZ2V0KGV2ZW50LCAnZGF0YScpO1xuICAgIGlmICh0aGlzLmxhc3RLZXlDb2RlKCkgPT09IFV0aWxzS2V5Q29kZUNvbnN0YW50LkJVRkZFUkVEICYmIGRhdGEpIHtcbiAgICAgIGNvbnN0IGtleUNvZGUgPSBkYXRhLmNoYXJDb2RlQXQoMCk7XG4gICAgICB0aGlzLmhhbmRsZXJLZXlkb3duKHsga2V5Q29kZSwgaW5wdXRFdmVudDogdHJ1ZSB9LCBuYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlcktleWRvd24oZXZlbnQ6IGFueSwgbmF0aXZlRWxlbWVudDogSFRNTElucHV0RWxlbWVudCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KTogYW55IHtcbiAgICB0aGlzLmxhc3RLZXlDb2RlLnNldChldmVudC5rZXlDb2RlKTtcbiAgICBpZiAoZXZlbnQuaXNDb21wb3NpbmcgfHwgZXZlbnQua2V5Q29kZSA9PT0gVXRpbHNLZXlDb2RlQ29uc3RhbnQuQlVGRkVSRUQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YWw6IGFueSA9IGdldFZhbHVlKG5hdGl2ZUVsZW1lbnQpO1xuICAgIGxldCBwb3M6IGFueSA9IGdldENhcmV0UG9zaXRpb24obmF0aXZlRWxlbWVudCwgdGhpcy5pZnJhbWUoKSk7XG4gICAgbGV0IGNoYXJQcmVzc2VkID0gZXZlbnQua2V5O1xuICAgIGlmICghdGhpcy5pc0VkaXRvcigpKSB7XG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gVXRpbHNLZXlDb2RlQ29uc3RhbnQuQkFDS1NQQUNFKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kRW1wdHlUb0xhc3ROb2RlKHBvcywgdmFsLmxlbmd0aCwgbmF0aXZlRWxlbWVudCk7XG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYWRkTm9kZVplcm9XaWR0aFNwYWNlKG5hdGl2ZUVsZW1lbnQpLCAwKTtcbiAgICB9XG4gICAgaWYgKCFjaGFyUHJlc3NlZCkge1xuICAgICAgY29uc3QgY2hhckNvZGUgPSBldmVudC53aGljaCB8fCBldmVudC5rZXlDb2RlO1xuICAgICAgY2hhclByZXNzZWQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LndoaWNoIHx8IGV2ZW50LmtleUNvZGUpO1xuICAgICAgaWYgKCFldmVudC5zaGlmdEtleSAmJiBjaGFyQ29kZSA+PSA2NSAmJiBjaGFyQ29kZSA8PSA5MCkge1xuICAgICAgICBjaGFyUHJlc3NlZCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUgKyAzMik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChldmVudC5rZXlDb2RlID09PSBVdGlsc0tleUNvZGVDb25zdGFudC5FTlRFUiAmJiBldmVudC53YXNDbGljayAmJiBwb3MgPCAodGhpcy5zdGFydFBvcygpIHx8IDApKSB7XG4gICAgICBwb3MgPSB0aGlzLnN0YXJ0Tm9kZSgpLmxlbmd0aDtcbiAgICAgIHNldENhcmV0UG9zaXRpb24odGhpcy5zdGFydE5vZGUoKSwgcG9zLCB0aGlzLmlmcmFtZSgpKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy50cmlnZ2VyQ2hhcnMoKVtjaGFyUHJlc3NlZF07XG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgdGhpcy5hY3RpdmVDb25maWcuc2V0KGNvbmZpZyk7XG4gICAgICB0aGlzLnN0YXJ0UG9zLnNldChldmVudC5pbnB1dEV2ZW50ID8gcG9zIC0gMSA6IHBvcyk7XG4gICAgICB0aGlzLnN0YXJ0Tm9kZS5zZXQoZ2V0V2luZG93U2VsZWN0aW9uKHRoaXMuaWZyYW1lKCkpPy5hbmNob3JOb2RlKTtcbiAgICAgIHRoaXMuc2VhcmNoaW5nLnNldCh0cnVlKTtcbiAgICAgIHRoaXMuc2VhcmNoU3RyaW5nLnNldCgnJyk7XG4gICAgICB0aGlzLnNob3dTZWFyY2hMaXN0KG5hdGl2ZUVsZW1lbnQpO1xuICAgICAgdGhpcy51cGRhdGVTZWFyY2hMaXN0KCk7XG4gICAgICBpZiAoY29uZmlnLnJldHVyblRyaWdnZXIpIHtcbiAgICAgICAgdGhpcy5vdXRTZWFyY2hUZXJtLmVtaXQoY29uZmlnLnRyaWdnZXJDaGFyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW1TZXQgb2YgdGhpcy5ub2Rlc0luc2VydCgpKSB7XG4gICAgICAgIGlmICghbmF0aXZlRWxlbWVudC5jb250YWlucyhpdGVtU2V0LmVsZW1lbnRTcGFuKSkge1xuICAgICAgICAgIGl0ZW1TZXQuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHRoaXMubm9kZXNJbnNlcnQoKS5kZWxldGUoaXRlbVNldCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBzdGFydFBvcyA9IHRoaXMuc3RhcnRQb3MoKTtcbiAgICBpZiAoaXNOaWwoc3RhcnRQb3MpIHx8IHN0YXJ0UG9zIDwgMCB8fCAhdGhpcy5zZWFyY2hpbmcoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZWFyY2hMaXN0ID0gdGhpcy5zZWFyY2hMaXN0KCk7XG4gICAgaWYgKHBvcyA8PSBzdGFydFBvcykge1xuICAgICAgaWYgKHNlYXJjaExpc3QpIHtcbiAgICAgICAgc2VhcmNoTGlzdC5oaWRkZW4uc2V0KHRydWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gVXRpbHNLZXlDb2RlQ29uc3RhbnQuU0hJRlQgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBwb3MgPD0gc3RhcnRQb3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmFjdGl2ZUNvbmZpZygpPy5hbGxvd1NwYWNlICYmIGV2ZW50LmtleUNvZGUgPT09IFV0aWxzS2V5Q29kZUNvbnN0YW50LlNQQUNFKSB7XG4gICAgICB0aGlzLnN0YXJ0UG9zLnNldCgtMSk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXlDb2RlID09PSBVdGlsc0tleUNvZGVDb25zdGFudC5CQUNLU1BBQ0UgJiYgcG9zID4gMCkge1xuICAgICAgcG9zLS07XG4gICAgICBpZiAocG9zID09PSB0aGlzLnN0YXJ0UG9zKCkpIHtcbiAgICAgICAgdGhpcy5zdG9wU2VhcmNoKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzZWFyY2hMaXN0Py5oaWRkZW4oKSkge1xuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IFV0aWxzS2V5Q29kZUNvbnN0YW50LlRBQiB8fCBldmVudC5rZXlDb2RlID09PSBVdGlsc0tleUNvZGVDb25zdGFudC5FTlRFUikge1xuICAgICAgICB0aGlzLnN0b3BTZWFyY2goKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXNlYXJjaExpc3Q/LmhpZGRlbigpICYmIHRoaXMuYWN0aXZlQ29uZmlnKCkpIHtcbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBVdGlsc0tleUNvZGVDb25zdGFudC5UQUIgfHwgZXZlbnQua2V5Q29kZSA9PT0gVXRpbHNLZXlDb2RlQ29uc3RhbnQuRU5URVIpIHtcbiAgICAgICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICAvLyBlbWl0IHRoZSBzZWxlY3RlZCBsaXN0IGl0ZW1cbiAgICAgICAgdGhpcy5vdXRJdGVtU2VsZWN0ZWQuZW1pdChzZWFyY2hMaXN0Py5BY3RpdmVJdGVtKTtcbiAgICAgICAgLy8gb3B0aW9uYWwgZnVuY3Rpb24gdG8gZm9ybWF0IHRoZSBzZWxlY3RlZCBpdGVtIGJlZm9yZSBpbnNlcnRpbmcgdGhlIHRleHRcbiAgICAgICAgdGhpcy5pbnNlcnRNZW50aW9uKG5hdGl2ZUVsZW1lbnQsIHBvcyk7XG4gICAgICAgIC8vIGZpcmUgaW5wdXQgZXZlbnQgc28gYW5ndWxhciBiaW5kaW5ncyBhcmUgdXBkYXRlZFxuICAgICAgICBpZiAoJ0V2ZW50JyBpbiB3aW5kb3cpIHtcbiAgICAgICAgICAvLyB0aGlzIHNlZW1zIGJhY2t3YXJkcywgYnV0IGZpcmUgdGhlIGV2ZW50IGZyb20gdGhpcyBlbGVtZW50cyBuYXRpdmVFbGVtZW50IChub3QgdGhlXG4gICAgICAgICAgLy8gb25lIHByb3ZpZGVkIHRoYXQgbWF5IGJlIGluIGFuIGlmcmFtZSwgYXMgaXQgd29uJ3QgYmUgcHJvcG9nYXRlKVxuICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZXZlbnQgdXNpbmcgdGhlIG1vZGVybiBFdmVudCBjb25zdHJ1Y3RvclxuICAgICAgICAgIGNvbnN0IGV2dCA9IG5ldyBFdmVudCh0aGlzLmlmcmFtZSgpID8gJ2NoYW5nZScgOiAnaW5wdXQnLCB7XG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV2ZW50IG9uIHRoZSBuYXRpdmUgZWxlbWVudFxuICAgICAgICAgIG5hdGl2ZUVsZW1lbnQuZGlzcGF0Y2hFdmVudChldnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhcnRQb3Muc2V0KC0xKTtcbiAgICAgICAgdGhpcy5zdG9wU2VhcmNoKCk7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gVXRpbHNLZXlDb2RlQ29uc3RhbnQuRVNDQVBFKSB7XG4gICAgICAgIHRoaXMuc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgdGhpcy5zdG9wU2VhcmNoKCk7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IFV0aWxzS2V5Q29kZUNvbnN0YW50LkRPV05fQVJST1cpIHtcbiAgICAgICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICBzZWFyY2hMaXN0Py5hY3RpdmF0ZU5leHRJdGVtKCk7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IFV0aWxzS2V5Q29kZUNvbnN0YW50LlVQX0FSUk9XKSB7XG4gICAgICAgIHRoaXMuc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgc2VhcmNoTGlzdD8uYWN0aXZhdGVQcmV2aW91c0l0ZW0oKTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFyUHJlc3NlZC5sZW5ndGggIT09IDEgJiYgZXZlbnQua2V5Q29kZSAhPT0gVXRpbHNLZXlDb2RlQ29uc3RhbnQuQkFDS1NQQUNFKSB7XG4gICAgICB0aGlzLnN0b3BFdmVudChldmVudCk7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNlYXJjaGluZygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBtZW50aW9uID0gdmFsLnN1YnN0cmluZygodGhpcy5zdGFydFBvcygpIHx8IDApICsgMSwgcG9zKTtcblxuICAgIGlmIChldmVudC5rZXlDb2RlICE9PSBVdGlsc0tleUNvZGVDb25zdGFudC5CQUNLU1BBQ0UgJiYgIWV2ZW50LmlucHV0RXZlbnQpIHtcbiAgICAgIG1lbnRpb24gKz0gY2hhclByZXNzZWQ7XG4gICAgfVxuICAgIGNvbnN0IHNlYXJjaFN0cmluZyA9IG1lbnRpb24ucmVwbGFjZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCksICcgJykucmVwbGFjZShTdHJpbmcuZnJvbUNoYXJDb2RlKDApLCAnJyk7XG4gICAgdGhpcy5zZWFyY2hTdHJpbmcuc2V0KHNlYXJjaFN0cmluZy50cmltKCkpO1xuICAgIGNvbnN0IGxpbWl0U3BhY2VTZWFyY2hRdWVyeSA9IHRoaXMuYWN0aXZlQ29uZmlnKCk/LmxpbWl0U3BhY2VTZWFyY2hRdWVyeTtcbiAgICBpZiAobGltaXRTcGFjZVNlYXJjaFF1ZXJ5ICYmIHNlYXJjaFN0cmluZy5zcGxpdCgnICcpLmxlbmd0aCAtIDEgPiBsaW1pdFNwYWNlU2VhcmNoUXVlcnkpIHtcbiAgICAgIHRoaXMuc2VhcmNoU3RyaW5nLnNldCgnJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmFjdGl2ZUNvbmZpZygpPy5yZXR1cm5UcmlnZ2VyKSB7XG4gICAgICBjb25zdCB0cmlnZ2VyQ2hhciA9IHRoaXMuc2VhcmNoU3RyaW5nKCkgfHwgZXZlbnQua2V5Q29kZSA9PT0gVXRpbHNLZXlDb2RlQ29uc3RhbnQuQkFDS1NQQUNFID8gdmFsLnN1YnN0cmluZyh0aGlzLnN0YXJ0UG9zKCksICh0aGlzLnN0YXJ0UG9zKCkgfHwgMCkgKyAxKSA6ICcnO1xuXG4gICAgICB0aGlzLm91dFNlYXJjaFRlcm0uZW1pdCh0cmlnZ2VyQ2hhciArIHRoaXMuc2VhcmNoU3RyaW5nKCkpO1xuICAgICAgdGhpcy51cGRhdGVTZWFyY2hMaXN0KCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vdXRTZWFyY2hUZXJtLmVtaXQodGhpcy5zZWFyY2hTdHJpbmcoKSk7XG4gICAgdGhpcy51cGRhdGVTZWFyY2hMaXN0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckZvY3VzKGU/OiBFdmVudCwgbmF0aXZlRWxlbWVudDogSFRNTElucHV0RWxlbWVudCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XG4gICAgZT8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBub2RlID0gZ2V0V2luZG93U2VsZWN0aW9uKHRoaXMuaWZyYW1lKCkpPy5hbmNob3JOb2RlO1xuXG4gICAgICBpZiAobm9kZT8ubm9kZVR5cGUgIT09IDMpIHtcbiAgICAgICAgdGhpcy5zdG9wU2VhcmNoKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdGV4dEJlZm9yZUN1cnNvciA9IGdldFRleHRCZWZvcmVDdXJzb3IoKSB8fCAnJztcblxuICAgICAgY29uc3QgdHJpZ2dlckNoYXJzID0gT2JqZWN0LmtleXModGhpcy50cmlnZ2VyQ2hhcnMoKSkubWFwKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIGNvbmZpZzogdGhpcy50cmlnZ2VyQ2hhcnMoKVtrZXldLFxuICAgICAgICAgIGluZGV4OiB0ZXh0QmVmb3JlQ3Vyc29yLmxhc3RJbmRleE9mKGtleSksXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG1hdGNoaW5nQ2hhcmFjdGVycyA9IHRyaWdnZXJDaGFycy5yZWR1Y2UoKHByZSwgY3VycmVudCkgPT4gKHByZSAmJiBjdXJyZW50ICYmIGN1cnJlbnQuaW5kZXggPiBwcmUuaW5kZXggPyBjdXJyZW50IDogcHJlKSwgdHJpZ2dlckNoYXJzWzBdKTtcblxuICAgICAgaWYgKG1hdGNoaW5nQ2hhcmFjdGVycy5pbmRleCA8IDApIHtcbiAgICAgICAgdGhpcy5zdG9wU2VhcmNoKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VhcmNoID0gdGV4dEJlZm9yZUN1cnNvcj8uc3Vic3RyaW5nKG1hdGNoaW5nQ2hhcmFjdGVycy5pbmRleCwgdGV4dEJlZm9yZUN1cnNvci5sZW5ndGgpO1xuXG4gICAgICBpZiAoIXNlYXJjaCkge1xuICAgICAgICB0aGlzLnN0b3BTZWFyY2goKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBwb3MgPSBnZXRDYXJldFBvc2l0aW9uKG5hdGl2ZUVsZW1lbnQsIHRoaXMuaWZyYW1lKCkpO1xuXG4gICAgICB0aGlzLmFjdGl2ZUNvbmZpZy5zZXQobWF0Y2hpbmdDaGFyYWN0ZXJzLmNvbmZpZyk7XG4gICAgICB0aGlzLnN0YXJ0UG9zLnNldChwb3MgLSAodGV4dEJlZm9yZUN1cnNvci5sZW5ndGggLSBtYXRjaGluZ0NoYXJhY3RlcnMuaW5kZXgpKTtcbiAgICAgIHRoaXMuc2VhcmNoU3RyaW5nLnNldChzZWFyY2gucmVwbGFjZShtYXRjaGluZ0NoYXJhY3RlcnMua2V5LCAnJykpO1xuICAgICAgdGhpcy5zZWFyY2hpbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5oYW5kbGVyS2V5ZG93bih7IGtleUNvZGU6ICcnLmNoYXJDb2RlQXQoMCksIGlucHV0RXZlbnQ6IGZhbHNlIH0sIG5hdGl2ZUVsZW1lbnQpO1xuICAgICAgY29uc3QgZGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICBkaXZFbGVtZW50LnN0eWxlLndpZHRoID0gJ21heC1jb250ZW50JztcbiAgICAgIGRpdkVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgZGl2RWxlbWVudC5pbm5lclRleHQgPSBzZWFyY2g7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdkVsZW1lbnQpO1xuICAgICAgbGV0IGlmcmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmcmFtZSA9IHRoaXMubWVudGlvbkNvbmZpZygpPy5pZnJhbWUgPyAod2luZG93LnBhcmVudC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm1lbnRpb25Db25maWcoKT8uaWZyYW1lIGFzIHN0cmluZykgYXMgSFRNTElGcmFtZUVsZW1lbnQpIDogdW5kZWZpbmVkO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VhcmNoTGlzdCA9IHRoaXMuc2VhcmNoTGlzdCgpO1xuICAgICAgaWYgKHNlYXJjaExpc3QpIHtcbiAgICAgICAgc2VhcmNoTGlzdC5wb3NpdGlvbihuYXRpdmVFbGVtZW50LCBpZnJhbWUsIGRpdkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpO1xuICAgICAgfVxuICAgICAgZGl2RWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIG5hdGl2ZUVsZW1lbnQubm9ybWFsaXplKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BTZWFyY2goKSB7XG4gICAgY29uc3Qgc2VhcmNoTGlzdCA9IHRoaXMuc2VhcmNoTGlzdCgpO1xuICAgIGlmIChzZWFyY2hMaXN0ICYmICFzZWFyY2hMaXN0LmhpZGRlbigpKSB7XG4gICAgICBzZWFyY2hMaXN0LmhpZGRlbi5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLm91dFRvZ2dsZS5lbWl0KGZhbHNlKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmVDb25maWcuc2V0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5zZWFyY2hpbmcuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU2VhcmNoTGlzdCgpIHtcbiAgICBjb25zdCBtYXRjaGVzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IGFjdGl2ZUNvbmZpZyA9IHRoaXMuYWN0aXZlQ29uZmlnKCk7XG4gICAgY29uc3Qgc2VhcmNoU3RyaW5nID0gdGhpcy5zZWFyY2hTdHJpbmcoKTtcbiAgICBjb25zdCBzZWFyY2hMaXN0ID0gdGhpcy5zZWFyY2hMaXN0KCk7XG4gICAgLy8gZGlzYWJsaW5nIHRoZSBzZWFyY2ggcmVsaWVzIG9uIHRoZSBhc3luYyBvcGVyYXRpb24gdG8gZG8gdGhlIGZpbHRlcmluZ1xuICAgIGlmIChhY3RpdmVDb25maWc/Lml0ZW1zICYmICFhY3RpdmVDb25maWcuZGlzYWJsZVNlYXJjaCAmJiAhaXNOaWwoc2VhcmNoU3RyaW5nKSAmJiBhY3RpdmVDb25maWcubGFiZWxLZXkgJiYgYWN0aXZlQ29uZmlnLm1lbnRpb25GaWx0ZXIpIHtcbiAgICAgIG1hdGNoZXMucHVzaCguLi4oYWN0aXZlQ29uZmlnLm1lbnRpb25GaWx0ZXIoc2VhcmNoU3RyaW5nLCBhY3RpdmVDb25maWcuaXRlbXMpIGFzIGFueSkpO1xuICAgIH1cbiAgICAvLyB1cGRhdGUgdGhlIHNlYXJjaCBsaXN0XG4gICAgaWYgKCFzZWFyY2hMaXN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNlYXJjaExpc3QuaXRlbXMuc2V0KG1hdGNoZXMpO1xuICAgIHNlYXJjaExpc3QuaGlkZGVuLnNldCghbWF0Y2hlcy5sZW5ndGgpO1xuICAgIHNlYXJjaExpc3QuYWN0aXZlSW5kZXguc2V0KDApO1xuICAgIHNlYXJjaExpc3Quc2Nyb2xsQ29udGVudCgpO1xuICAgIHRoaXMub3V0VG9nZ2xlLmVtaXQoISFtYXRjaGVzLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIHNob3dTZWFyY2hMaXN0KG5hdGl2ZUVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICBsZXQgaWZyYW1lID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1lbnRpb25Db25maWcgPSB0aGlzLm1lbnRpb25Db25maWcoKTtcbiAgICB0cnkge1xuICAgICAgaWZyYW1lID0gbWVudGlvbkNvbmZpZz8uaWZyYW1lID8gKHdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobWVudGlvbkNvbmZpZz8uaWZyYW1lIGFzIHN0cmluZykgYXMgSFRNTElGcmFtZUVsZW1lbnQpIDogdW5kZWZpbmVkO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgfVxuICAgIGlmICghbWVudGlvbkNvbmZpZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm91dFRvZ2dsZS5lbWl0KHRydWUpO1xuICAgIGxldCBmaXJzdFRpbWUgPSBmYWxzZTtcblxuICAgIGlmICghdGhpcy5saXN0Q29tcG9uZW50UmVmKCkpIHtcbiAgICAgIGZpcnN0VGltZSA9IHRydWU7XG4gICAgICB0aGlzLmxpc3RDb21wb25lbnRSZWYuc2V0KHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoTGlic1VpQ29tcG9uZW50c0lucHV0c01lbnRpb25MaXN0Q29tcG9uZW50KSk7XG4gICAgICB0aGlzLnNlYXJjaExpc3Quc2V0KHRoaXMubGlzdENvbXBvbmVudFJlZigpPy5pbnN0YW5jZSk7XG4gICAgfVxuICAgIHRoaXMuc2VhcmNoTGlzdCgpPy5sYWJlbEtleS5zZXQodGhpcy5hY3RpdmVDb25maWcoKT8ubGFiZWxLZXkgfHwgJycpO1xuICAgIHRoaXMuc2VhcmNoTGlzdCgpPy5zdHlsZU9mZi5zZXQodGhpcy5tZW50aW9uQ29uZmlnKCk/LmRpc2FibGVTdHlsZSB8fCBmYWxzZSk7XG4gICAgdGhpcy5zZWFyY2hMaXN0KCk/LmFjdGl2ZUluZGV4LnNldCgwKTtcbiAgICB0aGlzLnNlYXJjaExpc3QoKT8uekluZGV4LnNldCh0aGlzLm1lbnRpb25Db25maWcoKT8uekluZGV4IHx8IDI1MDApO1xuICAgIHRoaXMuc2VhcmNoTGlzdCgpPy5pc0lmcmFtZS5zZXQoISFpZnJhbWUpO1xuICAgIHRoaXMuc2VhcmNoTGlzdCgpPy5saXN0VGVtcGxhdGUuc2V0KHRoaXMubWVudGlvbkxpc3RUZW1wbGF0ZSgpKTtcbiAgICB0aGlzLnNlYXJjaExpc3QoKT8ucGFyZW50SGFuZGxlcktleURvd24uc2V0KHRoaXMuaGFuZGxlcktleWRvd24uYmluZCh0aGlzKSk7XG4gICAgdGhpcy5zZWFyY2hMaXN0KCk/LnBvc2l0aW9uKG5hdGl2ZUVsZW1lbnQsIGlmcmFtZSk7XG4gICAgaWYgKGZpcnN0VGltZSAmJiB0aGlzLmxpc3RDb21wb25lbnRSZWYoKSkge1xuICAgICAgdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5hZGRUb0JvZHkodGhpcy5saXN0Q29tcG9uZW50UmVmKCksICEhaWZyYW1lKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lMaXN0U2VhcmNoKCkge1xuICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVtb3ZlKHRoaXMubGlzdENvbXBvbmVudFJlZiwgdGhpcy5pZnJhbWVJZCgpKTtcbiAgICB0aGlzLmxpc3RDb21wb25lbnRSZWYuc2V0KHVuZGVmaW5lZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBwZW5kRW1wdHlUb0xhc3ROb2RlKHBvc2l0aW9uOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyLCBuYXRpdmVFbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICBjb25zdCBlbXB0eSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdcXHUwMEEwJyk7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZ2V0V2luZG93U2VsZWN0aW9uKHRoaXMuaWZyYW1lKCkpO1xuICAgIGNvbnN0IGFuY2hvck5vZGUgPSBzZWxlY3Rpb24/LmFuY2hvck5vZGU7XG5cbiAgICBpZiAodGhpcy5pc0VkaXRvcigpKSB7XG4gICAgICBjb25zdCBwYXJlbnROb2RlID0gYW5jaG9yTm9kZT8ucGFyZW50Tm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICBpZiAocGFyZW50Tm9kZT8uZ2V0QXR0cmlidXRlPy4oJ2lkJykpIHtcbiAgICAgICAgaWYgKCFwYXJlbnROb2RlLm5leHRTaWJsaW5nPy50ZXh0Q29udGVudD8ubGVuZ3RoKSB7XG4gICAgICAgICAgcGFyZW50Tm9kZT8ucGFyZW50Tm9kZT8uaW5zZXJ0QmVmb3JlKGVtcHR5LCBwYXJlbnROb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICAgICAgICByYW5nZS5zZXRTdGFydChwYXJlbnROb2RlLm5leHRTaWJsaW5nIGFzIE5vZGUsIDApO1xuICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgc2VsPy5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgc2VsPy5hZGRSYW5nZShyYW5nZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHByZU5vZGUgPSBudWxsO1xuICAgIGNvbnN0IGFuY2hvck9mZnNldCA9IHNlbGVjdGlvbj8uYW5jaG9yT2Zmc2V0O1xuXG4gICAgaWYgKCFhbmNob3JOb2RlIHx8ICFhbmNob3JPZmZzZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYW5jaG9yTm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnI3RleHQnKSB7XG4gICAgICBuYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKGVtcHR5KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBBcnJheS5mcm9tKG5hdGl2ZUVsZW1lbnQuY2hpbGROb2RlcykpIHtcbiAgICAgIGlmIChhbmNob3JOb2RlLm5vZGVUeXBlID09PSAzICYmIGFuY2hvck5vZGUgPT09IG5vZGUgJiYgcHJlTm9kZT8uZ2V0QXR0cmlidXRlPy4oJ2lkJykgJiYgKCFhbmNob3JOb2RlLnRleHRDb250ZW50Py5sZW5ndGggfHwgYW5jaG9yTm9kZS50ZXh0Q29udGVudC5sZW5ndGggPT09IDEpICYmIHBvc2l0aW9uID09PSBsZW5ndGgpIHtcbiAgICAgICAgbmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChlbXB0eSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcHJlTm9kZSA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkTm9kZVplcm9XaWR0aFNwYWNlKG5hdGl2ZUVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQgPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgIGNvbnN0IGVtcHR5ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ1xcdTIwMGInKTtcbiAgICBsZXQgcHJlTm9kZSA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgQXJyYXkuZnJvbShuYXRpdmVFbGVtZW50LmNoaWxkTm9kZXMpKSB7XG4gICAgICBjb25zdCB0eXBlZE5vZGU6IGFueSA9IG5vZGU7XG5cbiAgICAgIGlmIChwcmVOb2RlPy5nZXRBdHRyaWJ1dGU/LignaWQnKSAmJiB0eXBlZE5vZGU/LmdldEF0dHJpYnV0ZT8uKCdpZCcpKSB7XG4gICAgICAgIG5hdGl2ZUVsZW1lbnQuaW5zZXJ0QmVmb3JlKGVtcHR5LCBwcmVOb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgIH1cblxuICAgICAgcHJlTm9kZSA9IHR5cGVkTm9kZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluc2VydE1lbnRpb24obmF0aXZlRWxlbWVudDogSFRNTElucHV0RWxlbWVudCwgcG9zOiBudW1iZXIpIHtcbiAgICBjb25zdCBhY3RpdmVDb25maWcgPSB0aGlzLmFjdGl2ZUNvbmZpZygpO1xuICAgIGlmICghYWN0aXZlQ29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNlYXJjaExpc3QgPSB0aGlzLnNlYXJjaExpc3QoKTtcbiAgICBsZXQgdGV4dCA9ICcnO1xuICAgIGNvbnN0IGZlSWQgPSB1dWlkKCk7XG4gICAgY29uc3QgaWQgPSBzZWFyY2hMaXN0Py5BY3RpdmVJdGVtLmlkIHx8IHV1aWQoKTtcbiAgICBjb25zdCBpdGVtQWN0aXZlID0gc2VhcmNoTGlzdD8uQWN0aXZlSXRlbTtcbiAgICBjb25zdCB7IHRyaWdnZXJDaGFyLCBtZW50aW9uRXZlbnROYW1lLCBtZW50aW9uQWN0aW9uQnlFdmVudCB9ID0gYWN0aXZlQ29uZmlnO1xuXG4gICAgaWYgKGFjdGl2ZUNvbmZpZy5tZW50aW9uU2VsZWN0KSB7XG4gICAgICB0ZXh0ID0gYWN0aXZlQ29uZmlnLm1lbnRpb25TZWxlY3Qoc2VhcmNoTGlzdD8uQWN0aXZlSXRlbSwgYWN0aXZlQ29uZmlnLnRyaWdnZXJDaGFyKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzRWRpdG9yKCkpIHtcbiAgICAgIGxldCBzcGFuOiBIVE1MU3BhbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdURVhUQVJFQScpO1xuXG4gICAgICBzcGFuLmlubmVyVGV4dCA9IHRleHQ7XG4gICAgICB0ZXh0ID0gc3Bhbi5pbm5lckhUTUw7XG4gICAgICBzcGFuLnJlbW92ZSgpO1xuICAgICAgdGV4dCA9IGJ1aWxkVGVtcGxhdGUodGV4dCwgaWQsIGZlSWQpO1xuICAgICAgc3BhbiA9IGluc2VydFZhbHVlKG5hdGl2ZUVsZW1lbnQsIHRoaXMuc3RhcnRQb3MoKSB8fCAwLCBwb3MsIHRleHQsIHRoaXMuaWZyYW1lKCkpIGFzIEhUTUxTcGFuRWxlbWVudDtcbiAgICAgIGlmIChzcGFuKSB7XG4gICAgICAgIGNvbnN0IGRhdGE6IElOb2RlSW5zZXJ0ID0ge1xuICAgICAgICAgIGVsZW1lbnRTcGFuOiBzcGFuLFxuICAgICAgICAgIHN1YnNjcmlwdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICAgIGl0ZW06IGl0ZW1BY3RpdmUsXG4gICAgICAgICAgdHJpZ2dlckNoYXI6IHRyaWdnZXJDaGFyLFxuICAgICAgICAgIG1hbnVhbEFkZDogdHJ1ZSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLm5vZGVzSW5zZXJ0KCkuYWRkKGRhdGEpO1xuICAgICAgICBpZiAobWVudGlvbkV2ZW50TmFtZSkge1xuICAgICAgICAgIGRhdGEuc3Vic2NyaXB0aW9uID0gZnJvbUV2ZW50PElFdmVudD4oc3BhbiwgbWVudGlvbkV2ZW50TmFtZSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICB0YXAoKGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCkpLFxuICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG1lbnRpb25BY3Rpb25CeUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgbWVudGlvbkFjdGlvbkJ5RXZlbnQoaXRlbUFjdGl2ZSwgdHJpZ2dlckNoYXIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFZGl0b3IgKHF1aWxsMngpOiBtZXJnZSBk4buvIGxp4buHdSBi4buVIHN1bmcgdOG7qyBjb25maWcgKHZkIGNoaXAgcGllY2VzKSB2w6BvIGRhdGEgYmxvdC5cbiAgICAgIGNvbnN0IGV4dHJhRGF0YSA9IGFjdGl2ZUNvbmZpZy5tZW50aW9uSW5zZXJ0RGF0YSA/IGFjdGl2ZUNvbmZpZy5tZW50aW9uSW5zZXJ0RGF0YShpdGVtQWN0aXZlKSA6IHt9O1xuXG4gICAgICB0aGlzLm91dEluc2VydE1lbnRpb24uZW1pdCh7IGRhdGE6IHsgLi4uZXh0cmFEYXRhLCBpZCwgdmFsdWU6IHRleHQsIGZlSWQgfSwgbGVuZ3RoS2V5OiBwb3MgLSAodGhpcy5zdGFydFBvcygpIHx8IDApIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveUxpc3RTZWFyY2goKTtcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgfVxufVxuIl19
|
|
@@ -7,6 +7,7 @@ import { tap, takeUntil as takeUntil$1 } from 'rxjs/operators';
|
|
|
7
7
|
import { NgTemplateOutlet } from '@angular/common';
|
|
8
8
|
import { LibsUiComponentsAvatarComponent } from '@libs-ui/components-avatar';
|
|
9
9
|
import { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';
|
|
10
|
+
import { LibsUiComponentsScrollOverlayDirective } from '@libs-ui/components-scroll-overlay';
|
|
10
11
|
|
|
11
12
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
12
13
|
const PATTERN_INSERT = '\ufeff';
|
|
@@ -443,6 +444,8 @@ class LibsUiComponentsInputsMentionListComponent {
|
|
|
443
444
|
listTemplate = signal(undefined);
|
|
444
445
|
/* VIEW CHILD */
|
|
445
446
|
elementEl = viewChild('elementRef');
|
|
447
|
+
// Vùng cuộn thực tế (scroll-overlay) — elementEl chỉ còn vai trò định vị/khung.
|
|
448
|
+
contentEl = viewChild('contentRef');
|
|
446
449
|
itemsEl = viewChildren('itemRef');
|
|
447
450
|
ngOnInit() {
|
|
448
451
|
if (this.isIframe()) {
|
|
@@ -561,7 +564,7 @@ class LibsUiComponentsInputsMentionListComponent {
|
|
|
561
564
|
}
|
|
562
565
|
scrollContent() {
|
|
563
566
|
setTimeout(() => {
|
|
564
|
-
const element = this.
|
|
567
|
+
const element = this.contentEl();
|
|
565
568
|
if (element?.nativeElement) {
|
|
566
569
|
element.nativeElement.scrollTop = 0;
|
|
567
570
|
}
|
|
@@ -572,11 +575,11 @@ class LibsUiComponentsInputsMentionListComponent {
|
|
|
572
575
|
this.onDestroy.complete();
|
|
573
576
|
}
|
|
574
577
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsMentionListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
575
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsMentionListComponent, isStandalone: true, selector: "libs_ui-components-inputs-mention-list", inputs: { labelKey: { classPropertyName: "labelKey", publicName: "labelKey", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, isIframe: { classPropertyName: "isIframe", publicName: "isIframe", isSignal: true, isRequired: true, transformFunction: null }, defaultAvatar: { classPropertyName: "defaultAvatar", publicName: "defaultAvatar", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { labelKey: "labelKeyChange", zIndex: "zIndexChange", isIframe: "isIframeChange", defaultAvatar: "defaultAvatarChange" }, viewQueries: [{ propertyName: "elementEl", first: true, predicate: ["elementRef"], descendants: true, isSignal: true }, { propertyName: "itemsEl", predicate: ["itemRef"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #elementRef\n class=\"libs-ui-mention-list\"\n [style.zIndex]=\"zIndex()\"\n [class.hidden]=\"hidden()\">\n @for (item of items(); track item) {\n
|
|
578
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsMentionListComponent, isStandalone: true, selector: "libs_ui-components-inputs-mention-list", inputs: { labelKey: { classPropertyName: "labelKey", publicName: "labelKey", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, isIframe: { classPropertyName: "isIframe", publicName: "isIframe", isSignal: true, isRequired: true, transformFunction: null }, defaultAvatar: { classPropertyName: "defaultAvatar", publicName: "defaultAvatar", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { labelKey: "labelKeyChange", zIndex: "zIndexChange", isIframe: "isIframeChange", defaultAvatar: "defaultAvatarChange" }, viewQueries: [{ propertyName: "elementEl", first: true, predicate: ["elementRef"], descendants: true, isSignal: true }, { propertyName: "contentEl", first: true, predicate: ["contentRef"], descendants: true, isSignal: true }, { propertyName: "itemsEl", predicate: ["itemRef"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Kh\u1ED1i ngo\u00E0i gi\u1EEF vai tr\u00F2 \u0111\u1ECBnh v\u1ECB (absolute theo caret) \u2014 v\u00F9ng cu\u1ED9n t\u00E1ch v\u00E0o content b\u00EAn trong \u0111\u1EC3\n scroll-overlay directive wrap content m\u00E0 kh\u00F4ng ph\u00E1 containing block c\u1EE7a positionElement(). -->\n<div\n #elementRef\n class=\"libs-ui-mention-list\"\n [style.zIndex]=\"zIndex()\"\n [class.hidden]=\"hidden()\">\n <div\n #contentRef\n class=\"libs-ui-mention-list-content\"\n LibsUiComponentsScrollOverlayDirective>\n @for (item of items(); track item) {\n <div\n #itemRef\n class=\"libs-ui-mention-list-item\"\n [class.libs-ui-mention-list-item-active]=\"$index === activeIndex()\"\n (mousedown)=\"handlerClick($event, $index)\"\n (mouseenter)=\"handleActiveItem($event, $index)\">\n @if (listTemplate()) {\n <ng-container\n [ngTemplateOutlet]=\"listTemplate()\"\n [ngTemplateOutletContext]=\"{ item: item, index: $index }\"></ng-container>\n } @else {\n <div class=\"px-[12px] py-[6px] flex items-center\">\n <libs_ui-components-avatar\n [size]=\"24\"\n [linkAvatar]=\"item.avatar\"\n [linkAvatarError]=\"defaultAvatar()\"\n [getLastTextAfterSpace]=\"true\"\n [textAvatar]=\"item.name\"\n [idGenColor]=\"item.id\" />\n <libs_ui-components-popover\n [classInclude]=\"'libs-ui-font-h5r'\"\n [type]=\"'text'\"\n [ignoreShowPopover]=\"true\"\n [config]=\"{ width: 250 }\">\n <!-- // ta.m \u1EA9n show tooltip v\u00EC ch\u01B0a x\u1EED l\u00FD \u0111c v\u1ECB tr\u00ED -->\n {{ item.name + ' (' + item.username + ')' }}\n </libs_ui-components-popover>\n </div>\n }\n </div>\n }\n </div>\n</div>\n", styles: [".libs-ui-mention-list{position:absolute;top:-999px;left:-9999px;z-index:1202;float:left;width:315px;padding:4px 0;background-color:#fff;border:solid 1px #e6e8ed;border-radius:5px;box-shadow:0 2px 10px 1px #3333331a}.libs-ui-mention-list .libs-ui-mention-list-content{max-height:180px}.libs-ui-mention-list .libs-ui-mention-list-item{background:#fff;cursor:pointer}.libs-ui-mention-list .libs-ui-mention-list-item:hover,.libs-ui-mention-list .libs-ui-mention-list-item-active{background-color:var(--libs-ui-color-light-3, #f4f8ff)}\n"], dependencies: [{ kind: "component", type: LibsUiComponentsAvatarComponent, selector: "libs_ui-components-avatar", inputs: ["typeShape", "classInclude", "size", "linkAvatar", "linkAvatarError", "classImageInclude", "zIndexPreviewImage", "clickPreviewImage", "idGenColor", "getLastTextAfterSpace", "textAvatar", "textAvatarClassInclude", "containerTextAvatarClassInclude"], outputs: ["outAvatarError", "outEventPreviewImage"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
576
579
|
}
|
|
577
580
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsMentionListComponent, decorators: [{
|
|
578
581
|
type: Component,
|
|
579
|
-
args: [{ selector: 'libs_ui-components-inputs-mention-list', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [LibsUiComponentsAvatarComponent, LibsUiComponentsPopoverComponent, NgTemplateOutlet], template: "<div\n #elementRef\n class=\"libs-ui-mention-list\"\n [style.zIndex]=\"zIndex()\"\n [class.hidden]=\"hidden()\">\n @for (item of items(); track item) {\n
|
|
582
|
+
args: [{ selector: 'libs_ui-components-inputs-mention-list', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [LibsUiComponentsAvatarComponent, LibsUiComponentsPopoverComponent, NgTemplateOutlet, LibsUiComponentsScrollOverlayDirective], template: "<!-- Kh\u1ED1i ngo\u00E0i gi\u1EEF vai tr\u00F2 \u0111\u1ECBnh v\u1ECB (absolute theo caret) \u2014 v\u00F9ng cu\u1ED9n t\u00E1ch v\u00E0o content b\u00EAn trong \u0111\u1EC3\n scroll-overlay directive wrap content m\u00E0 kh\u00F4ng ph\u00E1 containing block c\u1EE7a positionElement(). -->\n<div\n #elementRef\n class=\"libs-ui-mention-list\"\n [style.zIndex]=\"zIndex()\"\n [class.hidden]=\"hidden()\">\n <div\n #contentRef\n class=\"libs-ui-mention-list-content\"\n LibsUiComponentsScrollOverlayDirective>\n @for (item of items(); track item) {\n <div\n #itemRef\n class=\"libs-ui-mention-list-item\"\n [class.libs-ui-mention-list-item-active]=\"$index === activeIndex()\"\n (mousedown)=\"handlerClick($event, $index)\"\n (mouseenter)=\"handleActiveItem($event, $index)\">\n @if (listTemplate()) {\n <ng-container\n [ngTemplateOutlet]=\"listTemplate()\"\n [ngTemplateOutletContext]=\"{ item: item, index: $index }\"></ng-container>\n } @else {\n <div class=\"px-[12px] py-[6px] flex items-center\">\n <libs_ui-components-avatar\n [size]=\"24\"\n [linkAvatar]=\"item.avatar\"\n [linkAvatarError]=\"defaultAvatar()\"\n [getLastTextAfterSpace]=\"true\"\n [textAvatar]=\"item.name\"\n [idGenColor]=\"item.id\" />\n <libs_ui-components-popover\n [classInclude]=\"'libs-ui-font-h5r'\"\n [type]=\"'text'\"\n [ignoreShowPopover]=\"true\"\n [config]=\"{ width: 250 }\">\n <!-- // ta.m \u1EA9n show tooltip v\u00EC ch\u01B0a x\u1EED l\u00FD \u0111c v\u1ECB tr\u00ED -->\n {{ item.name + ' (' + item.username + ')' }}\n </libs_ui-components-popover>\n </div>\n }\n </div>\n }\n </div>\n</div>\n", styles: [".libs-ui-mention-list{position:absolute;top:-999px;left:-9999px;z-index:1202;float:left;width:315px;padding:4px 0;background-color:#fff;border:solid 1px #e6e8ed;border-radius:5px;box-shadow:0 2px 10px 1px #3333331a}.libs-ui-mention-list .libs-ui-mention-list-content{max-height:180px}.libs-ui-mention-list .libs-ui-mention-list-item{background:#fff;cursor:pointer}.libs-ui-mention-list .libs-ui-mention-list-item:hover,.libs-ui-mention-list .libs-ui-mention-list-item-active{background-color:var(--libs-ui-color-light-3, #f4f8ff)}\n"] }]
|
|
580
583
|
}] });
|
|
581
584
|
|
|
582
585
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
@@ -1056,7 +1059,9 @@ class LibsUiComponentsInputsMentionDirective {
|
|
|
1056
1059
|
}
|
|
1057
1060
|
}
|
|
1058
1061
|
else {
|
|
1059
|
-
|
|
1062
|
+
// Editor (quill2x): merge dữ liệu bổ sung từ config (vd chip pieces) vào data blot.
|
|
1063
|
+
const extraData = activeConfig.mentionInsertData ? activeConfig.mentionInsertData(itemActive) : {};
|
|
1064
|
+
this.outInsertMention.emit({ data: { ...extraData, id, value: text, feId }, lengthKey: pos - (this.startPos() || 0) });
|
|
1060
1065
|
}
|
|
1061
1066
|
}
|
|
1062
1067
|
ngOnDestroy() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libs-ui-components-inputs-mention.mjs","sources":["../../../../../../libs-ui/components/inputs/mention/src/defines/template.define.ts","../../../../../../libs-ui/components/inputs/mention/src/defines/utils.define.ts","../../../../../../libs-ui/components/inputs/mention/src/defines/caret-coords.define.ts","../../../../../../libs-ui/components/inputs/mention/src/list/list.component.ts","../../../../../../libs-ui/components/inputs/mention/src/list/list.component.html","../../../../../../libs-ui/components/inputs/mention/src/mention.directive.ts","../../../../../../libs-ui/components/inputs/mention/src/libs-ui-components-inputs-mention.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { deleteUnicode, get } from '@libs-ui/utils';\nimport { IMentionConfig } from '../interfaces/mention.interface';\nexport const PATTERN_INSERT = '\\ufeff';\n\nexport const buildTemplate = (value: string, id: string, feId: string): string => {\n return `<span class=\"libs-ui-components-mention-item\" style=\"font-weight: 600;-moz-osx-font-smoothing: grayscale;-webkit-font-smoothing: antialiased; color: #7239EA\" contenteditable=\"false\" id=\"${id}\" feId=\"${feId}\" value=\"${value}\">${value}</span> `;\n};\n\nexport const DEFAULT_CONFIG: IMentionConfig = {\n items: [],\n triggerChar: '@',\n labelKey: 'email',\n allowSpace: true,\n returnTrigger: false,\n limitSpaceSearchQuery: 3,\n mentionEventName: 'click',\n mentionActionByEvent: (item, trigger) => console.log(item, trigger),\n mentionSelect: (item) => `@${get(item, 'email')}`,\n mentionFilter: (search: string, items?: Array<unknown>) => {\n const searchString = deleteUnicode(search.toLowerCase());\n\n return items?.filter((item) => {\n const name = deleteUnicode(get<any>(item, 'name')?.toLowerCase() || '');\n const userName = deleteUnicode(get<any>(item, 'username')?.toLowerCase() || '');\n\n return name.includes(searchString) || userName.includes(searchString);\n });\n },\n};\n","import { get } from '@libs-ui/utils';\nimport { PATTERN_INSERT } from './template.define';\n\nconst setValue = (el: HTMLInputElement, value: string) => {\n if (isInputOrTextAreaElement(el)) {\n el.value = value;\n\n return;\n }\n el.textContent = value;\n};\n\nexport const getValue = (el: HTMLInputElement) => {\n return isInputOrTextAreaElement(el) ? el.value : el.textContent;\n};\n\nexport const insertValue = (el: HTMLInputElement, start: number, end: number, text: string, iframe: HTMLIFrameElement, noRecursion = false): ChildNode | undefined | null => {\n if (isTextElement(el)) {\n const val = getValue(el);\n\n text = noRecursion ? PATTERN_INSERT : text;\n setValue(el, val?.substring(0, start) + text + val?.substring(end, val.length));\n setCaretPosition(el, start + text.length, iframe);\n\n return;\n }\n if (noRecursion) {\n return;\n }\n\n return insertValueToContentEditable(start, end, text);\n};\n\nconst insertValueToContentEditable = (start: number, end: number, text: string): ChildNode | undefined | null => {\n if (!window.getSelection) {\n return;\n }\n const sel = window.getSelection();\n\n if (!sel?.anchorNode || !sel.getRangeAt || !sel.rangeCount) {\n return;\n }\n let range = sel.getRangeAt(0);\n const anchorNode = sel.anchorNode;\n const numberTextBeforeCursor = (getTextBeforeCursor() || '').length;\n\n range.setStart(anchorNode, numberTextBeforeCursor - (end - start));\n range.setEnd(anchorNode, numberTextBeforeCursor);\n range.deleteContents();\n // Range.createContextualFragment() would be useful here but is\n // only relatively recently standardized and is not supported in\n // some browsers (IE9, for one)\n const el = document.createElement('SPAN');\n\n el.innerHTML = text;\n const frag = document.createDocumentFragment();\n let node, lastNode, nodeHandlerEvent;\n\n while ((node = el.firstChild)) {\n if (get(node, 'getAttribute')) {\n nodeHandlerEvent = node;\n }\n\n lastNode = frag.appendChild(node);\n }\n range.insertNode(frag);\n\n // Preserve the selection\n if (lastNode) {\n range = range.cloneRange();\n range.setStartAfter(lastNode);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n\n return nodeHandlerEvent;\n};\n\nexport const getTextBeforeCursor = () => {\n const sel = window.getSelection();\n\n if (!sel?.anchorNode) {\n return undefined;\n }\n const range = sel.getRangeAt(0);\n const anchorNode = sel.anchorNode;\n const rangeNew = document.createRange();\n\n rangeNew.selectNodeContents(anchorNode);\n rangeNew.setEnd(range.startContainer, range.startOffset);\n\n const fragNew = rangeNew.cloneContents();\n const elmPrev = document.createElement('SPAN');\n\n elmPrev.appendChild(fragNew);\n\n return elmPrev.innerText;\n};\n\nexport const isInputOrTextAreaElement = (el: HTMLElement): boolean => {\n return el !== null && (el.nodeName === 'INPUT' || el.nodeName === 'TEXTAREA');\n};\n\nexport const isTextElement = (el: HTMLElement): boolean => {\n return el !== null && (el.nodeName === 'INPUT' || el.nodeName === 'TEXTAREA' || el.nodeName === '#text');\n};\n\nexport const setCaretPosition = (el: HTMLInputElement, pos: number, iframe: HTMLIFrameElement) => {\n if (isInputOrTextAreaElement(el) && el.selectionStart) {\n el.focus();\n el.setSelectionRange(pos, pos);\n\n return;\n }\n const range = getDocument(iframe)?.createRange();\n\n range?.setStart(el, pos);\n range?.collapse(true);\n const sel = getWindowSelection(iframe);\n\n if (!sel) {\n return;\n }\n sel.removeAllRanges();\n if (range) {\n sel.addRange(range);\n }\n};\n\nexport const getCaretPosition = (el: HTMLInputElement, iframe?: HTMLIFrameElement): number => {\n if (isInputOrTextAreaElement(el)) {\n const val = el.value;\n\n return val.slice(0, el.selectionStart || undefined).length;\n }\n const selObj = getWindowSelection(iframe);\n\n if (selObj && selObj.rangeCount > 0) {\n const selRange = selObj.getRangeAt(0);\n const preCaretRange = selRange.cloneRange();\n\n preCaretRange.selectNodeContents(el);\n preCaretRange.setEnd(selRange.endContainer, selRange.endOffset);\n const position = preCaretRange.toString().length;\n\n return position;\n }\n return 0;\n};\n\n// Based on ment.io functions...\n//\n\nconst getDocument = (iframe?: HTMLIFrameElement) => {\n if (!iframe) {\n return document;\n }\n\n return iframe.contentWindow?.document;\n};\n\nexport const getWindowSelection = (iframe?: HTMLIFrameElement): Selection | null => {\n if (!iframe) {\n return window.getSelection();\n }\n\n return iframe.contentWindow?.getSelection() || null;\n};\n\nexport const getContentEditableCaretCoords = (ctx: { iframe: HTMLIFrameElement | undefined; parent: Element | null; windowParent?: boolean }) => {\n const markerTextChar = '\\ufeff';\n const markerId = 'sel_' + new Date().getTime() + '_' + Math.random().toString().substring(2);\n const doc = getDocument(ctx.iframe) as Document;\n const sel = getWindowSelection(ctx.iframe) as Selection;\n\n if (!sel) {\n return {\n left: 0,\n top: 0,\n bottom: 0,\n };\n }\n const prevRange = sel.getRangeAt(0);\n\n // create new range and set postion using prevRange\n const range = doc.createRange();\n const anchorNode = sel.anchorNode as Node;\n range.setStart(anchorNode, prevRange.startOffset);\n range.setEnd(anchorNode, prevRange.startOffset);\n range.collapse(false);\n\n // Create the marker element containing a single invisible character\n // using DOM methods and insert it at the position in the range\n const markerEl = doc.createElement('span');\n\n markerEl.id = markerId;\n markerEl.appendChild(doc.createTextNode(markerTextChar));\n range.insertNode(markerEl);\n sel.removeAllRanges();\n sel.addRange(prevRange);\n\n const coordinates = {\n left: 0,\n top: markerEl.offsetHeight,\n bottom: -1,\n };\n\n localToRelativeCoordinates(ctx, markerEl, coordinates);\n markerEl.parentNode?.removeChild(markerEl);\n const widthScreen = (ctx.windowParent ? window.parent.innerWidth : window.innerWidth) || document.documentElement.clientWidth || document.body.clientWidth;\n\n if (coordinates.left + 315 > widthScreen) {\n coordinates.left = coordinates.left - 300;\n }\n const heightScreen = (ctx.windowParent ? window.parent.innerHeight : window.innerHeight) || document.documentElement.clientHeight || document.body.clientHeight;\n\n if (coordinates.top + 190 > heightScreen) {\n coordinates.bottom = heightScreen - coordinates.top + 15;\n coordinates.top = -1;\n }\n\n return coordinates;\n};\n\nconst localToRelativeCoordinates = (ctx: { iframe: HTMLIFrameElement | undefined; parent: Element | null; windowParent?: boolean }, element: Element, coordinates: { top: number; left: number; bottom: number }) => {\n let obj = <HTMLElement>element;\n let iframe = ctx ? ctx.iframe : null;\n\n while (obj) {\n if (ctx.parent !== null && ctx.parent === obj) {\n break;\n }\n coordinates.left += obj.offsetLeft + obj.clientLeft;\n coordinates.top += obj.offsetTop + obj.clientTop;\n obj = <HTMLElement>obj.offsetParent;\n if (!obj && iframe) {\n obj = iframe;\n iframe = null;\n }\n }\n obj = <HTMLElement>element;\n iframe = ctx ? ctx.iframe : null;\n while ((obj !== getDocument()?.body || ctx.windowParent) && obj !== null) {\n if (ctx.parent !== null && ctx.parent === obj) {\n break;\n }\n if (obj.scrollTop && obj.scrollTop > 0) {\n coordinates.top -= obj.scrollTop;\n }\n if (obj.scrollLeft && obj.scrollLeft > 0) {\n coordinates.left -= obj.scrollLeft;\n }\n obj = ctx.windowParent ? <HTMLElement>obj.offsetParent : <HTMLElement>obj.parentNode;\n if (!obj && iframe) {\n obj = iframe;\n iframe = null;\n }\n }\n};\n\nconst setEndOfContentEditable = (contentEditableElement: Node) => {\n if (document.createRange) {\n const range = document.createRange(); //Create a range (a range is a like the selection but invisible)\n const selection = window.getSelection(); //get the selection object (allows you to change selection)\n\n range.selectNodeContents(contentEditableElement); //Select the entire contents of the element with the range\n range.collapse(false); //collapse the range to the end point. false means collapse to end rather than the start\n selection?.removeAllRanges(); //remove any selections already made\n selection?.addRange(range); //make the range you have just created the visible selection\n }\n};\n\nexport const insertTextAtCaret = (element: HTMLInputElement, text: string) => {\n if (window.getSelection) {\n if (!elementContainsSelection(element)) {\n setEndOfContentEditable(element);\n insertTextAtCaret(element, text);\n\n return;\n }\n const sel = window.getSelection();\n\n if (sel?.getRangeAt && sel.rangeCount) {\n let range = sel.getRangeAt(0);\n const el = document.createElement('SPAN');\n\n range.deleteContents();\n el.innerHTML = text;\n const frag = document.createDocumentFragment();\n let node: Node | null;\n let lastNode!: Node;\n\n while ((node = el.firstChild)) {\n lastNode = frag.appendChild(node);\n }\n range.insertNode(frag);\n\n if (lastNode) {\n range = range.cloneRange();\n range.setStartAfter(lastNode);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n }\n }\n};\n\nconst elementContainsSelection = (el: HTMLInputElement) => {\n if (!window.getSelection) {\n return false;\n }\n const sel = window.getSelection();\n\n if (sel && sel.rangeCount > 0) {\n for (let i = 0; i < sel.rangeCount; ++i) {\n if (!isOrContains(sel.getRangeAt(i).commonAncestorContainer, el)) {\n return false;\n }\n }\n\n return true;\n }\n\n return false;\n};\n\nconst isOrContains = (node: Node, container: HTMLInputElement) => {\n while (node) {\n if (node === container) {\n return true;\n }\n if (node.parentNode) {\n node = node.parentNode;\n }\n }\n\n return false;\n};\n","/* From: https://github.com/component/textarea-caret-position */\n\nimport { PathOf } from '@libs-ui/interfaces-types';\nimport { get, isNil, set } from '@libs-ui/utils';\n\n// We'll copy the properties below into the mirror div.\n// Note that some browsers, such as Firefox, do not concatenate properties\n// into their shorthand (e.g. padding-top, padding-bottom etc. -> padding),\n// so we have to list every single property explicitly.\nconst properties = [\n 'direction', // RTL support\n 'boxSizing',\n 'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does\n 'height',\n 'overflowX',\n 'overflowY', // copy the scrollbar for IE\n\n 'borderTopWidth',\n 'borderRightWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n 'borderStyle',\n\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/font\n 'fontStyle',\n 'fontVariant',\n 'fontWeight',\n 'fontStretch',\n 'fontSize',\n 'fontSizeAdjust',\n 'lineHeight',\n 'fontFamily',\n\n 'textAlign',\n 'textTransform',\n 'textIndent',\n 'textDecoration', // might not make a difference, but better be safe\n\n 'letterSpacing',\n 'wordSpacing',\n\n 'tabSize',\n 'MozTabSize',\n];\n\nconst isBrowser = typeof window !== 'undefined';\nconst isFirefox = isBrowser && get(window, 'mozInnerScreenX') !== null;\n\nexport const getCaretCoordinates = (element: Element, position: number | null) => {\n if (!isBrowser) {\n throw new Error('textarea-caret-position#getCaretCoordinates should only be called in a browser');\n }\n\n // The mirror div will replicate the textarea's style\n const div: HTMLDivElement = document.createElement('div');\n\n div.id = 'input-textarea-caret-position-mirror-div';\n document.body.appendChild(div);\n\n const style = div.style;\n const computed = window.getComputedStyle ? window.getComputedStyle(element) : get(element, 'currentStyle'); // currentStyle for IE < 9\n const isInput = element.nodeName === 'INPUT';\n\n // Default textarea styles\n style.whiteSpace = 'pre-wrap';\n if (!isInput) {\n style.wordBreak = 'break-word';\n } // only for textarea-s\n\n // Position off-screen\n style.position = 'absolute'; // required to return coordinates properly\n\n // Transfer the element's properties to the div\n properties.forEach((prop) => {\n if (isInput && prop === 'lineHeight') {\n // Special case for <input>s because text is rendered centered and line height may be != height\n if (computed.boxSizing !== 'border-box') {\n style.lineHeight = computed.height;\n\n return;\n }\n const height = parseInt(computed.height);\n const outerHeight = parseInt(computed.paddingTop) + parseInt(computed.paddingBottom) + parseInt(computed.borderTopWidth) + parseInt(computed.borderBottomWidth);\n const targetHeight = outerHeight + parseInt(computed.lineHeight);\n\n if (height > targetHeight) {\n style.lineHeight = height - outerHeight + 'px';\n\n return;\n }\n if (height === targetHeight) {\n style.lineHeight = computed.lineHeight;\n\n return;\n }\n style.lineHeight = '0';\n\n return;\n }\n set(style, prop as PathOf<CSSStyleDeclaration>, computed[prop]);\n });\n\n if (!isFirefox) {\n style.overflow = 'hidden';\n // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275\n }\n const value = get(element, 'value');\n if (isFirefox && element.scrollHeight > parseInt(computed.height)) {\n style.overflowY = 'scroll';\n }\n div.textContent = value.substring(0, position);\n // The second special handling for input type=\"text\" vs textarea:\n // spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037\n if (isInput && !isNil(div.textContent)) {\n div.textContent = div.textContent.replace(/\\s/g, '\\u00a0');\n }\n const span = document.createElement('span');\n\n // Wrapping must be replicated *exactly*, including when a long word gets\n // onto the next line, with whitespace at the end of the line before (#7).\n // The *only* reliable way to do that is to copy the *entire* rest of the\n // textarea's content into the <span> created at the caret position.\n // For inputs, just '.' would be enough, but no need to bother.\n span.textContent = value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all\n div.appendChild(span);\n\n const coordinates = {\n top: span.offsetTop + parseInt(computed['borderTopWidth']),\n left: span.offsetLeft + parseInt(computed['borderLeftWidth']),\n height: parseInt(computed['lineHeight']),\n };\n\n document.body.removeChild(div);\n\n return coordinates;\n};\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ElementRef, model, OnDestroy, OnInit, signal, viewChild, viewChildren } from '@angular/core';\nimport { LibsUiComponentsAvatarComponent } from '@libs-ui/components-avatar';\nimport { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';\nimport { set, UtilsKeyCodeConstant } from '@libs-ui/utils';\nimport { fromEvent, Subject, takeUntil } from 'rxjs';\nimport { getCaretCoordinates } from '../defines/caret-coords.define';\nimport { getContentEditableCaretCoords, isInputOrTextAreaElement } from '../defines/utils.define';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-inputs-mention-list',\n templateUrl: './list.component.html',\n styleUrls: ['./list.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [LibsUiComponentsAvatarComponent, LibsUiComponentsPopoverComponent, NgTemplateOutlet],\n})\nexport class LibsUiComponentsInputsMentionListComponent implements OnInit, OnDestroy {\n // #region PROPERTY\n public items = signal<Array<Record<string, string | undefined>>>([]);\n public activeIndex = signal<number>(0);\n public hidden = signal<boolean>(false);\n public styleOff = signal<boolean>(false);\n public parentHandlerKeyDown = signal<((e: Event, element: HTMLInputElement | undefined) => unknown) | undefined>(undefined);\n\n protected dropUp = signal<boolean>(false);\n\n private readonly coords = signal<{ top: number; left: number; bottom?: number }>({ top: 0, left: 0, bottom: 0 });\n private readonly offset = signal<number>(0);\n private readonly nativeParentElement = signal<HTMLInputElement | undefined>(undefined);\n private readonly onDestroy = new Subject<void>();\n\n // #region INPUT\n labelKey = model<string>('label');\n zIndex = model<number>(1000);\n isIframe = model.required<boolean>();\n defaultAvatar = model<string>();\n listTemplate = signal<any>(undefined);\n\n /* VIEW CHILD */\n readonly elementEl = viewChild<ElementRef>('elementRef');\n readonly itemsEl = viewChildren<ElementRef>('itemRef');\n\n ngOnInit() {\n if (this.isIframe()) {\n this.initEvent(window.parent, 'wheel');\n this.initEvent(window.parent, 'resize');\n return;\n }\n this.initEvent(window, 'wheel');\n this.initEvent(window, 'resize');\n }\n\n /* FUNCTIONS */\n private initEvent(element: Window, eventName: string) {\n fromEvent<Event>(element, eventName)\n .pipe(takeUntil(this.onDestroy))\n .subscribe((event: Event) => {\n if (eventName === 'resize' || !this.elementEl()?.nativeElement.contains(event.target)) {\n this.handlerListenClose(event);\n }\n });\n }\n\n private handlerListenClose(event: Event) {\n if (event.target !== this.elementEl()?.nativeElement) {\n this.hidden.set(true);\n }\n }\n\n // lots of confusion here between relative coordinates and containers\n position(nativeParentElement: HTMLInputElement, iframe?: HTMLIFrameElement, leftDiv?: number): void {\n this.nativeParentElement.set(nativeParentElement);\n if (isInputOrTextAreaElement(nativeParentElement)) {\n // parent elements need to have postition:relative for this to work correctly?\n this.coords.set(getCaretCoordinates(nativeParentElement, nativeParentElement.selectionStart));\n this.coords.update((item) => ({\n ...item,\n top: nativeParentElement.offsetTop + item.top - nativeParentElement.scrollTop,\n left: nativeParentElement.offsetLeft + item.left - nativeParentElement.scrollLeft + nativeParentElement.getBoundingClientRect().left,\n }));\n\n // getCretCoordinates() for text/input elements needs an additional offset to position the list correctly\n this.offset.set(this.getBlockCursorDimensions(nativeParentElement).height);\n this.positionElement();\n return;\n }\n if (iframe) {\n const context: { iframe: HTMLIFrameElement; parent: Element | null; windowParent?: boolean } = { iframe: iframe, parent: window.parent.document.body, windowParent: true };\n const caretRelativeToView = getContentEditableCaretCoords(context);\n const doc = document.documentElement;\n const scrollLeft = (window.scrollX || doc.scrollLeft) - (doc.clientLeft || 0);\n this.coords.update((item) => ({\n ...item,\n left: caretRelativeToView.left - scrollLeft - (leftDiv || 0),\n bottom: window.parent.innerHeight - caretRelativeToView.top + 18,\n }));\n if (caretRelativeToView.bottom && caretRelativeToView.bottom !== -1) {\n this.coords.update((item) => ({\n ...item,\n bottom: caretRelativeToView.bottom,\n }));\n }\n this.positionElement();\n\n return;\n }\n const doc = document.documentElement;\n const scrollLeft = (window.scrollX || doc.scrollLeft) - (doc.clientLeft || 0);\n const scrollTop = (window.scrollX || doc.scrollTop) - (doc.clientTop || 0);\n // bounding rectangles are relative to view, offsets are relative to container?\n const caretRelativeToView = getContentEditableCaretCoords({ iframe, parent: null });\n\n this.coords.update((item) => ({\n ...item,\n top: caretRelativeToView.top - scrollTop + 10,\n left: caretRelativeToView.left - scrollLeft - (leftDiv || 0),\n bottom: caretRelativeToView.bottom,\n }));\n this.positionElement();\n }\n\n get ActiveItem() {\n return this.items()[this.activeIndex()];\n }\n\n protected handlerClick(event: Event, index: number) {\n event.stopPropagation();\n this.activeIndex.set(index);\n set(event as KeyboardEvent, 'keyCode', UtilsKeyCodeConstant.ENTER);\n this.parentHandlerKeyDown()?.(event, this.nativeParentElement());\n }\n\n activateNextItem() {\n this.activeIndex.set(this.items().length - 1 > this.activeIndex() ? this.activeIndex() + 1 : this.activeIndex());\n this.scrollToActive();\n }\n\n activatePreviousItem() {\n this.activeIndex.set(this.activeIndex() > 0 ? this.activeIndex() - 1 : this.activeIndex());\n this.scrollToActive();\n }\n\n private positionElement(left: number = this.coords().left, top: number = this.coords().top, dropUp: boolean = this.dropUp(), bottom: number = this.coords().bottom || 0) {\n const el = this.elementEl()?.nativeElement;\n\n top += dropUp ? 0 : this.offset(); // top of list is next line\n el.style.position = 'absolute';\n el.style.left = left + 'px';\n el.style.top = bottom !== -1 ? 'auto' : top + 'px';\n el.style.bottom = bottom === -1 ? 'auto' : bottom + 'px';\n this.nativeParentElement()?.normalize();\n }\n\n private getBlockCursorDimensions(nativeParentElement: HTMLInputElement) {\n const parentStyles = window.getComputedStyle(nativeParentElement);\n\n return {\n height: parseFloat(parentStyles.lineHeight),\n width: parseFloat(parentStyles.fontSize),\n };\n }\n\n protected handleActiveItem(event: Event, index: number) {\n event.stopPropagation();\n this.activeIndex.set(index);\n }\n\n private scrollToActive() {\n if (!this.itemsEl() || this.itemsEl().length <= this.activeIndex()) {\n return;\n }\n this.itemsEl()[this.activeIndex()].nativeElement.scrollIntoView();\n }\n\n scrollContent() {\n setTimeout(() => {\n const element = this.elementEl();\n if (element?.nativeElement) {\n element.nativeElement.scrollTop = 0;\n }\n });\n }\n\n ngOnDestroy(): void {\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","<div\n #elementRef\n class=\"libs-ui-mention-list\"\n [style.zIndex]=\"zIndex()\"\n [class.hidden]=\"hidden()\">\n @for (item of items(); track item) {\n <div\n #itemRef\n class=\"libs-ui-mention-list-item\"\n [class.libs-ui-mention-list-item-active]=\"$index === activeIndex()\"\n (mousedown)=\"handlerClick($event, $index)\"\n (mouseenter)=\"handleActiveItem($event, $index)\">\n @if (listTemplate()) {\n <ng-container\n [ngTemplateOutlet]=\"listTemplate()\"\n [ngTemplateOutletContext]=\"{ item: item, index: $index }\"></ng-container>\n } @else {\n <div class=\"px-[12px] py-[6px] flex items-center\">\n <libs_ui-components-avatar\n [size]=\"24\"\n [linkAvatar]=\"item.avatar\"\n [linkAvatarError]=\"defaultAvatar()\"\n [getLastTextAfterSpace]=\"true\"\n [textAvatar]=\"item.name\"\n [idGenColor]=\"item.id\" />\n <libs_ui-components-popover\n [classInclude]=\"'libs-ui-font-h5r'\"\n [type]=\"'text'\"\n [ignoreShowPopover]=\"true\"\n [config]=\"{ width: 250 }\">\n <!-- // ta.m ẩn show tooltip vì chưa xử lý đc vị trí -->\n {{ item.name + ' (' + item.username + ')' }}\n </libs_ui-components-popover>\n </div>\n }\n </div>\n }\n</div>\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AfterViewInit, ComponentRef, Directive, ElementRef, OnDestroy, TemplateRef, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { IEvent, TYPE_TEMPLATE_REF } from '@libs-ui/interfaces-types';\nimport { LibsUiDynamicComponentService } from '@libs-ui/services-dynamic-component';\nimport { UtilsKeyCodeConstant, get, isNil, uuid } from '@libs-ui/utils';\nimport { Subject, fromEvent } from 'rxjs';\nimport { takeUntil, tap } from 'rxjs/operators';\nimport { DEFAULT_CONFIG, buildTemplate } from './defines/template.define';\nimport { getCaretPosition, getTextBeforeCursor, getValue, getWindowSelection, insertTextAtCaret, insertValue, setCaretPosition } from './defines/utils.define';\nimport { IMentionConfig, IMentionFunctionControlEvent, IMentionInsert, INodeInsert } from './interfaces/mention.interface';\nimport { LibsUiComponentsInputsMentionListComponent } from './list/list.component';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[LibsUiComponentsInputsMentionDirective]',\n standalone: true,\n})\nexport class LibsUiComponentsInputsMentionDirective implements AfterViewInit, OnDestroy {\n // #region PROPERTY\n private readonly listComponentRef = signal<ComponentRef<LibsUiComponentsInputsMentionListComponent> | undefined>(undefined);\n private readonly nodesInsert = signal<Set<INodeInsert>>(new Set());\n private readonly activeConfig = signal<IMentionConfig | undefined>(undefined);\n private readonly triggerChars = signal<Record<string, IMentionConfig>>({});\n private readonly searchString = signal<string>('');\n private readonly startPos = signal<number | undefined>(undefined);\n private readonly startNode = signal<any>(undefined);\n private readonly searchList = signal<LibsUiComponentsInputsMentionListComponent | undefined>(undefined);\n private readonly searching = signal<boolean>(false);\n private readonly iframe = signal<any>(undefined);\n private readonly lastKeyCode = signal<number | undefined>(undefined);\n private readonly isEditor = signal<boolean>(false);\n private readonly iframeId = signal<string | undefined>(undefined);\n private readonly element = inject(ElementRef);\n private readonly dynamicComponentService = inject(LibsUiDynamicComponentService);\n private readonly onDestroy = new Subject<void>();\n\n // #region INPUT\n readonly timeDelayInit = input<number, number | undefined>(0, { transform: (val) => val ?? 0 });\n readonly mentionConfig = input<IMentionConfig>();\n readonly mentionListTemplate = input<TemplateRef<TYPE_TEMPLATE_REF>>();\n\n // #region OUTPUT\n readonly outSearchTerm = output<string | undefined>();\n readonly outItemSelected = output<unknown>();\n readonly outToggle = output<boolean>();\n readonly outInsertMention = output<IMentionInsert>();\n readonly outFunctionControl = output<IMentionFunctionControlEvent>();\n\n constructor() {\n effect(() => {\n this.mentionConfig();\n untracked(() => this.updateConfig());\n });\n }\n\n ngAfterViewInit(): void {\n setTimeout(() => {\n if (!this.mentionConfig()) {\n return;\n }\n const isContentEditable = this.element.nativeElement.getAttribute('contenteditable');\n this.isEditor.set(!isContentEditable);\n const element = !this.isEditor() ? this.element.nativeElement : this.element.nativeElement.querySelector('.ql-editor[contenteditable=\"true\"]');\n if (element) {\n element.addEventListener('keydown', (event: Event) => {\n this.handlerKeydown.bind(this)(event, element);\n });\n element.addEventListener('input', (event: InputEvent) => {\n this.handlerInput.bind(this)(event, element);\n });\n element.addEventListener('blur', (event: Event) => {\n this.handlerBlur.bind(this)(event);\n });\n element.addEventListener('click', (event: Event) => {\n this.handlerFocus.bind(this)(event, element);\n });\n }\n this.outFunctionControl.emit({\n addMention: () => {\n insertTextAtCaret(element, `${this.mentionConfig()?.triggerChar}`);\n setTimeout(() => {\n this.handlerKeydown({ key: this.mentionConfig()?.triggerChar, keyCode: UtilsKeyCodeConstant.BACKSPACE, shiftKey: true, inputEvent: true }, element);\n }, 500);\n },\n });\n }, this.timeDelayInit());\n }\n\n /* FUNCTIONS */\n protected updateConfig() {\n const mentionConfig = this.mentionConfig();\n if (!mentionConfig) {\n return;\n }\n this.triggerChars.set({});\n this.addConfig(mentionConfig);\n if (mentionConfig.mention) {\n mentionConfig.mention.forEach((config) => this.addConfig(config));\n }\n }\n\n private addConfig(config: IMentionConfig) {\n const defaults = { ...DEFAULT_CONFIG };\n const labelKey = config.labelKey || 'label';\n config = Object.assign(defaults, config);\n if (config.items && config.items.length > 0) {\n if (typeof config.items[0] === 'string') {\n config.items.forEach((label) => {\n const object: Record<string, Record<string, string | undefined>> = {};\n object[labelKey] = label;\n return object;\n });\n }\n if (labelKey) {\n // remove items without an labelKey (as it's required to filter the list)\n config.items = config.items.filter((e) => e[labelKey]);\n if (!config.disableSort) {\n config.items.sort((a, b) => (a[labelKey] || '').localeCompare(b[labelKey] || ''));\n }\n }\n }\n this.triggerChars.update((item) => ({\n ...item,\n [config.triggerChar || '@']: config,\n }));\n if (this.activeConfig() && this.activeConfig()?.triggerChar === config.triggerChar) {\n this.activeConfig.set(config);\n this.updateSearchList();\n }\n }\n\n protected setIframe(iframe: HTMLIFrameElement) {\n this.iframe.set(iframe);\n }\n\n private stopEvent(event: Event) {\n if (get<unknown>(event, 'wasClick')) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n }\n\n protected handlerBlur(event: Event) {\n setTimeout(() => {\n this.stopEvent(event);\n this.stopSearch();\n }, 100);\n }\n\n protected handlerInput(event: InputEvent, nativeElement: HTMLInputElement = this.element.nativeElement) {\n const data = get(event, 'data');\n if (this.lastKeyCode() === UtilsKeyCodeConstant.BUFFERED && data) {\n const keyCode = data.charCodeAt(0);\n this.handlerKeydown({ keyCode, inputEvent: true }, nativeElement);\n }\n }\n\n protected handlerKeydown(event: any, nativeElement: HTMLInputElement = this.element.nativeElement): any {\n this.lastKeyCode.set(event.keyCode);\n if (event.isComposing || event.keyCode === UtilsKeyCodeConstant.BUFFERED) {\n return;\n }\n\n const val: any = getValue(nativeElement);\n let pos: any = getCaretPosition(nativeElement, this.iframe());\n let charPressed = event.key;\n if (!this.isEditor()) {\n if (event.keyCode === UtilsKeyCodeConstant.BACKSPACE) {\n this.appendEmptyToLastNode(pos, val.length, nativeElement);\n }\n setTimeout(() => this.addNodeZeroWidthSpace(nativeElement), 0);\n }\n if (!charPressed) {\n const charCode = event.which || event.keyCode;\n charPressed = String.fromCharCode(event.which || event.keyCode);\n if (!event.shiftKey && charCode >= 65 && charCode <= 90) {\n charPressed = String.fromCharCode(charCode + 32);\n }\n }\n if (event.keyCode === UtilsKeyCodeConstant.ENTER && event.wasClick && pos < (this.startPos() || 0)) {\n pos = this.startNode().length;\n setCaretPosition(this.startNode(), pos, this.iframe());\n }\n const config = this.triggerChars()[charPressed];\n if (config) {\n this.activeConfig.set(config);\n this.startPos.set(event.inputEvent ? pos - 1 : pos);\n this.startNode.set(getWindowSelection(this.iframe())?.anchorNode);\n this.searching.set(true);\n this.searchString.set('');\n this.showSearchList(nativeElement);\n this.updateSearchList();\n if (config.returnTrigger) {\n this.outSearchTerm.emit(config.triggerChar);\n }\n return;\n }\n setTimeout(() => {\n for (const itemSet of this.nodesInsert()) {\n if (!nativeElement.contains(itemSet.elementSpan)) {\n itemSet.subscription?.unsubscribe();\n this.nodesInsert().delete(itemSet);\n }\n }\n });\n const startPos = this.startPos();\n if (isNil(startPos) || startPos < 0 || !this.searching()) {\n return;\n }\n const searchList = this.searchList();\n if (pos <= startPos) {\n if (searchList) {\n searchList.hidden.set(true);\n }\n return;\n }\n if (event.keyCode === UtilsKeyCodeConstant.SHIFT || event.metaKey || event.altKey || event.ctrlKey || pos <= startPos) {\n return;\n }\n if (!this.activeConfig()?.allowSpace && event.keyCode === UtilsKeyCodeConstant.SPACE) {\n this.startPos.set(-1);\n } else if (event.keyCode === UtilsKeyCodeConstant.BACKSPACE && pos > 0) {\n pos--;\n if (pos === this.startPos()) {\n this.stopSearch();\n }\n } else if (searchList?.hidden()) {\n if (event.keyCode === UtilsKeyCodeConstant.TAB || event.keyCode === UtilsKeyCodeConstant.ENTER) {\n this.stopSearch();\n return;\n }\n } else if (!searchList?.hidden() && this.activeConfig()) {\n if (event.keyCode === UtilsKeyCodeConstant.TAB || event.keyCode === UtilsKeyCodeConstant.ENTER) {\n this.stopEvent(event);\n // emit the selected list item\n this.outItemSelected.emit(searchList?.ActiveItem);\n // optional function to format the selected item before inserting the text\n this.insertMention(nativeElement, pos);\n // fire input event so angular bindings are updated\n if ('Event' in window) {\n // this seems backwards, but fire the event from this elements nativeElement (not the\n // one provided that may be in an iframe, as it won't be propogate)\n // Create the event using the modern Event constructor\n const evt = new Event(this.iframe() ? 'change' : 'input', {\n bubbles: true,\n cancelable: false,\n });\n // Dispatch the event on the native element\n nativeElement.dispatchEvent(evt);\n }\n this.startPos.set(-1);\n this.stopSearch();\n\n return false;\n }\n\n if (event.keyCode === UtilsKeyCodeConstant.ESCAPE) {\n this.stopEvent(event);\n this.stopSearch();\n\n return false;\n }\n if (event.keyCode === UtilsKeyCodeConstant.DOWN_ARROW) {\n this.stopEvent(event);\n searchList?.activateNextItem();\n\n return false;\n }\n if (event.keyCode === UtilsKeyCodeConstant.UP_ARROW) {\n this.stopEvent(event);\n searchList?.activatePreviousItem();\n\n return false;\n }\n }\n if (charPressed.length !== 1 && event.keyCode !== UtilsKeyCodeConstant.BACKSPACE) {\n this.stopEvent(event);\n\n return false;\n }\n if (!this.searching()) {\n return;\n }\n let mention = val.substring((this.startPos() || 0) + 1, pos);\n\n if (event.keyCode !== UtilsKeyCodeConstant.BACKSPACE && !event.inputEvent) {\n mention += charPressed;\n }\n const searchString = mention.replace(String.fromCharCode(160), ' ').replace(String.fromCharCode(0), '');\n this.searchString.set(searchString.trim());\n const limitSpaceSearchQuery = this.activeConfig()?.limitSpaceSearchQuery;\n if (limitSpaceSearchQuery && searchString.split(' ').length - 1 > limitSpaceSearchQuery) {\n this.searchString.set('');\n }\n if (this.activeConfig()?.returnTrigger) {\n const triggerChar = this.searchString() || event.keyCode === UtilsKeyCodeConstant.BACKSPACE ? val.substring(this.startPos(), (this.startPos() || 0) + 1) : '';\n\n this.outSearchTerm.emit(triggerChar + this.searchString());\n this.updateSearchList();\n\n return;\n }\n this.outSearchTerm.emit(this.searchString());\n this.updateSearchList();\n }\n\n protected handlerFocus(e?: Event, nativeElement: HTMLInputElement = this.element.nativeElement) {\n e?.stopPropagation();\n setTimeout(() => {\n const node = getWindowSelection(this.iframe())?.anchorNode;\n\n if (node?.nodeType !== 3) {\n this.stopSearch();\n\n return;\n }\n const textBeforeCursor = getTextBeforeCursor() || '';\n\n const triggerChars = Object.keys(this.triggerChars()).map((key: string) => {\n return {\n key: key,\n config: this.triggerChars()[key],\n index: textBeforeCursor.lastIndexOf(key),\n };\n });\n const matchingCharacters = triggerChars.reduce((pre, current) => (pre && current && current.index > pre.index ? current : pre), triggerChars[0]);\n\n if (matchingCharacters.index < 0) {\n this.stopSearch();\n\n return;\n }\n const search = textBeforeCursor?.substring(matchingCharacters.index, textBeforeCursor.length);\n\n if (!search) {\n this.stopSearch();\n\n return;\n }\n const pos = getCaretPosition(nativeElement, this.iframe());\n\n this.activeConfig.set(matchingCharacters.config);\n this.startPos.set(pos - (textBeforeCursor.length - matchingCharacters.index));\n this.searchString.set(search.replace(matchingCharacters.key, ''));\n this.searching.set(true);\n this.handlerKeydown({ keyCode: ''.charCodeAt(0), inputEvent: false }, nativeElement);\n const divElement = document.createElement('div');\n\n divElement.style.width = 'max-content';\n divElement.style.position = 'absolute';\n divElement.innerText = search;\n document.body.appendChild(divElement);\n let iframe = undefined;\n try {\n iframe = this.mentionConfig()?.iframe ? (window.parent.document.getElementById(this.mentionConfig()?.iframe as string) as HTMLIFrameElement) : undefined;\n } catch (error) {\n console.log(error);\n }\n const searchList = this.searchList();\n if (searchList) {\n searchList.position(nativeElement, iframe, divElement.getBoundingClientRect().width);\n }\n divElement.remove();\n nativeElement.normalize();\n });\n }\n\n private stopSearch() {\n const searchList = this.searchList();\n if (searchList && !searchList.hidden()) {\n searchList.hidden.set(true);\n this.outToggle.emit(false);\n }\n this.activeConfig.set(undefined);\n this.searching.set(false);\n }\n\n private updateSearchList() {\n const matches: any[] = [];\n const activeConfig = this.activeConfig();\n const searchString = this.searchString();\n const searchList = this.searchList();\n // disabling the search relies on the async operation to do the filtering\n if (activeConfig?.items && !activeConfig.disableSearch && !isNil(searchString) && activeConfig.labelKey && activeConfig.mentionFilter) {\n matches.push(...(activeConfig.mentionFilter(searchString, activeConfig.items) as any));\n }\n // update the search list\n if (!searchList) {\n return;\n }\n searchList.items.set(matches);\n searchList.hidden.set(!matches.length);\n searchList.activeIndex.set(0);\n searchList.scrollContent();\n this.outToggle.emit(!!matches.length);\n }\n\n private showSearchList(nativeElement: HTMLInputElement) {\n let iframe = undefined;\n const mentionConfig = this.mentionConfig();\n try {\n iframe = mentionConfig?.iframe ? (window.parent.document.getElementById(mentionConfig?.iframe as string) as HTMLIFrameElement) : undefined;\n } catch (error) {\n console.log(error);\n }\n if (!mentionConfig) {\n return;\n }\n this.outToggle.emit(true);\n let firstTime = false;\n\n if (!this.listComponentRef()) {\n firstTime = true;\n this.listComponentRef.set(this.dynamicComponentService.resolveComponentFactory(LibsUiComponentsInputsMentionListComponent));\n this.searchList.set(this.listComponentRef()?.instance);\n }\n this.searchList()?.labelKey.set(this.activeConfig()?.labelKey || '');\n this.searchList()?.styleOff.set(this.mentionConfig()?.disableStyle || false);\n this.searchList()?.activeIndex.set(0);\n this.searchList()?.zIndex.set(this.mentionConfig()?.zIndex || 2500);\n this.searchList()?.isIframe.set(!!iframe);\n this.searchList()?.listTemplate.set(this.mentionListTemplate());\n this.searchList()?.parentHandlerKeyDown.set(this.handlerKeydown.bind(this));\n this.searchList()?.position(nativeElement, iframe);\n if (firstTime && this.listComponentRef()) {\n this.dynamicComponentService.addToBody(this.listComponentRef(), !!iframe);\n }\n }\n\n private destroyListSearch() {\n this.dynamicComponentService.remove(this.listComponentRef, this.iframeId());\n this.listComponentRef.set(undefined);\n }\n\n protected appendEmptyToLastNode(position: number, length: number, nativeElement: HTMLInputElement = this.element.nativeElement) {\n const empty = document.createTextNode('\\u00A0');\n const selection = getWindowSelection(this.iframe());\n const anchorNode = selection?.anchorNode;\n\n if (this.isEditor()) {\n const parentNode = anchorNode?.parentNode as Element;\n\n if (parentNode?.getAttribute?.('id')) {\n if (!parentNode.nextSibling?.textContent?.length) {\n parentNode?.parentNode?.insertBefore(empty, parentNode.nextSibling);\n }\n const range = document.createRange();\n const sel = window.getSelection();\n\n range.setStart(parentNode.nextSibling as Node, 0);\n range.collapse(true);\n sel?.removeAllRanges();\n sel?.addRange(range);\n }\n\n return;\n }\n let preNode = null;\n const anchorOffset = selection?.anchorOffset;\n\n if (!anchorNode || !anchorOffset) {\n return;\n }\n\n if (anchorNode.nodeName.toLowerCase() !== '#text') {\n nativeElement.appendChild(empty);\n\n return;\n }\n\n for (const node of Array.from(nativeElement.childNodes)) {\n if (anchorNode.nodeType === 3 && anchorNode === node && preNode?.getAttribute?.('id') && (!anchorNode.textContent?.length || anchorNode.textContent.length === 1) && position === length) {\n nativeElement.appendChild(empty);\n break;\n }\n preNode = node as Element;\n }\n }\n\n protected addNodeZeroWidthSpace(nativeElement: HTMLInputElement = this.element.nativeElement) {\n const empty = document.createTextNode('\\u200b');\n let preNode = null;\n\n for (const node of Array.from(nativeElement.childNodes)) {\n const typedNode: any = node;\n\n if (preNode?.getAttribute?.('id') && typedNode?.getAttribute?.('id')) {\n nativeElement.insertBefore(empty, preNode.nextSibling);\n }\n\n preNode = typedNode;\n }\n }\n\n private insertMention(nativeElement: HTMLInputElement, pos: number) {\n const activeConfig = this.activeConfig();\n if (!activeConfig) {\n return;\n }\n const searchList = this.searchList();\n let text = '';\n const feId = uuid();\n const id = searchList?.ActiveItem.id || uuid();\n const itemActive = searchList?.ActiveItem;\n const { triggerChar, mentionEventName, mentionActionByEvent } = activeConfig;\n\n if (activeConfig.mentionSelect) {\n text = activeConfig.mentionSelect(searchList?.ActiveItem, activeConfig.triggerChar);\n }\n if (!this.isEditor()) {\n let span: HTMLSpanElement = document.createElement('TEXTAREA');\n\n span.innerText = text;\n text = span.innerHTML;\n span.remove();\n text = buildTemplate(text, id, feId);\n span = insertValue(nativeElement, this.startPos() || 0, pos, text, this.iframe()) as HTMLSpanElement;\n if (span) {\n const data: INodeInsert = {\n elementSpan: span,\n subscription: undefined,\n item: itemActive,\n triggerChar: triggerChar,\n manualAdd: true,\n };\n\n this.nodesInsert().add(data);\n if (mentionEventName) {\n data.subscription = fromEvent<IEvent>(span, mentionEventName)\n .pipe(\n tap((e) => e.stopPropagation()),\n takeUntil(this.onDestroy)\n )\n .subscribe(() => {\n if (mentionActionByEvent) {\n mentionActionByEvent(itemActive, triggerChar);\n }\n });\n }\n }\n } else {\n this.outInsertMention.emit({ data: { id, value: text, feId }, lengthKey: pos - (this.startPos() || 0) });\n }\n }\n\n ngOnDestroy(): void {\n this.destroyListSearch();\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["takeUntil"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"libs-ui-components-inputs-mention.mjs","sources":["../../../../../../libs-ui/components/inputs/mention/src/defines/template.define.ts","../../../../../../libs-ui/components/inputs/mention/src/defines/utils.define.ts","../../../../../../libs-ui/components/inputs/mention/src/defines/caret-coords.define.ts","../../../../../../libs-ui/components/inputs/mention/src/list/list.component.ts","../../../../../../libs-ui/components/inputs/mention/src/list/list.component.html","../../../../../../libs-ui/components/inputs/mention/src/mention.directive.ts","../../../../../../libs-ui/components/inputs/mention/src/libs-ui-components-inputs-mention.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { deleteUnicode, get } from '@libs-ui/utils';\nimport { IMentionConfig } from '../interfaces/mention.interface';\nexport const PATTERN_INSERT = '\\ufeff';\n\nexport const buildTemplate = (value: string, id: string, feId: string): string => {\n return `<span class=\"libs-ui-components-mention-item\" style=\"font-weight: 600;-moz-osx-font-smoothing: grayscale;-webkit-font-smoothing: antialiased; color: #7239EA\" contenteditable=\"false\" id=\"${id}\" feId=\"${feId}\" value=\"${value}\">${value}</span> `;\n};\n\nexport const DEFAULT_CONFIG: IMentionConfig = {\n items: [],\n triggerChar: '@',\n labelKey: 'email',\n allowSpace: true,\n returnTrigger: false,\n limitSpaceSearchQuery: 3,\n mentionEventName: 'click',\n mentionActionByEvent: (item, trigger) => console.log(item, trigger),\n mentionSelect: (item) => `@${get(item, 'email')}`,\n mentionFilter: (search: string, items?: Array<unknown>) => {\n const searchString = deleteUnicode(search.toLowerCase());\n\n return items?.filter((item) => {\n const name = deleteUnicode(get<any>(item, 'name')?.toLowerCase() || '');\n const userName = deleteUnicode(get<any>(item, 'username')?.toLowerCase() || '');\n\n return name.includes(searchString) || userName.includes(searchString);\n });\n },\n};\n","import { get } from '@libs-ui/utils';\nimport { PATTERN_INSERT } from './template.define';\n\nconst setValue = (el: HTMLInputElement, value: string) => {\n if (isInputOrTextAreaElement(el)) {\n el.value = value;\n\n return;\n }\n el.textContent = value;\n};\n\nexport const getValue = (el: HTMLInputElement) => {\n return isInputOrTextAreaElement(el) ? el.value : el.textContent;\n};\n\nexport const insertValue = (el: HTMLInputElement, start: number, end: number, text: string, iframe: HTMLIFrameElement, noRecursion = false): ChildNode | undefined | null => {\n if (isTextElement(el)) {\n const val = getValue(el);\n\n text = noRecursion ? PATTERN_INSERT : text;\n setValue(el, val?.substring(0, start) + text + val?.substring(end, val.length));\n setCaretPosition(el, start + text.length, iframe);\n\n return;\n }\n if (noRecursion) {\n return;\n }\n\n return insertValueToContentEditable(start, end, text);\n};\n\nconst insertValueToContentEditable = (start: number, end: number, text: string): ChildNode | undefined | null => {\n if (!window.getSelection) {\n return;\n }\n const sel = window.getSelection();\n\n if (!sel?.anchorNode || !sel.getRangeAt || !sel.rangeCount) {\n return;\n }\n let range = sel.getRangeAt(0);\n const anchorNode = sel.anchorNode;\n const numberTextBeforeCursor = (getTextBeforeCursor() || '').length;\n\n range.setStart(anchorNode, numberTextBeforeCursor - (end - start));\n range.setEnd(anchorNode, numberTextBeforeCursor);\n range.deleteContents();\n // Range.createContextualFragment() would be useful here but is\n // only relatively recently standardized and is not supported in\n // some browsers (IE9, for one)\n const el = document.createElement('SPAN');\n\n el.innerHTML = text;\n const frag = document.createDocumentFragment();\n let node, lastNode, nodeHandlerEvent;\n\n while ((node = el.firstChild)) {\n if (get(node, 'getAttribute')) {\n nodeHandlerEvent = node;\n }\n\n lastNode = frag.appendChild(node);\n }\n range.insertNode(frag);\n\n // Preserve the selection\n if (lastNode) {\n range = range.cloneRange();\n range.setStartAfter(lastNode);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n\n return nodeHandlerEvent;\n};\n\nexport const getTextBeforeCursor = () => {\n const sel = window.getSelection();\n\n if (!sel?.anchorNode) {\n return undefined;\n }\n const range = sel.getRangeAt(0);\n const anchorNode = sel.anchorNode;\n const rangeNew = document.createRange();\n\n rangeNew.selectNodeContents(anchorNode);\n rangeNew.setEnd(range.startContainer, range.startOffset);\n\n const fragNew = rangeNew.cloneContents();\n const elmPrev = document.createElement('SPAN');\n\n elmPrev.appendChild(fragNew);\n\n return elmPrev.innerText;\n};\n\nexport const isInputOrTextAreaElement = (el: HTMLElement): boolean => {\n return el !== null && (el.nodeName === 'INPUT' || el.nodeName === 'TEXTAREA');\n};\n\nexport const isTextElement = (el: HTMLElement): boolean => {\n return el !== null && (el.nodeName === 'INPUT' || el.nodeName === 'TEXTAREA' || el.nodeName === '#text');\n};\n\nexport const setCaretPosition = (el: HTMLInputElement, pos: number, iframe: HTMLIFrameElement) => {\n if (isInputOrTextAreaElement(el) && el.selectionStart) {\n el.focus();\n el.setSelectionRange(pos, pos);\n\n return;\n }\n const range = getDocument(iframe)?.createRange();\n\n range?.setStart(el, pos);\n range?.collapse(true);\n const sel = getWindowSelection(iframe);\n\n if (!sel) {\n return;\n }\n sel.removeAllRanges();\n if (range) {\n sel.addRange(range);\n }\n};\n\nexport const getCaretPosition = (el: HTMLInputElement, iframe?: HTMLIFrameElement): number => {\n if (isInputOrTextAreaElement(el)) {\n const val = el.value;\n\n return val.slice(0, el.selectionStart || undefined).length;\n }\n const selObj = getWindowSelection(iframe);\n\n if (selObj && selObj.rangeCount > 0) {\n const selRange = selObj.getRangeAt(0);\n const preCaretRange = selRange.cloneRange();\n\n preCaretRange.selectNodeContents(el);\n preCaretRange.setEnd(selRange.endContainer, selRange.endOffset);\n const position = preCaretRange.toString().length;\n\n return position;\n }\n return 0;\n};\n\n// Based on ment.io functions...\n//\n\nconst getDocument = (iframe?: HTMLIFrameElement) => {\n if (!iframe) {\n return document;\n }\n\n return iframe.contentWindow?.document;\n};\n\nexport const getWindowSelection = (iframe?: HTMLIFrameElement): Selection | null => {\n if (!iframe) {\n return window.getSelection();\n }\n\n return iframe.contentWindow?.getSelection() || null;\n};\n\nexport const getContentEditableCaretCoords = (ctx: { iframe: HTMLIFrameElement | undefined; parent: Element | null; windowParent?: boolean }) => {\n const markerTextChar = '\\ufeff';\n const markerId = 'sel_' + new Date().getTime() + '_' + Math.random().toString().substring(2);\n const doc = getDocument(ctx.iframe) as Document;\n const sel = getWindowSelection(ctx.iframe) as Selection;\n\n if (!sel) {\n return {\n left: 0,\n top: 0,\n bottom: 0,\n };\n }\n const prevRange = sel.getRangeAt(0);\n\n // create new range and set postion using prevRange\n const range = doc.createRange();\n const anchorNode = sel.anchorNode as Node;\n range.setStart(anchorNode, prevRange.startOffset);\n range.setEnd(anchorNode, prevRange.startOffset);\n range.collapse(false);\n\n // Create the marker element containing a single invisible character\n // using DOM methods and insert it at the position in the range\n const markerEl = doc.createElement('span');\n\n markerEl.id = markerId;\n markerEl.appendChild(doc.createTextNode(markerTextChar));\n range.insertNode(markerEl);\n sel.removeAllRanges();\n sel.addRange(prevRange);\n\n const coordinates = {\n left: 0,\n top: markerEl.offsetHeight,\n bottom: -1,\n };\n\n localToRelativeCoordinates(ctx, markerEl, coordinates);\n markerEl.parentNode?.removeChild(markerEl);\n const widthScreen = (ctx.windowParent ? window.parent.innerWidth : window.innerWidth) || document.documentElement.clientWidth || document.body.clientWidth;\n\n if (coordinates.left + 315 > widthScreen) {\n coordinates.left = coordinates.left - 300;\n }\n const heightScreen = (ctx.windowParent ? window.parent.innerHeight : window.innerHeight) || document.documentElement.clientHeight || document.body.clientHeight;\n\n if (coordinates.top + 190 > heightScreen) {\n coordinates.bottom = heightScreen - coordinates.top + 15;\n coordinates.top = -1;\n }\n\n return coordinates;\n};\n\nconst localToRelativeCoordinates = (ctx: { iframe: HTMLIFrameElement | undefined; parent: Element | null; windowParent?: boolean }, element: Element, coordinates: { top: number; left: number; bottom: number }) => {\n let obj = <HTMLElement>element;\n let iframe = ctx ? ctx.iframe : null;\n\n while (obj) {\n if (ctx.parent !== null && ctx.parent === obj) {\n break;\n }\n coordinates.left += obj.offsetLeft + obj.clientLeft;\n coordinates.top += obj.offsetTop + obj.clientTop;\n obj = <HTMLElement>obj.offsetParent;\n if (!obj && iframe) {\n obj = iframe;\n iframe = null;\n }\n }\n obj = <HTMLElement>element;\n iframe = ctx ? ctx.iframe : null;\n while ((obj !== getDocument()?.body || ctx.windowParent) && obj !== null) {\n if (ctx.parent !== null && ctx.parent === obj) {\n break;\n }\n if (obj.scrollTop && obj.scrollTop > 0) {\n coordinates.top -= obj.scrollTop;\n }\n if (obj.scrollLeft && obj.scrollLeft > 0) {\n coordinates.left -= obj.scrollLeft;\n }\n obj = ctx.windowParent ? <HTMLElement>obj.offsetParent : <HTMLElement>obj.parentNode;\n if (!obj && iframe) {\n obj = iframe;\n iframe = null;\n }\n }\n};\n\nconst setEndOfContentEditable = (contentEditableElement: Node) => {\n if (document.createRange) {\n const range = document.createRange(); //Create a range (a range is a like the selection but invisible)\n const selection = window.getSelection(); //get the selection object (allows you to change selection)\n\n range.selectNodeContents(contentEditableElement); //Select the entire contents of the element with the range\n range.collapse(false); //collapse the range to the end point. false means collapse to end rather than the start\n selection?.removeAllRanges(); //remove any selections already made\n selection?.addRange(range); //make the range you have just created the visible selection\n }\n};\n\nexport const insertTextAtCaret = (element: HTMLInputElement, text: string) => {\n if (window.getSelection) {\n if (!elementContainsSelection(element)) {\n setEndOfContentEditable(element);\n insertTextAtCaret(element, text);\n\n return;\n }\n const sel = window.getSelection();\n\n if (sel?.getRangeAt && sel.rangeCount) {\n let range = sel.getRangeAt(0);\n const el = document.createElement('SPAN');\n\n range.deleteContents();\n el.innerHTML = text;\n const frag = document.createDocumentFragment();\n let node: Node | null;\n let lastNode!: Node;\n\n while ((node = el.firstChild)) {\n lastNode = frag.appendChild(node);\n }\n range.insertNode(frag);\n\n if (lastNode) {\n range = range.cloneRange();\n range.setStartAfter(lastNode);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n }\n }\n};\n\nconst elementContainsSelection = (el: HTMLInputElement) => {\n if (!window.getSelection) {\n return false;\n }\n const sel = window.getSelection();\n\n if (sel && sel.rangeCount > 0) {\n for (let i = 0; i < sel.rangeCount; ++i) {\n if (!isOrContains(sel.getRangeAt(i).commonAncestorContainer, el)) {\n return false;\n }\n }\n\n return true;\n }\n\n return false;\n};\n\nconst isOrContains = (node: Node, container: HTMLInputElement) => {\n while (node) {\n if (node === container) {\n return true;\n }\n if (node.parentNode) {\n node = node.parentNode;\n }\n }\n\n return false;\n};\n","/* From: https://github.com/component/textarea-caret-position */\n\nimport { PathOf } from '@libs-ui/interfaces-types';\nimport { get, isNil, set } from '@libs-ui/utils';\n\n// We'll copy the properties below into the mirror div.\n// Note that some browsers, such as Firefox, do not concatenate properties\n// into their shorthand (e.g. padding-top, padding-bottom etc. -> padding),\n// so we have to list every single property explicitly.\nconst properties = [\n 'direction', // RTL support\n 'boxSizing',\n 'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does\n 'height',\n 'overflowX',\n 'overflowY', // copy the scrollbar for IE\n\n 'borderTopWidth',\n 'borderRightWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n 'borderStyle',\n\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/font\n 'fontStyle',\n 'fontVariant',\n 'fontWeight',\n 'fontStretch',\n 'fontSize',\n 'fontSizeAdjust',\n 'lineHeight',\n 'fontFamily',\n\n 'textAlign',\n 'textTransform',\n 'textIndent',\n 'textDecoration', // might not make a difference, but better be safe\n\n 'letterSpacing',\n 'wordSpacing',\n\n 'tabSize',\n 'MozTabSize',\n];\n\nconst isBrowser = typeof window !== 'undefined';\nconst isFirefox = isBrowser && get(window, 'mozInnerScreenX') !== null;\n\nexport const getCaretCoordinates = (element: Element, position: number | null) => {\n if (!isBrowser) {\n throw new Error('textarea-caret-position#getCaretCoordinates should only be called in a browser');\n }\n\n // The mirror div will replicate the textarea's style\n const div: HTMLDivElement = document.createElement('div');\n\n div.id = 'input-textarea-caret-position-mirror-div';\n document.body.appendChild(div);\n\n const style = div.style;\n const computed = window.getComputedStyle ? window.getComputedStyle(element) : get(element, 'currentStyle'); // currentStyle for IE < 9\n const isInput = element.nodeName === 'INPUT';\n\n // Default textarea styles\n style.whiteSpace = 'pre-wrap';\n if (!isInput) {\n style.wordBreak = 'break-word';\n } // only for textarea-s\n\n // Position off-screen\n style.position = 'absolute'; // required to return coordinates properly\n\n // Transfer the element's properties to the div\n properties.forEach((prop) => {\n if (isInput && prop === 'lineHeight') {\n // Special case for <input>s because text is rendered centered and line height may be != height\n if (computed.boxSizing !== 'border-box') {\n style.lineHeight = computed.height;\n\n return;\n }\n const height = parseInt(computed.height);\n const outerHeight = parseInt(computed.paddingTop) + parseInt(computed.paddingBottom) + parseInt(computed.borderTopWidth) + parseInt(computed.borderBottomWidth);\n const targetHeight = outerHeight + parseInt(computed.lineHeight);\n\n if (height > targetHeight) {\n style.lineHeight = height - outerHeight + 'px';\n\n return;\n }\n if (height === targetHeight) {\n style.lineHeight = computed.lineHeight;\n\n return;\n }\n style.lineHeight = '0';\n\n return;\n }\n set(style, prop as PathOf<CSSStyleDeclaration>, computed[prop]);\n });\n\n if (!isFirefox) {\n style.overflow = 'hidden';\n // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275\n }\n const value = get(element, 'value');\n if (isFirefox && element.scrollHeight > parseInt(computed.height)) {\n style.overflowY = 'scroll';\n }\n div.textContent = value.substring(0, position);\n // The second special handling for input type=\"text\" vs textarea:\n // spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037\n if (isInput && !isNil(div.textContent)) {\n div.textContent = div.textContent.replace(/\\s/g, '\\u00a0');\n }\n const span = document.createElement('span');\n\n // Wrapping must be replicated *exactly*, including when a long word gets\n // onto the next line, with whitespace at the end of the line before (#7).\n // The *only* reliable way to do that is to copy the *entire* rest of the\n // textarea's content into the <span> created at the caret position.\n // For inputs, just '.' would be enough, but no need to bother.\n span.textContent = value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all\n div.appendChild(span);\n\n const coordinates = {\n top: span.offsetTop + parseInt(computed['borderTopWidth']),\n left: span.offsetLeft + parseInt(computed['borderLeftWidth']),\n height: parseInt(computed['lineHeight']),\n };\n\n document.body.removeChild(div);\n\n return coordinates;\n};\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ElementRef, model, OnDestroy, OnInit, signal, viewChild, viewChildren } from '@angular/core';\nimport { LibsUiComponentsAvatarComponent } from '@libs-ui/components-avatar';\nimport { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';\nimport { LibsUiComponentsScrollOverlayDirective } from '@libs-ui/components-scroll-overlay';\nimport { set, UtilsKeyCodeConstant } from '@libs-ui/utils';\nimport { fromEvent, Subject, takeUntil } from 'rxjs';\nimport { getCaretCoordinates } from '../defines/caret-coords.define';\nimport { getContentEditableCaretCoords, isInputOrTextAreaElement } from '../defines/utils.define';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-inputs-mention-list',\n templateUrl: './list.component.html',\n styleUrls: ['./list.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [LibsUiComponentsAvatarComponent, LibsUiComponentsPopoverComponent, NgTemplateOutlet, LibsUiComponentsScrollOverlayDirective],\n})\nexport class LibsUiComponentsInputsMentionListComponent implements OnInit, OnDestroy {\n // #region PROPERTY\n public items = signal<Array<Record<string, string | undefined>>>([]);\n public activeIndex = signal<number>(0);\n public hidden = signal<boolean>(false);\n public styleOff = signal<boolean>(false);\n public parentHandlerKeyDown = signal<((e: Event, element: HTMLInputElement | undefined) => unknown) | undefined>(undefined);\n\n protected dropUp = signal<boolean>(false);\n\n private readonly coords = signal<{ top: number; left: number; bottom?: number }>({ top: 0, left: 0, bottom: 0 });\n private readonly offset = signal<number>(0);\n private readonly nativeParentElement = signal<HTMLInputElement | undefined>(undefined);\n private readonly onDestroy = new Subject<void>();\n\n // #region INPUT\n labelKey = model<string>('label');\n zIndex = model<number>(1000);\n isIframe = model.required<boolean>();\n defaultAvatar = model<string>();\n listTemplate = signal<any>(undefined);\n\n /* VIEW CHILD */\n readonly elementEl = viewChild<ElementRef>('elementRef');\n // Vùng cuộn thực tế (scroll-overlay) — elementEl chỉ còn vai trò định vị/khung.\n readonly contentEl = viewChild<ElementRef>('contentRef');\n readonly itemsEl = viewChildren<ElementRef>('itemRef');\n\n ngOnInit() {\n if (this.isIframe()) {\n this.initEvent(window.parent, 'wheel');\n this.initEvent(window.parent, 'resize');\n return;\n }\n this.initEvent(window, 'wheel');\n this.initEvent(window, 'resize');\n }\n\n /* FUNCTIONS */\n private initEvent(element: Window, eventName: string) {\n fromEvent<Event>(element, eventName)\n .pipe(takeUntil(this.onDestroy))\n .subscribe((event: Event) => {\n if (eventName === 'resize' || !this.elementEl()?.nativeElement.contains(event.target)) {\n this.handlerListenClose(event);\n }\n });\n }\n\n private handlerListenClose(event: Event) {\n if (event.target !== this.elementEl()?.nativeElement) {\n this.hidden.set(true);\n }\n }\n\n // lots of confusion here between relative coordinates and containers\n position(nativeParentElement: HTMLInputElement, iframe?: HTMLIFrameElement, leftDiv?: number): void {\n this.nativeParentElement.set(nativeParentElement);\n if (isInputOrTextAreaElement(nativeParentElement)) {\n // parent elements need to have postition:relative for this to work correctly?\n this.coords.set(getCaretCoordinates(nativeParentElement, nativeParentElement.selectionStart));\n this.coords.update((item) => ({\n ...item,\n top: nativeParentElement.offsetTop + item.top - nativeParentElement.scrollTop,\n left: nativeParentElement.offsetLeft + item.left - nativeParentElement.scrollLeft + nativeParentElement.getBoundingClientRect().left,\n }));\n\n // getCretCoordinates() for text/input elements needs an additional offset to position the list correctly\n this.offset.set(this.getBlockCursorDimensions(nativeParentElement).height);\n this.positionElement();\n return;\n }\n if (iframe) {\n const context: { iframe: HTMLIFrameElement; parent: Element | null; windowParent?: boolean } = { iframe: iframe, parent: window.parent.document.body, windowParent: true };\n const caretRelativeToView = getContentEditableCaretCoords(context);\n const doc = document.documentElement;\n const scrollLeft = (window.scrollX || doc.scrollLeft) - (doc.clientLeft || 0);\n this.coords.update((item) => ({\n ...item,\n left: caretRelativeToView.left - scrollLeft - (leftDiv || 0),\n bottom: window.parent.innerHeight - caretRelativeToView.top + 18,\n }));\n if (caretRelativeToView.bottom && caretRelativeToView.bottom !== -1) {\n this.coords.update((item) => ({\n ...item,\n bottom: caretRelativeToView.bottom,\n }));\n }\n this.positionElement();\n\n return;\n }\n const doc = document.documentElement;\n const scrollLeft = (window.scrollX || doc.scrollLeft) - (doc.clientLeft || 0);\n const scrollTop = (window.scrollX || doc.scrollTop) - (doc.clientTop || 0);\n // bounding rectangles are relative to view, offsets are relative to container?\n const caretRelativeToView = getContentEditableCaretCoords({ iframe, parent: null });\n\n this.coords.update((item) => ({\n ...item,\n top: caretRelativeToView.top - scrollTop + 10,\n left: caretRelativeToView.left - scrollLeft - (leftDiv || 0),\n bottom: caretRelativeToView.bottom,\n }));\n this.positionElement();\n }\n\n get ActiveItem() {\n return this.items()[this.activeIndex()];\n }\n\n protected handlerClick(event: Event, index: number) {\n event.stopPropagation();\n this.activeIndex.set(index);\n set(event as KeyboardEvent, 'keyCode', UtilsKeyCodeConstant.ENTER);\n this.parentHandlerKeyDown()?.(event, this.nativeParentElement());\n }\n\n activateNextItem() {\n this.activeIndex.set(this.items().length - 1 > this.activeIndex() ? this.activeIndex() + 1 : this.activeIndex());\n this.scrollToActive();\n }\n\n activatePreviousItem() {\n this.activeIndex.set(this.activeIndex() > 0 ? this.activeIndex() - 1 : this.activeIndex());\n this.scrollToActive();\n }\n\n private positionElement(left: number = this.coords().left, top: number = this.coords().top, dropUp: boolean = this.dropUp(), bottom: number = this.coords().bottom || 0) {\n const el = this.elementEl()?.nativeElement;\n\n top += dropUp ? 0 : this.offset(); // top of list is next line\n el.style.position = 'absolute';\n el.style.left = left + 'px';\n el.style.top = bottom !== -1 ? 'auto' : top + 'px';\n el.style.bottom = bottom === -1 ? 'auto' : bottom + 'px';\n this.nativeParentElement()?.normalize();\n }\n\n private getBlockCursorDimensions(nativeParentElement: HTMLInputElement) {\n const parentStyles = window.getComputedStyle(nativeParentElement);\n\n return {\n height: parseFloat(parentStyles.lineHeight),\n width: parseFloat(parentStyles.fontSize),\n };\n }\n\n protected handleActiveItem(event: Event, index: number) {\n event.stopPropagation();\n this.activeIndex.set(index);\n }\n\n private scrollToActive() {\n if (!this.itemsEl() || this.itemsEl().length <= this.activeIndex()) {\n return;\n }\n this.itemsEl()[this.activeIndex()].nativeElement.scrollIntoView();\n }\n\n scrollContent() {\n setTimeout(() => {\n const element = this.contentEl();\n if (element?.nativeElement) {\n element.nativeElement.scrollTop = 0;\n }\n });\n }\n\n ngOnDestroy(): void {\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","<!-- Khối ngoài giữ vai trò định vị (absolute theo caret) — vùng cuộn tách vào content bên trong để\n scroll-overlay directive wrap content mà không phá containing block của positionElement(). -->\n<div\n #elementRef\n class=\"libs-ui-mention-list\"\n [style.zIndex]=\"zIndex()\"\n [class.hidden]=\"hidden()\">\n <div\n #contentRef\n class=\"libs-ui-mention-list-content\"\n LibsUiComponentsScrollOverlayDirective>\n @for (item of items(); track item) {\n <div\n #itemRef\n class=\"libs-ui-mention-list-item\"\n [class.libs-ui-mention-list-item-active]=\"$index === activeIndex()\"\n (mousedown)=\"handlerClick($event, $index)\"\n (mouseenter)=\"handleActiveItem($event, $index)\">\n @if (listTemplate()) {\n <ng-container\n [ngTemplateOutlet]=\"listTemplate()\"\n [ngTemplateOutletContext]=\"{ item: item, index: $index }\"></ng-container>\n } @else {\n <div class=\"px-[12px] py-[6px] flex items-center\">\n <libs_ui-components-avatar\n [size]=\"24\"\n [linkAvatar]=\"item.avatar\"\n [linkAvatarError]=\"defaultAvatar()\"\n [getLastTextAfterSpace]=\"true\"\n [textAvatar]=\"item.name\"\n [idGenColor]=\"item.id\" />\n <libs_ui-components-popover\n [classInclude]=\"'libs-ui-font-h5r'\"\n [type]=\"'text'\"\n [ignoreShowPopover]=\"true\"\n [config]=\"{ width: 250 }\">\n <!-- // ta.m ẩn show tooltip vì chưa xử lý đc vị trí -->\n {{ item.name + ' (' + item.username + ')' }}\n </libs_ui-components-popover>\n </div>\n }\n </div>\n }\n </div>\n</div>\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AfterViewInit, ComponentRef, Directive, ElementRef, OnDestroy, TemplateRef, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { IEvent, TYPE_TEMPLATE_REF } from '@libs-ui/interfaces-types';\nimport { LibsUiDynamicComponentService } from '@libs-ui/services-dynamic-component';\nimport { UtilsKeyCodeConstant, get, isNil, uuid } from '@libs-ui/utils';\nimport { Subject, fromEvent } from 'rxjs';\nimport { takeUntil, tap } from 'rxjs/operators';\nimport { DEFAULT_CONFIG, buildTemplate } from './defines/template.define';\nimport { getCaretPosition, getTextBeforeCursor, getValue, getWindowSelection, insertTextAtCaret, insertValue, setCaretPosition } from './defines/utils.define';\nimport { IMentionConfig, IMentionFunctionControlEvent, IMentionInsert, INodeInsert } from './interfaces/mention.interface';\nimport { LibsUiComponentsInputsMentionListComponent } from './list/list.component';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[LibsUiComponentsInputsMentionDirective]',\n standalone: true,\n})\nexport class LibsUiComponentsInputsMentionDirective implements AfterViewInit, OnDestroy {\n // #region PROPERTY\n private readonly listComponentRef = signal<ComponentRef<LibsUiComponentsInputsMentionListComponent> | undefined>(undefined);\n private readonly nodesInsert = signal<Set<INodeInsert>>(new Set());\n private readonly activeConfig = signal<IMentionConfig | undefined>(undefined);\n private readonly triggerChars = signal<Record<string, IMentionConfig>>({});\n private readonly searchString = signal<string>('');\n private readonly startPos = signal<number | undefined>(undefined);\n private readonly startNode = signal<any>(undefined);\n private readonly searchList = signal<LibsUiComponentsInputsMentionListComponent | undefined>(undefined);\n private readonly searching = signal<boolean>(false);\n private readonly iframe = signal<any>(undefined);\n private readonly lastKeyCode = signal<number | undefined>(undefined);\n private readonly isEditor = signal<boolean>(false);\n private readonly iframeId = signal<string | undefined>(undefined);\n private readonly element = inject(ElementRef);\n private readonly dynamicComponentService = inject(LibsUiDynamicComponentService);\n private readonly onDestroy = new Subject<void>();\n\n // #region INPUT\n readonly timeDelayInit = input<number, number | undefined>(0, { transform: (val) => val ?? 0 });\n readonly mentionConfig = input<IMentionConfig>();\n readonly mentionListTemplate = input<TemplateRef<TYPE_TEMPLATE_REF>>();\n\n // #region OUTPUT\n readonly outSearchTerm = output<string | undefined>();\n readonly outItemSelected = output<unknown>();\n readonly outToggle = output<boolean>();\n readonly outInsertMention = output<IMentionInsert>();\n readonly outFunctionControl = output<IMentionFunctionControlEvent>();\n\n constructor() {\n effect(() => {\n this.mentionConfig();\n untracked(() => this.updateConfig());\n });\n }\n\n ngAfterViewInit(): void {\n setTimeout(() => {\n if (!this.mentionConfig()) {\n return;\n }\n const isContentEditable = this.element.nativeElement.getAttribute('contenteditable');\n this.isEditor.set(!isContentEditable);\n const element = !this.isEditor() ? this.element.nativeElement : this.element.nativeElement.querySelector('.ql-editor[contenteditable=\"true\"]');\n if (element) {\n element.addEventListener('keydown', (event: Event) => {\n this.handlerKeydown.bind(this)(event, element);\n });\n element.addEventListener('input', (event: InputEvent) => {\n this.handlerInput.bind(this)(event, element);\n });\n element.addEventListener('blur', (event: Event) => {\n this.handlerBlur.bind(this)(event);\n });\n element.addEventListener('click', (event: Event) => {\n this.handlerFocus.bind(this)(event, element);\n });\n }\n this.outFunctionControl.emit({\n addMention: () => {\n insertTextAtCaret(element, `${this.mentionConfig()?.triggerChar}`);\n setTimeout(() => {\n this.handlerKeydown({ key: this.mentionConfig()?.triggerChar, keyCode: UtilsKeyCodeConstant.BACKSPACE, shiftKey: true, inputEvent: true }, element);\n }, 500);\n },\n });\n }, this.timeDelayInit());\n }\n\n /* FUNCTIONS */\n protected updateConfig() {\n const mentionConfig = this.mentionConfig();\n if (!mentionConfig) {\n return;\n }\n this.triggerChars.set({});\n this.addConfig(mentionConfig);\n if (mentionConfig.mention) {\n mentionConfig.mention.forEach((config) => this.addConfig(config));\n }\n }\n\n private addConfig(config: IMentionConfig) {\n const defaults = { ...DEFAULT_CONFIG };\n const labelKey = config.labelKey || 'label';\n config = Object.assign(defaults, config);\n if (config.items && config.items.length > 0) {\n if (typeof config.items[0] === 'string') {\n config.items.forEach((label) => {\n const object: Record<string, Record<string, string | undefined>> = {};\n object[labelKey] = label;\n return object;\n });\n }\n if (labelKey) {\n // remove items without an labelKey (as it's required to filter the list)\n config.items = config.items.filter((e) => e[labelKey]);\n if (!config.disableSort) {\n config.items.sort((a, b) => (a[labelKey] || '').localeCompare(b[labelKey] || ''));\n }\n }\n }\n this.triggerChars.update((item) => ({\n ...item,\n [config.triggerChar || '@']: config,\n }));\n if (this.activeConfig() && this.activeConfig()?.triggerChar === config.triggerChar) {\n this.activeConfig.set(config);\n this.updateSearchList();\n }\n }\n\n protected setIframe(iframe: HTMLIFrameElement) {\n this.iframe.set(iframe);\n }\n\n private stopEvent(event: Event) {\n if (get<unknown>(event, 'wasClick')) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n }\n\n protected handlerBlur(event: Event) {\n setTimeout(() => {\n this.stopEvent(event);\n this.stopSearch();\n }, 100);\n }\n\n protected handlerInput(event: InputEvent, nativeElement: HTMLInputElement = this.element.nativeElement) {\n const data = get(event, 'data');\n if (this.lastKeyCode() === UtilsKeyCodeConstant.BUFFERED && data) {\n const keyCode = data.charCodeAt(0);\n this.handlerKeydown({ keyCode, inputEvent: true }, nativeElement);\n }\n }\n\n protected handlerKeydown(event: any, nativeElement: HTMLInputElement = this.element.nativeElement): any {\n this.lastKeyCode.set(event.keyCode);\n if (event.isComposing || event.keyCode === UtilsKeyCodeConstant.BUFFERED) {\n return;\n }\n\n const val: any = getValue(nativeElement);\n let pos: any = getCaretPosition(nativeElement, this.iframe());\n let charPressed = event.key;\n if (!this.isEditor()) {\n if (event.keyCode === UtilsKeyCodeConstant.BACKSPACE) {\n this.appendEmptyToLastNode(pos, val.length, nativeElement);\n }\n setTimeout(() => this.addNodeZeroWidthSpace(nativeElement), 0);\n }\n if (!charPressed) {\n const charCode = event.which || event.keyCode;\n charPressed = String.fromCharCode(event.which || event.keyCode);\n if (!event.shiftKey && charCode >= 65 && charCode <= 90) {\n charPressed = String.fromCharCode(charCode + 32);\n }\n }\n if (event.keyCode === UtilsKeyCodeConstant.ENTER && event.wasClick && pos < (this.startPos() || 0)) {\n pos = this.startNode().length;\n setCaretPosition(this.startNode(), pos, this.iframe());\n }\n const config = this.triggerChars()[charPressed];\n if (config) {\n this.activeConfig.set(config);\n this.startPos.set(event.inputEvent ? pos - 1 : pos);\n this.startNode.set(getWindowSelection(this.iframe())?.anchorNode);\n this.searching.set(true);\n this.searchString.set('');\n this.showSearchList(nativeElement);\n this.updateSearchList();\n if (config.returnTrigger) {\n this.outSearchTerm.emit(config.triggerChar);\n }\n return;\n }\n setTimeout(() => {\n for (const itemSet of this.nodesInsert()) {\n if (!nativeElement.contains(itemSet.elementSpan)) {\n itemSet.subscription?.unsubscribe();\n this.nodesInsert().delete(itemSet);\n }\n }\n });\n const startPos = this.startPos();\n if (isNil(startPos) || startPos < 0 || !this.searching()) {\n return;\n }\n const searchList = this.searchList();\n if (pos <= startPos) {\n if (searchList) {\n searchList.hidden.set(true);\n }\n return;\n }\n if (event.keyCode === UtilsKeyCodeConstant.SHIFT || event.metaKey || event.altKey || event.ctrlKey || pos <= startPos) {\n return;\n }\n if (!this.activeConfig()?.allowSpace && event.keyCode === UtilsKeyCodeConstant.SPACE) {\n this.startPos.set(-1);\n } else if (event.keyCode === UtilsKeyCodeConstant.BACKSPACE && pos > 0) {\n pos--;\n if (pos === this.startPos()) {\n this.stopSearch();\n }\n } else if (searchList?.hidden()) {\n if (event.keyCode === UtilsKeyCodeConstant.TAB || event.keyCode === UtilsKeyCodeConstant.ENTER) {\n this.stopSearch();\n return;\n }\n } else if (!searchList?.hidden() && this.activeConfig()) {\n if (event.keyCode === UtilsKeyCodeConstant.TAB || event.keyCode === UtilsKeyCodeConstant.ENTER) {\n this.stopEvent(event);\n // emit the selected list item\n this.outItemSelected.emit(searchList?.ActiveItem);\n // optional function to format the selected item before inserting the text\n this.insertMention(nativeElement, pos);\n // fire input event so angular bindings are updated\n if ('Event' in window) {\n // this seems backwards, but fire the event from this elements nativeElement (not the\n // one provided that may be in an iframe, as it won't be propogate)\n // Create the event using the modern Event constructor\n const evt = new Event(this.iframe() ? 'change' : 'input', {\n bubbles: true,\n cancelable: false,\n });\n // Dispatch the event on the native element\n nativeElement.dispatchEvent(evt);\n }\n this.startPos.set(-1);\n this.stopSearch();\n\n return false;\n }\n\n if (event.keyCode === UtilsKeyCodeConstant.ESCAPE) {\n this.stopEvent(event);\n this.stopSearch();\n\n return false;\n }\n if (event.keyCode === UtilsKeyCodeConstant.DOWN_ARROW) {\n this.stopEvent(event);\n searchList?.activateNextItem();\n\n return false;\n }\n if (event.keyCode === UtilsKeyCodeConstant.UP_ARROW) {\n this.stopEvent(event);\n searchList?.activatePreviousItem();\n\n return false;\n }\n }\n if (charPressed.length !== 1 && event.keyCode !== UtilsKeyCodeConstant.BACKSPACE) {\n this.stopEvent(event);\n\n return false;\n }\n if (!this.searching()) {\n return;\n }\n let mention = val.substring((this.startPos() || 0) + 1, pos);\n\n if (event.keyCode !== UtilsKeyCodeConstant.BACKSPACE && !event.inputEvent) {\n mention += charPressed;\n }\n const searchString = mention.replace(String.fromCharCode(160), ' ').replace(String.fromCharCode(0), '');\n this.searchString.set(searchString.trim());\n const limitSpaceSearchQuery = this.activeConfig()?.limitSpaceSearchQuery;\n if (limitSpaceSearchQuery && searchString.split(' ').length - 1 > limitSpaceSearchQuery) {\n this.searchString.set('');\n }\n if (this.activeConfig()?.returnTrigger) {\n const triggerChar = this.searchString() || event.keyCode === UtilsKeyCodeConstant.BACKSPACE ? val.substring(this.startPos(), (this.startPos() || 0) + 1) : '';\n\n this.outSearchTerm.emit(triggerChar + this.searchString());\n this.updateSearchList();\n\n return;\n }\n this.outSearchTerm.emit(this.searchString());\n this.updateSearchList();\n }\n\n protected handlerFocus(e?: Event, nativeElement: HTMLInputElement = this.element.nativeElement) {\n e?.stopPropagation();\n setTimeout(() => {\n const node = getWindowSelection(this.iframe())?.anchorNode;\n\n if (node?.nodeType !== 3) {\n this.stopSearch();\n\n return;\n }\n const textBeforeCursor = getTextBeforeCursor() || '';\n\n const triggerChars = Object.keys(this.triggerChars()).map((key: string) => {\n return {\n key: key,\n config: this.triggerChars()[key],\n index: textBeforeCursor.lastIndexOf(key),\n };\n });\n const matchingCharacters = triggerChars.reduce((pre, current) => (pre && current && current.index > pre.index ? current : pre), triggerChars[0]);\n\n if (matchingCharacters.index < 0) {\n this.stopSearch();\n\n return;\n }\n const search = textBeforeCursor?.substring(matchingCharacters.index, textBeforeCursor.length);\n\n if (!search) {\n this.stopSearch();\n\n return;\n }\n const pos = getCaretPosition(nativeElement, this.iframe());\n\n this.activeConfig.set(matchingCharacters.config);\n this.startPos.set(pos - (textBeforeCursor.length - matchingCharacters.index));\n this.searchString.set(search.replace(matchingCharacters.key, ''));\n this.searching.set(true);\n this.handlerKeydown({ keyCode: ''.charCodeAt(0), inputEvent: false }, nativeElement);\n const divElement = document.createElement('div');\n\n divElement.style.width = 'max-content';\n divElement.style.position = 'absolute';\n divElement.innerText = search;\n document.body.appendChild(divElement);\n let iframe = undefined;\n try {\n iframe = this.mentionConfig()?.iframe ? (window.parent.document.getElementById(this.mentionConfig()?.iframe as string) as HTMLIFrameElement) : undefined;\n } catch (error) {\n console.log(error);\n }\n const searchList = this.searchList();\n if (searchList) {\n searchList.position(nativeElement, iframe, divElement.getBoundingClientRect().width);\n }\n divElement.remove();\n nativeElement.normalize();\n });\n }\n\n private stopSearch() {\n const searchList = this.searchList();\n if (searchList && !searchList.hidden()) {\n searchList.hidden.set(true);\n this.outToggle.emit(false);\n }\n this.activeConfig.set(undefined);\n this.searching.set(false);\n }\n\n private updateSearchList() {\n const matches: any[] = [];\n const activeConfig = this.activeConfig();\n const searchString = this.searchString();\n const searchList = this.searchList();\n // disabling the search relies on the async operation to do the filtering\n if (activeConfig?.items && !activeConfig.disableSearch && !isNil(searchString) && activeConfig.labelKey && activeConfig.mentionFilter) {\n matches.push(...(activeConfig.mentionFilter(searchString, activeConfig.items) as any));\n }\n // update the search list\n if (!searchList) {\n return;\n }\n searchList.items.set(matches);\n searchList.hidden.set(!matches.length);\n searchList.activeIndex.set(0);\n searchList.scrollContent();\n this.outToggle.emit(!!matches.length);\n }\n\n private showSearchList(nativeElement: HTMLInputElement) {\n let iframe = undefined;\n const mentionConfig = this.mentionConfig();\n try {\n iframe = mentionConfig?.iframe ? (window.parent.document.getElementById(mentionConfig?.iframe as string) as HTMLIFrameElement) : undefined;\n } catch (error) {\n console.log(error);\n }\n if (!mentionConfig) {\n return;\n }\n this.outToggle.emit(true);\n let firstTime = false;\n\n if (!this.listComponentRef()) {\n firstTime = true;\n this.listComponentRef.set(this.dynamicComponentService.resolveComponentFactory(LibsUiComponentsInputsMentionListComponent));\n this.searchList.set(this.listComponentRef()?.instance);\n }\n this.searchList()?.labelKey.set(this.activeConfig()?.labelKey || '');\n this.searchList()?.styleOff.set(this.mentionConfig()?.disableStyle || false);\n this.searchList()?.activeIndex.set(0);\n this.searchList()?.zIndex.set(this.mentionConfig()?.zIndex || 2500);\n this.searchList()?.isIframe.set(!!iframe);\n this.searchList()?.listTemplate.set(this.mentionListTemplate());\n this.searchList()?.parentHandlerKeyDown.set(this.handlerKeydown.bind(this));\n this.searchList()?.position(nativeElement, iframe);\n if (firstTime && this.listComponentRef()) {\n this.dynamicComponentService.addToBody(this.listComponentRef(), !!iframe);\n }\n }\n\n private destroyListSearch() {\n this.dynamicComponentService.remove(this.listComponentRef, this.iframeId());\n this.listComponentRef.set(undefined);\n }\n\n protected appendEmptyToLastNode(position: number, length: number, nativeElement: HTMLInputElement = this.element.nativeElement) {\n const empty = document.createTextNode('\\u00A0');\n const selection = getWindowSelection(this.iframe());\n const anchorNode = selection?.anchorNode;\n\n if (this.isEditor()) {\n const parentNode = anchorNode?.parentNode as Element;\n\n if (parentNode?.getAttribute?.('id')) {\n if (!parentNode.nextSibling?.textContent?.length) {\n parentNode?.parentNode?.insertBefore(empty, parentNode.nextSibling);\n }\n const range = document.createRange();\n const sel = window.getSelection();\n\n range.setStart(parentNode.nextSibling as Node, 0);\n range.collapse(true);\n sel?.removeAllRanges();\n sel?.addRange(range);\n }\n\n return;\n }\n let preNode = null;\n const anchorOffset = selection?.anchorOffset;\n\n if (!anchorNode || !anchorOffset) {\n return;\n }\n\n if (anchorNode.nodeName.toLowerCase() !== '#text') {\n nativeElement.appendChild(empty);\n\n return;\n }\n\n for (const node of Array.from(nativeElement.childNodes)) {\n if (anchorNode.nodeType === 3 && anchorNode === node && preNode?.getAttribute?.('id') && (!anchorNode.textContent?.length || anchorNode.textContent.length === 1) && position === length) {\n nativeElement.appendChild(empty);\n break;\n }\n preNode = node as Element;\n }\n }\n\n protected addNodeZeroWidthSpace(nativeElement: HTMLInputElement = this.element.nativeElement) {\n const empty = document.createTextNode('\\u200b');\n let preNode = null;\n\n for (const node of Array.from(nativeElement.childNodes)) {\n const typedNode: any = node;\n\n if (preNode?.getAttribute?.('id') && typedNode?.getAttribute?.('id')) {\n nativeElement.insertBefore(empty, preNode.nextSibling);\n }\n\n preNode = typedNode;\n }\n }\n\n private insertMention(nativeElement: HTMLInputElement, pos: number) {\n const activeConfig = this.activeConfig();\n if (!activeConfig) {\n return;\n }\n const searchList = this.searchList();\n let text = '';\n const feId = uuid();\n const id = searchList?.ActiveItem.id || uuid();\n const itemActive = searchList?.ActiveItem;\n const { triggerChar, mentionEventName, mentionActionByEvent } = activeConfig;\n\n if (activeConfig.mentionSelect) {\n text = activeConfig.mentionSelect(searchList?.ActiveItem, activeConfig.triggerChar);\n }\n if (!this.isEditor()) {\n let span: HTMLSpanElement = document.createElement('TEXTAREA');\n\n span.innerText = text;\n text = span.innerHTML;\n span.remove();\n text = buildTemplate(text, id, feId);\n span = insertValue(nativeElement, this.startPos() || 0, pos, text, this.iframe()) as HTMLSpanElement;\n if (span) {\n const data: INodeInsert = {\n elementSpan: span,\n subscription: undefined,\n item: itemActive,\n triggerChar: triggerChar,\n manualAdd: true,\n };\n\n this.nodesInsert().add(data);\n if (mentionEventName) {\n data.subscription = fromEvent<IEvent>(span, mentionEventName)\n .pipe(\n tap((e) => e.stopPropagation()),\n takeUntil(this.onDestroy)\n )\n .subscribe(() => {\n if (mentionActionByEvent) {\n mentionActionByEvent(itemActive, triggerChar);\n }\n });\n }\n }\n } else {\n // Editor (quill2x): merge dữ liệu bổ sung từ config (vd chip pieces) vào data blot.\n const extraData = activeConfig.mentionInsertData ? activeConfig.mentionInsertData(itemActive) : {};\n\n this.outInsertMention.emit({ data: { ...extraData, id, value: text, feId }, lengthKey: pos - (this.startPos() || 0) });\n }\n }\n\n ngOnDestroy(): void {\n this.destroyListSearch();\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["takeUntil"],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ export interface IMentionItem {
|
|
|
14
14
|
limitSpaceSearchQuery?: number;
|
|
15
15
|
returnTrigger?: boolean;
|
|
16
16
|
mentionSelect?: (item: unknown, triggerChar?: string) => string;
|
|
17
|
+
mentionInsertData?: (item: unknown) => Record<string, string>;
|
|
17
18
|
mentionFilter?: (searchString: string, items?: Array<unknown>) => Array<unknown> | undefined;
|
|
18
19
|
mentionEventName?: 'click' | 'mouseenter';
|
|
19
20
|
mentionActionByEvent?: (item: unknown, triggerChars?: string) => void;
|
|
@@ -32,7 +33,7 @@ export interface IMentionInsert {
|
|
|
32
33
|
id: string;
|
|
33
34
|
feId: string;
|
|
34
35
|
value: string;
|
|
35
|
-
}
|
|
36
|
+
} & Record<string, string>;
|
|
36
37
|
lengthKey: number;
|
|
37
38
|
}
|
|
38
39
|
export interface IMentionFunctionControlEvent {
|
package/list/list.component.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export declare class LibsUiComponentsInputsMentionListComponent implements OnIni
|
|
|
17
17
|
defaultAvatar: import("@angular/core").ModelSignal<string | undefined>;
|
|
18
18
|
listTemplate: import("@angular/core").WritableSignal<any>;
|
|
19
19
|
readonly elementEl: import("@angular/core").Signal<ElementRef<any> | undefined>;
|
|
20
|
+
readonly contentEl: import("@angular/core").Signal<ElementRef<any> | undefined>;
|
|
20
21
|
readonly itemsEl: import("@angular/core").Signal<readonly ElementRef<any>[]>;
|
|
21
22
|
ngOnInit(): void;
|
|
22
23
|
private initEvent;
|
package/package.json
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libs-ui/components-inputs-mention",
|
|
3
|
-
"version": "0.2.357-
|
|
3
|
+
"version": "0.2.357-20",
|
|
4
4
|
"peerDependencies": {
|
|
5
|
-
"@
|
|
6
|
-
"@libs-ui/
|
|
7
|
-
"
|
|
8
|
-
"@libs-ui/components-
|
|
9
|
-
"@libs-ui/
|
|
10
|
-
"@libs-ui/
|
|
11
|
-
"@libs-ui/services-dynamic-component": "0.2.357-2",
|
|
12
|
-
"@angular/common": "~18.2.0"
|
|
5
|
+
"@libs-ui/utils": "0.2.357-20",
|
|
6
|
+
"@libs-ui/components-avatar": "0.2.357-20",
|
|
7
|
+
"@libs-ui/components-popover": "0.2.357-20",
|
|
8
|
+
"@libs-ui/components-scroll-overlay": "0.2.357-20",
|
|
9
|
+
"@libs-ui/interfaces-types": "0.2.357-20",
|
|
10
|
+
"@libs-ui/services-dynamic-component": "0.2.357-20"
|
|
13
11
|
},
|
|
14
12
|
"sideEffects": false,
|
|
15
13
|
"module": "fesm2022/libs-ui-components-inputs-mention.mjs",
|