@projectcor/maia-components 2.11.103-5 → 2.11.103-7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/App.js +19 -44
- package/lib/components/atoms/MAIAInput/MAIAInput.js +6 -1
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.js +20 -0
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.styles.js +20 -0
- package/lib/components/atoms/SessionGeneratingDot/index.js +2 -0
- package/lib/components/atoms/icons/MaiaSparkleIcon.js +75 -0
- package/lib/components/atoms/icons/index.js +2 -1
- package/lib/components/index.js +1 -2
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +4 -91
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +46 -7
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +311 -69
- package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +28 -18
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +9 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +69 -61
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +5 -1
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.js +66 -0
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.styles.js +55 -0
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/index.js +2 -0
- package/lib/components/molecules/ChatFooter/ChatFooter.js +4 -2
- package/lib/components/molecules/Sidebar/Sidebar.js +104 -61
- package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +16 -1
- package/lib/components/molecules/Sidebar/Sidebar.styles.js +30 -29
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +6 -35
- package/lib/components/organisms/ChatAI/ChatAI.js +131 -40
- package/lib/context/global-context.js +3 -1
- package/lib/hooks/useAgentModel/useCreateAgent.js +14 -61
- package/lib/hooks/useAgentModel/useUpdateAgent.js +11 -58
- package/lib/hooks/useChatManager/useChatManager.js +530 -438
- package/lib/hooks/useChatMessages/useChatMessages.js +427 -236
- package/lib/hooks/useChats/useChats.js +21 -4
- package/lib/hooks/useEvent.js +1 -2
- package/lib/hooks/useMinimizedPillBottomOffset.js +110 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +1 -1
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +139 -521
- package/lib/hooks/useStreamingMessage/index.js +2 -3
- package/lib/hooks/useStreamingMessage/useStreamingMessage.js +13 -17
- package/lib/index.js +2 -5
- package/lib/lang/br/index.js +11 -9
- package/lib/lang/en/index.js +11 -9
- package/lib/lang/es/index.js +11 -9
- package/lib/lang/fr/index.js +13 -10
- package/lib/services/maia/Chats/getChatsByUserId.js +6 -4
- package/lib/services/maia/Chats/index.js +3 -1
- package/lib/services/maia/Chats/markSessionAsRead.js +32 -0
- package/lib/store/chatsSidebarOptimistic.js +92 -0
- package/lib/store/chatsStore.types.js +1 -1
- package/lib/store/maiaMinimizedPersistence.js +49 -0
- package/lib/store/sessions/activeView.js +22 -0
- package/lib/store/sessions/index.js +9 -0
- package/lib/store/sessions/sessionHitlContext.js +15 -0
- package/lib/store/sessions/sessionNotificationSound.js +57 -0
- package/lib/store/sessions/sessionNotifications.js +110 -0
- package/lib/store/sessions/sessionNotifications.types.js +2 -0
- package/lib/store/sessions/sessionStreamManager.js +576 -0
- package/lib/store/sessions/sessionStreamingText.js +80 -0
- package/lib/store/sessions/sessions.types.js +35 -0
- package/lib/store/sessions/useSessionMeta.js +39 -0
- package/lib/store/sessions/useSessionStreamingText.js +18 -0
- package/lib/store/sessions/useSessionsStore.js +197 -0
- package/lib/store/useChatsStore.js +149 -12
- package/lib/types/Chat.js +1 -1
- package/lib/types/agentModal.js +1 -1
- package/lib/utils/formatUnreadCount.js +6 -0
- package/lib/utils/maiaHostOpen.js +54 -0
- package/lib/utils/normalizeAgentConnectors.js +3 -28
- package/package.json +3 -3
- package/lib/components/organisms/ChatAIPage/ChatAIPage.js +0 -543
- package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +0 -16
- package/lib/components/organisms/ChatAIPage/index.js +0 -3
- package/lib/dev/DevMaiaPage.js +0 -30
- package/lib/hooks/useStreamingMessage/streamingStore.js +0 -69
- package/lib/services/maia/Agents/connectors.js +0 -250
|
@@ -29,9 +29,15 @@ import { TASK_URL_REGEX_PATTERN } from '../../constants/taskUrls';
|
|
|
29
29
|
import { dispatchMaiaHoursCharged, isHoursChargeTool } from '../../constants/plannerSyncEvents';
|
|
30
30
|
import { fetchAgentDetail } from '../../services/maia/Agents/fetchAgentDetail';
|
|
31
31
|
import { buildHitlActionTypeList, getHitlAnalyticsAgentType } from '../../utils/hitlAnalytics';
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
32
|
+
import { sessionStreamingText } from '../../store/sessions/sessionStreamingText';
|
|
33
|
+
import { useSessionsStore } from '../../store/sessions/useSessionsStore';
|
|
34
|
+
import { useSessionMeta } from '../../store/sessions/useSessionMeta';
|
|
35
|
+
import { sessionStreamManager, MAX_CONCURRENT_STREAMS } from '../../store/sessions/sessionStreamManager';
|
|
36
|
+
import { activeView } from '../../store/sessions/activeView';
|
|
37
|
+
import { notifySessionFinishedInBackground } from '../../store/sessions/sessionNotifications';
|
|
38
|
+
import { buildSidebarSessionTitle, ensureSessionInSidebar } from '../../store/chatsSidebarOptimistic';
|
|
39
|
+
import { isStreamingPlaceholderMessageId } from '../../utils/streamActivityMessages';
|
|
40
|
+
import { getChatsStoreState, useChatsStore } from '../../store/useChatsStore';
|
|
35
41
|
var normalizeSendMessageArgs = function normalizeSendMessageArgs(attachmentsOrOptions) {
|
|
36
42
|
var _options$attachments;
|
|
37
43
|
if (Array.isArray(attachmentsOrOptions)) {
|
|
@@ -229,142 +235,56 @@ var useStableCallbacks = function useStableCallbacks(authUser) {
|
|
|
229
235
|
currentUser: currentUser.current
|
|
230
236
|
};
|
|
231
237
|
};
|
|
232
|
-
var
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
var dataStr = dataLine.replace('data: ', '').trim();
|
|
241
|
-
try {
|
|
242
|
-
var data = JSON.parse(dataStr);
|
|
238
|
+
var findMessageWithApprovalByThreadIds = function findMessageWithApprovalByThreadIds(threadIds, activeMessages) {
|
|
239
|
+
var fromActiveView = activeMessages.find(function (message) {
|
|
240
|
+
var _message$approval;
|
|
241
|
+
return (_message$approval = message.approval) === null || _message$approval === void 0 || (_message$approval = _message$approval.pending_actions) === null || _message$approval === void 0 ? void 0 : _message$approval.some(function (action) {
|
|
242
|
+
return threadIds.includes(action.thread_id);
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
if (fromActiveView !== null && fromActiveView !== void 0 && fromActiveView.approval) {
|
|
243
246
|
return {
|
|
244
|
-
|
|
245
|
-
|
|
247
|
+
message: fromActiveView,
|
|
248
|
+
sessionId: fromActiveView.approval.session_id || activeView.get() || ''
|
|
246
249
|
};
|
|
247
|
-
} catch (parseError) {
|
|
248
|
-
console.error('Error parsing SSE data:', parseError, dataStr);
|
|
249
|
-
return null;
|
|
250
250
|
}
|
|
251
|
+
var _useSessionsStore$get = useSessionsStore.getState(),
|
|
252
|
+
messages = _useSessionsStore$get.messages;
|
|
253
|
+
var sessionEntry = Object.entries(messages).find(function (_ref2) {
|
|
254
|
+
var _ref3 = _slicedToArray(_ref2, 2),
|
|
255
|
+
sessionMessages = _ref3[1];
|
|
256
|
+
return sessionMessages.some(function (message) {
|
|
257
|
+
var _message$approval2;
|
|
258
|
+
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) {
|
|
259
|
+
return threadIds.includes(action.thread_id);
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
if (sessionEntry) {
|
|
264
|
+
var _sessionEntry = _slicedToArray(sessionEntry, 2),
|
|
265
|
+
sessionId = _sessionEntry[0],
|
|
266
|
+
sessionMessages = _sessionEntry[1];
|
|
267
|
+
var found = sessionMessages.find(function (message) {
|
|
268
|
+
var _message$approval3;
|
|
269
|
+
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) {
|
|
270
|
+
return threadIds.includes(action.thread_id);
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
if (found !== null && found !== void 0 && found.approval) {
|
|
274
|
+
return {
|
|
275
|
+
message: found,
|
|
276
|
+
sessionId: found.approval.session_id || sessionId
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return null;
|
|
251
281
|
};
|
|
252
|
-
var
|
|
253
|
-
var
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
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 (streamSettled && eventType !== 'error') return;
|
|
266
|
-
if (eventType === 'thinking') {
|
|
267
|
-
callbacks.onThinking();
|
|
268
|
-
} else if (eventType === 'token') {
|
|
269
|
-
var content = typeof eventData.content === 'string' ? eventData.content : '';
|
|
270
|
-
accumulatedContent = mergeStreamChunk(accumulatedContent, content);
|
|
271
|
-
callbacks.onToken(accumulatedContent);
|
|
272
|
-
} else if (eventType === 'content') {
|
|
273
|
-
var _content = typeof eventData.content === 'string' ? eventData.content : '';
|
|
274
|
-
accumulatedContent = mergeStreamChunk(accumulatedContent, _content);
|
|
275
|
-
callbacks.onToken(accumulatedContent);
|
|
276
|
-
if (isCompleteLikeSsePayload(eventData)) {
|
|
277
|
-
notifyComplete(eventData, _content || accumulatedContent);
|
|
278
|
-
}
|
|
279
|
-
} else if (eventType === 'node') {
|
|
280
|
-
if (eventData.message && typeof eventData.message === 'string') {
|
|
281
|
-
callbacks.onNode(eventData.message, threadId);
|
|
282
|
-
}
|
|
283
|
-
} else if (eventType === 'complete') {
|
|
284
|
-
var finalContent = eventData.content || accumulatedContent;
|
|
285
|
-
notifyComplete(eventData, finalContent);
|
|
286
|
-
} else if (eventType === 'approval_required') {
|
|
287
|
-
var _callbacks$onApproval;
|
|
288
|
-
// Manual approval: el stream sigue (node/token/complete y más HITL).
|
|
289
|
-
// Solo el approval pausado (botón) cierra el procesamiento de eventos.
|
|
290
|
-
var isManualApproval = eventData.manual_approval_detected === true;
|
|
291
|
-
if (!isManualApproval) {
|
|
292
|
-
streamSettled = true;
|
|
293
|
-
}
|
|
294
|
-
(_callbacks$onApproval = callbacks.onApprovalRequired) === null || _callbacks$onApproval === void 0 || _callbacks$onApproval.call(callbacks, eventData, accumulatedContent, threadId);
|
|
295
|
-
} else if (eventType === 'error') {
|
|
296
|
-
streamSettled = true;
|
|
297
|
-
callbacks.onError(eventData.error, threadId);
|
|
298
|
-
}
|
|
299
|
-
};
|
|
300
|
-
reader = (_response$body = response.body) === null || _response$body === void 0 ? void 0 : _response$body.getReader();
|
|
301
|
-
if (reader) {
|
|
302
|
-
_context.next = 1;
|
|
303
|
-
break;
|
|
304
|
-
}
|
|
305
|
-
throw new Error('No reader available');
|
|
306
|
-
case 1:
|
|
307
|
-
decoder = new TextDecoder();
|
|
308
|
-
buffer = '';
|
|
309
|
-
accumulatedContent = '';
|
|
310
|
-
streamSettled = false;
|
|
311
|
-
notifyComplete = function notifyComplete(eventData, finalContent) {
|
|
312
|
-
var _eventData$agent_id;
|
|
313
|
-
if (streamSettled) return;
|
|
314
|
-
streamSettled = true;
|
|
315
|
-
var sources = eventData.sources || null;
|
|
316
|
-
var memorySessionId = eventData.memory_session_id || '';
|
|
317
|
-
var attachments = Array.isArray(eventData.attachments) ? eventData.attachments : null;
|
|
318
|
-
var suggestions = Array.isArray(eventData.suggest_reply) ? eventData.suggest_reply : Array.isArray(eventData.suggestions) ? eventData.suggestions : null;
|
|
319
|
-
var agentIdRaw = (_eventData$agent_id = eventData.agent_id) !== null && _eventData$agent_id !== void 0 ? _eventData$agent_id : eventData.agentId;
|
|
320
|
-
var completedAgentId = agentIdRaw != null && String(agentIdRaw).trim() !== '' ? String(agentIdRaw).trim() : null;
|
|
321
|
-
callbacks.onComplete(finalContent, sources, memorySessionId, threadId, attachments, suggestions, completedAgentId);
|
|
322
|
-
};
|
|
323
|
-
isReaderDone = false;
|
|
324
|
-
case 2:
|
|
325
|
-
if (isReaderDone) {
|
|
326
|
-
_context.next = 5;
|
|
327
|
-
break;
|
|
328
|
-
}
|
|
329
|
-
_context.next = 3;
|
|
330
|
-
return reader.read();
|
|
331
|
-
case 3:
|
|
332
|
-
_yield$reader$read = _context.sent;
|
|
333
|
-
done = _yield$reader$read.done;
|
|
334
|
-
value = _yield$reader$read.value;
|
|
335
|
-
if (!done) {
|
|
336
|
-
_context.next = 4;
|
|
337
|
-
break;
|
|
338
|
-
}
|
|
339
|
-
isReaderDone = true;
|
|
340
|
-
return _context.abrupt("continue", 5);
|
|
341
|
-
case 4:
|
|
342
|
-
buffer += decoder.decode(value, {
|
|
343
|
-
stream: true
|
|
344
|
-
});
|
|
345
|
-
lines = buffer.split('\n\n');
|
|
346
|
-
buffer = lines.pop() || '';
|
|
347
|
-
for (i = 0; i < lines.length; i += 1) {
|
|
348
|
-
handleLine(lines[i]);
|
|
349
|
-
}
|
|
350
|
-
_context.next = 2;
|
|
351
|
-
break;
|
|
352
|
-
case 5:
|
|
353
|
-
case "end":
|
|
354
|
-
return _context.stop();
|
|
355
|
-
}
|
|
356
|
-
}, _callee);
|
|
357
|
-
}));
|
|
358
|
-
return function processSSEStream(_x, _x2, _x3) {
|
|
359
|
-
return _ref2.apply(this, arguments);
|
|
360
|
-
};
|
|
361
|
-
}();
|
|
362
|
-
export var useChatManager = function useChatManager(_ref3) {
|
|
363
|
-
var initialChatId = _ref3.chatId,
|
|
364
|
-
userInitialMessage = _ref3.userInitialMessage,
|
|
365
|
-
onError = _ref3.onError,
|
|
366
|
-
_ref3$agents = _ref3.agents,
|
|
367
|
-
agents = _ref3$agents === void 0 ? [] : _ref3$agents;
|
|
282
|
+
export var useChatManager = function useChatManager(_ref4) {
|
|
283
|
+
var initialChatId = _ref4.chatId,
|
|
284
|
+
userInitialMessage = _ref4.userInitialMessage,
|
|
285
|
+
onError = _ref4.onError,
|
|
286
|
+
_ref4$agents = _ref4.agents,
|
|
287
|
+
agents = _ref4$agents === void 0 ? [] : _ref4$agents;
|
|
368
288
|
var _useT = useT(),
|
|
369
289
|
t = _useT.t;
|
|
370
290
|
var authUser = useUser();
|
|
@@ -390,6 +310,9 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
390
310
|
var currentMessageId = useRef(uuidv4());
|
|
391
311
|
var currentUserQuestion = useRef(null);
|
|
392
312
|
var currentChatId = useRef(initialChatId || uuidv4());
|
|
313
|
+
var setActiveChatId = useChatsStore(function (state) {
|
|
314
|
+
return state.setActiveChatId;
|
|
315
|
+
});
|
|
393
316
|
var reportedEvent = useRef(false);
|
|
394
317
|
var messagesRef = useRef([]);
|
|
395
318
|
/**
|
|
@@ -411,11 +334,6 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
411
334
|
* que puedan llegar antes de que el abort se complete.
|
|
412
335
|
*/
|
|
413
336
|
var activeStreamChatIdRef = useRef(null);
|
|
414
|
-
/** Setter indirecto para abortar el stream antes de que el hook de
|
|
415
|
-
* orquestador esté inicializado (se linkea más abajo). */
|
|
416
|
-
var abortStreamSilentlyRef = useRef(function () {
|
|
417
|
-
return undefined;
|
|
418
|
-
});
|
|
419
337
|
var clearStreamUiRef = useRef(function () {
|
|
420
338
|
return undefined;
|
|
421
339
|
});
|
|
@@ -423,10 +341,19 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
423
341
|
_useState2 = _slicedToArray(_useState, 2),
|
|
424
342
|
activeLoadings = _useState2[0],
|
|
425
343
|
setActiveLoadings = _useState2[1];
|
|
426
|
-
|
|
344
|
+
/**
|
|
345
|
+
* Sesión actualmente visible. Se mantiene en state (no solo en ref) para que
|
|
346
|
+
* el motor de streaming pueda leer reactivamente los flags de ESTA sesión
|
|
347
|
+
* desde el store, mientras otras siguen generando en background.
|
|
348
|
+
*/
|
|
349
|
+
var _useState3 = useState(currentChatId.current),
|
|
427
350
|
_useState4 = _slicedToArray(_useState3, 2),
|
|
428
|
-
|
|
429
|
-
|
|
351
|
+
activeSessionId = _useState4[0],
|
|
352
|
+
setActiveSessionId = _useState4[1];
|
|
353
|
+
/** True mientras esta instancia esté montada (evita setState tras desmontar). */
|
|
354
|
+
var isMountedRef = useRef(true);
|
|
355
|
+
/** Evita reconciliar dos veces el mismo estado terminal de una sesión. */
|
|
356
|
+
var lastHandledTerminalRef = useRef(null);
|
|
430
357
|
var isWebSearchActiveRef = useRef(isWebSearchActive);
|
|
431
358
|
var isDeepSearchActiveRef = useRef(isDeepSearchActive);
|
|
432
359
|
/** Evita closures obsoletas cuando el footer conserva sendMessage entre renders. */
|
|
@@ -461,6 +388,71 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
461
388
|
removeMessage = _useChatMessages.removeMessage,
|
|
462
389
|
handleScroll = _useChatMessages.handleScroll;
|
|
463
390
|
messagesRef.current = messages;
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Escribe un mensaje en el store por-sesión y, si la sesión es la activa,
|
|
394
|
+
* también en la vista local. Permite que sesiones en background acumulen su
|
|
395
|
+
* resultado sin pisar el chat que el usuario está mirando.
|
|
396
|
+
*/
|
|
397
|
+
var commitToSession = useCallback(function (sessionId, message) {
|
|
398
|
+
useSessionsStore.getState().addMessage(sessionId, message);
|
|
399
|
+
if (isMountedRef.current && activeView.is(sessionId)) {
|
|
400
|
+
addMessage(message);
|
|
401
|
+
}
|
|
402
|
+
}, [addMessage]);
|
|
403
|
+
var dropFromSession = useCallback(function (sessionId, messageId) {
|
|
404
|
+
useSessionsStore.getState().removeMessage(sessionId, messageId);
|
|
405
|
+
if (isMountedRef.current && activeView.is(sessionId)) {
|
|
406
|
+
removeMessage(messageId);
|
|
407
|
+
}
|
|
408
|
+
}, [removeMessage]);
|
|
409
|
+
|
|
410
|
+
/** Limpia el tail en vuelo de una sesión (tras terminar; el backend pasa a ser fuente). */
|
|
411
|
+
var clearSessionTail = useCallback(function (sessionId) {
|
|
412
|
+
useSessionsStore.getState().setMessages(sessionId, []);
|
|
413
|
+
}, []);
|
|
414
|
+
|
|
415
|
+
// Registrar la sesión visible en el tracker global para que los callbacks del
|
|
416
|
+
// motor (que pueden pertenecer a una instancia ya desmontada) sepan cuál es la
|
|
417
|
+
// sesión activa actual.
|
|
418
|
+
useEffect(function () {
|
|
419
|
+
activeView.set(activeSessionId);
|
|
420
|
+
}, [activeSessionId]);
|
|
421
|
+
useEffect(function () {
|
|
422
|
+
isMountedRef.current = true;
|
|
423
|
+
return function () {
|
|
424
|
+
isMountedRef.current = false;
|
|
425
|
+
if (activeView.is(currentChatId.current)) {
|
|
426
|
+
activeView.set(null);
|
|
427
|
+
}
|
|
428
|
+
};
|
|
429
|
+
}, []);
|
|
430
|
+
|
|
431
|
+
// Reconciliación: si la sesión activa termina (complete/error/cancelled) pero el
|
|
432
|
+
// store por-sesión todavía tiene un placeholder de streaming, refrescamos desde
|
|
433
|
+
// el backend. Usamos el store (no messagesRef): handleStreamFinish limpia el
|
|
434
|
+
// placeholder ahí de forma síncrona; messagesRef puede quedar stale un render
|
|
435
|
+
// porque setStatus (Zustand) y removeMessage (React) no batchan juntos.
|
|
436
|
+
var activeSessionMeta = useSessionMeta(activeSessionId);
|
|
437
|
+
useEffect(function () {
|
|
438
|
+
var _activeSessionMeta$fi;
|
|
439
|
+
var status = activeSessionMeta === null || activeSessionMeta === void 0 ? void 0 : activeSessionMeta.status;
|
|
440
|
+
if (!status) return;
|
|
441
|
+
var isTerminal = status === 'complete' || status === 'error' || status === 'cancelled';
|
|
442
|
+
if (!isTerminal) return;
|
|
443
|
+
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 : '');
|
|
444
|
+
if (lastHandledTerminalRef.current === key) return;
|
|
445
|
+
lastHandledTerminalRef.current = key;
|
|
446
|
+
var tail = useSessionsStore.getState().getMessages(activeSessionId);
|
|
447
|
+
var hasStalePlaceholder = tail.some(function (msg) {
|
|
448
|
+
return isStreamingPlaceholderMessageId(msg.id);
|
|
449
|
+
});
|
|
450
|
+
if (hasStalePlaceholder) {
|
|
451
|
+
loadMessages({
|
|
452
|
+
force: true
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
}, [activeSessionMeta === null || activeSessionMeta === void 0 ? void 0 : activeSessionMeta.status, activeSessionMeta === null || activeSessionMeta === void 0 ? void 0 : activeSessionMeta.finishedAt, activeSessionId, loadMessages]);
|
|
464
456
|
useEffect(function () {
|
|
465
457
|
var customEvent = new CustomEvent('chat-loading-messages-changed', {
|
|
466
458
|
detail: {
|
|
@@ -469,11 +461,32 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
469
461
|
});
|
|
470
462
|
document.dispatchEvent(customEvent);
|
|
471
463
|
}, [loadingMessages]);
|
|
464
|
+
var previousInitialChatIdRef = useRef(initialChatId);
|
|
472
465
|
useEffect(function () {
|
|
466
|
+
var previousInitialChatId = previousInitialChatIdRef.current;
|
|
467
|
+
previousInitialChatIdRef.current = initialChatId;
|
|
468
|
+
|
|
469
|
+
// Chat nuevo / home: initialChatId pasa a null, así que la rama de abajo no
|
|
470
|
+
// aplica. Hay que rotar a una sesión nueva igual: si seguimos apuntando a la
|
|
471
|
+
// anterior, `activeView` la sigue marcando como activa y cuando termina no se
|
|
472
|
+
// notifica (y su respuesta se commitea sobre la vista nueva). El árbol no
|
|
473
|
+
// remonta en este flujo (no hay `key`) y nadie consume `resetChat`.
|
|
474
|
+
if (!initialChatId && previousInitialChatId) {
|
|
475
|
+
currentChatId.current = uuidv4();
|
|
476
|
+
setActiveSessionId(currentChatId.current);
|
|
477
|
+
currentMessageId.current = uuidv4();
|
|
478
|
+
currentUserQuestion.current = null;
|
|
479
|
+
reportedEvent.current = false;
|
|
480
|
+
isProcessingRef.current = false;
|
|
481
|
+
streamingPlaceholderIdRef.current = null;
|
|
482
|
+
activeStreamChatIdRef.current = null;
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
473
485
|
if (initialChatId && initialChatId !== currentChatId.current) {
|
|
474
|
-
//
|
|
475
|
-
//
|
|
476
|
-
|
|
486
|
+
// NO abortamos el stream anterior: puede seguir generando en background.
|
|
487
|
+
// Solo cambiamos de sesión activa; el motor rutea cada stream por su
|
|
488
|
+
// sessionId, así que los tokens de la sesión previa siguen aplicándose a
|
|
489
|
+
// ESA sesión (store), no a la nueva.
|
|
477
490
|
|
|
478
491
|
// Limpiar contexto global al cambiar de conversación
|
|
479
492
|
setProject(null);
|
|
@@ -481,31 +494,44 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
481
494
|
setChipsProject(null);
|
|
482
495
|
setTask(null);
|
|
483
496
|
currentChatId.current = initialChatId;
|
|
497
|
+
setActiveSessionId(initialChatId);
|
|
484
498
|
currentMessageId.current = uuidv4();
|
|
485
499
|
currentUserQuestion.current = null;
|
|
486
500
|
reportedEvent.current = false;
|
|
487
|
-
isProcessingRef.
|
|
501
|
+
// isProcessingRef refleja si la sesión ACTIVA está ocupada. Si la sesión
|
|
502
|
+
// a la que entramos sigue generando en background, queda bloqueada; si no,
|
|
503
|
+
// se habilita el envío aunque otras sesiones sigan generando.
|
|
504
|
+
isProcessingRef.current = sessionStreamManager.isActive(initialChatId);
|
|
488
505
|
streamingPlaceholderIdRef.current = null;
|
|
489
506
|
activeStreamChatIdRef.current = null;
|
|
490
|
-
|
|
491
|
-
loadMessages()
|
|
507
|
+
|
|
508
|
+
// loadMessages lo dispara useChatMessages al cambiar chatId (con cache en memoria).
|
|
492
509
|
}
|
|
493
|
-
}, [initialChatId, project, setProject, setClient, setChipsProject, setTask
|
|
494
|
-
|
|
510
|
+
}, [initialChatId, project, setProject, setClient, setChipsProject, setTask]);
|
|
511
|
+
useEffect(function () {
|
|
512
|
+
setActiveChatId(initialChatId || null);
|
|
513
|
+
}, [initialChatId, setActiveChatId]);
|
|
514
|
+
var handleStreamError = useCallback(function (ctx, errorMessage, errorRawMessage) {
|
|
495
515
|
var _errorRawMessage$matc, _errorRawMessage$matc2;
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
516
|
+
var sessionId = ctx.sessionId,
|
|
517
|
+
messageId = ctx.messageId,
|
|
518
|
+
placeholderId = ctx.placeholderId;
|
|
519
|
+
var isActive = activeView.is(sessionId);
|
|
520
|
+
sessionStreamingText.clear(sessionId);
|
|
521
|
+
dropFromSession(sessionId, placeholderId);
|
|
522
|
+
if (isActive) {
|
|
523
|
+
clearStreamUiRef.current();
|
|
524
|
+
streamingPlaceholderIdRef.current = null;
|
|
525
|
+
activeStreamChatIdRef.current = null;
|
|
526
|
+
isProcessingRef.current = false;
|
|
527
|
+
}
|
|
502
528
|
var isAccessDenied = errorMessage === "Access denied: You don't have permission to access this agent";
|
|
503
529
|
var isPromptTooLong = errorMessage === 'invalid_request_error' && (errorRawMessage === null || errorRawMessage === void 0 ? void 0 : errorRawMessage.includes('prompt is too long'));
|
|
504
530
|
var message = isAccessDenied ? t('chat.errorAccessDenied') : isPromptTooLong ? t('chat.errorPromptTooLong', {
|
|
505
531
|
used: (_errorRawMessage$matc = errorRawMessage === null || errorRawMessage === void 0 || (_errorRawMessage$matc2 = errorRawMessage.match(/(\d+) tokens/)) === null || _errorRawMessage$matc2 === void 0 ? void 0 : _errorRawMessage$matc2[1]) !== null && _errorRawMessage$matc !== void 0 ? _errorRawMessage$matc : ''
|
|
506
532
|
}) : t('chat.error');
|
|
507
|
-
|
|
508
|
-
id: "answer-".concat(
|
|
533
|
+
commitToSession(sessionId, _objectSpread(_objectSpread({
|
|
534
|
+
id: "answer-".concat(messageId),
|
|
509
535
|
message: message,
|
|
510
536
|
isError: true
|
|
511
537
|
}, !isAccessDenied && !isPromptTooLong ? {
|
|
@@ -518,53 +544,86 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
518
544
|
},
|
|
519
545
|
role: ChatHistoryRole.ASSISTANT
|
|
520
546
|
}));
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
// token residual: no debe pintarse en el nuevo chat.
|
|
526
|
-
if (activeStreamChatIdRef.current != null && activeStreamChatIdRef.current !== currentChatId.current) {
|
|
527
|
-
return;
|
|
547
|
+
clearSessionTail(sessionId);
|
|
548
|
+
if (!isActive) {
|
|
549
|
+
getChatsStoreState().markChatAsUnread(sessionId);
|
|
550
|
+
notifySessionFinishedInBackground(sessionId, 'error');
|
|
528
551
|
}
|
|
529
|
-
|
|
552
|
+
}, [commitToSession, dropFromSession, clearSessionTail, t]);
|
|
553
|
+
var handleStreamUpdate = useCallback(function (ctx, content) {
|
|
554
|
+
var sessionId = ctx.sessionId,
|
|
555
|
+
placeholderId = ctx.placeholderId;
|
|
530
556
|
|
|
531
|
-
//
|
|
532
|
-
//
|
|
533
|
-
//
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
id:
|
|
557
|
+
// Aseguramos el placeholder una única vez por stream, tanto en el store
|
|
558
|
+
// de la sesión como en la vista si es la activa. El texto en vivo viaja
|
|
559
|
+
// por sessionStreamingText (externo), sin re-render del árbol completo.
|
|
560
|
+
var placeholderExists = useSessionsStore.getState().getMessages(sessionId).some(function (msg) {
|
|
561
|
+
return msg.id === placeholderId;
|
|
562
|
+
});
|
|
563
|
+
if (!placeholderExists) {
|
|
564
|
+
sessionStreamingText.start(sessionId, placeholderId);
|
|
565
|
+
commitToSession(sessionId, {
|
|
566
|
+
id: placeholderId,
|
|
541
567
|
message: '',
|
|
542
568
|
date: new Date(),
|
|
543
569
|
user: {
|
|
544
570
|
id: 'assistant',
|
|
545
571
|
name: 'Assistant'
|
|
546
572
|
},
|
|
547
|
-
role: ChatHistoryRole.ASSISTANT
|
|
548
|
-
sources: sources,
|
|
549
|
-
memorySessionId: memorySessionId
|
|
573
|
+
role: ChatHistoryRole.ASSISTANT
|
|
550
574
|
});
|
|
551
575
|
}
|
|
552
|
-
|
|
553
|
-
|
|
576
|
+
if (activeView.is(sessionId)) {
|
|
577
|
+
streamingPlaceholderIdRef.current = placeholderId;
|
|
578
|
+
activeStreamChatIdRef.current = sessionId;
|
|
579
|
+
}
|
|
580
|
+
sessionStreamingText.setText(sessionId, placeholderId, content);
|
|
581
|
+
}, [commitToSession]);
|
|
554
582
|
var handleStreamFinish = useCallback(/*#__PURE__*/function () {
|
|
555
|
-
var
|
|
583
|
+
var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(ctx, content, sources, memorySessionId, rawAttachments, suggestions, completedAgentId) {
|
|
556
584
|
var _previousMessage$appr, _window$taskPanel, _createAgentFollowUp, _editAgentFollowUp;
|
|
557
|
-
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;
|
|
558
|
-
return _regeneratorRuntime.wrap(function (
|
|
559
|
-
while (1) switch (
|
|
585
|
+
var sessionId, placeholderId, isActive, 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, _getChatsStoreState, isChatViewVisible, markChatAsRead, customEvent;
|
|
586
|
+
return _regeneratorRuntime.wrap(function (_context) {
|
|
587
|
+
while (1) switch (_context.prev = _context.next) {
|
|
560
588
|
case 0:
|
|
561
|
-
|
|
562
|
-
|
|
589
|
+
sessionId = ctx.sessionId, placeholderId = ctx.placeholderId;
|
|
590
|
+
isActive = activeView.is(sessionId);
|
|
591
|
+
tempMessageId = placeholderId;
|
|
592
|
+
sessionStreamingText.clear(sessionId);
|
|
593
|
+
dropFromSession(sessionId, tempMessageId);
|
|
594
|
+
attachments = normalizeAssistantAttachments(rawAttachments); // Sesión en background: cerramos lean. El backend ya persistió la
|
|
595
|
+
// respuesta, así que al volver a la sesión se carga desde ahí. Avisamos
|
|
596
|
+
// que terminó (unread + evento para toast/sonido).
|
|
597
|
+
if (isActive) {
|
|
598
|
+
_context.next = 1;
|
|
599
|
+
break;
|
|
600
|
+
}
|
|
601
|
+
commitToSession(sessionId, _objectSpread(_objectSpread({
|
|
602
|
+
id: "answer-".concat(memorySessionId),
|
|
603
|
+
message: content,
|
|
604
|
+
date: new Date(),
|
|
605
|
+
user: {
|
|
606
|
+
id: 'assistant',
|
|
607
|
+
name: 'Assistant'
|
|
608
|
+
},
|
|
609
|
+
role: ChatHistoryRole.ASSISTANT,
|
|
610
|
+
sources: sources
|
|
611
|
+
}, attachments.length > 0 ? {
|
|
612
|
+
attachments: attachments
|
|
613
|
+
} : {}), {}, {
|
|
614
|
+
memorySessionId: memorySessionId,
|
|
615
|
+
suggestions: suggestions || []
|
|
616
|
+
}));
|
|
617
|
+
clearSessionTail(sessionId);
|
|
618
|
+
getChatsStoreState().markChatAsUnread(sessionId);
|
|
619
|
+
notifySessionFinishedInBackground(sessionId, 'complete');
|
|
620
|
+
return _context.abrupt("return");
|
|
621
|
+
case 1:
|
|
563
622
|
streamingPlaceholderIdRef.current = null;
|
|
564
623
|
activeStreamChatIdRef.current = null;
|
|
565
624
|
hitlExecutionContextRef.current = null;
|
|
566
|
-
|
|
567
|
-
|
|
625
|
+
|
|
626
|
+
// Detectar todas las URLs de tareas (.../tasks/123/detail|message|messages|files|history|hours)
|
|
568
627
|
taskUrlRegex = new RegExp(TASK_URL_REGEX_PATTERN, 'g');
|
|
569
628
|
matches = _toConsumableArray(content.matchAll(taskUrlRegex));
|
|
570
629
|
contentToAdd = content;
|
|
@@ -632,23 +691,23 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
632
691
|
taskIdsForDashboard = taskIdsFromUrls.length > 0 ? taskIdsFromUrls : taskIdsFromDeleteApproval.length > 0 ? taskIdsFromDeleteApproval : taskIdsFromDeletionText;
|
|
633
692
|
shouldSyncDashboard = hasApprovalInPreviousMessage && (wasTaskCreation || wasTaskEdit || wasTaskDelete) && taskIdsForDashboard.length > 0;
|
|
634
693
|
if (!shouldSyncDashboard) {
|
|
635
|
-
|
|
694
|
+
_context.next = 4;
|
|
636
695
|
break;
|
|
637
696
|
}
|
|
638
697
|
taskIds = taskIdsForDashboard;
|
|
639
698
|
if (!(matches.length > 0)) {
|
|
640
|
-
|
|
699
|
+
_context.next = 3;
|
|
641
700
|
break;
|
|
642
701
|
}
|
|
643
|
-
|
|
702
|
+
_context.next = 2;
|
|
644
703
|
return getTabTaskDefault(taskIds[0]);
|
|
645
|
-
case
|
|
646
|
-
tab =
|
|
704
|
+
case 2:
|
|
705
|
+
tab = _context.sent;
|
|
647
706
|
tabSegment = tab ? "/".concat(tab) : '/detail';
|
|
648
707
|
contentToAdd = content.replace(taskUrlRegex, function (url) {
|
|
649
708
|
return url.replace(/\/(detail|message|messages|files|history|hours)(?=$|\?)/, tabSegment);
|
|
650
709
|
});
|
|
651
|
-
case
|
|
710
|
+
case 3:
|
|
652
711
|
lastProjectMessage = messagesRef.current.filter(function (msg) {
|
|
653
712
|
return msg.projectId;
|
|
654
713
|
}).at(-1);
|
|
@@ -666,7 +725,7 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
666
725
|
(_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);
|
|
667
726
|
}
|
|
668
727
|
}
|
|
669
|
-
case
|
|
728
|
+
case 4:
|
|
670
729
|
// Refetch del task panel si está abierto y la tool aprobada editó/borró esa tarea.
|
|
671
730
|
// Cubre los dos flujos de approval:
|
|
672
731
|
// 1) Approval por botón → `previousMessage.approval.pending_actions` (vía hasApprovalInPreviousMessage)
|
|
@@ -702,7 +761,7 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
702
761
|
(_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);
|
|
703
762
|
}
|
|
704
763
|
}
|
|
705
|
-
|
|
764
|
+
commitToSession(sessionId, _objectSpread(_objectSpread({
|
|
706
765
|
id: "answer-".concat(memorySessionId),
|
|
707
766
|
message: contentToAdd,
|
|
708
767
|
date: new Date(),
|
|
@@ -720,6 +779,7 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
720
779
|
}, createAgentFollowUp ? {
|
|
721
780
|
createAgentFollowUp: createAgentFollowUp
|
|
722
781
|
} : {}));
|
|
782
|
+
clearSessionTail(sessionId);
|
|
723
783
|
if ((_createAgentFollowUp = createAgentFollowUp) !== null && _createAgentFollowUp !== void 0 && _createAgentFollowUp.agentId) {
|
|
724
784
|
fetchAgentDetail(createAgentFollowUp.agentId).then(function (chatAgent) {
|
|
725
785
|
document.dispatchEvent(new CustomEvent('maia-merge-created-agent-into-list', {
|
|
@@ -743,29 +803,41 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
743
803
|
});
|
|
744
804
|
}
|
|
745
805
|
isProcessingRef.current = false;
|
|
806
|
+
_getChatsStoreState = getChatsStoreState(), isChatViewVisible = _getChatsStoreState.isChatViewVisible, markChatAsRead = _getChatsStoreState.markChatAsRead;
|
|
807
|
+
if (!(isActive && isChatViewVisible)) {
|
|
808
|
+
_context.next = 5;
|
|
809
|
+
break;
|
|
810
|
+
}
|
|
811
|
+
_context.next = 5;
|
|
812
|
+
return markChatAsRead(sessionId, {
|
|
813
|
+
force: true
|
|
814
|
+
});
|
|
815
|
+
case 5:
|
|
746
816
|
if (firstTimeRef.current) {
|
|
747
817
|
customEvent = new CustomEvent('refetch-session');
|
|
748
818
|
document.dispatchEvent(customEvent);
|
|
749
819
|
firstTimeRef.current = false;
|
|
750
820
|
}
|
|
751
|
-
case
|
|
821
|
+
case 6:
|
|
752
822
|
case "end":
|
|
753
|
-
return
|
|
823
|
+
return _context.stop();
|
|
754
824
|
}
|
|
755
|
-
},
|
|
825
|
+
}, _callee);
|
|
756
826
|
}));
|
|
757
|
-
return function (_x4, _x5, _x6, _x7
|
|
758
|
-
return
|
|
827
|
+
return function (_x, _x2, _x3, _x4, _x5, _x6, _x7) {
|
|
828
|
+
return _ref5.apply(this, arguments);
|
|
759
829
|
};
|
|
760
|
-
}(), [
|
|
830
|
+
}(), [commitToSession, dropFromSession, clearSessionTail, project, getTabTaskDefault, event, agent]);
|
|
761
831
|
var handleStreamStop = useCallback(function () {
|
|
832
|
+
// El stop siempre aplica a la sesión activa (botón del input visible).
|
|
833
|
+
var sessionId = currentChatId.current;
|
|
762
834
|
clearStreamUiRef.current();
|
|
763
835
|
var tempMessageId = "answer-".concat(currentMessageId.current, "-streaming");
|
|
764
|
-
|
|
836
|
+
sessionStreamingText.clear(sessionId);
|
|
765
837
|
streamingPlaceholderIdRef.current = null;
|
|
766
838
|
activeStreamChatIdRef.current = null;
|
|
767
|
-
|
|
768
|
-
|
|
839
|
+
dropFromSession(sessionId, tempMessageId);
|
|
840
|
+
commitToSession(sessionId, {
|
|
769
841
|
id: "answer-".concat(currentMessageId.current, "-cancelled"),
|
|
770
842
|
message: t('chat.cancelled'),
|
|
771
843
|
date: new Date(),
|
|
@@ -776,19 +848,24 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
776
848
|
role: ChatHistoryRole.ASSISTANT,
|
|
777
849
|
isFrontendCancelled: true
|
|
778
850
|
});
|
|
851
|
+
clearSessionTail(sessionId);
|
|
779
852
|
isProcessingRef.current = false;
|
|
780
853
|
setTimeout(function () {
|
|
781
854
|
var customEvent = new CustomEvent('refetch-session');
|
|
782
855
|
document.dispatchEvent(customEvent);
|
|
783
856
|
}, 500);
|
|
784
|
-
}, [
|
|
785
|
-
var handleApprovalRequired = useCallback(function (approval, accumulatedContent) {
|
|
857
|
+
}, [commitToSession, dropFromSession, clearSessionTail, t]);
|
|
858
|
+
var handleApprovalRequired = useCallback(function (ctx, approval, accumulatedContent) {
|
|
786
859
|
var _approval$pending_act;
|
|
787
|
-
var
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
860
|
+
var sessionId = ctx.sessionId,
|
|
861
|
+
placeholderId = ctx.placeholderId;
|
|
862
|
+
var isActive = activeView.is(sessionId);
|
|
863
|
+
sessionStreamingText.clear(sessionId);
|
|
864
|
+
dropFromSession(sessionId, placeholderId);
|
|
865
|
+
if (isActive) {
|
|
866
|
+
streamingPlaceholderIdRef.current = null;
|
|
867
|
+
activeStreamChatIdRef.current = null;
|
|
868
|
+
}
|
|
792
869
|
var hitlContext = {
|
|
793
870
|
messageId: "approval-".concat(approval.original_thread_id),
|
|
794
871
|
messageText: accumulatedContent || '',
|
|
@@ -798,24 +875,28 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
798
875
|
return action.thread_id;
|
|
799
876
|
})
|
|
800
877
|
};
|
|
801
|
-
|
|
878
|
+
if (isActive) {
|
|
879
|
+
hitlExecutionContextRef.current = hitlContext;
|
|
880
|
+
}
|
|
802
881
|
if (approval.manual_approval_detected) {
|
|
803
|
-
var _approval$pending_act2,
|
|
882
|
+
var _approval$pending_act2, _ref6, _tool_name, _tool_args;
|
|
804
883
|
var firstAction = (_approval$pending_act2 = approval.pending_actions) === null || _approval$pending_act2 === void 0 ? void 0 : _approval$pending_act2[0];
|
|
805
|
-
var toolName = (
|
|
884
|
+
var toolName = (_ref6 = (_tool_name = approval.tool_name) !== null && _tool_name !== void 0 ? _tool_name : firstAction === null || firstAction === void 0 ? void 0 : firstAction.tool_name) !== null && _ref6 !== void 0 ? _ref6 : '';
|
|
806
885
|
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;
|
|
807
|
-
if (toolName) {
|
|
886
|
+
if (toolName && isActive) {
|
|
808
887
|
lastManualApprovalRef.current = {
|
|
809
888
|
toolName: toolName,
|
|
810
889
|
toolArgs: toolArgs
|
|
811
890
|
};
|
|
812
891
|
}
|
|
813
|
-
|
|
892
|
+
if (isActive) {
|
|
893
|
+
isProcessingRef.current = false;
|
|
894
|
+
}
|
|
814
895
|
return;
|
|
815
896
|
}
|
|
816
897
|
|
|
817
898
|
// Add a message with the approval request
|
|
818
|
-
|
|
899
|
+
commitToSession(sessionId, {
|
|
819
900
|
id: "approval-".concat(approval.original_thread_id),
|
|
820
901
|
message: accumulatedContent || '',
|
|
821
902
|
date: new Date(),
|
|
@@ -827,9 +908,15 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
827
908
|
approval: approval,
|
|
828
909
|
approvalStatus: 'pending'
|
|
829
910
|
});
|
|
830
|
-
|
|
831
|
-
|
|
911
|
+
if (isActive) {
|
|
912
|
+
isProcessingRef.current = false;
|
|
913
|
+
} else {
|
|
914
|
+
getChatsStoreState().markChatAsUnread(sessionId);
|
|
915
|
+
notifySessionFinishedInBackground(sessionId, 'approval_required');
|
|
916
|
+
}
|
|
917
|
+
}, [commitToSession, dropFromSession]);
|
|
832
918
|
var _useOrchestratorStrea = useOrchestratorStream({
|
|
919
|
+
activeSessionId: activeSessionId,
|
|
833
920
|
onError: handleStreamError,
|
|
834
921
|
onStreamUpdate: handleStreamUpdate,
|
|
835
922
|
onFinishStream: handleStreamFinish,
|
|
@@ -843,32 +930,42 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
843
930
|
loadingMessage = _useOrchestratorStrea.loadingMessage,
|
|
844
931
|
streamActivity = _useOrchestratorStrea.streamActivity,
|
|
845
932
|
updateStreamActivity = _useOrchestratorStrea.updateStreamActivity,
|
|
846
|
-
stopStreaming = _useOrchestratorStrea.stopStreaming
|
|
847
|
-
abortStreamSilently = _useOrchestratorStrea.abortStreamSilently;
|
|
848
|
-
|
|
849
|
-
// Mantenemos el setter más reciente en una ref para que pueda usarse desde
|
|
850
|
-
// efectos definidos antes en el archivo (cambio de chat, reset, etc.).
|
|
851
|
-
abortStreamSilentlyRef.current = abortStreamSilently;
|
|
933
|
+
stopStreaming = _useOrchestratorStrea.stopStreaming;
|
|
852
934
|
clearStreamUiRef.current = function () {
|
|
853
935
|
updateStreamActivity(null);
|
|
854
936
|
setActiveLoadings({});
|
|
855
|
-
setIsContinuingStream(false);
|
|
856
937
|
hitlExecutionContextRef.current = null;
|
|
857
938
|
};
|
|
858
939
|
var currentProject = project;
|
|
859
940
|
var sendMessage = useCallback(/*#__PURE__*/function () {
|
|
860
|
-
var
|
|
941
|
+
var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(message, attachmentsOrOptions, faqId, agentSuggestionId, mentions, fuaId, scId) {
|
|
861
942
|
var _messagesRef$current;
|
|
862
|
-
var _normalizeSendMessage, attachments, options, effectiveMentions, contextMessage, payloadFuaId, payloadScId, payloadContextData, displayMessage, newMessageId, lastMessageWithProject, currentAgentFromMessages, streamingPlaceholderId, finalMessage, _options$projectChang, _contextRef$current$p, history,
|
|
863
|
-
return _regeneratorRuntime.wrap(function (
|
|
864
|
-
while (1) switch (
|
|
943
|
+
var willStartNewStream, _normalizeSendMessage, attachments, options, effectiveMentions, contextMessage, payloadFuaId, payloadScId, payloadContextData, displayMessage, newMessageId, lastMessageWithProject, currentAgentFromMessages, sessionId, _contextRef$current, ctxChipsProject, ctxProject, ctxClient, ctxTask, streamingPlaceholderId, finalMessage, _options$projectChang, _contextRef$current$p, history, lastMessageProjectId, projectToRequest, projects, payloadFaqId, payloadAgentSuggestionId, payloadData;
|
|
944
|
+
return _regeneratorRuntime.wrap(function (_context2) {
|
|
945
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
865
946
|
case 0:
|
|
866
947
|
if (!(isProcessingRef.current || waitingResponse || loadingMessages)) {
|
|
867
|
-
|
|
948
|
+
_context2.next = 1;
|
|
868
949
|
break;
|
|
869
950
|
}
|
|
870
|
-
return
|
|
951
|
+
return _context2.abrupt("return");
|
|
871
952
|
case 1:
|
|
953
|
+
// Tope de concurrencia: si esta sesión no está generando y ya hay
|
|
954
|
+
// MAX_CONCURRENT_STREAMS activas, avisamos y no arrancamos otra.
|
|
955
|
+
willStartNewStream = !sessionStreamManager.isActive(currentChatId.current);
|
|
956
|
+
if (!(willStartNewStream && sessionStreamManager.getActiveCount() >= MAX_CONCURRENT_STREAMS)) {
|
|
957
|
+
_context2.next = 2;
|
|
958
|
+
break;
|
|
959
|
+
}
|
|
960
|
+
document.dispatchEvent(new CustomEvent('snackbar-event', {
|
|
961
|
+
detail: {
|
|
962
|
+
show: true,
|
|
963
|
+
severity: 'info',
|
|
964
|
+
message: t('chat.tooManyActiveSessions')
|
|
965
|
+
}
|
|
966
|
+
}));
|
|
967
|
+
return _context2.abrupt("return");
|
|
968
|
+
case 2:
|
|
872
969
|
_normalizeSendMessage = normalizeSendMessageArgs(attachmentsOrOptions), attachments = _normalizeSendMessage.attachments, options = _normalizeSendMessage.options; // Las mentions pueden venir vía 5to parámetro (call positional desde el footer)
|
|
873
970
|
// o vía SendMessageOptions (call programático). El parámetro explícito gana.
|
|
874
971
|
effectiveMentions = mentions !== null && mentions !== void 0 ? mentions : options.mentions;
|
|
@@ -881,6 +978,7 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
881
978
|
scId: payloadScId
|
|
882
979
|
});
|
|
883
980
|
isProcessingRef.current = true;
|
|
981
|
+
setActiveChatId(currentChatId.current);
|
|
884
982
|
newMessageId = uuidv4();
|
|
885
983
|
currentMessageId.current = newMessageId;
|
|
886
984
|
currentUserQuestion.current = message;
|
|
@@ -893,8 +991,21 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
893
991
|
lastMessageWithProject = messagesRef.current.filter(function (msg) {
|
|
894
992
|
return msg.projectId;
|
|
895
993
|
}).at(-1);
|
|
896
|
-
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;
|
|
897
|
-
|
|
994
|
+
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;
|
|
995
|
+
sessionId = currentChatId.current;
|
|
996
|
+
_contextRef$current = contextRef.current, ctxChipsProject = _contextRef$current.chipsProject, ctxProject = _contextRef$current.project, ctxClient = _contextRef$current.client, ctxTask = _contextRef$current.task;
|
|
997
|
+
ensureSessionInSidebar({
|
|
998
|
+
sessionId: sessionId,
|
|
999
|
+
title: buildSidebarSessionTitle(displayMessage),
|
|
1000
|
+
agent: agent,
|
|
1001
|
+
agentId: currentAgentFromMessages || (agent === null || agent === void 0 ? void 0 : agent.id),
|
|
1002
|
+
project: ctxProject,
|
|
1003
|
+
client: ctxClient,
|
|
1004
|
+
attachments: attachments
|
|
1005
|
+
});
|
|
1006
|
+
|
|
1007
|
+
// No agregar projectId al mensaje del usuario - se determinará después
|
|
1008
|
+
commitToSession(sessionId, _objectSpread({
|
|
898
1009
|
id: "question-".concat(currentMessageId.current),
|
|
899
1010
|
message: displayMessage,
|
|
900
1011
|
date: new Date(),
|
|
@@ -907,8 +1018,9 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
907
1018
|
currentMessageId.current = uuidv4();
|
|
908
1019
|
streamingPlaceholderId = "answer-".concat(currentMessageId.current, "-streaming");
|
|
909
1020
|
streamingPlaceholderIdRef.current = streamingPlaceholderId;
|
|
910
|
-
activeStreamChatIdRef.current =
|
|
911
|
-
|
|
1021
|
+
activeStreamChatIdRef.current = sessionId;
|
|
1022
|
+
sessionStreamingText.start(sessionId, streamingPlaceholderId);
|
|
1023
|
+
commitToSession(sessionId, {
|
|
912
1024
|
id: streamingPlaceholderId,
|
|
913
1025
|
message: '',
|
|
914
1026
|
date: new Date(),
|
|
@@ -928,16 +1040,15 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
928
1040
|
role: historyMessage.user.id === authUser.id.toString() ? ChatHistoryRole.USER : ChatHistoryRole.ASSISTANT
|
|
929
1041
|
};
|
|
930
1042
|
});
|
|
931
|
-
_contextRef$current = contextRef.current, ctxChipsProject = _contextRef$current.chipsProject, ctxProject = _contextRef$current.project, ctxClient = _contextRef$current.client, ctxTask = _contextRef$current.task;
|
|
932
1043
|
lastMessageProjectId = lastMessageWithProject === null || lastMessageWithProject === void 0 ? void 0 : lastMessageWithProject.projectId;
|
|
933
1044
|
projectToRequest = resolveProjectToRequest(ctxChipsProject, lastMessageProjectId);
|
|
934
|
-
|
|
1045
|
+
_context2.next = 3;
|
|
935
1046
|
return fetchProjects([projectToRequest]);
|
|
936
|
-
case
|
|
937
|
-
projects =
|
|
1047
|
+
case 3:
|
|
1048
|
+
projects = _context2.sent;
|
|
938
1049
|
payloadFaqId = faqId !== null && faqId !== void 0 ? faqId : options.faqId;
|
|
939
1050
|
payloadAgentSuggestionId = agentSuggestionId !== null && agentSuggestionId !== void 0 ? agentSuggestionId : options.agentSuggestionId;
|
|
940
|
-
payloadData = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
|
|
1051
|
+
payloadData = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
|
|
941
1052
|
message: finalMessage,
|
|
942
1053
|
history: history,
|
|
943
1054
|
projectId: projectToRequest,
|
|
@@ -974,22 +1085,24 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
974
1085
|
agentEntity: agent.entity
|
|
975
1086
|
} : {}), (agent === null || agent === void 0 ? void 0 : agent.type) != null ? {
|
|
976
1087
|
agentType: agent.type
|
|
1088
|
+
} : {}), (agent === null || agent === void 0 ? void 0 : agent.emoji) != null ? {
|
|
1089
|
+
agentEmoji: agent.emoji
|
|
977
1090
|
} : {}), contextMessage ? {
|
|
978
1091
|
contextMessage: contextMessage
|
|
979
1092
|
} : {}), payloadContextData ? {
|
|
980
1093
|
contextData: payloadContextData
|
|
981
1094
|
} : {});
|
|
982
1095
|
askMaia(payloadData);
|
|
983
|
-
case
|
|
1096
|
+
case 4:
|
|
984
1097
|
case "end":
|
|
985
|
-
return
|
|
1098
|
+
return _context2.stop();
|
|
986
1099
|
}
|
|
987
|
-
},
|
|
1100
|
+
}, _callee2);
|
|
988
1101
|
}));
|
|
989
|
-
return function (_x0, _x1, _x10, _x11, _x12
|
|
990
|
-
return
|
|
1102
|
+
return function (_x8, _x9, _x0, _x1, _x10, _x11, _x12) {
|
|
1103
|
+
return _ref7.apply(this, arguments);
|
|
991
1104
|
};
|
|
992
|
-
}(), [addMessage, event, askMaia, project, client, task, chipsProject, authUser, agent, t, waitingResponse, loadingMessages, isWebSearchActive, isDeepSearchActive]);
|
|
1105
|
+
}(), [addMessage, commitToSession, event, askMaia, project, client, task, chipsProject, authUser, agent, t, waitingResponse, loadingMessages, isWebSearchActive, isDeepSearchActive]);
|
|
993
1106
|
var changeProject = useCallback(function (option) {
|
|
994
1107
|
if (!currentUserQuestion.current) return;
|
|
995
1108
|
if (option.id !== (project === null || project === void 0 ? void 0 : project.id)) {
|
|
@@ -1029,15 +1142,15 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
1029
1142
|
}
|
|
1030
1143
|
}, [project, setProject, askMaia, authUser, isWebSearchActive, agent]);
|
|
1031
1144
|
var handleFeedback = useCallback(/*#__PURE__*/function () {
|
|
1032
|
-
var
|
|
1145
|
+
var _ref8 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(feedbackProp, chatMessageId) {
|
|
1033
1146
|
var response;
|
|
1034
|
-
return _regeneratorRuntime.wrap(function (
|
|
1035
|
-
while (1) switch (
|
|
1147
|
+
return _regeneratorRuntime.wrap(function (_context3) {
|
|
1148
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
1036
1149
|
case 0:
|
|
1037
|
-
|
|
1150
|
+
_context3.next = 1;
|
|
1038
1151
|
return maia.Chats.wasHelpfulChat(chatMessageId, feedbackProp === Feedback.THUMBS_UP);
|
|
1039
1152
|
case 1:
|
|
1040
|
-
response =
|
|
1153
|
+
response = _context3.sent;
|
|
1041
1154
|
if (response) {
|
|
1042
1155
|
messagesRef.current = messagesRef.current.map(function (message) {
|
|
1043
1156
|
if (message.id === chatMessageId && message.role === 'assistant') {
|
|
@@ -1050,44 +1163,72 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
1050
1163
|
}
|
|
1051
1164
|
case 2:
|
|
1052
1165
|
case "end":
|
|
1053
|
-
return
|
|
1166
|
+
return _context3.stop();
|
|
1054
1167
|
}
|
|
1055
|
-
},
|
|
1168
|
+
}, _callee3);
|
|
1056
1169
|
}));
|
|
1057
|
-
return function (
|
|
1058
|
-
return
|
|
1170
|
+
return function (_x13, _x14) {
|
|
1171
|
+
return _ref8.apply(this, arguments);
|
|
1059
1172
|
};
|
|
1060
1173
|
}(), []);
|
|
1061
1174
|
var handleApprovalDecision = useCallback(/*#__PURE__*/function () {
|
|
1062
|
-
var
|
|
1063
|
-
var messageWithApproval, approval, messageId,
|
|
1064
|
-
return _regeneratorRuntime.wrap(function (
|
|
1065
|
-
while (1) switch (
|
|
1175
|
+
var _ref9 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(threadIds, decision, editedActions) {
|
|
1176
|
+
var found, messageWithApproval, foundSessionId, approval, sessionId, messageId, newStatus, hitlContext, isActiveSession, streamMessageId, hitlCtx, releaseActiveProcessing, result;
|
|
1177
|
+
return _regeneratorRuntime.wrap(function (_context4) {
|
|
1178
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
1066
1179
|
case 0:
|
|
1067
1180
|
if (threadIds !== null && threadIds !== void 0 && threadIds.length) {
|
|
1068
|
-
|
|
1181
|
+
_context4.next = 1;
|
|
1069
1182
|
break;
|
|
1070
1183
|
}
|
|
1071
1184
|
console.error('No thread_ids provided for approval decision');
|
|
1072
|
-
return
|
|
1185
|
+
return _context4.abrupt("return");
|
|
1073
1186
|
case 1:
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
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) {
|
|
1078
|
-
return threadIds.includes(action.thread_id);
|
|
1079
|
-
});
|
|
1080
|
-
});
|
|
1081
|
-
if (!(!messageWithApproval || !messageWithApproval.approval)) {
|
|
1082
|
-
_context5.next = 2;
|
|
1187
|
+
found = findMessageWithApprovalByThreadIds(threadIds, messagesRef.current);
|
|
1188
|
+
if (found !== null && found !== void 0 && found.message.approval) {
|
|
1189
|
+
_context4.next = 2;
|
|
1083
1190
|
break;
|
|
1084
1191
|
}
|
|
1085
1192
|
console.error('No se encontró mensaje con approval para thread_ids:', threadIds);
|
|
1086
|
-
return
|
|
1193
|
+
return _context4.abrupt("return");
|
|
1087
1194
|
case 2:
|
|
1195
|
+
messageWithApproval = found.message, foundSessionId = found.sessionId;
|
|
1088
1196
|
approval = messageWithApproval.approval;
|
|
1197
|
+
if (approval) {
|
|
1198
|
+
_context4.next = 3;
|
|
1199
|
+
break;
|
|
1200
|
+
}
|
|
1201
|
+
return _context4.abrupt("return");
|
|
1202
|
+
case 3:
|
|
1203
|
+
sessionId = approval.session_id || foundSessionId;
|
|
1204
|
+
if (sessionId) {
|
|
1205
|
+
_context4.next = 4;
|
|
1206
|
+
break;
|
|
1207
|
+
}
|
|
1208
|
+
console.error('No session_id disponible para approval:', threadIds);
|
|
1209
|
+
return _context4.abrupt("return");
|
|
1210
|
+
case 4:
|
|
1211
|
+
if (!sessionStreamManager.isActive(sessionId)) {
|
|
1212
|
+
_context4.next = 5;
|
|
1213
|
+
break;
|
|
1214
|
+
}
|
|
1215
|
+
return _context4.abrupt("return");
|
|
1216
|
+
case 5:
|
|
1217
|
+
if (!(sessionStreamManager.getActiveCount() >= MAX_CONCURRENT_STREAMS)) {
|
|
1218
|
+
_context4.next = 6;
|
|
1219
|
+
break;
|
|
1220
|
+
}
|
|
1221
|
+
document.dispatchEvent(new CustomEvent('snackbar-event', {
|
|
1222
|
+
detail: {
|
|
1223
|
+
show: true,
|
|
1224
|
+
severity: 'info',
|
|
1225
|
+
message: t('chat.tooManyActiveSessions')
|
|
1226
|
+
}
|
|
1227
|
+
}));
|
|
1228
|
+
return _context4.abrupt("return");
|
|
1229
|
+
case 6:
|
|
1089
1230
|
messageId = messageWithApproval.id;
|
|
1090
|
-
|
|
1231
|
+
newStatus = decision === 'approve' ? 'approved' : 'rejected';
|
|
1091
1232
|
hitlContext = {
|
|
1092
1233
|
messageId: messageId,
|
|
1093
1234
|
messageText: messageWithApproval.message,
|
|
@@ -1095,178 +1236,106 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
1095
1236
|
pendingActions: approval.pending_actions,
|
|
1096
1237
|
threadIds: threadIds
|
|
1097
1238
|
};
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
var newStatus = decision === 'approve' ? 'approved' : 'rejected';
|
|
1103
|
-
return _objectSpread(_objectSpread({}, message), {}, {
|
|
1104
|
-
approvalStatus: newStatus
|
|
1105
|
-
});
|
|
1106
|
-
}
|
|
1107
|
-
return message;
|
|
1108
|
-
});
|
|
1109
|
-
|
|
1110
|
-
// Trigger re-render
|
|
1111
|
-
existingMessage = messagesRef.current.find(function (m) {
|
|
1112
|
-
return m.id === messageId;
|
|
1113
|
-
});
|
|
1114
|
-
if (existingMessage) {
|
|
1115
|
-
newStatus = decision === 'approve' ? 'approved' : 'rejected';
|
|
1116
|
-
addMessage(_objectSpread(_objectSpread({}, existingMessage), {}, {
|
|
1117
|
-
approvalStatus: newStatus
|
|
1118
|
-
}));
|
|
1239
|
+
isActiveSession = activeView.is(sessionId);
|
|
1240
|
+
if (isActiveSession) {
|
|
1241
|
+
hitlExecutionContextRef.current = hitlContext;
|
|
1242
|
+
isProcessingRef.current = true;
|
|
1119
1243
|
}
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
// Add loading
|
|
1127
|
-
setActiveLoadings(function (prev) {
|
|
1128
|
-
return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, loadingKey, initialActivity.message));
|
|
1129
|
-
});
|
|
1130
|
-
updateStreamActivity(initialActivity);
|
|
1131
|
-
|
|
1132
|
-
// Marca si el stream cerró vía un evento terminal (complete/approval/error).
|
|
1133
|
-
// Si el backend cierra la conexión sin emitirlo, limpiamos el indicador en el
|
|
1134
|
-
// `finally` para que no quede trabado en "Escribiendo la respuesta".
|
|
1135
|
-
streamSettled = false;
|
|
1136
|
-
_context5.prev = 3;
|
|
1137
|
-
_context5.next = 4;
|
|
1138
|
-
return maia.Orchestrator.continueThread({
|
|
1139
|
-
threadIds: threadIds,
|
|
1140
|
-
// Send all action thread_ids at once
|
|
1141
|
-
sessionId: approval.session_id,
|
|
1142
|
-
decision: editedActions ? 'edit' : decision,
|
|
1143
|
-
editedActions: editedActions,
|
|
1144
|
-
agentId: (agent === null || agent === void 0 ? void 0 : agent.id) || '',
|
|
1145
|
-
lang: authUser.lang
|
|
1146
|
-
});
|
|
1147
|
-
case 4:
|
|
1148
|
-
response = _context5.sent;
|
|
1149
|
-
if (response.ok) {
|
|
1150
|
-
_context5.next = 5;
|
|
1151
|
-
break;
|
|
1244
|
+
commitToSession(sessionId, _objectSpread(_objectSpread({}, messageWithApproval), {}, {
|
|
1245
|
+
approvalStatus: newStatus
|
|
1246
|
+
}));
|
|
1247
|
+
streamMessageId = uuidv4();
|
|
1248
|
+
if (isActiveSession) {
|
|
1249
|
+
currentMessageId.current = streamMessageId;
|
|
1152
1250
|
}
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
updateStreamActivity(nodeActivity);
|
|
1175
|
-
setActiveLoadings(function (prev) {
|
|
1176
|
-
return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, currentThreadId, nodeActivity.message));
|
|
1177
|
-
});
|
|
1178
|
-
},
|
|
1179
|
-
onComplete: function onComplete(finalContent, sources, memorySessionId, currentThreadId, attachments, suggestions, agentId) {
|
|
1180
|
-
streamSettled = true;
|
|
1181
|
-
setIsContinuingStream(false);
|
|
1182
|
-
handleStreamFinish(finalContent, sources, memorySessionId, attachments, suggestions, agentId);
|
|
1183
|
-
updateStreamActivity(null);
|
|
1184
|
-
hitlExecutionContextRef.current = null;
|
|
1185
|
-
setActiveLoadings(function (prev) {
|
|
1186
|
-
var newLoadings = _objectSpread({}, prev);
|
|
1187
|
-
delete newLoadings[currentThreadId];
|
|
1188
|
-
return newLoadings;
|
|
1189
|
-
});
|
|
1251
|
+
hitlCtx = {
|
|
1252
|
+
sessionId: sessionId,
|
|
1253
|
+
messageId: streamMessageId,
|
|
1254
|
+
placeholderId: "answer-".concat(streamMessageId, "-streaming")
|
|
1255
|
+
};
|
|
1256
|
+
releaseActiveProcessing = function releaseActiveProcessing() {
|
|
1257
|
+
if (!isActiveSession) return;
|
|
1258
|
+
isProcessingRef.current = false;
|
|
1259
|
+
hitlExecutionContextRef.current = null;
|
|
1260
|
+
};
|
|
1261
|
+
_context4.next = 7;
|
|
1262
|
+
return sessionStreamManager.startContinueStream({
|
|
1263
|
+
sessionId: sessionId,
|
|
1264
|
+
placeholderId: hitlCtx.placeholderId,
|
|
1265
|
+
continueRequest: {
|
|
1266
|
+
threadIds: threadIds,
|
|
1267
|
+
sessionId: approval.session_id,
|
|
1268
|
+
decision: editedActions ? 'edit' : decision,
|
|
1269
|
+
editedActions: editedActions,
|
|
1270
|
+
agentId: (agent === null || agent === void 0 ? void 0 : agent.id) || '',
|
|
1271
|
+
lang: authUser.lang
|
|
1190
1272
|
},
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1273
|
+
t: t,
|
|
1274
|
+
hitlExecutionContext: hitlContext,
|
|
1275
|
+
agentId: agent === null || agent === void 0 ? void 0 : agent.id,
|
|
1276
|
+
agentName: agent === null || agent === void 0 ? void 0 : agent.name,
|
|
1277
|
+
callbacks: {
|
|
1278
|
+
onStreamUpdate: function onStreamUpdate(content) {
|
|
1279
|
+
return handleStreamUpdate(hitlCtx, content);
|
|
1280
|
+
},
|
|
1281
|
+
onFinishStream: function onFinishStream(finishPayload) {
|
|
1282
|
+
releaseActiveProcessing();
|
|
1283
|
+
handleStreamFinish(hitlCtx, finishPayload.content, finishPayload.sources, finishPayload.memorySessionId, finishPayload.attachments, finishPayload.suggestions, finishPayload.completedAgentId);
|
|
1284
|
+
},
|
|
1285
|
+
onError: function onError() {
|
|
1286
|
+
releaseActiveProcessing();
|
|
1287
|
+
handleStreamError(hitlCtx);
|
|
1288
|
+
},
|
|
1289
|
+
onApprovalRequired: function onApprovalRequired(approvalPayload, accumulatedContent) {
|
|
1290
|
+
releaseActiveProcessing();
|
|
1291
|
+
handleApprovalRequired(hitlCtx, approvalPayload, accumulatedContent);
|
|
1205
1292
|
}
|
|
1206
|
-
handleApprovalRequired(approvalPayload, accumulatedContent);
|
|
1207
|
-
},
|
|
1208
|
-
onError: function onError() {
|
|
1209
|
-
streamSettled = true;
|
|
1210
|
-
setIsContinuingStream(false);
|
|
1211
|
-
handleStreamError();
|
|
1212
1293
|
}
|
|
1213
1294
|
});
|
|
1214
|
-
case 6:
|
|
1215
|
-
_context5.next = 8;
|
|
1216
|
-
break;
|
|
1217
1295
|
case 7:
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
updateStreamActivity(null);
|
|
1231
|
-
hitlExecutionContextRef.current = null;
|
|
1232
|
-
setActiveLoadings(function (prev) {
|
|
1233
|
-
if (!(loadingKey in prev)) return prev;
|
|
1234
|
-
var newLoadings = _objectSpread({}, prev);
|
|
1235
|
-
delete newLoadings[loadingKey];
|
|
1236
|
-
return newLoadings;
|
|
1237
|
-
});
|
|
1296
|
+
result = _context4.sent;
|
|
1297
|
+
if (!result.started) {
|
|
1298
|
+
releaseActiveProcessing();
|
|
1299
|
+
if (result.reason === 'limit') {
|
|
1300
|
+
document.dispatchEvent(new CustomEvent('snackbar-event', {
|
|
1301
|
+
detail: {
|
|
1302
|
+
show: true,
|
|
1303
|
+
severity: 'info',
|
|
1304
|
+
message: t('chat.tooManyActiveSessions')
|
|
1305
|
+
}
|
|
1306
|
+
}));
|
|
1307
|
+
}
|
|
1238
1308
|
}
|
|
1239
|
-
|
|
1240
|
-
case 9:
|
|
1309
|
+
case 8:
|
|
1241
1310
|
case "end":
|
|
1242
|
-
return
|
|
1311
|
+
return _context4.stop();
|
|
1243
1312
|
}
|
|
1244
|
-
},
|
|
1313
|
+
}, _callee4);
|
|
1245
1314
|
}));
|
|
1246
|
-
return function (
|
|
1247
|
-
return
|
|
1315
|
+
return function (_x15, _x16, _x17) {
|
|
1316
|
+
return _ref9.apply(this, arguments);
|
|
1248
1317
|
};
|
|
1249
|
-
}(), [authUser, agent,
|
|
1250
|
-
var initializeChat = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function
|
|
1251
|
-
var _userInitialMessage$m, _userInitialMessage$a,
|
|
1252
|
-
return _regeneratorRuntime.wrap(function (
|
|
1253
|
-
while (1) switch (
|
|
1318
|
+
}(), [authUser, agent, commitToSession, handleStreamError, handleStreamUpdate, handleStreamFinish, handleApprovalRequired, t]);
|
|
1319
|
+
var initializeChat = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5() {
|
|
1320
|
+
var _userInitialMessage$m, _userInitialMessage$a, _ref1, _resolveProjectToRequ, _ctxProject$id, _ctxClient$id, _ctxTask$id, _ctxChipsProject$proj, hasInitialMessage, hasInitialAttachments, hasInitialFaq, hasInitialFua, hasInitialSc, history, _contextRef$current2, ctxChipsProject, ctxProject, ctxClient, ctxTask, projectToRequest, initialDisplayMessage;
|
|
1321
|
+
return _regeneratorRuntime.wrap(function (_context5) {
|
|
1322
|
+
while (1) switch (_context5.prev = _context5.next) {
|
|
1254
1323
|
case 0:
|
|
1255
1324
|
if (!firstTimeRef.current) {
|
|
1256
1325
|
firstTimeRef.current = true;
|
|
1257
1326
|
}
|
|
1258
1327
|
if (!initialChatId) {
|
|
1259
|
-
|
|
1328
|
+
_context5.next = 2;
|
|
1260
1329
|
break;
|
|
1261
1330
|
}
|
|
1262
|
-
|
|
1331
|
+
_context5.next = 1;
|
|
1263
1332
|
return loadMessages();
|
|
1264
1333
|
case 1:
|
|
1265
|
-
|
|
1334
|
+
_context5.next = 4;
|
|
1266
1335
|
break;
|
|
1267
1336
|
case 2:
|
|
1268
1337
|
if (!userInitialMessage) {
|
|
1269
|
-
|
|
1338
|
+
_context5.next = 4;
|
|
1270
1339
|
break;
|
|
1271
1340
|
}
|
|
1272
1341
|
hasInitialMessage = Boolean((_userInitialMessage$m = userInitialMessage.message) === null || _userInitialMessage$m === void 0 ? void 0 : _userInitialMessage$m.trim());
|
|
@@ -1275,10 +1344,10 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
1275
1344
|
hasInitialFua = Boolean(userInitialMessage.fuaId);
|
|
1276
1345
|
hasInitialSc = Boolean(userInitialMessage.scId);
|
|
1277
1346
|
if (!(!hasInitialMessage && !hasInitialAttachments && !hasInitialFaq && !hasInitialFua && !hasInitialSc)) {
|
|
1278
|
-
|
|
1347
|
+
_context5.next = 3;
|
|
1279
1348
|
break;
|
|
1280
1349
|
}
|
|
1281
|
-
return
|
|
1350
|
+
return _context5.abrupt("return");
|
|
1282
1351
|
case 3:
|
|
1283
1352
|
history = messagesRef.current.map(function (historyMessage) {
|
|
1284
1353
|
return {
|
|
@@ -1287,8 +1356,29 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
1287
1356
|
};
|
|
1288
1357
|
});
|
|
1289
1358
|
_contextRef$current2 = contextRef.current, ctxChipsProject = _contextRef$current2.chipsProject, ctxProject = _contextRef$current2.project, ctxClient = _contextRef$current2.client, ctxTask = _contextRef$current2.task;
|
|
1290
|
-
projectToRequest = (
|
|
1291
|
-
|
|
1359
|
+
projectToRequest = (_ref1 = (_resolveProjectToRequ = resolveProjectToRequest(ctxChipsProject, null)) !== null && _resolveProjectToRequ !== void 0 ? _resolveProjectToRequ : ctxProject === null || ctxProject === void 0 ? void 0 : ctxProject.id) !== null && _ref1 !== void 0 ? _ref1 : null;
|
|
1360
|
+
console.info('[useChatManager] PATH=initializeChat/userInitialMessage — contextRef resolution:', {
|
|
1361
|
+
projectPropId: (_ctxProject$id = ctxProject === null || ctxProject === void 0 ? void 0 : ctxProject.id) !== null && _ctxProject$id !== void 0 ? _ctxProject$id : null,
|
|
1362
|
+
clientId: (_ctxClient$id = ctxClient === null || ctxClient === void 0 ? void 0 : ctxClient.id) !== null && _ctxClient$id !== void 0 ? _ctxClient$id : null,
|
|
1363
|
+
taskId: (_ctxTask$id = ctxTask === null || ctxTask === void 0 ? void 0 : ctxTask.id) !== null && _ctxTask$id !== void 0 ? _ctxTask$id : null,
|
|
1364
|
+
chipsProjectId: (_ctxChipsProject$proj = ctxChipsProject === null || ctxChipsProject === void 0 ? void 0 : ctxChipsProject.projectId) !== null && _ctxChipsProject$proj !== void 0 ? _ctxChipsProject$proj : null,
|
|
1365
|
+
projectToRequest: projectToRequest,
|
|
1366
|
+
agentType: agent === null || agent === void 0 ? void 0 : agent.type
|
|
1367
|
+
});
|
|
1368
|
+
initialDisplayMessage = formatQuickActionMessageForDisplay(userInitialMessage.message, {
|
|
1369
|
+
fuaId: userInitialMessage.fuaId,
|
|
1370
|
+
scId: userInitialMessage.scId
|
|
1371
|
+
});
|
|
1372
|
+
ensureSessionInSidebar({
|
|
1373
|
+
sessionId: currentChatId.current,
|
|
1374
|
+
title: buildSidebarSessionTitle(initialDisplayMessage),
|
|
1375
|
+
agent: agent,
|
|
1376
|
+
agentId: agent === null || agent === void 0 ? void 0 : agent.id,
|
|
1377
|
+
project: ctxProject,
|
|
1378
|
+
client: ctxClient,
|
|
1379
|
+
attachments: userInitialMessage.attachments
|
|
1380
|
+
});
|
|
1381
|
+
askMaia(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
|
|
1292
1382
|
message: userInitialMessage.message,
|
|
1293
1383
|
history: history,
|
|
1294
1384
|
projectId: projectToRequest,
|
|
@@ -1325,6 +1415,8 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
1325
1415
|
agentEntity: agent.entity
|
|
1326
1416
|
} : {}), (agent === null || agent === void 0 ? void 0 : agent.type) != null ? {
|
|
1327
1417
|
agentType: agent.type
|
|
1418
|
+
} : {}), (agent === null || agent === void 0 ? void 0 : agent.emoji) != null ? {
|
|
1419
|
+
agentEmoji: agent.emoji
|
|
1328
1420
|
} : {}), buildContextMessage(userInitialMessage.mentions) ? {
|
|
1329
1421
|
contextMessage: buildContextMessage(userInitialMessage.mentions)
|
|
1330
1422
|
} : {}), userInitialMessage.contextData ? {
|
|
@@ -1332,31 +1424,31 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
1332
1424
|
} : {}));
|
|
1333
1425
|
case 4:
|
|
1334
1426
|
case "end":
|
|
1335
|
-
return
|
|
1427
|
+
return _context5.stop();
|
|
1336
1428
|
}
|
|
1337
|
-
},
|
|
1429
|
+
}, _callee5);
|
|
1338
1430
|
})), [initialChatId, userInitialMessage, project, client, task, authUser, agent, askMaia, isWebSearchActive, isDeepSearchActive]);
|
|
1339
1431
|
var resetChat = useCallback(function () {
|
|
1340
|
-
|
|
1432
|
+
var previousSessionId = currentChatId.current;
|
|
1433
|
+
sessionStreamingText.clear(previousSessionId);
|
|
1341
1434
|
currentMessageId.current = uuidv4();
|
|
1342
1435
|
currentUserQuestion.current = null;
|
|
1343
1436
|
currentChatId.current = uuidv4();
|
|
1437
|
+
setActiveSessionId(currentChatId.current);
|
|
1344
1438
|
reportedEvent.current = false;
|
|
1345
1439
|
streamingPlaceholderIdRef.current = null;
|
|
1346
1440
|
activeStreamChatIdRef.current = null;
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
}, []);
|
|
1441
|
+
setActiveChatId(null);
|
|
1442
|
+
}, [setActiveChatId]);
|
|
1350
1443
|
var stopGeneration = useCallback(function () {
|
|
1351
1444
|
stopStreaming();
|
|
1352
1445
|
isProcessingRef.current = false;
|
|
1353
|
-
setIsContinuingStream(false);
|
|
1354
1446
|
}, [stopStreaming]);
|
|
1355
1447
|
return {
|
|
1356
1448
|
messages: messages,
|
|
1357
1449
|
loadingMessages: loadingMessages,
|
|
1358
1450
|
isLoadingMoreMessages: isLoadingMoreMessages,
|
|
1359
|
-
waitingResponse: waitingResponse
|
|
1451
|
+
waitingResponse: waitingResponse,
|
|
1360
1452
|
isWriting: isWriting,
|
|
1361
1453
|
loadingMessage: loadingMessage,
|
|
1362
1454
|
streamActivity: streamActivity,
|
|
@@ -1372,7 +1464,7 @@ export var useChatManager = function useChatManager(_ref3) {
|
|
|
1372
1464
|
initializeChat: initializeChat,
|
|
1373
1465
|
resetChat: resetChat,
|
|
1374
1466
|
stopGeneration: stopGeneration,
|
|
1375
|
-
isDisabled: waitingResponse ||
|
|
1467
|
+
isDisabled: waitingResponse || loadingMessages
|
|
1376
1468
|
};
|
|
1377
1469
|
};
|
|
1378
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVJlZiIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwidjQiLCJ1dWlkdjQiLCJ1c2VDaGF0TWVzc2FnZXMiLCJ1c2VPcmNoZXN0cmF0b3JTdHJlYW0iLCJ1c2VUIiwidXNlVXNlciIsInVzZUdsb2JhbENvbnRleHQiLCJFVkVOVFMiLCJ1c2VFdmVudCIsIm1haWEiLCJGZWVkYmFjayIsIkNoYXRIaXN0b3J5Um9sZSIsImJ1aWxkQ29udGV4dE1lc3NhZ2UiLCJmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5IiwidXNlUHJvamVjdHMiLCJ1c2VUYWJUYXNrRGVmYXVsdCIsIlRBU0tfVVJMX1JFR0VYX1BBVFRFUk4iLCJkaXNwYXRjaE1haWFIb3Vyc0NoYXJnZWQiLCJpc0hvdXJzQ2hhcmdlVG9vbCIsImZldGNoQWdlbnREZXRhaWwiLCJidWlsZEhpdGxBY3Rpb25UeXBlTGlzdCIsImdldEhpdGxBbmFseXRpY3NBZ2VudFR5cGUiLCJnZXRUaGlua2luZ0xvYWRpbmdNZXNzYWdlIiwiZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5IiwicmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHkiLCJyZXNvbHZlSW5pdGlhbEhpdGxTdHJlYW1BY3Rpdml0eSIsInN0cmVhbWluZ1N0b3JlIiwiaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkIiwibWVyZ2VTdHJlYW1DaHVuayIsIm5vcm1hbGl6ZVNlbmRNZXNzYWdlQXJncyIsImF0dGFjaG1lbnRzT3JPcHRpb25zIiwiX29wdGlvbnMkYXR0YWNobWVudHMiLCJBcnJheSIsImlzQXJyYXkiLCJhdHRhY2htZW50cyIsIm9wdGlvbnMiLCJyZXNvbHZlUHJvamVjdFRvUmVxdWVzdCIsImNoaXBzUHJvamVjdCIsImxhc3RNZXNzYWdlUHJvamVjdElkIiwiY2hpcHNQcm9qZWN0SWQiLCJwcm9qZWN0SWQiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsInBhcnNlZCIsInJlc29sdmVDbGllbnRQYXlsb2FkIiwiY3R4Q2xpZW50IiwiY3R4UHJvamVjdCIsIl9jdHhQcm9qZWN0JGNsaWVudCIsImlkIiwiX29iamVjdFNwcmVhZCIsImNsaWVudElkIiwibmFtZSIsImNsaWVudE5hbWUiLCJjbGllbnQiLCJub3JtYWxpemVBc3Npc3RhbnRBdHRhY2htZW50cyIsInJhd0F0dGFjaG1lbnRzIiwiZmlsdGVyIiwiYXR0YWNobWVudCIsIl90eXBlb2YiLCJtYXAiLCJpbmRleCIsInRyaW0iLCJjb25jYXQiLCJ0eXBlIiwibWltZVR5cGUiLCJtaW1lX3R5cGUiLCJmdWxsRmlsZU5hbWUiLCJpbmNsdWRlcyIsIm51bWVyaWNTaXplIiwic2l6ZSIsImZpbGUiLCJGaWxlIiwidXJsX29yaWdpbmFsIiwidW5kZWZpbmVkIiwidXJsX3RodW1ibmFpbCIsInVybF9maWxlIiwicm9sZSIsImV4dHJhY3RUYXNrSWRzRnJvbVBlbmRpbmdBY3Rpb25zQXJncyIsInBlbmRpbmdBY3Rpb25zIiwiaWRzIiwicHVzaElkIiwicmF3IiwibiIsInBhcnNlSW50IiwiU3RyaW5nIiwiaXNOYU4iLCJwdXNoIiwiZm9yRWFjaCIsImFjdGlvbiIsIl9yZWMkdGFza19pZCIsImFyZ3MiLCJ0b29sX2FyZ3MiLCJyZWMiLCJ0YXNrX2lkIiwidGFza19pZHMiLCJ0YXNrcyIsInQiLCJfdHJlYyR0YXNrX2lkIiwidHJlYyIsImV4dHJhY3RUYXNrSWRzRnJvbURlbGV0ZVBlbmRpbmdBY3Rpb25zIiwidG9vbF9uYW1lIiwiX3JlYyR0YXNrX2lkMiIsImxpc3QiLCJ0aWQiLCJleHRyYWN0QWdlbnRJZEZyb21FZGl0QWdlbnRQZW5kaW5nQWN0aW9ucyIsIl9yZWMkYWdlbnRfaWQiLCJlZGl0QWN0aW9uIiwiZmluZCIsImEiLCJ0b0xvd2VyQ2FzZSIsImFnZW50X2lkIiwiYWdlbnRJZCIsImV4dHJhY3RBZ2VudElkRnJvbVBlbmRpbmdBY3Rpb25zQnlUb29sTmFtZSIsInRvb2xOYW1lIiwiX3JlZiIsIl9yZWMkYWdlbnRfaWQyIiwiZXh0cmFjdFRhc2tJZHNGcm9tQXNzaXN0YW50RGVsZXRpb25UZXh0IiwidGV4dCIsImxhYmVsZWQiLCJtYXRjaCIsImJvbGQiLCJ1c2VTdGFibGVDYWxsYmFja3MiLCJhdXRoVXNlciIsImN1cnJlbnRVc2VyIiwidG9TdHJpbmciLCJmaXJzdE5hbWUiLCJhdmF0YXIiLCJwaWN0dXJlIiwiY3VycmVudCIsInBhcnNlU1NFTGluZSIsImxpbmUiLCJfbGluZSRzcGxpdCIsInNwbGl0IiwiX2xpbmUkc3BsaXQyIiwiX3NsaWNlZFRvQXJyYXkiLCJldmVudExpbmUiLCJkYXRhTGluZSIsImV2ZW50VHlwZSIsInJlcGxhY2UiLCJkYXRhU3RyIiwiZGF0YSIsIkpTT04iLCJwYXJzZSIsInBhcnNlRXJyb3IiLCJjb25zb2xlIiwiZXJyb3IiLCJwcm9jZXNzU1NFU3RyZWFtIiwiX3JlZjIiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsInJlc3BvbnNlIiwidGhyZWFkSWQiLCJjYWxsYmFja3MiLCJfcmVzcG9uc2UkYm9keSIsInJlYWRlciIsImRlY29kZXIiLCJidWZmZXIiLCJhY2N1bXVsYXRlZENvbnRlbnQiLCJzdHJlYW1TZXR0bGVkIiwibm90aWZ5Q29tcGxldGUiLCJoYW5kbGVMaW5lIiwiaXNSZWFkZXJEb25lIiwiX3lpZWxkJHJlYWRlciRyZWFkIiwiZG9uZSIsInZhbHVlIiwibGluZXMiLCJpIiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJfaGFuZGxlTGluZSIsImV2ZW50RGF0YSIsIm9uVGhpbmtpbmciLCJjb250ZW50Iiwib25Ub2tlbiIsIm1lc3NhZ2UiLCJvbk5vZGUiLCJmaW5hbENvbnRlbnQiLCJfY2FsbGJhY2tzJG9uQXBwcm92YWwiLCJpc01hbnVhbEFwcHJvdmFsIiwibWFudWFsX2FwcHJvdmFsX2RldGVjdGVkIiwib25BcHByb3ZhbFJlcXVpcmVkIiwiY2FsbCIsIm9uRXJyb3IiLCJib2R5IiwiZ2V0UmVhZGVyIiwiRXJyb3IiLCJUZXh0RGVjb2RlciIsIl9ldmVudERhdGEkYWdlbnRfaWQiLCJzb3VyY2VzIiwibWVtb3J5U2Vzc2lvbklkIiwibWVtb3J5X3Nlc3Npb25faWQiLCJzdWdnZXN0aW9ucyIsInN1Z2dlc3RfcmVwbHkiLCJhZ2VudElkUmF3IiwiY29tcGxldGVkQWdlbnRJZCIsIm9uQ29tcGxldGUiLCJyZWFkIiwic2VudCIsImFicnVwdCIsImRlY29kZSIsInN0cmVhbSIsInBvcCIsImxlbmd0aCIsInN0b3AiLCJfeCIsIl94MiIsIl94MyIsImFwcGx5IiwiYXJndW1lbnRzIiwidXNlQ2hhdE1hbmFnZXIiLCJfcmVmMyIsImluaXRpYWxDaGF0SWQiLCJjaGF0SWQiLCJ1c2VySW5pdGlhbE1lc3NhZ2UiLCJfcmVmMyRhZ2VudHMiLCJhZ2VudHMiLCJfdXNlVCIsIl91c2VHbG9iYWxDb250ZXh0IiwicHJvamVjdCIsInNldFByb2plY3QiLCJzZXRDbGllbnQiLCJ0YXNrIiwic2V0VGFzayIsImFnZW50IiwiaXNXZWJTZWFyY2hBY3RpdmUiLCJpc0RlZXBTZWFyY2hBY3RpdmUiLCJzZXRDaGlwc1Byb2plY3QiLCJldmVudCIsIl91c2VQcm9qZWN0cyIsImZldGNoUHJvamVjdHMiLCJfdXNlU3RhYmxlQ2FsbGJhY2tzIiwiX3VzZVRhYlRhc2tEZWZhdWx0IiwiZ2V0VGFiVGFza0RlZmF1bHQiLCJjdXJyZW50TWVzc2FnZUlkIiwiY3VycmVudFVzZXJRdWVzdGlvbiIsImN1cnJlbnRDaGF0SWQiLCJyZXBvcnRlZEV2ZW50IiwibWVzc2FnZXNSZWYiLCJsYXN0TWFudWFsQXBwcm92YWxSZWYiLCJoaXRsRXhlY3V0aW9uQ29udGV4dFJlZiIsImlzUHJvY2Vzc2luZ1JlZiIsImZpcnN0VGltZVJlZiIsInN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYiLCJhY3RpdmVTdHJlYW1DaGF0SWRSZWYiLCJhYm9ydFN0cmVhbVNpbGVudGx5UmVmIiwiY2xlYXJTdHJlYW1VaVJlZiIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJhY3RpdmVMb2FkaW5ncyIsInNldEFjdGl2ZUxvYWRpbmdzIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJpc0NvbnRpbnVpbmdTdHJlYW0iLCJzZXRJc0NvbnRpbnVpbmdTdHJlYW0iLCJpc1dlYlNlYXJjaEFjdGl2ZVJlZiIsImlzRGVlcFNlYXJjaEFjdGl2ZVJlZiIsImNvbnRleHRSZWYiLCJfdXNlQ2hhdE1lc3NhZ2VzIiwibG9hZGluZ01lc3NhZ2VzIiwibWVzc2FnZXMiLCJpc0xvYWRpbmdNb3JlTWVzc2FnZXMiLCJsb2FkTWVzc2FnZXMiLCJhZGRNZXNzYWdlIiwicmVtb3ZlTWVzc2FnZSIsImhhbmRsZVNjcm9sbCIsImN1c3RvbUV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJkZXRhaWwiLCJkb2N1bWVudCIsImRpc3BhdGNoRXZlbnQiLCJjbGVhciIsImhhbmRsZVN0cmVhbUVycm9yIiwiZXJyb3JNZXNzYWdlIiwiZXJyb3JSYXdNZXNzYWdlIiwiX2Vycm9yUmF3TWVzc2FnZSRtYXRjIiwiX2Vycm9yUmF3TWVzc2FnZSRtYXRjMiIsInRlbXBNZXNzYWdlSWQiLCJpc0FjY2Vzc0RlbmllZCIsImlzUHJvbXB0VG9vTG9uZyIsInVzZWQiLCJpc0Vycm9yIiwiZGF0ZSIsIkRhdGUiLCJ1c2VyIiwiQVNTSVNUQU5UIiwiaGFuZGxlU3RyZWFtVXBkYXRlIiwic3RhcnQiLCJzZXRUZXh0IiwiaGFuZGxlU3RyZWFtRmluaXNoIiwiX3JlZjQiLCJfY2FsbGVlMiIsIl9wcmV2aW91c01lc3NhZ2UkYXBwciIsIl93aW5kb3ckdGFza1BhbmVsIiwiX2NyZWF0ZUFnZW50Rm9sbG93VXAiLCJfZWRpdEFnZW50Rm9sbG93VXAiLCJ0YXNrVXJsUmVnZXgiLCJtYXRjaGVzIiwiY29udGVudFRvQWRkIiwicHJldmlvdXNNZXNzYWdlIiwiaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSIsIlRBU0tfQ1JFQVRJT05fVE9PTFMiLCJUQVNLX0VESVRfVE9PTFMiLCJUQVNLX0RFTEVURV9UT09MUyIsIndhc1Rhc2tDcmVhdGlvbiIsIndhc1Rhc2tFZGl0Iiwid2FzVGFza0RlbGV0ZSIsIndhc0NyZWF0ZUFnZW50QXBwcm92ZWQiLCJ3YXNDb25maWd1cmVBZ2VudEFjY2Vzc0FwcHJvdmVkIiwiY3JlYXRlQWdlbnRGb2xsb3dVcCIsImNvbmZpZ3VyZWRBZ2VudElkIiwid2FzRWRpdEFnZW50QXBwcm92ZWQiLCJlZGl0QWdlbnRGb2xsb3dVcCIsImZyb21TdHJlYW0iLCJmcm9tQXJncyIsInJlc29sdmVkQWdlbnRJZCIsInRhc2tJZHNGcm9tVXJscyIsInRhc2tJZHNGcm9tRGVsZXRlQXBwcm92YWwiLCJ0YXNrSWRzRnJvbURlbGV0aW9uVGV4dCIsInRhc2tJZHNGb3JEYXNoYm9hcmQiLCJzaG91bGRTeW5jRGFzaGJvYXJkIiwidGFza0lkcyIsInRhYiIsInRhYlNlZ21lbnQiLCJsYXN0UHJvamVjdE1lc3NhZ2UiLCJjb250ZXh0UHJvamVjdElkUmF3IiwiY29udGV4dFByb2plY3RJZCIsInBhdGhNYXRjaCIsInJvdXRlUHJvamVjdElkIiwiaXNPblByb2plY3RSb3V0ZSIsIl93aW5kb3ckbmV3UHJvamVjdERhcyIsIl93aW5kb3ckbmV3UHJvamVjdERhczIiLCJfd2luZG93JG5ld1Byb2plY3REYXMzIiwiX3dpbmRvdyRuZXdQcm9qZWN0RGFzNCIsIl93aW5kb3ckbmV3UHJvamVjdERhczUiLCJfd2luZG93JG5ld1Byb2plY3REYXM2Iiwib3BlblRhc2tQYW5lbElkIiwibWFudWFsQXBwcm92YWwiLCJtYW51YWxXYXNUYXNrRWRpdCIsIm1hbnVhbFdhc1Rhc2tEZWxldGUiLCJob3Vyc1Rvb2xzRnJvbUFwcHJvdmFsIiwid2FzSG91cnNDaGFyZ2VBcHByb3ZlZCIsIm1hbnVhbEhvdXJzVG9vbCIsIndhc0hvdXJzQ2hhcmdlTWFudWFsQXBwcm92ZWQiLCJ0b29scyIsIl9tYW51YWxBcHByb3ZhbCR0b29sQSIsIm1hbnVhbFBzZXVkb0FjdGlvbiIsImFmZmVjdGVkVGFza0lkcyIsIl93aW5kb3ckdGFza1BhbmVsMiIsIl93aW5kb3ckdGFza1BhbmVsMiRyZSIsIl9jb250ZXh0MiIsIlJlZ0V4cCIsIl90b0NvbnN1bWFibGVBcnJheSIsIm1hdGNoQWxsIiwibSIsImF0IiwiYXBwcm92YWwiLCJwZW5kaW5nX2FjdGlvbnMiLCJzb21lIiwiYXBwcm92YWxTdGF0dXMiLCJ3aW5kb3ciLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTIiwiYWlDaGF0SGl0bE9wdGlvbiIsImFnZW50X3R5cGUiLCJhY3Rpb25fdHlwZSIsImRlY2lzaW9uIiwib3B0aW9uIiwiY3JlYXRlZF9hZ2VudF9pZCIsInVybCIsIm1zZyIsImxvY2F0aW9uIiwicGF0aG5hbWUiLCJuZXdQcm9qZWN0RGFzaGJvYXJkIiwiYWRkRXhpc3RpbmdUYXNrVG9EYXNoYm9hcmQiLCJlZGl0RXhpc3RpbmdUYXNrSW5EYXNoYm9hcmQiLCJkZWxldGVFeGlzdGluZ1Rhc2tGcm9tRGFzaGJvYXJkIiwidGFza1BhbmVsIiwidGFza0lkIiwic291cmNlIiwic2Vzc2lvbklkIiwidG9vbEFyZ3MiLCJyZWZldGNoVGFzayIsInRoZW4iLCJjaGF0QWdlbnQiLCJlcnIiLCJfeDQiLCJfeDUiLCJfeDYiLCJfeDciLCJfeDgiLCJfeDkiLCJoYW5kbGVTdHJlYW1TdG9wIiwiaXNGcm9udGVuZENhbmNlbGxlZCIsInNldFRpbWVvdXQiLCJoYW5kbGVBcHByb3ZhbFJlcXVpcmVkIiwiX2FwcHJvdmFsJHBlbmRpbmdfYWN0IiwiaGl0bENvbnRleHQiLCJtZXNzYWdlSWQiLCJvcmlnaW5hbF90aHJlYWRfaWQiLCJtZXNzYWdlVGV4dCIsInRocmVhZElkcyIsInRocmVhZF9pZCIsIl9hcHByb3ZhbCRwZW5kaW5nX2FjdDIiLCJfcmVmNSIsIl90b29sX25hbWUiLCJfdG9vbF9hcmdzIiwiZmlyc3RBY3Rpb24iLCJfdXNlT3JjaGVzdHJhdG9yU3RyZWEiLCJvblN0cmVhbVVwZGF0ZSIsIm9uRmluaXNoU3RyZWFtIiwib25TdG9wIiwiYXNrTWFpYSIsIndhaXRpbmdSZXNwb25zZSIsImlzTG9hZGluZyIsImlzV3JpdGluZyIsImxvYWRpbmdNZXNzYWdlIiwic3RyZWFtQWN0aXZpdHkiLCJ1cGRhdGVTdHJlYW1BY3Rpdml0eSIsInN0b3BTdHJlYW1pbmciLCJhYm9ydFN0cmVhbVNpbGVudGx5IiwiY3VycmVudFByb2plY3QiLCJzZW5kTWVzc2FnZSIsIl9yZWY2IiwiX2NhbGxlZTMiLCJmYXFJZCIsImFnZW50U3VnZ2VzdGlvbklkIiwibWVudGlvbnMiLCJmdWFJZCIsInNjSWQiLCJfbWVzc2FnZXNSZWYkY3VycmVudCIsIl9ub3JtYWxpemVTZW5kTWVzc2FnZSIsImVmZmVjdGl2ZU1lbnRpb25zIiwiY29udGV4dE1lc3NhZ2UiLCJwYXlsb2FkRnVhSWQiLCJwYXlsb2FkU2NJZCIsInBheWxvYWRDb250ZXh0RGF0YSIsImRpc3BsYXlNZXNzYWdlIiwibmV3TWVzc2FnZUlkIiwibGFzdE1lc3NhZ2VXaXRoUHJvamVjdCIsImN1cnJlbnRBZ2VudEZyb21NZXNzYWdlcyIsInN0cmVhbWluZ1BsYWNlaG9sZGVySWQiLCJmaW5hbE1lc3NhZ2UiLCJfb3B0aW9ucyRwcm9qZWN0Q2hhbmciLCJfY29udGV4dFJlZiRjdXJyZW50JHAiLCJoaXN0b3J5IiwiX2NvbnRleHRSZWYkY3VycmVudCIsImN0eENoaXBzUHJvamVjdCIsImN0eFRhc2siLCJwcm9qZWN0VG9SZXF1ZXN0IiwicHJvamVjdHMiLCJwYXlsb2FkRmFxSWQiLCJwYXlsb2FkQWdlbnRTdWdnZXN0aW9uSWQiLCJwYXlsb2FkRGF0YSIsIl9jb250ZXh0MyIsImNvbnRleHREYXRhIiwicG1BaVR5cGVkVGV4dCIsIlVTRVIiLCJwcm9qZWN0Q2hhbmdlZCIsImluY29tZVR5cGUiLCJoaXN0b3J5TWVzc2FnZSIsImxhbmciLCJ1c2VySWQiLCJsYXN0TmFtZSIsImNvbXBhbnlJZCIsImNvbXBhbnlfaWQiLCJhZ2VudE5hbWUiLCJmZWVJZCIsInByb2plY3ROYW1lIiwidGFza05hbWUiLCJlbnRpdHkiLCJhZ2VudEVudGl0eSIsImFnZW50VHlwZSIsIl94MCIsIl94MSIsIl94MTAiLCJfeDExIiwiX3gxMiIsIl94MTMiLCJfeDE0IiwiY2hhbmdlUHJvamVjdCIsImhhbmRsZUZlZWRiYWNrIiwiX3JlZjciLCJfY2FsbGVlNCIsImZlZWRiYWNrUHJvcCIsImNoYXRNZXNzYWdlSWQiLCJfY29udGV4dDQiLCJDaGF0cyIsIndhc0hlbHBmdWxDaGF0IiwiVEhVTUJTX1VQIiwid2FzSGVscGZ1bCIsIl94MTUiLCJfeDE2IiwiaGFuZGxlQXBwcm92YWxEZWNpc2lvbiIsIl9yZWY4IiwiX2NhbGxlZTUiLCJlZGl0ZWRBY3Rpb25zIiwibWVzc2FnZVdpdGhBcHByb3ZhbCIsImxvYWRpbmdLZXkiLCJpbml0aWFsQWN0aXZpdHkiLCJleGlzdGluZ01lc3NhZ2UiLCJuZXdTdGF0dXMiLCJfdCIsIl9jb250ZXh0NSIsIl9tJGFwcHJvdmFsIiwiX2RlZmluZVByb3BlcnR5IiwiT3JjaGVzdHJhdG9yIiwiY29udGludWVUaHJlYWQiLCJzZXNzaW9uX2lkIiwib2siLCJhY3Rpdml0eSIsInBoYXNlIiwiY3VycmVudFRocmVhZElkIiwibm9kZUFjdGl2aXR5IiwidXNlUmVzdW1pbmdGYWxsYmFjayIsIm5ld0xvYWRpbmdzIiwiYXBwcm92YWxQYXlsb2FkIiwiZmluaXNoIiwiX3gxNyIsIl94MTgiLCJfeDE5IiwiaW5pdGlhbGl6ZUNoYXQiLCJfY2FsbGVlNiIsIl91c2VySW5pdGlhbE1lc3NhZ2UkbSIsIl91c2VySW5pdGlhbE1lc3NhZ2UkYSIsIl9yZWYwIiwiX3Jlc29sdmVQcm9qZWN0VG9SZXF1IiwiaGFzSW5pdGlhbE1lc3NhZ2UiLCJoYXNJbml0aWFsQXR0YWNobWVudHMiLCJoYXNJbml0aWFsRmFxIiwiaGFzSW5pdGlhbEZ1YSIsImhhc0luaXRpYWxTYyIsIl9jb250ZXh0UmVmJGN1cnJlbnQyIiwiX2NvbnRleHQ2IiwiQm9vbGVhbiIsInJlc2V0Q2hhdCIsInN0b3BHZW5lcmF0aW9uIiwiaXNEaXNhYmxlZCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy91c2VDaGF0TWFuYWdlci91c2VDaGF0TWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSByYWRpeCAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tbmVzdGVkLXRlcm5hcnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRlZC1vcHRpb25hbC1jaGFpbiAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCdcbmltcG9ydCB7IHVzZUNoYXRNZXNzYWdlcyB9IGZyb20gJy4uL3VzZUNoYXRNZXNzYWdlcydcbmltcG9ydCB7IHVzZU9yY2hlc3RyYXRvclN0cmVhbSB9IGZyb20gJy4uL3VzZU9yY2hlc3RyYXRvclN0cmVhbSdcbmltcG9ydCB7IHVzZVQgfSBmcm9tICcuLi91c2VUJ1xuaW1wb3J0IHsgQXR0YWNobWVudEZpbGUgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL21vbGVjdWxlcy9DaGF0Rm9vdGVyL0NoYXRGb290ZXInXG5pbXBvcnQgeyBTZW5kTWVzc2FnZU9wdGlvbnMsIFVzZUNoYXRNYW5hZ2VyUHJvcHMgfSBmcm9tICcuL3VzZUNoYXRNYW5hZ2VyLmludGVyZmFjZSdcbmltcG9ydCB7IHVzZVVzZXIsIENPUlVzZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0L2Nvci11c2VyJ1xuaW1wb3J0IHsgdXNlR2xvYmFsQ29udGV4dCB9IGZyb20gJy4uLy4uL2NvbnRleHQvZ2xvYmFsLWNvbnRleHQnXG5pbXBvcnQgeyBFVkVOVFMsIHVzZUV2ZW50IH0gZnJvbSAnLi4vdXNlRXZlbnQnXG5pbXBvcnQgbWFpYSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tYWlhJ1xuaW1wb3J0IHsgRmVlZGJhY2sgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL21vbGVjdWxlcy9NZXNzYWdlRmVlZGJhY2svTWVzc2FnZUZlZWRiYWNrJ1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2UsIENoYXRNZXNzYWdlVXNlciwgQ2hhdEhpc3RvcnlSb2xlLCBBcHByb3ZhbFJlcXVlc3QsIFBlbmRpbmdBY3Rpb24gfSBmcm9tICcuLi8uLi90eXBlcy9DaGF0J1xuaW1wb3J0IHsgQ29udGV4dE1lbnRpb24sIENvbnRleHRNZXNzYWdlLCBidWlsZENvbnRleHRNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvY29udGV4dE1lbnRpb24nXG5pbXBvcnQgeyBmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5IH0gZnJvbSAnLi4vLi4vdXRpbHMvZm9ybWF0UXVpY2tBY3Rpb25NZXNzYWdlJ1xuXG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vdHlwZXMvUHJvamVjdCdcbmltcG9ydCB7IHVzZVByb2plY3RzIH0gZnJvbSAnLi4vdXNlUHJvamVjdHMnXG5pbXBvcnQgeyB1c2VUYWJUYXNrRGVmYXVsdCB9IGZyb20gJy4uL3VzZVRhYlRhc2tEZWZhdWx0J1xuaW1wb3J0IHsgVEFTS19VUkxfUkVHRVhfUEFUVEVSTiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy90YXNrVXJscydcbmltcG9ydCB7IGRpc3BhdGNoTWFpYUhvdXJzQ2hhcmdlZCwgaXNIb3Vyc0NoYXJnZVRvb2wgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvcGxhbm5lclN5bmNFdmVudHMnXG5pbXBvcnQgeyBmZXRjaEFnZW50RGV0YWlsIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWFpYS9BZ2VudHMvZmV0Y2hBZ2VudERldGFpbCdcbmltcG9ydCB7IGJ1aWxkSGl0bEFjdGlvblR5cGVMaXN0LCBnZXRIaXRsQW5hbHl0aWNzQWdlbnRUeXBlIH0gZnJvbSAnLi4vLi4vdXRpbHMvaGl0bEFuYWx5dGljcydcbmltcG9ydCB0eXBlIHsgU3RyZWFtQWN0aXZpdHkgfSBmcm9tICcuLi8uLi90eXBlcy9zdHJlYW1BY3Rpdml0eSdcbmltcG9ydCB7XG4gIGdldFRoaW5raW5nTG9hZGluZ01lc3NhZ2UsXG4gIGdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSxcbiAgcmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHksXG4gIHJlc29sdmVJbml0aWFsSGl0bFN0cmVhbUFjdGl2aXR5LFxuICB0eXBlIEhpdGxFeGVjdXRpb25Db250ZXh0LFxufSBmcm9tICcuLi8uLi91dGlscy9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuaW1wb3J0IHsgc3RyZWFtaW5nU3RvcmUgfSBmcm9tICcuLi91c2VTdHJlYW1pbmdNZXNzYWdlJ1xuaW1wb3J0IHsgaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkLCBtZXJnZVN0cmVhbUNodW5rIH0gZnJvbSAnLi4vLi4vdXRpbHMvc3NlU3RyZWFtQ29udGVudCdcblxudHlwZSBBdHRhY2htZW50c09yT3B0aW9ucyA9IEF0dGFjaG1lbnRGaWxlW10gfCBTZW5kTWVzc2FnZU9wdGlvbnNcblxuY29uc3Qgbm9ybWFsaXplU2VuZE1lc3NhZ2VBcmdzID0gKGF0dGFjaG1lbnRzT3JPcHRpb25zPzogQXR0YWNobWVudHNPck9wdGlvbnMpID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXR0YWNobWVudHNPck9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIHsgYXR0YWNobWVudHM6IGF0dGFjaG1lbnRzT3JPcHRpb25zLCBvcHRpb25zOiB7fSBhcyBTZW5kTWVzc2FnZU9wdGlvbnMgfVxuICB9XG5cbiAgY29uc3Qgb3B0aW9uczogU2VuZE1lc3NhZ2VPcHRpb25zID0gYXR0YWNobWVudHNPck9wdGlvbnMgPz8ge31cbiAgcmV0dXJuIHsgYXR0YWNobWVudHM6IG9wdGlvbnMuYXR0YWNobWVudHMgPz8gW10sIG9wdGlvbnMgfVxufVxuXG4vKiogY2hpcHNQcm9qZWN0IGVzIGxhIGZ1ZW50ZSBkZSB2ZXJkYWQgZGVsIHBpbiB2aXNpYmxlOyBzaSBubyBoYXkgcGluLCByZXN0YXVyYXIgZGVzZGUgaGlzdG9yaWFsLiAqL1xuY29uc3QgcmVzb2x2ZVByb2plY3RUb1JlcXVlc3QgPSAoXG4gIGNoaXBzUHJvamVjdDogeyBwcm9qZWN0SWQ/OiBzdHJpbmcgfSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGxhc3RNZXNzYWdlUHJvamVjdElkOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBudW1iZXIgfCBudWxsID0+IHtcbiAgY29uc3QgY2hpcHNQcm9qZWN0SWQgPSBjaGlwc1Byb2plY3Q/LnByb2plY3RJZCA/IE51bWJlcihjaGlwc1Byb2plY3QucHJvamVjdElkKSA6IG51bGxcbiAgaWYgKGNoaXBzUHJvamVjdElkICE9IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKGNoaXBzUHJvamVjdElkKSkge1xuICAgIHJldHVybiBjaGlwc1Byb2plY3RJZFxuICB9XG4gIGlmIChsYXN0TWVzc2FnZVByb2plY3RJZCAhPSBudWxsKSB7XG4gICAgY29uc3QgcGFyc2VkID0gTnVtYmVyKGxhc3RNZXNzYWdlUHJvamVjdElkKVxuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSA/IHBhcnNlZCA6IG51bGxcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5jb25zdCByZXNvbHZlQ2xpZW50UGF5bG9hZCA9IChcbiAgY3R4Q2xpZW50OiB7IGlkPzogbnVtYmVyOyBuYW1lPzogc3RyaW5nIH0gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBjdHhQcm9qZWN0OiBQcm9qZWN0IHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogeyBjbGllbnRJZD86IG51bWJlcjsgY2xpZW50TmFtZT86IHN0cmluZyB9ID0+IHtcbiAgaWYgKGN0eENsaWVudD8uaWQpIHtcbiAgICByZXR1cm4geyBjbGllbnRJZDogY3R4Q2xpZW50LmlkLCAuLi4oY3R4Q2xpZW50Lm5hbWUgPyB7IGNsaWVudE5hbWU6IGN0eENsaWVudC5uYW1lIH0gOiB7fSkgfVxuICB9XG4gIGlmIChjdHhQcm9qZWN0Py5jbGllbnRJZCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHsgY2xpZW50SWQ6IE51bWJlcihjdHhQcm9qZWN0LmNsaWVudElkKSB9XG4gIH1cbiAgaWYgKGN0eFByb2plY3Q/LmNsaWVudD8uaWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50SWQ6IGN0eFByb2plY3QuY2xpZW50LmlkLFxuICAgICAgLi4uKGN0eFByb2plY3QuY2xpZW50Lm5hbWUgPyB7IGNsaWVudE5hbWU6IGN0eFByb2plY3QuY2xpZW50Lm5hbWUgfSA6IHt9KSxcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHt9XG59XG5cbmNvbnN0IG5vcm1hbGl6ZUFzc2lzdGFudEF0dGFjaG1lbnRzID0gKHJhd0F0dGFjaG1lbnRzOiB1bmtub3duKTogQXR0YWNobWVudEZpbGVbXSA9PiB7XG4gIGlmICghQXJyYXkuaXNBcnJheShyYXdBdHRhY2htZW50cykpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHJldHVybiByYXdBdHRhY2htZW50c1xuICAgIC5maWx0ZXIoKGF0dGFjaG1lbnQpOiBhdHRhY2htZW50IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+ICEhYXR0YWNobWVudCAmJiB0eXBlb2YgYXR0YWNobWVudCA9PT0gJ29iamVjdCcpXG4gICAgLm1hcCgoYXR0YWNobWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPVxuICAgICAgICB0eXBlb2YgYXR0YWNobWVudC5uYW1lID09PSAnc3RyaW5nJyAmJiBhdHRhY2htZW50Lm5hbWUudHJpbSgpID8gYXR0YWNobWVudC5uYW1lLnRyaW0oKSA6IGBmaWxlLSR7aW5kZXggKyAxfWBcbiAgICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgYXR0YWNobWVudC50eXBlID09PSAnc3RyaW5nJyAmJiBhdHRhY2htZW50LnR5cGUudHJpbSgpID8gYXR0YWNobWVudC50eXBlLnRyaW0oKSA6ICdwZGYnXG4gICAgICBjb25zdCBtaW1lVHlwZSA9IHR5cGVvZiBhdHRhY2htZW50Lm1pbWVfdHlwZSA9PT0gJ3N0cmluZycgPyBhdHRhY2htZW50Lm1pbWVfdHlwZSA6ICcnXG4gICAgICBjb25zdCBmdWxsRmlsZU5hbWUgPSBuYW1lLmluY2x1ZGVzKCcuJykgPyBuYW1lIDogYCR7bmFtZX0uJHt0eXBlfWBcbiAgICAgIGNvbnN0IG51bWVyaWNTaXplID1cbiAgICAgICAgdHlwZW9mIGF0dGFjaG1lbnQuc2l6ZSA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IGF0dGFjaG1lbnQuc2l6ZVxuICAgICAgICAgIDogTnVtYmVyLmlzRmluaXRlKE51bWJlcihhdHRhY2htZW50LnNpemUpKVxuICAgICAgICAgICAgPyBOdW1iZXIoYXR0YWNobWVudC5zaXplKVxuICAgICAgICAgICAgOiAwXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpbGU6IG5ldyBGaWxlKFtdLCBmdWxsRmlsZU5hbWUsIHsgdHlwZTogbWltZVR5cGUgfSksXG4gICAgICAgIGlkOlxuICAgICAgICAgIHR5cGVvZiBhdHRhY2htZW50LmlkID09PSAnc3RyaW5nJyAmJiBhdHRhY2htZW50LmlkLnRyaW0oKVxuICAgICAgICAgICAgPyBhdHRhY2htZW50LmlkXG4gICAgICAgICAgICA6IGBhc3Npc3RhbnQtZmlsZS0ke2luZGV4fS0ke2Z1bGxGaWxlTmFtZX1gLFxuICAgICAgICBuYW1lLFxuICAgICAgICBzaXplOiBudW1lcmljU2l6ZSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdXJsX29yaWdpbmFsOiB0eXBlb2YgYXR0YWNobWVudC51cmxfb3JpZ2luYWwgPT09ICdzdHJpbmcnID8gYXR0YWNobWVudC51cmxfb3JpZ2luYWwgOiB1bmRlZmluZWQsXG4gICAgICAgIHVybF90aHVtYm5haWw6IHR5cGVvZiBhdHRhY2htZW50LnVybF90aHVtYm5haWwgPT09ICdzdHJpbmcnID8gYXR0YWNobWVudC51cmxfdGh1bWJuYWlsIDogdW5kZWZpbmVkLFxuICAgICAgICB1cmxfZmlsZTogdHlwZW9mIGF0dGFjaG1lbnQudXJsX2ZpbGUgPT09ICdzdHJpbmcnID8gYXR0YWNobWVudC51cmxfZmlsZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgcm9sZTogYXR0YWNobWVudC5yb2xlID09PSAnYXNzaXN0YW50JyA/ICdhc3Npc3RhbnQnIDogJ3VzZXInLFxuICAgICAgfVxuICAgIH0pXG59XG5cbi8qKiBFeHRyYWUgdGFza19pZHMgZGUgbG9zIHRvb2xfYXJncyBkZSBwZW5kaW5nX2FjdGlvbnMsIGN1YnJpZW5kbyBsYXMgZm9ybWFzIGNvbXVuZXM6XG4gKiAgLSBgeyB0YXNrX2lkIH1gIG8gYHsgaWQgfWBcbiAqICAtIGB7IHRhc2tfaWRzOiBbXSB9YFxuICogIC0gYHsgdGFza3M6IFt7IHRhc2tfaWR8aWQgfSwgLi4uXSB9YFxuICogIMOadGlsIHBhcmEgdG9vbHMgZGUgZWRpdC9hc3NpZ24vZGVsZXRlIGN1YW5kbyBsYSByZXNwdWVzdGEgZGVsIExMTSBubyBpbmNsdXllIFVSTHMgL3Rhc2tzLy4uLi9kZXRhaWwuICovXG5mdW5jdGlvbiBleHRyYWN0VGFza0lkc0Zyb21QZW5kaW5nQWN0aW9uc0FyZ3MocGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXSk6IG51bWJlcltdIHtcbiAgY29uc3QgaWRzOiBudW1iZXJbXSA9IFtdXG4gIGNvbnN0IHB1c2hJZCA9IChyYXc6IHVua25vd24pID0+IHtcbiAgICBpZiAocmF3ID09IG51bGwpIHJldHVyblxuICAgIGNvbnN0IG4gPSBwYXJzZUludChTdHJpbmcocmF3KSwgMTApXG4gICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIGlkcy5wdXNoKG4pXG4gIH1cbiAgcGVuZGluZ0FjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgIGlmICghYWN0aW9uIHx8IHR5cGVvZiBhY3Rpb24gIT09ICdvYmplY3QnKSByZXR1cm5cbiAgICBjb25zdCBhcmdzID0gYWN0aW9uLnRvb2xfYXJnc1xuICAgIGlmICghKGFyZ3MgJiYgdHlwZW9mIGFyZ3MgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGFyZ3MpKSkgcmV0dXJuXG4gICAgY29uc3QgcmVjID0gYXJncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHB1c2hJZChyZWMudGFza19pZCA/PyByZWMuaWQpXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVjLnRhc2tfaWRzKSkge1xuICAgICAgcmVjLnRhc2tfaWRzLmZvckVhY2gocHVzaElkKVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWMudGFza3MpKSB7XG4gICAgICByZWMudGFza3MuZm9yRWFjaCh0ID0+IHtcbiAgICAgICAgaWYgKHQgJiYgdHlwZW9mIHQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHQpKSB7XG4gICAgICAgICAgY29uc3QgdHJlYyA9IHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgICBwdXNoSWQodHJlYy50YXNrX2lkID8/IHRyZWMuaWQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9KVxuICByZXR1cm4gaWRzXG59XG5cbi8qKiB0YXNrX2lkIC8gdGFza19pZHMgZW4gcGVuZGluZ19hY3Rpb25zIGRlIGRlbGV0ZV8qIChsYSByZXNwdWVzdGEgcHVlZGUgbm8gaW5jbHVpciBVUkxzIC90YXNrcy/igKYvZGV0YWlsKS4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RUYXNrSWRzRnJvbURlbGV0ZVBlbmRpbmdBY3Rpb25zKHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGlkczogbnVtYmVyW10gPSBbXVxuICBwZW5kaW5nQWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgaWYgKCFhY3Rpb24gfHwgdHlwZW9mIGFjdGlvbiAhPT0gJ29iamVjdCcpIHJldHVyblxuICAgIGNvbnN0IGFyZ3MgPSBhY3Rpb24udG9vbF9hcmdzXG4gICAgaWYgKCEoYXJncyAmJiB0eXBlb2YgYXJncyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoYXJncykpKSByZXR1cm5cbiAgICBjb25zdCByZWMgPSBhcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgaWYgKGFjdGlvbi50b29sX25hbWUgPT09ICdkZWxldGVfdGFzaycpIHtcbiAgICAgIGNvbnN0IHJhdyA9IHJlYy50YXNrX2lkID8/IHJlYy5pZFxuICAgICAgaWYgKHJhdyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChTdHJpbmcocmF3KSwgMTApXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKG4pKSBpZHMucHVzaChuKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWN0aW9uLnRvb2xfbmFtZSA9PT0gJ2RlbGV0ZV90YXNrc19iYXRjaCcpIHtcbiAgICAgIGNvbnN0IGxpc3QgPSByZWMudGFza19pZHNcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgICAgIGxpc3QuZm9yRWFjaCh0aWQgPT4ge1xuICAgICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChTdHJpbmcodGlkKSwgMTApXG4gICAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIGlkcy5wdXNoKG4pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gaWRzXG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RBZ2VudElkRnJvbUVkaXRBZ2VudFBlbmRpbmdBY3Rpb25zKHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW10pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZWRpdEFjdGlvbiA9IHBlbmRpbmdBY3Rpb25zLmZpbmQoYSA9PiAoYS50b29sX25hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdlZGl0X2FnZW50JylcbiAgaWYgKFxuICAgICFlZGl0QWN0aW9uIHx8XG4gICAgIWVkaXRBY3Rpb24udG9vbF9hcmdzIHx8XG4gICAgdHlwZW9mIGVkaXRBY3Rpb24udG9vbF9hcmdzICE9PSAnb2JqZWN0JyB8fFxuICAgIEFycmF5LmlzQXJyYXkoZWRpdEFjdGlvbi50b29sX2FyZ3MpXG4gICkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgY29uc3QgcmVjID0gZWRpdEFjdGlvbi50b29sX2FyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgY29uc3QgcmF3ID0gcmVjLmFnZW50X2lkID8/IHJlYy5hZ2VudElkXG4gIHJldHVybiByYXcgIT0gbnVsbCA/IFN0cmluZyhyYXcpIDogbnVsbFxufVxuXG5mdW5jdGlvbiBleHRyYWN0QWdlbnRJZEZyb21QZW5kaW5nQWN0aW9uc0J5VG9vbE5hbWUocGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXSwgdG9vbE5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBhY3Rpb24gPSBwZW5kaW5nQWN0aW9ucy5maW5kKGEgPT4gKGEudG9vbF9uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSB0b29sTmFtZS50b0xvd2VyQ2FzZSgpKVxuICBpZiAoIWFjdGlvbiB8fCAhYWN0aW9uLnRvb2xfYXJncyB8fCB0eXBlb2YgYWN0aW9uLnRvb2xfYXJncyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShhY3Rpb24udG9vbF9hcmdzKSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgY29uc3QgcmVjID0gYWN0aW9uLnRvb2xfYXJncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBjb25zdCByYXcgPSByZWMuYWdlbnRfaWQgPz8gcmVjLmFnZW50SWQgPz8gcmVjLmlkXG4gIHJldHVybiByYXcgIT0gbnVsbCA/IFN0cmluZyhyYXcpIDogbnVsbFxufVxuXG4vKiogw5psdGltbyByZWN1cnNvIHNpIG5vIGhheSBsaW5rcyBuaSB0b29sX2FyZ3MgcGFyc2VhYmxlcyAocC4gZWouIFwiSUQgKio3NTk3MTA2KipcIikuICovXG5mdW5jdGlvbiBleHRyYWN0VGFza0lkc0Zyb21Bc3Npc3RhbnREZWxldGlvblRleHQodGV4dDogc3RyaW5nKTogbnVtYmVyW10ge1xuICBjb25zdCBsYWJlbGVkID0gdGV4dC5tYXRjaCgvXFxiSURcXHMqXFwqXFwqKFxcZCspXFwqXFwqL2kpXG4gIGlmIChsYWJlbGVkKSB7XG4gICAgY29uc3QgbiA9IHBhcnNlSW50KGxhYmVsZWRbMV0sIDEwKVxuICAgIHJldHVybiBOdW1iZXIuaXNOYU4obikgPyBbXSA6IFtuXVxuICB9XG4gIGNvbnN0IGJvbGQgPSB0ZXh0Lm1hdGNoKC9cXCpcXCooXFxkezUsfSlcXCpcXCovKVxuICBpZiAoYm9sZCkge1xuICAgIGNvbnN0IG4gPSBwYXJzZUludChib2xkWzFdLCAxMClcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKG4pID8gW10gOiBbbl1cbiAgfVxuICByZXR1cm4gW11cbn1cblxuY29uc3QgdXNlU3RhYmxlQ2FsbGJhY2tzID0gKGF1dGhVc2VyOiBDT1JVc2VyKSA9PiB7XG4gIGNvbnN0IGN1cnJlbnRVc2VyID0gdXNlUmVmPENoYXRNZXNzYWdlVXNlcj4oe1xuICAgIGlkOiBhdXRoVXNlci5pZC50b1N0cmluZygpLFxuICAgIG5hbWU6IGF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgICBhdmF0YXI6IGF1dGhVc2VyLnBpY3R1cmUsXG4gIH0pXG5cbiAgaWYgKFxuICAgIGN1cnJlbnRVc2VyLmN1cnJlbnQuaWQgIT09IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCkgfHxcbiAgICBjdXJyZW50VXNlci5jdXJyZW50Lm5hbWUgIT09IGF1dGhVc2VyLmZpcnN0TmFtZSB8fFxuICAgIGN1cnJlbnRVc2VyLmN1cnJlbnQuYXZhdGFyICE9PSBhdXRoVXNlci5waWN0dXJlXG4gICkge1xuICAgIGN1cnJlbnRVc2VyLmN1cnJlbnQgPSB7XG4gICAgICBpZDogYXV0aFVzZXIuaWQudG9TdHJpbmcoKSxcbiAgICAgIG5hbWU6IGF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgICAgIGF2YXRhcjogYXV0aFVzZXIucGljdHVyZSxcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50VXNlcjogY3VycmVudFVzZXIuY3VycmVudCxcbiAgfVxufVxuXG5jb25zdCBwYXJzZVNTRUxpbmUgPSAobGluZTogc3RyaW5nKTogeyBldmVudFR5cGU6IHN0cmluZzsgZGF0YTogdW5rbm93biB9IHwgbnVsbCA9PiB7XG4gIGlmICghbGluZS50cmltKCkpIHJldHVybiBudWxsXG5cbiAgY29uc3QgW2V2ZW50TGluZSwgZGF0YUxpbmVdID0gbGluZS5zcGxpdCgnXFxuJylcbiAgaWYgKCFldmVudExpbmUgfHwgIWRhdGFMaW5lKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IGV2ZW50VHlwZSA9IGV2ZW50TGluZS5yZXBsYWNlKCdldmVudDogJywgJycpLnRyaW0oKVxuICBjb25zdCBkYXRhU3RyID0gZGF0YUxpbmUucmVwbGFjZSgnZGF0YTogJywgJycpLnRyaW0oKVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZGF0YVN0cilcbiAgICByZXR1cm4geyBldmVudFR5cGUsIGRhdGEgfVxuICB9IGNhdGNoIChwYXJzZUVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyBTU0UgZGF0YTonLCBwYXJzZUVycm9yLCBkYXRhU3RyKVxuICAgIHJldHVybiBudWxsXG4gIH1cbn1cblxuY29uc3QgcHJvY2Vzc1NTRVN0cmVhbSA9IGFzeW5jIChcbiAgcmVzcG9uc2U6IFJlc3BvbnNlLFxuICB0aHJlYWRJZDogc3RyaW5nLFxuICBjYWxsYmFja3M6IHtcbiAgICBvblRoaW5raW5nOiAoKSA9PiB2b2lkXG4gICAgb25Ub2tlbjogKGNvbnRlbnQ6IHN0cmluZykgPT4gdm9pZFxuICAgIG9uTm9kZTogKG1lc3NhZ2U6IHN0cmluZywgdGhyZWFkSWQ6IHN0cmluZykgPT4gdm9pZFxuICAgIG9uQ29tcGxldGU6IChcbiAgICAgIGZpbmFsQ29udGVudDogc3RyaW5nLFxuICAgICAgc291cmNlczogYW55LFxuICAgICAgbWVtb3J5U2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgICBjdXJyZW50VGhyZWFkSWQ6IHN0cmluZyxcbiAgICAgIGF0dGFjaG1lbnRzPzogYW55W10gfCBudWxsLFxuICAgICAgc3VnZ2VzdGlvbnM/OiBzdHJpbmdbXSB8IG51bGwsXG4gICAgICBhZ2VudElkPzogc3RyaW5nIHwgbnVsbFxuICAgICkgPT4gdm9pZFxuICAgIG9uRXJyb3I6IChlcnJvcjogYW55LCB0aHJlYWRJZDogc3RyaW5nKSA9PiB2b2lkXG4gICAgb25BcHByb3ZhbFJlcXVpcmVkPzogKGFwcHJvdmFsOiBhbnksIGFjY3VtdWxhdGVkQ29udGVudDogc3RyaW5nLCBjdXJyZW50VGhyZWFkSWQ6IHN0cmluZykgPT4gdm9pZFxuICB9XG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgcmVhZGVyID0gcmVzcG9uc2UuYm9keT8uZ2V0UmVhZGVyKClcbiAgaWYgKCFyZWFkZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlYWRlciBhdmFpbGFibGUnKVxuICB9XG5cbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG4gIGxldCBidWZmZXIgPSAnJ1xuICBsZXQgYWNjdW11bGF0ZWRDb250ZW50ID0gJydcbiAgbGV0IHN0cmVhbVNldHRsZWQgPSBmYWxzZVxuXG4gIGNvbnN0IG5vdGlmeUNvbXBsZXRlID0gKGV2ZW50RGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGZpbmFsQ29udGVudDogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHN0cmVhbVNldHRsZWQpIHJldHVyblxuICAgIHN0cmVhbVNldHRsZWQgPSB0cnVlXG4gICAgY29uc3Qgc291cmNlcyA9IGV2ZW50RGF0YS5zb3VyY2VzIHx8IG51bGxcbiAgICBjb25zdCBtZW1vcnlTZXNzaW9uSWQgPSAoZXZlbnREYXRhLm1lbW9yeV9zZXNzaW9uX2lkIGFzIHN0cmluZykgfHwgJydcbiAgICBjb25zdCBhdHRhY2htZW50cyA9IEFycmF5LmlzQXJyYXkoZXZlbnREYXRhLmF0dGFjaG1lbnRzKSA/IGV2ZW50RGF0YS5hdHRhY2htZW50cyA6IG51bGxcbiAgICBjb25zdCBzdWdnZXN0aW9ucyA9IEFycmF5LmlzQXJyYXkoZXZlbnREYXRhLnN1Z2dlc3RfcmVwbHkpXG4gICAgICA/IChldmVudERhdGEuc3VnZ2VzdF9yZXBseSBhcyBzdHJpbmdbXSlcbiAgICAgIDogQXJyYXkuaXNBcnJheShldmVudERhdGEuc3VnZ2VzdGlvbnMpXG4gICAgICAgID8gKGV2ZW50RGF0YS5zdWdnZXN0aW9ucyBhcyBzdHJpbmdbXSlcbiAgICAgICAgOiBudWxsXG4gICAgY29uc3QgYWdlbnRJZFJhdyA9IGV2ZW50RGF0YS5hZ2VudF9pZCA/PyBldmVudERhdGEuYWdlbnRJZFxuICAgIGNvbnN0IGNvbXBsZXRlZEFnZW50SWQgPSBhZ2VudElkUmF3ICE9IG51bGwgJiYgU3RyaW5nKGFnZW50SWRSYXcpLnRyaW0oKSAhPT0gJycgPyBTdHJpbmcoYWdlbnRJZFJhdykudHJpbSgpIDogbnVsbFxuICAgIGNhbGxiYWNrcy5vbkNvbXBsZXRlKGZpbmFsQ29udGVudCwgc291cmNlcywgbWVtb3J5U2Vzc2lvbklkLCB0aHJlYWRJZCwgYXR0YWNobWVudHMsIHN1Z2dlc3Rpb25zLCBjb21wbGV0ZWRBZ2VudElkKVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTGluZShsaW5lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVNTRUxpbmUobGluZSlcbiAgICBpZiAoIXBhcnNlZCkgcmV0dXJuXG5cbiAgICBjb25zdCB7IGV2ZW50VHlwZSwgZGF0YSB9ID0gcGFyc2VkXG4gICAgY29uc3QgZXZlbnREYXRhID0gZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gICAgaWYgKHN0cmVhbVNldHRsZWQgJiYgZXZlbnRUeXBlICE9PSAnZXJyb3InKSByZXR1cm5cblxuICAgIGlmIChldmVudFR5cGUgPT09ICd0aGlua2luZycpIHtcbiAgICAgIGNhbGxiYWNrcy5vblRoaW5raW5nKClcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ3Rva2VuJykge1xuICAgICAgY29uc3QgY29udGVudCA9IHR5cGVvZiBldmVudERhdGEuY29udGVudCA9PT0gJ3N0cmluZycgPyBldmVudERhdGEuY29udGVudCA6ICcnXG4gICAgICBhY2N1bXVsYXRlZENvbnRlbnQgPSBtZXJnZVN0cmVhbUNodW5rKGFjY3VtdWxhdGVkQ29udGVudCwgY29udGVudClcbiAgICAgIGNhbGxiYWNrcy5vblRva2VuKGFjY3VtdWxhdGVkQ29udGVudClcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ2NvbnRlbnQnKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gdHlwZW9mIGV2ZW50RGF0YS5jb250ZW50ID09PSAnc3RyaW5nJyA/IGV2ZW50RGF0YS5jb250ZW50IDogJydcbiAgICAgIGFjY3VtdWxhdGVkQ29udGVudCA9IG1lcmdlU3RyZWFtQ2h1bmsoYWNjdW11bGF0ZWRDb250ZW50LCBjb250ZW50KVxuICAgICAgY2FsbGJhY2tzLm9uVG9rZW4oYWNjdW11bGF0ZWRDb250ZW50KVxuICAgICAgaWYgKGlzQ29tcGxldGVMaWtlU3NlUGF5bG9hZChldmVudERhdGEpKSB7XG4gICAgICAgIG5vdGlmeUNvbXBsZXRlKGV2ZW50RGF0YSwgY29udGVudCB8fCBhY2N1bXVsYXRlZENvbnRlbnQpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdub2RlJykge1xuICAgICAgaWYgKGV2ZW50RGF0YS5tZXNzYWdlICYmIHR5cGVvZiBldmVudERhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY2FsbGJhY2tzLm9uTm9kZShldmVudERhdGEubWVzc2FnZSwgdGhyZWFkSWQpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIGNvbnN0IGZpbmFsQ29udGVudCA9IChldmVudERhdGEuY29udGVudCBhcyBzdHJpbmcpIHx8IGFjY3VtdWxhdGVkQ29udGVudFxuICAgICAgbm90aWZ5Q29tcGxldGUoZXZlbnREYXRhLCBmaW5hbENvbnRlbnQpXG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdhcHByb3ZhbF9yZXF1aXJlZCcpIHtcbiAgICAgIC8vIE1hbnVhbCBhcHByb3ZhbDogZWwgc3RyZWFtIHNpZ3VlIChub2RlL3Rva2VuL2NvbXBsZXRlIHkgbcOhcyBISVRMKS5cbiAgICAgIC8vIFNvbG8gZWwgYXBwcm92YWwgcGF1c2FkbyAoYm90w7NuKSBjaWVycmEgZWwgcHJvY2VzYW1pZW50byBkZSBldmVudG9zLlxuICAgICAgY29uc3QgaXNNYW51YWxBcHByb3ZhbCA9IGV2ZW50RGF0YS5tYW51YWxfYXBwcm92YWxfZGV0ZWN0ZWQgPT09IHRydWVcbiAgICAgIGlmICghaXNNYW51YWxBcHByb3ZhbCkge1xuICAgICAgICBzdHJlYW1TZXR0bGVkID0gdHJ1ZVxuICAgICAgfVxuICAgICAgY2FsbGJhY2tzLm9uQXBwcm92YWxSZXF1aXJlZD8uKGV2ZW50RGF0YSwgYWNjdW11bGF0ZWRDb250ZW50LCB0aHJlYWRJZClcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgc3RyZWFtU2V0dGxlZCA9IHRydWVcbiAgICAgIGNhbGxiYWNrcy5vbkVycm9yKGV2ZW50RGF0YS5lcnJvciwgdGhyZWFkSWQpXG4gICAgfVxuICB9XG5cbiAgbGV0IGlzUmVhZGVyRG9uZSA9IGZhbHNlXG5cbiAgd2hpbGUgKCFpc1JlYWRlckRvbmUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKClcbiAgICBpZiAoZG9uZSkge1xuICAgICAgaXNSZWFkZXJEb25lID0gdHJ1ZVxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBidWZmZXIgKz0gZGVjb2Rlci5kZWNvZGUodmFsdWUsIHsgc3RyZWFtOiB0cnVlIH0pXG4gICAgY29uc3QgbGluZXMgPSBidWZmZXIuc3BsaXQoJ1xcblxcbicpXG4gICAgYnVmZmVyID0gbGluZXMucG9wKCkgfHwgJydcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGhhbmRsZUxpbmUobGluZXNbaV0pXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCB1c2VDaGF0TWFuYWdlciA9ICh7XG4gIGNoYXRJZDogaW5pdGlhbENoYXRJZCxcbiAgdXNlckluaXRpYWxNZXNzYWdlLFxuICBvbkVycm9yLFxuICBhZ2VudHMgPSBbXSxcbn06IFVzZUNoYXRNYW5hZ2VyUHJvcHMpID0+IHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUKClcbiAgY29uc3QgYXV0aFVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3Qge1xuICAgIHByb2plY3QsXG4gICAgc2V0UHJvamVjdCxcbiAgICBjbGllbnQsXG4gICAgc2V0Q2xpZW50LFxuICAgIHRhc2ssXG4gICAgc2V0VGFzayxcbiAgICBhZ2VudCxcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICBpc0RlZXBTZWFyY2hBY3RpdmUsXG4gICAgY2hpcHNQcm9qZWN0LFxuICAgIHNldENoaXBzUHJvamVjdCxcbiAgfSA9IHVzZUdsb2JhbENvbnRleHQoKVxuICBjb25zdCBldmVudCA9IHVzZUV2ZW50KClcbiAgY29uc3QgeyBmZXRjaFByb2plY3RzIH0gPSB1c2VQcm9qZWN0cygpXG4gIGNvbnN0IHsgY3VycmVudFVzZXIgfSA9IHVzZVN0YWJsZUNhbGxiYWNrcyhhdXRoVXNlcilcbiAgY29uc3QgeyBnZXRUYWJUYXNrRGVmYXVsdCB9ID0gdXNlVGFiVGFza0RlZmF1bHQoKVxuXG4gIGNvbnN0IGN1cnJlbnRNZXNzYWdlSWQgPSB1c2VSZWYodXVpZHY0KCkpXG4gIGNvbnN0IGN1cnJlbnRVc2VyUXVlc3Rpb24gPSB1c2VSZWY8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgY3VycmVudENoYXRJZCA9IHVzZVJlZihpbml0aWFsQ2hhdElkIHx8IHV1aWR2NCgpKVxuICBjb25zdCByZXBvcnRlZEV2ZW50ID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBtZXNzYWdlc1JlZiA9IHVzZVJlZjxDaGF0TWVzc2FnZVtdPihbXSlcbiAgLyoqXG4gICAqIEd1YXJkYSBpbmZvIGRlbCDDumx0aW1vIGFwcHJvdmFsIG1hbnVhbCAoY3VhbmRvIGVsIHVzdWFyaW8gdGlwZWEgXCJzaVwiL1wibm9cIiBlbiBsdWdhclxuICAgKiBkZSBjbGlja2VhciBlbCBib3TDs24pLiBFbiBtYW51YWwgYXBwcm92YWwsIGBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkYCByZXRvcm5hIGVhcmx5XG4gICAqIHNpbiBhZ3JlZ2FyIHVuIG1lbnNhamUgY29uIGBhcHByb3ZhbGAsIGFzw60gcXVlIGxhIGzDs2dpY2EgZGUgcmVmZXRjaCBlbiBgb25TdHJlYW1GaW5pc2hgXG4gICAqIG5vIGxvIGRldGVjdGEgdsOtYSBgcHJldmlvdXNNZXNzYWdlLmFwcHJvdmFsYC4gTG8gZ3VhcmRhbW9zIGFjw6EgcGFyYSBjb25zdW1pcmxvIGRlc3B1w6lzLlxuICAgKi9cbiAgY29uc3QgbGFzdE1hbnVhbEFwcHJvdmFsUmVmID0gdXNlUmVmPHtcbiAgICB0b29sTmFtZTogc3RyaW5nXG4gICAgdG9vbEFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbFxuICB9IHwgbnVsbD4obnVsbClcbiAgLyoqIENvbnRleHRvIGRlbCBtZW5zYWplIGRlIGFwcm9iYWNpw7NuIHByZXZpbyBhbCBlamVjdXRhciBjb250aW51ZS10aHJlYWQuICovXG4gIGNvbnN0IGhpdGxFeGVjdXRpb25Db250ZXh0UmVmID0gdXNlUmVmPEhpdGxFeGVjdXRpb25Db250ZXh0IHwgbnVsbD4obnVsbClcbiAgY29uc3QgaXNQcm9jZXNzaW5nUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBmaXJzdFRpbWVSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIC8qKiBJZCBkZWwgcGxhY2Vob2xkZXIgZGVsIG1lbnNhamUgZW4gc3RyZWFtaW5nIGFjdGl2byAoc2kgaGF5KS4gKi9cbiAgY29uc3Qgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICAvKipcbiAgICogQ2hhdCBhbCBxdWUgcGVydGVuZWNlIGVsIHN0cmVhbSBhY3R1YWxtZW50ZSBhY3Rpdm8uIFNpIGNhbWJpYSBlbCBjaGF0XG4gICAqIG1pZW50cmFzIHVuIHN0cmVhbSBlc3TDoSBlbiB2dWVsbywgZGVzY2FydGFtb3MgbG9zIHRva2VucyByZXNpZHVhbGVzXG4gICAqIHF1ZSBwdWVkYW4gbGxlZ2FyIGFudGVzIGRlIHF1ZSBlbCBhYm9ydCBzZSBjb21wbGV0ZS5cbiAgICovXG4gIGNvbnN0IGFjdGl2ZVN0cmVhbUNoYXRJZFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICAvKiogU2V0dGVyIGluZGlyZWN0byBwYXJhIGFib3J0YXIgZWwgc3RyZWFtIGFudGVzIGRlIHF1ZSBlbCBob29rIGRlXG4gICAqIG9ycXVlc3RhZG9yIGVzdMOpIGluaWNpYWxpemFkbyAoc2UgbGlua2VhIG3DoXMgYWJham8pLiAqL1xuICBjb25zdCBhYm9ydFN0cmVhbVNpbGVudGx5UmVmID0gdXNlUmVmPCgpID0+IHZvaWQ+KCgpID0+IHVuZGVmaW5lZClcbiAgY29uc3QgY2xlYXJTdHJlYW1VaVJlZiA9IHVzZVJlZjwoKSA9PiB2b2lkPigoKSA9PiB1bmRlZmluZWQpXG4gIGNvbnN0IFthY3RpdmVMb2FkaW5ncywgc2V0QWN0aXZlTG9hZGluZ3NdID0gdXNlU3RhdGU8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oe30pXG4gIGNvbnN0IFtpc0NvbnRpbnVpbmdTdHJlYW0sIHNldElzQ29udGludWluZ1N0cmVhbV0gPSB1c2VTdGF0ZShmYWxzZSlcblxuICBjb25zdCBpc1dlYlNlYXJjaEFjdGl2ZVJlZiA9IHVzZVJlZihpc1dlYlNlYXJjaEFjdGl2ZSlcbiAgY29uc3QgaXNEZWVwU2VhcmNoQWN0aXZlUmVmID0gdXNlUmVmKGlzRGVlcFNlYXJjaEFjdGl2ZSlcbiAgLyoqIEV2aXRhIGNsb3N1cmVzIG9ic29sZXRhcyBjdWFuZG8gZWwgZm9vdGVyIGNvbnNlcnZhIHNlbmRNZXNzYWdlIGVudHJlIHJlbmRlcnMuICovXG4gIGNvbnN0IGNvbnRleHRSZWYgPSB1c2VSZWYoeyBjaGlwc1Byb2plY3QsIHByb2plY3QsIGNsaWVudCwgdGFzayB9KVxuICBjb250ZXh0UmVmLmN1cnJlbnQgPSB7IGNoaXBzUHJvamVjdCwgcHJvamVjdCwgY2xpZW50LCB0YXNrIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQgPSBpc1dlYlNlYXJjaEFjdGl2ZVxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50ID0gaXNEZWVwU2VhcmNoQWN0aXZlXG4gIH0sIFtpc1dlYlNlYXJjaEFjdGl2ZSwgaXNEZWVwU2VhcmNoQWN0aXZlXSlcblxuICBjb25zdCB7IGxvYWRpbmdNZXNzYWdlcywgbWVzc2FnZXMsIGlzTG9hZGluZ01vcmVNZXNzYWdlcywgbG9hZE1lc3NhZ2VzLCBhZGRNZXNzYWdlLCByZW1vdmVNZXNzYWdlLCBoYW5kbGVTY3JvbGwgfSA9XG4gICAgdXNlQ2hhdE1lc3NhZ2VzKHtcbiAgICAgIGNoYXRJZDogaW5pdGlhbENoYXRJZCB8fCBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgICBjdXJyZW50VXNlcixcbiAgICAgIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgICAgIG9uRXJyb3IsXG4gICAgICBhZ2VudHMsXG4gICAgfSlcblxuICBtZXNzYWdlc1JlZi5jdXJyZW50ID0gbWVzc2FnZXNcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdjaGF0LWxvYWRpbmctbWVzc2FnZXMtY2hhbmdlZCcsIHtcbiAgICAgIGRldGFpbDogeyBsb2FkaW5nTWVzc2FnZXMgfSxcbiAgICB9KVxuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpXG4gIH0sIFtsb2FkaW5nTWVzc2FnZXNdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGluaXRpYWxDaGF0SWQgJiYgaW5pdGlhbENoYXRJZCAhPT0gY3VycmVudENoYXRJZC5jdXJyZW50KSB7XG4gICAgICAvLyBTaSBoYXkgdW4gc3RyZWFtIGVuIGN1cnNvLCBhYm9ydGFybG8gc2lsZW5jaW9zYW1lbnRlIHBhcmEgcXVlIGxvc1xuICAgICAgLy8gdG9rZW5zIHJlc2lkdWFsZXMgbm8gc2UgZXNjcmliYW4gZW4gZWwgY2hhdCBudWV2by5cbiAgICAgIGFib3J0U3RyZWFtU2lsZW50bHlSZWYuY3VycmVudCgpXG5cbiAgICAgIC8vIExpbXBpYXIgY29udGV4dG8gZ2xvYmFsIGFsIGNhbWJpYXIgZGUgY29udmVyc2FjacOzblxuICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgICAgc2V0VGFzayhudWxsKVxuXG4gICAgICBjdXJyZW50Q2hhdElkLmN1cnJlbnQgPSBpbml0aWFsQ2hhdElkXG4gICAgICBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQgPSB1dWlkdjQoKVxuICAgICAgY3VycmVudFVzZXJRdWVzdGlvbi5jdXJyZW50ID0gbnVsbFxuICAgICAgcmVwb3J0ZWRFdmVudC5jdXJyZW50ID0gZmFsc2VcbiAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgc3RyZWFtaW5nU3RvcmUuY2xlYXIoKVxuXG4gICAgICBsb2FkTWVzc2FnZXMoKVxuICAgIH1cbiAgfSwgW2luaXRpYWxDaGF0SWQsIHByb2plY3QsIHNldFByb2plY3QsIHNldENsaWVudCwgc2V0Q2hpcHNQcm9qZWN0LCBzZXRUYXNrLCBsb2FkTWVzc2FnZXNdKVxuXG4gIGNvbnN0IGhhbmRsZVN0cmVhbUVycm9yID0gdXNlQ2FsbGJhY2soXG4gICAgKGVycm9yTWVzc2FnZT86IHN0cmluZywgZXJyb3JSYXdNZXNzYWdlPzogc3RyaW5nKSA9PiB7XG4gICAgICBjbGVhclN0cmVhbVVpUmVmLmN1cnJlbnQoKVxuICAgICAgY29uc3QgdGVtcE1lc3NhZ2VJZCA9IGBhbnN3ZXItJHtjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnR9LXN0cmVhbWluZ2BcbiAgICAgIHN0cmVhbWluZ1N0b3JlLmNsZWFyKClcbiAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgcmVtb3ZlTWVzc2FnZSh0ZW1wTWVzc2FnZUlkKVxuXG4gICAgICBjb25zdCBpc0FjY2Vzc0RlbmllZCA9IGVycm9yTWVzc2FnZSA9PT0gXCJBY2Nlc3MgZGVuaWVkOiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGlzIGFnZW50XCJcbiAgICAgIGNvbnN0IGlzUHJvbXB0VG9vTG9uZyA9XG4gICAgICAgIGVycm9yTWVzc2FnZSA9PT0gJ2ludmFsaWRfcmVxdWVzdF9lcnJvcicgJiYgZXJyb3JSYXdNZXNzYWdlPy5pbmNsdWRlcygncHJvbXB0IGlzIHRvbyBsb25nJylcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBpc0FjY2Vzc0RlbmllZFxuICAgICAgICA/IHQoJ2NoYXQuZXJyb3JBY2Nlc3NEZW5pZWQnKVxuICAgICAgICA6IGlzUHJvbXB0VG9vTG9uZ1xuICAgICAgICAgID8gdCgnY2hhdC5lcnJvclByb21wdFRvb0xvbmcnLCB7IHVzZWQ6IGVycm9yUmF3TWVzc2FnZT8ubWF0Y2goLyhcXGQrKSB0b2tlbnMvKT8uWzFdID8/ICcnIH0pXG4gICAgICAgICAgOiB0KCdjaGF0LmVycm9yJylcblxuICAgICAgYWRkTWVzc2FnZSh7XG4gICAgICAgIGlkOiBgYW5zd2VyLSR7Y3VycmVudE1lc3NhZ2VJZC5jdXJyZW50fWAsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgICAgIC8vIENoaXAgXCJSZWludGVudGFyXCIgc29sbyBlbiBlbCBlcnJvciBnZW7DqXJpY28gKHAuIGVqLiA1MDApOyBubyBhcGxpY2EgYSBhY2Nlc3MgZGVuaWVkIG5pIHByb21wdCB0b28gbG9uZy5cbiAgICAgICAgLi4uKCFpc0FjY2Vzc0RlbmllZCAmJiAhaXNQcm9tcHRUb29Mb25nID8geyBzdWdnZXN0aW9uczogW3QoJ2NoYXQucmV0cnknKV0gfSA6IHt9KSxcbiAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6ICdBc3Npc3RhbnQnIH0sXG4gICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICB9KVxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIH0sXG4gICAgW2FkZE1lc3NhZ2UsIHJlbW92ZU1lc3NhZ2UsIHRdXG4gIClcblxuICBjb25zdCBoYW5kbGVTdHJlYW1VcGRhdGUgPSB1c2VDYWxsYmFjayhcbiAgICAoY29udGVudDogc3RyaW5nLCBzb3VyY2VzOiBhbnksIG1lbW9yeVNlc3Npb25JZDogc3RyaW5nKSA9PiB7XG4gICAgICAvLyBTaSBlbCBjaGF0IGNhbWJpw7MgbWllbnRyYXMgZWwgc3RyZWFtIGVzdGFiYSBlbiB2dWVsbywgZGVzY2FydGFyIGVsXG4gICAgICAvLyB0b2tlbiByZXNpZHVhbDogbm8gZGViZSBwaW50YXJzZSBlbiBlbCBudWV2byBjaGF0LlxuICAgICAgaWYgKGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ICE9IG51bGwgJiYgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgIT09IGN1cnJlbnRDaGF0SWQuY3VycmVudCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgdGVtcE1lc3NhZ2VJZCA9IGBhbnN3ZXItJHtjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnR9LXN0cmVhbWluZ2BcblxuICAgICAgLy8gUHJpbWVyYSBsbGFtYWRhIGRlIGVzdGUgc3RyZWFtOiBpbnNlcnRhbW9zIGVsIHBsYWNlaG9sZGVyIGVuIGVsXG4gICAgICAvLyBhcnJheSBkZSBgbWVzc2FnZXNgIHVuYSDDum5pY2EgdmV6LiBMYXMgbGxhbWFkYXMgc3Vic2lndWllbnRlcyB5YSBub1xuICAgICAgLy8gdG9jYW4gYG1lc3NhZ2VzYDsgZWwgdGV4dG8gdml2ZSBlbiBlbCBzdHJlYW1pbmdTdG9yZSAoZXh0ZXJubyksIHBvclxuICAgICAgLy8gbG8gcXVlIFJlYWN0IG5vIHJlLXJlbmRlcml6YSBlbCDDoXJib2wgY29tcGxldG8gZW4gY2FkYSB0b2tlbi5cbiAgICAgIGlmIChzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgIT09IHRlbXBNZXNzYWdlSWQpIHtcbiAgICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gdGVtcE1lc3NhZ2VJZFxuICAgICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IGN1cnJlbnRDaGF0SWQuY3VycmVudFxuICAgICAgICBzdHJlYW1pbmdTdG9yZS5zdGFydCh0ZW1wTWVzc2FnZUlkKVxuICAgICAgICBhZGRNZXNzYWdlKHtcbiAgICAgICAgICBpZDogdGVtcE1lc3NhZ2VJZCxcbiAgICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiAnQXNzaXN0YW50JyB9LFxuICAgICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICAgICAgc291cmNlcyxcbiAgICAgICAgICBtZW1vcnlTZXNzaW9uSWQsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIHN0cmVhbWluZ1N0b3JlLnNldFRleHQodGVtcE1lc3NhZ2VJZCwgY29udGVudClcbiAgICB9LFxuICAgIFthZGRNZXNzYWdlXVxuICApXG5cbiAgY29uc3QgaGFuZGxlU3RyZWFtRmluaXNoID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKFxuICAgICAgY29udGVudDogc3RyaW5nLFxuICAgICAgc291cmNlczogYW55LFxuICAgICAgbWVtb3J5U2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgICByYXdBdHRhY2htZW50cz86IGFueVtdIHwgbnVsbCxcbiAgICAgIHN1Z2dlc3Rpb25zPzogc3RyaW5nW10gfCBudWxsLFxuICAgICAgY29tcGxldGVkQWdlbnRJZD86IHN0cmluZyB8IG51bGxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHRlbXBNZXNzYWdlSWQgPSBgYW5zd2VyLSR7Y3VycmVudE1lc3NhZ2VJZC5jdXJyZW50fS1zdHJlYW1pbmdgXG4gICAgICBzdHJlYW1pbmdTdG9yZS5jbGVhcigpXG4gICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICByZW1vdmVNZXNzYWdlKHRlbXBNZXNzYWdlSWQpXG4gICAgICBjb25zdCBhdHRhY2htZW50cyA9IG5vcm1hbGl6ZUFzc2lzdGFudEF0dGFjaG1lbnRzKHJhd0F0dGFjaG1lbnRzKVxuXG4gICAgICAvLyBEZXRlY3RhciB0b2RhcyBsYXMgVVJMcyBkZSB0YXJlYXMgKC4uLi90YXNrcy8xMjMvZGV0YWlsfG1lc3NhZ2V8bWVzc2FnZXN8ZmlsZXN8aGlzdG9yeXxob3VycylcbiAgICAgIGNvbnN0IHRhc2tVcmxSZWdleCA9IG5ldyBSZWdFeHAoVEFTS19VUkxfUkVHRVhfUEFUVEVSTiwgJ2cnKVxuICAgICAgY29uc3QgbWF0Y2hlcyA9IFsuLi5jb250ZW50Lm1hdGNoQWxsKHRhc2tVcmxSZWdleCldXG5cbiAgICAgIGxldCBjb250ZW50VG9BZGQgPSBjb250ZW50XG4gICAgICBjb25zdCBwcmV2aW91c01lc3NhZ2UgPSBtZXNzYWdlc1JlZi5jdXJyZW50LmZpbHRlcihtID0+IG0uaWQgIT09IHRlbXBNZXNzYWdlSWQpLmF0KC0xKVxuICAgICAgY29uc3QgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSA9IHByZXZpb3VzTWVzc2FnZT8uYXBwcm92YWwgIT0gbnVsbFxuICAgICAgY29uc3QgVEFTS19DUkVBVElPTl9UT09MUyA9IFsnY3JlYXRlX3Rhc2snLCAnY3JlYXRlX3Rhc2tzX2JhdGNoJywgJ2Nsb25lX3Rhc2snXVxuICAgICAgY29uc3QgVEFTS19FRElUX1RPT0xTID0gW1xuICAgICAgICAnZWRpdF90YXNrJyxcbiAgICAgICAgJ2VkaXRfdGFza3NfYmF0Y2gnLFxuICAgICAgICAndGFza19hc3NpZ24nLFxuICAgICAgICAndGFza191bmFzc2lnbicsXG4gICAgICAgICd1cGRhdGVfdGFza190eXBlJyxcbiAgICAgICAgJ3VwZGF0ZV9lc3RpbWF0ZWRfaG91cnMnLFxuICAgICAgICAnYXNzaWduX3Rhc2tfbGFiZWwnLFxuICAgICAgXVxuICAgICAgY29uc3QgVEFTS19ERUxFVEVfVE9PTFMgPSBbJ2RlbGV0ZV90YXNrJywgJ2RlbGV0ZV90YXNrc19iYXRjaCddXG4gICAgICBjb25zdCBwZW5kaW5nQWN0aW9ucyA9IHByZXZpb3VzTWVzc2FnZT8uYXBwcm92YWw/LnBlbmRpbmdfYWN0aW9ucyB8fCBbXVxuICAgICAgY29uc3Qgd2FzVGFza0NyZWF0aW9uID1cbiAgICAgICAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSAmJlxuICAgICAgICBwZW5kaW5nQWN0aW9ucy5zb21lKChhY3Rpb246IGFueSkgPT4gVEFTS19DUkVBVElPTl9UT09MUy5pbmNsdWRlcyhhY3Rpb24udG9vbF9uYW1lKSlcbiAgICAgIGNvbnN0IHdhc1Rhc2tFZGl0ID1cbiAgICAgICAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSAmJiBwZW5kaW5nQWN0aW9ucy5zb21lKChhY3Rpb246IGFueSkgPT4gVEFTS19FRElUX1RPT0xTLmluY2x1ZGVzKGFjdGlvbi50b29sX25hbWUpKVxuICAgICAgY29uc3Qgd2FzVGFza0RlbGV0ZSA9XG4gICAgICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiZcbiAgICAgICAgcGVuZGluZ0FjdGlvbnMuc29tZSgoYWN0aW9uOiBhbnkpID0+IFRBU0tfREVMRVRFX1RPT0xTLmluY2x1ZGVzKGFjdGlvbi50b29sX25hbWUpKVxuICAgICAgY29uc3Qgd2FzQ3JlYXRlQWdlbnRBcHByb3ZlZCA9XG4gICAgICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiZcbiAgICAgICAgcHJldmlvdXNNZXNzYWdlPy5hcHByb3ZhbFN0YXR1cyA9PT0gJ2FwcHJvdmVkJyAmJlxuICAgICAgICBwZW5kaW5nQWN0aW9ucy5zb21lKChhY3Rpb246IGFueSkgPT4gYWN0aW9uLnRvb2xfbmFtZSA9PT0gJ2NyZWF0ZV9hZ2VudCcpXG4gICAgICBjb25zdCB3YXNDb25maWd1cmVBZ2VudEFjY2Vzc0FwcHJvdmVkID1cbiAgICAgICAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSAmJlxuICAgICAgICBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsU3RhdHVzID09PSAnYXBwcm92ZWQnICYmXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zLnNvbWUoKGFjdGlvbjogYW55KSA9PiAoYWN0aW9uLnRvb2xfbmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbmZpZ3VyZV9hZ2VudF9hY2Nlc3MnKVxuICAgICAgbGV0IGNyZWF0ZUFnZW50Rm9sbG93VXA6IHsgYWdlbnRJZDogc3RyaW5nIH0gfCB1bmRlZmluZWRcbiAgICAgIGlmICh3YXNDcmVhdGVBZ2VudEFwcHJvdmVkICYmIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTICYmIGNvbXBsZXRlZEFnZW50SWQ/LnRyaW0oKSkge1xuICAgICAgICBjcmVhdGVBZ2VudEZvbGxvd1VwID0geyBhZ2VudElkOiBjb21wbGV0ZWRBZ2VudElkLnRyaW0oKSB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB3YXNDb25maWd1cmVBZ2VudEFjY2Vzc0FwcHJvdmVkICYmXG4gICAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTICYmXG4gICAgICAgIChjb21wbGV0ZWRBZ2VudElkPy50cmltKCkgfHxcbiAgICAgICAgICBleHRyYWN0QWdlbnRJZEZyb21QZW5kaW5nQWN0aW9uc0J5VG9vbE5hbWUocGVuZGluZ0FjdGlvbnMsICdjb25maWd1cmVfYWdlbnRfYWNjZXNzJykpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgY29uZmlndXJlZEFnZW50SWQgPVxuICAgICAgICAgIGNvbXBsZXRlZEFnZW50SWQ/LnRyaW0oKSB8fFxuICAgICAgICAgIGV4dHJhY3RBZ2VudElkRnJvbVBlbmRpbmdBY3Rpb25zQnlUb29sTmFtZShwZW5kaW5nQWN0aW9ucywgJ2NvbmZpZ3VyZV9hZ2VudF9hY2Nlc3MnKVxuICAgICAgICBjcmVhdGVBZ2VudEZvbGxvd1VwID0ge1xuICAgICAgICAgIGFnZW50SWQ6IGNvbmZpZ3VyZWRBZ2VudElkIGFzIHN0cmluZyxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAod2FzQ3JlYXRlQWdlbnRBcHByb3ZlZCkge1xuICAgICAgICBldmVudChFVkVOVFMuYWlDaGF0SGl0bE9wdGlvbiwge1xuICAgICAgICAgIGFnZW50X3R5cGU6IGdldEhpdGxBbmFseXRpY3NBZ2VudFR5cGUoYWdlbnQpLFxuICAgICAgICAgIGFjdGlvbl90eXBlOiBidWlsZEhpdGxBY3Rpb25UeXBlTGlzdChwZW5kaW5nQWN0aW9ucyksXG4gICAgICAgICAgZGVjaXNpb246ICdhY2NlcHQnLFxuICAgICAgICAgIG9wdGlvbjogJ2NyZWF0ZV9hZ2VudCcsXG4gICAgICAgICAgLi4uKGNvbXBsZXRlZEFnZW50SWQ/LnRyaW0oKSA/IHsgY3JlYXRlZF9hZ2VudF9pZDogY29tcGxldGVkQWdlbnRJZC50cmltKCkgfSA6IHt9KSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd2FzRWRpdEFnZW50QXBwcm92ZWQgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgIHByZXZpb3VzTWVzc2FnZT8uYXBwcm92YWxTdGF0dXMgPT09ICdhcHByb3ZlZCcgJiZcbiAgICAgICAgcGVuZGluZ0FjdGlvbnMuc29tZSgoYWN0aW9uOiBhbnkpID0+IChhY3Rpb24udG9vbF9uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSAnZWRpdF9hZ2VudCcpXG5cbiAgICAgIGxldCBlZGl0QWdlbnRGb2xsb3dVcDogeyBhZ2VudElkOiBzdHJpbmcgfSB8IHVuZGVmaW5lZFxuICAgICAgaWYgKHdhc0VkaXRBZ2VudEFwcHJvdmVkKSB7XG4gICAgICAgIGNvbnN0IGZyb21TdHJlYW0gPSBjb21wbGV0ZWRBZ2VudElkPy50cmltKClcbiAgICAgICAgY29uc3QgZnJvbUFyZ3MgPSBleHRyYWN0QWdlbnRJZEZyb21FZGl0QWdlbnRQZW5kaW5nQWN0aW9ucyhwZW5kaW5nQWN0aW9ucylcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRBZ2VudElkID0gZnJvbVN0cmVhbSB8fCBmcm9tQXJnc1xuICAgICAgICBpZiAocmVzb2x2ZWRBZ2VudElkKSB7XG4gICAgICAgICAgZWRpdEFnZW50Rm9sbG93VXAgPSB7IGFnZW50SWQ6IHJlc29sdmVkQWdlbnRJZCB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFza0lkc0Zyb21VcmxzID0gbWF0Y2hlcy5tYXAobWF0Y2ggPT4gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKSlcbiAgICAgIGNvbnN0IHRhc2tJZHNGcm9tRGVsZXRlQXBwcm92YWwgPSBleHRyYWN0VGFza0lkc0Zyb21EZWxldGVQZW5kaW5nQWN0aW9ucyhwZW5kaW5nQWN0aW9ucylcbiAgICAgIGNvbnN0IHRhc2tJZHNGcm9tRGVsZXRpb25UZXh0ID1cbiAgICAgICAgd2FzVGFza0RlbGV0ZSAmJiB0YXNrSWRzRnJvbVVybHMubGVuZ3RoID09PSAwICYmIHRhc2tJZHNGcm9tRGVsZXRlQXBwcm92YWwubGVuZ3RoID09PSAwXG4gICAgICAgICAgPyBleHRyYWN0VGFza0lkc0Zyb21Bc3Npc3RhbnREZWxldGlvblRleHQoY29udGVudClcbiAgICAgICAgICA6IFtdXG4gICAgICBjb25zdCB0YXNrSWRzRm9yRGFzaGJvYXJkID1cbiAgICAgICAgdGFza0lkc0Zyb21VcmxzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHRhc2tJZHNGcm9tVXJsc1xuICAgICAgICAgIDogdGFza0lkc0Zyb21EZWxldGVBcHByb3ZhbC5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IHRhc2tJZHNGcm9tRGVsZXRlQXBwcm92YWxcbiAgICAgICAgICAgIDogdGFza0lkc0Zyb21EZWxldGlvblRleHRcblxuICAgICAgY29uc3Qgc2hvdWxkU3luY0Rhc2hib2FyZCA9XG4gICAgICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiZcbiAgICAgICAgKHdhc1Rhc2tDcmVhdGlvbiB8fCB3YXNUYXNrRWRpdCB8fCB3YXNUYXNrRGVsZXRlKSAmJlxuICAgICAgICB0YXNrSWRzRm9yRGFzaGJvYXJkLmxlbmd0aCA+IDBcblxuICAgICAgaWYgKHNob3VsZFN5bmNEYXNoYm9hcmQpIHtcbiAgICAgICAgY29uc3QgdGFza0lkcyA9IHRhc2tJZHNGb3JEYXNoYm9hcmRcbiAgICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHRhYiA9IGF3YWl0IGdldFRhYlRhc2tEZWZhdWx0KHRhc2tJZHNbMF0pXG4gICAgICAgICAgY29uc3QgdGFiU2VnbWVudCA9IHRhYiA/IGAvJHt0YWJ9YCA6ICcvZGV0YWlsJ1xuICAgICAgICAgIGNvbnRlbnRUb0FkZCA9IGNvbnRlbnQucmVwbGFjZSh0YXNrVXJsUmVnZXgsIHVybCA9PlxuICAgICAgICAgICAgdXJsLnJlcGxhY2UoL1xcLyhkZXRhaWx8bWVzc2FnZXxtZXNzYWdlc3xmaWxlc3xoaXN0b3J5fGhvdXJzKSg/PSR8XFw/KS8sIHRhYlNlZ21lbnQpXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdFByb2plY3RNZXNzYWdlID0gbWVzc2FnZXNSZWYuY3VycmVudC5maWx0ZXIobXNnID0+IG1zZy5wcm9qZWN0SWQpLmF0KC0xKVxuICAgICAgICBjb25zdCBjb250ZXh0UHJvamVjdElkUmF3ID0gcHJvamVjdD8uaWQgfHwgbGFzdFByb2plY3RNZXNzYWdlPy5wcm9qZWN0SWRcbiAgICAgICAgY29uc3QgY29udGV4dFByb2plY3RJZCA9IGNvbnRleHRQcm9qZWN0SWRSYXcgPyBwYXJzZUludChTdHJpbmcoY29udGV4dFByb2plY3RJZFJhdyksIDEwKSA6IG51bGxcbiAgICAgICAgY29uc3QgcGF0aE1hdGNoID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLm1hdGNoKC9eXFwvcHJvamVjdHNcXC8oXFxkKylcXC8vKVxuICAgICAgICBjb25zdCByb3V0ZVByb2plY3RJZCA9IHBhdGhNYXRjaCA/IHBhcnNlSW50KHBhdGhNYXRjaFsxXSwgMTApIDogbnVsbFxuICAgICAgICBjb25zdCBpc09uUHJvamVjdFJvdXRlID0gY29udGV4dFByb2plY3RJZCAmJiByb3V0ZVByb2plY3RJZCAmJiBjb250ZXh0UHJvamVjdElkID09PSByb3V0ZVByb2plY3RJZFxuXG4gICAgICAgIGlmIChpc09uUHJvamVjdFJvdXRlKSB7XG4gICAgICAgICAgaWYgKHdhc1Rhc2tDcmVhdGlvbikge1xuICAgICAgICAgICAgd2luZG93Lm5ld1Byb2plY3REYXNoYm9hcmQ/LmFkZEV4aXN0aW5nVGFza1RvRGFzaGJvYXJkPy4odGFza0lkcylcbiAgICAgICAgICB9IGVsc2UgaWYgKHdhc1Rhc2tFZGl0KSB7XG4gICAgICAgICAgICB3aW5kb3cubmV3UHJvamVjdERhc2hib2FyZD8uZWRpdEV4aXN0aW5nVGFza0luRGFzaGJvYXJkPy4odGFza0lkcylcbiAgICAgICAgICB9IGVsc2UgaWYgKHdhc1Rhc2tEZWxldGUpIHtcbiAgICAgICAgICAgIHdpbmRvdy5uZXdQcm9qZWN0RGFzaGJvYXJkPy5kZWxldGVFeGlzdGluZ1Rhc2tGcm9tRGFzaGJvYXJkPy4odGFza0lkcylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVmZXRjaCBkZWwgdGFzayBwYW5lbCBzaSBlc3TDoSBhYmllcnRvIHkgbGEgdG9vbCBhcHJvYmFkYSBlZGl0w7MvYm9ycsOzIGVzYSB0YXJlYS5cbiAgICAgIC8vIEN1YnJlIGxvcyBkb3MgZmx1am9zIGRlIGFwcHJvdmFsOlxuICAgICAgLy8gICAxKSBBcHByb3ZhbCBwb3IgYm90w7NuIOKGkiBgcHJldmlvdXNNZXNzYWdlLmFwcHJvdmFsLnBlbmRpbmdfYWN0aW9uc2AgKHbDrWEgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSlcbiAgICAgIC8vICAgMikgTWFudWFsIGFwcHJvdmFsICh1c3VhcmlvIHRpcGVhIFwic2lcIi9cIm5vXCIpIOKGkiBgbGFzdE1hbnVhbEFwcHJvdmFsUmVmLmN1cnJlbnRgXG4gICAgICBjb25zdCBvcGVuVGFza1BhbmVsSWQgPSB3aW5kb3cudGFza1BhbmVsPy50YXNrSWRcbiAgICAgIGNvbnN0IG1hbnVhbEFwcHJvdmFsID0gbGFzdE1hbnVhbEFwcHJvdmFsUmVmLmN1cnJlbnRcbiAgICAgIGxhc3RNYW51YWxBcHByb3ZhbFJlZi5jdXJyZW50ID0gbnVsbCAvLyBjb25zdW1pciB1bmEgc29sYSB2ZXpcbiAgICAgIGNvbnN0IG1hbnVhbFdhc1Rhc2tFZGl0ID0gISFtYW51YWxBcHByb3ZhbCAmJiBUQVNLX0VESVRfVE9PTFMuaW5jbHVkZXMobWFudWFsQXBwcm92YWwudG9vbE5hbWUpXG4gICAgICBjb25zdCBtYW51YWxXYXNUYXNrRGVsZXRlID0gISFtYW51YWxBcHByb3ZhbCAmJiBUQVNLX0RFTEVURV9UT09MUy5pbmNsdWRlcyhtYW51YWxBcHByb3ZhbC50b29sTmFtZSlcblxuICAgICAgLy8gU3luYyBQbGFubmVyOiBhdmlzYXIgY2FyZ2EgZGUgaG9yYXMgY29uZmlybWFkYSAoY3JlYXRlX2hvdXIgLyBjcmVhdGVfaG91cnMpLlxuICAgICAgY29uc3QgaG91cnNUb29sc0Zyb21BcHByb3ZhbCA9IHBlbmRpbmdBY3Rpb25zXG4gICAgICAgIC5tYXAoKGFjdGlvbjogUGVuZGluZ0FjdGlvbikgPT4gYWN0aW9uLnRvb2xfbmFtZSlcbiAgICAgICAgLmZpbHRlcigodG9vbE5hbWUpOiB0b29sTmFtZSBpcyBzdHJpbmcgPT4gaXNIb3Vyc0NoYXJnZVRvb2wodG9vbE5hbWUpKVxuICAgICAgY29uc3Qgd2FzSG91cnNDaGFyZ2VBcHByb3ZlZCA9XG4gICAgICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiZcbiAgICAgICAgcHJldmlvdXNNZXNzYWdlPy5hcHByb3ZhbFN0YXR1cyA9PT0gJ2FwcHJvdmVkJyAmJlxuICAgICAgICBob3Vyc1Rvb2xzRnJvbUFwcHJvdmFsLmxlbmd0aCA+IDBcbiAgICAgIGNvbnN0IG1hbnVhbEhvdXJzVG9vbCA9IG1hbnVhbEFwcHJvdmFsPy50b29sTmFtZVxuICAgICAgY29uc3Qgd2FzSG91cnNDaGFyZ2VNYW51YWxBcHByb3ZlZCA9IGlzSG91cnNDaGFyZ2VUb29sKG1hbnVhbEhvdXJzVG9vbClcblxuICAgICAgaWYgKHdhc0hvdXJzQ2hhcmdlQXBwcm92ZWQgfHwgd2FzSG91cnNDaGFyZ2VNYW51YWxBcHByb3ZlZCkge1xuICAgICAgICBjb25zdCB0b29scyA9IHdhc0hvdXJzQ2hhcmdlQXBwcm92ZWQgPyBob3Vyc1Rvb2xzRnJvbUFwcHJvdmFsIDogbWFudWFsSG91cnNUb29sID8gW21hbnVhbEhvdXJzVG9vbF0gOiBbXVxuICAgICAgICBkaXNwYXRjaE1haWFIb3Vyc0NoYXJnZWQoe1xuICAgICAgICAgIHNvdXJjZTogJ21haWEnLFxuICAgICAgICAgIHRvb2xzLFxuICAgICAgICAgIHNlc3Npb25JZDogbWVtb3J5U2Vzc2lvbklkLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAob3BlblRhc2tQYW5lbElkICYmICh3YXNUYXNrRWRpdCB8fCB3YXNUYXNrRGVsZXRlIHx8IG1hbnVhbFdhc1Rhc2tFZGl0IHx8IG1hbnVhbFdhc1Rhc2tEZWxldGUpKSB7XG4gICAgICAgIGNvbnN0IG1hbnVhbFBzZXVkb0FjdGlvbjogUGVuZGluZ0FjdGlvbiB8IG51bGwgPSBtYW51YWxBcHByb3ZhbFxuICAgICAgICAgID8gKHsgdG9vbF9uYW1lOiBtYW51YWxBcHByb3ZhbC50b29sTmFtZSwgdG9vbF9hcmdzOiBtYW51YWxBcHByb3ZhbC50b29sQXJncyA/PyB7fSB9IGFzIFBlbmRpbmdBY3Rpb24pXG4gICAgICAgICAgOiBudWxsXG4gICAgICAgIGNvbnN0IGFmZmVjdGVkVGFza0lkcyA9IFtcbiAgICAgICAgICAuLi5leHRyYWN0VGFza0lkc0Zyb21QZW5kaW5nQWN0aW9uc0FyZ3MocGVuZGluZ0FjdGlvbnMpLFxuICAgICAgICAgIC4uLnRhc2tJZHNGcm9tVXJscyxcbiAgICAgICAgICAuLi50YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsLFxuICAgICAgICAgIC4uLihtYW51YWxQc2V1ZG9BY3Rpb24gPyBleHRyYWN0VGFza0lkc0Zyb21QZW5kaW5nQWN0aW9uc0FyZ3MoW21hbnVhbFBzZXVkb0FjdGlvbl0pIDogW10pLFxuICAgICAgICBdLm1hcChTdHJpbmcpXG4gICAgICAgIGlmIChhZmZlY3RlZFRhc2tJZHMuaW5jbHVkZXMoU3RyaW5nKG9wZW5UYXNrUGFuZWxJZCkpKSB7XG4gICAgICAgICAgd2luZG93LnRhc2tQYW5lbD8ucmVmZXRjaFRhc2s/LigpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYWRkTWVzc2FnZSh7XG4gICAgICAgIGlkOiBgYW5zd2VyLSR7bWVtb3J5U2Vzc2lvbklkfWAsXG4gICAgICAgIG1lc3NhZ2U6IGNvbnRlbnRUb0FkZCxcbiAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6ICdBc3Npc3RhbnQnIH0sXG4gICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICAgIHNvdXJjZXMsXG4gICAgICAgIC4uLihhdHRhY2htZW50cy5sZW5ndGggPiAwID8geyBhdHRhY2htZW50cyB9IDoge30pLFxuICAgICAgICBtZW1vcnlTZXNzaW9uSWQsXG4gICAgICAgIHN1Z2dlc3Rpb25zOiBzdWdnZXN0aW9ucyB8fCBbXSxcbiAgICAgICAgLi4uKGNyZWF0ZUFnZW50Rm9sbG93VXAgPyB7IGNyZWF0ZUFnZW50Rm9sbG93VXAgfSA6IHt9KSxcbiAgICAgIH0pXG5cbiAgICAgIGlmIChjcmVhdGVBZ2VudEZvbGxvd1VwPy5hZ2VudElkKSB7XG4gICAgICAgIGZldGNoQWdlbnREZXRhaWwoY3JlYXRlQWdlbnRGb2xsb3dVcC5hZ2VudElkKVxuICAgICAgICAgIC50aGVuKGNoYXRBZ2VudCA9PiB7XG4gICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ21haWEtbWVyZ2UtY3JlYXRlZC1hZ2VudC1pbnRvLWxpc3QnLCB7XG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7IGFnZW50OiBjaGF0QWdlbnQgfSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW3VzZUNoYXRNYW5hZ2VyXSBObyBzZSBwdWRvIGHDsWFkaXIgZWwgYWdlbnRlIHJlY2nDqW4gY3JlYWRvIGFsIGxpc3RhZG8nLCBlcnIpXG4gICAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGVkaXRBZ2VudEZvbGxvd1VwPy5hZ2VudElkKSB7XG4gICAgICAgIGZldGNoQWdlbnREZXRhaWwoZWRpdEFnZW50Rm9sbG93VXAuYWdlbnRJZClcbiAgICAgICAgICAudGhlbihjaGF0QWdlbnQgPT4ge1xuICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdtYWlhLXN5bmMtZWRpdGVkLWFnZW50LWZyb20tY2hhdCcsIHtcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHsgYWdlbnQ6IGNoYXRBZ2VudCB9LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbdXNlQ2hhdE1hbmFnZXJdIE5vIHNlIHB1ZG8gcmVmcmVzY2FyIGVsIGFnZW50ZSBlZGl0YWRvJywgZXJyKVxuICAgICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIGlmIChmaXJzdFRpbWVSZWYuY3VycmVudCkge1xuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudCgncmVmZXRjaC1zZXNzaW9uJylcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudClcbiAgICAgICAgZmlyc3RUaW1lUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgfVxuICAgIH0sXG4gICAgW2FkZE1lc3NhZ2UsIHJlbW92ZU1lc3NhZ2UsIHByb2plY3QsIGdldFRhYlRhc2tEZWZhdWx0LCBldmVudCwgYWdlbnRdXG4gIClcblxuICBjb25zdCBoYW5kbGVTdHJlYW1TdG9wID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNsZWFyU3RyZWFtVWlSZWYuY3VycmVudCgpXG4gICAgY29uc3QgdGVtcE1lc3NhZ2VJZCA9IGBhbnN3ZXItJHtjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnR9LXN0cmVhbWluZ2BcbiAgICBzdHJlYW1pbmdTdG9yZS5jbGVhcigpXG4gICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIHJlbW92ZU1lc3NhZ2UodGVtcE1lc3NhZ2VJZClcblxuICAgIGFkZE1lc3NhZ2Uoe1xuICAgICAgaWQ6IGBhbnN3ZXItJHtjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnR9LWNhbmNlbGxlZGAsXG4gICAgICBtZXNzYWdlOiB0KCdjaGF0LmNhbmNlbGxlZCcpLFxuICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiAnQXNzaXN0YW50JyB9LFxuICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgIGlzRnJvbnRlbmRDYW5jZWxsZWQ6IHRydWUsXG4gICAgfSlcbiAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudCgncmVmZXRjaC1zZXNzaW9uJylcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpXG4gICAgfSwgNTAwKVxuICB9LCBbYWRkTWVzc2FnZSwgcmVtb3ZlTWVzc2FnZSwgdF0pXG5cbiAgY29uc3QgaGFuZGxlQXBwcm92YWxSZXF1aXJlZCA9IHVzZUNhbGxiYWNrKFxuICAgIChhcHByb3ZhbDogQXBwcm92YWxSZXF1ZXN0LCBhY2N1bXVsYXRlZENvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgdGVtcE1lc3NhZ2VJZCA9IGBhbnN3ZXItJHtjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnR9LXN0cmVhbWluZ2BcbiAgICAgIHN0cmVhbWluZ1N0b3JlLmNsZWFyKClcbiAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgcmVtb3ZlTWVzc2FnZSh0ZW1wTWVzc2FnZUlkKVxuXG4gICAgICBjb25zdCBoaXRsQ29udGV4dDogSGl0bEV4ZWN1dGlvbkNvbnRleHQgPSB7XG4gICAgICAgIG1lc3NhZ2VJZDogYGFwcHJvdmFsLSR7YXBwcm92YWwub3JpZ2luYWxfdGhyZWFkX2lkfWAsXG4gICAgICAgIG1lc3NhZ2VUZXh0OiBhY2N1bXVsYXRlZENvbnRlbnQgfHwgJycsXG4gICAgICAgIGFwcHJvdmFsLFxuICAgICAgICBwZW5kaW5nQWN0aW9uczogYXBwcm92YWwucGVuZGluZ19hY3Rpb25zLFxuICAgICAgICB0aHJlYWRJZHM6IGFwcHJvdmFsLnBlbmRpbmdfYWN0aW9ucz8ubWFwKGFjdGlvbiA9PiBhY3Rpb24udGhyZWFkX2lkKSxcbiAgICAgIH1cbiAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBoaXRsQ29udGV4dFxuXG4gICAgICBpZiAoYXBwcm92YWwubWFudWFsX2FwcHJvdmFsX2RldGVjdGVkKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0QWN0aW9uID0gYXBwcm92YWwucGVuZGluZ19hY3Rpb25zPy5bMF1cbiAgICAgICAgY29uc3QgdG9vbE5hbWUgPSAoYXBwcm92YWwgYXMgeyB0b29sX25hbWU/OiBzdHJpbmcgfSkudG9vbF9uYW1lID8/IGZpcnN0QWN0aW9uPy50b29sX25hbWUgPz8gJydcbiAgICAgICAgY29uc3QgdG9vbEFyZ3MgPVxuICAgICAgICAgICgoYXBwcm92YWwgYXMgeyB0b29sX2FyZ3M/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9KS50b29sX2FyZ3MgPz9cbiAgICAgICAgICAgIChmaXJzdEFjdGlvbj8udG9vbF9hcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKSkgfHxcbiAgICAgICAgICBudWxsXG4gICAgICAgIGlmICh0b29sTmFtZSkge1xuICAgICAgICAgIGxhc3RNYW51YWxBcHByb3ZhbFJlZi5jdXJyZW50ID0geyB0b29sTmFtZSwgdG9vbEFyZ3MgfVxuICAgICAgICB9XG4gICAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBhIG1lc3NhZ2Ugd2l0aCB0aGUgYXBwcm92YWwgcmVxdWVzdFxuICAgICAgYWRkTWVzc2FnZSh7XG4gICAgICAgIGlkOiBgYXBwcm92YWwtJHthcHByb3ZhbC5vcmlnaW5hbF90aHJlYWRfaWR9YCxcbiAgICAgICAgbWVzc2FnZTogYWNjdW11bGF0ZWRDb250ZW50IHx8ICcnLFxuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogJ0Fzc2lzdGFudCcgfSxcbiAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgYXBwcm92YWwsXG4gICAgICAgIGFwcHJvdmFsU3RhdHVzOiAncGVuZGluZycsXG4gICAgICB9KVxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIH0sXG4gICAgW2FkZE1lc3NhZ2UsIHJlbW92ZU1lc3NhZ2VdXG4gIClcblxuICBjb25zdCB7XG4gICAgYXNrTWFpYSxcbiAgICBpc0xvYWRpbmc6IHdhaXRpbmdSZXNwb25zZSxcbiAgICBpc1dyaXRpbmcsXG4gICAgbG9hZGluZ01lc3NhZ2UsXG4gICAgc3RyZWFtQWN0aXZpdHksXG4gICAgdXBkYXRlU3RyZWFtQWN0aXZpdHksXG4gICAgc3RvcFN0cmVhbWluZyxcbiAgICBhYm9ydFN0cmVhbVNpbGVudGx5LFxuICB9ID0gdXNlT3JjaGVzdHJhdG9yU3RyZWFtKHtcbiAgICBvbkVycm9yOiBoYW5kbGVTdHJlYW1FcnJvcixcbiAgICBvblN0cmVhbVVwZGF0ZTogaGFuZGxlU3RyZWFtVXBkYXRlLFxuICAgIG9uRmluaXNoU3RyZWFtOiBoYW5kbGVTdHJlYW1GaW5pc2gsXG4gICAgb25TdG9wOiBoYW5kbGVTdHJlYW1TdG9wLFxuICAgIG9uQXBwcm92YWxSZXF1aXJlZDogaGFuZGxlQXBwcm92YWxSZXF1aXJlZCxcbiAgICBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZixcbiAgfSlcblxuICAvLyBNYW50ZW5lbW9zIGVsIHNldHRlciBtw6FzIHJlY2llbnRlIGVuIHVuYSByZWYgcGFyYSBxdWUgcHVlZGEgdXNhcnNlIGRlc2RlXG4gIC8vIGVmZWN0b3MgZGVmaW5pZG9zIGFudGVzIGVuIGVsIGFyY2hpdm8gKGNhbWJpbyBkZSBjaGF0LCByZXNldCwgZXRjLikuXG4gIGFib3J0U3RyZWFtU2lsZW50bHlSZWYuY3VycmVudCA9IGFib3J0U3RyZWFtU2lsZW50bHlcbiAgY2xlYXJTdHJlYW1VaVJlZi5jdXJyZW50ID0gKCkgPT4ge1xuICAgIHVwZGF0ZVN0cmVhbUFjdGl2aXR5KG51bGwpXG4gICAgc2V0QWN0aXZlTG9hZGluZ3Moe30pXG4gICAgc2V0SXNDb250aW51aW5nU3RyZWFtKGZhbHNlKVxuICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBudWxsXG4gIH1cblxuICBjb25zdCBjdXJyZW50UHJvamVjdCA9IHByb2plY3RcblxuICBjb25zdCBzZW5kTWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGF0dGFjaG1lbnRzT3JPcHRpb25zPzogQXR0YWNobWVudEZpbGVbXSB8IFNlbmRNZXNzYWdlT3B0aW9ucyxcbiAgICAgIGZhcUlkPzogc3RyaW5nLFxuICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcsXG4gICAgICBtZW50aW9ucz86IENvbnRleHRNZW50aW9uW10sXG4gICAgICBmdWFJZD86IHN0cmluZyxcbiAgICAgIHNjSWQ/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCB8fCB3YWl0aW5nUmVzcG9uc2UgfHwgbG9hZGluZ01lc3NhZ2VzKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGF0dGFjaG1lbnRzLCBvcHRpb25zIH0gPSBub3JtYWxpemVTZW5kTWVzc2FnZUFyZ3MoYXR0YWNobWVudHNPck9wdGlvbnMpXG4gICAgICAvLyBMYXMgbWVudGlvbnMgcHVlZGVuIHZlbmlyIHbDrWEgNXRvIHBhcsOhbWV0cm8gKGNhbGwgcG9zaXRpb25hbCBkZXNkZSBlbCBmb290ZXIpXG4gICAgICAvLyBvIHbDrWEgU2VuZE1lc3NhZ2VPcHRpb25zIChjYWxsIHByb2dyYW3DoXRpY28pLiBFbCBwYXLDoW1ldHJvIGV4cGzDrWNpdG8gZ2FuYS5cbiAgICAgIGNvbnN0IGVmZmVjdGl2ZU1lbnRpb25zID0gbWVudGlvbnMgPz8gb3B0aW9ucy5tZW50aW9uc1xuICAgICAgY29uc3QgY29udGV4dE1lc3NhZ2U6IENvbnRleHRNZXNzYWdlIHwgdW5kZWZpbmVkID0gYnVpbGRDb250ZXh0TWVzc2FnZShlZmZlY3RpdmVNZW50aW9ucylcbiAgICAgIGNvbnN0IHBheWxvYWRGdWFJZCA9IGZ1YUlkID8/IG9wdGlvbnMuZnVhSWRcbiAgICAgIGNvbnN0IHBheWxvYWRTY0lkID0gc2NJZCA/PyBvcHRpb25zLnNjSWRcbiAgICAgIGNvbnN0IHBheWxvYWRDb250ZXh0RGF0YSA9IG9wdGlvbnMuY29udGV4dERhdGFcbiAgICAgIGNvbnN0IGRpc3BsYXlNZXNzYWdlID0gZm9ybWF0UXVpY2tBY3Rpb25NZXNzYWdlRm9yRGlzcGxheShtZXNzYWdlLCB7XG4gICAgICAgIGZ1YUlkOiBwYXlsb2FkRnVhSWQsXG4gICAgICAgIHNjSWQ6IHBheWxvYWRTY0lkLFxuICAgICAgfSlcblxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICBjb25zdCBuZXdNZXNzYWdlSWQgPSB1dWlkdjQoKVxuICAgICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gbmV3TWVzc2FnZUlkXG4gICAgICBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQgPSBtZXNzYWdlXG5cbiAgICAgIGlmICghcmVwb3J0ZWRFdmVudC5jdXJyZW50KSB7XG4gICAgICAgIGV2ZW50KEVWRU5UUy5wbUFpVHlwZWRUZXh0KVxuICAgICAgICByZXBvcnRlZEV2ZW50LmN1cnJlbnQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmaWNhciBzaSBlbCBjb250ZXh0byBnbG9iYWwgZXN0w6EgZGVzYWN0dWFsaXphZG9cbiAgICAgIGNvbnN0IGxhc3RNZXNzYWdlV2l0aFByb2plY3QgPSBtZXNzYWdlc1JlZi5jdXJyZW50LmZpbHRlcihtc2cgPT4gbXNnLnByb2plY3RJZCkuYXQoLTEpXG5cbiAgICAgIGNvbnN0IGN1cnJlbnRBZ2VudEZyb21NZXNzYWdlcyA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQ/LlttZXNzYWdlc1JlZi5jdXJyZW50Lmxlbmd0aCAtIDFdPy5hZ2VudElkXG5cbiAgICAgIC8vIE5vIGFncmVnYXIgcHJvamVjdElkIGFsIG1lbnNhamUgZGVsIHVzdWFyaW8gLSBzZSBkZXRlcm1pbmFyw6EgZGVzcHXDqXNcbiAgICAgIGFkZE1lc3NhZ2Uoe1xuICAgICAgICBpZDogYHF1ZXN0aW9uLSR7Y3VycmVudE1lc3NhZ2VJZC5jdXJyZW50fWAsXG4gICAgICAgIG1lc3NhZ2U6IGRpc3BsYXlNZXNzYWdlLFxuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB1c2VyOiBjdXJyZW50VXNlcixcbiAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLlVTRVIsXG4gICAgICAgIHNvdXJjZXM6IGF0dGFjaG1lbnRzLFxuICAgICAgICAuLi4oY29udGV4dE1lc3NhZ2UgPyB7IGNvbnRleHRNZXNzYWdlIH0gOiB7fSksXG4gICAgICB9KVxuXG4gICAgICBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQgPSB1dWlkdjQoKVxuXG4gICAgICBjb25zdCBzdHJlYW1pbmdQbGFjZWhvbGRlcklkID0gYGFuc3dlci0ke2N1cnJlbnRNZXNzYWdlSWQuY3VycmVudH0tc3RyZWFtaW5nYFxuICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFxuICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBjdXJyZW50Q2hhdElkLmN1cnJlbnRcbiAgICAgIGFkZE1lc3NhZ2Uoe1xuICAgICAgICBpZDogc3RyZWFtaW5nUGxhY2Vob2xkZXJJZCxcbiAgICAgICAgbWVzc2FnZTogJycsXG4gICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiBhZ2VudD8ubmFtZSB8fCAnQXNzaXN0YW50JyB9LFxuICAgICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgfSlcblxuICAgICAgbGV0IGZpbmFsTWVzc2FnZSA9IG1lc3NhZ2VcblxuICAgICAgaWYgKG1lc3NhZ2UgPT09IHQoJ3FhLml0ZW1zLnJlbnRhYmlsaWRhZF9wcm95ZWN0bycpKSB7XG4gICAgICAgIGZpbmFsTWVzc2FnZSA9IGBGQVE6ICR7dCgncWEuaXRlbXMucmVudGFiaWxpZGFkX3Byb3llY3RvJyl9IC0gVGlwbyBkZSByZW50YWJpbGlkYWQ6ICR7XG4gICAgICAgICAgb3B0aW9ucy5wcm9qZWN0Q2hhbmdlZD8uaW5jb21lVHlwZSB8fCBjb250ZXh0UmVmLmN1cnJlbnQucHJvamVjdD8uaW5jb21lVHlwZVxuICAgICAgICB9YFxuICAgICAgfVxuXG4gICAgICBjb25zdCBoaXN0b3J5ID0gbWVzc2FnZXNSZWYuY3VycmVudC5tYXAoaGlzdG9yeU1lc3NhZ2UgPT4gKHtcbiAgICAgICAgY29udGVudDogaGlzdG9yeU1lc3NhZ2UubWVzc2FnZSxcbiAgICAgICAgcm9sZTogaGlzdG9yeU1lc3NhZ2UudXNlci5pZCA9PT0gYXV0aFVzZXIuaWQudG9TdHJpbmcoKSA/IENoYXRIaXN0b3J5Um9sZS5VU0VSIDogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgIH0pKVxuXG4gICAgICBjb25zdCB7XG4gICAgICAgIGNoaXBzUHJvamVjdDogY3R4Q2hpcHNQcm9qZWN0LFxuICAgICAgICBwcm9qZWN0OiBjdHhQcm9qZWN0LFxuICAgICAgICBjbGllbnQ6IGN0eENsaWVudCxcbiAgICAgICAgdGFzazogY3R4VGFzayxcbiAgICAgIH0gPSBjb250ZXh0UmVmLmN1cnJlbnRcbiAgICAgIGNvbnN0IGxhc3RNZXNzYWdlUHJvamVjdElkID0gbGFzdE1lc3NhZ2VXaXRoUHJvamVjdD8ucHJvamVjdElkXG4gICAgICBjb25zdCBwcm9qZWN0VG9SZXF1ZXN0ID0gcmVzb2x2ZVByb2plY3RUb1JlcXVlc3QoY3R4Q2hpcHNQcm9qZWN0LCBsYXN0TWVzc2FnZVByb2plY3RJZClcblxuICAgICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmZXRjaFByb2plY3RzKFtwcm9qZWN0VG9SZXF1ZXN0XSlcblxuICAgICAgY29uc3QgcGF5bG9hZEZhcUlkID0gZmFxSWQgPz8gb3B0aW9ucy5mYXFJZFxuICAgICAgY29uc3QgcGF5bG9hZEFnZW50U3VnZ2VzdGlvbklkID0gYWdlbnRTdWdnZXN0aW9uSWQgPz8gb3B0aW9ucy5hZ2VudFN1Z2dlc3Rpb25JZFxuXG4gICAgICBjb25zdCBwYXlsb2FkRGF0YSA9IHtcbiAgICAgICAgbWVzc2FnZTogZmluYWxNZXNzYWdlLFxuICAgICAgICBoaXN0b3J5LFxuICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RUb1JlcXVlc3QsXG4gICAgICAgIGxhbmc6IGF1dGhVc2VyLmxhbmcsXG4gICAgICAgIHVzZXJJZDogYXV0aFVzZXIuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgZmlyc3ROYW1lOiBhdXRoVXNlci5maXJzdE5hbWUsXG4gICAgICAgIGxhc3ROYW1lOiBhdXRoVXNlci5sYXN0TmFtZSxcbiAgICAgICAgY29tcGFueUlkOiBhdXRoVXNlci5jb21wYW55X2lkLnRvU3RyaW5nKCksXG4gICAgICAgIGNoYXRJZDogY3VycmVudENoYXRJZC5jdXJyZW50LFxuICAgICAgICBtZXNzYWdlSWQ6IGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCxcbiAgICAgICAgYWdlbnROYW1lOiBhZ2VudD8ubmFtZSB8fCAnJyxcbiAgICAgICAgYWdlbnRJZDogY3VycmVudEFnZW50RnJvbU1lc3NhZ2VzIHx8IGFnZW50Py5pZCEsXG4gICAgICAgIGlzV2ViU2VhcmNoQWN0aXZlOiBpc1dlYlNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICBpc0RlZXBTZWFyY2hBY3RpdmU6IGlzRGVlcFNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICAuLi4oY3R4UHJvamVjdD8uZmVlSWQgIT0gbnVsbCA/IHsgZmVlSWQ6IE51bWJlcihjdHhQcm9qZWN0LmZlZUlkKSB9IDoge30pLFxuICAgICAgICAuLi5yZXNvbHZlQ2xpZW50UGF5bG9hZChjdHhDbGllbnQsIGN0eFByb2plY3QpLFxuICAgICAgICAuLi4ocHJvamVjdHM/Lmxlbmd0aCA/IHsgcHJvamVjdE5hbWU6IHByb2plY3RzWzBdLm5hbWUgfSA6IHt9KSxcbiAgICAgICAgLi4uKGN0eFRhc2s/LmlkICE9IG51bGxcbiAgICAgICAgICA/IHsgdGFza0lkOiBOdW1iZXIoY3R4VGFzay5pZCksIC4uLihjdHhUYXNrLm5hbWUgPyB7IHRhc2tOYW1lOiBjdHhUYXNrLm5hbWUgfSA6IHt9KSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLihhdHRhY2htZW50cy5sZW5ndGggPiAwID8geyBhdHRhY2htZW50cyB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZEZhcUlkID8geyBmYXFJZDogcGF5bG9hZEZhcUlkIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkQWdlbnRTdWdnZXN0aW9uSWQgPyB7IGFnZW50U3VnZ2VzdGlvbklkOiBwYXlsb2FkQWdlbnRTdWdnZXN0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWRGdWFJZCA/IHsgZnVhSWQ6IHBheWxvYWRGdWFJZCB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZFNjSWQgPyB7IHNjSWQ6IHBheWxvYWRTY0lkIH0gOiB7fSksXG4gICAgICAgIC4uLihhZ2VudD8uZW50aXR5ICE9IG51bGwgPyB7IGFnZW50RW50aXR5OiBhZ2VudC5lbnRpdHkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50Py50eXBlICE9IG51bGwgPyB7IGFnZW50VHlwZTogYWdlbnQudHlwZSB9IDoge30pLFxuICAgICAgICAuLi4oY29udGV4dE1lc3NhZ2UgPyB7IGNvbnRleHRNZXNzYWdlIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkQ29udGV4dERhdGEgPyB7IGNvbnRleHREYXRhOiBwYXlsb2FkQ29udGV4dERhdGEgfSA6IHt9KSxcbiAgICAgIH1cblxuICAgICAgYXNrTWFpYShwYXlsb2FkRGF0YSlcbiAgICB9LFxuICAgIFtcbiAgICAgIGFkZE1lc3NhZ2UsXG4gICAgICBldmVudCxcbiAgICAgIGFza01haWEsXG4gICAgICBwcm9qZWN0LFxuICAgICAgY2xpZW50LFxuICAgICAgdGFzayxcbiAgICAgIGNoaXBzUHJvamVjdCxcbiAgICAgIGF1dGhVc2VyLFxuICAgICAgYWdlbnQsXG4gICAgICB0LFxuICAgICAgd2FpdGluZ1Jlc3BvbnNlLFxuICAgICAgbG9hZGluZ01lc3NhZ2VzLFxuICAgICAgaXNXZWJTZWFyY2hBY3RpdmUsXG4gICAgICBpc0RlZXBTZWFyY2hBY3RpdmUsXG4gICAgXVxuICApXG5cbiAgY29uc3QgY2hhbmdlUHJvamVjdCA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFByb2plY3QpID0+IHtcbiAgICAgIGlmICghY3VycmVudFVzZXJRdWVzdGlvbi5jdXJyZW50KSByZXR1cm5cblxuICAgICAgaWYgKG9wdGlvbi5pZCAhPT0gcHJvamVjdD8uaWQpIHtcbiAgICAgICAgc2V0UHJvamVjdChvcHRpb24pXG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9qZWN0ICYmIGN1cnJlbnRVc2VyUXVlc3Rpb24uY3VycmVudCkge1xuICAgICAgICBjb25zdCBoaXN0b3J5ID0gbWVzc2FnZXNSZWYuY3VycmVudC5tYXAoaGlzdG9yeU1lc3NhZ2UgPT4gKHtcbiAgICAgICAgICBjb250ZW50OiBoaXN0b3J5TWVzc2FnZS5tZXNzYWdlLFxuICAgICAgICAgIHJvbGU6IGhpc3RvcnlNZXNzYWdlLnVzZXIuaWQgPT09IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCkgPyBDaGF0SGlzdG9yeVJvbGUuVVNFUiA6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICAgIH0pKVxuXG4gICAgICAgIGFza01haWEoe1xuICAgICAgICAgIG1lc3NhZ2U6IGN1cnJlbnRVc2VyUXVlc3Rpb24uY3VycmVudCxcbiAgICAgICAgICBoaXN0b3J5LFxuICAgICAgICAgIHByb2plY3RJZDogb3B0aW9uLmlkLFxuICAgICAgICAgIGxhbmc6IGF1dGhVc2VyLmxhbmcsXG4gICAgICAgICAgdXNlcklkOiBhdXRoVXNlci5pZC50b1N0cmluZygpLFxuICAgICAgICAgIGZpcnN0TmFtZTogYXV0aFVzZXIuZmlyc3ROYW1lLFxuICAgICAgICAgIGxhc3ROYW1lOiBhdXRoVXNlci5sYXN0TmFtZSxcbiAgICAgICAgICBjb21wYW55SWQ6IGF1dGhVc2VyLmNvbXBhbnlfaWQudG9TdHJpbmcoKSxcbiAgICAgICAgICBjaGF0SWQ6IGN1cnJlbnRDaGF0SWQuY3VycmVudCxcbiAgICAgICAgICBtZXNzYWdlSWQ6IGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCxcbiAgICAgICAgICBhZ2VudE5hbWU6IGFnZW50Py5uYW1lIHx8ICcnLFxuICAgICAgICAgIGFnZW50SWQ6IGFnZW50Py5pZCB8fCAnJyxcbiAgICAgICAgICBpc1dlYlNlYXJjaEFjdGl2ZTogaXNXZWJTZWFyY2hBY3RpdmVSZWYuY3VycmVudCxcbiAgICAgICAgICBpc0RlZXBTZWFyY2hBY3RpdmU6IGlzRGVlcFNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICAgIC4uLihvcHRpb24/LmZlZUlkICE9IG51bGwgPyB7IGZlZUlkOiBOdW1iZXIob3B0aW9uLmZlZUlkKSB9IDoge30pLFxuICAgICAgICAgIC4uLihvcHRpb24/LmNsaWVudElkICE9IG51bGwgPyB7IGNsaWVudElkOiBOdW1iZXIob3B0aW9uLmNsaWVudElkKSB9IDoge30pLFxuICAgICAgICAgIC4uLihhZ2VudD8uZW50aXR5ICE9IG51bGwgPyB7IGFnZW50RW50aXR5OiBhZ2VudC5lbnRpdHkgfSA6IHt9KSxcbiAgICAgICAgICAuLi4oYWdlbnQ/LnR5cGUgIT0gbnVsbCA/IHsgYWdlbnRUeXBlOiBhZ2VudC50eXBlIH0gOiB7fSksXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSxcbiAgICBbcHJvamVjdCwgc2V0UHJvamVjdCwgYXNrTWFpYSwgYXV0aFVzZXIsIGlzV2ViU2VhcmNoQWN0aXZlLCBhZ2VudF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZUZlZWRiYWNrID0gdXNlQ2FsbGJhY2soYXN5bmMgKGZlZWRiYWNrUHJvcDogRmVlZGJhY2ssIGNoYXRNZXNzYWdlSWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWFpYS5DaGF0cy53YXNIZWxwZnVsQ2hhdChjaGF0TWVzc2FnZUlkLCBmZWVkYmFja1Byb3AgPT09IEZlZWRiYWNrLlRIVU1CU19VUClcbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIG1lc3NhZ2VzUmVmLmN1cnJlbnQgPSBtZXNzYWdlc1JlZi5jdXJyZW50Lm1hcChtZXNzYWdlID0+IHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaWQgPT09IGNoYXRNZXNzYWdlSWQgJiYgbWVzc2FnZS5yb2xlID09PSAnYXNzaXN0YW50Jykge1xuICAgICAgICAgIHJldHVybiB7IC4uLm1lc3NhZ2UsIHdhc0hlbHBmdWw6IGZlZWRiYWNrUHJvcCA9PT0gRmVlZGJhY2suVEhVTUJTX1VQIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZVxuICAgICAgfSlcbiAgICB9XG4gIH0sIFtdKVxuXG4gIGNvbnN0IGhhbmRsZUFwcHJvdmFsRGVjaXNpb24gPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoXG4gICAgICB0aHJlYWRJZHM6IHN0cmluZ1tdLFxuICAgICAgZGVjaXNpb246ICdhcHByb3ZlJyB8ICdyZWplY3QnLFxuICAgICAgZWRpdGVkQWN0aW9ucz86IEFycmF5PHsgdG9vbF9uYW1lOiBzdHJpbmc7IGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+XG4gICAgKSA9PiB7XG4gICAgICBpZiAoIXRocmVhZElkcz8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHRocmVhZF9pZHMgcHJvdmlkZWQgZm9yIGFwcHJvdmFsIGRlY2lzaW9uJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIEJ1c2NhciBlbCBtZW5zYWplIHF1ZSBjb250aWVuZSBhbGd1bm8gZGUgZXN0b3MgdGhyZWFkSWRzIGVuIHN1cyBwZW5kaW5nX2FjdGlvbnNcbiAgICAgIGNvbnN0IG1lc3NhZ2VXaXRoQXBwcm92YWwgPSBtZXNzYWdlc1JlZi5jdXJyZW50LmZpbmQobSA9PlxuICAgICAgICBtLmFwcHJvdmFsPy5wZW5kaW5nX2FjdGlvbnM/LnNvbWUoYWN0aW9uID0+IHRocmVhZElkcy5pbmNsdWRlcyhhY3Rpb24udGhyZWFkX2lkKSlcbiAgICAgIClcblxuICAgICAgaWYgKCFtZXNzYWdlV2l0aEFwcHJvdmFsIHx8ICFtZXNzYWdlV2l0aEFwcHJvdmFsLmFwcHJvdmFsKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHNlIGVuY29udHLDsyBtZW5zYWplIGNvbiBhcHByb3ZhbCBwYXJhIHRocmVhZF9pZHM6JywgdGhyZWFkSWRzKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBhcHByb3ZhbCB9ID0gbWVzc2FnZVdpdGhBcHByb3ZhbFxuICAgICAgY29uc3QgbWVzc2FnZUlkID0gbWVzc2FnZVdpdGhBcHByb3ZhbC5pZFxuICAgICAgY29uc3QgbG9hZGluZ0tleSA9IHRocmVhZElkc1swXVxuXG4gICAgICBjb25zdCBoaXRsQ29udGV4dDogSGl0bEV4ZWN1dGlvbkNvbnRleHQgPSB7XG4gICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgbWVzc2FnZVRleHQ6IG1lc3NhZ2VXaXRoQXBwcm92YWwubWVzc2FnZSxcbiAgICAgICAgYXBwcm92YWwsXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zOiBhcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnMsXG4gICAgICAgIHRocmVhZElkcyxcbiAgICAgIH1cbiAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBoaXRsQ29udGV4dFxuXG4gICAgICBjb25zdCBpbml0aWFsQWN0aXZpdHkgPSByZXNvbHZlSW5pdGlhbEhpdGxTdHJlYW1BY3Rpdml0eSh0LCBoaXRsQ29udGV4dClcblxuICAgICAgLy8gVXBkYXRlIG1lc3NhZ2Ugc3RhdHVzIGltbWVkaWF0ZWx5XG4gICAgICBtZXNzYWdlc1JlZi5jdXJyZW50ID0gbWVzc2FnZXNSZWYuY3VycmVudC5tYXAobWVzc2FnZSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlLmlkID09PSBtZXNzYWdlSWQpIHtcbiAgICAgICAgICBjb25zdCBuZXdTdGF0dXMgPSBkZWNpc2lvbiA9PT0gJ2FwcHJvdmUnID8gJ2FwcHJvdmVkJyA6ICdyZWplY3RlZCdcbiAgICAgICAgICByZXR1cm4geyAuLi5tZXNzYWdlLCBhcHByb3ZhbFN0YXR1czogbmV3U3RhdHVzIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZVxuICAgICAgfSlcblxuICAgICAgLy8gVHJpZ2dlciByZS1yZW5kZXJcbiAgICAgIGNvbnN0IGV4aXN0aW5nTWVzc2FnZSA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQuZmluZChtID0+IG0uaWQgPT09IG1lc3NhZ2VJZClcbiAgICAgIGlmIChleGlzdGluZ01lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgbmV3U3RhdHVzID0gZGVjaXNpb24gPT09ICdhcHByb3ZlJyA/ICdhcHByb3ZlZCcgOiAncmVqZWN0ZWQnXG4gICAgICAgIGFkZE1lc3NhZ2UoeyAuLi5leGlzdGluZ01lc3NhZ2UsIGFwcHJvdmFsU3RhdHVzOiBuZXdTdGF0dXMgfSlcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsbCBjb250aW51ZS10aHJlYWQgZW5kcG9pbnQgd2l0aCBBTEwgdGhyZWFkX2lkcyBpbiBhIHNpbmdsZSByZXF1ZXN0XG4gICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIHNldElzQ29udGludWluZ1N0cmVhbSh0cnVlKVxuICAgICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gdXVpZHY0KClcblxuICAgICAgLy8gQWRkIGxvYWRpbmdcbiAgICAgIHNldEFjdGl2ZUxvYWRpbmdzKHByZXYgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgW2xvYWRpbmdLZXldOiBpbml0aWFsQWN0aXZpdHkubWVzc2FnZSxcbiAgICAgIH0pKVxuICAgICAgdXBkYXRlU3RyZWFtQWN0aXZpdHkoaW5pdGlhbEFjdGl2aXR5KVxuXG4gICAgICAvLyBNYXJjYSBzaSBlbCBzdHJlYW0gY2VycsOzIHbDrWEgdW4gZXZlbnRvIHRlcm1pbmFsIChjb21wbGV0ZS9hcHByb3ZhbC9lcnJvcikuXG4gICAgICAvLyBTaSBlbCBiYWNrZW5kIGNpZXJyYSBsYSBjb25leGnDs24gc2luIGVtaXRpcmxvLCBsaW1waWFtb3MgZWwgaW5kaWNhZG9yIGVuIGVsXG4gICAgICAvLyBgZmluYWxseWAgcGFyYSBxdWUgbm8gcXVlZGUgdHJhYmFkbyBlbiBcIkVzY3JpYmllbmRvIGxhIHJlc3B1ZXN0YVwiLlxuICAgICAgbGV0IHN0cmVhbVNldHRsZWQgPSBmYWxzZVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1haWEuT3JjaGVzdHJhdG9yLmNvbnRpbnVlVGhyZWFkKHtcbiAgICAgICAgICB0aHJlYWRJZHMsIC8vIFNlbmQgYWxsIGFjdGlvbiB0aHJlYWRfaWRzIGF0IG9uY2VcbiAgICAgICAgICBzZXNzaW9uSWQ6IGFwcHJvdmFsLnNlc3Npb25faWQsXG4gICAgICAgICAgZGVjaXNpb246IGVkaXRlZEFjdGlvbnMgPyAnZWRpdCcgOiBkZWNpc2lvbixcbiAgICAgICAgICBlZGl0ZWRBY3Rpb25zLFxuICAgICAgICAgIGFnZW50SWQ6IGFnZW50Py5pZCB8fCAnJyxcbiAgICAgICAgICBsYW5nOiBhdXRoVXNlci5sYW5nLFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICBzZXRJc0NvbnRpbnVpbmdTdHJlYW0oZmFsc2UpXG4gICAgICAgICAgaGFuZGxlU3RyZWFtRXJyb3IoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJvY2VzcyBTU0Ugc3RyZWFtXG4gICAgICAgIGF3YWl0IHByb2Nlc3NTU0VTdHJlYW0ocmVzcG9uc2UsIGxvYWRpbmdLZXksIHtcbiAgICAgICAgICBvblRoaW5raW5nOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpdml0eTogU3RyZWFtQWN0aXZpdHkgPSB7XG4gICAgICAgICAgICAgIHBoYXNlOiAndGhpbmtpbmcnLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBnZXRUaGlua2luZ0xvYWRpbmdNZXNzYWdlKDAsIHQpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlU3RyZWFtQWN0aXZpdHkoYWN0aXZpdHkpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblRva2VuOiAoY29udGVudDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICB1cGRhdGVTdHJlYW1BY3Rpdml0eShnZXRXcml0aW5nU3RyZWFtQWN0aXZpdHkodCkpXG4gICAgICAgICAgICBoYW5kbGVTdHJlYW1VcGRhdGUoY29udGVudCwgbnVsbCwgJycpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbk5vZGU6IChtZXNzYWdlOiBzdHJpbmcsIGN1cnJlbnRUaHJlYWRJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub2RlQWN0aXZpdHkgPSByZXNvbHZlSGl0bE5vZGVTdHJlYW1BY3Rpdml0eShcbiAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgdCxcbiAgICAgICAgICAgICAgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYuY3VycmVudCxcbiAgICAgICAgICAgICAgY3VycmVudFRocmVhZElkLFxuICAgICAgICAgICAgICB7IHVzZVJlc3VtaW5nRmFsbGJhY2s6IHRydWUgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgdXBkYXRlU3RyZWFtQWN0aXZpdHkobm9kZUFjdGl2aXR5KVxuICAgICAgICAgICAgc2V0QWN0aXZlTG9hZGluZ3MocHJldiA9PiAoe1xuICAgICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgICBbY3VycmVudFRocmVhZElkXTogbm9kZUFjdGl2aXR5Lm1lc3NhZ2UsXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQ29tcGxldGU6IChcbiAgICAgICAgICAgIGZpbmFsQ29udGVudDogc3RyaW5nLFxuICAgICAgICAgICAgc291cmNlczogYW55LFxuICAgICAgICAgICAgbWVtb3J5U2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgICAgICAgICBjdXJyZW50VGhyZWFkSWQ6IHN0cmluZyxcbiAgICAgICAgICAgIGF0dGFjaG1lbnRzPzogYW55W10gfCBudWxsLFxuICAgICAgICAgICAgc3VnZ2VzdGlvbnM/OiBzdHJpbmdbXSB8IG51bGwsXG4gICAgICAgICAgICBhZ2VudElkPzogc3RyaW5nIHwgbnVsbFxuICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgc3RyZWFtU2V0dGxlZCA9IHRydWVcbiAgICAgICAgICAgIHNldElzQ29udGludWluZ1N0cmVhbShmYWxzZSlcbiAgICAgICAgICAgIGhhbmRsZVN0cmVhbUZpbmlzaChmaW5hbENvbnRlbnQsIHNvdXJjZXMsIG1lbW9yeVNlc3Npb25JZCwgYXR0YWNobWVudHMsIHN1Z2dlc3Rpb25zLCBhZ2VudElkKVxuICAgICAgICAgICAgdXBkYXRlU3RyZWFtQWN0aXZpdHkobnVsbClcbiAgICAgICAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgICAgICBzZXRBY3RpdmVMb2FkaW5ncyhwcmV2ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3TG9hZGluZ3MgPSB7IC4uLnByZXYgfVxuICAgICAgICAgICAgICBkZWxldGUgbmV3TG9hZGluZ3NbY3VycmVudFRocmVhZElkXVxuICAgICAgICAgICAgICByZXR1cm4gbmV3TG9hZGluZ3NcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkFwcHJvdmFsUmVxdWlyZWQ6IChhcHByb3ZhbFBheWxvYWQ6IGFueSwgYWNjdW11bGF0ZWRDb250ZW50OiBzdHJpbmcsIGN1cnJlbnRUaHJlYWRJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAvLyBBcHByb3ZhbCBwYXVzYWRvIChib3TDs24pOiBjaWVycmEgZXN0ZSBjb250aW51ZS10aHJlYWQuXG4gICAgICAgICAgICAvLyBNYW51YWwgYXBwcm92YWw6IGVsIFNTRSBzaWd1ZSBjb24gbm9kZS90b2tlbi9jb21wbGV0ZSAoeSBtw6FzIEhJVEwpLlxuICAgICAgICAgICAgY29uc3QgaXNNYW51YWxBcHByb3ZhbCA9IGFwcHJvdmFsUGF5bG9hZD8ubWFudWFsX2FwcHJvdmFsX2RldGVjdGVkID09PSB0cnVlXG4gICAgICAgICAgICBpZiAoIWlzTWFudWFsQXBwcm92YWwpIHtcbiAgICAgICAgICAgICAgc3RyZWFtU2V0dGxlZCA9IHRydWVcbiAgICAgICAgICAgICAgc2V0SXNDb250aW51aW5nU3RyZWFtKGZhbHNlKVxuICAgICAgICAgICAgICB1cGRhdGVTdHJlYW1BY3Rpdml0eShudWxsKVxuICAgICAgICAgICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICAgICAgICBzZXRBY3RpdmVMb2FkaW5ncyhwcmV2ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdMb2FkaW5ncyA9IHsgLi4ucHJldiB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIG5ld0xvYWRpbmdzW2N1cnJlbnRUaHJlYWRJZF1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3TG9hZGluZ3NcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZUFwcHJvdmFsUmVxdWlyZWQoYXBwcm92YWxQYXlsb2FkIGFzIEFwcHJvdmFsUmVxdWVzdCwgYWNjdW11bGF0ZWRDb250ZW50KVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgc3RyZWFtU2V0dGxlZCA9IHRydWVcbiAgICAgICAgICAgIHNldElzQ29udGludWluZ1N0cmVhbShmYWxzZSlcbiAgICAgICAgICAgIGhhbmRsZVN0cmVhbUVycm9yKClcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc3RyZWFtU2V0dGxlZCA9IHRydWVcbiAgICAgICAgc2V0SXNDb250aW51aW5nU3RyZWFtKGZhbHNlKVxuICAgICAgICBoYW5kbGVTdHJlYW1FcnJvcigpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc0NvbnRpbnVpbmdTdHJlYW0oZmFsc2UpXG4gICAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgLy8gUmVkIGRlIHNlZ3VyaWRhZDogc2kgZWwgc3RyZWFtIGNlcnLDsyBzaW4gZXZlbnRvIHRlcm1pbmFsLCBlbCBpbmRpY2Fkb3JcbiAgICAgICAgLy8gKHAuIGVqLiBcIkVzY3JpYmllbmRvIGxhIHJlc3B1ZXN0YVwiKSBxdWVkYXLDrWEgdHJhYmFkby4gTG8gbGltcGlhbW9zIGFxdcOtLlxuICAgICAgICBpZiAoIXN0cmVhbVNldHRsZWQpIHtcbiAgICAgICAgICB1cGRhdGVTdHJlYW1BY3Rpdml0eShudWxsKVxuICAgICAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgICAgc2V0QWN0aXZlTG9hZGluZ3MocHJldiA9PiB7XG4gICAgICAgICAgICBpZiAoIShsb2FkaW5nS2V5IGluIHByZXYpKSByZXR1cm4gcHJldlxuICAgICAgICAgICAgY29uc3QgbmV3TG9hZGluZ3MgPSB7IC4uLnByZXYgfVxuICAgICAgICAgICAgZGVsZXRlIG5ld0xvYWRpbmdzW2xvYWRpbmdLZXldXG4gICAgICAgICAgICByZXR1cm4gbmV3TG9hZGluZ3NcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBhdXRoVXNlcixcbiAgICAgIGFnZW50LFxuICAgICAgYWRkTWVzc2FnZSxcbiAgICAgIGhhbmRsZVN0cmVhbUVycm9yLFxuICAgICAgaGFuZGxlU3RyZWFtVXBkYXRlLFxuICAgICAgaGFuZGxlU3RyZWFtRmluaXNoLFxuICAgICAgaGFuZGxlQXBwcm92YWxSZXF1aXJlZCxcbiAgICAgIHVwZGF0ZVN0cmVhbUFjdGl2aXR5LFxuICAgICAgdCxcbiAgICBdXG4gIClcblxuICBjb25zdCBpbml0aWFsaXplQ2hhdCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWZpcnN0VGltZVJlZi5jdXJyZW50KSB7XG4gICAgICBmaXJzdFRpbWVSZWYuY3VycmVudCA9IHRydWVcbiAgICB9XG4gICAgaWYgKGluaXRpYWxDaGF0SWQpIHtcbiAgICAgIGF3YWl0IGxvYWRNZXNzYWdlcygpXG4gICAgfSBlbHNlIGlmICh1c2VySW5pdGlhbE1lc3NhZ2UpIHtcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxNZXNzYWdlID0gQm9vbGVhbih1c2VySW5pdGlhbE1lc3NhZ2UubWVzc2FnZT8udHJpbSgpKVxuICAgICAgY29uc3QgaGFzSW5pdGlhbEF0dGFjaG1lbnRzID0gQm9vbGVhbih1c2VySW5pdGlhbE1lc3NhZ2UuYXR0YWNobWVudHM/Lmxlbmd0aClcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxGYXEgPSBCb29sZWFuKHVzZXJJbml0aWFsTWVzc2FnZS5mYXFJZClcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxGdWEgPSBCb29sZWFuKHVzZXJJbml0aWFsTWVzc2FnZS5mdWFJZClcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxTYyA9IEJvb2xlYW4odXNlckluaXRpYWxNZXNzYWdlLnNjSWQpXG5cbiAgICAgIGlmICghaGFzSW5pdGlhbE1lc3NhZ2UgJiYgIWhhc0luaXRpYWxBdHRhY2htZW50cyAmJiAhaGFzSW5pdGlhbEZhcSAmJiAhaGFzSW5pdGlhbEZ1YSAmJiAhaGFzSW5pdGlhbFNjKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBoaXN0b3J5ID0gbWVzc2FnZXNSZWYuY3VycmVudC5tYXAoaGlzdG9yeU1lc3NhZ2UgPT4gKHtcbiAgICAgICAgY29udGVudDogaGlzdG9yeU1lc3NhZ2UubWVzc2FnZSxcbiAgICAgICAgcm9sZTogaGlzdG9yeU1lc3NhZ2UudXNlci5pZCA9PT0gYXV0aFVzZXIuaWQudG9TdHJpbmcoKSA/IENoYXRIaXN0b3J5Um9sZS5VU0VSIDogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgIH0pKVxuXG4gICAgICBjb25zdCB7XG4gICAgICAgIGNoaXBzUHJvamVjdDogY3R4Q2hpcHNQcm9qZWN0LFxuICAgICAgICBwcm9qZWN0OiBjdHhQcm9qZWN0LFxuICAgICAgICBjbGllbnQ6IGN0eENsaWVudCxcbiAgICAgICAgdGFzazogY3R4VGFzayxcbiAgICAgIH0gPSBjb250ZXh0UmVmLmN1cnJlbnRcbiAgICAgIGNvbnN0IHByb2plY3RUb1JlcXVlc3QgPSByZXNvbHZlUHJvamVjdFRvUmVxdWVzdChjdHhDaGlwc1Byb2plY3QsIG51bGwpID8/IGN0eFByb2plY3Q/LmlkID8/IG51bGxcblxuICAgICAgYXNrTWFpYSh7XG4gICAgICAgIG1lc3NhZ2U6IHVzZXJJbml0aWFsTWVzc2FnZS5tZXNzYWdlLFxuICAgICAgICBoaXN0b3J5LFxuICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RUb1JlcXVlc3QsXG4gICAgICAgIGxhbmc6IGF1dGhVc2VyLmxhbmcsXG4gICAgICAgIHVzZXJJZDogYXV0aFVzZXIuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgZmlyc3ROYW1lOiBhdXRoVXNlci5maXJzdE5hbWUsXG4gICAgICAgIGxhc3ROYW1lOiBhdXRoVXNlci5sYXN0TmFtZSxcbiAgICAgICAgY29tcGFueUlkOiBhdXRoVXNlci5jb21wYW55X2lkLnRvU3RyaW5nKCksXG4gICAgICAgIGNoYXRJZDogY3VycmVudENoYXRJZC5jdXJyZW50LFxuICAgICAgICBtZXNzYWdlSWQ6IGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCxcbiAgICAgICAgYWdlbnROYW1lOiBhZ2VudD8ubmFtZSEsXG4gICAgICAgIGFnZW50SWQ6IGFnZW50Py5pZCEsXG4gICAgICAgIGlzV2ViU2VhcmNoQWN0aXZlOiBpc1dlYlNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICBpc0RlZXBTZWFyY2hBY3RpdmU6IGlzRGVlcFNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICAuLi4oY3R4UHJvamVjdD8uZmVlSWQgIT0gbnVsbCA/IHsgZmVlSWQ6IE51bWJlcihjdHhQcm9qZWN0LmZlZUlkKSB9IDoge30pLFxuICAgICAgICAuLi5yZXNvbHZlQ2xpZW50UGF5bG9hZChjdHhDbGllbnQsIGN0eFByb2plY3QpLFxuICAgICAgICAuLi4oY3R4UHJvamVjdD8ubmFtZSA/IHsgcHJvamVjdE5hbWU6IGN0eFByb2plY3QubmFtZSB9IDoge30pLFxuICAgICAgICAuLi4oY3R4VGFzaz8uaWQgIT0gbnVsbFxuICAgICAgICAgID8geyB0YXNrSWQ6IE51bWJlcihjdHhUYXNrLmlkKSwgLi4uKGN0eFRhc2submFtZSA/IHsgdGFza05hbWU6IGN0eFRhc2submFtZSB9IDoge30pIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cyA/IHsgYXR0YWNobWVudHM6IHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cyB9IDoge30pLFxuICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLmZhcUlkID8geyBmYXFJZDogdXNlckluaXRpYWxNZXNzYWdlLmZhcUlkIH0gOiB7fSksXG4gICAgICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2UuYWdlbnRTdWdnZXN0aW9uSWQgPyB7IGFnZW50U3VnZ2VzdGlvbklkOiB1c2VySW5pdGlhbE1lc3NhZ2UuYWdlbnRTdWdnZXN0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHVzZXJJbml0aWFsTWVzc2FnZS5mdWFJZCA/IHsgZnVhSWQ6IHVzZXJJbml0aWFsTWVzc2FnZS5mdWFJZCB9IDoge30pLFxuICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLnNjSWQgPyB7IHNjSWQ6IHVzZXJJbml0aWFsTWVzc2FnZS5zY0lkIH0gOiB7fSksXG4gICAgICAgIC4uLihhZ2VudD8uZW50aXR5ICE9IG51bGwgPyB7IGFnZW50RW50aXR5OiBhZ2VudC5lbnRpdHkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50Py50eXBlICE9IG51bGwgPyB7IGFnZW50VHlwZTogYWdlbnQudHlwZSB9IDoge30pLFxuICAgICAgICAuLi4oYnVpbGRDb250ZXh0TWVzc2FnZSh1c2VySW5pdGlhbE1lc3NhZ2UubWVudGlvbnMpXG4gICAgICAgICAgPyB7IGNvbnRleHRNZXNzYWdlOiBidWlsZENvbnRleHRNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZS5tZW50aW9ucykgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLmNvbnRleHREYXRhID8geyBjb250ZXh0RGF0YTogdXNlckluaXRpYWxNZXNzYWdlLmNvbnRleHREYXRhIH0gOiB7fSksXG4gICAgICB9KVxuICAgIH1cbiAgfSwgW1xuICAgIGluaXRpYWxDaGF0SWQsXG4gICAgdXNlckluaXRpYWxNZXNzYWdlLFxuICAgIHByb2plY3QsXG4gICAgY2xpZW50LFxuICAgIHRhc2ssXG4gICAgYXV0aFVzZXIsXG4gICAgYWdlbnQsXG4gICAgYXNrTWFpYSxcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICBpc0RlZXBTZWFyY2hBY3RpdmUsXG4gIF0pXG5cbiAgY29uc3QgcmVzZXRDaGF0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGFib3J0U3RyZWFtU2lsZW50bHlSZWYuY3VycmVudCgpXG4gICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gdXVpZHY0KClcbiAgICBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQgPSBudWxsXG4gICAgY3VycmVudENoYXRJZC5jdXJyZW50ID0gdXVpZHY0KClcbiAgICByZXBvcnRlZEV2ZW50LmN1cnJlbnQgPSBmYWxzZVxuICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICBzdHJlYW1pbmdTdG9yZS5jbGVhcigpXG4gICAgc2V0SXNDb250aW51aW5nU3RyZWFtKGZhbHNlKVxuICB9LCBbXSlcblxuICBjb25zdCBzdG9wR2VuZXJhdGlvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzdG9wU3RyZWFtaW5nKClcbiAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgc2V0SXNDb250aW51aW5nU3RyZWFtKGZhbHNlKVxuICB9LCBbc3RvcFN0cmVhbWluZ10pXG5cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlcyxcbiAgICBsb2FkaW5nTWVzc2FnZXMsXG4gICAgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzLFxuICAgIHdhaXRpbmdSZXNwb25zZTogd2FpdGluZ1Jlc3BvbnNlIHx8IGlzQ29udGludWluZ1N0cmVhbSxcbiAgICBpc1dyaXRpbmcsXG4gICAgbG9hZGluZ01lc3NhZ2UsXG4gICAgc3RyZWFtQWN0aXZpdHksXG4gICAgYWN0aXZlTG9hZGluZ3MsXG4gICAgY3VycmVudFByb2plY3QsXG4gICAgY3VycmVudENoYXRJZDogY3VycmVudENoYXRJZC5jdXJyZW50LFxuICAgIGN1cnJlbnRNZXNzYWdlSWQ6IGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCxcblxuICAgIHNlbmRNZXNzYWdlLFxuICAgIGNoYW5nZVByb2plY3QsXG4gICAgaGFuZGxlRmVlZGJhY2ssXG4gICAgaGFuZGxlQXBwcm92YWxEZWNpc2lvbixcbiAgICBoYW5kbGVTY3JvbGwsXG4gICAgaW5pdGlhbGl6ZUNoYXQsXG4gICAgcmVzZXRDaGF0LFxuICAgIHN0b3BHZW5lcmF0aW9uLFxuXG4gICAgaXNEaXNhYmxlZDogd2FpdGluZ1Jlc3BvbnNlIHx8IGlzQ29udGludWluZ1N0cmVhbSB8fCBsb2FkaW5nTWVzc2FnZXMsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLFdBQVcsRUFBRUMsTUFBTSxFQUFFQyxTQUFTLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBQ2hFLFNBQVNDLEVBQUUsSUFBSUMsTUFBTSxRQUFRLE1BQU07QUFDbkMsU0FBU0MsZUFBZSxRQUFRLG9CQUFvQjtBQUNwRCxTQUFTQyxxQkFBcUIsUUFBUSwwQkFBMEI7QUFDaEUsU0FBU0MsSUFBSSxRQUFRLFNB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
|
|
1470
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVJlZiIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwidjQiLCJ1dWlkdjQiLCJ1c2VDaGF0TWVzc2FnZXMiLCJ1c2VPcmNoZXN0cmF0b3JTdHJlYW0iLCJ1c2VUIiwidXNlVXNlciIsInVzZUdsb2JhbENvbnRleHQiLCJFVkVOVFMiLCJ1c2VFdmVudCIsIm1haWEiLCJGZWVkYmFjayIsIkNoYXRIaXN0b3J5Um9sZSIsImJ1aWxkQ29udGV4dE1lc3NhZ2UiLCJmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5IiwidXNlUHJvamVjdHMiLCJ1c2VUYWJUYXNrRGVmYXVsdCIsIlRBU0tfVVJMX1JFR0VYX1BBVFRFUk4iLCJkaXNwYXRjaE1haWFIb3Vyc0NoYXJnZWQiLCJpc0hvdXJzQ2hhcmdlVG9vbCIsImZldGNoQWdlbnREZXRhaWwiLCJidWlsZEhpdGxBY3Rpb25UeXBlTGlzdCIsImdldEhpdGxBbmFseXRpY3NBZ2VudFR5cGUiLCJzZXNzaW9uU3RyZWFtaW5nVGV4dCIsInVzZVNlc3Npb25zU3RvcmUiLCJ1c2VTZXNzaW9uTWV0YSIsInNlc3Npb25TdHJlYW1NYW5hZ2VyIiwiTUFYX0NPTkNVUlJFTlRfU1RSRUFNUyIsImFjdGl2ZVZpZXciLCJub3RpZnlTZXNzaW9uRmluaXNoZWRJbkJhY2tncm91bmQiLCJidWlsZFNpZGViYXJTZXNzaW9uVGl0bGUiLCJlbnN1cmVTZXNzaW9uSW5TaWRlYmFyIiwiaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZCIsImdldENoYXRzU3RvcmVTdGF0ZSIsInVzZUNoYXRzU3RvcmUiLCJub3JtYWxpemVTZW5kTWVzc2FnZUFyZ3MiLCJhdHRhY2htZW50c09yT3B0aW9ucyIsIl9vcHRpb25zJGF0dGFjaG1lbnRzIiwiQXJyYXkiLCJpc0FycmF5IiwiYXR0YWNobWVudHMiLCJvcHRpb25zIiwicmVzb2x2ZVByb2plY3RUb1JlcXVlc3QiLCJjaGlwc1Byb2plY3QiLCJsYXN0TWVzc2FnZVByb2plY3RJZCIsImNoaXBzUHJvamVjdElkIiwicHJvamVjdElkIiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJwYXJzZWQiLCJyZXNvbHZlQ2xpZW50UGF5bG9hZCIsImN0eENsaWVudCIsImN0eFByb2plY3QiLCJfY3R4UHJvamVjdCRjbGllbnQiLCJpZCIsIl9vYmplY3RTcHJlYWQiLCJjbGllbnRJZCIsIm5hbWUiLCJjbGllbnROYW1lIiwiY2xpZW50Iiwibm9ybWFsaXplQXNzaXN0YW50QXR0YWNobWVudHMiLCJyYXdBdHRhY2htZW50cyIsImZpbHRlciIsImF0dGFjaG1lbnQiLCJfdHlwZW9mIiwibWFwIiwiaW5kZXgiLCJ0cmltIiwiY29uY2F0IiwidHlwZSIsIm1pbWVUeXBlIiwibWltZV90eXBlIiwiZnVsbEZpbGVOYW1lIiwiaW5jbHVkZXMiLCJudW1lcmljU2l6ZSIsInNpemUiLCJmaWxlIiwiRmlsZSIsInVybF9vcmlnaW5hbCIsInVuZGVmaW5lZCIsInVybF90aHVtYm5haWwiLCJ1cmxfZmlsZSIsInJvbGUiLCJleHRyYWN0VGFza0lkc0Zyb21QZW5kaW5nQWN0aW9uc0FyZ3MiLCJwZW5kaW5nQWN0aW9ucyIsImlkcyIsInB1c2hJZCIsInJhdyIsIm4iLCJwYXJzZUludCIsIlN0cmluZyIsImlzTmFOIiwicHVzaCIsImZvckVhY2giLCJhY3Rpb24iLCJfcmVjJHRhc2tfaWQiLCJhcmdzIiwidG9vbF9hcmdzIiwicmVjIiwidGFza19pZCIsInRhc2tfaWRzIiwidGFza3MiLCJ0IiwiX3RyZWMkdGFza19pZCIsInRyZWMiLCJleHRyYWN0VGFza0lkc0Zyb21EZWxldGVQZW5kaW5nQWN0aW9ucyIsInRvb2xfbmFtZSIsIl9yZWMkdGFza19pZDIiLCJsaXN0IiwidGlkIiwiZXh0cmFjdEFnZW50SWRGcm9tRWRpdEFnZW50UGVuZGluZ0FjdGlvbnMiLCJfcmVjJGFnZW50X2lkIiwiZWRpdEFjdGlvbiIsImZpbmQiLCJhIiwidG9Mb3dlckNhc2UiLCJhZ2VudF9pZCIsImFnZW50SWQiLCJleHRyYWN0QWdlbnRJZEZyb21QZW5kaW5nQWN0aW9uc0J5VG9vbE5hbWUiLCJ0b29sTmFtZSIsIl9yZWYiLCJfcmVjJGFnZW50X2lkMiIsImV4dHJhY3RUYXNrSWRzRnJvbUFzc2lzdGFudERlbGV0aW9uVGV4dCIsInRleHQiLCJsYWJlbGVkIiwibWF0Y2giLCJib2xkIiwidXNlU3RhYmxlQ2FsbGJhY2tzIiwiYXV0aFVzZXIiLCJjdXJyZW50VXNlciIsInRvU3RyaW5nIiwiZmlyc3ROYW1lIiwiYXZhdGFyIiwicGljdHVyZSIsImN1cnJlbnQiLCJmaW5kTWVzc2FnZVdpdGhBcHByb3ZhbEJ5VGhyZWFkSWRzIiwidGhyZWFkSWRzIiwiYWN0aXZlTWVzc2FnZXMiLCJmcm9tQWN0aXZlVmlldyIsIm1lc3NhZ2UiLCJfbWVzc2FnZSRhcHByb3ZhbCIsImFwcHJvdmFsIiwicGVuZGluZ19hY3Rpb25zIiwic29tZSIsInRocmVhZF9pZCIsInNlc3Npb25JZCIsInNlc3Npb25faWQiLCJnZXQiLCJfdXNlU2Vzc2lvbnNTdG9yZSRnZXQiLCJnZXRTdGF0ZSIsIm1lc3NhZ2VzIiwic2Vzc2lvbkVudHJ5IiwiT2JqZWN0IiwiZW50cmllcyIsIl9yZWYyIiwiX3JlZjMiLCJfc2xpY2VkVG9BcnJheSIsInNlc3Npb25NZXNzYWdlcyIsIl9tZXNzYWdlJGFwcHJvdmFsMiIsIl9zZXNzaW9uRW50cnkiLCJmb3VuZCIsIl9tZXNzYWdlJGFwcHJvdmFsMyIsInVzZUNoYXRNYW5hZ2VyIiwiX3JlZjQiLCJpbml0aWFsQ2hhdElkIiwiY2hhdElkIiwidXNlckluaXRpYWxNZXNzYWdlIiwib25FcnJvciIsIl9yZWY0JGFnZW50cyIsImFnZW50cyIsIl91c2VUIiwiX3VzZUdsb2JhbENvbnRleHQiLCJwcm9qZWN0Iiwic2V0UHJvamVjdCIsInNldENsaWVudCIsInRhc2siLCJzZXRUYXNrIiwiYWdlbnQiLCJpc1dlYlNlYXJjaEFjdGl2ZSIsImlzRGVlcFNlYXJjaEFjdGl2ZSIsInNldENoaXBzUHJvamVjdCIsImV2ZW50IiwiX3VzZVByb2plY3RzIiwiZmV0Y2hQcm9qZWN0cyIsIl91c2VTdGFibGVDYWxsYmFja3MiLCJfdXNlVGFiVGFza0RlZmF1bHQiLCJnZXRUYWJUYXNrRGVmYXVsdCIsImN1cnJlbnRNZXNzYWdlSWQiLCJjdXJyZW50VXNlclF1ZXN0aW9uIiwiY3VycmVudENoYXRJZCIsInNldEFjdGl2ZUNoYXRJZCIsInN0YXRlIiwicmVwb3J0ZWRFdmVudCIsIm1lc3NhZ2VzUmVmIiwibGFzdE1hbnVhbEFwcHJvdmFsUmVmIiwiaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYiLCJpc1Byb2Nlc3NpbmdSZWYiLCJmaXJzdFRpbWVSZWYiLCJzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmIiwiYWN0aXZlU3RyZWFtQ2hhdElkUmVmIiwiY2xlYXJTdHJlYW1VaVJlZiIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJhY3RpdmVMb2FkaW5ncyIsInNldEFjdGl2ZUxvYWRpbmdzIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJhY3RpdmVTZXNzaW9uSWQiLCJzZXRBY3RpdmVTZXNzaW9uSWQiLCJpc01vdW50ZWRSZWYiLCJsYXN0SGFuZGxlZFRlcm1pbmFsUmVmIiwiaXNXZWJTZWFyY2hBY3RpdmVSZWYiLCJpc0RlZXBTZWFyY2hBY3RpdmVSZWYiLCJjb250ZXh0UmVmIiwiX3VzZUNoYXRNZXNzYWdlcyIsImxvYWRpbmdNZXNzYWdlcyIsImlzTG9hZGluZ01vcmVNZXNzYWdlcyIsImxvYWRNZXNzYWdlcyIsImFkZE1lc3NhZ2UiLCJyZW1vdmVNZXNzYWdlIiwiaGFuZGxlU2Nyb2xsIiwiY29tbWl0VG9TZXNzaW9uIiwiaXMiLCJkcm9wRnJvbVNlc3Npb24iLCJtZXNzYWdlSWQiLCJjbGVhclNlc3Npb25UYWlsIiwic2V0TWVzc2FnZXMiLCJzZXQiLCJhY3RpdmVTZXNzaW9uTWV0YSIsIl9hY3RpdmVTZXNzaW9uTWV0YSRmaSIsInN0YXR1cyIsImlzVGVybWluYWwiLCJrZXkiLCJmaW5pc2hlZEF0IiwidGFpbCIsImdldE1lc3NhZ2VzIiwiaGFzU3RhbGVQbGFjZWhvbGRlciIsIm1zZyIsImZvcmNlIiwiY3VzdG9tRXZlbnQiLCJDdXN0b21FdmVudCIsImRldGFpbCIsImRvY3VtZW50IiwiZGlzcGF0Y2hFdmVudCIsInByZXZpb3VzSW5pdGlhbENoYXRJZFJlZiIsInByZXZpb3VzSW5pdGlhbENoYXRJZCIsImlzQWN0aXZlIiwiaGFuZGxlU3RyZWFtRXJyb3IiLCJjdHgiLCJlcnJvck1lc3NhZ2UiLCJlcnJvclJhd01lc3NhZ2UiLCJfZXJyb3JSYXdNZXNzYWdlJG1hdGMiLCJfZXJyb3JSYXdNZXNzYWdlJG1hdGMyIiwicGxhY2Vob2xkZXJJZCIsImNsZWFyIiwiaXNBY2Nlc3NEZW5pZWQiLCJpc1Byb21wdFRvb0xvbmciLCJ1c2VkIiwiaXNFcnJvciIsInN1Z2dlc3Rpb25zIiwiZGF0ZSIsIkRhdGUiLCJ1c2VyIiwiQVNTSVNUQU5UIiwibWFya0NoYXRBc1VucmVhZCIsImhhbmRsZVN0cmVhbVVwZGF0ZSIsImNvbnRlbnQiLCJwbGFjZWhvbGRlckV4aXN0cyIsInN0YXJ0Iiwic2V0VGV4dCIsImhhbmRsZVN0cmVhbUZpbmlzaCIsIl9yZWY1IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJzb3VyY2VzIiwibWVtb3J5U2Vzc2lvbklkIiwiY29tcGxldGVkQWdlbnRJZCIsIl9wcmV2aW91c01lc3NhZ2UkYXBwciIsIl93aW5kb3ckdGFza1BhbmVsIiwiX2NyZWF0ZUFnZW50Rm9sbG93VXAiLCJfZWRpdEFnZW50Rm9sbG93VXAiLCJ0ZW1wTWVzc2FnZUlkIiwidGFza1VybFJlZ2V4IiwibWF0Y2hlcyIsImNvbnRlbnRUb0FkZCIsInByZXZpb3VzTWVzc2FnZSIsImhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UiLCJUQVNLX0NSRUFUSU9OX1RPT0xTIiwiVEFTS19FRElUX1RPT0xTIiwiVEFTS19ERUxFVEVfVE9PTFMiLCJ3YXNUYXNrQ3JlYXRpb24iLCJ3YXNUYXNrRWRpdCIsIndhc1Rhc2tEZWxldGUiLCJ3YXNDcmVhdGVBZ2VudEFwcHJvdmVkIiwid2FzQ29uZmlndXJlQWdlbnRBY2Nlc3NBcHByb3ZlZCIsImNyZWF0ZUFnZW50Rm9sbG93VXAiLCJjb25maWd1cmVkQWdlbnRJZCIsIndhc0VkaXRBZ2VudEFwcHJvdmVkIiwiZWRpdEFnZW50Rm9sbG93VXAiLCJmcm9tU3RyZWFtIiwiZnJvbUFyZ3MiLCJyZXNvbHZlZEFnZW50SWQiLCJ0YXNrSWRzRnJvbVVybHMiLCJ0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsIiwidGFza0lkc0Zyb21EZWxldGlvblRleHQiLCJ0YXNrSWRzRm9yRGFzaGJvYXJkIiwic2hvdWxkU3luY0Rhc2hib2FyZCIsInRhc2tJZHMiLCJ0YWIiLCJ0YWJTZWdtZW50IiwibGFzdFByb2plY3RNZXNzYWdlIiwiY29udGV4dFByb2plY3RJZFJhdyIsImNvbnRleHRQcm9qZWN0SWQiLCJwYXRoTWF0Y2giLCJyb3V0ZVByb2plY3RJZCIsImlzT25Qcm9qZWN0Um91dGUiLCJfd2luZG93JG5ld1Byb2plY3REYXMiLCJfd2luZG93JG5ld1Byb2plY3REYXMyIiwiX3dpbmRvdyRuZXdQcm9qZWN0RGFzMyIsIl93aW5kb3ckbmV3UHJvamVjdERhczQiLCJfd2luZG93JG5ld1Byb2plY3REYXM1IiwiX3dpbmRvdyRuZXdQcm9qZWN0RGFzNiIsIm9wZW5UYXNrUGFuZWxJZCIsIm1hbnVhbEFwcHJvdmFsIiwibWFudWFsV2FzVGFza0VkaXQiLCJtYW51YWxXYXNUYXNrRGVsZXRlIiwiaG91cnNUb29sc0Zyb21BcHByb3ZhbCIsIndhc0hvdXJzQ2hhcmdlQXBwcm92ZWQiLCJtYW51YWxIb3Vyc1Rvb2wiLCJ3YXNIb3Vyc0NoYXJnZU1hbnVhbEFwcHJvdmVkIiwidG9vbHMiLCJfbWFudWFsQXBwcm92YWwkdG9vbEEiLCJtYW51YWxQc2V1ZG9BY3Rpb24iLCJhZmZlY3RlZFRhc2tJZHMiLCJfd2luZG93JHRhc2tQYW5lbDIiLCJfd2luZG93JHRhc2tQYW5lbDIkcmUiLCJfZ2V0Q2hhdHNTdG9yZVN0YXRlIiwiaXNDaGF0Vmlld1Zpc2libGUiLCJtYXJrQ2hhdEFzUmVhZCIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwibGVuZ3RoIiwiYWJydXB0IiwiUmVnRXhwIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwibWF0Y2hBbGwiLCJtIiwiYXQiLCJhcHByb3ZhbFN0YXR1cyIsIndpbmRvdyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMiLCJhaUNoYXRIaXRsT3B0aW9uIiwiYWdlbnRfdHlwZSIsImFjdGlvbl90eXBlIiwiZGVjaXNpb24iLCJvcHRpb24iLCJjcmVhdGVkX2FnZW50X2lkIiwic2VudCIsInJlcGxhY2UiLCJ1cmwiLCJsb2NhdGlvbiIsInBhdGhuYW1lIiwibmV3UHJvamVjdERhc2hib2FyZCIsImFkZEV4aXN0aW5nVGFza1RvRGFzaGJvYXJkIiwiY2FsbCIsImVkaXRFeGlzdGluZ1Rhc2tJbkRhc2hib2FyZCIsImRlbGV0ZUV4aXN0aW5nVGFza0Zyb21EYXNoYm9hcmQiLCJ0YXNrUGFuZWwiLCJ0YXNrSWQiLCJzb3VyY2UiLCJ0b29sQXJncyIsInJlZmV0Y2hUYXNrIiwidGhlbiIsImNoYXRBZ2VudCIsImVyciIsImNvbnNvbGUiLCJlcnJvciIsInN0b3AiLCJfeCIsIl94MiIsIl94MyIsIl94NCIsIl94NSIsIl94NiIsIl94NyIsImFwcGx5IiwiYXJndW1lbnRzIiwiaGFuZGxlU3RyZWFtU3RvcCIsImlzRnJvbnRlbmRDYW5jZWxsZWQiLCJzZXRUaW1lb3V0IiwiaGFuZGxlQXBwcm92YWxSZXF1aXJlZCIsImFjY3VtdWxhdGVkQ29udGVudCIsIl9hcHByb3ZhbCRwZW5kaW5nX2FjdCIsImhpdGxDb250ZXh0Iiwib3JpZ2luYWxfdGhyZWFkX2lkIiwibWVzc2FnZVRleHQiLCJtYW51YWxfYXBwcm92YWxfZGV0ZWN0ZWQiLCJfYXBwcm92YWwkcGVuZGluZ19hY3QyIiwiX3JlZjYiLCJfdG9vbF9uYW1lIiwiX3Rvb2xfYXJncyIsImZpcnN0QWN0aW9uIiwiX3VzZU9yY2hlc3RyYXRvclN0cmVhIiwib25TdHJlYW1VcGRhdGUiLCJvbkZpbmlzaFN0cmVhbSIsIm9uU3RvcCIsIm9uQXBwcm92YWxSZXF1aXJlZCIsImFza01haWEiLCJ3YWl0aW5nUmVzcG9uc2UiLCJpc0xvYWRpbmciLCJpc1dyaXRpbmciLCJsb2FkaW5nTWVzc2FnZSIsInN0cmVhbUFjdGl2aXR5IiwidXBkYXRlU3RyZWFtQWN0aXZpdHkiLCJzdG9wU3RyZWFtaW5nIiwiY3VycmVudFByb2plY3QiLCJzZW5kTWVzc2FnZSIsIl9yZWY3IiwiX2NhbGxlZTIiLCJmYXFJZCIsImFnZW50U3VnZ2VzdGlvbklkIiwibWVudGlvbnMiLCJmdWFJZCIsInNjSWQiLCJfbWVzc2FnZXNSZWYkY3VycmVudCIsIndpbGxTdGFydE5ld1N0cmVhbSIsIl9ub3JtYWxpemVTZW5kTWVzc2FnZSIsImVmZmVjdGl2ZU1lbnRpb25zIiwiY29udGV4dE1lc3NhZ2UiLCJwYXlsb2FkRnVhSWQiLCJwYXlsb2FkU2NJZCIsInBheWxvYWRDb250ZXh0RGF0YSIsImRpc3BsYXlNZXNzYWdlIiwibmV3TWVzc2FnZUlkIiwibGFzdE1lc3NhZ2VXaXRoUHJvamVjdCIsImN1cnJlbnRBZ2VudEZyb21NZXNzYWdlcyIsIl9jb250ZXh0UmVmJGN1cnJlbnQiLCJjdHhDaGlwc1Byb2plY3QiLCJjdHhUYXNrIiwic3RyZWFtaW5nUGxhY2Vob2xkZXJJZCIsImZpbmFsTWVzc2FnZSIsIl9vcHRpb25zJHByb2plY3RDaGFuZyIsIl9jb250ZXh0UmVmJGN1cnJlbnQkcCIsImhpc3RvcnkiLCJwcm9qZWN0VG9SZXF1ZXN0IiwicHJvamVjdHMiLCJwYXlsb2FkRmFxSWQiLCJwYXlsb2FkQWdlbnRTdWdnZXN0aW9uSWQiLCJwYXlsb2FkRGF0YSIsIl9jb250ZXh0MiIsImdldEFjdGl2ZUNvdW50Iiwic2hvdyIsInNldmVyaXR5IiwiY29udGV4dERhdGEiLCJwbUFpVHlwZWRUZXh0IiwidGl0bGUiLCJVU0VSIiwicHJvamVjdENoYW5nZWQiLCJpbmNvbWVUeXBlIiwiaGlzdG9yeU1lc3NhZ2UiLCJsYW5nIiwidXNlcklkIiwibGFzdE5hbWUiLCJjb21wYW55SWQiLCJjb21wYW55X2lkIiwiYWdlbnROYW1lIiwiZmVlSWQiLCJwcm9qZWN0TmFtZSIsInRhc2tOYW1lIiwiZW50aXR5IiwiYWdlbnRFbnRpdHkiLCJhZ2VudFR5cGUiLCJlbW9qaSIsImFnZW50RW1vamkiLCJfeDgiLCJfeDkiLCJfeDAiLCJfeDEiLCJfeDEwIiwiX3gxMSIsIl94MTIiLCJjaGFuZ2VQcm9qZWN0IiwiaGFuZGxlRmVlZGJhY2siLCJfcmVmOCIsIl9jYWxsZWUzIiwiZmVlZGJhY2tQcm9wIiwiY2hhdE1lc3NhZ2VJZCIsInJlc3BvbnNlIiwiX2NvbnRleHQzIiwiQ2hhdHMiLCJ3YXNIZWxwZnVsQ2hhdCIsIlRIVU1CU19VUCIsIndhc0hlbHBmdWwiLCJfeDEzIiwiX3gxNCIsImhhbmRsZUFwcHJvdmFsRGVjaXNpb24iLCJfcmVmOSIsIl9jYWxsZWU0IiwiZWRpdGVkQWN0aW9ucyIsIm1lc3NhZ2VXaXRoQXBwcm92YWwiLCJmb3VuZFNlc3Npb25JZCIsIm5ld1N0YXR1cyIsImlzQWN0aXZlU2Vzc2lvbiIsInN0cmVhbU1lc3NhZ2VJZCIsImhpdGxDdHgiLCJyZWxlYXNlQWN0aXZlUHJvY2Vzc2luZyIsInJlc3VsdCIsIl9jb250ZXh0NCIsInN0YXJ0Q29udGludWVTdHJlYW0iLCJjb250aW51ZVJlcXVlc3QiLCJoaXRsRXhlY3V0aW9uQ29udGV4dCIsImNhbGxiYWNrcyIsImZpbmlzaFBheWxvYWQiLCJhcHByb3ZhbFBheWxvYWQiLCJzdGFydGVkIiwicmVhc29uIiwiX3gxNSIsIl94MTYiLCJfeDE3IiwiaW5pdGlhbGl6ZUNoYXQiLCJfY2FsbGVlNSIsIl91c2VySW5pdGlhbE1lc3NhZ2UkbSIsIl91c2VySW5pdGlhbE1lc3NhZ2UkYSIsIl9yZWYxIiwiX3Jlc29sdmVQcm9qZWN0VG9SZXF1IiwiX2N0eFByb2plY3QkaWQiLCJfY3R4Q2xpZW50JGlkIiwiX2N0eFRhc2skaWQiLCJfY3R4Q2hpcHNQcm9qZWN0JHByb2oiLCJoYXNJbml0aWFsTWVzc2FnZSIsImhhc0luaXRpYWxBdHRhY2htZW50cyIsImhhc0luaXRpYWxGYXEiLCJoYXNJbml0aWFsRnVhIiwiaGFzSW5pdGlhbFNjIiwiX2NvbnRleHRSZWYkY3VycmVudDIiLCJpbml0aWFsRGlzcGxheU1lc3NhZ2UiLCJfY29udGV4dDUiLCJCb29sZWFuIiwiaW5mbyIsInByb2plY3RQcm9wSWQiLCJyZXNldENoYXQiLCJwcmV2aW91c1Nlc3Npb25JZCIsInN0b3BHZW5lcmF0aW9uIiwiaXNEaXNhYmxlZCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy91c2VDaGF0TWFuYWdlci91c2VDaGF0TWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSByYWRpeCAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tbmVzdGVkLXRlcm5hcnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRlZC1vcHRpb25hbC1jaGFpbiAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCdcbmltcG9ydCB7IHVzZUNoYXRNZXNzYWdlcyB9IGZyb20gJy4uL3VzZUNoYXRNZXNzYWdlcydcbmltcG9ydCB7IHVzZU9yY2hlc3RyYXRvclN0cmVhbSB9IGZyb20gJy4uL3VzZU9yY2hlc3RyYXRvclN0cmVhbSdcbmltcG9ydCB7IHVzZVQgfSBmcm9tICcuLi91c2VUJ1xuaW1wb3J0IHsgQXR0YWNobWVudEZpbGUgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL21vbGVjdWxlcy9DaGF0Rm9vdGVyL0NoYXRGb290ZXInXG5pbXBvcnQgeyBTZW5kTWVzc2FnZU9wdGlvbnMsIFVzZUNoYXRNYW5hZ2VyUHJvcHMgfSBmcm9tICcuL3VzZUNoYXRNYW5hZ2VyLmludGVyZmFjZSdcbmltcG9ydCB7IHVzZVVzZXIsIENPUlVzZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0L2Nvci11c2VyJ1xuaW1wb3J0IHsgdXNlR2xvYmFsQ29udGV4dCB9IGZyb20gJy4uLy4uL2NvbnRleHQvZ2xvYmFsLWNvbnRleHQnXG5pbXBvcnQgeyBFVkVOVFMsIHVzZUV2ZW50IH0gZnJvbSAnLi4vdXNlRXZlbnQnXG5pbXBvcnQgbWFpYSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tYWlhJ1xuaW1wb3J0IHsgRmVlZGJhY2sgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL21vbGVjdWxlcy9NZXNzYWdlRmVlZGJhY2svTWVzc2FnZUZlZWRiYWNrJ1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2UsIENoYXRNZXNzYWdlVXNlciwgQ2hhdEhpc3RvcnlSb2xlLCBBcHByb3ZhbFJlcXVlc3QsIFBlbmRpbmdBY3Rpb24gfSBmcm9tICcuLi8uLi90eXBlcy9DaGF0J1xuaW1wb3J0IHsgQ29udGV4dE1lbnRpb24sIENvbnRleHRNZXNzYWdlLCBidWlsZENvbnRleHRNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvY29udGV4dE1lbnRpb24nXG5pbXBvcnQgeyBmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5IH0gZnJvbSAnLi4vLi4vdXRpbHMvZm9ybWF0UXVpY2tBY3Rpb25NZXNzYWdlJ1xuXG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vdHlwZXMvUHJvamVjdCdcbmltcG9ydCB7IHVzZVByb2plY3RzIH0gZnJvbSAnLi4vdXNlUHJvamVjdHMnXG5pbXBvcnQgeyB1c2VUYWJUYXNrRGVmYXVsdCB9IGZyb20gJy4uL3VzZVRhYlRhc2tEZWZhdWx0J1xuaW1wb3J0IHsgVEFTS19VUkxfUkVHRVhfUEFUVEVSTiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy90YXNrVXJscydcbmltcG9ydCB7IGRpc3BhdGNoTWFpYUhvdXJzQ2hhcmdlZCwgaXNIb3Vyc0NoYXJnZVRvb2wgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvcGxhbm5lclN5bmNFdmVudHMnXG5pbXBvcnQgeyBmZXRjaEFnZW50RGV0YWlsIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWFpYS9BZ2VudHMvZmV0Y2hBZ2VudERldGFpbCdcbmltcG9ydCB7IGJ1aWxkSGl0bEFjdGlvblR5cGVMaXN0LCBnZXRIaXRsQW5hbHl0aWNzQWdlbnRUeXBlIH0gZnJvbSAnLi4vLi4vdXRpbHMvaGl0bEFuYWx5dGljcydcbmltcG9ydCB7IHR5cGUgSGl0bEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuLi8uLi91dGlscy9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuaW1wb3J0IHsgc2Vzc2lvblN0cmVhbWluZ1RleHQgfSBmcm9tICcuLi8uLi9zdG9yZS9zZXNzaW9ucy9zZXNzaW9uU3RyZWFtaW5nVGV4dCdcbmltcG9ydCB7IHVzZVNlc3Npb25zU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS9zZXNzaW9ucy91c2VTZXNzaW9uc1N0b3JlJ1xuaW1wb3J0IHsgdXNlU2Vzc2lvbk1ldGEgfSBmcm9tICcuLi8uLi9zdG9yZS9zZXNzaW9ucy91c2VTZXNzaW9uTWV0YSdcbmltcG9ydCB7IHNlc3Npb25TdHJlYW1NYW5hZ2VyLCBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TIH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvc2Vzc2lvblN0cmVhbU1hbmFnZXInXG5pbXBvcnQgeyBhY3RpdmVWaWV3IH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvYWN0aXZlVmlldydcbmltcG9ydCB7IG5vdGlmeVNlc3Npb25GaW5pc2hlZEluQmFja2dyb3VuZCB9IGZyb20gJy4uLy4uL3N0b3JlL3Nlc3Npb25zL3Nlc3Npb25Ob3RpZmljYXRpb25zJ1xuaW1wb3J0IHsgYnVpbGRTaWRlYmFyU2Vzc2lvblRpdGxlLCBlbnN1cmVTZXNzaW9uSW5TaWRlYmFyIH0gZnJvbSAnLi4vLi4vc3RvcmUvY2hhdHNTaWRlYmFyT3B0aW1pc3RpYydcbmltcG9ydCB7IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQgfSBmcm9tICcuLi8uLi91dGlscy9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuaW1wb3J0IHR5cGUgeyBTdHJlYW1Db250ZXh0IH0gZnJvbSAnLi4vdXNlT3JjaGVzdHJhdG9yU3RyZWFtL3VzZU9yY2hlc3RyYXRvclN0cmVhbS5pbnRlcmZhY2UnXG5pbXBvcnQgeyBnZXRDaGF0c1N0b3JlU3RhdGUsIHVzZUNoYXRzU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS91c2VDaGF0c1N0b3JlJ1xuXG50eXBlIEF0dGFjaG1lbnRzT3JPcHRpb25zID0gQXR0YWNobWVudEZpbGVbXSB8IFNlbmRNZXNzYWdlT3B0aW9uc1xuXG5jb25zdCBub3JtYWxpemVTZW5kTWVzc2FnZUFyZ3MgPSAoYXR0YWNobWVudHNPck9wdGlvbnM/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/LmFwcHJvdmFsKSB7XG4gICAgICByZXR1cm4geyBtZXNzYWdlOiBmb3VuZCwgc2Vzc2lvbklkOiBmb3VuZC5hcHByb3ZhbC5zZXNzaW9uX2lkIHx8IHNlc3Npb25JZCB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IHVzZUNoYXRNYW5hZ2VyID0gKHtcbiAgY2hhdElkOiBpbml0aWFsQ2hhdElkLFxuICB1c2VySW5pdGlhbE1lc3NhZ2UsXG4gIG9uRXJyb3IsXG4gIGFnZW50cyA9IFtdLFxufTogVXNlQ2hhdE1hbmFnZXJQcm9wcykgPT4ge1xuICBjb25zdCB7IHQgfSA9IHVzZVQoKVxuICBjb25zdCBhdXRoVXNlciA9IHVzZVVzZXIoKVxuICBjb25zdCB7XG4gICAgcHJvamVjdCxcbiAgICBzZXRQcm9qZWN0LFxuICAgIGNsaWVudCxcbiAgICBzZXRDbGllbnQsXG4gICAgdGFzayxcbiAgICBzZXRUYXNrLFxuICAgIGFnZW50LFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZSxcbiAgICBjaGlwc1Byb2plY3QsXG4gICAgc2V0Q2hpcHNQcm9qZWN0LFxuICB9ID0gdXNlR2xvYmFsQ29udGV4dCgpXG4gIGNvbnN0IGV2ZW50ID0gdXNlRXZlbnQoKVxuICBjb25zdCB7IGZldGNoUHJvamVjdHMgfSA9IHVzZVByb2plY3RzKClcbiAgY29uc3QgeyBjdXJyZW50VXNlciB9ID0gdXNlU3RhYmxlQ2FsbGJhY2tzKGF1dGhVc2VyKVxuICBjb25zdCB7IGdldFRhYlRhc2tEZWZhdWx0IH0gPSB1c2VUYWJUYXNrRGVmYXVsdCgpXG5cbiAgY29uc3QgY3VycmVudE1lc3NhZ2VJZCA9IHVzZVJlZih1dWlkdjQoKSlcbiAgY29uc3QgY3VycmVudFVzZXJRdWVzdGlvbiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBjdXJyZW50Q2hhdElkID0gdXNlUmVmKGluaXRpYWxDaGF0SWQgfHwgdXVpZHY0KCkpXG4gIGNvbnN0IHNldEFjdGl2ZUNoYXRJZCA9IHVzZUNoYXRzU3RvcmUoc3RhdGUgPT4gc3RhdGUuc2V0QWN0aXZlQ2hhdElkKVxuICBjb25zdCByZXBvcnRlZEV2ZW50ID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBtZXNzYWdlc1JlZiA9IHVzZVJlZjxDaGF0TWVzc2FnZVtdPihbXSlcbiAgLyoqXG4gICAqIEd1YXJkYSBpbmZvIGRlbCDDumx0aW1vIGFwcHJvdmFsIG1hbnVhbCAoY3VhbmRvIGVsIHVzdWFyaW8gdGlwZWEgXCJzaVwiL1wibm9cIiBlbiBsdWdhclxuICAgKiBkZSBjbGlja2VhciBlbCBib3TDs24pLiBFbiBtYW51YWwgYXBwcm92YWwsIGBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkYCByZXRvcm5hIGVhcmx5XG4gICAqIHNpbiBhZ3JlZ2FyIHVuIG1lbnNhamUgY29uIGBhcHByb3ZhbGAsIGFzw60gcXVlIGxhIGzDs2dpY2EgZGUgcmVmZXRjaCBlbiBgb25TdHJlYW1GaW5pc2hgXG4gICAqIG5vIGxvIGRldGVjdGEgdsOtYSBgcHJldmlvdXNNZXNzYWdlLmFwcHJvdmFsYC4gTG8gZ3VhcmRhbW9zIGFjw6EgcGFyYSBjb25zdW1pcmxvIGRlc3B1w6lzLlxuICAgKi9cbiAgY29uc3QgbGFzdE1hbnVhbEFwcHJvdmFsUmVmID0gdXNlUmVmPHtcbiAgICB0b29sTmFtZTogc3RyaW5nXG4gICAgdG9vbEFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbFxuICB9IHwgbnVsbD4obnVsbClcbiAgLyoqIENvbnRleHRvIGRlbCBtZW5zYWplIGRlIGFwcm9iYWNpw7NuIHByZXZpbyBhbCBlamVjdXRhciBjb250aW51ZS10aHJlYWQuICovXG4gIGNvbnN0IGhpdGxFeGVjdXRpb25Db250ZXh0UmVmID0gdXNlUmVmPEhpdGxFeGVjdXRpb25Db250ZXh0IHwgbnVsbD4obnVsbClcbiAgY29uc3QgaXNQcm9jZXNzaW5nUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBmaXJzdFRpbWVSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIC8qKiBJZCBkZWwgcGxhY2Vob2xkZXIgZGVsIG1lbnNhamUgZW4gc3RyZWFtaW5nIGFjdGl2byAoc2kgaGF5KS4gKi9cbiAgY29uc3Qgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICAvKipcbiAgICogQ2hhdCBhbCBxdWUgcGVydGVuZWNlIGVsIHN0cmVhbSBhY3R1YWxtZW50ZSBhY3Rpdm8uIFNpIGNhbWJpYSBlbCBjaGF0XG4gICAqIG1pZW50cmFzIHVuIHN0cmVhbSBlc3TDoSBlbiB2dWVsbywgZGVzY2FydGFtb3MgbG9zIHRva2VucyByZXNpZHVhbGVzXG4gICAqIHF1ZSBwdWVkYW4gbGxlZ2FyIGFudGVzIGRlIHF1ZSBlbCBhYm9ydCBzZSBjb21wbGV0ZS5cbiAgICovXG4gIGNvbnN0IGFjdGl2ZVN0cmVhbUNoYXRJZFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBjbGVhclN0cmVhbVVpUmVmID0gdXNlUmVmPCgpID0+IHZvaWQ+KCgpID0+IHVuZGVmaW5lZClcbiAgY29uc3QgW2FjdGl2ZUxvYWRpbmdzLCBzZXRBY3RpdmVMb2FkaW5nc10gPSB1c2VTdGF0ZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih7fSlcbiAgLyoqXG4gICAqIFNlc2nDs24gYWN0dWFsbWVudGUgdmlzaWJsZS4gU2UgbWFudGllbmUgZW4gc3RhdGUgKG5vIHNvbG8gZW4gcmVmKSBwYXJhIHF1ZVxuICAgKiBlbCBtb3RvciBkZSBzdHJlYW1pbmcgcHVlZGEgbGVlciByZWFjdGl2YW1lbnRlIGxvcyBmbGFncyBkZSBFU1RBIHNlc2nDs25cbiAgICogZGVzZGUgZWwgc3RvcmUsIG1pZW50cmFzIG90cmFzIHNpZ3VlbiBnZW5lcmFuZG8gZW4gYmFja2dyb3VuZC5cbiAgICovXG4gIGNvbnN0IFthY3RpdmVTZXNzaW9uSWQsIHNldEFjdGl2ZVNlc3Npb25JZF0gPSB1c2VTdGF0ZTxzdHJpbmc+KGN1cnJlbnRDaGF0SWQuY3VycmVudClcbiAgLyoqIFRydWUgbWllbnRyYXMgZXN0YSBpbnN0YW5jaWEgZXN0w6kgbW9udGFkYSAoZXZpdGEgc2V0U3RhdGUgdHJhcyBkZXNtb250YXIpLiAqL1xuICBjb25zdCBpc01vdW50ZWRSZWYgPSB1c2VSZWYodHJ1ZSlcbiAgLyoqIEV2aXRhIHJlY29uY2lsaWFyIGRvcyB2ZWNlcyBlbCBtaXNtbyBlc3RhZG8gdGVybWluYWwgZGUgdW5hIHNlc2nDs24uICovXG4gIGNvbnN0IGxhc3RIYW5kbGVkVGVybWluYWxSZWYgPSB1c2VSZWY8c3RyaW5nIHwgbnVsbD4obnVsbClcblxuICBjb25zdCBpc1dlYlNlYXJjaEFjdGl2ZVJlZiA9IHVzZVJlZihpc1dlYlNlYXJjaEFjdGl2ZSlcbiAgY29uc3QgaXNEZWVwU2VhcmNoQWN0aXZlUmVmID0gdXNlUmVmKGlzRGVlcFNlYXJjaEFjdGl2ZSlcbiAgLyoqIEV2aXRhIGNsb3N1cmVzIG9ic29sZXRhcyBjdWFuZG8gZWwgZm9vdGVyIGNvbnNlcnZhIHNlbmRNZXNzYWdlIGVudHJlIHJlbmRlcnMuICovXG4gIGNvbnN0IGNvbnRleHRSZWYgPSB1c2VSZWYoeyBjaGlwc1Byb2plY3QsIHByb2plY3QsIGNsaWVudCwgdGFzayB9KVxuICBjb250ZXh0UmVmLmN1cnJlbnQgPSB7IGNoaXBzUHJvamVjdCwgcHJvamVjdCwgY2xpZW50LCB0YXNrIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQgPSBpc1dlYlNlYXJjaEFjdGl2ZVxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50ID0gaXNEZWVwU2VhcmNoQWN0aXZlXG4gIH0sIFtpc1dlYlNlYXJjaEFjdGl2ZSwgaXNEZWVwU2VhcmNoQWN0aXZlXSlcblxuICBjb25zdCB7IGxvYWRpbmdNZXNzYWdlcywgbWVzc2FnZXMsIGlzTG9hZGluZ01vcmVNZXNzYWdlcywgbG9hZE1lc3NhZ2VzLCBhZGRNZXNzYWdlLCByZW1vdmVNZXNzYWdlLCBoYW5kbGVTY3JvbGwgfSA9XG4gICAgdXNlQ2hhdE1lc3NhZ2VzKHtcbiAgICAgIGNoYXRJZDogaW5pdGlhbENoYXRJZCB8fCBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgICBjdXJyZW50VXNlcixcbiAgICAgIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgICAgIG9uRXJyb3IsXG4gICAgICBhZ2VudHMsXG4gICAgfSlcblxuICBtZXNzYWdlc1JlZi5jdXJyZW50ID0gbWVzc2FnZXNcblxuICAvKipcbiAgICogRXNjcmliZSB1biBtZW5zYWplIGVuIGVsIHN0b3JlIHBvci1zZXNpw7NuIHksIHNpIGxhIHNlc2nDs24gZXMgbGEgYWN0aXZhLFxuICAgKiB0YW1iacOpbiBlbiBsYSB2aXN0YSBsb2NhbC4gUGVybWl0ZSBxdWUgc2VzaW9uZXMgZW4gYmFja2dyb3VuZCBhY3VtdWxlbiBzdVxuICAgKiByZXN1bHRhZG8gc2luIHBpc2FyIGVsIGNoYXQgcXVlIGVsIHVzdWFyaW8gZXN0w6EgbWlyYW5kby5cbiAgICovXG4gIGNvbnN0IGNvbW1pdFRvU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKFxuICAgIChzZXNzaW9uSWQ6IHN0cmluZywgbWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IHtcbiAgICAgIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5hZGRNZXNzYWdlKHNlc3Npb25JZCwgbWVzc2FnZSlcbiAgICAgIGlmIChpc01vdW50ZWRSZWYuY3VycmVudCAmJiBhY3RpdmVWaWV3LmlzKHNlc3Npb25JZCkpIHtcbiAgICAgICAgYWRkTWVzc2FnZShtZXNzYWdlKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2FkZE1lc3NhZ2VdXG4gIClcblxuICBjb25zdCBkcm9wRnJvbVNlc3Npb24gPSB1c2VDYWxsYmFjayhcbiAgICAoc2Vzc2lvbklkOiBzdHJpbmcsIG1lc3NhZ2VJZDogc3RyaW5nKSA9PiB7XG4gICAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkucmVtb3ZlTWVzc2FnZShzZXNzaW9uSWQsIG1lc3NhZ2VJZClcbiAgICAgIGlmIChpc01vdW50ZWRSZWYuY3VycmVudCAmJiBhY3RpdmVWaWV3LmlzKHNlc3Npb25JZCkpIHtcbiAgICAgICAgcmVtb3ZlTWVzc2FnZShtZXNzYWdlSWQpXG4gICAgICB9XG4gICAgfSxcbiAgICBbcmVtb3ZlTWVzc2FnZV1cbiAgKVxuXG4gIC8qKiBMaW1waWEgZWwgdGFpbCBlbiB2dWVsbyBkZSB1bmEgc2VzacOzbiAodHJhcyB0ZXJtaW5hcjsgZWwgYmFja2VuZCBwYXNhIGEgc2VyIGZ1ZW50ZSkuICovXG4gIGNvbnN0IGNsZWFyU2Vzc2lvblRhaWwgPSB1c2VDYWxsYmFjaygoc2Vzc2lvbklkOiBzdHJpbmcpID0+IHtcbiAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuc2V0TWVzc2FnZXMoc2Vzc2lvbklkLCBbXSlcbiAgfSwgW10pXG5cbiAgLy8gUmVnaXN0cmFyIGxhIHNlc2nDs24gdmlzaWJsZSBlbiBlbCB0cmFja2VyIGdsb2JhbCBwYXJhIHF1ZSBsb3MgY2FsbGJhY2tzIGRlbFxuICAvLyBtb3RvciAocXVlIHB1ZWRlbiBwZXJ0ZW5lY2VyIGEgdW5hIGluc3RhbmNpYSB5YSBkZXNtb250YWRhKSBzZXBhbiBjdcOhbCBlcyBsYVxuICAvLyBzZXNpw7NuIGFjdGl2YSBhY3R1YWwuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgYWN0aXZlVmlldy5zZXQoYWN0aXZlU2Vzc2lvbklkKVxuICB9LCBbYWN0aXZlU2Vzc2lvbklkXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlzTW91bnRlZFJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpc01vdW50ZWRSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICBpZiAoYWN0aXZlVmlldy5pcyhjdXJyZW50Q2hhdElkLmN1cnJlbnQpKSB7XG4gICAgICAgIGFjdGl2ZVZpZXcuc2V0KG51bGwpXG4gICAgICB9XG4gICAgfVxuICB9LCBbXSlcblxuICAvLyBSZWNvbmNpbGlhY2nDs246IHNpIGxhIHNlc2nDs24gYWN0aXZhIHRlcm1pbmEgKGNvbXBsZXRlL2Vycm9yL2NhbmNlbGxlZCkgcGVybyBlbFxuICAvLyBzdG9yZSBwb3Itc2VzacOzbiB0b2RhdsOtYSB0aWVuZSB1biBwbGFjZWhvbGRlciBkZSBzdHJlYW1pbmcsIHJlZnJlc2NhbW9zIGRlc2RlXG4gIC8vIGVsIGJhY2tlbmQuIFVzYW1vcyBlbCBzdG9yZSAobm8gbWVzc2FnZXNSZWYpOiBoYW5kbGVTdHJlYW1GaW5pc2ggbGltcGlhIGVsXG4gIC8vIHBsYWNlaG9sZGVyIGFow60gZGUgZm9ybWEgc8OtbmNyb25hOyBtZXNzYWdlc1JlZiBwdWVkZSBxdWVkYXIgc3RhbGUgdW4gcmVuZGVyXG4gIC8vIHBvcnF1ZSBzZXRTdGF0dXMgKFp1c3RhbmQpIHkgcmVtb3ZlTWVzc2FnZSAoUmVhY3QpIG5vIGJhdGNoYW4ganVudG9zLlxuICBjb25zdCBhY3RpdmVTZXNzaW9uTWV0YSA9IHVzZVNlc3Npb25NZXRhKGFjdGl2ZVNlc3Npb25JZClcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBzdGF0dXMgPSBhY3RpdmVTZXNzaW9uTWV0YT8uc3RhdHVzXG4gICAgaWYgKCFzdGF0dXMpIHJldHVyblxuICAgIGNvbnN0IGlzVGVybWluYWwgPSBzdGF0dXMgPT09ICdjb21wbGV0ZScgfHwgc3RhdHVzID09PSAnZXJyb3InIHx8IHN0YXR1cyA9PT0gJ2NhbmNlbGxlZCdcbiAgICBpZiAoIWlzVGVybWluYWwpIHJldHVyblxuICAgIGNvbnN0IGtleSA9IGAke2FjdGl2ZVNlc3Npb25JZH06JHtzdGF0dXN9OiR7YWN0aXZlU2Vzc2lvbk1ldGE/LmZpbmlzaGVkQXQgPz8gJyd9YFxuICAgIGlmIChsYXN0SGFuZGxlZFRlcm1pbmFsUmVmLmN1cnJlbnQgPT09IGtleSkgcmV0dXJuXG4gICAgbGFzdEhhbmRsZWRUZXJtaW5hbFJlZi5jdXJyZW50ID0ga2V5XG5cbiAgICBjb25zdCB0YWlsID0gdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLmdldE1lc3NhZ2VzKGFjdGl2ZVNlc3Npb25JZClcbiAgICBjb25zdCBoYXNTdGFsZVBsYWNlaG9sZGVyID0gdGFpbC5zb21lKG1zZyA9PiBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkKG1zZy5pZCkpXG4gICAgaWYgKGhhc1N0YWxlUGxhY2Vob2xkZXIpIHtcbiAgICAgIGxvYWRNZXNzYWdlcyh7IGZvcmNlOiB0cnVlIH0pXG4gICAgfVxuICB9LCBbYWN0aXZlU2Vzc2lvbk1ldGE/LnN0YXR1cywgYWN0aXZlU2Vzc2lvbk1ldGE/LmZpbmlzaGVkQXQsIGFjdGl2ZVNlc3Npb25JZCwgbG9hZE1lc3NhZ2VzXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdjaGF0LWxvYWRpbmctbWVzc2FnZXMtY2hhbmdlZCcsIHtcbiAgICAgIGRldGFpbDogeyBsb2FkaW5nTWVzc2FnZXMgfSxcbiAgICB9KVxuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpXG4gIH0sIFtsb2FkaW5nTWVzc2FnZXNdKVxuXG4gIGNvbnN0IHByZXZpb3VzSW5pdGlhbENoYXRJZFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPihpbml0aWFsQ2hhdElkKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgcHJldmlvdXNJbml0aWFsQ2hhdElkID0gcHJldmlvdXNJbml0aWFsQ2hhdElkUmVmLmN1cnJlbnRcbiAgICBwcmV2aW91c0luaXRpYWxDaGF0SWRSZWYuY3VycmVudCA9IGluaXRpYWxDaGF0SWRcblxuICAgIC8vIENoYXQgbnVldm8gLyBob21lOiBpbml0aWFsQ2hhdElkIHBhc2EgYSBudWxsLCBhc8OtIHF1ZSBsYSByYW1hIGRlIGFiYWpvIG5vXG4gICAgLy8gYXBsaWNhLiBIYXkgcXVlIHJvdGFyIGEgdW5hIHNlc2nDs24gbnVldmEgaWd1YWw6IHNpIHNlZ3VpbW9zIGFwdW50YW5kbyBhIGxhXG4gICAgLy8gYW50ZXJpb3IsIGBhY3RpdmVWaWV3YCBsYSBzaWd1ZSBtYXJjYW5kbyBjb21vIGFjdGl2YSB5IGN1YW5kbyB0ZXJtaW5hIG5vIHNlXG4gICAgLy8gbm90aWZpY2EgKHkgc3UgcmVzcHVlc3RhIHNlIGNvbW1pdGVhIHNvYnJlIGxhIHZpc3RhIG51ZXZhKS4gRWwgw6FyYm9sIG5vXG4gICAgLy8gcmVtb250YSBlbiBlc3RlIGZsdWpvIChubyBoYXkgYGtleWApIHkgbmFkaWUgY29uc3VtZSBgcmVzZXRDaGF0YC5cbiAgICBpZiAoIWluaXRpYWxDaGF0SWQgJiYgcHJldmlvdXNJbml0aWFsQ2hhdElkKSB7XG4gICAgICBjdXJyZW50Q2hhdElkLmN1cnJlbnQgPSB1dWlkdjQoKVxuICAgICAgc2V0QWN0aXZlU2Vzc2lvbklkKGN1cnJlbnRDaGF0SWQuY3VycmVudClcbiAgICAgIGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCA9IHV1aWR2NCgpXG4gICAgICBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQgPSBudWxsXG4gICAgICByZXBvcnRlZEV2ZW50LmN1cnJlbnQgPSBmYWxzZVxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaW5pdGlhbENoYXRJZCAmJiBpbml0aWFsQ2hhdElkICE9PSBjdXJyZW50Q2hhdElkLmN1cnJlbnQpIHtcbiAgICAgIC8vIE5PIGFib3J0YW1vcyBlbCBzdHJlYW0gYW50ZXJpb3I6IHB1ZWRlIHNlZ3VpciBnZW5lcmFuZG8gZW4gYmFja2dyb3VuZC5cbiAgICAgIC8vIFNvbG8gY2FtYmlhbW9zIGRlIHNlc2nDs24gYWN0aXZhOyBlbCBtb3RvciBydXRlYSBjYWRhIHN0cmVhbSBwb3Igc3VcbiAgICAgIC8vIHNlc3Npb25JZCwgYXPDrSBxdWUgbG9zIHRva2VucyBkZSBsYSBzZXNpw7NuIHByZXZpYSBzaWd1ZW4gYXBsaWPDoW5kb3NlIGFcbiAgICAgIC8vIEVTQSBzZXNpw7NuIChzdG9yZSksIG5vIGEgbGEgbnVldmEuXG5cbiAgICAgIC8vIExpbXBpYXIgY29udGV4dG8gZ2xvYmFsIGFsIGNhbWJpYXIgZGUgY29udmVyc2FjacOzblxuICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgICAgc2V0VGFzayhudWxsKVxuXG4gICAgICBjdXJyZW50Q2hhdElkLmN1cnJlbnQgPSBpbml0aWFsQ2hhdElkXG4gICAgICBzZXRBY3RpdmVTZXNzaW9uSWQoaW5pdGlhbENoYXRJZClcbiAgICAgIGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCA9IHV1aWR2NCgpXG4gICAgICBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQgPSBudWxsXG4gICAgICByZXBvcnRlZEV2ZW50LmN1cnJlbnQgPSBmYWxzZVxuICAgICAgLy8gaXNQcm9jZXNzaW5nUmVmIHJlZmxlamEgc2kgbGEgc2VzacOzbiBBQ1RJVkEgZXN0w6Egb2N1cGFkYS4gU2kgbGEgc2VzacOzblxuICAgICAgLy8gYSBsYSBxdWUgZW50cmFtb3Mgc2lndWUgZ2VuZXJhbmRvIGVuIGJhY2tncm91bmQsIHF1ZWRhIGJsb3F1ZWFkYTsgc2kgbm8sXG4gICAgICAvLyBzZSBoYWJpbGl0YSBlbCBlbnbDrW8gYXVucXVlIG90cmFzIHNlc2lvbmVzIHNpZ2FuIGdlbmVyYW5kby5cbiAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gc2Vzc2lvblN0cmVhbU1hbmFnZXIuaXNBY3RpdmUoaW5pdGlhbENoYXRJZClcbiAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuXG4gICAgICAvLyBsb2FkTWVzc2FnZXMgbG8gZGlzcGFyYSB1c2VDaGF0TWVzc2FnZXMgYWwgY2FtYmlhciBjaGF0SWQgKGNvbiBjYWNoZSBlbiBtZW1vcmlhKS5cbiAgICB9XG4gIH0sIFtpbml0aWFsQ2hhdElkLCBwcm9qZWN0LCBzZXRQcm9qZWN0LCBzZXRDbGllbnQsIHNldENoaXBzUHJvamVjdCwgc2V0VGFza10pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXRBY3RpdmVDaGF0SWQoaW5pdGlhbENoYXRJZCB8fCBudWxsKVxuICB9LCBbaW5pdGlhbENoYXRJZCwgc2V0QWN0aXZlQ2hhdElkXSlcblxuICBjb25zdCBoYW5kbGVTdHJlYW1FcnJvciA9IHVzZUNhbGxiYWNrKFxuICAgIChjdHg6IFN0cmVhbUNvbnRleHQsIGVycm9yTWVzc2FnZT86IHN0cmluZywgZXJyb3JSYXdNZXNzYWdlPzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHNlc3Npb25JZCwgbWVzc2FnZUlkLCBwbGFjZWhvbGRlcklkIH0gPSBjdHhcbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gYWN0aXZlVmlldy5pcyhzZXNzaW9uSWQpXG5cbiAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICAgIGRyb3BGcm9tU2Vzc2lvbihzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQpXG5cbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICBjbGVhclN0cmVhbVVpUmVmLmN1cnJlbnQoKVxuICAgICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzQWNjZXNzRGVuaWVkID0gZXJyb3JNZXNzYWdlID09PSBcIkFjY2VzcyBkZW5pZWQ6IFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoaXMgYWdlbnRcIlxuICAgICAgY29uc3QgaXNQcm9tcHRUb29Mb25nID1cbiAgICAgICAgZXJyb3JNZXNzYWdlID09PSAnaW52YWxpZF9yZXF1ZXN0X2Vycm9yJyAmJiBlcnJvclJhd01lc3NhZ2U/LmluY2x1ZGVzKCdwcm9tcHQgaXMgdG9vIGxvbmcnKVxuICAgICAgY29uc3QgbWVzc2FnZSA9IGlzQWNjZXNzRGVuaWVkXG4gICAgICAgID8gdCgnY2hhdC5lcnJvckFjY2Vzc0RlbmllZCcpXG4gICAgICAgIDogaXNQcm9tcHRUb29Mb25nXG4gICAgICAgICAgPyB0KCdjaGF0LmVycm9yUHJvbXB0VG9vTG9uZycsIHsgdXNlZDogZXJyb3JSYXdNZXNzYWdlPy5tYXRjaCgvKFxcZCspIHRva2Vucy8pPy5bMV0gPz8gJycgfSlcbiAgICAgICAgICA6IHQoJ2NoYXQuZXJyb3InKVxuXG4gICAgICBjb21taXRUb1Nlc3Npb24oc2Vzc2lvbklkLCB7XG4gICAgICAgIGlkOiBgYW5zd2VyLSR7bWVzc2FnZUlkfWAsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgICAgIC8vIENoaXAgXCJSZWludGVudGFyXCIgc29sbyBlbiBlbCBlcnJvciBnZW7DqXJpY28gKHAuIGVqLiA1MDApOyBubyBhcGxpY2EgYSBhY2Nlc3MgZGVuaWVkIG5pIHByb21wdCB0b28gbG9uZy5cbiAgICAgICAgLi4uKCFpc0FjY2Vzc0RlbmllZCAmJiAhaXNQcm9tcHRUb29Mb25nID8geyBzdWdnZXN0aW9uczogW3QoJ2NoYXQucmV0cnknKV0gfSA6IHt9KSxcbiAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6ICdBc3Npc3RhbnQnIH0sXG4gICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICB9KVxuICAgICAgY2xlYXJTZXNzaW9uVGFpbChzZXNzaW9uSWQpXG5cbiAgICAgIGlmICghaXNBY3RpdmUpIHtcbiAgICAgICAgZ2V0Q2hhdHNTdG9yZVN0YXRlKCkubWFya0NoYXRBc1VucmVhZChzZXNzaW9uSWQpXG4gICAgICAgIG5vdGlmeVNlc3Npb25GaW5pc2hlZEluQmFja2dyb3VuZChzZXNzaW9uSWQsICdlcnJvcicpXG4gICAgICB9XG4gICAgfSxcbiAgICBbY29tbWl0VG9TZXNzaW9uLCBkcm9wRnJvbVNlc3Npb24sIGNsZWFyU2Vzc2lvblRhaWwsIHRdXG4gIClcblxuICBjb25zdCBoYW5kbGVTdHJlYW1VcGRhdGUgPSB1c2VDYWxsYmFjayhcbiAgICAoY3R4OiBTdHJlYW1Db250ZXh0LCBjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkIH0gPSBjdHhcblxuICAgICAgLy8gQXNlZ3VyYW1vcyBlbCBwbGFjZWhvbGRlciB1bmEgw7puaWNhIHZleiBwb3Igc3RyZWFtLCB0YW50byBlbiBlbCBzdG9yZVxuICAgICAgLy8gZGUgbGEgc2VzacOzbiBjb21vIGVuIGxhIHZpc3RhIHNpIGVzIGxhIGFjdGl2YS4gRWwgdGV4dG8gZW4gdml2byB2aWFqYVxuICAgICAgLy8gcG9yIHNlc3Npb25TdHJlYW1pbmdUZXh0IChleHRlcm5vKSwgc2luIHJlLXJlbmRlciBkZWwgw6FyYm9sIGNvbXBsZXRvLlxuICAgICAgY29uc3QgcGxhY2Vob2xkZXJFeGlzdHMgPSB1c2VTZXNzaW9uc1N0b3JlXG4gICAgICAgIC5nZXRTdGF0ZSgpXG4gICAgICAgIC5nZXRNZXNzYWdlcyhzZXNzaW9uSWQpXG4gICAgICAgIC5zb21lKG1zZyA9PiBtc2cuaWQgPT09IHBsYWNlaG9sZGVySWQpXG5cbiAgICAgIGlmICghcGxhY2Vob2xkZXJFeGlzdHMpIHtcbiAgICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuc3RhcnQoc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkKVxuICAgICAgICBjb21taXRUb1Nlc3Npb24oc2Vzc2lvbklkLCB7XG4gICAgICAgICAgaWQ6IHBsYWNlaG9sZGVySWQsXG4gICAgICAgICAgbWVzc2FnZTogJycsXG4gICAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogJ0Fzc2lzdGFudCcgfSxcbiAgICAgICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aXZlVmlldy5pcyhzZXNzaW9uSWQpKSB7XG4gICAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IHBsYWNlaG9sZGVySWRcbiAgICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBzZXNzaW9uSWRcbiAgICAgIH1cblxuICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuc2V0VGV4dChzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQsIGNvbnRlbnQpXG4gICAgfSxcbiAgICBbY29tbWl0VG9TZXNzaW9uXVxuICApXG5cbiAgY29uc3QgaGFuZGxlU3RyZWFtRmluaXNoID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKFxuICAgICAgY3R4OiBTdHJlYW1Db250ZXh0LFxuICAgICAgY29udGVudDogc3RyaW5nLFxuICAgICAgc291cmNlczogYW55LFxuICAgICAgbWVtb3J5U2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgICByYXdBdHRhY2htZW50cz86IGFueVtdIHwgbnVsbCxcbiAgICAgIHN1Z2dlc3Rpb25zPzogc3RyaW5nW10gfCBudWxsLFxuICAgICAgY29tcGxldGVkQWdlbnRJZD86IHN0cmluZyB8IG51bGxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkIH0gPSBjdHhcbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gYWN0aXZlVmlldy5pcyhzZXNzaW9uSWQpXG5cbiAgICAgIGNvbnN0IHRlbXBNZXNzYWdlSWQgPSBwbGFjZWhvbGRlcklkXG4gICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICBkcm9wRnJvbVNlc3Npb24oc2Vzc2lvbklkLCB0ZW1wTWVzc2FnZUlkKVxuICAgICAgY29uc3QgYXR0YWNobWVudHMgPSBub3JtYWxpemVBc3Npc3RhbnRBdHRhY2htZW50cyhyYXdBdHRhY2htZW50cylcblxuICAgICAgLy8gU2VzacOzbiBlbiBiYWNrZ3JvdW5kOiBjZXJyYW1vcyBsZWFuLiBFbCBiYWNrZW5kIHlhIHBlcnNpc3Rpw7MgbGFcbiAgICAgIC8vIHJlc3B1ZXN0YSwgYXPDrSBxdWUgYWwgdm9sdmVyIGEgbGEgc2VzacOzbiBzZSBjYXJnYSBkZXNkZSBhaMOtLiBBdmlzYW1vc1xuICAgICAgLy8gcXVlIHRlcm1pbsOzICh1bnJlYWQgKyBldmVudG8gcGFyYSB0b2FzdC9zb25pZG8pLlxuICAgICAgaWYgKCFpc0FjdGl2ZSkge1xuICAgICAgICBjb21taXRUb1Nlc3Npb24oc2Vzc2lvbklkLCB7XG4gICAgICAgICAgaWQ6IGBhbnN3ZXItJHttZW1vcnlTZXNzaW9uSWR9YCxcbiAgICAgICAgICBtZXNzYWdlOiBjb250ZW50LFxuICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6ICdBc3Npc3RhbnQnIH0sXG4gICAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgICBzb3VyY2VzLFxuICAgICAgICAgIC4uLihhdHRhY2htZW50cy5sZW5ndGggPiAwID8geyBhdHRhY2htZW50cyB9IDoge30pLFxuICAgICAgICAgIG1lbW9yeVNlc3Npb25JZCxcbiAgICAgICAgICBzdWdnZXN0aW9uczogc3VnZ2VzdGlvbnMgfHwgW10sXG4gICAgICAgIH0pXG4gICAgICAgIGNsZWFyU2Vzc2lvblRhaWwoc2Vzc2lvbklkKVxuICAgICAgICBnZXRDaGF0c1N0b3JlU3RhdGUoKS5tYXJrQ2hhdEFzVW5yZWFkKHNlc3Npb25JZClcbiAgICAgICAgbm90aWZ5U2Vzc2lvbkZpbmlzaGVkSW5CYWNrZ3JvdW5kKHNlc3Npb25JZCwgJ2NvbXBsZXRlJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYuY3VycmVudCA9IG51bGxcblxuICAgICAgLy8gRGV0ZWN0YXIgdG9kYXMgbGFzIFVSTHMgZGUgdGFyZWFzICguLi4vdGFza3MvMTIzL2RldGFpbHxtZXNzYWdlfG1lc3NhZ2VzfGZpbGVzfGhpc3Rvcnl8aG91cnMpXG4gICAgICBjb25zdCB0YXNrVXJsUmVnZXggPSBuZXcgUmVnRXhwKFRBU0tfVVJMX1JFR0VYX1BBVFRFUk4sICdnJylcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBbLi4uY29udGVudC5tYXRjaEFsbCh0YXNrVXJsUmVnZXgpXVxuXG4gICAgICBsZXQgY29udGVudFRvQWRkID0gY29udGVudFxuICAgICAgY29uc3QgcHJldmlvdXNNZXNzYWdlID0gbWVzc2FnZXNSZWYuY3VycmVudC5maWx0ZXIobSA9PiBtLmlkICE9PSB0ZW1wTWVzc2FnZUlkKS5hdCgtMSlcbiAgICAgIGNvbnN0IGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgPSBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsICE9IG51bGxcbiAgICAgIGNvbnN0IFRBU0tfQ1JFQVRJT05fVE9PTFMgPSBbJ2NyZWF0ZV90YXNrJywgJ2NyZWF0ZV90YXNrc19iYXRjaCcsICdjbG9uZV90YXNrJ11cbiAgICAgIGNvbnN0IFRBU0tfRURJVF9UT09MUyA9IFtcbiAgICAgICAgJ2VkaXRfdGFzaycsXG4gICAgICAgICdlZGl0X3Rhc2tzX2JhdGNoJyxcbiAgICAgICAgJ3Rhc2tfYXNzaWduJyxcbiAgICAgICAgJ3Rhc2tfdW5hc3NpZ24nLFxuICAgICAgICAndXBkYXRlX3Rhc2tfdHlwZScsXG4gICAgICAgICd1cGRhdGVfZXN0aW1hdGVkX2hvdXJzJyxcbiAgICAgICAgJ2Fzc2lnbl90YXNrX2xhYmVsJyxcbiAgICAgIF1cbiAgICAgIGNvbnN0IFRBU0tfREVMRVRFX1RPT0xTID0gWydkZWxldGVfdGFzaycsICdkZWxldGVfdGFza3NfYmF0Y2gnXVxuICAgICAgY29uc3QgcGVuZGluZ0FjdGlvbnMgPSBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsPy5wZW5kaW5nX2FjdGlvbnMgfHwgW11cbiAgICAgIGNvbnN0IHdhc1Rhc2tDcmVhdGlvbiA9XG4gICAgICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiZcbiAgICAgICAgcGVuZGluZ0FjdGlvbnMuc29tZSgoYWN0aW9uOiBhbnkpID0+IFRBU0tfQ1JFQVRJT05fVE9PTFMuaW5jbHVkZXMoYWN0aW9uLnRvb2xfbmFtZSkpXG4gICAgICBjb25zdCB3YXNUYXNrRWRpdCA9XG4gICAgICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiYgcGVuZGluZ0FjdGlvbnMuc29tZSgoYWN0aW9uOiBhbnkpID0+IFRBU0tfRURJVF9UT09MUy5pbmNsdWRlcyhhY3Rpb24udG9vbF9uYW1lKSlcbiAgICAgIGNvbnN0IHdhc1Rhc2tEZWxldGUgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zLnNvbWUoKGFjdGlvbjogYW55KSA9PiBUQVNLX0RFTEVURV9UT09MUy5pbmNsdWRlcyhhY3Rpb24udG9vbF9uYW1lKSlcbiAgICAgIGNvbnN0IHdhc0NyZWF0ZUFnZW50QXBwcm92ZWQgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgIHByZXZpb3VzTWVzc2FnZT8uYXBwcm92YWxTdGF0dXMgPT09ICdhcHByb3ZlZCcgJiZcbiAgICAgICAgcGVuZGluZ0FjdGlvbnMuc29tZSgoYWN0aW9uOiBhbnkpID0+IGFjdGlvbi50b29sX25hbWUgPT09ICdjcmVhdGVfYWdlbnQnKVxuICAgICAgY29uc3Qgd2FzQ29uZmlndXJlQWdlbnRBY2Nlc3NBcHByb3ZlZCA9XG4gICAgICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiZcbiAgICAgICAgcHJldmlvdXNNZXNzYWdlPy5hcHByb3ZhbFN0YXR1cyA9PT0gJ2FwcHJvdmVkJyAmJlxuICAgICAgICBwZW5kaW5nQWN0aW9ucy5zb21lKChhY3Rpb246IGFueSkgPT4gKGFjdGlvbi50b29sX25hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdjb25maWd1cmVfYWdlbnRfYWNjZXNzJylcbiAgICAgIGxldCBjcmVhdGVBZ2VudEZvbGxvd1VwOiB7IGFnZW50SWQ6IHN0cmluZyB9IHwgdW5kZWZpbmVkXG4gICAgICBpZiAod2FzQ3JlYXRlQWdlbnRBcHByb3ZlZCAmJiB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyAmJiBjb21wbGV0ZWRBZ2VudElkPy50cmltKCkpIHtcbiAgICAgICAgY3JlYXRlQWdlbnRGb2xsb3dVcCA9IHsgYWdlbnRJZDogY29tcGxldGVkQWdlbnRJZC50cmltKCkgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgd2FzQ29uZmlndXJlQWdlbnRBY2Nlc3NBcHByb3ZlZCAmJlxuICAgICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyAmJlxuICAgICAgICAoY29tcGxldGVkQWdlbnRJZD8udHJpbSgpIHx8XG4gICAgICAgICAgZXh0cmFjdEFnZW50SWRGcm9tUGVuZGluZ0FjdGlvbnNCeVRvb2xOYW1lKHBlbmRpbmdBY3Rpb25zLCAnY29uZmlndXJlX2FnZW50X2FjY2VzcycpKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ3VyZWRBZ2VudElkID1cbiAgICAgICAgICBjb21wbGV0ZWRBZ2VudElkPy50cmltKCkgfHxcbiAgICAgICAgICBleHRyYWN0QWdlbnRJZEZyb21QZW5kaW5nQWN0aW9uc0J5VG9vbE5hbWUocGVuZGluZ0FjdGlvbnMsICdjb25maWd1cmVfYWdlbnRfYWNjZXNzJylcbiAgICAgICAgY3JlYXRlQWdlbnRGb2xsb3dVcCA9IHtcbiAgICAgICAgICBhZ2VudElkOiBjb25maWd1cmVkQWdlbnRJZCBhcyBzdHJpbmcsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHdhc0NyZWF0ZUFnZW50QXBwcm92ZWQpIHtcbiAgICAgICAgZXZlbnQoRVZFTlRTLmFpQ2hhdEhpdGxPcHRpb24sIHtcbiAgICAgICAgICBhZ2VudF90eXBlOiBnZXRIaXRsQW5hbHl0aWNzQWdlbnRUeXBlKGFnZW50KSxcbiAgICAgICAgICBhY3Rpb25fdHlwZTogYnVpbGRIaXRsQWN0aW9uVHlwZUxpc3QocGVuZGluZ0FjdGlvbnMpLFxuICAgICAgICAgIGRlY2lzaW9uOiAnYWNjZXB0JyxcbiAgICAgICAgICBvcHRpb246ICdjcmVhdGVfYWdlbnQnLFxuICAgICAgICAgIC4uLihjb21wbGV0ZWRBZ2VudElkPy50cmltKCkgPyB7IGNyZWF0ZWRfYWdlbnRfaWQ6IGNvbXBsZXRlZEFnZW50SWQudHJpbSgpIH0gOiB7fSksXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdhc0VkaXRBZ2VudEFwcHJvdmVkID1cbiAgICAgICAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSAmJlxuICAgICAgICBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsU3RhdHVzID09PSAnYXBwcm92ZWQnICYmXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zLnNvbWUoKGFjdGlvbjogYW55KSA9PiAoYWN0aW9uLnRvb2xfbmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ2VkaXRfYWdlbnQnKVxuXG4gICAgICBsZXQgZWRpdEFnZW50Rm9sbG93VXA6IHsgYWdlbnRJZDogc3RyaW5nIH0gfCB1bmRlZmluZWRcbiAgICAgIGlmICh3YXNFZGl0QWdlbnRBcHByb3ZlZCkge1xuICAgICAgICBjb25zdCBmcm9tU3RyZWFtID0gY29tcGxldGVkQWdlbnRJZD8udHJpbSgpXG4gICAgICAgIGNvbnN0IGZyb21BcmdzID0gZXh0cmFjdEFnZW50SWRGcm9tRWRpdEFnZW50UGVuZGluZ0FjdGlvbnMocGVuZGluZ0FjdGlvbnMpXG4gICAgICAgIGNvbnN0IHJlc29sdmVkQWdlbnRJZCA9IGZyb21TdHJlYW0gfHwgZnJvbUFyZ3NcbiAgICAgICAgaWYgKHJlc29sdmVkQWdlbnRJZCkge1xuICAgICAgICAgIGVkaXRBZ2VudEZvbGxvd1VwID0geyBhZ2VudElkOiByZXNvbHZlZEFnZW50SWQgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhc2tJZHNGcm9tVXJscyA9IG1hdGNoZXMubWFwKG1hdGNoID0+IHBhcnNlSW50KG1hdGNoWzFdLCAxMCkpXG4gICAgICBjb25zdCB0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsID0gZXh0cmFjdFRhc2tJZHNGcm9tRGVsZXRlUGVuZGluZ0FjdGlvbnMocGVuZGluZ0FjdGlvbnMpXG4gICAgICBjb25zdCB0YXNrSWRzRnJvbURlbGV0aW9uVGV4dCA9XG4gICAgICAgIHdhc1Rhc2tEZWxldGUgJiYgdGFza0lkc0Zyb21VcmxzLmxlbmd0aCA9PT0gMCAmJiB0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsLmxlbmd0aCA9PT0gMFxuICAgICAgICAgID8gZXh0cmFjdFRhc2tJZHNGcm9tQXNzaXN0YW50RGVsZXRpb25UZXh0KGNvbnRlbnQpXG4gICAgICAgICAgOiBbXVxuICAgICAgY29uc3QgdGFza0lkc0ZvckRhc2hib2FyZCA9XG4gICAgICAgIHRhc2tJZHNGcm9tVXJscy5sZW5ndGggPiAwXG4gICAgICAgICAgPyB0YXNrSWRzRnJvbVVybHNcbiAgICAgICAgICA6IHRhc2tJZHNGcm9tRGVsZXRlQXBwcm92YWwubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyB0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsXG4gICAgICAgICAgICA6IHRhc2tJZHNGcm9tRGVsZXRpb25UZXh0XG5cbiAgICAgIGNvbnN0IHNob3VsZFN5bmNEYXNoYm9hcmQgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgICh3YXNUYXNrQ3JlYXRpb24gfHwgd2FzVGFza0VkaXQgfHwgd2FzVGFza0RlbGV0ZSkgJiZcbiAgICAgICAgdGFza0lkc0ZvckRhc2hib2FyZC5sZW5ndGggPiAwXG5cbiAgICAgIGlmIChzaG91bGRTeW5jRGFzaGJvYXJkKSB7XG4gICAgICAgIGNvbnN0IHRhc2tJZHMgPSB0YXNrSWRzRm9yRGFzaGJvYXJkXG4gICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB0YWIgPSBhd2FpdCBnZXRUYWJUYXNrRGVmYXVsdCh0YXNrSWRzWzBdKVxuICAgICAgICAgIGNvbnN0IHRhYlNlZ21lbnQgPSB0YWIgPyBgLyR7dGFifWAgOiAnL2RldGFpbCdcbiAgICAgICAgICBjb250ZW50VG9BZGQgPSBjb250ZW50LnJlcGxhY2UodGFza1VybFJlZ2V4LCB1cmwgPT5cbiAgICAgICAgICAgIHVybC5yZXBsYWNlKC9cXC8oZGV0YWlsfG1lc3NhZ2V8bWVzc2FnZXN8ZmlsZXN8aGlzdG9yeXxob3VycykoPz0kfFxcPykvLCB0YWJTZWdtZW50KVxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RQcm9qZWN0TWVzc2FnZSA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQuZmlsdGVyKG1zZyA9PiBtc2cucHJvamVjdElkKS5hdCgtMSlcbiAgICAgICAgY29uc3QgY29udGV4dFByb2plY3RJZFJhdyA9IHByb2plY3Q/LmlkIHx8IGxhc3RQcm9qZWN0TWVzc2FnZT8ucHJvamVjdElkXG4gICAgICAgIGNvbnN0IGNvbnRleHRQcm9qZWN0SWQgPSBjb250ZXh0UHJvamVjdElkUmF3ID8gcGFyc2VJbnQoU3RyaW5nKGNvbnRleHRQcm9qZWN0SWRSYXcpLCAxMCkgOiBudWxsXG4gICAgICAgIGNvbnN0IHBhdGhNYXRjaCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5tYXRjaCgvXlxcL3Byb2plY3RzXFwvKFxcZCspXFwvLylcbiAgICAgICAgY29uc3Qgcm91dGVQcm9qZWN0SWQgPSBwYXRoTWF0Y2ggPyBwYXJzZUludChwYXRoTWF0Y2hbMV0sIDEwKSA6IG51bGxcbiAgICAgICAgY29uc3QgaXNPblByb2plY3RSb3V0ZSA9IGNvbnRleHRQcm9qZWN0SWQgJiYgcm91dGVQcm9qZWN0SWQgJiYgY29udGV4dFByb2plY3RJZCA9PT0gcm91dGVQcm9qZWN0SWRcblxuICAgICAgICBpZiAoaXNPblByb2plY3RSb3V0ZSkge1xuICAgICAgICAgIGlmICh3YXNUYXNrQ3JlYXRpb24pIHtcbiAgICAgICAgICAgIHdpbmRvdy5uZXdQcm9qZWN0RGFzaGJvYXJkPy5hZGRFeGlzdGluZ1Rhc2tUb0Rhc2hib2FyZD8uKHRhc2tJZHMpXG4gICAgICAgICAgfSBlbHNlIGlmICh3YXNUYXNrRWRpdCkge1xuICAgICAgICAgICAgd2luZG93Lm5ld1Byb2plY3REYXNoYm9hcmQ/LmVkaXRFeGlzdGluZ1Rhc2tJbkRhc2hib2FyZD8uKHRhc2tJZHMpXG4gICAgICAgICAgfSBlbHNlIGlmICh3YXNUYXNrRGVsZXRlKSB7XG4gICAgICAgICAgICB3aW5kb3cubmV3UHJvamVjdERhc2hib2FyZD8uZGVsZXRlRXhpc3RpbmdUYXNrRnJvbURhc2hib2FyZD8uKHRhc2tJZHMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZmV0Y2ggZGVsIHRhc2sgcGFuZWwgc2kgZXN0w6EgYWJpZXJ0byB5IGxhIHRvb2wgYXByb2JhZGEgZWRpdMOzL2JvcnLDsyBlc2EgdGFyZWEuXG4gICAgICAvLyBDdWJyZSBsb3MgZG9zIGZsdWpvcyBkZSBhcHByb3ZhbDpcbiAgICAgIC8vICAgMSkgQXBwcm92YWwgcG9yIGJvdMOzbiDihpIgYHByZXZpb3VzTWVzc2FnZS5hcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnNgICh2w61hIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UpXG4gICAgICAvLyAgIDIpIE1hbnVhbCBhcHByb3ZhbCAodXN1YXJpbyB0aXBlYSBcInNpXCIvXCJub1wiKSDihpIgYGxhc3RNYW51YWxBcHByb3ZhbFJlZi5jdXJyZW50YFxuICAgICAgY29uc3Qgb3BlblRhc2tQYW5lbElkID0gd2luZG93LnRhc2tQYW5lbD8udGFza0lkXG4gICAgICBjb25zdCBtYW51YWxBcHByb3ZhbCA9IGxhc3RNYW51YWxBcHByb3ZhbFJlZi5jdXJyZW50XG4gICAgICBsYXN0TWFudWFsQXBwcm92YWxSZWYuY3VycmVudCA9IG51bGwgLy8gY29uc3VtaXIgdW5hIHNvbGEgdmV6XG4gICAgICBjb25zdCBtYW51YWxXYXNUYXNrRWRpdCA9ICEhbWFudWFsQXBwcm92YWwgJiYgVEFTS19FRElUX1RPT0xTLmluY2x1ZGVzKG1hbnVhbEFwcHJvdmFsLnRvb2xOYW1lKVxuICAgICAgY29uc3QgbWFudWFsV2FzVGFza0RlbGV0ZSA9ICEhbWFudWFsQXBwcm92YWwgJiYgVEFTS19ERUxFVEVfVE9PTFMuaW5jbHVkZXMobWFudWFsQXBwcm92YWwudG9vbE5hbWUpXG5cbiAgICAgIC8vIFN5bmMgUGxhbm5lcjogYXZpc2FyIGNhcmdhIGRlIGhvcmFzIGNvbmZpcm1hZGEgKGNyZWF0ZV9ob3VyIC8gY3JlYXRlX2hvdXJzKS5cbiAgICAgIGNvbnN0IGhvdXJzVG9vbHNGcm9tQXBwcm92YWwgPSBwZW5kaW5nQWN0aW9uc1xuICAgICAgICAubWFwKChhY3Rpb246IFBlbmRpbmdBY3Rpb24pID0+IGFjdGlvbi50b29sX25hbWUpXG4gICAgICAgIC5maWx0ZXIoKHRvb2xOYW1lKTogdG9vbE5hbWUgaXMgc3RyaW5nID0+IGlzSG91cnNDaGFyZ2VUb29sKHRvb2xOYW1lKSlcbiAgICAgIGNvbnN0IHdhc0hvdXJzQ2hhcmdlQXBwcm92ZWQgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgIHByZXZpb3VzTWVzc2FnZT8uYXBwcm92YWxTdGF0dXMgPT09ICdhcHByb3ZlZCcgJiZcbiAgICAgICAgaG91cnNUb29sc0Zyb21BcHByb3ZhbC5sZW5ndGggPiAwXG4gICAgICBjb25zdCBtYW51YWxIb3Vyc1Rvb2wgPSBtYW51YWxBcHByb3ZhbD8udG9vbE5hbWVcbiAgICAgIGNvbnN0IHdhc0hvdXJzQ2hhcmdlTWFudWFsQXBwcm92ZWQgPSBpc0hvdXJzQ2hhcmdlVG9vbChtYW51YWxIb3Vyc1Rvb2wpXG5cbiAgICAgIGlmICh3YXNIb3Vyc0NoYXJnZUFwcHJvdmVkIHx8IHdhc0hvdXJzQ2hhcmdlTWFudWFsQXBwcm92ZWQpIHtcbiAgICAgICAgY29uc3QgdG9vbHMgPSB3YXNIb3Vyc0NoYXJnZUFwcHJvdmVkID8gaG91cnNUb29sc0Zyb21BcHByb3ZhbCA6IG1hbnVhbEhvdXJzVG9vbCA/IFttYW51YWxIb3Vyc1Rvb2xdIDogW11cbiAgICAgICAgZGlzcGF0Y2hNYWlhSG91cnNDaGFyZ2VkKHtcbiAgICAgICAgICBzb3VyY2U6ICdtYWlhJyxcbiAgICAgICAgICB0b29scyxcbiAgICAgICAgICBzZXNzaW9uSWQ6IG1lbW9yeVNlc3Npb25JZCxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKG9wZW5UYXNrUGFuZWxJZCAmJiAod2FzVGFza0VkaXQgfHwgd2FzVGFza0RlbGV0ZSB8fCBtYW51YWxXYXNUYXNrRWRpdCB8fCBtYW51YWxXYXNUYXNrRGVsZXRlKSkge1xuICAgICAgICBjb25zdCBtYW51YWxQc2V1ZG9BY3Rpb246IFBlbmRpbmdBY3Rpb24gfCBudWxsID0gbWFudWFsQXBwcm92YWxcbiAgICAgICAgICA/ICh7IHRvb2xfbmFtZTogbWFudWFsQXBwcm92YWwudG9vbE5hbWUsIHRvb2xfYXJnczogbWFudWFsQXBwcm92YWwudG9vbEFyZ3MgPz8ge30gfSBhcyBQZW5kaW5nQWN0aW9uKVxuICAgICAgICAgIDogbnVsbFxuICAgICAgICBjb25zdCBhZmZlY3RlZFRhc2tJZHMgPSBbXG4gICAgICAgICAgLi4uZXh0cmFjdFRhc2tJZHNGcm9tUGVuZGluZ0FjdGlvbnNBcmdzKHBlbmRpbmdBY3Rpb25zKSxcbiAgICAgICAgICAuLi50YXNrSWRzRnJvbVVybHMsXG4gICAgICAgICAgLi4udGFza0lkc0Zyb21EZWxldGVBcHByb3ZhbCxcbiAgICAgICAgICAuLi4obWFudWFsUHNldWRvQWN0aW9uID8gZXh0cmFjdFRhc2tJZHNGcm9tUGVuZGluZ0FjdGlvbnNBcmdzKFttYW51YWxQc2V1ZG9BY3Rpb25dKSA6IFtdKSxcbiAgICAgICAgXS5tYXAoU3RyaW5nKVxuICAgICAgICBpZiAoYWZmZWN0ZWRUYXNrSWRzLmluY2x1ZGVzKFN0cmluZyhvcGVuVGFza1BhbmVsSWQpKSkge1xuICAgICAgICAgIHdpbmRvdy50YXNrUGFuZWw/LnJlZmV0Y2hUYXNrPy4oKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbW1pdFRvU2Vzc2lvbihzZXNzaW9uSWQsIHtcbiAgICAgICAgaWQ6IGBhbnN3ZXItJHttZW1vcnlTZXNzaW9uSWR9YCxcbiAgICAgICAgbWVzc2FnZTogY29udGVudFRvQWRkLFxuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogJ0Fzc2lzdGFudCcgfSxcbiAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgc291cmNlcyxcbiAgICAgICAgLi4uKGF0dGFjaG1lbnRzLmxlbmd0aCA+IDAgPyB7IGF0dGFjaG1lbnRzIH0gOiB7fSksXG4gICAgICAgIG1lbW9yeVNlc3Npb25JZCxcbiAgICAgICAgc3VnZ2VzdGlvbnM6IHN1Z2dlc3Rpb25zIHx8IFtdLFxuICAgICAgICAuLi4oY3JlYXRlQWdlbnRGb2xsb3dVcCA/IHsgY3JlYXRlQWdlbnRGb2xsb3dVcCB9IDoge30pLFxuICAgICAgfSlcbiAgICAgIGNsZWFyU2Vzc2lvblRhaWwoc2Vzc2lvbklkKVxuXG4gICAgICBpZiAoY3JlYXRlQWdlbnRGb2xsb3dVcD8uYWdlbnRJZCkge1xuICAgICAgICBmZXRjaEFnZW50RGV0YWlsKGNyZWF0ZUFnZW50Rm9sbG93VXAuYWdlbnRJZClcbiAgICAgICAgICAudGhlbihjaGF0QWdlbnQgPT4ge1xuICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdtYWlhLW1lcmdlLWNyZWF0ZWQtYWdlbnQtaW50by1saXN0Jywge1xuICAgICAgICAgICAgICAgIGRldGFpbDogeyBhZ2VudDogY2hhdEFnZW50IH0sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1t1c2VDaGF0TWFuYWdlcl0gTm8gc2UgcHVkbyBhw7FhZGlyIGVsIGFnZW50ZSByZWNpw6luIGNyZWFkbyBhbCBsaXN0YWRvJywgZXJyKVxuICAgICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChlZGl0QWdlbnRGb2xsb3dVcD8uYWdlbnRJZCkge1xuICAgICAgICBmZXRjaEFnZW50RGV0YWlsKGVkaXRBZ2VudEZvbGxvd1VwLmFnZW50SWQpXG4gICAgICAgICAgLnRoZW4oY2hhdEFnZW50ID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnbWFpYS1zeW5jLWVkaXRlZC1hZ2VudC1mcm9tLWNoYXQnLCB7XG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7IGFnZW50OiBjaGF0QWdlbnQgfSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW3VzZUNoYXRNYW5hZ2VyXSBObyBzZSBwdWRvIHJlZnJlc2NhciBlbCBhZ2VudGUgZWRpdGFkbycsIGVycilcbiAgICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG5cbiAgICAgIGNvbnN0IHsgaXNDaGF0Vmlld1Zpc2libGUsIG1hcmtDaGF0QXNSZWFkIH0gPSBnZXRDaGF0c1N0b3JlU3RhdGUoKVxuICAgICAgaWYgKGlzQWN0aXZlICYmIGlzQ2hhdFZpZXdWaXNpYmxlKSB7XG4gICAgICAgIGF3YWl0IG1hcmtDaGF0QXNSZWFkKHNlc3Npb25JZCwgeyBmb3JjZTogdHJ1ZSB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoZmlyc3RUaW1lUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3JlZmV0Y2gtc2Vzc2lvbicpXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpXG4gICAgICAgIGZpcnN0VGltZVJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIH1cbiAgICB9LFxuICAgIFtjb21taXRUb1Nlc3Npb24sIGRyb3BGcm9tU2Vzc2lvbiwgY2xlYXJTZXNzaW9uVGFpbCwgcHJvamVjdCwgZ2V0VGFiVGFza0RlZmF1bHQsIGV2ZW50LCBhZ2VudF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVN0cmVhbVN0b3AgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgLy8gRWwgc3RvcCBzaWVtcHJlIGFwbGljYSBhIGxhIHNlc2nDs24gYWN0aXZhIChib3TDs24gZGVsIGlucHV0IHZpc2libGUpLlxuICAgIGNvbnN0IHNlc3Npb25JZCA9IGN1cnJlbnRDaGF0SWQuY3VycmVudFxuICAgIGNsZWFyU3RyZWFtVWlSZWYuY3VycmVudCgpXG4gICAgY29uc3QgdGVtcE1lc3NhZ2VJZCA9IGBhbnN3ZXItJHtjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnR9LXN0cmVhbWluZ2BcbiAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIGRyb3BGcm9tU2Vzc2lvbihzZXNzaW9uSWQsIHRlbXBNZXNzYWdlSWQpXG5cbiAgICBjb21taXRUb1Nlc3Npb24oc2Vzc2lvbklkLCB7XG4gICAgICBpZDogYGFuc3dlci0ke2N1cnJlbnRNZXNzYWdlSWQuY3VycmVudH0tY2FuY2VsbGVkYCxcbiAgICAgIG1lc3NhZ2U6IHQoJ2NoYXQuY2FuY2VsbGVkJyksXG4gICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6ICdBc3Npc3RhbnQnIH0sXG4gICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgaXNGcm9udGVuZENhbmNlbGxlZDogdHJ1ZSxcbiAgICB9KVxuICAgIGNsZWFyU2Vzc2lvblRhaWwoc2Vzc2lvbklkKVxuICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdyZWZldGNoLXNlc3Npb24nKVxuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudClcbiAgICB9LCA1MDApXG4gIH0sIFtjb21taXRUb1Nlc3Npb24sIGRyb3BGcm9tU2Vzc2lvbiwgY2xlYXJTZXNzaW9uVGFpbCwgdF0pXG5cbiAgY29uc3QgaGFuZGxlQXBwcm92YWxSZXF1aXJlZCA9IHVzZUNhbGxiYWNrKFxuICAgIChjdHg6IFN0cmVhbUNvbnRleHQsIGFwcHJvdmFsOiBBcHByb3ZhbFJlcXVlc3QsIGFjY3VtdWxhdGVkQ29udGVudDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCB9ID0gY3R4XG4gICAgICBjb25zdCBpc0FjdGl2ZSA9IGFjdGl2ZVZpZXcuaXMoc2Vzc2lvbklkKVxuXG4gICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICBkcm9wRnJvbVNlc3Npb24oc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkKVxuXG4gICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGl0bENvbnRleHQ6IEhpdGxFeGVjdXRpb25Db250ZXh0ID0ge1xuICAgICAgICBtZXNzYWdlSWQ6IGBhcHByb3ZhbC0ke2FwcHJvdmFsLm9yaWdpbmFsX3RocmVhZF9pZH1gLFxuICAgICAgICBtZXNzYWdlVGV4dDogYWNjdW11bGF0ZWRDb250ZW50IHx8ICcnLFxuICAgICAgICBhcHByb3ZhbCxcbiAgICAgICAgcGVuZGluZ0FjdGlvbnM6IGFwcHJvdmFsLnBlbmRpbmdfYWN0aW9ucyxcbiAgICAgICAgdGhyZWFkSWRzOiBhcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnM/Lm1hcChhY3Rpb24gPT4gYWN0aW9uLnRocmVhZF9pZCksXG4gICAgICB9XG4gICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYuY3VycmVudCA9IGhpdGxDb250ZXh0XG4gICAgICB9XG5cbiAgICAgIGlmIChhcHByb3ZhbC5tYW51YWxfYXBwcm92YWxfZGV0ZWN0ZWQpIHtcbiAgICAgICAgY29uc3QgZmlyc3RBY3Rpb24gPSBhcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnM/LlswXVxuICAgICAgICBjb25zdCB0b29sTmFtZSA9IChhcHByb3ZhbCBhcyB7IHRvb2xfbmFtZT86IHN0cmluZyB9KS50b29sX25hbWUgPz8gZmlyc3RBY3Rpb24/LnRvb2xfbmFtZSA/PyAnJ1xuICAgICAgICBjb25zdCB0b29sQXJncyA9XG4gICAgICAgICAgKChhcHByb3ZhbCBhcyB7IHRvb2xfYXJncz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pLnRvb2xfYXJncyA/P1xuICAgICAgICAgICAgKGZpcnN0QWN0aW9uPy50b29sX2FyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpKSB8fFxuICAgICAgICAgIG51bGxcbiAgICAgICAgaWYgKHRvb2xOYW1lICYmIGlzQWN0aXZlKSB7XG4gICAgICAgICAgbGFzdE1hbnVhbEFwcHJvdmFsUmVmLmN1cnJlbnQgPSB7IHRvb2xOYW1lLCB0b29sQXJncyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgYSBtZXNzYWdlIHdpdGggdGhlIGFwcHJvdmFsIHJlcXVlc3RcbiAgICAgIGNvbW1pdFRvU2Vzc2lvbihzZXNzaW9uSWQsIHtcbiAgICAgICAgaWQ6IGBhcHByb3ZhbC0ke2FwcHJvdmFsLm9yaWdpbmFsX3RocmVhZF9pZH1gLFxuICAgICAgICBtZXNzYWdlOiBhY2N1bXVsYXRlZENvbnRlbnQgfHwgJycsXG4gICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiAnQXNzaXN0YW50JyB9LFxuICAgICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgICBhcHByb3ZhbCxcbiAgICAgICAgYXBwcm92YWxTdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgIH0pXG4gICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2V0Q2hhdHNTdG9yZVN0YXRlKCkubWFya0NoYXRBc1VucmVhZChzZXNzaW9uSWQpXG4gICAgICAgIG5vdGlmeVNlc3Npb25GaW5pc2hlZEluQmFja2dyb3VuZChzZXNzaW9uSWQsICdhcHByb3ZhbF9yZXF1aXJlZCcpXG4gICAgICB9XG4gICAgfSxcbiAgICBbY29tbWl0VG9TZXNzaW9uLCBkcm9wRnJvbVNlc3Npb25dXG4gIClcblxuICBjb25zdCB7XG4gICAgYXNrTWFpYSxcbiAgICBpc0xvYWRpbmc6IHdhaXRpbmdSZXNwb25zZSxcbiAgICBpc1dyaXRpbmcsXG4gICAgbG9hZGluZ01lc3NhZ2UsXG4gICAgc3RyZWFtQWN0aXZpdHksXG4gICAgdXBkYXRlU3RyZWFtQWN0aXZpdHksXG4gICAgc3RvcFN0cmVhbWluZyxcbiAgfSA9IHVzZU9yY2hlc3RyYXRvclN0cmVhbSh7XG4gICAgYWN0aXZlU2Vzc2lvbklkLFxuICAgIG9uRXJyb3I6IGhhbmRsZVN0cmVhbUVycm9yLFxuICAgIG9uU3RyZWFtVXBkYXRlOiBoYW5kbGVTdHJlYW1VcGRhdGUsXG4gICAgb25GaW5pc2hTdHJlYW06IGhhbmRsZVN0cmVhbUZpbmlzaCxcbiAgICBvblN0b3A6IGhhbmRsZVN0cmVhbVN0b3AsXG4gICAgb25BcHByb3ZhbFJlcXVpcmVkOiBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkLFxuICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLFxuICB9KVxuXG4gIGNsZWFyU3RyZWFtVWlSZWYuY3VycmVudCA9ICgpID0+IHtcbiAgICB1cGRhdGVTdHJlYW1BY3Rpdml0eShudWxsKVxuICAgIHNldEFjdGl2ZUxvYWRpbmdzKHt9KVxuICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBudWxsXG4gIH1cblxuICBjb25zdCBjdXJyZW50UHJvamVjdCA9IHByb2plY3RcblxuICBjb25zdCBzZW5kTWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGF0dGFjaG1lbnRzT3JPcHRpb25zPzogQXR0YWNobWVudEZpbGVbXSB8IFNlbmRNZXNzYWdlT3B0aW9ucyxcbiAgICAgIGZhcUlkPzogc3RyaW5nLFxuICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcsXG4gICAgICBtZW50aW9ucz86IENvbnRleHRNZW50aW9uW10sXG4gICAgICBmdWFJZD86IHN0cmluZyxcbiAgICAgIHNjSWQ/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCB8fCB3YWl0aW5nUmVzcG9uc2UgfHwgbG9hZGluZ01lc3NhZ2VzKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBUb3BlIGRlIGNvbmN1cnJlbmNpYTogc2kgZXN0YSBzZXNpw7NuIG5vIGVzdMOhIGdlbmVyYW5kbyB5IHlhIGhheVxuICAgICAgLy8gTUFYX0NPTkNVUlJFTlRfU1RSRUFNUyBhY3RpdmFzLCBhdmlzYW1vcyB5IG5vIGFycmFuY2Ftb3Mgb3RyYS5cbiAgICAgIGNvbnN0IHdpbGxTdGFydE5ld1N0cmVhbSA9ICFzZXNzaW9uU3RyZWFtTWFuYWdlci5pc0FjdGl2ZShjdXJyZW50Q2hhdElkLmN1cnJlbnQpXG4gICAgICBpZiAod2lsbFN0YXJ0TmV3U3RyZWFtICYmIHNlc3Npb25TdHJlYW1NYW5hZ2VyLmdldEFjdGl2ZUNvdW50KCkgPj0gTUFYX0NPTkNVUlJFTlRfU1RSRUFNUykge1xuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnc25hY2tiYXItZXZlbnQnLCB7XG4gICAgICAgICAgICBkZXRhaWw6IHsgc2hvdzogdHJ1ZSwgc2V2ZXJpdHk6ICdpbmZvJywgbWVzc2FnZTogdCgnY2hhdC50b29NYW55QWN0aXZlU2Vzc2lvbnMnKSB9LFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgYXR0YWNobWVudHMsIG9wdGlvbnMgfSA9IG5vcm1hbGl6ZVNlbmRNZXNzYWdlQXJncyhhdHRhY2htZW50c09yT3B0aW9ucylcbiAgICAgIC8vIExhcyBtZW50aW9ucyBwdWVkZW4gdmVuaXIgdsOtYSA1dG8gcGFyw6FtZXRybyAoY2FsbCBwb3NpdGlvbmFsIGRlc2RlIGVsIGZvb3RlcilcbiAgICAgIC8vIG8gdsOtYSBTZW5kTWVzc2FnZU9wdGlvbnMgKGNhbGwgcHJvZ3JhbcOhdGljbykuIEVsIHBhcsOhbWV0cm8gZXhwbMOtY2l0byBnYW5hLlxuICAgICAgY29uc3QgZWZmZWN0aXZlTWVudGlvbnMgPSBtZW50aW9ucyA/PyBvcHRpb25zLm1lbnRpb25zXG4gICAgICBjb25zdCBjb250ZXh0TWVzc2FnZTogQ29udGV4dE1lc3NhZ2UgfCB1bmRlZmluZWQgPSBidWlsZENvbnRleHRNZXNzYWdlKGVmZmVjdGl2ZU1lbnRpb25zKVxuICAgICAgY29uc3QgcGF5bG9hZEZ1YUlkID0gZnVhSWQgPz8gb3B0aW9ucy5mdWFJZFxuICAgICAgY29uc3QgcGF5bG9hZFNjSWQgPSBzY0lkID8/IG9wdGlvbnMuc2NJZFxuICAgICAgY29uc3QgcGF5bG9hZENvbnRleHREYXRhID0gb3B0aW9ucy5jb250ZXh0RGF0YVxuICAgICAgY29uc3QgZGlzcGxheU1lc3NhZ2UgPSBmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5KG1lc3NhZ2UsIHtcbiAgICAgICAgZnVhSWQ6IHBheWxvYWRGdWFJZCxcbiAgICAgICAgc2NJZDogcGF5bG9hZFNjSWQsXG4gICAgICB9KVxuXG4gICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIHNldEFjdGl2ZUNoYXRJZChjdXJyZW50Q2hhdElkLmN1cnJlbnQpXG4gICAgICBjb25zdCBuZXdNZXNzYWdlSWQgPSB1dWlkdjQoKVxuICAgICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gbmV3TWVzc2FnZUlkXG4gICAgICBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQgPSBtZXNzYWdlXG5cbiAgICAgIGlmICghcmVwb3J0ZWRFdmVudC5jdXJyZW50KSB7XG4gICAgICAgIGV2ZW50KEVWRU5UUy5wbUFpVHlwZWRUZXh0KVxuICAgICAgICByZXBvcnRlZEV2ZW50LmN1cnJlbnQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmaWNhciBzaSBlbCBjb250ZXh0byBnbG9iYWwgZXN0w6EgZGVzYWN0dWFsaXphZG9cbiAgICAgIGNvbnN0IGxhc3RNZXNzYWdlV2l0aFByb2plY3QgPSBtZXNzYWdlc1JlZi5jdXJyZW50LmZpbHRlcihtc2cgPT4gbXNnLnByb2plY3RJZCkuYXQoLTEpXG5cbiAgICAgIGNvbnN0IGN1cnJlbnRBZ2VudEZyb21NZXNzYWdlcyA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQ/LlttZXNzYWdlc1JlZi5jdXJyZW50Lmxlbmd0aCAtIDFdPy5hZ2VudElkXG5cbiAgICAgIGNvbnN0IHNlc3Npb25JZCA9IGN1cnJlbnRDaGF0SWQuY3VycmVudFxuICAgICAgY29uc3Qge1xuICAgICAgICBjaGlwc1Byb2plY3Q6IGN0eENoaXBzUHJvamVjdCxcbiAgICAgICAgcHJvamVjdDogY3R4UHJvamVjdCxcbiAgICAgICAgY2xpZW50OiBjdHhDbGllbnQsXG4gICAgICAgIHRhc2s6IGN0eFRhc2ssXG4gICAgICB9ID0gY29udGV4dFJlZi5jdXJyZW50XG5cbiAgICAgIGVuc3VyZVNlc3Npb25JblNpZGViYXIoe1xuICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgIHRpdGxlOiBidWlsZFNpZGViYXJTZXNzaW9uVGl0bGUoZGlzcGxheU1lc3NhZ2UpLFxuICAgICAgICBhZ2VudCxcbiAgICAgICAgYWdlbnRJZDogY3VycmVudEFnZW50RnJvbU1lc3NhZ2VzIHx8IGFnZW50Py5pZCxcbiAgICAgICAgcHJvamVjdDogY3R4UHJvamVjdCxcbiAgICAgICAgY2xpZW50OiBjdHhDbGllbnQsXG4gICAgICAgIGF0dGFjaG1lbnRzLFxuICAgICAgfSlcblxuICAgICAgLy8gTm8gYWdyZWdhciBwcm9qZWN0SWQgYWwgbWVuc2FqZSBkZWwgdXN1YXJpbyAtIHNlIGRldGVybWluYXLDoSBkZXNwdcOpc1xuICAgICAgY29tbWl0VG9TZXNzaW9uKHNlc3Npb25JZCwge1xuICAgICAgICBpZDogYHF1ZXN0aW9uLSR7Y3VycmVudE1lc3NhZ2VJZC5jdXJyZW50fWAsXG4gICAgICAgIG1lc3NhZ2U6IGRpc3BsYXlNZXNzYWdlLFxuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB1c2VyOiBjdXJyZW50VXNlcixcbiAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLlVTRVIsXG4gICAgICAgIHNvdXJjZXM6IGF0dGFjaG1lbnRzLFxuICAgICAgICAuLi4oY29udGV4dE1lc3NhZ2UgPyB7IGNvbnRleHRNZXNzYWdlIH0gOiB7fSksXG4gICAgICB9KVxuXG4gICAgICBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQgPSB1dWlkdjQoKVxuXG4gICAgICBjb25zdCBzdHJlYW1pbmdQbGFjZWhvbGRlcklkID0gYGFuc3dlci0ke2N1cnJlbnRNZXNzYWdlSWQuY3VycmVudH0tc3RyZWFtaW5nYFxuICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFxuICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBzZXNzaW9uSWRcbiAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnN0YXJ0KHNlc3Npb25JZCwgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZClcbiAgICAgIGNvbW1pdFRvU2Vzc2lvbihzZXNzaW9uSWQsIHtcbiAgICAgICAgaWQ6IHN0cmVhbWluZ1BsYWNlaG9sZGVySWQsXG4gICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogYWdlbnQ/Lm5hbWUgfHwgJ0Fzc2lzdGFudCcgfSxcbiAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgIH0pXG5cbiAgICAgIGxldCBmaW5hbE1lc3NhZ2UgPSBtZXNzYWdlXG5cbiAgICAgIGlmIChtZXNzYWdlID09PSB0KCdxYS5pdGVtcy5yZW50YWJpbGlkYWRfcHJveWVjdG8nKSkge1xuICAgICAgICBmaW5hbE1lc3NhZ2UgPSBgRkFROiAke3QoJ3FhLml0ZW1zLnJlbnRhYmlsaWRhZF9wcm95ZWN0bycpfSAtIFRpcG8gZGUgcmVudGFiaWxpZGFkOiAke1xuICAgICAgICAgIG9wdGlvbnMucHJvamVjdENoYW5nZWQ/LmluY29tZVR5cGUgfHwgY29udGV4dFJlZi5jdXJyZW50LnByb2plY3Q/LmluY29tZVR5cGVcbiAgICAgICAgfWBcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGlzdG9yeSA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQubWFwKGhpc3RvcnlNZXNzYWdlID0+ICh7XG4gICAgICAgIGNvbnRlbnQ6IGhpc3RvcnlNZXNzYWdlLm1lc3NhZ2UsXG4gICAgICAgIHJvbGU6IGhpc3RvcnlNZXNzYWdlLnVzZXIuaWQgPT09IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCkgPyBDaGF0SGlzdG9yeVJvbGUuVVNFUiA6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICB9KSlcblxuICAgICAgY29uc3QgbGFzdE1lc3NhZ2VQcm9qZWN0SWQgPSBsYXN0TWVzc2FnZVdpdGhQcm9qZWN0Py5wcm9qZWN0SWRcbiAgICAgIGNvbnN0IHByb2plY3RUb1JlcXVlc3QgPSByZXNvbHZlUHJvamVjdFRvUmVxdWVzdChjdHhDaGlwc1Byb2plY3QsIGxhc3RNZXNzYWdlUHJvamVjdElkKVxuXG4gICAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZldGNoUHJvamVjdHMoW3Byb2plY3RUb1JlcXVlc3RdKVxuXG4gICAgICBjb25zdCBwYXlsb2FkRmFxSWQgPSBmYXFJZCA/PyBvcHRpb25zLmZhcUlkXG4gICAgICBjb25zdCBwYXlsb2FkQWdlbnRTdWdnZXN0aW9uSWQgPSBhZ2VudFN1Z2dlc3Rpb25JZCA/PyBvcHRpb25zLmFnZW50U3VnZ2VzdGlvbklkXG5cbiAgICAgIGNvbnN0IHBheWxvYWREYXRhID0ge1xuICAgICAgICBtZXNzYWdlOiBmaW5hbE1lc3NhZ2UsXG4gICAgICAgIGhpc3RvcnksXG4gICAgICAgIHByb2plY3RJZDogcHJvamVjdFRvUmVxdWVzdCxcbiAgICAgICAgbGFuZzogYXV0aFVzZXIubGFuZyxcbiAgICAgICAgdXNlcklkOiBhdXRoVXNlci5pZC50b1N0cmluZygpLFxuICAgICAgICBmaXJzdE5hbWU6IGF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgICAgICAgbGFzdE5hbWU6IGF1dGhVc2VyLmxhc3ROYW1lLFxuICAgICAgICBjb21wYW55SWQ6IGF1dGhVc2VyLmNvbXBhbnlfaWQudG9TdHJpbmcoKSxcbiAgICAgICAgY2hhdElkOiBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgICAgIG1lc3NhZ2VJZDogY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50LFxuICAgICAgICBhZ2VudE5hbWU6IGFnZW50Py5uYW1lIHx8ICcnLFxuICAgICAgICBhZ2VudElkOiBjdXJyZW50QWdlbnRGcm9tTWVzc2FnZXMgfHwgYWdlbnQ/LmlkISxcbiAgICAgICAgaXNXZWJTZWFyY2hBY3RpdmU6IGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgIGlzRGVlcFNlYXJjaEFjdGl2ZTogaXNEZWVwU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgIC4uLihjdHhQcm9qZWN0Py5mZWVJZCAhPSBudWxsID8geyBmZWVJZDogTnVtYmVyKGN0eFByb2plY3QuZmVlSWQpIH0gOiB7fSksXG4gICAgICAgIC4uLnJlc29sdmVDbGllbnRQYXlsb2FkKGN0eENsaWVudCwgY3R4UHJvamVjdCksXG4gICAgICAgIC4uLihwcm9qZWN0cz8ubGVuZ3RoID8geyBwcm9qZWN0TmFtZTogcHJvamVjdHNbMF0ubmFtZSB9IDoge30pLFxuICAgICAgICAuLi4oY3R4VGFzaz8uaWQgIT0gbnVsbFxuICAgICAgICAgID8geyB0YXNrSWQ6IE51bWJlcihjdHhUYXNrLmlkKSwgLi4uKGN0eFRhc2submFtZSA/IHsgdGFza05hbWU6IGN0eFRhc2submFtZSB9IDoge30pIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKGF0dGFjaG1lbnRzLmxlbmd0aCA+IDAgPyB7IGF0dGFjaG1lbnRzIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkRmFxSWQgPyB7IGZhcUlkOiBwYXlsb2FkRmFxSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWRBZ2VudFN1Z2dlc3Rpb25JZCA/IHsgYWdlbnRTdWdnZXN0aW9uSWQ6IHBheWxvYWRBZ2VudFN1Z2dlc3Rpb25JZCB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZEZ1YUlkID8geyBmdWFJZDogcGF5bG9hZEZ1YUlkIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkU2NJZCA/IHsgc2NJZDogcGF5bG9hZFNjSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50Py5lbnRpdHkgIT0gbnVsbCA/IHsgYWdlbnRFbnRpdHk6IGFnZW50LmVudGl0eSB9IDoge30pLFxuICAgICAgICAuLi4oYWdlbnQ/LnR5cGUgIT0gbnVsbCA/IHsgYWdlbnRUeXBlOiBhZ2VudC50eXBlIH0gOiB7fSksXG4gICAgICAgIC4uLihhZ2VudD8uZW1vamkgIT0gbnVsbCA/IHsgYWdlbnRFbW9qaTogYWdlbnQuZW1vamkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGNvbnRleHRNZXNzYWdlID8geyBjb250ZXh0TWVzc2FnZSB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZENvbnRleHREYXRhID8geyBjb250ZXh0RGF0YTogcGF5bG9hZENvbnRleHREYXRhIH0gOiB7fSksXG4gICAgICB9XG5cbiAgICAgIGFza01haWEocGF5bG9hZERhdGEpXG4gICAgfSxcbiAgICBbXG4gICAgICBhZGRNZXNzYWdlLFxuICAgICAgY29tbWl0VG9TZXNzaW9uLFxuICAgICAgZXZlbnQsXG4gICAgICBhc2tNYWlhLFxuICAgICAgcHJvamVjdCxcbiAgICAgIGNsaWVudCxcbiAgICAgIHRhc2ssXG4gICAgICBjaGlwc1Byb2plY3QsXG4gICAgICBhdXRoVXNlcixcbiAgICAgIGFnZW50LFxuICAgICAgdCxcbiAgICAgIHdhaXRpbmdSZXNwb25zZSxcbiAgICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlLFxuICAgIF1cbiAgKVxuXG4gIGNvbnN0IGNoYW5nZVByb2plY3QgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBQcm9qZWN0KSA9PiB7XG4gICAgICBpZiAoIWN1cnJlbnRVc2VyUXVlc3Rpb24uY3VycmVudCkgcmV0dXJuXG5cbiAgICAgIGlmIChvcHRpb24uaWQgIT09IHByb2plY3Q/LmlkKSB7XG4gICAgICAgIHNldFByb2plY3Qob3B0aW9uKVxuICAgICAgfVxuXG4gICAgICBpZiAocHJvamVjdCAmJiBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQpIHtcbiAgICAgICAgY29uc3QgaGlzdG9yeSA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQubWFwKGhpc3RvcnlNZXNzYWdlID0+ICh7XG4gICAgICAgICAgY29udGVudDogaGlzdG9yeU1lc3NhZ2UubWVzc2FnZSxcbiAgICAgICAgICByb2xlOiBoaXN0b3J5TWVzc2FnZS51c2VyLmlkID09PSBhdXRoVXNlci5pZC50b1N0cmluZygpID8gQ2hhdEhpc3RvcnlSb2xlLlVTRVIgOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgICB9KSlcblxuICAgICAgICBhc2tNYWlhKHtcbiAgICAgICAgICBtZXNzYWdlOiBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQsXG4gICAgICAgICAgaGlzdG9yeSxcbiAgICAgICAgICBwcm9qZWN0SWQ6IG9wdGlvbi5pZCxcbiAgICAgICAgICBsYW5nOiBhdXRoVXNlci5sYW5nLFxuICAgICAgICAgIHVzZXJJZDogYXV0aFVzZXIuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgICBmaXJzdE5hbWU6IGF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgICAgICAgICBsYXN0TmFtZTogYXV0aFVzZXIubGFzdE5hbWUsXG4gICAgICAgICAgY29tcGFueUlkOiBhdXRoVXNlci5jb21wYW55X2lkLnRvU3RyaW5nKCksXG4gICAgICAgICAgY2hhdElkOiBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgICAgICAgbWVzc2FnZUlkOiBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQsXG4gICAgICAgICAgYWdlbnROYW1lOiBhZ2VudD8ubmFtZSB8fCAnJyxcbiAgICAgICAgICBhZ2VudElkOiBhZ2VudD8uaWQgfHwgJycsXG4gICAgICAgICAgaXNXZWJTZWFyY2hBY3RpdmU6IGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlOiBpc0RlZXBTZWFyY2hBY3RpdmVSZWYuY3VycmVudCxcbiAgICAgICAgICAuLi4ob3B0aW9uPy5mZWVJZCAhPSBudWxsID8geyBmZWVJZDogTnVtYmVyKG9wdGlvbi5mZWVJZCkgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ob3B0aW9uPy5jbGllbnRJZCAhPSBudWxsID8geyBjbGllbnRJZDogTnVtYmVyKG9wdGlvbi5jbGllbnRJZCkgfSA6IHt9KSxcbiAgICAgICAgICAuLi4oYWdlbnQ/LmVudGl0eSAhPSBudWxsID8geyBhZ2VudEVudGl0eTogYWdlbnQuZW50aXR5IH0gOiB7fSksXG4gICAgICAgICAgLi4uKGFnZW50Py50eXBlICE9IG51bGwgPyB7IGFnZW50VHlwZTogYWdlbnQudHlwZSB9IDoge30pLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sXG4gICAgW3Byb2plY3QsIHNldFByb2plY3QsIGFza01haWEsIGF1dGhVc2VyLCBpc1dlYlNlYXJjaEFjdGl2ZSwgYWdlbnRdXG4gIClcblxuICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKGFzeW5jIChmZWVkYmFja1Byb3A6IEZlZWRiYWNrLCBjaGF0TWVzc2FnZUlkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1haWEuQ2hhdHMud2FzSGVscGZ1bENoYXQoY2hhdE1lc3NhZ2VJZCwgZmVlZGJhY2tQcm9wID09PSBGZWVkYmFjay5USFVNQlNfVVApXG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICBtZXNzYWdlc1JlZi5jdXJyZW50ID0gbWVzc2FnZXNSZWYuY3VycmVudC5tYXAobWVzc2FnZSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlLmlkID09PSBjaGF0TWVzc2FnZUlkICYmIG1lc3NhZ2Uucm9sZSA9PT0gJ2Fzc2lzdGFudCcpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5tZXNzYWdlLCB3YXNIZWxwZnVsOiBmZWVkYmFja1Byb3AgPT09IEZlZWRiYWNrLlRIVU1CU19VUCB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VcbiAgICAgIH0pXG4gICAgfVxuICB9LCBbXSlcblxuICBjb25zdCBoYW5kbGVBcHByb3ZhbERlY2lzaW9uID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKFxuICAgICAgdGhyZWFkSWRzOiBzdHJpbmdbXSxcbiAgICAgIGRlY2lzaW9uOiAnYXBwcm92ZScgfCAncmVqZWN0JyxcbiAgICAgIGVkaXRlZEFjdGlvbnM/OiBBcnJheTx7IHRvb2xfbmFtZTogc3RyaW5nOyBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PlxuICAgICkgPT4ge1xuICAgICAgaWYgKCF0aHJlYWRJZHM/Lmxlbmd0aCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyB0aHJlYWRfaWRzIHByb3ZpZGVkIGZvciBhcHByb3ZhbCBkZWNpc2lvbicpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3VuZCA9IGZpbmRNZXNzYWdlV2l0aEFwcHJvdmFsQnlUaHJlYWRJZHModGhyZWFkSWRzLCBtZXNzYWdlc1JlZi5jdXJyZW50KVxuICAgICAgaWYgKCFmb3VuZD8ubWVzc2FnZS5hcHByb3ZhbCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyBzZSBlbmNvbnRyw7MgbWVuc2FqZSBjb24gYXBwcm92YWwgcGFyYSB0aHJlYWRfaWRzOicsIHRocmVhZElkcylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgbWVzc2FnZTogbWVzc2FnZVdpdGhBcHByb3ZhbCwgc2Vzc2lvbklkOiBmb3VuZFNlc3Npb25JZCB9ID0gZm91bmRcbiAgICAgIGNvbnN0IHsgYXBwcm92YWwgfSA9IG1lc3NhZ2VXaXRoQXBwcm92YWxcbiAgICAgIGlmICghYXBwcm92YWwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlc3Npb25JZCA9IGFwcHJvdmFsLnNlc3Npb25faWQgfHwgZm91bmRTZXNzaW9uSWRcbiAgICAgIGlmICghc2Vzc2lvbklkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHNlc3Npb25faWQgZGlzcG9uaWJsZSBwYXJhIGFwcHJvdmFsOicsIHRocmVhZElkcylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChzZXNzaW9uU3RyZWFtTWFuYWdlci5pc0FjdGl2ZShzZXNzaW9uSWQpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoc2Vzc2lvblN0cmVhbU1hbmFnZXIuZ2V0QWN0aXZlQ291bnQoKSA+PSBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TKSB7XG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdzbmFja2Jhci1ldmVudCcsIHtcbiAgICAgICAgICAgIGRldGFpbDogeyBzaG93OiB0cnVlLCBzZXZlcml0eTogJ2luZm8nLCBtZXNzYWdlOiB0KCdjaGF0LnRvb01hbnlBY3RpdmVTZXNzaW9ucycpIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVzc2FnZUlkID0gbWVzc2FnZVdpdGhBcHByb3ZhbC5pZFxuICAgICAgY29uc3QgbmV3U3RhdHVzID0gZGVjaXNpb24gPT09ICdhcHByb3ZlJyA/ICdhcHByb3ZlZCcgOiAncmVqZWN0ZWQnXG4gICAgICBjb25zdCBoaXRsQ29udGV4dDogSGl0bEV4ZWN1dGlvbkNvbnRleHQgPSB7XG4gICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgbWVzc2FnZVRleHQ6IG1lc3NhZ2VXaXRoQXBwcm92YWwubWVzc2FnZSxcbiAgICAgICAgYXBwcm92YWwsXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zOiBhcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnMsXG4gICAgICAgIHRocmVhZElkcyxcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNBY3RpdmVTZXNzaW9uID0gYWN0aXZlVmlldy5pcyhzZXNzaW9uSWQpXG4gICAgICBpZiAoaXNBY3RpdmVTZXNzaW9uKSB7XG4gICAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBoaXRsQ29udGV4dFxuICAgICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgY29tbWl0VG9TZXNzaW9uKHNlc3Npb25JZCwgeyAuLi5tZXNzYWdlV2l0aEFwcHJvdmFsLCBhcHByb3ZhbFN0YXR1czogbmV3U3RhdHVzIH0pXG5cbiAgICAgIGNvbnN0IHN0cmVhbU1lc3NhZ2VJZCA9IHV1aWR2NCgpXG4gICAgICBpZiAoaXNBY3RpdmVTZXNzaW9uKSB7XG4gICAgICAgIGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCA9IHN0cmVhbU1lc3NhZ2VJZFxuICAgICAgfVxuXG4gICAgICBjb25zdCBoaXRsQ3R4OiBTdHJlYW1Db250ZXh0ID0ge1xuICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgIG1lc3NhZ2VJZDogc3RyZWFtTWVzc2FnZUlkLFxuICAgICAgICBwbGFjZWhvbGRlcklkOiBgYW5zd2VyLSR7c3RyZWFtTWVzc2FnZUlkfS1zdHJlYW1pbmdgLFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxlYXNlQWN0aXZlUHJvY2Vzc2luZyA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFpc0FjdGl2ZVNlc3Npb24pIHJldHVyblxuICAgICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlc3Npb25TdHJlYW1NYW5hZ2VyLnN0YXJ0Q29udGludWVTdHJlYW0oe1xuICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgIHBsYWNlaG9sZGVySWQ6IGhpdGxDdHgucGxhY2Vob2xkZXJJZCxcbiAgICAgICAgY29udGludWVSZXF1ZXN0OiB7XG4gICAgICAgICAgdGhyZWFkSWRzLFxuICAgICAgICAgIHNlc3Npb25JZDogYXBwcm92YWwuc2Vzc2lvbl9pZCxcbiAgICAgICAgICBkZWNpc2lvbjogZWRpdGVkQWN0aW9ucyA/ICdlZGl0JyA6IGRlY2lzaW9uLFxuICAgICAgICAgIGVkaXRlZEFjdGlvbnMsXG4gICAgICAgICAgYWdlbnRJZDogYWdlbnQ/LmlkIHx8ICcnLFxuICAgICAgICAgIGxhbmc6IGF1dGhVc2VyLmxhbmcsXG4gICAgICAgIH0sXG4gICAgICAgIHQsXG4gICAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0OiBoaXRsQ29udGV4dCxcbiAgICAgICAgYWdlbnRJZDogYWdlbnQ/LmlkLFxuICAgICAgICBhZ2VudE5hbWU6IGFnZW50Py5uYW1lLFxuICAgICAgICBjYWxsYmFja3M6IHtcbiAgICAgICAgICBvblN0cmVhbVVwZGF0ZTogY29udGVudCA9PiBoYW5kbGVTdHJlYW1VcGRhdGUoaGl0bEN0eCwgY29udGVudCksXG4gICAgICAgICAgb25GaW5pc2hTdHJlYW06IGZpbmlzaFBheWxvYWQgPT4ge1xuICAgICAgICAgICAgcmVsZWFzZUFjdGl2ZVByb2Nlc3NpbmcoKVxuICAgICAgICAgICAgaGFuZGxlU3RyZWFtRmluaXNoKFxuICAgICAgICAgICAgICBoaXRsQ3R4LFxuICAgICAgICAgICAgICBmaW5pc2hQYXlsb2FkLmNvbnRlbnQsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuc291cmNlcyxcbiAgICAgICAgICAgICAgZmluaXNoUGF5bG9hZC5tZW1vcnlTZXNzaW9uSWQsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuYXR0YWNobWVudHMsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuc3VnZ2VzdGlvbnMsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuY29tcGxldGVkQWdlbnRJZFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgcmVsZWFzZUFjdGl2ZVByb2Nlc3NpbmcoKVxuICAgICAgICAgICAgaGFuZGxlU3RyZWFtRXJyb3IoaGl0bEN0eClcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQXBwcm92YWxSZXF1aXJlZDogKGFwcHJvdmFsUGF5bG9hZCwgYWNjdW11bGF0ZWRDb250ZW50KSA9PiB7XG4gICAgICAgICAgICByZWxlYXNlQWN0aXZlUHJvY2Vzc2luZygpXG4gICAgICAgICAgICBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkKGhpdGxDdHgsIGFwcHJvdmFsUGF5bG9hZCwgYWNjdW11bGF0ZWRDb250ZW50KVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KVxuXG4gICAgICBpZiAoIXJlc3VsdC5zdGFydGVkKSB7XG4gICAgICAgIHJlbGVhc2VBY3RpdmVQcm9jZXNzaW5nKClcbiAgICAgICAgaWYgKHJlc3VsdC5yZWFzb24gPT09ICdsaW1pdCcpIHtcbiAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdzbmFja2Jhci1ldmVudCcsIHtcbiAgICAgICAgICAgICAgZGV0YWlsOiB7IHNob3c6IHRydWUsIHNldmVyaXR5OiAnaW5mbycsIG1lc3NhZ2U6IHQoJ2NoYXQudG9vTWFueUFjdGl2ZVNlc3Npb25zJykgfSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBhdXRoVXNlcixcbiAgICAgIGFnZW50LFxuICAgICAgY29tbWl0VG9TZXNzaW9uLFxuICAgICAgaGFuZGxlU3RyZWFtRXJyb3IsXG4gICAgICBoYW5kbGVTdHJlYW1VcGRhdGUsXG4gICAgICBoYW5kbGVTdHJlYW1GaW5pc2gsXG4gICAgICBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkLFxuICAgICAgdCxcbiAgICBdXG4gIClcblxuICBjb25zdCBpbml0aWFsaXplQ2hhdCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWZpcnN0VGltZVJlZi5jdXJyZW50KSB7XG4gICAgICBmaXJzdFRpbWVSZWYuY3VycmVudCA9IHRydWVcbiAgICB9XG4gICAgaWYgKGluaXRpYWxDaGF0SWQpIHtcbiAgICAgIGF3YWl0IGxvYWRNZXNzYWdlcygpXG4gICAgfSBlbHNlIGlmICh1c2VySW5pdGlhbE1lc3NhZ2UpIHtcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxNZXNzYWdlID0gQm9vbGVhbih1c2VySW5pdGlhbE1lc3NhZ2UubWVzc2FnZT8udHJpbSgpKVxuICAgICAgY29uc3QgaGFzSW5pdGlhbEF0dGFjaG1lbnRzID0gQm9vbGVhbih1c2VySW5pdGlhbE1lc3NhZ2UuYXR0YWNobWVudHM/Lmxlbmd0aClcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxGYXEgPSBCb29sZWFuKHVzZXJJbml0aWFsTWVzc2FnZS5mYXFJZClcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxGdWEgPSBCb29sZWFuKHVzZXJJbml0aWFsTWVzc2FnZS5mdWFJZClcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxTYyA9IEJvb2xlYW4odXNlckluaXRpYWxNZXNzYWdlLnNjSWQpXG5cbiAgICAgIGlmICghaGFzSW5pdGlhbE1lc3NhZ2UgJiYgIWhhc0luaXRpYWxBdHRhY2htZW50cyAmJiAhaGFzSW5pdGlhbEZhcSAmJiAhaGFzSW5pdGlhbEZ1YSAmJiAhaGFzSW5pdGlhbFNjKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBoaXN0b3J5ID0gbWVzc2FnZXNSZWYuY3VycmVudC5tYXAoaGlzdG9yeU1lc3NhZ2UgPT4gKHtcbiAgICAgICAgY29udGVudDogaGlzdG9yeU1lc3NhZ2UubWVzc2FnZSxcbiAgICAgICAgcm9sZTogaGlzdG9yeU1lc3NhZ2UudXNlci5pZCA9PT0gYXV0aFVzZXIuaWQudG9TdHJpbmcoKSA/IENoYXRIaXN0b3J5Um9sZS5VU0VSIDogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgIH0pKVxuXG4gICAgICBjb25zdCB7XG4gICAgICAgIGNoaXBzUHJvamVjdDogY3R4Q2hpcHNQcm9qZWN0LFxuICAgICAgICBwcm9qZWN0OiBjdHhQcm9qZWN0LFxuICAgICAgICBjbGllbnQ6IGN0eENsaWVudCxcbiAgICAgICAgdGFzazogY3R4VGFzayxcbiAgICAgIH0gPSBjb250ZXh0UmVmLmN1cnJlbnRcbiAgICAgIGNvbnN0IHByb2plY3RUb1JlcXVlc3QgPSByZXNvbHZlUHJvamVjdFRvUmVxdWVzdChjdHhDaGlwc1Byb2plY3QsIG51bGwpID8/IGN0eFByb2plY3Q/LmlkID8/IG51bGxcblxuICAgICAgY29uc29sZS5pbmZvKCdbdXNlQ2hhdE1hbmFnZXJdIFBBVEg9aW5pdGlhbGl6ZUNoYXQvdXNlckluaXRpYWxNZXNzYWdlIOKAlCBjb250ZXh0UmVmIHJlc29sdXRpb246Jywge1xuICAgICAgICBwcm9qZWN0UHJvcElkOiBjdHhQcm9qZWN0Py5pZCA/PyBudWxsLFxuICAgICAgICBjbGllbnRJZDogY3R4Q2xpZW50Py5pZCA/PyBudWxsLFxuICAgICAgICB0YXNrSWQ6IGN0eFRhc2s/LmlkID8/IG51bGwsXG4gICAgICAgIGNoaXBzUHJvamVjdElkOiBjdHhDaGlwc1Byb2plY3Q/LnByb2plY3RJZCA/PyBudWxsLFxuICAgICAgICBwcm9qZWN0VG9SZXF1ZXN0LFxuICAgICAgICBhZ2VudFR5cGU6IGFnZW50Py50eXBlLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgaW5pdGlhbERpc3BsYXlNZXNzYWdlID0gZm9ybWF0UXVpY2tBY3Rpb25NZXNzYWdlRm9yRGlzcGxheSh1c2VySW5pdGlhbE1lc3NhZ2UubWVzc2FnZSwge1xuICAgICAgICBmdWFJZDogdXNlckluaXRpYWxNZXNzYWdlLmZ1YUlkLFxuICAgICAgICBzY0lkOiB1c2VySW5pdGlhbE1lc3NhZ2Uuc2NJZCxcbiAgICAgIH0pXG5cbiAgICAgIGVuc3VyZVNlc3Npb25JblNpZGViYXIoe1xuICAgICAgICBzZXNzaW9uSWQ6IGN1cnJlbnRDaGF0SWQuY3VycmVudCxcbiAgICAgICAgdGl0bGU6IGJ1aWxkU2lkZWJhclNlc3Npb25UaXRsZShpbml0aWFsRGlzcGxheU1lc3NhZ2UpLFxuICAgICAgICBhZ2VudCxcbiAgICAgICAgYWdlbnRJZDogYWdlbnQ/LmlkLFxuICAgICAgICBwcm9qZWN0OiBjdHhQcm9qZWN0LFxuICAgICAgICBjbGllbnQ6IGN0eENsaWVudCxcbiAgICAgICAgYXR0YWNobWVudHM6IHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cyxcbiAgICAgIH0pXG5cbiAgICAgIGFza01haWEoe1xuICAgICAgICBtZXNzYWdlOiB1c2VySW5pdGlhbE1lc3NhZ2UubWVzc2FnZSxcbiAgICAgICAgaGlzdG9yeSxcbiAgICAgICAgcHJvamVjdElkOiBwcm9qZWN0VG9SZXF1ZXN0LFxuICAgICAgICBsYW5nOiBhdXRoVXNlci5sYW5nLFxuICAgICAgICB1c2VySWQ6IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCksXG4gICAgICAgIGZpcnN0TmFtZTogYXV0aFVzZXIuZmlyc3ROYW1lLFxuICAgICAgICBsYXN0TmFtZTogYXV0aFVzZXIubGFzdE5hbWUsXG4gICAgICAgIGNvbXBhbnlJZDogYXV0aFVzZXIuY29tcGFueV9pZC50b1N0cmluZygpLFxuICAgICAgICBjaGF0SWQ6IGN1cnJlbnRDaGF0SWQuY3VycmVudCxcbiAgICAgICAgbWVzc2FnZUlkOiBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQsXG4gICAgICAgIGFnZW50TmFtZTogYWdlbnQ/Lm5hbWUhLFxuICAgICAgICBhZ2VudElkOiBhZ2VudD8uaWQhLFxuICAgICAgICBpc1dlYlNlYXJjaEFjdGl2ZTogaXNXZWJTZWFyY2hBY3RpdmVSZWYuY3VycmVudCxcbiAgICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlOiBpc0RlZXBTZWFyY2hBY3RpdmVSZWYuY3VycmVudCxcbiAgICAgICAgLi4uKGN0eFByb2plY3Q/LmZlZUlkICE9IG51bGwgPyB7IGZlZUlkOiBOdW1iZXIoY3R4UHJvamVjdC5mZWVJZCkgfSA6IHt9KSxcbiAgICAgICAgLi4ucmVzb2x2ZUNsaWVudFBheWxvYWQoY3R4Q2xpZW50LCBjdHhQcm9qZWN0KSxcbiAgICAgICAgLi4uKGN0eFByb2plY3Q/Lm5hbWUgPyB7IHByb2plY3ROYW1lOiBjdHhQcm9qZWN0Lm5hbWUgfSA6IHt9KSxcbiAgICAgICAgLi4uKGN0eFRhc2s/LmlkICE9IG51bGxcbiAgICAgICAgICA/IHsgdGFza0lkOiBOdW1iZXIoY3R4VGFzay5pZCksIC4uLihjdHhUYXNrLm5hbWUgPyB7IHRhc2tOYW1lOiBjdHhUYXNrLm5hbWUgfSA6IHt9KSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2UuYXR0YWNobWVudHMgPyB7IGF0dGFjaG1lbnRzOiB1c2VySW5pdGlhbE1lc3NhZ2UuYXR0YWNobWVudHMgfSA6IHt9KSxcbiAgICAgICAgLi4uKHVzZXJJbml0aWFsTWVzc2FnZS5mYXFJZCA/IHsgZmFxSWQ6IHVzZXJJbml0aWFsTWVzc2FnZS5mYXFJZCB9IDoge30pLFxuICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLmFnZW50U3VnZ2VzdGlvbklkID8geyBhZ2VudFN1Z2dlc3Rpb25JZDogdXNlckluaXRpYWxNZXNzYWdlLmFnZW50U3VnZ2VzdGlvbklkIH0gOiB7fSksXG4gICAgICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2UuZnVhSWQgPyB7IGZ1YUlkOiB1c2VySW5pdGlhbE1lc3NhZ2UuZnVhSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHVzZXJJbml0aWFsTWVzc2FnZS5zY0lkID8geyBzY0lkOiB1c2VySW5pdGlhbE1lc3NhZ2Uuc2NJZCB9IDoge30pLFxuICAgICAgICAuLi4oYWdlbnQ/LmVudGl0eSAhPSBudWxsID8geyBhZ2VudEVudGl0eTogYWdlbnQuZW50aXR5IH0gOiB7fSksXG4gICAgICAgIC4uLihhZ2VudD8udHlwZSAhPSBudWxsID8geyBhZ2VudFR5cGU6IGFnZW50LnR5cGUgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50Py5lbW9qaSAhPSBudWxsID8geyBhZ2VudEVtb2ppOiBhZ2VudC5lbW9qaSB9IDoge30pLFxuICAgICAgICAuLi4oYnVpbGRDb250ZXh0TWVzc2FnZSh1c2VySW5pdGlhbE1lc3NhZ2UubWVudGlvbnMpXG4gICAgICAgICAgPyB7IGNvbnRleHRNZXNzYWdlOiBidWlsZENvbnRleHRNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZS5tZW50aW9ucykgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLmNvbnRleHREYXRhID8geyBjb250ZXh0RGF0YTogdXNlckluaXRpYWxNZXNzYWdlLmNvbnRleHREYXRhIH0gOiB7fSksXG4gICAgICB9KVxuICAgIH1cbiAgfSwgW1xuICAgIGluaXRpYWxDaGF0SWQsXG4gICAgdXNlckluaXRpYWxNZXNzYWdlLFxuICAgIHByb2plY3QsXG4gICAgY2xpZW50LFxuICAgIHRhc2ssXG4gICAgYXV0aFVzZXIsXG4gICAgYWdlbnQsXG4gICAgYXNrTWFpYSxcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICBpc0RlZXBTZWFyY2hBY3RpdmUsXG4gIF0pXG5cbiAgY29uc3QgcmVzZXRDaGF0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IHByZXZpb3VzU2Vzc2lvbklkID0gY3VycmVudENoYXRJZC5jdXJyZW50XG4gICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIocHJldmlvdXNTZXNzaW9uSWQpXG4gICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gdXVpZHY0KClcbiAgICBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQgPSBudWxsXG4gICAgY3VycmVudENoYXRJZC5jdXJyZW50ID0gdXVpZHY0KClcbiAgICBzZXRBY3RpdmVTZXNzaW9uSWQoY3VycmVudENoYXRJZC5jdXJyZW50KVxuICAgIHJlcG9ydGVkRXZlbnQuY3VycmVudCA9IGZhbHNlXG4gICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIHNldEFjdGl2ZUNoYXRJZChudWxsKVxuICB9LCBbc2V0QWN0aXZlQ2hhdElkXSlcblxuICBjb25zdCBzdG9wR2VuZXJhdGlvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzdG9wU3RyZWFtaW5nKClcbiAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gIH0sIFtzdG9wU3RyZWFtaW5nXSlcblxuICByZXR1cm4ge1xuICAgIG1lc3NhZ2VzLFxuICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICBpc0xvYWRpbmdNb3JlTWVzc2FnZXMsXG4gICAgd2FpdGluZ1Jlc3BvbnNlLFxuICAgIGlzV3JpdGluZyxcbiAgICBsb2FkaW5nTWVzc2FnZSxcbiAgICBzdHJlYW1BY3Rpdml0eSxcbiAgICBhY3RpdmVMb2FkaW5ncyxcbiAgICBjdXJyZW50UHJvamVjdCxcbiAgICBjdXJyZW50Q2hhdElkOiBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgY3VycmVudE1lc3NhZ2VJZDogY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50LFxuXG4gICAgc2VuZE1lc3NhZ2UsXG4gICAgY2hhbmdlUHJvamVjdCxcbiAgICBoYW5kbGVGZWVkYmFjayxcbiAgICBoYW5kbGVBcHByb3ZhbERlY2lzaW9uLFxuICAgIGhhbmRsZVNjcm9sbCxcbiAgICBpbml0aWFsaXplQ2hhdCxcbiAgICByZXNldENoYXQsXG4gICAgc3RvcEdlbmVyYXRpb24sXG5cbiAgICBpc0Rpc2FibGVkOiB3YWl0aW5nUmVzcG9uc2UgfHwgbG9hZGluZ01lc3NhZ2VzLFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxXQUFXLEVBQUVDLE1BQU0sRUFBRUMsU0FBUyxFQUFFQyxRQUFRLFFBQVEsT0FBTztBQUNoRSxTQUFTQyxFQUFFLElBQUlDLE1BQU0sUUFBUSxNQUFNO0FBQ25DLFNBQVNDLGVBQWUsUUFBUSxvQkFBb0I7QUFDcEQsU0FBU0MscUJBQXFCLFFBQVEsMEJBQTBCO0FBQ2hFLFNBQVNDLElBQUksUUFBUSxTQUFTO0FBRzlCLFNBQVNDLE9BQU8sUUFBaUIsd0JBQXdCO0FBQ3pELFNBQVNDLGdCQUFnQixRQUFRLDhCQUE4QjtBQUMvRCxTQUFTQyxNQUFNLEVBQUVDLFFBQVEsUUFBUSxhQUFhO0FBQzlDLE9BQU9DLElBQUksTUFBTSxxQkFBcUI7QUFDdEMsU0FBU0MsUUFBUSxRQUFRLDREQUE0RDtBQUNyRixTQUF1Q0MsZUFBZSxRQUF3QyxrQkFBa0I7QUFD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
|