@agilemotion/oui-react-js 2.0.13 → 2.0.14
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.
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.MultiLookupField = void 0;
|
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
|
8
|
+
var _Utils = _interopRequireDefault(require("../../Utils"));
|
|
9
|
+
var _IconButton = _interopRequireDefault(require("@mui/material/IconButton"));
|
|
10
|
+
var _Dialog = _interopRequireDefault(require("@mui/material/Dialog"));
|
|
11
|
+
var _DialogActions = _interopRequireDefault(require("@mui/material/DialogActions"));
|
|
12
|
+
var _DialogTitle = _interopRequireDefault(require("@mui/material/DialogTitle"));
|
|
13
|
+
var _DialogContent = _interopRequireDefault(require("@mui/material/DialogContent"));
|
|
14
|
+
var _Button = _interopRequireDefault(require("@mui/material/Button"));
|
|
15
|
+
var _Chip = _interopRequireDefault(require("@mui/material/Chip"));
|
|
16
|
+
var _InputLabel = _interopRequireDefault(require("@mui/material/InputLabel"));
|
|
17
|
+
var _FormHelperText = _interopRequireDefault(require("@mui/material/FormHelperText"));
|
|
18
|
+
var _Tooltip = _interopRequireDefault(require("@mui/material/Tooltip"));
|
|
19
|
+
var _Typography = _interopRequireDefault(require("@mui/material/Typography"));
|
|
20
|
+
var _Divider = _interopRequireDefault(require("@mui/material/Divider"));
|
|
21
|
+
var _BaseField = require("./BaseField");
|
|
22
|
+
var _DataGrid = require("../DataGrid");
|
|
23
|
+
var _Observable = _interopRequireDefault(require("../../event/Observable"));
|
|
24
|
+
var _Icon = _interopRequireDefault(require("../Icon"));
|
|
25
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
26
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
27
|
+
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; }
|
|
28
|
+
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) { _defineProperty(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; }
|
|
29
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
30
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
31
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
32
|
+
// Multi-select counterpart to LookupField. Renders selected items as MUI
|
|
33
|
+
// Chips sitting inside a faux-outlined input, with a "..." button matching
|
|
34
|
+
// LookupField's layout for visual continuity. The popup picker reuses the
|
|
35
|
+
// same DataGrid component LookupField uses but forces multiSelect mode so
|
|
36
|
+
// the operator can tick several rows in one go.
|
|
37
|
+
const MultiLookupFieldComponent = /*#__PURE__*/_react.default.memo(props => {
|
|
38
|
+
var _props$config$attribu, _props$config$attribu2, _props$config$attribu3, _props$config$attribu4, _props$config$attribu5, _props$config$attribu6;
|
|
39
|
+
const base = props.base;
|
|
40
|
+
const [currentSelection, setCurrentSelection] = _react.default.useState([]);
|
|
41
|
+
const [open, setOpen] = _react.default.useState(false);
|
|
42
|
+
const width = (_props$config$attribu = props.config.attributes) !== null && _props$config$attribu !== void 0 && (_props$config$attribu = _props$config$attribu.style) !== null && _props$config$attribu !== void 0 && _props$config$attribu.width ? props.config.attributes.style.width : '100%';
|
|
43
|
+
const minWidth = (_props$config$attribu2 = props.config.attributes) !== null && _props$config$attribu2 !== void 0 && (_props$config$attribu2 = _props$config$attribu2.style) !== null && _props$config$attribu2 !== void 0 && _props$config$attribu2.minWidth ? props.config.attributes.style.minWidth : '240px';
|
|
44
|
+
const margin = !_Utils.default.isNull((_props$config$attribu3 = props.config.attributes) === null || _props$config$attribu3 === void 0 || (_props$config$attribu3 = _props$config$attribu3.style) === null || _props$config$attribu3 === void 0 ? void 0 : _props$config$attribu3.margin) ? props.config.attributes.style.margin : '4px 0';
|
|
45
|
+
const value = Array.isArray(base.value) ? base.value : [];
|
|
46
|
+
const label = !_Utils.default.isNull(props.config.attributes) && !_Utils.default.isNull(props.config.attributes.label) ? props.config.attributes.label : null;
|
|
47
|
+
const placeholder = _Utils.default.getComponentAttribute(props.config, 'placeholder', 'No selection');
|
|
48
|
+
// Optional cap on how many items the field can hold. When set, Add
|
|
49
|
+
// appends and trims from the front (so the most-recent N picks win) —
|
|
50
|
+
// making maxItems=1 a clean "replace existing" interaction.
|
|
51
|
+
const rawMax = _Utils.default.getComponentAttribute(props.config, 'maxItems', null);
|
|
52
|
+
const maxItems = typeof rawMax === 'number' && rawMax > 0 ? rawMax : null;
|
|
53
|
+
const handleClose = () => {
|
|
54
|
+
setOpen(false);
|
|
55
|
+
setCurrentSelection([]);
|
|
56
|
+
_Observable.default.clearComponentEventListeners(props.gridHandle.api.id);
|
|
57
|
+
};
|
|
58
|
+
_react.default.useEffect(() => {
|
|
59
|
+
if (props.config && props.config.grid) {
|
|
60
|
+
if (!props.config.grid.attributes) {
|
|
61
|
+
props.config.grid.attributes = {};
|
|
62
|
+
}
|
|
63
|
+
props.config.grid.attributes['margin'] = _Utils.default.getComponentAttribute(props.config.grid, 'margin', '16px');
|
|
64
|
+
// Intentionally do NOT set selectionMode='MULTIPLE' on the grid
|
|
65
|
+
// config. That mode renders a checkbox column in the header AND
|
|
66
|
+
// every row, which (a) doesn't account for any configured column
|
|
67
|
+
// widths that already sum to 100% — causing the last column to
|
|
68
|
+
// wrap on an empty/unsearched grid — and (b) is redundant: the
|
|
69
|
+
// multi-select click-toggle on rows (enabled below via the
|
|
70
|
+
// `multiSelect` prop) handles selection just as well, with the
|
|
71
|
+
// selected-row highlight giving visual feedback.
|
|
72
|
+
if (props.config.grid.selectionMode === 'MULTIPLE') {
|
|
73
|
+
delete props.config.grid.selectionMode;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}, []);
|
|
77
|
+
function buildSelectedItem(row) {
|
|
78
|
+
let item = {};
|
|
79
|
+
let properties = Object.getOwnPropertyNames(row);
|
|
80
|
+
let displayTemplate = _Utils.default.getComponentAttribute(props.config, 'displayTemplate', '@{dataRecordDescription}');
|
|
81
|
+
let renderedLabel = displayTemplate;
|
|
82
|
+
for (const property of properties) {
|
|
83
|
+
renderedLabel = renderedLabel.replace('@{' + property + '}', row[property]);
|
|
84
|
+
if (property !== 'label') {
|
|
85
|
+
item[property] = row[property];
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
item.__oui_label = renderedLabel;
|
|
89
|
+
item.toString = () => renderedLabel;
|
|
90
|
+
return item;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Stable lookup of usernames that are already in the field's value. The
|
|
94
|
+
// picker's search service (e.g. /auth/api/v1/user/search) returns rows
|
|
95
|
+
// with the auth user's UUID as `id`, while the chips were built from
|
|
96
|
+
// the DemandPlanner row's UUID — so de-duplicating by `id` would not
|
|
97
|
+
// catch repeats. `username` is the only field that's reliably the
|
|
98
|
+
// same on both sides.
|
|
99
|
+
const existingUsernames = _react.default.useMemo(() => {
|
|
100
|
+
const set = new Set();
|
|
101
|
+
for (const v of value) {
|
|
102
|
+
if (v && v.username) set.add(String(v.username).toLowerCase());
|
|
103
|
+
}
|
|
104
|
+
return set;
|
|
105
|
+
}, [value]);
|
|
106
|
+
const addSelection = () => {
|
|
107
|
+
if (!currentSelection || currentSelection.length === 0) {
|
|
108
|
+
handleClose();
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const additions = currentSelection.filter(row => row && row.username && !existingUsernames.has(String(row.username).toLowerCase())).map(buildSelectedItem);
|
|
112
|
+
let next = [...value, ...additions];
|
|
113
|
+
if (maxItems != null && next.length > maxItems) {
|
|
114
|
+
// Newer picks take precedence — drop the oldest entries until
|
|
115
|
+
// we fit. With maxItems=1 this implements the "replace existing"
|
|
116
|
+
// semantics: existing chip is dropped, new pick takes its place.
|
|
117
|
+
next = next.slice(next.length - maxItems);
|
|
118
|
+
}
|
|
119
|
+
base.handleValueChange(next.length > 0 ? next : null);
|
|
120
|
+
handleClose();
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
// Pre-select rows returned by the search that match users already in
|
|
124
|
+
// the field's value, so the operator can see at a glance which results
|
|
125
|
+
// they have already added. The DataGrid fires onRowsLoaded after every
|
|
126
|
+
// data refresh; we tick matching rows via the grid api.
|
|
127
|
+
const preselectExistingRows = _react.default.useCallback(loadedRows => {
|
|
128
|
+
if (!loadedRows || loadedRows.length === 0) return;
|
|
129
|
+
if (!props.gridHandle || !props.gridHandle.api) return;
|
|
130
|
+
const matchingIds = [];
|
|
131
|
+
for (const row of loadedRows) {
|
|
132
|
+
if (row && row.username && existingUsernames.has(String(row.username).toLowerCase())) {
|
|
133
|
+
matchingIds.push(row.id);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (matchingIds.length > 0) {
|
|
137
|
+
props.gridHandle.api.select(matchingIds);
|
|
138
|
+
const matchingRows = loadedRows.filter(r => matchingIds.includes(r.id));
|
|
139
|
+
setCurrentSelection(matchingRows);
|
|
140
|
+
}
|
|
141
|
+
}, [existingUsernames, props.gridHandle]);
|
|
142
|
+
const removeItem = id => {
|
|
143
|
+
const next = value.filter(v => v.id !== id);
|
|
144
|
+
base.handleValueChange(next.length > 0 ? next : null);
|
|
145
|
+
};
|
|
146
|
+
const clearAll = () => {
|
|
147
|
+
if (value.length === 0) return;
|
|
148
|
+
base.handleValueChange(null);
|
|
149
|
+
};
|
|
150
|
+
const openSearch = () => {
|
|
151
|
+
setOpen(true);
|
|
152
|
+
};
|
|
153
|
+
const borderColor = base.hasError ? '#f44336' : '#cccccc';
|
|
154
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
155
|
+
className: "w-100 multi-lookup row no-margin no-padding oui-form-item",
|
|
156
|
+
style: _Utils.default.mergeStyles({
|
|
157
|
+
width: width,
|
|
158
|
+
minWidth: minWidth,
|
|
159
|
+
margin: margin,
|
|
160
|
+
marginBottom: base.hasError ? '20px' : '4px',
|
|
161
|
+
marginTop: '8px'
|
|
162
|
+
}, props.config)
|
|
163
|
+
}, !base.disabled && /*#__PURE__*/_react.default.createElement("div", {
|
|
164
|
+
className: 'col-*-*',
|
|
165
|
+
style: {
|
|
166
|
+
width: '72px'
|
|
167
|
+
}
|
|
168
|
+
}, /*#__PURE__*/_react.default.createElement(_Tooltip.default, {
|
|
169
|
+
title: 'Select ' + (label ? label.toLowerCase() : 'items')
|
|
170
|
+
}, /*#__PURE__*/_react.default.createElement("span", null, /*#__PURE__*/_react.default.createElement(_Button.default, {
|
|
171
|
+
style: {
|
|
172
|
+
height: '40px',
|
|
173
|
+
minWidth: '64px'
|
|
174
|
+
},
|
|
175
|
+
variant: 'outlined',
|
|
176
|
+
onClick: openSearch,
|
|
177
|
+
disabled: base.disabled,
|
|
178
|
+
"aria-label": "open picker"
|
|
179
|
+
}, "...")))), /*#__PURE__*/_react.default.createElement("div", {
|
|
180
|
+
className: 'col-*-* no-margin no-padding',
|
|
181
|
+
style: {
|
|
182
|
+
width: !base.disabled ? 'calc(100% - 72px)' : '100%',
|
|
183
|
+
position: 'relative'
|
|
184
|
+
}
|
|
185
|
+
}, label && /*#__PURE__*/_react.default.createElement(_InputLabel.default, {
|
|
186
|
+
required: base.required,
|
|
187
|
+
error: base.hasError,
|
|
188
|
+
shrink: true,
|
|
189
|
+
sx: {
|
|
190
|
+
fontSize: '0.75rem',
|
|
191
|
+
transform: 'translate(8px, -6px) scale(1)',
|
|
192
|
+
background: '#fff',
|
|
193
|
+
padding: '0 4px',
|
|
194
|
+
position: 'absolute',
|
|
195
|
+
zIndex: 1,
|
|
196
|
+
top: 0
|
|
197
|
+
}
|
|
198
|
+
}, label), !base.required && !base.disabled && value.length > 0 && /*#__PURE__*/_react.default.createElement(_Tooltip.default, {
|
|
199
|
+
title: 'Clear all'
|
|
200
|
+
}, /*#__PURE__*/_react.default.createElement(_IconButton.default, {
|
|
201
|
+
size: "small",
|
|
202
|
+
onClick: clearAll,
|
|
203
|
+
sx: {
|
|
204
|
+
position: 'absolute',
|
|
205
|
+
right: 4,
|
|
206
|
+
top: 4,
|
|
207
|
+
zIndex: 2
|
|
208
|
+
}
|
|
209
|
+
}, /*#__PURE__*/_react.default.createElement(_Icon.default, {
|
|
210
|
+
id: 'CLEAR'
|
|
211
|
+
}))), /*#__PURE__*/_react.default.createElement("div", {
|
|
212
|
+
onClick: base.disabled ? undefined : openSearch,
|
|
213
|
+
style: {
|
|
214
|
+
minHeight: '40px',
|
|
215
|
+
border: "1px solid ".concat(borderColor),
|
|
216
|
+
borderRadius: '4px',
|
|
217
|
+
padding: value.length === 0 ? '8px 12px' : '6px 36px 6px 8px',
|
|
218
|
+
display: 'flex',
|
|
219
|
+
flexWrap: 'wrap',
|
|
220
|
+
alignItems: 'center',
|
|
221
|
+
gap: '4px',
|
|
222
|
+
cursor: base.disabled ? 'default' : 'pointer',
|
|
223
|
+
background: base.disabled ? '#fafafa' : '#fff',
|
|
224
|
+
transition: 'border-color 120ms ease'
|
|
225
|
+
}
|
|
226
|
+
}, value.length === 0 && /*#__PURE__*/_react.default.createElement("span", {
|
|
227
|
+
style: {
|
|
228
|
+
color: '#9e9e9e',
|
|
229
|
+
fontSize: '0.875rem',
|
|
230
|
+
fontStyle: 'italic'
|
|
231
|
+
}
|
|
232
|
+
}, base.disabled ? '—' : placeholder), value.map(item => /*#__PURE__*/_react.default.createElement(_Chip.default, {
|
|
233
|
+
key: item.id,
|
|
234
|
+
label: item.__oui_label || item.dataRecordDescription || item.label || item.username || String(item.id),
|
|
235
|
+
onDelete: base.disabled ? undefined : e => {
|
|
236
|
+
e.stopPropagation();
|
|
237
|
+
removeItem(item.id);
|
|
238
|
+
},
|
|
239
|
+
onClick: e => e.stopPropagation(),
|
|
240
|
+
size: "small",
|
|
241
|
+
variant: "outlined",
|
|
242
|
+
sx: {
|
|
243
|
+
maxWidth: '100%',
|
|
244
|
+
'& .MuiChip-label': {
|
|
245
|
+
overflow: 'hidden',
|
|
246
|
+
textOverflow: 'ellipsis'
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}))), base.errorMessage && /*#__PURE__*/_react.default.createElement(_FormHelperText.default, {
|
|
250
|
+
error: true,
|
|
251
|
+
sx: {
|
|
252
|
+
marginLeft: '8px'
|
|
253
|
+
}
|
|
254
|
+
}, base.errorMessage)), /*#__PURE__*/_react.default.createElement(_Dialog.default, {
|
|
255
|
+
open: open,
|
|
256
|
+
onClose: handleClose,
|
|
257
|
+
"aria-labelledby": "multi-lookup-dialog-title",
|
|
258
|
+
fullWidth: true,
|
|
259
|
+
maxWidth: false,
|
|
260
|
+
PaperProps: {
|
|
261
|
+
sx: {
|
|
262
|
+
width: _Utils.default.getComponentAttribute(props.config, 'pickerListWidth', 880),
|
|
263
|
+
maxWidth: '92vw'
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
disableBackdropClick: true
|
|
267
|
+
}, /*#__PURE__*/_react.default.createElement(_DialogTitle.default, {
|
|
268
|
+
id: "multi-lookup-dialog-title",
|
|
269
|
+
sx: {
|
|
270
|
+
padding: '16px 24px 12px 24px',
|
|
271
|
+
fontSize: '1.05rem',
|
|
272
|
+
fontWeight: 500
|
|
273
|
+
}
|
|
274
|
+
}, !_Utils.default.isNull(props.config.attributes) && !_Utils.default.isNull((_props$config$attribu4 = props.config.attributes) === null || _props$config$attribu4 === void 0 ? void 0 : _props$config$attribu4.pickerLabel) ? (_props$config$attribu5 = props.config.attributes) === null || _props$config$attribu5 === void 0 ? void 0 : _props$config$attribu5.pickerLabel : (_props$config$attribu6 = props.config.attributes) === null || _props$config$attribu6 === void 0 ? void 0 : _props$config$attribu6.label, /*#__PURE__*/_react.default.createElement(_Typography.default, {
|
|
275
|
+
variant: "caption",
|
|
276
|
+
sx: {
|
|
277
|
+
display: 'block',
|
|
278
|
+
marginTop: '4px',
|
|
279
|
+
color: 'text.secondary',
|
|
280
|
+
fontStyle: 'italic',
|
|
281
|
+
fontSize: '0.75rem'
|
|
282
|
+
}
|
|
283
|
+
}, (() => {
|
|
284
|
+
const tickedNew = currentSelection.filter(r => r && r.username && !existingUsernames.has(String(r.username).toLowerCase())).length;
|
|
285
|
+
const tickedExisting = currentSelection.length - tickedNew;
|
|
286
|
+
const willReplace = maxItems != null && value.length > 0 && tickedNew > 0;
|
|
287
|
+
if (currentSelection.length === 0) {
|
|
288
|
+
if (maxItems === 1 && value.length > 0) {
|
|
289
|
+
return 'Pick a user to replace the current selection (limit: 1)';
|
|
290
|
+
}
|
|
291
|
+
if (maxItems != null) {
|
|
292
|
+
return "Tick a user to add (limit: ".concat(maxItems, ")");
|
|
293
|
+
}
|
|
294
|
+
return 'Tick one or more rows, then press OK';
|
|
295
|
+
}
|
|
296
|
+
if (tickedNew === 0) {
|
|
297
|
+
return "".concat(tickedExisting, " already in your selection \u2014 pick someone new to ").concat(maxItems === 1 ? 'replace it' : 'add');
|
|
298
|
+
}
|
|
299
|
+
if (willReplace && maxItems === 1) {
|
|
300
|
+
return "Will replace the current selection with the newly ticked user";
|
|
301
|
+
}
|
|
302
|
+
if (tickedExisting === 0) {
|
|
303
|
+
return "".concat(tickedNew, " new \u2014 press OK to add to selection");
|
|
304
|
+
}
|
|
305
|
+
return "".concat(tickedNew, " new (").concat(tickedExisting, " already in selection) \u2014 press OK to add the new ").concat(tickedNew === 1 ? 'one' : 'ones');
|
|
306
|
+
})())), /*#__PURE__*/_react.default.createElement(_Divider.default, null), /*#__PURE__*/_react.default.createElement(_DialogContent.default, {
|
|
307
|
+
sx: {
|
|
308
|
+
padding: '0',
|
|
309
|
+
minHeight: '360px',
|
|
310
|
+
maxHeight: '60vh',
|
|
311
|
+
overflow: 'auto'
|
|
312
|
+
}
|
|
313
|
+
}, /*#__PURE__*/_react.default.createElement(_DataGrid.DataGrid, {
|
|
314
|
+
config: props.config.grid,
|
|
315
|
+
handle: props.gridHandle,
|
|
316
|
+
ref: /*#__PURE__*/_react.default.createRef(),
|
|
317
|
+
multiSelect: true,
|
|
318
|
+
viewId: props.viewId,
|
|
319
|
+
onSelectionChange: selection => setCurrentSelection(selection),
|
|
320
|
+
onRowsLoaded: preselectExistingRows
|
|
321
|
+
})), /*#__PURE__*/_react.default.createElement(_Divider.default, null), /*#__PURE__*/_react.default.createElement(_DialogActions.default, {
|
|
322
|
+
sx: {
|
|
323
|
+
padding: '12px 20px'
|
|
324
|
+
}
|
|
325
|
+
}, /*#__PURE__*/_react.default.createElement(_Typography.default, {
|
|
326
|
+
variant: "caption",
|
|
327
|
+
sx: {
|
|
328
|
+
marginRight: 'auto',
|
|
329
|
+
color: 'text.secondary'
|
|
330
|
+
}
|
|
331
|
+
}, value.length > 0 ? "".concat(value.length, " already in selection") : 'Nothing in selection yet'), /*#__PURE__*/_react.default.createElement(_Button.default, {
|
|
332
|
+
onClick: handleClose,
|
|
333
|
+
color: "primary"
|
|
334
|
+
}, "Cancel"), (() => {
|
|
335
|
+
const newCount = currentSelection.filter(r => r && r.username && !existingUsernames.has(String(r.username).toLowerCase())).length;
|
|
336
|
+
const isReplace = maxItems === 1 && value.length > 0 && newCount > 0;
|
|
337
|
+
return /*#__PURE__*/_react.default.createElement(_Button.default, {
|
|
338
|
+
onClick: addSelection,
|
|
339
|
+
color: "primary",
|
|
340
|
+
variant: "contained",
|
|
341
|
+
disabled: newCount === 0
|
|
342
|
+
}, isReplace ? 'Replace' : newCount > 1 ? "Add ".concat(newCount) : 'Add');
|
|
343
|
+
})())));
|
|
344
|
+
});
|
|
345
|
+
const MultiLookupField = exports.MultiLookupField = /*#__PURE__*/_react.default.memo(props => {
|
|
346
|
+
const [gridHandle] = _react.default.useState({});
|
|
347
|
+
return /*#__PURE__*/_react.default.createElement(_BaseField.BaseField, _extends({}, props, {
|
|
348
|
+
handle: props.handle,
|
|
349
|
+
getChildren: () => {
|
|
350
|
+
let children = [];
|
|
351
|
+
children.push(gridHandle);
|
|
352
|
+
return children;
|
|
353
|
+
},
|
|
354
|
+
valueParser: (value, inbound) => {
|
|
355
|
+
if (_Utils.default.isNull(value)) {
|
|
356
|
+
return inbound ? [] : null;
|
|
357
|
+
}
|
|
358
|
+
if (!Array.isArray(value)) {
|
|
359
|
+
// Tolerate the legacy single-object shape coming
|
|
360
|
+
// from older payloads — wrap it into a single-
|
|
361
|
+
// element array so the field can still render.
|
|
362
|
+
value = [value];
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// Username-keyed dedupe on both inbound and outbound.
|
|
366
|
+
// Legacy data may carry the same user multiple times
|
|
367
|
+
// (different DemandPlanner row UUIDs for the same
|
|
368
|
+
// person). The field shape is supposed to be a Set
|
|
369
|
+
// of users — enforce that here so duplicates never
|
|
370
|
+
// reach the render, save, or chip-removal paths.
|
|
371
|
+
const seen = new Set();
|
|
372
|
+
const deduped = [];
|
|
373
|
+
for (const v of value) {
|
|
374
|
+
if (_Utils.default.isNull(v)) continue;
|
|
375
|
+
const key = v.username ? String(v.username).toLowerCase() : '__id:' + v.id;
|
|
376
|
+
if (seen.has(key)) continue;
|
|
377
|
+
seen.add(key);
|
|
378
|
+
deduped.push(v);
|
|
379
|
+
}
|
|
380
|
+
if (inbound) {
|
|
381
|
+
const result = [];
|
|
382
|
+
for (const v of deduped) {
|
|
383
|
+
const copy = _objectSpread({}, v);
|
|
384
|
+
const renderedLabel = copy.dataRecordDescription || copy.fullName || copy.label || copy.username || String(copy.id || '');
|
|
385
|
+
copy.__oui_label = renderedLabel;
|
|
386
|
+
copy.toString = () => renderedLabel;
|
|
387
|
+
result.push(copy);
|
|
388
|
+
}
|
|
389
|
+
return result;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// Outbound — strip transient fields the server has
|
|
393
|
+
// no business seeing back.
|
|
394
|
+
return deduped.map(v => {
|
|
395
|
+
const out = _objectSpread({}, v);
|
|
396
|
+
delete out.__oui_label;
|
|
397
|
+
delete out.toString;
|
|
398
|
+
return out;
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
}), base => /*#__PURE__*/_react.default.createElement(MultiLookupFieldComponent, _extends({
|
|
402
|
+
gridHandle: gridHandle,
|
|
403
|
+
base: base
|
|
404
|
+
}, props)));
|
|
405
|
+
});
|
|
406
|
+
var _default = exports.default = MultiLookupField;
|
|
407
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9VdGlscyIsIl9JY29uQnV0dG9uIiwiX0RpYWxvZyIsIl9EaWFsb2dBY3Rpb25zIiwiX0RpYWxvZ1RpdGxlIiwiX0RpYWxvZ0NvbnRlbnQiLCJfQnV0dG9uIiwiX0NoaXAiLCJfSW5wdXRMYWJlbCIsIl9Gb3JtSGVscGVyVGV4dCIsIl9Ub29sdGlwIiwiX1R5cG9ncmFwaHkiLCJfRGl2aWRlciIsIl9CYXNlRmllbGQiLCJfRGF0YUdyaWQiLCJfT2JzZXJ2YWJsZSIsIl9JY29uIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiX2V4dGVuZHMiLCJPYmplY3QiLCJhc3NpZ24iLCJiaW5kIiwibiIsImFyZ3VtZW50cyIsImxlbmd0aCIsInQiLCJyIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiYXBwbHkiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsIl9vYmplY3RTcHJlYWQiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIl90b1Byb3BlcnR5S2V5IiwidmFsdWUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImkiLCJfdG9QcmltaXRpdmUiLCJTeW1ib2wiLCJ0b1ByaW1pdGl2ZSIsIlR5cGVFcnJvciIsIlN0cmluZyIsIk51bWJlciIsIk11bHRpTG9va3VwRmllbGRDb21wb25lbnQiLCJSZWFjdCIsIm1lbW8iLCJwcm9wcyIsIl9wcm9wcyRjb25maWckYXR0cmlidSIsIl9wcm9wcyRjb25maWckYXR0cmlidTIiLCJfcHJvcHMkY29uZmlnJGF0dHJpYnUzIiwiX3Byb3BzJGNvbmZpZyRhdHRyaWJ1NCIsIl9wcm9wcyRjb25maWckYXR0cmlidTUiLCJfcHJvcHMkY29uZmlnJGF0dHJpYnU2IiwiYmFzZSIsImN1cnJlbnRTZWxlY3Rpb24iLCJzZXRDdXJyZW50U2VsZWN0aW9uIiwidXNlU3RhdGUiLCJvcGVuIiwic2V0T3BlbiIsIndpZHRoIiwiY29uZmlnIiwiYXR0cmlidXRlcyIsInN0eWxlIiwibWluV2lkdGgiLCJtYXJnaW4iLCJVdGlscyIsImlzTnVsbCIsIkFycmF5IiwiaXNBcnJheSIsImxhYmVsIiwicGxhY2Vob2xkZXIiLCJnZXRDb21wb25lbnRBdHRyaWJ1dGUiLCJyYXdNYXgiLCJtYXhJdGVtcyIsImhhbmRsZUNsb3NlIiwiZXZlbnRNYW5hZ2VyIiwiY2xlYXJDb21wb25lbnRFdmVudExpc3RlbmVycyIsImdyaWRIYW5kbGUiLCJhcGkiLCJpZCIsInVzZUVmZmVjdCIsImdyaWQiLCJzZWxlY3Rpb25Nb2RlIiwiYnVpbGRTZWxlY3RlZEl0ZW0iLCJyb3ciLCJpdGVtIiwicHJvcGVydGllcyIsImdldE93blByb3BlcnR5TmFtZXMiLCJkaXNwbGF5VGVtcGxhdGUiLCJyZW5kZXJlZExhYmVsIiwicHJvcGVydHkiLCJyZXBsYWNlIiwiX19vdWlfbGFiZWwiLCJ0b1N0cmluZyIsImV4aXN0aW5nVXNlcm5hbWVzIiwidXNlTWVtbyIsInNldCIsIlNldCIsInYiLCJ1c2VybmFtZSIsImFkZCIsInRvTG93ZXJDYXNlIiwiYWRkU2VsZWN0aW9uIiwiYWRkaXRpb25zIiwiaGFzIiwibWFwIiwibmV4dCIsInNsaWNlIiwiaGFuZGxlVmFsdWVDaGFuZ2UiLCJwcmVzZWxlY3RFeGlzdGluZ1Jvd3MiLCJ1c2VDYWxsYmFjayIsImxvYWRlZFJvd3MiLCJtYXRjaGluZ0lkcyIsInNlbGVjdCIsIm1hdGNoaW5nUm93cyIsImluY2x1ZGVzIiwicmVtb3ZlSXRlbSIsImNsZWFyQWxsIiwib3BlblNlYXJjaCIsImJvcmRlckNvbG9yIiwiaGFzRXJyb3IiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwibWVyZ2VTdHlsZXMiLCJtYXJnaW5Cb3R0b20iLCJtYXJnaW5Ub3AiLCJkaXNhYmxlZCIsInRpdGxlIiwiaGVpZ2h0IiwidmFyaWFudCIsIm9uQ2xpY2siLCJwb3NpdGlvbiIsInJlcXVpcmVkIiwiZXJyb3IiLCJzaHJpbmsiLCJzeCIsImZvbnRTaXplIiwidHJhbnNmb3JtIiwiYmFja2dyb3VuZCIsInBhZGRpbmciLCJ6SW5kZXgiLCJ0b3AiLCJzaXplIiwicmlnaHQiLCJ1bmRlZmluZWQiLCJtaW5IZWlnaHQiLCJib3JkZXIiLCJjb25jYXQiLCJib3JkZXJSYWRpdXMiLCJkaXNwbGF5IiwiZmxleFdyYXAiLCJhbGlnbkl0ZW1zIiwiZ2FwIiwiY3Vyc29yIiwidHJhbnNpdGlvbiIsImNvbG9yIiwiZm9udFN0eWxlIiwia2V5IiwiZGF0YVJlY29yZERlc2NyaXB0aW9uIiwib25EZWxldGUiLCJzdG9wUHJvcGFnYXRpb24iLCJtYXhXaWR0aCIsIm92ZXJmbG93IiwidGV4dE92ZXJmbG93IiwiZXJyb3JNZXNzYWdlIiwibWFyZ2luTGVmdCIsIm9uQ2xvc2UiLCJmdWxsV2lkdGgiLCJQYXBlclByb3BzIiwiZGlzYWJsZUJhY2tkcm9wQ2xpY2siLCJmb250V2VpZ2h0IiwicGlja2VyTGFiZWwiLCJ0aWNrZWROZXciLCJ0aWNrZWRFeGlzdGluZyIsIndpbGxSZXBsYWNlIiwibWF4SGVpZ2h0IiwiRGF0YUdyaWQiLCJoYW5kbGUiLCJyZWYiLCJjcmVhdGVSZWYiLCJtdWx0aVNlbGVjdCIsInZpZXdJZCIsIm9uU2VsZWN0aW9uQ2hhbmdlIiwic2VsZWN0aW9uIiwib25Sb3dzTG9hZGVkIiwibWFyZ2luUmlnaHQiLCJuZXdDb3VudCIsImlzUmVwbGFjZSIsIk11bHRpTG9va3VwRmllbGQiLCJleHBvcnRzIiwiQmFzZUZpZWxkIiwiZ2V0Q2hpbGRyZW4iLCJjaGlsZHJlbiIsInZhbHVlUGFyc2VyIiwiaW5ib3VuZCIsInNlZW4iLCJkZWR1cGVkIiwicmVzdWx0IiwiY29weSIsImZ1bGxOYW1lIiwib3V0IiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9NdWx0aUxvb2t1cEZpZWxkLmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL1V0aWxzJztcbmltcG9ydCBJY29uQnV0dG9uIGZyb20gJ0BtdWkvbWF0ZXJpYWwvSWNvbkJ1dHRvbic7XG5pbXBvcnQgRGlhbG9nIGZyb20gJ0BtdWkvbWF0ZXJpYWwvRGlhbG9nJztcbmltcG9ydCBEaWFsb2dBY3Rpb25zIGZyb20gJ0BtdWkvbWF0ZXJpYWwvRGlhbG9nQWN0aW9ucyc7XG5pbXBvcnQgRGlhbG9nVGl0bGUgZnJvbSAnQG11aS9tYXRlcmlhbC9EaWFsb2dUaXRsZSc7XG5pbXBvcnQgRGlhbG9nQ29udGVudCBmcm9tICdAbXVpL21hdGVyaWFsL0RpYWxvZ0NvbnRlbnQnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdAbXVpL21hdGVyaWFsL0J1dHRvbic7XG5pbXBvcnQgQ2hpcCBmcm9tICdAbXVpL21hdGVyaWFsL0NoaXAnO1xuaW1wb3J0IElucHV0TGFiZWwgZnJvbSAnQG11aS9tYXRlcmlhbC9JbnB1dExhYmVsJztcbmltcG9ydCBGb3JtSGVscGVyVGV4dCBmcm9tICdAbXVpL21hdGVyaWFsL0Zvcm1IZWxwZXJUZXh0JztcbmltcG9ydCBUb29sdGlwIGZyb20gJ0BtdWkvbWF0ZXJpYWwvVG9vbHRpcCc7XG5pbXBvcnQgVHlwb2dyYXBoeSBmcm9tICdAbXVpL21hdGVyaWFsL1R5cG9ncmFwaHknO1xuaW1wb3J0IERpdmlkZXIgZnJvbSAnQG11aS9tYXRlcmlhbC9EaXZpZGVyJztcbmltcG9ydCB7IEJhc2VGaWVsZCB9IGZyb20gJy4vQmFzZUZpZWxkJztcbmltcG9ydCB7IERhdGFHcmlkIH0gZnJvbSAnLi4vRGF0YUdyaWQnO1xuaW1wb3J0IGV2ZW50TWFuYWdlciBmcm9tICcuLi8uLi9ldmVudC9PYnNlcnZhYmxlJztcbmltcG9ydCBJY29uIGZyb20gJy4uL0ljb24nO1xuXG4vLyBNdWx0aS1zZWxlY3QgY291bnRlcnBhcnQgdG8gTG9va3VwRmllbGQuIFJlbmRlcnMgc2VsZWN0ZWQgaXRlbXMgYXMgTVVJXG4vLyBDaGlwcyBzaXR0aW5nIGluc2lkZSBhIGZhdXgtb3V0bGluZWQgaW5wdXQsIHdpdGggYSBcIi4uLlwiIGJ1dHRvbiBtYXRjaGluZ1xuLy8gTG9va3VwRmllbGQncyBsYXlvdXQgZm9yIHZpc3VhbCBjb250aW51aXR5LiBUaGUgcG9wdXAgcGlja2VyIHJldXNlcyB0aGVcbi8vIHNhbWUgRGF0YUdyaWQgY29tcG9uZW50IExvb2t1cEZpZWxkIHVzZXMgYnV0IGZvcmNlcyBtdWx0aVNlbGVjdCBtb2RlIHNvXG4vLyB0aGUgb3BlcmF0b3IgY2FuIHRpY2sgc2V2ZXJhbCByb3dzIGluIG9uZSBnby5cbmNvbnN0IE11bHRpTG9va3VwRmllbGRDb21wb25lbnQgPSBSZWFjdC5tZW1vKChwcm9wcykgPT4ge1xuICAgIGNvbnN0IGJhc2UgPSBwcm9wcy5iYXNlO1xuICAgIGNvbnN0IFtjdXJyZW50U2VsZWN0aW9uLCBzZXRDdXJyZW50U2VsZWN0aW9uXSA9IFJlYWN0LnVzZVN0YXRlKFtdKTtcbiAgICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3Qgd2lkdGggPSBwcm9wcy5jb25maWcuYXR0cmlidXRlcz8uc3R5bGU/LndpZHRoID8gcHJvcHMuY29uZmlnLmF0dHJpYnV0ZXMuc3R5bGUud2lkdGggOiAnMTAwJSc7XG4gICAgY29uc3QgbWluV2lkdGggPSBwcm9wcy5jb25maWcuYXR0cmlidXRlcz8uc3R5bGU/Lm1pbldpZHRoID8gcHJvcHMuY29uZmlnLmF0dHJpYnV0ZXMuc3R5bGUubWluV2lkdGggOiAnMjQwcHgnO1xuICAgIGNvbnN0IG1hcmdpbiA9ICFVdGlscy5pc051bGwocHJvcHMuY29uZmlnLmF0dHJpYnV0ZXM/LnN0eWxlPy5tYXJnaW4pID8gcHJvcHMuY29uZmlnLmF0dHJpYnV0ZXMuc3R5bGUubWFyZ2luIDogJzRweCAwJztcblxuICAgIGNvbnN0IHZhbHVlID0gQXJyYXkuaXNBcnJheShiYXNlLnZhbHVlKSA/IGJhc2UudmFsdWUgOiBbXTtcbiAgICBjb25zdCBsYWJlbCA9ICFVdGlscy5pc051bGwocHJvcHMuY29uZmlnLmF0dHJpYnV0ZXMpICYmICFVdGlscy5pc051bGwocHJvcHMuY29uZmlnLmF0dHJpYnV0ZXMubGFiZWwpXG4gICAgICAgID8gcHJvcHMuY29uZmlnLmF0dHJpYnV0ZXMubGFiZWwgOiBudWxsO1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gVXRpbHMuZ2V0Q29tcG9uZW50QXR0cmlidXRlKHByb3BzLmNvbmZpZywgJ3BsYWNlaG9sZGVyJywgJ05vIHNlbGVjdGlvbicpO1xuICAgIC8vIE9wdGlvbmFsIGNhcCBvbiBob3cgbWFueSBpdGVtcyB0aGUgZmllbGQgY2FuIGhvbGQuIFdoZW4gc2V0LCBBZGRcbiAgICAvLyBhcHBlbmRzIGFuZCB0cmltcyBmcm9tIHRoZSBmcm9udCAoc28gdGhlIG1vc3QtcmVjZW50IE4gcGlja3Mgd2luKSDigJRcbiAgICAvLyBtYWtpbmcgbWF4SXRlbXM9MSBhIGNsZWFuIFwicmVwbGFjZSBleGlzdGluZ1wiIGludGVyYWN0aW9uLlxuICAgIGNvbnN0IHJhd01heCA9IFV0aWxzLmdldENvbXBvbmVudEF0dHJpYnV0ZShwcm9wcy5jb25maWcsICdtYXhJdGVtcycsIG51bGwpO1xuICAgIGNvbnN0IG1heEl0ZW1zID0gKHR5cGVvZiByYXdNYXggPT09ICdudW1iZXInICYmIHJhd01heCA+IDApID8gcmF3TWF4IDogbnVsbDtcblxuICAgIGNvbnN0IGhhbmRsZUNsb3NlID0gKCkgPT4ge1xuICAgICAgICBzZXRPcGVuKGZhbHNlKTtcbiAgICAgICAgc2V0Q3VycmVudFNlbGVjdGlvbihbXSk7XG4gICAgICAgIGV2ZW50TWFuYWdlci5jbGVhckNvbXBvbmVudEV2ZW50TGlzdGVuZXJzKHByb3BzLmdyaWRIYW5kbGUuYXBpLmlkKTtcbiAgICB9O1xuXG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKHByb3BzLmNvbmZpZyAmJiBwcm9wcy5jb25maWcuZ3JpZCkge1xuICAgICAgICAgICAgaWYgKCFwcm9wcy5jb25maWcuZ3JpZC5hdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgcHJvcHMuY29uZmlnLmdyaWQuYXR0cmlidXRlcyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvcHMuY29uZmlnLmdyaWQuYXR0cmlidXRlc1snbWFyZ2luJ10gPSBVdGlscy5nZXRDb21wb25lbnRBdHRyaWJ1dGUocHJvcHMuY29uZmlnLmdyaWQsICdtYXJnaW4nLCAnMTZweCcpO1xuICAgICAgICAgICAgLy8gSW50ZW50aW9uYWxseSBkbyBOT1Qgc2V0IHNlbGVjdGlvbk1vZGU9J01VTFRJUExFJyBvbiB0aGUgZ3JpZFxuICAgICAgICAgICAgLy8gY29uZmlnLiBUaGF0IG1vZGUgcmVuZGVycyBhIGNoZWNrYm94IGNvbHVtbiBpbiB0aGUgaGVhZGVyIEFORFxuICAgICAgICAgICAgLy8gZXZlcnkgcm93LCB3aGljaCAoYSkgZG9lc24ndCBhY2NvdW50IGZvciBhbnkgY29uZmlndXJlZCBjb2x1bW5cbiAgICAgICAgICAgIC8vIHdpZHRocyB0aGF0IGFscmVhZHkgc3VtIHRvIDEwMCUg4oCUIGNhdXNpbmcgdGhlIGxhc3QgY29sdW1uIHRvXG4gICAgICAgICAgICAvLyB3cmFwIG9uIGFuIGVtcHR5L3Vuc2VhcmNoZWQgZ3JpZCDigJQgYW5kIChiKSBpcyByZWR1bmRhbnQ6IHRoZVxuICAgICAgICAgICAgLy8gbXVsdGktc2VsZWN0IGNsaWNrLXRvZ2dsZSBvbiByb3dzIChlbmFibGVkIGJlbG93IHZpYSB0aGVcbiAgICAgICAgICAgIC8vIGBtdWx0aVNlbGVjdGAgcHJvcCkgaGFuZGxlcyBzZWxlY3Rpb24ganVzdCBhcyB3ZWxsLCB3aXRoIHRoZVxuICAgICAgICAgICAgLy8gc2VsZWN0ZWQtcm93IGhpZ2hsaWdodCBnaXZpbmcgdmlzdWFsIGZlZWRiYWNrLlxuICAgICAgICAgICAgaWYgKHByb3BzLmNvbmZpZy5ncmlkLnNlbGVjdGlvbk1vZGUgPT09ICdNVUxUSVBMRScpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgcHJvcHMuY29uZmlnLmdyaWQuc2VsZWN0aW9uTW9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIFtdKTtcblxuICAgIGZ1bmN0aW9uIGJ1aWxkU2VsZWN0ZWRJdGVtKHJvdykge1xuICAgICAgICBsZXQgaXRlbSA9IHt9O1xuICAgICAgICBsZXQgcHJvcGVydGllcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHJvdyk7XG4gICAgICAgIGxldCBkaXNwbGF5VGVtcGxhdGUgPSBVdGlscy5nZXRDb21wb25lbnRBdHRyaWJ1dGUocHJvcHMuY29uZmlnLCAnZGlzcGxheVRlbXBsYXRlJywgJ0B7ZGF0YVJlY29yZERlc2NyaXB0aW9ufScpO1xuICAgICAgICBsZXQgcmVuZGVyZWRMYWJlbCA9IGRpc3BsYXlUZW1wbGF0ZTtcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHJlbmRlcmVkTGFiZWwgPSByZW5kZXJlZExhYmVsLnJlcGxhY2UoJ0B7JyArIHByb3BlcnR5ICsgJ30nLCByb3dbcHJvcGVydHldKTtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPT0gJ2xhYmVsJykge1xuICAgICAgICAgICAgICAgIGl0ZW1bcHJvcGVydHldID0gcm93W3Byb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW0uX19vdWlfbGFiZWwgPSByZW5kZXJlZExhYmVsO1xuICAgICAgICBpdGVtLnRvU3RyaW5nID0gKCkgPT4gcmVuZGVyZWRMYWJlbDtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuXG4gICAgLy8gU3RhYmxlIGxvb2t1cCBvZiB1c2VybmFtZXMgdGhhdCBhcmUgYWxyZWFkeSBpbiB0aGUgZmllbGQncyB2YWx1ZS4gVGhlXG4gICAgLy8gcGlja2VyJ3Mgc2VhcmNoIHNlcnZpY2UgKGUuZy4gL2F1dGgvYXBpL3YxL3VzZXIvc2VhcmNoKSByZXR1cm5zIHJvd3NcbiAgICAvLyB3aXRoIHRoZSBhdXRoIHVzZXIncyBVVUlEIGFzIGBpZGAsIHdoaWxlIHRoZSBjaGlwcyB3ZXJlIGJ1aWx0IGZyb21cbiAgICAvLyB0aGUgRGVtYW5kUGxhbm5lciByb3cncyBVVUlEIOKAlCBzbyBkZS1kdXBsaWNhdGluZyBieSBgaWRgIHdvdWxkIG5vdFxuICAgIC8vIGNhdGNoIHJlcGVhdHMuIGB1c2VybmFtZWAgaXMgdGhlIG9ubHkgZmllbGQgdGhhdCdzIHJlbGlhYmx5IHRoZVxuICAgIC8vIHNhbWUgb24gYm90aCBzaWRlcy5cbiAgICBjb25zdCBleGlzdGluZ1VzZXJuYW1lcyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBjb25zdCBzZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHYgJiYgdi51c2VybmFtZSkgc2V0LmFkZChTdHJpbmcodi51c2VybmFtZSkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNldDtcbiAgICB9LCBbdmFsdWVdKTtcblxuICAgIGNvbnN0IGFkZFNlbGVjdGlvbiA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFjdXJyZW50U2VsZWN0aW9uIHx8IGN1cnJlbnRTZWxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWRkaXRpb25zID0gY3VycmVudFNlbGVjdGlvblxuICAgICAgICAgICAgLmZpbHRlcihyb3cgPT4gcm93ICYmIHJvdy51c2VybmFtZSAmJiAhZXhpc3RpbmdVc2VybmFtZXMuaGFzKFN0cmluZyhyb3cudXNlcm5hbWUpLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAgICAgLm1hcChidWlsZFNlbGVjdGVkSXRlbSk7XG5cbiAgICAgICAgbGV0IG5leHQgPSBbLi4udmFsdWUsIC4uLmFkZGl0aW9uc107XG4gICAgICAgIGlmIChtYXhJdGVtcyAhPSBudWxsICYmIG5leHQubGVuZ3RoID4gbWF4SXRlbXMpIHtcbiAgICAgICAgICAgIC8vIE5ld2VyIHBpY2tzIHRha2UgcHJlY2VkZW5jZSDigJQgZHJvcCB0aGUgb2xkZXN0IGVudHJpZXMgdW50aWxcbiAgICAgICAgICAgIC8vIHdlIGZpdC4gV2l0aCBtYXhJdGVtcz0xIHRoaXMgaW1wbGVtZW50cyB0aGUgXCJyZXBsYWNlIGV4aXN0aW5nXCJcbiAgICAgICAgICAgIC8vIHNlbWFudGljczogZXhpc3RpbmcgY2hpcCBpcyBkcm9wcGVkLCBuZXcgcGljayB0YWtlcyBpdHMgcGxhY2UuXG4gICAgICAgICAgICBuZXh0ID0gbmV4dC5zbGljZShuZXh0Lmxlbmd0aCAtIG1heEl0ZW1zKTtcbiAgICAgICAgfVxuICAgICAgICBiYXNlLmhhbmRsZVZhbHVlQ2hhbmdlKG5leHQubGVuZ3RoID4gMCA/IG5leHQgOiBudWxsKTtcbiAgICAgICAgaGFuZGxlQ2xvc2UoKTtcbiAgICB9O1xuXG4gICAgLy8gUHJlLXNlbGVjdCByb3dzIHJldHVybmVkIGJ5IHRoZSBzZWFyY2ggdGhhdCBtYXRjaCB1c2VycyBhbHJlYWR5IGluXG4gICAgLy8gdGhlIGZpZWxkJ3MgdmFsdWUsIHNvIHRoZSBvcGVyYXRvciBjYW4gc2VlIGF0IGEgZ2xhbmNlIHdoaWNoIHJlc3VsdHNcbiAgICAvLyB0aGV5IGhhdmUgYWxyZWFkeSBhZGRlZC4gVGhlIERhdGFHcmlkIGZpcmVzIG9uUm93c0xvYWRlZCBhZnRlciBldmVyeVxuICAgIC8vIGRhdGEgcmVmcmVzaDsgd2UgdGljayBtYXRjaGluZyByb3dzIHZpYSB0aGUgZ3JpZCBhcGkuXG4gICAgY29uc3QgcHJlc2VsZWN0RXhpc3RpbmdSb3dzID0gUmVhY3QudXNlQ2FsbGJhY2soKGxvYWRlZFJvd3MpID0+IHtcbiAgICAgICAgaWYgKCFsb2FkZWRSb3dzIHx8IGxvYWRlZFJvd3MubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIGlmICghcHJvcHMuZ3JpZEhhbmRsZSB8fCAhcHJvcHMuZ3JpZEhhbmRsZS5hcGkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBtYXRjaGluZ0lkcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiBsb2FkZWRSb3dzKSB7XG4gICAgICAgICAgICBpZiAocm93ICYmIHJvdy51c2VybmFtZSAmJiBleGlzdGluZ1VzZXJuYW1lcy5oYXMoU3RyaW5nKHJvdy51c2VybmFtZSkudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICBtYXRjaGluZ0lkcy5wdXNoKHJvdy5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF0Y2hpbmdJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcHJvcHMuZ3JpZEhhbmRsZS5hcGkuc2VsZWN0KG1hdGNoaW5nSWRzKTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nUm93cyA9IGxvYWRlZFJvd3MuZmlsdGVyKHIgPT4gbWF0Y2hpbmdJZHMuaW5jbHVkZXMoci5pZCkpO1xuICAgICAgICAgICAgc2V0Q3VycmVudFNlbGVjdGlvbihtYXRjaGluZ1Jvd3MpO1xuICAgICAgICB9XG4gICAgfSwgW2V4aXN0aW5nVXNlcm5hbWVzLCBwcm9wcy5ncmlkSGFuZGxlXSk7XG5cbiAgICBjb25zdCByZW1vdmVJdGVtID0gKGlkKSA9PiB7XG4gICAgICAgIGNvbnN0IG5leHQgPSB2YWx1ZS5maWx0ZXIodiA9PiB2LmlkICE9PSBpZCk7XG4gICAgICAgIGJhc2UuaGFuZGxlVmFsdWVDaGFuZ2UobmV4dC5sZW5ndGggPiAwID8gbmV4dCA6IG51bGwpO1xuICAgIH07XG5cbiAgICBjb25zdCBjbGVhckFsbCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBiYXNlLmhhbmRsZVZhbHVlQ2hhbmdlKG51bGwpO1xuICAgIH07XG5cbiAgICBjb25zdCBvcGVuU2VhcmNoID0gKCkgPT4ge1xuICAgICAgICBzZXRPcGVuKHRydWUpO1xuICAgIH07XG5cbiAgICBjb25zdCBib3JkZXJDb2xvciA9IGJhc2UuaGFzRXJyb3IgPyAnI2Y0NDMzNicgOiAnI2NjY2NjYyc7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctMTAwIG11bHRpLWxvb2t1cCByb3cgbm8tbWFyZ2luIG5vLXBhZGRpbmcgb3VpLWZvcm0taXRlbVwiXG4gICAgICAgICAgICAgc3R5bGU9e1V0aWxzLm1lcmdlU3R5bGVzKHtcbiAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgICAgICAgICBtaW5XaWR0aDogbWluV2lkdGgsXG4gICAgICAgICAgICAgICAgIG1hcmdpbjogbWFyZ2luLFxuICAgICAgICAgICAgICAgICBtYXJnaW5Cb3R0b206IGJhc2UuaGFzRXJyb3IgPyAnMjBweCcgOiAnNHB4JyxcbiAgICAgICAgICAgICAgICAgbWFyZ2luVG9wOiAnOHB4J1xuICAgICAgICAgICAgIH0sIHByb3BzLmNvbmZpZyl9PlxuICAgICAgICAgICAgeyFiYXNlLmRpc2FibGVkICYmIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17J2NvbC0qLSonfSBzdHlsZT17e3dpZHRoOiAnNzJweCd9fT5cbiAgICAgICAgICAgICAgICAgICAgPFRvb2x0aXAgdGl0bGU9eydTZWxlY3QgJyArIChsYWJlbCA/IGxhYmVsLnRvTG93ZXJDYXNlKCkgOiAnaXRlbXMnKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7aGVpZ2h0OiAnNDBweCcsIG1pbldpZHRoOiAnNjRweCd9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PXsnb3V0bGluZWQnfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtvcGVuU2VhcmNofVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17YmFzZS5kaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIm9wZW4gcGlja2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9eydjb2wtKi0qIG5vLW1hcmdpbiBuby1wYWRkaW5nJ31cbiAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAhYmFzZS5kaXNhYmxlZCA/ICdjYWxjKDEwMCUgLSA3MnB4KScgOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICAgICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICB7bGFiZWwgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRMYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9e2Jhc2UucmVxdWlyZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcj17YmFzZS5oYXNFcnJvcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNocmlua1xuICAgICAgICAgICAgICAgICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogJzAuNzVyZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSg4cHgsIC02cHgpIHNjYWxlKDEpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAnI2ZmZicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzAgNHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtsYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgPC9JbnB1dExhYmVsPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgeyFiYXNlLnJlcXVpcmVkICYmICFiYXNlLmRpc2FibGVkICYmIHZhbHVlLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8VG9vbHRpcCB0aXRsZT17J0NsZWFyIGFsbCd9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPEljb25CdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2NsZWFyQWxsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN4PXt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodDogNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SWNvbiBpZD17J0NMRUFSJ30vPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9JY29uQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2Jhc2UuZGlzYWJsZWQgPyB1bmRlZmluZWQgOiBvcGVuU2VhcmNofVxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0OiAnNDBweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IGAxcHggc29saWQgJHtib3JkZXJDb2xvcn1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnNHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IHZhbHVlLmxlbmd0aCA9PT0gMCA/ICc4cHggMTJweCcgOiAnNnB4IDM2cHggNnB4IDhweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGV4V3JhcDogJ3dyYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBnYXA6ICc0cHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBiYXNlLmRpc2FibGVkID8gJ2RlZmF1bHQnIDogJ3BvaW50ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogYmFzZS5kaXNhYmxlZCA/ICcjZmFmYWZhJyA6ICcjZmZmJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246ICdib3JkZXItY29sb3IgMTIwbXMgZWFzZSdcbiAgICAgICAgICAgICAgICAgICAgfX0+XG4gICAgICAgICAgICAgICAgICAgIHt2YWx1ZS5sZW5ndGggPT09IDAgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyM5ZTllOWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMC44NzVyZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTdHlsZTogJ2l0YWxpYydcbiAgICAgICAgICAgICAgICAgICAgICAgIH19PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtiYXNlLmRpc2FibGVkID8gJ+KAlCcgOiBwbGFjZWhvbGRlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAge3ZhbHVlLm1hcCgoaXRlbSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPENoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2l0ZW0uaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e2l0ZW0uX19vdWlfbGFiZWwgfHwgaXRlbS5kYXRhUmVjb3JkRGVzY3JpcHRpb24gfHwgaXRlbS5sYWJlbCB8fCBpdGVtLnVzZXJuYW1lIHx8IFN0cmluZyhpdGVtLmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkRlbGV0ZT17YmFzZS5kaXNhYmxlZCA/IHVuZGVmaW5lZCA6IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUl0ZW0oaXRlbS5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyYgLk11aUNoaXAtbGFiZWwnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0T3ZlcmZsb3c6ICdlbGxpcHNpcydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB7YmFzZS5lcnJvck1lc3NhZ2UgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8Rm9ybUhlbHBlclRleHQgZXJyb3Igc3g9e3ttYXJnaW5MZWZ0OiAnOHB4J319PlxuICAgICAgICAgICAgICAgICAgICAgICAge2Jhc2UuZXJyb3JNZXNzYWdlfVxuICAgICAgICAgICAgICAgICAgICA8L0Zvcm1IZWxwZXJUZXh0PlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxEaWFsb2cgb3Blbj17b3Blbn0gb25DbG9zZT17aGFuZGxlQ2xvc2V9IGFyaWEtbGFiZWxsZWRieT1cIm11bHRpLWxvb2t1cC1kaWFsb2ctdGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICBmdWxsV2lkdGhcbiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICBQYXBlclByb3BzPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICBzeDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBVdGlscy5nZXRDb21wb25lbnRBdHRyaWJ1dGUocHJvcHMuY29uZmlnLCAncGlja2VyTGlzdFdpZHRoJywgODgwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogJzkydncnXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVCYWNrZHJvcENsaWNrPXt0cnVlfT5cbiAgICAgICAgICAgICAgICA8RGlhbG9nVGl0bGUgaWQ9XCJtdWx0aS1sb29rdXAtZGlhbG9nLXRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcxNnB4IDI0cHggMTJweCAyNHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMS4wNXJlbScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiA1MDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0+XG4gICAgICAgICAgICAgICAgICAgIHshVXRpbHMuaXNOdWxsKHByb3BzLmNvbmZpZy5hdHRyaWJ1dGVzKSAmJiAhVXRpbHMuaXNOdWxsKHByb3BzLmNvbmZpZy5hdHRyaWJ1dGVzPy5waWNrZXJMYWJlbClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcHJvcHMuY29uZmlnLmF0dHJpYnV0ZXM/LnBpY2tlckxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHByb3BzLmNvbmZpZy5hdHRyaWJ1dGVzPy5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgPFR5cG9ncmFwaHkgdmFyaWFudD1cImNhcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeD17e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogJzRweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3RleHQuc2Vjb25kYXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTdHlsZTogJ2l0YWxpYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogJzAuNzVyZW0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PlxuICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGlja2VkTmV3ID0gY3VycmVudFNlbGVjdGlvbi5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPT4gciAmJiByLnVzZXJuYW1lICYmICFleGlzdGluZ1VzZXJuYW1lcy5oYXMoU3RyaW5nKHIudXNlcm5hbWUpLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGlja2VkRXhpc3RpbmcgPSBjdXJyZW50U2VsZWN0aW9uLmxlbmd0aCAtIHRpY2tlZE5ldztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3aWxsUmVwbGFjZSA9IG1heEl0ZW1zICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiB0aWNrZWROZXcgPiAwO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTZWxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhJdGVtcyA9PT0gMSAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1BpY2sgYSB1c2VyIHRvIHJlcGxhY2UgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIChsaW1pdDogMSknO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhJdGVtcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFRpY2sgYSB1c2VyIHRvIGFkZCAobGltaXQ6ICR7bWF4SXRlbXN9KWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdUaWNrIG9uZSBvciBtb3JlIHJvd3MsIHRoZW4gcHJlc3MgT0snO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGlja2VkTmV3ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aWNrZWRFeGlzdGluZ30gYWxyZWFkeSBpbiB5b3VyIHNlbGVjdGlvbiDigJQgcGljayBzb21lb25lIG5ldyB0byAke21heEl0ZW1zID09PSAxID8gJ3JlcGxhY2UgaXQnIDogJ2FkZCd9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbGxSZXBsYWNlICYmIG1heEl0ZW1zID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgV2lsbCByZXBsYWNlIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB3aXRoIHRoZSBuZXdseSB0aWNrZWQgdXNlcmA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aWNrZWRFeGlzdGluZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGlja2VkTmV3fSBuZXcg4oCUIHByZXNzIE9LIHRvIGFkZCB0byBzZWxlY3Rpb25gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGlja2VkTmV3fSBuZXcgKCR7dGlja2VkRXhpc3Rpbmd9IGFscmVhZHkgaW4gc2VsZWN0aW9uKSDigJQgcHJlc3MgT0sgdG8gYWRkIHRoZSBuZXcgJHt0aWNrZWROZXcgPT09IDEgPyAnb25lJyA6ICdvbmVzJ31gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkoKX1cbiAgICAgICAgICAgICAgICAgICAgPC9UeXBvZ3JhcGh5PlxuICAgICAgICAgICAgICAgIDwvRGlhbG9nVGl0bGU+XG4gICAgICAgICAgICAgICAgPERpdmlkZXIvPlxuICAgICAgICAgICAgICAgIDxEaWFsb2dDb250ZW50IHN4PXt7XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcwJyxcbiAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0OiAnMzYwcHgnLFxuICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6ICc2MHZoJyxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6ICdhdXRvJ1xuICAgICAgICAgICAgICAgIH19PlxuICAgICAgICAgICAgICAgICAgICA8RGF0YUdyaWQgY29uZmlnPXtwcm9wcy5jb25maWcuZ3JpZH0gaGFuZGxlPXtwcm9wcy5ncmlkSGFuZGxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPXtSZWFjdC5jcmVhdGVSZWYoKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpU2VsZWN0PXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0lkPXtwcm9wcy52aWV3SWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNlbGVjdGlvbkNoYW5nZT17KHNlbGVjdGlvbikgPT4gc2V0Q3VycmVudFNlbGVjdGlvbihzZWxlY3Rpb24pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Sb3dzTG9hZGVkPXtwcmVzZWxlY3RFeGlzdGluZ1Jvd3N9Lz5cbiAgICAgICAgICAgICAgICA8L0RpYWxvZ0NvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPERpdmlkZXIvPlxuICAgICAgICAgICAgICAgIDxEaWFsb2dBY3Rpb25zIHN4PXt7cGFkZGluZzogJzEycHggMjBweCd9fT5cbiAgICAgICAgICAgICAgICAgICAgPFR5cG9ncmFwaHkgdmFyaWFudD1cImNhcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeD17e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luUmlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAndGV4dC5zZWNvbmRhcnknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PlxuICAgICAgICAgICAgICAgICAgICAgICAge3ZhbHVlLmxlbmd0aCA+IDAgPyBgJHt2YWx1ZS5sZW5ndGh9IGFscmVhZHkgaW4gc2VsZWN0aW9uYCA6ICdOb3RoaW5nIGluIHNlbGVjdGlvbiB5ZXQnfVxuICAgICAgICAgICAgICAgICAgICA8L1R5cG9ncmFwaHk+XG4gICAgICAgICAgICAgICAgICAgIDxCdXR0b24gb25DbGljaz17aGFuZGxlQ2xvc2V9IGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvdW50ID0gY3VycmVudFNlbGVjdGlvbi5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9PiByICYmIHIudXNlcm5hbWUgJiYgIWV4aXN0aW5nVXNlcm5hbWVzLmhhcyhTdHJpbmcoci51c2VybmFtZSkudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNSZXBsYWNlID0gbWF4SXRlbXMgPT09IDEgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiBuZXdDb3VudCA+IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b24gb25DbGljaz17YWRkU2VsZWN0aW9ufSBjb2xvcj1cInByaW1hcnlcIiB2YXJpYW50PVwiY29udGFpbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtuZXdDb3VudCA9PT0gMH0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpc1JlcGxhY2UgPyAnUmVwbGFjZScgOiAobmV3Q291bnQgPiAxID8gYEFkZCAke25ld0NvdW50fWAgOiAnQWRkJyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KSgpfVxuICAgICAgICAgICAgICAgIDwvRGlhbG9nQWN0aW9ucz5cbiAgICAgICAgICAgIDwvRGlhbG9nPlxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufSk7XG5cbmV4cG9ydCBjb25zdCBNdWx0aUxvb2t1cEZpZWxkID0gUmVhY3QubWVtbygocHJvcHMpID0+IHtcbiAgICBjb25zdCBbZ3JpZEhhbmRsZV0gPSBSZWFjdC51c2VTdGF0ZSh7fSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8QmFzZUZpZWxkIHsuLi5wcm9wc30gaGFuZGxlPXtwcm9wcy5oYW5kbGV9IGdldENoaWxkcmVuPXtcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGdyaWRIYW5kbGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgdmFsdWVQYXJzZXI9eyh2YWx1ZSwgaW5ib3VuZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICBpZiAoVXRpbHMuaXNOdWxsKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluYm91bmQgPyBbXSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb2xlcmF0ZSB0aGUgbGVnYWN5IHNpbmdsZS1vYmplY3Qgc2hhcGUgY29taW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIG9sZGVyIHBheWxvYWRzIOKAlCB3cmFwIGl0IGludG8gYSBzaW5nbGUtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50IGFycmF5IHNvIHRoZSBmaWVsZCBjYW4gc3RpbGwgcmVuZGVyLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBbdmFsdWVdO1xuICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlcm5hbWUta2V5ZWQgZGVkdXBlIG9uIGJvdGggaW5ib3VuZCBhbmQgb3V0Ym91bmQuXG4gICAgICAgICAgICAgICAgICAgICAgIC8vIExlZ2FjeSBkYXRhIG1heSBjYXJyeSB0aGUgc2FtZSB1c2VyIG11bHRpcGxlIHRpbWVzXG4gICAgICAgICAgICAgICAgICAgICAgIC8vIChkaWZmZXJlbnQgRGVtYW5kUGxhbm5lciByb3cgVVVJRHMgZm9yIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcnNvbikuIFRoZSBmaWVsZCBzaGFwZSBpcyBzdXBwb3NlZCB0byBiZSBhIFNldFxuICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB1c2VycyDigJQgZW5mb3JjZSB0aGF0IGhlcmUgc28gZHVwbGljYXRlcyBuZXZlclxuICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFjaCB0aGUgcmVuZGVyLCBzYXZlLCBvciBjaGlwLXJlbW92YWwgcGF0aHMuXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZHVwZWQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVXRpbHMuaXNOdWxsKHYpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHYudXNlcm5hbWUgPyBTdHJpbmcodi51c2VybmFtZSkudG9Mb3dlckNhc2UoKSA6ICgnX19pZDonICsgdi5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVkdXBlZC5wdXNoKHYpO1xuICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluYm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIGRlZHVwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb3B5ID0gey4uLnZ9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVkTGFiZWwgPSBjb3B5LmRhdGFSZWNvcmREZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjb3B5LmZ1bGxOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvcHkubGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY29weS51c2VybmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBTdHJpbmcoY29weS5pZCB8fCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weS5fX291aV9sYWJlbCA9IHJlbmRlcmVkTGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weS50b1N0cmluZyA9ICgpID0+IHJlbmRlcmVkTGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY29weSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgLy8gT3V0Ym91bmQg4oCUIHN0cmlwIHRyYW5zaWVudCBmaWVsZHMgdGhlIHNlcnZlciBoYXNcbiAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gYnVzaW5lc3Mgc2VlaW5nIGJhY2suXG4gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWR1cGVkLm1hcCh2ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dCA9IHsuLi52fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvdXQuX19vdWlfbGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgb3V0LnRvU3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgfX0+XG4gICAgICAgICAgICB7YmFzZSA9PlxuICAgICAgICAgICAgICAgIDxNdWx0aUxvb2t1cEZpZWxkQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgIGdyaWRIYW5kbGU9e2dyaWRIYW5kbGV9XG4gICAgICAgICAgICAgICAgICAgIGJhc2U9e2Jhc2V9XG4gICAgICAgICAgICAgICAgICAgIHsuLi5wcm9wc30+XG4gICAgICAgICAgICAgICAgPC9NdWx0aUxvb2t1cEZpZWxkQ29tcG9uZW50PlxuICAgICAgICAgICAgfVxuICAgICAgICA8L0Jhc2VGaWVsZD5cbiAgICApO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IE11bHRpTG9va3VwRmllbGQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFdBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLGNBQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFLLFlBQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLGNBQUEsR0FB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
|
package/package.json
CHANGED