fable-editor 1.0.0

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.
Files changed (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +175 -0
  3. package/dist/angular/LICENSE +21 -0
  4. package/dist/angular/README.md +175 -0
  5. package/dist/angular/angular/fable-editor.component.d.ts +29 -0
  6. package/dist/angular/angular/fable-editor.module.d.ts +7 -0
  7. package/dist/angular/angular/index.d.ts +2 -0
  8. package/dist/angular/core/config.d.ts +17 -0
  9. package/dist/angular/core/docx-import.d.ts +1 -0
  10. package/dist/angular/core/editor.d.ts +219 -0
  11. package/dist/angular/core/i18n.d.ts +139 -0
  12. package/dist/angular/core/icons.d.ts +2 -0
  13. package/dist/angular/core/index.d.ts +7 -0
  14. package/dist/angular/core/paste-engine.d.ts +6 -0
  15. package/dist/angular/core/types.d.ts +87 -0
  16. package/dist/angular/esm2022/angular/fable-editor.component.mjs +101 -0
  17. package/dist/angular/esm2022/angular/fable-editor.module.mjs +16 -0
  18. package/dist/angular/esm2022/angular/index.mjs +3 -0
  19. package/dist/angular/esm2022/core/config.mjs +122 -0
  20. package/dist/angular/esm2022/core/docx-import.mjs +391 -0
  21. package/dist/angular/esm2022/core/editor.mjs +2700 -0
  22. package/dist/angular/esm2022/core/i18n.mjs +278 -0
  23. package/dist/angular/esm2022/core/icons.mjs +89 -0
  24. package/dist/angular/esm2022/core/index.mjs +6 -0
  25. package/dist/angular/esm2022/core/paste-engine.mjs +482 -0
  26. package/dist/angular/esm2022/core/types.mjs +2 -0
  27. package/dist/angular/esm2022/fable-editor.mjs +5 -0
  28. package/dist/angular/esm2022/index.mjs +2 -0
  29. package/dist/angular/fesm2022/fable-editor.mjs +4176 -0
  30. package/dist/angular/fesm2022/fable-editor.mjs.map +1 -0
  31. package/dist/angular/index.d.ts +1 -0
  32. package/dist/core/config.d.ts +18 -0
  33. package/dist/core/config.d.ts.map +1 -0
  34. package/dist/core/docx-import.d.ts +2 -0
  35. package/dist/core/docx-import.d.ts.map +1 -0
  36. package/dist/core/editor.css +1175 -0
  37. package/dist/core/editor.d.ts +221 -0
  38. package/dist/core/editor.d.ts.map +1 -0
  39. package/dist/core/i18n.d.ts +141 -0
  40. package/dist/core/i18n.d.ts.map +1 -0
  41. package/dist/core/icons.d.ts +3 -0
  42. package/dist/core/icons.d.ts.map +1 -0
  43. package/dist/core/index.cjs +12 -0
  44. package/dist/core/index.d.ts +8 -0
  45. package/dist/core/index.d.ts.map +1 -0
  46. package/dist/core/index.mjs +2789 -0
  47. package/dist/core/paste-engine.d.ts +7 -0
  48. package/dist/core/paste-engine.d.ts.map +1 -0
  49. package/dist/core/types.d.ts +88 -0
  50. package/dist/core/types.d.ts.map +1 -0
  51. package/dist/react/FableEditor.d.ts +13 -0
  52. package/dist/react/FableEditor.d.ts.map +1 -0
  53. package/dist/react/index.cjs +41 -0
  54. package/dist/react/index.d.ts +3 -0
  55. package/dist/react/index.d.ts.map +1 -0
  56. package/dist/react/index.mjs +3471 -0
  57. package/package.json +105 -0
  58. package/style.css +1175 -0
@@ -0,0 +1,139 @@
1
+ import { EditorLanguage } from './types';
2
+ export interface I18nStrings {
3
+ dir: 'ltr' | 'rtl';
4
+ file: string;
5
+ edit: string;
6
+ view: string;
7
+ insert: string;
8
+ format: string;
9
+ tools: string;
10
+ table: string;
11
+ help: string;
12
+ newdoc: string;
13
+ preview: string;
14
+ print: string;
15
+ undo: string;
16
+ redo: string;
17
+ cut: string;
18
+ copy: string;
19
+ paste: string;
20
+ selectall: string;
21
+ fullscreen: string;
22
+ sourcecode: string;
23
+ wordcount: string;
24
+ image: string;
25
+ inserttable: string;
26
+ hr: string;
27
+ charmap: string;
28
+ datetime: string;
29
+ pagebreak: string;
30
+ nbsp: string;
31
+ bold: string;
32
+ italic: string;
33
+ underline: string;
34
+ strikethrough: string;
35
+ superscript: string;
36
+ subscript: string;
37
+ clearformat: string;
38
+ rowabove: string;
39
+ rowbelow: string;
40
+ delrow: string;
41
+ colbefore: string;
42
+ colafter: string;
43
+ delcol: string;
44
+ deltable: string;
45
+ ltr: string;
46
+ rtl: string;
47
+ alignleft: string;
48
+ aligncenter: string;
49
+ alignright: string;
50
+ alignjustify: string;
51
+ numlist: string;
52
+ bullist: string;
53
+ forecolor: string;
54
+ backcolor: string;
55
+ removeformat: string;
56
+ outdent: string;
57
+ indent: string;
58
+ fontfamily: string;
59
+ fontsize: string;
60
+ blocks: string;
61
+ quickimage: string;
62
+ quicktable: string;
63
+ more: string;
64
+ para: string;
65
+ heading: string;
66
+ pre: string;
67
+ removecolor: string;
68
+ currentcolor: string;
69
+ statushelp: string;
70
+ words: string;
71
+ helpttl: string;
72
+ shortcuts: string;
73
+ close: string;
74
+ save: string;
75
+ cancel: string;
76
+ srcttl: string;
77
+ wcttl: string;
78
+ wcwords: string;
79
+ wcchars: string;
80
+ pastehint: string;
81
+ liststyles_ol: string[];
82
+ liststyles_ul: string[];
83
+ previewttl: string;
84
+ tablepropsttl: string;
85
+ tblwidth: string;
86
+ tblcellspacing: string;
87
+ tblcellpadding: string;
88
+ tblborder: string;
89
+ tblalign: string;
90
+ alignnone: string;
91
+ quote: string;
92
+ link: string;
93
+ linkttl: string;
94
+ linkurl: string;
95
+ unlink: string;
96
+ lineheight: string;
97
+ wordspacing: string;
98
+ changecase: string;
99
+ lowercase: string;
100
+ uppercase: string;
101
+ capitalize: string;
102
+ customcolor: string;
103
+ normal: string;
104
+ revhistory: string;
105
+ revempty: string;
106
+ restore: string;
107
+ currentver: string;
108
+ importword: string;
109
+ importfail: string;
110
+ restoredraft: string;
111
+ draftempty: string;
112
+ deleteimg: string;
113
+ rotateleft: string;
114
+ rotateright: string;
115
+ fliphorizontal: string;
116
+ flipvertical: string;
117
+ cell: string;
118
+ row: string;
119
+ column: string;
120
+ cellprops: string;
121
+ rowprops: string;
122
+ colprops: string;
123
+ tblheight: string;
124
+ valign: string;
125
+ valigntop: string;
126
+ valignmiddle: string;
127
+ valignbottom: string;
128
+ fill: string;
129
+ nocell: string;
130
+ uploadimg: string;
131
+ imagelink: string;
132
+ imageurlph: string;
133
+ insertimg: string;
134
+ dropimage: string;
135
+ uploading: string;
136
+ uploadfailed: string;
137
+ }
138
+ export declare const I18N: Record<EditorLanguage, I18nStrings>;
139
+ export declare function getStrings(lang: EditorLanguage): I18nStrings;
@@ -0,0 +1,2 @@
1
+ export declare const IC: Record<string, string>;
2
+ export declare const TXT: (html: string) => string;
@@ -0,0 +1,7 @@
1
+ export { FableEditor } from './editor';
2
+ export type { EditorInitOptions, EditorLanguage, FableEditorApi, DialogButton, MenuItemDef } from './types';
3
+ export { I18N, getStrings } from './i18n';
4
+ export type { I18nStrings } from './i18n';
5
+ export { FONTS, SIZES, BLOCKS, COLORS, CHARS } from './config';
6
+ export { IC, TXT } from './icons';
7
+ export { cleanPastedHTML, normalizeTextPaste } from './paste-engine';
@@ -0,0 +1,6 @@
1
+ export interface StyleMap {
2
+ [key: string]: string;
3
+ }
4
+ export declare function styleMap(el: Element): StyleMap;
5
+ export declare function cleanPastedHTML(raw: string, editorDir?: 'ltr' | 'rtl'): string;
6
+ export declare function normalizeTextPaste(raw: string): string;
@@ -0,0 +1,87 @@
1
+ export type EditorLanguage = 'en' | 'ar';
2
+ export interface ToolbarGroupConfig {
3
+ items: string[];
4
+ }
5
+ export interface MenuConfig {
6
+ [key: string]: Array<string | {
7
+ label: string;
8
+ action: string;
9
+ shortcut?: string;
10
+ }>;
11
+ }
12
+ export interface EditorInitOptions {
13
+ target: HTMLElement;
14
+ language?: EditorLanguage;
15
+ height?: number;
16
+ initialContent?: string;
17
+ onChange?: (content: string) => void;
18
+ onReady?: (editor: FableEditorApi) => void;
19
+ /** `true`/omitted = default menu set (`file edit view insert format tools table help`).
20
+ * `false` = hidden. A string is a space-separated subset/reorder of those keys, e.g.
21
+ * `'file edit view insert format tools table help'`. Unknown tokens are ignored with a
22
+ * console warning; recognized tokens render in the order given, duplicates are dropped. */
23
+ menubar?: boolean | string;
24
+ /** `true`/omitted = the built-in default toolbar. `false` = hidden. A string lays out
25
+ * the toolbar: `|` separates visual groups, spaces separate items within a group, e.g.
26
+ * `'undo redo | bold italic'`. Unknown tokens are ignored with a console warning. */
27
+ toolbar?: boolean | string;
28
+ statusbar?: boolean;
29
+ readonly?: boolean;
30
+ /** Storage key suffix for the autosaved draft; defaults to the page path. */
31
+ draftKey?: string;
32
+ /** Overrides the font-family list shown in the toolbar's font dropdown. Array of
33
+ * `[displayName, cssFontFamilyValue]` tuples. Defaults to a built-in list. */
34
+ fontFamilyFormats?: [string, string][];
35
+ /** Custom CSS for the editable content area. Because FableEditor's editable region is a
36
+ * plain `contenteditable` div (not an iframe), this is NOT arbitrary global CSS: the
37
+ * literal word `body` in your CSS is rewritten to a selector scoped to this editor
38
+ * instance's content div, and every other selector is used verbatim (your
39
+ * responsibility to scope). Intended for the common pattern of
40
+ * `body { font-family: ...; font-size: ... }` plus `@import` font declarations. */
41
+ contentStyle?: string;
42
+ /** MIME types accepted by the native image file picker (the `accept` attribute).
43
+ * Defaults to `['image/jpeg','image/jpg','image/png','image/gif','image/bmp','image/webp']`. */
44
+ imageFileTypes?: string[];
45
+ /** Called when a user picks or drops an image. Resolve with the URL to
46
+ * insert (e.g. after uploading to S3/Azure Blob/your own server). If
47
+ * omitted, images are inlined as base64 data URIs instead. The host resolves a URL
48
+ * and the engine owns all placeholder/progress/insert UI, so there's no separate
49
+ * "picker" concept to configure. */
50
+ imageUploadHandler?: (file: File) => Promise<string>;
51
+ /** Called when imageUploadHandler rejects, so the host app can surface it. */
52
+ onImageUploadError?: (error: unknown, file: File) => void;
53
+ }
54
+ export interface FableEditorApi {
55
+ getContent(): string;
56
+ setContent(html: string): void;
57
+ insertContent(html: string): void;
58
+ setLanguage(lang: EditorLanguage): void;
59
+ focus(): void;
60
+ destroy(): void;
61
+ importWordFile(file: File): Promise<void>;
62
+ restoreDraft(): boolean;
63
+ getRevisions(): Array<{
64
+ time: number;
65
+ html: string;
66
+ }>;
67
+ }
68
+ export interface DialogButton {
69
+ label: string;
70
+ primary?: boolean;
71
+ action: () => void;
72
+ }
73
+ export interface MenuItemDef {
74
+ label: string;
75
+ icon?: string;
76
+ action?: () => void;
77
+ shortcut?: string;
78
+ previewStyle?: string;
79
+ on?: boolean;
80
+ /** Hover flyout submenu items. */
81
+ sub?: Array<MenuItemDef | '|'>;
82
+ /** Hover flyout with custom content (e.g. the table size grid). */
83
+ subBuild?: (el: HTMLElement) => void;
84
+ /** Called with true/false as the pointer enters/leaves the item (e.g. to highlight the table row/column an operation will target). */
85
+ hover?: (on: boolean) => void;
86
+ }
87
+ export type TableOperation = 'rowabove' | 'rowbelow' | 'delrow' | 'colbefore' | 'colafter' | 'delcol' | 'deltable';
@@ -0,0 +1,101 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import { FableEditor } from '../core';
3
+ import * as i0 from "@angular/core";
4
+ export class FableEditorComponent {
5
+ container;
6
+ language = 'en';
7
+ height = 302;
8
+ menubar = true;
9
+ toolbar = true;
10
+ statusbar = true;
11
+ readonly = false;
12
+ init = {};
13
+ value = '';
14
+ editorChange = new EventEmitter();
15
+ editorReady = new EventEmitter();
16
+ editor;
17
+ lastContent = '';
18
+ ngOnInit() {
19
+ this.lastContent = this.value;
20
+ this.editor = new FableEditor({
21
+ target: this.container.nativeElement,
22
+ language: this.language,
23
+ height: this.height,
24
+ menubar: this.menubar,
25
+ toolbar: this.toolbar,
26
+ statusbar: this.statusbar,
27
+ readonly: this.readonly,
28
+ initialContent: this.value,
29
+ ...this.init,
30
+ onChange: (content) => {
31
+ this.lastContent = content;
32
+ this.editorChange.emit(content);
33
+ },
34
+ onReady: (api) => this.editorReady.emit(api)
35
+ });
36
+ }
37
+ ngOnChanges(changes) {
38
+ if (!this.editor)
39
+ return;
40
+ if (changes['language'] && !changes['language'].firstChange) {
41
+ this.editor.setLanguage(this.language);
42
+ }
43
+ if (changes['value'] && !changes['value'].firstChange && this.value !== this.lastContent) {
44
+ this.lastContent = this.value;
45
+ this.editor.setContent(this.value ?? '');
46
+ }
47
+ }
48
+ ngOnDestroy() {
49
+ this.editor?.destroy();
50
+ this.editor = undefined;
51
+ }
52
+ getContent() {
53
+ return this.editor?.getContent() ?? '';
54
+ }
55
+ setContent(html) {
56
+ this.lastContent = html;
57
+ this.editor?.setContent(html ?? '');
58
+ }
59
+ insertContent(html) {
60
+ this.editor?.insertContent(html);
61
+ }
62
+ setLanguage(lang) {
63
+ this.editor?.setLanguage(lang);
64
+ }
65
+ focus() {
66
+ this.editor?.focus();
67
+ }
68
+ writeValue(value) {
69
+ this.editor?.setContent(value ?? '');
70
+ }
71
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FableEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
72
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: FableEditorComponent, isStandalone: true, selector: "fable-editor", inputs: { language: "language", height: "height", menubar: "menubar", toolbar: "toolbar", statusbar: "statusbar", readonly: "readonly", init: "init", value: "value" }, outputs: { editorChange: "editorChange", editorReady: "editorReady" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: `<div #container></div>`, isInline: true, styles: [":host{display:block}\n"] });
73
+ }
74
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FableEditorComponent, decorators: [{
75
+ type: Component,
76
+ args: [{ selector: 'fable-editor', standalone: true, template: `<div #container></div>`, styles: [":host{display:block}\n"] }]
77
+ }], propDecorators: { container: [{
78
+ type: ViewChild,
79
+ args: ['container', { static: true }]
80
+ }], language: [{
81
+ type: Input
82
+ }], height: [{
83
+ type: Input
84
+ }], menubar: [{
85
+ type: Input
86
+ }], toolbar: [{
87
+ type: Input
88
+ }], statusbar: [{
89
+ type: Input
90
+ }], readonly: [{
91
+ type: Input
92
+ }], init: [{
93
+ type: Input
94
+ }], value: [{
95
+ type: Input
96
+ }], editorChange: [{
97
+ type: Output
98
+ }], editorReady: [{
99
+ type: Output
100
+ }] } });
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFibGUtZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hbmd1bGFyL2ZhYmxlLWVkaXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBcUQsTUFBTSxTQUFTLENBQUM7O0FBUXpGLE1BQU0sT0FBTyxvQkFBb0I7SUFDVyxTQUFTLENBQThCO0lBRXhFLFFBQVEsR0FBbUIsSUFBSSxDQUFDO0lBQ2hDLE1BQU0sR0FBRyxHQUFHLENBQUM7SUFDYixPQUFPLEdBQXFCLElBQUksQ0FBQztJQUNqQyxPQUFPLEdBQXFCLElBQUksQ0FBQztJQUNqQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDakIsSUFBSSxHQUErQyxFQUFFLENBQUM7SUFDdEQsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUVWLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBQzFDLFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztJQUVuRCxNQUFNLENBQWU7SUFDckIsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUV6QixRQUFRO1FBQ04sSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDNUIsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYTtZQUNwQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87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QUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGYWJsZUVkaXRvciwgRWRpdG9ySW5pdE9wdGlvbnMsIEVkaXRvckxhbmd1YWdlLCBGYWJsZUVkaXRvckFwaSB9IGZyb20gJy4uL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmYWJsZS1lZGl0b3InLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZTogYDxkaXYgI2NvbnRhaW5lcj48L2Rpdj5gLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddXG59KVxuZXhwb3J0IGNsYXNzIEZhYmxlRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIGNvbnRhaW5lciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIEBJbnB1dCgpIGxhbmd1YWdlOiBFZGl0b3JMYW5ndWFnZSA9ICdlbic7XG4gIEBJbnB1dCgpIGhlaWdodCA9IDMwMjtcbiAgQElucHV0KCkgbWVudWJhcjogYm9vbGVhbiB8IHN0cmluZyA9IHRydWU7XG4gIEBJbnB1dCgpIHRvb2xiYXI6IGJvb2xlYW4gfCBzdHJpbmcgPSB0cnVlO1xuICBASW5wdXQoKSBzdGF0dXNiYXIgPSB0cnVlO1xuICBASW5wdXQoKSByZWFkb25seSA9IGZhbHNlO1xuICBASW5wdXQoKSBpbml0OiBQYXJ0aWFsPE9taXQ8RWRpdG9ySW5pdE9wdGlvbnMsICd0YXJnZXQnPj4gPSB7fTtcbiAgQElucHV0KCkgdmFsdWUgPSAnJztcblxuICBAT3V0cHV0KCkgZWRpdG9yQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBlZGl0b3JSZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8RmFibGVFZGl0b3JBcGk+KCk7XG5cbiAgcHJpdmF0ZSBlZGl0b3I/OiBGYWJsZUVkaXRvcjtcbiAgcHJpdmF0ZSBsYXN0Q29udGVudCA9ICcnO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubGFzdENvbnRlbnQgPSB0aGlzLnZhbHVlO1xuICAgIHRoaXMuZWRpdG9yID0gbmV3IEZhYmxlRWRpdG9yKHtcbiAgICAgIHRhcmdldDogdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudCxcbiAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCxcbiAgICAgIG1lbnViYXI6IHRoaXMubWVudWJhcixcbiAgICAgIHRvb2xiYXI6IHRoaXMudG9vbGJhcixcbiAgICAgIHN0YXR1c2JhcjogdGhpcy5zdGF0dXNiYXIsXG4gICAgICByZWFkb25seTogdGhpcy5yZWFkb25seSxcbiAgICAgIGluaXRpYWxDb250ZW50OiB0aGlzLnZhbHVlLFxuICAgICAgLi4udGhpcy5pbml0LFxuICAgICAgb25DaGFuZ2U6IChjb250ZW50KSA9PiB7XG4gICAgICAgIHRoaXMubGFzdENvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICB0aGlzLmVkaXRvckNoYW5nZS5lbWl0KGNvbnRlbnQpO1xuICAgICAgfSxcbiAgICAgIG9uUmVhZHk6IChhcGkpID0+IHRoaXMuZWRpdG9yUmVhZHkuZW1pdChhcGkpXG4gICAgfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRvcikgcmV0dXJuO1xuICAgIGlmIChjaGFuZ2VzWydsYW5ndWFnZSddICYmICFjaGFuZ2VzWydsYW5ndWFnZSddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLmVkaXRvci5zZXRMYW5ndWFnZSh0aGlzLmxhbmd1YWdlKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ZhbHVlJ10gJiYgIWNoYW5nZXNbJ3ZhbHVlJ10uZmlyc3RDaGFuZ2UgJiYgdGhpcy52YWx1ZSAhPT0gdGhpcy5sYXN0Q29udGVudCkge1xuICAgICAgdGhpcy5sYXN0Q29udGVudCA9IHRoaXMudmFsdWU7XG4gICAgICB0aGlzLmVkaXRvci5zZXRDb250ZW50KHRoaXMudmFsdWUgPz8gJycpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdG9yPy5kZXN0cm95KCk7XG4gICAgdGhpcy5lZGl0b3IgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRDb250ZW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yPy5nZXRDb250ZW50KCkgPz8gJyc7XG4gIH1cblxuICBzZXRDb250ZW50KGh0bWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubGFzdENvbnRlbnQgPSBodG1sO1xuICAgIHRoaXMuZWRpdG9yPy5zZXRDb250ZW50KGh0bWwgPz8gJycpO1xuICB9XG5cbiAgaW5zZXJ0Q29udGVudChodG1sOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRvcj8uaW5zZXJ0Q29udGVudChodG1sKTtcbiAgfVxuXG4gIHNldExhbmd1YWdlKGxhbmc6IEVkaXRvckxhbmd1YWdlKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3I/LnNldExhbmd1YWdlKGxhbmcpO1xuICB9XG5cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3I/LmZvY3VzKCk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRvcj8uc2V0Q29udGVudCh2YWx1ZSA/PyAnJyk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,16 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { FableEditorComponent } from './fable-editor.component';
3
+ import * as i0 from "@angular/core";
4
+ export class FableEditorModule {
5
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FableEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
6
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: FableEditorModule, imports: [FableEditorComponent], exports: [FableEditorComponent] });
7
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FableEditorModule });
8
+ }
9
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FableEditorModule, decorators: [{
10
+ type: NgModule,
11
+ args: [{
12
+ imports: [FableEditorComponent],
13
+ exports: [FableEditorComponent]
14
+ }]
15
+ }] });
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFibGUtZWRpdG9yLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hbmd1bGFyL2ZhYmxlLWVkaXRvci5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFNaEUsTUFBTSxPQUFPLGlCQUFpQjt3R0FBakIsaUJBQWlCO3lHQUFqQixpQkFBaUIsWUFIbEIsb0JBQW9CLGFBQ3BCLG9CQUFvQjt5R0FFbkIsaUJBQWlCOzs0RkFBakIsaUJBQWlCO2tCQUo3QixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLG9CQUFvQixDQUFDO29CQUMvQixPQUFPLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztpQkFDaEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmFibGVFZGl0b3JDb21wb25lbnQgfSBmcm9tICcuL2ZhYmxlLWVkaXRvci5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbRmFibGVFZGl0b3JDb21wb25lbnRdLFxuICBleHBvcnRzOiBbRmFibGVFZGl0b3JDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIEZhYmxlRWRpdG9yTW9kdWxlIHt9XG4iXX0=
@@ -0,0 +1,3 @@
1
+ export { FableEditorModule } from './fable-editor.module';
2
+ export { FableEditorComponent } from './fable-editor.component';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYW5ndWxhci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IEZhYmxlRWRpdG9yTW9kdWxlIH0gZnJvbSAnLi9mYWJsZS1lZGl0b3IubW9kdWxlJztcbmV4cG9ydCB7IEZhYmxlRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi9mYWJsZS1lZGl0b3IuY29tcG9uZW50JztcbiJdfQ==
@@ -0,0 +1,122 @@
1
+ /** Transcribed group-by-group from the editor's built-in toolbar layout so that
2
+ * `toolbar: true` (the default) renders identically to the hard-coded original. */
3
+ export const DEFAULT_TOOLBAR = 'undo redo | preview print | importword revhistory | fontfamily fontsize | fontsizeincrease fontsizedecrease | ' +
4
+ 'bold italic underline strikethrough | forecolor backcolor | alignleft aligncenter alignright alignjustify | ' +
5
+ 'bullist numlist | outdent indent | link blockquote changecase lineheight wordspacing | removeformat | blocks | ' +
6
+ 'ltr rtl | quickimage quicktable charmap | fullscreen sourcecode';
7
+ /** Transcribed from the editor's built-in menu keys so that `menubar: true` (the
8
+ * default) renders identically to the hard-coded original. */
9
+ export const DEFAULT_MENUBAR = 'file edit view insert format tools table help';
10
+ export const FONTS = [
11
+ ['Andale Mono', 'andale mono,times'],
12
+ ['Arial', 'arial,helvetica,sans-serif'],
13
+ ['Arial Black', 'arial black,avant garde'],
14
+ ['Book Antiqua', 'book antiqua,palatino'],
15
+ ['Comic Sans MS', 'comic sans ms,sans-serif'],
16
+ ['Courier New', 'courier new,courier'],
17
+ ['Georgia', 'georgia,palatino'],
18
+ ['Helvetica', 'helvetica'],
19
+ ['Impact', 'impact,chicago'],
20
+ ['Oswald', 'oswald'],
21
+ ['Sakkal Majalla', 'sakkal majalla'],
22
+ ['Symbol', 'symbol'],
23
+ ['Tahoma', 'tahoma,arial,helvetica,sans-serif'],
24
+ ['Terminal', 'terminal,monaco'],
25
+ ['Times New Roman', 'times new roman,times'],
26
+ ['Trebuchet MS', 'trebuchet ms,geneva'],
27
+ ['Verdana', 'verdana,geneva'],
28
+ ['Webdings', 'webdings'],
29
+ ['Wingdings', 'wingdings,zapf dingbats']
30
+ ];
31
+ export const SIZES = ['8px', '9px', '10px', '11px', '12px', '14px', '16px', '18px', '20px', '24px', '28px', '32px', '36px', '48px', '72px', '96px'];
32
+ export const MIN_FONT_PX = 1;
33
+ export const MAX_FONT_PX = 100;
34
+ export const LINE_HEIGHTS = ['1', '1.15', '1.4', '1.5', '1.75', '2', '2.5', '3'];
35
+ export const WORD_SPACINGS = ['1px', '2px', '4px', '6px', '8px', '12px'];
36
+ export const BLOCKS = [
37
+ ['p', 'para'],
38
+ ['h1', 'heading1'],
39
+ ['h2', 'heading2'],
40
+ ['h3', 'heading3'],
41
+ ['h4', 'heading4'],
42
+ ['h5', 'heading5'],
43
+ ['h6', 'heading6'],
44
+ ['pre', 'pre']
45
+ ];
46
+ /** Quick-access text color chips shown directly in the toolbar. */
47
+ export const QUICK_COLORS = ['#F76707', '#4263EB', '#CC5DE8'];
48
+ export const COLORS = [
49
+ '#BFEDD2',
50
+ '#FBEEB8',
51
+ '#F8CAC6',
52
+ '#ECCAFA',
53
+ '#C2E0F4',
54
+ '#2DC26B',
55
+ '#F1C40F',
56
+ '#E03E2D',
57
+ '#B96AD9',
58
+ '#3598DB',
59
+ '#169179',
60
+ '#E67E23',
61
+ '#BA372A',
62
+ '#843FA1',
63
+ '#236FA1',
64
+ '#ECF0F1',
65
+ '#CED4D9',
66
+ '#95A5A6',
67
+ '#7E8C8D',
68
+ '#34495E',
69
+ '#000000',
70
+ '#FFFFFF'
71
+ ];
72
+ export const CHARS = [
73
+ '©',
74
+ '®',
75
+ '™',
76
+ '§',
77
+ '¶',
78
+ '†',
79
+ '‡',
80
+ '•',
81
+ '…',
82
+ '′',
83
+ '″',
84
+ '‰',
85
+ '°',
86
+ '±',
87
+ '×',
88
+ '÷',
89
+ '≈',
90
+ '≠',
91
+ '≤',
92
+ '≥',
93
+ '∞',
94
+ 'µ',
95
+ '√',
96
+ '∑',
97
+ '€',
98
+ '£',
99
+ '¥',
100
+ '¢',
101
+ '←',
102
+ '→',
103
+ '↑',
104
+ '↓',
105
+ '«',
106
+ '»',
107
+ '“',
108
+ '”',
109
+ '‘',
110
+ '’',
111
+ '–',
112
+ '—',
113
+ '؟',
114
+ '،',
115
+ '؛',
116
+ '٪',
117
+ '٭',
118
+ 'ـ',
119
+ '٠',
120
+ '١'
121
+ ];
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvcmUvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO29GQUNvRjtBQUNwRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQzFCLGdIQUFnSDtJQUNoSCw4R0FBOEc7SUFDOUcsaUhBQWlIO0lBQ2pILGlFQUFpRSxDQUFDO0FBRXBFOytEQUMrRDtBQUMvRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsK0NBQStDLENBQUM7QUFFL0UsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUF1QjtJQUN2QyxDQUFDLGFBQWEsRUFBRSxtQkFBbUIsQ0FBQztJQUNwQyxDQUFDLE9BQU8sRUFBRSw0QkFBNEIsQ0FBQztJQUN2QyxDQUFDLGFBQWEsRUFBRSx5QkFBeUIsQ0FBQztJQUMxQyxDQUFDLGNBQWMsRUFBRSx1QkFBdUIsQ0FBQztJQUN6QyxDQUFDLGVBQWUsRUFBRSwwQkFBMEIsQ0FBQztJQUM3QyxDQUFDLGFBQWEsRUFBRSxxQkFBcUIsQ0FBQztJQUN0QyxDQUFDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQztJQUMvQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7SUFDMUIsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLENBQUM7SUFDNUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDO0lBQ3BCLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7SUFDcEMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDO0lBQ3BCLENBQUMsUUFBUSxFQUFFLG1DQUFtQyxDQUFDO0lBQy9DLENBQUMsVUFBVSxFQUFFLGlCQUFpQixDQUFDO0lBQy9CLENBQUMsaUJBQWlCLEVBQUUsdUJBQXVCLENBQUM7SUFDNUMsQ0FBQyxjQUFjLEVBQUUscUJBQXFCLENBQUM7SUFDdkMsQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUM7SUFDN0IsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDO0lBQ3hCLENBQUMsV0FBVyxFQUFFLHlCQUF5QixDQUFDO0NBQ3pDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUVwSixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUM7QUFFL0IsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRWpGLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFFekUsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUF1QjtJQUN4QyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUM7SUFDYixDQUFDLElBQUksRUFBRSxVQUFVLENBQUM7SUFDbEIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDO0lBQ2xCLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQztJQUNsQixDQUFDLElBQUksRUFBRSxVQUFVLENBQUM7SUFDbEIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDO0lBQ2xCLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQztJQUNsQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7Q0FDZixDQUFDO0FBRUYsbUVBQW1FO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFFOUQsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHO0lBQ3BCLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7Q0FDVixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHO0lBQ25CLEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogVHJhbnNjcmliZWQgZ3JvdXAtYnktZ3JvdXAgZnJvbSB0aGUgZWRpdG9yJ3MgYnVpbHQtaW4gdG9vbGJhciBsYXlvdXQgc28gdGhhdFxuICogIGB0b29sYmFyOiB0cnVlYCAodGhlIGRlZmF1bHQpIHJlbmRlcnMgaWRlbnRpY2FsbHkgdG8gdGhlIGhhcmQtY29kZWQgb3JpZ2luYWwuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9UT09MQkFSID1cbiAgJ3VuZG8gcmVkbyB8IHByZXZpZXcgcHJpbnQgfCBpbXBvcnR3b3JkIHJldmhpc3RvcnkgfCBmb250ZmFtaWx5IGZvbnRzaXplIHwgZm9udHNpemVpbmNyZWFzZSBmb250c2l6ZWRlY3JlYXNlIHwgJyArXG4gICdib2xkIGl0YWxpYyB1bmRlcmxpbmUgc3RyaWtldGhyb3VnaCB8IGZvcmVjb2xvciBiYWNrY29sb3IgfCBhbGlnbmxlZnQgYWxpZ25jZW50ZXIgYWxpZ25yaWdodCBhbGlnbmp1c3RpZnkgfCAnICtcbiAgJ2J1bGxpc3QgbnVtbGlzdCB8IG91dGRlbnQgaW5kZW50IHwgbGluayBibG9ja3F1b3RlIGNoYW5nZWNhc2UgbGluZWhlaWdodCB3b3Jkc3BhY2luZyB8IHJlbW92ZWZvcm1hdCB8IGJsb2NrcyB8ICcgK1xuICAnbHRyIHJ0bCB8IHF1aWNraW1hZ2UgcXVpY2t0YWJsZSBjaGFybWFwIHwgZnVsbHNjcmVlbiBzb3VyY2Vjb2RlJztcblxuLyoqIFRyYW5zY3JpYmVkIGZyb20gdGhlIGVkaXRvcidzIGJ1aWx0LWluIG1lbnUga2V5cyBzbyB0aGF0IGBtZW51YmFyOiB0cnVlYCAodGhlXG4gKiAgZGVmYXVsdCkgcmVuZGVycyBpZGVudGljYWxseSB0byB0aGUgaGFyZC1jb2RlZCBvcmlnaW5hbC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01FTlVCQVIgPSAnZmlsZSBlZGl0IHZpZXcgaW5zZXJ0IGZvcm1hdCB0b29scyB0YWJsZSBoZWxwJztcblxuZXhwb3J0IGNvbnN0IEZPTlRTOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXG4gIFsnQW5kYWxlIE1vbm8nLCAnYW5kYWxlIG1vbm8sdGltZXMnXSxcbiAgWydBcmlhbCcsICdhcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZiddLFxuICBbJ0FyaWFsIEJsYWNrJywgJ2FyaWFsIGJsYWNrLGF2YW50IGdhcmRlJ10sXG4gIFsnQm9vayBBbnRpcXVhJywgJ2Jvb2sgYW50aXF1YSxwYWxhdGlubyddLFxuICBbJ0NvbWljIFNhbnMgTVMnLCAnY29taWMgc2FucyBtcyxzYW5zLXNlcmlmJ10sXG4gIFsnQ291cmllciBOZXcnLCAnY291cmllciBuZXcsY291cmllciddLFxuICBbJ0dlb3JnaWEnLCAnZ2VvcmdpYSxwYWxhdGlubyddLFxuICBbJ0hlbHZldGljYScsICdoZWx2ZXRpY2EnXSxcbiAgWydJbXBhY3QnLCAnaW1wYWN0LGNoaWNhZ28nXSxcbiAgWydPc3dhbGQnLCAnb3N3YWxkJ10sXG4gIFsnU2Fra2FsIE1hamFsbGEnLCAnc2Fra2FsIG1hamFsbGEnXSxcbiAgWydTeW1ib2wnLCAnc3ltYm9sJ10sXG4gIFsnVGFob21hJywgJ3RhaG9tYSxhcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZiddLFxuICBbJ1Rlcm1pbmFsJywgJ3Rlcm1pbmFsLG1vbmFjbyddLFxuICBbJ1RpbWVzIE5ldyBSb21hbicsICd0aW1lcyBuZXcgcm9tYW4sdGltZXMnXSxcbiAgWydUcmVidWNoZXQgTVMnLCAndHJlYnVjaGV0IG1zLGdlbmV2YSddLFxuICBbJ1ZlcmRhbmEnLCAndmVyZGFuYSxnZW5ldmEnXSxcbiAgWydXZWJkaW5ncycsICd3ZWJkaW5ncyddLFxuICBbJ1dpbmdkaW5ncycsICd3aW5nZGluZ3MsemFwZiBkaW5nYmF0cyddXG5dO1xuXG5leHBvcnQgY29uc3QgU0laRVMgPSBbJzhweCcsICc5cHgnLCAnMTBweCcsICcxMXB4JywgJzEycHgnLCAnMTRweCcsICcxNnB4JywgJzE4cHgnLCAnMjBweCcsICcyNHB4JywgJzI4cHgnLCAnMzJweCcsICczNnB4JywgJzQ4cHgnLCAnNzJweCcsICc5NnB4J107XG5cbmV4cG9ydCBjb25zdCBNSU5fRk9OVF9QWCA9IDE7XG5leHBvcnQgY29uc3QgTUFYX0ZPTlRfUFggPSAxMDA7XG5cbmV4cG9ydCBjb25zdCBMSU5FX0hFSUdIVFMgPSBbJzEnLCAnMS4xNScsICcxLjQnLCAnMS41JywgJzEuNzUnLCAnMicsICcyLjUnLCAnMyddO1xuXG5leHBvcnQgY29uc3QgV09SRF9TUEFDSU5HUyA9IFsnMXB4JywgJzJweCcsICc0cHgnLCAnNnB4JywgJzhweCcsICcxMnB4J107XG5cbmV4cG9ydCBjb25zdCBCTE9DS1M6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtcbiAgWydwJywgJ3BhcmEnXSxcbiAgWydoMScsICdoZWFkaW5nMSddLFxuICBbJ2gyJywgJ2hlYWRpbmcyJ10sXG4gIFsnaDMnLCAnaGVhZGluZzMnXSxcbiAgWydoNCcsICdoZWFkaW5nNCddLFxuICBbJ2g1JywgJ2hlYWRpbmc1J10sXG4gIFsnaDYnLCAnaGVhZGluZzYnXSxcbiAgWydwcmUnLCAncHJlJ11cbl07XG5cbi8qKiBRdWljay1hY2Nlc3MgdGV4dCBjb2xvciBjaGlwcyBzaG93biBkaXJlY3RseSBpbiB0aGUgdG9vbGJhci4gKi9cbmV4cG9ydCBjb25zdCBRVUlDS19DT0xPUlMgPSBbJyNGNzY3MDcnLCAnIzQyNjNFQicsICcjQ0M1REU4J107XG5cbmV4cG9ydCBjb25zdCBDT0xPUlMgPSBbXG4gICcjQkZFREQyJyxcbiAgJyNGQkVFQjgnLFxuICAnI0Y4Q0FDNicsXG4gICcjRUNDQUZBJyxcbiAgJyNDMkUwRjQnLFxuICAnIzJEQzI2QicsXG4gICcjRjFDNDBGJyxcbiAgJyNFMDNFMkQnLFxuICAnI0I5NkFEOScsXG4gICcjMzU5OERCJyxcbiAgJyMxNjkxNzknLFxuICAnI0U2N0UyMycsXG4gICcjQkEzNzJBJyxcbiAgJyM4NDNGQTEnLFxuICAnIzIzNkZBMScsXG4gICcjRUNGMEYxJyxcbiAgJyNDRUQ0RDknLFxuICAnIzk1QTVBNicsXG4gICcjN0U4QzhEJyxcbiAgJyMzNDQ5NUUnLFxuICAnIzAwMDAwMCcsXG4gICcjRkZGRkZGJ1xuXTtcblxuZXhwb3J0IGNvbnN0IENIQVJTID0gW1xuICAnwqknLFxuICAnwq4nLFxuICAn4oSiJyxcbiAgJ8KnJyxcbiAgJ8K2JyxcbiAgJ+KAoCcsXG4gICfigKEnLFxuICAn4oCiJyxcbiAgJ+KApicsXG4gICfigLInLFxuICAn4oCzJyxcbiAgJ+KAsCcsXG4gICfCsCcsXG4gICfCsScsXG4gICfDlycsXG4gICfDtycsXG4gICfiiYgnLFxuICAn4omgJyxcbiAgJ+KJpCcsXG4gICfiiaUnLFxuICAn4oieJyxcbiAgJ8K1JyxcbiAgJ+KImicsXG4gICfiiJEnLFxuICAn4oKsJyxcbiAgJ8KjJyxcbiAgJ8KlJyxcbiAgJ8KiJyxcbiAgJ+KGkCcsXG4gICfihpInLFxuICAn4oaRJyxcbiAgJ+KGkycsXG4gICfCqycsXG4gICfCuycsXG4gICfigJwnLFxuICAn4oCdJyxcbiAgJ+KAmCcsXG4gICfigJknLFxuICAn4oCTJyxcbiAgJ+KAlCcsXG4gICfYnycsXG4gICfYjCcsXG4gICfYmycsXG4gICfZqicsXG4gICfZrScsXG4gICfZgCcsXG4gICfZoCcsXG4gICfZoSdcbl07XG4iXX0=