@pie-element/math-inline 12.2.2-beta.4 → 12.2.2-beta.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.
- package/CHANGELOG.md +4 -0
- package/configure/CHANGELOG.md +4 -0
- package/configure/package.json +5 -5
- package/controller/CHANGELOG.md +4 -0
- package/controller/package.json +1 -1
- package/package.json +4 -4
- package/configure/lib/__tests__/configure.test.js +0 -237
- package/controller/lib/__tests__/index.test.js +0 -1416
- package/docs/demo/pie.manifest.json +0 -11
- package/lib/__tests__/main.test.js +0 -516
- package/lib/__tests__/simple-question-block.test.js +0 -129
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [12.2.2-beta.5](https://github.com/pie-framework/pie-elements/compare/@pie-element/math-inline@12.2.2-beta.4...@pie-element/math-inline@12.2.2-beta.5) (2026-09-17)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @pie-element/math-inline
|
|
9
|
+
|
|
6
10
|
## [12.2.2-beta.4](https://github.com/pie-framework/pie-elements/compare/@pie-element/math-inline@12.2.2-beta.3...@pie-element/math-inline@12.2.2-beta.4) (2026-09-11)
|
|
7
11
|
|
|
8
12
|
**Note:** Version bump only for package @pie-element/math-inline
|
package/configure/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [11.4.0-beta.11](https://github.com/pie-framework/pie-elements/compare/@pie-element/math-inline-configure@11.4.0-beta.10...@pie-element/math-inline-configure@11.4.0-beta.11) (2026-09-17)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @pie-element/math-inline-configure
|
|
9
|
+
|
|
6
10
|
# [11.4.0-beta.10](https://github.com/pie-framework/pie-elements/compare/@pie-element/math-inline-configure@11.4.0-beta.9...@pie-element/math-inline-configure@11.4.0-beta.10) (2026-09-11)
|
|
7
11
|
|
|
8
12
|
**Note:** Version bump only for package @pie-element/math-inline-configure
|
package/configure/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/math-inline-configure",
|
|
3
3
|
"private": true,
|
|
4
|
-
"version": "11.4.0-beta.
|
|
4
|
+
"version": "11.4.0-beta.11",
|
|
5
5
|
"description": "",
|
|
6
6
|
"main": "lib/index.js",
|
|
7
7
|
"module": "src/index.js",
|
|
@@ -12,11 +12,11 @@
|
|
|
12
12
|
"@mui/icons-material": "^7.3.4",
|
|
13
13
|
"@mui/material": "^7.3.4",
|
|
14
14
|
"@pie-framework/pie-configure-events": "^1.3.0",
|
|
15
|
-
"@pie-lib/config-ui": "13.1.0-beta.
|
|
16
|
-
"@pie-lib/editable-html-tip-tap": "2.2.0-beta.
|
|
17
|
-
"@pie-lib/math-input-mathlive": "1.0.
|
|
15
|
+
"@pie-lib/config-ui": "13.1.0-beta.9",
|
|
16
|
+
"@pie-lib/editable-html-tip-tap": "2.2.0-beta.9",
|
|
17
|
+
"@pie-lib/math-input-mathlive": "1.0.13",
|
|
18
18
|
"@pie-lib/math-rendering": "5.1.0",
|
|
19
|
-
"@pie-lib/math-toolbar": "3.1.0-beta.
|
|
19
|
+
"@pie-lib/math-toolbar": "3.1.0-beta.9",
|
|
20
20
|
"@pie-lib/render-ui": "6.1.3",
|
|
21
21
|
"@pie-lib/test-utils": "2.0.2",
|
|
22
22
|
"classnames": "^2.2.6",
|
package/controller/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [10.4.0-beta.11](https://github.com/pie-framework/pie-elements/compare/@pie-element/math-inline-controller@10.4.0-beta.10...@pie-element/math-inline-controller@10.4.0-beta.11) (2026-09-17)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @pie-element/math-inline-controller
|
|
9
|
+
|
|
6
10
|
# [10.4.0-beta.10](https://github.com/pie-framework/pie-elements/compare/@pie-element/math-inline-controller@10.4.0-beta.9...@pie-element/math-inline-controller@10.4.0-beta.10) (2026-09-11)
|
|
7
11
|
|
|
8
12
|
**Note:** Version bump only for package @pie-element/math-inline-controller
|
package/controller/package.json
CHANGED
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
|
-
"version": "12.2.2-beta.
|
|
7
|
+
"version": "12.2.2-beta.5",
|
|
8
8
|
"main": "lib/index.js",
|
|
9
9
|
"description": "",
|
|
10
10
|
"scripts": {
|
|
@@ -17,9 +17,9 @@
|
|
|
17
17
|
"@mui/material": "^7.3.4",
|
|
18
18
|
"@pie-framework/pie-player-events": "^0.1.0",
|
|
19
19
|
"@pie-lib/correct-answer-toggle": "4.0.5",
|
|
20
|
-
"@pie-lib/math-input-mathlive": "1.0.
|
|
20
|
+
"@pie-lib/math-input-mathlive": "1.0.13",
|
|
21
21
|
"@pie-lib/math-rendering": "5.1.0",
|
|
22
|
-
"@pie-lib/math-toolbar": "3.1.0-beta.
|
|
22
|
+
"@pie-lib/math-toolbar": "3.1.0-beta.9",
|
|
23
23
|
"@pie-lib/render-ui": "6.1.3",
|
|
24
24
|
"@pie-lib/translator": "4.0.2",
|
|
25
25
|
"classnames": "^2.2.6",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
},
|
|
32
32
|
"author": "",
|
|
33
33
|
"license": "ISC",
|
|
34
|
-
"gitHead": "
|
|
34
|
+
"gitHead": "3ab74b232732b96875e87537dfa2b8715cd553b6",
|
|
35
35
|
"module": "src/index.js",
|
|
36
36
|
"exports": {
|
|
37
37
|
".": "./src/index.js",
|
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
5
|
-
var React = _interopRequireWildcard(require("react"));
|
|
6
|
-
var _react2 = require("@testing-library/react");
|
|
7
|
-
var _configure = _interopRequireWildcard(require("../configure"));
|
|
8
|
-
var _configUi = require("@pie-lib/config-ui");
|
|
9
|
-
var _response = _interopRequireDefault(require("../response"));
|
|
10
|
-
var _mathToolbar = require("@pie-lib/math-toolbar");
|
|
11
|
-
var _editableHtmlTipTap = _interopRequireDefault(require("@pie-lib/editable-html-tip-tap"));
|
|
12
|
-
var _defaults = _interopRequireDefault(require("../defaults"));
|
|
13
|
-
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
14
|
-
jest.mock('@pie-lib/config-ui', () => ({
|
|
15
|
-
InputContainer: props => /*#__PURE__*/React.createElement("div", {
|
|
16
|
-
"data-testid": "input-container"
|
|
17
|
-
}, props.children),
|
|
18
|
-
InputCheckbox: props => /*#__PURE__*/React.createElement("div", {
|
|
19
|
-
"data-testid": "input-checkbox"
|
|
20
|
-
}, props.children),
|
|
21
|
-
FeedbackConfig: props => /*#__PURE__*/React.createElement("div", {
|
|
22
|
-
"data-testid": "feedback-config"
|
|
23
|
-
}, props.children),
|
|
24
|
-
layout: {
|
|
25
|
-
ConfigLayout: props => /*#__PURE__*/React.createElement("div", {
|
|
26
|
-
"data-testid": "config-layout"
|
|
27
|
-
}, props.children)
|
|
28
|
-
},
|
|
29
|
-
settings: {
|
|
30
|
-
Panel: props => /*#__PURE__*/React.createElement("div", {
|
|
31
|
-
"data-testid": "settings-panel",
|
|
32
|
-
onChange: props.onChange
|
|
33
|
-
}),
|
|
34
|
-
toggle: jest.fn(),
|
|
35
|
-
radio: jest.fn()
|
|
36
|
-
}
|
|
37
|
-
}));
|
|
38
|
-
jest.mock('@pie-lib/math-toolbar', () => ({
|
|
39
|
-
MathToolbar: props => /*#__PURE__*/React.createElement("div", (0, _extends2.default)({
|
|
40
|
-
"data-testid": "math-toolbar"
|
|
41
|
-
}, props))
|
|
42
|
-
}));
|
|
43
|
-
jest.mock('@pie-lib/math-input-mathlive', () => ({
|
|
44
|
-
registerEmbed: jest.fn(),
|
|
45
|
-
applyStaticMath: jest.fn()
|
|
46
|
-
}));
|
|
47
|
-
jest.mock('@pie-lib/editable-html-tip-tap', () => props => /*#__PURE__*/React.createElement("div", (0, _extends2.default)({
|
|
48
|
-
"data-testid": "editable-html"
|
|
49
|
-
}, props)));
|
|
50
|
-
jest.mock('../response', () => props => /*#__PURE__*/React.createElement("div", (0, _extends2.default)({
|
|
51
|
-
"data-testid": "response"
|
|
52
|
-
}, props)));
|
|
53
|
-
const {
|
|
54
|
-
registerEmbed
|
|
55
|
-
} = require('@pie-lib/math-input-mathlive');
|
|
56
|
-
const defaultProps = {
|
|
57
|
-
model: {
|
|
58
|
-
id: '1',
|
|
59
|
-
promptEnabled: true,
|
|
60
|
-
feedbackEnabled: true,
|
|
61
|
-
element: 'math-inline',
|
|
62
|
-
responseType: 'Advanced Multi',
|
|
63
|
-
feedback: {
|
|
64
|
-
correct: {
|
|
65
|
-
default: 'Correct',
|
|
66
|
-
type: 'none'
|
|
67
|
-
},
|
|
68
|
-
incorrect: {
|
|
69
|
-
default: 'Incorrect',
|
|
70
|
-
type: 'none'
|
|
71
|
-
},
|
|
72
|
-
partial: {
|
|
73
|
-
default: 'Nearly',
|
|
74
|
-
type: 'none'
|
|
75
|
-
}
|
|
76
|
-
},
|
|
77
|
-
equationEditor: '3',
|
|
78
|
-
expression: '{{response}} = {{response}} \\text{eggs}',
|
|
79
|
-
question: '<p>Sam sells baskets of eggs at his farm stand. He sold 12 baskets and wrote the number sentence below to show how many eggs he sold in all.</p><p><span class="equation-block"><math xmlns="http://www.w3.org/1998/Math/MathML" >\n <mrow>\n <mn>12</mn><mo>×</mo><mo>□</mo><mo>=</mo><mn>72</mn>\n </mrow>\n</math> </span></p><p>What <span class="relative-emphasis">division</span> number sentence can be used to show how many eggs were in each basket?</p><p>Use the on-screen keyboard to type your number sentence and answer in the box.</p>',
|
|
80
|
-
response: {
|
|
81
|
-
answer: '72\\div12=6\\text{eggs}',
|
|
82
|
-
alternates: {
|
|
83
|
-
1: '6=72\\div12\\text{eggs}',
|
|
84
|
-
2: '\\frac{72}{12}=6\\text{eggs}',
|
|
85
|
-
3: '6=\\frac{72}{12}\\text{eggs}'
|
|
86
|
-
},
|
|
87
|
-
validation: 'literal'
|
|
88
|
-
},
|
|
89
|
-
responses: [{
|
|
90
|
-
id: '1',
|
|
91
|
-
answer: '72\\div12=6\\text{eggs}',
|
|
92
|
-
alternates: {
|
|
93
|
-
1: '6=72\\div12\\text{eggs}',
|
|
94
|
-
2: '\\frac{72}{12}=6\\text{eggs}',
|
|
95
|
-
3: '6=\\frac{72}{12}\\text{eggs}'
|
|
96
|
-
},
|
|
97
|
-
validation: 'literal'
|
|
98
|
-
}],
|
|
99
|
-
note: 'The answer shown above is the primary correct answer specified by the author for this item, but other answers may also be recognized as correct.',
|
|
100
|
-
customKeys: ['\\left(\\right)', '\\frac{}{}', 'x\\frac{}{}'],
|
|
101
|
-
configure: _defaults.default.configure
|
|
102
|
-
},
|
|
103
|
-
configuration: _defaults.default.configuration
|
|
104
|
-
};
|
|
105
|
-
describe('Configure', () => {
|
|
106
|
-
it('changeTeacherInstructions calls onModelChange', () => {
|
|
107
|
-
const onModelChanged = jest.fn();
|
|
108
|
-
const {
|
|
109
|
-
container
|
|
110
|
-
} = (0, _react2.render)(/*#__PURE__*/React.createElement(_configure.Configure, (0, _extends2.default)({
|
|
111
|
-
onModelChanged: onModelChanged,
|
|
112
|
-
classes: {}
|
|
113
|
-
}, _defaults.default)));
|
|
114
|
-
const instance = new _configure.Configure({
|
|
115
|
-
onModelChanged,
|
|
116
|
-
classes: {},
|
|
117
|
-
..._defaults.default
|
|
118
|
-
});
|
|
119
|
-
instance.changeTeacherInstructions('Teacher Instructions');
|
|
120
|
-
expect(onModelChanged).toBeCalledWith(expect.objectContaining({
|
|
121
|
-
teacherInstructions: 'Teacher Instructions'
|
|
122
|
-
}));
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
describe('GeneralConfigBlock', () => {
|
|
126
|
-
// Unmock GeneralConfigBlock for these tests
|
|
127
|
-
const GeneralConfigBlock = require('../general-config-block').default;
|
|
128
|
-
let props;
|
|
129
|
-
beforeEach(() => {
|
|
130
|
-
props = {
|
|
131
|
-
model: defaultProps.model,
|
|
132
|
-
promptEnabled: true,
|
|
133
|
-
configuration: _defaults.default.configuration,
|
|
134
|
-
onChange: jest.fn(),
|
|
135
|
-
imageSupport: {},
|
|
136
|
-
uploadSoundSupport: {}
|
|
137
|
-
};
|
|
138
|
-
});
|
|
139
|
-
const wrapper = (extraProps = {}) => {
|
|
140
|
-
return (0, _react2.render)(/*#__PURE__*/React.createElement(GeneralConfigBlock, (0, _extends2.default)({}, props, extraProps)));
|
|
141
|
-
};
|
|
142
|
-
const createInstance = (extraProps = {}) => {
|
|
143
|
-
const instanceProps = {
|
|
144
|
-
...props,
|
|
145
|
-
...extraProps
|
|
146
|
-
};
|
|
147
|
-
const instance = new GeneralConfigBlock(instanceProps);
|
|
148
|
-
instance.setState = jest.fn(state => {
|
|
149
|
-
Object.assign(instance.state, typeof state === 'function' ? state(instance.state) : state);
|
|
150
|
-
});
|
|
151
|
-
return instance;
|
|
152
|
-
};
|
|
153
|
-
it('renders correctly', () => {
|
|
154
|
-
const {
|
|
155
|
-
container
|
|
156
|
-
} = wrapper();
|
|
157
|
-
expect(container.querySelector('[data-testid="input-container"]')).toBeInTheDocument();
|
|
158
|
-
expect(container.querySelector('[data-testid="response"]')).toBeInTheDocument();
|
|
159
|
-
expect(container.querySelector('[data-testid="math-toolbar"]')).toBeInTheDocument();
|
|
160
|
-
expect(container.querySelector('[data-testid="editable-html"]')).toBeInTheDocument();
|
|
161
|
-
expect(registerEmbed).toHaveBeenCalled();
|
|
162
|
-
});
|
|
163
|
-
it('renders correctly for Simple mode', () => {
|
|
164
|
-
const {
|
|
165
|
-
container
|
|
166
|
-
} = wrapper({
|
|
167
|
-
model: {
|
|
168
|
-
...props.model,
|
|
169
|
-
responseType: 'Simple'
|
|
170
|
-
}
|
|
171
|
-
});
|
|
172
|
-
expect(container.querySelector('[data-testid="input-container"]')).toBeInTheDocument();
|
|
173
|
-
expect(container.querySelector('[data-testid="response"]')).toBeInTheDocument();
|
|
174
|
-
expect(container.querySelector('[data-testid="editable-html"]')).toBeInTheDocument();
|
|
175
|
-
});
|
|
176
|
-
it('renders correctly with snapshot', () => {
|
|
177
|
-
const {
|
|
178
|
-
container
|
|
179
|
-
} = wrapper();
|
|
180
|
-
|
|
181
|
-
// // expect(container).toMatchSnapshot();
|
|
182
|
-
});
|
|
183
|
-
it('updates advanced model correctly', () => {
|
|
184
|
-
const onChange = jest.fn();
|
|
185
|
-
const instance = createInstance({
|
|
186
|
-
onChange
|
|
187
|
-
});
|
|
188
|
-
instance.onResponseChange({
|
|
189
|
-
answer: 'something',
|
|
190
|
-
id: 'r1'
|
|
191
|
-
}, 0);
|
|
192
|
-
expect(onChange).toBeCalledWith({
|
|
193
|
-
...props.model,
|
|
194
|
-
responses: [{
|
|
195
|
-
id: 'r1',
|
|
196
|
-
answer: 'something'
|
|
197
|
-
}]
|
|
198
|
-
});
|
|
199
|
-
});
|
|
200
|
-
it('builds out internal state correctly based on expression provided', () => {
|
|
201
|
-
const instance = createInstance();
|
|
202
|
-
expect(instance.state).toEqual({
|
|
203
|
-
showKeypad: false,
|
|
204
|
-
responseIdCounter: 2,
|
|
205
|
-
responseAreas: {
|
|
206
|
-
r1: {
|
|
207
|
-
value: ''
|
|
208
|
-
},
|
|
209
|
-
r2: {
|
|
210
|
-
value: ''
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
});
|
|
214
|
-
const instanceWithMoreResponses = createInstance({
|
|
215
|
-
model: {
|
|
216
|
-
...props.model,
|
|
217
|
-
expression: props.model.expression + ' {{response}} '
|
|
218
|
-
}
|
|
219
|
-
});
|
|
220
|
-
expect(instanceWithMoreResponses.state).toEqual({
|
|
221
|
-
showKeypad: false,
|
|
222
|
-
responseIdCounter: 3,
|
|
223
|
-
responseAreas: {
|
|
224
|
-
r1: {
|
|
225
|
-
value: ''
|
|
226
|
-
},
|
|
227
|
-
r2: {
|
|
228
|
-
value: ''
|
|
229
|
-
},
|
|
230
|
-
r3: {
|
|
231
|
-
value: ''
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
});
|
|
235
|
-
});
|
|
236
|
-
});
|
|
237
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfY29uZmlndXJlIiwiX2NvbmZpZ1VpIiwiX3Jlc3BvbnNlIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9tYXRoVG9vbGJhciIsIl9lZGl0YWJsZUh0bWxUaXBUYXAiLCJfZGVmYXVsdHMiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJkZWZhdWx0IiwiaGFzIiwiZ2V0Iiwic2V0IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJqZXN0IiwibW9jayIsIklucHV0Q29udGFpbmVyIiwicHJvcHMiLCJjcmVhdGVFbGVtZW50IiwiY2hpbGRyZW4iLCJJbnB1dENoZWNrYm94IiwiRmVlZGJhY2tDb25maWciLCJsYXlvdXQiLCJDb25maWdMYXlvdXQiLCJzZXR0aW5ncyIsIlBhbmVsIiwib25DaGFuZ2UiLCJ0b2dnbGUiLCJmbiIsInJhZGlvIiwiTWF0aFRvb2xiYXIiLCJfZXh0ZW5kczIiLCJyZWdpc3RlckVtYmVkIiwiYXBwbHlTdGF0aWNNYXRoIiwiZGVmYXVsdFByb3BzIiwibW9kZWwiLCJpZCIsInByb21wdEVuYWJsZWQiLCJmZWVkYmFja0VuYWJsZWQiLCJlbGVtZW50IiwicmVzcG9uc2VUeXBlIiwiZmVlZGJhY2siLCJjb3JyZWN0IiwidHlwZSIsImluY29ycmVjdCIsInBhcnRpYWwiLCJlcXVhdGlvbkVkaXRvciIsImV4cHJlc3Npb24iLCJxdWVzdGlvbiIsInJlc3BvbnNlIiwiYW5zd2VyIiwiYWx0ZXJuYXRlcyIsInZhbGlkYXRpb24iLCJyZXNwb25zZXMiLCJub3RlIiwiY3VzdG9tS2V5cyIsImNvbmZpZ3VyZSIsImRlZmF1bHRWYWx1ZXMiLCJjb25maWd1cmF0aW9uIiwiZGVzY3JpYmUiLCJpdCIsIm9uTW9kZWxDaGFuZ2VkIiwiY29udGFpbmVyIiwicmVuZGVyIiwiQ29uZmlndXJlIiwiY2xhc3NlcyIsImluc3RhbmNlIiwiQ29uZmlndXJlTm90U3R5bGVkIiwiY2hhbmdlVGVhY2hlckluc3RydWN0aW9ucyIsImV4cGVjdCIsInRvQmVDYWxsZWRXaXRoIiwib2JqZWN0Q29udGFpbmluZyIsInRlYWNoZXJJbnN0cnVjdGlvbnMiLCJHZW5lcmFsQ29uZmlnQmxvY2siLCJiZWZvcmVFYWNoIiwiaW1hZ2VTdXBwb3J0IiwidXBsb2FkU291bmRTdXBwb3J0Iiwid3JhcHBlciIsImV4dHJhUHJvcHMiLCJjcmVhdGVJbnN0YW5jZSIsImluc3RhbmNlUHJvcHMiLCJzZXRTdGF0ZSIsInN0YXRlIiwiYXNzaWduIiwicXVlcnlTZWxlY3RvciIsInRvQmVJblRoZURvY3VtZW50IiwidG9IYXZlQmVlbkNhbGxlZCIsIm9uUmVzcG9uc2VDaGFuZ2UiLCJ0b0VxdWFsIiwic2hvd0tleXBhZCIsInJlc3BvbnNlSWRDb3VudGVyIiwicmVzcG9uc2VBcmVhcyIsInIxIiwidmFsdWUiLCJyMiIsImluc3RhbmNlV2l0aE1vcmVSZXNwb25zZXMiLCJyMyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vY29uZmlndXJlLnRlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQgQ29uZmlndXJlLCB7IENvbmZpZ3VyZSBhcyBDb25maWd1cmVOb3RTdHlsZWQgfSBmcm9tICcuLi9jb25maWd1cmUnO1xuaW1wb3J0IHsgSW5wdXRDb250YWluZXIsIElucHV0Q2hlY2tib3ggfSBmcm9tICdAcGllLWxpYi9jb25maWctdWknO1xuaW1wb3J0IFJlc3BvbnNlIGZyb20gJy4uL3Jlc3BvbnNlJztcbmltcG9ydCB7IE1hdGhUb29sYmFyIH0gZnJvbSAnQHBpZS1saWIvbWF0aC10b29sYmFyJztcbmltcG9ydCBFZGl0YWJsZUh0bWwgZnJvbSAnQHBpZS1saWIvZWRpdGFibGUtaHRtbC10aXAtdGFwJztcblxuaW1wb3J0IHsgRmVlZGJhY2tDb25maWcsIGxheW91dCwgc2V0dGluZ3MgfSBmcm9tICdAcGllLWxpYi9jb25maWctdWknO1xuXG5pbXBvcnQgZGVmYXVsdFZhbHVlcyBmcm9tICcuLi9kZWZhdWx0cyc7XG5cbmplc3QubW9jaygnQHBpZS1saWIvY29uZmlnLXVpJywgKCkgPT4gKHtcbiAgSW5wdXRDb250YWluZXI6IChwcm9wcykgPT4gPGRpdiBkYXRhLXRlc3RpZD1cImlucHV0LWNvbnRhaW5lclwiPntwcm9wcy5jaGlsZHJlbn08L2Rpdj4sXG4gIElucHV0Q2hlY2tib3g6IChwcm9wcykgPT4gPGRpdiBkYXRhLXRlc3RpZD1cImlucHV0LWNoZWNrYm94XCI+e3Byb3BzLmNoaWxkcmVufTwvZGl2PixcbiAgRmVlZGJhY2tDb25maWc6IChwcm9wcykgPT4gPGRpdiBkYXRhLXRlc3RpZD1cImZlZWRiYWNrLWNvbmZpZ1wiPntwcm9wcy5jaGlsZHJlbn08L2Rpdj4sXG4gIGxheW91dDoge1xuICAgIENvbmZpZ0xheW91dDogKHByb3BzKSA9PiA8ZGl2IGRhdGEtdGVzdGlkPVwiY29uZmlnLWxheW91dFwiPntwcm9wcy5jaGlsZHJlbn08L2Rpdj4sXG4gIH0sXG4gIHNldHRpbmdzOiB7XG4gICAgUGFuZWw6IChwcm9wcykgPT4gPGRpdiBkYXRhLXRlc3RpZD1cInNldHRpbmdzLXBhbmVsXCIgb25DaGFuZ2U9e3Byb3BzLm9uQ2hhbmdlfSAvPixcbiAgICB0b2dnbGU6IGplc3QuZm4oKSxcbiAgICByYWRpbzogamVzdC5mbigpLFxuICB9LFxufSkpO1xuXG5qZXN0Lm1vY2soJ0BwaWUtbGliL21hdGgtdG9vbGJhcicsICgpID0+ICh7XG4gIE1hdGhUb29sYmFyOiAocHJvcHMpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJtYXRoLXRvb2xiYXJcIiB7Li4ucHJvcHN9IC8+LFxufSkpO1xuXG5qZXN0Lm1vY2soJ0BwaWUtbGliL21hdGgtaW5wdXQtbWF0aGxpdmUnLCAoKSA9PiAoe1xuICByZWdpc3RlckVtYmVkOiBqZXN0LmZuKCksXG4gIGFwcGx5U3RhdGljTWF0aDogamVzdC5mbigpLFxufSkpO1xuXG5qZXN0Lm1vY2soJ0BwaWUtbGliL2VkaXRhYmxlLWh0bWwtdGlwLXRhcCcsICgpID0+IChwcm9wcykgPT4gPGRpdiBkYXRhLXRlc3RpZD1cImVkaXRhYmxlLWh0bWxcIiB7Li4ucHJvcHN9IC8+KTtcblxuamVzdC5tb2NrKCcuLi9yZXNwb25zZScsICgpID0+IChwcm9wcykgPT4gPGRpdiBkYXRhLXRlc3RpZD1cInJlc3BvbnNlXCIgey4uLnByb3BzfSAvPik7XG5cbmNvbnN0IHsgcmVnaXN0ZXJFbWJlZCB9ID0gcmVxdWlyZSgnQHBpZS1saWIvbWF0aC1pbnB1dC1tYXRobGl2ZScpO1xuXG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIG1vZGVsOiB7XG4gICAgaWQ6ICcxJyxcbiAgICBwcm9tcHRFbmFibGVkOiB0cnVlLFxuICAgIGZlZWRiYWNrRW5hYmxlZDogdHJ1ZSxcbiAgICBlbGVtZW50OiAnbWF0aC1pbmxpbmUnLFxuICAgIHJlc3BvbnNlVHlwZTogJ0FkdmFuY2VkIE11bHRpJyxcbiAgICBmZWVkYmFjazoge1xuICAgICAgY29ycmVjdDoge1xuICAgICAgICBkZWZhdWx0OiAnQ29ycmVjdCcsXG4gICAgICAgIHR5cGU6ICdub25lJyxcbiAgICAgIH0sXG4gICAgICBpbmNvcnJlY3Q6IHtcbiAgICAgICAgZGVmYXVsdDogJ0luY29ycmVjdCcsXG4gICAgICAgIHR5cGU6ICdub25lJyxcbiAgICAgIH0sXG4gICAgICBwYXJ0aWFsOiB7XG4gICAgICAgIGRlZmF1bHQ6ICdOZWFybHknLFxuICAgICAgICB0eXBlOiAnbm9uZScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgZXF1YXRpb25FZGl0b3I6ICczJyxcbiAgICBleHByZXNzaW9uOiAne3tyZXNwb25zZX19ID0ge3tyZXNwb25zZX19IFxcXFx0ZXh0e2VnZ3N9JyxcbiAgICBxdWVzdGlvbjpcbiAgICAgICc8cD5TYW0gc2VsbHMgYmFza2V0cyBvZiBlZ2dzIGF0IGhpcyBmYXJtIHN0YW5kLiBIZSBzb2xkIDEyIGJhc2tldHMgYW5kIHdyb3RlIHRoZSBudW1iZXIgc2VudGVuY2UgYmVsb3cgdG8gc2hvdyBob3cgbWFueSBlZ2dzIGhlIHNvbGQgaW4gYWxsLjwvcD48cD48c3BhbiBjbGFzcz1cImVxdWF0aW9uLWJsb2NrXCI+PG1hdGggeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MXCIgPlxcbiA8bXJvdz5cXG4gIDxtbj4xMjwvbW4+PG1vPiYjeDAwRDc7PC9tbz48bW8+JiN4MjVBMTs8L21vPjxtbz49PC9tbz48bW4+NzI8L21uPlxcbiA8L21yb3c+XFxuPC9tYXRoPiA8L3NwYW4+PC9wPjxwPldoYXQgPHNwYW4gY2xhc3M9XCJyZWxhdGl2ZS1lbXBoYXNpc1wiPmRpdmlzaW9uPC9zcGFuPiBudW1iZXIgc2VudGVuY2UgY2FuIGJlIHVzZWQgdG8gc2hvdyBob3cgbWFueSBlZ2dzIHdlcmUgaW4gZWFjaCBiYXNrZXQ/PC9wPjxwPlVzZSB0aGUgb24tc2NyZWVuIGtleWJvYXJkIHRvIHR5cGUgeW91ciBudW1iZXIgc2VudGVuY2UgYW5kIGFuc3dlciBpbiB0aGUgYm94LjwvcD4nLFxuICAgIHJlc3BvbnNlOiB7XG4gICAgICBhbnN3ZXI6ICc3MlxcXFxkaXYxMj02XFxcXHRleHR7ZWdnc30nLFxuICAgICAgYWx0ZXJuYXRlczoge1xuICAgICAgICAxOiAnNj03MlxcXFxkaXYxMlxcXFx0ZXh0e2VnZ3N9JyxcbiAgICAgICAgMjogJ1xcXFxmcmFjezcyfXsxMn09NlxcXFx0ZXh0e2VnZ3N9JyxcbiAgICAgICAgMzogJzY9XFxcXGZyYWN7NzJ9ezEyfVxcXFx0ZXh0e2VnZ3N9JyxcbiAgICAgIH0sXG4gICAgICB2YWxpZGF0aW9uOiAnbGl0ZXJhbCcsXG4gICAgfSxcbiAgICByZXNwb25zZXM6IFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgYW5zd2VyOiAnNzJcXFxcZGl2MTI9NlxcXFx0ZXh0e2VnZ3N9JyxcbiAgICAgICAgYWx0ZXJuYXRlczoge1xuICAgICAgICAgIDE6ICc2PTcyXFxcXGRpdjEyXFxcXHRleHR7ZWdnc30nLFxuICAgICAgICAgIDI6ICdcXFxcZnJhY3s3Mn17MTJ9PTZcXFxcdGV4dHtlZ2dzfScsXG4gICAgICAgICAgMzogJzY9XFxcXGZyYWN7NzJ9ezEyfVxcXFx0ZXh0e2VnZ3N9JyxcbiAgICAgICAgfSxcbiAgICAgICAgdmFsaWRhdGlvbjogJ2xpdGVyYWwnLFxuICAgICAgfSxcbiAgICBdLFxuICAgIG5vdGU6ICdUaGUgYW5zd2VyIHNob3duIGFib3ZlIGlzIHRoZSBwcmltYXJ5IGNvcnJlY3QgYW5zd2VyIHNwZWNpZmllZCBieSB0aGUgYXV0aG9yIGZvciB0aGlzIGl0ZW0sIGJ1dCBvdGhlciBhbnN3ZXJzIG1heSBhbHNvIGJlIHJlY29nbml6ZWQgYXMgY29ycmVjdC4nLFxuICAgIGN1c3RvbUtleXM6IFsnXFxcXGxlZnQoXFxcXHJpZ2h0KScsICdcXFxcZnJhY3t9e30nLCAneFxcXFxmcmFje317fSddLFxuICAgIGNvbmZpZ3VyZTogZGVmYXVsdFZhbHVlcy5jb25maWd1cmUsXG4gIH0sXG4gIGNvbmZpZ3VyYXRpb246IGRlZmF1bHRWYWx1ZXMuY29uZmlndXJhdGlvbixcbn07XG5cbmRlc2NyaWJlKCdDb25maWd1cmUnLCAoKSA9PiB7XG4gIGl0KCdjaGFuZ2VUZWFjaGVySW5zdHJ1Y3Rpb25zIGNhbGxzIG9uTW9kZWxDaGFuZ2UnLCAoKSA9PiB7XG4gICAgY29uc3Qgb25Nb2RlbENoYW5nZWQgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcihcbiAgICAgIDxDb25maWd1cmVOb3RTdHlsZWQgb25Nb2RlbENoYW5nZWQ9e29uTW9kZWxDaGFuZ2VkfSBjbGFzc2VzPXt7fX0gey4uLmRlZmF1bHRWYWx1ZXN9IC8+LFxuICAgICk7XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBDb25maWd1cmVOb3RTdHlsZWQoeyBvbk1vZGVsQ2hhbmdlZCwgY2xhc3Nlczoge30sIC4uLmRlZmF1bHRWYWx1ZXMgfSk7XG4gICAgaW5zdGFuY2UuY2hhbmdlVGVhY2hlckluc3RydWN0aW9ucygnVGVhY2hlciBJbnN0cnVjdGlvbnMnKTtcblxuICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoXG4gICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICB9KSxcbiAgICApO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnR2VuZXJhbENvbmZpZ0Jsb2NrJywgKCkgPT4ge1xuICAvLyBVbm1vY2sgR2VuZXJhbENvbmZpZ0Jsb2NrIGZvciB0aGVzZSB0ZXN0c1xuICBjb25zdCBHZW5lcmFsQ29uZmlnQmxvY2sgPSByZXF1aXJlKCcuLi9nZW5lcmFsLWNvbmZpZy1ibG9jaycpLmRlZmF1bHQ7XG5cbiAgbGV0IHByb3BzO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHByb3BzID0ge1xuICAgICAgbW9kZWw6IGRlZmF1bHRQcm9wcy5tb2RlbCxcbiAgICAgIHByb21wdEVuYWJsZWQ6IHRydWUsXG4gICAgICBjb25maWd1cmF0aW9uOiBkZWZhdWx0VmFsdWVzLmNvbmZpZ3VyYXRpb24sXG4gICAgICBvbkNoYW5nZTogamVzdC5mbigpLFxuICAgICAgaW1hZ2VTdXBwb3J0OiB7fSxcbiAgICAgIHVwbG9hZFNvdW5kU3VwcG9ydDoge30sXG4gICAgfTtcbiAgfSk7XG5cbiAgY29uc3Qgd3JhcHBlciA9IChleHRyYVByb3BzID0ge30pID0+IHtcbiAgICByZXR1cm4gcmVuZGVyKDxHZW5lcmFsQ29uZmlnQmxvY2sgey4uLnByb3BzfSB7Li4uZXh0cmFQcm9wc30gLz4pO1xuICB9O1xuXG4gIGNvbnN0IGNyZWF0ZUluc3RhbmNlID0gKGV4dHJhUHJvcHMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IGluc3RhbmNlUHJvcHMgPSB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIC4uLmV4dHJhUHJvcHMsXG4gICAgfTtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBHZW5lcmFsQ29uZmlnQmxvY2soaW5zdGFuY2VQcm9wcyk7XG4gICAgaW5zdGFuY2Uuc2V0U3RhdGUgPSBqZXN0LmZuKChzdGF0ZSkgPT4ge1xuICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZS5zdGF0ZSwgdHlwZW9mIHN0YXRlID09PSAnZnVuY3Rpb24nID8gc3RhdGUoaW5zdGFuY2Uuc3RhdGUpIDogc3RhdGUpO1xuICAgIH0pO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfTtcblxuICBpdCgncmVuZGVycyBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHdyYXBwZXIoKTtcblxuICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignW2RhdGEtdGVzdGlkPVwiaW5wdXQtY29udGFpbmVyXCJdJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgZXhwZWN0KGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbZGF0YS10ZXN0aWQ9XCJyZXNwb25zZVwiXScpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignW2RhdGEtdGVzdGlkPVwibWF0aC10b29sYmFyXCJdJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgZXhwZWN0KGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbZGF0YS10ZXN0aWQ9XCJlZGl0YWJsZS1odG1sXCJdJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgZXhwZWN0KHJlZ2lzdGVyRW1iZWQpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbmRlcnMgY29ycmVjdGx5IGZvciBTaW1wbGUgbW9kZScsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gd3JhcHBlcih7IG1vZGVsOiB7IC4uLnByb3BzLm1vZGVsLCByZXNwb25zZVR5cGU6ICdTaW1wbGUnIH0gfSk7XG5cbiAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRlc3RpZD1cImlucHV0LWNvbnRhaW5lclwiXScpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignW2RhdGEtdGVzdGlkPVwicmVzcG9uc2VcIl0nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRlc3RpZD1cImVkaXRhYmxlLWh0bWxcIl0nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbmRlcnMgY29ycmVjdGx5IHdpdGggc25hcHNob3QnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHdyYXBwZXIoKTtcblxuICAgIC8vIC8vIGV4cGVjdChjb250YWluZXIpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICB9KTtcblxuICBpdCgndXBkYXRlcyBhZHZhbmNlZCBtb2RlbCBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZSh7IG9uQ2hhbmdlIH0pO1xuXG4gICAgaW5zdGFuY2Uub25SZXNwb25zZUNoYW5nZSh7IGFuc3dlcjogJ3NvbWV0aGluZycsIGlkOiAncjEnIH0sIDApO1xuXG4gICAgZXhwZWN0KG9uQ2hhbmdlKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAuLi5wcm9wcy5tb2RlbCxcbiAgICAgIHJlc3BvbnNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdyMScsXG4gICAgICAgICAgYW5zd2VyOiAnc29tZXRoaW5nJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdidWlsZHMgb3V0IGludGVybmFsIHN0YXRlIGNvcnJlY3RseSBiYXNlZCBvbiBleHByZXNzaW9uIHByb3ZpZGVkJywgKCkgPT4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2UoKTtcblxuICAgIGV4cGVjdChpbnN0YW5jZS5zdGF0ZSkudG9FcXVhbCh7XG4gICAgICBzaG93S2V5cGFkOiBmYWxzZSxcbiAgICAgIHJlc3BvbnNlSWRDb3VudGVyOiAyLFxuICAgICAgcmVzcG9uc2VBcmVhczoge1xuICAgICAgICByMToge1xuICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgfSxcbiAgICAgICAgcjI6IHtcbiAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgaW5zdGFuY2VXaXRoTW9yZVJlc3BvbnNlcyA9IGNyZWF0ZUluc3RhbmNlKHtcbiAgICAgIG1vZGVsOiB7XG4gICAgICAgIC4uLnByb3BzLm1vZGVsLFxuICAgICAgICBleHByZXNzaW9uOiBwcm9wcy5tb2RlbC5leHByZXNzaW9uICsgJyB7e3Jlc3BvbnNlfX0gJyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QoaW5zdGFuY2VXaXRoTW9yZVJlc3BvbnNlcy5zdGF0ZSkudG9FcXVhbCh7XG4gICAgICBzaG93S2V5cGFkOiBmYWxzZSxcbiAgICAgIHJlc3BvbnNlSWRDb3VudGVyOiAzLFxuICAgICAgcmVzcG9uc2VBcmVhczoge1xuICAgICAgICByMToge1xuICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgfSxcbiAgICAgICAgcjI6IHtcbiAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgIH0sXG4gICAgICAgIHIzOiB7XG4gICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG59KTtc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
|