@pie-element/drawing-response 10.0.1 → 10.2.0-mui-update.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/CHANGELOG.md +74 -0
- package/configure/CHANGELOG.md +74 -0
- package/configure/lib/__tests__/image-container.test.js +176 -0
- package/configure/lib/__tests__/index.test.js +53 -0
- package/configure/lib/__tests__/root.test.js +84 -0
- package/configure/lib/button.js +24 -48
- package/configure/lib/button.js.map +1 -1
- package/configure/lib/defaults.js +3 -4
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/image-container.js +239 -328
- package/configure/lib/image-container.js.map +1 -1
- package/configure/lib/index.js +116 -183
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/root.js +195 -261
- package/configure/lib/root.js.map +1 -1
- package/configure/package.json +9 -7
- package/configure/src/__tests__/index.test.js +10 -4
- package/configure/src/button.jsx +14 -24
- package/configure/src/image-container.jsx +73 -77
- package/configure/src/index.js +12 -2
- package/configure/src/root.jsx +24 -25
- package/controller/CHANGELOG.md +32 -0
- package/controller/lib/__tests__/index.test.js +177 -0
- package/controller/lib/defaults.js +3 -4
- package/controller/lib/defaults.js.map +1 -1
- package/controller/lib/index.js +40 -66
- package/controller/lib/index.js.map +1 -1
- package/controller/package.json +1 -1
- package/docs/demo/pie.manifest.json +11 -0
- package/lib/__tests__/drawing-index-test.js +36 -0
- package/lib/drawing-response/__tests__/container.test.js +66 -0
- package/lib/drawing-response/__tests__/drawable-helper.test.js +23 -0
- package/lib/drawing-response/__tests__/drawing-main.test.js +684 -0
- package/lib/drawing-response/__tests__/factory.test.js +15 -0
- package/lib/drawing-response/button.js +36 -61
- package/lib/drawing-response/button.js.map +1 -1
- package/lib/drawing-response/constants.js +3 -4
- package/lib/drawing-response/constants.js.map +1 -1
- package/lib/drawing-response/container.js +271 -352
- package/lib/drawing-response/container.js.map +1 -1
- package/lib/drawing-response/drawable-circle.js +66 -105
- package/lib/drawing-response/drawable-circle.js.map +1 -1
- package/lib/drawing-response/drawable-eraser.js +51 -87
- package/lib/drawing-response/drawable-eraser.js.map +1 -1
- package/lib/drawing-response/drawable-free-path.js +57 -98
- package/lib/drawing-response/drawable-free-path.js.map +1 -1
- package/lib/drawing-response/drawable-helper.js +17 -29
- package/lib/drawing-response/drawable-helper.js.map +1 -1
- package/lib/drawing-response/drawable-image.js +31 -50
- package/lib/drawing-response/drawable-image.js.map +1 -1
- package/lib/drawing-response/drawable-line.js +61 -100
- package/lib/drawing-response/drawable-line.js.map +1 -1
- package/lib/drawing-response/drawable-main.js +274 -346
- package/lib/drawing-response/drawable-main.js.map +1 -1
- package/lib/drawing-response/drawable-palette.js +124 -167
- package/lib/drawing-response/drawable-palette.js.map +1 -1
- package/lib/drawing-response/drawable-rectangle.js +66 -105
- package/lib/drawing-response/drawable-rectangle.js.map +1 -1
- package/lib/drawing-response/drawable-text.js +202 -314
- package/lib/drawing-response/drawable-text.js.map +1 -1
- package/lib/drawing-response/drawable-transformer.js +37 -80
- package/lib/drawing-response/drawable-transformer.js.map +1 -1
- package/lib/drawing-response/factory.js +7 -20
- package/lib/drawing-response/factory.js.map +1 -1
- package/lib/drawing-response/icon.js +9 -25
- package/lib/drawing-response/icon.js.map +1 -1
- package/lib/drawing-response/index.js +75 -117
- package/lib/drawing-response/index.js.map +1 -1
- package/lib/index.js +52 -103
- package/lib/index.js.map +1 -1
- package/package.json +14 -29
- package/src/drawing-response/button.jsx +23 -34
- package/src/drawing-response/container.jsx +39 -40
- package/src/drawing-response/drawable-image.jsx +17 -20
- package/src/drawing-response/drawable-main.jsx +67 -60
- package/src/drawing-response/drawable-palette.jsx +48 -54
- package/src/drawing-response/drawable-text.jsx +26 -38
- package/src/drawing-response/index.jsx +21 -20
- package/src/index.js +17 -2
- package/LICENSE.md +0 -5
- package/configure/node_modules/debug/CHANGELOG.md +0 -395
- package/configure/node_modules/debug/LICENSE +0 -19
- package/configure/node_modules/debug/README.md +0 -437
- package/configure/node_modules/debug/node.js +0 -1
- package/configure/node_modules/debug/package.json +0 -51
- package/configure/node_modules/debug/src/browser.js +0 -180
- package/configure/node_modules/debug/src/common.js +0 -249
- package/configure/node_modules/debug/src/index.js +0 -12
- package/configure/node_modules/debug/src/node.js +0 -177
- package/esm/configure.js +0 -11856
- package/esm/configure.js.map +0 -1
- package/esm/controller.js +0 -108
- package/esm/controller.js.map +0 -1
- package/esm/element.js +0 -49111
- package/esm/element.js.map +0 -1
|
@@ -0,0 +1,684 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _react = _interopRequireDefault(require("react"));
|
|
5
|
+
var _enzyme = require("enzyme");
|
|
6
|
+
var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
|
|
7
|
+
var _drawableFreePath = _interopRequireDefault(require("../drawable-free-path"));
|
|
8
|
+
var _drawableLine = _interopRequireDefault(require("../drawable-line"));
|
|
9
|
+
var _drawableRectangle = _interopRequireDefault(require("../drawable-rectangle"));
|
|
10
|
+
var _drawableCircle = _interopRequireDefault(require("../drawable-circle"));
|
|
11
|
+
var _drawableEraser = _interopRequireDefault(require("../drawable-eraser"));
|
|
12
|
+
var _drawableText = _interopRequireDefault(require("../drawable-text"));
|
|
13
|
+
var _drawableMain = require("../drawable-main");
|
|
14
|
+
const drawableClasses = {
|
|
15
|
+
FreePathDrawable: _drawableFreePath.default,
|
|
16
|
+
LineDrawable: _drawableLine.default,
|
|
17
|
+
RectangleDrawable: _drawableRectangle.default,
|
|
18
|
+
CircleDrawable: _drawableCircle.default,
|
|
19
|
+
EraserDrawable: _drawableEraser.default,
|
|
20
|
+
DrawableText: _drawableText.default
|
|
21
|
+
};
|
|
22
|
+
describe('DrawingResponse', () => {
|
|
23
|
+
let element;
|
|
24
|
+
let wrapper;
|
|
25
|
+
const mkWrapper = (type, props, WrapperEl) => {
|
|
26
|
+
element = new drawableClasses[type](props);
|
|
27
|
+
let content = element.render(props);
|
|
28
|
+
if (WrapperEl) {
|
|
29
|
+
content = /*#__PURE__*/_react.default.createElement(WrapperEl, null, content);
|
|
30
|
+
}
|
|
31
|
+
return (0, _enzyme.shallow)(content);
|
|
32
|
+
};
|
|
33
|
+
describe('DrawableMain', () => {
|
|
34
|
+
let onSessionChange = jest.fn();
|
|
35
|
+
const TextEntry = new _drawableText.default();
|
|
36
|
+
const wrapperMain = (extras, renderOpts) => {
|
|
37
|
+
const defaults = {
|
|
38
|
+
classes: {},
|
|
39
|
+
disabled: false,
|
|
40
|
+
className: 'className',
|
|
41
|
+
onSessionChange,
|
|
42
|
+
imageDimensions: {},
|
|
43
|
+
imageUrl: 'url',
|
|
44
|
+
drawableDimensions: {
|
|
45
|
+
height: 350,
|
|
46
|
+
width: 353
|
|
47
|
+
},
|
|
48
|
+
fillColor: 'white',
|
|
49
|
+
outlineColor: 'black',
|
|
50
|
+
paintColor: 'red',
|
|
51
|
+
session: {},
|
|
52
|
+
toolActive: {
|
|
53
|
+
type: 'Select',
|
|
54
|
+
label: 'Select',
|
|
55
|
+
icon: 'mdiCursorDefault'
|
|
56
|
+
},
|
|
57
|
+
TextEntry
|
|
58
|
+
};
|
|
59
|
+
const props = {
|
|
60
|
+
...defaults,
|
|
61
|
+
...extras
|
|
62
|
+
};
|
|
63
|
+
return (0, _enzyme.shallow)(/*#__PURE__*/_react.default.createElement(_drawableMain.DrawableMain, props), {
|
|
64
|
+
...renderOpts
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
describe('snapshot', () => {
|
|
68
|
+
it('renders', () => {
|
|
69
|
+
const w = wrapperMain();
|
|
70
|
+
expect(w).toMatchSnapshot();
|
|
71
|
+
});
|
|
72
|
+
it('renders disabled', () => {
|
|
73
|
+
const w = wrapperMain({
|
|
74
|
+
disabled: true
|
|
75
|
+
});
|
|
76
|
+
expect(w).toMatchSnapshot();
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe('logic', () => {
|
|
80
|
+
const handleSessionChange = jest.fn();
|
|
81
|
+
const forceUpdate = jest.fn();
|
|
82
|
+
const props = {
|
|
83
|
+
handleSessionChange,
|
|
84
|
+
forceUpdate,
|
|
85
|
+
paint: true,
|
|
86
|
+
paintColor: 'green',
|
|
87
|
+
startx: 200,
|
|
88
|
+
starty: 200,
|
|
89
|
+
x: 300,
|
|
90
|
+
y: 300,
|
|
91
|
+
createdAt: new Date()
|
|
92
|
+
};
|
|
93
|
+
it('handleUndo', () => {
|
|
94
|
+
const w = wrapperMain();
|
|
95
|
+
w.setState({
|
|
96
|
+
drawables: [new _drawableRectangle.default(props), new _drawableRectangle.default(props)]
|
|
97
|
+
});
|
|
98
|
+
w.instance().handleUndo();
|
|
99
|
+
expect(w.state('drawables').length).toEqual(1);
|
|
100
|
+
w.instance().handleUndo();
|
|
101
|
+
expect(w.state('drawables')).toEqual([]);
|
|
102
|
+
});
|
|
103
|
+
it('handleClearAll', () => {
|
|
104
|
+
const w = wrapperMain();
|
|
105
|
+
w.setState({
|
|
106
|
+
drawables: [new _drawableRectangle.default(props), new _drawableRectangle.default(props)]
|
|
107
|
+
});
|
|
108
|
+
w.instance().handleClearAll();
|
|
109
|
+
expect(w.state('drawables')).toEqual([]);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
describe('CircleDrawable', () => {
|
|
114
|
+
let handleSessionChange = jest.fn();
|
|
115
|
+
let forceUpdate = jest.fn();
|
|
116
|
+
let props;
|
|
117
|
+
beforeEach(() => {
|
|
118
|
+
props = {
|
|
119
|
+
handleSessionChange,
|
|
120
|
+
forceUpdate,
|
|
121
|
+
paint: true,
|
|
122
|
+
paintColor: 'green',
|
|
123
|
+
startx: 200,
|
|
124
|
+
starty: 200,
|
|
125
|
+
x: 300,
|
|
126
|
+
y: 200,
|
|
127
|
+
createdAt: new Date()
|
|
128
|
+
};
|
|
129
|
+
wrapper = mkWrapper('CircleDrawable', props);
|
|
130
|
+
});
|
|
131
|
+
describe('snapshot', () => {
|
|
132
|
+
it('renders', () => {
|
|
133
|
+
expect(wrapper).toMatchSnapshot();
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
describe('logic', () => {
|
|
137
|
+
it('calls forceUpdate', () => {
|
|
138
|
+
wrapper.simulate('click');
|
|
139
|
+
expect(forceUpdate).toHaveBeenCalled();
|
|
140
|
+
});
|
|
141
|
+
it('changes x and y', () => {
|
|
142
|
+
element.registerMovement(400, 400);
|
|
143
|
+
expect(element.x).toEqual(400);
|
|
144
|
+
expect(element.y).toEqual(400);
|
|
145
|
+
});
|
|
146
|
+
it('changes session when needed', () => {
|
|
147
|
+
const event = {
|
|
148
|
+
target: {
|
|
149
|
+
getX: jest.fn().mockReturnValue(300),
|
|
150
|
+
getY: jest.fn().mockReturnValue(300)
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
element.handleDragEnd(props, event);
|
|
154
|
+
expect(event.target.getX).toHaveBeenCalled();
|
|
155
|
+
expect(event.target.getY).toHaveBeenCalled();
|
|
156
|
+
expect(handleSessionChange).toHaveBeenCalled();
|
|
157
|
+
});
|
|
158
|
+
it('changes startx and starty', () => {
|
|
159
|
+
const event = {
|
|
160
|
+
target: {
|
|
161
|
+
getX: jest.fn().mockReturnValue(300),
|
|
162
|
+
getY: jest.fn().mockReturnValue(300)
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
element.handleDragEnd(props, event);
|
|
166
|
+
expect(element.startx).toEqual(300);
|
|
167
|
+
expect(element.starty).toEqual(300);
|
|
168
|
+
expect(element.x).toEqual(400);
|
|
169
|
+
expect(element.y).toEqual(300);
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
describe('EraserDrawable', () => {
|
|
174
|
+
let handleSessionChange = jest.fn();
|
|
175
|
+
let forceUpdate = jest.fn();
|
|
176
|
+
let props;
|
|
177
|
+
beforeEach(() => {
|
|
178
|
+
props = {
|
|
179
|
+
handleSessionChange,
|
|
180
|
+
forceUpdate,
|
|
181
|
+
points: [200, 200, 300, 300],
|
|
182
|
+
posX: 200,
|
|
183
|
+
posY: 200,
|
|
184
|
+
startx: 200,
|
|
185
|
+
starty: 200,
|
|
186
|
+
createdAt: new Date()
|
|
187
|
+
};
|
|
188
|
+
wrapper = mkWrapper('EraserDrawable', props);
|
|
189
|
+
});
|
|
190
|
+
describe('snapshot', () => {
|
|
191
|
+
it('renders', () => {
|
|
192
|
+
expect(wrapper).toMatchSnapshot();
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
describe('logic', () => {
|
|
196
|
+
it('changes points', () => {
|
|
197
|
+
element.registerMovement(400, 400);
|
|
198
|
+
expect(element.points).toEqual([200, 200, 300, 300, 400, 400]);
|
|
199
|
+
});
|
|
200
|
+
it('changes session when needed', () => {
|
|
201
|
+
const event = {
|
|
202
|
+
target: {
|
|
203
|
+
getX: jest.fn().mockReturnValue(300),
|
|
204
|
+
getY: jest.fn().mockReturnValue(300)
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
element.handleDragEnd(props, event);
|
|
208
|
+
expect(event.target.getX).toHaveBeenCalled();
|
|
209
|
+
expect(event.target.getY).toHaveBeenCalled();
|
|
210
|
+
expect(handleSessionChange).toHaveBeenCalled();
|
|
211
|
+
});
|
|
212
|
+
it('changes posX and posY', () => {
|
|
213
|
+
const event = {
|
|
214
|
+
target: {
|
|
215
|
+
getX: jest.fn().mockReturnValue(300),
|
|
216
|
+
getY: jest.fn().mockReturnValue(300)
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
element.handleDragEnd(props, event);
|
|
220
|
+
expect(element.posX).toEqual(300);
|
|
221
|
+
expect(element.posY).toEqual(300);
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
describe('FreePathDrawable', () => {
|
|
226
|
+
let handleSessionChange = jest.fn();
|
|
227
|
+
let forceUpdate = jest.fn();
|
|
228
|
+
let props;
|
|
229
|
+
beforeEach(() => {
|
|
230
|
+
props = {
|
|
231
|
+
handleSessionChange,
|
|
232
|
+
forceUpdate,
|
|
233
|
+
paint: true,
|
|
234
|
+
paintColor: 'green',
|
|
235
|
+
points: [200, 200, 300, 300],
|
|
236
|
+
posX: 200,
|
|
237
|
+
posY: 200,
|
|
238
|
+
startx: 200,
|
|
239
|
+
starty: 200,
|
|
240
|
+
createdAt: new Date()
|
|
241
|
+
};
|
|
242
|
+
wrapper = mkWrapper('FreePathDrawable', props);
|
|
243
|
+
});
|
|
244
|
+
describe('snapshot', () => {
|
|
245
|
+
it('renders', () => {
|
|
246
|
+
expect(wrapper).toMatchSnapshot();
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
describe('logic', () => {
|
|
250
|
+
it('calls forceUpdate', () => {
|
|
251
|
+
wrapper.simulate('click');
|
|
252
|
+
expect(forceUpdate).toHaveBeenCalled();
|
|
253
|
+
});
|
|
254
|
+
it('changes points', () => {
|
|
255
|
+
element.registerMovement(400, 400);
|
|
256
|
+
expect(element.points).toEqual([200, 200, 300, 300, 400, 400]);
|
|
257
|
+
});
|
|
258
|
+
it('changes session when needed', () => {
|
|
259
|
+
const spy = jest.spyOn(element, 'handleDragEnd');
|
|
260
|
+
const event = {
|
|
261
|
+
target: {
|
|
262
|
+
getX: jest.fn().mockReturnValue(300),
|
|
263
|
+
getY: jest.fn().mockReturnValue(300)
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
element.handleDragEnd(props, event);
|
|
267
|
+
expect(event.target.getX).toHaveBeenCalled();
|
|
268
|
+
expect(event.target.getY).toHaveBeenCalled();
|
|
269
|
+
expect(handleSessionChange).toHaveBeenCalled();
|
|
270
|
+
});
|
|
271
|
+
it('changes posX and posY', () => {
|
|
272
|
+
const event = {
|
|
273
|
+
target: {
|
|
274
|
+
getX: jest.fn().mockReturnValue(300),
|
|
275
|
+
getY: jest.fn().mockReturnValue(300)
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
element.handleDragEnd(props, event);
|
|
279
|
+
expect(element.posX).toEqual(300);
|
|
280
|
+
expect(element.posY).toEqual(300);
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
describe('LineDrawable', () => {
|
|
285
|
+
let handleSessionChange = jest.fn();
|
|
286
|
+
let forceUpdate = jest.fn();
|
|
287
|
+
let props;
|
|
288
|
+
beforeEach(() => {
|
|
289
|
+
props = {
|
|
290
|
+
handleSessionChange,
|
|
291
|
+
forceUpdate,
|
|
292
|
+
paint: true,
|
|
293
|
+
paintColor: 'green',
|
|
294
|
+
startx: 200,
|
|
295
|
+
starty: 200,
|
|
296
|
+
posX: 200,
|
|
297
|
+
posY: 200,
|
|
298
|
+
x: 300,
|
|
299
|
+
y: 200,
|
|
300
|
+
createdAt: new Date()
|
|
301
|
+
};
|
|
302
|
+
wrapper = mkWrapper('LineDrawable', props);
|
|
303
|
+
});
|
|
304
|
+
describe('snapshot', () => {
|
|
305
|
+
it('renders', () => {
|
|
306
|
+
expect(wrapper).toMatchSnapshot();
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
describe('logic', () => {
|
|
310
|
+
it('calls forceUpdate', () => {
|
|
311
|
+
wrapper.simulate('click');
|
|
312
|
+
expect(forceUpdate).toHaveBeenCalled();
|
|
313
|
+
});
|
|
314
|
+
it('changes x and y', () => {
|
|
315
|
+
element.registerMovement(400, 400);
|
|
316
|
+
expect(element.x).toEqual(400);
|
|
317
|
+
expect(element.y).toEqual(400);
|
|
318
|
+
});
|
|
319
|
+
it('changes session when needed', () => {
|
|
320
|
+
const event = {
|
|
321
|
+
target: {
|
|
322
|
+
getX: jest.fn().mockReturnValue(300),
|
|
323
|
+
getY: jest.fn().mockReturnValue(300)
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
element.handleDragEnd(props, event);
|
|
327
|
+
expect(event.target.getX).toHaveBeenCalled();
|
|
328
|
+
expect(event.target.getY).toHaveBeenCalled();
|
|
329
|
+
expect(handleSessionChange).toHaveBeenCalled();
|
|
330
|
+
});
|
|
331
|
+
it('changes posX and posY', () => {
|
|
332
|
+
const event = {
|
|
333
|
+
target: {
|
|
334
|
+
getX: jest.fn().mockReturnValue(300),
|
|
335
|
+
getY: jest.fn().mockReturnValue(300)
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
element.handleDragEnd(props, event);
|
|
339
|
+
expect(element.posX).toEqual(300);
|
|
340
|
+
expect(element.posY).toEqual(300);
|
|
341
|
+
});
|
|
342
|
+
});
|
|
343
|
+
});
|
|
344
|
+
describe('RectangleDrawable', () => {
|
|
345
|
+
let handleSessionChange = jest.fn();
|
|
346
|
+
let forceUpdate = jest.fn();
|
|
347
|
+
let props;
|
|
348
|
+
beforeEach(() => {
|
|
349
|
+
props = {
|
|
350
|
+
handleSessionChange,
|
|
351
|
+
forceUpdate,
|
|
352
|
+
paint: true,
|
|
353
|
+
paintColor: 'green',
|
|
354
|
+
startx: 200,
|
|
355
|
+
starty: 200,
|
|
356
|
+
x: 300,
|
|
357
|
+
y: 300,
|
|
358
|
+
createdAt: new Date()
|
|
359
|
+
};
|
|
360
|
+
wrapper = mkWrapper('RectangleDrawable', props);
|
|
361
|
+
});
|
|
362
|
+
describe('snapshot', () => {
|
|
363
|
+
it('renders', () => {
|
|
364
|
+
expect(wrapper).toMatchSnapshot();
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
describe('logic', () => {
|
|
368
|
+
it('calls forceUpdate', () => {
|
|
369
|
+
wrapper.simulate('click');
|
|
370
|
+
expect(forceUpdate).toHaveBeenCalled();
|
|
371
|
+
});
|
|
372
|
+
it('changes x and y', () => {
|
|
373
|
+
element.registerMovement(400, 400);
|
|
374
|
+
expect(element.x).toEqual(400);
|
|
375
|
+
expect(element.y).toEqual(400);
|
|
376
|
+
});
|
|
377
|
+
it('changes session when needed', () => {
|
|
378
|
+
const event = {
|
|
379
|
+
target: {
|
|
380
|
+
getX: jest.fn().mockReturnValue(300),
|
|
381
|
+
getY: jest.fn().mockReturnValue(300)
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
element.handleDragEnd(props, event);
|
|
385
|
+
expect(event.target.getX).toHaveBeenCalled();
|
|
386
|
+
expect(event.target.getY).toHaveBeenCalled();
|
|
387
|
+
expect(handleSessionChange).toHaveBeenCalled();
|
|
388
|
+
});
|
|
389
|
+
it('changes posX and posY', () => {
|
|
390
|
+
const event = {
|
|
391
|
+
target: {
|
|
392
|
+
getX: jest.fn().mockReturnValue(300),
|
|
393
|
+
getY: jest.fn().mockReturnValue(300)
|
|
394
|
+
}
|
|
395
|
+
};
|
|
396
|
+
element.handleDragEnd(props, event);
|
|
397
|
+
expect(element.startx).toEqual(300);
|
|
398
|
+
expect(element.starty).toEqual(300);
|
|
399
|
+
expect(element.x).toEqual(400);
|
|
400
|
+
expect(element.y).toEqual(400);
|
|
401
|
+
});
|
|
402
|
+
});
|
|
403
|
+
});
|
|
404
|
+
describe('DrawableText', () => {
|
|
405
|
+
const all = [{
|
|
406
|
+
id: 'gcifqhhimf8k2d6g8hs',
|
|
407
|
+
isDefault: true,
|
|
408
|
+
label: 'Double click to edit this text. Press Enter to submit.',
|
|
409
|
+
value: 'This is what the user entered',
|
|
410
|
+
width: 200,
|
|
411
|
+
x: 2 * 5 + 50,
|
|
412
|
+
y: 2 * 5 + 50,
|
|
413
|
+
textVisible: true,
|
|
414
|
+
transformerVisible: true,
|
|
415
|
+
textareaVisible: false,
|
|
416
|
+
createdAt: new Date(),
|
|
417
|
+
type: 'text-entry'
|
|
418
|
+
}];
|
|
419
|
+
let handleSessionChange = jest.fn();
|
|
420
|
+
let forceUpdate = jest.fn();
|
|
421
|
+
let toggleTextSelected = jest.fn();
|
|
422
|
+
let props;
|
|
423
|
+
let stage;
|
|
424
|
+
beforeEach(() => {
|
|
425
|
+
stage = {
|
|
426
|
+
on: jest.fn(),
|
|
427
|
+
off: jest.fn()
|
|
428
|
+
};
|
|
429
|
+
props = {
|
|
430
|
+
all,
|
|
431
|
+
handleSessionChange,
|
|
432
|
+
forceUpdate,
|
|
433
|
+
stage,
|
|
434
|
+
toggleTextSelected,
|
|
435
|
+
paint: true,
|
|
436
|
+
paintColor: 'green',
|
|
437
|
+
startx: 200,
|
|
438
|
+
starty: 200,
|
|
439
|
+
x: 300,
|
|
440
|
+
y: 300,
|
|
441
|
+
scale: 1
|
|
442
|
+
};
|
|
443
|
+
wrapper = mkWrapper('DrawableText', props, 'div');
|
|
444
|
+
});
|
|
445
|
+
describe('snapshot', () => {
|
|
446
|
+
it('renders', () => {
|
|
447
|
+
expect(wrapper).toMatchSnapshot();
|
|
448
|
+
});
|
|
449
|
+
it('renders textAreas', () => {
|
|
450
|
+
element = new drawableClasses['DrawableText'](props);
|
|
451
|
+
wrapper = (0, _enzyme.shallow)(/*#__PURE__*/_react.default.createElement("div", null, element.renderTextareas()));
|
|
452
|
+
expect(wrapper).toMatchSnapshot();
|
|
453
|
+
});
|
|
454
|
+
});
|
|
455
|
+
describe('snapshot when there is no value', () => {
|
|
456
|
+
beforeEach(() => {
|
|
457
|
+
props.all.forEach(a => {
|
|
458
|
+
delete a.value;
|
|
459
|
+
});
|
|
460
|
+
wrapper = mkWrapper('DrawableText', props, 'div');
|
|
461
|
+
});
|
|
462
|
+
it('renders', () => {
|
|
463
|
+
expect(wrapper).toMatchSnapshot();
|
|
464
|
+
});
|
|
465
|
+
});
|
|
466
|
+
describe('logic', () => {
|
|
467
|
+
it('shoud change the all property and call forceUpdate', () => {
|
|
468
|
+
element.setAll([]);
|
|
469
|
+
expect(element.all).toEqual([]);
|
|
470
|
+
expect(forceUpdate).toHaveBeenCalled();
|
|
471
|
+
});
|
|
472
|
+
describe('addNewTextEntry', () => {
|
|
473
|
+
it('shoud add a new element and call the appropriate functions', () => {
|
|
474
|
+
element.addNewTextEntry();
|
|
475
|
+
expect(element.all.length).toEqual(2);
|
|
476
|
+
expect(element.all).toEqual(expect.arrayContaining([expect.objectContaining({
|
|
477
|
+
isDefault: true,
|
|
478
|
+
label: 'Double click to edit this text. Press Enter to submit.',
|
|
479
|
+
width: 200,
|
|
480
|
+
textVisible: true,
|
|
481
|
+
transformerVisible: true,
|
|
482
|
+
textareaVisible: false,
|
|
483
|
+
type: 'text-entry'
|
|
484
|
+
})]));
|
|
485
|
+
expect(stage.on).toHaveBeenCalled();
|
|
486
|
+
expect(handleSessionChange).toHaveBeenCalled();
|
|
487
|
+
});
|
|
488
|
+
});
|
|
489
|
+
describe('showOnlyTextNodes', () => {
|
|
490
|
+
it('should change properties for the "all" array', () => {
|
|
491
|
+
element.showOnlyTextNodes();
|
|
492
|
+
expect(element.all).toEqual(expect.arrayContaining([expect.objectContaining({
|
|
493
|
+
textVisible: true,
|
|
494
|
+
transformerVisible: false,
|
|
495
|
+
textareaVisible: false
|
|
496
|
+
})]));
|
|
497
|
+
});
|
|
498
|
+
});
|
|
499
|
+
describe('showOnltoggleTextareayTextNodes', () => {
|
|
500
|
+
it('should change the item with the right id in the "all" array and call forceUpdate', () => {
|
|
501
|
+
element.toggleTextarea('gcifqhhimf8k2d6g8hs', true);
|
|
502
|
+
expect(element.all[0]).toEqual(expect.objectContaining({
|
|
503
|
+
textVisible: false,
|
|
504
|
+
transformerVisible: false,
|
|
505
|
+
textareaVisible: true
|
|
506
|
+
}));
|
|
507
|
+
expect(forceUpdate).toHaveBeenCalled();
|
|
508
|
+
element.toggleTextarea('gcifqhhimf8k2d6g8hs', false);
|
|
509
|
+
expect(element.all[0]).toEqual(expect.objectContaining({
|
|
510
|
+
textVisible: true,
|
|
511
|
+
transformerVisible: true,
|
|
512
|
+
textareaVisible: false
|
|
513
|
+
}));
|
|
514
|
+
expect(forceUpdate).toHaveBeenCalled();
|
|
515
|
+
});
|
|
516
|
+
});
|
|
517
|
+
describe('initializeDefault', () => {
|
|
518
|
+
it('should make the item with the right id default', () => {
|
|
519
|
+
element.initializeDefault('gcifqhhimf8k2d6g8hs', true);
|
|
520
|
+
expect(element.all[0]).toEqual(expect.objectContaining({
|
|
521
|
+
isDefault: false
|
|
522
|
+
}));
|
|
523
|
+
});
|
|
524
|
+
});
|
|
525
|
+
describe('saveValue', () => {
|
|
526
|
+
it('should make the item with the right id default and call handleSessionChange', () => {
|
|
527
|
+
const textNode = {
|
|
528
|
+
text: jest.fn()
|
|
529
|
+
};
|
|
530
|
+
const textareaNode = {
|
|
531
|
+
value: 'Foo bar'
|
|
532
|
+
};
|
|
533
|
+
element.saveValue('gcifqhhimf8k2d6g8hs', textNode, textareaNode);
|
|
534
|
+
expect(textNode.text).toHaveBeenCalledWith('Foo bar');
|
|
535
|
+
expect(handleSessionChange).toHaveBeenCalled();
|
|
536
|
+
textareaNode.value = '';
|
|
537
|
+
element.saveValue('gcifqhhimf8k2d6g8hs', textNode, textareaNode);
|
|
538
|
+
expect(element.all).toEqual(expect.not.arrayContaining([expect.objectContaining({
|
|
539
|
+
id: 'gcifqhhimf8k2d6g8hs'
|
|
540
|
+
})]));
|
|
541
|
+
expect(forceUpdate).toHaveBeenCalled();
|
|
542
|
+
expect(handleSessionChange).toHaveBeenCalled();
|
|
543
|
+
});
|
|
544
|
+
});
|
|
545
|
+
describe('handleMouseEvents', () => {
|
|
546
|
+
it('should call the right functions on mouse down and up', () => {
|
|
547
|
+
element.handleMouseDown();
|
|
548
|
+
expect(toggleTextSelected).toHaveBeenCalledWith(true);
|
|
549
|
+
element.handleMouseUp();
|
|
550
|
+
expect(toggleTextSelected).toHaveBeenCalledWith(false);
|
|
551
|
+
});
|
|
552
|
+
it('should call the right functions onClick', () => {
|
|
553
|
+
element.handleClick(null, 'gcifqhhimf8k2d6g8hs');
|
|
554
|
+
expect(element.all).toEqual(expect.arrayContaining([expect.objectContaining({
|
|
555
|
+
transformerVisible: true
|
|
556
|
+
})]));
|
|
557
|
+
expect(forceUpdate).toHaveBeenCalled();
|
|
558
|
+
});
|
|
559
|
+
it('should call the right functions onDblClick', () => {
|
|
560
|
+
const text = {
|
|
561
|
+
id: 'gcifqhhimf8k2d6g8hs',
|
|
562
|
+
isDefault: false
|
|
563
|
+
};
|
|
564
|
+
const textNode = element[`text_${text.id}`] = {
|
|
565
|
+
_lastPos: {
|
|
566
|
+
x: 200,
|
|
567
|
+
y: 200
|
|
568
|
+
},
|
|
569
|
+
align: jest.fn().mockReturnValue('center'),
|
|
570
|
+
fill: jest.fn().mockReturnValue('green'),
|
|
571
|
+
fontFamily: jest.fn().mockReturnValue('FooBarFamily'),
|
|
572
|
+
fontSize: jest.fn().mockReturnValue('16'),
|
|
573
|
+
height: jest.fn().mockReturnValue(40),
|
|
574
|
+
lineHeight: jest.fn().mockReturnValue('40px'),
|
|
575
|
+
padding: jest.fn().mockReturnValue(0),
|
|
576
|
+
rotation: jest.fn().mockReturnValue(0),
|
|
577
|
+
text: jest.fn().mockReturnValue('foo bar'),
|
|
578
|
+
width: jest.fn().mockReturnValue(200)
|
|
579
|
+
};
|
|
580
|
+
const textareaNode = element[`textarea_${text.id}`] = {
|
|
581
|
+
focus: jest.fn(),
|
|
582
|
+
addEventListener: jest.fn(),
|
|
583
|
+
style: {},
|
|
584
|
+
scrollHeight: 205
|
|
585
|
+
};
|
|
586
|
+
const initSpy = jest.spyOn(element, 'initializeDefault');
|
|
587
|
+
const saveValueSpy = jest.spyOn(element, 'saveValue');
|
|
588
|
+
const toggleSpy = jest.spyOn(element, 'toggleTextarea');
|
|
589
|
+
element.handleDblClick(null, text);
|
|
590
|
+
expect(toggleSpy).toHaveBeenCalledWith(text.id, true);
|
|
591
|
+
expect(textareaNode.value).toEqual('foo bar');
|
|
592
|
+
expect(textareaNode.style).toEqual({
|
|
593
|
+
background: 'none',
|
|
594
|
+
border: 'none',
|
|
595
|
+
color: 'green',
|
|
596
|
+
fontFamily: 'FooBarFamily',
|
|
597
|
+
fontSize: '16px',
|
|
598
|
+
height: '208px',
|
|
599
|
+
left: '200px',
|
|
600
|
+
lineHeight: '40px',
|
|
601
|
+
margin: '0px',
|
|
602
|
+
outline: 'none',
|
|
603
|
+
overflow: 'hidden',
|
|
604
|
+
padding: '0px',
|
|
605
|
+
position: 'absolute',
|
|
606
|
+
resize: 'none',
|
|
607
|
+
top: '200px',
|
|
608
|
+
transformOrigin: 'left top',
|
|
609
|
+
textAlign: 'center',
|
|
610
|
+
transform: 'translateY(-0px)',
|
|
611
|
+
width: '200px'
|
|
612
|
+
});
|
|
613
|
+
expect(textareaNode.focus).toHaveBeenCalled();
|
|
614
|
+
expect(stage.on).toHaveBeenCalled();
|
|
615
|
+
expect(initSpy).toHaveBeenCalledWith('gcifqhhimf8k2d6g8hs', false);
|
|
616
|
+
expect(forceUpdate).toHaveBeenCalled();
|
|
617
|
+
expect(textareaNode.addEventListener.mock.calls[0][0]).toEqual('keydown');
|
|
618
|
+
expect(textareaNode.addEventListener.mock.calls[1][0]).toEqual('blur');
|
|
619
|
+
const event = {
|
|
620
|
+
keyCode: 13,
|
|
621
|
+
shiftKey: true
|
|
622
|
+
};
|
|
623
|
+
textareaNode.addEventListener.mock.calls[0][1](event);
|
|
624
|
+
|
|
625
|
+
// Make sure it's not called the second time
|
|
626
|
+
expect(toggleSpy).toHaveBeenCalledTimes(1);
|
|
627
|
+
expect(saveValueSpy).not.toHaveBeenCalled();
|
|
628
|
+
event.shiftKey = false;
|
|
629
|
+
textareaNode.addEventListener.mock.calls[0][1](event);
|
|
630
|
+
expect(toggleSpy).toHaveBeenCalledWith('gcifqhhimf8k2d6g8hs', false);
|
|
631
|
+
expect(saveValueSpy).toHaveBeenCalledWith('gcifqhhimf8k2d6g8hs', textNode, textareaNode);
|
|
632
|
+
event.keyCode = 27;
|
|
633
|
+
textareaNode.addEventListener.mock.calls[0][1](event);
|
|
634
|
+
expect(toggleSpy).toHaveBeenCalledWith('gcifqhhimf8k2d6g8hs', false);
|
|
635
|
+
const showTextSpy = jest.spyOn(element, 'showOnlyTextNodes');
|
|
636
|
+
event.target = stage;
|
|
637
|
+
stage.on.mock.calls[0][1](event);
|
|
638
|
+
expect(showTextSpy).toHaveBeenCalled();
|
|
639
|
+
expect(saveValueSpy).toHaveBeenCalledWith('gcifqhhimf8k2d6g8hs', textNode, textareaNode);
|
|
640
|
+
});
|
|
641
|
+
});
|
|
642
|
+
describe('handleTransform', () => {
|
|
643
|
+
it('should change attrs when called', () => {
|
|
644
|
+
const textNode = element[`text_gcifqhhimf8k2d6g8hs`] = {
|
|
645
|
+
setAttrs: jest.fn(),
|
|
646
|
+
width: jest.fn().mockReturnValue(100),
|
|
647
|
+
scaleX: jest.fn().mockReturnValue(1)
|
|
648
|
+
};
|
|
649
|
+
element.handleTransform(null, 'text_gcifqhhimf8k2d6g8hs');
|
|
650
|
+
expect(textNode.setAttrs).toHaveBeenCalledWith({
|
|
651
|
+
width: 100,
|
|
652
|
+
scaleX: 1
|
|
653
|
+
});
|
|
654
|
+
});
|
|
655
|
+
});
|
|
656
|
+
describe('setInitialProps', () => {
|
|
657
|
+
it('should set the props if not set already', () => {
|
|
658
|
+
element.props = undefined;
|
|
659
|
+
element.setInitialProps(props);
|
|
660
|
+
expect(element.props).toEqual(props);
|
|
661
|
+
});
|
|
662
|
+
});
|
|
663
|
+
describe('render', () => {
|
|
664
|
+
it('should set the stage listener only once', () => {
|
|
665
|
+
const separateStage = {
|
|
666
|
+
on: jest.fn(),
|
|
667
|
+
off: jest.fn()
|
|
668
|
+
};
|
|
669
|
+
const newProps = {
|
|
670
|
+
...(0, _cloneDeep.default)(props),
|
|
671
|
+
stage: separateStage
|
|
672
|
+
};
|
|
673
|
+
const newElement = new drawableClasses['DrawableText'](newProps);
|
|
674
|
+
expect(newElement.stage).toEqual(undefined);
|
|
675
|
+
newElement.render(newProps);
|
|
676
|
+
expect(newElement.stage).toEqual(separateStage);
|
|
677
|
+
newElement.render(newProps);
|
|
678
|
+
expect(separateStage.on.mock.calls.length).toEqual(1);
|
|
679
|
+
});
|
|
680
|
+
});
|
|
681
|
+
});
|
|
682
|
+
});
|
|
683
|
+
});
|
|
684
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9lbnp5bWUiLCJfY2xvbmVEZWVwIiwiX2RyYXdhYmxlRnJlZVBhdGgiLCJfZHJhd2FibGVMaW5lIiwiX2RyYXdhYmxlUmVjdGFuZ2xlIiwiX2RyYXdhYmxlQ2lyY2xlIiwiX2RyYXdhYmxlRXJhc2VyIiwiX2RyYXdhYmxlVGV4dCIsIl9kcmF3YWJsZU1haW4iLCJkcmF3YWJsZUNsYXNzZXMiLCJGcmVlUGF0aERyYXdhYmxlIiwiTGluZURyYXdhYmxlIiwiUmVjdGFuZ2xlRHJhd2FibGUiLCJDaXJjbGVEcmF3YWJsZSIsIkVyYXNlckRyYXdhYmxlIiwiRHJhd2FibGVUZXh0IiwiZGVzY3JpYmUiLCJlbGVtZW50Iiwid3JhcHBlciIsIm1rV3JhcHBlciIsInR5cGUiLCJwcm9wcyIsIldyYXBwZXJFbCIsImNvbnRlbnQiLCJyZW5kZXIiLCJkZWZhdWx0IiwiY3JlYXRlRWxlbWVudCIsInNoYWxsb3ciLCJvblNlc3Npb25DaGFuZ2UiLCJqZXN0IiwiZm4iLCJUZXh0RW50cnkiLCJ3cmFwcGVyTWFpbiIsImV4dHJhcyIsInJlbmRlck9wdHMiLCJkZWZhdWx0cyIsImNsYXNzZXMiLCJkaXNhYmxlZCIsImNsYXNzTmFtZSIsImltYWdlRGltZW5zaW9ucyIsImltYWdlVXJsIiwiZHJhd2FibGVEaW1lbnNpb25zIiwiaGVpZ2h0Iiwid2lkdGgiLCJmaWxsQ29sb3IiLCJvdXRsaW5lQ29sb3IiLCJwYWludENvbG9yIiwic2Vzc2lvbiIsInRvb2xBY3RpdmUiLCJsYWJlbCIsImljb24iLCJEcmF3YWJsZU1haW4iLCJpdCIsInciLCJleHBlY3QiLCJ0b01hdGNoU25hcHNob3QiLCJoYW5kbGVTZXNzaW9uQ2hhbmdlIiwiZm9yY2VVcGRhdGUiLCJwYWludCIsInN0YXJ0eCIsInN0YXJ0eSIsIngiLCJ5IiwiY3JlYXRlZEF0IiwiRGF0ZSIsInNldFN0YXRlIiwiZHJhd2FibGVzIiwiaW5zdGFuY2UiLCJoYW5kbGVVbmRvIiwic3RhdGUiLCJsZW5ndGgiLCJ0b0VxdWFsIiwiaGFuZGxlQ2xlYXJBbGwiLCJiZWZvcmVFYWNoIiwic2ltdWxhdGUiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwicmVnaXN0ZXJNb3ZlbWVudCIsImV2ZW50IiwidGFyZ2V0IiwiZ2V0WCIsIm1vY2tSZXR1cm5WYWx1ZSIsImdldFkiLCJoYW5kbGVEcmFnRW5kIiwicG9pbnRzIiwicG9zWCIsInBvc1kiLCJzcHkiLCJzcHlPbiIsImFsbCIsImlkIiwiaXNEZWZhdWx0IiwidmFsdWUiLCJ0ZXh0VmlzaWJsZSIsInRyYW5zZm9ybWVyVmlzaWJsZSIsInRleHRhcmVhVmlzaWJsZSIsInRvZ2dsZVRleHRTZWxlY3RlZCIsInN0YWdlIiwib24iLCJvZmYiLCJzY2FsZSIsInJlbmRlclRleHRhcmVhcyIsImZvckVhY2giLCJhIiwic2V0QWxsIiwiYWRkTmV3VGV4dEVudHJ5IiwiYXJyYXlDb250YWluaW5nIiwib2JqZWN0Q29udGFpbmluZyIsInNob3dPbmx5VGV4dE5vZGVzIiwidG9nZ2xlVGV4dGFyZWEiLCJpbml0aWFsaXplRGVmYXVsdCIsInRleHROb2RlIiwidGV4dCIsInRleHRhcmVhTm9kZSIsInNhdmVWYWx1ZSIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwibm90IiwiaGFuZGxlTW91c2VEb3duIiwiaGFuZGxlTW91c2VVcCIsImhhbmRsZUNsaWNrIiwiX2xhc3RQb3MiLCJhbGlnbiIsImZpbGwiLCJmb250RmFtaWx5IiwiZm9udFNpemUiLCJsaW5lSGVpZ2h0IiwicGFkZGluZyIsInJvdGF0aW9uIiwiZm9jdXMiLCJhZGRFdmVudExpc3RlbmVyIiwic3R5bGUiLCJzY3JvbGxIZWlnaHQiLCJpbml0U3B5Iiwic2F2ZVZhbHVlU3B5IiwidG9nZ2xlU3B5IiwiaGFuZGxlRGJsQ2xpY2siLCJiYWNrZ3JvdW5kIiwiYm9yZGVyIiwiY29sb3IiLCJsZWZ0IiwibWFyZ2luIiwib3V0bGluZSIsIm92ZXJmbG93IiwicG9zaXRpb24iLCJyZXNpemUiLCJ0b3AiLCJ0cmFuc2Zvcm1PcmlnaW4iLCJ0ZXh0QWxpZ24iLCJ0cmFuc2Zvcm0iLCJtb2NrIiwiY2FsbHMiLCJrZXlDb2RlIiwic2hpZnRLZXkiLCJ0b0hhdmVCZWVuQ2FsbGVkVGltZXMiLCJzaG93VGV4dFNweSIsInNldEF0dHJzIiwic2NhbGVYIiwiaGFuZGxlVHJhbnNmb3JtIiwidW5kZWZpbmVkIiwic2V0SW5pdGlhbFByb3BzIiwic2VwYXJhdGVTdGFnZSIsIm5ld1Byb3BzIiwiY2xvbmVEZWVwIiwibmV3RWxlbWVudCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kcmF3aW5nLXJlc3BvbnNlL19fdGVzdHNfXy9kcmF3aW5nLW1haW4udGVzdC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICdlbnp5bWUnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvY2xvbmVEZWVwJztcbmltcG9ydCBGcmVlUGF0aERyYXdhYmxlIGZyb20gJy4uL2RyYXdhYmxlLWZyZWUtcGF0aCc7XG5pbXBvcnQgTGluZURyYXdhYmxlIGZyb20gJy4uL2RyYXdhYmxlLWxpbmUnO1xuaW1wb3J0IFJlY3RhbmdsZURyYXdhYmxlIGZyb20gJy4uL2RyYXdhYmxlLXJlY3RhbmdsZSc7XG5pbXBvcnQgQ2lyY2xlRHJhd2FibGUgZnJvbSAnLi4vZHJhd2FibGUtY2lyY2xlJztcbmltcG9ydCBFcmFzZXJEcmF3YWJsZSBmcm9tICcuLi9kcmF3YWJsZS1lcmFzZXInO1xuaW1wb3J0IERyYXdhYmxlVGV4dCBmcm9tICcuLi9kcmF3YWJsZS10ZXh0JztcbmltcG9ydCB7IERyYXdhYmxlTWFpbiB9IGZyb20gJy4uL2RyYXdhYmxlLW1haW4nO1xuXG5jb25zdCBkcmF3YWJsZUNsYXNzZXMgPSB7XG4gIEZyZWVQYXRoRHJhd2FibGUsXG4gIExpbmVEcmF3YWJsZSxcbiAgUmVjdGFuZ2xlRHJhd2FibGUsXG4gIENpcmNsZURyYXdhYmxlLFxuICBFcmFzZXJEcmF3YWJsZSxcbiAgRHJhd2FibGVUZXh0LFxufTtcblxuZGVzY3JpYmUoJ0RyYXdpbmdSZXNwb25zZScsICgpID0+IHtcbiAgbGV0IGVsZW1lbnQ7XG4gIGxldCB3cmFwcGVyO1xuXG4gIGNvbnN0IG1rV3JhcHBlciA9ICh0eXBlLCBwcm9wcywgV3JhcHBlckVsKSA9PiB7XG4gICAgZWxlbWVudCA9IG5ldyBkcmF3YWJsZUNsYXNzZXNbdHlwZV0ocHJvcHMpO1xuXG4gICAgbGV0IGNvbnRlbnQgPSBlbGVtZW50LnJlbmRlcihwcm9wcyk7XG5cbiAgICBpZiAoV3JhcHBlckVsKSB7XG4gICAgICBjb250ZW50ID0gPFdyYXBwZXJFbD57Y29udGVudH08L1dyYXBwZXJFbD47XG4gICAgfVxuXG4gICAgcmV0dXJuIHNoYWxsb3coY29udGVudCk7XG4gIH07XG5cbiAgZGVzY3JpYmUoJ0RyYXdhYmxlTWFpbicsICgpID0+IHtcbiAgICBsZXQgb25TZXNzaW9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgIGNvbnN0IFRleHRFbnRyeSA9IG5ldyBEcmF3YWJsZVRleHQoKTtcblxuICAgIGNvbnN0IHdyYXBwZXJNYWluID0gKGV4dHJhcywgcmVuZGVyT3B0cykgPT4ge1xuICAgICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgIGNsYXNzTmFtZTogJ2NsYXNzTmFtZScsXG4gICAgICAgIG9uU2Vzc2lvbkNoYW5nZSxcbiAgICAgICAgaW1hZ2VEaW1lbnNpb25zOiB7fSxcbiAgICAgICAgaW1hZ2VVcmw6ICd1cmwnLFxuICAgICAgICBkcmF3YWJsZURpbWVuc2lvbnM6IHsgaGVpZ2h0OiAzNTAsIHdpZHRoOiAzNTMgfSxcbiAgICAgICAgZmlsbENvbG9yOiAnd2hpdGUnLFxuICAgICAgICBvdXRsaW5lQ29sb3I6ICdibGFjaycsXG4gICAgICAgIHBhaW50Q29sb3I6ICdyZWQnLFxuICAgICAgICBzZXNzaW9uOiB7fSxcbiAgICAgICAgdG9vbEFjdGl2ZTogeyB0eXBlOiAnU2VsZWN0JywgbGFiZWw6ICdTZWxlY3QnLCBpY29uOiAnbWRpQ3Vyc29yRGVmYXVsdCcgfSxcbiAgICAgICAgVGV4dEVudHJ5LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0cywgLi4uZXh0cmFzIH07XG4gICAgICByZXR1cm4gc2hhbGxvdyg8RHJhd2FibGVNYWluIHsuLi5wcm9wc30gLz4sIHtcbiAgICAgICAgLi4ucmVuZGVyT3B0cyxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBkZXNjcmliZSgnc25hcHNob3QnLCAoKSA9PiB7XG4gICAgICBpdCgncmVuZGVycycsICgpID0+IHtcbiAgICAgICAgY29uc3QgdyA9IHdyYXBwZXJNYWluKCk7XG4gICAgICAgIGV4cGVjdCh3KS50b01hdGNoU25hcHNob3QoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmVuZGVycyBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgdyA9IHdyYXBwZXJNYWluKHsgZGlzYWJsZWQ6IHRydWUgfSk7XG4gICAgICAgIGV4cGVjdCh3KS50b01hdGNoU25hcHNob3QoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2xvZ2ljJywgKCkgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlU2Vzc2lvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IGZvcmNlVXBkYXRlID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIGhhbmRsZVNlc3Npb25DaGFuZ2UsXG4gICAgICAgIGZvcmNlVXBkYXRlLFxuICAgICAgICBwYWludDogdHJ1ZSxcbiAgICAgICAgcGFpbnRDb2xvcjogJ2dyZWVuJyxcbiAgICAgICAgc3RhcnR4OiAyMDAsXG4gICAgICAgIHN0YXJ0eTogMjAwLFxuICAgICAgICB4OiAzMDAsXG4gICAgICAgIHk6IDMwMCxcbiAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgfTtcblxuICAgICAgaXQoJ2hhbmRsZVVuZG8nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHcgPSB3cmFwcGVyTWFpbigpO1xuXG4gICAgICAgIHcuc2V0U3RhdGUoeyBkcmF3YWJsZXM6IFtuZXcgUmVjdGFuZ2xlRHJhd2FibGUocHJvcHMpLCBuZXcgUmVjdGFuZ2xlRHJhd2FibGUocHJvcHMpXSB9KTtcbiAgICAgICAgdy5pbnN0YW5jZSgpLmhhbmRsZVVuZG8oKTtcblxuICAgICAgICBleHBlY3Qody5zdGF0ZSgnZHJhd2FibGVzJykubGVuZ3RoKS50b0VxdWFsKDEpO1xuXG4gICAgICAgIHcuaW5zdGFuY2UoKS5oYW5kbGVVbmRvKCk7XG5cbiAgICAgICAgZXhwZWN0KHcuc3RhdGUoJ2RyYXdhYmxlcycpKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnaGFuZGxlQ2xlYXJBbGwnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHcgPSB3cmFwcGVyTWFpbigpO1xuXG4gICAgICAgIHcuc2V0U3RhdGUoeyBkcmF3YWJsZXM6IFtuZXcgUmVjdGFuZ2xlRHJhd2FibGUocHJvcHMpLCBuZXcgUmVjdGFuZ2xlRHJhd2FibGUocHJvcHMpXSB9KTtcbiAgICAgICAgdy5pbnN0YW5jZSgpLmhhbmRsZUNsZWFyQWxsKCk7XG5cbiAgICAgICAgZXhwZWN0KHcuc3RhdGUoJ2RyYXdhYmxlcycpKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ2lyY2xlRHJhd2FibGUnLCAoKSA9PiB7XG4gICAgbGV0IGhhbmRsZVNlc3Npb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgbGV0IGZvcmNlVXBkYXRlID0gamVzdC5mbigpO1xuICAgIGxldCBwcm9wcztcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgcHJvcHMgPSB7XG4gICAgICAgIGhhbmRsZVNlc3Npb25DaGFuZ2UsXG4gICAgICAgIGZvcmNlVXBkYXRlLFxuICAgICAgICBwYWludDogdHJ1ZSxcbiAgICAgICAgcGFpbnRDb2xvcjogJ2dyZWVuJyxcbiAgICAgICAgc3RhcnR4OiAyMDAsXG4gICAgICAgIHN0YXJ0eTogMjAwLFxuICAgICAgICB4OiAzMDAsXG4gICAgICAgIHk6IDIwMCxcbiAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgfTtcbiAgICAgIHdyYXBwZXIgPSBta1dyYXBwZXIoJ0NpcmNsZURyYXdhYmxlJywgcHJvcHMpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NuYXBzaG90JywgKCkgPT4ge1xuICAgICAgaXQoJ3JlbmRlcnMnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdCh3cmFwcGVyKS50b01hdGNoU25hcHNob3QoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2xvZ2ljJywgKCkgPT4ge1xuICAgICAgaXQoJ2NhbGxzIGZvcmNlVXBkYXRlJywgKCkgPT4ge1xuICAgICAgICB3cmFwcGVyLnNpbXVsYXRlKCdjbGljaycpO1xuICAgICAgICBleHBlY3QoZm9yY2VVcGRhdGUpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2hhbmdlcyB4IGFuZCB5JywgKCkgPT4ge1xuICAgICAgICBlbGVtZW50LnJlZ2lzdGVyTW92ZW1lbnQoNDAwLCA0MDApO1xuXG4gICAgICAgIGV4cGVjdChlbGVtZW50LngpLnRvRXF1YWwoNDAwKTtcbiAgICAgICAgZXhwZWN0KGVsZW1lbnQueSkudG9FcXVhbCg0MDApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdjaGFuZ2VzIHNlc3Npb24gd2hlbiBuZWVkZWQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgZ2V0WDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzMDApLFxuICAgICAgICAgICAgZ2V0WTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzMDApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgZWxlbWVudC5oYW5kbGVEcmFnRW5kKHByb3BzLCBldmVudCk7XG5cbiAgICAgICAgZXhwZWN0KGV2ZW50LnRhcmdldC5nZXRYKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIGV4cGVjdChldmVudC50YXJnZXQuZ2V0WSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuXG4gICAgICAgIGV4cGVjdChoYW5kbGVTZXNzaW9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NoYW5nZXMgc3RhcnR4IGFuZCBzdGFydHknLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgZ2V0WDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzMDApLFxuICAgICAgICAgICAgZ2V0WTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzMDApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgZWxlbWVudC5oYW5kbGVEcmFnRW5kKHByb3BzLCBldmVudCk7XG5cbiAgICAgICAgZXhwZWN0KGVsZW1lbnQuc3RhcnR4KS50b0VxdWFsKDMwMCk7XG4gICAgICAgIGV4cGVjdChlbGVtZW50LnN0YXJ0eSkudG9FcXVhbCgzMDApO1xuICAgICAgICBleHBlY3QoZWxlbWVudC54KS50b0VxdWFsKDQwMCk7XG4gICAgICAgIGV4cGVjdChlbGVtZW50LnkpLnRvRXF1YWwoMzAwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRXJhc2VyRHJhd2FibGUnLCAoKSA9PiB7XG4gICAgbGV0IGhhbmRsZVNlc3Npb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgbGV0IGZvcmNlVXBkYXRlID0gamVzdC5mbigpO1xuICAgIGxldCBwcm9wcztcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgcHJvcHMgPSB7XG4gICAgICAgIGhhbmRsZVNlc3Npb25DaGFuZ2UsXG4gICAgICAgIGZvcmNlVXBkYXRlLFxuICAgICAgICBwb2ludHM6IFsyMDAsIDIwMCwgMzAwLCAzMDBdLFxuICAgICAgICBwb3NYOiAyMDAsXG4gICAgICAgIHBvc1k6IDIwMCxcbiAgICAgICAgc3RhcnR4OiAyMDAsXG4gICAgICAgIHN0YXJ0eTogMjAwLFxuICAgICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICB9O1xuICAgICAgd3JhcHBlciA9IG1rV3JhcHBlcignRXJhc2VyRHJhd2FibGUnLCBwcm9wcyk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc25hcHNob3QnLCAoKSA9PiB7XG4gICAgICBpdCgncmVuZGVycycsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHdyYXBwZXIpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbG9naWMnLCAoKSA9PiB7XG4gICAgICBpdCgnY2hhbmdlcyBwb2ludHMnLCAoKSA9PiB7XG4gICAgICAgIGVsZW1lbnQucmVnaXN0ZXJNb3ZlbWVudCg0MDAsIDQwMCk7XG5cbiAgICAgICAgZXhwZWN0KGVsZW1lbnQucG9pbnRzKS50b0VxdWFsKFsyMDAsIDIwMCwgMzAwLCAzMDAsIDQwMCwgNDAwXSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NoYW5nZXMgc2Vzc2lvbiB3aGVuIG5lZWRlZCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgICBnZXRYOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDMwMCksXG4gICAgICAgICAgICBnZXRZOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDMwMCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBlbGVtZW50LmhhbmRsZURyYWdFbmQocHJvcHMsIGV2ZW50KTtcblxuICAgICAgICBleHBlY3QoZXZlbnQudGFyZ2V0LmdldFgpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgZXhwZWN0KGV2ZW50LnRhcmdldC5nZXRZKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG5cbiAgICAgICAgZXhwZWN0KGhhbmRsZVNlc3Npb25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2hhbmdlcyBwb3NYIGFuZCBwb3NZJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICAgIGdldFg6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoMzAwKSxcbiAgICAgICAgICAgIGdldFk6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoMzAwKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGVsZW1lbnQuaGFuZGxlRHJhZ0VuZChwcm9wcywgZXZlbnQpO1xuXG4gICAgICAgIGV4cGVjdChlbGVtZW50LnBvc1gpLnRvRXF1YWwoMzAwKTtcbiAgICAgICAgZXhwZWN0KGVsZW1lbnQucG9zWSkudG9FcXVhbCgzMDApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGcmVlUGF0aERyYXdhYmxlJywgKCkgPT4ge1xuICAgIGxldCBoYW5kbGVTZXNzaW9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgIGxldCBmb3JjZVVwZGF0ZSA9IGplc3QuZm4oKTtcbiAgICBsZXQgcHJvcHM7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHByb3BzID0ge1xuICAgICAgICBoYW5kbGVTZXNzaW9uQ2hhbmdlLFxuICAgICAgICBmb3JjZVVwZGF0ZSxcbiAgICAgICAgcGFpbnQ6IHRydWUsXG4gICAgICAgIHBhaW50Q29sb3I6ICdncmVlbicsXG4gICAgICAgIHBvaW50czogWzIwMCwgMjAwLCAzMDAsIDMwMF0sXG4gICAgICAgIHBvc1g6IDIwMCxcbiAgICAgICAgcG9zWTogMjAwLFxuICAgICAgICBzdGFydHg6IDIwMCxcbiAgICAgICAgc3RhcnR5OiAyMDAsXG4gICAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIH07XG4gICAgICB3cmFwcGVyID0gbWtXcmFwcGVyKCdGcmVlUGF0aERyYXdhYmxlJywgcHJvcHMpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NuYXBzaG90JywgKCkgPT4ge1xuICAgICAgaXQoJ3JlbmRlcnMnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdCh3cmFwcGVyKS50b01hdGNoU25hcHNob3QoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2xvZ2ljJywgKCkgPT4ge1xuICAgICAgaXQoJ2NhbGxzIGZvcmNlVXBkYXRlJywgKCkgPT4ge1xuICAgICAgICB3cmFwcGVyLnNpbXVsYXRlKCdjbGljaycpO1xuICAgICAgICBleHBlY3QoZm9yY2VVcGRhdGUpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2hhbmdlcyBwb2ludHMnLCAoKSA9PiB7XG4gICAgICAgIGVsZW1lbnQucmVnaXN0ZXJNb3ZlbWVudCg0MDAsIDQwMCk7XG5cbiAgICAgICAgZXhwZWN0KGVsZW1lbnQucG9pbnRzKS50b0VxdWFsKFsyMDAsIDIwMCwgMzAwLCAzMDAsIDQwMCwgNDAwXSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NoYW5nZXMgc2Vzc2lvbiB3aGVuIG5lZWRlZCcsICgpID0+IHtcbiAgICAgICAgY29uc3Qgc3B5ID0gamVzdC5zcHlPbihlbGVtZW50LCAnaGFuZGxlRHJhZ0VuZCcpO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgZ2V0WDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzMDApLFxuICAgICAgICAgICAgZ2V0WTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzMDApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgZWxlbWVudC5oYW5kbGVEcmFnRW5kKHByb3BzLCBldmVudCk7XG5cbiAgICAgICAgZXhwZWN0KGV2ZW50LnRhcmdldC5nZXRYKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIGV4cGVjdChldmVudC50YXJnZXQuZ2V0WSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuXG4gICAgICAgIGV4cGVjdChoYW5kbGVTZXNzaW9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NoYW5nZXMgcG9zWCBhbmQgcG9zWScsICgpID0+IHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgICBnZXRYOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDMwMCksXG4gICAgICAgICAgICBnZXRZOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDMwMCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBlbGVtZW50LmhhbmRsZURyYWdFbmQocHJvcHMsIGV2ZW50KTtcblxuICAgICAgICBleHBlY3QoZWxlbWVudC5wb3NYKS50b0VxdWFsKDMwMCk7XG4gICAgICAgIGV4cGVjdChlbGVtZW50LnBvc1kpLnRvRXF1YWwoMzAwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnTGluZURyYXdhYmxlJywgKCkgPT4ge1xuICAgIGxldCBoYW5kbGVTZXNzaW9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgIGxldCBmb3JjZVVwZGF0ZSA9IGplc3QuZm4oKTtcbiAgICBsZXQgcHJvcHM7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHByb3BzID0ge1xuICAgICAgICBoYW5kbGVTZXNzaW9uQ2hhbmdlLFxuICAgICAgICBmb3JjZVVwZGF0ZSxcbiAgICAgICAgcGFpbnQ6IHRydWUsXG4gICAgICAgIHBhaW50Q29sb3I6ICdncmVlbicsXG4gICAgICAgIHN0YXJ0eDogMjAwLFxuICAgICAgICBzdGFydHk6IDIwMCxcbiAgICAgICAgcG9zWDogMjAwLFxuICAgICAgICBwb3NZOiAyMDAsXG4gICAgICAgIHg6IDMwMCxcbiAgICAgICAgeTogMjAwLFxuICAgICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICB9O1xuICAgICAgd3JhcHBlciA9IG1rV3JhcHBlcignTGluZURyYXdhYmxlJywgcHJvcHMpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NuYXBzaG90JywgKCkgPT4ge1xuICAgICAgaXQoJ3JlbmRlcnMnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdCh3cmFwcGVyKS50b01hdGNoU25hcHNob3QoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2xvZ2ljJywgKCkgPT4ge1xuICAgICAgaXQoJ2NhbGxzIGZvcmNlVXBkYXRlJywgKCkgPT4ge1xuICAgICAgICB3cmFwcGVyLnNpbXVsYXRlKCdjbGljaycpO1xuICAgICAgICBleHBlY3QoZm9yY2VVcGRhdGUpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2hhbmdlcyB4IGFuZCB5JywgKCkgPT4ge1xuICAgICAgICBlbGVtZW50LnJlZ2lzdGVyTW92ZW1lbnQoNDAwLCA0MDApO1xuXG4gICAgICAgIGV4cGVjdChlbGVtZW50LngpLnRvRXF1YWwoNDAwKTtcbiAgICAgICAgZXhwZWN0KGVsZW1lbnQueSkudG9FcXVhbCg0MDApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdjaGFuZ2VzIHNlc3Npb24gd2hlbiBuZWVkZWQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgZ2V0WDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzMDApLFxuICAgICAgICAgICAgZ2V0WTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzMDApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgZWxlbWVudC5oYW5kbGVEcmFnRW5kKHByb3BzLCBldmVudCk7XG5cbiAgICAgICAgZXhwZWN0KGV2ZW50LnRhcmdldC5nZXRYKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIGV4cGVjdChldmVudC50YXJnZXQuZ2V0WSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuXG4gICAgICAgIGV4cGVjdChoYW5kbGVTZXNzaW9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NoYW5nZXMgcG9zWCBhbmQgcG9zWScsICgpID0+IHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgICBnZXRYOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDMwMCksXG4gICAgICAgICAgICBnZXRZOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDMwMCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBlbGVtZW50LmhhbmRsZURyYWdFbmQocHJvcHMsIGV2ZW50KTtcblxuICAgICAgICBleHBlY3QoZWxlbWVudC5wb3NYKS50b0VxdWFsKDMwMCk7XG4gICAgICAgIGV4cGVjdChlbGVtZW50LnBvc1kpLnRvRXF1YWwoMzAwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVjdGFuZ2xlRHJhd2FibGUnLCAoKSA9PiB7XG4gICAgbGV0IGhhbmRsZVNlc3Npb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgbGV0IGZvcmNlVXBkYXRlID0gamVzdC5mbigpO1xuICAgIGxldCBwcm9wcztcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgcHJvcHMgPSB7XG4gICAgICAgIGhhbmRsZVNlc3Npb25DaGFuZ2UsXG4gICAgICAgIGZvcmNlVXBkYXRlLFxuICAgICAgICBwYWludDogdHJ1ZSxcbiAgICAgICAgcGFpbnRDb2xvcjogJ2dyZWVuJyxcbiAgICAgICAgc3RhcnR4OiAyMDAsXG4gICAgICAgIHN0YXJ0eTogMjAwLFxuICAgICAgICB4OiAzMDAsXG4gICAgICAgIHk6IDMwMCxcbiAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgfTtcbiAgICAgIHdyYXBwZXIgPSBta1dyYXBwZXIoJ1JlY3RhbmdsZURyYXdhYmxlJywgcHJvcHMpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NuYXBzaG90JywgKCkgPT4ge1xuICAgICAgaXQoJ3JlbmRlcnMnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdCh3cmFwcGVyKS50b01hdGNoU25hcHNob3QoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2xvZ2ljJywgKCkgPT4ge1xuICAgICAgaXQoJ2NhbGxzIGZvcmNlVXBkYXRlJywgKCkgPT4ge1xuICAgICAgICB3cmFwcGVyLnNpbXVsYXRlKCdjbGljaycpO1xuICAgICAgICBleHBlY3QoZm9yY2VVcGRhdGUpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2hhbmdlcyB4IGFuZCB5JywgKCkgPT4ge1xuICAgICAgICBlbGVtZW50LnJlZ2lzdGVyTW92ZW1lbnQoNDAwLCA0MDApO1xuXG4gICAgICAgIGV4cGVjdChlbGVtZW50LngpLnRvRXF1YWwoNDAwKTtcbiAgICAgICAgZXhwZWN0KGVsZW1lbnQueSkudG9FcXVhbCg0MDApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdjaGFuZ2VzIHNlc3Npb24gd2hlbiBuZWVkZWQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgZ2V0WDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzMDApLFxuICAgICAgICAgICAgZ2V0WTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzMDApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgZWxlbWVudC5oYW5kbGVEcmFnRW5kKHByb3BzLCBldmVudCk7XG5cbiAgICAgICAgZXhwZWN0KGV2ZW50LnRhcmdldC5nZXRYKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIGV4cGVjdChldmVudC50YXJnZXQuZ2V0WSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuXG4gICAgICAgIGV4cGVjdChoYW5kbGVTZXNzaW9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NoYW5nZXMgcG9zWCBhbmQgcG9zWScsICgpID0+IHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgICBnZXRYOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDMwMCksXG4gICAgICAgICAgICBnZXRZOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDMwMCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBlbGVtZW50LmhhbmRsZURyYWdFbmQocHJvcHMsIGV2ZW50KTtcblxuICAgICAgICBleHBlY3QoZWxlbWVudC5zdGFydHgpLnRvRXF1YWwoMzAwKTtcbiAgICAgICAgZXhwZWN0KGVsZW1lbnQuc3RhcnR5KS50b0VxdWFsKDMwMCk7XG4gICAgICAgIGV4cGVjdChlbGVtZW50LngpLnRvRXF1YWwoNDAwKTtcbiAgICAgICAgZXhwZWN0KGVsZW1lbnQueSkudG9FcXVhbCg0MDApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdEcmF3YWJsZVRleHQnLCAoKSA9PiB7XG4gICAgY29uc3QgYWxsID0gW1xuICAgICAge1xuICAgICAgICBpZDogJ2djaWZxaGhpbWY4azJkNmc4aHMnLFxuICAgICAgICBpc0RlZmF1bHQ6IHRydWUsXG4gICAgICAgIGxhYmVsOiAnRG91YmxlIGNsaWNrIHRvIGVkaXQgdGhpcyB0ZXh0LiBQcmVzcyBFbnRlciB0byBzdWJtaXQuJyxcbiAgICAgICAgdmFsdWU6ICdUaGlzIGlzIHdoYXQgdGhlIHVzZXIgZW50ZXJlZCcsXG4gICAgICAgIHdpZHRoOiAyMDAsXG4gICAgICAgIHg6IDIgKiA1ICsgNTAsXG4gICAgICAgIHk6IDIgKiA1ICsgNTAsXG4gICAgICAgIHRleHRWaXNpYmxlOiB0cnVlLFxuICAgICAgICB0cmFuc2Zvcm1lclZpc2libGU6IHRydWUsXG4gICAgICAgIHRleHRhcmVhVmlzaWJsZTogZmFsc2UsXG4gICAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgdHlwZTogJ3RleHQtZW50cnknLFxuICAgICAgfSxcbiAgICBdO1xuICAgIGxldCBoYW5kbGVTZXNzaW9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgIGxldCBmb3JjZVVwZGF0ZSA9IGplc3QuZm4oKTtcbiAgICBsZXQgdG9nZ2xlVGV4dFNlbGVjdGVkID0gamVzdC5mbigpO1xuICAgIGxldCBwcm9wcztcbiAgICBsZXQgc3RhZ2U7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHN0YWdlID0ge1xuICAgICAgICBvbjogamVzdC5mbigpLFxuICAgICAgICBvZmY6IGplc3QuZm4oKSxcbiAgICAgIH07XG5cbiAgICAgIHByb3BzID0ge1xuICAgICAgICBhbGwsXG4gICAgICAgIGhhbmRsZVNlc3Npb25DaGFuZ2UsXG4gICAgICAgIGZvcmNlVXBkYXRlLFxuICAgICAgICBzdGFnZSxcbiAgICAgICAgdG9nZ2xlVGV4dFNlbGVjdGVkLFxuICAgICAgICBwYWludDogdHJ1ZSxcbiAgICAgICAgcGFpbnRDb2xvcjogJ2dyZWVuJyxcbiAgICAgICAgc3RhcnR4OiAyMDAsXG4gICAgICAgIHN0YXJ0eTogMjAwLFxuICAgICAgICB4OiAzMDAsXG4gICAgICAgIHk6IDMwMCxcbiAgICAgICAgc2NhbGU6IDEsXG4gICAgICB9O1xuICAgICAgd3JhcHBlciA9IG1rV3JhcHBlcignRHJhd2FibGVUZXh0JywgcHJvcHMsICdkaXYnKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzbmFwc2hvdCcsICgpID0+IHtcbiAgICAgIGl0KCdyZW5kZXJzJywgKCkgPT4ge1xuICAgICAgICBleHBlY3Qod3JhcHBlcikudG9NYXRjaFNuYXBzaG90KCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JlbmRlcnMgdGV4dEFyZWFzJywgKCkgPT4ge1xuICAgICAgICBlbGVtZW50ID0gbmV3IGRyYXdhYmxlQ2xhc3Nlc1snRHJhd2FibGVUZXh0J10ocHJvcHMpO1xuXG4gICAgICAgIHdyYXBwZXIgPSBzaGFsbG93KDxkaXY+e2VsZW1lbnQucmVuZGVyVGV4dGFyZWFzKCl9PC9kaXY+KTtcblxuICAgICAgICBleHBlY3Qod3JhcHBlcikudG9NYXRjaFNuYXBzaG90KCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzbmFwc2hvdCB3aGVuIHRoZXJlIGlzIG5vIHZhbHVlJywgKCkgPT4ge1xuICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIHByb3BzLmFsbC5mb3JFYWNoKChhKSA9PiB7XG4gICAgICAgICAgZGVsZXRlIGEudmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICB3cmFwcGVyID0gbWtXcmFwcGVyKCdEcmF3YWJsZVRleHQnLCBwcm9wcywgJ2RpdicpO1xuICAgICAgfSk7XG4gICAgICBpdCgncmVuZGVycycsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHdyYXBwZXIpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbG9naWMnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWQgY2hhbmdlIHRoZSBhbGwgcHJvcGVydHkgYW5kIGNhbGwgZm9yY2VVcGRhdGUnLCAoKSA9PiB7XG4gICAgICAgIGVsZW1lbnQuc2V0QWxsKFtdKTtcblxuICAgICAgICBleHBlY3QoZWxlbWVudC5hbGwpLnRvRXF1YWwoW10pO1xuICAgICAgICBleHBlY3QoZm9yY2VVcGRhdGUpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnYWRkTmV3VGV4dEVudHJ5JywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWQgYWRkIGEgbmV3IGVsZW1lbnQgYW5kIGNhbGwgdGhlIGFwcHJvcHJpYXRlIGZ1bmN0aW9ucycsICgpID0+IHtcbiAgICAgICAgICBlbGVtZW50LmFkZE5ld1RleHRFbnRyeSgpO1xuXG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQuYWxsLmxlbmd0aCkudG9FcXVhbCgyKTtcbiAgICAgICAgICBleHBlY3QoZWxlbWVudC5hbGwpLnRvRXF1YWwoXG4gICAgICAgICAgICBleHBlY3QuYXJyYXlDb250YWluaW5nKFtcbiAgICAgICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICAgIGlzRGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0RvdWJsZSBjbGljayB0byBlZGl0IHRoaXMgdGV4dC4gUHJlc3MgRW50ZXIgdG8gc3VibWl0LicsXG4gICAgICAgICAgICAgICAgd2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICB0ZXh0VmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lclZpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdGV4dGFyZWFWaXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0eXBlOiAndGV4dC1lbnRyeScsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGV4cGVjdChzdGFnZS5vbikudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICAgIGV4cGVjdChoYW5kbGVTZXNzaW9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCdzaG93T25seVRleHROb2RlcycsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCBjaGFuZ2UgcHJvcGVydGllcyBmb3IgdGhlIFwiYWxsXCIgYXJyYXknLCAoKSA9PiB7XG4gICAgICAgICAgZWxlbWVudC5zaG93T25seVRleHROb2RlcygpO1xuXG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQuYWxsKS50b0VxdWFsKFxuICAgICAgICAgICAgZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXG4gICAgICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgICAgICB0ZXh0VmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lclZpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRleHRhcmVhVmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3Nob3dPbmx0b2dnbGVUZXh0YXJlYXlUZXh0Tm9kZXMnLCAoKSA9PiB7XG4gICAgICAgIGl0KCdzaG91bGQgY2hhbmdlIHRoZSBpdGVtIHdpdGggdGhlIHJpZ2h0IGlkIGluIHRoZSBcImFsbFwiIGFycmF5IGFuZCBjYWxsIGZvcmNlVXBkYXRlJywgKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnQudG9nZ2xlVGV4dGFyZWEoJ2djaWZxaGhpbWY4azJkNmc4aHMnLCB0cnVlKTtcblxuICAgICAgICAgIGV4cGVjdChlbGVtZW50LmFsbFswXSkudG9FcXVhbChcbiAgICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgICAgdGV4dFZpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lclZpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgICB0ZXh0YXJlYVZpc2libGU6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgZXhwZWN0KGZvcmNlVXBkYXRlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG5cbiAgICAgICAgICBlbGVtZW50LnRvZ2dsZVRleHRhcmVhKCdnY2lmcWhoaW1mOGsyZDZnOGhzJywgZmFsc2UpO1xuXG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQuYWxsWzBdKS50b0VxdWFsKFxuICAgICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICB0ZXh0VmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgdHJhbnNmb3JtZXJWaXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgICB0ZXh0YXJlYVZpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGV4cGVjdChmb3JjZVVwZGF0ZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnaW5pdGlhbGl6ZURlZmF1bHQnLCAoKSA9PiB7XG4gICAgICAgIGl0KCdzaG91bGQgbWFrZSB0aGUgaXRlbSB3aXRoIHRoZSByaWdodCBpZCBkZWZhdWx0JywgKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnQuaW5pdGlhbGl6ZURlZmF1bHQoJ2djaWZxaGhpbWY4azJkNmc4aHMnLCB0cnVlKTtcblxuICAgICAgICAgIGV4cGVjdChlbGVtZW50LmFsbFswXSkudG9FcXVhbChcbiAgICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCdzYXZlVmFsdWUnLCAoKSA9PiB7XG4gICAgICAgIGl0KCdzaG91bGQgbWFrZSB0aGUgaXRlbSB3aXRoIHRoZSByaWdodCBpZCBkZWZhdWx0IGFuZCBjYWxsIGhhbmRsZVNlc3Npb25DaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSB7XG4gICAgICAgICAgICB0ZXh0OiBqZXN0LmZuKCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCB0ZXh0YXJlYU5vZGUgPSB7XG4gICAgICAgICAgICB2YWx1ZTogJ0ZvbyBiYXInLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBlbGVtZW50LnNhdmVWYWx1ZSgnZ2NpZnFoaGltZjhrMmQ2ZzhocycsIHRleHROb2RlLCB0ZXh0YXJlYU5vZGUpO1xuXG4gICAgICAgICAgZXhwZWN0KHRleHROb2RlLnRleHQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdGb28gYmFyJyk7XG4gICAgICAgICAgZXhwZWN0KGhhbmRsZVNlc3Npb25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcblxuICAgICAgICAgIHRleHRhcmVhTm9kZS52YWx1ZSA9ICcnO1xuXG4gICAgICAgICAgZWxlbWVudC5zYXZlVmFsdWUoJ2djaWZxaGhpbWY4azJkNmc4aHMnLCB0ZXh0Tm9kZSwgdGV4dGFyZWFOb2RlKTtcblxuICAgICAgICAgIGV4cGVjdChlbGVtZW50LmFsbCkudG9FcXVhbChcbiAgICAgICAgICAgIGV4cGVjdC5ub3QuYXJyYXlDb250YWluaW5nKFtcbiAgICAgICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICAgIGlkOiAnZ2NpZnFoaGltZjhrMmQ2ZzhocycsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBleHBlY3QoZm9yY2VVcGRhdGUpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgICBleHBlY3QoaGFuZGxlU2Vzc2lvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnaGFuZGxlTW91c2VFdmVudHMnLCAoKSA9PiB7XG4gICAgICAgIGl0KCdzaG91bGQgY2FsbCB0aGUgcmlnaHQgZnVuY3Rpb25zIG9uIG1vdXNlIGRvd24gYW5kIHVwJywgKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnQuaGFuZGxlTW91c2VEb3duKCk7XG4gICAgICAgICAgZXhwZWN0KHRvZ2dsZVRleHRTZWxlY3RlZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgodHJ1ZSk7XG5cbiAgICAgICAgICBlbGVtZW50LmhhbmRsZU1vdXNlVXAoKTtcbiAgICAgICAgICBleHBlY3QodG9nZ2xlVGV4dFNlbGVjdGVkKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChmYWxzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgY2FsbCB0aGUgcmlnaHQgZnVuY3Rpb25zIG9uQ2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgZWxlbWVudC5oYW5kbGVDbGljayhudWxsLCAnZ2NpZnFoaGltZjhrMmQ2ZzhocycpO1xuXG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQuYWxsKS50b0VxdWFsKFxuICAgICAgICAgICAgZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXG4gICAgICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lclZpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGV4cGVjdChmb3JjZVVwZGF0ZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNhbGwgdGhlIHJpZ2h0IGZ1bmN0aW9ucyBvbkRibENsaWNrJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRleHQgPSB7XG4gICAgICAgICAgICBpZDogJ2djaWZxaGhpbWY4azJkNmc4aHMnLFxuICAgICAgICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSAoZWxlbWVudFtgdGV4dF8ke3RleHQuaWR9YF0gPSB7XG4gICAgICAgICAgICBfbGFzdFBvczoge1xuICAgICAgICAgICAgICB4OiAyMDAsXG4gICAgICAgICAgICAgIHk6IDIwMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhbGlnbjogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgnY2VudGVyJyksXG4gICAgICAgICAgICBmaWxsOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKCdncmVlbicpLFxuICAgICAgICAgICAgZm9udEZhbWlseTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgnRm9vQmFyRmFtaWx5JyksXG4gICAgICAgICAgICBmb250U2l6ZTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgnMTYnKSxcbiAgICAgICAgICAgIGhlaWdodDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSg0MCksXG4gICAgICAgICAgICBsaW5lSGVpZ2h0OiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKCc0MHB4JyksXG4gICAgICAgICAgICBwYWRkaW5nOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDApLFxuICAgICAgICAgICAgcm90YXRpb246IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoMCksXG4gICAgICAgICAgICB0ZXh0OiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKCdmb28gYmFyJyksXG4gICAgICAgICAgICB3aWR0aDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgyMDApLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHRleHRhcmVhTm9kZSA9IChlbGVtZW50W2B0ZXh0YXJlYV8ke3RleHQuaWR9YF0gPSB7XG4gICAgICAgICAgICBmb2N1czogamVzdC5mbigpLFxuICAgICAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcjogamVzdC5mbigpLFxuICAgICAgICAgICAgc3R5bGU6IHt9LFxuICAgICAgICAgICAgc2Nyb2xsSGVpZ2h0OiAyMDUsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBpbml0U3B5ID0gamVzdC5zcHlPbihlbGVtZW50LCAnaW5pdGlhbGl6ZURlZmF1bHQnKTtcbiAgICAgICAgICBjb25zdCBzYXZlVmFsdWVTcHkgPSBqZXN0LnNweU9uKGVsZW1lbnQsICdzYXZlVmFsdWUnKTtcbiAgICAgICAgICBjb25zdCB0b2dnbGVTcHkgPSBqZXN0LnNweU9uKGVsZW1lbnQsICd0b2dnbGVUZXh0YXJlYScpO1xuXG4gICAgICAgICAgZWxlbWVudC5oYW5kbGVEYmxDbGljayhudWxsLCB0ZXh0KTtcblxuICAgICAgICAgIGV4cGVjdCh0b2dnbGVTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHRleHQuaWQsIHRydWUpO1xuXG4gICAgICAgICAgZXhwZWN0KHRleHRhcmVhTm9kZS52YWx1ZSkudG9FcXVhbCgnZm9vIGJhcicpO1xuICAgICAgICAgIGV4cGVjdCh0ZXh0YXJlYU5vZGUuc3R5bGUpLnRvRXF1YWwoe1xuICAgICAgICAgICAgYmFja2dyb3VuZDogJ25vbmUnLFxuICAgICAgICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICAgICAgICBjb2xvcjogJ2dyZWVuJyxcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6ICdGb29CYXJGYW1pbHknLFxuICAgICAgICAgICAgZm9udFNpemU6ICcxNnB4JyxcbiAgICAgICAgICAgIGhlaWdodDogJzIwOHB4JyxcbiAgICAgICAgICAgIGxlZnQ6ICcyMDBweCcsXG4gICAgICAgICAgICBsaW5lSGVpZ2h0OiAnNDBweCcsXG4gICAgICAgICAgICBtYXJnaW46ICcwcHgnLFxuICAgICAgICAgICAgb3V0bGluZTogJ25vbmUnLFxuICAgICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICAgICAgcGFkZGluZzogJzBweCcsXG4gICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgIHJlc2l6ZTogJ25vbmUnLFxuICAgICAgICAgICAgdG9wOiAnMjAwcHgnLFxuICAgICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnbGVmdCB0b3AnLFxuICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTBweCknLFxuICAgICAgICAgICAgd2lkdGg6ICcyMDBweCcsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBleHBlY3QodGV4dGFyZWFOb2RlLmZvY3VzKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgICAgZXhwZWN0KHN0YWdlLm9uKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgICAgZXhwZWN0KGluaXRTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdnY2lmcWhoaW1mOGsyZDZnOGhzJywgZmFsc2UpO1xuICAgICAgICAgIGV4cGVjdChmb3JjZVVwZGF0ZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICAgIGV4cGVjdCh0ZXh0YXJlYU5vZGUuYWRkRXZlbnRMaXN0ZW5lci5tb2NrLmNhbGxzWzBdWzBdKS50b0VxdWFsKCdrZXlkb3duJyk7XG4gICAgICAgICAgZXhwZWN0KHRleHRhcmVhTm9kZS5hZGRFdmVudExpc3RlbmVyLm1vY2suY2FsbHNbMV1bMF0pLnRvRXF1YWwoJ2JsdXInKTtcblxuICAgICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgICAga2V5Q29kZTogMTMsXG4gICAgICAgICAgICBzaGlmdEtleTogdHJ1ZSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdGV4dGFyZWFOb2RlLmFkZEV2ZW50TGlzdGVuZXIubW9jay5jYWxsc1swXVsxXShldmVudCk7XG5cbiAgICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyBub3QgY2FsbGVkIHRoZSBzZWNvbmQgdGltZVxuICAgICAgICAgIGV4cGVjdCh0b2dnbGVTcHkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgICAgICBleHBlY3Qoc2F2ZVZhbHVlU3B5KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuXG4gICAgICAgICAgZXZlbnQuc2hpZnRLZXkgPSBmYWxzZTtcblxuICAgICAgICAgIHRleHRhcmVhTm9kZS5hZGRFdmVudExpc3RlbmVyLm1vY2suY2FsbHNbMF1bMV0oZXZlbnQpO1xuXG4gICAgICAgICAgZXhwZWN0KHRvZ2dsZVNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2djaWZxaGhpbWY4azJkNmc4aHMnLCBmYWxzZSk7XG4gICAgICAgICAgZXhwZWN0KHNhdmVWYWx1ZVNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2djaWZxaGhpbWY4azJkNmc4aHMnLCB0ZXh0Tm9kZSwgdGV4dGFyZWFOb2RlKTtcblxuICAgICAgICAgIGV2ZW50LmtleUNvZGUgPSAyNztcblxuICAgICAgICAgIHRleHRhcmVhTm9kZS5hZGRFdmVudExpc3RlbmVyLm1vY2suY2FsbHNbMF1bMV0oZXZlbnQpO1xuXG4gICAgICAgICAgZXhwZWN0KHRvZ2dsZVNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2djaWZxaGhpbWY4azJkNmc4aHMnLCBmYWxzZSk7XG5cbiAgICAgICAgICBjb25zdCBzaG93VGV4dFNweSA9IGplc3Quc3B5T24oZWxlbWVudCwgJ3Nob3dPbmx5VGV4dE5vZGVzJyk7XG5cbiAgICAgICAgICBldmVudC50YXJnZXQgPSBzdGFnZTtcblxuICAgICAgICAgIHN0YWdlLm9uLm1vY2suY2FsbHNbMF1bMV0oZXZlbnQpO1xuXG4gICAgICAgICAgZXhwZWN0KHNob3dUZXh0U3B5KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgICAgZXhwZWN0KHNhdmVWYWx1ZVNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2djaWZxaGhpbWY4azJkNmc4aHMnLCB0ZXh0Tm9kZSwgdGV4dGFyZWFOb2RlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ2hhbmRsZVRyYW5zZm9ybScsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCBjaGFuZ2UgYXR0cnMgd2hlbiBjYWxsZWQnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSAoZWxlbWVudFtgdGV4dF9nY2lmcWhoaW1mOGsyZDZnOGhzYF0gPSB7XG4gICAgICAgICAgICBzZXRBdHRyczogamVzdC5mbigpLFxuICAgICAgICAgICAgd2lkdGg6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoMTAwKSxcbiAgICAgICAgICAgIHNjYWxlWDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgxKSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGVsZW1lbnQuaGFuZGxlVHJhbnNmb3JtKG51bGwsICd0ZXh0X2djaWZxaGhpbWY4azJkNmc4aHMnKTtcblxuICAgICAgICAgIGV4cGVjdCh0ZXh0Tm9kZS5zZXRBdHRycykudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgICAgIHNjYWxlWDogMSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3NldEluaXRpYWxQcm9wcycsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCBzZXQgdGhlIHByb3BzIGlmIG5vdCBzZXQgYWxyZWFkeScsICgpID0+IHtcbiAgICAgICAgICBlbGVtZW50LnByb3BzID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgZWxlbWVudC5zZXRJbml0aWFsUHJvcHMocHJvcHMpO1xuXG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQucHJvcHMpLnRvRXF1YWwocHJvcHMpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgncmVuZGVyJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIHNldCB0aGUgc3RhZ2UgbGlzdGVuZXIgb25seSBvbmNlJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNlcGFyYXRlU3RhZ2UgPSB7XG4gICAgICAgICAgICBvbjogamVzdC5mbigpLFxuICAgICAgICAgICAgb2ZmOiBqZXN0LmZuKCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBuZXdQcm9wcyA9IHtcbiAgICAgICAgICAgIC4uLmNsb25lRGVlcChwcm9wcyksXG4gICAgICAgICAgICBzdGFnZTogc2VwYXJhdGVTdGFnZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBuZXcgZHJhd2FibGVDbGFzc2VzWydEcmF3YWJsZVRleHQnXShuZXdQcm9wcyk7XG5cbiAgICAgICAgICBleHBlY3QobmV3RWxlbWVudC5zdGFnZSkudG9FcXVhbCh1bmRlZmluZWQpO1xuXG4gICAgICAgICAgbmV3RWxlbWVudC5yZW5kZXIobmV3UHJvcHMpO1xuICAgICAgICAgIGV4cGVjdChuZXdFbGVtZW50LnN0YWdlKS50b0VxdWFsKHNlcGFyYXRlU3RhZ2UpO1xuXG4gICAgICAgICAgbmV3RWxlbWVudC5yZW5kZXIobmV3UHJvcHMpO1xuXG4gICAgICAgICAgZXhwZWN0KHNlcGFyYXRlU3RhZ2Uub24ubW9jay5jYWxscy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFVBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLGlCQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxhQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxrQkFBQSxHQUFBTixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU0sZUFBQSxHQUFBUCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU8sZUFBQSxHQUFBUixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVEsYUFBQSxH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
|