@pie-lib/editable-html 13.0.14-beta.6 → 13.0.14-beta.8
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/lib/__tests__/editor-utils.test.js +164 -0
- package/lib/__tests__/serialization.test.js +241 -0
- package/lib/__tests__/utils.js +79 -0
- package/lib/plugins/image/__tests__/component.test.js +96 -0
- package/lib/plugins/image/__tests__/image-toolbar-logic.test.js +131 -0
- package/lib/plugins/image/__tests__/image-toolbar.test.js +21 -0
- package/lib/plugins/image/__tests__/index.test.js +86 -0
- package/lib/plugins/image/__tests__/insert-image-handler.test.js +112 -0
- package/lib/plugins/image/__tests__/mock-change.js +22 -0
- package/lib/plugins/list/__tests__/index.test.js +63 -0
- package/lib/plugins/math/__tests__/index.test.js +284 -0
- package/lib/plugins/media/__tests__/index.test.js +69 -0
- package/lib/plugins/respArea/drag-in-the-blank/__tests__/choice.test.js +93 -0
- package/lib/plugins/table/__tests__/index.test.js +416 -0
- package/lib/plugins/table/__tests__/table-toolbar.test.js +81 -0
- package/lib/plugins/toolbar/__tests__/default-toolbar.test.js +153 -0
- package/lib/plugins/toolbar/__tests__/editor-and-toolbar.test.js +47 -0
- package/lib/plugins/toolbar/__tests__/toolbar-buttons.test.js +112 -0
- package/lib/plugins/toolbar/__tests__/toolbar.test.js +118 -0
- package/package.json +3 -3
- package/src/__tests__/editor-utils.test.js +162 -0
- package/src/__tests__/serialization.test.js +290 -0
- package/src/__tests__/utils.js +36 -0
- package/src/plugins/image/__tests__/component.test.jsx +73 -0
- package/src/plugins/image/__tests__/image-toolbar-logic.test.jsx +90 -0
- package/src/plugins/image/__tests__/image-toolbar.test.jsx +12 -0
- package/src/plugins/image/__tests__/index.test.js +92 -0
- package/src/plugins/image/__tests__/insert-image-handler.test.js +113 -0
- package/src/plugins/image/__tests__/mock-change.js +15 -0
- package/src/plugins/list/__tests__/index.test.js +52 -0
- package/src/plugins/math/__tests__/index.test.jsx +264 -0
- package/src/plugins/media/__tests__/index.test.js +75 -0
- package/src/plugins/respArea/drag-in-the-blank/__tests__/choice.test.js +71 -0
- package/src/plugins/table/__tests__/index.test.jsx +401 -0
- package/src/plugins/table/__tests__/table-toolbar.test.jsx +75 -0
- package/src/plugins/toolbar/__tests__/default-toolbar.test.jsx +123 -0
- package/src/plugins/toolbar/__tests__/editor-and-toolbar.test.jsx +40 -0
- package/src/plugins/toolbar/__tests__/toolbar-buttons.test.jsx +97 -0
- package/src/plugins/toolbar/__tests__/toolbar.test.jsx +112 -0
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
var _slateEditTable = _interopRequireDefault(require("slate-edit-table"));
|
|
6
|
+
var _index = _interopRequireWildcard(require("../index"));
|
|
7
|
+
var _slate = require("slate");
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
10
|
+
jest.mock('slate-edit-table', function () {
|
|
11
|
+
var mock = {
|
|
12
|
+
"default": jest.fn().mockReturnThis(),
|
|
13
|
+
utils: {
|
|
14
|
+
isSelectionInTable: jest.fn().mockReturnValue(true),
|
|
15
|
+
createTable: jest.fn(function (c) {
|
|
16
|
+
return {
|
|
17
|
+
toJSON: jest.fn().mockReturnValue({
|
|
18
|
+
object: 'block',
|
|
19
|
+
type: 'table'
|
|
20
|
+
})
|
|
21
|
+
};
|
|
22
|
+
})
|
|
23
|
+
},
|
|
24
|
+
changes: {
|
|
25
|
+
insertTable: jest.fn(function (c) {
|
|
26
|
+
return c;
|
|
27
|
+
})
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
return jest.fn().mockReturnValue(mock);
|
|
31
|
+
});
|
|
32
|
+
describe('table', function () {
|
|
33
|
+
describe('toolbar', function () {
|
|
34
|
+
describe('onClick', function () {
|
|
35
|
+
var plugin;
|
|
36
|
+
var onChange;
|
|
37
|
+
var findDescendant;
|
|
38
|
+
var insertBlock;
|
|
39
|
+
var changeMock;
|
|
40
|
+
beforeEach(function () {
|
|
41
|
+
plugin = (0, _index["default"])();
|
|
42
|
+
onChange = jest.fn();
|
|
43
|
+
insertBlock = jest.fn();
|
|
44
|
+
findDescendant = jest.fn();
|
|
45
|
+
changeMock = jest.fn().mockReturnValue({
|
|
46
|
+
insertBlock: insertBlock,
|
|
47
|
+
value: {
|
|
48
|
+
document: {
|
|
49
|
+
findDescendant: findDescendant
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
it('calls utils.createTable', function () {
|
|
55
|
+
plugin.toolbar.onClick({
|
|
56
|
+
change: changeMock
|
|
57
|
+
}, onChange);
|
|
58
|
+
expect((0, _slateEditTable["default"])().utils.createTable).toHaveBeenCalledWith(2, 2);
|
|
59
|
+
});
|
|
60
|
+
it('creates table with border: 1 as default', function () {
|
|
61
|
+
plugin.toolbar.onClick({
|
|
62
|
+
change: changeMock
|
|
63
|
+
}, onChange);
|
|
64
|
+
expect(insertBlock).toHaveBeenCalledWith(_slate.Block.create({
|
|
65
|
+
key: '2',
|
|
66
|
+
type: 'table',
|
|
67
|
+
data: {
|
|
68
|
+
border: '1',
|
|
69
|
+
newTable: true
|
|
70
|
+
}
|
|
71
|
+
}));
|
|
72
|
+
});
|
|
73
|
+
it('moves cursor to first cell of the table and removes the newTable property', function () {
|
|
74
|
+
var dataRemoveFn = jest.fn().mockReturnValue({
|
|
75
|
+
border: '1'
|
|
76
|
+
});
|
|
77
|
+
var setNodeByKey = jest.fn();
|
|
78
|
+
var newTableBlock = {
|
|
79
|
+
key: '2',
|
|
80
|
+
data: {
|
|
81
|
+
remove: dataRemoveFn
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
var collapseToStartOf = jest.fn();
|
|
85
|
+
changeMock = jest.fn().mockReturnValue({
|
|
86
|
+
insertBlock: insertBlock,
|
|
87
|
+
collapseToStartOf: collapseToStartOf,
|
|
88
|
+
setNodeByKey: setNodeByKey,
|
|
89
|
+
value: {
|
|
90
|
+
document: {
|
|
91
|
+
findDescendant: jest.fn().mockReturnValue(newTableBlock)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
plugin.toolbar.onClick({
|
|
96
|
+
change: changeMock
|
|
97
|
+
}, onChange);
|
|
98
|
+
expect(collapseToStartOf).toHaveBeenCalledWith(newTableBlock);
|
|
99
|
+
expect(dataRemoveFn).toHaveBeenCalledWith('newTable');
|
|
100
|
+
expect(setNodeByKey).toHaveBeenCalledWith('2', {
|
|
101
|
+
data: {
|
|
102
|
+
border: '1'
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
describe('supports', function () {
|
|
108
|
+
var assertSupports = function assertSupports(inTable, object, expected) {
|
|
109
|
+
it("inTable: ".concat(inTable, ", type: ").concat(object, " => ").concat(expected), function () {
|
|
110
|
+
(0, _slateEditTable["default"])().utils.isSelectionInTable.mockReturnValue(inTable);
|
|
111
|
+
var plugin = (0, _index["default"])();
|
|
112
|
+
var supports = plugin.toolbar.supports({
|
|
113
|
+
object: object
|
|
114
|
+
});
|
|
115
|
+
expect(supports).toEqual(expected);
|
|
116
|
+
});
|
|
117
|
+
};
|
|
118
|
+
assertSupports(true, 'block', true);
|
|
119
|
+
assertSupports(false, 'block', false);
|
|
120
|
+
assertSupports(true, 'inline', false);
|
|
121
|
+
assertSupports(false, 'inline', false);
|
|
122
|
+
});
|
|
123
|
+
describe('customToolbar', function () {
|
|
124
|
+
describe('toggleBorder', function () {
|
|
125
|
+
var assertToggle = function assertToggle(border, expectedBorder) {
|
|
126
|
+
describe("with initial border of ".concat(border), function () {
|
|
127
|
+
var change;
|
|
128
|
+
var done;
|
|
129
|
+
beforeEach(function () {
|
|
130
|
+
var plugin = (0, _index["default"])();
|
|
131
|
+
change = {
|
|
132
|
+
setNodeByKey: jest.fn().mockReturnThis()
|
|
133
|
+
};
|
|
134
|
+
plugin.utils.getTableBlock = jest.fn().mockReturnValue({
|
|
135
|
+
key: 'tableKey',
|
|
136
|
+
data: _slate.Data.create({
|
|
137
|
+
border: border
|
|
138
|
+
})
|
|
139
|
+
});
|
|
140
|
+
var node = {
|
|
141
|
+
key: 'nodeKey'
|
|
142
|
+
};
|
|
143
|
+
var value = {
|
|
144
|
+
change: jest.fn().mockReturnValue(change)
|
|
145
|
+
};
|
|
146
|
+
done = jest.fn();
|
|
147
|
+
var Comp = plugin.toolbar.customToolbar(node, value, done);
|
|
148
|
+
var c = Comp();
|
|
149
|
+
c.props.onToggleBorder();
|
|
150
|
+
});
|
|
151
|
+
it("calls setNodeByKey with ".concat(expectedBorder), function () {
|
|
152
|
+
expect(change.setNodeByKey).toHaveBeenCalledWith('tableKey', {
|
|
153
|
+
data: _slate.Data.create({
|
|
154
|
+
border: expectedBorder
|
|
155
|
+
})
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
it('calls onToolbarDone', function () {
|
|
159
|
+
expect(done).toHaveBeenCalledWith(change, false);
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
};
|
|
163
|
+
assertToggle(null, '1');
|
|
164
|
+
assertToggle(undefined, '1');
|
|
165
|
+
assertToggle('0', '1');
|
|
166
|
+
assertToggle('1', '0');
|
|
167
|
+
assertToggle('2', '0');
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe('normalizeNode', function () {
|
|
171
|
+
it('should exit the function if the node is not of type document', function () {
|
|
172
|
+
var tablePlugin = (0, _index["default"])();
|
|
173
|
+
var returnValue = tablePlugin.normalizeNode({
|
|
174
|
+
object: 'table'
|
|
175
|
+
});
|
|
176
|
+
expect(returnValue).toEqual(undefined);
|
|
177
|
+
});
|
|
178
|
+
it('should exit there are no changes needed', function () {
|
|
179
|
+
var tablePlugin = (0, _index["default"])();
|
|
180
|
+
var nodes = {
|
|
181
|
+
size: 3,
|
|
182
|
+
findLastIndex: jest.fn().mockReturnValue(1)
|
|
183
|
+
};
|
|
184
|
+
var returnValue = tablePlugin.normalizeNode({
|
|
185
|
+
object: 'document',
|
|
186
|
+
nodes: nodes,
|
|
187
|
+
findDescendant: jest.fn().mockReturnValue({
|
|
188
|
+
object: 'block',
|
|
189
|
+
type: 'table'
|
|
190
|
+
}),
|
|
191
|
+
getParent: jest.fn().mockReturnValue(undefined)
|
|
192
|
+
});
|
|
193
|
+
expect(returnValue).toEqual(undefined);
|
|
194
|
+
});
|
|
195
|
+
it('should return a function if a table does not have a node before or after it', function () {
|
|
196
|
+
var tablePlugin = (0, _index["default"])();
|
|
197
|
+
var nodes = [{
|
|
198
|
+
object: 'block',
|
|
199
|
+
type: 'table',
|
|
200
|
+
key: '99',
|
|
201
|
+
data: _slate.Data.create({
|
|
202
|
+
newTable: true
|
|
203
|
+
})
|
|
204
|
+
}];
|
|
205
|
+
var findDescendant = jest.fn(function (callback) {
|
|
206
|
+
nodes.forEach(function (n) {
|
|
207
|
+
return callback(n);
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
var change = {
|
|
211
|
+
insertNodeByPath: jest.fn(),
|
|
212
|
+
value: {
|
|
213
|
+
document: {
|
|
214
|
+
getPath: jest.fn().mockReturnValue(_slate.PathUtils.create([0, 0]))
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
var returnValue = tablePlugin.normalizeNode({
|
|
219
|
+
object: 'document',
|
|
220
|
+
findDescendant: findDescendant,
|
|
221
|
+
getPath: jest.fn().mockReturnValue(_slate.PathUtils.create([0, 0])),
|
|
222
|
+
getPreviousNode: jest.fn().mockReturnValue(undefined),
|
|
223
|
+
getNextNode: jest.fn().mockReturnValue(undefined)
|
|
224
|
+
});
|
|
225
|
+
expect(returnValue).toEqual(expect.any(Function));
|
|
226
|
+
returnValue(change);
|
|
227
|
+
expect(change.insertNodeByPath).toHaveBeenCalledWith([0], 0, {
|
|
228
|
+
object: 'block',
|
|
229
|
+
type: 'div'
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
describe('parseStyleString', function () {
|
|
236
|
+
var parses = function parses(s, expected) {
|
|
237
|
+
it("parses ".concat(s, " -> ").concat(JSON.stringify(expected)), function () {
|
|
238
|
+
var result = (0, _index.parseStyleString)(s);
|
|
239
|
+
expect(result).toEqual(expected);
|
|
240
|
+
});
|
|
241
|
+
};
|
|
242
|
+
parses(' width: 10px ', {
|
|
243
|
+
width: '10px'
|
|
244
|
+
});
|
|
245
|
+
parses(' width: 10px; ', {
|
|
246
|
+
width: '10px'
|
|
247
|
+
});
|
|
248
|
+
parses(' border-width: 10px; ', {
|
|
249
|
+
'border-width': '10px'
|
|
250
|
+
});
|
|
251
|
+
parses(' border: solid 1px red; height: 1px', {
|
|
252
|
+
border: 'solid 1px red',
|
|
253
|
+
height: '1px'
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
describe('toStyleString', function () {
|
|
257
|
+
var styleString = function styleString(o, expected) {
|
|
258
|
+
it("".concat(JSON.stringify(s), " -> ").concat(expected), function () {
|
|
259
|
+
var result = toStyleString(o);
|
|
260
|
+
expect(result).toEqual(expected);
|
|
261
|
+
});
|
|
262
|
+
};
|
|
263
|
+
});
|
|
264
|
+
describe('reactAttributes', function () {
|
|
265
|
+
var attributes = function attributes(o, expected) {
|
|
266
|
+
it("".concat(JSON.stringify(o), " -> ").concat(JSON.stringify(expected)), function () {
|
|
267
|
+
var result = (0, _index.reactAttributes)(o);
|
|
268
|
+
expect(result).toEqual(expected);
|
|
269
|
+
});
|
|
270
|
+
};
|
|
271
|
+
attributes({
|
|
272
|
+
'border-width': '10px',
|
|
273
|
+
'line-height': 1.56
|
|
274
|
+
}, {
|
|
275
|
+
borderWidth: '10px',
|
|
276
|
+
lineHeight: '1.56'
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
describe('serialization', function () {
|
|
280
|
+
describe('deserialize', function () {
|
|
281
|
+
var next;
|
|
282
|
+
beforeEach(function () {
|
|
283
|
+
next = jest.fn().mockReturnValue([]);
|
|
284
|
+
});
|
|
285
|
+
describe('table', function () {
|
|
286
|
+
var el;
|
|
287
|
+
var out;
|
|
288
|
+
beforeEach(function () {
|
|
289
|
+
el = {
|
|
290
|
+
tagName: 'table',
|
|
291
|
+
children: [],
|
|
292
|
+
getAttribute: jest.fn(function (name) {
|
|
293
|
+
switch (name) {
|
|
294
|
+
case 'border':
|
|
295
|
+
return '1';
|
|
296
|
+
case 'cellspacing':
|
|
297
|
+
return '2';
|
|
298
|
+
case 'cellpadding':
|
|
299
|
+
return '3';
|
|
300
|
+
case 'class':
|
|
301
|
+
return 'table-class';
|
|
302
|
+
case 'style':
|
|
303
|
+
return 'width: 10px';
|
|
304
|
+
}
|
|
305
|
+
})
|
|
306
|
+
};
|
|
307
|
+
out = _index.serialization.deserialize(el, next);
|
|
308
|
+
});
|
|
309
|
+
var assertData = function assertData(name, value) {
|
|
310
|
+
it("data.".concat(name, " should eql ").concat(value), function () {
|
|
311
|
+
expect(out.data[name]).toEqual(value);
|
|
312
|
+
});
|
|
313
|
+
};
|
|
314
|
+
assertData('border', '1');
|
|
315
|
+
assertData('cellspacing', '2');
|
|
316
|
+
assertData('cellpadding', '3');
|
|
317
|
+
assertData('class', 'table-class');
|
|
318
|
+
assertData('style', {
|
|
319
|
+
width: '10px'
|
|
320
|
+
});
|
|
321
|
+
it('returns a table block', function () {
|
|
322
|
+
expect(out).toMatchObject({
|
|
323
|
+
object: 'block',
|
|
324
|
+
type: 'table',
|
|
325
|
+
nodes: []
|
|
326
|
+
});
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
it('deserializes tr', function () {
|
|
330
|
+
var el = {
|
|
331
|
+
tagName: 'tr',
|
|
332
|
+
children: []
|
|
333
|
+
};
|
|
334
|
+
var out = _index.serialization.deserialize(el, next);
|
|
335
|
+
expect(out).toEqual({
|
|
336
|
+
object: 'block',
|
|
337
|
+
type: 'table_row',
|
|
338
|
+
nodes: []
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
it('deserializes td', function () {
|
|
342
|
+
var el = {
|
|
343
|
+
tagName: 'td',
|
|
344
|
+
childNodes: [],
|
|
345
|
+
getAttribute: jest.fn(function (name) {
|
|
346
|
+
var o = {
|
|
347
|
+
"class": 'class name',
|
|
348
|
+
colspan: '1',
|
|
349
|
+
rowspan: '1'
|
|
350
|
+
};
|
|
351
|
+
return o[name];
|
|
352
|
+
})
|
|
353
|
+
};
|
|
354
|
+
var out = _index.serialization.deserialize(el, next);
|
|
355
|
+
expect(out).toEqual({
|
|
356
|
+
object: 'block',
|
|
357
|
+
type: 'table_cell',
|
|
358
|
+
nodes: [],
|
|
359
|
+
data: {
|
|
360
|
+
colspan: '1',
|
|
361
|
+
rowspan: '1',
|
|
362
|
+
"class": 'class name',
|
|
363
|
+
header: false
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
});
|
|
368
|
+
describe('serialize', function () {
|
|
369
|
+
it('serializes table', function () {
|
|
370
|
+
var el = _index.serialization.serialize({
|
|
371
|
+
object: 'block',
|
|
372
|
+
type: 'table',
|
|
373
|
+
nodes: [],
|
|
374
|
+
data: _slate.Data.create({
|
|
375
|
+
border: '1',
|
|
376
|
+
cellpadding: '2',
|
|
377
|
+
cellspacing: '3'
|
|
378
|
+
})
|
|
379
|
+
});
|
|
380
|
+
expect(el).toEqual(/*#__PURE__*/_react["default"].createElement("table", {
|
|
381
|
+
border: "1",
|
|
382
|
+
cellPadding: "2",
|
|
383
|
+
cellSpacing: "3"
|
|
384
|
+
}, /*#__PURE__*/_react["default"].createElement("tbody", null)));
|
|
385
|
+
});
|
|
386
|
+
it('serializes table_row', function () {
|
|
387
|
+
var el = _index.serialization.serialize({
|
|
388
|
+
object: 'block',
|
|
389
|
+
type: 'table_row',
|
|
390
|
+
nodes: []
|
|
391
|
+
});
|
|
392
|
+
expect(el).toEqual(/*#__PURE__*/_react["default"].createElement("tr", null));
|
|
393
|
+
});
|
|
394
|
+
it('serializes table_cell', function () {
|
|
395
|
+
var el = _index.serialization.serialize({
|
|
396
|
+
object: 'block',
|
|
397
|
+
type: 'table_cell',
|
|
398
|
+
nodes: [],
|
|
399
|
+
data: _slate.Data.create({
|
|
400
|
+
header: false,
|
|
401
|
+
style: {
|
|
402
|
+
width: '10px'
|
|
403
|
+
},
|
|
404
|
+
"class": 'foo'
|
|
405
|
+
})
|
|
406
|
+
});
|
|
407
|
+
expect(el).toEqual(/*#__PURE__*/_react["default"].createElement("td", {
|
|
408
|
+
style: {
|
|
409
|
+
width: '10px'
|
|
410
|
+
},
|
|
411
|
+
className: 'foo'
|
|
412
|
+
}));
|
|
413
|
+
});
|
|
414
|
+
});
|
|
415
|
+
});
|
|
416
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc2xhdGVFZGl0VGFibGUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9pbmRleCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX3NsYXRlIiwiX3JlYWN0IiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiX3R5cGVvZiIsImhhcyIsImdldCIsInNldCIsIl90IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJqZXN0IiwibW9jayIsImZuIiwibW9ja1JldHVyblRoaXMiLCJ1dGlscyIsImlzU2VsZWN0aW9uSW5UYWJsZSIsIm1vY2tSZXR1cm5WYWx1ZSIsImNyZWF0ZVRhYmxlIiwiYyIsInRvSlNPTiIsIm9iamVjdCIsInR5cGUiLCJjaGFuZ2VzIiwiaW5zZXJ0VGFibGUiLCJkZXNjcmliZSIsInBsdWdpbiIsIm9uQ2hhbmdlIiwiZmluZERlc2NlbmRhbnQiLCJpbnNlcnRCbG9jayIsImNoYW5nZU1vY2siLCJiZWZvcmVFYWNoIiwiVGFibGVQbHVnaW4iLCJ2YWx1ZSIsImRvY3VtZW50IiwiaXQiLCJ0b29sYmFyIiwib25DbGljayIsImNoYW5nZSIsImV4cGVjdCIsIkVkaXRUYWJsZSIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwiQmxvY2siLCJjcmVhdGUiLCJrZXkiLCJkYXRhIiwiYm9yZGVyIiwibmV3VGFibGUiLCJkYXRhUmVtb3ZlRm4iLCJzZXROb2RlQnlLZXkiLCJuZXdUYWJsZUJsb2NrIiwicmVtb3ZlIiwiY29sbGFwc2VUb1N0YXJ0T2YiLCJhc3NlcnRTdXBwb3J0cyIsImluVGFibGUiLCJleHBlY3RlZCIsImNvbmNhdCIsInN1cHBvcnRzIiwidG9FcXVhbCIsImFzc2VydFRvZ2dsZSIsImV4cGVjdGVkQm9yZGVyIiwiZG9uZSIsImdldFRhYmxlQmxvY2siLCJEYXRhIiwibm9kZSIsIkNvbXAiLCJjdXN0b21Ub29sYmFyIiwicHJvcHMiLCJvblRvZ2dsZUJvcmRlciIsInVuZGVmaW5lZCIsInRhYmxlUGx1Z2luIiwicmV0dXJuVmFsdWUiLCJub3JtYWxpemVOb2RlIiwibm9kZXMiLCJzaXplIiwiZmluZExhc3RJbmRleCIsImdldFBhcmVudCIsImNhbGxiYWNrIiwiZm9yRWFjaCIsImluc2VydE5vZGVCeVBhdGgiLCJnZXRQYXRoIiwiUGF0aFV0aWxzIiwiZ2V0UHJldmlvdXNOb2RlIiwiZ2V0TmV4dE5vZGUiLCJhbnkiLCJGdW5jdGlvbiIsInBhcnNlcyIsInMiLCJKU09OIiwic3RyaW5naWZ5IiwicmVzdWx0IiwicGFyc2VTdHlsZVN0cmluZyIsIndpZHRoIiwiaGVpZ2h0Iiwic3R5bGVTdHJpbmciLCJ0b1N0eWxlU3RyaW5nIiwiYXR0cmlidXRlcyIsInJlYWN0QXR0cmlidXRlcyIsImJvcmRlcldpZHRoIiwibGluZUhlaWdodCIsIm5leHQiLCJlbCIsIm91dCIsInRhZ05hbWUiLCJjaGlsZHJlbiIsImdldEF0dHJpYnV0ZSIsIm5hbWUiLCJzZXJpYWxpemF0aW9uIiwiZGVzZXJpYWxpemUiLCJhc3NlcnREYXRhIiwidG9NYXRjaE9iamVjdCIsImNoaWxkTm9kZXMiLCJjb2xzcGFuIiwicm93c3BhbiIsImhlYWRlciIsInNlcmlhbGl6ZSIsImNlbGxwYWRkaW5nIiwiY2VsbHNwYWNpbmciLCJjcmVhdGVFbGVtZW50IiwiY2VsbFBhZGRpbmciLCJjZWxsU3BhY2luZyIsInN0eWxlIiwiY2xhc3NOYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BsdWdpbnMvdGFibGUvX190ZXN0c19fL2luZGV4LnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFZGl0VGFibGUgZnJvbSAnc2xhdGUtZWRpdC10YWJsZSc7XG5pbXBvcnQgVGFibGVQbHVnaW4sIHsgcGFyc2VTdHlsZVN0cmluZywgcmVhY3RBdHRyaWJ1dGVzLCBzZXJpYWxpemF0aW9uIH0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgQmxvY2ssIERhdGEsIFBhdGhVdGlscyB9IGZyb20gJ3NsYXRlJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmplc3QubW9jaygnc2xhdGUtZWRpdC10YWJsZScsICgpID0+IHtcbiAgY29uc3QgbW9jayA9IHtcbiAgICBkZWZhdWx0OiBqZXN0LmZuKCkubW9ja1JldHVyblRoaXMoKSxcbiAgICB1dGlsczoge1xuICAgICAgaXNTZWxlY3Rpb25JblRhYmxlOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHRydWUpLFxuICAgICAgY3JlYXRlVGFibGU6IGplc3QuZm4oZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0b0pTT046IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoeyBvYmplY3Q6ICdibG9jaycsIHR5cGU6ICd0YWJsZScgfSksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9LFxuICAgIGNoYW5nZXM6IHtcbiAgICAgIGluc2VydFRhYmxlOiBqZXN0LmZuKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfSksXG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShtb2NrKTtcbn0pO1xuXG5kZXNjcmliZSgndGFibGUnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCd0b29sYmFyJywgKCkgPT4ge1xuICAgIGRlc2NyaWJlKCdvbkNsaWNrJywgKCkgPT4ge1xuICAgICAgbGV0IHBsdWdpbjtcbiAgICAgIGxldCBvbkNoYW5nZTtcbiAgICAgIGxldCBmaW5kRGVzY2VuZGFudDtcbiAgICAgIGxldCBpbnNlcnRCbG9jaztcbiAgICAgIGxldCBjaGFuZ2VNb2NrO1xuXG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgcGx1Z2luID0gVGFibGVQbHVnaW4oKTtcbiAgICAgICAgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICAgIGluc2VydEJsb2NrID0gamVzdC5mbigpO1xuICAgICAgICBmaW5kRGVzY2VuZGFudCA9IGplc3QuZm4oKTtcbiAgICAgICAgY2hhbmdlTW9jayA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoe1xuICAgICAgICAgIGluc2VydEJsb2NrLFxuICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICBkb2N1bWVudDoge1xuICAgICAgICAgICAgICBmaW5kRGVzY2VuZGFudCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NhbGxzIHV0aWxzLmNyZWF0ZVRhYmxlJywgKCkgPT4ge1xuICAgICAgICBwbHVnaW4udG9vbGJhci5vbkNsaWNrKHsgY2hhbmdlOiBjaGFuZ2VNb2NrIH0sIG9uQ2hhbmdlKTtcblxuICAgICAgICBleHBlY3QoRWRpdFRhYmxlKCkudXRpbHMuY3JlYXRlVGFibGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDIsIDIpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdjcmVhdGVzIHRhYmxlIHdpdGggYm9yZGVyOiAxIGFzIGRlZmF1bHQnLCAoKSA9PiB7XG4gICAgICAgIHBsdWdpbi50b29sYmFyLm9uQ2xpY2soeyBjaGFuZ2U6IGNoYW5nZU1vY2sgfSwgb25DaGFuZ2UpO1xuXG4gICAgICAgIGV4cGVjdChpbnNlcnRCbG9jaykudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICAgQmxvY2suY3JlYXRlKHsga2V5OiAnMicsIHR5cGU6ICd0YWJsZScsIGRhdGE6IHsgYm9yZGVyOiAnMScsIG5ld1RhYmxlOiB0cnVlIH0gfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ21vdmVzIGN1cnNvciB0byBmaXJzdCBjZWxsIG9mIHRoZSB0YWJsZSBhbmQgcmVtb3ZlcyB0aGUgbmV3VGFibGUgcHJvcGVydHknLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGFSZW1vdmVGbiA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoeyBib3JkZXI6ICcxJyB9KTtcbiAgICAgICAgY29uc3Qgc2V0Tm9kZUJ5S2V5ID0gamVzdC5mbigpO1xuICAgICAgICBjb25zdCBuZXdUYWJsZUJsb2NrID0ge1xuICAgICAgICAgIGtleTogJzInLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHJlbW92ZTogZGF0YVJlbW92ZUZuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNvbGxhcHNlVG9TdGFydE9mID0gamVzdC5mbigpO1xuXG4gICAgICAgIGNoYW5nZU1vY2sgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHtcbiAgICAgICAgICBpbnNlcnRCbG9jayxcbiAgICAgICAgICBjb2xsYXBzZVRvU3RhcnRPZixcbiAgICAgICAgICBzZXROb2RlQnlLZXksXG4gICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgIGRvY3VtZW50OiB7XG4gICAgICAgICAgICAgIGZpbmREZXNjZW5kYW50OiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKG5ld1RhYmxlQmxvY2spLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcGx1Z2luLnRvb2xiYXIub25DbGljayh7IGNoYW5nZTogY2hhbmdlTW9jayB9LCBvbkNoYW5nZSk7XG5cbiAgICAgICAgZXhwZWN0KGNvbGxhcHNlVG9TdGFydE9mKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChuZXdUYWJsZUJsb2NrKTtcbiAgICAgICAgZXhwZWN0KGRhdGFSZW1vdmVGbikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ25ld1RhYmxlJyk7XG4gICAgICAgIGV4cGVjdChzZXROb2RlQnlLZXkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCcyJywgeyBkYXRhOiB7IGJvcmRlcjogJzEnIH0gfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzdXBwb3J0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGFzc2VydFN1cHBvcnRzID0gKGluVGFibGUsIG9iamVjdCwgZXhwZWN0ZWQpID0+IHtcbiAgICAgICAgaXQoYGluVGFibGU6ICR7aW5UYWJsZX0sIHR5cGU6ICR7b2JqZWN0fSA9PiAke2V4cGVjdGVkfWAsICgpID0+IHtcbiAgICAgICAgICBFZGl0VGFibGUoKS51dGlscy5pc1NlbGVjdGlvbkluVGFibGUubW9ja1JldHVyblZhbHVlKGluVGFibGUpO1xuICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IFRhYmxlUGx1Z2luKCk7XG4gICAgICAgICAgY29uc3Qgc3VwcG9ydHMgPSBwbHVnaW4udG9vbGJhci5zdXBwb3J0cyh7IG9iamVjdCB9KTtcbiAgICAgICAgICBleHBlY3Qoc3VwcG9ydHMpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGFzc2VydFN1cHBvcnRzKHRydWUsICdibG9jaycsIHRydWUpO1xuICAgICAgYXNzZXJ0U3VwcG9ydHMoZmFsc2UsICdibG9jaycsIGZhbHNlKTtcbiAgICAgIGFzc2VydFN1cHBvcnRzKHRydWUsICdpbmxpbmUnLCBmYWxzZSk7XG4gICAgICBhc3NlcnRTdXBwb3J0cyhmYWxzZSwgJ2lubGluZScsIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdjdXN0b21Ub29sYmFyJywgKCkgPT4ge1xuICAgICAgZGVzY3JpYmUoJ3RvZ2dsZUJvcmRlcicsICgpID0+IHtcbiAgICAgICAgY29uc3QgYXNzZXJ0VG9nZ2xlID0gKGJvcmRlciwgZXhwZWN0ZWRCb3JkZXIpID0+IHtcbiAgICAgICAgICBkZXNjcmliZShgd2l0aCBpbml0aWFsIGJvcmRlciBvZiAke2JvcmRlcn1gLCAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgY2hhbmdlO1xuICAgICAgICAgICAgbGV0IGRvbmU7XG5cbiAgICAgICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBwbHVnaW4gPSBUYWJsZVBsdWdpbigpO1xuICAgICAgICAgICAgICBjaGFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgc2V0Tm9kZUJ5S2V5OiBqZXN0LmZuKCkubW9ja1JldHVyblRoaXMoKSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgcGx1Z2luLnV0aWxzLmdldFRhYmxlQmxvY2sgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHtcbiAgICAgICAgICAgICAgICBrZXk6ICd0YWJsZUtleScsXG4gICAgICAgICAgICAgICAgZGF0YTogRGF0YS5jcmVhdGUoeyBib3JkZXIgfSksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBjb25zdCBub2RlID0geyBrZXk6ICdub2RlS2V5JyB9O1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHtcbiAgICAgICAgICAgICAgICBjaGFuZ2U6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoY2hhbmdlKSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgZG9uZSA9IGplc3QuZm4oKTtcbiAgICAgICAgICAgICAgY29uc3QgQ29tcCA9IHBsdWdpbi50b29sYmFyLmN1c3RvbVRvb2xiYXIobm9kZSwgdmFsdWUsIGRvbmUpO1xuICAgICAgICAgICAgICBjb25zdCBjID0gQ29tcCgpO1xuICAgICAgICAgICAgICBjLnByb3BzLm9uVG9nZ2xlQm9yZGVyKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoYGNhbGxzIHNldE5vZGVCeUtleSB3aXRoICR7ZXhwZWN0ZWRCb3JkZXJ9YCwgKCkgPT4ge1xuICAgICAgICAgICAgICBleHBlY3QoY2hhbmdlLnNldE5vZGVCeUtleSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3RhYmxlS2V5Jywge1xuICAgICAgICAgICAgICAgIGRhdGE6IERhdGEuY3JlYXRlKHsgYm9yZGVyOiBleHBlY3RlZEJvcmRlciB9KSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ2NhbGxzIG9uVG9vbGJhckRvbmUnLCAoKSA9PiB7XG4gICAgICAgICAgICAgIGV4cGVjdChkb25lKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFuZ2UsIGZhbHNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGFzc2VydFRvZ2dsZShudWxsLCAnMScpO1xuICAgICAgICBhc3NlcnRUb2dnbGUodW5kZWZpbmVkLCAnMScpO1xuICAgICAgICBhc3NlcnRUb2dnbGUoJzAnLCAnMScpO1xuICAgICAgICBhc3NlcnRUb2dnbGUoJzEnLCAnMCcpO1xuICAgICAgICBhc3NlcnRUb2dnbGUoJzInLCAnMCcpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbm9ybWFsaXplTm9kZScsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgZXhpdCB0aGUgZnVuY3Rpb24gaWYgdGhlIG5vZGUgaXMgbm90IG9mIHR5cGUgZG9jdW1lbnQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhYmxlUGx1Z2luID0gVGFibGVQbHVnaW4oKTtcbiAgICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSB0YWJsZVBsdWdpbi5ub3JtYWxpemVOb2RlKHsgb2JqZWN0OiAndGFibGUnIH0pO1xuXG4gICAgICAgIGV4cGVjdChyZXR1cm5WYWx1ZSkudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZXhpdCB0aGVyZSBhcmUgbm8gY2hhbmdlcyBuZWVkZWQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhYmxlUGx1Z2luID0gVGFibGVQbHVnaW4oKTtcbiAgICAgICAgY29uc3Qgbm9kZXMgPSB7XG4gICAgICAgICAgc2l6ZTogMyxcbiAgICAgICAgICBmaW5kTGFzdEluZGV4OiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDEpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IHRhYmxlUGx1Z2luLm5vcm1hbGl6ZU5vZGUoe1xuICAgICAgICAgIG9iamVjdDogJ2RvY3VtZW50JyxcbiAgICAgICAgICBub2RlcyxcbiAgICAgICAgICBmaW5kRGVzY2VuZGFudDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7IG9iamVjdDogJ2Jsb2NrJywgdHlwZTogJ3RhYmxlJyB9KSxcbiAgICAgICAgICBnZXRQYXJlbnQ6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUodW5kZWZpbmVkKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGV4cGVjdChyZXR1cm5WYWx1ZSkudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgZnVuY3Rpb24gaWYgYSB0YWJsZSBkb2VzIG5vdCBoYXZlIGEgbm9kZSBiZWZvcmUgb3IgYWZ0ZXIgaXQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhYmxlUGx1Z2luID0gVGFibGVQbHVnaW4oKTtcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgb2JqZWN0OiAnYmxvY2snLFxuICAgICAgICAgICAgdHlwZTogJ3RhYmxlJyxcbiAgICAgICAgICAgIGtleTogJzk5JyxcbiAgICAgICAgICAgIGRhdGE6IERhdGEuY3JlYXRlKHtcbiAgICAgICAgICAgICAgbmV3VGFibGU6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBmaW5kRGVzY2VuZGFudCA9IGplc3QuZm4oKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgbm9kZXMuZm9yRWFjaCgobikgPT4gY2FsbGJhY2sobikpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgY2hhbmdlID0ge1xuICAgICAgICAgIGluc2VydE5vZGVCeVBhdGg6IGplc3QuZm4oKSxcbiAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgZG9jdW1lbnQ6IHtcbiAgICAgICAgICAgICAgZ2V0UGF0aDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShQYXRoVXRpbHMuY3JlYXRlKFswLCAwXSkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gdGFibGVQbHVnaW4ubm9ybWFsaXplTm9kZSh7XG4gICAgICAgICAgb2JqZWN0OiAnZG9jdW1lbnQnLFxuICAgICAgICAgIGZpbmREZXNjZW5kYW50LFxuICAgICAgICAgIGdldFBhdGg6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoUGF0aFV0aWxzLmNyZWF0ZShbMCwgMF0pKSxcbiAgICAgICAgICBnZXRQcmV2aW91c05vZGU6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUodW5kZWZpbmVkKSxcbiAgICAgICAgICBnZXROZXh0Tm9kZTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh1bmRlZmluZWQpLFxuICAgICAgICB9KTtcblxuICAgICAgICBleHBlY3QocmV0dXJuVmFsdWUpLnRvRXF1YWwoZXhwZWN0LmFueShGdW5jdGlvbikpO1xuXG4gICAgICAgIHJldHVyblZhbHVlKGNoYW5nZSk7XG5cbiAgICAgICAgZXhwZWN0KGNoYW5nZS5pbnNlcnROb2RlQnlQYXRoKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChbMF0sIDAsIHtcbiAgICAgICAgICBvYmplY3Q6ICdibG9jaycsXG4gICAgICAgICAgdHlwZTogJ2RpdicsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdwYXJzZVN0eWxlU3RyaW5nJywgKCkgPT4ge1xuICBjb25zdCBwYXJzZXMgPSAocywgZXhwZWN0ZWQpID0+IHtcbiAgICBpdChgcGFyc2VzICR7c30gLT4gJHtKU09OLnN0cmluZ2lmeShleHBlY3RlZCl9YCwgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcGFyc2VTdHlsZVN0cmluZyhzKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9O1xuICBwYXJzZXMoJyB3aWR0aDogMTBweCAnLCB7IHdpZHRoOiAnMTBweCcgfSk7XG4gIHBhcnNlcygnIHdpZHRoOiAxMHB4OyAnLCB7IHdpZHRoOiAnMTBweCcgfSk7XG4gIHBhcnNlcygnIGJvcmRlci13aWR0aDogMTBweDsgJywgeyAnYm9yZGVyLXdpZHRoJzogJzEwcHgnIH0pO1xuICBwYXJzZXMoJyBib3JkZXI6IHNvbGlkIDFweCByZWQ7IGhlaWdodDogMXB4Jywge1xuICAgIGJvcmRlcjogJ3NvbGlkIDFweCByZWQnLFxuICAgIGhlaWdodDogJzFweCcsXG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCd0b1N0eWxlU3RyaW5nJywgKCkgPT4ge1xuICBjb25zdCBzdHlsZVN0cmluZyA9IChvLCBleHBlY3RlZCkgPT4ge1xuICAgIGl0KGAke0pTT04uc3RyaW5naWZ5KHMpfSAtPiAke2V4cGVjdGVkfWAsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRvU3R5bGVTdHJpbmcobyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICB9KTtcbiAgfTtcbn0pO1xuXG5kZXNjcmliZSgncmVhY3RBdHRyaWJ1dGVzJywgKCkgPT4ge1xuICBjb25zdCBhdHRyaWJ1dGVzID0gKG8sIGV4cGVjdGVkKSA9PiB7XG4gICAgaXQoYCR7SlNPTi5zdHJpbmdpZnkobyl9IC0+ICR7SlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWQpfWAsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlYWN0QXR0cmlidXRlcyhvKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9O1xuICBhdHRyaWJ1dGVzKHsgJ2JvcmRlci13aWR0aCc6ICcxMHB4JywgJ2xpbmUtaGVpZ2h0JzogMS41NiB9LCB7IGJvcmRlcldpZHRoOiAnMTBweCcsIGxpbmVIZWlnaHQ6ICcxLjU2JyB9KTtcbn0pO1xuXG5kZXNjcmliZSgnc2VyaWFsaXphdGlvbicsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2Rlc2VyaWFsaXplJywgKCkgPT4ge1xuICAgIGxldCBuZXh0O1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBuZXh0ID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShbXSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgndGFibGUnLCAoKSA9PiB7XG4gICAgICBsZXQgZWw7XG4gICAgICBsZXQgb3V0O1xuICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIGVsID0ge1xuICAgICAgICAgIHRhZ05hbWU6ICd0YWJsZScsXG4gICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgIGdldEF0dHJpYnV0ZTogamVzdC5mbigobmFtZSkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ2JvcmRlcic6XG4gICAgICAgICAgICAgICAgcmV0dXJuICcxJztcbiAgICAgICAgICAgICAgY2FzZSAnY2VsbHNwYWNpbmcnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnMic7XG4gICAgICAgICAgICAgIGNhc2UgJ2NlbGxwYWRkaW5nJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJzMnO1xuICAgICAgICAgICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICd0YWJsZS1jbGFzcyc7XG4gICAgICAgICAgICAgIGNhc2UgJ3N0eWxlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3dpZHRoOiAxMHB4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICAgICAgb3V0ID0gc2VyaWFsaXphdGlvbi5kZXNlcmlhbGl6ZShlbCwgbmV4dCk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYXNzZXJ0RGF0YSA9IChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgICBpdChgZGF0YS4ke25hbWV9IHNob3VsZCBlcWwgJHt2YWx1ZX1gLCAoKSA9PiB7XG4gICAgICAgICAgZXhwZWN0KG91dC5kYXRhW25hbWVdKS50b0VxdWFsKHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBhc3NlcnREYXRhKCdib3JkZXInLCAnMScpO1xuICAgICAgYXNzZXJ0RGF0YSgnY2VsbHNwYWNpbmcnLCAnMicpO1xuICAgICAgYXNzZXJ0RGF0YSgnY2VsbHBhZGRpbmcnLCAnMycpO1xuICAgICAgYXNzZXJ0RGF0YSgnY2xhc3MnLCAndGFibGUtY2xhc3MnKTtcbiAgICAgIGFzc2VydERhdGEoJ3N0eWxlJywgeyB3aWR0aDogJzEwcHgnIH0pO1xuICAgICAgaXQoJ3JldHVybnMgYSB0YWJsZSBibG9jaycsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KG91dCkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgICAgb2JqZWN0OiAnYmxvY2snLFxuICAgICAgICAgIHR5cGU6ICd0YWJsZScsXG4gICAgICAgICAgbm9kZXM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Rlc2VyaWFsaXplcyB0cicsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0ge1xuICAgICAgICB0YWdOYW1lOiAndHInLFxuICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvdXQgPSBzZXJpYWxpemF0aW9uLmRlc2VyaWFsaXplKGVsLCBuZXh0KTtcblxuICAgICAgZXhwZWN0KG91dCkudG9FcXVhbCh7XG4gICAgICAgIG9iamVjdDogJ2Jsb2NrJyxcbiAgICAgICAgdHlwZTogJ3RhYmxlX3JvdycsXG4gICAgICAgIG5vZGVzOiBbXSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Rlc2VyaWFsaXplcyB0ZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0ge1xuICAgICAgICB0YWdOYW1lOiAndGQnLFxuICAgICAgICBjaGlsZE5vZGVzOiBbXSxcbiAgICAgICAgZ2V0QXR0cmlidXRlOiBqZXN0LmZuKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgY29uc3QgbyA9IHtcbiAgICAgICAgICAgIGNsYXNzOiAnY2xhc3MgbmFtZScsXG4gICAgICAgICAgICBjb2xzcGFuOiAnMScsXG4gICAgICAgICAgICByb3dzcGFuOiAnMScsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gb1tuYW1lXTtcbiAgICAgICAgfSksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvdXQgPSBzZXJpYWxpemF0aW9uLmRlc2VyaWFsaXplKGVsLCBuZXh0KTtcblxuICAgICAgZXhwZWN0KG91dCkudG9FcXVhbCh7XG4gICAgICAgIG9iamVjdDogJ2Jsb2NrJyxcbiAgICAgICAgdHlwZTogJ3RhYmxlX2NlbGwnLFxuICAgICAgICBub2RlczogW10sXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBjb2xzcGFuOiAnMScsXG4gICAgICAgICAgcm93c3BhbjogJzEnLFxuICAgICAgICAgIGNsYXNzOiAnY2xhc3MgbmFtZScsXG4gICAgICAgICAgaGVhZGVyOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2VyaWFsaXplJywgKCkgPT4ge1xuICAgIGl0KCdzZXJpYWxpemVzIHRhYmxlJywgKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBzZXJpYWxpemF0aW9uLnNlcmlhbGl6ZSh7XG4gICAgICAgIG9iamVjdDogJ2Jsb2NrJyxcbiAgICAgICAgdHlwZTogJ3RhYmxlJyxcbiAgICAgICAgbm9kZXM6IFtdLFxuICAgICAgICBkYXRhOiBEYXRhLmNyZWF0ZSh7XG4gICAgICAgICAgYm9yZGVyOiAnMScsXG4gICAgICAgICAgY2VsbHBhZGRpbmc6ICcyJyxcbiAgICAgICAgICBjZWxsc3BhY2luZzogJzMnLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoZWwpLnRvRXF1YWwoXG4gICAgICAgIDx0YWJsZSBib3JkZXI9XCIxXCIgY2VsbFBhZGRpbmc9XCIyXCIgY2VsbFNwYWNpbmc9XCIzXCI+XG4gICAgICAgICAgPHRib2R5IC8+XG4gICAgICAgIDwvdGFibGU+LFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzZXJpYWxpemVzIHRhYmxlX3JvdycsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gc2VyaWFsaXphdGlvbi5zZXJpYWxpemUoe1xuICAgICAgICBvYmplY3Q6ICdibG9jaycsXG4gICAgICAgIHR5cGU6ICd0YWJsZV9yb3cnLFxuICAgICAgICBub2RlczogW10sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KGVsKS50b0VxdWFsKDx0ciAvPik7XG4gICAgfSk7XG4gICAgaXQoJ3NlcmlhbGl6ZXMgdGFibGVfY2VsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gc2VyaWFsaXphdGlvbi5zZXJpYWxpemUoe1xuICAgICAgICBvYmplY3Q6ICdibG9jaycsXG4gICAgICAgIHR5cGU6ICd0YWJsZV9jZWxsJyxcbiAgICAgICAgbm9kZXM6IFtdLFxuICAgICAgICBkYXRhOiBEYXRhLmNyZWF0ZSh7XG4gICAgICAgICAgaGVhZGVyOiBmYWxzZSxcbiAgICAgICAgICBzdHlsZTogeyB3aWR0aDogJzEwcHgnIH0sXG4gICAgICAgICAgY2xhc3M6ICdmb28nLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoZWwpLnRvRXF1YWwoPHRkIHN0eWxlPXt7IHdpZHRoOiAnMTBweCcgfX0gY2xhc3NOYW1lPXsnZm9vJ30gLz4pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsSUFBQUEsZUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBQyx1QkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsTUFBQSxHQUFBSCxPQUFB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Ym1ELEtBQUssRUFBRSxFQUFFO1FBQ1Q1QixJQUFJLEVBQUVrQixXQUFJLENBQUNwQixNQUFNLENBQUM7VUFDaEJHLE1BQU0sRUFBRSxHQUFHO1VBQ1hzRSxXQUFXLEVBQUUsR0FBRztVQUNoQkMsV0FBVyxFQUFFO1FBQ2YsQ0FBQztNQUNILENBQUMsQ0FBQztNQUVGOUUsTUFBTSxDQUFDOEQsRUFBRSxDQUFDLENBQUMzQyxPQUFPLGNBQ2hCcEUsTUFBQSxZQUFBZ0ksYUFBQTtRQUFPeEUsTUFBTSxFQUFDLEdBQUc7UUFBQ3lFLFdBQVcsRUFBQyxHQUFHO1FBQUNDLFdBQVcsRUFBQztNQUFHLGdCQUMvQ2xJLE1BQUEsWUFBQWdJLGFBQUEsY0FBUSxDQUNILENBQ1QsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGbkYsRUFBRSxDQUFDLHNCQUFzQixFQUFFLFlBQU07TUFDL0IsSUFBTWtFLEVBQUUsR0FBR00sb0JBQWEsQ0FBQ1EsU0FBUyxDQUFDO1FBQ2pDOUYsTUFBTSxFQUFFLE9BQU87UUFDZkMsSUFBSSxFQUFFLFdBQVc7UUFDakJtRCxLQUFLLEVBQUU7TUFDVCxDQUFDLENBQUM7TUFFRmxDLE1BQU0sQ0FBQzhELEVBQUUsQ0FBQyxDQUFDM0MsT0FBTyxjQUFDcEUsTUFBQSxZQUFBZ0ksYUFBQSxXQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUM7SUFDRm5GLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxZQUFNO01BQ2hDLElBQU1rRSxFQUFFLEdBQUdNLG9CQUFhLENBQUNRLFNBQVMsQ0FBQztRQUNqQzlGLE1BQU0sRUFBRSxPQUFPO1FBQ2ZDLElBQUksRUFBRSxZQUFZO1FBQ2xCbUQsS0FBSyxFQUFFLEVBQUU7UUFDVDVCLElBQUksRUFBRWtCLFdBQUksQ0FBQ3BCLE1BQU0sQ0FBQztVQUNoQnVFLE1BQU0sRUFBRSxLQUFLO1VBQ2JPLEtBQUssRUFBRTtZQUFFN0IsS0FBSyxFQUFFO1VBQU8sQ0FBQztVQUN4QixTQUFPO1FBQ1QsQ0FBQztNQUNILENBQUMsQ0FBQztNQUVGckQsTUFBTSxDQUFDOEQsRUFBRSxDQUFDLENBQUMzQyxPQUFPLGNBQUNwRSxNQUFBLFlBQUFnSSxhQUFBO1FBQUlHLEtBQUssRUFBRTtVQUFFN0IsS0FBSyxFQUFFO1FBQU8sQ0FBRTtRQUFDOEIsU0FBUyxFQUFFO01BQU0sQ0FBRSxDQUFDLENBQUM7SUFDeEUsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
5
|
+
var _react = _interopRequireDefault(require("react"));
|
|
6
|
+
var _react2 = require("@testing-library/react");
|
|
7
|
+
var _tableToolbar = require("../table-toolbar");
|
|
8
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
9
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
10
|
+
describe('table-toolbar', function () {
|
|
11
|
+
var onDone, onAddColumn, onAddRow, onRemoveColumn, onRemoveRow, onRemoveTable, onToggleBorder;
|
|
12
|
+
beforeEach(function () {
|
|
13
|
+
onAddColumn = jest.fn();
|
|
14
|
+
onAddRow = jest.fn();
|
|
15
|
+
onRemoveColumn = jest.fn();
|
|
16
|
+
onRemoveRow = jest.fn();
|
|
17
|
+
onRemoveTable = jest.fn();
|
|
18
|
+
onDone = jest.fn();
|
|
19
|
+
onToggleBorder = jest.fn();
|
|
20
|
+
});
|
|
21
|
+
var renderComponent = function renderComponent() {
|
|
22
|
+
var extras = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
23
|
+
var props = _objectSpread({
|
|
24
|
+
onDone: onDone,
|
|
25
|
+
onAddRow: onAddRow,
|
|
26
|
+
onRemoveRow: onRemoveRow,
|
|
27
|
+
onAddColumn: onAddColumn,
|
|
28
|
+
onRemoveColumn: onRemoveColumn,
|
|
29
|
+
onRemoveTable: onRemoveTable,
|
|
30
|
+
hasBorder: true,
|
|
31
|
+
onToggleBorder: onToggleBorder,
|
|
32
|
+
classes: {
|
|
33
|
+
tableToolbar: 'table-toolbar'
|
|
34
|
+
},
|
|
35
|
+
plugins: [],
|
|
36
|
+
value: {},
|
|
37
|
+
onChange: jest.fn()
|
|
38
|
+
}, extras);
|
|
39
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_tableToolbar.TableToolbar, props));
|
|
40
|
+
};
|
|
41
|
+
describe('rendering', function () {
|
|
42
|
+
it('renders toolbar without crashing', function () {
|
|
43
|
+
var _renderComponent = renderComponent(),
|
|
44
|
+
container = _renderComponent.container;
|
|
45
|
+
|
|
46
|
+
// Check that the toolbar container is rendered
|
|
47
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
48
|
+
|
|
49
|
+
// Check for Done button (only one with aria-label)
|
|
50
|
+
expect(_react2.screen.getByLabelText('Done')).toBeInTheDocument();
|
|
51
|
+
|
|
52
|
+
// Check that there are multiple buttons (table manipulation buttons)
|
|
53
|
+
var buttons = container.querySelectorAll('button');
|
|
54
|
+
expect(buttons.length).toBeGreaterThan(1);
|
|
55
|
+
});
|
|
56
|
+
it('renders with hasBorder prop', function () {
|
|
57
|
+
var _renderComponent2 = renderComponent({
|
|
58
|
+
hasBorder: false
|
|
59
|
+
}),
|
|
60
|
+
container = _renderComponent2.container;
|
|
61
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
62
|
+
|
|
63
|
+
// Verify hasBorder affects rendering - button with aria-pressed attribute
|
|
64
|
+
var borderButton = container.querySelector('button[aria-pressed]');
|
|
65
|
+
expect(borderButton).toBeInTheDocument();
|
|
66
|
+
expect(borderButton).toHaveAttribute('aria-pressed', 'false');
|
|
67
|
+
});
|
|
68
|
+
it('renders with hasBorder true', function () {
|
|
69
|
+
var _renderComponent3 = renderComponent({
|
|
70
|
+
hasBorder: true
|
|
71
|
+
}),
|
|
72
|
+
container = _renderComponent3.container;
|
|
73
|
+
|
|
74
|
+
// Verify hasBorder affects rendering
|
|
75
|
+
var borderButton = container.querySelector('button[aria-pressed]');
|
|
76
|
+
expect(borderButton).toBeInTheDocument();
|
|
77
|
+
expect(borderButton).toHaveAttribute('aria-pressed', 'true');
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfdGFibGVUb29sYmFyIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJkZXNjcmliZSIsIm9uRG9uZSIsIm9uQWRkQ29sdW1uIiwib25BZGRSb3ciLCJvblJlbW92ZUNvbHVtbiIsIm9uUmVtb3ZlUm93Iiwib25SZW1vdmVUYWJsZSIsIm9uVG9nZ2xlQm9yZGVyIiwiYmVmb3JlRWFjaCIsImplc3QiLCJmbiIsInJlbmRlckNvbXBvbmVudCIsImV4dHJhcyIsInVuZGVmaW5lZCIsInByb3BzIiwiaGFzQm9yZGVyIiwiY2xhc3NlcyIsInRhYmxlVG9vbGJhciIsInBsdWdpbnMiLCJ2YWx1ZSIsIm9uQ2hhbmdlIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsIlRhYmxlVG9vbGJhciIsIml0IiwiX3JlbmRlckNvbXBvbmVudCIsImNvbnRhaW5lciIsImV4cGVjdCIsImZpcnN0Q2hpbGQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsInNjcmVlbiIsImdldEJ5TGFiZWxUZXh0IiwiYnV0dG9ucyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJ0b0JlR3JlYXRlclRoYW4iLCJfcmVuZGVyQ29tcG9uZW50MiIsImJvcmRlckJ1dHRvbiIsInF1ZXJ5U2VsZWN0b3IiLCJ0b0hhdmVBdHRyaWJ1dGUiLCJfcmVuZGVyQ29tcG9uZW50MyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbHVnaW5zL3RhYmxlL19fdGVzdHNfXy90YWJsZS10b29sYmFyLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXIsIHNjcmVlbiB9IGZyb20gJ0B0ZXN0aW5nLWxpYnJhcnkvcmVhY3QnO1xuaW1wb3J0IHsgVGFibGVUb29sYmFyIH0gZnJvbSAnLi4vdGFibGUtdG9vbGJhcic7XG5cbmRlc2NyaWJlKCd0YWJsZS10b29sYmFyJywgKCkgPT4ge1xuICBsZXQgb25Eb25lLCBvbkFkZENvbHVtbiwgb25BZGRSb3csIG9uUmVtb3ZlQ29sdW1uLCBvblJlbW92ZVJvdywgb25SZW1vdmVUYWJsZSwgb25Ub2dnbGVCb3JkZXI7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgb25BZGRDb2x1bW4gPSBqZXN0LmZuKCk7XG4gICAgb25BZGRSb3cgPSBqZXN0LmZuKCk7XG4gICAgb25SZW1vdmVDb2x1bW4gPSBqZXN0LmZuKCk7XG4gICAgb25SZW1vdmVSb3cgPSBqZXN0LmZuKCk7XG4gICAgb25SZW1vdmVUYWJsZSA9IGplc3QuZm4oKTtcbiAgICBvbkRvbmUgPSBqZXN0LmZuKCk7XG4gICAgb25Ub2dnbGVCb3JkZXIgPSBqZXN0LmZuKCk7XG4gIH0pO1xuXG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgb25Eb25lLFxuICAgICAgb25BZGRSb3csXG4gICAgICBvblJlbW92ZVJvdyxcbiAgICAgIG9uQWRkQ29sdW1uLFxuICAgICAgb25SZW1vdmVDb2x1bW4sXG4gICAgICBvblJlbW92ZVRhYmxlLFxuICAgICAgaGFzQm9yZGVyOiB0cnVlLFxuICAgICAgb25Ub2dnbGVCb3JkZXIsXG4gICAgICBjbGFzc2VzOiB7XG4gICAgICAgIHRhYmxlVG9vbGJhcjogJ3RhYmxlLXRvb2xiYXInLFxuICAgICAgfSxcbiAgICAgIHBsdWdpbnM6IFtdLFxuICAgICAgdmFsdWU6IHt9LFxuICAgICAgb25DaGFuZ2U6IGplc3QuZm4oKSxcbiAgICAgIC4uLmV4dHJhcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlbmRlcig8VGFibGVUb29sYmFyIHsuLi5wcm9wc30gLz4pO1xuICB9O1xuXG4gIGRlc2NyaWJlKCdyZW5kZXJpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgdG9vbGJhciB3aXRob3V0IGNyYXNoaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuXG4gICAgICAvLyBDaGVjayB0aGF0IHRoZSB0b29sYmFyIGNvbnRhaW5lciBpcyByZW5kZXJlZFxuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuXG4gICAgICAvLyBDaGVjayBmb3IgRG9uZSBidXR0b24gKG9ubHkgb25lIHdpdGggYXJpYS1sYWJlbClcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ0RvbmUnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcblxuICAgICAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBhcmUgbXVsdGlwbGUgYnV0dG9ucyAodGFibGUgbWFuaXB1bGF0aW9uIGJ1dHRvbnMpXG4gICAgICBjb25zdCBidXR0b25zID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpO1xuICAgICAgZXhwZWN0KGJ1dHRvbnMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGhhc0JvcmRlciBwcm9wJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGhhc0JvcmRlcjogZmFsc2UgfSk7XG5cbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcblxuICAgICAgLy8gVmVyaWZ5IGhhc0JvcmRlciBhZmZlY3RzIHJlbmRlcmluZyAtIGJ1dHRvbiB3aXRoIGFyaWEtcHJlc3NlZCBhdHRyaWJ1dGVcbiAgICAgIGNvbnN0IGJvcmRlckJ1dHRvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdidXR0b25bYXJpYS1wcmVzc2VkXScpO1xuICAgICAgZXhwZWN0KGJvcmRlckJ1dHRvbikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChib3JkZXJCdXR0b24pLnRvSGF2ZUF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ2ZhbHNlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGhhc0JvcmRlciB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGhhc0JvcmRlcjogdHJ1ZSB9KTtcblxuICAgICAgLy8gVmVyaWZ5IGhhc0JvcmRlciBhZmZlY3RzIHJlbmRlcmluZ1xuICAgICAgY29uc3QgYm9yZGVyQnV0dG9uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvblthcmlhLXByZXNzZWRdJyk7XG4gICAgICBleHBlY3QoYm9yZGVyQnV0dG9uKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KGJvcmRlckJ1dHRvbikudG9IYXZlQXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAndHJ1ZScpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsYUFBQSxHQUFBRixPQUFBO0FBQWdELFNBQUFHLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFC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
|