@pie-lib/config-ui 12.0.0-next.0 → 12.1.0-next.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.
- package/lib/__tests__/alert-dialog.test.js +262 -0
- package/lib/__tests__/checkbox.test.js +227 -0
- package/lib/__tests__/choice-utils.test.js +14 -0
- package/lib/__tests__/form-section.test.js +252 -0
- package/lib/__tests__/help.test.js +270 -0
- package/lib/__tests__/input.test.js +268 -0
- package/lib/__tests__/langs.test.js +541 -0
- package/lib/__tests__/number-text-field-custom.test.js +362 -0
- package/lib/__tests__/number-text-field.test.js +421 -0
- package/lib/__tests__/radio-with-label.test.js +233 -0
- package/lib/__tests__/settings-panel.test.js +184 -0
- package/lib/__tests__/settings.test.js +653 -0
- package/lib/__tests__/tabs.test.js +211 -0
- package/lib/__tests__/two-choice.test.js +124 -0
- package/lib/__tests__/with-stateful-model.test.js +221 -0
- package/lib/alert-dialog.js +1 -1
- package/lib/checkbox.js +1 -1
- package/lib/choice-configuration/__tests__/feedback-menu.test.js +287 -0
- package/lib/choice-configuration/__tests__/index.test.js +253 -0
- package/lib/choice-configuration/feedback-menu.js +1 -1
- package/lib/choice-configuration/index.js +3 -3
- package/lib/choice-configuration/index.js.map +1 -1
- package/lib/choice-utils.js +1 -1
- package/lib/feedback-config/__tests__/feedback-config.test.js +201 -0
- package/lib/feedback-config/__tests__/feedback-selector.test.js +177 -0
- package/lib/feedback-config/feedback-selector.js +3 -3
- package/lib/feedback-config/feedback-selector.js.map +1 -1
- package/lib/feedback-config/group.js +1 -1
- package/lib/feedback-config/index.js +1 -1
- package/lib/form-section.js +1 -1
- package/lib/help.js +1 -1
- package/lib/index.js +1 -1
- package/lib/input.js +1 -1
- package/lib/inputs.js +1 -1
- package/lib/langs.js +1 -1
- package/lib/layout/__tests__/config.layout.test.js +70 -0
- package/lib/layout/__tests__/layout-content.test.js +6 -0
- package/lib/layout/config-layout.js +1 -1
- package/lib/layout/index.js +1 -1
- package/lib/layout/layout-contents.js +1 -1
- package/lib/layout/settings-box.js +1 -1
- package/lib/mui-box/index.js +1 -1
- package/lib/number-text-field-custom.js +1 -1
- package/lib/number-text-field.js +1 -1
- package/lib/radio-with-label.js +1 -1
- package/lib/settings/display-size.js +1 -1
- package/lib/settings/index.js +1 -1
- package/lib/settings/panel.js +1 -1
- package/lib/settings/settings-radio-label.js +1 -1
- package/lib/settings/toggle.js +1 -1
- package/lib/tabs/index.js +1 -1
- package/lib/tags-input/__tests__/index.test.js +183 -0
- package/lib/tags-input/index.js +1 -1
- package/lib/two-choice.js +1 -1
- package/lib/with-stateful-model.js +1 -1
- package/package.json +5 -13
- package/src/choice-configuration/__tests__/index.test.jsx +1 -1
- package/src/choice-configuration/index.jsx +68 -75
- package/src/feedback-config/__tests__/feedback-selector.test.jsx +3 -13
- package/src/feedback-config/feedback-selector.jsx +3 -7
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
5
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
6
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
7
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
8
|
+
var _react = require("@testing-library/react");
|
|
9
|
+
var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
|
|
10
|
+
var _react2 = _interopRequireDefault(require("react"));
|
|
11
|
+
var _langs = require("../langs");
|
|
12
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
13
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
14
|
+
describe('Langs Component', function () {
|
|
15
|
+
var onChange;
|
|
16
|
+
var renderComponent = function renderComponent() {
|
|
17
|
+
var extras = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
18
|
+
var defaults = {
|
|
19
|
+
uid: '1',
|
|
20
|
+
onChange: onChange,
|
|
21
|
+
langs: ['en-US', 'es-ES'],
|
|
22
|
+
selected: 'en-US'
|
|
23
|
+
};
|
|
24
|
+
var props = _objectSpread(_objectSpread({}, defaults), extras);
|
|
25
|
+
return (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_langs.Langs, props));
|
|
26
|
+
};
|
|
27
|
+
beforeEach(function () {
|
|
28
|
+
onChange = jest.fn();
|
|
29
|
+
});
|
|
30
|
+
describe('rendering', function () {
|
|
31
|
+
it('renders language selector with options', function () {
|
|
32
|
+
renderComponent();
|
|
33
|
+
|
|
34
|
+
// Select should be present
|
|
35
|
+
var select = _react.screen.getByRole('combobox');
|
|
36
|
+
expect(select).toBeInTheDocument();
|
|
37
|
+
|
|
38
|
+
// Should show selected value - MUI Select displays value as text content
|
|
39
|
+
expect(select).toHaveTextContent('en-US');
|
|
40
|
+
});
|
|
41
|
+
it('renders with custom label', function () {
|
|
42
|
+
renderComponent({
|
|
43
|
+
label: 'Choose Language'
|
|
44
|
+
});
|
|
45
|
+
expect(_react.screen.getByText('Choose Language')).toBeInTheDocument();
|
|
46
|
+
});
|
|
47
|
+
it('renders all language options', function () {
|
|
48
|
+
var _renderComponent = renderComponent({
|
|
49
|
+
langs: ['en-US', 'es-ES', 'fr-FR', 'de-DE']
|
|
50
|
+
}),
|
|
51
|
+
container = _renderComponent.container;
|
|
52
|
+
var select = _react.screen.getByRole('combobox');
|
|
53
|
+
expect(select).toBeInTheDocument();
|
|
54
|
+
});
|
|
55
|
+
it('renders with multiple languages', function () {
|
|
56
|
+
var langs = ['en-US', 'es-ES', 'fr-FR', 'pt-BR'];
|
|
57
|
+
renderComponent({
|
|
58
|
+
langs: langs
|
|
59
|
+
});
|
|
60
|
+
var select = _react.screen.getByRole('combobox');
|
|
61
|
+
expect(select).toHaveTextContent('en-US');
|
|
62
|
+
});
|
|
63
|
+
it('renders FormControl with proper structure', function () {
|
|
64
|
+
var _renderComponent2 = renderComponent(),
|
|
65
|
+
container = _renderComponent2.container;
|
|
66
|
+
expect(container.querySelector('[class*="MuiFormControl"]')).toBeInTheDocument();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe('user interactions', function () {
|
|
70
|
+
it('calls onChange when user selects a language', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
71
|
+
var user, select;
|
|
72
|
+
return _regenerator["default"].wrap(function (_context) {
|
|
73
|
+
while (1) switch (_context.prev = _context.next) {
|
|
74
|
+
case 0:
|
|
75
|
+
user = _userEvent["default"].setup();
|
|
76
|
+
renderComponent();
|
|
77
|
+
select = _react.screen.getByRole('combobox'); // Open the select and choose es-ES
|
|
78
|
+
_context.next = 1;
|
|
79
|
+
return user.click(select);
|
|
80
|
+
case 1:
|
|
81
|
+
_context.next = 2;
|
|
82
|
+
return user.click(_react.screen.getByRole('option', {
|
|
83
|
+
name: 'es-ES'
|
|
84
|
+
}));
|
|
85
|
+
case 2:
|
|
86
|
+
expect(onChange).toHaveBeenCalledWith('es-ES');
|
|
87
|
+
case 3:
|
|
88
|
+
case "end":
|
|
89
|
+
return _context.stop();
|
|
90
|
+
}
|
|
91
|
+
}, _callee);
|
|
92
|
+
})));
|
|
93
|
+
it('calls onChange with correct value', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
|
94
|
+
var user, select;
|
|
95
|
+
return _regenerator["default"].wrap(function (_context2) {
|
|
96
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
97
|
+
case 0:
|
|
98
|
+
user = _userEvent["default"].setup();
|
|
99
|
+
renderComponent({
|
|
100
|
+
selected: 'es-ES'
|
|
101
|
+
});
|
|
102
|
+
select = _react.screen.getByRole('combobox');
|
|
103
|
+
_context2.next = 1;
|
|
104
|
+
return user.click(select);
|
|
105
|
+
case 1:
|
|
106
|
+
_context2.next = 2;
|
|
107
|
+
return user.click(_react.screen.getByRole('option', {
|
|
108
|
+
name: 'en-US'
|
|
109
|
+
}));
|
|
110
|
+
case 2:
|
|
111
|
+
expect(onChange).toHaveBeenCalledWith('en-US');
|
|
112
|
+
case 3:
|
|
113
|
+
case "end":
|
|
114
|
+
return _context2.stop();
|
|
115
|
+
}
|
|
116
|
+
}, _callee2);
|
|
117
|
+
})));
|
|
118
|
+
it('opens dropdown on click', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
|
119
|
+
var user, select;
|
|
120
|
+
return _regenerator["default"].wrap(function (_context3) {
|
|
121
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
122
|
+
case 0:
|
|
123
|
+
user = _userEvent["default"].setup();
|
|
124
|
+
renderComponent({
|
|
125
|
+
langs: ['en-US', 'es-ES', 'fr-FR']
|
|
126
|
+
});
|
|
127
|
+
select = _react.screen.getByRole('combobox');
|
|
128
|
+
_context3.next = 1;
|
|
129
|
+
return user.click(select);
|
|
130
|
+
case 1:
|
|
131
|
+
expect(_react.screen.getByRole('option', {
|
|
132
|
+
name: 'en-US'
|
|
133
|
+
})).toBeInTheDocument();
|
|
134
|
+
expect(_react.screen.getByRole('option', {
|
|
135
|
+
name: 'es-ES'
|
|
136
|
+
})).toBeInTheDocument();
|
|
137
|
+
expect(_react.screen.getByRole('option', {
|
|
138
|
+
name: 'fr-FR'
|
|
139
|
+
})).toBeInTheDocument();
|
|
140
|
+
case 2:
|
|
141
|
+
case "end":
|
|
142
|
+
return _context3.stop();
|
|
143
|
+
}
|
|
144
|
+
}, _callee3);
|
|
145
|
+
})));
|
|
146
|
+
it('does not call onChange if no onChange prop provided', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4() {
|
|
147
|
+
var user, _render, container, select;
|
|
148
|
+
return _regenerator["default"].wrap(function (_context4) {
|
|
149
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
150
|
+
case 0:
|
|
151
|
+
user = _userEvent["default"].setup();
|
|
152
|
+
_render = (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_langs.Langs, {
|
|
153
|
+
uid: "1",
|
|
154
|
+
langs: ['en-US', 'es-ES'],
|
|
155
|
+
selected: "en-US"
|
|
156
|
+
})), container = _render.container;
|
|
157
|
+
select = _react.screen.getByRole('combobox');
|
|
158
|
+
_context4.next = 1;
|
|
159
|
+
return user.click(select);
|
|
160
|
+
case 1:
|
|
161
|
+
_context4.next = 2;
|
|
162
|
+
return user.click(_react.screen.getByRole('option', {
|
|
163
|
+
name: 'es-ES'
|
|
164
|
+
}));
|
|
165
|
+
case 2:
|
|
166
|
+
// Should not throw any error
|
|
167
|
+
expect(select).toBeInTheDocument();
|
|
168
|
+
case 3:
|
|
169
|
+
case "end":
|
|
170
|
+
return _context4.stop();
|
|
171
|
+
}
|
|
172
|
+
}, _callee4);
|
|
173
|
+
})));
|
|
174
|
+
});
|
|
175
|
+
describe('props handling', function () {
|
|
176
|
+
it('accepts custom uid', function () {
|
|
177
|
+
var customUid = 'custom-uid-123';
|
|
178
|
+
var _renderComponent3 = renderComponent({
|
|
179
|
+
uid: customUid
|
|
180
|
+
}),
|
|
181
|
+
container = _renderComponent3.container;
|
|
182
|
+
var input = container.querySelector("#".concat(customUid));
|
|
183
|
+
expect(input).toBeInTheDocument();
|
|
184
|
+
});
|
|
185
|
+
it('generates random uid if not provided', function () {
|
|
186
|
+
var _render2 = (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_langs.Langs, {
|
|
187
|
+
onChange: onChange,
|
|
188
|
+
langs: ['en-US', 'es-ES'],
|
|
189
|
+
selected: "en-US"
|
|
190
|
+
})),
|
|
191
|
+
container = _render2.container;
|
|
192
|
+
var select = _react.screen.getByRole('combobox');
|
|
193
|
+
expect(select).toBeInTheDocument();
|
|
194
|
+
});
|
|
195
|
+
it('handles empty label', function () {
|
|
196
|
+
renderComponent({
|
|
197
|
+
label: ''
|
|
198
|
+
});
|
|
199
|
+
var select = _react.screen.getByRole('combobox');
|
|
200
|
+
expect(select).toBeInTheDocument();
|
|
201
|
+
});
|
|
202
|
+
it('handles very long label', function () {
|
|
203
|
+
var longLabel = 'Choose the language you would like to use for editing this content';
|
|
204
|
+
renderComponent({
|
|
205
|
+
label: longLabel
|
|
206
|
+
});
|
|
207
|
+
expect(_react.screen.getByText(longLabel)).toBeInTheDocument();
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
describe('value updates', function () {
|
|
211
|
+
it('updates selected value when prop changes', function () {
|
|
212
|
+
var _renderComponent4 = renderComponent({
|
|
213
|
+
selected: 'en-US'
|
|
214
|
+
}),
|
|
215
|
+
rerender = _renderComponent4.rerender;
|
|
216
|
+
var select = _react.screen.getByRole('combobox');
|
|
217
|
+
expect(select).toHaveTextContent('en-US');
|
|
218
|
+
rerender(/*#__PURE__*/_react2["default"].createElement(_langs.Langs, {
|
|
219
|
+
uid: "1",
|
|
220
|
+
onChange: onChange,
|
|
221
|
+
langs: ['en-US', 'es-ES'],
|
|
222
|
+
selected: "es-ES"
|
|
223
|
+
}));
|
|
224
|
+
select = _react.screen.getByRole('combobox');
|
|
225
|
+
expect(select).toHaveTextContent('es-ES');
|
|
226
|
+
});
|
|
227
|
+
it('maintains state when language options change', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5() {
|
|
228
|
+
var user, _renderComponent5, rerender, select;
|
|
229
|
+
return _regenerator["default"].wrap(function (_context5) {
|
|
230
|
+
while (1) switch (_context5.prev = _context5.next) {
|
|
231
|
+
case 0:
|
|
232
|
+
user = _userEvent["default"].setup();
|
|
233
|
+
_renderComponent5 = renderComponent({
|
|
234
|
+
langs: ['en-US', 'es-ES'],
|
|
235
|
+
selected: 'en-US'
|
|
236
|
+
}), rerender = _renderComponent5.rerender;
|
|
237
|
+
rerender(/*#__PURE__*/_react2["default"].createElement(_langs.Langs, {
|
|
238
|
+
uid: "1",
|
|
239
|
+
onChange: onChange,
|
|
240
|
+
langs: ['en-US', 'es-ES', 'fr-FR'],
|
|
241
|
+
selected: "en-US"
|
|
242
|
+
}));
|
|
243
|
+
select = _react.screen.getByRole('combobox');
|
|
244
|
+
expect(select).toHaveTextContent('en-US');
|
|
245
|
+
case 1:
|
|
246
|
+
case "end":
|
|
247
|
+
return _context5.stop();
|
|
248
|
+
}
|
|
249
|
+
}, _callee5);
|
|
250
|
+
})));
|
|
251
|
+
});
|
|
252
|
+
describe('keyboard navigation', function () {
|
|
253
|
+
it('opens dropdown with keyboard', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
|
|
254
|
+
var user, select;
|
|
255
|
+
return _regenerator["default"].wrap(function (_context6) {
|
|
256
|
+
while (1) switch (_context6.prev = _context6.next) {
|
|
257
|
+
case 0:
|
|
258
|
+
user = _userEvent["default"].setup();
|
|
259
|
+
renderComponent({
|
|
260
|
+
langs: ['en-US', 'es-ES']
|
|
261
|
+
});
|
|
262
|
+
select = _react.screen.getByRole('combobox');
|
|
263
|
+
select.focus();
|
|
264
|
+
_context6.next = 1;
|
|
265
|
+
return user.keyboard(' ');
|
|
266
|
+
case 1:
|
|
267
|
+
expect(_react.screen.getByRole('option', {
|
|
268
|
+
name: 'en-US'
|
|
269
|
+
})).toBeInTheDocument();
|
|
270
|
+
case 2:
|
|
271
|
+
case "end":
|
|
272
|
+
return _context6.stop();
|
|
273
|
+
}
|
|
274
|
+
}, _callee6);
|
|
275
|
+
})));
|
|
276
|
+
});
|
|
277
|
+
describe('accessibility', function () {
|
|
278
|
+
it('has proper label association', function () {
|
|
279
|
+
renderComponent({
|
|
280
|
+
label: 'Select Language'
|
|
281
|
+
});
|
|
282
|
+
var select = _react.screen.getByRole('combobox');
|
|
283
|
+
expect(select).toBeInTheDocument();
|
|
284
|
+
});
|
|
285
|
+
it('renders options with proper roles', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
|
|
286
|
+
var user, select, options;
|
|
287
|
+
return _regenerator["default"].wrap(function (_context7) {
|
|
288
|
+
while (1) switch (_context7.prev = _context7.next) {
|
|
289
|
+
case 0:
|
|
290
|
+
user = _userEvent["default"].setup();
|
|
291
|
+
renderComponent({
|
|
292
|
+
langs: ['en-US', 'es-ES', 'fr-FR']
|
|
293
|
+
});
|
|
294
|
+
select = _react.screen.getByRole('combobox');
|
|
295
|
+
_context7.next = 1;
|
|
296
|
+
return user.click(select);
|
|
297
|
+
case 1:
|
|
298
|
+
options = _react.screen.getAllByRole('option');
|
|
299
|
+
expect(options.length).toBe(3);
|
|
300
|
+
case 2:
|
|
301
|
+
case "end":
|
|
302
|
+
return _context7.stop();
|
|
303
|
+
}
|
|
304
|
+
}, _callee7);
|
|
305
|
+
})));
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
describe('LanguageControls Component', function () {
|
|
309
|
+
var defaultProps = {
|
|
310
|
+
langs: ['en-US', 'es-ES', 'fr-FR'],
|
|
311
|
+
activeLang: 'en-US',
|
|
312
|
+
defaultLang: 'en-US',
|
|
313
|
+
onActiveLangChange: jest.fn(),
|
|
314
|
+
onDefaultLangChange: jest.fn()
|
|
315
|
+
};
|
|
316
|
+
beforeEach(function () {
|
|
317
|
+
jest.clearAllMocks();
|
|
318
|
+
});
|
|
319
|
+
describe('rendering', function () {
|
|
320
|
+
it('renders both language selectors', function () {
|
|
321
|
+
(0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_langs.LanguageControls, defaultProps));
|
|
322
|
+
expect(_react.screen.getByText('Choose language to edit')).toBeInTheDocument();
|
|
323
|
+
expect(_react.screen.getByText('Default language')).toBeInTheDocument();
|
|
324
|
+
});
|
|
325
|
+
it('renders with correct initial values', function () {
|
|
326
|
+
(0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_langs.LanguageControls, defaultProps));
|
|
327
|
+
var selects = _react.screen.getAllByRole('combobox');
|
|
328
|
+
expect(selects).toHaveLength(2);
|
|
329
|
+
});
|
|
330
|
+
it('applies custom className', function () {
|
|
331
|
+
var _render3 = (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_langs.LanguageControls, (0, _extends2["default"])({}, defaultProps, {
|
|
332
|
+
className: "custom-class"
|
|
333
|
+
}))),
|
|
334
|
+
container = _render3.container;
|
|
335
|
+
expect(container.querySelector('.custom-class')).toBeInTheDocument();
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
describe('user interactions', function () {
|
|
339
|
+
it('calls onActiveLangChange when active language is changed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee8() {
|
|
340
|
+
var user, onActiveLangChange, selects, activeSelect;
|
|
341
|
+
return _regenerator["default"].wrap(function (_context8) {
|
|
342
|
+
while (1) switch (_context8.prev = _context8.next) {
|
|
343
|
+
case 0:
|
|
344
|
+
user = _userEvent["default"].setup();
|
|
345
|
+
onActiveLangChange = jest.fn();
|
|
346
|
+
(0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_langs.LanguageControls, (0, _extends2["default"])({}, defaultProps, {
|
|
347
|
+
activeLang: "en-US",
|
|
348
|
+
onActiveLangChange: onActiveLangChange
|
|
349
|
+
})));
|
|
350
|
+
selects = _react.screen.getAllByRole('combobox');
|
|
351
|
+
activeSelect = selects[0];
|
|
352
|
+
_context8.next = 1;
|
|
353
|
+
return user.click(activeSelect);
|
|
354
|
+
case 1:
|
|
355
|
+
_context8.next = 2;
|
|
356
|
+
return user.click(_react.screen.getByRole('option', {
|
|
357
|
+
name: 'es-ES'
|
|
358
|
+
}));
|
|
359
|
+
case 2:
|
|
360
|
+
expect(onActiveLangChange).toHaveBeenCalledWith('es-ES');
|
|
361
|
+
case 3:
|
|
362
|
+
case "end":
|
|
363
|
+
return _context8.stop();
|
|
364
|
+
}
|
|
365
|
+
}, _callee8);
|
|
366
|
+
})));
|
|
367
|
+
it('calls onDefaultLangChange when default language is changed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee9() {
|
|
368
|
+
var user, onDefaultLangChange, selects, defaultSelect;
|
|
369
|
+
return _regenerator["default"].wrap(function (_context9) {
|
|
370
|
+
while (1) switch (_context9.prev = _context9.next) {
|
|
371
|
+
case 0:
|
|
372
|
+
user = _userEvent["default"].setup();
|
|
373
|
+
onDefaultLangChange = jest.fn();
|
|
374
|
+
(0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_langs.LanguageControls, (0, _extends2["default"])({}, defaultProps, {
|
|
375
|
+
defaultLang: "en-US",
|
|
376
|
+
onDefaultLangChange: onDefaultLangChange
|
|
377
|
+
})));
|
|
378
|
+
selects = _react.screen.getAllByRole('combobox');
|
|
379
|
+
defaultSelect = selects[1];
|
|
380
|
+
_context9.next = 1;
|
|
381
|
+
return user.click(defaultSelect);
|
|
382
|
+
case 1:
|
|
383
|
+
_context9.next = 2;
|
|
384
|
+
return user.click(_react.screen.getByRole('option', {
|
|
385
|
+
name: 'fr-FR'
|
|
386
|
+
}));
|
|
387
|
+
case 2:
|
|
388
|
+
expect(onDefaultLangChange).toHaveBeenCalledWith('fr-FR');
|
|
389
|
+
case 3:
|
|
390
|
+
case "end":
|
|
391
|
+
return _context9.stop();
|
|
392
|
+
}
|
|
393
|
+
}, _callee9);
|
|
394
|
+
})));
|
|
395
|
+
it('handles independent language changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee0() {
|
|
396
|
+
var user, onActiveLangChange, onDefaultLangChange, selects;
|
|
397
|
+
return _regenerator["default"].wrap(function (_context0) {
|
|
398
|
+
while (1) switch (_context0.prev = _context0.next) {
|
|
399
|
+
case 0:
|
|
400
|
+
user = _userEvent["default"].setup();
|
|
401
|
+
onActiveLangChange = jest.fn();
|
|
402
|
+
onDefaultLangChange = jest.fn();
|
|
403
|
+
(0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_langs.LanguageControls, (0, _extends2["default"])({}, defaultProps, {
|
|
404
|
+
activeLang: "en-US",
|
|
405
|
+
defaultLang: "en-US",
|
|
406
|
+
onActiveLangChange: onActiveLangChange,
|
|
407
|
+
onDefaultLangChange: onDefaultLangChange
|
|
408
|
+
})));
|
|
409
|
+
selects = _react.screen.getAllByRole('combobox'); // Change active language
|
|
410
|
+
_context0.next = 1;
|
|
411
|
+
return user.click(selects[0]);
|
|
412
|
+
case 1:
|
|
413
|
+
_context0.next = 2;
|
|
414
|
+
return user.click(_react.screen.getByRole('option', {
|
|
415
|
+
name: 'es-ES'
|
|
416
|
+
}));
|
|
417
|
+
case 2:
|
|
418
|
+
expect(onActiveLangChange).toHaveBeenCalledWith('es-ES');
|
|
419
|
+
expect(onDefaultLangChange).not.toHaveBeenCalled();
|
|
420
|
+
case 3:
|
|
421
|
+
case "end":
|
|
422
|
+
return _context0.stop();
|
|
423
|
+
}
|
|
424
|
+
}, _callee0);
|
|
425
|
+
})));
|
|
426
|
+
});
|
|
427
|
+
describe('props handling', function () {
|
|
428
|
+
it('displays correct language options', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee1() {
|
|
429
|
+
var user, selects;
|
|
430
|
+
return _regenerator["default"].wrap(function (_context1) {
|
|
431
|
+
while (1) switch (_context1.prev = _context1.next) {
|
|
432
|
+
case 0:
|
|
433
|
+
user = _userEvent["default"].setup();
|
|
434
|
+
(0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_langs.LanguageControls, (0, _extends2["default"])({}, defaultProps, {
|
|
435
|
+
langs: ['en-US', 'es-ES', 'fr-FR', 'de-DE']
|
|
436
|
+
})));
|
|
437
|
+
selects = _react.screen.getAllByRole('combobox');
|
|
438
|
+
_context1.next = 1;
|
|
439
|
+
return user.click(selects[0]);
|
|
440
|
+
case 1:
|
|
441
|
+
expect(_react.screen.getByRole('option', {
|
|
442
|
+
name: 'en-US'
|
|
443
|
+
})).toBeInTheDocument();
|
|
444
|
+
expect(_react.screen.getByRole('option', {
|
|
445
|
+
name: 'es-ES'
|
|
446
|
+
})).toBeInTheDocument();
|
|
447
|
+
expect(_react.screen.getByRole('option', {
|
|
448
|
+
name: 'fr-FR'
|
|
449
|
+
})).toBeInTheDocument();
|
|
450
|
+
expect(_react.screen.getByRole('option', {
|
|
451
|
+
name: 'de-DE'
|
|
452
|
+
})).toBeInTheDocument();
|
|
453
|
+
case 2:
|
|
454
|
+
case "end":
|
|
455
|
+
return _context1.stop();
|
|
456
|
+
}
|
|
457
|
+
}, _callee1);
|
|
458
|
+
})));
|
|
459
|
+
it('maintains different active and default languages', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee10() {
|
|
460
|
+
var user, selects;
|
|
461
|
+
return _regenerator["default"].wrap(function (_context10) {
|
|
462
|
+
while (1) switch (_context10.prev = _context10.next) {
|
|
463
|
+
case 0:
|
|
464
|
+
user = _userEvent["default"].setup();
|
|
465
|
+
(0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_langs.LanguageControls, (0, _extends2["default"])({}, defaultProps, {
|
|
466
|
+
activeLang: "es-ES",
|
|
467
|
+
defaultLang: "en-US"
|
|
468
|
+
})));
|
|
469
|
+
selects = _react.screen.getAllByRole('combobox');
|
|
470
|
+
expect(selects[0]).toHaveTextContent('es-ES');
|
|
471
|
+
expect(selects[1]).toHaveTextContent('en-US');
|
|
472
|
+
case 1:
|
|
473
|
+
case "end":
|
|
474
|
+
return _context10.stop();
|
|
475
|
+
}
|
|
476
|
+
}, _callee10);
|
|
477
|
+
})));
|
|
478
|
+
});
|
|
479
|
+
describe('updates', function () {
|
|
480
|
+
it('updates when activeLang prop changes', function () {
|
|
481
|
+
var _render4 = (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_langs.LanguageControls, (0, _extends2["default"])({}, defaultProps, {
|
|
482
|
+
activeLang: "en-US"
|
|
483
|
+
}))),
|
|
484
|
+
rerender = _render4.rerender;
|
|
485
|
+
var selects = _react.screen.getAllByRole('combobox');
|
|
486
|
+
expect(selects[0]).toHaveTextContent('en-US');
|
|
487
|
+
rerender(/*#__PURE__*/_react2["default"].createElement(_langs.LanguageControls, (0, _extends2["default"])({}, defaultProps, {
|
|
488
|
+
activeLang: "es-ES"
|
|
489
|
+
})));
|
|
490
|
+
selects = _react.screen.getAllByRole('combobox');
|
|
491
|
+
expect(selects[0]).toHaveTextContent('es-ES');
|
|
492
|
+
});
|
|
493
|
+
it('updates when defaultLang prop changes', function () {
|
|
494
|
+
var _render5 = (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_langs.LanguageControls, (0, _extends2["default"])({}, defaultProps, {
|
|
495
|
+
defaultLang: "en-US"
|
|
496
|
+
}))),
|
|
497
|
+
rerender = _render5.rerender;
|
|
498
|
+
var selects = _react.screen.getAllByRole('combobox');
|
|
499
|
+
expect(selects[1]).toHaveTextContent('en-US');
|
|
500
|
+
rerender(/*#__PURE__*/_react2["default"].createElement(_langs.LanguageControls, (0, _extends2["default"])({}, defaultProps, {
|
|
501
|
+
defaultLang: "fr-FR"
|
|
502
|
+
})));
|
|
503
|
+
selects = _react.screen.getAllByRole('combobox');
|
|
504
|
+
expect(selects[1]).toHaveTextContent('fr-FR');
|
|
505
|
+
});
|
|
506
|
+
it('updates when langs prop changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee11() {
|
|
507
|
+
var user, _render6, rerender, selects;
|
|
508
|
+
return _regenerator["default"].wrap(function (_context11) {
|
|
509
|
+
while (1) switch (_context11.prev = _context11.next) {
|
|
510
|
+
case 0:
|
|
511
|
+
user = _userEvent["default"].setup();
|
|
512
|
+
_render6 = (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_langs.LanguageControls, (0, _extends2["default"])({}, defaultProps, {
|
|
513
|
+
langs: ['en-US', 'es-ES']
|
|
514
|
+
}))), rerender = _render6.rerender;
|
|
515
|
+
rerender(/*#__PURE__*/_react2["default"].createElement(_langs.LanguageControls, (0, _extends2["default"])({}, defaultProps, {
|
|
516
|
+
langs: ['en-US', 'es-ES', 'fr-FR']
|
|
517
|
+
})));
|
|
518
|
+
selects = _react.screen.getAllByRole('combobox');
|
|
519
|
+
_context11.next = 1;
|
|
520
|
+
return user.click(selects[0]);
|
|
521
|
+
case 1:
|
|
522
|
+
expect(_react.screen.getByRole('option', {
|
|
523
|
+
name: 'fr-FR'
|
|
524
|
+
})).toBeInTheDocument();
|
|
525
|
+
case 2:
|
|
526
|
+
case "end":
|
|
527
|
+
return _context11.stop();
|
|
528
|
+
}
|
|
529
|
+
}, _callee11);
|
|
530
|
+
})));
|
|
531
|
+
});
|
|
532
|
+
describe('accessibility', function () {
|
|
533
|
+
it('has proper semantic structure', function () {
|
|
534
|
+
var _render7 = (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_langs.LanguageControls, defaultProps)),
|
|
535
|
+
container = _render7.container;
|
|
536
|
+
var selects = _react.screen.getAllByRole('combobox');
|
|
537
|
+
expect(selects.length).toBe(2);
|
|
538
|
+
});
|
|
539
|
+
});
|
|
540
|
+
});
|
|
541
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX3VzZXJFdmVudCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcmVhY3QyIiwiX2xhbmdzIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJkZXNjcmliZSIsIm9uQ2hhbmdlIiwicmVuZGVyQ29tcG9uZW50IiwiZXh0cmFzIiwidW5kZWZpbmVkIiwiZGVmYXVsdHMiLCJ1aWQiLCJsYW5ncyIsInNlbGVjdGVkIiwicHJvcHMiLCJyZW5kZXIiLCJjcmVhdGVFbGVtZW50IiwiTGFuZ3MiLCJiZWZvcmVFYWNoIiwiamVzdCIsImZuIiwiaXQiLCJzZWxlY3QiLCJzY3JlZW4iLCJnZXRCeVJvbGUiLCJleHBlY3QiLCJ0b0JlSW5UaGVEb2N1bWVudCIsInRvSGF2ZVRleHRDb250ZW50IiwibGFiZWwiLCJnZXRCeVRleHQiLCJfcmVuZGVyQ29tcG9uZW50IiwiY29udGFpbmVyIiwiX3JlbmRlckNvbXBvbmVudDIiLCJxdWVyeVNlbGVjdG9yIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJ1c2VyIiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJ1c2VyRXZlbnQiLCJzZXR1cCIsImNsaWNrIiwibmFtZSIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwic3RvcCIsIl9jYWxsZWUyIiwiX2NvbnRleHQyIiwiX2NhbGxlZTMiLCJfY29udGV4dDMiLCJfY2FsbGVlNCIsIl9yZW5kZXIiLCJfY29udGV4dDQiLCJjdXN0b21VaWQiLCJfcmVuZGVyQ29tcG9uZW50MyIsImlucHV0IiwiY29uY2F0IiwiX3JlbmRlcjIiLCJsb25nTGFiZWwiLCJfcmVuZGVyQ29tcG9uZW50NCIsInJlcmVuZGVyIiwiX2NhbGxlZTUiLCJfcmVuZGVyQ29tcG9uZW50NSIsIl9jb250ZXh0NSIsIl9jYWxsZWU2IiwiX2NvbnRleHQ2IiwiZm9jdXMiLCJrZXlib2FyZCIsIl9jYWxsZWU3Iiwib3B0aW9ucyIsIl9jb250ZXh0NyIsImdldEFsbEJ5Um9sZSIsInRvQmUiLCJkZWZhdWx0UHJvcHMiLCJhY3RpdmVMYW5nIiwiZGVmYXVsdExhbmciLCJvbkFjdGl2ZUxhbmdDaGFuZ2UiLCJvbkRlZmF1bHRMYW5nQ2hhbmdlIiwiY2xlYXJBbGxNb2NrcyIsIkxhbmd1YWdlQ29udHJvbHMiLCJzZWxlY3RzIiwidG9IYXZlTGVuZ3RoIiwiX3JlbmRlcjMiLCJfZXh0ZW5kczIiLCJjbGFzc05hbWUiLCJfY2FsbGVlOCIsImFjdGl2ZVNlbGVjdCIsIl9jb250ZXh0OCIsIl9jYWxsZWU5IiwiZGVmYXVsdFNlbGVjdCIsIl9jb250ZXh0OSIsIl9jYWxsZWUwIiwiX2NvbnRleHQwIiwibm90IiwidG9IYXZlQmVlbkNhbGxlZCIsIl9jYWxsZWUxIiwiX2NvbnRleHQxIiwiX2NhbGxlZTEwIiwiX2NvbnRleHQxMCIsIl9yZW5kZXI0IiwiX3JlbmRlcjUiLCJfY2FsbGVlMTEiLCJfcmVuZGVyNiIsIl9jb250ZXh0MTEiLCJfcmVuZGVyNyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vbGFuZ3MudGVzdC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVuZGVyLCBzY3JlZW4gfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCB1c2VyRXZlbnQgZnJvbSAnQHRlc3RpbmctbGlicmFyeS91c2VyLWV2ZW50JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBMYW5ncywgTGFuZ3VhZ2VDb250cm9scyB9IGZyb20gJy4uL2xhbmdzJztcblxuZGVzY3JpYmUoJ0xhbmdzIENvbXBvbmVudCcsICgpID0+IHtcbiAgbGV0IG9uQ2hhbmdlO1xuICBjb25zdCByZW5kZXJDb21wb25lbnQgPSAoZXh0cmFzID0ge30pID0+IHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgIHVpZDogJzEnLFxuICAgICAgb25DaGFuZ2UsXG4gICAgICBsYW5nczogWydlbi1VUycsICdlcy1FUyddLFxuICAgICAgc2VsZWN0ZWQ6ICdlbi1VUycsXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMsIC4uLmV4dHJhcyB9O1xuICAgIHJldHVybiByZW5kZXIoPExhbmdzIHsuLi5wcm9wc30gLz4pO1xuICB9O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIGxhbmd1YWdlIHNlbGVjdG9yIHdpdGggb3B0aW9ucycsICgpID0+IHtcbiAgICAgIHJlbmRlckNvbXBvbmVudCgpO1xuXG4gICAgICAvLyBTZWxlY3Qgc2hvdWxkIGJlIHByZXNlbnRcbiAgICAgIGNvbnN0IHNlbGVjdCA9IHNjcmVlbi5nZXRCeVJvbGUoJ2NvbWJvYm94Jyk7XG4gICAgICBleHBlY3Qoc2VsZWN0KS50b0JlSW5UaGVEb2N1bWVudCgpO1xuXG4gICAgICAvLyBTaG91bGQgc2hvdyBzZWxlY3RlZCB2YWx1ZSAtIE1VSSBTZWxlY3QgZGlzcGxheXMgdmFsdWUgYXMgdGV4dCBjb250ZW50XG4gICAgICBleHBlY3Qoc2VsZWN0KS50b0hhdmVUZXh0Q29udGVudCgnZW4tVVMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggY3VzdG9tIGxhYmVsJywgKCkgPT4ge1xuICAgICAgcmVuZGVyQ29tcG9uZW50KHsgbGFiZWw6ICdDaG9vc2UgTGFuZ3VhZ2UnIH0pO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ0Nob29zZSBMYW5ndWFnZScpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgYWxsIGxhbmd1YWdlIG9wdGlvbnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgbGFuZ3M6IFsnZW4tVVMnLCAnZXMtRVMnLCAnZnItRlInLCAnZGUtREUnXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzZWxlY3QgPSBzY3JlZW4uZ2V0QnlSb2xlKCdjb21ib2JveCcpO1xuICAgICAgZXhwZWN0KHNlbGVjdCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggbXVsdGlwbGUgbGFuZ3VhZ2VzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbGFuZ3MgPSBbJ2VuLVVTJywgJ2VzLUVTJywgJ2ZyLUZSJywgJ3B0LUJSJ107XG4gICAgICByZW5kZXJDb21wb25lbnQoeyBsYW5ncyB9KTtcblxuICAgICAgY29uc3Qgc2VsZWN0ID0gc2NyZWVuLmdldEJ5Um9sZSgnY29tYm9ib3gnKTtcbiAgICAgIGV4cGVjdChzZWxlY3QpLnRvSGF2ZVRleHRDb250ZW50KCdlbi1VUycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgRm9ybUNvbnRyb2wgd2l0aCBwcm9wZXIgc3RydWN0dXJlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuXG4gICAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tjbGFzcyo9XCJNdWlGb3JtQ29udHJvbFwiXScpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndXNlciBpbnRlcmFjdGlvbnMnLCAoKSA9PiB7XG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlIHdoZW4gdXNlciBzZWxlY3RzIGEgbGFuZ3VhZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICByZW5kZXJDb21wb25lbnQoKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ID0gc2NyZWVuLmdldEJ5Um9sZSgnY29tYm9ib3gnKTtcblxuICAgICAgLy8gT3BlbiB0aGUgc2VsZWN0IGFuZCBjaG9vc2UgZXMtRVNcbiAgICAgIGF3YWl0IHVzZXIuY2xpY2soc2VsZWN0KTtcbiAgICAgIGF3YWl0IHVzZXIuY2xpY2soc2NyZWVuLmdldEJ5Um9sZSgnb3B0aW9uJywgeyBuYW1lOiAnZXMtRVMnIH0pKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnZXMtRVMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aXRoIGNvcnJlY3QgdmFsdWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICByZW5kZXJDb21wb25lbnQoeyBzZWxlY3RlZDogJ2VzLUVTJyB9KTtcblxuICAgICAgY29uc3Qgc2VsZWN0ID0gc2NyZWVuLmdldEJ5Um9sZSgnY29tYm9ib3gnKTtcblxuICAgICAgYXdhaXQgdXNlci5jbGljayhzZWxlY3QpO1xuICAgICAgYXdhaXQgdXNlci5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdvcHRpb24nLCB7IG5hbWU6ICdlbi1VUycgfSkpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdlbi1VUycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ29wZW5zIGRyb3Bkb3duIG9uIGNsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgbGFuZ3M6IFsnZW4tVVMnLCAnZXMtRVMnLCAnZnItRlInXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzZWxlY3QgPSBzY3JlZW4uZ2V0QnlSb2xlKCdjb21ib2JveCcpO1xuICAgICAgYXdhaXQgdXNlci5jbGljayhzZWxlY3QpO1xuXG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5Um9sZSgnb3B0aW9uJywgeyBuYW1lOiAnZW4tVVMnIH0pKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVJvbGUoJ29wdGlvbicsIHsgbmFtZTogJ2VzLUVTJyB9KSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlSb2xlKCdvcHRpb24nLCB7IG5hbWU6ICdmci1GUicgfSkpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgY2FsbCBvbkNoYW5nZSBpZiBubyBvbkNoYW5nZSBwcm9wIHByb3ZpZGVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcihcbiAgICAgICAgPExhbmdzXG4gICAgICAgICAgdWlkPVwiMVwiXG4gICAgICAgICAgbGFuZ3M9e1snZW4tVVMnLCAnZXMtRVMnXX1cbiAgICAgICAgICBzZWxlY3RlZD1cImVuLVVTXCJcbiAgICAgICAgLz4sXG4gICAgICApO1xuXG4gICAgICBjb25zdCBzZWxlY3QgPSBzY3JlZW4uZ2V0QnlSb2xlKCdjb21ib2JveCcpO1xuICAgICAgYXdhaXQgdXNlci5jbGljayhzZWxlY3QpO1xuICAgICAgYXdhaXQgdXNlci5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdvcHRpb24nLCB7IG5hbWU6ICdlcy1FUycgfSkpO1xuXG4gICAgICAvLyBTaG91bGQgbm90IHRocm93IGFueSBlcnJvclxuICAgICAgZXhwZWN0KHNlbGVjdCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Byb3BzIGhhbmRsaW5nJywgKCkgPT4ge1xuICAgIGl0KCdhY2NlcHRzIGN1c3RvbSB1aWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21VaWQgPSAnY3VzdG9tLXVpZC0xMjMnO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IHVpZDogY3VzdG9tVWlkIH0pO1xuXG4gICAgICBjb25zdCBpbnB1dCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAjJHtjdXN0b21VaWR9YCk7XG4gICAgICBleHBlY3QoaW5wdXQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZ2VuZXJhdGVzIHJhbmRvbSB1aWQgaWYgbm90IHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcihcbiAgICAgICAgPExhbmdzXG4gICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICAgIGxhbmdzPXtbJ2VuLVVTJywgJ2VzLUVTJ119XG4gICAgICAgICAgc2VsZWN0ZWQ9XCJlbi1VU1wiXG4gICAgICAgIC8+LFxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ID0gc2NyZWVuLmdldEJ5Um9sZSgnY29tYm9ib3gnKTtcbiAgICAgIGV4cGVjdChzZWxlY3QpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBlbXB0eSBsYWJlbCcsICgpID0+IHtcbiAgICAgIHJlbmRlckNvbXBvbmVudCh7IGxhYmVsOiAnJyB9KTtcblxuICAgICAgY29uc3Qgc2VsZWN0ID0gc2NyZWVuLmdldEJ5Um9sZSgnY29tYm9ib3gnKTtcbiAgICAgIGV4cGVjdChzZWxlY3QpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyB2ZXJ5IGxvbmcgbGFiZWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBsb25nTGFiZWwgPSAnQ2hvb3NlIHRoZSBsYW5ndWFnZSB5b3Ugd291bGQgbGlrZSB0byB1c2UgZm9yIGVkaXRpbmcgdGhpcyBjb250ZW50JztcbiAgICAgIHJlbmRlckNvbXBvbmVudCh7IGxhYmVsOiBsb25nTGFiZWwgfSk7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KGxvbmdMYWJlbCkpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2YWx1ZSB1cGRhdGVzJywgKCkgPT4ge1xuICAgIGl0KCd1cGRhdGVzIHNlbGVjdGVkIHZhbHVlIHdoZW4gcHJvcCBjaGFuZ2VzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyByZXJlbmRlciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgc2VsZWN0ZWQ6ICdlbi1VUycgfSk7XG5cbiAgICAgIGxldCBzZWxlY3QgPSBzY3JlZW4uZ2V0QnlSb2xlKCdjb21ib2JveCcpO1xuICAgICAgZXhwZWN0KHNlbGVjdCkudG9IYXZlVGV4dENvbnRlbnQoJ2VuLVVTJyk7XG5cbiAgICAgIHJlcmVuZGVyKFxuICAgICAgICA8TGFuZ3NcbiAgICAgICAgICB1aWQ9XCIxXCJcbiAgICAgICAgICBvbkNoYW5nZT17b25DaGFuZ2V9XG4gICAgICAgICAgbGFuZ3M9e1snZW4tVVMnLCAnZXMtRVMnXX1cbiAgICAgICAgICBzZWxlY3RlZD1cImVzLUVTXCJcbiAgICAgICAgLz4sXG4gICAgICApO1xuXG4gICAgICBzZWxlY3QgPSBzY3JlZW4uZ2V0QnlSb2xlKCdjb21ib2JveCcpO1xuICAgICAgZXhwZWN0KHNlbGVjdCkudG9IYXZlVGV4dENvbnRlbnQoJ2VzLUVTJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnbWFpbnRhaW5zIHN0YXRlIHdoZW4gbGFuZ3VhZ2Ugb3B0aW9ucyBjaGFuZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYW5nczogWydlbi1VUycsICdlcy1FUyddLFxuICAgICAgICBzZWxlY3RlZDogJ2VuLVVTJyxcbiAgICAgIH0pO1xuXG4gICAgICByZXJlbmRlcihcbiAgICAgICAgPExhbmdzXG4gICAgICAgICAgdWlkPVwiMVwiXG4gICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICAgIGxhbmdzPXtbJ2VuLVVTJywgJ2VzLUVTJywgJ2ZyLUZSJ119XG4gICAgICAgICAgc2VsZWN0ZWQ9XCJlbi1VU1wiXG4gICAgICAgIC8+LFxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ID0gc2NyZWVuLmdldEJ5Um9sZSgnY29tYm9ib3gnKTtcbiAgICAgIGV4cGVjdChzZWxlY3QpLnRvSGF2ZVRleHRDb250ZW50KCdlbi1VUycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgna2V5Ym9hcmQgbmF2aWdhdGlvbicsICgpID0+IHtcbiAgICBpdCgnb3BlbnMgZHJvcGRvd24gd2l0aCBrZXlib2FyZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGxhbmdzOiBbJ2VuLVVTJywgJ2VzLUVTJ10sXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc2VsZWN0ID0gc2NyZWVuLmdldEJ5Um9sZSgnY29tYm9ib3gnKTtcbiAgICAgIHNlbGVjdC5mb2N1cygpO1xuXG4gICAgICBhd2FpdCB1c2VyLmtleWJvYXJkKCcgJyk7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlSb2xlKCdvcHRpb24nLCB7IG5hbWU6ICdlbi1VUycgfSkpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhY2Nlc3NpYmlsaXR5JywgKCkgPT4ge1xuICAgIGl0KCdoYXMgcHJvcGVyIGxhYmVsIGFzc29jaWF0aW9uJywgKCkgPT4ge1xuICAgICAgcmVuZGVyQ29tcG9uZW50KHsgbGFiZWw6ICdTZWxlY3QgTGFuZ3VhZ2UnIH0pO1xuXG4gICAgICBjb25zdCBzZWxlY3QgPSBzY3JlZW4uZ2V0QnlSb2xlKCdjb21ib2JveCcpO1xuICAgICAgZXhwZWN0KHNlbGVjdCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIG9wdGlvbnMgd2l0aCBwcm9wZXIgcm9sZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYW5nczogWydlbi1VUycsICdlcy1FUycsICdmci1GUiddLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdCA9IHNjcmVlbi5nZXRCeVJvbGUoJ2NvbWJvYm94Jyk7XG4gICAgICBhd2FpdCB1c2VyLmNsaWNrKHNlbGVjdCk7XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBzY3JlZW4uZ2V0QWxsQnlSb2xlKCdvcHRpb24nKTtcbiAgICAgIGV4cGVjdChvcHRpb25zLmxlbmd0aCkudG9CZSgzKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ0xhbmd1YWdlQ29udHJvbHMgQ29tcG9uZW50JywgKCkgPT4ge1xuICBjb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gICAgbGFuZ3M6IFsnZW4tVVMnLCAnZXMtRVMnLCAnZnItRlInXSxcbiAgICBhY3RpdmVMYW5nOiAnZW4tVVMnLFxuICAgIGRlZmF1bHRMYW5nOiAnZW4tVVMnLFxuICAgIG9uQWN0aXZlTGFuZ0NoYW5nZTogamVzdC5mbigpLFxuICAgIG9uRGVmYXVsdExhbmdDaGFuZ2U6IGplc3QuZm4oKSxcbiAgfTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlbmRlcmluZycsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyBib3RoIGxhbmd1YWdlIHNlbGVjdG9ycycsICgpID0+IHtcbiAgICAgIHJlbmRlcig8TGFuZ3VhZ2VDb250cm9scyB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdDaG9vc2UgbGFuZ3VhZ2UgdG8gZWRpdCcpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ0RlZmF1bHQgbGFuZ3VhZ2UnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggY29ycmVjdCBpbml0aWFsIHZhbHVlcycsICgpID0+IHtcbiAgICAgIHJlbmRlcig8TGFuZ3VhZ2VDb250cm9scyB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG5cbiAgICAgIGNvbnN0IHNlbGVjdHMgPSBzY3JlZW4uZ2V0QWxsQnlSb2xlKCdjb21ib2JveCcpO1xuICAgICAgZXhwZWN0KHNlbGVjdHMpLnRvSGF2ZUxlbmd0aCgyKTtcbiAgICB9KTtcblxuICAgIGl0KCdhcHBsaWVzIGN1c3RvbSBjbGFzc05hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKFxuICAgICAgICA8TGFuZ3VhZ2VDb250cm9scyB7Li4uZGVmYXVsdFByb3BzfSBjbGFzc05hbWU9XCJjdXN0b20tY2xhc3NcIiAvPixcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignLmN1c3RvbS1jbGFzcycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndXNlciBpbnRlcmFjdGlvbnMnLCAoKSA9PiB7XG4gICAgaXQoJ2NhbGxzIG9uQWN0aXZlTGFuZ0NoYW5nZSB3aGVuIGFjdGl2ZSBsYW5ndWFnZSBpcyBjaGFuZ2VkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25BY3RpdmVMYW5nQ2hhbmdlID0gamVzdC5mbigpO1xuXG4gICAgICByZW5kZXIoXG4gICAgICAgIDxMYW5ndWFnZUNvbnRyb2xzXG4gICAgICAgICAgey4uLmRlZmF1bHRQcm9wc31cbiAgICAgICAgICBhY3RpdmVMYW5nPVwiZW4tVVNcIlxuICAgICAgICAgIG9uQWN0aXZlTGFuZ0NoYW5nZT17b25BY3RpdmVMYW5nQ2hhbmdlfVxuICAgICAgICAvPixcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdHMgPSBzY3JlZW4uZ2V0QWxsQnlSb2xlKCdjb21ib2JveCcpO1xuICAgICAgY29uc3QgYWN0aXZlU2VsZWN0ID0gc2VsZWN0c1swXTtcblxuICAgICAgYXdhaXQgdXNlci5jbGljayhhY3RpdmVTZWxlY3QpO1xuICAgICAgYXdhaXQgdXNlci5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdvcHRpb24nLCB7IG5hbWU6ICdlcy1FUycgfSkpO1xuXG4gICAgICBleHBlY3Qob25BY3RpdmVMYW5nQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnZXMtRVMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkRlZmF1bHRMYW5nQ2hhbmdlIHdoZW4gZGVmYXVsdCBsYW5ndWFnZSBpcyBjaGFuZ2VkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25EZWZhdWx0TGFuZ0NoYW5nZSA9IGplc3QuZm4oKTtcblxuICAgICAgcmVuZGVyKFxuICAgICAgICA8TGFuZ3VhZ2VDb250cm9sc1xuICAgICAgICAgIHsuLi5kZWZhdWx0UHJvcHN9XG4gICAgICAgICAgZGVmYXVsdExhbmc9XCJlbi1VU1wiXG4gICAgICAgICAgb25EZWZhdWx0TGFuZ0NoYW5nZT17b25EZWZhdWx0TGFuZ0NoYW5nZX1cbiAgICAgICAgLz4sXG4gICAgICApO1xuXG4gICAgICBjb25zdCBzZWxlY3RzID0gc2NyZWVuLmdldEFsbEJ5Um9sZSgnY29tYm9ib3gnKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRTZWxlY3QgPSBzZWxlY3RzWzFdO1xuXG4gICAgICBhd2FpdCB1c2VyLmNsaWNrKGRlZmF1bHRTZWxlY3QpO1xuICAgICAgYXdhaXQgdXNlci5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdvcHRpb24nLCB7IG5hbWU6ICdmci1GUicgfSkpO1xuXG4gICAgICBleHBlY3Qob25EZWZhdWx0TGFuZ0NoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2ZyLUZSJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBpbmRlcGVuZGVudCBsYW5ndWFnZSBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25BY3RpdmVMYW5nQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgY29uc3Qgb25EZWZhdWx0TGFuZ0NoYW5nZSA9IGplc3QuZm4oKTtcblxuICAgICAgcmVuZGVyKFxuICAgICAgICA8TGFuZ3VhZ2VDb250cm9sc1xuICAgICAgICAgIHsuLi5kZWZhdWx0UHJvcHN9XG4gICAgICAgICAgYWN0aXZlTGFuZz1cImVuLVVTXCJcbiAgICAgICAgICBkZWZhdWx0TGFuZz1cImVuLVVTXCJcbiAgICAgICAgICBvbkFjdGl2ZUxhbmdDaGFuZ2U9e29uQWN0aXZlTGFuZ0NoYW5nZX1cbiAgICAgICAgICBvbkRlZmF1bHRMYW5nQ2hhbmdlPXtvbkRlZmF1bHRMYW5nQ2hhbmdlfVxuICAgICAgICAvPixcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdHMgPSBzY3JlZW4uZ2V0QWxsQnlSb2xlKCdjb21ib2JveCcpO1xuXG4gICAgICAvLyBDaGFuZ2UgYWN0aXZlIGxhbmd1YWdlXG4gICAgICBhd2FpdCB1c2VyLmNsaWNrKHNlbGVjdHNbMF0pO1xuICAgICAgYXdhaXQgdXNlci5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdvcHRpb24nLCB7IG5hbWU6ICdlcy1FUycgfSkpO1xuXG4gICAgICBleHBlY3Qob25BY3RpdmVMYW5nQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnZXMtRVMnKTtcbiAgICAgIGV4cGVjdChvbkRlZmF1bHRMYW5nQ2hhbmdlKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncHJvcHMgaGFuZGxpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ2Rpc3BsYXlzIGNvcnJlY3QgbGFuZ3VhZ2Ugb3B0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIHJlbmRlcihcbiAgICAgICAgPExhbmd1YWdlQ29udHJvbHNcbiAgICAgICAgICB7Li4uZGVmYXVsdFByb3BzfVxuICAgICAgICAgIGxhbmdzPXtbJ2VuLVVTJywgJ2VzLUVTJywgJ2ZyLUZSJywgJ2RlLURFJ119XG4gICAgICAgIC8+LFxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc2VsZWN0cyA9IHNjcmVlbi5nZXRBbGxCeVJvbGUoJ2NvbWJvYm94Jyk7XG4gICAgICBhd2FpdCB1c2VyLmNsaWNrKHNlbGVjdHNbMF0pO1xuXG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5Um9sZSgnb3B0aW9uJywgeyBuYW1lOiAnZW4tVVMnIH0pKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVJvbGUoJ29wdGlvbicsIHsgbmFtZTogJ2VzLUVTJyB9KSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlSb2xlKCdvcHRpb24nLCB7IG5hbWU6ICdmci1GUicgfSkpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5Um9sZSgnb3B0aW9uJywgeyBuYW1lOiAnZGUtREUnIH0pKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ21haW50YWlucyBkaWZmZXJlbnQgYWN0aXZlIGFuZCBkZWZhdWx0IGxhbmd1YWdlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIHJlbmRlcihcbiAgICAgICAgPExhbmd1YWdlQ29udHJvbHNcbiAgICAgICAgICB7Li4uZGVmYXVsdFByb3BzfVxuICAgICAgICAgIGFjdGl2ZUxhbmc9XCJlcy1FU1wiXG4gICAgICAgICAgZGVmYXVsdExhbmc9XCJlbi1VU1wiXG4gICAgICAgIC8+LFxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc2VsZWN0cyA9IHNjcmVlbi5nZXRBbGxCeVJvbGUoJ2NvbWJvYm94Jyk7XG4gICAgICBleHBlY3Qoc2VsZWN0c1swXSkudG9IYXZlVGV4dENvbnRlbnQoJ2VzLUVTJyk7XG4gICAgICBleHBlY3Qoc2VsZWN0c1sxXSkudG9IYXZlVGV4dENvbnRlbnQoJ2VuLVVTJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd1cGRhdGVzJywgKCkgPT4ge1xuICAgIGl0KCd1cGRhdGVzIHdoZW4gYWN0aXZlTGFuZyBwcm9wIGNoYW5nZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXIoXG4gICAgICAgIDxMYW5ndWFnZUNvbnRyb2xzXG4gICAgICAgICAgey4uLmRlZmF1bHRQcm9wc31cbiAgICAgICAgICBhY3RpdmVMYW5nPVwiZW4tVVNcIlxuICAgICAgICAvPixcbiAgICAgICk7XG5cbiAgICAgIGxldCBzZWxlY3RzID0gc2NyZWVuLmdldEFsbEJ5Um9sZSgnY29tYm9ib3gnKTtcbiAgICAgIGV4cGVjdChzZWxlY3RzWzBdKS50b0hhdmVUZXh0Q29udGVudCgnZW4tVVMnKTtcblxuICAgICAgcmVyZW5kZXIoXG4gICAgICAgIDxMYW5ndWFnZUNvbnRyb2xzXG4gICAgICAgICAgey4uLmRlZmF1bHRQcm9wc31cbiAgICAgICAgICBhY3RpdmVMYW5nPVwiZXMtRVNcIlxuICAgICAgICAvPixcbiAgICAgICk7XG5cbiAgICAgIHNlbGVjdHMgPSBzY3JlZW4uZ2V0QWxsQnlSb2xlKCdjb21ib2JveCcpO1xuICAgICAgZXhwZWN0KHNlbGVjdHNbMF0pLnRvSGF2ZVRleHRDb250ZW50KCdlcy1FUycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3VwZGF0ZXMgd2hlbiBkZWZhdWx0TGFuZyBwcm9wIGNoYW5nZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXIoXG4gICAgICAgIDxMYW5ndWFnZUNvbnRyb2xzXG4gICAgICAgICAgey4uLmRlZmF1bHRQcm9wc31cbiAgICAgICAgICBkZWZhdWx0TGFuZz1cImVuLVVTXCJcbiAgICAgICAgLz4sXG4gICAgICApO1xuXG4gICAgICBsZXQgc2VsZWN0cyA9IHNjcmVlbi5nZXRBbGxCeVJvbGUoJ2NvbWJvYm94Jyk7XG4gICAgICBleHBlY3Qoc2VsZWN0c1sxXSkudG9IYXZlVGV4dENvbnRlbnQoJ2VuLVVTJyk7XG5cbiAgICAgIHJlcmVuZGVyKFxuICAgICAgICA8TGFuZ3VhZ2VDb250cm9sc1xuICAgICAgICAgIHsuLi5kZWZhdWx0UHJvcHN9XG4gICAgICAgICAgZGVmYXVsdExhbmc9XCJmci1GUlwiXG4gICAgICAgIC8+LFxuICAgICAgKTtcblxuICAgICAgc2VsZWN0cyA9IHNjcmVlbi5nZXRBbGxCeVJvbGUoJ2NvbWJvYm94Jyk7XG4gICAgICBleHBlY3Qoc2VsZWN0c1sxXSkudG9IYXZlVGV4dENvbnRlbnQoJ2ZyLUZSJyk7XG4gICAgfSk7XG5cbiAgICBpdCgndXBkYXRlcyB3aGVuIGxhbmdzIHByb3AgY2hhbmdlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlcihcbiAgICAgICAgPExhbmd1YWdlQ29udHJvbHNcbiAgICAgICAgICB7Li4uZGVmYXVsdFByb3BzfVxuICAgICAgICAgIGxhbmdzPXtbJ2VuLVVTJywgJ2VzLUVTJ119XG4gICAgICAgIC8+LFxuICAgICAgKTtcblxuICAgICAgcmVyZW5kZXIoXG4gICAgICAgIDxMYW5ndWFnZUNvbnRyb2xzXG4gICAgICAgICAgey4uLmRlZmF1bHRQcm9wc31cbiAgICAgICAgICBsYW5ncz17Wydlbi1VUycsICdlcy1FUycsICdmci1GUiddfVxuICAgICAgICAvPixcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdHMgPSBzY3JlZW4uZ2V0QWxsQnlSb2xlKCdjb21ib2JveCcpO1xuICAgICAgYXdhaXQgdXNlci5jbGljayhzZWxlY3RzWzBdKTtcblxuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVJvbGUoJ29wdGlvbicsIHsgbmFtZTogJ2ZyLUZSJyB9KSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FjY2Vzc2liaWxpdHknLCAoKSA9PiB7XG4gICAgaXQoJ2hhcyBwcm9wZXIgc2VtYW50aWMgc3RydWN0dXJlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8TGFuZ3VhZ2VDb250cm9scyB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG5cbiAgICAgIGNvbnN0IHNlbGVjdHMgPSBzY3JlZW4uZ2V0QWxsQnlSb2xlKCdjb21ib2JveCcpO1xuICAgICAgZXhwZWN0KHNlbGVjdHMubGVuZ3RoKS50b0JlKDIpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsVUFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUksTUFBQSxHQUFBSixPQUFBO0FBQW1ELFNBQUFLLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdB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
|