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

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 (82) hide show
  1. package/lib/__tests__/EditableHtml.test.js +377 -0
  2. package/lib/__tests__/constants.test.js +21 -0
  3. package/lib/__tests__/extensions.test.js +209 -0
  4. package/lib/__tests__/index.test.js +235 -0
  5. package/lib/__tests__/size-utils.test.js +57 -0
  6. package/lib/__tests__/theme.test.js +17 -0
  7. package/lib/components/CharacterPicker.js +5 -5
  8. package/lib/components/EditableHtml.js +22 -6
  9. package/lib/components/MenuBar.js +7 -7
  10. package/lib/components/TiptapContainer.js +1 -1
  11. package/lib/components/TiptapContainer.js.map +1 -1
  12. package/lib/components/__tests__/AltDialog.test.js +201 -0
  13. package/lib/components/__tests__/CharacterPicker.test.js +305 -0
  14. package/lib/components/__tests__/CssIcon.test.js +58 -0
  15. package/lib/components/__tests__/DragInTheBlank.test.js +295 -0
  16. package/lib/components/__tests__/ExplicitConstructedResponse.test.js +253 -0
  17. package/lib/components/__tests__/ImageToolbar.test.js +185 -0
  18. package/lib/components/__tests__/InlineDropdown.test.js +287 -0
  19. package/lib/components/__tests__/InsertImageHandler.test.js +162 -0
  20. package/lib/components/__tests__/MediaDialog.test.js +433 -0
  21. package/lib/components/__tests__/MediaToolbar.test.js +126 -0
  22. package/lib/components/__tests__/MediaWrapper.test.js +96 -0
  23. package/lib/components/__tests__/MenuBar.test.js +459 -0
  24. package/lib/components/__tests__/RespArea.test.js +171 -0
  25. package/lib/components/__tests__/TableIcons.test.js +153 -0
  26. package/lib/components/__tests__/TextAlign.test.js +209 -0
  27. package/lib/components/__tests__/TiptapContainer.test.js +196 -0
  28. package/lib/components/__tests__/characterUtils.test.js +178 -0
  29. package/lib/components/__tests__/choice.test.js +213 -0
  30. package/lib/components/__tests__/custom-popper.test.js +108 -0
  31. package/lib/components/__tests__/done-button.test.js +72 -0
  32. package/lib/components/__tests__/toolbar-buttons.test.js +277 -0
  33. package/lib/components/characters/characterUtils.js +1 -1
  34. package/lib/components/characters/custom-popper.js +1 -1
  35. package/lib/components/common/done-button.js +1 -1
  36. package/lib/components/common/toolbar-buttons.js +1 -1
  37. package/lib/components/icons/CssIcon.js +1 -1
  38. package/lib/components/icons/RespArea.js +1 -1
  39. package/lib/components/icons/TableIcons.js +1 -1
  40. package/lib/components/icons/TextAlign.js +1 -1
  41. package/lib/components/image/AltDialog.js +1 -1
  42. package/lib/components/image/ImageToolbar.js +1 -1
  43. package/lib/components/image/InsertImageHandler.js +1 -1
  44. package/lib/components/media/MediaDialog.js +1 -1
  45. package/lib/components/media/MediaToolbar.js +1 -1
  46. package/lib/components/media/MediaWrapper.js +1 -1
  47. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js +3 -3
  48. package/lib/components/respArea/DragInTheBlank/choice.js +1 -1
  49. package/lib/components/respArea/ExplicitConstructedResponse.js +1 -1
  50. package/lib/components/respArea/InlineDropdown.js +1 -1
  51. package/lib/components/respArea/ToolbarIcon.js +1 -1
  52. package/lib/constants.js +1 -1
  53. package/lib/extensions/__tests__/component.test.js +314 -0
  54. package/lib/extensions/__tests__/css.test.js +214 -0
  55. package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +175 -0
  56. package/lib/extensions/__tests__/extended-table.test.js +92 -0
  57. package/lib/extensions/__tests__/image-component.test.js +305 -0
  58. package/lib/extensions/__tests__/image.test.js +164 -0
  59. package/lib/extensions/__tests__/media.test.js +292 -0
  60. package/lib/extensions/__tests__/responseArea.test.js +330 -0
  61. package/lib/extensions/component.js +305 -0
  62. package/lib/extensions/css.js +1 -1
  63. package/lib/extensions/custom-toolbar-wrapper.js +1 -1
  64. package/lib/extensions/extended-table.js +1 -1
  65. package/lib/extensions/image-component.js +5 -5
  66. package/lib/extensions/image.js +1 -1
  67. package/lib/extensions/index.js +5 -4
  68. package/lib/extensions/math.js +1 -1
  69. package/lib/extensions/media.js +1 -1
  70. package/lib/extensions/responseArea.js +1 -1
  71. package/lib/index.js +1 -1
  72. package/lib/styles/editorContainerStyles.js +1 -1
  73. package/lib/theme.js +1 -1
  74. package/lib/utils/size.js +1 -1
  75. package/package.json +9 -11
  76. package/src/components/CharacterPicker.jsx +1 -1
  77. package/src/components/EditableHtml.jsx +23 -5
  78. package/src/components/MenuBar.jsx +3 -3
  79. package/src/components/respArea/DragInTheBlank/DragInTheBlank.jsx +1 -1
  80. package/src/extensions/image-component.jsx +1 -1
  81. package/src/extensions/index.js +2 -1
  82. package/LICENSE.md +0 -5
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _InsertImageHandler = _interopRequireDefault(require("../image/InsertImageHandler"));
5
+ describe('InsertImageHandler', function () {
6
+ var mockNode = {
7
+ attrs: {},
8
+ nodeSize: 1
9
+ };
10
+ var createMockEditor = function createMockEditor() {
11
+ return {
12
+ state: {
13
+ doc: {
14
+ descendants: jest.fn(function (callback) {
15
+ callback(mockNode, 5);
16
+ })
17
+ },
18
+ tr: {
19
+ setNodeMarkup: jest.fn(function (pos, type, attrs) {
20
+ return {
21
+ setNodeMarkup: jest.fn()
22
+ };
23
+ }),
24
+ "delete": jest.fn(function (from, to) {
25
+ return {
26
+ "delete": jest.fn()
27
+ };
28
+ })
29
+ }
30
+ },
31
+ view: {
32
+ dispatch: jest.fn()
33
+ }
34
+ };
35
+ };
36
+ var mockOnFinish = jest.fn();
37
+ beforeEach(function () {
38
+ jest.clearAllMocks();
39
+ });
40
+ it('creates handler instance', function () {
41
+ var editor = createMockEditor();
42
+ var handler = new _InsertImageHandler["default"](editor, mockNode, mockOnFinish);
43
+ expect(handler).toBeDefined();
44
+ expect(handler.editor).toBe(editor);
45
+ expect(handler.node).toBe(mockNode);
46
+ expect(handler.onFinish).toBe(mockOnFinish);
47
+ });
48
+ it('stores nodePos from descendants', function () {
49
+ var editor = createMockEditor();
50
+ var handler = new _InsertImageHandler["default"](editor, mockNode, mockOnFinish);
51
+ expect(handler.nodePos).toBe(5);
52
+ });
53
+ it('stores isPasted parameter', function () {
54
+ var editor = createMockEditor();
55
+ var handler = new _InsertImageHandler["default"](editor, mockNode, mockOnFinish, true);
56
+ expect(handler.isPasted).toBe(true);
57
+ });
58
+ it('defaults isPasted to false', function () {
59
+ var editor = createMockEditor();
60
+ var handler = new _InsertImageHandler["default"](editor, mockNode, mockOnFinish);
61
+ expect(handler.isPasted).toBe(false);
62
+ });
63
+ it('cancel deletes node and calls onFinish', function () {
64
+ var editor = createMockEditor();
65
+ var handler = new _InsertImageHandler["default"](editor, mockNode, mockOnFinish);
66
+ handler.cancel();
67
+ expect(mockOnFinish).toHaveBeenCalledWith(false);
68
+ });
69
+ it('updateNode dispatches transaction with new attributes', function () {
70
+ var editor = createMockEditor();
71
+ var mockNodeAt = jest.fn(function () {
72
+ return {
73
+ attrs: {
74
+ existing: 'value'
75
+ }
76
+ };
77
+ });
78
+ editor.state.doc.nodeAt = mockNodeAt;
79
+ var handler = new _InsertImageHandler["default"](editor, mockNode, mockOnFinish);
80
+ handler.updateNode({
81
+ newAttr: 'newValue'
82
+ });
83
+ expect(mockNodeAt).toHaveBeenCalledWith(5);
84
+ expect(editor.view.dispatch).toHaveBeenCalled();
85
+ });
86
+ it('done calls onFinish with false on error', function () {
87
+ var editor = createMockEditor();
88
+ var handler = new _InsertImageHandler["default"](editor, mockNode, mockOnFinish);
89
+ var consoleLogSpy = jest.spyOn(console, 'log').mockImplementation();
90
+ handler.done('error', null);
91
+ expect(consoleLogSpy).toHaveBeenCalledWith('error');
92
+ expect(mockOnFinish).toHaveBeenCalledWith(false);
93
+ consoleLogSpy.mockRestore();
94
+ });
95
+ it('done updates node and calls onFinish with true on success', function () {
96
+ var editor = createMockEditor();
97
+ var mockNodeAt = jest.fn(function () {
98
+ return {
99
+ attrs: {}
100
+ };
101
+ });
102
+ editor.state.doc.nodeAt = mockNodeAt;
103
+ var handler = new _InsertImageHandler["default"](editor, mockNode, mockOnFinish);
104
+ handler.done(null, 'http://example.com/image.jpg');
105
+ expect(editor.view.dispatch).toHaveBeenCalled();
106
+ expect(mockOnFinish).toHaveBeenCalledWith(true);
107
+ });
108
+ it('fileChosen returns early when no file provided', function () {
109
+ var editor = createMockEditor();
110
+ var handler = new _InsertImageHandler["default"](editor, mockNode, mockOnFinish);
111
+ handler.fileChosen(null);
112
+ expect(editor.view.dispatch).not.toHaveBeenCalled();
113
+ });
114
+ it('fileChosen saves file and reads it as data URL', function () {
115
+ var editor = createMockEditor();
116
+ var mockNodeAt = jest.fn(function () {
117
+ return {
118
+ attrs: {}
119
+ };
120
+ });
121
+ editor.state.doc.nodeAt = mockNodeAt;
122
+ var handler = new _InsertImageHandler["default"](editor, mockNode, mockOnFinish);
123
+ var mockFile = new File(['content'], 'test.jpg', {
124
+ type: 'image/jpeg'
125
+ });
126
+ global.FileReader = jest.fn(function () {
127
+ this.readAsDataURL = jest.fn(function () {
128
+ this.result = 'data:image/jpeg;base64,abc123';
129
+ this.onload();
130
+ });
131
+ });
132
+ handler.fileChosen(mockFile);
133
+ expect(handler.chosenFile).toBe(mockFile);
134
+ });
135
+ it('progress updates node with percent', function () {
136
+ var editor = createMockEditor();
137
+ var mockNodeAt = jest.fn(function () {
138
+ return {
139
+ attrs: {}
140
+ };
141
+ });
142
+ editor.state.doc.nodeAt = mockNodeAt;
143
+ var handler = new _InsertImageHandler["default"](editor, mockNode, mockOnFinish);
144
+ handler.progress(50, 500, 1000);
145
+ expect(editor.view.dispatch).toHaveBeenCalled();
146
+ });
147
+ it('getChosenFile returns the chosen file', function () {
148
+ var editor = createMockEditor();
149
+ var handler = new _InsertImageHandler["default"](editor, mockNode, mockOnFinish);
150
+ var mockFile = new File(['content'], 'test.jpg', {
151
+ type: 'image/jpeg'
152
+ });
153
+ handler.chosenFile = mockFile;
154
+ expect(handler.getChosenFile()).toBe(mockFile);
155
+ });
156
+ it('getChosenFile returns null initially', function () {
157
+ var editor = createMockEditor();
158
+ var handler = new _InsertImageHandler["default"](editor, mockNode, mockOnFinish);
159
+ expect(handler.getChosenFile()).toBeNull();
160
+ });
161
+ });
162
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfSW5zZXJ0SW1hZ2VIYW5kbGVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJkZXNjcmliZSIsIm1vY2tOb2RlIiwiYXR0cnMiLCJub2RlU2l6ZSIsImNyZWF0ZU1vY2tFZGl0b3IiLCJzdGF0ZSIsImRvYyIsImRlc2NlbmRhbnRzIiwiamVzdCIsImZuIiwiY2FsbGJhY2siLCJ0ciIsInNldE5vZGVNYXJrdXAiLCJwb3MiLCJ0eXBlIiwiZnJvbSIsInRvIiwidmlldyIsImRpc3BhdGNoIiwibW9ja09uRmluaXNoIiwiYmVmb3JlRWFjaCIsImNsZWFyQWxsTW9ja3MiLCJpdCIsImVkaXRvciIsImhhbmRsZXIiLCJJbnNlcnRJbWFnZUhhbmRsZXIiLCJleHBlY3QiLCJ0b0JlRGVmaW5lZCIsInRvQmUiLCJub2RlIiwib25GaW5pc2giLCJub2RlUG9zIiwiaXNQYXN0ZWQiLCJjYW5jZWwiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsIm1vY2tOb2RlQXQiLCJleGlzdGluZyIsIm5vZGVBdCIsInVwZGF0ZU5vZGUiLCJuZXdBdHRyIiwidG9IYXZlQmVlbkNhbGxlZCIsImNvbnNvbGVMb2dTcHkiLCJzcHlPbiIsImNvbnNvbGUiLCJtb2NrSW1wbGVtZW50YXRpb24iLCJkb25lIiwibW9ja1Jlc3RvcmUiLCJmaWxlQ2hvc2VuIiwibm90IiwibW9ja0ZpbGUiLCJGaWxlIiwiZ2xvYmFsIiwiRmlsZVJlYWRlciIsInJlYWRBc0RhdGFVUkwiLCJyZXN1bHQiLCJvbmxvYWQiLCJjaG9zZW5GaWxlIiwicHJvZ3Jlc3MiLCJnZXRDaG9zZW5GaWxlIiwidG9CZU51bGwiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9fX3Rlc3RzX18vSW5zZXJ0SW1hZ2VIYW5kbGVyLnRlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEluc2VydEltYWdlSGFuZGxlciBmcm9tICcuLi9pbWFnZS9JbnNlcnRJbWFnZUhhbmRsZXInO1xuXG5kZXNjcmliZSgnSW5zZXJ0SW1hZ2VIYW5kbGVyJywgKCkgPT4ge1xuICBjb25zdCBtb2NrTm9kZSA9IHtcbiAgICBhdHRyczoge30sXG4gICAgbm9kZVNpemU6IDEsXG4gIH07XG5cbiAgY29uc3QgY3JlYXRlTW9ja0VkaXRvciA9ICgpID0+ICh7XG4gICAgc3RhdGU6IHtcbiAgICAgIGRvYzoge1xuICAgICAgICBkZXNjZW5kYW50czogamVzdC5mbigoY2FsbGJhY2spID0+IHtcbiAgICAgICAgICBjYWxsYmFjayhtb2NrTm9kZSwgNSk7XG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICAgIHRyOiB7XG4gICAgICAgIHNldE5vZGVNYXJrdXA6IGplc3QuZm4oKHBvcywgdHlwZSwgYXR0cnMpID0+ICh7IHNldE5vZGVNYXJrdXA6IGplc3QuZm4oKSB9KSksXG4gICAgICAgIGRlbGV0ZTogamVzdC5mbigoZnJvbSwgdG8pID0+ICh7IGRlbGV0ZTogamVzdC5mbigpIH0pKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB2aWV3OiB7XG4gICAgICBkaXNwYXRjaDogamVzdC5mbigpLFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IG1vY2tPbkZpbmlzaCA9IGplc3QuZm4oKTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgfSk7XG5cbiAgaXQoJ2NyZWF0ZXMgaGFuZGxlciBpbnN0YW5jZScsICgpID0+IHtcbiAgICBjb25zdCBlZGl0b3IgPSBjcmVhdGVNb2NrRWRpdG9yKCk7XG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBJbnNlcnRJbWFnZUhhbmRsZXIoZWRpdG9yLCBtb2NrTm9kZSwgbW9ja09uRmluaXNoKTtcbiAgICBleHBlY3QoaGFuZGxlcikudG9CZURlZmluZWQoKTtcbiAgICBleHBlY3QoaGFuZGxlci5lZGl0b3IpLnRvQmUoZWRpdG9yKTtcbiAgICBleHBlY3QoaGFuZGxlci5ub2RlKS50b0JlKG1vY2tOb2RlKTtcbiAgICBleHBlY3QoaGFuZGxlci5vbkZpbmlzaCkudG9CZShtb2NrT25GaW5pc2gpO1xuICB9KTtcblxuICBpdCgnc3RvcmVzIG5vZGVQb3MgZnJvbSBkZXNjZW5kYW50cycsICgpID0+IHtcbiAgICBjb25zdCBlZGl0b3IgPSBjcmVhdGVNb2NrRWRpdG9yKCk7XG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBJbnNlcnRJbWFnZUhhbmRsZXIoZWRpdG9yLCBtb2NrTm9kZSwgbW9ja09uRmluaXNoKTtcbiAgICBleHBlY3QoaGFuZGxlci5ub2RlUG9zKS50b0JlKDUpO1xuICB9KTtcblxuICBpdCgnc3RvcmVzIGlzUGFzdGVkIHBhcmFtZXRlcicsICgpID0+IHtcbiAgICBjb25zdCBlZGl0b3IgPSBjcmVhdGVNb2NrRWRpdG9yKCk7XG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBJbnNlcnRJbWFnZUhhbmRsZXIoZWRpdG9yLCBtb2NrTm9kZSwgbW9ja09uRmluaXNoLCB0cnVlKTtcbiAgICBleHBlY3QoaGFuZGxlci5pc1Bhc3RlZCkudG9CZSh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ2RlZmF1bHRzIGlzUGFzdGVkIHRvIGZhbHNlJywgKCkgPT4ge1xuICAgIGNvbnN0IGVkaXRvciA9IGNyZWF0ZU1vY2tFZGl0b3IoKTtcbiAgICBjb25zdCBoYW5kbGVyID0gbmV3IEluc2VydEltYWdlSGFuZGxlcihlZGl0b3IsIG1vY2tOb2RlLCBtb2NrT25GaW5pc2gpO1xuICAgIGV4cGVjdChoYW5kbGVyLmlzUGFzdGVkKS50b0JlKGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ2NhbmNlbCBkZWxldGVzIG5vZGUgYW5kIGNhbGxzIG9uRmluaXNoJywgKCkgPT4ge1xuICAgIGNvbnN0IGVkaXRvciA9IGNyZWF0ZU1vY2tFZGl0b3IoKTtcbiAgICBjb25zdCBoYW5kbGVyID0gbmV3IEluc2VydEltYWdlSGFuZGxlcihlZGl0b3IsIG1vY2tOb2RlLCBtb2NrT25GaW5pc2gpO1xuICAgIGhhbmRsZXIuY2FuY2VsKCk7XG4gICAgZXhwZWN0KG1vY2tPbkZpbmlzaCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZmFsc2UpO1xuICB9KTtcblxuICBpdCgndXBkYXRlTm9kZSBkaXNwYXRjaGVzIHRyYW5zYWN0aW9uIHdpdGggbmV3IGF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgY29uc3QgZWRpdG9yID0gY3JlYXRlTW9ja0VkaXRvcigpO1xuICAgIGNvbnN0IG1vY2tOb2RlQXQgPSBqZXN0LmZuKCgpID0+ICh7IGF0dHJzOiB7IGV4aXN0aW5nOiAndmFsdWUnIH0gfSkpO1xuICAgIGVkaXRvci5zdGF0ZS5kb2Mubm9kZUF0ID0gbW9ja05vZGVBdDtcblxuICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgSW5zZXJ0SW1hZ2VIYW5kbGVyKGVkaXRvciwgbW9ja05vZGUsIG1vY2tPbkZpbmlzaCk7XG4gICAgaGFuZGxlci51cGRhdGVOb2RlKHsgbmV3QXR0cjogJ25ld1ZhbHVlJyB9KTtcblxuICAgIGV4cGVjdChtb2NrTm9kZUF0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCg1KTtcbiAgICBleHBlY3QoZWRpdG9yLnZpZXcuZGlzcGF0Y2gpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ2RvbmUgY2FsbHMgb25GaW5pc2ggd2l0aCBmYWxzZSBvbiBlcnJvcicsICgpID0+IHtcbiAgICBjb25zdCBlZGl0b3IgPSBjcmVhdGVNb2NrRWRpdG9yKCk7XG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBJbnNlcnRJbWFnZUhhbmRsZXIoZWRpdG9yLCBtb2NrTm9kZSwgbW9ja09uRmluaXNoKTtcbiAgICBjb25zdCBjb25zb2xlTG9nU3B5ID0gamVzdC5zcHlPbihjb25zb2xlLCAnbG9nJykubW9ja0ltcGxlbWVudGF0aW9uKCk7XG5cbiAgICBoYW5kbGVyLmRvbmUoJ2Vycm9yJywgbnVsbCk7XG5cbiAgICBleHBlY3QoY29uc29sZUxvZ1NweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2Vycm9yJyk7XG4gICAgZXhwZWN0KG1vY2tPbkZpbmlzaCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZmFsc2UpO1xuICAgIGNvbnNvbGVMb2dTcHkubW9ja1Jlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ2RvbmUgdXBkYXRlcyBub2RlIGFuZCBjYWxscyBvbkZpbmlzaCB3aXRoIHRydWUgb24gc3VjY2VzcycsICgpID0+IHtcbiAgICBjb25zdCBlZGl0b3IgPSBjcmVhdGVNb2NrRWRpdG9yKCk7XG4gICAgY29uc3QgbW9ja05vZGVBdCA9IGplc3QuZm4oKCkgPT4gKHsgYXR0cnM6IHt9IH0pKTtcbiAgICBlZGl0b3Iuc3RhdGUuZG9jLm5vZGVBdCA9IG1vY2tOb2RlQXQ7XG5cbiAgICBjb25zdCBoYW5kbGVyID0gbmV3IEluc2VydEltYWdlSGFuZGxlcihlZGl0b3IsIG1vY2tOb2RlLCBtb2NrT25GaW5pc2gpO1xuICAgIGhhbmRsZXIuZG9uZShudWxsLCAnaHR0cDovL2V4YW1wbGUuY29tL2ltYWdlLmpwZycpO1xuXG4gICAgZXhwZWN0KGVkaXRvci52aWV3LmRpc3BhdGNoKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgZXhwZWN0KG1vY2tPbkZpbmlzaCkudG9IYXZlQmVlbkNhbGxlZFdpdGgodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdmaWxlQ2hvc2VuIHJldHVybnMgZWFybHkgd2hlbiBubyBmaWxlIHByb3ZpZGVkJywgKCkgPT4ge1xuICAgIGNvbnN0IGVkaXRvciA9IGNyZWF0ZU1vY2tFZGl0b3IoKTtcbiAgICBjb25zdCBoYW5kbGVyID0gbmV3IEluc2VydEltYWdlSGFuZGxlcihlZGl0b3IsIG1vY2tOb2RlLCBtb2NrT25GaW5pc2gpO1xuICAgIGhhbmRsZXIuZmlsZUNob3NlbihudWxsKTtcbiAgICBleHBlY3QoZWRpdG9yLnZpZXcuZGlzcGF0Y2gpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdmaWxlQ2hvc2VuIHNhdmVzIGZpbGUgYW5kIHJlYWRzIGl0IGFzIGRhdGEgVVJMJywgKCkgPT4ge1xuICAgIGNvbnN0IGVkaXRvciA9IGNyZWF0ZU1vY2tFZGl0b3IoKTtcbiAgICBjb25zdCBtb2NrTm9kZUF0ID0gamVzdC5mbigoKSA9PiAoeyBhdHRyczoge30gfSkpO1xuICAgIGVkaXRvci5zdGF0ZS5kb2Mubm9kZUF0ID0gbW9ja05vZGVBdDtcblxuICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgSW5zZXJ0SW1hZ2VIYW5kbGVyKGVkaXRvciwgbW9ja05vZGUsIG1vY2tPbkZpbmlzaCk7XG4gICAgY29uc3QgbW9ja0ZpbGUgPSBuZXcgRmlsZShbJ2NvbnRlbnQnXSwgJ3Rlc3QuanBnJywgeyB0eXBlOiAnaW1hZ2UvanBlZycgfSk7XG5cbiAgICBnbG9iYWwuRmlsZVJlYWRlciA9IGplc3QuZm4oZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5yZWFkQXNEYXRhVVJMID0gamVzdC5mbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsYWJjMTIzJztcbiAgICAgICAgdGhpcy5vbmxvYWQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaGFuZGxlci5maWxlQ2hvc2VuKG1vY2tGaWxlKTtcblxuICAgIGV4cGVjdChoYW5kbGVyLmNob3NlbkZpbGUpLnRvQmUobW9ja0ZpbGUpO1xuICB9KTtcblxuICBpdCgncHJvZ3Jlc3MgdXBkYXRlcyBub2RlIHdpdGggcGVyY2VudCcsICgpID0+IHtcbiAgICBjb25zdCBlZGl0b3IgPSBjcmVhdGVNb2NrRWRpdG9yKCk7XG4gICAgY29uc3QgbW9ja05vZGVBdCA9IGplc3QuZm4oKCkgPT4gKHsgYXR0cnM6IHt9IH0pKTtcbiAgICBlZGl0b3Iuc3RhdGUuZG9jLm5vZGVBdCA9IG1vY2tOb2RlQXQ7XG5cbiAgICBjb25zdCBoYW5kbGVyID0gbmV3IEluc2VydEltYWdlSGFuZGxlcihlZGl0b3IsIG1vY2tOb2RlLCBtb2NrT25GaW5pc2gpO1xuICAgIGhhbmRsZXIucHJvZ3Jlc3MoNTAsIDUwMCwgMTAwMCk7XG5cbiAgICBleHBlY3QoZWRpdG9yLnZpZXcuZGlzcGF0Y2gpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ2dldENob3NlbkZpbGUgcmV0dXJucyB0aGUgY2hvc2VuIGZpbGUnLCAoKSA9PiB7XG4gICAgY29uc3QgZWRpdG9yID0gY3JlYXRlTW9ja0VkaXRvcigpO1xuICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgSW5zZXJ0SW1hZ2VIYW5kbGVyKGVkaXRvciwgbW9ja05vZGUsIG1vY2tPbkZpbmlzaCk7XG4gICAgY29uc3QgbW9ja0ZpbGUgPSBuZXcgRmlsZShbJ2NvbnRlbnQnXSwgJ3Rlc3QuanBnJywgeyB0eXBlOiAnaW1hZ2UvanBlZycgfSk7XG4gICAgaGFuZGxlci5jaG9zZW5GaWxlID0gbW9ja0ZpbGU7XG5cbiAgICBleHBlY3QoaGFuZGxlci5nZXRDaG9zZW5GaWxlKCkpLnRvQmUobW9ja0ZpbGUpO1xuICB9KTtcblxuICBpdCgnZ2V0Q2hvc2VuRmlsZSByZXR1cm5zIG51bGwgaW5pdGlhbGx5JywgKCkgPT4ge1xuICAgIGNvbnN0IGVkaXRvciA9IGNyZWF0ZU1vY2tFZGl0b3IoKTtcbiAgICBjb25zdCBoYW5kbGVyID0gbmV3IEluc2VydEltYWdlSGFuZGxlcihlZGl0b3IsIG1vY2tOb2RlLCBtb2NrT25GaW5pc2gpO1xuICAgIGV4cGVjdChoYW5kbGVyLmdldENob3NlbkZpbGUoKSkudG9CZU51bGwoKTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBQUEsbUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsWUFBTTtFQUNuQyxJQUFNQyxRQUFRLEdBQUc7SUFDZkMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNUQyxRQUFRLEVBQUU7RUFDWixDQUFDO0VBRUQsSUFBTUMsZ0JBQWdCLEdBQUcsU0FBbkJBLGdCQUFnQkEsQ0FBQTtJQUFBLE9BQVU7TUFDOUJDLEtBQUssRUFBRTtRQUNMQyxHQUFHLEVBQUU7VUFDSEMsV0FBVyxFQUFFQyxJQUFJ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LENBQUMsb0NBQW9DLEVBQUUsWUFBTTtJQUM3QyxJQUFNQyxNQUFNLEdBQUduQixnQkFBZ0IsQ0FBQyxDQUFDO0lBQ2pDLElBQU0rQixVQUFVLEdBQUczQixJQUFJLENBQUNDLEVBQUUsQ0FBQztNQUFBLE9BQU87UUFBRVAsS0FBSyxFQUFFLENBQUM7TUFBRSxDQUFDO0lBQUEsQ0FBQyxDQUFDO0lBQ2pEcUIsTUFBTSxDQUFDbEIsS0FBSyxDQUFDQyxHQUFHLENBQUMrQixNQUFNLEdBQUdGLFVBQVU7SUFFcEMsSUFBTVgsT0FBTyxHQUFHLElBQUlDLDhCQUFrQixDQUFDRixNQUFNLEVBQUV0QixRQUFRLEVBQUVrQixZQUFZLENBQUM7SUFDdEVLLE9BQU8sQ0FBQ2lDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQztJQUUvQi9CLE1BQU0sQ0FBQ0gsTUFBTSxDQUFDTixJQUFJLENBQUNDLFFBQVEsQ0FBQyxDQUFDc0IsZ0JBQWdCLENBQUMsQ0FBQztFQUNqRCxDQUFDLENBQUM7RUFFRmxCLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxZQUFNO0lBQ2hELElBQU1DLE1BQU0sR0FBR25CLGdCQUFnQixDQUFDLENBQUM7SUFDakMsSUFBTW9CLE9BQU8sR0FBRyxJQUFJQyw4QkFBa0IsQ0FBQ0YsTUFBTSxFQUFFdEIsUUFBUSxFQUFFa0IsWUFBWSxDQUFDO0lBQ3RFLElBQU04QixRQUFRLEdBQUcsSUFBSUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsVUFBVSxFQUFFO01BQUVwQyxJQUFJLEVBQUU7SUFBYSxDQUFDLENBQUM7SUFDMUVVLE9BQU8sQ0FBQ2dDLFVBQVUsR0FBR1AsUUFBUTtJQUU3QnZCLE1BQU0sQ0FBQ0YsT0FBTyxDQUFDa0MsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDOUIsSUFBSSxDQUFDcUIsUUFBUSxDQUFDO0VBQ2hELENBQUMsQ0FBQztFQUVGM0IsRUFBRSxDQUFDLHNDQUFzQyxFQUFFLFlBQU07SUFDL0MsSUFBTUMsTUFBTSxHQUFHbkIsZ0JBQWdCLENBQUMsQ0FBQztJQUNqQyxJQUFNb0IsT0FBTyxHQUFHLElBQUlDLDhCQUFrQixDQUFDRixNQUFNLEVBQUV0QixRQUFRLEVBQUVrQixZQUFZLENBQUM7SUFDdEVPLE1BQU0sQ0FBQ0YsT0FBTyxDQUFDa0MsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDQyxRQUFRLENBQUMsQ0FBQztFQUM1QyxDQUFDLENBQUM7QUFDSixDQUFDLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=