@flogeez/angular-tiptap-editor 3.1.2 → 3.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/README.md +2 -2
- package/esm2022/flogeez-angular-tiptap-editor.mjs +5 -0
- package/esm2022/lib/ate-editor.provider.mjs +38 -0
- package/esm2022/lib/components/bubble-menus/base/ate-base-bubble-menu.mjs +207 -0
- package/esm2022/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.mjs +137 -0
- package/esm2022/lib/components/bubble-menus/color/ate-color-bubble-menu.component.mjs +365 -0
- package/esm2022/lib/components/bubble-menus/image/ate-image-bubble-menu.component.mjs +309 -0
- package/esm2022/lib/components/bubble-menus/link/ate-link-bubble-menu.component.mjs +247 -0
- package/esm2022/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.mjs +126 -0
- package/esm2022/lib/components/bubble-menus/table/ate-table-bubble-menu.component.mjs +271 -0
- package/esm2022/lib/components/bubble-menus/text/ate-bubble-menu.component.mjs +272 -0
- package/esm2022/lib/components/color-picker/ate-color-picker.component.mjs +123 -0
- package/esm2022/lib/components/edit-toggle/ate-edit-toggle.component.mjs +42 -0
- package/esm2022/lib/components/editor/angular-tiptap-editor.component.mjs +1031 -0
- package/esm2022/lib/components/editor/ate-block-controls.component.mjs +256 -0
- package/esm2022/lib/components/slash-commands/ate-slash-commands.component.mjs +328 -0
- package/esm2022/lib/components/toolbar/ate-toolbar.component.mjs +531 -0
- package/esm2022/lib/components/ui/ate-button.component.mjs +91 -0
- package/esm2022/lib/components/ui/ate-separator.component.mjs +11 -0
- package/esm2022/lib/config/ate-editor.config.mjs +133 -0
- package/esm2022/lib/config/ate-global-config.token.mjs +6 -0
- package/esm2022/lib/config/ate-slash-commands.config.mjs +130 -0
- package/esm2022/lib/directives/ate-noop-value-accessor.directive.mjs +40 -0
- package/esm2022/lib/directives/ate-tooltip.directive.mjs +138 -0
- package/esm2022/lib/extensions/ate-block-controls.extension.mjs +156 -0
- package/esm2022/lib/extensions/ate-link-click-behavior.extension.mjs +32 -0
- package/esm2022/lib/extensions/ate-resizable-image.extension.mjs +277 -0
- package/esm2022/lib/extensions/ate-table.extension.mjs +27 -0
- package/esm2022/lib/extensions/ate-tiptap-state.extension.mjs +85 -0
- package/esm2022/lib/extensions/ate-upload-progress.extension.mjs +195 -0
- package/esm2022/lib/extensions/calculators/ate-discovery.calculator.mjs +62 -0
- package/esm2022/lib/extensions/calculators/ate-image.calculator.mjs +8 -0
- package/esm2022/lib/extensions/calculators/ate-marks.calculator.mjs +75 -0
- package/esm2022/lib/extensions/calculators/ate-selection.calculator.mjs +35 -0
- package/esm2022/lib/extensions/calculators/ate-structure.calculator.mjs +34 -0
- package/esm2022/lib/extensions/calculators/ate-table.calculator.mjs +38 -0
- package/esm2022/lib/models/ate-bubble-menu.model.mjs +53 -0
- package/esm2022/lib/models/ate-editor-config.model.mjs +2 -0
- package/esm2022/lib/models/ate-editor-state.model.mjs +90 -0
- package/esm2022/lib/models/ate-image.model.mjs +2 -0
- package/esm2022/lib/models/ate-slash-command.model.mjs +2 -0
- package/esm2022/lib/models/ate-toolbar.model.mjs +35 -0
- package/esm2022/lib/node-view/ate-angular-node-view.mjs +97 -0
- package/esm2022/lib/node-view/ate-injector.registry.mjs +16 -0
- package/esm2022/lib/node-view/ate-node-view.factory.mjs +125 -0
- package/esm2022/lib/node-view/ate-node-view.models.mjs +2 -0
- package/esm2022/lib/node-view/ate-node-view.renderer.mjs +154 -0
- package/esm2022/lib/node-view/ate-register-angular-component.mjs +49 -0
- package/esm2022/lib/services/ate-color-picker.service.mjs +194 -0
- package/esm2022/lib/services/ate-editor-commands.service.mjs +474 -0
- package/esm2022/lib/services/ate-i18n.service.mjs +422 -0
- package/esm2022/lib/services/ate-image.service.mjs +459 -0
- package/esm2022/lib/services/ate-link.service.mjs +99 -0
- package/esm2022/lib/utils/ate-color.utils.mjs +60 -0
- package/esm2022/public-api.mjs +40 -0
- package/fesm2022/flogeez-angular-tiptap-editor.mjs +321 -354
- package/fesm2022/flogeez-angular-tiptap-editor.mjs.map +1 -1
- package/index.d.ts +3 -1734
- package/lib/ate-editor.provider.d.ts +21 -0
- package/lib/components/bubble-menus/base/ate-base-bubble-menu.d.ts +71 -0
- package/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.d.ts +60 -0
- package/lib/components/bubble-menus/color/ate-color-bubble-menu.component.d.ts +77 -0
- package/lib/components/bubble-menus/image/ate-image-bubble-menu.component.d.ts +49 -0
- package/lib/components/bubble-menus/link/ate-link-bubble-menu.component.d.ts +55 -0
- package/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.d.ts +16 -0
- package/lib/components/bubble-menus/table/ate-table-bubble-menu.component.d.ts +25 -0
- package/lib/components/bubble-menus/text/ate-bubble-menu.component.d.ts +53 -0
- package/lib/components/color-picker/ate-color-picker.component.d.ts +54 -0
- package/lib/components/edit-toggle/ate-edit-toggle.component.d.ts +13 -0
- package/lib/components/editor/angular-tiptap-editor.component.d.ts +242 -0
- package/lib/components/editor/ate-block-controls.component.d.ts +44 -0
- package/lib/components/slash-commands/ate-slash-commands.component.d.ts +34 -0
- package/lib/components/toolbar/ate-toolbar.component.d.ts +47 -0
- package/lib/components/ui/ate-button.component.d.ts +25 -0
- package/lib/components/ui/ate-separator.component.d.ts +5 -0
- package/lib/config/ate-editor.config.d.ts +19 -0
- package/lib/config/ate-global-config.token.d.ts +6 -0
- package/lib/config/ate-slash-commands.config.d.ts +41 -0
- package/lib/directives/ate-noop-value-accessor.directive.d.ts +13 -0
- package/lib/directives/ate-tooltip.directive.d.ts +30 -0
- package/lib/extensions/ate-block-controls.extension.d.ts +10 -0
- package/lib/extensions/ate-link-click-behavior.extension.d.ts +2 -0
- package/lib/extensions/ate-resizable-image.extension.d.ts +27 -0
- package/lib/extensions/ate-table.extension.d.ts +2 -0
- package/lib/extensions/ate-tiptap-state.extension.d.ts +7 -0
- package/lib/extensions/ate-upload-progress.extension.d.ts +7 -0
- package/lib/extensions/calculators/ate-discovery.calculator.d.ts +7 -0
- package/lib/extensions/calculators/ate-image.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-marks.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-selection.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-structure.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-table.calculator.d.ts +2 -0
- package/lib/models/ate-bubble-menu.model.d.ts +33 -0
- package/lib/models/ate-editor-config.model.d.ts +113 -0
- package/lib/models/ate-editor-state.model.d.ts +109 -0
- package/lib/models/ate-image.model.d.ts +104 -0
- package/lib/models/ate-slash-command.model.d.ts +17 -0
- package/lib/models/ate-toolbar.model.d.ts +18 -0
- package/lib/node-view/ate-angular-node-view.d.ts +115 -0
- package/lib/node-view/ate-injector.registry.d.ts +3 -0
- package/lib/node-view/ate-node-view.factory.d.ts +10 -0
- package/lib/node-view/ate-node-view.models.d.ts +138 -0
- package/lib/node-view/ate-node-view.renderer.d.ts +23 -0
- package/lib/node-view/ate-register-angular-component.d.ts +35 -0
- package/lib/services/ate-color-picker.service.d.ts +65 -0
- package/lib/services/ate-editor-commands.service.d.ts +75 -0
- package/lib/services/ate-i18n.service.d.ts +406 -0
- package/lib/services/ate-image.service.d.ts +82 -0
- package/lib/services/ate-link.service.d.ts +42 -0
- package/lib/utils/ate-color.utils.d.ts +12 -0
- package/package.json +3 -1
- package/public-api.d.ts +31 -0
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
import { Injectable, inject, signal } from "@angular/core";
|
|
2
|
+
import { AteImageService } from "./ate-image.service";
|
|
3
|
+
import { AteColorPickerService } from "./ate-color-picker.service";
|
|
4
|
+
import { AteLinkService } from "./ate-link.service";
|
|
5
|
+
import { ATE_INITIAL_EDITOR_STATE } from "../models/ate-editor-state.model";
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class AteEditorCommandsService {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.imageService = inject(AteImageService);
|
|
10
|
+
this.colorPickerSvc = inject(AteColorPickerService);
|
|
11
|
+
this.linkSvc = inject(AteLinkService);
|
|
12
|
+
this._editorState = signal(ATE_INITIAL_EDITOR_STATE, {
|
|
13
|
+
equal: (a, b) => {
|
|
14
|
+
// 1. Primitive global states
|
|
15
|
+
if (a.isFocused !== b.isFocused || a.isEditable !== b.isEditable) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
// 2. Detailed selection comparison
|
|
19
|
+
if (a.selection.from !== b.selection.from ||
|
|
20
|
+
a.selection.to !== b.selection.to ||
|
|
21
|
+
a.selection.type !== b.selection.type ||
|
|
22
|
+
a.selection.empty !== b.selection.empty ||
|
|
23
|
+
a.selection.isSingleCell !== b.selection.isSingleCell) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
// Helper for object comparison
|
|
27
|
+
const isRecordEqual = (objA, objB) => {
|
|
28
|
+
const keysA = Object.keys(objA);
|
|
29
|
+
const keysB = Object.keys(objB);
|
|
30
|
+
if (keysA.length !== keysB.length) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
return keysA.every(key => objA[key] === objB[key]);
|
|
34
|
+
};
|
|
35
|
+
// 3. Compare sub-states (marks, can, nodes)
|
|
36
|
+
if (!isRecordEqual(a.marks, b.marks)) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
if (!isRecordEqual(a.can, b.can)) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
if (!isRecordEqual(a.nodes, b.nodes)) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
// 4. Compare custom extension states
|
|
46
|
+
if (!isRecordEqual(a.custom, b.custom)) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
/** Exposed editor state as a readonly signal */
|
|
53
|
+
this.editorState = this._editorState.asReadonly();
|
|
54
|
+
// ============================================
|
|
55
|
+
// Toolbar Interaction State
|
|
56
|
+
// ============================================
|
|
57
|
+
/** Signal to track when the toolbar is being hovered/interacted with */
|
|
58
|
+
this._isToolbarInteracting = signal(false);
|
|
59
|
+
this.isToolbarInteracting = this._isToolbarInteracting.asReadonly();
|
|
60
|
+
// Access to ImageService states as readonly signals for UI binding
|
|
61
|
+
this.isUploading = this.imageService.isUploading.asReadonly();
|
|
62
|
+
this.uploadProgress = this.imageService.uploadProgress.asReadonly();
|
|
63
|
+
this.uploadMessage = this.imageService.uploadMessage.asReadonly();
|
|
64
|
+
// ============================================
|
|
65
|
+
// Link State (proxied from LinkService)
|
|
66
|
+
// ============================================
|
|
67
|
+
/** Signal to toggle link edit mode from UI (Toolbar) - Immediate response */
|
|
68
|
+
this.linkEditMode = this.linkSvc.editMode.asReadonly();
|
|
69
|
+
/** Reference to the element that triggered the link menu (for anchoring) */
|
|
70
|
+
this.linkMenuTrigger = this.linkSvc.menuTrigger.asReadonly();
|
|
71
|
+
// ============================================
|
|
72
|
+
// Color Picker State (proxied from ColorPickerService)
|
|
73
|
+
// ============================================
|
|
74
|
+
/** Signal to toggle color picker mode from UI (text or highlight) */
|
|
75
|
+
this.colorEditMode = this.colorPickerSvc.editMode.asReadonly();
|
|
76
|
+
/** Reference to the element that triggered the color menu (for anchoring) */
|
|
77
|
+
this.colorMenuTrigger = this.colorPickerSvc.menuTrigger.asReadonly();
|
|
78
|
+
}
|
|
79
|
+
/** Set toolbar interaction state (called by editor component) */
|
|
80
|
+
setToolbarInteracting(value) {
|
|
81
|
+
this._isToolbarInteracting.set(value);
|
|
82
|
+
}
|
|
83
|
+
set uploadHandler(handler) {
|
|
84
|
+
this.imageService.uploadHandler = handler;
|
|
85
|
+
}
|
|
86
|
+
/** Update state (called by TiptapStateExtension) */
|
|
87
|
+
updateState(state) {
|
|
88
|
+
this._editorState.set(state);
|
|
89
|
+
}
|
|
90
|
+
// ============================================
|
|
91
|
+
// Link Edit Methods (delegated to LinkService)
|
|
92
|
+
// ============================================
|
|
93
|
+
// ============================================
|
|
94
|
+
// Command Execution
|
|
95
|
+
// ============================================
|
|
96
|
+
/** Generic method to execute any command by name */
|
|
97
|
+
execute(editor, command, ...args) {
|
|
98
|
+
if (!editor) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
switch (command) {
|
|
102
|
+
case "toggleBold":
|
|
103
|
+
this.toggleBold(editor);
|
|
104
|
+
break;
|
|
105
|
+
case "toggleItalic":
|
|
106
|
+
this.toggleItalic(editor);
|
|
107
|
+
break;
|
|
108
|
+
case "toggleStrike":
|
|
109
|
+
this.toggleStrike(editor);
|
|
110
|
+
break;
|
|
111
|
+
case "toggleCode":
|
|
112
|
+
this.toggleCode(editor);
|
|
113
|
+
break;
|
|
114
|
+
case "toggleCodeBlock":
|
|
115
|
+
this.toggleCodeBlock(editor);
|
|
116
|
+
break;
|
|
117
|
+
case "toggleUnderline":
|
|
118
|
+
this.toggleUnderline(editor);
|
|
119
|
+
break;
|
|
120
|
+
case "toggleSuperscript":
|
|
121
|
+
this.toggleSuperscript(editor);
|
|
122
|
+
break;
|
|
123
|
+
case "toggleSubscript":
|
|
124
|
+
this.toggleSubscript(editor);
|
|
125
|
+
break;
|
|
126
|
+
case "toggleHeading":
|
|
127
|
+
this.toggleHeading(editor, args[0]);
|
|
128
|
+
break;
|
|
129
|
+
case "toggleBulletList":
|
|
130
|
+
this.toggleBulletList(editor);
|
|
131
|
+
break;
|
|
132
|
+
case "toggleOrderedList":
|
|
133
|
+
this.toggleOrderedList(editor);
|
|
134
|
+
break;
|
|
135
|
+
case "toggleBlockquote":
|
|
136
|
+
this.toggleBlockquote(editor);
|
|
137
|
+
break;
|
|
138
|
+
case "setTextAlign":
|
|
139
|
+
this.setTextAlign(editor, args[0]);
|
|
140
|
+
break;
|
|
141
|
+
case "toggleLink":
|
|
142
|
+
this.linkSvc.toggle(editor, args[0]);
|
|
143
|
+
break;
|
|
144
|
+
case "unsetLink":
|
|
145
|
+
this.linkSvc.unsetLink(editor);
|
|
146
|
+
break;
|
|
147
|
+
case "toggleColorPicker":
|
|
148
|
+
this.colorPickerSvc.toggle(editor, args[0], args[1]);
|
|
149
|
+
break;
|
|
150
|
+
case "insertHorizontalRule":
|
|
151
|
+
this.insertHorizontalRule(editor);
|
|
152
|
+
break;
|
|
153
|
+
case "insertImage":
|
|
154
|
+
this.insertImage(editor, args[0]);
|
|
155
|
+
break;
|
|
156
|
+
case "uploadImage":
|
|
157
|
+
this.uploadImage(editor, args[0], args[1]);
|
|
158
|
+
break;
|
|
159
|
+
case "toggleHighlight":
|
|
160
|
+
this.toggleHighlight(editor, args[0]);
|
|
161
|
+
break;
|
|
162
|
+
case "undo":
|
|
163
|
+
this.undo(editor);
|
|
164
|
+
break;
|
|
165
|
+
case "redo":
|
|
166
|
+
this.redo(editor);
|
|
167
|
+
break;
|
|
168
|
+
case "insertTable":
|
|
169
|
+
this.insertTable(editor, args[0], args[1]);
|
|
170
|
+
break;
|
|
171
|
+
case "addColumnBefore":
|
|
172
|
+
this.addColumnBefore(editor);
|
|
173
|
+
break;
|
|
174
|
+
case "addColumnAfter":
|
|
175
|
+
this.addColumnAfter(editor);
|
|
176
|
+
break;
|
|
177
|
+
case "deleteColumn":
|
|
178
|
+
this.deleteColumn(editor);
|
|
179
|
+
break;
|
|
180
|
+
case "addRowBefore":
|
|
181
|
+
this.addRowBefore(editor);
|
|
182
|
+
break;
|
|
183
|
+
case "addRowAfter":
|
|
184
|
+
this.addRowAfter(editor);
|
|
185
|
+
break;
|
|
186
|
+
case "deleteRow":
|
|
187
|
+
this.deleteRow(editor);
|
|
188
|
+
break;
|
|
189
|
+
case "deleteTable":
|
|
190
|
+
this.deleteTable(editor);
|
|
191
|
+
break;
|
|
192
|
+
case "mergeCells":
|
|
193
|
+
this.mergeCells(editor);
|
|
194
|
+
break;
|
|
195
|
+
case "splitCell":
|
|
196
|
+
this.splitCell(editor);
|
|
197
|
+
break;
|
|
198
|
+
case "toggleHeaderColumn":
|
|
199
|
+
this.toggleHeaderColumn(editor);
|
|
200
|
+
break;
|
|
201
|
+
case "toggleHeaderRow":
|
|
202
|
+
this.toggleHeaderRow(editor);
|
|
203
|
+
break;
|
|
204
|
+
case "applyColor":
|
|
205
|
+
this.colorPickerSvc.applyColor(editor, args[0], args[1], args[2]);
|
|
206
|
+
break;
|
|
207
|
+
case "applyHighlight":
|
|
208
|
+
this.colorPickerSvc.applyHighlight(editor, args[0], args[1], args[2]);
|
|
209
|
+
break;
|
|
210
|
+
case "unsetColor":
|
|
211
|
+
this.colorPickerSvc.unsetColor(editor, args[0]);
|
|
212
|
+
break;
|
|
213
|
+
case "unsetHighlight":
|
|
214
|
+
this.colorPickerSvc.unsetHighlight(editor, args[0]);
|
|
215
|
+
break;
|
|
216
|
+
case "clearContent":
|
|
217
|
+
this.clearContent(editor);
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// --- Formatting Commands ---
|
|
222
|
+
toggleBold(editor) {
|
|
223
|
+
if (!editor) {
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
editor.chain().focus().toggleBold().run();
|
|
227
|
+
}
|
|
228
|
+
toggleItalic(editor) {
|
|
229
|
+
if (!editor) {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
editor.chain().focus().toggleItalic().run();
|
|
233
|
+
}
|
|
234
|
+
toggleStrike(editor) {
|
|
235
|
+
if (!editor) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
editor.chain().focus().toggleStrike().run();
|
|
239
|
+
}
|
|
240
|
+
toggleCode(editor) {
|
|
241
|
+
if (!editor) {
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
editor.chain().focus().toggleCode().run();
|
|
245
|
+
}
|
|
246
|
+
toggleCodeBlock(editor) {
|
|
247
|
+
if (!editor) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
editor.chain().focus().toggleCodeBlock().run();
|
|
251
|
+
}
|
|
252
|
+
toggleUnderline(editor) {
|
|
253
|
+
if (!editor) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
editor.chain().focus().toggleUnderline().run();
|
|
257
|
+
}
|
|
258
|
+
toggleSuperscript(editor) {
|
|
259
|
+
if (!editor) {
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
editor.chain().focus().toggleSuperscript().run();
|
|
263
|
+
}
|
|
264
|
+
toggleSubscript(editor) {
|
|
265
|
+
if (!editor) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
editor.chain().focus().toggleSubscript().run();
|
|
269
|
+
}
|
|
270
|
+
toggleHeading(editor, level) {
|
|
271
|
+
if (!editor) {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
editor.chain().focus().toggleHeading({ level }).run();
|
|
275
|
+
}
|
|
276
|
+
toggleHighlight(editor, color) {
|
|
277
|
+
if (!editor) {
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
if (color) {
|
|
281
|
+
editor.chain().focus().setHighlight({ color }).run();
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
editor.chain().focus().toggleHighlight().run();
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// --- Structure Commands ---
|
|
288
|
+
toggleBulletList(editor) {
|
|
289
|
+
if (!editor) {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
editor.chain().focus().toggleBulletList().run();
|
|
293
|
+
}
|
|
294
|
+
toggleOrderedList(editor) {
|
|
295
|
+
if (!editor) {
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
editor.chain().focus().toggleOrderedList().run();
|
|
299
|
+
}
|
|
300
|
+
toggleBlockquote(editor) {
|
|
301
|
+
if (!editor) {
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
editor.chain().focus().toggleBlockquote().run();
|
|
305
|
+
}
|
|
306
|
+
setTextAlign(editor, alignment) {
|
|
307
|
+
if (!editor) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
editor.chain().focus().setTextAlign(alignment).run();
|
|
311
|
+
}
|
|
312
|
+
insertHorizontalRule(editor) {
|
|
313
|
+
if (!editor) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
editor.chain().focus().setHorizontalRule().run();
|
|
317
|
+
}
|
|
318
|
+
// --- History Commands ---
|
|
319
|
+
undo(editor) {
|
|
320
|
+
if (!editor) {
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
editor.chain().focus().undo().run();
|
|
324
|
+
}
|
|
325
|
+
redo(editor) {
|
|
326
|
+
if (!editor) {
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
editor.chain().focus().redo().run();
|
|
330
|
+
}
|
|
331
|
+
// --- Table Commands ---
|
|
332
|
+
insertTable(editor, rows = 3, cols = 3) {
|
|
333
|
+
if (!editor) {
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
editor.chain().focus().insertTable({ rows, cols }).run();
|
|
337
|
+
}
|
|
338
|
+
addColumnBefore(editor) {
|
|
339
|
+
if (!editor) {
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
editor.chain().focus().addColumnBefore().run();
|
|
343
|
+
}
|
|
344
|
+
addColumnAfter(editor) {
|
|
345
|
+
if (!editor) {
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
editor.chain().focus().addColumnAfter().run();
|
|
349
|
+
}
|
|
350
|
+
deleteColumn(editor) {
|
|
351
|
+
if (!editor) {
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
editor.chain().focus().deleteColumn().run();
|
|
355
|
+
}
|
|
356
|
+
addRowBefore(editor) {
|
|
357
|
+
if (!editor) {
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
editor.chain().focus().addRowBefore().run();
|
|
361
|
+
}
|
|
362
|
+
addRowAfter(editor) {
|
|
363
|
+
if (!editor) {
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
editor.chain().focus().addRowAfter().run();
|
|
367
|
+
}
|
|
368
|
+
deleteRow(editor) {
|
|
369
|
+
if (!editor) {
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
editor.chain().focus().deleteRow().run();
|
|
373
|
+
}
|
|
374
|
+
deleteTable(editor) {
|
|
375
|
+
if (!editor) {
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
editor.chain().focus().deleteTable().run();
|
|
379
|
+
}
|
|
380
|
+
mergeCells(editor) {
|
|
381
|
+
if (!editor) {
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
editor.chain().focus().mergeCells().run();
|
|
385
|
+
}
|
|
386
|
+
splitCell(editor) {
|
|
387
|
+
if (!editor) {
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
editor.chain().focus().splitCell().run();
|
|
391
|
+
}
|
|
392
|
+
toggleHeaderColumn(editor) {
|
|
393
|
+
if (!editor) {
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
editor.chain().focus().toggleHeaderColumn().run();
|
|
397
|
+
}
|
|
398
|
+
toggleHeaderRow(editor) {
|
|
399
|
+
if (!editor) {
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
editor.chain().focus().toggleHeaderRow().run();
|
|
403
|
+
}
|
|
404
|
+
// --- Utility Commands ---
|
|
405
|
+
clearContent(editor) {
|
|
406
|
+
if (!editor) {
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
editor.commands.clearContent(true);
|
|
410
|
+
}
|
|
411
|
+
focus(editor) {
|
|
412
|
+
if (!editor) {
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
editor.chain().focus().run();
|
|
416
|
+
}
|
|
417
|
+
blur(editor) {
|
|
418
|
+
if (!editor) {
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
421
|
+
editor.chain().blur().run();
|
|
422
|
+
}
|
|
423
|
+
setContent(editor, content, emitUpdate = true) {
|
|
424
|
+
if (!editor) {
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
editor.commands.setContent(content, { emitUpdate });
|
|
428
|
+
}
|
|
429
|
+
setEditable(editor, editable) {
|
|
430
|
+
if (!editor) {
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
editor.setEditable(editable);
|
|
434
|
+
}
|
|
435
|
+
insertContent(editor, content) {
|
|
436
|
+
if (!editor) {
|
|
437
|
+
return;
|
|
438
|
+
}
|
|
439
|
+
editor.chain().focus().insertContent(content).run();
|
|
440
|
+
}
|
|
441
|
+
async insertImage(editor, options) {
|
|
442
|
+
try {
|
|
443
|
+
await this.imageService.selectAndUploadImage(editor, options);
|
|
444
|
+
}
|
|
445
|
+
catch (error) {
|
|
446
|
+
console.error("Error inserting image:", error);
|
|
447
|
+
throw error;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
async uploadImage(editor, file, options) {
|
|
451
|
+
try {
|
|
452
|
+
await this.imageService.uploadAndInsertImage(editor, file, options);
|
|
453
|
+
}
|
|
454
|
+
catch (error) {
|
|
455
|
+
console.error("Error uploading image:", error);
|
|
456
|
+
throw error;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
downloadImage(editor) {
|
|
460
|
+
this.imageService.downloadImage(editor);
|
|
461
|
+
}
|
|
462
|
+
handleImageDrop(editor, event, options) {
|
|
463
|
+
return this.imageService.handleDrop(editor, event, options);
|
|
464
|
+
}
|
|
465
|
+
handleImagePaste(editor, event, options) {
|
|
466
|
+
return this.imageService.handlePaste(editor, event, options);
|
|
467
|
+
}
|
|
468
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteEditorCommandsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
469
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteEditorCommandsService }); }
|
|
470
|
+
}
|
|
471
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteEditorCommandsService, decorators: [{
|
|
472
|
+
type: Injectable
|
|
473
|
+
}] });
|
|
474
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLWVkaXRvci1jb21tYW5kcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci10aXB0YXAtZWRpdG9yL3NyYy9saWIvc2VydmljZXMvYXRlLWVkaXRvci1jb21tYW5kcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBMEIsd0JBQXdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7QUFJcEcsTUFBTSxPQUFPLHdCQUF3QjtJQURyQztRQUVVLGlCQUFZLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3ZDLG1CQUFjLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0MsWUFBTyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN4QixpQkFBWSxHQUFHLE1BQU0sQ0FBeUIsd0JBQXdCLEVBQUU7WUFDdkYsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNkLDZCQUE2QjtnQkFDN0IsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ2pFLE9BQU8sS0FBSyxDQUFDO2dCQUNmLENBQUM7Z0JBRUQsbUNBQW1DO2dCQUNuQyxJQUNFLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFB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IHNpZ25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBFZGl0b3IgfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCI7XG5pbXBvcnQgeyBBdGVJbWFnZVNlcnZpY2UgfSBmcm9tIFwiLi9hdGUtaW1hZ2Uuc2VydmljZVwiO1xuaW1wb3J0IHsgQXRlQ29sb3JQaWNrZXJTZXJ2aWNlIH0gZnJvbSBcIi4vYXRlLWNvbG9yLXBpY2tlci5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBBdGVMaW5rU2VydmljZSB9IGZyb20gXCIuL2F0ZS1saW5rLnNlcnZpY2VcIjtcbmltcG9ydCB7IEF0ZUVkaXRvclN0YXRlU25hcHNob3QsIEFURV9JTklUSUFMX0VESVRPUl9TVEFURSB9IGZyb20gXCIuLi9tb2RlbHMvYXRlLWVkaXRvci1zdGF0ZS5tb2RlbFwiO1xuaW1wb3J0IHsgQXRlSW1hZ2VVcGxvYWRIYW5kbGVyLCBBdGVJbWFnZVVwbG9hZE9wdGlvbnMgfSBmcm9tIFwiLi4vbW9kZWxzL2F0ZS1pbWFnZS5tb2RlbFwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXRlRWRpdG9yQ29tbWFuZHNTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBpbWFnZVNlcnZpY2UgPSBpbmplY3QoQXRlSW1hZ2VTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBjb2xvclBpY2tlclN2YyA9IGluamVjdChBdGVDb2xvclBpY2tlclNlcnZpY2UpO1xuICBwcml2YXRlIGxpbmtTdmMgPSBpbmplY3QoQXRlTGlua1NlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9lZGl0b3JTdGF0ZSA9IHNpZ25hbDxBdGVFZGl0b3JTdGF0ZVNuYXBzaG90PihBVEVfSU5JVElBTF9FRElUT1JfU1RBVEUsIHtcbiAgICBlcXVhbDogKGEsIGIpID0+IHtcbiAgICAgIC8vIDEuIFByaW1pdGl2ZSBnbG9iYWwgc3RhdGVzXG4gICAgICBpZiAoYS5pc0ZvY3VzZWQgIT09IGIuaXNGb2N1c2VkIHx8IGEuaXNFZGl0YWJsZSAhPT0gYi5pc0VkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gMi4gRGV0YWlsZWQgc2VsZWN0aW9uIGNvbXBhcmlzb25cbiAgICAgIGlmIChcbiAgICAgICAgYS5zZWxlY3Rpb24uZnJvbSAhPT0gYi5zZWxlY3Rpb24uZnJvbSB8fFxuICAgICAgICBhLnNlbGVjdGlvbi50byAhPT0gYi5zZWxlY3Rpb24udG8gfHxcbiAgICAgICAgYS5zZWxlY3Rpb24udHlwZSAhPT0gYi5zZWxlY3Rpb24udHlwZSB8fFxuICAgICAgICBhLnNlbGVjdGlvbi5lbXB0eSAhPT0gYi5zZWxlY3Rpb24uZW1wdHkgfHxcbiAgICAgICAgYS5zZWxlY3Rpb24uaXNTaW5nbGVDZWxsICE9PSBiLnNlbGVjdGlvbi5pc1NpbmdsZUNlbGxcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIEhlbHBlciBmb3Igb2JqZWN0IGNvbXBhcmlzb25cbiAgICAgIGNvbnN0IGlzUmVjb3JkRXF1YWwgPSAob2JqQTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG9iakI6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgIGNvbnN0IGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gICAgICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG4gICAgICAgIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5c0EuZXZlcnkoa2V5ID0+IG9iakFba2V5XSA9PT0gb2JqQltrZXldKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIDMuIENvbXBhcmUgc3ViLXN0YXRlcyAobWFya3MsIGNhbiwgbm9kZXMpXG4gICAgICBpZiAoIWlzUmVjb3JkRXF1YWwoYS5tYXJrcywgYi5tYXJrcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCFpc1JlY29yZEVxdWFsKGEuY2FuLCBiLmNhbikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCFpc1JlY29yZEVxdWFsKGEubm9kZXMsIGIubm9kZXMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gNC4gQ29tcGFyZSBjdXN0b20gZXh0ZW5zaW9uIHN0YXRlc1xuICAgICAgaWYgKCFpc1JlY29yZEVxdWFsKGEuY3VzdG9tLCBiLmN1c3RvbSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcblxuICAvKiogRXhwb3NlZCBlZGl0b3Igc3RhdGUgYXMgYSByZWFkb25seSBzaWduYWwgKi9cbiAgcmVhZG9ubHkgZWRpdG9yU3RhdGUgPSB0aGlzLl9lZGl0b3JTdGF0ZS5hc1JlYWRvbmx5KCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVG9vbGJhciBJbnRlcmFjdGlvbiBTdGF0ZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBTaWduYWwgdG8gdHJhY2sgd2hlbiB0aGUgdG9vbGJhciBpcyBiZWluZyBob3ZlcmVkL2ludGVyYWN0ZWQgd2l0aCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9pc1Rvb2xiYXJJbnRlcmFjdGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGlzVG9vbGJhckludGVyYWN0aW5nID0gdGhpcy5faXNUb29sYmFySW50ZXJhY3RpbmcuYXNSZWFkb25seSgpO1xuXG4gIC8qKiBTZXQgdG9vbGJhciBpbnRlcmFjdGlvbiBzdGF0ZSAoY2FsbGVkIGJ5IGVkaXRvciBjb21wb25lbnQpICovXG4gIHNldFRvb2xiYXJJbnRlcmFjdGluZyh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2lzVG9vbGJhckludGVyYWN0aW5nLnNldCh2YWx1ZSk7XG4gIH1cblxuICAvLyBBY2Nlc3MgdG8gSW1hZ2VTZXJ2aWNlIHN0YXRlcyBhcyByZWFkb25seSBzaWduYWxzIGZvciBVSSBiaW5kaW5nXG4gIHJlYWRvbmx5IGlzVXBsb2FkaW5nID0gdGhpcy5pbWFnZVNlcnZpY2UuaXNVcGxvYWRpbmcuYXNSZWFkb25seSgpO1xuICByZWFkb25seSB1cGxvYWRQcm9ncmVzcyA9IHRoaXMuaW1hZ2VTZXJ2aWNlLnVwbG9hZFByb2dyZXNzLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgdXBsb2FkTWVzc2FnZSA9IHRoaXMuaW1hZ2VTZXJ2aWNlLnVwbG9hZE1lc3NhZ2UuYXNSZWFkb25seSgpO1xuICBzZXQgdXBsb2FkSGFuZGxlcihoYW5kbGVyOiBBdGVJbWFnZVVwbG9hZEhhbmRsZXIgfCBudWxsKSB7XG4gICAgdGhpcy5pbWFnZVNlcnZpY2UudXBsb2FkSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICAvKiogVXBkYXRlIHN0YXRlIChjYWxsZWQgYnkgVGlwdGFwU3RhdGVFeHRlbnNpb24pICovXG4gIHVwZGF0ZVN0YXRlKHN0YXRlOiBBdGVFZGl0b3JTdGF0ZVNuYXBzaG90KSB7XG4gICAgdGhpcy5fZWRpdG9yU3RhdGUuc2V0KHN0YXRlKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIExpbmsgU3RhdGUgKHByb3hpZWQgZnJvbSBMaW5rU2VydmljZSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogU2lnbmFsIHRvIHRvZ2dsZSBsaW5rIGVkaXQgbW9kZSBmcm9tIFVJIChUb29sYmFyKSAtIEltbWVkaWF0ZSByZXNwb25zZSAqL1xuICByZWFkb25seSBsaW5rRWRpdE1vZGUgPSB0aGlzLmxpbmtTdmMuZWRpdE1vZGUuYXNSZWFkb25seSgpO1xuXG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIGxpbmsgbWVudSAoZm9yIGFuY2hvcmluZykgKi9cbiAgcmVhZG9ubHkgbGlua01lbnVUcmlnZ2VyID0gdGhpcy5saW5rU3ZjLm1lbnVUcmlnZ2VyLmFzUmVhZG9ubHkoKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb2xvciBQaWNrZXIgU3RhdGUgKHByb3hpZWQgZnJvbSBDb2xvclBpY2tlclNlcnZpY2UpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFNpZ25hbCB0byB0b2dnbGUgY29sb3IgcGlja2VyIG1vZGUgZnJvbSBVSSAodGV4dCBvciBoaWdobGlnaHQpICovXG4gIHJlYWRvbmx5IGNvbG9yRWRpdE1vZGUgPSB0aGlzLmNvbG9yUGlja2VyU3ZjLmVkaXRNb2RlLmFzUmVhZG9ubHkoKTtcblxuICAvKiogUmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBjb2xvciBtZW51IChmb3IgYW5jaG9yaW5nKSAqL1xuICByZWFkb25seSBjb2xvck1lbnVUcmlnZ2VyID0gdGhpcy5jb2xvclBpY2tlclN2Yy5tZW51VHJpZ2dlci5hc1JlYWRvbmx5KCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTGluayBFZGl0IE1ldGhvZHMgKGRlbGVnYXRlZCB0byBMaW5rU2VydmljZSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb21tYW5kIEV4ZWN1dGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBHZW5lcmljIG1ldGhvZCB0byBleGVjdXRlIGFueSBjb21tYW5kIGJ5IG5hbWUgKi9cbiAgZXhlY3V0ZShlZGl0b3I6IEVkaXRvciwgY29tbWFuZDogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29tbWFuZCkge1xuICAgICAgY2FzZSBcInRvZ2dsZUJvbGRcIjpcbiAgICAgICAgdGhpcy50b2dnbGVCb2xkKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRvZ2dsZUl0YWxpY1wiOlxuICAgICAgICB0aGlzLnRvZ2dsZUl0YWxpYyhlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0b2dnbGVTdHJpa2VcIjpcbiAgICAgICAgdGhpcy50b2dnbGVTdHJpa2UoZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9nZ2xlQ29kZVwiOlxuICAgICAgICB0aGlzLnRvZ2dsZUNvZGUoZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9nZ2xlQ29kZUJsb2NrXCI6XG4gICAgICAgIHRoaXMudG9nZ2xlQ29kZUJsb2NrKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRvZ2dsZVVuZGVybGluZVwiOlxuICAgICAgICB0aGlzLnRvZ2dsZVVuZGVybGluZShlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0b2dnbGVTdXBlcnNjcmlwdFwiOlxuICAgICAgICB0aGlzLnRvZ2dsZVN1cGVyc2NyaXB0KGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRvZ2dsZVN1YnNjcmlwdFwiOlxuICAgICAgICB0aGlzLnRvZ2dsZVN1YnNjcmlwdChlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0b2dnbGVIZWFkaW5nXCI6XG4gICAgICAgIHRoaXMudG9nZ2xlSGVhZGluZyhlZGl0b3IsIGFyZ3NbMF0gYXMgMSB8IDIgfCAzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9nZ2xlQnVsbGV0TGlzdFwiOlxuICAgICAgICB0aGlzLnRvZ2dsZUJ1bGxldExpc3QoZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9nZ2xlT3JkZXJlZExpc3RcIjpcbiAgICAgICAgdGhpcy50b2dnbGVPcmRlcmVkTGlzdChlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0b2dnbGVCbG9ja3F1b3RlXCI6XG4gICAgICAgIHRoaXMudG9nZ2xlQmxvY2txdW90ZShlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJzZXRUZXh0QWxpZ25cIjpcbiAgICAgICAgdGhpcy5zZXRUZXh0QWxpZ24oZWRpdG9yLCBhcmdzWzBdIGFzIFwibGVmdFwiIHwgXCJjZW50ZXJcIiB8IFwicmlnaHRcIiB8IFwianVzdGlmeVwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9nZ2xlTGlua1wiOlxuICAgICAgICB0aGlzLmxpbmtTdmMudG9nZ2xlKGVkaXRvciwgYXJnc1swXSBhcyBFdmVudCB8IHVuZGVmaW5lZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInVuc2V0TGlua1wiOlxuICAgICAgICB0aGlzLmxpbmtTdmMudW5zZXRMaW5rKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRvZ2dsZUNvbG9yUGlja2VyXCI6XG4gICAgICAgIHRoaXMuY29sb3JQaWNrZXJTdmMudG9nZ2xlKGVkaXRvciwgYXJnc1swXSBhcyBcInRleHRcIiB8IFwiaGlnaGxpZ2h0XCIsIGFyZ3NbMV0gYXMgRXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJpbnNlcnRIb3Jpem9udGFsUnVsZVwiOlxuICAgICAgICB0aGlzLmluc2VydEhvcml6b250YWxSdWxlKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImluc2VydEltYWdlXCI6XG4gICAgICAgIHRoaXMuaW5zZXJ0SW1hZ2UoZWRpdG9yLCBhcmdzWzBdIGFzIEF0ZUltYWdlVXBsb2FkT3B0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInVwbG9hZEltYWdlXCI6XG4gICAgICAgIHRoaXMudXBsb2FkSW1hZ2UoZWRpdG9yLCBhcmdzWzBdIGFzIEZpbGUsIGFyZ3NbMV0gYXMgQXRlSW1hZ2VVcGxvYWRPcHRpb25zIHwgdW5kZWZpbmVkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9nZ2xlSGlnaGxpZ2h0XCI6XG4gICAgICAgIHRoaXMudG9nZ2xlSGlnaGxpZ2h0KGVkaXRvciwgYXJnc1swXSBhcyBzdHJpbmcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ1bmRvXCI6XG4gICAgICAgIHRoaXMudW5kbyhlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJyZWRvXCI6XG4gICAgICAgIHRoaXMucmVkbyhlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJpbnNlcnRUYWJsZVwiOlxuICAgICAgICB0aGlzLmluc2VydFRhYmxlKGVkaXRvciwgYXJnc1swXSBhcyBudW1iZXIgfCB1bmRlZmluZWQsIGFyZ3NbMV0gYXMgbnVtYmVyIHwgdW5kZWZpbmVkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYWRkQ29sdW1uQmVmb3JlXCI6XG4gICAgICAgIHRoaXMuYWRkQ29sdW1uQmVmb3JlKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImFkZENvbHVtbkFmdGVyXCI6XG4gICAgICAgIHRoaXMuYWRkQ29sdW1uQWZ0ZXIoZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZGVsZXRlQ29sdW1uXCI6XG4gICAgICAgIHRoaXMuZGVsZXRlQ29sdW1uKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImFkZFJvd0JlZm9yZVwiOlxuICAgICAgICB0aGlzLmFkZFJvd0JlZm9yZShlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJhZGRSb3dBZnRlclwiOlxuICAgICAgICB0aGlzLmFkZFJvd0FmdGVyKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImRlbGV0ZVJvd1wiOlxuICAgICAgICB0aGlzLmRlbGV0ZVJvdyhlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJkZWxldGVUYWJsZVwiOlxuICAgICAgICB0aGlzLmRlbGV0ZVRhYmxlKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIm1lcmdlQ2VsbHNcIjpcbiAgICAgICAgdGhpcy5tZXJnZUNlbGxzKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInNwbGl0Q2VsbFwiOlxuICAgICAgICB0aGlzLnNwbGl0Q2VsbChlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0b2dnbGVIZWFkZXJDb2x1bW5cIjpcbiAgICAgICAgdGhpcy50b2dnbGVIZWFkZXJDb2x1bW4oZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9nZ2xlSGVhZGVyUm93XCI6XG4gICAgICAgIHRoaXMudG9nZ2xlSGVhZGVyUm93KGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImFwcGx5Q29sb3JcIjpcbiAgICAgICAgdGhpcy5jb2xvclBpY2tlclN2Yy5hcHBseUNvbG9yKFxuICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICBhcmdzWzBdIGFzIHN0cmluZyxcbiAgICAgICAgICBhcmdzWzFdIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgYXJnc1syXSBhcyBib29sZWFuIHwgdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImFwcGx5SGlnaGxpZ2h0XCI6XG4gICAgICAgIHRoaXMuY29sb3JQaWNrZXJTdmMuYXBwbHlIaWdobGlnaHQoXG4gICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgIGFyZ3NbMF0gYXMgc3RyaW5nLFxuICAgICAgICAgIGFyZ3NbMV0gYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBhcmdzWzJdIGFzIGJvb2xlYW4gfCB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidW5zZXRDb2xvclwiOlxuICAgICAgICB0aGlzLmNvbG9yUGlja2VyU3ZjLnVuc2V0Q29sb3IoZWRpdG9yLCBhcmdzWzBdIGFzIGJvb2xlYW4pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ1bnNldEhpZ2hsaWdodFwiOlxuICAgICAgICB0aGlzLmNvbG9yUGlja2VyU3ZjLnVuc2V0SGlnaGxpZ2h0KGVkaXRvciwgYXJnc1swXSBhcyBib29sZWFuKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJjbGVhckNvbnRlbnRcIjpcbiAgICAgICAgdGhpcy5jbGVhckNvbnRlbnQoZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tIEZvcm1hdHRpbmcgQ29tbWFuZHMgLS0tXG5cbiAgdG9nZ2xlQm9sZChlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlQm9sZCgpLnJ1bigpO1xuICB9XG5cbiAgdG9nZ2xlSXRhbGljKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS50b2dnbGVJdGFsaWMoKS5ydW4oKTtcbiAgfVxuXG4gIHRvZ2dsZVN0cmlrZShlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlU3RyaWtlKCkucnVuKCk7XG4gIH1cblxuICB0b2dnbGVDb2RlKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS50b2dnbGVDb2RlKCkucnVuKCk7XG4gIH1cblxuICB0b2dnbGVDb2RlQmxvY2soZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUNvZGVCbG9jaygpLnJ1bigpO1xuICB9XG5cbiAgdG9nZ2xlVW5kZXJsaW5lKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS50b2dnbGVVbmRlcmxpbmUoKS5ydW4oKTtcbiAgfVxuXG4gIHRvZ2dsZVN1cGVyc2NyaXB0KGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS50b2dnbGVTdXBlcnNjcmlwdCgpLnJ1bigpO1xuICB9XG5cbiAgdG9nZ2xlU3Vic2NyaXB0KGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS50b2dnbGVTdWJzY3JpcHQoKS5ydW4oKTtcbiAgfVxuXG4gIHRvZ2dsZUhlYWRpbmcoZWRpdG9yOiBFZGl0b3IsIGxldmVsOiAxIHwgMiB8IDMpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUhlYWRpbmcoeyBsZXZlbCB9KS5ydW4oKTtcbiAgfVxuXG4gIHRvZ2dsZUhpZ2hsaWdodChlZGl0b3I6IEVkaXRvciwgY29sb3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY29sb3IpIHtcbiAgICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkuc2V0SGlnaGxpZ2h0KHsgY29sb3IgfSkucnVuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlSGlnaGxpZ2h0KCkucnVuKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tIFN0cnVjdHVyZSBDb21tYW5kcyAtLS1cblxuICB0b2dnbGVCdWxsZXRMaXN0KGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS50b2dnbGVCdWxsZXRMaXN0KCkucnVuKCk7XG4gIH1cblxuICB0b2dnbGVPcmRlcmVkTGlzdChlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlT3JkZXJlZExpc3QoKS5ydW4oKTtcbiAgfVxuXG4gIHRvZ2dsZUJsb2NrcXVvdGUoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUJsb2NrcXVvdGUoKS5ydW4oKTtcbiAgfVxuXG4gIHNldFRleHRBbGlnbihlZGl0b3I6IEVkaXRvciwgYWxpZ25tZW50OiBcImxlZnRcIiB8IFwiY2VudGVyXCIgfCBcInJpZ2h0XCIgfCBcImp1c3RpZnlcIik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkuc2V0VGV4dEFsaWduKGFsaWdubWVudCkucnVuKCk7XG4gIH1cblxuICBpbnNlcnRIb3Jpem9udGFsUnVsZShlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkuc2V0SG9yaXpvbnRhbFJ1bGUoKS5ydW4oKTtcbiAgfVxuXG4gIC8vIC0tLSBIaXN0b3J5IENvbW1hbmRzIC0tLVxuXG4gIHVuZG8oZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnVuZG8oKS5ydW4oKTtcbiAgfVxuXG4gIHJlZG8oZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnJlZG8oKS5ydW4oKTtcbiAgfVxuXG4gIC8vIC0tLSBUYWJsZSBDb21tYW5kcyAtLS1cblxuICBpbnNlcnRUYWJsZShlZGl0b3I6IEVkaXRvciwgcm93cyA9IDMsIGNvbHMgPSAzKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5pbnNlcnRUYWJsZSh7IHJvd3MsIGNvbHMgfSkucnVuKCk7XG4gIH1cblxuICBhZGRDb2x1bW5CZWZvcmUoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLmFkZENvbHVtbkJlZm9yZSgpLnJ1bigpO1xuICB9XG5cbiAgYWRkQ29sdW1uQWZ0ZXIoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLmFkZENvbHVtbkFmdGVyKCkucnVuKCk7XG4gIH1cblxuICBkZWxldGVDb2x1bW4oZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLmRlbGV0ZUNvbHVtbigpLnJ1bigpO1xuICB9XG5cbiAgYWRkUm93QmVmb3JlKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5hZGRSb3dCZWZvcmUoKS5ydW4oKTtcbiAgfVxuXG4gIGFkZFJvd0FmdGVyKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5hZGRSb3dBZnRlcigpLnJ1bigpO1xuICB9XG5cbiAgZGVsZXRlUm93KGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5kZWxldGVSb3coKS5ydW4oKTtcbiAgfVxuXG4gIGRlbGV0ZVRhYmxlKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5kZWxldGVUYWJsZSgpLnJ1bigpO1xuICB9XG5cbiAgbWVyZ2VDZWxscyhlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkubWVyZ2VDZWxscygpLnJ1bigpO1xuICB9XG5cbiAgc3BsaXRDZWxsKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5zcGxpdENlbGwoKS5ydW4oKTtcbiAgfVxuXG4gIHRvZ2dsZUhlYWRlckNvbHVtbihlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlSGVhZGVyQ29sdW1uKCkucnVuKCk7XG4gIH1cblxuICB0b2dnbGVIZWFkZXJSb3coZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUhlYWRlclJvdygpLnJ1bigpO1xuICB9XG5cbiAgLy8gLS0tIFV0aWxpdHkgQ29tbWFuZHMgLS0tXG5cbiAgY2xlYXJDb250ZW50KGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNvbW1hbmRzLmNsZWFyQ29udGVudCh0cnVlKTtcbiAgfVxuXG4gIGZvY3VzKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5ydW4oKTtcbiAgfVxuXG4gIGJsdXIoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5ibHVyKCkucnVuKCk7XG4gIH1cblxuICBzZXRDb250ZW50KGVkaXRvcjogRWRpdG9yLCBjb250ZW50OiBzdHJpbmcsIGVtaXRVcGRhdGUgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNvbW1hbmRzLnNldENvbnRlbnQoY29udGVudCwgeyBlbWl0VXBkYXRlIH0pO1xuICB9XG5cbiAgc2V0RWRpdGFibGUoZWRpdG9yOiBFZGl0b3IsIGVkaXRhYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLnNldEVkaXRhYmxlKGVkaXRhYmxlKTtcbiAgfVxuXG4gIGluc2VydENvbnRlbnQoZWRpdG9yOiBFZGl0b3IsIGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkuaW5zZXJ0Q29udGVudChjb250ZW50KS5ydW4oKTtcbiAgfVxuXG4gIGFzeW5jIGluc2VydEltYWdlKGVkaXRvcjogRWRpdG9yLCBvcHRpb25zPzogQXRlSW1hZ2VVcGxvYWRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuaW1hZ2VTZXJ2aWNlLnNlbGVjdEFuZFVwbG9hZEltYWdlKGVkaXRvciwgb3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbnNlcnRpbmcgaW1hZ2U6XCIsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwbG9hZEltYWdlKGVkaXRvcjogRWRpdG9yLCBmaWxlOiBGaWxlLCBvcHRpb25zPzogQXRlSW1hZ2VVcGxvYWRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuaW1hZ2VTZXJ2aWNlLnVwbG9hZEFuZEluc2VydEltYWdlKGVkaXRvciwgZmlsZSwgb3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciB1cGxvYWRpbmcgaW1hZ2U6XCIsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGRvd25sb2FkSW1hZ2UoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICB0aGlzLmltYWdlU2VydmljZS5kb3dubG9hZEltYWdlKGVkaXRvcik7XG4gIH1cblxuICBoYW5kbGVJbWFnZURyb3AoZWRpdG9yOiBFZGl0b3IsIGV2ZW50OiBEcmFnRXZlbnQsIG9wdGlvbnM/OiBBdGVJbWFnZVVwbG9hZE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbWFnZVNlcnZpY2UuaGFuZGxlRHJvcChlZGl0b3IsIGV2ZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIGhhbmRsZUltYWdlUGFzdGUoZWRpdG9yOiBFZGl0b3IsIGV2ZW50OiBDbGlwYm9hcmRFdmVudCwgb3B0aW9ucz86IEF0ZUltYWdlVXBsb2FkT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmltYWdlU2VydmljZS5oYW5kbGVQYXN0ZShlZGl0b3IsIGV2ZW50LCBvcHRpb25zKTtcbiAgfVxufVxuIl19
|