@libs-ui/components-inputs-mention 0.2.145 → 0.2.146
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.
|
@@ -28,6 +28,7 @@ export class LibsUiComponentsInputsMentionDirective {
|
|
|
28
28
|
dynamicComponentService = inject(LibsUiDynamicComponentService);
|
|
29
29
|
onDestroy = new Subject();
|
|
30
30
|
// #region INPUT
|
|
31
|
+
timeDelayInit = input(0, { transform: val => val ?? 0 });
|
|
31
32
|
mentionConfig = input();
|
|
32
33
|
mentionListTemplate = input();
|
|
33
34
|
// #region OUTPUT
|
|
@@ -72,7 +73,7 @@ export class LibsUiComponentsInputsMentionDirective {
|
|
|
72
73
|
}, 500);
|
|
73
74
|
}
|
|
74
75
|
});
|
|
75
|
-
});
|
|
76
|
+
}, this.timeDelayInit());
|
|
76
77
|
}
|
|
77
78
|
/* FUNCTIONS */
|
|
78
79
|
updateConfig() {
|
|
@@ -491,7 +492,7 @@ export class LibsUiComponentsInputsMentionDirective {
|
|
|
491
492
|
this.onDestroy.complete();
|
|
492
493
|
}
|
|
493
494
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsInputsMentionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
494
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.13", type: LibsUiComponentsInputsMentionDirective, isStandalone: true, selector: "[LibsUiComponentsInputsMentionDirective]", inputs: { mentionConfig: { classPropertyName: "mentionConfig", publicName: "mentionConfig", isSignal: true, isRequired: false, transformFunction: null }, mentionListTemplate: { classPropertyName: "mentionListTemplate", publicName: "mentionListTemplate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outSearchTerm: "outSearchTerm", outItemSelected: "outItemSelected", outToggle: "outToggle", outInsertMention: "outInsertMention", outFunctionControl: "outFunctionControl" }, ngImport: i0 });
|
|
495
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.13", type: LibsUiComponentsInputsMentionDirective, isStandalone: true, selector: "[LibsUiComponentsInputsMentionDirective]", inputs: { timeDelayInit: { classPropertyName: "timeDelayInit", publicName: "timeDelayInit", isSignal: true, isRequired: false, transformFunction: null }, mentionConfig: { classPropertyName: "mentionConfig", publicName: "mentionConfig", isSignal: true, isRequired: false, transformFunction: null }, mentionListTemplate: { classPropertyName: "mentionListTemplate", publicName: "mentionListTemplate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outSearchTerm: "outSearchTerm", outItemSelected: "outItemSelected", outToggle: "outToggle", outInsertMention: "outInsertMention", outFunctionControl: "outFunctionControl" }, ngImport: i0 });
|
|
495
496
|
}
|
|
496
497
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsInputsMentionDirective, decorators: [{
|
|
497
498
|
type: Directive,
|
|
@@ -501,4 +502,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
501
502
|
standalone: true
|
|
502
503
|
}]
|
|
503
504
|
}], ctorParameters: () => [] });
|
|
504
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudGlvbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL21lbnRpb24vc3JjL21lbnRpb24uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQStCLFNBQVMsRUFBRSxVQUFVLEVBQTBCLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdKLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDaEosT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRS9KLE9BQU8sRUFBRSwwQ0FBMEMsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQU9uRixNQUFNLE9BQU8sc0NBQXNDO0lBRWpELG1CQUFtQjtJQUNYLGdCQUFnQixHQUFHLE1B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QUUsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0csQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7d0dBdmhCVSxzQ0FBc0M7NEZBQXRDLHNDQUFzQzs7NEZBQXRDLHNDQUFzQztrQkFMbEQsU0FBUzttQkFBQztvQkFDVCw4REFBOEQ7b0JBQzlELFFBQVEsRUFBRSwwQ0FBMEM7b0JBQ3BELFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudFJlZiwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBPbkRlc3Ryb3ksIFRlbXBsYXRlUmVmLCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIG91dHB1dCwgc2lnbmFsLCB1bnRyYWNrZWQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgSUV2ZW50LCBUWVBFX1RFTVBMQVRFX1JFRiB9IGZyb20gXCJAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzXCI7XG5pbXBvcnQgeyBMaWJzVWlEeW5hbWljQ29tcG9uZW50U2VydmljZSB9IGZyb20gXCJAbGlicy11aS9zZXJ2aWNlcy1keW5hbWljLWNvbXBvbmVudFwiO1xuaW1wb3J0IHsgZ2V0LCBpc05pbCwgdXVpZCB9IGZyb20gXCJAbGlicy11aS91dGlsc1wiO1xuaW1wb3J0IHsgU3ViamVjdCwgZnJvbUV2ZW50IH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IHRha2VVbnRpbCwgdGFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBLRVlfQkFDS1NQQUNFLCBLRVlfQlVGRkVSRUQsIEtFWV9ET1dOLCBLRVlfRU5URVIsIEtFWV9FU0NBUEUsIEtFWV9TSElGVCwgS0VZX1NQQUNFLCBLRVlfVEFCLCBLRVlfVVAgfSBmcm9tIFwiLi9kZWZpbmVzL2tleWJvYXJkLmRlZmluZVwiO1xuaW1wb3J0IHsgREVGQVVMVF9DT05GSUcsIGJ1aWxkVGVtcGxhdGUgfSBmcm9tIFwiLi9kZWZpbmVzL3RlbXBsYXRlLmRlZmluZVwiO1xuaW1wb3J0IHsgZ2V0Q2FyZXRQb3NpdGlvbiwgZ2V0VGV4dEJlZm9yZUN1cnNvciwgZ2V0VmFsdWUsIGdldFdpbmRvd1NlbGVjdGlvbiwgaW5zZXJ0VGV4dEF0Q2FyZXQsIGluc2VydFZhbHVlLCBzZXRDYXJldFBvc2l0aW9uIH0gZnJvbSBcIi4vZGVmaW5lcy91dGlscy5kZWZpbmVcIjtcbmltcG9ydCB7IElNZW50aW9uQ29uZmlnLCBJTWVudGlvbkZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJTWVudGlvbkluc2VydCwgSU5vZGVJbnNlcnQgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL21lbnRpb24uaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkxpc3RDb21wb25lbnQgfSBmcm9tIFwiLi9saXN0L2xpc3QuY29tcG9uZW50XCI7XG5cbkBEaXJlY3RpdmUoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1tMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkRpcmVjdGl2ZV0nLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNJbnB1dHNNZW50aW9uRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICAvLyAjcmVnaW9uIFBST1BFUlRZXG4gIHByaXZhdGUgbGlzdENvbXBvbmVudFJlZiA9IHNpZ25hbDxDb21wb25lbnRSZWY8TGlic1VpQ29tcG9uZW50c0lucHV0c01lbnRpb25MaXN0Q29tcG9uZW50PiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBub2Rlc0luc2VydCA9IHNpZ25hbDxTZXQ8SU5vZGVJbnNlcnQ+PihuZXcgU2V0KCkpO1xuICBwcml2YXRlIGFjdGl2ZUNvbmZpZyA9IHNpZ25hbDxJTWVudGlvbkNvbmZpZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSB0cmlnZ2VyQ2hhcnMgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgSU1lbnRpb25Db25maWc+Pih7fSk7XG4gIHByaXZhdGUgc2VhcmNoU3RyaW5nID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBwcml2YXRlIHN0YXJ0UG9zID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBzdGFydE5vZGUgPSBzaWduYWw8YW55Pih1bmRlZmluZWQpO1xuICBwcml2YXRlIHNlYXJjaExpc3QgPSBzaWduYWw8TGlic1VpQ29tcG9uZW50c0lucHV0c01lbnRpb25MaXN0Q29tcG9uZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHNlYXJjaGluZyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgaWZyYW1lID0gc2lnbmFsPGFueT4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBsYXN0S2V5Q29kZSA9IHNpZ25hbDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgaXNFZGl0b3IgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIGlmcmFtZUlkID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBlbGVtZW50ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIGR5bmFtaWNDb21wb25lbnRTZXJ2aWNlID0gaW5qZWN0KExpYnNVaUR5bmFtaWNDb21wb25lbnRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBvbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vICNyZWdpb24gSU5QVVRcbiAgcmVhZG9ubHkgbWVudGlvbkNvbmZpZyA9IGlucHV0PElNZW50aW9uQ29uZmlnPigpO1xuICByZWFkb25seSBtZW50aW9uTGlzdFRlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8VFlQRV9URU1QTEFURV9SRUY+PigpO1xuXG4gIC8vICNyZWdpb24gT1VUUFVUXG4gIHJlYWRvbmx5IG91dFNlYXJjaFRlcm0gPSBvdXRwdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBvdXRJdGVtU2VsZWN0ZWQgPSBvdXRwdXQ8dW5rbm93bj4oKTtcbiAgcmVhZG9ubHkgb3V0VG9nZ2xlID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dEluc2VydE1lbnRpb24gPSBvdXRwdXQ8SU1lbnRpb25JbnNlcnQ+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uQ29udHJvbCA9IG91dHB1dDxJTWVudGlvbkZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB0aGlzLm1lbnRpb25Db25maWcoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLnVwZGF0ZUNvbmZpZygpKTtcbiAgICB9KVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLm1lbnRpb25Db25maWcoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpc0NvbnRlbnRFZGl0YWJsZSA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJyk7XG4gICAgICB0aGlzLmlzRWRpdG9yLnNldCghaXNDb250ZW50RWRpdGFibGUpO1xuICAgICAgY29uc3QgZWxlbWVudCA9ICF0aGlzLmlzRWRpdG9yKCkgPyB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCA6IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5xbC1lZGl0b3JbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXScpO1xuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlcktleWRvd24uYmluZCh0aGlzKShldmVudCwgZWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlcklucHV0LmJpbmQodGhpcykoZXZlbnQsIGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlckJsdXIuYmluZCh0aGlzKShldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlckZvY3VzLmJpbmQodGhpcykoZXZlbnQsIGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3V0RnVuY3Rpb25Db250cm9sLmVtaXQoe1xuICAgICAgICBhZGRNZW50aW9uOiAoKSA9PiB7XG4gICAgICAgICAgaW5zZXJ0VGV4dEF0Q2FyZXQoZWxlbWVudCwgYCR7dGhpcy5tZW50aW9uQ29uZmlnKCk/LnRyaWdnZXJDaGFyfWApO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVyS2V5ZG93bih7IGtleTogdGhpcy5tZW50aW9uQ29uZmlnKCk/LnRyaWdnZXJDaGFyLCBrZXlDb2RlOiBLRVlfQkFDS1NQQUNFLCBzaGlmdEtleTogdHJ1ZSwgaW5wdXRFdmVudDogdHJ1ZSB9LCBlbGVtZW50KTtcbiAgICAgICAgICB9LCA1MDApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qIEZVTkNUSU9OUyAqL1xuICBwcm90ZWN0ZWQgdXBkYXRlQ29uZmlnKCkge1xuICAgIGNvbnN0IG1lbnRpb25Db25maWcgPSB0aGlzLm1lbnRpb25Db25maWcoKTtcbiAgICBpZiAoIW1lbnRpb25Db25maWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50cmlnZ2VyQ2hhcnMuc2V0KHt9KTtcbiAgICB0aGlzLmFkZENvbmZpZyhtZW50aW9uQ29uZmlnKTtcbiAgICBpZiAobWVudGlvbkNvbmZpZy5tZW50aW9uKSB7XG4gICAgICBtZW50aW9uQ29uZmlnLm1lbnRpb24uZm9yRWFjaChjb25maWcgPT4gdGhpcy5hZGRDb25maWcoY29uZmlnKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRDb25maWcoY29uZmlnOiBJTWVudGlvbkNvbmZpZykge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9DT05GSUcpO1xuICAgIGNvbnN0IGxhYmVsS2V5ID0gY29uZmlnLmxhYmVsS2V5IHx8ICdsYWJlbCc7XG4gICAgY29uZmlnID0gT2JqZWN0LmFzc2lnbihkZWZhdWx0cywgY29uZmlnKTtcbiAgICBpZiAoY29uZmlnLml0ZW1zICYmIGNvbmZpZy5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbmZpZy5pdGVtc1swXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uZmlnLml0ZW1zLmZvckVhY2goKGxhYmVsKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+PiA9IHt9O1xuICAgICAgICAgIG9iamVjdFtsYWJlbEtleV0gPSBsYWJlbDtcbiAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChsYWJlbEtleSkge1xuICAgICAgICAvLyByZW1vdmUgaXRlbXMgd2l0aG91dCBhbiBsYWJlbEtleSAoYXMgaXQncyByZXF1aXJlZCB0byBmaWx0ZXIgdGhlIGxpc3QpXG4gICAgICAgIGNvbmZpZy5pdGVtcyA9IGNvbmZpZy5pdGVtcy5maWx0ZXIoZSA9PiBlW2xhYmVsS2V5XSk7XG4gICAgICAgIGlmICghY29uZmlnLmRpc2FibGVTb3J0KSB7XG4gICAgICAgICAgY29uZmlnLml0ZW1zLnNvcnQoKGEsIGIpID0+IChhW2xhYmVsS2V5XSB8fCAnJykubG9jYWxlQ29tcGFyZSgoYltsYWJlbEtleV0gfHwgJycpKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy50cmlnZ2VyQ2hhcnMudXBkYXRlKGl0ZW0gPT4gKHtcbiAgICAgIC4uLml0ZW0sXG4gICAgICBbY29uZmlnLnRyaWdnZXJDaGFyIHx8ICdAJ106IGNvbmZpZ1xuICAgIH0pKVxuICAgIGlmICh0aGlzLmFjdGl2ZUNvbmZpZygpICYmIHRoaXMuYWN0aXZlQ29uZmlnKCk/LnRyaWdnZXJDaGFyID09PSBjb25maWcudHJpZ2dlckNoYXIpIHtcbiAgICAgIHRoaXMuYWN0aXZlQ29uZmlnLnNldChjb25maWcpO1xuICAgICAgdGhpcy51cGRhdGVTZWFyY2hMaXN0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNldElmcmFtZShpZnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgdGhpcy5pZnJhbWUuc2V0KGlmcmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBpZiAoZ2V0KGV2ZW50LCAnd2FzQ2xpY2snKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJCbHVyKGV2ZW50OiBFdmVudCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgdGhpcy5zdG9wU2VhcmNoKCk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVySW5wdXQoZXZlbnQ6IEV2ZW50LCBuYXRpdmVFbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICBjb25zdCBkYXRhID0gZ2V0KGV2ZW50LCAnZGF0YScpO1xuICAgIGlmICh0aGlzLmxhc3RLZXlDb2RlKCkgPT09IEtFWV9CVUZGRVJFRCAmJiBkYXRhKSB7XG4gICAgICBjb25zdCBrZXlDb2RlID0gZGF0YS5jaGFyQ29kZUF0KDApO1xuICAgICAgdGhpcy5oYW5kbGVyS2V5ZG93bih7IGtleUNvZGUsIGlucHV0RXZlbnQ6IHRydWUgfSwgbmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJLZXlkb3duKGV2ZW50OiBhbnksIG5hdGl2ZUVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQgPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk6IGFueSB7XG4gICAgdGhpcy5sYXN0S2V5Q29kZS5zZXQoZXZlbnQua2V5Q29kZSk7XG4gICAgaWYgKGV2ZW50LmlzQ29tcG9zaW5nIHx8IGV2ZW50LmtleUNvZGUgPT09IEtFWV9CVUZGRVJFRCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbDogYW55ID0gZ2V0VmFsdWUobmF0aXZlRWxlbWVudCk7XG4gICAgbGV0IHBvczogYW55ID0gZ2V0Q2FyZXRQb3NpdGlvbihuYXRpdmVFbGVtZW50LCB0aGlzLmlmcmFtZSgpKTtcbiAgICBsZXQgY2hhclByZXNzZWQgPSBldmVudC5rZXk7XG4gICAgaWYgKCF0aGlzLmlzRWRpdG9yKCkpIHtcbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLRVlfQkFDS1NQQUNFKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kRW1wdHlUb0xhc3ROb2RlKHBvcywgdmFsLmxlbmd0aCwgbmF0aXZlRWxlbWVudCk7XG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYWRkTm9kZVplcm9XaWR0aFNwYWNlKG5hdGl2ZUVsZW1lbnQpLCAwKTtcbiAgICB9XG4gICAgaWYgKCFjaGFyUHJlc3NlZCkge1xuICAgICAgY29uc3QgY2hhckNvZGUgPSBldmVudC53aGljaCB8fCBldmVudC5rZXlDb2RlO1xuICAgICAgY2hhclByZXNzZWQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LndoaWNoIHx8IGV2ZW50LmtleUNvZGUpO1xuICAgICAgaWYgKCFldmVudC5zaGlmdEtleSAmJiAoY2hhckNvZGUgPj0gNjUgJiYgY2hhckNvZGUgPD0gOTApKSB7XG4gICAgICAgIGNoYXJQcmVzc2VkID0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSArIDMyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtFWV9FTlRFUiAmJiBldmVudC53YXNDbGljayAmJiBwb3MgPCAodGhpcy5zdGFydFBvcygpIHx8IDApKSB7XG4gICAgICBwb3MgPSB0aGlzLnN0YXJ0Tm9kZSgpLmxlbmd0aDtcbiAgICAgIHNldENhcmV0UG9zaXRpb24odGhpcy5zdGFydE5vZGUoKSwgcG9zLCB0aGlzLmlmcmFtZSgpKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy50cmlnZ2VyQ2hhcnMoKVtjaGFyUHJlc3NlZF07XG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgdGhpcy5hY3RpdmVDb25maWcuc2V0KGNvbmZpZyk7XG4gICAgICB0aGlzLnN0YXJ0UG9zLnNldChldmVudC5pbnB1dEV2ZW50ID8gcG9zIC0gMSA6IHBvcyk7XG4gICAgICB0aGlzLnN0YXJ0Tm9kZS5zZXQoZ2V0V2luZG93U2VsZWN0aW9uKHRoaXMuaWZyYW1lKCkpPy5hbmNob3JOb2RlKTtcbiAgICAgIHRoaXMuc2VhcmNoaW5nLnNldCh0cnVlKTtcbiAgICAgIHRoaXMuc2VhcmNoU3RyaW5nLnNldCgnJyk7XG4gICAgICB0aGlzLnNob3dTZWFyY2hMaXN0KG5hdGl2ZUVsZW1lbnQpO1xuICAgICAgdGhpcy51cGRhdGVTZWFyY2hMaXN0KCk7XG4gICAgICBpZiAoY29uZmlnLnJldHVyblRyaWdnZXIpIHtcbiAgICAgICAgdGhpcy5vdXRTZWFyY2hUZXJtLmVtaXQoY29uZmlnLnRyaWdnZXJDaGFyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW1TZXQgb2YgdGhpcy5ub2Rlc0luc2VydCgpKSB7XG4gICAgICAgIGlmICghbmF0aXZlRWxlbWVudC5jb250YWlucyhpdGVtU2V0LmVsZW1lbnRTcGFuKSkge1xuICAgICAgICAgIGl0ZW1TZXQuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHRoaXMubm9kZXNJbnNlcnQoKS5kZWxldGUoaXRlbVNldCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBzdGFydFBvcyA9IHRoaXMuc3RhcnRQb3MoKTtcbiAgICBpZiAoaXNOaWwoc3RhcnRQb3MpIHx8IHN0YXJ0UG9zIDwgMCB8fCAhdGhpcy5zZWFyY2hpbmcoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZWFyY2hMaXN0ID0gdGhpcy5zZWFyY2hMaXN0KCk7XG4gICAgaWYgKHBvcyA8PSBzdGFydFBvcykge1xuICAgICAgaWYgKHNlYXJjaExpc3QpIHtcbiAgICAgICAgc2VhcmNoTGlzdC5oaWRkZW4uc2V0KHRydWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS0VZX1NISUZUIHx8IGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuYWx0S2V5IHx8IGV2ZW50LmN0cmxLZXkgfHwgcG9zIDw9IHN0YXJ0UG9zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5hY3RpdmVDb25maWcoKT8uYWxsb3dTcGFjZSAmJiBldmVudC5rZXlDb2RlID09PSBLRVlfU1BBQ0UpIHtcbiAgICAgIHRoaXMuc3RhcnRQb3Muc2V0KC0xKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtFWV9CQUNLU1BBQ0UgJiYgcG9zID4gMCkge1xuICAgICAgcG9zLS07XG4gICAgICBpZiAocG9zID09PSB0aGlzLnN0YXJ0UG9zKCkpIHtcbiAgICAgICAgdGhpcy5zdG9wU2VhcmNoKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHNlYXJjaExpc3Q/LmhpZGRlbigpKSB7XG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS0VZX1RBQiB8fCBldmVudC5rZXlDb2RlID09PSBLRVlfRU5URVIpIHtcbiAgICAgICAgdGhpcy5zdG9wU2VhcmNoKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoIXNlYXJjaExpc3Q/LmhpZGRlbigpICYmIHRoaXMuYWN0aXZlQ29uZmlnKCkpIHtcbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLRVlfVEFCIHx8IGV2ZW50LmtleUNvZGUgPT09IEtFWV9FTlRFUikge1xuICAgICAgICB0aGlzLnN0b3BFdmVudChldmVudCk7XG4gICAgICAgIC8vIGVtaXQgdGhlIHNlbGVjdGVkIGxpc3QgaXRlbVxuICAgICAgICB0aGlzLm91dEl0ZW1TZWxlY3RlZC5lbWl0KHNlYXJjaExpc3Q/LkFjdGl2ZUl0ZW0pO1xuICAgICAgICAvLyBvcHRpb25hbCBmdW5jdGlvbiB0byBmb3JtYXQgdGhlIHNlbGVjdGVkIGl0ZW0gYmVmb3JlIGluc2VydGluZyB0aGUgdGV4dFxuICAgICAgICB0aGlzLmluc2VydE1lbnRpb24obmF0aXZlRWxlbWVudCwgcG9zKTtcbiAgICAgICAgLy8gZmlyZSBpbnB1dCBldmVudCBzbyBhbmd1bGFyIGJpbmRpbmdzIGFyZSB1cGRhdGVkXG4gICAgICAgIGlmIChcIkV2ZW50XCIgaW4gd2luZG93KSB7XG4gICAgICAgICAgLy8gdGhpcyBzZWVtcyBiYWNrd2FyZHMsIGJ1dCBmaXJlIHRoZSBldmVudCBmcm9tIHRoaXMgZWxlbWVudHMgbmF0aXZlRWxlbWVudCAobm90IHRoZVxuICAgICAgICAgIC8vIG9uZSBwcm92aWRlZCB0aGF0IG1heSBiZSBpbiBhbiBpZnJhbWUsIGFzIGl0IHdvbid0IGJlIHByb3BvZ2F0ZSlcbiAgICAgICAgICAvLyBDcmVhdGUgdGhlIGV2ZW50IHVzaW5nIHRoZSBtb2Rlcm4gRXZlbnQgY29uc3RydWN0b3JcbiAgICAgICAgICBjb25zdCBldnQgPSBuZXcgRXZlbnQodGhpcy5pZnJhbWUoKSA/IFwiY2hhbmdlXCIgOiBcImlucHV0XCIsIHtcbiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBldmVudCBvbiB0aGUgbmF0aXZlIGVsZW1lbnRcbiAgICAgICAgICBuYXRpdmVFbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXJ0UG9zLnNldCgtMSk7XG4gICAgICAgIHRoaXMuc3RvcFNlYXJjaCgpO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtFWV9FU0NBUEUpIHtcbiAgICAgICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICB0aGlzLnN0b3BTZWFyY2goKTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS0VZX0RPV04pIHtcbiAgICAgICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICBzZWFyY2hMaXN0Py5hY3RpdmF0ZU5leHRJdGVtKCk7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtFWV9VUCkge1xuICAgICAgICB0aGlzLnN0b3BFdmVudChldmVudCk7XG4gICAgICAgIHNlYXJjaExpc3Q/LmFjdGl2YXRlUHJldmlvdXNJdGVtKCk7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhclByZXNzZWQubGVuZ3RoICE9PSAxICYmIGV2ZW50LmtleUNvZGUgIT09IEtFWV9CQUNLU1BBQ0UpIHtcbiAgICAgIHRoaXMuc3RvcEV2ZW50KGV2ZW50KTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc2VhcmNoaW5nKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IG1lbnRpb24gPSB2YWwuc3Vic3RyaW5nKCh0aGlzLnN0YXJ0UG9zKCkgfHwgMCkgKyAxLCBwb3MpO1xuXG4gICAgaWYgKGV2ZW50LmtleUNvZGUgIT09IEtFWV9CQUNLU1BBQ0UgJiYgIWV2ZW50LmlucHV0RXZlbnQpIHtcbiAgICAgIG1lbnRpb24gKz0gY2hhclByZXNzZWQ7XG4gICAgfVxuICAgIGNvbnN0IHNlYXJjaFN0cmluZyA9IG1lbnRpb24ucmVwbGFjZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCksICcgJykucmVwbGFjZShTdHJpbmcuZnJvbUNoYXJDb2RlKDApLCAnJyk7XG4gICAgdGhpcy5zZWFyY2hTdHJpbmcuc2V0KHNlYXJjaFN0cmluZy50cmltKCkpO1xuICAgIGNvbnN0IGxpbWl0U3BhY2VTZWFyY2hRdWVyeSA9IHRoaXMuYWN0aXZlQ29uZmlnKCk/LmxpbWl0U3BhY2VTZWFyY2hRdWVyeTtcbiAgICBpZiAobGltaXRTcGFjZVNlYXJjaFF1ZXJ5ICYmIChzZWFyY2hTdHJpbmcuc3BsaXQoJyAnKS5sZW5ndGggLSAxKSA+IGxpbWl0U3BhY2VTZWFyY2hRdWVyeSkge1xuICAgICAgdGhpcy5zZWFyY2hTdHJpbmcuc2V0KCcnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWN0aXZlQ29uZmlnKCk/LnJldHVyblRyaWdnZXIpIHtcbiAgICAgIGNvbnN0IHRyaWdnZXJDaGFyID0gKHRoaXMuc2VhcmNoU3RyaW5nKCkgfHwgZXZlbnQua2V5Q29kZSA9PT0gS0VZX0JBQ0tTUEFDRSkgPyB2YWwuc3Vic3RyaW5nKHRoaXMuc3RhcnRQb3MoKSwgKHRoaXMuc3RhcnRQb3MoKSB8fCAwKSArIDEpIDogJyc7XG5cbiAgICAgIHRoaXMub3V0U2VhcmNoVGVybS5lbWl0KHRyaWdnZXJDaGFyICsgdGhpcy5zZWFyY2hTdHJpbmcoKSk7XG4gICAgICB0aGlzLnVwZGF0ZVNlYXJjaExpc3QoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm91dFNlYXJjaFRlcm0uZW1pdCh0aGlzLnNlYXJjaFN0cmluZygpKTtcbiAgICB0aGlzLnVwZGF0ZVNlYXJjaExpc3QoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRm9jdXMoZT86IEV2ZW50LCBuYXRpdmVFbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICBlPy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGUgPSBnZXRXaW5kb3dTZWxlY3Rpb24odGhpcy5pZnJhbWUoKSk/LmFuY2hvck5vZGU7XG5cbiAgICAgIGlmIChub2RlPy5ub2RlVHlwZSAhPT0gMykge1xuICAgICAgICB0aGlzLnN0b3BTZWFyY2goKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB0ZXh0QmVmb3JlQ3Vyc29yID0gZ2V0VGV4dEJlZm9yZUN1cnNvcigpIHx8ICcnO1xuXG4gICAgICBjb25zdCB0cmlnZ2VyQ2hhcnMgPSBPYmplY3Qua2V5cyh0aGlzLnRyaWdnZXJDaGFycygpKS5tYXAoKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgY29uZmlnOiB0aGlzLnRyaWdnZXJDaGFycygpW2tleV0sXG4gICAgICAgICAgaW5kZXg6IHRleHRCZWZvcmVDdXJzb3IubGFzdEluZGV4T2Yoa2V5KSBhcyBudW1iZXJcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbWF0Y2hpbmdDaGFyYWN0ZXJzID0gdHJpZ2dlckNoYXJzLnJlZHVjZSgocHJlLCBjdXJyZW50KSA9PiBwcmUgJiYgY3VycmVudCAmJiBjdXJyZW50LmluZGV4ID4gcHJlLmluZGV4ID8gY3VycmVudCA6IHByZSk7XG5cbiAgICAgIGlmIChtYXRjaGluZ0NoYXJhY3RlcnMuaW5kZXggPCAwKSB7XG4gICAgICAgIHRoaXMuc3RvcFNlYXJjaCgpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlYXJjaCA9IHRleHRCZWZvcmVDdXJzb3I/LnN1YnN0cmluZyhtYXRjaGluZ0NoYXJhY3RlcnMuaW5kZXgsIHRleHRCZWZvcmVDdXJzb3IubGVuZ3RoKTtcblxuICAgICAgaWYgKCFzZWFyY2gpIHtcbiAgICAgICAgdGhpcy5zdG9wU2VhcmNoKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcG9zID0gZ2V0Q2FyZXRQb3NpdGlvbihuYXRpdmVFbGVtZW50LCB0aGlzLmlmcmFtZSgpKTtcblxuICAgICAgdGhpcy5hY3RpdmVDb25maWcuc2V0KG1hdGNoaW5nQ2hhcmFjdGVycy5jb25maWcpO1xuICAgICAgdGhpcy5zdGFydFBvcy5zZXQocG9zIC0gKHRleHRCZWZvcmVDdXJzb3IubGVuZ3RoIC0gbWF0Y2hpbmdDaGFyYWN0ZXJzLmluZGV4KSk7XG4gICAgICB0aGlzLnNlYXJjaFN0cmluZy5zZXQoc2VhcmNoLnJlcGxhY2UobWF0Y2hpbmdDaGFyYWN0ZXJzLmtleSwgJycpKTtcbiAgICAgIHRoaXMuc2VhcmNoaW5nLnNldCh0cnVlKTtcbiAgICAgIHRoaXMuaGFuZGxlcktleWRvd24oeyBrZXlDb2RlOiAnJy5jaGFyQ29kZUF0KDApLCBpbnB1dEV2ZW50OiBmYWxzZSB9LCBuYXRpdmVFbGVtZW50KTtcbiAgICAgIGNvbnN0IGRpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG4gICAgICBkaXZFbGVtZW50LnN0eWxlLndpZHRoID0gJ21heC1jb250ZW50JztcbiAgICAgIGRpdkVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgZGl2RWxlbWVudC5pbm5lclRleHQgPSBzZWFyY2g7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdkVsZW1lbnQpO1xuICAgICAgbGV0IGlmcmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmcmFtZSA9IHRoaXMubWVudGlvbkNvbmZpZygpPy5pZnJhbWUgPyAod2luZG93LnBhcmVudC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm1lbnRpb25Db25maWcoKT8uaWZyYW1lIGFzIHN0cmluZykgYXMgSFRNTElGcmFtZUVsZW1lbnQpIDogdW5kZWZpbmVkO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VhcmNoTGlzdCA9IHRoaXMuc2VhcmNoTGlzdCgpO1xuICAgICAgaWYgKHNlYXJjaExpc3QpIHtcbiAgICAgICAgc2VhcmNoTGlzdC5wb3NpdGlvbihuYXRpdmVFbGVtZW50LCBpZnJhbWUsIGRpdkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpXG4gICAgICB9XG4gICAgICBkaXZFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgbmF0aXZlRWxlbWVudC5ub3JtYWxpemUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcFNlYXJjaCgpIHtcbiAgICBjb25zdCBzZWFyY2hMaXN0ID0gdGhpcy5zZWFyY2hMaXN0KCk7XG4gICAgaWYgKHNlYXJjaExpc3QgJiYgIXNlYXJjaExpc3QuaGlkZGVuKCkpIHtcbiAgICAgIHNlYXJjaExpc3QuaGlkZGVuLnNldCh0cnVlKTtcbiAgICAgIHRoaXMub3V0VG9nZ2xlLmVtaXQoZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZUNvbmZpZy5zZXQodW5kZWZpbmVkKTtcbiAgICB0aGlzLnNlYXJjaGluZy5zZXQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTZWFyY2hMaXN0KCkge1xuICAgIGNvbnN0IG1hdGNoZXM6IGFueVtdID0gW107XG4gICAgY29uc3QgYWN0aXZlQ29uZmlnID0gdGhpcy5hY3RpdmVDb25maWcoKTtcbiAgICBjb25zdCBzZWFyY2hTdHJpbmcgPSB0aGlzLnNlYXJjaFN0cmluZygpO1xuICAgIGNvbnN0IHNlYXJjaExpc3QgPSB0aGlzLnNlYXJjaExpc3QoKTtcbiAgICAvLyBkaXNhYmxpbmcgdGhlIHNlYXJjaCByZWxpZXMgb24gdGhlIGFzeW5jIG9wZXJhdGlvbiB0byBkbyB0aGUgZmlsdGVyaW5nXG4gICAgaWYgKGFjdGl2ZUNvbmZpZyAmJiBhY3RpdmVDb25maWcuaXRlbXMgJiYgIWFjdGl2ZUNvbmZpZy5kaXNhYmxlU2VhcmNoICYmICFpc05pbChzZWFyY2hTdHJpbmcpICYmIGFjdGl2ZUNvbmZpZy5sYWJlbEtleSAmJiBhY3RpdmVDb25maWcubWVudGlvbkZpbHRlcikge1xuICAgICAgbWF0Y2hlcy5wdXNoKC4uLmFjdGl2ZUNvbmZpZy5tZW50aW9uRmlsdGVyKHNlYXJjaFN0cmluZywgYWN0aXZlQ29uZmlnLml0ZW1zKSBhcyBhbnkpO1xuICAgIH1cbiAgICAvLyB1cGRhdGUgdGhlIHNlYXJjaCBsaXN0XG4gICAgaWYgKCFzZWFyY2hMaXN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNlYXJjaExpc3QuaXRlbXMuc2V0KG1hdGNoZXMpO1xuICAgIHNlYXJjaExpc3QuaGlkZGVuLnNldCghbWF0Y2hlcy5sZW5ndGgpO1xuICAgIHNlYXJjaExpc3QuYWN0aXZlSW5kZXguc2V0KDApO1xuICAgIHNlYXJjaExpc3Quc2Nyb2xsQ29udGVudCgpO1xuICAgIHRoaXMub3V0VG9nZ2xlLmVtaXQobWF0Y2hlcy5sZW5ndGggPyB0cnVlIDogZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93U2VhcmNoTGlzdChuYXRpdmVFbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgbGV0IGlmcmFtZSA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtZW50aW9uQ29uZmlnID0gdGhpcy5tZW50aW9uQ29uZmlnKCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmcmFtZSA9IG1lbnRpb25Db25maWc/LmlmcmFtZSA/IHdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobWVudGlvbkNvbmZpZz8uaWZyYW1lIGFzIHN0cmluZykgYXMgSFRNTElGcmFtZUVsZW1lbnQgOiB1bmRlZmluZWQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICB9XG4gICAgaWYgKCFtZW50aW9uQ29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3V0VG9nZ2xlLmVtaXQodHJ1ZSk7XG4gICAgbGV0IGZpcnN0VGltZSA9IGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLmxpc3RDb21wb25lbnRSZWYoKSkge1xuICAgICAgZmlyc3RUaW1lID0gdHJ1ZTtcbiAgICAgIHRoaXMubGlzdENvbXBvbmVudFJlZi5zZXQodGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkxpc3RDb21wb25lbnQpKTtcbiAgICAgIHRoaXMuc2VhcmNoTGlzdC5zZXQodGhpcy5saXN0Q29tcG9uZW50UmVmKCk/Lmluc3RhbmNlKTtcbiAgICB9XG4gICAgdGhpcy5zZWFyY2hMaXN0KCk/LmxhYmVsS2V5LnNldCh0aGlzLmFjdGl2ZUNvbmZpZygpPy5sYWJlbEtleSB8fCAnJyk7XG4gICAgdGhpcy5zZWFyY2hMaXN0KCk/LnN0eWxlT2ZmLnNldCh0aGlzLm1lbnRpb25Db25maWcoKT8uZGlzYWJsZVN0eWxlIHx8IGZhbHNlKTtcbiAgICB0aGlzLnNlYXJjaExpc3QoKT8uYWN0aXZlSW5kZXguc2V0KDApO1xuICAgIHRoaXMuc2VhcmNoTGlzdCgpPy56SW5kZXguc2V0KHRoaXMubWVudGlvbkNvbmZpZygpPy56SW5kZXggfHwgMjUwMCk7XG4gICAgdGhpcy5zZWFyY2hMaXN0KCk/LmlzSWZyYW1lLnNldChpZnJhbWUgPyB0cnVlIDogZmFsc2UpO1xuICAgIHRoaXMuc2VhcmNoTGlzdCgpPy5wYXJlbnRIYW5kbGVyS2V5RG93bi5zZXQodGhpcy5oYW5kbGVyS2V5ZG93bi5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLnNlYXJjaExpc3QoKT8ucG9zaXRpb24obmF0aXZlRWxlbWVudCwgaWZyYW1lKTtcbiAgICBpZiAoZmlyc3RUaW1lICYmIHRoaXMubGlzdENvbXBvbmVudFJlZigpKSB7XG4gICAgICB0aGlzLmlmcmFtZUlkLnNldCh0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLmFkZFRvQm9keSh0aGlzLmxpc3RDb21wb25lbnRSZWYoKSwgaWZyYW1lID8gdHJ1ZSA6IGZhbHNlKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZXN0cm95TGlzdFNlYXJjaCgpIHtcbiAgICB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLnJlbW92ZSh0aGlzLmxpc3RDb21wb25lbnRSZWYsIHRoaXMuaWZyYW1lSWQoKSk7XG4gICAgdGhpcy5saXN0Q29tcG9uZW50UmVmLnNldCh1bmRlZmluZWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFwcGVuZEVtcHR5VG9MYXN0Tm9kZShwb3NpdGlvbjogbnVtYmVyLCBsZW5ndGg6IG51bWJlciwgbmF0aXZlRWxlbWVudDogSFRNTElucHV0RWxlbWVudCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XG4gICAgY29uc3QgZW1wdHkgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnXFx1MDBBMCcpO1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdldFdpbmRvd1NlbGVjdGlvbih0aGlzLmlmcmFtZSgpKTtcbiAgICBjb25zdCBhbmNob3JOb2RlID0gc2VsZWN0aW9uPy5hbmNob3JOb2RlO1xuXG4gICAgaWYgKHRoaXMuaXNFZGl0b3IoKSkge1xuICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IGFuY2hvck5vZGU/LnBhcmVudE5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgaWYgKHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGUgJiYgcGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoJ2lkJykpIHtcbiAgICAgICAgaWYgKCFwYXJlbnROb2RlLm5leHRTaWJsaW5nIHx8ICFwYXJlbnROb2RlLm5leHRTaWJsaW5nLnRleHRDb250ZW50Py5sZW5ndGgpIHtcbiAgICAgICAgICBwYXJlbnROb2RlPy5wYXJlbnROb2RlPy5pbnNlcnRCZWZvcmUoZW1wdHksIHBhcmVudE5vZGUubmV4dFNpYmxpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KHBhcmVudE5vZGUubmV4dFNpYmxpbmcgYXMgTm9kZSwgMCk7XG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgICBzZWw/LnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBzZWw/LmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgcHJlTm9kZSA9IG51bGw7XG4gICAgY29uc3QgYW5jaG9yT2Zmc2V0ID0gc2VsZWN0aW9uPy5hbmNob3JPZmZzZXQ7XG5cbiAgICBpZiAoIWFuY2hvck5vZGUgfHwgIWFuY2hvck9mZnNldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChhbmNob3JOb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICcjdGV4dCcpIHtcbiAgICAgIG5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZW1wdHkpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRpdmVFbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBuYXRpdmVFbGVtZW50LmNoaWxkTm9kZXNbaV07XG5cbiAgICAgIGlmIChhbmNob3JOb2RlLm5vZGVUeXBlID09PSAzICYmIGFuY2hvck5vZGUgPT09IG5vZGUgJiYgcHJlTm9kZSAmJiBwcmVOb2RlLmdldEF0dHJpYnV0ZSAmJiBwcmVOb2RlLmdldEF0dHJpYnV0ZSgnaWQnKSAmJiAoIWFuY2hvck5vZGUudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCBhbmNob3JOb2RlLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gMSkgJiYgcG9zaXRpb24gPT09IGxlbmd0aCkge1xuICAgICAgICBuYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKGVtcHR5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBwcmVOb2RlID0gbm9kZSBhcyBFbGVtZW50O1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhZGROb2RlWmVyb1dpZHRoU3BhY2UobmF0aXZlRWxlbWVudDogSFRNTElucHV0RWxlbWVudCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XG4gICAgY29uc3QgZW1wdHkgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnXFx1MjAwYicpO1xuICAgIGxldCBwcmVOb2RlID0gbnVsbDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF0aXZlRWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBub2RlOiBhbnkgPSBuYXRpdmVFbGVtZW50LmNoaWxkTm9kZXNbaV07XG5cbiAgICAgIGlmIChwcmVOb2RlICYmIHByZU5vZGUuZ2V0QXR0cmlidXRlICYmIHByZU5vZGUuZ2V0QXR0cmlidXRlKCdpZCcpICYmIG5vZGUgJiYgbm9kZS5nZXRBdHRyaWJ1dGUgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoJ2lkJykpIHtcbiAgICAgICAgbmF0aXZlRWxlbWVudC5pbnNlcnRCZWZvcmUoZW1wdHksIHByZU5vZGUubmV4dFNpYmxpbmcpO1xuICAgICAgfVxuXG4gICAgICBwcmVOb2RlID0gbm9kZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluc2VydE1lbnRpb24obmF0aXZlRWxlbWVudDogSFRNTElucHV0RWxlbWVudCwgcG9zOiBudW1iZXIpIHtcbiAgICBjb25zdCBhY3RpdmVDb25maWcgPSB0aGlzLmFjdGl2ZUNvbmZpZygpO1xuICAgIGlmICghYWN0aXZlQ29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNlYXJjaExpc3QgPSB0aGlzLnNlYXJjaExpc3QoKTtcbiAgICBsZXQgdGV4dCA9ICcnO1xuICAgIGNvbnN0IGZlSWQgPSB1dWlkKCk7XG4gICAgY29uc3QgaWQgPSBzZWFyY2hMaXN0Py5BY3RpdmVJdGVtLmlkIHx8IHV1aWQoKTtcbiAgICBjb25zdCBpdGVtQWN0aXZlID0gc2VhcmNoTGlzdD8uQWN0aXZlSXRlbTtcbiAgICBjb25zdCB7IHRyaWdnZXJDaGFyLCBtZW50aW9uRXZlbnROYW1lLCBtZW50aW9uQWN0aW9uQnlFdmVudCB9ID0gYWN0aXZlQ29uZmlnO1xuXG4gICAgaWYgKGFjdGl2ZUNvbmZpZy5tZW50aW9uU2VsZWN0KSB7XG4gICAgICB0ZXh0ID0gYWN0aXZlQ29uZmlnLm1lbnRpb25TZWxlY3Qoc2VhcmNoTGlzdD8uQWN0aXZlSXRlbSwgYWN0aXZlQ29uZmlnLnRyaWdnZXJDaGFyKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzRWRpdG9yKCkpIHtcbiAgICAgIGxldCBzcGFuOiBIVE1MU3BhbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdURVhUQVJFQScpO1xuXG4gICAgICBzcGFuLmlubmVyVGV4dCA9IHRleHQ7XG4gICAgICB0ZXh0ID0gc3Bhbi5pbm5lckhUTUw7XG4gICAgICBzcGFuLnJlbW92ZSgpO1xuICAgICAgdGV4dCA9IGJ1aWxkVGVtcGxhdGUodGV4dCwgaWQsIGZlSWQpO1xuICAgICAgc3BhbiA9IGluc2VydFZhbHVlKG5hdGl2ZUVsZW1lbnQsIHRoaXMuc3RhcnRQb3MoKSB8fCAwLCBwb3MsIHRleHQsIHRoaXMuaWZyYW1lKCkpIGFzIEhUTUxTcGFuRWxlbWVudDtcbiAgICAgIGlmIChzcGFuKSB7XG4gICAgICAgIGNvbnN0IGRhdGE6IElOb2RlSW5zZXJ0ID0ge1xuICAgICAgICAgIGVsZW1lbnRTcGFuOiBzcGFuLFxuICAgICAgICAgIHN1YnNjcmlwdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICAgIGl0ZW06IGl0ZW1BY3RpdmUsXG4gICAgICAgICAgdHJpZ2dlckNoYXI6IHRyaWdnZXJDaGFyLFxuICAgICAgICAgIG1hbnVhbEFkZDogdHJ1ZVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMubm9kZXNJbnNlcnQoKS5hZGQoZGF0YSk7XG4gICAgICAgIGlmIChtZW50aW9uRXZlbnROYW1lKSB7XG4gICAgICAgICAgZGF0YS5zdWJzY3JpcHRpb24gPSBmcm9tRXZlbnQ8SUV2ZW50PihzcGFuLCBtZW50aW9uRXZlbnROYW1lKS5waXBlKFxuICAgICAgICAgICAgdGFwKGUgPT4gZS5zdG9wUHJvcGFnYXRpb24oKSksXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpXG4gICAgICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG1lbnRpb25BY3Rpb25CeUV2ZW50KSB7XG4gICAgICAgICAgICAgIG1lbnRpb25BY3Rpb25CeUV2ZW50KGl0ZW1BY3RpdmUsIHRyaWdnZXJDaGFyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3V0SW5zZXJ0TWVudGlvbi5lbWl0KHsgZGF0YTogeyBpZCwgdmFsdWU6IHRleHQsIGZlSWQgfSwgbGVuZ3RoS2V5OiBwb3MgLSAodGhpcy5zdGFydFBvcygpIHx8IDApIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveUxpc3RTZWFyY2goKTtcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgfVxufVxuIl19
|
|
505
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudGlvbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL21lbnRpb24vc3JjL21lbnRpb24uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQStCLFNBQVMsRUFBRSxVQUFVLEVBQTBCLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdKLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDaEosT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRS9KLE9BQU8sRUFBRSwwQ0FBMEMsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQU9uRixNQUFNLE9BQU8sc0NBQXNDO0lBRWpELG1CQUFtQjtJQUNYLGdCQUFnQixHQUFHLE1B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QUE7Z0JBQ0osQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzRyxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsQ0FBQzt3R0F4aEJVLHNDQUFzQzs0RkFBdEMsc0NBQXNDOzs0RkFBdEMsc0NBQXNDO2tCQUxsRCxTQUFTO21CQUFDO29CQUNULDhEQUE4RDtvQkFDOUQsUUFBUSxFQUFFLDBDQUEwQztvQkFDcEQsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50UmVmLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIE9uRGVzdHJveSwgVGVtcGxhdGVSZWYsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBJRXZlbnQsIFRZUEVfVEVNUExBVEVfUkVGIH0gZnJvbSBcIkBsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXNcIjtcbmltcG9ydCB7IExpYnNVaUR5bmFtaWNDb21wb25lbnRTZXJ2aWNlIH0gZnJvbSBcIkBsaWJzLXVpL3NlcnZpY2VzLWR5bmFtaWMtY29tcG9uZW50XCI7XG5pbXBvcnQgeyBnZXQsIGlzTmlsLCB1dWlkIH0gZnJvbSBcIkBsaWJzLXVpL3V0aWxzXCI7XG5pbXBvcnQgeyBTdWJqZWN0LCBmcm9tRXZlbnQgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgdGFrZVVudGlsLCB0YXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IEtFWV9CQUNLU1BBQ0UsIEtFWV9CVUZGRVJFRCwgS0VZX0RPV04sIEtFWV9FTlRFUiwgS0VZX0VTQ0FQRSwgS0VZX1NISUZULCBLRVlfU1BBQ0UsIEtFWV9UQUIsIEtFWV9VUCB9IGZyb20gXCIuL2RlZmluZXMva2V5Ym9hcmQuZGVmaW5lXCI7XG5pbXBvcnQgeyBERUZBVUxUX0NPTkZJRywgYnVpbGRUZW1wbGF0ZSB9IGZyb20gXCIuL2RlZmluZXMvdGVtcGxhdGUuZGVmaW5lXCI7XG5pbXBvcnQgeyBnZXRDYXJldFBvc2l0aW9uLCBnZXRUZXh0QmVmb3JlQ3Vyc29yLCBnZXRWYWx1ZSwgZ2V0V2luZG93U2VsZWN0aW9uLCBpbnNlcnRUZXh0QXRDYXJldCwgaW5zZXJ0VmFsdWUsIHNldENhcmV0UG9zaXRpb24gfSBmcm9tIFwiLi9kZWZpbmVzL3V0aWxzLmRlZmluZVwiO1xuaW1wb3J0IHsgSU1lbnRpb25Db25maWcsIElNZW50aW9uRnVuY3Rpb25Db250cm9sRXZlbnQsIElNZW50aW9uSW5zZXJ0LCBJTm9kZUluc2VydCB9IGZyb20gXCIuL2ludGVyZmFjZXMvbWVudGlvbi5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNZW50aW9uTGlzdENvbXBvbmVudCB9IGZyb20gXCIuL2xpc3QvbGlzdC5jb21wb25lbnRcIjtcblxuQERpcmVjdGl2ZSh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnW0xpYnNVaUNvbXBvbmVudHNJbnB1dHNNZW50aW9uRGlyZWN0aXZlXScsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0lucHV0c01lbnRpb25EaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJpdmF0ZSBsaXN0Q29tcG9uZW50UmVmID0gc2lnbmFsPENvbXBvbmVudFJlZjxMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkxpc3RDb21wb25lbnQ+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIG5vZGVzSW5zZXJ0ID0gc2lnbmFsPFNldDxJTm9kZUluc2VydD4+KG5ldyBTZXQoKSk7XG4gIHByaXZhdGUgYWN0aXZlQ29uZmlnID0gc2lnbmFsPElNZW50aW9uQ29uZmlnIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHRyaWdnZXJDaGFycyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBJTWVudGlvbkNvbmZpZz4+KHt9KTtcbiAgcHJpdmF0ZSBzZWFyY2hTdHJpbmcgPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByaXZhdGUgc3RhcnRQb3MgPSBzaWduYWw8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHN0YXJ0Tm9kZSA9IHNpZ25hbDxhbnk+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgc2VhcmNoTGlzdCA9IHNpZ25hbDxMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkxpc3RDb21wb25lbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgc2VhcmNoaW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBpZnJhbWUgPSBzaWduYWw8YW55Pih1bmRlZmluZWQpO1xuICBwcml2YXRlIGxhc3RLZXlDb2RlID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBpc0VkaXRvciA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgaWZyYW1lSWQgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGVsZW1lbnQgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgZHluYW1pY0NvbXBvbmVudFNlcnZpY2UgPSBpbmplY3QoTGlic1VpRHluYW1pY0NvbXBvbmVudFNlcnZpY2UpO1xuICBwcml2YXRlIG9uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gI3JlZ2lvbiBJTlBVVFxuICByZWFkb25seSB0aW1lRGVsYXlJbml0ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDAsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IDAgfSk7XG4gIHJlYWRvbmx5IG1lbnRpb25Db25maWcgPSBpbnB1dDxJTWVudGlvbkNvbmZpZz4oKTtcbiAgcmVhZG9ubHkgbWVudGlvbkxpc3RUZW1wbGF0ZSA9IGlucHV0PFRlbXBsYXRlUmVmPFRZUEVfVEVNUExBVEVfUkVGPj4oKTtcblxuICAvLyAjcmVnaW9uIE9VVFBVVFxuICByZWFkb25seSBvdXRTZWFyY2hUZXJtID0gb3V0cHV0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgb3V0SXRlbVNlbGVjdGVkID0gb3V0cHV0PHVua25vd24+KCk7XG4gIHJlYWRvbmx5IG91dFRvZ2dsZSA9IG91dHB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBvdXRJbnNlcnRNZW50aW9uID0gb3V0cHV0PElNZW50aW9uSW5zZXJ0PigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbkNvbnRyb2wgPSBvdXRwdXQ8SU1lbnRpb25GdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5tZW50aW9uQ29uZmlnKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy51cGRhdGVDb25maWcoKSk7XG4gICAgfSlcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5tZW50aW9uQ29uZmlnKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgaXNDb250ZW50RWRpdGFibGUgPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpO1xuICAgICAgdGhpcy5pc0VkaXRvci5zZXQoIWlzQ29udGVudEVkaXRhYmxlKTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSAhdGhpcy5pc0VkaXRvcigpID8gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgOiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcucWwtZWRpdG9yW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nKTtcbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZXJLZXlkb3duLmJpbmQodGhpcykoZXZlbnQsIGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZXJJbnB1dC5iaW5kKHRoaXMpKGV2ZW50LCBlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZXJCbHVyLmJpbmQodGhpcykoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZXJGb2N1cy5iaW5kKHRoaXMpKGV2ZW50LCBlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLm91dEZ1bmN0aW9uQ29udHJvbC5lbWl0KHtcbiAgICAgICAgYWRkTWVudGlvbjogKCkgPT4ge1xuICAgICAgICAgIGluc2VydFRleHRBdENhcmV0KGVsZW1lbnQsIGAke3RoaXMubWVudGlvbkNvbmZpZygpPy50cmlnZ2VyQ2hhcn1gKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlcktleWRvd24oeyBrZXk6IHRoaXMubWVudGlvbkNvbmZpZygpPy50cmlnZ2VyQ2hhciwga2V5Q29kZTogS0VZX0JBQ0tTUEFDRSwgc2hpZnRLZXk6IHRydWUsIGlucHV0RXZlbnQ6IHRydWUgfSwgZWxlbWVudCk7XG4gICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgdGhpcy50aW1lRGVsYXlJbml0KCkpO1xuICB9XG5cbiAgLyogRlVOQ1RJT05TICovXG4gIHByb3RlY3RlZCB1cGRhdGVDb25maWcoKSB7XG4gICAgY29uc3QgbWVudGlvbkNvbmZpZyA9IHRoaXMubWVudGlvbkNvbmZpZygpO1xuICAgIGlmICghbWVudGlvbkNvbmZpZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRyaWdnZXJDaGFycy5zZXQoe30pO1xuICAgIHRoaXMuYWRkQ29uZmlnKG1lbnRpb25Db25maWcpO1xuICAgIGlmIChtZW50aW9uQ29uZmlnLm1lbnRpb24pIHtcbiAgICAgIG1lbnRpb25Db25maWcubWVudGlvbi5mb3JFYWNoKGNvbmZpZyA9PiB0aGlzLmFkZENvbmZpZyhjb25maWcpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZENvbmZpZyhjb25maWc6IElNZW50aW9uQ29uZmlnKSB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0NPTkZJRyk7XG4gICAgY29uc3QgbGFiZWxLZXkgPSBjb25maWcubGFiZWxLZXkgfHwgJ2xhYmVsJztcbiAgICBjb25maWcgPSBPYmplY3QuYXNzaWduKGRlZmF1bHRzLCBjb25maWcpO1xuICAgIGlmIChjb25maWcuaXRlbXMgJiYgY29uZmlnLml0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnLml0ZW1zWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25maWcuaXRlbXMuZm9yRWFjaCgobGFiZWwpID0+IHtcbiAgICAgICAgICBjb25zdCBvYmplY3Q6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+ID0ge307XG4gICAgICAgICAgb2JqZWN0W2xhYmVsS2V5XSA9IGxhYmVsO1xuICAgICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGxhYmVsS2V5KSB7XG4gICAgICAgIC8vIHJlbW92ZSBpdGVtcyB3aXRob3V0IGFuIGxhYmVsS2V5IChhcyBpdCdzIHJlcXVpcmVkIHRvIGZpbHRlciB0aGUgbGlzdClcbiAgICAgICAgY29uZmlnLml0ZW1zID0gY29uZmlnLml0ZW1zLmZpbHRlcihlID0+IGVbbGFiZWxLZXldKTtcbiAgICAgICAgaWYgKCFjb25maWcuZGlzYWJsZVNvcnQpIHtcbiAgICAgICAgICBjb25maWcuaXRlbXMuc29ydCgoYSwgYikgPT4gKGFbbGFiZWxLZXldIHx8ICcnKS5sb2NhbGVDb21wYXJlKChiW2xhYmVsS2V5XSB8fCAnJykpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnRyaWdnZXJDaGFycy51cGRhdGUoaXRlbSA9PiAoe1xuICAgICAgLi4uaXRlbSxcbiAgICAgIFtjb25maWcudHJpZ2dlckNoYXIgfHwgJ0AnXTogY29uZmlnXG4gICAgfSkpXG4gICAgaWYgKHRoaXMuYWN0aXZlQ29uZmlnKCkgJiYgdGhpcy5hY3RpdmVDb25maWcoKT8udHJpZ2dlckNoYXIgPT09IGNvbmZpZy50cmlnZ2VyQ2hhcikge1xuICAgICAgdGhpcy5hY3RpdmVDb25maWcuc2V0KGNvbmZpZyk7XG4gICAgICB0aGlzLnVwZGF0ZVNlYXJjaExpc3QoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0SWZyYW1lKGlmcmFtZTogSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICB0aGlzLmlmcmFtZS5zZXQoaWZyYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcEV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGlmIChnZXQoZXZlbnQsICd3YXNDbGljaycpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckJsdXIoZXZlbnQ6IEV2ZW50KSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnN0b3BFdmVudChldmVudCk7XG4gICAgICB0aGlzLnN0b3BTZWFyY2goKTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJJbnB1dChldmVudDogRXZlbnQsIG5hdGl2ZUVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQgPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgIGNvbnN0IGRhdGEgPSBnZXQoZXZlbnQsICdkYXRhJyk7XG4gICAgaWYgKHRoaXMubGFzdEtleUNvZGUoKSA9PT0gS0VZX0JVRkZFUkVEICYmIGRhdGEpIHtcbiAgICAgIGNvbnN0IGtleUNvZGUgPSBkYXRhLmNoYXJDb2RlQXQoMCk7XG4gICAgICB0aGlzLmhhbmRsZXJLZXlkb3duKHsga2V5Q29kZSwgaW5wdXRFdmVudDogdHJ1ZSB9LCBuYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlcktleWRvd24oZXZlbnQ6IGFueSwgbmF0aXZlRWxlbWVudDogSFRNTElucHV0RWxlbWVudCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KTogYW55IHtcbiAgICB0aGlzLmxhc3RLZXlDb2RlLnNldChldmVudC5rZXlDb2RlKTtcbiAgICBpZiAoZXZlbnQuaXNDb21wb3NpbmcgfHwgZXZlbnQua2V5Q29kZSA9PT0gS0VZX0JVRkZFUkVEKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsOiBhbnkgPSBnZXRWYWx1ZShuYXRpdmVFbGVtZW50KTtcbiAgICBsZXQgcG9zOiBhbnkgPSBnZXRDYXJldFBvc2l0aW9uKG5hdGl2ZUVsZW1lbnQsIHRoaXMuaWZyYW1lKCkpO1xuICAgIGxldCBjaGFyUHJlc3NlZCA9IGV2ZW50LmtleTtcbiAgICBpZiAoIXRoaXMuaXNFZGl0b3IoKSkge1xuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtFWV9CQUNLU1BBQ0UpIHtcbiAgICAgICAgdGhpcy5hcHBlbmRFbXB0eVRvTGFzdE5vZGUocG9zLCB2YWwubGVuZ3RoLCBuYXRpdmVFbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hZGROb2RlWmVyb1dpZHRoU3BhY2UobmF0aXZlRWxlbWVudCksIDApO1xuICAgIH1cbiAgICBpZiAoIWNoYXJQcmVzc2VkKSB7XG4gICAgICBjb25zdCBjaGFyQ29kZSA9IGV2ZW50LndoaWNoIHx8IGV2ZW50LmtleUNvZGU7XG4gICAgICBjaGFyUHJlc3NlZCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQud2hpY2ggfHwgZXZlbnQua2V5Q29kZSk7XG4gICAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5ICYmIChjaGFyQ29kZSA+PSA2NSAmJiBjaGFyQ29kZSA8PSA5MCkpIHtcbiAgICAgICAgY2hhclByZXNzZWQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlICsgMzIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS0VZX0VOVEVSICYmIGV2ZW50Lndhc0NsaWNrICYmIHBvcyA8ICh0aGlzLnN0YXJ0UG9zKCkgfHwgMCkpIHtcbiAgICAgIHBvcyA9IHRoaXMuc3RhcnROb2RlKCkubGVuZ3RoO1xuICAgICAgc2V0Q2FyZXRQb3NpdGlvbih0aGlzLnN0YXJ0Tm9kZSgpLCBwb3MsIHRoaXMuaWZyYW1lKCkpO1xuICAgIH1cbiAgICBjb25zdCBjb25maWcgPSB0aGlzLnRyaWdnZXJDaGFycygpW2NoYXJQcmVzc2VkXTtcbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICB0aGlzLmFjdGl2ZUNvbmZpZy5zZXQoY29uZmlnKTtcbiAgICAgIHRoaXMuc3RhcnRQb3Muc2V0KGV2ZW50LmlucHV0RXZlbnQgPyBwb3MgLSAxIDogcG9zKTtcbiAgICAgIHRoaXMuc3RhcnROb2RlLnNldChnZXRXaW5kb3dTZWxlY3Rpb24odGhpcy5pZnJhbWUoKSk/LmFuY2hvck5vZGUpO1xuICAgICAgdGhpcy5zZWFyY2hpbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5zZWFyY2hTdHJpbmcuc2V0KCcnKTtcbiAgICAgIHRoaXMuc2hvd1NlYXJjaExpc3QobmF0aXZlRWxlbWVudCk7XG4gICAgICB0aGlzLnVwZGF0ZVNlYXJjaExpc3QoKTtcbiAgICAgIGlmIChjb25maWcucmV0dXJuVHJpZ2dlcikge1xuICAgICAgICB0aGlzLm91dFNlYXJjaFRlcm0uZW1pdChjb25maWcudHJpZ2dlckNoYXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgaXRlbVNldCBvZiB0aGlzLm5vZGVzSW5zZXJ0KCkpIHtcbiAgICAgICAgaWYgKCFuYXRpdmVFbGVtZW50LmNvbnRhaW5zKGl0ZW1TZXQuZWxlbWVudFNwYW4pKSB7XG4gICAgICAgICAgaXRlbVNldC5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgdGhpcy5ub2Rlc0luc2VydCgpLmRlbGV0ZShpdGVtU2V0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHN0YXJ0UG9zID0gdGhpcy5zdGFydFBvcygpO1xuICAgIGlmIChpc05pbChzdGFydFBvcykgfHwgc3RhcnRQb3MgPCAwIHx8ICF0aGlzLnNlYXJjaGluZygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNlYXJjaExpc3QgPSB0aGlzLnNlYXJjaExpc3QoKTtcbiAgICBpZiAocG9zIDw9IHN0YXJ0UG9zKSB7XG4gICAgICBpZiAoc2VhcmNoTGlzdCkge1xuICAgICAgICBzZWFyY2hMaXN0LmhpZGRlbi5zZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLRVlfU0hJRlQgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBwb3MgPD0gc3RhcnRQb3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmFjdGl2ZUNvbmZpZygpPy5hbGxvd1NwYWNlICYmIGV2ZW50LmtleUNvZGUgPT09IEtFWV9TUEFDRSkge1xuICAgICAgdGhpcy5zdGFydFBvcy5zZXQoLTEpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS0VZX0JBQ0tTUEFDRSAmJiBwb3MgPiAwKSB7XG4gICAgICBwb3MtLTtcbiAgICAgIGlmIChwb3MgPT09IHRoaXMuc3RhcnRQb3MoKSkge1xuICAgICAgICB0aGlzLnN0b3BTZWFyY2goKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoc2VhcmNoTGlzdD8uaGlkZGVuKCkpIHtcbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLRVlfVEFCIHx8IGV2ZW50LmtleUNvZGUgPT09IEtFWV9FTlRFUikge1xuICAgICAgICB0aGlzLnN0b3BTZWFyY2goKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICghc2VhcmNoTGlzdD8uaGlkZGVuKCkgJiYgdGhpcy5hY3RpdmVDb25maWcoKSkge1xuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtFWV9UQUIgfHwgZXZlbnQua2V5Q29kZSA9PT0gS0VZX0VOVEVSKSB7XG4gICAgICAgIHRoaXMuc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgLy8gZW1pdCB0aGUgc2VsZWN0ZWQgbGlzdCBpdGVtXG4gICAgICAgIHRoaXMub3V0SXRlbVNlbGVjdGVkLmVtaXQoc2VhcmNoTGlzdD8uQWN0aXZlSXRlbSk7XG4gICAgICAgIC8vIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGZvcm1hdCB0aGUgc2VsZWN0ZWQgaXRlbSBiZWZvcmUgaW5zZXJ0aW5nIHRoZSB0ZXh0XG4gICAgICAgIHRoaXMuaW5zZXJ0TWVudGlvbihuYXRpdmVFbGVtZW50LCBwb3MpO1xuICAgICAgICAvLyBmaXJlIGlucHV0IGV2ZW50IHNvIGFuZ3VsYXIgYmluZGluZ3MgYXJlIHVwZGF0ZWRcbiAgICAgICAgaWYgKFwiRXZlbnRcIiBpbiB3aW5kb3cpIHtcbiAgICAgICAgICAvLyB0aGlzIHNlZW1zIGJhY2t3YXJkcywgYnV0IGZpcmUgdGhlIGV2ZW50IGZyb20gdGhpcyBlbGVtZW50cyBuYXRpdmVFbGVtZW50IChub3QgdGhlXG4gICAgICAgICAgLy8gb25lIHByb3ZpZGVkIHRoYXQgbWF5IGJlIGluIGFuIGlmcmFtZSwgYXMgaXQgd29uJ3QgYmUgcHJvcG9nYXRlKVxuICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZXZlbnQgdXNpbmcgdGhlIG1vZGVybiBFdmVudCBjb25zdHJ1Y3RvclxuICAgICAgICAgIGNvbnN0IGV2dCA9IG5ldyBFdmVudCh0aGlzLmlmcmFtZSgpID8gXCJjaGFuZ2VcIiA6IFwiaW5wdXRcIiwge1xuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV2ZW50IG9uIHRoZSBuYXRpdmUgZWxlbWVudFxuICAgICAgICAgIG5hdGl2ZUVsZW1lbnQuZGlzcGF0Y2hFdmVudChldnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhcnRQb3Muc2V0KC0xKTtcbiAgICAgICAgdGhpcy5zdG9wU2VhcmNoKCk7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS0VZX0VTQ0FQRSkge1xuICAgICAgICB0aGlzLnN0b3BFdmVudChldmVudCk7XG4gICAgICAgIHRoaXMuc3RvcFNlYXJjaCgpO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLRVlfRE9XTikge1xuICAgICAgICB0aGlzLnN0b3BFdmVudChldmVudCk7XG4gICAgICAgIHNlYXJjaExpc3Q/LmFjdGl2YXRlTmV4dEl0ZW0oKTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS0VZX1VQKSB7XG4gICAgICAgIHRoaXMuc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgc2VhcmNoTGlzdD8uYWN0aXZhdGVQcmV2aW91c0l0ZW0oKTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFyUHJlc3NlZC5sZW5ndGggIT09IDEgJiYgZXZlbnQua2V5Q29kZSAhPT0gS0VZX0JBQ0tTUEFDRSkge1xuICAgICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5zZWFyY2hpbmcoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgbWVudGlvbiA9IHZhbC5zdWJzdHJpbmcoKHRoaXMuc3RhcnRQb3MoKSB8fCAwKSArIDEsIHBvcyk7XG5cbiAgICBpZiAoZXZlbnQua2V5Q29kZSAhPT0gS0VZX0JBQ0tTUEFDRSAmJiAhZXZlbnQuaW5wdXRFdmVudCkge1xuICAgICAgbWVudGlvbiArPSBjaGFyUHJlc3NlZDtcbiAgICB9XG4gICAgY29uc3Qgc2VhcmNoU3RyaW5nID0gbWVudGlvbi5yZXBsYWNlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSwgJyAnKS5yZXBsYWNlKFN0cmluZy5mcm9tQ2hhckNvZGUoMCksICcnKTtcbiAgICB0aGlzLnNlYXJjaFN0cmluZy5zZXQoc2VhcmNoU3RyaW5nLnRyaW0oKSk7XG4gICAgY29uc3QgbGltaXRTcGFjZVNlYXJjaFF1ZXJ5ID0gdGhpcy5hY3RpdmVDb25maWcoKT8ubGltaXRTcGFjZVNlYXJjaFF1ZXJ5O1xuICAgIGlmIChsaW1pdFNwYWNlU2VhcmNoUXVlcnkgJiYgKHNlYXJjaFN0cmluZy5zcGxpdCgnICcpLmxlbmd0aCAtIDEpID4gbGltaXRTcGFjZVNlYXJjaFF1ZXJ5KSB7XG4gICAgICB0aGlzLnNlYXJjaFN0cmluZy5zZXQoJycpO1xuICAgIH1cbiAgICBpZiAodGhpcy5hY3RpdmVDb25maWcoKT8ucmV0dXJuVHJpZ2dlcikge1xuICAgICAgY29uc3QgdHJpZ2dlckNoYXIgPSAodGhpcy5zZWFyY2hTdHJpbmcoKSB8fCBldmVudC5rZXlDb2RlID09PSBLRVlfQkFDS1NQQUNFKSA/IHZhbC5zdWJzdHJpbmcodGhpcy5zdGFydFBvcygpLCAodGhpcy5zdGFydFBvcygpIHx8IDApICsgMSkgOiAnJztcblxuICAgICAgdGhpcy5vdXRTZWFyY2hUZXJtLmVtaXQodHJpZ2dlckNoYXIgKyB0aGlzLnNlYXJjaFN0cmluZygpKTtcbiAgICAgIHRoaXMudXBkYXRlU2VhcmNoTGlzdCgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3V0U2VhcmNoVGVybS5lbWl0KHRoaXMuc2VhcmNoU3RyaW5nKCkpO1xuICAgIHRoaXMudXBkYXRlU2VhcmNoTGlzdCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJGb2N1cyhlPzogRXZlbnQsIG5hdGl2ZUVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQgPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgIGU/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3Qgbm9kZSA9IGdldFdpbmRvd1NlbGVjdGlvbih0aGlzLmlmcmFtZSgpKT8uYW5jaG9yTm9kZTtcblxuICAgICAgaWYgKG5vZGU/Lm5vZGVUeXBlICE9PSAzKSB7XG4gICAgICAgIHRoaXMuc3RvcFNlYXJjaCgpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRleHRCZWZvcmVDdXJzb3IgPSBnZXRUZXh0QmVmb3JlQ3Vyc29yKCkgfHwgJyc7XG5cbiAgICAgIGNvbnN0IHRyaWdnZXJDaGFycyA9IE9iamVjdC5rZXlzKHRoaXMudHJpZ2dlckNoYXJzKCkpLm1hcCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICBjb25maWc6IHRoaXMudHJpZ2dlckNoYXJzKClba2V5XSxcbiAgICAgICAgICBpbmRleDogdGV4dEJlZm9yZUN1cnNvci5sYXN0SW5kZXhPZihrZXkpIGFzIG51bWJlclxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBjb25zdCBtYXRjaGluZ0NoYXJhY3RlcnMgPSB0cmlnZ2VyQ2hhcnMucmVkdWNlKChwcmUsIGN1cnJlbnQpID0+IHByZSAmJiBjdXJyZW50ICYmIGN1cnJlbnQuaW5kZXggPiBwcmUuaW5kZXggPyBjdXJyZW50IDogcHJlKTtcblxuICAgICAgaWYgKG1hdGNoaW5nQ2hhcmFjdGVycy5pbmRleCA8IDApIHtcbiAgICAgICAgdGhpcy5zdG9wU2VhcmNoKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VhcmNoID0gdGV4dEJlZm9yZUN1cnNvcj8uc3Vic3RyaW5nKG1hdGNoaW5nQ2hhcmFjdGVycy5pbmRleCwgdGV4dEJlZm9yZUN1cnNvci5sZW5ndGgpO1xuXG4gICAgICBpZiAoIXNlYXJjaCkge1xuICAgICAgICB0aGlzLnN0b3BTZWFyY2goKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBwb3MgPSBnZXRDYXJldFBvc2l0aW9uKG5hdGl2ZUVsZW1lbnQsIHRoaXMuaWZyYW1lKCkpO1xuXG4gICAgICB0aGlzLmFjdGl2ZUNvbmZpZy5zZXQobWF0Y2hpbmdDaGFyYWN0ZXJzLmNvbmZpZyk7XG4gICAgICB0aGlzLnN0YXJ0UG9zLnNldChwb3MgLSAodGV4dEJlZm9yZUN1cnNvci5sZW5ndGggLSBtYXRjaGluZ0NoYXJhY3RlcnMuaW5kZXgpKTtcbiAgICAgIHRoaXMuc2VhcmNoU3RyaW5nLnNldChzZWFyY2gucmVwbGFjZShtYXRjaGluZ0NoYXJhY3RlcnMua2V5LCAnJykpO1xuICAgICAgdGhpcy5zZWFyY2hpbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5oYW5kbGVyS2V5ZG93bih7IGtleUNvZGU6ICcnLmNoYXJDb2RlQXQoMCksIGlucHV0RXZlbnQ6IGZhbHNlIH0sIG5hdGl2ZUVsZW1lbnQpO1xuICAgICAgY29uc3QgZGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cbiAgICAgIGRpdkVsZW1lbnQuc3R5bGUud2lkdGggPSAnbWF4LWNvbnRlbnQnO1xuICAgICAgZGl2RWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICBkaXZFbGVtZW50LmlubmVyVGV4dCA9IHNlYXJjaDtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2RWxlbWVudCk7XG4gICAgICBsZXQgaWZyYW1lID0gdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWZyYW1lID0gdGhpcy5tZW50aW9uQ29uZmlnKCk/LmlmcmFtZSA/ICh3aW5kb3cucGFyZW50LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubWVudGlvbkNvbmZpZygpPy5pZnJhbWUgYXMgc3RyaW5nKSBhcyBIVE1MSUZyYW1lRWxlbWVudCkgOiB1bmRlZmluZWQ7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICB9XG4gICAgICBjb25zdCBzZWFyY2hMaXN0ID0gdGhpcy5zZWFyY2hMaXN0KCk7XG4gICAgICBpZiAoc2VhcmNoTGlzdCkge1xuICAgICAgICBzZWFyY2hMaXN0LnBvc2l0aW9uKG5hdGl2ZUVsZW1lbnQsIGlmcmFtZSwgZGl2RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aClcbiAgICAgIH1cbiAgICAgIGRpdkVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICBuYXRpdmVFbGVtZW50Lm5vcm1hbGl6ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wU2VhcmNoKCkge1xuICAgIGNvbnN0IHNlYXJjaExpc3QgPSB0aGlzLnNlYXJjaExpc3QoKTtcbiAgICBpZiAoc2VhcmNoTGlzdCAmJiAhc2VhcmNoTGlzdC5oaWRkZW4oKSkge1xuICAgICAgc2VhcmNoTGlzdC5oaWRkZW4uc2V0KHRydWUpO1xuICAgICAgdGhpcy5vdXRUb2dnbGUuZW1pdChmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlQ29uZmlnLnNldCh1bmRlZmluZWQpO1xuICAgIHRoaXMuc2VhcmNoaW5nLnNldChmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNlYXJjaExpc3QoKSB7XG4gICAgY29uc3QgbWF0Y2hlczogYW55W10gPSBbXTtcbiAgICBjb25zdCBhY3RpdmVDb25maWcgPSB0aGlzLmFjdGl2ZUNvbmZpZygpO1xuICAgIGNvbnN0IHNlYXJjaFN0cmluZyA9IHRoaXMuc2VhcmNoU3RyaW5nKCk7XG4gICAgY29uc3Qgc2VhcmNoTGlzdCA9IHRoaXMuc2VhcmNoTGlzdCgpO1xuICAgIC8vIGRpc2FibGluZyB0aGUgc2VhcmNoIHJlbGllcyBvbiB0aGUgYXN5bmMgb3BlcmF0aW9uIHRvIGRvIHRoZSBmaWx0ZXJpbmdcbiAgICBpZiAoYWN0aXZlQ29uZmlnICYmIGFjdGl2ZUNvbmZpZy5pdGVtcyAmJiAhYWN0aXZlQ29uZmlnLmRpc2FibGVTZWFyY2ggJiYgIWlzTmlsKHNlYXJjaFN0cmluZykgJiYgYWN0aXZlQ29uZmlnLmxhYmVsS2V5ICYmIGFjdGl2ZUNvbmZpZy5tZW50aW9uRmlsdGVyKSB7XG4gICAgICBtYXRjaGVzLnB1c2goLi4uYWN0aXZlQ29uZmlnLm1lbnRpb25GaWx0ZXIoc2VhcmNoU3RyaW5nLCBhY3RpdmVDb25maWcuaXRlbXMpIGFzIGFueSk7XG4gICAgfVxuICAgIC8vIHVwZGF0ZSB0aGUgc2VhcmNoIGxpc3RcbiAgICBpZiAoIXNlYXJjaExpc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2VhcmNoTGlzdC5pdGVtcy5zZXQobWF0Y2hlcyk7XG4gICAgc2VhcmNoTGlzdC5oaWRkZW4uc2V0KCFtYXRjaGVzLmxlbmd0aCk7XG4gICAgc2VhcmNoTGlzdC5hY3RpdmVJbmRleC5zZXQoMCk7XG4gICAgc2VhcmNoTGlzdC5zY3JvbGxDb250ZW50KCk7XG4gICAgdGhpcy5vdXRUb2dnbGUuZW1pdChtYXRjaGVzLmxlbmd0aCA/IHRydWUgOiBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIHNob3dTZWFyY2hMaXN0KG5hdGl2ZUVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICBsZXQgaWZyYW1lID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1lbnRpb25Db25maWcgPSB0aGlzLm1lbnRpb25Db25maWcoKTtcbiAgICB0cnkge1xuICAgICAgaWZyYW1lID0gbWVudGlvbkNvbmZpZz8uaWZyYW1lID8gd2luZG93LnBhcmVudC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChtZW50aW9uQ29uZmlnPy5pZnJhbWUgYXMgc3RyaW5nKSBhcyBIVE1MSUZyYW1lRWxlbWVudCA6IHVuZGVmaW5lZDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgIH1cbiAgICBpZiAoIW1lbnRpb25Db25maWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vdXRUb2dnbGUuZW1pdCh0cnVlKTtcbiAgICBsZXQgZmlyc3RUaW1lID0gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMubGlzdENvbXBvbmVudFJlZigpKSB7XG4gICAgICBmaXJzdFRpbWUgPSB0cnVlO1xuICAgICAgdGhpcy5saXN0Q29tcG9uZW50UmVmLnNldCh0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KExpYnNVaUNvbXBvbmVudHNJbnB1dHNNZW50aW9uTGlzdENvbXBvbmVudCkpO1xuICAgICAgdGhpcy5zZWFyY2hMaXN0LnNldCh0aGlzLmxpc3RDb21wb25lbnRSZWYoKT8uaW5zdGFuY2UpO1xuICAgIH1cbiAgICB0aGlzLnNlYXJjaExpc3QoKT8ubGFiZWxLZXkuc2V0KHRoaXMuYWN0aXZlQ29uZmlnKCk/LmxhYmVsS2V5IHx8ICcnKTtcbiAgICB0aGlzLnNlYXJjaExpc3QoKT8uc3R5bGVPZmYuc2V0KHRoaXMubWVudGlvbkNvbmZpZygpPy5kaXNhYmxlU3R5bGUgfHwgZmFsc2UpO1xuICAgIHRoaXMuc2VhcmNoTGlzdCgpPy5hY3RpdmVJbmRleC5zZXQoMCk7XG4gICAgdGhpcy5zZWFyY2hMaXN0KCk/LnpJbmRleC5zZXQodGhpcy5tZW50aW9uQ29uZmlnKCk/LnpJbmRleCB8fCAyNTAwKTtcbiAgICB0aGlzLnNlYXJjaExpc3QoKT8uaXNJZnJhbWUuc2V0KGlmcmFtZSA/IHRydWUgOiBmYWxzZSk7XG4gICAgdGhpcy5zZWFyY2hMaXN0KCk/LnBhcmVudEhhbmRsZXJLZXlEb3duLnNldCh0aGlzLmhhbmRsZXJLZXlkb3duLmJpbmQodGhpcykpO1xuICAgIHRoaXMuc2VhcmNoTGlzdCgpPy5wb3NpdGlvbihuYXRpdmVFbGVtZW50LCBpZnJhbWUpO1xuICAgIGlmIChmaXJzdFRpbWUgJiYgdGhpcy5saXN0Q29tcG9uZW50UmVmKCkpIHtcbiAgICAgIHRoaXMuaWZyYW1lSWQuc2V0KHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UuYWRkVG9Cb2R5KHRoaXMubGlzdENvbXBvbmVudFJlZigpLCBpZnJhbWUgPyB0cnVlIDogZmFsc2UpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lMaXN0U2VhcmNoKCkge1xuICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVtb3ZlKHRoaXMubGlzdENvbXBvbmVudFJlZiwgdGhpcy5pZnJhbWVJZCgpKTtcbiAgICB0aGlzLmxpc3RDb21wb25lbnRSZWYuc2V0KHVuZGVmaW5lZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBwZW5kRW1wdHlUb0xhc3ROb2RlKHBvc2l0aW9uOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyLCBuYXRpdmVFbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICBjb25zdCBlbXB0eSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdcXHUwMEEwJyk7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZ2V0V2luZG93U2VsZWN0aW9uKHRoaXMuaWZyYW1lKCkpO1xuICAgIGNvbnN0IGFuY2hvck5vZGUgPSBzZWxlY3Rpb24/LmFuY2hvck5vZGU7XG5cbiAgICBpZiAodGhpcy5pc0VkaXRvcigpKSB7XG4gICAgICBjb25zdCBwYXJlbnROb2RlID0gYW5jaG9yTm9kZT8ucGFyZW50Tm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICBpZiAocGFyZW50Tm9kZSAmJiBwYXJlbnROb2RlLmdldEF0dHJpYnV0ZSAmJiBwYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgnaWQnKSkge1xuICAgICAgICBpZiAoIXBhcmVudE5vZGUubmV4dFNpYmxpbmcgfHwgIXBhcmVudE5vZGUubmV4dFNpYmxpbmcudGV4dENvbnRlbnQ/Lmxlbmd0aCkge1xuICAgICAgICAgIHBhcmVudE5vZGU/LnBhcmVudE5vZGU/Lmluc2VydEJlZm9yZShlbXB0eSwgcGFyZW50Tm9kZS5uZXh0U2libGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQocGFyZW50Tm9kZS5uZXh0U2libGluZyBhcyBOb2RlLCAwKTtcbiAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XG4gICAgICAgIHNlbD8ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIHNlbD8uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBwcmVOb2RlID0gbnVsbDtcbiAgICBjb25zdCBhbmNob3JPZmZzZXQgPSBzZWxlY3Rpb24/LmFuY2hvck9mZnNldDtcblxuICAgIGlmICghYW5jaG9yTm9kZSB8fCAhYW5jaG9yT2Zmc2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGFuY2hvck5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJyN0ZXh0Jykge1xuICAgICAgbmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChlbXB0eSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdGl2ZUVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IG5hdGl2ZUVsZW1lbnQuY2hpbGROb2Rlc1tpXTtcblxuICAgICAgaWYgKGFuY2hvck5vZGUubm9kZVR5cGUgPT09IDMgJiYgYW5jaG9yTm9kZSA9PT0gbm9kZSAmJiBwcmVOb2RlICYmIHByZU5vZGUuZ2V0QXR0cmlidXRlICYmIHByZU5vZGUuZ2V0QXR0cmlidXRlKCdpZCcpICYmICghYW5jaG9yTm9kZS50ZXh0Q29udGVudD8ubGVuZ3RoIHx8IGFuY2hvck5vZGUudGV4dENvbnRlbnQubGVuZ3RoID09PSAxKSAmJiBwb3NpdGlvbiA9PT0gbGVuZ3RoKSB7XG4gICAgICAgIG5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZW1wdHkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHByZU5vZGUgPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFkZE5vZGVaZXJvV2lkdGhTcGFjZShuYXRpdmVFbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICBjb25zdCBlbXB0eSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdcXHUyMDBiJyk7XG4gICAgbGV0IHByZU5vZGUgPSBudWxsO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRpdmVFbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGU6IGFueSA9IG5hdGl2ZUVsZW1lbnQuY2hpbGROb2Rlc1tpXTtcblxuICAgICAgaWYgKHByZU5vZGUgJiYgcHJlTm9kZS5nZXRBdHRyaWJ1dGUgJiYgcHJlTm9kZS5nZXRBdHRyaWJ1dGUoJ2lkJykgJiYgbm9kZSAmJiBub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZSgnaWQnKSkge1xuICAgICAgICBuYXRpdmVFbGVtZW50Lmluc2VydEJlZm9yZShlbXB0eSwgcHJlTm9kZS5uZXh0U2libGluZyk7XG4gICAgICB9XG5cbiAgICAgIHByZU5vZGUgPSBub2RlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5zZXJ0TWVudGlvbihuYXRpdmVFbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50LCBwb3M6IG51bWJlcikge1xuICAgIGNvbnN0IGFjdGl2ZUNvbmZpZyA9IHRoaXMuYWN0aXZlQ29uZmlnKCk7XG4gICAgaWYgKCFhY3RpdmVDb25maWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VhcmNoTGlzdCA9IHRoaXMuc2VhcmNoTGlzdCgpO1xuICAgIGxldCB0ZXh0ID0gJyc7XG4gICAgY29uc3QgZmVJZCA9IHV1aWQoKTtcbiAgICBjb25zdCBpZCA9IHNlYXJjaExpc3Q/LkFjdGl2ZUl0ZW0uaWQgfHwgdXVpZCgpO1xuICAgIGNvbnN0IGl0ZW1BY3RpdmUgPSBzZWFyY2hMaXN0Py5BY3RpdmVJdGVtO1xuICAgIGNvbnN0IHsgdHJpZ2dlckNoYXIsIG1lbnRpb25FdmVudE5hbWUsIG1lbnRpb25BY3Rpb25CeUV2ZW50IH0gPSBhY3RpdmVDb25maWc7XG5cbiAgICBpZiAoYWN0aXZlQ29uZmlnLm1lbnRpb25TZWxlY3QpIHtcbiAgICAgIHRleHQgPSBhY3RpdmVDb25maWcubWVudGlvblNlbGVjdChzZWFyY2hMaXN0Py5BY3RpdmVJdGVtLCBhY3RpdmVDb25maWcudHJpZ2dlckNoYXIpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNFZGl0b3IoKSkge1xuICAgICAgbGV0IHNwYW46IEhUTUxTcGFuRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1RFWFRBUkVBJyk7XG5cbiAgICAgIHNwYW4uaW5uZXJUZXh0ID0gdGV4dDtcbiAgICAgIHRleHQgPSBzcGFuLmlubmVySFRNTDtcbiAgICAgIHNwYW4ucmVtb3ZlKCk7XG4gICAgICB0ZXh0ID0gYnVpbGRUZW1wbGF0ZSh0ZXh0LCBpZCwgZmVJZCk7XG4gICAgICBzcGFuID0gaW5zZXJ0VmFsdWUobmF0aXZlRWxlbWVudCwgdGhpcy5zdGFydFBvcygpIHx8IDAsIHBvcywgdGV4dCwgdGhpcy5pZnJhbWUoKSkgYXMgSFRNTFNwYW5FbGVtZW50O1xuICAgICAgaWYgKHNwYW4pIHtcbiAgICAgICAgY29uc3QgZGF0YTogSU5vZGVJbnNlcnQgPSB7XG4gICAgICAgICAgZWxlbWVudFNwYW46IHNwYW4sXG4gICAgICAgICAgc3Vic2NyaXB0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgICAgaXRlbTogaXRlbUFjdGl2ZSxcbiAgICAgICAgICB0cmlnZ2VyQ2hhcjogdHJpZ2dlckNoYXIsXG4gICAgICAgICAgbWFudWFsQWRkOiB0cnVlXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5ub2Rlc0luc2VydCgpLmFkZChkYXRhKTtcbiAgICAgICAgaWYgKG1lbnRpb25FdmVudE5hbWUpIHtcbiAgICAgICAgICBkYXRhLnN1YnNjcmlwdGlvbiA9IGZyb21FdmVudDxJRXZlbnQ+KHNwYW4sIG1lbnRpb25FdmVudE5hbWUpLnBpcGUoXG4gICAgICAgICAgICB0YXAoZSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpKSxcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSlcbiAgICAgICAgICApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAobWVudGlvbkFjdGlvbkJ5RXZlbnQpIHtcbiAgICAgICAgICAgICAgbWVudGlvbkFjdGlvbkJ5RXZlbnQoaXRlbUFjdGl2ZSwgdHJpZ2dlckNoYXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vdXRJbnNlcnRNZW50aW9uLmVtaXQoeyBkYXRhOiB7IGlkLCB2YWx1ZTogdGV4dCwgZmVJZCB9LCBsZW5ndGhLZXk6IHBvcyAtICh0aGlzLnN0YXJ0UG9zKCkgfHwgMCkgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95TGlzdFNlYXJjaCgpO1xuICAgIHRoaXMub25EZXN0cm95Lm5leHQoKTtcbiAgICB0aGlzLm9uRGVzdHJveS5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=
|
|
@@ -610,6 +610,7 @@ class LibsUiComponentsInputsMentionDirective {
|
|
|
610
610
|
dynamicComponentService = inject(LibsUiDynamicComponentService);
|
|
611
611
|
onDestroy = new Subject();
|
|
612
612
|
// #region INPUT
|
|
613
|
+
timeDelayInit = input(0, { transform: val => val ?? 0 });
|
|
613
614
|
mentionConfig = input();
|
|
614
615
|
mentionListTemplate = input();
|
|
615
616
|
// #region OUTPUT
|
|
@@ -654,7 +655,7 @@ class LibsUiComponentsInputsMentionDirective {
|
|
|
654
655
|
}, 500);
|
|
655
656
|
}
|
|
656
657
|
});
|
|
657
|
-
});
|
|
658
|
+
}, this.timeDelayInit());
|
|
658
659
|
}
|
|
659
660
|
/* FUNCTIONS */
|
|
660
661
|
updateConfig() {
|
|
@@ -1073,7 +1074,7 @@ class LibsUiComponentsInputsMentionDirective {
|
|
|
1073
1074
|
this.onDestroy.complete();
|
|
1074
1075
|
}
|
|
1075
1076
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsInputsMentionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1076
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.13", type: LibsUiComponentsInputsMentionDirective, isStandalone: true, selector: "[LibsUiComponentsInputsMentionDirective]", inputs: { mentionConfig: { classPropertyName: "mentionConfig", publicName: "mentionConfig", isSignal: true, isRequired: false, transformFunction: null }, mentionListTemplate: { classPropertyName: "mentionListTemplate", publicName: "mentionListTemplate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outSearchTerm: "outSearchTerm", outItemSelected: "outItemSelected", outToggle: "outToggle", outInsertMention: "outInsertMention", outFunctionControl: "outFunctionControl" }, ngImport: i0 });
|
|
1077
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.13", type: LibsUiComponentsInputsMentionDirective, isStandalone: true, selector: "[LibsUiComponentsInputsMentionDirective]", inputs: { timeDelayInit: { classPropertyName: "timeDelayInit", publicName: "timeDelayInit", isSignal: true, isRequired: false, transformFunction: null }, mentionConfig: { classPropertyName: "mentionConfig", publicName: "mentionConfig", isSignal: true, isRequired: false, transformFunction: null }, mentionListTemplate: { classPropertyName: "mentionListTemplate", publicName: "mentionListTemplate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outSearchTerm: "outSearchTerm", outItemSelected: "outItemSelected", outToggle: "outToggle", outInsertMention: "outInsertMention", outFunctionControl: "outFunctionControl" }, ngImport: i0 });
|
|
1077
1078
|
}
|
|
1078
1079
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsInputsMentionDirective, decorators: [{
|
|
1079
1080
|
type: Directive,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libs-ui-components-inputs-mention.mjs","sources":["../../../../../../libs-ui/components/inputs/mention/src/defines/keyboard.define.ts","../../../../../../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":["export const KEY_BACKSPACE = 8;\nexport const KEY_TAB = 9;\nexport const KEY_ENTER = 13;\nexport const KEY_SHIFT = 16;\nexport const KEY_ESCAPE = 27;\nexport const KEY_SPACE = 32;\nexport const KEY_UP = 38;\nexport const KEY_DOWN = 40;\nexport const KEY_BUFFERED = 229;","import { deleteUnicode, get } from \"@libs-ui/utils\";\r\nimport { IMentionConfig } from \"../interfaces/mention.interface\";\r\nexport const PATTERN_INSERT = '\\ufeff';\r\n\r\nexport const buildTemplate = (value: string, id: string, feId: string): string => {\r\n return `<span class=\"mo-lib-shared-mention\" 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> `;\r\n};\r\n\r\nexport const DEFAULT_CONFIG: IMentionConfig = {\r\n items: [],\r\n triggerChar: '@',\r\n labelKey: 'email',\r\n allowSpace: true,\r\n returnTrigger: false,\r\n limitSpaceSearchQuery: 3,\r\n mentionEventName: 'click',\r\n mentionActionByEvent: (item, trigger) => console.log(item, trigger),\r\n mentionSelect: (item) => `@${get(item, 'email')}`,\r\n mentionFilter: (search: string, items?: Array<unknown>) => {\r\n const searchString = deleteUnicode(search.toLowerCase());\r\n\r\n return items?.filter(item => {\r\n const name = deleteUnicode(get(item, 'name').toLowerCase());\r\n const userName = deleteUnicode(get(item, 'username').toLowerCase());\r\n\r\n return name.includes(searchString) || userName.includes(searchString);\r\n });\r\n }\r\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 || !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 || !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); //window.getSelection();\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(undefined)?.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 return;\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};","/* From: https://github.com/component/textarea-caret-position */\n\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];\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) { style.wordBreak = 'break-word' } // 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, 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)) { style.overflowY = 'scroll' }\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 { 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 } from \"@libs-ui/utils\";\nimport { fromEvent, Subject, takeUntil } from \"rxjs\";\nimport { getCaretCoordinates } from \"../defines/caret-coords.define\";\nimport { KEY_ENTER } from \"../defines/keyboard.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: [\n LibsUiComponentsAvatarComponent,\n LibsUiComponentsPopoverComponent\n ]\n})\nexport class LibsUiComponentsInputsMentionListComponent implements OnInit, OnDestroy {\n\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 coords = signal<{ top: number, left: number, bottom?: number }>({ top: 0, left: 0, bottom: 0 });\n private offset = signal<number>(0);\n private nativeParentElement = signal<HTMLInputElement | undefined>(undefined);\n private 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\n /* VIEW CHILD */\n readonly elementEl = viewChild<ElementRef>('element');\n readonly itemsEl = viewChildren<ElementRef>('item');\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).pipe(takeUntil(this.onDestroy)).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 rect = iframe.getBoundingClientRect();\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, 'keyCode', KEY_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 && 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}\n","<div #element\n class=\"libs-ui-mention-list\"\n [style.zIndex]=\"zIndex()\"\n [class.hidden]=\"hidden()\">\n @for (item of items(); track item) {\n <div #item\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 <div class=\"px-[12px] py-[6px] flex items-center\">\n <libs_ui-components-avatar [size]=\"24\"\n [linkAvatar]=\"item.avatar\"\n [linkAvatarError]=\"defaultAvatar()\"\n [textAvatar]=\"item.name\"\n [idGenColor]=\"item.id\"\n [getLastTextAfterSpace]=\"true\" />\n <libs_ui-components-popover [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 </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 { get, isNil, uuid } from \"@libs-ui/utils\";\nimport { Subject, fromEvent } from \"rxjs\";\nimport { takeUntil, tap } from \"rxjs/operators\";\nimport { KEY_BACKSPACE, KEY_BUFFERED, KEY_DOWN, KEY_ENTER, KEY_ESCAPE, KEY_SHIFT, KEY_SPACE, KEY_TAB, KEY_UP } from \"./defines/keyboard.define\";\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\n // #region PROPERTY\n private listComponentRef = signal<ComponentRef<LibsUiComponentsInputsMentionListComponent> | undefined>(undefined);\n private nodesInsert = signal<Set<INodeInsert>>(new Set());\n private activeConfig = signal<IMentionConfig | undefined>(undefined);\n private triggerChars = signal<Record<string, IMentionConfig>>({});\n private searchString = signal<string>('');\n private startPos = signal<number | undefined>(undefined);\n private startNode = signal<any>(undefined);\n private searchList = signal<LibsUiComponentsInputsMentionListComponent | undefined>(undefined);\n private searching = signal<boolean>(false);\n private iframe = signal<any>(undefined);\n private lastKeyCode = signal<number | undefined>(undefined);\n private isEditor = signal<boolean>(false);\n private iframeId = signal<string | undefined>(undefined);\n private element = inject(ElementRef);\n private dynamicComponentService = inject(LibsUiDynamicComponentService);\n private onDestroy = new Subject<void>();\n\n // #region INPUT\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: Event) => {\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: KEY_BACKSPACE, shiftKey: true, inputEvent: true }, element);\n }, 500);\n }\n });\n });\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 = Object.assign({}, 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(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: Event, nativeElement: HTMLInputElement = this.element.nativeElement) {\n const data = get(event, 'data');\n if (this.lastKeyCode() === KEY_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 === KEY_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 === KEY_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 === KEY_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 === KEY_SHIFT || event.metaKey || event.altKey || event.ctrlKey || pos <= startPos) {\n return;\n }\n if (!this.activeConfig()?.allowSpace && event.keyCode === KEY_SPACE) {\n this.startPos.set(-1);\n } else if (event.keyCode === KEY_BACKSPACE && pos > 0) {\n pos--;\n if (pos === this.startPos()) {\n this.stopSearch();\n }\n }\n else if (searchList?.hidden()) {\n if (event.keyCode === KEY_TAB || event.keyCode === KEY_ENTER) {\n this.stopSearch();\n return;\n }\n }\n else if (!searchList?.hidden() && this.activeConfig()) {\n if (event.keyCode === KEY_TAB || event.keyCode === KEY_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 === KEY_ESCAPE) {\n this.stopEvent(event);\n this.stopSearch();\n\n return false;\n }\n if (event.keyCode === KEY_DOWN) {\n this.stopEvent(event);\n searchList?.activateNextItem();\n\n return false;\n }\n if (event.keyCode === KEY_UP) {\n this.stopEvent(event);\n searchList?.activatePreviousItem();\n\n return false;\n }\n }\n if (charPressed.length !== 1 && event.keyCode !== KEY_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 !== KEY_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 === KEY_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) as number\n };\n });\n const matchingCharacters = triggerChars.reduce((pre, current) => pre && current && current.index > pre.index ? current : pre);\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 && 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 ? true : false);\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 ? true : false);\n this.searchList()?.parentHandlerKeyDown.set(this.handlerKeydown.bind(this));\n this.searchList()?.position(nativeElement, iframe);\n if (firstTime && this.listComponentRef()) {\n this.iframeId.set(this.dynamicComponentService.addToBody(this.listComponentRef(), iframe ? true : false));\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 && parentNode.getAttribute && parentNode.getAttribute('id')) {\n if (!parentNode.nextSibling || !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 (let i = 0; i < nativeElement.childNodes.length; i++) {\n const node = nativeElement.childNodes[i];\n\n if (anchorNode.nodeType === 3 && anchorNode === node && preNode && preNode.getAttribute && 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 (let i = 0; i < nativeElement.childNodes.length; i++) {\n const node: any = nativeElement.childNodes[i];\n\n if (preNode && preNode.getAttribute && preNode.getAttribute('id') && node && node.getAttribute && node.getAttribute('id')) {\n nativeElement.insertBefore(empty, preNode.nextSibling);\n }\n\n preNode = node;\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).pipe(\n tap(e => e.stopPropagation()),\n takeUntil(this.onDestroy)\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/keyboard.define.ts","../../../../../../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":["export const KEY_BACKSPACE = 8;\nexport const KEY_TAB = 9;\nexport const KEY_ENTER = 13;\nexport const KEY_SHIFT = 16;\nexport const KEY_ESCAPE = 27;\nexport const KEY_SPACE = 32;\nexport const KEY_UP = 38;\nexport const KEY_DOWN = 40;\nexport const KEY_BUFFERED = 229;","import { deleteUnicode, get } from \"@libs-ui/utils\";\r\nimport { IMentionConfig } from \"../interfaces/mention.interface\";\r\nexport const PATTERN_INSERT = '\\ufeff';\r\n\r\nexport const buildTemplate = (value: string, id: string, feId: string): string => {\r\n return `<span class=\"mo-lib-shared-mention\" 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> `;\r\n};\r\n\r\nexport const DEFAULT_CONFIG: IMentionConfig = {\r\n items: [],\r\n triggerChar: '@',\r\n labelKey: 'email',\r\n allowSpace: true,\r\n returnTrigger: false,\r\n limitSpaceSearchQuery: 3,\r\n mentionEventName: 'click',\r\n mentionActionByEvent: (item, trigger) => console.log(item, trigger),\r\n mentionSelect: (item) => `@${get(item, 'email')}`,\r\n mentionFilter: (search: string, items?: Array<unknown>) => {\r\n const searchString = deleteUnicode(search.toLowerCase());\r\n\r\n return items?.filter(item => {\r\n const name = deleteUnicode(get(item, 'name').toLowerCase());\r\n const userName = deleteUnicode(get(item, 'username').toLowerCase());\r\n\r\n return name.includes(searchString) || userName.includes(searchString);\r\n });\r\n }\r\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 || !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 || !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); //window.getSelection();\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(undefined)?.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 return;\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};","/* From: https://github.com/component/textarea-caret-position */\n\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];\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) { style.wordBreak = 'break-word' } // 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, 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)) { style.overflowY = 'scroll' }\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 { 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 } from \"@libs-ui/utils\";\nimport { fromEvent, Subject, takeUntil } from \"rxjs\";\nimport { getCaretCoordinates } from \"../defines/caret-coords.define\";\nimport { KEY_ENTER } from \"../defines/keyboard.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: [\n LibsUiComponentsAvatarComponent,\n LibsUiComponentsPopoverComponent\n ]\n})\nexport class LibsUiComponentsInputsMentionListComponent implements OnInit, OnDestroy {\n\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 coords = signal<{ top: number, left: number, bottom?: number }>({ top: 0, left: 0, bottom: 0 });\n private offset = signal<number>(0);\n private nativeParentElement = signal<HTMLInputElement | undefined>(undefined);\n private 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\n /* VIEW CHILD */\n readonly elementEl = viewChild<ElementRef>('element');\n readonly itemsEl = viewChildren<ElementRef>('item');\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).pipe(takeUntil(this.onDestroy)).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 rect = iframe.getBoundingClientRect();\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, 'keyCode', KEY_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 && 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}\n","<div #element\n class=\"libs-ui-mention-list\"\n [style.zIndex]=\"zIndex()\"\n [class.hidden]=\"hidden()\">\n @for (item of items(); track item) {\n <div #item\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 <div class=\"px-[12px] py-[6px] flex items-center\">\n <libs_ui-components-avatar [size]=\"24\"\n [linkAvatar]=\"item.avatar\"\n [linkAvatarError]=\"defaultAvatar()\"\n [textAvatar]=\"item.name\"\n [idGenColor]=\"item.id\"\n [getLastTextAfterSpace]=\"true\" />\n <libs_ui-components-popover [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 </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 { get, isNil, uuid } from \"@libs-ui/utils\";\nimport { Subject, fromEvent } from \"rxjs\";\nimport { takeUntil, tap } from \"rxjs/operators\";\nimport { KEY_BACKSPACE, KEY_BUFFERED, KEY_DOWN, KEY_ENTER, KEY_ESCAPE, KEY_SHIFT, KEY_SPACE, KEY_TAB, KEY_UP } from \"./defines/keyboard.define\";\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\n // #region PROPERTY\n private listComponentRef = signal<ComponentRef<LibsUiComponentsInputsMentionListComponent> | undefined>(undefined);\n private nodesInsert = signal<Set<INodeInsert>>(new Set());\n private activeConfig = signal<IMentionConfig | undefined>(undefined);\n private triggerChars = signal<Record<string, IMentionConfig>>({});\n private searchString = signal<string>('');\n private startPos = signal<number | undefined>(undefined);\n private startNode = signal<any>(undefined);\n private searchList = signal<LibsUiComponentsInputsMentionListComponent | undefined>(undefined);\n private searching = signal<boolean>(false);\n private iframe = signal<any>(undefined);\n private lastKeyCode = signal<number | undefined>(undefined);\n private isEditor = signal<boolean>(false);\n private iframeId = signal<string | undefined>(undefined);\n private element = inject(ElementRef);\n private dynamicComponentService = inject(LibsUiDynamicComponentService);\n private 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: Event) => {\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: KEY_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 = Object.assign({}, 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(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: Event, nativeElement: HTMLInputElement = this.element.nativeElement) {\n const data = get(event, 'data');\n if (this.lastKeyCode() === KEY_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 === KEY_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 === KEY_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 === KEY_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 === KEY_SHIFT || event.metaKey || event.altKey || event.ctrlKey || pos <= startPos) {\n return;\n }\n if (!this.activeConfig()?.allowSpace && event.keyCode === KEY_SPACE) {\n this.startPos.set(-1);\n } else if (event.keyCode === KEY_BACKSPACE && pos > 0) {\n pos--;\n if (pos === this.startPos()) {\n this.stopSearch();\n }\n }\n else if (searchList?.hidden()) {\n if (event.keyCode === KEY_TAB || event.keyCode === KEY_ENTER) {\n this.stopSearch();\n return;\n }\n }\n else if (!searchList?.hidden() && this.activeConfig()) {\n if (event.keyCode === KEY_TAB || event.keyCode === KEY_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 === KEY_ESCAPE) {\n this.stopEvent(event);\n this.stopSearch();\n\n return false;\n }\n if (event.keyCode === KEY_DOWN) {\n this.stopEvent(event);\n searchList?.activateNextItem();\n\n return false;\n }\n if (event.keyCode === KEY_UP) {\n this.stopEvent(event);\n searchList?.activatePreviousItem();\n\n return false;\n }\n }\n if (charPressed.length !== 1 && event.keyCode !== KEY_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 !== KEY_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 === KEY_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) as number\n };\n });\n const matchingCharacters = triggerChars.reduce((pre, current) => pre && current && current.index > pre.index ? current : pre);\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 && 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 ? true : false);\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 ? true : false);\n this.searchList()?.parentHandlerKeyDown.set(this.handlerKeydown.bind(this));\n this.searchList()?.position(nativeElement, iframe);\n if (firstTime && this.listComponentRef()) {\n this.iframeId.set(this.dynamicComponentService.addToBody(this.listComponentRef(), iframe ? true : false));\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 && parentNode.getAttribute && parentNode.getAttribute('id')) {\n if (!parentNode.nextSibling || !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 (let i = 0; i < nativeElement.childNodes.length; i++) {\n const node = nativeElement.childNodes[i];\n\n if (anchorNode.nodeType === 3 && anchorNode === node && preNode && preNode.getAttribute && 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 (let i = 0; i < nativeElement.childNodes.length; i++) {\n const node: any = nativeElement.childNodes[i];\n\n if (preNode && preNode.getAttribute && preNode.getAttribute('id') && node && node.getAttribute && node.getAttribute('id')) {\n nativeElement.insertBefore(empty, preNode.nextSibling);\n }\n\n preNode = node;\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).pipe(\n tap(e => e.stopPropagation()),\n takeUntil(this.onDestroy)\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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"}
|
package/mention.directive.d.ts
CHANGED
|
@@ -18,6 +18,7 @@ export declare class LibsUiComponentsInputsMentionDirective implements AfterView
|
|
|
18
18
|
private element;
|
|
19
19
|
private dynamicComponentService;
|
|
20
20
|
private onDestroy;
|
|
21
|
+
readonly timeDelayInit: import("@angular/core").InputSignalWithTransform<number, number | undefined>;
|
|
21
22
|
readonly mentionConfig: import("@angular/core").InputSignal<IMentionConfig | undefined>;
|
|
22
23
|
readonly mentionListTemplate: import("@angular/core").InputSignal<TemplateRef<any> | undefined>;
|
|
23
24
|
readonly outSearchTerm: import("@angular/core").OutputEmitterRef<string | undefined>;
|
|
@@ -44,5 +45,5 @@ export declare class LibsUiComponentsInputsMentionDirective implements AfterView
|
|
|
44
45
|
private insertMention;
|
|
45
46
|
ngOnDestroy(): void;
|
|
46
47
|
static ɵfac: i0.ɵɵFactoryDeclaration<LibsUiComponentsInputsMentionDirective, never>;
|
|
47
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<LibsUiComponentsInputsMentionDirective, "[LibsUiComponentsInputsMentionDirective]", never, { "mentionConfig": { "alias": "mentionConfig"; "required": false; "isSignal": true; }; "mentionListTemplate": { "alias": "mentionListTemplate"; "required": false; "isSignal": true; }; }, { "outSearchTerm": "outSearchTerm"; "outItemSelected": "outItemSelected"; "outToggle": "outToggle"; "outInsertMention": "outInsertMention"; "outFunctionControl": "outFunctionControl"; }, never, never, true, never>;
|
|
48
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<LibsUiComponentsInputsMentionDirective, "[LibsUiComponentsInputsMentionDirective]", never, { "timeDelayInit": { "alias": "timeDelayInit"; "required": false; "isSignal": true; }; "mentionConfig": { "alias": "mentionConfig"; "required": false; "isSignal": true; }; "mentionListTemplate": { "alias": "mentionListTemplate"; "required": false; "isSignal": true; }; }, { "outSearchTerm": "outSearchTerm"; "outItemSelected": "outItemSelected"; "outToggle": "outToggle"; "outInsertMention": "outInsertMention"; "outFunctionControl": "outFunctionControl"; }, never, never, true, never>;
|
|
48
49
|
}
|