@pie-lib/editable-html-tip-tap 1.2.0-next.2 → 1.2.0-next.5

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 (89) hide show
  1. package/CHANGELOG.md +31 -27
  2. package/LICENSE.md +5 -0
  3. package/lib/components/CharacterPicker.js +1 -1
  4. package/lib/components/CharacterPicker.js.map +1 -1
  5. package/lib/components/EditableHtml.js +1 -1
  6. package/lib/components/EditableHtml.js.map +1 -1
  7. package/lib/components/MenuBar.js +1 -1
  8. package/lib/components/MenuBar.js.map +1 -1
  9. package/lib/components/TiptapContainer.js +1 -1
  10. package/lib/components/TiptapContainer.js.map +1 -1
  11. package/lib/components/characters/characterUtils.js +1 -1
  12. package/lib/components/characters/custom-popper.js +1 -1
  13. package/lib/components/common/done-button.js +1 -1
  14. package/lib/components/common/toolbar-buttons.js +1 -1
  15. package/lib/components/icons/CssIcon.js +1 -1
  16. package/lib/components/icons/RespArea.js +1 -1
  17. package/lib/components/icons/TableIcons.js +1 -1
  18. package/lib/components/icons/TextAlign.js +1 -1
  19. package/lib/components/image/AltDialog.js +1 -1
  20. package/lib/components/image/ImageToolbar.js +1 -1
  21. package/lib/components/image/InsertImageHandler.js +1 -1
  22. package/lib/components/media/MediaDialog.js +1 -1
  23. package/lib/components/media/MediaToolbar.js +1 -1
  24. package/lib/components/media/MediaWrapper.js +1 -1
  25. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js +1 -1
  26. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js.map +1 -1
  27. package/lib/components/respArea/DragInTheBlank/choice.js +1 -1
  28. package/lib/components/respArea/ExplicitConstructedResponse.js +1 -1
  29. package/lib/components/respArea/InlineDropdown.js +1 -1
  30. package/lib/components/respArea/ToolbarIcon.js +1 -1
  31. package/lib/constants.js +1 -1
  32. package/lib/extensions/css.js +1 -1
  33. package/lib/extensions/custom-toolbar-wrapper.js +1 -1
  34. package/lib/extensions/extended-table.js +1 -1
  35. package/lib/extensions/image-component.js +1 -1
  36. package/lib/extensions/image-component.js.map +1 -1
  37. package/lib/extensions/image.js +1 -1
  38. package/lib/extensions/index.js +4 -2
  39. package/lib/extensions/index.js.map +1 -1
  40. package/lib/extensions/math.js +1 -1
  41. package/lib/extensions/media.js +15 -12
  42. package/lib/extensions/media.js.map +1 -1
  43. package/lib/extensions/responseArea.js +1 -1
  44. package/lib/index.js +1 -1
  45. package/lib/styles/editorContainerStyles.js +1 -1
  46. package/lib/theme.js +1 -1
  47. package/lib/utils/size.js +1 -1
  48. package/package.json +7 -7
  49. package/src/components/EditableHtml.jsx +4 -2
  50. package/src/extensions/__tests__/media-node-view.test.jsx +296 -0
  51. package/src/extensions/__tests__/media.test.js +1 -0
  52. package/src/extensions/index.js +2 -0
  53. package/src/extensions/media.js +17 -14
  54. package/lib/__tests__/EditableHtml.test.js +0 -377
  55. package/lib/__tests__/constants.test.js +0 -21
  56. package/lib/__tests__/extensions.test.js +0 -209
  57. package/lib/__tests__/index.test.js +0 -235
  58. package/lib/__tests__/size-utils.test.js +0 -57
  59. package/lib/__tests__/theme.test.js +0 -17
  60. package/lib/components/__tests__/AltDialog.test.js +0 -201
  61. package/lib/components/__tests__/CharacterPicker.test.js +0 -305
  62. package/lib/components/__tests__/CssIcon.test.js +0 -58
  63. package/lib/components/__tests__/DragInTheBlank.test.js +0 -295
  64. package/lib/components/__tests__/ExplicitConstructedResponse.test.js +0 -253
  65. package/lib/components/__tests__/ImageToolbar.test.js +0 -185
  66. package/lib/components/__tests__/InlineDropdown.test.js +0 -287
  67. package/lib/components/__tests__/InsertImageHandler.test.js +0 -162
  68. package/lib/components/__tests__/MediaDialog.test.js +0 -433
  69. package/lib/components/__tests__/MediaToolbar.test.js +0 -126
  70. package/lib/components/__tests__/MediaWrapper.test.js +0 -96
  71. package/lib/components/__tests__/MenuBar.test.js +0 -459
  72. package/lib/components/__tests__/RespArea.test.js +0 -171
  73. package/lib/components/__tests__/TableIcons.test.js +0 -153
  74. package/lib/components/__tests__/TextAlign.test.js +0 -209
  75. package/lib/components/__tests__/TiptapContainer.test.js +0 -196
  76. package/lib/components/__tests__/characterUtils.test.js +0 -178
  77. package/lib/components/__tests__/choice.test.js +0 -213
  78. package/lib/components/__tests__/custom-popper.test.js +0 -108
  79. package/lib/components/__tests__/done-button.test.js +0 -72
  80. package/lib/components/__tests__/toolbar-buttons.test.js +0 -277
  81. package/lib/extensions/__tests__/component.test.js +0 -314
  82. package/lib/extensions/__tests__/css.test.js +0 -214
  83. package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +0 -175
  84. package/lib/extensions/__tests__/extended-table.test.js +0 -92
  85. package/lib/extensions/__tests__/image-component.test.js +0 -305
  86. package/lib/extensions/__tests__/image.test.js +0 -164
  87. package/lib/extensions/__tests__/media.test.js +0 -292
  88. package/lib/extensions/__tests__/responseArea.test.js +0 -330
  89. package/lib/extensions/component.js +0 -305
@@ -1,277 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _react = _interopRequireDefault(require("react"));
5
- var _react2 = require("@testing-library/react");
6
- var _toolbarButtons = require("../common/toolbar-buttons");
7
- describe('RawButton', function () {
8
- it('renders without crashing', function () {
9
- var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
10
- onClick: jest.fn()
11
- }, "Click me")),
12
- container = _render.container;
13
- expect(container).toBeInTheDocument();
14
- });
15
- it('renders children', function () {
16
- var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
17
- onClick: jest.fn()
18
- }, "Test Button")),
19
- getByText = _render2.getByText;
20
- expect(getByText('Test Button')).toBeInTheDocument();
21
- });
22
- it('calls onClick on mouse down', function () {
23
- var onClick = jest.fn();
24
- var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
25
- onClick: onClick
26
- }, "Click")),
27
- getByText = _render3.getByText;
28
- _react2.fireEvent.mouseDown(getByText('Click'));
29
- expect(onClick).toHaveBeenCalled();
30
- });
31
- it('prevents default on mouse down', function () {
32
- var onClick = jest.fn();
33
- var _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
34
- onClick: onClick
35
- }, "Click")),
36
- getByText = _render4.getByText;
37
- var button = getByText('Click');
38
- var event = new MouseEvent('mousedown', {
39
- bubbles: true,
40
- cancelable: true
41
- });
42
- var preventDefaultSpy = jest.spyOn(event, 'preventDefault');
43
- button.dispatchEvent(event);
44
- expect(preventDefaultSpy).toHaveBeenCalled();
45
- });
46
- it('calls onClick on Enter key press', function () {
47
- var onClick = jest.fn();
48
- var _render5 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
49
- onClick: onClick
50
- }, "Click")),
51
- getByText = _render5.getByText;
52
- _react2.fireEvent.keyDown(getByText('Click'), {
53
- key: 'Enter'
54
- });
55
- expect(onClick).toHaveBeenCalled();
56
- });
57
- it('calls onClick on Space key press', function () {
58
- var onClick = jest.fn();
59
- var _render6 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
60
- onClick: onClick
61
- }, "Click")),
62
- getByText = _render6.getByText;
63
- _react2.fireEvent.keyDown(getByText('Click'), {
64
- key: ' '
65
- });
66
- expect(onClick).toHaveBeenCalled();
67
- });
68
- it('does not call onClick on other key press', function () {
69
- var onClick = jest.fn();
70
- var _render7 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
71
- onClick: onClick
72
- }, "Click")),
73
- getByText = _render7.getByText;
74
- _react2.fireEvent.keyDown(getByText('Click'), {
75
- key: 'a'
76
- });
77
- expect(onClick).not.toHaveBeenCalled();
78
- });
79
- it('applies active style when active is true', function () {
80
- var _render8 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
81
- onClick: jest.fn(),
82
- active: true
83
- }, "Active")),
84
- getByText = _render8.getByText;
85
- var button = getByText('Active');
86
- expect(button).toHaveStyle({
87
- color: 'black'
88
- });
89
- });
90
- it('applies disabled style when disabled is true', function () {
91
- var _render9 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
92
- onClick: jest.fn(),
93
- disabled: true
94
- }, "Disabled")),
95
- getByText = _render9.getByText;
96
- var button = getByText('Disabled');
97
- expect(button).toHaveStyle({
98
- cursor: 'not-allowed'
99
- });
100
- });
101
- it('applies extraStyles when provided', function () {
102
- var extraStyles = {
103
- backgroundColor: 'red'
104
- };
105
- var _render0 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
106
- onClick: jest.fn(),
107
- extraStyles: extraStyles
108
- }, "Styled")),
109
- getByText = _render0.getByText;
110
- var button = getByText('Styled');
111
- expect(button).toHaveStyle({
112
- backgroundColor: 'red'
113
- });
114
- });
115
- it('has aria-label when provided', function () {
116
- var _render1 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
117
- onClick: jest.fn(),
118
- ariaLabel: "Test Button"
119
- }, "Button")),
120
- getByLabelText = _render1.getByLabelText;
121
- expect(getByLabelText('Test Button')).toBeInTheDocument();
122
- });
123
- it('has aria-pressed attribute', function () {
124
- var _render10 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
125
- onClick: jest.fn(),
126
- active: true
127
- }, "Button")),
128
- getByText = _render10.getByText;
129
- expect(getByText('Button')).toHaveAttribute('aria-pressed', 'true');
130
- });
131
- it('is focusable with tabIndex', function () {
132
- var _render11 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
133
- onClick: jest.fn()
134
- }, "Button")),
135
- getByText = _render11.getByText;
136
- expect(getByText('Button')).toHaveAttribute('tabIndex', '0');
137
- });
138
- });
139
- describe('Button', function () {
140
- it('is the same as RawButton', function () {
141
- expect(_toolbarButtons.Button).toBe(_toolbarButtons.RawButton);
142
- });
143
- });
144
- describe('RawMarkButton', function () {
145
- it('renders without crashing', function () {
146
- var _render12 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
147
- onToggle: jest.fn(),
148
- mark: "bold",
149
- label: "Bold"
150
- }, "B")),
151
- container = _render12.container;
152
- expect(container).toBeInTheDocument();
153
- });
154
- it('renders children', function () {
155
- var _render13 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
156
- onToggle: jest.fn(),
157
- mark: "bold",
158
- label: "Bold"
159
- }, "Bold")),
160
- getByText = _render13.getByText;
161
- expect(getByText('Bold')).toBeInTheDocument();
162
- });
163
- it('calls onToggle with mark on mouse down', function () {
164
- var onToggle = jest.fn();
165
- var _render14 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
166
- onToggle: onToggle,
167
- mark: "italic",
168
- label: "Italic"
169
- }, "I")),
170
- getByText = _render14.getByText;
171
- _react2.fireEvent.mouseDown(getByText('I'));
172
- expect(onToggle).toHaveBeenCalledWith('italic');
173
- });
174
- it('prevents default on mouse down', function () {
175
- var onToggle = jest.fn();
176
- var _render15 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
177
- onToggle: onToggle,
178
- mark: "bold",
179
- label: "Bold"
180
- }, "B")),
181
- getByText = _render15.getByText;
182
- var button = getByText('B');
183
- var event = new MouseEvent('mousedown', {
184
- bubbles: true,
185
- cancelable: true
186
- });
187
- var preventDefaultSpy = jest.spyOn(event, 'preventDefault');
188
- button.dispatchEvent(event);
189
- expect(preventDefaultSpy).toHaveBeenCalled();
190
- });
191
- it('calls onToggle on Enter key press', function () {
192
- var onToggle = jest.fn();
193
- var _render16 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
194
- onToggle: onToggle,
195
- mark: "underline",
196
- label: "Underline"
197
- }, "U")),
198
- getByText = _render16.getByText;
199
- _react2.fireEvent.keyDown(getByText('U'), {
200
- key: 'Enter'
201
- });
202
- expect(onToggle).toHaveBeenCalledWith('underline');
203
- });
204
- it('calls onToggle on Space key press', function () {
205
- var onToggle = jest.fn();
206
- var _render17 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
207
- onToggle: onToggle,
208
- mark: "strike",
209
- label: "Strike"
210
- }, "S")),
211
- getByText = _render17.getByText;
212
- _react2.fireEvent.keyDown(getByText('S'), {
213
- key: ' '
214
- });
215
- expect(onToggle).toHaveBeenCalledWith('strike');
216
- });
217
- it('does not call onToggle on other key press', function () {
218
- var onToggle = jest.fn();
219
- var _render18 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
220
- onToggle: onToggle,
221
- mark: "bold",
222
- label: "Bold"
223
- }, "B")),
224
- getByText = _render18.getByText;
225
- _react2.fireEvent.keyDown(getByText('B'), {
226
- key: 'a'
227
- });
228
- expect(onToggle).not.toHaveBeenCalled();
229
- });
230
- it('applies active style when active is true', function () {
231
- var _render19 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
232
- onToggle: jest.fn(),
233
- mark: "bold",
234
- label: "Bold",
235
- active: true
236
- }, "B")),
237
- getByText = _render19.getByText;
238
- var button = getByText('B');
239
- expect(button).toHaveStyle({
240
- color: 'black'
241
- });
242
- });
243
- it('has aria-label from label prop', function () {
244
- var _render20 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
245
- onToggle: jest.fn(),
246
- mark: "bold",
247
- label: "Toggle Bold"
248
- }, "B")),
249
- getByLabelText = _render20.getByLabelText;
250
- expect(getByLabelText('Toggle Bold')).toBeInTheDocument();
251
- });
252
- it('has aria-pressed attribute', function () {
253
- var _render21 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
254
- onToggle: jest.fn(),
255
- mark: "bold",
256
- label: "Bold",
257
- active: true
258
- }, "B")),
259
- getByText = _render21.getByText;
260
- expect(getByText('B')).toHaveAttribute('aria-pressed', 'true');
261
- });
262
- it('is focusable with tabIndex', function () {
263
- var _render22 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
264
- onToggle: jest.fn(),
265
- mark: "bold",
266
- label: "Bold"
267
- }, "B")),
268
- getByText = _render22.getByText;
269
- expect(getByText('B')).toHaveAttribute('tabIndex', '0');
270
- });
271
- });
272
- describe('MarkButton', function () {
273
- it('is the same as RawMarkButton', function () {
274
- expect(_toolbarButtons.MarkButton).toBe(_toolbarButtons.RawMarkButton);
275
- });
276
- });
277
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfdG9vbGJhckJ1dHRvbnMiLCJkZXNjcmliZSIsIml0IiwiX3JlbmRlciIsInJlbmRlciIsImNyZWF0ZUVsZW1lbnQiLCJSYXdCdXR0b24iLCJvbkNsaWNrIiwiamVzdCIsImZuIiwiY29udGFpbmVyIiwiZXhwZWN0IiwidG9CZUluVGhlRG9jdW1lbnQiLCJfcmVuZGVyMiIsImdldEJ5VGV4dCIsIl9yZW5kZXIzIiwiZmlyZUV2ZW50IiwibW91c2VEb3duIiwidG9IYXZlQmVlbkNhbGxlZCIsIl9yZW5kZXI0IiwiYnV0dG9uIiwiZXZlbnQiLCJNb3VzZUV2ZW50IiwiYnViYmxlcyIsImNhbmNlbGFibGUiLCJwcmV2ZW50RGVmYXVsdFNweSIsInNweU9uIiwiZGlzcGF0Y2hFdmVudCIsIl9yZW5kZXI1Iiwia2V5RG93biIsImtleSIsIl9yZW5kZXI2IiwiX3JlbmRlcjciLCJub3QiLCJfcmVuZGVyOCIsImFjdGl2ZSIsInRvSGF2ZVN0eWxlIiwiY29sb3IiLCJfcmVuZGVyOSIsImRpc2FibGVkIiwiY3Vyc29yIiwiZXh0cmFTdHlsZXMiLCJiYWNrZ3JvdW5kQ29sb3IiLCJfcmVuZGVyMCIsIl9yZW5kZXIxIiwiYXJpYUxhYmVsIiwiZ2V0QnlMYWJlbFRleHQiLCJfcmVuZGVyMTAiLCJ0b0hhdmVBdHRyaWJ1dGUiLCJfcmVuZGVyMTEiLCJCdXR0b24iLCJ0b0JlIiwiX3JlbmRlcjEyIiwiUmF3TWFya0J1dHRvbiIsIm9uVG9nZ2xlIiwibWFyayIsImxhYmVsIiwiX3JlbmRlcjEzIiwiX3JlbmRlcjE0IiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJfcmVuZGVyMTUiLCJfcmVuZGVyMTYiLCJfcmVuZGVyMTciLCJfcmVuZGVyMTgiLCJfcmVuZGVyMTkiLCJfcmVuZGVyMjAiLCJfcmVuZGVyMjEiLCJfcmVuZGVyMjIiLCJNYXJrQnV0dG9uIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvX190ZXN0c19fL3Rvb2xiYXItYnV0dG9ucy50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZmlyZUV2ZW50LCByZW5kZXIgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCB7IEJ1dHRvbiwgTWFya0J1dHRvbiwgUmF3QnV0dG9uLCBSYXdNYXJrQnV0dG9uIH0gZnJvbSAnLi4vY29tbW9uL3Rvb2xiYXItYnV0dG9ucyc7XG5cbmRlc2NyaWJlKCdSYXdCdXR0b24nLCAoKSA9PiB7XG4gIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8UmF3QnV0dG9uIG9uQ2xpY2s9e2plc3QuZm4oKX0+Q2xpY2sgbWU8L1Jhd0J1dHRvbj4pO1xuICAgIGV4cGVjdChjb250YWluZXIpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIGNoaWxkcmVuJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoPFJhd0J1dHRvbiBvbkNsaWNrPXtqZXN0LmZuKCl9PlRlc3QgQnV0dG9uPC9SYXdCdXR0b24+KTtcbiAgICBleHBlY3QoZ2V0QnlUZXh0KCdUZXN0IEJ1dHRvbicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBpdCgnY2FsbHMgb25DbGljayBvbiBtb3VzZSBkb3duJywgKCkgPT4ge1xuICAgIGNvbnN0IG9uQ2xpY2sgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcig8UmF3QnV0dG9uIG9uQ2xpY2s9e29uQ2xpY2t9PkNsaWNrPC9SYXdCdXR0b24+KTtcbiAgICBmaXJlRXZlbnQubW91c2VEb3duKGdldEJ5VGV4dCgnQ2xpY2snKSk7XG4gICAgZXhwZWN0KG9uQ2xpY2spLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ3ByZXZlbnRzIGRlZmF1bHQgb24gbW91c2UgZG93bicsICgpID0+IHtcbiAgICBjb25zdCBvbkNsaWNrID0gamVzdC5mbigpO1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoPFJhd0J1dHRvbiBvbkNsaWNrPXtvbkNsaWNrfT5DbGljazwvUmF3QnV0dG9uPik7XG4gICAgY29uc3QgYnV0dG9uID0gZ2V0QnlUZXh0KCdDbGljaycpO1xuICAgIGNvbnN0IGV2ZW50ID0gbmV3IE1vdXNlRXZlbnQoJ21vdXNlZG93bicsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgICBjb25zdCBwcmV2ZW50RGVmYXVsdFNweSA9IGplc3Quc3B5T24oZXZlbnQsICdwcmV2ZW50RGVmYXVsdCcpO1xuICAgIGJ1dHRvbi5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICBleHBlY3QocHJldmVudERlZmF1bHRTcHkpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ2NhbGxzIG9uQ2xpY2sgb24gRW50ZXIga2V5IHByZXNzJywgKCkgPT4ge1xuICAgIGNvbnN0IG9uQ2xpY2sgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcig8UmF3QnV0dG9uIG9uQ2xpY2s9e29uQ2xpY2t9PkNsaWNrPC9SYXdCdXR0b24+KTtcbiAgICBmaXJlRXZlbnQua2V5RG93bihnZXRCeVRleHQoJ0NsaWNrJyksIHsga2V5OiAnRW50ZXInIH0pO1xuICAgIGV4cGVjdChvbkNsaWNrKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBvbkNsaWNrIG9uIFNwYWNlIGtleSBwcmVzcycsICgpID0+IHtcbiAgICBjb25zdCBvbkNsaWNrID0gamVzdC5mbigpO1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoPFJhd0J1dHRvbiBvbkNsaWNrPXtvbkNsaWNrfT5DbGljazwvUmF3QnV0dG9uPik7XG4gICAgZmlyZUV2ZW50LmtleURvd24oZ2V0QnlUZXh0KCdDbGljaycpLCB7IGtleTogJyAnIH0pO1xuICAgIGV4cGVjdChvbkNsaWNrKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCBjYWxsIG9uQ2xpY2sgb24gb3RoZXIga2V5IHByZXNzJywgKCkgPT4ge1xuICAgIGNvbnN0IG9uQ2xpY2sgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcig8UmF3QnV0dG9uIG9uQ2xpY2s9e29uQ2xpY2t9PkNsaWNrPC9SYXdCdXR0b24+KTtcbiAgICBmaXJlRXZlbnQua2V5RG93bihnZXRCeVRleHQoJ0NsaWNrJyksIHsga2V5OiAnYScgfSk7XG4gICAgZXhwZWN0KG9uQ2xpY2spLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdhcHBsaWVzIGFjdGl2ZSBzdHlsZSB3aGVuIGFjdGl2ZSBpcyB0cnVlJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoXG4gICAgICA8UmF3QnV0dG9uIG9uQ2xpY2s9e2plc3QuZm4oKX0gYWN0aXZlPXt0cnVlfT5cbiAgICAgICAgQWN0aXZlXG4gICAgICA8L1Jhd0J1dHRvbj4sXG4gICAgKTtcbiAgICBjb25zdCBidXR0b24gPSBnZXRCeVRleHQoJ0FjdGl2ZScpO1xuICAgIGV4cGVjdChidXR0b24pLnRvSGF2ZVN0eWxlKHsgY29sb3I6ICdibGFjaycgfSk7XG4gIH0pO1xuXG4gIGl0KCdhcHBsaWVzIGRpc2FibGVkIHN0eWxlIHdoZW4gZGlzYWJsZWQgaXMgdHJ1ZScsICgpID0+IHtcbiAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKFxuICAgICAgPFJhd0J1dHRvbiBvbkNsaWNrPXtqZXN0LmZuKCl9IGRpc2FibGVkPXt0cnVlfT5cbiAgICAgICAgRGlzYWJsZWRcbiAgICAgIDwvUmF3QnV0dG9uPixcbiAgICApO1xuICAgIGNvbnN0IGJ1dHRvbiA9IGdldEJ5VGV4dCgnRGlzYWJsZWQnKTtcbiAgICBleHBlY3QoYnV0dG9uKS50b0hhdmVTdHlsZSh7IGN1cnNvcjogJ25vdC1hbGxvd2VkJyB9KTtcbiAgfSk7XG5cbiAgaXQoJ2FwcGxpZXMgZXh0cmFTdHlsZXMgd2hlbiBwcm92aWRlZCcsICgpID0+IHtcbiAgICBjb25zdCBleHRyYVN0eWxlcyA9IHsgYmFja2dyb3VuZENvbG9yOiAncmVkJyB9O1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoXG4gICAgICA8UmF3QnV0dG9uIG9uQ2xpY2s9e2plc3QuZm4oKX0gZXh0cmFTdHlsZXM9e2V4dHJhU3R5bGVzfT5cbiAgICAgICAgU3R5bGVkXG4gICAgICA8L1Jhd0J1dHRvbj4sXG4gICAgKTtcbiAgICBjb25zdCBidXR0b24gPSBnZXRCeVRleHQoJ1N0eWxlZCcpO1xuICAgIGV4cGVjdChidXR0b24pLnRvSGF2ZVN0eWxlKHsgYmFja2dyb3VuZENvbG9yOiAncmVkJyB9KTtcbiAgfSk7XG5cbiAgaXQoJ2hhcyBhcmlhLWxhYmVsIHdoZW4gcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKFxuICAgICAgPFJhd0J1dHRvbiBvbkNsaWNrPXtqZXN0LmZuKCl9IGFyaWFMYWJlbD1cIlRlc3QgQnV0dG9uXCI+XG4gICAgICAgIEJ1dHRvblxuICAgICAgPC9SYXdCdXR0b24+LFxuICAgICk7XG4gICAgZXhwZWN0KGdldEJ5TGFiZWxUZXh0KCdUZXN0IEJ1dHRvbicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBpdCgnaGFzIGFyaWEtcHJlc3NlZCBhdHRyaWJ1dGUnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdCdXR0b24gb25DbGljaz17amVzdC5mbigpfSBhY3RpdmU9e3RydWV9PlxuICAgICAgICBCdXR0b25cbiAgICAgIDwvUmF3QnV0dG9uPixcbiAgICApO1xuICAgIGV4cGVjdChnZXRCeVRleHQoJ0J1dHRvbicpKS50b0hhdmVBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICd0cnVlJyk7XG4gIH0pO1xuXG4gIGl0KCdpcyBmb2N1c2FibGUgd2l0aCB0YWJJbmRleCcsICgpID0+IHtcbiAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKDxSYXdCdXR0b24gb25DbGljaz17amVzdC5mbigpfT5CdXR0b248L1Jhd0J1dHRvbj4pO1xuICAgIGV4cGVjdChnZXRCeVRleHQoJ0J1dHRvbicpKS50b0hhdmVBdHRyaWJ1dGUoJ3RhYkluZGV4JywgJzAnKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ0J1dHRvbicsICgpID0+IHtcbiAgaXQoJ2lzIHRoZSBzYW1lIGFzIFJhd0J1dHRvbicsICgpID0+IHtcbiAgICBleHBlY3QoQnV0dG9uKS50b0JlKFJhd0J1dHRvbik7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdSYXdNYXJrQnV0dG9uJywgKCkgPT4ge1xuICBpdCgncmVuZGVycyB3aXRob3V0IGNyYXNoaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoXG4gICAgICA8UmF3TWFya0J1dHRvbiBvblRvZ2dsZT17amVzdC5mbigpfSBtYXJrPVwiYm9sZFwiIGxhYmVsPVwiQm9sZFwiPlxuICAgICAgICBCXG4gICAgICA8L1Jhd01hcmtCdXR0b24+LFxuICAgICk7XG4gICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbmRlcnMgY2hpbGRyZW4nLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdNYXJrQnV0dG9uIG9uVG9nZ2xlPXtqZXN0LmZuKCl9IG1hcms9XCJib2xkXCIgbGFiZWw9XCJCb2xkXCI+XG4gICAgICAgIEJvbGRcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBleHBlY3QoZ2V0QnlUZXh0KCdCb2xkJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBvblRvZ2dsZSB3aXRoIG1hcmsgb24gbW91c2UgZG93bicsICgpID0+IHtcbiAgICBjb25zdCBvblRvZ2dsZSA9IGplc3QuZm4oKTtcbiAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKFxuICAgICAgPFJhd01hcmtCdXR0b24gb25Ub2dnbGU9e29uVG9nZ2xlfSBtYXJrPVwiaXRhbGljXCIgbGFiZWw9XCJJdGFsaWNcIj5cbiAgICAgICAgSVxuICAgICAgPC9SYXdNYXJrQnV0dG9uPixcbiAgICApO1xuICAgIGZpcmVFdmVudC5tb3VzZURvd24oZ2V0QnlUZXh0KCdJJykpO1xuICAgIGV4cGVjdChvblRvZ2dsZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2l0YWxpYycpO1xuICB9KTtcblxuICBpdCgncHJldmVudHMgZGVmYXVsdCBvbiBtb3VzZSBkb3duJywgKCkgPT4ge1xuICAgIGNvbnN0IG9uVG9nZ2xlID0gamVzdC5mbigpO1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoXG4gICAgICA8UmF3TWFya0J1dHRvbiBvblRvZ2dsZT17b25Ub2dnbGV9IG1hcms9XCJib2xkXCIgbGFiZWw9XCJCb2xkXCI+XG4gICAgICAgIEJcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBjb25zdCBidXR0b24gPSBnZXRCeVRleHQoJ0InKTtcbiAgICBjb25zdCBldmVudCA9IG5ldyBNb3VzZUV2ZW50KCdtb3VzZWRvd24nLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgY29uc3QgcHJldmVudERlZmF1bHRTcHkgPSBqZXN0LnNweU9uKGV2ZW50LCAncHJldmVudERlZmF1bHQnKTtcbiAgICBidXR0b24uZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgZXhwZWN0KHByZXZlbnREZWZhdWx0U3B5KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBvblRvZ2dsZSBvbiBFbnRlciBrZXkgcHJlc3MnLCAoKSA9PiB7XG4gICAgY29uc3Qgb25Ub2dnbGUgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdNYXJrQnV0dG9uIG9uVG9nZ2xlPXtvblRvZ2dsZX0gbWFyaz1cInVuZGVybGluZVwiIGxhYmVsPVwiVW5kZXJsaW5lXCI+XG4gICAgICAgIFVcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBmaXJlRXZlbnQua2V5RG93bihnZXRCeVRleHQoJ1UnKSwgeyBrZXk6ICdFbnRlcicgfSk7XG4gICAgZXhwZWN0KG9uVG9nZ2xlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgndW5kZXJsaW5lJyk7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBvblRvZ2dsZSBvbiBTcGFjZSBrZXkgcHJlc3MnLCAoKSA9PiB7XG4gICAgY29uc3Qgb25Ub2dnbGUgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdNYXJrQnV0dG9uIG9uVG9nZ2xlPXtvblRvZ2dsZX0gbWFyaz1cInN0cmlrZVwiIGxhYmVsPVwiU3RyaWtlXCI+XG4gICAgICAgIFNcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBmaXJlRXZlbnQua2V5RG93bihnZXRCeVRleHQoJ1MnKSwgeyBrZXk6ICcgJyB9KTtcbiAgICBleHBlY3Qob25Ub2dnbGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdzdHJpa2UnKTtcbiAgfSk7XG5cbiAgaXQoJ2RvZXMgbm90IGNhbGwgb25Ub2dnbGUgb24gb3RoZXIga2V5IHByZXNzJywgKCkgPT4ge1xuICAgIGNvbnN0IG9uVG9nZ2xlID0gamVzdC5mbigpO1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoXG4gICAgICA8UmF3TWFya0J1dHRvbiBvblRvZ2dsZT17b25Ub2dnbGV9IG1hcms9XCJib2xkXCIgbGFiZWw9XCJCb2xkXCI+XG4gICAgICAgIEJcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBmaXJlRXZlbnQua2V5RG93bihnZXRCeVRleHQoJ0InKSwgeyBrZXk6ICdhJyB9KTtcbiAgICBleHBlY3Qob25Ub2dnbGUpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdhcHBsaWVzIGFjdGl2ZSBzdHlsZSB3aGVuIGFjdGl2ZSBpcyB0cnVlJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoXG4gICAgICA8UmF3TWFya0J1dHRvbiBvblRvZ2dsZT17amVzdC5mbigpfSBtYXJrPVwiYm9sZFwiIGxhYmVsPVwiQm9sZFwiIGFjdGl2ZT17dHJ1ZX0+XG4gICAgICAgIEJcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBjb25zdCBidXR0b24gPSBnZXRCeVRleHQoJ0InKTtcbiAgICBleHBlY3QoYnV0dG9uKS50b0hhdmVTdHlsZSh7IGNvbG9yOiAnYmxhY2snIH0pO1xuICB9KTtcblxuICBpdCgnaGFzIGFyaWEtbGFiZWwgZnJvbSBsYWJlbCBwcm9wJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0QnlMYWJlbFRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdNYXJrQnV0dG9uIG9uVG9nZ2xlPXtqZXN0LmZuKCl9IG1hcms9XCJib2xkXCIgbGFiZWw9XCJUb2dnbGUgQm9sZFwiPlxuICAgICAgICBCXG4gICAgICA8L1Jhd01hcmtCdXR0b24+LFxuICAgICk7XG4gICAgZXhwZWN0KGdldEJ5TGFiZWxUZXh0KCdUb2dnbGUgQm9sZCcpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBpdCgnaGFzIGFyaWEtcHJlc3NlZCBhdHRyaWJ1dGUnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdNYXJrQnV0dG9uIG9uVG9nZ2xlPXtqZXN0LmZuKCl9IG1hcms9XCJib2xkXCIgbGFiZWw9XCJCb2xkXCIgYWN0aXZlPXt0cnVlfT5cbiAgICAgICAgQlxuICAgICAgPC9SYXdNYXJrQnV0dG9uPixcbiAgICApO1xuICAgIGV4cGVjdChnZXRCeVRleHQoJ0InKSkudG9IYXZlQXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAndHJ1ZScpO1xuICB9KTtcblxuICBpdCgnaXMgZm9jdXNhYmxlIHdpdGggdGFiSW5kZXgnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdNYXJrQnV0dG9uIG9uVG9nZ2xlPXtqZXN0LmZuKCl9IG1hcms9XCJib2xkXCIgbGFiZWw9XCJCb2xkXCI+XG4gICAgICAgIEJcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBleHBlY3QoZ2V0QnlUZXh0KCdCJykpLnRvSGF2ZUF0dHJpYnV0ZSgndGFiSW5kZXgnLCAnMCcpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnTWFya0J1dHRvbicsICgpID0+IHtcbiAgaXQoJ2lzIHRoZSBzYW1lIGFzIFJhd01hcmtCdXR0b24nLCAoKSA9PiB7XG4gICAgZXhwZWN0KE1hcmtCdXR0b24pLnRvQmUoUmF3TWFya0J1dHRvbik7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGVBQUEsR0FBQUYsT0FBQTtBQUVBRyxRQUFRLENBQUMsV0FBVyxFQUFFLFlBQU07RUFDMUJDLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxZQUFNO0lBQ25DLElBQUFDLE9BQUEsR0FBc0IsSUFBQUMsY0FBTSxlQUFDUixNQUFBLFlBQUFTLGFBQUEsQ0FBQ0wsZUFBQSxDQUFBTSxTQUFTO1FBQUNDLE9BQU8sRUFBRUMsSUFBSSxDQUFDQyxFQUFFLENBQUM7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