@pie-element/hotspot 9.1.0 → 9.2.0-mui-update.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/configure/CHANGELOG.md +66 -0
  3. package/configure/lib/DeleteWidget.js +31 -44
  4. package/configure/lib/DeleteWidget.js.map +1 -1
  5. package/configure/lib/__tests__/DeleteWidget.test.js +60 -0
  6. package/configure/lib/__tests__/hotspot-container.test.js +377 -0
  7. package/configure/lib/__tests__/hotspot-drawable.test.js +233 -0
  8. package/configure/lib/__tests__/index.test.js +211 -0
  9. package/configure/lib/__tests__/root.test.js +440 -0
  10. package/configure/lib/__tests__/utils.test.js +287 -0
  11. package/configure/lib/button.js +27 -46
  12. package/configure/lib/button.js.map +1 -1
  13. package/configure/lib/buttons/circle.js +21 -28
  14. package/configure/lib/buttons/circle.js.map +1 -1
  15. package/configure/lib/buttons/polygon.js +27 -34
  16. package/configure/lib/buttons/polygon.js.map +1 -1
  17. package/configure/lib/buttons/rectangle.js +27 -34
  18. package/configure/lib/buttons/rectangle.js.map +1 -1
  19. package/configure/lib/defaults.js +3 -4
  20. package/configure/lib/defaults.js.map +1 -1
  21. package/configure/lib/hotspot-circle.js +133 -199
  22. package/configure/lib/hotspot-circle.js.map +1 -1
  23. package/configure/lib/hotspot-container.js +251 -356
  24. package/configure/lib/hotspot-container.js.map +1 -1
  25. package/configure/lib/hotspot-drawable.js +361 -473
  26. package/configure/lib/hotspot-drawable.js.map +1 -1
  27. package/configure/lib/hotspot-palette.js +93 -140
  28. package/configure/lib/hotspot-palette.js.map +1 -1
  29. package/configure/lib/hotspot-polygon.js +213 -318
  30. package/configure/lib/hotspot-polygon.js.map +1 -1
  31. package/configure/lib/hotspot-rectangle.js +129 -193
  32. package/configure/lib/hotspot-rectangle.js.map +1 -1
  33. package/configure/lib/icons.js +1 -1
  34. package/configure/lib/icons.js.map +1 -1
  35. package/configure/lib/image-konva.js +47 -87
  36. package/configure/lib/image-konva.js.map +1 -1
  37. package/configure/lib/index.js +163 -223
  38. package/configure/lib/index.js.map +1 -1
  39. package/configure/lib/root.js +302 -394
  40. package/configure/lib/root.js.map +1 -1
  41. package/configure/lib/shapes/circle.js +70 -102
  42. package/configure/lib/shapes/circle.js.map +1 -1
  43. package/configure/lib/shapes/index.js +5 -13
  44. package/configure/lib/shapes/index.js.map +1 -1
  45. package/configure/lib/shapes/polygon.js +65 -97
  46. package/configure/lib/shapes/polygon.js.map +1 -1
  47. package/configure/lib/shapes/rectagle.js +70 -102
  48. package/configure/lib/shapes/rectagle.js.map +1 -1
  49. package/configure/lib/shapes/utils.js +3 -9
  50. package/configure/lib/shapes/utils.js.map +1 -1
  51. package/configure/lib/upload-control.js +26 -53
  52. package/configure/lib/upload-control.js.map +1 -1
  53. package/configure/lib/utils.js +85 -138
  54. package/configure/lib/utils.js.map +1 -1
  55. package/configure/package.json +11 -10
  56. package/configure/src/__tests__/index.test.js +11 -5
  57. package/configure/src/button.jsx +12 -20
  58. package/configure/src/hotspot-circle.jsx +5 -18
  59. package/configure/src/hotspot-container.jsx +82 -98
  60. package/configure/src/hotspot-drawable.jsx +43 -45
  61. package/configure/src/hotspot-palette.jsx +45 -37
  62. package/configure/src/hotspot-polygon.jsx +4 -20
  63. package/configure/src/hotspot-rectangle.jsx +4 -17
  64. package/configure/src/index.js +12 -2
  65. package/configure/src/root.jsx +85 -79
  66. package/configure/src/upload-control.jsx +6 -16
  67. package/controller/CHANGELOG.md +52 -0
  68. package/controller/lib/__tests__/index.test.js +586 -0
  69. package/controller/lib/__tests__/utils.test.js +8 -0
  70. package/controller/lib/defaults.js +3 -4
  71. package/controller/lib/defaults.js.map +1 -1
  72. package/controller/lib/index.js +152 -206
  73. package/controller/lib/index.js.map +1 -1
  74. package/controller/lib/utils.js +15 -35
  75. package/controller/lib/utils.js.map +1 -1
  76. package/controller/package.json +2 -2
  77. package/docs/demo/pie.manifest.json +11 -0
  78. package/lib/__tests__/container.test.js +221 -0
  79. package/lib/__tests__/index.test.js +113 -0
  80. package/lib/__tests__/polygon.test.js +245 -0
  81. package/lib/__tests__/rectangle.test.js +236 -0
  82. package/lib/__tests__/session-updater.test.js +69 -0
  83. package/lib/hotspot/circle.js +111 -170
  84. package/lib/hotspot/circle.js.map +1 -1
  85. package/lib/hotspot/container.js +175 -261
  86. package/lib/hotspot/container.js.map +1 -1
  87. package/lib/hotspot/icons.js +1 -1
  88. package/lib/hotspot/icons.js.map +1 -1
  89. package/lib/hotspot/image-konva-tooltip.js +66 -113
  90. package/lib/hotspot/image-konva-tooltip.js.map +1 -1
  91. package/lib/hotspot/index.js +136 -199
  92. package/lib/hotspot/index.js.map +1 -1
  93. package/lib/hotspot/polygon.js +151 -215
  94. package/lib/hotspot/polygon.js.map +1 -1
  95. package/lib/hotspot/rectangle.js +130 -186
  96. package/lib/hotspot/rectangle.js.map +1 -1
  97. package/lib/index.js +188 -257
  98. package/lib/index.js.map +1 -1
  99. package/lib/session-updater.js +13 -19
  100. package/lib/session-updater.js.map +1 -1
  101. package/package.json +14 -11
  102. package/src/hotspot/circle.jsx +2 -13
  103. package/src/hotspot/container.jsx +35 -50
  104. package/src/hotspot/index.jsx +16 -28
  105. package/src/hotspot/polygon.jsx +4 -13
  106. package/src/hotspot/rectangle.jsx +4 -13
  107. package/src/index.js +21 -12
  108. package/LICENSE.md +0 -5
  109. package/configure/node_modules/debug/CHANGELOG.md +0 -395
  110. package/configure/node_modules/debug/LICENSE +0 -19
  111. package/configure/node_modules/debug/README.md +0 -437
  112. package/configure/node_modules/debug/node.js +0 -1
  113. package/configure/node_modules/debug/package.json +0 -51
  114. package/configure/node_modules/debug/src/browser.js +0 -180
  115. package/configure/node_modules/debug/src/common.js +0 -249
  116. package/configure/node_modules/debug/src/index.js +0 -12
  117. package/configure/node_modules/debug/src/node.js +0 -177
@@ -0,0 +1,245 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
5
+ var _react = _interopRequireDefault(require("react"));
6
+ var _enzyme = require("enzyme");
7
+ var _enzymeToJson = _interopRequireDefault(require("enzyme-to-json"));
8
+ var _konva = _interopRequireDefault(require("konva"));
9
+ var _reactKonva = require("react-konva");
10
+ var _testUtils = require("@pie-lib/test-utils");
11
+ var _polygon = _interopRequireDefault(require("../hotspot/polygon"));
12
+ var _imageKonvaTooltip = _interopRequireDefault(require("../hotspot/image-konva-tooltip"));
13
+ var _icons = require("../hotspot/icons");
14
+ _konva.default.isBrowser = false;
15
+ describe('Polygon', () => {
16
+ let onClick, wrapper;
17
+ const mkWrapper = (opts = {}) => {
18
+ opts = {
19
+ classes: {
20
+ base: 'base'
21
+ },
22
+ height: 200,
23
+ hotspotColor: 'rgba(137, 183, 244, 0.65)',
24
+ id: '1',
25
+ isCorrect: false,
26
+ isEvaluateMode: false,
27
+ evaluateText: null,
28
+ disabled: false,
29
+ outlineColor: 'blue',
30
+ selected: false,
31
+ points: [{
32
+ x: 94,
33
+ y: 4
34
+ }, {
35
+ x: 89,
36
+ y: 4
37
+ }, {
38
+ x: 36,
39
+ y: 40
40
+ }],
41
+ ...opts
42
+ };
43
+ return (0, _enzyme.shallow)(/*#__PURE__*/_react.default.createElement(_polygon.default, (0, _extends2.default)({}, opts, {
44
+ onClick: onClick
45
+ })));
46
+ };
47
+ beforeEach(() => {
48
+ onClick = jest.fn();
49
+ wrapper = mkWrapper();
50
+ });
51
+ describe('snapshots', () => {
52
+ describe('outline color', () => {
53
+ it('renders', () => {
54
+ const wrapper = mkWrapper({
55
+ outlineColor: 'red'
56
+ });
57
+ expect((0, _enzymeToJson.default)(wrapper)).toMatchSnapshot();
58
+ });
59
+ });
60
+ describe('outline width', () => {
61
+ it('renders with default border width', () => {
62
+ const wrapper = mkWrapper();
63
+ expect((0, _enzymeToJson.default)(wrapper)).toMatchSnapshot();
64
+ });
65
+ it('renders with given border width', () => {
66
+ const wrapper = mkWrapper({
67
+ strokeWidth: 10
68
+ });
69
+ expect((0, _enzymeToJson.default)(wrapper)).toMatchSnapshot();
70
+ });
71
+ });
72
+ describe('hotspot color', () => {
73
+ it('renders', () => {
74
+ const wrapper = mkWrapper({
75
+ hotspotColor: 'rgba(217, 30, 24, 0.65)'
76
+ });
77
+ expect((0, _enzymeToJson.default)(wrapper)).toMatchSnapshot();
78
+ });
79
+ });
80
+ describe('evaluate with correct answer', () => {
81
+ it('renders', () => {
82
+ const wrapper = mkWrapper({
83
+ isEvaluateMode: true,
84
+ isCorrect: true,
85
+ evaluateText: 'Correctly\nselected'
86
+ });
87
+ expect((0, _enzymeToJson.default)(wrapper)).toMatchSnapshot();
88
+ });
89
+ });
90
+ });
91
+ describe('in evaluate mode', () => {
92
+ const defaultModel = {
93
+ height: 200,
94
+ hotspotColor: 'rgba(137, 183, 244, 0.65)',
95
+ id: '1',
96
+ isCorrect: false,
97
+ isEvaluateMode: true,
98
+ evaluateText: null,
99
+ disabled: true,
100
+ outlineColor: 'blue',
101
+ strokeWidth: 5,
102
+ selected: false,
103
+ points: [{
104
+ x: 94,
105
+ y: 4
106
+ }, {
107
+ x: 89,
108
+ y: 4
109
+ }, {
110
+ x: 36,
111
+ y: 40
112
+ }],
113
+ markAsCorrect: false,
114
+ showCorrectEnabled: false,
115
+ onClick
116
+ };
117
+ const getComponents = model => {
118
+ const testWrapper = (0, _testUtils.shallowChild)(_polygon.default, {
119
+ ...defaultModel,
120
+ ...model
121
+ }, 1);
122
+ const polygonComponent = testWrapper();
123
+ const lineComponent = polygonComponent.find(_reactKonva.Line);
124
+ return {
125
+ polygonComponent,
126
+ lineComponent
127
+ };
128
+ };
129
+ describe('when correctly selected', () => {
130
+ const {
131
+ polygonComponent,
132
+ lineComponent
133
+ } = getComponents({
134
+ selected: true,
135
+ isCorrect: true
136
+ });
137
+ it('should have a blue outline', () => {
138
+ expect(lineComponent.prop('stroke')).toEqual('blue');
139
+ expect(lineComponent.prop('strokeWidth')).toEqual(defaultModel.strokeWidth);
140
+ });
141
+ it('should have a green checkmark icon', () => {
142
+ const imgComponent = polygonComponent.find(_imageKonvaTooltip.default);
143
+ expect(imgComponent.length).toEqual(1);
144
+ expect(imgComponent.prop('src')).toEqual(_icons.faCorrect);
145
+ });
146
+ });
147
+ describe('when correctly not selected', () => {
148
+ const {
149
+ polygonComponent,
150
+ lineComponent
151
+ } = getComponents({
152
+ selected: false,
153
+ isCorrect: true
154
+ });
155
+ it('should have no outline', () => {
156
+ expect(lineComponent.prop('strokeWidth')).toEqual(0);
157
+ });
158
+ it('should have no icon', () => {
159
+ const imgComponent = polygonComponent.find(_imageKonvaTooltip.default);
160
+ expect(imgComponent.length).toEqual(0);
161
+ });
162
+ });
163
+ describe('when incorrectly selected', () => {
164
+ const {
165
+ polygonComponent,
166
+ lineComponent
167
+ } = getComponents({
168
+ selected: true,
169
+ isCorrect: false
170
+ });
171
+ it('should have a red outline', () => {
172
+ expect(lineComponent.prop('stroke')).toEqual('red');
173
+ expect(lineComponent.prop('strokeWidth')).toEqual(defaultModel.strokeWidth);
174
+ });
175
+ it('should have a red x icon', () => {
176
+ const imgComponent = polygonComponent.find(_imageKonvaTooltip.default);
177
+ expect(imgComponent.length).toEqual(1);
178
+ expect(imgComponent.prop('src')).toEqual(_icons.faWrong);
179
+ });
180
+ });
181
+ describe('when incorrectly not selected', () => {
182
+ const {
183
+ polygonComponent,
184
+ lineComponent
185
+ } = getComponents({
186
+ selected: false,
187
+ isCorrect: false
188
+ });
189
+ it('should have no outline', () => {
190
+ expect(lineComponent.prop('strokeWidth')).toEqual(0);
191
+ });
192
+ it('should have a red x icon', () => {
193
+ const imgComponent = polygonComponent.find(_imageKonvaTooltip.default);
194
+ expect(imgComponent.length).toEqual(1);
195
+ expect(imgComponent.prop('src')).toEqual(_icons.faWrong);
196
+ });
197
+ });
198
+ describe('when showing correct answer (showCorrectEnabled = true)', () => {
199
+ it('should have a green outline', () => {
200
+ const {
201
+ lineComponent
202
+ } = getComponents({
203
+ showCorrectEnabled: true,
204
+ markAsCorrect: true
205
+ });
206
+ expect(lineComponent.prop('stroke')).toEqual('green');
207
+ expect(lineComponent.prop('strokeWidth')).toEqual(defaultModel.strokeWidth);
208
+ });
209
+ it('should have a green checkmark icon', () => {
210
+ const {
211
+ polygonComponent
212
+ } = getComponents({
213
+ showCorrectEnabled: true,
214
+ markAsCorrect: true
215
+ });
216
+ const imgComponent = polygonComponent.find(_imageKonvaTooltip.default);
217
+ expect(imgComponent.prop('src')).toEqual(_icons.faCorrect);
218
+ });
219
+ it('should not be selected if the answer is incorrect', () => {
220
+ const {
221
+ lineComponent
222
+ } = getComponents({
223
+ showCorrectEnabled: true,
224
+ markAsCorrect: false,
225
+ selected: true,
226
+ isCorrect: false
227
+ });
228
+ expect(lineComponent.prop('strokeWidth')).toEqual(0);
229
+ });
230
+ it('should not render an icon if the answer is incorrect', () => {
231
+ const {
232
+ polygonComponent
233
+ } = getComponents({
234
+ showCorrectEnabled: true,
235
+ markAsCorrect: false,
236
+ selected: true,
237
+ isCorrect: false
238
+ });
239
+ const imgComponent = polygonComponent.find(_imageKonvaTooltip.default);
240
+ expect(imgComponent.length).toEqual(0);
241
+ });
242
+ });
243
+ });
244
+ });
245
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9lbnp5bWUiLCJfZW56eW1lVG9Kc29uIiwiX2tvbnZhIiwiX3JlYWN0S29udmEiLCJfdGVzdFV0aWxzIiwiX3BvbHlnb24iLCJfaW1hZ2VLb252YVRvb2x0aXAiLCJfaWNvbnMiLCJLb252YSIsImlzQnJvd3NlciIsImRlc2NyaWJlIiwib25DbGljayIsIndyYXBwZXIiLCJta1dyYXBwZXIiLCJvcHRzIiwiY2xhc3NlcyIsImJhc2UiLCJoZWlnaHQiLCJob3RzcG90Q29sb3IiLCJpZCIsImlzQ29ycmVjdCIsImlzRXZhbHVhdGVNb2RlIiwiZXZhbHVhdGVUZXh0IiwiZGlzYWJsZWQiLCJvdXRsaW5lQ29sb3IiLCJzZWxlY3RlZCIsInBvaW50cyIsIngiLCJ5Iiwic2hhbGxvdyIsImRlZmF1bHQiLCJjcmVhdGVFbGVtZW50IiwiX2V4dGVuZHMyIiwiYmVmb3JlRWFjaCIsImplc3QiLCJmbiIsIml0IiwiZXhwZWN0IiwidG9Kc29uIiwidG9NYXRjaFNuYXBzaG90Iiwic3Ryb2tlV2lkdGgiLCJkZWZhdWx0TW9kZWwiLCJtYXJrQXNDb3JyZWN0Iiwic2hvd0NvcnJlY3RFbmFibGVkIiwiZ2V0Q29tcG9uZW50cyIsIm1vZGVsIiwidGVzdFdyYXBwZXIiLCJzaGFsbG93Q2hpbGQiLCJQb2x5Z29uIiwicG9seWdvbkNvbXBvbmVudCIsImxpbmVDb21wb25lbnQiLCJmaW5kIiwiTGluZSIsInByb3AiLCJ0b0VxdWFsIiwiaW1nQ29tcG9uZW50IiwiSW1hZ2VDb21wb25lbnQiLCJsZW5ndGgiLCJmYUNvcnJlY3QiLCJmYVdyb25nIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9wb2x5Z29uLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBzaGFsbG93IH0gZnJvbSAnZW56eW1lJztcbmltcG9ydCB0b0pzb24gZnJvbSAnZW56eW1lLXRvLWpzb24nO1xuaW1wb3J0IEtvbnZhIGZyb20gJ2tvbnZhJztcbmltcG9ydCB7IExpbmUgfSBmcm9tICdyZWFjdC1rb252YSc7XG5cbmltcG9ydCB7IHNoYWxsb3dDaGlsZCB9IGZyb20gJ0BwaWUtbGliL3Rlc3QtdXRpbHMnO1xuXG5pbXBvcnQgUG9seWdvbiBmcm9tICcuLi9ob3RzcG90L3BvbHlnb24nO1xuaW1wb3J0IEltYWdlQ29tcG9uZW50IGZyb20gJy4uL2hvdHNwb3QvaW1hZ2Uta29udmEtdG9vbHRpcCc7XG5pbXBvcnQgeyBmYUNvcnJlY3QsIGZhV3JvbmcgfSBmcm9tICcuLi9ob3RzcG90L2ljb25zJztcblxuS29udmEuaXNCcm93c2VyID0gZmFsc2U7XG5cbmRlc2NyaWJlKCdQb2x5Z29uJywgKCkgPT4ge1xuICBsZXQgb25DbGljaywgd3JhcHBlcjtcblxuICBjb25zdCBta1dyYXBwZXIgPSAob3B0cyA9IHt9KSA9PiB7XG4gICAgb3B0cyA9IHtcbiAgICAgIGNsYXNzZXM6IHsgYmFzZTogJ2Jhc2UnIH0sXG4gICAgICBoZWlnaHQ6IDIwMCxcbiAgICAgIGhvdHNwb3RDb2xvcjogJ3JnYmEoMTM3LCAxODMsIDI0NCwgMC42NSknLFxuICAgICAgaWQ6ICcxJyxcbiAgICAgIGlzQ29ycmVjdDogZmFsc2UsXG4gICAgICBpc0V2YWx1YXRlTW9kZTogZmFsc2UsXG4gICAgICBldmFsdWF0ZVRleHQ6IG51bGwsXG4gICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICBvdXRsaW5lQ29sb3I6ICdibHVlJyxcbiAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgIHBvaW50czogW1xuICAgICAgICB7IHg6IDk0LCB5OiA0IH0sXG4gICAgICAgIHsgeDogODksIHk6IDQgfSxcbiAgICAgICAgeyB4OiAzNiwgeTogNDAgfSxcbiAgICAgIF0sXG4gICAgICAuLi5vcHRzLFxuICAgIH07XG5cbiAgICByZXR1cm4gc2hhbGxvdyg8UG9seWdvbiB7Li4ub3B0c30gb25DbGljaz17b25DbGlja30gLz4pO1xuICB9O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIG9uQ2xpY2sgPSBqZXN0LmZuKCk7XG4gICAgd3JhcHBlciA9IG1rV3JhcHBlcigpO1xuICB9KTtcblxuICBkZXNjcmliZSgnc25hcHNob3RzJywgKCkgPT4ge1xuICAgIGRlc2NyaWJlKCdvdXRsaW5lIGNvbG9yJywgKCkgPT4ge1xuICAgICAgaXQoJ3JlbmRlcnMnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSBta1dyYXBwZXIoeyBvdXRsaW5lQ29sb3I6ICdyZWQnIH0pO1xuICAgICAgICBleHBlY3QodG9Kc29uKHdyYXBwZXIpKS50b01hdGNoU25hcHNob3QoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ291dGxpbmUgd2lkdGgnLCAoKSA9PiB7XG4gICAgICBpdCgncmVuZGVycyB3aXRoIGRlZmF1bHQgYm9yZGVyIHdpZHRoJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB3cmFwcGVyID0gbWtXcmFwcGVyKCk7XG4gICAgICAgIGV4cGVjdCh0b0pzb24od3JhcHBlcikpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZW5kZXJzIHdpdGggZ2l2ZW4gYm9yZGVyIHdpZHRoJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB3cmFwcGVyID0gbWtXcmFwcGVyKHsgc3Ryb2tlV2lkdGg6IDEwIH0pO1xuICAgICAgICBleHBlY3QodG9Kc29uKHdyYXBwZXIpKS50b01hdGNoU25hcHNob3QoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2hvdHNwb3QgY29sb3InLCAoKSA9PiB7XG4gICAgICBpdCgncmVuZGVycycsICgpID0+IHtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IG1rV3JhcHBlcih7IGhvdHNwb3RDb2xvcjogJ3JnYmEoMjE3LCAzMCwgMjQsIDAuNjUpJyB9KTtcbiAgICAgICAgZXhwZWN0KHRvSnNvbih3cmFwcGVyKSkudG9NYXRjaFNuYXBzaG90KCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdldmFsdWF0ZSB3aXRoIGNvcnJlY3QgYW5zd2VyJywgKCkgPT4ge1xuICAgICAgaXQoJ3JlbmRlcnMnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSBta1dyYXBwZXIoeyBpc0V2YWx1YXRlTW9kZTogdHJ1ZSwgaXNDb3JyZWN0OiB0cnVlLCBldmFsdWF0ZVRleHQ6ICdDb3JyZWN0bHlcXG5zZWxlY3RlZCcgfSk7XG4gICAgICAgIGV4cGVjdCh0b0pzb24od3JhcHBlcikpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbiBldmFsdWF0ZSBtb2RlJywgKCkgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRNb2RlbCA9IHtcbiAgICAgIGhlaWdodDogMjAwLFxuICAgICAgaG90c3BvdENvbG9yOiAncmdiYSgxMzcsIDE4MywgMjQ0LCAwLjY1KScsXG4gICAgICBpZDogJzEnLFxuICAgICAgaXNDb3JyZWN0OiBmYWxzZSxcbiAgICAgIGlzRXZhbHVhdGVNb2RlOiB0cnVlLFxuICAgICAgZXZhbHVhdGVUZXh0OiBudWxsLFxuICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICBvdXRsaW5lQ29sb3I6ICdibHVlJyxcbiAgICAgIHN0cm9rZVdpZHRoOiA1LFxuICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgcG9pbnRzOiBbXG4gICAgICAgIHsgeDogOTQsIHk6IDQgfSxcbiAgICAgICAgeyB4OiA4OSwgeTogNCB9LFxuICAgICAgICB7IHg6IDM2LCB5OiA0MCB9LFxuICAgICAgXSxcbiAgICAgIG1hcmtBc0NvcnJlY3Q6IGZhbHNlLFxuICAgICAgc2hvd0NvcnJlY3RFbmFibGVkOiBmYWxzZSxcbiAgICAgIG9uQ2xpY2ssXG4gICAgfTtcblxuICAgIGNvbnN0IGdldENvbXBvbmVudHMgPSAobW9kZWwpID0+IHtcbiAgICAgIGNvbnN0IHRlc3RXcmFwcGVyID0gc2hhbGxvd0NoaWxkKFxuICAgICAgICBQb2x5Z29uLFxuICAgICAgICB7XG4gICAgICAgICAgLi4uZGVmYXVsdE1vZGVsLFxuICAgICAgICAgIC4uLm1vZGVsLFxuICAgICAgICB9LFxuICAgICAgICAxLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHBvbHlnb25Db21wb25lbnQgPSB0ZXN0V3JhcHBlcigpO1xuICAgICAgY29uc3QgbGluZUNvbXBvbmVudCA9IHBvbHlnb25Db21wb25lbnQuZmluZChMaW5lKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvbHlnb25Db21wb25lbnQsXG4gICAgICAgIGxpbmVDb21wb25lbnQsXG4gICAgICB9O1xuICAgIH07XG5cbiAgICBkZXNjcmliZSgnd2hlbiBjb3JyZWN0bHkgc2VsZWN0ZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHBvbHlnb25Db21wb25lbnQsIGxpbmVDb21wb25lbnQgfSA9IGdldENvbXBvbmVudHMoe1xuICAgICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICAgICAgaXNDb3JyZWN0OiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaGF2ZSBhIGJsdWUgb3V0bGluZScsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KGxpbmVDb21wb25lbnQucHJvcCgnc3Ryb2tlJykpLnRvRXF1YWwoJ2JsdWUnKTtcbiAgICAgICAgZXhwZWN0KGxpbmVDb21wb25lbnQucHJvcCgnc3Ryb2tlV2lkdGgnKSkudG9FcXVhbChkZWZhdWx0TW9kZWwuc3Ryb2tlV2lkdGgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaGF2ZSBhIGdyZWVuIGNoZWNrbWFyayBpY29uJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBpbWdDb21wb25lbnQgPSBwb2x5Z29uQ29tcG9uZW50LmZpbmQoSW1hZ2VDb21wb25lbnQpO1xuICAgICAgICBleHBlY3QoaW1nQ29tcG9uZW50Lmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICAgICAgZXhwZWN0KGltZ0NvbXBvbmVudC5wcm9wKCdzcmMnKSkudG9FcXVhbChmYUNvcnJlY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnd2hlbiBjb3JyZWN0bHkgbm90IHNlbGVjdGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBwb2x5Z29uQ29tcG9uZW50LCBsaW5lQ29tcG9uZW50IH0gPSBnZXRDb21wb25lbnRzKHtcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICBpc0NvcnJlY3Q6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYXZlIG5vIG91dGxpbmUnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChsaW5lQ29tcG9uZW50LnByb3AoJ3N0cm9rZVdpZHRoJykpLnRvRXF1YWwoMCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYXZlIG5vIGljb24nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGltZ0NvbXBvbmVudCA9IHBvbHlnb25Db21wb25lbnQuZmluZChJbWFnZUNvbXBvbmVudCk7XG4gICAgICAgIGV4cGVjdChpbWdDb21wb25lbnQubGVuZ3RoKS50b0VxdWFsKDApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnd2hlbiBpbmNvcnJlY3RseSBzZWxlY3RlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcG9seWdvbkNvbXBvbmVudCwgbGluZUNvbXBvbmVudCB9ID0gZ2V0Q29tcG9uZW50cyh7XG4gICAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgICBpc0NvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaGF2ZSBhIHJlZCBvdXRsaW5lJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QobGluZUNvbXBvbmVudC5wcm9wKCdzdHJva2UnKSkudG9FcXVhbCgncmVkJyk7XG4gICAgICAgIGV4cGVjdChsaW5lQ29tcG9uZW50LnByb3AoJ3N0cm9rZVdpZHRoJykpLnRvRXF1YWwoZGVmYXVsdE1vZGVsLnN0cm9rZVdpZHRoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGhhdmUgYSByZWQgeCBpY29uJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBpbWdDb21wb25lbnQgPSBwb2x5Z29uQ29tcG9uZW50LmZpbmQoSW1hZ2VDb21wb25lbnQpO1xuICAgICAgICBleHBlY3QoaW1nQ29tcG9uZW50Lmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICAgICAgZXhwZWN0KGltZ0NvbXBvbmVudC5wcm9wKCdzcmMnKSkudG9FcXVhbChmYVdyb25nKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3doZW4gaW5jb3JyZWN0bHkgbm90IHNlbGVjdGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBwb2x5Z29uQ29tcG9uZW50LCBsaW5lQ29tcG9uZW50IH0gPSBnZXRDb21wb25lbnRzKHtcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICBpc0NvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaGF2ZSBubyBvdXRsaW5lJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QobGluZUNvbXBvbmVudC5wcm9wKCdzdHJva2VXaWR0aCcpKS50b0VxdWFsKDApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaGF2ZSBhIHJlZCB4IGljb24nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGltZ0NvbXBvbmVudCA9IHBvbHlnb25Db21wb25lbnQuZmluZChJbWFnZUNvbXBvbmVudCk7XG4gICAgICAgIGV4cGVjdChpbWdDb21wb25lbnQubGVuZ3RoKS50b0VxdWFsKDEpO1xuICAgICAgICBleHBlY3QoaW1nQ29tcG9uZW50LnByb3AoJ3NyYycpKS50b0VxdWFsKGZhV3JvbmcpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnd2hlbiBzaG93aW5nIGNvcnJlY3QgYW5zd2VyIChzaG93Q29ycmVjdEVuYWJsZWQgPSB0cnVlKScsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgaGF2ZSBhIGdyZWVuIG91dGxpbmUnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgbGluZUNvbXBvbmVudCB9ID0gZ2V0Q29tcG9uZW50cyh7XG4gICAgICAgICAgc2hvd0NvcnJlY3RFbmFibGVkOiB0cnVlLFxuICAgICAgICAgIG1hcmtBc0NvcnJlY3Q6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBleHBlY3QobGluZUNvbXBvbmVudC5wcm9wKCdzdHJva2UnKSkudG9FcXVhbCgnZ3JlZW4nKTtcbiAgICAgICAgZXhwZWN0KGxpbmVDb21wb25lbnQucHJvcCgnc3Ryb2tlV2lkdGgnKSkudG9FcXVhbChkZWZhdWx0TW9kZWwuc3Ryb2tlV2lkdGgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaGF2ZSBhIGdyZWVuIGNoZWNrbWFyayBpY29uJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB7IHBvbHlnb25Db21wb25lbnQgfSA9IGdldENvbXBvbmVudHMoe1xuICAgICAgICAgIHNob3dDb3JyZWN0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBtYXJrQXNDb3JyZWN0OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgaW1nQ29tcG9uZW50ID0gcG9seWdvbkNvbXBvbmVudC5maW5kKEltYWdlQ29tcG9uZW50KTtcbiAgICAgICAgZXhwZWN0KGltZ0NvbXBvbmVudC5wcm9wKCdzcmMnKSkudG9FcXVhbChmYUNvcnJlY3QpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbm90IGJlIHNlbGVjdGVkIGlmIHRoZSBhbnN3ZXIgaXMgaW5jb3JyZWN0JywgKCkgPT4ge1xuICAgICAgICBjb25zdCB7IGxpbmVDb21wb25lbnQgfSA9IGdldENvbXBvbmVudHMoe1xuICAgICAgICAgIHNob3dDb3JyZWN0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBtYXJrQXNDb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICAgICAgICBpc0NvcnJlY3Q6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KGxpbmVDb21wb25lbnQucHJvcCgnc3Ryb2tlV2lkdGgnKSkudG9FcXVhbCgwKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgYW4gaWNvbiBpZiB0aGUgYW5zd2VyIGlzIGluY29ycmVjdCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBwb2x5Z29uQ29tcG9uZW50IH0gPSBnZXRDb21wb25lbnRzKHtcbiAgICAgICAgICBzaG93Q29ycmVjdEVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgbWFya0FzQ29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgc2VsZWN0ZWQ6IHRydWUsXG4gICAgICAgICAgaXNDb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGltZ0NvbXBvbmVudCA9IHBvbHlnb25Db21wb25lbnQuZmluZChJbWFnZUNvbXBvbmVudCk7XG4gICAgICAgIGV4cGVjdChpbWdDb21wb25lbnQubGVuZ3RoKS50b0VxdWFsKDApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxhQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxNQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxXQUFBLEdBQUFKLE9BQUE7QUFFQSxJQUFBSyxVQUFBLEdBQUFMLE9BQUE7QUFFQSxJQUFBTSxRQUFBLEdBQUFQLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTyxrQkFBQSxHQUFBUixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVEsTUFBQSxHQUFBUixPQUFBO0FBRUFTLGNBQUssQ0FBQ0MsU0FBUyxHQUFHLEtBQUs7QUFFdkJDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsTUFBTTtFQUN4QixJQUFJQyxPQUFPLEVBQUVDLE9BQU87RUFFcEIsTUFBTUMsU0FBUyxHQUFHQSxDQUFDQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUs7SUFDL0JBLElBQUksR0FBRztNQUNMQyxPQUFPLEVBQUU7UUFBRUMsSUFBSSxFQUFFO01BQU8sQ0FBQztNQUN6QkMsTUFBTSxFQUFFLEdBQUc7TUFDWEMsWUFBWSxFQUFFLDJCQUEyQjtNQUN6Q0MsRUFBRSxFQUFFLEdBQUc7TUFDUEMsU0FBUyxFQUFFLEtBQUs7TUFDaEJDLGNBQWMsRUFBRSxLQUFLO01BQ3JCQyxZQUFZLEVBQUUsSUFBSTtNQUNsQkMsUUFBUSxFQUFFLEtBQUs7TUFDZkMsWUFBWSxFQUFFLE1BQU07TUFDcEJDLFFBQVEsRUFBRSxLQUFLO01BQ2ZDLE1BQU0sRUFBRSxDQUNOO1FBQUVDLENBQUMsRUFBRSxFQUFFO1FBQUVDLENBQUMsRUFBRTtNQUFFLENBQUMsRUFDZjtRQUFFRCxDQUFDLEVBQUUsRUFBRTtRQUFFQyxDQUFDLEVBQUU7TUFBRSxDQUFDLEVBQ2Y7UUFBRUQsQ0FBQyxFQUFFLEVBQUU7UUFBRUMsQ0FBQyxFQUFFO01BQUcsQ0FBQyxDQUNqQjtNQUNELEdBQUdkO0lBQ0wsQ0FBQztJQUVELE9BQU8sSUFBQWUsZUFBTyxlQUFDaEMsTUFBQSxDQUFBaUMsT0FBQSxDQUFBQyxhQUFBLENBQUMxQixRQUFBLENBQUF5QixPQUFPLE1BQUFFLFNBQUEsQ0FBQUYsT0FBQSxNQUFLaEIsSUFBSTtNQUFFSCxPQUFPLEVBQUVBO0lBQVEsRUFBRSxDQUFDLENBQUM7RUFDekQsQ0FBQztFQUVEc0IsVUFBVSxDQUFDLE1BQU07SUFDZnRCLE9BQU8sR0FBR3VCLElBQUksQ0FBQ0MsRUFBRSxDQUFDLENBQUM7SUFDbkJ2QixPQUFPLEdBQUdDLFNBQVMsQ0FBQyxDQUFDO0VBQ3ZCLENBQUMsQ0FBQztFQUVGSCxRQUFRLENBQUMsV0FBVyxFQUFFLE1BQU07SUFDMUJBLFFBQVEsQ0FBQyxlQUFlLEVBQUUsTUFBTTtNQUM5QjBCLEVBQUUsQ0FBQyxTQUFTLEVBQUUsTUFBTTtRQUNsQixNQUFNeEIsT0FBTyxHQUFHQyxTQUFTLENBQUM7VUFBRVcsWUFBWSxFQUFFO1FBQU0sQ0FBQyxDQUFDO1FBQ2xEYSxNQUFNLENBQUMsSUFBQUMscUJBQU0sRUFBQzFCLE9BQU8sQ0FBQyxDQUFDLENBQUMyQixlQUFlLENBQUMsQ0FBQztNQUMzQyxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRjdCLFFBQVEsQ0FBQyxlQUFlLEVBQUUsTUFBTTtNQUM5QjBCLEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRSxNQUFNO1FBQzVDLE1BQU14QixPQUFPLEdBQUdDLFNBQVMsQ0FBQyxDQUFDO1FBQzNCd0IsTUFBTSxDQUFDLElBQUFDLHFCQUFNLEVBQUMxQixPQUFPLENBQUMsQ0FBQyxDQUFDMkIsZUFBZSxDQUFDLENBQUM7TUFDM0MsQ0FBQyxDQUFDO01BRUZILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSxNQUFNO1FBQzFDLE1BQU14QixPQUFPLEdBQUdDLFNBQVMsQ0FBQztVQUFFMkIsV0FBVyxFQUFFO1FBQUcsQ0FBQyxDQUFDO1FBQzlDSCxNQUFNLENBQUMsSUFBQUMscUJBQU0sRUFBQzFCLE9BQU8sQ0FBQyxDQUFDLENBQUMyQixlQUFlLENBQUMsQ0FBQztNQUMzQyxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRjdCLFFBQVEsQ0FBQyxlQUFlLEVBQUUsTUFBTTtNQUM5QjBCLEVBQUUsQ0FBQyxTQUFTLEVBQUUsTUFBTTtRQUNsQixNQUFNeEIsT0FBTyxHQUFHQyxTQUFTLENBQUM7VUFBRUssWUFBWSxFQUFFO1FBQTBCLENBQUMsQ0FBQztRQUN0RW1CLE1BQU0sQ0FBQyxJQUFBQyxxQkFBTSxFQUFDMUIsT0FBTyxDQUFDLENBQUMsQ0FBQzJCLGVBQWUsQ0FBQyxDQUFDO01BQzNDLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGN0IsUUFBUSxDQUFDLDhCQUE4QixFQUFFLE1BQU07TUFDN0MwQixFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU07UUFDbEIsTUFBTXhCLE9BQU8sR0FBR0MsU0FBUyxDQUFDO1VBQUVRLGNBQWMsRUFBRSxJQUFJO1VBQUVELFNBQVMsRUFBRSxJQUFJO1VBQUVFLFlBQVksRUFBRTtRQUFzQixDQUFDLENBQUM7UUFDekdlLE1BQU0sQ0FBQyxJQUFBQyxxQkFBTSxFQUFDMUIsT0FBTyxDQUFDLENBQUMsQ0FBQzJCLGVBQWUsQ0FBQyxDQUFDO01BQzNDLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGN0IsUUFBUSxDQUFDLGtCQUFrQixFQUFFLE1BQU07SUFDakMsTUFBTStCLFlBQVksR0FBRztNQUNuQnhCLE1BQU0sRUFBRSxHQUFHO01BQ1hDLFlBQVksRUFBRSwyQkFBMkI7TUFDekNDLEVBQUUsRUFBRSxHQUFHO01BQ1BDLFNBQVMsRUFBRSxLQUFLO01BQ2hCQyxjQUFjLEVBQUUsSUFBSTtNQUNwQkMsWUFBWSxFQUFFLElBQUk7TUFDbEJDLFFBQVEsRUFBRSxJQUFJO01BQ2RDLFlBQVksRUFBRSxNQUFNO01BQ3BCZ0IsV0FBVyxFQUFFLENBQUM7TUFDZGYsUUFBUSxFQUFFLEtBQUs7TUFDZkMsTUFBTSxFQUFFLENBQ047UUFBRUMsQ0FBQyxFQUFFLEVBQUU7UUFBRUMsQ0FBQyxFQUFFO01BQUUsQ0FBQyxFQUNmO1FBQUVELENBQUMsRUFBRSxFQUFFO1FBQUVDLENBQUMsRUFBRTtNQUFFLENBQUMsRUFDZjtRQUFFRCxDQUFDLEVBQUUsRUFBRTtRQUFFQyxDQUFDLEVBQUU7TUFBRyxDQUFDLENBQ2pCO01BQ0RjLGFBQWEsRUFBRSxLQUFLO01BQ3BCQyxrQkFBa0IsRUFBRSxLQUFLO01BQ3pCaEM7SUFDRixDQUFDO0lBRUQsTUFBTWlDLGFBQWEsR0FBSUMsS0FBSyxJQUFLO01BQy9CLE1BQU1DLFdBQVcsR0FBRyxJQUFBQyx1QkFBWSxFQUM5QkMsZ0JBQU8sRUFDUDtRQUNFLEdBQUdQLFlBQVk7UUFDZixHQUFHSTtNQUNMLENBQUMsRUFDRCxDQUNGLENBQUM7TUFDRCxNQUFNSSxnQkFBZ0IsR0FBR0gsV0FBVyxDQUFDLENBQUM7TUFDdEMsTUFBTUksYUFBYSxHQUFHRCxnQkFBZ0IsQ0FBQ0UsSUFBSSxDQUFDQyxnQkFBSSxDQUFDO01BQ2pELE9BQU87UUFDTEgsZ0JBQWdCO1FBQ2hCQztNQUNGLENBQUM7SUFDSCxDQUFDO0lBRUR4QyxRQUFRLENBQUMseUJBQXlCLEVBQUUsTUFBTTtNQUN4QyxNQUFNO1FBQUV1QyxnQkFBZ0I7UUFBRUM7TUFBYyxDQUFDLEdBQUdOLGFBQWEsQ0FBQztRQUN4RG5CLFFBQVEsRUFBRSxJQUFJO1FBQ2RMLFNBQVMsRUFBRTtNQUNiLENBQUMsQ0FBQztNQUVGZ0IsRUFBRSxDQUFDLDRCQUE0QixFQUFFLE1BQU07UUFDckNDLE1BQU0sQ0FBQ2EsYUFBYSxDQUFDRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUNwRGpCLE1BQU0sQ0FBQ2EsYUFBYSxDQUFDRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDYixZQUFZLENBQUNELFdBQVcsQ0FBQztNQUM3RSxDQUFDLENBQUM7TUFFRkosRUFBRSxDQUFDLG9DQUFvQyxFQUFFLE1BQU07UUFDN0MsTUFBTW1CLFlBQVksR0FBR04sZ0JBQWdCLENBQUNFLElBQUksQ0FBQ0ssMEJBQWMsQ0FBQztRQUMxRG5CLE1BQU0sQ0FBQ2tCLFlBQVksQ0FBQ0UsTUFBTSxDQUFDLENBQUNILE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDdENqQixNQUFNLENBQUNrQixZQUFZLENBQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUNJLGdCQUFTLENBQUM7TUFDckQsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUZoRCxRQUFRLENBQUMsNkJBQTZCLEVBQUUsTUFBTTtNQUM1QyxNQUFNO1FBQUV1QyxnQkFBZ0I7UUFBRUM7TUFBYyxDQUFDLEdBQUdOLGFBQWEsQ0FBQztRQUN4RG5CLFFBQVEsRUFBRSxLQUFLO1FBQ2ZMLFNBQVMsRUFBRTtNQUNiLENBQUMsQ0FBQztNQUVGZ0IsRUFBRSxDQUFDLHdCQUF3QixFQUFFLE1BQU07UUFDakNDLE1BQU0sQ0FBQ2EsYUFBYSxDQUFDRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLENBQUMsQ0FBQztNQUN0RCxDQUFDLENBQUM7TUFFRmxCLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNO1FBQzlCLE1BQU1tQixZQUFZLEdBQUdOLGdCQUFnQixDQUFDRSxJQUFJLENBQUNLLDBCQUFjLENBQUM7UUFDMURuQixNQUFNLENBQUNrQixZQUFZLENBQUNFLE1BQU0sQ0FBQyxDQUFDSCxPQUFPLENBQUMsQ0FBQyxDQUFDO01BQ3hDLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGNUMsUUFBUSxDQUFDLDJCQUEyQixFQUFFLE1BQU07TUFDMUMsTUFBTTtRQUFFdUMsZ0JBQWdCO1FBQUVDO01BQWMsQ0FBQyxHQUFHTixhQUFhLENBQUM7UUFDeERuQixRQUFRLEVBQUUsSUFBSTtRQUNkTCxTQUFTLEVBQUU7TUFDYixDQUFDLENBQUM7TUFFRmdCLEVBQUUsQ0FBQywyQkFBMkIsRUFBRSxNQUFNO1FBQ3BDQyxNQUFNLENBQUNhLGFBQWEsQ0FBQ0csSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDbkRqQixNQUFNLENBQUNhLGFBQWEsQ0FBQ0csSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQ2IsWUFBWSxDQUFDRCxXQUFXLENBQUM7TUFDN0UsQ0FBQyxDQUFDO01BRUZKLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxNQUFNO1FBQ25DLE1BQU1tQixZQUFZLEdBQUdOLGdCQUFnQixDQUFDRSxJQUFJLENBQUNLLDBCQUFjLENBQUM7UUFDMURuQixNQUFNLENBQUNrQixZQUFZLENBQUNFLE1BQU0sQ0FBQyxDQUFDSCxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3RDakIsTUFBTSxDQUFDa0IsWUFBWSxDQUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDSyxjQUFPLENBQUM7TUFDbkQsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUZqRCxRQUFRLENBQUMsK0JBQStCLEVBQUUsTUFBTTtNQUM5QyxNQUFNO1FBQUV1QyxnQkFBZ0I7UUFBRUM7TUFBYyxDQUFDLEdBQUdOLGFBQWEsQ0FBQztRQUN4RG5CLFFBQVEsRUFBRSxLQUFLO1FBQ2ZMLFNBQVMsRUFBRTtNQUNiLENBQUMsQ0FBQztNQUVGZ0IsRUFBRSxDQUFDLHdCQUF3QixFQUFFLE1BQU07UUFDakNDLE1BQU0sQ0FBQ2EsYUFBYSxDQUFDRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLENBQUMsQ0FBQztNQUN0RCxDQUFDLENBQUM7TUFFRmxCLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxNQUFNO1FBQ25DLE1BQU1tQixZQUFZLEdBQUdOLGdCQUFnQixDQUFDRSxJQUFJLENBQUNLLDBCQUFjLENBQUM7UUFDMURuQixNQUFNLENBQUNrQixZQUFZLENBQUNFLE1BQU0sQ0FBQyxDQUFDSCxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3RDakIsTUFBTSxDQUFDa0IsWUFBWSxDQUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDSyxjQUFPLENBQUM7TUFDbkQsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUZqRCxRQUFRLENBQUMseURBQXlELEVBQUUsTUFBTTtNQUN4RTBCLEVBQUUsQ0FBQyw2QkFBNkIsRUFBRSxNQUFNO1FBQ3RDLE1BQU07VUFBRWM7UUFBYyxDQUFDLEdBQUdOLGFBQWEsQ0FBQztVQUN0Q0Qsa0JBQWtCLEVBQUUsSUFBSTtVQUN4QkQsYUFBYSxFQUFFO1FBQ2pCLENBQUMsQ0FBQztRQUNGTCxNQUFNLENBQUNhLGFBQWEsQ0FBQ0csSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDckRqQixNQUFNLENBQUNhLGFBQWEsQ0FBQ0csSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQ2IsWUFBWSxDQUFDRCxXQUFXLENBQUM7TUFDN0UsQ0FBQyxDQUFDO01BRUZKLEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRSxNQUFNO1FBQzdDLE1BQU07VUFBRWE7UUFBaUIsQ0FBQyxHQUFHTCxhQUFhLENBQUM7VUFDekNELGtCQUFrQixFQUFFLElBQUk7VUFDeEJELGFBQWEsRUFBRTtRQUNqQixDQUFDLENBQUM7UUFDRixNQUFNYSxZQUFZLEdBQUdOLGdCQUFnQixDQUFDRSxJQUFJLENBQUNLLDBCQUFjLENBQUM7UUFDMURuQixNQUFNLENBQUNrQixZQUFZLENBQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUNJLGdCQUFTLENBQUM7TUFDckQsQ0FBQyxDQUFDO01BRUZ0QixFQUFFLENBQUMsbURBQW1ELEVBQUUsTUFBTTtRQUM1RCxNQUFNO1VBQUVjO1FBQWMsQ0FBQyxHQUFHTixhQUFhLENBQUM7VUFDdENELGtCQUFrQixFQUFFLElBQUk7VUFDeEJELGFBQWEsRUFBRSxLQUFLO1VBQ3BCakIsUUFBUSxFQUFFLElBQUk7VUFDZEwsU0FBUyxFQUFFO1FBQ2IsQ0FBQyxDQUFDO1FBQ0ZpQixNQUFNLENBQUNhLGFBQWEsQ0FBQ0csSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxDQUFDLENBQUM7TUFDdEQsQ0FBQyxDQUFDO01BRUZsQixFQUFFLENBQUMsc0RBQXNELEVBQUUsTUFBTTtRQUMvRCxNQUFNO1VBQUVhO1FBQWlCLENBQUMsR0FBR0wsYUFBYSxDQUFDO1VBQ3pDRCxrQkFBa0IsRUFBRSxJQUFJO1VBQ3hCRCxhQUFhLEVBQUUsS0FBSztVQUNwQmpCLFFBQVEsRUFBRSxJQUFJO1VBQ2RMLFNBQVMsRUFBRTtRQUNiLENBQUMsQ0FBQztRQUNGLE1BQU1tQyxZQUFZLEdBQUdOLGdCQUFnQixDQUFDRSxJQUFJLENBQUNLLDBCQUFjLENBQUM7UUFDMURuQixNQUFNLENBQUNrQixZQUFZLENBQUNFLE1BQU0sQ0FBQyxDQUFDSCxPQUFPLENBQUMsQ0FBQyxDQUFDO01BQ3hDLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
@@ -0,0 +1,236 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
5
+ var _react = _interopRequireDefault(require("react"));
6
+ var _enzyme = require("enzyme");
7
+ var _enzymeToJson = _interopRequireDefault(require("enzyme-to-json"));
8
+ var _konva = _interopRequireDefault(require("konva"));
9
+ var _reactKonva = require("react-konva");
10
+ var _testUtils = require("@pie-lib/test-utils");
11
+ var _rectangle = _interopRequireDefault(require("../hotspot/rectangle"));
12
+ var _imageKonvaTooltip = _interopRequireDefault(require("../hotspot/image-konva-tooltip"));
13
+ var _icons = require("../hotspot/icons");
14
+ global.MutationObserver = class {
15
+ constructor(callback) {}
16
+ disconnect() {}
17
+ observe(element, initObject) {}
18
+ };
19
+ _konva.default.isBrowser = false;
20
+ describe('Rectangle', () => {
21
+ let onClick, wrapper;
22
+ const mkWrapper = (opts = {}) => {
23
+ opts = {
24
+ classes: {
25
+ base: 'base'
26
+ },
27
+ height: 200,
28
+ hotspotColor: 'rgba(137, 183, 244, 0.65)',
29
+ id: '1',
30
+ isCorrect: false,
31
+ isEvaluateMode: false,
32
+ evaluateText: null,
33
+ disabled: false,
34
+ outlineColor: 'blue',
35
+ selected: false,
36
+ width: 300,
37
+ x: 5,
38
+ y: 5,
39
+ ...opts
40
+ };
41
+ return (0, _enzyme.shallow)(/*#__PURE__*/_react.default.createElement(_rectangle.default, (0, _extends2.default)({}, opts, {
42
+ onClick: onClick
43
+ })));
44
+ };
45
+ beforeEach(() => {
46
+ onClick = jest.fn();
47
+ wrapper = mkWrapper();
48
+ });
49
+ describe('snapshots', () => {
50
+ describe('outline color', () => {
51
+ it('renders', () => {
52
+ const wrapper = mkWrapper({
53
+ outlineColor: 'red'
54
+ });
55
+ expect((0, _enzymeToJson.default)(wrapper)).toMatchSnapshot();
56
+ });
57
+ });
58
+ describe('outline width', () => {
59
+ it('renders with default border width', () => {
60
+ const wrapper = mkWrapper();
61
+ expect((0, _enzymeToJson.default)(wrapper)).toMatchSnapshot();
62
+ });
63
+ it('renders with given border width', () => {
64
+ const wrapper = mkWrapper({
65
+ strokeWidth: 10
66
+ });
67
+ expect((0, _enzymeToJson.default)(wrapper)).toMatchSnapshot();
68
+ });
69
+ });
70
+ describe('hotspot color', () => {
71
+ it('renders', () => {
72
+ const wrapper = mkWrapper({
73
+ hotspotColor: 'rgba(217, 30, 24, 0.65)'
74
+ });
75
+ expect((0, _enzymeToJson.default)(wrapper)).toMatchSnapshot();
76
+ });
77
+ });
78
+ describe('evaluate with correct answer', () => {
79
+ it('renders', () => {
80
+ const wrapper = mkWrapper({
81
+ isEvaluateMode: true,
82
+ isCorrect: true,
83
+ evaluateText: 'Correctly\nselected'
84
+ });
85
+ expect((0, _enzymeToJson.default)(wrapper)).toMatchSnapshot();
86
+ });
87
+ });
88
+ });
89
+ describe('in evaluate mode', () => {
90
+ const defaultModel = {
91
+ onClick,
92
+ id: '1',
93
+ height: 200,
94
+ hotspotColor: 'rgba(137, 183, 244, 0.65)',
95
+ disabled: true,
96
+ width: 300,
97
+ x: 5,
98
+ y: 5,
99
+ selected: false,
100
+ isCorrect: false,
101
+ isEvaluateMode: true,
102
+ evaluateText: null,
103
+ strokeWidth: 5,
104
+ outlineColor: 'blue',
105
+ markAsCorrect: false,
106
+ showCorrectEnabled: false
107
+ };
108
+ const getComponents = model => {
109
+ const testWrapper = (0, _testUtils.shallowChild)(_rectangle.default, {
110
+ ...defaultModel,
111
+ ...model
112
+ }, 1);
113
+ const rectangleComponent = testWrapper();
114
+ const rectComponent = rectangleComponent.find(_reactKonva.Rect);
115
+ return {
116
+ rectangleComponent,
117
+ rectComponent
118
+ };
119
+ };
120
+ describe('when correctly selected', () => {
121
+ const {
122
+ rectangleComponent,
123
+ rectComponent
124
+ } = getComponents({
125
+ selected: true,
126
+ isCorrect: true
127
+ });
128
+ it('should have a blue outline', () => {
129
+ expect(rectComponent.prop('stroke')).toEqual('blue');
130
+ expect(rectComponent.prop('strokeWidth')).toEqual(defaultModel.strokeWidth);
131
+ });
132
+ it('should have a green checkmark icon', () => {
133
+ const imgComponent = rectangleComponent.find(_imageKonvaTooltip.default);
134
+ expect(imgComponent.length).toEqual(1);
135
+ expect(imgComponent.prop('src')).toEqual(_icons.faCorrect);
136
+ });
137
+ });
138
+ describe('when correctly not selected', () => {
139
+ const {
140
+ rectangleComponent,
141
+ rectComponent
142
+ } = getComponents({
143
+ selected: false,
144
+ isCorrect: true
145
+ });
146
+ it('should have no outline', () => {
147
+ expect(rectComponent.prop('strokeWidth')).toEqual(0);
148
+ });
149
+ it('should have no icon', () => {
150
+ const imgComponent = rectangleComponent.find(_imageKonvaTooltip.default);
151
+ expect(imgComponent.length).toEqual(0);
152
+ });
153
+ });
154
+ describe('when incorrectly selected', () => {
155
+ const {
156
+ rectangleComponent,
157
+ rectComponent
158
+ } = getComponents({
159
+ selected: true,
160
+ isCorrect: false
161
+ });
162
+ it('should have a red outline', () => {
163
+ expect(rectComponent.prop('stroke')).toEqual('red');
164
+ expect(rectComponent.prop('strokeWidth')).toEqual(defaultModel.strokeWidth);
165
+ });
166
+ it('should have a red x icon', () => {
167
+ const imgComponent = rectangleComponent.find(_imageKonvaTooltip.default);
168
+ expect(imgComponent.length).toEqual(1);
169
+ expect(imgComponent.prop('src')).toEqual(_icons.faWrong);
170
+ });
171
+ });
172
+ describe('when incorrectly not selected', () => {
173
+ const {
174
+ rectangleComponent,
175
+ rectComponent
176
+ } = getComponents({
177
+ selected: false,
178
+ isCorrect: false
179
+ });
180
+ it('should have no outline', () => {
181
+ expect(rectComponent.prop('strokeWidth')).toEqual(0);
182
+ });
183
+ it('should have a red x icon', () => {
184
+ const imgComponent = rectangleComponent.find(_imageKonvaTooltip.default);
185
+ expect(imgComponent.length).toEqual(1);
186
+ expect(imgComponent.prop('src')).toEqual(_icons.faWrong);
187
+ });
188
+ });
189
+ describe('when showing correct answer (showCorrectEnabled = true)', () => {
190
+ it('should have a green outline', () => {
191
+ const {
192
+ rectComponent
193
+ } = getComponents({
194
+ showCorrectEnabled: true,
195
+ markAsCorrect: true
196
+ });
197
+ expect(rectComponent.prop('stroke')).toEqual('green');
198
+ expect(rectComponent.prop('strokeWidth')).toEqual(defaultModel.strokeWidth);
199
+ });
200
+ it('should have a green checkmark icon', () => {
201
+ const {
202
+ rectangleComponent
203
+ } = getComponents({
204
+ showCorrectEnabled: true,
205
+ markAsCorrect: true
206
+ });
207
+ const imgComponent = rectangleComponent.find(_imageKonvaTooltip.default);
208
+ expect(imgComponent.prop('src')).toEqual(_icons.faCorrect);
209
+ });
210
+ it('should not be selected if the answer is incorrect', () => {
211
+ const {
212
+ rectComponent
213
+ } = getComponents({
214
+ showCorrectEnabled: true,
215
+ markAsCorrect: false,
216
+ selected: true,
217
+ isCorrect: false
218
+ });
219
+ expect(rectComponent.prop('strokeWidth')).toEqual(0);
220
+ });
221
+ it('should not render an icon if the answer is incorrect', () => {
222
+ const {
223
+ rectangleComponent
224
+ } = getComponents({
225
+ showCorrectEnabled: true,
226
+ markAsCorrect: false,
227
+ selected: true,
228
+ isCorrect: false
229
+ });
230
+ const imgComponent = rectangleComponent.find(_imageKonvaTooltip.default);
231
+ expect(imgComponent.length).toEqual(0);
232
+ });
233
+ });
234
+ });
235
+ });
236
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9lbnp5bWUiLCJfZW56eW1lVG9Kc29uIiwiX2tvbnZhIiwiX3JlYWN0S29udmEiLCJfdGVzdFV0aWxzIiwiX3JlY3RhbmdsZSIsIl9pbWFnZUtvbnZhVG9vbHRpcCIsIl9pY29ucyIsImdsb2JhbCIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJjb25zdHJ1Y3RvciIsImNhbGxiYWNrIiwiZGlzY29ubmVjdCIsIm9ic2VydmUiLCJlbGVtZW50IiwiaW5pdE9iamVjdCIsIktvbnZhIiwiaXNCcm93c2VyIiwiZGVzY3JpYmUiLCJvbkNsaWNrIiwid3JhcHBlciIsIm1rV3JhcHBlciIsIm9wdHMiLCJjbGFzc2VzIiwiYmFzZSIsImhlaWdodCIsImhvdHNwb3RDb2xvciIsImlkIiwiaXNDb3JyZWN0IiwiaXNFdmFsdWF0ZU1vZGUiLCJldmFsdWF0ZVRleHQiLCJkaXNhYmxlZCIsIm91dGxpbmVDb2xvciIsInNlbGVjdGVkIiwid2lkdGgiLCJ4IiwieSIsInNoYWxsb3ciLCJkZWZhdWx0IiwiY3JlYXRlRWxlbWVudCIsIl9leHRlbmRzMiIsImJlZm9yZUVhY2giLCJqZXN0IiwiZm4iLCJpdCIsImV4cGVjdCIsInRvSnNvbiIsInRvTWF0Y2hTbmFwc2hvdCIsInN0cm9rZVdpZHRoIiwiZGVmYXVsdE1vZGVsIiwibWFya0FzQ29ycmVjdCIsInNob3dDb3JyZWN0RW5hYmxlZCIsImdldENvbXBvbmVudHMiLCJtb2RlbCIsInRlc3RXcmFwcGVyIiwic2hhbGxvd0NoaWxkIiwiUmVjdGFuZ2xlIiwicmVjdGFuZ2xlQ29tcG9uZW50IiwicmVjdENvbXBvbmVudCIsImZpbmQiLCJSZWN0IiwicHJvcCIsInRvRXF1YWwiLCJpbWdDb21wb25lbnQiLCJJbWFnZUNvbXBvbmVudCIsImxlbmd0aCIsImZhQ29ycmVjdCIsImZhV3JvbmciXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL3JlY3RhbmdsZS50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgc2hhbGxvdyB9IGZyb20gJ2VuenltZSc7XG5pbXBvcnQgdG9Kc29uIGZyb20gJ2VuenltZS10by1qc29uJztcbmltcG9ydCBLb252YSBmcm9tICdrb252YSc7XG5pbXBvcnQgeyBSZWN0IH0gZnJvbSAncmVhY3Qta29udmEnO1xuXG5pbXBvcnQgeyBzaGFsbG93Q2hpbGQgfSBmcm9tICdAcGllLWxpYi90ZXN0LXV0aWxzJztcblxuaW1wb3J0IFJlY3RhbmdsZSBmcm9tICcuLi9ob3RzcG90L3JlY3RhbmdsZSc7XG5pbXBvcnQgSW1hZ2VDb21wb25lbnQgZnJvbSAnLi4vaG90c3BvdC9pbWFnZS1rb252YS10b29sdGlwJztcbmltcG9ydCB7IGZhQ29ycmVjdCwgZmFXcm9uZyB9IGZyb20gJy4uL2hvdHNwb3QvaWNvbnMnO1xuXG5nbG9iYWwuTXV0YXRpb25PYnNlcnZlciA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoY2FsbGJhY2spIHt9XG4gIGRpc2Nvbm5lY3QoKSB7fVxuICBvYnNlcnZlKGVsZW1lbnQsIGluaXRPYmplY3QpIHt9XG59O1xuXG5Lb252YS5pc0Jyb3dzZXIgPSBmYWxzZTtcblxuZGVzY3JpYmUoJ1JlY3RhbmdsZScsICgpID0+IHtcbiAgbGV0IG9uQ2xpY2ssIHdyYXBwZXI7XG5cbiAgY29uc3QgbWtXcmFwcGVyID0gKG9wdHMgPSB7fSkgPT4ge1xuICAgIG9wdHMgPSB7XG4gICAgICBjbGFzc2VzOiB7IGJhc2U6ICdiYXNlJyB9LFxuICAgICAgaGVpZ2h0OiAyMDAsXG4gICAgICBob3RzcG90Q29sb3I6ICdyZ2JhKDEzNywgMTgzLCAyNDQsIDAuNjUpJyxcbiAgICAgIGlkOiAnMScsXG4gICAgICBpc0NvcnJlY3Q6IGZhbHNlLFxuICAgICAgaXNFdmFsdWF0ZU1vZGU6IGZhbHNlLFxuICAgICAgZXZhbHVhdGVUZXh0OiBudWxsLFxuICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgb3V0bGluZUNvbG9yOiAnYmx1ZScsXG4gICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICB3aWR0aDogMzAwLFxuICAgICAgeDogNSxcbiAgICAgIHk6IDUsXG4gICAgICAuLi5vcHRzLFxuICAgIH07XG5cbiAgICByZXR1cm4gc2hhbGxvdyg8UmVjdGFuZ2xlIHsuLi5vcHRzfSBvbkNsaWNrPXtvbkNsaWNrfSAvPik7XG4gIH07XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgb25DbGljayA9IGplc3QuZm4oKTtcbiAgICB3cmFwcGVyID0gbWtXcmFwcGVyKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzbmFwc2hvdHMnLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ291dGxpbmUgY29sb3InLCAoKSA9PiB7XG4gICAgICBpdCgncmVuZGVycycsICgpID0+IHtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IG1rV3JhcHBlcih7IG91dGxpbmVDb2xvcjogJ3JlZCcgfSk7XG4gICAgICAgIGV4cGVjdCh0b0pzb24od3JhcHBlcikpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb3V0bGluZSB3aWR0aCcsICgpID0+IHtcbiAgICAgIGl0KCdyZW5kZXJzIHdpdGggZGVmYXVsdCBib3JkZXIgd2lkdGgnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSBta1dyYXBwZXIoKTtcbiAgICAgICAgZXhwZWN0KHRvSnNvbih3cmFwcGVyKSkudG9NYXRjaFNuYXBzaG90KCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JlbmRlcnMgd2l0aCBnaXZlbiBib3JkZXIgd2lkdGgnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSBta1dyYXBwZXIoeyBzdHJva2VXaWR0aDogMTAgfSk7XG4gICAgICAgIGV4cGVjdCh0b0pzb24od3JhcHBlcikpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnaG90c3BvdCBjb2xvcicsICgpID0+IHtcbiAgICAgIGl0KCdyZW5kZXJzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB3cmFwcGVyID0gbWtXcmFwcGVyKHsgaG90c3BvdENvbG9yOiAncmdiYSgyMTcsIDMwLCAyNCwgMC42NSknIH0pO1xuICAgICAgICBleHBlY3QodG9Kc29uKHdyYXBwZXIpKS50b01hdGNoU25hcHNob3QoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2V2YWx1YXRlIHdpdGggY29ycmVjdCBhbnN3ZXInLCAoKSA9PiB7XG4gICAgICBpdCgncmVuZGVycycsICgpID0+IHtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IG1rV3JhcHBlcih7IGlzRXZhbHVhdGVNb2RlOiB0cnVlLCBpc0NvcnJlY3Q6IHRydWUsIGV2YWx1YXRlVGV4dDogJ0NvcnJlY3RseVxcbnNlbGVjdGVkJyB9KTtcbiAgICAgICAgZXhwZWN0KHRvSnNvbih3cmFwcGVyKSkudG9NYXRjaFNuYXBzaG90KCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2luIGV2YWx1YXRlIG1vZGUnLCAoKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdE1vZGVsID0ge1xuICAgICAgb25DbGljayxcbiAgICAgIGlkOiAnMScsXG4gICAgICBoZWlnaHQ6IDIwMCxcbiAgICAgIGhvdHNwb3RDb2xvcjogJ3JnYmEoMTM3LCAxODMsIDI0NCwgMC42NSknLFxuICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICB3aWR0aDogMzAwLFxuICAgICAgeDogNSxcbiAgICAgIHk6IDUsXG4gICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICBpc0NvcnJlY3Q6IGZhbHNlLFxuICAgICAgaXNFdmFsdWF0ZU1vZGU6IHRydWUsXG4gICAgICBldmFsdWF0ZVRleHQ6IG51bGwsXG4gICAgICBzdHJva2VXaWR0aDogNSxcbiAgICAgIG91dGxpbmVDb2xvcjogJ2JsdWUnLFxuICAgICAgbWFya0FzQ29ycmVjdDogZmFsc2UsXG4gICAgICBzaG93Q29ycmVjdEVuYWJsZWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICBjb25zdCBnZXRDb21wb25lbnRzID0gKG1vZGVsKSA9PiB7XG4gICAgICBjb25zdCB0ZXN0V3JhcHBlciA9IHNoYWxsb3dDaGlsZChcbiAgICAgICAgUmVjdGFuZ2xlLFxuICAgICAgICB7XG4gICAgICAgICAgLi4uZGVmYXVsdE1vZGVsLFxuICAgICAgICAgIC4uLm1vZGVsLFxuICAgICAgICB9LFxuICAgICAgICAxLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlY3RhbmdsZUNvbXBvbmVudCA9IHRlc3RXcmFwcGVyKCk7XG4gICAgICBjb25zdCByZWN0Q29tcG9uZW50ID0gcmVjdGFuZ2xlQ29tcG9uZW50LmZpbmQoUmVjdCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWN0YW5nbGVDb21wb25lbnQsXG4gICAgICAgIHJlY3RDb21wb25lbnQsXG4gICAgICB9O1xuICAgIH07XG5cbiAgICBkZXNjcmliZSgnd2hlbiBjb3JyZWN0bHkgc2VsZWN0ZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHJlY3RhbmdsZUNvbXBvbmVudCwgcmVjdENvbXBvbmVudCB9ID0gZ2V0Q29tcG9uZW50cyh7XG4gICAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgICBpc0NvcnJlY3Q6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYXZlIGEgYmx1ZSBvdXRsaW5lJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVjdENvbXBvbmVudC5wcm9wKCdzdHJva2UnKSkudG9FcXVhbCgnYmx1ZScpO1xuICAgICAgICBleHBlY3QocmVjdENvbXBvbmVudC5wcm9wKCdzdHJva2VXaWR0aCcpKS50b0VxdWFsKGRlZmF1bHRNb2RlbC5zdHJva2VXaWR0aCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYXZlIGEgZ3JlZW4gY2hlY2ttYXJrIGljb24nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGltZ0NvbXBvbmVudCA9IHJlY3RhbmdsZUNvbXBvbmVudC5maW5kKEltYWdlQ29tcG9uZW50KTtcbiAgICAgICAgZXhwZWN0KGltZ0NvbXBvbmVudC5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICAgIGV4cGVjdChpbWdDb21wb25lbnQucHJvcCgnc3JjJykpLnRvRXF1YWwoZmFDb3JyZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3doZW4gY29ycmVjdGx5IG5vdCBzZWxlY3RlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcmVjdGFuZ2xlQ29tcG9uZW50LCByZWN0Q29tcG9uZW50IH0gPSBnZXRDb21wb25lbnRzKHtcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICBpc0NvcnJlY3Q6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYXZlIG5vIG91dGxpbmUnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZWN0Q29tcG9uZW50LnByb3AoJ3N0cm9rZVdpZHRoJykpLnRvRXF1YWwoMCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYXZlIG5vIGljb24nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGltZ0NvbXBvbmVudCA9IHJlY3RhbmdsZUNvbXBvbmVudC5maW5kKEltYWdlQ29tcG9uZW50KTtcbiAgICAgICAgZXhwZWN0KGltZ0NvbXBvbmVudC5sZW5ndGgpLnRvRXF1YWwoMCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIGluY29ycmVjdGx5IHNlbGVjdGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyByZWN0YW5nbGVDb21wb25lbnQsIHJlY3RDb21wb25lbnQgfSA9IGdldENvbXBvbmVudHMoe1xuICAgICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICAgICAgaXNDb3JyZWN0OiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGhhdmUgYSByZWQgb3V0bGluZScsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlY3RDb21wb25lbnQucHJvcCgnc3Ryb2tlJykpLnRvRXF1YWwoJ3JlZCcpO1xuICAgICAgICBleHBlY3QocmVjdENvbXBvbmVudC5wcm9wKCdzdHJva2VXaWR0aCcpKS50b0VxdWFsKGRlZmF1bHRNb2RlbC5zdHJva2VXaWR0aCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYXZlIGEgcmVkIHggaWNvbicsICgpID0+IHtcbiAgICAgICAgY29uc3QgaW1nQ29tcG9uZW50ID0gcmVjdGFuZ2xlQ29tcG9uZW50LmZpbmQoSW1hZ2VDb21wb25lbnQpO1xuICAgICAgICBleHBlY3QoaW1nQ29tcG9uZW50Lmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICAgICAgZXhwZWN0KGltZ0NvbXBvbmVudC5wcm9wKCdzcmMnKSkudG9FcXVhbChmYVdyb25nKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3doZW4gaW5jb3JyZWN0bHkgbm90IHNlbGVjdGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyByZWN0YW5nbGVDb21wb25lbnQsIHJlY3RDb21wb25lbnQgfSA9IGdldENvbXBvbmVudHMoe1xuICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgIGlzQ29ycmVjdDogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYXZlIG5vIG91dGxpbmUnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZWN0Q29tcG9uZW50LnByb3AoJ3N0cm9rZVdpZHRoJykpLnRvRXF1YWwoMCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYXZlIGEgcmVkIHggaWNvbicsICgpID0+IHtcbiAgICAgICAgY29uc3QgaW1nQ29tcG9uZW50ID0gcmVjdGFuZ2xlQ29tcG9uZW50LmZpbmQoSW1hZ2VDb21wb25lbnQpO1xuICAgICAgICBleHBlY3QoaW1nQ29tcG9uZW50Lmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICAgICAgZXhwZWN0KGltZ0NvbXBvbmVudC5wcm9wKCdzcmMnKSkudG9FcXVhbChmYVdyb25nKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3doZW4gc2hvd2luZyBjb3JyZWN0IGFuc3dlciAoc2hvd0NvcnJlY3RFbmFibGVkID0gdHJ1ZSknLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGhhdmUgYSBncmVlbiBvdXRsaW5lJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB7IHJlY3RDb21wb25lbnQgfSA9IGdldENvbXBvbmVudHMoe1xuICAgICAgICAgIHNob3dDb3JyZWN0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBtYXJrQXNDb3JyZWN0OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KHJlY3RDb21wb25lbnQucHJvcCgnc3Ryb2tlJykpLnRvRXF1YWwoJ2dyZWVuJyk7XG4gICAgICAgIGV4cGVjdChyZWN0Q29tcG9uZW50LnByb3AoJ3N0cm9rZVdpZHRoJykpLnRvRXF1YWwoZGVmYXVsdE1vZGVsLnN0cm9rZVdpZHRoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGhhdmUgYSBncmVlbiBjaGVja21hcmsgaWNvbicsICgpID0+IHtcbiAgICAgICAgY29uc3QgeyByZWN0YW5nbGVDb21wb25lbnQgfSA9IGdldENvbXBvbmVudHMoe1xuICAgICAgICAgIHNob3dDb3JyZWN0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBtYXJrQXNDb3JyZWN0OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgaW1nQ29tcG9uZW50ID0gcmVjdGFuZ2xlQ29tcG9uZW50LmZpbmQoSW1hZ2VDb21wb25lbnQpO1xuICAgICAgICBleHBlY3QoaW1nQ29tcG9uZW50LnByb3AoJ3NyYycpKS50b0VxdWFsKGZhQ29ycmVjdCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBub3QgYmUgc2VsZWN0ZWQgaWYgdGhlIGFuc3dlciBpcyBpbmNvcnJlY3QnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcmVjdENvbXBvbmVudCB9ID0gZ2V0Q29tcG9uZW50cyh7XG4gICAgICAgICAgc2hvd0NvcnJlY3RFbmFibGVkOiB0cnVlLFxuICAgICAgICAgIG1hcmtBc0NvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgICAgIGlzQ29ycmVjdDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICBleHBlY3QocmVjdENvbXBvbmVudC5wcm9wKCdzdHJva2VXaWR0aCcpKS50b0VxdWFsKDApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbm90IHJlbmRlciBhbiBpY29uIGlmIHRoZSBhbnN3ZXIgaXMgaW5jb3JyZWN0JywgKCkgPT4ge1xuICAgICAgICBjb25zdCB7IHJlY3RhbmdsZUNvbXBvbmVudCB9ID0gZ2V0Q29tcG9uZW50cyh7XG4gICAgICAgICAgc2hvd0NvcnJlY3RFbmFibGVkOiB0cnVlLFxuICAgICAgICAgIG1hcmtBc0NvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgICAgIGlzQ29ycmVjdDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpbWdDb21wb25lbnQgPSByZWN0YW5nbGVDb21wb25lbnQuZmluZChJbWFnZUNvbXBvbmVudCk7XG4gICAgICAgIGV4cGVjdChpbWdDb21wb25lbnQubGVuZ3RoKS50b0VxdWFsKDApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxhQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxNQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxXQUFBLEdBQUFKLE9BQUE7QUFFQSxJQUFBSyxVQUFBLEdBQUFMLE9BQUE7QUFFQSxJQUFBTSxVQUFBLEdBQUFQLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTyxrQkFBQSxHQUFBUixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVEsTUFBQSxHQUFBUixPQUFBO0FBRUFTLE1BQU0sQ0FBQ0MsZ0JBQWdCLEdBQUcsTUFBTTtFQUM5QkMsV0FBV0EsQ0FBQ0MsUUFBUSxFQUFFLENBQUM7RUFDdkJDLFVBQVVBLENBQUEsRUFBRyxDQUFDO0VBQ2RDLE9BQU9BLENBQUNDLE9BQU8sRUFBRUMsVUFBVSxFQUFFLENBQUM7QUFDaEMsQ0FBQztBQUVEQyxjQUFLLENBQUNDLFNBQVMsR0FBRyxLQUFLO0FBRXZCQyxRQUFRLENBQUMsV0FBVyxFQUFFLE1BQU07RUFDMUIsSUFBSUMsT0FBTyxFQUFFQyxPQUFPO0VBRXBCLE1BQU1DLFNBQVMsR0FBR0EsQ0FBQ0MsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLO0lBQy9CQSxJQUFJLEdBQUc7TUFDTEMsT0FBTyxFQUFFO1FBQUVDLElBQUksRUFBRTtNQUFPLENBQUM7TUFDekJDLE1BQU0sRUFBRSxHQUFHO01BQ1hDLFlBQVksRUFBRSwyQkFBMkI7TUFDekNDLEVBQUUsRUFBRSxHQUFHO01BQ1BDLFNBQVMsRUFBRSxLQUFLO01BQ2hCQyxjQUFjLEVBQUUsS0FBSztNQUNyQkMsWUFBWSxFQUFFLElBQUk7TUFDbEJDLFFBQVEsRUFBRSxLQUFLO01BQ2ZDLFlBQVksRUFBRSxNQUFNO01BQ3BCQyxRQUFRLEVBQUUsS0FBSztNQUNmQyxLQUFLLEVBQUUsR0FBRztNQUNWQyxDQUFDLEVBQUUsQ0FBQztNQUNKQyxDQUFDLEVBQUUsQ0FBQztNQUNKLEdBQUdkO0lBQ0wsQ0FBQztJQUVELE9BQU8sSUFBQWUsZUFBTyxlQUFDeEMsTUFBQSxDQUFBeUMsT0FBQSxDQUFBQyxhQUFBLENBQUNsQyxVQUFBLENBQUFpQyxPQUFTLE1BQUFFLFNBQUEsQ0FBQUYsT0FBQSxNQUFLaEIsSUFBSTtNQUFFSCxPQUFPLEVBQUVBO0lBQVEsRUFBRSxDQUFDLENBQUM7RUFDM0QsQ0FBQztFQUVEc0IsVUFBVSxDQUFDLE1BQU07SUFDZnRCLE9BQU8sR0FBR3VCLElBQUksQ0FBQ0MsRUFBRSxDQUFDLENBQUM7SUFDbkJ2QixPQUFPLEdBQUdDLFNBQVMsQ0FBQyxDQUFDO0VBQ3ZCLENBQUMsQ0FBQztFQUVGSCxRQUFRLENBQUMsV0FBVyxFQUFFLE1BQU07SUFDMUJBLFFBQVEsQ0FBQyxlQUFlLEVBQUUsTUFBTTtNQUM5QjBCLEVBQUUsQ0FBQyxTQUFTLEVBQUUsTUFBTTtRQUNsQixNQUFNeEIsT0FBTyxHQUFHQyxTQUFTLENBQUM7VUFBRVcsWUFBWSxFQUFFO1FBQU0sQ0FBQyxDQUFDO1FBQ2xEYSxNQUFNLENBQUMsSUFBQUMscUJBQU0sRUFBQzFCLE9BQU8sQ0FBQyxDQUFDLENBQUMyQixlQUFlLENBQUMsQ0FBQztNQUMzQyxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRjdCLFFBQVEsQ0FBQyxlQUFlLEVBQUUsTUFBTTtNQUM5QjBCLEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRSxNQUFNO1FBQzVDLE1BQU14QixPQUFPLEdBQUdDLFNBQVMsQ0FBQyxDQUFDO1FBQzNCd0IsTUFBTSxDQUFDLElBQUFDLHFCQUFNLEVBQUMxQixPQUFPLENBQUMsQ0FBQyxDQUFDMkIsZUFBZSxDQUFDLENBQUM7TUFDM0MsQ0FBQyxDQUFDO01BRUZILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSxNQUFNO1FBQzFDLE1BQU14QixPQUFPLEdBQUdDLFNBQVMsQ0FBQztVQUFFMkIsV0FBVyxFQUFFO1FBQUcsQ0FBQyxDQUFDO1FBQzlDSCxNQUFNLENBQUMsSUFBQUMscUJBQU0sRUFBQzFCLE9BQU8sQ0FBQyxDQUFDLENBQUMyQixlQUFlLENBQUMsQ0FBQztNQUMzQyxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRjdCLFFBQVEsQ0FBQyxlQUFlLEVBQUUsTUFBTTtNQUM5QjBCLEVBQUUsQ0FBQyxTQUFTLEVBQUUsTUFBTTtRQUNsQixNQUFNeEIsT0FBTyxHQUFHQyxTQUFTLENBQUM7VUFBRUssWUFBWSxFQUFFO1FBQTBCLENBQUMsQ0FBQztRQUN0RW1CLE1BQU0sQ0FBQyxJQUFBQyxxQkFBTSxFQUFDMUIsT0FBTyxDQUFDLENBQUMsQ0FBQzJCLGVBQWUsQ0FBQyxDQUFDO01BQzNDLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGN0IsUUFBUSxDQUFDLDhCQUE4QixFQUFFLE1BQU07TUFDN0MwQixFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU07UUFDbEIsTUFBTXhCLE9BQU8sR0FBR0MsU0FBUyxDQUFDO1VBQUVRLGNBQWMsRUFBRSxJQUFJO1VBQUVELFNBQVMsRUFBRSxJQUFJO1VBQUVFLFlBQVksRUFBRTtRQUFzQixDQUFDLENBQUM7UUFDekdlLE1BQU0sQ0FBQyxJQUFBQyxxQkFBTSxFQUFDMUIsT0FBTyxDQUFDLENBQUMsQ0FBQzJCLGVBQWUsQ0FBQyxDQUFDO01BQzNDLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGN0IsUUFBUSxDQUFDLGtCQUFrQixFQUFFLE1BQU07SUFDakMsTUFBTStCLFlBQVksR0FBRztNQUNuQjlCLE9BQU87TUFDUFEsRUFBRSxFQUFFLEdBQUc7TUFDUEYsTUFBTSxFQUFFLEdBQUc7TUFDWEMsWUFBWSxFQUFFLDJCQUEyQjtNQUN6Q0ssUUFBUSxFQUFFLElBQUk7TUFDZEcsS0FBSyxFQUFFLEdBQUc7TUFDVkMsQ0FBQyxFQUFFLENBQUM7TUFDSkMsQ0FBQyxFQUFFLENBQUM7TUFDSkgsUUFBUSxFQUFFLEtBQUs7TUFDZkwsU0FBUyxFQUFFLEtBQUs7TUFDaEJDLGNBQWMsRUFBRSxJQUFJO01BQ3BCQyxZQUFZLEVBQUUsSUFBSTtNQUNsQmtCLFdBQVcsRUFBRSxDQUFDO01BQ2RoQixZQUFZLEVBQUUsTUFBTTtNQUNwQmtCLGFBQWEsRUFBRSxLQUFLO01BQ3BCQyxrQkFBa0IsRUFBRTtJQUN0QixDQUFDO0lBRUQsTUFBTUMsYUFBYSxHQUFJQyxLQUFLLElBQUs7TUFDL0IsTUFBTUMsV0FBVyxHQUFHLElBQUFDLHVCQUFZLEVBQzlCQyxrQkFBUyxFQUNUO1FBQ0UsR0FBR1AsWUFBWTtRQUNmLEdBQUdJO01BQ0wsQ0FBQyxFQUNELENBQ0YsQ0FBQztNQUNELE1BQU1JLGtCQUFrQixHQUFHSCxXQUFXLENBQUMsQ0FBQztNQUN4QyxNQUFNSSxhQUFhLEdBQUdELGtCQUFrQixDQUFDRSxJQUFJLENBQUNDLGdCQUFJLENBQUM7TUFDbkQsT0FBTztRQUNMSCxrQkFBa0I7UUFDbEJDO01BQ0YsQ0FBQztJQUNILENBQUM7SUFFRHhDLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSxNQUFNO01BQ3hDLE1BQU07UUFBRXVDLGtCQUFrQjtRQUFFQztNQUFjLENBQUMsR0FBR04sYUFBYSxDQUFDO1FBQzFEbkIsUUFBUSxFQUFFLElBQUk7UUFDZEwsU0FBUyxFQUFFO01BQ2IsQ0FBQyxDQUFDO01BRUZnQixFQUFFLENBQUMsNEJBQTRCLEVBQUUsTUFBTTtRQUNyQ0MsTUFBTSxDQUFDYSxhQUFhLENBQUNHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ3BEakIsTUFBTSxDQUFDYSxhQUFhLENBQUNHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUNiLFlBQVksQ0FBQ0QsV0FBVyxDQUFDO01BQzdFLENBQUMsQ0FBQztNQUVGSixFQUFFLENBQUMsb0NBQW9DLEVBQUUsTUFBTTtRQUM3QyxNQUFNbUIsWUFBWSxHQUFHTixrQkFBa0IsQ0FBQ0UsSUFBSSxDQUFDSywwQkFBYyxDQUFDO1FBQzVEbkIsTUFBTSxDQUFDa0IsWUFBWSxDQUFDRSxNQUFNLENBQUMsQ0FBQ0gsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN0Q2pCLE1BQU0sQ0FBQ2tCLFlBQVksQ0FBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQ0ksZ0JBQVMsQ0FBQztNQUNyRCxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRmhELFFBQVEsQ0FBQyw2QkFBNkIsRUFBRSxNQUFNO01BQzVDLE1BQU07UUFBRXVDLGtCQUFrQjtRQUFFQztNQUFjLENBQUMsR0FBR04sYUFBYSxDQUFDO1FBQzFEbkIsUUFBUSxFQUFFLEtBQUs7UUFDZkwsU0FBUyxFQUFFO01BQ2IsQ0FBQyxDQUFDO01BRUZnQixFQUFFLENBQUMsd0JBQXdCLEVBQUUsTUFBTTtRQUNqQ0MsTUFBTSxDQUFDYSxhQUFhLENBQUNHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUMsQ0FBQyxDQUFDO01BQ3RELENBQUMsQ0FBQztNQUVGbEIsRUFBRSxDQUFDLHFCQUFxQixFQUFFLE1BQU07UUFDOUIsTUFBTW1CLFlBQVksR0FBR04sa0JBQWtCLENBQUNFLElBQUksQ0FBQ0ssMEJBQWMsQ0FBQztRQUM1RG5CLE1BQU0sQ0FBQ2tCLFlBQVksQ0FBQ0UsTUFBTSxDQUFDLENBQUNILE9BQU8sQ0FBQyxDQUFDLENBQUM7TUFDeEMsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUY1QyxRQUFRLENBQUMsMkJBQTJCLEVBQUUsTUFBTTtNQUMxQyxNQUFNO1FBQUV1QyxrQkFBa0I7UUFBRUM7TUFBYyxDQUFDLEdBQUdOLGFBQWEsQ0FBQztRQUMxRG5CLFFBQVEsRUFBRSxJQUFJO1FBQ2RMLFNBQVMsRUFBRTtNQUNiLENBQUMsQ0FBQztNQUVGZ0IsRUFBRSxDQUFDLDJCQUEyQixFQUFFLE1BQU07UUFDcENDLE1BQU0sQ0FBQ2EsYUFBYSxDQUFDRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNuRGpCLE1BQU0sQ0FBQ2EsYUFBYSxDQUFDRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDYixZQUFZLENBQUNELFdBQVcsQ0FBQztNQUM3RSxDQUFDLENBQUM7TUFFRkosRUFBRSxDQUFDLDBCQUEwQixFQUFFLE1BQU07UUFDbkMsTUFBTW1CLFlBQVksR0FBR04sa0JBQWtCLENBQUNFLElBQUksQ0FBQ0ssMEJBQWMsQ0FBQztRQUM1RG5CLE1BQU0sQ0FBQ2tCLFlBQVksQ0FBQ0UsTUFBTSxDQUFDLENBQUNILE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDdENqQixNQUFNLENBQUNrQixZQUFZLENBQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUNLLGNBQU8sQ0FBQztNQUNuRCxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRmpELFFBQVEsQ0FBQywrQkFBK0IsRUFBRSxNQUFNO01BQzlDLE1BQU07UUFBRXVDLGtCQUFrQjtRQUFFQztNQUFjLENBQUMsR0FBR04sYUFBYSxDQUFDO1FBQzFEbkIsUUFBUSxFQUFFLEtBQUs7UUFDZkwsU0FBUyxFQUFFO01BQ2IsQ0FBQyxDQUFDO01BRUZnQixFQUFFLENBQUMsd0JBQXdCLEVBQUUsTUFBTTtRQUNqQ0MsTUFBTSxDQUFDYSxhQUFhLENBQUNHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUMsQ0FBQyxDQUFDO01BQ3RELENBQUMsQ0FBQztNQUVGbEIsRUFBRSxDQUFDLDBCQUEwQixFQUFFLE1BQU07UUFDbkMsTUFBTW1CLFlBQVksR0FBR04sa0JBQWtCLENBQUNFLElBQUksQ0FBQ0ssMEJBQWMsQ0FBQztRQUM1RG5CLE1BQU0sQ0FBQ2tCLFlBQVksQ0FBQ0UsTUFBTSxDQUFDLENBQUNILE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDdENqQixNQUFNLENBQUNrQixZQUFZLENBQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUNLLGNBQU8sQ0FBQztNQUNuRCxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRmpELFFBQVEsQ0FBQyx5REFBeUQsRUFBRSxNQUFNO01BQ3hFMEIsRUFBRSxDQUFDLDZCQUE2QixFQUFFLE1BQU07UUFDdEMsTUFBTTtVQUFFYztRQUFjLENBQUMsR0FBR04sYUFBYSxDQUFDO1VBQ3RDRCxrQkFBa0IsRUFBRSxJQUFJO1VBQ3hCRCxhQUFhLEVBQUU7UUFDakIsQ0FBQyxDQUFDO1FBQ0ZMLE1BQU0sQ0FBQ2EsYUFBYSxDQUFDRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUNyRGpCLE1BQU0sQ0FBQ2EsYUFBYSxDQUFDRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDYixZQUFZLENBQUNELFdBQVcsQ0FBQztNQUM3RSxDQUFDLENBQUM7TUFFRkosRUFBRSxDQUFDLG9DQUFvQyxFQUFFLE1BQU07UUFDN0MsTUFBTTtVQUFFYTtRQUFtQixDQUFDLEdBQUdMLGFBQWEsQ0FBQztVQUMzQ0Qsa0JBQWtCLEVBQUUsSUFBSTtVQUN4QkQsYUFBYSxFQUFFO1FBQ2pCLENBQUMsQ0FBQztRQUNGLE1BQU1hLFlBQVksR0FBR04sa0JBQWtCLENBQUNFLElBQUksQ0FBQ0ssMEJBQWMsQ0FBQztRQUM1RG5CLE1BQU0sQ0FBQ2tCLFlBQVksQ0FBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQ0ksZ0JBQVMsQ0FBQztNQUNyRCxDQUFDLENBQUM7TUFFRnRCLEVBQUUsQ0FBQyxtREFBbUQsRUFBRSxNQUFNO1FBQzVELE1BQU07VUFBRWM7UUFBYyxDQUFDLEdBQUdOLGFBQWEsQ0FBQztVQUN0Q0Qsa0JBQWtCLEVBQUUsSUFBSTtVQUN4QkQsYUFBYSxFQUFFLEtBQUs7VUFDcEJqQixRQUFRLEVBQUUsSUFBSTtVQUNkTCxTQUFTLEVBQUU7UUFDYixDQUFDLENBQUM7UUFDRmlCLE1BQU0sQ0FBQ2EsYUFBYSxDQUFDRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLENBQUMsQ0FBQztNQUN0RCxDQUFDLENBQUM7TUFFRmxCLEVBQUUsQ0FBQyxzREFBc0QsRUFBRSxNQUFNO1FBQy9ELE1BQU07VUFBRWE7UUFBbUIsQ0FBQyxHQUFHTCxhQUFhLENBQUM7VUFDM0NELGtCQUFrQixFQUFFLElBQUk7VUFDeEJELGFBQWEsRUFBRSxLQUFLO1VBQ3BCakIsUUFBUSxFQUFFLElBQUk7VUFDZEwsU0FBUyxFQUFFO1FBQ2IsQ0FBQyxDQUFDO1FBQ0YsTUFBTW1DLFlBQVksR0FBR04sa0JBQWtCLENBQUNFLElBQUksQ0FBQ0ssMEJBQWMsQ0FBQztRQUM1RG5CLE1BQU0sQ0FBQ2tCLFlBQVksQ0FBQ0UsTUFBTSxDQUFDLENBQUNILE9BQU8sQ0FBQyxDQUFDLENBQUM7TUFDeEMsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ var _sessionUpdater = require("../session-updater");
4
+ const modelCopy = {
5
+ shapes: {
6
+ rectangles: [{
7
+ id: '1',
8
+ correct: true
9
+ }, {
10
+ id: '2'
11
+ }, {
12
+ id: '3'
13
+ }],
14
+ polygons: [{
15
+ id: '4',
16
+ correct: true
17
+ }, {
18
+ id: '5'
19
+ }]
20
+ },
21
+ configure: {},
22
+ multipleCorrect: true
23
+ };
24
+ const sessionCopy = {
25
+ answers: [{
26
+ id: '1'
27
+ }, {
28
+ id: '2'
29
+ }]
30
+ };
31
+ describe('session-updater', () => {
32
+ beforeEach(() => {});
33
+ describe('updateSessionValue', () => {
34
+ const assert = (session, model, data, expected) => {
35
+ return () => {
36
+ (0, _sessionUpdater.updateSessionValue)(session, model, data);
37
+ expect(session.answers).toEqual(expected);
38
+ };
39
+ };
40
+ describe('deselect', () => {
41
+ it('deselects shape', assert(sessionCopy, modelCopy, {
42
+ id: '1',
43
+ selected: false
44
+ }, [{
45
+ id: '2'
46
+ }]));
47
+ });
48
+ describe('select hotspot', () => {
49
+ it('selects shape in multiple choice mode', assert(sessionCopy, modelCopy, {
50
+ id: '1',
51
+ selected: true
52
+ }, [{
53
+ id: '2'
54
+ }, {
55
+ id: '1'
56
+ }]));
57
+ it('selects shape in single choice mode', assert(sessionCopy, {
58
+ ...modelCopy,
59
+ multipleCorrect: false
60
+ }, {
61
+ id: '1',
62
+ selected: true
63
+ }, [{
64
+ id: '1'
65
+ }]));
66
+ });
67
+ });
68
+ });
69
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc2Vzc2lvblVwZGF0ZXIiLCJyZXF1aXJlIiwibW9kZWxDb3B5Iiwic2hhcGVzIiwicmVjdGFuZ2xlcyIsImlkIiwiY29ycmVjdCIsInBvbHlnb25zIiwiY29uZmlndXJlIiwibXVsdGlwbGVDb3JyZWN0Iiwic2Vzc2lvbkNvcHkiLCJhbnN3ZXJzIiwiZGVzY3JpYmUiLCJiZWZvcmVFYWNoIiwiYXNzZXJ0Iiwic2Vzc2lvbiIsIm1vZGVsIiwiZGF0YSIsImV4cGVjdGVkIiwidXBkYXRlU2Vzc2lvblZhbHVlIiwiZXhwZWN0IiwidG9FcXVhbCIsIml0Iiwic2VsZWN0ZWQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL3Nlc3Npb24tdXBkYXRlci50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1cGRhdGVTZXNzaW9uVmFsdWUgfSBmcm9tICcuLi9zZXNzaW9uLXVwZGF0ZXInO1xuXG5jb25zdCBtb2RlbENvcHkgPSB7XG4gIHNoYXBlczoge1xuICAgIHJlY3RhbmdsZXM6IFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiAnMicsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogJzMnLFxuICAgICAgfSxcbiAgICBdLFxuICAgIHBvbHlnb25zOiBbXG4gICAgICB7XG4gICAgICAgIGlkOiAnNCcsXG4gICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogJzUnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICBjb25maWd1cmU6IHt9LFxuICBtdWx0aXBsZUNvcnJlY3Q6IHRydWUsXG59O1xuXG5jb25zdCBzZXNzaW9uQ29weSA9IHtcbiAgYW5zd2VyczogW1xuICAgIHtcbiAgICAgIGlkOiAnMScsXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJzInLFxuICAgIH0sXG4gIF0sXG59O1xuXG5kZXNjcmliZSgnc2Vzc2lvbi11cGRhdGVyJywgKCkgPT4ge1xuICBiZWZvcmVFYWNoKCgpID0+IHt9KTtcblxuICBkZXNjcmliZSgndXBkYXRlU2Vzc2lvblZhbHVlJywgKCkgPT4ge1xuICAgIGNvbnN0IGFzc2VydCA9IChzZXNzaW9uLCBtb2RlbCwgZGF0YSwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHVwZGF0ZVNlc3Npb25WYWx1ZShzZXNzaW9uLCBtb2RlbCwgZGF0YSk7XG4gICAgICAgIGV4cGVjdChzZXNzaW9uLmFuc3dlcnMpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgfTtcbiAgICB9O1xuXG4gICAgZGVzY3JpYmUoJ2Rlc2VsZWN0JywgKCkgPT4ge1xuICAgICAgaXQoJ2Rlc2VsZWN0cyBzaGFwZScsIGFzc2VydChzZXNzaW9uQ29weSwgbW9kZWxDb3B5LCB7IGlkOiAnMScsIHNlbGVjdGVkOiBmYWxzZSB9LCBbeyBpZDogJzInIH1dKSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2VsZWN0IGhvdHNwb3QnLCAoKSA9PiB7XG4gICAgICBpdChcbiAgICAgICAgJ3NlbGVjdHMgc2hhcGUgaW4gbXVsdGlwbGUgY2hvaWNlIG1vZGUnLFxuICAgICAgICBhc3NlcnQoc2Vzc2lvbkNvcHksIG1vZGVsQ29weSwgeyBpZDogJzEnLCBzZWxlY3RlZDogdHJ1ZSB9LCBbeyBpZDogJzInIH0sIHsgaWQ6ICcxJyB9XSksXG4gICAgICApO1xuXG4gICAgICBpdChcbiAgICAgICAgJ3NlbGVjdHMgc2hhcGUgaW4gc2luZ2xlIGNob2ljZSBtb2RlJyxcbiAgICAgICAgYXNzZXJ0KHNlc3Npb25Db3B5LCB7IC4uLm1vZGVsQ29weSwgbXVsdGlwbGVDb3JyZWN0OiBmYWxzZSB9LCB7IGlkOiAnMScsIHNlbGVjdGVkOiB0cnVlIH0sIFt7IGlkOiAnMScgfV0pLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBw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