@pie-lib/editable-html-tip-tap 2.1.20-beta.1 → 2.1.20-beta.10
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__/EditableHtml.test.js +831 -0
- package/lib/__tests__/constants.test.js +21 -0
- package/lib/__tests__/div-to-paragraph-conversion.test.js +213 -0
- package/lib/__tests__/extensions.test.js +209 -0
- package/lib/__tests__/index.test.js +250 -0
- package/lib/__tests__/size-utils.test.js +57 -0
- package/lib/__tests__/spellcheck.test.js +142 -0
- package/lib/__tests__/theme.test.js +17 -0
- package/lib/components/__tests__/AltDialog.test.js +201 -0
- package/lib/components/__tests__/CharacterPicker.test.js +455 -0
- package/lib/components/__tests__/CssIcon.test.js +58 -0
- package/lib/components/__tests__/DragInTheBlank.test.js +295 -0
- package/lib/components/__tests__/ExplicitConstructedResponse.test.js +345 -0
- package/lib/components/__tests__/ImageToolbar.test.js +185 -0
- package/lib/components/__tests__/InlineDropdown.test.js +839 -0
- package/lib/components/__tests__/InsertImageHandler.test.js +171 -0
- package/lib/components/__tests__/MediaDialog.test.js +433 -0
- package/lib/components/__tests__/MediaToolbar.test.js +126 -0
- package/lib/components/__tests__/MediaWrapper.test.js +96 -0
- package/lib/components/__tests__/MenuBar.test.js +502 -0
- package/lib/components/__tests__/RespArea.test.js +171 -0
- package/lib/components/__tests__/TableIcons.test.js +153 -0
- package/lib/components/__tests__/TextAlign.test.js +209 -0
- package/lib/components/__tests__/TiptapContainer.test.js +196 -0
- package/lib/components/__tests__/characterUtils.test.js +178 -0
- package/lib/components/__tests__/choice.test.js +213 -0
- package/lib/components/__tests__/custom-popper.test.js +108 -0
- package/lib/components/__tests__/done-button.test.js +72 -0
- package/lib/components/__tests__/toolbar-buttons.test.js +277 -0
- package/lib/components/respArea/DragInTheBlank/__tests__/choice.test.js +90 -0
- package/lib/components/respArea/__tests__/MathTemplated.test.js +217 -0
- package/lib/extensions/__tests__/css.test.js +214 -0
- package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +175 -0
- package/lib/extensions/__tests__/divNode.test.js +108 -0
- package/lib/extensions/__tests__/ensure-empty-root-div.test.js +50 -0
- package/lib/extensions/__tests__/ensure-list-item-content-is-div.test.js +60 -0
- package/lib/extensions/__tests__/extended-list-item.test.js +13 -0
- package/lib/extensions/__tests__/extended-table-cell.test.js +15 -0
- package/lib/extensions/__tests__/extended-table.test.js +200 -0
- package/lib/extensions/__tests__/image-component.test.js +432 -0
- package/lib/extensions/__tests__/image.test.js +313 -0
- package/lib/extensions/__tests__/math.test.js +1411 -0
- package/lib/extensions/__tests__/media-node-view.test.js +307 -0
- package/lib/extensions/__tests__/media.test.js +292 -0
- package/lib/extensions/__tests__/responseArea.test.js +736 -0
- package/lib/utils/__tests__/helper.test.js +107 -0
- package/lib/utils/__tests__/toolbar.test.js +38 -0
- package/package.json +3 -3
- package/src/__tests__/EditableHtml.test.jsx +588 -0
- package/src/__tests__/constants.test.js +19 -0
- package/src/__tests__/div-to-paragraph-conversion.test.jsx +125 -0
- package/src/__tests__/extensions.test.js +208 -0
- package/src/__tests__/index.test.jsx +154 -0
- package/src/__tests__/size-utils.test.js +64 -0
- package/src/__tests__/theme.test.js +17 -0
- package/src/components/__tests__/AltDialog.test.jsx +147 -0
- package/src/components/__tests__/CharacterPicker.test.jsx +270 -0
- package/src/components/__tests__/CssIcon.test.jsx +46 -0
- package/src/components/__tests__/DragInTheBlank.test.jsx +255 -0
- package/src/components/__tests__/ExplicitConstructedResponse.test.jsx +209 -0
- package/src/components/__tests__/ImageToolbar.test.jsx +128 -0
- package/src/components/__tests__/InlineDropdown.test.jsx +557 -0
- package/src/components/__tests__/InsertImageHandler.test.js +161 -0
- package/src/components/__tests__/MediaDialog.test.jsx +293 -0
- package/src/components/__tests__/MediaToolbar.test.jsx +74 -0
- package/src/components/__tests__/MediaWrapper.test.jsx +81 -0
- package/src/components/__tests__/MenuBar.test.jsx +250 -0
- package/src/components/__tests__/RespArea.test.jsx +122 -0
- package/src/components/__tests__/TableIcons.test.jsx +149 -0
- package/src/components/__tests__/TextAlign.test.jsx +167 -0
- package/src/components/__tests__/TiptapContainer.test.jsx +138 -0
- package/src/components/__tests__/characterUtils.test.js +166 -0
- package/src/components/__tests__/choice.test.jsx +171 -0
- package/src/components/__tests__/custom-popper.test.jsx +82 -0
- package/src/components/__tests__/done-button.test.jsx +54 -0
- package/src/components/__tests__/toolbar-buttons.test.jsx +234 -0
- package/src/components/respArea/DragInTheBlank/__tests__/choice.test.jsx +72 -0
- package/src/components/respArea/__tests__/MathTemplated.test.jsx +210 -0
- package/src/extensions/__tests__/css.test.js +196 -0
- package/src/extensions/__tests__/custom-toolbar-wrapper.test.jsx +180 -0
- package/src/extensions/__tests__/divNode.test.js +87 -0
- package/src/extensions/__tests__/ensure-empty-root-div.test.js +57 -0
- package/src/extensions/__tests__/ensure-list-item-content-is-div.test.js +44 -0
- package/src/extensions/__tests__/extended-list-item.test.js +13 -0
- package/src/extensions/__tests__/extended-table-cell.test.js +22 -0
- package/src/extensions/__tests__/extended-table.test.js +183 -0
- package/src/extensions/__tests__/image-component.test.jsx +346 -0
- package/src/extensions/__tests__/image.test.js +237 -0
- package/src/extensions/__tests__/math.test.js +900 -0
- package/src/extensions/__tests__/media-node-view.test.jsx +298 -0
- package/src/extensions/__tests__/media.test.js +271 -0
- package/src/extensions/__tests__/responseArea.test.js +655 -0
- package/src/utils/__tests__/helper.test.js +126 -0
- package/src/utils/__tests__/toolbar.test.js +43 -0
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
5
|
+
var _media = require("../media");
|
|
6
|
+
jest.mock('@tiptap/core', function () {
|
|
7
|
+
return {
|
|
8
|
+
Node: {
|
|
9
|
+
create: jest.fn(function (config) {
|
|
10
|
+
return config;
|
|
11
|
+
})
|
|
12
|
+
},
|
|
13
|
+
mergeAttributes: jest.fn(function () {
|
|
14
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
15
|
+
args[_key] = arguments[_key];
|
|
16
|
+
}
|
|
17
|
+
return Object.assign.apply(Object, [{}].concat(args));
|
|
18
|
+
})
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
jest.mock('@tiptap/react', function () {
|
|
22
|
+
return {
|
|
23
|
+
NodeViewWrapper: function NodeViewWrapper(_ref) {
|
|
24
|
+
var children = _ref.children;
|
|
25
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
26
|
+
"data-testid": "node-view-wrapper"
|
|
27
|
+
}, children);
|
|
28
|
+
},
|
|
29
|
+
ReactNodeViewRenderer: jest.fn(function (component) {
|
|
30
|
+
return component;
|
|
31
|
+
})
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
jest.mock('react-dom', function () {
|
|
35
|
+
return {
|
|
36
|
+
render: jest.fn()
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
jest.mock('../../components/media/MediaDialog', function () {
|
|
40
|
+
return {
|
|
41
|
+
__esModule: true,
|
|
42
|
+
"default": jest.fn(function () {
|
|
43
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
44
|
+
"data-testid": "media-dialog"
|
|
45
|
+
});
|
|
46
|
+
})
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
jest.mock('../../components/media/MediaToolbar', function () {
|
|
50
|
+
return {
|
|
51
|
+
__esModule: true,
|
|
52
|
+
"default": jest.fn(function () {
|
|
53
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
54
|
+
"data-testid": "media-toolbar"
|
|
55
|
+
});
|
|
56
|
+
})
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
describe('Media', function () {
|
|
60
|
+
describe('configuration', function () {
|
|
61
|
+
it('has correct name', function () {
|
|
62
|
+
expect(_media.Media.name).toBe('media');
|
|
63
|
+
});
|
|
64
|
+
it('is inline', function () {
|
|
65
|
+
expect(_media.Media.inline).toBe(true);
|
|
66
|
+
});
|
|
67
|
+
it('is in inline group', function () {
|
|
68
|
+
expect(_media.Media.group).toBe('inline');
|
|
69
|
+
});
|
|
70
|
+
it('is atomic', function () {
|
|
71
|
+
expect(_media.Media.atom).toBe(true);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
describe('addAttributes', function () {
|
|
75
|
+
it('returns all media attributes with defaults', function () {
|
|
76
|
+
var attributes = _media.Media.addAttributes();
|
|
77
|
+
expect(attributes).toHaveProperty('type');
|
|
78
|
+
expect(attributes).toHaveProperty('src');
|
|
79
|
+
expect(attributes).toHaveProperty('width');
|
|
80
|
+
expect(attributes).toHaveProperty('height');
|
|
81
|
+
expect(attributes).toHaveProperty('title');
|
|
82
|
+
expect(attributes).toHaveProperty('starts');
|
|
83
|
+
expect(attributes).toHaveProperty('ends');
|
|
84
|
+
expect(attributes).toHaveProperty('editing');
|
|
85
|
+
expect(attributes).toHaveProperty('tag');
|
|
86
|
+
expect(attributes).toHaveProperty('url');
|
|
87
|
+
expect(attributes.type["default"]).toBe('video');
|
|
88
|
+
expect(attributes.src["default"]).toBeNull();
|
|
89
|
+
expect(attributes.tag["default"]).toBe('iframe');
|
|
90
|
+
expect(attributes.editing["default"]).toBe(false);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe('parseHTML', function () {
|
|
94
|
+
it('returns parsing rules for iframe and audio', function () {
|
|
95
|
+
var rules = _media.Media.parseHTML();
|
|
96
|
+
expect(Array.isArray(rules)).toBe(true);
|
|
97
|
+
expect(rules).toHaveLength(2);
|
|
98
|
+
expect(rules[0].tag).toBe('iframe[data-type="video"]');
|
|
99
|
+
expect(rules[1].tag).toBe('audio');
|
|
100
|
+
});
|
|
101
|
+
it('parses video iframe attributes', function () {
|
|
102
|
+
var rules = _media.Media.parseHTML();
|
|
103
|
+
var mockEl = {
|
|
104
|
+
getAttribute: jest.fn(function (attr) {
|
|
105
|
+
var attrs = {
|
|
106
|
+
src: 'https://video.com/embed',
|
|
107
|
+
width: '640',
|
|
108
|
+
height: '480'
|
|
109
|
+
};
|
|
110
|
+
return attrs[attr] || null;
|
|
111
|
+
}),
|
|
112
|
+
dataset: {
|
|
113
|
+
title: 'Test Video',
|
|
114
|
+
starts: '10',
|
|
115
|
+
ends: '60',
|
|
116
|
+
url: 'https://video.com/watch'
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
var result = rules[0].getAttrs(mockEl);
|
|
120
|
+
expect(result.type).toBe('video');
|
|
121
|
+
expect(result.tag).toBe('iframe');
|
|
122
|
+
expect(result.src).toBe('https://video.com/embed');
|
|
123
|
+
expect(result.width).toBe('640');
|
|
124
|
+
expect(result.height).toBe('480');
|
|
125
|
+
expect(result.title).toBe('Test Video');
|
|
126
|
+
});
|
|
127
|
+
it('parses audio element attributes', function () {
|
|
128
|
+
var rules = _media.Media.parseHTML();
|
|
129
|
+
var mockEl = {
|
|
130
|
+
querySelector: jest.fn(function () {
|
|
131
|
+
return {
|
|
132
|
+
getAttribute: jest.fn(function () {
|
|
133
|
+
return 'https://audio.com/file.mp3';
|
|
134
|
+
})
|
|
135
|
+
};
|
|
136
|
+
})
|
|
137
|
+
};
|
|
138
|
+
var result = rules[1].getAttrs(mockEl);
|
|
139
|
+
expect(result.type).toBe('audio');
|
|
140
|
+
expect(result.tag).toBe('audio');
|
|
141
|
+
expect(result.src).toBe('https://audio.com/file.mp3');
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe('renderHTML', function () {
|
|
145
|
+
it('renders audio element for audio type', function () {
|
|
146
|
+
var HTMLAttributes = {
|
|
147
|
+
tag: 'audio',
|
|
148
|
+
src: 'test.mp3'
|
|
149
|
+
};
|
|
150
|
+
var result = _media.Media.renderHTML({
|
|
151
|
+
HTMLAttributes: HTMLAttributes
|
|
152
|
+
});
|
|
153
|
+
expect(result[0]).toBe('audio');
|
|
154
|
+
expect(result[1]).toEqual({
|
|
155
|
+
controls: 'controls',
|
|
156
|
+
controlsList: 'nodownload'
|
|
157
|
+
});
|
|
158
|
+
expect(result[2][0]).toBe('source');
|
|
159
|
+
expect(result[2][1]).toEqual({
|
|
160
|
+
src: 'test.mp3',
|
|
161
|
+
type: 'audio/mp3'
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
it('renders iframe for video type', function () {
|
|
165
|
+
var HTMLAttributes = {
|
|
166
|
+
tag: 'iframe',
|
|
167
|
+
src: 'https://video.com/embed',
|
|
168
|
+
width: '640',
|
|
169
|
+
height: '480'
|
|
170
|
+
};
|
|
171
|
+
var result = _media.Media.renderHTML({
|
|
172
|
+
HTMLAttributes: HTMLAttributes
|
|
173
|
+
});
|
|
174
|
+
expect(result[0]).toBe('iframe');
|
|
175
|
+
expect(result[1]).toHaveProperty('data-type', 'video');
|
|
176
|
+
expect(result[1]).toHaveProperty('frameborder', '0');
|
|
177
|
+
expect(result[1]).toHaveProperty('src', 'https://video.com/embed');
|
|
178
|
+
expect(result[1]).toHaveProperty('width', '640');
|
|
179
|
+
expect(result[1]).toHaveProperty('height', '480');
|
|
180
|
+
});
|
|
181
|
+
it('renders iframe without dimensions if not provided', function () {
|
|
182
|
+
var HTMLAttributes = {
|
|
183
|
+
tag: 'iframe',
|
|
184
|
+
src: 'https://video.com/embed'
|
|
185
|
+
};
|
|
186
|
+
var result = _media.Media.renderHTML({
|
|
187
|
+
HTMLAttributes: HTMLAttributes
|
|
188
|
+
});
|
|
189
|
+
expect(result[1]).not.toHaveProperty('width');
|
|
190
|
+
expect(result[1]).not.toHaveProperty('height');
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
describe('addCommands', function () {
|
|
194
|
+
it('returns insertMedia and updateMedia commands', function () {
|
|
195
|
+
var commands = _media.Media.addCommands();
|
|
196
|
+
expect(commands).toHaveProperty('insertMedia');
|
|
197
|
+
expect(commands).toHaveProperty('updateMedia');
|
|
198
|
+
expect((0, _typeof2["default"])(commands.insertMedia)).toBe('function');
|
|
199
|
+
expect((0, _typeof2["default"])(commands.updateMedia)).toBe('function');
|
|
200
|
+
});
|
|
201
|
+
it('insertMedia inserts content with attributes', function () {
|
|
202
|
+
var context = {
|
|
203
|
+
name: 'media'
|
|
204
|
+
};
|
|
205
|
+
var commands = _media.Media.addCommands.call(context);
|
|
206
|
+
var mockCommands = {
|
|
207
|
+
insertContent: jest.fn(function () {
|
|
208
|
+
return true;
|
|
209
|
+
})
|
|
210
|
+
};
|
|
211
|
+
var attrs = {
|
|
212
|
+
type: 'video',
|
|
213
|
+
src: 'test.mp4'
|
|
214
|
+
};
|
|
215
|
+
var result = commands.insertMedia(attrs)({
|
|
216
|
+
commands: mockCommands
|
|
217
|
+
});
|
|
218
|
+
expect(mockCommands.insertContent).toHaveBeenCalledWith({
|
|
219
|
+
type: 'media',
|
|
220
|
+
attrs: attrs
|
|
221
|
+
});
|
|
222
|
+
expect(result).toBe(true);
|
|
223
|
+
});
|
|
224
|
+
it('updateMedia updates attributes', function () {
|
|
225
|
+
var context = {
|
|
226
|
+
name: 'media'
|
|
227
|
+
};
|
|
228
|
+
var commands = _media.Media.addCommands.call(context);
|
|
229
|
+
var mockCommands = {
|
|
230
|
+
updateAttributes: jest.fn(function () {
|
|
231
|
+
return true;
|
|
232
|
+
})
|
|
233
|
+
};
|
|
234
|
+
var attrs = {
|
|
235
|
+
width: '800'
|
|
236
|
+
};
|
|
237
|
+
var result = commands.updateMedia(attrs)({
|
|
238
|
+
commands: mockCommands
|
|
239
|
+
});
|
|
240
|
+
expect(mockCommands.updateAttributes).toHaveBeenCalledWith('media', attrs);
|
|
241
|
+
expect(result).toBe(true);
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
describe('addNodeView', function () {
|
|
245
|
+
it('returns ReactNodeViewRenderer result', function () {
|
|
246
|
+
var result = _media.Media.addNodeView();
|
|
247
|
+
expect(result).toBeDefined();
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
describe('insertDialog', function () {
|
|
252
|
+
beforeEach(function () {
|
|
253
|
+
document.body.innerHTML = '';
|
|
254
|
+
document.body.style.overflow = 'auto';
|
|
255
|
+
});
|
|
256
|
+
it('creates dialog element', function () {
|
|
257
|
+
var mockCallback = jest.fn();
|
|
258
|
+
var props = {
|
|
259
|
+
type: 'video',
|
|
260
|
+
callback: mockCallback,
|
|
261
|
+
options: {}
|
|
262
|
+
};
|
|
263
|
+
(0, _media.insertDialog)(props);
|
|
264
|
+
var dialog = document.querySelector('.insert-media-dialog');
|
|
265
|
+
expect(dialog).toBeTruthy();
|
|
266
|
+
});
|
|
267
|
+
it('sets body overflow to hidden', function () {
|
|
268
|
+
var mockCallback = jest.fn();
|
|
269
|
+
var props = {
|
|
270
|
+
type: 'video',
|
|
271
|
+
callback: mockCallback,
|
|
272
|
+
options: {}
|
|
273
|
+
};
|
|
274
|
+
(0, _media.insertDialog)(props);
|
|
275
|
+
expect(document.body.style.overflow).toBe('hidden');
|
|
276
|
+
});
|
|
277
|
+
it('removes previous dialogs', function () {
|
|
278
|
+
var existingDialog = document.createElement('div');
|
|
279
|
+
existingDialog.className = 'insert-media-dialog';
|
|
280
|
+
document.body.appendChild(existingDialog);
|
|
281
|
+
var mockCallback = jest.fn();
|
|
282
|
+
var props = {
|
|
283
|
+
type: 'video',
|
|
284
|
+
callback: mockCallback,
|
|
285
|
+
options: {}
|
|
286
|
+
};
|
|
287
|
+
(0, _media.insertDialog)(props);
|
|
288
|
+
var dialogs = document.querySelectorAll('.insert-media-dialog');
|
|
289
|
+
expect(dialogs).toHaveLength(1);
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWVkaWEiLCJyZXF1aXJlIiwiamVzdCIsIm1vY2siLCJOb2RlIiwiY3JlYXRlIiwiZm4iLCJjb25maWciLCJtZXJnZUF0dHJpYnV0ZXMiLCJfbGVuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiYXJncyIsIkFycmF5IiwiX2tleSIsIk9iamVjdCIsImFzc2lnbiIsImFwcGx5IiwiY29uY2F0IiwiTm9kZVZpZXdXcmFwcGVyIiwiX3JlZiIsImNoaWxkcmVuIiwiUmVhY3QiLCJjcmVhdGVFbGVtZW50IiwiUmVhY3ROb2RlVmlld1JlbmRlcmVyIiwiY29tcG9uZW50IiwicmVuZGVyIiwiX19lc01vZHVsZSIsImRlc2NyaWJlIiwiaXQiLCJleHBlY3QiLCJNZWRpYSIsIm5hbWUiLCJ0b0JlIiwiaW5saW5lIiwiZ3JvdXAiLCJhdG9tIiwiYXR0cmlidXRlcyIsImFkZEF0dHJpYnV0ZXMiLCJ0b0hhdmVQcm9wZXJ0eSIsInR5cGUiLCJzcmMiLCJ0b0JlTnVsbCIsInRhZyIsImVkaXRpbmciLCJydWxlcyIsInBhcnNlSFRNTCIsImlzQXJyYXkiLCJ0b0hhdmVMZW5ndGgiLCJtb2NrRWwiLCJnZXRBdHRyaWJ1dGUiLCJhdHRyIiwiYXR0cnMiLCJ3aWR0aCIsImhlaWdodCIsImRhdGFzZXQiLCJ0aXRsZSIsInN0YXJ0cyIsImVuZHMiLCJ1cmwiLCJyZXN1bHQiLCJnZXRBdHRycyIsInF1ZXJ5U2VsZWN0b3IiLCJIVE1MQXR0cmlidXRlcyIsInJlbmRlckhUTUwiLCJ0b0VxdWFsIiwiY29udHJvbHMiLCJjb250cm9sc0xpc3QiLCJub3QiLCJjb21tYW5kcyIsImFkZENvbW1hbmRzIiwiX3R5cGVvZjIiLCJpbnNlcnRNZWRpYSIsInVwZGF0ZU1lZGlhIiwiY29udGV4dCIsImNhbGwiLCJtb2NrQ29tbWFuZHMiLCJpbnNlcnRDb250ZW50IiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJ1cGRhdGVBdHRyaWJ1dGVzIiwiYWRkTm9kZVZpZXciLCJ0b0JlRGVmaW5lZCIsImJlZm9yZUVhY2giLCJkb2N1bWVudCIsImJvZHkiLCJpbm5lckhUTUwiLCJzdHlsZSIsIm92ZXJmbG93IiwibW9ja0NhbGxiYWNrIiwicHJvcHMiLCJjYWxsYmFjayIsIm9wdGlvbnMiLCJpbnNlcnREaWFsb2ciLCJkaWFsb2ciLCJ0b0JlVHJ1dGh5IiwiZXhpc3RpbmdEaWFsb2ciLCJjbGFzc05hbWUiLCJhcHBlbmRDaGlsZCIsImRpYWxvZ3MiLCJxdWVyeVNlbGVjdG9yQWxsIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2V4dGVuc2lvbnMvX190ZXN0c19fL21lZGlhLnRlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5zZXJ0RGlhbG9nLCBNZWRpYSB9IGZyb20gJy4uL21lZGlhJztcblxuamVzdC5tb2NrKCdAdGlwdGFwL2NvcmUnLCAoKSA9PiAoe1xuICBOb2RlOiB7IGNyZWF0ZTogamVzdC5mbigoY29uZmlnKSA9PiBjb25maWcpIH0sXG4gIG1lcmdlQXR0cmlidXRlczogamVzdC5mbigoLi4uYXJncykgPT4gT2JqZWN0LmFzc2lnbih7fSwgLi4uYXJncykpLFxufSkpO1xuXG5qZXN0Lm1vY2soJ0B0aXB0YXAvcmVhY3QnLCAoKSA9PiAoe1xuICBOb2RlVmlld1dyYXBwZXI6ICh7IGNoaWxkcmVuIH0pID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJub2RlLXZpZXctd3JhcHBlclwiPntjaGlsZHJlbn08L2Rpdj4sXG4gIFJlYWN0Tm9kZVZpZXdSZW5kZXJlcjogamVzdC5mbigoY29tcG9uZW50KSA9PiBjb21wb25lbnQpLFxufSkpO1xuXG5qZXN0Lm1vY2soJ3JlYWN0LWRvbScsICgpID0+ICh7XG4gIHJlbmRlcjogamVzdC5mbigpLFxufSkpO1xuXG5qZXN0Lm1vY2soJy4uLy4uL2NvbXBvbmVudHMvbWVkaWEvTWVkaWFEaWFsb2cnLCAoKSA9PiAoe1xuICBfX2VzTW9kdWxlOiB0cnVlLFxuICBkZWZhdWx0OiBqZXN0LmZuKCgpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJtZWRpYS1kaWFsb2dcIiAvPiksXG59KSk7XG5cbmplc3QubW9jaygnLi4vLi4vY29tcG9uZW50cy9tZWRpYS9NZWRpYVRvb2xiYXInLCAoKSA9PiAoe1xuICBfX2VzTW9kdWxlOiB0cnVlLFxuICBkZWZhdWx0OiBqZXN0LmZuKCgpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJtZWRpYS10b29sYmFyXCIgLz4pLFxufSkpO1xuXG5kZXNjcmliZSgnTWVkaWEnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdjb25maWd1cmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdoYXMgY29ycmVjdCBuYW1lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KE1lZGlhLm5hbWUpLnRvQmUoJ21lZGlhJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXMgaW5saW5lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KE1lZGlhLmlubGluZSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBpbiBpbmxpbmUgZ3JvdXAnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoTWVkaWEuZ3JvdXApLnRvQmUoJ2lubGluZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIGF0b21pYycsICgpID0+IHtcbiAgICAgIGV4cGVjdChNZWRpYS5hdG9tKS50b0JlKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkQXR0cmlidXRlcycsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBhbGwgbWVkaWEgYXR0cmlidXRlcyB3aXRoIGRlZmF1bHRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IE1lZGlhLmFkZEF0dHJpYnV0ZXMoKTtcblxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCd0eXBlJyk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcykudG9IYXZlUHJvcGVydHkoJ3NyYycpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCd3aWR0aCcpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCdoZWlnaHQnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgndGl0bGUnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgnc3RhcnRzJyk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcykudG9IYXZlUHJvcGVydHkoJ2VuZHMnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgnZWRpdGluZycpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCd0YWcnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgndXJsJyk7XG5cbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzLnR5cGUuZGVmYXVsdCkudG9CZSgndmlkZW8nKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzLnNyYy5kZWZhdWx0KS50b0JlTnVsbCgpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMudGFnLmRlZmF1bHQpLnRvQmUoJ2lmcmFtZScpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMuZWRpdGluZy5kZWZhdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3BhcnNlSFRNTCcsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBwYXJzaW5nIHJ1bGVzIGZvciBpZnJhbWUgYW5kIGF1ZGlvJywgKCkgPT4ge1xuICAgICAgY29uc3QgcnVsZXMgPSBNZWRpYS5wYXJzZUhUTUwoKTtcblxuICAgICAgZXhwZWN0KEFycmF5LmlzQXJyYXkocnVsZXMpKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHJ1bGVzKS50b0hhdmVMZW5ndGgoMik7XG4gICAgICBleHBlY3QocnVsZXNbMF0udGFnKS50b0JlKCdpZnJhbWVbZGF0YS10eXBlPVwidmlkZW9cIl0nKTtcbiAgICAgIGV4cGVjdChydWxlc1sxXS50YWcpLnRvQmUoJ2F1ZGlvJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncGFyc2VzIHZpZGVvIGlmcmFtZSBhdHRyaWJ1dGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcnVsZXMgPSBNZWRpYS5wYXJzZUhUTUwoKTtcbiAgICAgIGNvbnN0IG1vY2tFbCA9IHtcbiAgICAgICAgZ2V0QXR0cmlidXRlOiBqZXN0LmZuKChhdHRyKSA9PiB7XG4gICAgICAgICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICAgICAgICBzcmM6ICdodHRwczovL3ZpZGVvLmNvbS9lbWJlZCcsXG4gICAgICAgICAgICB3aWR0aDogJzY0MCcsXG4gICAgICAgICAgICBoZWlnaHQ6ICc0ODAnLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGF0dHJzW2F0dHJdIHx8IG51bGw7XG4gICAgICAgIH0pLFxuICAgICAgICBkYXRhc2V0OiB7XG4gICAgICAgICAgdGl0bGU6ICdUZXN0IFZpZGVvJyxcbiAgICAgICAgICBzdGFydHM6ICcxMCcsXG4gICAgICAgICAgZW5kczogJzYwJyxcbiAgICAgICAgICB1cmw6ICdodHRwczovL3ZpZGVvLmNvbS93YXRjaCcsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBydWxlc1swXS5nZXRBdHRycyhtb2NrRWwpO1xuXG4gICAgICBleHBlY3QocmVzdWx0LnR5cGUpLnRvQmUoJ3ZpZGVvJyk7XG4gICAgICBleHBlY3QocmVzdWx0LnRhZykudG9CZSgnaWZyYW1lJyk7XG4gICAgICBleHBlY3QocmVzdWx0LnNyYykudG9CZSgnaHR0cHM6Ly92aWRlby5jb20vZW1iZWQnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQud2lkdGgpLnRvQmUoJzY0MCcpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5oZWlnaHQpLnRvQmUoJzQ4MCcpO1xuICAgICAgZXhwZWN0KHJlc3VsdC50aXRsZSkudG9CZSgnVGVzdCBWaWRlbycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3BhcnNlcyBhdWRpbyBlbGVtZW50IGF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBydWxlcyA9IE1lZGlhLnBhcnNlSFRNTCgpO1xuICAgICAgY29uc3QgbW9ja0VsID0ge1xuICAgICAgICBxdWVyeVNlbGVjdG9yOiBqZXN0LmZuKCgpID0+ICh7XG4gICAgICAgICAgZ2V0QXR0cmlidXRlOiBqZXN0LmZuKCgpID0+ICdodHRwczovL2F1ZGlvLmNvbS9maWxlLm1wMycpLFxuICAgICAgICB9KSksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBydWxlc1sxXS5nZXRBdHRycyhtb2NrRWwpO1xuXG4gICAgICBleHBlY3QocmVzdWx0LnR5cGUpLnRvQmUoJ2F1ZGlvJyk7XG4gICAgICBleHBlY3QocmVzdWx0LnRhZykudG9CZSgnYXVkaW8nKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuc3JjKS50b0JlKCdodHRwczovL2F1ZGlvLmNvbS9maWxlLm1wMycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVuZGVySFRNTCcsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyBhdWRpbyBlbGVtZW50IGZvciBhdWRpbyB0eXBlJywgKCkgPT4ge1xuICAgICAgY29uc3QgSFRNTEF0dHJpYnV0ZXMgPSB7XG4gICAgICAgIHRhZzogJ2F1ZGlvJyxcbiAgICAgICAgc3JjOiAndGVzdC5tcDMnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gTWVkaWEucmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pO1xuXG4gICAgICBleHBlY3QocmVzdWx0WzBdKS50b0JlKCdhdWRpbycpO1xuICAgICAgZXhwZWN0KHJlc3VsdFsxXSkudG9FcXVhbCh7IGNvbnRyb2xzOiAnY29udHJvbHMnLCBjb250cm9sc0xpc3Q6ICdub2Rvd25sb2FkJyB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMl1bMF0pLnRvQmUoJ3NvdXJjZScpO1xuICAgICAgZXhwZWN0KHJlc3VsdFsyXVsxXSkudG9FcXVhbCh7IHNyYzogJ3Rlc3QubXAzJywgdHlwZTogJ2F1ZGlvL21wMycgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBpZnJhbWUgZm9yIHZpZGVvIHR5cGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBIVE1MQXR0cmlidXRlcyA9IHtcbiAgICAgICAgdGFnOiAnaWZyYW1lJyxcbiAgICAgICAgc3JjOiAnaHR0cHM6Ly92aWRlby5jb20vZW1iZWQnLFxuICAgICAgICB3aWR0aDogJzY0MCcsXG4gICAgICAgIGhlaWdodDogJzQ4MCcsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBNZWRpYS5yZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHRbMF0pLnRvQmUoJ2lmcmFtZScpO1xuICAgICAgZXhwZWN0KHJlc3VsdFsxXSkudG9IYXZlUHJvcGVydHkoJ2RhdGEtdHlwZScsICd2aWRlbycpO1xuICAgICAgZXhwZWN0KHJlc3VsdFsxXSkudG9IYXZlUHJvcGVydHkoJ2ZyYW1lYm9yZGVyJywgJzAnKTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMV0pLnRvSGF2ZVByb3BlcnR5KCdzcmMnLCAnaHR0cHM6Ly92aWRlby5jb20vZW1iZWQnKTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMV0pLnRvSGF2ZVByb3BlcnR5KCd3aWR0aCcsICc2NDAnKTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMV0pLnRvSGF2ZVByb3BlcnR5KCdoZWlnaHQnLCAnNDgwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBpZnJhbWUgd2l0aG91dCBkaW1lbnNpb25zIGlmIG5vdCBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IEhUTUxBdHRyaWJ1dGVzID0ge1xuICAgICAgICB0YWc6ICdpZnJhbWUnLFxuICAgICAgICBzcmM6ICdodHRwczovL3ZpZGVvLmNvbS9lbWJlZCcsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBNZWRpYS5yZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHRbMV0pLm5vdC50b0hhdmVQcm9wZXJ0eSgnd2lkdGgnKTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMV0pLm5vdC50b0hhdmVQcm9wZXJ0eSgnaGVpZ2h0Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhZGRDb21tYW5kcycsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBpbnNlcnRNZWRpYSBhbmQgdXBkYXRlTWVkaWEgY29tbWFuZHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21tYW5kcyA9IE1lZGlhLmFkZENvbW1hbmRzKCk7XG5cbiAgICAgIGV4cGVjdChjb21tYW5kcykudG9IYXZlUHJvcGVydHkoJ2luc2VydE1lZGlhJyk7XG4gICAgICBleHBlY3QoY29tbWFuZHMpLnRvSGF2ZVByb3BlcnR5KCd1cGRhdGVNZWRpYScpO1xuICAgICAgZXhwZWN0KHR5cGVvZiBjb21tYW5kcy5pbnNlcnRNZWRpYSkudG9CZSgnZnVuY3Rpb24nKTtcbiAgICAgIGV4cGVjdCh0eXBlb2YgY29tbWFuZHMudXBkYXRlTWVkaWEpLnRvQmUoJ2Z1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5zZXJ0TWVkaWEgaW5zZXJ0cyBjb250ZW50IHdpdGggYXR0cmlidXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB7IG5hbWU6ICdtZWRpYScgfTtcbiAgICAgIGNvbnN0IGNvbW1hbmRzID0gTWVkaWEuYWRkQ29tbWFuZHMuY2FsbChjb250ZXh0KTtcbiAgICAgIGNvbnN0IG1vY2tDb21tYW5kcyA9IHtcbiAgICAgICAgaW5zZXJ0Q29udGVudDogamVzdC5mbigoKSA9PiB0cnVlKSxcbiAgICAgIH07XG4gICAgICBjb25zdCBhdHRycyA9IHsgdHlwZTogJ3ZpZGVvJywgc3JjOiAndGVzdC5tcDQnIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbW1hbmRzLmluc2VydE1lZGlhKGF0dHJzKSh7IGNvbW1hbmRzOiBtb2NrQ29tbWFuZHMgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrQ29tbWFuZHMuaW5zZXJ0Q29udGVudCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgICB0eXBlOiAnbWVkaWEnLFxuICAgICAgICBhdHRycyxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCd1cGRhdGVNZWRpYSB1cGRhdGVzIGF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0ID0geyBuYW1lOiAnbWVkaWEnIH07XG4gICAgICBjb25zdCBjb21tYW5kcyA9IE1lZGlhLmFkZENvbW1hbmRzLmNhbGwoY29udGV4dCk7XG4gICAgICBjb25zdCBtb2NrQ29tbWFuZHMgPSB7XG4gICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXM6IGplc3QuZm4oKCkgPT4gdHJ1ZSksXG4gICAgICB9O1xuICAgICAgY29uc3QgYXR0cnMgPSB7IHdpZHRoOiAnODAwJyB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBjb21tYW5kcy51cGRhdGVNZWRpYShhdHRycykoeyBjb21tYW5kczogbW9ja0NvbW1hbmRzIH0pO1xuXG4gICAgICBleHBlY3QobW9ja0NvbW1hbmRzLnVwZGF0ZUF0dHJpYnV0ZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdtZWRpYScsIGF0dHJzKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhZGROb2RlVmlldycsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBSZWFjdE5vZGVWaWV3UmVuZGVyZXIgcmVzdWx0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gTWVkaWEuYWRkTm9kZVZpZXcoKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2luc2VydERpYWxvZycsICgpID0+IHtcbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAnJztcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2F1dG8nO1xuICB9KTtcblxuICBpdCgnY3JlYXRlcyBkaWFsb2cgZWxlbWVudCcsICgpID0+IHtcbiAgICBjb25zdCBtb2NrQ2FsbGJhY2sgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICB0eXBlOiAndmlkZW8nLFxuICAgICAgY2FsbGJhY2s6IG1vY2tDYWxsYmFjayxcbiAgICAgIG9wdGlvbnM6IHt9LFxuICAgIH07XG5cbiAgICBpbnNlcnREaWFsb2cocHJvcHMpO1xuXG4gICAgY29uc3QgZGlhbG9nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmluc2VydC1tZWRpYS1kaWFsb2cnKTtcbiAgICBleHBlY3QoZGlhbG9nKS50b0JlVHJ1dGh5KCk7XG4gIH0pO1xuXG4gIGl0KCdzZXRzIGJvZHkgb3ZlcmZsb3cgdG8gaGlkZGVuJywgKCkgPT4ge1xuICAgIGNvbnN0IG1vY2tDYWxsYmFjayA9IGplc3QuZm4oKTtcbiAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgIHR5cGU6ICd2aWRlbycsXG4gICAgICBjYWxsYmFjazogbW9ja0NhbGxiYWNrLFxuICAgICAgb3B0aW9uczoge30sXG4gICAgfTtcblxuICAgIGluc2VydERpYWxvZyhwcm9wcyk7XG5cbiAgICBleHBlY3QoZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdykudG9CZSgnaGlkZGVuJyk7XG4gIH0pO1xuXG4gIGl0KCdyZW1vdmVzIHByZXZpb3VzIGRpYWxvZ3MnLCAoKSA9PiB7XG4gICAgY29uc3QgZXhpc3RpbmdEaWFsb2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBleGlzdGluZ0RpYWxvZy5jbGFzc05hbWUgPSAnaW5zZXJ0LW1lZGlhLWRpYWxvZyc7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChleGlzdGluZ0RpYWxvZyk7XG5cbiAgICBjb25zdCBtb2NrQ2FsbGJhY2sgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICB0eXBlOiAndmlkZW8nLFxuICAgICAgY2FsbGJhY2s6IG1vY2tDYWxsYmFjayxcbiAgICAgIG9wdGlvbnM6IHt9LFxuICAgIH07XG5cbiAgICBpbnNlcnREaWFsb2cocHJvcHMpO1xuXG4gICAgY29uc3QgZGlhbG9ncyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pbnNlcnQtbWVkaWEtZGlhbG9nJyk7XG4gICAgZXhwZWN0KGRpYWxvZ3MpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgfSk7XG59KTtcblxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBRUFDLElBQUksQ0FBQ0MsSUFBSSxDQUFDLGNBQWMsRUFBRTtFQUFBLE9BQU87SUFDL0JDLElBQUksRUFBRTtNQUFFQyxNQUFNLEVBQUVILElBQUksQ0FBQ0ksRUFBRSxDQUFDLFVBQUNDLE1BQU07UUFBQSxPQUFLQSxNQUFNO01BQUE7SUFBRSxDQUFDO0lBQzdDQyxlQUFlLEVBQUVOLElBQUksQ0FBQ0ksRUFBRSxDQUFDO01BQUEsU0FBQUcsSUFBQSxHQUFBQyxTQUFBLENBQUFDLE1BQUEsRUFBSUMsSUFBSSxPQUFBQyxLQUFBLENBQUFKLElBQUEsR0FBQUssSUFBQSxNQUFBQSxJQUFBLEdBQUFMLElBQUEsRUFBQUssSUFBQTtRQUFKRixJQUFJLENBQUFFLElBQUEsSUFBQUosU0FBQSxDQUFBSSxJQUFBO01BQUE7TUFBQSxPQUFLQyxNQUFNLENBQUNDLE1BQU0sQ0FBQUMsS0FBQSxDQUFiRixNQUFNLEdBQVEsQ0FBQyxDQUFDLEVBQUFHLE1BQUEsQ0FBS04sSUFBSSxFQUFDO0lBQUE7RUFDbEUsQ0FBQztBQUFBLENBQUMsQ0FBQztBQUVIVixJQUFJLENBQUNDLElBQUksQ0FBQyxlQUFlLEVBQUU7RUFBQSxPQUFPO0lBQ2hDZ0IsZUFBZSxFQUFFLFNBQWpCQSxl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
|