UNPKG

ngx-trumbowyg

Version:

This an Angular wrapper for [Trumbowyg WYSIWYG editor](https://alex-d.github.io/Trumbowyg/).

258 lines (249 loc) 19.2 kB
import { InjectionToken, Directive, ElementRef, Inject, Input, Optional, Component, ViewChild, NgModule } from '@angular/core'; import { __assign, __extends } from 'tslib'; import { NgControl } from '@angular/forms'; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var /** @type {?} */ TRUMBOWYG_OPTIONS = new InjectionToken('Trumbowyg options'); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @abstract */ var /** * @abstract */ EditorBase = /** @class */ (function () { function EditorBase(editorControl, _config) { this.editorControl = editorControl; this._config = _config; if (_config && _config.events && (_config.events['tbwinit'] || _config.events['tbwchange'] || _config.events['tbwfocus'])) { throw new Error('Forbidden event registration. These events are protected for the Ngx-Trumbowyg library: tbwinit, tbwchange, tbwfocus'); } editorControl.valueAccessor = this; } /** * @return {?} */ EditorBase.prototype.ngOnInit = /** * @return {?} */ function () { var /** @type {?} */ control = this.editorControl.control; control.setValidators(control.validator); control.updateValueAndValidity(); }; /** * @return {?} */ EditorBase.prototype.ngAfterViewInit = /** * @return {?} */ function () { var _this = this; var /** @type {?} */ editor = $(this._editor.nativeElement) .trumbowyg(__assign({}, this._config, this.options)) .on('tbwinit', function () { _this.setDisabledState(_this._disabled); _this.setContent(_this._initValue); }) .on('tbwchange', function () { _this._onChange(_this.getContent()); }) .on('tbwfocus', function () { _this._onTouch(); }); if (this._config && this._config.events) { var /** @type {?} */ events_1 = this._config.events; Object.keys(events_1).forEach(function (eventName) { editor.on(eventName, events_1[eventName]()); }); } }; /** * @param {?} fn * @return {?} */ EditorBase.prototype.registerOnChange = /** * @param {?} fn * @return {?} */ function (fn) { this._onChange = fn; }; /** * @param {?} fn * @return {?} */ EditorBase.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { this._onTouch = fn; }; /** * @param {?} value * @return {?} */ EditorBase.prototype.writeValue = /** * @param {?} value * @return {?} */ function (value) { this._initValue = value; if (this._editor && this._editor.nativeElement) { this.setContent(value); } }; /** * @param {?} disabled * @return {?} */ EditorBase.prototype.setDisabledState = /** * @param {?} disabled * @return {?} */ function (disabled) { this._disabled = disabled; if (this._editor) { $(this._editor.nativeElement).trumbowyg(this._disabled ? 'disable' : 'enable'); } }; /** * @return {?} */ EditorBase.prototype.ngOnDestroy = /** * @return {?} */ function () { $(this._editor.nativeElement).trumbowyg('destroy'); }; /** * @param {?} content * @return {?} */ EditorBase.prototype.setContent = /** * @param {?} content * @return {?} */ function (content) { $(this._editor.nativeElement).trumbowyg('html', content); }; /** * @return {?} */ EditorBase.prototype.getContent = /** * @return {?} */ function () { return $(this._editor.nativeElement).trumbowyg('html'); }; return EditorBase; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var EditorDirective = /** @class */ (function (_super) { __extends(EditorDirective, _super); function EditorDirective(editorControl, _config, _editor) { var _this = _super.call(this, editorControl, _config) || this; _this.editorControl = editorControl; _this._config = _config; _this._editor = _editor; return _this; } EditorDirective.decorators = [ { type: Directive, args: [{ selector: '[ngxTrumbowygEditor]' },] } ]; /** @nocollapse */ EditorDirective.ctorParameters = function () { return [ { type: NgControl }, { type: undefined, decorators: [{ type: Inject, args: [TRUMBOWYG_OPTIONS,] }, { type: Optional }] }, { type: ElementRef } ]; }; EditorDirective.propDecorators = { options: [{ type: Input }], placeholder: [{ type: Input }] }; return EditorDirective; }(EditorBase)); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var EditorComponent = /** @class */ (function (_super) { __extends(EditorComponent, _super); function EditorComponent(editorControl, _config) { var _this = _super.call(this, editorControl, _config) || this; _this.editorControl = editorControl; _this._config = _config; return _this; } EditorComponent.decorators = [ { type: Component, args: [{ // tslint:disable-next-line:component-selector selector: 'ngx-trumbowyg-editor', template: "<textarea #editor [placeholder]=\"placeholder ? placeholder : ''\"></textarea>\n", styles: [""] }] } ]; /** @nocollapse */ EditorComponent.ctorParameters = function () { return [ { type: NgControl }, { type: undefined, decorators: [{ type: Inject, args: [TRUMBOWYG_OPTIONS,] }, { type: Optional }] } ]; }; EditorComponent.propDecorators = { options: [{ type: Input }], placeholder: [{ type: Input }], _editor: [{ type: ViewChild, args: ['editor',] }] }; return EditorComponent; }(EditorBase)); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var NgxTrumbowygModule = /** @class */ (function () { function NgxTrumbowygModule() { } /** * @param {?} options * @return {?} */ NgxTrumbowygModule.withConfig = /** * @param {?} options * @return {?} */ function (options) { return { ngModule: NgxTrumbowygModule, providers: [{ provide: TRUMBOWYG_OPTIONS, useValue: options }] }; }; NgxTrumbowygModule.decorators = [ { type: NgModule, args: [{ declarations: [EditorDirective, EditorComponent], exports: [EditorDirective, EditorComponent] },] } ]; return NgxTrumbowygModule; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ export { NgxTrumbowygModule, EditorBase as ɵb, EditorComponent as ɵd, TRUMBOWYG_OPTIONS as ɵc, EditorDirective as ɵa }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRydW1ib3d5Zy5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbmd4LXRydW1ib3d5Zy9saWIvY29uZmlncy9pbmplY3Rpb24tdG9rZW4udHMiLCJuZzovL25neC10cnVtYm93eWcvbGliL2NvbW1vbnMvZWRpdG9yLWJhc2UudHMiLCJuZzovL25neC10cnVtYm93eWcvbGliL2RpcmVjdGl2ZS9lZGl0b3IuZGlyZWN0aXZlLnRzIiwibmc6Ly9uZ3gtdHJ1bWJvd3lnL2xpYi9jb21wb25lbnQvZWRpdG9yL2VkaXRvci5jb21wb25lbnQudHMiLCJuZzovL25neC10cnVtYm93eWcvbGliL25neC10cnVtYm93eWcubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcnVtYm93eWdPcHRpb25zIH0gZnJvbSAnLi90cnVtYm93eWctb3B0aW9ucyc7XG5cbmV4cG9ydCBjb25zdCBUUlVNQk9XWUdfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxUcnVtYm93eWdPcHRpb25zPihcbiAgJ1RydW1ib3d5ZyBvcHRpb25zJ1xuKTtcbiIsImltcG9ydCB7IEFmdGVyVmlld0luaXQsIEVsZW1lbnRSZWYsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVHJ1bWJvd3lnT3B0aW9ucyB9IGZyb20gJy4uL2NvbmZpZ3MvdHJ1bWJvd3lnLW9wdGlvbnMnO1xuXG5kZWNsYXJlIGNvbnN0ICQ6IGFueTtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEVkaXRvckJhc2UgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBvcHRpb25zOiBUcnVtYm93eWdPcHRpb25zIHwgbnVsbDtcblxuICBwbGFjZWhvbGRlcjogc3RyaW5nIHwgbnVsbDtcblxuICBwcm90ZWN0ZWQgX2VkaXRvcjogRWxlbWVudFJlZjtcblxuICBwcm90ZWN0ZWQgX2luaXRWYWx1ZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuO1xuXG4gIHByaXZhdGUgX29uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZDtcblxuICBwcml2YXRlIF9vblRvdWNoOiAoKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBlZGl0b3JDb250cm9sOiBOZ0NvbnRyb2wsIHByb3RlY3RlZCBfY29uZmlnOiBUcnVtYm93eWdPcHRpb25zKSB7XG4gICAgaWYgKFxuICAgICAgX2NvbmZpZyAmJlxuICAgICAgX2NvbmZpZy5ldmVudHMgJiZcbiAgICAgIChfY29uZmlnLmV2ZW50c1sndGJ3aW5pdCddIHx8IF9jb25maWcuZXZlbnRzWyd0YndjaGFuZ2UnXSB8fCBfY29uZmlnLmV2ZW50c1sndGJ3Zm9jdXMnXSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0ZvcmJpZGRlbiBldmVudCByZWdpc3RyYXRpb24uIFRoZXNlIGV2ZW50cyBhcmUgcHJvdGVjdGVkIGZvciB0aGUgTmd4LVRydW1ib3d5ZyBsaWJyYXJ5OiB0Yndpbml0LCB0YndjaGFuZ2UsIHRid2ZvY3VzJ1xuICAgICAgKTtcbiAgICB9XG4gICAgZWRpdG9yQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmVkaXRvckNvbnRyb2wuY29udHJvbDtcbiAgICBjb250cm9sLnNldFZhbGlkYXRvcnMoY29udHJvbC52YWxpZGF0b3IpO1xuICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGVkaXRvciA9ICQodGhpcy5fZWRpdG9yLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAudHJ1bWJvd3lnKHsgLi4udGhpcy5fY29uZmlnLCAuLi50aGlzLm9wdGlvbnMgfSlcbiAgICAgIC5vbigndGJ3aW5pdCcsICgpID0+IHtcbiAgICAgICAgdGhpcy5zZXREaXNhYmxlZFN0YXRlKHRoaXMuX2Rpc2FibGVkKTtcbiAgICAgICAgdGhpcy5zZXRDb250ZW50KHRoaXMuX2luaXRWYWx1ZSk7XG4gICAgICB9KVxuICAgICAgLm9uKCd0YndjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMuZ2V0Q29udGVudCgpKTtcbiAgICAgIH0pXG4gICAgICAub24oJ3Rid2ZvY3VzJywgKCkgPT4ge1xuICAgICAgICB0aGlzLl9vblRvdWNoKCk7XG4gICAgICB9KTtcblxuICAgIGlmICh0aGlzLl9jb25maWcgJiYgdGhpcy5fY29uZmlnLmV2ZW50cykge1xuICAgICAgY29uc3QgZXZlbnRzID0gdGhpcy5fY29uZmlnLmV2ZW50cztcbiAgICAgIE9iamVjdC5rZXlzKGV2ZW50cykuZm9yRWFjaChldmVudE5hbWUgPT4ge1xuICAgICAgICBlZGl0b3Iub24oZXZlbnROYW1lLCBldmVudHNbZXZlbnROYW1lXSgpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9vblRvdWNoID0gZm47XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9pbml0VmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmICh0aGlzLl9lZGl0b3IgJiYgdGhpcy5fZWRpdG9yLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuc2V0Q29udGVudCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gZGlzYWJsZWQ7XG5cbiAgICBpZiAodGhpcy5fZWRpdG9yKSB7XG4gICAgICAkKHRoaXMuX2VkaXRvci5uYXRpdmVFbGVtZW50KS50cnVtYm93eWcodGhpcy5fZGlzYWJsZWQgPyAnZGlzYWJsZScgOiAnZW5hYmxlJyk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgJCh0aGlzLl9lZGl0b3IubmF0aXZlRWxlbWVudCkudHJ1bWJvd3lnKCdkZXN0cm95Jyk7XG4gIH1cblxuICBwcml2YXRlIHNldENvbnRlbnQoY29udGVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgJCh0aGlzLl9lZGl0b3IubmF0aXZlRWxlbWVudCkudHJ1bWJvd3lnKCdodG1sJywgY29udGVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRlbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJCh0aGlzLl9lZGl0b3IubmF0aXZlRWxlbWVudCkudHJ1bWJvd3lnKCdodG1sJyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5qZWN0LCBJbnB1dCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEVkaXRvckJhc2UgfSBmcm9tICcuLi9jb21tb25zL2VkaXRvci1iYXNlJztcbmltcG9ydCB7IFRydW1ib3d5Z09wdGlvbnMgfSBmcm9tICcuLi9jb25maWdzL3RydW1ib3d5Zy1vcHRpb25zJztcbmltcG9ydCB7IFRSVU1CT1dZR19PUFRJT05TIH0gZnJvbSAnLi4vY29uZmlncy9pbmplY3Rpb24tdG9rZW4nO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmd4VHJ1bWJvd3lnRWRpdG9yXSdcbn0pXG5leHBvcnQgY2xhc3MgRWRpdG9yRGlyZWN0aXZlIGV4dGVuZHMgRWRpdG9yQmFzZSB7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IFRydW1ib3d5Z09wdGlvbnMgfCBudWxsO1xuXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBlZGl0b3JDb250cm9sOiBOZ0NvbnRyb2wsXG4gICAgQEluamVjdChUUlVNQk9XWUdfT1BUSU9OUylcbiAgICBAT3B0aW9uYWwoKVxuICAgIHByb3RlY3RlZCBfY29uZmlnOiBUcnVtYm93eWdPcHRpb25zLFxuICAgIHByb3RlY3RlZCBfZWRpdG9yOiBFbGVtZW50UmVmXG4gICkge1xuICAgIHN1cGVyKGVkaXRvckNvbnRyb2wsIF9jb25maWcpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9wdGlvbmFsLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEVkaXRvckJhc2UgfSBmcm9tICcuLi8uLi9jb21tb25zL2VkaXRvci1iYXNlJztcbmltcG9ydCB7IFRSVU1CT1dZR19PUFRJT05TIH0gZnJvbSAnLi4vLi4vY29uZmlncy9pbmplY3Rpb24tdG9rZW4nO1xuaW1wb3J0IHsgVHJ1bWJvd3lnT3B0aW9ucyB9IGZyb20gJy4uLy4uL2NvbmZpZ3MvdHJ1bWJvd3lnLW9wdGlvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ25neC10cnVtYm93eWctZWRpdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2VkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2VkaXRvci5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRWRpdG9yQ29tcG9uZW50IGV4dGVuZHMgRWRpdG9yQmFzZSB7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IFRydW1ib3d5Z09wdGlvbnMgfCBudWxsO1xuXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgfCBudWxsO1xuXG4gIEBWaWV3Q2hpbGQoJ2VkaXRvcicpIF9lZGl0b3I6IEVsZW1lbnRSZWY7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGVkaXRvckNvbnRyb2w6IE5nQ29udHJvbCxcbiAgICBASW5qZWN0KFRSVU1CT1dZR19PUFRJT05TKVxuICAgIEBPcHRpb25hbCgpXG4gICAgcHJvdGVjdGVkIF9jb25maWc6IFRydW1ib3d5Z09wdGlvbnNcbiAgKSB7XG4gICAgc3VwZXIoZWRpdG9yQ29udHJvbCwgX2NvbmZpZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcnVtYm93eWdPcHRpb25zIH0gZnJvbSAnLi9jb25maWdzL3RydW1ib3d5Zy1vcHRpb25zJztcbmltcG9ydCB7IFRSVU1CT1dZR19PUFRJT05TIH0gZnJvbSAnLi9jb25maWdzL2luamVjdGlvbi10b2tlbic7XG5pbXBvcnQgeyBFZGl0b3JEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZS9lZGl0b3IuZGlyZWN0aXZlJztcbmltcG9ydCB7IEVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50L2VkaXRvci9lZGl0b3IuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbRWRpdG9yRGlyZWN0aXZlLCBFZGl0b3JDb21wb25lbnRdLFxuICBleHBvcnRzOiBbRWRpdG9yRGlyZWN0aXZlLCBFZGl0b3JDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIE5neFRydW1ib3d5Z01vZHVsZSB7XG4gIHN0YXRpYyB3aXRoQ29uZmlnKG9wdGlvbnM6IFRydW1ib3d5Z09wdGlvbnMpOiBNb2R1bGVXaXRoUHJvdmlkZXJzIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IE5neFRydW1ib3d5Z01vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogVFJVTUJPV1lHX09QVElPTlMsIHVzZVZhbHVlOiBvcHRpb25zIH1dXG4gICAgfTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbInRzbGliXzEuX19leHRlbmRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLHFCQUdhLGlCQUFpQixHQUFHLElBQUksY0FBYyxDQUNqRCxtQkFBbUIsQ0FDcEI7Ozs7Ozs7OztBQ0NEOzs7QUFBQTtJQWVFLG9CQUFzQixhQUF3QixFQUFZLE9BQXlCO1FBQTdELGtCQUFhLEdBQWIsYUFBYSxDQUFXO1FBQVksWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFDakYsSUFDRSxPQUFPO1lBQ1AsT0FBTyxDQUFDLE1BQU07YUFDYixPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FDekYsRUFBRTtZQUNBLE1BQU0sSUFBSSxLQUFLLENBQ2Isc0hBQXNILENBQ3ZILENBQUM7U0FDSDtRQUNELGFBQWEsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0tBQ3BDOzs7O0lBRUQsNkJBQVE7OztJQUFSO1FBQ0UscUJBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO1FBQzNDLE9BQU8sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0tBQ2xDOzs7O0lBRUQsb0NBQWU7OztJQUFmO1FBQUEsaUJBb0JDO1FBbkJDLHFCQUFNLE1BQU0sR0FBRyxDQUFDLENB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