@projectcor/maia-components 2.11.40 → 2.11.41-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/App.js +22 -11
- package/lib/components/atoms/ContextMentionChip/ContextMentionChip.js +38 -0
- package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +184 -0
- package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.js +39 -0
- package/lib/components/atoms/ContextMentionChip/buildChipElement.js +390 -0
- package/lib/components/atoms/ContextMentionChip/index.js +4 -0
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +195 -0
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.styles.js +6 -0
- package/lib/components/atoms/ContextMentionEditor/index.js +2 -0
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +282 -0
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +145 -0
- package/lib/components/atoms/ContextMentionItem/index.js +2 -0
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +168 -0
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +79 -0
- package/lib/components/atoms/ContextMentionPopover/index.js +3 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.js +238 -321
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +269 -0
- package/lib/components/atoms/MAIAInput/styles.js +75 -46
- package/lib/components/atoms/icons/NotionIcon.js +36 -0
- package/lib/components/atoms/icons/SubtaskIcon.js +36 -0
- package/lib/components/atoms/icons/index.js +2 -1
- package/lib/components/index.js +2 -1
- package/lib/components/molecules/ChatAIHistory/ChatAIHistory.js +8 -4
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +31 -3
- package/lib/components/molecules/ChatAIMessages/newStyles.js +5 -2
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +8 -6
- package/lib/components/molecules/ChatFooter/ChatFooter.js +5 -4
- package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +68 -0
- package/lib/components/molecules/ContextMentionInput/ContextMentionInput.styles.js +6 -0
- package/lib/components/molecules/ContextMentionInput/index.js +2 -0
- package/lib/components/molecules/Sidebar/Sidebar.js +9 -5
- package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +6 -2
- package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +5 -2
- package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +6 -3
- package/lib/constants/config.js +3 -1
- package/lib/constants/taskLinkIcon.js +6 -0
- package/lib/context/cor-user.js +1 -1
- package/lib/dev/DevContextMentionInput.js +65 -0
- package/lib/dev/Providers.js +11 -6
- package/lib/hooks/useCaretPosition.js +35 -0
- package/lib/hooks/useChatManager/useChatManager.interface.js +1 -1
- package/lib/hooks/useChatManager/useChatManager.js +21 -11
- package/lib/hooks/useChatMessages/useChatMessages.interface.js +1 -1
- package/lib/hooks/useChatMessages/useChatMessages.js +30 -14
- package/lib/hooks/useClientSearch.js +3 -2
- package/lib/hooks/useContextMentions.js +270 -0
- package/lib/hooks/useEntitySearch.js +1010 -0
- package/lib/hooks/useEvent.js +6 -1
- package/lib/hooks/useMentionAllowedTypes.js +103 -0
- package/lib/hooks/useMentionPopover.js +333 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +6 -4
- package/lib/hooks/useProjectSearch.js +3 -2
- package/lib/hooks/useRecentClientsSearch.js +3 -2
- package/lib/hooks/useTaskPanel.js +3 -10
- package/lib/hooks/useTextOverflowEllipsisTooltip.js +34 -0
- package/lib/lang/br/index.js +24 -1
- package/lib/lang/en/index.js +24 -1
- package/lib/lang/es/index.js +24 -1
- package/lib/lang/fr/index.js +23 -1
- package/lib/services/maia/Chats/getChatMessages.js +29 -4
- package/lib/services/maia/Orchestrator/orchestrator.js +8 -5
- package/lib/services/maia/RecentProjects/getRecentProjects.js +12 -4
- package/lib/services/maia/RecentTasks/getRecentTasks.js +54 -0
- package/lib/services/maia/RecentTasks/index.js +6 -0
- package/lib/services/maia/RecentUsers/getRecentUsers.js +59 -0
- package/lib/services/maia/RecentUsers/index.js +6 -0
- package/lib/services/query/entitySearchQuery.js +18 -0
- package/lib/services/query/usersDirectoryQuery.js +19 -0
- package/lib/services/utils/mapChatMessages.js +12 -5
- package/lib/types/Chat.js +1 -1
- package/lib/types/agent.js +1 -1
- package/lib/types/contextMention.js +37 -0
- package/lib/utils/contextMentionIcons.js +115 -0
- package/lib/utils/contextMentionLabel.js +4 -0
- package/lib/utils/contextMentionTypeLabel.js +17 -0
- package/lib/utils/maiaStreamdownRehypePlugins.js +27 -0
- package/lib/utils/openTaskInCorPanel.js +18 -0
- package/lib/utils/renderContextMentions.js +299 -0
- package/package.json +2 -1
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
|
+
import { useCallback, useRef, useState } from 'react';
|
|
3
|
+
import { serializeMention } from '../utils/renderContextMentions';
|
|
4
|
+
/**
|
|
5
|
+
* Inspecciona la selección actual. Formato: [límite de palabra] @+ query hasta el caret.
|
|
6
|
+
* Permite espacios simples dentro del query (p. ej. "@Juan Perez") y cierra
|
|
7
|
+
* el trigger cuando detecta dos espacios consecutivos.
|
|
8
|
+
* La tab objetivo es la que corresponde al número de `@` (1 = primera tab visible, etc.).
|
|
9
|
+
*/
|
|
10
|
+
var detectMentionTrigger = function detectMentionTrigger(editorEl, range) {
|
|
11
|
+
if (!editorEl || !editorEl.contains(range.startContainer)) {
|
|
12
|
+
return {
|
|
13
|
+
active: false,
|
|
14
|
+
query: '',
|
|
15
|
+
atRunLength: 0,
|
|
16
|
+
anchor: null
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
var node = range.startContainer;
|
|
20
|
+
if (node.nodeType !== Node.TEXT_NODE) {
|
|
21
|
+
return {
|
|
22
|
+
active: false,
|
|
23
|
+
query: '',
|
|
24
|
+
atRunLength: 0,
|
|
25
|
+
anchor: null
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
var text = node.data;
|
|
29
|
+
var caret = range.startOffset;
|
|
30
|
+
var i = caret - 1;
|
|
31
|
+
if (i < 0) {
|
|
32
|
+
return {
|
|
33
|
+
active: false,
|
|
34
|
+
query: '',
|
|
35
|
+
atRunLength: 0,
|
|
36
|
+
anchor: null
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
while (i >= 0 && text[i] !== '@') i -= 1;
|
|
40
|
+
if (i < 0 || text[i] !== '@') {
|
|
41
|
+
return {
|
|
42
|
+
active: false,
|
|
43
|
+
query: '',
|
|
44
|
+
atRunLength: 0,
|
|
45
|
+
anchor: null
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
var runEnd = i;
|
|
49
|
+
while (i >= 0 && text[i] === '@') {
|
|
50
|
+
i -= 1;
|
|
51
|
+
}
|
|
52
|
+
var runStart = i + 1;
|
|
53
|
+
var atRunLength = runEnd - runStart + 1;
|
|
54
|
+
var prev = runStart > 0 ? text.charAt(runStart - 1) : '';
|
|
55
|
+
var isBoundary = !prev || /[\s([{]/.test(prev);
|
|
56
|
+
if (!isBoundary) {
|
|
57
|
+
return {
|
|
58
|
+
active: false,
|
|
59
|
+
query: '',
|
|
60
|
+
atRunLength: 0,
|
|
61
|
+
anchor: null
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
var query = text.slice(runEnd + 1, caret);
|
|
65
|
+
if (/\n|\r/.test(query)) {
|
|
66
|
+
return {
|
|
67
|
+
active: false,
|
|
68
|
+
query: '',
|
|
69
|
+
atRunLength: 0,
|
|
70
|
+
anchor: null
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
if (query.includes(' ')) {
|
|
74
|
+
return {
|
|
75
|
+
active: false,
|
|
76
|
+
query: '',
|
|
77
|
+
atRunLength: 0,
|
|
78
|
+
anchor: null
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
active: true,
|
|
83
|
+
query: query,
|
|
84
|
+
atRunLength: atRunLength,
|
|
85
|
+
anchor: {
|
|
86
|
+
node: node,
|
|
87
|
+
offset: runStart
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
export var useContextMentions = function useContextMentions() {
|
|
92
|
+
var editorRef = useRef(null);
|
|
93
|
+
var _useState = useState({
|
|
94
|
+
active: false,
|
|
95
|
+
query: '',
|
|
96
|
+
atRunLength: 0,
|
|
97
|
+
anchor: null
|
|
98
|
+
}),
|
|
99
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
100
|
+
trigger = _useState2[0],
|
|
101
|
+
setTrigger = _useState2[1];
|
|
102
|
+
var detectTrigger = useCallback(function () {
|
|
103
|
+
var selection = window.getSelection();
|
|
104
|
+
if (!selection || selection.rangeCount === 0 || !editorRef.current) {
|
|
105
|
+
return {
|
|
106
|
+
active: false,
|
|
107
|
+
query: '',
|
|
108
|
+
atRunLength: 0,
|
|
109
|
+
anchor: null
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
return detectMentionTrigger(editorRef.current, selection.getRangeAt(0));
|
|
113
|
+
}, []);
|
|
114
|
+
var updateTrigger = useCallback(function () {
|
|
115
|
+
var next = detectTrigger();
|
|
116
|
+
setTrigger(next);
|
|
117
|
+
return next;
|
|
118
|
+
}, [detectTrigger]);
|
|
119
|
+
var closeTrigger = useCallback(function () {
|
|
120
|
+
setTrigger({
|
|
121
|
+
active: false,
|
|
122
|
+
query: '',
|
|
123
|
+
atRunLength: 0,
|
|
124
|
+
anchor: null
|
|
125
|
+
});
|
|
126
|
+
}, []);
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Ajusta la cantidad de `@` del trigger activo sin perder el query actual.
|
|
130
|
+
* Ej.: `@@abc` -> `@abc` al cambiar de tab.
|
|
131
|
+
*/
|
|
132
|
+
var syncTriggerAtRunLength = useCallback(function (nextAtRunLength) {
|
|
133
|
+
var safeNext = Math.max(1, Math.floor(nextAtRunLength));
|
|
134
|
+
var current = detectTrigger();
|
|
135
|
+
if (!current.active || !current.anchor) return;
|
|
136
|
+
var _current$anchor = current.anchor,
|
|
137
|
+
node = _current$anchor.node,
|
|
138
|
+
offset = _current$anchor.offset;
|
|
139
|
+
if (node.nodeType !== Node.TEXT_NODE) return;
|
|
140
|
+
var textNode = node;
|
|
141
|
+
var full = textNode.data;
|
|
142
|
+
var queryLen = current.atRunLength + current.query.length;
|
|
143
|
+
var before = full.slice(0, offset);
|
|
144
|
+
var after = full.slice(offset + queryLen);
|
|
145
|
+
var nextRun = '@'.repeat(safeNext);
|
|
146
|
+
var nextValue = "".concat(before).concat(nextRun).concat(current.query).concat(after);
|
|
147
|
+
|
|
148
|
+
// eslint-disable-next-line no-param-reassign
|
|
149
|
+
textNode.data = nextValue;
|
|
150
|
+
var selection = window.getSelection();
|
|
151
|
+
if (selection) {
|
|
152
|
+
var range = document.createRange();
|
|
153
|
+
var caretOffset = before.length + nextRun.length + current.query.length;
|
|
154
|
+
range.setStart(textNode, Math.min(caretOffset, textNode.data.length));
|
|
155
|
+
range.collapse(true);
|
|
156
|
+
selection.removeAllRanges();
|
|
157
|
+
selection.addRange(range);
|
|
158
|
+
}
|
|
159
|
+
var updated = detectTrigger();
|
|
160
|
+
setTrigger(updated);
|
|
161
|
+
}, [detectTrigger]);
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Reemplaza el `@query` pendiente por un chip atómico con la mention.
|
|
165
|
+
* Requiere que el caller provea el DOM del chip (se inserta tal cual).
|
|
166
|
+
*/
|
|
167
|
+
var replaceTriggerWithChip = useCallback(function (chipNode, mention) {
|
|
168
|
+
var current = detectTrigger();
|
|
169
|
+
if (!current.active || !current.anchor) return;
|
|
170
|
+
var _current$anchor2 = current.anchor,
|
|
171
|
+
node = _current$anchor2.node,
|
|
172
|
+
offset = _current$anchor2.offset;
|
|
173
|
+
var textNode = node;
|
|
174
|
+
var full = textNode.data;
|
|
175
|
+
var queryLen = current.atRunLength + current.query.length;
|
|
176
|
+
var after = full.slice(offset + queryLen);
|
|
177
|
+
|
|
178
|
+
// Truncar el texto hasta antes del run de `@…`
|
|
179
|
+
// eslint-disable-next-line no-param-reassign
|
|
180
|
+
textNode.data = full.slice(0, offset);
|
|
181
|
+
|
|
182
|
+
// Insertar el chip justo después del nodo de texto
|
|
183
|
+
chipNode.setAttribute('data-mention', 'true');
|
|
184
|
+
chipNode.setAttribute('data-mention-id', String(mention.id));
|
|
185
|
+
chipNode.setAttribute('data-mention-type', mention.type);
|
|
186
|
+
chipNode.setAttribute('data-mention-label', mention.label);
|
|
187
|
+
chipNode.setAttribute('contenteditable', 'false');
|
|
188
|
+
var parent = textNode.parentNode;
|
|
189
|
+
if (!parent) return;
|
|
190
|
+
var spaceNode = document.createTextNode("\xA0".concat(after));
|
|
191
|
+
parent.insertBefore(chipNode, textNode.nextSibling);
|
|
192
|
+
parent.insertBefore(spaceNode, chipNode.nextSibling);
|
|
193
|
+
|
|
194
|
+
// Reposicionar caret después del chip (antes del espacio non-breaking)
|
|
195
|
+
var selection = window.getSelection();
|
|
196
|
+
if (selection) {
|
|
197
|
+
var range = document.createRange();
|
|
198
|
+
range.setStart(spaceNode, 1);
|
|
199
|
+
range.collapse(true);
|
|
200
|
+
selection.removeAllRanges();
|
|
201
|
+
selection.addRange(range);
|
|
202
|
+
}
|
|
203
|
+
closeTrigger();
|
|
204
|
+
}, [detectTrigger, closeTrigger]);
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Serializa el contenido: texto plano + lista de mentions en orden de aparición.
|
|
208
|
+
*/
|
|
209
|
+
var serialize = useCallback(function () {
|
|
210
|
+
var el = editorRef.current;
|
|
211
|
+
if (!el) return {
|
|
212
|
+
text: '',
|
|
213
|
+
mentions: []
|
|
214
|
+
};
|
|
215
|
+
var mentions = [];
|
|
216
|
+
var text = '';
|
|
217
|
+
var _walk = function walk(node) {
|
|
218
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
219
|
+
text += node.data;
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
223
|
+
var _elNode$dataset;
|
|
224
|
+
var elNode = node;
|
|
225
|
+
if (((_elNode$dataset = elNode.dataset) === null || _elNode$dataset === void 0 ? void 0 : _elNode$dataset.mention) === 'true') {
|
|
226
|
+
var _elNode$dataset$menti, _ref, _ref2, _elNode$dataset$menti2;
|
|
227
|
+
var mention = {
|
|
228
|
+
id: (_elNode$dataset$menti = elNode.dataset.mentionId) !== null && _elNode$dataset$menti !== void 0 ? _elNode$dataset$menti : '',
|
|
229
|
+
type: (_ref = elNode.dataset.mentionType) !== null && _ref !== void 0 ? _ref : 'user',
|
|
230
|
+
label: (_ref2 = (_elNode$dataset$menti2 = elNode.dataset.mentionLabel) !== null && _elNode$dataset$menti2 !== void 0 ? _elNode$dataset$menti2 : elNode.textContent) !== null && _ref2 !== void 0 ? _ref2 : ''
|
|
231
|
+
};
|
|
232
|
+
mentions.push(mention);
|
|
233
|
+
text += serializeMention(mention);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
if (elNode.tagName === 'BR') {
|
|
237
|
+
text += '\n';
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
elNode.childNodes.forEach(_walk);
|
|
241
|
+
if (elNode.tagName === 'DIV' || elNode.tagName === 'P') text += '\n';
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
el.childNodes.forEach(_walk);
|
|
245
|
+
return {
|
|
246
|
+
text: text.replace(/\n+$/, ''),
|
|
247
|
+
mentions: mentions
|
|
248
|
+
};
|
|
249
|
+
}, []);
|
|
250
|
+
var clear = useCallback(function () {
|
|
251
|
+
if (editorRef.current) editorRef.current.innerHTML = '';
|
|
252
|
+
closeTrigger();
|
|
253
|
+
}, [closeTrigger]);
|
|
254
|
+
var focus = useCallback(function () {
|
|
255
|
+
var _editorRef$current;
|
|
256
|
+
(_editorRef$current = editorRef.current) === null || _editorRef$current === void 0 || _editorRef$current.focus();
|
|
257
|
+
}, []);
|
|
258
|
+
return {
|
|
259
|
+
editorRef: editorRef,
|
|
260
|
+
trigger: trigger,
|
|
261
|
+
updateTrigger: updateTrigger,
|
|
262
|
+
closeTrigger: closeTrigger,
|
|
263
|
+
syncTriggerAtRunLength: syncTriggerAtRunLength,
|
|
264
|
+
replaceTriggerWithChip: replaceTriggerWithChip,
|
|
265
|
+
serialize: serialize,
|
|
266
|
+
clear: clear,
|
|
267
|
+
focus: focus
|
|
268
|
+
};
|
|
269
|
+
};
|
|
270
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVJlZiIsInVzZVN0YXRlIiwic2VyaWFsaXplTWVudGlvbiIsImRldGVjdE1lbnRpb25UcmlnZ2VyIiwiZWRpdG9yRWwiLCJyYW5nZSIsImNvbnRhaW5zIiwic3RhcnRDb250YWluZXIiLCJhY3RpdmUiLCJxdWVyeSIsImF0UnVuTGVuZ3RoIiwiYW5jaG9yIiwibm9kZSIsIm5vZGVUeXBlIiwiTm9kZSIsIlRFWFRfTk9ERSIsInRleHQiLCJkYXRhIiwiY2FyZXQiLCJzdGFydE9mZnNldCIsImkiLCJydW5FbmQiLCJydW5TdGFydCIsInByZXYiLCJjaGFyQXQiLCJpc0JvdW5kYXJ5IiwidGVzdCIsInNsaWNlIiwiaW5jbHVkZXMiLCJvZmZzZXQiLCJ1c2VDb250ZXh0TWVudGlvbnMiLCJlZGl0b3JSZWYiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJ0cmlnZ2VyIiwic2V0VHJpZ2dlciIsImRldGVjdFRyaWdnZXIiLCJzZWxlY3Rpb24iLCJ3aW5kb3ciLCJnZXRTZWxlY3Rpb24iLCJyYW5nZUNvdW50IiwiY3VycmVudCIsImdldFJhbmdlQXQiLCJ1cGRhdGVUcmlnZ2VyIiwibmV4dCIsImNsb3NlVHJpZ2dlciIsInN5bmNUcmlnZ2VyQXRSdW5MZW5ndGgiLCJuZXh0QXRSdW5MZW5ndGgiLCJzYWZlTmV4dCIsIk1hdGgiLCJtYXgiLCJmbG9vciIsIl9jdXJyZW50JGFuY2hvciIsInRleHROb2RlIiwiZnVsbCIsInF1ZXJ5TGVuIiwibGVuZ3RoIiwiYmVmb3JlIiwiYWZ0ZXIiLCJuZXh0UnVuIiwicmVwZWF0IiwibmV4dFZhbHVlIiwiY29uY2F0IiwiZG9jdW1lbnQiLCJjcmVhdGVSYW5nZSIsImNhcmV0T2Zmc2V0Iiwic2V0U3RhcnQiLCJtaW4iLCJjb2xsYXBzZSIsInJlbW92ZUFsbFJhbmdlcyIsImFkZFJhbmdlIiwidXBkYXRlZCIsInJlcGxhY2VUcmlnZ2VyV2l0aENoaXAiLCJjaGlwTm9kZSIsIm1lbnRpb24iLCJfY3VycmVudCRhbmNob3IyIiwic2V0QXR0cmlidXRlIiwiU3RyaW5nIiwiaWQiLCJ0eXBlIiwibGFiZWwiLCJwYXJlbnQiLCJwYXJlbnROb2RlIiwic3BhY2VOb2RlIiwiY3JlYXRlVGV4dE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJuZXh0U2libGluZyIsInNlcmlhbGl6ZSIsImVsIiwibWVudGlvbnMiLCJ3YWxrIiwiRUxFTUVOVF9OT0RFIiwiX2VsTm9kZSRkYXRhc2V0IiwiZWxOb2RlIiwiZGF0YXNldCIsIl9lbE5vZGUkZGF0YXNldCRtZW50aSIsIl9yZWYiLCJfcmVmMiIsIl9lbE5vZGUkZGF0YXNldCRtZW50aTIiLCJtZW50aW9uSWQiLCJtZW50aW9uVHlwZSIsIm1lbnRpb25MYWJlbCIsInRleHRDb250ZW50IiwicHVzaCIsInRhZ05hbWUiLCJjaGlsZE5vZGVzIiwiZm9yRWFjaCIsInJlcGxhY2UiLCJjbGVhciIsImlubmVySFRNTCIsImZvY3VzIiwiX2VkaXRvclJlZiRjdXJyZW50Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hvb2tzL3VzZUNvbnRleHRNZW50aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQ29udGV4dE1lbnRpb24gfSBmcm9tICcuLi90eXBlcy9jb250ZXh0TWVudGlvbidcbmltcG9ydCB7IHNlcmlhbGl6ZU1lbnRpb24gfSBmcm9tICcuLi91dGlscy9yZW5kZXJDb250ZXh0TWVudGlvbnMnXG5cbmV4cG9ydCB0eXBlIE1lbnRpb25UcmlnZ2VyU3RhdGUgPSB7XG4gIGFjdGl2ZTogYm9vbGVhblxuICBxdWVyeTogc3RyaW5nXG4gIC8qKiBDYW50aWRhZCBkZSBgQGAgY29uc2VjdXRpdm9zIGRlbCB0cmlnZ2VyIChgQGAg4oaSIDEsIGBAQGAg4oaSIDIpLiBNYXBlYSBhIGxhIHRhYiBlbiBvcmRlbi4gKi9cbiAgYXRSdW5MZW5ndGg6IG51bWJlclxuICAvKiogUG9zaWNpw7NuIGRlbCBwcmltZXIgYEBgIGRlbCBydW4gKHJlZW1wbGF6byBkZWwgY2hpcCkuICovXG4gIGFuY2hvcjogeyBub2RlOiBOb2RlOyBvZmZzZXQ6IG51bWJlciB9IHwgbnVsbFxufVxuXG4vKipcbiAqIEluc3BlY2Npb25hIGxhIHNlbGVjY2nDs24gYWN0dWFsLiBGb3JtYXRvOiBbbMOtbWl0ZSBkZSBwYWxhYnJhXSBAKyBxdWVyeSBoYXN0YSBlbCBjYXJldC5cbiAqIFBlcm1pdGUgZXNwYWNpb3Mgc2ltcGxlcyBkZW50cm8gZGVsIHF1ZXJ5IChwLiBlai4gXCJASnVhbiBQZXJlelwiKSB5IGNpZXJyYVxuICogZWwgdHJpZ2dlciBjdWFuZG8gZGV0ZWN0YSBkb3MgZXNwYWNpb3MgY29uc2VjdXRpdm9zLlxuICogTGEgdGFiIG9iamV0aXZvIGVzIGxhIHF1ZSBjb3JyZXNwb25kZSBhbCBuw7ptZXJvIGRlIGBAYCAoMSA9IHByaW1lcmEgdGFiIHZpc2libGUsIGV0Yy4pLlxuICovXG5jb25zdCBkZXRlY3RNZW50aW9uVHJpZ2dlciA9IChlZGl0b3JFbDogSFRNTEVsZW1lbnQgfCBudWxsLCByYW5nZTogUmFuZ2UpOiBNZW50aW9uVHJpZ2dlclN0YXRlID0+IHtcbiAgaWYgKCFlZGl0b3JFbCB8fCAhZWRpdG9yRWwuY29udGFpbnMocmFuZ2Uuc3RhcnRDb250YWluZXIpKSB7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCwgYW5jaG9yOiBudWxsIH1cbiAgfVxuICBjb25zdCBub2RlID0gcmFuZ2Uuc3RhcnRDb250YWluZXJcbiAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCwgYW5jaG9yOiBudWxsIH1cbiAgfVxuICBjb25zdCB0ZXh0ID0gKG5vZGUgYXMgVGV4dCkuZGF0YVxuICBjb25zdCBjYXJldCA9IHJhbmdlLnN0YXJ0T2Zmc2V0XG4gIGxldCBpID0gY2FyZXQgLSAxXG4gIGlmIChpIDwgMCkge1xuICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAsIGFuY2hvcjogbnVsbCB9XG4gIH1cblxuICB3aGlsZSAoaSA+PSAwICYmIHRleHRbaV0gIT09ICdAJykgaSAtPSAxXG4gIGlmIChpIDwgMCB8fCB0ZXh0W2ldICE9PSAnQCcpIHtcbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwLCBhbmNob3I6IG51bGwgfVxuICB9XG5cbiAgY29uc3QgcnVuRW5kID0gaVxuICB3aGlsZSAoaSA+PSAwICYmIHRleHRbaV0gPT09ICdAJykge1xuICAgIGkgLT0gMVxuICB9XG4gIGNvbnN0IHJ1blN0YXJ0ID0gaSArIDFcbiAgY29uc3QgYXRSdW5MZW5ndGggPSBydW5FbmQgLSBydW5TdGFydCArIDFcbiAgY29uc3QgcHJldiA9IHJ1blN0YXJ0ID4gMCA/IHRleHQuY2hhckF0KHJ1blN0YXJ0IC0gMSkgOiAnJ1xuICBjb25zdCBpc0JvdW5kYXJ5ID0gIXByZXYgfHwgL1tcXHMoW3tdLy50ZXN0KHByZXYpXG4gIGlmICghaXNCb3VuZGFyeSkge1xuICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAsIGFuY2hvcjogbnVsbCB9XG4gIH1cblxuICBjb25zdCBxdWVyeSA9IHRleHQuc2xpY2UocnVuRW5kICsgMSwgY2FyZXQpXG4gIGlmICgvXFxufFxcci8udGVzdChxdWVyeSkpIHtcbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwLCBhbmNob3I6IG51bGwgfVxuICB9XG4gIGlmIChxdWVyeS5pbmNsdWRlcygnICAnKSkge1xuICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAsIGFuY2hvcjogbnVsbCB9XG4gIH1cblxuICByZXR1cm4geyBhY3RpdmU6IHRydWUsIHF1ZXJ5LCBhdFJ1bkxlbmd0aCwgYW5jaG9yOiB7IG5vZGUsIG9mZnNldDogcnVuU3RhcnQgfSB9XG59XG5cbmV4cG9ydCBjb25zdCB1c2VDb250ZXh0TWVudGlvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IGVkaXRvclJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFt0cmlnZ2VyLCBzZXRUcmlnZ2VyXSA9IHVzZVN0YXRlPE1lbnRpb25UcmlnZ2VyU3RhdGU+KHtcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIHF1ZXJ5OiAnJyxcbiAgICBhdFJ1bkxlbmd0aDogMCxcbiAgICBhbmNob3I6IG51bGwsXG4gIH0pXG5cbiAgY29uc3QgZGV0ZWN0VHJpZ2dlciA9IHVzZUNhbGxiYWNrKCgpOiBNZW50aW9uVHJpZ2dlclN0YXRlID0+IHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCB8fCAhZWRpdG9yUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAsIGFuY2hvcjogbnVsbCB9XG4gICAgfVxuICAgIHJldHVybiBkZXRlY3RNZW50aW9uVHJpZ2dlcihlZGl0b3JSZWYuY3VycmVudCwgc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHVwZGF0ZVRyaWdnZXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgbmV4dCA9IGRldGVjdFRyaWdnZXIoKVxuICAgIHNldFRyaWdnZXIobmV4dClcbiAgICByZXR1cm4gbmV4dFxuICB9LCBbZGV0ZWN0VHJpZ2dlcl0pXG5cbiAgY29uc3QgY2xvc2VUcmlnZ2VyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldFRyaWdnZXIoeyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwLCBhbmNob3I6IG51bGwgfSlcbiAgfSwgW10pXG5cbiAgLyoqXG4gICAqIEFqdXN0YSBsYSBjYW50aWRhZCBkZSBgQGAgZGVsIHRyaWdnZXIgYWN0aXZvIHNpbiBwZXJkZXIgZWwgcXVlcnkgYWN0dWFsLlxuICAgKiBFai46IGBAQGFiY2AgLT4gYEBhYmNgIGFsIGNhbWJpYXIgZGUgdGFiLlxuICAgKi9cbiAgY29uc3Qgc3luY1RyaWdnZXJBdFJ1bkxlbmd0aCA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXh0QXRSdW5MZW5ndGg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3Qgc2FmZU5leHQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKG5leHRBdFJ1bkxlbmd0aCkpXG4gICAgICBjb25zdCBjdXJyZW50ID0gZGV0ZWN0VHJpZ2dlcigpXG4gICAgICBpZiAoIWN1cnJlbnQuYWN0aXZlIHx8ICFjdXJyZW50LmFuY2hvcikgcmV0dXJuXG5cbiAgICAgIGNvbnN0IHsgbm9kZSwgb2Zmc2V0IH0gPSBjdXJyZW50LmFuY2hvclxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSByZXR1cm5cbiAgICAgIGNvbnN0IHRleHROb2RlID0gbm9kZSBhcyBUZXh0XG4gICAgICBjb25zdCBmdWxsID0gdGV4dE5vZGUuZGF0YVxuICAgICAgY29uc3QgcXVlcnlMZW4gPSBjdXJyZW50LmF0UnVuTGVuZ3RoICsgY3VycmVudC5xdWVyeS5sZW5ndGhcbiAgICAgIGNvbnN0IGJlZm9yZSA9IGZ1bGwuc2xpY2UoMCwgb2Zmc2V0KVxuICAgICAgY29uc3QgYWZ0ZXIgPSBmdWxsLnNsaWNlKG9mZnNldCArIHF1ZXJ5TGVuKVxuICAgICAgY29uc3QgbmV4dFJ1biA9ICdAJy5yZXBlYXQoc2FmZU5leHQpXG4gICAgICBjb25zdCBuZXh0VmFsdWUgPSBgJHtiZWZvcmV9JHtuZXh0UnVufSR7Y3VycmVudC5xdWVyeX0ke2FmdGVyfWBcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICB0ZXh0Tm9kZS5kYXRhID0gbmV4dFZhbHVlXG5cbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKClcbiAgICAgICAgY29uc3QgY2FyZXRPZmZzZXQgPSBiZWZvcmUubGVuZ3RoICsgbmV4dFJ1bi5sZW5ndGggKyBjdXJyZW50LnF1ZXJ5Lmxlbmd0aFxuICAgICAgICByYW5nZS5zZXRTdGFydCh0ZXh0Tm9kZSwgTWF0aC5taW4oY2FyZXRPZmZzZXQsIHRleHROb2RlLmRhdGEubGVuZ3RoKSlcbiAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpXG4gICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgdXBkYXRlZCA9IGRldGVjdFRyaWdnZXIoKVxuICAgICAgc2V0VHJpZ2dlcih1cGRhdGVkKVxuICAgIH0sXG4gICAgW2RldGVjdFRyaWdnZXJdXG4gIClcblxuICAvKipcbiAgICogUmVlbXBsYXphIGVsIGBAcXVlcnlgIHBlbmRpZW50ZSBwb3IgdW4gY2hpcCBhdMOzbWljbyBjb24gbGEgbWVudGlvbi5cbiAgICogUmVxdWllcmUgcXVlIGVsIGNhbGxlciBwcm92ZWEgZWwgRE9NIGRlbCBjaGlwIChzZSBpbnNlcnRhIHRhbCBjdWFsKS5cbiAgICovXG4gIGNvbnN0IHJlcGxhY2VUcmlnZ2VyV2l0aENoaXAgPSB1c2VDYWxsYmFjayhcbiAgICAoY2hpcE5vZGU6IEhUTUxFbGVtZW50LCBtZW50aW9uOiBDb250ZXh0TWVudGlvbikgPT4ge1xuICAgICAgY29uc3QgY3VycmVudCA9IGRldGVjdFRyaWdnZXIoKVxuICAgICAgaWYgKCFjdXJyZW50LmFjdGl2ZSB8fCAhY3VycmVudC5hbmNob3IpIHJldHVyblxuXG4gICAgICBjb25zdCB7IG5vZGUsIG9mZnNldCB9ID0gY3VycmVudC5hbmNob3JcbiAgICAgIGNvbnN0IHRleHROb2RlID0gbm9kZSBhcyBUZXh0XG4gICAgICBjb25zdCBmdWxsID0gdGV4dE5vZGUuZGF0YVxuICAgICAgY29uc3QgcXVlcnlMZW4gPSBjdXJyZW50LmF0UnVuTGVuZ3RoICsgY3VycmVudC5xdWVyeS5sZW5ndGhcbiAgICAgIGNvbnN0IGFmdGVyID0gZnVsbC5zbGljZShvZmZzZXQgKyBxdWVyeUxlbilcblxuICAgICAgLy8gVHJ1bmNhciBlbCB0ZXh0byBoYXN0YSBhbnRlcyBkZWwgcnVuIGRlIGBA4oCmYFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICB0ZXh0Tm9kZS5kYXRhID0gZnVsbC5zbGljZSgwLCBvZmZzZXQpXG5cbiAgICAgIC8vIEluc2VydGFyIGVsIGNoaXAganVzdG8gZGVzcHXDqXMgZGVsIG5vZG8gZGUgdGV4dG9cbiAgICAgIGNoaXBOb2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1tZW50aW9uJywgJ3RydWUnKVxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdkYXRhLW1lbnRpb24taWQnLCBTdHJpbmcobWVudGlvbi5pZCkpXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVudGlvbi10eXBlJywgbWVudGlvbi50eXBlKVxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdkYXRhLW1lbnRpb24tbGFiZWwnLCBtZW50aW9uLmxhYmVsKVxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCAnZmFsc2UnKVxuXG4gICAgICBjb25zdCBwYXJlbnQgPSB0ZXh0Tm9kZS5wYXJlbnROb2RlXG4gICAgICBpZiAoIXBhcmVudCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IHNwYWNlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGBcXHUwMGEwJHthZnRlcn1gKVxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlwTm9kZSwgdGV4dE5vZGUubmV4dFNpYmxpbmcpXG4gICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHNwYWNlTm9kZSwgY2hpcE5vZGUubmV4dFNpYmxpbmcpXG5cbiAgICAgIC8vIFJlcG9zaWNpb25hciBjYXJldCBkZXNwdcOpcyBkZWwgY2hpcCAoYW50ZXMgZGVsIGVzcGFjaW8gbm9uLWJyZWFraW5nKVxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgICByYW5nZS5zZXRTdGFydChzcGFjZU5vZGUsIDEpXG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpXG4gICAgICB9XG5cbiAgICAgIGNsb3NlVHJpZ2dlcigpXG4gICAgfSxcbiAgICBbZGV0ZWN0VHJpZ2dlciwgY2xvc2VUcmlnZ2VyXVxuICApXG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6YSBlbCBjb250ZW5pZG86IHRleHRvIHBsYW5vICsgbGlzdGEgZGUgbWVudGlvbnMgZW4gb3JkZW4gZGUgYXBhcmljacOzbi5cbiAgICovXG4gIGNvbnN0IHNlcmlhbGl6ZSA9IHVzZUNhbGxiYWNrKCgpOiB7IHRleHQ6IHN0cmluZzsgbWVudGlvbnM6IENvbnRleHRNZW50aW9uW10gfSA9PiB7XG4gICAgY29uc3QgZWwgPSBlZGl0b3JSZWYuY3VycmVudFxuICAgIGlmICghZWwpIHJldHVybiB7IHRleHQ6ICcnLCBtZW50aW9uczogW10gfVxuICAgIGNvbnN0IG1lbnRpb25zOiBDb250ZXh0TWVudGlvbltdID0gW11cbiAgICBsZXQgdGV4dCA9ICcnXG5cbiAgICBjb25zdCB3YWxrID0gKG5vZGU6IE5vZGUpID0+IHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICB0ZXh0ICs9IChub2RlIGFzIFRleHQpLmRhdGFcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgY29uc3QgZWxOb2RlID0gbm9kZSBhcyBIVE1MRWxlbWVudFxuICAgICAgICBpZiAoZWxOb2RlLmRhdGFzZXQ/Lm1lbnRpb24gPT09ICd0cnVlJykge1xuICAgICAgICAgIGNvbnN0IG1lbnRpb246IENvbnRleHRNZW50aW9uID0ge1xuICAgICAgICAgICAgaWQ6IGVsTm9kZS5kYXRhc2V0Lm1lbnRpb25JZCA/PyAnJyxcbiAgICAgICAgICAgIHR5cGU6IChlbE5vZGUuZGF0YXNldC5tZW50aW9uVHlwZSBhcyBDb250ZXh0TWVudGlvblsndHlwZSddKSA/PyAndXNlcicsXG4gICAgICAgICAgICBsYWJlbDogZWxOb2RlLmRhdGFzZXQubWVudGlvbkxhYmVsID8/IGVsTm9kZS50ZXh0Q29udGVudCA/PyAnJyxcbiAgICAgICAgICB9XG4gICAgICAgICAgbWVudGlvbnMucHVzaChtZW50aW9uKVxuICAgICAgICAgIHRleHQgKz0gc2VyaWFsaXplTWVudGlvbihtZW50aW9uKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChlbE5vZGUudGFnTmFtZSA9PT0gJ0JSJykge1xuICAgICAgICAgIHRleHQgKz0gJ1xcbidcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBlbE5vZGUuY2hpbGROb2Rlcy5mb3JFYWNoKHdhbGspXG4gICAgICAgIGlmIChlbE5vZGUudGFnTmFtZSA9PT0gJ0RJVicgfHwgZWxOb2RlLnRhZ05hbWUgPT09ICdQJykgdGV4dCArPSAnXFxuJ1xuICAgICAgfVxuICAgIH1cblxuICAgIGVsLmNoaWxkTm9kZXMuZm9yRWFjaCh3YWxrKVxuICAgIHJldHVybiB7IHRleHQ6IHRleHQucmVwbGFjZSgvXFxuKyQvLCAnJyksIG1lbnRpb25zIH1cbiAgfSwgW10pXG5cbiAgY29uc3QgY2xlYXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKGVkaXRvclJlZi5jdXJyZW50KSBlZGl0b3JSZWYuY3VycmVudC5pbm5lckhUTUwgPSAnJ1xuICAgIGNsb3NlVHJpZ2dlcigpXG4gIH0sIFtjbG9zZVRyaWdnZXJdKVxuXG4gIGNvbnN0IGZvY3VzID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGVkaXRvclJlZi5jdXJyZW50Py5mb2N1cygpXG4gIH0sIFtdKVxuXG4gIHJldHVybiB7XG4gICAgZWRpdG9yUmVmLFxuICAgIHRyaWdnZXIsXG4gICAgdXBkYXRlVHJpZ2dlcixcbiAgICBjbG9zZVRyaWdnZXIsXG4gICAgc3luY1RyaWdnZXJBdFJ1bkxlbmd0aCxcbiAgICByZXBsYWNlVHJpZ2dlcldpdGhDaGlwLFxuICAgIHNlcmlhbGl6ZSxcbiAgICBjbGVhcixcbiAgICBmb2N1cyxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsU0FBU0EsV0FBVyxFQUFFQyxNQUFNLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBRXJELFNBQVNDLGdCQUFnQixRQUFRLGdDQUFnQztBQVdqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNQyxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQW9CQSxDQUFJQyxRQUE0QixFQUFFQyxLQUFZLEVBQTBCO0VBQ2hHLElBQUksQ0FBQ0QsUUFBUSxJQUFJLENBQUNBLFFBQVEsQ0FBQ0UsUUFBUSxDQUFDRCxLQUFLLENBQUNFLGNBQWMsQ0FBQyxFQUFFO0lBQ3pELE9BQU87TUFBRUMsTUFBTSxFQUFFLEtBQUs7TUFBRUMsS0FBSyxFQUFFLEVBQUU7TUFBRUMsV0FB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
|