@theseam/ui-common 0.4.26 → 0.4.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import { coerceBooleanProperty } from '@angular/cdk/coercion';
2
- import { Component, EventEmitter, Inject, Input, Optional, Output, ViewChild, forwardRef } from '@angular/core';
2
+ import { Component, EventEmitter, HostListener, Inject, Input, Optional, Output, ViewChild, forwardRef } from '@angular/core';
3
3
  import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
4
4
  import 'quill-mention';
5
5
  import { BehaviorSubject, Subject, combineLatest, filter, lastValueFrom, map, of, shareReplay, startWith, switchMap, take, tap } from 'rxjs';
@@ -248,6 +248,16 @@ export class RichTextComponent {
248
248
  this._pollCalculatedRowHeight.next();
249
249
  }, 0);
250
250
  }
251
+ _handleKeydown(event) {
252
+ if (event.code === 'Escape') {
253
+ const qlEditor = this._quillEditor?.editorElem?.querySelector('.ql-editor');
254
+ if (notNullOrUndefined(qlEditor) && qlEditor === document.activeElement && qlEditor instanceof HTMLElement) {
255
+ event.preventDefault();
256
+ event.stopImmediatePropagation();
257
+ qlEditor.blur();
258
+ }
259
+ }
260
+ }
251
261
  constructor(_renderer, _customConfig) {
252
262
  this._renderer = _renderer;
253
263
  this._customConfig = _customConfig;
@@ -326,6 +336,14 @@ export class RichTextComponent {
326
336
  }
327
337
  this._templateSet.next(true);
328
338
  }
339
+ ngOnDestroy() {
340
+ // hacky way to ensure mentions menu gets destroyed when component is destroyed
341
+ const mentionModule = this._quillEditor?.quillEditor.getModule('mention');
342
+ const hideMentionList = mentionModule?.hideMentionList;
343
+ if (hideMentionList && typeof hideMentionList === 'function') {
344
+ hideMentionList.call(mentionModule);
345
+ }
346
+ }
329
347
  _buildQuillConfig() {
330
348
  this._configSet.next(false);
331
349
  const config = {
@@ -501,7 +519,7 @@ export class RichTextComponent {
501
519
  }
502
520
  }
503
521
  RichTextComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: RichTextComponent, deps: [{ token: i0.Renderer2 }, { token: THESEAM_QUILL_EDITOR_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component });
504
- RichTextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.7", type: RichTextComponent, selector: "seam-rich-text", inputs: { val: ["value", "val"], required: "required", placeholder: "placeholder", rows: "rows", resizable: "resizable", disableRichText: "disableRichText", displayCharacterCounter: "displayCharacterCounter", minLength: "minLength", maxLength: "maxLength", characterCounterTpl: "characterCounterTpl", characterCounterFn: "characterCounterFn", useMentions: "useMentions", mentionItems: "mentionItems", mentionSearchFn: "mentionSearchFn", mentionRenderListFn: "mentionRenderListFn", mentionListLoadingText: "mentionListLoadingText", mentionListEmptyText: "mentionListEmptyText" }, outputs: { quillEditorCreated: "quillEditorCreated", quillEditorChanged: "quillEditorChanged", quillContentChanged: "quillContentChanged", quillSelectionChanged: "quillSelectionChanged", quillFocus: "quillFocus", quillBlur: "quillBlur", mentionsUpdated: "mentionsUpdated" }, providers: [
522
+ RichTextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.7", type: RichTextComponent, selector: "seam-rich-text", inputs: { val: ["value", "val"], required: "required", placeholder: "placeholder", rows: "rows", resizable: "resizable", disableRichText: "disableRichText", displayCharacterCounter: "displayCharacterCounter", minLength: "minLength", maxLength: "maxLength", characterCounterTpl: "characterCounterTpl", characterCounterFn: "characterCounterFn", useMentions: "useMentions", mentionItems: "mentionItems", mentionSearchFn: "mentionSearchFn", mentionRenderListFn: "mentionRenderListFn", mentionListLoadingText: "mentionListLoadingText", mentionListEmptyText: "mentionListEmptyText" }, outputs: { quillEditorCreated: "quillEditorCreated", quillEditorChanged: "quillEditorChanged", quillContentChanged: "quillContentChanged", quillSelectionChanged: "quillSelectionChanged", quillFocus: "quillFocus", quillBlur: "quillBlur", mentionsUpdated: "mentionsUpdated" }, host: { listeners: { "keydown": "_handleKeydown($event)" } }, providers: [
505
523
  RICH_TEXT_VALUE_ACCESSOR
506
524
  ], viewQueries: [{ propertyName: "quillEditor", first: true, predicate: ["quillEditor"], descendants: true }, { propertyName: "defaultCharacterCounterTpl", first: true, predicate: ["characterCounter"], descendants: true }], ngImport: i0, template: "<div class=\"editor\" *ngIf=\"configSet$ | async\" [class.initializing]=\"!(initialized$ | async)\">\n <ng-container *ngIf=\"config$ | async as config\">\n <quill-editor\n #quillEditor\n seamInput\n [class.disabled]=\"readOnly\"\n [attr.disabled]=\"readOnly\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [readOnly]=\"readOnly\"\n [required]=\"required\"\n [minLength]=\"minLength\"\n [maxLength]=\"maxLength\"\n [format]=\"config.format\"\n [theme]=\"config.theme\"\n [modules]=\"config.modules\"\n [debug]=\"config.debug\"\n [formats]=\"config.formats\"\n [customToolbarPosition]=\"config.customToolbarPosition\"\n [sanitize]=\"config.sanitize\"\n [styles]=\"config.styles\"\n [strict]=\"config.strict\"\n [scrollingContainer]=\"config.scrollingContainer\"\n [bounds]=\"config.bounds\"\n [customOptions]=\"config.customOptions\"\n [customModules]=\"config.customModules\"\n [trackChanges]=\"config.trackChanges\"\n [preserveWhitespace]=\"config.preserveWhitespace\"\n [classes]=\"config.classes\"\n [trimOnValidation]=\"config.trimOnValidation\"\n [linkPlaceholder]=\"config.linkPlaceholder\"\n [compareValues]=\"config.compareValues\"\n [filterNull]=\"config.filterNull\"\n [debounceTime]=\"config.debounceTime\"\n [class.can-resize]=\"resizable\"\n (onEditorCreated)=\"_onEditorCreated($event)\"\n (onEditorChanged)=\"_onEditorChanged($event)\"\n (onContentChanged)=\"_onContentChanged($event)\"\n (onSelectionChanged)=\"_onSelectionChanged($event)\"\n (onFocus)=\"_onFocus($event)\"\n (onBlur)=\"_onBlur($event)\"></quill-editor>\n <ng-container *ngIf=\"displayCharacterCounter\">\n <ng-container\n [ngTemplateOutlet]=\"characterCounterTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: characterCount$ | async, minLength: minLength, maxLength: maxLength, characterCount: characterCount$ | async }\"></ng-container>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #characterCounter let-implicit let-minLength=\"minLength\" let-maxLength=\"maxLength\" let-characterCount=\"characterCount\">\n <div class=\"small text-black-50 text-right\">\n <ng-container *ngIf=\"characterCount || characterCount === 0\">\n Character Count:\n <span [class.text-danger]=\"characterCount && ((maxLength && characterCount > maxLength) || (minLength && characterCount < minLength))\">\n {{ characterCount | number }}\n </span>\n <ng-container *ngIf=\"maxLength\">\n / {{ maxLength }}\n </ng-container>\n <span *ngIf=\"minLength\" class=\"font-italic\">\n (minimum {{ minLength }} expected)\n </span>\n </ng-container>\n </div>\n</ng-template>\n", styles: [":host .editor{position:relative}:host .editor.initializing:before{content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;background:#f8f9fa;z-index:1}:host quill-editor.can-resize ::ng-deep .ql-editor{overflow:auto;resize:vertical}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i3.QuillEditorComponent, selector: "quill-editor" }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }] });
507
525
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: RichTextComponent, decorators: [{
@@ -569,5 +587,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImpor
569
587
  }], defaultCharacterCounterTpl: [{
570
588
  type: ViewChild,
571
589
  args: ['characterCounter']
590
+ }], _handleKeydown: [{
591
+ type: HostListener,
592
+ args: ['keydown', ['$event']]
572
593
  }] } });
573
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaC10ZXh0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi9yaWNoLXRleHQvcmljaC10ZXh0L3JpY2gtdGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vcmljaC10ZXh0L3JpY2gtdGV4dC9yaWNoLXRleHQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsUUFBUSxFQUFFLE1BQU0sRUFBb0MsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6SyxPQUFPLEVBQXdCLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSXRGLE9BQU8sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV6SixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVqRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsbUNBQW1DLEVBQUUscUNBQXFDLEVBQUUsNkJBQTZCLEVBQUUsMEJBQTBCLEVBQUUsc0JBQXNCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUFFalAsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQWE7SUFDaEQsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFD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dEMsaUJBQWlCLCszQkFKakI7UUFDVCx3QkFBd0I7S0FDekIsdVBDekJILDZ4RkFpRUE7MkZEdENhLGlCQUFpQjtrQkFSN0IsU0FBUzsrQkFDRSxnQkFBZ0IsYUFHZjt3QkFDVCx3QkFBd0I7cUJBQ3pCOzswQkFtVkUsUUFBUTs7MEJBQUksTUFBTTsyQkFBQywyQkFBMkI7NENBM1VqQyxHQUFHO3NCQUFsQixLQUFLO3VCQUFDLE9BQU87Z0JBS1YsUUFBUTtzQkFEWCxLQUFLO2dCQWFGLFdBQVc7c0JBRGQsS0FBSztnQkFtQkYsSUFBSTtzQkFEUCxLQUFLO2dCQW1CRixTQUFTO3NCQURaLEtBQUs7Z0JBaUNGLGVBQWU7c0JBRGxCLEtBQUs7Z0JBMkJGLHVCQUF1QjtzQkFEMUIsS0FBSztnQkFZRixTQUFTO3NCQURaLEtBQUs7Z0JBWUYsU0FBUztzQkFEWixLQUFLO2dCQWlCRixtQkFBbUI7c0JBRHRCLEtBQUs7Z0JBZU8sa0JBQWtCO3NCQUE5QixLQUFLO2dCQWlCRixXQUFXO3NCQURkLEtBQUs7Z0JBb0JGLFlBQVk7c0JBRGYsS0FBSztnQkFtQkYsZUFBZTtzQkFEbEIsS0FBSztnQkFpQkYsbUJBQW1CO3NCQUR0QixLQUFLO2dCQWlCRixzQkFBc0I7c0JBRHpCLEtBQUs7Z0JBaUJGLG9CQUFvQjtzQkFEdkIsS0FBSztnQkFvQkksa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFFRyxlQUFlO3NCQUF4QixNQUFNO2dCQUdILFdBQVc7c0JBRGQsU0FBUzt1QkFBQyxhQUFhO2dCQWNPLDBCQUEwQjtzQkFBeEQsU0FBUzt1QkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgUHJvdmlkZXIsIFJlbmRlcmVyMiwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgQmx1ciwgQ29udGVudENoYW5nZSwgRWRpdG9yQ2hhbmdlQ29udGVudCwgRWRpdG9yQ2hhbmdlU2VsZWN0aW9uLCBGb2N1cywgUXVpbGxFZGl0b3JDb21wb25lbnQsIFNlbGVjdGlvbkNoYW5nZSB9IGZyb20gJ25neC1xdWlsbCc7XG5pbXBvcnQgeyBEZWx0YSB9IGZyb20gJ3F1aWxsJztcbmltcG9ydCAncXVpbGwtbWVudGlvbic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGZpbHRlciwgbGFzdFZhbHVlRnJvbSwgbWFwLCBvZiwgc2hhcmVSZXBsYXksIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlLCB0YXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgaXNOdWxsT3JVbmRlZmluZWQsIG5vdE51bGxPclVuZGVmaW5lZCB9IGZyb20gJ0B0aGVzZWFtL3VpLWNvbW1vbi91dGlscyc7XG5pbXBvcnQgeyBUaGVTZWFtQ2hhcmFjdGVyQ291bnRlckZuLCBUaGVTZWFtUXVpbGxFZGl0b3JDb25maWcsIFRoZVNlYW1RdWlsbE1lbnRpb25NZW51SXRlbSwgVGhlU2VhbVF1aWxsTWVudGlvbk1lbnVPcHRpb24sIFRoZVNlYW1RdWlsbE1lbnRpb25TZWFyY2hGbiwgVGhlU2VhbVF1aWxsTWVudGlvblNvdXJjZUZuLCBUaGVTZWFtUXVpbGxNb2R1bGVzIH0gZnJvbSAnLi4vdXRpbHMvbW9kZWxzJztcbmltcG9ydCB7IFRIRVNFQU1fUVVJTExfRURJVE9SX0NPTkZJRywgVEhFU0VBTV9RVUlMTF9FRElUT1JfQ09ORklHX0RFRkFVTFQsIFRIRVNFQU1fUVVJTExfTUVOVElPTl9PUFRJT05TX0RFRkFVTFQsIGRlZmF1bHRIdG1sQ2hhcmFjdGVyQ291bnRlckZuLCBkZWZhdWx0TWVudGlvblJlbmRlckxpc3RGbiwgZGVmYXVsdE1lbnRpb25TZWFyY2hGbiwgaXNNZW50aW9uTWVudU9wdGlvbiB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IFJJQ0hfVEVYVF9WQUxVRV9BQ0NFU1NPUjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBSaWNoVGV4dENvbXBvbmVudCksXG4gIG11bHRpOiB0cnVlXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NlYW0tcmljaC10ZXh0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JpY2gtdGV4dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JpY2gtdGV4dC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICBSSUNIX1RFWFRfVkFMVUVfQUNDRVNTT1JcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBSaWNoVGV4dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuXG4gIG9uQ2hhbmdlOiBhbnlcbiAgb25Ub3VjaGVkOiBhbnlcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZVxuICBASW5wdXQoJ3ZhbHVlJykgdmFsOiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICBmb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsKVxuXG4gIEBJbnB1dCgpXG4gIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWRcbiAgfVxuICBzZXQgcmVxdWlyZWQodmFsdWU6IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX3JlcXVpcmVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKVxuICAgIH1cbiAgfVxuICBwcml2YXRlIF9yZXF1aXJlZCA9IGZhbHNlXG5cbiAgLyoqIEBkZWZhdWx0ICcnIChlbXB0eSBzdHJpbmcpICovXG4gIEBJbnB1dCgpXG4gIGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wbGFjZWhvbGRlclxuICB9XG4gIHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChub3ROdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHZhbHVlXG4gICAgfVxuICB9XG4gIHByaXZhdGUgX3BsYWNlaG9sZGVyID0gJydcblxuICAvKipcbiAgICogSW5pdGlhbCByb3dzIHZpc2libGUgaW4gdGV4dCBhcmVhLCBzZXQgdXNpbmcgYGhlaWdodGAgYW5kIGBtaW5IZWlnaHRgLlxuICAgKlxuICAgKiBOT1RFOiBSZXNpemFibGUgZWRpdG9ycyB3aWxsIG5vdCBiZSBhYmxlIHRvIHNpemUgYmVsb3cgdGhlIGhlaWdodCBjYWxjdWxhdGVkIGZyb20gdGhpcyB2YWx1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgNVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHJvd3MoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcm93c1xuICB9XG4gIHNldCByb3dzKHZhbHVlOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX3Jvd3MgPSB2YWx1ZVxuXG4gICAgICB0aGlzLl9wb2xsQ2FsY3VsYXRlZFJvd0hlaWdodC5uZXh0KClcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfcm93cyA9IDVcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIHRleHQgYXJlYSBjYW4gYmUgcmVzaXplZCB2ZXJ0aWNhbGx5LlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgcmVzaXphYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZXNpemFibGVcbiAgfVxuICBzZXQgcmVzaXphYmxlKHZhbHVlOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChub3ROdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICB0aGlzLl9yZXNpemFibGUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpXG4gICAgfVxuICB9XG4gIHByaXZhdGUgX3Jlc2l6YWJsZSA9IHRydWVcblxuICAvKiogQGRlZmF1bHQgZmFsc2UgKi9cbiAgZ2V0IHJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZWFkT25seVxuICB9XG4gIHNldCByZWFkT25seSh2YWx1ZTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAobm90TnVsbE9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgdGhpcy5fcmVhZE9ubHkgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpXG4gICAgfVxuICB9XG4gIHByaXZhdGUgX3JlYWRPbmx5ID0gZmFsc2VcblxuICAvLyBUT0RPOiBmaXggYnVnIHdoZXJlIGluaXRpYWwgaHRtbCB2YWx1ZSBpcyByZW5kZXJlZCBpbiBwbGFpbiB0ZXh0XG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgb3ZlcnJpZGVzIGFsbCBvdGhlciBwcm92aWRlZCBzZXR0aW5ncyB0byBwcmVzZW50IHRoZSBlZGl0b3JcbiAgICogYXMgYSBzdGFuZGFyZCB0ZXh0Ym94LlxuICAgKlxuICAgKiBOT1RFOiBGb3IgdGhlIG1vbWVudCwgYDxwPjwvcD5gIHRhZ3MgYXJlIHN0aWxsIGFsbG93ZWQsIHRyaWdnZXJlZCBieSB0aGUgYEVudGVyYCBrZXkuXG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zbGFiL3F1aWxsL2lzc3Vlcy8xNDMyXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZVJpY2hUZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlUmljaFRleHRcbiAgfVxuICBzZXQgZGlzYWJsZVJpY2hUZXh0KHZhbHVlOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChub3ROdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlUmljaFRleHQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpXG5cbiAgICAgIHRoaXMuX3VwZGF0ZVF1aWxsQ29uZmlnKClcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfZGlzYWJsZVJpY2hUZXh0ID0gZmFsc2VcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIGRpc3BsYXlzIGEgY2hhcmFjdGVyIGNvdW50ZXIgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZWRpdG9yLlxuICAgKiBDaGFyYWN0ZXIgY291bnRlciB0ZXh0IGlzIGRldGVybWluZWQgYnkgdmFsdWVzIHByb3ZpZGVkIGluIGBtaW5MZW5ndGhgXG4gICAqIGFuZCBgbWF4TGVuZ3RoYC5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgY291bnQgYWxnb3JpdGhtIHN0cmlwcyBvdXQgaHRtbCBlbnRpdGllcyBhbmQgcmVwbGFjZXMgdGhlbVxuICAgKiB3aXRoIHNwYWNlcyB0byBnZXQgdGhlIHN0cmluZyBsZW5ndGguIFRvIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IsIHBhc3NcbiAgICogYSBjdXN0b20gZnVuY3Rpb24gdG8gYGNoYXJhY3RlckNvdW50ZXJGbmAuXG4gICAqXG4gICAqIFRvIG92ZXJyaWRlIGRlZmF1bHQgY2hhcmFjdGVyIGNvdW50ZXIgZGlzcGxheSwgcGFzcyBhIGN1c3RvbSB0ZW1wbGF0ZSB0byBgY2hhcmFjdGVyQ291bnRUcGxgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGRpc3BsYXlDaGFyYWN0ZXJDb3VudGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5Q2hhcmFjdGVyQ291bnRlclxuICB9XG4gIHNldCBkaXNwbGF5Q2hhcmFjdGVyQ291bnRlcih2YWx1ZTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAobm90TnVsbE9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgdGhpcy5fZGlzcGxheUNoYXJhY3RlckNvdW50ZXIgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpXG4gICAgfVxuICB9XG4gIHByaXZhdGUgX2Rpc3BsYXlDaGFyYWN0ZXJDb3VudGVyID0gZmFsc2VcblxuICBASW5wdXQoKVxuICBnZXQgbWluTGVuZ3RoKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21pbkxlbmd0aFxuICB9XG4gIHNldCBtaW5MZW5ndGgodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChub3ROdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICB0aGlzLl9taW5MZW5ndGggPSB2YWx1ZVxuICAgIH1cbiAgfVxuICBwcml2YXRlIF9taW5MZW5ndGg6IG51bWJlciB8IHVuZGVmaW5lZFxuXG4gIEBJbnB1dCgpXG4gIGdldCBtYXhMZW5ndGgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4TGVuZ3RoXG4gIH1cbiAgc2V0IG1heExlbmd0aCh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX21heExlbmd0aCA9IHZhbHVlXG4gICAgfVxuICB9XG4gIHByaXZhdGUgX21heExlbmd0aDogbnVtYmVyIHwgdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIFNldCB0byBvdmVycmlkZSBkZWZhdWx0IGNoYXJhY3RlciBjb3VudGVyIGRpc3BsYXkuXG4gICAqXG4gICAqIFRlbXBsYXRlIGNvbnRleHQgaW5jbHVkZXMgdmFyaWFibGVzIGBtaW5MZW5ndGhgLCBgbWF4TGVuZ3RoYCwgYW5kIGBjaGFyYWN0ZXJDb3VudGAuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgY2hhcmFjdGVyQ291bnRlclRwbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYXJhY3RlckNvdW50ZXJUcGxcbiAgfVxuICBzZXQgY2hhcmFjdGVyQ291bnRlclRwbCh2YWx1ZSkge1xuICAgIGlmIChub3ROdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICB0aGlzLl9jaGFyYWN0ZXJDb3VudGVyVHBsID0gdmFsdWVcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfY2hhcmFjdGVyQ291bnRlclRwbDogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIFNldCB0byBvdmVycmlkZSBkZWZhdWx0IGNvdW50ZXIgZnVuY3Rpb24sIHdoaWNoIHN0cmlwcyBodG1sIGVudGl0aWVzIGFuZFxuICAgKiByZXBsYWNlcyB0aGVtIHdpdGggYSBzcGFjZS5cbiAgICovXG4gIEBJbnB1dCgpIGdldCBjaGFyYWN0ZXJDb3VudGVyRm4oKTogVGhlU2VhbUNoYXJhY3RlckNvdW50ZXJGbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYXJhY3RlckNvdW50ZXJGblxuICB9XG4gIHNldCBjaGFyYWN0ZXJDb3VudGVyRm4odmFsdWU6IFRoZVNlYW1DaGFyYWN0ZXJDb3VudGVyRm4gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX2NoYXJhY3RlckNvdW50ZXJGbiA9IHZhbHVlXG4gICAgfVxuICB9XG4gIHByaXZhdGUgX2NoYXJhY3RlckNvdW50ZXJGbiA9IGRlZmF1bHRIdG1sQ2hhcmFjdGVyQ291bnRlckZuXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgY29tcG9uZW50IHdpbGwgY29uZmlndXJlIHRoZSBRdWlsbCBlZGl0b3Igd2l0aCB0aGUgcXVpbGwtbWVudGlvbnMgZXh0ZW5zaW9uXG4gICAqIGFuZCBsaXN0ZW4gZm9yIHZhbHVlcyBwYXNzZWQgdG8gYG1lbnRpb25JdGVtc2AgdG8gcG9wdWxhdGUgdGhlIG1lbnRpb25zIG1lbnUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdXNlTWVudGlvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZU1lbnRpb25zXG4gIH1cbiAgc2V0IHVzZU1lbnRpb25zKHZhbHVlOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChub3ROdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICB0aGlzLl91c2VNZW50aW9ucyA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSlcblxuICAgICAgdGhpcy5fdXBkYXRlUXVpbGxDb25maWcoKVxuICAgIH1cbiAgfVxuICBwcml2YXRlIF91c2VNZW50aW9uczogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgdXNlcnMsIHVzZXIgZ3JvdXBzLCBvciBvdGhlciBlbnRpdGllcyB0byBkaXNwbGF5IGluIG1lbnRpb25zIG1lbnUuXG4gICAqIE1pbmltdW0gcmVxdWlyZWQgcHJvcGVydGllcyBhcmUgYGlkYCAodW5pcXVlKSBhbmQgYHZhbHVlYCwgd2hpY2ggYWN0cyBhcyB0aGUgbGFiZWwuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBtZW51IGlzIHRyaWdnZXJlZCBieSB0eXBpbmcgdGhlIGBAYCBzeW1ib2wgaW50byB0aGUgdGV4dCBhcmVhLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IG1lbnRpb25JdGVtcygpOiBUaGVTZWFtUXVpbGxNZW50aW9uTWVudUl0ZW1bXSB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tZW50aW9uSXRlbXMudmFsdWVcbiAgfVxuICBzZXQgbWVudGlvbkl0ZW1zKHZhbHVlOiBUaGVTZWFtUXVpbGxNZW50aW9uTWVudUl0ZW1bXSB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAobm90TnVsbE9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgdGhpcy5fbWVudGlvbkl0ZW1zLm5leHQodmFsdWUpXG4gICAgfVxuICB9XG4gIHByaXZhdGUgX21lbnRpb25JdGVtcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGhlU2VhbVF1aWxsTWVudGlvbk1lbnVJdGVtW10gfCBudWxsIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG4gIHB1YmxpYyBtZW50aW9uSXRlbXMkID0gdGhpcy5fbWVudGlvbkl0ZW1zLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgZmlsdGVyKG1lbnRpb25zID0+IG5vdE51bGxPclVuZGVmaW5lZChtZW50aW9ucykgJiYgbWVudGlvbnMubGVuZ3RoID4gMCksXG4gICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KVxuICApXG5cbiAgLyoqXG4gICAqIFNldCB0byBvdmVycmlkZSBkZWZhdWx0IHNlYXJjaCBmdW5jdGlvbiB3aGVuIHVzZXIgaXMgdHlwaW5nIGEgbWVudGlvbi5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBtZW50aW9uU2VhcmNoRm4oKTogVGhlU2VhbVF1aWxsTWVudGlvblNlYXJjaEZuIHtcbiAgICByZXR1cm4gdGhpcy5fbWVudGlvblNlYXJjaEZuXG4gIH1cbiAgc2V0IG1lbnRpb25TZWFyY2hGbih2YWx1ZTogVGhlU2VhbVF1aWxsTWVudGlvblNlYXJjaEZuIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChub3ROdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICB0aGlzLl9tZW50aW9uU2VhcmNoRm4gPSB2YWx1ZVxuICAgIH1cbiAgfVxuICBwcml2YXRlIF9tZW50aW9uU2VhcmNoRm46IFRoZVNlYW1RdWlsbE1lbnRpb25TZWFyY2hGbiA9IGRlZmF1bHRNZW50aW9uU2VhcmNoRm5cblxuICAvKipcbiAgICogU2V0IHRvIG92ZXJyaWRlIGRlZmF1bHQgcmVuZGVyIGZ1bmN0aW9uIGZvciBtZW50aW9ucyBsaXN0LlxuICAgKlxuICAgKiBGdW5jdGlvbiBzaG91bGQgY2FsbCBgcmVuZGVyTGlzdGAuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgbWVudGlvblJlbmRlckxpc3RGbigpOiBUaGVTZWFtUXVpbGxNZW50aW9uU291cmNlRm4ge1xuICAgIHJldHVybiB0aGlzLl9tZW50aW9uUmVuZGVyTGlzdEZuXG4gIH1cbiAgc2V0IG1lbnRpb25SZW5kZXJMaXN0Rm4odmFsdWU6IFRoZVNlYW1RdWlsbE1lbnRpb25Tb3VyY2VGbiB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAobm90TnVsbE9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgdGhpcy5fbWVudGlvblJlbmRlckxpc3RGbiA9IHZhbHVlXG4gICAgfVxuICB9XG4gIHByaXZhdGUgX21lbnRpb25SZW5kZXJMaXN0Rm46IFRoZVNlYW1RdWlsbE1lbnRpb25Tb3VyY2VGbiA9IGRlZmF1bHRNZW50aW9uUmVuZGVyTGlzdEZuXG5cbiAgLyoqXG4gICAqIFNldCB0byBvdmVycmlkZSBkZWZhdWx0IHRleHQgc2hvd24gd2hpbGUgbWVudGlvbiBpdGVtcyBhcmUgbG9hZGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgJ0xvYWRpbmcuLi4nXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgbWVudGlvbkxpc3RMb2FkaW5nVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9tZW50aW9uTGlzdExvYWRpbmdUZXh0XG4gIH1cbiAgc2V0IG1lbnRpb25MaXN0TG9hZGluZ1RleHQodmFsdWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAobm90TnVsbE9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgdGhpcy5fbWVudGlvbkxpc3RMb2FkaW5nVGV4dCA9IHZhbHVlXG4gICAgfVxuICB9XG4gIHByaXZhdGUgX21lbnRpb25MaXN0TG9hZGluZ1RleHQ6IHN0cmluZyA9ICdMb2FkaW5nLi4uJ1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gb3ZlcnJpZGUgZGVmYXVsdCB0ZXh0IHNob3duIHdoZW4gYSBtZW50aW9uIHNlYXJjaCByZXR1cm5zIG5vIGl0ZW1zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnTm8gbWF0Y2hlcyBmb3VuZC4nXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgbWVudGlvbkxpc3RFbXB0eVRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbWVudGlvbkxpc3RFbXB0eVRleHRcbiAgfVxuICBzZXQgbWVudGlvbkxpc3RFbXB0eVRleHQodmFsdWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAobm90TnVsbE9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgdGhpcy5fbWVudGlvbkxpc3RFbXB0eVRleHQgPSB2YWx1ZVxuICAgIH1cbiAgfVxuICBwcml2YXRlIF9tZW50aW9uTGlzdEVtcHR5VGV4dDogc3RyaW5nID0gJ05vIG1hdGNoZXMgZm91bmQuJ1xuXG4gIGdldCBtZW50aW9uTGlzdEVtcHR5SXRlbSgpOiBUaGVTZWFtUXVpbGxNZW50aW9uTWVudU9wdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiAndW5kZWZpbmVkJyxcbiAgICAgIHZhbHVlOiB0aGlzLm1lbnRpb25MaXN0RW1wdHlUZXh0LFxuICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICBlbXB0eUxpc3Q6IHRydWVcbiAgICB9XG4gIH1cblxuICBAT3V0cHV0KCkgcXVpbGxFZGl0b3JDcmVhdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICBAT3V0cHV0KCkgcXVpbGxFZGl0b3JDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8RWRpdG9yQ2hhbmdlQ29udGVudCB8IEVkaXRvckNoYW5nZVNlbGVjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgQE91dHB1dCgpIHF1aWxsQ29udGVudENoYW5nZWQ6IEV2ZW50RW1pdHRlcjxDb250ZW50Q2hhbmdlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICBAT3V0cHV0KCkgcXVpbGxTZWxlY3Rpb25DaGFuZ2VkOiBFdmVudEVtaXR0ZXI8U2VsZWN0aW9uQ2hhbmdlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICBAT3V0cHV0KCkgcXVpbGxGb2N1czogRXZlbnRFbWl0dGVyPEZvY3VzPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICBAT3V0cHV0KCkgcXVpbGxCbHVyOiBFdmVudEVtaXR0ZXI8Qmx1cj4gPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICBAT3V0cHV0KCkgbWVudGlvbnNVcGRhdGVkOiBFdmVudEVtaXR0ZXI8VGhlU2VhbVF1aWxsTWVudGlvbk1lbnVPcHRpb25bXT4gPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICBAVmlld0NoaWxkKCdxdWlsbEVkaXRvcicpXG4gIGdldCBxdWlsbEVkaXRvcigpOiBUZW1wbGF0ZVJlZjxRdWlsbEVkaXRvckNvbXBvbmVudD4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9xdWlsbEVkaXRvclxuICB9XG4gIHNldCBxdWlsbEVkaXRvcih2YWx1ZTogVGVtcGxhdGVSZWY8UXVpbGxFZGl0b3JDb21wb25lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcXVpbGxFZGl0b3IgPSB2YWx1ZVxuXG4gICAgLy8gc2V0VGltZW91dCBiZWNhdXNlIGZ1bGwgaHRtbCBpc24ndCBhdmFpbGFibGUgdW50aWwgdGhlIG5leHQgdGlja1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fcG9sbENhbGN1bGF0ZWRSb3dIZWlnaHQubmV4dCgpXG4gICAgfSwgMClcbiAgfVxuICBwcml2YXRlIF9xdWlsbEVkaXRvcjogVGVtcGxhdGVSZWY8UXVpbGxFZGl0b3JDb21wb25lbnQ+IHwgdW5kZWZpbmVkXG5cbiAgQFZpZXdDaGlsZCgnY2hhcmFjdGVyQ291bnRlcicpIGRlZmF1bHRDaGFyYWN0ZXJDb3VudGVyVHBsOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG5cbiAgcHJpdmF0ZSBfaXNXcml0aW5nVmFsdWUgPSBmYWxzZVxuXG4gIHByaXZhdGUgX3BvbGxDYWxjdWxhdGVkUm93SGVpZ2h0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuXG4gIHByaXZhdGUgX2NvbmZpZ1NldCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpXG4gIHB1YmxpYyBjb25maWdTZXQkID0gdGhpcy5fY29uZmlnU2V0LmFzT2JzZXJ2YWJsZSgpXG5cbiAgcHJpdmF0ZSBfc3R5bGVzU2V0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSlcbiAgcHJpdmF0ZSBfdGVtcGxhdGVTZXQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKVxuXG4gIHB1YmxpYyBpbml0aWFsaXplZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj5cblxuICBwdWJsaWMgY2hhcmFjdGVyQ291bnQkOiBPYnNlcnZhYmxlPG51bWJlcj5cblxuICBwcml2YXRlIF9jb25maWcgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRoZVNlYW1RdWlsbEVkaXRvckNvbmZpZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuICBwdWJsaWMgY29uZmlnJCA9IHRoaXMuX2NvbmZpZy5hc09ic2VydmFibGUoKVxuXG4gIHByaXZhdGUgX3NlbGVjdGVkTWVudGlvbnMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRoZVNlYW1RdWlsbE1lbnRpb25NZW51T3B0aW9uW10+KFtdKVxuICBwdWJsaWMgc2VsZWN0ZWRNZW50aW9ucyQgPSB0aGlzLl9zZWxlY3RlZE1lbnRpb25zLmFzT2JzZXJ2YWJsZSgpXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRIRVNFQU1fUVVJTExfRURJVE9SX0NPTkZJRykgcHJpdmF0ZSBfY3VzdG9tQ29uZmlnPzogVGhlU2VhbVF1aWxsRWRpdG9yQ29uZmlnXG4gICkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLl9jb25maWdTZXQuYXNPYnNlcnZhYmxlKCksXG4gICAgICB0aGlzLl9zdHlsZXNTZXQuYXNPYnNlcnZhYmxlKCksXG4gICAgICB0aGlzLl90ZW1wbGF0ZVNldC5hc09ic2VydmFibGUoKSxcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKHNldHMgPT4gc2V0cy5maW5kSW5kZXgocyA9PiAhcykgPT09IC0xKVxuICAgIClcblxuICAgIHRoaXMuY2hhcmFjdGVyQ291bnQkID0gdGhpcy5pbml0aWFsaXplZCQucGlwZShcbiAgICAgIGZpbHRlcihpID0+IGkpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZCh0aGlzLmZvcm1Db250cm9sKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1Db250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgc3RhcnRXaXRoKHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpLFxuICAgICAgICAgICAgbWFwKHYgPT4gdGhpcy5jaGFyYWN0ZXJDb3VudGVyRm4odiB8fCAnJyBhcyBzdHJpbmcsIHRoaXMuX2NvbmZpZy52YWx1ZT8uZm9ybWF0KSksXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9mKDApXG4gICAgICB9KVxuICAgIClcblxuICAgIHRoaXMuc2VsZWN0ZWRNZW50aW9ucyQucGlwZShcbiAgICAgIHRhcChtZW50aW9ucyA9PiB0aGlzLm1lbnRpb25zVXBkYXRlZC5lbWl0KG1lbnRpb25zKSlcbiAgICApLnN1YnNjcmliZSgpXG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBUT0RPOiB0ZXN0IHRoaXMgbW9yZVxuICAgIC8vIGlnbm9yZSBxdWlsbCBpbml0aWFsIHZhbHVlQ2hhbmdlIGV2ZW50LCB0byBrZWVwIGZ1bmN0aW9uYWxpdHkgaW4gbGluZSB3aXRoIG90aGVyIGlucHV0c1xuICAgIGxldCBpbml0aWFsRW1pdENvbXBsZXRlID0gZmFsc2VcbiAgICB0aGlzLl9jb25maWdTZXQucGlwZShcbiAgICAgIGZpbHRlcihzID0+IHMpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgIC8vIHNraXAoMSksXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHRhcCgoKSA9PiBpbml0aWFsRW1pdENvbXBsZXRlID0gdHJ1ZSlcbiAgICAgICkpXG4gICAgKS5zdWJzY3JpYmUoKVxuXG4gICAgdGhpcy5mb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5faXNXcml0aW5nVmFsdWUgJiYgaW5pdGlhbEVtaXRDb21wbGV0ZSksXG4gICAgICB0YXAodmFsdWUgPT4gdGhpcy52YWx1ZSA9IHZhbHVlKVxuICAgICkuc3Vic2NyaWJlKClcblxuICAgIHRoaXMuX3BvbGxDYWxjdWxhdGVkUm93SGVpZ2h0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICB0aGlzLl9zdHlsZXNTZXQubmV4dChmYWxzZSlcblxuICAgICAgICBjb25zdCBjYWxjdWxhdGVkUm93c0hlaWdodCA9IGAke3RoaXMucm93cyAqIDEuNX1yZW1gXG5cbiAgICAgICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZCh0aGlzLnJvd3MpICYmIG5vdE51bGxPclVuZGVmaW5lZCh0aGlzLl9xdWlsbEVkaXRvcikpIHtcbiAgICAgICAgICBjb25zdCBlZGl0b3JFbCA9IHRoaXMuX3F1aWxsRWRpdG9yLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcucWwtZWRpdG9yJylcblxuICAgICAgICAgIGlmIChub3ROdWxsT3JVbmRlZmluZWQoZWRpdG9yRWwpKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShlZGl0b3JFbCwgJ2hlaWdodCcsIGNhbGN1bGF0ZWRSb3dzSGVpZ2h0KVxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUoZWRpdG9yRWwsICdtaW4taGVpZ2h0JywgY2FsY3VsYXRlZFJvd3NIZWlnaHQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3R5bGVzU2V0Lm5leHQodHJ1ZSlcbiAgICAgIH0pXG4gICAgKS5zdWJzY3JpYmUoKVxuXG4gICAgdGhpcy5fYnVpbGRRdWlsbENvbmZpZygpXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuY2hhcmFjdGVyQ291bnRlclRwbCkpIHtcbiAgICAgIHRoaXMuY2hhcmFjdGVyQ291bnRlclRwbCA9IHRoaXMuZGVmYXVsdENoYXJhY3RlckNvdW50ZXJUcGwgfHwgbnVsbFxuICAgIH1cblxuICAgIHRoaXMuX3RlbXBsYXRlU2V0Lm5leHQodHJ1ZSlcbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkUXVpbGxDb25maWcoKSB7XG4gICAgdGhpcy5fY29uZmlnU2V0Lm5leHQoZmFsc2UpXG5cbiAgICBjb25zdCBjb25maWc6IFRoZVNlYW1RdWlsbEVkaXRvckNvbmZpZyA9IHtcbiAgICAgIC4uLlRIRVNFQU1fUVVJTExfRURJVE9SX0NPTkZJR19ERUZBVUxUXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGlzYWJsZVJpY2hUZXh0KSB7XG4gICAgICBjb25maWcuZm9ybWF0ID0gJ3RleHQnXG4gICAgICBjb25maWcuZm9ybWF0cyA9IFtdXG4gICAgICBjb25maWcubW9kdWxlcyA9IHtcbiAgICAgICAgdG9vbGJhcjogZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25maWcuZm9ybWF0ID0gdGhpcy5fZ2V0Q29uZmlnT3JEZWZhdWx0KCdmb3JtYXQnKVxuICAgICAgY29uZmlnLmZvcm1hdHMgPSB0aGlzLl9nZXRDb25maWdPckRlZmF1bHQoJ2Zvcm1hdHMnKVxuICAgICAgY29uZmlnLm1vZHVsZXMgPSB7XG4gICAgICAgIC4uLnRoaXMuX2dldENvbmZpZ09yRGVmYXVsdCgnbW9kdWxlcycpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXNlTWVudGlvbnMpIHtcbiAgICAgIGNvbnN0IG1lbnRpb25Nb2R1bGVzOiBUaGVTZWFtUXVpbGxNb2R1bGVzID0ge1xuICAgICAgICAuLi5jb25maWcubW9kdWxlcyxcbiAgICAgICAgbWVudGlvbjoge1xuICAgICAgICAgIC4uLlRIRVNFQU1fUVVJTExfTUVOVElPTl9PUFRJT05TX0RFRkFVTFQsXG4gICAgICAgICAgcmVuZGVyTG9hZGluZzogKCkgPT4gdGhpcy5tZW50aW9uTGlzdExvYWRpbmdUZXh0LFxuICAgICAgICAgIHNvdXJjZTogYXN5bmMgKHNlYXJjaFRlcm06IHN0cmluZywgcmVuZGVyTGlzdDogKGxpc3Q6IGFueVtdLCBzZWFyY2hUZXJtOiBzdHJpbmcpID0+IHZvaWQsIG1lbnRpb25DaGFyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIC8vIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIG1lbnUgaXMgdHJpZ2dlcmVkLFxuICAgICAgICAgICAgLy8gc28gaXQgd2lsbCBhbHdheXMgaGF2ZSB0aGUgbGF0ZXN0IHZhbHVlIGZyb20gbWVudGlvbkl0ZW1zJFxuICAgICAgICAgICAgY29uc3QgbWVudGlvbnNBc3luYyA9IGF3YWl0IGxhc3RWYWx1ZUZyb20odGhpcy5tZW50aW9uSXRlbXMkLnBpcGUodGFrZSgxKSkpXG5cbiAgICAgICAgICAgIGlmIChub3ROdWxsT3JVbmRlZmluZWQobWVudGlvbnNBc3luYykpIHtcbiAgICAgICAgICAgICAgdGhpcy5tZW50aW9uUmVuZGVyTGlzdEZuKG1lbnRpb25zQXN5bmMsIHRoaXMubWVudGlvblNlYXJjaEZuLCB0aGlzLm1lbnRpb25MaXN0RW1wdHlJdGVtLCBzZWFyY2hUZXJtLCByZW5kZXJMaXN0LCBtZW50aW9uQ2hhcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmNvbmZpZy5tb2R1bGVzPy5tZW50aW9uLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbmZpZy5tb2R1bGVzID0gbWVudGlvbk1vZHVsZXNcbiAgICB9XG5cbiAgICBjb25maWcudGhlbWUgPSB0aGlzLl9nZXRDb25maWdPckRlZmF1bHQoJ3RoZW1lJylcbiAgICBjb25maWcuZGVidWcgPSB0aGlzLl9nZXRDb25maWdPckRlZmF1bHQoJ2RlYnVnJylcbiAgICBjb25maWcuY3VzdG9tVG9vbGJhclBvc2l0aW9uID0gdGhpcy5fZ2V0Q29uZmlnT3JEZWZhdWx0KCdjdXN0b21Ub29sYmFyUG9zaXRpb24nKVxuICAgIGNvbmZpZy5zYW5pdGl6ZSA9IHRoaXMuX2dldENvbmZpZ09yRGVmYXVsdCgnc2FuaXRpemUnKVxuICAgIGNvbmZpZy5zdHlsZXMgPSB0aGlzLl9nZXRDb25maWdPckRlZmF1bHQoJ3N0eWxlcycpXG4gICAgY29uZmlnLnN0cmljdCA9IHRoaXMuX2dldENvbmZpZ09yRGVmYXVsdCgnc3RyaWN0JylcbiAgICBjb25maWcuc2Nyb2xsaW5nQ29udGFpbmVyID0gdGhpcy5fZ2V0Q29uZmlnT3JEZWZhdWx0KCdzY3JvbGxpbmdDb250YWluZXInKVxuICAgIGNvbmZpZy5ib3VuZHMgPSB0aGlzLl9nZXRDb25maWdPckRlZmF1bHQoJ2JvdW5kcycpXG4gICAgY29uZmlnLmN1c3RvbU9wdGlvbnMgPSB0aGlzLl9nZXRDb25maWdPckRlZmF1bHQoJ2N1c3RvbU9wdGlvbnMnKVxuICAgIGNvbmZpZy5jdXN0b21Nb2R1bGVzID0gdGhpcy5fZ2V0Q29uZmlnT3JEZWZhdWx0KCdjdXN0b21Nb2R1bGVzJylcbiAgICBjb25maWcudHJhY2tDaGFuZ2VzID0gdGhpcy5fZ2V0Q29uZmlnT3JEZWZhdWx0KCd0cmFja0NoYW5nZXMnKVxuICAgIGNvbmZpZy5wcmVzZXJ2ZVdoaXRlc3BhY2UgPSB0aGlzLl9nZXRDb25maWdPckRlZmF1bHQoJ3ByZXNlcnZlV2hpdGVzcGFjZScpXG4gICAgY29uZmlnLmNsYXNzZXMgPSB0aGlzLl9nZXRDb25maWdPckRlZmF1bHQoJ2NsYXNzZXMnKVxuICAgIGNvbmZpZy50cmltT25WYWxpZGF0aW9uID0gdGhpcy5fZ2V0Q29uZmlnT3JEZWZhdWx0KCd0cmltT25WYWxpZGF0aW9uJylcbiAgICBjb25maWcubGlua1BsYWNlaG9sZGVyID0gdGhpcy5fZ2V0Q29uZmlnT3JEZWZhdWx0KCdsaW5rUGxhY2Vob2xkZXInKVxuICAgIGNvbmZpZy5jb21wYXJlVmFsdWVzID0gdGhpcy5fZ2V0Q29uZmlnT3JEZWZhdWx0KCdjb21wYXJlVmFsdWVzJylcbiAgICBjb25maWcuZmlsdGVyTnVsbCA9IHRoaXMuX2dldENvbmZpZ09yRGVmYXVsdCgnZmlsdGVyTnVsbCcpXG4gICAgY29uZmlnLmRlYm91bmNlVGltZSA9IHRoaXMuX2dldENvbmZpZ09yRGVmYXVsdCgnZGVib3VuY2VUaW1lJylcblxuICAgIHRoaXMuX2NvbmZpZy5uZXh0KGNvbmZpZylcblxuICAgIC8vIHNldFRpbWVvdXQgYmMgbmd4LXF1aWxsIGxpYnJhcnkgZG9lc24ndCBsaXN0ZW4gZm9yIGlucHV0IGNoYW5nZXMsXG4gICAgLy8gc28gd2UgbXVzdCBkZXN0cm95IGFuZCBjcmVhdGUgdGhlIGNvbXBvbmVudCBlYWNoIHRpbWUgY29uZmlnIGlzIHVwZGF0ZWRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2NvbmZpZ1NldC5uZXh0KHRydWUpXG4gICAgfSwgMClcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbmZpZ09yRGVmYXVsdDxLIGV4dGVuZHMga2V5b2YgVGhlU2VhbVF1aWxsRWRpdG9yQ29uZmlnPihwcm9wOiBLKTogVGhlU2VhbVF1aWxsRWRpdG9yQ29uZmlnW0tdIHtcbiAgICBpZiAodGhpcy5fY3VzdG9tQ29uZmlnICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9jdXN0b21Db25maWcsIHByb3ApKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY3VzdG9tQ29uZmlnW3Byb3BdXG4gICAgfVxuICAgIHJldHVybiBUSEVTRUFNX1FVSUxMX0VESVRPUl9DT05GSUdfREVGQVVMVFtwcm9wXVxuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlUXVpbGxDb25maWcoKSB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZ1NldC52YWx1ZSkge1xuICAgICAgdGhpcy5fYnVpbGRRdWlsbENvbmZpZygpXG4gICAgfVxuICB9XG5cbiAgLy8gTm90IHVzYWJsZSwgYmMgY29uZmlnIGhhcyB0byBiZSBzZXQgaW1tZWRpYXRlbHksIHBvdGVudGlhbGx5IGJlZm9yZSBtZW50aW9ucyBwb3B1bGF0ZS5cbiAgLy8gVG8gc2V0IGN1c3RvbURhdGFBdHRyaWJ1dGVzLCBwcm92aWRlIGEgY3VzdG9tIGNvbmZpZy5cbiAgLy8gcHJpdmF0ZSBfZ2V0Q3VzdG9tRGF0YUF0dHJpYnV0ZXMobWVudGlvbnM6IFRoZVNlYW1RdWlsbE1lbnRpb25NZW51T3B0aW9uW10pOiBzdHJpbmdbXSB7XG4gIC8vICAgcmV0dXJuIG1lbnRpb25zLnJlZHVjZSgoYWNjLCBtZW50aW9uKSA9PiB7XG4gIC8vICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMobWVudGlvbilcblxuICAvLyAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gIC8vICAgICAgIGlmIChhY2MuZmluZEluZGV4KGEgPT4gYSA9PT0ga2V5KSA9PT0gLTEpIHtcbiAgLy8gICAgICAgICBhY2MucHVzaChrZXkpXG4gIC8vICAgICAgIH1cbiAgLy8gICAgIH0pXG5cbiAgLy8gICAgIHJldHVybiBhY2NcbiAgLy8gICB9LCA8c3RyaW5nW10+W10gc2F0aXNmaWVzIHN0cmluZ1tdKVxuICAvLyB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZVxuICB9XG4gIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCkge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWVcblxuICAgIGlmICh0aGlzLm9uQ2hhbmdlKSB7IHRoaXMub25DaGFuZ2UodmFsdWUpIH1cbiAgICBpZiAodGhpcy5vblRvdWNoZWQpIHsgdGhpcy5vblRvdWNoZWQoKSB9XG4gIH1cbiAgcHJpdmF0ZSBfdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGxcblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9pc1dyaXRpbmdWYWx1ZSA9IHRydWVcblxuICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWUpXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG5cbiAgICB0aGlzLl9pc1dyaXRpbmdWYWx1ZSA9IGZhbHNlXG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm5cbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuXG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlYWRPbmx5ID0gaXNEaXNhYmxlZFxuICB9XG5cbiAgX29uRWRpdG9yQ3JlYXRlZChldmVudDogYW55KSB7XG4gICAgdGhpcy5xdWlsbEVkaXRvckNyZWF0ZWQuZW1pdChldmVudClcbiAgfVxuXG4gIF9vbkVkaXRvckNoYW5nZWQoZXZlbnQ6IEVkaXRvckNoYW5nZUNvbnRlbnQgfCBFZGl0b3JDaGFuZ2VTZWxlY3Rpb24pIHtcbiAgICB0aGlzLnF1aWxsRWRpdG9yQ2hhbmdlZC5lbWl0KGV2ZW50KVxuICB9XG5cbiAgX29uQ29udGVudENoYW5nZWQoZXZlbnQ6IENvbnRlbnRDaGFuZ2UpIHtcbiAgICB0aGlzLnF1aWxsQ29udGVudENoYW5nZWQuZW1pdChldmVudClcblxuICAgIHRoaXMuX3VwZGF0ZU1lbnRpb25zRnJvbURlbHRhKGV2ZW50LmNvbnRlbnQpXG4gIH1cblxuICBfb25TZWxlY3Rpb25DaGFuZ2VkKGV2ZW50OiBTZWxlY3Rpb25DaGFuZ2UpIHtcbiAgICB0aGlzLnF1aWxsU2VsZWN0aW9uQ2hhbmdlZC5lbWl0KGV2ZW50KVxuICB9XG5cbiAgX29uRm9jdXMoZXZlbnQ6IEZvY3VzKSB7XG4gICAgdGhpcy5xdWlsbEZvY3VzLmVtaXQoZXZlbnQpXG4gIH1cblxuICBfb25CbHVyKGV2ZW50OiBCbHVyKSB7XG4gICAgdGhpcy5xdWlsbEJsdXIuZW1pdChldmVudClcblxuICAgIGlmICh0aGlzLm9uVG91Y2hlZCkge1xuICAgICAgdGhpcy5vblRvdWNoZWQoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYWNreSB3YXkgdG8gdHJhY2sgbWVudGlvbiBpbnNlcnRzL2RlbGV0ZXNcbiAgICovXG4gIHByaXZhdGUgX3VwZGF0ZU1lbnRpb25zRnJvbURlbHRhKGNvbnRlbnQ6IERlbHRhKSB7XG4gICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZChjb250ZW50Lm9wcykpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnRNZW50aW9uSWRzID0gY29udGVudC5vcHMubWFwKG8gPT4gby5pbnNlcnQ/Lm1lbnRpb24/LmlkKS5maWx0ZXIobm90TnVsbE9yVW5kZWZpbmVkKVxuICAgICAgY29uc3Qgc2VsZWN0ZWRNZW50aW9ucyA9IFsgLi4udGhpcy5fc2VsZWN0ZWRNZW50aW9ucy52YWx1ZSBdXG4gICAgICBjb25zdCBtZW50aW9uT3B0aW9ucyA9IFsgLi4udGhpcy5fbWVudGlvbkl0ZW1zLnZhbHVlIHx8IFtdIF1cblxuICAgICAgY29uc3QgbmV3TWVudGlvbnM6IFRoZVNlYW1RdWlsbE1lbnRpb25NZW51T3B0aW9uW10gPSBjb250ZW50TWVudGlvbklkcy5yZWR1Y2UoKGFjYywgbWVudGlvbklkKSA9PiB7XG4gICAgICAgIGNvbnN0IGluc2VydE1lbnRpb24gPSBtZW50aW9uT3B0aW9ucy5maW5kKG0gPT4gaXNNZW50aW9uTWVudU9wdGlvbihtKSAmJiBtLmlkID09PSBtZW50aW9uSWQpXG5cbiAgICAgICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZChpbnNlcnRNZW50aW9uKSkge1xuICAgICAgICAgIGFjYy5wdXNoKGluc2VydE1lbnRpb24pXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdNZW50aW9uIGFkZGl0aW9uIGZhaWxlZCEgU2VsZWN0ZWQgbWVudGlvbiBvcHRpb24gbm90IGZvdW5kOicsIG1lbnRpb25JZClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2NcbiAgICAgIH0sIDxUaGVTZWFtUXVpbGxNZW50aW9uTWVudU9wdGlvbltdPltdKVxuXG4gICAgICBsZXQgZW1pdFVwZGF0ZSA9IGZhbHNlXG4gICAgICBpZiAoc2VsZWN0ZWRNZW50aW9ucy5sZW5ndGggIT09IG5ld01lbnRpb25zLmxlbmd0aCkge1xuICAgICAgICAvLyBpZiB0aGUgbGVuZ3RoIGhhcyBjaGFuZ2VkLCB3ZSBrbm93IGFuIHVwZGF0ZSBvY2N1cnJlZFxuICAgICAgICBlbWl0VXBkYXRlID0gdHJ1ZVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSwgdGVzdCBpZHMgZm9yIG9sZCBhbmQgbmV3IGl0ZW1zIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGVtaXQgYSBjaGFuZ2VcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRNZW50aW9uSWRzID0gdGhpcy5fc2VsZWN0ZWRNZW50aW9ucy52YWx1ZS5tYXAobSA9PiBtLmlkKVxuICAgICAgICBjb25zdCBuZXdNZW50aW9uSWRzID0gbmV3TWVudGlvbnMubWFwKG0gPT4gbS5pZClcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgc2VsZWN0ZWRNZW50aW9uSWRzLmZpbmRJbmRleChtID0+ICFuZXdNZW50aW9uSWRzLmluY2x1ZGVzKG0pKSAhPT0gLTEgfHxcbiAgICAgICAgICBuZXdNZW50aW9uSWRzLmZpbmRJbmRleChtID0+ICFzZWxlY3RlZE1lbnRpb25JZHMuaW5jbHVkZXMobSkpICE9PSAtMVxuICAgICAgICApIHtcbiAgICAgICAgICBlbWl0VXBkYXRlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChlbWl0VXBkYXRlKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkTWVudGlvbnMubmV4dChuZXdNZW50aW9ucylcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJlZGl0b3JcIiAqbmdJZj1cImNvbmZpZ1NldCQgfCBhc3luY1wiIFtjbGFzcy5pbml0aWFsaXppbmddPVwiIShpbml0aWFsaXplZCQgfCBhc3luYylcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbmZpZyQgfCBhc3luYyBhcyBjb25maWdcIj5cbiAgICA8cXVpbGwtZWRpdG9yXG4gICAgICAjcXVpbGxFZGl0b3JcbiAgICAgIHNlYW1JbnB1dFxuICAgICAgW2NsYXNzLmRpc2FibGVkXT1cInJlYWRPbmx5XCJcbiAgICAgIFthdHRyLmRpc2FibGVkXT1cInJlYWRPbmx5XCJcbiAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgW3JlYWRPbmx5XT1cInJlYWRPbmx5XCJcbiAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICBbbWluTGVuZ3RoXT1cIm1pbkxlbmd0aFwiXG4gICAgICBbbWF4TGVuZ3RoXT1cIm1heExlbmd0aFwiXG4gICAgICBbZm9ybWF0XT1cImNvbmZpZy5mb3JtYXRcIlxuICAgICAgW3RoZW1lXT1cImNvbmZpZy50aGVtZVwiXG4gICAgICBbbW9kdWxlc109XCJjb25maWcubW9kdWxlc1wiXG4gICAgICBbZGVidWddPVwiY29uZmlnLmRlYnVnXCJcbiAgICAgIFtmb3JtYXRzXT1cImNvbmZpZy5mb3JtYXRzXCJcbiAgICAgIFtjdXN0b21Ub29sYmFyUG9zaXRpb25dPVwiY29uZmlnLmN1c3RvbVRvb2xiYXJQb3NpdGlvblwiXG4gICAgICBbc2FuaXRpemVdPVwiY29uZmlnLnNhbml0aXplXCJcbiAgICAgIFtzdHlsZXNdPVwiY29uZmlnLnN0eWxlc1wiXG4gICAgICBbc3RyaWN0XT1cImNvbmZpZy5zdHJpY3RcIlxuICAgICAgW3Njcm9sbGluZ0NvbnRhaW5lcl09XCJjb25maWcuc2Nyb2xsaW5nQ29udGFpbmVyXCJcbiAgICAgIFtib3VuZHNdPVwiY29uZmlnLmJvdW5kc1wiXG4gICAgICBbY3VzdG9tT3B0aW9uc109XCJjb25maWcuY3VzdG9tT3B0aW9uc1wiXG4gICAgICBbY3VzdG9tTW9kdWxlc109XCJjb25maWcuY3VzdG9tTW9kdWxlc1wiXG4gICAgICBbdHJhY2tDaGFuZ2VzXT1cImNvbmZpZy50cmFja0NoYW5nZXNcIlxuICAgICAgW3ByZXNlcnZlV2hpdGVzcGFjZV09XCJjb25maWcucHJlc2VydmVXaGl0ZXNwYWNlXCJcbiAgICAgIFtjbGFzc2VzXT1cImNvbmZpZy5jbGFzc2VzXCJcbiAgICAgIFt0cmltT25WYWxpZGF0aW9uXT1cImNvbmZpZy50cmltT25WYWxpZGF0aW9uXCJcbiAgICAgIFtsaW5rUGxhY2Vob2xkZXJdPVwiY29uZmlnLmxpbmtQbGFjZWhvbGRlclwiXG4gICAgICBbY29tcGFyZVZhbHVlc109XCJjb25maWcuY29tcGFyZVZhbHVlc1wiXG4gICAgICBbZmlsdGVyTnVsbF09XCJjb25maWcuZmlsdGVyTnVsbFwiXG4gICAgICBbZGVib3VuY2VUaW1lXT1cImNvbmZpZy5kZWJvdW5jZVRpbWVcIlxuICAgICAgW2NsYXNzLmNhbi1yZXNpemVdPVwicmVzaXphYmxlXCJcbiAgICAgIChvbkVkaXRvckNyZWF0ZWQpPVwiX29uRWRpdG9yQ3JlYXRlZCgkZXZlbnQpXCJcbiAgICAgIChvbkVkaXRvckNoYW5nZWQpPVwiX29uRWRpdG9yQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgIChvbkNvbnRlbnRDaGFuZ2VkKT1cIl9vbkNvbnRlbnRDaGFuZ2VkKCRldmVudClcIlxuICAgICAgKG9uU2VsZWN0aW9uQ2hhbmdlZCk9XCJfb25TZWxlY3Rpb25DaGFuZ2VkKCRldmVudClcIlxuICAgICAgKG9uRm9jdXMpPVwiX29uRm9jdXMoJGV2ZW50KVwiXG4gICAgICAob25CbHVyKT1cIl9vbkJsdXIoJGV2ZW50KVwiPjwvcXVpbGwtZWRpdG9yPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNwbGF5Q2hhcmFjdGVyQ291bnRlclwiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjaGFyYWN0ZXJDb3VudGVyVHBsXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjaGFyYWN0ZXJDb3VudCQgfCBhc3luYywgbWluTGVuZ3RoOiBtaW5MZW5ndGgsIG1heExlbmd0aDogbWF4TGVuZ3RoLCBjaGFyYWN0ZXJDb3VudDogY2hhcmFjdGVyQ291bnQkIHwgYXN5bmMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2NoYXJhY3RlckNvdW50ZXIgbGV0LWltcGxpY2l0IGxldC1taW5MZW5ndGg9XCJtaW5MZW5ndGhcIiBsZXQtbWF4TGVuZ3RoPVwibWF4TGVuZ3RoXCIgbGV0LWNoYXJhY3RlckNvdW50PVwiY2hhcmFjdGVyQ291bnRcIj5cbiAgPGRpdiBjbGFzcz1cInNtYWxsIHRleHQtYmxhY2stNTAgdGV4dC1yaWdodFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjaGFyYWN0ZXJDb3VudCB8fCBjaGFyYWN0ZXJDb3VudCA9PT0gMFwiPlxuICAgICAgQ2hhcmFjdGVyIENvdW50OlxuICAgICAgPHNwYW4gW2NsYXNzLnRleHQtZGFuZ2VyXT1cImNoYXJhY3RlckNvdW50ICYmICgobWF4TGVuZ3RoICYmIGNoYXJhY3RlckNvdW50ID4gbWF4TGVuZ3RoKSB8fCAobWluTGVuZ3RoICYmIGNoYXJhY3RlckNvdW50IDwgbWluTGVuZ3RoKSlcIj5cbiAgICAgICAge3sgY2hhcmFjdGVyQ291bnQgfCBudW1iZXIgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtYXhMZW5ndGhcIj5cbiAgICAgICAgLyB7eyBtYXhMZW5ndGggfX1cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHNwYW4gKm5nSWY9XCJtaW5MZW5ndGhcIiBjbGFzcz1cImZvbnQtaXRhbGljXCI+XG4gICAgICAgIChtaW5pbXVtIHt7IG1pbkxlbmd0aCB9fSBleHBlY3RlZClcbiAgICAgIDwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
594
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaC10ZXh0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi9yaWNoLXRleHQvcmljaC10ZXh0L3JpY2gtdGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vcmljaC10ZXh0L3JpY2gtdGV4dC9yaWNoLXRleHQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixRQUFRLEVBQUUsTUFBTSxFQUFvQyxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xNLE9BQU8sRUFBd0IsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJdEYsT0FBTyxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXpKLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWpGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxtQ0FBbUMsRUFBRSxxQ0FBcUMsRUFBRSw2QkFBNkIsRUFBRSwwQkFBMEIsRUFBRSxzQkFBc0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7OztBQUVqUCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBYTtJQUNoRCxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFB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O2dCQTJCRix1QkFBdUI7c0JBRDFCLEtBQUs7Z0JBWUYsU0FBUztzQkFEWixLQUFLO2dCQVlGLFNBQVM7c0JBRFosS0FBSztnQkFpQkYsbUJBQW1CO3NCQUR0QixLQUFLO2dCQWVPLGtCQUFrQjtzQkFBOUIsS0FBSztnQkFpQkYsV0FBVztzQkFEZCxLQUFLO2dCQW9CRixZQUFZO3NCQURmLEtBQUs7Z0JBbUJGLGVBQWU7c0JBRGxCLEtBQUs7Z0JBaUJGLG1CQUFtQjtzQkFEdEIsS0FBSztnQkFpQkYsc0JBQXNCO3NCQUR6QixLQUFLO2dCQWlCRixvQkFBb0I7c0JBRHZCLEtBQUs7Z0JBb0JJLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBRUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFHSCxXQUFXO3NCQURkLFNBQVM7dUJBQUMsYUFBYTtnQkFjTywwQkFBMEI7c0JBQXhELFNBQVM7dUJBQUMsa0JBQWtCO2dCQUc3QixjQUFjO3NCQURiLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0LCBQcm92aWRlciwgUmVuZGVyZXIyLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBmb3J3YXJkUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBCbHVyLCBDb250ZW50Q2hhbmdlLCBFZGl0b3JDaGFuZ2VDb250ZW50LCBFZGl0b3JDaGFuZ2VTZWxlY3Rpb24sIEZvY3VzLCBRdWlsbEVkaXRvckNvbXBvbmVudCwgU2VsZWN0aW9uQ2hhbmdlIH0gZnJvbSAnbmd4LXF1aWxsJztcbmltcG9ydCB7IERlbHRhIH0gZnJvbSAncXVpbGwnO1xuaW1wb3J0ICdxdWlsbC1tZW50aW9uJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZmlsdGVyLCBsYXN0VmFsdWVGcm9tLCBtYXAsIG9mLCBzaGFyZVJlcGxheSwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRha2UsIHRhcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBpc051bGxPclVuZGVmaW5lZCwgbm90TnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnQHRoZXNlYW0vdWktY29tbW9uL3V0aWxzJztcbmltcG9ydCB7IFRoZVNlYW1DaGFyYWN0ZXJDb3VudGVyRm4sIFRoZVNlYW1RdWlsbEVkaXRvckNvbmZpZywgVGhlU2VhbVF1aWxsTWVudGlvbk1lbnVJdGVtLCBUaGVTZWFtUXVpbGxNZW50aW9uTWVudU9wdGlvbiwgVGhlU2VhbVF1aWxsTWVudGlvblNlYXJjaEZuLCBUaGVTZWFtUXVpbGxNZW50aW9uU291cmNlRm4sIFRoZVNlYW1RdWlsbE1vZHVsZXMgfSBmcm9tICcuLi91dGlscy9tb2RlbHMnO1xuaW1wb3J0IHsgVEhFU0VBTV9RVUlMTF9FRElUT1JfQ09ORklHLCBUSEVTRUFNX1FVSUxMX0VESVRPUl9DT05GSUdfREVGQVVMVCwgVEhFU0VBTV9RVUlMTF9NRU5USU9OX09QVElPTlNfREVGQVVMVCwgZGVmYXVsdEh0bWxDaGFyYWN0ZXJDb3VudGVyRm4sIGRlZmF1bHRNZW50aW9uUmVuZGVyTGlzdEZuLCBkZWZhdWx0TWVudGlvblNlYXJjaEZuLCBpc01lbnRpb25NZW51T3B0aW9uIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgUklDSF9URVhUX1ZBTFVFX0FDQ0VTU09SOiBQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFJpY2hUZXh0Q29tcG9uZW50KSxcbiAgbXVsdGk6IHRydWVcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2VhbS1yaWNoLXRleHQnLFxuICB0ZW1wbGF0ZVVybDogJy4vcmljaC10ZXh0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmljaC10ZXh0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIFJJQ0hfVEVYVF9WQUxVRV9BQ0NFU1NPUlxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFJpY2hUZXh0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICBvbkNoYW5nZTogYW55XG4gIG9uVG91Y2hlZDogYW55XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1pbnB1dC1yZW5hbWVcbiAgQElucHV0KCd2YWx1ZScpIHZhbDogc3RyaW5nIHwgdW5kZWZpbmVkXG5cbiAgZm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbClcblxuICBASW5wdXQoKVxuICBnZXQgcmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkXG4gIH1cbiAgc2V0IHJlcXVpcmVkKHZhbHVlOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChub3ROdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICB0aGlzLl9yZXF1aXJlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSlcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfcmVxdWlyZWQgPSBmYWxzZVxuXG4gIC8qKiBAZGVmYXVsdCAnJyAoZW1wdHkgc3RyaW5nKSAqL1xuICBASW5wdXQoKVxuICBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXJcbiAgfVxuICBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAobm90TnVsbE9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB2YWx1ZVxuICAgIH1cbiAgfVxuICBwcml2YXRlIF9wbGFjZWhvbGRlciA9ICcnXG5cbiAgLyoqXG4gICAqIEluaXRpYWwgcm93cyB2aXNpYmxlIGluIHRleHQgYXJlYSwgc2V0IHVzaW5nIGBoZWlnaHRgIGFuZCBgbWluSGVpZ2h0YC5cbiAgICpcbiAgICogTk9URTogUmVzaXphYmxlIGVkaXRvcnMgd2lsbCBub3QgYmUgYWJsZSB0byBzaXplIGJlbG93IHRoZSBoZWlnaHQgY2FsY3VsYXRlZCBmcm9tIHRoaXMgdmFsdWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IDVcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCByb3dzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd3NcbiAgfVxuICBzZXQgcm93cyh2YWx1ZTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChub3ROdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICB0aGlzLl9yb3dzID0gdmFsdWVcblxuICAgICAgdGhpcy5fcG9sbENhbGN1bGF0ZWRSb3dIZWlnaHQubmV4dCgpXG4gICAgfVxuICB9XG4gIHByaXZhdGUgX3Jvd3MgPSA1XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCB0ZXh0IGFyZWEgY2FuIGJlIHJlc2l6ZWQgdmVydGljYWxseS5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHJlc2l6YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzaXphYmxlXG4gIH1cbiAgc2V0IHJlc2l6YWJsZSh2YWx1ZTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAobm90TnVsbE9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgdGhpcy5fcmVzaXphYmxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKVxuICAgIH1cbiAgfVxuICBwcml2YXRlIF9yZXNpemFibGUgPSB0cnVlXG5cbiAgLyoqIEBkZWZhdWx0IGZhbHNlICovXG4gIGdldCByZWFkT25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZE9ubHlcbiAgfVxuICBzZXQgcmVhZE9ubHkodmFsdWU6IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX3JlYWRPbmx5ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKVxuICAgIH1cbiAgfVxuICBwcml2YXRlIF9yZWFkT25seSA9IGZhbHNlXG5cbiAgLy8gVE9ETzogZml4IGJ1ZyB3aGVyZSBpbml0aWFsIGh0bWwgdmFsdWUgaXMgcmVuZGVyZWQgaW4gcGxhaW4gdGV4dFxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIG92ZXJyaWRlcyBhbGwgb3RoZXIgcHJvdmlkZWQgc2V0dGluZ3MgdG8gcHJlc2VudCB0aGUgZWRpdG9yXG4gICAqIGFzIGEgc3RhbmRhcmQgdGV4dGJveC5cbiAgICpcbiAgICogTk9URTogRm9yIHRoZSBtb21lbnQsIGA8cD48L3A+YCB0YWdzIGFyZSBzdGlsbCBhbGxvd2VkLCB0cmlnZ2VyZWQgYnkgdGhlIGBFbnRlcmAga2V5LlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vc2xhYi9xdWlsbC9pc3N1ZXMvMTQzMlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVSaWNoVGV4dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZVJpY2hUZXh0XG4gIH1cbiAgc2V0IGRpc2FibGVSaWNoVGV4dCh2YWx1ZTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAobm90TnVsbE9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgdGhpcy5fZGlzYWJsZVJpY2hUZXh0ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKVxuXG4gICAgICB0aGlzLl91cGRhdGVRdWlsbENvbmZpZygpXG4gICAgfVxuICB9XG4gIHByaXZhdGUgX2Rpc2FibGVSaWNoVGV4dCA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCBkaXNwbGF5cyBhIGNoYXJhY3RlciBjb3VudGVyIGF0IHRoZSBib3R0b20gb2YgdGhlIGVkaXRvci5cbiAgICogQ2hhcmFjdGVyIGNvdW50ZXIgdGV4dCBpcyBkZXRlcm1pbmVkIGJ5IHZhbHVlcyBwcm92aWRlZCBpbiBgbWluTGVuZ3RoYFxuICAgKiBhbmQgYG1heExlbmd0aGAuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGNvdW50IGFsZ29yaXRobSBzdHJpcHMgb3V0IGh0bWwgZW50aXRpZXMgYW5kIHJlcGxhY2VzIHRoZW1cbiAgICogd2l0aCBzcGFjZXMgdG8gZ2V0IHRoZSBzdHJpbmcgbGVuZ3RoLiBUbyBvdmVycmlkZSB0aGlzIGJlaGF2aW9yLCBwYXNzXG4gICAqIGEgY3VzdG9tIGZ1bmN0aW9uIHRvIGBjaGFyYWN0ZXJDb3VudGVyRm5gLlxuICAgKlxuICAgKiBUbyBvdmVycmlkZSBkZWZhdWx0IGNoYXJhY3RlciBjb3VudGVyIGRpc3BsYXksIHBhc3MgYSBjdXN0b20gdGVtcGxhdGUgdG8gYGNoYXJhY3RlckNvdW50VHBsYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBkaXNwbGF5Q2hhcmFjdGVyQ291bnRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzcGxheUNoYXJhY3RlckNvdW50ZXJcbiAgfVxuICBzZXQgZGlzcGxheUNoYXJhY3RlckNvdW50ZXIodmFsdWU6IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX2Rpc3BsYXlDaGFyYWN0ZXJDb3VudGVyID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKVxuICAgIH1cbiAgfVxuICBwcml2YXRlIF9kaXNwbGF5Q2hhcmFjdGVyQ291bnRlciA9IGZhbHNlXG5cbiAgQElucHV0KClcbiAgZ2V0IG1pbkxlbmd0aCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9taW5MZW5ndGhcbiAgfVxuICBzZXQgbWluTGVuZ3RoKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAobm90TnVsbE9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgdGhpcy5fbWluTGVuZ3RoID0gdmFsdWVcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfbWluTGVuZ3RoOiBudW1iZXIgfCB1bmRlZmluZWRcblxuICBASW5wdXQoKVxuICBnZXQgbWF4TGVuZ3RoKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21heExlbmd0aFxuICB9XG4gIHNldCBtYXhMZW5ndGgodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChub3ROdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICB0aGlzLl9tYXhMZW5ndGggPSB2YWx1ZVxuICAgIH1cbiAgfVxuICBwcml2YXRlIF9tYXhMZW5ndGg6IG51bWJlciB8IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBTZXQgdG8gb3ZlcnJpZGUgZGVmYXVsdCBjaGFyYWN0ZXIgY291bnRlciBkaXNwbGF5LlxuICAgKlxuICAgKiBUZW1wbGF0ZSBjb250ZXh0IGluY2x1ZGVzIHZhcmlhYmxlcyBgbWluTGVuZ3RoYCwgYG1heExlbmd0aGAsIGFuZCBgY2hhcmFjdGVyQ291bnRgLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGNoYXJhY3RlckNvdW50ZXJUcGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9jaGFyYWN0ZXJDb3VudGVyVHBsXG4gIH1cbiAgc2V0IGNoYXJhY3RlckNvdW50ZXJUcGwodmFsdWUpIHtcbiAgICBpZiAobm90TnVsbE9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgdGhpcy5fY2hhcmFjdGVyQ291bnRlclRwbCA9IHZhbHVlXG4gICAgfVxuICB9XG4gIHByaXZhdGUgX2NoYXJhY3RlckNvdW50ZXJUcGw6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiBTZXQgdG8gb3ZlcnJpZGUgZGVmYXVsdCBjb3VudGVyIGZ1bmN0aW9uLCB3aGljaCBzdHJpcHMgaHRtbCBlbnRpdGllcyBhbmRcbiAgICogcmVwbGFjZXMgdGhlbSB3aXRoIGEgc3BhY2UuXG4gICAqL1xuICBASW5wdXQoKSBnZXQgY2hhcmFjdGVyQ291bnRlckZuKCk6IFRoZVNlYW1DaGFyYWN0ZXJDb3VudGVyRm4ge1xuICAgIHJldHVybiB0aGlzLl9jaGFyYWN0ZXJDb3VudGVyRm5cbiAgfVxuICBzZXQgY2hhcmFjdGVyQ291bnRlckZuKHZhbHVlOiBUaGVTZWFtQ2hhcmFjdGVyQ291bnRlckZuIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChub3ROdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICB0aGlzLl9jaGFyYWN0ZXJDb3VudGVyRm4gPSB2YWx1ZVxuICAgIH1cbiAgfVxuICBwcml2YXRlIF9jaGFyYWN0ZXJDb3VudGVyRm4gPSBkZWZhdWx0SHRtbENoYXJhY3RlckNvdW50ZXJGblxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGNvbXBvbmVudCB3aWxsIGNvbmZpZ3VyZSB0aGUgUXVpbGwgZWRpdG9yIHdpdGggdGhlIHF1aWxsLW1lbnRpb25zIGV4dGVuc2lvblxuICAgKiBhbmQgbGlzdGVuIGZvciB2YWx1ZXMgcGFzc2VkIHRvIGBtZW50aW9uSXRlbXNgIHRvIHBvcHVsYXRlIHRoZSBtZW50aW9ucyBtZW51LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHVzZU1lbnRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl91c2VNZW50aW9uc1xuICB9XG4gIHNldCB1c2VNZW50aW9ucyh2YWx1ZTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAobm90TnVsbE9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgdGhpcy5fdXNlTWVudGlvbnMgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpXG5cbiAgICAgIHRoaXMuX3VwZGF0ZVF1aWxsQ29uZmlnKClcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfdXNlTWVudGlvbnM6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHVzZXJzLCB1c2VyIGdyb3Vwcywgb3Igb3RoZXIgZW50aXRpZXMgdG8gZGlzcGxheSBpbiBtZW50aW9ucyBtZW51LlxuICAgKiBNaW5pbXVtIHJlcXVpcmVkIHByb3BlcnRpZXMgYXJlIGBpZGAgKHVuaXF1ZSkgYW5kIGB2YWx1ZWAsIHdoaWNoIGFjdHMgYXMgdGhlIGxhYmVsLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgbWVudSBpcyB0cmlnZ2VyZWQgYnkgdHlwaW5nIHRoZSBgQGAgc3ltYm9sIGludG8gdGhlIHRleHQgYXJlYS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBtZW50aW9uSXRlbXMoKTogVGhlU2VhbVF1aWxsTWVudGlvbk1lbnVJdGVtW10gfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbWVudGlvbkl0ZW1zLnZhbHVlXG4gIH1cbiAgc2V0IG1lbnRpb25JdGVtcyh2YWx1ZTogVGhlU2VhbVF1aWxsTWVudGlvbk1lbnVJdGVtW10gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX21lbnRpb25JdGVtcy5uZXh0KHZhbHVlKVxuICAgIH1cbiAgfVxuICBwcml2YXRlIF9tZW50aW9uSXRlbXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRoZVNlYW1RdWlsbE1lbnRpb25NZW51SXRlbVtdIHwgbnVsbCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuICBwdWJsaWMgbWVudGlvbkl0ZW1zJCA9IHRoaXMuX21lbnRpb25JdGVtcy5hc09ic2VydmFibGUoKS5waXBlKFxuICAgIGZpbHRlcihtZW50aW9ucyA9PiBub3ROdWxsT3JVbmRlZmluZWQobWVudGlvbnMpICYmIG1lbnRpb25zLmxlbmd0aCA+IDApLFxuICAgIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSlcbiAgKVxuXG4gIC8qKlxuICAgKiBTZXQgdG8gb3ZlcnJpZGUgZGVmYXVsdCBzZWFyY2ggZnVuY3Rpb24gd2hlbiB1c2VyIGlzIHR5cGluZyBhIG1lbnRpb24uXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgbWVudGlvblNlYXJjaEZuKCk6IFRoZVNlYW1RdWlsbE1lbnRpb25TZWFyY2hGbiB7XG4gICAgcmV0dXJuIHRoaXMuX21lbnRpb25TZWFyY2hGblxuICB9XG4gIHNldCBtZW50aW9uU2VhcmNoRm4odmFsdWU6IFRoZVNlYW1RdWlsbE1lbnRpb25TZWFyY2hGbiB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAobm90TnVsbE9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgdGhpcy5fbWVudGlvblNlYXJjaEZuID0gdmFsdWVcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfbWVudGlvblNlYXJjaEZuOiBUaGVTZWFtUXVpbGxNZW50aW9uU2VhcmNoRm4gPSBkZWZhdWx0TWVudGlvblNlYXJjaEZuXG5cbiAgLyoqXG4gICAqIFNldCB0byBvdmVycmlkZSBkZWZhdWx0IHJlbmRlciBmdW5jdGlvbiBmb3IgbWVudGlvbnMgbGlzdC5cbiAgICpcbiAgICogRnVuY3Rpb24gc2hvdWxkIGNhbGwgYHJlbmRlckxpc3RgLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IG1lbnRpb25SZW5kZXJMaXN0Rm4oKTogVGhlU2VhbVF1aWxsTWVudGlvblNvdXJjZUZuIHtcbiAgICByZXR1cm4gdGhpcy5fbWVudGlvblJlbmRlckxpc3RGblxuICB9XG4gIHNldCBtZW50aW9uUmVuZGVyTGlzdEZuKHZhbHVlOiBUaGVTZWFtUXVpbGxNZW50aW9uU291cmNlRm4gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX21lbnRpb25SZW5kZXJMaXN0Rm4gPSB2YWx1ZVxuICAgIH1cbiAgfVxuICBwcml2YXRlIF9tZW50aW9uUmVuZGVyTGlzdEZuOiBUaGVTZWFtUXVpbGxNZW50aW9uU291cmNlRm4gPSBkZWZhdWx0TWVudGlvblJlbmRlckxpc3RGblxuXG4gIC8qKlxuICAgKiBTZXQgdG8gb3ZlcnJpZGUgZGVmYXVsdCB0ZXh0IHNob3duIHdoaWxlIG1lbnRpb24gaXRlbXMgYXJlIGxvYWRpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdMb2FkaW5nLi4uJ1xuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IG1lbnRpb25MaXN0TG9hZGluZ1RleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbWVudGlvbkxpc3RMb2FkaW5nVGV4dFxuICB9XG4gIHNldCBtZW50aW9uTGlzdExvYWRpbmdUZXh0KHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX21lbnRpb25MaXN0TG9hZGluZ1RleHQgPSB2YWx1ZVxuICAgIH1cbiAgfVxuICBwcml2YXRlIF9tZW50aW9uTGlzdExvYWRpbmdUZXh0OiBzdHJpbmcgPSAnTG9hZGluZy4uLidcblxuICAvKipcbiAgICogU2V0IHRvIG92ZXJyaWRlIGRlZmF1bHQgdGV4dCBzaG93biB3aGVuIGEgbWVudGlvbiBzZWFyY2ggcmV0dXJucyBubyBpdGVtcy5cbiAgICpcbiAgICogQGRlZmF1bHQgJ05vIG1hdGNoZXMgZm91bmQuJ1xuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IG1lbnRpb25MaXN0RW1wdHlUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX21lbnRpb25MaXN0RW1wdHlUZXh0XG4gIH1cbiAgc2V0IG1lbnRpb25MaXN0RW1wdHlUZXh0KHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX21lbnRpb25MaXN0RW1wdHlUZXh0ID0gdmFsdWVcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfbWVudGlvbkxpc3RFbXB0eVRleHQ6IHN0cmluZyA9ICdObyBtYXRjaGVzIGZvdW5kLidcblxuICBnZXQgbWVudGlvbkxpc3RFbXB0eUl0ZW0oKTogVGhlU2VhbVF1aWxsTWVudGlvbk1lbnVPcHRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogJ3VuZGVmaW5lZCcsXG4gICAgICB2YWx1ZTogdGhpcy5tZW50aW9uTGlzdEVtcHR5VGV4dCxcbiAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgZW1wdHlMaXN0OiB0cnVlXG4gICAgfVxuICB9XG5cbiAgQE91dHB1dCgpIHF1aWxsRWRpdG9yQ3JlYXRlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgQE91dHB1dCgpIHF1aWxsRWRpdG9yQ2hhbmdlZDogRXZlbnRFbWl0dGVyPEVkaXRvckNoYW5nZUNvbnRlbnQgfCBFZGl0b3JDaGFuZ2VTZWxlY3Rpb24+ID0gbmV3IEV2ZW50RW1pdHRlcigpXG4gIEBPdXRwdXQoKSBxdWlsbENvbnRlbnRDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8Q29udGVudENoYW5nZT4gPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgQE91dHB1dCgpIHF1aWxsU2VsZWN0aW9uQ2hhbmdlZDogRXZlbnRFbWl0dGVyPFNlbGVjdGlvbkNoYW5nZT4gPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgQE91dHB1dCgpIHF1aWxsRm9jdXM6IEV2ZW50RW1pdHRlcjxGb2N1cz4gPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgQE91dHB1dCgpIHF1aWxsQmx1cjogRXZlbnRFbWl0dGVyPEJsdXI+ID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbiAgQE91dHB1dCgpIG1lbnRpb25zVXBkYXRlZDogRXZlbnRFbWl0dGVyPFRoZVNlYW1RdWlsbE1lbnRpb25NZW51T3B0aW9uW10+ID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbiAgQFZpZXdDaGlsZCgncXVpbGxFZGl0b3InKVxuICBnZXQgcXVpbGxFZGl0b3IoKTogUXVpbGxFZGl0b3JDb21wb25lbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9xdWlsbEVkaXRvclxuICB9XG4gIHNldCBxdWlsbEVkaXRvcih2YWx1ZTogUXVpbGxFZGl0b3JDb21wb25lbnQgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9xdWlsbEVkaXRvciA9IHZhbHVlXG5cbiAgICAvLyBzZXRUaW1lb3V0IGJlY2F1c2UgZnVsbCBodG1sIGlzbid0IGF2YWlsYWJsZSB1bnRpbCB0aGUgbmV4dCB0aWNrXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9wb2xsQ2FsY3VsYXRlZFJvd0hlaWdodC5uZXh0KClcbiAgICB9LCAwKVxuICB9XG4gIHByaXZhdGUgX3F1aWxsRWRpdG9yOiBRdWlsbEVkaXRvckNvbXBvbmVudCB8IHVuZGVmaW5lZFxuXG4gIEBWaWV3Q2hpbGQoJ2NoYXJhY3RlckNvdW50ZXInKSBkZWZhdWx0Q2hhcmFjdGVyQ291bnRlclRwbDogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICBfaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmIChldmVudC5jb2RlID09PSAnRXNjYXBlJykge1xuICAgICAgY29uc3QgcWxFZGl0b3IgPSB0aGlzLl9xdWlsbEVkaXRvcj8uZWRpdG9yRWxlbT8ucXVlcnlTZWxlY3RvcignLnFsLWVkaXRvcicpXG4gICAgICBpZiAobm90TnVsbE9yVW5kZWZpbmVkKHFsRWRpdG9yKSAmJiBxbEVkaXRvciA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiBxbEVkaXRvciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcbiAgICAgICAgcWxFZGl0b3IuYmx1cigpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaXNXcml0aW5nVmFsdWUgPSBmYWxzZVxuXG4gIHByaXZhdGUgX3BvbGxDYWxjdWxhdGVkUm93SGVpZ2h0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuXG4gIHByaXZhdGUgX2NvbmZpZ1NldCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpXG4gIHB1YmxpYyBjb25maWdTZXQkID0gdGhpcy5fY29uZmlnU2V0LmFzT2JzZXJ2YWJsZSgpXG5cbiAgcHJpdmF0ZSBfc3R5bGVzU2V0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSlcbiAgcHJpdmF0ZSBfdGVtcGxhdGVTZXQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKVxuXG4gIHB1YmxpYyBpbml0aWFsaXplZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj5cblxuICBwdWJsaWMgY2hhcmFjdGVyQ291bnQkOiBPYnNlcnZhYmxlPG51bWJlcj5cblxuICBwcml2YXRlIF9jb25maWcgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRoZVNlYW1RdWlsbEVkaXRvckNvbmZpZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuICBwdWJsaWMgY29uZmlnJCA9IHRoaXMuX2NvbmZpZy5hc09ic2VydmFibGUoKVxuXG4gIHByaXZhdGUgX3NlbGVjdGVkTWVudGlvbnMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRoZVNlYW1RdWlsbE1lbnRpb25NZW51T3B0aW9uW10+KFtdKVxuICBwdWJsaWMgc2VsZWN0ZWRNZW50aW9ucyQgPSB0aGlzLl9zZWxlY3RlZE1lbnRpb25zLmFzT2JzZXJ2YWJsZSgpXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRIRVNFQU1fUVVJTExfRURJVE9SX0NPTkZJRykgcHJpdmF0ZSBfY3VzdG9tQ29uZmlnPzogVGhlU2VhbVF1aWxsRWRpdG9yQ29uZmlnXG4gICkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLl9jb25maWdTZXQuYXNPYnNlcnZhYmxlKCksXG4gICAgICB0aGlzLl9zdHlsZXNTZXQuYXNPYnNlcnZhYmxlKCksXG4gICAgICB0aGlzLl90ZW1wbGF0ZVNldC5hc09ic2VydmFibGUoKSxcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKHNldHMgPT4gc2V0cy5maW5kSW5kZXgocyA9PiAhcykgPT09IC0xKVxuICAgIClcblxuICAgIHRoaXMuY2hhcmFjdGVyQ291bnQkID0gdGhpcy5pbml0aWFsaXplZCQucGlwZShcbiAgICAgIGZpbHRlcihpID0+IGkpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZCh0aGlzLmZvcm1Db250cm9sKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1Db250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgc3RhcnRXaXRoKHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpLFxuICAgICAgICAgICAgbWFwKHYgPT4gdGhpcy5jaGFyYWN0ZXJDb3VudGVyRm4odiB8fCAnJyBhcyBzdHJpbmcsIHRoaXMuX2NvbmZpZy52YWx1ZT8uZm9ybWF0KSksXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9mKDApXG4gICAgICB9KVxuICAgIClcblxuICAgIHRoaXMuc2VsZWN0ZWRNZW50aW9ucyQucGlwZShcbiAgICAgIHRhcChtZW50aW9ucyA9PiB0aGlzLm1lbnRpb25zVXBkYXRlZC5lbWl0KG1lbnRpb25zKSlcbiAgICApLnN1YnNjcmliZSgpXG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBUT0RPOiB0ZXN0IHRoaXMgbW9yZVxuICAgIC8vIGlnbm9yZSBxdWlsbCBpbml0aWFsIHZhbHVlQ2hhbmdlIGV2ZW50LCB0byBrZWVwIGZ1bmN0aW9uYWxpdHkgaW4gbGluZSB3aXRoIG90aGVyIGlucHV0c1xuICAgIGxldCBpbml0aWFsRW1pdENvbXBsZXRlID0gZmFsc2VcbiAgICB0aGlzLl9jb25maWdTZXQucGlwZShcbiAgICAgIGZpbHRlcihzID0+IHMpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgIC8vIHNraXAoMSksXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHRhcCgoKSA9PiBpbml0aWFsRW1pdENvbXBsZXRlID0gdHJ1ZSlcbiAgICAgICkpXG4gICAgKS5zdWJzY3JpYmUoKVxuXG4gICAgdGhpcy5mb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5faXNXcml0aW5nVmFsdWUgJiYgaW5pdGlhbEVtaXRDb21wbGV0ZSksXG4gICAgICB0YXAodmFsdWUgPT4gdGhpcy52YWx1ZSA9IHZhbHVlKVxuICAgICkuc3Vic2NyaWJlKClcblxuICAgIHRoaXMuX3BvbGxDYWxjdWxhdGVkUm93SGVpZ2h0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICB0aGlzLl9zdHlsZXNTZXQubmV4dChmYWxzZSlcblxuICAgICAgICBjb25zdCBjYWxjdWxhdGVkUm93c0hlaWdodCA9IGAke3RoaXMucm93cyAqIDEuNX1yZW1gXG5cbiAgICAgICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZCh0aGlzLnJvd3MpICYmIG5vdE51bGxPclVuZGVmaW5lZCh0aGlzLl9xdWlsbEVkaXRvcikpIHtcbiAgICAgICAgICBjb25zdCBlZGl0b3JFbCA9IHRoaXMuX3F1aWxsRWRpdG9yLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcucWwtZWRpdG9yJylcblxuICAgICAgICAgIGlmIChub3ROdWxsT3JVbmRlZmluZWQoZWRpdG9yRWwpKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShlZGl0b3JFbCwgJ2hlaWdodCcsIGNhbGN1bGF0ZWRSb3dzSGVpZ2h0KVxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUoZWRpdG9yRWwsICdtaW4taGVpZ2h0JywgY2FsY3VsYXRlZFJvd3NIZWlnaHQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3R5bGVzU2V0Lm5leHQodHJ1ZSlcbiAgICAgIH0pXG4gICAgKS5zdWJzY3JpYmUoKVxuXG4gICAgdGhpcy5fYnVpbGRRdWlsbENvbmZpZygpXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuY2hhcmFjdGVyQ291bnRlclRwbCkpIHtcbiAgICAgIHRoaXMuY2hhcmFjdGVyQ291bnRlclRwbCA9IHRoaXMuZGVmYXVsdENoYXJhY3RlckNvdW50ZXJUcGwgfHwgbnVsbFxuICAgIH1cblxuICAgIHRoaXMuX3RlbXBsYXRlU2V0Lm5leHQodHJ1ZSlcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIGhhY2t5IHdheSB0byBlbnN1cmUgbWVudGlvbnMgbWVudSBnZXRzIGRlc3Ryb3llZCB3aGVuIGNvbXBvbmVudCBpcyBkZXN0cm95ZWRcbiAgICBjb25zdCBtZW50aW9uTW9kdWxlID0gdGhpcy5fcXVpbGxFZGl0b3I/LnF1aWxsRWRpdG9yLmdldE1vZHVsZSgnbWVudGlvbicpXG4gICAgY29uc3QgaGlkZU1lbnRpb25MaXN0ID0gbWVudGlvbk1vZHVsZT8uaGlkZU1lbnRpb25MaXN0XG4gICAgaWYgKGhpZGVNZW50aW9uTGlzdCAmJiB0eXBlb2YgaGlkZU1lbnRpb25MaXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBoaWRlTWVudGlvbkxpc3QuY2FsbChtZW50aW9uTW9kdWxlKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkUXVpbGxDb25maWcoKSB7XG4gICAgdGhpcy5fY29uZmlnU2V0Lm5leHQoZmFsc2UpXG5cbiAgICBjb25zdCBjb25maWc6IFRoZVNlYW1RdWlsbEVkaXRvckNvbmZpZyA9IHtcbiAgICAgIC4uLlRIRVNFQU1fUVVJTExfRURJVE9SX0NPTkZJR19ERUZBVUxUXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGlzYWJsZVJpY2hUZXh0KSB7XG4gICAgICBjb25maWcuZm9ybWF0ID0gJ3RleHQnXG4gICAgICBjb25maWcuZm9ybWF0cyA9IFtdXG4gICAgICBjb25maWcubW9kdWxlcyA9IHtcbiAgICAgICAgdG9vbGJhcjogZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25maWcuZm9ybWF0ID0gdGhpcy5fZ2V0Q29uZmlnT3JEZWZhdWx0KCdmb3JtYXQnKVxuICAgICAgY29uZmlnLmZvcm1hdHMgPSB0aGlzLl9nZXRDb25maWdPckRlZmF1bHQoJ2Zvcm1hdHMnKVxuICAgICAgY29uZmlnLm1vZHVsZXMgPSB7XG4gICAgICAgIC4uLnRoaXMuX2dldENvbmZpZ09yRGVmYXVsdCgnbW9kdWxlcycpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXNlTWVudGlvbnMpIHtcbiAgICAgIGNvbnN0IG1lbnRpb25Nb2R1bGVzOiBUaGVTZWFtUXVpbGxNb2R1bGVzID0ge1xuICAgICAgICAuLi5jb25maWcubW9kdWxlcyxcbiAgICAgICAgbWVudGlvbjoge1xuICAgICAgICAgIC4uLlRIRVNFQU1fUVVJTExfTUVOVElPTl9PUFRJT05TX0RFRkFVTFQsXG4gICAgICAgICAgcmVuZGVyTG9hZGluZzogKCkgPT4gdGhpcy5tZW50aW9uTGlzdExvYWRpbmdUZXh0LFxuICAgICAgICAgIHNvdXJjZTogYXN5bmMgKHNlYXJjaFRlcm06IHN0cmluZywgcmVuZGVyTGlzdDogKGxpc3Q6IGFueVtdLCBzZWFyY2hUZXJtOiBzdHJpbmcpID0+IHZvaWQsIG1lbnRpb25DaGFyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIC8vIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIG1lbnUgaXMgdHJpZ2dlcmVkLFxuICAgICAgICAgICAgLy8gc28gaXQgd2lsbCBhbHdheXMgaGF2ZSB0aGUgbGF0ZXN0IHZhbHVlIGZyb20gbWVudGlvbkl0ZW1zJFxuICAgICAgICAgICAgY29uc3QgbWVudGlvbnNBc3luYyA9IGF3YWl0IGxhc3RWYWx1ZUZyb20odGhpcy5tZW50aW9uSXRlbXMkLnBpcGUodGFrZSgxKSkpXG5cbiAgICAgICAgICAgIGlmIChub3ROdWxsT3JVbmRlZmluZWQobWVudGlvbnNBc3luYykpIHtcbiAgICAgICAgICAgICAgdGhpcy5tZW50aW9uUmVuZGVyTGlzdEZuKG1lbnRpb25zQXN5bmMsIHRoaXMubWVudGlvblNlYXJjaEZuLCB0aGlzLm1lbnRpb25MaXN0RW1wdHlJdGVtLCBzZWFyY2hUZXJtLCByZW5kZXJMaXN0LCBtZW50aW9uQ2hhcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmNvbmZpZy5tb2R1bGVzPy5tZW50aW9uLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbmZpZy5tb2R1bGVzID0gbWVudGlvbk1vZHVsZXNcbiAgICB9XG5cbiAgICBjb25maWcudGhlbWUgPSB0aGlzLl9nZXRDb25maWdPckRlZmF1bHQoJ3RoZW1lJylcbiAgICBjb25maWcuZGVidWcgPSB0aGlzLl9nZXRDb25maWdPckRlZmF1bHQoJ2RlYnVnJylcbiAgICBjb25maWcuY3VzdG9tVG9vbGJhclBvc2l0aW9uID0gdGhpcy5fZ2V0Q29uZmlnT3JEZWZhdWx0KCdjdXN0b21Ub29sYmFyUG9zaXRpb24nKVxuICAgIGNvbmZpZy5zYW5pdGl6ZSA9IHRoaXMuX2dldENvbmZpZ09yRGVmYXVsdCgnc2FuaXRpemUnKVxuICAgIGNvbmZpZy5zdHlsZXMgPSB0aGlzLl9nZXRDb25maWdPckRlZmF1bHQoJ3N0eWxlcycpXG4gICAgY29uZmlnLnN0cmljdCA9IHRoaXMuX2dldENvbmZpZ09yRGVmYXVsdCgnc3RyaWN0JylcbiAgICBjb25maWcuc2Nyb2xsaW5nQ29udGFpbmVyID0gdGhpcy5fZ2V0Q29uZmlnT3JEZWZhdWx0KCdzY3JvbGxpbmdDb250YWluZXInKVxuICAgIGNvbmZpZy5ib3VuZHMgPSB0aGlzLl9nZXRDb25maWdPckRlZmF1bHQoJ2JvdW5kcycpXG4gICAgY29uZmlnLmN1c3RvbU9wdGlvbnMgPSB0aGlzLl9nZXRDb25maWdPckRlZmF1bHQoJ2N1c3RvbU9wdGlvbnMnKVxuICAgIGNvbmZpZy5jdXN0b21Nb2R1bGVzID0gdGhpcy5fZ2V0Q29uZmlnT3JEZWZhdWx0KCdjdXN0b21Nb2R1bGVzJylcbiAgICBjb25maWcudHJhY2tDaGFuZ2VzID0gdGhpcy5fZ2V0Q29uZmlnT3JEZWZhdWx0KCd0cmFja0NoYW5nZXMnKVxuICAgIGNvbmZpZy5wcmVzZXJ2ZVdoaXRlc3BhY2UgPSB0aGlzLl9nZXRDb25maWdPckRlZmF1bHQoJ3ByZXNlcnZlV2hpdGVzcGFjZScpXG4gICAgY29uZmlnLmNsYXNzZXMgPSB0aGlzLl9nZXRDb25maWdPckRlZmF1bHQoJ2NsYXNzZXMnKVxuICAgIGNvbmZpZy50cmltT25WYWxpZGF0aW9uID0gdGhpcy5fZ2V0Q29uZmlnT3JEZWZhdWx0KCd0cmltT25WYWxpZGF0aW9uJylcbiAgICBjb25maWcubGlua1BsYWNlaG9sZGVyID0gdGhpcy5fZ2V0Q29uZmlnT3JEZWZhdWx0KCdsaW5rUGxhY2Vob2xkZXInKVxuICAgIGNvbmZpZy5jb21wYXJlVmFsdWVzID0gdGhpcy5fZ2V0Q29uZmlnT3JEZWZhdWx0KCdjb21wYXJlVmFsdWVzJylcbiAgICBjb25maWcuZmlsdGVyTnVsbCA9IHRoaXMuX2dldENvbmZpZ09yRGVmYXVsdCgnZmlsdGVyTnVsbCcpXG4gICAgY29uZmlnLmRlYm91bmNlVGltZSA9IHRoaXMuX2dldENvbmZpZ09yRGVmYXVsdCgnZGVib3VuY2VUaW1lJylcblxuICAgIHRoaXMuX2NvbmZpZy5uZXh0KGNvbmZpZylcblxuICAgIC8vIHNldFRpbWVvdXQgYmMgbmd4LXF1aWxsIGxpYnJhcnkgZG9lc24ndCBsaXN0ZW4gZm9yIGlucHV0IGNoYW5nZXMsXG4gICAgLy8gc28gd2UgbXVzdCBkZXN0cm95IGFuZCBjcmVhdGUgdGhlIGNvbXBvbmVudCBlYWNoIHRpbWUgY29uZmlnIGlzIHVwZGF0ZWRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2NvbmZpZ1NldC5uZXh0KHRydWUpXG4gICAgfSwgMClcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbmZpZ09yRGVmYXVsdDxLIGV4dGVuZHMga2V5b2YgVGhlU2VhbVF1aWxsRWRpdG9yQ29uZmlnPihwcm9wOiBLKTogVGhlU2VhbVF1aWxsRWRpdG9yQ29uZmlnW0tdIHtcbiAgICBpZiAodGhpcy5fY3VzdG9tQ29uZmlnICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9jdXN0b21Db25maWcsIHByb3ApKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY3VzdG9tQ29uZmlnW3Byb3BdXG4gICAgfVxuICAgIHJldHVybiBUSEVTRUFNX1FVSUxMX0VESVRPUl9DT05GSUdfREVGQVVMVFtwcm9wXVxuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlUXVpbGxDb25maWcoKSB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZ1NldC52YWx1ZSkge1xuICAgICAgdGhpcy5fYnVpbGRRdWlsbENvbmZpZygpXG4gICAgfVxuICB9XG5cbiAgLy8gTm90IHVzYWJsZSwgYmMgY29uZmlnIGhhcyB0byBiZSBzZXQgaW1tZWRpYXRlbHksIHBvdGVudGlhbGx5IGJlZm9yZSBtZW50aW9ucyBwb3B1bGF0ZS5cbiAgLy8gVG8gc2V0IGN1c3RvbURhdGFBdHRyaWJ1dGVzLCBwcm92aWRlIGEgY3VzdG9tIGNvbmZpZy5cbiAgLy8gcHJpdmF0ZSBfZ2V0Q3VzdG9tRGF0YUF0dHJpYnV0ZXMobWVudGlvbnM6IFRoZVNlYW1RdWlsbE1lbnRpb25NZW51T3B0aW9uW10pOiBzdHJpbmdbXSB7XG4gIC8vICAgcmV0dXJuIG1lbnRpb25zLnJlZHVjZSgoYWNjLCBtZW50aW9uKSA9PiB7XG4gIC8vICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMobWVudGlvbilcblxuICAvLyAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gIC8vICAgICAgIGlmIChhY2MuZmluZEluZGV4KGEgPT4gYSA9PT0ga2V5KSA9PT0gLTEpIHtcbiAgLy8gICAgICAgICBhY2MucHVzaChrZXkpXG4gIC8vICAgICAgIH1cbiAgLy8gICAgIH0pXG5cbiAgLy8gICAgIHJldHVybiBhY2NcbiAgLy8gICB9LCA8c3RyaW5nW10+W10gc2F0aXNmaWVzIHN0cmluZ1tdKVxuICAvLyB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZVxuICB9XG4gIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCkge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWVcblxuICAgIGlmICh0aGlzLm9uQ2hhbmdlKSB7IHRoaXMub25DaGFuZ2UodmFsdWUpIH1cbiAgICBpZiAodGhpcy5vblRvdWNoZWQpIHsgdGhpcy5vblRvdWNoZWQoKSB9XG4gIH1cbiAgcHJpdmF0ZSBfdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGxcblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9pc1dyaXRpbmdWYWx1ZSA9IHRydWVcblxuICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWUpXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG5cbiAgICB0aGlzLl9pc1dyaXRpbmdWYWx1ZSA9IGZhbHNlXG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm5cbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuXG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlYWRPbmx5ID0gaXNEaXNhYmxlZFxuICB9XG5cbiAgX29uRWRpdG9yQ3JlYXRlZChldmVudDogYW55KSB7XG4gICAgdGhpcy5xdWlsbEVkaXRvckNyZWF0ZWQuZW1pdChldmVudClcbiAgfVxuXG4gIF9vbkVkaXRvckNoYW5nZWQoZXZlbnQ6IEVkaXRvckNoYW5nZUNvbnRlbnQgfCBFZGl0b3JDaGFuZ2VTZWxlY3Rpb24pIHtcbiAgICB0aGlzLnF1aWxsRWRpdG9yQ2hhbmdlZC5lbWl0KGV2ZW50KVxuICB9XG5cbiAgX29uQ29udGVudENoYW5nZWQoZXZlbnQ6IENvbnRlbnRDaGFuZ2UpIHtcbiAgICB0aGlzLnF1aWxsQ29udGVudENoYW5nZWQuZW1pdChldmVudClcblxuICAgIHRoaXMuX3VwZGF0ZU1lbnRpb25zRnJvbURlbHRhKGV2ZW50LmNvbnRlbnQpXG4gIH1cblxuICBfb25TZWxlY3Rpb25DaGFuZ2VkKGV2ZW50OiBTZWxlY3Rpb25DaGFuZ2UpIHtcbiAgICB0aGlzLnF1aWxsU2VsZWN0aW9uQ2hhbmdlZC5lbWl0KGV2ZW50KVxuICB9XG5cbiAgX29uRm9jdXMoZXZlbnQ6IEZvY3VzKSB7XG4gICAgdGhpcy5xdWlsbEZvY3VzLmVtaXQoZXZlbnQpXG4gIH1cblxuICBfb25CbHVyKGV2ZW50OiBCbHVyKSB7XG4gICAgdGhpcy5xdWlsbEJsdXIuZW1pdChldmVudClcblxuICAgIGlmICh0aGlzLm9uVG91Y2hlZCkge1xuICAgICAgdGhpcy5vblRvdWNoZWQoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYWNreSB3YXkgdG8gdHJhY2sgbWVudGlvbiBpbnNlcnRzL2RlbGV0ZXNcbiAgICovXG4gIHByaXZhdGUgX3VwZGF0ZU1lbnRpb25zRnJvbURlbHRhKGNvbnRlbnQ6IERlbHRhKSB7XG4gICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZChjb250ZW50Lm9wcykpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnRNZW50aW9uSWRzID0gY29udGVudC5vcHMubWFwKG8gPT4gby5pbnNlcnQ/Lm1lbnRpb24/LmlkKS5maWx0ZXIobm90TnVsbE9yVW5kZWZpbmVkKVxuICAgICAgY29uc3Qgc2VsZWN0ZWRNZW50aW9ucyA9IFsgLi4udGhpcy5fc2VsZWN0ZWRNZW50aW9ucy52YWx1ZSBdXG4gICAgICBjb25zdCBtZW50aW9uT3B0aW9ucyA9IFsgLi4udGhpcy5fbWVudGlvbkl0ZW1zLnZhbHVlIHx8IFtdIF1cblxuICAgICAgY29uc3QgbmV3TWVudGlvbnM6IFRoZVNlYW1RdWlsbE1lbnRpb25NZW51T3B0aW9uW10gPSBjb250ZW50TWVudGlvbklkcy5yZWR1Y2UoKGFjYywgbWVudGlvbklkKSA9PiB7XG4gICAgICAgIGNvbnN0IGluc2VydE1lbnRpb24gPSBtZW50aW9uT3B0aW9ucy5maW5kKG0gPT4gaXNNZW50aW9uTWVudU9wdGlvbihtKSAmJiBtLmlkID09PSBtZW50aW9uSWQpXG5cbiAgICAgICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZChpbnNlcnRNZW50aW9uKSkge1xuICAgICAgICAgIGFjYy5wdXNoKGluc2VydE1lbnRpb24pXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdNZW50aW9uIGFkZGl0aW9uIGZhaWxlZCEgU2VsZWN0ZWQgbWVudGlvbiBvcHRpb24gbm90IGZvdW5kOicsIG1lbnRpb25JZClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2NcbiAgICAgIH0sIDxUaGVTZWFtUXVpbGxNZW50aW9uTWVudU9wdGlvbltdPltdKVxuXG4gICAgICBsZXQgZW1pdFVwZGF0ZSA9IGZhbHNlXG4gICAgICBpZiAoc2VsZWN0ZWRNZW50aW9ucy5sZW5ndGggIT09IG5ld01lbnRpb25zLmxlbmd0aCkge1xuICAgICAgICAvLyBpZiB0aGUgbGVuZ3RoIGhhcyBjaGFuZ2VkLCB3ZSBrbm93IGFuIHVwZGF0ZSBvY2N1cnJlZFxuICAgICAgICBlbWl0VXBkYXRlID0gdHJ1ZVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSwgdGVzdCBpZHMgZm9yIG9sZCBhbmQgbmV3IGl0ZW1zIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGVtaXQgYSBjaGFuZ2VcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRNZW50aW9uSWRzID0gdGhpcy5fc2VsZWN0ZWRNZW50aW9ucy52YWx1ZS5tYXAobSA9PiBtLmlkKVxuICAgICAgICBjb25zdCBuZXdNZW50aW9uSWRzID0gbmV3TWVudGlvbnMubWFwKG0gPT4gbS5pZClcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgc2VsZWN0ZWRNZW50aW9uSWRzLmZpbmRJbmRleChtID0+ICFuZXdNZW50aW9uSWRzLmluY2x1ZGVzKG0pKSAhPT0gLTEgfHxcbiAgICAgICAgICBuZXdNZW50aW9uSWRzLmZpbmRJbmRleChtID0+ICFzZWxlY3RlZE1lbnRpb25JZHMuaW5jbHVkZXMobSkpICE9PSAtMVxuICAgICAgICApIHtcbiAgICAgICAgICBlbWl0VXBkYXRlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChlbWl0VXBkYXRlKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkTWVudGlvbnMubmV4dChuZXdNZW50aW9ucylcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJlZGl0b3JcIiAqbmdJZj1cImNvbmZpZ1NldCQgfCBhc3luY1wiIFtjbGFzcy5pbml0aWFsaXppbmddPVwiIShpbml0aWFsaXplZCQgfCBhc3luYylcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbmZpZyQgfCBhc3luYyBhcyBjb25maWdcIj5cbiAgICA8cXVpbGwtZWRpdG9yXG4gICAgICAjcXVpbGxFZGl0b3JcbiAgICAgIHNlYW1JbnB1dFxuICAgICAgW2NsYXNzLmRpc2FibGVkXT1cInJlYWRPbmx5XCJcbiAgICAgIFthdHRyLmRpc2FibGVkXT1cInJlYWRPbmx5XCJcbiAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgW3JlYWRPbmx5XT1cInJlYWRPbmx5XCJcbiAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICBbbWluTGVuZ3RoXT1cIm1pbkxlbmd0aFwiXG4gICAgICBbbWF4TGVuZ3RoXT1cIm1heExlbmd0aFwiXG4gICAgICBbZm9ybWF0XT1cImNvbmZpZy5mb3JtYXRcIlxuICAgICAgW3RoZW1lXT1cImNvbmZpZy50aGVtZVwiXG4gICAgICBbbW9kdWxlc109XCJjb25maWcubW9kdWxlc1wiXG4gICAgICBbZGVidWddPVwiY29uZmlnLmRlYnVnXCJcbiAgICAgIFtmb3JtYXRzXT1cImNvbmZpZy5mb3JtYXRzXCJcbiAgICAgIFtjdXN0b21Ub29sYmFyUG9zaXRpb25dPVwiY29uZmlnLmN1c3RvbVRvb2xiYXJQb3NpdGlvblwiXG4gICAgICBbc2FuaXRpemVdPVwiY29uZmlnLnNhbml0aXplXCJcbiAgICAgIFtzdHlsZXNdPVwiY29uZmlnLnN0eWxlc1wiXG4gICAgICBbc3RyaWN0XT1cImNvbmZpZy5zdHJpY3RcIlxuICAgICAgW3Njcm9sbGluZ0NvbnRhaW5lcl09XCJjb25maWcuc2Nyb2xsaW5nQ29udGFpbmVyXCJcbiAgICAgIFtib3VuZHNdPVwiY29uZmlnLmJvdW5kc1wiXG4gICAgICBbY3VzdG9tT3B0aW9uc109XCJjb25maWcuY3VzdG9tT3B0aW9uc1wiXG4gICAgICBbY3VzdG9tTW9kdWxlc109XCJjb25maWcuY3VzdG9tTW9kdWxlc1wiXG4gICAgICBbdHJhY2tDaGFuZ2VzXT1cImNvbmZpZy50cmFja0NoYW5nZXNcIlxuICAgICAgW3ByZXNlcnZlV2hpdGVzcGFjZV09XCJjb25maWcucHJlc2VydmVXaGl0ZXNwYWNlXCJcbiAgICAgIFtjbGFzc2VzXT1cImNvbmZpZy5jbGFzc2VzXCJcbiAgICAgIFt0cmltT25WYWxpZGF0aW9uXT1cImNvbmZpZy50cmltT25WYWxpZGF0aW9uXCJcbiAgICAgIFtsaW5rUGxhY2Vob2xkZXJdPVwiY29uZmlnLmxpbmtQbGFjZWhvbGRlclwiXG4gICAgICBbY29tcGFyZVZhbHVlc109XCJjb25maWcuY29tcGFyZVZhbHVlc1wiXG4gICAgICBbZmlsdGVyTnVsbF09XCJjb25maWcuZmlsdGVyTnVsbFwiXG4gICAgICBbZGVib3VuY2VUaW1lXT1cImNvbmZpZy5kZWJvdW5jZVRpbWVcIlxuICAgICAgW2NsYXNzLmNhbi1yZXNpemVdPVwicmVzaXphYmxlXCJcbiAgICAgIChvbkVkaXRvckNyZWF0ZWQpPVwiX29uRWRpdG9yQ3JlYXRlZCgkZXZlbnQpXCJcbiAgICAgIChvbkVkaXRvckNoYW5nZWQpPVwiX29uRWRpdG9yQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgIChvbkNvbnRlbnRDaGFuZ2VkKT1cIl9vbkNvbnRlbnRDaGFuZ2VkKCRldmVudClcIlxuICAgICAgKG9uU2VsZWN0aW9uQ2hhbmdlZCk9XCJfb25TZWxlY3Rpb25DaGFuZ2VkKCRldmVudClcIlxuICAgICAgKG9uRm9jdXMpPVwiX29uRm9jdXMoJGV2ZW50KVwiXG4gICAgICAob25CbHVyKT1cIl9vbkJsdXIoJGV2ZW50KVwiPjwvcXVpbGwtZWRpdG9yPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNwbGF5Q2hhcmFjdGVyQ291bnRlclwiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjaGFyYWN0ZXJDb3VudGVyVHBsXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjaGFyYWN0ZXJDb3VudCQgfCBhc3luYywgbWluTGVuZ3RoOiBtaW5MZW5ndGgsIG1heExlbmd0aDogbWF4TGVuZ3RoLCBjaGFyYWN0ZXJDb3VudDogY2hhcmFjdGVyQ291bnQkIHwgYXN5bmMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2NoYXJhY3RlckNvdW50ZXIgbGV0LWltcGxpY2l0IGxldC1taW5MZW5ndGg9XCJtaW5MZW5ndGhcIiBsZXQtbWF4TGVuZ3RoPVwibWF4TGVuZ3RoXCIgbGV0LWNoYXJhY3RlckNvdW50PVwiY2hhcmFjdGVyQ291bnRcIj5cbiAgPGRpdiBjbGFzcz1cInNtYWxsIHRleHQtYmxhY2stNTAgdGV4dC1yaWdodFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjaGFyYWN0ZXJDb3VudCB8fCBjaGFyYWN0ZXJDb3VudCA9PT0gMFwiPlxuICAgICAgQ2hhcmFjdGVyIENvdW50OlxuICAgICAgPHNwYW4gW2NsYXNzLnRleHQtZGFuZ2VyXT1cImNoYXJhY3RlckNvdW50ICYmICgobWF4TGVuZ3RoICYmIGNoYXJhY3RlckNvdW50ID4gbWF4TGVuZ3RoKSB8fCAobWluTGVuZ3RoICYmIGNoYXJhY3RlckNvdW50IDwgbWluTGVuZ3RoKSlcIj5cbiAgICAgICAge3sgY2hhcmFjdGVyQ291bnQgfCBudW1iZXIgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtYXhMZW5ndGhcIj5cbiAgICAgICAgLyB7eyBtYXhMZW5ndGggfX1cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHNwYW4gKm5nSWY9XCJtaW5MZW5ndGhcIiBjbGFzcz1cImZvbnQtaXRhbGljXCI+XG4gICAgICAgIChtaW5pbXVtIHt7IG1pbkxlbmd0aCB9fSBleHBlY3RlZClcbiAgICAgIDwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -1,7 +1,7 @@
1
1
  import { __awaiter } from 'tslib';
2
2
  import { coerceBooleanProperty } from '@angular/cdk/coercion';
3
3
  import * as i0 from '@angular/core';
4
- import { InjectionToken, forwardRef, EventEmitter, Component, Optional, Inject, Input, Output, ViewChild, NgModule } from '@angular/core';
4
+ import { InjectionToken, forwardRef, EventEmitter, Component, Optional, Inject, Input, Output, ViewChild, HostListener, NgModule } from '@angular/core';
5
5
  import * as i2 from '@angular/forms';
6
6
  import { NG_VALUE_ACCESSOR, FormControl, ReactiveFormsModule } from '@angular/forms';
7
7
  import 'quill-mention';
@@ -372,6 +372,17 @@ class RichTextComponent {
372
372
  this._pollCalculatedRowHeight.next();
373
373
  }, 0);
374
374
  }
375
+ _handleKeydown(event) {
376
+ var _a, _b;
377
+ if (event.code === 'Escape') {
378
+ const qlEditor = (_b = (_a = this._quillEditor) === null || _a === void 0 ? void 0 : _a.editorElem) === null || _b === void 0 ? void 0 : _b.querySelector('.ql-editor');
379
+ if (notNullOrUndefined(qlEditor) && qlEditor === document.activeElement && qlEditor instanceof HTMLElement) {
380
+ event.preventDefault();
381
+ event.stopImmediatePropagation();
382
+ qlEditor.blur();
383
+ }
384
+ }
385
+ }
375
386
  constructor(_renderer, _customConfig) {
376
387
  this._renderer = _renderer;
377
388
  this._customConfig = _customConfig;
@@ -450,6 +461,15 @@ class RichTextComponent {
450
461
  }
451
462
  this._templateSet.next(true);
452
463
  }
464
+ ngOnDestroy() {
465
+ var _a;
466
+ // hacky way to ensure mentions menu gets destroyed when component is destroyed
467
+ const mentionModule = (_a = this._quillEditor) === null || _a === void 0 ? void 0 : _a.quillEditor.getModule('mention');
468
+ const hideMentionList = mentionModule === null || mentionModule === void 0 ? void 0 : mentionModule.hideMentionList;
469
+ if (hideMentionList && typeof hideMentionList === 'function') {
470
+ hideMentionList.call(mentionModule);
471
+ }
472
+ }
453
473
  _buildQuillConfig() {
454
474
  var _a;
455
475
  this._configSet.next(false);
@@ -614,7 +634,7 @@ class RichTextComponent {
614
634
  }
615
635
  }
616
636
  RichTextComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: RichTextComponent, deps: [{ token: i0.Renderer2 }, { token: THESEAM_QUILL_EDITOR_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component });
617
- RichTextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.7", type: RichTextComponent, selector: "seam-rich-text", inputs: { val: ["value", "val"], required: "required", placeholder: "placeholder", rows: "rows", resizable: "resizable", disableRichText: "disableRichText", displayCharacterCounter: "displayCharacterCounter", minLength: "minLength", maxLength: "maxLength", characterCounterTpl: "characterCounterTpl", characterCounterFn: "characterCounterFn", useMentions: "useMentions", mentionItems: "mentionItems", mentionSearchFn: "mentionSearchFn", mentionRenderListFn: "mentionRenderListFn", mentionListLoadingText: "mentionListLoadingText", mentionListEmptyText: "mentionListEmptyText" }, outputs: { quillEditorCreated: "quillEditorCreated", quillEditorChanged: "quillEditorChanged", quillContentChanged: "quillContentChanged", quillSelectionChanged: "quillSelectionChanged", quillFocus: "quillFocus", quillBlur: "quillBlur", mentionsUpdated: "mentionsUpdated" }, providers: [
637
+ RichTextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.7", type: RichTextComponent, selector: "seam-rich-text", inputs: { val: ["value", "val"], required: "required", placeholder: "placeholder", rows: "rows", resizable: "resizable", disableRichText: "disableRichText", displayCharacterCounter: "displayCharacterCounter", minLength: "minLength", maxLength: "maxLength", characterCounterTpl: "characterCounterTpl", characterCounterFn: "characterCounterFn", useMentions: "useMentions", mentionItems: "mentionItems", mentionSearchFn: "mentionSearchFn", mentionRenderListFn: "mentionRenderListFn", mentionListLoadingText: "mentionListLoadingText", mentionListEmptyText: "mentionListEmptyText" }, outputs: { quillEditorCreated: "quillEditorCreated", quillEditorChanged: "quillEditorChanged", quillContentChanged: "quillContentChanged", quillSelectionChanged: "quillSelectionChanged", quillFocus: "quillFocus", quillBlur: "quillBlur", mentionsUpdated: "mentionsUpdated" }, host: { listeners: { "keydown": "_handleKeydown($event)" } }, providers: [
618
638
  RICH_TEXT_VALUE_ACCESSOR
619
639
  ], viewQueries: [{ propertyName: "quillEditor", first: true, predicate: ["quillEditor"], descendants: true }, { propertyName: "defaultCharacterCounterTpl", first: true, predicate: ["characterCounter"], descendants: true }], ngImport: i0, template: "<div class=\"editor\" *ngIf=\"configSet$ | async\" [class.initializing]=\"!(initialized$ | async)\">\n <ng-container *ngIf=\"config$ | async as config\">\n <quill-editor\n #quillEditor\n seamInput\n [class.disabled]=\"readOnly\"\n [attr.disabled]=\"readOnly\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [readOnly]=\"readOnly\"\n [required]=\"required\"\n [minLength]=\"minLength\"\n [maxLength]=\"maxLength\"\n [format]=\"config.format\"\n [theme]=\"config.theme\"\n [modules]=\"config.modules\"\n [debug]=\"config.debug\"\n [formats]=\"config.formats\"\n [customToolbarPosition]=\"config.customToolbarPosition\"\n [sanitize]=\"config.sanitize\"\n [styles]=\"config.styles\"\n [strict]=\"config.strict\"\n [scrollingContainer]=\"config.scrollingContainer\"\n [bounds]=\"config.bounds\"\n [customOptions]=\"config.customOptions\"\n [customModules]=\"config.customModules\"\n [trackChanges]=\"config.trackChanges\"\n [preserveWhitespace]=\"config.preserveWhitespace\"\n [classes]=\"config.classes\"\n [trimOnValidation]=\"config.trimOnValidation\"\n [linkPlaceholder]=\"config.linkPlaceholder\"\n [compareValues]=\"config.compareValues\"\n [filterNull]=\"config.filterNull\"\n [debounceTime]=\"config.debounceTime\"\n [class.can-resize]=\"resizable\"\n (onEditorCreated)=\"_onEditorCreated($event)\"\n (onEditorChanged)=\"_onEditorChanged($event)\"\n (onContentChanged)=\"_onContentChanged($event)\"\n (onSelectionChanged)=\"_onSelectionChanged($event)\"\n (onFocus)=\"_onFocus($event)\"\n (onBlur)=\"_onBlur($event)\"></quill-editor>\n <ng-container *ngIf=\"displayCharacterCounter\">\n <ng-container\n [ngTemplateOutlet]=\"characterCounterTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: characterCount$ | async, minLength: minLength, maxLength: maxLength, characterCount: characterCount$ | async }\"></ng-container>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #characterCounter let-implicit let-minLength=\"minLength\" let-maxLength=\"maxLength\" let-characterCount=\"characterCount\">\n <div class=\"small text-black-50 text-right\">\n <ng-container *ngIf=\"characterCount || characterCount === 0\">\n Character Count:\n <span [class.text-danger]=\"characterCount && ((maxLength && characterCount > maxLength) || (minLength && characterCount < minLength))\">\n {{ characterCount | number }}\n </span>\n <ng-container *ngIf=\"maxLength\">\n / {{ maxLength }}\n </ng-container>\n <span *ngIf=\"minLength\" class=\"font-italic\">\n (minimum {{ minLength }} expected)\n </span>\n </ng-container>\n </div>\n</ng-template>\n", styles: [":host .editor{position:relative}:host .editor.initializing:before{content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;background:#f8f9fa;z-index:1}:host quill-editor.can-resize ::ng-deep .ql-editor{overflow:auto;resize:vertical}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i3.QuillEditorComponent, selector: "quill-editor" }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }] });
620
640
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: RichTextComponent, decorators: [{
@@ -684,6 +704,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImpor
684
704
  }], defaultCharacterCounterTpl: [{
685
705
  type: ViewChild,
686
706
  args: ['characterCounter']
707
+ }], _handleKeydown: [{
708
+ type: HostListener,
709
+ args: ['keydown', ['$event']]
687
710
  }] } });
688
711
 
689
712
  const THESEAM_QUILL_FORMATS = [
@@ -1 +1 @@
1
- {"version":3,"file":"theseam-ui-common-rich-text.mjs","sources":["../../../projects/ui-common/rich-text/utils/utils.ts","../../../projects/ui-common/rich-text/rich-text/rich-text.component.ts","../../../projects/ui-common/rich-text/rich-text/rich-text.component.html","../../../projects/ui-common/rich-text/utils/models.ts","../../../projects/ui-common/rich-text/rich-text.module.ts","../../../projects/ui-common/rich-text/theseam-ui-common-rich-text.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\"\r\nimport { QuillToolbarConfig } from \"ngx-quill\"\r\nimport { TheSeamQuillModules, TheSeamQuillStyleFormat, TheSeamQuillEditorConfig, TheSeamQuillMentionMenuOption, TheSeamQuillInputFormat, TheSeamQuillMentionOptions, TheSeamQuillMentionSourceFn, TheSeamQuillMentionSearchFn, TheSeamCharacterCounterFn, TheSeamQuillMentionMenuItem } from \"./models\"\r\nimport { isNullOrUndefined, notNullOrUndefined, notNullOrUndefinedOrEmpty } from \"@theseam/ui-common/utils\"\r\n\r\nexport const HTML_ENTITY_REGEX = /<[^>]+>/gm\r\n\r\nexport const THESEAM_QUILL_TOOLBAR_OPTIONS_DEFAULT: QuillToolbarConfig = [\r\n ['bold', 'italic', 'underline', 'strike'],\r\n [{ header: [0, 1, 2, 3, 4, 5] }],\r\n [{ list: 'ordered' }, { list: 'bullet' }],\r\n [{ align: [] }],\r\n ['link'],\r\n ['clean'],\r\n]\r\n\r\nexport const THESEAM_QUILL_MENTION_OPTIONS_DEFAULT: Partial<TheSeamQuillMentionOptions> = {\r\n spaceAfterInsert: false,\r\n positioningStrategy: 'fixed',\r\n dataAttributes: [ 'type' ]\r\n}\r\n\r\nexport const THESEAM_QUILL_MODULES_DEFAULT: TheSeamQuillModules = {\r\n toolbar: THESEAM_QUILL_TOOLBAR_OPTIONS_DEFAULT\r\n}\r\n\r\nexport const THESEAM_QUILL_FORMATS_DEFAULT: TheSeamQuillStyleFormat[] = [\r\n 'align',\r\n 'bold',\r\n 'header',\r\n 'indent',\r\n 'italic',\r\n 'link',\r\n 'list',\r\n 'size',\r\n 'strike',\r\n 'underline',\r\n 'mention'\r\n]\r\n\r\nexport const THESEAM_QUILL_EDITOR_CONFIG_DEFAULT: TheSeamQuillEditorConfig = {\r\n format: 'html',\r\n modules: THESEAM_QUILL_MODULES_DEFAULT,\r\n formats: THESEAM_QUILL_FORMATS_DEFAULT,\r\n linkPlaceholder: 'https://google.com',\r\n customToolbarPosition: 'top',\r\n sanitize: false,\r\n strict: true,\r\n customOptions: [],\r\n customModules: [],\r\n preserveWhitespace: false,\r\n trimOnValidation: false,\r\n compareValues: false,\r\n filterNull: false\r\n}\r\n\r\nexport const THESEAM_QUILL_EDITOR_CONFIG = new InjectionToken<TheSeamQuillEditorConfig>('TheSeamQuillEditorConfig')\r\n\r\nexport const defaultHtmlCharacterCounterFn: TheSeamCharacterCounterFn = (value: string, format: TheSeamQuillInputFormat | undefined): number => {\r\n if (format === 'html') {\r\n return value.replace(HTML_ENTITY_REGEX, ' ').replace(/\\s\\s+/g, ' ').trim().length\r\n }\r\n else if (format === 'text') {\r\n return value.replace(/\\s\\s+/g, ' ').trim().length\r\n }\r\n else {\r\n console.warn(`Format ${format} not supported!`)\r\n return 0\r\n }\r\n}\r\n\r\nexport function isMentionMenuOption(value: TheSeamQuillMentionMenuItem | undefined): value is TheSeamQuillMentionMenuOption {\r\n if (isNullOrUndefined(value) || typeof value !== 'object') {\r\n return false\r\n }\r\n\r\n return Object.prototype.hasOwnProperty.call(value, 'id')\r\n}\r\n\r\nexport const defaultMentionSearchFn: TheSeamQuillMentionSearchFn = (source: TheSeamQuillMentionMenuItem[], textAfter: string, mentionChar: string) => {\r\n return source.filter(u => {\r\n if (!isMentionMenuOption(u) || u.searchIgnore === true) {\r\n return true\r\n }\r\n\r\n return u.value.toLowerCase().includes(textAfter.toLowerCase())\r\n })\r\n}\r\n\r\nexport const defaultMentionRenderListFn: TheSeamQuillMentionSourceFn = (source: TheSeamQuillMentionMenuItem[], searchFn: TheSeamQuillMentionSearchFn, emptyListItem: TheSeamQuillMentionMenuItem | undefined, textAfter: string, renderList: (list: any[], searchTerm: string) => any, mentionChar: string) => {\r\n let list = searchFn(source, textAfter, mentionChar)\r\n\r\n if (list.length === 0 && notNullOrUndefined(emptyListItem)) {\r\n list.push(emptyListItem)\r\n }\r\n else {\r\n let reduceIdx = 0\r\n list = list.reduce((acc, mention) => {\r\n const previousMenuItem = acc[reduceIdx - 1]\r\n const previousMenuItemGroupName = isMentionMenuOption(previousMenuItem) ? previousMenuItem.groupName : undefined\r\n if (isMentionMenuOption(mention)\r\n && notNullOrUndefinedOrEmpty(mention.groupName)\r\n && mention.groupName !== previousMenuItemGroupName\r\n ) {\r\n acc.push({\r\n value: mention.groupName,\r\n disabled: true,\r\n type: 'groupName'\r\n })\r\n\r\n reduceIdx++\r\n }\r\n\r\n if (!isMentionMenuOption(mention)) {\r\n mention.disabled = true\r\n }\r\n\r\n acc.push(mention)\r\n reduceIdx++\r\n\r\n return acc\r\n }, <TheSeamQuillMentionMenuItem[]>[] satisfies TheSeamQuillMentionMenuItem[])\r\n }\r\n\r\n renderList(list, textAfter)\r\n}\r\n\r\n// Keeping this as an example for a custom menu item.\r\n// There doesn't appear to be a better way of passing in a custom template.\r\n// export const defaultMentionRenderItem = (item: TheSeamQuillMentionListItem) => {\r\n // if (item.type === 'groupName') {\r\n // const text = document.createElement('div')\r\n // text.setAttribute('class', 'small text-black-50')\r\n // text.innerText = item.value\r\n\r\n // return text.outerHTML\r\n // }\r\n // else if (item.type === 'divider') {\r\n // const div = document.createElement('hr')\r\n // div.setAttribute('class', 'my-2')\r\n // return div.outerHTML\r\n // }\r\n // else {\r\n // return item.value\r\n // }\r\n// }\r\n","import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { AfterViewInit, Component, EventEmitter, Inject, Input, OnInit, Optional, Output, Provider, Renderer2, TemplateRef, ViewChild, forwardRef } from '@angular/core';\nimport { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { Blur, ContentChange, EditorChangeContent, EditorChangeSelection, Focus, QuillEditorComponent, SelectionChange } from 'ngx-quill';\nimport { Delta } from 'quill';\nimport 'quill-mention';\nimport { BehaviorSubject, Observable, Subject, combineLatest, filter, lastValueFrom, map, of, shareReplay, startWith, switchMap, take, tap } from 'rxjs';\n\nimport { isNullOrUndefined, notNullOrUndefined } from '@theseam/ui-common/utils';\nimport { TheSeamCharacterCounterFn, TheSeamQuillEditorConfig, TheSeamQuillMentionMenuItem, TheSeamQuillMentionMenuOption, TheSeamQuillMentionSearchFn, TheSeamQuillMentionSourceFn, TheSeamQuillModules } from '../utils/models';\nimport { THESEAM_QUILL_EDITOR_CONFIG, THESEAM_QUILL_EDITOR_CONFIG_DEFAULT, THESEAM_QUILL_MENTION_OPTIONS_DEFAULT, defaultHtmlCharacterCounterFn, defaultMentionRenderListFn, defaultMentionSearchFn, isMentionMenuOption } from '../utils/utils';\n\nexport const RICH_TEXT_VALUE_ACCESSOR: Provider = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => RichTextComponent),\n multi: true\n}\n\n@Component({\n selector: 'seam-rich-text',\n templateUrl: './rich-text.component.html',\n styleUrls: ['./rich-text.component.scss'],\n providers: [\n RICH_TEXT_VALUE_ACCESSOR\n ]\n})\nexport class RichTextComponent implements OnInit, AfterViewInit, ControlValueAccessor {\n\n onChange: any\n onTouched: any\n\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input('value') val: string | undefined\n\n formControl = new FormControl<string | null>(null)\n\n @Input()\n get required(): boolean {\n return this._required\n }\n set required(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._required = coerceBooleanProperty(value)\n }\n }\n private _required = false\n\n /** @default '' (empty string) */\n @Input()\n get placeholder(): string {\n return this._placeholder\n }\n set placeholder(value: string | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._placeholder = value\n }\n }\n private _placeholder = ''\n\n /**\n * Initial rows visible in text area, set using `height` and `minHeight`.\n *\n * NOTE: Resizable editors will not be able to size below the height calculated from this value.\n *\n * @default 5\n */\n @Input()\n get rows(): number {\n return this._rows\n }\n set rows(value: number | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._rows = value\n\n this._pollCalculatedRowHeight.next()\n }\n }\n private _rows = 5\n\n /**\n * When `true`, text area can be resized vertically.\n *\n * @default true\n */\n @Input()\n get resizable(): boolean {\n return this._resizable\n }\n set resizable(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._resizable = coerceBooleanProperty(value)\n }\n }\n private _resizable = true\n\n /** @default false */\n get readOnly(): boolean {\n return this._readOnly\n }\n set readOnly(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._readOnly = coerceBooleanProperty(value)\n }\n }\n private _readOnly = false\n\n // TODO: fix bug where initial html value is rendered in plain text\n /**\n * When `true`, overrides all other provided settings to present the editor\n * as a standard textbox.\n *\n * NOTE: For the moment, `<p></p>` tags are still allowed, triggered by the `Enter` key.\n * https://github.com/slab/quill/issues/1432\n *\n * @default false\n */\n @Input()\n get disableRichText(): boolean {\n return this._disableRichText\n }\n set disableRichText(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._disableRichText = coerceBooleanProperty(value)\n\n this._updateQuillConfig()\n }\n }\n private _disableRichText = false\n\n /**\n * When `true`, displays a character counter at the bottom of the editor.\n * Character counter text is determined by values provided in `minLength`\n * and `maxLength`.\n *\n * The default count algorithm strips out html entities and replaces them\n * with spaces to get the string length. To override this behavior, pass\n * a custom function to `characterCounterFn`.\n *\n * To override default character counter display, pass a custom template to `characterCountTpl`.\n *\n * @default false\n */\n @Input()\n get displayCharacterCounter(): boolean {\n return this._displayCharacterCounter\n }\n set displayCharacterCounter(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._displayCharacterCounter = coerceBooleanProperty(value)\n }\n }\n private _displayCharacterCounter = false\n\n @Input()\n get minLength(): number | undefined {\n return this._minLength\n }\n set minLength(value: number | undefined) {\n if (notNullOrUndefined(value)) {\n this._minLength = value\n }\n }\n private _minLength: number | undefined\n\n @Input()\n get maxLength(): number | undefined {\n return this._maxLength\n }\n set maxLength(value: number | undefined) {\n if (notNullOrUndefined(value)) {\n this._maxLength = value\n }\n }\n private _maxLength: number | undefined\n\n /**\n * Set to override default character counter display.\n *\n * Template context includes variables `minLength`, `maxLength`, and `characterCount`.\n */\n @Input()\n get characterCounterTpl(): TemplateRef<any> | null {\n return this._characterCounterTpl\n }\n set characterCounterTpl(value) {\n if (notNullOrUndefined(value)) {\n this._characterCounterTpl = value\n }\n }\n private _characterCounterTpl: TemplateRef<any> | null = null\n\n /**\n * Set to override default counter function, which strips html entities and\n * replaces them with a space.\n */\n @Input() get characterCounterFn(): TheSeamCharacterCounterFn {\n return this._characterCounterFn\n }\n set characterCounterFn(value: TheSeamCharacterCounterFn | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._characterCounterFn = value\n }\n }\n private _characterCounterFn = defaultHtmlCharacterCounterFn\n\n /**\n * If `true`, component will configure the Quill editor with the quill-mentions extension\n * and listen for values passed to `mentionItems` to populate the mentions menu.\n *\n * @default false\n */\n @Input()\n get useMentions(): boolean {\n return this._useMentions\n }\n set useMentions(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._useMentions = coerceBooleanProperty(value)\n\n this._updateQuillConfig()\n }\n }\n private _useMentions: boolean = false\n\n /**\n * List of users, user groups, or other entities to display in mentions menu.\n * Minimum required properties are `id` (unique) and `value`, which acts as the label.\n *\n * By default, the menu is triggered by typing the `@` symbol into the text area.\n */\n @Input()\n get mentionItems(): TheSeamQuillMentionMenuItem[] | null | undefined {\n return this._mentionItems.value\n }\n set mentionItems(value: TheSeamQuillMentionMenuItem[] | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._mentionItems.next(value)\n }\n }\n private _mentionItems = new BehaviorSubject<TheSeamQuillMentionMenuItem[] | null | undefined>(undefined)\n public mentionItems$ = this._mentionItems.asObservable().pipe(\n filter(mentions => notNullOrUndefined(mentions) && mentions.length > 0),\n shareReplay({ bufferSize: 1, refCount: true })\n )\n\n /**\n * Set to override default search function when user is typing a mention.\n */\n @Input()\n get mentionSearchFn(): TheSeamQuillMentionSearchFn {\n return this._mentionSearchFn\n }\n set mentionSearchFn(value: TheSeamQuillMentionSearchFn | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._mentionSearchFn = value\n }\n }\n private _mentionSearchFn: TheSeamQuillMentionSearchFn = defaultMentionSearchFn\n\n /**\n * Set to override default render function for mentions list.\n *\n * Function should call `renderList`.\n */\n @Input()\n get mentionRenderListFn(): TheSeamQuillMentionSourceFn {\n return this._mentionRenderListFn\n }\n set mentionRenderListFn(value: TheSeamQuillMentionSourceFn | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._mentionRenderListFn = value\n }\n }\n private _mentionRenderListFn: TheSeamQuillMentionSourceFn = defaultMentionRenderListFn\n\n /**\n * Set to override default text shown while mention items are loading.\n *\n * @default 'Loading...'\n */\n @Input()\n get mentionListLoadingText(): string {\n return this._mentionListLoadingText\n }\n set mentionListLoadingText(value: string | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._mentionListLoadingText = value\n }\n }\n private _mentionListLoadingText: string = 'Loading...'\n\n /**\n * Set to override default text shown when a mention search returns no items.\n *\n * @default 'No matches found.'\n */\n @Input()\n get mentionListEmptyText(): string {\n return this._mentionListEmptyText\n }\n set mentionListEmptyText(value: string | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._mentionListEmptyText = value\n }\n }\n private _mentionListEmptyText: string = 'No matches found.'\n\n get mentionListEmptyItem(): TheSeamQuillMentionMenuOption {\n return {\n id: 'undefined',\n value: this.mentionListEmptyText,\n disabled: true,\n emptyList: true\n }\n }\n\n @Output() quillEditorCreated: EventEmitter<any> = new EventEmitter()\n @Output() quillEditorChanged: EventEmitter<EditorChangeContent | EditorChangeSelection> = new EventEmitter()\n @Output() quillContentChanged: EventEmitter<ContentChange> = new EventEmitter()\n @Output() quillSelectionChanged: EventEmitter<SelectionChange> = new EventEmitter()\n @Output() quillFocus: EventEmitter<Focus> = new EventEmitter()\n @Output() quillBlur: EventEmitter<Blur> = new EventEmitter()\n\n @Output() mentionsUpdated: EventEmitter<TheSeamQuillMentionMenuOption[]> = new EventEmitter()\n\n @ViewChild('quillEditor')\n get quillEditor(): TemplateRef<QuillEditorComponent> | undefined {\n return this._quillEditor\n }\n set quillEditor(value: TemplateRef<QuillEditorComponent> | undefined) {\n this._quillEditor = value\n\n // setTimeout because full html isn't available until the next tick\n setTimeout(() => {\n this._pollCalculatedRowHeight.next()\n }, 0)\n }\n private _quillEditor: TemplateRef<QuillEditorComponent> | undefined\n\n @ViewChild('characterCounter') defaultCharacterCounterTpl: TemplateRef<any> | undefined\n\n private _isWritingValue = false\n\n private _pollCalculatedRowHeight = new Subject<void>()\n\n private _configSet = new BehaviorSubject<boolean>(false)\n public configSet$ = this._configSet.asObservable()\n\n private _stylesSet = new BehaviorSubject<boolean>(false)\n private _templateSet = new BehaviorSubject<boolean>(false)\n\n public initialized$: Observable<boolean>\n\n public characterCount$: Observable<number>\n\n private _config = new BehaviorSubject<TheSeamQuillEditorConfig | undefined>(undefined)\n public config$ = this._config.asObservable()\n\n private _selectedMentions = new BehaviorSubject<TheSeamQuillMentionMenuOption[]>([])\n public selectedMentions$ = this._selectedMentions.asObservable()\n\n constructor(\n private readonly _renderer: Renderer2,\n @Optional() @Inject(THESEAM_QUILL_EDITOR_CONFIG) private _customConfig?: TheSeamQuillEditorConfig\n ) {\n this.initialized$ = combineLatest([\n this._configSet.asObservable(),\n this._stylesSet.asObservable(),\n this._templateSet.asObservable(),\n ]).pipe(\n map(sets => sets.findIndex(s => !s) === -1)\n )\n\n this.characterCount$ = this.initialized$.pipe(\n filter(i => i),\n switchMap(() => {\n if (notNullOrUndefined(this.formControl)) {\n return this.formControl.valueChanges.pipe(\n startWith(this.formControl.value),\n map(v => this.characterCounterFn(v || '' as string, this._config.value?.format)),\n )\n }\n\n return of(0)\n })\n )\n\n this.selectedMentions$.pipe(\n tap(mentions => this.mentionsUpdated.emit(mentions))\n ).subscribe()\n }\n\n ngOnInit(): void {\n // TODO: test this more\n // ignore quill initial valueChange event, to keep functionality in line with other inputs\n let initialEmitComplete = false\n this._configSet.pipe(\n filter(s => s),\n switchMap(() => this.formControl.valueChanges.pipe(\n // skip(1),\n take(1),\n tap(() => initialEmitComplete = true)\n ))\n ).subscribe()\n\n this.formControl.valueChanges.pipe(\n filter(() => !this._isWritingValue && initialEmitComplete),\n tap(value => this.value = value)\n ).subscribe()\n\n this._pollCalculatedRowHeight.asObservable().pipe(\n tap(() => {\n this._stylesSet.next(false)\n\n const calculatedRowsHeight = `${this.rows * 1.5}rem`\n\n if (notNullOrUndefined(this.rows) && notNullOrUndefined(this._quillEditor)) {\n const editorEl = this._quillEditor.elementRef.nativeElement.querySelector('.ql-editor')\n\n if (notNullOrUndefined(editorEl)) {\n this._renderer.setStyle(editorEl, 'height', calculatedRowsHeight)\n this._renderer.setStyle(editorEl, 'min-height', calculatedRowsHeight)\n }\n }\n\n this._stylesSet.next(true)\n })\n ).subscribe()\n\n this._buildQuillConfig()\n }\n\n ngAfterViewInit(): void {\n if (isNullOrUndefined(this.characterCounterTpl)) {\n this.characterCounterTpl = this.defaultCharacterCounterTpl || null\n }\n\n this._templateSet.next(true)\n }\n\n private _buildQuillConfig() {\n this._configSet.next(false)\n\n const config: TheSeamQuillEditorConfig = {\n ...THESEAM_QUILL_EDITOR_CONFIG_DEFAULT\n }\n\n if (this.disableRichText) {\n config.format = 'text'\n config.formats = []\n config.modules = {\n toolbar: false\n }\n }\n else {\n config.format = this._getConfigOrDefault('format')\n config.formats = this._getConfigOrDefault('formats')\n config.modules = {\n ...this._getConfigOrDefault('modules')\n }\n }\n\n if (this.useMentions) {\n const mentionModules: TheSeamQuillModules = {\n ...config.modules,\n mention: {\n ...THESEAM_QUILL_MENTION_OPTIONS_DEFAULT,\n renderLoading: () => this.mentionListLoadingText,\n source: async (searchTerm: string, renderList: (list: any[], searchTerm: string) => void, mentionChar: string) => {\n // this function is called every time the menu is triggered,\n // so it will always have the latest value from mentionItems$\n const mentionsAsync = await lastValueFrom(this.mentionItems$.pipe(take(1)))\n\n if (notNullOrUndefined(mentionsAsync)) {\n this.mentionRenderListFn(mentionsAsync, this.mentionSearchFn, this.mentionListEmptyItem, searchTerm, renderList, mentionChar)\n }\n },\n ...config.modules?.mention,\n }\n }\n\n config.modules = mentionModules\n }\n\n config.theme = this._getConfigOrDefault('theme')\n config.debug = this._getConfigOrDefault('debug')\n config.customToolbarPosition = this._getConfigOrDefault('customToolbarPosition')\n config.sanitize = this._getConfigOrDefault('sanitize')\n config.styles = this._getConfigOrDefault('styles')\n config.strict = this._getConfigOrDefault('strict')\n config.scrollingContainer = this._getConfigOrDefault('scrollingContainer')\n config.bounds = this._getConfigOrDefault('bounds')\n config.customOptions = this._getConfigOrDefault('customOptions')\n config.customModules = this._getConfigOrDefault('customModules')\n config.trackChanges = this._getConfigOrDefault('trackChanges')\n config.preserveWhitespace = this._getConfigOrDefault('preserveWhitespace')\n config.classes = this._getConfigOrDefault('classes')\n config.trimOnValidation = this._getConfigOrDefault('trimOnValidation')\n config.linkPlaceholder = this._getConfigOrDefault('linkPlaceholder')\n config.compareValues = this._getConfigOrDefault('compareValues')\n config.filterNull = this._getConfigOrDefault('filterNull')\n config.debounceTime = this._getConfigOrDefault('debounceTime')\n\n this._config.next(config)\n\n // setTimeout bc ngx-quill library doesn't listen for input changes,\n // so we must destroy and create the component each time config is updated\n setTimeout(() => {\n this._configSet.next(true)\n }, 0)\n }\n\n private _getConfigOrDefault<K extends keyof TheSeamQuillEditorConfig>(prop: K): TheSeamQuillEditorConfig[K] {\n if (this._customConfig && Object.prototype.hasOwnProperty.call(this._customConfig, prop)) {\n return this._customConfig[prop]\n }\n return THESEAM_QUILL_EDITOR_CONFIG_DEFAULT[prop]\n }\n\n private _updateQuillConfig() {\n if (this._configSet.value) {\n this._buildQuillConfig()\n }\n }\n\n // Not usable, bc config has to be set immediately, potentially before mentions populate.\n // To set customDataAttributes, provide a custom config.\n // private _getCustomDataAttributes(mentions: TheSeamQuillMentionMenuOption[]): string[] {\n // return mentions.reduce((acc, mention) => {\n // const keys = Object.keys(mention)\n\n // keys.forEach(key => {\n // if (acc.findIndex(a => a === key) === -1) {\n // acc.push(key)\n // }\n // })\n\n // return acc\n // }, <string[]>[] satisfies string[])\n // }\n\n get value(): string | undefined | null {\n return this._value\n }\n set value(value: string | undefined | null) {\n this._value = value\n\n if (this.onChange) { this.onChange(value) }\n if (this.onTouched) { this.onTouched() }\n }\n private _value: string | undefined | null\n\n writeValue(value: any): void {\n this._isWritingValue = true\n\n this.formControl.setValue(value)\n this.value = value\n\n this._isWritingValue = false\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.readOnly = isDisabled\n }\n\n _onEditorCreated(event: any) {\n this.quillEditorCreated.emit(event)\n }\n\n _onEditorChanged(event: EditorChangeContent | EditorChangeSelection) {\n this.quillEditorChanged.emit(event)\n }\n\n _onContentChanged(event: ContentChange) {\n this.quillContentChanged.emit(event)\n\n this._updateMentionsFromDelta(event.content)\n }\n\n _onSelectionChanged(event: SelectionChange) {\n this.quillSelectionChanged.emit(event)\n }\n\n _onFocus(event: Focus) {\n this.quillFocus.emit(event)\n }\n\n _onBlur(event: Blur) {\n this.quillBlur.emit(event)\n\n if (this.onTouched) {\n this.onTouched()\n }\n }\n\n /**\n * Hacky way to track mention inserts/deletes\n */\n private _updateMentionsFromDelta(content: Delta) {\n if (notNullOrUndefined(content.ops)) {\n const contentMentionIds = content.ops.map(o => o.insert?.mention?.id).filter(notNullOrUndefined)\n const selectedMentions = [ ...this._selectedMentions.value ]\n const mentionOptions = [ ...this._mentionItems.value || [] ]\n\n const newMentions: TheSeamQuillMentionMenuOption[] = contentMentionIds.reduce((acc, mentionId) => {\n const insertMention = mentionOptions.find(m => isMentionMenuOption(m) && m.id === mentionId)\n\n if (notNullOrUndefined(insertMention)) {\n acc.push(insertMention)\n }\n else {\n console.warn('Mention addition failed! Selected mention option not found:', mentionId)\n }\n\n return acc\n }, <TheSeamQuillMentionMenuOption[]>[])\n\n let emitUpdate = false\n if (selectedMentions.length !== newMentions.length) {\n // if the length has changed, we know an update occurred\n emitUpdate = true\n }\n else {\n // otherwise, test ids for old and new items to see if we need to emit a change\n const selectedMentionIds = this._selectedMentions.value.map(m => m.id)\n const newMentionIds = newMentions.map(m => m.id)\n\n if (\n selectedMentionIds.findIndex(m => !newMentionIds.includes(m)) !== -1 ||\n newMentionIds.findIndex(m => !selectedMentionIds.includes(m)) !== -1\n ) {\n emitUpdate = true\n }\n }\n\n if (emitUpdate) {\n this._selectedMentions.next(newMentions)\n }\n }\n }\n}\n","<div class=\"editor\" *ngIf=\"configSet$ | async\" [class.initializing]=\"!(initialized$ | async)\">\n <ng-container *ngIf=\"config$ | async as config\">\n <quill-editor\n #quillEditor\n seamInput\n [class.disabled]=\"readOnly\"\n [attr.disabled]=\"readOnly\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [readOnly]=\"readOnly\"\n [required]=\"required\"\n [minLength]=\"minLength\"\n [maxLength]=\"maxLength\"\n [format]=\"config.format\"\n [theme]=\"config.theme\"\n [modules]=\"config.modules\"\n [debug]=\"config.debug\"\n [formats]=\"config.formats\"\n [customToolbarPosition]=\"config.customToolbarPosition\"\n [sanitize]=\"config.sanitize\"\n [styles]=\"config.styles\"\n [strict]=\"config.strict\"\n [scrollingContainer]=\"config.scrollingContainer\"\n [bounds]=\"config.bounds\"\n [customOptions]=\"config.customOptions\"\n [customModules]=\"config.customModules\"\n [trackChanges]=\"config.trackChanges\"\n [preserveWhitespace]=\"config.preserveWhitespace\"\n [classes]=\"config.classes\"\n [trimOnValidation]=\"config.trimOnValidation\"\n [linkPlaceholder]=\"config.linkPlaceholder\"\n [compareValues]=\"config.compareValues\"\n [filterNull]=\"config.filterNull\"\n [debounceTime]=\"config.debounceTime\"\n [class.can-resize]=\"resizable\"\n (onEditorCreated)=\"_onEditorCreated($event)\"\n (onEditorChanged)=\"_onEditorChanged($event)\"\n (onContentChanged)=\"_onContentChanged($event)\"\n (onSelectionChanged)=\"_onSelectionChanged($event)\"\n (onFocus)=\"_onFocus($event)\"\n (onBlur)=\"_onBlur($event)\"></quill-editor>\n <ng-container *ngIf=\"displayCharacterCounter\">\n <ng-container\n [ngTemplateOutlet]=\"characterCounterTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: characterCount$ | async, minLength: minLength, maxLength: maxLength, characterCount: characterCount$ | async }\"></ng-container>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #characterCounter let-implicit let-minLength=\"minLength\" let-maxLength=\"maxLength\" let-characterCount=\"characterCount\">\n <div class=\"small text-black-50 text-right\">\n <ng-container *ngIf=\"characterCount || characterCount === 0\">\n Character Count:\n <span [class.text-danger]=\"characterCount && ((maxLength && characterCount > maxLength) || (minLength && characterCount < minLength))\">\n {{ characterCount | number }}\n </span>\n <ng-container *ngIf=\"maxLength\">\n / {{ maxLength }}\n </ng-container>\n <span *ngIf=\"minLength\" class=\"font-italic\">\n (minimum {{ minLength }} expected)\n </span>\n </ng-container>\n </div>\n</ng-template>\n","import { CustomModule, CustomOption, QuillModules } from 'ngx-quill'\r\nimport QuillType from 'quill'\r\n\r\nexport interface TheSeamQuillMentionMenuOption {\r\n /** Must be unique. */\r\n id: string\r\n\r\n /**\r\n * The value is used as the label for the mentions,\r\n * both in the text area and in the menu.\r\n */\r\n value: string\r\n\r\n /**\r\n * When `true`, this item will be included in the menu,\r\n * regardless of the search function applied.\r\n */\r\n searchIgnore?: boolean\r\n\r\n /**\r\n * If provided, will group items with the same `groupName`\r\n * under one header.\r\n */\r\n groupName?: string\r\n\r\n /** Any additional optional parameters */\r\n [key: string]: any\r\n}\r\n\r\nexport interface TheSeamQuillMentionMenuDivider {\r\n type: 'divider'\r\n disabled?: boolean\r\n}\r\n\r\nexport interface TheSeamQuillMentionMenuHeader {\r\n value: string\r\n type: 'groupName'\r\n disabled?: boolean\r\n}\r\n\r\nexport type TheSeamQuillMentionMenuItem = TheSeamQuillMentionMenuOption | TheSeamQuillMentionMenuDivider | TheSeamQuillMentionMenuHeader\r\n\r\nexport type TheSeamQuillMentionSearchFn = (\r\n source: TheSeamQuillMentionMenuItem[],\r\n textAfter: string,\r\n mentionChar: string\r\n) => TheSeamQuillMentionMenuItem[]\r\n\r\nexport type TheSeamQuillMentionSourceFn = (\r\n source: TheSeamQuillMentionMenuItem[],\r\n searchFn: TheSeamQuillMentionSearchFn,\r\n emptyListItem: TheSeamQuillMentionMenuItem | undefined,\r\n textAfter: string,\r\n renderList: (\r\n matches: {\r\n id: string\r\n value: string\r\n [key: string]: string | undefined\r\n }[],\r\n searchTerm: string\r\n ) => void,\r\n mentionChar: string\r\n) => void\r\n\r\n/**\r\n * Typed version of Options object, copied from quill-mention@v6.0.1 (typescript version)\r\n */\r\nexport interface TheSeamQuillMentionOptions {\r\n /**\r\n * Specifies which characters will cause the mention autocomplete to open\r\n * @default ['@']\r\n */\r\n mentionDenotationChars?: string[]\r\n\r\n /**\r\n * Whether to show the used denotation character in the mention item or not\r\n * @default true\r\n */\r\n showDenotationChar?: boolean\r\n\r\n /**\r\n * Allowed characters in search term triggering a search request using regular expressions. Can be a function that takes the denotationChar and returns a regex.\r\n * @default /^[a-zA-Z0-9_]*$/\r\n */\r\n allowedChars?: RegExp | ((char: string) => RegExp)\r\n\r\n /**\r\n * Minimum number of characters after the @ symbol triggering a search request\r\n * @default 0\r\n */\r\n minChars?: number\r\n\r\n /**\r\n * Maximum number of characters after the @ symbol triggering a search request\r\n * @default 31\r\n */\r\n maxChars?: number\r\n\r\n /**\r\n * Additional top offset of the mention container position\r\n * @default 2\r\n */\r\n offsetTop?: number\r\n\r\n /**\r\n * Additional left offset of the mention container position\r\n * @default 0\r\n */\r\n offsetLeft?: number\r\n\r\n /**\r\n * Whether or not the denotation character(s) should be isolated. For example, to avoid mentioning in an email.\r\n * @default false\r\n */\r\n isolateCharacter?: boolean\r\n\r\n /**\r\n * Only works if isolateCharacter is set to true. Whether or not the denotation character(s) can appear inline of the mention text. For example, to allow mentioning an email with the @ symbol as the denotation character.\r\n * @default false\r\n */\r\n allowInlineMentionChar?: boolean\r\n\r\n /**\r\n * When set to true, the mentions menu will be rendered above or below the quill container. Otherwise, the mentions menu will track the denotation character(s);\r\n * @default false\r\n */\r\n fixMentionsToQuill?: boolean\r\n\r\n /**\r\n * Options are 'normal' and 'fixed'. When 'fixed', the menu will be appended to the body and use fixed positioning. Use this if the menu is clipped by a parent element that's using `overflow:hidden\r\n * @default 'normal'\r\n */\r\n positioningStrategy?: 'normal' | 'fixed'\r\n\r\n /**\r\n * Options are 'bottom' and 'top'. Determines what the default orientation of the menu will be. Quill-mention will attempt to render the menu either above or below the editor. If 'top' is provided as a value, and there is not enough space above the editor, the menu will be rendered below. Vice versa, if there is not enough space below the editor, and 'bottom' is provided as a value (or no value is provided at all), the menu will be rendered above the editor.\r\n * @default 'bottom'\r\n */\r\n defaultMenuOrientation?: 'top' | 'bottom'\r\n\r\n /**\r\n * The name of the Quill Blot to be used for inserted mentions. A default implementation is provided named 'mention', which may be overridden with a custom blot.\r\n * @default 'mention'\r\n */\r\n blotName?: string\r\n\r\n /**\r\n * A list of data values you wish to be passed from your list data to the html node. (id, value, denotationChar, link, target are included by default).\r\n * @default ['id', 'value', 'denotationChar', 'link', 'target', 'disabled']\r\n */\r\n dataAttributes?: string[]\r\n\r\n /**\r\n * Link target for mentions with a link\r\n * @default '_blank'\r\n */\r\n linkTarget?: string\r\n\r\n /**\r\n * Style class to be used for list items (may be null)\r\n * @default 'ql-mention-list-item'\r\n */\r\n listItemClass?: string\r\n\r\n /**\r\n * Style class to be used for the mention list container (may be null)\r\n * @default 'ql-mention-list-container'\r\n */\r\n mentionContainerClass?: string\r\n\r\n /**\r\n * Style class to be used for the mention list (may be null)\r\n * @default 'ql-mention-list'\r\n */\r\n mentionListClass?: string\r\n\r\n /**\r\n * Whether or not insert 1 space after mention block in text\r\n * @default true\r\n */\r\n spaceAfterInsert?: boolean\r\n\r\n /**\r\n * An array of keyboard key codes that will trigger the select action for the mention dropdown. Default is ENTER key. See this reference for a list of numbers for each keyboard key.\r\n * @default [13]\r\n */\r\n selectKeys?: (string | number | string)[]\r\n\r\n /**\r\n * Required callback function to handle the search term and connect it to a data source for matches. The data source can be a local source or an AJAX request.\r\n * The callback should call renderList(matches, searchTerm); with matches of JSON Objects in an array to show the result for the user. The JSON Objects should have id and value but can also have other values to be used in renderItem for custom display.\r\n * @param textAfter\r\n * @param render\r\n * @param mentionChar\r\n * @returns\r\n */\r\n source: (\r\n textAfter: string,\r\n renderList: (\r\n matches: {\r\n id: string\r\n value: string\r\n [key: string]: string | undefined\r\n }[],\r\n searchTerm: string\r\n ) => void,\r\n mentionChar: string\r\n ) => void\r\n\r\n /**\r\n * Callback when mention dropdown is open.\r\n * @returns\r\n */\r\n onOpen?: () => boolean\r\n\r\n /**\r\n * Callback before the DOM of mention dropdown is removed.\r\n * @returns\r\n */\r\n onBeforeClose?: () => boolean\r\n\r\n /**\r\n * Callback when mention dropdown is closed.\r\n * @returns\r\n */\r\n onClose?: () => boolean\r\n\r\n /**\r\n * A function that gives you control over how matches from source are displayed. You can use this function to highlight the search term or change the design with custom HTML. This function will need to return either a string possibly containing unsanitized user content, or a class implementing the Node interface which will be treated as a sanitized DOM node.\r\n * @param item\r\n * @param searchTerm\r\n * @returns\r\n */\r\n renderItem?: (\r\n item: { id: string; value: string; [key: string]: unknown },\r\n searchTerm: string\r\n ) => string | HTMLElement\r\n\r\n /**\r\n * A function that returns the HTML for a loading message during async calls from source. The function will need to return either a string possibly containing unsanitized user content, or a class implementing the Node interface which will be treated as a sanitized DOM node. The default functions returns null to prevent a loading message.\r\n * @returns\r\n */\r\n renderLoading?: () => string | HTMLElement | null\r\n\r\n /**\r\n * Callback for a selected item. When overriding this method, insertItem should be used to insert item to the editor. This makes async requests possible.\r\n * @param item\r\n * @param insertItem\r\n */\r\n onSelect?: (\r\n item: DOMStringMap,\r\n insertItem: (\r\n data: Record<string, unknown>,\r\n programmaticInsert?: boolean,\r\n overriddenOptions?: object\r\n ) => void\r\n ) => void\r\n}\r\n\r\nexport interface TheSeamQuillModules extends QuillModules {\r\n mention?: Partial<TheSeamQuillMentionOptions>\r\n}\r\n\r\nexport const THESEAM_QUILL_FORMATS = [\r\n 'align',\r\n 'background',\r\n 'blockquote',\r\n 'bold',\r\n 'code-block',\r\n 'code',\r\n 'color',\r\n 'direction',\r\n 'font',\r\n 'header',\r\n 'image',\r\n 'indent',\r\n 'italic',\r\n 'link',\r\n 'list',\r\n 'script',\r\n 'size',\r\n 'strike',\r\n 'underline',\r\n 'video',\r\n 'mention'\r\n] as const\r\n\r\nexport type TheSeamQuillStyleFormat = (typeof THESEAM_QUILL_FORMATS)[number]\r\n\r\nexport type TheSeamQuillInputFormat = 'object' | 'html' | 'text' | 'json'\r\n\r\nexport interface TheSeamQuillEditorConfig {\r\n /**\r\n * The format of the text inside the editor.\r\n *\r\n * @default 'html'\r\n */\r\n format: TheSeamQuillInputFormat\r\n\r\n /** @default 'snow' */\r\n theme?: string\r\n\r\n /**\r\n * Used to set custom config for built-in and add-on modules.\r\n *\r\n * See `SEAM_QUILL_MODULES_DEFAULT` for default value.\r\n */\r\n modules?: TheSeamQuillModules\r\n\r\n /**\r\n * Console level for debug messages.\r\n *\r\n * @default `warn`\r\n */\r\n debug?: 'warn' | 'log' | 'error' | false\r\n\r\n /**\r\n * List of formats allowed in editor.\r\n *\r\n * See `SEAM_QUILL_FORMATS_DEFAULT` for default value.\r\n *\r\n * NOTE: Adding or removing a value will enable/disable that format\r\n * in the editor, but has no effect on the toolbar buttons.\r\n * To modify the toolbar display, update `modules.toolbar`.\r\n */\r\n formats?: TheSeamQuillStyleFormat[] | null\r\n\r\n /** @default 'top' */\r\n customToolbarPosition: 'top' | 'bottom'\r\n\r\n /**\r\n * When `true`, runs the control value through Angular's DOM sanitizer\r\n * before setting the value.\r\n *\r\n * @default false\r\n */\r\n sanitize: boolean\r\n\r\n /** Custom css styles to add to the `.ql-container` element. */\r\n styles?: { [key: string]: string } | null\r\n\r\n /**\r\n * When `false`, user interactions in the toolbar will emit even\r\n * if the editor is marked as `readOnly`. This allows the user to\r\n * make some formatting changes (e.g. creating a list) to a value\r\n * that should be disabled.\r\n *\r\n * @default true.\r\n */\r\n strict: boolean\r\n\r\n /**\r\n * An element or selector that specifies the scrolling element of the editor.\r\n *\r\n * Default scrollingContainer is the `.ql-editor` element.\r\n */\r\n scrollingContainer?: HTMLElement | string | null\r\n\r\n /**\r\n * An element or selector that specifies the confining element of the editor.\r\n *\r\n * Default boundary container is the document's `body` element.\r\n */\r\n bounds?: HTMLElement | string\r\n\r\n /**\r\n * Defines custom formats for the editor. Can be used to overwrite existing options.\r\n *\r\n * TODO: Research this more.\r\n */\r\n customOptions: CustomOption[]\r\n\r\n /**\r\n * Defines custom modules for the editor. Can be used to overwrite existing modules.\r\n *\r\n * TODO: Research this more.\r\n */\r\n customModules: CustomModule[]\r\n\r\n /**\r\n * When `user`, only change events from the user will trigger a model change.\r\n * This is the default behavior, and is preferred.\r\n *\r\n * Changing to `all` is not recommended.\r\n */\r\n trackChanges?: 'user' | 'all'\r\n\r\n /**\r\n * When `true`, preserves duplicated whitespaces.\r\n *\r\n * @default false\r\n */\r\n preserveWhitespace: boolean\r\n\r\n /** Custom classes to add to the `.ql-container` element. */\r\n classes?: string\r\n\r\n /**\r\n * When `true`, trims leading/trailing newlines when validation is run.\r\n *\r\n * @default false\r\n */\r\n trimOnValidation: boolean\r\n\r\n /**\r\n * Sets a placeholder for the link input in the hyperlink form.\r\n *\r\n * @default 'https://quilljs.com'\r\n */\r\n linkPlaceholder?: string\r\n\r\n /**\r\n * When `true`, does a basic compare (using JSON.stringify) between the old\r\n * and new value on `writeValue()`. If the values are the same, it skips the update.\r\n *\r\n * @default false\r\n */\r\n compareValues: boolean\r\n\r\n /**\r\n * When `true`, skips the update for null values on `writeValue()`.\r\n *\r\n * @default false\r\n */\r\n filterNull: boolean\r\n\r\n /**\r\n * Debounces `onContentChanged()`, `onEditorChanged()`, `ngModel` and form control `valueChange()`.\r\n *\r\n * Defaults to `undefined`, so changes always emit immediately.\r\n *\r\n * @default undefined\r\n */\r\n debounceTime?: number\r\n\r\n /**\r\n * @deprecated The `ngx-quill` library doesn't accurately handle undefined\r\n * inputs, and the default `valueGetter` function is impossible to reference here,\r\n * so this config option is not used.\r\n *\r\n * Defines custom logic for reading the html value of the editor.\r\n */\r\n valueGetter?: (\r\n quillEditor: QuillType,\r\n editorElement: HTMLElement\r\n ) => string | any\r\n\r\n /**\r\n * @deprecated The `ngx-quill` library doesn't accurately handle undefined\r\n * inputs, and the default `valueSetter` function is impossible to reference here,\r\n * so this config option is not used.\r\n *\r\n * Defines custom logic for setting the html value of the editor.\r\n */\r\n valueSetter?: (quillEditor: QuillType, value: any) => any\r\n}\r\n\r\nexport type TheSeamCharacterCounterFn = (\r\n value: string,\r\n format: TheSeamQuillInputFormat | undefined\r\n) => number\r\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { QuillModule } from 'ngx-quill';\nimport { RichTextComponent } from './rich-text/rich-text.component';\nimport { ReactiveFormsModule } from '@angular/forms';\n\n@NgModule({\n declarations: [\n RichTextComponent,\n ],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n QuillModule\n ],\n exports: [\n RichTextComponent,\n ]\n})\nexport class TheSeamRichTextModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"theseam-ui-common-rich-text.mjs","sources":["../../../projects/ui-common/rich-text/utils/utils.ts","../../../projects/ui-common/rich-text/rich-text/rich-text.component.ts","../../../projects/ui-common/rich-text/rich-text/rich-text.component.html","../../../projects/ui-common/rich-text/utils/models.ts","../../../projects/ui-common/rich-text/rich-text.module.ts","../../../projects/ui-common/rich-text/theseam-ui-common-rich-text.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\"\r\nimport { QuillToolbarConfig } from \"ngx-quill\"\r\nimport { TheSeamQuillModules, TheSeamQuillStyleFormat, TheSeamQuillEditorConfig, TheSeamQuillMentionMenuOption, TheSeamQuillInputFormat, TheSeamQuillMentionOptions, TheSeamQuillMentionSourceFn, TheSeamQuillMentionSearchFn, TheSeamCharacterCounterFn, TheSeamQuillMentionMenuItem } from \"./models\"\r\nimport { isNullOrUndefined, notNullOrUndefined, notNullOrUndefinedOrEmpty } from \"@theseam/ui-common/utils\"\r\n\r\nexport const HTML_ENTITY_REGEX = /<[^>]+>/gm\r\n\r\nexport const THESEAM_QUILL_TOOLBAR_OPTIONS_DEFAULT: QuillToolbarConfig = [\r\n ['bold', 'italic', 'underline', 'strike'],\r\n [{ header: [0, 1, 2, 3, 4, 5] }],\r\n [{ list: 'ordered' }, { list: 'bullet' }],\r\n [{ align: [] }],\r\n ['link'],\r\n ['clean'],\r\n]\r\n\r\nexport const THESEAM_QUILL_MENTION_OPTIONS_DEFAULT: Partial<TheSeamQuillMentionOptions> = {\r\n spaceAfterInsert: false,\r\n positioningStrategy: 'fixed',\r\n dataAttributes: [ 'type' ]\r\n}\r\n\r\nexport const THESEAM_QUILL_MODULES_DEFAULT: TheSeamQuillModules = {\r\n toolbar: THESEAM_QUILL_TOOLBAR_OPTIONS_DEFAULT\r\n}\r\n\r\nexport const THESEAM_QUILL_FORMATS_DEFAULT: TheSeamQuillStyleFormat[] = [\r\n 'align',\r\n 'bold',\r\n 'header',\r\n 'indent',\r\n 'italic',\r\n 'link',\r\n 'list',\r\n 'size',\r\n 'strike',\r\n 'underline',\r\n 'mention'\r\n]\r\n\r\nexport const THESEAM_QUILL_EDITOR_CONFIG_DEFAULT: TheSeamQuillEditorConfig = {\r\n format: 'html',\r\n modules: THESEAM_QUILL_MODULES_DEFAULT,\r\n formats: THESEAM_QUILL_FORMATS_DEFAULT,\r\n linkPlaceholder: 'https://google.com',\r\n customToolbarPosition: 'top',\r\n sanitize: false,\r\n strict: true,\r\n customOptions: [],\r\n customModules: [],\r\n preserveWhitespace: false,\r\n trimOnValidation: false,\r\n compareValues: false,\r\n filterNull: false\r\n}\r\n\r\nexport const THESEAM_QUILL_EDITOR_CONFIG = new InjectionToken<TheSeamQuillEditorConfig>('TheSeamQuillEditorConfig')\r\n\r\nexport const defaultHtmlCharacterCounterFn: TheSeamCharacterCounterFn = (value: string, format: TheSeamQuillInputFormat | undefined): number => {\r\n if (format === 'html') {\r\n return value.replace(HTML_ENTITY_REGEX, ' ').replace(/\\s\\s+/g, ' ').trim().length\r\n }\r\n else if (format === 'text') {\r\n return value.replace(/\\s\\s+/g, ' ').trim().length\r\n }\r\n else {\r\n console.warn(`Format ${format} not supported!`)\r\n return 0\r\n }\r\n}\r\n\r\nexport function isMentionMenuOption(value: TheSeamQuillMentionMenuItem | undefined): value is TheSeamQuillMentionMenuOption {\r\n if (isNullOrUndefined(value) || typeof value !== 'object') {\r\n return false\r\n }\r\n\r\n return Object.prototype.hasOwnProperty.call(value, 'id')\r\n}\r\n\r\nexport const defaultMentionSearchFn: TheSeamQuillMentionSearchFn = (source: TheSeamQuillMentionMenuItem[], textAfter: string, mentionChar: string) => {\r\n return source.filter(u => {\r\n if (!isMentionMenuOption(u) || u.searchIgnore === true) {\r\n return true\r\n }\r\n\r\n return u.value.toLowerCase().includes(textAfter.toLowerCase())\r\n })\r\n}\r\n\r\nexport const defaultMentionRenderListFn: TheSeamQuillMentionSourceFn = (source: TheSeamQuillMentionMenuItem[], searchFn: TheSeamQuillMentionSearchFn, emptyListItem: TheSeamQuillMentionMenuItem | undefined, textAfter: string, renderList: (list: any[], searchTerm: string) => any, mentionChar: string) => {\r\n let list = searchFn(source, textAfter, mentionChar)\r\n\r\n if (list.length === 0 && notNullOrUndefined(emptyListItem)) {\r\n list.push(emptyListItem)\r\n }\r\n else {\r\n let reduceIdx = 0\r\n list = list.reduce((acc, mention) => {\r\n const previousMenuItem = acc[reduceIdx - 1]\r\n const previousMenuItemGroupName = isMentionMenuOption(previousMenuItem) ? previousMenuItem.groupName : undefined\r\n if (isMentionMenuOption(mention)\r\n && notNullOrUndefinedOrEmpty(mention.groupName)\r\n && mention.groupName !== previousMenuItemGroupName\r\n ) {\r\n acc.push({\r\n value: mention.groupName,\r\n disabled: true,\r\n type: 'groupName'\r\n })\r\n\r\n reduceIdx++\r\n }\r\n\r\n if (!isMentionMenuOption(mention)) {\r\n mention.disabled = true\r\n }\r\n\r\n acc.push(mention)\r\n reduceIdx++\r\n\r\n return acc\r\n }, <TheSeamQuillMentionMenuItem[]>[] satisfies TheSeamQuillMentionMenuItem[])\r\n }\r\n\r\n renderList(list, textAfter)\r\n}\r\n\r\n// Keeping this as an example for a custom menu item.\r\n// There doesn't appear to be a better way of passing in a custom template.\r\n// export const defaultMentionRenderItem = (item: TheSeamQuillMentionListItem) => {\r\n // if (item.type === 'groupName') {\r\n // const text = document.createElement('div')\r\n // text.setAttribute('class', 'small text-black-50')\r\n // text.innerText = item.value\r\n\r\n // return text.outerHTML\r\n // }\r\n // else if (item.type === 'divider') {\r\n // const div = document.createElement('hr')\r\n // div.setAttribute('class', 'my-2')\r\n // return div.outerHTML\r\n // }\r\n // else {\r\n // return item.value\r\n // }\r\n// }\r\n","import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { AfterViewInit, Component, EventEmitter, HostListener, Inject, Input, OnDestroy, OnInit, Optional, Output, Provider, Renderer2, TemplateRef, ViewChild, forwardRef } from '@angular/core';\nimport { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { Blur, ContentChange, EditorChangeContent, EditorChangeSelection, Focus, QuillEditorComponent, SelectionChange } from 'ngx-quill';\nimport { Delta } from 'quill';\nimport 'quill-mention';\nimport { BehaviorSubject, Observable, Subject, combineLatest, filter, lastValueFrom, map, of, shareReplay, startWith, switchMap, take, tap } from 'rxjs';\n\nimport { isNullOrUndefined, notNullOrUndefined } from '@theseam/ui-common/utils';\nimport { TheSeamCharacterCounterFn, TheSeamQuillEditorConfig, TheSeamQuillMentionMenuItem, TheSeamQuillMentionMenuOption, TheSeamQuillMentionSearchFn, TheSeamQuillMentionSourceFn, TheSeamQuillModules } from '../utils/models';\nimport { THESEAM_QUILL_EDITOR_CONFIG, THESEAM_QUILL_EDITOR_CONFIG_DEFAULT, THESEAM_QUILL_MENTION_OPTIONS_DEFAULT, defaultHtmlCharacterCounterFn, defaultMentionRenderListFn, defaultMentionSearchFn, isMentionMenuOption } from '../utils/utils';\n\nexport const RICH_TEXT_VALUE_ACCESSOR: Provider = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => RichTextComponent),\n multi: true\n}\n\n@Component({\n selector: 'seam-rich-text',\n templateUrl: './rich-text.component.html',\n styleUrls: ['./rich-text.component.scss'],\n providers: [\n RICH_TEXT_VALUE_ACCESSOR\n ]\n})\nexport class RichTextComponent implements OnInit, AfterViewInit, OnDestroy, ControlValueAccessor {\n\n onChange: any\n onTouched: any\n\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input('value') val: string | undefined\n\n formControl = new FormControl<string | null>(null)\n\n @Input()\n get required(): boolean {\n return this._required\n }\n set required(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._required = coerceBooleanProperty(value)\n }\n }\n private _required = false\n\n /** @default '' (empty string) */\n @Input()\n get placeholder(): string {\n return this._placeholder\n }\n set placeholder(value: string | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._placeholder = value\n }\n }\n private _placeholder = ''\n\n /**\n * Initial rows visible in text area, set using `height` and `minHeight`.\n *\n * NOTE: Resizable editors will not be able to size below the height calculated from this value.\n *\n * @default 5\n */\n @Input()\n get rows(): number {\n return this._rows\n }\n set rows(value: number | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._rows = value\n\n this._pollCalculatedRowHeight.next()\n }\n }\n private _rows = 5\n\n /**\n * When `true`, text area can be resized vertically.\n *\n * @default true\n */\n @Input()\n get resizable(): boolean {\n return this._resizable\n }\n set resizable(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._resizable = coerceBooleanProperty(value)\n }\n }\n private _resizable = true\n\n /** @default false */\n get readOnly(): boolean {\n return this._readOnly\n }\n set readOnly(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._readOnly = coerceBooleanProperty(value)\n }\n }\n private _readOnly = false\n\n // TODO: fix bug where initial html value is rendered in plain text\n /**\n * When `true`, overrides all other provided settings to present the editor\n * as a standard textbox.\n *\n * NOTE: For the moment, `<p></p>` tags are still allowed, triggered by the `Enter` key.\n * https://github.com/slab/quill/issues/1432\n *\n * @default false\n */\n @Input()\n get disableRichText(): boolean {\n return this._disableRichText\n }\n set disableRichText(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._disableRichText = coerceBooleanProperty(value)\n\n this._updateQuillConfig()\n }\n }\n private _disableRichText = false\n\n /**\n * When `true`, displays a character counter at the bottom of the editor.\n * Character counter text is determined by values provided in `minLength`\n * and `maxLength`.\n *\n * The default count algorithm strips out html entities and replaces them\n * with spaces to get the string length. To override this behavior, pass\n * a custom function to `characterCounterFn`.\n *\n * To override default character counter display, pass a custom template to `characterCountTpl`.\n *\n * @default false\n */\n @Input()\n get displayCharacterCounter(): boolean {\n return this._displayCharacterCounter\n }\n set displayCharacterCounter(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._displayCharacterCounter = coerceBooleanProperty(value)\n }\n }\n private _displayCharacterCounter = false\n\n @Input()\n get minLength(): number | undefined {\n return this._minLength\n }\n set minLength(value: number | undefined) {\n if (notNullOrUndefined(value)) {\n this._minLength = value\n }\n }\n private _minLength: number | undefined\n\n @Input()\n get maxLength(): number | undefined {\n return this._maxLength\n }\n set maxLength(value: number | undefined) {\n if (notNullOrUndefined(value)) {\n this._maxLength = value\n }\n }\n private _maxLength: number | undefined\n\n /**\n * Set to override default character counter display.\n *\n * Template context includes variables `minLength`, `maxLength`, and `characterCount`.\n */\n @Input()\n get characterCounterTpl(): TemplateRef<any> | null {\n return this._characterCounterTpl\n }\n set characterCounterTpl(value) {\n if (notNullOrUndefined(value)) {\n this._characterCounterTpl = value\n }\n }\n private _characterCounterTpl: TemplateRef<any> | null = null\n\n /**\n * Set to override default counter function, which strips html entities and\n * replaces them with a space.\n */\n @Input() get characterCounterFn(): TheSeamCharacterCounterFn {\n return this._characterCounterFn\n }\n set characterCounterFn(value: TheSeamCharacterCounterFn | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._characterCounterFn = value\n }\n }\n private _characterCounterFn = defaultHtmlCharacterCounterFn\n\n /**\n * If `true`, component will configure the Quill editor with the quill-mentions extension\n * and listen for values passed to `mentionItems` to populate the mentions menu.\n *\n * @default false\n */\n @Input()\n get useMentions(): boolean {\n return this._useMentions\n }\n set useMentions(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._useMentions = coerceBooleanProperty(value)\n\n this._updateQuillConfig()\n }\n }\n private _useMentions: boolean = false\n\n /**\n * List of users, user groups, or other entities to display in mentions menu.\n * Minimum required properties are `id` (unique) and `value`, which acts as the label.\n *\n * By default, the menu is triggered by typing the `@` symbol into the text area.\n */\n @Input()\n get mentionItems(): TheSeamQuillMentionMenuItem[] | null | undefined {\n return this._mentionItems.value\n }\n set mentionItems(value: TheSeamQuillMentionMenuItem[] | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._mentionItems.next(value)\n }\n }\n private _mentionItems = new BehaviorSubject<TheSeamQuillMentionMenuItem[] | null | undefined>(undefined)\n public mentionItems$ = this._mentionItems.asObservable().pipe(\n filter(mentions => notNullOrUndefined(mentions) && mentions.length > 0),\n shareReplay({ bufferSize: 1, refCount: true })\n )\n\n /**\n * Set to override default search function when user is typing a mention.\n */\n @Input()\n get mentionSearchFn(): TheSeamQuillMentionSearchFn {\n return this._mentionSearchFn\n }\n set mentionSearchFn(value: TheSeamQuillMentionSearchFn | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._mentionSearchFn = value\n }\n }\n private _mentionSearchFn: TheSeamQuillMentionSearchFn = defaultMentionSearchFn\n\n /**\n * Set to override default render function for mentions list.\n *\n * Function should call `renderList`.\n */\n @Input()\n get mentionRenderListFn(): TheSeamQuillMentionSourceFn {\n return this._mentionRenderListFn\n }\n set mentionRenderListFn(value: TheSeamQuillMentionSourceFn | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._mentionRenderListFn = value\n }\n }\n private _mentionRenderListFn: TheSeamQuillMentionSourceFn = defaultMentionRenderListFn\n\n /**\n * Set to override default text shown while mention items are loading.\n *\n * @default 'Loading...'\n */\n @Input()\n get mentionListLoadingText(): string {\n return this._mentionListLoadingText\n }\n set mentionListLoadingText(value: string | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._mentionListLoadingText = value\n }\n }\n private _mentionListLoadingText: string = 'Loading...'\n\n /**\n * Set to override default text shown when a mention search returns no items.\n *\n * @default 'No matches found.'\n */\n @Input()\n get mentionListEmptyText(): string {\n return this._mentionListEmptyText\n }\n set mentionListEmptyText(value: string | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._mentionListEmptyText = value\n }\n }\n private _mentionListEmptyText: string = 'No matches found.'\n\n get mentionListEmptyItem(): TheSeamQuillMentionMenuOption {\n return {\n id: 'undefined',\n value: this.mentionListEmptyText,\n disabled: true,\n emptyList: true\n }\n }\n\n @Output() quillEditorCreated: EventEmitter<any> = new EventEmitter()\n @Output() quillEditorChanged: EventEmitter<EditorChangeContent | EditorChangeSelection> = new EventEmitter()\n @Output() quillContentChanged: EventEmitter<ContentChange> = new EventEmitter()\n @Output() quillSelectionChanged: EventEmitter<SelectionChange> = new EventEmitter()\n @Output() quillFocus: EventEmitter<Focus> = new EventEmitter()\n @Output() quillBlur: EventEmitter<Blur> = new EventEmitter()\n\n @Output() mentionsUpdated: EventEmitter<TheSeamQuillMentionMenuOption[]> = new EventEmitter()\n\n @ViewChild('quillEditor')\n get quillEditor(): QuillEditorComponent | undefined {\n return this._quillEditor\n }\n set quillEditor(value: QuillEditorComponent | undefined) {\n this._quillEditor = value\n\n // setTimeout because full html isn't available until the next tick\n setTimeout(() => {\n this._pollCalculatedRowHeight.next()\n }, 0)\n }\n private _quillEditor: QuillEditorComponent | undefined\n\n @ViewChild('characterCounter') defaultCharacterCounterTpl: TemplateRef<any> | undefined\n\n @HostListener('keydown', ['$event'])\n _handleKeydown(event: KeyboardEvent) {\n if (event.code === 'Escape') {\n const qlEditor = this._quillEditor?.editorElem?.querySelector('.ql-editor')\n if (notNullOrUndefined(qlEditor) && qlEditor === document.activeElement && qlEditor instanceof HTMLElement) {\n event.preventDefault()\n event.stopImmediatePropagation()\n qlEditor.blur()\n }\n }\n }\n\n private _isWritingValue = false\n\n private _pollCalculatedRowHeight = new Subject<void>()\n\n private _configSet = new BehaviorSubject<boolean>(false)\n public configSet$ = this._configSet.asObservable()\n\n private _stylesSet = new BehaviorSubject<boolean>(false)\n private _templateSet = new BehaviorSubject<boolean>(false)\n\n public initialized$: Observable<boolean>\n\n public characterCount$: Observable<number>\n\n private _config = new BehaviorSubject<TheSeamQuillEditorConfig | undefined>(undefined)\n public config$ = this._config.asObservable()\n\n private _selectedMentions = new BehaviorSubject<TheSeamQuillMentionMenuOption[]>([])\n public selectedMentions$ = this._selectedMentions.asObservable()\n\n constructor(\n private readonly _renderer: Renderer2,\n @Optional() @Inject(THESEAM_QUILL_EDITOR_CONFIG) private _customConfig?: TheSeamQuillEditorConfig\n ) {\n this.initialized$ = combineLatest([\n this._configSet.asObservable(),\n this._stylesSet.asObservable(),\n this._templateSet.asObservable(),\n ]).pipe(\n map(sets => sets.findIndex(s => !s) === -1)\n )\n\n this.characterCount$ = this.initialized$.pipe(\n filter(i => i),\n switchMap(() => {\n if (notNullOrUndefined(this.formControl)) {\n return this.formControl.valueChanges.pipe(\n startWith(this.formControl.value),\n map(v => this.characterCounterFn(v || '' as string, this._config.value?.format)),\n )\n }\n\n return of(0)\n })\n )\n\n this.selectedMentions$.pipe(\n tap(mentions => this.mentionsUpdated.emit(mentions))\n ).subscribe()\n }\n\n ngOnInit(): void {\n // TODO: test this more\n // ignore quill initial valueChange event, to keep functionality in line with other inputs\n let initialEmitComplete = false\n this._configSet.pipe(\n filter(s => s),\n switchMap(() => this.formControl.valueChanges.pipe(\n // skip(1),\n take(1),\n tap(() => initialEmitComplete = true)\n ))\n ).subscribe()\n\n this.formControl.valueChanges.pipe(\n filter(() => !this._isWritingValue && initialEmitComplete),\n tap(value => this.value = value)\n ).subscribe()\n\n this._pollCalculatedRowHeight.asObservable().pipe(\n tap(() => {\n this._stylesSet.next(false)\n\n const calculatedRowsHeight = `${this.rows * 1.5}rem`\n\n if (notNullOrUndefined(this.rows) && notNullOrUndefined(this._quillEditor)) {\n const editorEl = this._quillEditor.elementRef.nativeElement.querySelector('.ql-editor')\n\n if (notNullOrUndefined(editorEl)) {\n this._renderer.setStyle(editorEl, 'height', calculatedRowsHeight)\n this._renderer.setStyle(editorEl, 'min-height', calculatedRowsHeight)\n }\n }\n\n this._stylesSet.next(true)\n })\n ).subscribe()\n\n this._buildQuillConfig()\n }\n\n ngAfterViewInit(): void {\n if (isNullOrUndefined(this.characterCounterTpl)) {\n this.characterCounterTpl = this.defaultCharacterCounterTpl || null\n }\n\n this._templateSet.next(true)\n }\n\n ngOnDestroy(): void {\n // hacky way to ensure mentions menu gets destroyed when component is destroyed\n const mentionModule = this._quillEditor?.quillEditor.getModule('mention')\n const hideMentionList = mentionModule?.hideMentionList\n if (hideMentionList && typeof hideMentionList === 'function') {\n hideMentionList.call(mentionModule)\n }\n }\n\n private _buildQuillConfig() {\n this._configSet.next(false)\n\n const config: TheSeamQuillEditorConfig = {\n ...THESEAM_QUILL_EDITOR_CONFIG_DEFAULT\n }\n\n if (this.disableRichText) {\n config.format = 'text'\n config.formats = []\n config.modules = {\n toolbar: false\n }\n }\n else {\n config.format = this._getConfigOrDefault('format')\n config.formats = this._getConfigOrDefault('formats')\n config.modules = {\n ...this._getConfigOrDefault('modules')\n }\n }\n\n if (this.useMentions) {\n const mentionModules: TheSeamQuillModules = {\n ...config.modules,\n mention: {\n ...THESEAM_QUILL_MENTION_OPTIONS_DEFAULT,\n renderLoading: () => this.mentionListLoadingText,\n source: async (searchTerm: string, renderList: (list: any[], searchTerm: string) => void, mentionChar: string) => {\n // this function is called every time the menu is triggered,\n // so it will always have the latest value from mentionItems$\n const mentionsAsync = await lastValueFrom(this.mentionItems$.pipe(take(1)))\n\n if (notNullOrUndefined(mentionsAsync)) {\n this.mentionRenderListFn(mentionsAsync, this.mentionSearchFn, this.mentionListEmptyItem, searchTerm, renderList, mentionChar)\n }\n },\n ...config.modules?.mention,\n }\n }\n\n config.modules = mentionModules\n }\n\n config.theme = this._getConfigOrDefault('theme')\n config.debug = this._getConfigOrDefault('debug')\n config.customToolbarPosition = this._getConfigOrDefault('customToolbarPosition')\n config.sanitize = this._getConfigOrDefault('sanitize')\n config.styles = this._getConfigOrDefault('styles')\n config.strict = this._getConfigOrDefault('strict')\n config.scrollingContainer = this._getConfigOrDefault('scrollingContainer')\n config.bounds = this._getConfigOrDefault('bounds')\n config.customOptions = this._getConfigOrDefault('customOptions')\n config.customModules = this._getConfigOrDefault('customModules')\n config.trackChanges = this._getConfigOrDefault('trackChanges')\n config.preserveWhitespace = this._getConfigOrDefault('preserveWhitespace')\n config.classes = this._getConfigOrDefault('classes')\n config.trimOnValidation = this._getConfigOrDefault('trimOnValidation')\n config.linkPlaceholder = this._getConfigOrDefault('linkPlaceholder')\n config.compareValues = this._getConfigOrDefault('compareValues')\n config.filterNull = this._getConfigOrDefault('filterNull')\n config.debounceTime = this._getConfigOrDefault('debounceTime')\n\n this._config.next(config)\n\n // setTimeout bc ngx-quill library doesn't listen for input changes,\n // so we must destroy and create the component each time config is updated\n setTimeout(() => {\n this._configSet.next(true)\n }, 0)\n }\n\n private _getConfigOrDefault<K extends keyof TheSeamQuillEditorConfig>(prop: K): TheSeamQuillEditorConfig[K] {\n if (this._customConfig && Object.prototype.hasOwnProperty.call(this._customConfig, prop)) {\n return this._customConfig[prop]\n }\n return THESEAM_QUILL_EDITOR_CONFIG_DEFAULT[prop]\n }\n\n private _updateQuillConfig() {\n if (this._configSet.value) {\n this._buildQuillConfig()\n }\n }\n\n // Not usable, bc config has to be set immediately, potentially before mentions populate.\n // To set customDataAttributes, provide a custom config.\n // private _getCustomDataAttributes(mentions: TheSeamQuillMentionMenuOption[]): string[] {\n // return mentions.reduce((acc, mention) => {\n // const keys = Object.keys(mention)\n\n // keys.forEach(key => {\n // if (acc.findIndex(a => a === key) === -1) {\n // acc.push(key)\n // }\n // })\n\n // return acc\n // }, <string[]>[] satisfies string[])\n // }\n\n get value(): string | undefined | null {\n return this._value\n }\n set value(value: string | undefined | null) {\n this._value = value\n\n if (this.onChange) { this.onChange(value) }\n if (this.onTouched) { this.onTouched() }\n }\n private _value: string | undefined | null\n\n writeValue(value: any): void {\n this._isWritingValue = true\n\n this.formControl.setValue(value)\n this.value = value\n\n this._isWritingValue = false\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.readOnly = isDisabled\n }\n\n _onEditorCreated(event: any) {\n this.quillEditorCreated.emit(event)\n }\n\n _onEditorChanged(event: EditorChangeContent | EditorChangeSelection) {\n this.quillEditorChanged.emit(event)\n }\n\n _onContentChanged(event: ContentChange) {\n this.quillContentChanged.emit(event)\n\n this._updateMentionsFromDelta(event.content)\n }\n\n _onSelectionChanged(event: SelectionChange) {\n this.quillSelectionChanged.emit(event)\n }\n\n _onFocus(event: Focus) {\n this.quillFocus.emit(event)\n }\n\n _onBlur(event: Blur) {\n this.quillBlur.emit(event)\n\n if (this.onTouched) {\n this.onTouched()\n }\n }\n\n /**\n * Hacky way to track mention inserts/deletes\n */\n private _updateMentionsFromDelta(content: Delta) {\n if (notNullOrUndefined(content.ops)) {\n const contentMentionIds = content.ops.map(o => o.insert?.mention?.id).filter(notNullOrUndefined)\n const selectedMentions = [ ...this._selectedMentions.value ]\n const mentionOptions = [ ...this._mentionItems.value || [] ]\n\n const newMentions: TheSeamQuillMentionMenuOption[] = contentMentionIds.reduce((acc, mentionId) => {\n const insertMention = mentionOptions.find(m => isMentionMenuOption(m) && m.id === mentionId)\n\n if (notNullOrUndefined(insertMention)) {\n acc.push(insertMention)\n }\n else {\n console.warn('Mention addition failed! Selected mention option not found:', mentionId)\n }\n\n return acc\n }, <TheSeamQuillMentionMenuOption[]>[])\n\n let emitUpdate = false\n if (selectedMentions.length !== newMentions.length) {\n // if the length has changed, we know an update occurred\n emitUpdate = true\n }\n else {\n // otherwise, test ids for old and new items to see if we need to emit a change\n const selectedMentionIds = this._selectedMentions.value.map(m => m.id)\n const newMentionIds = newMentions.map(m => m.id)\n\n if (\n selectedMentionIds.findIndex(m => !newMentionIds.includes(m)) !== -1 ||\n newMentionIds.findIndex(m => !selectedMentionIds.includes(m)) !== -1\n ) {\n emitUpdate = true\n }\n }\n\n if (emitUpdate) {\n this._selectedMentions.next(newMentions)\n }\n }\n }\n}\n","<div class=\"editor\" *ngIf=\"configSet$ | async\" [class.initializing]=\"!(initialized$ | async)\">\n <ng-container *ngIf=\"config$ | async as config\">\n <quill-editor\n #quillEditor\n seamInput\n [class.disabled]=\"readOnly\"\n [attr.disabled]=\"readOnly\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [readOnly]=\"readOnly\"\n [required]=\"required\"\n [minLength]=\"minLength\"\n [maxLength]=\"maxLength\"\n [format]=\"config.format\"\n [theme]=\"config.theme\"\n [modules]=\"config.modules\"\n [debug]=\"config.debug\"\n [formats]=\"config.formats\"\n [customToolbarPosition]=\"config.customToolbarPosition\"\n [sanitize]=\"config.sanitize\"\n [styles]=\"config.styles\"\n [strict]=\"config.strict\"\n [scrollingContainer]=\"config.scrollingContainer\"\n [bounds]=\"config.bounds\"\n [customOptions]=\"config.customOptions\"\n [customModules]=\"config.customModules\"\n [trackChanges]=\"config.trackChanges\"\n [preserveWhitespace]=\"config.preserveWhitespace\"\n [classes]=\"config.classes\"\n [trimOnValidation]=\"config.trimOnValidation\"\n [linkPlaceholder]=\"config.linkPlaceholder\"\n [compareValues]=\"config.compareValues\"\n [filterNull]=\"config.filterNull\"\n [debounceTime]=\"config.debounceTime\"\n [class.can-resize]=\"resizable\"\n (onEditorCreated)=\"_onEditorCreated($event)\"\n (onEditorChanged)=\"_onEditorChanged($event)\"\n (onContentChanged)=\"_onContentChanged($event)\"\n (onSelectionChanged)=\"_onSelectionChanged($event)\"\n (onFocus)=\"_onFocus($event)\"\n (onBlur)=\"_onBlur($event)\"></quill-editor>\n <ng-container *ngIf=\"displayCharacterCounter\">\n <ng-container\n [ngTemplateOutlet]=\"characterCounterTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: characterCount$ | async, minLength: minLength, maxLength: maxLength, characterCount: characterCount$ | async }\"></ng-container>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #characterCounter let-implicit let-minLength=\"minLength\" let-maxLength=\"maxLength\" let-characterCount=\"characterCount\">\n <div class=\"small text-black-50 text-right\">\n <ng-container *ngIf=\"characterCount || characterCount === 0\">\n Character Count:\n <span [class.text-danger]=\"characterCount && ((maxLength && characterCount > maxLength) || (minLength && characterCount < minLength))\">\n {{ characterCount | number }}\n </span>\n <ng-container *ngIf=\"maxLength\">\n / {{ maxLength }}\n </ng-container>\n <span *ngIf=\"minLength\" class=\"font-italic\">\n (minimum {{ minLength }} expected)\n </span>\n </ng-container>\n </div>\n</ng-template>\n","import { CustomModule, CustomOption, QuillModules } from 'ngx-quill'\r\nimport QuillType from 'quill'\r\n\r\nexport interface TheSeamQuillMentionMenuOption {\r\n /** Must be unique. */\r\n id: string\r\n\r\n /**\r\n * The value is used as the label for the mentions,\r\n * both in the text area and in the menu.\r\n */\r\n value: string\r\n\r\n /**\r\n * When `true`, this item will be included in the menu,\r\n * regardless of the search function applied.\r\n */\r\n searchIgnore?: boolean\r\n\r\n /**\r\n * If provided, will group items with the same `groupName`\r\n * under one header.\r\n */\r\n groupName?: string\r\n\r\n /** Any additional optional parameters */\r\n [key: string]: any\r\n}\r\n\r\nexport interface TheSeamQuillMentionMenuDivider {\r\n type: 'divider'\r\n disabled?: boolean\r\n}\r\n\r\nexport interface TheSeamQuillMentionMenuHeader {\r\n value: string\r\n type: 'groupName'\r\n disabled?: boolean\r\n}\r\n\r\nexport type TheSeamQuillMentionMenuItem = TheSeamQuillMentionMenuOption | TheSeamQuillMentionMenuDivider | TheSeamQuillMentionMenuHeader\r\n\r\nexport type TheSeamQuillMentionSearchFn = (\r\n source: TheSeamQuillMentionMenuItem[],\r\n textAfter: string,\r\n mentionChar: string\r\n) => TheSeamQuillMentionMenuItem[]\r\n\r\nexport type TheSeamQuillMentionSourceFn = (\r\n source: TheSeamQuillMentionMenuItem[],\r\n searchFn: TheSeamQuillMentionSearchFn,\r\n emptyListItem: TheSeamQuillMentionMenuItem | undefined,\r\n textAfter: string,\r\n renderList: (\r\n matches: {\r\n id: string\r\n value: string\r\n [key: string]: string | undefined\r\n }[],\r\n searchTerm: string\r\n ) => void,\r\n mentionChar: string\r\n) => void\r\n\r\n/**\r\n * Typed version of Options object, copied from quill-mention@v6.0.1 (typescript version)\r\n */\r\nexport interface TheSeamQuillMentionOptions {\r\n /**\r\n * Specifies which characters will cause the mention autocomplete to open\r\n * @default ['@']\r\n */\r\n mentionDenotationChars?: string[]\r\n\r\n /**\r\n * Whether to show the used denotation character in the mention item or not\r\n * @default true\r\n */\r\n showDenotationChar?: boolean\r\n\r\n /**\r\n * Allowed characters in search term triggering a search request using regular expressions. Can be a function that takes the denotationChar and returns a regex.\r\n * @default /^[a-zA-Z0-9_]*$/\r\n */\r\n allowedChars?: RegExp | ((char: string) => RegExp)\r\n\r\n /**\r\n * Minimum number of characters after the @ symbol triggering a search request\r\n * @default 0\r\n */\r\n minChars?: number\r\n\r\n /**\r\n * Maximum number of characters after the @ symbol triggering a search request\r\n * @default 31\r\n */\r\n maxChars?: number\r\n\r\n /**\r\n * Additional top offset of the mention container position\r\n * @default 2\r\n */\r\n offsetTop?: number\r\n\r\n /**\r\n * Additional left offset of the mention container position\r\n * @default 0\r\n */\r\n offsetLeft?: number\r\n\r\n /**\r\n * Whether or not the denotation character(s) should be isolated. For example, to avoid mentioning in an email.\r\n * @default false\r\n */\r\n isolateCharacter?: boolean\r\n\r\n /**\r\n * Only works if isolateCharacter is set to true. Whether or not the denotation character(s) can appear inline of the mention text. For example, to allow mentioning an email with the @ symbol as the denotation character.\r\n * @default false\r\n */\r\n allowInlineMentionChar?: boolean\r\n\r\n /**\r\n * When set to true, the mentions menu will be rendered above or below the quill container. Otherwise, the mentions menu will track the denotation character(s);\r\n * @default false\r\n */\r\n fixMentionsToQuill?: boolean\r\n\r\n /**\r\n * Options are 'normal' and 'fixed'. When 'fixed', the menu will be appended to the body and use fixed positioning. Use this if the menu is clipped by a parent element that's using `overflow:hidden\r\n * @default 'normal'\r\n */\r\n positioningStrategy?: 'normal' | 'fixed'\r\n\r\n /**\r\n * Options are 'bottom' and 'top'. Determines what the default orientation of the menu will be. Quill-mention will attempt to render the menu either above or below the editor. If 'top' is provided as a value, and there is not enough space above the editor, the menu will be rendered below. Vice versa, if there is not enough space below the editor, and 'bottom' is provided as a value (or no value is provided at all), the menu will be rendered above the editor.\r\n * @default 'bottom'\r\n */\r\n defaultMenuOrientation?: 'top' | 'bottom'\r\n\r\n /**\r\n * The name of the Quill Blot to be used for inserted mentions. A default implementation is provided named 'mention', which may be overridden with a custom blot.\r\n * @default 'mention'\r\n */\r\n blotName?: string\r\n\r\n /**\r\n * A list of data values you wish to be passed from your list data to the html node. (id, value, denotationChar, link, target are included by default).\r\n * @default ['id', 'value', 'denotationChar', 'link', 'target', 'disabled']\r\n */\r\n dataAttributes?: string[]\r\n\r\n /**\r\n * Link target for mentions with a link\r\n * @default '_blank'\r\n */\r\n linkTarget?: string\r\n\r\n /**\r\n * Style class to be used for list items (may be null)\r\n * @default 'ql-mention-list-item'\r\n */\r\n listItemClass?: string\r\n\r\n /**\r\n * Style class to be used for the mention list container (may be null)\r\n * @default 'ql-mention-list-container'\r\n */\r\n mentionContainerClass?: string\r\n\r\n /**\r\n * Style class to be used for the mention list (may be null)\r\n * @default 'ql-mention-list'\r\n */\r\n mentionListClass?: string\r\n\r\n /**\r\n * Whether or not insert 1 space after mention block in text\r\n * @default true\r\n */\r\n spaceAfterInsert?: boolean\r\n\r\n /**\r\n * An array of keyboard key codes that will trigger the select action for the mention dropdown. Default is ENTER key. See this reference for a list of numbers for each keyboard key.\r\n * @default [13]\r\n */\r\n selectKeys?: (string | number | string)[]\r\n\r\n /**\r\n * Required callback function to handle the search term and connect it to a data source for matches. The data source can be a local source or an AJAX request.\r\n * The callback should call renderList(matches, searchTerm); with matches of JSON Objects in an array to show the result for the user. The JSON Objects should have id and value but can also have other values to be used in renderItem for custom display.\r\n * @param textAfter\r\n * @param render\r\n * @param mentionChar\r\n * @returns\r\n */\r\n source: (\r\n textAfter: string,\r\n renderList: (\r\n matches: {\r\n id: string\r\n value: string\r\n [key: string]: string | undefined\r\n }[],\r\n searchTerm: string\r\n ) => void,\r\n mentionChar: string\r\n ) => void\r\n\r\n /**\r\n * Callback when mention dropdown is open.\r\n * @returns\r\n */\r\n onOpen?: () => boolean\r\n\r\n /**\r\n * Callback before the DOM of mention dropdown is removed.\r\n * @returns\r\n */\r\n onBeforeClose?: () => boolean\r\n\r\n /**\r\n * Callback when mention dropdown is closed.\r\n * @returns\r\n */\r\n onClose?: () => boolean\r\n\r\n /**\r\n * A function that gives you control over how matches from source are displayed. You can use this function to highlight the search term or change the design with custom HTML. This function will need to return either a string possibly containing unsanitized user content, or a class implementing the Node interface which will be treated as a sanitized DOM node.\r\n * @param item\r\n * @param searchTerm\r\n * @returns\r\n */\r\n renderItem?: (\r\n item: { id: string; value: string; [key: string]: unknown },\r\n searchTerm: string\r\n ) => string | HTMLElement\r\n\r\n /**\r\n * A function that returns the HTML for a loading message during async calls from source. The function will need to return either a string possibly containing unsanitized user content, or a class implementing the Node interface which will be treated as a sanitized DOM node. The default functions returns null to prevent a loading message.\r\n * @returns\r\n */\r\n renderLoading?: () => string | HTMLElement | null\r\n\r\n /**\r\n * Callback for a selected item. When overriding this method, insertItem should be used to insert item to the editor. This makes async requests possible.\r\n * @param item\r\n * @param insertItem\r\n */\r\n onSelect?: (\r\n item: DOMStringMap,\r\n insertItem: (\r\n data: Record<string, unknown>,\r\n programmaticInsert?: boolean,\r\n overriddenOptions?: object\r\n ) => void\r\n ) => void\r\n}\r\n\r\nexport interface TheSeamQuillModules extends QuillModules {\r\n mention?: Partial<TheSeamQuillMentionOptions>\r\n}\r\n\r\nexport const THESEAM_QUILL_FORMATS = [\r\n 'align',\r\n 'background',\r\n 'blockquote',\r\n 'bold',\r\n 'code-block',\r\n 'code',\r\n 'color',\r\n 'direction',\r\n 'font',\r\n 'header',\r\n 'image',\r\n 'indent',\r\n 'italic',\r\n 'link',\r\n 'list',\r\n 'script',\r\n 'size',\r\n 'strike',\r\n 'underline',\r\n 'video',\r\n 'mention'\r\n] as const\r\n\r\nexport type TheSeamQuillStyleFormat = (typeof THESEAM_QUILL_FORMATS)[number]\r\n\r\nexport type TheSeamQuillInputFormat = 'object' | 'html' | 'text' | 'json'\r\n\r\nexport interface TheSeamQuillEditorConfig {\r\n /**\r\n * The format of the text inside the editor.\r\n *\r\n * @default 'html'\r\n */\r\n format: TheSeamQuillInputFormat\r\n\r\n /** @default 'snow' */\r\n theme?: string\r\n\r\n /**\r\n * Used to set custom config for built-in and add-on modules.\r\n *\r\n * See `SEAM_QUILL_MODULES_DEFAULT` for default value.\r\n */\r\n modules?: TheSeamQuillModules\r\n\r\n /**\r\n * Console level for debug messages.\r\n *\r\n * @default `warn`\r\n */\r\n debug?: 'warn' | 'log' | 'error' | false\r\n\r\n /**\r\n * List of formats allowed in editor.\r\n *\r\n * See `SEAM_QUILL_FORMATS_DEFAULT` for default value.\r\n *\r\n * NOTE: Adding or removing a value will enable/disable that format\r\n * in the editor, but has no effect on the toolbar buttons.\r\n * To modify the toolbar display, update `modules.toolbar`.\r\n */\r\n formats?: TheSeamQuillStyleFormat[] | null\r\n\r\n /** @default 'top' */\r\n customToolbarPosition: 'top' | 'bottom'\r\n\r\n /**\r\n * When `true`, runs the control value through Angular's DOM sanitizer\r\n * before setting the value.\r\n *\r\n * @default false\r\n */\r\n sanitize: boolean\r\n\r\n /** Custom css styles to add to the `.ql-container` element. */\r\n styles?: { [key: string]: string } | null\r\n\r\n /**\r\n * When `false`, user interactions in the toolbar will emit even\r\n * if the editor is marked as `readOnly`. This allows the user to\r\n * make some formatting changes (e.g. creating a list) to a value\r\n * that should be disabled.\r\n *\r\n * @default true.\r\n */\r\n strict: boolean\r\n\r\n /**\r\n * An element or selector that specifies the scrolling element of the editor.\r\n *\r\n * Default scrollingContainer is the `.ql-editor` element.\r\n */\r\n scrollingContainer?: HTMLElement | string | null\r\n\r\n /**\r\n * An element or selector that specifies the confining element of the editor.\r\n *\r\n * Default boundary container is the document's `body` element.\r\n */\r\n bounds?: HTMLElement | string\r\n\r\n /**\r\n * Defines custom formats for the editor. Can be used to overwrite existing options.\r\n *\r\n * TODO: Research this more.\r\n */\r\n customOptions: CustomOption[]\r\n\r\n /**\r\n * Defines custom modules for the editor. Can be used to overwrite existing modules.\r\n *\r\n * TODO: Research this more.\r\n */\r\n customModules: CustomModule[]\r\n\r\n /**\r\n * When `user`, only change events from the user will trigger a model change.\r\n * This is the default behavior, and is preferred.\r\n *\r\n * Changing to `all` is not recommended.\r\n */\r\n trackChanges?: 'user' | 'all'\r\n\r\n /**\r\n * When `true`, preserves duplicated whitespaces.\r\n *\r\n * @default false\r\n */\r\n preserveWhitespace: boolean\r\n\r\n /** Custom classes to add to the `.ql-container` element. */\r\n classes?: string\r\n\r\n /**\r\n * When `true`, trims leading/trailing newlines when validation is run.\r\n *\r\n * @default false\r\n */\r\n trimOnValidation: boolean\r\n\r\n /**\r\n * Sets a placeholder for the link input in the hyperlink form.\r\n *\r\n * @default 'https://quilljs.com'\r\n */\r\n linkPlaceholder?: string\r\n\r\n /**\r\n * When `true`, does a basic compare (using JSON.stringify) between the old\r\n * and new value on `writeValue()`. If the values are the same, it skips the update.\r\n *\r\n * @default false\r\n */\r\n compareValues: boolean\r\n\r\n /**\r\n * When `true`, skips the update for null values on `writeValue()`.\r\n *\r\n * @default false\r\n */\r\n filterNull: boolean\r\n\r\n /**\r\n * Debounces `onContentChanged()`, `onEditorChanged()`, `ngModel` and form control `valueChange()`.\r\n *\r\n * Defaults to `undefined`, so changes always emit immediately.\r\n *\r\n * @default undefined\r\n */\r\n debounceTime?: number\r\n\r\n /**\r\n * @deprecated The `ngx-quill` library doesn't accurately handle undefined\r\n * inputs, and the default `valueGetter` function is impossible to reference here,\r\n * so this config option is not used.\r\n *\r\n * Defines custom logic for reading the html value of the editor.\r\n */\r\n valueGetter?: (\r\n quillEditor: QuillType,\r\n editorElement: HTMLElement\r\n ) => string | any\r\n\r\n /**\r\n * @deprecated The `ngx-quill` library doesn't accurately handle undefined\r\n * inputs, and the default `valueSetter` function is impossible to reference here,\r\n * so this config option is not used.\r\n *\r\n * Defines custom logic for setting the html value of the editor.\r\n */\r\n valueSetter?: (quillEditor: QuillType, value: any) => any\r\n}\r\n\r\nexport type TheSeamCharacterCounterFn = (\r\n value: string,\r\n format: TheSeamQuillInputFormat | undefined\r\n) => number\r\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { QuillModule } from 'ngx-quill';\nimport { RichTextComponent } from './rich-text/rich-text.component';\nimport { ReactiveFormsModule } from '@angular/forms';\n\n@NgModule({\n declarations: [\n RichTextComponent,\n ],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n QuillModule\n ],\n exports: [\n RichTextComponent,\n ]\n})\nexport class TheSeamRichTextModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { coerceBooleanProperty } from '@angular/cdk/coercion';
2
2
  import * as i0 from '@angular/core';
3
- import { InjectionToken, forwardRef, EventEmitter, Component, Optional, Inject, Input, Output, ViewChild, NgModule } from '@angular/core';
3
+ import { InjectionToken, forwardRef, EventEmitter, Component, Optional, Inject, Input, Output, ViewChild, HostListener, NgModule } from '@angular/core';
4
4
  import * as i2 from '@angular/forms';
5
5
  import { NG_VALUE_ACCESSOR, FormControl, ReactiveFormsModule } from '@angular/forms';
6
6
  import 'quill-mention';
@@ -371,6 +371,16 @@ class RichTextComponent {
371
371
  this._pollCalculatedRowHeight.next();
372
372
  }, 0);
373
373
  }
374
+ _handleKeydown(event) {
375
+ if (event.code === 'Escape') {
376
+ const qlEditor = this._quillEditor?.editorElem?.querySelector('.ql-editor');
377
+ if (notNullOrUndefined(qlEditor) && qlEditor === document.activeElement && qlEditor instanceof HTMLElement) {
378
+ event.preventDefault();
379
+ event.stopImmediatePropagation();
380
+ qlEditor.blur();
381
+ }
382
+ }
383
+ }
374
384
  constructor(_renderer, _customConfig) {
375
385
  this._renderer = _renderer;
376
386
  this._customConfig = _customConfig;
@@ -449,6 +459,14 @@ class RichTextComponent {
449
459
  }
450
460
  this._templateSet.next(true);
451
461
  }
462
+ ngOnDestroy() {
463
+ // hacky way to ensure mentions menu gets destroyed when component is destroyed
464
+ const mentionModule = this._quillEditor?.quillEditor.getModule('mention');
465
+ const hideMentionList = mentionModule?.hideMentionList;
466
+ if (hideMentionList && typeof hideMentionList === 'function') {
467
+ hideMentionList.call(mentionModule);
468
+ }
469
+ }
452
470
  _buildQuillConfig() {
453
471
  this._configSet.next(false);
454
472
  const config = {
@@ -624,7 +642,7 @@ class RichTextComponent {
624
642
  }
625
643
  }
626
644
  RichTextComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: RichTextComponent, deps: [{ token: i0.Renderer2 }, { token: THESEAM_QUILL_EDITOR_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component });
627
- RichTextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.7", type: RichTextComponent, selector: "seam-rich-text", inputs: { val: ["value", "val"], required: "required", placeholder: "placeholder", rows: "rows", resizable: "resizable", disableRichText: "disableRichText", displayCharacterCounter: "displayCharacterCounter", minLength: "minLength", maxLength: "maxLength", characterCounterTpl: "characterCounterTpl", characterCounterFn: "characterCounterFn", useMentions: "useMentions", mentionItems: "mentionItems", mentionSearchFn: "mentionSearchFn", mentionRenderListFn: "mentionRenderListFn", mentionListLoadingText: "mentionListLoadingText", mentionListEmptyText: "mentionListEmptyText" }, outputs: { quillEditorCreated: "quillEditorCreated", quillEditorChanged: "quillEditorChanged", quillContentChanged: "quillContentChanged", quillSelectionChanged: "quillSelectionChanged", quillFocus: "quillFocus", quillBlur: "quillBlur", mentionsUpdated: "mentionsUpdated" }, providers: [
645
+ RichTextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.7", type: RichTextComponent, selector: "seam-rich-text", inputs: { val: ["value", "val"], required: "required", placeholder: "placeholder", rows: "rows", resizable: "resizable", disableRichText: "disableRichText", displayCharacterCounter: "displayCharacterCounter", minLength: "minLength", maxLength: "maxLength", characterCounterTpl: "characterCounterTpl", characterCounterFn: "characterCounterFn", useMentions: "useMentions", mentionItems: "mentionItems", mentionSearchFn: "mentionSearchFn", mentionRenderListFn: "mentionRenderListFn", mentionListLoadingText: "mentionListLoadingText", mentionListEmptyText: "mentionListEmptyText" }, outputs: { quillEditorCreated: "quillEditorCreated", quillEditorChanged: "quillEditorChanged", quillContentChanged: "quillContentChanged", quillSelectionChanged: "quillSelectionChanged", quillFocus: "quillFocus", quillBlur: "quillBlur", mentionsUpdated: "mentionsUpdated" }, host: { listeners: { "keydown": "_handleKeydown($event)" } }, providers: [
628
646
  RICH_TEXT_VALUE_ACCESSOR
629
647
  ], viewQueries: [{ propertyName: "quillEditor", first: true, predicate: ["quillEditor"], descendants: true }, { propertyName: "defaultCharacterCounterTpl", first: true, predicate: ["characterCounter"], descendants: true }], ngImport: i0, template: "<div class=\"editor\" *ngIf=\"configSet$ | async\" [class.initializing]=\"!(initialized$ | async)\">\n <ng-container *ngIf=\"config$ | async as config\">\n <quill-editor\n #quillEditor\n seamInput\n [class.disabled]=\"readOnly\"\n [attr.disabled]=\"readOnly\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [readOnly]=\"readOnly\"\n [required]=\"required\"\n [minLength]=\"minLength\"\n [maxLength]=\"maxLength\"\n [format]=\"config.format\"\n [theme]=\"config.theme\"\n [modules]=\"config.modules\"\n [debug]=\"config.debug\"\n [formats]=\"config.formats\"\n [customToolbarPosition]=\"config.customToolbarPosition\"\n [sanitize]=\"config.sanitize\"\n [styles]=\"config.styles\"\n [strict]=\"config.strict\"\n [scrollingContainer]=\"config.scrollingContainer\"\n [bounds]=\"config.bounds\"\n [customOptions]=\"config.customOptions\"\n [customModules]=\"config.customModules\"\n [trackChanges]=\"config.trackChanges\"\n [preserveWhitespace]=\"config.preserveWhitespace\"\n [classes]=\"config.classes\"\n [trimOnValidation]=\"config.trimOnValidation\"\n [linkPlaceholder]=\"config.linkPlaceholder\"\n [compareValues]=\"config.compareValues\"\n [filterNull]=\"config.filterNull\"\n [debounceTime]=\"config.debounceTime\"\n [class.can-resize]=\"resizable\"\n (onEditorCreated)=\"_onEditorCreated($event)\"\n (onEditorChanged)=\"_onEditorChanged($event)\"\n (onContentChanged)=\"_onContentChanged($event)\"\n (onSelectionChanged)=\"_onSelectionChanged($event)\"\n (onFocus)=\"_onFocus($event)\"\n (onBlur)=\"_onBlur($event)\"></quill-editor>\n <ng-container *ngIf=\"displayCharacterCounter\">\n <ng-container\n [ngTemplateOutlet]=\"characterCounterTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: characterCount$ | async, minLength: minLength, maxLength: maxLength, characterCount: characterCount$ | async }\"></ng-container>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #characterCounter let-implicit let-minLength=\"minLength\" let-maxLength=\"maxLength\" let-characterCount=\"characterCount\">\n <div class=\"small text-black-50 text-right\">\n <ng-container *ngIf=\"characterCount || characterCount === 0\">\n Character Count:\n <span [class.text-danger]=\"characterCount && ((maxLength && characterCount > maxLength) || (minLength && characterCount < minLength))\">\n {{ characterCount | number }}\n </span>\n <ng-container *ngIf=\"maxLength\">\n / {{ maxLength }}\n </ng-container>\n <span *ngIf=\"minLength\" class=\"font-italic\">\n (minimum {{ minLength }} expected)\n </span>\n </ng-container>\n </div>\n</ng-template>\n", styles: [":host .editor{position:relative}:host .editor.initializing:before{content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;background:#f8f9fa;z-index:1}:host quill-editor.can-resize ::ng-deep .ql-editor{overflow:auto;resize:vertical}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i3.QuillEditorComponent, selector: "quill-editor" }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }] });
630
648
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: RichTextComponent, decorators: [{
@@ -692,6 +710,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImpor
692
710
  }], defaultCharacterCounterTpl: [{
693
711
  type: ViewChild,
694
712
  args: ['characterCounter']
713
+ }], _handleKeydown: [{
714
+ type: HostListener,
715
+ args: ['keydown', ['$event']]
695
716
  }] } });
696
717
 
697
718
  const THESEAM_QUILL_FORMATS = [
@@ -1 +1 @@
1
- {"version":3,"file":"theseam-ui-common-rich-text.mjs","sources":["../../../projects/ui-common/rich-text/utils/utils.ts","../../../projects/ui-common/rich-text/rich-text/rich-text.component.ts","../../../projects/ui-common/rich-text/rich-text/rich-text.component.html","../../../projects/ui-common/rich-text/utils/models.ts","../../../projects/ui-common/rich-text/rich-text.module.ts","../../../projects/ui-common/rich-text/theseam-ui-common-rich-text.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\"\r\nimport { QuillToolbarConfig } from \"ngx-quill\"\r\nimport { TheSeamQuillModules, TheSeamQuillStyleFormat, TheSeamQuillEditorConfig, TheSeamQuillMentionMenuOption, TheSeamQuillInputFormat, TheSeamQuillMentionOptions, TheSeamQuillMentionSourceFn, TheSeamQuillMentionSearchFn, TheSeamCharacterCounterFn, TheSeamQuillMentionMenuItem } from \"./models\"\r\nimport { isNullOrUndefined, notNullOrUndefined, notNullOrUndefinedOrEmpty } from \"@theseam/ui-common/utils\"\r\n\r\nexport const HTML_ENTITY_REGEX = /<[^>]+>/gm\r\n\r\nexport const THESEAM_QUILL_TOOLBAR_OPTIONS_DEFAULT: QuillToolbarConfig = [\r\n ['bold', 'italic', 'underline', 'strike'],\r\n [{ header: [0, 1, 2, 3, 4, 5] }],\r\n [{ list: 'ordered' }, { list: 'bullet' }],\r\n [{ align: [] }],\r\n ['link'],\r\n ['clean'],\r\n]\r\n\r\nexport const THESEAM_QUILL_MENTION_OPTIONS_DEFAULT: Partial<TheSeamQuillMentionOptions> = {\r\n spaceAfterInsert: false,\r\n positioningStrategy: 'fixed',\r\n dataAttributes: [ 'type' ]\r\n}\r\n\r\nexport const THESEAM_QUILL_MODULES_DEFAULT: TheSeamQuillModules = {\r\n toolbar: THESEAM_QUILL_TOOLBAR_OPTIONS_DEFAULT\r\n}\r\n\r\nexport const THESEAM_QUILL_FORMATS_DEFAULT: TheSeamQuillStyleFormat[] = [\r\n 'align',\r\n 'bold',\r\n 'header',\r\n 'indent',\r\n 'italic',\r\n 'link',\r\n 'list',\r\n 'size',\r\n 'strike',\r\n 'underline',\r\n 'mention'\r\n]\r\n\r\nexport const THESEAM_QUILL_EDITOR_CONFIG_DEFAULT: TheSeamQuillEditorConfig = {\r\n format: 'html',\r\n modules: THESEAM_QUILL_MODULES_DEFAULT,\r\n formats: THESEAM_QUILL_FORMATS_DEFAULT,\r\n linkPlaceholder: 'https://google.com',\r\n customToolbarPosition: 'top',\r\n sanitize: false,\r\n strict: true,\r\n customOptions: [],\r\n customModules: [],\r\n preserveWhitespace: false,\r\n trimOnValidation: false,\r\n compareValues: false,\r\n filterNull: false\r\n}\r\n\r\nexport const THESEAM_QUILL_EDITOR_CONFIG = new InjectionToken<TheSeamQuillEditorConfig>('TheSeamQuillEditorConfig')\r\n\r\nexport const defaultHtmlCharacterCounterFn: TheSeamCharacterCounterFn = (value: string, format: TheSeamQuillInputFormat | undefined): number => {\r\n if (format === 'html') {\r\n return value.replace(HTML_ENTITY_REGEX, ' ').replace(/\\s\\s+/g, ' ').trim().length\r\n }\r\n else if (format === 'text') {\r\n return value.replace(/\\s\\s+/g, ' ').trim().length\r\n }\r\n else {\r\n console.warn(`Format ${format} not supported!`)\r\n return 0\r\n }\r\n}\r\n\r\nexport function isMentionMenuOption(value: TheSeamQuillMentionMenuItem | undefined): value is TheSeamQuillMentionMenuOption {\r\n if (isNullOrUndefined(value) || typeof value !== 'object') {\r\n return false\r\n }\r\n\r\n return Object.prototype.hasOwnProperty.call(value, 'id')\r\n}\r\n\r\nexport const defaultMentionSearchFn: TheSeamQuillMentionSearchFn = (source: TheSeamQuillMentionMenuItem[], textAfter: string, mentionChar: string) => {\r\n return source.filter(u => {\r\n if (!isMentionMenuOption(u) || u.searchIgnore === true) {\r\n return true\r\n }\r\n\r\n return u.value.toLowerCase().includes(textAfter.toLowerCase())\r\n })\r\n}\r\n\r\nexport const defaultMentionRenderListFn: TheSeamQuillMentionSourceFn = (source: TheSeamQuillMentionMenuItem[], searchFn: TheSeamQuillMentionSearchFn, emptyListItem: TheSeamQuillMentionMenuItem | undefined, textAfter: string, renderList: (list: any[], searchTerm: string) => any, mentionChar: string) => {\r\n let list = searchFn(source, textAfter, mentionChar)\r\n\r\n if (list.length === 0 && notNullOrUndefined(emptyListItem)) {\r\n list.push(emptyListItem)\r\n }\r\n else {\r\n let reduceIdx = 0\r\n list = list.reduce((acc, mention) => {\r\n const previousMenuItem = acc[reduceIdx - 1]\r\n const previousMenuItemGroupName = isMentionMenuOption(previousMenuItem) ? previousMenuItem.groupName : undefined\r\n if (isMentionMenuOption(mention)\r\n && notNullOrUndefinedOrEmpty(mention.groupName)\r\n && mention.groupName !== previousMenuItemGroupName\r\n ) {\r\n acc.push({\r\n value: mention.groupName,\r\n disabled: true,\r\n type: 'groupName'\r\n })\r\n\r\n reduceIdx++\r\n }\r\n\r\n if (!isMentionMenuOption(mention)) {\r\n mention.disabled = true\r\n }\r\n\r\n acc.push(mention)\r\n reduceIdx++\r\n\r\n return acc\r\n }, <TheSeamQuillMentionMenuItem[]>[] satisfies TheSeamQuillMentionMenuItem[])\r\n }\r\n\r\n renderList(list, textAfter)\r\n}\r\n\r\n// Keeping this as an example for a custom menu item.\r\n// There doesn't appear to be a better way of passing in a custom template.\r\n// export const defaultMentionRenderItem = (item: TheSeamQuillMentionListItem) => {\r\n // if (item.type === 'groupName') {\r\n // const text = document.createElement('div')\r\n // text.setAttribute('class', 'small text-black-50')\r\n // text.innerText = item.value\r\n\r\n // return text.outerHTML\r\n // }\r\n // else if (item.type === 'divider') {\r\n // const div = document.createElement('hr')\r\n // div.setAttribute('class', 'my-2')\r\n // return div.outerHTML\r\n // }\r\n // else {\r\n // return item.value\r\n // }\r\n// }\r\n","import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { AfterViewInit, Component, EventEmitter, Inject, Input, OnInit, Optional, Output, Provider, Renderer2, TemplateRef, ViewChild, forwardRef } from '@angular/core';\nimport { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { Blur, ContentChange, EditorChangeContent, EditorChangeSelection, Focus, QuillEditorComponent, SelectionChange } from 'ngx-quill';\nimport { Delta } from 'quill';\nimport 'quill-mention';\nimport { BehaviorSubject, Observable, Subject, combineLatest, filter, lastValueFrom, map, of, shareReplay, startWith, switchMap, take, tap } from 'rxjs';\n\nimport { isNullOrUndefined, notNullOrUndefined } from '@theseam/ui-common/utils';\nimport { TheSeamCharacterCounterFn, TheSeamQuillEditorConfig, TheSeamQuillMentionMenuItem, TheSeamQuillMentionMenuOption, TheSeamQuillMentionSearchFn, TheSeamQuillMentionSourceFn, TheSeamQuillModules } from '../utils/models';\nimport { THESEAM_QUILL_EDITOR_CONFIG, THESEAM_QUILL_EDITOR_CONFIG_DEFAULT, THESEAM_QUILL_MENTION_OPTIONS_DEFAULT, defaultHtmlCharacterCounterFn, defaultMentionRenderListFn, defaultMentionSearchFn, isMentionMenuOption } from '../utils/utils';\n\nexport const RICH_TEXT_VALUE_ACCESSOR: Provider = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => RichTextComponent),\n multi: true\n}\n\n@Component({\n selector: 'seam-rich-text',\n templateUrl: './rich-text.component.html',\n styleUrls: ['./rich-text.component.scss'],\n providers: [\n RICH_TEXT_VALUE_ACCESSOR\n ]\n})\nexport class RichTextComponent implements OnInit, AfterViewInit, ControlValueAccessor {\n\n onChange: any\n onTouched: any\n\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input('value') val: string | undefined\n\n formControl = new FormControl<string | null>(null)\n\n @Input()\n get required(): boolean {\n return this._required\n }\n set required(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._required = coerceBooleanProperty(value)\n }\n }\n private _required = false\n\n /** @default '' (empty string) */\n @Input()\n get placeholder(): string {\n return this._placeholder\n }\n set placeholder(value: string | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._placeholder = value\n }\n }\n private _placeholder = ''\n\n /**\n * Initial rows visible in text area, set using `height` and `minHeight`.\n *\n * NOTE: Resizable editors will not be able to size below the height calculated from this value.\n *\n * @default 5\n */\n @Input()\n get rows(): number {\n return this._rows\n }\n set rows(value: number | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._rows = value\n\n this._pollCalculatedRowHeight.next()\n }\n }\n private _rows = 5\n\n /**\n * When `true`, text area can be resized vertically.\n *\n * @default true\n */\n @Input()\n get resizable(): boolean {\n return this._resizable\n }\n set resizable(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._resizable = coerceBooleanProperty(value)\n }\n }\n private _resizable = true\n\n /** @default false */\n get readOnly(): boolean {\n return this._readOnly\n }\n set readOnly(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._readOnly = coerceBooleanProperty(value)\n }\n }\n private _readOnly = false\n\n // TODO: fix bug where initial html value is rendered in plain text\n /**\n * When `true`, overrides all other provided settings to present the editor\n * as a standard textbox.\n *\n * NOTE: For the moment, `<p></p>` tags are still allowed, triggered by the `Enter` key.\n * https://github.com/slab/quill/issues/1432\n *\n * @default false\n */\n @Input()\n get disableRichText(): boolean {\n return this._disableRichText\n }\n set disableRichText(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._disableRichText = coerceBooleanProperty(value)\n\n this._updateQuillConfig()\n }\n }\n private _disableRichText = false\n\n /**\n * When `true`, displays a character counter at the bottom of the editor.\n * Character counter text is determined by values provided in `minLength`\n * and `maxLength`.\n *\n * The default count algorithm strips out html entities and replaces them\n * with spaces to get the string length. To override this behavior, pass\n * a custom function to `characterCounterFn`.\n *\n * To override default character counter display, pass a custom template to `characterCountTpl`.\n *\n * @default false\n */\n @Input()\n get displayCharacterCounter(): boolean {\n return this._displayCharacterCounter\n }\n set displayCharacterCounter(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._displayCharacterCounter = coerceBooleanProperty(value)\n }\n }\n private _displayCharacterCounter = false\n\n @Input()\n get minLength(): number | undefined {\n return this._minLength\n }\n set minLength(value: number | undefined) {\n if (notNullOrUndefined(value)) {\n this._minLength = value\n }\n }\n private _minLength: number | undefined\n\n @Input()\n get maxLength(): number | undefined {\n return this._maxLength\n }\n set maxLength(value: number | undefined) {\n if (notNullOrUndefined(value)) {\n this._maxLength = value\n }\n }\n private _maxLength: number | undefined\n\n /**\n * Set to override default character counter display.\n *\n * Template context includes variables `minLength`, `maxLength`, and `characterCount`.\n */\n @Input()\n get characterCounterTpl(): TemplateRef<any> | null {\n return this._characterCounterTpl\n }\n set characterCounterTpl(value) {\n if (notNullOrUndefined(value)) {\n this._characterCounterTpl = value\n }\n }\n private _characterCounterTpl: TemplateRef<any> | null = null\n\n /**\n * Set to override default counter function, which strips html entities and\n * replaces them with a space.\n */\n @Input() get characterCounterFn(): TheSeamCharacterCounterFn {\n return this._characterCounterFn\n }\n set characterCounterFn(value: TheSeamCharacterCounterFn | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._characterCounterFn = value\n }\n }\n private _characterCounterFn = defaultHtmlCharacterCounterFn\n\n /**\n * If `true`, component will configure the Quill editor with the quill-mentions extension\n * and listen for values passed to `mentionItems` to populate the mentions menu.\n *\n * @default false\n */\n @Input()\n get useMentions(): boolean {\n return this._useMentions\n }\n set useMentions(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._useMentions = coerceBooleanProperty(value)\n\n this._updateQuillConfig()\n }\n }\n private _useMentions: boolean = false\n\n /**\n * List of users, user groups, or other entities to display in mentions menu.\n * Minimum required properties are `id` (unique) and `value`, which acts as the label.\n *\n * By default, the menu is triggered by typing the `@` symbol into the text area.\n */\n @Input()\n get mentionItems(): TheSeamQuillMentionMenuItem[] | null | undefined {\n return this._mentionItems.value\n }\n set mentionItems(value: TheSeamQuillMentionMenuItem[] | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._mentionItems.next(value)\n }\n }\n private _mentionItems = new BehaviorSubject<TheSeamQuillMentionMenuItem[] | null | undefined>(undefined)\n public mentionItems$ = this._mentionItems.asObservable().pipe(\n filter(mentions => notNullOrUndefined(mentions) && mentions.length > 0),\n shareReplay({ bufferSize: 1, refCount: true })\n )\n\n /**\n * Set to override default search function when user is typing a mention.\n */\n @Input()\n get mentionSearchFn(): TheSeamQuillMentionSearchFn {\n return this._mentionSearchFn\n }\n set mentionSearchFn(value: TheSeamQuillMentionSearchFn | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._mentionSearchFn = value\n }\n }\n private _mentionSearchFn: TheSeamQuillMentionSearchFn = defaultMentionSearchFn\n\n /**\n * Set to override default render function for mentions list.\n *\n * Function should call `renderList`.\n */\n @Input()\n get mentionRenderListFn(): TheSeamQuillMentionSourceFn {\n return this._mentionRenderListFn\n }\n set mentionRenderListFn(value: TheSeamQuillMentionSourceFn | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._mentionRenderListFn = value\n }\n }\n private _mentionRenderListFn: TheSeamQuillMentionSourceFn = defaultMentionRenderListFn\n\n /**\n * Set to override default text shown while mention items are loading.\n *\n * @default 'Loading...'\n */\n @Input()\n get mentionListLoadingText(): string {\n return this._mentionListLoadingText\n }\n set mentionListLoadingText(value: string | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._mentionListLoadingText = value\n }\n }\n private _mentionListLoadingText: string = 'Loading...'\n\n /**\n * Set to override default text shown when a mention search returns no items.\n *\n * @default 'No matches found.'\n */\n @Input()\n get mentionListEmptyText(): string {\n return this._mentionListEmptyText\n }\n set mentionListEmptyText(value: string | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._mentionListEmptyText = value\n }\n }\n private _mentionListEmptyText: string = 'No matches found.'\n\n get mentionListEmptyItem(): TheSeamQuillMentionMenuOption {\n return {\n id: 'undefined',\n value: this.mentionListEmptyText,\n disabled: true,\n emptyList: true\n }\n }\n\n @Output() quillEditorCreated: EventEmitter<any> = new EventEmitter()\n @Output() quillEditorChanged: EventEmitter<EditorChangeContent | EditorChangeSelection> = new EventEmitter()\n @Output() quillContentChanged: EventEmitter<ContentChange> = new EventEmitter()\n @Output() quillSelectionChanged: EventEmitter<SelectionChange> = new EventEmitter()\n @Output() quillFocus: EventEmitter<Focus> = new EventEmitter()\n @Output() quillBlur: EventEmitter<Blur> = new EventEmitter()\n\n @Output() mentionsUpdated: EventEmitter<TheSeamQuillMentionMenuOption[]> = new EventEmitter()\n\n @ViewChild('quillEditor')\n get quillEditor(): TemplateRef<QuillEditorComponent> | undefined {\n return this._quillEditor\n }\n set quillEditor(value: TemplateRef<QuillEditorComponent> | undefined) {\n this._quillEditor = value\n\n // setTimeout because full html isn't available until the next tick\n setTimeout(() => {\n this._pollCalculatedRowHeight.next()\n }, 0)\n }\n private _quillEditor: TemplateRef<QuillEditorComponent> | undefined\n\n @ViewChild('characterCounter') defaultCharacterCounterTpl: TemplateRef<any> | undefined\n\n private _isWritingValue = false\n\n private _pollCalculatedRowHeight = new Subject<void>()\n\n private _configSet = new BehaviorSubject<boolean>(false)\n public configSet$ = this._configSet.asObservable()\n\n private _stylesSet = new BehaviorSubject<boolean>(false)\n private _templateSet = new BehaviorSubject<boolean>(false)\n\n public initialized$: Observable<boolean>\n\n public characterCount$: Observable<number>\n\n private _config = new BehaviorSubject<TheSeamQuillEditorConfig | undefined>(undefined)\n public config$ = this._config.asObservable()\n\n private _selectedMentions = new BehaviorSubject<TheSeamQuillMentionMenuOption[]>([])\n public selectedMentions$ = this._selectedMentions.asObservable()\n\n constructor(\n private readonly _renderer: Renderer2,\n @Optional() @Inject(THESEAM_QUILL_EDITOR_CONFIG) private _customConfig?: TheSeamQuillEditorConfig\n ) {\n this.initialized$ = combineLatest([\n this._configSet.asObservable(),\n this._stylesSet.asObservable(),\n this._templateSet.asObservable(),\n ]).pipe(\n map(sets => sets.findIndex(s => !s) === -1)\n )\n\n this.characterCount$ = this.initialized$.pipe(\n filter(i => i),\n switchMap(() => {\n if (notNullOrUndefined(this.formControl)) {\n return this.formControl.valueChanges.pipe(\n startWith(this.formControl.value),\n map(v => this.characterCounterFn(v || '' as string, this._config.value?.format)),\n )\n }\n\n return of(0)\n })\n )\n\n this.selectedMentions$.pipe(\n tap(mentions => this.mentionsUpdated.emit(mentions))\n ).subscribe()\n }\n\n ngOnInit(): void {\n // TODO: test this more\n // ignore quill initial valueChange event, to keep functionality in line with other inputs\n let initialEmitComplete = false\n this._configSet.pipe(\n filter(s => s),\n switchMap(() => this.formControl.valueChanges.pipe(\n // skip(1),\n take(1),\n tap(() => initialEmitComplete = true)\n ))\n ).subscribe()\n\n this.formControl.valueChanges.pipe(\n filter(() => !this._isWritingValue && initialEmitComplete),\n tap(value => this.value = value)\n ).subscribe()\n\n this._pollCalculatedRowHeight.asObservable().pipe(\n tap(() => {\n this._stylesSet.next(false)\n\n const calculatedRowsHeight = `${this.rows * 1.5}rem`\n\n if (notNullOrUndefined(this.rows) && notNullOrUndefined(this._quillEditor)) {\n const editorEl = this._quillEditor.elementRef.nativeElement.querySelector('.ql-editor')\n\n if (notNullOrUndefined(editorEl)) {\n this._renderer.setStyle(editorEl, 'height', calculatedRowsHeight)\n this._renderer.setStyle(editorEl, 'min-height', calculatedRowsHeight)\n }\n }\n\n this._stylesSet.next(true)\n })\n ).subscribe()\n\n this._buildQuillConfig()\n }\n\n ngAfterViewInit(): void {\n if (isNullOrUndefined(this.characterCounterTpl)) {\n this.characterCounterTpl = this.defaultCharacterCounterTpl || null\n }\n\n this._templateSet.next(true)\n }\n\n private _buildQuillConfig() {\n this._configSet.next(false)\n\n const config: TheSeamQuillEditorConfig = {\n ...THESEAM_QUILL_EDITOR_CONFIG_DEFAULT\n }\n\n if (this.disableRichText) {\n config.format = 'text'\n config.formats = []\n config.modules = {\n toolbar: false\n }\n }\n else {\n config.format = this._getConfigOrDefault('format')\n config.formats = this._getConfigOrDefault('formats')\n config.modules = {\n ...this._getConfigOrDefault('modules')\n }\n }\n\n if (this.useMentions) {\n const mentionModules: TheSeamQuillModules = {\n ...config.modules,\n mention: {\n ...THESEAM_QUILL_MENTION_OPTIONS_DEFAULT,\n renderLoading: () => this.mentionListLoadingText,\n source: async (searchTerm: string, renderList: (list: any[], searchTerm: string) => void, mentionChar: string) => {\n // this function is called every time the menu is triggered,\n // so it will always have the latest value from mentionItems$\n const mentionsAsync = await lastValueFrom(this.mentionItems$.pipe(take(1)))\n\n if (notNullOrUndefined(mentionsAsync)) {\n this.mentionRenderListFn(mentionsAsync, this.mentionSearchFn, this.mentionListEmptyItem, searchTerm, renderList, mentionChar)\n }\n },\n ...config.modules?.mention,\n }\n }\n\n config.modules = mentionModules\n }\n\n config.theme = this._getConfigOrDefault('theme')\n config.debug = this._getConfigOrDefault('debug')\n config.customToolbarPosition = this._getConfigOrDefault('customToolbarPosition')\n config.sanitize = this._getConfigOrDefault('sanitize')\n config.styles = this._getConfigOrDefault('styles')\n config.strict = this._getConfigOrDefault('strict')\n config.scrollingContainer = this._getConfigOrDefault('scrollingContainer')\n config.bounds = this._getConfigOrDefault('bounds')\n config.customOptions = this._getConfigOrDefault('customOptions')\n config.customModules = this._getConfigOrDefault('customModules')\n config.trackChanges = this._getConfigOrDefault('trackChanges')\n config.preserveWhitespace = this._getConfigOrDefault('preserveWhitespace')\n config.classes = this._getConfigOrDefault('classes')\n config.trimOnValidation = this._getConfigOrDefault('trimOnValidation')\n config.linkPlaceholder = this._getConfigOrDefault('linkPlaceholder')\n config.compareValues = this._getConfigOrDefault('compareValues')\n config.filterNull = this._getConfigOrDefault('filterNull')\n config.debounceTime = this._getConfigOrDefault('debounceTime')\n\n this._config.next(config)\n\n // setTimeout bc ngx-quill library doesn't listen for input changes,\n // so we must destroy and create the component each time config is updated\n setTimeout(() => {\n this._configSet.next(true)\n }, 0)\n }\n\n private _getConfigOrDefault<K extends keyof TheSeamQuillEditorConfig>(prop: K): TheSeamQuillEditorConfig[K] {\n if (this._customConfig && Object.prototype.hasOwnProperty.call(this._customConfig, prop)) {\n return this._customConfig[prop]\n }\n return THESEAM_QUILL_EDITOR_CONFIG_DEFAULT[prop]\n }\n\n private _updateQuillConfig() {\n if (this._configSet.value) {\n this._buildQuillConfig()\n }\n }\n\n // Not usable, bc config has to be set immediately, potentially before mentions populate.\n // To set customDataAttributes, provide a custom config.\n // private _getCustomDataAttributes(mentions: TheSeamQuillMentionMenuOption[]): string[] {\n // return mentions.reduce((acc, mention) => {\n // const keys = Object.keys(mention)\n\n // keys.forEach(key => {\n // if (acc.findIndex(a => a === key) === -1) {\n // acc.push(key)\n // }\n // })\n\n // return acc\n // }, <string[]>[] satisfies string[])\n // }\n\n get value(): string | undefined | null {\n return this._value\n }\n set value(value: string | undefined | null) {\n this._value = value\n\n if (this.onChange) { this.onChange(value) }\n if (this.onTouched) { this.onTouched() }\n }\n private _value: string | undefined | null\n\n writeValue(value: any): void {\n this._isWritingValue = true\n\n this.formControl.setValue(value)\n this.value = value\n\n this._isWritingValue = false\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.readOnly = isDisabled\n }\n\n _onEditorCreated(event: any) {\n this.quillEditorCreated.emit(event)\n }\n\n _onEditorChanged(event: EditorChangeContent | EditorChangeSelection) {\n this.quillEditorChanged.emit(event)\n }\n\n _onContentChanged(event: ContentChange) {\n this.quillContentChanged.emit(event)\n\n this._updateMentionsFromDelta(event.content)\n }\n\n _onSelectionChanged(event: SelectionChange) {\n this.quillSelectionChanged.emit(event)\n }\n\n _onFocus(event: Focus) {\n this.quillFocus.emit(event)\n }\n\n _onBlur(event: Blur) {\n this.quillBlur.emit(event)\n\n if (this.onTouched) {\n this.onTouched()\n }\n }\n\n /**\n * Hacky way to track mention inserts/deletes\n */\n private _updateMentionsFromDelta(content: Delta) {\n if (notNullOrUndefined(content.ops)) {\n const contentMentionIds = content.ops.map(o => o.insert?.mention?.id).filter(notNullOrUndefined)\n const selectedMentions = [ ...this._selectedMentions.value ]\n const mentionOptions = [ ...this._mentionItems.value || [] ]\n\n const newMentions: TheSeamQuillMentionMenuOption[] = contentMentionIds.reduce((acc, mentionId) => {\n const insertMention = mentionOptions.find(m => isMentionMenuOption(m) && m.id === mentionId)\n\n if (notNullOrUndefined(insertMention)) {\n acc.push(insertMention)\n }\n else {\n console.warn('Mention addition failed! Selected mention option not found:', mentionId)\n }\n\n return acc\n }, <TheSeamQuillMentionMenuOption[]>[])\n\n let emitUpdate = false\n if (selectedMentions.length !== newMentions.length) {\n // if the length has changed, we know an update occurred\n emitUpdate = true\n }\n else {\n // otherwise, test ids for old and new items to see if we need to emit a change\n const selectedMentionIds = this._selectedMentions.value.map(m => m.id)\n const newMentionIds = newMentions.map(m => m.id)\n\n if (\n selectedMentionIds.findIndex(m => !newMentionIds.includes(m)) !== -1 ||\n newMentionIds.findIndex(m => !selectedMentionIds.includes(m)) !== -1\n ) {\n emitUpdate = true\n }\n }\n\n if (emitUpdate) {\n this._selectedMentions.next(newMentions)\n }\n }\n }\n}\n","<div class=\"editor\" *ngIf=\"configSet$ | async\" [class.initializing]=\"!(initialized$ | async)\">\n <ng-container *ngIf=\"config$ | async as config\">\n <quill-editor\n #quillEditor\n seamInput\n [class.disabled]=\"readOnly\"\n [attr.disabled]=\"readOnly\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [readOnly]=\"readOnly\"\n [required]=\"required\"\n [minLength]=\"minLength\"\n [maxLength]=\"maxLength\"\n [format]=\"config.format\"\n [theme]=\"config.theme\"\n [modules]=\"config.modules\"\n [debug]=\"config.debug\"\n [formats]=\"config.formats\"\n [customToolbarPosition]=\"config.customToolbarPosition\"\n [sanitize]=\"config.sanitize\"\n [styles]=\"config.styles\"\n [strict]=\"config.strict\"\n [scrollingContainer]=\"config.scrollingContainer\"\n [bounds]=\"config.bounds\"\n [customOptions]=\"config.customOptions\"\n [customModules]=\"config.customModules\"\n [trackChanges]=\"config.trackChanges\"\n [preserveWhitespace]=\"config.preserveWhitespace\"\n [classes]=\"config.classes\"\n [trimOnValidation]=\"config.trimOnValidation\"\n [linkPlaceholder]=\"config.linkPlaceholder\"\n [compareValues]=\"config.compareValues\"\n [filterNull]=\"config.filterNull\"\n [debounceTime]=\"config.debounceTime\"\n [class.can-resize]=\"resizable\"\n (onEditorCreated)=\"_onEditorCreated($event)\"\n (onEditorChanged)=\"_onEditorChanged($event)\"\n (onContentChanged)=\"_onContentChanged($event)\"\n (onSelectionChanged)=\"_onSelectionChanged($event)\"\n (onFocus)=\"_onFocus($event)\"\n (onBlur)=\"_onBlur($event)\"></quill-editor>\n <ng-container *ngIf=\"displayCharacterCounter\">\n <ng-container\n [ngTemplateOutlet]=\"characterCounterTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: characterCount$ | async, minLength: minLength, maxLength: maxLength, characterCount: characterCount$ | async }\"></ng-container>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #characterCounter let-implicit let-minLength=\"minLength\" let-maxLength=\"maxLength\" let-characterCount=\"characterCount\">\n <div class=\"small text-black-50 text-right\">\n <ng-container *ngIf=\"characterCount || characterCount === 0\">\n Character Count:\n <span [class.text-danger]=\"characterCount && ((maxLength && characterCount > maxLength) || (minLength && characterCount < minLength))\">\n {{ characterCount | number }}\n </span>\n <ng-container *ngIf=\"maxLength\">\n / {{ maxLength }}\n </ng-container>\n <span *ngIf=\"minLength\" class=\"font-italic\">\n (minimum {{ minLength }} expected)\n </span>\n </ng-container>\n </div>\n</ng-template>\n","import { CustomModule, CustomOption, QuillModules } from 'ngx-quill'\r\nimport QuillType from 'quill'\r\n\r\nexport interface TheSeamQuillMentionMenuOption {\r\n /** Must be unique. */\r\n id: string\r\n\r\n /**\r\n * The value is used as the label for the mentions,\r\n * both in the text area and in the menu.\r\n */\r\n value: string\r\n\r\n /**\r\n * When `true`, this item will be included in the menu,\r\n * regardless of the search function applied.\r\n */\r\n searchIgnore?: boolean\r\n\r\n /**\r\n * If provided, will group items with the same `groupName`\r\n * under one header.\r\n */\r\n groupName?: string\r\n\r\n /** Any additional optional parameters */\r\n [key: string]: any\r\n}\r\n\r\nexport interface TheSeamQuillMentionMenuDivider {\r\n type: 'divider'\r\n disabled?: boolean\r\n}\r\n\r\nexport interface TheSeamQuillMentionMenuHeader {\r\n value: string\r\n type: 'groupName'\r\n disabled?: boolean\r\n}\r\n\r\nexport type TheSeamQuillMentionMenuItem = TheSeamQuillMentionMenuOption | TheSeamQuillMentionMenuDivider | TheSeamQuillMentionMenuHeader\r\n\r\nexport type TheSeamQuillMentionSearchFn = (\r\n source: TheSeamQuillMentionMenuItem[],\r\n textAfter: string,\r\n mentionChar: string\r\n) => TheSeamQuillMentionMenuItem[]\r\n\r\nexport type TheSeamQuillMentionSourceFn = (\r\n source: TheSeamQuillMentionMenuItem[],\r\n searchFn: TheSeamQuillMentionSearchFn,\r\n emptyListItem: TheSeamQuillMentionMenuItem | undefined,\r\n textAfter: string,\r\n renderList: (\r\n matches: {\r\n id: string\r\n value: string\r\n [key: string]: string | undefined\r\n }[],\r\n searchTerm: string\r\n ) => void,\r\n mentionChar: string\r\n) => void\r\n\r\n/**\r\n * Typed version of Options object, copied from quill-mention@v6.0.1 (typescript version)\r\n */\r\nexport interface TheSeamQuillMentionOptions {\r\n /**\r\n * Specifies which characters will cause the mention autocomplete to open\r\n * @default ['@']\r\n */\r\n mentionDenotationChars?: string[]\r\n\r\n /**\r\n * Whether to show the used denotation character in the mention item or not\r\n * @default true\r\n */\r\n showDenotationChar?: boolean\r\n\r\n /**\r\n * Allowed characters in search term triggering a search request using regular expressions. Can be a function that takes the denotationChar and returns a regex.\r\n * @default /^[a-zA-Z0-9_]*$/\r\n */\r\n allowedChars?: RegExp | ((char: string) => RegExp)\r\n\r\n /**\r\n * Minimum number of characters after the @ symbol triggering a search request\r\n * @default 0\r\n */\r\n minChars?: number\r\n\r\n /**\r\n * Maximum number of characters after the @ symbol triggering a search request\r\n * @default 31\r\n */\r\n maxChars?: number\r\n\r\n /**\r\n * Additional top offset of the mention container position\r\n * @default 2\r\n */\r\n offsetTop?: number\r\n\r\n /**\r\n * Additional left offset of the mention container position\r\n * @default 0\r\n */\r\n offsetLeft?: number\r\n\r\n /**\r\n * Whether or not the denotation character(s) should be isolated. For example, to avoid mentioning in an email.\r\n * @default false\r\n */\r\n isolateCharacter?: boolean\r\n\r\n /**\r\n * Only works if isolateCharacter is set to true. Whether or not the denotation character(s) can appear inline of the mention text. For example, to allow mentioning an email with the @ symbol as the denotation character.\r\n * @default false\r\n */\r\n allowInlineMentionChar?: boolean\r\n\r\n /**\r\n * When set to true, the mentions menu will be rendered above or below the quill container. Otherwise, the mentions menu will track the denotation character(s);\r\n * @default false\r\n */\r\n fixMentionsToQuill?: boolean\r\n\r\n /**\r\n * Options are 'normal' and 'fixed'. When 'fixed', the menu will be appended to the body and use fixed positioning. Use this if the menu is clipped by a parent element that's using `overflow:hidden\r\n * @default 'normal'\r\n */\r\n positioningStrategy?: 'normal' | 'fixed'\r\n\r\n /**\r\n * Options are 'bottom' and 'top'. Determines what the default orientation of the menu will be. Quill-mention will attempt to render the menu either above or below the editor. If 'top' is provided as a value, and there is not enough space above the editor, the menu will be rendered below. Vice versa, if there is not enough space below the editor, and 'bottom' is provided as a value (or no value is provided at all), the menu will be rendered above the editor.\r\n * @default 'bottom'\r\n */\r\n defaultMenuOrientation?: 'top' | 'bottom'\r\n\r\n /**\r\n * The name of the Quill Blot to be used for inserted mentions. A default implementation is provided named 'mention', which may be overridden with a custom blot.\r\n * @default 'mention'\r\n */\r\n blotName?: string\r\n\r\n /**\r\n * A list of data values you wish to be passed from your list data to the html node. (id, value, denotationChar, link, target are included by default).\r\n * @default ['id', 'value', 'denotationChar', 'link', 'target', 'disabled']\r\n */\r\n dataAttributes?: string[]\r\n\r\n /**\r\n * Link target for mentions with a link\r\n * @default '_blank'\r\n */\r\n linkTarget?: string\r\n\r\n /**\r\n * Style class to be used for list items (may be null)\r\n * @default 'ql-mention-list-item'\r\n */\r\n listItemClass?: string\r\n\r\n /**\r\n * Style class to be used for the mention list container (may be null)\r\n * @default 'ql-mention-list-container'\r\n */\r\n mentionContainerClass?: string\r\n\r\n /**\r\n * Style class to be used for the mention list (may be null)\r\n * @default 'ql-mention-list'\r\n */\r\n mentionListClass?: string\r\n\r\n /**\r\n * Whether or not insert 1 space after mention block in text\r\n * @default true\r\n */\r\n spaceAfterInsert?: boolean\r\n\r\n /**\r\n * An array of keyboard key codes that will trigger the select action for the mention dropdown. Default is ENTER key. See this reference for a list of numbers for each keyboard key.\r\n * @default [13]\r\n */\r\n selectKeys?: (string | number | string)[]\r\n\r\n /**\r\n * Required callback function to handle the search term and connect it to a data source for matches. The data source can be a local source or an AJAX request.\r\n * The callback should call renderList(matches, searchTerm); with matches of JSON Objects in an array to show the result for the user. The JSON Objects should have id and value but can also have other values to be used in renderItem for custom display.\r\n * @param textAfter\r\n * @param render\r\n * @param mentionChar\r\n * @returns\r\n */\r\n source: (\r\n textAfter: string,\r\n renderList: (\r\n matches: {\r\n id: string\r\n value: string\r\n [key: string]: string | undefined\r\n }[],\r\n searchTerm: string\r\n ) => void,\r\n mentionChar: string\r\n ) => void\r\n\r\n /**\r\n * Callback when mention dropdown is open.\r\n * @returns\r\n */\r\n onOpen?: () => boolean\r\n\r\n /**\r\n * Callback before the DOM of mention dropdown is removed.\r\n * @returns\r\n */\r\n onBeforeClose?: () => boolean\r\n\r\n /**\r\n * Callback when mention dropdown is closed.\r\n * @returns\r\n */\r\n onClose?: () => boolean\r\n\r\n /**\r\n * A function that gives you control over how matches from source are displayed. You can use this function to highlight the search term or change the design with custom HTML. This function will need to return either a string possibly containing unsanitized user content, or a class implementing the Node interface which will be treated as a sanitized DOM node.\r\n * @param item\r\n * @param searchTerm\r\n * @returns\r\n */\r\n renderItem?: (\r\n item: { id: string; value: string; [key: string]: unknown },\r\n searchTerm: string\r\n ) => string | HTMLElement\r\n\r\n /**\r\n * A function that returns the HTML for a loading message during async calls from source. The function will need to return either a string possibly containing unsanitized user content, or a class implementing the Node interface which will be treated as a sanitized DOM node. The default functions returns null to prevent a loading message.\r\n * @returns\r\n */\r\n renderLoading?: () => string | HTMLElement | null\r\n\r\n /**\r\n * Callback for a selected item. When overriding this method, insertItem should be used to insert item to the editor. This makes async requests possible.\r\n * @param item\r\n * @param insertItem\r\n */\r\n onSelect?: (\r\n item: DOMStringMap,\r\n insertItem: (\r\n data: Record<string, unknown>,\r\n programmaticInsert?: boolean,\r\n overriddenOptions?: object\r\n ) => void\r\n ) => void\r\n}\r\n\r\nexport interface TheSeamQuillModules extends QuillModules {\r\n mention?: Partial<TheSeamQuillMentionOptions>\r\n}\r\n\r\nexport const THESEAM_QUILL_FORMATS = [\r\n 'align',\r\n 'background',\r\n 'blockquote',\r\n 'bold',\r\n 'code-block',\r\n 'code',\r\n 'color',\r\n 'direction',\r\n 'font',\r\n 'header',\r\n 'image',\r\n 'indent',\r\n 'italic',\r\n 'link',\r\n 'list',\r\n 'script',\r\n 'size',\r\n 'strike',\r\n 'underline',\r\n 'video',\r\n 'mention'\r\n] as const\r\n\r\nexport type TheSeamQuillStyleFormat = (typeof THESEAM_QUILL_FORMATS)[number]\r\n\r\nexport type TheSeamQuillInputFormat = 'object' | 'html' | 'text' | 'json'\r\n\r\nexport interface TheSeamQuillEditorConfig {\r\n /**\r\n * The format of the text inside the editor.\r\n *\r\n * @default 'html'\r\n */\r\n format: TheSeamQuillInputFormat\r\n\r\n /** @default 'snow' */\r\n theme?: string\r\n\r\n /**\r\n * Used to set custom config for built-in and add-on modules.\r\n *\r\n * See `SEAM_QUILL_MODULES_DEFAULT` for default value.\r\n */\r\n modules?: TheSeamQuillModules\r\n\r\n /**\r\n * Console level for debug messages.\r\n *\r\n * @default `warn`\r\n */\r\n debug?: 'warn' | 'log' | 'error' | false\r\n\r\n /**\r\n * List of formats allowed in editor.\r\n *\r\n * See `SEAM_QUILL_FORMATS_DEFAULT` for default value.\r\n *\r\n * NOTE: Adding or removing a value will enable/disable that format\r\n * in the editor, but has no effect on the toolbar buttons.\r\n * To modify the toolbar display, update `modules.toolbar`.\r\n */\r\n formats?: TheSeamQuillStyleFormat[] | null\r\n\r\n /** @default 'top' */\r\n customToolbarPosition: 'top' | 'bottom'\r\n\r\n /**\r\n * When `true`, runs the control value through Angular's DOM sanitizer\r\n * before setting the value.\r\n *\r\n * @default false\r\n */\r\n sanitize: boolean\r\n\r\n /** Custom css styles to add to the `.ql-container` element. */\r\n styles?: { [key: string]: string } | null\r\n\r\n /**\r\n * When `false`, user interactions in the toolbar will emit even\r\n * if the editor is marked as `readOnly`. This allows the user to\r\n * make some formatting changes (e.g. creating a list) to a value\r\n * that should be disabled.\r\n *\r\n * @default true.\r\n */\r\n strict: boolean\r\n\r\n /**\r\n * An element or selector that specifies the scrolling element of the editor.\r\n *\r\n * Default scrollingContainer is the `.ql-editor` element.\r\n */\r\n scrollingContainer?: HTMLElement | string | null\r\n\r\n /**\r\n * An element or selector that specifies the confining element of the editor.\r\n *\r\n * Default boundary container is the document's `body` element.\r\n */\r\n bounds?: HTMLElement | string\r\n\r\n /**\r\n * Defines custom formats for the editor. Can be used to overwrite existing options.\r\n *\r\n * TODO: Research this more.\r\n */\r\n customOptions: CustomOption[]\r\n\r\n /**\r\n * Defines custom modules for the editor. Can be used to overwrite existing modules.\r\n *\r\n * TODO: Research this more.\r\n */\r\n customModules: CustomModule[]\r\n\r\n /**\r\n * When `user`, only change events from the user will trigger a model change.\r\n * This is the default behavior, and is preferred.\r\n *\r\n * Changing to `all` is not recommended.\r\n */\r\n trackChanges?: 'user' | 'all'\r\n\r\n /**\r\n * When `true`, preserves duplicated whitespaces.\r\n *\r\n * @default false\r\n */\r\n preserveWhitespace: boolean\r\n\r\n /** Custom classes to add to the `.ql-container` element. */\r\n classes?: string\r\n\r\n /**\r\n * When `true`, trims leading/trailing newlines when validation is run.\r\n *\r\n * @default false\r\n */\r\n trimOnValidation: boolean\r\n\r\n /**\r\n * Sets a placeholder for the link input in the hyperlink form.\r\n *\r\n * @default 'https://quilljs.com'\r\n */\r\n linkPlaceholder?: string\r\n\r\n /**\r\n * When `true`, does a basic compare (using JSON.stringify) between the old\r\n * and new value on `writeValue()`. If the values are the same, it skips the update.\r\n *\r\n * @default false\r\n */\r\n compareValues: boolean\r\n\r\n /**\r\n * When `true`, skips the update for null values on `writeValue()`.\r\n *\r\n * @default false\r\n */\r\n filterNull: boolean\r\n\r\n /**\r\n * Debounces `onContentChanged()`, `onEditorChanged()`, `ngModel` and form control `valueChange()`.\r\n *\r\n * Defaults to `undefined`, so changes always emit immediately.\r\n *\r\n * @default undefined\r\n */\r\n debounceTime?: number\r\n\r\n /**\r\n * @deprecated The `ngx-quill` library doesn't accurately handle undefined\r\n * inputs, and the default `valueGetter` function is impossible to reference here,\r\n * so this config option is not used.\r\n *\r\n * Defines custom logic for reading the html value of the editor.\r\n */\r\n valueGetter?: (\r\n quillEditor: QuillType,\r\n editorElement: HTMLElement\r\n ) => string | any\r\n\r\n /**\r\n * @deprecated The `ngx-quill` library doesn't accurately handle undefined\r\n * inputs, and the default `valueSetter` function is impossible to reference here,\r\n * so this config option is not used.\r\n *\r\n * Defines custom logic for setting the html value of the editor.\r\n */\r\n valueSetter?: (quillEditor: QuillType, value: any) => any\r\n}\r\n\r\nexport type TheSeamCharacterCounterFn = (\r\n value: string,\r\n format: TheSeamQuillInputFormat | undefined\r\n) => number\r\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { QuillModule } from 'ngx-quill';\nimport { RichTextComponent } from './rich-text/rich-text.component';\nimport { ReactiveFormsModule } from '@angular/forms';\n\n@NgModule({\n declarations: [\n RichTextComponent,\n ],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n QuillModule\n ],\n exports: [\n RichTextComponent,\n ]\n})\nexport class TheSeamRichTextModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;AAKO,MAAM,iBAAiB,GAAG,YAAW;AAE/B,MAAA,qCAAqC,GAAuB;AACvE,IAAA,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC;AACzC,IAAA,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAChC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACzC,IAAA,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACf,IAAA,CAAC,MAAM,CAAC;AACR,IAAA,CAAC,OAAO,CAAC;EACV;AAEY,MAAA,qCAAqC,GAAwC;AACxF,IAAA,gBAAgB,EAAE,KAAK;AACvB,IAAA,mBAAmB,EAAE,OAAO;IAC5B,cAAc,EAAE,CAAE,MAAM,CAAE;EAC3B;AAEY,MAAA,6BAA6B,GAAwB;AAChE,IAAA,OAAO,EAAE,qCAAqC;EAC/C;AAEY,MAAA,6BAA6B,GAA8B;IACtE,OAAO;IACP,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,WAAW;IACX,SAAS;EACV;AAEY,MAAA,mCAAmC,GAA6B;AAC3E,IAAA,MAAM,EAAE,MAAM;AACd,IAAA,OAAO,EAAE,6BAA6B;AACtC,IAAA,OAAO,EAAE,6BAA6B;AACtC,IAAA,eAAe,EAAE,oBAAoB;AACrC,IAAA,qBAAqB,EAAE,KAAK;AAC5B,IAAA,QAAQ,EAAE,KAAK;AACf,IAAA,MAAM,EAAE,IAAI;AACZ,IAAA,aAAa,EAAE,EAAE;AACjB,IAAA,aAAa,EAAE,EAAE;AACjB,IAAA,kBAAkB,EAAE,KAAK;AACzB,IAAA,gBAAgB,EAAE,KAAK;AACvB,IAAA,aAAa,EAAE,KAAK;AACpB,IAAA,UAAU,EAAE,KAAK;EAClB;MAEY,2BAA2B,GAAG,IAAI,cAAc,CAA2B,0BAA0B,EAAC;MAEtG,6BAA6B,GAA8B,CAAC,KAAa,EAAE,MAA2C,KAAY;IAC7I,IAAI,MAAM,KAAK,MAAM,EAAE;QACrB,OAAO,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAA;AAClF,KAAA;SACI,IAAI,MAAM,KAAK,MAAM,EAAE;AAC1B,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAA;AAClD,KAAA;AACI,SAAA;AACH,QAAA,OAAO,CAAC,IAAI,CAAC,UAAU,MAAM,CAAA,eAAA,CAAiB,CAAC,CAAA;AAC/C,QAAA,OAAO,CAAC,CAAA;AACT,KAAA;AACH,EAAC;AAEK,SAAU,mBAAmB,CAAC,KAA8C,EAAA;IAChF,IAAI,iBAAiB,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACzD,QAAA,OAAO,KAAK,CAAA;AACb,KAAA;AAED,IAAA,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;AAC1D,CAAC;AAEY,MAAA,sBAAsB,GAAgC,CAAC,MAAqC,EAAE,SAAiB,EAAE,WAAmB,KAAI;AACnJ,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,IAAG;QACvB,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,KAAK,IAAI,EAAE;AACtD,YAAA,OAAO,IAAI,CAAA;AACZ,SAAA;AAED,QAAA,OAAO,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;AAChE,KAAC,CAAC,CAAA;AACJ,EAAC;AAEY,MAAA,0BAA0B,GAAgC,CAAC,MAAqC,EAAE,QAAqC,EAAE,aAAsD,EAAE,SAAiB,EAAE,UAAoD,EAAE,WAAmB,KAAI;IAC5S,IAAI,IAAI,GAAG,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;IAEnD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,kBAAkB,CAAC,aAAa,CAAC,EAAE;AAC1D,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;AACzB,KAAA;AACI,SAAA;QACH,IAAI,SAAS,GAAG,CAAC,CAAA;QACjB,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,KAAI;YAClC,MAAM,gBAAgB,GAAG,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;AAC3C,YAAA,MAAM,yBAAyB,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC,SAAS,GAAG,SAAS,CAAA;YAChH,IAAI,mBAAmB,CAAC,OAAO,CAAC;AACzB,mBAAA,yBAAyB,CAAC,OAAO,CAAC,SAAS,CAAC;AAC5C,mBAAA,OAAO,CAAC,SAAS,KAAK,yBAAyB,EACpD;gBACA,GAAG,CAAC,IAAI,CAAC;oBACP,KAAK,EAAE,OAAO,CAAC,SAAS;AACxB,oBAAA,QAAQ,EAAE,IAAI;AACd,oBAAA,IAAI,EAAE,WAAW;AAClB,iBAAA,CAAC,CAAA;AAEF,gBAAA,SAAS,EAAE,CAAA;AACZ,aAAA;AAED,YAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE;AACjC,gBAAA,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAA;AACxB,aAAA;AAED,YAAA,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACjB,YAAA,SAAS,EAAE,CAAA;AAEX,YAAA,OAAO,GAAG,CAAA;SACX,EAAiC,EAA0C,CAAC,CAAA;AAC9E,KAAA;AAED,IAAA,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;AAC7B,EAAC;AAED;AACA;AACA;AACE;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF;;ACpIa,MAAA,wBAAwB,GAAa;AAChD,IAAA,OAAO,EAAE,iBAAiB;AAC1B,IAAA,WAAW,EAAE,UAAU,CAAC,MAAM,iBAAiB,CAAC;AAChD,IAAA,KAAK,EAAE,IAAI;EACZ;MAUY,iBAAiB,CAAA;AAU5B,IAAA,IACI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,SAAS,CAAA;KACtB;IACD,IAAI,QAAQ,CAAC,KAAiC,EAAA;AAC5C,QAAA,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,SAAS,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAA;AAC9C,SAAA;KACF;;AAID,IAAA,IACI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,YAAY,CAAA;KACzB;IACD,IAAI,WAAW,CAAC,KAAgC,EAAA;AAC9C,QAAA,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,YAAY,GAAG,KAAK,CAAA;AAC1B,SAAA;KACF;AAGD;;;;;;AAMG;AACH,IAAA,IACI,IAAI,GAAA;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;KAClB;IACD,IAAI,IAAI,CAAC,KAAgC,EAAA;AACvC,QAAA,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;AAElB,YAAA,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,CAAA;AACrC,SAAA;KACF;AAGD;;;;AAIG;AACH,IAAA,IACI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,UAAU,CAAA;KACvB;IACD,IAAI,SAAS,CAAC,KAAiC,EAAA;AAC7C,QAAA,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAA;AAC/C,SAAA;KACF;;AAID,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,SAAS,CAAA;KACtB;IACD,IAAI,QAAQ,CAAC,KAAiC,EAAA;AAC5C,QAAA,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,SAAS,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAA;AAC9C,SAAA;KACF;;AAID;;;;;;;;AAQG;AACH,IAAA,IACI,eAAe,GAAA;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAA;KAC7B;IACD,IAAI,eAAe,CAAC,KAAiC,EAAA;AACnD,QAAA,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,gBAAgB,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAA;YAEpD,IAAI,CAAC,kBAAkB,EAAE,CAAA;AAC1B,SAAA;KACF;AAGD;;;;;;;;;;;;AAYG;AACH,IAAA,IACI,uBAAuB,GAAA;QACzB,OAAO,IAAI,CAAC,wBAAwB,CAAA;KACrC;IACD,IAAI,uBAAuB,CAAC,KAAiC,EAAA;AAC3D,QAAA,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,wBAAwB,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAA;AAC7D,SAAA;KACF;AAGD,IAAA,IACI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,UAAU,CAAA;KACvB;IACD,IAAI,SAAS,CAAC,KAAyB,EAAA;AACrC,QAAA,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;AACxB,SAAA;KACF;AAGD,IAAA,IACI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,UAAU,CAAA;KACvB;IACD,IAAI,SAAS,CAAC,KAAyB,EAAA;AACrC,QAAA,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;AACxB,SAAA;KACF;AAGD;;;;AAIG;AACH,IAAA,IACI,mBAAmB,GAAA;QACrB,OAAO,IAAI,CAAC,oBAAoB,CAAA;KACjC;IACD,IAAI,mBAAmB,CAAC,KAAK,EAAA;AAC3B,QAAA,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAA;AAClC,SAAA;KACF;AAGD;;;AAGG;AACH,IAAA,IAAa,kBAAkB,GAAA;QAC7B,OAAO,IAAI,CAAC,mBAAmB,CAAA;KAChC;IACD,IAAI,kBAAkB,CAAC,KAAmD,EAAA;AACxE,QAAA,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAA;AACjC,SAAA;KACF;AAGD;;;;;AAKG;AACH,IAAA,IACI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,YAAY,CAAA;KACzB;IACD,IAAI,WAAW,CAAC,KAAiC,EAAA;AAC/C,QAAA,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,YAAY,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAA;YAEhD,IAAI,CAAC,kBAAkB,EAAE,CAAA;AAC1B,SAAA;KACF;AAGD;;;;;AAKG;AACH,IAAA,IACI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAA;KAChC;IACD,IAAI,YAAY,CAAC,KAAuD,EAAA;AACtE,QAAA,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC/B,SAAA;KACF;AAOD;;AAEG;AACH,IAAA,IACI,eAAe,GAAA;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAA;KAC7B;IACD,IAAI,eAAe,CAAC,KAAqD,EAAA;AACvE,QAAA,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAA;AAC9B,SAAA;KACF;AAGD;;;;AAIG;AACH,IAAA,IACI,mBAAmB,GAAA;QACrB,OAAO,IAAI,CAAC,oBAAoB,CAAA;KACjC;IACD,IAAI,mBAAmB,CAAC,KAAqD,EAAA;AAC3E,QAAA,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAA;AAClC,SAAA;KACF;AAGD;;;;AAIG;AACH,IAAA,IACI,sBAAsB,GAAA;QACxB,OAAO,IAAI,CAAC,uBAAuB,CAAA;KACpC;IACD,IAAI,sBAAsB,CAAC,KAAgC,EAAA;AACzD,QAAA,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAA;AACrC,SAAA;KACF;AAGD;;;;AAIG;AACH,IAAA,IACI,oBAAoB,GAAA;QACtB,OAAO,IAAI,CAAC,qBAAqB,CAAA;KAClC;IACD,IAAI,oBAAoB,CAAC,KAAgC,EAAA;AACvD,QAAA,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAA;AACnC,SAAA;KACF;AAGD,IAAA,IAAI,oBAAoB,GAAA;QACtB,OAAO;AACL,YAAA,EAAE,EAAE,WAAW;YACf,KAAK,EAAE,IAAI,CAAC,oBAAoB;AAChC,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,SAAS,EAAE,IAAI;SAChB,CAAA;KACF;AAWD,IAAA,IACI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,YAAY,CAAA;KACzB;IACD,IAAI,WAAW,CAAC,KAAoD,EAAA;AAClE,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK,CAAA;;QAGzB,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,CAAA;SACrC,EAAE,CAAC,CAAC,CAAA;KACN;IAyBD,WACmB,CAAA,SAAoB,EACoB,aAAwC,EAAA;QADhF,IAAS,CAAA,SAAA,GAAT,SAAS,CAAW;QACoB,IAAa,CAAA,aAAA,GAAb,aAAa,CAA2B;AAzUnG,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,WAAW,CAAgB,IAAI,CAAC,CAAA;QAW1C,IAAS,CAAA,SAAA,GAAG,KAAK,CAAA;QAYjB,IAAY,CAAA,YAAA,GAAG,EAAE,CAAA;QAoBjB,IAAK,CAAA,KAAA,GAAG,CAAC,CAAA;QAgBT,IAAU,CAAA,UAAA,GAAG,IAAI,CAAA;QAWjB,IAAS,CAAA,SAAA,GAAG,KAAK,CAAA;QAuBjB,IAAgB,CAAA,gBAAA,GAAG,KAAK,CAAA;QAwBxB,IAAwB,CAAA,wBAAA,GAAG,KAAK,CAAA;QAsChC,IAAoB,CAAA,oBAAA,GAA4B,IAAI,CAAA;QAcpD,IAAmB,CAAA,mBAAA,GAAG,6BAA6B,CAAA;QAmBnD,IAAY,CAAA,YAAA,GAAY,KAAK,CAAA;AAiB7B,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,eAAe,CAAmD,SAAS,CAAC,CAAA;AACjG,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,IAAI,CAC3D,MAAM,CAAC,QAAQ,IAAI,kBAAkB,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,EACvE,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAC/C,CAAA;QAcO,IAAgB,CAAA,gBAAA,GAAgC,sBAAsB,CAAA;QAgBtE,IAAoB,CAAA,oBAAA,GAAgC,0BAA0B,CAAA;QAgB9E,IAAuB,CAAA,uBAAA,GAAW,YAAY,CAAA;QAgB9C,IAAqB,CAAA,qBAAA,GAAW,mBAAmB,CAAA;AAWjD,QAAA,IAAA,CAAA,kBAAkB,GAAsB,IAAI,YAAY,EAAE,CAAA;AAC1D,QAAA,IAAA,CAAA,kBAAkB,GAA8D,IAAI,YAAY,EAAE,CAAA;AAClG,QAAA,IAAA,CAAA,mBAAmB,GAAgC,IAAI,YAAY,EAAE,CAAA;AACrE,QAAA,IAAA,CAAA,qBAAqB,GAAkC,IAAI,YAAY,EAAE,CAAA;AACzE,QAAA,IAAA,CAAA,UAAU,GAAwB,IAAI,YAAY,EAAE,CAAA;AACpD,QAAA,IAAA,CAAA,SAAS,GAAuB,IAAI,YAAY,EAAE,CAAA;AAElD,QAAA,IAAA,CAAA,eAAe,GAAkD,IAAI,YAAY,EAAE,CAAA;QAkBrF,IAAe,CAAA,eAAA,GAAG,KAAK,CAAA;AAEvB,QAAA,IAAA,CAAA,wBAAwB,GAAG,IAAI,OAAO,EAAQ,CAAA;AAE9C,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC,CAAA;AACjD,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAA;AAE1C,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC,CAAA;AAChD,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC,CAAA;AAMlD,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,eAAe,CAAuC,SAAS,CAAC,CAAA;AAC/E,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAA;AAEpC,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,eAAe,CAAkC,EAAE,CAAC,CAAA;AAC7E,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAA;AAM9D,QAAA,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC;AAChC,YAAA,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE;AAC9B,YAAA,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE;AAC9B,YAAA,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;SACjC,CAAC,CAAC,IAAI,CACL,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAC5C,CAAA;QAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAC3C,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EACd,SAAS,CAAC,MAAK;AACb,YAAA,IAAI,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;AACxC,gBAAA,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CACvC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EACjC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAY,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CACjF,CAAA;AACF,aAAA;AAED,YAAA,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;SACb,CAAC,CACH,CAAA;QAED,IAAI,CAAC,iBAAiB,CAAC,IAAI,CACzB,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CACrD,CAAC,SAAS,EAAE,CAAA;KACd;IAED,QAAQ,GAAA;;;QAGN,IAAI,mBAAmB,GAAG,KAAK,CAAA;QAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAClB,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EACd,SAAS,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI;;AAEhD,QAAA,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,CACtC,CAAC,CACH,CAAC,SAAS,EAAE,CAAA;AAEb,QAAA,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAChC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,mBAAmB,CAAC,EAC1D,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CACjC,CAAC,SAAS,EAAE,CAAA;QAEb,IAAI,CAAC,wBAAwB,CAAC,YAAY,EAAE,CAAC,IAAI,CAC/C,GAAG,CAAC,MAAK;AACP,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAE3B,MAAM,oBAAoB,GAAG,CAAG,EAAA,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA,GAAA,CAAK,CAAA;AAEpD,YAAA,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;AAC1E,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,YAAY,CAAC,CAAA;AAEvF,gBAAA,IAAI,kBAAkB,CAAC,QAAQ,CAAC,EAAE;oBAChC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAA;oBACjE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,oBAAoB,CAAC,CAAA;AACtE,iBAAA;AACF,aAAA;AAED,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC5B,SAAC,CAAC,CACH,CAAC,SAAS,EAAE,CAAA;QAEb,IAAI,CAAC,iBAAiB,EAAE,CAAA;KACzB;IAED,eAAe,GAAA;AACb,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE;YAC/C,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,0BAA0B,IAAI,IAAI,CAAA;AACnE,SAAA;AAED,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;KAC7B;IAEO,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAE3B,QAAA,MAAM,MAAM,GAA6B;AACvC,YAAA,GAAG,mCAAmC;SACvC,CAAA;QAED,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;AACtB,YAAA,MAAM,CAAC,OAAO,GAAG,EAAE,CAAA;YACnB,MAAM,CAAC,OAAO,GAAG;AACf,gBAAA,OAAO,EAAE,KAAK;aACf,CAAA;AACF,SAAA;AACI,aAAA;YACH,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAA;YAClD,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAA;YACpD,MAAM,CAAC,OAAO,GAAG;AACf,gBAAA,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;aACvC,CAAA;AACF,SAAA;QAED,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,MAAM,cAAc,GAAwB;gBAC1C,GAAG,MAAM,CAAC,OAAO;AACjB,gBAAA,OAAO,EAAE;AACP,oBAAA,GAAG,qCAAqC;AACxC,oBAAA,aAAa,EAAE,MAAM,IAAI,CAAC,sBAAsB;oBAChD,MAAM,EAAE,OAAO,UAAkB,EAAE,UAAqD,EAAE,WAAmB,KAAI;;;AAG/G,wBAAA,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAE3E,wBAAA,IAAI,kBAAkB,CAAC,aAAa,CAAC,EAAE;AACrC,4BAAA,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,oBAAoB,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,CAAA;AAC9H,yBAAA;qBACF;AACD,oBAAA,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO;AAC3B,iBAAA;aACF,CAAA;AAED,YAAA,MAAM,CAAC,OAAO,GAAG,cAAc,CAAA;AAChC,SAAA;QAED,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;QAChD,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;QAChD,MAAM,CAAC,qBAAqB,GAAG,IAAI,CAAC,mBAAmB,CAAC,uBAAuB,CAAC,CAAA;QAChF,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAA;QACtD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAA;QAClD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAA;QAClD,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,CAAA;QAC1E,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAA;QAClD,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAA;QAChE,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAA;QAChE,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAA;QAC9D,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,CAAA;QAC1E,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAA;QACpD,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAA;QACtE,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAA;QACpE,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAA;QAChE,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAA;QAC1D,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAA;AAE9D,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;;;QAIzB,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;SAC3B,EAAE,CAAC,CAAC,CAAA;KACN;AAEO,IAAA,mBAAmB,CAA2C,IAAO,EAAA;AAC3E,QAAA,IAAI,IAAI,CAAC,aAAa,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE;AACxF,YAAA,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;AAChC,SAAA;AACD,QAAA,OAAO,mCAAmC,CAAC,IAAI,CAAC,CAAA;KACjD;IAEO,kBAAkB,GAAA;AACxB,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;YACzB,IAAI,CAAC,iBAAiB,EAAE,CAAA;AACzB,SAAA;KACF;;;;;;;;;;;;;;AAkBD,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;KACnB;IACD,IAAI,KAAK,CAAC,KAAgC,EAAA;AACxC,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QAEnB,IAAI,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAAE,SAAA;QAC3C,IAAI,IAAI,CAAC,SAAS,EAAE;YAAE,IAAI,CAAC,SAAS,EAAE,CAAA;AAAE,SAAA;KACzC;AAGD,IAAA,UAAU,CAAC,KAAU,EAAA;AACnB,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;AAE3B,QAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAChC,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;AAElB,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK,CAAA;KAC7B;AAED,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;KACnB;AAED,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;KACpB;AAED,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAA;KAC3B;AAED,IAAA,gBAAgB,CAAC,KAAU,EAAA;AACzB,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;KACpC;AAED,IAAA,gBAAgB,CAAC,KAAkD,EAAA;AACjE,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;KACpC;AAED,IAAA,iBAAiB,CAAC,KAAoB,EAAA;AACpC,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAEpC,QAAA,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;KAC7C;AAED,IAAA,mBAAmB,CAAC,KAAsB,EAAA;AACxC,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;KACvC;AAED,IAAA,QAAQ,CAAC,KAAY,EAAA;AACnB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;KAC5B;AAED,IAAA,OAAO,CAAC,KAAW,EAAA;AACjB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAE1B,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,SAAS,EAAE,CAAA;AACjB,SAAA;KACF;AAED;;AAEG;AACK,IAAA,wBAAwB,CAAC,OAAc,EAAA;AAC7C,QAAA,IAAI,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACnC,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAA;YAChG,MAAM,gBAAgB,GAAG,CAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAE,CAAA;AAC5D,YAAA,MAAM,cAAc,GAAG,CAAE,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE,CAAE,CAAA;YAE5D,MAAM,WAAW,GAAoC,iBAAiB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,SAAS,KAAI;gBAC/F,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAA;AAE5F,gBAAA,IAAI,kBAAkB,CAAC,aAAa,CAAC,EAAE;AACrC,oBAAA,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;AACxB,iBAAA;AACI,qBAAA;AACH,oBAAA,OAAO,CAAC,IAAI,CAAC,6DAA6D,EAAE,SAAS,CAAC,CAAA;AACvF,iBAAA;AAED,gBAAA,OAAO,GAAG,CAAA;aACX,EAAmC,EAAE,CAAC,CAAA;YAEvC,IAAI,UAAU,GAAG,KAAK,CAAA;AACtB,YAAA,IAAI,gBAAgB,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE;;gBAElD,UAAU,GAAG,IAAI,CAAA;AAClB,aAAA;AACI,iBAAA;;AAEH,gBAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAA;AACtE,gBAAA,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAA;AAEhD,gBAAA,IACE,kBAAkB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACpE,oBAAA,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EACpE;oBACA,UAAU,GAAG,IAAI,CAAA;AAClB,iBAAA;AACF,aAAA;AAED,YAAA,IAAI,UAAU,EAAE;AACd,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;AACzC,aAAA;AACF,SAAA;KACF;;AA7mBU,iBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,2CAiVN,2BAA2B,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAjVtC,iBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,EAJjB,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,CAAA,OAAA,EAAA,KAAA,CAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,SAAA,EAAA;QACT,wBAAwB;AACzB,KAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,4BAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzBH,6xFAiEA,EAAA,MAAA,EAAA,CAAA,uPAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,EAAA,CAAA,CAAA;2FDtCa,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAR7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAGf,SAAA,EAAA;wBACT,wBAAwB;AACzB,qBAAA,EAAA,QAAA,EAAA,6xFAAA,EAAA,MAAA,EAAA,CAAA,uPAAA,CAAA,EAAA,CAAA;;0BAmVE,QAAQ;;0BAAI,MAAM;2BAAC,2BAA2B,CAAA;4CA3UjC,GAAG,EAAA,CAAA;sBAAlB,KAAK;uBAAC,OAAO,CAAA;gBAKV,QAAQ,EAAA,CAAA;sBADX,KAAK;gBAaF,WAAW,EAAA,CAAA;sBADd,KAAK;gBAmBF,IAAI,EAAA,CAAA;sBADP,KAAK;gBAmBF,SAAS,EAAA,CAAA;sBADZ,KAAK;gBAiCF,eAAe,EAAA,CAAA;sBADlB,KAAK;gBA2BF,uBAAuB,EAAA,CAAA;sBAD1B,KAAK;gBAYF,SAAS,EAAA,CAAA;sBADZ,KAAK;gBAYF,SAAS,EAAA,CAAA;sBADZ,KAAK;gBAiBF,mBAAmB,EAAA,CAAA;sBADtB,KAAK;gBAeO,kBAAkB,EAAA,CAAA;sBAA9B,KAAK;gBAiBF,WAAW,EAAA,CAAA;sBADd,KAAK;gBAoBF,YAAY,EAAA,CAAA;sBADf,KAAK;gBAmBF,eAAe,EAAA,CAAA;sBADlB,KAAK;gBAiBF,mBAAmB,EAAA,CAAA;sBADtB,KAAK;gBAiBF,sBAAsB,EAAA,CAAA;sBADzB,KAAK;gBAiBF,oBAAoB,EAAA,CAAA;sBADvB,KAAK;gBAoBI,kBAAkB,EAAA,CAAA;sBAA3B,MAAM;gBACG,kBAAkB,EAAA,CAAA;sBAA3B,MAAM;gBACG,mBAAmB,EAAA,CAAA;sBAA5B,MAAM;gBACG,qBAAqB,EAAA,CAAA;sBAA9B,MAAM;gBACG,UAAU,EAAA,CAAA;sBAAnB,MAAM;gBACG,SAAS,EAAA,CAAA;sBAAlB,MAAM;gBAEG,eAAe,EAAA,CAAA;sBAAxB,MAAM;gBAGH,WAAW,EAAA,CAAA;sBADd,SAAS;uBAAC,aAAa,CAAA;gBAcO,0BAA0B,EAAA,CAAA;sBAAxD,SAAS;uBAAC,kBAAkB,CAAA;;;AE7ElB,MAAA,qBAAqB,GAAG;IACnC,OAAO;IACP,YAAY;IACZ,YAAY;IACZ,MAAM;IACN,YAAY;IACZ,MAAM;IACN,OAAO;IACP,WAAW;IACX,MAAM;IACN,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,WAAW;IACX,OAAO;IACP,SAAS;;;MCzQE,qBAAqB,CAAA;;kHAArB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;mHAArB,qBAAqB,EAAA,YAAA,EAAA,CAX9B,iBAAiB,CAAA,EAAA,OAAA,EAAA,CAGjB,YAAY;QACZ,mBAAmB;AACnB,QAAA,WAAW,aAGX,iBAAiB,CAAA,EAAA,CAAA,CAAA;AAGR,qBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,YAR9B,YAAY;QACZ,mBAAmB;QACnB,WAAW,CAAA,EAAA,CAAA,CAAA;2FAMF,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAbjC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ,iBAAiB;AAClB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,WAAW;AACZ,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,iBAAiB;AAClB,qBAAA;AACF,iBAAA,CAAA;;;AClBD;;AAEG;;;;"}
1
+ {"version":3,"file":"theseam-ui-common-rich-text.mjs","sources":["../../../projects/ui-common/rich-text/utils/utils.ts","../../../projects/ui-common/rich-text/rich-text/rich-text.component.ts","../../../projects/ui-common/rich-text/rich-text/rich-text.component.html","../../../projects/ui-common/rich-text/utils/models.ts","../../../projects/ui-common/rich-text/rich-text.module.ts","../../../projects/ui-common/rich-text/theseam-ui-common-rich-text.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\"\r\nimport { QuillToolbarConfig } from \"ngx-quill\"\r\nimport { TheSeamQuillModules, TheSeamQuillStyleFormat, TheSeamQuillEditorConfig, TheSeamQuillMentionMenuOption, TheSeamQuillInputFormat, TheSeamQuillMentionOptions, TheSeamQuillMentionSourceFn, TheSeamQuillMentionSearchFn, TheSeamCharacterCounterFn, TheSeamQuillMentionMenuItem } from \"./models\"\r\nimport { isNullOrUndefined, notNullOrUndefined, notNullOrUndefinedOrEmpty } from \"@theseam/ui-common/utils\"\r\n\r\nexport const HTML_ENTITY_REGEX = /<[^>]+>/gm\r\n\r\nexport const THESEAM_QUILL_TOOLBAR_OPTIONS_DEFAULT: QuillToolbarConfig = [\r\n ['bold', 'italic', 'underline', 'strike'],\r\n [{ header: [0, 1, 2, 3, 4, 5] }],\r\n [{ list: 'ordered' }, { list: 'bullet' }],\r\n [{ align: [] }],\r\n ['link'],\r\n ['clean'],\r\n]\r\n\r\nexport const THESEAM_QUILL_MENTION_OPTIONS_DEFAULT: Partial<TheSeamQuillMentionOptions> = {\r\n spaceAfterInsert: false,\r\n positioningStrategy: 'fixed',\r\n dataAttributes: [ 'type' ]\r\n}\r\n\r\nexport const THESEAM_QUILL_MODULES_DEFAULT: TheSeamQuillModules = {\r\n toolbar: THESEAM_QUILL_TOOLBAR_OPTIONS_DEFAULT\r\n}\r\n\r\nexport const THESEAM_QUILL_FORMATS_DEFAULT: TheSeamQuillStyleFormat[] = [\r\n 'align',\r\n 'bold',\r\n 'header',\r\n 'indent',\r\n 'italic',\r\n 'link',\r\n 'list',\r\n 'size',\r\n 'strike',\r\n 'underline',\r\n 'mention'\r\n]\r\n\r\nexport const THESEAM_QUILL_EDITOR_CONFIG_DEFAULT: TheSeamQuillEditorConfig = {\r\n format: 'html',\r\n modules: THESEAM_QUILL_MODULES_DEFAULT,\r\n formats: THESEAM_QUILL_FORMATS_DEFAULT,\r\n linkPlaceholder: 'https://google.com',\r\n customToolbarPosition: 'top',\r\n sanitize: false,\r\n strict: true,\r\n customOptions: [],\r\n customModules: [],\r\n preserveWhitespace: false,\r\n trimOnValidation: false,\r\n compareValues: false,\r\n filterNull: false\r\n}\r\n\r\nexport const THESEAM_QUILL_EDITOR_CONFIG = new InjectionToken<TheSeamQuillEditorConfig>('TheSeamQuillEditorConfig')\r\n\r\nexport const defaultHtmlCharacterCounterFn: TheSeamCharacterCounterFn = (value: string, format: TheSeamQuillInputFormat | undefined): number => {\r\n if (format === 'html') {\r\n return value.replace(HTML_ENTITY_REGEX, ' ').replace(/\\s\\s+/g, ' ').trim().length\r\n }\r\n else if (format === 'text') {\r\n return value.replace(/\\s\\s+/g, ' ').trim().length\r\n }\r\n else {\r\n console.warn(`Format ${format} not supported!`)\r\n return 0\r\n }\r\n}\r\n\r\nexport function isMentionMenuOption(value: TheSeamQuillMentionMenuItem | undefined): value is TheSeamQuillMentionMenuOption {\r\n if (isNullOrUndefined(value) || typeof value !== 'object') {\r\n return false\r\n }\r\n\r\n return Object.prototype.hasOwnProperty.call(value, 'id')\r\n}\r\n\r\nexport const defaultMentionSearchFn: TheSeamQuillMentionSearchFn = (source: TheSeamQuillMentionMenuItem[], textAfter: string, mentionChar: string) => {\r\n return source.filter(u => {\r\n if (!isMentionMenuOption(u) || u.searchIgnore === true) {\r\n return true\r\n }\r\n\r\n return u.value.toLowerCase().includes(textAfter.toLowerCase())\r\n })\r\n}\r\n\r\nexport const defaultMentionRenderListFn: TheSeamQuillMentionSourceFn = (source: TheSeamQuillMentionMenuItem[], searchFn: TheSeamQuillMentionSearchFn, emptyListItem: TheSeamQuillMentionMenuItem | undefined, textAfter: string, renderList: (list: any[], searchTerm: string) => any, mentionChar: string) => {\r\n let list = searchFn(source, textAfter, mentionChar)\r\n\r\n if (list.length === 0 && notNullOrUndefined(emptyListItem)) {\r\n list.push(emptyListItem)\r\n }\r\n else {\r\n let reduceIdx = 0\r\n list = list.reduce((acc, mention) => {\r\n const previousMenuItem = acc[reduceIdx - 1]\r\n const previousMenuItemGroupName = isMentionMenuOption(previousMenuItem) ? previousMenuItem.groupName : undefined\r\n if (isMentionMenuOption(mention)\r\n && notNullOrUndefinedOrEmpty(mention.groupName)\r\n && mention.groupName !== previousMenuItemGroupName\r\n ) {\r\n acc.push({\r\n value: mention.groupName,\r\n disabled: true,\r\n type: 'groupName'\r\n })\r\n\r\n reduceIdx++\r\n }\r\n\r\n if (!isMentionMenuOption(mention)) {\r\n mention.disabled = true\r\n }\r\n\r\n acc.push(mention)\r\n reduceIdx++\r\n\r\n return acc\r\n }, <TheSeamQuillMentionMenuItem[]>[] satisfies TheSeamQuillMentionMenuItem[])\r\n }\r\n\r\n renderList(list, textAfter)\r\n}\r\n\r\n// Keeping this as an example for a custom menu item.\r\n// There doesn't appear to be a better way of passing in a custom template.\r\n// export const defaultMentionRenderItem = (item: TheSeamQuillMentionListItem) => {\r\n // if (item.type === 'groupName') {\r\n // const text = document.createElement('div')\r\n // text.setAttribute('class', 'small text-black-50')\r\n // text.innerText = item.value\r\n\r\n // return text.outerHTML\r\n // }\r\n // else if (item.type === 'divider') {\r\n // const div = document.createElement('hr')\r\n // div.setAttribute('class', 'my-2')\r\n // return div.outerHTML\r\n // }\r\n // else {\r\n // return item.value\r\n // }\r\n// }\r\n","import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { AfterViewInit, Component, EventEmitter, HostListener, Inject, Input, OnDestroy, OnInit, Optional, Output, Provider, Renderer2, TemplateRef, ViewChild, forwardRef } from '@angular/core';\nimport { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { Blur, ContentChange, EditorChangeContent, EditorChangeSelection, Focus, QuillEditorComponent, SelectionChange } from 'ngx-quill';\nimport { Delta } from 'quill';\nimport 'quill-mention';\nimport { BehaviorSubject, Observable, Subject, combineLatest, filter, lastValueFrom, map, of, shareReplay, startWith, switchMap, take, tap } from 'rxjs';\n\nimport { isNullOrUndefined, notNullOrUndefined } from '@theseam/ui-common/utils';\nimport { TheSeamCharacterCounterFn, TheSeamQuillEditorConfig, TheSeamQuillMentionMenuItem, TheSeamQuillMentionMenuOption, TheSeamQuillMentionSearchFn, TheSeamQuillMentionSourceFn, TheSeamQuillModules } from '../utils/models';\nimport { THESEAM_QUILL_EDITOR_CONFIG, THESEAM_QUILL_EDITOR_CONFIG_DEFAULT, THESEAM_QUILL_MENTION_OPTIONS_DEFAULT, defaultHtmlCharacterCounterFn, defaultMentionRenderListFn, defaultMentionSearchFn, isMentionMenuOption } from '../utils/utils';\n\nexport const RICH_TEXT_VALUE_ACCESSOR: Provider = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => RichTextComponent),\n multi: true\n}\n\n@Component({\n selector: 'seam-rich-text',\n templateUrl: './rich-text.component.html',\n styleUrls: ['./rich-text.component.scss'],\n providers: [\n RICH_TEXT_VALUE_ACCESSOR\n ]\n})\nexport class RichTextComponent implements OnInit, AfterViewInit, OnDestroy, ControlValueAccessor {\n\n onChange: any\n onTouched: any\n\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input('value') val: string | undefined\n\n formControl = new FormControl<string | null>(null)\n\n @Input()\n get required(): boolean {\n return this._required\n }\n set required(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._required = coerceBooleanProperty(value)\n }\n }\n private _required = false\n\n /** @default '' (empty string) */\n @Input()\n get placeholder(): string {\n return this._placeholder\n }\n set placeholder(value: string | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._placeholder = value\n }\n }\n private _placeholder = ''\n\n /**\n * Initial rows visible in text area, set using `height` and `minHeight`.\n *\n * NOTE: Resizable editors will not be able to size below the height calculated from this value.\n *\n * @default 5\n */\n @Input()\n get rows(): number {\n return this._rows\n }\n set rows(value: number | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._rows = value\n\n this._pollCalculatedRowHeight.next()\n }\n }\n private _rows = 5\n\n /**\n * When `true`, text area can be resized vertically.\n *\n * @default true\n */\n @Input()\n get resizable(): boolean {\n return this._resizable\n }\n set resizable(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._resizable = coerceBooleanProperty(value)\n }\n }\n private _resizable = true\n\n /** @default false */\n get readOnly(): boolean {\n return this._readOnly\n }\n set readOnly(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._readOnly = coerceBooleanProperty(value)\n }\n }\n private _readOnly = false\n\n // TODO: fix bug where initial html value is rendered in plain text\n /**\n * When `true`, overrides all other provided settings to present the editor\n * as a standard textbox.\n *\n * NOTE: For the moment, `<p></p>` tags are still allowed, triggered by the `Enter` key.\n * https://github.com/slab/quill/issues/1432\n *\n * @default false\n */\n @Input()\n get disableRichText(): boolean {\n return this._disableRichText\n }\n set disableRichText(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._disableRichText = coerceBooleanProperty(value)\n\n this._updateQuillConfig()\n }\n }\n private _disableRichText = false\n\n /**\n * When `true`, displays a character counter at the bottom of the editor.\n * Character counter text is determined by values provided in `minLength`\n * and `maxLength`.\n *\n * The default count algorithm strips out html entities and replaces them\n * with spaces to get the string length. To override this behavior, pass\n * a custom function to `characterCounterFn`.\n *\n * To override default character counter display, pass a custom template to `characterCountTpl`.\n *\n * @default false\n */\n @Input()\n get displayCharacterCounter(): boolean {\n return this._displayCharacterCounter\n }\n set displayCharacterCounter(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._displayCharacterCounter = coerceBooleanProperty(value)\n }\n }\n private _displayCharacterCounter = false\n\n @Input()\n get minLength(): number | undefined {\n return this._minLength\n }\n set minLength(value: number | undefined) {\n if (notNullOrUndefined(value)) {\n this._minLength = value\n }\n }\n private _minLength: number | undefined\n\n @Input()\n get maxLength(): number | undefined {\n return this._maxLength\n }\n set maxLength(value: number | undefined) {\n if (notNullOrUndefined(value)) {\n this._maxLength = value\n }\n }\n private _maxLength: number | undefined\n\n /**\n * Set to override default character counter display.\n *\n * Template context includes variables `minLength`, `maxLength`, and `characterCount`.\n */\n @Input()\n get characterCounterTpl(): TemplateRef<any> | null {\n return this._characterCounterTpl\n }\n set characterCounterTpl(value) {\n if (notNullOrUndefined(value)) {\n this._characterCounterTpl = value\n }\n }\n private _characterCounterTpl: TemplateRef<any> | null = null\n\n /**\n * Set to override default counter function, which strips html entities and\n * replaces them with a space.\n */\n @Input() get characterCounterFn(): TheSeamCharacterCounterFn {\n return this._characterCounterFn\n }\n set characterCounterFn(value: TheSeamCharacterCounterFn | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._characterCounterFn = value\n }\n }\n private _characterCounterFn = defaultHtmlCharacterCounterFn\n\n /**\n * If `true`, component will configure the Quill editor with the quill-mentions extension\n * and listen for values passed to `mentionItems` to populate the mentions menu.\n *\n * @default false\n */\n @Input()\n get useMentions(): boolean {\n return this._useMentions\n }\n set useMentions(value: boolean | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._useMentions = coerceBooleanProperty(value)\n\n this._updateQuillConfig()\n }\n }\n private _useMentions: boolean = false\n\n /**\n * List of users, user groups, or other entities to display in mentions menu.\n * Minimum required properties are `id` (unique) and `value`, which acts as the label.\n *\n * By default, the menu is triggered by typing the `@` symbol into the text area.\n */\n @Input()\n get mentionItems(): TheSeamQuillMentionMenuItem[] | null | undefined {\n return this._mentionItems.value\n }\n set mentionItems(value: TheSeamQuillMentionMenuItem[] | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._mentionItems.next(value)\n }\n }\n private _mentionItems = new BehaviorSubject<TheSeamQuillMentionMenuItem[] | null | undefined>(undefined)\n public mentionItems$ = this._mentionItems.asObservable().pipe(\n filter(mentions => notNullOrUndefined(mentions) && mentions.length > 0),\n shareReplay({ bufferSize: 1, refCount: true })\n )\n\n /**\n * Set to override default search function when user is typing a mention.\n */\n @Input()\n get mentionSearchFn(): TheSeamQuillMentionSearchFn {\n return this._mentionSearchFn\n }\n set mentionSearchFn(value: TheSeamQuillMentionSearchFn | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._mentionSearchFn = value\n }\n }\n private _mentionSearchFn: TheSeamQuillMentionSearchFn = defaultMentionSearchFn\n\n /**\n * Set to override default render function for mentions list.\n *\n * Function should call `renderList`.\n */\n @Input()\n get mentionRenderListFn(): TheSeamQuillMentionSourceFn {\n return this._mentionRenderListFn\n }\n set mentionRenderListFn(value: TheSeamQuillMentionSourceFn | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._mentionRenderListFn = value\n }\n }\n private _mentionRenderListFn: TheSeamQuillMentionSourceFn = defaultMentionRenderListFn\n\n /**\n * Set to override default text shown while mention items are loading.\n *\n * @default 'Loading...'\n */\n @Input()\n get mentionListLoadingText(): string {\n return this._mentionListLoadingText\n }\n set mentionListLoadingText(value: string | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._mentionListLoadingText = value\n }\n }\n private _mentionListLoadingText: string = 'Loading...'\n\n /**\n * Set to override default text shown when a mention search returns no items.\n *\n * @default 'No matches found.'\n */\n @Input()\n get mentionListEmptyText(): string {\n return this._mentionListEmptyText\n }\n set mentionListEmptyText(value: string | null | undefined) {\n if (notNullOrUndefined(value)) {\n this._mentionListEmptyText = value\n }\n }\n private _mentionListEmptyText: string = 'No matches found.'\n\n get mentionListEmptyItem(): TheSeamQuillMentionMenuOption {\n return {\n id: 'undefined',\n value: this.mentionListEmptyText,\n disabled: true,\n emptyList: true\n }\n }\n\n @Output() quillEditorCreated: EventEmitter<any> = new EventEmitter()\n @Output() quillEditorChanged: EventEmitter<EditorChangeContent | EditorChangeSelection> = new EventEmitter()\n @Output() quillContentChanged: EventEmitter<ContentChange> = new EventEmitter()\n @Output() quillSelectionChanged: EventEmitter<SelectionChange> = new EventEmitter()\n @Output() quillFocus: EventEmitter<Focus> = new EventEmitter()\n @Output() quillBlur: EventEmitter<Blur> = new EventEmitter()\n\n @Output() mentionsUpdated: EventEmitter<TheSeamQuillMentionMenuOption[]> = new EventEmitter()\n\n @ViewChild('quillEditor')\n get quillEditor(): QuillEditorComponent | undefined {\n return this._quillEditor\n }\n set quillEditor(value: QuillEditorComponent | undefined) {\n this._quillEditor = value\n\n // setTimeout because full html isn't available until the next tick\n setTimeout(() => {\n this._pollCalculatedRowHeight.next()\n }, 0)\n }\n private _quillEditor: QuillEditorComponent | undefined\n\n @ViewChild('characterCounter') defaultCharacterCounterTpl: TemplateRef<any> | undefined\n\n @HostListener('keydown', ['$event'])\n _handleKeydown(event: KeyboardEvent) {\n if (event.code === 'Escape') {\n const qlEditor = this._quillEditor?.editorElem?.querySelector('.ql-editor')\n if (notNullOrUndefined(qlEditor) && qlEditor === document.activeElement && qlEditor instanceof HTMLElement) {\n event.preventDefault()\n event.stopImmediatePropagation()\n qlEditor.blur()\n }\n }\n }\n\n private _isWritingValue = false\n\n private _pollCalculatedRowHeight = new Subject<void>()\n\n private _configSet = new BehaviorSubject<boolean>(false)\n public configSet$ = this._configSet.asObservable()\n\n private _stylesSet = new BehaviorSubject<boolean>(false)\n private _templateSet = new BehaviorSubject<boolean>(false)\n\n public initialized$: Observable<boolean>\n\n public characterCount$: Observable<number>\n\n private _config = new BehaviorSubject<TheSeamQuillEditorConfig | undefined>(undefined)\n public config$ = this._config.asObservable()\n\n private _selectedMentions = new BehaviorSubject<TheSeamQuillMentionMenuOption[]>([])\n public selectedMentions$ = this._selectedMentions.asObservable()\n\n constructor(\n private readonly _renderer: Renderer2,\n @Optional() @Inject(THESEAM_QUILL_EDITOR_CONFIG) private _customConfig?: TheSeamQuillEditorConfig\n ) {\n this.initialized$ = combineLatest([\n this._configSet.asObservable(),\n this._stylesSet.asObservable(),\n this._templateSet.asObservable(),\n ]).pipe(\n map(sets => sets.findIndex(s => !s) === -1)\n )\n\n this.characterCount$ = this.initialized$.pipe(\n filter(i => i),\n switchMap(() => {\n if (notNullOrUndefined(this.formControl)) {\n return this.formControl.valueChanges.pipe(\n startWith(this.formControl.value),\n map(v => this.characterCounterFn(v || '' as string, this._config.value?.format)),\n )\n }\n\n return of(0)\n })\n )\n\n this.selectedMentions$.pipe(\n tap(mentions => this.mentionsUpdated.emit(mentions))\n ).subscribe()\n }\n\n ngOnInit(): void {\n // TODO: test this more\n // ignore quill initial valueChange event, to keep functionality in line with other inputs\n let initialEmitComplete = false\n this._configSet.pipe(\n filter(s => s),\n switchMap(() => this.formControl.valueChanges.pipe(\n // skip(1),\n take(1),\n tap(() => initialEmitComplete = true)\n ))\n ).subscribe()\n\n this.formControl.valueChanges.pipe(\n filter(() => !this._isWritingValue && initialEmitComplete),\n tap(value => this.value = value)\n ).subscribe()\n\n this._pollCalculatedRowHeight.asObservable().pipe(\n tap(() => {\n this._stylesSet.next(false)\n\n const calculatedRowsHeight = `${this.rows * 1.5}rem`\n\n if (notNullOrUndefined(this.rows) && notNullOrUndefined(this._quillEditor)) {\n const editorEl = this._quillEditor.elementRef.nativeElement.querySelector('.ql-editor')\n\n if (notNullOrUndefined(editorEl)) {\n this._renderer.setStyle(editorEl, 'height', calculatedRowsHeight)\n this._renderer.setStyle(editorEl, 'min-height', calculatedRowsHeight)\n }\n }\n\n this._stylesSet.next(true)\n })\n ).subscribe()\n\n this._buildQuillConfig()\n }\n\n ngAfterViewInit(): void {\n if (isNullOrUndefined(this.characterCounterTpl)) {\n this.characterCounterTpl = this.defaultCharacterCounterTpl || null\n }\n\n this._templateSet.next(true)\n }\n\n ngOnDestroy(): void {\n // hacky way to ensure mentions menu gets destroyed when component is destroyed\n const mentionModule = this._quillEditor?.quillEditor.getModule('mention')\n const hideMentionList = mentionModule?.hideMentionList\n if (hideMentionList && typeof hideMentionList === 'function') {\n hideMentionList.call(mentionModule)\n }\n }\n\n private _buildQuillConfig() {\n this._configSet.next(false)\n\n const config: TheSeamQuillEditorConfig = {\n ...THESEAM_QUILL_EDITOR_CONFIG_DEFAULT\n }\n\n if (this.disableRichText) {\n config.format = 'text'\n config.formats = []\n config.modules = {\n toolbar: false\n }\n }\n else {\n config.format = this._getConfigOrDefault('format')\n config.formats = this._getConfigOrDefault('formats')\n config.modules = {\n ...this._getConfigOrDefault('modules')\n }\n }\n\n if (this.useMentions) {\n const mentionModules: TheSeamQuillModules = {\n ...config.modules,\n mention: {\n ...THESEAM_QUILL_MENTION_OPTIONS_DEFAULT,\n renderLoading: () => this.mentionListLoadingText,\n source: async (searchTerm: string, renderList: (list: any[], searchTerm: string) => void, mentionChar: string) => {\n // this function is called every time the menu is triggered,\n // so it will always have the latest value from mentionItems$\n const mentionsAsync = await lastValueFrom(this.mentionItems$.pipe(take(1)))\n\n if (notNullOrUndefined(mentionsAsync)) {\n this.mentionRenderListFn(mentionsAsync, this.mentionSearchFn, this.mentionListEmptyItem, searchTerm, renderList, mentionChar)\n }\n },\n ...config.modules?.mention,\n }\n }\n\n config.modules = mentionModules\n }\n\n config.theme = this._getConfigOrDefault('theme')\n config.debug = this._getConfigOrDefault('debug')\n config.customToolbarPosition = this._getConfigOrDefault('customToolbarPosition')\n config.sanitize = this._getConfigOrDefault('sanitize')\n config.styles = this._getConfigOrDefault('styles')\n config.strict = this._getConfigOrDefault('strict')\n config.scrollingContainer = this._getConfigOrDefault('scrollingContainer')\n config.bounds = this._getConfigOrDefault('bounds')\n config.customOptions = this._getConfigOrDefault('customOptions')\n config.customModules = this._getConfigOrDefault('customModules')\n config.trackChanges = this._getConfigOrDefault('trackChanges')\n config.preserveWhitespace = this._getConfigOrDefault('preserveWhitespace')\n config.classes = this._getConfigOrDefault('classes')\n config.trimOnValidation = this._getConfigOrDefault('trimOnValidation')\n config.linkPlaceholder = this._getConfigOrDefault('linkPlaceholder')\n config.compareValues = this._getConfigOrDefault('compareValues')\n config.filterNull = this._getConfigOrDefault('filterNull')\n config.debounceTime = this._getConfigOrDefault('debounceTime')\n\n this._config.next(config)\n\n // setTimeout bc ngx-quill library doesn't listen for input changes,\n // so we must destroy and create the component each time config is updated\n setTimeout(() => {\n this._configSet.next(true)\n }, 0)\n }\n\n private _getConfigOrDefault<K extends keyof TheSeamQuillEditorConfig>(prop: K): TheSeamQuillEditorConfig[K] {\n if (this._customConfig && Object.prototype.hasOwnProperty.call(this._customConfig, prop)) {\n return this._customConfig[prop]\n }\n return THESEAM_QUILL_EDITOR_CONFIG_DEFAULT[prop]\n }\n\n private _updateQuillConfig() {\n if (this._configSet.value) {\n this._buildQuillConfig()\n }\n }\n\n // Not usable, bc config has to be set immediately, potentially before mentions populate.\n // To set customDataAttributes, provide a custom config.\n // private _getCustomDataAttributes(mentions: TheSeamQuillMentionMenuOption[]): string[] {\n // return mentions.reduce((acc, mention) => {\n // const keys = Object.keys(mention)\n\n // keys.forEach(key => {\n // if (acc.findIndex(a => a === key) === -1) {\n // acc.push(key)\n // }\n // })\n\n // return acc\n // }, <string[]>[] satisfies string[])\n // }\n\n get value(): string | undefined | null {\n return this._value\n }\n set value(value: string | undefined | null) {\n this._value = value\n\n if (this.onChange) { this.onChange(value) }\n if (this.onTouched) { this.onTouched() }\n }\n private _value: string | undefined | null\n\n writeValue(value: any): void {\n this._isWritingValue = true\n\n this.formControl.setValue(value)\n this.value = value\n\n this._isWritingValue = false\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.readOnly = isDisabled\n }\n\n _onEditorCreated(event: any) {\n this.quillEditorCreated.emit(event)\n }\n\n _onEditorChanged(event: EditorChangeContent | EditorChangeSelection) {\n this.quillEditorChanged.emit(event)\n }\n\n _onContentChanged(event: ContentChange) {\n this.quillContentChanged.emit(event)\n\n this._updateMentionsFromDelta(event.content)\n }\n\n _onSelectionChanged(event: SelectionChange) {\n this.quillSelectionChanged.emit(event)\n }\n\n _onFocus(event: Focus) {\n this.quillFocus.emit(event)\n }\n\n _onBlur(event: Blur) {\n this.quillBlur.emit(event)\n\n if (this.onTouched) {\n this.onTouched()\n }\n }\n\n /**\n * Hacky way to track mention inserts/deletes\n */\n private _updateMentionsFromDelta(content: Delta) {\n if (notNullOrUndefined(content.ops)) {\n const contentMentionIds = content.ops.map(o => o.insert?.mention?.id).filter(notNullOrUndefined)\n const selectedMentions = [ ...this._selectedMentions.value ]\n const mentionOptions = [ ...this._mentionItems.value || [] ]\n\n const newMentions: TheSeamQuillMentionMenuOption[] = contentMentionIds.reduce((acc, mentionId) => {\n const insertMention = mentionOptions.find(m => isMentionMenuOption(m) && m.id === mentionId)\n\n if (notNullOrUndefined(insertMention)) {\n acc.push(insertMention)\n }\n else {\n console.warn('Mention addition failed! Selected mention option not found:', mentionId)\n }\n\n return acc\n }, <TheSeamQuillMentionMenuOption[]>[])\n\n let emitUpdate = false\n if (selectedMentions.length !== newMentions.length) {\n // if the length has changed, we know an update occurred\n emitUpdate = true\n }\n else {\n // otherwise, test ids for old and new items to see if we need to emit a change\n const selectedMentionIds = this._selectedMentions.value.map(m => m.id)\n const newMentionIds = newMentions.map(m => m.id)\n\n if (\n selectedMentionIds.findIndex(m => !newMentionIds.includes(m)) !== -1 ||\n newMentionIds.findIndex(m => !selectedMentionIds.includes(m)) !== -1\n ) {\n emitUpdate = true\n }\n }\n\n if (emitUpdate) {\n this._selectedMentions.next(newMentions)\n }\n }\n }\n}\n","<div class=\"editor\" *ngIf=\"configSet$ | async\" [class.initializing]=\"!(initialized$ | async)\">\n <ng-container *ngIf=\"config$ | async as config\">\n <quill-editor\n #quillEditor\n seamInput\n [class.disabled]=\"readOnly\"\n [attr.disabled]=\"readOnly\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [readOnly]=\"readOnly\"\n [required]=\"required\"\n [minLength]=\"minLength\"\n [maxLength]=\"maxLength\"\n [format]=\"config.format\"\n [theme]=\"config.theme\"\n [modules]=\"config.modules\"\n [debug]=\"config.debug\"\n [formats]=\"config.formats\"\n [customToolbarPosition]=\"config.customToolbarPosition\"\n [sanitize]=\"config.sanitize\"\n [styles]=\"config.styles\"\n [strict]=\"config.strict\"\n [scrollingContainer]=\"config.scrollingContainer\"\n [bounds]=\"config.bounds\"\n [customOptions]=\"config.customOptions\"\n [customModules]=\"config.customModules\"\n [trackChanges]=\"config.trackChanges\"\n [preserveWhitespace]=\"config.preserveWhitespace\"\n [classes]=\"config.classes\"\n [trimOnValidation]=\"config.trimOnValidation\"\n [linkPlaceholder]=\"config.linkPlaceholder\"\n [compareValues]=\"config.compareValues\"\n [filterNull]=\"config.filterNull\"\n [debounceTime]=\"config.debounceTime\"\n [class.can-resize]=\"resizable\"\n (onEditorCreated)=\"_onEditorCreated($event)\"\n (onEditorChanged)=\"_onEditorChanged($event)\"\n (onContentChanged)=\"_onContentChanged($event)\"\n (onSelectionChanged)=\"_onSelectionChanged($event)\"\n (onFocus)=\"_onFocus($event)\"\n (onBlur)=\"_onBlur($event)\"></quill-editor>\n <ng-container *ngIf=\"displayCharacterCounter\">\n <ng-container\n [ngTemplateOutlet]=\"characterCounterTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: characterCount$ | async, minLength: minLength, maxLength: maxLength, characterCount: characterCount$ | async }\"></ng-container>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #characterCounter let-implicit let-minLength=\"minLength\" let-maxLength=\"maxLength\" let-characterCount=\"characterCount\">\n <div class=\"small text-black-50 text-right\">\n <ng-container *ngIf=\"characterCount || characterCount === 0\">\n Character Count:\n <span [class.text-danger]=\"characterCount && ((maxLength && characterCount > maxLength) || (minLength && characterCount < minLength))\">\n {{ characterCount | number }}\n </span>\n <ng-container *ngIf=\"maxLength\">\n / {{ maxLength }}\n </ng-container>\n <span *ngIf=\"minLength\" class=\"font-italic\">\n (minimum {{ minLength }} expected)\n </span>\n </ng-container>\n </div>\n</ng-template>\n","import { CustomModule, CustomOption, QuillModules } from 'ngx-quill'\r\nimport QuillType from 'quill'\r\n\r\nexport interface TheSeamQuillMentionMenuOption {\r\n /** Must be unique. */\r\n id: string\r\n\r\n /**\r\n * The value is used as the label for the mentions,\r\n * both in the text area and in the menu.\r\n */\r\n value: string\r\n\r\n /**\r\n * When `true`, this item will be included in the menu,\r\n * regardless of the search function applied.\r\n */\r\n searchIgnore?: boolean\r\n\r\n /**\r\n * If provided, will group items with the same `groupName`\r\n * under one header.\r\n */\r\n groupName?: string\r\n\r\n /** Any additional optional parameters */\r\n [key: string]: any\r\n}\r\n\r\nexport interface TheSeamQuillMentionMenuDivider {\r\n type: 'divider'\r\n disabled?: boolean\r\n}\r\n\r\nexport interface TheSeamQuillMentionMenuHeader {\r\n value: string\r\n type: 'groupName'\r\n disabled?: boolean\r\n}\r\n\r\nexport type TheSeamQuillMentionMenuItem = TheSeamQuillMentionMenuOption | TheSeamQuillMentionMenuDivider | TheSeamQuillMentionMenuHeader\r\n\r\nexport type TheSeamQuillMentionSearchFn = (\r\n source: TheSeamQuillMentionMenuItem[],\r\n textAfter: string,\r\n mentionChar: string\r\n) => TheSeamQuillMentionMenuItem[]\r\n\r\nexport type TheSeamQuillMentionSourceFn = (\r\n source: TheSeamQuillMentionMenuItem[],\r\n searchFn: TheSeamQuillMentionSearchFn,\r\n emptyListItem: TheSeamQuillMentionMenuItem | undefined,\r\n textAfter: string,\r\n renderList: (\r\n matches: {\r\n id: string\r\n value: string\r\n [key: string]: string | undefined\r\n }[],\r\n searchTerm: string\r\n ) => void,\r\n mentionChar: string\r\n) => void\r\n\r\n/**\r\n * Typed version of Options object, copied from quill-mention@v6.0.1 (typescript version)\r\n */\r\nexport interface TheSeamQuillMentionOptions {\r\n /**\r\n * Specifies which characters will cause the mention autocomplete to open\r\n * @default ['@']\r\n */\r\n mentionDenotationChars?: string[]\r\n\r\n /**\r\n * Whether to show the used denotation character in the mention item or not\r\n * @default true\r\n */\r\n showDenotationChar?: boolean\r\n\r\n /**\r\n * Allowed characters in search term triggering a search request using regular expressions. Can be a function that takes the denotationChar and returns a regex.\r\n * @default /^[a-zA-Z0-9_]*$/\r\n */\r\n allowedChars?: RegExp | ((char: string) => RegExp)\r\n\r\n /**\r\n * Minimum number of characters after the @ symbol triggering a search request\r\n * @default 0\r\n */\r\n minChars?: number\r\n\r\n /**\r\n * Maximum number of characters after the @ symbol triggering a search request\r\n * @default 31\r\n */\r\n maxChars?: number\r\n\r\n /**\r\n * Additional top offset of the mention container position\r\n * @default 2\r\n */\r\n offsetTop?: number\r\n\r\n /**\r\n * Additional left offset of the mention container position\r\n * @default 0\r\n */\r\n offsetLeft?: number\r\n\r\n /**\r\n * Whether or not the denotation character(s) should be isolated. For example, to avoid mentioning in an email.\r\n * @default false\r\n */\r\n isolateCharacter?: boolean\r\n\r\n /**\r\n * Only works if isolateCharacter is set to true. Whether or not the denotation character(s) can appear inline of the mention text. For example, to allow mentioning an email with the @ symbol as the denotation character.\r\n * @default false\r\n */\r\n allowInlineMentionChar?: boolean\r\n\r\n /**\r\n * When set to true, the mentions menu will be rendered above or below the quill container. Otherwise, the mentions menu will track the denotation character(s);\r\n * @default false\r\n */\r\n fixMentionsToQuill?: boolean\r\n\r\n /**\r\n * Options are 'normal' and 'fixed'. When 'fixed', the menu will be appended to the body and use fixed positioning. Use this if the menu is clipped by a parent element that's using `overflow:hidden\r\n * @default 'normal'\r\n */\r\n positioningStrategy?: 'normal' | 'fixed'\r\n\r\n /**\r\n * Options are 'bottom' and 'top'. Determines what the default orientation of the menu will be. Quill-mention will attempt to render the menu either above or below the editor. If 'top' is provided as a value, and there is not enough space above the editor, the menu will be rendered below. Vice versa, if there is not enough space below the editor, and 'bottom' is provided as a value (or no value is provided at all), the menu will be rendered above the editor.\r\n * @default 'bottom'\r\n */\r\n defaultMenuOrientation?: 'top' | 'bottom'\r\n\r\n /**\r\n * The name of the Quill Blot to be used for inserted mentions. A default implementation is provided named 'mention', which may be overridden with a custom blot.\r\n * @default 'mention'\r\n */\r\n blotName?: string\r\n\r\n /**\r\n * A list of data values you wish to be passed from your list data to the html node. (id, value, denotationChar, link, target are included by default).\r\n * @default ['id', 'value', 'denotationChar', 'link', 'target', 'disabled']\r\n */\r\n dataAttributes?: string[]\r\n\r\n /**\r\n * Link target for mentions with a link\r\n * @default '_blank'\r\n */\r\n linkTarget?: string\r\n\r\n /**\r\n * Style class to be used for list items (may be null)\r\n * @default 'ql-mention-list-item'\r\n */\r\n listItemClass?: string\r\n\r\n /**\r\n * Style class to be used for the mention list container (may be null)\r\n * @default 'ql-mention-list-container'\r\n */\r\n mentionContainerClass?: string\r\n\r\n /**\r\n * Style class to be used for the mention list (may be null)\r\n * @default 'ql-mention-list'\r\n */\r\n mentionListClass?: string\r\n\r\n /**\r\n * Whether or not insert 1 space after mention block in text\r\n * @default true\r\n */\r\n spaceAfterInsert?: boolean\r\n\r\n /**\r\n * An array of keyboard key codes that will trigger the select action for the mention dropdown. Default is ENTER key. See this reference for a list of numbers for each keyboard key.\r\n * @default [13]\r\n */\r\n selectKeys?: (string | number | string)[]\r\n\r\n /**\r\n * Required callback function to handle the search term and connect it to a data source for matches. The data source can be a local source or an AJAX request.\r\n * The callback should call renderList(matches, searchTerm); with matches of JSON Objects in an array to show the result for the user. The JSON Objects should have id and value but can also have other values to be used in renderItem for custom display.\r\n * @param textAfter\r\n * @param render\r\n * @param mentionChar\r\n * @returns\r\n */\r\n source: (\r\n textAfter: string,\r\n renderList: (\r\n matches: {\r\n id: string\r\n value: string\r\n [key: string]: string | undefined\r\n }[],\r\n searchTerm: string\r\n ) => void,\r\n mentionChar: string\r\n ) => void\r\n\r\n /**\r\n * Callback when mention dropdown is open.\r\n * @returns\r\n */\r\n onOpen?: () => boolean\r\n\r\n /**\r\n * Callback before the DOM of mention dropdown is removed.\r\n * @returns\r\n */\r\n onBeforeClose?: () => boolean\r\n\r\n /**\r\n * Callback when mention dropdown is closed.\r\n * @returns\r\n */\r\n onClose?: () => boolean\r\n\r\n /**\r\n * A function that gives you control over how matches from source are displayed. You can use this function to highlight the search term or change the design with custom HTML. This function will need to return either a string possibly containing unsanitized user content, or a class implementing the Node interface which will be treated as a sanitized DOM node.\r\n * @param item\r\n * @param searchTerm\r\n * @returns\r\n */\r\n renderItem?: (\r\n item: { id: string; value: string; [key: string]: unknown },\r\n searchTerm: string\r\n ) => string | HTMLElement\r\n\r\n /**\r\n * A function that returns the HTML for a loading message during async calls from source. The function will need to return either a string possibly containing unsanitized user content, or a class implementing the Node interface which will be treated as a sanitized DOM node. The default functions returns null to prevent a loading message.\r\n * @returns\r\n */\r\n renderLoading?: () => string | HTMLElement | null\r\n\r\n /**\r\n * Callback for a selected item. When overriding this method, insertItem should be used to insert item to the editor. This makes async requests possible.\r\n * @param item\r\n * @param insertItem\r\n */\r\n onSelect?: (\r\n item: DOMStringMap,\r\n insertItem: (\r\n data: Record<string, unknown>,\r\n programmaticInsert?: boolean,\r\n overriddenOptions?: object\r\n ) => void\r\n ) => void\r\n}\r\n\r\nexport interface TheSeamQuillModules extends QuillModules {\r\n mention?: Partial<TheSeamQuillMentionOptions>\r\n}\r\n\r\nexport const THESEAM_QUILL_FORMATS = [\r\n 'align',\r\n 'background',\r\n 'blockquote',\r\n 'bold',\r\n 'code-block',\r\n 'code',\r\n 'color',\r\n 'direction',\r\n 'font',\r\n 'header',\r\n 'image',\r\n 'indent',\r\n 'italic',\r\n 'link',\r\n 'list',\r\n 'script',\r\n 'size',\r\n 'strike',\r\n 'underline',\r\n 'video',\r\n 'mention'\r\n] as const\r\n\r\nexport type TheSeamQuillStyleFormat = (typeof THESEAM_QUILL_FORMATS)[number]\r\n\r\nexport type TheSeamQuillInputFormat = 'object' | 'html' | 'text' | 'json'\r\n\r\nexport interface TheSeamQuillEditorConfig {\r\n /**\r\n * The format of the text inside the editor.\r\n *\r\n * @default 'html'\r\n */\r\n format: TheSeamQuillInputFormat\r\n\r\n /** @default 'snow' */\r\n theme?: string\r\n\r\n /**\r\n * Used to set custom config for built-in and add-on modules.\r\n *\r\n * See `SEAM_QUILL_MODULES_DEFAULT` for default value.\r\n */\r\n modules?: TheSeamQuillModules\r\n\r\n /**\r\n * Console level for debug messages.\r\n *\r\n * @default `warn`\r\n */\r\n debug?: 'warn' | 'log' | 'error' | false\r\n\r\n /**\r\n * List of formats allowed in editor.\r\n *\r\n * See `SEAM_QUILL_FORMATS_DEFAULT` for default value.\r\n *\r\n * NOTE: Adding or removing a value will enable/disable that format\r\n * in the editor, but has no effect on the toolbar buttons.\r\n * To modify the toolbar display, update `modules.toolbar`.\r\n */\r\n formats?: TheSeamQuillStyleFormat[] | null\r\n\r\n /** @default 'top' */\r\n customToolbarPosition: 'top' | 'bottom'\r\n\r\n /**\r\n * When `true`, runs the control value through Angular's DOM sanitizer\r\n * before setting the value.\r\n *\r\n * @default false\r\n */\r\n sanitize: boolean\r\n\r\n /** Custom css styles to add to the `.ql-container` element. */\r\n styles?: { [key: string]: string } | null\r\n\r\n /**\r\n * When `false`, user interactions in the toolbar will emit even\r\n * if the editor is marked as `readOnly`. This allows the user to\r\n * make some formatting changes (e.g. creating a list) to a value\r\n * that should be disabled.\r\n *\r\n * @default true.\r\n */\r\n strict: boolean\r\n\r\n /**\r\n * An element or selector that specifies the scrolling element of the editor.\r\n *\r\n * Default scrollingContainer is the `.ql-editor` element.\r\n */\r\n scrollingContainer?: HTMLElement | string | null\r\n\r\n /**\r\n * An element or selector that specifies the confining element of the editor.\r\n *\r\n * Default boundary container is the document's `body` element.\r\n */\r\n bounds?: HTMLElement | string\r\n\r\n /**\r\n * Defines custom formats for the editor. Can be used to overwrite existing options.\r\n *\r\n * TODO: Research this more.\r\n */\r\n customOptions: CustomOption[]\r\n\r\n /**\r\n * Defines custom modules for the editor. Can be used to overwrite existing modules.\r\n *\r\n * TODO: Research this more.\r\n */\r\n customModules: CustomModule[]\r\n\r\n /**\r\n * When `user`, only change events from the user will trigger a model change.\r\n * This is the default behavior, and is preferred.\r\n *\r\n * Changing to `all` is not recommended.\r\n */\r\n trackChanges?: 'user' | 'all'\r\n\r\n /**\r\n * When `true`, preserves duplicated whitespaces.\r\n *\r\n * @default false\r\n */\r\n preserveWhitespace: boolean\r\n\r\n /** Custom classes to add to the `.ql-container` element. */\r\n classes?: string\r\n\r\n /**\r\n * When `true`, trims leading/trailing newlines when validation is run.\r\n *\r\n * @default false\r\n */\r\n trimOnValidation: boolean\r\n\r\n /**\r\n * Sets a placeholder for the link input in the hyperlink form.\r\n *\r\n * @default 'https://quilljs.com'\r\n */\r\n linkPlaceholder?: string\r\n\r\n /**\r\n * When `true`, does a basic compare (using JSON.stringify) between the old\r\n * and new value on `writeValue()`. If the values are the same, it skips the update.\r\n *\r\n * @default false\r\n */\r\n compareValues: boolean\r\n\r\n /**\r\n * When `true`, skips the update for null values on `writeValue()`.\r\n *\r\n * @default false\r\n */\r\n filterNull: boolean\r\n\r\n /**\r\n * Debounces `onContentChanged()`, `onEditorChanged()`, `ngModel` and form control `valueChange()`.\r\n *\r\n * Defaults to `undefined`, so changes always emit immediately.\r\n *\r\n * @default undefined\r\n */\r\n debounceTime?: number\r\n\r\n /**\r\n * @deprecated The `ngx-quill` library doesn't accurately handle undefined\r\n * inputs, and the default `valueGetter` function is impossible to reference here,\r\n * so this config option is not used.\r\n *\r\n * Defines custom logic for reading the html value of the editor.\r\n */\r\n valueGetter?: (\r\n quillEditor: QuillType,\r\n editorElement: HTMLElement\r\n ) => string | any\r\n\r\n /**\r\n * @deprecated The `ngx-quill` library doesn't accurately handle undefined\r\n * inputs, and the default `valueSetter` function is impossible to reference here,\r\n * so this config option is not used.\r\n *\r\n * Defines custom logic for setting the html value of the editor.\r\n */\r\n valueSetter?: (quillEditor: QuillType, value: any) => any\r\n}\r\n\r\nexport type TheSeamCharacterCounterFn = (\r\n value: string,\r\n format: TheSeamQuillInputFormat | undefined\r\n) => number\r\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { QuillModule } from 'ngx-quill';\nimport { RichTextComponent } from './rich-text/rich-text.component';\nimport { ReactiveFormsModule } from '@angular/forms';\n\n@NgModule({\n declarations: [\n RichTextComponent,\n ],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n QuillModule\n ],\n exports: [\n RichTextComponent,\n ]\n})\nexport class TheSeamRichTextModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@theseam/ui-common",
3
- "version": "0.4.26",
3
+ "version": "0.4.27",
4
4
  "peerDependencies": {
5
5
  "@angular/cdk": "^15.0.0",
6
6
  "@angular/common": "^15.0.0",
@@ -1,4 +1,4 @@
1
- import { AfterViewInit, EventEmitter, OnInit, Provider, Renderer2, TemplateRef } from '@angular/core';
1
+ import { AfterViewInit, EventEmitter, OnDestroy, OnInit, Provider, Renderer2, TemplateRef } from '@angular/core';
2
2
  import { ControlValueAccessor, FormControl } from '@angular/forms';
3
3
  import { Blur, ContentChange, EditorChangeContent, EditorChangeSelection, Focus, QuillEditorComponent, SelectionChange } from 'ngx-quill';
4
4
  import 'quill-mention';
@@ -6,7 +6,7 @@ import { Observable } from 'rxjs';
6
6
  import { TheSeamCharacterCounterFn, TheSeamQuillEditorConfig, TheSeamQuillMentionMenuItem, TheSeamQuillMentionMenuOption, TheSeamQuillMentionSearchFn, TheSeamQuillMentionSourceFn } from '../utils/models';
7
7
  import * as i0 from "@angular/core";
8
8
  export declare const RICH_TEXT_VALUE_ACCESSOR: Provider;
9
- export declare class RichTextComponent implements OnInit, AfterViewInit, ControlValueAccessor {
9
+ export declare class RichTextComponent implements OnInit, AfterViewInit, OnDestroy, ControlValueAccessor {
10
10
  private readonly _renderer;
11
11
  private _customConfig?;
12
12
  onChange: any;
@@ -148,10 +148,11 @@ export declare class RichTextComponent implements OnInit, AfterViewInit, Control
148
148
  quillFocus: EventEmitter<Focus>;
149
149
  quillBlur: EventEmitter<Blur>;
150
150
  mentionsUpdated: EventEmitter<TheSeamQuillMentionMenuOption[]>;
151
- get quillEditor(): TemplateRef<QuillEditorComponent> | undefined;
152
- set quillEditor(value: TemplateRef<QuillEditorComponent> | undefined);
151
+ get quillEditor(): QuillEditorComponent | undefined;
152
+ set quillEditor(value: QuillEditorComponent | undefined);
153
153
  private _quillEditor;
154
154
  defaultCharacterCounterTpl: TemplateRef<any> | undefined;
155
+ _handleKeydown(event: KeyboardEvent): void;
155
156
  private _isWritingValue;
156
157
  private _pollCalculatedRowHeight;
157
158
  private _configSet;
@@ -167,6 +168,7 @@ export declare class RichTextComponent implements OnInit, AfterViewInit, Control
167
168
  constructor(_renderer: Renderer2, _customConfig?: TheSeamQuillEditorConfig | undefined);
168
169
  ngOnInit(): void;
169
170
  ngAfterViewInit(): void;
171
+ ngOnDestroy(): void;
170
172
  private _buildQuillConfig;
171
173
  private _getConfigOrDefault;
172
174
  private _updateQuillConfig;