@pie-lib/editable-html-tip-tap 2.1.20-beta.6 → 2.1.20-beta.7

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.
Files changed (94) hide show
  1. package/lib/__tests__/EditableHtml.test.js +831 -0
  2. package/lib/__tests__/constants.test.js +21 -0
  3. package/lib/__tests__/div-to-paragraph-conversion.test.js +213 -0
  4. package/lib/__tests__/extensions.test.js +209 -0
  5. package/lib/__tests__/index.test.js +250 -0
  6. package/lib/__tests__/size-utils.test.js +57 -0
  7. package/lib/__tests__/spellcheck.test.js +142 -0
  8. package/lib/__tests__/theme.test.js +17 -0
  9. package/lib/components/__tests__/AltDialog.test.js +201 -0
  10. package/lib/components/__tests__/CharacterPicker.test.js +455 -0
  11. package/lib/components/__tests__/CssIcon.test.js +58 -0
  12. package/lib/components/__tests__/DragInTheBlank.test.js +295 -0
  13. package/lib/components/__tests__/ExplicitConstructedResponse.test.js +345 -0
  14. package/lib/components/__tests__/ImageToolbar.test.js +185 -0
  15. package/lib/components/__tests__/InlineDropdown.test.js +839 -0
  16. package/lib/components/__tests__/InsertImageHandler.test.js +171 -0
  17. package/lib/components/__tests__/MediaDialog.test.js +433 -0
  18. package/lib/components/__tests__/MediaToolbar.test.js +126 -0
  19. package/lib/components/__tests__/MediaWrapper.test.js +96 -0
  20. package/lib/components/__tests__/MenuBar.test.js +502 -0
  21. package/lib/components/__tests__/RespArea.test.js +171 -0
  22. package/lib/components/__tests__/TableIcons.test.js +153 -0
  23. package/lib/components/__tests__/TextAlign.test.js +209 -0
  24. package/lib/components/__tests__/TiptapContainer.test.js +196 -0
  25. package/lib/components/__tests__/characterUtils.test.js +178 -0
  26. package/lib/components/__tests__/choice.test.js +213 -0
  27. package/lib/components/__tests__/custom-popper.test.js +108 -0
  28. package/lib/components/__tests__/done-button.test.js +72 -0
  29. package/lib/components/__tests__/toolbar-buttons.test.js +277 -0
  30. package/lib/components/respArea/DragInTheBlank/__tests__/choice.test.js +90 -0
  31. package/lib/components/respArea/__tests__/MathTemplated.test.js +217 -0
  32. package/lib/extensions/__tests__/css.test.js +214 -0
  33. package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +175 -0
  34. package/lib/extensions/__tests__/divNode.test.js +108 -0
  35. package/lib/extensions/__tests__/ensure-empty-root-div.test.js +50 -0
  36. package/lib/extensions/__tests__/ensure-list-item-content-is-div.test.js +60 -0
  37. package/lib/extensions/__tests__/extended-list-item.test.js +13 -0
  38. package/lib/extensions/__tests__/extended-table-cell.test.js +15 -0
  39. package/lib/extensions/__tests__/extended-table.test.js +200 -0
  40. package/lib/extensions/__tests__/image-component.test.js +432 -0
  41. package/lib/extensions/__tests__/image.test.js +313 -0
  42. package/lib/extensions/__tests__/math.test.js +1411 -0
  43. package/lib/extensions/__tests__/media-node-view.test.js +307 -0
  44. package/lib/extensions/__tests__/media.test.js +292 -0
  45. package/lib/extensions/__tests__/responseArea.test.js +736 -0
  46. package/lib/utils/__tests__/helper.test.js +107 -0
  47. package/lib/utils/__tests__/toolbar.test.js +38 -0
  48. package/package.json +3 -3
  49. package/src/__tests__/EditableHtml.test.jsx +588 -0
  50. package/src/__tests__/constants.test.js +19 -0
  51. package/src/__tests__/div-to-paragraph-conversion.test.jsx +125 -0
  52. package/src/__tests__/extensions.test.js +208 -0
  53. package/src/__tests__/index.test.jsx +154 -0
  54. package/src/__tests__/size-utils.test.js +64 -0
  55. package/src/__tests__/theme.test.js +17 -0
  56. package/src/components/__tests__/AltDialog.test.jsx +147 -0
  57. package/src/components/__tests__/CharacterPicker.test.jsx +270 -0
  58. package/src/components/__tests__/CssIcon.test.jsx +46 -0
  59. package/src/components/__tests__/DragInTheBlank.test.jsx +255 -0
  60. package/src/components/__tests__/ExplicitConstructedResponse.test.jsx +209 -0
  61. package/src/components/__tests__/ImageToolbar.test.jsx +128 -0
  62. package/src/components/__tests__/InlineDropdown.test.jsx +557 -0
  63. package/src/components/__tests__/InsertImageHandler.test.js +161 -0
  64. package/src/components/__tests__/MediaDialog.test.jsx +293 -0
  65. package/src/components/__tests__/MediaToolbar.test.jsx +74 -0
  66. package/src/components/__tests__/MediaWrapper.test.jsx +81 -0
  67. package/src/components/__tests__/MenuBar.test.jsx +250 -0
  68. package/src/components/__tests__/RespArea.test.jsx +122 -0
  69. package/src/components/__tests__/TableIcons.test.jsx +149 -0
  70. package/src/components/__tests__/TextAlign.test.jsx +167 -0
  71. package/src/components/__tests__/TiptapContainer.test.jsx +138 -0
  72. package/src/components/__tests__/characterUtils.test.js +166 -0
  73. package/src/components/__tests__/choice.test.jsx +171 -0
  74. package/src/components/__tests__/custom-popper.test.jsx +82 -0
  75. package/src/components/__tests__/done-button.test.jsx +54 -0
  76. package/src/components/__tests__/toolbar-buttons.test.jsx +234 -0
  77. package/src/components/respArea/DragInTheBlank/__tests__/choice.test.jsx +72 -0
  78. package/src/components/respArea/__tests__/MathTemplated.test.jsx +210 -0
  79. package/src/extensions/__tests__/css.test.js +196 -0
  80. package/src/extensions/__tests__/custom-toolbar-wrapper.test.jsx +180 -0
  81. package/src/extensions/__tests__/divNode.test.js +87 -0
  82. package/src/extensions/__tests__/ensure-empty-root-div.test.js +57 -0
  83. package/src/extensions/__tests__/ensure-list-item-content-is-div.test.js +44 -0
  84. package/src/extensions/__tests__/extended-list-item.test.js +13 -0
  85. package/src/extensions/__tests__/extended-table-cell.test.js +22 -0
  86. package/src/extensions/__tests__/extended-table.test.js +183 -0
  87. package/src/extensions/__tests__/image-component.test.jsx +346 -0
  88. package/src/extensions/__tests__/image.test.js +237 -0
  89. package/src/extensions/__tests__/math.test.js +900 -0
  90. package/src/extensions/__tests__/media-node-view.test.jsx +298 -0
  91. package/src/extensions/__tests__/media.test.js +271 -0
  92. package/src/extensions/__tests__/responseArea.test.js +655 -0
  93. package/src/utils/__tests__/helper.test.js +126 -0
  94. package/src/utils/__tests__/toolbar.test.js +43 -0
@@ -0,0 +1,1411 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof3 = require("@babel/runtime/helpers/typeof");
5
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
6
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
7
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
12
+ var _react = _interopRequireDefault(require("react"));
13
+ var _react2 = require("@testing-library/react");
14
+ var _math = require("../math");
15
+ var toolbarUtils = _interopRequireWildcard(require("../../utils/toolbar"));
16
+ var _excluded = ["children"];
17
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
18
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
19
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
20
+ jest.mock('@tiptap/react', function () {
21
+ return {
22
+ NodeViewWrapper: function NodeViewWrapper(_ref) {
23
+ var children = _ref.children,
24
+ props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
25
+ return /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({
26
+ "data-testid": "node-view-wrapper"
27
+ }, props), children);
28
+ },
29
+ ReactNodeViewRenderer: jest.fn(function (component) {
30
+ return component;
31
+ })
32
+ };
33
+ });
34
+ var mockCreatePortal = jest.fn(function (node) {
35
+ return node;
36
+ });
37
+ jest.mock('react-dom', function () {
38
+ return _objectSpread(_objectSpread({}, jest.requireActual('react-dom')), {}, {
39
+ createPortal: function createPortal() {
40
+ return mockCreatePortal.apply(void 0, arguments);
41
+ }
42
+ });
43
+ });
44
+ jest.mock('@pie-lib/math-toolbar', function () {
45
+ var React = require('react');
46
+ return {
47
+ MathPreview: function MathPreview(_ref2) {
48
+ var latex = _ref2.latex;
49
+ return /*#__PURE__*/React.createElement("div", {
50
+ "data-testid": "math-preview"
51
+ }, latex);
52
+ },
53
+ MathToolbar: function MathToolbar(_ref3) {
54
+ var latex = _ref3.latex,
55
+ _onChange = _ref3.onChange,
56
+ onDone = _ref3.onDone;
57
+ var _React$useState = React.useState(latex),
58
+ _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2),
59
+ localLatex = _React$useState2[0],
60
+ setLocalLatex = _React$useState2[1];
61
+ return /*#__PURE__*/React.createElement("div", {
62
+ "data-testid": "math-toolbar"
63
+ }, /*#__PURE__*/React.createElement("input", {
64
+ "data-testid": "math-input",
65
+ value: localLatex,
66
+ onChange: function onChange(e) {
67
+ setLocalLatex(e.target.value);
68
+ _onChange(e.target.value);
69
+ }
70
+ }), /*#__PURE__*/React.createElement("button", {
71
+ "data-testid": "done-button",
72
+ onClick: function onClick() {
73
+ return onDone(localLatex);
74
+ }
75
+ }, "Done"));
76
+ }
77
+ };
78
+ });
79
+ jest.mock('@pie-lib/math-rendering', function () {
80
+ return {
81
+ wrapMath: function wrapMath(latex, wrapper) {
82
+ return latex;
83
+ }
84
+ };
85
+ });
86
+ jest.mock('@tiptap/core', function () {
87
+ return {
88
+ Node: {
89
+ create: jest.fn(function (config) {
90
+ return config;
91
+ })
92
+ }
93
+ };
94
+ });
95
+ jest.mock('prosemirror-state', function () {
96
+ return {
97
+ Plugin: jest.fn(function (config) {
98
+ return config;
99
+ }),
100
+ PluginKey: jest.fn(function (key) {
101
+ this.key = key;
102
+ }),
103
+ TextSelection: {
104
+ create: jest.fn(function (doc, pos) {
105
+ return {
106
+ type: 'text',
107
+ pos: pos
108
+ };
109
+ })
110
+ },
111
+ NodeSelection: {
112
+ create: jest.fn(function (doc, pos) {
113
+ return {
114
+ type: 'node',
115
+ pos: pos
116
+ };
117
+ })
118
+ }
119
+ };
120
+ });
121
+ describe('MathNode', function () {
122
+ describe('configuration', function () {
123
+ it('has correct name', function () {
124
+ expect(_math.MathNode.name).toBe('math');
125
+ });
126
+ it('is inline', function () {
127
+ expect(_math.MathNode.inline).toBe(true);
128
+ });
129
+ it('is in inline group', function () {
130
+ expect(_math.MathNode.group).toBe('inline');
131
+ });
132
+ it('is atomic', function () {
133
+ expect(_math.MathNode.atom).toBe(true);
134
+ });
135
+ });
136
+ describe('addAttributes', function () {
137
+ it('returns required attributes', function () {
138
+ var attributes = _math.MathNode.addAttributes();
139
+ expect(attributes).toHaveProperty('latex');
140
+ expect(attributes).toHaveProperty('wrapper');
141
+ expect(attributes).toHaveProperty('html');
142
+ expect(attributes.latex).toEqual({
143
+ "default": ''
144
+ });
145
+ expect(attributes.wrapper).toEqual({
146
+ "default": null
147
+ });
148
+ expect(attributes.html).toEqual({
149
+ "default": null
150
+ });
151
+ });
152
+ });
153
+ describe('parseHTML', function () {
154
+ it('returns parsing rules for latex', function () {
155
+ var rules = _math.MathNode.parseHTML();
156
+ expect(Array.isArray(rules)).toBe(true);
157
+ expect(rules).toHaveLength(2);
158
+ expect(rules[0]).toHaveProperty('tag', 'span[data-latex]');
159
+ });
160
+ it('returns parsing rules for mathml', function () {
161
+ var rules = _math.MathNode.parseHTML();
162
+ expect(rules[1]).toHaveProperty('tag', 'span[data-type="mathml"]');
163
+ });
164
+ });
165
+ describe('renderHTML', function () {
166
+ it('renders mathml when html attribute is present', function () {
167
+ var result = _math.MathNode.renderHTML({
168
+ HTMLAttributes: {
169
+ html: '<math><mi>x</mi></math>'
170
+ }
171
+ });
172
+ expect(result[0]).toBe('span');
173
+ expect(result[1]).toHaveProperty('data-type', 'mathml');
174
+ });
175
+ it('renders latex when html attribute is not present', function () {
176
+ var result = _math.MathNode.renderHTML({
177
+ HTMLAttributes: {
178
+ latex: 'x^2'
179
+ }
180
+ });
181
+ expect(result[0]).toBe('span');
182
+ expect(result[1]).toHaveProperty('data-latex', '');
183
+ expect(result[1]).toHaveProperty('data-raw', 'x^2');
184
+ });
185
+ });
186
+ describe('addCommands', function () {
187
+ it('returns insertMath command', function () {
188
+ var commands = _math.MathNode.addCommands();
189
+ expect(commands).toHaveProperty('insertMath');
190
+ expect((0, _typeof2["default"])(commands.insertMath)).toBe('function');
191
+ });
192
+ it('insertMath opens the toolbar after inserting a math node', function () {
193
+ var setToolbarOpenedSpy = jest.spyOn(toolbarUtils, 'setToolbarOpened');
194
+ var mathNode = {
195
+ type: {
196
+ name: 'math'
197
+ },
198
+ nodeSize: 1
199
+ };
200
+ var tr = {
201
+ insert: jest.fn().mockReturnThis(),
202
+ setSelection: jest.fn().mockReturnThis(),
203
+ doc: {}
204
+ };
205
+ var editor = {
206
+ view: {
207
+ state: {
208
+ schema: {
209
+ nodes: {
210
+ math: {
211
+ create: jest.fn(function () {
212
+ return mathNode;
213
+ })
214
+ }
215
+ }
216
+ },
217
+ selection: {
218
+ $from: {
219
+ pos: 1
220
+ }
221
+ }
222
+ }
223
+ }
224
+ };
225
+ var dispatch = jest.fn();
226
+ var insertMath = _math.MathNode.addCommands().insertMath('x^2');
227
+ insertMath({
228
+ tr: tr,
229
+ editor: editor,
230
+ dispatch: dispatch
231
+ });
232
+ expect(tr.insert).toHaveBeenCalledWith(1, mathNode);
233
+ expect(tr.setSelection).toHaveBeenCalled();
234
+ expect(dispatch).toHaveBeenCalledWith(tr);
235
+ expect(setToolbarOpenedSpy).toHaveBeenCalledWith(editor, true);
236
+ setToolbarOpenedSpy.mockRestore();
237
+ });
238
+ });
239
+ describe('addNodeView', function () {
240
+ it('returns ReactNodeViewRenderer result', function () {
241
+ var result = _math.MathNode.addNodeView();
242
+ expect(result).toBeDefined();
243
+ });
244
+ });
245
+ describe('addProseMirrorPlugins', function () {
246
+ it('registers ensure-text-after-math and zero-width-space plugins', function () {
247
+ var plugins = _math.MathNode.addProseMirrorPlugins();
248
+ expect(plugins).toHaveLength(2);
249
+ expect(plugins[0].appendTransaction).toBeDefined();
250
+ expect(plugins[1].props.handleKeyDown).toBeDefined();
251
+ });
252
+ });
253
+ });
254
+ describe('EnsureTextAfterMathPlugin', function () {
255
+ it('inserts a zero-width space after a math node when no text follows', function () {
256
+ var plugin = (0, _math.EnsureTextAfterMathPlugin)('math');
257
+ var textNode = {
258
+ type: {
259
+ name: 'text'
260
+ }
261
+ };
262
+ var mathNode = {
263
+ type: {
264
+ name: 'math'
265
+ },
266
+ nodeSize: 3
267
+ };
268
+ var tr = {
269
+ insert: jest.fn()
270
+ };
271
+ var newState = {
272
+ schema: {
273
+ text: jest.fn(function (value) {
274
+ return {
275
+ type: textNode.type,
276
+ text: value
277
+ };
278
+ })
279
+ },
280
+ tr: tr,
281
+ doc: {
282
+ descendants: function descendants(cb) {
283
+ return cb(mathNode, 5);
284
+ },
285
+ nodeAt: jest.fn(function () {
286
+ return null;
287
+ })
288
+ }
289
+ };
290
+ var result = plugin.appendTransaction([{
291
+ docChanged: true
292
+ }], {}, newState);
293
+ expect(tr.insert).toHaveBeenCalledWith(8, expect.anything());
294
+ expect(result).toBe(tr);
295
+ });
296
+ it('does not insert when text already follows the math node', function () {
297
+ var plugin = (0, _math.EnsureTextAfterMathPlugin)('math');
298
+ var tr = {
299
+ insert: jest.fn()
300
+ };
301
+ var mathNode = {
302
+ type: {
303
+ name: 'math'
304
+ },
305
+ nodeSize: 3
306
+ };
307
+ var newState = {
308
+ schema: {
309
+ text: jest.fn()
310
+ },
311
+ tr: tr,
312
+ doc: {
313
+ descendants: function descendants(cb) {
314
+ return cb(mathNode, 5);
315
+ },
316
+ nodeAt: jest.fn(function () {
317
+ return {
318
+ type: {
319
+ name: 'text'
320
+ }
321
+ };
322
+ })
323
+ }
324
+ };
325
+ var result = plugin.appendTransaction([{
326
+ docChanged: true
327
+ }], {}, newState);
328
+ expect(tr.insert).not.toHaveBeenCalled();
329
+ expect(result).toBeNull();
330
+ });
331
+ it('returns null when the document did not change', function () {
332
+ var plugin = (0, _math.EnsureTextAfterMathPlugin)('math');
333
+ var result = plugin.appendTransaction([{
334
+ docChanged: false
335
+ }], {}, {});
336
+ expect(result).toBeNull();
337
+ });
338
+ });
339
+ describe('ZeroWidthSpaceHandlingPlugin', function () {
340
+ var createDocWithMathAndZwsp = function createDocWithMathAndZwsp() {
341
+ var resolveOverrides = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
342
+ return {
343
+ resolve: jest.fn(function (pos) {
344
+ return _objectSpread({
345
+ nodeAfter: null,
346
+ nodeBefore: null,
347
+ pos: pos
348
+ }, resolveOverrides[pos]);
349
+ }),
350
+ nodeAt: jest.fn(function (pos) {
351
+ if (pos === 1) {
352
+ return {
353
+ type: {
354
+ name: 'text'
355
+ },
356
+ textContent: "\u200B"
357
+ };
358
+ }
359
+ if (pos === 0) {
360
+ return {
361
+ type: {
362
+ name: 'math'
363
+ },
364
+ nodeSize: 1
365
+ };
366
+ }
367
+ return null;
368
+ })
369
+ };
370
+ };
371
+ var createDocWithRegularTextBeforeCursor = function createDocWithRegularTextBeforeCursor() {
372
+ return {
373
+ resolve: jest.fn(function (pos) {
374
+ return {
375
+ nodeAfter: null,
376
+ nodeBefore: null,
377
+ pos: pos
378
+ };
379
+ }),
380
+ nodeAt: jest.fn(function (pos) {
381
+ if (pos === 1) {
382
+ return {
383
+ type: {
384
+ name: 'text'
385
+ },
386
+ textContent: 'a'
387
+ };
388
+ }
389
+ return null;
390
+ })
391
+ };
392
+ };
393
+ var createView = function createView() {
394
+ var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
395
+ _ref4$state = _ref4.state,
396
+ stateOverrides = _ref4$state === void 0 ? {} : _ref4$state;
397
+ var dispatch = jest.fn();
398
+ var tr = {
399
+ "delete": jest.fn().mockReturnThis(),
400
+ setSelection: jest.fn().mockReturnThis()
401
+ };
402
+ return {
403
+ state: _objectSpread({
404
+ selection: {
405
+ from: 2,
406
+ empty: true
407
+ },
408
+ doc: createDocWithMathAndZwsp(),
409
+ tr: tr
410
+ }, stateOverrides),
411
+ dispatch: dispatch
412
+ };
413
+ };
414
+ describe('Backspace', function () {
415
+ it('deletes the inline node and zero-width space before the cursor', function () {
416
+ var view = createView();
417
+ var handled = _math.ZeroWidthSpaceHandlingPlugin.props.handleKeyDown(view, {
418
+ key: 'Backspace'
419
+ });
420
+ expect(handled).toBe(true);
421
+ expect(view.state.tr["delete"]).toHaveBeenCalledWith(0, 2);
422
+ expect(view.dispatch).toHaveBeenCalledWith(view.state.tr);
423
+ });
424
+ it('returns false when regular text precedes the cursor', function () {
425
+ var view = createView({
426
+ state: {
427
+ doc: createDocWithRegularTextBeforeCursor()
428
+ }
429
+ });
430
+ var handled = _math.ZeroWidthSpaceHandlingPlugin.props.handleKeyDown(view, {
431
+ key: 'Backspace'
432
+ });
433
+ expect(handled).toBe(false);
434
+ expect(view.state.tr["delete"]).not.toHaveBeenCalled();
435
+ expect(view.dispatch).not.toHaveBeenCalled();
436
+ });
437
+ });
438
+ describe('ArrowLeft', function () {
439
+ it('selects the inline node before a zero-width space', function () {
440
+ var mathNode = {
441
+ nodeSize: 3
442
+ };
443
+ var view = createView({
444
+ state: {
445
+ doc: createDocWithMathAndZwsp({
446
+ 0: {
447
+ nodeAfter: mathNode,
448
+ nodeBefore: null,
449
+ pos: 0
450
+ }
451
+ })
452
+ }
453
+ });
454
+ var _require = require('prosemirror-state'),
455
+ NodeSelection = _require.NodeSelection;
456
+ var handled = _math.ZeroWidthSpaceHandlingPlugin.props.handleKeyDown(view, {
457
+ key: 'ArrowLeft'
458
+ });
459
+ expect(handled).toBe(true);
460
+ expect(view.state.doc.resolve).toHaveBeenCalledWith(0);
461
+ expect(NodeSelection.create).toHaveBeenCalledWith(view.state.doc, 0);
462
+ expect(view.dispatch).toHaveBeenCalled();
463
+ });
464
+ it('moves the text cursor before the zero-width space when no inline node precedes it', function () {
465
+ var view = createView();
466
+ var _require2 = require('prosemirror-state'),
467
+ TextSelection = _require2.TextSelection;
468
+ var handled = _math.ZeroWidthSpaceHandlingPlugin.props.handleKeyDown(view, {
469
+ key: 'ArrowLeft'
470
+ });
471
+ expect(handled).toBe(true);
472
+ expect(view.state.doc.resolve).toHaveBeenCalledWith(0);
473
+ expect(TextSelection.create).toHaveBeenCalledWith(view.state.doc, 0);
474
+ expect(view.dispatch).toHaveBeenCalled();
475
+ });
476
+ it('returns false when regular text precedes the cursor', function () {
477
+ var view = createView({
478
+ state: {
479
+ doc: createDocWithRegularTextBeforeCursor()
480
+ }
481
+ });
482
+ var handled = _math.ZeroWidthSpaceHandlingPlugin.props.handleKeyDown(view, {
483
+ key: 'ArrowLeft'
484
+ });
485
+ expect(handled).toBe(false);
486
+ expect(view.state.tr.setSelection).not.toHaveBeenCalled();
487
+ expect(view.dispatch).not.toHaveBeenCalled();
488
+ });
489
+ });
490
+ it('returns false for unrelated keys', function () {
491
+ var view = createView();
492
+ var handled = _math.ZeroWidthSpaceHandlingPlugin.props.handleKeyDown(view, {
493
+ key: 'Enter'
494
+ });
495
+ expect(handled).toBe(false);
496
+ });
497
+ });
498
+ describe('MathNodeView', function () {
499
+ var createEditorElement = function createEditorElement() {
500
+ var rect = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
501
+ top: 0,
502
+ left: 0,
503
+ width: 600,
504
+ height: 400
505
+ };
506
+ var element = document.createElement('div');
507
+ Object.defineProperty(element, 'getBoundingClientRect', {
508
+ value: jest.fn(function () {
509
+ return rect;
510
+ }),
511
+ configurable: true
512
+ });
513
+ return element;
514
+ };
515
+ var createMockEditor = function createMockEditor() {
516
+ return {
517
+ state: {
518
+ selection: {
519
+ from: 0,
520
+ to: 1,
521
+ node: {
522
+ type: {
523
+ name: 'math'
524
+ }
525
+ }
526
+ },
527
+ tr: {
528
+ setSelection: jest.fn().mockReturnThis(),
529
+ setMeta: jest.fn().mockReturnThis()
530
+ },
531
+ doc: {}
532
+ },
533
+ view: {
534
+ coordsAtPos: jest.fn(function () {
535
+ return {
536
+ top: 100,
537
+ left: 50
538
+ };
539
+ }),
540
+ dispatch: jest.fn()
541
+ },
542
+ options: {
543
+ element: createEditorElement()
544
+ },
545
+ commands: {
546
+ focus: jest.fn()
547
+ },
548
+ instanceId: 'editor-123',
549
+ _toolbarOpened: false
550
+ };
551
+ };
552
+ var mockNode = {
553
+ attrs: {
554
+ latex: 'x^2'
555
+ },
556
+ nodeSize: 1
557
+ };
558
+ var defaultProps;
559
+ beforeEach(function () {
560
+ jest.clearAllMocks();
561
+ mockCreatePortal.mockImplementation(function (node) {
562
+ return node;
563
+ });
564
+ defaultProps = {
565
+ node: mockNode,
566
+ updateAttributes: jest.fn(),
567
+ editor: createMockEditor(),
568
+ selected: false,
569
+ options: {},
570
+ getPos: jest.fn(function () {
571
+ return 0;
572
+ })
573
+ };
574
+ });
575
+ it('renders without crashing', function () {
576
+ var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, defaultProps)),
577
+ container = _render.container;
578
+ expect(container).toBeInTheDocument();
579
+ });
580
+ it('renders NodeViewWrapper', function () {
581
+ var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, defaultProps)),
582
+ getByTestId = _render2.getByTestId;
583
+ expect(getByTestId('node-view-wrapper')).toBeInTheDocument();
584
+ });
585
+ it('displays math preview', function () {
586
+ var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, defaultProps)),
587
+ getByTestId = _render3.getByTestId;
588
+ expect(getByTestId('math-preview')).toBeInTheDocument();
589
+ });
590
+ it('shows toolbar when selected', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
591
+ var _render4, getByTestId;
592
+ return _regenerator["default"].wrap(function (_context) {
593
+ while (1) switch (_context.prev = _context.next) {
594
+ case 0:
595
+ _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
596
+ selected: true
597
+ }))), getByTestId = _render4.getByTestId;
598
+ _context.next = 1;
599
+ return (0, _react2.waitFor)(function () {
600
+ expect(getByTestId('math-toolbar')).toBeInTheDocument();
601
+ });
602
+ case 1:
603
+ case "end":
604
+ return _context.stop();
605
+ }
606
+ }, _callee);
607
+ })));
608
+ it('does not show toolbar when not selected', function () {
609
+ var _render5 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
610
+ selected: false
611
+ }))),
612
+ queryByTestId = _render5.queryByTestId;
613
+ expect(queryByTestId('math-toolbar')).not.toBeInTheDocument();
614
+ });
615
+ it('adds data-toolbar-for attribute with editor instanceId', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
616
+ var _render6, container;
617
+ return _regenerator["default"].wrap(function (_context2) {
618
+ while (1) switch (_context2.prev = _context2.next) {
619
+ case 0:
620
+ _render6 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
621
+ selected: true
622
+ }))), container = _render6.container;
623
+ _context2.next = 1;
624
+ return (0, _react2.waitFor)(function () {
625
+ var toolbar = container.querySelector('[data-toolbar-for]');
626
+ expect(toolbar).toHaveAttribute('data-toolbar-for', 'editor-123');
627
+ });
628
+ case 1:
629
+ case "end":
630
+ return _context2.stop();
631
+ }
632
+ }, _callee2);
633
+ })));
634
+ describe('toolbar positioning', function () {
635
+ it('positions relative to portal container using coordsAtPos', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
636
+ var _render7, container;
637
+ return _regenerator["default"].wrap(function (_context3) {
638
+ while (1) switch (_context3.prev = _context3.next) {
639
+ case 0:
640
+ _render7 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
641
+ selected: true
642
+ }))), container = _render7.container;
643
+ _context3.next = 1;
644
+ return (0, _react2.waitFor)(function () {
645
+ var toolbar = container.querySelector('[data-toolbar-for]');
646
+ expect(toolbar).toBeInTheDocument();
647
+ expect(toolbar.style.top).toBe('100px');
648
+ expect(toolbar.style.left).toBe('50px');
649
+ });
650
+ case 1:
651
+ case "end":
652
+ return _context3.stop();
653
+ }
654
+ }, _callee3);
655
+ })));
656
+ it('offsets position by portal container getBoundingClientRect', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4() {
657
+ var containerEl, editor, _render8, container;
658
+ return _regenerator["default"].wrap(function (_context4) {
659
+ while (1) switch (_context4.prev = _context4.next) {
660
+ case 0:
661
+ containerEl = document.createElement('div');
662
+ containerEl.getBoundingClientRect = jest.fn(function () {
663
+ return {
664
+ top: 100,
665
+ left: 50,
666
+ width: 600,
667
+ height: 400
668
+ };
669
+ });
670
+ editor = _objectSpread(_objectSpread({}, defaultProps.editor), {}, {
671
+ _tiptapContainerEl: containerEl
672
+ });
673
+ _render8 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
674
+ editor: editor,
675
+ selected: true
676
+ }))), container = _render8.container;
677
+ _context4.next = 1;
678
+ return (0, _react2.waitFor)(function () {
679
+ var toolbar = container.querySelector('[data-toolbar-for]');
680
+ expect(toolbar).toBeInTheDocument();
681
+ expect(toolbar.style.top).toBe('0px');
682
+ expect(toolbar.style.left).toBe('0px');
683
+ });
684
+ case 1:
685
+ case "end":
686
+ return _context4.stop();
687
+ }
688
+ }, _callee4);
689
+ })));
690
+ it('applies absolute positioning style to toolbar', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5() {
691
+ var _render9, container;
692
+ return _regenerator["default"].wrap(function (_context5) {
693
+ while (1) switch (_context5.prev = _context5.next) {
694
+ case 0:
695
+ _render9 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
696
+ selected: true
697
+ }))), container = _render9.container;
698
+ _context5.next = 1;
699
+ return (0, _react2.waitFor)(function () {
700
+ var toolbar = container.querySelector('[data-toolbar-for]');
701
+ expect(toolbar).toBeInTheDocument();
702
+ expect(toolbar.style.position).toBe('absolute');
703
+ });
704
+ case 1:
705
+ case "end":
706
+ return _context5.stop();
707
+ }
708
+ }, _callee5);
709
+ })));
710
+ it('renders above other editor overlays with a high z-index', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
711
+ var _render0, container;
712
+ return _regenerator["default"].wrap(function (_context6) {
713
+ while (1) switch (_context6.prev = _context6.next) {
714
+ case 0:
715
+ _render0 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
716
+ selected: true
717
+ }))), container = _render0.container;
718
+ _context6.next = 1;
719
+ return (0, _react2.waitFor)(function () {
720
+ var toolbar = container.querySelector('[data-toolbar-for]');
721
+ expect(toolbar).toBeInTheDocument();
722
+ expect(toolbar.style.zIndex).toBe('1000');
723
+ });
724
+ case 1:
725
+ case "end":
726
+ return _context6.stop();
727
+ }
728
+ }, _callee6);
729
+ })));
730
+ it('updates position from coordsAtPos when selection changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
731
+ var editor, _render1, container;
732
+ return _regenerator["default"].wrap(function (_context7) {
733
+ while (1) switch (_context7.prev = _context7.next) {
734
+ case 0:
735
+ editor = _objectSpread(_objectSpread({}, defaultProps.editor), {}, {
736
+ view: _objectSpread(_objectSpread({}, defaultProps.editor.view), {}, {
737
+ coordsAtPos: jest.fn(function () {
738
+ return {
739
+ top: 200,
740
+ left: 150
741
+ };
742
+ }),
743
+ dispatch: jest.fn()
744
+ })
745
+ });
746
+ _render1 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
747
+ editor: editor,
748
+ selected: true
749
+ }))), container = _render1.container;
750
+ _context7.next = 1;
751
+ return (0, _react2.waitFor)(function () {
752
+ var toolbar = container.querySelector('[data-toolbar-for]');
753
+ expect(toolbar).toBeInTheDocument();
754
+ expect(toolbar.style.top).toBe('200px');
755
+ expect(toolbar.style.left).toBe('150px');
756
+ });
757
+ case 1:
758
+ case "end":
759
+ return _context7.stop();
760
+ }
761
+ }, _callee7);
762
+ })));
763
+ it('clamps toolbar position to viewport margins', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee9() {
764
+ var originalInnerHeight, originalInnerWidth, editor, _render10, container, toolbar;
765
+ return _regenerator["default"].wrap(function (_context9) {
766
+ while (1) switch (_context9.prev = _context9.next) {
767
+ case 0:
768
+ originalInnerHeight = window.innerHeight;
769
+ originalInnerWidth = window.innerWidth;
770
+ Object.defineProperty(window, 'innerHeight', {
771
+ configurable: true,
772
+ writable: true,
773
+ value: 200
774
+ });
775
+ Object.defineProperty(window, 'innerWidth', {
776
+ configurable: true,
777
+ writable: true,
778
+ value: 300
779
+ });
780
+ editor = _objectSpread(_objectSpread({}, defaultProps.editor), {}, {
781
+ view: _objectSpread(_objectSpread({}, defaultProps.editor.view), {}, {
782
+ coordsAtPos: jest.fn(function () {
783
+ return {
784
+ top: 190,
785
+ left: 280,
786
+ bottom: 195
787
+ };
788
+ }),
789
+ dispatch: jest.fn()
790
+ })
791
+ });
792
+ _render10 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
793
+ editor: editor,
794
+ selected: true
795
+ }))), container = _render10.container;
796
+ _context9.next = 1;
797
+ return (0, _react2.waitFor)(function () {
798
+ toolbar = container.querySelector('[data-toolbar-for]');
799
+ expect(toolbar).toBeInTheDocument();
800
+ });
801
+ case 1:
802
+ Object.defineProperty(toolbar, 'offsetHeight', {
803
+ configurable: true,
804
+ value: 100
805
+ });
806
+ Object.defineProperty(toolbar, 'offsetWidth', {
807
+ configurable: true,
808
+ value: 150
809
+ });
810
+ _context9.next = 2;
811
+ return (0, _react2.act)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee8() {
812
+ return _regenerator["default"].wrap(function (_context8) {
813
+ while (1) switch (_context8.prev = _context8.next) {
814
+ case 0:
815
+ window.dispatchEvent(new Event('resize'));
816
+ _context8.next = 1;
817
+ return new Promise(function (resolve) {
818
+ return requestAnimationFrame(resolve);
819
+ });
820
+ case 1:
821
+ case "end":
822
+ return _context8.stop();
823
+ }
824
+ }, _callee8);
825
+ })));
826
+ case 2:
827
+ _context9.next = 3;
828
+ return (0, _react2.waitFor)(function () {
829
+ expect(parseInt(toolbar.style.top, 10)).toBeLessThanOrEqual(200 - 100 - 8);
830
+ expect(parseInt(toolbar.style.left, 10)).toBeLessThanOrEqual(300 - 150 - 8);
831
+ expect(parseInt(toolbar.style.top, 10)).toBeGreaterThanOrEqual(8);
832
+ expect(parseInt(toolbar.style.left, 10)).toBeGreaterThanOrEqual(8);
833
+ });
834
+ case 3:
835
+ Object.defineProperty(window, 'innerHeight', {
836
+ configurable: true,
837
+ writable: true,
838
+ value: originalInnerHeight
839
+ });
840
+ Object.defineProperty(window, 'innerWidth', {
841
+ configurable: true,
842
+ writable: true,
843
+ value: originalInnerWidth
844
+ });
845
+ case 4:
846
+ case "end":
847
+ return _context9.stop();
848
+ }
849
+ }, _callee9);
850
+ })));
851
+ it('attaches scroll and resize listeners while toolbar is open', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee0() {
852
+ var addSpy;
853
+ return _regenerator["default"].wrap(function (_context0) {
854
+ while (1) switch (_context0.prev = _context0.next) {
855
+ case 0:
856
+ addSpy = jest.spyOn(window, 'addEventListener');
857
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
858
+ selected: true
859
+ })));
860
+ _context0.next = 1;
861
+ return (0, _react2.waitFor)(function () {
862
+ expect(addSpy).toHaveBeenCalledWith('scroll', expect.any(Function), true);
863
+ expect(addSpy).toHaveBeenCalledWith('resize', expect.any(Function));
864
+ });
865
+ case 1:
866
+ addSpy.mockRestore();
867
+ case 2:
868
+ case "end":
869
+ return _context0.stop();
870
+ }
871
+ }, _callee0);
872
+ })));
873
+ it('portals toolbar into _tiptapContainerEl when available', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee1() {
874
+ var containerEl, editor;
875
+ return _regenerator["default"].wrap(function (_context1) {
876
+ while (1) switch (_context1.prev = _context1.next) {
877
+ case 0:
878
+ containerEl = document.createElement('div');
879
+ containerEl.getBoundingClientRect = jest.fn(function () {
880
+ return {
881
+ top: 0,
882
+ left: 0,
883
+ width: 600,
884
+ height: 400
885
+ };
886
+ });
887
+ editor = _objectSpread(_objectSpread({}, defaultProps.editor), {}, {
888
+ _tiptapContainerEl: containerEl
889
+ });
890
+ mockCreatePortal.mockClear();
891
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
892
+ editor: editor,
893
+ selected: true
894
+ })));
895
+ _context1.next = 1;
896
+ return (0, _react2.waitFor)(function () {
897
+ expect(mockCreatePortal).toHaveBeenCalled();
898
+ var lastCall = mockCreatePortal.mock.calls[mockCreatePortal.mock.calls.length - 1];
899
+ expect(lastCall[1]).toBe(containerEl);
900
+ });
901
+ case 1:
902
+ case "end":
903
+ return _context1.stop();
904
+ }
905
+ }, _callee1);
906
+ })));
907
+ it('portals toolbar into document.body when _tiptapContainerEl is not set', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee10() {
908
+ var editor;
909
+ return _regenerator["default"].wrap(function (_context10) {
910
+ while (1) switch (_context10.prev = _context10.next) {
911
+ case 0:
912
+ editor = _objectSpread(_objectSpread({}, defaultProps.editor), {}, {
913
+ _tiptapContainerEl: undefined
914
+ });
915
+ mockCreatePortal.mockClear();
916
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
917
+ editor: editor,
918
+ selected: true
919
+ })));
920
+ _context10.next = 1;
921
+ return (0, _react2.waitFor)(function () {
922
+ expect(mockCreatePortal).toHaveBeenCalled();
923
+ var lastCall = mockCreatePortal.mock.calls[mockCreatePortal.mock.calls.length - 1];
924
+ expect(lastCall[1]).toBe(document.body);
925
+ });
926
+ case 1:
927
+ case "end":
928
+ return _context10.stop();
929
+ }
930
+ }, _callee10);
931
+ })));
932
+ });
933
+ it('calls updateAttributes when latex changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee11() {
934
+ var _render11, getByTestId;
935
+ return _regenerator["default"].wrap(function (_context11) {
936
+ while (1) switch (_context11.prev = _context11.next) {
937
+ case 0:
938
+ _render11 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
939
+ selected: true
940
+ }))), getByTestId = _render11.getByTestId;
941
+ _context11.next = 1;
942
+ return (0, _react2.waitFor)(function () {
943
+ var input = getByTestId('math-input');
944
+ _react2.fireEvent.change(input, {
945
+ target: {
946
+ value: 'y^2'
947
+ }
948
+ });
949
+ });
950
+ case 1:
951
+ expect(defaultProps.updateAttributes).toHaveBeenCalledWith({
952
+ latex: 'y^2'
953
+ });
954
+ case 2:
955
+ case "end":
956
+ return _context11.stop();
957
+ }
958
+ }, _callee11);
959
+ })));
960
+ it('closes toolbar and updates attributes when done', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee12() {
961
+ var updateAttributes, _render12, getByTestId, doneButton;
962
+ return _regenerator["default"].wrap(function (_context12) {
963
+ while (1) switch (_context12.prev = _context12.next) {
964
+ case 0:
965
+ updateAttributes = jest.fn();
966
+ _render12 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
967
+ updateAttributes: updateAttributes,
968
+ selected: true
969
+ }))), getByTestId = _render12.getByTestId;
970
+ _context12.next = 1;
971
+ return (0, _react2.waitFor)(function () {
972
+ expect(getByTestId('done-button')).toBeInTheDocument();
973
+ });
974
+ case 1:
975
+ doneButton = getByTestId('done-button');
976
+ _react2.fireEvent.click(doneButton);
977
+ _context12.next = 2;
978
+ return (0, _react2.waitFor)(function () {
979
+ expect(updateAttributes).toHaveBeenCalledWith({
980
+ latex: 'x^2'
981
+ });
982
+ });
983
+ case 2:
984
+ case "end":
985
+ return _context12.stop();
986
+ }
987
+ }, _callee12);
988
+ })));
989
+ it('sets editor._toolbarOpened when toolbar is shown', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee13() {
990
+ var _render13, getByTestId;
991
+ return _regenerator["default"].wrap(function (_context13) {
992
+ while (1) switch (_context13.prev = _context13.next) {
993
+ case 0:
994
+ _render13 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
995
+ selected: true
996
+ }))), getByTestId = _render13.getByTestId;
997
+ _context13.next = 1;
998
+ return (0, _react2.waitFor)(function () {
999
+ expect(getByTestId('math-toolbar')).toBeInTheDocument();
1000
+ expect(defaultProps.editor._toolbarOpened).toBe(true);
1001
+ });
1002
+ case 1:
1003
+ case "end":
1004
+ return _context13.stop();
1005
+ }
1006
+ }, _callee13);
1007
+ })));
1008
+ it('unsets editor._toolbarOpened when toolbar is closed and node is not selected', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee14() {
1009
+ var _render14, getByTestId;
1010
+ return _regenerator["default"].wrap(function (_context14) {
1011
+ while (1) switch (_context14.prev = _context14.next) {
1012
+ case 0:
1013
+ _render14 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
1014
+ selected: false
1015
+ }))), getByTestId = _render14.getByTestId;
1016
+ _react2.fireEvent.click(getByTestId('math-preview'));
1017
+ _context14.next = 1;
1018
+ return (0, _react2.waitFor)(function () {
1019
+ expect(getByTestId('math-toolbar')).toBeInTheDocument();
1020
+ expect(defaultProps.editor._toolbarOpened).toBe(true);
1021
+ });
1022
+ case 1:
1023
+ _react2.fireEvent.click(getByTestId('done-button'));
1024
+ _context14.next = 2;
1025
+ return (0, _react2.waitFor)(function () {
1026
+ expect(defaultProps.editor._toolbarOpened).toBe(false);
1027
+ });
1028
+ case 2:
1029
+ case "end":
1030
+ return _context14.stop();
1031
+ }
1032
+ }, _callee14);
1033
+ })));
1034
+ it('keeps editor._toolbarOpened true while the math node remains selected', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee15() {
1035
+ var _render15, getByTestId;
1036
+ return _regenerator["default"].wrap(function (_context15) {
1037
+ while (1) switch (_context15.prev = _context15.next) {
1038
+ case 0:
1039
+ _render15 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
1040
+ selected: true
1041
+ }))), getByTestId = _render15.getByTestId;
1042
+ _context15.next = 1;
1043
+ return (0, _react2.waitFor)(function () {
1044
+ expect(getByTestId('done-button')).toBeInTheDocument();
1045
+ expect(defaultProps.editor._toolbarOpened).toBe(true);
1046
+ });
1047
+ case 1:
1048
+ _react2.fireEvent.click(getByTestId('done-button'));
1049
+ _context15.next = 2;
1050
+ return (0, _react2.waitFor)(function () {
1051
+ expect(defaultProps.editor._toolbarOpened).toBe(true);
1052
+ });
1053
+ case 2:
1054
+ case "end":
1055
+ return _context15.stop();
1056
+ }
1057
+ }, _callee15);
1058
+ })));
1059
+ it('closes toolbar on outside click and runs handleDone', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee16() {
1060
+ var updateAttributes, editor, _require3, TextSelection, _render16, queryByTestId;
1061
+ return _regenerator["default"].wrap(function (_context16) {
1062
+ while (1) switch (_context16.prev = _context16.next) {
1063
+ case 0:
1064
+ updateAttributes = jest.fn();
1065
+ editor = createMockEditor();
1066
+ _require3 = require('prosemirror-state'), TextSelection = _require3.TextSelection;
1067
+ _render16 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
1068
+ editor: editor,
1069
+ updateAttributes: updateAttributes,
1070
+ selected: true
1071
+ }))), queryByTestId = _render16.queryByTestId;
1072
+ _context16.next = 1;
1073
+ return (0, _react2.waitFor)(function () {
1074
+ expect(queryByTestId('math-toolbar')).toBeInTheDocument();
1075
+ });
1076
+ case 1:
1077
+ _react2.fireEvent.click(document.body);
1078
+ _context16.next = 2;
1079
+ return (0, _react2.waitFor)(function () {
1080
+ expect(queryByTestId('math-toolbar')).not.toBeInTheDocument();
1081
+ expect(updateAttributes).toHaveBeenCalledWith({
1082
+ latex: 'x^2'
1083
+ });
1084
+ expect(TextSelection.create).toHaveBeenCalledWith(editor.state.doc, 1);
1085
+ expect(editor.state.tr.setSelection).toHaveBeenCalled();
1086
+ expect(editor.view.dispatch).toHaveBeenCalledWith(editor.state.tr);
1087
+ expect(editor.commands.focus).toHaveBeenCalled();
1088
+ expect(editor._toolbarOpened).toBe(true);
1089
+ });
1090
+ case 2:
1091
+ case "end":
1092
+ return _context16.stop();
1093
+ }
1094
+ }, _callee16);
1095
+ })));
1096
+ it('re-registers click listener when node changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee17() {
1097
+ var addEventListenerSpy, removeEventListenerSpy, nodeA, nodeB, _render17, rerender, initialCallCount;
1098
+ return _regenerator["default"].wrap(function (_context17) {
1099
+ while (1) switch (_context17.prev = _context17.next) {
1100
+ case 0:
1101
+ addEventListenerSpy = jest.spyOn(document, 'addEventListener');
1102
+ removeEventListenerSpy = jest.spyOn(document, 'removeEventListener');
1103
+ nodeA = {
1104
+ attrs: {
1105
+ latex: 'x^2'
1106
+ }
1107
+ };
1108
+ nodeB = {
1109
+ attrs: {
1110
+ latex: 'y^2'
1111
+ }
1112
+ };
1113
+ _render17 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
1114
+ node: nodeA,
1115
+ selected: true
1116
+ }))), rerender = _render17.rerender;
1117
+ _context17.next = 1;
1118
+ return (0, _react2.waitFor)(function () {
1119
+ expect(addEventListenerSpy).toHaveBeenCalledWith('click', expect.any(Function));
1120
+ });
1121
+ case 1:
1122
+ initialCallCount = addEventListenerSpy.mock.calls.length;
1123
+ rerender(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
1124
+ node: nodeB,
1125
+ selected: true
1126
+ })));
1127
+ _context17.next = 2;
1128
+ return (0, _react2.waitFor)(function () {
1129
+ expect(removeEventListenerSpy).toHaveBeenCalled();
1130
+ expect(addEventListenerSpy.mock.calls.length).toBeGreaterThan(initialCallCount);
1131
+ });
1132
+ case 2:
1133
+ addEventListenerSpy.mockRestore();
1134
+ removeEventListenerSpy.mockRestore();
1135
+ case 3:
1136
+ case "end":
1137
+ return _context17.stop();
1138
+ }
1139
+ }, _callee17);
1140
+ })));
1141
+ it('does not close toolbar when clicking the math node preview', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee18() {
1142
+ var _render18, getByTestId, queryByTestId;
1143
+ return _regenerator["default"].wrap(function (_context18) {
1144
+ while (1) switch (_context18.prev = _context18.next) {
1145
+ case 0:
1146
+ _render18 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
1147
+ selected: true
1148
+ }))), getByTestId = _render18.getByTestId, queryByTestId = _render18.queryByTestId;
1149
+ _context18.next = 1;
1150
+ return (0, _react2.waitFor)(function () {
1151
+ expect(queryByTestId('math-toolbar')).toBeInTheDocument();
1152
+ });
1153
+ case 1:
1154
+ _react2.fireEvent.click(getByTestId('math-preview'));
1155
+ _context18.next = 2;
1156
+ return (0, _react2.waitFor)(function () {
1157
+ expect(queryByTestId('math-toolbar')).toBeInTheDocument();
1158
+ });
1159
+ case 2:
1160
+ case "end":
1161
+ return _context18.stop();
1162
+ }
1163
+ }, _callee18);
1164
+ })));
1165
+ describe('unique math-node class per instance', function () {
1166
+ var dateNowSpy;
1167
+ beforeEach(function () {
1168
+ var timestamp = 1000;
1169
+ dateNowSpy = jest.spyOn(Date, 'now').mockImplementation(function () {
1170
+ return timestamp++;
1171
+ });
1172
+ });
1173
+ afterEach(function () {
1174
+ dateNowSpy.mockRestore();
1175
+ });
1176
+
1177
+ // The wrapper is an emotion styled() component, so className also carries
1178
+ // emotion's generated class - assert on the math-node token, not equality.
1179
+ it('assigns a timestamp-based class to NodeViewWrapper', function () {
1180
+ var _render19 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, defaultProps)),
1181
+ getByTestId = _render19.getByTestId;
1182
+ var wrapper = getByTestId('node-view-wrapper');
1183
+ expect(Array.from(wrapper.classList).some(function (c) {
1184
+ return /^math-node-\d+$/.test(c);
1185
+ })).toBe(true);
1186
+ });
1187
+ it('assigns a different class to each MathNodeView instance', function () {
1188
+ var _render20 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_math.MathNodeView, defaultProps), /*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
1189
+ node: {
1190
+ attrs: {
1191
+ latex: 'y^2'
1192
+ }
1193
+ }
1194
+ })))),
1195
+ getAllByTestId = _render20.getAllByTestId;
1196
+ var wrappers = getAllByTestId('node-view-wrapper');
1197
+ var mathNodeClass = function mathNodeClass(el) {
1198
+ return Array.from(el.classList).find(function (c) {
1199
+ return c.startsWith('math-node-');
1200
+ });
1201
+ };
1202
+ expect(mathNodeClass(wrappers[0])).toBe('math-node-1000');
1203
+ expect(mathNodeClass(wrappers[1])).toBe('math-node-1001');
1204
+ // and they must differ
1205
+ expect(mathNodeClass(wrappers[0])).not.toBe(mathNodeClass(wrappers[1]));
1206
+ });
1207
+ it('closes toolbar when clicking a different math node', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee19() {
1208
+ var updateAttributes, editorA, editorB, _render21, getAllByTestId, queryAllByTestId, secondPreview;
1209
+ return _regenerator["default"].wrap(function (_context19) {
1210
+ while (1) switch (_context19.prev = _context19.next) {
1211
+ case 0:
1212
+ updateAttributes = jest.fn();
1213
+ editorA = createMockEditor();
1214
+ editorB = createMockEditor();
1215
+ _render21 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
1216
+ editor: editorA,
1217
+ updateAttributes: updateAttributes,
1218
+ selected: false
1219
+ })), /*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
1220
+ editor: editorB,
1221
+ node: {
1222
+ attrs: {
1223
+ latex: 'y^2'
1224
+ }
1225
+ },
1226
+ selected: false
1227
+ })))), getAllByTestId = _render21.getAllByTestId, queryAllByTestId = _render21.queryAllByTestId;
1228
+ _react2.fireEvent.click(getAllByTestId('math-preview')[0]);
1229
+ _context19.next = 1;
1230
+ return (0, _react2.waitFor)(function () {
1231
+ expect(queryAllByTestId('math-toolbar')).toHaveLength(1);
1232
+ });
1233
+ case 1:
1234
+ secondPreview = getAllByTestId('math-preview')[1];
1235
+ _react2.fireEvent.click(secondPreview);
1236
+ _context19.next = 2;
1237
+ return (0, _react2.waitFor)(function () {
1238
+ expect(queryAllByTestId('math-toolbar')).toHaveLength(1);
1239
+ expect(updateAttributes).toHaveBeenCalledWith({
1240
+ latex: 'x^2'
1241
+ });
1242
+ expect(editorA._toolbarOpened).toBe(false);
1243
+ expect(getAllByTestId('math-input')[0]).toHaveValue('y^2');
1244
+ });
1245
+ case 2:
1246
+ case "end":
1247
+ return _context19.stop();
1248
+ }
1249
+ }, _callee19);
1250
+ })));
1251
+ });
1252
+ describe('selection-based toolbar guard', function () {
1253
+ it('opens toolbar when selected transitions to true and the editor has a NodeSelection on math', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee20() {
1254
+ var _render22, queryByTestId, rerender;
1255
+ return _regenerator["default"].wrap(function (_context20) {
1256
+ while (1) switch (_context20.prev = _context20.next) {
1257
+ case 0:
1258
+ _render22 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
1259
+ selected: false
1260
+ }))), queryByTestId = _render22.queryByTestId, rerender = _render22.rerender;
1261
+ expect(queryByTestId('math-toolbar')).not.toBeInTheDocument();
1262
+ rerender(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
1263
+ selected: true
1264
+ })));
1265
+ _context20.next = 1;
1266
+ return (0, _react2.waitFor)(function () {
1267
+ expect(queryByTestId('math-toolbar')).toBeInTheDocument();
1268
+ });
1269
+ case 1:
1270
+ case "end":
1271
+ return _context20.stop();
1272
+ }
1273
+ }, _callee20);
1274
+ })));
1275
+ it('does not open toolbar when selected briefly becomes true but editor selection has no node (Cmd+A / drag case)', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee22() {
1276
+ var editor, _render23, queryByTestId, rerender;
1277
+ return _regenerator["default"].wrap(function (_context22) {
1278
+ while (1) switch (_context22.prev = _context22.next) {
1279
+ case 0:
1280
+ editor = _objectSpread(_objectSpread({}, defaultProps.editor), {}, {
1281
+ state: _objectSpread(_objectSpread({}, defaultProps.editor.state), {}, {
1282
+ selection: {
1283
+ from: 0,
1284
+ to: 100
1285
+ } // no .node — TextSelection / AllSelection shape
1286
+ })
1287
+ });
1288
+ _render23 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
1289
+ editor: editor,
1290
+ selected: false
1291
+ }))), queryByTestId = _render23.queryByTestId, rerender = _render23.rerender;
1292
+ rerender(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
1293
+ editor: editor,
1294
+ selected: true
1295
+ })));
1296
+ _context22.next = 1;
1297
+ return (0, _react2.act)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee21() {
1298
+ return _regenerator["default"].wrap(function (_context21) {
1299
+ while (1) switch (_context21.prev = _context21.next) {
1300
+ case 0:
1301
+ case "end":
1302
+ return _context21.stop();
1303
+ }
1304
+ }, _callee21);
1305
+ })));
1306
+ case 1:
1307
+ expect(queryByTestId('math-toolbar')).not.toBeInTheDocument();
1308
+ case 2:
1309
+ case "end":
1310
+ return _context22.stop();
1311
+ }
1312
+ }, _callee22);
1313
+ })));
1314
+ it('does not open toolbar when selected briefly becomes true but NodeSelection targets a non-math node', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee24() {
1315
+ var editor, _render24, queryByTestId, rerender;
1316
+ return _regenerator["default"].wrap(function (_context24) {
1317
+ while (1) switch (_context24.prev = _context24.next) {
1318
+ case 0:
1319
+ editor = _objectSpread(_objectSpread({}, defaultProps.editor), {}, {
1320
+ state: _objectSpread(_objectSpread({}, defaultProps.editor.state), {}, {
1321
+ selection: {
1322
+ from: 0,
1323
+ to: 1,
1324
+ node: {
1325
+ type: {
1326
+ name: 'image'
1327
+ }
1328
+ }
1329
+ }
1330
+ })
1331
+ });
1332
+ _render24 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
1333
+ editor: editor,
1334
+ selected: false
1335
+ }))), queryByTestId = _render24.queryByTestId, rerender = _render24.rerender;
1336
+ rerender(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
1337
+ editor: editor,
1338
+ selected: true
1339
+ })));
1340
+ _context24.next = 1;
1341
+ return (0, _react2.act)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee23() {
1342
+ return _regenerator["default"].wrap(function (_context23) {
1343
+ while (1) switch (_context23.prev = _context23.next) {
1344
+ case 0:
1345
+ case "end":
1346
+ return _context23.stop();
1347
+ }
1348
+ }, _callee23);
1349
+ })));
1350
+ case 1:
1351
+ expect(queryByTestId('math-toolbar')).not.toBeInTheDocument();
1352
+ case 2:
1353
+ case "end":
1354
+ return _context24.stop();
1355
+ }
1356
+ }, _callee24);
1357
+ })));
1358
+ });
1359
+ it('does not close toolbar when clicking equation editor dropdown', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee25() {
1360
+ var _render25, queryByTestId, dropdown;
1361
+ return _regenerator["default"].wrap(function (_context25) {
1362
+ while (1) switch (_context25.prev = _context25.next) {
1363
+ case 0:
1364
+ _render25 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
1365
+ selected: true
1366
+ }))), queryByTestId = _render25.queryByTestId;
1367
+ _context25.next = 1;
1368
+ return (0, _react2.waitFor)(function () {
1369
+ expect(queryByTestId('math-toolbar')).toBeInTheDocument();
1370
+ });
1371
+ case 1:
1372
+ // Simulate MUI Select's portal dropdown container.
1373
+ dropdown = document.createElement('div');
1374
+ dropdown.id = 'equation-editor-select-listbox';
1375
+ document.body.appendChild(dropdown);
1376
+ _react2.fireEvent.click(dropdown);
1377
+ _context25.next = 2;
1378
+ return (0, _react2.waitFor)(function () {
1379
+ expect(queryByTestId('math-toolbar')).toBeInTheDocument();
1380
+ });
1381
+ case 2:
1382
+ document.body.removeChild(dropdown);
1383
+ case 3:
1384
+ case "end":
1385
+ return _context25.stop();
1386
+ }
1387
+ }, _callee25);
1388
+ })));
1389
+ it('renders with empty latex', function () {
1390
+ var nodeWithEmptyLatex = {
1391
+ attrs: {
1392
+ latex: ''
1393
+ }
1394
+ };
1395
+ var _render26 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
1396
+ node: nodeWithEmptyLatex
1397
+ }))),
1398
+ getByTestId = _render26.getByTestId;
1399
+ expect(getByTestId('math-preview')).toBeInTheDocument();
1400
+ });
1401
+ it('has correct styling on NodeViewWrapper', function () {
1402
+ var _render27 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, defaultProps)),
1403
+ getByTestId = _render27.getByTestId;
1404
+ var wrapper = getByTestId('node-view-wrapper');
1405
+ expect(wrapper).toHaveStyle({
1406
+ display: 'inline-flex',
1407
+ cursor: 'pointer'
1408
+ });
1409
+ });
1410
+ });
1411
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfbWF0aCIsInRvb2xiYXJVdGlscyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX2V4Y2x1ZGVkIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiX3R5cGVvZjMiLCJoYXMiLCJnZXQiLCJzZXQiLCJfdCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJqZXN0IiwibW9jayIsIk5vZGVWaWV3V3JhcHBlciIsIl9yZWYiLCJjaGlsZHJlbiIsInByb3BzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsImNyZWF0ZUVsZW1lbnQiLCJfZXh0ZW5kczIiLCJSZWFjdE5vZGVWaWV3UmVuZGVyZXIiLCJmbiIsImNvbXBvbmVudCIsIm1vY2tDcmVhdGVQb3J0YWwiLCJub2RlIiwicmVxdWlyZUFjdHVhbCIsImNyZWF0ZVBvcnRhbCIsIlJlYWN0IiwiTWF0aFByZXZpZXciLCJfcmVmMiIsImxhdGV4IiwiTWF0aFRvb2xiYXIiLCJfcmVmMyIsIm9uQ2hhbmdlIiwib25Eb25lIiwiX1JlYWN0JHVzZVN0YXRlIiwidXNlU3RhdGUiLCJfUmVhY3QkdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkyIiwibG9jYWxMYXRleCIsInNldExvY2FsTGF0ZXgiLCJ2YWx1ZSIsInRhcmdldCIsIm9uQ2xpY2siLCJ3cmFwTWF0aCIsIndyYXBwZXIiLCJOb2RlIiwiY3JlYXRlIiwiY29uZmlnIiwiUGx1Z2luIiwiUGx1Z2luS2V5Iiwia2V5IiwiVGV4dFNlbGVjdGlvbiIsImRvYyIsInBvcyIsInR5cGUiLCJOb2RlU2VsZWN0aW9uIiwiZGVzY3JpYmUiLCJpdCIsImV4cGVjdCIsIk1hdGhOb2RlIiwibmFtZSIsInRvQmUiLCJpbmxpbmUiLCJncm91cCIsImF0b20iLCJhdHRyaWJ1dGVzIiwiYWRkQXR0cmlidXRlcyIsInRvSGF2ZVByb3BlcnR5IiwidG9FcXVhbCIsImh0bWwiLCJydWxlcyIsInBhcnNlSFRNTCIsIkFycmF5IiwiaXNBcnJheSIsInRvSGF2ZUxlbmd0aCIsInJlc3VsdCIsInJlbmRlckhUTUwiLCJIVE1MQXR0cmlidXRlcyIsImNvbW1hbmRzIiwiYWRkQ29tbWFuZHMiLCJfdHlwZW9mMiIsImluc2VydE1hdGgiLCJzZXRUb29sYmFyT3BlbmVkU3B5Iiwic3B5T24iLCJtYXRoTm9kZSIsIm5vZGVTaXplIiwidHIiLCJpbnNlcnQiLCJtb2NrUmV0dXJuVGhpcyIsInNldFNlbGVjdGlvbiIsImVkaXRvciIsInZpZXciLCJzdGF0ZSIsInNjaGVtYSIsIm5vZGVzIiwibWF0aCIsInNlbGVjdGlvbiIsIiRmcm9tIiwiZGlzcGF0Y2giLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsInRvSGF2ZUJlZW5DYWxsZWQiLCJtb2NrUmVzdG9yZSIsImFkZE5vZGVWaWV3IiwidG9CZURlZmluZWQiLCJwbHVnaW5zIiwiYWRkUHJvc2VNaXJyb3JQbHVnaW5zIiwiYXBwZW5kVHJhbnNhY3Rpb24iLCJoYW5kbGVLZXlEb3duIiwicGx1Z2luIiwiRW5zdXJlVGV4dEFmdGVyTWF0aFBsdWdpbiIsInRleHROb2RlIiwibmV3U3RhdGUiLCJ0ZXh0IiwiZGVzY2VuZGFudHMiLCJjYiIsIm5vZGVBdCIsImRvY0NoYW5nZWQiLCJhbnl0aGluZyIsIm5vdCIsInRvQmVOdWxsIiwiY3JlYXRlRG9jV2l0aE1hdGhBbmRad3NwIiwicmVzb2x2ZU92ZXJyaWRlcyIsInVuZGVmaW5lZCIsInJlc29sdmUiLCJub2RlQWZ0ZXIiLCJub2RlQmVmb3JlIiwidGV4dENvbnRlbnQiLCJjcmVhdGVEb2NXaXRoUmVndWxhclRleHRCZWZvcmVDdXJzb3IiLCJjcmVhdGVWaWV3IiwiX3JlZjQiLCJfcmVmNCRzdGF0ZSIsInN0YXRlT3ZlcnJpZGVzIiwiZnJvbSIsImVtcHR5IiwiaGFuZGxlZCIsIlplcm9XaWR0aFNwYWNlSGFuZGxpbmdQbHVnaW4iLCJfcmVxdWlyZSIsIl9yZXF1aXJlMiIsImNyZWF0ZUVkaXRvckVsZW1lbnQiLCJyZWN0IiwidG9wIiwibGVmdCIsIndpZHRoIiwiaGVpZ2h0IiwiZWxlbWVudCIsImRvY3VtZW50IiwiY29uZmlndXJhYmxlIiwiY3JlYXRlTW9ja0VkaXRvciIsInRvIiwic2V0TWV0YSIsImNvb3Jkc0F0UG9zIiwib3B0aW9ucyIsImZvY3VzIiwiaW5zdGFuY2VJZCIsIl90b29sYmFyT3BlbmVkIiwibW9ja05vZGUiLCJhdHRycyIsImRlZmF1bHRQcm9wcyIsImJlZm9yZUVhY2giLCJjbGVhckFsbE1vY2tzIiwibW9ja0ltcGxlbWVudGF0aW9uIiwidXBkYXRlQXR0cmlidXRlcyIsInNlbGVjdGVkIiwiZ2V0UG9zIiwiX3JlbmRlciIsInJlbmRlciIsIk1hdGhOb2RlVmlldyIsImNvbnRhaW5lciIsInRvQmVJblRoZURvY3VtZW50IiwiX3JlbmRlcjIiLCJnZXRCeVRlc3RJZCIsIl9yZW5kZXIzIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJfcmVuZGVyNCIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0Iiwid2FpdEZvciIsInN0b3AiLCJfcmVuZGVyNSIsInF1ZXJ5QnlUZXN0SWQiLCJfY2FsbGVlMiIsIl9yZW5kZXI2IiwiX2NvbnRleHQyIiwidG9vbGJhciIsInF1ZXJ5U2VsZWN0b3IiLCJ0b0hhdmVBdHRyaWJ1dGUiLCJfY2FsbGVlMyIsIl9yZW5kZXI3IiwiX2NvbnRleHQzIiwic3R5bGUiLCJfY2FsbGVlNCIsImNvbnRhaW5lckVsIiwiX3JlbmRlcjgiLCJfY29udGV4dDQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJfdGlwdGFwQ29udGFpbmVyRWwiLCJfY2FsbGVlNSIsIl9yZW5kZXI5IiwiX2NvbnRleHQ1IiwicG9zaXRpb24iLCJfY2FsbGVlNiIsIl9yZW5kZXIwIiwiX2NvbnRleHQ2IiwiekluZGV4IiwiX2NhbGxlZTciLCJfcmVuZGVyMSIsIl9jb250ZXh0NyIsIl9jYWxsZWU5Iiwib3JpZ2luYWxJbm5lckhlaWdodCIsIm9yaWdpbmFsSW5uZXJXaWR0aCIsIl9yZW5kZXIxMCIsIl9jb250ZXh0OSIsIndpbmRvdyIsImlubmVySGVpZ2h0IiwiaW5uZXJXaWR0aCIsIndyaXRhYmxlIiwiYm90dG9tIiwiYWN0IiwiX2NhbGxlZTgiLCJfY29udGV4dDgiLCJkaXNwYXRjaEV2ZW50IiwiRXZlbnQiLCJQcm9taXNlIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwicGFyc2VJbnQiLCJ0b0JlTGVzc1RoYW5PckVxdWFsIiwidG9CZUdyZWF0ZXJUaGFuT3JFcXVhbCIsIl9jYWxsZWUwIiwiYWRkU3B5IiwiX2NvbnRleHQwIiwiYW55IiwiRnVuY3Rpb24iLCJfY2FsbGVlMSIsIl9jb250ZXh0MSIsIm1vY2tDbGVhciIsImxhc3RDYWxsIiwiY2FsbHMiLCJfY2FsbGVlMTAiLCJfY29udGV4dDEwIiwiYm9keSIsIl9jYWxsZWUxMSIsIl9yZW5kZXIxMSIsIl9jb250ZXh0MTEiLCJpbnB1dCIsImZpcmVFdmVudCIsImNoYW5nZSIsIl9jYWxsZWUxMiIsIl9yZW5kZXIxMiIsImRvbmVCdXR0b24iLCJfY29udGV4dDEyIiwiY2xpY2siLCJfY2FsbGVlMTMiLCJfcmVuZGVyMTMiLCJfY29udGV4dDEzIiwiX2NhbGxlZTE0IiwiX3JlbmRlcjE0IiwiX2NvbnRleHQxNCIsIl9jYWxsZWUxNSIsIl9yZW5kZXIxNSIsIl9jb250ZXh0MTUiLCJfY2FsbGVlMTYiLCJfcmVxdWlyZTMiLCJfcmVuZGVyMTYiLCJfY29udGV4dDE2IiwiX2NhbGxlZTE3IiwiYWRkRXZlbnRMaXN0ZW5lclNweSIsInJlbW92ZUV2ZW50TGlzdGVuZXJTcHkiLCJub2RlQSIsIm5vZGVCIiwiX3JlbmRlcjE3IiwicmVyZW5kZXIiLCJpbml0aWFsQ2FsbENvdW50IiwiX2NvbnRleHQxNyIsInRvQmVHcmVhdGVyVGhhbiIsIl9jYWxsZWUxOCIsIl9yZW5kZXIxOCIsIl9jb250ZXh0MTgiLCJkYXRlTm93U3B5IiwidGltZXN0YW1wIiwiRGF0ZSIsImFmdGVyRWFjaCIsIl9yZW5kZXIxOSIsImNsYXNzTGlzdCIsInNvbWUiLCJjIiwidGVzdCIsIl9yZW5kZXIyMCIsIkZyYWdtZW50IiwiZ2V0QWxsQnlUZXN0SWQiLCJ3cmFwcGVycyIsIm1hdGhOb2RlQ2xhc3MiLCJlbCIsImZpbmQiLCJzdGFydHNXaXRoIiwiX2NhbGxlZTE5IiwiZWRpdG9yQSIsImVkaXRvckIiLCJfcmVuZGVyMjEiLCJxdWVyeUFsbEJ5VGVzdElkIiwic2Vjb25kUHJldmlldyIsIl9jb250ZXh0MTkiLCJ0b0hhdmVWYWx1ZSIsIl9jYWxsZWUyMCIsIl9yZW5kZXIyMiIsIl9jb250ZXh0MjAiLCJfY2FsbGVlMjIiLCJfcmVuZGVyMjMiLCJfY29udGV4dDIyIiwiX2NhbGxlZTIxIiwiX2NvbnRleHQyMSIsIl9jYWxsZWUyNCIsIl9yZW5kZXIyNCIsIl9jb250ZXh0MjQiLCJfY2FsbGVlMjMiLCJfY29udGV4dDIzIiwiX2NhbGxlZTI1IiwiX3JlbmRlcjI1IiwiZHJvcGRvd24iLCJfY29udGV4dDI1IiwiaWQiLCJhcHBlbmRDaGlsZCIsInJlbW92ZUNoaWxkIiwibm9kZVdpdGhFbXB0eUxhdGV4IiwiX3JlbmRlcjI2IiwiX3JlbmRlcjI3IiwidG9IYXZlU3R5bGUiLCJkaXNwbGF5IiwiY3Vyc29yIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2V4dGVuc2lvbnMvX190ZXN0c19fL21hdGgudGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyLCB3YWl0Rm9yLCBmaXJlRXZlbnQsIGFjdCB9IGZyb20gJ0B0ZXN0aW5nLWxpYnJhcnkvcmVhY3QnO1xuaW1wb3J0IHsgRW5zdXJlVGV4dEFmdGVyTWF0aFBsdWdpbiwgTWF0aE5vZGUsIE1hdGhOb2RlVmlldywgWmVyb1dpZHRoU3BhY2VIYW5kbGluZ1BsdWdpbiB9IGZyb20gJy4uL21hdGgnO1xuaW1wb3J0ICogYXMgdG9vbGJhclV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3Rvb2xiYXInO1xuXG5qZXN0Lm1vY2soJ0B0aXB0YXAvcmVhY3QnLCAoKSA9PiAoe1xuICBOb2RlVmlld1dyYXBwZXI6ICh7IGNoaWxkcmVuLCAuLi5wcm9wcyB9KSA9PiAoXG4gICAgPGRpdiBkYXRhLXRlc3RpZD1cIm5vZGUtdmlldy13cmFwcGVyXCIgey4uLnByb3BzfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L2Rpdj5cbiAgKSxcbiAgUmVhY3ROb2RlVmlld1JlbmRlcmVyOiBqZXN0LmZuKChjb21wb25lbnQpID0+IGNvbXBvbmVudCksXG59KSk7XG5cbmNvbnN0IG1vY2tDcmVhdGVQb3J0YWwgPSBqZXN0LmZuKChub2RlKSA9PiBub2RlKTtcbmplc3QubW9jaygncmVhY3QtZG9tJywgKCkgPT4gKHtcbiAgLi4uamVzdC5yZXF1aXJlQWN0dWFsKCdyZWFjdC1kb20nKSxcbiAgY3JlYXRlUG9ydGFsOiAoLi4uYXJncykgPT4gbW9ja0NyZWF0ZVBvcnRhbCguLi5hcmdzKSxcbn0pKTtcblxuamVzdC5tb2NrKCdAcGllLWxpYi9tYXRoLXRvb2xiYXInLCAoKSA9PiB7XG4gIGNvbnN0IFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcbiAgcmV0dXJuIHtcbiAgICBNYXRoUHJldmlldzogKHsgbGF0ZXggfSkgPT4gPGRpdiBkYXRhLXRlc3RpZD1cIm1hdGgtcHJldmlld1wiPntsYXRleH08L2Rpdj4sXG4gICAgTWF0aFRvb2xiYXI6ICh7IGxhdGV4LCBvbkNoYW5nZSwgb25Eb25lIH0pID0+IHtcbiAgICAgIGNvbnN0IFtsb2NhbExhdGV4LCBzZXRMb2NhbExhdGV4XSA9IFJlYWN0LnVzZVN0YXRlKGxhdGV4KTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJtYXRoLXRvb2xiYXJcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwibWF0aC1pbnB1dFwiXG4gICAgICAgICAgICB2YWx1ZT17bG9jYWxMYXRleH1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xuICAgICAgICAgICAgICBzZXRMb2NhbExhdGV4KGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgICAgb25DaGFuZ2UoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxidXR0b24gZGF0YS10ZXN0aWQ9XCJkb25lLWJ1dHRvblwiIG9uQ2xpY2s9eygpID0+IG9uRG9uZShsb2NhbExhdGV4KX0+XG4gICAgICAgICAgICBEb25lXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICB9LFxuICB9O1xufSk7XG5cbmplc3QubW9jaygnQHBpZS1saWIvbWF0aC1yZW5kZXJpbmcnLCAoKSA9PiAoe1xuICB3cmFwTWF0aDogKGxhdGV4LCB3cmFwcGVyKSA9PiBsYXRleCxcbn0pKTtcblxuamVzdC5tb2NrKCdAdGlwdGFwL2NvcmUnLCAoKSA9PiAoe1xuICBOb2RlOiB7XG4gICAgY3JlYXRlOiBqZXN0LmZuKChjb25maWcpID0+IGNvbmZpZyksXG4gIH0sXG59KSk7XG5cbmplc3QubW9jaygncHJvc2VtaXJyb3Itc3RhdGUnLCAoKSA9PiAoe1xuICBQbHVnaW46IGplc3QuZm4oZnVuY3Rpb24gKGNvbmZpZykge1xuICAgIHJldHVybiBjb25maWc7XG4gIH0pLFxuICBQbHVnaW5LZXk6IGplc3QuZm4oZnVuY3Rpb24gKGtleSkge1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICB9KSxcbiAgVGV4dFNlbGVjdGlvbjoge1xuICAgIGNyZWF0ZTogamVzdC5mbigoZG9jLCBwb3MpID0+ICh7IHR5cGU6ICd0ZXh0JywgcG9zIH0pKSxcbiAgfSxcbiAgTm9kZVNlbGVjdGlvbjoge1xuICAgIGNyZWF0ZTogamVzdC5mbigoZG9jLCBwb3MpID0+ICh7IHR5cGU6ICdub2RlJywgcG9zIH0pKSxcbiAgfSxcbn0pKTtcblxuZGVzY3JpYmUoJ01hdGhOb2RlJywgKCkgPT4ge1xuICBkZXNjcmliZSgnY29uZmlndXJhdGlvbicsICgpID0+IHtcbiAgICBpdCgnaGFzIGNvcnJlY3QgbmFtZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChNYXRoTm9kZS5uYW1lKS50b0JlKCdtYXRoJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXMgaW5saW5lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KE1hdGhOb2RlLmlubGluZSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBpbiBpbmxpbmUgZ3JvdXAnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoTWF0aE5vZGUuZ3JvdXApLnRvQmUoJ2lubGluZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIGF0b21pYycsICgpID0+IHtcbiAgICAgIGV4cGVjdChNYXRoTm9kZS5hdG9tKS50b0JlKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkQXR0cmlidXRlcycsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyByZXF1aXJlZCBhdHRyaWJ1dGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IE1hdGhOb2RlLmFkZEF0dHJpYnV0ZXMoKTtcblxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCdsYXRleCcpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCd3cmFwcGVyJyk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcykudG9IYXZlUHJvcGVydHkoJ2h0bWwnKTtcblxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMubGF0ZXgpLnRvRXF1YWwoeyBkZWZhdWx0OiAnJyB9KTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzLndyYXBwZXIpLnRvRXF1YWwoeyBkZWZhdWx0OiBudWxsIH0pO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMuaHRtbCkudG9FcXVhbCh7IGRlZmF1bHQ6IG51bGwgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwYXJzZUhUTUwnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgcGFyc2luZyBydWxlcyBmb3IgbGF0ZXgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBydWxlcyA9IE1hdGhOb2RlLnBhcnNlSFRNTCgpO1xuXG4gICAgICBleHBlY3QoQXJyYXkuaXNBcnJheShydWxlcykpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QocnVsZXMpLnRvSGF2ZUxlbmd0aCgyKTtcbiAgICAgIGV4cGVjdChydWxlc1swXSkudG9IYXZlUHJvcGVydHkoJ3RhZycsICdzcGFuW2RhdGEtbGF0ZXhdJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBwYXJzaW5nIHJ1bGVzIGZvciBtYXRobWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBydWxlcyA9IE1hdGhOb2RlLnBhcnNlSFRNTCgpO1xuICAgICAgZXhwZWN0KHJ1bGVzWzFdKS50b0hhdmVQcm9wZXJ0eSgndGFnJywgJ3NwYW5bZGF0YS10eXBlPVwibWF0aG1sXCJdJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZW5kZXJIVE1MJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIG1hdGhtbCB3aGVuIGh0bWwgYXR0cmlidXRlIGlzIHByZXNlbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBNYXRoTm9kZS5yZW5kZXJIVE1MKHtcbiAgICAgICAgSFRNTEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBodG1sOiAnPG1hdGg+PG1pPng8L21pPjwvbWF0aD4nLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHRbMF0pLnRvQmUoJ3NwYW4nKTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMV0pLnRvSGF2ZVByb3BlcnR5KCdkYXRhLXR5cGUnLCAnbWF0aG1sJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBsYXRleCB3aGVuIGh0bWwgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gTWF0aE5vZGUucmVuZGVySFRNTCh7XG4gICAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgbGF0ZXg6ICd4XjInLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHRbMF0pLnRvQmUoJ3NwYW4nKTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMV0pLnRvSGF2ZVByb3BlcnR5KCdkYXRhLWxhdGV4JywgJycpO1xuICAgICAgZXhwZWN0KHJlc3VsdFsxXSkudG9IYXZlUHJvcGVydHkoJ2RhdGEtcmF3JywgJ3heMicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkQ29tbWFuZHMnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgaW5zZXJ0TWF0aCBjb21tYW5kJywgKCkgPT4ge1xuICAgICAgY29uc3QgY29tbWFuZHMgPSBNYXRoTm9kZS5hZGRDb21tYW5kcygpO1xuXG4gICAgICBleHBlY3QoY29tbWFuZHMpLnRvSGF2ZVByb3BlcnR5KCdpbnNlcnRNYXRoJyk7XG4gICAgICBleHBlY3QodHlwZW9mIGNvbW1hbmRzLmluc2VydE1hdGgpLnRvQmUoJ2Z1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5zZXJ0TWF0aCBvcGVucyB0aGUgdG9vbGJhciBhZnRlciBpbnNlcnRpbmcgYSBtYXRoIG5vZGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZXRUb29sYmFyT3BlbmVkU3B5ID0gamVzdC5zcHlPbih0b29sYmFyVXRpbHMsICdzZXRUb29sYmFyT3BlbmVkJyk7XG4gICAgICBjb25zdCBtYXRoTm9kZSA9IHsgdHlwZTogeyBuYW1lOiAnbWF0aCcgfSwgbm9kZVNpemU6IDEgfTtcbiAgICAgIGNvbnN0IHRyID0ge1xuICAgICAgICBpbnNlcnQ6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxuICAgICAgICBzZXRTZWxlY3Rpb246IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxuICAgICAgICBkb2M6IHt9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGVkaXRvciA9IHtcbiAgICAgICAgdmlldzoge1xuICAgICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgICBzY2hlbWE6IHsgbm9kZXM6IHsgbWF0aDogeyBjcmVhdGU6IGplc3QuZm4oKCkgPT4gbWF0aE5vZGUpIH0gfSB9LFxuICAgICAgICAgICAgc2VsZWN0aW9uOiB7ICRmcm9tOiB7IHBvczogMSB9IH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCBkaXNwYXRjaCA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IGluc2VydE1hdGggPSBNYXRoTm9kZS5hZGRDb21tYW5kcygpLmluc2VydE1hdGgoJ3heMicpO1xuXG4gICAgICBpbnNlcnRNYXRoKHsgdHIsIGVkaXRvciwgZGlzcGF0Y2ggfSk7XG5cbiAgICAgIGV4cGVjdCh0ci5pbnNlcnQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDEsIG1hdGhOb2RlKTtcbiAgICAgIGV4cGVjdCh0ci5zZXRTZWxlY3Rpb24pLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIGV4cGVjdChkaXNwYXRjaCkudG9IYXZlQmVlbkNhbGxlZFdpdGgodHIpO1xuICAgICAgZXhwZWN0KHNldFRvb2xiYXJPcGVuZWRTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGVkaXRvciwgdHJ1ZSk7XG5cbiAgICAgIHNldFRvb2xiYXJPcGVuZWRTcHkubW9ja1Jlc3RvcmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZE5vZGVWaWV3JywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIFJlYWN0Tm9kZVZpZXdSZW5kZXJlciByZXN1bHQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBNYXRoTm9kZS5hZGROb2RlVmlldygpO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkUHJvc2VNaXJyb3JQbHVnaW5zJywgKCkgPT4ge1xuICAgIGl0KCdyZWdpc3RlcnMgZW5zdXJlLXRleHQtYWZ0ZXItbWF0aCBhbmQgemVyby13aWR0aC1zcGFjZSBwbHVnaW5zJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGx1Z2lucyA9IE1hdGhOb2RlLmFkZFByb3NlTWlycm9yUGx1Z2lucygpO1xuXG4gICAgICBleHBlY3QocGx1Z2lucykudG9IYXZlTGVuZ3RoKDIpO1xuICAgICAgZXhwZWN0KHBsdWdpbnNbMF0uYXBwZW5kVHJhbnNhY3Rpb24pLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QocGx1Z2luc1sxXS5wcm9wcy5oYW5kbGVLZXlEb3duKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnRW5zdXJlVGV4dEFmdGVyTWF0aFBsdWdpbicsICgpID0+IHtcbiAgaXQoJ2luc2VydHMgYSB6ZXJvLXdpZHRoIHNwYWNlIGFmdGVyIGEgbWF0aCBub2RlIHdoZW4gbm8gdGV4dCBmb2xsb3dzJywgKCkgPT4ge1xuICAgIGNvbnN0IHBsdWdpbiA9IEVuc3VyZVRleHRBZnRlck1hdGhQbHVnaW4oJ21hdGgnKTtcbiAgICBjb25zdCB0ZXh0Tm9kZSA9IHsgdHlwZTogeyBuYW1lOiAndGV4dCcgfSB9O1xuICAgIGNvbnN0IG1hdGhOb2RlID0geyB0eXBlOiB7IG5hbWU6ICdtYXRoJyB9LCBub2RlU2l6ZTogMyB9O1xuICAgIGNvbnN0IHRyID0geyBpbnNlcnQ6IGplc3QuZm4oKSB9O1xuXG4gICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICBzY2hlbWE6IHsgdGV4dDogamVzdC5mbigodmFsdWUpID0+ICh7IHR5cGU6IHRleHROb2RlLnR5cGUsIHRleHQ6IHZhbHVlIH0pKSB9LFxuICAgICAgdHIsXG4gICAgICBkb2M6IHtcbiAgICAgICAgZGVzY2VuZGFudHM6IChjYikgPT4gY2IobWF0aE5vZGUsIDUpLFxuICAgICAgICBub2RlQXQ6IGplc3QuZm4oKCkgPT4gbnVsbCksXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBwbHVnaW4uYXBwZW5kVHJhbnNhY3Rpb24oW3sgZG9jQ2hhbmdlZDogdHJ1ZSB9XSwge30sIG5ld1N0YXRlKTtcblxuICAgIGV4cGVjdCh0ci5pbnNlcnQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDgsIGV4cGVjdC5hbnl0aGluZygpKTtcbiAgICBleHBlY3QocmVzdWx0KS50b0JlKHRyKTtcbiAgfSk7XG5cbiAgaXQoJ2RvZXMgbm90IGluc2VydCB3aGVuIHRleHQgYWxyZWFkeSBmb2xsb3dzIHRoZSBtYXRoIG5vZGUnLCAoKSA9PiB7XG4gICAgY29uc3QgcGx1Z2luID0gRW5zdXJlVGV4dEFmdGVyTWF0aFBsdWdpbignbWF0aCcpO1xuICAgIGNvbnN0IHRyID0geyBpbnNlcnQ6IGplc3QuZm4oKSB9O1xuICAgIGNvbnN0IG1hdGhOb2RlID0geyB0eXBlOiB7IG5hbWU6ICdtYXRoJyB9LCBub2RlU2l6ZTogMyB9O1xuXG4gICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICBzY2hlbWE6IHsgdGV4dDogamVzdC5mbigpIH0sXG4gICAgICB0cixcbiAgICAgIGRvYzoge1xuICAgICAgICBkZXNjZW5kYW50czogKGNiKSA9PiBjYihtYXRoTm9kZSwgNSksXG4gICAgICAgIG5vZGVBdDogamVzdC5mbigoKSA9PiAoeyB0eXBlOiB7IG5hbWU6ICd0ZXh0JyB9IH0pKSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHBsdWdpbi5hcHBlbmRUcmFuc2FjdGlvbihbeyBkb2NDaGFuZ2VkOiB0cnVlIH1dLCB7fSwgbmV3U3RhdGUpO1xuXG4gICAgZXhwZWN0KHRyLmluc2VydCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICBleHBlY3QocmVzdWx0KS50b0JlTnVsbCgpO1xuICB9KTtcblxuICBpdCgncmV0dXJucyBudWxsIHdoZW4gdGhlIGRvY3VtZW50IGRpZCBub3QgY2hhbmdlJywgKCkgPT4ge1xuICAgIGNvbnN0IHBsdWdpbiA9IEVuc3VyZVRleHRBZnRlck1hdGhQbHVnaW4oJ21hdGgnKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHBsdWdpbi5hcHBlbmRUcmFuc2FjdGlvbihbeyBkb2NDaGFuZ2VkOiBmYWxzZSB9XSwge30sIHt9KTtcbiAgICBleHBlY3QocmVzdWx0KS50b0JlTnVsbCgpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnWmVyb1dpZHRoU3BhY2VIYW5kbGluZ1BsdWdpbicsICgpID0+IHtcbiAgY29uc3QgY3JlYXRlRG9jV2l0aE1hdGhBbmRad3NwID0gKHJlc29sdmVPdmVycmlkZXMgPSB7fSkgPT4gKHtcbiAgICByZXNvbHZlOiBqZXN0LmZuKChwb3MpID0+ICh7XG4gICAgICBub2RlQWZ0ZXI6IG51bGwsXG4gICAgICBub2RlQmVmb3JlOiBudWxsLFxuICAgICAgcG9zLFxuICAgICAgLi4ucmVzb2x2ZU92ZXJyaWRlc1twb3NdLFxuICAgIH0pKSxcbiAgICBub2RlQXQ6IGplc3QuZm4oKHBvcykgPT4ge1xuICAgICAgaWYgKHBvcyA9PT0gMSkge1xuICAgICAgICByZXR1cm4geyB0eXBlOiB7IG5hbWU6ICd0ZXh0JyB9LCB0ZXh0Q29udGVudDogJ1xcdTIwMGInIH07XG4gICAgICB9XG4gICAgICBpZiAocG9zID09PSAwKSB7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IHsgbmFtZTogJ21hdGgnIH0sIG5vZGVTaXplOiAxIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KSxcbiAgfSk7XG5cbiAgY29uc3QgY3JlYXRlRG9jV2l0aFJlZ3VsYXJUZXh0QmVmb3JlQ3Vyc29yID0gKCkgPT4gKHtcbiAgICByZXNvbHZlOiBqZXN0LmZuKChwb3MpID0+ICh7IG5vZGVBZnRlcjogbnVsbCwgbm9kZUJlZm9yZTogbnVsbCwgcG9zIH0pKSxcbiAgICBub2RlQXQ6IGplc3QuZm4oKHBvcykgPT4ge1xuICAgICAgaWYgKHBvcyA9PT0gMSkge1xuICAgICAgICByZXR1cm4geyB0eXBlOiB7IG5hbWU6ICd0ZXh0JyB9LCB0ZXh0Q29udGVudDogJ2EnIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KSxcbiAgfSk7XG5cbiAgY29uc3QgY3JlYXRlVmlldyA9ICh7IHN0YXRlOiBzdGF0ZU92ZXJyaWRlcyA9IHt9IH0gPSB7fSkgPT4ge1xuICAgIGNvbnN0IGRpc3BhdGNoID0gamVzdC5mbigpO1xuICAgIGNvbnN0IHRyID0ge1xuICAgICAgZGVsZXRlOiBqZXN0LmZuKCkubW9ja1JldHVyblRoaXMoKSxcbiAgICAgIHNldFNlbGVjdGlvbjogamVzdC5mbigpLm1vY2tSZXR1cm5UaGlzKCksXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZToge1xuICAgICAgICBzZWxlY3Rpb246IHsgZnJvbTogMiwgZW1wdHk6IHRydWUgfSxcbiAgICAgICAgZG9jOiBjcmVhdGVEb2NXaXRoTWF0aEFuZFp3c3AoKSxcbiAgICAgICAgdHIsXG4gICAgICAgIC4uLnN0YXRlT3ZlcnJpZGVzLFxuICAgICAgfSxcbiAgICAgIGRpc3BhdGNoLFxuICAgIH07XG4gIH07XG5cbiAgZGVzY3JpYmUoJ0JhY2tzcGFjZScsICgpID0+IHtcbiAgICBpdCgnZGVsZXRlcyB0aGUgaW5saW5lIG5vZGUgYW5kIHplcm8td2lkdGggc3BhY2UgYmVmb3JlIHRoZSBjdXJzb3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB2aWV3ID0gY3JlYXRlVmlldygpO1xuICAgICAgY29uc3QgaGFuZGxlZCA9IFplcm9XaWR0aFNwYWNlSGFuZGxpbmdQbHVnaW4ucHJvcHMuaGFuZGxlS2V5RG93bih2aWV3LCB7IGtleTogJ0JhY2tzcGFjZScgfSk7XG5cbiAgICAgIGV4cGVjdChoYW5kbGVkKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHZpZXcuc3RhdGUudHIuZGVsZXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgwLCAyKTtcbiAgICAgIGV4cGVjdCh2aWV3LmRpc3BhdGNoKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh2aWV3LnN0YXRlLnRyKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGZhbHNlIHdoZW4gcmVndWxhciB0ZXh0IHByZWNlZGVzIHRoZSBjdXJzb3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB2aWV3ID0gY3JlYXRlVmlldyh7XG4gICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgZG9jOiBjcmVhdGVEb2NXaXRoUmVndWxhclRleHRCZWZvcmVDdXJzb3IoKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBoYW5kbGVkID0gWmVyb1dpZHRoU3BhY2VIYW5kbGluZ1BsdWdpbi5wcm9wcy5oYW5kbGVLZXlEb3duKHZpZXcsIHsga2V5OiAnQmFja3NwYWNlJyB9KTtcblxuICAgICAgZXhwZWN0KGhhbmRsZWQpLnRvQmUoZmFsc2UpO1xuICAgICAgZXhwZWN0KHZpZXcuc3RhdGUudHIuZGVsZXRlKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgZXhwZWN0KHZpZXcuZGlzcGF0Y2gpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdBcnJvd0xlZnQnLCAoKSA9PiB7XG4gICAgaXQoJ3NlbGVjdHMgdGhlIGlubGluZSBub2RlIGJlZm9yZSBhIHplcm8td2lkdGggc3BhY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtYXRoTm9kZSA9IHsgbm9kZVNpemU6IDMgfTtcbiAgICAgIGNvbnN0IHZpZXcgPSBjcmVhdGVWaWV3KHtcbiAgICAgICAgc3RhdGU6IHtcbiAgICAgICAgICBkb2M6IGNyZWF0ZURvY1dpdGhNYXRoQW5kWndzcCh7XG4gICAgICAgICAgICAwOiB7IG5vZGVBZnRlcjogbWF0aE5vZGUsIG5vZGVCZWZvcmU6IG51bGwsIHBvczogMCB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCB7IE5vZGVTZWxlY3Rpb24gfSA9IHJlcXVpcmUoJ3Byb3NlbWlycm9yLXN0YXRlJyk7XG5cbiAgICAgIGNvbnN0IGhhbmRsZWQgPSBaZXJvV2lkdGhTcGFjZUhhbmRsaW5nUGx1Z2luLnByb3BzLmhhbmRsZUtleURvd24odmlldywgeyBrZXk6ICdBcnJvd0xlZnQnIH0pO1xuXG4gICAgICBleHBlY3QoaGFuZGxlZCkudG9CZSh0cnVlKTtcbiAgICAgIGV4cGVjdCh2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgwKTtcbiAgICAgIGV4cGVjdChOb2RlU2VsZWN0aW9uLmNyZWF0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgodmlldy5zdGF0ZS5kb2MsIDApO1xuICAgICAgZXhwZWN0KHZpZXcuZGlzcGF0Y2gpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdtb3ZlcyB0aGUgdGV4dCBjdXJzb3IgYmVmb3JlIHRoZSB6ZXJvLXdpZHRoIHNwYWNlIHdoZW4gbm8gaW5saW5lIG5vZGUgcHJlY2VkZXMgaXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2aWV3ID0gY3JlYXRlVmlldygpO1xuICAgICAgY29uc3QgeyBUZXh0U2VsZWN0aW9uIH0gPSByZXF1aXJlKCdwcm9zZW1pcnJvci1zdGF0ZScpO1xuXG4gICAgICBjb25zdCBoYW5kbGVkID0gWmVyb1dpZHRoU3BhY2VIYW5kbGluZ1BsdWdpbi5wcm9wcy5oYW5kbGVLZXlEb3duKHZpZXcsIHsga2V5OiAnQXJyb3dMZWZ0JyB9KTtcblxuICAgICAgZXhwZWN0KGhhbmRsZWQpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3Qodmlldy5zdGF0ZS5kb2MucmVzb2x2ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoMCk7XG4gICAgICBleHBlY3QoVGV4dFNlbGVjdGlvbi5jcmVhdGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHZpZXcuc3RhdGUuZG9jLCAwKTtcbiAgICAgIGV4cGVjdCh2aWV3LmRpc3BhdGNoKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBmYWxzZSB3aGVuIHJlZ3VsYXIgdGV4dCBwcmVjZWRlcyB0aGUgY3Vyc29yJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmlldyA9IGNyZWF0ZVZpZXcoe1xuICAgICAgICBzdGF0ZToge1xuICAgICAgICAgIGRvYzogY3JlYXRlRG9jV2l0aFJlZ3VsYXJUZXh0QmVmb3JlQ3Vyc29yKCksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgaGFuZGxlZCA9IFplcm9XaWR0aFNwYWNlSGFuZGxpbmdQbHVnaW4ucHJvcHMuaGFuZGxlS2V5RG93bih2aWV3LCB7IGtleTogJ0Fycm93TGVmdCcgfSk7XG5cbiAgICAgIGV4cGVjdChoYW5kbGVkKS50b0JlKGZhbHNlKTtcbiAgICAgIGV4cGVjdCh2aWV3LnN0YXRlLnRyLnNldFNlbGVjdGlvbikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIGV4cGVjdCh2aWV3LmRpc3BhdGNoKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgncmV0dXJucyBmYWxzZSBmb3IgdW5yZWxhdGVkIGtleXMnLCAoKSA9PiB7XG4gICAgY29uc3QgdmlldyA9IGNyZWF0ZVZpZXcoKTtcblxuICAgIGNvbnN0IGhhbmRsZWQgPSBaZXJvV2lkdGhTcGFjZUhhbmRsaW5nUGx1Z2luLnByb3BzLmhhbmRsZUtleURvd24odmlldywgeyBrZXk6ICdFbnRlcicgfSk7XG4gICAgZXhwZWN0KGhhbmRsZWQpLnRvQmUoZmFsc2UpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnTWF0aE5vZGVWaWV3JywgKCkgPT4ge1xuICBjb25zdCBjcmVhdGVFZGl0b3JFbGVtZW50ID0gKHJlY3QgPSB7IHRvcDogMCwgbGVmdDogMCwgd2lkdGg6IDYwMCwgaGVpZ2h0OiA0MDAgfSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ2dldEJvdW5kaW5nQ2xpZW50UmVjdCcsIHtcbiAgICAgIHZhbHVlOiBqZXN0LmZuKCgpID0+IHJlY3QpLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9O1xuXG4gIGNvbnN0IGNyZWF0ZU1vY2tFZGl0b3IgPSAoKSA9PiAoe1xuICAgIHN0YXRlOiB7XG4gICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgZnJvbTogMCxcbiAgICAgICAgdG86IDEsXG4gICAgICAgIG5vZGU6IHsgdHlwZTogeyBuYW1lOiAnbWF0aCcgfSB9LFxuICAgICAgfSxcbiAgICAgIHRyOiB7XG4gICAgICAgIHNldFNlbGVjdGlvbjogamVzdC5mbigpLm1vY2tSZXR1cm5UaGlzKCksXG4gICAgICAgIHNldE1ldGE6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxuICAgICAgfSxcbiAgICAgIGRvYzoge30sXG4gICAgfSxcbiAgICB2aWV3OiB7XG4gICAgICBjb29yZHNBdFBvczogamVzdC5mbigoKSA9PiAoeyB0b3A6IDEwMCwgbGVmdDogNTAgfSkpLFxuICAgICAgZGlzcGF0Y2g6IGplc3QuZm4oKSxcbiAgICB9LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGVsZW1lbnQ6IGNyZWF0ZUVkaXRvckVsZW1lbnQoKSxcbiAgICB9LFxuICAgIGNvbW1hbmRzOiB7XG4gICAgICBmb2N1czogamVzdC5mbigpLFxuICAgIH0sXG4gICAgaW5zdGFuY2VJZDogJ2VkaXRvci0xMjMnLFxuICAgIF90b29sYmFyT3BlbmVkOiBmYWxzZSxcbiAgfSk7XG5cbiAgY29uc3QgbW9ja05vZGUgPSB7XG4gICAgYXR0cnM6IHtcbiAgICAgIGxhdGV4OiAneF4yJyxcbiAgICB9LFxuICAgIG5vZGVTaXplOiAxLFxuICB9O1xuXG4gIGxldCBkZWZhdWx0UHJvcHM7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gICAgbW9ja0NyZWF0ZVBvcnRhbC5tb2NrSW1wbGVtZW50YXRpb24oKG5vZGUpID0+IG5vZGUpO1xuICAgIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgIG5vZGU6IG1vY2tOb2RlLFxuICAgICAgdXBkYXRlQXR0cmlidXRlczogamVzdC5mbigpLFxuICAgICAgZWRpdG9yOiBjcmVhdGVNb2NrRWRpdG9yKCksXG4gICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICBvcHRpb25zOiB7fSxcbiAgICAgIGdldFBvczogamVzdC5mbigoKSA9PiAwKSxcbiAgICB9O1xuICB9KTtcblxuICBpdCgncmVuZGVycyB3aXRob3V0IGNyYXNoaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbmRlcnMgTm9kZVZpZXdXcmFwcGVyJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlcig8TWF0aE5vZGVWaWV3IHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ25vZGUtdmlldy13cmFwcGVyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdkaXNwbGF5cyBtYXRoIHByZXZpZXcnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnbWF0aC1wcmV2aWV3JykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdzaG93cyB0b29sYmFyIHdoZW4gc2VsZWN0ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnbWF0aC10b29sYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCBzaG93IHRvb2xiYXIgd2hlbiBub3Qgc2VsZWN0ZWQnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkIH0gPSByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17ZmFsc2V9IC8+KTtcbiAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnbWF0aC10b29sYmFyJykpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBpdCgnYWRkcyBkYXRhLXRvb2xiYXItZm9yIGF0dHJpYnV0ZSB3aXRoIGVkaXRvciBpbnN0YW5jZUlkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17dHJ1ZX0gLz4pO1xuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgY29uc3QgdG9vbGJhciA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbZGF0YS10b29sYmFyLWZvcl0nKTtcbiAgICAgIGV4cGVjdCh0b29sYmFyKS50b0hhdmVBdHRyaWJ1dGUoJ2RhdGEtdG9vbGJhci1mb3InLCAnZWRpdG9yLTEyMycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndG9vbGJhciBwb3NpdGlvbmluZycsICgpID0+IHtcbiAgICBpdCgncG9zaXRpb25zIHJlbGF0aXZlIHRvIHBvcnRhbCBjb250YWluZXIgdXNpbmcgY29vcmRzQXRQb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBjb25zdCB0b29sYmFyID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRvb2xiYXItZm9yXScpO1xuICAgICAgICBleHBlY3QodG9vbGJhcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgICAgZXhwZWN0KHRvb2xiYXIuc3R5bGUudG9wKS50b0JlKCcxMDBweCcpO1xuICAgICAgICBleHBlY3QodG9vbGJhci5zdHlsZS5sZWZ0KS50b0JlKCc1MHB4Jyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdvZmZzZXRzIHBvc2l0aW9uIGJ5IHBvcnRhbCBjb250YWluZXIgZ2V0Qm91bmRpbmdDbGllbnRSZWN0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGNvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCA9IGplc3QuZm4oKCkgPT4gKHsgdG9wOiAxMDAsIGxlZnQ6IDUwLCB3aWR0aDogNjAwLCBoZWlnaHQ6IDQwMCB9KSk7XG5cbiAgICAgIGNvbnN0IGVkaXRvciA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLmVkaXRvcixcbiAgICAgICAgX3RpcHRhcENvbnRhaW5lckVsOiBjb250YWluZXJFbCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvcn0gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBjb25zdCB0b29sYmFyID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRvb2xiYXItZm9yXScpO1xuICAgICAgICBleHBlY3QodG9vbGJhcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgICAgZXhwZWN0KHRvb2xiYXIuc3R5bGUudG9wKS50b0JlKCcwcHgnKTtcbiAgICAgICAgZXhwZWN0KHRvb2xiYXIuc3R5bGUubGVmdCkudG9CZSgnMHB4Jyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdhcHBsaWVzIGFic29sdXRlIHBvc2l0aW9uaW5nIHN0eWxlIHRvIHRvb2xiYXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBjb25zdCB0b29sYmFyID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRvb2xiYXItZm9yXScpO1xuICAgICAgICBleHBlY3QodG9vbGJhcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgICAgZXhwZWN0KHRvb2xiYXIuc3R5bGUucG9zaXRpb24pLnRvQmUoJ2Fic29sdXRlJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGFib3ZlIG90aGVyIGVkaXRvciBvdmVybGF5cyB3aXRoIGEgaGlnaCB6LWluZGV4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8TWF0aE5vZGVWaWV3IHsuLi5kZWZhdWx0UHJvcHN9IHNlbGVjdGVkPXt0cnVlfSAvPik7XG4gICAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgICAgY29uc3QgdG9vbGJhciA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbZGF0YS10b29sYmFyLWZvcl0nKTtcbiAgICAgICAgZXhwZWN0KHRvb2xiYXIpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICAgIGV4cGVjdCh0b29sYmFyLnN0eWxlLnpJbmRleCkudG9CZSgnMTAwMCcpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgndXBkYXRlcyBwb3NpdGlvbiBmcm9tIGNvb3Jkc0F0UG9zIHdoZW4gc2VsZWN0aW9uIGNoYW5nZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlZGl0b3IgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcy5lZGl0b3IsXG4gICAgICAgIHZpZXc6IHtcbiAgICAgICAgICAuLi5kZWZhdWx0UHJvcHMuZWRpdG9yLnZpZXcsXG4gICAgICAgICAgY29vcmRzQXRQb3M6IGplc3QuZm4oKCkgPT4gKHsgdG9wOiAyMDAsIGxlZnQ6IDE1MCB9KSksXG4gICAgICAgICAgZGlzcGF0Y2g6IGplc3QuZm4oKSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvcn0gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBjb25zdCB0b29sYmFyID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRvb2xiYXItZm9yXScpO1xuICAgICAgICBleHBlY3QodG9vbGJhcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgICAgZXhwZWN0KHRvb2xiYXIuc3R5bGUudG9wKS50b0JlKCcyMDBweCcpO1xuICAgICAgICBleHBlY3QodG9vbGJhci5zdHlsZS5sZWZ0KS50b0JlKCcxNTBweCcpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2xhbXBzIHRvb2xiYXIgcG9zaXRpb24gdG8gdmlld3BvcnQgbWFyZ2lucycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSW5uZXJIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgICBjb25zdCBvcmlnaW5hbElubmVyV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2lubmVySGVpZ2h0JywgeyBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogMjAwIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2lubmVyV2lkdGgnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiAzMDAgfSk7XG5cbiAgICAgIGNvbnN0IGVkaXRvciA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLmVkaXRvcixcbiAgICAgICAgdmlldzoge1xuICAgICAgICAgIC4uLmRlZmF1bHRQcm9wcy5lZGl0b3IudmlldyxcbiAgICAgICAgICBjb29yZHNBdFBvczogamVzdC5mbigoKSA9PiAoeyB0b3A6IDE5MCwgbGVmdDogMjgwLCBib3R0b206IDE5NSB9KSksXG4gICAgICAgICAgZGlzcGF0Y2g6IGplc3QuZm4oKSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvcn0gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgICAgbGV0IHRvb2xiYXI7XG4gICAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgICAgdG9vbGJhciA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbZGF0YS10b29sYmFyLWZvcl0nKTtcbiAgICAgICAgZXhwZWN0KHRvb2xiYXIpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICB9KTtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRvb2xiYXIsICdvZmZzZXRIZWlnaHQnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IDEwMCB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0b29sYmFyLCAnb2Zmc2V0V2lkdGgnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IDE1MCB9KTtcblxuICAgICAgYXdhaXQgYWN0KGFzeW5jICgpID0+IHtcbiAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdyZXNpemUnKSk7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZSkpO1xuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBleHBlY3QocGFyc2VJbnQodG9vbGJhci5zdHlsZS50b3AsIDEwKSkudG9CZUxlc3NUaGFuT3JFcXVhbCgyMDAgLSAxMDAgLSA4KTtcbiAgICAgICAgZXhwZWN0KHBhcnNlSW50KHRvb2xiYXIuc3R5bGUubGVmdCwgMTApKS50b0JlTGVzc1RoYW5PckVxdWFsKDMwMCAtIDE1MCAtIDgpO1xuICAgICAgICBleHBlY3QocGFyc2VJbnQodG9vbGJhci5zdHlsZS50b3AsIDEwKSkudG9CZUdyZWF0ZXJUaGFuT3JFcXVhbCg4KTtcbiAgICAgICAgZXhwZWN0KHBhcnNlSW50KHRvb2xiYXIuc3R5bGUubGVmdCwgMTApKS50b0JlR3JlYXRlclRoYW5PckVxdWFsKDgpO1xuICAgICAgfSk7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdpbm5lckhlaWdodCcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IG9yaWdpbmFsSW5uZXJIZWlnaHQgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnaW5uZXJXaWR0aCcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IG9yaWdpbmFsSW5uZXJXaWR0aCB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdhdHRhY2hlcyBzY3JvbGwgYW5kIHJlc2l6ZSBsaXN0ZW5lcnMgd2hpbGUgdG9vbGJhciBpcyBvcGVuJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYWRkU3B5ID0gamVzdC5zcHlPbih3aW5kb3csICdhZGRFdmVudExpc3RlbmVyJyk7XG4gICAgICByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17dHJ1ZX0gLz4pO1xuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChhZGRTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdzY3JvbGwnLCBleHBlY3QuYW55KEZ1bmN0aW9uKSwgdHJ1ZSk7XG4gICAgICAgIGV4cGVjdChhZGRTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdyZXNpemUnLCBleHBlY3QuYW55KEZ1bmN0aW9uKSk7XG4gICAgICB9KTtcbiAgICAgIGFkZFNweS5tb2NrUmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3BvcnRhbHMgdG9vbGJhciBpbnRvIF90aXB0YXBDb250YWluZXJFbCB3aGVuIGF2YWlsYWJsZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lckVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBjb250YWluZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPSBqZXN0LmZuKCgpID0+ICh7IHRvcDogMCwgbGVmdDogMCwgd2lkdGg6IDYwMCwgaGVpZ2h0OiA0MDAgfSkpO1xuXG4gICAgICBjb25zdCBlZGl0b3IgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcy5lZGl0b3IsXG4gICAgICAgIF90aXB0YXBDb250YWluZXJFbDogY29udGFpbmVyRWwsXG4gICAgICB9O1xuXG4gICAgICBtb2NrQ3JlYXRlUG9ydGFsLm1vY2tDbGVhcigpO1xuICAgICAgcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gZWRpdG9yPXtlZGl0b3J9IHNlbGVjdGVkPXt0cnVlfSAvPik7XG4gICAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KG1vY2tDcmVhdGVQb3J0YWwpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgY29uc3QgbGFzdENhbGwgPSBtb2NrQ3JlYXRlUG9ydGFsLm1vY2suY2FsbHNbbW9ja0NyZWF0ZVBvcnRhbC5tb2NrLmNhbGxzLmxlbmd0aCAtIDFdO1xuICAgICAgICBleHBlY3QobGFzdENhbGxbMV0pLnRvQmUoY29udGFpbmVyRWwpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncG9ydGFscyB0b29sYmFyIGludG8gZG9jdW1lbnQuYm9keSB3aGVuIF90aXB0YXBDb250YWluZXJFbCBpcyBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZWRpdG9yID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMuZWRpdG9yLFxuICAgICAgICBfdGlwdGFwQ29udGFpbmVyRWw6IHVuZGVmaW5lZCxcbiAgICAgIH07XG5cbiAgICAgIG1vY2tDcmVhdGVQb3J0YWwubW9ja0NsZWFyKCk7XG4gICAgICByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvcn0gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBleHBlY3QobW9ja0NyZWF0ZVBvcnRhbCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICBjb25zdCBsYXN0Q2FsbCA9IG1vY2tDcmVhdGVQb3J0YWwubW9jay5jYWxsc1ttb2NrQ3JlYXRlUG9ydGFsLm1vY2suY2FsbHMubGVuZ3RoIC0gMV07XG4gICAgICAgIGV4cGVjdChsYXN0Q2FsbFsxXSkudG9CZShkb2N1bWVudC5ib2R5KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnY2FsbHMgdXBkYXRlQXR0cmlidXRlcyB3aGVuIGxhdGV4IGNoYW5nZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gZ2V0QnlUZXN0SWQoJ21hdGgtaW5wdXQnKTtcbiAgICAgIGZpcmVFdmVudC5jaGFuZ2UoaW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAneV4yJyB9IH0pO1xuICAgIH0pO1xuICAgIGV4cGVjdChkZWZhdWx0UHJvcHMudXBkYXRlQXR0cmlidXRlcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoeyBsYXRleDogJ3leMicgfSk7XG4gIH0pO1xuXG4gIGl0KCdjbG9zZXMgdG9vbGJhciBhbmQgdXBkYXRlcyBhdHRyaWJ1dGVzIHdoZW4gZG9uZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB1cGRhdGVBdHRyaWJ1dGVzID0gamVzdC5mbigpO1xuICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlcihcbiAgICAgIDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gdXBkYXRlQXR0cmlidXRlcz17dXBkYXRlQXR0cmlidXRlc30gc2VsZWN0ZWQ9e3RydWV9IC8+LFxuICAgICk7XG5cbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnZG9uZS1idXR0b24nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGRvbmVCdXR0b24gPSBnZXRCeVRlc3RJZCgnZG9uZS1idXR0b24nKTtcbiAgICBmaXJlRXZlbnQuY2xpY2soZG9uZUJ1dHRvbik7XG5cbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGV4cGVjdCh1cGRhdGVBdHRyaWJ1dGVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh7IGxhdGV4OiAneF4yJyB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3NldHMgZWRpdG9yLl90b29sYmFyT3BlbmVkIHdoZW4gdG9vbGJhciBpcyBzaG93bicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17dHJ1ZX0gLz4pO1xuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdtYXRoLXRvb2xiYXInKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChkZWZhdWx0UHJvcHMuZWRpdG9yLl90b29sYmFyT3BlbmVkKS50b0JlKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgndW5zZXRzIGVkaXRvci5fdG9vbGJhck9wZW5lZCB3aGVuIHRvb2xiYXIgaXMgY2xvc2VkIGFuZCBub2RlIGlzIG5vdCBzZWxlY3RlZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17ZmFsc2V9IC8+KTtcblxuICAgIGZpcmVFdmVudC5jbGljayhnZXRCeVRlc3RJZCgnbWF0aC1wcmV2aWV3JykpO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ21hdGgtdG9vbGJhcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KGRlZmF1bHRQcm9wcy5lZGl0b3IuX3Rvb2xiYXJPcGVuZWQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBmaXJlRXZlbnQuY2xpY2soZ2V0QnlUZXN0SWQoJ2RvbmUtYnV0dG9uJykpO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QoZGVmYXVsdFByb3BzLmVkaXRvci5fdG9vbGJhck9wZW5lZCkudG9CZShmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdrZWVwcyBlZGl0b3IuX3Rvb2xiYXJPcGVuZWQgdHJ1ZSB3aGlsZSB0aGUgbWF0aCBub2RlIHJlbWFpbnMgc2VsZWN0ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdkb25lLWJ1dHRvbicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KGRlZmF1bHRQcm9wcy5lZGl0b3IuX3Rvb2xiYXJPcGVuZWQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBmaXJlRXZlbnQuY2xpY2soZ2V0QnlUZXN0SWQoJ2RvbmUtYnV0dG9uJykpO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QoZGVmYXVsdFByb3BzLmVkaXRvci5fdG9vbGJhck9wZW5lZCkudG9CZSh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ2Nsb3NlcyB0b29sYmFyIG9uIG91dHNpZGUgY2xpY2sgYW5kIHJ1bnMgaGFuZGxlRG9uZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB1cGRhdGVBdHRyaWJ1dGVzID0gamVzdC5mbigpO1xuICAgIGNvbnN0IGVkaXRvciA9IGNyZWF0ZU1vY2tFZGl0b3IoKTtcbiAgICBjb25zdCB7IFRleHRTZWxlY3Rpb24gfSA9IHJlcXVpcmUoJ3Byb3NlbWlycm9yLXN0YXRlJyk7XG4gICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkIH0gPSByZW5kZXIoXG4gICAgICA8TWF0aE5vZGVWaWV3IHsuLi5kZWZhdWx0UHJvcHN9IGVkaXRvcj17ZWRpdG9yfSB1cGRhdGVBdHRyaWJ1dGVzPXt1cGRhdGVBdHRyaWJ1dGVzfSBzZWxlY3RlZD17dHJ1ZX0gLz4sXG4gICAgKTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ21hdGgtdG9vbGJhcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgZmlyZUV2ZW50LmNsaWNrKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnbWF0aC10b29sYmFyJykpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHVwZGF0ZUF0dHJpYnV0ZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHsgbGF0ZXg6ICd4XjInIH0pO1xuICAgICAgZXhwZWN0KFRleHRTZWxlY3Rpb24uY3JlYXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChlZGl0b3Iuc3RhdGUuZG9jLCAxKTtcbiAgICAgIGV4cGVjdChlZGl0b3Iuc3RhdGUudHIuc2V0U2VsZWN0aW9uKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICBleHBlY3QoZWRpdG9yLnZpZXcuZGlzcGF0Y2gpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGVkaXRvci5zdGF0ZS50cik7XG4gICAgICBleHBlY3QoZWRpdG9yLmNvbW1hbmRzLmZvY3VzKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICBleHBlY3QoZWRpdG9yLl90b29sYmFyT3BlbmVkKS50b0JlKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgncmUtcmVnaXN0ZXJzIGNsaWNrIGxpc3RlbmVyIHdoZW4gbm9kZSBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGFkZEV2ZW50TGlzdGVuZXJTcHkgPSBqZXN0LnNweU9uKGRvY3VtZW50LCAnYWRkRXZlbnRMaXN0ZW5lcicpO1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJTcHkgPSBqZXN0LnNweU9uKGRvY3VtZW50LCAncmVtb3ZlRXZlbnRMaXN0ZW5lcicpO1xuICAgIGNvbnN0IG5vZGVBID0geyBhdHRyczogeyBsYXRleDogJ3heMicgfSB9O1xuICAgIGNvbnN0IG5vZGVCID0geyBhdHRyczogeyBsYXRleDogJ3leMicgfSB9O1xuXG4gICAgY29uc3QgeyByZXJlbmRlciB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gbm9kZT17bm9kZUF9IHNlbGVjdGVkPXt0cnVlfSAvPik7XG5cbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGV4cGVjdChhZGRFdmVudExpc3RlbmVyU3B5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY2xpY2snLCBleHBlY3QuYW55KEZ1bmN0aW9uKSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBpbml0aWFsQ2FsbENvdW50ID0gYWRkRXZlbnRMaXN0ZW5lclNweS5tb2NrLmNhbGxzLmxlbmd0aDtcblxuICAgIHJlcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gbm9kZT17bm9kZUJ9IHNlbGVjdGVkPXt0cnVlfSAvPik7XG5cbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGV4cGVjdChyZW1vdmVFdmVudExpc3RlbmVyU3B5KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICBleHBlY3QoYWRkRXZlbnRMaXN0ZW5lclNweS5tb2NrLmNhbGxzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKGluaXRpYWxDYWxsQ291bnQpO1xuICAgIH0pO1xuXG4gICAgYWRkRXZlbnRMaXN0ZW5lclNweS5tb2NrUmVzdG9yZSgpO1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJTcHkubW9ja1Jlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ2RvZXMgbm90IGNsb3NlIHRvb2xiYXIgd2hlbiBjbGlja2luZyB0aGUgbWF0aCBub2RlIHByZXZpZXcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRlc3RJZCwgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ21hdGgtdG9vbGJhcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgZmlyZUV2ZW50LmNsaWNrKGdldEJ5VGVzdElkKCdtYXRoLXByZXZpZXcnKSk7XG5cbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCdtYXRoLXRvb2xiYXInKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3VuaXF1ZSBtYXRoLW5vZGUgY2xhc3MgcGVyIGluc3RhbmNlJywgKCkgPT4ge1xuICAgIGxldCBkYXRlTm93U3B5O1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBsZXQgdGltZXN0YW1wID0gMTAwMDtcbiAgICAgIGRhdGVOb3dTcHkgPSBqZXN0LnNweU9uKERhdGUsICdub3cnKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gdGltZXN0YW1wKyspO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgIGRhdGVOb3dTcHkubW9ja1Jlc3RvcmUoKTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSB3cmFwcGVyIGlzIGFuIGVtb3Rpb24gc3R5bGVkKCkgY29tcG9uZW50LCBzbyBjbGFzc05hbWUgYWxzbyBjYXJyaWVzXG4gICAgLy8gZW1vdGlvbidzIGdlbmVyYXRlZCBjbGFzcyAtIGFzc2VydCBvbiB0aGUgbWF0aC1ub2RlIHRva2VuLCBub3QgZXF1YWxpdHkuXG4gICAgaXQoJ2Fzc2lnbnMgYSB0aW1lc3RhbXAtYmFzZWQgY2xhc3MgdG8gTm9kZVZpZXdXcmFwcGVyJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3Qgd3JhcHBlciA9IGdldEJ5VGVzdElkKCdub2RlLXZpZXctd3JhcHBlcicpO1xuXG4gICAgICBleHBlY3QoQXJyYXkuZnJvbSh3cmFwcGVyLmNsYXNzTGlzdCkuc29tZSgoYykgPT4gL15tYXRoLW5vZGUtXFxkKyQvLnRlc3QoYykpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Fzc2lnbnMgYSBkaWZmZXJlbnQgY2xhc3MgdG8gZWFjaCBNYXRoTm9kZVZpZXcgaW5zdGFuY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGVzdElkIH0gPSByZW5kZXIoXG4gICAgICAgIDw+XG4gICAgICAgICAgPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSAvPlxuICAgICAgICAgIDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gbm9kZT17eyBhdHRyczogeyBsYXRleDogJ3leMicgfSB9fSAvPlxuICAgICAgICA8Lz4sXG4gICAgICApO1xuXG4gICAgICBjb25zdCB3cmFwcGVycyA9IGdldEFsbEJ5VGVzdElkKCdub2RlLXZpZXctd3JhcHBlcicpO1xuICAgICAgY29uc3QgbWF0aE5vZGVDbGFzcyA9IChlbCkgPT4gQXJyYXkuZnJvbShlbC5jbGFzc0xpc3QpLmZpbmQoKGMpID0+IGMuc3RhcnRzV2l0aCgnbWF0aC1ub2RlLScpKTtcblxuICAgICAgZXhwZWN0KG1hdGhOb2RlQ2xhc3Mod3JhcHBlcnNbMF0pKS50b0JlKCdtYXRoLW5vZGUtMTAwMCcpO1xuICAgICAgZXhwZWN0KG1hdGhOb2RlQ2xhc3Mod3JhcHBlcnNbMV0pKS50b0JlKCdtYXRoLW5vZGUtMTAwMScpO1xuICAgICAgLy8gYW5kIHRoZXkgbXVzdCBkaWZmZXJcbiAgICAgIGV4cGVjdChtYXRoTm9kZUNsYXNzKHdyYXBwZXJzWzBdKSkubm90LnRvQmUobWF0aE5vZGVDbGFzcyh3cmFwcGVyc1sxXSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Nsb3NlcyB0b29sYmFyIHdoZW4gY2xpY2tpbmcgYSBkaWZmZXJlbnQgbWF0aCBub2RlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXBkYXRlQXR0cmlidXRlcyA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IGVkaXRvckEgPSBjcmVhdGVNb2NrRWRpdG9yKCk7XG4gICAgICBjb25zdCBlZGl0b3JCID0gY3JlYXRlTW9ja0VkaXRvcigpO1xuXG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGVzdElkLCBxdWVyeUFsbEJ5VGVzdElkIH0gPSByZW5kZXIoXG4gICAgICAgIDw+XG4gICAgICAgICAgPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvckF9IHVwZGF0ZUF0dHJpYnV0ZXM9e3VwZGF0ZUF0dHJpYnV0ZXN9IHNlbGVjdGVkPXtmYWxzZX0gLz5cbiAgICAgICAgICA8TWF0aE5vZGVWaWV3IHsuLi5kZWZhdWx0UHJvcHN9IGVkaXRvcj17ZWRpdG9yQn0gbm9kZT17eyBhdHRyczogeyBsYXRleDogJ3leMicgfSB9fSBzZWxlY3RlZD17ZmFsc2V9IC8+XG4gICAgICAgIDwvPixcbiAgICAgICk7XG5cbiAgICAgIGZpcmVFdmVudC5jbGljayhnZXRBbGxCeVRlc3RJZCgnbWF0aC1wcmV2aWV3JylbMF0pO1xuXG4gICAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KHF1ZXJ5QWxsQnlUZXN0SWQoJ21hdGgtdG9vbGJhcicpKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc2Vjb25kUHJldmlldyA9IGdldEFsbEJ5VGVzdElkKCdtYXRoLXByZXZpZXcnKVsxXTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhzZWNvbmRQcmV2aWV3KTtcblxuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChxdWVyeUFsbEJ5VGVzdElkKCdtYXRoLXRvb2xiYXInKSkudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgICBleHBlY3QodXBkYXRlQXR0cmlidXRlcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoeyBsYXRleDogJ3heMicgfSk7XG4gICAgICAgIGV4cGVjdChlZGl0b3JBLl90b29sYmFyT3BlbmVkKS50b0JlKGZhbHNlKTtcbiAgICAgICAgZXhwZWN0KGdldEFsbEJ5VGVzdElkKCdtYXRoLWlucHV0JylbMF0pLnRvSGF2ZVZhbHVlKCd5XjInKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2VsZWN0aW9uLWJhc2VkIHRvb2xiYXIgZ3VhcmQnLCAoKSA9PiB7XG4gICAgaXQoJ29wZW5zIHRvb2xiYXIgd2hlbiBzZWxlY3RlZCB0cmFuc2l0aW9ucyB0byB0cnVlIGFuZCB0aGUgZWRpdG9yIGhhcyBhIE5vZGVTZWxlY3Rpb24gb24gbWF0aCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCwgcmVyZW5kZXIgfSA9IHJlbmRlcig8TWF0aE5vZGVWaWV3IHsuLi5kZWZhdWx0UHJvcHN9IHNlbGVjdGVkPXtmYWxzZX0gLz4pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ21hdGgtdG9vbGJhcicpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcblxuICAgICAgcmVyZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17dHJ1ZX0gLz4pO1xuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCdtYXRoLXRvb2xiYXInKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IG9wZW4gdG9vbGJhciB3aGVuIHNlbGVjdGVkIGJyaWVmbHkgYmVjb21lcyB0cnVlIGJ1dCBlZGl0b3Igc2VsZWN0aW9uIGhhcyBubyBub2RlIChDbWQrQSAvIGRyYWcgY2FzZSknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlZGl0b3IgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcy5lZGl0b3IsXG4gICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmVkaXRvci5zdGF0ZSxcbiAgICAgICAgICBzZWxlY3Rpb246IHsgZnJvbTogMCwgdG86IDEwMCB9LCAvLyBubyAubm9kZSDigJQgVGV4dFNlbGVjdGlvbiAvIEFsbFNlbGVjdGlvbiBzaGFwZVxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkLCByZXJlbmRlciB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gZWRpdG9yPXtlZGl0b3J9IHNlbGVjdGVkPXtmYWxzZX0gLz4pO1xuICAgICAgcmVyZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvcn0gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgICAgYXdhaXQgYWN0KGFzeW5jICgpID0+IHt9KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCdtYXRoLXRvb2xiYXInKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3Qgb3BlbiB0b29sYmFyIHdoZW4gc2VsZWN0ZWQgYnJpZWZseSBiZWNvbWVzIHRydWUgYnV0IE5vZGVTZWxlY3Rpb24gdGFyZ2V0cyBhIG5vbi1tYXRoIG5vZGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlZGl0b3IgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcy5lZGl0b3IsXG4gICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmVkaXRvci5zdGF0ZSxcbiAgICAgICAgICBzZWxlY3Rpb246IHsgZnJvbTogMCwgdG86IDEsIG5vZGU6IHsgdHlwZTogeyBuYW1lOiAnaW1hZ2UnIH0gfSB9LFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkLCByZXJlbmRlciB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gZWRpdG9yPXtlZGl0b3J9IHNlbGVjdGVkPXtmYWxzZX0gLz4pO1xuICAgICAgcmVyZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvcn0gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgICAgYXdhaXQgYWN0KGFzeW5jICgpID0+IHt9KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCdtYXRoLXRvb2xiYXInKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCBjbG9zZSB0b29sYmFyIHdoZW4gY2xpY2tpbmcgZXF1YXRpb24gZWRpdG9yIGRyb3Bkb3duJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ21hdGgtdG9vbGJhcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgLy8gU2ltdWxhdGUgTVVJIFNlbGVjdCdzIHBvcnRhbCBkcm9wZG93biBjb250YWluZXIuXG4gICAgY29uc3QgZHJvcGRvd24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkcm9wZG93bi5pZCA9ICdlcXVhdGlvbi1lZGl0b3Itc2VsZWN0LWxpc3Rib3gnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZHJvcGRvd24pO1xuXG4gICAgZmlyZUV2ZW50LmNsaWNrKGRyb3Bkb3duKTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ21hdGgtdG9vbGJhcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkcm9wZG93bik7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIHdpdGggZW1wdHkgbGF0ZXgnLCAoKSA9PiB7XG4gICAgY29uc3Qgbm9kZVdpdGhFbXB0eUxhdGV4ID0geyBhdHRyczogeyBsYXRleDogJycgfSB9O1xuICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlcig8TWF0aE5vZGVWaWV3IHsuLi5kZWZhdWx0UHJvcHN9IG5vZGU9e25vZGVXaXRoRW1wdHlMYXRleH0gLz4pO1xuICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnbWF0aC1wcmV2aWV3JykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdoYXMgY29ycmVjdCBzdHlsaW5nIG9uIE5vZGVWaWV3V3JhcHBlcicsICgpID0+IHtcbiAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgY29uc3Qgd3JhcHBlciA9IGdldEJ5VGVzdElkKCdub2RlLXZpZXctd3JhcHBlcicpO1xuICAgIGV4cGVjdCh3cmFwcGVyKS50b0hhdmVTdHlsZSh7IGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsIGN1cnNvcjogJ3BvaW50ZXInIH0pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLEtBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLFlBQUEsR0FBQUMsdUJBQUEsQ0FBQUosT0FBQTtBQUFvRCxJQUFBSyxTQUFBO0FBQUEsU0FBQUQsd0JBQUFFLENBQUEsRUFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxNQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFKLHVCQUFBLFlBQUFBLHdCQUFBRSxDQUFBLEVBQUFDLENBQUEsU0FBQUEsQ0FBQSxJQUFBRCxDQUFBLElBQUFBLENBQUEsQ0FBQUssVUFBQSxTQUFBTCxDQUFBLE1BQUFNLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLEtBQUFDLFNBQUEsbUJBQUFULENBQUEsaUJBQUFBLENBQUEsZ0JBQUFVLFFBQUEsQ0FBQVYsQ0FBQSwwQkFBQUEsQ0FBQSxTQUFBUSxDQUFBLE1BQUFGLENBQUEsR0FBQUwsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsUUFBQUcsQ0FBQSxDQUFBSyxHQUFBLENBQUFYLENBQUEsVUFBQU0sQ0FBQSxDQUFBTSxHQUFBLENBQUFaLENBQUEsR0FBQU0sQ0FBQSxDQUFBTyxHQUFBLENBQUFiLENBQUEsRUFBQVEsQ0FBQSxjQUFBTSxFQUFBLElBQUFkLENBQUEsZ0JBQUFjLEVBQUEsT0FBQUMsY0FBQSxDQUFBQyxJQUFBLENBQUFoQixDQUFBLEVBQUFjLEVBQUEsT0FBQVAsQ0FBQSxJQUFBRCxDQUFBLEdBQUFXLE1BQUEsQ0FBQUMsY0FBQSxLQUFBRCxNQUFBLENBQUFFLHdCQUFBLENBQUFuQixDQUFBLEVBQUFjLEVBQUEsT0FBQVAsQ0FBQSxDQUFBSyxHQUFBLElBQUFMLENBQUEsQ0FBQU0sR0FBQSxJQUFBUCxDQUFBLENBQUFFLENBQUEsRUFBQU0sRUFBQSxFQUFBUCxDQUFBLElBQUFDLENBQUEsQ0FBQU0sRUFBQSxJQUFBZCxDQUFBLENBQUFjLEVBQUEsV0FBQU4sQ0FBQSxLQUFBUixDQUFBLEVBQUFDLENBQUE7QUFBQSxTQUFBbUIsUUFBQXBCLENBQUEsRUFBQUcsQ0FBQSxRQUFBRixDQUFBLEdBQUFnQixNQUFBLENBQUFJLElBQUEsQ0FBQXJCLENBQUEsT0FBQWlCLE1BQUEsQ0FBQUsscUJBQUEsUUFBQWhCLENBQUEsR0FBQVcsTUFBQSxDQUFBSyxxQkFBQSxDQUFBdEIsQ0FBQSxHQUFBRyxDQUFBLEtBQUFHLENBQUEsR0FBQUEsQ0FBQSxDQUFBaUIsTUFBQSxXQUFBcEIsQ0FBQSxXQUFBYyxNQUFBLENBQUFFLHdCQUFBLENBQUFuQixDQUFBLEVBQUFHLENBQUEsRUFBQXFCLFVBQUEsT0FBQXZCLENBQUEsQ0FBQXdCLElBQUEsQ0FBQUMsS0FBQSxDQUFBekIsQ0FBQSxFQUFBSyxDQUFBLFlBQUFMLENBQUE7QUFBQSxTQUFBMEIsY0FBQTNCLENBQUEsYUFBQUcsQ0FBQSxNQUFBQSxDQUFBLEdBQUF5QixTQUFBLENBQUFDLE1BQUEsRUFBQTFCLENBQUEsVUFBQUYsQ0FBQSxXQUFBMkIsU0FBQSxDQUFBekIsQ0FBQSxJQUFBeUIsU0FBQSxDQUFBekIsQ0FBQSxRQUFBQSxDQUFBLE9BQUFpQixPQUFBLENBQUFILE1BQUEsQ0FBQWhCLENBQUEsT0FBQTZCLE9BQUEsV0FBQTNCLENBQUEsUUFBQTRCLGdCQUFBLGFBQUEvQixDQUFBLEVBQUFHLENBQUEsRUFBQUYsQ0FBQSxDQUFBRSxDQUFBLFNBQUFjLE1BQUEsQ0FBQWUseUJBQUEsR0FBQWYsTUFBQSxDQUFBZ0IsZ0JBQUEsQ0FBQWpDLENBQUEsRUFBQWlCLE1BQUEsQ0FBQWUseUJBQUEsQ0FBQS9CLENBQUEsS0FBQW1CLE9BQUEsQ0FBQUgsTUFBQSxDQUFBaEIsQ0FBQSxHQUFBNkIsT0FBQSxXQUFBM0IsQ0FBQSxJQUFBYyxNQUFBLENBQUFDLGNBQUEsQ0FBQWxCLENBQUEsRUFBQUcsQ0FBQSxFQUFBYyxNQUFBLENBQUFFLHdCQUFBLENBQUFsQixDQUFBLEVBQUFFLENBQUEsaUJBQUFILENBQUE7QUFFcERrQyxJQUFJLENBQUNDLElBQUksQ0FBQyxlQUFlLEVBQUU7RUFBQSxPQUFPO0lBQ2hDQyxlQUFlLEVBQUUsU0FBakJBLGVBQWVBLENBQUFDLElBQUE7TUFBQSxJQUFLQyxRQUFRLEdBQUFELElBQUEsQ0FBUkMsUUFBUTtRQUFLQyxLQUFLLE9BQUFDLHlCQUFBLGFBQUFILElBQUEsRUFBQXRDLFNBQUE7TUFBQSxvQkFDcENQLE1BQUEsWUFBQWlELGFBQUEsWUFBQUMsU0FBQTtRQUFLLGVBQVk7TUFBbUIsR0FBS0gsS0FBSyxHQUMzQ0QsUUFDRSxDQUFDO0lBQUEsQ0FDUDtJQUNESyxxQkFBcUIsRUFBRVQsSUFBSSxDQUFDVSxFQUFFLENBQUMsVUFBQ0MsU0FBUztNQUFBLE9BQUtBLFNBQVM7SUFBQTtFQUN6RCxDQUFDO0FBQUEsQ0FBQyxDQUFDO0FBRUgsSUFBTUMsZ0JBQWdCLEdBQUdaLElBQUksQ0FBQ1UsRUFBRSxDQUFDLFVBQUNHLElBQUk7RUFBQSxPQUFLQSxJQUFJO0FBQUEsRUFBQztBQUNoRGIsSUFBSSxDQUFDQyxJQUFJLENBQUMsV0FBVyxFQUFFO0VBQUEsT0FBQVIsYUFBQSxDQUFBQSxhQUFBLEtBQ2xCTyxJQUFJLENBQUNjLGFBQWEsQ0FBQyxXQUFXLENBQUM7SUFDbENDLFlBQVksRUFBRSxTQUFkQSxZQUFZQSxDQUFBO01BQUEsT0FBZUgsZ0JBQWdCLENBQUFwQixLQUFBLFNBQUFFLFNBQVEsQ0FBQztJQUFBO0VBQUE7QUFBQSxDQUNwRCxDQUFDO0FBRUhNLElBQUksQ0FBQ0MsSUFBSSxDQUFDLHVCQUF1QixFQUFFLFlBQU07RUFDdkMsSUFBTWUsS0FBSyxHQUFHeEQsT0FBTyxDQUFDLE9BQU8sQ0FBQztFQUM5QixPQUFPO0lBQ0x5RCxXQUFXLEVBQUUsU0FBYkEsV0FBV0EsQ0FBQUMsS0FBQTtNQUFBLElBQUtDLEtBQUssR0FBQUQsS0FBQSxDQUFMQyxLQUFLO01BQUEsb0JBQU9ILEtBQUEsQ0FBQVQsYUFBQTtRQUFLLGVBQVk7TUFBYyxHQUFFWSxLQUFXLENBQUM7SUFBQTtJQUN6RUMsV0FBVyxFQUFFLFNBQWJBLFdBQVdBLENBQUFDLEtBQUEsRUFBbUM7TUFBQSxJQUE5QkYsS0FBSyxHQUFBRSxLQUFBLENBQUxGLEtBQUs7UUFBRUcsU0FBUSxHQUFBRCxLQUFBLENBQVJDLFFBQVE7UUFBRUMsTUFBTSxHQUFBRixLQUFBLENBQU5FLE1BQU07TUFDckMsSUFBQUMsZUFBQSxHQUFvQ1IsS0FBSyxDQUFDUyxRQUFRLENBQUNOLEtBQUssQ0FBQztRQUFBTyxnQkFBQSxPQUFBQyxlQUFBLGFBQUFILGVBQUE7UUFBbERJLFVBQVUsR0FBQUYsZ0JBQUE7UUFBRUcsYUFBYSxHQUFBSCxnQkFBQTtNQUNoQyxvQkFDRVYsS0FBQSxDQUFBVCxhQUFBO1FBQUssZUFBWTtNQUFjLGdCQUM3QlMsS0FBQSxDQUFBVCxhQUFBO1FBQ0UsZUFBWSxZQUFZO1FBQ3hCdUIsS0FBSyxFQUFFRixVQUFXO1FBQ2xCTixRQUFRLEVBQUUsU0FBVkEsUUFBUUEsQ0FBR3hELENBQUMsRUFBSztVQUNmK0QsYUFBYSxDQUFDL0QsQ0FBQyxDQUFDaUUsTUFBTSxDQUFDRCxLQUFLLENBQUM7VUFDN0JSLFNBQVEsQ0FBQ3hELENBQUMsQ0FBQ2lFLE1BQU0sQ0FBQ0QsS0FBSyxDQUFDO1FBQzFCO01BQUUsQ0FDSCxDQUFDLGVBQ0ZkLEtBQUEsQ0FBQVQsYUFBQTtRQUFRLGVBQVksYUFBYTtRQUFDeUIsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUE7VUFBQSxPQUFRVCxNQUFNLENBQUNLLFVBQVUsQ0FBQztRQUFBO01BQUMsR0FBQyxNQUU3RCxDQUNMLENBQUM7SUFFVjtFQUNGLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRjVCLElBQUksQ0FBQ0MsSUFBSSxDQUFDLHlCQUF5QixFQUFFO0VBQUEsT0FBTztJQUMxQ2dDLFFBQVEsRUFBRSxTQUFWQSxRQUFRQSxDQUFHZCxLQUFLLEVBQUVlLE9BQU87TUFBQSxPQUFLZixLQUFLO0lBQUE7RUFDckMsQ0FBQztBQUFBLENBQUMsQ0FBQztBQUVIbkIsSUFBSSxDQUFDQyxJQUFJLENBQUMsY0FBYyxFQUFFO0VBQUEsT0FBTztJQUMvQmtDLElBQUksRUFBRTtNQUNKQyxNQUFNLEVBQUVwQyxJQUFJLENBQUNVLEVBQUUsQ0FBQyxVQUFDMkIsTUFBTTtRQUFBLE9BQUtBLE1BQU07TUFBQTtJQUNwQztFQUNGLENBQUM7QUFBQSxDQUFDLENBQUM7QUFFSHJDLElBQUksQ0FBQ0MsSUFBSSxDQUFDLG1CQUFtQixFQUFFO0VBQUEsT0FBTztJQUNwQ3FDLE1BQU0sRUFBRXRDLElBQUksQ0FBQ1UsRUFBRSxDQUFDLFVBQVUyQixNQUFNLEVBQUU7TUFDaEMsT0FBT0EsTUFBTTtJQUNmLENBQUMsQ0FBQztJQUNGRSxTQUFTLEVBQUV2QyxJQUFJLENBQUNVLEVBQUUsQ0FBQyxVQUFVOEIsR0FBRyxFQUFFO01BQ2hDLElBQUksQ0FBQ0EsR0FBRyxHQUFHQSxHQUFHO0lBQ2hCLENBQUMsQ0FBQztJQUNGQyxhQUFhLEVBQUU7TUFDYkwsTUFBTSxFQUFFcEMsSUFBSSxDQUFDVSxFQUFFLENBQUMsVUFBQ2dDLEdBQUcsRUFBRUMsR0FBRztRQUFBLE9BQU07VUFBRUMsSUFBSSxFQUFFLE1BQU07VUFBRUQsR0FBRyxFQUFIQTtRQUFJLENBQUM7TUFBQSxDQUFDO0lBQ3ZELENBQUM7SUFDREUsYUFBYSxFQUFFO01BQ2JULE1BQU0sRUFBRXBDLElBQUksQ0FBQ1UsRUFBRSxDQUFDLFVBQUNnQyxHQUFHLEVBQUVDLEdBQUc7UUFBQSxPQUFNO1VBQUVDLElBQUksRUFBRSxNQUFNO1VBQUVELEdBQUcsRUFBSEE7UUFBSSxDQUFDO01BQUEsQ0FBQztJQUN2RDtFQUNGLENBQUM7QUFBQSxDQUFDLENBQUM7QUFFSEcsUUFBUSxDQUFDLFVBQVUsRUFBRSxZQUFNO0VBQ3pCQSxRQUFRLENBQUMsZUFBZSxFQUFFLFlBQU07SUFDOUJDLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxZQUFNO01BQzNCQyxNQUFNLENBQUNDLGNBQVEsQ0FBQ0MsSUFBSSxDQUFDLENBQUNDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDcEMsQ0FBQyxDQUFDO0lBRUZKLEVBQUUsQ0FBQyxXQUFXLEVBQUUsWUFBTTtNQUNwQkMsTUFBTSxDQUFDQyxjQUFRLENBQUNHLE1BQU0sQ0FBQyxDQUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3BDLENBQUMsQ0FBQztJQUVGSixFQUFFLENBQUMsb0JBQW9CLEVBQUUsWUFBTTtNQUM3QkMsTUFBTSxDQUFDQyxjQUFRLENBQUNJLEtBQUssQ0FBQyxDQUFDRixJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZDLENBQUMsQ0FBQztJQUVGSixFQUFFLENBQUMsV0FBVyxFQUFFLFlBQU07TUFDcEJDLE1BQU0sQ0FBQ0MsY0FBUSxDQUFDSyxJQUFJLENBQUMsQ0FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNsQyxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRkwsUUFBUSxDQUFDLGVBQWUsRUFBRSxZQUFNO0lBQzlCQyxFQUFFLENBQUMsNkJBQTZCLEVBQUUsWUFBTTtNQUN0QyxJQUFNUSxVQUFVLEdBQUdOLGNBQVEsQ0FBQ08sYUFBYSxDQUFDLENBQUM7TUFFM0NSLE1BQU0sQ0FBQ08sVUFBVSxDQUFDLENBQUNFLGNBQWMsQ0FBQyxPQUFPLENBQUM7TUFDMUNULE1BQU0sQ0FBQ08sVUFBVSxDQUFDLENBQUNFLGNBQWMsQ0FBQyxTQUFTLENBQUM7TUFDNUNULE1BQU0sQ0FBQ08sVUFBVSxDQUFDLENBQUNFLGNBQWMsQ0FBQyxNQUFNLENBQUM7TUFFekNULE1BQU0sQ0FBQ08sVUFBVSxDQUFDcEMsS0FBSyxDQUFDLENBQUN1QyxPQUFPLENBQUM7UUFBRSxXQUFTO01BQUcsQ0FBQyxDQUFDO01BQ2pEVixNQUFNLENBQUNPLFVBQVUsQ0FBQ3JCLE9BQU8sQ0FBQyxDQUFDd0IsT0FBTyxDQUFDO1FBQUUsV0FBUztNQUFLLENBQUMsQ0FBQztNQUNyRFYsTUFBTSxDQUFDTyxVQUFVLENBQUNJLElBQUksQ0FBQyxDQUFDRCxPQUFPLENBQUM7UUFBRSxXQUFTO01BQUssQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGWixRQUFRLENBQUMsV0FBVyxFQUFFLFlBQU07SUFDMUJDLEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSxZQUFNO01BQzFDLElBQU1hLEtBQUssR0FBR1gsY0FBUSxDQUFDWSxTQUFTLENBQUMsQ0FBQztNQUVsQ2IsTUFBTSxDQUFDYyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0gsS0FBSyxDQUFDLENBQUMsQ0FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQztNQUN2Q0gsTUFBTSxDQUFDWSxLQUFLLENBQUMsQ0FBQ0ksWUFBWSxDQUFDLENBQUMsQ0FBQztNQUM3QmhCLE1BQU0sQ0FBQ1ksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNILGNBQWMsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUM7SUFDNUQsQ0FBQyxDQUFDO0lBRUZWLEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxZQUFNO01BQzNDLElBQU1hLEtBQUssR0FBR1gsY0FBUSxDQUFDWSxTQUFTLENBQUMsQ0FBQztNQUNsQ2IsTUFBTSxDQUFDWSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQ0gsY0FBYyxDQUFDLEtBQUssRUFBRSwwQkFBMEIsQ0FBQztJQUNwRSxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRlgsUUFBUSxDQUFDLFlBQVksRUFBRSxZQUFNO0lBQzNCQyxFQUFFLENBQUMsK0NBQStDLEVBQUUsWUFBTTtNQUN4RCxJQUFNa0IsTUFBTSxHQUFHaEIsY0FBUSxDQUFDaUIsVUFBVSxDQUFDO1FBQ2pDQyxjQUFjLEVBQUU7VUFDZFIsSUFBSSxFQUFFO1FBQ1I7TUFDRixDQUFDLENBQUM7TUFFRlgsTUFBTSxDQUFDaUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNkLElBQUksQ0FBQyxNQUFNLENBQUM7TUFDOUJILE1BQU0sQ0FBQ2lCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDUixjQUFjLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQztJQUN6RCxDQUFDLENBQUM7SUFFRlYsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLFlBQU07TUFDM0QsSUFBTWtCLE1BQU0sR0FBR2hCLGNBQVEsQ0FBQ2lCLFVBQVUsQ0FBQztRQUNqQ0MsY0FBYyxFQUFFO1VBQ2RoRCxLQUFLLEVBQUU7UUFDVDtNQUNGLENBQUMsQ0FBQztNQUVGNkIsTUFBTSxDQUFDaUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNkLElBQUksQ0FBQyxNQUFNLENBQUM7TUFDOUJILE1BQU0sQ0FBQ2lCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDUixjQUFjLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztNQUNsRFQsTUFBTSxDQUFDaUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNSLGNBQWMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDO0lBQ3JELENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGWCxRQUFRLENBQUMsYUFBYSxFQUFFLFlBQU07SUFDNUJDLEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxZQUFNO01BQ3JDLElBQU1xQixRQUFRLEdBQUduQixjQUFRLENBQUNvQixXQUFXLENBQUMsQ0FBQztNQUV2Q3JCLE1BQU0sQ0FBQ29CLFFBQVEsQ0FBQyxDQUFDWCxjQUFjLENBQUMsWUFBWSxDQUFDO01BQzdDVCxNQUFNLEtBQUFzQixRQUFBLGFBQVFGLFFBQVEsQ0FBQ0csVUFBVSxFQUFDLENBQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3JELENBQUMsQ0FBQztJQUVGSixFQUFFLENBQUMsMERBQTBELEVBQUUsWUFBTTtNQUNuRSxJQUFNeUIsbUJBQW1CLEdBQUd4RSxJQUFJLENBQUN5RSxLQUFLLENBQUM5RyxZQUFZLEVBQUUsa0JBQWtCLENBQUM7TUFDeEUsSUFBTStHLFFBQVEsR0FBRztRQUFFOUIsSUFBSSxFQUFFO1VBQUVNLElBQUksRUFBRTtRQUFPLENBQUM7UUFBRXlCLFFBQVEsRUFBRTtNQUFFLENBQUM7TUFDeEQsSUFBTUMsRUFBRSxHQUFHO1FBQ1RDLE1BQU0sRUFBRTdFLElBQUksQ0FBQ1UsRUFBRSxDQUFDLENBQUMsQ0FBQ29FLGNBQWMsQ0FBQyxDQUFDO1FBQ2xDQyxZQUFZLEVBQUUvRSxJQUFJLENBQUNVLEVBQUUsQ0FBQyxDQUFDLENBQUNvRSxjQUFjLENBQUMsQ0FBQztRQUN4Q3BDLEdBQUcsRUFBRSxDQUFDO01BQ1IsQ0FBQztNQUNELElBQU1zQyxNQUFNLEdBQUc7UUFDYkMsSUFBSSxFQUFFO1VBQ0pDLEtBQUssRUFBRTtZQUNMQyxNQUFNLEVBQUU7Y0FBRUMsS0FBSyxFQUFFO2dCQUFFQyxJQUFJLEVBQUU7a0JBQUVqRCxNQUFNLEVBQUVwQyxJQUFJLENBQUNVLEVBQUUsQ0FBQztvQkFBQSxPQUFNZ0UsUUFBUTtrQkFBQTtnQkFBRTtjQUFFO1lBQUUsQ0FBQztZQUNoRVksU0FBUyxFQUFFO2NBQUVDLEtBQUssRUFBRTtnQkFBRTVDLEdBQUcsRUFBRTtjQUFFO1lBQUU7VUFDakM7UUFDRjtNQUNGLENBQUM7TUFDRCxJQUFNNkMsUUFBUSxHQUFHeEYsSUFBSSxDQUFDVSxFQUFFLENBQUMsQ0FBQztNQUMxQixJQUFNNkQsVUFBVSxHQUFHdEIsY0FBUSxDQUFDb0IsV0FBVyxDQUFDLENBQUMsQ0FBQ0UsVUFBVSxDQUFDLEtBQUssQ0FBQztNQUUzREEsVUFBVSxDQUFDO1FBQUVLLEVBQUUsRUFBRkEsRUFBRTtRQUFFSSxNQUFNLEVBQU5BLE1BQU07UUFBRVEsUUFBUSxFQUFSQTtNQUFTLENBQUMsQ0FBQztNQUVwQ3hDLE1BQU0sQ0FBQzRCLEVBQUUsQ0FBQ0MsTUFBTSxDQUFDLENBQUNZLG9CQUFvQixDQUFDLENBQUMsRUFBRWYsUUFBUSxDQUFDO01BQ25EMUIsTUFBTSxDQUFDNEIsRUFBRSxDQUFDRyxZQUFZLENBQUMsQ0FBQ1csZ0JBQWdCLENBQUMsQ0FBQztNQUMxQzFDLE1BQU0sQ0FBQ3dDLFFBQVEsQ0FBQyxDQUFDQyxvQkFBb0IsQ0FBQ2IsRUFBRSxDQUFDO01BQ3pDNUIsTUFBTSxDQUFDd0IsbUJBQW1CLENBQUMsQ0FBQ2lCLG9CQUFvQixDQUFDVCxNQUFNLEVBQUUsSUFBSSxDQUFDO01BRTlEUixtQkFBbUIsQ0FBQ21CLFdBQVcsQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGN0MsUUFBUSxDQUFDLGFBQWEsRUFBRSxZQUFNO0lBQzVCQyxFQUFFLENBQUMsc0NBQXNDLEVBQUUsWUFBTTtNQUMvQyxJQUFNa0IsTUFBTSxHQUFHaEIsY0FBUSxDQUFDMkMsV0FBVyxDQUFDLENBQUM7TUFFckM1QyxNQUFNLENBQUNpQixNQUFNLENBQUMsQ0FBQzRCLFdBQVcsQ0FBQyxDQUFDO0lBQzlCLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGL0MsUUFBUSxDQUFDLHVCQUF1QixFQUFFLFlBQU07SUFDdENDLEVBQUUsQ0FBQywrREFBK0QsRUFBRSxZQUFNO01BQ3hFLElBQU0rQyxPQUFPLEdBQUc3QyxjQUFRLENBQUM4QyxxQkFBcUIsQ0FBQyxDQUFDO01BRWhEL0MsTUFBTSxDQUFDOEMsT0FBTyxDQUFDLENBQUM5QixZQUFZLENBQUMsQ0FBQyxDQUFDO01BQy9CaEIsTUFBTSxDQUFDOEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDRSxpQkFBaUIsQ0FBQyxDQUFDSCxXQUFXLENBQUMsQ0FBQztNQUNsRDdDLE1BQU0sQ0FBQzhDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQ3pGLEtBQUssQ0FBQzRGLGFBQWEsQ0FBQyxDQUFDSixXQUFXLENBQUMsQ0FBQztJQUN0RCxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRi9DLFFBQVEsQ0FBQywyQkFBMkIsRUFBRSxZQUFNO0VBQzFDQyxFQUFFLENBQUMsbUVBQW1FLEVBQUUsWUFBTTtJQUM1RSxJQUFNbUQsTUFBTSxHQUFHLElBQUFDLCtCQUF5QixFQUFDLE1BQU0sQ0FBQztJQUNoRCxJQUFNQyxRQUFRLEdBQUc7TUFBRXhELElBQUksRUFBRTtRQUFFTSxJQUFJLEVBQUU7TUFBTztJQUFFLENBQUM7SUFDM0MsSUFBTXdCLFFBQVEsR0FBRztNQUFFOUIsSUFBSSxFQUFFO1FBQUVNLElBQUksRUFBRTtNQUFPLENBQUM7TUFBRXlCLFFBQVEsRUFBRTtJQUFFLENBQUM7SUFDeEQsSUFBTUMsRUFBRSxHQUFHO01BQUVDLE1BQU0sRUFBRTdFLElBQUksQ0FBQ1UsRUFBRSxDQUFDO0lBQUUsQ0FBQztJQUVoQyxJQUFNMkYsUUFBUSxHQUFHO01BQ2ZsQixNQUFNLEVBQUU7UUFBRW1CLElBQUksRUFBRXRHLElBQUksQ0FBQ1UsRUFBRSxDQUFDLFVBQUNvQixLQUFLO1VBQUEsT0FBTTtZQUFFYyxJQUFJLEVBQUV3RCxRQUFRLENBQUN4RCxJQUFJO1lBQUUwRCxJQUFJLEVBQUV4RTtVQUFNLENBQUM7UUFBQSxDQUFDO01BQUUsQ0FBQztNQUM1RThDLEVBQUUsRUFBRkEsRUFBRTtNQUNGbEMsR0FBRyxFQUFFO1FBQ0g2RCxXQUFXLEVBQUUsU0FBYkEsV0FBV0EsQ0FBR0MsRUFBRTtVQUFBLE9BQUtBLEVBQUUsQ0FBQzlCLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFBQTtRQUNwQytCLE1BQU0sRUFBRXpHLElBQUksQ0FBQ1UsRUFBRSxDQUFDO1VBQUEsT0FBTSxJQUFJO1FBQUE7TUFDNUI7SUFDRixDQUFDO0lBRUQsSUFBTXVELE1BQU0sR0FBR2lDLE1BQU0sQ0FBQ0YsaUJBQWlCLENBQUMsQ0FBQztNQUFFVSxVQUFVLEVBQUU7SUFBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRUwsUUFBUSxDQUFDO0lBRTdFckQsTUFBTSxDQUFDNEIsRUFBRSxDQUFDQyxNQUFNLENBQUMsQ0FBQ1ksb0JBQW9CLENBQUMsQ0FBQyxFQUFFekMsTUFBTSxDQUFDMkQsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUM1RDNELE1BQU0sQ0FBQ2lCLE1BQU0sQ0FBQyxDQUFDZCxJQUFJLENBQUN5QixFQUFFLENBQUM7RUFDekIsQ0FBQyxDQUFDO0VBRUY3QixFQUFFLENBQUMseURBQXlELEVBQUUsWUFBTTtJQUNsRSxJQUFNbUQsTUFBTSxHQUFHLElBQUFDLCtCQUF5QixFQUFDLE1BQU0sQ0FBQztJQUNoRCxJQUFNdkIsRUFBRSxHQUFHO01BQUVDLE1BQU0sRUFBRTdFLElBQUksQ0FBQ1UsRUFBRSxDQUFDO0lBQUUsQ0FBQztJQUNoQyxJQUFNZ0UsUUFBUSxHQUFHO01BQUU5QixJQUFJLEVBQUU7UUFBRU0sSUFBSSxFQUFFO01BQU8sQ0FBQztNQUFFeUIsUUFBUSxFQUFFO0lBQUUsQ0FBQztJQUV4RCxJQUFNMEIsUUFBUSxHQUFHO01BQ2ZsQixNQUFNLEVBQUU7UUFBRW1CLElBQUksRUFBRXRHLElBQUksQ0FBQ1UsRUFBRSxDQUFDO01BQUUsQ0FBQztNQUMzQmtFLEVBQUUsRUFBRkEsRUFBRTtNQUNGbEMsR0FBRyxFQUFFO1FBQ0g2RCxXQUFXLEVBQUUsU0FBYkEsV0FBV0EsQ0FBR0MsRUFBRTtVQUFBLE9BQUtBLEVBQUUsQ0FBQzlCLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFBQTtRQUNwQytCLE1BQU0sRUFBRXpHLElBQUksQ0FBQ1UsRUFBRSxDQUFDO1VBQUEsT0FBTztZQUFFa0MsSUFBSSxFQUFFO2NBQUVNLElBQUksRUFBRTtZQUFPO1VBQUUsQ0FBQztRQUFBLENBQUM7TUFDcEQ7SUFDRixDQUFDO0lBRUQsSUFBTWUsTUFBTSxHQUFHaUMsTUFBTSxDQUFDRixpQkFBaUIsQ0FBQyxDQUFDO01BQUVVLFVBQVUsRUFBRTtJQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFTCxRQUFRLENBQUM7SUFFN0VyRCxNQUFNLENBQUM0QixFQUFFLENBQUNDLE1BQU0sQ0FBQyxDQUFDK0IsR0FBRyxDQUFDbEIsZ0JBQWdCLENBQUMsQ0FBQztJQUN4QzFDLE1BQU0sQ0FBQ2lCLE1BQU0sQ0FBQyxDQUFDNEMsUUFBUSxDQUFDLENBQUM7RUFDM0IsQ0FBQyxDQUFDO0VBRUY5RCxFQUFFLENBQUMsK0NBQStDLEVBQUUsWUFBTTtJQUN4RCxJQUFNbUQsTUFBTSxHQUFHLElBQUFDLCtCQUF5QixFQUFDLE1BQU0sQ0FBQztJQUVoRCxJQUFNbEMsTUFBTSxHQUFHaUMsTUFBTSxDQUFDRixpQkFBaUIsQ0FBQyxDQUFDO01BQUVVLFVBQVUsRUFBRTtJQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hFMUQsTUFBTSxDQUFDaUIsTUFBTSxDQUFDLENBQUM0QyxRQUFRLENBQUMsQ0FBQztFQUMzQixDQUFDLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRi9ELFFBQVEsQ0FBQyw4QkFBOEIsRUFBRSxZQUFNO0VBQzdDLElBQU1nRSx3QkFBd0IsR0FBRyxTQUEzQkEsd0JBQXdCQSxDQUFBO0lBQUEsSUFBSUMsZ0JBQWdCLEdBQUFySCxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBc0gsU0FBQSxHQUFBdEgsU0FBQSxNQUFHLENBQUMsQ0FBQztJQUFBLE9BQU07TUFDM0R1SCxPQUFPLEVBQUVqSCxJQUFJLENBQUNVLEVBQUUsQ0FBQyxVQUFDaUMsR0FBRztRQUFBLE9BQUFsRCxhQUFBO1VBQ25CeUgsU0FBUyxFQUFFLElBQUk7VUFDZkMsVUFBVSxFQUFFLElBQUk7VUFDaEJ4RSxHQUFHLEVBQUhBO1FBQUcsR0FDQW9FLGdCQUFnQixDQUFDcEUsR0FBRyxDQUFDO01BQUEsQ0FDeEIsQ0FBQztNQUNIOEQsTUFBTSxFQUFFekcsSUFBSSxDQUFDVSxFQUFFLENBQUMsVUFBQ2lDLEdBQUcsRUFBSztRQUN2QixJQUFJQSxHQUFHLEtBQUssQ0FBQyxFQUFFO1VBQ2IsT0FBTztZQUFFQyxJQUFJLEVBQUU7Y0FBRU0sSUFBSSxFQUFFO1lBQU8sQ0FBQztZQUFFa0UsV0FBVyxFQUFFO1VBQVMsQ0FBQztRQUMxRDtRQUNBLElBQUl6RSxHQUFHLEtBQUssQ0FBQyxFQUFFO1VBQ2IsT0FBTztZQUFFQyxJQUFJLEVBQUU7Y0FBRU0sSUFBSSxFQUFFO1lBQU8sQ0FBQztZQUFFeUIsUUFBUSxFQUFFO1VBQUUsQ0FBQztRQUNoRDtRQUNBLE9BQU8sSUFBSTtNQUNiLENBQUM7SUFDSCxDQUFDO0VBQUEsQ0FBQztFQUVGLElBQU0wQyxvQ0FBb0MsR0FBRyxTQUF2Q0Esb0NBQW9DQSxDQUFBO0lBQUEsT0FBVTtNQUNsREosT0FBTyxFQUFFakgsSUFBSSxDQUFDVSxFQUFFLENBQUMsVUFBQ2lDLEdBQUc7UUFBQSxPQUFNO1VBQUV1RSxTQUFTLEVBQUUsSUFBSTtVQUFFQyxVQUFVLEVBQUUsSUFBSTtVQUFFeEUsR0FBRyxFQUFIQTtRQUFJLENBQUM7TUFBQSxDQUFDLENBQUM7TUFDdkU4RCxNQUFNLEVBQUV6RyxJQUFJLENBQUNVLEVBQUUsQ0FBQyxVQUFDaUMsR0FBRyxFQUFLO1FBQ3ZCLElBQUlBLEdBQUcsS0FBSyxDQUFDLEVBQUU7VUFDYixPQUFPO1lBQUVDLElBQUksRUFBRTtjQUFFTSxJQUFJLEVBQUU7WUFBTyxDQUFDO1lBQUVrRSxXQUFXLEVBQUU7VUFBSSxDQUFDO1FBQ3JEO1FBQ0EsT0FBTyxJQUFJO01BQ2IsQ0FBQztJQUNILENBQUM7RUFBQSxDQUFDO0VBRUYsSUFBTUUsVUFBVSxHQUFHLFNBQWJBLFVBQVVBLENBQUEsRUFBNEM7SUFBQSxJQUFBQyxLQUFBLEdBQUE3SCxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBc0gsU0FBQSxHQUFBdEgsU0FBQSxNQUFQLENBQUMsQ0FBQztNQUFBOEgsV0FBQSxHQUFBRCxLQUFBLENBQWpDckMsS0FBSztNQUFFdUMsY0FBYyxHQUFBRCxXQUFBLGNBQUcsQ0FBQyxDQUFDLEdBQUFBLFdBQUE7SUFDOUMsSUFBTWhDLFFBQVEsR0FBR3hGLElBQUksQ0FBQ1UsRUFBRSxDQUFDLENBQUM7SUFDMUIsSUFBTWtFLEVBQUUsR0FBRztNQUNULFVBQVE1RSxJQUFJLENBQUNVLEVBQUUsQ0FBQyxDQUFDLENBQUNvRSxjQUFjLENBQUMsQ0FBQztNQUNsQ0MsWUFBWSxFQUFFL0UsSUFBSSxDQUFDVSxFQUFFLENBQUMsQ0FBQyxDQUFDb0UsY0FBYyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxPQUFPO01BQ0xJLEtBQUssRUFBQXpGLGFBQUE7UUFDSDZGLFNBQVMsRUFBRTtVQUFFb0MsSUFBSSxFQUFFLENBQUM7VUFBRUMsS0FBSyxFQUFFO1FBQUssQ0FBQztRQUNuQ2pGLEdBQUcsRUFBRW9FLHdCQUF3QixDQUFDLENBQUM7UUFDL0JsQyxFQUFFLEVBQUZBO01BQUUsR0FDQzZDLGNBQWMsQ0FDbEI7TUFDRGpDLFFBQVEsRUFBUkE7SUFDRixDQUFDO0VBQ0gsQ0FBQztFQUVEMUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxZQUFNO0lBQzFCQyxFQUFFLENBQUMsZ0VBQWdFLEVBQUUsWUFBTTtNQUN6RSxJQUFNa0MsSUFBSSxHQUFHcUMsVUFBVSxDQUFDLENBQUM7TUFDekIsSUFBTU0sT0FBTyxHQUFHQyxrQ0FBNEIsQ0FBQ3hILEtBQUssQ0FBQzRGLGFBQWEsQ0FBQ2hCLElBQUksRUFBRTtRQUFFekMsR0FBRyxFQUFFO01BQVksQ0FBQyxDQUFDO01BRTVGUSxNQUFNLENBQUM0RSxPQUFPLENBQUMsQ0FBQ3pFLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDMUJILE1BQU0sQ0FBQ2lDLElBQUksQ0FBQ0MsS0FBSyxDQUFDTixFQUFFLFVBQU8sQ0FBQyxDQUFDYSxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO01BQ3ZEekMsTUFBTSxDQUFDaUMsSUFBSSxDQUFDTyxRQUFRLENBQUMsQ0FBQ0Msb0JBQW9CLENBQUNSLElBQUksQ0FBQ0MsS0FBSyxDQUFDTixFQUFFLENBQUM7SUFDM0QsQ0FBQyxDQUFDO0lBRUY3QixFQUFFLENBQUMscURBQXFELEVBQUUsWUFBTTtNQUM5RCxJQUFNa0MsSUFBSSxHQUFHcUMsVUFBVSxDQUFDO1FBQ3RCcEMsS0FBSyxFQUFFO1VBQ0x4QyxHQUFHLEVBQUUyRSxvQ0FBb0MsQ0FBQztRQUM1QztNQUNGLENBQUMsQ0FBQztNQUVGLElBQU1PLE9BQU8sR0FBR0Msa0NBQTRCLENBQUN4SCxLQUFLLENBQUM0RixhQUFhLENBQUNoQixJQUFJLEVBQUU7UUFBRXpDLEdBQUcsRUFBRTtNQUFZLENBQUMsQ0FBQztNQUU1RlEsTUFBTSxDQUFDNEUsT0FBTyxDQUFDLENBQUN6RSxJQUFJLENBQUMsS0FBSyxDQUFDO01BQzNCSCxNQUFNLENBQUNpQyxJQUFJLENBQUNDLEtBQUssQ0FBQ04sRUFBRSxVQUFPLENBQUMsQ0FBQ2dDLEdBQUcsQ0FBQ2xCLGdCQUFnQixDQUFDLENBQUM7TUFDbkQxQyxNQUFNLENBQUNpQyxJQUFJLENBQUNPLFFBQVEsQ0FBQyxDQUFDb0IsR0FBRyxDQUFDbEIsZ0JBQWdCLENBQUMsQ0FBQztJQUM5QyxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRjVDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsWUFBTTtJQUMxQkMsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLFlBQU07TUFDNUQsSUFBTTJCLFFBQVEsR0FBRztRQUFFQyxRQUFRLEVBQUU7TUFBRSxDQUFDO01BQ2hDLElBQU1NLElBQUksR0FBR3FDLFVBQVUsQ0FBQztRQUN0QnBDLEtBQUssRUFBRTtVQUNMeEMsR0FBRyxFQUFFb0Usd0JBQXdCLENBQUM7WUFDNUIsQ0FBQyxFQUFFO2NBQUVJLFNBQVMsRUFBRXhDLFFBQVE7Y0FBRXlDLFVBQVUsRUFBRSxJQUFJO2NBQUV4RSxHQUFHLEVBQUU7WUFBRTtVQUNyRCxDQUFDO1FBQ0g7TUFDRixDQUFDLENBQUM7TUFDRixJQUFBbUYsUUFBQSxHQUEwQnRLLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztRQUE5Q3FGLGFBQWEsR0FBQWlGLFFBQUEsQ0FBYmpGLGFBQWE7TUFFckIsSUFBTStFLE9BQU8sR0FBR0Msa0NBQTRCLENBQUN4SCxLQUFLLENBQUM0RixhQUFhLENBQUNoQixJQUFJLEVBQUU7UUFBRXpDLEdBQUcsRUFBRTtNQUFZLENBQUMsQ0FBQztNQUU1RlEsTUFBTSxDQUFDNEUsT0FBTyxDQUFDLENBQUN6RSxJQUFJLENBQUMsSUFBSSxDQUFDO01BQzFCSCxNQUFNLENBQUNpQyxJQUFJLENBQUNDLEtBQUssQ0FBQ3hDLEdBQUcsQ0FBQ3VFLE9BQU8sQ0FBQyxDQUFDeEIsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO01BQ3REekMsTUFBTSxDQUFDSCxhQUFhLENBQUNULE1BQU0sQ0FBQyxDQUFDcUQsb0JBQW9CLENBQUNSLElBQUksQ0FBQ0MsS0FBSyxDQUFDeEMsR0FBRyxFQUFFLENBQUMsQ0FBQztNQUNwRU0sTUFBTSxDQUFDaUMsSUFBSSxDQUFDTyxRQUFRLENBQUMsQ0FBQ0UsZ0JBQWdCLENBQUMsQ0FBQztJQUMxQyxDQUFDLENBQUM7SUFFRjNDLEVBQUUsQ0FBQyxtRkFBbUYsRUFBRSxZQUFNO01BQzVGLElBQU1rQyxJQUFJLEdBQUdxQyxVQUFVLENBQUMsQ0FBQztNQUN6QixJQUFBUyxTQUFBLEdBQTBCdkssT0FBTyxDQUFDLG1CQUFtQixDQUFDO1FBQTlDaUYsYUFBYSxHQUFBc0YsU0FBQSxDQUFidEYsYUFBYTtNQUVyQixJQUFNbUYsT0FBTyxHQUFHQyxrQ0FBNEIsQ0FBQ3hILEtBQUssQ0FBQzRGLGFBQWEsQ0FBQ2hCLElBQUksRUFBRTtRQUFFekMsR0FBRyxFQUFFO01BQVksQ0FBQyxDQUFDO01BRTVGUSxNQUFNLENBQUM0RSxPQUFPLENBQUMsQ0FBQ3pFLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDMUJILE1BQU0sQ0FBQ2lDLElBQUksQ0FBQ0MsS0FBSyxDQUFDeEMsR0FBRyxDQUFDdUUsT0FBTyxDQUFDLENBQUN4QixvQkFBb0IsQ0FBQyxDQUFDLENBQUM7TUFDdER6QyxNQUFNLENBQUNQLGFBQWEsQ0FBQ0wsTUFBTSxDQUFDLENBQUNxRCxvQkFBb0IsQ0FBQ1IsSUFBSSxDQUFDQyxLQUFLLENBQUN4QyxHQUFHLEVBQUUsQ0FBQyxDQUFDO01BQ3BFTSxNQUFNLENBQUNpQyxJQUFJLENBQUNPLFFBQVEsQ0FBQyxDQUFDRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzFDLENBQUMsQ0FBQztJQUVGM0MsRUFBRSxDQUFDLHFEQUFxRCxFQUFFLFlBQU07TUFDOUQsSUFBTWtDLElBQUksR0FBR3FDLFVBQVUsQ0FBQztRQUN0QnBDLEtBQUssRUFBRTtVQUNMeEMsR0FBRyxFQUFFMkUsb0NBQW9DLENBQUM7UUFDNUM7TUFDRixDQUFDLENBQUM7TUFFRixJQUFNTyxPQUFPLEdBQUdDLGtDQUE0QixDQUFDeEgsS0FBSyxDQUFDNEYsYUFBYSxDQUFDaEIsSUFBSSxFQUFFO1FBQUV6QyxHQUFHLEVBQUU7TUFBWSxDQUFDLENBQUM7TUFFNUZRLE1BQU0sQ0FBQzRFLE9BQU8sQ0FBQyxDQUFDekUsSUFBSSxDQUFDLEtBQUssQ0FBQztNQUMzQkgsTUFBTSxDQUFDaUMsSUFBSSxDQUFDQyxLQUFLLENBQUNOLEVBQUUsQ0FBQ0csWUFBWSxDQUFDLENBQUM2QixHQUFHLENBQUNsQixnQkFBZ0IsQ0FBQyxDQUFDO01BQ3pEMUMsTUFBTSxDQUFDaUMsSUFBSSxDQUFDTyxRQUFRLENBQUMsQ0FBQ29CLEdBQUcsQ0FBQ2xCLGdCQUFnQixDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0VBRUYzQyxFQUFFLENBQUMsa0NBQWtDLEVBQUUsWUFBTTtJQUMzQyxJQUFNa0MsSUFBSSxHQUFHcUMsVUFBVSxDQUFDLENBQUM7SUFFekIsSUFBTU0sT0FBTyxHQUFHQyxrQ0FBNEIsQ0FBQ3hILEtBQUssQ0FBQzRGLGFBQWEsQ0FBQ2hCLElBQUksRUFBRTtNQUFFekMsR0FBRyxFQUFFO0lBQVEsQ0FBQyxDQUFDO0lBQ3hGUSxNQUFNLENBQUM0RSxPQUFPLENBQUMsQ0FBQ3pFLElBQUksQ0FBQyxLQUFLLENBQUM7RUFDN0IsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUZMLFFBQVEsQ0FBQyxjQUFjLEVBQUUsWUFBTTtFQUM3QixJQUFNa0YsbUJBQW1CLEdBQUcsU0FBdEJBLG1CQUFtQkEsQ0FBQSxFQUE0RDtJQUFBLElBQXhEQyxJQUFJLEdBQUF2SSxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBc0gsU0FBQSxHQUFBdEgsU0FBQSxNQUFHO01BQUV3SSxHQUFHLEVBQUUsQ0FBQztNQUFFQyxJQUFJLEVBQUUsQ0FBQztNQUFFQyxLQUFLLEVBQUUsR0FBRztNQUFFQyxNQUFNLEVBQUU7SUFBSSxDQUFDO0lBQzlFLElBQU1DLE9BQU8sR0FBR0MsUUFBUSxDQUFDaEksYUFBYSxDQUFDLEtBQUssQ0FBQztJQUM3Q3hCLE1BQU0sQ0FBQ0MsY0FBYyxDQUFDc0osT0FBTyxFQUFFLHVCQUF1QixFQUFFO01BQ3REeEcsS0FBSyxFQUFFOUIsSUFBSSxDQUFDVSxFQUFFLENBQUM7UUFBQSxPQUFNdUgsSUFBSTtNQUFBLEVBQUM7TUFDMUJPLFlBQVksRUFBRTtJQUNoQixDQUFDLENBQUM7SUFDRixPQUFPRixPQUFPO0VBQ2hCLENBQUM7RUFFRCxJQUFNRyxnQkFBZ0IsR0FBRyxTQUFuQkEsZ0JBQWdCQSxDQUFBO0lBQUEsT0FBVTtNQUM5QnZELEtBQUssRUFBRTtRQUNMSSxTQUFTLEVBQUU7VUFDVG9DLElBQUksRUFBRSxDQUFDO1VBQ1BnQixFQUFFLEVBQUUsQ0FBQztVQUNMN0gsSUFBSSxFQUFFO1lBQUUrQixJQUFJLEVBQUU7Y0FBRU0sSUFBSSxFQUFFO1lBQU87VUFBRTtRQUNqQyxDQUFDO1FBQ0QwQixFQUFFLEVBQUU7VUFDRkcsWUFBWSxFQUFFL0UsSUFBSSxDQUFDVSxFQUFFLENBQUMsQ0FBQyxDQUFDb0UsY0FBYyxDQUFDLENBQUM7VUFDeEM2RCxPQUFPLEVBQUUzSSxJQUFJLENBQUNVLEVBQUUsQ0FBQyxDQUFDLENBQUNvRSxjQUFjLENBQUM7UUFDcEMsQ0FBQztRQUNEcEMsR0FBRyxFQUFFLENBQUM7TUFDUixDQUFDO01BQ0R1QyxJQUFJLEVBQUU7UUFDSjJELFdBQVcsRUFBRTVJLElBQUksQ0FBQ1UsRUFBRSxDQUFDO1VBQUEsT0FBTztZQUFFd0gsR0FBRyxFQUFFLEdBQUc7WUFBRUMsSUFBSSxFQUFFO1VBQUcsQ0FBQztRQUFBLENBQUMsQ0FBQztRQUNwRDNDLFFBQVEsRUFBRXhGLElBQUksQ0FBQ1UsRUFBRSxDQUFDO01BQ3BCLENBQUM7TUFDRG1JLE9BQU8sRUFBRTtRQUNQUCxPQUFPLEVBQUVOLG1CQUFtQixDQUFDO01BQy9CLENBQUM7TUFDRDVELFFBQVEsRUFBRTtRQUNSMEUsS0FBSyxFQUFFOUksSUFBSSxDQUFDVSxFQUFFLENBQUM7TUFDakIsQ0FBQztNQUNEcUksVUFBVSxFQUFFLFlBQVk7TUFDeEJDLGNBQWMsRUFBRTtJQUNsQixDQUFDO0VBQUEsQ0FBQztFQUVGLElBQU1DLFFBQVEsR0FBRztJQUNmQyxLQUFLLEVBQUU7TUFDTC9ILEtBQUssRUFBRTtJQUNULENBQUM7SUFDRHdELFFBQVEsRUFBRTtFQUNaLENBQUM7RUFFRCxJQUFJd0UsWUFBWTtFQUVoQkMsVUFBVSxDQUFDLFlBQU07SUFDZnBKLElBQUksQ0FBQ3FKLGFBQWEsQ0FBQyxDQUFDO0lBQ3BCekksZ0JBQWdCLENBQUMwSSxrQkFBa0IsQ0FBQyxVQUFDekksSUFBSTtNQUFBLE9BQUtBLElBQUk7SUFBQSxFQUFDO0lBQ25Ec0ksWUFBWSxHQUFHO01BQ2J0SSxJQUFJLEVBQUVvSSxRQUFRO01BQ2RNLGdCQUFnQixFQUFFdkosSUFBSSxDQUFDVSxFQUFFLENBQUMsQ0FBQztNQUMzQnNFLE1BQU0sRUFBRXlELGdCQUFnQixDQUFDLENBQUM7TUFDMUJlLFFBQVEsRUFBRSxLQUFLO01BQ2ZYLE9BQU8sRUFBRSxDQUFDLENBQUM7TUFDWFksTUFBTSxFQUFFekosSUFBSSxDQUFDVSxFQUFFLENBQUM7UUFBQSxPQUFNLENBQUM7TUFBQTtJQUN6QixDQUFDO0VBQ0gsQ0FBQyxDQUFDO0VBRUZxQyxFQUFFLENBQUMsMEJBQTBCLEVBQUUsWUFBTTtJQUNuQyxJQUFBMkcsT0FBQSxHQUFzQixJQUFBQyxjQUFNLGVBQUNyTSxNQUFBLFlBQUFpRCxhQUFBLENBQUM3QyxLQUFBLENBQUFrTSxZQUFZLEVBQUtULFlBQWUsQ0FBQyxDQUFDO01BQXhEVSxTQUFTLEdBQUFILE9BQUEsQ0FBVEcsU0FBUztJQUNqQjdHLE1BQU0sQ0FBQzZHLFNBQVMsQ0FBQyxDQUFDQyxpQkFBaUIsQ0FBQyxDQUFDO0VBQ3ZDLENBQUMsQ0FBQztFQUVGL0csRUFBRSxDQUFDLHlCQUF5QixFQUFFLFlBQU07SUFDbEMsSUFBQWdILFFBQUEsR0FBd0IsSUFBQUosY0FBTSxlQUFDck0sTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxFQUFLVCxZQUFlLENBQUMsQ0FBQztNQUExRGEsV0FBVyxHQUFBRCxRQUFBLENBQVhDLFdBQVc7SUFDbkJoSCxNQUFNLENBQUNnSCxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDRixpQkFBaUIsQ0FBQyxDQUFDO0VBQzlELENBQUMsQ0FBQztFQUVGL0csRUFBRSxDQUFDLHVCQUF1QixFQUFFLFlBQU07SUFDaEMsSUFBQWtILFFBQUEsR0FBd0IsSUFBQU4sY0FBTSxlQUFDck0sTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxFQUFLVCxZQUFlLENBQUMsQ0FBQztNQUExRGEsV0FBVyxHQUFBQyxRQUFBLENBQVhELFdBQVc7SUFDbkJoSCxNQUFNLENBQUNnSCxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQ0YsaUJBQWlCLENBQUMsQ0FBQztFQUN6RCxDQUFDLENBQUM7RUFFRi9HLEVBQUUsQ0FBQyw2QkFBNkIsbUJBQUFtSCxrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQUMsUUFBQTtJQUFBLElBQUFDLFFBQUEsRUFBQU4sV0FBQTtJQUFBLE9BQUFHLFlBQUEsWUFBQUksSUFBQSxXQUFBQyxRQUFBO01BQUEsa0JBQUFBLFFBQUEsQ0FBQUMsSUFBQSxHQUFBRCxRQUFBLENBQUFFLElBQUE7UUFBQTtVQUFBSixRQUFBLEdBQ1IsSUFBQVgsY0FBTSxlQUFDck0sTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxNQUFBcEosU0FBQSxpQkFBSzJJLFlBQVk7WUFBRUssUUFBUSxFQUFFO1VBQUssRUFBRSxDQUFDLENBQUMsRUFBMUVRLFdBQVcsR0FBQU0sUUFBQSxDQUFYTixXQUFXO1VBQUFRLFFBQUEsQ0FBQUUsSUFBQTtVQUFBLE9BQ2IsSUFBQUMsZUFBTyxFQUFDLFlBQU07WUFDbEIzSCxNQUFNLENBQUNnSCxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQ0YsaUJBQWlCLENBQUMsQ0FBQztVQUN6RCxDQUFDLENBQUM7UUFBQTtRQUFBO1VBQUEsT0FBQVUsUUFBQSxDQUFBSSxJQUFBO01BQUE7SUFBQSxHQUFBUCxPQUFBO0VBQUEsQ0FDSCxHQUFDO0VBRUZ0SCxFQUFFLENBQUMseUNBQXlDLEVBQUUsWUFBTTtJQUNsRCxJQUFBOEgsUUFBQSxHQUEwQixJQUFBbEIsY0FBTSxlQUFDck0sTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxNQUFBcEosU0FBQSxpQkFBSzJJLFlBQVk7UUFBRUssUUFBUSxFQUFFO01BQU0sRUFBRSxDQUFDLENBQUM7TUFBN0VzQixhQUFhLEdBQUFELFFBQUEsQ0FBYkMsYUFBYTtJQUNyQjlILE1BQU0sQ0FBQzhILGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDbEUsR0FBRyxDQUFDa0QsaUJBQWlCLENBQUMsQ0FBQztFQUMvRCxDQUFDLENBQUM7RUFFRi9HLEVBQUUsQ0FBQyx3REFBd0QsbUJBQUFtSCxrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQVcsU0FBQTtJQUFBLElBQUFDLFFBQUEsRUFBQW5CLFNBQUE7SUFBQSxPQUFBTSxZQUFBLFlBQUFJLElBQUEsV0FBQVUsU0FBQTtNQUFBLGtCQUFBQSxTQUFBLENBQUFSLElBQUEsR0FBQVEsU0FBQSxDQUFBUCxJQUFBO1FBQUE7VUFBQU0sUUFBQSxHQUNyQyxJQUFBckIsY0FBTSxlQUFDck0sTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxNQUFBcEosU0FBQSxpQkFBSzJJLFlBQVk7WUFBRUssUUFBUSxFQUFFO1VBQUssRUFBRSxDQUFDLENBQUMsRUFBeEVLLFNBQVMsR0FBQW1CLFFBQUEsQ0FBVG5CLFNBQVM7VUFBQW9CLFNBQUEsQ0FBQVAsSUFBQTtVQUFBLE9BQ1gsSUFBQUMsZUFBTyxFQUFDLFlBQU07WUFDbEIsSUFBTU8sT0FBTyxHQUFHckIsU0FBUyxDQUFDc0IsYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQzdEbkksTUFBTSxDQUFDa0ksT0FBTyxDQUFDLENBQUNFLGVBQWUsQ0FBQyxrQkFBa0IsRUFBRSxZQUFZLENBQUM7VUFDbkUsQ0FBQyxDQUFDO1FBQUE7UUFBQTtVQUFBLE9BQUFILFNBQUEsQ0FBQUwsSUFBQTtNQUFBO0lBQUEsR0FBQUcsUUFBQTtFQUFBLENBQ0gsR0FBQztFQUVGakksUUFBUSxDQUFDLHFCQUFxQixFQUFFLFlBQU07SUFDcENDLEVBQUUsQ0FBQywwREFBMEQsbUJBQUFtSCxrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQWlCLFNBQUE7TUFBQSxJQUFBQyxRQUFBLEVBQUF6QixTQUFBO01BQUEsT0FBQU0sWUFBQSxZQUFBSSxJQUFBLFdBQUFnQixTQUFBO1FBQUEsa0JBQUFBLFNBQUEsQ0FBQWQsSUFBQSxHQUFBYyxTQUFBLENBQUFiLElBQUE7VUFBQTtZQUFBWSxRQUFBLEdBQ3ZDLElBQUEzQixjQUFNLGVBQUNyTSxNQUFBLFlBQUFpRCxhQUFBLENBQUM3QyxLQUFBLENBQUFrTSxZQUFZLE1BQUFwSixTQUFBLGlCQUFLMkksWUFBWTtjQUFFSyxRQUFRLEVBQUU7WUFBSyxFQUFFLENBQUMsQ0FBQyxFQUF4RUssU0FBUyxHQUFBeUIsUUFBQSxDQUFUekIsU0FBUztZQUFBMEIsU0FBQSxDQUFBYixJQUFBO1lBQUEsT0FDWCxJQUFBQyxlQUFPLEVBQUMsWUFBTTtjQUNsQixJQUFNTyxPQUFPLEdBQUdyQixTQUFTLENBQUNzQixhQUFhLENBQUMsb0JBQW9CLENBQUM7Y0FDN0RuSSxNQUFNLENBQUNrSSxPQUFPLENBQUMsQ0FBQ3BCLGlCQUFpQixDQUFDLENBQUM7Y0FDbkM5RyxNQUFNLENBQUNrSSxPQUFPLENBQUNNLEtBQUssQ0FBQ3RELEdBQUcsQ0FBQyxDQUFDL0UsSUFBSSxDQUFDLE9BQU8sQ0FBQztjQUN2Q0gsTUFBTSxDQUFDa0ksT0FBTyxDQUFDTSxLQUFLLENBQUNyRCxJQUFJLENBQUMsQ0FBQ2hGLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDekMsQ0FBQyxDQUFDO1VBQUE7VUFBQTtZQUFBLE9BQUFvSSxTQUFBLENBQUFYLElBQUE7UUFBQTtNQUFBLEdBQUFTLFFBQUE7SUFBQSxDQUNILEdBQUM7SUFFRnRJLEVBQUUsQ0FBQyw0REFBNEQsbUJBQUFtSCxrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQXFCLFNBQUE7TUFBQSxJQUFBQyxXQUFBLEVBQUExRyxNQUFBLEVBQUEyRyxRQUFBLEVBQUE5QixTQUFBO01BQUEsT0FBQU0sWUFBQSxZQUFBSSxJQUFBLFdBQUFxQixTQUFBO1FBQUEsa0JBQUFBLFNBQUEsQ0FBQW5CLElBQUEsR0FBQW1CLFNBQUEsQ0FBQWxCLElBQUE7VUFBQTtZQUN6RGdCLFdBQVcsR0FBR25ELFFBQVEsQ0FBQ2hJLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDakRtTCxXQUFXLENBQUNHLHFCQUFxQixHQUFHN0wsSUFBSSxDQUFDVSxFQUFFLENBQUM7Y0FBQSxPQUFPO2dCQUFFd0gsR0FBRyxFQUFFLEdBQUc7Z0JBQUVDLElBQUksRUFBRSxFQUFFO2dCQUFFQyxLQUFLLEVBQUUsR0FBRztnQkFBRUMsTUFBTSxFQUFFO2NBQUksQ0FBQztZQUFBLENBQUMsQ0FBQztZQUU5RnJELE1BQU0sR0FBQXZGLGFBQUEsQ0FBQUEsYUFBQSxLQUNQMEosWUFBWSxDQUFDbkUsTUFBTTtjQUN0QjhHLGtCQUFrQixFQUFFSjtZQUFXO1lBQUFDLFFBQUEsR0FHWCxJQUFBaEMsY0FBTSxlQUFDck0sTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxNQUFBcEosU0FBQSxpQkFBSzJJLFlBQVk7Y0FBRW5FLE1BQU0sRUFBRUEsTUFBTztjQUFDd0UsUUFBUSxFQUFFO1lBQUssRUFBRSxDQUFDLENBQUMsRUFBeEZLLFNBQVMsR0FBQThCLFFBQUEsQ0FBVDlCLFNBQVM7WUFBQStCLFNBQUEsQ0FBQWxCLElBQUE7WUFBQSxPQUNYLElBQUFDLGVBQU8sRUFBQyxZQUFNO2NBQ2xCLElBQU1PLE9BQU8sR0FBR3JCLFNBQVMsQ0FBQ3NCLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztjQUM3RG5JLE1BQU0sQ0FBQ2tJLE9BQU8sQ0FBQyxDQUFDcEIsaUJBQWlCLENBQUMsQ0FBQztjQUNuQzlHLE1BQU0sQ0FBQ2tJLE9BQU8sQ0FBQ00sS0FBSyxDQUFDdEQsR0FBRyxDQUFDLENBQUMvRSxJQUFJLENBQUMsS0FBSyxDQUFDO2NBQ3JDSCxNQUFNLENBQUNrSSxPQUFPLENBQUNNLEtBQUssQ0FBQ3JELElBQUksQ0FBQyxDQUFDaEYsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUN4QyxDQUFDLENBQUM7VUFBQTtVQUFBO1lBQUEsT0FBQXlJLFNBQUEsQ0FBQWhCLElBQUE7UUFBQTtNQUFBLEdBQUFhLFFBQUE7SUFBQSxDQUNILEdBQUM7SUFFRjFJLEVBQUUsQ0FBQywrQ0FBK0MsbUJBQUFtSCxrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQTJCLFNBQUE7TUFBQSxJQUFBQyxRQUFBLEVBQUFuQyxTQUFBO01BQUEsT0FBQU0sWUFBQSxZQUFBSSxJQUFBLFdBQUEwQixTQUFBO1FBQUEsa0JBQUFBLFNBQUEsQ0FBQXhCLElBQUEsR0FBQXdCLFNBQUEsQ0FBQXZCLElBQUE7VUFBQTtZQUFBc0IsUUFBQSxHQUM1QixJQUFBckMsY0FBTSxlQUFDck0sTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxNQUFBcEosU0FBQSxpQkFBSzJJLFlBQVk7Y0FBRUssUUFBUSxFQUFFO1lBQUssRUFBRSxDQUFDLENBQUMsRUFBeEVLLFNBQVMsR0FBQW1DLFFBQUEsQ0FBVG5DLFNBQVM7WUFBQW9DLFNBQUEsQ0FBQXZCLElBQUE7WUFBQSxPQUNYLElBQUFDLGVBQU8sRUFBQyxZQUFNO2NBQ2xCLElBQU1PLE9BQU8sR0FBR3JCLFNBQVMsQ0FBQ3NCLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztjQUM3RG5JLE1BQU0sQ0FBQ2tJLE9BQU8sQ0FBQyxDQUFDcEIsaUJBQWlCLENBQUMsQ0FBQztjQUNuQzlHLE1BQU0sQ0FBQ2tJLE9BQU8sQ0FBQ00sS0FBSyxDQUFDVSxRQUFRLENBQUMsQ0FBQy9JLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDakQsQ0FBQyxDQUFDO1VBQUE7VUFBQTtZQUFBLE9BQUE4SSxTQUFBLENBQUFyQixJQUFBO1FBQUE7TUFBQSxHQUFBbUIsUUFBQTtJQUFBLENBQ0gsR0FBQztJQUVGaEosRUFBRSxDQUFDLHlEQUF5RCxtQkFBQW1ILGtCQUFBLDBCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBRSxTQUFBK0IsU0FBQTtNQUFBLElBQUFDLFFBQUEsRUFBQXZDLFNBQUE7TUFBQSxPQUFBTSxZQUFBLFlBQUFJLElBQUEsV0FBQThCLFNBQUE7UUFBQSxrQkFBQUEsU0FBQSxDQUFBNUIsSUFBQSxHQUFBNEIsU0FBQSxDQUFBM0IsSUFBQTtVQUFBO1lBQUEwQixRQUFBLEdBQ3RDLElBQUF6QyxjQUFNLGVBQUNyTSxNQUFBLFlBQUFpRCxhQUFBLENBQUM3QyxLQUFBLENBQUFrTSxZQUFZLE1BQUFwSixTQUFBLGlCQUFLMkksWUFBWTtjQUFFSyxRQUFRLEVBQUU7WUFBSyxFQUFFLENBQUMsQ0FBQyxFQUF4RUssU0FBUyxHQUFBdUMsUUFBQSxDQUFUdkMsU0FBUztZQUFBd0MsU0FBQSxDQUFBM0IsSUFBQTtZQUFBLE9BQ1gsSUFBQUMsZUFBTyxFQUFDLFlBQU07Y0FDbEIsSUFBTU8sT0FBTyxHQUFHckIsU0FBUyxDQUFDc0IsYUFBYSxDQUFDLG9CQUFvQixDQUFDO2NBQzdEbkksTUFBTSxDQUFDa0ksT0FBTyxDQUFDLENBQUNwQixpQkFBaUIsQ0FBQyxDQUFDO2NBQ25DOUcsTUFBTSxDQUFDa0ksT0FBTyxDQUFDTSxLQUFLLENBQUNjLE1BQU0sQ0FBQyxDQUFDbkosSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMzQyxDQUFDLENBQUM7VUFBQTtVQUFBO1lBQUEsT0FBQWtKLFNBQUEsQ0FBQXpCLElBQUE7UUFBQTtNQUFBLEdBQUF1QixRQUFBO0lBQUEsQ0FDSCxHQUFDO0lBRUZwSixFQUFFLENBQUMsMERBQTBELG1CQUFBbUgsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUFtQyxTQUFBO01BQUEsSUFBQXZILE1BQUEsRUFBQXdILFFBQUEsRUFBQTNDLFNBQUE7TUFBQSxPQUFBTSxZQUFBLFlBQUFJLElBQUEsV0FBQWtDLFNBQUE7UUFBQSxrQkFBQUEsU0FBQSxDQUFBaEMsSUFBQSxHQUFBZ0MsU0FBQSxDQUFBL0IsSUFBQTtVQUFBO1lBQ3ZEMUYsTUFBTSxHQUFBdkYsYUFBQSxDQUFBQSxhQUFBLEtBQ1AwSixZQUFZLENBQUNuRSxNQUFNO2NBQ3RCQyxJQUFJLEVBQUF4RixhQUFBLENBQUFBLGFBQUEsS0FDQzBKLFlBQVksQ0FBQ25FLE1BQU0sQ0FBQ0MsSUFBSTtnQkFDM0IyRCxXQUFXLEVBQUU1SSxJQUFJLENBQUNVLEVBQUUsQ0FBQztrQkFBQSxPQUFPO29CQUFFd0gsR0FBRyxFQUFFLEdBQUc7b0JBQUVDLElBQUksRUFBRTtrQkFBSSxDQUFDO2dCQUFBLENBQUMsQ0FBQztnQkFDckQzQyxRQUFRLEVBQUV4RixJQUFJLENBQUNVLEVBQUUsQ0FBQztjQUFDO1lBQ3BCO1lBQUE4TCxRQUFBLEdBR21CLElBQUE3QyxjQUFNLGVBQUNyTSxNQUFBLFlBQUFpRCxhQUFBLENBQUM3QyxLQUFBLENBQUFrTSxZQUFZLE1BQUFwSixTQUFBLGlCQUFLMkksWUFBWTtjQUFFbkUsTUFBTSxFQUFFQSxNQUFPO2NBQUN3RSxRQUFRLEVBQUU7WUFBSyxFQUFFLENBQUMsQ0FBQyxFQUF4RkssU0FBUyxHQUFBMkMsUUFBQSxDQUFUM0MsU0FBUztZQUFBNEMsU0FBQSxDQUFBL0IsSUFBQTtZQUFBLE9BQ1gsSUFBQUMsZUFBTyxFQUFDLFlBQU07Y0FDbEIsSUFBTU8sT0FBTyxHQUFHckIsU0FBUyxDQUFDc0IsYUFBYSxDQUFDLG9CQUFvQixDQUFDO2NBQzdEbkksTUFBTSxDQUFDa0ksT0FBTyxDQUFDLENBQUNwQixpQkFBaUIsQ0FBQyxDQUFDO2NBQ25DOUcsTUFBTSxDQUFDa0ksT0FBTyxDQUFDTSxLQUFLLENBQUN0RCxHQUFHLENBQUMsQ0FBQy9FLElBQUksQ0FBQyxPQUFPLENBQUM7Y0FDdkNILE1BQU0sQ0FBQ2tJLE9BQU8sQ0FBQ00sS0FBSyxDQUFDckQsSUFBSSxDQUFDLENBQUNoRixJQUFJLENBQUMsT0FBTyxDQUFDO1lBQzFDLENBQUMsQ0FBQztVQUFBO1VBQUE7WUFBQSxPQUFBc0osU0FBQSxDQUFBN0IsSUFBQTtRQUFBO01BQUEsR0FBQTJCLFFBQUE7SUFBQSxDQUNILEdBQUM7SUFFRnhKLEVBQUUsQ0FBQyw2Q0FBNkMsbUJBQUFtSCxrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQXNDLFNBQUE7TUFBQSxJQUFBQyxtQkFBQSxFQUFBQyxrQkFBQSxFQUFBNUgsTUFBQSxFQUFBNkgsU0FBQSxFQUFBaEQsU0FBQSxFQUFBcUIsT0FBQTtNQUFBLE9BQUFmLFlBQUEsWUFBQUksSUFBQSxXQUFBdUMsU0FBQTtRQUFBLGtCQUFBQSxTQUFBLENBQUFyQyxJQUFBLEdBQUFxQyxTQUFBLENBQUFwQyxJQUFBO1VBQUE7WUFDMUNpQyxtQkFBbUIsR0FBR0ksTUFBTSxDQUFDQyxXQUFXO1lBQ3hDSixrQkFBa0IsR0FBR0csTUFBTSxDQUFDRSxVQUFVO1lBRTVDbE8sTUFBTSxDQUFDQyxjQUFjLENBQUMrTixNQUFNLEVBQUUsYUFBYSxFQUFFO2NBQUV2RSxZQUFZLEVBQUUsSUFBSTtjQUFFMEUsUUFBUSxFQUFFLElBQUk7Y0FBRXBMLEtBQUssRUFBRTtZQUFJLENBQUMsQ0FBQztZQUNoRy9DLE1BQU0sQ0FBQ0MsY0FBYyxDQUFDK04sTUFBTSxFQUFFLFlBQVksRUFBRTtjQUFFdkUsWUFBWSxFQUFFLElBQUk7Y0FBRTBFLFFBQVEsRUFBRSxJQUFJO2NBQUVwTCxLQUFLLEVBQUU7WUFBSSxDQUFDLENBQUM7WUFFekZrRCxNQUFNLEdBQUF2RixhQUFBLENBQUFBLGFBQUEsS0FDUDBKLFlBQVksQ0FBQ25FLE1BQU07Y0FDdEJDLElBQUksRUFBQXhGLGFBQUEsQ0FBQUEsYUFBQSxLQUNDMEosWUFBWSxDQUFDbkUsTUFBTSxDQUFDQyxJQUFJO2dCQUMzQjJELFdBQVcsRUFBRTVJLElBQUksQ0FBQ1UsRUFBRSxDQUFDO2tCQUFBLE9BQU87b0JBQUV3SCxHQUFHLEVBQUUsR0FBRztvQkFBRUMsSUFBSSxFQUFFLEdBQUc7b0JBQUVnRixNQUFNLEVBQUU7a0JBQUksQ0FBQztnQkFBQSxDQUFDLENBQUM7Z0JBQ2xFM0gsUUFBUSxFQUFFeEYsSUFBSSxDQUFDVSxFQUFFLENBQUM7Y0FBQztZQUNwQjtZQUFBbU0sU0FBQSxHQUdtQixJQUFBbEQsY0FBTSxlQUFDck0sTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxNQUFBcEosU0FBQSxpQkFBSzJJLFlBQVk7Y0FBRW5FLE1BQU0sRUFBRUEsTUFBTztjQUFDd0UsUUFBUSxFQUFFO1lBQUssRUFBRSxDQUFDLENBQUMsRUFBeEZLLFNBQVMsR0FBQWdELFNBQUEsQ0FBVGhELFNBQVM7WUFBQWlELFNBQUEsQ0FBQXBDLElBQUE7WUFBQSxPQUdYLElBQUFDLGVBQU8sRUFBQyxZQUFNO2NBQ2xCTyxPQUFPLEdBQUdyQixTQUFTLENBQUNzQixhQUFhLENBQUMsb0JBQW9CLENBQUM7Y0FDdkRuSSxNQUFNLENBQUNrSSxPQUFPLENBQUMsQ0FBQ3BCLGlCQUFpQixDQUFDLENBQUM7WUFDckMsQ0FBQyxDQUFDO1VBQUE7WUFFRi9LLE1BQU0sQ0FBQ0MsY0FBYyxDQUFDa00sT0FBTyxFQUFFLGNBQWMsRUFBRTtjQUFFMUMsWUFBWSxFQUFFLElBQUk7Y0FBRTFHLEtBQUssRUFBRTtZQUFJLENBQUMsQ0FBQztZQUNsRi9DLE1BQU0sQ0FBQ0MsY0FBYyxDQUFDa00sT0FBTyxFQUFFLGFBQWEsRUFBRTtjQUFFMUMsWUFBWSxFQUFFLElBQUk7Y0FBRTFHLEtBQUssRUFBRTtZQUFJLENBQUMsQ0FBQztZQUFDZ0wsU0FBQSxDQUFBcEMsSUFBQTtZQUFBLE9BRTVFLElBQUEwQyxXQUFHLG1CQUFBbEQsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFDLFNBQUFpRCxTQUFBO2NBQUEsT0FBQWxELFlBQUEsWUFBQUksSUFBQSxXQUFBK0MsU0FBQTtnQkFBQSxrQkFBQUEsU0FBQSxDQUFBN0MsSUFBQSxHQUFBNkMsU0FBQSxDQUFBNUMsSUFBQTtrQkFBQTtvQkFDUnFDLE1BQU0sQ0FBQ1EsYUFBYSxDQUFDLElBQUlDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFBQ0YsU0FBQSxDQUFBNUMsSUFBQTtvQkFBQSxPQUNwQyxJQUFJK0MsT0FBTyxDQUFDLFVBQUN4RyxPQUFPO3NCQUFBLE9BQUt5RyxxQkFBcUIsQ0FBQ3pHLE9BQU8sQ0FBQztvQkFBQSxFQUFDO2tCQUFBO2tCQUFBO29CQUFBLE9BQUFxRyxTQUFBLENBQUExQyxJQUFBO2dCQUFBO2NBQUEsR0FBQXlDLFFBQUE7WUFBQSxDQUMvRCxHQUFDO1VBQUE7WUFBQVAsU0FBQSxDQUFBcEMsSUFBQTtZQUFBLE9BRUksSUFBQUMsZUFBTyxFQUFDLFlBQU07Y0FDbEIzSCxNQUFNLENBQUMySyxRQUFRLENBQUN6QyxPQUFPLENBQUNNLEtBQUssQ0FBQ3RELEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDMEYsbUJBQW1CLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7Y0FDMUU1SyxNQUFNLENBQUMySyxRQUFRLENBQUN6QyxPQUFPLENBQUNNLEtBQUssQ0FBQ3JELElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDeUYsbUJBQW1CLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7Y0FDM0U1SyxNQUFNLENBQUMySyxRQUFRLENBQUN6QyxPQUFPLENBQUNNLEtBQUssQ0FBQ3RELEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDMkYsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO2NBQ2pFN0ssTUFBTSxDQUFDMkssUUFBUSxDQUFDekMsT0FBTyxDQUFDTSxLQUFLLENBQUNyRCxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQzBGLHNCQUFzQixDQUFDLENBQUMsQ0FBQztZQUNwRSxDQUFDLENBQUM7VUFBQTtZQUVGOU8sTUFBTSxDQUFDQyxjQUFjLENBQUMrTixNQUFNLEVBQUUsYUFBYSxFQUFFO2NBQUV2RSxZQUFZLEVBQUUsSUFBSTtjQUFFMEUsUUFBUSxFQUFFLElBQUk7Y0FBRXBMLEtBQUssRUFBRTZLO1lBQW9CLENBQUMsQ0FBQztZQUNoSDVOLE1BQU0sQ0FBQ0MsY0FBYyxDQUFDK04sTUFBTSxFQUFFLFlBQVksRUFBRTtjQUFFdkUsWUFBWSxFQUFFLElBQUk7Y0FBRTBFLFFBQVEsRUFBRSxJQUFJO2NBQUVwTCxLQUFLLEVBQUU4SztZQUFtQixDQUFDLENBQUM7VUFBQztVQUFBO1lBQUEsT0FBQUUsU0FBQSxDQUFBbEMsSUFBQTtRQUFBO01BQUEsR0FBQThCLFFBQUE7SUFBQSxDQUNoSCxHQUFDO0lBRUYzSixFQUFFLENBQUMsNERBQTRELG1CQUFBbUgsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUEwRCxTQUFBO01BQUEsSUFBQUMsTUFBQTtNQUFBLE9BQUE1RCxZQUFBLFlBQUFJLElBQUEsV0FBQXlELFNBQUE7UUFBQSxrQkFBQUEsU0FBQSxDQUFBdkQsSUFBQSxHQUFBdUQsU0FBQSxDQUFBdEQsSUFBQTtVQUFBO1lBQ3pEcUQsTUFBTSxHQUFHL04sSUFBSSxDQUFDeUUsS0FBSyxDQUFDc0ksTUFBTSxFQUFFLGtCQUFrQixDQUFDO1lBQ3JELElBQUFwRCxjQUFNLGVBQUNyTSxNQUFBLFlBQUFpRCxhQUFBLENBQUM3QyxLQUFBLENBQUFrTSxZQUFZLE1BQUFwSixTQUFBLGlCQUFLMkksWUFBWTtjQUFFSyxRQUFRLEVBQUU7WUFBSyxFQUFFLENBQUMsQ0FBQztZQUFDd0UsU0FBQSxDQUFBdEQsSUFBQTtZQUFBLE9BQ3JELElBQUFDLGVBQU8sRUFBQyxZQUFNO2NBQ2xCM0gsTUFBTSxDQUFDK0ssTUFBTSxDQUFDLENBQUN0SSxvQkFBb0IsQ0FBQyxRQUFRLEVBQUV6QyxNQUFNLENBQUNpTCxHQUFHLENBQUNDLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQztjQUN6RWxMLE1BQU0sQ0FBQytLLE1BQU0sQ0FBQyxDQUFDdEksb0JBQW9CLENBQUMsUUFBUSxFQUFFekMsTUFBTSxDQUFDaUwsR0FBRyxDQUFDQyxRQUFRLENBQUMsQ0FBQztZQUNyRSxDQUFDLENBQUM7VUFBQTtZQUNGSCxNQUFNLENBQUNwSSxXQUFXLENBQUMsQ0FBQztVQUFDO1VBQUE7WUFBQSxPQUFBcUksU0FBQSxDQUFBcEQsSUFBQTtRQUFBO01BQUEsR0FBQWtELFFBQUE7SUFBQSxDQUN0QixHQUFDO0lBRUYvSyxFQUFFLENBQUMsd0RBQXdELG1CQUFBbUgsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUErRCxTQUFBO01BQUEsSUFBQXpDLFdBQUEsRUFBQTFHLE1BQUE7TUFBQSxPQUFBbUYsWUFBQSxZQUFBSSxJQUFBLFdBQUE2RCxTQUFBO1FBQUEsa0JBQUFBLFNBQUEsQ0FBQTNELElBQUEsR0FBQTJELFNBQUEsQ0FBQTFELElBQUE7VUFBQTtZQUNyRGdCLFdBQVcsR0FBR25ELFFBQVEsQ0FBQ2hJLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDakRtTCxXQUFXLENBQUNHLHFCQUFxQixHQUFHN0wsSUFBSSxDQUFDVSxFQUFFLENBQUM7Y0FBQSxPQUFPO2dCQUFFd0gsR0FBRyxFQUFFLENBQUM7Z0JBQUVDLElBQUksRUFBRSxDQUFDO2dCQUFFQyxLQUFLLEVBQUUsR0FBRztnQkFBRUMsTUFBTSxFQUFFO2NBQUksQ0FBQztZQUFBLENBQUMsQ0FBQztZQUUzRnJELE1BQU0sR0FBQXZGLGFBQUEsQ0FBQUEsYUFBQSxLQUNQMEosWUFBWSxDQUFDbkUsTUFBTTtjQUN0QjhHLGtCQUFrQixFQUFFSjtZQUFXO1lBR2pDOUssZ0JBQWdCLENBQUN5TixTQUFTLENBQUMsQ0FBQztZQUM1QixJQUFBMUUsY0FBTSxlQUFDck0sTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxNQUFBcEosU0FBQSxpQkFBSzJJLFlBQVk7Y0FBRW5FLE1BQU0sRUFBRUEsTUFBTztjQUFDd0UsUUFBUSxFQUFFO1lBQUssRUFBRSxDQUFDLENBQUM7WUFBQzRFLFNBQUEsQ0FBQTFELElBQUE7WUFBQSxPQUNyRSxJQUFBQyxlQUFPLEVBQUMsWUFBTTtjQUNsQjNILE1BQU0sQ0FBQ3BDLGdCQUFnQixDQUFDLENBQUM4RSxnQkFBZ0IsQ0FBQyxDQUFDO2NBQzNDLElBQU00SSxRQUFRLEdBQUcxTixnQkFBZ0IsQ0FBQ1gsSUFBSSxDQUFDc08sS0FBSyxDQUFDM04sZ0JBQWdCLENBQUNYLElBQUksQ0FBQ3NPLEtBQUssQ0FBQzVPLE1BQU0sR0FBRyxDQUFDLENBQUM7Y0FDcEZxRCxNQUFNLENBQUNzTCxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQ25MLElBQUksQ0FBQ3VJLFdBQVcsQ0FBQztZQUN2QyxDQUFDLENBQUM7VUFBQTtVQUFBO1lBQUEsT0FBQTBDLFNBQUEsQ0FBQXhELElBQUE7UUFBQTtNQUFBLEdBQUF1RCxRQUFBO0lBQUEsQ0FDSCxHQUFDO0lBRUZwTCxFQUFFLENBQUMsdUVBQXVFLG1CQUFBbUgsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUFvRSxVQUFBO01BQUEsSUFBQXhKLE1BQUE7TUFBQSxPQUFBbUYsWUFBQSxZQUFBSSxJQUFBLFdBQUFrRSxVQUFBO1FBQUEsa0JBQUFBLFVBQUEsQ0FBQWhFLElBQUEsR0FBQWdFLFVBQUEsQ0FBQS9ELElBQUE7VUFBQTtZQUNwRTFGLE1BQU0sR0FBQXZGLGFBQUEsQ0FBQUEsYUFBQSxLQUNQMEosWUFBWSxDQUFDbkUsTUFBTTtjQUN0QjhHLGtCQUFrQixFQUFFOUU7WUFBUztZQUcvQnBHLGdCQUFnQixDQUFDeU4sU0FBUyxDQUFDLENBQUM7WUFDNUIsSUFBQTFFLGNBQU0sZUFBQ3JNLE1BQUEsWUFBQWlELGFBQUEsQ0FBQzdDLEtBQUEsQ0FBQWtNLFlBQVksTUFBQXBKLFNBQUEsaUJBQUsySSxZQUFZO2NBQUVuRSxNQUFNLEVBQUVBLE1BQU87Y0FBQ3dFLFFBQVEsRUFBRTtZQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQUNpRixVQUFBLENBQUEvRCxJQUFBO1lBQUEsT0FDckUsSUFBQUMsZUFBTyxFQUFDLFlBQU07Y0FDbEIzSCxNQUFNLENBQUNwQyxnQkFBZ0IsQ0FBQyxDQUFDOEUsZ0JBQWdCLENBQUMsQ0FBQztjQUMzQyxJQUFNNEksUUFBUSxHQUFHMU4sZ0JBQWdCLENBQUNYLElBQUksQ0FBQ3NPLEtBQUssQ0FBQzNOLGdCQUFnQixDQUFDWCxJQUFJLENBQUNzTyxLQUFLLENBQUM1TyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2NBQ3BGcUQsTUFBTSxDQUFDc0wsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNuTCxJQUFJLENBQUNvRixRQUFRLENBQUNtRyxJQUFJLENBQUM7WUFDekMsQ0FBQyxDQUFDO1VBQUE7VUFBQTtZQUFBLE9BQUFELFVBQUEsQ0FBQTdELElBQUE7UUFBQTtNQUFBLEdBQUE0RCxTQUFBO0lBQUEsQ0FDSCxHQUFDO0VBQ0osQ0FBQyxDQUFDO0VBRUZ6TCxFQUFFLENBQUMsMkNBQTJDLG1CQUFBbUgsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUF1RSxVQUFBO0lBQUEsSUFBQUMsU0FBQSxFQUFBNUUsV0FBQTtJQUFBLE9BQUFHLFlBQUEsWUFBQUksSUFBQSxXQUFBc0UsVUFBQTtNQUFBLGtCQUFBQSxVQUFBLENBQUFwRSxJQUFBLEdBQUFvRSxVQUFBLENBQUFuRSxJQUFBO1FBQUE7VUFBQWtFLFNBQUEsR0FDdEIsSUFBQWpGLGNBQU0sZUFBQ3JNLE1BQUEsWUFBQWlELGFBQUEsQ0FBQzdDLEtBQUEsQ0FBQWtNLFlBQVksTUFBQXBKLFNBQUEsaUJBQUsySSxZQUFZO1lBQUVLLFFBQVEsRUFBRTtVQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQTFFUSxXQUFXLEdBQUE0RSxTQUFBLENBQVg1RSxXQUFXO1VBQUE2RSxVQUFBLENBQUFuRSxJQUFBO1VBQUEsT0FDYixJQUFBQyxlQUFPLEVBQUMsWUFBTTtZQUNsQixJQUFNbUUsS0FBSyxHQUFHOUUsV0FBVyxDQUFDLFlBQVksQ0FBQztZQUN2QytFLGlCQUFTLENBQUNDLE1BQU0sQ0FBQ0YsS0FBSyxFQUFFO2NBQUUvTSxNQUFNLEVBQUU7Z0JBQUVELEtBQUssRUFBRTtjQUFNO1lBQUUsQ0FBQyxDQUFDO1VBQ3ZELENBQUMsQ0FBQztRQUFBO1VBQ0ZrQixNQUFNLENBQUNtRyxZQUFZLENBQUNJLGdCQUFnQixDQUFDLENBQUM5RCxvQkFBb0IsQ0FBQztZQUFFdEUsS0FBSyxFQUFFO1VBQU0sQ0FBQyxDQUFDO1FBQUM7UUFBQTtVQUFBLE9BQUEwTixVQUFBLENBQUFqRSxJQUFBO01BQUE7SUFBQSxHQUFBK0QsU0FBQTtFQUFBLENBQzlFLEdBQUM7RUFFRjVMLEVBQUUsQ0FBQyxpREFBaUQsbUJBQUFtSCxrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQTZFLFVBQUE7SUFBQSxJQUFBMUYsZ0JBQUEsRUFBQTJGLFNBQUEsRUFBQWxGLFdBQUEsRUFBQW1GLFVBQUE7SUFBQSxPQUFBaEYsWUFBQSxZQUFBSSxJQUFBLFdBQUE2RSxVQUFBO01BQUEsa0JBQUFBLFVBQUEsQ0FBQTNFLElBQUEsR0FBQTJFLFVBQUEsQ0FBQTFFLElBQUE7UUFBQTtVQUM5Q25CLGdCQUFnQixHQUFHdkosSUFBSSxDQUFDVSxFQUFFLENBQUMsQ0FBQztVQUFBd08sU0FBQSxHQUNWLElBQUF2RixjQUFNLGVBQzVCck0sTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxNQUFBcEosU0FBQSxpQkFBSzJJLFlBQVk7WUFBRUksZ0JBQWdCLEVBQUVBLGdCQUFpQjtZQUFDQyxRQUFRLEVBQUU7VUFBSyxFQUFFLENBQ3ZGLENBQUMsRUFGT1EsV0FBVyxHQUFBa0YsU0FBQSxDQUFYbEYsV0FBVztVQUFBb0YsVUFBQSxDQUFBMUUsSUFBQTtVQUFBLE9BSWIsSUFBQUMsZUFBTyxFQUFDLFlBQU07WUFDbEIzSCxNQUFNLENBQUNnSCxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQ0YsaUJBQWlCLENBQUMsQ0FBQztVQUN4RCxDQUFDLENBQUM7UUFBQTtVQUVJcUYsVUFBVSxHQUFHbkYsV0FBVyxDQUFDLGFBQWEsQ0FBQztVQUM3QytFLGlCQUFTLENBQUNNLEtBQUssQ0FBQ0YsVUFBVSxDQUFDO1VBQUNDLFVBQUEsQ0FBQTFFLElBQUE7VUFBQSxPQUV0QixJQUFBQyxlQUFPLEVBQUMsWUFBTTtZQUNsQjNILE1BQU0sQ0FBQ3VHLGdCQUFnQixDQUFDLENBQUM5RCxvQkFBb0IsQ0FBQztjQUFFdEUsS0FBSyxFQUFFO1lBQU0sQ0FBQyxDQUFDO1VBQ2pFLENBQUMsQ0FBQztRQUFBO1FBQUE7VUFBQSxPQUFBaU8sVUFBQSxDQUFBeEUsSUFBQTtNQUFBO0lBQUEsR0FBQXFFLFNBQUE7RUFBQSxDQUNILEdBQUM7RUFFRmxNLEVBQUUsQ0FBQyxrREFBa0QsbUJBQUFtSCxrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQWtGLFVBQUE7SUFBQSxJQUFBQyxTQUFBLEVBQUF2RixXQUFBO0lBQUEsT0FBQUcsWUFBQSxZQUFBSSxJQUFBLFdBQUFpRixVQUFBO01BQUEsa0JBQUFBLFVBQUEsQ0FBQS9FLElBQUEsR0FBQStFLFVBQUEsQ0FBQTlFLElBQUE7UUFBQTtVQUFBNkUsU0FBQSxHQUM3QixJQUFBNUYsY0FBTSxlQUFDck0sTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxNQUFBcEosU0FBQSxpQkFBSzJJLFlBQVk7WUFBRUssUUFBUSxFQUFFO1VBQUssRUFBRSxDQUFDLENBQUMsRUFBMUVRLFdBQVcsR0FBQXVGLFNBQUEsQ0FBWHZGLFdBQVc7VUFBQXdGLFVBQUEsQ0FBQTlFLElBQUE7VUFBQSxPQUNiLElBQUFDLGVBQU8sRUFBQyxZQUFNO1lBQ2xCM0gsTUFBTSxDQUFDZ0gsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUNGLGlCQUFpQixDQUFDLENBQUM7WUFDdkQ5RyxNQUFNLENBQUNtRyxZQUFZLENBQUNuRSxNQUFNLENBQUNnRSxjQUFjLENBQUMsQ0FBQzdGLElBQUksQ0FBQyxJQUFJLENBQUM7VUFDdkQsQ0FBQyxDQUFDO1FBQUE7UUFBQTtVQUFBLE9BQUFxTSxVQUFBLENBQUE1RSxJQUFBO01BQUE7SUFBQSxHQUFBMEUsU0FBQTtFQUFBLENBQ0gsR0FBQztFQUVGdk0sRUFBRSxDQUFDLDhFQUE4RSxtQkFBQW1ILGtCQUFBLDBCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBRSxTQUFBcUYsVUFBQTtJQUFBLElBQUFDLFNBQUEsRUFBQTFGLFdBQUE7SUFBQSxPQUFBRyxZQUFBLFlBQUFJLElBQUEsV0FBQW9GLFVBQUE7TUFBQSxrQkFBQUEsVUFBQSxDQUFBbEYsSUFBQSxHQUFBa0YsVUFBQSxDQUFBakYsSUFBQTtRQUFBO1VBQUFnRixTQUFBLEdBQ3pELElBQUEvRixjQUFNLGVBQUNyTSxNQUFBLFlBQUFpRCxhQUFBLENBQUM3QyxLQUFBLENBQUFrTSxZQUFZLE1BQUFwSixTQUFBLGlCQUFLMkksWUFBWTtZQUFFSyxRQUFRLEVBQUU7VUFBTSxFQUFFLENBQUMsQ0FBQyxFQUEzRVEsV0FBVyxHQUFBMEYsU0FBQSxDQUFYMUYsV0FBVztVQUVuQitFLGlCQUFTLENBQUNNLEtBQUssQ0FBQ3JGLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztVQUFDMkYsVUFBQSxDQUFBakYsSUFBQTtVQUFBLE9BRXZDLElBQUFDLGVBQU8sRUFBQyxZQUFNO1lBQ2xCM0gsTUFBTSxDQUFDZ0gsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUNGLGlCQUFpQixDQUFDLENBQUM7WUFDdkQ5RyxNQUFNLENBQUNtRyxZQUFZLENBQUNuRSxNQUFNLENBQUNnRSxjQUFjLENBQUMsQ0FBQzdGLElBQUksQ0FBQyxJQUFJLENBQUM7VUFDdkQsQ0FBQyxDQUFDO1FBQUE7VUFFRjRMLGlCQUFTLENBQUNNLEtBQUssQ0FBQ3JGLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztVQUFDMkYsVUFBQSxDQUFBakYsSUFBQTtVQUFBLE9BRXRDLElBQUFDLGVBQU8sRUFBQyxZQUFNO1lBQ2xCM0gsTUFBTSxDQUFDbUcsWUFBWSxDQUFDbkUsTUFBTSxDQUFDZ0UsY0FBYyxDQUFDLENBQUM3RixJQUFJLENBQUMsS0FBSyxDQUFDO1VBQ3hELENBQUMsQ0FBQztRQUFBO1FBQUE7VUFBQSxPQUFBd00sVUFBQSxDQUFBL0UsSUFBQTtNQUFBO0lBQUEsR0FBQTZFLFNBQUE7RUFBQSxDQUNILEdBQUM7RUFFRjFNLEVBQUUsQ0FBQyx1RUFBdUUsbUJBQUFtSCxrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQXdGLFVBQUE7SUFBQSxJQUFBQyxTQUFBLEVBQUE3RixXQUFBO0lBQUEsT0FBQUcsWUFBQSxZQUFBSSxJQUFBLFdBQUF1RixVQUFBO01BQUEsa0JBQUFBLFVBQUEsQ0FBQXJGLElBQUEsR0FBQXFGLFVBQUEsQ0FBQXBGLElBQUE7UUFBQTtVQUFBbUYsU0FBQSxHQUNsRCxJQUFBbEcsY0FBTSxlQUFDck0sTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxNQUFBcEosU0FBQSxpQkFBSzJJLFlBQVk7WUFBRUssUUFBUSxFQUFFO1VBQUssRUFBRSxDQUFDLENBQUMsRUFBMUVRLFdBQVcsR0FBQTZGLFNBQUEsQ0FBWDdGLFdBQVc7VUFBQThGLFVBQUEsQ0FBQXBGLElBQUE7VUFBQSxPQUViLElBQUFDLGVBQU8sRUFBQyxZQUFNO1lBQ2xCM0gsTUFBTSxDQUFDZ0gsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUNGLGlCQUFpQixDQUFDLENBQUM7WUFDdEQ5RyxNQUFNLENBQUNtRyxZQUFZLENBQUNuRSxNQUFNLENBQUNnRSxjQUFjLENBQUMsQ0FBQzdGLElBQUksQ0FBQyxJQUFJLENBQUM7VUFDdkQsQ0FBQyxDQUFDO1FBQUE7VUFFRjRMLGlCQUFTLENBQUNNLEtBQUssQ0FBQ3JGLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztVQUFDOEYsVUFBQSxDQUFBcEYsSUFBQTtVQUFBLE9BRXRDLElBQUFDLGVBQU8sRUFBQyxZQUFNO1lBQ2xCM0gsTUFBTSxDQUFDbUcsWUFBWSxDQUFDbkUsTUFBTSxDQUFDZ0UsY0FBYyxDQUFDLENBQUM3RixJQUFJLENBQUMsSUFBSSxDQUFDO1VBQ3ZELENBQUMsQ0FBQztRQUFBO1FBQUE7VUFBQSxPQUFBMk0sVUFBQSxDQUFBbEYsSUFBQTtNQUFBO0lBQUEsR0FBQWdGLFNBQUE7RUFBQSxDQUNILEdBQUM7RUFFRjdNLEVBQUUsQ0FBQyxxREFBcUQsbUJBQUFtSCxrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQTJGLFVBQUE7SUFBQSxJQUFBeEcsZ0JBQUEsRUFBQXZFLE1BQUEsRUFBQWdMLFNBQUEsRUFBQXZOLGFBQUEsRUFBQXdOLFNBQUEsRUFBQW5GLGFBQUE7SUFBQSxPQUFBWCxZQUFBLFlBQUFJLElBQUEsV0FBQTJGLFVBQUE7TUFBQSxrQkFBQUEsVUFBQSxDQUFBekYsSUFBQSxHQUFBeUYsVUFBQSxDQUFBeEYsSUFBQTtRQUFBO1VBQ2xEbkIsZ0JBQWdCLEdBQUd2SixJQUFJLENBQUNVLEVBQUUsQ0FBQyxDQUFDO1VBQzVCc0UsTUFBTSxHQUFHeUQsZ0JBQWdCLENBQUMsQ0FBQztVQUFBdUgsU0FBQSxHQUNQeFMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEVBQTlDaUYsYUFBYSxHQUFBdU4sU0FBQSxDQUFidk4sYUFBYTtVQUFBd04sU0FBQSxHQUNLLElBQUF0RyxjQUFNLGVBQzlCck0sTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxNQUFBcEosU0FBQSxpQkFBSzJJLFlBQVk7WUFBRW5FLE1BQU0sRUFBRUEsTUFBTztZQUFDdUUsZ0JBQWdCLEVBQUVBLGdCQUFpQjtZQUFDQyxRQUFRLEVBQUU7VUFBSyxFQUFFLENBQ3ZHLENBQUMsRUFGT3NCLGFBQWEsR0FBQW1GLFNBQUEsQ0FBYm5GLGFBQWE7VUFBQW9GLFVBQUEsQ0FBQXhGLElBQUE7VUFBQSxPQUlmLElBQUFDLGVBQU8sRUFBQyxZQUFNO1lBQ2xCM0gsTUFBTSxDQUFDOEgsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUNoQixpQkFBaUIsQ0FBQyxDQUFDO1VBQzNELENBQUMsQ0FBQztRQUFBO1VBRUZpRixpQkFBUyxDQUFDTSxLQUFLLENBQUM5RyxRQUFRLENBQUNtRyxJQUFJLENBQUM7VUFBQ3dCLFVBQUEsQ0FBQXhGLElBQUE7VUFBQSxPQUV6QixJQUFBQyxlQUFPLEVBQUMsWUFBTTtZQUNsQjNILE1BQU0sQ0FBQzhILGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDbEUsR0FBRyxDQUFDa0QsaUJBQWlCLENBQUMsQ0FBQztZQUM3RDlHLE1BQU0sQ0FBQ3VHLGdCQUFnQixDQUFDLENBQUM5RCxvQkFBb0IsQ0FBQztjQUFFdEUsS0FBSyxFQUFFO1lBQU0sQ0FBQyxDQUFDO1lBQy9ENkIsTUFBTSxDQUFDUCxhQUFhLENBQUNMLE1BQU0sQ0FBQyxDQUFDcUQsb0JBQW9CLENBQUNULE1BQU0sQ0FBQ0UsS0FBSyxDQUFDeEMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUN0RU0sTUFBTSxDQUFDZ0MsTUFBTSxDQUFDRSxLQUFLLENBQUNOLEVBQUUsQ0FBQ0csWUFBWSxDQUFDLENBQUNXLGdCQUFnQixDQUFDLENBQUM7WUFDdkQxQyxNQUFNLENBQUNnQyxNQUFNLENBQUNDLElBQUksQ0FBQ08sUUFBUSxDQUFDLENBQUNDLG9CQUFvQixDQUFDVCxNQUFNLENBQUNFLEtBQUssQ0FBQ04sRUFBRSxDQUFDO1lBQ2xFNUIsTUFBTSxDQUFDZ0MsTUFBTSxDQUFDWixRQUFRLENBQUMwRSxLQUFLLENBQUMsQ0FBQ3BELGdCQUFnQixDQUFDLENBQUM7WUFDaEQxQyxNQUFNLENBQUNnQyxNQUFNLENBQUNnRSxjQUFjLENBQUMsQ0FBQzdGLElBQUksQ0FBQyxJQUFJLENBQUM7VUFDMUMsQ0FBQyxDQUFDO1FBQUE7UUFBQTtVQUFBLE9BQUErTSxVQUFBLENBQUF0RixJQUFBO01BQUE7SUFBQSxHQUFBbUYsU0FBQTtFQUFBLENBQ0gsR0FBQztFQUVGaE4sRUFBRSxDQUFDLCtDQUErQyxtQkFBQW1ILGtCQUFBLDBCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBRSxTQUFBK0YsVUFBQTtJQUFBLElBQUFDLG1CQUFBLEVBQUFDLHNCQUFBLEVBQUFDLEtBQUEsRUFBQUMsS0FBQSxFQUFBQyxTQUFBLEVBQUFDLFFBQUEsRUFBQUMsZ0JBQUE7SUFBQSxPQUFBdkcsWUFBQSxZQUFBSSxJQUFBLFdBQUFvRyxVQUFBO01BQUEsa0JBQUFBLFVBQUEsQ0FBQWxHLElBQUEsR0FBQWtHLFVBQUEsQ0FBQWpHLElBQUE7UUFBQTtVQUM1QzBGLG1CQUFtQixHQUFHcFEsSUFBSSxDQUFDeUUsS0FBSyxDQUFDOEQsUUFBUSxFQUFFLGtCQUFrQixDQUFDO1VBQzlEOEgsc0JBQXNCLEdBQUdyUSxJQUFJLENBQUN5RSxLQUFLLENBQUM4RCxRQUFRLEVBQUUscUJBQXFCLENBQUM7VUFDcEUrSCxLQUFLLEdBQUc7WUFBRXBILEtBQUssRUFBRTtjQUFFL0gsS0FBSyxFQUFFO1lBQU07VUFBRSxDQUFDO1VBQ25Db1AsS0FBSyxHQUFHO1lBQUVySCxLQUFLLEVBQUU7Y0FBRS9ILEtBQUssRUFBRTtZQUFNO1VBQUUsQ0FBQztVQUFBcVAsU0FBQSxHQUVwQixJQUFBN0csY0FBTSxlQUFDck0sTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxNQUFBcEosU0FBQSxpQkFBSzJJLFlBQVk7WUFBRXRJLElBQUksRUFBRXlQLEtBQU07WUFBQzlHLFFBQVEsRUFBRTtVQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQXBGaUgsUUFBUSxHQUFBRCxTQUFBLENBQVJDLFFBQVE7VUFBQUUsVUFBQSxDQUFBakcsSUFBQTtVQUFBLE9BRVYsSUFBQUMsZUFBTyxFQUFDLFlBQU07WUFDbEIzSCxNQUFNLENBQUNvTixtQkFBbUIsQ0FBQyxDQUFDM0ssb0JBQW9CLENBQUMsT0FBTyxFQUFFekMsTUFBTSxDQUFDaUwsR0FBRyxDQUFDQyxRQUFRLENBQUMsQ0FBQztVQUNqRixDQUFDLENBQUM7UUFBQTtVQUVJd0MsZ0JBQWdCLEdBQUdOLG1CQUFtQixDQUFDblEsSUFBSSxDQUFDc08sS0FBSyxDQUFDNU8sTUFBTTtVQUU5RDhRLFFBQVEsY0FBQ25ULE1BQUEsWUFBQWlELGFBQUEsQ0FBQzdDLEtBQUEsQ0FBQWtNLFlBQVksTUFBQXBKLFNBQUEsaUJBQUsySSxZQUFZO1lBQUV0SSxJQUFJLEVBQUUwUCxLQUFNO1lBQUMvRyxRQUFRLEVBQUU7VUFBSyxFQUFFLENBQUMsQ0FBQztVQUFDbUgsVUFBQSxDQUFBakcsSUFBQTtVQUFBLE9BRXBFLElBQUFDLGVBQU8sRUFBQyxZQUFNO1lBQ2xCM0gsTUFBTSxDQUFDcU4sc0JBQXNCLENBQUMsQ0FBQzNLLGdCQUFnQixDQUFDLENBQUM7WUFDakQxQyxNQUFNLENBQUNvTixtQkFBbUIsQ0FBQ25RLElBQUksQ0FBQ3NPLEtBQUssQ0FBQzVPLE1BQU0sQ0FBQyxDQUFDaVIsZUFBZSxDQUFDRixnQkFBZ0IsQ0FBQztVQUNqRixDQUFDLENBQUM7UUFBQTtVQUVGTixtQkFBbUIsQ0FBQ3pLLFdBQVcsQ0FBQyxDQUFDO1VBQ2pDMEssc0JBQXNCLENBQUMxSyxXQUFXLENBQUMsQ0FBQztRQUFDO1FBQUE7VUFBQSxPQUFBZ0wsVUFBQSxDQUFBL0YsSUFBQTtNQUFBO0lBQUEsR0FBQXVGLFNBQUE7RUFBQSxDQUN0QyxHQUFDO0VBRUZwTixFQUFFLENBQUMsNERBQTRELG1CQUFBbUgsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUF5RyxVQUFBO0lBQUEsSUFBQUMsU0FBQSxFQUFBOUcsV0FBQSxFQUFBYyxhQUFBO0lBQUEsT0FBQVgsWUFBQSxZQUFBSSxJQUFBLFdBQUF3RyxVQUFBO01BQUEsa0JBQUFBLFVBQUEsQ0FBQXRHLElBQUEsR0FBQXNHLFVBQUEsQ0FBQXJHLElBQUE7UUFBQTtVQUFBb0csU0FBQSxHQUN4QixJQUFBbkgsY0FBTSxlQUFDck0sTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxNQUFBcEosU0FBQSxpQkFBSzJJLFlBQVk7WUFBRUssUUFBUSxFQUFFO1VBQUssRUFBRSxDQUFDLENBQUMsRUFBekZRLFdBQVcsR0FBQThHLFNBQUEsQ0FBWDlHLFdBQVcsRUFBRWMsYUFBYSxHQUFBZ0csU0FBQSxDQUFiaEcsYUFBYTtVQUFBaUcsVUFBQSxDQUFBckcsSUFBQTtVQUFBLE9BRTVCLElBQUFDLGVBQU8sRUFBQyxZQUFNO1lBQ2xCM0gsTUFBTSxDQUFDOEgsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUNoQixpQkFBaUIsQ0FBQyxDQUFDO1VBQzNELENBQUMsQ0FBQztRQUFBO1VBRUZpRixpQkFBUyxDQUFDTSxLQUFLLENBQUNyRixXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7VUFBQytHLFVBQUEsQ0FBQXJHLElBQUE7VUFBQSxPQUV2QyxJQUFBQyxlQUFPLEVBQUMsWUFBTTtZQUNsQjNILE1BQU0sQ0FBQzhILGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDaEIsaUJBQWlCLENBQUMsQ0FBQztVQUMzRCxDQUFDLENBQUM7UUFBQTtRQUFBO1VBQUEsT0FBQWlILFVBQUEsQ0FBQW5HLElBQUE7TUFBQTtJQUFBLEdBQUFpRyxTQUFBO0VBQUEsQ0FDSCxHQUFDO0VBRUYvTixRQUFRLENBQUMscUNBQXFDLEVBQUUsWUFBTTtJQUNwRCxJQUFJa08sVUFBVTtJQUVkNUgsVUFBVSxDQUFDLFlBQU07TUFDZixJQUFJNkgsU0FBUyxHQUFHLElBQUk7TUFDcEJELFVBQVUsR0FBR2hSLElBQUksQ0FBQ3lFLEtBQUssQ0FBQ3lNLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQzVILGtCQUFrQixDQUFDO1FBQUEsT0FBTTJILFNBQVMsRUFBRTtNQUFBLEVBQUM7SUFDNUUsQ0FBQyxDQUFDO0lBRUZFLFNBQVMsQ0FBQyxZQUFNO01BQ2RILFVBQVUsQ0FBQ3JMLFdBQVcsQ0FBQyxDQUFDO0lBQzFCLENBQUMsQ0FBQzs7SUFFRjtJQUNBO0lBQ0E1QyxFQUFFLENBQUMsb0RBQW9ELEVBQUUsWUFBTTtNQUM3RCxJQUFBcU8sU0FBQSxHQUF3QixJQUFBekgsY0FBTSxlQUFDck0sTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxFQUFLVCxZQUFlLENBQUMsQ0FBQztRQUExRGEsV0FBVyxHQUFBb0gsU0FBQSxDQUFYcEgsV0FBVztNQUNuQixJQUFNOUgsT0FBTyxHQUFHOEgsV0FBVyxDQUFDLG1CQUFtQixDQUFDO01BRWhEaEgsTUFBTSxDQUFDYyxLQUFLLENBQUM0RCxJQUFJLENBQUN4RixPQUFPLENBQUNtUCxTQUFTLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLFVBQUNDLENBQUM7UUFBQSxPQUFLLGlCQUFpQixDQUFDQyxJQUFJLENBQUNELENBQUMsQ0FBQztNQUFBLEVBQUMsQ0FBQyxDQUFDcE8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUN6RixDQUFDLENBQUM7SUFFRkosRUFBRSxDQUFDLHlEQUF5RCxFQUFFLFlBQU07TUFDbEUsSUFBQTBPLFNBQUEsR0FBMkIsSUFBQTlILGNBQU0sZUFDL0JyTSxNQUFBLFlBQUFpRCxhQUFBLENBQUFqRCxNQUFBLFlBQUFvVSxRQUFBLHFCQUNFcFUsTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxFQUFLVCxZQUFlLENBQUMsZUFDbEM3TCxNQUFBLFlBQUFpRCxhQUFBLENBQUM3QyxLQUFBLENBQUFrTSxZQUFZLE1BQUFwSixTQUFBLGlCQUFLMkksWUFBWTtVQUFFdEksSUFBSSxFQUFFO1lBQUVxSSxLQUFLLEVBQUU7Y0FBRS9ILEtBQUssRUFBRTtZQUFNO1VBQUU7UUFBRSxFQUFFLENBQ3BFLENBQ0osQ0FBQztRQUxPd1EsY0FBYyxHQUFBRixTQUFBLENBQWRFLGNBQWM7TUFPdEIsSUFBTUMsUUFBUSxHQUFHRCxjQUFjLENBQUMsbUJBQW1CLENBQUM7TUFDcEQsSUFBTUUsYUFBYSxHQUFHLFNBQWhCQSxhQUFhQSxDQUFJQyxFQUFFO1FBQUEsT0FBS2hPLEtBQUssQ0FBQzRELElBQUksQ0FBQ29LLEVBQUUsQ0FBQ1QsU0FBUyxDQUFDLENBQUNVLElBQUksQ0FBQyxVQUFDUixDQUFDO1VBQUEsT0FBS0EsQ0FBQyxDQUFDUyxVQUFVLENBQUMsWUFBWSxDQUFDO1FBQUEsRUFBQztNQUFBO01BRTlGaFAsTUFBTSxDQUFDNk8sYUFBYSxDQUFDRCxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDek8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO01BQ3pESCxNQUFNLENBQUM2TyxhQUFhLENBQUNELFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUN6TyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7TUFDekQ7TUFDQUgsTUFBTSxDQUFDNk8sYUFBYSxDQUFDRCxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDaEwsR0FBRyxDQUFDekQsSUFBSSxDQUFDME8sYUFBYSxDQUFDRCxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDLENBQUM7SUFFRjdPLEVBQUUsQ0FBQyxvREFBb0QsbUJBQUFtSCxrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQTZILFVBQUE7TUFBQSxJQUFBMUksZ0JBQUEsRUFBQTJJLE9BQUEsRUFBQUMsT0FBQSxFQUFBQyxTQUFBLEVBQUFULGNBQUEsRUFBQVUsZ0JBQUEsRUFBQUMsYUFBQTtNQUFBLE9BQUFuSSxZQUFBLFlBQUFJLElBQUEsV0FBQWdJLFVBQUE7UUFBQSxrQkFBQUEsVUFBQSxDQUFBOUgsSUFBQSxHQUFBOEgsVUFBQSxDQUFBN0gsSUFBQTtVQUFBO1lBQ2pEbkIsZ0JBQWdCLEdBQUd2SixJQUFJLENBQUNVLEVBQUUsQ0FBQyxDQUFDO1lBQzVCd1IsT0FBTyxHQUFHekosZ0JBQWdCLENBQUMsQ0FBQztZQUM1QjBKLE9BQU8sR0FBRzFKLGdCQUFnQixDQUFDLENBQUM7WUFBQTJKLFNBQUEsR0FFVyxJQUFBekksY0FBTSxlQUNqRHJNLE1BQUEsWUFBQWlELGFBQUEsQ0FBQWpELE1BQUEsWUFBQW9VLFFBQUEscUJBQ0VwVSxNQUFBLFlBQUFpRCxhQUFBLENBQUM3QyxLQUFBLENBQUFrTSxZQUFZLE1BQUFwSixTQUFBLGlCQUFLMkksWUFBWTtjQUFFbkUsTUFBTSxFQUFFa04sT0FBUTtjQUFDM0ksZ0JBQWdCLEVBQUVBLGdCQUFpQjtjQUFDQyxRQUFRLEVBQUU7WUFBTSxFQUFFLENBQUMsZUFDeEdsTSxNQUFBLFlBQUFpRCxhQUFBLENBQUM3QyxLQUFBLENBQUFrTSxZQUFZLE1BQUFwSixTQUFBLGlCQUFLMkksWUFBWTtjQUFFbkUsTUFBTSxFQUFFbU4sT0FBUTtjQUFDdFIsSUFBSSxFQUFFO2dCQUFFcUksS0FBSyxFQUFFO2tCQUFFL0gsS0FBSyxFQUFFO2dCQUFNO2NBQUUsQ0FBRTtjQUFDcUksUUFBUSxFQUFFO1lBQU0sRUFBRSxDQUN0RyxDQUNKLENBQUMsRUFMT21JLGNBQWMsR0FBQVMsU0FBQSxDQUFkVCxjQUFjLEVBQUVVLGdCQUFnQixHQUFBRCxTQUFBLENBQWhCQyxnQkFBZ0I7WUFPeEN0RCxpQkFBUyxDQUFDTSxLQUFLLENBQUNzQyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBQ1ksVUFBQSxDQUFBN0gsSUFBQTtZQUFBLE9BRTdDLElBQUFDLGVBQU8sRUFBQyxZQUFNO2NBQ2xCM0gsTUFBTSxDQUFDcVAsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQ3JPLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDMUQsQ0FBQyxDQUFDO1VBQUE7WUFFSXNPLGFBQWEsR0FBR1gsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RDVDLGlCQUFTLENBQUNNLEtBQUssQ0FBQ2lELGFBQWEsQ0FBQztZQUFDQyxVQUFBLENBQUE3SCxJQUFBO1lBQUEsT0FFekIsSUFBQUMsZUFBTyxFQUFDLFlBQU07Y0FDbEIzSCxNQUFNLENBQUNxUCxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDck8sWUFBWSxDQUFDLENBQUMsQ0FBQztjQUN4RGhCLE1BQU0sQ0FBQ3VHLGdCQUFnQixDQUFDLENBQUM5RCxvQkFBb0IsQ0FBQztnQkFBRXRFLEtBQUssRUFBRTtjQUFNLENBQUMsQ0FBQztjQUMvRDZCLE1BQU0sQ0FBQ2tQLE9BQU8sQ0FBQ2xKLGNBQWMsQ0FBQyxDQUFDN0YsSUFBSSxDQUFDLEtBQUssQ0FBQztjQUMxQ0gsTUFBTSxDQUFDMk8sY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNhLFdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDNUQsQ0FBQyxDQUFDO1VBQUE7VUFBQTtZQUFBLE9BQUFELFVBQUEsQ0FBQTNILElBQUE7UUFBQTtNQUFBLEdBQUFxSCxTQUFBO0lBQUEsQ0FDSCxHQUFDO0VBQ0osQ0FBQyxDQUFDO0VBRUZuUCxRQUFRLENBQUMsK0JBQStCLEVBQUUsWUFBTTtJQUM5Q0MsRUFBRSxDQUFDLDRGQUE0RixtQkFBQW1ILGtCQUFBLDBCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBRSxTQUFBcUksVUFBQTtNQUFBLElBQUFDLFNBQUEsRUFBQTVILGFBQUEsRUFBQTJGLFFBQUE7TUFBQSxPQUFBdEcsWUFBQSxZQUFBSSxJQUFBLFdBQUFvSSxVQUFBO1FBQUEsa0JBQUFBLFVBQUEsQ0FBQWxJLElBQUEsR0FBQWtJLFVBQUEsQ0FBQWpJLElBQUE7VUFBQTtZQUFBZ0ksU0FBQSxHQUMzRCxJQUFBL0ksY0FBTSxlQUFDck0sTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxNQUFBcEosU0FBQSxpQkFBSzJJLFlBQVk7Y0FBRUssUUFBUSxFQUFFO1lBQU0sRUFBRSxDQUFDLENBQUMsRUFBdkZzQixhQUFhLEdBQUE0SCxTQUFBLENBQWI1SCxhQUFhLEVBQUUyRixRQUFRLEdBQUFpQyxTQUFBLENBQVJqQyxRQUFRO1lBQy9Cek4sTUFBTSxDQUFDOEgsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUNsRSxHQUFHLENBQUNrRCxpQkFBaUIsQ0FBQyxDQUFDO1lBRTdEMkcsUUFBUSxjQUFDblQsTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxNQUFBcEosU0FBQSxpQkFBSzJJLFlBQVk7Y0FBRUssUUFBUSxFQUFFO1lBQUssRUFBRSxDQUFDLENBQUM7WUFBQ21KLFVBQUEsQ0FBQWpJLElBQUE7WUFBQSxPQUN2RCxJQUFBQyxlQUFPLEVBQUMsWUFBTTtjQUNsQjNILE1BQU0sQ0FBQzhILGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDaEIsaUJBQWlCLENBQUMsQ0FBQztZQUMzRCxDQUFDLENBQUM7VUFBQTtVQUFBO1lBQUEsT0FBQTZJLFVBQUEsQ0FBQS9ILElBQUE7UUFBQTtNQUFBLEdBQUE2SCxTQUFBO0lBQUEsQ0FDSCxHQUFDO0lBRUYxUCxFQUFFLENBQUMsK0dBQStHLG1CQUFBbUgsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUF3SSxVQUFBO01BQUEsSUFBQTVOLE1BQUEsRUFBQTZOLFNBQUEsRUFBQS9ILGFBQUEsRUFBQTJGLFFBQUE7TUFBQSxPQUFBdEcsWUFBQSxZQUFBSSxJQUFBLFdBQUF1SSxVQUFBO1FBQUEsa0JBQUFBLFVBQUEsQ0FBQXJJLElBQUEsR0FBQXFJLFVBQUEsQ0FBQXBJLElBQUE7VUFBQTtZQUM1RzFGLE1BQU0sR0FBQXZGLGFBQUEsQ0FBQUEsYUFBQSxLQUNQMEosWUFBWSxDQUFDbkUsTUFBTTtjQUN0QkUsS0FBSyxFQUFBekYsYUFBQSxDQUFBQSxhQUFBLEtBQ0EwSixZQUFZLENBQUNuRSxNQUFNLENBQUNFLEtBQUs7Z0JBQzVCSSxTQUFTLEVBQUU7a0JBQUVvQyxJQUFJLEVBQUUsQ0FBQztrQkFBRWdCLEVBQUUsRUFBRTtnQkFBSSxDQUFDLENBQUU7Y0FBQTtZQUNsQztZQUFBbUssU0FBQSxHQUdpQyxJQUFBbEosY0FBTSxlQUFDck0sTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxNQUFBcEosU0FBQSxpQkFBSzJJLFlBQVk7Y0FBRW5FLE1BQU0sRUFBRUEsTUFBTztjQUFDd0UsUUFBUSxFQUFFO1lBQU0sRUFBRSxDQUFDLENBQUMsRUFBdkdzQixhQUFhLEdBQUErSCxTQUFBLENBQWIvSCxhQUFhLEVBQUUyRixRQUFRLEdBQUFvQyxTQUFBLENBQVJwQyxRQUFRO1lBQy9CQSxRQUFRLGNBQUNuVCxNQUFBLFlBQUFpRCxhQUFBLENBQUM3QyxLQUFBLENBQUFrTSxZQUFZLE1BQUFwSixTQUFBLGlCQUFLMkksWUFBWTtjQUFFbkUsTUFBTSxFQUFFQSxNQUFPO2NBQUN3RSxRQUFRLEVBQUU7WUFBSyxFQUFFLENBQUMsQ0FBQztZQUFDc0osVUFBQSxDQUFBcEksSUFBQTtZQUFBLE9BRXZFLElBQUEwQyxXQUFHLG1CQUFBbEQsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFDLFNBQUEySSxVQUFBO2NBQUEsT0FBQTVJLFlBQUEsWUFBQUksSUFBQSxXQUFBeUksVUFBQTtnQkFBQSxrQkFBQUEsVUFBQSxDQUFBdkksSUFBQSxHQUFBdUksVUFBQSxDQUFBdEksSUFBQTtrQkFBQTtrQkFBQTtvQkFBQSxPQUFBc0ksVUFBQSxDQUFBcEksSUFBQTtnQkFBQTtjQUFBLEdBQUFtSSxTQUFBO1lBQUEsQ0FBYyxHQUFDO1VBQUE7WUFDekIvUCxNQUFNLENBQUM4SCxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQ2xFLEdBQUcsQ0FBQ2tELGlCQUFpQixDQUFDLENBQUM7VUFBQztVQUFBO1lBQUEsT0FBQWdKLFVBQUEsQ0FBQWxJLElBQUE7UUFBQTtNQUFBLEdBQUFnSSxTQUFBO0lBQUEsQ0FDL0QsR0FBQztJQUVGN1AsRUFBRSxDQUFDLG9HQUFvRyxtQkFBQW1ILGtCQUFBLDBCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBRSxTQUFBNkksVUFBQTtNQUFBLElBQUFqTyxNQUFBLEVBQUFrTyxTQUFBLEVBQUFwSSxhQUFBLEVBQUEyRixRQUFBO01BQUEsT0FBQXRHLFlBQUEsWUFBQUksSUFBQSxXQUFBNEksVUFBQTtRQUFBLGtCQUFBQSxVQUFBLENBQUExSSxJQUFBLEdBQUEwSSxVQUFBLENBQUF6SSxJQUFBO1VBQUE7WUFDakcxRixNQUFNLEdBQUF2RixhQUFBLENBQUFBLGFBQUEsS0FDUDBKLFlBQVksQ0FBQ25FLE1BQU07Y0FDdEJFLEtBQUssRUFBQXpGLGFBQUEsQ0FBQUEsYUFBQSxLQUNBMEosWUFBWSxDQUFDbkUsTUFBTSxDQUFDRSxLQUFLO2dCQUM1QkksU0FBUyxFQUFFO2tCQUFFb0MsSUFBSSxFQUFFLENBQUM7a0JBQUVnQixFQUFFLEVBQUUsQ0FBQztrQkFBRTdILElBQUksRUFBRTtvQkFBRStCLElBQUksRUFBRTtzQkFBRU0sSUFBSSxFQUFFO29CQUFRO2tCQUFFO2dCQUFFO2NBQUM7WUFDakU7WUFBQWdRLFNBQUEsR0FHaUMsSUFBQXZKLGNBQU0sZUFBQ3JNLE1BQUEsWUFBQWlELGFBQUEsQ0FBQzdDLEtBQUEsQ0FBQWtNLFlBQVksTUFBQXBKLFNBQUEsaUJBQUsySSxZQUFZO2NBQUVuRSxNQUFNLEVBQUVBLE1BQU87Y0FBQ3dFLFFBQVEsRUFBRTtZQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQXZHc0IsYUFBYSxHQUFBb0ksU0FBQSxDQUFicEksYUFBYSxFQUFFMkYsUUFBUSxHQUFBeUMsU0FBQSxDQUFSekMsUUFBUTtZQUMvQkEsUUFBUSxjQUFDblQsTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxNQUFBcEosU0FBQSxpQkFBSzJJLFlBQVk7Y0FBRW5FLE1BQU0sRUFBRUEsTUFBTztjQUFDd0UsUUFBUSxFQUFFO1lBQUssRUFBRSxDQUFDLENBQUM7WUFBQzJKLFVBQUEsQ0FBQXpJLElBQUE7WUFBQSxPQUV2RSxJQUFBMEMsV0FBRyxtQkFBQWxELGtCQUFBLDBCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBQyxTQUFBZ0osVUFBQTtjQUFBLE9BQUFqSixZQUFBLFlBQUFJLElBQUEsV0FBQThJLFVBQUE7Z0JBQUEsa0JBQUFBLFVBQUEsQ0FBQTVJLElBQUEsR0FBQTRJLFVBQUEsQ0FBQTNJLElBQUE7a0JBQUE7a0JBQUE7b0JBQUEsT0FBQTJJLFVBQUEsQ0FBQXpJLElBQUE7Z0JBQUE7Y0FBQSxHQUFBd0ksU0FBQTtZQUFBLENBQWMsR0FBQztVQUFBO1lBQ3pCcFEsTUFBTSxDQUFDOEgsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUNsRSxHQUFHLENBQUNrRCxpQkFBaUIsQ0FBQyxDQUFDO1VBQUM7VUFBQTtZQUFBLE9BQUFxSixVQUFBLENBQUF2SSxJQUFBO1FBQUE7TUFBQSxHQUFBcUksU0FBQTtJQUFBLENBQy9ELEdBQUM7RUFDSixDQUFDLENBQUM7RUFFRmxRLEVBQUUsQ0FBQywrREFBK0QsbUJBQUFtSCxrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQWtKLFVBQUE7SUFBQSxJQUFBQyxTQUFBLEVBQUF6SSxhQUFBLEVBQUEwSSxRQUFBO0lBQUEsT0FBQXJKLFlBQUEsWUFBQUksSUFBQSxXQUFBa0osVUFBQTtNQUFBLGtCQUFBQSxVQUFBLENBQUFoSixJQUFBLEdBQUFnSixVQUFBLENBQUEvSSxJQUFBO1FBQUE7VUFBQTZJLFNBQUEsR0FDeEMsSUFBQTVKLGNBQU0sZUFBQ3JNLE1BQUEsWUFBQWlELGFBQUEsQ0FBQzdDLEtBQUEsQ0FBQWtNLFlBQVksTUFBQXBKLFNBQUEsaUJBQUsySSxZQUFZO1lBQUVLLFFBQVEsRUFBRTtVQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQTVFc0IsYUFBYSxHQUFBeUksU0FBQSxDQUFiekksYUFBYTtVQUFBMkksVUFBQSxDQUFBL0ksSUFBQTtVQUFBLE9BRWYsSUFBQUMsZUFBTyxFQUFDLFlBQU07WUFDbEIzSCxNQUFNLENBQUM4SCxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQ2hCLGlCQUFpQixDQUFDLENBQUM7VUFDM0QsQ0FBQyxDQUFDO1FBQUE7VUFFRjtVQUNNMEosUUFBUSxHQUFHakwsUUFBUSxDQUFDaEksYUFBYSxDQUFDLEtBQUssQ0FBQztVQUM5Q2lULFFBQVEsQ0FBQ0UsRUFBRSxHQUFHLGdDQUFnQztVQUM5Q25MLFFBQVEsQ0FBQ21HLElBQUksQ0FBQ2lGLFdBQVcsQ0FBQ0gsUUFBUSxDQUFDO1VBRW5DekUsaUJBQVMsQ0FBQ00sS0FBSyxDQUFDbUUsUUFBUSxDQUFDO1VBQUNDLFVBQUEsQ0FBQS9JLElBQUE7VUFBQSxPQUVwQixJQUFBQyxlQUFPLEVBQUMsWUFBTTtZQUNsQjNILE1BQU0sQ0FBQzhILGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDaEIsaUJBQWlCLENBQUMsQ0FBQztVQUMzRCxDQUFDLENBQUM7UUFBQTtVQUVGdkIsUUFBUSxDQUFDbUcsSUFBSSxDQUFDa0YsV0FBVyxDQUFDSixRQUFRLENBQUM7UUFBQztRQUFBO1VBQUEsT0FBQUMsVUFBQSxDQUFBN0ksSUFBQTtNQUFBO0lBQUEsR0FBQTBJLFNBQUE7RUFBQSxDQUNyQyxHQUFDO0VBRUZ2USxFQUFFLENBQUMsMEJBQTBCLEVBQUUsWUFBTTtJQUNuQyxJQUFNOFEsa0JBQWtCLEdBQUc7TUFBRTNLLEtBQUssRUFBRTtRQUFFL0gsS0FBSyxFQUFFO01BQUc7SUFBRSxDQUFDO0lBQ25ELElBQUEyUyxTQUFBLEdBQXdCLElBQUFuSyxjQUFNLGVBQUNyTSxNQUFBLFlBQUFpRCxhQUFBLENBQUM3QyxLQUFBLENBQUFrTSxZQUFZLE1BQUFwSixTQUFBLGlCQUFLMkksWUFBWTtRQUFFdEksSUFBSSxFQUFFZ1Q7TUFBbUIsRUFBRSxDQUFDLENBQUM7TUFBcEY3SixXQUFXLEdBQUE4SixTQUFBLENBQVg5SixXQUFXO0lBQ25CaEgsTUFBTSxDQUFDZ0gsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUNGLGlCQUFpQixDQUFDLENBQUM7RUFDekQsQ0FBQyxDQUFDO0VBRUYvRyxFQUFFLENBQUMsd0NBQXdDLEVBQUUsWUFBTTtJQUNqRCxJQUFBZ1IsU0FBQSxHQUF3QixJQUFBcEssY0FBTSxlQUFDck0sTUFBQSxZQUFBaUQsYUFBQSxDQUFDN0MsS0FBQSxDQUFBa00sWUFBWSxFQUFLVCxZQUFlLENBQUMsQ0FBQztNQUExRGEsV0FBVyxHQUFBK0osU0FBQSxDQUFYL0osV0FBVztJQUNuQixJQUFNOUgsT0FBTyxHQUFHOEgsV0FBVyxDQUFDLG1CQUFtQixDQUFDO0lBQ2hEaEgsTUFBTSxDQUFDZCxPQUFPLENBQUMsQ0FBQzhSLFdBQVcsQ0FBQztNQUFFQyxPQUFPLEVBQUUsYUFBYTtNQUFFQyxNQUFNLEVBQUU7SUFBVSxDQUFDLENBQUM7RUFDNUUsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119