@xw-components/formula-editor 18.1.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.
- package/esm2022/formula-editor-icon.mjs +9 -0
- package/esm2022/formula-editor-request.service.mjs +18 -0
- package/esm2022/formula-editor.component.mjs +299 -0
- package/esm2022/formula-editor.mjs +5 -0
- package/esm2022/formula-editor.model.mjs +57 -0
- package/esm2022/formula-editor.service.mjs +318 -0
- package/esm2022/index.mjs +6 -0
- package/fesm2022/formula-editor.mjs +699 -0
- package/fesm2022/formula-editor.mjs.map +1 -0
- package/formula-editor-icon.d.ts +8 -0
- package/formula-editor-request.service.d.ts +33 -0
- package/formula-editor.component.d.ts +134 -0
- package/formula-editor.model.d.ts +40 -0
- package/formula-editor.service.d.ts +41 -0
- package/index.d.ts +5 -0
- package/package.json +29 -0
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { inject, Injectable } from '@angular/core';
|
|
2
|
+
import { DomSanitizer } from '@angular/platform-browser';
|
|
3
|
+
import { Node, mergeAttributes } from '@tiptap/core';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class FormulaEditorService {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.sanitizer = inject(DomSanitizer);
|
|
8
|
+
}
|
|
9
|
+
initNodes() {
|
|
10
|
+
this.createFuncNode();
|
|
11
|
+
this.createFieldNode();
|
|
12
|
+
}
|
|
13
|
+
createFieldNode() {
|
|
14
|
+
this.fieldNode = Node.create({
|
|
15
|
+
name: 'field',
|
|
16
|
+
inline: true,
|
|
17
|
+
group: 'inline',
|
|
18
|
+
selectable: false,
|
|
19
|
+
draggable: true,
|
|
20
|
+
atom: true,
|
|
21
|
+
addAttributes() {
|
|
22
|
+
return {
|
|
23
|
+
id: {
|
|
24
|
+
default: null
|
|
25
|
+
},
|
|
26
|
+
name: {
|
|
27
|
+
default: ''
|
|
28
|
+
},
|
|
29
|
+
className: {
|
|
30
|
+
default: ''
|
|
31
|
+
},
|
|
32
|
+
dataType: {
|
|
33
|
+
default: 'field'
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
},
|
|
37
|
+
renderText({ node }) {
|
|
38
|
+
return `${node.attrs['name']}`;
|
|
39
|
+
},
|
|
40
|
+
parseHTML() {
|
|
41
|
+
return [{ tag: 'div[data-type="field"]' }];
|
|
42
|
+
},
|
|
43
|
+
renderHTML({ HTMLAttributes, node }) {
|
|
44
|
+
return [
|
|
45
|
+
'div',
|
|
46
|
+
mergeAttributes({
|
|
47
|
+
'data-type': 'field',
|
|
48
|
+
class: `field-node ${node.attrs['className']}` || '',
|
|
49
|
+
contenteditable: 'false',
|
|
50
|
+
style: `display: inline-block;margin: 0 4px;font-size: 13px;height: 18px;line-height: 18px;`
|
|
51
|
+
}, HTMLAttributes),
|
|
52
|
+
node.attrs['name']
|
|
53
|
+
];
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
createFuncNode() {
|
|
58
|
+
this.funcNode = Node.create({
|
|
59
|
+
name: 'func',
|
|
60
|
+
inline: true,
|
|
61
|
+
group: 'inline',
|
|
62
|
+
selectable: false,
|
|
63
|
+
draggable: false,
|
|
64
|
+
content: 'inline*',
|
|
65
|
+
atom: true,
|
|
66
|
+
addAttributes() {
|
|
67
|
+
return {
|
|
68
|
+
id: {
|
|
69
|
+
default: null
|
|
70
|
+
},
|
|
71
|
+
name: {
|
|
72
|
+
default: ''
|
|
73
|
+
},
|
|
74
|
+
className: {
|
|
75
|
+
default: ''
|
|
76
|
+
},
|
|
77
|
+
dataType: {
|
|
78
|
+
default: 'func'
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
},
|
|
82
|
+
renderText({ node }) {
|
|
83
|
+
const funcName = node.attrs['name'] || '';
|
|
84
|
+
const childrenText = node.content.content
|
|
85
|
+
.map(child => {
|
|
86
|
+
if (child.text) {
|
|
87
|
+
return child.text;
|
|
88
|
+
}
|
|
89
|
+
if (child.type && child.type.spec && child.type.spec['toText']) {
|
|
90
|
+
return child.type.spec['toText']({ node: child });
|
|
91
|
+
}
|
|
92
|
+
return '';
|
|
93
|
+
})
|
|
94
|
+
.join('');
|
|
95
|
+
return `${funcName}(${childrenText})`;
|
|
96
|
+
},
|
|
97
|
+
parseHTML() {
|
|
98
|
+
return [{ tag: 'div[data-type="func"]' }];
|
|
99
|
+
},
|
|
100
|
+
addNodeView() {
|
|
101
|
+
return ({ node }) => {
|
|
102
|
+
const createElement = (tag, props = {}) => {
|
|
103
|
+
const element = document.createElement(tag);
|
|
104
|
+
Object.entries(props).forEach(([key, value]) => {
|
|
105
|
+
if (key === 'style') {
|
|
106
|
+
Object.entries(value).forEach(([styleKey, styleValue]) => {
|
|
107
|
+
element.style[styleKey] = styleValue;
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
else if (key === 'innerText') {
|
|
111
|
+
element.innerText = value;
|
|
112
|
+
}
|
|
113
|
+
else if (key === 'className') {
|
|
114
|
+
element.className = value;
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
element.setAttribute(key, value);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
return element;
|
|
121
|
+
};
|
|
122
|
+
const className = node.attrs['className'] || '';
|
|
123
|
+
const funcName = node.attrs['name'];
|
|
124
|
+
const container = createElement('span', {
|
|
125
|
+
style: {
|
|
126
|
+
display: 'inline-block',
|
|
127
|
+
margin: '0 4px',
|
|
128
|
+
fontSize: '13px'
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
const content = createElement('span', {
|
|
132
|
+
style: {
|
|
133
|
+
whiteSpace: 'pre-wrap',
|
|
134
|
+
display: 'inline-block'
|
|
135
|
+
},
|
|
136
|
+
contenteditable: 'true'
|
|
137
|
+
});
|
|
138
|
+
const before = createElement('span', {
|
|
139
|
+
innerText: `${funcName} `,
|
|
140
|
+
contenteditable: 'false',
|
|
141
|
+
className
|
|
142
|
+
});
|
|
143
|
+
const bracket = (value, style = {}) => {
|
|
144
|
+
return createElement('span', {
|
|
145
|
+
innerText: value,
|
|
146
|
+
contenteditable: 'false',
|
|
147
|
+
style: {
|
|
148
|
+
...style
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
};
|
|
152
|
+
container.append(before, bracket('(', { marginRight: '2px' }), content, bracket(')', { marginLeft: '2px' }));
|
|
153
|
+
return {
|
|
154
|
+
dom: container,
|
|
155
|
+
contentDOM: content
|
|
156
|
+
};
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* 校验公式的JSON表示是否有效
|
|
163
|
+
* @param formula 公式的JSON表示
|
|
164
|
+
* @returns 校验结果,包含是否有效和错误信息数组
|
|
165
|
+
*/
|
|
166
|
+
validateFormula(formula) {
|
|
167
|
+
const errors = [];
|
|
168
|
+
if (!formula) {
|
|
169
|
+
errors.push('公式不能为空');
|
|
170
|
+
return { isValid: false, errors };
|
|
171
|
+
}
|
|
172
|
+
if (formula.type !== 'doc') {
|
|
173
|
+
errors.push('公式根节点类型必须是 doc');
|
|
174
|
+
}
|
|
175
|
+
if (!formula.content || !Array.isArray(formula.content)) {
|
|
176
|
+
errors.push('公式必须包含 content 数组');
|
|
177
|
+
return { isValid: false, errors };
|
|
178
|
+
}
|
|
179
|
+
for (const paragraph of formula.content) {
|
|
180
|
+
if (paragraph.type !== 'paragraph') {
|
|
181
|
+
errors.push('段落类型必须是 paragraph');
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (!paragraph.content || !Array.isArray(paragraph.content)) {
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
for (const node of paragraph.content) {
|
|
188
|
+
this.validateNode(node, errors);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
isValid: errors.length === 0,
|
|
193
|
+
errors
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* 从JSON数据中提取内容文本或HTML
|
|
198
|
+
* @param jsonData 公式的JSON表示
|
|
199
|
+
* @param outputFormat 输出格式,'text'或'html',默认'text'
|
|
200
|
+
* @returns 提取的内容文本或HTML字符串
|
|
201
|
+
*/
|
|
202
|
+
getContentFromJson(jsonData, outputFormat = 'text') {
|
|
203
|
+
if (!jsonData || !jsonData.content)
|
|
204
|
+
return '';
|
|
205
|
+
return outputFormat === 'html'
|
|
206
|
+
? this.sanitizer.bypassSecurityTrustHtml(this.processContentToHtml(jsonData.content))
|
|
207
|
+
: this.processContent(jsonData.content);
|
|
208
|
+
}
|
|
209
|
+
processContent(content) {
|
|
210
|
+
if (!content || !Array.isArray(content))
|
|
211
|
+
return '';
|
|
212
|
+
return content.map(item => this.processNode(item)).join('');
|
|
213
|
+
}
|
|
214
|
+
processNode(node) {
|
|
215
|
+
if (!node)
|
|
216
|
+
return '';
|
|
217
|
+
switch (node.type) {
|
|
218
|
+
case 'func':
|
|
219
|
+
return this.processFuncNode(node);
|
|
220
|
+
case 'field':
|
|
221
|
+
return `{${node.attrs?.name || ''}}`;
|
|
222
|
+
case 'metric':
|
|
223
|
+
return `[${node.attrs?.name || ''}]`;
|
|
224
|
+
case 'text':
|
|
225
|
+
return node.text || '';
|
|
226
|
+
case 'paragraph':
|
|
227
|
+
return this.processContent(node.content);
|
|
228
|
+
case 'doc':
|
|
229
|
+
return this.processContent(node.content);
|
|
230
|
+
default:
|
|
231
|
+
return '';
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
processFuncNode(node) {
|
|
235
|
+
const funcName = node.attrs?.name || '';
|
|
236
|
+
const content = this.processContent(node.content);
|
|
237
|
+
return `${funcName}(${content})`;
|
|
238
|
+
}
|
|
239
|
+
processContentToHtml(content) {
|
|
240
|
+
if (!content || !Array.isArray(content))
|
|
241
|
+
return '';
|
|
242
|
+
return content.map(item => this.processNodeToHtml(item)).join('');
|
|
243
|
+
}
|
|
244
|
+
processNodeToHtml(node) {
|
|
245
|
+
if (!node)
|
|
246
|
+
return '';
|
|
247
|
+
switch (node.type) {
|
|
248
|
+
case 'func':
|
|
249
|
+
return this.processFuncNodeToHtml(node);
|
|
250
|
+
case 'field':
|
|
251
|
+
return `<span class="${node.attrs?.className || ''}" style="display: inline-block; margin: 0 4px;height: 18px;line-height: 18px;">${node.attrs?.name || ''}</span>`;
|
|
252
|
+
case 'text':
|
|
253
|
+
return this.escapeHtml(node.text || '');
|
|
254
|
+
case 'paragraph':
|
|
255
|
+
return this.processContentToHtml(node.content);
|
|
256
|
+
case 'doc':
|
|
257
|
+
return this.processContentToHtml(node.content);
|
|
258
|
+
default:
|
|
259
|
+
return '';
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
processFuncNodeToHtml(node) {
|
|
263
|
+
const funcName = node.attrs?.name || '';
|
|
264
|
+
const className = node.attrs?.className || '';
|
|
265
|
+
const content = this.processContentToHtml(node.content);
|
|
266
|
+
return `<span style="display: inline-block; margin: 0 4px;"><span contenteditable="false" class="${className}">${funcName}(</span><span style="white-space: pre-wrap; display: inline-block; margin: 0 4px;" contenteditable="true">${content}</span><span contenteditable="false" class="${className}">)</span></span>`;
|
|
267
|
+
}
|
|
268
|
+
escapeHtml(text) {
|
|
269
|
+
const div = document.createElement('div');
|
|
270
|
+
div.textContent = text;
|
|
271
|
+
return div.innerHTML;
|
|
272
|
+
}
|
|
273
|
+
validateNode(node, errors, path = '') {
|
|
274
|
+
if (!node || !node.type) {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
const currentPath = path ? `${path} > ${node.type}` : node.type;
|
|
278
|
+
if (node.type === 'func') {
|
|
279
|
+
this.validateFuncNode(node, errors, currentPath);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
validateFuncNode(node, errors, path) {
|
|
283
|
+
if (!node.content || !Array.isArray(node.content)) {
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
const content = node.content;
|
|
287
|
+
const length = content.length;
|
|
288
|
+
for (let i = 0; i < length; i++) {
|
|
289
|
+
const currentItem = content[i];
|
|
290
|
+
const nextItem = content[i + 1];
|
|
291
|
+
if (currentItem.type === 'field' || currentItem.type === 'func') {
|
|
292
|
+
if (i < length - 1) {
|
|
293
|
+
if (nextItem && nextItem.type === 'text') {
|
|
294
|
+
const text = nextItem.text || '';
|
|
295
|
+
if (!text.startsWith(',')) {
|
|
296
|
+
errors.push(`${path}: 参数之间必须用逗号分隔,位置 ${i + 1}`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
errors.push(`${path}: 参数之间必须用逗号分隔,位置 ${i + 1}`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
if (currentItem.type === 'func') {
|
|
305
|
+
this.validateFuncNode(currentItem, errors, `${path} > ${currentItem.attrs?.name || 'func'}`);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormulaEditorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
310
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormulaEditorService, providedIn: 'root' }); }
|
|
311
|
+
}
|
|
312
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormulaEditorService, decorators: [{
|
|
313
|
+
type: Injectable,
|
|
314
|
+
args: [{
|
|
315
|
+
providedIn: 'root'
|
|
316
|
+
}]
|
|
317
|
+
}] });
|
|
318
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXVsYS1lZGl0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvbXBvbmVudHMvZm9ybXVsYS1lZGl0b3IvZm9ybXVsYS1lZGl0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsWUFBWSxFQUFZLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxFQUFVLElBQUksRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBVTdELE1BQU0sT0FBTyxvQkFBb0I7SUFIakM7UUFJbUIsY0FBUyxHQUFpQixNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7S0FnVmpFO0lBM1VDLFNBQVM7UUFDUCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzNCLElBQUksRUFBRSxPQUFPO1lBQ2IsTUFBTSxFQUFFLElBQUk7WUFDWixLQUFLLEVBQUUsUUFBUTtZQUNmLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsSUFBSSxFQUFFLElBQUk7WUFDVixhQUFhO2dCQUNYLE9BQU87b0JBQ0wsRUFBRSxFQUFFO3dCQUNGLE9BQU8sRUFBRSxJQUFJO3FCQUNkO29CQUNELElBQUksRUFBRTt3QkFDSixPQUFPLEVBQUUsRUFBRTtxQkFDWjtvQkFDRCxTQUFTLEVBQUU7d0JBQ1QsT0FBTyxFQUFFLEVBQUU7cUJBQ1o7b0JBQ0QsUUFBUSxFQUFFO3dCQUNSLE9BQU8sRUFBRSxPQUFPO3FCQUNqQjtpQkFDRixDQUFDO1lBQ0osQ0FBQztZQUNELFVBQVUsQ0FBQyxFQUFFLElBQUksRUFBRTtnQkFDakIs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QUFDO1lBQ0gsQ0FBQztZQUVELElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLE1BQU0sV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQztZQUMvRixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7K0dBaFZVLG9CQUFvQjttSEFBcEIsb0JBQW9CLGNBRm5CLE1BQU07OzRGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBFZGl0b3IsIE5vZGUsIG1lcmdlQXR0cmlidXRlcyB9IGZyb20gJ0B0aXB0YXAvY29yZSc7XG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uUmVzdWx0IHtcbiAgaXNWYWxpZDogYm9vbGVhbjtcbiAgZXJyb3JzOiBzdHJpbmdbXTtcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRm9ybXVsYUVkaXRvclNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IHNhbml0aXplcjogRG9tU2FuaXRpemVyID0gaW5qZWN0KERvbVNhbml0aXplcik7XG4gIGZ1bmNOb2RlPzogTm9kZTtcbiAgZmllbGROb2RlPzogTm9kZTtcbiAgcGFyYW1Ob2RlPzogTm9kZTtcblxuICBpbml0Tm9kZXMoKSB7XG4gICAgdGhpcy5jcmVhdGVGdW5jTm9kZSgpO1xuICAgIHRoaXMuY3JlYXRlRmllbGROb2RlKCk7XG4gIH1cblxuICBjcmVhdGVGaWVsZE5vZGUoKSB7XG4gICAgdGhpcy5maWVsZE5vZGUgPSBOb2RlLmNyZWF0ZSh7XG4gICAgICBuYW1lOiAnZmllbGQnLFxuICAgICAgaW5saW5lOiB0cnVlLFxuICAgICAgZ3JvdXA6ICdpbmxpbmUnLFxuICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgICBkcmFnZ2FibGU6IHRydWUsXG4gICAgICBhdG9tOiB0cnVlLFxuICAgICAgYWRkQXR0cmlidXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDoge1xuICAgICAgICAgICAgZGVmYXVsdDogbnVsbFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmFtZToge1xuICAgICAgICAgICAgZGVmYXVsdDogJydcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNsYXNzTmFtZToge1xuICAgICAgICAgICAgZGVmYXVsdDogJydcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRhdGFUeXBlOiB7XG4gICAgICAgICAgICBkZWZhdWx0OiAnZmllbGQnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHJlbmRlclRleHQoeyBub2RlIH0pIHtcbiAgICAgICAgcmV0dXJuIGAke25vZGUuYXR0cnNbJ25hbWUnXX1gO1xuICAgICAgfSxcbiAgICAgIHBhcnNlSFRNTCgpIHtcbiAgICAgICAgcmV0dXJuIFt7IHRhZzogJ2RpdltkYXRhLXR5cGU9XCJmaWVsZFwiXScgfV07XG4gICAgICB9LFxuICAgICAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzLCBub2RlIH0pIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICBtZXJnZUF0dHJpYnV0ZXMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICdkYXRhLXR5cGUnOiAnZmllbGQnLFxuICAgICAgICAgICAgICBjbGFzczogYGZpZWxkLW5vZGUgJHtub2RlLmF0dHJzWydjbGFzc05hbWUnXX1gIHx8ICcnLFxuICAgICAgICAgICAgICBjb250ZW50ZWRpdGFibGU6ICdmYWxzZScsXG4gICAgICAgICAgICAgIHN0eWxlOiBgZGlzcGxheTogaW5saW5lLWJsb2NrO21hcmdpbjogMCA0cHg7Zm9udC1zaXplOiAxM3B4O2hlaWdodDogMThweDtsaW5lLWhlaWdodDogMThweDtgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgSFRNTEF0dHJpYnV0ZXNcbiAgICAgICAgICApLFxuICAgICAgICAgIG5vZGUuYXR0cnNbJ25hbWUnXVxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlRnVuY05vZGUoKSB7XG4gICAgdGhpcy5mdW5jTm9kZSA9IE5vZGUuY3JlYXRlKHtcbiAgICAgIG5hbWU6ICdmdW5jJyxcbiAgICAgIGlubGluZTogdHJ1ZSxcbiAgICAgIGdyb3VwOiAnaW5saW5lJyxcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgZHJhZ2dhYmxlOiBmYWxzZSxcbiAgICAgIGNvbnRlbnQ6ICdpbmxpbmUqJyxcbiAgICAgIGF0b206IHRydWUsXG4gICAgICBhZGRBdHRyaWJ1dGVzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlkOiB7XG4gICAgICAgICAgICBkZWZhdWx0OiBudWxsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBuYW1lOiB7XG4gICAgICAgICAgICBkZWZhdWx0OiAnJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY2xhc3NOYW1lOiB7XG4gICAgICAgICAgICBkZWZhdWx0OiAnJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZGF0YVR5cGU6IHtcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdmdW5jJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICByZW5kZXJUZXh0KHsgbm9kZSB9KSB7XG4gICAgICAgIGNvbnN0IGZ1bmNOYW1lID0gbm9kZS5hdHRyc1snbmFtZSddIHx8ICcnO1xuICAgICAgICBjb25zdCBjaGlsZHJlblRleHQgPSBub2RlLmNvbnRlbnQuY29udGVudFxuICAgICAgICAgIC5tYXAoY2hpbGQgPT4ge1xuICAgICAgICAgICAgaWYgKGNoaWxkLnRleHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLnRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hpbGQudHlwZSAmJiBjaGlsZC50eXBlLnNwZWMgJiYgY2hpbGQudHlwZS5zcGVjWyd0b1RleHQnXSkge1xuICAgICAgICAgICAgICByZXR1cm4gY2hpbGQudHlwZS5zcGVjWyd0b1RleHQnXSh7IG5vZGU6IGNoaWxkIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmpvaW4oJycpO1xuICAgICAgICByZXR1cm4gYCR7ZnVuY05hbWV9KCR7Y2hpbGRyZW5UZXh0fSlgO1xuICAgICAgfSxcbiAgICAgIHBhcnNlSFRNTCgpIHtcbiAgICAgICAgcmV0dXJuIFt7IHRhZzogJ2RpdltkYXRhLXR5cGU9XCJmdW5jXCJdJyB9XTtcbiAgICAgIH0sXG4gICAgICBhZGROb2RlVmlldygpIHtcbiAgICAgICAgcmV0dXJuICh7IG5vZGUgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZUVsZW1lbnQgPSAodGFnOiBzdHJpbmcsIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhwcm9wcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChrZXkgPT09ICdzdHlsZScpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyh2YWx1ZSkuZm9yRWFjaCgoW3N0eWxlS2V5LCBzdHlsZVZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgKGVsZW1lbnQuc3R5bGUgYXMgYW55KVtzdHlsZUtleV0gPSBzdHlsZVZhbHVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2lubmVyVGV4dCcpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmlubmVyVGV4dCA9IHZhbHVlO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2NsYXNzTmFtZScpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IHZhbHVlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBub2RlLmF0dHJzWydjbGFzc05hbWUnXSB8fCAnJztcbiAgICAgICAgICBjb25zdCBmdW5jTmFtZSA9IG5vZGUuYXR0cnNbJ25hbWUnXTtcblxuICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCB7XG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgICAgICAgbWFyZ2luOiAnMCA0cHgnLFxuICAgICAgICAgICAgICBmb250U2l6ZTogJzEzcHgnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gY3JlYXRlRWxlbWVudCgnc3BhbicsIHtcbiAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgIHdoaXRlU3BhY2U6ICdwcmUtd3JhcCcsXG4gICAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudGVkaXRhYmxlOiAndHJ1ZSdcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IGJlZm9yZSA9IGNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCB7XG4gICAgICAgICAgICBpbm5lclRleHQ6IGAke2Z1bmNOYW1lfSBgLFxuICAgICAgICAgICAgY29udGVudGVkaXRhYmxlOiAnZmFsc2UnLFxuICAgICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBicmFja2V0ID0gKHZhbHVlOiBzdHJpbmcsIHN0eWxlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KCdzcGFuJywge1xuICAgICAgICAgICAgICBpbm5lclRleHQ6IHZhbHVlLFxuICAgICAgICAgICAgICBjb250ZW50ZWRpdGFibGU6ICdmYWxzZScsXG4gICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgLi4uc3R5bGVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmQoYmVmb3JlLCBicmFja2V0KCcoJywgeyBtYXJnaW5SaWdodDogJzJweCcgfSksIGNvbnRlbnQsIGJyYWNrZXQoJyknLCB7IG1hcmdpbkxlZnQ6ICcycHgnIH0pKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb206IGNvbnRhaW5lcixcbiAgICAgICAgICAgIGNvbnRlbnRET006IGNvbnRlbnRcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOagoemqjOWFrOW8j+eahEpTT07ooajnpLrmmK/lkKbmnInmlYhcbiAgICogQHBhcmFtIGZvcm11bGEg5YWs5byP55qESlNPTuihqOekulxuICAgKiBAcmV0dXJucyDmoKHpqoznu5PmnpzvvIzljIXlkKvmmK/lkKbmnInmlYjlkozplJnor6/kv6Hmga/mlbDnu4RcbiAgICovXG4gIHB1YmxpYyB2YWxpZGF0ZUZvcm11bGEoZm9ybXVsYTogYW55KTogVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKCFmb3JtdWxhKSB7XG4gICAgICBlcnJvcnMucHVzaCgn5YWs5byP5LiN6IO95Li656m6Jyk7XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3JzIH07XG4gICAgfVxuXG4gICAgaWYgKGZvcm11bGEudHlwZSAhPT0gJ2RvYycpIHtcbiAgICAgIGVycm9ycy5wdXNoKCflhazlvI/moLnoioLngrnnsbvlnovlv4XpobvmmK8gZG9jJyk7XG4gICAgfVxuXG4gICAgaWYgKCFmb3JtdWxhLmNvbnRlbnQgfHwgIUFycmF5LmlzQXJyYXkoZm9ybXVsYS5jb250ZW50KSkge1xuICAgICAgZXJyb3JzLnB1c2goJ+WFrOW8j+W/hemhu+WMheWQqyBjb250ZW50IOaVsOe7hCcpO1xuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9ycyB9O1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGFyYWdyYXBoIG9mIGZvcm11bGEuY29udGVudCkge1xuICAgICAgaWYgKHBhcmFncmFwaC50eXBlICE9PSAncGFyYWdyYXBoJykge1xuICAgICAgICBlcnJvcnMucHVzaCgn5q616JC957G75Z6L5b+F6aG75pivIHBhcmFncmFwaCcpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFwYXJhZ3JhcGguY29udGVudCB8fCAhQXJyYXkuaXNBcnJheShwYXJhZ3JhcGguY29udGVudCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBwYXJhZ3JhcGguY29udGVudCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlTm9kZShub2RlLCBlcnJvcnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpc1ZhbGlkOiBlcnJvcnMubGVuZ3RoID09PSAwLFxuICAgICAgZXJyb3JzXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDku45KU09O5pWw5o2u5Lit5o+Q5Y+W5YaF5a655paH5pys5oiWSFRNTFxuICAgKiBAcGFyYW0ganNvbkRhdGEg5YWs5byP55qESlNPTuihqOekulxuICAgKiBAcGFyYW0gb3V0cHV0Rm9ybWF0IOi+k+WHuuagvOW8j++8jCd0ZXh0J+aIlidodG1sJ++8jOm7mOiupCd0ZXh0J1xuICAgKiBAcmV0dXJucyDmj5Dlj5bnmoTlhoXlrrnmlofmnKzmiJZIVE1M5a2X56ym5LiyXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29udGVudEZyb21Kc29uKGpzb25EYXRhOiBOelNhZmVBbnksIG91dHB1dEZvcm1hdDogJ3RleHQnIHwgJ2h0bWwnID0gJ3RleHQnKTogc3RyaW5nIHwgU2FmZUh0bWwge1xuICAgIGlmICghanNvbkRhdGEgfHwgIWpzb25EYXRhLmNvbnRlbnQpIHJldHVybiAnJztcbiAgICByZXR1cm4gb3V0cHV0Rm9ybWF0ID09PSAnaHRtbCdcbiAgICAgID8gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodGhpcy5wcm9jZXNzQ29udGVudFRvSHRtbChqc29uRGF0YS5jb250ZW50KSlcbiAgICAgIDogdGhpcy5wcm9jZXNzQ29udGVudChqc29uRGF0YS5jb250ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc0NvbnRlbnQoY29udGVudDogYW55W10pOiBzdHJpbmcge1xuICAgIGlmICghY29udGVudCB8fCAhQXJyYXkuaXNBcnJheShjb250ZW50KSkgcmV0dXJuICcnO1xuICAgIHJldHVybiBjb250ZW50Lm1hcChpdGVtID0+IHRoaXMucHJvY2Vzc05vZGUoaXRlbSkpLmpvaW4oJycpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzTm9kZShub2RlOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICghbm9kZSkgcmV0dXJuICcnO1xuXG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2Z1bmMnOlxuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRnVuY05vZGUobm9kZSk7XG4gICAgICBjYXNlICdmaWVsZCc6XG4gICAgICAgIHJldHVybiBgeyR7bm9kZS5hdHRycz8ubmFtZSB8fCAnJ319YDtcbiAgICAgIGNhc2UgJ21ldHJpYyc6XG4gICAgICAgIHJldHVybiBgWyR7bm9kZS5hdHRycz8ubmFtZSB8fCAnJ31dYDtcbiAgICAgIGNhc2UgJ3RleHQnOlxuICAgICAgICByZXR1cm4gbm9kZS50ZXh0IHx8ICcnO1xuICAgICAgY2FzZSAncGFyYWdyYXBoJzpcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0NvbnRlbnQobm9kZS5jb250ZW50KTtcbiAgICAgIGNhc2UgJ2RvYyc6XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NDb250ZW50KG5vZGUuY29udGVudCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzRnVuY05vZGUobm9kZTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBmdW5jTmFtZSA9IG5vZGUuYXR0cnM/Lm5hbWUgfHwgJyc7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMucHJvY2Vzc0NvbnRlbnQobm9kZS5jb250ZW50KTtcbiAgICByZXR1cm4gYCR7ZnVuY05hbWV9KCR7Y29udGVudH0pYDtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc0NvbnRlbnRUb0h0bWwoY29udGVudDogYW55W10pOiBzdHJpbmcge1xuICAgIGlmICghY29udGVudCB8fCAhQXJyYXkuaXNBcnJheShjb250ZW50KSkgcmV0dXJuICcnO1xuXG4gICAgcmV0dXJuIGNvbnRlbnQubWFwKGl0ZW0gPT4gdGhpcy5wcm9jZXNzTm9kZVRvSHRtbChpdGVtKSkuam9pbignJyk7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NOb2RlVG9IdG1sKG5vZGU6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFub2RlKSByZXR1cm4gJyc7XG5cbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAnZnVuYyc6XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NGdW5jTm9kZVRvSHRtbChub2RlKTtcbiAgICAgIGNhc2UgJ2ZpZWxkJzpcbiAgICAgICAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cIiR7bm9kZS5hdHRycz8uY2xhc3NOYW1lIHx8ICcnfVwiIHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWJsb2NrOyBtYXJnaW46IDAgNHB4O2hlaWdodDogMThweDtsaW5lLWhlaWdodDogMThweDtcIj4ke25vZGUuYXR0cnM/Lm5hbWUgfHwgJyd9PC9zcGFuPmA7XG4gICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXNjYXBlSHRtbChub2RlLnRleHQgfHwgJycpO1xuICAgICAgY2FzZSAncGFyYWdyYXBoJzpcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0NvbnRlbnRUb0h0bWwobm9kZS5jb250ZW50KTtcbiAgICAgIGNhc2UgJ2RvYyc6XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NDb250ZW50VG9IdG1sKG5vZGUuY29udGVudCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzRnVuY05vZGVUb0h0bWwobm9kZTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBmdW5jTmFtZSA9IG5vZGUuYXR0cnM/Lm5hbWUgfHwgJyc7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gbm9kZS5hdHRycz8uY2xhc3NOYW1lIHx8ICcnO1xuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLnByb2Nlc3NDb250ZW50VG9IdG1sKG5vZGUuY29udGVudCk7XG5cbiAgICByZXR1cm4gYDxzcGFuIHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWJsb2NrOyBtYXJnaW46IDAgNHB4O1wiPjxzcGFuIGNvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCIgY2xhc3M9XCIke2NsYXNzTmFtZX1cIj4ke2Z1bmNOYW1lfSg8L3NwYW4+PHNwYW4gc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgbWFyZ2luOiAwIDRweDtcIiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCI+JHtjb250ZW50fTwvc3Bhbj48c3BhbiBjb250ZW50ZWRpdGFibGU9XCJmYWxzZVwiIGNsYXNzPVwiJHtjbGFzc05hbWV9XCI+KTwvc3Bhbj48L3NwYW4+YDtcbiAgfVxuXG4gIHByaXZhdGUgZXNjYXBlSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlTm9kZShub2RlOiBhbnksIGVycm9yczogc3RyaW5nW10sIHBhdGg6IHN0cmluZyA9ICcnKTogdm9pZCB7XG4gICAgaWYgKCFub2RlIHx8ICFub2RlLnR5cGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50UGF0aCA9IHBhdGggPyBgJHtwYXRofSA+ICR7bm9kZS50eXBlfWAgOiBub2RlLnR5cGU7XG5cbiAgICBpZiAobm9kZS50eXBlID09PSAnZnVuYycpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVGdW5jTm9kZShub2RlLCBlcnJvcnMsIGN1cnJlbnRQYXRoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlRnVuY05vZGUobm9kZTogYW55LCBlcnJvcnM6IHN0cmluZ1tdLCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIW5vZGUuY29udGVudCB8fCAhQXJyYXkuaXNBcnJheShub2RlLmNvbnRlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudCA9IG5vZGUuY29udGVudDtcbiAgICBjb25zdCBsZW5ndGggPSBjb250ZW50Lmxlbmd0aDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gY29udGVudFtpXTtcbiAgICAgIGNvbnN0IG5leHRJdGVtID0gY29udGVudFtpICsgMV07XG5cbiAgICAgIGlmIChjdXJyZW50SXRlbS50eXBlID09PSAnZmllbGQnIHx8IGN1cnJlbnRJdGVtLnR5cGUgPT09ICdmdW5jJykge1xuICAgICAgICBpZiAoaSA8IGxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBpZiAobmV4dEl0ZW0gJiYgbmV4dEl0ZW0udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gbmV4dEl0ZW0udGV4dCB8fCAnJztcbiAgICAgICAgICAgIGlmICghdGV4dC5zdGFydHNXaXRoKCcsJykpIHtcbiAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYCR7cGF0aH06IOWPguaVsOS5i+mXtOW/hemhu+eUqOmAl+WPt+WIhumalO+8jOS9jee9riAke2kgKyAxfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChgJHtwYXRofTog5Y+C5pWw5LmL6Ze05b+F6aG755So6YCX5Y+35YiG6ZqU77yM5L2N572uICR7aSArIDF9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50SXRlbS50eXBlID09PSAnZnVuYycpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZUZ1bmNOb2RlKGN1cnJlbnRJdGVtLCBlcnJvcnMsIGAke3BhdGh9ID4gJHtjdXJyZW50SXRlbS5hdHRycz8ubmFtZSB8fCAnZnVuYyd9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './formula-editor.component';
|
|
2
|
+
export * from './formula-editor.model';
|
|
3
|
+
export * from './formula-editor-request.service';
|
|
4
|
+
export * from './formula-editor.service';
|
|
5
|
+
export * from './formula-editor-icon';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb21wb25lbnRzL2Zvcm11bGEtZWRpdG9yL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyx1QkFBdUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZm9ybXVsYS1lZGl0b3IuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vZm9ybXVsYS1lZGl0b3IubW9kZWwnO1xuZXhwb3J0ICogZnJvbSAnLi9mb3JtdWxhLWVkaXRvci1yZXF1ZXN0LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9mb3JtdWxhLWVkaXRvci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vZm9ybXVsYS1lZGl0b3ItaWNvbic7XG4iXX0=
|