@projectcor/maia-components 2.11.78-0 → 2.11.78-10
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/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +4 -2
- package/lib/components/atoms/icons/ActionCalendarIcon.js +112 -0
- package/lib/components/atoms/icons/ActionChatIcon.js +71 -0
- package/lib/components/atoms/icons/ActionTimeBackIcon.js +112 -0
- package/lib/components/molecules/ChatAIContent/ChatAIContent.skeleton.js +3 -3
- package/lib/components/molecules/ChatAIHome/ChatAIHome.js +42 -18
- package/lib/components/molecules/ChatAIHome/styles.js +67 -35
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +20 -14
- package/lib/components/molecules/Sidebar/Sidebar.js +8 -23
- package/lib/components/molecules/Sidebar/Sidebar.styles.js +6 -10
- package/lib/components/organisms/ChatAI/ChatAI.js +2 -10
- package/lib/constants/maiaTaskPanelAccess.js +2 -2
- package/lib/constants/plannerSyncEvents.js +16 -0
- package/lib/context/global-context.js +1 -1
- package/lib/dev/DevChatAI.js +2 -2
- package/lib/hooks/useChatManager/useChatManager.js +465 -445
- package/lib/hooks/useChatMessages/useChatMessages.js +3 -20
- package/lib/hooks/useFrequentlyUsedActions.js +4 -2
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +1 -1
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +496 -139
- package/lib/hooks/useProjectSummaryConfig.js +1 -1
- package/lib/hooks/useStreamingMessage/index.js +3 -2
- package/lib/hooks/useStreamingMessage/streamingStore.js +69 -0
- package/lib/hooks/useStreamingMessage/useStreamingMessage.js +17 -13
- package/lib/lang/br/index.js +8 -7
- package/lib/lang/en/index.js +8 -7
- package/lib/lang/es/index.js +8 -7
- package/lib/lang/fr/index.js +9 -9
- package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
- package/lib/services/maia/Agents/getAgents.js +2 -2
- package/lib/services/maia/Chats/getChatsByUserId.js +1 -1
- package/lib/store/chatsStore.types.js +1 -1
- package/lib/store/useChatsStore.js +1 -3
- package/lib/types/Action.js +1 -1
- package/lib/utils/actionIconMap.js +8 -2
- package/lib/utils/streamActivityMessages.js +2 -1
- package/package.json +1 -1
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.js +0 -17
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.styles.js +0 -15
- package/lib/components/atoms/SessionGeneratingDot/index.js +0 -2
- package/lib/components/atoms/SessionUnreadDot/SessionUnreadDot.js +0 -12
- package/lib/components/atoms/SessionUnreadDot/SessionUnreadDot.styles.js +0 -8
- package/lib/components/atoms/SessionUnreadDot/index.js +0 -2
- package/lib/store/sessions/activeView.js +0 -22
- package/lib/store/sessions/index.js +0 -10
- package/lib/store/sessions/sessionHitlContext.js +0 -15
- package/lib/store/sessions/sessionNotificationSound.js +0 -57
- package/lib/store/sessions/sessionNotifications.js +0 -111
- package/lib/store/sessions/sessionNotifications.types.js +0 -2
- package/lib/store/sessions/sessionStreamManager.js +0 -576
- package/lib/store/sessions/sessionStreamingText.js +0 -80
- package/lib/store/sessions/sessionUnreadPersistence.js +0 -49
- package/lib/store/sessions/sessions.types.js +0 -29
- package/lib/store/sessions/useSessionMeta.js +0 -39
- package/lib/store/sessions/useSessionStreamingText.js +0 -18
- package/lib/store/sessions/useSessionsStore.js +0 -195
|
@@ -26,15 +26,12 @@ import { formatQuickActionMessageForDisplay } from '../../utils/formatQuickActio
|
|
|
26
26
|
import { useProjects } from '../useProjects';
|
|
27
27
|
import { useTabTaskDefault } from '../useTabTaskDefault';
|
|
28
28
|
import { TASK_URL_REGEX_PATTERN } from '../../constants/taskUrls';
|
|
29
|
+
import { dispatchMaiaHoursCharged, isHoursChargeTool } from '../../constants/plannerSyncEvents';
|
|
29
30
|
import { fetchAgentDetail } from '../../services/maia/Agents/fetchAgentDetail';
|
|
30
31
|
import { buildHitlActionTypeList, getHitlAnalyticsAgentType } from '../../utils/hitlAnalytics';
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
import { sessionStreamManager, MAX_CONCURRENT_STREAMS } from '../../store/sessions/sessionStreamManager';
|
|
35
|
-
import { activeView } from '../../store/sessions/activeView';
|
|
36
|
-
import { notifySessionFinishedInBackground } from '../../store/sessions/sessionNotifications';
|
|
37
|
-
import { isStreamingPlaceholderMessageId } from '../../utils/streamActivityMessages';
|
|
32
|
+
import { getThinkingLoadingMessage, getWritingStreamActivity, resolveHitlNodeStreamActivity, resolveInitialHitlStreamActivity } from '../../utils/streamActivityMessages';
|
|
33
|
+
import { streamingStore } from '../useStreamingMessage';
|
|
34
|
+
import { isCompleteLikeSsePayload, mergeStreamChunk } from '../../utils/sseStreamContent';
|
|
38
35
|
var normalizeSendMessageArgs = function normalizeSendMessageArgs(attachmentsOrOptions) {
|
|
39
36
|
var _options$attachments;
|
|
40
37
|
if (Array.isArray(attachmentsOrOptions)) {
|
|
@@ -232,56 +229,136 @@ var useStableCallbacks = function useStableCallbacks(authUser) {
|
|
|
232
229
|
currentUser: currentUser.current
|
|
233
230
|
};
|
|
234
231
|
};
|
|
235
|
-
var
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
232
|
+
var parseSSELine = function parseSSELine(line) {
|
|
233
|
+
if (!line.trim()) return null;
|
|
234
|
+
var _line$split = line.split('\n'),
|
|
235
|
+
_line$split2 = _slicedToArray(_line$split, 2),
|
|
236
|
+
eventLine = _line$split2[0],
|
|
237
|
+
dataLine = _line$split2[1];
|
|
238
|
+
if (!eventLine || !dataLine) return null;
|
|
239
|
+
var eventType = eventLine.replace('event: ', '').trim();
|
|
240
|
+
var dataStr = dataLine.replace('data: ', '').trim();
|
|
241
|
+
try {
|
|
242
|
+
var data = JSON.parse(dataStr);
|
|
243
243
|
return {
|
|
244
|
-
|
|
245
|
-
|
|
244
|
+
eventType: eventType,
|
|
245
|
+
data: data
|
|
246
246
|
};
|
|
247
|
+
} catch (parseError) {
|
|
248
|
+
console.error('Error parsing SSE data:', parseError, dataStr);
|
|
249
|
+
return null;
|
|
247
250
|
}
|
|
248
|
-
var _useSessionsStore$get = useSessionsStore.getState(),
|
|
249
|
-
messages = _useSessionsStore$get.messages;
|
|
250
|
-
var sessionEntry = Object.entries(messages).find(function (_ref2) {
|
|
251
|
-
var _ref3 = _slicedToArray(_ref2, 2),
|
|
252
|
-
sessionMessages = _ref3[1];
|
|
253
|
-
return sessionMessages.some(function (message) {
|
|
254
|
-
var _message$approval2;
|
|
255
|
-
return (_message$approval2 = message.approval) === null || _message$approval2 === void 0 || (_message$approval2 = _message$approval2.pending_actions) === null || _message$approval2 === void 0 ? void 0 : _message$approval2.some(function (action) {
|
|
256
|
-
return threadIds.includes(action.thread_id);
|
|
257
|
-
});
|
|
258
|
-
});
|
|
259
|
-
});
|
|
260
|
-
if (sessionEntry) {
|
|
261
|
-
var _sessionEntry = _slicedToArray(sessionEntry, 2),
|
|
262
|
-
sessionId = _sessionEntry[0],
|
|
263
|
-
sessionMessages = _sessionEntry[1];
|
|
264
|
-
var found = sessionMessages.find(function (message) {
|
|
265
|
-
var _message$approval3;
|
|
266
|
-
return (_message$approval3 = message.approval) === null || _message$approval3 === void 0 || (_message$approval3 = _message$approval3.pending_actions) === null || _message$approval3 === void 0 ? void 0 : _message$approval3.some(function (action) {
|
|
267
|
-
return threadIds.includes(action.thread_id);
|
|
268
|
-
});
|
|
269
|
-
});
|
|
270
|
-
if (found !== null && found !== void 0 && found.approval) {
|
|
271
|
-
return {
|
|
272
|
-
message: found,
|
|
273
|
-
sessionId: found.approval.session_id || sessionId
|
|
274
|
-
};
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
return null;
|
|
278
251
|
};
|
|
279
|
-
|
|
280
|
-
var
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
252
|
+
var processSSEStream = /*#__PURE__*/function () {
|
|
253
|
+
var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(response, threadId, callbacks) {
|
|
254
|
+
var _response$body;
|
|
255
|
+
var reader, decoder, buffer, accumulatedContent, isStreamComplete, handleLine, _yield$reader$read, done, value, lines, i;
|
|
256
|
+
return _regeneratorRuntime.wrap(function (_context) {
|
|
257
|
+
while (1) switch (_context.prev = _context.next) {
|
|
258
|
+
case 0:
|
|
259
|
+
handleLine = function _handleLine(line) {
|
|
260
|
+
var parsed = parseSSELine(line);
|
|
261
|
+
if (!parsed) return;
|
|
262
|
+
var eventType = parsed.eventType,
|
|
263
|
+
data = parsed.data;
|
|
264
|
+
var eventData = data;
|
|
265
|
+
if (eventType === 'thinking') {
|
|
266
|
+
callbacks.onThinking();
|
|
267
|
+
} else if (eventType === 'token') {
|
|
268
|
+
var content = typeof eventData.content === 'string' ? eventData.content : '';
|
|
269
|
+
accumulatedContent = mergeStreamChunk(accumulatedContent, content);
|
|
270
|
+
callbacks.onToken(accumulatedContent);
|
|
271
|
+
} else if (eventType === 'content') {
|
|
272
|
+
var _content = typeof eventData.content === 'string' ? eventData.content : '';
|
|
273
|
+
accumulatedContent = mergeStreamChunk(accumulatedContent, _content);
|
|
274
|
+
callbacks.onToken(accumulatedContent);
|
|
275
|
+
if (isCompleteLikeSsePayload(eventData)) {
|
|
276
|
+
var _eventData$agent_id;
|
|
277
|
+
var finalContent = _content || accumulatedContent;
|
|
278
|
+
var sources = eventData.sources || null;
|
|
279
|
+
var memorySessionId = eventData.memory_session_id || '';
|
|
280
|
+
var attachments = Array.isArray(eventData.attachments) ? eventData.attachments : null;
|
|
281
|
+
var suggestions = Array.isArray(eventData.suggest_reply) ? eventData.suggest_reply : Array.isArray(eventData.suggestions) ? eventData.suggestions : null;
|
|
282
|
+
var agentIdRaw = (_eventData$agent_id = eventData.agent_id) !== null && _eventData$agent_id !== void 0 ? _eventData$agent_id : eventData.agentId;
|
|
283
|
+
var completedAgentId = agentIdRaw != null && String(agentIdRaw).trim() !== '' ? String(agentIdRaw).trim() : null;
|
|
284
|
+
callbacks.onComplete(finalContent, sources, memorySessionId, threadId, attachments, suggestions, completedAgentId);
|
|
285
|
+
}
|
|
286
|
+
} else if (eventType === 'node') {
|
|
287
|
+
if (eventData.message && typeof eventData.message === 'string') {
|
|
288
|
+
callbacks.onNode(eventData.message, threadId);
|
|
289
|
+
}
|
|
290
|
+
} else if (eventType === 'complete') {
|
|
291
|
+
var _eventData$agent_id2;
|
|
292
|
+
var _finalContent = eventData.content || accumulatedContent;
|
|
293
|
+
var _sources = eventData.sources || null;
|
|
294
|
+
var _memorySessionId = eventData.memory_session_id || '';
|
|
295
|
+
var _attachments = Array.isArray(eventData.attachments) ? eventData.attachments : null;
|
|
296
|
+
var _suggestions = Array.isArray(eventData.suggest_reply) ? eventData.suggest_reply : Array.isArray(eventData.suggestions) ? eventData.suggestions : null;
|
|
297
|
+
var _agentIdRaw = (_eventData$agent_id2 = eventData.agent_id) !== null && _eventData$agent_id2 !== void 0 ? _eventData$agent_id2 : eventData.agentId;
|
|
298
|
+
var _completedAgentId = _agentIdRaw != null && String(_agentIdRaw).trim() !== '' ? String(_agentIdRaw).trim() : null;
|
|
299
|
+
callbacks.onComplete(_finalContent, _sources, _memorySessionId, threadId, _attachments, _suggestions, _completedAgentId);
|
|
300
|
+
} else if (eventType === 'approval_required') {
|
|
301
|
+
var _callbacks$onApproval;
|
|
302
|
+
(_callbacks$onApproval = callbacks.onApprovalRequired) === null || _callbacks$onApproval === void 0 || _callbacks$onApproval.call(callbacks, eventData, accumulatedContent, threadId);
|
|
303
|
+
} else if (eventType === 'error') {
|
|
304
|
+
callbacks.onError(eventData.error, threadId);
|
|
305
|
+
}
|
|
306
|
+
};
|
|
307
|
+
reader = (_response$body = response.body) === null || _response$body === void 0 ? void 0 : _response$body.getReader();
|
|
308
|
+
if (reader) {
|
|
309
|
+
_context.next = 1;
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
throw new Error('No reader available');
|
|
313
|
+
case 1:
|
|
314
|
+
decoder = new TextDecoder();
|
|
315
|
+
buffer = '';
|
|
316
|
+
accumulatedContent = '';
|
|
317
|
+
isStreamComplete = false;
|
|
318
|
+
case 2:
|
|
319
|
+
if (isStreamComplete) {
|
|
320
|
+
_context.next = 5;
|
|
321
|
+
break;
|
|
322
|
+
}
|
|
323
|
+
_context.next = 3;
|
|
324
|
+
return reader.read();
|
|
325
|
+
case 3:
|
|
326
|
+
_yield$reader$read = _context.sent;
|
|
327
|
+
done = _yield$reader$read.done;
|
|
328
|
+
value = _yield$reader$read.value;
|
|
329
|
+
if (!done) {
|
|
330
|
+
_context.next = 4;
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
isStreamComplete = true;
|
|
334
|
+
return _context.abrupt("continue", 5);
|
|
335
|
+
case 4:
|
|
336
|
+
buffer += decoder.decode(value, {
|
|
337
|
+
stream: true
|
|
338
|
+
});
|
|
339
|
+
lines = buffer.split('\n\n');
|
|
340
|
+
buffer = lines.pop() || '';
|
|
341
|
+
for (i = 0; i < lines.length; i += 1) {
|
|
342
|
+
handleLine(lines[i]);
|
|
343
|
+
}
|
|
344
|
+
_context.next = 2;
|
|
345
|
+
break;
|
|
346
|
+
case 5:
|
|
347
|
+
case "end":
|
|
348
|
+
return _context.stop();
|
|
349
|
+
}
|
|
350
|
+
}, _callee);
|
|
351
|
+
}));
|
|
352
|
+
return function processSSEStream(_x, _x2, _x3) {
|
|
353
|
+
return _ref2.apply(this, arguments);
|
|
354
|
+
};
|
|
355
|
+
}();
|
|
356
|
+
export var useChatManager = function useChatManager(_ref3) {
|
|
357
|
+
var initialChatId = _ref3.chatId,
|
|
358
|
+
userInitialMessage = _ref3.userInitialMessage,
|
|
359
|
+
onError = _ref3.onError,
|
|
360
|
+
_ref3$agents = _ref3.agents,
|
|
361
|
+
agents = _ref3$agents === void 0 ? [] : _ref3$agents;
|
|
285
362
|
var _useT = useT(),
|
|
286
363
|
t = _useT.t;
|
|
287
364
|
var authUser = useUser();
|
|
@@ -340,6 +417,11 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
340
417
|
* que puedan llegar antes de que el abort se complete.
|
|
341
418
|
*/
|
|
342
419
|
var activeStreamChatIdRef = useRef(null);
|
|
420
|
+
/** Setter indirecto para abortar el stream antes de que el hook de
|
|
421
|
+
* orquestador esté inicializado (se linkea más abajo). */
|
|
422
|
+
var abortStreamSilentlyRef = useRef(function () {
|
|
423
|
+
return undefined;
|
|
424
|
+
});
|
|
343
425
|
var clearStreamUiRef = useRef(function () {
|
|
344
426
|
return undefined;
|
|
345
427
|
});
|
|
@@ -347,19 +429,10 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
347
429
|
_useState2 = _slicedToArray(_useState, 2),
|
|
348
430
|
activeLoadings = _useState2[0],
|
|
349
431
|
setActiveLoadings = _useState2[1];
|
|
350
|
-
|
|
351
|
-
* Sesión actualmente visible. Se mantiene en state (no solo en ref) para que
|
|
352
|
-
* el motor de streaming pueda leer reactivamente los flags de ESTA sesión
|
|
353
|
-
* desde el store, mientras otras siguen generando en background.
|
|
354
|
-
*/
|
|
355
|
-
var _useState3 = useState(currentChatId.current),
|
|
432
|
+
var _useState3 = useState(false),
|
|
356
433
|
_useState4 = _slicedToArray(_useState3, 2),
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
/** True mientras esta instancia esté montada (evita setState tras desmontar). */
|
|
360
|
-
var isMountedRef = useRef(true);
|
|
361
|
-
/** Evita reconciliar dos veces el mismo estado terminal de una sesión. */
|
|
362
|
-
var lastHandledTerminalRef = useRef(null);
|
|
434
|
+
isContinuingStream = _useState4[0],
|
|
435
|
+
setIsContinuingStream = _useState4[1];
|
|
363
436
|
var isWebSearchActiveRef = useRef(isWebSearchActive);
|
|
364
437
|
var isDeepSearchActiveRef = useRef(isDeepSearchActive);
|
|
365
438
|
/** Evita closures obsoletas cuando el footer conserva sendMessage entre renders. */
|
|
@@ -394,69 +467,6 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
394
467
|
removeMessage = _useChatMessages.removeMessage,
|
|
395
468
|
handleScroll = _useChatMessages.handleScroll;
|
|
396
469
|
messagesRef.current = messages;
|
|
397
|
-
|
|
398
|
-
/**
|
|
399
|
-
* Escribe un mensaje en el store por-sesión y, si la sesión es la activa,
|
|
400
|
-
* también en la vista local. Permite que sesiones en background acumulen su
|
|
401
|
-
* resultado sin pisar el chat que el usuario está mirando.
|
|
402
|
-
*/
|
|
403
|
-
var commitToSession = useCallback(function (sessionId, message) {
|
|
404
|
-
useSessionsStore.getState().addMessage(sessionId, message);
|
|
405
|
-
if (isMountedRef.current && activeView.is(sessionId)) {
|
|
406
|
-
addMessage(message);
|
|
407
|
-
}
|
|
408
|
-
}, [addMessage]);
|
|
409
|
-
var dropFromSession = useCallback(function (sessionId, messageId) {
|
|
410
|
-
useSessionsStore.getState().removeMessage(sessionId, messageId);
|
|
411
|
-
if (isMountedRef.current && activeView.is(sessionId)) {
|
|
412
|
-
removeMessage(messageId);
|
|
413
|
-
}
|
|
414
|
-
}, [removeMessage]);
|
|
415
|
-
|
|
416
|
-
/** Limpia el tail en vuelo de una sesión (tras terminar; el backend pasa a ser fuente). */
|
|
417
|
-
var clearSessionTail = useCallback(function (sessionId) {
|
|
418
|
-
useSessionsStore.getState().setMessages(sessionId, []);
|
|
419
|
-
}, []);
|
|
420
|
-
|
|
421
|
-
// Registrar la sesión visible en el tracker global para que los callbacks del
|
|
422
|
-
// motor (que pueden pertenecer a una instancia ya desmontada) sepan cuál es la
|
|
423
|
-
// sesión activa actual.
|
|
424
|
-
useEffect(function () {
|
|
425
|
-
activeView.set(activeSessionId);
|
|
426
|
-
}, [activeSessionId]);
|
|
427
|
-
useEffect(function () {
|
|
428
|
-
isMountedRef.current = true;
|
|
429
|
-
return function () {
|
|
430
|
-
isMountedRef.current = false;
|
|
431
|
-
if (activeView.is(currentChatId.current)) {
|
|
432
|
-
activeView.set(null);
|
|
433
|
-
}
|
|
434
|
-
};
|
|
435
|
-
}, []);
|
|
436
|
-
|
|
437
|
-
// Reconciliación: si la sesión activa termina (complete/error/cancelled) pero el
|
|
438
|
-
// store por-sesión todavía tiene un placeholder de streaming, refrescamos desde
|
|
439
|
-
// el backend. Usamos el store (no messagesRef): handleStreamFinish limpia el
|
|
440
|
-
// placeholder ahí de forma síncrona; messagesRef puede quedar stale un render
|
|
441
|
-
// porque setStatus (Zustand) y removeMessage (React) no batchan juntos.
|
|
442
|
-
var activeSessionMeta = useSessionMeta(activeSessionId);
|
|
443
|
-
useEffect(function () {
|
|
444
|
-
var _activeSessionMeta$fi;
|
|
445
|
-
var status = activeSessionMeta === null || activeSessionMeta === void 0 ? void 0 : activeSessionMeta.status;
|
|
446
|
-
if (!status) return;
|
|
447
|
-
var isTerminal = status === 'complete' || status === 'error' || status === 'cancelled';
|
|
448
|
-
if (!isTerminal) return;
|
|
449
|
-
var key = "".concat(activeSessionId, ":").concat(status, ":").concat((_activeSessionMeta$fi = activeSessionMeta === null || activeSessionMeta === void 0 ? void 0 : activeSessionMeta.finishedAt) !== null && _activeSessionMeta$fi !== void 0 ? _activeSessionMeta$fi : '');
|
|
450
|
-
if (lastHandledTerminalRef.current === key) return;
|
|
451
|
-
lastHandledTerminalRef.current = key;
|
|
452
|
-
var tail = useSessionsStore.getState().getMessages(activeSessionId);
|
|
453
|
-
var hasStalePlaceholder = tail.some(function (msg) {
|
|
454
|
-
return isStreamingPlaceholderMessageId(msg.id);
|
|
455
|
-
});
|
|
456
|
-
if (hasStalePlaceholder) {
|
|
457
|
-
loadMessages();
|
|
458
|
-
}
|
|
459
|
-
}, [activeSessionMeta === null || activeSessionMeta === void 0 ? void 0 : activeSessionMeta.status, activeSessionMeta === null || activeSessionMeta === void 0 ? void 0 : activeSessionMeta.finishedAt, activeSessionId, loadMessages]);
|
|
460
470
|
useEffect(function () {
|
|
461
471
|
var customEvent = new CustomEvent('chat-loading-messages-changed', {
|
|
462
472
|
detail: {
|
|
@@ -467,10 +477,9 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
467
477
|
}, [loadingMessages]);
|
|
468
478
|
useEffect(function () {
|
|
469
479
|
if (initialChatId && initialChatId !== currentChatId.current) {
|
|
470
|
-
//
|
|
471
|
-
//
|
|
472
|
-
|
|
473
|
-
// ESA sesión (store), no a la nueva.
|
|
480
|
+
// Si hay un stream en curso, abortarlo silenciosamente para que los
|
|
481
|
+
// tokens residuales no se escriban en el chat nuevo.
|
|
482
|
+
abortStreamSilentlyRef.current();
|
|
474
483
|
|
|
475
484
|
// Limpiar contexto global al cambiar de conversación
|
|
476
485
|
setProject(null);
|
|
@@ -478,39 +487,29 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
478
487
|
setChipsProject(null);
|
|
479
488
|
setTask(null);
|
|
480
489
|
currentChatId.current = initialChatId;
|
|
481
|
-
setActiveSessionId(initialChatId);
|
|
482
|
-
useSessionsStore.getState().markUnread(initialChatId, false);
|
|
483
490
|
currentMessageId.current = uuidv4();
|
|
484
491
|
currentUserQuestion.current = null;
|
|
485
492
|
reportedEvent.current = false;
|
|
486
|
-
|
|
487
|
-
// a la que entramos sigue generando en background, queda bloqueada; si no,
|
|
488
|
-
// se habilita el envío aunque otras sesiones sigan generando.
|
|
489
|
-
isProcessingRef.current = sessionStreamManager.isActive(initialChatId);
|
|
493
|
+
isProcessingRef.current = false;
|
|
490
494
|
streamingPlaceholderIdRef.current = null;
|
|
491
495
|
activeStreamChatIdRef.current = null;
|
|
496
|
+
streamingStore.clear();
|
|
492
497
|
loadMessages();
|
|
493
498
|
}
|
|
494
499
|
}, [initialChatId, project, setProject, setClient, setChipsProject, setTask, loadMessages]);
|
|
495
|
-
var handleStreamError = useCallback(function (
|
|
500
|
+
var handleStreamError = useCallback(function (errorMessage, errorRawMessage) {
|
|
496
501
|
var _errorRawMessage$matc, _errorRawMessage$matc2;
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
if (isActive) {
|
|
504
|
-
clearStreamUiRef.current();
|
|
505
|
-
streamingPlaceholderIdRef.current = null;
|
|
506
|
-
activeStreamChatIdRef.current = null;
|
|
507
|
-
isProcessingRef.current = false;
|
|
508
|
-
}
|
|
502
|
+
clearStreamUiRef.current();
|
|
503
|
+
var tempMessageId = "answer-".concat(currentMessageId.current, "-streaming");
|
|
504
|
+
streamingStore.clear();
|
|
505
|
+
streamingPlaceholderIdRef.current = null;
|
|
506
|
+
activeStreamChatIdRef.current = null;
|
|
507
|
+
removeMessage(tempMessageId);
|
|
509
508
|
var message = errorMessage === "Access denied: You don't have permission to access this agent" ? t('chat.errorAccessDenied') : errorMessage === 'invalid_request_error' && errorRawMessage !== null && errorRawMessage !== void 0 && errorRawMessage.includes('prompt is too long') ? t('chat.errorPromptTooLong', {
|
|
510
509
|
used: (_errorRawMessage$matc = (_errorRawMessage$matc2 = errorRawMessage.match(/(\d+) tokens/)) === null || _errorRawMessage$matc2 === void 0 ? void 0 : _errorRawMessage$matc2[1]) !== null && _errorRawMessage$matc !== void 0 ? _errorRawMessage$matc : ''
|
|
511
510
|
}) : t('chat.error');
|
|
512
|
-
|
|
513
|
-
id: "answer-".concat(
|
|
511
|
+
addMessage({
|
|
512
|
+
id: "answer-".concat(currentMessageId.current),
|
|
514
513
|
message: message,
|
|
515
514
|
isError: true,
|
|
516
515
|
date: new Date(),
|
|
@@ -520,84 +519,53 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
520
519
|
},
|
|
521
520
|
role: ChatHistoryRole.ASSISTANT
|
|
522
521
|
});
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
522
|
+
isProcessingRef.current = false;
|
|
523
|
+
}, [addMessage, removeMessage, t]);
|
|
524
|
+
var handleStreamUpdate = useCallback(function (content, sources, memorySessionId) {
|
|
525
|
+
// Si el chat cambió mientras el stream estaba en vuelo, descartar el
|
|
526
|
+
// token residual: no debe pintarse en el nuevo chat.
|
|
527
|
+
if (activeStreamChatIdRef.current != null && activeStreamChatIdRef.current !== currentChatId.current) {
|
|
528
|
+
return;
|
|
526
529
|
}
|
|
527
|
-
|
|
528
|
-
var handleStreamUpdate = useCallback(function (ctx, content) {
|
|
529
|
-
var sessionId = ctx.sessionId,
|
|
530
|
-
placeholderId = ctx.placeholderId;
|
|
530
|
+
var tempMessageId = "answer-".concat(currentMessageId.current, "-streaming");
|
|
531
531
|
|
|
532
|
-
//
|
|
533
|
-
// de
|
|
534
|
-
//
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
id:
|
|
532
|
+
// Primera llamada de este stream: insertamos el placeholder en el
|
|
533
|
+
// array de `messages` una única vez. Las llamadas subsiguientes ya no
|
|
534
|
+
// tocan `messages`; el texto vive en el streamingStore (externo), por
|
|
535
|
+
// lo que React no re-renderiza el árbol completo en cada token.
|
|
536
|
+
if (streamingPlaceholderIdRef.current !== tempMessageId) {
|
|
537
|
+
streamingPlaceholderIdRef.current = tempMessageId;
|
|
538
|
+
activeStreamChatIdRef.current = currentChatId.current;
|
|
539
|
+
streamingStore.start(tempMessageId);
|
|
540
|
+
addMessage({
|
|
541
|
+
id: tempMessageId,
|
|
542
542
|
message: '',
|
|
543
543
|
date: new Date(),
|
|
544
544
|
user: {
|
|
545
545
|
id: 'assistant',
|
|
546
546
|
name: 'Assistant'
|
|
547
547
|
},
|
|
548
|
-
role: ChatHistoryRole.ASSISTANT
|
|
548
|
+
role: ChatHistoryRole.ASSISTANT,
|
|
549
|
+
sources: sources,
|
|
550
|
+
memorySessionId: memorySessionId
|
|
549
551
|
});
|
|
550
552
|
}
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
activeStreamChatIdRef.current = sessionId;
|
|
554
|
-
}
|
|
555
|
-
sessionStreamingText.setText(sessionId, placeholderId, content);
|
|
556
|
-
}, [commitToSession]);
|
|
553
|
+
streamingStore.setText(tempMessageId, content);
|
|
554
|
+
}, [addMessage]);
|
|
557
555
|
var handleStreamFinish = useCallback(/*#__PURE__*/function () {
|
|
558
|
-
var
|
|
556
|
+
var _ref4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(content, sources, memorySessionId, rawAttachments, suggestions, completedAgentId) {
|
|
559
557
|
var _previousMessage$appr, _window$taskPanel, _createAgentFollowUp, _editAgentFollowUp;
|
|
560
|
-
var
|
|
561
|
-
return _regeneratorRuntime.wrap(function (
|
|
562
|
-
while (1) switch (
|
|
558
|
+
var tempMessageId, attachments, taskUrlRegex, matches, contentToAdd, previousMessage, hasApprovalInPreviousMessage, TASK_CREATION_TOOLS, TASK_EDIT_TOOLS, TASK_DELETE_TOOLS, pendingActions, wasTaskCreation, wasTaskEdit, wasTaskDelete, wasCreateAgentApproved, wasConfigureAgentAccessApproved, createAgentFollowUp, configuredAgentId, wasEditAgentApproved, editAgentFollowUp, fromStream, fromArgs, resolvedAgentId, taskIdsFromUrls, taskIdsFromDeleteApproval, taskIdsFromDeletionText, taskIdsForDashboard, shouldSyncDashboard, taskIds, tab, tabSegment, lastProjectMessage, contextProjectIdRaw, contextProjectId, pathMatch, routeProjectId, isOnProjectRoute, _window$newProjectDas, _window$newProjectDas2, _window$newProjectDas3, _window$newProjectDas4, _window$newProjectDas5, _window$newProjectDas6, openTaskPanelId, manualApproval, manualWasTaskEdit, manualWasTaskDelete, hoursToolsFromApproval, wasHoursChargeApproved, manualHoursTool, wasHoursChargeManualApproved, tools, _manualApproval$toolA, manualPseudoAction, affectedTaskIds, _window$taskPanel2, _window$taskPanel2$re, customEvent;
|
|
559
|
+
return _regeneratorRuntime.wrap(function (_context2) {
|
|
560
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
563
561
|
case 0:
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
tempMessageId = placeholderId;
|
|
567
|
-
sessionStreamingText.clear(sessionId);
|
|
568
|
-
dropFromSession(sessionId, tempMessageId);
|
|
569
|
-
attachments = normalizeAssistantAttachments(rawAttachments); // Sesión en background: cerramos lean. El backend ya persistió la
|
|
570
|
-
// respuesta, así que al volver a la sesión se carga desde ahí. Avisamos
|
|
571
|
-
// que terminó (unread + evento para toast/sonido).
|
|
572
|
-
if (isActive) {
|
|
573
|
-
_context.next = 1;
|
|
574
|
-
break;
|
|
575
|
-
}
|
|
576
|
-
commitToSession(sessionId, _objectSpread(_objectSpread({
|
|
577
|
-
id: "answer-".concat(memorySessionId),
|
|
578
|
-
message: content,
|
|
579
|
-
date: new Date(),
|
|
580
|
-
user: {
|
|
581
|
-
id: 'assistant',
|
|
582
|
-
name: 'Assistant'
|
|
583
|
-
},
|
|
584
|
-
role: ChatHistoryRole.ASSISTANT,
|
|
585
|
-
sources: sources
|
|
586
|
-
}, attachments.length > 0 ? {
|
|
587
|
-
attachments: attachments
|
|
588
|
-
} : {}), {}, {
|
|
589
|
-
memorySessionId: memorySessionId,
|
|
590
|
-
suggestions: suggestions || []
|
|
591
|
-
}));
|
|
592
|
-
clearSessionTail(sessionId);
|
|
593
|
-
notifySessionFinishedInBackground(sessionId, 'complete');
|
|
594
|
-
return _context.abrupt("return");
|
|
595
|
-
case 1:
|
|
562
|
+
tempMessageId = "answer-".concat(currentMessageId.current, "-streaming");
|
|
563
|
+
streamingStore.clear();
|
|
596
564
|
streamingPlaceholderIdRef.current = null;
|
|
597
565
|
activeStreamChatIdRef.current = null;
|
|
598
566
|
hitlExecutionContextRef.current = null;
|
|
599
|
-
|
|
600
|
-
// Detectar todas las URLs de tareas (.../tasks/123/detail|message|messages|files|history|hours)
|
|
567
|
+
removeMessage(tempMessageId);
|
|
568
|
+
attachments = normalizeAssistantAttachments(rawAttachments); // Detectar todas las URLs de tareas (.../tasks/123/detail|message|messages|files|history|hours)
|
|
601
569
|
taskUrlRegex = new RegExp(TASK_URL_REGEX_PATTERN, 'g');
|
|
602
570
|
matches = _toConsumableArray(content.matchAll(taskUrlRegex));
|
|
603
571
|
contentToAdd = content;
|
|
@@ -665,23 +633,23 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
665
633
|
taskIdsForDashboard = taskIdsFromUrls.length > 0 ? taskIdsFromUrls : taskIdsFromDeleteApproval.length > 0 ? taskIdsFromDeleteApproval : taskIdsFromDeletionText;
|
|
666
634
|
shouldSyncDashboard = hasApprovalInPreviousMessage && (wasTaskCreation || wasTaskEdit || wasTaskDelete) && taskIdsForDashboard.length > 0;
|
|
667
635
|
if (!shouldSyncDashboard) {
|
|
668
|
-
|
|
636
|
+
_context2.next = 3;
|
|
669
637
|
break;
|
|
670
638
|
}
|
|
671
639
|
taskIds = taskIdsForDashboard;
|
|
672
640
|
if (!(matches.length > 0)) {
|
|
673
|
-
|
|
641
|
+
_context2.next = 2;
|
|
674
642
|
break;
|
|
675
643
|
}
|
|
676
|
-
|
|
644
|
+
_context2.next = 1;
|
|
677
645
|
return getTabTaskDefault(taskIds[0]);
|
|
678
|
-
case
|
|
679
|
-
tab =
|
|
646
|
+
case 1:
|
|
647
|
+
tab = _context2.sent;
|
|
680
648
|
tabSegment = tab ? "/".concat(tab) : '/detail';
|
|
681
649
|
contentToAdd = content.replace(taskUrlRegex, function (url) {
|
|
682
650
|
return url.replace(/\/(detail|message|messages|files|history|hours)(?=$|\?)/, tabSegment);
|
|
683
651
|
});
|
|
684
|
-
case
|
|
652
|
+
case 2:
|
|
685
653
|
lastProjectMessage = messagesRef.current.filter(function (msg) {
|
|
686
654
|
return msg.projectId;
|
|
687
655
|
}).at(-1);
|
|
@@ -699,7 +667,7 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
699
667
|
(_window$newProjectDas5 = window.newProjectDashboard) === null || _window$newProjectDas5 === void 0 || (_window$newProjectDas6 = _window$newProjectDas5.deleteExistingTaskFromDashboard) === null || _window$newProjectDas6 === void 0 || _window$newProjectDas6.call(_window$newProjectDas5, taskIds);
|
|
700
668
|
}
|
|
701
669
|
}
|
|
702
|
-
case
|
|
670
|
+
case 3:
|
|
703
671
|
// Refetch del task panel si está abierto y la tool aprobada editó/borró esa tarea.
|
|
704
672
|
// Cubre los dos flujos de approval:
|
|
705
673
|
// 1) Approval por botón → `previousMessage.approval.pending_actions` (vía hasApprovalInPreviousMessage)
|
|
@@ -708,7 +676,34 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
708
676
|
manualApproval = lastManualApprovalRef.current;
|
|
709
677
|
lastManualApprovalRef.current = null; // consumir una sola vez
|
|
710
678
|
manualWasTaskEdit = !!manualApproval && TASK_EDIT_TOOLS.includes(manualApproval.toolName);
|
|
711
|
-
manualWasTaskDelete = !!manualApproval && TASK_DELETE_TOOLS.includes(manualApproval.toolName);
|
|
679
|
+
manualWasTaskDelete = !!manualApproval && TASK_DELETE_TOOLS.includes(manualApproval.toolName); // Sync Planner: avisar carga de horas confirmada (create_hour / create_hours).
|
|
680
|
+
hoursToolsFromApproval = pendingActions.map(function (action) {
|
|
681
|
+
return action.tool_name;
|
|
682
|
+
}).filter(function (toolName) {
|
|
683
|
+
return isHoursChargeTool(toolName);
|
|
684
|
+
});
|
|
685
|
+
wasHoursChargeApproved = hasApprovalInPreviousMessage && (previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.approvalStatus) === 'approved' && hoursToolsFromApproval.length > 0;
|
|
686
|
+
manualHoursTool = manualApproval === null || manualApproval === void 0 ? void 0 : manualApproval.toolName;
|
|
687
|
+
wasHoursChargeManualApproved = isHoursChargeTool(manualHoursTool);
|
|
688
|
+
if (wasHoursChargeApproved || wasHoursChargeManualApproved) {
|
|
689
|
+
tools = wasHoursChargeApproved ? hoursToolsFromApproval : manualHoursTool ? [manualHoursTool] : [];
|
|
690
|
+
console.info('[MAIA][hours-sync] create_hour(s) approved — notifying Planner', {
|
|
691
|
+
via: wasHoursChargeApproved ? 'approval-button' : 'manual-approval',
|
|
692
|
+
tools: tools,
|
|
693
|
+
approvalStatus: previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.approvalStatus,
|
|
694
|
+
memorySessionId: memorySessionId
|
|
695
|
+
});
|
|
696
|
+
dispatchMaiaHoursCharged({
|
|
697
|
+
source: 'maia',
|
|
698
|
+
tools: tools,
|
|
699
|
+
sessionId: memorySessionId
|
|
700
|
+
});
|
|
701
|
+
} else if (hasApprovalInPreviousMessage && hoursToolsFromApproval.length > 0) {
|
|
702
|
+
console.info('[MAIA][hours-sync] hours tools present but not syncing', {
|
|
703
|
+
approvalStatus: previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.approvalStatus,
|
|
704
|
+
tools: hoursToolsFromApproval
|
|
705
|
+
});
|
|
706
|
+
}
|
|
712
707
|
if (openTaskPanelId && (wasTaskEdit || wasTaskDelete || manualWasTaskEdit || manualWasTaskDelete)) {
|
|
713
708
|
manualPseudoAction = manualApproval ? {
|
|
714
709
|
tool_name: manualApproval.toolName,
|
|
@@ -719,7 +714,7 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
719
714
|
(_window$taskPanel2 = window.taskPanel) === null || _window$taskPanel2 === void 0 || (_window$taskPanel2$re = _window$taskPanel2.refetchTask) === null || _window$taskPanel2$re === void 0 || _window$taskPanel2$re.call(_window$taskPanel2);
|
|
720
715
|
}
|
|
721
716
|
}
|
|
722
|
-
|
|
717
|
+
addMessage(_objectSpread(_objectSpread({
|
|
723
718
|
id: "answer-".concat(memorySessionId),
|
|
724
719
|
message: contentToAdd,
|
|
725
720
|
date: new Date(),
|
|
@@ -737,7 +732,6 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
737
732
|
}, createAgentFollowUp ? {
|
|
738
733
|
createAgentFollowUp: createAgentFollowUp
|
|
739
734
|
} : {}));
|
|
740
|
-
clearSessionTail(sessionId);
|
|
741
735
|
if ((_createAgentFollowUp = createAgentFollowUp) !== null && _createAgentFollowUp !== void 0 && _createAgentFollowUp.agentId) {
|
|
742
736
|
fetchAgentDetail(createAgentFollowUp.agentId).then(function (chatAgent) {
|
|
743
737
|
document.dispatchEvent(new CustomEvent('maia-merge-created-agent-into-list', {
|
|
@@ -766,26 +760,24 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
766
760
|
document.dispatchEvent(customEvent);
|
|
767
761
|
firstTimeRef.current = false;
|
|
768
762
|
}
|
|
769
|
-
case
|
|
763
|
+
case 4:
|
|
770
764
|
case "end":
|
|
771
|
-
return
|
|
765
|
+
return _context2.stop();
|
|
772
766
|
}
|
|
773
|
-
},
|
|
767
|
+
}, _callee2);
|
|
774
768
|
}));
|
|
775
|
-
return function (
|
|
776
|
-
return
|
|
769
|
+
return function (_x4, _x5, _x6, _x7, _x8, _x9) {
|
|
770
|
+
return _ref4.apply(this, arguments);
|
|
777
771
|
};
|
|
778
|
-
}(), [
|
|
772
|
+
}(), [addMessage, removeMessage, project, getTabTaskDefault, event, agent]);
|
|
779
773
|
var handleStreamStop = useCallback(function () {
|
|
780
|
-
// El stop siempre aplica a la sesión activa (botón del input visible).
|
|
781
|
-
var sessionId = currentChatId.current;
|
|
782
774
|
clearStreamUiRef.current();
|
|
783
775
|
var tempMessageId = "answer-".concat(currentMessageId.current, "-streaming");
|
|
784
|
-
|
|
776
|
+
streamingStore.clear();
|
|
785
777
|
streamingPlaceholderIdRef.current = null;
|
|
786
778
|
activeStreamChatIdRef.current = null;
|
|
787
|
-
|
|
788
|
-
|
|
779
|
+
removeMessage(tempMessageId);
|
|
780
|
+
addMessage({
|
|
789
781
|
id: "answer-".concat(currentMessageId.current, "-cancelled"),
|
|
790
782
|
message: t('chat.cancelled'),
|
|
791
783
|
date: new Date(),
|
|
@@ -796,24 +788,19 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
796
788
|
role: ChatHistoryRole.ASSISTANT,
|
|
797
789
|
isFrontendCancelled: true
|
|
798
790
|
});
|
|
799
|
-
clearSessionTail(sessionId);
|
|
800
791
|
isProcessingRef.current = false;
|
|
801
792
|
setTimeout(function () {
|
|
802
793
|
var customEvent = new CustomEvent('refetch-session');
|
|
803
794
|
document.dispatchEvent(customEvent);
|
|
804
795
|
}, 500);
|
|
805
|
-
}, [
|
|
806
|
-
var handleApprovalRequired = useCallback(function (
|
|
796
|
+
}, [addMessage, removeMessage, t]);
|
|
797
|
+
var handleApprovalRequired = useCallback(function (approval, accumulatedContent) {
|
|
807
798
|
var _approval$pending_act;
|
|
808
|
-
var
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
if (isActive) {
|
|
814
|
-
streamingPlaceholderIdRef.current = null;
|
|
815
|
-
activeStreamChatIdRef.current = null;
|
|
816
|
-
}
|
|
799
|
+
var tempMessageId = "answer-".concat(currentMessageId.current, "-streaming");
|
|
800
|
+
streamingStore.clear();
|
|
801
|
+
streamingPlaceholderIdRef.current = null;
|
|
802
|
+
activeStreamChatIdRef.current = null;
|
|
803
|
+
removeMessage(tempMessageId);
|
|
817
804
|
var hitlContext = {
|
|
818
805
|
messageId: "approval-".concat(approval.original_thread_id),
|
|
819
806
|
messageText: accumulatedContent || '',
|
|
@@ -823,28 +810,24 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
823
810
|
return action.thread_id;
|
|
824
811
|
})
|
|
825
812
|
};
|
|
826
|
-
|
|
827
|
-
hitlExecutionContextRef.current = hitlContext;
|
|
828
|
-
}
|
|
813
|
+
hitlExecutionContextRef.current = hitlContext;
|
|
829
814
|
if (approval.manual_approval_detected) {
|
|
830
|
-
var _approval$pending_act2,
|
|
815
|
+
var _approval$pending_act2, _ref5, _tool_name, _tool_args;
|
|
831
816
|
var firstAction = (_approval$pending_act2 = approval.pending_actions) === null || _approval$pending_act2 === void 0 ? void 0 : _approval$pending_act2[0];
|
|
832
|
-
var toolName = (
|
|
817
|
+
var toolName = (_ref5 = (_tool_name = approval.tool_name) !== null && _tool_name !== void 0 ? _tool_name : firstAction === null || firstAction === void 0 ? void 0 : firstAction.tool_name) !== null && _ref5 !== void 0 ? _ref5 : '';
|
|
833
818
|
var toolArgs = ((_tool_args = approval.tool_args) !== null && _tool_args !== void 0 ? _tool_args : firstAction === null || firstAction === void 0 ? void 0 : firstAction.tool_args) || null;
|
|
834
|
-
if (toolName
|
|
819
|
+
if (toolName) {
|
|
835
820
|
lastManualApprovalRef.current = {
|
|
836
821
|
toolName: toolName,
|
|
837
822
|
toolArgs: toolArgs
|
|
838
823
|
};
|
|
839
824
|
}
|
|
840
|
-
|
|
841
|
-
isProcessingRef.current = false;
|
|
842
|
-
}
|
|
825
|
+
isProcessingRef.current = false;
|
|
843
826
|
return;
|
|
844
827
|
}
|
|
845
828
|
|
|
846
829
|
// Add a message with the approval request
|
|
847
|
-
|
|
830
|
+
addMessage({
|
|
848
831
|
id: "approval-".concat(approval.original_thread_id),
|
|
849
832
|
message: accumulatedContent || '',
|
|
850
833
|
date: new Date(),
|
|
@@ -856,14 +839,9 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
856
839
|
approval: approval,
|
|
857
840
|
approvalStatus: 'pending'
|
|
858
841
|
});
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
} else {
|
|
862
|
-
notifySessionFinishedInBackground(sessionId, 'approval_required');
|
|
863
|
-
}
|
|
864
|
-
}, [commitToSession, dropFromSession]);
|
|
842
|
+
isProcessingRef.current = false;
|
|
843
|
+
}, [addMessage, removeMessage]);
|
|
865
844
|
var _useOrchestratorStrea = useOrchestratorStream({
|
|
866
|
-
activeSessionId: activeSessionId,
|
|
867
845
|
onError: handleStreamError,
|
|
868
846
|
onStreamUpdate: handleStreamUpdate,
|
|
869
847
|
onFinishStream: handleStreamFinish,
|
|
@@ -877,42 +855,32 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
877
855
|
loadingMessage = _useOrchestratorStrea.loadingMessage,
|
|
878
856
|
streamActivity = _useOrchestratorStrea.streamActivity,
|
|
879
857
|
updateStreamActivity = _useOrchestratorStrea.updateStreamActivity,
|
|
880
|
-
stopStreaming = _useOrchestratorStrea.stopStreaming
|
|
858
|
+
stopStreaming = _useOrchestratorStrea.stopStreaming,
|
|
859
|
+
abortStreamSilently = _useOrchestratorStrea.abortStreamSilently;
|
|
860
|
+
|
|
861
|
+
// Mantenemos el setter más reciente en una ref para que pueda usarse desde
|
|
862
|
+
// efectos definidos antes en el archivo (cambio de chat, reset, etc.).
|
|
863
|
+
abortStreamSilentlyRef.current = abortStreamSilently;
|
|
881
864
|
clearStreamUiRef.current = function () {
|
|
882
865
|
updateStreamActivity(null);
|
|
883
866
|
setActiveLoadings({});
|
|
867
|
+
setIsContinuingStream(false);
|
|
884
868
|
hitlExecutionContextRef.current = null;
|
|
885
869
|
};
|
|
886
870
|
var currentProject = project;
|
|
887
871
|
var sendMessage = useCallback(/*#__PURE__*/function () {
|
|
888
|
-
var
|
|
872
|
+
var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(message, attachmentsOrOptions, faqId, agentSuggestionId, mentions, fuaId, scId) {
|
|
889
873
|
var _messagesRef$current;
|
|
890
|
-
var
|
|
891
|
-
return _regeneratorRuntime.wrap(function (
|
|
892
|
-
while (1) switch (
|
|
874
|
+
var _normalizeSendMessage, attachments, options, effectiveMentions, contextMessage, payloadFuaId, payloadScId, payloadContextData, displayMessage, newMessageId, lastMessageWithProject, currentAgentFromMessages, streamingPlaceholderId, finalMessage, _options$projectChang, _contextRef$current$p, history, _contextRef$current, ctxChipsProject, ctxProject, ctxClient, ctxTask, lastMessageProjectId, projectToRequest, projects, payloadFaqId, payloadAgentSuggestionId, payloadData;
|
|
875
|
+
return _regeneratorRuntime.wrap(function (_context3) {
|
|
876
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
893
877
|
case 0:
|
|
894
878
|
if (!(isProcessingRef.current || waitingResponse || loadingMessages)) {
|
|
895
|
-
|
|
879
|
+
_context3.next = 1;
|
|
896
880
|
break;
|
|
897
881
|
}
|
|
898
|
-
return
|
|
882
|
+
return _context3.abrupt("return");
|
|
899
883
|
case 1:
|
|
900
|
-
// Tope de concurrencia: si esta sesión no está generando y ya hay
|
|
901
|
-
// MAX_CONCURRENT_STREAMS activas, avisamos y no arrancamos otra.
|
|
902
|
-
willStartNewStream = !sessionStreamManager.isActive(currentChatId.current);
|
|
903
|
-
if (!(willStartNewStream && sessionStreamManager.getActiveCount() >= MAX_CONCURRENT_STREAMS)) {
|
|
904
|
-
_context2.next = 2;
|
|
905
|
-
break;
|
|
906
|
-
}
|
|
907
|
-
document.dispatchEvent(new CustomEvent('snackbar-event', {
|
|
908
|
-
detail: {
|
|
909
|
-
show: true,
|
|
910
|
-
severity: 'info',
|
|
911
|
-
message: t('chat.tooManyActiveSessions')
|
|
912
|
-
}
|
|
913
|
-
}));
|
|
914
|
-
return _context2.abrupt("return");
|
|
915
|
-
case 2:
|
|
916
884
|
_normalizeSendMessage = normalizeSendMessageArgs(attachmentsOrOptions), attachments = _normalizeSendMessage.attachments, options = _normalizeSendMessage.options; // Las mentions pueden venir vía 5to parámetro (call positional desde el footer)
|
|
917
885
|
// o vía SendMessageOptions (call programático). El parámetro explícito gana.
|
|
918
886
|
effectiveMentions = mentions !== null && mentions !== void 0 ? mentions : options.mentions;
|
|
@@ -937,9 +905,8 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
937
905
|
lastMessageWithProject = messagesRef.current.filter(function (msg) {
|
|
938
906
|
return msg.projectId;
|
|
939
907
|
}).at(-1);
|
|
940
|
-
currentAgentFromMessages = (_messagesRef$current = messagesRef.current) === null || _messagesRef$current === void 0 || (_messagesRef$current = _messagesRef$current[messagesRef.current.length - 1]) === null || _messagesRef$current === void 0 ? void 0 : _messagesRef$current.agentId;
|
|
941
|
-
|
|
942
|
-
commitToSession(sessionId, _objectSpread({
|
|
908
|
+
currentAgentFromMessages = (_messagesRef$current = messagesRef.current) === null || _messagesRef$current === void 0 || (_messagesRef$current = _messagesRef$current[messagesRef.current.length - 1]) === null || _messagesRef$current === void 0 ? void 0 : _messagesRef$current.agentId; // No agregar projectId al mensaje del usuario - se determinará después
|
|
909
|
+
addMessage(_objectSpread({
|
|
943
910
|
id: "question-".concat(currentMessageId.current),
|
|
944
911
|
message: displayMessage,
|
|
945
912
|
date: new Date(),
|
|
@@ -952,9 +919,8 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
952
919
|
currentMessageId.current = uuidv4();
|
|
953
920
|
streamingPlaceholderId = "answer-".concat(currentMessageId.current, "-streaming");
|
|
954
921
|
streamingPlaceholderIdRef.current = streamingPlaceholderId;
|
|
955
|
-
activeStreamChatIdRef.current =
|
|
956
|
-
|
|
957
|
-
commitToSession(sessionId, {
|
|
922
|
+
activeStreamChatIdRef.current = currentChatId.current;
|
|
923
|
+
addMessage({
|
|
958
924
|
id: streamingPlaceholderId,
|
|
959
925
|
message: '',
|
|
960
926
|
date: new Date(),
|
|
@@ -987,10 +953,10 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
987
953
|
projectPropId: ctxProject === null || ctxProject === void 0 ? void 0 : ctxProject.id,
|
|
988
954
|
agentType: agent === null || agent === void 0 ? void 0 : agent.type
|
|
989
955
|
});
|
|
990
|
-
|
|
956
|
+
_context3.next = 2;
|
|
991
957
|
return fetchProjects([projectToRequest]);
|
|
992
|
-
case
|
|
993
|
-
projects =
|
|
958
|
+
case 2:
|
|
959
|
+
projects = _context3.sent;
|
|
994
960
|
payloadFaqId = faqId !== null && faqId !== void 0 ? faqId : options.faqId;
|
|
995
961
|
payloadAgentSuggestionId = agentSuggestionId !== null && agentSuggestionId !== void 0 ? agentSuggestionId : options.agentSuggestionId;
|
|
996
962
|
payloadData = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
|
|
@@ -1036,16 +1002,16 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
1036
1002
|
contextData: payloadContextData
|
|
1037
1003
|
} : {});
|
|
1038
1004
|
askMaia(payloadData);
|
|
1039
|
-
case
|
|
1005
|
+
case 3:
|
|
1040
1006
|
case "end":
|
|
1041
|
-
return
|
|
1007
|
+
return _context3.stop();
|
|
1042
1008
|
}
|
|
1043
|
-
},
|
|
1009
|
+
}, _callee3);
|
|
1044
1010
|
}));
|
|
1045
|
-
return function (
|
|
1046
|
-
return
|
|
1011
|
+
return function (_x0, _x1, _x10, _x11, _x12, _x13, _x14) {
|
|
1012
|
+
return _ref6.apply(this, arguments);
|
|
1047
1013
|
};
|
|
1048
|
-
}(), [addMessage,
|
|
1014
|
+
}(), [addMessage, event, askMaia, project, client, task, chipsProject, authUser, agent, t, waitingResponse, loadingMessages, isWebSearchActive, isDeepSearchActive]);
|
|
1049
1015
|
var changeProject = useCallback(function (option) {
|
|
1050
1016
|
if (!currentUserQuestion.current) return;
|
|
1051
1017
|
if (option.id !== (project === null || project === void 0 ? void 0 : project.id)) {
|
|
@@ -1092,15 +1058,15 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
1092
1058
|
}
|
|
1093
1059
|
}, [project, setProject, askMaia, authUser, isWebSearchActive, agent]);
|
|
1094
1060
|
var handleFeedback = useCallback(/*#__PURE__*/function () {
|
|
1095
|
-
var
|
|
1061
|
+
var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(feedbackProp, chatMessageId) {
|
|
1096
1062
|
var response;
|
|
1097
|
-
return _regeneratorRuntime.wrap(function (
|
|
1098
|
-
while (1) switch (
|
|
1063
|
+
return _regeneratorRuntime.wrap(function (_context4) {
|
|
1064
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
1099
1065
|
case 0:
|
|
1100
|
-
|
|
1066
|
+
_context4.next = 1;
|
|
1101
1067
|
return maia.Chats.wasHelpfulChat(chatMessageId, feedbackProp === Feedback.THUMBS_UP);
|
|
1102
1068
|
case 1:
|
|
1103
|
-
response =
|
|
1069
|
+
response = _context4.sent;
|
|
1104
1070
|
if (response) {
|
|
1105
1071
|
messagesRef.current = messagesRef.current.map(function (message) {
|
|
1106
1072
|
if (message.id === chatMessageId && message.role === 'assistant') {
|
|
@@ -1113,72 +1079,57 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
1113
1079
|
}
|
|
1114
1080
|
case 2:
|
|
1115
1081
|
case "end":
|
|
1116
|
-
return
|
|
1082
|
+
return _context4.stop();
|
|
1117
1083
|
}
|
|
1118
|
-
},
|
|
1084
|
+
}, _callee4);
|
|
1119
1085
|
}));
|
|
1120
|
-
return function (
|
|
1121
|
-
return
|
|
1086
|
+
return function (_x15, _x16) {
|
|
1087
|
+
return _ref7.apply(this, arguments);
|
|
1122
1088
|
};
|
|
1123
1089
|
}(), []);
|
|
1124
1090
|
var handleApprovalDecision = useCallback(/*#__PURE__*/function () {
|
|
1125
|
-
var
|
|
1126
|
-
var
|
|
1127
|
-
return _regeneratorRuntime.wrap(function (
|
|
1128
|
-
while (1) switch (
|
|
1091
|
+
var _ref8 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(threadIds, decision, editedActions) {
|
|
1092
|
+
var messageWithApproval, approval, messageId, loadingKey, hoursToolsInDecision, hitlContext, initialActivity, existingMessage, newStatus, streamSettled, response, _t;
|
|
1093
|
+
return _regeneratorRuntime.wrap(function (_context5) {
|
|
1094
|
+
while (1) switch (_context5.prev = _context5.next) {
|
|
1129
1095
|
case 0:
|
|
1130
1096
|
if (threadIds !== null && threadIds !== void 0 && threadIds.length) {
|
|
1131
|
-
|
|
1097
|
+
_context5.next = 1;
|
|
1132
1098
|
break;
|
|
1133
1099
|
}
|
|
1134
1100
|
console.error('No thread_ids provided for approval decision');
|
|
1135
|
-
return
|
|
1101
|
+
return _context5.abrupt("return");
|
|
1136
1102
|
case 1:
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1103
|
+
// Buscar el mensaje que contiene alguno de estos threadIds en sus pending_actions
|
|
1104
|
+
messageWithApproval = messagesRef.current.find(function (m) {
|
|
1105
|
+
var _m$approval;
|
|
1106
|
+
return (_m$approval = m.approval) === null || _m$approval === void 0 || (_m$approval = _m$approval.pending_actions) === null || _m$approval === void 0 ? void 0 : _m$approval.some(function (action) {
|
|
1107
|
+
return threadIds.includes(action.thread_id);
|
|
1108
|
+
});
|
|
1109
|
+
});
|
|
1110
|
+
if (!(!messageWithApproval || !messageWithApproval.approval)) {
|
|
1111
|
+
_context5.next = 2;
|
|
1140
1112
|
break;
|
|
1141
1113
|
}
|
|
1142
1114
|
console.error('No se encontró mensaje con approval para thread_ids:', threadIds);
|
|
1143
|
-
return
|
|
1115
|
+
return _context5.abrupt("return");
|
|
1144
1116
|
case 2:
|
|
1145
|
-
messageWithApproval = found.message, foundSessionId = found.sessionId;
|
|
1146
1117
|
approval = messageWithApproval.approval;
|
|
1147
|
-
if (approval) {
|
|
1148
|
-
_context4.next = 3;
|
|
1149
|
-
break;
|
|
1150
|
-
}
|
|
1151
|
-
return _context4.abrupt("return");
|
|
1152
|
-
case 3:
|
|
1153
|
-
sessionId = approval.session_id || foundSessionId;
|
|
1154
|
-
if (sessionId) {
|
|
1155
|
-
_context4.next = 4;
|
|
1156
|
-
break;
|
|
1157
|
-
}
|
|
1158
|
-
console.error('No session_id disponible para approval:', threadIds);
|
|
1159
|
-
return _context4.abrupt("return");
|
|
1160
|
-
case 4:
|
|
1161
|
-
if (!sessionStreamManager.isActive(sessionId)) {
|
|
1162
|
-
_context4.next = 5;
|
|
1163
|
-
break;
|
|
1164
|
-
}
|
|
1165
|
-
return _context4.abrupt("return");
|
|
1166
|
-
case 5:
|
|
1167
|
-
if (!(sessionStreamManager.getActiveCount() >= MAX_CONCURRENT_STREAMS)) {
|
|
1168
|
-
_context4.next = 6;
|
|
1169
|
-
break;
|
|
1170
|
-
}
|
|
1171
|
-
document.dispatchEvent(new CustomEvent('snackbar-event', {
|
|
1172
|
-
detail: {
|
|
1173
|
-
show: true,
|
|
1174
|
-
severity: 'info',
|
|
1175
|
-
message: t('chat.tooManyActiveSessions')
|
|
1176
|
-
}
|
|
1177
|
-
}));
|
|
1178
|
-
return _context4.abrupt("return");
|
|
1179
|
-
case 6:
|
|
1180
1118
|
messageId = messageWithApproval.id;
|
|
1181
|
-
|
|
1119
|
+
loadingKey = threadIds[0];
|
|
1120
|
+
hoursToolsInDecision = (approval.pending_actions || []).map(function (action) {
|
|
1121
|
+
return action.tool_name;
|
|
1122
|
+
}).filter(function (toolName) {
|
|
1123
|
+
return isHoursChargeTool(toolName);
|
|
1124
|
+
});
|
|
1125
|
+
if (hoursToolsInDecision.length > 0) {
|
|
1126
|
+
console.info('[MAIA][hours-sync] HITL decision for hours tools', {
|
|
1127
|
+
decision: decision,
|
|
1128
|
+
tools: hoursToolsInDecision,
|
|
1129
|
+
threadIds: threadIds,
|
|
1130
|
+
sessionId: approval.session_id
|
|
1131
|
+
});
|
|
1132
|
+
}
|
|
1182
1133
|
hitlContext = {
|
|
1183
1134
|
messageId: messageId,
|
|
1184
1135
|
messageText: messageWithApproval.message,
|
|
@@ -1186,106 +1137,174 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
1186
1137
|
pendingActions: approval.pending_actions,
|
|
1187
1138
|
threadIds: threadIds
|
|
1188
1139
|
};
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1140
|
+
hitlExecutionContextRef.current = hitlContext;
|
|
1141
|
+
initialActivity = resolveInitialHitlStreamActivity(t, hitlContext); // Update message status immediately
|
|
1142
|
+
messagesRef.current = messagesRef.current.map(function (message) {
|
|
1143
|
+
if (message.id === messageId) {
|
|
1144
|
+
var newStatus = decision === 'approve' ? 'approved' : 'rejected';
|
|
1145
|
+
return _objectSpread(_objectSpread({}, message), {}, {
|
|
1146
|
+
approvalStatus: newStatus
|
|
1147
|
+
});
|
|
1148
|
+
}
|
|
1149
|
+
return message;
|
|
1150
|
+
});
|
|
1151
|
+
|
|
1152
|
+
// Trigger re-render
|
|
1153
|
+
existingMessage = messagesRef.current.find(function (m) {
|
|
1154
|
+
return m.id === messageId;
|
|
1155
|
+
});
|
|
1156
|
+
if (existingMessage) {
|
|
1157
|
+
newStatus = decision === 'approve' ? 'approved' : 'rejected';
|
|
1158
|
+
addMessage(_objectSpread(_objectSpread({}, existingMessage), {}, {
|
|
1159
|
+
approvalStatus: newStatus
|
|
1160
|
+
}));
|
|
1193
1161
|
}
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1162
|
+
|
|
1163
|
+
// Call continue-thread endpoint with ALL thread_ids in a single request
|
|
1164
|
+
isProcessingRef.current = true;
|
|
1165
|
+
setIsContinuingStream(true);
|
|
1166
|
+
currentMessageId.current = uuidv4();
|
|
1167
|
+
|
|
1168
|
+
// Add loading
|
|
1169
|
+
setActiveLoadings(function (prev) {
|
|
1170
|
+
return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, loadingKey, initialActivity.message));
|
|
1171
|
+
});
|
|
1172
|
+
updateStreamActivity(initialActivity);
|
|
1173
|
+
|
|
1174
|
+
// Marca si el stream cerró vía un evento terminal (complete/approval/error).
|
|
1175
|
+
// Si el backend cierra la conexión sin emitirlo, limpiamos el indicador en el
|
|
1176
|
+
// `finally` para que no quede trabado en "Escribiendo la respuesta".
|
|
1177
|
+
streamSettled = false;
|
|
1178
|
+
_context5.prev = 3;
|
|
1179
|
+
_context5.next = 4;
|
|
1180
|
+
return maia.Orchestrator.continueThread({
|
|
1181
|
+
threadIds: threadIds,
|
|
1182
|
+
// Send all action thread_ids at once
|
|
1183
|
+
sessionId: approval.session_id,
|
|
1184
|
+
decision: editedActions ? 'edit' : decision,
|
|
1185
|
+
editedActions: editedActions,
|
|
1186
|
+
agentId: (agent === null || agent === void 0 ? void 0 : agent.id) || '',
|
|
1187
|
+
lang: authUser.lang
|
|
1188
|
+
});
|
|
1189
|
+
case 4:
|
|
1190
|
+
response = _context5.sent;
|
|
1191
|
+
if (response.ok) {
|
|
1192
|
+
_context5.next = 5;
|
|
1193
|
+
break;
|
|
1200
1194
|
}
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
sessionId: sessionId,
|
|
1214
|
-
placeholderId: hitlCtx.placeholderId,
|
|
1215
|
-
continueRequest: {
|
|
1216
|
-
threadIds: threadIds,
|
|
1217
|
-
sessionId: approval.session_id,
|
|
1218
|
-
decision: editedActions ? 'edit' : decision,
|
|
1219
|
-
editedActions: editedActions,
|
|
1220
|
-
agentId: (agent === null || agent === void 0 ? void 0 : agent.id) || '',
|
|
1221
|
-
lang: authUser.lang
|
|
1195
|
+
setIsContinuingStream(false);
|
|
1196
|
+
handleStreamError();
|
|
1197
|
+
return _context5.abrupt("return");
|
|
1198
|
+
case 5:
|
|
1199
|
+
_context5.next = 6;
|
|
1200
|
+
return processSSEStream(response, loadingKey, {
|
|
1201
|
+
onThinking: function onThinking() {
|
|
1202
|
+
var activity = {
|
|
1203
|
+
phase: 'thinking',
|
|
1204
|
+
message: getThinkingLoadingMessage(0, t)
|
|
1205
|
+
};
|
|
1206
|
+
updateStreamActivity(activity);
|
|
1222
1207
|
},
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
}
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
}
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1208
|
+
onToken: function onToken(content) {
|
|
1209
|
+
updateStreamActivity(getWritingStreamActivity(t));
|
|
1210
|
+
handleStreamUpdate(content, null, '');
|
|
1211
|
+
},
|
|
1212
|
+
onNode: function onNode(message, currentThreadId) {
|
|
1213
|
+
var nodeActivity = resolveHitlNodeStreamActivity(message, t, hitlExecutionContextRef.current, currentThreadId, {
|
|
1214
|
+
useResumingFallback: true
|
|
1215
|
+
});
|
|
1216
|
+
updateStreamActivity(nodeActivity);
|
|
1217
|
+
setActiveLoadings(function (prev) {
|
|
1218
|
+
return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, currentThreadId, nodeActivity.message));
|
|
1219
|
+
});
|
|
1220
|
+
},
|
|
1221
|
+
onComplete: function onComplete(finalContent, sources, memorySessionId, currentThreadId, attachments, suggestions, agentId) {
|
|
1222
|
+
streamSettled = true;
|
|
1223
|
+
setIsContinuingStream(false);
|
|
1224
|
+
handleStreamFinish(finalContent, sources, memorySessionId, attachments, suggestions, agentId);
|
|
1225
|
+
updateStreamActivity(null);
|
|
1226
|
+
hitlExecutionContextRef.current = null;
|
|
1227
|
+
setActiveLoadings(function (prev) {
|
|
1228
|
+
var newLoadings = _objectSpread({}, prev);
|
|
1229
|
+
delete newLoadings[currentThreadId];
|
|
1230
|
+
return newLoadings;
|
|
1231
|
+
});
|
|
1232
|
+
},
|
|
1233
|
+
onApprovalRequired: function onApprovalRequired(approvalPayload, accumulatedContent, currentThreadId) {
|
|
1234
|
+
// New HITL interruption detected after resume (chained actions)
|
|
1235
|
+
streamSettled = true;
|
|
1236
|
+
setIsContinuingStream(false);
|
|
1237
|
+
updateStreamActivity(null);
|
|
1238
|
+
hitlExecutionContextRef.current = null;
|
|
1239
|
+
setActiveLoadings(function (prev) {
|
|
1240
|
+
var newLoadings = _objectSpread({}, prev);
|
|
1241
|
+
delete newLoadings[currentThreadId];
|
|
1242
|
+
return newLoadings;
|
|
1243
|
+
});
|
|
1244
|
+
handleApprovalRequired(approvalPayload, accumulatedContent);
|
|
1245
|
+
},
|
|
1246
|
+
onError: function onError() {
|
|
1247
|
+
streamSettled = true;
|
|
1248
|
+
setIsContinuingStream(false);
|
|
1249
|
+
handleStreamError();
|
|
1243
1250
|
}
|
|
1244
1251
|
});
|
|
1252
|
+
case 6:
|
|
1253
|
+
_context5.next = 8;
|
|
1254
|
+
break;
|
|
1245
1255
|
case 7:
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
detail: {
|
|
1252
|
-
show: true,
|
|
1253
|
-
severity: 'info',
|
|
1254
|
-
message: t('chat.tooManyActiveSessions')
|
|
1255
|
-
}
|
|
1256
|
-
}));
|
|
1257
|
-
}
|
|
1258
|
-
}
|
|
1256
|
+
_context5.prev = 7;
|
|
1257
|
+
_t = _context5["catch"](3);
|
|
1258
|
+
streamSettled = true;
|
|
1259
|
+
setIsContinuingStream(false);
|
|
1260
|
+
handleStreamError();
|
|
1259
1261
|
case 8:
|
|
1262
|
+
_context5.prev = 8;
|
|
1263
|
+
setIsContinuingStream(false);
|
|
1264
|
+
isProcessingRef.current = false;
|
|
1265
|
+
// Red de seguridad: si el stream cerró sin evento terminal, el indicador
|
|
1266
|
+
// (p. ej. "Escribiendo la respuesta") quedaría trabado. Lo limpiamos aquí.
|
|
1267
|
+
if (!streamSettled) {
|
|
1268
|
+
updateStreamActivity(null);
|
|
1269
|
+
hitlExecutionContextRef.current = null;
|
|
1270
|
+
setActiveLoadings(function (prev) {
|
|
1271
|
+
if (!(loadingKey in prev)) return prev;
|
|
1272
|
+
var newLoadings = _objectSpread({}, prev);
|
|
1273
|
+
delete newLoadings[loadingKey];
|
|
1274
|
+
return newLoadings;
|
|
1275
|
+
});
|
|
1276
|
+
}
|
|
1277
|
+
return _context5.finish(8);
|
|
1278
|
+
case 9:
|
|
1260
1279
|
case "end":
|
|
1261
|
-
return
|
|
1280
|
+
return _context5.stop();
|
|
1262
1281
|
}
|
|
1263
|
-
},
|
|
1282
|
+
}, _callee5, null, [[3, 7, 8, 9]]);
|
|
1264
1283
|
}));
|
|
1265
|
-
return function (
|
|
1266
|
-
return
|
|
1284
|
+
return function (_x17, _x18, _x19) {
|
|
1285
|
+
return _ref8.apply(this, arguments);
|
|
1267
1286
|
};
|
|
1268
|
-
}(), [authUser, agent,
|
|
1269
|
-
var initializeChat = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function
|
|
1270
|
-
var _userInitialMessage$m, _userInitialMessage$a,
|
|
1271
|
-
return _regeneratorRuntime.wrap(function (
|
|
1272
|
-
while (1) switch (
|
|
1287
|
+
}(), [authUser, agent, addMessage, handleStreamError, handleStreamUpdate, handleStreamFinish, handleApprovalRequired, updateStreamActivity, t]);
|
|
1288
|
+
var initializeChat = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6() {
|
|
1289
|
+
var _userInitialMessage$m, _userInitialMessage$a, _ref0, _resolveProjectToRequ, _ctxProject$id, _ctxClient$id, _ctxTask$id, _ctxChipsProject$proj, hasInitialMessage, hasInitialAttachments, hasInitialFaq, hasInitialFua, hasInitialSc, history, _contextRef$current2, ctxChipsProject, ctxProject, ctxClient, ctxTask, projectToRequest;
|
|
1290
|
+
return _regeneratorRuntime.wrap(function (_context6) {
|
|
1291
|
+
while (1) switch (_context6.prev = _context6.next) {
|
|
1273
1292
|
case 0:
|
|
1274
1293
|
if (!firstTimeRef.current) {
|
|
1275
1294
|
firstTimeRef.current = true;
|
|
1276
1295
|
}
|
|
1277
1296
|
if (!initialChatId) {
|
|
1278
|
-
|
|
1297
|
+
_context6.next = 2;
|
|
1279
1298
|
break;
|
|
1280
1299
|
}
|
|
1281
|
-
|
|
1300
|
+
_context6.next = 1;
|
|
1282
1301
|
return loadMessages();
|
|
1283
1302
|
case 1:
|
|
1284
|
-
|
|
1303
|
+
_context6.next = 4;
|
|
1285
1304
|
break;
|
|
1286
1305
|
case 2:
|
|
1287
1306
|
if (!userInitialMessage) {
|
|
1288
|
-
|
|
1307
|
+
_context6.next = 4;
|
|
1289
1308
|
break;
|
|
1290
1309
|
}
|
|
1291
1310
|
hasInitialMessage = Boolean((_userInitialMessage$m = userInitialMessage.message) === null || _userInitialMessage$m === void 0 ? void 0 : _userInitialMessage$m.trim());
|
|
@@ -1294,10 +1313,10 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
1294
1313
|
hasInitialFua = Boolean(userInitialMessage.fuaId);
|
|
1295
1314
|
hasInitialSc = Boolean(userInitialMessage.scId);
|
|
1296
1315
|
if (!(!hasInitialMessage && !hasInitialAttachments && !hasInitialFaq && !hasInitialFua && !hasInitialSc)) {
|
|
1297
|
-
|
|
1316
|
+
_context6.next = 3;
|
|
1298
1317
|
break;
|
|
1299
1318
|
}
|
|
1300
|
-
return
|
|
1319
|
+
return _context6.abrupt("return");
|
|
1301
1320
|
case 3:
|
|
1302
1321
|
history = messagesRef.current.map(function (historyMessage) {
|
|
1303
1322
|
return {
|
|
@@ -1306,7 +1325,7 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
1306
1325
|
};
|
|
1307
1326
|
});
|
|
1308
1327
|
_contextRef$current2 = contextRef.current, ctxChipsProject = _contextRef$current2.chipsProject, ctxProject = _contextRef$current2.project, ctxClient = _contextRef$current2.client, ctxTask = _contextRef$current2.task;
|
|
1309
|
-
projectToRequest = (
|
|
1328
|
+
projectToRequest = (_ref0 = (_resolveProjectToRequ = resolveProjectToRequest(ctxChipsProject, null)) !== null && _resolveProjectToRequ !== void 0 ? _resolveProjectToRequ : ctxProject === null || ctxProject === void 0 ? void 0 : ctxProject.id) !== null && _ref0 !== void 0 ? _ref0 : null;
|
|
1310
1329
|
console.info('[useChatManager] PATH=initializeChat/userInitialMessage — contextRef resolution:', {
|
|
1311
1330
|
projectPropId: (_ctxProject$id = ctxProject === null || ctxProject === void 0 ? void 0 : ctxProject.id) !== null && _ctxProject$id !== void 0 ? _ctxProject$id : null,
|
|
1312
1331
|
clientId: (_ctxClient$id = ctxClient === null || ctxClient === void 0 ? void 0 : ctxClient.id) !== null && _ctxClient$id !== void 0 ? _ctxClient$id : null,
|
|
@@ -1359,30 +1378,31 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
1359
1378
|
} : {}));
|
|
1360
1379
|
case 4:
|
|
1361
1380
|
case "end":
|
|
1362
|
-
return
|
|
1381
|
+
return _context6.stop();
|
|
1363
1382
|
}
|
|
1364
|
-
},
|
|
1383
|
+
}, _callee6);
|
|
1365
1384
|
})), [initialChatId, userInitialMessage, project, client, task, authUser, agent, askMaia, isWebSearchActive, isDeepSearchActive]);
|
|
1366
1385
|
var resetChat = useCallback(function () {
|
|
1367
|
-
|
|
1368
|
-
sessionStreamingText.clear(previousSessionId);
|
|
1386
|
+
abortStreamSilentlyRef.current();
|
|
1369
1387
|
currentMessageId.current = uuidv4();
|
|
1370
1388
|
currentUserQuestion.current = null;
|
|
1371
1389
|
currentChatId.current = uuidv4();
|
|
1372
|
-
setActiveSessionId(currentChatId.current);
|
|
1373
1390
|
reportedEvent.current = false;
|
|
1374
1391
|
streamingPlaceholderIdRef.current = null;
|
|
1375
1392
|
activeStreamChatIdRef.current = null;
|
|
1393
|
+
streamingStore.clear();
|
|
1394
|
+
setIsContinuingStream(false);
|
|
1376
1395
|
}, []);
|
|
1377
1396
|
var stopGeneration = useCallback(function () {
|
|
1378
1397
|
stopStreaming();
|
|
1379
1398
|
isProcessingRef.current = false;
|
|
1399
|
+
setIsContinuingStream(false);
|
|
1380
1400
|
}, [stopStreaming]);
|
|
1381
1401
|
return {
|
|
1382
1402
|
messages: messages,
|
|
1383
1403
|
loadingMessages: loadingMessages,
|
|
1384
1404
|
isLoadingMoreMessages: isLoadingMoreMessages,
|
|
1385
|
-
waitingResponse: waitingResponse,
|
|
1405
|
+
waitingResponse: waitingResponse || isContinuingStream,
|
|
1386
1406
|
isWriting: isWriting,
|
|
1387
1407
|
loadingMessage: loadingMessage,
|
|
1388
1408
|
streamActivity: streamActivity,
|
|
@@ -1398,7 +1418,7 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
1398
1418
|
initializeChat: initializeChat,
|
|
1399
1419
|
resetChat: resetChat,
|
|
1400
1420
|
stopGeneration: stopGeneration,
|
|
1401
|
-
isDisabled: waitingResponse || loadingMessages
|
|
1421
|
+
isDisabled: waitingResponse || isContinuingStream || loadingMessages
|
|
1402
1422
|
};
|
|
1403
1423
|
};
|
|
1404
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVJlZiIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwidjQiLCJ1dWlkdjQiLCJ1c2VDaGF0TWVzc2FnZXMiLCJ1c2VPcmNoZXN0cmF0b3JTdHJlYW0iLCJ1c2VUIiwidXNlVXNlciIsInVzZUdsb2JhbENvbnRleHQiLCJFVkVOVFMiLCJ1c2VFdmVudCIsIm1haWEiLCJGZWVkYmFjayIsIkNoYXRIaXN0b3J5Um9sZSIsImJ1aWxkQ29udGV4dE1lc3NhZ2UiLCJmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5IiwidXNlUHJvamVjdHMiLCJ1c2VUYWJUYXNrRGVmYXVsdCIsIlRBU0tfVVJMX1JFR0VYX1BBVFRFUk4iLCJmZXRjaEFnZW50RGV0YWlsIiwiYnVpbGRIaXRsQWN0aW9uVHlwZUxpc3QiLCJnZXRIaXRsQW5hbHl0aWNzQWdlbnRUeXBlIiwic2Vzc2lvblN0cmVhbWluZ1RleHQiLCJ1c2VTZXNzaW9uc1N0b3JlIiwidXNlU2Vzc2lvbk1ldGEiLCJzZXNzaW9uU3RyZWFtTWFuYWdlciIsIk1BWF9DT05DVVJSRU5UX1NUUkVBTVMiLCJhY3RpdmVWaWV3Iiwibm90aWZ5U2Vzc2lvbkZpbmlzaGVkSW5CYWNrZ3JvdW5kIiwiaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZCIsIm5vcm1hbGl6ZVNlbmRNZXNzYWdlQXJncyIsImF0dGFjaG1lbnRzT3JPcHRpb25zIiwiX29wdGlvbnMkYXR0YWNobWVudHMiLCJBcnJheSIsImlzQXJyYXkiLCJhdHRhY2htZW50cyIsIm9wdGlvbnMiLCJyZXNvbHZlUHJvamVjdFRvUmVxdWVzdCIsImNoaXBzUHJvamVjdCIsImxhc3RNZXNzYWdlUHJvamVjdElkIiwiY2hpcHNQcm9qZWN0SWQiLCJwcm9qZWN0SWQiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsInBhcnNlZCIsInJlc29sdmVDbGllbnRQYXlsb2FkIiwiY3R4Q2xpZW50IiwiY3R4UHJvamVjdCIsIl9jdHhQcm9qZWN0JGNsaWVudCIsImlkIiwiX29iamVjdFNwcmVhZCIsImNsaWVudElkIiwibmFtZSIsImNsaWVudE5hbWUiLCJjbGllbnQiLCJub3JtYWxpemVBc3Npc3RhbnRBdHRhY2htZW50cyIsInJhd0F0dGFjaG1lbnRzIiwiZmlsdGVyIiwiYXR0YWNobWVudCIsIl90eXBlb2YiLCJtYXAiLCJpbmRleCIsInRyaW0iLCJjb25jYXQiLCJ0eXBlIiwibWltZVR5cGUiLCJtaW1lX3R5cGUiLCJmdWxsRmlsZU5hbWUiLCJpbmNsdWRlcyIsIm51bWVyaWNTaXplIiwic2l6ZSIsImZpbGUiLCJGaWxlIiwidXJsX29yaWdpbmFsIiwidW5kZWZpbmVkIiwidXJsX3RodW1ibmFpbCIsInVybF9maWxlIiwicm9sZSIsImV4dHJhY3RUYXNrSWRzRnJvbVBlbmRpbmdBY3Rpb25zQXJncyIsInBlbmRpbmdBY3Rpb25zIiwiaWRzIiwicHVzaElkIiwicmF3IiwibiIsInBhcnNlSW50IiwiU3RyaW5nIiwiaXNOYU4iLCJwdXNoIiwiZm9yRWFjaCIsImFjdGlvbiIsIl9yZWMkdGFza19pZCIsImFyZ3MiLCJ0b29sX2FyZ3MiLCJyZWMiLCJ0YXNrX2lkIiwidGFza19pZHMiLCJ0YXNrcyIsInQiLCJfdHJlYyR0YXNrX2lkIiwidHJlYyIsImV4dHJhY3RUYXNrSWRzRnJvbURlbGV0ZVBlbmRpbmdBY3Rpb25zIiwidG9vbF9uYW1lIiwiX3JlYyR0YXNrX2lkMiIsImxpc3QiLCJ0aWQiLCJleHRyYWN0QWdlbnRJZEZyb21FZGl0QWdlbnRQZW5kaW5nQWN0aW9ucyIsIl9yZWMkYWdlbnRfaWQiLCJlZGl0QWN0aW9uIiwiZmluZCIsImEiLCJ0b0xvd2VyQ2FzZSIsImFnZW50X2lkIiwiYWdlbnRJZCIsImV4dHJhY3RBZ2VudElkRnJvbVBlbmRpbmdBY3Rpb25zQnlUb29sTmFtZSIsInRvb2xOYW1lIiwiX3JlZiIsIl9yZWMkYWdlbnRfaWQyIiwiZXh0cmFjdFRhc2tJZHNGcm9tQXNzaXN0YW50RGVsZXRpb25UZXh0IiwidGV4dCIsImxhYmVsZWQiLCJtYXRjaCIsImJvbGQiLCJ1c2VTdGFibGVDYWxsYmFja3MiLCJhdXRoVXNlciIsImN1cnJlbnRVc2VyIiwidG9TdHJpbmciLCJmaXJzdE5hbWUiLCJhdmF0YXIiLCJwaWN0dXJlIiwiY3VycmVudCIsImZpbmRNZXNzYWdlV2l0aEFwcHJvdmFsQnlUaHJlYWRJZHMiLCJ0aHJlYWRJZHMiLCJhY3RpdmVNZXNzYWdlcyIsImZyb21BY3RpdmVWaWV3IiwibWVzc2FnZSIsIl9tZXNzYWdlJGFwcHJvdmFsIiwiYXBwcm92YWwiLCJwZW5kaW5nX2FjdGlvbnMiLCJzb21lIiwidGhyZWFkX2lkIiwic2Vzc2lvbklkIiwic2Vzc2lvbl9pZCIsImdldCIsIl91c2VTZXNzaW9uc1N0b3JlJGdldCIsImdldFN0YXRlIiwibWVzc2FnZXMiLCJzZXNzaW9uRW50cnkiLCJPYmplY3QiLCJlbnRyaWVzIiwiX3JlZjIiLCJfcmVmMyIsIl9zbGljZWRUb0FycmF5Iiwic2Vzc2lvbk1lc3NhZ2VzIiwiX21lc3NhZ2UkYXBwcm92YWwyIiwiX3Nlc3Npb25FbnRyeSIsImZvdW5kIiwiX21lc3NhZ2UkYXBwcm92YWwzIiwidXNlQ2hhdE1hbmFnZXIiLCJfcmVmNCIsImluaXRpYWxDaGF0SWQiLCJjaGF0SWQiLCJ1c2VySW5pdGlhbE1lc3NhZ2UiLCJvbkVycm9yIiwiX3JlZjQkYWdlbnRzIiwiYWdlbnRzIiwiX3VzZVQiLCJfdXNlR2xvYmFsQ29udGV4dCIsInByb2plY3QiLCJzZXRQcm9qZWN0Iiwic2V0Q2xpZW50IiwidGFzayIsInNldFRhc2siLCJhZ2VudCIsImlzV2ViU2VhcmNoQWN0aXZlIiwiaXNEZWVwU2VhcmNoQWN0aXZlIiwic2V0Q2hpcHNQcm9qZWN0IiwiZXZlbnQiLCJfdXNlUHJvamVjdHMiLCJmZXRjaFByb2plY3RzIiwiX3VzZVN0YWJsZUNhbGxiYWNrcyIsIl91c2VUYWJUYXNrRGVmYXVsdCIsImdldFRhYlRhc2tEZWZhdWx0IiwiX2NoaXBzUHJvamVjdCRwcm9qZWN0IiwiX2NoaXBzUHJvamVjdCRwcm9qZWN0MiIsIl9wcm9qZWN0JGlkIiwiX2NsaWVudCRpZCIsIl90YXNrJGlkIiwiY29uc29sZSIsImluZm8iLCJjaGlwc1Byb2plY3ROYW1lIiwicHJvamVjdE5hbWUiLCJwcm9qZWN0UHJvcElkIiwidGFza0lkIiwiY3VycmVudE1lc3NhZ2VJZCIsImN1cnJlbnRVc2VyUXVlc3Rpb24iLCJjdXJyZW50Q2hhdElkIiwicmVwb3J0ZWRFdmVudCIsIm1lc3NhZ2VzUmVmIiwibGFzdE1hbnVhbEFwcHJvdmFsUmVmIiwiaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYiLCJpc1Byb2Nlc3NpbmdSZWYiLCJmaXJzdFRpbWVSZWYiLCJzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmIiwiYWN0aXZlU3RyZWFtQ2hhdElkUmVmIiwiY2xlYXJTdHJlYW1VaVJlZiIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJhY3RpdmVMb2FkaW5ncyIsInNldEFjdGl2ZUxvYWRpbmdzIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJhY3RpdmVTZXNzaW9uSWQiLCJzZXRBY3RpdmVTZXNzaW9uSWQiLCJpc01vdW50ZWRSZWYiLCJsYXN0SGFuZGxlZFRlcm1pbmFsUmVmIiwiaXNXZWJTZWFyY2hBY3RpdmVSZWYiLCJpc0RlZXBTZWFyY2hBY3RpdmVSZWYiLCJjb250ZXh0UmVmIiwiX3VzZUNoYXRNZXNzYWdlcyIsImxvYWRpbmdNZXNzYWdlcyIsImlzTG9hZGluZ01vcmVNZXNzYWdlcyIsImxvYWRNZXNzYWdlcyIsImFkZE1lc3NhZ2UiLCJyZW1vdmVNZXNzYWdlIiwiaGFuZGxlU2Nyb2xsIiwiY29tbWl0VG9TZXNzaW9uIiwiaXMiLCJkcm9wRnJvbVNlc3Npb24iLCJtZXNzYWdlSWQiLCJjbGVhclNlc3Npb25UYWlsIiwic2V0TWVzc2FnZXMiLCJzZXQiLCJhY3RpdmVTZXNzaW9uTWV0YSIsIl9hY3RpdmVTZXNzaW9uTWV0YSRmaSIsInN0YXR1cyIsImlzVGVybWluYWwiLCJrZXkiLCJmaW5pc2hlZEF0IiwidGFpbCIsImdldE1lc3NhZ2VzIiwiaGFzU3RhbGVQbGFjZWhvbGRlciIsIm1zZyIsImN1c3RvbUV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJkZXRhaWwiLCJkb2N1bWVudCIsImRpc3BhdGNoRXZlbnQiLCJtYXJrVW5yZWFkIiwiaXNBY3RpdmUiLCJoYW5kbGVTdHJlYW1FcnJvciIsImN0eCIsImVycm9yTWVzc2FnZSIsImVycm9yUmF3TWVzc2FnZSIsIl9lcnJvclJhd01lc3NhZ2UkbWF0YyIsIl9lcnJvclJhd01lc3NhZ2UkbWF0YzIiLCJwbGFjZWhvbGRlcklkIiwiY2xlYXIiLCJ1c2VkIiwiaXNFcnJvciIsImRhdGUiLCJEYXRlIiwidXNlciIsIkFTU0lTVEFOVCIsImhhbmRsZVN0cmVhbVVwZGF0ZSIsImNvbnRlbnQiLCJwbGFjZWhvbGRlckV4aXN0cyIsInN0YXJ0Iiwic2V0VGV4dCIsImhhbmRsZVN0cmVhbUZpbmlzaCIsIl9yZWY1IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJzb3VyY2VzIiwibWVtb3J5U2Vzc2lvbklkIiwic3VnZ2VzdGlvbnMiLCJjb21wbGV0ZWRBZ2VudElkIiwiX3ByZXZpb3VzTWVzc2FnZSRhcHByIiwiX3dpbmRvdyR0YXNrUGFuZWwiLCJfY3JlYXRlQWdlbnRGb2xsb3dVcCIsIl9lZGl0QWdlbnRGb2xsb3dVcCIsInRlbXBNZXNzYWdlSWQiLCJ0YXNrVXJsUmVnZXgiLCJtYXRjaGVzIiwiY29udGVudFRvQWRkIiwicHJldmlvdXNNZXNzYWdlIiwiaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSIsIlRBU0tfQ1JFQVRJT05fVE9PTFMiLCJUQVNLX0VESVRfVE9PTFMiLCJUQVNLX0RFTEVURV9UT09MUyIsIndhc1Rhc2tDcmVhdGlvbiIsIndhc1Rhc2tFZGl0Iiwid2FzVGFza0RlbGV0ZSIsIndhc0NyZWF0ZUFnZW50QXBwcm92ZWQiLCJ3YXNDb25maWd1cmVBZ2VudEFjY2Vzc0FwcHJvdmVkIiwiY3JlYXRlQWdlbnRGb2xsb3dVcCIsImNvbmZpZ3VyZWRBZ2VudElkIiwid2FzRWRpdEFnZW50QXBwcm92ZWQiLCJlZGl0QWdlbnRGb2xsb3dVcCIsImZyb21TdHJlYW0iLCJmcm9tQXJncyIsInJlc29sdmVkQWdlbnRJZCIsInRhc2tJZHNGcm9tVXJscyIsInRhc2tJZHNGcm9tRGVsZXRlQXBwcm92YWwiLCJ0YXNrSWRzRnJvbURlbGV0aW9uVGV4dCIsInRhc2tJZHNGb3JEYXNoYm9hcmQiLCJzaG91bGRTeW5jRGFzaGJvYXJkIiwidGFza0lkcyIsInRhYiIsInRhYlNlZ21lbnQiLCJsYXN0UHJvamVjdE1lc3NhZ2UiLCJjb250ZXh0UHJvamVjdElkUmF3IiwiY29udGV4dFByb2plY3RJZCIsInBhdGhNYXRjaCIsInJvdXRlUHJvamVjdElkIiwiaXNPblByb2plY3RSb3V0ZSIsIl93aW5kb3ckbmV3UHJvamVjdERhcyIsIl93aW5kb3ckbmV3UHJvamVjdERhczIiLCJfd2luZG93JG5ld1Byb2plY3REYXMzIiwiX3dpbmRvdyRuZXdQcm9qZWN0RGFzNCIsIl93aW5kb3ckbmV3UHJvamVjdERhczUiLCJfd2luZG93JG5ld1Byb2plY3REYXM2Iiwib3BlblRhc2tQYW5lbElkIiwibWFudWFsQXBwcm92YWwiLCJtYW51YWxXYXNUYXNrRWRpdCIsIm1hbnVhbFdhc1Rhc2tEZWxldGUiLCJfbWFudWFsQXBwcm92YWwkdG9vbEEiLCJtYW51YWxQc2V1ZG9BY3Rpb24iLCJhZmZlY3RlZFRhc2tJZHMiLCJfd2luZG93JHRhc2tQYW5lbDIiLCJfd2luZG93JHRhc2tQYW5lbDIkcmUiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImxlbmd0aCIsImFicnVwdCIsIlJlZ0V4cCIsIl90b0NvbnN1bWFibGVBcnJheSIsIm1hdGNoQWxsIiwibSIsImF0IiwiYXBwcm92YWxTdGF0dXMiLCJ3aW5kb3ciLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTIiwiYWlDaGF0SGl0bE9wdGlvbiIsImFnZW50X3R5cGUiLCJhY3Rpb25fdHlwZSIsImRlY2lzaW9uIiwib3B0aW9uIiwiY3JlYXRlZF9hZ2VudF9pZCIsInNlbnQiLCJyZXBsYWNlIiwidXJsIiwibG9jYXRpb24iLCJwYXRobmFtZSIsIm5ld1Byb2plY3REYXNoYm9hcmQiLCJhZGRFeGlzdGluZ1Rhc2tUb0Rhc2hib2FyZCIsImNhbGwiLCJlZGl0RXhpc3RpbmdUYXNrSW5EYXNoYm9hcmQiLCJkZWxldGVFeGlzdGluZ1Rhc2tGcm9tRGFzaGJvYXJkIiwidGFza1BhbmVsIiwidG9vbEFyZ3MiLCJyZWZldGNoVGFzayIsInRoZW4iLCJjaGF0QWdlbnQiLCJlcnIiLCJlcnJvciIsInN0b3AiLCJfeCIsIl94MiIsIl94MyIsIl94NCIsIl94NSIsIl94NiIsIl94NyIsImFwcGx5IiwiYXJndW1lbnRzIiwiaGFuZGxlU3RyZWFtU3RvcCIsImlzRnJvbnRlbmRDYW5jZWxsZWQiLCJzZXRUaW1lb3V0IiwiaGFuZGxlQXBwcm92YWxSZXF1aXJlZCIsImFjY3VtdWxhdGVkQ29udGVudCIsIl9hcHByb3ZhbCRwZW5kaW5nX2FjdCIsImhpdGxDb250ZXh0Iiwib3JpZ2luYWxfdGhyZWFkX2lkIiwibWVzc2FnZVRleHQiLCJtYW51YWxfYXBwcm92YWxfZGV0ZWN0ZWQiLCJfYXBwcm92YWwkcGVuZGluZ19hY3QyIiwiX3JlZjYiLCJfdG9vbF9uYW1lIiwiX3Rvb2xfYXJncyIsImZpcnN0QWN0aW9uIiwiX3VzZU9yY2hlc3RyYXRvclN0cmVhIiwib25TdHJlYW1VcGRhdGUiLCJvbkZpbmlzaFN0cmVhbSIsIm9uU3RvcCIsIm9uQXBwcm92YWxSZXF1aXJlZCIsImFza01haWEiLCJ3YWl0aW5nUmVzcG9uc2UiLCJpc0xvYWRpbmciLCJpc1dyaXRpbmciLCJsb2FkaW5nTWVzc2FnZSIsInN0cmVhbUFjdGl2aXR5IiwidXBkYXRlU3RyZWFtQWN0aXZpdHkiLCJzdG9wU3RyZWFtaW5nIiwiY3VycmVudFByb2plY3QiLCJzZW5kTWVzc2FnZSIsIl9yZWY3IiwiX2NhbGxlZTIiLCJmYXFJZCIsImFnZW50U3VnZ2VzdGlvbklkIiwibWVudGlvbnMiLCJmdWFJZCIsInNjSWQiLCJfbWVzc2FnZXNSZWYkY3VycmVudCIsIndpbGxTdGFydE5ld1N0cmVhbSIsIl9ub3JtYWxpemVTZW5kTWVzc2FnZSIsImVmZmVjdGl2ZU1lbnRpb25zIiwiY29udGV4dE1lc3NhZ2UiLCJwYXlsb2FkRnVhSWQiLCJwYXlsb2FkU2NJZCIsInBheWxvYWRDb250ZXh0RGF0YSIsImRpc3BsYXlNZXNzYWdlIiwibmV3TWVzc2FnZUlkIiwibGFzdE1lc3NhZ2VXaXRoUHJvamVjdCIsImN1cnJlbnRBZ2VudEZyb21NZXNzYWdlcyIsInN0cmVhbWluZ1BsYWNlaG9sZGVySWQiLCJmaW5hbE1lc3NhZ2UiLCJfb3B0aW9ucyRwcm9qZWN0Q2hhbmciLCJfY29udGV4dFJlZiRjdXJyZW50JHAiLCJoaXN0b3J5IiwiX2NvbnRleHRSZWYkY3VycmVudCIsImN0eENoaXBzUHJvamVjdCIsImN0eFRhc2siLCJwcm9qZWN0VG9SZXF1ZXN0IiwicHJvamVjdHMiLCJwYXlsb2FkRmFxSWQiLCJwYXlsb2FkQWdlbnRTdWdnZXN0aW9uSWQiLCJwYXlsb2FkRGF0YSIsIl9jb250ZXh0MiIsImdldEFjdGl2ZUNvdW50Iiwic2hvdyIsInNldmVyaXR5IiwiY29udGV4dERhdGEiLCJwbUFpVHlwZWRUZXh0IiwiVVNFUiIsInByb2plY3RDaGFuZ2VkIiwiaW5jb21lVHlwZSIsImhpc3RvcnlNZXNzYWdlIiwiYWdlbnRUeXBlIiwibGFuZyIsInVzZXJJZCIsImxhc3ROYW1lIiwiY29tcGFueUlkIiwiY29tcGFueV9pZCIsImFnZW50TmFtZSIsImZlZUlkIiwidGFza05hbWUiLCJlbnRpdHkiLCJhZ2VudEVudGl0eSIsIl94OCIsIl94OSIsIl94MCIsIl94MSIsIl94MTAiLCJfeDExIiwiX3gxMiIsImNoYW5nZVByb2plY3QiLCJfcHJvamVjdCRpZDIiLCJfY2hpcHNQcm9qZWN0JHByb2plY3QzIiwib3B0aW9uSWQiLCJoYW5kbGVGZWVkYmFjayIsIl9yZWY4IiwiX2NhbGxlZTMiLCJmZWVkYmFja1Byb3AiLCJjaGF0TWVzc2FnZUlkIiwicmVzcG9uc2UiLCJfY29udGV4dDMiLCJDaGF0cyIsIndhc0hlbHBmdWxDaGF0IiwiVEhVTUJTX1VQIiwid2FzSGVscGZ1bCIsIl94MTMiLCJfeDE0IiwiaGFuZGxlQXBwcm92YWxEZWNpc2lvbiIsIl9yZWY5IiwiX2NhbGxlZTQiLCJlZGl0ZWRBY3Rpb25zIiwibWVzc2FnZVdpdGhBcHByb3ZhbCIsImZvdW5kU2Vzc2lvbklkIiwibmV3U3RhdHVzIiwiaXNBY3RpdmVTZXNzaW9uIiwic3RyZWFtTWVzc2FnZUlkIiwiaGl0bEN0eCIsInJlbGVhc2VBY3RpdmVQcm9jZXNzaW5nIiwicmVzdWx0IiwiX2NvbnRleHQ0Iiwic3RhcnRDb250aW51ZVN0cmVhbSIsImNvbnRpbnVlUmVxdWVzdCIsImhpdGxFeGVjdXRpb25Db250ZXh0IiwiY2FsbGJhY2tzIiwiZmluaXNoUGF5bG9hZCIsImFwcHJvdmFsUGF5bG9hZCIsInN0YXJ0ZWQiLCJyZWFzb24iLCJfeDE1IiwiX3gxNiIsIl94MTciLCJpbml0aWFsaXplQ2hhdCIsIl9jYWxsZWU1IiwiX3VzZXJJbml0aWFsTWVzc2FnZSRtIiwiX3VzZXJJbml0aWFsTWVzc2FnZSRhIiwiX3JlZjEiLCJfcmVzb2x2ZVByb2plY3RUb1JlcXUiLCJfY3R4UHJvamVjdCRpZCIsIl9jdHhDbGllbnQkaWQiLCJfY3R4VGFzayRpZCIsIl9jdHhDaGlwc1Byb2plY3QkcHJvaiIsImhhc0luaXRpYWxNZXNzYWdlIiwiaGFzSW5pdGlhbEF0dGFjaG1lbnRzIiwiaGFzSW5pdGlhbEZhcSIsImhhc0luaXRpYWxGdWEiLCJoYXNJbml0aWFsU2MiLCJfY29udGV4dFJlZiRjdXJyZW50MiIsIl9jb250ZXh0NSIsIkJvb2xlYW4iLCJyZXNldENoYXQiLCJwcmV2aW91c1Nlc3Npb25JZCIsInN0b3BHZW5lcmF0aW9uIiwiaXNEaXNhYmxlZCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy91c2VDaGF0TWFuYWdlci91c2VDaGF0TWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSByYWRpeCAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tbmVzdGVkLXRlcm5hcnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRlZC1vcHRpb25hbC1jaGFpbiAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCdcbmltcG9ydCB7IHVzZUNoYXRNZXNzYWdlcyB9IGZyb20gJy4uL3VzZUNoYXRNZXNzYWdlcydcbmltcG9ydCB7IHVzZU9yY2hlc3RyYXRvclN0cmVhbSB9IGZyb20gJy4uL3VzZU9yY2hlc3RyYXRvclN0cmVhbSdcbmltcG9ydCB7IHVzZVQgfSBmcm9tICcuLi91c2VUJ1xuaW1wb3J0IHsgQXR0YWNobWVudEZpbGUgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL21vbGVjdWxlcy9DaGF0Rm9vdGVyL0NoYXRGb290ZXInXG5pbXBvcnQgeyBTZW5kTWVzc2FnZU9wdGlvbnMsIFVzZUNoYXRNYW5hZ2VyUHJvcHMgfSBmcm9tICcuL3VzZUNoYXRNYW5hZ2VyLmludGVyZmFjZSdcbmltcG9ydCB7IHVzZVVzZXIsIENPUlVzZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0L2Nvci11c2VyJ1xuaW1wb3J0IHsgdXNlR2xvYmFsQ29udGV4dCB9IGZyb20gJy4uLy4uL2NvbnRleHQvZ2xvYmFsLWNvbnRleHQnXG5pbXBvcnQgeyBFVkVOVFMsIHVzZUV2ZW50IH0gZnJvbSAnLi4vdXNlRXZlbnQnXG5pbXBvcnQgbWFpYSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tYWlhJ1xuaW1wb3J0IHsgRmVlZGJhY2sgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL21vbGVjdWxlcy9NZXNzYWdlRmVlZGJhY2svTWVzc2FnZUZlZWRiYWNrJ1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2UsIENoYXRNZXNzYWdlVXNlciwgQ2hhdEhpc3RvcnlSb2xlLCBBcHByb3ZhbFJlcXVlc3QsIFBlbmRpbmdBY3Rpb24gfSBmcm9tICcuLi8uLi90eXBlcy9DaGF0J1xuaW1wb3J0IHsgQ29udGV4dE1lbnRpb24sIENvbnRleHRNZXNzYWdlLCBidWlsZENvbnRleHRNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvY29udGV4dE1lbnRpb24nXG5pbXBvcnQgeyBmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5IH0gZnJvbSAnLi4vLi4vdXRpbHMvZm9ybWF0UXVpY2tBY3Rpb25NZXNzYWdlJ1xuXG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vdHlwZXMvUHJvamVjdCdcbmltcG9ydCB7IHVzZVByb2plY3RzIH0gZnJvbSAnLi4vdXNlUHJvamVjdHMnXG5pbXBvcnQgeyB1c2VUYWJUYXNrRGVmYXVsdCB9IGZyb20gJy4uL3VzZVRhYlRhc2tEZWZhdWx0J1xuaW1wb3J0IHsgVEFTS19VUkxfUkVHRVhfUEFUVEVSTiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy90YXNrVXJscydcbmltcG9ydCB7IGZldGNoQWdlbnREZXRhaWwgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tYWlhL0FnZW50cy9mZXRjaEFnZW50RGV0YWlsJ1xuaW1wb3J0IHsgYnVpbGRIaXRsQWN0aW9uVHlwZUxpc3QsIGdldEhpdGxBbmFseXRpY3NBZ2VudFR5cGUgfSBmcm9tICcuLi8uLi91dGlscy9oaXRsQW5hbHl0aWNzJ1xuaW1wb3J0IHsgdHlwZSBIaXRsRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4uLy4uL3V0aWxzL3N0cmVhbUFjdGl2aXR5TWVzc2FnZXMnXG5pbXBvcnQgeyBzZXNzaW9uU3RyZWFtaW5nVGV4dCB9IGZyb20gJy4uLy4uL3N0b3JlL3Nlc3Npb25zL3Nlc3Npb25TdHJlYW1pbmdUZXh0J1xuaW1wb3J0IHsgdXNlU2Vzc2lvbnNTdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3Nlc3Npb25zL3VzZVNlc3Npb25zU3RvcmUnXG5pbXBvcnQgeyB1c2VTZXNzaW9uTWV0YSB9IGZyb20gJy4uLy4uL3N0b3JlL3Nlc3Npb25zL3VzZVNlc3Npb25NZXRhJ1xuaW1wb3J0IHsgc2Vzc2lvblN0cmVhbU1hbmFnZXIsIE1BWF9DT05DVVJSRU5UX1NUUkVBTVMgfSBmcm9tICcuLi8uLi9zdG9yZS9zZXNzaW9ucy9zZXNzaW9uU3RyZWFtTWFuYWdlcidcbmltcG9ydCB7IGFjdGl2ZVZpZXcgfSBmcm9tICcuLi8uLi9zdG9yZS9zZXNzaW9ucy9hY3RpdmVWaWV3J1xuaW1wb3J0IHsgbm90aWZ5U2Vzc2lvbkZpbmlzaGVkSW5CYWNrZ3JvdW5kIH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvc2Vzc2lvbk5vdGlmaWNhdGlvbnMnXG5pbXBvcnQgeyBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkIH0gZnJvbSAnLi4vLi4vdXRpbHMvc3RyZWFtQWN0aXZpdHlNZXNzYWdlcydcbmltcG9ydCB0eXBlIHsgU3RyZWFtQ29udGV4dCB9IGZyb20gJy4uL3VzZU9yY2hlc3RyYXRvclN0cmVhbS91c2VPcmNoZXN0cmF0b3JTdHJlYW0uaW50ZXJmYWNlJ1xuXG50eXBlIEF0dGFjaG1lbnRzT3JPcHRpb25zID0gQXR0YWNobWVudEZpbGVbXSB8IFNlbmRNZXNzYWdlT3B0aW9uc1xuXG5jb25zdCBub3JtYWxpemVTZW5kTWVzc2FnZUFyZ3MgPSAoYXR0YWNobWVudHNPck9wdGlvbnM/OiBBdHRhY2htZW50c09yT3B0aW9ucykgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShhdHRhY2htZW50c09yT3B0aW9ucykpIHtcbiAgICByZXR1cm4geyBhdHRhY2htZW50czogYXR0YWNobWVudHNPck9wdGlvbnMsIG9wdGlvbnM6IHt9IGFzIFNlbmRNZXNzYWdlT3B0aW9ucyB9XG4gIH1cblxuICBjb25zdCBvcHRpb25zOiBTZW5kTWVzc2FnZU9wdGlvbnMgPSBhdHRhY2htZW50c09yT3B0aW9ucyA/PyB7fVxuICByZXR1cm4geyBhdHRhY2htZW50czogb3B0aW9ucy5hdHRhY2htZW50cyA/PyBbXSwgb3B0aW9ucyB9XG59XG5cbi8qKiBjaGlwc1Byb2plY3QgZXMgbGEgZnVlbnRlIGRlIHZlcmRhZCBkZWwgcGluIHZpc2libGU7IHNpIG5vIGhheSBwaW4sIHJlc3RhdXJhciBkZXNkZSBoaXN0b3JpYWwuICovXG5jb25zdCByZXNvbHZlUHJvamVjdFRvUmVxdWVzdCA9IChcbiAgY2hpcHNQcm9qZWN0OiB7IHByb2plY3RJZD86IHN0cmluZyB9IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbGFzdE1lc3NhZ2VQcm9qZWN0SWQ6IG51bWJlciB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbik6IG51bWJlciB8IG51bGwgPT4ge1xuICBjb25zdCBjaGlwc1Byb2plY3RJZCA9IGNoaXBzUHJvamVjdD8ucHJvamVjdElkID8gTnVtYmVyKGNoaXBzUHJvamVjdC5wcm9qZWN0SWQpIDogbnVsbFxuICBpZiAoY2hpcHNQcm9qZWN0SWQgIT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUoY2hpcHNQcm9qZWN0SWQpKSB7XG4gICAgcmV0dXJuIGNoaXBzUHJvamVjdElkXG4gIH1cbiAgaWYgKGxhc3RNZXNzYWdlUHJvamVjdElkICE9IG51bGwpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIobGFzdE1lc3NhZ2VQcm9qZWN0SWQpXG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYXJzZWQpID8gcGFyc2VkIDogbnVsbFxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmNvbnN0IHJlc29sdmVDbGllbnRQYXlsb2FkID0gKFxuICBjdHhDbGllbnQ6IHsgaWQ/OiBudW1iZXI7IG5hbWU/OiBzdHJpbmcgfSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGN0eFByb2plY3Q6IFByb2plY3QgfCBudWxsIHwgdW5kZWZpbmVkXG4pOiB7IGNsaWVudElkPzogbnVtYmVyOyBjbGllbnROYW1lPzogc3RyaW5nIH0gPT4ge1xuICBpZiAoY3R4Q2xpZW50Py5pZCkge1xuICAgIHJldHVybiB7IGNsaWVudElkOiBjdHhDbGllbnQuaWQsIC4uLihjdHhDbGllbnQubmFtZSA/IHsgY2xpZW50TmFtZTogY3R4Q2xpZW50Lm5hbWUgfSA6IHt9KSB9XG4gIH1cbiAgaWYgKGN0eFByb2plY3Q/LmNsaWVudElkICE9IG51bGwpIHtcbiAgICByZXR1cm4geyBjbGllbnRJZDogTnVtYmVyKGN0eFByb2plY3QuY2xpZW50SWQpIH1cbiAgfVxuICBpZiAoY3R4UHJvamVjdD8uY2xpZW50Py5pZCkge1xuICAgIHJldHVybiB7XG4gICAgICBjbGllbnRJZDogY3R4UHJvamVjdC5jbGllbnQuaWQsXG4gICAgICAuLi4oY3R4UHJvamVjdC5jbGllbnQubmFtZSA/IHsgY2xpZW50TmFtZTogY3R4UHJvamVjdC5jbGllbnQubmFtZSB9IDoge30pLFxuICAgIH1cbiAgfVxuICByZXR1cm4ge31cbn1cblxuY29uc3Qgbm9ybWFsaXplQXNzaXN0YW50QXR0YWNobWVudHMgPSAocmF3QXR0YWNobWVudHM6IHVua25vd24pOiBBdHRhY2htZW50RmlsZVtdID0+IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJhd0F0dGFjaG1lbnRzKSkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcmV0dXJuIHJhd0F0dGFjaG1lbnRzXG4gICAgLmZpbHRlcigoYXR0YWNobWVudCk6IGF0dGFjaG1lbnQgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4gISFhdHRhY2htZW50ICYmIHR5cGVvZiBhdHRhY2htZW50ID09PSAnb2JqZWN0JylcbiAgICAubWFwKChhdHRhY2htZW50LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9XG4gICAgICAgIHR5cGVvZiBhdHRhY2htZW50Lm5hbWUgPT09ICdzdHJpbmcnICYmIGF0dGFjaG1lbnQubmFtZS50cmltKCkgPyBhdHRhY2htZW50Lm5hbWUudHJpbSgpIDogYGZpbGUtJHtpbmRleCArIDF9YFxuICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiBhdHRhY2htZW50LnR5cGUgPT09ICdzdHJpbmcnICYmIGF0dGFjaG1lbnQudHlwZS50cmltKCkgPyBhdHRhY2htZW50LnR5cGUudHJpbSgpIDogJ3BkZidcbiAgICAgIGNvbnN0IG1pbWVUeXBlID0gdHlwZW9mIGF0dGFjaG1lbnQubWltZV90eXBlID09PSAnc3RyaW5nJyA/IGF0dGFjaG1lbnQubWltZV90eXBlIDogJydcbiAgICAgIGNvbnN0IGZ1bGxGaWxlTmFtZSA9IG5hbWUuaW5jbHVkZXMoJy4nKSA/IG5hbWUgOiBgJHtuYW1lfS4ke3R5cGV9YFxuICAgICAgY29uc3QgbnVtZXJpY1NpemUgPVxuICAgICAgICB0eXBlb2YgYXR0YWNobWVudC5zaXplID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gYXR0YWNobWVudC5zaXplXG4gICAgICAgICAgOiBOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKGF0dGFjaG1lbnQuc2l6ZSkpXG4gICAgICAgICAgICA/IE51bWJlcihhdHRhY2htZW50LnNpemUpXG4gICAgICAgICAgICA6IDBcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsZTogbmV3IEZpbGUoW10sIGZ1bGxGaWxlTmFtZSwgeyB0eXBlOiBtaW1lVHlwZSB9KSxcbiAgICAgICAgaWQ6XG4gICAgICAgICAgdHlwZW9mIGF0dGFjaG1lbnQuaWQgPT09ICdzdHJpbmcnICYmIGF0dGFjaG1lbnQuaWQudHJpbSgpXG4gICAgICAgICAgICA/IGF0dGFjaG1lbnQuaWRcbiAgICAgICAgICAgIDogYGFzc2lzdGFudC1maWxlLSR7aW5kZXh9LSR7ZnVsbEZpbGVOYW1lfWAsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHNpemU6IG51bWVyaWNTaXplLFxuICAgICAgICB0eXBlLFxuICAgICAgICB1cmxfb3JpZ2luYWw6IHR5cGVvZiBhdHRhY2htZW50LnVybF9vcmlnaW5hbCA9PT0gJ3N0cmluZycgPyBhdHRhY2htZW50LnVybF9vcmlnaW5hbCA6IHVuZGVmaW5lZCxcbiAgICAgICAgdXJsX3RodW1ibmFpbDogdHlwZW9mIGF0dGFjaG1lbnQudXJsX3RodW1ibmFpbCA9PT0gJ3N0cmluZycgPyBhdHRhY2htZW50LnVybF90aHVtYm5haWwgOiB1bmRlZmluZWQsXG4gICAgICAgIHVybF9maWxlOiB0eXBlb2YgYXR0YWNobWVudC51cmxfZmlsZSA9PT0gJ3N0cmluZycgPyBhdHRhY2htZW50LnVybF9maWxlIDogdW5kZWZpbmVkLFxuICAgICAgICByb2xlOiBhdHRhY2htZW50LnJvbGUgPT09ICdhc3Npc3RhbnQnID8gJ2Fzc2lzdGFudCcgOiAndXNlcicsXG4gICAgICB9XG4gICAgfSlcbn1cblxuLyoqIEV4dHJhZSB0YXNrX2lkcyBkZSBsb3MgdG9vbF9hcmdzIGRlIHBlbmRpbmdfYWN0aW9ucywgY3VicmllbmRvIGxhcyBmb3JtYXMgY29tdW5lczpcbiAqICAtIGB7IHRhc2tfaWQgfWAgbyBgeyBpZCB9YFxuICogIC0gYHsgdGFza19pZHM6IFtdIH1gXG4gKiAgLSBgeyB0YXNrczogW3sgdGFza19pZHxpZCB9LCAuLi5dIH1gXG4gKiAgw5p0aWwgcGFyYSB0b29scyBkZSBlZGl0L2Fzc2lnbi9kZWxldGUgY3VhbmRvIGxhIHJlc3B1ZXN0YSBkZWwgTExNIG5vIGluY2x1eWUgVVJMcyAvdGFza3MvLi4uL2RldGFpbC4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RUYXNrSWRzRnJvbVBlbmRpbmdBY3Rpb25zQXJncyhwZW5kaW5nQWN0aW9uczogUGVuZGluZ0FjdGlvbltdKTogbnVtYmVyW10ge1xuICBjb25zdCBpZHM6IG51bWJlcltdID0gW11cbiAgY29uc3QgcHVzaElkID0gKHJhdzogdW5rbm93bikgPT4ge1xuICAgIGlmIChyYXcgPT0gbnVsbCkgcmV0dXJuXG4gICAgY29uc3QgbiA9IHBhcnNlSW50KFN0cmluZyhyYXcpLCAxMClcbiAgICBpZiAoIU51bWJlci5pc05hTihuKSkgaWRzLnB1c2gobilcbiAgfVxuICBwZW5kaW5nQWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgaWYgKCFhY3Rpb24gfHwgdHlwZW9mIGFjdGlvbiAhPT0gJ29iamVjdCcpIHJldHVyblxuICAgIGNvbnN0IGFyZ3MgPSBhY3Rpb24udG9vbF9hcmdzXG4gICAgaWYgKCEoYXJncyAmJiB0eXBlb2YgYXJncyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoYXJncykpKSByZXR1cm5cbiAgICBjb25zdCByZWMgPSBhcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgcHVzaElkKHJlYy50YXNrX2lkID8/IHJlYy5pZClcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWMudGFza19pZHMpKSB7XG4gICAgICByZWMudGFza19pZHMuZm9yRWFjaChwdXNoSWQpXG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlYy50YXNrcykpIHtcbiAgICAgIHJlYy50YXNrcy5mb3JFYWNoKHQgPT4ge1xuICAgICAgICBpZiAodCAmJiB0eXBlb2YgdCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodCkpIHtcbiAgICAgICAgICBjb25zdCB0cmVjID0gdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICAgIHB1c2hJZCh0cmVjLnRhc2tfaWQgPz8gdHJlYy5pZClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH0pXG4gIHJldHVybiBpZHNcbn1cblxuLyoqIHRhc2tfaWQgLyB0YXNrX2lkcyBlbiBwZW5kaW5nX2FjdGlvbnMgZGUgZGVsZXRlXyogKGxhIHJlc3B1ZXN0YSBwdWVkZSBubyBpbmNsdWlyIFVSTHMgL3Rhc2tzL+KApi9kZXRhaWwpLiAqL1xuZnVuY3Rpb24gZXh0cmFjdFRhc2tJZHNGcm9tRGVsZXRlUGVuZGluZ0FjdGlvbnMocGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXSk6IG51bWJlcltdIHtcbiAgY29uc3QgaWRzOiBudW1iZXJbXSA9IFtdXG4gIHBlbmRpbmdBY3Rpb25zLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICBpZiAoIWFjdGlvbiB8fCB0eXBlb2YgYWN0aW9uICE9PSAnb2JqZWN0JykgcmV0dXJuXG4gICAgY29uc3QgYXJncyA9IGFjdGlvbi50b29sX2FyZ3NcbiAgICBpZiAoIShhcmdzICYmIHR5cGVvZiBhcmdzID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShhcmdzKSkpIHJldHVyblxuICAgIGNvbnN0IHJlYyA9IGFyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICBpZiAoYWN0aW9uLnRvb2xfbmFtZSA9PT0gJ2RlbGV0ZV90YXNrJykge1xuICAgICAgY29uc3QgcmF3ID0gcmVjLnRhc2tfaWQgPz8gcmVjLmlkXG4gICAgICBpZiAocmF3ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgbiA9IHBhcnNlSW50KFN0cmluZyhyYXcpLCAxMClcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIGlkcy5wdXNoKG4pXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhY3Rpb24udG9vbF9uYW1lID09PSAnZGVsZXRlX3Rhc2tzX2JhdGNoJykge1xuICAgICAgY29uc3QgbGlzdCA9IHJlYy50YXNrX2lkc1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICAgICAgbGlzdC5mb3JFYWNoKHRpZCA9PiB7XG4gICAgICAgICAgY29uc3QgbiA9IHBhcnNlSW50KFN0cmluZyh0aWQpLCAxMClcbiAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihuKSkgaWRzLnB1c2gobilcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHJldHVybiBpZHNcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEFnZW50SWRGcm9tRWRpdEFnZW50UGVuZGluZ0FjdGlvbnMocGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXSk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBlZGl0QWN0aW9uID0gcGVuZGluZ0FjdGlvbnMuZmluZChhID0+IChhLnRvb2xfbmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ2VkaXRfYWdlbnQnKVxuICBpZiAoXG4gICAgIWVkaXRBY3Rpb24gfHxcbiAgICAhZWRpdEFjdGlvbi50b29sX2FyZ3MgfHxcbiAgICB0eXBlb2YgZWRpdEFjdGlvbi50b29sX2FyZ3MgIT09ICdvYmplY3QnIHx8XG4gICAgQXJyYXkuaXNBcnJheShlZGl0QWN0aW9uLnRvb2xfYXJncylcbiAgKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBjb25zdCByZWMgPSBlZGl0QWN0aW9uLnRvb2xfYXJncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBjb25zdCByYXcgPSByZWMuYWdlbnRfaWQgPz8gcmVjLmFnZW50SWRcbiAgcmV0dXJuIHJhdyAhPSBudWxsID8gU3RyaW5nKHJhdykgOiBudWxsXG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RBZ2VudElkRnJvbVBlbmRpbmdBY3Rpb25zQnlUb29sTmFtZShwZW5kaW5nQWN0aW9uczogUGVuZGluZ0FjdGlvbltdLCB0b29sTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGFjdGlvbiA9IHBlbmRpbmdBY3Rpb25zLmZpbmQoYSA9PiAoYS50b29sX25hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09IHRvb2xOYW1lLnRvTG93ZXJDYXNlKCkpXG4gIGlmICghYWN0aW9uIHx8ICFhY3Rpb24udG9vbF9hcmdzIHx8IHR5cGVvZiBhY3Rpb24udG9vbF9hcmdzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGFjdGlvbi50b29sX2FyZ3MpKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBjb25zdCByZWMgPSBhY3Rpb24udG9vbF9hcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGNvbnN0IHJhdyA9IHJlYy5hZ2VudF9pZCA/PyByZWMuYWdlbnRJZCA/PyByZWMuaWRcbiAgcmV0dXJuIHJhdyAhPSBudWxsID8gU3RyaW5nKHJhdykgOiBudWxsXG59XG5cbi8qKiDDmmx0aW1vIHJlY3Vyc28gc2kgbm8gaGF5IGxpbmtzIG5pIHRvb2xfYXJncyBwYXJzZWFibGVzIChwLiBlai4gXCJJRCAqKjc1OTcxMDYqKlwiKS4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RUYXNrSWRzRnJvbUFzc2lzdGFudERlbGV0aW9uVGV4dCh0ZXh0OiBzdHJpbmcpOiBudW1iZXJbXSB7XG4gIGNvbnN0IGxhYmVsZWQgPSB0ZXh0Lm1hdGNoKC9cXGJJRFxccypcXCpcXCooXFxkKylcXCpcXCovaSlcbiAgaWYgKGxhYmVsZWQpIHtcbiAgICBjb25zdCBuID0gcGFyc2VJbnQobGFiZWxlZFsxXSwgMTApXG4gICAgcmV0dXJuIE51bWJlci5pc05hTihuKSA/IFtdIDogW25dXG4gIH1cbiAgY29uc3QgYm9sZCA9IHRleHQubWF0Y2goL1xcKlxcKihcXGR7NSx9KVxcKlxcKi8pXG4gIGlmIChib2xkKSB7XG4gICAgY29uc3QgbiA9IHBhcnNlSW50KGJvbGRbMV0sIDEwKVxuICAgIHJldHVybiBOdW1iZXIuaXNOYU4obikgPyBbXSA6IFtuXVxuICB9XG4gIHJldHVybiBbXVxufVxuXG5jb25zdCB1c2VTdGFibGVDYWxsYmFja3MgPSAoYXV0aFVzZXI6IENPUlVzZXIpID0+IHtcbiAgY29uc3QgY3VycmVudFVzZXIgPSB1c2VSZWY8Q2hhdE1lc3NhZ2VVc2VyPih7XG4gICAgaWQ6IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCksXG4gICAgbmFtZTogYXV0aFVzZXIuZmlyc3ROYW1lLFxuICAgIGF2YXRhcjogYXV0aFVzZXIucGljdHVyZSxcbiAgfSlcblxuICBpZiAoXG4gICAgY3VycmVudFVzZXIuY3VycmVudC5pZCAhPT0gYXV0aFVzZXIuaWQudG9TdHJpbmcoKSB8fFxuICAgIGN1cnJlbnRVc2VyLmN1cnJlbnQubmFtZSAhPT0gYXV0aFVzZXIuZmlyc3ROYW1lIHx8XG4gICAgY3VycmVudFVzZXIuY3VycmVudC5hdmF0YXIgIT09IGF1dGhVc2VyLnBpY3R1cmVcbiAgKSB7XG4gICAgY3VycmVudFVzZXIuY3VycmVudCA9IHtcbiAgICAgIGlkOiBhdXRoVXNlci5pZC50b1N0cmluZygpLFxuICAgICAgbmFtZTogYXV0aFVzZXIuZmlyc3ROYW1lLFxuICAgICAgYXZhdGFyOiBhdXRoVXNlci5waWN0dXJlLFxuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGN1cnJlbnRVc2VyOiBjdXJyZW50VXNlci5jdXJyZW50LFxuICB9XG59XG5cbmNvbnN0IGZpbmRNZXNzYWdlV2l0aEFwcHJvdmFsQnlUaHJlYWRJZHMgPSAoXG4gIHRocmVhZElkczogc3RyaW5nW10sXG4gIGFjdGl2ZU1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdXG4pOiB7IG1lc3NhZ2U6IENoYXRNZXNzYWdlOyBzZXNzaW9uSWQ6IHN0cmluZyB9IHwgbnVsbCA9PiB7XG4gIGNvbnN0IGZyb21BY3RpdmVWaWV3ID0gYWN0aXZlTWVzc2FnZXMuZmluZChtZXNzYWdlID0+XG4gICAgbWVzc2FnZS5hcHByb3ZhbD8ucGVuZGluZ19hY3Rpb25zPy5zb21lKGFjdGlvbiA9PiB0aHJlYWRJZHMuaW5jbHVkZXMoYWN0aW9uLnRocmVhZF9pZCkpXG4gIClcbiAgaWYgKGZyb21BY3RpdmVWaWV3Py5hcHByb3ZhbCkge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiBmcm9tQWN0aXZlVmlldyxcbiAgICAgIHNlc3Npb25JZDogZnJvbUFjdGl2ZVZpZXcuYXBwcm92YWwuc2Vzc2lvbl9pZCB8fCBhY3RpdmVWaWV3LmdldCgpIHx8ICcnLFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHsgbWVzc2FnZXMgfSA9IHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKVxuICBjb25zdCBzZXNzaW9uRW50cnkgPSBPYmplY3QuZW50cmllcyhtZXNzYWdlcykuZmluZCgoWywgc2Vzc2lvbk1lc3NhZ2VzXSkgPT5cbiAgICBzZXNzaW9uTWVzc2FnZXMuc29tZShtZXNzYWdlID0+XG4gICAgICBtZXNzYWdlLmFwcHJvdmFsPy5wZW5kaW5nX2FjdGlvbnM/LnNvbWUoYWN0aW9uID0+IHRocmVhZElkcy5pbmNsdWRlcyhhY3Rpb24udGhyZWFkX2lkKSlcbiAgICApXG4gIClcbiAgaWYgKHNlc3Npb25FbnRyeSkge1xuICAgIGNvbnN0IFtzZXNzaW9uSWQsIHNlc3Npb25NZXNzYWdlc10gPSBzZXNzaW9uRW50cnlcbiAgICBjb25zdCBmb3VuZCA9IHNlc3Npb25NZXNzYWdlcy5maW5kKG1lc3NhZ2UgPT5cbiAgICAgIG1lc3NhZ2UuYXBwcm92YWw/LnBlbmRpbmdfYWN0aW9ucz8uc29tZShhY3Rpb24gPT4gdGhyZWFkSWRzLmluY2x1ZGVzKGFjdGlvbi50aHJlYWRfaWQpKVxuICAgIClcbiAgICBpZiAoZm91bmQ/LmFwcHJvdmFsKSB7XG4gICAgICByZXR1cm4geyBtZXNzYWdlOiBmb3VuZCwgc2Vzc2lvbklkOiBmb3VuZC5hcHByb3ZhbC5zZXNzaW9uX2lkIHx8IHNlc3Npb25JZCB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IHVzZUNoYXRNYW5hZ2VyID0gKHtcbiAgY2hhdElkOiBpbml0aWFsQ2hhdElkLFxuICB1c2VySW5pdGlhbE1lc3NhZ2UsXG4gIG9uRXJyb3IsXG4gIGFnZW50cyA9IFtdLFxufTogVXNlQ2hhdE1hbmFnZXJQcm9wcykgPT4ge1xuICBjb25zdCB7IHQgfSA9IHVzZVQoKVxuICBjb25zdCBhdXRoVXNlciA9IHVzZVVzZXIoKVxuICBjb25zdCB7XG4gICAgcHJvamVjdCxcbiAgICBzZXRQcm9qZWN0LFxuICAgIGNsaWVudCxcbiAgICBzZXRDbGllbnQsXG4gICAgdGFzayxcbiAgICBzZXRUYXNrLFxuICAgIGFnZW50LFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZSxcbiAgICBjaGlwc1Byb2plY3QsXG4gICAgc2V0Q2hpcHNQcm9qZWN0LFxuICB9ID0gdXNlR2xvYmFsQ29udGV4dCgpXG4gIGNvbnN0IGV2ZW50ID0gdXNlRXZlbnQoKVxuICBjb25zdCB7IGZldGNoUHJvamVjdHMgfSA9IHVzZVByb2plY3RzKClcbiAgY29uc3QgeyBjdXJyZW50VXNlciB9ID0gdXNlU3RhYmxlQ2FsbGJhY2tzKGF1dGhVc2VyKVxuICBjb25zdCB7IGdldFRhYlRhc2tEZWZhdWx0IH0gPSB1c2VUYWJUYXNrRGVmYXVsdCgpXG5cbiAgLy8gREVCVUc6IHJhc3RyZWFyIGN1w6FuZG8gY2FtYmlhIGVsIGNvbnRleHRvIGdsb2JhbCBwYXJhIGNvcnJlbGFjaW9uYXIgY29uIGxvcyBlbnbDrW9zIGFsIG9yY2hlc3RyYXRvclxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnNvbGUuaW5mbygnW3VzZUNoYXRNYW5hZ2VyXSBjb250ZXh0IENIQU5HRUQ6Jywge1xuICAgICAgY2hpcHNQcm9qZWN0SWQ6IGNoaXBzUHJvamVjdD8ucHJvamVjdElkID8/IG51bGwsXG4gICAgICBjaGlwc1Byb2plY3ROYW1lOiBjaGlwc1Byb2plY3Q/LnByb2plY3ROYW1lID8/IG51bGwsXG4gICAgICBwcm9qZWN0UHJvcElkOiBwcm9qZWN0Py5pZCA/PyBudWxsLFxuICAgICAgY2xpZW50SWQ6IGNsaWVudD8uaWQgPz8gbnVsbCxcbiAgICAgIHRhc2tJZDogdGFzaz8uaWQgPz8gbnVsbCxcbiAgICB9KVxuICB9LCBbY2hpcHNQcm9qZWN0Py5wcm9qZWN0SWQsIHByb2plY3Q/LmlkLCBjbGllbnQ/LmlkLCB0YXNrPy5pZF0pXG4gIGNvbnN0IGN1cnJlbnRNZXNzYWdlSWQgPSB1c2VSZWYodXVpZHY0KCkpXG4gIGNvbnN0IGN1cnJlbnRVc2VyUXVlc3Rpb24gPSB1c2VSZWY8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgY3VycmVudENoYXRJZCA9IHVzZVJlZihpbml0aWFsQ2hhdElkIHx8IHV1aWR2NCgpKVxuICBjb25zdCByZXBvcnRlZEV2ZW50ID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBtZXNzYWdlc1JlZiA9IHVzZVJlZjxDaGF0TWVzc2FnZVtdPihbXSlcbiAgLyoqXG4gICAqIEd1YXJkYSBpbmZvIGRlbCDDumx0aW1vIGFwcHJvdmFsIG1hbnVhbCAoY3VhbmRvIGVsIHVzdWFyaW8gdGlwZWEgXCJzaVwiL1wibm9cIiBlbiBsdWdhclxuICAgKiBkZSBjbGlja2VhciBlbCBib3TDs24pLiBFbiBtYW51YWwgYXBwcm92YWwsIGBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkYCByZXRvcm5hIGVhcmx5XG4gICAqIHNpbiBhZ3JlZ2FyIHVuIG1lbnNhamUgY29uIGBhcHByb3ZhbGAsIGFzw60gcXVlIGxhIGzDs2dpY2EgZGUgcmVmZXRjaCBlbiBgb25TdHJlYW1GaW5pc2hgXG4gICAqIG5vIGxvIGRldGVjdGEgdsOtYSBgcHJldmlvdXNNZXNzYWdlLmFwcHJvdmFsYC4gTG8gZ3VhcmRhbW9zIGFjw6EgcGFyYSBjb25zdW1pcmxvIGRlc3B1w6lzLlxuICAgKi9cbiAgY29uc3QgbGFzdE1hbnVhbEFwcHJvdmFsUmVmID0gdXNlUmVmPHtcbiAgICB0b29sTmFtZTogc3RyaW5nXG4gICAgdG9vbEFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbFxuICB9IHwgbnVsbD4obnVsbClcbiAgLyoqIENvbnRleHRvIGRlbCBtZW5zYWplIGRlIGFwcm9iYWNpw7NuIHByZXZpbyBhbCBlamVjdXRhciBjb250aW51ZS10aHJlYWQuICovXG4gIGNvbnN0IGhpdGxFeGVjdXRpb25Db250ZXh0UmVmID0gdXNlUmVmPEhpdGxFeGVjdXRpb25Db250ZXh0IHwgbnVsbD4obnVsbClcbiAgY29uc3QgaXNQcm9jZXNzaW5nUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBmaXJzdFRpbWVSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIC8qKiBJZCBkZWwgcGxhY2Vob2xkZXIgZGVsIG1lbnNhamUgZW4gc3RyZWFtaW5nIGFjdGl2byAoc2kgaGF5KS4gKi9cbiAgY29uc3Qgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICAvKipcbiAgICogQ2hhdCBhbCBxdWUgcGVydGVuZWNlIGVsIHN0cmVhbSBhY3R1YWxtZW50ZSBhY3Rpdm8uIFNpIGNhbWJpYSBlbCBjaGF0XG4gICAqIG1pZW50cmFzIHVuIHN0cmVhbSBlc3TDoSBlbiB2dWVsbywgZGVzY2FydGFtb3MgbG9zIHRva2VucyByZXNpZHVhbGVzXG4gICAqIHF1ZSBwdWVkYW4gbGxlZ2FyIGFudGVzIGRlIHF1ZSBlbCBhYm9ydCBzZSBjb21wbGV0ZS5cbiAgICovXG4gIGNvbnN0IGFjdGl2ZVN0cmVhbUNoYXRJZFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBjbGVhclN0cmVhbVVpUmVmID0gdXNlUmVmPCgpID0+IHZvaWQ+KCgpID0+IHVuZGVmaW5lZClcbiAgY29uc3QgW2FjdGl2ZUxvYWRpbmdzLCBzZXRBY3RpdmVMb2FkaW5nc10gPSB1c2VTdGF0ZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih7fSlcbiAgLyoqXG4gICAqIFNlc2nDs24gYWN0dWFsbWVudGUgdmlzaWJsZS4gU2UgbWFudGllbmUgZW4gc3RhdGUgKG5vIHNvbG8gZW4gcmVmKSBwYXJhIHF1ZVxuICAgKiBlbCBtb3RvciBkZSBzdHJlYW1pbmcgcHVlZGEgbGVlciByZWFjdGl2YW1lbnRlIGxvcyBmbGFncyBkZSBFU1RBIHNlc2nDs25cbiAgICogZGVzZGUgZWwgc3RvcmUsIG1pZW50cmFzIG90cmFzIHNpZ3VlbiBnZW5lcmFuZG8gZW4gYmFja2dyb3VuZC5cbiAgICovXG4gIGNvbnN0IFthY3RpdmVTZXNzaW9uSWQsIHNldEFjdGl2ZVNlc3Npb25JZF0gPSB1c2VTdGF0ZTxzdHJpbmc+KGN1cnJlbnRDaGF0SWQuY3VycmVudClcbiAgLyoqIFRydWUgbWllbnRyYXMgZXN0YSBpbnN0YW5jaWEgZXN0w6kgbW9udGFkYSAoZXZpdGEgc2V0U3RhdGUgdHJhcyBkZXNtb250YXIpLiAqL1xuICBjb25zdCBpc01vdW50ZWRSZWYgPSB1c2VSZWYodHJ1ZSlcbiAgLyoqIEV2aXRhIHJlY29uY2lsaWFyIGRvcyB2ZWNlcyBlbCBtaXNtbyBlc3RhZG8gdGVybWluYWwgZGUgdW5hIHNlc2nDs24uICovXG4gIGNvbnN0IGxhc3RIYW5kbGVkVGVybWluYWxSZWYgPSB1c2VSZWY8c3RyaW5nIHwgbnVsbD4obnVsbClcblxuICBjb25zdCBpc1dlYlNlYXJjaEFjdGl2ZVJlZiA9IHVzZVJlZihpc1dlYlNlYXJjaEFjdGl2ZSlcbiAgY29uc3QgaXNEZWVwU2VhcmNoQWN0aXZlUmVmID0gdXNlUmVmKGlzRGVlcFNlYXJjaEFjdGl2ZSlcbiAgLyoqIEV2aXRhIGNsb3N1cmVzIG9ic29sZXRhcyBjdWFuZG8gZWwgZm9vdGVyIGNvbnNlcnZhIHNlbmRNZXNzYWdlIGVudHJlIHJlbmRlcnMuICovXG4gIGNvbnN0IGNvbnRleHRSZWYgPSB1c2VSZWYoeyBjaGlwc1Byb2plY3QsIHByb2plY3QsIGNsaWVudCwgdGFzayB9KVxuICBjb250ZXh0UmVmLmN1cnJlbnQgPSB7IGNoaXBzUHJvamVjdCwgcHJvamVjdCwgY2xpZW50LCB0YXNrIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQgPSBpc1dlYlNlYXJjaEFjdGl2ZVxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50ID0gaXNEZWVwU2VhcmNoQWN0aXZlXG4gIH0sIFtpc1dlYlNlYXJjaEFjdGl2ZSwgaXNEZWVwU2VhcmNoQWN0aXZlXSlcblxuICBjb25zdCB7IGxvYWRpbmdNZXNzYWdlcywgbWVzc2FnZXMsIGlzTG9hZGluZ01vcmVNZXNzYWdlcywgbG9hZE1lc3NhZ2VzLCBhZGRNZXNzYWdlLCByZW1vdmVNZXNzYWdlLCBoYW5kbGVTY3JvbGwgfSA9XG4gICAgdXNlQ2hhdE1lc3NhZ2VzKHtcbiAgICAgIGNoYXRJZDogaW5pdGlhbENoYXRJZCB8fCBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgICBjdXJyZW50VXNlcixcbiAgICAgIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgICAgIG9uRXJyb3IsXG4gICAgICBhZ2VudHMsXG4gICAgfSlcblxuICBtZXNzYWdlc1JlZi5jdXJyZW50ID0gbWVzc2FnZXNcblxuICAvKipcbiAgICogRXNjcmliZSB1biBtZW5zYWplIGVuIGVsIHN0b3JlIHBvci1zZXNpw7NuIHksIHNpIGxhIHNlc2nDs24gZXMgbGEgYWN0aXZhLFxuICAgKiB0YW1iacOpbiBlbiBsYSB2aXN0YSBsb2NhbC4gUGVybWl0ZSBxdWUgc2VzaW9uZXMgZW4gYmFja2dyb3VuZCBhY3VtdWxlbiBzdVxuICAgKiByZXN1bHRhZG8gc2luIHBpc2FyIGVsIGNoYXQgcXVlIGVsIHVzdWFyaW8gZXN0w6EgbWlyYW5kby5cbiAgICovXG4gIGNvbnN0IGNvbW1pdFRvU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKFxuICAgIChzZXNzaW9uSWQ6IHN0cmluZywgbWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IHtcbiAgICAgIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5hZGRNZXNzYWdlKHNlc3Npb25JZCwgbWVzc2FnZSlcbiAgICAgIGlmIChpc01vdW50ZWRSZWYuY3VycmVudCAmJiBhY3RpdmVWaWV3LmlzKHNlc3Npb25JZCkpIHtcbiAgICAgICAgYWRkTWVzc2FnZShtZXNzYWdlKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2FkZE1lc3NhZ2VdXG4gIClcblxuICBjb25zdCBkcm9wRnJvbVNlc3Npb24gPSB1c2VDYWxsYmFjayhcbiAgICAoc2Vzc2lvbklkOiBzdHJpbmcsIG1lc3NhZ2VJZDogc3RyaW5nKSA9PiB7XG4gICAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkucmVtb3ZlTWVzc2FnZShzZXNzaW9uSWQsIG1lc3NhZ2VJZClcbiAgICAgIGlmIChpc01vdW50ZWRSZWYuY3VycmVudCAmJiBhY3RpdmVWaWV3LmlzKHNlc3Npb25JZCkpIHtcbiAgICAgICAgcmVtb3ZlTWVzc2FnZShtZXNzYWdlSWQpXG4gICAgICB9XG4gICAgfSxcbiAgICBbcmVtb3ZlTWVzc2FnZV1cbiAgKVxuXG4gIC8qKiBMaW1waWEgZWwgdGFpbCBlbiB2dWVsbyBkZSB1bmEgc2VzacOzbiAodHJhcyB0ZXJtaW5hcjsgZWwgYmFja2VuZCBwYXNhIGEgc2VyIGZ1ZW50ZSkuICovXG4gIGNvbnN0IGNsZWFyU2Vzc2lvblRhaWwgPSB1c2VDYWxsYmFjaygoc2Vzc2lvbklkOiBzdHJpbmcpID0+IHtcbiAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuc2V0TWVzc2FnZXMoc2Vzc2lvbklkLCBbXSlcbiAgfSwgW10pXG5cbiAgLy8gUmVnaXN0cmFyIGxhIHNlc2nDs24gdmlzaWJsZSBlbiBlbCB0cmFja2VyIGdsb2JhbCBwYXJhIHF1ZSBsb3MgY2FsbGJhY2tzIGRlbFxuICAvLyBtb3RvciAocXVlIHB1ZWRlbiBwZXJ0ZW5lY2VyIGEgdW5hIGluc3RhbmNpYSB5YSBkZXNtb250YWRhKSBzZXBhbiBjdcOhbCBlcyBsYVxuICAvLyBzZXNpw7NuIGFjdGl2YSBhY3R1YWwuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgYWN0aXZlVmlldy5zZXQoYWN0aXZlU2Vzc2lvbklkKVxuICB9LCBbYWN0aXZlU2Vzc2lvbklkXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlzTW91bnRlZFJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpc01vdW50ZWRSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICBpZiAoYWN0aXZlVmlldy5pcyhjdXJyZW50Q2hhdElkLmN1cnJlbnQpKSB7XG4gICAgICAgIGFjdGl2ZVZpZXcuc2V0KG51bGwpXG4gICAgICB9XG4gICAgfVxuICB9LCBbXSlcblxuICAvLyBSZWNvbmNpbGlhY2nDs246IHNpIGxhIHNlc2nDs24gYWN0aXZhIHRlcm1pbmEgKGNvbXBsZXRlL2Vycm9yL2NhbmNlbGxlZCkgcGVybyBlbFxuICAvLyBzdG9yZSBwb3Itc2VzacOzbiB0b2RhdsOtYSB0aWVuZSB1biBwbGFjZWhvbGRlciBkZSBzdHJlYW1pbmcsIHJlZnJlc2NhbW9zIGRlc2RlXG4gIC8vIGVsIGJhY2tlbmQuIFVzYW1vcyBlbCBzdG9yZSAobm8gbWVzc2FnZXNSZWYpOiBoYW5kbGVTdHJlYW1GaW5pc2ggbGltcGlhIGVsXG4gIC8vIHBsYWNlaG9sZGVyIGFow60gZGUgZm9ybWEgc8OtbmNyb25hOyBtZXNzYWdlc1JlZiBwdWVkZSBxdWVkYXIgc3RhbGUgdW4gcmVuZGVyXG4gIC8vIHBvcnF1ZSBzZXRTdGF0dXMgKFp1c3RhbmQpIHkgcmVtb3ZlTWVzc2FnZSAoUmVhY3QpIG5vIGJhdGNoYW4ganVudG9zLlxuICBjb25zdCBhY3RpdmVTZXNzaW9uTWV0YSA9IHVzZVNlc3Npb25NZXRhKGFjdGl2ZVNlc3Npb25JZClcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBzdGF0dXMgPSBhY3RpdmVTZXNzaW9uTWV0YT8uc3RhdHVzXG4gICAgaWYgKCFzdGF0dXMpIHJldHVyblxuICAgIGNvbnN0IGlzVGVybWluYWwgPSBzdGF0dXMgPT09ICdjb21wbGV0ZScgfHwgc3RhdHVzID09PSAnZXJyb3InIHx8IHN0YXR1cyA9PT0gJ2NhbmNlbGxlZCdcbiAgICBpZiAoIWlzVGVybWluYWwpIHJldHVyblxuICAgIGNvbnN0IGtleSA9IGAke2FjdGl2ZVNlc3Npb25JZH06JHtzdGF0dXN9OiR7YWN0aXZlU2Vzc2lvbk1ldGE/LmZpbmlzaGVkQXQgPz8gJyd9YFxuICAgIGlmIChsYXN0SGFuZGxlZFRlcm1pbmFsUmVmLmN1cnJlbnQgPT09IGtleSkgcmV0dXJuXG4gICAgbGFzdEhhbmRsZWRUZXJtaW5hbFJlZi5jdXJyZW50ID0ga2V5XG5cbiAgICBjb25zdCB0YWlsID0gdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLmdldE1lc3NhZ2VzKGFjdGl2ZVNlc3Npb25JZClcbiAgICBjb25zdCBoYXNTdGFsZVBsYWNlaG9sZGVyID0gdGFpbC5zb21lKG1zZyA9PiBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkKG1zZy5pZCkpXG4gICAgaWYgKGhhc1N0YWxlUGxhY2Vob2xkZXIpIHtcbiAgICAgIGxvYWRNZXNzYWdlcygpXG4gICAgfVxuICB9LCBbYWN0aXZlU2Vzc2lvbk1ldGE/LnN0YXR1cywgYWN0aXZlU2Vzc2lvbk1ldGE/LmZpbmlzaGVkQXQsIGFjdGl2ZVNlc3Npb25JZCwgbG9hZE1lc3NhZ2VzXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdjaGF0LWxvYWRpbmctbWVzc2FnZXMtY2hhbmdlZCcsIHtcbiAgICAgIGRldGFpbDogeyBsb2FkaW5nTWVzc2FnZXMgfSxcbiAgICB9KVxuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpXG4gIH0sIFtsb2FkaW5nTWVzc2FnZXNdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGluaXRpYWxDaGF0SWQgJiYgaW5pdGlhbENoYXRJZCAhPT0gY3VycmVudENoYXRJZC5jdXJyZW50KSB7XG4gICAgICAvLyBOTyBhYm9ydGFtb3MgZWwgc3RyZWFtIGFudGVyaW9yOiBwdWVkZSBzZWd1aXIgZ2VuZXJhbmRvIGVuIGJhY2tncm91bmQuXG4gICAgICAvLyBTb2xvIGNhbWJpYW1vcyBkZSBzZXNpw7NuIGFjdGl2YTsgZWwgbW90b3IgcnV0ZWEgY2FkYSBzdHJlYW0gcG9yIHN1XG4gICAgICAvLyBzZXNzaW9uSWQsIGFzw60gcXVlIGxvcyB0b2tlbnMgZGUgbGEgc2VzacOzbiBwcmV2aWEgc2lndWVuIGFwbGljw6FuZG9zZSBhXG4gICAgICAvLyBFU0Egc2VzacOzbiAoc3RvcmUpLCBubyBhIGxhIG51ZXZhLlxuXG4gICAgICAvLyBMaW1waWFyIGNvbnRleHRvIGdsb2JhbCBhbCBjYW1iaWFyIGRlIGNvbnZlcnNhY2nDs25cbiAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgIHNldENsaWVudD8uKG51bGwpXG4gICAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICAgIHNldFRhc2sobnVsbClcblxuICAgICAgY3VycmVudENoYXRJZC5jdXJyZW50ID0gaW5pdGlhbENoYXRJZFxuICAgICAgc2V0QWN0aXZlU2Vzc2lvbklkKGluaXRpYWxDaGF0SWQpXG4gICAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkubWFya1VucmVhZChpbml0aWFsQ2hhdElkLCBmYWxzZSlcbiAgICAgIGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCA9IHV1aWR2NCgpXG4gICAgICBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQgPSBudWxsXG4gICAgICByZXBvcnRlZEV2ZW50LmN1cnJlbnQgPSBmYWxzZVxuICAgICAgLy8gaXNQcm9jZXNzaW5nUmVmIHJlZmxlamEgc2kgbGEgc2VzacOzbiBBQ1RJVkEgZXN0w6Egb2N1cGFkYS4gU2kgbGEgc2VzacOzblxuICAgICAgLy8gYSBsYSBxdWUgZW50cmFtb3Mgc2lndWUgZ2VuZXJhbmRvIGVuIGJhY2tncm91bmQsIHF1ZWRhIGJsb3F1ZWFkYTsgc2kgbm8sXG4gICAgICAvLyBzZSBoYWJpbGl0YSBlbCBlbnbDrW8gYXVucXVlIG90cmFzIHNlc2lvbmVzIHNpZ2FuIGdlbmVyYW5kby5cbiAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gc2Vzc2lvblN0cmVhbU1hbmFnZXIuaXNBY3RpdmUoaW5pdGlhbENoYXRJZClcbiAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuXG4gICAgICBsb2FkTWVzc2FnZXMoKVxuICAgIH1cbiAgfSwgW2luaXRpYWxDaGF0SWQsIHByb2plY3QsIHNldFByb2plY3QsIHNldENsaWVudCwgc2V0Q2hpcHNQcm9qZWN0LCBzZXRUYXNrLCBsb2FkTWVzc2FnZXNdKVxuXG4gIGNvbnN0IGhhbmRsZVN0cmVhbUVycm9yID0gdXNlQ2FsbGJhY2soXG4gICAgKGN0eDogU3RyZWFtQ29udGV4dCwgZXJyb3JNZXNzYWdlPzogc3RyaW5nLCBlcnJvclJhd01lc3NhZ2U/OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBtZXNzYWdlSWQsIHBsYWNlaG9sZGVySWQgfSA9IGN0eFxuICAgICAgY29uc3QgaXNBY3RpdmUgPSBhY3RpdmVWaWV3LmlzKHNlc3Npb25JZClcblxuICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgZHJvcEZyb21TZXNzaW9uKHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcblxuICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgIGNsZWFyU3RyZWFtVWlSZWYuY3VycmVudCgpXG4gICAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgIGVycm9yTWVzc2FnZSA9PT0gXCJBY2Nlc3MgZGVuaWVkOiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGlzIGFnZW50XCJcbiAgICAgICAgICA/IHQoJ2NoYXQuZXJyb3JBY2Nlc3NEZW5pZWQnKVxuICAgICAgICAgIDogZXJyb3JNZXNzYWdlID09PSAnaW52YWxpZF9yZXF1ZXN0X2Vycm9yJyAmJiBlcnJvclJhd01lc3NhZ2U/LmluY2x1ZGVzKCdwcm9tcHQgaXMgdG9vIGxvbmcnKVxuICAgICAgICAgICAgPyB0KCdjaGF0LmVycm9yUHJvbXB0VG9vTG9uZycsIHsgdXNlZDogZXJyb3JSYXdNZXNzYWdlLm1hdGNoKC8oXFxkKykgdG9rZW5zLyk/LlsxXSA/PyAnJyB9KVxuICAgICAgICAgICAgOiB0KCdjaGF0LmVycm9yJylcblxuICAgICAgY29tbWl0VG9TZXNzaW9uKHNlc3Npb25JZCwge1xuICAgICAgICBpZDogYGFuc3dlci0ke21lc3NhZ2VJZH1gLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBpc0Vycm9yOiB0cnVlLFxuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogJ0Fzc2lzdGFudCcgfSxcbiAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgIH0pXG4gICAgICBjbGVhclNlc3Npb25UYWlsKHNlc3Npb25JZClcblxuICAgICAgaWYgKCFpc0FjdGl2ZSkge1xuICAgICAgICBub3RpZnlTZXNzaW9uRmluaXNoZWRJbkJhY2tncm91bmQoc2Vzc2lvbklkLCAnZXJyb3InKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2NvbW1pdFRvU2Vzc2lvbiwgZHJvcEZyb21TZXNzaW9uLCBjbGVhclNlc3Npb25UYWlsLCB0XVxuICApXG5cbiAgY29uc3QgaGFuZGxlU3RyZWFtVXBkYXRlID0gdXNlQ2FsbGJhY2soXG4gICAgKGN0eDogU3RyZWFtQ29udGV4dCwgY29udGVudDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCB9ID0gY3R4XG5cbiAgICAgIC8vIEFzZWd1cmFtb3MgZWwgcGxhY2Vob2xkZXIgdW5hIMO6bmljYSB2ZXogcG9yIHN0cmVhbSwgdGFudG8gZW4gZWwgc3RvcmVcbiAgICAgIC8vIGRlIGxhIHNlc2nDs24gY29tbyBlbiBsYSB2aXN0YSBzaSBlcyBsYSBhY3RpdmEuIEVsIHRleHRvIGVuIHZpdm8gdmlhamFcbiAgICAgIC8vIHBvciBzZXNzaW9uU3RyZWFtaW5nVGV4dCAoZXh0ZXJubyksIHNpbiByZS1yZW5kZXIgZGVsIMOhcmJvbCBjb21wbGV0by5cbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyRXhpc3RzID0gdXNlU2Vzc2lvbnNTdG9yZVxuICAgICAgICAuZ2V0U3RhdGUoKVxuICAgICAgICAuZ2V0TWVzc2FnZXMoc2Vzc2lvbklkKVxuICAgICAgICAuc29tZShtc2cgPT4gbXNnLmlkID09PSBwbGFjZWhvbGRlcklkKVxuXG4gICAgICBpZiAoIXBsYWNlaG9sZGVyRXhpc3RzKSB7XG4gICAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnN0YXJ0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcbiAgICAgICAgY29tbWl0VG9TZXNzaW9uKHNlc3Npb25JZCwge1xuICAgICAgICAgIGlkOiBwbGFjZWhvbGRlcklkLFxuICAgICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6ICdBc3Npc3RhbnQnIH0sXG4gICAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGl2ZVZpZXcuaXMoc2Vzc2lvbklkKSkge1xuICAgICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBwbGFjZWhvbGRlcklkXG4gICAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gc2Vzc2lvbklkXG4gICAgICB9XG5cbiAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnNldFRleHQoc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkLCBjb250ZW50KVxuICAgIH0sXG4gICAgW2NvbW1pdFRvU2Vzc2lvbl1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVN0cmVhbUZpbmlzaCA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChcbiAgICAgIGN0eDogU3RyZWFtQ29udGV4dCxcbiAgICAgIGNvbnRlbnQ6IHN0cmluZyxcbiAgICAgIHNvdXJjZXM6IGFueSxcbiAgICAgIG1lbW9yeVNlc3Npb25JZDogc3RyaW5nLFxuICAgICAgcmF3QXR0YWNobWVudHM/OiBhbnlbXSB8IG51bGwsXG4gICAgICBzdWdnZXN0aW9ucz86IHN0cmluZ1tdIHwgbnVsbCxcbiAgICAgIGNvbXBsZXRlZEFnZW50SWQ/OiBzdHJpbmcgfCBudWxsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB7IHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCB9ID0gY3R4XG4gICAgICBjb25zdCBpc0FjdGl2ZSA9IGFjdGl2ZVZpZXcuaXMoc2Vzc2lvbklkKVxuXG4gICAgICBjb25zdCB0ZW1wTWVzc2FnZUlkID0gcGxhY2Vob2xkZXJJZFxuICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgZHJvcEZyb21TZXNzaW9uKHNlc3Npb25JZCwgdGVtcE1lc3NhZ2VJZClcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gbm9ybWFsaXplQXNzaXN0YW50QXR0YWNobWVudHMocmF3QXR0YWNobWVudHMpXG5cbiAgICAgIC8vIFNlc2nDs24gZW4gYmFja2dyb3VuZDogY2VycmFtb3MgbGVhbi4gRWwgYmFja2VuZCB5YSBwZXJzaXN0acOzIGxhXG4gICAgICAvLyByZXNwdWVzdGEsIGFzw60gcXVlIGFsIHZvbHZlciBhIGxhIHNlc2nDs24gc2UgY2FyZ2EgZGVzZGUgYWjDrS4gQXZpc2Ftb3NcbiAgICAgIC8vIHF1ZSB0ZXJtaW7DsyAodW5yZWFkICsgZXZlbnRvIHBhcmEgdG9hc3Qvc29uaWRvKS5cbiAgICAgIGlmICghaXNBY3RpdmUpIHtcbiAgICAgICAgY29tbWl0VG9TZXNzaW9uKHNlc3Npb25JZCwge1xuICAgICAgICAgIGlkOiBgYW5zd2VyLSR7bWVtb3J5U2Vzc2lvbklkfWAsXG4gICAgICAgICAgbWVzc2FnZTogY29udGVudCxcbiAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiAnQXNzaXN0YW50JyB9LFxuICAgICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICAgICAgc291cmNlcyxcbiAgICAgICAgICAuLi4oYXR0YWNobWVudHMubGVuZ3RoID4gMCA/IHsgYXR0YWNobWVudHMgfSA6IHt9KSxcbiAgICAgICAgICBtZW1vcnlTZXNzaW9uSWQsXG4gICAgICAgICAgc3VnZ2VzdGlvbnM6IHN1Z2dlc3Rpb25zIHx8IFtdLFxuICAgICAgICB9KVxuICAgICAgICBjbGVhclNlc3Npb25UYWlsKHNlc3Npb25JZClcbiAgICAgICAgbm90aWZ5U2Vzc2lvbkZpbmlzaGVkSW5CYWNrZ3JvdW5kKHNlc3Npb25JZCwgJ2NvbXBsZXRlJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYuY3VycmVudCA9IG51bGxcblxuICAgICAgLy8gRGV0ZWN0YXIgdG9kYXMgbGFzIFVSTHMgZGUgdGFyZWFzICguLi4vdGFza3MvMTIzL2RldGFpbHxtZXNzYWdlfG1lc3NhZ2VzfGZpbGVzfGhpc3Rvcnl8aG91cnMpXG4gICAgICBjb25zdCB0YXNrVXJsUmVnZXggPSBuZXcgUmVnRXhwKFRBU0tfVVJMX1JFR0VYX1BBVFRFUk4sICdnJylcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBbLi4uY29udGVudC5tYXRjaEFsbCh0YXNrVXJsUmVnZXgpXVxuXG4gICAgICBsZXQgY29udGVudFRvQWRkID0gY29udGVudFxuICAgICAgY29uc3QgcHJldmlvdXNNZXNzYWdlID0gbWVzc2FnZXNSZWYuY3VycmVudC5maWx0ZXIobSA9PiBtLmlkICE9PSB0ZW1wTWVzc2FnZUlkKS5hdCgtMSlcbiAgICAgIGNvbnN0IGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgPSBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsICE9IG51bGxcbiAgICAgIGNvbnN0IFRBU0tfQ1JFQVRJT05fVE9PTFMgPSBbJ2NyZWF0ZV90YXNrJywgJ2NyZWF0ZV90YXNrc19iYXRjaCcsICdjbG9uZV90YXNrJ11cbiAgICAgIGNvbnN0IFRBU0tfRURJVF9UT09MUyA9IFtcbiAgICAgICAgJ2VkaXRfdGFzaycsXG4gICAgICAgICdlZGl0X3Rhc2tzX2JhdGNoJyxcbiAgICAgICAgJ3Rhc2tfYXNzaWduJyxcbiAgICAgICAgJ3Rhc2tfdW5hc3NpZ24nLFxuICAgICAgICAndXBkYXRlX3Rhc2tfdHlwZScsXG4gICAgICAgICd1cGRhdGVfZXN0aW1hdGVkX2hvdXJzJyxcbiAgICAgICAgJ2Fzc2lnbl90YXNrX2xhYmVsJyxcbiAgICAgIF1cbiAgICAgIGNvbnN0IFRBU0tfREVMRVRFX1RPT0xTID0gWydkZWxldGVfdGFzaycsICdkZWxldGVfdGFza3NfYmF0Y2gnXVxuICAgICAgY29uc3QgcGVuZGluZ0FjdGlvbnMgPSBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsPy5wZW5kaW5nX2FjdGlvbnMgfHwgW11cbiAgICAgIGNvbnN0IHdhc1Rhc2tDcmVhdGlvbiA9XG4gICAgICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiZcbiAgICAgICAgcGVuZGluZ0FjdGlvbnMuc29tZSgoYWN0aW9uOiBhbnkpID0+IFRBU0tfQ1JFQVRJT05fVE9PTFMuaW5jbHVkZXMoYWN0aW9uLnRvb2xfbmFtZSkpXG4gICAgICBjb25zdCB3YXNUYXNrRWRpdCA9XG4gICAgICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiYgcGVuZGluZ0FjdGlvbnMuc29tZSgoYWN0aW9uOiBhbnkpID0+IFRBU0tfRURJVF9UT09MUy5pbmNsdWRlcyhhY3Rpb24udG9vbF9uYW1lKSlcbiAgICAgIGNvbnN0IHdhc1Rhc2tEZWxldGUgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zLnNvbWUoKGFjdGlvbjogYW55KSA9PiBUQVNLX0RFTEVURV9UT09MUy5pbmNsdWRlcyhhY3Rpb24udG9vbF9uYW1lKSlcbiAgICAgIGNvbnN0IHdhc0NyZWF0ZUFnZW50QXBwcm92ZWQgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgIHByZXZpb3VzTWVzc2FnZT8uYXBwcm92YWxTdGF0dXMgPT09ICdhcHByb3ZlZCcgJiZcbiAgICAgICAgcGVuZGluZ0FjdGlvbnMuc29tZSgoYWN0aW9uOiBhbnkpID0+IGFjdGlvbi50b29sX25hbWUgPT09ICdjcmVhdGVfYWdlbnQnKVxuICAgICAgY29uc3Qgd2FzQ29uZmlndXJlQWdlbnRBY2Nlc3NBcHByb3ZlZCA9XG4gICAgICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiZcbiAgICAgICAgcHJldmlvdXNNZXNzYWdlPy5hcHByb3ZhbFN0YXR1cyA9PT0gJ2FwcHJvdmVkJyAmJlxuICAgICAgICBwZW5kaW5nQWN0aW9ucy5zb21lKChhY3Rpb246IGFueSkgPT4gKGFjdGlvbi50b29sX25hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdjb25maWd1cmVfYWdlbnRfYWNjZXNzJylcbiAgICAgIGxldCBjcmVhdGVBZ2VudEZvbGxvd1VwOiB7IGFnZW50SWQ6IHN0cmluZyB9IHwgdW5kZWZpbmVkXG4gICAgICBpZiAod2FzQ3JlYXRlQWdlbnRBcHByb3ZlZCAmJiB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyAmJiBjb21wbGV0ZWRBZ2VudElkPy50cmltKCkpIHtcbiAgICAgICAgY3JlYXRlQWdlbnRGb2xsb3dVcCA9IHsgYWdlbnRJZDogY29tcGxldGVkQWdlbnRJZC50cmltKCkgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgd2FzQ29uZmlndXJlQWdlbnRBY2Nlc3NBcHByb3ZlZCAmJlxuICAgICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyAmJlxuICAgICAgICAoY29tcGxldGVkQWdlbnRJZD8udHJpbSgpIHx8XG4gICAgICAgICAgZXh0cmFjdEFnZW50SWRGcm9tUGVuZGluZ0FjdGlvbnNCeVRvb2xOYW1lKHBlbmRpbmdBY3Rpb25zLCAnY29uZmlndXJlX2FnZW50X2FjY2VzcycpKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ3VyZWRBZ2VudElkID1cbiAgICAgICAgICBjb21wbGV0ZWRBZ2VudElkPy50cmltKCkgfHxcbiAgICAgICAgICBleHRyYWN0QWdlbnRJZEZyb21QZW5kaW5nQWN0aW9uc0J5VG9vbE5hbWUocGVuZGluZ0FjdGlvbnMsICdjb25maWd1cmVfYWdlbnRfYWNjZXNzJylcbiAgICAgICAgY3JlYXRlQWdlbnRGb2xsb3dVcCA9IHtcbiAgICAgICAgICBhZ2VudElkOiBjb25maWd1cmVkQWdlbnRJZCBhcyBzdHJpbmcsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHdhc0NyZWF0ZUFnZW50QXBwcm92ZWQpIHtcbiAgICAgICAgZXZlbnQoRVZFTlRTLmFpQ2hhdEhpdGxPcHRpb24sIHtcbiAgICAgICAgICBhZ2VudF90eXBlOiBnZXRIaXRsQW5hbHl0aWNzQWdlbnRUeXBlKGFnZW50KSxcbiAgICAgICAgICBhY3Rpb25fdHlwZTogYnVpbGRIaXRsQWN0aW9uVHlwZUxpc3QocGVuZGluZ0FjdGlvbnMpLFxuICAgICAgICAgIGRlY2lzaW9uOiAnYWNjZXB0JyxcbiAgICAgICAgICBvcHRpb246ICdjcmVhdGVfYWdlbnQnLFxuICAgICAgICAgIC4uLihjb21wbGV0ZWRBZ2VudElkPy50cmltKCkgPyB7IGNyZWF0ZWRfYWdlbnRfaWQ6IGNvbXBsZXRlZEFnZW50SWQudHJpbSgpIH0gOiB7fSksXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdhc0VkaXRBZ2VudEFwcHJvdmVkID1cbiAgICAgICAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSAmJlxuICAgICAgICBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsU3RhdHVzID09PSAnYXBwcm92ZWQnICYmXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zLnNvbWUoKGFjdGlvbjogYW55KSA9PiAoYWN0aW9uLnRvb2xfbmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ2VkaXRfYWdlbnQnKVxuXG4gICAgICBsZXQgZWRpdEFnZW50Rm9sbG93VXA6IHsgYWdlbnRJZDogc3RyaW5nIH0gfCB1bmRlZmluZWRcbiAgICAgIGlmICh3YXNFZGl0QWdlbnRBcHByb3ZlZCkge1xuICAgICAgICBjb25zdCBmcm9tU3RyZWFtID0gY29tcGxldGVkQWdlbnRJZD8udHJpbSgpXG4gICAgICAgIGNvbnN0IGZyb21BcmdzID0gZXh0cmFjdEFnZW50SWRGcm9tRWRpdEFnZW50UGVuZGluZ0FjdGlvbnMocGVuZGluZ0FjdGlvbnMpXG4gICAgICAgIGNvbnN0IHJlc29sdmVkQWdlbnRJZCA9IGZyb21TdHJlYW0gfHwgZnJvbUFyZ3NcbiAgICAgICAgaWYgKHJlc29sdmVkQWdlbnRJZCkge1xuICAgICAgICAgIGVkaXRBZ2VudEZvbGxvd1VwID0geyBhZ2VudElkOiByZXNvbHZlZEFnZW50SWQgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhc2tJZHNGcm9tVXJscyA9IG1hdGNoZXMubWFwKG1hdGNoID0+IHBhcnNlSW50KG1hdGNoWzFdLCAxMCkpXG4gICAgICBjb25zdCB0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsID0gZXh0cmFjdFRhc2tJZHNGcm9tRGVsZXRlUGVuZGluZ0FjdGlvbnMocGVuZGluZ0FjdGlvbnMpXG4gICAgICBjb25zdCB0YXNrSWRzRnJvbURlbGV0aW9uVGV4dCA9XG4gICAgICAgIHdhc1Rhc2tEZWxldGUgJiYgdGFza0lkc0Zyb21VcmxzLmxlbmd0aCA9PT0gMCAmJiB0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsLmxlbmd0aCA9PT0gMFxuICAgICAgICAgID8gZXh0cmFjdFRhc2tJZHNGcm9tQXNzaXN0YW50RGVsZXRpb25UZXh0KGNvbnRlbnQpXG4gICAgICAgICAgOiBbXVxuICAgICAgY29uc3QgdGFza0lkc0ZvckRhc2hib2FyZCA9XG4gICAgICAgIHRhc2tJZHNGcm9tVXJscy5sZW5ndGggPiAwXG4gICAgICAgICAgPyB0YXNrSWRzRnJvbVVybHNcbiAgICAgICAgICA6IHRhc2tJZHNGcm9tRGVsZXRlQXBwcm92YWwubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyB0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsXG4gICAgICAgICAgICA6IHRhc2tJZHNGcm9tRGVsZXRpb25UZXh0XG5cbiAgICAgIGNvbnN0IHNob3VsZFN5bmNEYXNoYm9hcmQgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgICh3YXNUYXNrQ3JlYXRpb24gfHwgd2FzVGFza0VkaXQgfHwgd2FzVGFza0RlbGV0ZSkgJiZcbiAgICAgICAgdGFza0lkc0ZvckRhc2hib2FyZC5sZW5ndGggPiAwXG5cbiAgICAgIGlmIChzaG91bGRTeW5jRGFzaGJvYXJkKSB7XG4gICAgICAgIGNvbnN0IHRhc2tJZHMgPSB0YXNrSWRzRm9yRGFzaGJvYXJkXG4gICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB0YWIgPSBhd2FpdCBnZXRUYWJUYXNrRGVmYXVsdCh0YXNrSWRzWzBdKVxuICAgICAgICAgIGNvbnN0IHRhYlNlZ21lbnQgPSB0YWIgPyBgLyR7dGFifWAgOiAnL2RldGFpbCdcbiAgICAgICAgICBjb250ZW50VG9BZGQgPSBjb250ZW50LnJlcGxhY2UodGFza1VybFJlZ2V4LCB1cmwgPT5cbiAgICAgICAgICAgIHVybC5yZXBsYWNlKC9cXC8oZGV0YWlsfG1lc3NhZ2V8bWVzc2FnZXN8ZmlsZXN8aGlzdG9yeXxob3VycykoPz0kfFxcPykvLCB0YWJTZWdtZW50KVxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RQcm9qZWN0TWVzc2FnZSA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQuZmlsdGVyKG1zZyA9PiBtc2cucHJvamVjdElkKS5hdCgtMSlcbiAgICAgICAgY29uc3QgY29udGV4dFByb2plY3RJZFJhdyA9IHByb2plY3Q/LmlkIHx8IGxhc3RQcm9qZWN0TWVzc2FnZT8ucHJvamVjdElkXG4gICAgICAgIGNvbnN0IGNvbnRleHRQcm9qZWN0SWQgPSBjb250ZXh0UHJvamVjdElkUmF3ID8gcGFyc2VJbnQoU3RyaW5nKGNvbnRleHRQcm9qZWN0SWRSYXcpLCAxMCkgOiBudWxsXG4gICAgICAgIGNvbnN0IHBhdGhNYXRjaCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5tYXRjaCgvXlxcL3Byb2plY3RzXFwvKFxcZCspXFwvLylcbiAgICAgICAgY29uc3Qgcm91dGVQcm9qZWN0SWQgPSBwYXRoTWF0Y2ggPyBwYXJzZUludChwYXRoTWF0Y2hbMV0sIDEwKSA6IG51bGxcbiAgICAgICAgY29uc3QgaXNPblByb2plY3RSb3V0ZSA9IGNvbnRleHRQcm9qZWN0SWQgJiYgcm91dGVQcm9qZWN0SWQgJiYgY29udGV4dFByb2plY3RJZCA9PT0gcm91dGVQcm9qZWN0SWRcblxuICAgICAgICBpZiAoaXNPblByb2plY3RSb3V0ZSkge1xuICAgICAgICAgIGlmICh3YXNUYXNrQ3JlYXRpb24pIHtcbiAgICAgICAgICAgIHdpbmRvdy5uZXdQcm9qZWN0RGFzaGJvYXJkPy5hZGRFeGlzdGluZ1Rhc2tUb0Rhc2hib2FyZD8uKHRhc2tJZHMpXG4gICAgICAgICAgfSBlbHNlIGlmICh3YXNUYXNrRWRpdCkge1xuICAgICAgICAgICAgd2luZG93Lm5ld1Byb2plY3REYXNoYm9hcmQ/LmVkaXRFeGlzdGluZ1Rhc2tJbkRhc2hib2FyZD8uKHRhc2tJZHMpXG4gICAgICAgICAgfSBlbHNlIGlmICh3YXNUYXNrRGVsZXRlKSB7XG4gICAgICAgICAgICB3aW5kb3cubmV3UHJvamVjdERhc2hib2FyZD8uZGVsZXRlRXhpc3RpbmdUYXNrRnJvbURhc2hib2FyZD8uKHRhc2tJZHMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZmV0Y2ggZGVsIHRhc2sgcGFuZWwgc2kgZXN0w6EgYWJpZXJ0byB5IGxhIHRvb2wgYXByb2JhZGEgZWRpdMOzL2JvcnLDsyBlc2EgdGFyZWEuXG4gICAgICAvLyBDdWJyZSBsb3MgZG9zIGZsdWpvcyBkZSBhcHByb3ZhbDpcbiAgICAgIC8vICAgMSkgQXBwcm92YWwgcG9yIGJvdMOzbiDihpIgYHByZXZpb3VzTWVzc2FnZS5hcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnNgICh2w61hIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UpXG4gICAgICAvLyAgIDIpIE1hbnVhbCBhcHByb3ZhbCAodXN1YXJpbyB0aXBlYSBcInNpXCIvXCJub1wiKSDihpIgYGxhc3RNYW51YWxBcHByb3ZhbFJlZi5jdXJyZW50YFxuICAgICAgY29uc3Qgb3BlblRhc2tQYW5lbElkID0gd2luZG93LnRhc2tQYW5lbD8udGFza0lkXG4gICAgICBjb25zdCBtYW51YWxBcHByb3ZhbCA9IGxhc3RNYW51YWxBcHByb3ZhbFJlZi5jdXJyZW50XG4gICAgICBsYXN0TWFudWFsQXBwcm92YWxSZWYuY3VycmVudCA9IG51bGwgLy8gY29uc3VtaXIgdW5hIHNvbGEgdmV6XG4gICAgICBjb25zdCBtYW51YWxXYXNUYXNrRWRpdCA9ICEhbWFudWFsQXBwcm92YWwgJiYgVEFTS19FRElUX1RPT0xTLmluY2x1ZGVzKG1hbnVhbEFwcHJvdmFsLnRvb2xOYW1lKVxuICAgICAgY29uc3QgbWFudWFsV2FzVGFza0RlbGV0ZSA9ICEhbWFudWFsQXBwcm92YWwgJiYgVEFTS19ERUxFVEVfVE9PTFMuaW5jbHVkZXMobWFudWFsQXBwcm92YWwudG9vbE5hbWUpXG5cbiAgICAgIGlmIChvcGVuVGFza1BhbmVsSWQgJiYgKHdhc1Rhc2tFZGl0IHx8IHdhc1Rhc2tEZWxldGUgfHwgbWFudWFsV2FzVGFza0VkaXQgfHwgbWFudWFsV2FzVGFza0RlbGV0ZSkpIHtcbiAgICAgICAgY29uc3QgbWFudWFsUHNldWRvQWN0aW9uOiBQZW5kaW5nQWN0aW9uIHwgbnVsbCA9IG1hbnVhbEFwcHJvdmFsXG4gICAgICAgICAgPyAoeyB0b29sX25hbWU6IG1hbnVhbEFwcHJvdmFsLnRvb2xOYW1lLCB0b29sX2FyZ3M6IG1hbnVhbEFwcHJvdmFsLnRvb2xBcmdzID8/IHt9IH0gYXMgUGVuZGluZ0FjdGlvbilcbiAgICAgICAgICA6IG51bGxcbiAgICAgICAgY29uc3QgYWZmZWN0ZWRUYXNrSWRzID0gW1xuICAgICAgICAgIC4uLmV4dHJhY3RUYXNrSWRzRnJvbVBlbmRpbmdBY3Rpb25zQXJncyhwZW5kaW5nQWN0aW9ucyksXG4gICAgICAgICAgLi4udGFza0lkc0Zyb21VcmxzLFxuICAgICAgICAgIC4uLnRhc2tJZHNGcm9tRGVsZXRlQXBwcm92YWwsXG4gICAgICAgICAgLi4uKG1hbnVhbFBzZXVkb0FjdGlvbiA/IGV4dHJhY3RUYXNrSWRzRnJvbVBlbmRpbmdBY3Rpb25zQXJncyhbbWFudWFsUHNldWRvQWN0aW9uXSkgOiBbXSksXG4gICAgICAgIF0ubWFwKFN0cmluZylcbiAgICAgICAgaWYgKGFmZmVjdGVkVGFza0lkcy5pbmNsdWRlcyhTdHJpbmcob3BlblRhc2tQYW5lbElkKSkpIHtcbiAgICAgICAgICB3aW5kb3cudGFza1BhbmVsPy5yZWZldGNoVGFzaz8uKClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb21taXRUb1Nlc3Npb24oc2Vzc2lvbklkLCB7XG4gICAgICAgIGlkOiBgYW5zd2VyLSR7bWVtb3J5U2Vzc2lvbklkfWAsXG4gICAgICAgIG1lc3NhZ2U6IGNvbnRlbnRUb0FkZCxcbiAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6ICdBc3Npc3RhbnQnIH0sXG4gICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICAgIHNvdXJjZXMsXG4gICAgICAgIC4uLihhdHRhY2htZW50cy5sZW5ndGggPiAwID8geyBhdHRhY2htZW50cyB9IDoge30pLFxuICAgICAgICBtZW1vcnlTZXNzaW9uSWQsXG4gICAgICAgIHN1Z2dlc3Rpb25zOiBzdWdnZXN0aW9ucyB8fCBbXSxcbiAgICAgICAgLi4uKGNyZWF0ZUFnZW50Rm9sbG93VXAgPyB7IGNyZWF0ZUFnZW50Rm9sbG93VXAgfSA6IHt9KSxcbiAgICAgIH0pXG4gICAgICBjbGVhclNlc3Npb25UYWlsKHNlc3Npb25JZClcblxuICAgICAgaWYgKGNyZWF0ZUFnZW50Rm9sbG93VXA/LmFnZW50SWQpIHtcbiAgICAgICAgZmV0Y2hBZ2VudERldGFpbChjcmVhdGVBZ2VudEZvbGxvd1VwLmFnZW50SWQpXG4gICAgICAgICAgLnRoZW4oY2hhdEFnZW50ID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnbWFpYS1tZXJnZS1jcmVhdGVkLWFnZW50LWludG8tbGlzdCcsIHtcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHsgYWdlbnQ6IGNoYXRBZ2VudCB9LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbdXNlQ2hhdE1hbmFnZXJdIE5vIHNlIHB1ZG8gYcOxYWRpciBlbCBhZ2VudGUgcmVjacOpbiBjcmVhZG8gYWwgbGlzdGFkbycsIGVycilcbiAgICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoZWRpdEFnZW50Rm9sbG93VXA/LmFnZW50SWQpIHtcbiAgICAgICAgZmV0Y2hBZ2VudERldGFpbChlZGl0QWdlbnRGb2xsb3dVcC5hZ2VudElkKVxuICAgICAgICAgIC50aGVuKGNoYXRBZ2VudCA9PiB7XG4gICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ21haWEtc3luYy1lZGl0ZWQtYWdlbnQtZnJvbS1jaGF0Jywge1xuICAgICAgICAgICAgICAgIGRldGFpbDogeyBhZ2VudDogY2hhdEFnZW50IH0sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1t1c2VDaGF0TWFuYWdlcl0gTm8gc2UgcHVkbyByZWZyZXNjYXIgZWwgYWdlbnRlIGVkaXRhZG8nLCBlcnIpXG4gICAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgaWYgKGZpcnN0VGltZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdyZWZldGNoLXNlc3Npb24nKVxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KVxuICAgICAgICBmaXJzdFRpbWVSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICB9XG4gICAgfSxcbiAgICBbY29tbWl0VG9TZXNzaW9uLCBkcm9wRnJvbVNlc3Npb24sIGNsZWFyU2Vzc2lvblRhaWwsIHByb2plY3QsIGdldFRhYlRhc2tEZWZhdWx0LCBldmVudCwgYWdlbnRdXG4gIClcblxuICBjb25zdCBoYW5kbGVTdHJlYW1TdG9wID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIC8vIEVsIHN0b3Agc2llbXByZSBhcGxpY2EgYSBsYSBzZXNpw7NuIGFjdGl2YSAoYm90w7NuIGRlbCBpbnB1dCB2aXNpYmxlKS5cbiAgICBjb25zdCBzZXNzaW9uSWQgPSBjdXJyZW50Q2hhdElkLmN1cnJlbnRcbiAgICBjbGVhclN0cmVhbVVpUmVmLmN1cnJlbnQoKVxuICAgIGNvbnN0IHRlbXBNZXNzYWdlSWQgPSBgYW5zd2VyLSR7Y3VycmVudE1lc3NhZ2VJZC5jdXJyZW50fS1zdHJlYW1pbmdgXG4gICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICBkcm9wRnJvbVNlc3Npb24oc2Vzc2lvbklkLCB0ZW1wTWVzc2FnZUlkKVxuXG4gICAgY29tbWl0VG9TZXNzaW9uKHNlc3Npb25JZCwge1xuICAgICAgaWQ6IGBhbnN3ZXItJHtjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnR9LWNhbmNlbGxlZGAsXG4gICAgICBtZXNzYWdlOiB0KCdjaGF0LmNhbmNlbGxlZCcpLFxuICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiAnQXNzaXN0YW50JyB9LFxuICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgIGlzRnJvbnRlbmRDYW5jZWxsZWQ6IHRydWUsXG4gICAgfSlcbiAgICBjbGVhclNlc3Npb25UYWlsKHNlc3Npb25JZClcbiAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudCgncmVmZXRjaC1zZXNzaW9uJylcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpXG4gICAgfSwgNTAwKVxuICB9LCBbY29tbWl0VG9TZXNzaW9uLCBkcm9wRnJvbVNlc3Npb24sIGNsZWFyU2Vzc2lvblRhaWwsIHRdKVxuXG4gIGNvbnN0IGhhbmRsZUFwcHJvdmFsUmVxdWlyZWQgPSB1c2VDYWxsYmFjayhcbiAgICAoY3R4OiBTdHJlYW1Db250ZXh0LCBhcHByb3ZhbDogQXBwcm92YWxSZXF1ZXN0LCBhY2N1bXVsYXRlZENvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQgfSA9IGN0eFxuICAgICAgY29uc3QgaXNBY3RpdmUgPSBhY3RpdmVWaWV3LmlzKHNlc3Npb25JZClcblxuICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgZHJvcEZyb21TZXNzaW9uKHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcblxuICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhpdGxDb250ZXh0OiBIaXRsRXhlY3V0aW9uQ29udGV4dCA9IHtcbiAgICAgICAgbWVzc2FnZUlkOiBgYXBwcm92YWwtJHthcHByb3ZhbC5vcmlnaW5hbF90aHJlYWRfaWR9YCxcbiAgICAgICAgbWVzc2FnZVRleHQ6IGFjY3VtdWxhdGVkQ29udGVudCB8fCAnJyxcbiAgICAgICAgYXBwcm92YWwsXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zOiBhcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnMsXG4gICAgICAgIHRocmVhZElkczogYXBwcm92YWwucGVuZGluZ19hY3Rpb25zPy5tYXAoYWN0aW9uID0+IGFjdGlvbi50aHJlYWRfaWQpLFxuICAgICAgfVxuICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBoaXRsQ29udGV4dFxuICAgICAgfVxuXG4gICAgICBpZiAoYXBwcm92YWwubWFudWFsX2FwcHJvdmFsX2RldGVjdGVkKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0QWN0aW9uID0gYXBwcm92YWwucGVuZGluZ19hY3Rpb25zPy5bMF1cbiAgICAgICAgY29uc3QgdG9vbE5hbWUgPSAoYXBwcm92YWwgYXMgeyB0b29sX25hbWU/OiBzdHJpbmcgfSkudG9vbF9uYW1lID8/IGZpcnN0QWN0aW9uPy50b29sX25hbWUgPz8gJydcbiAgICAgICAgY29uc3QgdG9vbEFyZ3MgPVxuICAgICAgICAgICgoYXBwcm92YWwgYXMgeyB0b29sX2FyZ3M/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9KS50b29sX2FyZ3MgPz9cbiAgICAgICAgICAgIChmaXJzdEFjdGlvbj8udG9vbF9hcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKSkgfHxcbiAgICAgICAgICBudWxsXG4gICAgICAgIGlmICh0b29sTmFtZSAmJiBpc0FjdGl2ZSkge1xuICAgICAgICAgIGxhc3RNYW51YWxBcHByb3ZhbFJlZi5jdXJyZW50ID0geyB0b29sTmFtZSwgdG9vbEFyZ3MgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGEgbWVzc2FnZSB3aXRoIHRoZSBhcHByb3ZhbCByZXF1ZXN0XG4gICAgICBjb21taXRUb1Nlc3Npb24oc2Vzc2lvbklkLCB7XG4gICAgICAgIGlkOiBgYXBwcm92YWwtJHthcHByb3ZhbC5vcmlnaW5hbF90aHJlYWRfaWR9YCxcbiAgICAgICAgbWVzc2FnZTogYWNjdW11bGF0ZWRDb250ZW50IHx8ICcnLFxuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogJ0Fzc2lzdGFudCcgfSxcbiAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgYXBwcm92YWwsXG4gICAgICAgIGFwcHJvdmFsU3RhdHVzOiAncGVuZGluZycsXG4gICAgICB9KVxuICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vdGlmeVNlc3Npb25GaW5pc2hlZEluQmFja2dyb3VuZChzZXNzaW9uSWQsICdhcHByb3ZhbF9yZXF1aXJlZCcpXG4gICAgICB9XG4gICAgfSxcbiAgICBbY29tbWl0VG9TZXNzaW9uLCBkcm9wRnJvbVNlc3Npb25dXG4gIClcblxuICBjb25zdCB7XG4gICAgYXNrTWFpYSxcbiAgICBpc0xvYWRpbmc6IHdhaXRpbmdSZXNwb25zZSxcbiAgICBpc1dyaXRpbmcsXG4gICAgbG9hZGluZ01lc3NhZ2UsXG4gICAgc3RyZWFtQWN0aXZpdHksXG4gICAgdXBkYXRlU3RyZWFtQWN0aXZpdHksXG4gICAgc3RvcFN0cmVhbWluZyxcbiAgfSA9IHVzZU9yY2hlc3RyYXRvclN0cmVhbSh7XG4gICAgYWN0aXZlU2Vzc2lvbklkLFxuICAgIG9uRXJyb3I6IGhhbmRsZVN0cmVhbUVycm9yLFxuICAgIG9uU3RyZWFtVXBkYXRlOiBoYW5kbGVTdHJlYW1VcGRhdGUsXG4gICAgb25GaW5pc2hTdHJlYW06IGhhbmRsZVN0cmVhbUZpbmlzaCxcbiAgICBvblN0b3A6IGhhbmRsZVN0cmVhbVN0b3AsXG4gICAgb25BcHByb3ZhbFJlcXVpcmVkOiBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkLFxuICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLFxuICB9KVxuXG4gIGNsZWFyU3RyZWFtVWlSZWYuY3VycmVudCA9ICgpID0+IHtcbiAgICB1cGRhdGVTdHJlYW1BY3Rpdml0eShudWxsKVxuICAgIHNldEFjdGl2ZUxvYWRpbmdzKHt9KVxuICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBudWxsXG4gIH1cblxuICBjb25zdCBjdXJyZW50UHJvamVjdCA9IHByb2plY3RcblxuICBjb25zdCBzZW5kTWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGF0dGFjaG1lbnRzT3JPcHRpb25zPzogQXR0YWNobWVudEZpbGVbXSB8IFNlbmRNZXNzYWdlT3B0aW9ucyxcbiAgICAgIGZhcUlkPzogc3RyaW5nLFxuICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcsXG4gICAgICBtZW50aW9ucz86IENvbnRleHRNZW50aW9uW10sXG4gICAgICBmdWFJZD86IHN0cmluZyxcbiAgICAgIHNjSWQ/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCB8fCB3YWl0aW5nUmVzcG9uc2UgfHwgbG9hZGluZ01lc3NhZ2VzKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBUb3BlIGRlIGNvbmN1cnJlbmNpYTogc2kgZXN0YSBzZXNpw7NuIG5vIGVzdMOhIGdlbmVyYW5kbyB5IHlhIGhheVxuICAgICAgLy8gTUFYX0NPTkNVUlJFTlRfU1RSRUFNUyBhY3RpdmFzLCBhdmlzYW1vcyB5IG5vIGFycmFuY2Ftb3Mgb3RyYS5cbiAgICAgIGNvbnN0IHdpbGxTdGFydE5ld1N0cmVhbSA9ICFzZXNzaW9uU3RyZWFtTWFuYWdlci5pc0FjdGl2ZShjdXJyZW50Q2hhdElkLmN1cnJlbnQpXG4gICAgICBpZiAod2lsbFN0YXJ0TmV3U3RyZWFtICYmIHNlc3Npb25TdHJlYW1NYW5hZ2VyLmdldEFjdGl2ZUNvdW50KCkgPj0gTUFYX0NPTkNVUlJFTlRfU1RSRUFNUykge1xuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnc25hY2tiYXItZXZlbnQnLCB7XG4gICAgICAgICAgICBkZXRhaWw6IHsgc2hvdzogdHJ1ZSwgc2V2ZXJpdHk6ICdpbmZvJywgbWVzc2FnZTogdCgnY2hhdC50b29NYW55QWN0aXZlU2Vzc2lvbnMnKSB9LFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgYXR0YWNobWVudHMsIG9wdGlvbnMgfSA9IG5vcm1hbGl6ZVNlbmRNZXNzYWdlQXJncyhhdHRhY2htZW50c09yT3B0aW9ucylcbiAgICAgIC8vIExhcyBtZW50aW9ucyBwdWVkZW4gdmVuaXIgdsOtYSA1dG8gcGFyw6FtZXRybyAoY2FsbCBwb3NpdGlvbmFsIGRlc2RlIGVsIGZvb3RlcilcbiAgICAgIC8vIG8gdsOtYSBTZW5kTWVzc2FnZU9wdGlvbnMgKGNhbGwgcHJvZ3JhbcOhdGljbykuIEVsIHBhcsOhbWV0cm8gZXhwbMOtY2l0byBnYW5hLlxuICAgICAgY29uc3QgZWZmZWN0aXZlTWVudGlvbnMgPSBtZW50aW9ucyA/PyBvcHRpb25zLm1lbnRpb25zXG4gICAgICBjb25zdCBjb250ZXh0TWVzc2FnZTogQ29udGV4dE1lc3NhZ2UgfCB1bmRlZmluZWQgPSBidWlsZENvbnRleHRNZXNzYWdlKGVmZmVjdGl2ZU1lbnRpb25zKVxuICAgICAgY29uc3QgcGF5bG9hZEZ1YUlkID0gZnVhSWQgPz8gb3B0aW9ucy5mdWFJZFxuICAgICAgY29uc3QgcGF5bG9hZFNjSWQgPSBzY0lkID8/IG9wdGlvbnMuc2NJZFxuICAgICAgY29uc3QgcGF5bG9hZENvbnRleHREYXRhID0gb3B0aW9ucy5jb250ZXh0RGF0YVxuICAgICAgY29uc3QgZGlzcGxheU1lc3NhZ2UgPSBmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5KG1lc3NhZ2UsIHtcbiAgICAgICAgZnVhSWQ6IHBheWxvYWRGdWFJZCxcbiAgICAgICAgc2NJZDogcGF5bG9hZFNjSWQsXG4gICAgICB9KVxuXG4gICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIGNvbnN0IG5ld01lc3NhZ2VJZCA9IHV1aWR2NCgpXG4gICAgICBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQgPSBuZXdNZXNzYWdlSWRcbiAgICAgIGN1cnJlbnRVc2VyUXVlc3Rpb24uY3VycmVudCA9IG1lc3NhZ2VcblxuICAgICAgaWYgKCFyZXBvcnRlZEV2ZW50LmN1cnJlbnQpIHtcbiAgICAgICAgZXZlbnQoRVZFTlRTLnBtQWlUeXBlZFRleHQpXG4gICAgICAgIHJlcG9ydGVkRXZlbnQuY3VycmVudCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgLy8gVmVyaWZpY2FyIHNpIGVsIGNvbnRleHRvIGdsb2JhbCBlc3TDoSBkZXNhY3R1YWxpemFkb1xuICAgICAgY29uc3QgbGFzdE1lc3NhZ2VXaXRoUHJvamVjdCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQuZmlsdGVyKG1zZyA9PiBtc2cucHJvamVjdElkKS5hdCgtMSlcblxuICAgICAgY29uc3QgY3VycmVudEFnZW50RnJvbU1lc3NhZ2VzID0gbWVzc2FnZXNSZWYuY3VycmVudD8uW21lc3NhZ2VzUmVmLmN1cnJlbnQubGVuZ3RoIC0gMV0/LmFnZW50SWRcblxuICAgICAgY29uc3Qgc2Vzc2lvbklkID0gY3VycmVudENoYXRJZC5jdXJyZW50XG5cbiAgICAgIC8vIE5vIGFncmVnYXIgcHJvamVjdElkIGFsIG1lbnNhamUgZGVsIHVzdWFyaW8gLSBzZSBkZXRlcm1pbmFyw6EgZGVzcHXDqXNcbiAgICAgIGNvbW1pdFRvU2Vzc2lvbihzZXNzaW9uSWQsIHtcbiAgICAgICAgaWQ6IGBxdWVzdGlvbi0ke2N1cnJlbnRNZXNzYWdlSWQuY3VycmVudH1gLFxuICAgICAgICBtZXNzYWdlOiBkaXNwbGF5TWVzc2FnZSxcbiAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgdXNlcjogY3VycmVudFVzZXIsXG4gICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5VU0VSLFxuICAgICAgICBzb3VyY2VzOiBhdHRhY2htZW50cyxcbiAgICAgICAgLi4uKGNvbnRleHRNZXNzYWdlID8geyBjb250ZXh0TWVzc2FnZSB9IDoge30pLFxuICAgICAgfSlcblxuICAgICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gdXVpZHY0KClcblxuICAgICAgY29uc3Qgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZCA9IGBhbnN3ZXItJHtjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnR9LXN0cmVhbWluZ2BcbiAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IHN0cmVhbWluZ1BsYWNlaG9sZGVySWRcbiAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gc2Vzc2lvbklkXG4gICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5zdGFydChzZXNzaW9uSWQsIHN0cmVhbWluZ1BsYWNlaG9sZGVySWQpXG4gICAgICBjb21taXRUb1Nlc3Npb24oc2Vzc2lvbklkLCB7XG4gICAgICAgIGlkOiBzdHJlYW1pbmdQbGFjZWhvbGRlcklkLFxuICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6IGFnZW50Py5uYW1lIHx8ICdBc3Npc3RhbnQnIH0sXG4gICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICB9KVxuXG4gICAgICBsZXQgZmluYWxNZXNzYWdlID0gbWVzc2FnZVxuXG4gICAgICBpZiAobWVzc2FnZSA9PT0gdCgncWEuaXRlbXMucmVudGFiaWxpZGFkX3Byb3llY3RvJykpIHtcbiAgICAgICAgZmluYWxNZXNzYWdlID0gYEZBUTogJHt0KCdxYS5pdGVtcy5yZW50YWJpbGlkYWRfcHJveWVjdG8nKX0gLSBUaXBvIGRlIHJlbnRhYmlsaWRhZDogJHtcbiAgICAgICAgICBvcHRpb25zLnByb2plY3RDaGFuZ2VkPy5pbmNvbWVUeXBlIHx8IGNvbnRleHRSZWYuY3VycmVudC5wcm9qZWN0Py5pbmNvbWVUeXBlXG4gICAgICAgIH1gXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhpc3RvcnkgPSBtZXNzYWdlc1JlZi5jdXJyZW50Lm1hcChoaXN0b3J5TWVzc2FnZSA9PiAoe1xuICAgICAgICBjb250ZW50OiBoaXN0b3J5TWVzc2FnZS5tZXNzYWdlLFxuICAgICAgICByb2xlOiBoaXN0b3J5TWVzc2FnZS51c2VyLmlkID09PSBhdXRoVXNlci5pZC50b1N0cmluZygpID8gQ2hhdEhpc3RvcnlSb2xlLlVTRVIgOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgfSkpXG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY2hpcHNQcm9qZWN0OiBjdHhDaGlwc1Byb2plY3QsXG4gICAgICAgIHByb2plY3Q6IGN0eFByb2plY3QsXG4gICAgICAgIGNsaWVudDogY3R4Q2xpZW50LFxuICAgICAgICB0YXNrOiBjdHhUYXNrLFxuICAgICAgfSA9IGNvbnRleHRSZWYuY3VycmVudFxuICAgICAgY29uc3QgbGFzdE1lc3NhZ2VQcm9qZWN0SWQgPSBsYXN0TWVzc2FnZVdpdGhQcm9qZWN0Py5wcm9qZWN0SWRcbiAgICAgIGNvbnN0IHByb2plY3RUb1JlcXVlc3QgPSByZXNvbHZlUHJvamVjdFRvUmVxdWVzdChjdHhDaGlwc1Byb2plY3QsIGxhc3RNZXNzYWdlUHJvamVjdElkKVxuXG4gICAgICBjb25zb2xlLmluZm8oJ1t1c2VDaGF0TWFuYWdlcl0gc2VuZE1lc3NhZ2UgY29udGV4dCByZXNvbHV0aW9uOicsIHtcbiAgICAgICAgY2hpcHNQcm9qZWN0OiBjdHhDaGlwc1Byb2plY3QsXG4gICAgICAgIGNoaXBzUHJvamVjdElkOiBjdHhDaGlwc1Byb2plY3Q/LnByb2plY3RJZCA/IE51bWJlcihjdHhDaGlwc1Byb2plY3QucHJvamVjdElkKSA6IG51bGwsXG4gICAgICAgIGxhc3RNZXNzYWdlUHJvamVjdElkLFxuICAgICAgICBwcm9qZWN0VG9SZXF1ZXN0LFxuICAgICAgICBjbGllbnRJZDogY3R4Q2xpZW50Py5pZCxcbiAgICAgICAgdGFza0lkOiBjdHhUYXNrPy5pZCxcbiAgICAgICAgcHJvamVjdFByb3BJZDogY3R4UHJvamVjdD8uaWQsXG4gICAgICAgIGFnZW50VHlwZTogYWdlbnQ/LnR5cGUsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZldGNoUHJvamVjdHMoW3Byb2plY3RUb1JlcXVlc3RdKVxuXG4gICAgICBjb25zdCBwYXlsb2FkRmFxSWQgPSBmYXFJZCA/PyBvcHRpb25zLmZhcUlkXG4gICAgICBjb25zdCBwYXlsb2FkQWdlbnRTdWdnZXN0aW9uSWQgPSBhZ2VudFN1Z2dlc3Rpb25JZCA/PyBvcHRpb25zLmFnZW50U3VnZ2VzdGlvbklkXG5cbiAgICAgIGNvbnN0IHBheWxvYWREYXRhID0ge1xuICAgICAgICBtZXNzYWdlOiBmaW5hbE1lc3NhZ2UsXG4gICAgICAgIGhpc3RvcnksXG4gICAgICAgIHByb2plY3RJZDogcHJvamVjdFRvUmVxdWVzdCxcbiAgICAgICAgbGFuZzogYXV0aFVzZXIubGFuZyxcbiAgICAgICAgdXNlcklkOiBhdXRoVXNlci5pZC50b1N0cmluZygpLFxuICAgICAgICBmaXJzdE5hbWU6IGF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgICAgICAgbGFzdE5hbWU6IGF1dGhVc2VyLmxhc3ROYW1lLFxuICAgICAgICBjb21wYW55SWQ6IGF1dGhVc2VyLmNvbXBhbnlfaWQudG9TdHJpbmcoKSxcbiAgICAgICAgY2hhdElkOiBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgICAgIG1lc3NhZ2VJZDogY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50LFxuICAgICAgICBhZ2VudE5hbWU6IGFnZW50Py5uYW1lIHx8ICcnLFxuICAgICAgICBhZ2VudElkOiBjdXJyZW50QWdlbnRGcm9tTWVzc2FnZXMgfHwgYWdlbnQ/LmlkISxcbiAgICAgICAgaXNXZWJTZWFyY2hBY3RpdmU6IGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgIGlzRGVlcFNlYXJjaEFjdGl2ZTogaXNEZWVwU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgIC4uLihjdHhQcm9qZWN0Py5mZWVJZCAhPSBudWxsID8geyBmZWVJZDogTnVtYmVyKGN0eFByb2plY3QuZmVlSWQpIH0gOiB7fSksXG4gICAgICAgIC4uLnJlc29sdmVDbGllbnRQYXlsb2FkKGN0eENsaWVudCwgY3R4UHJvamVjdCksXG4gICAgICAgIC4uLihwcm9qZWN0cz8ubGVuZ3RoID8geyBwcm9qZWN0TmFtZTogcHJvamVjdHNbMF0ubmFtZSB9IDoge30pLFxuICAgICAgICAuLi4oY3R4VGFzaz8uaWQgIT0gbnVsbFxuICAgICAgICAgID8geyB0YXNrSWQ6IE51bWJlcihjdHhUYXNrLmlkKSwgLi4uKGN0eFRhc2submFtZSA/IHsgdGFza05hbWU6IGN0eFRhc2submFtZSB9IDoge30pIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKGF0dGFjaG1lbnRzLmxlbmd0aCA+IDAgPyB7IGF0dGFjaG1lbnRzIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkRmFxSWQgPyB7IGZhcUlkOiBwYXlsb2FkRmFxSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWRBZ2VudFN1Z2dlc3Rpb25JZCA/IHsgYWdlbnRTdWdnZXN0aW9uSWQ6IHBheWxvYWRBZ2VudFN1Z2dlc3Rpb25JZCB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZEZ1YUlkID8geyBmdWFJZDogcGF5bG9hZEZ1YUlkIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkU2NJZCA/IHsgc2NJZDogcGF5bG9hZFNjSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50Py5lbnRpdHkgIT0gbnVsbCA/IHsgYWdlbnRFbnRpdHk6IGFnZW50LmVudGl0eSB9IDoge30pLFxuICAgICAgICAuLi4oYWdlbnQ/LnR5cGUgIT0gbnVsbCA/IHsgYWdlbnRUeXBlOiBhZ2VudC50eXBlIH0gOiB7fSksXG4gICAgICAgIC4uLihjb250ZXh0TWVzc2FnZSA/IHsgY29udGV4dE1lc3NhZ2UgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWRDb250ZXh0RGF0YSA/IHsgY29udGV4dERhdGE6IHBheWxvYWRDb250ZXh0RGF0YSB9IDoge30pLFxuICAgICAgfVxuXG4gICAgICBhc2tNYWlhKHBheWxvYWREYXRhKVxuICAgIH0sXG4gICAgW1xuICAgICAgYWRkTWVzc2FnZSxcbiAgICAgIGNvbW1pdFRvU2Vzc2lvbixcbiAgICAgIGV2ZW50LFxuICAgICAgYXNrTWFpYSxcbiAgICAgIHByb2plY3QsXG4gICAgICBjbGllbnQsXG4gICAgICB0YXNrLFxuICAgICAgY2hpcHNQcm9qZWN0LFxuICAgICAgYXV0aFVzZXIsXG4gICAgICBhZ2VudCxcbiAgICAgIHQsXG4gICAgICB3YWl0aW5nUmVzcG9uc2UsXG4gICAgICBsb2FkaW5nTWVzc2FnZXMsXG4gICAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICAgIGlzRGVlcFNlYXJjaEFjdGl2ZSxcbiAgICBdXG4gIClcblxuICBjb25zdCBjaGFuZ2VQcm9qZWN0ID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogUHJvamVjdCkgPT4ge1xuICAgICAgaWYgKCFjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQpIHJldHVyblxuXG4gICAgICBpZiAob3B0aW9uLmlkICE9PSBwcm9qZWN0Py5pZCkge1xuICAgICAgICBzZXRQcm9qZWN0KG9wdGlvbilcbiAgICAgIH1cblxuICAgICAgaWYgKHByb2plY3QgJiYgY3VycmVudFVzZXJRdWVzdGlvbi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnN0IGhpc3RvcnkgPSBtZXNzYWdlc1JlZi5jdXJyZW50Lm1hcChoaXN0b3J5TWVzc2FnZSA9PiAoe1xuICAgICAgICAgIGNvbnRlbnQ6IGhpc3RvcnlNZXNzYWdlLm1lc3NhZ2UsXG4gICAgICAgICAgcm9sZTogaGlzdG9yeU1lc3NhZ2UudXNlci5pZCA9PT0gYXV0aFVzZXIuaWQudG9TdHJpbmcoKSA/IENoYXRIaXN0b3J5Um9sZS5VU0VSIDogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgfSkpXG5cbiAgICAgICAgY29uc29sZS5pbmZvKCdbdXNlQ2hhdE1hbmFnZXJdIFBBVEg9Y2hhbmdlUHJvamVjdCDigJQgdXNhIG9wdGlvbi5pZCBkaXJlY3RvIChOTyBjaGlwc1Byb2plY3QpOicsIHtcbiAgICAgICAgICBvcHRpb25JZDogb3B0aW9uLmlkLFxuICAgICAgICAgIHByb2plY3RQcm9wSWQ6IHByb2plY3Q/LmlkID8/IG51bGwsXG4gICAgICAgICAgY2hpcHNQcm9qZWN0SWQ6IGNoaXBzUHJvamVjdD8ucHJvamVjdElkID8/IG51bGwsXG4gICAgICAgICAgYWdlbnRUeXBlOiBhZ2VudD8udHlwZSxcbiAgICAgICAgfSlcblxuICAgICAgICBhc2tNYWlhKHtcbiAgICAgICAgICBtZXNzYWdlOiBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQsXG4gICAgICAgICAgaGlzdG9yeSxcbiAgICAgICAgICBwcm9qZWN0SWQ6IG9wdGlvbi5pZCxcbiAgICAgICAgICBsYW5nOiBhdXRoVXNlci5sYW5nLFxuICAgICAgICAgIHVzZXJJZDogYXV0aFVzZXIuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgICBmaXJzdE5hbWU6IGF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgICAgICAgICBsYXN0TmFtZTogYXV0aFVzZXIubGFzdE5hbWUsXG4gICAgICAgICAgY29tcGFueUlkOiBhdXRoVXNlci5jb21wYW55X2lkLnRvU3RyaW5nKCksXG4gICAgICAgICAgY2hhdElkOiBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgICAgICAgbWVzc2FnZUlkOiBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQsXG4gICAgICAgICAgYWdlbnROYW1lOiBhZ2VudD8ubmFtZSB8fCAnJyxcbiAgICAgICAgICBhZ2VudElkOiBhZ2VudD8uaWQgfHwgJycsXG4gICAgICAgICAgaXNXZWJTZWFyY2hBY3RpdmU6IGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlOiBpc0RlZXBTZWFyY2hBY3RpdmVSZWYuY3VycmVudCxcbiAgICAgICAgICAuLi4ob3B0aW9uPy5mZWVJZCAhPSBudWxsID8geyBmZWVJZDogTnVtYmVyKG9wdGlvbi5mZWVJZCkgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ob3B0aW9uPy5jbGllbnRJZCAhPSBudWxsID8geyBjbGllbnRJZDogTnVtYmVyKG9wdGlvbi5jbGllbnRJZCkgfSA6IHt9KSxcbiAgICAgICAgICAuLi4oYWdlbnQ/LmVudGl0eSAhPSBudWxsID8geyBhZ2VudEVudGl0eTogYWdlbnQuZW50aXR5IH0gOiB7fSksXG4gICAgICAgICAgLi4uKGFnZW50Py50eXBlICE9IG51bGwgPyB7IGFnZW50VHlwZTogYWdlbnQudHlwZSB9IDoge30pLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sXG4gICAgW3Byb2plY3QsIHNldFByb2plY3QsIGFza01haWEsIGF1dGhVc2VyLCBpc1dlYlNlYXJjaEFjdGl2ZSwgYWdlbnRdXG4gIClcblxuICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKGFzeW5jIChmZWVkYmFja1Byb3A6IEZlZWRiYWNrLCBjaGF0TWVzc2FnZUlkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1haWEuQ2hhdHMud2FzSGVscGZ1bENoYXQoY2hhdE1lc3NhZ2VJZCwgZmVlZGJhY2tQcm9wID09PSBGZWVkYmFjay5USFVNQlNfVVApXG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICBtZXNzYWdlc1JlZi5jdXJyZW50ID0gbWVzc2FnZXNSZWYuY3VycmVudC5tYXAobWVzc2FnZSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlLmlkID09PSBjaGF0TWVzc2FnZUlkICYmIG1lc3NhZ2Uucm9sZSA9PT0gJ2Fzc2lzdGFudCcpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5tZXNzYWdlLCB3YXNIZWxwZnVsOiBmZWVkYmFja1Byb3AgPT09IEZlZWRiYWNrLlRIVU1CU19VUCB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VcbiAgICAgIH0pXG4gICAgfVxuICB9LCBbXSlcblxuICBjb25zdCBoYW5kbGVBcHByb3ZhbERlY2lzaW9uID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKFxuICAgICAgdGhyZWFkSWRzOiBzdHJpbmdbXSxcbiAgICAgIGRlY2lzaW9uOiAnYXBwcm92ZScgfCAncmVqZWN0JyxcbiAgICAgIGVkaXRlZEFjdGlvbnM/OiBBcnJheTx7IHRvb2xfbmFtZTogc3RyaW5nOyBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PlxuICAgICkgPT4ge1xuICAgICAgaWYgKCF0aHJlYWRJZHM/Lmxlbmd0aCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyB0aHJlYWRfaWRzIHByb3ZpZGVkIGZvciBhcHByb3ZhbCBkZWNpc2lvbicpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3VuZCA9IGZpbmRNZXNzYWdlV2l0aEFwcHJvdmFsQnlUaHJlYWRJZHModGhyZWFkSWRzLCBtZXNzYWdlc1JlZi5jdXJyZW50KVxuICAgICAgaWYgKCFmb3VuZD8ubWVzc2FnZS5hcHByb3ZhbCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyBzZSBlbmNvbnRyw7MgbWVuc2FqZSBjb24gYXBwcm92YWwgcGFyYSB0aHJlYWRfaWRzOicsIHRocmVhZElkcylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgbWVzc2FnZTogbWVzc2FnZVdpdGhBcHByb3ZhbCwgc2Vzc2lvbklkOiBmb3VuZFNlc3Npb25JZCB9ID0gZm91bmRcbiAgICAgIGNvbnN0IHsgYXBwcm92YWwgfSA9IG1lc3NhZ2VXaXRoQXBwcm92YWxcbiAgICAgIGlmICghYXBwcm92YWwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlc3Npb25JZCA9IGFwcHJvdmFsLnNlc3Npb25faWQgfHwgZm91bmRTZXNzaW9uSWRcbiAgICAgIGlmICghc2Vzc2lvbklkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHNlc3Npb25faWQgZGlzcG9uaWJsZSBwYXJhIGFwcHJvdmFsOicsIHRocmVhZElkcylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChzZXNzaW9uU3RyZWFtTWFuYWdlci5pc0FjdGl2ZShzZXNzaW9uSWQpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoc2Vzc2lvblN0cmVhbU1hbmFnZXIuZ2V0QWN0aXZlQ291bnQoKSA+PSBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TKSB7XG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdzbmFja2Jhci1ldmVudCcsIHtcbiAgICAgICAgICAgIGRldGFpbDogeyBzaG93OiB0cnVlLCBzZXZlcml0eTogJ2luZm8nLCBtZXNzYWdlOiB0KCdjaGF0LnRvb01hbnlBY3RpdmVTZXNzaW9ucycpIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVzc2FnZUlkID0gbWVzc2FnZVdpdGhBcHByb3ZhbC5pZFxuICAgICAgY29uc3QgbmV3U3RhdHVzID0gZGVjaXNpb24gPT09ICdhcHByb3ZlJyA/ICdhcHByb3ZlZCcgOiAncmVqZWN0ZWQnXG4gICAgICBjb25zdCBoaXRsQ29udGV4dDogSGl0bEV4ZWN1dGlvbkNvbnRleHQgPSB7XG4gICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgbWVzc2FnZVRleHQ6IG1lc3NhZ2VXaXRoQXBwcm92YWwubWVzc2FnZSxcbiAgICAgICAgYXBwcm92YWwsXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zOiBhcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnMsXG4gICAgICAgIHRocmVhZElkcyxcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNBY3RpdmVTZXNzaW9uID0gYWN0aXZlVmlldy5pcyhzZXNzaW9uSWQpXG4gICAgICBpZiAoaXNBY3RpdmVTZXNzaW9uKSB7XG4gICAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBoaXRsQ29udGV4dFxuICAgICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgY29tbWl0VG9TZXNzaW9uKHNlc3Npb25JZCwgeyAuLi5tZXNzYWdlV2l0aEFwcHJvdmFsLCBhcHByb3ZhbFN0YXR1czogbmV3U3RhdHVzIH0pXG5cbiAgICAgIGNvbnN0IHN0cmVhbU1lc3NhZ2VJZCA9IHV1aWR2NCgpXG4gICAgICBpZiAoaXNBY3RpdmVTZXNzaW9uKSB7XG4gICAgICAgIGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCA9IHN0cmVhbU1lc3NhZ2VJZFxuICAgICAgfVxuXG4gICAgICBjb25zdCBoaXRsQ3R4OiBTdHJlYW1Db250ZXh0ID0ge1xuICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgIG1lc3NhZ2VJZDogc3RyZWFtTWVzc2FnZUlkLFxuICAgICAgICBwbGFjZWhvbGRlcklkOiBgYW5zd2VyLSR7c3RyZWFtTWVzc2FnZUlkfS1zdHJlYW1pbmdgLFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxlYXNlQWN0aXZlUHJvY2Vzc2luZyA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFpc0FjdGl2ZVNlc3Npb24pIHJldHVyblxuICAgICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlc3Npb25TdHJlYW1NYW5hZ2VyLnN0YXJ0Q29udGludWVTdHJlYW0oe1xuICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgIHBsYWNlaG9sZGVySWQ6IGhpdGxDdHgucGxhY2Vob2xkZXJJZCxcbiAgICAgICAgY29udGludWVSZXF1ZXN0OiB7XG4gICAgICAgICAgdGhyZWFkSWRzLFxuICAgICAgICAgIHNlc3Npb25JZDogYXBwcm92YWwuc2Vzc2lvbl9pZCxcbiAgICAgICAgICBkZWNpc2lvbjogZWRpdGVkQWN0aW9ucyA/ICdlZGl0JyA6IGRlY2lzaW9uLFxuICAgICAgICAgIGVkaXRlZEFjdGlvbnMsXG4gICAgICAgICAgYWdlbnRJZDogYWdlbnQ/LmlkIHx8ICcnLFxuICAgICAgICAgIGxhbmc6IGF1dGhVc2VyLmxhbmcsXG4gICAgICAgIH0sXG4gICAgICAgIHQsXG4gICAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0OiBoaXRsQ29udGV4dCxcbiAgICAgICAgYWdlbnRJZDogYWdlbnQ/LmlkLFxuICAgICAgICBhZ2VudE5hbWU6IGFnZW50Py5uYW1lLFxuICAgICAgICBjYWxsYmFja3M6IHtcbiAgICAgICAgICBvblN0cmVhbVVwZGF0ZTogY29udGVudCA9PiBoYW5kbGVTdHJlYW1VcGRhdGUoaGl0bEN0eCwgY29udGVudCksXG4gICAgICAgICAgb25GaW5pc2hTdHJlYW06IGZpbmlzaFBheWxvYWQgPT4ge1xuICAgICAgICAgICAgcmVsZWFzZUFjdGl2ZVByb2Nlc3NpbmcoKVxuICAgICAgICAgICAgaGFuZGxlU3RyZWFtRmluaXNoKFxuICAgICAgICAgICAgICBoaXRsQ3R4LFxuICAgICAgICAgICAgICBmaW5pc2hQYXlsb2FkLmNvbnRlbnQsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuc291cmNlcyxcbiAgICAgICAgICAgICAgZmluaXNoUGF5bG9hZC5tZW1vcnlTZXNzaW9uSWQsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuYXR0YWNobWVudHMsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuc3VnZ2VzdGlvbnMsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuY29tcGxldGVkQWdlbnRJZFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgcmVsZWFzZUFjdGl2ZVByb2Nlc3NpbmcoKVxuICAgICAgICAgICAgaGFuZGxlU3RyZWFtRXJyb3IoaGl0bEN0eClcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQXBwcm92YWxSZXF1aXJlZDogKGFwcHJvdmFsUGF5bG9hZCwgYWNjdW11bGF0ZWRDb250ZW50KSA9PiB7XG4gICAgICAgICAgICByZWxlYXNlQWN0aXZlUHJvY2Vzc2luZygpXG4gICAgICAgICAgICBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkKGhpdGxDdHgsIGFwcHJvdmFsUGF5bG9hZCwgYWNjdW11bGF0ZWRDb250ZW50KVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KVxuXG4gICAgICBpZiAoIXJlc3VsdC5zdGFydGVkKSB7XG4gICAgICAgIHJlbGVhc2VBY3RpdmVQcm9jZXNzaW5nKClcbiAgICAgICAgaWYgKHJlc3VsdC5yZWFzb24gPT09ICdsaW1pdCcpIHtcbiAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdzbmFja2Jhci1ldmVudCcsIHtcbiAgICAgICAgICAgICAgZGV0YWlsOiB7IHNob3c6IHRydWUsIHNldmVyaXR5OiAnaW5mbycsIG1lc3NhZ2U6IHQoJ2NoYXQudG9vTWFueUFjdGl2ZVNlc3Npb25zJykgfSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBhdXRoVXNlcixcbiAgICAgIGFnZW50LFxuICAgICAgY29tbWl0VG9TZXNzaW9uLFxuICAgICAgaGFuZGxlU3RyZWFtRXJyb3IsXG4gICAgICBoYW5kbGVTdHJlYW1VcGRhdGUsXG4gICAgICBoYW5kbGVTdHJlYW1GaW5pc2gsXG4gICAgICBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkLFxuICAgICAgdCxcbiAgICBdXG4gIClcblxuICBjb25zdCBpbml0aWFsaXplQ2hhdCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWZpcnN0VGltZVJlZi5jdXJyZW50KSB7XG4gICAgICBmaXJzdFRpbWVSZWYuY3VycmVudCA9IHRydWVcbiAgICB9XG4gICAgaWYgKGluaXRpYWxDaGF0SWQpIHtcbiAgICAgIGF3YWl0IGxvYWRNZXNzYWdlcygpXG4gICAgfSBlbHNlIGlmICh1c2VySW5pdGlhbE1lc3NhZ2UpIHtcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxNZXNzYWdlID0gQm9vbGVhbih1c2VySW5pdGlhbE1lc3NhZ2UubWVzc2FnZT8udHJpbSgpKVxuICAgICAgY29uc3QgaGFzSW5pdGlhbEF0dGFjaG1lbnRzID0gQm9vbGVhbih1c2VySW5pdGlhbE1lc3NhZ2UuYXR0YWNobWVudHM/Lmxlbmd0aClcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxGYXEgPSBCb29sZWFuKHVzZXJJbml0aWFsTWVzc2FnZS5mYXFJZClcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxGdWEgPSBCb29sZWFuKHVzZXJJbml0aWFsTWVzc2FnZS5mdWFJZClcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxTYyA9IEJvb2xlYW4odXNlckluaXRpYWxNZXNzYWdlLnNjSWQpXG5cbiAgICAgIGlmICghaGFzSW5pdGlhbE1lc3NhZ2UgJiYgIWhhc0luaXRpYWxBdHRhY2htZW50cyAmJiAhaGFzSW5pdGlhbEZhcSAmJiAhaGFzSW5pdGlhbEZ1YSAmJiAhaGFzSW5pdGlhbFNjKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBoaXN0b3J5ID0gbWVzc2FnZXNSZWYuY3VycmVudC5tYXAoaGlzdG9yeU1lc3NhZ2UgPT4gKHtcbiAgICAgICAgY29udGVudDogaGlzdG9yeU1lc3NhZ2UubWVzc2FnZSxcbiAgICAgICAgcm9sZTogaGlzdG9yeU1lc3NhZ2UudXNlci5pZCA9PT0gYXV0aFVzZXIuaWQudG9TdHJpbmcoKSA/IENoYXRIaXN0b3J5Um9sZS5VU0VSIDogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgIH0pKVxuXG4gICAgICBjb25zdCB7XG4gICAgICAgIGNoaXBzUHJvamVjdDogY3R4Q2hpcHNQcm9qZWN0LFxuICAgICAgICBwcm9qZWN0OiBjdHhQcm9qZWN0LFxuICAgICAgICBjbGllbnQ6IGN0eENsaWVudCxcbiAgICAgICAgdGFzazogY3R4VGFzayxcbiAgICAgIH0gPSBjb250ZXh0UmVmLmN1cnJlbnRcbiAgICAgIGNvbnN0IHByb2plY3RUb1JlcXVlc3QgPSByZXNvbHZlUHJvamVjdFRvUmVxdWVzdChjdHhDaGlwc1Byb2plY3QsIG51bGwpID8/IGN0eFByb2plY3Q/LmlkID8/IG51bGxcblxuICAgICAgY29uc29sZS5pbmZvKCdbdXNlQ2hhdE1hbmFnZXJdIFBBVEg9aW5pdGlhbGl6ZUNoYXQvdXNlckluaXRpYWxNZXNzYWdlIOKAlCBjb250ZXh0UmVmIHJlc29sdXRpb246Jywge1xuICAgICAgICBwcm9qZWN0UHJvcElkOiBjdHhQcm9qZWN0Py5pZCA/PyBudWxsLFxuICAgICAgICBjbGllbnRJZDogY3R4Q2xpZW50Py5pZCA/PyBudWxsLFxuICAgICAgICB0YXNrSWQ6IGN0eFRhc2s/LmlkID8/IG51bGwsXG4gICAgICAgIGNoaXBzUHJvamVjdElkOiBjdHhDaGlwc1Byb2plY3Q/LnByb2plY3RJZCA/PyBudWxsLFxuICAgICAgICBwcm9qZWN0VG9SZXF1ZXN0LFxuICAgICAgICBhZ2VudFR5cGU6IGFnZW50Py50eXBlLFxuICAgICAgfSlcblxuICAgICAgYXNrTWFpYSh7XG4gICAgICAgIG1lc3NhZ2U6IHVzZXJJbml0aWFsTWVzc2FnZS5tZXNzYWdlLFxuICAgICAgICBoaXN0b3J5LFxuICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RUb1JlcXVlc3QsXG4gICAgICAgIGxhbmc6IGF1dGhVc2VyLmxhbmcsXG4gICAgICAgIHVzZXJJZDogYXV0aFVzZXIuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgZmlyc3ROYW1lOiBhdXRoVXNlci5maXJzdE5hbWUsXG4gICAgICAgIGxhc3ROYW1lOiBhdXRoVXNlci5sYXN0TmFtZSxcbiAgICAgICAgY29tcGFueUlkOiBhdXRoVXNlci5jb21wYW55X2lkLnRvU3RyaW5nKCksXG4gICAgICAgIGNoYXRJZDogY3VycmVudENoYXRJZC5jdXJyZW50LFxuICAgICAgICBtZXNzYWdlSWQ6IGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCxcbiAgICAgICAgYWdlbnROYW1lOiBhZ2VudD8ubmFtZSEsXG4gICAgICAgIGFnZW50SWQ6IGFnZW50Py5pZCEsXG4gICAgICAgIGlzV2ViU2VhcmNoQWN0aXZlOiBpc1dlYlNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICBpc0RlZXBTZWFyY2hBY3RpdmU6IGlzRGVlcFNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICAuLi4oY3R4UHJvamVjdD8uZmVlSWQgIT0gbnVsbCA/IHsgZmVlSWQ6IE51bWJlcihjdHhQcm9qZWN0LmZlZUlkKSB9IDoge30pLFxuICAgICAgICAuLi5yZXNvbHZlQ2xpZW50UGF5bG9hZChjdHhDbGllbnQsIGN0eFByb2plY3QpLFxuICAgICAgICAuLi4oY3R4UHJvamVjdD8ubmFtZSA/IHsgcHJvamVjdE5hbWU6IGN0eFByb2plY3QubmFtZSB9IDoge30pLFxuICAgICAgICAuLi4oY3R4VGFzaz8uaWQgIT0gbnVsbFxuICAgICAgICAgID8geyB0YXNrSWQ6IE51bWJlcihjdHhUYXNrLmlkKSwgLi4uKGN0eFRhc2submFtZSA/IHsgdGFza05hbWU6IGN0eFRhc2submFtZSB9IDoge30pIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cyA/IHsgYXR0YWNobWVudHM6IHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cyB9IDoge30pLFxuICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLmZhcUlkID8geyBmYXFJZDogdXNlckluaXRpYWxNZXNzYWdlLmZhcUlkIH0gOiB7fSksXG4gICAgICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2UuYWdlbnRTdWdnZXN0aW9uSWQgPyB7IGFnZW50U3VnZ2VzdGlvbklkOiB1c2VySW5pdGlhbE1lc3NhZ2UuYWdlbnRTdWdnZXN0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHVzZXJJbml0aWFsTWVzc2FnZS5mdWFJZCA/IHsgZnVhSWQ6IHVzZXJJbml0aWFsTWVzc2FnZS5mdWFJZCB9IDoge30pLFxuICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLnNjSWQgPyB7IHNjSWQ6IHVzZXJJbml0aWFsTWVzc2FnZS5zY0lkIH0gOiB7fSksXG4gICAgICAgIC4uLihhZ2VudD8uZW50aXR5ICE9IG51bGwgPyB7IGFnZW50RW50aXR5OiBhZ2VudC5lbnRpdHkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50Py50eXBlICE9IG51bGwgPyB7IGFnZW50VHlwZTogYWdlbnQudHlwZSB9IDoge30pLFxuICAgICAgICAuLi4oYnVpbGRDb250ZXh0TWVzc2FnZSh1c2VySW5pdGlhbE1lc3NhZ2UubWVudGlvbnMpXG4gICAgICAgICAgPyB7IGNvbnRleHRNZXNzYWdlOiBidWlsZENvbnRleHRNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZS5tZW50aW9ucykgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLmNvbnRleHREYXRhID8geyBjb250ZXh0RGF0YTogdXNlckluaXRpYWxNZXNzYWdlLmNvbnRleHREYXRhIH0gOiB7fSksXG4gICAgICB9KVxuICAgIH1cbiAgfSwgW1xuICAgIGluaXRpYWxDaGF0SWQsXG4gICAgdXNlckluaXRpYWxNZXNzYWdlLFxuICAgIHByb2plY3QsXG4gICAgY2xpZW50LFxuICAgIHRhc2ssXG4gICAgYXV0aFVzZXIsXG4gICAgYWdlbnQsXG4gICAgYXNrTWFpYSxcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICBpc0RlZXBTZWFyY2hBY3RpdmUsXG4gIF0pXG5cbiAgY29uc3QgcmVzZXRDaGF0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IHByZXZpb3VzU2Vzc2lvbklkID0gY3VycmVudENoYXRJZC5jdXJyZW50XG4gICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIocHJldmlvdXNTZXNzaW9uSWQpXG4gICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gdXVpZHY0KClcbiAgICBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQgPSBudWxsXG4gICAgY3VycmVudENoYXRJZC5jdXJyZW50ID0gdXVpZHY0KClcbiAgICBzZXRBY3RpdmVTZXNzaW9uSWQoY3VycmVudENoYXRJZC5jdXJyZW50KVxuICAgIHJlcG9ydGVkRXZlbnQuY3VycmVudCA9IGZhbHNlXG4gICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICB9LCBbXSlcblxuICBjb25zdCBzdG9wR2VuZXJhdGlvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzdG9wU3RyZWFtaW5nKClcbiAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gIH0sIFtzdG9wU3RyZWFtaW5nXSlcblxuICByZXR1cm4ge1xuICAgIG1lc3NhZ2VzLFxuICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICBpc0xvYWRpbmdNb3JlTWVzc2FnZXMsXG4gICAgd2FpdGluZ1Jlc3BvbnNlLFxuICAgIGlzV3JpdGluZyxcbiAgICBsb2FkaW5nTWVzc2FnZSxcbiAgICBzdHJlYW1BY3Rpdml0eSxcbiAgICBhY3RpdmVMb2FkaW5ncyxcbiAgICBjdXJyZW50UHJvamVjdCxcbiAgICBjdXJyZW50Q2hhdElkOiBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgY3VycmVudE1lc3NhZ2VJZDogY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50LFxuXG4gICAgc2VuZE1lc3NhZ2UsXG4gICAgY2hhbmdlUHJvamVjdCxcbiAgICBoYW5kbGVGZWVkYmFjayxcbiAgICBoYW5kbGVBcHByb3ZhbERlY2lzaW9uLFxuICAgIGhhbmRsZVNjcm9sbCxcbiAgICBpbml0aWFsaXplQ2hhdCxcbiAgICByZXNldENoYXQsXG4gICAgc3RvcEdlbmVyYXRpb24sXG5cbiAgICBpc0Rpc2FibGVkOiB3YWl0aW5nUmVzcG9uc2UgfHwgbG9hZGluZ01lc3NhZ2VzLFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNB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
|
|
1424
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVJlZiIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwidjQiLCJ1dWlkdjQiLCJ1c2VDaGF0TWVzc2FnZXMiLCJ1c2VPcmNoZXN0cmF0b3JTdHJlYW0iLCJ1c2VUIiwidXNlVXNlciIsInVzZUdsb2JhbENvbnRleHQiLCJFVkVOVFMiLCJ1c2VFdmVudCIsIm1haWEiLCJGZWVkYmFjayIsIkNoYXRIaXN0b3J5Um9sZSIsImJ1aWxkQ29udGV4dE1lc3NhZ2UiLCJmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5IiwidXNlUHJvamVjdHMiLCJ1c2VUYWJUYXNrRGVmYXVsdCIsIlRBU0tfVVJMX1JFR0VYX1BBVFRFUk4iLCJkaXNwYXRjaE1haWFIb3Vyc0NoYXJnZWQiLCJpc0hvdXJzQ2hhcmdlVG9vbCIsImZldGNoQWdlbnREZXRhaWwiLCJidWlsZEhpdGxBY3Rpb25UeXBlTGlzdCIsImdldEhpdGxBbmFseXRpY3NBZ2VudFR5cGUiLCJnZXRUaGlua2luZ0xvYWRpbmdNZXNzYWdlIiwiZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5IiwicmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHkiLCJyZXNvbHZlSW5pdGlhbEhpdGxTdHJlYW1BY3Rpdml0eSIsInN0cmVhbWluZ1N0b3JlIiwiaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkIiwibWVyZ2VTdHJlYW1DaHVuayIsIm5vcm1hbGl6ZVNlbmRNZXNzYWdlQXJncyIsImF0dGFjaG1lbnRzT3JPcHRpb25zIiwiX29wdGlvbnMkYXR0YWNobWVudHMiLCJBcnJheSIsImlzQXJyYXkiLCJhdHRhY2htZW50cyIsIm9wdGlvbnMiLCJyZXNvbHZlUHJvamVjdFRvUmVxdWVzdCIsImNoaXBzUHJvamVjdCIsImxhc3RNZXNzYWdlUHJvamVjdElkIiwiY2hpcHNQcm9qZWN0SWQiLCJwcm9qZWN0SWQiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsInBhcnNlZCIsInJlc29sdmVDbGllbnRQYXlsb2FkIiwiY3R4Q2xpZW50IiwiY3R4UHJvamVjdCIsIl9jdHhQcm9qZWN0JGNsaWVudCIsImlkIiwiX29iamVjdFNwcmVhZCIsImNsaWVudElkIiwibmFtZSIsImNsaWVudE5hbWUiLCJjbGllbnQiLCJub3JtYWxpemVBc3Npc3RhbnRBdHRhY2htZW50cyIsInJhd0F0dGFjaG1lbnRzIiwiZmlsdGVyIiwiYXR0YWNobWVudCIsIl90eXBlb2YiLCJtYXAiLCJpbmRleCIsInRyaW0iLCJjb25jYXQiLCJ0eXBlIiwibWltZVR5cGUiLCJtaW1lX3R5cGUiLCJmdWxsRmlsZU5hbWUiLCJpbmNsdWRlcyIsIm51bWVyaWNTaXplIiwic2l6ZSIsImZpbGUiLCJGaWxlIiwidXJsX29yaWdpbmFsIiwidW5kZWZpbmVkIiwidXJsX3RodW1ibmFpbCIsInVybF9maWxlIiwicm9sZSIsImV4dHJhY3RUYXNrSWRzRnJvbVBlbmRpbmdBY3Rpb25zQXJncyIsInBlbmRpbmdBY3Rpb25zIiwiaWRzIiwicHVzaElkIiwicmF3IiwibiIsInBhcnNlSW50IiwiU3RyaW5nIiwiaXNOYU4iLCJwdXNoIiwiZm9yRWFjaCIsImFjdGlvbiIsIl9yZWMkdGFza19pZCIsImFyZ3MiLCJ0b29sX2FyZ3MiLCJyZWMiLCJ0YXNrX2lkIiwidGFza19pZHMiLCJ0YXNrcyIsInQiLCJfdHJlYyR0YXNrX2lkIiwidHJlYyIsImV4dHJhY3RUYXNrSWRzRnJvbURlbGV0ZVBlbmRpbmdBY3Rpb25zIiwidG9vbF9uYW1lIiwiX3JlYyR0YXNrX2lkMiIsImxpc3QiLCJ0aWQiLCJleHRyYWN0QWdlbnRJZEZyb21FZGl0QWdlbnRQZW5kaW5nQWN0aW9ucyIsIl9yZWMkYWdlbnRfaWQiLCJlZGl0QWN0aW9uIiwiZmluZCIsImEiLCJ0b0xvd2VyQ2FzZSIsImFnZW50X2lkIiwiYWdlbnRJZCIsImV4dHJhY3RBZ2VudElkRnJvbVBlbmRpbmdBY3Rpb25zQnlUb29sTmFtZSIsInRvb2xOYW1lIiwiX3JlZiIsIl9yZWMkYWdlbnRfaWQyIiwiZXh0cmFjdFRhc2tJZHNGcm9tQXNzaXN0YW50RGVsZXRpb25UZXh0IiwidGV4dCIsImxhYmVsZWQiLCJtYXRjaCIsImJvbGQiLCJ1c2VTdGFibGVDYWxsYmFja3MiLCJhdXRoVXNlciIsImN1cnJlbnRVc2VyIiwidG9TdHJpbmciLCJmaXJzdE5hbWUiLCJhdmF0YXIiLCJwaWN0dXJlIiwiY3VycmVudCIsInBhcnNlU1NFTGluZSIsImxpbmUiLCJfbGluZSRzcGxpdCIsInNwbGl0IiwiX2xpbmUkc3BsaXQyIiwiX3NsaWNlZFRvQXJyYXkiLCJldmVudExpbmUiLCJkYXRhTGluZSIsImV2ZW50VHlwZSIsInJlcGxhY2UiLCJkYXRhU3RyIiwiZGF0YSIsIkpTT04iLCJwYXJzZSIsInBhcnNlRXJyb3IiLCJjb25zb2xlIiwiZXJyb3IiLCJwcm9jZXNzU1NFU3RyZWFtIiwiX3JlZjIiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsInJlc3BvbnNlIiwidGhyZWFkSWQiLCJjYWxsYmFja3MiLCJfcmVzcG9uc2UkYm9keSIsInJlYWRlciIsImRlY29kZXIiLCJidWZmZXIiLCJhY2N1bXVsYXRlZENvbnRlbnQiLCJpc1N0cmVhbUNvbXBsZXRlIiwiaGFuZGxlTGluZSIsIl95aWVsZCRyZWFkZXIkcmVhZCIsImRvbmUiLCJ2YWx1ZSIsImxpbmVzIiwiaSIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiX2hhbmRsZUxpbmUiLCJldmVudERhdGEiLCJvblRoaW5raW5nIiwiY29udGVudCIsIm9uVG9rZW4iLCJfZXZlbnREYXRhJGFnZW50X2lkIiwiZmluYWxDb250ZW50Iiwic291cmNlcyIsIm1lbW9yeVNlc3Npb25JZCIsIm1lbW9yeV9zZXNzaW9uX2lkIiwic3VnZ2VzdGlvbnMiLCJzdWdnZXN0X3JlcGx5IiwiYWdlbnRJZFJhdyIsImNvbXBsZXRlZEFnZW50SWQiLCJvbkNvbXBsZXRlIiwibWVzc2FnZSIsIm9uTm9kZSIsIl9ldmVudERhdGEkYWdlbnRfaWQyIiwiX2NhbGxiYWNrcyRvbkFwcHJvdmFsIiwib25BcHByb3ZhbFJlcXVpcmVkIiwiY2FsbCIsIm9uRXJyb3IiLCJib2R5IiwiZ2V0UmVhZGVyIiwiRXJyb3IiLCJUZXh0RGVjb2RlciIsInJlYWQiLCJzZW50IiwiYWJydXB0IiwiZGVjb2RlIiwic3RyZWFtIiwicG9wIiwibGVuZ3RoIiwic3RvcCIsIl94IiwiX3gyIiwiX3gzIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJ1c2VDaGF0TWFuYWdlciIsIl9yZWYzIiwiaW5pdGlhbENoYXRJZCIsImNoYXRJZCIsInVzZXJJbml0aWFsTWVzc2FnZSIsIl9yZWYzJGFnZW50cyIsImFnZW50cyIsIl91c2VUIiwiX3VzZUdsb2JhbENvbnRleHQiLCJwcm9qZWN0Iiwic2V0UHJvamVjdCIsInNldENsaWVudCIsInRhc2siLCJzZXRUYXNrIiwiYWdlbnQiLCJpc1dlYlNlYXJjaEFjdGl2ZSIsImlzRGVlcFNlYXJjaEFjdGl2ZSIsInNldENoaXBzUHJvamVjdCIsImV2ZW50IiwiX3VzZVByb2plY3RzIiwiZmV0Y2hQcm9qZWN0cyIsIl91c2VTdGFibGVDYWxsYmFja3MiLCJfdXNlVGFiVGFza0RlZmF1bHQiLCJnZXRUYWJUYXNrRGVmYXVsdCIsIl9jaGlwc1Byb2plY3QkcHJvamVjdCIsIl9jaGlwc1Byb2plY3QkcHJvamVjdDIiLCJfcHJvamVjdCRpZCIsIl9jbGllbnQkaWQiLCJfdGFzayRpZCIsImluZm8iLCJjaGlwc1Byb2plY3ROYW1lIiwicHJvamVjdE5hbWUiLCJwcm9qZWN0UHJvcElkIiwidGFza0lkIiwiY3VycmVudE1lc3NhZ2VJZCIsImN1cnJlbnRVc2VyUXVlc3Rpb24iLCJjdXJyZW50Q2hhdElkIiwicmVwb3J0ZWRFdmVudCIsIm1lc3NhZ2VzUmVmIiwibGFzdE1hbnVhbEFwcHJvdmFsUmVmIiwiaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYiLCJpc1Byb2Nlc3NpbmdSZWYiLCJmaXJzdFRpbWVSZWYiLCJzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmIiwiYWN0aXZlU3RyZWFtQ2hhdElkUmVmIiwiYWJvcnRTdHJlYW1TaWxlbnRseVJlZiIsImNsZWFyU3RyZWFtVWlSZWYiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiYWN0aXZlTG9hZGluZ3MiLCJzZXRBY3RpdmVMb2FkaW5ncyIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwiaXNDb250aW51aW5nU3RyZWFtIiwic2V0SXNDb250aW51aW5nU3RyZWFtIiwiaXNXZWJTZWFyY2hBY3RpdmVSZWYiLCJpc0RlZXBTZWFyY2hBY3RpdmVSZWYiLCJjb250ZXh0UmVmIiwiX3VzZUNoYXRNZXNzYWdlcyIsImxvYWRpbmdNZXNzYWdlcyIsIm1lc3NhZ2VzIiwiaXNMb2FkaW5nTW9yZU1lc3NhZ2VzIiwibG9hZE1lc3NhZ2VzIiwiYWRkTWVzc2FnZSIsInJlbW92ZU1lc3NhZ2UiLCJoYW5kbGVTY3JvbGwiLCJjdXN0b21FdmVudCIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwiZG9jdW1lbnQiLCJkaXNwYXRjaEV2ZW50IiwiY2xlYXIiLCJoYW5kbGVTdHJlYW1FcnJvciIsImVycm9yTWVzc2FnZSIsImVycm9yUmF3TWVzc2FnZSIsIl9lcnJvclJhd01lc3NhZ2UkbWF0YyIsIl9lcnJvclJhd01lc3NhZ2UkbWF0YzIiLCJ0ZW1wTWVzc2FnZUlkIiwidXNlZCIsImlzRXJyb3IiLCJkYXRlIiwiRGF0ZSIsInVzZXIiLCJBU1NJU1RBTlQiLCJoYW5kbGVTdHJlYW1VcGRhdGUiLCJzdGFydCIsInNldFRleHQiLCJoYW5kbGVTdHJlYW1GaW5pc2giLCJfcmVmNCIsIl9jYWxsZWUyIiwiX3ByZXZpb3VzTWVzc2FnZSRhcHByIiwiX3dpbmRvdyR0YXNrUGFuZWwiLCJfY3JlYXRlQWdlbnRGb2xsb3dVcCIsIl9lZGl0QWdlbnRGb2xsb3dVcCIsInRhc2tVcmxSZWdleCIsIm1hdGNoZXMiLCJjb250ZW50VG9BZGQiLCJwcmV2aW91c01lc3NhZ2UiLCJoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlIiwiVEFTS19DUkVBVElPTl9UT09MUyIsIlRBU0tfRURJVF9UT09MUyIsIlRBU0tfREVMRVRFX1RPT0xTIiwid2FzVGFza0NyZWF0aW9uIiwid2FzVGFza0VkaXQiLCJ3YXNUYXNrRGVsZXRlIiwid2FzQ3JlYXRlQWdlbnRBcHByb3ZlZCIsIndhc0NvbmZpZ3VyZUFnZW50QWNjZXNzQXBwcm92ZWQiLCJjcmVhdGVBZ2VudEZvbGxvd1VwIiwiY29uZmlndXJlZEFnZW50SWQiLCJ3YXNFZGl0QWdlbnRBcHByb3ZlZCIsImVkaXRBZ2VudEZvbGxvd1VwIiwiZnJvbVN0cmVhbSIsImZyb21BcmdzIiwicmVzb2x2ZWRBZ2VudElkIiwidGFza0lkc0Zyb21VcmxzIiwidGFza0lkc0Zyb21EZWxldGVBcHByb3ZhbCIsInRhc2tJZHNGcm9tRGVsZXRpb25UZXh0IiwidGFza0lkc0ZvckRhc2hib2FyZCIsInNob3VsZFN5bmNEYXNoYm9hcmQiLCJ0YXNrSWRzIiwidGFiIiwidGFiU2VnbWVudCIsImxhc3RQcm9qZWN0TWVzc2FnZSIsImNvbnRleHRQcm9qZWN0SWRSYXciLCJjb250ZXh0UHJvamVjdElkIiwicGF0aE1hdGNoIiwicm91dGVQcm9qZWN0SWQiLCJpc09uUHJvamVjdFJvdXRlIiwiX3dpbmRvdyRuZXdQcm9qZWN0RGFzIiwiX3dpbmRvdyRuZXdQcm9qZWN0RGFzMiIsIl93aW5kb3ckbmV3UHJvamVjdERhczMiLCJfd2luZG93JG5ld1Byb2plY3REYXM0IiwiX3dpbmRvdyRuZXdQcm9qZWN0RGFzNSIsIl93aW5kb3ckbmV3UHJvamVjdERhczYiLCJvcGVuVGFza1BhbmVsSWQiLCJtYW51YWxBcHByb3ZhbCIsIm1hbnVhbFdhc1Rhc2tFZGl0IiwibWFudWFsV2FzVGFza0RlbGV0ZSIsImhvdXJzVG9vbHNGcm9tQXBwcm92YWwiLCJ3YXNIb3Vyc0NoYXJnZUFwcHJvdmVkIiwibWFudWFsSG91cnNUb29sIiwid2FzSG91cnNDaGFyZ2VNYW51YWxBcHByb3ZlZCIsInRvb2xzIiwiX21hbnVhbEFwcHJvdmFsJHRvb2xBIiwibWFudWFsUHNldWRvQWN0aW9uIiwiYWZmZWN0ZWRUYXNrSWRzIiwiX3dpbmRvdyR0YXNrUGFuZWwyIiwiX3dpbmRvdyR0YXNrUGFuZWwyJHJlIiwiX2NvbnRleHQyIiwiUmVnRXhwIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwibWF0Y2hBbGwiLCJtIiwiYXQiLCJhcHByb3ZhbCIsInBlbmRpbmdfYWN0aW9ucyIsInNvbWUiLCJhcHByb3ZhbFN0YXR1cyIsIndpbmRvdyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMiLCJhaUNoYXRIaXRsT3B0aW9uIiwiYWdlbnRfdHlwZSIsImFjdGlvbl90eXBlIiwiZGVjaXNpb24iLCJvcHRpb24iLCJjcmVhdGVkX2FnZW50X2lkIiwidXJsIiwibXNnIiwibG9jYXRpb24iLCJwYXRobmFtZSIsIm5ld1Byb2plY3REYXNoYm9hcmQiLCJhZGRFeGlzdGluZ1Rhc2tUb0Rhc2hib2FyZCIsImVkaXRFeGlzdGluZ1Rhc2tJbkRhc2hib2FyZCIsImRlbGV0ZUV4aXN0aW5nVGFza0Zyb21EYXNoYm9hcmQiLCJ0YXNrUGFuZWwiLCJ2aWEiLCJzb3VyY2UiLCJzZXNzaW9uSWQiLCJ0b29sQXJncyIsInJlZmV0Y2hUYXNrIiwidGhlbiIsImNoYXRBZ2VudCIsImVyciIsIl94NCIsIl94NSIsIl94NiIsIl94NyIsIl94OCIsIl94OSIsImhhbmRsZVN0cmVhbVN0b3AiLCJpc0Zyb250ZW5kQ2FuY2VsbGVkIiwic2V0VGltZW91dCIsImhhbmRsZUFwcHJvdmFsUmVxdWlyZWQiLCJfYXBwcm92YWwkcGVuZGluZ19hY3QiLCJoaXRsQ29udGV4dCIsIm1lc3NhZ2VJZCIsIm9yaWdpbmFsX3RocmVhZF9pZCIsIm1lc3NhZ2VUZXh0IiwidGhyZWFkSWRzIiwidGhyZWFkX2lkIiwibWFudWFsX2FwcHJvdmFsX2RldGVjdGVkIiwiX2FwcHJvdmFsJHBlbmRpbmdfYWN0MiIsIl9yZWY1IiwiX3Rvb2xfbmFtZSIsIl90b29sX2FyZ3MiLCJmaXJzdEFjdGlvbiIsIl91c2VPcmNoZXN0cmF0b3JTdHJlYSIsIm9uU3RyZWFtVXBkYXRlIiwib25GaW5pc2hTdHJlYW0iLCJvblN0b3AiLCJhc2tNYWlhIiwid2FpdGluZ1Jlc3BvbnNlIiwiaXNMb2FkaW5nIiwiaXNXcml0aW5nIiwibG9hZGluZ01lc3NhZ2UiLCJzdHJlYW1BY3Rpdml0eSIsInVwZGF0ZVN0cmVhbUFjdGl2aXR5Iiwic3RvcFN0cmVhbWluZyIsImFib3J0U3RyZWFtU2lsZW50bHkiLCJjdXJyZW50UHJvamVjdCIsInNlbmRNZXNzYWdlIiwiX3JlZjYiLCJfY2FsbGVlMyIsImZhcUlkIiwiYWdlbnRTdWdnZXN0aW9uSWQiLCJtZW50aW9ucyIsImZ1YUlkIiwic2NJZCIsIl9tZXNzYWdlc1JlZiRjdXJyZW50IiwiX25vcm1hbGl6ZVNlbmRNZXNzYWdlIiwiZWZmZWN0aXZlTWVudGlvbnMiLCJjb250ZXh0TWVzc2FnZSIsInBheWxvYWRGdWFJZCIsInBheWxvYWRTY0lkIiwicGF5bG9hZENvbnRleHREYXRhIiwiZGlzcGxheU1lc3NhZ2UiLCJuZXdNZXNzYWdlSWQiLCJsYXN0TWVzc2FnZVdpdGhQcm9qZWN0IiwiY3VycmVudEFnZW50RnJvbU1lc3NhZ2VzIiwic3RyZWFtaW5nUGxhY2Vob2xkZXJJZCIsImZpbmFsTWVzc2FnZSIsIl9vcHRpb25zJHByb2plY3RDaGFuZyIsIl9jb250ZXh0UmVmJGN1cnJlbnQkcCIsImhpc3RvcnkiLCJfY29udGV4dFJlZiRjdXJyZW50IiwiY3R4Q2hpcHNQcm9qZWN0IiwiY3R4VGFzayIsInByb2plY3RUb1JlcXVlc3QiLCJwcm9qZWN0cyIsInBheWxvYWRGYXFJZCIsInBheWxvYWRBZ2VudFN1Z2dlc3Rpb25JZCIsInBheWxvYWREYXRhIiwiX2NvbnRleHQzIiwiY29udGV4dERhdGEiLCJwbUFpVHlwZWRUZXh0IiwiVVNFUiIsInByb2plY3RDaGFuZ2VkIiwiaW5jb21lVHlwZSIsImhpc3RvcnlNZXNzYWdlIiwiYWdlbnRUeXBlIiwibGFuZyIsInVzZXJJZCIsImxhc3ROYW1lIiwiY29tcGFueUlkIiwiY29tcGFueV9pZCIsImFnZW50TmFtZSIsImZlZUlkIiwidGFza05hbWUiLCJlbnRpdHkiLCJhZ2VudEVudGl0eSIsIl94MCIsIl94MSIsIl94MTAiLCJfeDExIiwiX3gxMiIsIl94MTMiLCJfeDE0IiwiY2hhbmdlUHJvamVjdCIsIl9wcm9qZWN0JGlkMiIsIl9jaGlwc1Byb2plY3QkcHJvamVjdDMiLCJvcHRpb25JZCIsImhhbmRsZUZlZWRiYWNrIiwiX3JlZjciLCJfY2FsbGVlNCIsImZlZWRiYWNrUHJvcCIsImNoYXRNZXNzYWdlSWQiLCJfY29udGV4dDQiLCJDaGF0cyIsIndhc0hlbHBmdWxDaGF0IiwiVEhVTUJTX1VQIiwid2FzSGVscGZ1bCIsIl94MTUiLCJfeDE2IiwiaGFuZGxlQXBwcm92YWxEZWNpc2lvbiIsIl9yZWY4IiwiX2NhbGxlZTUiLCJlZGl0ZWRBY3Rpb25zIiwibWVzc2FnZVdpdGhBcHByb3ZhbCIsImxvYWRpbmdLZXkiLCJob3Vyc1Rvb2xzSW5EZWNpc2lvbiIsImluaXRpYWxBY3Rpdml0eSIsImV4aXN0aW5nTWVzc2FnZSIsIm5ld1N0YXR1cyIsInN0cmVhbVNldHRsZWQiLCJfdCIsIl9jb250ZXh0NSIsIl9tJGFwcHJvdmFsIiwic2Vzc2lvbl9pZCIsIl9kZWZpbmVQcm9wZXJ0eSIsIk9yY2hlc3RyYXRvciIsImNvbnRpbnVlVGhyZWFkIiwib2siLCJhY3Rpdml0eSIsInBoYXNlIiwiY3VycmVudFRocmVhZElkIiwibm9kZUFjdGl2aXR5IiwidXNlUmVzdW1pbmdGYWxsYmFjayIsIm5ld0xvYWRpbmdzIiwiYXBwcm92YWxQYXlsb2FkIiwiZmluaXNoIiwiX3gxNyIsIl94MTgiLCJfeDE5IiwiaW5pdGlhbGl6ZUNoYXQiLCJfY2FsbGVlNiIsIl91c2VySW5pdGlhbE1lc3NhZ2UkbSIsIl91c2VySW5pdGlhbE1lc3NhZ2UkYSIsIl9yZWYwIiwiX3Jlc29sdmVQcm9qZWN0VG9SZXF1IiwiX2N0eFByb2plY3QkaWQiLCJfY3R4Q2xpZW50JGlkIiwiX2N0eFRhc2skaWQiLCJfY3R4Q2hpcHNQcm9qZWN0JHByb2oiLCJoYXNJbml0aWFsTWVzc2FnZSIsImhhc0luaXRpYWxBdHRhY2htZW50cyIsImhhc0luaXRpYWxGYXEiLCJoYXNJbml0aWFsRnVhIiwiaGFzSW5pdGlhbFNjIiwiX2NvbnRleHRSZWYkY3VycmVudDIiLCJfY29udGV4dDYiLCJCb29sZWFuIiwicmVzZXRDaGF0Iiwic3RvcEdlbmVyYXRpb24iLCJpc0Rpc2FibGVkIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2hvb2tzL3VzZUNoYXRNYW5hZ2VyL3VzZUNoYXRNYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIHJhZGl4ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1uZXN0ZWQtdGVybmFyeSAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGVkLW9wdGlvbmFsLWNoYWluICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlUmVmLCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJ1xuaW1wb3J0IHsgdXNlQ2hhdE1lc3NhZ2VzIH0gZnJvbSAnLi4vdXNlQ2hhdE1lc3NhZ2VzJ1xuaW1wb3J0IHsgdXNlT3JjaGVzdHJhdG9yU3RyZWFtIH0gZnJvbSAnLi4vdXNlT3JjaGVzdHJhdG9yU3RyZWFtJ1xuaW1wb3J0IHsgdXNlVCB9IGZyb20gJy4uL3VzZVQnXG5pbXBvcnQgeyBBdHRhY2htZW50RmlsZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbW9sZWN1bGVzL0NoYXRGb290ZXIvQ2hhdEZvb3RlcidcbmltcG9ydCB7IFNlbmRNZXNzYWdlT3B0aW9ucywgVXNlQ2hhdE1hbmFnZXJQcm9wcyB9IGZyb20gJy4vdXNlQ2hhdE1hbmFnZXIuaW50ZXJmYWNlJ1xuaW1wb3J0IHsgdXNlVXNlciwgQ09SVXNlciB9IGZyb20gJy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgeyB1c2VHbG9iYWxDb250ZXh0IH0gZnJvbSAnLi4vLi4vY29udGV4dC9nbG9iYWwtY29udGV4dCdcbmltcG9ydCB7IEVWRU5UUywgdXNlRXZlbnQgfSBmcm9tICcuLi91c2VFdmVudCdcbmltcG9ydCBtYWlhIGZyb20gJy4uLy4uL3NlcnZpY2VzL21haWEnXG5pbXBvcnQgeyBGZWVkYmFjayB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbW9sZWN1bGVzL01lc3NhZ2VGZWVkYmFjay9NZXNzYWdlRmVlZGJhY2snXG5pbXBvcnQgeyBDaGF0TWVzc2FnZSwgQ2hhdE1lc3NhZ2VVc2VyLCBDaGF0SGlzdG9yeVJvbGUsIEFwcHJvdmFsUmVxdWVzdCwgUGVuZGluZ0FjdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQgeyBDb250ZXh0TWVudGlvbiwgQ29udGV4dE1lc3NhZ2UsIGJ1aWxkQ29udGV4dE1lc3NhZ2UgfSBmcm9tICcuLi8uLi90eXBlcy9jb250ZXh0TWVudGlvbidcbmltcG9ydCB7IGZvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZUZvckRpc3BsYXkgfSBmcm9tICcuLi8uLi91dGlscy9mb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2UnXG5cbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi90eXBlcy9Qcm9qZWN0J1xuaW1wb3J0IHsgdXNlUHJvamVjdHMgfSBmcm9tICcuLi91c2VQcm9qZWN0cydcbmltcG9ydCB7IHVzZVRhYlRhc2tEZWZhdWx0IH0gZnJvbSAnLi4vdXNlVGFiVGFza0RlZmF1bHQnXG5pbXBvcnQgeyBUQVNLX1VSTF9SRUdFWF9QQVRURVJOIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3Rhc2tVcmxzJ1xuaW1wb3J0IHsgZGlzcGF0Y2hNYWlhSG91cnNDaGFyZ2VkLCBpc0hvdXJzQ2hhcmdlVG9vbCB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9wbGFubmVyU3luY0V2ZW50cydcbmltcG9ydCB7IGZldGNoQWdlbnREZXRhaWwgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tYWlhL0FnZW50cy9mZXRjaEFnZW50RGV0YWlsJ1xuaW1wb3J0IHsgYnVpbGRIaXRsQWN0aW9uVHlwZUxpc3QsIGdldEhpdGxBbmFseXRpY3NBZ2VudFR5cGUgfSBmcm9tICcuLi8uLi91dGlscy9oaXRsQW5hbHl0aWNzJ1xuaW1wb3J0IHR5cGUgeyBTdHJlYW1BY3Rpdml0eSB9IGZyb20gJy4uLy4uL3R5cGVzL3N0cmVhbUFjdGl2aXR5J1xuaW1wb3J0IHtcbiAgZ2V0VGhpbmtpbmdMb2FkaW5nTWVzc2FnZSxcbiAgZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5LFxuICByZXNvbHZlSGl0bE5vZGVTdHJlYW1BY3Rpdml0eSxcbiAgcmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHksXG4gIHR5cGUgSGl0bEV4ZWN1dGlvbkNvbnRleHQsXG59IGZyb20gJy4uLy4uL3V0aWxzL3N0cmVhbUFjdGl2aXR5TWVzc2FnZXMnXG5pbXBvcnQgeyBzdHJlYW1pbmdTdG9yZSB9IGZyb20gJy4uL3VzZVN0cmVhbWluZ01lc3NhZ2UnXG5pbXBvcnQgeyBpc0NvbXBsZXRlTGlrZVNzZVBheWxvYWQsIG1lcmdlU3RyZWFtQ2h1bmsgfSBmcm9tICcuLi8uLi91dGlscy9zc2VTdHJlYW1Db250ZW50J1xuXG50eXBlIEF0dGFjaG1lbnRzT3JPcHRpb25zID0gQXR0YWNobWVudEZpbGVbXSB8IFNlbmRNZXNzYWdlT3B0aW9uc1xuXG5jb25zdCBub3JtYWxpemVTZW5kTWVzc2FnZUFyZ3MgPSAoYXR0YWNobWVudHNPck9wdGlvbnM/OiBBdHRhY2htZW50c09yT3B0aW9ucykgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShhdHRhY2htZW50c09yT3B0aW9ucykpIHtcbiAgICByZXR1cm4geyBhdHRhY2htZW50czogYXR0YWNobWVudHNPck9wdGlvbnMsIG9wdGlvbnM6IHt9IGFzIFNlbmRNZXNzYWdlT3B0aW9ucyB9XG4gIH1cblxuICBjb25zdCBvcHRpb25zOiBTZW5kTWVzc2FnZU9wdGlvbnMgPSBhdHRhY2htZW50c09yT3B0aW9ucyA/PyB7fVxuICByZXR1cm4geyBhdHRhY2htZW50czogb3B0aW9ucy5hdHRhY2htZW50cyA/PyBbXSwgb3B0aW9ucyB9XG59XG5cbi8qKiBjaGlwc1Byb2plY3QgZXMgbGEgZnVlbnRlIGRlIHZlcmRhZCBkZWwgcGluIHZpc2libGU7IHNpIG5vIGhheSBwaW4sIHJlc3RhdXJhciBkZXNkZSBoaXN0b3JpYWwuICovXG5jb25zdCByZXNvbHZlUHJvamVjdFRvUmVxdWVzdCA9IChcbiAgY2hpcHNQcm9qZWN0OiB7IHByb2plY3RJZD86IHN0cmluZyB9IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbGFzdE1lc3NhZ2VQcm9qZWN0SWQ6IG51bWJlciB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbik6IG51bWJlciB8IG51bGwgPT4ge1xuICBjb25zdCBjaGlwc1Byb2plY3RJZCA9IGNoaXBzUHJvamVjdD8ucHJvamVjdElkID8gTnVtYmVyKGNoaXBzUHJvamVjdC5wcm9qZWN0SWQpIDogbnVsbFxuICBpZiAoY2hpcHNQcm9qZWN0SWQgIT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUoY2hpcHNQcm9qZWN0SWQpKSB7XG4gICAgcmV0dXJuIGNoaXBzUHJvamVjdElkXG4gIH1cbiAgaWYgKGxhc3RNZXNzYWdlUHJvamVjdElkICE9IG51bGwpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIobGFzdE1lc3NhZ2VQcm9qZWN0SWQpXG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYXJzZWQpID8gcGFyc2VkIDogbnVsbFxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmNvbnN0IHJlc29sdmVDbGllbnRQYXlsb2FkID0gKFxuICBjdHhDbGllbnQ6IHsgaWQ/OiBudW1iZXI7IG5hbWU/OiBzdHJpbmcgfSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGN0eFByb2plY3Q6IFByb2plY3QgfCBudWxsIHwgdW5kZWZpbmVkXG4pOiB7IGNsaWVudElkPzogbnVtYmVyOyBjbGllbnROYW1lPzogc3RyaW5nIH0gPT4ge1xuICBpZiAoY3R4Q2xpZW50Py5pZCkge1xuICAgIHJldHVybiB7IGNsaWVudElkOiBjdHhDbGllbnQuaWQsIC4uLihjdHhDbGllbnQubmFtZSA/IHsgY2xpZW50TmFtZTogY3R4Q2xpZW50Lm5hbWUgfSA6IHt9KSB9XG4gIH1cbiAgaWYgKGN0eFByb2plY3Q/LmNsaWVudElkICE9IG51bGwpIHtcbiAgICByZXR1cm4geyBjbGllbnRJZDogTnVtYmVyKGN0eFByb2plY3QuY2xpZW50SWQpIH1cbiAgfVxuICBpZiAoY3R4UHJvamVjdD8uY2xpZW50Py5pZCkge1xuICAgIHJldHVybiB7XG4gICAgICBjbGllbnRJZDogY3R4UHJvamVjdC5jbGllbnQuaWQsXG4gICAgICAuLi4oY3R4UHJvamVjdC5jbGllbnQubmFtZSA/IHsgY2xpZW50TmFtZTogY3R4UHJvamVjdC5jbGllbnQubmFtZSB9IDoge30pLFxuICAgIH1cbiAgfVxuICByZXR1cm4ge31cbn1cblxuY29uc3Qgbm9ybWFsaXplQXNzaXN0YW50QXR0YWNobWVudHMgPSAocmF3QXR0YWNobWVudHM6IHVua25vd24pOiBBdHRhY2htZW50RmlsZVtdID0+IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJhd0F0dGFjaG1lbnRzKSkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcmV0dXJuIHJhd0F0dGFjaG1lbnRzXG4gICAgLmZpbHRlcigoYXR0YWNobWVudCk6IGF0dGFjaG1lbnQgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4gISFhdHRhY2htZW50ICYmIHR5cGVvZiBhdHRhY2htZW50ID09PSAnb2JqZWN0JylcbiAgICAubWFwKChhdHRhY2htZW50LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9XG4gICAgICAgIHR5cGVvZiBhdHRhY2htZW50Lm5hbWUgPT09ICdzdHJpbmcnICYmIGF0dGFjaG1lbnQubmFtZS50cmltKCkgPyBhdHRhY2htZW50Lm5hbWUudHJpbSgpIDogYGZpbGUtJHtpbmRleCArIDF9YFxuICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiBhdHRhY2htZW50LnR5cGUgPT09ICdzdHJpbmcnICYmIGF0dGFjaG1lbnQudHlwZS50cmltKCkgPyBhdHRhY2htZW50LnR5cGUudHJpbSgpIDogJ3BkZidcbiAgICAgIGNvbnN0IG1pbWVUeXBlID0gdHlwZW9mIGF0dGFjaG1lbnQubWltZV90eXBlID09PSAnc3RyaW5nJyA/IGF0dGFjaG1lbnQubWltZV90eXBlIDogJydcbiAgICAgIGNvbnN0IGZ1bGxGaWxlTmFtZSA9IG5hbWUuaW5jbHVkZXMoJy4nKSA/IG5hbWUgOiBgJHtuYW1lfS4ke3R5cGV9YFxuICAgICAgY29uc3QgbnVtZXJpY1NpemUgPVxuICAgICAgICB0eXBlb2YgYXR0YWNobWVudC5zaXplID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gYXR0YWNobWVudC5zaXplXG4gICAgICAgICAgOiBOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKGF0dGFjaG1lbnQuc2l6ZSkpXG4gICAgICAgICAgICA/IE51bWJlcihhdHRhY2htZW50LnNpemUpXG4gICAgICAgICAgICA6IDBcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsZTogbmV3IEZpbGUoW10sIGZ1bGxGaWxlTmFtZSwgeyB0eXBlOiBtaW1lVHlwZSB9KSxcbiAgICAgICAgaWQ6XG4gICAgICAgICAgdHlwZW9mIGF0dGFjaG1lbnQuaWQgPT09ICdzdHJpbmcnICYmIGF0dGFjaG1lbnQuaWQudHJpbSgpXG4gICAgICAgICAgICA/IGF0dGFjaG1lbnQuaWRcbiAgICAgICAgICAgIDogYGFzc2lzdGFudC1maWxlLSR7aW5kZXh9LSR7ZnVsbEZpbGVOYW1lfWAsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHNpemU6IG51bWVyaWNTaXplLFxuICAgICAgICB0eXBlLFxuICAgICAgICB1cmxfb3JpZ2luYWw6IHR5cGVvZiBhdHRhY2htZW50LnVybF9vcmlnaW5hbCA9PT0gJ3N0cmluZycgPyBhdHRhY2htZW50LnVybF9vcmlnaW5hbCA6IHVuZGVmaW5lZCxcbiAgICAgICAgdXJsX3RodW1ibmFpbDogdHlwZW9mIGF0dGFjaG1lbnQudXJsX3RodW1ibmFpbCA9PT0gJ3N0cmluZycgPyBhdHRhY2htZW50LnVybF90aHVtYm5haWwgOiB1bmRlZmluZWQsXG4gICAgICAgIHVybF9maWxlOiB0eXBlb2YgYXR0YWNobWVudC51cmxfZmlsZSA9PT0gJ3N0cmluZycgPyBhdHRhY2htZW50LnVybF9maWxlIDogdW5kZWZpbmVkLFxuICAgICAgICByb2xlOiBhdHRhY2htZW50LnJvbGUgPT09ICdhc3Npc3RhbnQnID8gJ2Fzc2lzdGFudCcgOiAndXNlcicsXG4gICAgICB9XG4gICAgfSlcbn1cblxuLyoqIEV4dHJhZSB0YXNrX2lkcyBkZSBsb3MgdG9vbF9hcmdzIGRlIHBlbmRpbmdfYWN0aW9ucywgY3VicmllbmRvIGxhcyBmb3JtYXMgY29tdW5lczpcbiAqICAtIGB7IHRhc2tfaWQgfWAgbyBgeyBpZCB9YFxuICogIC0gYHsgdGFza19pZHM6IFtdIH1gXG4gKiAgLSBgeyB0YXNrczogW3sgdGFza19pZHxpZCB9LCAuLi5dIH1gXG4gKiAgw5p0aWwgcGFyYSB0b29scyBkZSBlZGl0L2Fzc2lnbi9kZWxldGUgY3VhbmRvIGxhIHJlc3B1ZXN0YSBkZWwgTExNIG5vIGluY2x1eWUgVVJMcyAvdGFza3MvLi4uL2RldGFpbC4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RUYXNrSWRzRnJvbVBlbmRpbmdBY3Rpb25zQXJncyhwZW5kaW5nQWN0aW9uczogUGVuZGluZ0FjdGlvbltdKTogbnVtYmVyW10ge1xuICBjb25zdCBpZHM6IG51bWJlcltdID0gW11cbiAgY29uc3QgcHVzaElkID0gKHJhdzogdW5rbm93bikgPT4ge1xuICAgIGlmIChyYXcgPT0gbnVsbCkgcmV0dXJuXG4gICAgY29uc3QgbiA9IHBhcnNlSW50KFN0cmluZyhyYXcpLCAxMClcbiAgICBpZiAoIU51bWJlci5pc05hTihuKSkgaWRzLnB1c2gobilcbiAgfVxuICBwZW5kaW5nQWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgaWYgKCFhY3Rpb24gfHwgdHlwZW9mIGFjdGlvbiAhPT0gJ29iamVjdCcpIHJldHVyblxuICAgIGNvbnN0IGFyZ3MgPSBhY3Rpb24udG9vbF9hcmdzXG4gICAgaWYgKCEoYXJncyAmJiB0eXBlb2YgYXJncyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoYXJncykpKSByZXR1cm5cbiAgICBjb25zdCByZWMgPSBhcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgcHVzaElkKHJlYy50YXNrX2lkID8/IHJlYy5pZClcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWMudGFza19pZHMpKSB7XG4gICAgICByZWMudGFza19pZHMuZm9yRWFjaChwdXNoSWQpXG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlYy50YXNrcykpIHtcbiAgICAgIHJlYy50YXNrcy5mb3JFYWNoKHQgPT4ge1xuICAgICAgICBpZiAodCAmJiB0eXBlb2YgdCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodCkpIHtcbiAgICAgICAgICBjb25zdCB0cmVjID0gdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICAgIHB1c2hJZCh0cmVjLnRhc2tfaWQgPz8gdHJlYy5pZClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH0pXG4gIHJldHVybiBpZHNcbn1cblxuLyoqIHRhc2tfaWQgLyB0YXNrX2lkcyBlbiBwZW5kaW5nX2FjdGlvbnMgZGUgZGVsZXRlXyogKGxhIHJlc3B1ZXN0YSBwdWVkZSBubyBpbmNsdWlyIFVSTHMgL3Rhc2tzL+KApi9kZXRhaWwpLiAqL1xuZnVuY3Rpb24gZXh0cmFjdFRhc2tJZHNGcm9tRGVsZXRlUGVuZGluZ0FjdGlvbnMocGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXSk6IG51bWJlcltdIHtcbiAgY29uc3QgaWRzOiBudW1iZXJbXSA9IFtdXG4gIHBlbmRpbmdBY3Rpb25zLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICBpZiAoIWFjdGlvbiB8fCB0eXBlb2YgYWN0aW9uICE9PSAnb2JqZWN0JykgcmV0dXJuXG4gICAgY29uc3QgYXJncyA9IGFjdGlvbi50b29sX2FyZ3NcbiAgICBpZiAoIShhcmdzICYmIHR5cGVvZiBhcmdzID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShhcmdzKSkpIHJldHVyblxuICAgIGNvbnN0IHJlYyA9IGFyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICBpZiAoYWN0aW9uLnRvb2xfbmFtZSA9PT0gJ2RlbGV0ZV90YXNrJykge1xuICAgICAgY29uc3QgcmF3ID0gcmVjLnRhc2tfaWQgPz8gcmVjLmlkXG4gICAgICBpZiAocmF3ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgbiA9IHBhcnNlSW50KFN0cmluZyhyYXcpLCAxMClcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIGlkcy5wdXNoKG4pXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhY3Rpb24udG9vbF9uYW1lID09PSAnZGVsZXRlX3Rhc2tzX2JhdGNoJykge1xuICAgICAgY29uc3QgbGlzdCA9IHJlYy50YXNrX2lkc1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICAgICAgbGlzdC5mb3JFYWNoKHRpZCA9PiB7XG4gICAgICAgICAgY29uc3QgbiA9IHBhcnNlSW50KFN0cmluZyh0aWQpLCAxMClcbiAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihuKSkgaWRzLnB1c2gobilcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHJldHVybiBpZHNcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEFnZW50SWRGcm9tRWRpdEFnZW50UGVuZGluZ0FjdGlvbnMocGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXSk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBlZGl0QWN0aW9uID0gcGVuZGluZ0FjdGlvbnMuZmluZChhID0+IChhLnRvb2xfbmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ2VkaXRfYWdlbnQnKVxuICBpZiAoXG4gICAgIWVkaXRBY3Rpb24gfHxcbiAgICAhZWRpdEFjdGlvbi50b29sX2FyZ3MgfHxcbiAgICB0eXBlb2YgZWRpdEFjdGlvbi50b29sX2FyZ3MgIT09ICdvYmplY3QnIHx8XG4gICAgQXJyYXkuaXNBcnJheShlZGl0QWN0aW9uLnRvb2xfYXJncylcbiAgKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBjb25zdCByZWMgPSBlZGl0QWN0aW9uLnRvb2xfYXJncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBjb25zdCByYXcgPSByZWMuYWdlbnRfaWQgPz8gcmVjLmFnZW50SWRcbiAgcmV0dXJuIHJhdyAhPSBudWxsID8gU3RyaW5nKHJhdykgOiBudWxsXG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RBZ2VudElkRnJvbVBlbmRpbmdBY3Rpb25zQnlUb29sTmFtZShwZW5kaW5nQWN0aW9uczogUGVuZGluZ0FjdGlvbltdLCB0b29sTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGFjdGlvbiA9IHBlbmRpbmdBY3Rpb25zLmZpbmQoYSA9PiAoYS50b29sX25hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09IHRvb2xOYW1lLnRvTG93ZXJDYXNlKCkpXG4gIGlmICghYWN0aW9uIHx8ICFhY3Rpb24udG9vbF9hcmdzIHx8IHR5cGVvZiBhY3Rpb24udG9vbF9hcmdzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGFjdGlvbi50b29sX2FyZ3MpKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBjb25zdCByZWMgPSBhY3Rpb24udG9vbF9hcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGNvbnN0IHJhdyA9IHJlYy5hZ2VudF9pZCA/PyByZWMuYWdlbnRJZCA/PyByZWMuaWRcbiAgcmV0dXJuIHJhdyAhPSBudWxsID8gU3RyaW5nKHJhdykgOiBudWxsXG59XG5cbi8qKiDDmmx0aW1vIHJlY3Vyc28gc2kgbm8gaGF5IGxpbmtzIG5pIHRvb2xfYXJncyBwYXJzZWFibGVzIChwLiBlai4gXCJJRCAqKjc1OTcxMDYqKlwiKS4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RUYXNrSWRzRnJvbUFzc2lzdGFudERlbGV0aW9uVGV4dCh0ZXh0OiBzdHJpbmcpOiBudW1iZXJbXSB7XG4gIGNvbnN0IGxhYmVsZWQgPSB0ZXh0Lm1hdGNoKC9cXGJJRFxccypcXCpcXCooXFxkKylcXCpcXCovaSlcbiAgaWYgKGxhYmVsZWQpIHtcbiAgICBjb25zdCBuID0gcGFyc2VJbnQobGFiZWxlZFsxXSwgMTApXG4gICAgcmV0dXJuIE51bWJlci5pc05hTihuKSA/IFtdIDogW25dXG4gIH1cbiAgY29uc3QgYm9sZCA9IHRleHQubWF0Y2goL1xcKlxcKihcXGR7NSx9KVxcKlxcKi8pXG4gIGlmIChib2xkKSB7XG4gICAgY29uc3QgbiA9IHBhcnNlSW50KGJvbGRbMV0sIDEwKVxuICAgIHJldHVybiBOdW1iZXIuaXNOYU4obikgPyBbXSA6IFtuXVxuICB9XG4gIHJldHVybiBbXVxufVxuXG5jb25zdCB1c2VTdGFibGVDYWxsYmFja3MgPSAoYXV0aFVzZXI6IENPUlVzZXIpID0+IHtcbiAgY29uc3QgY3VycmVudFVzZXIgPSB1c2VSZWY8Q2hhdE1lc3NhZ2VVc2VyPih7XG4gICAgaWQ6IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCksXG4gICAgbmFtZTogYXV0aFVzZXIuZmlyc3ROYW1lLFxuICAgIGF2YXRhcjogYXV0aFVzZXIucGljdHVyZSxcbiAgfSlcblxuICBpZiAoXG4gICAgY3VycmVudFVzZXIuY3VycmVudC5pZCAhPT0gYXV0aFVzZXIuaWQudG9TdHJpbmcoKSB8fFxuICAgIGN1cnJlbnRVc2VyLmN1cnJlbnQubmFtZSAhPT0gYXV0aFVzZXIuZmlyc3ROYW1lIHx8XG4gICAgY3VycmVudFVzZXIuY3VycmVudC5hdmF0YXIgIT09IGF1dGhVc2VyLnBpY3R1cmVcbiAgKSB7XG4gICAgY3VycmVudFVzZXIuY3VycmVudCA9IHtcbiAgICAgIGlkOiBhdXRoVXNlci5pZC50b1N0cmluZygpLFxuICAgICAgbmFtZTogYXV0aFVzZXIuZmlyc3ROYW1lLFxuICAgICAgYXZhdGFyOiBhdXRoVXNlci5waWN0dXJlLFxuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGN1cnJlbnRVc2VyOiBjdXJyZW50VXNlci5jdXJyZW50LFxuICB9XG59XG5cbmNvbnN0IHBhcnNlU1NFTGluZSA9IChsaW5lOiBzdHJpbmcpOiB7IGV2ZW50VHlwZTogc3RyaW5nOyBkYXRhOiB1bmtub3duIH0gfCBudWxsID0+IHtcbiAgaWYgKCFsaW5lLnRyaW0oKSkgcmV0dXJuIG51bGxcblxuICBjb25zdCBbZXZlbnRMaW5lLCBkYXRhTGluZV0gPSBsaW5lLnNwbGl0KCdcXG4nKVxuICBpZiAoIWV2ZW50TGluZSB8fCAhZGF0YUxpbmUpIHJldHVybiBudWxsXG5cbiAgY29uc3QgZXZlbnRUeXBlID0gZXZlbnRMaW5lLnJlcGxhY2UoJ2V2ZW50OiAnLCAnJykudHJpbSgpXG4gIGNvbnN0IGRhdGFTdHIgPSBkYXRhTGluZS5yZXBsYWNlKCdkYXRhOiAnLCAnJykudHJpbSgpXG5cbiAgdHJ5IHtcbiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShkYXRhU3RyKVxuICAgIHJldHVybiB7IGV2ZW50VHlwZSwgZGF0YSB9XG4gIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIFNTRSBkYXRhOicsIHBhcnNlRXJyb3IsIGRhdGFTdHIpXG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5jb25zdCBwcm9jZXNzU1NFU3RyZWFtID0gYXN5bmMgKFxuICByZXNwb25zZTogUmVzcG9uc2UsXG4gIHRocmVhZElkOiBzdHJpbmcsXG4gIGNhbGxiYWNrczoge1xuICAgIG9uVGhpbmtpbmc6ICgpID0+IHZvaWRcbiAgICBvblRva2VuOiAoY29udGVudDogc3RyaW5nKSA9PiB2b2lkXG4gICAgb25Ob2RlOiAobWVzc2FnZTogc3RyaW5nLCB0aHJlYWRJZDogc3RyaW5nKSA9PiB2b2lkXG4gICAgb25Db21wbGV0ZTogKFxuICAgICAgZmluYWxDb250ZW50OiBzdHJpbmcsXG4gICAgICBzb3VyY2VzOiBhbnksXG4gICAgICBtZW1vcnlTZXNzaW9uSWQ6IHN0cmluZyxcbiAgICAgIGN1cnJlbnRUaHJlYWRJZDogc3RyaW5nLFxuICAgICAgYXR0YWNobWVudHM/OiBhbnlbXSB8IG51bGwsXG4gICAgICBzdWdnZXN0aW9ucz86IHN0cmluZ1tdIHwgbnVsbCxcbiAgICAgIGFnZW50SWQ/OiBzdHJpbmcgfCBudWxsXG4gICAgKSA9PiB2b2lkXG4gICAgb25FcnJvcjogKGVycm9yOiBhbnksIHRocmVhZElkOiBzdHJpbmcpID0+IHZvaWRcbiAgICBvbkFwcHJvdmFsUmVxdWlyZWQ/OiAoYXBwcm92YWw6IGFueSwgYWNjdW11bGF0ZWRDb250ZW50OiBzdHJpbmcsIGN1cnJlbnRUaHJlYWRJZDogc3RyaW5nKSA9PiB2b2lkXG4gIH1cbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByZWFkZXIgPSByZXNwb25zZS5ib2R5Py5nZXRSZWFkZXIoKVxuICBpZiAoIXJlYWRlcikge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gcmVhZGVyIGF2YWlsYWJsZScpXG4gIH1cblxuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKClcbiAgbGV0IGJ1ZmZlciA9ICcnXG4gIGxldCBhY2N1bXVsYXRlZENvbnRlbnQgPSAnJ1xuICBsZXQgaXNTdHJlYW1Db21wbGV0ZSA9IGZhbHNlXG5cbiAgZnVuY3Rpb24gaGFuZGxlTGluZShsaW5lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVNTRUxpbmUobGluZSlcbiAgICBpZiAoIXBhcnNlZCkgcmV0dXJuXG5cbiAgICBjb25zdCB7IGV2ZW50VHlwZSwgZGF0YSB9ID0gcGFyc2VkXG4gICAgY29uc3QgZXZlbnREYXRhID0gZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gJ3RoaW5raW5nJykge1xuICAgICAgY2FsbGJhY2tzLm9uVGhpbmtpbmcoKVxuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAndG9rZW4nKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gdHlwZW9mIGV2ZW50RGF0YS5jb250ZW50ID09PSAnc3RyaW5nJyA/IGV2ZW50RGF0YS5jb250ZW50IDogJydcbiAgICAgIGFjY3VtdWxhdGVkQ29udGVudCA9IG1lcmdlU3RyZWFtQ2h1bmsoYWNjdW11bGF0ZWRDb250ZW50LCBjb250ZW50KVxuICAgICAgY2FsbGJhY2tzLm9uVG9rZW4oYWNjdW11bGF0ZWRDb250ZW50KVxuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnY29udGVudCcpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSB0eXBlb2YgZXZlbnREYXRhLmNvbnRlbnQgPT09ICdzdHJpbmcnID8gZXZlbnREYXRhLmNvbnRlbnQgOiAnJ1xuICAgICAgYWNjdW11bGF0ZWRDb250ZW50ID0gbWVyZ2VTdHJlYW1DaHVuayhhY2N1bXVsYXRlZENvbnRlbnQsIGNvbnRlbnQpXG4gICAgICBjYWxsYmFja3Mub25Ub2tlbihhY2N1bXVsYXRlZENvbnRlbnQpXG4gICAgICBpZiAoaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkKGV2ZW50RGF0YSkpIHtcbiAgICAgICAgY29uc3QgZmluYWxDb250ZW50ID0gY29udGVudCB8fCBhY2N1bXVsYXRlZENvbnRlbnRcbiAgICAgICAgY29uc3Qgc291cmNlcyA9IGV2ZW50RGF0YS5zb3VyY2VzIHx8IG51bGxcbiAgICAgICAgY29uc3QgbWVtb3J5U2Vzc2lvbklkID0gKGV2ZW50RGF0YS5tZW1vcnlfc2Vzc2lvbl9pZCBhcyBzdHJpbmcpIHx8ICcnXG4gICAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gQXJyYXkuaXNBcnJheShldmVudERhdGEuYXR0YWNobWVudHMpID8gZXZlbnREYXRhLmF0dGFjaG1lbnRzIDogbnVsbFxuICAgICAgICBjb25zdCBzdWdnZXN0aW9ucyA9IEFycmF5LmlzQXJyYXkoZXZlbnREYXRhLnN1Z2dlc3RfcmVwbHkpXG4gICAgICAgICAgPyAoZXZlbnREYXRhLnN1Z2dlc3RfcmVwbHkgYXMgc3RyaW5nW10pXG4gICAgICAgICAgOiBBcnJheS5pc0FycmF5KGV2ZW50RGF0YS5zdWdnZXN0aW9ucylcbiAgICAgICAgICAgID8gKGV2ZW50RGF0YS5zdWdnZXN0aW9ucyBhcyBzdHJpbmdbXSlcbiAgICAgICAgICAgIDogbnVsbFxuICAgICAgICBjb25zdCBhZ2VudElkUmF3ID0gZXZlbnREYXRhLmFnZW50X2lkID8/IGV2ZW50RGF0YS5hZ2VudElkXG4gICAgICAgIGNvbnN0IGNvbXBsZXRlZEFnZW50SWQgPVxuICAgICAgICAgIGFnZW50SWRSYXcgIT0gbnVsbCAmJiBTdHJpbmcoYWdlbnRJZFJhdykudHJpbSgpICE9PSAnJyA/IFN0cmluZyhhZ2VudElkUmF3KS50cmltKCkgOiBudWxsXG4gICAgICAgIGNhbGxiYWNrcy5vbkNvbXBsZXRlKFxuICAgICAgICAgIGZpbmFsQ29udGVudCxcbiAgICAgICAgICBzb3VyY2VzLFxuICAgICAgICAgIG1lbW9yeVNlc3Npb25JZCxcbiAgICAgICAgICB0aHJlYWRJZCxcbiAgICAgICAgICBhdHRhY2htZW50cyxcbiAgICAgICAgICBzdWdnZXN0aW9ucyxcbiAgICAgICAgICBjb21wbGV0ZWRBZ2VudElkXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ25vZGUnKSB7XG4gICAgICBpZiAoZXZlbnREYXRhLm1lc3NhZ2UgJiYgdHlwZW9mIGV2ZW50RGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjYWxsYmFja3Mub25Ob2RlKGV2ZW50RGF0YS5tZXNzYWdlLCB0aHJlYWRJZClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgY29uc3QgZmluYWxDb250ZW50ID0gKGV2ZW50RGF0YS5jb250ZW50IGFzIHN0cmluZykgfHwgYWNjdW11bGF0ZWRDb250ZW50XG4gICAgICBjb25zdCBzb3VyY2VzID0gKGV2ZW50RGF0YS5zb3VyY2VzIGFzIHVua25vd24pIHx8IG51bGxcbiAgICAgIGNvbnN0IG1lbW9yeVNlc3Npb25JZCA9IChldmVudERhdGEubWVtb3J5X3Nlc3Npb25faWQgYXMgc3RyaW5nKSB8fCAnJ1xuICAgICAgY29uc3QgYXR0YWNobWVudHMgPSBBcnJheS5pc0FycmF5KGV2ZW50RGF0YS5hdHRhY2htZW50cykgPyBldmVudERhdGEuYXR0YWNobWVudHMgOiBudWxsXG4gICAgICBjb25zdCBzdWdnZXN0aW9ucyA9IEFycmF5LmlzQXJyYXkoZXZlbnREYXRhLnN1Z2dlc3RfcmVwbHkpXG4gICAgICAgID8gKGV2ZW50RGF0YS5zdWdnZXN0X3JlcGx5IGFzIHN0cmluZ1tdKVxuICAgICAgICA6IEFycmF5LmlzQXJyYXkoZXZlbnREYXRhLnN1Z2dlc3Rpb25zKVxuICAgICAgICAgID8gKGV2ZW50RGF0YS5zdWdnZXN0aW9ucyBhcyBzdHJpbmdbXSlcbiAgICAgICAgICA6IG51bGxcbiAgICAgIGNvbnN0IGFnZW50SWRSYXcgPSBldmVudERhdGEuYWdlbnRfaWQgPz8gZXZlbnREYXRhLmFnZW50SWRcbiAgICAgIGNvbnN0IGNvbXBsZXRlZEFnZW50SWQgPSBhZ2VudElkUmF3ICE9IG51bGwgJiYgU3RyaW5nKGFnZW50SWRSYXcpLnRyaW0oKSAhPT0gJycgPyBTdHJpbmcoYWdlbnRJZFJhdykudHJpbSgpIDogbnVsbFxuICAgICAgY2FsbGJhY2tzLm9uQ29tcGxldGUoZmluYWxDb250ZW50LCBzb3VyY2VzLCBtZW1vcnlTZXNzaW9uSWQsIHRocmVhZElkLCBhdHRhY2htZW50cywgc3VnZ2VzdGlvbnMsIGNvbXBsZXRlZEFnZW50SWQpXG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdhcHByb3ZhbF9yZXF1aXJlZCcpIHtcbiAgICAgIGNhbGxiYWNrcy5vbkFwcHJvdmFsUmVxdWlyZWQ/LihldmVudERhdGEsIGFjY3VtdWxhdGVkQ29udGVudCwgdGhyZWFkSWQpXG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAgIGNhbGxiYWNrcy5vbkVycm9yKGV2ZW50RGF0YS5lcnJvciwgdGhyZWFkSWQpXG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKCFpc1N0cmVhbUNvbXBsZXRlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpXG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIGlzU3RyZWFtQ29tcGxldGUgPSB0cnVlXG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGJ1ZmZlciArPSBkZWNvZGVyLmRlY29kZSh2YWx1ZSwgeyBzdHJlYW06IHRydWUgfSlcbiAgICBjb25zdCBsaW5lcyA9IGJ1ZmZlci5zcGxpdCgnXFxuXFxuJylcbiAgICBidWZmZXIgPSBsaW5lcy5wb3AoKSB8fCAnJ1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaGFuZGxlTGluZShsaW5lc1tpXSlcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHVzZUNoYXRNYW5hZ2VyID0gKHtcbiAgY2hhdElkOiBpbml0aWFsQ2hhdElkLFxuICB1c2VySW5pdGlhbE1lc3NhZ2UsXG4gIG9uRXJyb3IsXG4gIGFnZW50cyA9IFtdLFxufTogVXNlQ2hhdE1hbmFnZXJQcm9wcykgPT4ge1xuICBjb25zdCB7IHQgfSA9IHVzZVQoKVxuICBjb25zdCBhdXRoVXNlciA9IHVzZVVzZXIoKVxuICBjb25zdCB7XG4gICAgcHJvamVjdCxcbiAgICBzZXRQcm9qZWN0LFxuICAgIGNsaWVudCxcbiAgICBzZXRDbGllbnQsXG4gICAgdGFzayxcbiAgICBzZXRUYXNrLFxuICAgIGFnZW50LFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZSxcbiAgICBjaGlwc1Byb2plY3QsXG4gICAgc2V0Q2hpcHNQcm9qZWN0LFxuICB9ID0gdXNlR2xvYmFsQ29udGV4dCgpXG4gIGNvbnN0IGV2ZW50ID0gdXNlRXZlbnQoKVxuICBjb25zdCB7IGZldGNoUHJvamVjdHMgfSA9IHVzZVByb2plY3RzKClcbiAgY29uc3QgeyBjdXJyZW50VXNlciB9ID0gdXNlU3RhYmxlQ2FsbGJhY2tzKGF1dGhVc2VyKVxuICBjb25zdCB7IGdldFRhYlRhc2tEZWZhdWx0IH0gPSB1c2VUYWJUYXNrRGVmYXVsdCgpXG5cbiAgLy8gREVCVUc6IHJhc3RyZWFyIGN1w6FuZG8gY2FtYmlhIGVsIGNvbnRleHRvIGdsb2JhbCBwYXJhIGNvcnJlbGFjaW9uYXIgY29uIGxvcyBlbnbDrW9zIGFsIG9yY2hlc3RyYXRvclxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnNvbGUuaW5mbygnW3VzZUNoYXRNYW5hZ2VyXSBjb250ZXh0IENIQU5HRUQ6Jywge1xuICAgICAgY2hpcHNQcm9qZWN0SWQ6IGNoaXBzUHJvamVjdD8ucHJvamVjdElkID8/IG51bGwsXG4gICAgICBjaGlwc1Byb2plY3ROYW1lOiBjaGlwc1Byb2plY3Q/LnByb2plY3ROYW1lID8/IG51bGwsXG4gICAgICBwcm9qZWN0UHJvcElkOiBwcm9qZWN0Py5pZCA/PyBudWxsLFxuICAgICAgY2xpZW50SWQ6IGNsaWVudD8uaWQgPz8gbnVsbCxcbiAgICAgIHRhc2tJZDogdGFzaz8uaWQgPz8gbnVsbCxcbiAgICB9KVxuICB9LCBbY2hpcHNQcm9qZWN0Py5wcm9qZWN0SWQsIHByb2plY3Q/LmlkLCBjbGllbnQ/LmlkLCB0YXNrPy5pZF0pXG4gIGNvbnN0IGN1cnJlbnRNZXNzYWdlSWQgPSB1c2VSZWYodXVpZHY0KCkpXG4gIGNvbnN0IGN1cnJlbnRVc2VyUXVlc3Rpb24gPSB1c2VSZWY8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgY3VycmVudENoYXRJZCA9IHVzZVJlZihpbml0aWFsQ2hhdElkIHx8IHV1aWR2NCgpKVxuICBjb25zdCByZXBvcnRlZEV2ZW50ID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBtZXNzYWdlc1JlZiA9IHVzZVJlZjxDaGF0TWVzc2FnZVtdPihbXSlcbiAgLyoqXG4gICAqIEd1YXJkYSBpbmZvIGRlbCDDumx0aW1vIGFwcHJvdmFsIG1hbnVhbCAoY3VhbmRvIGVsIHVzdWFyaW8gdGlwZWEgXCJzaVwiL1wibm9cIiBlbiBsdWdhclxuICAgKiBkZSBjbGlja2VhciBlbCBib3TDs24pLiBFbiBtYW51YWwgYXBwcm92YWwsIGBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkYCByZXRvcm5hIGVhcmx5XG4gICAqIHNpbiBhZ3JlZ2FyIHVuIG1lbnNhamUgY29uIGBhcHByb3ZhbGAsIGFzw60gcXVlIGxhIGzDs2dpY2EgZGUgcmVmZXRjaCBlbiBgb25TdHJlYW1GaW5pc2hgXG4gICAqIG5vIGxvIGRldGVjdGEgdsOtYSBgcHJldmlvdXNNZXNzYWdlLmFwcHJvdmFsYC4gTG8gZ3VhcmRhbW9zIGFjw6EgcGFyYSBjb25zdW1pcmxvIGRlc3B1w6lzLlxuICAgKi9cbiAgY29uc3QgbGFzdE1hbnVhbEFwcHJvdmFsUmVmID0gdXNlUmVmPHtcbiAgICB0b29sTmFtZTogc3RyaW5nXG4gICAgdG9vbEFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbFxuICB9IHwgbnVsbD4obnVsbClcbiAgLyoqIENvbnRleHRvIGRlbCBtZW5zYWplIGRlIGFwcm9iYWNpw7NuIHByZXZpbyBhbCBlamVjdXRhciBjb250aW51ZS10aHJlYWQuICovXG4gIGNvbnN0IGhpdGxFeGVjdXRpb25Db250ZXh0UmVmID0gdXNlUmVmPEhpdGxFeGVjdXRpb25Db250ZXh0IHwgbnVsbD4obnVsbClcbiAgY29uc3QgaXNQcm9jZXNzaW5nUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBmaXJzdFRpbWVSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIC8qKiBJZCBkZWwgcGxhY2Vob2xkZXIgZGVsIG1lbnNhamUgZW4gc3RyZWFtaW5nIGFjdGl2byAoc2kgaGF5KS4gKi9cbiAgY29uc3Qgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICAvKipcbiAgICogQ2hhdCBhbCBxdWUgcGVydGVuZWNlIGVsIHN0cmVhbSBhY3R1YWxtZW50ZSBhY3Rpdm8uIFNpIGNhbWJpYSBlbCBjaGF0XG4gICAqIG1pZW50cmFzIHVuIHN0cmVhbSBlc3TDoSBlbiB2dWVsbywgZGVzY2FydGFtb3MgbG9zIHRva2VucyByZXNpZHVhbGVzXG4gICAqIHF1ZSBwdWVkYW4gbGxlZ2FyIGFudGVzIGRlIHF1ZSBlbCBhYm9ydCBzZSBjb21wbGV0ZS5cbiAgICovXG4gIGNvbnN0IGFjdGl2ZVN0cmVhbUNoYXRJZFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICAvKiogU2V0dGVyIGluZGlyZWN0byBwYXJhIGFib3J0YXIgZWwgc3RyZWFtIGFudGVzIGRlIHF1ZSBlbCBob29rIGRlXG4gICAqIG9ycXVlc3RhZG9yIGVzdMOpIGluaWNpYWxpemFkbyAoc2UgbGlua2VhIG3DoXMgYWJham8pLiAqL1xuICBjb25zdCBhYm9ydFN0cmVhbVNpbGVudGx5UmVmID0gdXNlUmVmPCgpID0+IHZvaWQ+KCgpID0+IHVuZGVmaW5lZClcbiAgY29uc3QgY2xlYXJTdHJlYW1VaVJlZiA9IHVzZVJlZjwoKSA9PiB2b2lkPigoKSA9PiB1bmRlZmluZWQpXG4gIGNvbnN0IFthY3RpdmVMb2FkaW5ncywgc2V0QWN0aXZlTG9hZGluZ3NdID0gdXNlU3RhdGU8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oe30pXG4gIGNvbnN0IFtpc0NvbnRpbnVpbmdTdHJlYW0sIHNldElzQ29udGludWluZ1N0cmVhbV0gPSB1c2VTdGF0ZShmYWxzZSlcblxuICBjb25zdCBpc1dlYlNlYXJjaEFjdGl2ZVJlZiA9IHVzZVJlZihpc1dlYlNlYXJjaEFjdGl2ZSlcbiAgY29uc3QgaXNEZWVwU2VhcmNoQWN0aXZlUmVmID0gdXNlUmVmKGlzRGVlcFNlYXJjaEFjdGl2ZSlcbiAgLyoqIEV2aXRhIGNsb3N1cmVzIG9ic29sZXRhcyBjdWFuZG8gZWwgZm9vdGVyIGNvbnNlcnZhIHNlbmRNZXNzYWdlIGVudHJlIHJlbmRlcnMuICovXG4gIGNvbnN0IGNvbnRleHRSZWYgPSB1c2VSZWYoeyBjaGlwc1Byb2plY3QsIHByb2plY3QsIGNsaWVudCwgdGFzayB9KVxuICBjb250ZXh0UmVmLmN1cnJlbnQgPSB7IGNoaXBzUHJvamVjdCwgcHJvamVjdCwgY2xpZW50LCB0YXNrIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQgPSBpc1dlYlNlYXJjaEFjdGl2ZVxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50ID0gaXNEZWVwU2VhcmNoQWN0aXZlXG4gIH0sIFtpc1dlYlNlYXJjaEFjdGl2ZSwgaXNEZWVwU2VhcmNoQWN0aXZlXSlcblxuICBjb25zdCB7IGxvYWRpbmdNZXNzYWdlcywgbWVzc2FnZXMsIGlzTG9hZGluZ01vcmVNZXNzYWdlcywgbG9hZE1lc3NhZ2VzLCBhZGRNZXNzYWdlLCByZW1vdmVNZXNzYWdlLCBoYW5kbGVTY3JvbGwgfSA9XG4gICAgdXNlQ2hhdE1lc3NhZ2VzKHtcbiAgICAgIGNoYXRJZDogaW5pdGlhbENoYXRJZCB8fCBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgICBjdXJyZW50VXNlcixcbiAgICAgIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgICAgIG9uRXJyb3IsXG4gICAgICBhZ2VudHMsXG4gICAgfSlcblxuICBtZXNzYWdlc1JlZi5jdXJyZW50ID0gbWVzc2FnZXNcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdjaGF0LWxvYWRpbmctbWVzc2FnZXMtY2hhbmdlZCcsIHtcbiAgICAgIGRldGFpbDogeyBsb2FkaW5nTWVzc2FnZXMgfSxcbiAgICB9KVxuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpXG4gIH0sIFtsb2FkaW5nTWVzc2FnZXNdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGluaXRpYWxDaGF0SWQgJiYgaW5pdGlhbENoYXRJZCAhPT0gY3VycmVudENoYXRJZC5jdXJyZW50KSB7XG4gICAgICAvLyBTaSBoYXkgdW4gc3RyZWFtIGVuIGN1cnNvLCBhYm9ydGFybG8gc2lsZW5jaW9zYW1lbnRlIHBhcmEgcXVlIGxvc1xuICAgICAgLy8gdG9rZW5zIHJlc2lkdWFsZXMgbm8gc2UgZXNjcmliYW4gZW4gZWwgY2hhdCBudWV2by5cbiAgICAgIGFib3J0U3RyZWFtU2lsZW50bHlSZWYuY3VycmVudCgpXG5cbiAgICAgIC8vIExpbXBpYXIgY29udGV4dG8gZ2xvYmFsIGFsIGNhbWJpYXIgZGUgY29udmVyc2FjacOzblxuICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgICAgc2V0VGFzayhudWxsKVxuXG4gICAgICBjdXJyZW50Q2hhdElkLmN1cnJlbnQgPSBpbml0aWFsQ2hhdElkXG4gICAgICBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQgPSB1dWlkdjQoKVxuICAgICAgY3VycmVudFVzZXJRdWVzdGlvbi5jdXJyZW50ID0gbnVsbFxuICAgICAgcmVwb3J0ZWRFdmVudC5jdXJyZW50ID0gZmFsc2VcbiAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgc3RyZWFtaW5nU3RvcmUuY2xlYXIoKVxuXG4gICAgICBsb2FkTWVzc2FnZXMoKVxuICAgIH1cbiAgfSwgW2luaXRpYWxDaGF0SWQsIHByb2plY3QsIHNldFByb2plY3QsIHNldENsaWVudCwgc2V0Q2hpcHNQcm9qZWN0LCBzZXRUYXNrLCBsb2FkTWVzc2FnZXNdKVxuXG4gIGNvbnN0IGhhbmRsZVN0cmVhbUVycm9yID0gdXNlQ2FsbGJhY2soXG4gICAgKGVycm9yTWVzc2FnZT86IHN0cmluZywgZXJyb3JSYXdNZXNzYWdlPzogc3RyaW5nKSA9PiB7XG4gICAgICBjbGVhclN0cmVhbVVpUmVmLmN1cnJlbnQoKVxuICAgICAgY29uc3QgdGVtcE1lc3NhZ2VJZCA9IGBhbnN3ZXItJHtjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnR9LXN0cmVhbWluZ2BcbiAgICAgIHN0cmVhbWluZ1N0b3JlLmNsZWFyKClcbiAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgcmVtb3ZlTWVzc2FnZSh0ZW1wTWVzc2FnZUlkKVxuXG4gICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgZXJyb3JNZXNzYWdlID09PSBcIkFjY2VzcyBkZW5pZWQ6IFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoaXMgYWdlbnRcIlxuICAgICAgICAgID8gdCgnY2hhdC5lcnJvckFjY2Vzc0RlbmllZCcpXG4gICAgICAgICAgOiBlcnJvck1lc3NhZ2UgPT09ICdpbnZhbGlkX3JlcXVlc3RfZXJyb3InICYmIGVycm9yUmF3TWVzc2FnZT8uaW5jbHVkZXMoJ3Byb21wdCBpcyB0b28gbG9uZycpXG4gICAgICAgICAgICA/IHQoJ2NoYXQuZXJyb3JQcm9tcHRUb29Mb25nJywgeyB1c2VkOiBlcnJvclJhd01lc3NhZ2UubWF0Y2goLyhcXGQrKSB0b2tlbnMvKT8uWzFdID8/ICcnIH0pXG4gICAgICAgICAgICA6IHQoJ2NoYXQuZXJyb3InKVxuXG4gICAgICBhZGRNZXNzYWdlKHtcbiAgICAgICAgaWQ6IGBhbnN3ZXItJHtjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnR9YCxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6ICdBc3Npc3RhbnQnIH0sXG4gICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICB9KVxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIH0sXG4gICAgW2FkZE1lc3NhZ2UsIHJlbW92ZU1lc3NhZ2UsIHRdXG4gIClcblxuICBjb25zdCBoYW5kbGVTdHJlYW1VcGRhdGUgPSB1c2VDYWxsYmFjayhcbiAgICAoY29udGVudDogc3RyaW5nLCBzb3VyY2VzOiBhbnksIG1lbW9yeVNlc3Npb25JZDogc3RyaW5nKSA9PiB7XG4gICAgICAvLyBTaSBlbCBjaGF0IGNhbWJpw7MgbWllbnRyYXMgZWwgc3RyZWFtIGVzdGFiYSBlbiB2dWVsbywgZGVzY2FydGFyIGVsXG4gICAgICAvLyB0b2tlbiByZXNpZHVhbDogbm8gZGViZSBwaW50YXJzZSBlbiBlbCBudWV2byBjaGF0LlxuICAgICAgaWYgKGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ICE9IG51bGwgJiYgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgIT09IGN1cnJlbnRDaGF0SWQuY3VycmVudCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgdGVtcE1lc3NhZ2VJZCA9IGBhbnN3ZXItJHtjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnR9LXN0cmVhbWluZ2BcblxuICAgICAgLy8gUHJpbWVyYSBsbGFtYWRhIGRlIGVzdGUgc3RyZWFtOiBpbnNlcnRhbW9zIGVsIHBsYWNlaG9sZGVyIGVuIGVsXG4gICAgICAvLyBhcnJheSBkZSBgbWVzc2FnZXNgIHVuYSDDum5pY2EgdmV6LiBMYXMgbGxhbWFkYXMgc3Vic2lndWllbnRlcyB5YSBub1xuICAgICAgLy8gdG9jYW4gYG1lc3NhZ2VzYDsgZWwgdGV4dG8gdml2ZSBlbiBlbCBzdHJlYW1pbmdTdG9yZSAoZXh0ZXJubyksIHBvclxuICAgICAgLy8gbG8gcXVlIFJlYWN0IG5vIHJlLXJlbmRlcml6YSBlbCDDoXJib2wgY29tcGxldG8gZW4gY2FkYSB0b2tlbi5cbiAgICAgIGlmIChzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgIT09IHRlbXBNZXNzYWdlSWQpIHtcbiAgICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gdGVtcE1lc3NhZ2VJZFxuICAgICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IGN1cnJlbnRDaGF0SWQuY3VycmVudFxuICAgICAgICBzdHJlYW1pbmdTdG9yZS5zdGFydCh0ZW1wTWVzc2FnZUlkKVxuICAgICAgICBhZGRNZXNzYWdlKHtcbiAgICAgICAgICBpZDogdGVtcE1lc3NhZ2VJZCxcbiAgICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiAnQXNzaXN0YW50JyB9LFxuICAgICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICAgICAgc291cmNlcyxcbiAgICAgICAgICBtZW1vcnlTZXNzaW9uSWQsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIHN0cmVhbWluZ1N0b3JlLnNldFRleHQodGVtcE1lc3NhZ2VJZCwgY29udGVudClcbiAgICB9LFxuICAgIFthZGRNZXNzYWdlXVxuICApXG5cbiAgY29uc3QgaGFuZGxlU3RyZWFtRmluaXNoID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKFxuICAgICAgY29udGVudDogc3RyaW5nLFxuICAgICAgc291cmNlczogYW55LFxuICAgICAgbWVtb3J5U2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgICByYXdBdHRhY2htZW50cz86IGFueVtdIHwgbnVsbCxcbiAgICAgIHN1Z2dlc3Rpb25zPzogc3RyaW5nW10gfCBudWxsLFxuICAgICAgY29tcGxldGVkQWdlbnRJZD86IHN0cmluZyB8IG51bGxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHRlbXBNZXNzYWdlSWQgPSBgYW5zd2VyLSR7Y3VycmVudE1lc3NhZ2VJZC5jdXJyZW50fS1zdHJlYW1pbmdgXG4gICAgICBzdHJlYW1pbmdTdG9yZS5jbGVhcigpXG4gICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICByZW1vdmVNZXNzYWdlKHRlbXBNZXNzYWdlSWQpXG4gICAgICBjb25zdCBhdHRhY2htZW50cyA9IG5vcm1hbGl6ZUFzc2lzdGFudEF0dGFjaG1lbnRzKHJhd0F0dGFjaG1lbnRzKVxuXG4gICAgICAvLyBEZXRlY3RhciB0b2RhcyBsYXMgVVJMcyBkZSB0YXJlYXMgKC4uLi90YXNrcy8xMjMvZGV0YWlsfG1lc3NhZ2V8bWVzc2FnZXN8ZmlsZXN8aGlzdG9yeXxob3VycylcbiAgICAgIGNvbnN0IHRhc2tVcmxSZWdleCA9IG5ldyBSZWdFeHAoVEFTS19VUkxfUkVHRVhfUEFUVEVSTiwgJ2cnKVxuICAgICAgY29uc3QgbWF0Y2hlcyA9IFsuLi5jb250ZW50Lm1hdGNoQWxsKHRhc2tVcmxSZWdleCldXG5cbiAgICAgIGxldCBjb250ZW50VG9BZGQgPSBjb250ZW50XG4gICAgICBjb25zdCBwcmV2aW91c01lc3NhZ2UgPSBtZXNzYWdlc1JlZi5jdXJyZW50LmZpbHRlcihtID0+IG0uaWQgIT09IHRlbXBNZXNzYWdlSWQpLmF0KC0xKVxuICAgICAgY29uc3QgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSA9IHByZXZpb3VzTWVzc2FnZT8uYXBwcm92YWwgIT0gbnVsbFxuICAgICAgY29uc3QgVEFTS19DUkVBVElPTl9UT09MUyA9IFsnY3JlYXRlX3Rhc2snLCAnY3JlYXRlX3Rhc2tzX2JhdGNoJywgJ2Nsb25lX3Rhc2snXVxuICAgICAgY29uc3QgVEFTS19FRElUX1RPT0xTID0gW1xuICAgICAgICAnZWRpdF90YXNrJyxcbiAgICAgICAgJ2VkaXRfdGFza3NfYmF0Y2gnLFxuICAgICAgICAndGFza19hc3NpZ24nLFxuICAgICAgICAndGFza191bmFzc2lnbicsXG4gICAgICAgICd1cGRhdGVfdGFza190eXBlJyxcbiAgICAgICAgJ3VwZGF0ZV9lc3RpbWF0ZWRfaG91cnMnLFxuICAgICAgICAnYXNzaWduX3Rhc2tfbGFiZWwnLFxuICAgICAgXVxuICAgICAgY29uc3QgVEFTS19ERUxFVEVfVE9PTFMgPSBbJ2RlbGV0ZV90YXNrJywgJ2RlbGV0ZV90YXNrc19iYXRjaCddXG4gICAgICBjb25zdCBwZW5kaW5nQWN0aW9ucyA9IHByZXZpb3VzTWVzc2FnZT8uYXBwcm92YWw/LnBlbmRpbmdfYWN0aW9ucyB8fCBbXVxuICAgICAgY29uc3Qgd2FzVGFza0NyZWF0aW9uID1cbiAgICAgICAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSAmJlxuICAgICAgICBwZW5kaW5nQWN0aW9ucy5zb21lKChhY3Rpb246IGFueSkgPT4gVEFTS19DUkVBVElPTl9UT09MUy5pbmNsdWRlcyhhY3Rpb24udG9vbF9uYW1lKSlcbiAgICAgIGNvbnN0IHdhc1Rhc2tFZGl0ID1cbiAgICAgICAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSAmJiBwZW5kaW5nQWN0aW9ucy5zb21lKChhY3Rpb246IGFueSkgPT4gVEFTS19FRElUX1RPT0xTLmluY2x1ZGVzKGFjdGlvbi50b29sX25hbWUpKVxuICAgICAgY29uc3Qgd2FzVGFza0RlbGV0ZSA9XG4gICAgICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiZcbiAgICAgICAgcGVuZGluZ0FjdGlvbnMuc29tZSgoYWN0aW9uOiBhbnkpID0+IFRBU0tfREVMRVRFX1RPT0xTLmluY2x1ZGVzKGFjdGlvbi50b29sX25hbWUpKVxuICAgICAgY29uc3Qgd2FzQ3JlYXRlQWdlbnRBcHByb3ZlZCA9XG4gICAgICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiZcbiAgICAgICAgcHJldmlvdXNNZXNzYWdlPy5hcHByb3ZhbFN0YXR1cyA9PT0gJ2FwcHJvdmVkJyAmJlxuICAgICAgICBwZW5kaW5nQWN0aW9ucy5zb21lKChhY3Rpb246IGFueSkgPT4gYWN0aW9uLnRvb2xfbmFtZSA9PT0gJ2NyZWF0ZV9hZ2VudCcpXG4gICAgICBjb25zdCB3YXNDb25maWd1cmVBZ2VudEFjY2Vzc0FwcHJvdmVkID1cbiAgICAgICAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSAmJlxuICAgICAgICBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsU3RhdHVzID09PSAnYXBwcm92ZWQnICYmXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zLnNvbWUoKGFjdGlvbjogYW55KSA9PiAoYWN0aW9uLnRvb2xfbmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbmZpZ3VyZV9hZ2VudF9hY2Nlc3MnKVxuICAgICAgbGV0IGNyZWF0ZUFnZW50Rm9sbG93VXA6IHsgYWdlbnRJZDogc3RyaW5nIH0gfCB1bmRlZmluZWRcbiAgICAgIGlmICh3YXNDcmVhdGVBZ2VudEFwcHJvdmVkICYmIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTICYmIGNvbXBsZXRlZEFnZW50SWQ/LnRyaW0oKSkge1xuICAgICAgICBjcmVhdGVBZ2VudEZvbGxvd1VwID0geyBhZ2VudElkOiBjb21wbGV0ZWRBZ2VudElkLnRyaW0oKSB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB3YXNDb25maWd1cmVBZ2VudEFjY2Vzc0FwcHJvdmVkICYmXG4gICAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTICYmXG4gICAgICAgIChjb21wbGV0ZWRBZ2VudElkPy50cmltKCkgfHxcbiAgICAgICAgICBleHRyYWN0QWdlbnRJZEZyb21QZW5kaW5nQWN0aW9uc0J5VG9vbE5hbWUocGVuZGluZ0FjdGlvbnMsICdjb25maWd1cmVfYWdlbnRfYWNjZXNzJykpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgY29uZmlndXJlZEFnZW50SWQgPVxuICAgICAgICAgIGNvbXBsZXRlZEFnZW50SWQ/LnRyaW0oKSB8fFxuICAgICAgICAgIGV4dHJhY3RBZ2VudElkRnJvbVBlbmRpbmdBY3Rpb25zQnlUb29sTmFtZShwZW5kaW5nQWN0aW9ucywgJ2NvbmZpZ3VyZV9hZ2VudF9hY2Nlc3MnKVxuICAgICAgICBjcmVhdGVBZ2VudEZvbGxvd1VwID0ge1xuICAgICAgICAgIGFnZW50SWQ6IGNvbmZpZ3VyZWRBZ2VudElkIGFzIHN0cmluZyxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAod2FzQ3JlYXRlQWdlbnRBcHByb3ZlZCkge1xuICAgICAgICBldmVudChFVkVOVFMuYWlDaGF0SGl0bE9wdGlvbiwge1xuICAgICAgICAgIGFnZW50X3R5cGU6IGdldEhpdGxBbmFseXRpY3NBZ2VudFR5cGUoYWdlbnQpLFxuICAgICAgICAgIGFjdGlvbl90eXBlOiBidWlsZEhpdGxBY3Rpb25UeXBlTGlzdChwZW5kaW5nQWN0aW9ucyksXG4gICAgICAgICAgZGVjaXNpb246ICdhY2NlcHQnLFxuICAgICAgICAgIG9wdGlvbjogJ2NyZWF0ZV9hZ2VudCcsXG4gICAgICAgICAgLi4uKGNvbXBsZXRlZEFnZW50SWQ/LnRyaW0oKSA/IHsgY3JlYXRlZF9hZ2VudF9pZDogY29tcGxldGVkQWdlbnRJZC50cmltKCkgfSA6IHt9KSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd2FzRWRpdEFnZW50QXBwcm92ZWQgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgIHByZXZpb3VzTWVzc2FnZT8uYXBwcm92YWxTdGF0dXMgPT09ICdhcHByb3ZlZCcgJiZcbiAgICAgICAgcGVuZGluZ0FjdGlvbnMuc29tZSgoYWN0aW9uOiBhbnkpID0+IChhY3Rpb24udG9vbF9uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSAnZWRpdF9hZ2VudCcpXG5cbiAgICAgIGxldCBlZGl0QWdlbnRGb2xsb3dVcDogeyBhZ2VudElkOiBzdHJpbmcgfSB8IHVuZGVmaW5lZFxuICAgICAgaWYgKHdhc0VkaXRBZ2VudEFwcHJvdmVkKSB7XG4gICAgICAgIGNvbnN0IGZyb21TdHJlYW0gPSBjb21wbGV0ZWRBZ2VudElkPy50cmltKClcbiAgICAgICAgY29uc3QgZnJvbUFyZ3MgPSBleHRyYWN0QWdlbnRJZEZyb21FZGl0QWdlbnRQZW5kaW5nQWN0aW9ucyhwZW5kaW5nQWN0aW9ucylcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRBZ2VudElkID0gZnJvbVN0cmVhbSB8fCBmcm9tQXJnc1xuICAgICAgICBpZiAocmVzb2x2ZWRBZ2VudElkKSB7XG4gICAgICAgICAgZWRpdEFnZW50Rm9sbG93VXAgPSB7IGFnZW50SWQ6IHJlc29sdmVkQWdlbnRJZCB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFza0lkc0Zyb21VcmxzID0gbWF0Y2hlcy5tYXAobWF0Y2ggPT4gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKSlcbiAgICAgIGNvbnN0IHRhc2tJZHNGcm9tRGVsZXRlQXBwcm92YWwgPSBleHRyYWN0VGFza0lkc0Zyb21EZWxldGVQZW5kaW5nQWN0aW9ucyhwZW5kaW5nQWN0aW9ucylcbiAgICAgIGNvbnN0IHRhc2tJZHNGcm9tRGVsZXRpb25UZXh0ID1cbiAgICAgICAgd2FzVGFza0RlbGV0ZSAmJiB0YXNrSWRzRnJvbVVybHMubGVuZ3RoID09PSAwICYmIHRhc2tJZHNGcm9tRGVsZXRlQXBwcm92YWwubGVuZ3RoID09PSAwXG4gICAgICAgICAgPyBleHRyYWN0VGFza0lkc0Zyb21Bc3Npc3RhbnREZWxldGlvblRleHQoY29udGVudClcbiAgICAgICAgICA6IFtdXG4gICAgICBjb25zdCB0YXNrSWRzRm9yRGFzaGJvYXJkID1cbiAgICAgICAgdGFza0lkc0Zyb21VcmxzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHRhc2tJZHNGcm9tVXJsc1xuICAgICAgICAgIDogdGFza0lkc0Zyb21EZWxldGVBcHByb3ZhbC5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IHRhc2tJZHNGcm9tRGVsZXRlQXBwcm92YWxcbiAgICAgICAgICAgIDogdGFza0lkc0Zyb21EZWxldGlvblRleHRcblxuICAgICAgY29uc3Qgc2hvdWxkU3luY0Rhc2hib2FyZCA9XG4gICAgICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiZcbiAgICAgICAgKHdhc1Rhc2tDcmVhdGlvbiB8fCB3YXNUYXNrRWRpdCB8fCB3YXNUYXNrRGVsZXRlKSAmJlxuICAgICAgICB0YXNrSWRzRm9yRGFzaGJvYXJkLmxlbmd0aCA+IDBcblxuICAgICAgaWYgKHNob3VsZFN5bmNEYXNoYm9hcmQpIHtcbiAgICAgICAgY29uc3QgdGFza0lkcyA9IHRhc2tJZHNGb3JEYXNoYm9hcmRcbiAgICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHRhYiA9IGF3YWl0IGdldFRhYlRhc2tEZWZhdWx0KHRhc2tJZHNbMF0pXG4gICAgICAgICAgY29uc3QgdGFiU2VnbWVudCA9IHRhYiA/IGAvJHt0YWJ9YCA6ICcvZGV0YWlsJ1xuICAgICAgICAgIGNvbnRlbnRUb0FkZCA9IGNvbnRlbnQucmVwbGFjZSh0YXNrVXJsUmVnZXgsIHVybCA9PlxuICAgICAgICAgICAgdXJsLnJlcGxhY2UoL1xcLyhkZXRhaWx8bWVzc2FnZXxtZXNzYWdlc3xmaWxlc3xoaXN0b3J5fGhvdXJzKSg/PSR8XFw/KS8sIHRhYlNlZ21lbnQpXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdFByb2plY3RNZXNzYWdlID0gbWVzc2FnZXNSZWYuY3VycmVudC5maWx0ZXIobXNnID0+IG1zZy5wcm9qZWN0SWQpLmF0KC0xKVxuICAgICAgICBjb25zdCBjb250ZXh0UHJvamVjdElkUmF3ID0gcHJvamVjdD8uaWQgfHwgbGFzdFByb2plY3RNZXNzYWdlPy5wcm9qZWN0SWRcbiAgICAgICAgY29uc3QgY29udGV4dFByb2plY3RJZCA9IGNvbnRleHRQcm9qZWN0SWRSYXcgPyBwYXJzZUludChTdHJpbmcoY29udGV4dFByb2plY3RJZFJhdyksIDEwKSA6IG51bGxcbiAgICAgICAgY29uc3QgcGF0aE1hdGNoID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLm1hdGNoKC9eXFwvcHJvamVjdHNcXC8oXFxkKylcXC8vKVxuICAgICAgICBjb25zdCByb3V0ZVByb2plY3RJZCA9IHBhdGhNYXRjaCA/IHBhcnNlSW50KHBhdGhNYXRjaFsxXSwgMTApIDogbnVsbFxuICAgICAgICBjb25zdCBpc09uUHJvamVjdFJvdXRlID0gY29udGV4dFByb2plY3RJZCAmJiByb3V0ZVByb2plY3RJZCAmJiBjb250ZXh0UHJvamVjdElkID09PSByb3V0ZVByb2plY3RJZFxuXG4gICAgICAgIGlmIChpc09uUHJvamVjdFJvdXRlKSB7XG4gICAgICAgICAgaWYgKHdhc1Rhc2tDcmVhdGlvbikge1xuICAgICAgICAgICAgd2luZG93Lm5ld1Byb2plY3REYXNoYm9hcmQ/LmFkZEV4aXN0aW5nVGFza1RvRGFzaGJvYXJkPy4odGFza0lkcylcbiAgICAgICAgICB9IGVsc2UgaWYgKHdhc1Rhc2tFZGl0KSB7XG4gICAgICAgICAgICB3aW5kb3cubmV3UHJvamVjdERhc2hib2FyZD8uZWRpdEV4aXN0aW5nVGFza0luRGFzaGJvYXJkPy4odGFza0lkcylcbiAgICAgICAgICB9IGVsc2UgaWYgKHdhc1Rhc2tEZWxldGUpIHtcbiAgICAgICAgICAgIHdpbmRvdy5uZXdQcm9qZWN0RGFzaGJvYXJkPy5kZWxldGVFeGlzdGluZ1Rhc2tGcm9tRGFzaGJvYXJkPy4odGFza0lkcylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVmZXRjaCBkZWwgdGFzayBwYW5lbCBzaSBlc3TDoSBhYmllcnRvIHkgbGEgdG9vbCBhcHJvYmFkYSBlZGl0w7MvYm9ycsOzIGVzYSB0YXJlYS5cbiAgICAgIC8vIEN1YnJlIGxvcyBkb3MgZmx1am9zIGRlIGFwcHJvdmFsOlxuICAgICAgLy8gICAxKSBBcHByb3ZhbCBwb3IgYm90w7NuIOKGkiBgcHJldmlvdXNNZXNzYWdlLmFwcHJvdmFsLnBlbmRpbmdfYWN0aW9uc2AgKHbDrWEgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSlcbiAgICAgIC8vICAgMikgTWFudWFsIGFwcHJvdmFsICh1c3VhcmlvIHRpcGVhIFwic2lcIi9cIm5vXCIpIOKGkiBgbGFzdE1hbnVhbEFwcHJvdmFsUmVmLmN1cnJlbnRgXG4gICAgICBjb25zdCBvcGVuVGFza1BhbmVsSWQgPSB3aW5kb3cudGFza1BhbmVsPy50YXNrSWRcbiAgICAgIGNvbnN0IG1hbnVhbEFwcHJvdmFsID0gbGFzdE1hbnVhbEFwcHJvdmFsUmVmLmN1cnJlbnRcbiAgICAgIGxhc3RNYW51YWxBcHByb3ZhbFJlZi5jdXJyZW50ID0gbnVsbCAvLyBjb25zdW1pciB1bmEgc29sYSB2ZXpcbiAgICAgIGNvbnN0IG1hbnVhbFdhc1Rhc2tFZGl0ID0gISFtYW51YWxBcHByb3ZhbCAmJiBUQVNLX0VESVRfVE9PTFMuaW5jbHVkZXMobWFudWFsQXBwcm92YWwudG9vbE5hbWUpXG4gICAgICBjb25zdCBtYW51YWxXYXNUYXNrRGVsZXRlID0gISFtYW51YWxBcHByb3ZhbCAmJiBUQVNLX0RFTEVURV9UT09MUy5pbmNsdWRlcyhtYW51YWxBcHByb3ZhbC50b29sTmFtZSlcblxuICAgICAgLy8gU3luYyBQbGFubmVyOiBhdmlzYXIgY2FyZ2EgZGUgaG9yYXMgY29uZmlybWFkYSAoY3JlYXRlX2hvdXIgLyBjcmVhdGVfaG91cnMpLlxuICAgICAgY29uc3QgaG91cnNUb29sc0Zyb21BcHByb3ZhbCA9IHBlbmRpbmdBY3Rpb25zXG4gICAgICAgIC5tYXAoKGFjdGlvbjogUGVuZGluZ0FjdGlvbikgPT4gYWN0aW9uLnRvb2xfbmFtZSlcbiAgICAgICAgLmZpbHRlcigodG9vbE5hbWUpOiB0b29sTmFtZSBpcyBzdHJpbmcgPT4gaXNIb3Vyc0NoYXJnZVRvb2wodG9vbE5hbWUpKVxuICAgICAgY29uc3Qgd2FzSG91cnNDaGFyZ2VBcHByb3ZlZCA9XG4gICAgICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiZcbiAgICAgICAgcHJldmlvdXNNZXNzYWdlPy5hcHByb3ZhbFN0YXR1cyA9PT0gJ2FwcHJvdmVkJyAmJlxuICAgICAgICBob3Vyc1Rvb2xzRnJvbUFwcHJvdmFsLmxlbmd0aCA+IDBcbiAgICAgIGNvbnN0IG1hbnVhbEhvdXJzVG9vbCA9IG1hbnVhbEFwcHJvdmFsPy50b29sTmFtZVxuICAgICAgY29uc3Qgd2FzSG91cnNDaGFyZ2VNYW51YWxBcHByb3ZlZCA9IGlzSG91cnNDaGFyZ2VUb29sKG1hbnVhbEhvdXJzVG9vbClcblxuICAgICAgaWYgKHdhc0hvdXJzQ2hhcmdlQXBwcm92ZWQgfHwgd2FzSG91cnNDaGFyZ2VNYW51YWxBcHByb3ZlZCkge1xuICAgICAgICBjb25zdCB0b29scyA9IHdhc0hvdXJzQ2hhcmdlQXBwcm92ZWQgPyBob3Vyc1Rvb2xzRnJvbUFwcHJvdmFsIDogbWFudWFsSG91cnNUb29sID8gW21hbnVhbEhvdXJzVG9vbF0gOiBbXVxuICAgICAgICBjb25zb2xlLmluZm8oJ1tNQUlBXVtob3Vycy1zeW5jXSBjcmVhdGVfaG91cihzKSBhcHByb3ZlZCDigJQgbm90aWZ5aW5nIFBsYW5uZXInLCB7XG4gICAgICAgICAgdmlhOiB3YXNIb3Vyc0NoYXJnZUFwcHJvdmVkID8gJ2FwcHJvdmFsLWJ1dHRvbicgOiAnbWFudWFsLWFwcHJvdmFsJyxcbiAgICAgICAgICB0b29scyxcbiAgICAgICAgICBhcHByb3ZhbFN0YXR1czogcHJldmlvdXNNZXNzYWdlPy5hcHByb3ZhbFN0YXR1cyxcbiAgICAgICAgICBtZW1vcnlTZXNzaW9uSWQsXG4gICAgICAgIH0pXG4gICAgICAgIGRpc3BhdGNoTWFpYUhvdXJzQ2hhcmdlZCh7XG4gICAgICAgICAgc291cmNlOiAnbWFpYScsXG4gICAgICAgICAgdG9vbHMsXG4gICAgICAgICAgc2Vzc2lvbklkOiBtZW1vcnlTZXNzaW9uSWQsXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiYgaG91cnNUb29sc0Zyb21BcHByb3ZhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnW01BSUFdW2hvdXJzLXN5bmNdIGhvdXJzIHRvb2xzIHByZXNlbnQgYnV0IG5vdCBzeW5jaW5nJywge1xuICAgICAgICAgIGFwcHJvdmFsU3RhdHVzOiBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsU3RhdHVzLFxuICAgICAgICAgIHRvb2xzOiBob3Vyc1Rvb2xzRnJvbUFwcHJvdmFsLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAob3BlblRhc2tQYW5lbElkICYmICh3YXNUYXNrRWRpdCB8fCB3YXNUYXNrRGVsZXRlIHx8IG1hbnVhbFdhc1Rhc2tFZGl0IHx8IG1hbnVhbFdhc1Rhc2tEZWxldGUpKSB7XG4gICAgICAgIGNvbnN0IG1hbnVhbFBzZXVkb0FjdGlvbjogUGVuZGluZ0FjdGlvbiB8IG51bGwgPSBtYW51YWxBcHByb3ZhbFxuICAgICAgICAgID8gKHsgdG9vbF9uYW1lOiBtYW51YWxBcHByb3ZhbC50b29sTmFtZSwgdG9vbF9hcmdzOiBtYW51YWxBcHByb3ZhbC50b29sQXJncyA/PyB7fSB9IGFzIFBlbmRpbmdBY3Rpb24pXG4gICAgICAgICAgOiBudWxsXG4gICAgICAgIGNvbnN0IGFmZmVjdGVkVGFza0lkcyA9IFtcbiAgICAgICAgICAuLi5leHRyYWN0VGFza0lkc0Zyb21QZW5kaW5nQWN0aW9uc0FyZ3MocGVuZGluZ0FjdGlvbnMpLFxuICAgICAgICAgIC4uLnRhc2tJZHNGcm9tVXJscyxcbiAgICAgICAgICAuLi50YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsLFxuICAgICAgICAgIC4uLihtYW51YWxQc2V1ZG9BY3Rpb24gPyBleHRyYWN0VGFza0lkc0Zyb21QZW5kaW5nQWN0aW9uc0FyZ3MoW21hbnVhbFBzZXVkb0FjdGlvbl0pIDogW10pLFxuICAgICAgICBdLm1hcChTdHJpbmcpXG4gICAgICAgIGlmIChhZmZlY3RlZFRhc2tJZHMuaW5jbHVkZXMoU3RyaW5nKG9wZW5UYXNrUGFuZWxJZCkpKSB7XG4gICAgICAgICAgd2luZG93LnRhc2tQYW5lbD8ucmVmZXRjaFRhc2s/LigpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYWRkTWVzc2FnZSh7XG4gICAgICAgIGlkOiBgYW5zd2VyLSR7bWVtb3J5U2Vzc2lvbklkfWAsXG4gICAgICAgIG1lc3NhZ2U6IGNvbnRlbnRUb0FkZCxcbiAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6ICdBc3Npc3RhbnQnIH0sXG4gICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICAgIHNvdXJjZXMsXG4gICAgICAgIC4uLihhdHRhY2htZW50cy5sZW5ndGggPiAwID8geyBhdHRhY2htZW50cyB9IDoge30pLFxuICAgICAgICBtZW1vcnlTZXNzaW9uSWQsXG4gICAgICAgIHN1Z2dlc3Rpb25zOiBzdWdnZXN0aW9ucyB8fCBbXSxcbiAgICAgICAgLi4uKGNyZWF0ZUFnZW50Rm9sbG93VXAgPyB7IGNyZWF0ZUFnZW50Rm9sbG93VXAgfSA6IHt9KSxcbiAgICAgIH0pXG5cbiAgICAgIGlmIChjcmVhdGVBZ2VudEZvbGxvd1VwPy5hZ2VudElkKSB7XG4gICAgICAgIGZldGNoQWdlbnREZXRhaWwoY3JlYXRlQWdlbnRGb2xsb3dVcC5hZ2VudElkKVxuICAgICAgICAgIC50aGVuKGNoYXRBZ2VudCA9PiB7XG4gICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ21haWEtbWVyZ2UtY3JlYXRlZC1hZ2VudC1pbnRvLWxpc3QnLCB7XG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7IGFnZW50OiBjaGF0QWdlbnQgfSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW3VzZUNoYXRNYW5hZ2VyXSBObyBzZSBwdWRvIGHDsWFkaXIgZWwgYWdlbnRlIHJlY2nDqW4gY3JlYWRvIGFsIGxpc3RhZG8nLCBlcnIpXG4gICAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGVkaXRBZ2VudEZvbGxvd1VwPy5hZ2VudElkKSB7XG4gICAgICAgIGZldGNoQWdlbnREZXRhaWwoZWRpdEFnZW50Rm9sbG93VXAuYWdlbnRJZClcbiAgICAgICAgICAudGhlbihjaGF0QWdlbnQgPT4ge1xuICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdtYWlhLXN5bmMtZWRpdGVkLWFnZW50LWZyb20tY2hhdCcsIHtcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHsgYWdlbnQ6IGNoYXRBZ2VudCB9LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbdXNlQ2hhdE1hbmFnZXJdIE5vIHNlIHB1ZG8gcmVmcmVzY2FyIGVsIGFnZW50ZSBlZGl0YWRvJywgZXJyKVxuICAgICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIGlmIChmaXJzdFRpbWVSZWYuY3VycmVudCkge1xuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudCgncmVmZXRjaC1zZXNzaW9uJylcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudClcbiAgICAgICAgZmlyc3RUaW1lUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgfVxuICAgIH0sXG4gICAgW2FkZE1lc3NhZ2UsIHJlbW92ZU1lc3NhZ2UsIHByb2plY3QsIGdldFRhYlRhc2tEZWZhdWx0LCBldmVudCwgYWdlbnRdXG4gIClcblxuICBjb25zdCBoYW5kbGVTdHJlYW1TdG9wID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNsZWFyU3RyZWFtVWlSZWYuY3VycmVudCgpXG4gICAgY29uc3QgdGVtcE1lc3NhZ2VJZCA9IGBhbnN3ZXItJHtjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnR9LXN0cmVhbWluZ2BcbiAgICBzdHJlYW1pbmdTdG9yZS5jbGVhcigpXG4gICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIHJlbW92ZU1lc3NhZ2UodGVtcE1lc3NhZ2VJZClcblxuICAgIGFkZE1lc3NhZ2Uoe1xuICAgICAgaWQ6IGBhbnN3ZXItJHtjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnR9LWNhbmNlbGxlZGAsXG4gICAgICBtZXNzYWdlOiB0KCdjaGF0LmNhbmNlbGxlZCcpLFxuICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiAnQXNzaXN0YW50JyB9LFxuICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgIGlzRnJvbnRlbmRDYW5jZWxsZWQ6IHRydWUsXG4gICAgfSlcbiAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudCgncmVmZXRjaC1zZXNzaW9uJylcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpXG4gICAgfSwgNTAwKVxuICB9LCBbYWRkTWVzc2FnZSwgcmVtb3ZlTWVzc2FnZSwgdF0pXG5cbiAgY29uc3QgaGFuZGxlQXBwcm92YWxSZXF1aXJlZCA9IHVzZUNhbGxiYWNrKFxuICAgIChhcHByb3ZhbDogQXBwcm92YWxSZXF1ZXN0LCBhY2N1bXVsYXRlZENvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgdGVtcE1lc3NhZ2VJZCA9IGBhbnN3ZXItJHtjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnR9LXN0cmVhbWluZ2BcbiAgICAgIHN0cmVhbWluZ1N0b3JlLmNsZWFyKClcbiAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgcmVtb3ZlTWVzc2FnZSh0ZW1wTWVzc2FnZUlkKVxuXG4gICAgICBjb25zdCBoaXRsQ29udGV4dDogSGl0bEV4ZWN1dGlvbkNvbnRleHQgPSB7XG4gICAgICAgIG1lc3NhZ2VJZDogYGFwcHJvdmFsLSR7YXBwcm92YWwub3JpZ2luYWxfdGhyZWFkX2lkfWAsXG4gICAgICAgIG1lc3NhZ2VUZXh0OiBhY2N1bXVsYXRlZENvbnRlbnQgfHwgJycsXG4gICAgICAgIGFwcHJvdmFsLFxuICAgICAgICBwZW5kaW5nQWN0aW9uczogYXBwcm92YWwucGVuZGluZ19hY3Rpb25zLFxuICAgICAgICB0aHJlYWRJZHM6IGFwcHJvdmFsLnBlbmRpbmdfYWN0aW9ucz8ubWFwKGFjdGlvbiA9PiBhY3Rpb24udGhyZWFkX2lkKSxcbiAgICAgIH1cbiAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBoaXRsQ29udGV4dFxuXG4gICAgICBpZiAoYXBwcm92YWwubWFudWFsX2FwcHJvdmFsX2RldGVjdGVkKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0QWN0aW9uID0gYXBwcm92YWwucGVuZGluZ19hY3Rpb25zPy5bMF1cbiAgICAgICAgY29uc3QgdG9vbE5hbWUgPSAoYXBwcm92YWwgYXMgeyB0b29sX25hbWU/OiBzdHJpbmcgfSkudG9vbF9uYW1lID8/IGZpcnN0QWN0aW9uPy50b29sX25hbWUgPz8gJydcbiAgICAgICAgY29uc3QgdG9vbEFyZ3MgPVxuICAgICAgICAgICgoYXBwcm92YWwgYXMgeyB0b29sX2FyZ3M/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9KS50b29sX2FyZ3MgPz9cbiAgICAgICAgICAgIChmaXJzdEFjdGlvbj8udG9vbF9hcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKSkgfHxcbiAgICAgICAgICBudWxsXG4gICAgICAgIGlmICh0b29sTmFtZSkge1xuICAgICAgICAgIGxhc3RNYW51YWxBcHByb3ZhbFJlZi5jdXJyZW50ID0geyB0b29sTmFtZSwgdG9vbEFyZ3MgfVxuICAgICAgICB9XG4gICAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBhIG1lc3NhZ2Ugd2l0aCB0aGUgYXBwcm92YWwgcmVxdWVzdFxuICAgICAgYWRkTWVzc2FnZSh7XG4gICAgICAgIGlkOiBgYXBwcm92YWwtJHthcHByb3ZhbC5vcmlnaW5hbF90aHJlYWRfaWR9YCxcbiAgICAgICAgbWVzc2FnZTogYWNjdW11bGF0ZWRDb250ZW50IHx8ICcnLFxuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogJ0Fzc2lzdGFudCcgfSxcbiAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgYXBwcm92YWwsXG4gICAgICAgIGFwcHJvdmFsU3RhdHVzOiAncGVuZGluZycsXG4gICAgICB9KVxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIH0sXG4gICAgW2FkZE1lc3NhZ2UsIHJlbW92ZU1lc3NhZ2VdXG4gIClcblxuICBjb25zdCB7XG4gICAgYXNrTWFpYSxcbiAgICBpc0xvYWRpbmc6IHdhaXRpbmdSZXNwb25zZSxcbiAgICBpc1dyaXRpbmcsXG4gICAgbG9hZGluZ01lc3NhZ2UsXG4gICAgc3RyZWFtQWN0aXZpdHksXG4gICAgdXBkYXRlU3RyZWFtQWN0aXZpdHksXG4gICAgc3RvcFN0cmVhbWluZyxcbiAgICBhYm9ydFN0cmVhbVNpbGVudGx5LFxuICB9ID0gdXNlT3JjaGVzdHJhdG9yU3RyZWFtKHtcbiAgICBvbkVycm9yOiBoYW5kbGVTdHJlYW1FcnJvcixcbiAgICBvblN0cmVhbVVwZGF0ZTogaGFuZGxlU3RyZWFtVXBkYXRlLFxuICAgIG9uRmluaXNoU3RyZWFtOiBoYW5kbGVTdHJlYW1GaW5pc2gsXG4gICAgb25TdG9wOiBoYW5kbGVTdHJlYW1TdG9wLFxuICAgIG9uQXBwcm92YWxSZXF1aXJlZDogaGFuZGxlQXBwcm92YWxSZXF1aXJlZCxcbiAgICBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZixcbiAgfSlcblxuICAvLyBNYW50ZW5lbW9zIGVsIHNldHRlciBtw6FzIHJlY2llbnRlIGVuIHVuYSByZWYgcGFyYSBxdWUgcHVlZGEgdXNhcnNlIGRlc2RlXG4gIC8vIGVmZWN0b3MgZGVmaW5pZG9zIGFudGVzIGVuIGVsIGFyY2hpdm8gKGNhbWJpbyBkZSBjaGF0LCByZXNldCwgZXRjLikuXG4gIGFib3J0U3RyZWFtU2lsZW50bHlSZWYuY3VycmVudCA9IGFib3J0U3RyZWFtU2lsZW50bHlcbiAgY2xlYXJTdHJlYW1VaVJlZi5jdXJyZW50ID0gKCkgPT4ge1xuICAgIHVwZGF0ZVN0cmVhbUFjdGl2aXR5KG51bGwpXG4gICAgc2V0QWN0aXZlTG9hZGluZ3Moe30pXG4gICAgc2V0SXNDb250aW51aW5nU3RyZWFtKGZhbHNlKVxuICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBudWxsXG4gIH1cblxuICBjb25zdCBjdXJyZW50UHJvamVjdCA9IHByb2plY3RcblxuICBjb25zdCBzZW5kTWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGF0dGFjaG1lbnRzT3JPcHRpb25zPzogQXR0YWNobWVudEZpbGVbXSB8IFNlbmRNZXNzYWdlT3B0aW9ucyxcbiAgICAgIGZhcUlkPzogc3RyaW5nLFxuICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcsXG4gICAgICBtZW50aW9ucz86IENvbnRleHRNZW50aW9uW10sXG4gICAgICBmdWFJZD86IHN0cmluZyxcbiAgICAgIHNjSWQ/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCB8fCB3YWl0aW5nUmVzcG9uc2UgfHwgbG9hZGluZ01lc3NhZ2VzKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGF0dGFjaG1lbnRzLCBvcHRpb25zIH0gPSBub3JtYWxpemVTZW5kTWVzc2FnZUFyZ3MoYXR0YWNobWVudHNPck9wdGlvbnMpXG4gICAgICAvLyBMYXMgbWVudGlvbnMgcHVlZGVuIHZlbmlyIHbDrWEgNXRvIHBhcsOhbWV0cm8gKGNhbGwgcG9zaXRpb25hbCBkZXNkZSBlbCBmb290ZXIpXG4gICAgICAvLyBvIHbDrWEgU2VuZE1lc3NhZ2VPcHRpb25zIChjYWxsIHByb2dyYW3DoXRpY28pLiBFbCBwYXLDoW1ldHJvIGV4cGzDrWNpdG8gZ2FuYS5cbiAgICAgIGNvbnN0IGVmZmVjdGl2ZU1lbnRpb25zID0gbWVudGlvbnMgPz8gb3B0aW9ucy5tZW50aW9uc1xuICAgICAgY29uc3QgY29udGV4dE1lc3NhZ2U6IENvbnRleHRNZXNzYWdlIHwgdW5kZWZpbmVkID0gYnVpbGRDb250ZXh0TWVzc2FnZShlZmZlY3RpdmVNZW50aW9ucylcbiAgICAgIGNvbnN0IHBheWxvYWRGdWFJZCA9IGZ1YUlkID8/IG9wdGlvbnMuZnVhSWRcbiAgICAgIGNvbnN0IHBheWxvYWRTY0lkID0gc2NJZCA/PyBvcHRpb25zLnNjSWRcbiAgICAgIGNvbnN0IHBheWxvYWRDb250ZXh0RGF0YSA9IG9wdGlvbnMuY29udGV4dERhdGFcbiAgICAgIGNvbnN0IGRpc3BsYXlNZXNzYWdlID0gZm9ybWF0UXVpY2tBY3Rpb25NZXNzYWdlRm9yRGlzcGxheShtZXNzYWdlLCB7XG4gICAgICAgIGZ1YUlkOiBwYXlsb2FkRnVhSWQsXG4gICAgICAgIHNjSWQ6IHBheWxvYWRTY0lkLFxuICAgICAgfSlcblxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICBjb25zdCBuZXdNZXNzYWdlSWQgPSB1dWlkdjQoKVxuICAgICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gbmV3TWVzc2FnZUlkXG4gICAgICBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQgPSBtZXNzYWdlXG5cbiAgICAgIGlmICghcmVwb3J0ZWRFdmVudC5jdXJyZW50KSB7XG4gICAgICAgIGV2ZW50KEVWRU5UUy5wbUFpVHlwZWRUZXh0KVxuICAgICAgICByZXBvcnRlZEV2ZW50LmN1cnJlbnQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmaWNhciBzaSBlbCBjb250ZXh0byBnbG9iYWwgZXN0w6EgZGVzYWN0dWFsaXphZG9cbiAgICAgIGNvbnN0IGxhc3RNZXNzYWdlV2l0aFByb2plY3QgPSBtZXNzYWdlc1JlZi5jdXJyZW50LmZpbHRlcihtc2cgPT4gbXNnLnByb2plY3RJZCkuYXQoLTEpXG5cbiAgICAgIGNvbnN0IGN1cnJlbnRBZ2VudEZyb21NZXNzYWdlcyA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQ/LlttZXNzYWdlc1JlZi5jdXJyZW50Lmxlbmd0aCAtIDFdPy5hZ2VudElkXG5cbiAgICAgIC8vIE5vIGFncmVnYXIgcHJvamVjdElkIGFsIG1lbnNhamUgZGVsIHVzdWFyaW8gLSBzZSBkZXRlcm1pbmFyw6EgZGVzcHXDqXNcbiAgICAgIGFkZE1lc3NhZ2Uoe1xuICAgICAgICBpZDogYHF1ZXN0aW9uLSR7Y3VycmVudE1lc3NhZ2VJZC5jdXJyZW50fWAsXG4gICAgICAgIG1lc3NhZ2U6IGRpc3BsYXlNZXNzYWdlLFxuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB1c2VyOiBjdXJyZW50VXNlcixcbiAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLlVTRVIsXG4gICAgICAgIHNvdXJjZXM6IGF0dGFjaG1lbnRzLFxuICAgICAgICAuLi4oY29udGV4dE1lc3NhZ2UgPyB7IGNvbnRleHRNZXNzYWdlIH0gOiB7fSksXG4gICAgICB9KVxuXG4gICAgICBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQgPSB1dWlkdjQoKVxuXG4gICAgICBjb25zdCBzdHJlYW1pbmdQbGFjZWhvbGRlcklkID0gYGFuc3dlci0ke2N1cnJlbnRNZXNzYWdlSWQuY3VycmVudH0tc3RyZWFtaW5nYFxuICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFxuICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBjdXJyZW50Q2hhdElkLmN1cnJlbnRcbiAgICAgIGFkZE1lc3NhZ2Uoe1xuICAgICAgICBpZDogc3RyZWFtaW5nUGxhY2Vob2xkZXJJZCxcbiAgICAgICAgbWVzc2FnZTogJycsXG4gICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiBhZ2VudD8ubmFtZSB8fCAnQXNzaXN0YW50JyB9LFxuICAgICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgfSlcblxuICAgICAgbGV0IGZpbmFsTWVzc2FnZSA9IG1lc3NhZ2VcblxuICAgICAgaWYgKG1lc3NhZ2UgPT09IHQoJ3FhLml0ZW1zLnJlbnRhYmlsaWRhZF9wcm95ZWN0bycpKSB7XG4gICAgICAgIGZpbmFsTWVzc2FnZSA9IGBGQVE6ICR7dCgncWEuaXRlbXMucmVudGFiaWxpZGFkX3Byb3llY3RvJyl9IC0gVGlwbyBkZSByZW50YWJpbGlkYWQ6ICR7XG4gICAgICAgICAgb3B0aW9ucy5wcm9qZWN0Q2hhbmdlZD8uaW5jb21lVHlwZSB8fCBjb250ZXh0UmVmLmN1cnJlbnQucHJvamVjdD8uaW5jb21lVHlwZVxuICAgICAgICB9YFxuICAgICAgfVxuXG4gICAgICBjb25zdCBoaXN0b3J5ID0gbWVzc2FnZXNSZWYuY3VycmVudC5tYXAoaGlzdG9yeU1lc3NhZ2UgPT4gKHtcbiAgICAgICAgY29udGVudDogaGlzdG9yeU1lc3NhZ2UubWVzc2FnZSxcbiAgICAgICAgcm9sZTogaGlzdG9yeU1lc3NhZ2UudXNlci5pZCA9PT0gYXV0aFVzZXIuaWQudG9TdHJpbmcoKSA/IENoYXRIaXN0b3J5Um9sZS5VU0VSIDogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgIH0pKVxuXG4gICAgICBjb25zdCB7XG4gICAgICAgIGNoaXBzUHJvamVjdDogY3R4Q2hpcHNQcm9qZWN0LFxuICAgICAgICBwcm9qZWN0OiBjdHhQcm9qZWN0LFxuICAgICAgICBjbGllbnQ6IGN0eENsaWVudCxcbiAgICAgICAgdGFzazogY3R4VGFzayxcbiAgICAgIH0gPSBjb250ZXh0UmVmLmN1cnJlbnRcbiAgICAgIGNvbnN0IGxhc3RNZXNzYWdlUHJvamVjdElkID0gbGFzdE1lc3NhZ2VXaXRoUHJvamVjdD8ucHJvamVjdElkXG4gICAgICBjb25zdCBwcm9qZWN0VG9SZXF1ZXN0ID0gcmVzb2x2ZVByb2plY3RUb1JlcXVlc3QoY3R4Q2hpcHNQcm9qZWN0LCBsYXN0TWVzc2FnZVByb2plY3RJZClcblxuICAgICAgY29uc29sZS5pbmZvKCdbdXNlQ2hhdE1hbmFnZXJdIHNlbmRNZXNzYWdlIGNvbnRleHQgcmVzb2x1dGlvbjonLCB7XG4gICAgICAgIGNoaXBzUHJvamVjdDogY3R4Q2hpcHNQcm9qZWN0LFxuICAgICAgICBjaGlwc1Byb2plY3RJZDogY3R4Q2hpcHNQcm9qZWN0Py5wcm9qZWN0SWQgPyBOdW1iZXIoY3R4Q2hpcHNQcm9qZWN0LnByb2plY3RJZCkgOiBudWxsLFxuICAgICAgICBsYXN0TWVzc2FnZVByb2plY3RJZCxcbiAgICAgICAgcHJvamVjdFRvUmVxdWVzdCxcbiAgICAgICAgY2xpZW50SWQ6IGN0eENsaWVudD8uaWQsXG4gICAgICAgIHRhc2tJZDogY3R4VGFzaz8uaWQsXG4gICAgICAgIHByb2plY3RQcm9wSWQ6IGN0eFByb2plY3Q/LmlkLFxuICAgICAgICBhZ2VudFR5cGU6IGFnZW50Py50eXBlLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmZXRjaFByb2plY3RzKFtwcm9qZWN0VG9SZXF1ZXN0XSlcblxuICAgICAgY29uc3QgcGF5bG9hZEZhcUlkID0gZmFxSWQgPz8gb3B0aW9ucy5mYXFJZFxuICAgICAgY29uc3QgcGF5bG9hZEFnZW50U3VnZ2VzdGlvbklkID0gYWdlbnRTdWdnZXN0aW9uSWQgPz8gb3B0aW9ucy5hZ2VudFN1Z2dlc3Rpb25JZFxuXG4gICAgICBjb25zdCBwYXlsb2FkRGF0YSA9IHtcbiAgICAgICAgbWVzc2FnZTogZmluYWxNZXNzYWdlLFxuICAgICAgICBoaXN0b3J5LFxuICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RUb1JlcXVlc3QsXG4gICAgICAgIGxhbmc6IGF1dGhVc2VyLmxhbmcsXG4gICAgICAgIHVzZXJJZDogYXV0aFVzZXIuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgZmlyc3ROYW1lOiBhdXRoVXNlci5maXJzdE5hbWUsXG4gICAgICAgIGxhc3ROYW1lOiBhdXRoVXNlci5sYXN0TmFtZSxcbiAgICAgICAgY29tcGFueUlkOiBhdXRoVXNlci5jb21wYW55X2lkLnRvU3RyaW5nKCksXG4gICAgICAgIGNoYXRJZDogY3VycmVudENoYXRJZC5jdXJyZW50LFxuICAgICAgICBtZXNzYWdlSWQ6IGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCxcbiAgICAgICAgYWdlbnROYW1lOiBhZ2VudD8ubmFtZSB8fCAnJyxcbiAgICAgICAgYWdlbnRJZDogY3VycmVudEFnZW50RnJvbU1lc3NhZ2VzIHx8IGFnZW50Py5pZCEsXG4gICAgICAgIGlzV2ViU2VhcmNoQWN0aXZlOiBpc1dlYlNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICBpc0RlZXBTZWFyY2hBY3RpdmU6IGlzRGVlcFNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICAuLi4oY3R4UHJvamVjdD8uZmVlSWQgIT0gbnVsbCA/IHsgZmVlSWQ6IE51bWJlcihjdHhQcm9qZWN0LmZlZUlkKSB9IDoge30pLFxuICAgICAgICAuLi5yZXNvbHZlQ2xpZW50UGF5bG9hZChjdHhDbGllbnQsIGN0eFByb2plY3QpLFxuICAgICAgICAuLi4ocHJvamVjdHM/Lmxlbmd0aCA/IHsgcHJvamVjdE5hbWU6IHByb2plY3RzWzBdLm5hbWUgfSA6IHt9KSxcbiAgICAgICAgLi4uKGN0eFRhc2s/LmlkICE9IG51bGxcbiAgICAgICAgICA/IHsgdGFza0lkOiBOdW1iZXIoY3R4VGFzay5pZCksIC4uLihjdHhUYXNrLm5hbWUgPyB7IHRhc2tOYW1lOiBjdHhUYXNrLm5hbWUgfSA6IHt9KSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLihhdHRhY2htZW50cy5sZW5ndGggPiAwID8geyBhdHRhY2htZW50cyB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZEZhcUlkID8geyBmYXFJZDogcGF5bG9hZEZhcUlkIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkQWdlbnRTdWdnZXN0aW9uSWQgPyB7IGFnZW50U3VnZ2VzdGlvbklkOiBwYXlsb2FkQWdlbnRTdWdnZXN0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWRGdWFJZCA/IHsgZnVhSWQ6IHBheWxvYWRGdWFJZCB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZFNjSWQgPyB7IHNjSWQ6IHBheWxvYWRTY0lkIH0gOiB7fSksXG4gICAgICAgIC4uLihhZ2VudD8uZW50aXR5ICE9IG51bGwgPyB7IGFnZW50RW50aXR5OiBhZ2VudC5lbnRpdHkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50Py50eXBlICE9IG51bGwgPyB7IGFnZW50VHlwZTogYWdlbnQudHlwZSB9IDoge30pLFxuICAgICAgICAuLi4oY29udGV4dE1lc3NhZ2UgPyB7IGNvbnRleHRNZXNzYWdlIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkQ29udGV4dERhdGEgPyB7IGNvbnRleHREYXRhOiBwYXlsb2FkQ29udGV4dERhdGEgfSA6IHt9KSxcbiAgICAgIH1cblxuICAgICAgYXNrTWFpYShwYXlsb2FkRGF0YSlcbiAgICB9LFxuICAgIFtcbiAgICAgIGFkZE1lc3NhZ2UsXG4gICAgICBldmVudCxcbiAgICAgIGFza01haWEsXG4gICAgICBwcm9qZWN0LFxuICAgICAgY2xpZW50LFxuICAgICAgdGFzayxcbiAgICAgIGNoaXBzUHJvamVjdCxcbiAgICAgIGF1dGhVc2VyLFxuICAgICAgYWdlbnQsXG4gICAgICB0LFxuICAgICAgd2FpdGluZ1Jlc3BvbnNlLFxuICAgICAgbG9hZGluZ01lc3NhZ2VzLFxuICAgICAgaXNXZWJTZWFyY2hBY3RpdmUsXG4gICAgICBpc0RlZXBTZWFyY2hBY3RpdmUsXG4gICAgXVxuICApXG5cbiAgY29uc3QgY2hhbmdlUHJvamVjdCA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFByb2plY3QpID0+IHtcbiAgICAgIGlmICghY3VycmVudFVzZXJRdWVzdGlvbi5jdXJyZW50KSByZXR1cm5cblxuICAgICAgaWYgKG9wdGlvbi5pZCAhPT0gcHJvamVjdD8uaWQpIHtcbiAgICAgICAgc2V0UHJvamVjdChvcHRpb24pXG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9qZWN0ICYmIGN1cnJlbnRVc2VyUXVlc3Rpb24uY3VycmVudCkge1xuICAgICAgICBjb25zdCBoaXN0b3J5ID0gbWVzc2FnZXNSZWYuY3VycmVudC5tYXAoaGlzdG9yeU1lc3NhZ2UgPT4gKHtcbiAgICAgICAgICBjb250ZW50OiBoaXN0b3J5TWVzc2FnZS5tZXNzYWdlLFxuICAgICAgICAgIHJvbGU6IGhpc3RvcnlNZXNzYWdlLnVzZXIuaWQgPT09IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCkgPyBDaGF0SGlzdG9yeVJvbGUuVVNFUiA6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICAgIH0pKVxuXG4gICAgICAgIGNvbnNvbGUuaW5mbygnW3VzZUNoYXRNYW5hZ2VyXSBQQVRIPWNoYW5nZVByb2plY3Qg4oCUIHVzYSBvcHRpb24uaWQgZGlyZWN0byAoTk8gY2hpcHNQcm9qZWN0KTonLCB7XG4gICAgICAgICAgb3B0aW9uSWQ6IG9wdGlvbi5pZCxcbiAgICAgICAgICBwcm9qZWN0UHJvcElkOiBwcm9qZWN0Py5pZCA/PyBudWxsLFxuICAgICAgICAgIGNoaXBzUHJvamVjdElkOiBjaGlwc1Byb2plY3Q/LnByb2plY3RJZCA/PyBudWxsLFxuICAgICAgICAgIGFnZW50VHlwZTogYWdlbnQ/LnR5cGUsXG4gICAgICAgIH0pXG5cbiAgICAgICAgYXNrTWFpYSh7XG4gICAgICAgICAgbWVzc2FnZTogY3VycmVudFVzZXJRdWVzdGlvbi5jdXJyZW50LFxuICAgICAgICAgIGhpc3RvcnksXG4gICAgICAgICAgcHJvamVjdElkOiBvcHRpb24uaWQsXG4gICAgICAgICAgbGFuZzogYXV0aFVzZXIubGFuZyxcbiAgICAgICAgICB1c2VySWQ6IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCksXG4gICAgICAgICAgZmlyc3ROYW1lOiBhdXRoVXNlci5maXJzdE5hbWUsXG4gICAgICAgICAgbGFzdE5hbWU6IGF1dGhVc2VyLmxhc3ROYW1lLFxuICAgICAgICAgIGNvbXBhbnlJZDogYXV0aFVzZXIuY29tcGFueV9pZC50b1N0cmluZygpLFxuICAgICAgICAgIGNoYXRJZDogY3VycmVudENoYXRJZC5jdXJyZW50LFxuICAgICAgICAgIG1lc3NhZ2VJZDogY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50LFxuICAgICAgICAgIGFnZW50TmFtZTogYWdlbnQ/Lm5hbWUgfHwgJycsXG4gICAgICAgICAgYWdlbnRJZDogYWdlbnQ/LmlkIHx8ICcnLFxuICAgICAgICAgIGlzV2ViU2VhcmNoQWN0aXZlOiBpc1dlYlNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICAgIGlzRGVlcFNlYXJjaEFjdGl2ZTogaXNEZWVwU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgICAgLi4uKG9wdGlvbj8uZmVlSWQgIT0gbnVsbCA/IHsgZmVlSWQ6IE51bWJlcihvcHRpb24uZmVlSWQpIH0gOiB7fSksXG4gICAgICAgICAgLi4uKG9wdGlvbj8uY2xpZW50SWQgIT0gbnVsbCA/IHsgY2xpZW50SWQ6IE51bWJlcihvcHRpb24uY2xpZW50SWQpIH0gOiB7fSksXG4gICAgICAgICAgLi4uKGFnZW50Py5lbnRpdHkgIT0gbnVsbCA/IHsgYWdlbnRFbnRpdHk6IGFnZW50LmVudGl0eSB9IDoge30pLFxuICAgICAgICAgIC4uLihhZ2VudD8udHlwZSAhPSBudWxsID8geyBhZ2VudFR5cGU6IGFnZW50LnR5cGUgfSA6IHt9KSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9LFxuICAgIFtwcm9qZWN0LCBzZXRQcm9qZWN0LCBhc2tNYWlhLCBhdXRoVXNlciwgaXNXZWJTZWFyY2hBY3RpdmUsIGFnZW50XVxuICApXG5cbiAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjayhhc3luYyAoZmVlZGJhY2tQcm9wOiBGZWVkYmFjaywgY2hhdE1lc3NhZ2VJZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWlhLkNoYXRzLndhc0hlbHBmdWxDaGF0KGNoYXRNZXNzYWdlSWQsIGZlZWRiYWNrUHJvcCA9PT0gRmVlZGJhY2suVEhVTUJTX1VQKVxuICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgbWVzc2FnZXNSZWYuY3VycmVudCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQubWFwKG1lc3NhZ2UgPT4ge1xuICAgICAgICBpZiAobWVzc2FnZS5pZCA9PT0gY2hhdE1lc3NhZ2VJZCAmJiBtZXNzYWdlLnJvbGUgPT09ICdhc3Npc3RhbnQnKSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4ubWVzc2FnZSwgd2FzSGVscGZ1bDogZmVlZGJhY2tQcm9wID09PSBGZWVkYmFjay5USFVNQlNfVVAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlXG4gICAgICB9KVxuICAgIH1cbiAgfSwgW10pXG5cbiAgY29uc3QgaGFuZGxlQXBwcm92YWxEZWNpc2lvbiA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChcbiAgICAgIHRocmVhZElkczogc3RyaW5nW10sXG4gICAgICBkZWNpc2lvbjogJ2FwcHJvdmUnIHwgJ3JlamVjdCcsXG4gICAgICBlZGl0ZWRBY3Rpb25zPzogQXJyYXk8eyB0b29sX25hbWU6IHN0cmluZzsgYXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT5cbiAgICApID0+IHtcbiAgICAgIGlmICghdGhyZWFkSWRzPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gdGhyZWFkX2lkcyBwcm92aWRlZCBmb3IgYXBwcm92YWwgZGVjaXNpb24nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gQnVzY2FyIGVsIG1lbnNhamUgcXVlIGNvbnRpZW5lIGFsZ3VubyBkZSBlc3RvcyB0aHJlYWRJZHMgZW4gc3VzIHBlbmRpbmdfYWN0aW9uc1xuICAgICAgY29uc3QgbWVzc2FnZVdpdGhBcHByb3ZhbCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQuZmluZChtID0+XG4gICAgICAgIG0uYXBwcm92YWw/LnBlbmRpbmdfYWN0aW9ucz8uc29tZShhY3Rpb24gPT4gdGhyZWFkSWRzLmluY2x1ZGVzKGFjdGlvbi50aHJlYWRfaWQpKVxuICAgICAgKVxuXG4gICAgICBpZiAoIW1lc3NhZ2VXaXRoQXBwcm92YWwgfHwgIW1lc3NhZ2VXaXRoQXBwcm92YWwuYXBwcm92YWwpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gc2UgZW5jb250csOzIG1lbnNhamUgY29uIGFwcHJvdmFsIHBhcmEgdGhyZWFkX2lkczonLCB0aHJlYWRJZHMpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGFwcHJvdmFsIH0gPSBtZXNzYWdlV2l0aEFwcHJvdmFsXG4gICAgICBjb25zdCBtZXNzYWdlSWQgPSBtZXNzYWdlV2l0aEFwcHJvdmFsLmlkXG4gICAgICBjb25zdCBsb2FkaW5nS2V5ID0gdGhyZWFkSWRzWzBdXG4gICAgICBjb25zdCBob3Vyc1Rvb2xzSW5EZWNpc2lvbiA9IChhcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnMgfHwgW10pXG4gICAgICAgIC5tYXAoYWN0aW9uID0+IGFjdGlvbi50b29sX25hbWUpXG4gICAgICAgIC5maWx0ZXIodG9vbE5hbWUgPT4gaXNIb3Vyc0NoYXJnZVRvb2wodG9vbE5hbWUpKVxuXG4gICAgICBpZiAoaG91cnNUb29sc0luRGVjaXNpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmluZm8oJ1tNQUlBXVtob3Vycy1zeW5jXSBISVRMIGRlY2lzaW9uIGZvciBob3VycyB0b29scycsIHtcbiAgICAgICAgICBkZWNpc2lvbixcbiAgICAgICAgICB0b29sczogaG91cnNUb29sc0luRGVjaXNpb24sXG4gICAgICAgICAgdGhyZWFkSWRzLFxuICAgICAgICAgIHNlc3Npb25JZDogYXBwcm92YWwuc2Vzc2lvbl9pZCxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGl0bENvbnRleHQ6IEhpdGxFeGVjdXRpb25Db250ZXh0ID0ge1xuICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgIG1lc3NhZ2VUZXh0OiBtZXNzYWdlV2l0aEFwcHJvdmFsLm1lc3NhZ2UsXG4gICAgICAgIGFwcHJvdmFsLFxuICAgICAgICBwZW5kaW5nQWN0aW9uczogYXBwcm92YWwucGVuZGluZ19hY3Rpb25zLFxuICAgICAgICB0aHJlYWRJZHMsXG4gICAgICB9XG4gICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZi5jdXJyZW50ID0gaGl0bENvbnRleHRcblxuICAgICAgY29uc3QgaW5pdGlhbEFjdGl2aXR5ID0gcmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHkodCwgaGl0bENvbnRleHQpXG5cbiAgICAgIC8vIFVwZGF0ZSBtZXNzYWdlIHN0YXR1cyBpbW1lZGlhdGVseVxuICAgICAgbWVzc2FnZXNSZWYuY3VycmVudCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQubWFwKG1lc3NhZ2UgPT4ge1xuICAgICAgICBpZiAobWVzc2FnZS5pZCA9PT0gbWVzc2FnZUlkKSB7XG4gICAgICAgICAgY29uc3QgbmV3U3RhdHVzID0gZGVjaXNpb24gPT09ICdhcHByb3ZlJyA/ICdhcHByb3ZlZCcgOiAncmVqZWN0ZWQnXG4gICAgICAgICAgcmV0dXJuIHsgLi4ubWVzc2FnZSwgYXBwcm92YWxTdGF0dXM6IG5ld1N0YXR1cyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VcbiAgICAgIH0pXG5cbiAgICAgIC8vIFRyaWdnZXIgcmUtcmVuZGVyXG4gICAgICBjb25zdCBleGlzdGluZ01lc3NhZ2UgPSBtZXNzYWdlc1JlZi5jdXJyZW50LmZpbmQobSA9PiBtLmlkID09PSBtZXNzYWdlSWQpXG4gICAgICBpZiAoZXhpc3RpbmdNZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IG5ld1N0YXR1cyA9IGRlY2lzaW9uID09PSAnYXBwcm92ZScgPyAnYXBwcm92ZWQnIDogJ3JlamVjdGVkJ1xuICAgICAgICBhZGRNZXNzYWdlKHsgLi4uZXhpc3RpbmdNZXNzYWdlLCBhcHByb3ZhbFN0YXR1czogbmV3U3RhdHVzIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIENhbGwgY29udGludWUtdGhyZWFkIGVuZHBvaW50IHdpdGggQUxMIHRocmVhZF9pZHMgaW4gYSBzaW5nbGUgcmVxdWVzdFxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICBzZXRJc0NvbnRpbnVpbmdTdHJlYW0odHJ1ZSlcbiAgICAgIGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCA9IHV1aWR2NCgpXG5cbiAgICAgIC8vIEFkZCBsb2FkaW5nXG4gICAgICBzZXRBY3RpdmVMb2FkaW5ncyhwcmV2ID0+ICh7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIFtsb2FkaW5nS2V5XTogaW5pdGlhbEFjdGl2aXR5Lm1lc3NhZ2UsXG4gICAgICB9KSlcbiAgICAgIHVwZGF0ZVN0cmVhbUFjdGl2aXR5KGluaXRpYWxBY3Rpdml0eSlcblxuICAgICAgLy8gTWFyY2Egc2kgZWwgc3RyZWFtIGNlcnLDsyB2w61hIHVuIGV2ZW50byB0ZXJtaW5hbCAoY29tcGxldGUvYXBwcm92YWwvZXJyb3IpLlxuICAgICAgLy8gU2kgZWwgYmFja2VuZCBjaWVycmEgbGEgY29uZXhpw7NuIHNpbiBlbWl0aXJsbywgbGltcGlhbW9zIGVsIGluZGljYWRvciBlbiBlbFxuICAgICAgLy8gYGZpbmFsbHlgIHBhcmEgcXVlIG5vIHF1ZWRlIHRyYWJhZG8gZW4gXCJFc2NyaWJpZW5kbyBsYSByZXNwdWVzdGFcIi5cbiAgICAgIGxldCBzdHJlYW1TZXR0bGVkID0gZmFsc2VcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWlhLk9yY2hlc3RyYXRvci5jb250aW51ZVRocmVhZCh7XG4gICAgICAgICAgdGhyZWFkSWRzLCAvLyBTZW5kIGFsbCBhY3Rpb24gdGhyZWFkX2lkcyBhdCBvbmNlXG4gICAgICAgICAgc2Vzc2lvbklkOiBhcHByb3ZhbC5zZXNzaW9uX2lkLFxuICAgICAgICAgIGRlY2lzaW9uOiBlZGl0ZWRBY3Rpb25zID8gJ2VkaXQnIDogZGVjaXNpb24sXG4gICAgICAgICAgZWRpdGVkQWN0aW9ucyxcbiAgICAgICAgICBhZ2VudElkOiBhZ2VudD8uaWQgfHwgJycsXG4gICAgICAgICAgbGFuZzogYXV0aFVzZXIubGFuZyxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgc2V0SXNDb250aW51aW5nU3RyZWFtKGZhbHNlKVxuICAgICAgICAgIGhhbmRsZVN0cmVhbUVycm9yKClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByb2Nlc3MgU1NFIHN0cmVhbVxuICAgICAgICBhd2FpdCBwcm9jZXNzU1NFU3RyZWFtKHJlc3BvbnNlLCBsb2FkaW5nS2V5LCB7XG4gICAgICAgICAgb25UaGlua2luZzogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWN0aXZpdHk6IFN0cmVhbUFjdGl2aXR5ID0ge1xuICAgICAgICAgICAgICBwaGFzZTogJ3RoaW5raW5nJyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogZ2V0VGhpbmtpbmdMb2FkaW5nTWVzc2FnZSgwLCB0KSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwZGF0ZVN0cmVhbUFjdGl2aXR5KGFjdGl2aXR5KVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Ub2tlbjogKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgdXBkYXRlU3RyZWFtQWN0aXZpdHkoZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5KHQpKVxuICAgICAgICAgICAgaGFuZGxlU3RyZWFtVXBkYXRlKGNvbnRlbnQsIG51bGwsICcnKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Ob2RlOiAobWVzc2FnZTogc3RyaW5nLCBjdXJyZW50VGhyZWFkSWQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9kZUFjdGl2aXR5ID0gcmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHkoXG4gICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgIHQsXG4gICAgICAgICAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQsXG4gICAgICAgICAgICAgIGN1cnJlbnRUaHJlYWRJZCxcbiAgICAgICAgICAgICAgeyB1c2VSZXN1bWluZ0ZhbGxiYWNrOiB0cnVlIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHVwZGF0ZVN0cmVhbUFjdGl2aXR5KG5vZGVBY3Rpdml0eSlcbiAgICAgICAgICAgIHNldEFjdGl2ZUxvYWRpbmdzKHByZXYgPT4gKHtcbiAgICAgICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICAgICAgW2N1cnJlbnRUaHJlYWRJZF06IG5vZGVBY3Rpdml0eS5tZXNzYWdlLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAoXG4gICAgICAgICAgICBmaW5hbENvbnRlbnQ6IHN0cmluZyxcbiAgICAgICAgICAgIHNvdXJjZXM6IGFueSxcbiAgICAgICAgICAgIG1lbW9yeVNlc3Npb25JZDogc3RyaW5nLFxuICAgICAgICAgICAgY3VycmVudFRocmVhZElkOiBzdHJpbmcsXG4gICAgICAgICAgICBhdHRhY2htZW50cz86IGFueVtdIHwgbnVsbCxcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zPzogc3RyaW5nW10gfCBudWxsLFxuICAgICAgICAgICAgYWdlbnRJZD86IHN0cmluZyB8IG51bGxcbiAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgIHN0cmVhbVNldHRsZWQgPSB0cnVlXG4gICAgICAgICAgICBzZXRJc0NvbnRpbnVpbmdTdHJlYW0oZmFsc2UpXG4gICAgICAgICAgICBoYW5kbGVTdHJlYW1GaW5pc2goZmluYWxDb250ZW50LCBzb3VyY2VzLCBtZW1vcnlTZXNzaW9uSWQsIGF0dGFjaG1lbnRzLCBzdWdnZXN0aW9ucywgYWdlbnRJZClcbiAgICAgICAgICAgIHVwZGF0ZVN0cmVhbUFjdGl2aXR5KG51bGwpXG4gICAgICAgICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICAgICAgc2V0QWN0aXZlTG9hZGluZ3MocHJldiA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld0xvYWRpbmdzID0geyAuLi5wcmV2IH1cbiAgICAgICAgICAgICAgZGVsZXRlIG5ld0xvYWRpbmdzW2N1cnJlbnRUaHJlYWRJZF1cbiAgICAgICAgICAgICAgcmV0dXJuIG5ld0xvYWRpbmdzXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25BcHByb3ZhbFJlcXVpcmVkOiAoYXBwcm92YWxQYXlsb2FkOiBhbnksIGFjY3VtdWxhdGVkQ29udGVudDogc3RyaW5nLCBjdXJyZW50VGhyZWFkSWQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgLy8gTmV3IEhJVEwgaW50ZXJydXB0aW9uIGRldGVjdGVkIGFmdGVyIHJlc3VtZSAoY2hhaW5lZCBhY3Rpb25zKVxuICAgICAgICAgICAgc3RyZWFtU2V0dGxlZCA9IHRydWVcbiAgICAgICAgICAgIHNldElzQ29udGludWluZ1N0cmVhbShmYWxzZSlcbiAgICAgICAgICAgIHVwZGF0ZVN0cmVhbUFjdGl2aXR5KG51bGwpXG4gICAgICAgICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICAgICAgc2V0QWN0aXZlTG9hZGluZ3MocHJldiA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld0xvYWRpbmdzID0geyAuLi5wcmV2IH1cbiAgICAgICAgICAgICAgZGVsZXRlIG5ld0xvYWRpbmdzW2N1cnJlbnRUaHJlYWRJZF1cbiAgICAgICAgICAgICAgcmV0dXJuIG5ld0xvYWRpbmdzXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgaGFuZGxlQXBwcm92YWxSZXF1aXJlZChhcHByb3ZhbFBheWxvYWQgYXMgQXBwcm92YWxSZXF1ZXN0LCBhY2N1bXVsYXRlZENvbnRlbnQpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICBzdHJlYW1TZXR0bGVkID0gdHJ1ZVxuICAgICAgICAgICAgc2V0SXNDb250aW51aW5nU3RyZWFtKGZhbHNlKVxuICAgICAgICAgICAgaGFuZGxlU3RyZWFtRXJyb3IoKVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBzdHJlYW1TZXR0bGVkID0gdHJ1ZVxuICAgICAgICBzZXRJc0NvbnRpbnVpbmdTdHJlYW0oZmFsc2UpXG4gICAgICAgIGhhbmRsZVN0cmVhbUVycm9yKClcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzQ29udGludWluZ1N0cmVhbShmYWxzZSlcbiAgICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICAvLyBSZWQgZGUgc2VndXJpZGFkOiBzaSBlbCBzdHJlYW0gY2VycsOzIHNpbiBldmVudG8gdGVybWluYWwsIGVsIGluZGljYWRvclxuICAgICAgICAvLyAocC4gZWouIFwiRXNjcmliaWVuZG8gbGEgcmVzcHVlc3RhXCIpIHF1ZWRhcsOtYSB0cmFiYWRvLiBMbyBsaW1waWFtb3MgYXF1w60uXG4gICAgICAgIGlmICghc3RyZWFtU2V0dGxlZCkge1xuICAgICAgICAgIHVwZGF0ZVN0cmVhbUFjdGl2aXR5KG51bGwpXG4gICAgICAgICAgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgICBzZXRBY3RpdmVMb2FkaW5ncyhwcmV2ID0+IHtcbiAgICAgICAgICAgIGlmICghKGxvYWRpbmdLZXkgaW4gcHJldikpIHJldHVybiBwcmV2XG4gICAgICAgICAgICBjb25zdCBuZXdMb2FkaW5ncyA9IHsgLi4ucHJldiB9XG4gICAgICAgICAgICBkZWxldGUgbmV3TG9hZGluZ3NbbG9hZGluZ0tleV1cbiAgICAgICAgICAgIHJldHVybiBuZXdMb2FkaW5nc1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIGF1dGhVc2VyLFxuICAgICAgYWdlbnQsXG4gICAgICBhZGRNZXNzYWdlLFxuICAgICAgaGFuZGxlU3RyZWFtRXJyb3IsXG4gICAgICBoYW5kbGVTdHJlYW1VcGRhdGUsXG4gICAgICBoYW5kbGVTdHJlYW1GaW5pc2gsXG4gICAgICBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkLFxuICAgICAgdXBkYXRlU3RyZWFtQWN0aXZpdHksXG4gICAgICB0LFxuICAgIF1cbiAgKVxuXG4gIGNvbnN0IGluaXRpYWxpemVDaGF0ID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGlmICghZmlyc3RUaW1lUmVmLmN1cnJlbnQpIHtcbiAgICAgIGZpcnN0VGltZVJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAoaW5pdGlhbENoYXRJZCkge1xuICAgICAgYXdhaXQgbG9hZE1lc3NhZ2VzKClcbiAgICB9IGVsc2UgaWYgKHVzZXJJbml0aWFsTWVzc2FnZSkge1xuICAgICAgY29uc3QgaGFzSW5pdGlhbE1lc3NhZ2UgPSBCb29sZWFuKHVzZXJJbml0aWFsTWVzc2FnZS5tZXNzYWdlPy50cmltKCkpXG4gICAgICBjb25zdCBoYXNJbml0aWFsQXR0YWNobWVudHMgPSBCb29sZWFuKHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cz8ubGVuZ3RoKVxuICAgICAgY29uc3QgaGFzSW5pdGlhbEZhcSA9IEJvb2xlYW4odXNlckluaXRpYWxNZXNzYWdlLmZhcUlkKVxuICAgICAgY29uc3QgaGFzSW5pdGlhbEZ1YSA9IEJvb2xlYW4odXNlckluaXRpYWxNZXNzYWdlLmZ1YUlkKVxuICAgICAgY29uc3QgaGFzSW5pdGlhbFNjID0gQm9vbGVhbih1c2VySW5pdGlhbE1lc3NhZ2Uuc2NJZClcblxuICAgICAgaWYgKCFoYXNJbml0aWFsTWVzc2FnZSAmJiAhaGFzSW5pdGlhbEF0dGFjaG1lbnRzICYmICFoYXNJbml0aWFsRmFxICYmICFoYXNJbml0aWFsRnVhICYmICFoYXNJbml0aWFsU2MpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhpc3RvcnkgPSBtZXNzYWdlc1JlZi5jdXJyZW50Lm1hcChoaXN0b3J5TWVzc2FnZSA9PiAoe1xuICAgICAgICBjb250ZW50OiBoaXN0b3J5TWVzc2FnZS5tZXNzYWdlLFxuICAgICAgICByb2xlOiBoaXN0b3J5TWVzc2FnZS51c2VyLmlkID09PSBhdXRoVXNlci5pZC50b1N0cmluZygpID8gQ2hhdEhpc3RvcnlSb2xlLlVTRVIgOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgfSkpXG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY2hpcHNQcm9qZWN0OiBjdHhDaGlwc1Byb2plY3QsXG4gICAgICAgIHByb2plY3Q6IGN0eFByb2plY3QsXG4gICAgICAgIGNsaWVudDogY3R4Q2xpZW50LFxuICAgICAgICB0YXNrOiBjdHhUYXNrLFxuICAgICAgfSA9IGNvbnRleHRSZWYuY3VycmVudFxuICAgICAgY29uc3QgcHJvamVjdFRvUmVxdWVzdCA9IHJlc29sdmVQcm9qZWN0VG9SZXF1ZXN0KGN0eENoaXBzUHJvamVjdCwgbnVsbCkgPz8gY3R4UHJvamVjdD8uaWQgPz8gbnVsbFxuXG4gICAgICBjb25zb2xlLmluZm8oJ1t1c2VDaGF0TWFuYWdlcl0gUEFUSD1pbml0aWFsaXplQ2hhdC91c2VySW5pdGlhbE1lc3NhZ2Ug4oCUIGNvbnRleHRSZWYgcmVzb2x1dGlvbjonLCB7XG4gICAgICAgIHByb2plY3RQcm9wSWQ6IGN0eFByb2plY3Q/LmlkID8/IG51bGwsXG4gICAgICAgIGNsaWVudElkOiBjdHhDbGllbnQ/LmlkID8/IG51bGwsXG4gICAgICAgIHRhc2tJZDogY3R4VGFzaz8uaWQgPz8gbnVsbCxcbiAgICAgICAgY2hpcHNQcm9qZWN0SWQ6IGN0eENoaXBzUHJvamVjdD8ucHJvamVjdElkID8/IG51bGwsXG4gICAgICAgIHByb2plY3RUb1JlcXVlc3QsXG4gICAgICAgIGFnZW50VHlwZTogYWdlbnQ/LnR5cGUsXG4gICAgICB9KVxuXG4gICAgICBhc2tNYWlhKHtcbiAgICAgICAgbWVzc2FnZTogdXNlckluaXRpYWxNZXNzYWdlLm1lc3NhZ2UsXG4gICAgICAgIGhpc3RvcnksXG4gICAgICAgIHByb2plY3RJZDogcHJvamVjdFRvUmVxdWVzdCxcbiAgICAgICAgbGFuZzogYXV0aFVzZXIubGFuZyxcbiAgICAgICAgdXNlcklkOiBhdXRoVXNlci5pZC50b1N0cmluZygpLFxuICAgICAgICBmaXJzdE5hbWU6IGF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgICAgICAgbGFzdE5hbWU6IGF1dGhVc2VyLmxhc3ROYW1lLFxuICAgICAgICBjb21wYW55SWQ6IGF1dGhVc2VyLmNvbXBhbnlfaWQudG9TdHJpbmcoKSxcbiAgICAgICAgY2hhdElkOiBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgICAgIG1lc3NhZ2VJZDogY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50LFxuICAgICAgICBhZ2VudE5hbWU6IGFnZW50Py5uYW1lISxcbiAgICAgICAgYWdlbnRJZDogYWdlbnQ/LmlkISxcbiAgICAgICAgaXNXZWJTZWFyY2hBY3RpdmU6IGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgIGlzRGVlcFNlYXJjaEFjdGl2ZTogaXNEZWVwU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgIC4uLihjdHhQcm9qZWN0Py5mZWVJZCAhPSBudWxsID8geyBmZWVJZDogTnVtYmVyKGN0eFByb2plY3QuZmVlSWQpIH0gOiB7fSksXG4gICAgICAgIC4uLnJlc29sdmVDbGllbnRQYXlsb2FkKGN0eENsaWVudCwgY3R4UHJvamVjdCksXG4gICAgICAgIC4uLihjdHhQcm9qZWN0Py5uYW1lID8geyBwcm9qZWN0TmFtZTogY3R4UHJvamVjdC5uYW1lIH0gOiB7fSksXG4gICAgICAgIC4uLihjdHhUYXNrPy5pZCAhPSBudWxsXG4gICAgICAgICAgPyB7IHRhc2tJZDogTnVtYmVyKGN0eFRhc2suaWQpLCAuLi4oY3R4VGFzay5uYW1lID8geyB0YXNrTmFtZTogY3R4VGFzay5uYW1lIH0gOiB7fSkgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLmF0dGFjaG1lbnRzID8geyBhdHRhY2htZW50czogdXNlckluaXRpYWxNZXNzYWdlLmF0dGFjaG1lbnRzIH0gOiB7fSksXG4gICAgICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2UuZmFxSWQgPyB7IGZhcUlkOiB1c2VySW5pdGlhbE1lc3NhZ2UuZmFxSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHVzZXJJbml0aWFsTWVzc2FnZS5hZ2VudFN1Z2dlc3Rpb25JZCA/IHsgYWdlbnRTdWdnZXN0aW9uSWQ6IHVzZXJJbml0aWFsTWVzc2FnZS5hZ2VudFN1Z2dlc3Rpb25JZCB9IDoge30pLFxuICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLmZ1YUlkID8geyBmdWFJZDogdXNlckluaXRpYWxNZXNzYWdlLmZ1YUlkIH0gOiB7fSksXG4gICAgICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2Uuc2NJZCA/IHsgc2NJZDogdXNlckluaXRpYWxNZXNzYWdlLnNjSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50Py5lbnRpdHkgIT0gbnVsbCA/IHsgYWdlbnRFbnRpdHk6IGFnZW50LmVudGl0eSB9IDoge30pLFxuICAgICAgICAuLi4oYWdlbnQ/LnR5cGUgIT0gbnVsbCA/IHsgYWdlbnRUeXBlOiBhZ2VudC50eXBlIH0gOiB7fSksXG4gICAgICAgIC4uLihidWlsZENvbnRleHRNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZS5tZW50aW9ucylcbiAgICAgICAgICA/IHsgY29udGV4dE1lc3NhZ2U6IGJ1aWxkQ29udGV4dE1lc3NhZ2UodXNlckluaXRpYWxNZXNzYWdlLm1lbnRpb25zKSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2UuY29udGV4dERhdGEgPyB7IGNvbnRleHREYXRhOiB1c2VySW5pdGlhbE1lc3NhZ2UuY29udGV4dERhdGEgfSA6IHt9KSxcbiAgICAgIH0pXG4gICAgfVxuICB9LCBbXG4gICAgaW5pdGlhbENoYXRJZCxcbiAgICB1c2VySW5pdGlhbE1lc3NhZ2UsXG4gICAgcHJvamVjdCxcbiAgICBjbGllbnQsXG4gICAgdGFzayxcbiAgICBhdXRoVXNlcixcbiAgICBhZ2VudCxcbiAgICBhc2tNYWlhLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZSxcbiAgXSlcblxuICBjb25zdCByZXNldENoYXQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgYWJvcnRTdHJlYW1TaWxlbnRseVJlZi5jdXJyZW50KClcbiAgICBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQgPSB1dWlkdjQoKVxuICAgIGN1cnJlbnRVc2VyUXVlc3Rpb24uY3VycmVudCA9IG51bGxcbiAgICBjdXJyZW50Q2hhdElkLmN1cnJlbnQgPSB1dWlkdjQoKVxuICAgIHJlcG9ydGVkRXZlbnQuY3VycmVudCA9IGZhbHNlXG4gICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIHN0cmVhbWluZ1N0b3JlLmNsZWFyKClcbiAgICBzZXRJc0NvbnRpbnVpbmdTdHJlYW0oZmFsc2UpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHN0b3BHZW5lcmF0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHN0b3BTdHJlYW1pbmcoKVxuICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICBzZXRJc0NvbnRpbnVpbmdTdHJlYW0oZmFsc2UpXG4gIH0sIFtzdG9wU3RyZWFtaW5nXSlcblxuICByZXR1cm4ge1xuICAgIG1lc3NhZ2VzLFxuICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICBpc0xvYWRpbmdNb3JlTWVzc2FnZXMsXG4gICAgd2FpdGluZ1Jlc3BvbnNlOiB3YWl0aW5nUmVzcG9uc2UgfHwgaXNDb250aW51aW5nU3RyZWFtLFxuICAgIGlzV3JpdGluZyxcbiAgICBsb2FkaW5nTWVzc2FnZSxcbiAgICBzdHJlYW1BY3Rpdml0eSxcbiAgICBhY3RpdmVMb2FkaW5ncyxcbiAgICBjdXJyZW50UHJvamVjdCxcbiAgICBjdXJyZW50Q2hhdElkOiBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgY3VycmVudE1lc3NhZ2VJZDogY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50LFxuXG4gICAgc2VuZE1lc3NhZ2UsXG4gICAgY2hhbmdlUHJvamVjdCxcbiAgICBoYW5kbGVGZWVkYmFjayxcbiAgICBoYW5kbGVBcHByb3ZhbERlY2lzaW9uLFxuICAgIGhhbmRsZVNjcm9sbCxcbiAgICBpbml0aWFsaXplQ2hhdCxcbiAgICByZXNldENoYXQsXG4gICAgc3RvcEdlbmVyYXRpb24sXG5cbiAgICBpc0Rpc2FibGVkOiB3YWl0aW5nUmVzcG9uc2UgfHwgaXNDb250aW51aW5nU3RyZWFtIHx8IGxvYWRpbmdNZXNzYWdlcyxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsV0FBVyxFQUFFQyxNQUFNLEVBQUVDLFNBQVMsRUFBRUMsUUFBUSxRQUFRLE9BQU87QUFDaEUsU0FBU0MsRUFBRSxJQUFJQyxNQUFNLFFBQVEsTUFBTTtBQUNuQyxTQUFTQyxlQUFlLFFBQVEsb0JBQW9CO0FBQ3BELFNBQVNDLHFCQUFxQixRQUFRLDBCQUEwQjtBQUNoRSxTQUFTQyxJQUFJLFFBQVEsU0FBUztBQUc5QixTQUFTQyxPQUFPLFFBQWlCLHdCQUF3QjtBQUN6RCxTQUFTQyxnQkFBZ0IsUUFBUSw4QkFBOEI7QUFDL0QsU0FBU0MsTUFBTSxFQUFFQyxRQUFRLFFBQVEsYUFBYTtBQUM5QyxPQUFPQyxJ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
|