@projectcor/maia-components 2.11.78-2 → 2.11.78-3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/atoms/OptionCorPermission/OptionCorPermission.js +27 -0
- package/lib/components/atoms/OptionCorPermission/OptionCorPermission.styles.js +18 -0
- package/lib/components/atoms/OptionCorPermission/index.js +2 -0
- package/lib/components/atoms/Switch/Switch.js +27 -0
- package/lib/components/atoms/Switch/Switch.styles.js +22 -0
- package/lib/components/atoms/Switch/index.js +2 -0
- package/lib/components/atoms/icons/CorAccessIcon.js +41 -0
- package/lib/components/atoms/icons/index.js +2 -1
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +71 -43
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.styles.js +23 -7
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +7 -46
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +5 -4
- package/lib/components/molecules/ChatFooter/ChatFooter.js +18 -6
- package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.js +32 -0
- package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.styles.js +14 -0
- package/lib/components/molecules/ChatFooter/styles.js +5 -1
- package/lib/components/molecules/Sidebar/Sidebar.js +42 -51
- package/lib/components/molecules/Sidebar/Sidebar.styles.js +6 -10
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +16 -12
- package/lib/components/organisms/ChatAI/ChatAI.js +2 -10
- package/lib/hooks/useAgentModel/useCreateAgent.js +36 -13
- package/lib/hooks/useAgentModel/useUpdateAgent.js +34 -10
- package/lib/hooks/useChatManager/useChatManager.js +431 -456
- package/lib/hooks/useChatMessages/useChatMessages.js +249 -411
- package/lib/hooks/useChats/useChats.js +3 -8
- package/lib/hooks/useMentionAllowedTypes.js +12 -11
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +1 -1
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +518 -140
- package/lib/hooks/useStreamingMessage/index.js +3 -2
- package/lib/hooks/useStreamingMessage/streamingStore.js +69 -0
- package/lib/hooks/useStreamingMessage/useStreamingMessage.js +17 -13
- package/lib/lang/br/index.js +17 -16
- package/lib/lang/en/index.js +15 -14
- package/lib/lang/es/index.js +15 -14
- package/lib/lang/fr/index.js +19 -19
- package/lib/services/maia/Agents/getAgentById.js +4 -2
- package/lib/services/maia/Agents/setAgentToolGroups.js +42 -0
- package/lib/store/chatsStore.types.js +1 -1
- package/lib/store/useChatsStore.js +9 -41
- package/lib/types/agentModal.js +1 -1
- package/lib/utils/corConnectorMentionTypes.js +10 -6
- package/lib/utils/normalizeAgentConnectors.js +39 -1
- package/package.json +1 -1
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.js +0 -17
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.styles.js +0 -15
- package/lib/components/atoms/SessionGeneratingDot/index.js +0 -2
- package/lib/components/atoms/SessionUnreadDot/SessionUnreadDot.js +0 -12
- package/lib/components/atoms/SessionUnreadDot/SessionUnreadDot.styles.js +0 -8
- package/lib/components/atoms/SessionUnreadDot/index.js +0 -2
- package/lib/store/chatsSidebarOptimistic.js +0 -87
- package/lib/store/sessions/activeView.js +0 -22
- package/lib/store/sessions/index.js +0 -10
- package/lib/store/sessions/sessionHitlContext.js +0 -15
- package/lib/store/sessions/sessionNotificationSound.js +0 -57
- package/lib/store/sessions/sessionNotifications.js +0 -111
- package/lib/store/sessions/sessionNotifications.types.js +0 -2
- package/lib/store/sessions/sessionStreamManager.js +0 -585
- package/lib/store/sessions/sessionStreamingText.js +0 -80
- package/lib/store/sessions/sessionUnreadPersistence.js +0 -49
- package/lib/store/sessions/sessions.types.js +0 -35
- package/lib/store/sessions/useSessionMeta.js +0 -39
- package/lib/store/sessions/useSessionStreamingText.js +0 -18
- package/lib/store/sessions/useSessionsStore.js +0 -234
|
@@ -28,13 +28,9 @@ import { useTabTaskDefault } from '../useTabTaskDefault';
|
|
|
28
28
|
import { TASK_URL_REGEX_PATTERN } from '../../constants/taskUrls';
|
|
29
29
|
import { fetchAgentDetail } from '../../services/maia/Agents/fetchAgentDetail';
|
|
30
30
|
import { buildHitlActionTypeList, getHitlAnalyticsAgentType } from '../../utils/hitlAnalytics';
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
import { sessionStreamManager, MAX_CONCURRENT_STREAMS } from '../../store/sessions/sessionStreamManager';
|
|
35
|
-
import { activeView } from '../../store/sessions/activeView';
|
|
36
|
-
import { notifySessionFinishedInBackground } from '../../store/sessions/sessionNotifications';
|
|
37
|
-
import { isStreamingPlaceholderMessageId } from '../../utils/streamActivityMessages';
|
|
31
|
+
import { getThinkingLoadingMessage, getWritingStreamActivity, resolveHitlNodeStreamActivity, resolveInitialHitlStreamActivity } from '../../utils/streamActivityMessages';
|
|
32
|
+
import { streamingStore } from '../useStreamingMessage';
|
|
33
|
+
import { isCompleteLikeSsePayload, mergeStreamChunk } from '../../utils/sseStreamContent';
|
|
38
34
|
var normalizeSendMessageArgs = function normalizeSendMessageArgs(attachmentsOrOptions) {
|
|
39
35
|
var _options$attachments;
|
|
40
36
|
if (Array.isArray(attachmentsOrOptions)) {
|
|
@@ -232,56 +228,139 @@ var useStableCallbacks = function useStableCallbacks(authUser) {
|
|
|
232
228
|
currentUser: currentUser.current
|
|
233
229
|
};
|
|
234
230
|
};
|
|
235
|
-
var
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
231
|
+
var parseSSELine = function parseSSELine(line) {
|
|
232
|
+
if (!line.trim()) return null;
|
|
233
|
+
var _line$split = line.split('\n'),
|
|
234
|
+
_line$split2 = _slicedToArray(_line$split, 2),
|
|
235
|
+
eventLine = _line$split2[0],
|
|
236
|
+
dataLine = _line$split2[1];
|
|
237
|
+
if (!eventLine || !dataLine) return null;
|
|
238
|
+
var eventType = eventLine.replace('event: ', '').trim();
|
|
239
|
+
var dataStr = dataLine.replace('data: ', '').trim();
|
|
240
|
+
try {
|
|
241
|
+
var data = JSON.parse(dataStr);
|
|
243
242
|
return {
|
|
244
|
-
|
|
245
|
-
|
|
243
|
+
eventType: eventType,
|
|
244
|
+
data: data
|
|
246
245
|
};
|
|
246
|
+
} catch (parseError) {
|
|
247
|
+
console.error('Error parsing SSE data:', parseError, dataStr);
|
|
248
|
+
return null;
|
|
247
249
|
}
|
|
248
|
-
var _useSessionsStore$get = useSessionsStore.getState(),
|
|
249
|
-
messages = _useSessionsStore$get.messages;
|
|
250
|
-
var sessionEntry = Object.entries(messages).find(function (_ref2) {
|
|
251
|
-
var _ref3 = _slicedToArray(_ref2, 2),
|
|
252
|
-
sessionMessages = _ref3[1];
|
|
253
|
-
return sessionMessages.some(function (message) {
|
|
254
|
-
var _message$approval2;
|
|
255
|
-
return (_message$approval2 = message.approval) === null || _message$approval2 === void 0 || (_message$approval2 = _message$approval2.pending_actions) === null || _message$approval2 === void 0 ? void 0 : _message$approval2.some(function (action) {
|
|
256
|
-
return threadIds.includes(action.thread_id);
|
|
257
|
-
});
|
|
258
|
-
});
|
|
259
|
-
});
|
|
260
|
-
if (sessionEntry) {
|
|
261
|
-
var _sessionEntry = _slicedToArray(sessionEntry, 2),
|
|
262
|
-
sessionId = _sessionEntry[0],
|
|
263
|
-
sessionMessages = _sessionEntry[1];
|
|
264
|
-
var found = sessionMessages.find(function (message) {
|
|
265
|
-
var _message$approval3;
|
|
266
|
-
return (_message$approval3 = message.approval) === null || _message$approval3 === void 0 || (_message$approval3 = _message$approval3.pending_actions) === null || _message$approval3 === void 0 ? void 0 : _message$approval3.some(function (action) {
|
|
267
|
-
return threadIds.includes(action.thread_id);
|
|
268
|
-
});
|
|
269
|
-
});
|
|
270
|
-
if (found !== null && found !== void 0 && found.approval) {
|
|
271
|
-
return {
|
|
272
|
-
message: found,
|
|
273
|
-
sessionId: found.approval.session_id || sessionId
|
|
274
|
-
};
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
return null;
|
|
278
250
|
};
|
|
279
|
-
|
|
280
|
-
var
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
251
|
+
var processSSEStream = /*#__PURE__*/function () {
|
|
252
|
+
var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(response, threadId, callbacks) {
|
|
253
|
+
var _response$body;
|
|
254
|
+
var reader, decoder, buffer, accumulatedContent, streamSettled, notifyComplete, handleLine, isReaderDone, _yield$reader$read, done, value, lines, i;
|
|
255
|
+
return _regeneratorRuntime.wrap(function (_context) {
|
|
256
|
+
while (1) switch (_context.prev = _context.next) {
|
|
257
|
+
case 0:
|
|
258
|
+
handleLine = function _handleLine(line) {
|
|
259
|
+
var parsed = parseSSELine(line);
|
|
260
|
+
if (!parsed) return;
|
|
261
|
+
var eventType = parsed.eventType,
|
|
262
|
+
data = parsed.data;
|
|
263
|
+
var eventData = data;
|
|
264
|
+
if (streamSettled && eventType !== 'error') return;
|
|
265
|
+
if (eventType === 'thinking') {
|
|
266
|
+
callbacks.onThinking();
|
|
267
|
+
} else if (eventType === 'token') {
|
|
268
|
+
var content = typeof eventData.content === 'string' ? eventData.content : '';
|
|
269
|
+
accumulatedContent = mergeStreamChunk(accumulatedContent, content);
|
|
270
|
+
callbacks.onToken(accumulatedContent);
|
|
271
|
+
} else if (eventType === 'content') {
|
|
272
|
+
var _content = typeof eventData.content === 'string' ? eventData.content : '';
|
|
273
|
+
accumulatedContent = mergeStreamChunk(accumulatedContent, _content);
|
|
274
|
+
callbacks.onToken(accumulatedContent);
|
|
275
|
+
if (isCompleteLikeSsePayload(eventData)) {
|
|
276
|
+
notifyComplete(eventData, _content || accumulatedContent);
|
|
277
|
+
}
|
|
278
|
+
} else if (eventType === 'node') {
|
|
279
|
+
if (eventData.message && typeof eventData.message === 'string') {
|
|
280
|
+
callbacks.onNode(eventData.message, threadId);
|
|
281
|
+
}
|
|
282
|
+
} else if (eventType === 'complete') {
|
|
283
|
+
var finalContent = eventData.content || accumulatedContent;
|
|
284
|
+
notifyComplete(eventData, finalContent);
|
|
285
|
+
} else if (eventType === 'approval_required') {
|
|
286
|
+
var _callbacks$onApproval;
|
|
287
|
+
if (!streamSettled) {
|
|
288
|
+
streamSettled = true;
|
|
289
|
+
}
|
|
290
|
+
(_callbacks$onApproval = callbacks.onApprovalRequired) === null || _callbacks$onApproval === void 0 || _callbacks$onApproval.call(callbacks, eventData, accumulatedContent, threadId);
|
|
291
|
+
} else if (eventType === 'error') {
|
|
292
|
+
streamSettled = true;
|
|
293
|
+
callbacks.onError(eventData.error, threadId);
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
reader = (_response$body = response.body) === null || _response$body === void 0 ? void 0 : _response$body.getReader();
|
|
297
|
+
if (reader) {
|
|
298
|
+
_context.next = 1;
|
|
299
|
+
break;
|
|
300
|
+
}
|
|
301
|
+
throw new Error('No reader available');
|
|
302
|
+
case 1:
|
|
303
|
+
decoder = new TextDecoder();
|
|
304
|
+
buffer = '';
|
|
305
|
+
accumulatedContent = '';
|
|
306
|
+
streamSettled = false;
|
|
307
|
+
notifyComplete = function notifyComplete(eventData, finalContent) {
|
|
308
|
+
var _eventData$agent_id;
|
|
309
|
+
if (streamSettled) return;
|
|
310
|
+
streamSettled = true;
|
|
311
|
+
var sources = eventData.sources || null;
|
|
312
|
+
var memorySessionId = eventData.memory_session_id || '';
|
|
313
|
+
var attachments = Array.isArray(eventData.attachments) ? eventData.attachments : null;
|
|
314
|
+
var suggestions = Array.isArray(eventData.suggest_reply) ? eventData.suggest_reply : Array.isArray(eventData.suggestions) ? eventData.suggestions : null;
|
|
315
|
+
var agentIdRaw = (_eventData$agent_id = eventData.agent_id) !== null && _eventData$agent_id !== void 0 ? _eventData$agent_id : eventData.agentId;
|
|
316
|
+
var completedAgentId = agentIdRaw != null && String(agentIdRaw).trim() !== '' ? String(agentIdRaw).trim() : null;
|
|
317
|
+
callbacks.onComplete(finalContent, sources, memorySessionId, threadId, attachments, suggestions, completedAgentId);
|
|
318
|
+
};
|
|
319
|
+
isReaderDone = false;
|
|
320
|
+
case 2:
|
|
321
|
+
if (isReaderDone) {
|
|
322
|
+
_context.next = 5;
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
325
|
+
_context.next = 3;
|
|
326
|
+
return reader.read();
|
|
327
|
+
case 3:
|
|
328
|
+
_yield$reader$read = _context.sent;
|
|
329
|
+
done = _yield$reader$read.done;
|
|
330
|
+
value = _yield$reader$read.value;
|
|
331
|
+
if (!done) {
|
|
332
|
+
_context.next = 4;
|
|
333
|
+
break;
|
|
334
|
+
}
|
|
335
|
+
isReaderDone = true;
|
|
336
|
+
return _context.abrupt("continue", 5);
|
|
337
|
+
case 4:
|
|
338
|
+
buffer += decoder.decode(value, {
|
|
339
|
+
stream: true
|
|
340
|
+
});
|
|
341
|
+
lines = buffer.split('\n\n');
|
|
342
|
+
buffer = lines.pop() || '';
|
|
343
|
+
for (i = 0; i < lines.length; i += 1) {
|
|
344
|
+
handleLine(lines[i]);
|
|
345
|
+
}
|
|
346
|
+
_context.next = 2;
|
|
347
|
+
break;
|
|
348
|
+
case 5:
|
|
349
|
+
case "end":
|
|
350
|
+
return _context.stop();
|
|
351
|
+
}
|
|
352
|
+
}, _callee);
|
|
353
|
+
}));
|
|
354
|
+
return function processSSEStream(_x, _x2, _x3) {
|
|
355
|
+
return _ref2.apply(this, arguments);
|
|
356
|
+
};
|
|
357
|
+
}();
|
|
358
|
+
export var useChatManager = function useChatManager(_ref3) {
|
|
359
|
+
var initialChatId = _ref3.chatId,
|
|
360
|
+
userInitialMessage = _ref3.userInitialMessage,
|
|
361
|
+
onError = _ref3.onError,
|
|
362
|
+
_ref3$agents = _ref3.agents,
|
|
363
|
+
agents = _ref3$agents === void 0 ? [] : _ref3$agents;
|
|
285
364
|
var _useT = useT(),
|
|
286
365
|
t = _useT.t;
|
|
287
366
|
var authUser = useUser();
|
|
@@ -340,6 +419,11 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
340
419
|
* que puedan llegar antes de que el abort se complete.
|
|
341
420
|
*/
|
|
342
421
|
var activeStreamChatIdRef = useRef(null);
|
|
422
|
+
/** Setter indirecto para abortar el stream antes de que el hook de
|
|
423
|
+
* orquestador esté inicializado (se linkea más abajo). */
|
|
424
|
+
var abortStreamSilentlyRef = useRef(function () {
|
|
425
|
+
return undefined;
|
|
426
|
+
});
|
|
343
427
|
var clearStreamUiRef = useRef(function () {
|
|
344
428
|
return undefined;
|
|
345
429
|
});
|
|
@@ -347,19 +431,10 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
347
431
|
_useState2 = _slicedToArray(_useState, 2),
|
|
348
432
|
activeLoadings = _useState2[0],
|
|
349
433
|
setActiveLoadings = _useState2[1];
|
|
350
|
-
|
|
351
|
-
* Sesión actualmente visible. Se mantiene en state (no solo en ref) para que
|
|
352
|
-
* el motor de streaming pueda leer reactivamente los flags de ESTA sesión
|
|
353
|
-
* desde el store, mientras otras siguen generando en background.
|
|
354
|
-
*/
|
|
355
|
-
var _useState3 = useState(currentChatId.current),
|
|
434
|
+
var _useState3 = useState(false),
|
|
356
435
|
_useState4 = _slicedToArray(_useState3, 2),
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
/** True mientras esta instancia esté montada (evita setState tras desmontar). */
|
|
360
|
-
var isMountedRef = useRef(true);
|
|
361
|
-
/** Evita reconciliar dos veces el mismo estado terminal de una sesión. */
|
|
362
|
-
var lastHandledTerminalRef = useRef(null);
|
|
436
|
+
isContinuingStream = _useState4[0],
|
|
437
|
+
setIsContinuingStream = _useState4[1];
|
|
363
438
|
var isWebSearchActiveRef = useRef(isWebSearchActive);
|
|
364
439
|
var isDeepSearchActiveRef = useRef(isDeepSearchActive);
|
|
365
440
|
/** Evita closures obsoletas cuando el footer conserva sendMessage entre renders. */
|
|
@@ -394,71 +469,6 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
394
469
|
removeMessage = _useChatMessages.removeMessage,
|
|
395
470
|
handleScroll = _useChatMessages.handleScroll;
|
|
396
471
|
messagesRef.current = messages;
|
|
397
|
-
|
|
398
|
-
/**
|
|
399
|
-
* Escribe un mensaje en el store por-sesión y, si la sesión es la activa,
|
|
400
|
-
* también en la vista local. Permite que sesiones en background acumulen su
|
|
401
|
-
* resultado sin pisar el chat que el usuario está mirando.
|
|
402
|
-
*/
|
|
403
|
-
var commitToSession = useCallback(function (sessionId, message) {
|
|
404
|
-
useSessionsStore.getState().addMessage(sessionId, message);
|
|
405
|
-
if (isMountedRef.current && activeView.is(sessionId)) {
|
|
406
|
-
addMessage(message);
|
|
407
|
-
}
|
|
408
|
-
}, [addMessage]);
|
|
409
|
-
var dropFromSession = useCallback(function (sessionId, messageId) {
|
|
410
|
-
useSessionsStore.getState().removeMessage(sessionId, messageId);
|
|
411
|
-
if (isMountedRef.current && activeView.is(sessionId)) {
|
|
412
|
-
removeMessage(messageId);
|
|
413
|
-
}
|
|
414
|
-
}, [removeMessage]);
|
|
415
|
-
|
|
416
|
-
/** Limpia el tail en vuelo de una sesión (tras terminar; el backend pasa a ser fuente). */
|
|
417
|
-
var clearSessionTail = useCallback(function (sessionId) {
|
|
418
|
-
useSessionsStore.getState().setMessages(sessionId, []);
|
|
419
|
-
}, []);
|
|
420
|
-
|
|
421
|
-
// Registrar la sesión visible en el tracker global para que los callbacks del
|
|
422
|
-
// motor (que pueden pertenecer a una instancia ya desmontada) sepan cuál es la
|
|
423
|
-
// sesión activa actual.
|
|
424
|
-
useEffect(function () {
|
|
425
|
-
activeView.set(activeSessionId);
|
|
426
|
-
}, [activeSessionId]);
|
|
427
|
-
useEffect(function () {
|
|
428
|
-
isMountedRef.current = true;
|
|
429
|
-
return function () {
|
|
430
|
-
isMountedRef.current = false;
|
|
431
|
-
if (activeView.is(currentChatId.current)) {
|
|
432
|
-
activeView.set(null);
|
|
433
|
-
}
|
|
434
|
-
};
|
|
435
|
-
}, []);
|
|
436
|
-
|
|
437
|
-
// Reconciliación: si la sesión activa termina (complete/error/cancelled) pero el
|
|
438
|
-
// store por-sesión todavía tiene un placeholder de streaming, refrescamos desde
|
|
439
|
-
// el backend. Usamos el store (no messagesRef): handleStreamFinish limpia el
|
|
440
|
-
// placeholder ahí de forma síncrona; messagesRef puede quedar stale un render
|
|
441
|
-
// porque setStatus (Zustand) y removeMessage (React) no batchan juntos.
|
|
442
|
-
var activeSessionMeta = useSessionMeta(activeSessionId);
|
|
443
|
-
useEffect(function () {
|
|
444
|
-
var _activeSessionMeta$fi;
|
|
445
|
-
var status = activeSessionMeta === null || activeSessionMeta === void 0 ? void 0 : activeSessionMeta.status;
|
|
446
|
-
if (!status) return;
|
|
447
|
-
var isTerminal = status === 'complete' || status === 'error' || status === 'cancelled';
|
|
448
|
-
if (!isTerminal) return;
|
|
449
|
-
var key = "".concat(activeSessionId, ":").concat(status, ":").concat((_activeSessionMeta$fi = activeSessionMeta === null || activeSessionMeta === void 0 ? void 0 : activeSessionMeta.finishedAt) !== null && _activeSessionMeta$fi !== void 0 ? _activeSessionMeta$fi : '');
|
|
450
|
-
if (lastHandledTerminalRef.current === key) return;
|
|
451
|
-
lastHandledTerminalRef.current = key;
|
|
452
|
-
var tail = useSessionsStore.getState().getMessages(activeSessionId);
|
|
453
|
-
var hasStalePlaceholder = tail.some(function (msg) {
|
|
454
|
-
return isStreamingPlaceholderMessageId(msg.id);
|
|
455
|
-
});
|
|
456
|
-
if (hasStalePlaceholder) {
|
|
457
|
-
loadMessages({
|
|
458
|
-
force: true
|
|
459
|
-
});
|
|
460
|
-
}
|
|
461
|
-
}, [activeSessionMeta === null || activeSessionMeta === void 0 ? void 0 : activeSessionMeta.status, activeSessionMeta === null || activeSessionMeta === void 0 ? void 0 : activeSessionMeta.finishedAt, activeSessionId, loadMessages]);
|
|
462
472
|
useEffect(function () {
|
|
463
473
|
var customEvent = new CustomEvent('chat-loading-messages-changed', {
|
|
464
474
|
detail: {
|
|
@@ -469,10 +479,9 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
469
479
|
}, [loadingMessages]);
|
|
470
480
|
useEffect(function () {
|
|
471
481
|
if (initialChatId && initialChatId !== currentChatId.current) {
|
|
472
|
-
//
|
|
473
|
-
//
|
|
474
|
-
|
|
475
|
-
// ESA sesión (store), no a la nueva.
|
|
482
|
+
// Si hay un stream en curso, abortarlo silenciosamente para que los
|
|
483
|
+
// tokens residuales no se escriban en el chat nuevo.
|
|
484
|
+
abortStreamSilentlyRef.current();
|
|
476
485
|
|
|
477
486
|
// Limpiar contexto global al cambiar de conversación
|
|
478
487
|
setProject(null);
|
|
@@ -480,40 +489,29 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
480
489
|
setChipsProject(null);
|
|
481
490
|
setTask(null);
|
|
482
491
|
currentChatId.current = initialChatId;
|
|
483
|
-
setActiveSessionId(initialChatId);
|
|
484
|
-
useSessionsStore.getState().markUnread(initialChatId, false);
|
|
485
492
|
currentMessageId.current = uuidv4();
|
|
486
493
|
currentUserQuestion.current = null;
|
|
487
494
|
reportedEvent.current = false;
|
|
488
|
-
|
|
489
|
-
// a la que entramos sigue generando en background, queda bloqueada; si no,
|
|
490
|
-
// se habilita el envío aunque otras sesiones sigan generando.
|
|
491
|
-
isProcessingRef.current = sessionStreamManager.isActive(initialChatId);
|
|
495
|
+
isProcessingRef.current = false;
|
|
492
496
|
streamingPlaceholderIdRef.current = null;
|
|
493
497
|
activeStreamChatIdRef.current = null;
|
|
494
|
-
|
|
495
|
-
|
|
498
|
+
streamingStore.clear();
|
|
499
|
+
loadMessages();
|
|
496
500
|
}
|
|
497
|
-
}, [initialChatId, project, setProject, setClient, setChipsProject, setTask]);
|
|
498
|
-
var handleStreamError = useCallback(function (
|
|
501
|
+
}, [initialChatId, project, setProject, setClient, setChipsProject, setTask, loadMessages]);
|
|
502
|
+
var handleStreamError = useCallback(function (errorMessage, errorRawMessage) {
|
|
499
503
|
var _errorRawMessage$matc, _errorRawMessage$matc2;
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
if (isActive) {
|
|
507
|
-
clearStreamUiRef.current();
|
|
508
|
-
streamingPlaceholderIdRef.current = null;
|
|
509
|
-
activeStreamChatIdRef.current = null;
|
|
510
|
-
isProcessingRef.current = false;
|
|
511
|
-
}
|
|
504
|
+
clearStreamUiRef.current();
|
|
505
|
+
var tempMessageId = "answer-".concat(currentMessageId.current, "-streaming");
|
|
506
|
+
streamingStore.clear();
|
|
507
|
+
streamingPlaceholderIdRef.current = null;
|
|
508
|
+
activeStreamChatIdRef.current = null;
|
|
509
|
+
removeMessage(tempMessageId);
|
|
512
510
|
var message = errorMessage === "Access denied: You don't have permission to access this agent" ? t('chat.errorAccessDenied') : errorMessage === 'invalid_request_error' && errorRawMessage !== null && errorRawMessage !== void 0 && errorRawMessage.includes('prompt is too long') ? t('chat.errorPromptTooLong', {
|
|
513
511
|
used: (_errorRawMessage$matc = (_errorRawMessage$matc2 = errorRawMessage.match(/(\d+) tokens/)) === null || _errorRawMessage$matc2 === void 0 ? void 0 : _errorRawMessage$matc2[1]) !== null && _errorRawMessage$matc !== void 0 ? _errorRawMessage$matc : ''
|
|
514
512
|
}) : t('chat.error');
|
|
515
|
-
|
|
516
|
-
id: "answer-".concat(
|
|
513
|
+
addMessage({
|
|
514
|
+
id: "answer-".concat(currentMessageId.current),
|
|
517
515
|
message: message,
|
|
518
516
|
isError: true,
|
|
519
517
|
date: new Date(),
|
|
@@ -523,84 +521,53 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
523
521
|
},
|
|
524
522
|
role: ChatHistoryRole.ASSISTANT
|
|
525
523
|
});
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
524
|
+
isProcessingRef.current = false;
|
|
525
|
+
}, [addMessage, removeMessage, t]);
|
|
526
|
+
var handleStreamUpdate = useCallback(function (content, sources, memorySessionId) {
|
|
527
|
+
// Si el chat cambió mientras el stream estaba en vuelo, descartar el
|
|
528
|
+
// token residual: no debe pintarse en el nuevo chat.
|
|
529
|
+
if (activeStreamChatIdRef.current != null && activeStreamChatIdRef.current !== currentChatId.current) {
|
|
530
|
+
return;
|
|
529
531
|
}
|
|
530
|
-
|
|
531
|
-
var handleStreamUpdate = useCallback(function (ctx, content) {
|
|
532
|
-
var sessionId = ctx.sessionId,
|
|
533
|
-
placeholderId = ctx.placeholderId;
|
|
532
|
+
var tempMessageId = "answer-".concat(currentMessageId.current, "-streaming");
|
|
534
533
|
|
|
535
|
-
//
|
|
536
|
-
// de
|
|
537
|
-
//
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
id:
|
|
534
|
+
// Primera llamada de este stream: insertamos el placeholder en el
|
|
535
|
+
// array de `messages` una única vez. Las llamadas subsiguientes ya no
|
|
536
|
+
// tocan `messages`; el texto vive en el streamingStore (externo), por
|
|
537
|
+
// lo que React no re-renderiza el árbol completo en cada token.
|
|
538
|
+
if (streamingPlaceholderIdRef.current !== tempMessageId) {
|
|
539
|
+
streamingPlaceholderIdRef.current = tempMessageId;
|
|
540
|
+
activeStreamChatIdRef.current = currentChatId.current;
|
|
541
|
+
streamingStore.start(tempMessageId);
|
|
542
|
+
addMessage({
|
|
543
|
+
id: tempMessageId,
|
|
545
544
|
message: '',
|
|
546
545
|
date: new Date(),
|
|
547
546
|
user: {
|
|
548
547
|
id: 'assistant',
|
|
549
548
|
name: 'Assistant'
|
|
550
549
|
},
|
|
551
|
-
role: ChatHistoryRole.ASSISTANT
|
|
550
|
+
role: ChatHistoryRole.ASSISTANT,
|
|
551
|
+
sources: sources,
|
|
552
|
+
memorySessionId: memorySessionId
|
|
552
553
|
});
|
|
553
554
|
}
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
activeStreamChatIdRef.current = sessionId;
|
|
557
|
-
}
|
|
558
|
-
sessionStreamingText.setText(sessionId, placeholderId, content);
|
|
559
|
-
}, [commitToSession]);
|
|
555
|
+
streamingStore.setText(tempMessageId, content);
|
|
556
|
+
}, [addMessage]);
|
|
560
557
|
var handleStreamFinish = useCallback(/*#__PURE__*/function () {
|
|
561
|
-
var
|
|
558
|
+
var _ref4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(content, sources, memorySessionId, rawAttachments, suggestions, completedAgentId) {
|
|
562
559
|
var _previousMessage$appr, _window$taskPanel, _createAgentFollowUp, _editAgentFollowUp;
|
|
563
|
-
var
|
|
564
|
-
return _regeneratorRuntime.wrap(function (
|
|
565
|
-
while (1) switch (
|
|
560
|
+
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, _manualApproval$toolA, manualPseudoAction, affectedTaskIds, _window$taskPanel2, _window$taskPanel2$re, customEvent;
|
|
561
|
+
return _regeneratorRuntime.wrap(function (_context2) {
|
|
562
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
566
563
|
case 0:
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
tempMessageId = placeholderId;
|
|
570
|
-
sessionStreamingText.clear(sessionId);
|
|
571
|
-
dropFromSession(sessionId, tempMessageId);
|
|
572
|
-
attachments = normalizeAssistantAttachments(rawAttachments); // Sesión en background: cerramos lean. El backend ya persistió la
|
|
573
|
-
// respuesta, así que al volver a la sesión se carga desde ahí. Avisamos
|
|
574
|
-
// que terminó (unread + evento para toast/sonido).
|
|
575
|
-
if (isActive) {
|
|
576
|
-
_context.next = 1;
|
|
577
|
-
break;
|
|
578
|
-
}
|
|
579
|
-
commitToSession(sessionId, _objectSpread(_objectSpread({
|
|
580
|
-
id: "answer-".concat(memorySessionId),
|
|
581
|
-
message: content,
|
|
582
|
-
date: new Date(),
|
|
583
|
-
user: {
|
|
584
|
-
id: 'assistant',
|
|
585
|
-
name: 'Assistant'
|
|
586
|
-
},
|
|
587
|
-
role: ChatHistoryRole.ASSISTANT,
|
|
588
|
-
sources: sources
|
|
589
|
-
}, attachments.length > 0 ? {
|
|
590
|
-
attachments: attachments
|
|
591
|
-
} : {}), {}, {
|
|
592
|
-
memorySessionId: memorySessionId,
|
|
593
|
-
suggestions: suggestions || []
|
|
594
|
-
}));
|
|
595
|
-
clearSessionTail(sessionId);
|
|
596
|
-
notifySessionFinishedInBackground(sessionId, 'complete');
|
|
597
|
-
return _context.abrupt("return");
|
|
598
|
-
case 1:
|
|
564
|
+
tempMessageId = "answer-".concat(currentMessageId.current, "-streaming");
|
|
565
|
+
streamingStore.clear();
|
|
599
566
|
streamingPlaceholderIdRef.current = null;
|
|
600
567
|
activeStreamChatIdRef.current = null;
|
|
601
568
|
hitlExecutionContextRef.current = null;
|
|
602
|
-
|
|
603
|
-
// Detectar todas las URLs de tareas (.../tasks/123/detail|message|messages|files|history|hours)
|
|
569
|
+
removeMessage(tempMessageId);
|
|
570
|
+
attachments = normalizeAssistantAttachments(rawAttachments); // Detectar todas las URLs de tareas (.../tasks/123/detail|message|messages|files|history|hours)
|
|
604
571
|
taskUrlRegex = new RegExp(TASK_URL_REGEX_PATTERN, 'g');
|
|
605
572
|
matches = _toConsumableArray(content.matchAll(taskUrlRegex));
|
|
606
573
|
contentToAdd = content;
|
|
@@ -668,23 +635,23 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
668
635
|
taskIdsForDashboard = taskIdsFromUrls.length > 0 ? taskIdsFromUrls : taskIdsFromDeleteApproval.length > 0 ? taskIdsFromDeleteApproval : taskIdsFromDeletionText;
|
|
669
636
|
shouldSyncDashboard = hasApprovalInPreviousMessage && (wasTaskCreation || wasTaskEdit || wasTaskDelete) && taskIdsForDashboard.length > 0;
|
|
670
637
|
if (!shouldSyncDashboard) {
|
|
671
|
-
|
|
638
|
+
_context2.next = 3;
|
|
672
639
|
break;
|
|
673
640
|
}
|
|
674
641
|
taskIds = taskIdsForDashboard;
|
|
675
642
|
if (!(matches.length > 0)) {
|
|
676
|
-
|
|
643
|
+
_context2.next = 2;
|
|
677
644
|
break;
|
|
678
645
|
}
|
|
679
|
-
|
|
646
|
+
_context2.next = 1;
|
|
680
647
|
return getTabTaskDefault(taskIds[0]);
|
|
681
|
-
case
|
|
682
|
-
tab =
|
|
648
|
+
case 1:
|
|
649
|
+
tab = _context2.sent;
|
|
683
650
|
tabSegment = tab ? "/".concat(tab) : '/detail';
|
|
684
651
|
contentToAdd = content.replace(taskUrlRegex, function (url) {
|
|
685
652
|
return url.replace(/\/(detail|message|messages|files|history|hours)(?=$|\?)/, tabSegment);
|
|
686
653
|
});
|
|
687
|
-
case
|
|
654
|
+
case 2:
|
|
688
655
|
lastProjectMessage = messagesRef.current.filter(function (msg) {
|
|
689
656
|
return msg.projectId;
|
|
690
657
|
}).at(-1);
|
|
@@ -702,7 +669,7 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
702
669
|
(_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);
|
|
703
670
|
}
|
|
704
671
|
}
|
|
705
|
-
case
|
|
672
|
+
case 3:
|
|
706
673
|
// Refetch del task panel si está abierto y la tool aprobada editó/borró esa tarea.
|
|
707
674
|
// Cubre los dos flujos de approval:
|
|
708
675
|
// 1) Approval por botón → `previousMessage.approval.pending_actions` (vía hasApprovalInPreviousMessage)
|
|
@@ -722,7 +689,7 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
722
689
|
(_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);
|
|
723
690
|
}
|
|
724
691
|
}
|
|
725
|
-
|
|
692
|
+
addMessage(_objectSpread(_objectSpread({
|
|
726
693
|
id: "answer-".concat(memorySessionId),
|
|
727
694
|
message: contentToAdd,
|
|
728
695
|
date: new Date(),
|
|
@@ -740,7 +707,6 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
740
707
|
}, createAgentFollowUp ? {
|
|
741
708
|
createAgentFollowUp: createAgentFollowUp
|
|
742
709
|
} : {}));
|
|
743
|
-
clearSessionTail(sessionId);
|
|
744
710
|
if ((_createAgentFollowUp = createAgentFollowUp) !== null && _createAgentFollowUp !== void 0 && _createAgentFollowUp.agentId) {
|
|
745
711
|
fetchAgentDetail(createAgentFollowUp.agentId).then(function (chatAgent) {
|
|
746
712
|
document.dispatchEvent(new CustomEvent('maia-merge-created-agent-into-list', {
|
|
@@ -769,26 +735,24 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
769
735
|
document.dispatchEvent(customEvent);
|
|
770
736
|
firstTimeRef.current = false;
|
|
771
737
|
}
|
|
772
|
-
case
|
|
738
|
+
case 4:
|
|
773
739
|
case "end":
|
|
774
|
-
return
|
|
740
|
+
return _context2.stop();
|
|
775
741
|
}
|
|
776
|
-
},
|
|
742
|
+
}, _callee2);
|
|
777
743
|
}));
|
|
778
|
-
return function (
|
|
779
|
-
return
|
|
744
|
+
return function (_x4, _x5, _x6, _x7, _x8, _x9) {
|
|
745
|
+
return _ref4.apply(this, arguments);
|
|
780
746
|
};
|
|
781
|
-
}(), [
|
|
747
|
+
}(), [addMessage, removeMessage, project, getTabTaskDefault, event, agent]);
|
|
782
748
|
var handleStreamStop = useCallback(function () {
|
|
783
|
-
// El stop siempre aplica a la sesión activa (botón del input visible).
|
|
784
|
-
var sessionId = currentChatId.current;
|
|
785
749
|
clearStreamUiRef.current();
|
|
786
750
|
var tempMessageId = "answer-".concat(currentMessageId.current, "-streaming");
|
|
787
|
-
|
|
751
|
+
streamingStore.clear();
|
|
788
752
|
streamingPlaceholderIdRef.current = null;
|
|
789
753
|
activeStreamChatIdRef.current = null;
|
|
790
|
-
|
|
791
|
-
|
|
754
|
+
removeMessage(tempMessageId);
|
|
755
|
+
addMessage({
|
|
792
756
|
id: "answer-".concat(currentMessageId.current, "-cancelled"),
|
|
793
757
|
message: t('chat.cancelled'),
|
|
794
758
|
date: new Date(),
|
|
@@ -799,24 +763,19 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
799
763
|
role: ChatHistoryRole.ASSISTANT,
|
|
800
764
|
isFrontendCancelled: true
|
|
801
765
|
});
|
|
802
|
-
clearSessionTail(sessionId);
|
|
803
766
|
isProcessingRef.current = false;
|
|
804
767
|
setTimeout(function () {
|
|
805
768
|
var customEvent = new CustomEvent('refetch-session');
|
|
806
769
|
document.dispatchEvent(customEvent);
|
|
807
770
|
}, 500);
|
|
808
|
-
}, [
|
|
809
|
-
var handleApprovalRequired = useCallback(function (
|
|
771
|
+
}, [addMessage, removeMessage, t]);
|
|
772
|
+
var handleApprovalRequired = useCallback(function (approval, accumulatedContent) {
|
|
810
773
|
var _approval$pending_act;
|
|
811
|
-
var
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
if (isActive) {
|
|
817
|
-
streamingPlaceholderIdRef.current = null;
|
|
818
|
-
activeStreamChatIdRef.current = null;
|
|
819
|
-
}
|
|
774
|
+
var tempMessageId = "answer-".concat(currentMessageId.current, "-streaming");
|
|
775
|
+
streamingStore.clear();
|
|
776
|
+
streamingPlaceholderIdRef.current = null;
|
|
777
|
+
activeStreamChatIdRef.current = null;
|
|
778
|
+
removeMessage(tempMessageId);
|
|
820
779
|
var hitlContext = {
|
|
821
780
|
messageId: "approval-".concat(approval.original_thread_id),
|
|
822
781
|
messageText: accumulatedContent || '',
|
|
@@ -826,28 +785,24 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
826
785
|
return action.thread_id;
|
|
827
786
|
})
|
|
828
787
|
};
|
|
829
|
-
|
|
830
|
-
hitlExecutionContextRef.current = hitlContext;
|
|
831
|
-
}
|
|
788
|
+
hitlExecutionContextRef.current = hitlContext;
|
|
832
789
|
if (approval.manual_approval_detected) {
|
|
833
|
-
var _approval$pending_act2,
|
|
790
|
+
var _approval$pending_act2, _ref5, _tool_name, _tool_args;
|
|
834
791
|
var firstAction = (_approval$pending_act2 = approval.pending_actions) === null || _approval$pending_act2 === void 0 ? void 0 : _approval$pending_act2[0];
|
|
835
|
-
var toolName = (
|
|
792
|
+
var toolName = (_ref5 = (_tool_name = approval.tool_name) !== null && _tool_name !== void 0 ? _tool_name : firstAction === null || firstAction === void 0 ? void 0 : firstAction.tool_name) !== null && _ref5 !== void 0 ? _ref5 : '';
|
|
836
793
|
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;
|
|
837
|
-
if (toolName
|
|
794
|
+
if (toolName) {
|
|
838
795
|
lastManualApprovalRef.current = {
|
|
839
796
|
toolName: toolName,
|
|
840
797
|
toolArgs: toolArgs
|
|
841
798
|
};
|
|
842
799
|
}
|
|
843
|
-
|
|
844
|
-
isProcessingRef.current = false;
|
|
845
|
-
}
|
|
800
|
+
isProcessingRef.current = false;
|
|
846
801
|
return;
|
|
847
802
|
}
|
|
848
803
|
|
|
849
804
|
// Add a message with the approval request
|
|
850
|
-
|
|
805
|
+
addMessage({
|
|
851
806
|
id: "approval-".concat(approval.original_thread_id),
|
|
852
807
|
message: accumulatedContent || '',
|
|
853
808
|
date: new Date(),
|
|
@@ -859,14 +814,9 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
859
814
|
approval: approval,
|
|
860
815
|
approvalStatus: 'pending'
|
|
861
816
|
});
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
} else {
|
|
865
|
-
notifySessionFinishedInBackground(sessionId, 'approval_required');
|
|
866
|
-
}
|
|
867
|
-
}, [commitToSession, dropFromSession]);
|
|
817
|
+
isProcessingRef.current = false;
|
|
818
|
+
}, [addMessage, removeMessage]);
|
|
868
819
|
var _useOrchestratorStrea = useOrchestratorStream({
|
|
869
|
-
activeSessionId: activeSessionId,
|
|
870
820
|
onError: handleStreamError,
|
|
871
821
|
onStreamUpdate: handleStreamUpdate,
|
|
872
822
|
onFinishStream: handleStreamFinish,
|
|
@@ -880,42 +830,32 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
880
830
|
loadingMessage = _useOrchestratorStrea.loadingMessage,
|
|
881
831
|
streamActivity = _useOrchestratorStrea.streamActivity,
|
|
882
832
|
updateStreamActivity = _useOrchestratorStrea.updateStreamActivity,
|
|
883
|
-
stopStreaming = _useOrchestratorStrea.stopStreaming
|
|
833
|
+
stopStreaming = _useOrchestratorStrea.stopStreaming,
|
|
834
|
+
abortStreamSilently = _useOrchestratorStrea.abortStreamSilently;
|
|
835
|
+
|
|
836
|
+
// Mantenemos el setter más reciente en una ref para que pueda usarse desde
|
|
837
|
+
// efectos definidos antes en el archivo (cambio de chat, reset, etc.).
|
|
838
|
+
abortStreamSilentlyRef.current = abortStreamSilently;
|
|
884
839
|
clearStreamUiRef.current = function () {
|
|
885
840
|
updateStreamActivity(null);
|
|
886
841
|
setActiveLoadings({});
|
|
842
|
+
setIsContinuingStream(false);
|
|
887
843
|
hitlExecutionContextRef.current = null;
|
|
888
844
|
};
|
|
889
845
|
var currentProject = project;
|
|
890
846
|
var sendMessage = useCallback(/*#__PURE__*/function () {
|
|
891
|
-
var
|
|
847
|
+
var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(message, attachmentsOrOptions, faqId, agentSuggestionId, mentions, fuaId, scId) {
|
|
892
848
|
var _messagesRef$current;
|
|
893
|
-
var
|
|
894
|
-
return _regeneratorRuntime.wrap(function (
|
|
895
|
-
while (1) switch (
|
|
849
|
+
var _normalizeSendMessage, attachments, options, effectiveMentions, contextMessage, payloadFuaId, payloadScId, payloadContextData, displayMessage, newMessageId, lastMessageWithProject, currentAgentFromMessages, streamingPlaceholderId, finalMessage, _options$projectChang, _contextRef$current$p, history, _contextRef$current, ctxChipsProject, ctxProject, ctxClient, ctxTask, lastMessageProjectId, projectToRequest, projects, payloadFaqId, payloadAgentSuggestionId, payloadData;
|
|
850
|
+
return _regeneratorRuntime.wrap(function (_context3) {
|
|
851
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
896
852
|
case 0:
|
|
897
853
|
if (!(isProcessingRef.current || waitingResponse || loadingMessages)) {
|
|
898
|
-
|
|
854
|
+
_context3.next = 1;
|
|
899
855
|
break;
|
|
900
856
|
}
|
|
901
|
-
return
|
|
857
|
+
return _context3.abrupt("return");
|
|
902
858
|
case 1:
|
|
903
|
-
// Tope de concurrencia: si esta sesión no está generando y ya hay
|
|
904
|
-
// MAX_CONCURRENT_STREAMS activas, avisamos y no arrancamos otra.
|
|
905
|
-
willStartNewStream = !sessionStreamManager.isActive(currentChatId.current);
|
|
906
|
-
if (!(willStartNewStream && sessionStreamManager.getActiveCount() >= MAX_CONCURRENT_STREAMS)) {
|
|
907
|
-
_context2.next = 2;
|
|
908
|
-
break;
|
|
909
|
-
}
|
|
910
|
-
document.dispatchEvent(new CustomEvent('snackbar-event', {
|
|
911
|
-
detail: {
|
|
912
|
-
show: true,
|
|
913
|
-
severity: 'info',
|
|
914
|
-
message: t('chat.tooManyActiveSessions')
|
|
915
|
-
}
|
|
916
|
-
}));
|
|
917
|
-
return _context2.abrupt("return");
|
|
918
|
-
case 2:
|
|
919
859
|
_normalizeSendMessage = normalizeSendMessageArgs(attachmentsOrOptions), attachments = _normalizeSendMessage.attachments, options = _normalizeSendMessage.options; // Las mentions pueden venir vía 5to parámetro (call positional desde el footer)
|
|
920
860
|
// o vía SendMessageOptions (call programático). El parámetro explícito gana.
|
|
921
861
|
effectiveMentions = mentions !== null && mentions !== void 0 ? mentions : options.mentions;
|
|
@@ -940,10 +880,8 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
940
880
|
lastMessageWithProject = messagesRef.current.filter(function (msg) {
|
|
941
881
|
return msg.projectId;
|
|
942
882
|
}).at(-1);
|
|
943
|
-
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;
|
|
944
|
-
|
|
945
|
-
_contextRef$current = contextRef.current, ctxChipsProject = _contextRef$current.chipsProject, ctxProject = _contextRef$current.project, ctxClient = _contextRef$current.client, ctxTask = _contextRef$current.task; // No agregar projectId al mensaje del usuario - se determinará después
|
|
946
|
-
commitToSession(sessionId, _objectSpread({
|
|
883
|
+
currentAgentFromMessages = (_messagesRef$current = messagesRef.current) === null || _messagesRef$current === void 0 || (_messagesRef$current = _messagesRef$current[messagesRef.current.length - 1]) === null || _messagesRef$current === void 0 ? void 0 : _messagesRef$current.agentId; // No agregar projectId al mensaje del usuario - se determinará después
|
|
884
|
+
addMessage(_objectSpread({
|
|
947
885
|
id: "question-".concat(currentMessageId.current),
|
|
948
886
|
message: displayMessage,
|
|
949
887
|
date: new Date(),
|
|
@@ -956,9 +894,8 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
956
894
|
currentMessageId.current = uuidv4();
|
|
957
895
|
streamingPlaceholderId = "answer-".concat(currentMessageId.current, "-streaming");
|
|
958
896
|
streamingPlaceholderIdRef.current = streamingPlaceholderId;
|
|
959
|
-
activeStreamChatIdRef.current =
|
|
960
|
-
|
|
961
|
-
commitToSession(sessionId, {
|
|
897
|
+
activeStreamChatIdRef.current = currentChatId.current;
|
|
898
|
+
addMessage({
|
|
962
899
|
id: streamingPlaceholderId,
|
|
963
900
|
message: '',
|
|
964
901
|
date: new Date(),
|
|
@@ -978,6 +915,7 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
978
915
|
role: historyMessage.user.id === authUser.id.toString() ? ChatHistoryRole.USER : ChatHistoryRole.ASSISTANT
|
|
979
916
|
};
|
|
980
917
|
});
|
|
918
|
+
_contextRef$current = contextRef.current, ctxChipsProject = _contextRef$current.chipsProject, ctxProject = _contextRef$current.project, ctxClient = _contextRef$current.client, ctxTask = _contextRef$current.task;
|
|
981
919
|
lastMessageProjectId = lastMessageWithProject === null || lastMessageWithProject === void 0 ? void 0 : lastMessageWithProject.projectId;
|
|
982
920
|
projectToRequest = resolveProjectToRequest(ctxChipsProject, lastMessageProjectId);
|
|
983
921
|
console.info('[useChatManager] sendMessage context resolution:', {
|
|
@@ -990,13 +928,13 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
990
928
|
projectPropId: ctxProject === null || ctxProject === void 0 ? void 0 : ctxProject.id,
|
|
991
929
|
agentType: agent === null || agent === void 0 ? void 0 : agent.type
|
|
992
930
|
});
|
|
993
|
-
|
|
931
|
+
_context3.next = 2;
|
|
994
932
|
return fetchProjects([projectToRequest]);
|
|
995
|
-
case
|
|
996
|
-
projects =
|
|
933
|
+
case 2:
|
|
934
|
+
projects = _context3.sent;
|
|
997
935
|
payloadFaqId = faqId !== null && faqId !== void 0 ? faqId : options.faqId;
|
|
998
936
|
payloadAgentSuggestionId = agentSuggestionId !== null && agentSuggestionId !== void 0 ? agentSuggestionId : options.agentSuggestionId;
|
|
999
|
-
payloadData = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(
|
|
937
|
+
payloadData = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
|
|
1000
938
|
message: finalMessage,
|
|
1001
939
|
history: history,
|
|
1002
940
|
projectId: projectToRequest,
|
|
@@ -1033,24 +971,22 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
1033
971
|
agentEntity: agent.entity
|
|
1034
972
|
} : {}), (agent === null || agent === void 0 ? void 0 : agent.type) != null ? {
|
|
1035
973
|
agentType: agent.type
|
|
1036
|
-
} : {}), (agent === null || agent === void 0 ? void 0 : agent.emoji) != null ? {
|
|
1037
|
-
agentEmoji: agent.emoji
|
|
1038
974
|
} : {}), contextMessage ? {
|
|
1039
975
|
contextMessage: contextMessage
|
|
1040
976
|
} : {}), payloadContextData ? {
|
|
1041
977
|
contextData: payloadContextData
|
|
1042
978
|
} : {});
|
|
1043
979
|
askMaia(payloadData);
|
|
1044
|
-
case
|
|
980
|
+
case 3:
|
|
1045
981
|
case "end":
|
|
1046
|
-
return
|
|
982
|
+
return _context3.stop();
|
|
1047
983
|
}
|
|
1048
|
-
},
|
|
984
|
+
}, _callee3);
|
|
1049
985
|
}));
|
|
1050
|
-
return function (
|
|
1051
|
-
return
|
|
986
|
+
return function (_x0, _x1, _x10, _x11, _x12, _x13, _x14) {
|
|
987
|
+
return _ref6.apply(this, arguments);
|
|
1052
988
|
};
|
|
1053
|
-
}(), [addMessage,
|
|
989
|
+
}(), [addMessage, event, askMaia, project, client, task, chipsProject, authUser, agent, t, waitingResponse, loadingMessages, isWebSearchActive, isDeepSearchActive]);
|
|
1054
990
|
var changeProject = useCallback(function (option) {
|
|
1055
991
|
if (!currentUserQuestion.current) return;
|
|
1056
992
|
if (option.id !== (project === null || project === void 0 ? void 0 : project.id)) {
|
|
@@ -1097,15 +1033,15 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
1097
1033
|
}
|
|
1098
1034
|
}, [project, setProject, askMaia, authUser, isWebSearchActive, agent]);
|
|
1099
1035
|
var handleFeedback = useCallback(/*#__PURE__*/function () {
|
|
1100
|
-
var
|
|
1036
|
+
var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(feedbackProp, chatMessageId) {
|
|
1101
1037
|
var response;
|
|
1102
|
-
return _regeneratorRuntime.wrap(function (
|
|
1103
|
-
while (1) switch (
|
|
1038
|
+
return _regeneratorRuntime.wrap(function (_context4) {
|
|
1039
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
1104
1040
|
case 0:
|
|
1105
|
-
|
|
1041
|
+
_context4.next = 1;
|
|
1106
1042
|
return maia.Chats.wasHelpfulChat(chatMessageId, feedbackProp === Feedback.THUMBS_UP);
|
|
1107
1043
|
case 1:
|
|
1108
|
-
response =
|
|
1044
|
+
response = _context4.sent;
|
|
1109
1045
|
if (response) {
|
|
1110
1046
|
messagesRef.current = messagesRef.current.map(function (message) {
|
|
1111
1047
|
if (message.id === chatMessageId && message.role === 'assistant') {
|
|
@@ -1118,72 +1054,44 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
1118
1054
|
}
|
|
1119
1055
|
case 2:
|
|
1120
1056
|
case "end":
|
|
1121
|
-
return
|
|
1057
|
+
return _context4.stop();
|
|
1122
1058
|
}
|
|
1123
|
-
},
|
|
1059
|
+
}, _callee4);
|
|
1124
1060
|
}));
|
|
1125
|
-
return function (
|
|
1126
|
-
return
|
|
1061
|
+
return function (_x15, _x16) {
|
|
1062
|
+
return _ref7.apply(this, arguments);
|
|
1127
1063
|
};
|
|
1128
1064
|
}(), []);
|
|
1129
1065
|
var handleApprovalDecision = useCallback(/*#__PURE__*/function () {
|
|
1130
|
-
var
|
|
1131
|
-
var
|
|
1132
|
-
return _regeneratorRuntime.wrap(function (
|
|
1133
|
-
while (1) switch (
|
|
1066
|
+
var _ref8 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(threadIds, decision, editedActions) {
|
|
1067
|
+
var messageWithApproval, approval, messageId, loadingKey, hitlContext, initialActivity, existingMessage, newStatus, streamSettled, response, _t;
|
|
1068
|
+
return _regeneratorRuntime.wrap(function (_context5) {
|
|
1069
|
+
while (1) switch (_context5.prev = _context5.next) {
|
|
1134
1070
|
case 0:
|
|
1135
1071
|
if (threadIds !== null && threadIds !== void 0 && threadIds.length) {
|
|
1136
|
-
|
|
1072
|
+
_context5.next = 1;
|
|
1137
1073
|
break;
|
|
1138
1074
|
}
|
|
1139
1075
|
console.error('No thread_ids provided for approval decision');
|
|
1140
|
-
return
|
|
1076
|
+
return _context5.abrupt("return");
|
|
1141
1077
|
case 1:
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1078
|
+
// Buscar el mensaje que contiene alguno de estos threadIds en sus pending_actions
|
|
1079
|
+
messageWithApproval = messagesRef.current.find(function (m) {
|
|
1080
|
+
var _m$approval;
|
|
1081
|
+
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) {
|
|
1082
|
+
return threadIds.includes(action.thread_id);
|
|
1083
|
+
});
|
|
1084
|
+
});
|
|
1085
|
+
if (!(!messageWithApproval || !messageWithApproval.approval)) {
|
|
1086
|
+
_context5.next = 2;
|
|
1145
1087
|
break;
|
|
1146
1088
|
}
|
|
1147
1089
|
console.error('No se encontró mensaje con approval para thread_ids:', threadIds);
|
|
1148
|
-
return
|
|
1090
|
+
return _context5.abrupt("return");
|
|
1149
1091
|
case 2:
|
|
1150
|
-
messageWithApproval = found.message, foundSessionId = found.sessionId;
|
|
1151
1092
|
approval = messageWithApproval.approval;
|
|
1152
|
-
if (approval) {
|
|
1153
|
-
_context4.next = 3;
|
|
1154
|
-
break;
|
|
1155
|
-
}
|
|
1156
|
-
return _context4.abrupt("return");
|
|
1157
|
-
case 3:
|
|
1158
|
-
sessionId = approval.session_id || foundSessionId;
|
|
1159
|
-
if (sessionId) {
|
|
1160
|
-
_context4.next = 4;
|
|
1161
|
-
break;
|
|
1162
|
-
}
|
|
1163
|
-
console.error('No session_id disponible para approval:', threadIds);
|
|
1164
|
-
return _context4.abrupt("return");
|
|
1165
|
-
case 4:
|
|
1166
|
-
if (!sessionStreamManager.isActive(sessionId)) {
|
|
1167
|
-
_context4.next = 5;
|
|
1168
|
-
break;
|
|
1169
|
-
}
|
|
1170
|
-
return _context4.abrupt("return");
|
|
1171
|
-
case 5:
|
|
1172
|
-
if (!(sessionStreamManager.getActiveCount() >= MAX_CONCURRENT_STREAMS)) {
|
|
1173
|
-
_context4.next = 6;
|
|
1174
|
-
break;
|
|
1175
|
-
}
|
|
1176
|
-
document.dispatchEvent(new CustomEvent('snackbar-event', {
|
|
1177
|
-
detail: {
|
|
1178
|
-
show: true,
|
|
1179
|
-
severity: 'info',
|
|
1180
|
-
message: t('chat.tooManyActiveSessions')
|
|
1181
|
-
}
|
|
1182
|
-
}));
|
|
1183
|
-
return _context4.abrupt("return");
|
|
1184
|
-
case 6:
|
|
1185
1093
|
messageId = messageWithApproval.id;
|
|
1186
|
-
|
|
1094
|
+
loadingKey = threadIds[0];
|
|
1187
1095
|
hitlContext = {
|
|
1188
1096
|
messageId: messageId,
|
|
1189
1097
|
messageText: messageWithApproval.message,
|
|
@@ -1191,106 +1099,174 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
1191
1099
|
pendingActions: approval.pending_actions,
|
|
1192
1100
|
threadIds: threadIds
|
|
1193
1101
|
};
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1102
|
+
hitlExecutionContextRef.current = hitlContext;
|
|
1103
|
+
initialActivity = resolveInitialHitlStreamActivity(t, hitlContext); // Update message status immediately
|
|
1104
|
+
messagesRef.current = messagesRef.current.map(function (message) {
|
|
1105
|
+
if (message.id === messageId) {
|
|
1106
|
+
var newStatus = decision === 'approve' ? 'approved' : 'rejected';
|
|
1107
|
+
return _objectSpread(_objectSpread({}, message), {}, {
|
|
1108
|
+
approvalStatus: newStatus
|
|
1109
|
+
});
|
|
1110
|
+
}
|
|
1111
|
+
return message;
|
|
1112
|
+
});
|
|
1113
|
+
|
|
1114
|
+
// Trigger re-render
|
|
1115
|
+
existingMessage = messagesRef.current.find(function (m) {
|
|
1116
|
+
return m.id === messageId;
|
|
1117
|
+
});
|
|
1118
|
+
if (existingMessage) {
|
|
1119
|
+
newStatus = decision === 'approve' ? 'approved' : 'rejected';
|
|
1120
|
+
addMessage(_objectSpread(_objectSpread({}, existingMessage), {}, {
|
|
1121
|
+
approvalStatus: newStatus
|
|
1122
|
+
}));
|
|
1198
1123
|
}
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1124
|
+
|
|
1125
|
+
// Call continue-thread endpoint with ALL thread_ids in a single request
|
|
1126
|
+
isProcessingRef.current = true;
|
|
1127
|
+
setIsContinuingStream(true);
|
|
1128
|
+
currentMessageId.current = uuidv4();
|
|
1129
|
+
|
|
1130
|
+
// Add loading
|
|
1131
|
+
setActiveLoadings(function (prev) {
|
|
1132
|
+
return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, loadingKey, initialActivity.message));
|
|
1133
|
+
});
|
|
1134
|
+
updateStreamActivity(initialActivity);
|
|
1135
|
+
|
|
1136
|
+
// Marca si el stream cerró vía un evento terminal (complete/approval/error).
|
|
1137
|
+
// Si el backend cierra la conexión sin emitirlo, limpiamos el indicador en el
|
|
1138
|
+
// `finally` para que no quede trabado en "Escribiendo la respuesta".
|
|
1139
|
+
streamSettled = false;
|
|
1140
|
+
_context5.prev = 3;
|
|
1141
|
+
_context5.next = 4;
|
|
1142
|
+
return maia.Orchestrator.continueThread({
|
|
1143
|
+
threadIds: threadIds,
|
|
1144
|
+
// Send all action thread_ids at once
|
|
1145
|
+
sessionId: approval.session_id,
|
|
1146
|
+
decision: editedActions ? 'edit' : decision,
|
|
1147
|
+
editedActions: editedActions,
|
|
1148
|
+
agentId: (agent === null || agent === void 0 ? void 0 : agent.id) || '',
|
|
1149
|
+
lang: authUser.lang
|
|
1150
|
+
});
|
|
1151
|
+
case 4:
|
|
1152
|
+
response = _context5.sent;
|
|
1153
|
+
if (response.ok) {
|
|
1154
|
+
_context5.next = 5;
|
|
1155
|
+
break;
|
|
1205
1156
|
}
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
sessionId: sessionId,
|
|
1219
|
-
placeholderId: hitlCtx.placeholderId,
|
|
1220
|
-
continueRequest: {
|
|
1221
|
-
threadIds: threadIds,
|
|
1222
|
-
sessionId: approval.session_id,
|
|
1223
|
-
decision: editedActions ? 'edit' : decision,
|
|
1224
|
-
editedActions: editedActions,
|
|
1225
|
-
agentId: (agent === null || agent === void 0 ? void 0 : agent.id) || '',
|
|
1226
|
-
lang: authUser.lang
|
|
1157
|
+
setIsContinuingStream(false);
|
|
1158
|
+
handleStreamError();
|
|
1159
|
+
return _context5.abrupt("return");
|
|
1160
|
+
case 5:
|
|
1161
|
+
_context5.next = 6;
|
|
1162
|
+
return processSSEStream(response, loadingKey, {
|
|
1163
|
+
onThinking: function onThinking() {
|
|
1164
|
+
var activity = {
|
|
1165
|
+
phase: 'thinking',
|
|
1166
|
+
message: getThinkingLoadingMessage(0, t)
|
|
1167
|
+
};
|
|
1168
|
+
updateStreamActivity(activity);
|
|
1227
1169
|
},
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
}
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
}
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1170
|
+
onToken: function onToken(content) {
|
|
1171
|
+
updateStreamActivity(getWritingStreamActivity(t));
|
|
1172
|
+
handleStreamUpdate(content, null, '');
|
|
1173
|
+
},
|
|
1174
|
+
onNode: function onNode(message, currentThreadId) {
|
|
1175
|
+
var nodeActivity = resolveHitlNodeStreamActivity(message, t, hitlExecutionContextRef.current, currentThreadId, {
|
|
1176
|
+
useResumingFallback: true
|
|
1177
|
+
});
|
|
1178
|
+
updateStreamActivity(nodeActivity);
|
|
1179
|
+
setActiveLoadings(function (prev) {
|
|
1180
|
+
return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, currentThreadId, nodeActivity.message));
|
|
1181
|
+
});
|
|
1182
|
+
},
|
|
1183
|
+
onComplete: function onComplete(finalContent, sources, memorySessionId, currentThreadId, attachments, suggestions, agentId) {
|
|
1184
|
+
streamSettled = true;
|
|
1185
|
+
setIsContinuingStream(false);
|
|
1186
|
+
handleStreamFinish(finalContent, sources, memorySessionId, attachments, suggestions, agentId);
|
|
1187
|
+
updateStreamActivity(null);
|
|
1188
|
+
hitlExecutionContextRef.current = null;
|
|
1189
|
+
setActiveLoadings(function (prev) {
|
|
1190
|
+
var newLoadings = _objectSpread({}, prev);
|
|
1191
|
+
delete newLoadings[currentThreadId];
|
|
1192
|
+
return newLoadings;
|
|
1193
|
+
});
|
|
1194
|
+
},
|
|
1195
|
+
onApprovalRequired: function onApprovalRequired(approvalPayload, accumulatedContent, currentThreadId) {
|
|
1196
|
+
// New HITL interruption detected after resume (chained actions)
|
|
1197
|
+
streamSettled = true;
|
|
1198
|
+
setIsContinuingStream(false);
|
|
1199
|
+
updateStreamActivity(null);
|
|
1200
|
+
hitlExecutionContextRef.current = null;
|
|
1201
|
+
setActiveLoadings(function (prev) {
|
|
1202
|
+
var newLoadings = _objectSpread({}, prev);
|
|
1203
|
+
delete newLoadings[currentThreadId];
|
|
1204
|
+
return newLoadings;
|
|
1205
|
+
});
|
|
1206
|
+
handleApprovalRequired(approvalPayload, accumulatedContent);
|
|
1207
|
+
},
|
|
1208
|
+
onError: function onError() {
|
|
1209
|
+
streamSettled = true;
|
|
1210
|
+
setIsContinuingStream(false);
|
|
1211
|
+
handleStreamError();
|
|
1248
1212
|
}
|
|
1249
1213
|
});
|
|
1214
|
+
case 6:
|
|
1215
|
+
_context5.next = 8;
|
|
1216
|
+
break;
|
|
1250
1217
|
case 7:
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
detail: {
|
|
1257
|
-
show: true,
|
|
1258
|
-
severity: 'info',
|
|
1259
|
-
message: t('chat.tooManyActiveSessions')
|
|
1260
|
-
}
|
|
1261
|
-
}));
|
|
1262
|
-
}
|
|
1263
|
-
}
|
|
1218
|
+
_context5.prev = 7;
|
|
1219
|
+
_t = _context5["catch"](3);
|
|
1220
|
+
streamSettled = true;
|
|
1221
|
+
setIsContinuingStream(false);
|
|
1222
|
+
handleStreamError();
|
|
1264
1223
|
case 8:
|
|
1224
|
+
_context5.prev = 8;
|
|
1225
|
+
setIsContinuingStream(false);
|
|
1226
|
+
isProcessingRef.current = false;
|
|
1227
|
+
// Red de seguridad: si el stream cerró sin evento terminal, el indicador
|
|
1228
|
+
// (p. ej. "Escribiendo la respuesta") quedaría trabado. Lo limpiamos aquí.
|
|
1229
|
+
if (!streamSettled) {
|
|
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
|
+
});
|
|
1238
|
+
}
|
|
1239
|
+
return _context5.finish(8);
|
|
1240
|
+
case 9:
|
|
1265
1241
|
case "end":
|
|
1266
|
-
return
|
|
1242
|
+
return _context5.stop();
|
|
1267
1243
|
}
|
|
1268
|
-
},
|
|
1244
|
+
}, _callee5, null, [[3, 7, 8, 9]]);
|
|
1269
1245
|
}));
|
|
1270
|
-
return function (
|
|
1271
|
-
return
|
|
1246
|
+
return function (_x17, _x18, _x19) {
|
|
1247
|
+
return _ref8.apply(this, arguments);
|
|
1272
1248
|
};
|
|
1273
|
-
}(), [authUser, agent,
|
|
1274
|
-
var initializeChat = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function
|
|
1275
|
-
var _userInitialMessage$m, _userInitialMessage$a,
|
|
1276
|
-
return _regeneratorRuntime.wrap(function (
|
|
1277
|
-
while (1) switch (
|
|
1249
|
+
}(), [authUser, agent, addMessage, handleStreamError, handleStreamUpdate, handleStreamFinish, handleApprovalRequired, updateStreamActivity, t]);
|
|
1250
|
+
var initializeChat = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6() {
|
|
1251
|
+
var _userInitialMessage$m, _userInitialMessage$a, _ref0, _resolveProjectToRequ, _ctxProject$id, _ctxClient$id, _ctxTask$id, _ctxChipsProject$proj, hasInitialMessage, hasInitialAttachments, hasInitialFaq, hasInitialFua, hasInitialSc, history, _contextRef$current2, ctxChipsProject, ctxProject, ctxClient, ctxTask, projectToRequest;
|
|
1252
|
+
return _regeneratorRuntime.wrap(function (_context6) {
|
|
1253
|
+
while (1) switch (_context6.prev = _context6.next) {
|
|
1278
1254
|
case 0:
|
|
1279
1255
|
if (!firstTimeRef.current) {
|
|
1280
1256
|
firstTimeRef.current = true;
|
|
1281
1257
|
}
|
|
1282
1258
|
if (!initialChatId) {
|
|
1283
|
-
|
|
1259
|
+
_context6.next = 2;
|
|
1284
1260
|
break;
|
|
1285
1261
|
}
|
|
1286
|
-
|
|
1262
|
+
_context6.next = 1;
|
|
1287
1263
|
return loadMessages();
|
|
1288
1264
|
case 1:
|
|
1289
|
-
|
|
1265
|
+
_context6.next = 4;
|
|
1290
1266
|
break;
|
|
1291
1267
|
case 2:
|
|
1292
1268
|
if (!userInitialMessage) {
|
|
1293
|
-
|
|
1269
|
+
_context6.next = 4;
|
|
1294
1270
|
break;
|
|
1295
1271
|
}
|
|
1296
1272
|
hasInitialMessage = Boolean((_userInitialMessage$m = userInitialMessage.message) === null || _userInitialMessage$m === void 0 ? void 0 : _userInitialMessage$m.trim());
|
|
@@ -1299,10 +1275,10 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
1299
1275
|
hasInitialFua = Boolean(userInitialMessage.fuaId);
|
|
1300
1276
|
hasInitialSc = Boolean(userInitialMessage.scId);
|
|
1301
1277
|
if (!(!hasInitialMessage && !hasInitialAttachments && !hasInitialFaq && !hasInitialFua && !hasInitialSc)) {
|
|
1302
|
-
|
|
1278
|
+
_context6.next = 3;
|
|
1303
1279
|
break;
|
|
1304
1280
|
}
|
|
1305
|
-
return
|
|
1281
|
+
return _context6.abrupt("return");
|
|
1306
1282
|
case 3:
|
|
1307
1283
|
history = messagesRef.current.map(function (historyMessage) {
|
|
1308
1284
|
return {
|
|
@@ -1311,7 +1287,7 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
1311
1287
|
};
|
|
1312
1288
|
});
|
|
1313
1289
|
_contextRef$current2 = contextRef.current, ctxChipsProject = _contextRef$current2.chipsProject, ctxProject = _contextRef$current2.project, ctxClient = _contextRef$current2.client, ctxTask = _contextRef$current2.task;
|
|
1314
|
-
projectToRequest = (
|
|
1290
|
+
projectToRequest = (_ref0 = (_resolveProjectToRequ = resolveProjectToRequest(ctxChipsProject, null)) !== null && _resolveProjectToRequ !== void 0 ? _resolveProjectToRequ : ctxProject === null || ctxProject === void 0 ? void 0 : ctxProject.id) !== null && _ref0 !== void 0 ? _ref0 : null;
|
|
1315
1291
|
console.info('[useChatManager] PATH=initializeChat/userInitialMessage — contextRef resolution:', {
|
|
1316
1292
|
projectPropId: (_ctxProject$id = ctxProject === null || ctxProject === void 0 ? void 0 : ctxProject.id) !== null && _ctxProject$id !== void 0 ? _ctxProject$id : null,
|
|
1317
1293
|
clientId: (_ctxClient$id = ctxClient === null || ctxClient === void 0 ? void 0 : ctxClient.id) !== null && _ctxClient$id !== void 0 ? _ctxClient$id : null,
|
|
@@ -1320,7 +1296,7 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
1320
1296
|
projectToRequest: projectToRequest,
|
|
1321
1297
|
agentType: agent === null || agent === void 0 ? void 0 : agent.type
|
|
1322
1298
|
});
|
|
1323
|
-
askMaia(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(
|
|
1299
|
+
askMaia(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
|
|
1324
1300
|
message: userInitialMessage.message,
|
|
1325
1301
|
history: history,
|
|
1326
1302
|
projectId: projectToRequest,
|
|
@@ -1357,8 +1333,6 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
1357
1333
|
agentEntity: agent.entity
|
|
1358
1334
|
} : {}), (agent === null || agent === void 0 ? void 0 : agent.type) != null ? {
|
|
1359
1335
|
agentType: agent.type
|
|
1360
|
-
} : {}), (agent === null || agent === void 0 ? void 0 : agent.emoji) != null ? {
|
|
1361
|
-
agentEmoji: agent.emoji
|
|
1362
1336
|
} : {}), buildContextMessage(userInitialMessage.mentions) ? {
|
|
1363
1337
|
contextMessage: buildContextMessage(userInitialMessage.mentions)
|
|
1364
1338
|
} : {}), userInitialMessage.contextData ? {
|
|
@@ -1366,30 +1340,31 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
1366
1340
|
} : {}));
|
|
1367
1341
|
case 4:
|
|
1368
1342
|
case "end":
|
|
1369
|
-
return
|
|
1343
|
+
return _context6.stop();
|
|
1370
1344
|
}
|
|
1371
|
-
},
|
|
1345
|
+
}, _callee6);
|
|
1372
1346
|
})), [initialChatId, userInitialMessage, project, client, task, authUser, agent, askMaia, isWebSearchActive, isDeepSearchActive]);
|
|
1373
1347
|
var resetChat = useCallback(function () {
|
|
1374
|
-
|
|
1375
|
-
sessionStreamingText.clear(previousSessionId);
|
|
1348
|
+
abortStreamSilentlyRef.current();
|
|
1376
1349
|
currentMessageId.current = uuidv4();
|
|
1377
1350
|
currentUserQuestion.current = null;
|
|
1378
1351
|
currentChatId.current = uuidv4();
|
|
1379
|
-
setActiveSessionId(currentChatId.current);
|
|
1380
1352
|
reportedEvent.current = false;
|
|
1381
1353
|
streamingPlaceholderIdRef.current = null;
|
|
1382
1354
|
activeStreamChatIdRef.current = null;
|
|
1355
|
+
streamingStore.clear();
|
|
1356
|
+
setIsContinuingStream(false);
|
|
1383
1357
|
}, []);
|
|
1384
1358
|
var stopGeneration = useCallback(function () {
|
|
1385
1359
|
stopStreaming();
|
|
1386
1360
|
isProcessingRef.current = false;
|
|
1361
|
+
setIsContinuingStream(false);
|
|
1387
1362
|
}, [stopStreaming]);
|
|
1388
1363
|
return {
|
|
1389
1364
|
messages: messages,
|
|
1390
1365
|
loadingMessages: loadingMessages,
|
|
1391
1366
|
isLoadingMoreMessages: isLoadingMoreMessages,
|
|
1392
|
-
waitingResponse: waitingResponse,
|
|
1367
|
+
waitingResponse: waitingResponse || isContinuingStream,
|
|
1393
1368
|
isWriting: isWriting,
|
|
1394
1369
|
loadingMessage: loadingMessage,
|
|
1395
1370
|
streamActivity: streamActivity,
|
|
@@ -1405,7 +1380,7 @@ export var useChatManager = function useChatManager(_ref4) {
|
|
|
1405
1380
|
initializeChat: initializeChat,
|
|
1406
1381
|
resetChat: resetChat,
|
|
1407
1382
|
stopGeneration: stopGeneration,
|
|
1408
|
-
isDisabled: waitingResponse || loadingMessages
|
|
1383
|
+
isDisabled: waitingResponse || isContinuingStream || loadingMessages
|
|
1409
1384
|
};
|
|
1410
1385
|
};
|
|
1411
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVJlZiIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwidjQiLCJ1dWlkdjQiLCJ1c2VDaGF0TWVzc2FnZXMiLCJ1c2VPcmNoZXN0cmF0b3JTdHJlYW0iLCJ1c2VUIiwidXNlVXNlciIsInVzZUdsb2JhbENvbnRleHQiLCJFVkVOVFMiLCJ1c2VFdmVudCIsIm1haWEiLCJGZWVkYmFjayIsIkNoYXRIaXN0b3J5Um9sZSIsImJ1aWxkQ29udGV4dE1lc3NhZ2UiLCJmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5IiwidXNlUHJvamVjdHMiLCJ1c2VUYWJUYXNrRGVmYXVsdCIsIlRBU0tfVVJMX1JFR0VYX1BBVFRFUk4iLCJmZXRjaEFnZW50RGV0YWlsIiwiYnVpbGRIaXRsQWN0aW9uVHlwZUxpc3QiLCJnZXRIaXRsQW5hbHl0aWNzQWdlbnRUeXBlIiwic2Vzc2lvblN0cmVhbWluZ1RleHQiLCJ1c2VTZXNzaW9uc1N0b3JlIiwidXNlU2Vzc2lvbk1ldGEiLCJzZXNzaW9uU3RyZWFtTWFuYWdlciIsIk1BWF9DT05DVVJSRU5UX1NUUkVBTVMiLCJhY3RpdmVWaWV3Iiwibm90aWZ5U2Vzc2lvbkZpbmlzaGVkSW5CYWNrZ3JvdW5kIiwiaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZCIsIm5vcm1hbGl6ZVNlbmRNZXNzYWdlQXJncyIsImF0dGFjaG1lbnRzT3JPcHRpb25zIiwiX29wdGlvbnMkYXR0YWNobWVudHMiLCJBcnJheSIsImlzQXJyYXkiLCJhdHRhY2htZW50cyIsIm9wdGlvbnMiLCJyZXNvbHZlUHJvamVjdFRvUmVxdWVzdCIsImNoaXBzUHJvamVjdCIsImxhc3RNZXNzYWdlUHJvamVjdElkIiwiY2hpcHNQcm9qZWN0SWQiLCJwcm9qZWN0SWQiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsInBhcnNlZCIsInJlc29sdmVDbGllbnRQYXlsb2FkIiwiY3R4Q2xpZW50IiwiY3R4UHJvamVjdCIsIl9jdHhQcm9qZWN0JGNsaWVudCIsImlkIiwiX29iamVjdFNwcmVhZCIsImNsaWVudElkIiwibmFtZSIsImNsaWVudE5hbWUiLCJjbGllbnQiLCJub3JtYWxpemVBc3Npc3RhbnRBdHRhY2htZW50cyIsInJhd0F0dGFjaG1lbnRzIiwiZmlsdGVyIiwiYXR0YWNobWVudCIsIl90eXBlb2YiLCJtYXAiLCJpbmRleCIsInRyaW0iLCJjb25jYXQiLCJ0eXBlIiwibWltZVR5cGUiLCJtaW1lX3R5cGUiLCJmdWxsRmlsZU5hbWUiLCJpbmNsdWRlcyIsIm51bWVyaWNTaXplIiwic2l6ZSIsImZpbGUiLCJGaWxlIiwidXJsX29yaWdpbmFsIiwidW5kZWZpbmVkIiwidXJsX3RodW1ibmFpbCIsInVybF9maWxlIiwicm9sZSIsImV4dHJhY3RUYXNrSWRzRnJvbVBlbmRpbmdBY3Rpb25zQXJncyIsInBlbmRpbmdBY3Rpb25zIiwiaWRzIiwicHVzaElkIiwicmF3IiwibiIsInBhcnNlSW50IiwiU3RyaW5nIiwiaXNOYU4iLCJwdXNoIiwiZm9yRWFjaCIsImFjdGlvbiIsIl9yZWMkdGFza19pZCIsImFyZ3MiLCJ0b29sX2FyZ3MiLCJyZWMiLCJ0YXNrX2lkIiwidGFza19pZHMiLCJ0YXNrcyIsInQiLCJfdHJlYyR0YXNrX2lkIiwidHJlYyIsImV4dHJhY3RUYXNrSWRzRnJvbURlbGV0ZVBlbmRpbmdBY3Rpb25zIiwidG9vbF9uYW1lIiwiX3JlYyR0YXNrX2lkMiIsImxpc3QiLCJ0aWQiLCJleHRyYWN0QWdlbnRJZEZyb21FZGl0QWdlbnRQZW5kaW5nQWN0aW9ucyIsIl9yZWMkYWdlbnRfaWQiLCJlZGl0QWN0aW9uIiwiZmluZCIsImEiLCJ0b0xvd2VyQ2FzZSIsImFnZW50X2lkIiwiYWdlbnRJZCIsImV4dHJhY3RBZ2VudElkRnJvbVBlbmRpbmdBY3Rpb25zQnlUb29sTmFtZSIsInRvb2xOYW1lIiwiX3JlZiIsIl9yZWMkYWdlbnRfaWQyIiwiZXh0cmFjdFRhc2tJZHNGcm9tQXNzaXN0YW50RGVsZXRpb25UZXh0IiwidGV4dCIsImxhYmVsZWQiLCJtYXRjaCIsImJvbGQiLCJ1c2VTdGFibGVDYWxsYmFja3MiLCJhdXRoVXNlciIsImN1cnJlbnRVc2VyIiwidG9TdHJpbmciLCJmaXJzdE5hbWUiLCJhdmF0YXIiLCJwaWN0dXJlIiwiY3VycmVudCIsImZpbmRNZXNzYWdlV2l0aEFwcHJvdmFsQnlUaHJlYWRJZHMiLCJ0aHJlYWRJZHMiLCJhY3RpdmVNZXNzYWdlcyIsImZyb21BY3RpdmVWaWV3IiwibWVzc2FnZSIsIl9tZXNzYWdlJGFwcHJvdmFsIiwiYXBwcm92YWwiLCJwZW5kaW5nX2FjdGlvbnMiLCJzb21lIiwidGhyZWFkX2lkIiwic2Vzc2lvbklkIiwic2Vzc2lvbl9pZCIsImdldCIsIl91c2VTZXNzaW9uc1N0b3JlJGdldCIsImdldFN0YXRlIiwibWVzc2FnZXMiLCJzZXNzaW9uRW50cnkiLCJPYmplY3QiLCJlbnRyaWVzIiwiX3JlZjIiLCJfcmVmMyIsIl9zbGljZWRUb0FycmF5Iiwic2Vzc2lvbk1lc3NhZ2VzIiwiX21lc3NhZ2UkYXBwcm92YWwyIiwiX3Nlc3Npb25FbnRyeSIsImZvdW5kIiwiX21lc3NhZ2UkYXBwcm92YWwzIiwidXNlQ2hhdE1hbmFnZXIiLCJfcmVmNCIsImluaXRpYWxDaGF0SWQiLCJjaGF0SWQiLCJ1c2VySW5pdGlhbE1lc3NhZ2UiLCJvbkVycm9yIiwiX3JlZjQkYWdlbnRzIiwiYWdlbnRzIiwiX3VzZVQiLCJfdXNlR2xvYmFsQ29udGV4dCIsInByb2plY3QiLCJzZXRQcm9qZWN0Iiwic2V0Q2xpZW50IiwidGFzayIsInNldFRhc2siLCJhZ2VudCIsImlzV2ViU2VhcmNoQWN0aXZlIiwiaXNEZWVwU2VhcmNoQWN0aXZlIiwic2V0Q2hpcHNQcm9qZWN0IiwiZXZlbnQiLCJfdXNlUHJvamVjdHMiLCJmZXRjaFByb2plY3RzIiwiX3VzZVN0YWJsZUNhbGxiYWNrcyIsIl91c2VUYWJUYXNrRGVmYXVsdCIsImdldFRhYlRhc2tEZWZhdWx0IiwiX2NoaXBzUHJvamVjdCRwcm9qZWN0IiwiX2NoaXBzUHJvamVjdCRwcm9qZWN0MiIsIl9wcm9qZWN0JGlkIiwiX2NsaWVudCRpZCIsIl90YXNrJGlkIiwiY29uc29sZSIsImluZm8iLCJjaGlwc1Byb2plY3ROYW1lIiwicHJvamVjdE5hbWUiLCJwcm9qZWN0UHJvcElkIiwidGFza0lkIiwiY3VycmVudE1lc3NhZ2VJZCIsImN1cnJlbnRVc2VyUXVlc3Rpb24iLCJjdXJyZW50Q2hhdElkIiwicmVwb3J0ZWRFdmVudCIsIm1lc3NhZ2VzUmVmIiwibGFzdE1hbnVhbEFwcHJvdmFsUmVmIiwiaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYiLCJpc1Byb2Nlc3NpbmdSZWYiLCJmaXJzdFRpbWVSZWYiLCJzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmIiwiYWN0aXZlU3RyZWFtQ2hhdElkUmVmIiwiY2xlYXJTdHJlYW1VaVJlZiIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJhY3RpdmVMb2FkaW5ncyIsInNldEFjdGl2ZUxvYWRpbmdzIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJhY3RpdmVTZXNzaW9uSWQiLCJzZXRBY3RpdmVTZXNzaW9uSWQiLCJpc01vdW50ZWRSZWYiLCJsYXN0SGFuZGxlZFRlcm1pbmFsUmVmIiwiaXNXZWJTZWFyY2hBY3RpdmVSZWYiLCJpc0RlZXBTZWFyY2hBY3RpdmVSZWYiLCJjb250ZXh0UmVmIiwiX3VzZUNoYXRNZXNzYWdlcyIsImxvYWRpbmdNZXNzYWdlcyIsImlzTG9hZGluZ01vcmVNZXNzYWdlcyIsImxvYWRNZXNzYWdlcyIsImFkZE1lc3NhZ2UiLCJyZW1vdmVNZXNzYWdlIiwiaGFuZGxlU2Nyb2xsIiwiY29tbWl0VG9TZXNzaW9uIiwiaXMiLCJkcm9wRnJvbVNlc3Npb24iLCJtZXNzYWdlSWQiLCJjbGVhclNlc3Npb25UYWlsIiwic2V0TWVzc2FnZXMiLCJzZXQiLCJhY3RpdmVTZXNzaW9uTWV0YSIsIl9hY3RpdmVTZXNzaW9uTWV0YSRmaSIsInN0YXR1cyIsImlzVGVybWluYWwiLCJrZXkiLCJmaW5pc2hlZEF0IiwidGFpbCIsImdldE1lc3NhZ2VzIiwiaGFzU3RhbGVQbGFjZWhvbGRlciIsIm1zZyIsImZvcmNlIiwiY3VzdG9tRXZlbnQiLCJDdXN0b21FdmVudCIsImRldGFpbCIsImRvY3VtZW50IiwiZGlzcGF0Y2hFdmVudCIsIm1hcmtVbnJlYWQiLCJpc0FjdGl2ZSIsImhhbmRsZVN0cmVhbUVycm9yIiwiY3R4IiwiZXJyb3JNZXNzYWdlIiwiZXJyb3JSYXdNZXNzYWdlIiwiX2Vycm9yUmF3TWVzc2FnZSRtYXRjIiwiX2Vycm9yUmF3TWVzc2FnZSRtYXRjMiIsInBsYWNlaG9sZGVySWQiLCJjbGVhciIsInVzZWQiLCJpc0Vycm9yIiwiZGF0ZSIsIkRhdGUiLCJ1c2VyIiwiQVNTSVNUQU5UIiwiaGFuZGxlU3RyZWFtVXBkYXRlIiwiY29udGVudCIsInBsYWNlaG9sZGVyRXhpc3RzIiwic3RhcnQiLCJzZXRUZXh0IiwiaGFuZGxlU3RyZWFtRmluaXNoIiwiX3JlZjUiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsInNvdXJjZXMiLCJtZW1vcnlTZXNzaW9uSWQiLCJzdWdnZXN0aW9ucyIsImNvbXBsZXRlZEFnZW50SWQiLCJfcHJldmlvdXNNZXNzYWdlJGFwcHIiLCJfd2luZG93JHRhc2tQYW5lbCIsIl9jcmVhdGVBZ2VudEZvbGxvd1VwIiwiX2VkaXRBZ2VudEZvbGxvd1VwIiwidGVtcE1lc3NhZ2VJZCIsInRhc2tVcmxSZWdleCIsIm1hdGNoZXMiLCJjb250ZW50VG9BZGQiLCJwcmV2aW91c01lc3NhZ2UiLCJoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlIiwiVEFTS19DUkVBVElPTl9UT09MUyIsIlRBU0tfRURJVF9UT09MUyIsIlRBU0tfREVMRVRFX1RPT0xTIiwid2FzVGFza0NyZWF0aW9uIiwid2FzVGFza0VkaXQiLCJ3YXNUYXNrRGVsZXRlIiwid2FzQ3JlYXRlQWdlbnRBcHByb3ZlZCIsIndhc0NvbmZpZ3VyZUFnZW50QWNjZXNzQXBwcm92ZWQiLCJjcmVhdGVBZ2VudEZvbGxvd1VwIiwiY29uZmlndXJlZEFnZW50SWQiLCJ3YXNFZGl0QWdlbnRBcHByb3ZlZCIsImVkaXRBZ2VudEZvbGxvd1VwIiwiZnJvbVN0cmVhbSIsImZyb21BcmdzIiwicmVzb2x2ZWRBZ2VudElkIiwidGFza0lkc0Zyb21VcmxzIiwidGFza0lkc0Zyb21EZWxldGVBcHByb3ZhbCIsInRhc2tJZHNGcm9tRGVsZXRpb25UZXh0IiwidGFza0lkc0ZvckRhc2hib2FyZCIsInNob3VsZFN5bmNEYXNoYm9hcmQiLCJ0YXNrSWRzIiwidGFiIiwidGFiU2VnbWVudCIsImxhc3RQcm9qZWN0TWVzc2FnZSIsImNvbnRleHRQcm9qZWN0SWRSYXciLCJjb250ZXh0UHJvamVjdElkIiwicGF0aE1hdGNoIiwicm91dGVQcm9qZWN0SWQiLCJpc09uUHJvamVjdFJvdXRlIiwiX3dpbmRvdyRuZXdQcm9qZWN0RGFzIiwiX3dpbmRvdyRuZXdQcm9qZWN0RGFzMiIsIl93aW5kb3ckbmV3UHJvamVjdERhczMiLCJfd2luZG93JG5ld1Byb2plY3REYXM0IiwiX3dpbmRvdyRuZXdQcm9qZWN0RGFzNSIsIl93aW5kb3ckbmV3UHJvamVjdERhczYiLCJvcGVuVGFza1BhbmVsSWQiLCJtYW51YWxBcHByb3ZhbCIsIm1hbnVhbFdhc1Rhc2tFZGl0IiwibWFudWFsV2FzVGFza0RlbGV0ZSIsIl9tYW51YWxBcHByb3ZhbCR0b29sQSIsIm1hbnVhbFBzZXVkb0FjdGlvbiIsImFmZmVjdGVkVGFza0lkcyIsIl93aW5kb3ckdGFza1BhbmVsMiIsIl93aW5kb3ckdGFza1BhbmVsMiRyZSIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwibGVuZ3RoIiwiYWJydXB0IiwiUmVnRXhwIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwibWF0Y2hBbGwiLCJtIiwiYXQiLCJhcHByb3ZhbFN0YXR1cyIsIndpbmRvdyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMiLCJhaUNoYXRIaXRsT3B0aW9uIiwiYWdlbnRfdHlwZSIsImFjdGlvbl90eXBlIiwiZGVjaXNpb24iLCJvcHRpb24iLCJjcmVhdGVkX2FnZW50X2lkIiwic2VudCIsInJlcGxhY2UiLCJ1cmwiLCJsb2NhdGlvbiIsInBhdGhuYW1lIiwibmV3UHJvamVjdERhc2hib2FyZCIsImFkZEV4aXN0aW5nVGFza1RvRGFzaGJvYXJkIiwiY2FsbCIsImVkaXRFeGlzdGluZ1Rhc2tJbkRhc2hib2FyZCIsImRlbGV0ZUV4aXN0aW5nVGFza0Zyb21EYXNoYm9hcmQiLCJ0YXNrUGFuZWwiLCJ0b29sQXJncyIsInJlZmV0Y2hUYXNrIiwidGhlbiIsImNoYXRBZ2VudCIsImVyciIsImVycm9yIiwic3RvcCIsIl94IiwiX3gyIiwiX3gzIiwiX3g0IiwiX3g1IiwiX3g2IiwiX3g3IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJoYW5kbGVTdHJlYW1TdG9wIiwiaXNGcm9udGVuZENhbmNlbGxlZCIsInNldFRpbWVvdXQiLCJoYW5kbGVBcHByb3ZhbFJlcXVpcmVkIiwiYWNjdW11bGF0ZWRDb250ZW50IiwiX2FwcHJvdmFsJHBlbmRpbmdfYWN0IiwiaGl0bENvbnRleHQiLCJvcmlnaW5hbF90aHJlYWRfaWQiLCJtZXNzYWdlVGV4dCIsIm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZCIsIl9hcHByb3ZhbCRwZW5kaW5nX2FjdDIiLCJfcmVmNiIsIl90b29sX25hbWUiLCJfdG9vbF9hcmdzIiwiZmlyc3RBY3Rpb24iLCJfdXNlT3JjaGVzdHJhdG9yU3RyZWEiLCJvblN0cmVhbVVwZGF0ZSIsIm9uRmluaXNoU3RyZWFtIiwib25TdG9wIiwib25BcHByb3ZhbFJlcXVpcmVkIiwiYXNrTWFpYSIsIndhaXRpbmdSZXNwb25zZSIsImlzTG9hZGluZyIsImlzV3JpdGluZyIsImxvYWRpbmdNZXNzYWdlIiwic3RyZWFtQWN0aXZpdHkiLCJ1cGRhdGVTdHJlYW1BY3Rpdml0eSIsInN0b3BTdHJlYW1pbmciLCJjdXJyZW50UHJvamVjdCIsInNlbmRNZXNzYWdlIiwiX3JlZjciLCJfY2FsbGVlMiIsImZhcUlkIiwiYWdlbnRTdWdnZXN0aW9uSWQiLCJtZW50aW9ucyIsImZ1YUlkIiwic2NJZCIsIl9tZXNzYWdlc1JlZiRjdXJyZW50Iiwid2lsbFN0YXJ0TmV3U3RyZWFtIiwiX25vcm1hbGl6ZVNlbmRNZXNzYWdlIiwiZWZmZWN0aXZlTWVudGlvbnMiLCJjb250ZXh0TWVzc2FnZSIsInBheWxvYWRGdWFJZCIsInBheWxvYWRTY0lkIiwicGF5bG9hZENvbnRleHREYXRhIiwiZGlzcGxheU1lc3NhZ2UiLCJuZXdNZXNzYWdlSWQiLCJsYXN0TWVzc2FnZVdpdGhQcm9qZWN0IiwiY3VycmVudEFnZW50RnJvbU1lc3NhZ2VzIiwiX2NvbnRleHRSZWYkY3VycmVudCIsImN0eENoaXBzUHJvamVjdCIsImN0eFRhc2siLCJzdHJlYW1pbmdQbGFjZWhvbGRlcklkIiwiZmluYWxNZXNzYWdlIiwiX29wdGlvbnMkcHJvamVjdENoYW5nIiwiX2NvbnRleHRSZWYkY3VycmVudCRwIiwiaGlzdG9yeSIsInByb2plY3RUb1JlcXVlc3QiLCJwcm9qZWN0cyIsInBheWxvYWRGYXFJZCIsInBheWxvYWRBZ2VudFN1Z2dlc3Rpb25JZCIsInBheWxvYWREYXRhIiwiX2NvbnRleHQyIiwiZ2V0QWN0aXZlQ291bnQiLCJzaG93Iiwic2V2ZXJpdHkiLCJjb250ZXh0RGF0YSIsInBtQWlUeXBlZFRleHQiLCJVU0VSIiwicHJvamVjdENoYW5nZWQiLCJpbmNvbWVUeXBlIiwiaGlzdG9yeU1lc3NhZ2UiLCJhZ2VudFR5cGUiLCJsYW5nIiwidXNlcklkIiwibGFzdE5hbWUiLCJjb21wYW55SWQiLCJjb21wYW55X2lkIiwiYWdlbnROYW1lIiwiZmVlSWQiLCJ0YXNrTmFtZSIsImVudGl0eSIsImFnZW50RW50aXR5IiwiZW1vamkiLCJhZ2VudEVtb2ppIiwiX3g4IiwiX3g5IiwiX3gwIiwiX3gxIiwiX3gxMCIsIl94MTEiLCJfeDEyIiwiY2hhbmdlUHJvamVjdCIsIl9wcm9qZWN0JGlkMiIsIl9jaGlwc1Byb2plY3QkcHJvamVjdDMiLCJvcHRpb25JZCIsImhhbmRsZUZlZWRiYWNrIiwiX3JlZjgiLCJfY2FsbGVlMyIsImZlZWRiYWNrUHJvcCIsImNoYXRNZXNzYWdlSWQiLCJyZXNwb25zZSIsIl9jb250ZXh0MyIsIkNoYXRzIiwid2FzSGVscGZ1bENoYXQiLCJUSFVNQlNfVVAiLCJ3YXNIZWxwZnVsIiwiX3gxMyIsIl94MTQiLCJoYW5kbGVBcHByb3ZhbERlY2lzaW9uIiwiX3JlZjkiLCJfY2FsbGVlNCIsImVkaXRlZEFjdGlvbnMiLCJtZXNzYWdlV2l0aEFwcHJvdmFsIiwiZm91bmRTZXNzaW9uSWQiLCJuZXdTdGF0dXMiLCJpc0FjdGl2ZVNlc3Npb24iLCJzdHJlYW1NZXNzYWdlSWQiLCJoaXRsQ3R4IiwicmVsZWFzZUFjdGl2ZVByb2Nlc3NpbmciLCJyZXN1bHQiLCJfY29udGV4dDQiLCJzdGFydENvbnRpbnVlU3RyZWFtIiwiY29udGludWVSZXF1ZXN0IiwiaGl0bEV4ZWN1dGlvbkNvbnRleHQiLCJjYWxsYmFja3MiLCJmaW5pc2hQYXlsb2FkIiwiYXBwcm92YWxQYXlsb2FkIiwic3RhcnRlZCIsInJlYXNvbiIsIl94MTUiLCJfeDE2IiwiX3gxNyIsImluaXRpYWxpemVDaGF0IiwiX2NhbGxlZTUiLCJfdXNlckluaXRpYWxNZXNzYWdlJG0iLCJfdXNlckluaXRpYWxNZXNzYWdlJGEiLCJfcmVmMSIsIl9yZXNvbHZlUHJvamVjdFRvUmVxdSIsIl9jdHhQcm9qZWN0JGlkIiwiX2N0eENsaWVudCRpZCIsIl9jdHhUYXNrJGlkIiwiX2N0eENoaXBzUHJvamVjdCRwcm9qIiwiaGFzSW5pdGlhbE1lc3NhZ2UiLCJoYXNJbml0aWFsQXR0YWNobWVudHMiLCJoYXNJbml0aWFsRmFxIiwiaGFzSW5pdGlhbEZ1YSIsImhhc0luaXRpYWxTYyIsIl9jb250ZXh0UmVmJGN1cnJlbnQyIiwiX2NvbnRleHQ1IiwiQm9vbGVhbiIsInJlc2V0Q2hhdCIsInByZXZpb3VzU2Vzc2lvbklkIiwic3RvcEdlbmVyYXRpb24iLCJpc0Rpc2FibGVkIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2hvb2tzL3VzZUNoYXRNYW5hZ2VyL3VzZUNoYXRNYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIHJhZGl4ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1uZXN0ZWQtdGVybmFyeSAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGVkLW9wdGlvbmFsLWNoYWluICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlUmVmLCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJ1xuaW1wb3J0IHsgdXNlQ2hhdE1lc3NhZ2VzIH0gZnJvbSAnLi4vdXNlQ2hhdE1lc3NhZ2VzJ1xuaW1wb3J0IHsgdXNlT3JjaGVzdHJhdG9yU3RyZWFtIH0gZnJvbSAnLi4vdXNlT3JjaGVzdHJhdG9yU3RyZWFtJ1xuaW1wb3J0IHsgdXNlVCB9IGZyb20gJy4uL3VzZVQnXG5pbXBvcnQgeyBBdHRhY2htZW50RmlsZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbW9sZWN1bGVzL0NoYXRGb290ZXIvQ2hhdEZvb3RlcidcbmltcG9ydCB7IFNlbmRNZXNzYWdlT3B0aW9ucywgVXNlQ2hhdE1hbmFnZXJQcm9wcyB9IGZyb20gJy4vdXNlQ2hhdE1hbmFnZXIuaW50ZXJmYWNlJ1xuaW1wb3J0IHsgdXNlVXNlciwgQ09SVXNlciB9IGZyb20gJy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgeyB1c2VHbG9iYWxDb250ZXh0IH0gZnJvbSAnLi4vLi4vY29udGV4dC9nbG9iYWwtY29udGV4dCdcbmltcG9ydCB7IEVWRU5UUywgdXNlRXZlbnQgfSBmcm9tICcuLi91c2VFdmVudCdcbmltcG9ydCBtYWlhIGZyb20gJy4uLy4uL3NlcnZpY2VzL21haWEnXG5pbXBvcnQgeyBGZWVkYmFjayB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbW9sZWN1bGVzL01lc3NhZ2VGZWVkYmFjay9NZXNzYWdlRmVlZGJhY2snXG5pbXBvcnQgeyBDaGF0TWVzc2FnZSwgQ2hhdE1lc3NhZ2VVc2VyLCBDaGF0SGlzdG9yeVJvbGUsIEFwcHJvdmFsUmVxdWVzdCwgUGVuZGluZ0FjdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQgeyBDb250ZXh0TWVudGlvbiwgQ29udGV4dE1lc3NhZ2UsIGJ1aWxkQ29udGV4dE1lc3NhZ2UgfSBmcm9tICcuLi8uLi90eXBlcy9jb250ZXh0TWVudGlvbidcbmltcG9ydCB7IGZvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZUZvckRpc3BsYXkgfSBmcm9tICcuLi8uLi91dGlscy9mb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2UnXG5cbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi90eXBlcy9Qcm9qZWN0J1xuaW1wb3J0IHsgdXNlUHJvamVjdHMgfSBmcm9tICcuLi91c2VQcm9qZWN0cydcbmltcG9ydCB7IHVzZVRhYlRhc2tEZWZhdWx0IH0gZnJvbSAnLi4vdXNlVGFiVGFza0RlZmF1bHQnXG5pbXBvcnQgeyBUQVNLX1VSTF9SRUdFWF9QQVRURVJOIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3Rhc2tVcmxzJ1xuaW1wb3J0IHsgZmV0Y2hBZ2VudERldGFpbCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21haWEvQWdlbnRzL2ZldGNoQWdlbnREZXRhaWwnXG5pbXBvcnQgeyBidWlsZEhpdGxBY3Rpb25UeXBlTGlzdCwgZ2V0SGl0bEFuYWx5dGljc0FnZW50VHlwZSB9IGZyb20gJy4uLy4uL3V0aWxzL2hpdGxBbmFseXRpY3MnXG5pbXBvcnQgeyB0eXBlIEhpdGxFeGVjdXRpb25Db250ZXh0IH0gZnJvbSAnLi4vLi4vdXRpbHMvc3RyZWFtQWN0aXZpdHlNZXNzYWdlcydcbmltcG9ydCB7IHNlc3Npb25TdHJlYW1pbmdUZXh0IH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvc2Vzc2lvblN0cmVhbWluZ1RleHQnXG5pbXBvcnQgeyB1c2VTZXNzaW9uc1N0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvdXNlU2Vzc2lvbnNTdG9yZSdcbmltcG9ydCB7IHVzZVNlc3Npb25NZXRhIH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvdXNlU2Vzc2lvbk1ldGEnXG5pbXBvcnQgeyBzZXNzaW9uU3RyZWFtTWFuYWdlciwgTUFYX0NPTkNVUlJFTlRfU1RSRUFNUyB9IGZyb20gJy4uLy4uL3N0b3JlL3Nlc3Npb25zL3Nlc3Npb25TdHJlYW1NYW5hZ2VyJ1xuaW1wb3J0IHsgYWN0aXZlVmlldyB9IGZyb20gJy4uLy4uL3N0b3JlL3Nlc3Npb25zL2FjdGl2ZVZpZXcnXG5pbXBvcnQgeyBub3RpZnlTZXNzaW9uRmluaXNoZWRJbkJhY2tncm91bmQgfSBmcm9tICcuLi8uLi9zdG9yZS9zZXNzaW9ucy9zZXNzaW9uTm90aWZpY2F0aW9ucydcbmltcG9ydCB7IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQgfSBmcm9tICcuLi8uLi91dGlscy9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuaW1wb3J0IHR5cGUgeyBTdHJlYW1Db250ZXh0IH0gZnJvbSAnLi4vdXNlT3JjaGVzdHJhdG9yU3RyZWFtL3VzZU9yY2hlc3RyYXRvclN0cmVhbS5pbnRlcmZhY2UnXG5cbnR5cGUgQXR0YWNobWVudHNPck9wdGlvbnMgPSBBdHRhY2htZW50RmlsZVtdIHwgU2VuZE1lc3NhZ2VPcHRpb25zXG5cbmNvbnN0IG5vcm1hbGl6ZVNlbmRNZXNzYWdlQXJncyA9IChhdHRhY2htZW50c09yT3B0aW9ucz86IEF0dGFjaG1lbnRzT3JPcHRpb25zKSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KGF0dGFjaG1lbnRzT3JPcHRpb25zKSkge1xuICAgIHJldHVybiB7IGF0dGFjaG1lbnRzOiBhdHRhY2htZW50c09yT3B0aW9ucywgb3B0aW9uczoge30gYXMgU2VuZE1lc3NhZ2VPcHRpb25zIH1cbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnM6IFNlbmRNZXNzYWdlT3B0aW9ucyA9IGF0dGFjaG1lbnRzT3JPcHRpb25zID8/IHt9XG4gIHJldHVybiB7IGF0dGFjaG1lbnRzOiBvcHRpb25zLmF0dGFjaG1lbnRzID8/IFtdLCBvcHRpb25zIH1cbn1cblxuLyoqIGNoaXBzUHJvamVjdCBlcyBsYSBmdWVudGUgZGUgdmVyZGFkIGRlbCBwaW4gdmlzaWJsZTsgc2kgbm8gaGF5IHBpbiwgcmVzdGF1cmFyIGRlc2RlIGhpc3RvcmlhbC4gKi9cbmNvbnN0IHJlc29sdmVQcm9qZWN0VG9SZXF1ZXN0ID0gKFxuICBjaGlwc1Byb2plY3Q6IHsgcHJvamVjdElkPzogc3RyaW5nIH0gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBsYXN0TWVzc2FnZVByb2plY3RJZDogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogbnVtYmVyIHwgbnVsbCA9PiB7XG4gIGNvbnN0IGNoaXBzUHJvamVjdElkID0gY2hpcHNQcm9qZWN0Py5wcm9qZWN0SWQgPyBOdW1iZXIoY2hpcHNQcm9qZWN0LnByb2plY3RJZCkgOiBudWxsXG4gIGlmIChjaGlwc1Byb2plY3RJZCAhPSBudWxsICYmIE51bWJlci5pc0Zpbml0ZShjaGlwc1Byb2plY3RJZCkpIHtcbiAgICByZXR1cm4gY2hpcHNQcm9qZWN0SWRcbiAgfVxuICBpZiAobGFzdE1lc3NhZ2VQcm9qZWN0SWQgIT0gbnVsbCkge1xuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcihsYXN0TWVzc2FnZVByb2plY3RJZClcbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgPyBwYXJzZWQgOiBudWxsXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuY29uc3QgcmVzb2x2ZUNsaWVudFBheWxvYWQgPSAoXG4gIGN0eENsaWVudDogeyBpZD86IG51bWJlcjsgbmFtZT86IHN0cmluZyB9IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgY3R4UHJvamVjdDogUHJvamVjdCB8IG51bGwgfCB1bmRlZmluZWRcbik6IHsgY2xpZW50SWQ/OiBudW1iZXI7IGNsaWVudE5hbWU/OiBzdHJpbmcgfSA9PiB7XG4gIGlmIChjdHhDbGllbnQ/LmlkKSB7XG4gICAgcmV0dXJuIHsgY2xpZW50SWQ6IGN0eENsaWVudC5pZCwgLi4uKGN0eENsaWVudC5uYW1lID8geyBjbGllbnROYW1lOiBjdHhDbGllbnQubmFtZSB9IDoge30pIH1cbiAgfVxuICBpZiAoY3R4UHJvamVjdD8uY2xpZW50SWQgIT0gbnVsbCkge1xuICAgIHJldHVybiB7IGNsaWVudElkOiBOdW1iZXIoY3R4UHJvamVjdC5jbGllbnRJZCkgfVxuICB9XG4gIGlmIChjdHhQcm9qZWN0Py5jbGllbnQ/LmlkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsaWVudElkOiBjdHhQcm9qZWN0LmNsaWVudC5pZCxcbiAgICAgIC4uLihjdHhQcm9qZWN0LmNsaWVudC5uYW1lID8geyBjbGllbnROYW1lOiBjdHhQcm9qZWN0LmNsaWVudC5uYW1lIH0gOiB7fSksXG4gICAgfVxuICB9XG4gIHJldHVybiB7fVxufVxuXG5jb25zdCBub3JtYWxpemVBc3Npc3RhbnRBdHRhY2htZW50cyA9IChyYXdBdHRhY2htZW50czogdW5rbm93bik6IEF0dGFjaG1lbnRGaWxlW10gPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkocmF3QXR0YWNobWVudHMpKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICByZXR1cm4gcmF3QXR0YWNobWVudHNcbiAgICAuZmlsdGVyKChhdHRhY2htZW50KTogYXR0YWNobWVudCBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiAhIWF0dGFjaG1lbnQgJiYgdHlwZW9mIGF0dGFjaG1lbnQgPT09ICdvYmplY3QnKVxuICAgIC5tYXAoKGF0dGFjaG1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBuYW1lID1cbiAgICAgICAgdHlwZW9mIGF0dGFjaG1lbnQubmFtZSA9PT0gJ3N0cmluZycgJiYgYXR0YWNobWVudC5uYW1lLnRyaW0oKSA/IGF0dGFjaG1lbnQubmFtZS50cmltKCkgOiBgZmlsZS0ke2luZGV4ICsgMX1gXG4gICAgICBjb25zdCB0eXBlID0gdHlwZW9mIGF0dGFjaG1lbnQudHlwZSA9PT0gJ3N0cmluZycgJiYgYXR0YWNobWVudC50eXBlLnRyaW0oKSA/IGF0dGFjaG1lbnQudHlwZS50cmltKCkgOiAncGRmJ1xuICAgICAgY29uc3QgbWltZVR5cGUgPSB0eXBlb2YgYXR0YWNobWVudC5taW1lX3R5cGUgPT09ICdzdHJpbmcnID8gYXR0YWNobWVudC5taW1lX3R5cGUgOiAnJ1xuICAgICAgY29uc3QgZnVsbEZpbGVOYW1lID0gbmFtZS5pbmNsdWRlcygnLicpID8gbmFtZSA6IGAke25hbWV9LiR7dHlwZX1gXG4gICAgICBjb25zdCBudW1lcmljU2l6ZSA9XG4gICAgICAgIHR5cGVvZiBhdHRhY2htZW50LnNpemUgPT09ICdudW1iZXInXG4gICAgICAgICAgPyBhdHRhY2htZW50LnNpemVcbiAgICAgICAgICA6IE51bWJlci5pc0Zpbml0ZShOdW1iZXIoYXR0YWNobWVudC5zaXplKSlcbiAgICAgICAgICAgID8gTnVtYmVyKGF0dGFjaG1lbnQuc2l6ZSlcbiAgICAgICAgICAgIDogMFxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmaWxlOiBuZXcgRmlsZShbXSwgZnVsbEZpbGVOYW1lLCB7IHR5cGU6IG1pbWVUeXBlIH0pLFxuICAgICAgICBpZDpcbiAgICAgICAgICB0eXBlb2YgYXR0YWNobWVudC5pZCA9PT0gJ3N0cmluZycgJiYgYXR0YWNobWVudC5pZC50cmltKClcbiAgICAgICAgICAgID8gYXR0YWNobWVudC5pZFxuICAgICAgICAgICAgOiBgYXNzaXN0YW50LWZpbGUtJHtpbmRleH0tJHtmdWxsRmlsZU5hbWV9YCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgc2l6ZTogbnVtZXJpY1NpemUsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHVybF9vcmlnaW5hbDogdHlwZW9mIGF0dGFjaG1lbnQudXJsX29yaWdpbmFsID09PSAnc3RyaW5nJyA/IGF0dGFjaG1lbnQudXJsX29yaWdpbmFsIDogdW5kZWZpbmVkLFxuICAgICAgICB1cmxfdGh1bWJuYWlsOiB0eXBlb2YgYXR0YWNobWVudC51cmxfdGh1bWJuYWlsID09PSAnc3RyaW5nJyA/IGF0dGFjaG1lbnQudXJsX3RodW1ibmFpbCA6IHVuZGVmaW5lZCxcbiAgICAgICAgdXJsX2ZpbGU6IHR5cGVvZiBhdHRhY2htZW50LnVybF9maWxlID09PSAnc3RyaW5nJyA/IGF0dGFjaG1lbnQudXJsX2ZpbGUgOiB1bmRlZmluZWQsXG4gICAgICAgIHJvbGU6IGF0dGFjaG1lbnQucm9sZSA9PT0gJ2Fzc2lzdGFudCcgPyAnYXNzaXN0YW50JyA6ICd1c2VyJyxcbiAgICAgIH1cbiAgICB9KVxufVxuXG4vKiogRXh0cmFlIHRhc2tfaWRzIGRlIGxvcyB0b29sX2FyZ3MgZGUgcGVuZGluZ19hY3Rpb25zLCBjdWJyaWVuZG8gbGFzIGZvcm1hcyBjb211bmVzOlxuICogIC0gYHsgdGFza19pZCB9YCBvIGB7IGlkIH1gXG4gKiAgLSBgeyB0YXNrX2lkczogW10gfWBcbiAqICAtIGB7IHRhc2tzOiBbeyB0YXNrX2lkfGlkIH0sIC4uLl0gfWBcbiAqICDDmnRpbCBwYXJhIHRvb2xzIGRlIGVkaXQvYXNzaWduL2RlbGV0ZSBjdWFuZG8gbGEgcmVzcHVlc3RhIGRlbCBMTE0gbm8gaW5jbHV5ZSBVUkxzIC90YXNrcy8uLi4vZGV0YWlsLiAqL1xuZnVuY3Rpb24gZXh0cmFjdFRhc2tJZHNGcm9tUGVuZGluZ0FjdGlvbnNBcmdzKHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGlkczogbnVtYmVyW10gPSBbXVxuICBjb25zdCBwdXNoSWQgPSAocmF3OiB1bmtub3duKSA9PiB7XG4gICAgaWYgKHJhdyA9PSBudWxsKSByZXR1cm5cbiAgICBjb25zdCBuID0gcGFyc2VJbnQoU3RyaW5nKHJhdyksIDEwKVxuICAgIGlmICghTnVtYmVyLmlzTmFOKG4pKSBpZHMucHVzaChuKVxuICB9XG4gIHBlbmRpbmdBY3Rpb25zLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICBpZiAoIWFjdGlvbiB8fCB0eXBlb2YgYWN0aW9uICE9PSAnb2JqZWN0JykgcmV0dXJuXG4gICAgY29uc3QgYXJncyA9IGFjdGlvbi50b29sX2FyZ3NcbiAgICBpZiAoIShhcmdzICYmIHR5cGVvZiBhcmdzID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShhcmdzKSkpIHJldHVyblxuICAgIGNvbnN0IHJlYyA9IGFyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICBwdXNoSWQocmVjLnRhc2tfaWQgPz8gcmVjLmlkKVxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlYy50YXNrX2lkcykpIHtcbiAgICAgIHJlYy50YXNrX2lkcy5mb3JFYWNoKHB1c2hJZClcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVjLnRhc2tzKSkge1xuICAgICAgcmVjLnRhc2tzLmZvckVhY2godCA9PiB7XG4gICAgICAgIGlmICh0ICYmIHR5cGVvZiB0ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh0KSkge1xuICAgICAgICAgIGNvbnN0IHRyZWMgPSB0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICAgcHVzaElkKHRyZWMudGFza19pZCA/PyB0cmVjLmlkKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIGlkc1xufVxuXG4vKiogdGFza19pZCAvIHRhc2tfaWRzIGVuIHBlbmRpbmdfYWN0aW9ucyBkZSBkZWxldGVfKiAobGEgcmVzcHVlc3RhIHB1ZWRlIG5vIGluY2x1aXIgVVJMcyAvdGFza3Mv4oCmL2RldGFpbCkuICovXG5mdW5jdGlvbiBleHRyYWN0VGFza0lkc0Zyb21EZWxldGVQZW5kaW5nQWN0aW9ucyhwZW5kaW5nQWN0aW9uczogUGVuZGluZ0FjdGlvbltdKTogbnVtYmVyW10ge1xuICBjb25zdCBpZHM6IG51bWJlcltdID0gW11cbiAgcGVuZGluZ0FjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgIGlmICghYWN0aW9uIHx8IHR5cGVvZiBhY3Rpb24gIT09ICdvYmplY3QnKSByZXR1cm5cbiAgICBjb25zdCBhcmdzID0gYWN0aW9uLnRvb2xfYXJnc1xuICAgIGlmICghKGFyZ3MgJiYgdHlwZW9mIGFyZ3MgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGFyZ3MpKSkgcmV0dXJuXG4gICAgY29uc3QgcmVjID0gYXJncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIGlmIChhY3Rpb24udG9vbF9uYW1lID09PSAnZGVsZXRlX3Rhc2snKSB7XG4gICAgICBjb25zdCByYXcgPSByZWMudGFza19pZCA/PyByZWMuaWRcbiAgICAgIGlmIChyYXcgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBuID0gcGFyc2VJbnQoU3RyaW5nKHJhdyksIDEwKVxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihuKSkgaWRzLnB1c2gobilcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFjdGlvbi50b29sX25hbWUgPT09ICdkZWxldGVfdGFza3NfYmF0Y2gnKSB7XG4gICAgICBjb25zdCBsaXN0ID0gcmVjLnRhc2tfaWRzXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShsaXN0KSkge1xuICAgICAgICBsaXN0LmZvckVhY2godGlkID0+IHtcbiAgICAgICAgICBjb25zdCBuID0gcGFyc2VJbnQoU3RyaW5nKHRpZCksIDEwKVxuICAgICAgICAgIGlmICghTnVtYmVyLmlzTmFOKG4pKSBpZHMucHVzaChuKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIGlkc1xufVxuXG5mdW5jdGlvbiBleHRyYWN0QWdlbnRJZEZyb21FZGl0QWdlbnRQZW5kaW5nQWN0aW9ucyhwZW5kaW5nQWN0aW9uczogUGVuZGluZ0FjdGlvbltdKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGVkaXRBY3Rpb24gPSBwZW5kaW5nQWN0aW9ucy5maW5kKGEgPT4gKGEudG9vbF9uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSAnZWRpdF9hZ2VudCcpXG4gIGlmIChcbiAgICAhZWRpdEFjdGlvbiB8fFxuICAgICFlZGl0QWN0aW9uLnRvb2xfYXJncyB8fFxuICAgIHR5cGVvZiBlZGl0QWN0aW9uLnRvb2xfYXJncyAhPT0gJ29iamVjdCcgfHxcbiAgICBBcnJheS5pc0FycmF5KGVkaXRBY3Rpb24udG9vbF9hcmdzKVxuICApIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGNvbnN0IHJlYyA9IGVkaXRBY3Rpb24udG9vbF9hcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGNvbnN0IHJhdyA9IHJlYy5hZ2VudF9pZCA/PyByZWMuYWdlbnRJZFxuICByZXR1cm4gcmF3ICE9IG51bGwgPyBTdHJpbmcocmF3KSA6IG51bGxcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEFnZW50SWRGcm9tUGVuZGluZ0FjdGlvbnNCeVRvb2xOYW1lKHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW10sIHRvb2xOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgYWN0aW9uID0gcGVuZGluZ0FjdGlvbnMuZmluZChhID0+IChhLnRvb2xfbmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gdG9vbE5hbWUudG9Mb3dlckNhc2UoKSlcbiAgaWYgKCFhY3Rpb24gfHwgIWFjdGlvbi50b29sX2FyZ3MgfHwgdHlwZW9mIGFjdGlvbi50b29sX2FyZ3MgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoYWN0aW9uLnRvb2xfYXJncykpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGNvbnN0IHJlYyA9IGFjdGlvbi50b29sX2FyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgY29uc3QgcmF3ID0gcmVjLmFnZW50X2lkID8/IHJlYy5hZ2VudElkID8/IHJlYy5pZFxuICByZXR1cm4gcmF3ICE9IG51bGwgPyBTdHJpbmcocmF3KSA6IG51bGxcbn1cblxuLyoqIMOabHRpbW8gcmVjdXJzbyBzaSBubyBoYXkgbGlua3MgbmkgdG9vbF9hcmdzIHBhcnNlYWJsZXMgKHAuIGVqLiBcIklEICoqNzU5NzEwNioqXCIpLiAqL1xuZnVuY3Rpb24gZXh0cmFjdFRhc2tJZHNGcm9tQXNzaXN0YW50RGVsZXRpb25UZXh0KHRleHQ6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgY29uc3QgbGFiZWxlZCA9IHRleHQubWF0Y2goL1xcYklEXFxzKlxcKlxcKihcXGQrKVxcKlxcKi9pKVxuICBpZiAobGFiZWxlZCkge1xuICAgIGNvbnN0IG4gPSBwYXJzZUludChsYWJlbGVkWzFdLCAxMClcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKG4pID8gW10gOiBbbl1cbiAgfVxuICBjb25zdCBib2xkID0gdGV4dC5tYXRjaCgvXFwqXFwqKFxcZHs1LH0pXFwqXFwqLylcbiAgaWYgKGJvbGQpIHtcbiAgICBjb25zdCBuID0gcGFyc2VJbnQoYm9sZFsxXSwgMTApXG4gICAgcmV0dXJuIE51bWJlci5pc05hTihuKSA/IFtdIDogW25dXG4gIH1cbiAgcmV0dXJuIFtdXG59XG5cbmNvbnN0IHVzZVN0YWJsZUNhbGxiYWNrcyA9IChhdXRoVXNlcjogQ09SVXNlcikgPT4ge1xuICBjb25zdCBjdXJyZW50VXNlciA9IHVzZVJlZjxDaGF0TWVzc2FnZVVzZXI+KHtcbiAgICBpZDogYXV0aFVzZXIuaWQudG9TdHJpbmcoKSxcbiAgICBuYW1lOiBhdXRoVXNlci5maXJzdE5hbWUsXG4gICAgYXZhdGFyOiBhdXRoVXNlci5waWN0dXJlLFxuICB9KVxuXG4gIGlmIChcbiAgICBjdXJyZW50VXNlci5jdXJyZW50LmlkICE9PSBhdXRoVXNlci5pZC50b1N0cmluZygpIHx8XG4gICAgY3VycmVudFVzZXIuY3VycmVudC5uYW1lICE9PSBhdXRoVXNlci5maXJzdE5hbWUgfHxcbiAgICBjdXJyZW50VXNlci5jdXJyZW50LmF2YXRhciAhPT0gYXV0aFVzZXIucGljdHVyZVxuICApIHtcbiAgICBjdXJyZW50VXNlci5jdXJyZW50ID0ge1xuICAgICAgaWQ6IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCksXG4gICAgICBuYW1lOiBhdXRoVXNlci5maXJzdE5hbWUsXG4gICAgICBhdmF0YXI6IGF1dGhVc2VyLnBpY3R1cmUsXG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgY3VycmVudFVzZXI6IGN1cnJlbnRVc2VyLmN1cnJlbnQsXG4gIH1cbn1cblxuY29uc3QgZmluZE1lc3NhZ2VXaXRoQXBwcm92YWxCeVRocmVhZElkcyA9IChcbiAgdGhyZWFkSWRzOiBzdHJpbmdbXSxcbiAgYWN0aXZlTWVzc2FnZXM6IENoYXRNZXNzYWdlW11cbik6IHsgbWVzc2FnZTogQ2hhdE1lc3NhZ2U7IHNlc3Npb25JZDogc3RyaW5nIH0gfCBudWxsID0+IHtcbiAgY29uc3QgZnJvbUFjdGl2ZVZpZXcgPSBhY3RpdmVNZXNzYWdlcy5maW5kKG1lc3NhZ2UgPT5cbiAgICBtZXNzYWdlLmFwcHJvdmFsPy5wZW5kaW5nX2FjdGlvbnM/LnNvbWUoYWN0aW9uID0+IHRocmVhZElkcy5pbmNsdWRlcyhhY3Rpb24udGhyZWFkX2lkKSlcbiAgKVxuICBpZiAoZnJvbUFjdGl2ZVZpZXc/LmFwcHJvdmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IGZyb21BY3RpdmVWaWV3LFxuICAgICAgc2Vzc2lvbklkOiBmcm9tQWN0aXZlVmlldy5hcHByb3ZhbC5zZXNzaW9uX2lkIHx8IGFjdGl2ZVZpZXcuZ2V0KCkgfHwgJycsXG4gICAgfVxuICB9XG5cbiAgY29uc3QgeyBtZXNzYWdlcyB9ID0gdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpXG4gIGNvbnN0IHNlc3Npb25FbnRyeSA9IE9iamVjdC5lbnRyaWVzKG1lc3NhZ2VzKS5maW5kKChbLCBzZXNzaW9uTWVzc2FnZXNdKSA9PlxuICAgIHNlc3Npb25NZXNzYWdlcy5zb21lKG1lc3NhZ2UgPT5cbiAgICAgIG1lc3NhZ2UuYXBwcm92YWw/LnBlbmRpbmdfYWN0aW9ucz8uc29tZShhY3Rpb24gPT4gdGhyZWFkSWRzLmluY2x1ZGVzKGFjdGlvbi50aHJlYWRfaWQpKVxuICAgIClcbiAgKVxuICBpZiAoc2Vzc2lvbkVudHJ5KSB7XG4gICAgY29uc3QgW3Nlc3Npb25JZCwgc2Vzc2lvbk1lc3NhZ2VzXSA9IHNlc3Npb25FbnRyeVxuICAgIGNvbnN0IGZvdW5kID0gc2Vzc2lvbk1lc3NhZ2VzLmZpbmQobWVzc2FnZSA9PlxuICAgICAgbWVzc2FnZS5hcHByb3ZhbD8ucGVuZGluZ19hY3Rpb25zPy5zb21lKGFjdGlvbiA9PiB0aHJlYWRJZHMuaW5jbHVkZXMoYWN0aW9uLnRocmVhZF9pZCkpXG4gICAgKVxuICAgIGlmIChmb3VuZD8uYXBwcm92YWwpIHtcbiAgICAgIHJldHVybiB7IG1lc3NhZ2U6IGZvdW5kLCBzZXNzaW9uSWQ6IGZvdW5kLmFwcHJvdmFsLnNlc3Npb25faWQgfHwgc2Vzc2lvbklkIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgY29uc3QgdXNlQ2hhdE1hbmFnZXIgPSAoe1xuICBjaGF0SWQ6IGluaXRpYWxDaGF0SWQsXG4gIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgb25FcnJvcixcbiAgYWdlbnRzID0gW10sXG59OiBVc2VDaGF0TWFuYWdlclByb3BzKSA9PiB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVCgpXG4gIGNvbnN0IGF1dGhVc2VyID0gdXNlVXNlcigpXG4gIGNvbnN0IHtcbiAgICBwcm9qZWN0LFxuICAgIHNldFByb2plY3QsXG4gICAgY2xpZW50LFxuICAgIHNldENsaWVudCxcbiAgICB0YXNrLFxuICAgIHNldFRhc2ssXG4gICAgYWdlbnQsXG4gICAgaXNXZWJTZWFyY2hBY3RpdmUsXG4gICAgaXNEZWVwU2VhcmNoQWN0aXZlLFxuICAgIGNoaXBzUHJvamVjdCxcbiAgICBzZXRDaGlwc1Byb2plY3QsXG4gIH0gPSB1c2VHbG9iYWxDb250ZXh0KClcbiAgY29uc3QgZXZlbnQgPSB1c2VFdmVudCgpXG4gIGNvbnN0IHsgZmV0Y2hQcm9qZWN0cyB9ID0gdXNlUHJvamVjdHMoKVxuICBjb25zdCB7IGN1cnJlbnRVc2VyIH0gPSB1c2VTdGFibGVDYWxsYmFja3MoYXV0aFVzZXIpXG4gIGNvbnN0IHsgZ2V0VGFiVGFza0RlZmF1bHQgfSA9IHVzZVRhYlRhc2tEZWZhdWx0KClcblxuICAvLyBERUJVRzogcmFzdHJlYXIgY3XDoW5kbyBjYW1iaWEgZWwgY29udGV4dG8gZ2xvYmFsIHBhcmEgY29ycmVsYWNpb25hciBjb24gbG9zIGVudsOtb3MgYWwgb3JjaGVzdHJhdG9yXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc29sZS5pbmZvKCdbdXNlQ2hhdE1hbmFnZXJdIGNvbnRleHQgQ0hBTkdFRDonLCB7XG4gICAgICBjaGlwc1Byb2plY3RJZDogY2hpcHNQcm9qZWN0Py5wcm9qZWN0SWQgPz8gbnVsbCxcbiAgICAgIGNoaXBzUHJvamVjdE5hbWU6IGNoaXBzUHJvamVjdD8ucHJvamVjdE5hbWUgPz8gbnVsbCxcbiAgICAgIHByb2plY3RQcm9wSWQ6IHByb2plY3Q/LmlkID8/IG51bGwsXG4gICAgICBjbGllbnRJZDogY2xpZW50Py5pZCA/PyBudWxsLFxuICAgICAgdGFza0lkOiB0YXNrPy5pZCA/PyBudWxsLFxuICAgIH0pXG4gIH0sIFtjaGlwc1Byb2plY3Q/LnByb2plY3RJZCwgcHJvamVjdD8uaWQsIGNsaWVudD8uaWQsIHRhc2s/LmlkXSlcbiAgY29uc3QgY3VycmVudE1lc3NhZ2VJZCA9IHVzZVJlZih1dWlkdjQoKSlcbiAgY29uc3QgY3VycmVudFVzZXJRdWVzdGlvbiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBjdXJyZW50Q2hhdElkID0gdXNlUmVmKGluaXRpYWxDaGF0SWQgfHwgdXVpZHY0KCkpXG4gIGNvbnN0IHJlcG9ydGVkRXZlbnQgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IG1lc3NhZ2VzUmVmID0gdXNlUmVmPENoYXRNZXNzYWdlW10+KFtdKVxuICAvKipcbiAgICogR3VhcmRhIGluZm8gZGVsIMO6bHRpbW8gYXBwcm92YWwgbWFudWFsIChjdWFuZG8gZWwgdXN1YXJpbyB0aXBlYSBcInNpXCIvXCJub1wiIGVuIGx1Z2FyXG4gICAqIGRlIGNsaWNrZWFyIGVsIGJvdMOzbikuIEVuIG1hbnVhbCBhcHByb3ZhbCwgYGhhbmRsZUFwcHJvdmFsUmVxdWlyZWRgIHJldG9ybmEgZWFybHlcbiAgICogc2luIGFncmVnYXIgdW4gbWVuc2FqZSBjb24gYGFwcHJvdmFsYCwgYXPDrSBxdWUgbGEgbMOzZ2ljYSBkZSByZWZldGNoIGVuIGBvblN0cmVhbUZpbmlzaGBcbiAgICogbm8gbG8gZGV0ZWN0YSB2w61hIGBwcmV2aW91c01lc3NhZ2UuYXBwcm92YWxgLiBMbyBndWFyZGFtb3MgYWPDoSBwYXJhIGNvbnN1bWlybG8gZGVzcHXDqXMuXG4gICAqL1xuICBjb25zdCBsYXN0TWFudWFsQXBwcm92YWxSZWYgPSB1c2VSZWY8e1xuICAgIHRvb2xOYW1lOiBzdHJpbmdcbiAgICB0b29sQXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsXG4gIH0gfCBudWxsPihudWxsKVxuICAvKiogQ29udGV4dG8gZGVsIG1lbnNhamUgZGUgYXByb2JhY2nDs24gcHJldmlvIGFsIGVqZWN1dGFyIGNvbnRpbnVlLXRocmVhZC4gKi9cbiAgY29uc3QgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYgPSB1c2VSZWY8SGl0bEV4ZWN1dGlvbkNvbnRleHQgfCBudWxsPihudWxsKVxuICBjb25zdCBpc1Byb2Nlc3NpbmdSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGZpcnN0VGltZVJlZiA9IHVzZVJlZihmYWxzZSlcbiAgLyoqIElkIGRlbCBwbGFjZWhvbGRlciBkZWwgbWVuc2FqZSBlbiBzdHJlYW1pbmcgYWN0aXZvIChzaSBoYXkpLiAqL1xuICBjb25zdCBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIC8qKlxuICAgKiBDaGF0IGFsIHF1ZSBwZXJ0ZW5lY2UgZWwgc3RyZWFtIGFjdHVhbG1lbnRlIGFjdGl2by4gU2kgY2FtYmlhIGVsIGNoYXRcbiAgICogbWllbnRyYXMgdW4gc3RyZWFtIGVzdMOhIGVuIHZ1ZWxvLCBkZXNjYXJ0YW1vcyBsb3MgdG9rZW5zIHJlc2lkdWFsZXNcbiAgICogcXVlIHB1ZWRhbiBsbGVnYXIgYW50ZXMgZGUgcXVlIGVsIGFib3J0IHNlIGNvbXBsZXRlLlxuICAgKi9cbiAgY29uc3QgYWN0aXZlU3RyZWFtQ2hhdElkUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGNsZWFyU3RyZWFtVWlSZWYgPSB1c2VSZWY8KCkgPT4gdm9pZD4oKCkgPT4gdW5kZWZpbmVkKVxuICBjb25zdCBbYWN0aXZlTG9hZGluZ3MsIHNldEFjdGl2ZUxvYWRpbmdzXSA9IHVzZVN0YXRlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KHt9KVxuICAvKipcbiAgICogU2VzacOzbiBhY3R1YWxtZW50ZSB2aXNpYmxlLiBTZSBtYW50aWVuZSBlbiBzdGF0ZSAobm8gc29sbyBlbiByZWYpIHBhcmEgcXVlXG4gICAqIGVsIG1vdG9yIGRlIHN0cmVhbWluZyBwdWVkYSBsZWVyIHJlYWN0aXZhbWVudGUgbG9zIGZsYWdzIGRlIEVTVEEgc2VzacOzblxuICAgKiBkZXNkZSBlbCBzdG9yZSwgbWllbnRyYXMgb3RyYXMgc2lndWVuIGdlbmVyYW5kbyBlbiBiYWNrZ3JvdW5kLlxuICAgKi9cbiAgY29uc3QgW2FjdGl2ZVNlc3Npb25JZCwgc2V0QWN0aXZlU2Vzc2lvbklkXSA9IHVzZVN0YXRlPHN0cmluZz4oY3VycmVudENoYXRJZC5jdXJyZW50KVxuICAvKiogVHJ1ZSBtaWVudHJhcyBlc3RhIGluc3RhbmNpYSBlc3TDqSBtb250YWRhIChldml0YSBzZXRTdGF0ZSB0cmFzIGRlc21vbnRhcikuICovXG4gIGNvbnN0IGlzTW91bnRlZFJlZiA9IHVzZVJlZih0cnVlKVxuICAvKiogRXZpdGEgcmVjb25jaWxpYXIgZG9zIHZlY2VzIGVsIG1pc21vIGVzdGFkbyB0ZXJtaW5hbCBkZSB1bmEgc2VzacOzbi4gKi9cbiAgY29uc3QgbGFzdEhhbmRsZWRUZXJtaW5hbFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuXG4gIGNvbnN0IGlzV2ViU2VhcmNoQWN0aXZlUmVmID0gdXNlUmVmKGlzV2ViU2VhcmNoQWN0aXZlKVxuICBjb25zdCBpc0RlZXBTZWFyY2hBY3RpdmVSZWYgPSB1c2VSZWYoaXNEZWVwU2VhcmNoQWN0aXZlKVxuICAvKiogRXZpdGEgY2xvc3VyZXMgb2Jzb2xldGFzIGN1YW5kbyBlbCBmb290ZXIgY29uc2VydmEgc2VuZE1lc3NhZ2UgZW50cmUgcmVuZGVycy4gKi9cbiAgY29uc3QgY29udGV4dFJlZiA9IHVzZVJlZih7IGNoaXBzUHJvamVjdCwgcHJvamVjdCwgY2xpZW50LCB0YXNrIH0pXG4gIGNvbnRleHRSZWYuY3VycmVudCA9IHsgY2hpcHNQcm9qZWN0LCBwcm9qZWN0LCBjbGllbnQsIHRhc2sgfVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaXNXZWJTZWFyY2hBY3RpdmVSZWYuY3VycmVudCA9IGlzV2ViU2VhcmNoQWN0aXZlXG4gICAgaXNEZWVwU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQgPSBpc0RlZXBTZWFyY2hBY3RpdmVcbiAgfSwgW2lzV2ViU2VhcmNoQWN0aXZlLCBpc0RlZXBTZWFyY2hBY3RpdmVdKVxuXG4gIGNvbnN0IHsgbG9hZGluZ01lc3NhZ2VzLCBtZXNzYWdlcywgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzLCBsb2FkTWVzc2FnZXMsIGFkZE1lc3NhZ2UsIHJlbW92ZU1lc3NhZ2UsIGhhbmRsZVNjcm9sbCB9ID1cbiAgICB1c2VDaGF0TWVzc2FnZXMoe1xuICAgICAgY2hhdElkOiBpbml0aWFsQ2hhdElkIHx8IGN1cnJlbnRDaGF0SWQuY3VycmVudCxcbiAgICAgIGN1cnJlbnRVc2VyLFxuICAgICAgdXNlckluaXRpYWxNZXNzYWdlLFxuICAgICAgb25FcnJvcixcbiAgICAgIGFnZW50cyxcbiAgICB9KVxuXG4gIG1lc3NhZ2VzUmVmLmN1cnJlbnQgPSBtZXNzYWdlc1xuXG4gIC8qKlxuICAgKiBFc2NyaWJlIHVuIG1lbnNhamUgZW4gZWwgc3RvcmUgcG9yLXNlc2nDs24geSwgc2kgbGEgc2VzacOzbiBlcyBsYSBhY3RpdmEsXG4gICAqIHRhbWJpw6luIGVuIGxhIHZpc3RhIGxvY2FsLiBQZXJtaXRlIHF1ZSBzZXNpb25lcyBlbiBiYWNrZ3JvdW5kIGFjdW11bGVuIHN1XG4gICAqIHJlc3VsdGFkbyBzaW4gcGlzYXIgZWwgY2hhdCBxdWUgZWwgdXN1YXJpbyBlc3TDoSBtaXJhbmRvLlxuICAgKi9cbiAgY29uc3QgY29tbWl0VG9TZXNzaW9uID0gdXNlQ2FsbGJhY2soXG4gICAgKHNlc3Npb25JZDogc3RyaW5nLCBtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xuICAgICAgdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLmFkZE1lc3NhZ2Uoc2Vzc2lvbklkLCBtZXNzYWdlKVxuICAgICAgaWYgKGlzTW91bnRlZFJlZi5jdXJyZW50ICYmIGFjdGl2ZVZpZXcuaXMoc2Vzc2lvbklkKSkge1xuICAgICAgICBhZGRNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICB9XG4gICAgfSxcbiAgICBbYWRkTWVzc2FnZV1cbiAgKVxuXG4gIGNvbnN0IGRyb3BGcm9tU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKFxuICAgIChzZXNzaW9uSWQ6IHN0cmluZywgbWVzc2FnZUlkOiBzdHJpbmcpID0+IHtcbiAgICAgIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5yZW1vdmVNZXNzYWdlKHNlc3Npb25JZCwgbWVzc2FnZUlkKVxuICAgICAgaWYgKGlzTW91bnRlZFJlZi5jdXJyZW50ICYmIGFjdGl2ZVZpZXcuaXMoc2Vzc2lvbklkKSkge1xuICAgICAgICByZW1vdmVNZXNzYWdlKG1lc3NhZ2VJZClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtyZW1vdmVNZXNzYWdlXVxuICApXG5cbiAgLyoqIExpbXBpYSBlbCB0YWlsIGVuIHZ1ZWxvIGRlIHVuYSBzZXNpw7NuICh0cmFzIHRlcm1pbmFyOyBlbCBiYWNrZW5kIHBhc2EgYSBzZXIgZnVlbnRlKS4gKi9cbiAgY29uc3QgY2xlYXJTZXNzaW9uVGFpbCA9IHVzZUNhbGxiYWNrKChzZXNzaW9uSWQ6IHN0cmluZykgPT4ge1xuICAgIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5zZXRNZXNzYWdlcyhzZXNzaW9uSWQsIFtdKVxuICB9LCBbXSlcblxuICAvLyBSZWdpc3RyYXIgbGEgc2VzacOzbiB2aXNpYmxlIGVuIGVsIHRyYWNrZXIgZ2xvYmFsIHBhcmEgcXVlIGxvcyBjYWxsYmFja3MgZGVsXG4gIC8vIG1vdG9yIChxdWUgcHVlZGVuIHBlcnRlbmVjZXIgYSB1bmEgaW5zdGFuY2lhIHlhIGRlc21vbnRhZGEpIHNlcGFuIGN1w6FsIGVzIGxhXG4gIC8vIHNlc2nDs24gYWN0aXZhIGFjdHVhbC5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBhY3RpdmVWaWV3LnNldChhY3RpdmVTZXNzaW9uSWQpXG4gIH0sIFthY3RpdmVTZXNzaW9uSWRdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaXNNb3VudGVkUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlzTW91bnRlZFJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIGlmIChhY3RpdmVWaWV3LmlzKGN1cnJlbnRDaGF0SWQuY3VycmVudCkpIHtcbiAgICAgICAgYWN0aXZlVmlldy5zZXQobnVsbClcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtdKVxuXG4gIC8vIFJlY29uY2lsaWFjacOzbjogc2kgbGEgc2VzacOzbiBhY3RpdmEgdGVybWluYSAoY29tcGxldGUvZXJyb3IvY2FuY2VsbGVkKSBwZXJvIGVsXG4gIC8vIHN0b3JlIHBvci1zZXNpw7NuIHRvZGF2w61hIHRpZW5lIHVuIHBsYWNlaG9sZGVyIGRlIHN0cmVhbWluZywgcmVmcmVzY2Ftb3MgZGVzZGVcbiAgLy8gZWwgYmFja2VuZC4gVXNhbW9zIGVsIHN0b3JlIChubyBtZXNzYWdlc1JlZik6IGhhbmRsZVN0cmVhbUZpbmlzaCBsaW1waWEgZWxcbiAgLy8gcGxhY2Vob2xkZXIgYWjDrSBkZSBmb3JtYSBzw61uY3JvbmE7IG1lc3NhZ2VzUmVmIHB1ZWRlIHF1ZWRhciBzdGFsZSB1biByZW5kZXJcbiAgLy8gcG9ycXVlIHNldFN0YXR1cyAoWnVzdGFuZCkgeSByZW1vdmVNZXNzYWdlIChSZWFjdCkgbm8gYmF0Y2hhbiBqdW50b3MuXG4gIGNvbnN0IGFjdGl2ZVNlc3Npb25NZXRhID0gdXNlU2Vzc2lvbk1ldGEoYWN0aXZlU2Vzc2lvbklkKVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHN0YXR1cyA9IGFjdGl2ZVNlc3Npb25NZXRhPy5zdGF0dXNcbiAgICBpZiAoIXN0YXR1cykgcmV0dXJuXG4gICAgY29uc3QgaXNUZXJtaW5hbCA9IHN0YXR1cyA9PT0gJ2NvbXBsZXRlJyB8fCBzdGF0dXMgPT09ICdlcnJvcicgfHwgc3RhdHVzID09PSAnY2FuY2VsbGVkJ1xuICAgIGlmICghaXNUZXJtaW5hbCkgcmV0dXJuXG4gICAgY29uc3Qga2V5ID0gYCR7YWN0aXZlU2Vzc2lvbklkfToke3N0YXR1c306JHthY3RpdmVTZXNzaW9uTWV0YT8uZmluaXNoZWRBdCA/PyAnJ31gXG4gICAgaWYgKGxhc3RIYW5kbGVkVGVybWluYWxSZWYuY3VycmVudCA9PT0ga2V5KSByZXR1cm5cbiAgICBsYXN0SGFuZGxlZFRlcm1pbmFsUmVmLmN1cnJlbnQgPSBrZXlcblxuICAgIGNvbnN0IHRhaWwgPSB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuZ2V0TWVzc2FnZXMoYWN0aXZlU2Vzc2lvbklkKVxuICAgIGNvbnN0IGhhc1N0YWxlUGxhY2Vob2xkZXIgPSB0YWlsLnNvbWUobXNnID0+IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQobXNnLmlkKSlcbiAgICBpZiAoaGFzU3RhbGVQbGFjZWhvbGRlcikge1xuICAgICAgbG9hZE1lc3NhZ2VzKHsgZm9yY2U6IHRydWUgfSlcbiAgICB9XG4gIH0sIFthY3RpdmVTZXNzaW9uTWV0YT8uc3RhdHVzLCBhY3RpdmVTZXNzaW9uTWV0YT8uZmluaXNoZWRBdCwgYWN0aXZlU2Vzc2lvbklkLCBsb2FkTWVzc2FnZXNdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ2NoYXQtbG9hZGluZy1tZXNzYWdlcy1jaGFuZ2VkJywge1xuICAgICAgZGV0YWlsOiB7IGxvYWRpbmdNZXNzYWdlcyB9LFxuICAgIH0pXG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudClcbiAgfSwgW2xvYWRpbmdNZXNzYWdlc10pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaW5pdGlhbENoYXRJZCAmJiBpbml0aWFsQ2hhdElkICE9PSBjdXJyZW50Q2hhdElkLmN1cnJlbnQpIHtcbiAgICAgIC8vIE5PIGFib3J0YW1vcyBlbCBzdHJlYW0gYW50ZXJpb3I6IHB1ZWRlIHNlZ3VpciBnZW5lcmFuZG8gZW4gYmFja2dyb3VuZC5cbiAgICAgIC8vIFNvbG8gY2FtYmlhbW9zIGRlIHNlc2nDs24gYWN0aXZhOyBlbCBtb3RvciBydXRlYSBjYWRhIHN0cmVhbSBwb3Igc3VcbiAgICAgIC8vIHNlc3Npb25JZCwgYXPDrSBxdWUgbG9zIHRva2VucyBkZSBsYSBzZXNpw7NuIHByZXZpYSBzaWd1ZW4gYXBsaWPDoW5kb3NlIGFcbiAgICAgIC8vIEVTQSBzZXNpw7NuIChzdG9yZSksIG5vIGEgbGEgbnVldmEuXG5cbiAgICAgIC8vIExpbXBpYXIgY29udGV4dG8gZ2xvYmFsIGFsIGNhbWJpYXIgZGUgY29udmVyc2FjacOzblxuICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgICAgc2V0VGFzayhudWxsKVxuXG4gICAgICBjdXJyZW50Q2hhdElkLmN1cnJlbnQgPSBpbml0aWFsQ2hhdElkXG4gICAgICBzZXRBY3RpdmVTZXNzaW9uSWQoaW5pdGlhbENoYXRJZClcbiAgICAgIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5tYXJrVW5yZWFkKGluaXRpYWxDaGF0SWQsIGZhbHNlKVxuICAgICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gdXVpZHY0KClcbiAgICAgIGN1cnJlbnRVc2VyUXVlc3Rpb24uY3VycmVudCA9IG51bGxcbiAgICAgIHJlcG9ydGVkRXZlbnQuY3VycmVudCA9IGZhbHNlXG4gICAgICAvLyBpc1Byb2Nlc3NpbmdSZWYgcmVmbGVqYSBzaSBsYSBzZXNpw7NuIEFDVElWQSBlc3TDoSBvY3VwYWRhLiBTaSBsYSBzZXNpw7NuXG4gICAgICAvLyBhIGxhIHF1ZSBlbnRyYW1vcyBzaWd1ZSBnZW5lcmFuZG8gZW4gYmFja2dyb3VuZCwgcXVlZGEgYmxvcXVlYWRhOyBzaSBubyxcbiAgICAgIC8vIHNlIGhhYmlsaXRhIGVsIGVudsOtbyBhdW5xdWUgb3RyYXMgc2VzaW9uZXMgc2lnYW4gZ2VuZXJhbmRvLlxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBzZXNzaW9uU3RyZWFtTWFuYWdlci5pc0FjdGl2ZShpbml0aWFsQ2hhdElkKVxuICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG5cbiAgICAgIC8vIGxvYWRNZXNzYWdlcyBsbyBkaXNwYXJhIHVzZUNoYXRNZXNzYWdlcyBhbCBjYW1iaWFyIGNoYXRJZCAoY29uIGNhY2hlIGVuIG1lbW9yaWEpLlxuICAgIH1cbiAgfSwgW2luaXRpYWxDaGF0SWQsIHByb2plY3QsIHNldFByb2plY3QsIHNldENsaWVudCwgc2V0Q2hpcHNQcm9qZWN0LCBzZXRUYXNrXSlcblxuICBjb25zdCBoYW5kbGVTdHJlYW1FcnJvciA9IHVzZUNhbGxiYWNrKFxuICAgIChjdHg6IFN0cmVhbUNvbnRleHQsIGVycm9yTWVzc2FnZT86IHN0cmluZywgZXJyb3JSYXdNZXNzYWdlPzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHNlc3Npb25JZCwgbWVzc2FnZUlkLCBwbGFjZWhvbGRlcklkIH0gPSBjdHhcbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gYWN0aXZlVmlldy5pcyhzZXNzaW9uSWQpXG5cbiAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICAgIGRyb3BGcm9tU2Vzc2lvbihzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQpXG5cbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICBjbGVhclN0cmVhbVVpUmVmLmN1cnJlbnQoKVxuICAgICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgICBlcnJvck1lc3NhZ2UgPT09IFwiQWNjZXNzIGRlbmllZDogWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhpcyBhZ2VudFwiXG4gICAgICAgICAgPyB0KCdjaGF0LmVycm9yQWNjZXNzRGVuaWVkJylcbiAgICAgICAgICA6IGVycm9yTWVzc2FnZSA9PT0gJ2ludmFsaWRfcmVxdWVzdF9lcnJvcicgJiYgZXJyb3JSYXdNZXNzYWdlPy5pbmNsdWRlcygncHJvbXB0IGlzIHRvbyBsb25nJylcbiAgICAgICAgICAgID8gdCgnY2hhdC5lcnJvclByb21wdFRvb0xvbmcnLCB7IHVzZWQ6IGVycm9yUmF3TWVzc2FnZS5tYXRjaCgvKFxcZCspIHRva2Vucy8pPy5bMV0gPz8gJycgfSlcbiAgICAgICAgICAgIDogdCgnY2hhdC5lcnJvcicpXG5cbiAgICAgIGNvbW1pdFRvU2Vzc2lvbihzZXNzaW9uSWQsIHtcbiAgICAgICAgaWQ6IGBhbnN3ZXItJHttZXNzYWdlSWR9YCxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6ICdBc3Npc3RhbnQnIH0sXG4gICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICB9KVxuICAgICAgY2xlYXJTZXNzaW9uVGFpbChzZXNzaW9uSWQpXG5cbiAgICAgIGlmICghaXNBY3RpdmUpIHtcbiAgICAgICAgbm90aWZ5U2Vzc2lvbkZpbmlzaGVkSW5CYWNrZ3JvdW5kKHNlc3Npb25JZCwgJ2Vycm9yJylcbiAgICAgIH1cbiAgICB9LFxuICAgIFtjb21taXRUb1Nlc3Npb24sIGRyb3BGcm9tU2Vzc2lvbiwgY2xlYXJTZXNzaW9uVGFpbCwgdF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVN0cmVhbVVwZGF0ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChjdHg6IFN0cmVhbUNvbnRleHQsIGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQgfSA9IGN0eFxuXG4gICAgICAvLyBBc2VndXJhbW9zIGVsIHBsYWNlaG9sZGVyIHVuYSDDum5pY2EgdmV6IHBvciBzdHJlYW0sIHRhbnRvIGVuIGVsIHN0b3JlXG4gICAgICAvLyBkZSBsYSBzZXNpw7NuIGNvbW8gZW4gbGEgdmlzdGEgc2kgZXMgbGEgYWN0aXZhLiBFbCB0ZXh0byBlbiB2aXZvIHZpYWphXG4gICAgICAvLyBwb3Igc2Vzc2lvblN0cmVhbWluZ1RleHQgKGV4dGVybm8pLCBzaW4gcmUtcmVuZGVyIGRlbCDDoXJib2wgY29tcGxldG8uXG4gICAgICBjb25zdCBwbGFjZWhvbGRlckV4aXN0cyA9IHVzZVNlc3Npb25zU3RvcmVcbiAgICAgICAgLmdldFN0YXRlKClcbiAgICAgICAgLmdldE1lc3NhZ2VzKHNlc3Npb25JZClcbiAgICAgICAgLnNvbWUobXNnID0+IG1zZy5pZCA9PT0gcGxhY2Vob2xkZXJJZClcblxuICAgICAgaWYgKCFwbGFjZWhvbGRlckV4aXN0cykge1xuICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5zdGFydChzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQpXG4gICAgICAgIGNvbW1pdFRvU2Vzc2lvbihzZXNzaW9uSWQsIHtcbiAgICAgICAgICBpZDogcGxhY2Vob2xkZXJJZCxcbiAgICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiAnQXNzaXN0YW50JyB9LFxuICAgICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChhY3RpdmVWaWV3LmlzKHNlc3Npb25JZCkpIHtcbiAgICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gcGxhY2Vob2xkZXJJZFxuICAgICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IHNlc3Npb25JZFxuICAgICAgfVxuXG4gICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5zZXRUZXh0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCwgY29udGVudClcbiAgICB9LFxuICAgIFtjb21taXRUb1Nlc3Npb25dXG4gIClcblxuICBjb25zdCBoYW5kbGVTdHJlYW1GaW5pc2ggPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoXG4gICAgICBjdHg6IFN0cmVhbUNvbnRleHQsXG4gICAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgICBzb3VyY2VzOiBhbnksXG4gICAgICBtZW1vcnlTZXNzaW9uSWQ6IHN0cmluZyxcbiAgICAgIHJhd0F0dGFjaG1lbnRzPzogYW55W10gfCBudWxsLFxuICAgICAgc3VnZ2VzdGlvbnM/OiBzdHJpbmdbXSB8IG51bGwsXG4gICAgICBjb21wbGV0ZWRBZ2VudElkPzogc3RyaW5nIHwgbnVsbFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgeyBzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQgfSA9IGN0eFxuICAgICAgY29uc3QgaXNBY3RpdmUgPSBhY3RpdmVWaWV3LmlzKHNlc3Npb25JZClcblxuICAgICAgY29uc3QgdGVtcE1lc3NhZ2VJZCA9IHBsYWNlaG9sZGVySWRcbiAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICAgIGRyb3BGcm9tU2Vzc2lvbihzZXNzaW9uSWQsIHRlbXBNZXNzYWdlSWQpXG4gICAgICBjb25zdCBhdHRhY2htZW50cyA9IG5vcm1hbGl6ZUFzc2lzdGFudEF0dGFjaG1lbnRzKHJhd0F0dGFjaG1lbnRzKVxuXG4gICAgICAvLyBTZXNpw7NuIGVuIGJhY2tncm91bmQ6IGNlcnJhbW9zIGxlYW4uIEVsIGJhY2tlbmQgeWEgcGVyc2lzdGnDsyBsYVxuICAgICAgLy8gcmVzcHVlc3RhLCBhc8OtIHF1ZSBhbCB2b2x2ZXIgYSBsYSBzZXNpw7NuIHNlIGNhcmdhIGRlc2RlIGFow60uIEF2aXNhbW9zXG4gICAgICAvLyBxdWUgdGVybWluw7MgKHVucmVhZCArIGV2ZW50byBwYXJhIHRvYXN0L3NvbmlkbykuXG4gICAgICBpZiAoIWlzQWN0aXZlKSB7XG4gICAgICAgIGNvbW1pdFRvU2Vzc2lvbihzZXNzaW9uSWQsIHtcbiAgICAgICAgICBpZDogYGFuc3dlci0ke21lbW9yeVNlc3Npb25JZH1gLFxuICAgICAgICAgIG1lc3NhZ2U6IGNvbnRlbnQsXG4gICAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogJ0Fzc2lzdGFudCcgfSxcbiAgICAgICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgICAgIHNvdXJjZXMsXG4gICAgICAgICAgLi4uKGF0dGFjaG1lbnRzLmxlbmd0aCA+IDAgPyB7IGF0dGFjaG1lbnRzIH0gOiB7fSksXG4gICAgICAgICAgbWVtb3J5U2Vzc2lvbklkLFxuICAgICAgICAgIHN1Z2dlc3Rpb25zOiBzdWdnZXN0aW9ucyB8fCBbXSxcbiAgICAgICAgfSlcbiAgICAgICAgY2xlYXJTZXNzaW9uVGFpbChzZXNzaW9uSWQpXG4gICAgICAgIG5vdGlmeVNlc3Npb25GaW5pc2hlZEluQmFja2dyb3VuZChzZXNzaW9uSWQsICdjb21wbGV0ZScpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBudWxsXG5cbiAgICAgIC8vIERldGVjdGFyIHRvZGFzIGxhcyBVUkxzIGRlIHRhcmVhcyAoLi4uL3Rhc2tzLzEyMy9kZXRhaWx8bWVzc2FnZXxtZXNzYWdlc3xmaWxlc3xoaXN0b3J5fGhvdXJzKVxuICAgICAgY29uc3QgdGFza1VybFJlZ2V4ID0gbmV3IFJlZ0V4cChUQVNLX1VSTF9SRUdFWF9QQVRURVJOLCAnZycpXG4gICAgICBjb25zdCBtYXRjaGVzID0gWy4uLmNvbnRlbnQubWF0Y2hBbGwodGFza1VybFJlZ2V4KV1cblxuICAgICAgbGV0IGNvbnRlbnRUb0FkZCA9IGNvbnRlbnRcbiAgICAgIGNvbnN0IHByZXZpb3VzTWVzc2FnZSA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQuZmlsdGVyKG0gPT4gbS5pZCAhPT0gdGVtcE1lc3NhZ2VJZCkuYXQoLTEpXG4gICAgICBjb25zdCBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlID0gcHJldmlvdXNNZXNzYWdlPy5hcHByb3ZhbCAhPSBudWxsXG4gICAgICBjb25zdCBUQVNLX0NSRUFUSU9OX1RPT0xTID0gWydjcmVhdGVfdGFzaycsICdjcmVhdGVfdGFza3NfYmF0Y2gnLCAnY2xvbmVfdGFzayddXG4gICAgICBjb25zdCBUQVNLX0VESVRfVE9PTFMgPSBbXG4gICAgICAgICdlZGl0X3Rhc2snLFxuICAgICAgICAnZWRpdF90YXNrc19iYXRjaCcsXG4gICAgICAgICd0YXNrX2Fzc2lnbicsXG4gICAgICAgICd0YXNrX3VuYXNzaWduJyxcbiAgICAgICAgJ3VwZGF0ZV90YXNrX3R5cGUnLFxuICAgICAgICAndXBkYXRlX2VzdGltYXRlZF9ob3VycycsXG4gICAgICAgICdhc3NpZ25fdGFza19sYWJlbCcsXG4gICAgICBdXG4gICAgICBjb25zdCBUQVNLX0RFTEVURV9UT09MUyA9IFsnZGVsZXRlX3Rhc2snLCAnZGVsZXRlX3Rhc2tzX2JhdGNoJ11cbiAgICAgIGNvbnN0IHBlbmRpbmdBY3Rpb25zID0gcHJldmlvdXNNZXNzYWdlPy5hcHByb3ZhbD8ucGVuZGluZ19hY3Rpb25zIHx8IFtdXG4gICAgICBjb25zdCB3YXNUYXNrQ3JlYXRpb24gPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zLnNvbWUoKGFjdGlvbjogYW55KSA9PiBUQVNLX0NSRUFUSU9OX1RPT0xTLmluY2x1ZGVzKGFjdGlvbi50b29sX25hbWUpKVxuICAgICAgY29uc3Qgd2FzVGFza0VkaXQgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmIHBlbmRpbmdBY3Rpb25zLnNvbWUoKGFjdGlvbjogYW55KSA9PiBUQVNLX0VESVRfVE9PTFMuaW5jbHVkZXMoYWN0aW9uLnRvb2xfbmFtZSkpXG4gICAgICBjb25zdCB3YXNUYXNrRGVsZXRlID1cbiAgICAgICAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSAmJlxuICAgICAgICBwZW5kaW5nQWN0aW9ucy5zb21lKChhY3Rpb246IGFueSkgPT4gVEFTS19ERUxFVEVfVE9PTFMuaW5jbHVkZXMoYWN0aW9uLnRvb2xfbmFtZSkpXG4gICAgICBjb25zdCB3YXNDcmVhdGVBZ2VudEFwcHJvdmVkID1cbiAgICAgICAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSAmJlxuICAgICAgICBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsU3RhdHVzID09PSAnYXBwcm92ZWQnICYmXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zLnNvbWUoKGFjdGlvbjogYW55KSA9PiBhY3Rpb24udG9vbF9uYW1lID09PSAnY3JlYXRlX2FnZW50JylcbiAgICAgIGNvbnN0IHdhc0NvbmZpZ3VyZUFnZW50QWNjZXNzQXBwcm92ZWQgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgIHByZXZpb3VzTWVzc2FnZT8uYXBwcm92YWxTdGF0dXMgPT09ICdhcHByb3ZlZCcgJiZcbiAgICAgICAgcGVuZGluZ0FjdGlvbnMuc29tZSgoYWN0aW9uOiBhbnkpID0+IChhY3Rpb24udG9vbF9uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSAnY29uZmlndXJlX2FnZW50X2FjY2VzcycpXG4gICAgICBsZXQgY3JlYXRlQWdlbnRGb2xsb3dVcDogeyBhZ2VudElkOiBzdHJpbmcgfSB8IHVuZGVmaW5lZFxuICAgICAgaWYgKHdhc0NyZWF0ZUFnZW50QXBwcm92ZWQgJiYgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgJiYgY29tcGxldGVkQWdlbnRJZD8udHJpbSgpKSB7XG4gICAgICAgIGNyZWF0ZUFnZW50Rm9sbG93VXAgPSB7IGFnZW50SWQ6IGNvbXBsZXRlZEFnZW50SWQudHJpbSgpIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHdhc0NvbmZpZ3VyZUFnZW50QWNjZXNzQXBwcm92ZWQgJiZcbiAgICAgICAgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgJiZcbiAgICAgICAgKGNvbXBsZXRlZEFnZW50SWQ/LnRyaW0oKSB8fFxuICAgICAgICAgIGV4dHJhY3RBZ2VudElkRnJvbVBlbmRpbmdBY3Rpb25zQnlUb29sTmFtZShwZW5kaW5nQWN0aW9ucywgJ2NvbmZpZ3VyZV9hZ2VudF9hY2Nlc3MnKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBjb25maWd1cmVkQWdlbnRJZCA9XG4gICAgICAgICAgY29tcGxldGVkQWdlbnRJZD8udHJpbSgpIHx8XG4gICAgICAgICAgZXh0cmFjdEFnZW50SWRGcm9tUGVuZGluZ0FjdGlvbnNCeVRvb2xOYW1lKHBlbmRpbmdBY3Rpb25zLCAnY29uZmlndXJlX2FnZW50X2FjY2VzcycpXG4gICAgICAgIGNyZWF0ZUFnZW50Rm9sbG93VXAgPSB7XG4gICAgICAgICAgYWdlbnRJZDogY29uZmlndXJlZEFnZW50SWQgYXMgc3RyaW5nLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh3YXNDcmVhdGVBZ2VudEFwcHJvdmVkKSB7XG4gICAgICAgIGV2ZW50KEVWRU5UUy5haUNoYXRIaXRsT3B0aW9uLCB7XG4gICAgICAgICAgYWdlbnRfdHlwZTogZ2V0SGl0bEFuYWx5dGljc0FnZW50VHlwZShhZ2VudCksXG4gICAgICAgICAgYWN0aW9uX3R5cGU6IGJ1aWxkSGl0bEFjdGlvblR5cGVMaXN0KHBlbmRpbmdBY3Rpb25zKSxcbiAgICAgICAgICBkZWNpc2lvbjogJ2FjY2VwdCcsXG4gICAgICAgICAgb3B0aW9uOiAnY3JlYXRlX2FnZW50JyxcbiAgICAgICAgICAuLi4oY29tcGxldGVkQWdlbnRJZD8udHJpbSgpID8geyBjcmVhdGVkX2FnZW50X2lkOiBjb21wbGV0ZWRBZ2VudElkLnRyaW0oKSB9IDoge30pLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCB3YXNFZGl0QWdlbnRBcHByb3ZlZCA9XG4gICAgICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiZcbiAgICAgICAgcHJldmlvdXNNZXNzYWdlPy5hcHByb3ZhbFN0YXR1cyA9PT0gJ2FwcHJvdmVkJyAmJlxuICAgICAgICBwZW5kaW5nQWN0aW9ucy5zb21lKChhY3Rpb246IGFueSkgPT4gKGFjdGlvbi50b29sX25hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdlZGl0X2FnZW50JylcblxuICAgICAgbGV0IGVkaXRBZ2VudEZvbGxvd1VwOiB7IGFnZW50SWQ6IHN0cmluZyB9IHwgdW5kZWZpbmVkXG4gICAgICBpZiAod2FzRWRpdEFnZW50QXBwcm92ZWQpIHtcbiAgICAgICAgY29uc3QgZnJvbVN0cmVhbSA9IGNvbXBsZXRlZEFnZW50SWQ/LnRyaW0oKVxuICAgICAgICBjb25zdCBmcm9tQXJncyA9IGV4dHJhY3RBZ2VudElkRnJvbUVkaXRBZ2VudFBlbmRpbmdBY3Rpb25zKHBlbmRpbmdBY3Rpb25zKVxuICAgICAgICBjb25zdCByZXNvbHZlZEFnZW50SWQgPSBmcm9tU3RyZWFtIHx8IGZyb21BcmdzXG4gICAgICAgIGlmIChyZXNvbHZlZEFnZW50SWQpIHtcbiAgICAgICAgICBlZGl0QWdlbnRGb2xsb3dVcCA9IHsgYWdlbnRJZDogcmVzb2x2ZWRBZ2VudElkIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXNrSWRzRnJvbVVybHMgPSBtYXRjaGVzLm1hcChtYXRjaCA9PiBwYXJzZUludChtYXRjaFsxXSwgMTApKVxuICAgICAgY29uc3QgdGFza0lkc0Zyb21EZWxldGVBcHByb3ZhbCA9IGV4dHJhY3RUYXNrSWRzRnJvbURlbGV0ZVBlbmRpbmdBY3Rpb25zKHBlbmRpbmdBY3Rpb25zKVxuICAgICAgY29uc3QgdGFza0lkc0Zyb21EZWxldGlvblRleHQgPVxuICAgICAgICB3YXNUYXNrRGVsZXRlICYmIHRhc2tJZHNGcm9tVXJscy5sZW5ndGggPT09IDAgJiYgdGFza0lkc0Zyb21EZWxldGVBcHByb3ZhbC5sZW5ndGggPT09IDBcbiAgICAgICAgICA/IGV4dHJhY3RUYXNrSWRzRnJvbUFzc2lzdGFudERlbGV0aW9uVGV4dChjb250ZW50KVxuICAgICAgICAgIDogW11cbiAgICAgIGNvbnN0IHRhc2tJZHNGb3JEYXNoYm9hcmQgPVxuICAgICAgICB0YXNrSWRzRnJvbVVybHMubGVuZ3RoID4gMFxuICAgICAgICAgID8gdGFza0lkc0Zyb21VcmxzXG4gICAgICAgICAgOiB0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gdGFza0lkc0Zyb21EZWxldGVBcHByb3ZhbFxuICAgICAgICAgICAgOiB0YXNrSWRzRnJvbURlbGV0aW9uVGV4dFxuXG4gICAgICBjb25zdCBzaG91bGRTeW5jRGFzaGJvYXJkID1cbiAgICAgICAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSAmJlxuICAgICAgICAod2FzVGFza0NyZWF0aW9uIHx8IHdhc1Rhc2tFZGl0IHx8IHdhc1Rhc2tEZWxldGUpICYmXG4gICAgICAgIHRhc2tJZHNGb3JEYXNoYm9hcmQubGVuZ3RoID4gMFxuXG4gICAgICBpZiAoc2hvdWxkU3luY0Rhc2hib2FyZCkge1xuICAgICAgICBjb25zdCB0YXNrSWRzID0gdGFza0lkc0ZvckRhc2hib2FyZFxuICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdGFiID0gYXdhaXQgZ2V0VGFiVGFza0RlZmF1bHQodGFza0lkc1swXSlcbiAgICAgICAgICBjb25zdCB0YWJTZWdtZW50ID0gdGFiID8gYC8ke3RhYn1gIDogJy9kZXRhaWwnXG4gICAgICAgICAgY29udGVudFRvQWRkID0gY29udGVudC5yZXBsYWNlKHRhc2tVcmxSZWdleCwgdXJsID0+XG4gICAgICAgICAgICB1cmwucmVwbGFjZSgvXFwvKGRldGFpbHxtZXNzYWdlfG1lc3NhZ2VzfGZpbGVzfGhpc3Rvcnl8aG91cnMpKD89JHxcXD8pLywgdGFiU2VnbWVudClcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYXN0UHJvamVjdE1lc3NhZ2UgPSBtZXNzYWdlc1JlZi5jdXJyZW50LmZpbHRlcihtc2cgPT4gbXNnLnByb2plY3RJZCkuYXQoLTEpXG4gICAgICAgIGNvbnN0IGNvbnRleHRQcm9qZWN0SWRSYXcgPSBwcm9qZWN0Py5pZCB8fCBsYXN0UHJvamVjdE1lc3NhZ2U/LnByb2plY3RJZFxuICAgICAgICBjb25zdCBjb250ZXh0UHJvamVjdElkID0gY29udGV4dFByb2plY3RJZFJhdyA/IHBhcnNlSW50KFN0cmluZyhjb250ZXh0UHJvamVjdElkUmF3KSwgMTApIDogbnVsbFxuICAgICAgICBjb25zdCBwYXRoTWF0Y2ggPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUubWF0Y2goL15cXC9wcm9qZWN0c1xcLyhcXGQrKVxcLy8pXG4gICAgICAgIGNvbnN0IHJvdXRlUHJvamVjdElkID0gcGF0aE1hdGNoID8gcGFyc2VJbnQocGF0aE1hdGNoWzFdLCAxMCkgOiBudWxsXG4gICAgICAgIGNvbnN0IGlzT25Qcm9qZWN0Um91dGUgPSBjb250ZXh0UHJvamVjdElkICYmIHJvdXRlUHJvamVjdElkICYmIGNvbnRleHRQcm9qZWN0SWQgPT09IHJvdXRlUHJvamVjdElkXG5cbiAgICAgICAgaWYgKGlzT25Qcm9qZWN0Um91dGUpIHtcbiAgICAgICAgICBpZiAod2FzVGFza0NyZWF0aW9uKSB7XG4gICAgICAgICAgICB3aW5kb3cubmV3UHJvamVjdERhc2hib2FyZD8uYWRkRXhpc3RpbmdUYXNrVG9EYXNoYm9hcmQ/Lih0YXNrSWRzKVxuICAgICAgICAgIH0gZWxzZSBpZiAod2FzVGFza0VkaXQpIHtcbiAgICAgICAgICAgIHdpbmRvdy5uZXdQcm9qZWN0RGFzaGJvYXJkPy5lZGl0RXhpc3RpbmdUYXNrSW5EYXNoYm9hcmQ/Lih0YXNrSWRzKVxuICAgICAgICAgIH0gZWxzZSBpZiAod2FzVGFza0RlbGV0ZSkge1xuICAgICAgICAgICAgd2luZG93Lm5ld1Byb2plY3REYXNoYm9hcmQ/LmRlbGV0ZUV4aXN0aW5nVGFza0Zyb21EYXNoYm9hcmQ/Lih0YXNrSWRzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZWZldGNoIGRlbCB0YXNrIHBhbmVsIHNpIGVzdMOhIGFiaWVydG8geSBsYSB0b29sIGFwcm9iYWRhIGVkaXTDsy9ib3Jyw7MgZXNhIHRhcmVhLlxuICAgICAgLy8gQ3VicmUgbG9zIGRvcyBmbHVqb3MgZGUgYXBwcm92YWw6XG4gICAgICAvLyAgIDEpIEFwcHJvdmFsIHBvciBib3TDs24g4oaSIGBwcmV2aW91c01lc3NhZ2UuYXBwcm92YWwucGVuZGluZ19hY3Rpb25zYCAodsOtYSBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlKVxuICAgICAgLy8gICAyKSBNYW51YWwgYXBwcm92YWwgKHVzdWFyaW8gdGlwZWEgXCJzaVwiL1wibm9cIikg4oaSIGBsYXN0TWFudWFsQXBwcm92YWxSZWYuY3VycmVudGBcbiAgICAgIGNvbnN0IG9wZW5UYXNrUGFuZWxJZCA9IHdpbmRvdy50YXNrUGFuZWw/LnRhc2tJZFxuICAgICAgY29uc3QgbWFudWFsQXBwcm92YWwgPSBsYXN0TWFudWFsQXBwcm92YWxSZWYuY3VycmVudFxuICAgICAgbGFzdE1hbnVhbEFwcHJvdmFsUmVmLmN1cnJlbnQgPSBudWxsIC8vIGNvbnN1bWlyIHVuYSBzb2xhIHZlelxuICAgICAgY29uc3QgbWFudWFsV2FzVGFza0VkaXQgPSAhIW1hbnVhbEFwcHJvdmFsICYmIFRBU0tfRURJVF9UT09MUy5pbmNsdWRlcyhtYW51YWxBcHByb3ZhbC50b29sTmFtZSlcbiAgICAgIGNvbnN0IG1hbnVhbFdhc1Rhc2tEZWxldGUgPSAhIW1hbnVhbEFwcHJvdmFsICYmIFRBU0tfREVMRVRFX1RPT0xTLmluY2x1ZGVzKG1hbnVhbEFwcHJvdmFsLnRvb2xOYW1lKVxuXG4gICAgICBpZiAob3BlblRhc2tQYW5lbElkICYmICh3YXNUYXNrRWRpdCB8fCB3YXNUYXNrRGVsZXRlIHx8IG1hbnVhbFdhc1Rhc2tFZGl0IHx8IG1hbnVhbFdhc1Rhc2tEZWxldGUpKSB7XG4gICAgICAgIGNvbnN0IG1hbnVhbFBzZXVkb0FjdGlvbjogUGVuZGluZ0FjdGlvbiB8IG51bGwgPSBtYW51YWxBcHByb3ZhbFxuICAgICAgICAgID8gKHsgdG9vbF9uYW1lOiBtYW51YWxBcHByb3ZhbC50b29sTmFtZSwgdG9vbF9hcmdzOiBtYW51YWxBcHByb3ZhbC50b29sQXJncyA/PyB7fSB9IGFzIFBlbmRpbmdBY3Rpb24pXG4gICAgICAgICAgOiBudWxsXG4gICAgICAgIGNvbnN0IGFmZmVjdGVkVGFza0lkcyA9IFtcbiAgICAgICAgICAuLi5leHRyYWN0VGFza0lkc0Zyb21QZW5kaW5nQWN0aW9uc0FyZ3MocGVuZGluZ0FjdGlvbnMpLFxuICAgICAgICAgIC4uLnRhc2tJZHNGcm9tVXJscyxcbiAgICAgICAgICAuLi50YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsLFxuICAgICAgICAgIC4uLihtYW51YWxQc2V1ZG9BY3Rpb24gPyBleHRyYWN0VGFza0lkc0Zyb21QZW5kaW5nQWN0aW9uc0FyZ3MoW21hbnVhbFBzZXVkb0FjdGlvbl0pIDogW10pLFxuICAgICAgICBdLm1hcChTdHJpbmcpXG4gICAgICAgIGlmIChhZmZlY3RlZFRhc2tJZHMuaW5jbHVkZXMoU3RyaW5nKG9wZW5UYXNrUGFuZWxJZCkpKSB7XG4gICAgICAgICAgd2luZG93LnRhc2tQYW5lbD8ucmVmZXRjaFRhc2s/LigpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29tbWl0VG9TZXNzaW9uKHNlc3Npb25JZCwge1xuICAgICAgICBpZDogYGFuc3dlci0ke21lbW9yeVNlc3Npb25JZH1gLFxuICAgICAgICBtZXNzYWdlOiBjb250ZW50VG9BZGQsXG4gICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiAnQXNzaXN0YW50JyB9LFxuICAgICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgICBzb3VyY2VzLFxuICAgICAgICAuLi4oYXR0YWNobWVudHMubGVuZ3RoID4gMCA/IHsgYXR0YWNobWVudHMgfSA6IHt9KSxcbiAgICAgICAgbWVtb3J5U2Vzc2lvbklkLFxuICAgICAgICBzdWdnZXN0aW9uczogc3VnZ2VzdGlvbnMgfHwgW10sXG4gICAgICAgIC4uLihjcmVhdGVBZ2VudEZvbGxvd1VwID8geyBjcmVhdGVBZ2VudEZvbGxvd1VwIH0gOiB7fSksXG4gICAgICB9KVxuICAgICAgY2xlYXJTZXNzaW9uVGFpbChzZXNzaW9uSWQpXG5cbiAgICAgIGlmIChjcmVhdGVBZ2VudEZvbGxvd1VwPy5hZ2VudElkKSB7XG4gICAgICAgIGZldGNoQWdlbnREZXRhaWwoY3JlYXRlQWdlbnRGb2xsb3dVcC5hZ2VudElkKVxuICAgICAgICAgIC50aGVuKGNoYXRBZ2VudCA9PiB7XG4gICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ21haWEtbWVyZ2UtY3JlYXRlZC1hZ2VudC1pbnRvLWxpc3QnLCB7XG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7IGFnZW50OiBjaGF0QWdlbnQgfSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW3VzZUNoYXRNYW5hZ2VyXSBObyBzZSBwdWRvIGHDsWFkaXIgZWwgYWdlbnRlIHJlY2nDqW4gY3JlYWRvIGFsIGxpc3RhZG8nLCBlcnIpXG4gICAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGVkaXRBZ2VudEZvbGxvd1VwPy5hZ2VudElkKSB7XG4gICAgICAgIGZldGNoQWdlbnREZXRhaWwoZWRpdEFnZW50Rm9sbG93VXAuYWdlbnRJZClcbiAgICAgICAgICAudGhlbihjaGF0QWdlbnQgPT4ge1xuICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdtYWlhLXN5bmMtZWRpdGVkLWFnZW50LWZyb20tY2hhdCcsIHtcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHsgYWdlbnQ6IGNoYXRBZ2VudCB9LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbdXNlQ2hhdE1hbmFnZXJdIE5vIHNlIHB1ZG8gcmVmcmVzY2FyIGVsIGFnZW50ZSBlZGl0YWRvJywgZXJyKVxuICAgICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIGlmIChmaXJzdFRpbWVSZWYuY3VycmVudCkge1xuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudCgncmVmZXRjaC1zZXNzaW9uJylcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudClcbiAgICAgICAgZmlyc3RUaW1lUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgfVxuICAgIH0sXG4gICAgW2NvbW1pdFRvU2Vzc2lvbiwgZHJvcEZyb21TZXNzaW9uLCBjbGVhclNlc3Npb25UYWlsLCBwcm9qZWN0LCBnZXRUYWJUYXNrRGVmYXVsdCwgZXZlbnQsIGFnZW50XVxuICApXG5cbiAgY29uc3QgaGFuZGxlU3RyZWFtU3RvcCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAvLyBFbCBzdG9wIHNpZW1wcmUgYXBsaWNhIGEgbGEgc2VzacOzbiBhY3RpdmEgKGJvdMOzbiBkZWwgaW5wdXQgdmlzaWJsZSkuXG4gICAgY29uc3Qgc2Vzc2lvbklkID0gY3VycmVudENoYXRJZC5jdXJyZW50XG4gICAgY2xlYXJTdHJlYW1VaVJlZi5jdXJyZW50KClcbiAgICBjb25zdCB0ZW1wTWVzc2FnZUlkID0gYGFuc3dlci0ke2N1cnJlbnRNZXNzYWdlSWQuY3VycmVudH0tc3RyZWFtaW5nYFxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgZHJvcEZyb21TZXNzaW9uKHNlc3Npb25JZCwgdGVtcE1lc3NhZ2VJZClcblxuICAgIGNvbW1pdFRvU2Vzc2lvbihzZXNzaW9uSWQsIHtcbiAgICAgIGlkOiBgYW5zd2VyLSR7Y3VycmVudE1lc3NhZ2VJZC5jdXJyZW50fS1jYW5jZWxsZWRgLFxuICAgICAgbWVzc2FnZTogdCgnY2hhdC5jYW5jZWxsZWQnKSxcbiAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogJ0Fzc2lzdGFudCcgfSxcbiAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICBpc0Zyb250ZW5kQ2FuY2VsbGVkOiB0cnVlLFxuICAgIH0pXG4gICAgY2xlYXJTZXNzaW9uVGFpbChzZXNzaW9uSWQpXG4gICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3JlZmV0Y2gtc2Vzc2lvbicpXG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KVxuICAgIH0sIDUwMClcbiAgfSwgW2NvbW1pdFRvU2Vzc2lvbiwgZHJvcEZyb21TZXNzaW9uLCBjbGVhclNlc3Npb25UYWlsLCB0XSlcblxuICBjb25zdCBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkID0gdXNlQ2FsbGJhY2soXG4gICAgKGN0eDogU3RyZWFtQ29udGV4dCwgYXBwcm92YWw6IEFwcHJvdmFsUmVxdWVzdCwgYWNjdW11bGF0ZWRDb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkIH0gPSBjdHhcbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gYWN0aXZlVmlldy5pcyhzZXNzaW9uSWQpXG5cbiAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICAgIGRyb3BGcm9tU2Vzc2lvbihzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQpXG5cbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgfVxuXG4gICAgICBjb25zdCBoaXRsQ29udGV4dDogSGl0bEV4ZWN1dGlvbkNvbnRleHQgPSB7XG4gICAgICAgIG1lc3NhZ2VJZDogYGFwcHJvdmFsLSR7YXBwcm92YWwub3JpZ2luYWxfdGhyZWFkX2lkfWAsXG4gICAgICAgIG1lc3NhZ2VUZXh0OiBhY2N1bXVsYXRlZENvbnRlbnQgfHwgJycsXG4gICAgICAgIGFwcHJvdmFsLFxuICAgICAgICBwZW5kaW5nQWN0aW9uczogYXBwcm92YWwucGVuZGluZ19hY3Rpb25zLFxuICAgICAgICB0aHJlYWRJZHM6IGFwcHJvdmFsLnBlbmRpbmdfYWN0aW9ucz8ubWFwKGFjdGlvbiA9PiBhY3Rpb24udGhyZWFkX2lkKSxcbiAgICAgIH1cbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZi5jdXJyZW50ID0gaGl0bENvbnRleHRcbiAgICAgIH1cblxuICAgICAgaWYgKGFwcHJvdmFsLm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZCkge1xuICAgICAgICBjb25zdCBmaXJzdEFjdGlvbiA9IGFwcHJvdmFsLnBlbmRpbmdfYWN0aW9ucz8uWzBdXG4gICAgICAgIGNvbnN0IHRvb2xOYW1lID0gKGFwcHJvdmFsIGFzIHsgdG9vbF9uYW1lPzogc3RyaW5nIH0pLnRvb2xfbmFtZSA/PyBmaXJzdEFjdGlvbj8udG9vbF9uYW1lID8/ICcnXG4gICAgICAgIGNvbnN0IHRvb2xBcmdzID1cbiAgICAgICAgICAoKGFwcHJvdmFsIGFzIHsgdG9vbF9hcmdzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSkudG9vbF9hcmdzID8/XG4gICAgICAgICAgICAoZmlyc3RBY3Rpb24/LnRvb2xfYXJncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCkpIHx8XG4gICAgICAgICAgbnVsbFxuICAgICAgICBpZiAodG9vbE5hbWUgJiYgaXNBY3RpdmUpIHtcbiAgICAgICAgICBsYXN0TWFudWFsQXBwcm92YWxSZWYuY3VycmVudCA9IHsgdG9vbE5hbWUsIHRvb2xBcmdzIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBhIG1lc3NhZ2Ugd2l0aCB0aGUgYXBwcm92YWwgcmVxdWVzdFxuICAgICAgY29tbWl0VG9TZXNzaW9uKHNlc3Npb25JZCwge1xuICAgICAgICBpZDogYGFwcHJvdmFsLSR7YXBwcm92YWwub3JpZ2luYWxfdGhyZWFkX2lkfWAsXG4gICAgICAgIG1lc3NhZ2U6IGFjY3VtdWxhdGVkQ29udGVudCB8fCAnJyxcbiAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6ICdBc3Npc3RhbnQnIH0sXG4gICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICAgIGFwcHJvdmFsLFxuICAgICAgICBhcHByb3ZhbFN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgfSlcbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub3RpZnlTZXNzaW9uRmluaXNoZWRJbkJhY2tncm91bmQoc2Vzc2lvbklkLCAnYXBwcm92YWxfcmVxdWlyZWQnKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2NvbW1pdFRvU2Vzc2lvbiwgZHJvcEZyb21TZXNzaW9uXVxuICApXG5cbiAgY29uc3Qge1xuICAgIGFza01haWEsXG4gICAgaXNMb2FkaW5nOiB3YWl0aW5nUmVzcG9uc2UsXG4gICAgaXNXcml0aW5nLFxuICAgIGxvYWRpbmdNZXNzYWdlLFxuICAgIHN0cmVhbUFjdGl2aXR5LFxuICAgIHVwZGF0ZVN0cmVhbUFjdGl2aXR5LFxuICAgIHN0b3BTdHJlYW1pbmcsXG4gIH0gPSB1c2VPcmNoZXN0cmF0b3JTdHJlYW0oe1xuICAgIGFjdGl2ZVNlc3Npb25JZCxcbiAgICBvbkVycm9yOiBoYW5kbGVTdHJlYW1FcnJvcixcbiAgICBvblN0cmVhbVVwZGF0ZTogaGFuZGxlU3RyZWFtVXBkYXRlLFxuICAgIG9uRmluaXNoU3RyZWFtOiBoYW5kbGVTdHJlYW1GaW5pc2gsXG4gICAgb25TdG9wOiBoYW5kbGVTdHJlYW1TdG9wLFxuICAgIG9uQXBwcm92YWxSZXF1aXJlZDogaGFuZGxlQXBwcm92YWxSZXF1aXJlZCxcbiAgICBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZixcbiAgfSlcblxuICBjbGVhclN0cmVhbVVpUmVmLmN1cnJlbnQgPSAoKSA9PiB7XG4gICAgdXBkYXRlU3RyZWFtQWN0aXZpdHkobnVsbClcbiAgICBzZXRBY3RpdmVMb2FkaW5ncyh7fSlcbiAgICBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZi5jdXJyZW50ID0gbnVsbFxuICB9XG5cbiAgY29uc3QgY3VycmVudFByb2plY3QgPSBwcm9qZWN0XG5cbiAgY29uc3Qgc2VuZE1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBhdHRhY2htZW50c09yT3B0aW9ucz86IEF0dGFjaG1lbnRGaWxlW10gfCBTZW5kTWVzc2FnZU9wdGlvbnMsXG4gICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nLFxuICAgICAgbWVudGlvbnM/OiBDb250ZXh0TWVudGlvbltdLFxuICAgICAgZnVhSWQ/OiBzdHJpbmcsXG4gICAgICBzY0lkPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgfHwgd2FpdGluZ1Jlc3BvbnNlIHx8IGxvYWRpbmdNZXNzYWdlcykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gVG9wZSBkZSBjb25jdXJyZW5jaWE6IHNpIGVzdGEgc2VzacOzbiBubyBlc3TDoSBnZW5lcmFuZG8geSB5YSBoYXlcbiAgICAgIC8vIE1BWF9DT05DVVJSRU5UX1NUUkVBTVMgYWN0aXZhcywgYXZpc2Ftb3MgeSBubyBhcnJhbmNhbW9zIG90cmEuXG4gICAgICBjb25zdCB3aWxsU3RhcnROZXdTdHJlYW0gPSAhc2Vzc2lvblN0cmVhbU1hbmFnZXIuaXNBY3RpdmUoY3VycmVudENoYXRJZC5jdXJyZW50KVxuICAgICAgaWYgKHdpbGxTdGFydE5ld1N0cmVhbSAmJiBzZXNzaW9uU3RyZWFtTWFuYWdlci5nZXRBY3RpdmVDb3VudCgpID49IE1BWF9DT05DVVJSRU5UX1NUUkVBTVMpIHtcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3NuYWNrYmFyLWV2ZW50Jywge1xuICAgICAgICAgICAgZGV0YWlsOiB7IHNob3c6IHRydWUsIHNldmVyaXR5OiAnaW5mbycsIG1lc3NhZ2U6IHQoJ2NoYXQudG9vTWFueUFjdGl2ZVNlc3Npb25zJykgfSxcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGF0dGFjaG1lbnRzLCBvcHRpb25zIH0gPSBub3JtYWxpemVTZW5kTWVzc2FnZUFyZ3MoYXR0YWNobWVudHNPck9wdGlvbnMpXG4gICAgICAvLyBMYXMgbWVudGlvbnMgcHVlZGVuIHZlbmlyIHbDrWEgNXRvIHBhcsOhbWV0cm8gKGNhbGwgcG9zaXRpb25hbCBkZXNkZSBlbCBmb290ZXIpXG4gICAgICAvLyBvIHbDrWEgU2VuZE1lc3NhZ2VPcHRpb25zIChjYWxsIHByb2dyYW3DoXRpY28pLiBFbCBwYXLDoW1ldHJvIGV4cGzDrWNpdG8gZ2FuYS5cbiAgICAgIGNvbnN0IGVmZmVjdGl2ZU1lbnRpb25zID0gbWVudGlvbnMgPz8gb3B0aW9ucy5tZW50aW9uc1xuICAgICAgY29uc3QgY29udGV4dE1lc3NhZ2U6IENvbnRleHRNZXNzYWdlIHwgdW5kZWZpbmVkID0gYnVpbGRDb250ZXh0TWVzc2FnZShlZmZlY3RpdmVNZW50aW9ucylcbiAgICAgIGNvbnN0IHBheWxvYWRGdWFJZCA9IGZ1YUlkID8/IG9wdGlvbnMuZnVhSWRcbiAgICAgIGNvbnN0IHBheWxvYWRTY0lkID0gc2NJZCA/PyBvcHRpb25zLnNjSWRcbiAgICAgIGNvbnN0IHBheWxvYWRDb250ZXh0RGF0YSA9IG9wdGlvbnMuY29udGV4dERhdGFcbiAgICAgIGNvbnN0IGRpc3BsYXlNZXNzYWdlID0gZm9ybWF0UXVpY2tBY3Rpb25NZXNzYWdlRm9yRGlzcGxheShtZXNzYWdlLCB7XG4gICAgICAgIGZ1YUlkOiBwYXlsb2FkRnVhSWQsXG4gICAgICAgIHNjSWQ6IHBheWxvYWRTY0lkLFxuICAgICAgfSlcblxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICBjb25zdCBuZXdNZXNzYWdlSWQgPSB1dWlkdjQoKVxuICAgICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gbmV3TWVzc2FnZUlkXG4gICAgICBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQgPSBtZXNzYWdlXG5cbiAgICAgIGlmICghcmVwb3J0ZWRFdmVudC5jdXJyZW50KSB7XG4gICAgICAgIGV2ZW50KEVWRU5UUy5wbUFpVHlwZWRUZXh0KVxuICAgICAgICByZXBvcnRlZEV2ZW50LmN1cnJlbnQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmaWNhciBzaSBlbCBjb250ZXh0byBnbG9iYWwgZXN0w6EgZGVzYWN0dWFsaXphZG9cbiAgICAgIGNvbnN0IGxhc3RNZXNzYWdlV2l0aFByb2plY3QgPSBtZXNzYWdlc1JlZi5jdXJyZW50LmZpbHRlcihtc2cgPT4gbXNnLnByb2plY3RJZCkuYXQoLTEpXG5cbiAgICAgIGNvbnN0IGN1cnJlbnRBZ2VudEZyb21NZXNzYWdlcyA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQ/LlttZXNzYWdlc1JlZi5jdXJyZW50Lmxlbmd0aCAtIDFdPy5hZ2VudElkXG5cbiAgICAgIGNvbnN0IHNlc3Npb25JZCA9IGN1cnJlbnRDaGF0SWQuY3VycmVudFxuICAgICAgY29uc3Qge1xuICAgICAgICBjaGlwc1Byb2plY3Q6IGN0eENoaXBzUHJvamVjdCxcbiAgICAgICAgcHJvamVjdDogY3R4UHJvamVjdCxcbiAgICAgICAgY2xpZW50OiBjdHhDbGllbnQsXG4gICAgICAgIHRhc2s6IGN0eFRhc2ssXG4gICAgICB9ID0gY29udGV4dFJlZi5jdXJyZW50XG5cbiAgICAgIC8vIE5vIGFncmVnYXIgcHJvamVjdElkIGFsIG1lbnNhamUgZGVsIHVzdWFyaW8gLSBzZSBkZXRlcm1pbmFyw6EgZGVzcHXDqXNcbiAgICAgIGNvbW1pdFRvU2Vzc2lvbihzZXNzaW9uSWQsIHtcbiAgICAgICAgaWQ6IGBxdWVzdGlvbi0ke2N1cnJlbnRNZXNzYWdlSWQuY3VycmVudH1gLFxuICAgICAgICBtZXNzYWdlOiBkaXNwbGF5TWVzc2FnZSxcbiAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgdXNlcjogY3VycmVudFVzZXIsXG4gICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5VU0VSLFxuICAgICAgICBzb3VyY2VzOiBhdHRhY2htZW50cyxcbiAgICAgICAgLi4uKGNvbnRleHRNZXNzYWdlID8geyBjb250ZXh0TWVzc2FnZSB9IDoge30pLFxuICAgICAgfSlcblxuICAgICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gdXVpZHY0KClcblxuICAgICAgY29uc3Qgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZCA9IGBhbnN3ZXItJHtjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnR9LXN0cmVhbWluZ2BcbiAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IHN0cmVhbWluZ1BsYWNlaG9sZGVySWRcbiAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gc2Vzc2lvbklkXG4gICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5zdGFydChzZXNzaW9uSWQsIHN0cmVhbWluZ1BsYWNlaG9sZGVySWQpXG4gICAgICBjb21taXRUb1Nlc3Npb24oc2Vzc2lvbklkLCB7XG4gICAgICAgIGlkOiBzdHJlYW1pbmdQbGFjZWhvbGRlcklkLFxuICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6IGFnZW50Py5uYW1lIHx8ICdBc3Npc3RhbnQnIH0sXG4gICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICB9KVxuXG4gICAgICBsZXQgZmluYWxNZXNzYWdlID0gbWVzc2FnZVxuXG4gICAgICBpZiAobWVzc2FnZSA9PT0gdCgncWEuaXRlbXMucmVudGFiaWxpZGFkX3Byb3llY3RvJykpIHtcbiAgICAgICAgZmluYWxNZXNzYWdlID0gYEZBUTogJHt0KCdxYS5pdGVtcy5yZW50YWJpbGlkYWRfcHJveWVjdG8nKX0gLSBUaXBvIGRlIHJlbnRhYmlsaWRhZDogJHtcbiAgICAgICAgICBvcHRpb25zLnByb2plY3RDaGFuZ2VkPy5pbmNvbWVUeXBlIHx8IGNvbnRleHRSZWYuY3VycmVudC5wcm9qZWN0Py5pbmNvbWVUeXBlXG4gICAgICAgIH1gXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhpc3RvcnkgPSBtZXNzYWdlc1JlZi5jdXJyZW50Lm1hcChoaXN0b3J5TWVzc2FnZSA9PiAoe1xuICAgICAgICBjb250ZW50OiBoaXN0b3J5TWVzc2FnZS5tZXNzYWdlLFxuICAgICAgICByb2xlOiBoaXN0b3J5TWVzc2FnZS51c2VyLmlkID09PSBhdXRoVXNlci5pZC50b1N0cmluZygpID8gQ2hhdEhpc3RvcnlSb2xlLlVTRVIgOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgfSkpXG5cbiAgICAgIGNvbnN0IGxhc3RNZXNzYWdlUHJvamVjdElkID0gbGFzdE1lc3NhZ2VXaXRoUHJvamVjdD8ucHJvamVjdElkXG4gICAgICBjb25zdCBwcm9qZWN0VG9SZXF1ZXN0ID0gcmVzb2x2ZVByb2plY3RUb1JlcXVlc3QoY3R4Q2hpcHNQcm9qZWN0LCBsYXN0TWVzc2FnZVByb2plY3RJZClcblxuICAgICAgY29uc29sZS5pbmZvKCdbdXNlQ2hhdE1hbmFnZXJdIHNlbmRNZXNzYWdlIGNvbnRleHQgcmVzb2x1dGlvbjonLCB7XG4gICAgICAgIGNoaXBzUHJvamVjdDogY3R4Q2hpcHNQcm9qZWN0LFxuICAgICAgICBjaGlwc1Byb2plY3RJZDogY3R4Q2hpcHNQcm9qZWN0Py5wcm9qZWN0SWQgPyBOdW1iZXIoY3R4Q2hpcHNQcm9qZWN0LnByb2plY3RJZCkgOiBudWxsLFxuICAgICAgICBsYXN0TWVzc2FnZVByb2plY3RJZCxcbiAgICAgICAgcHJvamVjdFRvUmVxdWVzdCxcbiAgICAgICAgY2xpZW50SWQ6IGN0eENsaWVudD8uaWQsXG4gICAgICAgIHRhc2tJZDogY3R4VGFzaz8uaWQsXG4gICAgICAgIHByb2plY3RQcm9wSWQ6IGN0eFByb2plY3Q/LmlkLFxuICAgICAgICBhZ2VudFR5cGU6IGFnZW50Py50eXBlLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmZXRjaFByb2plY3RzKFtwcm9qZWN0VG9SZXF1ZXN0XSlcblxuICAgICAgY29uc3QgcGF5bG9hZEZhcUlkID0gZmFxSWQgPz8gb3B0aW9ucy5mYXFJZFxuICAgICAgY29uc3QgcGF5bG9hZEFnZW50U3VnZ2VzdGlvbklkID0gYWdlbnRTdWdnZXN0aW9uSWQgPz8gb3B0aW9ucy5hZ2VudFN1Z2dlc3Rpb25JZFxuXG4gICAgICBjb25zdCBwYXlsb2FkRGF0YSA9IHtcbiAgICAgICAgbWVzc2FnZTogZmluYWxNZXNzYWdlLFxuICAgICAgICBoaXN0b3J5LFxuICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RUb1JlcXVlc3QsXG4gICAgICAgIGxhbmc6IGF1dGhVc2VyLmxhbmcsXG4gICAgICAgIHVzZXJJZDogYXV0aFVzZXIuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgZmlyc3ROYW1lOiBhdXRoVXNlci5maXJzdE5hbWUsXG4gICAgICAgIGxhc3ROYW1lOiBhdXRoVXNlci5sYXN0TmFtZSxcbiAgICAgICAgY29tcGFueUlkOiBhdXRoVXNlci5jb21wYW55X2lkLnRvU3RyaW5nKCksXG4gICAgICAgIGNoYXRJZDogY3VycmVudENoYXRJZC5jdXJyZW50LFxuICAgICAgICBtZXNzYWdlSWQ6IGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCxcbiAgICAgICAgYWdlbnROYW1lOiBhZ2VudD8ubmFtZSB8fCAnJyxcbiAgICAgICAgYWdlbnRJZDogY3VycmVudEFnZW50RnJvbU1lc3NhZ2VzIHx8IGFnZW50Py5pZCEsXG4gICAgICAgIGlzV2ViU2VhcmNoQWN0aXZlOiBpc1dlYlNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICBpc0RlZXBTZWFyY2hBY3RpdmU6IGlzRGVlcFNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICAuLi4oY3R4UHJvamVjdD8uZmVlSWQgIT0gbnVsbCA/IHsgZmVlSWQ6IE51bWJlcihjdHhQcm9qZWN0LmZlZUlkKSB9IDoge30pLFxuICAgICAgICAuLi5yZXNvbHZlQ2xpZW50UGF5bG9hZChjdHhDbGllbnQsIGN0eFByb2plY3QpLFxuICAgICAgICAuLi4ocHJvamVjdHM/Lmxlbmd0aCA/IHsgcHJvamVjdE5hbWU6IHByb2plY3RzWzBdLm5hbWUgfSA6IHt9KSxcbiAgICAgICAgLi4uKGN0eFRhc2s/LmlkICE9IG51bGxcbiAgICAgICAgICA/IHsgdGFza0lkOiBOdW1iZXIoY3R4VGFzay5pZCksIC4uLihjdHhUYXNrLm5hbWUgPyB7IHRhc2tOYW1lOiBjdHhUYXNrLm5hbWUgfSA6IHt9KSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLihhdHRhY2htZW50cy5sZW5ndGggPiAwID8geyBhdHRhY2htZW50cyB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZEZhcUlkID8geyBmYXFJZDogcGF5bG9hZEZhcUlkIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkQWdlbnRTdWdnZXN0aW9uSWQgPyB7IGFnZW50U3VnZ2VzdGlvbklkOiBwYXlsb2FkQWdlbnRTdWdnZXN0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWRGdWFJZCA/IHsgZnVhSWQ6IHBheWxvYWRGdWFJZCB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZFNjSWQgPyB7IHNjSWQ6IHBheWxvYWRTY0lkIH0gOiB7fSksXG4gICAgICAgIC4uLihhZ2VudD8uZW50aXR5ICE9IG51bGwgPyB7IGFnZW50RW50aXR5OiBhZ2VudC5lbnRpdHkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50Py50eXBlICE9IG51bGwgPyB7IGFnZW50VHlwZTogYWdlbnQudHlwZSB9IDoge30pLFxuICAgICAgICAuLi4oYWdlbnQ/LmVtb2ppICE9IG51bGwgPyB7IGFnZW50RW1vamk6IGFnZW50LmVtb2ppIH0gOiB7fSksXG4gICAgICAgIC4uLihjb250ZXh0TWVzc2FnZSA/IHsgY29udGV4dE1lc3NhZ2UgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWRDb250ZXh0RGF0YSA/IHsgY29udGV4dERhdGE6IHBheWxvYWRDb250ZXh0RGF0YSB9IDoge30pLFxuICAgICAgfVxuXG4gICAgICBhc2tNYWlhKHBheWxvYWREYXRhKVxuICAgIH0sXG4gICAgW1xuICAgICAgYWRkTWVzc2FnZSxcbiAgICAgIGNvbW1pdFRvU2Vzc2lvbixcbiAgICAgIGV2ZW50LFxuICAgICAgYXNrTWFpYSxcbiAgICAgIHByb2plY3QsXG4gICAgICBjbGllbnQsXG4gICAgICB0YXNrLFxuICAgICAgY2hpcHNQcm9qZWN0LFxuICAgICAgYXV0aFVzZXIsXG4gICAgICBhZ2VudCxcbiAgICAgIHQsXG4gICAgICB3YWl0aW5nUmVzcG9uc2UsXG4gICAgICBsb2FkaW5nTWVzc2FnZXMsXG4gICAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICAgIGlzRGVlcFNlYXJjaEFjdGl2ZSxcbiAgICBdXG4gIClcblxuICBjb25zdCBjaGFuZ2VQcm9qZWN0ID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogUHJvamVjdCkgPT4ge1xuICAgICAgaWYgKCFjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQpIHJldHVyblxuXG4gICAgICBpZiAob3B0aW9uLmlkICE9PSBwcm9qZWN0Py5pZCkge1xuICAgICAgICBzZXRQcm9qZWN0KG9wdGlvbilcbiAgICAgIH1cblxuICAgICAgaWYgKHByb2plY3QgJiYgY3VycmVudFVzZXJRdWVzdGlvbi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnN0IGhpc3RvcnkgPSBtZXNzYWdlc1JlZi5jdXJyZW50Lm1hcChoaXN0b3J5TWVzc2FnZSA9PiAoe1xuICAgICAgICAgIGNvbnRlbnQ6IGhpc3RvcnlNZXNzYWdlLm1lc3NhZ2UsXG4gICAgICAgICAgcm9sZTogaGlzdG9yeU1lc3NhZ2UudXNlci5pZCA9PT0gYXV0aFVzZXIuaWQudG9TdHJpbmcoKSA/IENoYXRIaXN0b3J5Um9sZS5VU0VSIDogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgfSkpXG5cbiAgICAgICAgY29uc29sZS5pbmZvKCdbdXNlQ2hhdE1hbmFnZXJdIFBBVEg9Y2hhbmdlUHJvamVjdCDigJQgdXNhIG9wdGlvbi5pZCBkaXJlY3RvIChOTyBjaGlwc1Byb2plY3QpOicsIHtcbiAgICAgICAgICBvcHRpb25JZDogb3B0aW9uLmlkLFxuICAgICAgICAgIHByb2plY3RQcm9wSWQ6IHByb2plY3Q/LmlkID8/IG51bGwsXG4gICAgICAgICAgY2hpcHNQcm9qZWN0SWQ6IGNoaXBzUHJvamVjdD8ucHJvamVjdElkID8/IG51bGwsXG4gICAgICAgICAgYWdlbnRUeXBlOiBhZ2VudD8udHlwZSxcbiAgICAgICAgfSlcblxuICAgICAgICBhc2tNYWlhKHtcbiAgICAgICAgICBtZXNzYWdlOiBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQsXG4gICAgICAgICAgaGlzdG9yeSxcbiAgICAgICAgICBwcm9qZWN0SWQ6IG9wdGlvbi5pZCxcbiAgICAgICAgICBsYW5nOiBhdXRoVXNlci5sYW5nLFxuICAgICAgICAgIHVzZXJJZDogYXV0aFVzZXIuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgICBmaXJzdE5hbWU6IGF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgICAgICAgICBsYXN0TmFtZTogYXV0aFVzZXIubGFzdE5hbWUsXG4gICAgICAgICAgY29tcGFueUlkOiBhdXRoVXNlci5jb21wYW55X2lkLnRvU3RyaW5nKCksXG4gICAgICAgICAgY2hhdElkOiBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgICAgICAgbWVzc2FnZUlkOiBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQsXG4gICAgICAgICAgYWdlbnROYW1lOiBhZ2VudD8ubmFtZSB8fCAnJyxcbiAgICAgICAgICBhZ2VudElkOiBhZ2VudD8uaWQgfHwgJycsXG4gICAgICAgICAgaXNXZWJTZWFyY2hBY3RpdmU6IGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlOiBpc0RlZXBTZWFyY2hBY3RpdmVSZWYuY3VycmVudCxcbiAgICAgICAgICAuLi4ob3B0aW9uPy5mZWVJZCAhPSBudWxsID8geyBmZWVJZDogTnVtYmVyKG9wdGlvbi5mZWVJZCkgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ob3B0aW9uPy5jbGllbnRJZCAhPSBudWxsID8geyBjbGllbnRJZDogTnVtYmVyKG9wdGlvbi5jbGllbnRJZCkgfSA6IHt9KSxcbiAgICAgICAgICAuLi4oYWdlbnQ/LmVudGl0eSAhPSBudWxsID8geyBhZ2VudEVudGl0eTogYWdlbnQuZW50aXR5IH0gOiB7fSksXG4gICAgICAgICAgLi4uKGFnZW50Py50eXBlICE9IG51bGwgPyB7IGFnZW50VHlwZTogYWdlbnQudHlwZSB9IDoge30pLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sXG4gICAgW3Byb2plY3QsIHNldFByb2plY3QsIGFza01haWEsIGF1dGhVc2VyLCBpc1dlYlNlYXJjaEFjdGl2ZSwgYWdlbnRdXG4gIClcblxuICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKGFzeW5jIChmZWVkYmFja1Byb3A6IEZlZWRiYWNrLCBjaGF0TWVzc2FnZUlkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1haWEuQ2hhdHMud2FzSGVscGZ1bENoYXQoY2hhdE1lc3NhZ2VJZCwgZmVlZGJhY2tQcm9wID09PSBGZWVkYmFjay5USFVNQlNfVVApXG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICBtZXNzYWdlc1JlZi5jdXJyZW50ID0gbWVzc2FnZXNSZWYuY3VycmVudC5tYXAobWVzc2FnZSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlLmlkID09PSBjaGF0TWVzc2FnZUlkICYmIG1lc3NhZ2Uucm9sZSA9PT0gJ2Fzc2lzdGFudCcpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5tZXNzYWdlLCB3YXNIZWxwZnVsOiBmZWVkYmFja1Byb3AgPT09IEZlZWRiYWNrLlRIVU1CU19VUCB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VcbiAgICAgIH0pXG4gICAgfVxuICB9LCBbXSlcblxuICBjb25zdCBoYW5kbGVBcHByb3ZhbERlY2lzaW9uID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKFxuICAgICAgdGhyZWFkSWRzOiBzdHJpbmdbXSxcbiAgICAgIGRlY2lzaW9uOiAnYXBwcm92ZScgfCAncmVqZWN0JyxcbiAgICAgIGVkaXRlZEFjdGlvbnM/OiBBcnJheTx7IHRvb2xfbmFtZTogc3RyaW5nOyBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PlxuICAgICkgPT4ge1xuICAgICAgaWYgKCF0aHJlYWRJZHM/Lmxlbmd0aCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyB0aHJlYWRfaWRzIHByb3ZpZGVkIGZvciBhcHByb3ZhbCBkZWNpc2lvbicpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3VuZCA9IGZpbmRNZXNzYWdlV2l0aEFwcHJvdmFsQnlUaHJlYWRJZHModGhyZWFkSWRzLCBtZXNzYWdlc1JlZi5jdXJyZW50KVxuICAgICAgaWYgKCFmb3VuZD8ubWVzc2FnZS5hcHByb3ZhbCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyBzZSBlbmNvbnRyw7MgbWVuc2FqZSBjb24gYXBwcm92YWwgcGFyYSB0aHJlYWRfaWRzOicsIHRocmVhZElkcylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgbWVzc2FnZTogbWVzc2FnZVdpdGhBcHByb3ZhbCwgc2Vzc2lvbklkOiBmb3VuZFNlc3Npb25JZCB9ID0gZm91bmRcbiAgICAgIGNvbnN0IHsgYXBwcm92YWwgfSA9IG1lc3NhZ2VXaXRoQXBwcm92YWxcbiAgICAgIGlmICghYXBwcm92YWwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlc3Npb25JZCA9IGFwcHJvdmFsLnNlc3Npb25faWQgfHwgZm91bmRTZXNzaW9uSWRcbiAgICAgIGlmICghc2Vzc2lvbklkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHNlc3Npb25faWQgZGlzcG9uaWJsZSBwYXJhIGFwcHJvdmFsOicsIHRocmVhZElkcylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChzZXNzaW9uU3RyZWFtTWFuYWdlci5pc0FjdGl2ZShzZXNzaW9uSWQpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoc2Vzc2lvblN0cmVhbU1hbmFnZXIuZ2V0QWN0aXZlQ291bnQoKSA+PSBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TKSB7XG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdzbmFja2Jhci1ldmVudCcsIHtcbiAgICAgICAgICAgIGRldGFpbDogeyBzaG93OiB0cnVlLCBzZXZlcml0eTogJ2luZm8nLCBtZXNzYWdlOiB0KCdjaGF0LnRvb01hbnlBY3RpdmVTZXNzaW9ucycpIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVzc2FnZUlkID0gbWVzc2FnZVdpdGhBcHByb3ZhbC5pZFxuICAgICAgY29uc3QgbmV3U3RhdHVzID0gZGVjaXNpb24gPT09ICdhcHByb3ZlJyA/ICdhcHByb3ZlZCcgOiAncmVqZWN0ZWQnXG4gICAgICBjb25zdCBoaXRsQ29udGV4dDogSGl0bEV4ZWN1dGlvbkNvbnRleHQgPSB7XG4gICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgbWVzc2FnZVRleHQ6IG1lc3NhZ2VXaXRoQXBwcm92YWwubWVzc2FnZSxcbiAgICAgICAgYXBwcm92YWwsXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zOiBhcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnMsXG4gICAgICAgIHRocmVhZElkcyxcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNBY3RpdmVTZXNzaW9uID0gYWN0aXZlVmlldy5pcyhzZXNzaW9uSWQpXG4gICAgICBpZiAoaXNBY3RpdmVTZXNzaW9uKSB7XG4gICAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBoaXRsQ29udGV4dFxuICAgICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgY29tbWl0VG9TZXNzaW9uKHNlc3Npb25JZCwgeyAuLi5tZXNzYWdlV2l0aEFwcHJvdmFsLCBhcHByb3ZhbFN0YXR1czogbmV3U3RhdHVzIH0pXG5cbiAgICAgIGNvbnN0IHN0cmVhbU1lc3NhZ2VJZCA9IHV1aWR2NCgpXG4gICAgICBpZiAoaXNBY3RpdmVTZXNzaW9uKSB7XG4gICAgICAgIGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCA9IHN0cmVhbU1lc3NhZ2VJZFxuICAgICAgfVxuXG4gICAgICBjb25zdCBoaXRsQ3R4OiBTdHJlYW1Db250ZXh0ID0ge1xuICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgIG1lc3NhZ2VJZDogc3RyZWFtTWVzc2FnZUlkLFxuICAgICAgICBwbGFjZWhvbGRlcklkOiBgYW5zd2VyLSR7c3RyZWFtTWVzc2FnZUlkfS1zdHJlYW1pbmdgLFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxlYXNlQWN0aXZlUHJvY2Vzc2luZyA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFpc0FjdGl2ZVNlc3Npb24pIHJldHVyblxuICAgICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlc3Npb25TdHJlYW1NYW5hZ2VyLnN0YXJ0Q29udGludWVTdHJlYW0oe1xuICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgIHBsYWNlaG9sZGVySWQ6IGhpdGxDdHgucGxhY2Vob2xkZXJJZCxcbiAgICAgICAgY29udGludWVSZXF1ZXN0OiB7XG4gICAgICAgICAgdGhyZWFkSWRzLFxuICAgICAgICAgIHNlc3Npb25JZDogYXBwcm92YWwuc2Vzc2lvbl9pZCxcbiAgICAgICAgICBkZWNpc2lvbjogZWRpdGVkQWN0aW9ucyA/ICdlZGl0JyA6IGRlY2lzaW9uLFxuICAgICAgICAgIGVkaXRlZEFjdGlvbnMsXG4gICAgICAgICAgYWdlbnRJZDogYWdlbnQ/LmlkIHx8ICcnLFxuICAgICAgICAgIGxhbmc6IGF1dGhVc2VyLmxhbmcsXG4gICAgICAgIH0sXG4gICAgICAgIHQsXG4gICAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0OiBoaXRsQ29udGV4dCxcbiAgICAgICAgYWdlbnRJZDogYWdlbnQ/LmlkLFxuICAgICAgICBhZ2VudE5hbWU6IGFnZW50Py5uYW1lLFxuICAgICAgICBjYWxsYmFja3M6IHtcbiAgICAgICAgICBvblN0cmVhbVVwZGF0ZTogY29udGVudCA9PiBoYW5kbGVTdHJlYW1VcGRhdGUoaGl0bEN0eCwgY29udGVudCksXG4gICAgICAgICAgb25GaW5pc2hTdHJlYW06IGZpbmlzaFBheWxvYWQgPT4ge1xuICAgICAgICAgICAgcmVsZWFzZUFjdGl2ZVByb2Nlc3NpbmcoKVxuICAgICAgICAgICAgaGFuZGxlU3RyZWFtRmluaXNoKFxuICAgICAgICAgICAgICBoaXRsQ3R4LFxuICAgICAgICAgICAgICBmaW5pc2hQYXlsb2FkLmNvbnRlbnQsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuc291cmNlcyxcbiAgICAgICAgICAgICAgZmluaXNoUGF5bG9hZC5tZW1vcnlTZXNzaW9uSWQsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuYXR0YWNobWVudHMsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuc3VnZ2VzdGlvbnMsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuY29tcGxldGVkQWdlbnRJZFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgcmVsZWFzZUFjdGl2ZVByb2Nlc3NpbmcoKVxuICAgICAgICAgICAgaGFuZGxlU3RyZWFtRXJyb3IoaGl0bEN0eClcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQXBwcm92YWxSZXF1aXJlZDogKGFwcHJvdmFsUGF5bG9hZCwgYWNjdW11bGF0ZWRDb250ZW50KSA9PiB7XG4gICAgICAgICAgICByZWxlYXNlQWN0aXZlUHJvY2Vzc2luZygpXG4gICAgICAgICAgICBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkKGhpdGxDdHgsIGFwcHJvdmFsUGF5bG9hZCwgYWNjdW11bGF0ZWRDb250ZW50KVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KVxuXG4gICAgICBpZiAoIXJlc3VsdC5zdGFydGVkKSB7XG4gICAgICAgIHJlbGVhc2VBY3RpdmVQcm9jZXNzaW5nKClcbiAgICAgICAgaWYgKHJlc3VsdC5yZWFzb24gPT09ICdsaW1pdCcpIHtcbiAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdzbmFja2Jhci1ldmVudCcsIHtcbiAgICAgICAgICAgICAgZGV0YWlsOiB7IHNob3c6IHRydWUsIHNldmVyaXR5OiAnaW5mbycsIG1lc3NhZ2U6IHQoJ2NoYXQudG9vTWFueUFjdGl2ZVNlc3Npb25zJykgfSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBhdXRoVXNlcixcbiAgICAgIGFnZW50LFxuICAgICAgY29tbWl0VG9TZXNzaW9uLFxuICAgICAgaGFuZGxlU3RyZWFtRXJyb3IsXG4gICAgICBoYW5kbGVTdHJlYW1VcGRhdGUsXG4gICAgICBoYW5kbGVTdHJlYW1GaW5pc2gsXG4gICAgICBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkLFxuICAgICAgdCxcbiAgICBdXG4gIClcblxuICBjb25zdCBpbml0aWFsaXplQ2hhdCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWZpcnN0VGltZVJlZi5jdXJyZW50KSB7XG4gICAgICBmaXJzdFRpbWVSZWYuY3VycmVudCA9IHRydWVcbiAgICB9XG4gICAgaWYgKGluaXRpYWxDaGF0SWQpIHtcbiAgICAgIGF3YWl0IGxvYWRNZXNzYWdlcygpXG4gICAgfSBlbHNlIGlmICh1c2VySW5pdGlhbE1lc3NhZ2UpIHtcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxNZXNzYWdlID0gQm9vbGVhbih1c2VySW5pdGlhbE1lc3NhZ2UubWVzc2FnZT8udHJpbSgpKVxuICAgICAgY29uc3QgaGFzSW5pdGlhbEF0dGFjaG1lbnRzID0gQm9vbGVhbih1c2VySW5pdGlhbE1lc3NhZ2UuYXR0YWNobWVudHM/Lmxlbmd0aClcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxGYXEgPSBCb29sZWFuKHVzZXJJbml0aWFsTWVzc2FnZS5mYXFJZClcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxGdWEgPSBCb29sZWFuKHVzZXJJbml0aWFsTWVzc2FnZS5mdWFJZClcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxTYyA9IEJvb2xlYW4odXNlckluaXRpYWxNZXNzYWdlLnNjSWQpXG5cbiAgICAgIGlmICghaGFzSW5pdGlhbE1lc3NhZ2UgJiYgIWhhc0luaXRpYWxBdHRhY2htZW50cyAmJiAhaGFzSW5pdGlhbEZhcSAmJiAhaGFzSW5pdGlhbEZ1YSAmJiAhaGFzSW5pdGlhbFNjKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBoaXN0b3J5ID0gbWVzc2FnZXNSZWYuY3VycmVudC5tYXAoaGlzdG9yeU1lc3NhZ2UgPT4gKHtcbiAgICAgICAgY29udGVudDogaGlzdG9yeU1lc3NhZ2UubWVzc2FnZSxcbiAgICAgICAgcm9sZTogaGlzdG9yeU1lc3NhZ2UudXNlci5pZCA9PT0gYXV0aFVzZXIuaWQudG9TdHJpbmcoKSA/IENoYXRIaXN0b3J5Um9sZS5VU0VSIDogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgIH0pKVxuXG4gICAgICBjb25zdCB7XG4gICAgICAgIGNoaXBzUHJvamVjdDogY3R4Q2hpcHNQcm9qZWN0LFxuICAgICAgICBwcm9qZWN0OiBjdHhQcm9qZWN0LFxuICAgICAgICBjbGllbnQ6IGN0eENsaWVudCxcbiAgICAgICAgdGFzazogY3R4VGFzayxcbiAgICAgIH0gPSBjb250ZXh0UmVmLmN1cnJlbnRcbiAgICAgIGNvbnN0IHByb2plY3RUb1JlcXVlc3QgPSByZXNvbHZlUHJvamVjdFRvUmVxdWVzdChjdHhDaGlwc1Byb2plY3QsIG51bGwpID8/IGN0eFByb2plY3Q/LmlkID8/IG51bGxcblxuICAgICAgY29uc29sZS5pbmZvKCdbdXNlQ2hhdE1hbmFnZXJdIFBBVEg9aW5pdGlhbGl6ZUNoYXQvdXNlckluaXRpYWxNZXNzYWdlIOKAlCBjb250ZXh0UmVmIHJlc29sdXRpb246Jywge1xuICAgICAgICBwcm9qZWN0UHJvcElkOiBjdHhQcm9qZWN0Py5pZCA/PyBudWxsLFxuICAgICAgICBjbGllbnRJZDogY3R4Q2xpZW50Py5pZCA/PyBudWxsLFxuICAgICAgICB0YXNrSWQ6IGN0eFRhc2s/LmlkID8/IG51bGwsXG4gICAgICAgIGNoaXBzUHJvamVjdElkOiBjdHhDaGlwc1Byb2plY3Q/LnByb2plY3RJZCA/PyBudWxsLFxuICAgICAgICBwcm9qZWN0VG9SZXF1ZXN0LFxuICAgICAgICBhZ2VudFR5cGU6IGFnZW50Py50eXBlLFxuICAgICAgfSlcblxuICAgICAgYXNrTWFpYSh7XG4gICAgICAgIG1lc3NhZ2U6IHVzZXJJbml0aWFsTWVzc2FnZS5tZXNzYWdlLFxuICAgICAgICBoaXN0b3J5LFxuICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RUb1JlcXVlc3QsXG4gICAgICAgIGxhbmc6IGF1dGhVc2VyLmxhbmcsXG4gICAgICAgIHVzZXJJZDogYXV0aFVzZXIuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgZmlyc3ROYW1lOiBhdXRoVXNlci5maXJzdE5hbWUsXG4gICAgICAgIGxhc3ROYW1lOiBhdXRoVXNlci5sYXN0TmFtZSxcbiAgICAgICAgY29tcGFueUlkOiBhdXRoVXNlci5jb21wYW55X2lkLnRvU3RyaW5nKCksXG4gICAgICAgIGNoYXRJZDogY3VycmVudENoYXRJZC5jdXJyZW50LFxuICAgICAgICBtZXNzYWdlSWQ6IGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCxcbiAgICAgICAgYWdlbnROYW1lOiBhZ2VudD8ubmFtZSEsXG4gICAgICAgIGFnZW50SWQ6IGFnZW50Py5pZCEsXG4gICAgICAgIGlzV2ViU2VhcmNoQWN0aXZlOiBpc1dlYlNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICBpc0RlZXBTZWFyY2hBY3RpdmU6IGlzRGVlcFNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICAuLi4oY3R4UHJvamVjdD8uZmVlSWQgIT0gbnVsbCA/IHsgZmVlSWQ6IE51bWJlcihjdHhQcm9qZWN0LmZlZUlkKSB9IDoge30pLFxuICAgICAgICAuLi5yZXNvbHZlQ2xpZW50UGF5bG9hZChjdHhDbGllbnQsIGN0eFByb2plY3QpLFxuICAgICAgICAuLi4oY3R4UHJvamVjdD8ubmFtZSA/IHsgcHJvamVjdE5hbWU6IGN0eFByb2plY3QubmFtZSB9IDoge30pLFxuICAgICAgICAuLi4oY3R4VGFzaz8uaWQgIT0gbnVsbFxuICAgICAgICAgID8geyB0YXNrSWQ6IE51bWJlcihjdHhUYXNrLmlkKSwgLi4uKGN0eFRhc2submFtZSA/IHsgdGFza05hbWU6IGN0eFRhc2submFtZSB9IDoge30pIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cyA/IHsgYXR0YWNobWVudHM6IHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cyB9IDoge30pLFxuICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLmZhcUlkID8geyBmYXFJZDogdXNlckluaXRpYWxNZXNzYWdlLmZhcUlkIH0gOiB7fSksXG4gICAgICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2UuYWdlbnRTdWdnZXN0aW9uSWQgPyB7IGFnZW50U3VnZ2VzdGlvbklkOiB1c2VySW5pdGlhbE1lc3NhZ2UuYWdlbnRTdWdnZXN0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHVzZXJJbml0aWFsTWVzc2FnZS5mdWFJZCA/IHsgZnVhSWQ6IHVzZXJJbml0aWFsTWVzc2FnZS5mdWFJZCB9IDoge30pLFxuICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLnNjSWQgPyB7IHNjSWQ6IHVzZXJJbml0aWFsTWVzc2FnZS5zY0lkIH0gOiB7fSksXG4gICAgICAgIC4uLihhZ2VudD8uZW50aXR5ICE9IG51bGwgPyB7IGFnZW50RW50aXR5OiBhZ2VudC5lbnRpdHkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50Py50eXBlICE9IG51bGwgPyB7IGFnZW50VHlwZTogYWdlbnQudHlwZSB9IDoge30pLFxuICAgICAgICAuLi4oYWdlbnQ/LmVtb2ppICE9IG51bGwgPyB7IGFnZW50RW1vamk6IGFnZW50LmVtb2ppIH0gOiB7fSksXG4gICAgICAgIC4uLihidWlsZENvbnRleHRNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZS5tZW50aW9ucylcbiAgICAgICAgICA/IHsgY29udGV4dE1lc3NhZ2U6IGJ1aWxkQ29udGV4dE1lc3NhZ2UodXNlckluaXRpYWxNZXNzYWdlLm1lbnRpb25zKSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2UuY29udGV4dERhdGEgPyB7IGNvbnRleHREYXRhOiB1c2VySW5pdGlhbE1lc3NhZ2UuY29udGV4dERhdGEgfSA6IHt9KSxcbiAgICAgIH0pXG4gICAgfVxuICB9LCBbXG4gICAgaW5pdGlhbENoYXRJZCxcbiAgICB1c2VySW5pdGlhbE1lc3NhZ2UsXG4gICAgcHJvamVjdCxcbiAgICBjbGllbnQsXG4gICAgdGFzayxcbiAgICBhdXRoVXNlcixcbiAgICBhZ2VudCxcbiAgICBhc2tNYWlhLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZSxcbiAgXSlcblxuICBjb25zdCByZXNldENoYXQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgcHJldmlvdXNTZXNzaW9uSWQgPSBjdXJyZW50Q2hhdElkLmN1cnJlbnRcbiAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihwcmV2aW91c1Nlc3Npb25JZClcbiAgICBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQgPSB1dWlkdjQoKVxuICAgIGN1cnJlbnRVc2VyUXVlc3Rpb24uY3VycmVudCA9IG51bGxcbiAgICBjdXJyZW50Q2hhdElkLmN1cnJlbnQgPSB1dWlkdjQoKVxuICAgIHNldEFjdGl2ZVNlc3Npb25JZChjdXJyZW50Q2hhdElkLmN1cnJlbnQpXG4gICAgcmVwb3J0ZWRFdmVudC5jdXJyZW50ID0gZmFsc2VcbiAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHN0b3BHZW5lcmF0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHN0b3BTdHJlYW1pbmcoKVxuICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgfSwgW3N0b3BTdHJlYW1pbmddKVxuXG4gIHJldHVybiB7XG4gICAgbWVzc2FnZXMsXG4gICAgbG9hZGluZ01lc3NhZ2VzLFxuICAgIGlzTG9hZGluZ01vcmVNZXNzYWdlcyxcbiAgICB3YWl0aW5nUmVzcG9uc2UsXG4gICAgaXNXcml0aW5nLFxuICAgIGxvYWRpbmdNZXNzYWdlLFxuICAgIHN0cmVhbUFjdGl2aXR5LFxuICAgIGFjdGl2ZUxvYWRpbmdzLFxuICAgIGN1cnJlbnRQcm9qZWN0LFxuICAgIGN1cnJlbnRDaGF0SWQ6IGN1cnJlbnRDaGF0SWQuY3VycmVudCxcbiAgICBjdXJyZW50TWVzc2FnZUlkOiBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQsXG5cbiAgICBzZW5kTWVzc2FnZSxcbiAgICBjaGFuZ2VQcm9qZWN0LFxuICAgIGhhbmRsZUZlZWRiYWNrLFxuICAgIGhhbmRsZUFwcHJvdmFsRGVjaXNpb24sXG4gICAgaGFuZGxlU2Nyb2xsLFxuICAgIGluaXRpYWxpemVDaGF0LFxuICAgIHJlc2V0Q2hhdCxcbiAgICBzdG9wR2VuZXJhdGlvbixcblxuICAgIGlzRGlzYWJsZWQ6IHdhaXRpbmdSZXNwb25zZSB8fCBsb2FkaW5nTWVzc2FnZXMsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLFdBQVcsRUFBRUMsTUFBTSxFQUFFQyxTQUFTLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBQ2hFLFNBQVNDLEVBQUUsSUFBSUMsTUFBTSxRQUFRLE1BQU07QUFDbkMsU0FBU0MsZUFBZSxRQUFRLG9CQUFvQjtBQUNwRCxTQUFTQyxxQkFBcUIsUUFBUSwwQkFBMEI7QUFDaEUsU0FBU0MsSUFBSSxRQUFRLFNBQVM7QUFHOUIsU0FBU0MsT0FBTyxRQUFpQix3QkFBd0I7QUFDekQsU0FBU0MsZ0JBQWdCLFFBQVEsOEJBQThCO0FBQy9ELFNBQVNDLE1BQU0sRUFBRUMsUUFBUSxRQUFRLGFBQWE7QUFDOUMsT0FBT0MsSUFBSSxNQUFNLHFCQUFxQjtBQUN0QyxTQUFTQyxRQUFRLFFBQVEsNERBQTREO0FBQ3JGLFNBQXVDQyxlQUFlLFFBQXdDLGtCQUFrQjtBQUNoSCxTQUF5Q0MsbUJBQW1CLFFBQVEsNEJBQTRCO0FBQ2hHLFNBQVNDLGtDQUFrQyxRQUFRLHNDQUFzQztBQUd6RixTQUFTQyxXQUFXLFFBQVEsZ0JBQWdCO0FBQzVDLFNBQVNDLGlCQUFpQixRQUFRLHNCQUFzQjtBQUN4RCxTQUFTQyxzQkFBc0IsUUFBUSwwQkFBMEI7QUFDakUsU0FBU0MsZ0JBQWdCLFFBQVEsNkNBQTZDO0FBQzlFLFNBQVNDLHVCQUF1QixFQUFFQyx5QkFBeUIsUUFBUSwyQkFBMkI7QUFFOUYsU0FBU0Msb0JBQW9CLFFBQVEsMkNBQTJDO0FBQ2hGLFNBQVNDLGdCQUFnQixR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
|
|
1386
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVJlZiIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwidjQiLCJ1dWlkdjQiLCJ1c2VDaGF0TWVzc2FnZXMiLCJ1c2VPcmNoZXN0cmF0b3JTdHJlYW0iLCJ1c2VUIiwidXNlVXNlciIsInVzZUdsb2JhbENvbnRleHQiLCJFVkVOVFMiLCJ1c2VFdmVudCIsIm1haWEiLCJGZWVkYmFjayIsIkNoYXRIaXN0b3J5Um9sZSIsImJ1aWxkQ29udGV4dE1lc3NhZ2UiLCJmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5IiwidXNlUHJvamVjdHMiLCJ1c2VUYWJUYXNrRGVmYXVsdCIsIlRBU0tfVVJMX1JFR0VYX1BBVFRFUk4iLCJmZXRjaEFnZW50RGV0YWlsIiwiYnVpbGRIaXRsQWN0aW9uVHlwZUxpc3QiLCJnZXRIaXRsQW5hbHl0aWNzQWdlbnRUeXBlIiwiZ2V0VGhpbmtpbmdMb2FkaW5nTWVzc2FnZSIsImdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSIsInJlc29sdmVIaXRsTm9kZVN0cmVhbUFjdGl2aXR5IiwicmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHkiLCJzdHJlYW1pbmdTdG9yZSIsImlzQ29tcGxldGVMaWtlU3NlUGF5bG9hZCIsIm1lcmdlU3RyZWFtQ2h1bmsiLCJub3JtYWxpemVTZW5kTWVzc2FnZUFyZ3MiLCJhdHRhY2htZW50c09yT3B0aW9ucyIsIl9vcHRpb25zJGF0dGFjaG1lbnRzIiwiQXJyYXkiLCJpc0FycmF5IiwiYXR0YWNobWVudHMiLCJvcHRpb25zIiwicmVzb2x2ZVByb2plY3RUb1JlcXVlc3QiLCJjaGlwc1Byb2plY3QiLCJsYXN0TWVzc2FnZVByb2plY3RJZCIsImNoaXBzUHJvamVjdElkIiwicHJvamVjdElkIiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJwYXJzZWQiLCJyZXNvbHZlQ2xpZW50UGF5bG9hZCIsImN0eENsaWVudCIsImN0eFByb2plY3QiLCJfY3R4UHJvamVjdCRjbGllbnQiLCJpZCIsIl9vYmplY3RTcHJlYWQiLCJjbGllbnRJZCIsIm5hbWUiLCJjbGllbnROYW1lIiwiY2xpZW50Iiwibm9ybWFsaXplQXNzaXN0YW50QXR0YWNobWVudHMiLCJyYXdBdHRhY2htZW50cyIsImZpbHRlciIsImF0dGFjaG1lbnQiLCJfdHlwZW9mIiwibWFwIiwiaW5kZXgiLCJ0cmltIiwiY29uY2F0IiwidHlwZSIsIm1pbWVUeXBlIiwibWltZV90eXBlIiwiZnVsbEZpbGVOYW1lIiwiaW5jbHVkZXMiLCJudW1lcmljU2l6ZSIsInNpemUiLCJmaWxlIiwiRmlsZSIsInVybF9vcmlnaW5hbCIsInVuZGVmaW5lZCIsInVybF90aHVtYm5haWwiLCJ1cmxfZmlsZSIsInJvbGUiLCJleHRyYWN0VGFza0lkc0Zyb21QZW5kaW5nQWN0aW9uc0FyZ3MiLCJwZW5kaW5nQWN0aW9ucyIsImlkcyIsInB1c2hJZCIsInJhdyIsIm4iLCJwYXJzZUludCIsIlN0cmluZyIsImlzTmFOIiwicHVzaCIsImZvckVhY2giLCJhY3Rpb24iLCJfcmVjJHRhc2tfaWQiLCJhcmdzIiwidG9vbF9hcmdzIiwicmVjIiwidGFza19pZCIsInRhc2tfaWRzIiwidGFza3MiLCJ0IiwiX3RyZWMkdGFza19pZCIsInRyZWMiLCJleHRyYWN0VGFza0lkc0Zyb21EZWxldGVQZW5kaW5nQWN0aW9ucyIsInRvb2xfbmFtZSIsIl9yZWMkdGFza19pZDIiLCJsaXN0IiwidGlkIiwiZXh0cmFjdEFnZW50SWRGcm9tRWRpdEFnZW50UGVuZGluZ0FjdGlvbnMiLCJfcmVjJGFnZW50X2lkIiwiZWRpdEFjdGlvbiIsImZpbmQiLCJhIiwidG9Mb3dlckNhc2UiLCJhZ2VudF9pZCIsImFnZW50SWQiLCJleHRyYWN0QWdlbnRJZEZyb21QZW5kaW5nQWN0aW9uc0J5VG9vbE5hbWUiLCJ0b29sTmFtZSIsIl9yZWYiLCJfcmVjJGFnZW50X2lkMiIsImV4dHJhY3RUYXNrSWRzRnJvbUFzc2lzdGFudERlbGV0aW9uVGV4dCIsInRleHQiLCJsYWJlbGVkIiwibWF0Y2giLCJib2xkIiwidXNlU3RhYmxlQ2FsbGJhY2tzIiwiYXV0aFVzZXIiLCJjdXJyZW50VXNlciIsInRvU3RyaW5nIiwiZmlyc3ROYW1lIiwiYXZhdGFyIiwicGljdHVyZSIsImN1cnJlbnQiLCJwYXJzZVNTRUxpbmUiLCJsaW5lIiwiX2xpbmUkc3BsaXQiLCJzcGxpdCIsIl9saW5lJHNwbGl0MiIsIl9zbGljZWRUb0FycmF5IiwiZXZlbnRMaW5lIiwiZGF0YUxpbmUiLCJldmVudFR5cGUiLCJyZXBsYWNlIiwiZGF0YVN0ciIsImRhdGEiLCJKU09OIiwicGFyc2UiLCJwYXJzZUVycm9yIiwiY29uc29sZSIsImVycm9yIiwicHJvY2Vzc1NTRVN0cmVhbSIsIl9yZWYyIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJyZXNwb25zZSIsInRocmVhZElkIiwiY2FsbGJhY2tzIiwiX3Jlc3BvbnNlJGJvZHkiLCJyZWFkZXIiLCJkZWNvZGVyIiwiYnVmZmVyIiwiYWNjdW11bGF0ZWRDb250ZW50Iiwic3RyZWFtU2V0dGxlZCIsIm5vdGlmeUNvbXBsZXRlIiwiaGFuZGxlTGluZSIsImlzUmVhZGVyRG9uZSIsIl95aWVsZCRyZWFkZXIkcmVhZCIsImRvbmUiLCJ2YWx1ZSIsImxpbmVzIiwiaSIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiX2hhbmRsZUxpbmUiLCJldmVudERhdGEiLCJvblRoaW5raW5nIiwiY29udGVudCIsIm9uVG9rZW4iLCJtZXNzYWdlIiwib25Ob2RlIiwiZmluYWxDb250ZW50IiwiX2NhbGxiYWNrcyRvbkFwcHJvdmFsIiwib25BcHByb3ZhbFJlcXVpcmVkIiwiY2FsbCIsIm9uRXJyb3IiLCJib2R5IiwiZ2V0UmVhZGVyIiwiRXJyb3IiLCJUZXh0RGVjb2RlciIsIl9ldmVudERhdGEkYWdlbnRfaWQiLCJzb3VyY2VzIiwibWVtb3J5U2Vzc2lvbklkIiwibWVtb3J5X3Nlc3Npb25faWQiLCJzdWdnZXN0aW9ucyIsInN1Z2dlc3RfcmVwbHkiLCJhZ2VudElkUmF3IiwiY29tcGxldGVkQWdlbnRJZCIsIm9uQ29tcGxldGUiLCJyZWFkIiwic2VudCIsImFicnVwdCIsImRlY29kZSIsInN0cmVhbSIsInBvcCIsImxlbmd0aCIsInN0b3AiLCJfeCIsIl94MiIsIl94MyIsImFwcGx5IiwiYXJndW1lbnRzIiwidXNlQ2hhdE1hbmFnZXIiLCJfcmVmMyIsImluaXRpYWxDaGF0SWQiLCJjaGF0SWQiLCJ1c2VySW5pdGlhbE1lc3NhZ2UiLCJfcmVmMyRhZ2VudHMiLCJhZ2VudHMiLCJfdXNlVCIsIl91c2VHbG9iYWxDb250ZXh0IiwicHJvamVjdCIsInNldFByb2plY3QiLCJzZXRDbGllbnQiLCJ0YXNrIiwic2V0VGFzayIsImFnZW50IiwiaXNXZWJTZWFyY2hBY3RpdmUiLCJpc0RlZXBTZWFyY2hBY3RpdmUiLCJzZXRDaGlwc1Byb2plY3QiLCJldmVudCIsIl91c2VQcm9qZWN0cyIsImZldGNoUHJvamVjdHMiLCJfdXNlU3RhYmxlQ2FsbGJhY2tzIiwiX3VzZVRhYlRhc2tEZWZhdWx0IiwiZ2V0VGFiVGFza0RlZmF1bHQiLCJfY2hpcHNQcm9qZWN0JHByb2plY3QiLCJfY2hpcHNQcm9qZWN0JHByb2plY3QyIiwiX3Byb2plY3QkaWQiLCJfY2xpZW50JGlkIiwiX3Rhc2skaWQiLCJpbmZvIiwiY2hpcHNQcm9qZWN0TmFtZSIsInByb2plY3ROYW1lIiwicHJvamVjdFByb3BJZCIsInRhc2tJZCIsImN1cnJlbnRNZXNzYWdlSWQiLCJjdXJyZW50VXNlclF1ZXN0aW9uIiwiY3VycmVudENoYXRJZCIsInJlcG9ydGVkRXZlbnQiLCJtZXNzYWdlc1JlZiIsImxhc3RNYW51YWxBcHByb3ZhbFJlZiIsImhpdGxFeGVjdXRpb25Db250ZXh0UmVmIiwiaXNQcm9jZXNzaW5nUmVmIiwiZmlyc3RUaW1lUmVmIiwic3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZiIsImFjdGl2ZVN0cmVhbUNoYXRJZFJlZiIsImFib3J0U3RyZWFtU2lsZW50bHlSZWYiLCJjbGVhclN0cmVhbVVpUmVmIiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsImFjdGl2ZUxvYWRpbmdzIiwic2V0QWN0aXZlTG9hZGluZ3MiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImlzQ29udGludWluZ1N0cmVhbSIsInNldElzQ29udGludWluZ1N0cmVhbSIsImlzV2ViU2VhcmNoQWN0aXZlUmVmIiwiaXNEZWVwU2VhcmNoQWN0aXZlUmVmIiwiY29udGV4dFJlZiIsIl91c2VDaGF0TWVzc2FnZXMiLCJsb2FkaW5nTWVzc2FnZXMiLCJtZXNzYWdlcyIsImlzTG9hZGluZ01vcmVNZXNzYWdlcyIsImxvYWRNZXNzYWdlcyIsImFkZE1lc3NhZ2UiLCJyZW1vdmVNZXNzYWdlIiwiaGFuZGxlU2Nyb2xsIiwiY3VzdG9tRXZlbnQiLCJDdXN0b21FdmVudCIsImRldGFpbCIsImRvY3VtZW50IiwiZGlzcGF0Y2hFdmVudCIsImNsZWFyIiwiaGFuZGxlU3RyZWFtRXJyb3IiLCJlcnJvck1lc3NhZ2UiLCJlcnJvclJhd01lc3NhZ2UiLCJfZXJyb3JSYXdNZXNzYWdlJG1hdGMiLCJfZXJyb3JSYXdNZXNzYWdlJG1hdGMyIiwidGVtcE1lc3NhZ2VJZCIsInVzZWQiLCJpc0Vycm9yIiwiZGF0ZSIsIkRhdGUiLCJ1c2VyIiwiQVNTSVNUQU5UIiwiaGFuZGxlU3RyZWFtVXBkYXRlIiwic3RhcnQiLCJzZXRUZXh0IiwiaGFuZGxlU3RyZWFtRmluaXNoIiwiX3JlZjQiLCJfY2FsbGVlMiIsIl9wcmV2aW91c01lc3NhZ2UkYXBwciIsIl93aW5kb3ckdGFza1BhbmVsIiwiX2NyZWF0ZUFnZW50Rm9sbG93VXAiLCJfZWRpdEFnZW50Rm9sbG93VXAiLCJ0YXNrVXJsUmVnZXgiLCJtYXRjaGVzIiwiY29udGVudFRvQWRkIiwicHJldmlvdXNNZXNzYWdlIiwiaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSIsIlRBU0tfQ1JFQVRJT05fVE9PTFMiLCJUQVNLX0VESVRfVE9PTFMiLCJUQVNLX0RFTEVURV9UT09MUyIsIndhc1Rhc2tDcmVhdGlvbiIsIndhc1Rhc2tFZGl0Iiwid2FzVGFza0RlbGV0ZSIsIndhc0NyZWF0ZUFnZW50QXBwcm92ZWQiLCJ3YXNDb25maWd1cmVBZ2VudEFjY2Vzc0FwcHJvdmVkIiwiY3JlYXRlQWdlbnRGb2xsb3dVcCIsImNvbmZpZ3VyZWRBZ2VudElkIiwid2FzRWRpdEFnZW50QXBwcm92ZWQiLCJlZGl0QWdlbnRGb2xsb3dVcCIsImZyb21TdHJlYW0iLCJmcm9tQXJncyIsInJlc29sdmVkQWdlbnRJZCIsInRhc2tJZHNGcm9tVXJscyIsInRhc2tJZHNGcm9tRGVsZXRlQXBwcm92YWwiLCJ0YXNrSWRzRnJvbURlbGV0aW9uVGV4dCIsInRhc2tJZHNGb3JEYXNoYm9hcmQiLCJzaG91bGRTeW5jRGFzaGJvYXJkIiwidGFza0lkcyIsInRhYiIsInRhYlNlZ21lbnQiLCJsYXN0UHJvamVjdE1lc3NhZ2UiLCJjb250ZXh0UHJvamVjdElkUmF3IiwiY29udGV4dFByb2plY3RJZCIsInBhdGhNYXRjaCIsInJvdXRlUHJvamVjdElkIiwiaXNPblByb2plY3RSb3V0ZSIsIl93aW5kb3ckbmV3UHJvamVjdERhcyIsIl93aW5kb3ckbmV3UHJvamVjdERhczIiLCJfd2luZG93JG5ld1Byb2plY3REYXMzIiwiX3dpbmRvdyRuZXdQcm9qZWN0RGFzNCIsIl93aW5kb3ckbmV3UHJvamVjdERhczUiLCJfd2luZG93JG5ld1Byb2plY3REYXM2Iiwib3BlblRhc2tQYW5lbElkIiwibWFudWFsQXBwcm92YWwiLCJtYW51YWxXYXNUYXNrRWRpdCIsIm1hbnVhbFdhc1Rhc2tEZWxldGUiLCJfbWFudWFsQXBwcm92YWwkdG9vbEEiLCJtYW51YWxQc2V1ZG9BY3Rpb24iLCJhZmZlY3RlZFRhc2tJZHMiLCJfd2luZG93JHRhc2tQYW5lbDIiLCJfd2luZG93JHRhc2tQYW5lbDIkcmUiLCJfY29udGV4dDIiLCJSZWdFeHAiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJtYXRjaEFsbCIsIm0iLCJhdCIsImFwcHJvdmFsIiwicGVuZGluZ19hY3Rpb25zIiwic29tZSIsImFwcHJvdmFsU3RhdHVzIiwid2luZG93IiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyIsImFpQ2hhdEhpdGxPcHRpb24iLCJhZ2VudF90eXBlIiwiYWN0aW9uX3R5cGUiLCJkZWNpc2lvbiIsIm9wdGlvbiIsImNyZWF0ZWRfYWdlbnRfaWQiLCJ1cmwiLCJtc2ciLCJsb2NhdGlvbiIsInBhdGhuYW1lIiwibmV3UHJvamVjdERhc2hib2FyZCIsImFkZEV4aXN0aW5nVGFza1RvRGFzaGJvYXJkIiwiZWRpdEV4aXN0aW5nVGFza0luRGFzaGJvYXJkIiwiZGVsZXRlRXhpc3RpbmdUYXNrRnJvbURhc2hib2FyZCIsInRhc2tQYW5lbCIsInRvb2xBcmdzIiwicmVmZXRjaFRhc2siLCJ0aGVuIiwiY2hhdEFnZW50IiwiZXJyIiwiX3g0IiwiX3g1IiwiX3g2IiwiX3g3IiwiX3g4IiwiX3g5IiwiaGFuZGxlU3RyZWFtU3RvcCIsImlzRnJvbnRlbmRDYW5jZWxsZWQiLCJzZXRUaW1lb3V0IiwiaGFuZGxlQXBwcm92YWxSZXF1aXJlZCIsIl9hcHByb3ZhbCRwZW5kaW5nX2FjdCIsImhpdGxDb250ZXh0IiwibWVzc2FnZUlkIiwib3JpZ2luYWxfdGhyZWFkX2lkIiwibWVzc2FnZVRleHQiLCJ0aHJlYWRJZHMiLCJ0aHJlYWRfaWQiLCJtYW51YWxfYXBwcm92YWxfZGV0ZWN0ZWQiLCJfYXBwcm92YWwkcGVuZGluZ19hY3QyIiwiX3JlZjUiLCJfdG9vbF9uYW1lIiwiX3Rvb2xfYXJncyIsImZpcnN0QWN0aW9uIiwiX3VzZU9yY2hlc3RyYXRvclN0cmVhIiwib25TdHJlYW1VcGRhdGUiLCJvbkZpbmlzaFN0cmVhbSIsIm9uU3RvcCIsImFza01haWEiLCJ3YWl0aW5nUmVzcG9uc2UiLCJpc0xvYWRpbmciLCJpc1dyaXRpbmciLCJsb2FkaW5nTWVzc2FnZSIsInN0cmVhbUFjdGl2aXR5IiwidXBkYXRlU3RyZWFtQWN0aXZpdHkiLCJzdG9wU3RyZWFtaW5nIiwiYWJvcnRTdHJlYW1TaWxlbnRseSIsImN1cnJlbnRQcm9qZWN0Iiwic2VuZE1lc3NhZ2UiLCJfcmVmNiIsIl9jYWxsZWUzIiwiZmFxSWQiLCJhZ2VudFN1Z2dlc3Rpb25JZCIsIm1lbnRpb25zIiwiZnVhSWQiLCJzY0lkIiwiX21lc3NhZ2VzUmVmJGN1cnJlbnQiLCJfbm9ybWFsaXplU2VuZE1lc3NhZ2UiLCJlZmZlY3RpdmVNZW50aW9ucyIsImNvbnRleHRNZXNzYWdlIiwicGF5bG9hZEZ1YUlkIiwicGF5bG9hZFNjSWQiLCJwYXlsb2FkQ29udGV4dERhdGEiLCJkaXNwbGF5TWVzc2FnZSIsIm5ld01lc3NhZ2VJZCIsImxhc3RNZXNzYWdlV2l0aFByb2plY3QiLCJjdXJyZW50QWdlbnRGcm9tTWVzc2FnZXMiLCJzdHJlYW1pbmdQbGFjZWhvbGRlcklkIiwiZmluYWxNZXNzYWdlIiwiX29wdGlvbnMkcHJvamVjdENoYW5nIiwiX2NvbnRleHRSZWYkY3VycmVudCRwIiwiaGlzdG9yeSIsIl9jb250ZXh0UmVmJGN1cnJlbnQiLCJjdHhDaGlwc1Byb2plY3QiLCJjdHhUYXNrIiwicHJvamVjdFRvUmVxdWVzdCIsInByb2plY3RzIiwicGF5bG9hZEZhcUlkIiwicGF5bG9hZEFnZW50U3VnZ2VzdGlvbklkIiwicGF5bG9hZERhdGEiLCJfY29udGV4dDMiLCJjb250ZXh0RGF0YSIsInBtQWlUeXBlZFRleHQiLCJVU0VSIiwicHJvamVjdENoYW5nZWQiLCJpbmNvbWVUeXBlIiwiaGlzdG9yeU1lc3NhZ2UiLCJhZ2VudFR5cGUiLCJsYW5nIiwidXNlcklkIiwibGFzdE5hbWUiLCJjb21wYW55SWQiLCJjb21wYW55X2lkIiwiYWdlbnROYW1lIiwiZmVlSWQiLCJ0YXNrTmFtZSIsImVudGl0eSIsImFnZW50RW50aXR5IiwiX3gwIiwiX3gxIiwiX3gxMCIsIl94MTEiLCJfeDEyIiwiX3gxMyIsIl94MTQiLCJjaGFuZ2VQcm9qZWN0IiwiX3Byb2plY3QkaWQyIiwiX2NoaXBzUHJvamVjdCRwcm9qZWN0MyIsIm9wdGlvbklkIiwiaGFuZGxlRmVlZGJhY2siLCJfcmVmNyIsIl9jYWxsZWU0IiwiZmVlZGJhY2tQcm9wIiwiY2hhdE1lc3NhZ2VJZCIsIl9jb250ZXh0NCIsIkNoYXRzIiwid2FzSGVscGZ1bENoYXQiLCJUSFVNQlNfVVAiLCJ3YXNIZWxwZnVsIiwiX3gxNSIsIl94MTYiLCJoYW5kbGVBcHByb3ZhbERlY2lzaW9uIiwiX3JlZjgiLCJfY2FsbGVlNSIsImVkaXRlZEFjdGlvbnMiLCJtZXNzYWdlV2l0aEFwcHJvdmFsIiwibG9hZGluZ0tleSIsImluaXRpYWxBY3Rpdml0eSIsImV4aXN0aW5nTWVzc2FnZSIsIm5ld1N0YXR1cyIsIl90IiwiX2NvbnRleHQ1IiwiX20kYXBwcm92YWwiLCJfZGVmaW5lUHJvcGVydHkiLCJPcmNoZXN0cmF0b3IiLCJjb250aW51ZVRocmVhZCIsInNlc3Npb25JZCIsInNlc3Npb25faWQiLCJvayIsImFjdGl2aXR5IiwicGhhc2UiLCJjdXJyZW50VGhyZWFkSWQiLCJub2RlQWN0aXZpdHkiLCJ1c2VSZXN1bWluZ0ZhbGxiYWNrIiwibmV3TG9hZGluZ3MiLCJhcHByb3ZhbFBheWxvYWQiLCJmaW5pc2giLCJfeDE3IiwiX3gxOCIsIl94MTkiLCJpbml0aWFsaXplQ2hhdCIsIl9jYWxsZWU2IiwiX3VzZXJJbml0aWFsTWVzc2FnZSRtIiwiX3VzZXJJbml0aWFsTWVzc2FnZSRhIiwiX3JlZjAiLCJfcmVzb2x2ZVByb2plY3RUb1JlcXUiLCJfY3R4UHJvamVjdCRpZCIsIl9jdHhDbGllbnQkaWQiLCJfY3R4VGFzayRpZCIsIl9jdHhDaGlwc1Byb2plY3QkcHJvaiIsImhhc0luaXRpYWxNZXNzYWdlIiwiaGFzSW5pdGlhbEF0dGFjaG1lbnRzIiwiaGFzSW5pdGlhbEZhcSIsImhhc0luaXRpYWxGdWEiLCJoYXNJbml0aWFsU2MiLCJfY29udGV4dFJlZiRjdXJyZW50MiIsIl9jb250ZXh0NiIsIkJvb2xlYW4iLCJyZXNldENoYXQiLCJzdG9wR2VuZXJhdGlvbiIsImlzRGlzYWJsZWQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaG9va3MvdXNlQ2hhdE1hbmFnZXIvdXNlQ2hhdE1hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgcmFkaXggKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0ZWQtb3B0aW9uYWwtY2hhaW4gKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnXG5pbXBvcnQgeyB1c2VDaGF0TWVzc2FnZXMgfSBmcm9tICcuLi91c2VDaGF0TWVzc2FnZXMnXG5pbXBvcnQgeyB1c2VPcmNoZXN0cmF0b3JTdHJlYW0gfSBmcm9tICcuLi91c2VPcmNoZXN0cmF0b3JTdHJlYW0nXG5pbXBvcnQgeyB1c2VUIH0gZnJvbSAnLi4vdXNlVCdcbmltcG9ydCB7IEF0dGFjaG1lbnRGaWxlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9tb2xlY3VsZXMvQ2hhdEZvb3Rlci9DaGF0Rm9vdGVyJ1xuaW1wb3J0IHsgU2VuZE1lc3NhZ2VPcHRpb25zLCBVc2VDaGF0TWFuYWdlclByb3BzIH0gZnJvbSAnLi91c2VDaGF0TWFuYWdlci5pbnRlcmZhY2UnXG5pbXBvcnQgeyB1c2VVc2VyLCBDT1JVc2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dC9jb3ItdXNlcidcbmltcG9ydCB7IHVzZUdsb2JhbENvbnRleHQgfSBmcm9tICcuLi8uLi9jb250ZXh0L2dsb2JhbC1jb250ZXh0J1xuaW1wb3J0IHsgRVZFTlRTLCB1c2VFdmVudCB9IGZyb20gJy4uL3VzZUV2ZW50J1xuaW1wb3J0IG1haWEgZnJvbSAnLi4vLi4vc2VydmljZXMvbWFpYSdcbmltcG9ydCB7IEZlZWRiYWNrIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9tb2xlY3VsZXMvTWVzc2FnZUZlZWRiYWNrL01lc3NhZ2VGZWVkYmFjaydcbmltcG9ydCB7IENoYXRNZXNzYWdlLCBDaGF0TWVzc2FnZVVzZXIsIENoYXRIaXN0b3J5Um9sZSwgQXBwcm92YWxSZXF1ZXN0LCBQZW5kaW5nQWN0aW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMvQ2hhdCdcbmltcG9ydCB7IENvbnRleHRNZW50aW9uLCBDb250ZXh0TWVzc2FnZSwgYnVpbGRDb250ZXh0TWVzc2FnZSB9IGZyb20gJy4uLy4uL3R5cGVzL2NvbnRleHRNZW50aW9uJ1xuaW1wb3J0IHsgZm9ybWF0UXVpY2tBY3Rpb25NZXNzYWdlRm9yRGlzcGxheSB9IGZyb20gJy4uLy4uL3V0aWxzL2Zvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZSdcblxuaW1wb3J0IHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3R5cGVzL1Byb2plY3QnXG5pbXBvcnQgeyB1c2VQcm9qZWN0cyB9IGZyb20gJy4uL3VzZVByb2plY3RzJ1xuaW1wb3J0IHsgdXNlVGFiVGFza0RlZmF1bHQgfSBmcm9tICcuLi91c2VUYWJUYXNrRGVmYXVsdCdcbmltcG9ydCB7IFRBU0tfVVJMX1JFR0VYX1BBVFRFUk4gfSBmcm9tICcuLi8uLi9jb25zdGFudHMvdGFza1VybHMnXG5pbXBvcnQgeyBmZXRjaEFnZW50RGV0YWlsIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWFpYS9BZ2VudHMvZmV0Y2hBZ2VudERldGFpbCdcbmltcG9ydCB7IGJ1aWxkSGl0bEFjdGlvblR5cGVMaXN0LCBnZXRIaXRsQW5hbHl0aWNzQWdlbnRUeXBlIH0gZnJvbSAnLi4vLi4vdXRpbHMvaGl0bEFuYWx5dGljcydcbmltcG9ydCB0eXBlIHsgU3RyZWFtQWN0aXZpdHkgfSBmcm9tICcuLi8uLi90eXBlcy9zdHJlYW1BY3Rpdml0eSdcbmltcG9ydCB7XG4gIGdldFRoaW5raW5nTG9hZGluZ01lc3NhZ2UsXG4gIGdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSxcbiAgcmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHksXG4gIHJlc29sdmVJbml0aWFsSGl0bFN0cmVhbUFjdGl2aXR5LFxuICB0eXBlIEhpdGxFeGVjdXRpb25Db250ZXh0LFxufSBmcm9tICcuLi8uLi91dGlscy9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuaW1wb3J0IHsgc3RyZWFtaW5nU3RvcmUgfSBmcm9tICcuLi91c2VTdHJlYW1pbmdNZXNzYWdlJ1xuaW1wb3J0IHsgaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkLCBtZXJnZVN0cmVhbUNodW5rIH0gZnJvbSAnLi4vLi4vdXRpbHMvc3NlU3RyZWFtQ29udGVudCdcblxudHlwZSBBdHRhY2htZW50c09yT3B0aW9ucyA9IEF0dGFjaG1lbnRGaWxlW10gfCBTZW5kTWVzc2FnZU9wdGlvbnNcblxuY29uc3Qgbm9ybWFsaXplU2VuZE1lc3NhZ2VBcmdzID0gKGF0dGFjaG1lbnRzT3JPcHRpb25zPzogQXR0YWNobWVudHNPck9wdGlvbnMpID0+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/IGV2ZW50RGF0YS5jb250ZW50IDogJydcbiAgICAgIGFjY3VtdWxhdGVkQ29udGVudCA9IG1lcmdlU3RyZWFtQ2h1bmsoYWNjdW11bGF0ZWRDb250ZW50LCBjb250ZW50KVxuICAgICAgY2FsbGJhY2tzLm9uVG9rZW4oYWNjdW11bGF0ZWRDb250ZW50KVxuICAgICAgaWYgKGlzQ29tcGxldGVMaWtlU3NlUGF5bG9hZChldmVudERhdGEpKSB7XG4gICAgICAgIG5vdGlmeUNvbXBsZXRlKGV2ZW50RGF0YSwgY29udGVudCB8fCBhY2N1bXVsYXRlZENvbnRlbnQpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdub2RlJykge1xuICAgICAgaWYgKGV2ZW50RGF0YS5tZXNzYWdlICYmIHR5cGVvZiBldmVudERhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY2FsbGJhY2tzLm9uTm9kZShldmVudERhdGEubWVzc2FnZSwgdGhyZWFkSWQpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIGNvbnN0IGZpbmFsQ29udGVudCA9IChldmVudERhdGEuY29udGVudCBhcyBzdHJpbmcpIHx8IGFjY3VtdWxhdGVkQ29udGVudFxuICAgICAgbm90aWZ5Q29tcGxldGUoZXZlbnREYXRhLCBmaW5hbENvbnRlbnQpXG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdhcHByb3ZhbF9yZXF1aXJlZCcpIHtcbiAgICAgIGlmICghc3RyZWFtU2V0dGxlZCkge1xuICAgICAgICBzdHJlYW1TZXR0bGVkID0gdHJ1ZVxuICAgICAgfVxuICAgICAgY2FsbGJhY2tzLm9uQXBwcm92YWxSZXF1aXJlZD8uKGV2ZW50RGF0YSwgYWNjdW11bGF0ZWRDb250ZW50LCB0aHJlYWRJZClcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgc3RyZWFtU2V0dGxlZCA9IHRydWVcbiAgICAgIGNhbGxiYWNrcy5vbkVycm9yKGV2ZW50RGF0YS5lcnJvciwgdGhyZWFkSWQpXG4gICAgfVxuICB9XG5cbiAgbGV0IGlzUmVhZGVyRG9uZSA9IGZhbHNlXG5cbiAgd2hpbGUgKCFpc1JlYWRlckRvbmUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKClcbiAgICBpZiAoZG9uZSkge1xuICAgICAgaXNSZWFkZXJEb25lID0gdHJ1ZVxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBidWZmZXIgKz0gZGVjb2Rlci5kZWNvZGUodmFsdWUsIHsgc3RyZWFtOiB0cnVlIH0pXG4gICAgY29uc3QgbGluZXMgPSBidWZmZXIuc3BsaXQoJ1xcblxcbicpXG4gICAgYnVmZmVyID0gbGluZXMucG9wKCkgfHwgJydcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGhhbmRsZUxpbmUobGluZXNbaV0pXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCB1c2VDaGF0TWFuYWdlciA9ICh7XG4gIGNoYXRJZDogaW5pdGlhbENoYXRJZCxcbiAgdXNlckluaXRpYWxNZXNzYWdlLFxuICBvbkVycm9yLFxuICBhZ2VudHMgPSBbXSxcbn06IFVzZUNoYXRNYW5hZ2VyUHJvcHMpID0+IHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUKClcbiAgY29uc3QgYXV0aFVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3Qge1xuICAgIHByb2plY3QsXG4gICAgc2V0UHJvamVjdCxcbiAgICBjbGllbnQsXG4gICAgc2V0Q2xpZW50LFxuICAgIHRhc2ssXG4gICAgc2V0VGFzayxcbiAgICBhZ2VudCxcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICBpc0RlZXBTZWFyY2hBY3RpdmUsXG4gICAgY2hpcHNQcm9qZWN0LFxuICAgIHNldENoaXBzUHJvamVjdCxcbiAgfSA9IHVzZUdsb2JhbENvbnRleHQoKVxuICBjb25zdCBldmVudCA9IHVzZUV2ZW50KClcbiAgY29uc3QgeyBmZXRjaFByb2plY3RzIH0gPSB1c2VQcm9qZWN0cygpXG4gIGNvbnN0IHsgY3VycmVudFVzZXIgfSA9IHVzZVN0YWJsZUNhbGxiYWNrcyhhdXRoVXNlcilcbiAgY29uc3QgeyBnZXRUYWJUYXNrRGVmYXVsdCB9ID0gdXNlVGFiVGFza0RlZmF1bHQoKVxuXG4gIC8vIERFQlVHOiByYXN0cmVhciBjdcOhbmRvIGNhbWJpYSBlbCBjb250ZXh0byBnbG9iYWwgcGFyYSBjb3JyZWxhY2lvbmFyIGNvbiBsb3MgZW52w61vcyBhbCBvcmNoZXN0cmF0b3JcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zb2xlLmluZm8oJ1t1c2VDaGF0TWFuYWdlcl0gY29udGV4dCBDSEFOR0VEOicsIHtcbiAgICAgIGNoaXBzUHJvamVjdElkOiBjaGlwc1Byb2plY3Q/LnByb2plY3RJZCA/PyBudWxsLFxuICAgICAgY2hpcHNQcm9qZWN0TmFtZTogY2hpcHNQcm9qZWN0Py5wcm9qZWN0TmFtZSA/PyBudWxsLFxuICAgICAgcHJvamVjdFByb3BJZDogcHJvamVjdD8uaWQgPz8gbnVsbCxcbiAgICAgIGNsaWVudElkOiBjbGllbnQ/LmlkID8/IG51bGwsXG4gICAgICB0YXNrSWQ6IHRhc2s/LmlkID8/IG51bGwsXG4gICAgfSlcbiAgfSwgW2NoaXBzUHJvamVjdD8ucHJvamVjdElkLCBwcm9qZWN0Py5pZCwgY2xpZW50Py5pZCwgdGFzaz8uaWRdKVxuICBjb25zdCBjdXJyZW50TWVzc2FnZUlkID0gdXNlUmVmKHV1aWR2NCgpKVxuICBjb25zdCBjdXJyZW50VXNlclF1ZXN0aW9uID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGN1cnJlbnRDaGF0SWQgPSB1c2VSZWYoaW5pdGlhbENoYXRJZCB8fCB1dWlkdjQoKSlcbiAgY29uc3QgcmVwb3J0ZWRFdmVudCA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgbWVzc2FnZXNSZWYgPSB1c2VSZWY8Q2hhdE1lc3NhZ2VbXT4oW10pXG4gIC8qKlxuICAgKiBHdWFyZGEgaW5mbyBkZWwgw7psdGltbyBhcHByb3ZhbCBtYW51YWwgKGN1YW5kbyBlbCB1c3VhcmlvIHRpcGVhIFwic2lcIi9cIm5vXCIgZW4gbHVnYXJcbiAgICogZGUgY2xpY2tlYXIgZWwgYm90w7NuKS4gRW4gbWFudWFsIGFwcHJvdmFsLCBgaGFuZGxlQXBwcm92YWxSZXF1aXJlZGAgcmV0b3JuYSBlYXJseVxuICAgKiBzaW4gYWdyZWdhciB1biBtZW5zYWplIGNvbiBgYXBwcm92YWxgLCBhc8OtIHF1ZSBsYSBsw7NnaWNhIGRlIHJlZmV0Y2ggZW4gYG9uU3RyZWFtRmluaXNoYFxuICAgKiBubyBsbyBkZXRlY3RhIHbDrWEgYHByZXZpb3VzTWVzc2FnZS5hcHByb3ZhbGAuIExvIGd1YXJkYW1vcyBhY8OhIHBhcmEgY29uc3VtaXJsbyBkZXNwdcOpcy5cbiAgICovXG4gIGNvbnN0IGxhc3RNYW51YWxBcHByb3ZhbFJlZiA9IHVzZVJlZjx7XG4gICAgdG9vbE5hbWU6IHN0cmluZ1xuICAgIHRvb2xBcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGxcbiAgfSB8IG51bGw+KG51bGwpXG4gIC8qKiBDb250ZXh0byBkZWwgbWVuc2FqZSBkZSBhcHJvYmFjacOzbiBwcmV2aW8gYWwgZWplY3V0YXIgY29udGludWUtdGhyZWFkLiAqL1xuICBjb25zdCBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZiA9IHVzZVJlZjxIaXRsRXhlY3V0aW9uQ29udGV4dCB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGlzUHJvY2Vzc2luZ1JlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgZmlyc3RUaW1lUmVmID0gdXNlUmVmKGZhbHNlKVxuICAvKiogSWQgZGVsIHBsYWNlaG9sZGVyIGRlbCBtZW5zYWplIGVuIHN0cmVhbWluZyBhY3Rpdm8gKHNpIGhheSkuICovXG4gIGNvbnN0IHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYgPSB1c2VSZWY8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgLyoqXG4gICAqIENoYXQgYWwgcXVlIHBlcnRlbmVjZSBlbCBzdHJlYW0gYWN0dWFsbWVudGUgYWN0aXZvLiBTaSBjYW1iaWEgZWwgY2hhdFxuICAgKiBtaWVudHJhcyB1biBzdHJlYW0gZXN0w6EgZW4gdnVlbG8sIGRlc2NhcnRhbW9zIGxvcyB0b2tlbnMgcmVzaWR1YWxlc1xuICAgKiBxdWUgcHVlZGFuIGxsZWdhciBhbnRlcyBkZSBxdWUgZWwgYWJvcnQgc2UgY29tcGxldGUuXG4gICAqL1xuICBjb25zdCBhY3RpdmVTdHJlYW1DaGF0SWRSZWYgPSB1c2VSZWY8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgLyoqIFNldHRlciBpbmRpcmVjdG8gcGFyYSBhYm9ydGFyIGVsIHN0cmVhbSBhbnRlcyBkZSBxdWUgZWwgaG9vayBkZVxuICAgKiBvcnF1ZXN0YWRvciBlc3TDqSBpbmljaWFsaXphZG8gKHNlIGxpbmtlYSBtw6FzIGFiYWpvKS4gKi9cbiAgY29uc3QgYWJvcnRTdHJlYW1TaWxlbnRseVJlZiA9IHVzZVJlZjwoKSA9PiB2b2lkPigoKSA9PiB1bmRlZmluZWQpXG4gIGNvbnN0IGNsZWFyU3RyZWFtVWlSZWYgPSB1c2VSZWY8KCkgPT4gdm9pZD4oKCkgPT4gdW5kZWZpbmVkKVxuICBjb25zdCBbYWN0aXZlTG9hZGluZ3MsIHNldEFjdGl2ZUxvYWRpbmdzXSA9IHVzZVN0YXRlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KHt9KVxuICBjb25zdCBbaXNDb250aW51aW5nU3RyZWFtLCBzZXRJc0NvbnRpbnVpbmdTdHJlYW1dID0gdXNlU3RhdGUoZmFsc2UpXG5cbiAgY29uc3QgaXNXZWJTZWFyY2hBY3RpdmVSZWYgPSB1c2VSZWYoaXNXZWJTZWFyY2hBY3RpdmUpXG4gIGNvbnN0IGlzRGVlcFNlYXJjaEFjdGl2ZVJlZiA9IHVzZVJlZihpc0RlZXBTZWFyY2hBY3RpdmUpXG4gIC8qKiBFdml0YSBjbG9zdXJlcyBvYnNvbGV0YXMgY3VhbmRvIGVsIGZvb3RlciBjb25zZXJ2YSBzZW5kTWVzc2FnZSBlbnRyZSByZW5kZXJzLiAqL1xuICBjb25zdCBjb250ZXh0UmVmID0gdXNlUmVmKHsgY2hpcHNQcm9qZWN0LCBwcm9qZWN0LCBjbGllbnQsIHRhc2sgfSlcbiAgY29udGV4dFJlZi5jdXJyZW50ID0geyBjaGlwc1Byb2plY3QsIHByb2plY3QsIGNsaWVudCwgdGFzayB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50ID0gaXNXZWJTZWFyY2hBY3RpdmVcbiAgICBpc0RlZXBTZWFyY2hBY3RpdmVSZWYuY3VycmVudCA9IGlzRGVlcFNlYXJjaEFjdGl2ZVxuICB9LCBbaXNXZWJTZWFyY2hBY3RpdmUsIGlzRGVlcFNlYXJjaEFjdGl2ZV0pXG5cbiAgY29uc3QgeyBsb2FkaW5nTWVzc2FnZXMsIG1lc3NhZ2VzLCBpc0xvYWRpbmdNb3JlTWVzc2FnZXMsIGxvYWRNZXNzYWdlcywgYWRkTWVzc2FnZSwgcmVtb3ZlTWVzc2FnZSwgaGFuZGxlU2Nyb2xsIH0gPVxuICAgIHVzZUNoYXRNZXNzYWdlcyh7XG4gICAgICBjaGF0SWQ6IGluaXRpYWxDaGF0SWQgfHwgY3VycmVudENoYXRJZC5jdXJyZW50LFxuICAgICAgY3VycmVudFVzZXIsXG4gICAgICB1c2VySW5pdGlhbE1lc3NhZ2UsXG4gICAgICBvbkVycm9yLFxuICAgICAgYWdlbnRzLFxuICAgIH0pXG5cbiAgbWVzc2FnZXNSZWYuY3VycmVudCA9IG1lc3NhZ2VzXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudCgnY2hhdC1sb2FkaW5nLW1lc3NhZ2VzLWNoYW5nZWQnLCB7XG4gICAgICBkZXRhaWw6IHsgbG9hZGluZ01lc3NhZ2VzIH0sXG4gICAgfSlcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KVxuICB9LCBbbG9hZGluZ01lc3NhZ2VzXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbml0aWFsQ2hhdElkICYmIGluaXRpYWxDaGF0SWQgIT09IGN1cnJlbnRDaGF0SWQuY3VycmVudCkge1xuICAgICAgLy8gU2kgaGF5IHVuIHN0cmVhbSBlbiBjdXJzbywgYWJvcnRhcmxvIHNpbGVuY2lvc2FtZW50ZSBwYXJhIHF1ZSBsb3NcbiAgICAgIC8vIHRva2VucyByZXNpZHVhbGVzIG5vIHNlIGVzY3JpYmFuIGVuIGVsIGNoYXQgbnVldm8uXG4gICAgICBhYm9ydFN0cmVhbVNpbGVudGx5UmVmLmN1cnJlbnQoKVxuXG4gICAgICAvLyBMaW1waWFyIGNvbnRleHRvIGdsb2JhbCBhbCBjYW1iaWFyIGRlIGNvbnZlcnNhY2nDs25cbiAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgIHNldENsaWVudD8uKG51bGwpXG4gICAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICAgIHNldFRhc2sobnVsbClcblxuICAgICAgY3VycmVudENoYXRJZC5jdXJyZW50ID0gaW5pdGlhbENoYXRJZFxuICAgICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gdXVpZHY0KClcbiAgICAgIGN1cnJlbnRVc2VyUXVlc3Rpb24uY3VycmVudCA9IG51bGxcbiAgICAgIHJlcG9ydGVkRXZlbnQuY3VycmVudCA9IGZhbHNlXG4gICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIHN0cmVhbWluZ1N0b3JlLmNsZWFyKClcblxuICAgICAgbG9hZE1lc3NhZ2VzKClcbiAgICB9XG4gIH0sIFtpbml0aWFsQ2hhdElkLCBwcm9qZWN0LCBzZXRQcm9qZWN0LCBzZXRDbGllbnQsIHNldENoaXBzUHJvamVjdCwgc2V0VGFzaywgbG9hZE1lc3NhZ2VzXSlcblxuICBjb25zdCBoYW5kbGVTdHJlYW1FcnJvciA9IHVzZUNhbGxiYWNrKFxuICAgIChlcnJvck1lc3NhZ2U/OiBzdHJpbmcsIGVycm9yUmF3TWVzc2FnZT86IHN0cmluZykgPT4ge1xuICAgICAgY2xlYXJTdHJlYW1VaVJlZi5jdXJyZW50KClcbiAgICAgIGNvbnN0IHRlbXBNZXNzYWdlSWQgPSBgYW5zd2VyLSR7Y3VycmVudE1lc3NhZ2VJZC5jdXJyZW50fS1zdHJlYW1pbmdgXG4gICAgICBzdHJlYW1pbmdTdG9yZS5jbGVhcigpXG4gICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIHJlbW92ZU1lc3NhZ2UodGVtcE1lc3NhZ2VJZClcblxuICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgIGVycm9yTWVzc2FnZSA9PT0gXCJBY2Nlc3MgZGVuaWVkOiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGlzIGFnZW50XCJcbiAgICAgICAgICA/IHQoJ2NoYXQuZXJyb3JBY2Nlc3NEZW5pZWQnKVxuICAgICAgICAgIDogZXJyb3JNZXNzYWdlID09PSAnaW52YWxpZF9yZXF1ZXN0X2Vycm9yJyAmJiBlcnJvclJhd01lc3NhZ2U/LmluY2x1ZGVzKCdwcm9tcHQgaXMgdG9vIGxvbmcnKVxuICAgICAgICAgICAgPyB0KCdjaGF0LmVycm9yUHJvbXB0VG9vTG9uZycsIHsgdXNlZDogZXJyb3JSYXdNZXNzYWdlLm1hdGNoKC8oXFxkKykgdG9rZW5zLyk/LlsxXSA/PyAnJyB9KVxuICAgICAgICAgICAgOiB0KCdjaGF0LmVycm9yJylcblxuICAgICAgYWRkTWVzc2FnZSh7XG4gICAgICAgIGlkOiBgYW5zd2VyLSR7Y3VycmVudE1lc3NhZ2VJZC5jdXJyZW50fWAsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiAnQXNzaXN0YW50JyB9LFxuICAgICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgfSlcbiAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICB9LFxuICAgIFthZGRNZXNzYWdlLCByZW1vdmVNZXNzYWdlLCB0XVxuICApXG5cbiAgY29uc3QgaGFuZGxlU3RyZWFtVXBkYXRlID0gdXNlQ2FsbGJhY2soXG4gICAgKGNvbnRlbnQ6IHN0cmluZywgc291cmNlczogYW55LCBtZW1vcnlTZXNzaW9uSWQ6IHN0cmluZykgPT4ge1xuICAgICAgLy8gU2kgZWwgY2hhdCBjYW1iacOzIG1pZW50cmFzIGVsIHN0cmVhbSBlc3RhYmEgZW4gdnVlbG8sIGRlc2NhcnRhciBlbFxuICAgICAgLy8gdG9rZW4gcmVzaWR1YWw6IG5vIGRlYmUgcGludGFyc2UgZW4gZWwgbnVldm8gY2hhdC5cbiAgICAgIGlmIChhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCAhPSBudWxsICYmIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ICE9PSBjdXJyZW50Q2hhdElkLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRlbXBNZXNzYWdlSWQgPSBgYW5zd2VyLSR7Y3VycmVudE1lc3NhZ2VJZC5jdXJyZW50fS1zdHJlYW1pbmdgXG5cbiAgICAgIC8vIFByaW1lcmEgbGxhbWFkYSBkZSBlc3RlIHN0cmVhbTogaW5zZXJ0YW1vcyBlbCBwbGFjZWhvbGRlciBlbiBlbFxuICAgICAgLy8gYXJyYXkgZGUgYG1lc3NhZ2VzYCB1bmEgw7puaWNhIHZlei4gTGFzIGxsYW1hZGFzIHN1YnNpZ3VpZW50ZXMgeWEgbm9cbiAgICAgIC8vIHRvY2FuIGBtZXNzYWdlc2A7IGVsIHRleHRvIHZpdmUgZW4gZWwgc3RyZWFtaW5nU3RvcmUgKGV4dGVybm8pLCBwb3JcbiAgICAgIC8vIGxvIHF1ZSBSZWFjdCBubyByZS1yZW5kZXJpemEgZWwgw6FyYm9sIGNvbXBsZXRvIGVuIGNhZGEgdG9rZW4uXG4gICAgICBpZiAoc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ICE9PSB0ZW1wTWVzc2FnZUlkKSB7XG4gICAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IHRlbXBNZXNzYWdlSWRcbiAgICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBjdXJyZW50Q2hhdElkLmN1cnJlbnRcbiAgICAgICAgc3RyZWFtaW5nU3RvcmUuc3RhcnQodGVtcE1lc3NhZ2VJZClcbiAgICAgICAgYWRkTWVzc2FnZSh7XG4gICAgICAgICAgaWQ6IHRlbXBNZXNzYWdlSWQsXG4gICAgICAgICAgbWVzc2FnZTogJycsXG4gICAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogJ0Fzc2lzdGFudCcgfSxcbiAgICAgICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgICAgIHNvdXJjZXMsXG4gICAgICAgICAgbWVtb3J5U2Vzc2lvbklkLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBzdHJlYW1pbmdTdG9yZS5zZXRUZXh0KHRlbXBNZXNzYWdlSWQsIGNvbnRlbnQpXG4gICAgfSxcbiAgICBbYWRkTWVzc2FnZV1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVN0cmVhbUZpbmlzaCA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChcbiAgICAgIGNvbnRlbnQ6IHN0cmluZyxcbiAgICAgIHNvdXJjZXM6IGFueSxcbiAgICAgIG1lbW9yeVNlc3Npb25JZDogc3RyaW5nLFxuICAgICAgcmF3QXR0YWNobWVudHM/OiBhbnlbXSB8IG51bGwsXG4gICAgICBzdWdnZXN0aW9ucz86IHN0cmluZ1tdIHwgbnVsbCxcbiAgICAgIGNvbXBsZXRlZEFnZW50SWQ/OiBzdHJpbmcgfCBudWxsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB0ZW1wTWVzc2FnZUlkID0gYGFuc3dlci0ke2N1cnJlbnRNZXNzYWdlSWQuY3VycmVudH0tc3RyZWFtaW5nYFxuICAgICAgc3RyZWFtaW5nU3RvcmUuY2xlYXIoKVxuICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgcmVtb3ZlTWVzc2FnZSh0ZW1wTWVzc2FnZUlkKVxuICAgICAgY29uc3QgYXR0YWNobWVudHMgPSBub3JtYWxpemVBc3Npc3RhbnRBdHRhY2htZW50cyhyYXdBdHRhY2htZW50cylcblxuICAgICAgLy8gRGV0ZWN0YXIgdG9kYXMgbGFzIFVSTHMgZGUgdGFyZWFzICguLi4vdGFza3MvMTIzL2RldGFpbHxtZXNzYWdlfG1lc3NhZ2VzfGZpbGVzfGhpc3Rvcnl8aG91cnMpXG4gICAgICBjb25zdCB0YXNrVXJsUmVnZXggPSBuZXcgUmVnRXhwKFRBU0tfVVJMX1JFR0VYX1BBVFRFUk4sICdnJylcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBbLi4uY29udGVudC5tYXRjaEFsbCh0YXNrVXJsUmVnZXgpXVxuXG4gICAgICBsZXQgY29udGVudFRvQWRkID0gY29udGVudFxuICAgICAgY29uc3QgcHJldmlvdXNNZXNzYWdlID0gbWVzc2FnZXNSZWYuY3VycmVudC5maWx0ZXIobSA9PiBtLmlkICE9PSB0ZW1wTWVzc2FnZUlkKS5hdCgtMSlcbiAgICAgIGNvbnN0IGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgPSBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsICE9IG51bGxcbiAgICAgIGNvbnN0IFRBU0tfQ1JFQVRJT05fVE9PTFMgPSBbJ2NyZWF0ZV90YXNrJywgJ2NyZWF0ZV90YXNrc19iYXRjaCcsICdjbG9uZV90YXNrJ11cbiAgICAgIGNvbnN0IFRBU0tfRURJVF9UT09MUyA9IFtcbiAgICAgICAgJ2VkaXRfdGFzaycsXG4gICAgICAgICdlZGl0X3Rhc2tzX2JhdGNoJyxcbiAgICAgICAgJ3Rhc2tfYXNzaWduJyxcbiAgICAgICAgJ3Rhc2tfdW5hc3NpZ24nLFxuICAgICAgICAndXBkYXRlX3Rhc2tfdHlwZScsXG4gICAgICAgICd1cGRhdGVfZXN0aW1hdGVkX2hvdXJzJyxcbiAgICAgICAgJ2Fzc2lnbl90YXNrX2xhYmVsJyxcbiAgICAgIF1cbiAgICAgIGNvbnN0IFRBU0tfREVMRVRFX1RPT0xTID0gWydkZWxldGVfdGFzaycsICdkZWxldGVfdGFza3NfYmF0Y2gnXVxuICAgICAgY29uc3QgcGVuZGluZ0FjdGlvbnMgPSBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsPy5wZW5kaW5nX2FjdGlvbnMgfHwgW11cbiAgICAgIGNvbnN0IHdhc1Rhc2tDcmVhdGlvbiA9XG4gICAgICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiZcbiAgICAgICAgcGVuZGluZ0FjdGlvbnMuc29tZSgoYWN0aW9uOiBhbnkpID0+IFRBU0tfQ1JFQVRJT05fVE9PTFMuaW5jbHVkZXMoYWN0aW9uLnRvb2xfbmFtZSkpXG4gICAgICBjb25zdCB3YXNUYXNrRWRpdCA9XG4gICAgICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiYgcGVuZGluZ0FjdGlvbnMuc29tZSgoYWN0aW9uOiBhbnkpID0+IFRBU0tfRURJVF9UT09MUy5pbmNsdWRlcyhhY3Rpb24udG9vbF9uYW1lKSlcbiAgICAgIGNvbnN0IHdhc1Rhc2tEZWxldGUgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zLnNvbWUoKGFjdGlvbjogYW55KSA9PiBUQVNLX0RFTEVURV9UT09MUy5pbmNsdWRlcyhhY3Rpb24udG9vbF9uYW1lKSlcbiAgICAgIGNvbnN0IHdhc0NyZWF0ZUFnZW50QXBwcm92ZWQgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgIHByZXZpb3VzTWVzc2FnZT8uYXBwcm92YWxTdGF0dXMgPT09ICdhcHByb3ZlZCcgJiZcbiAgICAgICAgcGVuZGluZ0FjdGlvbnMuc29tZSgoYWN0aW9uOiBhbnkpID0+IGFjdGlvbi50b29sX25hbWUgPT09ICdjcmVhdGVfYWdlbnQnKVxuICAgICAgY29uc3Qgd2FzQ29uZmlndXJlQWdlbnRBY2Nlc3NBcHByb3ZlZCA9XG4gICAgICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiZcbiAgICAgICAgcHJldmlvdXNNZXNzYWdlPy5hcHByb3ZhbFN0YXR1cyA9PT0gJ2FwcHJvdmVkJyAmJlxuICAgICAgICBwZW5kaW5nQWN0aW9ucy5zb21lKChhY3Rpb246IGFueSkgPT4gKGFjdGlvbi50b29sX25hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdjb25maWd1cmVfYWdlbnRfYWNjZXNzJylcbiAgICAgIGxldCBjcmVhdGVBZ2VudEZvbGxvd1VwOiB7IGFnZW50SWQ6IHN0cmluZyB9IHwgdW5kZWZpbmVkXG4gICAgICBpZiAod2FzQ3JlYXRlQWdlbnRBcHByb3ZlZCAmJiB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyAmJiBjb21wbGV0ZWRBZ2VudElkPy50cmltKCkpIHtcbiAgICAgICAgY3JlYXRlQWdlbnRGb2xsb3dVcCA9IHsgYWdlbnRJZDogY29tcGxldGVkQWdlbnRJZC50cmltKCkgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgd2FzQ29uZmlndXJlQWdlbnRBY2Nlc3NBcHByb3ZlZCAmJlxuICAgICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyAmJlxuICAgICAgICAoY29tcGxldGVkQWdlbnRJZD8udHJpbSgpIHx8XG4gICAgICAgICAgZXh0cmFjdEFnZW50SWRGcm9tUGVuZGluZ0FjdGlvbnNCeVRvb2xOYW1lKHBlbmRpbmdBY3Rpb25zLCAnY29uZmlndXJlX2FnZW50X2FjY2VzcycpKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ3VyZWRBZ2VudElkID1cbiAgICAgICAgICBjb21wbGV0ZWRBZ2VudElkPy50cmltKCkgfHxcbiAgICAgICAgICBleHRyYWN0QWdlbnRJZEZyb21QZW5kaW5nQWN0aW9uc0J5VG9vbE5hbWUocGVuZGluZ0FjdGlvbnMsICdjb25maWd1cmVfYWdlbnRfYWNjZXNzJylcbiAgICAgICAgY3JlYXRlQWdlbnRGb2xsb3dVcCA9IHtcbiAgICAgICAgICBhZ2VudElkOiBjb25maWd1cmVkQWdlbnRJZCBhcyBzdHJpbmcsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHdhc0NyZWF0ZUFnZW50QXBwcm92ZWQpIHtcbiAgICAgICAgZXZlbnQoRVZFTlRTLmFpQ2hhdEhpdGxPcHRpb24sIHtcbiAgICAgICAgICBhZ2VudF90eXBlOiBnZXRIaXRsQW5hbHl0aWNzQWdlbnRUeXBlKGFnZW50KSxcbiAgICAgICAgICBhY3Rpb25fdHlwZTogYnVpbGRIaXRsQWN0aW9uVHlwZUxpc3QocGVuZGluZ0FjdGlvbnMpLFxuICAgICAgICAgIGRlY2lzaW9uOiAnYWNjZXB0JyxcbiAgICAgICAgICBvcHRpb246ICdjcmVhdGVfYWdlbnQnLFxuICAgICAgICAgIC4uLihjb21wbGV0ZWRBZ2VudElkPy50cmltKCkgPyB7IGNyZWF0ZWRfYWdlbnRfaWQ6IGNvbXBsZXRlZEFnZW50SWQudHJpbSgpIH0gOiB7fSksXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdhc0VkaXRBZ2VudEFwcHJvdmVkID1cbiAgICAgICAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSAmJlxuICAgICAgICBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsU3RhdHVzID09PSAnYXBwcm92ZWQnICYmXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zLnNvbWUoKGFjdGlvbjogYW55KSA9PiAoYWN0aW9uLnRvb2xfbmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ2VkaXRfYWdlbnQnKVxuXG4gICAgICBsZXQgZWRpdEFnZW50Rm9sbG93VXA6IHsgYWdlbnRJZDogc3RyaW5nIH0gfCB1bmRlZmluZWRcbiAgICAgIGlmICh3YXNFZGl0QWdlbnRBcHByb3ZlZCkge1xuICAgICAgICBjb25zdCBmcm9tU3RyZWFtID0gY29tcGxldGVkQWdlbnRJZD8udHJpbSgpXG4gICAgICAgIGNvbnN0IGZyb21BcmdzID0gZXh0cmFjdEFnZW50SWRGcm9tRWRpdEFnZW50UGVuZGluZ0FjdGlvbnMocGVuZGluZ0FjdGlvbnMpXG4gICAgICAgIGNvbnN0IHJlc29sdmVkQWdlbnRJZCA9IGZyb21TdHJlYW0gfHwgZnJvbUFyZ3NcbiAgICAgICAgaWYgKHJlc29sdmVkQWdlbnRJZCkge1xuICAgICAgICAgIGVkaXRBZ2VudEZvbGxvd1VwID0geyBhZ2VudElkOiByZXNvbHZlZEFnZW50SWQgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhc2tJZHNGcm9tVXJscyA9IG1hdGNoZXMubWFwKG1hdGNoID0+IHBhcnNlSW50KG1hdGNoWzFdLCAxMCkpXG4gICAgICBjb25zdCB0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsID0gZXh0cmFjdFRhc2tJZHNGcm9tRGVsZXRlUGVuZGluZ0FjdGlvbnMocGVuZGluZ0FjdGlvbnMpXG4gICAgICBjb25zdCB0YXNrSWRzRnJvbURlbGV0aW9uVGV4dCA9XG4gICAgICAgIHdhc1Rhc2tEZWxldGUgJiYgdGFza0lkc0Zyb21VcmxzLmxlbmd0aCA9PT0gMCAmJiB0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsLmxlbmd0aCA9PT0gMFxuICAgICAgICAgID8gZXh0cmFjdFRhc2tJZHNGcm9tQXNzaXN0YW50RGVsZXRpb25UZXh0KGNvbnRlbnQpXG4gICAgICAgICAgOiBbXVxuICAgICAgY29uc3QgdGFza0lkc0ZvckRhc2hib2FyZCA9XG4gICAgICAgIHRhc2tJZHNGcm9tVXJscy5sZW5ndGggPiAwXG4gICAgICAgICAgPyB0YXNrSWRzRnJvbVVybHNcbiAgICAgICAgICA6IHRhc2tJZHNGcm9tRGVsZXRlQXBwcm92YWwubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyB0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsXG4gICAgICAgICAgICA6IHRhc2tJZHNGcm9tRGVsZXRpb25UZXh0XG5cbiAgICAgIGNvbnN0IHNob3VsZFN5bmNEYXNoYm9hcmQgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgICh3YXNUYXNrQ3JlYXRpb24gfHwgd2FzVGFza0VkaXQgfHwgd2FzVGFza0RlbGV0ZSkgJiZcbiAgICAgICAgdGFza0lkc0ZvckRhc2hib2FyZC5sZW5ndGggPiAwXG5cbiAgICAgIGlmIChzaG91bGRTeW5jRGFzaGJvYXJkKSB7XG4gICAgICAgIGNvbnN0IHRhc2tJZHMgPSB0YXNrSWRzRm9yRGFzaGJvYXJkXG4gICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB0YWIgPSBhd2FpdCBnZXRUYWJUYXNrRGVmYXVsdCh0YXNrSWRzWzBdKVxuICAgICAgICAgIGNvbnN0IHRhYlNlZ21lbnQgPSB0YWIgPyBgLyR7dGFifWAgOiAnL2RldGFpbCdcbiAgICAgICAgICBjb250ZW50VG9BZGQgPSBjb250ZW50LnJlcGxhY2UodGFza1VybFJlZ2V4LCB1cmwgPT5cbiAgICAgICAgICAgIHVybC5yZXBsYWNlKC9cXC8oZGV0YWlsfG1lc3NhZ2V8bWVzc2FnZXN8ZmlsZXN8aGlzdG9yeXxob3VycykoPz0kfFxcPykvLCB0YWJTZWdtZW50KVxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RQcm9qZWN0TWVzc2FnZSA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQuZmlsdGVyKG1zZyA9PiBtc2cucHJvamVjdElkKS5hdCgtMSlcbiAgICAgICAgY29uc3QgY29udGV4dFByb2plY3RJZFJhdyA9IHByb2plY3Q/LmlkIHx8IGxhc3RQcm9qZWN0TWVzc2FnZT8ucHJvamVjdElkXG4gICAgICAgIGNvbnN0IGNvbnRleHRQcm9qZWN0SWQgPSBjb250ZXh0UHJvamVjdElkUmF3ID8gcGFyc2VJbnQoU3RyaW5nKGNvbnRleHRQcm9qZWN0SWRSYXcpLCAxMCkgOiBudWxsXG4gICAgICAgIGNvbnN0IHBhdGhNYXRjaCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5tYXRjaCgvXlxcL3Byb2plY3RzXFwvKFxcZCspXFwvLylcbiAgICAgICAgY29uc3Qgcm91dGVQcm9qZWN0SWQgPSBwYXRoTWF0Y2ggPyBwYXJzZUludChwYXRoTWF0Y2hbMV0sIDEwKSA6IG51bGxcbiAgICAgICAgY29uc3QgaXNPblByb2plY3RSb3V0ZSA9IGNvbnRleHRQcm9qZWN0SWQgJiYgcm91dGVQcm9qZWN0SWQgJiYgY29udGV4dFByb2plY3RJZCA9PT0gcm91dGVQcm9qZWN0SWRcblxuICAgICAgICBpZiAoaXNPblByb2plY3RSb3V0ZSkge1xuICAgICAgICAgIGlmICh3YXNUYXNrQ3JlYXRpb24pIHtcbiAgICAgICAgICAgIHdpbmRvdy5uZXdQcm9qZWN0RGFzaGJvYXJkPy5hZGRFeGlzdGluZ1Rhc2tUb0Rhc2hib2FyZD8uKHRhc2tJZHMpXG4gICAgICAgICAgfSBlbHNlIGlmICh3YXNUYXNrRWRpdCkge1xuICAgICAgICAgICAgd2luZG93Lm5ld1Byb2plY3REYXNoYm9hcmQ/LmVkaXRFeGlzdGluZ1Rhc2tJbkRhc2hib2FyZD8uKHRhc2tJZHMpXG4gICAgICAgICAgfSBlbHNlIGlmICh3YXNUYXNrRGVsZXRlKSB7XG4gICAgICAgICAgICB3aW5kb3cubmV3UHJvamVjdERhc2hib2FyZD8uZGVsZXRlRXhpc3RpbmdUYXNrRnJvbURhc2hib2FyZD8uKHRhc2tJZHMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZmV0Y2ggZGVsIHRhc2sgcGFuZWwgc2kgZXN0w6EgYWJpZXJ0byB5IGxhIHRvb2wgYXByb2JhZGEgZWRpdMOzL2JvcnLDsyBlc2EgdGFyZWEuXG4gICAgICAvLyBDdWJyZSBsb3MgZG9zIGZsdWpvcyBkZSBhcHByb3ZhbDpcbiAgICAgIC8vICAgMSkgQXBwcm92YWwgcG9yIGJvdMOzbiDihpIgYHByZXZpb3VzTWVzc2FnZS5hcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnNgICh2w61hIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UpXG4gICAgICAvLyAgIDIpIE1hbnVhbCBhcHByb3ZhbCAodXN1YXJpbyB0aXBlYSBcInNpXCIvXCJub1wiKSDihpIgYGxhc3RNYW51YWxBcHByb3ZhbFJlZi5jdXJyZW50YFxuICAgICAgY29uc3Qgb3BlblRhc2tQYW5lbElkID0gd2luZG93LnRhc2tQYW5lbD8udGFza0lkXG4gICAgICBjb25zdCBtYW51YWxBcHByb3ZhbCA9IGxhc3RNYW51YWxBcHByb3ZhbFJlZi5jdXJyZW50XG4gICAgICBsYXN0TWFudWFsQXBwcm92YWxSZWYuY3VycmVudCA9IG51bGwgLy8gY29uc3VtaXIgdW5hIHNvbGEgdmV6XG4gICAgICBjb25zdCBtYW51YWxXYXNUYXNrRWRpdCA9ICEhbWFudWFsQXBwcm92YWwgJiYgVEFTS19FRElUX1RPT0xTLmluY2x1ZGVzKG1hbnVhbEFwcHJvdmFsLnRvb2xOYW1lKVxuICAgICAgY29uc3QgbWFudWFsV2FzVGFza0RlbGV0ZSA9ICEhbWFudWFsQXBwcm92YWwgJiYgVEFTS19ERUxFVEVfVE9PTFMuaW5jbHVkZXMobWFudWFsQXBwcm92YWwudG9vbE5hbWUpXG5cbiAgICAgIGlmIChvcGVuVGFza1BhbmVsSWQgJiYgKHdhc1Rhc2tFZGl0IHx8IHdhc1Rhc2tEZWxldGUgfHwgbWFudWFsV2FzVGFza0VkaXQgfHwgbWFudWFsV2FzVGFza0RlbGV0ZSkpIHtcbiAgICAgICAgY29uc3QgbWFudWFsUHNldWRvQWN0aW9uOiBQZW5kaW5nQWN0aW9uIHwgbnVsbCA9IG1hbnVhbEFwcHJvdmFsXG4gICAgICAgICAgPyAoeyB0b29sX25hbWU6IG1hbnVhbEFwcHJvdmFsLnRvb2xOYW1lLCB0b29sX2FyZ3M6IG1hbnVhbEFwcHJvdmFsLnRvb2xBcmdzID8/IHt9IH0gYXMgUGVuZGluZ0FjdGlvbilcbiAgICAgICAgICA6IG51bGxcbiAgICAgICAgY29uc3QgYWZmZWN0ZWRUYXNrSWRzID0gW1xuICAgICAgICAgIC4uLmV4dHJhY3RUYXNrSWRzRnJvbVBlbmRpbmdBY3Rpb25zQXJncyhwZW5kaW5nQWN0aW9ucyksXG4gICAgICAgICAgLi4udGFza0lkc0Zyb21VcmxzLFxuICAgICAgICAgIC4uLnRhc2tJZHNGcm9tRGVsZXRlQXBwcm92YWwsXG4gICAgICAgICAgLi4uKG1hbnVhbFBzZXVkb0FjdGlvbiA/IGV4dHJhY3RUYXNrSWRzRnJvbVBlbmRpbmdBY3Rpb25zQXJncyhbbWFudWFsUHNldWRvQWN0aW9uXSkgOiBbXSksXG4gICAgICAgIF0ubWFwKFN0cmluZylcbiAgICAgICAgaWYgKGFmZmVjdGVkVGFza0lkcy5pbmNsdWRlcyhTdHJpbmcob3BlblRhc2tQYW5lbElkKSkpIHtcbiAgICAgICAgICB3aW5kb3cudGFza1BhbmVsPy5yZWZldGNoVGFzaz8uKClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhZGRNZXNzYWdlKHtcbiAgICAgICAgaWQ6IGBhbnN3ZXItJHttZW1vcnlTZXNzaW9uSWR9YCxcbiAgICAgICAgbWVzc2FnZTogY29udGVudFRvQWRkLFxuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogJ0Fzc2lzdGFudCcgfSxcbiAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgc291cmNlcyxcbiAgICAgICAgLi4uKGF0dGFjaG1lbnRzLmxlbmd0aCA+IDAgPyB7IGF0dGFjaG1lbnRzIH0gOiB7fSksXG4gICAgICAgIG1lbW9yeVNlc3Npb25JZCxcbiAgICAgICAgc3VnZ2VzdGlvbnM6IHN1Z2dlc3Rpb25zIHx8IFtdLFxuICAgICAgICAuLi4oY3JlYXRlQWdlbnRGb2xsb3dVcCA/IHsgY3JlYXRlQWdlbnRGb2xsb3dVcCB9IDoge30pLFxuICAgICAgfSlcblxuICAgICAgaWYgKGNyZWF0ZUFnZW50Rm9sbG93VXA/LmFnZW50SWQpIHtcbiAgICAgICAgZmV0Y2hBZ2VudERldGFpbChjcmVhdGVBZ2VudEZvbGxvd1VwLmFnZW50SWQpXG4gICAgICAgICAgLnRoZW4oY2hhdEFnZW50ID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnbWFpYS1tZXJnZS1jcmVhdGVkLWFnZW50LWludG8tbGlzdCcsIHtcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHsgYWdlbnQ6IGNoYXRBZ2VudCB9LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbdXNlQ2hhdE1hbmFnZXJdIE5vIHNlIHB1ZG8gYcOxYWRpciBlbCBhZ2VudGUgcmVjacOpbiBjcmVhZG8gYWwgbGlzdGFkbycsIGVycilcbiAgICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoZWRpdEFnZW50Rm9sbG93VXA/LmFnZW50SWQpIHtcbiAgICAgICAgZmV0Y2hBZ2VudERldGFpbChlZGl0QWdlbnRGb2xsb3dVcC5hZ2VudElkKVxuICAgICAgICAgIC50aGVuKGNoYXRBZ2VudCA9PiB7XG4gICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ21haWEtc3luYy1lZGl0ZWQtYWdlbnQtZnJvbS1jaGF0Jywge1xuICAgICAgICAgICAgICAgIGRldGFpbDogeyBhZ2VudDogY2hhdEFnZW50IH0sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1t1c2VDaGF0TWFuYWdlcl0gTm8gc2UgcHVkbyByZWZyZXNjYXIgZWwgYWdlbnRlIGVkaXRhZG8nLCBlcnIpXG4gICAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgaWYgKGZpcnN0VGltZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdyZWZldGNoLXNlc3Npb24nKVxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KVxuICAgICAgICBmaXJzdFRpbWVSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICB9XG4gICAgfSxcbiAgICBbYWRkTWVzc2FnZSwgcmVtb3ZlTWVzc2FnZSwgcHJvamVjdCwgZ2V0VGFiVGFza0RlZmF1bHQsIGV2ZW50LCBhZ2VudF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVN0cmVhbVN0b3AgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY2xlYXJTdHJlYW1VaVJlZi5jdXJyZW50KClcbiAgICBjb25zdCB0ZW1wTWVzc2FnZUlkID0gYGFuc3dlci0ke2N1cnJlbnRNZXNzYWdlSWQuY3VycmVudH0tc3RyZWFtaW5nYFxuICAgIHN0cmVhbWluZ1N0b3JlLmNsZWFyKClcbiAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgcmVtb3ZlTWVzc2FnZSh0ZW1wTWVzc2FnZUlkKVxuXG4gICAgYWRkTWVzc2FnZSh7XG4gICAgICBpZDogYGFuc3dlci0ke2N1cnJlbnRNZXNzYWdlSWQuY3VycmVudH0tY2FuY2VsbGVkYCxcbiAgICAgIG1lc3NhZ2U6IHQoJ2NoYXQuY2FuY2VsbGVkJyksXG4gICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6ICdBc3Npc3RhbnQnIH0sXG4gICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgaXNGcm9udGVuZENhbmNlbGxlZDogdHJ1ZSxcbiAgICB9KVxuICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdyZWZldGNoLXNlc3Npb24nKVxuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudClcbiAgICB9LCA1MDApXG4gIH0sIFthZGRNZXNzYWdlLCByZW1vdmVNZXNzYWdlLCB0XSlcblxuICBjb25zdCBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkID0gdXNlQ2FsbGJhY2soXG4gICAgKGFwcHJvdmFsOiBBcHByb3ZhbFJlcXVlc3QsIGFjY3VtdWxhdGVkQ29udGVudDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB0ZW1wTWVzc2FnZUlkID0gYGFuc3dlci0ke2N1cnJlbnRNZXNzYWdlSWQuY3VycmVudH0tc3RyZWFtaW5nYFxuICAgICAgc3RyZWFtaW5nU3RvcmUuY2xlYXIoKVxuICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICByZW1vdmVNZXNzYWdlKHRlbXBNZXNzYWdlSWQpXG5cbiAgICAgIGNvbnN0IGhpdGxDb250ZXh0OiBIaXRsRXhlY3V0aW9uQ29udGV4dCA9IHtcbiAgICAgICAgbWVzc2FnZUlkOiBgYXBwcm92YWwtJHthcHByb3ZhbC5vcmlnaW5hbF90aHJlYWRfaWR9YCxcbiAgICAgICAgbWVzc2FnZVRleHQ6IGFjY3VtdWxhdGVkQ29udGVudCB8fCAnJyxcbiAgICAgICAgYXBwcm92YWwsXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zOiBhcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnMsXG4gICAgICAgIHRocmVhZElkczogYXBwcm92YWwucGVuZGluZ19hY3Rpb25zPy5tYXAoYWN0aW9uID0+IGFjdGlvbi50aHJlYWRfaWQpLFxuICAgICAgfVxuICAgICAgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYuY3VycmVudCA9IGhpdGxDb250ZXh0XG5cbiAgICAgIGlmIChhcHByb3ZhbC5tYW51YWxfYXBwcm92YWxfZGV0ZWN0ZWQpIHtcbiAgICAgICAgY29uc3QgZmlyc3RBY3Rpb24gPSBhcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnM/LlswXVxuICAgICAgICBjb25zdCB0b29sTmFtZSA9IChhcHByb3ZhbCBhcyB7IHRvb2xfbmFtZT86IHN0cmluZyB9KS50b29sX25hbWUgPz8gZmlyc3RBY3Rpb24/LnRvb2xfbmFtZSA/PyAnJ1xuICAgICAgICBjb25zdCB0b29sQXJncyA9XG4gICAgICAgICAgKChhcHByb3ZhbCBhcyB7IHRvb2xfYXJncz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pLnRvb2xfYXJncyA/P1xuICAgICAgICAgICAgKGZpcnN0QWN0aW9uPy50b29sX2FyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpKSB8fFxuICAgICAgICAgIG51bGxcbiAgICAgICAgaWYgKHRvb2xOYW1lKSB7XG4gICAgICAgICAgbGFzdE1hbnVhbEFwcHJvdmFsUmVmLmN1cnJlbnQgPSB7IHRvb2xOYW1lLCB0b29sQXJncyB9XG4gICAgICAgIH1cbiAgICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGEgbWVzc2FnZSB3aXRoIHRoZSBhcHByb3ZhbCByZXF1ZXN0XG4gICAgICBhZGRNZXNzYWdlKHtcbiAgICAgICAgaWQ6IGBhcHByb3ZhbC0ke2FwcHJvdmFsLm9yaWdpbmFsX3RocmVhZF9pZH1gLFxuICAgICAgICBtZXNzYWdlOiBhY2N1bXVsYXRlZENvbnRlbnQgfHwgJycsXG4gICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiAnQXNzaXN0YW50JyB9LFxuICAgICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgICBhcHByb3ZhbCxcbiAgICAgICAgYXBwcm92YWxTdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgIH0pXG4gICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgfSxcbiAgICBbYWRkTWVzc2FnZSwgcmVtb3ZlTWVzc2FnZV1cbiAgKVxuXG4gIGNvbnN0IHtcbiAgICBhc2tNYWlhLFxuICAgIGlzTG9hZGluZzogd2FpdGluZ1Jlc3BvbnNlLFxuICAgIGlzV3JpdGluZyxcbiAgICBsb2FkaW5nTWVzc2FnZSxcbiAgICBzdHJlYW1BY3Rpdml0eSxcbiAgICB1cGRhdGVTdHJlYW1BY3Rpdml0eSxcbiAgICBzdG9wU3RyZWFtaW5nLFxuICAgIGFib3J0U3RyZWFtU2lsZW50bHksXG4gIH0gPSB1c2VPcmNoZXN0cmF0b3JTdHJlYW0oe1xuICAgIG9uRXJyb3I6IGhhbmRsZVN0cmVhbUVycm9yLFxuICAgIG9uU3RyZWFtVXBkYXRlOiBoYW5kbGVTdHJlYW1VcGRhdGUsXG4gICAgb25GaW5pc2hTdHJlYW06IGhhbmRsZVN0cmVhbUZpbmlzaCxcbiAgICBvblN0b3A6IGhhbmRsZVN0cmVhbVN0b3AsXG4gICAgb25BcHByb3ZhbFJlcXVpcmVkOiBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkLFxuICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLFxuICB9KVxuXG4gIC8vIE1hbnRlbmVtb3MgZWwgc2V0dGVyIG3DoXMgcmVjaWVudGUgZW4gdW5hIHJlZiBwYXJhIHF1ZSBwdWVkYSB1c2Fyc2UgZGVzZGVcbiAgLy8gZWZlY3RvcyBkZWZpbmlkb3MgYW50ZXMgZW4gZWwgYXJjaGl2byAoY2FtYmlvIGRlIGNoYXQsIHJlc2V0LCBldGMuKS5cbiAgYWJvcnRTdHJlYW1TaWxlbnRseVJlZi5jdXJyZW50ID0gYWJvcnRTdHJlYW1TaWxlbnRseVxuICBjbGVhclN0cmVhbVVpUmVmLmN1cnJlbnQgPSAoKSA9PiB7XG4gICAgdXBkYXRlU3RyZWFtQWN0aXZpdHkobnVsbClcbiAgICBzZXRBY3RpdmVMb2FkaW5ncyh7fSlcbiAgICBzZXRJc0NvbnRpbnVpbmdTdHJlYW0oZmFsc2UpXG4gICAgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYuY3VycmVudCA9IG51bGxcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRQcm9qZWN0ID0gcHJvamVjdFxuXG4gIGNvbnN0IHNlbmRNZXNzYWdlID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgYXR0YWNobWVudHNPck9wdGlvbnM/OiBBdHRhY2htZW50RmlsZVtdIHwgU2VuZE1lc3NhZ2VPcHRpb25zLFxuICAgICAgZmFxSWQ/OiBzdHJpbmcsXG4gICAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZyxcbiAgICAgIG1lbnRpb25zPzogQ29udGV4dE1lbnRpb25bXSxcbiAgICAgIGZ1YUlkPzogc3RyaW5nLFxuICAgICAgc2NJZD86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50IHx8IHdhaXRpbmdSZXNwb25zZSB8fCBsb2FkaW5nTWVzc2FnZXMpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgYXR0YWNobWVudHMsIG9wdGlvbnMgfSA9IG5vcm1hbGl6ZVNlbmRNZXNzYWdlQXJncyhhdHRhY2htZW50c09yT3B0aW9ucylcbiAgICAgIC8vIExhcyBtZW50aW9ucyBwdWVkZW4gdmVuaXIgdsOtYSA1dG8gcGFyw6FtZXRybyAoY2FsbCBwb3NpdGlvbmFsIGRlc2RlIGVsIGZvb3RlcilcbiAgICAgIC8vIG8gdsOtYSBTZW5kTWVzc2FnZU9wdGlvbnMgKGNhbGwgcHJvZ3JhbcOhdGljbykuIEVsIHBhcsOhbWV0cm8gZXhwbMOtY2l0byBnYW5hLlxuICAgICAgY29uc3QgZWZmZWN0aXZlTWVudGlvbnMgPSBtZW50aW9ucyA/PyBvcHRpb25zLm1lbnRpb25zXG4gICAgICBjb25zdCBjb250ZXh0TWVzc2FnZTogQ29udGV4dE1lc3NhZ2UgfCB1bmRlZmluZWQgPSBidWlsZENvbnRleHRNZXNzYWdlKGVmZmVjdGl2ZU1lbnRpb25zKVxuICAgICAgY29uc3QgcGF5bG9hZEZ1YUlkID0gZnVhSWQgPz8gb3B0aW9ucy5mdWFJZFxuICAgICAgY29uc3QgcGF5bG9hZFNjSWQgPSBzY0lkID8/IG9wdGlvbnMuc2NJZFxuICAgICAgY29uc3QgcGF5bG9hZENvbnRleHREYXRhID0gb3B0aW9ucy5jb250ZXh0RGF0YVxuICAgICAgY29uc3QgZGlzcGxheU1lc3NhZ2UgPSBmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5KG1lc3NhZ2UsIHtcbiAgICAgICAgZnVhSWQ6IHBheWxvYWRGdWFJZCxcbiAgICAgICAgc2NJZDogcGF5bG9hZFNjSWQsXG4gICAgICB9KVxuXG4gICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIGNvbnN0IG5ld01lc3NhZ2VJZCA9IHV1aWR2NCgpXG4gICAgICBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQgPSBuZXdNZXNzYWdlSWRcbiAgICAgIGN1cnJlbnRVc2VyUXVlc3Rpb24uY3VycmVudCA9IG1lc3NhZ2VcblxuICAgICAgaWYgKCFyZXBvcnRlZEV2ZW50LmN1cnJlbnQpIHtcbiAgICAgICAgZXZlbnQoRVZFTlRTLnBtQWlUeXBlZFRleHQpXG4gICAgICAgIHJlcG9ydGVkRXZlbnQuY3VycmVudCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgLy8gVmVyaWZpY2FyIHNpIGVsIGNvbnRleHRvIGdsb2JhbCBlc3TDoSBkZXNhY3R1YWxpemFkb1xuICAgICAgY29uc3QgbGFzdE1lc3NhZ2VXaXRoUHJvamVjdCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQuZmlsdGVyKG1zZyA9PiBtc2cucHJvamVjdElkKS5hdCgtMSlcblxuICAgICAgY29uc3QgY3VycmVudEFnZW50RnJvbU1lc3NhZ2VzID0gbWVzc2FnZXNSZWYuY3VycmVudD8uW21lc3NhZ2VzUmVmLmN1cnJlbnQubGVuZ3RoIC0gMV0/LmFnZW50SWRcblxuICAgICAgLy8gTm8gYWdyZWdhciBwcm9qZWN0SWQgYWwgbWVuc2FqZSBkZWwgdXN1YXJpbyAtIHNlIGRldGVybWluYXLDoSBkZXNwdcOpc1xuICAgICAgYWRkTWVzc2FnZSh7XG4gICAgICAgIGlkOiBgcXVlc3Rpb24tJHtjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnR9YCxcbiAgICAgICAgbWVzc2FnZTogZGlzcGxheU1lc3NhZ2UsXG4gICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgIHVzZXI6IGN1cnJlbnRVc2VyLFxuICAgICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuVVNFUixcbiAgICAgICAgc291cmNlczogYXR0YWNobWVudHMsXG4gICAgICAgIC4uLihjb250ZXh0TWVzc2FnZSA/IHsgY29udGV4dE1lc3NhZ2UgfSA6IHt9KSxcbiAgICAgIH0pXG5cbiAgICAgIGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCA9IHV1aWR2NCgpXG5cbiAgICAgIGNvbnN0IHN0cmVhbWluZ1BsYWNlaG9sZGVySWQgPSBgYW5zd2VyLSR7Y3VycmVudE1lc3NhZ2VJZC5jdXJyZW50fS1zdHJlYW1pbmdgXG4gICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBzdHJlYW1pbmdQbGFjZWhvbGRlcklkXG4gICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IGN1cnJlbnRDaGF0SWQuY3VycmVudFxuICAgICAgYWRkTWVzc2FnZSh7XG4gICAgICAgIGlkOiBzdHJlYW1pbmdQbGFjZWhvbGRlcklkLFxuICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6IGFnZW50Py5uYW1lIHx8ICdBc3Npc3RhbnQnIH0sXG4gICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICB9KVxuXG4gICAgICBsZXQgZmluYWxNZXNzYWdlID0gbWVzc2FnZVxuXG4gICAgICBpZiAobWVzc2FnZSA9PT0gdCgncWEuaXRlbXMucmVudGFiaWxpZGFkX3Byb3llY3RvJykpIHtcbiAgICAgICAgZmluYWxNZXNzYWdlID0gYEZBUTogJHt0KCdxYS5pdGVtcy5yZW50YWJpbGlkYWRfcHJveWVjdG8nKX0gLSBUaXBvIGRlIHJlbnRhYmlsaWRhZDogJHtcbiAgICAgICAgICBvcHRpb25zLnByb2plY3RDaGFuZ2VkPy5pbmNvbWVUeXBlIHx8IGNvbnRleHRSZWYuY3VycmVudC5wcm9qZWN0Py5pbmNvbWVUeXBlXG4gICAgICAgIH1gXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhpc3RvcnkgPSBtZXNzYWdlc1JlZi5jdXJyZW50Lm1hcChoaXN0b3J5TWVzc2FnZSA9PiAoe1xuICAgICAgICBjb250ZW50OiBoaXN0b3J5TWVzc2FnZS5tZXNzYWdlLFxuICAgICAgICByb2xlOiBoaXN0b3J5TWVzc2FnZS51c2VyLmlkID09PSBhdXRoVXNlci5pZC50b1N0cmluZygpID8gQ2hhdEhpc3RvcnlSb2xlLlVTRVIgOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgfSkpXG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY2hpcHNQcm9qZWN0OiBjdHhDaGlwc1Byb2plY3QsXG4gICAgICAgIHByb2plY3Q6IGN0eFByb2plY3QsXG4gICAgICAgIGNsaWVudDogY3R4Q2xpZW50LFxuICAgICAgICB0YXNrOiBjdHhUYXNrLFxuICAgICAgfSA9IGNvbnRleHRSZWYuY3VycmVudFxuICAgICAgY29uc3QgbGFzdE1lc3NhZ2VQcm9qZWN0SWQgPSBsYXN0TWVzc2FnZVdpdGhQcm9qZWN0Py5wcm9qZWN0SWRcbiAgICAgIGNvbnN0IHByb2plY3RUb1JlcXVlc3QgPSByZXNvbHZlUHJvamVjdFRvUmVxdWVzdChjdHhDaGlwc1Byb2plY3QsIGxhc3RNZXNzYWdlUHJvamVjdElkKVxuXG4gICAgICBjb25zb2xlLmluZm8oJ1t1c2VDaGF0TWFuYWdlcl0gc2VuZE1lc3NhZ2UgY29udGV4dCByZXNvbHV0aW9uOicsIHtcbiAgICAgICAgY2hpcHNQcm9qZWN0OiBjdHhDaGlwc1Byb2plY3QsXG4gICAgICAgIGNoaXBzUHJvamVjdElkOiBjdHhDaGlwc1Byb2plY3Q/LnByb2plY3RJZCA/IE51bWJlcihjdHhDaGlwc1Byb2plY3QucHJvamVjdElkKSA6IG51bGwsXG4gICAgICAgIGxhc3RNZXNzYWdlUHJvamVjdElkLFxuICAgICAgICBwcm9qZWN0VG9SZXF1ZXN0LFxuICAgICAgICBjbGllbnRJZDogY3R4Q2xpZW50Py5pZCxcbiAgICAgICAgdGFza0lkOiBjdHhUYXNrPy5pZCxcbiAgICAgICAgcHJvamVjdFByb3BJZDogY3R4UHJvamVjdD8uaWQsXG4gICAgICAgIGFnZW50VHlwZTogYWdlbnQ/LnR5cGUsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZldGNoUHJvamVjdHMoW3Byb2plY3RUb1JlcXVlc3RdKVxuXG4gICAgICBjb25zdCBwYXlsb2FkRmFxSWQgPSBmYXFJZCA/PyBvcHRpb25zLmZhcUlkXG4gICAgICBjb25zdCBwYXlsb2FkQWdlbnRTdWdnZXN0aW9uSWQgPSBhZ2VudFN1Z2dlc3Rpb25JZCA/PyBvcHRpb25zLmFnZW50U3VnZ2VzdGlvbklkXG5cbiAgICAgIGNvbnN0IHBheWxvYWREYXRhID0ge1xuICAgICAgICBtZXNzYWdlOiBmaW5hbE1lc3NhZ2UsXG4gICAgICAgIGhpc3RvcnksXG4gICAgICAgIHByb2plY3RJZDogcHJvamVjdFRvUmVxdWVzdCxcbiAgICAgICAgbGFuZzogYXV0aFVzZXIubGFuZyxcbiAgICAgICAgdXNlcklkOiBhdXRoVXNlci5pZC50b1N0cmluZygpLFxuICAgICAgICBmaXJzdE5hbWU6IGF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgICAgICAgbGFzdE5hbWU6IGF1dGhVc2VyLmxhc3ROYW1lLFxuICAgICAgICBjb21wYW55SWQ6IGF1dGhVc2VyLmNvbXBhbnlfaWQudG9TdHJpbmcoKSxcbiAgICAgICAgY2hhdElkOiBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgICAgIG1lc3NhZ2VJZDogY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50LFxuICAgICAgICBhZ2VudE5hbWU6IGFnZW50Py5uYW1lIHx8ICcnLFxuICAgICAgICBhZ2VudElkOiBjdXJyZW50QWdlbnRGcm9tTWVzc2FnZXMgfHwgYWdlbnQ/LmlkISxcbiAgICAgICAgaXNXZWJTZWFyY2hBY3RpdmU6IGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgIGlzRGVlcFNlYXJjaEFjdGl2ZTogaXNEZWVwU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgIC4uLihjdHhQcm9qZWN0Py5mZWVJZCAhPSBudWxsID8geyBmZWVJZDogTnVtYmVyKGN0eFByb2plY3QuZmVlSWQpIH0gOiB7fSksXG4gICAgICAgIC4uLnJlc29sdmVDbGllbnRQYXlsb2FkKGN0eENsaWVudCwgY3R4UHJvamVjdCksXG4gICAgICAgIC4uLihwcm9qZWN0cz8ubGVuZ3RoID8geyBwcm9qZWN0TmFtZTogcHJvamVjdHNbMF0ubmFtZSB9IDoge30pLFxuICAgICAgICAuLi4oY3R4VGFzaz8uaWQgIT0gbnVsbFxuICAgICAgICAgID8geyB0YXNrSWQ6IE51bWJlcihjdHhUYXNrLmlkKSwgLi4uKGN0eFRhc2submFtZSA/IHsgdGFza05hbWU6IGN0eFRhc2submFtZSB9IDoge30pIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKGF0dGFjaG1lbnRzLmxlbmd0aCA+IDAgPyB7IGF0dGFjaG1lbnRzIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkRmFxSWQgPyB7IGZhcUlkOiBwYXlsb2FkRmFxSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWRBZ2VudFN1Z2dlc3Rpb25JZCA/IHsgYWdlbnRTdWdnZXN0aW9uSWQ6IHBheWxvYWRBZ2VudFN1Z2dlc3Rpb25JZCB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZEZ1YUlkID8geyBmdWFJZDogcGF5bG9hZEZ1YUlkIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkU2NJZCA/IHsgc2NJZDogcGF5bG9hZFNjSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50Py5lbnRpdHkgIT0gbnVsbCA/IHsgYWdlbnRFbnRpdHk6IGFnZW50LmVudGl0eSB9IDoge30pLFxuICAgICAgICAuLi4oYWdlbnQ/LnR5cGUgIT0gbnVsbCA/IHsgYWdlbnRUeXBlOiBhZ2VudC50eXBlIH0gOiB7fSksXG4gICAgICAgIC4uLihjb250ZXh0TWVzc2FnZSA/IHsgY29udGV4dE1lc3NhZ2UgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWRDb250ZXh0RGF0YSA/IHsgY29udGV4dERhdGE6IHBheWxvYWRDb250ZXh0RGF0YSB9IDoge30pLFxuICAgICAgfVxuXG4gICAgICBhc2tNYWlhKHBheWxvYWREYXRhKVxuICAgIH0sXG4gICAgW1xuICAgICAgYWRkTWVzc2FnZSxcbiAgICAgIGV2ZW50LFxuICAgICAgYXNrTWFpYSxcbiAgICAgIHByb2plY3QsXG4gICAgICBjbGllbnQsXG4gICAgICB0YXNrLFxuICAgICAgY2hpcHNQcm9qZWN0LFxuICAgICAgYXV0aFVzZXIsXG4gICAgICBhZ2VudCxcbiAgICAgIHQsXG4gICAgICB3YWl0aW5nUmVzcG9uc2UsXG4gICAgICBsb2FkaW5nTWVzc2FnZXMsXG4gICAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICAgIGlzRGVlcFNlYXJjaEFjdGl2ZSxcbiAgICBdXG4gIClcblxuICBjb25zdCBjaGFuZ2VQcm9qZWN0ID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogUHJvamVjdCkgPT4ge1xuICAgICAgaWYgKCFjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQpIHJldHVyblxuXG4gICAgICBpZiAob3B0aW9uLmlkICE9PSBwcm9qZWN0Py5pZCkge1xuICAgICAgICBzZXRQcm9qZWN0KG9wdGlvbilcbiAgICAgIH1cblxuICAgICAgaWYgKHByb2plY3QgJiYgY3VycmVudFVzZXJRdWVzdGlvbi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnN0IGhpc3RvcnkgPSBtZXNzYWdlc1JlZi5jdXJyZW50Lm1hcChoaXN0b3J5TWVzc2FnZSA9PiAoe1xuICAgICAgICAgIGNvbnRlbnQ6IGhpc3RvcnlNZXNzYWdlLm1lc3NhZ2UsXG4gICAgICAgICAgcm9sZTogaGlzdG9yeU1lc3NhZ2UudXNlci5pZCA9PT0gYXV0aFVzZXIuaWQudG9TdHJpbmcoKSA/IENoYXRIaXN0b3J5Um9sZS5VU0VSIDogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgfSkpXG5cbiAgICAgICAgY29uc29sZS5pbmZvKCdbdXNlQ2hhdE1hbmFnZXJdIFBBVEg9Y2hhbmdlUHJvamVjdCDigJQgdXNhIG9wdGlvbi5pZCBkaXJlY3RvIChOTyBjaGlwc1Byb2plY3QpOicsIHtcbiAgICAgICAgICBvcHRpb25JZDogb3B0aW9uLmlkLFxuICAgICAgICAgIHByb2plY3RQcm9wSWQ6IHByb2plY3Q/LmlkID8/IG51bGwsXG4gICAgICAgICAgY2hpcHNQcm9qZWN0SWQ6IGNoaXBzUHJvamVjdD8ucHJvamVjdElkID8/IG51bGwsXG4gICAgICAgICAgYWdlbnRUeXBlOiBhZ2VudD8udHlwZSxcbiAgICAgICAgfSlcblxuICAgICAgICBhc2tNYWlhKHtcbiAgICAgICAgICBtZXNzYWdlOiBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQsXG4gICAgICAgICAgaGlzdG9yeSxcbiAgICAgICAgICBwcm9qZWN0SWQ6IG9wdGlvbi5pZCxcbiAgICAgICAgICBsYW5nOiBhdXRoVXNlci5sYW5nLFxuICAgICAgICAgIHVzZXJJZDogYXV0aFVzZXIuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgICBmaXJzdE5hbWU6IGF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgICAgICAgICBsYXN0TmFtZTogYXV0aFVzZXIubGFzdE5hbWUsXG4gICAgICAgICAgY29tcGFueUlkOiBhdXRoVXNlci5jb21wYW55X2lkLnRvU3RyaW5nKCksXG4gICAgICAgICAgY2hhdElkOiBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgICAgICAgbWVzc2FnZUlkOiBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQsXG4gICAgICAgICAgYWdlbnROYW1lOiBhZ2VudD8ubmFtZSB8fCAnJyxcbiAgICAgICAgICBhZ2VudElkOiBhZ2VudD8uaWQgfHwgJycsXG4gICAgICAgICAgaXNXZWJTZWFyY2hBY3RpdmU6IGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlOiBpc0RlZXBTZWFyY2hBY3RpdmVSZWYuY3VycmVudCxcbiAgICAgICAgICAuLi4ob3B0aW9uPy5mZWVJZCAhPSBudWxsID8geyBmZWVJZDogTnVtYmVyKG9wdGlvbi5mZWVJZCkgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ob3B0aW9uPy5jbGllbnRJZCAhPSBudWxsID8geyBjbGllbnRJZDogTnVtYmVyKG9wdGlvbi5jbGllbnRJZCkgfSA6IHt9KSxcbiAgICAgICAgICAuLi4oYWdlbnQ/LmVudGl0eSAhPSBudWxsID8geyBhZ2VudEVudGl0eTogYWdlbnQuZW50aXR5IH0gOiB7fSksXG4gICAgICAgICAgLi4uKGFnZW50Py50eXBlICE9IG51bGwgPyB7IGFnZW50VHlwZTogYWdlbnQudHlwZSB9IDoge30pLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sXG4gICAgW3Byb2plY3QsIHNldFByb2plY3QsIGFza01haWEsIGF1dGhVc2VyLCBpc1dlYlNlYXJjaEFjdGl2ZSwgYWdlbnRdXG4gIClcblxuICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKGFzeW5jIChmZWVkYmFja1Byb3A6IEZlZWRiYWNrLCBjaGF0TWVzc2FnZUlkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1haWEuQ2hhdHMud2FzSGVscGZ1bENoYXQoY2hhdE1lc3NhZ2VJZCwgZmVlZGJhY2tQcm9wID09PSBGZWVkYmFjay5USFVNQlNfVVApXG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICBtZXNzYWdlc1JlZi5jdXJyZW50ID0gbWVzc2FnZXNSZWYuY3VycmVudC5tYXAobWVzc2FnZSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlLmlkID09PSBjaGF0TWVzc2FnZUlkICYmIG1lc3NhZ2Uucm9sZSA9PT0gJ2Fzc2lzdGFudCcpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5tZXNzYWdlLCB3YXNIZWxwZnVsOiBmZWVkYmFja1Byb3AgPT09IEZlZWRiYWNrLlRIVU1CU19VUCB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VcbiAgICAgIH0pXG4gICAgfVxuICB9LCBbXSlcblxuICBjb25zdCBoYW5kbGVBcHByb3ZhbERlY2lzaW9uID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKFxuICAgICAgdGhyZWFkSWRzOiBzdHJpbmdbXSxcbiAgICAgIGRlY2lzaW9uOiAnYXBwcm92ZScgfCAncmVqZWN0JyxcbiAgICAgIGVkaXRlZEFjdGlvbnM/OiBBcnJheTx7IHRvb2xfbmFtZTogc3RyaW5nOyBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PlxuICAgICkgPT4ge1xuICAgICAgaWYgKCF0aHJlYWRJZHM/Lmxlbmd0aCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyB0aHJlYWRfaWRzIHByb3ZpZGVkIGZvciBhcHByb3ZhbCBkZWNpc2lvbicpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBCdXNjYXIgZWwgbWVuc2FqZSBxdWUgY29udGllbmUgYWxndW5vIGRlIGVzdG9zIHRocmVhZElkcyBlbiBzdXMgcGVuZGluZ19hY3Rpb25zXG4gICAgICBjb25zdCBtZXNzYWdlV2l0aEFwcHJvdmFsID0gbWVzc2FnZXNSZWYuY3VycmVudC5maW5kKG0gPT5cbiAgICAgICAgbS5hcHByb3ZhbD8ucGVuZGluZ19hY3Rpb25zPy5zb21lKGFjdGlvbiA9PiB0aHJlYWRJZHMuaW5jbHVkZXMoYWN0aW9uLnRocmVhZF9pZCkpXG4gICAgICApXG5cbiAgICAgIGlmICghbWVzc2FnZVdpdGhBcHByb3ZhbCB8fCAhbWVzc2FnZVdpdGhBcHByb3ZhbC5hcHByb3ZhbCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyBzZSBlbmNvbnRyw7MgbWVuc2FqZSBjb24gYXBwcm92YWwgcGFyYSB0aHJlYWRfaWRzOicsIHRocmVhZElkcylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgYXBwcm92YWwgfSA9IG1lc3NhZ2VXaXRoQXBwcm92YWxcbiAgICAgIGNvbnN0IG1lc3NhZ2VJZCA9IG1lc3NhZ2VXaXRoQXBwcm92YWwuaWRcbiAgICAgIGNvbnN0IGxvYWRpbmdLZXkgPSB0aHJlYWRJZHNbMF1cblxuICAgICAgY29uc3QgaGl0bENvbnRleHQ6IEhpdGxFeGVjdXRpb25Db250ZXh0ID0ge1xuICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgIG1lc3NhZ2VUZXh0OiBtZXNzYWdlV2l0aEFwcHJvdmFsLm1lc3NhZ2UsXG4gICAgICAgIGFwcHJvdmFsLFxuICAgICAgICBwZW5kaW5nQWN0aW9uczogYXBwcm92YWwucGVuZGluZ19hY3Rpb25zLFxuICAgICAgICB0aHJlYWRJZHMsXG4gICAgICB9XG4gICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZi5jdXJyZW50ID0gaGl0bENvbnRleHRcblxuICAgICAgY29uc3QgaW5pdGlhbEFjdGl2aXR5ID0gcmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHkodCwgaGl0bENvbnRleHQpXG5cbiAgICAgIC8vIFVwZGF0ZSBtZXNzYWdlIHN0YXR1cyBpbW1lZGlhdGVseVxuICAgICAgbWVzc2FnZXNSZWYuY3VycmVudCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQubWFwKG1lc3NhZ2UgPT4ge1xuICAgICAgICBpZiAobWVzc2FnZS5pZCA9PT0gbWVzc2FnZUlkKSB7XG4gICAgICAgICAgY29uc3QgbmV3U3RhdHVzID0gZGVjaXNpb24gPT09ICdhcHByb3ZlJyA/ICdhcHByb3ZlZCcgOiAncmVqZWN0ZWQnXG4gICAgICAgICAgcmV0dXJuIHsgLi4ubWVzc2FnZSwgYXBwcm92YWxTdGF0dXM6IG5ld1N0YXR1cyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VcbiAgICAgIH0pXG5cbiAgICAgIC8vIFRyaWdnZXIgcmUtcmVuZGVyXG4gICAgICBjb25zdCBleGlzdGluZ01lc3NhZ2UgPSBtZXNzYWdlc1JlZi5jdXJyZW50LmZpbmQobSA9PiBtLmlkID09PSBtZXNzYWdlSWQpXG4gICAgICBpZiAoZXhpc3RpbmdNZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IG5ld1N0YXR1cyA9IGRlY2lzaW9uID09PSAnYXBwcm92ZScgPyAnYXBwcm92ZWQnIDogJ3JlamVjdGVkJ1xuICAgICAgICBhZGRNZXNzYWdlKHsgLi4uZXhpc3RpbmdNZXNzYWdlLCBhcHByb3ZhbFN0YXR1czogbmV3U3RhdHVzIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIENhbGwgY29udGludWUtdGhyZWFkIGVuZHBvaW50IHdpdGggQUxMIHRocmVhZF9pZHMgaW4gYSBzaW5nbGUgcmVxdWVzdFxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICBzZXRJc0NvbnRpbnVpbmdTdHJlYW0odHJ1ZSlcbiAgICAgIGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCA9IHV1aWR2NCgpXG5cbiAgICAgIC8vIEFkZCBsb2FkaW5nXG4gICAgICBzZXRBY3RpdmVMb2FkaW5ncyhwcmV2ID0+ICh7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIFtsb2FkaW5nS2V5XTogaW5pdGlhbEFjdGl2aXR5Lm1lc3NhZ2UsXG4gICAgICB9KSlcbiAgICAgIHVwZGF0ZVN0cmVhbUFjdGl2aXR5KGluaXRpYWxBY3Rpdml0eSlcblxuICAgICAgLy8gTWFyY2Egc2kgZWwgc3RyZWFtIGNlcnLDsyB2w61hIHVuIGV2ZW50byB0ZXJtaW5hbCAoY29tcGxldGUvYXBwcm92YWwvZXJyb3IpLlxuICAgICAgLy8gU2kgZWwgYmFja2VuZCBjaWVycmEgbGEgY29uZXhpw7NuIHNpbiBlbWl0aXJsbywgbGltcGlhbW9zIGVsIGluZGljYWRvciBlbiBlbFxuICAgICAgLy8gYGZpbmFsbHlgIHBhcmEgcXVlIG5vIHF1ZWRlIHRyYWJhZG8gZW4gXCJFc2NyaWJpZW5kbyBsYSByZXNwdWVzdGFcIi5cbiAgICAgIGxldCBzdHJlYW1TZXR0bGVkID0gZmFsc2VcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWlhLk9yY2hlc3RyYXRvci5jb250aW51ZVRocmVhZCh7XG4gICAgICAgICAgdGhyZWFkSWRzLCAvLyBTZW5kIGFsbCBhY3Rpb24gdGhyZWFkX2lkcyBhdCBvbmNlXG4gICAgICAgICAgc2Vzc2lvbklkOiBhcHByb3ZhbC5zZXNzaW9uX2lkLFxuICAgICAgICAgIGRlY2lzaW9uOiBlZGl0ZWRBY3Rpb25zID8gJ2VkaXQnIDogZGVjaXNpb24sXG4gICAgICAgICAgZWRpdGVkQWN0aW9ucyxcbiAgICAgICAgICBhZ2VudElkOiBhZ2VudD8uaWQgfHwgJycsXG4gICAgICAgICAgbGFuZzogYXV0aFVzZXIubGFuZyxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgc2V0SXNDb250aW51aW5nU3RyZWFtKGZhbHNlKVxuICAgICAgICAgIGhhbmRsZVN0cmVhbUVycm9yKClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByb2Nlc3MgU1NFIHN0cmVhbVxuICAgICAgICBhd2FpdCBwcm9jZXNzU1NFU3RyZWFtKHJlc3BvbnNlLCBsb2FkaW5nS2V5LCB7XG4gICAgICAgICAgb25UaGlua2luZzogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWN0aXZpdHk6IFN0cmVhbUFjdGl2aXR5ID0ge1xuICAgICAgICAgICAgICBwaGFzZTogJ3RoaW5raW5nJyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogZ2V0VGhpbmtpbmdMb2FkaW5nTWVzc2FnZSgwLCB0KSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwZGF0ZVN0cmVhbUFjdGl2aXR5KGFjdGl2aXR5KVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Ub2tlbjogKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgdXBkYXRlU3RyZWFtQWN0aXZpdHkoZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5KHQpKVxuICAgICAgICAgICAgaGFuZGxlU3RyZWFtVXBkYXRlKGNvbnRlbnQsIG51bGwsICcnKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Ob2RlOiAobWVzc2FnZTogc3RyaW5nLCBjdXJyZW50VGhyZWFkSWQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9kZUFjdGl2aXR5ID0gcmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHkoXG4gICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgIHQsXG4gICAgICAgICAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQsXG4gICAgICAgICAgICAgIGN1cnJlbnRUaHJlYWRJZCxcbiAgICAgICAgICAgICAgeyB1c2VSZXN1bWluZ0ZhbGxiYWNrOiB0cnVlIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHVwZGF0ZVN0cmVhbUFjdGl2aXR5KG5vZGVBY3Rpdml0eSlcbiAgICAgICAgICAgIHNldEFjdGl2ZUxvYWRpbmdzKHByZXYgPT4gKHtcbiAgICAgICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICAgICAgW2N1cnJlbnRUaHJlYWRJZF06IG5vZGVBY3Rpdml0eS5tZXNzYWdlLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAoXG4gICAgICAgICAgICBmaW5hbENvbnRlbnQ6IHN0cmluZyxcbiAgICAgICAgICAgIHNvdXJjZXM6IGFueSxcbiAgICAgICAgICAgIG1lbW9yeVNlc3Npb25JZDogc3RyaW5nLFxuICAgICAgICAgICAgY3VycmVudFRocmVhZElkOiBzdHJpbmcsXG4gICAgICAgICAgICBhdHRhY2htZW50cz86IGFueVtdIHwgbnVsbCxcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zPzogc3RyaW5nW10gfCBudWxsLFxuICAgICAgICAgICAgYWdlbnRJZD86IHN0cmluZyB8IG51bGxcbiAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgIHN0cmVhbVNldHRsZWQgPSB0cnVlXG4gICAgICAgICAgICBzZXRJc0NvbnRpbnVpbmdTdHJlYW0oZmFsc2UpXG4gICAgICAgICAgICBoYW5kbGVTdHJlYW1GaW5pc2goZmluYWxDb250ZW50LCBzb3VyY2VzLCBtZW1vcnlTZXNzaW9uSWQsIGF0dGFjaG1lbnRzLCBzdWdnZXN0aW9ucywgYWdlbnRJZClcbiAgICAgICAgICAgIHVwZGF0ZVN0cmVhbUFjdGl2aXR5KG51bGwpXG4gICAgICAgICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICAgICAgc2V0QWN0aXZlTG9hZGluZ3MocHJldiA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld0xvYWRpbmdzID0geyAuLi5wcmV2IH1cbiAgICAgICAgICAgICAgZGVsZXRlIG5ld0xvYWRpbmdzW2N1cnJlbnRUaHJlYWRJZF1cbiAgICAgICAgICAgICAgcmV0dXJuIG5ld0xvYWRpbmdzXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25BcHByb3ZhbFJlcXVpcmVkOiAoYXBwcm92YWxQYXlsb2FkOiBhbnksIGFjY3VtdWxhdGVkQ29udGVudDogc3RyaW5nLCBjdXJyZW50VGhyZWFkSWQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgLy8gTmV3IEhJVEwgaW50ZXJydXB0aW9uIGRldGVjdGVkIGFmdGVyIHJlc3VtZSAoY2hhaW5lZCBhY3Rpb25zKVxuICAgICAgICAgICAgc3RyZWFtU2V0dGxlZCA9IHRydWVcbiAgICAgICAgICAgIHNldElzQ29udGludWluZ1N0cmVhbShmYWxzZSlcbiAgICAgICAgICAgIHVwZGF0ZVN0cmVhbUFjdGl2aXR5KG51bGwpXG4gICAgICAgICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICAgICAgc2V0QWN0aXZlTG9hZGluZ3MocHJldiA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld0xvYWRpbmdzID0geyAuLi5wcmV2IH1cbiAgICAgICAgICAgICAgZGVsZXRlIG5ld0xvYWRpbmdzW2N1cnJlbnRUaHJlYWRJZF1cbiAgICAgICAgICAgICAgcmV0dXJuIG5ld0xvYWRpbmdzXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgaGFuZGxlQXBwcm92YWxSZXF1aXJlZChhcHByb3ZhbFBheWxvYWQgYXMgQXBwcm92YWxSZXF1ZXN0LCBhY2N1bXVsYXRlZENvbnRlbnQpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICBzdHJlYW1TZXR0bGVkID0gdHJ1ZVxuICAgICAgICAgICAgc2V0SXNDb250aW51aW5nU3RyZWFtKGZhbHNlKVxuICAgICAgICAgICAgaGFuZGxlU3RyZWFtRXJyb3IoKVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBzdHJlYW1TZXR0bGVkID0gdHJ1ZVxuICAgICAgICBzZXRJc0NvbnRpbnVpbmdTdHJlYW0oZmFsc2UpXG4gICAgICAgIGhhbmRsZVN0cmVhbUVycm9yKClcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzQ29udGludWluZ1N0cmVhbShmYWxzZSlcbiAgICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICAvLyBSZWQgZGUgc2VndXJpZGFkOiBzaSBlbCBzdHJlYW0gY2VycsOzIHNpbiBldmVudG8gdGVybWluYWwsIGVsIGluZGljYWRvclxuICAgICAgICAvLyAocC4gZWouIFwiRXNjcmliaWVuZG8gbGEgcmVzcHVlc3RhXCIpIHF1ZWRhcsOtYSB0cmFiYWRvLiBMbyBsaW1waWFtb3MgYXF1w60uXG4gICAgICAgIGlmICghc3RyZWFtU2V0dGxlZCkge1xuICAgICAgICAgIHVwZGF0ZVN0cmVhbUFjdGl2aXR5KG51bGwpXG4gICAgICAgICAgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgICBzZXRBY3RpdmVMb2FkaW5ncyhwcmV2ID0+IHtcbiAgICAgICAgICAgIGlmICghKGxvYWRpbmdLZXkgaW4gcHJldikpIHJldHVybiBwcmV2XG4gICAgICAgICAgICBjb25zdCBuZXdMb2FkaW5ncyA9IHsgLi4ucHJldiB9XG4gICAgICAgICAgICBkZWxldGUgbmV3TG9hZGluZ3NbbG9hZGluZ0tleV1cbiAgICAgICAgICAgIHJldHVybiBuZXdMb2FkaW5nc1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIGF1dGhVc2VyLFxuICAgICAgYWdlbnQsXG4gICAgICBhZGRNZXNzYWdlLFxuICAgICAgaGFuZGxlU3RyZWFtRXJyb3IsXG4gICAgICBoYW5kbGVTdHJlYW1VcGRhdGUsXG4gICAgICBoYW5kbGVTdHJlYW1GaW5pc2gsXG4gICAgICBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkLFxuICAgICAgdXBkYXRlU3RyZWFtQWN0aXZpdHksXG4gICAgICB0LFxuICAgIF1cbiAgKVxuXG4gIGNvbnN0IGluaXRpYWxpemVDaGF0ID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGlmICghZmlyc3RUaW1lUmVmLmN1cnJlbnQpIHtcbiAgICAgIGZpcnN0VGltZVJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAoaW5pdGlhbENoYXRJZCkge1xuICAgICAgYXdhaXQgbG9hZE1lc3NhZ2VzKClcbiAgICB9IGVsc2UgaWYgKHVzZXJJbml0aWFsTWVzc2FnZSkge1xuICAgICAgY29uc3QgaGFzSW5pdGlhbE1lc3NhZ2UgPSBCb29sZWFuKHVzZXJJbml0aWFsTWVzc2FnZS5tZXNzYWdlPy50cmltKCkpXG4gICAgICBjb25zdCBoYXNJbml0aWFsQXR0YWNobWVudHMgPSBCb29sZWFuKHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cz8ubGVuZ3RoKVxuICAgICAgY29uc3QgaGFzSW5pdGlhbEZhcSA9IEJvb2xlYW4odXNlckluaXRpYWxNZXNzYWdlLmZhcUlkKVxuICAgICAgY29uc3QgaGFzSW5pdGlhbEZ1YSA9IEJvb2xlYW4odXNlckluaXRpYWxNZXNzYWdlLmZ1YUlkKVxuICAgICAgY29uc3QgaGFzSW5pdGlhbFNjID0gQm9vbGVhbih1c2VySW5pdGlhbE1lc3NhZ2Uuc2NJZClcblxuICAgICAgaWYgKCFoYXNJbml0aWFsTWVzc2FnZSAmJiAhaGFzSW5pdGlhbEF0dGFjaG1lbnRzICYmICFoYXNJbml0aWFsRmFxICYmICFoYXNJbml0aWFsRnVhICYmICFoYXNJbml0aWFsU2MpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhpc3RvcnkgPSBtZXNzYWdlc1JlZi5jdXJyZW50Lm1hcChoaXN0b3J5TWVzc2FnZSA9PiAoe1xuICAgICAgICBjb250ZW50OiBoaXN0b3J5TWVzc2FnZS5tZXNzYWdlLFxuICAgICAgICByb2xlOiBoaXN0b3J5TWVzc2FnZS51c2VyLmlkID09PSBhdXRoVXNlci5pZC50b1N0cmluZygpID8gQ2hhdEhpc3RvcnlSb2xlLlVTRVIgOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgfSkpXG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY2hpcHNQcm9qZWN0OiBjdHhDaGlwc1Byb2plY3QsXG4gICAgICAgIHByb2plY3Q6IGN0eFByb2plY3QsXG4gICAgICAgIGNsaWVudDogY3R4Q2xpZW50LFxuICAgICAgICB0YXNrOiBjdHhUYXNrLFxuICAgICAgfSA9IGNvbnRleHRSZWYuY3VycmVudFxuICAgICAgY29uc3QgcHJvamVjdFRvUmVxdWVzdCA9IHJlc29sdmVQcm9qZWN0VG9SZXF1ZXN0KGN0eENoaXBzUHJvamVjdCwgbnVsbCkgPz8gY3R4UHJvamVjdD8uaWQgPz8gbnVsbFxuXG4gICAgICBjb25zb2xlLmluZm8oJ1t1c2VDaGF0TWFuYWdlcl0gUEFUSD1pbml0aWFsaXplQ2hhdC91c2VySW5pdGlhbE1lc3NhZ2Ug4oCUIGNvbnRleHRSZWYgcmVzb2x1dGlvbjonLCB7XG4gICAgICAgIHByb2plY3RQcm9wSWQ6IGN0eFByb2plY3Q/LmlkID8/IG51bGwsXG4gICAgICAgIGNsaWVudElkOiBjdHhDbGllbnQ/LmlkID8/IG51bGwsXG4gICAgICAgIHRhc2tJZDogY3R4VGFzaz8uaWQgPz8gbnVsbCxcbiAgICAgICAgY2hpcHNQcm9qZWN0SWQ6IGN0eENoaXBzUHJvamVjdD8ucHJvamVjdElkID8/IG51bGwsXG4gICAgICAgIHByb2plY3RUb1JlcXVlc3QsXG4gICAgICAgIGFnZW50VHlwZTogYWdlbnQ/LnR5cGUsXG4gICAgICB9KVxuXG4gICAgICBhc2tNYWlhKHtcbiAgICAgICAgbWVzc2FnZTogdXNlckluaXRpYWxNZXNzYWdlLm1lc3NhZ2UsXG4gICAgICAgIGhpc3RvcnksXG4gICAgICAgIHByb2plY3RJZDogcHJvamVjdFRvUmVxdWVzdCxcbiAgICAgICAgbGFuZzogYXV0aFVzZXIubGFuZyxcbiAgICAgICAgdXNlcklkOiBhdXRoVXNlci5pZC50b1N0cmluZygpLFxuICAgICAgICBmaXJzdE5hbWU6IGF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgICAgICAgbGFzdE5hbWU6IGF1dGhVc2VyLmxhc3ROYW1lLFxuICAgICAgICBjb21wYW55SWQ6IGF1dGhVc2VyLmNvbXBhbnlfaWQudG9TdHJpbmcoKSxcbiAgICAgICAgY2hhdElkOiBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgICAgIG1lc3NhZ2VJZDogY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50LFxuICAgICAgICBhZ2VudE5hbWU6IGFnZW50Py5uYW1lISxcbiAgICAgICAgYWdlbnRJZDogYWdlbnQ/LmlkISxcbiAgICAgICAgaXNXZWJTZWFyY2hBY3RpdmU6IGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgIGlzRGVlcFNlYXJjaEFjdGl2ZTogaXNEZWVwU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgIC4uLihjdHhQcm9qZWN0Py5mZWVJZCAhPSBudWxsID8geyBmZWVJZDogTnVtYmVyKGN0eFByb2plY3QuZmVlSWQpIH0gOiB7fSksXG4gICAgICAgIC4uLnJlc29sdmVDbGllbnRQYXlsb2FkKGN0eENsaWVudCwgY3R4UHJvamVjdCksXG4gICAgICAgIC4uLihjdHhQcm9qZWN0Py5uYW1lID8geyBwcm9qZWN0TmFtZTogY3R4UHJvamVjdC5uYW1lIH0gOiB7fSksXG4gICAgICAgIC4uLihjdHhUYXNrPy5pZCAhPSBudWxsXG4gICAgICAgICAgPyB7IHRhc2tJZDogTnVtYmVyKGN0eFRhc2suaWQpLCAuLi4oY3R4VGFzay5uYW1lID8geyB0YXNrTmFtZTogY3R4VGFzay5uYW1lIH0gOiB7fSkgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLmF0dGFjaG1lbnRzID8geyBhdHRhY2htZW50czogdXNlckluaXRpYWxNZXNzYWdlLmF0dGFjaG1lbnRzIH0gOiB7fSksXG4gICAgICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2UuZmFxSWQgPyB7IGZhcUlkOiB1c2VySW5pdGlhbE1lc3NhZ2UuZmFxSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHVzZXJJbml0aWFsTWVzc2FnZS5hZ2VudFN1Z2dlc3Rpb25JZCA/IHsgYWdlbnRTdWdnZXN0aW9uSWQ6IHVzZXJJbml0aWFsTWVzc2FnZS5hZ2VudFN1Z2dlc3Rpb25JZCB9IDoge30pLFxuICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLmZ1YUlkID8geyBmdWFJZDogdXNlckluaXRpYWxNZXNzYWdlLmZ1YUlkIH0gOiB7fSksXG4gICAgICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2Uuc2NJZCA/IHsgc2NJZDogdXNlckluaXRpYWxNZXNzYWdlLnNjSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50Py5lbnRpdHkgIT0gbnVsbCA/IHsgYWdlbnRFbnRpdHk6IGFnZW50LmVudGl0eSB9IDoge30pLFxuICAgICAgICAuLi4oYWdlbnQ/LnR5cGUgIT0gbnVsbCA/IHsgYWdlbnRUeXBlOiBhZ2VudC50eXBlIH0gOiB7fSksXG4gICAgICAgIC4uLihidWlsZENvbnRleHRNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZS5tZW50aW9ucylcbiAgICAgICAgICA/IHsgY29udGV4dE1lc3NhZ2U6IGJ1aWxkQ29udGV4dE1lc3NhZ2UodXNlckluaXRpYWxNZXNzYWdlLm1lbnRpb25zKSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2UuY29udGV4dERhdGEgPyB7IGNvbnRleHREYXRhOiB1c2VySW5pdGlhbE1lc3NhZ2UuY29udGV4dERhdGEgfSA6IHt9KSxcbiAgICAgIH0pXG4gICAgfVxuICB9LCBbXG4gICAgaW5pdGlhbENoYXRJZCxcbiAgICB1c2VySW5pdGlhbE1lc3NhZ2UsXG4gICAgcHJvamVjdCxcbiAgICBjbGllbnQsXG4gICAgdGFzayxcbiAgICBhdXRoVXNlcixcbiAgICBhZ2VudCxcbiAgICBhc2tNYWlhLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZSxcbiAgXSlcblxuICBjb25zdCByZXNldENoYXQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgYWJvcnRTdHJlYW1TaWxlbnRseVJlZi5jdXJyZW50KClcbiAgICBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQgPSB1dWlkdjQoKVxuICAgIGN1cnJlbnRVc2VyUXVlc3Rpb24uY3VycmVudCA9IG51bGxcbiAgICBjdXJyZW50Q2hhdElkLmN1cnJlbnQgPSB1dWlkdjQoKVxuICAgIHJlcG9ydGVkRXZlbnQuY3VycmVudCA9IGZhbHNlXG4gICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIHN0cmVhbWluZ1N0b3JlLmNsZWFyKClcbiAgICBzZXRJc0NvbnRpbnVpbmdTdHJlYW0oZmFsc2UpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHN0b3BHZW5lcmF0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHN0b3BTdHJlYW1pbmcoKVxuICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICBzZXRJc0NvbnRpbnVpbmdTdHJlYW0oZmFsc2UpXG4gIH0sIFtzdG9wU3RyZWFtaW5nXSlcblxuICByZXR1cm4ge1xuICAgIG1lc3NhZ2VzLFxuICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICBpc0xvYWRpbmdNb3JlTWVzc2FnZXMsXG4gICAgd2FpdGluZ1Jlc3BvbnNlOiB3YWl0aW5nUmVzcG9uc2UgfHwgaXNDb250aW51aW5nU3RyZWFtLFxuICAgIGlzV3JpdGluZyxcbiAgICBsb2FkaW5nTWVzc2FnZSxcbiAgICBzdHJlYW1BY3Rpdml0eSxcbiAgICBhY3RpdmVMb2FkaW5ncyxcbiAgICBjdXJyZW50UHJvamVjdCxcbiAgICBjdXJyZW50Q2hhdElkOiBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgY3VycmVudE1lc3NhZ2VJZDogY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50LFxuXG4gICAgc2VuZE1lc3NhZ2UsXG4gICAgY2hhbmdlUHJvamVjdCxcbiAgICBoYW5kbGVGZWVkYmFjayxcbiAgICBoYW5kbGVBcHByb3ZhbERlY2lzaW9uLFxuICAgIGhhbmRsZVNjcm9sbCxcbiAgICBpbml0aWFsaXplQ2hhdCxcbiAgICByZXNldENoYXQsXG4gICAgc3RvcEdlbmVyYXRpb24sXG5cbiAgICBpc0Rpc2FibGVkOiB3YWl0aW5nUmVzcG9uc2UgfHwgaXNDb250aW51aW5nU3RyZWFtIHx8IGxvYWRpbmdNZXNzYWdlcyxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsV0FBVyxFQUFFQyxNQUFNLEVBQUVDLFNBQVMsRUFBRUMsUUFBUSxRQUFRLE9BQU87QUFDaEUsU0FBU0MsRUFBRSxJQUFJQyxNQUFNLFFBQVEsTUFBTTtBQUNuQyxTQUFTQyxlQUFlLFFBQVEsb0JBQW9CO0FBQ3BELFNBQVNDLHFCQUFxQixRQUFRLDBCQUEwQjtBQUNoRSxTQUFTQyxJQUFJLFFBQVEsU0FBUztBQUc5QixTQUFTQyxPQUFPLFFBQWlCLHdCQUF3QjtBQUN6RCxTQUFTQyxnQkFBZ0IsUUFBUSw4QkFBOEI7QUFDL0QsU0FBU0MsTUFBTSxFQUFFQyxRQUFRLFFBQVEsYUFBYTtBQUM5QyxPQUFPQyxJQUFJLE1BQU0scUJBQXFCO0FBQ3RDLFNBQVNDLFFBQVEsUUFBUSw0REFBNEQ7QUFDckYsU0FBdUNDLGVBQWUsUUFBd0Msa0JBQWtCO0FBQ2hILFNBQXlDQyxtQkFBbUIsUUFBUSw0QkFBNEI7QUFDaEcsU0FBU0Msa0NBQWtDLFFBQVEsc0NBQXNDO0FBR3pGLFNBQVNDLFdBQVcsUUFBUSxnQkFBZ0I7QUFDNUMsU0FBU0MsaUJBQWlCLFFBQVEsc0JBQXNCO0FBQ3hELFNBQVNDLHNCQUFzQixRQUFRLDBCQUEwQjtBQUNqRSxTQUFTQyxnQkFBZ0IsUUFBUSw2Q0FBNkM7QUFDOUUsU0FBU0MsdUJBQXVCLEVBQUVDLHlCQUF5QixRQUFRLDJCQUEyQjtBQUU5RixTQUNFQyx5QkFBeUIsRUFDekJDLHdCQUF3QixFQUN4QkMsNkJBQTZCLEVBQzdCQyxnQ0FBZ0MsUUFFM0Isb0NBQW9DO0FBQzNDLFNBQVNDLGNBQWMsUUFBUSx3QkFBd0I7QUFDdkQsU0FBU0Msd0JBQXdCLEVBQUVDLGdCQUFnQixRQUFRLDhCQUE4QjtBQUl6RixJQUFNQyx3QkFBd0IsR0FBRyxTQUEzQkEsd0JBQXdCQSxDQUFJQyxvQkFBMkMsRUFBSztFQUFBLElBQUFDLG9CQUFBO0VBQ2hGLElBQUlDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDSCxvQkFBb0IsQ0FBQyxFQUFFO0lBQ3ZDLE9BQU87TUFBRUksV0FBVyxFQUFFSixvQkFBb0I7TUFBRUssT0FBTyxFQUFFLENBQUM7SUFBd0IsQ0FBQztFQUNqRjtFQUVBLElBQU1BLE9BQTJCLEdBQUdMLG9CQUFvQixhQUFwQkEsb0JBQW9CLGNBQXBCQSxvQkFBb0IsR0FBSSxDQUFDLENBQUM7RUFDOUQsT0FBTztJQUFFSSxXQUFXLEdBQUFILG9CQUFBLEdBQUVJLE9BQU8sQ0FBQ0QsV0FBVyxjQUFBSCxvQkFBQSxjQUFBQSxvQkFBQSxHQUFJLEVBQUU7SUFBRUksT0FBTyxFQUFQQTtFQUFRLENBQUM7QUFDNUQsQ0FBQzs7QUFFRDtBQUNBLElBQU1DLHVCQUF1QixHQUFHLFNBQTFCQSx1QkFBdUJBLENBQzNCQyxZQUF1RCxFQUN2REMsb0JBQXdELEVBQ3RDO0VBQ2xCLElBQU1DLGNBQWMsR0FBR0YsWUFBWSxhQUFaQSxZQUFZLGVBQVpBLFlBQVksQ0FBRUcsU0FBUyxHQUFHQyxNQUFNLENBQUNKLFlBQVksQ0FBQ0csU0FBUyxDQUFDLEdBQUcsSUFBSTtFQUN0RixJQUFJRCxjQUFjLElBQUksSUFBSSxJQUFJRSxNQUFNLENBQUNDLFFBQVEsQ0FBQ0gsY0FBYyxDQUFDLEVBQUU7SUFDN0QsT0FBT0EsY0FBYztFQUN2QjtFQUNBLElBQUlELG9CQUFvQixJQUFJLElBQUksRUFBRTtJQUNoQyxJQUFNSyxNQUFNLEdBQUdGLE1BQU0sQ0FBQ0gsb0JBQW9CLENBQUM7SUFDM0MsT0FBT0csTUFBTSxDQUFDQyxRQUFRLENBQUNDLE1BQU0sQ0FBQyxHQUFHQSxNQUFNLEdBQUcsSUFBSTtFQUNoRDtFQUNBLE9BQU8sSUFBSTtBQUNiLENBQUM7QUFFRCxJQUFNQyxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQW9CQSxDQUN4QkMsU0FBNEQsRUFDNURDLFVBQXNDLEVBQ1M7RUFBQSxJQUFBQyxrQkFBQTtFQUMvQyxJQUFJRixTQUFTLGFBQVRBLFNBQVMsZUFBVEEsU0FBUyxDQUFFRyxFQUFFLEVBQUU7SUFDakIsT0FBQUMsYUFBQTtNQUFTQyxRQUFRLEVBQUVMLFNBQVMsQ0FBQ0c7SUFBRSxHQUFNSCxTQUFTLENBQUNNLElBQUksR0FBRztNQUFFQyxVQUFVLEVBQUVQLFNBQVMsQ0FBQ007SUFBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQzNGO0VBQ0EsSUFBSSxDQUFBTCxVQUFVLGFBQVZBLFVBQVUsdUJBQVZBLFVBQVUsQ0FBRUksUUFBUSxLQUFJLElBQUksRUFBRTtJQUNoQyxPQUFPO01BQUVBLFFBQVEsRUFBRVQsTUFBTSxDQUFDSyxVQUFVLENBQUNJLFFBQVE7SUFBRSxDQUFDO0VBQ2xEO0VBQ0EsSUFBSUosVUFBVSxhQUFWQSxVQUFVLGdCQUFBQyxrQkFBQSxHQUFWRCxVQUFVLENBQUVPLE1BQU0sY0FBQU4sa0JBQUEsZUFBbEJBLGtCQUFBLENBQW9CQyxFQUFFLEVBQUU7SUFDMUIsT0FBQUMsYUFBQTtNQUNFQyxRQUFRLEVBQUVKLFVBQVUsQ0FBQ08sTUFBTSxDQUFDTDtJQUFFLEdBQzFCRixVQUFVLENBQUNPLE1BQU0sQ0FBQ0YsSUFBSSxHQUFHO01BQUVDLFVBQVUsRUFBRU4sVUFBVSxDQUFDTyxNQUFNLENBQUNGO0lBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUU1RTtFQUNBLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELElBQU1HLDZCQUE2QixHQUFHLFNBQWhDQSw2QkFBNkJBLENBQUlDLGNBQXVCLEVBQXVCO0VBQ25GLElBQUksQ0FBQ3ZCLEtBQUssQ0FBQ0MsT0FBTyxDQUFDc0IsY0FBYyxDQUFDLEVBQUU7SUFDbEMsT0FBTyxFQUFFO0VBQ1g7RUFFQSxPQUFPQSxjQUFjLENBQ2xCQyxNQUFNLENBQUMsVUFBQ0MsVUFBVTtJQUFBLE9BQTRDLENBQUMsQ0FBQ0EsVUFBVSxJQUFJQyxPQUFBLENBQU9ELFVBQVUsTUFBSyxRQUFRO0VBQUEsRUFBQyxDQUM3R0UsR0FBRyxDQUFDLFVBQUNGLFVBQVUsRUFBRUcsS0FBSyxFQUFLO0lBQzFCLElBQU1ULElBQUksR0FDUixPQUFPTSxVQUFVLENBQUNOLElBQUksS0FBSyxRQUFRLElBQUlNLFVBQVUsQ0FBQ04sSUFBSSxDQUFDVSxJQUFJLENBQUMsQ0FBQyxHQUFHSixVQUFVLENBQUNOLElBQUksQ0FBQ1UsSUFBSSxDQUFDLENBQUMsV0FBQUMsTUFBQSxDQUFXRixLQUFLLEdBQUcsQ0FBQyxDQUFFO0lBQzlHLElBQU1HLElBQUksR0FBRyxPQUFPTixVQUFVLENBQUNNLElBQUksS0FBSyxRQUFRLElBQUlOLFVBQVUsQ0FBQ00sSUFBSSxDQUFDRixJQUFJLENBQUMsQ0FBQyxHQUFHSixVQUFVLENBQUNNLElBQUksQ0FBQ0YsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLO0lBQzNHLElBQU1HLFFBQVEsR0FBRyxPQUFPUCxVQUFVLENBQUNRLFNBQVMsS0FBSyxRQUFRLEdBQUdSLFVBQVUsQ0FBQ1EsU0FBUyxHQUFHLEVBQUU7SUFDckYsSUFBTUMsWUFBWSxHQUFHZixJQUFJLENBQUNnQixRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUdoQixJQUFJLE1BQUFXLE1BQUEsQ0FBTVgsSUFBSSxPQUFBVyxNQUFBLENBQUlDLElBQUksQ0FBRTtJQUNsRSxJQUFNSyxXQUFXLEdBQ2YsT0FBT1gsVUFBVSxDQUFDWSxJQUFJLEtBQUssUUFBUSxHQUMvQlosVUFBVSxDQUFDWSxJQUFJLEdBQ2Y1QixNQUFNLENBQUNDLFFBQVEsQ0FBQ0QsTUFBTSxDQUFDZ0IsVUFBVSxDQUFDWSxJQUFJLENBQUMsQ0FBQyxHQUN0QzVCLE1BQU0sQ0FBQ2dCLFVBQVUsQ0FBQ1ksSUFBSSxDQUFDLEdBQ3ZCLENBQUM7SUFFVCxPQUFPO01BQ0xDLElBQUksRUFBRSxJQUFJQyxJQUFJLENBQUMsRUFBRSxFQUFFTCxZQUFZLEVBQUU7UUFBRUgsSUFBSSxFQUFFQztNQUFTLENBQUMsQ0FBQztNQUNwRGhCLEVBQUUsRUFDQSxPQUFPUyxVQUFVLENBQUNULEVBQUUsS0FBSyxRQUFRLElBQUlTLFVBQVUsQ0FBQ1QsRUFBRSxDQUFDYSxJQUFJLENBQUMsQ0FBQyxHQUNyREosVUFBVSxDQUFDVCxFQUFFLHFCQUFBYyxNQUFBLENBQ0tGLEtBQUssT0FBQUUsTUFBQSxDQUFJSSxZQUFZLENBQUU7TUFDL0NmLElBQUksRUFBSkEsSUFBSTtNQUNKa0IsSUFBSSxFQUFFRCxXQUFXO01BQ2pCTCxJQUFJLEVBQUpBLElBQUk7TUFDSlMsWUFBWSxFQUFFLE9BQU9mLFVBQVUsQ0FBQ2UsWUFBWSxLQUFLLFFBQVEsR0FBR2YsVUFBVSxDQUFDZSxZQUFZLEdBQUdDLFNBQVM7TUFDL0ZDLGFBQWEsRUFBRSxPQUFPakIsVUFBVSxDQUFDaUIsYUFBYSxLQUFLLFFBQVEsR0FBR2pCLFVBQVUsQ0FBQ2lCLGFBQWEsR0FBR0QsU0FBUztNQUNsR0UsUUFBUSxFQUFFLE9BQU9sQixVQUFVLENBQUNrQixRQUFRLEtBQUssUUFBUSxHQUFHbEIsVUFBVSxDQUFDa0IsUUFBUSxHQUFHRixTQUFTO01BQ25GRyxJQUFJLEVBQUVuQixVQUFVLENBQUNtQixJQUFJLEtBQUssV0FBVyxHQUFHLFdBQVcsR0FBRztJQUN4RCxDQUFDO0VBQ0gsQ0FBQyxDQUFDO0FBQ04sQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0Msb0NBQW9DQSxDQUFDQyxjQUErQixFQUFZO0VBQ3ZGLElBQU1DLEdBQWEsR0FBRyxFQUFFO0VBQ3hCLElBQU1DLE1BQU0sR0FBRyxTQUFUQSxNQUFNQSxDQUFJQyxHQUFZLEVBQUs7SUFDL0IsSUFBSUEsR0FBRyxJQUFJLElBQUksRUFBRTtJQUNqQixJQUFNQyxDQUFDLEdBQUdDLFFBQVEsQ0FBQ0MsTUFBTSxDQUFDSCxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDbkMsSUFBSSxDQUFDeEMsTUFBTSxDQUFDNEMsS0FBSyxDQUFDSCxDQUFDLENBQUMsRUFBRUgsR0FBRyxDQUFDTyxJQUFJLENBQUNKLENBQUMsQ0FBQztFQUNuQyxDQUFDO0VBQ0RKLGNBQWMsQ0FBQ1MsT0FBTyxDQUFDLFVBQUFDLE1BQU0sRUFBSTtJQUFBLElBQUFDLFlBQUE7SUFDL0IsSUFBSSxDQUFDRCxNQUFNLElBQUk5QixPQUFBLENBQU84QixNQUFNLE1BQUssUUFBUSxFQUFFO0lBQzNDLElBQU1FLElBQUksR0FBR0YsTUFBTSxDQUFDRyxTQUFTO0lBQzdCLElBQUksRUFBRUQsSUFBSSxJQUFJaEMsT0FBQSxDQUFPZ0MsSUFBSSxNQUFLLFFBQVEsSUFBSSxDQUFDMUQsS0FBSyxDQUFDQyxPQUFPLENBQUN5RCxJQUFJLENBQUMsQ0FBQyxFQUFFO0lBQ2pFLElBQU1FLEdBQUcsR0FBR0YsSUFBK0I7SUFDM0NWLE1BQU0sRUFBQVMsWUFBQSxHQUFDRyxHQUFHLENBQUNDLE9BQU8sY0FBQUosWUFBQSxjQUFBQSxZQUFBLEdBQUlHLEdBQUcsQ0FBQzVDLEVBQUUsQ0FBQztJQUM3QixJQUFJaEIsS0FBSyxDQUFDQyxPQUFPLENBQUMyRCxHQUFHLENBQUNFLFFBQVEsQ0FBQyxFQUFFO01BQy9CRixHQUFHLENBQUNFLFFBQVEsQ0FBQ1AsT0FBTyxDQUFDUCxNQUFNLENBQUM7SUFDOUI7SUFDQSxJQUFJaEQsS0FBSyxDQUFDQyxPQUFPLENBQUMyRCxHQUFHLENBQUNHLEtBQUssQ0FBQyxFQUFFO01BQzVCSCxHQUFHLENBQUNHLEtBQUssQ0FBQ1IsT0FBTyxDQUFDLFVBQUFTLENBQUMsRUFBSTtRQUNyQixJQUFJQSxDQUFDLElBQUl0QyxPQUFBLENBQU9zQyxDQUFDLE1BQUssUUFBUSxJQUFJLENBQUNoRSxLQUFLLENBQUNDLE9BQU8sQ0FBQytELENBQUMsQ0FBQyxFQUFFO1VBQUEsSUFBQUMsYUFBQTtVQUNuRCxJQUFNQyxJQUFJLEdBQUdGLENBQTRCO1VBQ3pDaEIsTUFBTSxFQUFBaUIsYUFBQSxHQUFDQyxJQUFJLENBQUNMLE9BQU8sY0FBQUksYUFBQSxjQUFBQSxhQUFBLEdBQUlDLElBQUksQ0FBQ2xELEVBQUUsQ0FBQztRQUNqQztNQUNGLENBQUMsQ0FBQztJQUNKO0VBQ0YsQ0FBQyxDQUFDO0VBQ0YsT0FBTytCLEdBQUc7QUFDWjs7QUFFQTtBQUNBLFNBQVNvQixzQ0FBc0NBLENBQUNyQixjQUErQixFQUFZO0VBQ3pGLElBQU1DLEdBQWEsR0FBRyxFQUFFO0VBQ3hCRCxjQUFjLENBQUNTLE9BQU8sQ0FBQyxVQUFBQyxNQUFNLEVBQUk7SUFDL0IsSUFBSSxDQUFDQSxNQUFNLElBQUk5QixPQUFBLENBQU84QixNQUFNLE1BQUssUUFBUSxFQUFFO0lBQzNDLElBQU1FLElBQUksR0FBR0YsTUFBTSxDQUFDRyxTQUFTO0lBQzdCLElBQUksRUFBRUQsSUFBSSxJQUFJaEMsT0FBQSxDQUFPZ0MsSUFBSSxNQUFLLFFBQVEsSUFBSSxDQUFDMUQsS0FBSyxDQUFDQyxPQUFPLENBQUN5RCxJQUFJLENBQUMsQ0FBQyxFQUFFO0lBQ2pFLElBQU1FLEdBQUcsR0FBR0YsSUFBK0I7SUFDM0MsSUFBSUYsTUFBTSxDQUFDWSxTQUFTLEtBQUssYUFBYSxFQUFFO01BQUEsSUFBQUMsYUFBQTtNQUN0QyxJQUFNcEIsR0FBRyxJQUFBb0IsYUFBQSxHQUFHVCxHQUFHLENBQUNDLE9BQU8sY0FBQVEsYUFBQSxjQUFBQSxhQUFBLEdBQUlULEdBQUcsQ0FBQzVDLEVBQUU7TUFDakMsSUFBSWlDLEdBQUcsSUFBSSxJQUFJLEVBQUU7UUFDZixJQUFNQyxDQUFDLEdBQUdDLFFBQVEsQ0FBQ0MsTUFBTSxDQUFDSCxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDeEMsTUFBTSxDQUFDNEMsS0FBSyxDQUFDSCxDQUFDLENBQUMsRUFBRUgsR0FBRyxDQUFDTyxJQUFJLENBQUNKLENBQUMsQ0FBQztNQUNuQztJQUNGO0lBQ0EsSUFBSU0sTUFBTSxDQUFDWSxTQUFTLEtBQUssb0JBQW9CLEVBQUU7TUFDN0MsSUFBTUUsSUFBSSxHQUFHVixHQUFHLENBQUNFLFFBQVE7TUFDekIsSUFBSTlELEtBQUssQ0FBQ0MsT0FBTyxDQUFDcUUsSUFBSSxDQUFDLEVBQUU7UUFDdkJBLElBQUksQ0FBQ2YsT0FBTyxDQUFDLFVBQUFnQixHQUFHLEVBQUk7VUFDbEIsSUFBTXJCLENBQUMsR0FBR0MsUUFBUSxDQUFDQyxNQUFNLENBQUNtQixHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7VUFDbkMsSUFBSSxDQUFDOUQsTUFBTSxDQUFDNEMsS0FBSyxDQUFDSCxDQUFDLENBQUMsRUFBRUgsR0FBRyxDQUFDTyxJQUFJLENBQUNKLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUM7TUFDSjtJQUNGO0VBQ0YsQ0FBQyxDQUFDO0VBQ0YsT0FBT0gsR0FBRztBQUNaO0FBRUEsU0FBU3lCLHlDQUF5Q0EsQ0FBQzFCLGNBQStCLEVBQWlCO0VBQUEsSUFBQTJCLGFBQUE7RUFDakcsSUFBTUMsVUFBVSxHQUFHNUIsY0FBYyxDQUFDNkIsSUFBSSxDQUFDLFVBQUFDLENBQUM7SUFBQSxPQUFJLENBQUNBLENBQUMsQ0FBQ1IsU0FBUyxJQUFJLEVBQUUsRUFBRVMsV0FBVyxDQUFDLENBQUMsS0FBSyxZQUFZO0VBQUEsRUFBQztFQUMvRixJQUNFLENBQUNILFVBQVUsSUFDWCxDQUFDQSxVQUFVLENBQUNmLFNBQVMsSUFDckJqQyxPQUFBLENBQU9nRCxVQUFVLENBQUNmLFNBQVMsTUFBSyxRQUFRLElBQ3hDM0QsS0FBSyxDQUFDQyxPQUFPLENBQUN5RSxVQUFVLENBQUNmLFNBQVMsQ0FBQyxFQUNuQztJQUNBLE9BQU8sSUFBSTtFQUNiO0VBQ0EsSUFBTUMsR0FBRyxHQUFHYyxVQUFVLENBQUNmLFNBQW9DO0VBQzNELElBQU1WLEdBQUcsSUFBQXdCLGFBQUEsR0FBR2IsR0FBRyxDQUFDa0IsUUFBUSxjQUFBTCxhQUFBLGNBQUFBLGFBQUEsR0FBSWIsR0FBRyxDQUFDbUIsT0FBTztFQUN2QyxPQUFPOUIsR0FBRyxJQUFJLElBQUksR0FBR0csTUFBTSxDQUFDSCxHQUFHLENBQUMsR0FBRyxJQUFJO0FBQ3pDO0FBRUEsU0FBUytCLDBDQUEwQ0EsQ0FBQ2xDLGNBQStCLEVBQUVtQyxRQUFnQixFQUFpQjtFQUFBLElBQUFDLElBQUEsRUFBQUMsY0FBQTtFQUNwSCxJQUFNM0IsTUFBTSxHQUFHVixjQUFjLENBQUM2QixJQUFJLENBQUMsVUFBQUMsQ0FBQztJQUFBLE9BQUksQ0FBQ0EsQ0FBQyxDQUFDUixTQUFTLElBQUksRUFBRSxFQUFFUyxXQUFXLENBQUMsQ0FBQyxLQUFLSSxRQUFRLENBQUNKLFdBQVcsQ0FBQyxDQUFDO0VBQUEsRUFBQztFQUNyRyxJQUFJLENBQUNyQixNQUFNLElBQUksQ0FBQ0EsTUFBTSxDQUFDRyxTQUFTLElBQUlqQyxPQUFBLENBQU84QixNQUFNLENBQUNHLFNBQVMsTUFBSyxRQUFRLElBQUkzRCxLQUFLLENBQUNDLE9BQU8sQ0FBQ3VELE1BQU0sQ0FBQ0csU0FBUyxDQUFDLEVBQUU7SUFDM0csT0FBTyxJQUFJO0VBQ2I7RUFDQSxJQUFNQyxHQUFHLEdBQUdKLE1BQU0sQ0FBQ0csU0FBb0M7RUFDdkQsSUFBTVYsR0FBRyxJQUFBaUMsSUFBQSxJQUFBQyxjQUFBLEdBQUd2QixHQUFHLENBQUNrQixRQUFRLGNBQUFLLGNBQUEsY0FBQUEsY0FBQSxHQUFJdkIsR0FBRyxDQUFDbUIsT0FBTyxjQUFBRyxJQUFBLGNBQUFBLElBQUEsR0FBSXRCLEdBQUcsQ0FBQzVDLEVBQUU7RUFDakQsT0FBT2lDLEdBQUcsSUFBSSxJQUFJLEdBQUdHLE1BQU0sQ0FBQ0gsR0FBRyxDQUFDLEdBQUcsSUFBSTtBQUN6Qzs7QUFFQTtBQUNBLFNBQVNtQyx1Q0FBdUNBLENBQUNDLElBQVksRUFBWTtFQUN2RSxJQUFNQyxPQUFPLEdBQUdELElBQUksQ0FBQ0UsS0FBSyxDQUFDLHVCQUF1QixDQUFDO0VBQ25ELElBQUlELE9BQU8sRUFBRTtJQUNYLElBQU1wQyxDQUFDLEdBQUdDLFFBQVEsQ0FBQ21DLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDbEMsT0FBTzdFLE1BQU0sQ0FBQzRDLEtBQUssQ0FBQ0gsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUNBLENBQUMsQ0FBQztFQUNuQztFQUNBLElBQU1zQyxJQUFJLEdBQUdILElBQUksQ0FBQ0UsS0FBSyxDQUFDLGtCQUFrQixDQUFDO0VBQzNDLElBQUlDLElBQUksRUFBRTtJQUNSLElBQU10QyxFQUFDLEdBQUdDLFFBQVEsQ0FBQ3FDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDL0IsT0FBTy9FLE1BQU0sQ0FBQzRDLEtBQUssQ0FBQ0gsRUFBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUNBLEVBQUMsQ0FBQztFQUNuQztFQUNBLE9BQU8sRUFBRTtBQUNYO0FBRUEsSUFBTXVDLGtCQUFrQixHQUFHLFNBQXJCQSxrQkFBa0JBLENBQUlDLFFBQWlCLEVBQUs7RUFDaEQsSUFBTUMsV0FBVyxHQUFHNUgsTUFBTSxDQUFrQjtJQUMxQ2lELEVBQUUsRUFBRTBFLFFBQVEsQ0FBQzFFLEVBQUUsQ0FBQzRFLFFBQVEsQ0FBQyxDQUFDO0lBQzFCekUsSUFBSSxFQUFFdUUsUUFBUSxDQUFDRyxTQUFTO0lBQ3hCQyxNQUFNLEVBQUVKLFFBQVEsQ0FBQ0s7RUFDbkIsQ0FBQyxDQUFDO0VBRUYsSUFDRUosV0FBVyxDQUFDSyxPQUFPLENBQUNoRixFQUFFLEtBQUswRSxRQUFRLENBQUMxRSxFQUFFLENBQUM0RSxRQUFRLENBQUMsQ0FBQyxJQUNqREQsV0FBVyxDQUFDSyxPQUFPLENBQUM3RSxJQUFJLEtBQUt1RSxRQUFRLENBQUNHLFNBQVMsSUFDL0NGLFdBQVcsQ0FBQ0ssT0FBTyxDQUFDRixNQUFNLEtBQUtKLFFBQVEsQ0FBQ0ssT0FBTyxFQUMvQztJQUNBSixXQUFXLENBQUNLLE9BQU8sR0FBRztNQUNwQmhGLEVBQUUsRUFBRTBFLFFBQVEsQ0FBQzFFLEVBQUUsQ0FBQzRFLFFBQVEsQ0FBQyxDQUFDO01BQzFCekUsSUFBSSxFQUFFdUUsUUFBUSxDQUFDRyxTQUFTO01BQ3hCQyxNQUFNLEVBQUVKLFFBQVEsQ0FBQ0s7SUFDbkIsQ0FBQztFQUNIO0VBQ0EsT0FBTztJQUNMSixXQUFXLEVBQUVBLFdBQVcsQ0FBQ0s7RUFDM0IsQ0FBQztBQUNILENBQUM7QUFFRCxJQUFNQyxZQUFZLEdBQUcsU0FBZkEsWUFBWUEsQ0FBSUMsSUFBWSxFQUFrRDtFQUNsRixJQUFJLENBQUNBLElBQUksQ0FBQ3JFLElBQUksQ0FBQyxDQUFDLEVBQUUsT0FBTyxJQUFJO0VBRTdCLElBQUFzRSxXQUFBLEdBQThCRCxJQUFJLENBQUNFLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFBQUMsWUFBQSxHQUFBQyxjQUFBLENBQUFILFdBQUE7SUFBdkNJLFNBQVMsR0FBQUYsWUFBQTtJQUFFRyxRQUFRLEdBQUFILFlBQUE7RUFDMUIsSUFBSSxDQUFDRSxTQUFTLElBQUksQ0FBQ0MsUUFBUSxFQUFFLE9BQU8sSUFBSTtFQUV4QyxJQUFNQyxTQUFTLEdBQUdGLFNBQVMsQ0FBQ0csT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQzdFLElBQUksQ0FBQyxDQUFDO0VBQ3pELElBQU04RSxPQUFPLEdBQUdILFFBQVEsQ0FBQ0UsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQzdFLElBQUksQ0FBQyxDQUFDO0VBRXJELElBQUk7SUFDRixJQUFNK0UsSUFBSSxHQUFHQyxJQUFJLENBQUNDLEtBQUssQ0FBQ0gsT0FBTyxDQUFDO0lBQ2hDLE9BQU87TUFBRUYsU0FBUyxFQUFUQSxTQUFTO01BQUVHLElBQUksRUFBSkE7SUFBSyxDQUFDO0VBQzVCLENBQUMsQ0FBQyxPQUFPRyxVQUFVLEVBQUU7SUFDbkJDLE9BQU8sQ0FBQ0MsS0FBSyxDQUFDLHlCQUF5QixFQUFFRixVQUFVLEVBQUVKLE9BQU8sQ0FBQztJQUM3RCxPQUFPLElBQUk7RUFDYjtBQUNGLENBQUM7QUFFRCxJQUFNTyxnQkFBZ0I7RUFBQSxJQUFBQyxLQUFBLEdBQUFDLGlCQUFBLGNBQUFDLG1CQUFBLENBQUFDLElBQUEsQ0FBRyxTQUFBQyxRQUN2QkMsUUFBa0IsRUFDbEJDLFFBQWdCLEVBQ2hCQyxTQWVDO0lBQUEsSUFBQUMsY0FBQTtJQUFBLElBQUFDLE1BQUEsRUFBQUMsT0FBQSxFQUFBQyxNQUFBLEVBQUFDLGtCQUFBLEVBQUFDLGFBQUEsRUFBQUMsY0FBQSxFQTRCUUMsVUFBVSxFQUFBQyxZQUFBLEVBQUFDLGtCQUFBLEVBQUFDLElBQUEsRUFBQUMsS0FBQSxFQUFBQyxLQUFBLEVBQUFDLENBQUE7SUFBQSxPQUFBbkIsbUJBQUEsQ0FBQW9CLElBQUEsV0FBQUMsUUFBQTtNQUFBLGtCQUFBQSxRQUFBLENBQUFDLElBQUEsR0FBQUQsUUFBQSxDQUFBRSxJQUFBO1FBQUE7VUFBVlYsVUFBVSxZQUFBVyxZQUFDM0MsSUFBWSxFQUFFO1lBQ2hDLElBQU12RixNQUFNLEdBQUdzRixZQUFZLENBQUNDLElBQUksQ0FBQztZQUNqQyxJQUFJLENBQUN2RixNQUFNLEVBQUU7WUFFYixJQUFROEYsU0FBUyxHQUFXOUYsTUFBTSxDQUExQjhGLFNBQVM7Y0FBRUcsSUFBSSxHQUFLakcsTUFBTSxDQUFmaUcsSUFBSTtZQUN2QixJQUFNa0MsU0FBUyxHQUFHbEMsSUFBK0I7WUFFakQsSUFBSW9CLGFBQWEsSUFBSXZCLFNBQVMsS0FBSyxPQUFPLEVBQUU7WUFFNUMsSUFBSUEsU0FBUyxLQUFLLFVBQVUsRUFBRTtjQUM1QmlCLFNBQVMsQ0FBQ3FCLFVBQVUsQ0FBQyxDQUFDO1lBQ3hCLENBQUMsTUFBTSxJQUFJdEMsU0FBUyxLQUFLLE9BQU8sRUFBRTtjQUNoQyxJQUFNdUMsT0FBTyxHQUFHLE9BQU9GLFNBQVMsQ0FBQ0UsT0FBTyxLQUFLLFFBQVEsR0FBR0YsU0FBUyxDQUFDRSxPQUFPLEdBQUcsRUFBRTtjQUM5RWpCLGtCQUFrQixHQUFHbkksZ0JBQWdCLENBQUNtSSxrQkFBa0IsRUFBRWlCLE9BQU8sQ0FBQztjQUNsRXRCLFNBQVMsQ0FBQ3VCLE9BQU8sQ0FBQ2xCLGtCQUFrQixDQUFDO1lBQ3ZDLENBQUMsTUFBTSxJQUFJdEIsU0FBUyxLQUFLLFNBQVMsRUFBRTtjQUNsQyxJQUFNdUMsUUFBTyxHQUFHLE9BQU9GLFNBQVMsQ0FBQ0UsT0FBTyxLQUFLLFFBQVEsR0FBR0YsU0FBUyxDQUFDRSxPQUFPLEdBQUcsRUFBRTtjQUM5RWpCLGtCQUFrQixHQUFHbkksZ0JBQWdCLENBQUNtSSxrQkFBa0IsRUFBRWlCLFFBQU8sQ0FBQztjQUNsRXRCLFNBQVMsQ0FBQ3VCLE9BQU8sQ0FBQ2xCLGtCQUFrQixDQUFDO2NBQ3JDLElBQUlwSSx3QkFBd0IsQ0FBQ21KLFNBQVMsQ0FBQyxFQUFFO2dCQUN2Q2IsY0FBYyxDQUFDYSxTQUFTLEVBQUVFLFFBQU8sSUFBSWpCLGtCQUFrQixDQUFDO2NBQzFEO1lBQ0YsQ0FBQyxNQUFNLElBQUl0QixTQUFTLEtBQUssTUFBTSxFQUFFO2NBQy9CLElBQUlxQyxTQUFTLENBQUNJLE9BQU8sSUFBSSxPQUFPSixTQUFTLENBQUNJLE9BQU8sS0FBSyxRQUFRLEVBQUU7Z0JBQzlEeEIsU0FBUyxDQUFDeUIsTUFBTSxDQUFDTCxTQUFTLENBQUNJLE9BQU8sRUFBRXpCLFFBQVEsQ0FBQztjQUMvQztZQUNGLENBQUMsTUFBTSxJQUFJaEIsU0FBUyxLQUFLLFVBQVUsRUFBRTtjQUNuQyxJQUFNMkMsWUFBWSxHQUFJTixTQUFTLENBQUNFLE9BQU8sSUFBZWpCLGtCQUFrQjtjQUN4RUUsY0FBYyxDQUFDYSxTQUFTLEVBQUVNLFlBQVksQ0FBQztZQUN6QyxDQUFDLE1BQU0sSUFBSTNDLFNBQVMsS0FBSyxtQkFBbUIsRUFBRTtjQUFBLElBQUE0QyxxQkFBQTtjQUM1QyxJQUFJLENBQUNyQixhQUFhLEVBQUU7Z0JBQ2xCQSxhQUFhLEdBQUcsSUFBSTtjQUN0QjtjQUNBLENBQUFxQixxQkFBQSxHQUFBM0IsU0FBUyxDQUFDNEIsa0JBQWtCLGNBQUFELHFCQUFBLGVBQTVCQSxxQkFBQSxDQUFBRSxJQUFBLENBQUE3QixTQUFTLEVBQXNCb0IsU0FBUyxFQUFFZixrQkFBa0IsRUFBRU4sUUFBUSxDQUFDO1lBQ3pFLENBQUMsTUFBTSxJQUFJaEIsU0FBUyxLQUFLLE9BQU8sRUFBRTtjQUNoQ3VCLGFBQWEsR0FBRyxJQUFJO2NBQ3BCTixTQUFTLENBQUM4QixPQUFPLENBQUNWLFNBQVMsQ0FBQzdCLEtBQUssRUFBRVEsUUFBUSxDQUFDO1lBQzlDO1VBQ0YsQ0FBQztVQWhFS0csTUFBTSxJQUFBRCxjQUFBLEdBQUdILFFBQVEsQ0FBQ2lDLElBQUksY0FBQTlCLGNBQUEsdUJBQWJBLGNBQUEsQ0FBZStCLFNBQVMsQ0FBQyxDQUFDO1VBQUEsSUFDcEM5QixNQUFNO1lBQUFjLFFBQUEsQ0FBQUUsSUFBQTtZQUFBO1VBQUE7VUFBQSxNQUNILElBQUllLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQztRQUFBO1VBR2xDOUIsT0FBTyxHQUFHLElBQUkrQixXQUFXLENBQUMsQ0FBQztVQUM3QjlCLE1BQU0sR0FBRyxFQUFFO1VBQ1hDLGtCQUFrQixHQUFHLEVBQUU7VUFDdkJDLGFBQWEsR0FBRyxLQUFLO1VBRW5CQyxjQUFjLEdBQUcsU0FBakJBLGNBQWNBLENBQUlhLFNBQWtDLEVBQUVNLFlBQW9CLEVBQUs7WUFBQSxJQUFBUyxtQkFBQTtZQUNuRixJQUFJN0IsYUFBYSxFQUFFO1lBQ25CQSxhQUFhLEdBQUcsSUFBSTtZQUNwQixJQUFNOEIsT0FBTyxHQUFHaEIsU0FBUyxDQUFDZ0IsT0FBTyxJQUFJLElBQUk7WUFDekMsSUFBTUMsZUFBZSxHQUFJakIsU0FBUyxDQUFDa0IsaUJBQWlCLElBQWUsRUFBRTtZQUNyRSxJQUFNOUosV0FBVyxHQUFHRixLQUFLLENBQUNDLE9BQU8sQ0FBQzZJLFNBQVMsQ0FBQzVJLFdBQVcsQ0FBQyxHQUFHNEksU0FBUyxDQUFDNUksV0FBVyxHQUFHLElBQUk7WUFDdkYsSUFBTStKLFdBQVcsR0FBR2pLLEtBQUssQ0FBQ0MsT0FBTyxDQUFDNkksU0FBUyxDQUFDb0IsYUFBYSxDQUFDLEdBQ3JEcEIsU0FBUyxDQUFDb0IsYUFBYSxHQUN4QmxLLEtBQUssQ0FBQ0MsT0FBTyxDQUFDNkksU0FBUyxDQUFDbUIsV0FBVyxDQUFDLEdBQ2pDbkIsU0FBUyxDQUFDbUIsV0FBVyxHQUN0QixJQUFJO1lBQ1YsSUFBTUUsVUFBVSxJQUFBTixtQkFBQSxHQUFHZixTQUFTLENBQUNoRSxRQUFRLGNBQUErRSxtQkFBQSxjQUFBQSxtQkFBQSxHQUFJZixTQUFTLENBQUMvRCxPQUFPO1lBQzFELElBQU1xRixnQkFBZ0IsR0FBR0QsVUFBVSxJQUFJLElBQUksSUFBSS9HLE1BQU0sQ0FBQytHLFVBQVUsQ0FBQyxDQUFDdEksSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUd1QixNQUFNLENBQUMrRyxVQUFVLENBQUMsQ0FBQ3RJLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSTtZQUNsSDZGLFNBQVMsQ0FBQzJDLFVBQVUsQ0FBQ2pCLFlBQVksRUFBRVUsT0FBTyxFQUFFQyxlQUFlLEVBQUV0QyxRQUFRLEVBQUV2SCxXQUFXLEVBQUUrSixXQUFXLEVBQUVHLGdCQUFnQixDQUFDO1VBQ3BILENBQUM7VUEwQ0dqQyxZQUFZLEdBQUcsS0FBSztRQUFBO1VBQUEsSUFFaEJBLFlBQVk7WUFBQU8sUUFBQSxDQUFBRSxJQUFBO1lBQUE7VUFBQTtVQUFBRixRQUFBLENBQUFFLElBQUE7VUFBQSxPQUVZaEIsTUFBTSxDQUFDMEMsSUFBSSxDQUFDLENBQUM7UUFBQTtVQUFBbEMsa0JBQUEsR0FBQU0sUUFBQSxDQUFBNkIsSUFBQTtVQUFuQ2xDLElBQUksR0FBQUQsa0JBQUEsQ0FBSkMsSUFBSTtVQUFFQyxLQUFLLEdBQUFGLGtCQUFBLENBQUxFLEtBQUs7VUFBQSxLQUNmRCxJQUFJO1lBQUFLLFFBQUEsQ0FBQUUsSUFBQTtZQUFBO1VBQUE7VUFDTlQsWUFBWSxHQUFHLElBQUk7VUFBQSxPQUFBTyxRQUFBLENBQUE4QixNQUFBO1FBQUE7VUFJckIxQyxNQUFNLElBQUlELE9BQU8sQ0FBQzRDLE1BQU0sQ0FBQ25DLEtBQUssRUFBRTtZQUFFb0MsTUFBTSxFQUFFO1VBQUssQ0FBQyxDQUFDO1VBQzNDbkMsS0FBSyxHQUFHVCxNQUFNLENBQUMxQixLQUFLLENBQUMsTUFBTSxDQUFDO1VBQ2xDMEIsTUFBTSxHQUFHUyxLQUFLLENBQUNvQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUU7VUFFMUIsS0FBU25DLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0QsS0FBSyxDQUFDcUMsTUFBTSxFQUFFcEMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN4Q04sVUFBVSxDQUFDSyxLQUFLLENBQUNDLENBQUMsQ0FBQyxDQUFDO1VBQ3RCO1VBQUNFLFFBQUEsQ0FBQUUsSUFBQTtVQUFBO1FBQUE7UUFBQTtVQUFBLE9BQUFGLFFBQUEsQ0FBQW1DLElBQUE7TUFBQTtJQUFBLEdBQUF0RCxPQUFBO0VBQUEsQ0FFSjtFQUFBLGdCQXhHS0wsZ0JBQWdCQSxDQUFBNEQsRUFBQSxFQUFBQyxHQUFBLEVBQUFDLEdBQUE7SUFBQSxPQUFBN0QsS0FBQSxDQUFBOEQsS0FBQSxPQUFBQyxTQUFBO0VBQUE7QUFBQSxHQXdHckI7QUFFRCxPQUFPLElBQU1DLGNBQWMsR0FBRyxTQUFqQkEsY0FBY0EsQ0FBQUMsS0FBQSxFQUtBO0VBQUEsSUFKakJDLGFBQWEsR0FBQUQsS0FBQSxDQUFyQkUsTUFBTTtJQUNOQyxrQkFBa0IsR0FBQUgsS0FBQSxDQUFsQkcsa0JBQWtCO0lBQ2xCL0IsT0FBTyxHQUFBNEIsS0FBQSxDQUFQNUIsT0FBTztJQUFBZ0MsWUFBQSxHQUFBSixLQUFBLENBQ1BLLE1BQU07SUFBTkEsTUFBTSxHQUFBRCxZQUFBLGNBQUcsRUFBRSxHQUFBQSxZQUFBO0VBRVgsSUFBQUUsS0FBQSxHQUFjcE4sSUFBSSxDQUFDLENBQUM7SUFBWjBGLENBQUMsR0FBQTBILEtBQUEsQ0FBRDFILENBQUM7RUFDVCxJQUFNMEIsUUFBUSxHQUFHbkgsT0FBTyxDQUFDLENBQUM7RUFDMUIsSUFBQW9OLGlCQUFBLEdBWUluTixnQkFBZ0IsQ0FBQyxDQUFDO0lBWHBCb04sT0FBTyxHQUFBRCxpQkFBQSxDQUFQQyxPQUFPO0lBQ1BDLFVBQVUsR0FBQUYsaUJBQUEsQ0FBVkUsVUFBVTtJQUNWeEssTUFBTSxHQUFBc0ssaUJBQUEsQ0FBTnRLLE1BQU07SUFDTnlLLFNBQVMsR0FBQUgsaUJBQUEsQ0FBVEcsU0FBUztJQUNUQyxJQUFJLEdBQUFKLGlCQUFBLENBQUpJLElBQUk7SUFDSkMsT0FBTyxHQUFBTCxpQkFBQSxDQUFQSyxPQUFPO0lBQ1BDLEtBQUssR0FBQU4saUJBQUEsQ0FBTE0sS0FBSztJQUNMQyxpQkFBaUIsR0FBQVAsaUJBQUEsQ0FBakJPLGlCQUFpQjtJQUNqQkMsa0JBQWtCLEdBQUFSLGlCQUFBLENBQWxCUSxrQkFBa0I7SUFDbEI5TCxZQUFZLEdBQUFzTCxpQkFBQSxDQUFadEwsWUFBWTtJQUNaK0wsZUFBZSxHQUFBVCxpQkFBQSxDQUFmUyxlQUFlO0VBRWpCLElBQU1DLEtBQUssR0FBRzNOLFFBQVEsQ0FBQyxDQUFDO0VBQ3hCLElBQUE0TixZQUFBLEdBQTBCdE4sV0FBVyxDQUFDLENBQUM7SUFBL0J1TixhQUFhLEdBQUFELFlBQUEsQ0FBYkMsYUFBYTtFQUNyQixJQUFBQyxtQkFBQSxHQUF3Qi9HLGtCQUFrQixDQUFDQyxRQUFRLENBQUM7SUFBNUNDLFdBQVcsR0FBQTZHLG1CQUFBLENBQVg3RyxXQUFXO0VBQ25CLElBQUE4RyxrQkFBQSxHQUE4QnhOLGlCQUFpQixDQUFDLENBQUM7SUFBekN5TixpQkFBaUIsR0FBQUQsa0JBQUEsQ0FBakJDLGlCQUFpQjs7RUFFekI7RUFDQTFPLFNBQVMsQ0FBQyxZQUFNO0lBQUEsSUFBQTJPLHFCQUFBLEVBQUFDLHNCQUFBLEVBQUFDLFdBQUEsRUFBQUMsVUFBQSxFQUFBQyxRQUFBO0lBQ2QvRixPQUFPLENBQUNnRyxJQUFJLENBQUMsbUNBQW1DLEVBQUU7TUFDaER6TSxjQUFjLEdBQUFvTSxxQkFBQSxHQUFFdE0sWUFBWSxhQUFaQSxZQUFZLHVCQUFaQSxZQUFZLENBQUVHLFNBQVMsY0FBQW1NLHFCQUFBLGNBQUFBLHFCQUFBLEdBQUksSUFBSTtNQUMvQ00sZ0JBQWdCLEdBQUFMLHNCQUFBLEdBQUV2TSxZQUFZLGFBQVpBLFlBQVksdUJBQVpBLFlBQVksQ0FBRTZNLFdBQVcsY0FBQU4sc0JBQUEsY0FBQUEsc0JBQUEsR0FBSSxJQUFJO01BQ25ETyxhQUFhLEdBQUFOLFdBQUEsR0FBRWpCLE9BQU8sYUFBUEEsT0FBTyx1QkFBUEEsT0FBTyxDQUFFNUssRUFBRSxjQUFBNkwsV0FBQSxjQUFBQSxXQUFBLEdBQUksSUFBSTtNQUNsQzNMLFFBQVEsR0FBQTRMLFVBQUEsR0FBRXpMLE1BQU0sYUFBTkEsTUFBTSx1QkFBTkEsTUFBTSxDQUFFTCxFQUFFLGNBQUE4TCxVQUFBLGNBQUFBLFVBQUEsR0FBSSxJQUFJO01BQzVCTSxNQUFNLEdBQUFMLFFBQUEsR0FBRWhCLElBQUksYUFBSkEsSUFBSSx1QkFBSkEsSUFBSSxDQUFFL0ssRUFBRSxjQUFBK0wsUUFBQSxjQUFBQSxRQUFBLEdBQUk7SUFDdEIsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxFQUFFLENBQUMxTSxZQUFZLGFBQVpBLFlBQVksdUJBQVpBLFlBQVksQ0FBRUcsU0FBUyxFQUFFb0wsT0FBTyxhQUFQQSxPQUFPLHVCQUFQQSxPQUFPLENBQUU1SyxFQUFFLEVBQUVLLE1BQU0sYUFBTkEsTUFBTSx1QkFBTkEsTUFBTSxDQUFFTCxFQUFFLEVBQUUrSyxJQUFJLGFBQUpBLElBQUksdUJBQUpBLElBQUksQ0FBRS9LLEVBQUUsQ0FBQyxDQUFDO0VBQ2hFLElBQU1xTSxnQkFBZ0IsR0FBR3RQLE1BQU0sQ0FBQ0ksTUFBTSxDQUFDLENBQUMsQ0FBQztFQUN6QyxJQUFNbVAsbUJBQW1CLEdBQUd2UCxNQUFNLENBQWdCLElBQUksQ0FBQztFQUN2RCxJQUFNd1AsYUFBYSxHQUFHeFAsTUFBTSxDQUFDc04sYUFBYSxJQUFJbE4sTUFBTSxDQUFDLENBQUMsQ0FBQztFQUN2RCxJQUFNcVAsYUFBYSxHQUFHelAsTUFBTSxDQUFDLEtBQUssQ0FBQztFQUNuQyxJQUFNMFAsV0FBVyxHQUFHMVAsTUFBTSxDQUFnQixFQUFFLENBQUM7RUFDN0M7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0UsSUFBTTJQLHFCQUFxQixHQUFHM1AsTUFBTSxDQUcxQixJQUFJLENBQUM7RUFDZjtFQUNBLElBQU00UCx1QkFBdUIsR0FBRzVQLE1BQU0sQ0FBOEIsSUFBSSxDQUFDO0VBQ3pFLElBQU02UCxlQUFlLEdBQUc3UCxNQUFNLENBQUMsS0FBSyxDQUFDO0VBQ3JDLElBQU04UCxZQUFZLEdBQUc5UCxNQUFNLENBQUMsS0FBSyxDQUFDO0VBQ2xDO0VBQ0EsSUFBTStQLHlCQUF5QixHQUFHL1AsTUFBTSxDQUFnQixJQUFJLENBQUM7RUFDN0Q7QUFDRjtBQUNBO0FBQ0E7QUFDQTtFQUNFLElBQU1nUSxxQkFBcUIsR0FBR2hRLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDO0VBQ3pEO0FBQ0Y7RUFDRSxJQUFNaVEsc0JBQXNCLEdBQUdqUSxNQUFNLENBQWE7SUFBQSxPQUFNMEUsU0FBUztFQUFBLEVBQUM7RUFDbEUsSUFBTXdMLGdCQUFnQixHQUFHbFEsTUFBTSxDQUFhO0lBQUEsT0FBTTBFLFNBQVM7RUFBQSxFQUFDO0VBQzVELElBQUF5TCxTQUFBLEdBQTRDalEsUUFBUSxDQUF5QixDQUFDLENBQUMsQ0FBQztJQUFBa1EsVUFBQSxHQUFBN0gsY0FBQSxDQUFBNEgsU0FBQTtJQUF6RUUsY0FBYyxHQUFBRCxVQUFBO0lBQUVFLGlCQUFpQixHQUFBRixVQUFBO0VBQ3hDLElBQUFHLFVBQUEsR0FBb0RyUSxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQUFzUSxVQUFBLEdBQUFqSSxjQUFBLENBQUFnSSxVQUFBO0lBQTVERSxrQkFBa0IsR0FBQUQsVUFBQTtJQUFFRSxxQkFBcUIsR0FBQUYsVUFBQTtFQUVoRCxJQUFNRyxvQkFBb0IsR0FBRzNRLE1BQU0sQ0FBQ21PLGlCQUFpQixDQUFDO0VBQ3RELElBQU15QyxxQkFBcUIsR0FBRzVRLE1BQU0sQ0FBQ29PLGtCQUFrQixDQUFDO0VBQ3hEO0VBQ0EsSUFBTXlDLFVBQVUsR0FBRzdRLE1BQU0sQ0FBQztJQUFFc0MsWUFBWSxFQUFaQSxZQUFZO0lBQUV1TCxPQUFPLEVBQVBBLE9BQU87SUFBRXZLLE1BQU0sRUFBTkEsTUFBTTtJQUFFMEssSUFBSSxFQUFKQTtFQUFLLENBQUMsQ0FBQztFQUNsRTZDLFVBQVUsQ0FBQzVJLE9BQU8sR0FBRztJQUFFM0YsWUFBWSxFQUFaQSxZQUFZO0lBQUV1TCxPQUFPLEVBQVBBLE9BQU87SUFBRXZLLE1BQU0sRUFBTkEsTUFBTTtJQUFFMEssSUFBSSxFQUFKQTtFQUFLLENBQUM7RUFFNUQvTixTQUFTLENBQUMsWUFBTTtJQUNkMFEsb0JBQW9CLENBQUMxSSxPQUFPLEdBQUdrRyxpQkFBaUI7SUFDaER5QyxxQkFBcUIsQ0FBQzNJLE9BQU8sR0FBR21HLGtCQUFrQjtFQUNwRCxDQUFDLEVBQUUsQ0FBQ0QsaUJBQWlCLEVBQUVDLGtCQUFrQixDQUFDLENBQUM7RUFFM0MsSUFBQTBDLGdCQUFBLEdBQ0V6USxlQUFlLENBQUM7TUFDZGtOLE1BQU0sRUFBRUQsYUFBYSxJQUFJa0MsYUFBYSxDQUFDdkgsT0FBTztNQUM5Q0wsV0FBVyxFQUFYQSxXQUFXO01BQ1g0RixrQkFBa0IsRUFBbEJBLGtCQUFrQjtNQUNsQi9CLE9BQU8sRUFBUEEsT0FBTztNQUNQaUMsTUFBTSxFQUFOQTtJQUNGLENBQUMsQ0FBQztJQVBJcUQsZUFBZSxHQUFBRCxnQkFBQSxDQUFmQyxlQUFlO0lBQUVDLFFBQVEsR0FBQUYsZ0JBQUEsQ0FBUkUsUUFBUTtJQUFFQyxxQkFBcUIsR0FBQUgsZ0JBQUEsQ0FBckJHLHFCQUFxQjtJQUFFQyxZQUFZLEdBQUFKLGdCQUFBLENBQVpJLFlBQVk7SUFBRUMsVUFBVSxHQUFBTCxnQkFBQSxDQUFWSyxVQUFVO0lBQUVDLGFBQWEsR0FBQU4sZ0JBQUEsQ0FBYk0sYUFBYTtJQUFFQyxZQUFZLEdBQUFQLGdCQUFBLENBQVpPLFlBQVk7RUFTL0czQixXQUFXLENBQUN6SCxPQUFPLEdBQUcrSSxRQUFRO0VBRTlCL1EsU0FBUyxDQUFDLFlBQU07SUFDZCxJQUFNcVIsV0FBVyxHQUFHLElBQUlDLFdBQVcsQ0FBQywrQkFBK0IsRUFBRTtNQUNuRUMsTUFBTSxFQUFFO1FBQUVULGVBQWUsRUFBZkE7TUFBZ0I7SUFDNUIsQ0FBQyxDQUFDO0lBQ0ZVLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDSixXQUFXLENBQUM7RUFDckMsQ0FBQyxFQUFFLENBQUNQLGVBQWUsQ0FBQyxDQUFDO0VBRXJCOVEsU0FBUyxDQUFDLFlBQU07SUFDZCxJQUFJcU4sYUFBYSxJQUFJQSxhQUFhLEtBQUtrQyxhQUFhLENBQUN2SCxPQUFPLEVBQUU7TUFDNUQ7TUFDQTtNQUNBZ0ksc0JBQXNCLENBQUNoSSxPQUFPLENBQUMsQ0FBQzs7TUFFaEM7TUFDQTZGLFVBQVUsQ0FBQyxJQUFJLENBQUM7TUFDaEJDLFNBQVMsYUFBVEEsU0FBUyxlQUFUQSxTQUFTLENBQUcsSUFBSSxDQUFDO01BQ2pCTSxlQUFlLENBQUMsSUFBSSxDQUFDO01BQ3JCSixPQUFPLENBQUMsSUFBSSxDQUFDO01BRWJ1QixhQUFhLENBQUN2SCxPQUFPLEdBQUdxRixhQUFhO01BQ3JDZ0MsZ0JBQWdCLENBQUNySCxPQUFPLEdBQUc3SCxNQUFNLENBQUMsQ0FBQztNQUNuQ21QLG1CQUFtQixDQUFDdEgsT0FBTyxHQUFHLElBQUk7TUFDbEN3SCxhQUFhLENBQUN4SCxPQUFPLEdBQUcsS0FBSztNQUM3QjRILGVBQWUsQ0FBQzVILE9BQU8sR0FBRyxLQUFLO01BQy9COEgseUJBQXlCLENBQUM5SCxPQUFPLEdBQUcsSUFBSTtNQUN4QytILHFCQUFxQixDQUFDL0gsT0FBTyxHQUFHLElBQUk7TUFDcEN0RyxjQUFjLENBQUNnUSxLQUFLLENBQUMsQ0FBQztNQUV0QlQsWUFBWSxDQUFDLENBQUM7SUFDaEI7RUFDRixDQUFDLEVBQUUsQ0FBQzVELGFBQWEsRUFBRU8sT0FBTyxFQUFFQyxVQUFVLEVBQUVDLFNBQVMsRUFBRU0sZUFBZSxFQUFFSixPQUFPLEVBQUVpRCxZQUFZLENBQUMsQ0FBQztFQUUzRixJQUFNVSxpQkFBaUIsR0FBRzdSLFdBQVcsQ0FDbkMsVUFBQzhSLFlBQXFCLEVBQUVDLGVBQXdCLEVBQUs7SUFBQSxJQUFBQyxxQkFBQSxFQUFBQyxzQkFBQTtJQUNuRDlCLGdCQUFnQixDQUFDakksT0FBTyxDQUFDLENBQUM7SUFDMUIsSUFBTWdLLGFBQWEsYUFBQWxPLE1BQUEsQ0FBYXVMLGdCQUFnQixDQUFDckgsT0FBTyxlQUFZO0lBQ3BFdEcsY0FBYyxDQUFDZ1EsS0FBSyxDQUFDLENBQUM7SUFDdEI1Qix5QkFBeUIsQ0FBQzlILE9BQU8sR0FBRyxJQUFJO0lBQ3hDK0gscUJBQXFCLENBQUMvSCxPQUFPLEdBQUcsSUFBSTtJQUNwQ21KLGFBQWEsQ0FBQ2EsYUFBYSxDQUFDO0lBRTVCLElBQU05RyxPQUFPLEdBQ1gwRyxZQUFZLEtBQUssK0RBQStELEdBQzVFNUwsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLEdBQzNCNEwsWUFBWSxLQUFLLHVCQUF1QixJQUFJQyxlQUFlLGFBQWZBLGVBQWUsZUFBZkEsZUFBZSxDQUFFMU4sUUFBUSxDQUFDLG9CQUFvQixDQUFDLEdBQ3pGNkIsQ0FBQyxDQUFDLHlCQUF5QixFQUFFO01BQUVpTSxJQUFJLEdBQUFILHFCQUFBLElBQUFDLHNCQUFBLEdBQUVGLGVBQWUsQ0FBQ3RLLEtBQUssQ0FBQyxjQUFjLENBQUMsY0FBQXdLLHNCQUFBLHVCQUFyQ0Esc0JBQUEsQ0FBd0MsQ0FBQyxDQUFDLGNBQUFELHFCQUFBLGNBQUFBLHFCQUFBLEdBQUk7SUFBRyxDQUFDLENBQUMsR0FDeEY5TCxDQUFDLENBQUMsWUFBWSxDQUFDO0lBRXZCa0wsVUFBVSxDQUFDO01BQ1RsTyxFQUFFLFlBQUFjLE1BQUEsQ0FBWXVMLGdCQUFnQixDQUFDckgsT0FBTyxDQUFFO01BQ3hDa0QsT0FBTyxFQUFQQSxPQUFPO01BQ1BnSCxPQUFPLEVBQUUsSUFBSTtNQUNiQyxJQUFJLEVBQUUsSUFBSUMsSUFBSSxDQUFDLENBQUM7TUFDaEJDLElBQUksRUFBRTtRQUFFclAsRUFBRSxFQUFFLFdBQVc7UUFBRUcsSUFBSSxFQUFFO01BQVksQ0FBQztNQUM1Q3lCLElBQUksRUFBRS9ELGVBQWUsQ0FBQ3lSO0lBQ3hCLENBQUMsQ0FBQztJQUNGMUMsZUFBZSxDQUFDNUgsT0FBTyxHQUFHLEtBQUs7RUFDakMsQ0FBQyxFQUNELENBQUNrSixVQUFVLEVBQUVDLGFBQWEsRUFBRW5MLENBQUMsQ0FDL0IsQ0FBQztFQUVELElBQU11TSxrQkFBa0IsR0FBR3pTLFdBQVcsQ0FDcEMsVUFBQ2tMLE9BQWUsRUFBRWMsT0FBWSxFQUFFQyxlQUF1QixFQUFLO0lBQzFEO0lBQ0E7SUFDQSxJQUFJZ0UscUJBQXFCLENBQUMvSCxPQUFPLElBQUksSUFBSSxJQUFJK0gscUJBQXFCLENBQUMvSCxPQUFPLEtBQUt1SCxhQUFhLENBQUN2SCxPQUFPLEVBQUU7TUFDcEc7SUFDRjtJQUVBLElBQU1nSyxhQUFhLGFBQUFsTyxNQUFBLENBQWF1TCxnQkFBZ0IsQ0FBQ3JILE9BQU8sZUFBWTs7SUFFcEU7SUFDQTtJQUNBO0lBQ0E7SUFDQSxJQUFJOEgseUJBQXlCLENBQUM5SCxPQUFPLEtBQUtnSyxhQUFhLEVBQUU7TUFDdkRsQyx5QkFBeUIsQ0FBQzlILE9BQU8sR0FBR2dLLGFBQWE7TUFDakRqQyxxQkFBcUIsQ0FBQy9ILE9BQU8sR0FBR3VILGFBQWEsQ0FBQ3ZILE9BQU87TUFDckR0RyxjQUFjLENBQUM4USxLQUFLLENBQUNSLGFBQWEsQ0FBQztNQUNuQ2QsVUFBVSxDQUFDO1FBQ1RsTyxFQUFFLEVBQUVnUCxhQUFhO1FBQ2pCOUcsT0FBTyxFQUFFLEVBQUU7UUFDWGlILElBQUksRUFBRSxJQUFJQyxJQUFJLENBQUMsQ0FBQztRQUNoQkMsSUFBSSxFQUFFO1VBQUVyUCxFQUFFLEVBQUUsV0FBVztVQUFFRyxJQUFJLEVBQUU7UUFBWSxDQUFDO1FBQzVDeUIsSUFBSSxFQUFFL0QsZUFBZSxDQUFDeVIsU0FBUztRQUMvQnhHLE9BQU8sRUFBUEEsT0FBTztRQUNQQyxlQUFlLEVBQWZBO01BQ0YsQ0FBQyxDQUFDO0lBQ0o7SUFFQXJLLGNBQWMsQ0FBQytRLE9BQU8sQ0FBQ1QsYUFBYSxFQUFFaEgsT0FBTyxDQUFDO0VBQ2hELENBQUMsRUFDRCxDQUFDa0csVUFBVSxDQUNiLENBQUM7RUFFRCxJQUFNd0Isa0JBQWtCLEdBQUc1UyxXQUFXO0lBQUEsSUFBQTZTLEtBQUEsR0FBQXZKLGlCQUFBLGNBQUFDLG1CQUFBLENBQUFDLElBQUEsQ0FDcEMsU0FBQXNKLFNBQ0U1SCxPQUFlLEVBQ2ZjLE9BQVksRUFDWkMsZUFBdUIsRUFDdkJ4SSxjQUE2QixFQUM3QjBJLFdBQTZCLEVBQzdCRyxnQkFBZ0M7TUFBQSxJQUFBeUcscUJBQUEsRUFBQUMsaUJBQUEsRUFBQUMsb0JBQUEsRUFBQUMsa0JBQUE7TUFBQSxJQUFBaEIsYUFBQSxFQUFBOVAsV0FBQSxFQUFBK1EsWUFBQSxFQUFBQyxPQUFBLEVBQUFDLFlBQUEsRUFBQUMsZUFBQSxFQUFBQyw0QkFBQSxFQUFBQyxtQkFBQSxFQUFBQyxlQUFBLEVBQUFDLGlCQUFBLEVBQUExTyxjQUFBLEVBQUEyTyxlQUFBLEVBQUFDLFdBQUEsRUFBQUMsYUFBQSxFQUFBQyxzQkFBQSxFQUFBQywrQkFBQSxFQUFBQyxtQkFBQSxFQUFBQyxpQkFBQSxFQUFBQyxvQkFBQSxFQUFBQyxpQkFBQSxFQUFBQyxVQUFBLEVBQUFDLFFBQUEsRUFBQUMsZUFBQSxFQUFBQyxlQUFBLEVBQUFDLHlCQUFBLEVBQUFDLHVCQUFBLEVBQUFDLG1CQUFBLEVBQUFDLG1CQUFBLEVBQUFDLE9BQUEsRUFBQUMsR0FBQSxFQUFBQyxVQUFBLEVBQUFDLGtCQUFBLEVBQUFDLG1CQUFBLEVBQUFDLGdCQUFBLEVBQUFDLFNBQUEsRUFBQUMsY0FBQSxFQUFBQyxnQkFBQSxFQUFBQyxxQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxlQUFBLEVBQUFDLGNBQUEsRUFBQUMsaUJBQUEsRUFBQUMsbUJBQUEsRUFBQUMscUJBQUEsRUFBQUMsa0JBQUEsRUFBQUMsZUFBQSxFQUFBQyxrQkFBQSxFQUFBQyxxQkFBQSxFQUFBNUUsV0FBQTtNQUFBLE9BQUFoSSxtQkFBQSxDQUFBb0IsSUFBQSxXQUFBeUwsU0FBQTtRQUFBLGtCQUFBQSxTQUFBLENBQUF2TCxJQUFBLEdBQUF1TCxTQUFBLENBQUF0TCxJQUFBO1VBQUE7WUFFMUJvSCxhQUFhLGFBQUFsTyxNQUFBLENBQWF1TCxnQkFBZ0IsQ0FBQ3JILE9BQU87WUFDeER0RyxjQUFjLENBQUNnUSxLQUFLLENBQUMsQ0FBQztZQUN0QjVCLHlCQUF5QixDQUFDOUgsT0FBTyxHQUFHLElBQUk7WUFDeEMrSCxxQkFBcUIsQ0FBQy9ILE9BQU8sR0FBRyxJQUFJO1lBQ3BDMkgsdUJBQXVCLENBQUMzSCxPQUFPLEdBQUcsSUFBSTtZQUN0Q21KLGFBQWEsQ0FBQ2EsYUFBYSxDQUFDO1lBQ3RCOVAsV0FBVyxHQUFHb0IsNkJBQTZCLENBQUNDLGNBQWMsQ0FBQyxFQUVqRTtZQUNNMFAsWUFBWSxHQUFHLElBQUlrRCxNQUFNLENBQUNqVixzQkFBc0IsRUFBRSxHQUFHLENBQUM7WUFDdERnUyxPQUFPLEdBQUFrRCxrQkFBQSxDQUFPcEwsT0FBTyxDQUFDcUwsUUFBUSxDQUFDcEQsWUFBWSxDQUFDO1lBRTlDRSxZQUFZLEdBQUduSSxPQUFPO1lBQ3BCb0ksZUFBZSxHQUFHM0QsV0FBVyxDQUFDekgsT0FBTyxDQUFDeEUsTUFBTSxDQUFDLFVBQUE4UyxDQUFDO2NBQUEsT0FBSUEsQ0FBQyxDQUFDdFQsRUFBRSxLQUFLZ1AsYUFBYTtZQUFBLEVBQUMsQ0FBQ3VFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRmxELDRCQUE0QixHQUFHLENBQUFELGVBQWUsYUFBZkEsZUFBZSx1QkFBZkEsZUFBZSxDQUFFb0QsUUFBUSxLQUFJLElBQUk7WUFDaEVsRCxtQkFBbUIsR0FBRyxDQUFDLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxZQUFZLENBQUM7WUFDekVDLGVBQWUsR0FBRyxDQUN0QixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QixtQkFBbUIsQ0FDcEI7WUFDS0MsaUJBQWlCLEdBQUcsQ0FBQyxhQUFhLEVBQUUsb0JBQW9CLENBQUM7WUFDekQxTyxjQUFjLEdBQUcsQ0FBQXNPLGVBQWUsYUFBZkEsZUFBZSxnQkFBQVAscUJBQUEsR0FBZk8sZUFBZSxDQUFFb0QsUUFBUSxjQUFBM0QscUJBQUEsdUJBQXpCQSxxQkFBQSxDQUEyQjRELGVBQWUsS0FBSSxFQUFFO1lBQ2pFaEQsZUFBZSxHQUNuQkosNEJBQTRCLElBQzVCdk8sY0FBYyxDQUFDNFIsSUFBSSxDQUFDLFVBQUNsUixNQUFXO2NBQUEsT0FBSzhOLG1CQUFtQixDQUFDblAsUUFBUSxDQUFDcUIsTUFBTSxDQUFDWSxTQUFTLENBQUM7WUFBQSxFQUFDO1lBQ2hGc04sV0FBVyxHQUNmTCw0QkFBNEIsSUFBSXZPLGNBQWMsQ0FBQzRSLElBQUksQ0FBQyxVQUFDbFIsTUFBVztjQUFBLE9BQUsrTixlQUFlLENBQUNwUCxRQUFRLENBQUNxQixNQUFNLENBQUNZLFNBQVMsQ0FBQztZQUFBLEVBQUM7WUFDNUd1TixhQUFhLEdBQ2pCTiw0QkFBNEIsSUFDNUJ2TyxjQUFjLENBQUM0UixJQUFJLENBQUMsVUFBQ2xSLE1BQVc7Y0FBQSxPQUFLZ08saUJBQWlCLENBQUNyUCxRQUFRLENBQUNxQixNQUFNLENBQUNZLFNBQVMsQ0FBQztZQUFBLEVBQUM7WUFDOUV3TixzQkFBc0IsR0FDMUJQLDRCQUE0QixJQUM1QixDQUFBRCxlQUFlLGFBQWZBLGVBQWUsdUJBQWZBLGVBQWUsQ0FBRXVELGNBQWMsTUFBSyxVQUFVLElBQzlDN1IsY0FBYyxDQUFDNFIsSUFBSSxDQUFDLFVBQUNsUixNQUFXO2NBQUEsT0FBS0EsTUFBTSxDQUFDWSxTQUFTLEtBQUssY0FBYztZQUFBLEVBQUM7WUFDckV5TiwrQkFBK0IsR0FDbkNSLDRCQUE0QixJQUM1QixDQUFBRCxlQUFlLGFBQWZBLGVBQWUsdUJBQWZBLGVBQWUsQ0FBRXVELGNBQWMsTUFBSyxVQUFVLElBQzlDN1IsY0FBYyxDQUFDNFIsSUFBSSxDQUFDLFVBQUNsUixNQUFXO2NBQUEsT0FBSyxDQUFDQSxNQUFNLENBQUNZLFNBQVMsSUFBSSxFQUFFLEVBQUVTLFdBQVcsQ0FBQyxDQUFDLEtBQUssd0JBQXdCO1lBQUEsRUFBQztZQUUzRyxJQUFJK00sc0JBQXNCLElBQUlnRCxNQUFNLENBQUNDLHdDQUF3QyxJQUFJekssZ0JBQWdCLGFBQWhCQSxnQkFBZ0IsZUFBaEJBLGdCQUFnQixDQUFFdkksSUFBSSxDQUFDLENBQUMsRUFBRTtjQUN6R2lRLG1CQUFtQixHQUFHO2dCQUFFL00sT0FBTyxFQUFFcUYsZ0JBQWdCLENBQUN2SSxJQUFJLENBQUM7Y0FBRSxDQUFDO1lBQzVELENBQUMsTUFBTSxJQUNMZ1EsK0JBQStCLElBQy9CK0MsTUFBTSxDQUFDQyx3Q0FBd0MsS0FDOUN6SyxnQkFBZ0IsYUFBaEJBLGdCQUFnQixlQUFoQkEsZ0JBQWdCLENBQUV2SSxJQUFJLENBQUMsQ0FBQyxJQUN2Qm1ELDBDQUEwQyxDQUFDbEMsY0FBYyxFQUFFLHdCQUF3QixDQUFDLENBQUMsRUFDdkY7Y0FDTWlQLGlCQUFpQixHQUNyQixDQUFBM0gsZ0JBQWdCLGFBQWhCQSxnQkFBZ0IsdUJBQWhCQSxnQkFBZ0IsQ0FBRXZJLElBQUksQ0FBQyxDQUFDLEtBQ3hCbUQsMENBQTBDLENBQUNsQyxjQUFjLEVBQUUsd0JBQXdCLENBQUM7Y0FDdEZnUCxtQkFBbUIsR0FBRztnQkFDcEIvTSxPQUFPLEVBQUVnTjtjQUNYLENBQUM7WUFDSDtZQUVBLElBQUlILHNCQUFzQixFQUFFO2NBQzFCdkYsS0FBSyxDQUFDNU4sTUFBTSxDQUFDcVcsZ0JBQWdCLEVBQUE3VCxhQUFBO2dCQUMzQjhULFVBQVUsRUFBRTFWLHlCQUF5QixDQUFDNE0sS0FBSyxDQUFDO2dCQUM1QytJLFdBQVcsRUFBRTVWLHVCQUF1QixDQUFDMEQsY0FBYyxDQUFDO2dCQUNwRG1TLFFBQVEsRUFBRSxRQUFRO2dCQUNsQkMsTUFBTSxFQUFFO2NBQWMsR0FDbEI5SyxnQkFBZ0IsYUFBaEJBLGdCQUFnQixlQUFoQkEsZ0JBQWdCLENBQUV2SSxJQUFJLENBQUMsQ0FBQyxHQUFHO2dCQUFFc1QsZ0JBQWdCLEVBQUUvSyxnQkFBZ0IsQ0FBQ3ZJLElBQUksQ0FBQztjQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDbEYsQ0FBQztZQUNKO1lBRU1tUSxvQkFBb0IsR0FDeEJYLDRCQUE0QixJQUM1QixDQUFBRCxlQUFlLGFBQWZBLGVBQWUsdUJBQWZBLGVBQWUsQ0FBRXVELGNBQWMsTUFBSyxVQUFVLElBQzlDN1IsY0FBYyxDQUFDNFIsSUFBSSxDQUFDLFVBQUNsUixNQUFXO2NBQUEsT0FBSyxDQUFDQSxNQUFNLENBQUNZLFNBQVMsSUFBSSxFQUFFLEVBQUVTLFdBQVcsQ0FBQyxDQUFDLEtBQUssWUFBWTtZQUFBLEVBQUM7WUFHL0YsSUFBSW1OLG9CQUFvQixFQUFFO2NBQ2xCRSxVQUFVLEdBQUc5SCxnQkFBZ0IsYUFBaEJBLGdCQUFnQix1QkFBaEJBLGdCQUFnQixDQUFFdkksSUFBSSxDQUFDLENBQUM7Y0FDckNzUSxRQUFRLEdBQUczTix5Q0FBeUMsQ0FBQzFCLGNBQWMsQ0FBQztjQUNwRXNQLGVBQWUsR0FBR0YsVUFBVSxJQUFJQyxRQUFRO2NBQzlDLElBQUlDLGVBQWUsRUFBRTtnQkFDbkJILGlCQUFpQixHQUFHO2tCQUFFbE4sT0FBTyxFQUFFcU47Z0JBQWdCLENBQUM7Y0FDbEQ7WUFDRjtZQUVNQyxlQUFlLEdBQUduQixPQUFPLENBQUN2UCxHQUFHLENBQUMsVUFBQTRELEtBQUs7Y0FBQSxPQUFJcEMsUUFBUSxDQUFDb0MsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUFBLEVBQUM7WUFDOUQrTSx5QkFBeUIsR0FBR25PLHNDQUFzQyxDQUFDckIsY0FBYyxDQUFDO1lBQ2xGeVAsdUJBQXVCLEdBQzNCWixhQUFhLElBQUlVLGVBQWUsQ0FBQ3pILE1BQU0sS0FBSyxDQUFDLElBQUkwSCx5QkFBeUIsQ0FBQzFILE1BQU0sS0FBSyxDQUFDLEdBQ25GeEYsdUNBQXVDLENBQUM0RCxPQUFPLENBQUMsR0FDaEQsRUFBRTtZQUNGd0osbUJBQW1CLEdBQ3ZCSCxlQUFlLENBQUN6SCxNQUFNLEdBQUcsQ0FBQyxHQUN0QnlILGVBQWUsR0FDZkMseUJBQXlCLENBQUMxSCxNQUFNLEdBQUcsQ0FBQyxHQUNsQzBILHlCQUF5QixHQUN6QkMsdUJBQXVCO1lBRXpCRSxtQkFBbUIsR0FDdkJwQiw0QkFBNEIsS0FDM0JJLGVBQWUsSUFBSUMsV0FBVyxJQUFJQyxhQUFhLENBQUMsSUFDakRhLG1CQUFtQixDQUFDNUgsTUFBTSxHQUFHLENBQUM7WUFBQSxLQUU1QjZILG1CQUFtQjtjQUFBeUIsU0FBQSxDQUFBdEwsSUFBQTtjQUFBO1lBQUE7WUFDZjhKLE9BQU8sR0FBR0YsbUJBQW1CO1lBQUEsTUFDL0J0QixPQUFPLENBQUN0RyxNQUFNLEdBQUcsQ0FBQztjQUFBc0osU0FBQSxDQUFBdEwsSUFBQTtjQUFBO1lBQUE7WUFBQXNMLFNBQUEsQ0FBQXRMLElBQUE7WUFBQSxPQUNGOEQsaUJBQWlCLENBQUNnRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFBQTtZQUF6Q0MsR0FBRyxHQUFBdUIsU0FBQSxDQUFBM0osSUFBQTtZQUNIcUksVUFBVSxHQUFHRCxHQUFHLE9BQUE3USxNQUFBLENBQU82USxHQUFHLElBQUssU0FBUztZQUM5Q3hCLFlBQVksR0FBR25JLE9BQU8sQ0FBQ3RDLE9BQU8sQ0FBQ3VLLFlBQVksRUFBRSxVQUFBbUUsR0FBRztjQUFBLE9BQzlDQSxHQUFHLENBQUMxTyxPQUFPLENBQUMseURBQXlELEVBQUVrTSxVQUFVLENBQUM7WUFBQSxDQUNwRixDQUFDO1VBQUE7WUFHR0Msa0JBQWtCLEdBQUdwRixXQUFXLENBQUN6SCxPQUFPLENBQUN4RSxNQUFNLENBQUMsVUFBQTZULEdBQUc7Y0FBQSxPQUFJQSxHQUFHLENBQUM3VSxTQUFTO1lBQUEsRUFBQyxDQUFDK1QsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVFekIsbUJBQW1CLEdBQUcsQ0FBQWxILE9BQU8sYUFBUEEsT0FBTyx1QkFBUEEsT0FBTyxDQUFFNUssRUFBRSxNQUFJNlIsa0JBQWtCLGFBQWxCQSxrQkFBa0IsdUJBQWxCQSxrQkFBa0IsQ0FBRXJTLFNBQVM7WUFDbEV1UyxnQkFBZ0IsR0FBR0QsbUJBQW1CLEdBQUczUCxRQUFRLENBQUNDLE1BQU0sQ0FBQzBQLG1CQUFtQixDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSTtZQUN6RkUsU0FBUyxHQUFHNEIsTUFBTSxDQUFDVSxRQUFRLENBQUNDLFFBQVEsQ0FBQ2hRLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztZQUNsRTBOLGNBQWMsR0FBR0QsU0FBUyxHQUFHN1AsUUFBUSxDQUFDNlAsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUk7WUFDOURFLGdCQUFnQixHQUFHSCxnQkFBZ0IsSUFBSUUsY0FBYyxJQUFJRixnQkFBZ0IsS0FBS0UsY0FBYztZQUVsRyxJQUFJQyxnQkFBZ0IsRUFBRTtjQUNwQixJQUFJekIsZUFBZSxFQUFFO2dCQUNuQixDQUFBMEIscUJBQUEsR0FBQXlCLE1BQU0sQ0FBQ1ksbUJBQW1CLGNBQUFyQyxxQkFBQSxnQkFBQUMsc0JBQUEsR0FBMUJELHFCQUFBLENBQTRCc0MsMEJBQTBCLGNBQUFyQyxzQkFBQSxlQUF0REEsc0JBQUEsQ0FBQTdKLElBQUEsQ0FBQTRKLHFCQUFBLEVBQXlEVCxPQUFPLENBQUM7Y0FDbkUsQ0FBQyxNQUFNLElBQUloQixXQUFXLEVBQUU7Z0JBQ3RCLENBQUEyQixzQkFBQSxHQUFBdUIsTUFBTSxDQUFDWSxtQkFBbUIsY0FBQW5DLHNCQUFBLGdCQUFBQyxzQkFBQSxHQUExQkQsc0JBQUEsQ0FBNEJxQywyQkFBMkIsY0FBQXBDLHNCQUFBLGVBQXZEQSxzQkFBQSxDQUFBL0osSUFBQSxDQUFBOEosc0JBQUEsRUFBMERYLE9BQU8sQ0FBQztjQUNwRSxDQUFDLE1BQU0sSUFBSWYsYUFBYSxFQUFFO2dCQUN4QixDQUFBNEIsc0JBQUEsR0FBQXFCLE1BQU0sQ0FBQ1ksbUJBQW1CLGNBQUFqQyxzQkFBQSxnQkFBQUMsc0JBQUEsR0FBMUJELHNCQUFBLENBQTRCb0MsK0JBQStCLGNBQUFuQyxzQkFBQSxlQUEzREEsc0JBQUEsQ0FBQWpLLElBQUEsQ0FBQWdLLHNCQUFBLEVBQThEYixPQUFPLENBQUM7Y0FDeEU7WUFDRjtVQUFDO1lBR0g7WUFDQTtZQUNBO1lBQ0E7WUFDTWUsZUFBZSxJQUFBM0MsaUJBQUEsR0FBRzhELE1BQU0sQ0FBQ2dCLFNBQVMsY0FBQTlFLGlCQUFBLHVCQUFoQkEsaUJBQUEsQ0FBa0IxRCxNQUFNO1lBQzFDc0csY0FBYyxHQUFHaEcscUJBQXFCLENBQUMxSCxPQUFPO1lBQ3BEMEgscUJBQXFCLENBQUMxSCxPQUFPLEdBQUcsSUFBSSxFQUFDO1lBQy9CMk4saUJBQWlCLEdBQUcsQ0FBQyxDQUFDRCxjQUFjLElBQUluQyxlQUFlLENBQUNwUCxRQUFRLENBQUN1UixjQUFjLENBQUN6TyxRQUFRLENBQUM7WUFDekYyTyxtQkFBbUIsR0FBRyxDQUFDLENBQUNGLGNBQWMsSUFBSWxDLGlCQUFpQixDQUFDclAsUUFBUSxDQUFDdVIsY0FBYyxDQUFDek8sUUFBUSxDQUFDO1lBRW5HLElBQUl3TyxlQUFlLEtBQUsvQixXQUFXLElBQUlDLGFBQWEsSUFBSWdDLGlCQUFpQixJQUFJQyxtQkFBbUIsQ0FBQyxFQUFFO2NBQzNGRSxrQkFBd0MsR0FBR0osY0FBYyxHQUMxRDtnQkFBRXRQLFNBQVMsRUFBRXNQLGNBQWMsQ0FBQ3pPLFFBQVE7Z0JBQUV0QixTQUFTLEdBQUFrUSxxQkFBQSxHQUFFSCxjQUFjLENBQUNtQyxRQUFRLGNBQUFoQyxxQkFBQSxjQUFBQSxxQkFBQSxHQUFJLENBQUM7Y0FBRSxDQUFDLEdBQ2pGLElBQUk7Y0FDRkUsZUFBZSxHQUFHLEdBQUFqUyxNQUFBLENBQUFzUyxrQkFBQSxDQUNuQnZSLG9DQUFvQyxDQUFDQyxjQUFjLENBQUMsR0FBQXNSLGtCQUFBLENBQ3BEL0IsZUFBZSxHQUFBK0Isa0JBQUEsQ0FDZjlCLHlCQUF5QixHQUFBOEIsa0JBQUEsQ0FDeEJOLGtCQUFrQixHQUFHalIsb0NBQW9DLENBQUMsQ0FBQ2lSLGtCQUFrQixDQUFDLENBQUMsR0FBRyxFQUFFLEdBQ3hGblMsR0FBRyxDQUFDeUIsTUFBTSxDQUFDO2NBQ2IsSUFBSTJRLGVBQWUsQ0FBQzVSLFFBQVEsQ0FBQ2lCLE1BQU0sQ0FBQ3FRLGVBQWUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3JELENBQUFPLGtCQUFBLEdBQUFZLE1BQU0sQ0FBQ2dCLFNBQVMsY0FBQTVCLGtCQUFBLGdCQUFBQyxxQkFBQSxHQUFoQkQsa0JBQUEsQ0FBa0I4QixXQUFXLGNBQUE3QixxQkFBQSxlQUE3QkEscUJBQUEsQ0FBQTFLLElBQUEsQ0FBQXlLLGtCQUFnQyxDQUFDO2NBQ25DO1lBQ0Y7WUFFQTlFLFVBQVUsQ0FBQWpPLGFBQUEsQ0FBQUEsYUFBQTtjQUNSRCxFQUFFLFlBQUFjLE1BQUEsQ0FBWWlJLGVBQWUsQ0FBRTtjQUMvQmIsT0FBTyxFQUFFaUksWUFBWTtjQUNyQmhCLElBQUksRUFBRSxJQUFJQyxJQUFJLENBQUMsQ0FBQztjQUNoQkMsSUFBSSxFQUFFO2dCQUFFclAsRUFBRSxFQUFFLFdBQVc7Z0JBQUVHLElBQUksRUFBRTtjQUFZLENBQUM7Y0FDNUN5QixJQUFJLEVBQUUvRCxlQUFlLENBQUN5UixTQUFTO2NBQy9CeEcsT0FBTyxFQUFQQTtZQUFPLEdBQ0g1SixXQUFXLENBQUMwSyxNQUFNLEdBQUcsQ0FBQyxHQUFHO2NBQUUxSyxXQUFXLEVBQVhBO1lBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztjQUNqRDZKLGVBQWUsRUFBZkEsZUFBZTtjQUNmRSxXQUFXLEVBQUVBLFdBQVcsSUFBSTtZQUFFLEdBQzFCNkgsbUJBQW1CLEdBQUc7Y0FBRUEsbUJBQW1CLEVBQW5CQTtZQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQ3ZELENBQUM7WUFFRixLQUFBZixvQkFBQSxHQUFJZSxtQkFBbUIsY0FBQWYsb0JBQUEsZUFBbkJBLG9CQUFBLENBQXFCaE0sT0FBTyxFQUFFO2NBQ2hDNUYsZ0JBQWdCLENBQUMyUyxtQkFBbUIsQ0FBQy9NLE9BQU8sQ0FBQyxDQUMxQ2dSLElBQUksQ0FBQyxVQUFBQyxTQUFTLEVBQUk7Z0JBQ2pCeEcsUUFBUSxDQUFDQyxhQUFhLENBQ3BCLElBQUlILFdBQVcsQ0FBQyxvQ0FBb0MsRUFBRTtrQkFDcERDLE1BQU0sRUFBRTtvQkFBRXRELEtBQUssRUFBRStKO2tCQUFVO2dCQUM3QixDQUFDLENBQ0gsQ0FBQztjQUNILENBQUMsQ0FBQyxTQUNJLENBQUMsVUFBQUMsR0FBRyxFQUFJO2dCQUNaalAsT0FBTyxDQUFDQyxLQUFLLENBQUMsdUVBQXVFLEVBQUVnUCxHQUFHLENBQUM7Y0FDN0YsQ0FBQyxDQUFDO1lBQ047WUFFQSxLQUFBakYsa0JBQUEsR0FBSWlCLGlCQUFpQixjQUFBakIsa0JBQUEsZUFBakJBLGtCQUFBLENBQW1Cak0sT0FBTyxFQUFFO2NBQzlCNUYsZ0JBQWdCLENBQUM4UyxpQkFBaUIsQ0FBQ2xOLE9BQU8sQ0FBQyxDQUN4Q2dSLElBQUksQ0FBQyxVQUFBQyxTQUFTLEVBQUk7Z0JBQ2pCeEcsUUFBUSxDQUFDQyxhQUFhLENBQ3BCLElBQUlILFdBQVcsQ0FBQyxrQ0FBa0MsRUFBRTtrQkFDbERDLE1BQU0sRUFBRTtvQkFBRXRELEtBQUssRUFBRStKO2tCQUFVO2dCQUM3QixDQUFDLENBQ0gsQ0FBQztjQUNILENBQUMsQ0FBQyxTQUNJLENBQUMsVUFBQUMsR0FBRyxFQUFJO2dCQUNaalAsT0FBTyxDQUFDQyxLQUFLLENBQUMseURBQXlELEVBQUVnUCxHQUFHLENBQUM7Y0FDL0UsQ0FBQyxDQUFDO1lBQ047WUFFQXJJLGVBQWUsQ0FBQzVILE9BQU8sR0FBRyxLQUFLO1lBQy9CLElBQUk2SCxZQUFZLENBQUM3SCxPQUFPLEVBQUU7Y0FDbEJxSixXQUFXLEdBQUcsSUFBSUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDO2NBQ3RERSxRQUFRLENBQUNDLGFBQWEsQ0FBQ0osV0FBVyxDQUFDO2NBQ25DeEIsWUFBWSxDQUFDN0gsT0FBTyxHQUFHLEtBQUs7WUFDOUI7VUFBQztVQUFBO1lBQUEsT0FBQWtPLFNBQUEsQ0FBQXJKLElBQUE7UUFBQTtNQUFBLEdBQUErRixRQUFBO0lBQUEsQ0FDRjtJQUFBLGlCQUFBc0YsR0FBQSxFQUFBQyxHQUFBLEVBQUFDLEdBQUEsRUFBQUMsR0FBQSxFQUFBQyxHQUFBLEVBQUFDLEdBQUE7TUFBQSxPQUFBNUYsS0FBQSxDQUFBMUYsS0FBQSxPQUFBQyxTQUFBO0lBQUE7RUFBQSxLQUNELENBQUNnRSxVQUFVLEVBQUVDLGFBQWEsRUFBRXZELE9BQU8sRUFBRWMsaUJBQWlCLEVBQUVMLEtBQUssRUFBRUosS0FBSyxDQUN0RSxDQUFDO0VBRUQsSUFBTXVLLGdCQUFnQixHQUFHMVksV0FBVyxDQUFDLFlBQU07SUFDekNtUSxnQkFBZ0IsQ0FBQ2pJLE9BQU8sQ0FBQyxDQUFDO0lBQzFCLElBQU1nSyxhQUFhLGFBQUFsTyxNQUFBLENBQWF1TCxnQkFBZ0IsQ0FBQ3JILE9BQU8sZUFBWTtJQUNwRXRHLGNBQWMsQ0FBQ2dRLEtBQUssQ0FBQyxDQUFDO0lBQ3RCNUIseUJBQXlCLENBQUM5SCxPQUFPLEdBQUcsSUFBSTtJQUN4QytILHFCQUFxQixDQUFDL0gsT0FBTyxHQUFHLElBQUk7SUFDcENtSixhQUFhLENBQUNhLGFBQWEsQ0FBQztJQUU1QmQsVUFBVSxDQUFDO01BQ1RsTyxFQUFFLFlBQUFjLE1BQUEsQ0FBWXVMLGdCQUFnQixDQUFDckgsT0FBTyxlQUFZO01BQ2xEa0QsT0FBTyxFQUFFbEYsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO01BQzVCbU0sSUFBSSxFQUFFLElBQUlDLElBQUksQ0FBQyxDQUFDO01BQ2hCQyxJQUFJLEVBQUU7UUFBRXJQLEVBQUUsRUFBRSxXQUFXO1FBQUVHLElBQUksRUFBRTtNQUFZLENBQUM7TUFDNUN5QixJQUFJLEVBQUUvRCxlQUFlLENBQUN5UixTQUFTO01BQy9CbUcsbUJBQW1CLEVBQUU7SUFDdkIsQ0FBQyxDQUFDO0lBQ0Y3SSxlQUFlLENBQUM1SCxPQUFPLEdBQUcsS0FBSztJQUMvQjBRLFVBQVUsQ0FBQyxZQUFNO01BQ2YsSUFBTXJILFdBQVcsR0FBRyxJQUFJQyxXQUFXLENBQUMsaUJBQWlCLENBQUM7TUFDdERFLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDSixXQUFXLENBQUM7SUFDckMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztFQUNULENBQUMsRUFBRSxDQUFDSCxVQUFVLEVBQUVDLGFBQWEsRUFBRW5MLENBQUMsQ0FBQyxDQUFDO0VBRWxDLElBQU0yUyxzQkFBc0IsR0FBRzdZLFdBQVcsQ0FDeEMsVUFBQzBXLFFBQXlCLEVBQUV6TSxrQkFBMEIsRUFBSztJQUFBLElBQUE2TyxxQkFBQTtJQUN6RCxJQUFNNUcsYUFBYSxhQUFBbE8sTUFBQSxDQUFhdUwsZ0JBQWdCLENBQUNySCxPQUFPLGVBQVk7SUFDcEV0RyxjQUFjLENBQUNnUSxLQUFLLENBQUMsQ0FBQztJQUN0QjVCLHlCQUF5QixDQUFDOUgsT0FBTyxHQUFHLElBQUk7SUFDeEMrSCxxQkFBcUIsQ0FBQy9ILE9BQU8sR0FBRyxJQUFJO0lBQ3BDbUosYUFBYSxDQUFDYSxhQUFhLENBQUM7SUFFNUIsSUFBTTZHLFdBQWlDLEdBQUc7TUFDeENDLFNBQVMsY0FBQWhWLE1BQUEsQ0FBYzBTLFFBQVEsQ0FBQ3VDLGtCQUFrQixDQUFFO01BQ3BEQyxXQUFXLEVBQUVqUCxrQkFBa0IsSUFBSSxFQUFFO01BQ3JDeU0sUUFBUSxFQUFSQSxRQUFRO01BQ1IxUixjQUFjLEVBQUUwUixRQUFRLENBQUNDLGVBQWU7TUFDeEN3QyxTQUFTLEdBQUFMLHFCQUFBLEdBQUVwQyxRQUFRLENBQUNDLGVBQWUsY0FBQW1DLHFCQUFBLHVCQUF4QkEscUJBQUEsQ0FBMEJqVixHQUFHLENBQUMsVUFBQTZCLE1BQU07UUFBQSxPQUFJQSxNQUFNLENBQUMwVCxTQUFTO01BQUE7SUFDckUsQ0FBQztJQUNEdkosdUJBQXVCLENBQUMzSCxPQUFPLEdBQUc2USxXQUFXO0lBRTdDLElBQUlyQyxRQUFRLENBQUMyQyx3QkFBd0IsRUFBRTtNQUFBLElBQUFDLHNCQUFBLEVBQUFDLEtBQUEsRUFBQUMsVUFBQSxFQUFBQyxVQUFBO01BQ3JDLElBQU1DLFdBQVcsSUFBQUosc0JBQUEsR0FBRzVDLFFBQVEsQ0FBQ0MsZUFBZSxjQUFBMkMsc0JBQUEsdUJBQXhCQSxzQkFBQSxDQUEyQixDQUFDLENBQUM7TUFDakQsSUFBTW5TLFFBQVEsSUFBQW9TLEtBQUEsSUFBQUMsVUFBQSxHQUFJOUMsUUFBUSxDQUE0QnBRLFNBQVMsY0FBQWtULFVBQUEsY0FBQUEsVUFBQSxHQUFJRSxXQUFXLGFBQVhBLFdBQVcsdUJBQVhBLFdBQVcsQ0FBRXBULFNBQVMsY0FBQWlULEtBQUEsY0FBQUEsS0FBQSxHQUFJLEVBQUU7TUFDL0YsSUFBTXhCLFFBQVEsR0FDWixFQUFBMEIsVUFBQSxHQUFFL0MsUUFBUSxDQUE2QzdRLFNBQVMsY0FBQTRULFVBQUEsY0FBQUEsVUFBQSxHQUM3REMsV0FBVyxhQUFYQSxXQUFXLHVCQUFYQSxXQUFXLENBQUU3VCxTQUFTLEtBQ3pCLElBQUk7TUFDTixJQUFJc0IsUUFBUSxFQUFFO1FBQ1p5SSxxQkFBcUIsQ0FBQzFILE9BQU8sR0FBRztVQUFFZixRQUFRLEVBQVJBLFFBQVE7VUFBRTRRLFFBQVEsRUFBUkE7UUFBUyxDQUFDO01BQ3hEO01BQ0FqSSxlQUFlLENBQUM1SCxPQUFPLEdBQUcsS0FBSztNQUMvQjtJQUNGOztJQUVBO0lBQ0FrSixVQUFVLENBQUM7TUFDVGxPLEVBQUUsY0FBQWMsTUFBQSxDQUFjMFMsUUFBUSxDQUFDdUMsa0JBQWtCLENBQUU7TUFDN0M3TixPQUFPLEVBQUVuQixrQkFBa0IsSUFBSSxFQUFFO01BQ2pDb0ksSUFBSSxFQUFFLElBQUlDLElBQUksQ0FBQyxDQUFDO01BQ2hCQyxJQUFJLEVBQUU7UUFBRXJQLEVBQUUsRUFBRSxXQUFXO1FBQUVHLElBQUksRUFBRTtNQUFZLENBQUM7TUFDNUN5QixJQUFJLEVBQUUvRCxlQUFlLENBQUN5UixTQUFTO01BQy9Ca0UsUUFBUSxFQUFSQSxRQUFRO01BQ1JHLGNBQWMsRUFBRTtJQUNsQixDQUFDLENBQUM7SUFDRi9HLGVBQWUsQ0FBQzVILE9BQU8sR0FBRyxLQUFLO0VBQ2pDLENBQUMsRUFDRCxDQUFDa0osVUFBVSxFQUFFQyxhQUFhLENBQzVCLENBQUM7RUFFRCxJQUFBc0kscUJBQUEsR0FTSXBaLHFCQUFxQixDQUFDO01BQ3hCbUwsT0FBTyxFQUFFbUcsaUJBQWlCO01BQzFCK0gsY0FBYyxFQUFFbkgsa0JBQWtCO01BQ2xDb0gsY0FBYyxFQUFFakgsa0JBQWtCO01BQ2xDa0gsTUFBTSxFQUFFcEIsZ0JBQWdCO01BQ3hCbE4sa0JBQWtCLEVBQUVxTixzQkFBc0I7TUFDMUNoSix1QkFBdUIsRUFBdkJBO0lBQ0YsQ0FBQyxDQUFDO0lBZkFrSyxPQUFPLEdBQUFKLHFCQUFBLENBQVBJLE9BQU87SUFDSUMsZUFBZSxHQUFBTCxxQkFBQSxDQUExQk0sU0FBUztJQUNUQyxTQUFTLEdBQUFQLHFCQUFBLENBQVRPLFNBQVM7SUFDVEMsY0FBYyxHQUFBUixxQkFBQSxDQUFkUSxjQUFjO0lBQ2RDLGNBQWMsR0FBQVQscUJBQUEsQ0FBZFMsY0FBYztJQUNkQyxvQkFBb0IsR0FBQVYscUJBQUEsQ0FBcEJVLG9CQUFvQjtJQUNwQkMsYUFBYSxHQUFBWCxxQkFBQSxDQUFiVyxhQUFhO0lBQ2JDLG1CQUFtQixHQUFBWixxQkFBQSxDQUFuQlksbUJBQW1COztFQVVyQjtFQUNBO0VBQ0FySyxzQkFBc0IsQ0FBQ2hJLE9BQU8sR0FBR3FTLG1CQUFtQjtFQUNwRHBLLGdCQUFnQixDQUFDakksT0FBTyxHQUFHLFlBQU07SUFDL0JtUyxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7SUFDMUI5SixpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQkkscUJBQXFCLENBQUMsS0FBSyxDQUFDO0lBQzVCZCx1QkFBdUIsQ0FBQzNILE9BQU8sR0FBRyxJQUFJO0VBQ3hDLENBQUM7RUFFRCxJQUFNc1MsY0FBYyxHQUFHMU0sT0FBTztFQUU5QixJQUFNMk0sV0FBVyxHQUFHemEsV0FBVztJQUFBLElBQUEwYSxLQUFBLEdBQUFwUixpQkFBQSxjQUFBQyxtQkFBQSxDQUFBQyxJQUFBLENBQzdCLFNBQUFtUixTQUNFdlAsT0FBZSxFQUNmcEosb0JBQTRELEVBQzVENFksS0FBYyxFQUNkQyxpQkFBMEIsRUFDMUJDLFFBQTJCLEVBQzNCQyxLQUFjLEVBQ2RDLElBQWE7TUFBQSxJQUFBQyxvQkFBQTtNQUFBLElBQUFDLHFCQUFBLEVBQUE5WSxXQUFBLEVBQUFDLE9BQUEsRUFBQThZLGlCQUFBLEVBQUFDLGNBQUEsRUFBQUMsWUFBQSxFQUFBQyxXQUFBLEVBQUFDLGtCQUFBLEVBQUFDLGNBQUEsRUFBQUMsWUFBQSxFQUFBQyxzQkFBQSxFQUFBQyx3QkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxZQUFBLEVBQUFDLHFCQUFBLEVBQUFDLHFCQUFBLEVBQUFDLE9BQUEsRUFBQUMsbUJBQUEsRUFBQUMsZUFBQSxFQUFBbFosVUFBQSxFQUFBRCxTQUFBLEVBQUFvWixPQUFBLEVBQUEzWixvQkFBQSxFQUFBNFosZ0JBQUEsRUFBQUMsUUFBQSxFQUFBQyxZQUFBLEVBQUFDLHdCQUFBLEVBQUFDLFdBQUE7TUFBQSxPQUFBalQsbUJBQUEsQ0FBQW9CLElBQUEsV0FBQThSLFNBQUE7UUFBQSxrQkFBQUEsU0FBQSxDQUFBNVIsSUFBQSxHQUFBNFIsU0FBQSxDQUFBM1IsSUFBQTtVQUFBO1lBQUEsTUFFVGdGLGVBQWUsQ0FBQzVILE9BQU8sSUFBSThSLGVBQWUsSUFBSWhKLGVBQWU7Y0FBQXlMLFNBQUEsQ0FBQTNSLElBQUE7Y0FBQTtZQUFBO1lBQUEsT0FBQTJSLFNBQUEsQ0FBQS9QLE1BQUE7VUFBQTtZQUFBd08scUJBQUEsR0FJaENuWix3QkFBd0IsQ0FBQ0Msb0JBQW9CLENBQUMsRUFBdkVJLFdBQVcsR0FBQThZLHFCQUFBLENBQVg5WSxXQUFXLEVBQUVDLE9BQU8sR0FBQTZZLHFCQUFBLENBQVA3WSxPQUFPLEVBQzVCO1lBQ0E7WUFDTThZLGlCQUFpQixHQUFHTCxRQUFRLGFBQVJBLFFBQVEsY0FBUkEsUUFBUSxHQUFJelksT0FBTyxDQUFDeVksUUFBUTtZQUNoRE0sY0FBMEMsR0FBR3BhLG1CQUFtQixDQUFDbWEsaUJBQWlCLENBQUM7WUFDbkZFLFlBQVksR0FBR04sS0FBSyxhQUFMQSxLQUFLLGNBQUxBLEtBQUssR0FBSTFZLE9BQU8sQ0FBQzBZLEtBQUs7WUFDckNPLFdBQVcsR0FBR04sSUFBSSxhQUFKQSxJQUFJLGNBQUpBLElBQUksR0FBSTNZLE9BQU8sQ0FBQzJZLElBQUk7WUFDbENPLGtCQUFrQixHQUFHbFosT0FBTyxDQUFDcWEsV0FBVztZQUN4Q2xCLGNBQWMsR0FBR3ZhLGtDQUFrQyxDQUFDbUssT0FBTyxFQUFFO2NBQ2pFMlAsS0FBSyxFQUFFTSxZQUFZO2NBQ25CTCxJQUFJLEVBQUVNO1lBQ1IsQ0FBQyxDQUFDO1lBRUZ4TCxlQUFlLENBQUM1SCxPQUFPLEdBQUcsSUFBSTtZQUN4QnVULFlBQVksR0FBR3BiLE1BQU0sQ0FBQyxDQUFDO1lBQzdCa1AsZ0JBQWdCLENBQUNySCxPQUFPLEdBQUd1VCxZQUFZO1lBQ3ZDak0sbUJBQW1CLENBQUN0SCxPQUFPLEdBQUdrRCxPQUFPO1lBRXJDLElBQUksQ0FBQ3NFLGFBQWEsQ0FBQ3hILE9BQU8sRUFBRTtjQUMxQnFHLEtBQUssQ0FBQzVOLE1BQU0sQ0FBQ2djLGFBQWEsQ0FBQztjQUMzQmpOLGFBQWEsQ0FBQ3hILE9BQU8sR0FBRyxJQUFJO1lBQzlCOztZQUVBO1lBQ013VCxzQkFBc0IsR0FBRy9MLFdBQVcsQ0FBQ3pILE9BQU8sQ0FBQ3hFLE1BQU0sQ0FBQyxVQUFBNlQsR0FBRztjQUFBLE9BQUlBLEdBQUcsQ0FBQzdVLFNBQVM7WUFBQSxFQUFDLENBQUMrVCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFaEZrRix3QkFBd0IsSUFBQVYsb0JBQUEsR0FBR3RMLFdBQVcsQ0FBQ3pILE9BQU8sY0FBQStTLG9CQUFBLGdCQUFBQSxvQkFBQSxHQUFuQkEsb0JBQUEsQ0FBc0J0TCxXQUFXLENBQUN6SCxPQUFPLENBQUM0RSxNQUFNLEdBQUcsQ0FBQyxDQUFDLGNBQUFtTyxvQkFBQSx1QkFBckRBLG9CQUFBLENBQXVEaFUsT0FBTyxFQUUvRjtZQUNBbUssVUFBVSxDQUFBak8sYUFBQTtjQUNSRCxFQUFFLGNBQUFjLE1BQUEsQ0FBY3VMLGdCQUFnQixDQUFDckgsT0FBTyxDQUFFO2NBQzFDa0QsT0FBTyxFQUFFb1EsY0FBYztjQUN2Qm5KLElBQUksRUFBRSxJQUFJQyxJQUFJLENBQUMsQ0FBQztjQUNoQkMsSUFBSSxFQUFFMUssV0FBVztjQUNqQi9DLElBQUksRUFBRS9ELGVBQWUsQ0FBQzZiLElBQUk7Y0FDMUI1USxPQUFPLEVBQUU1SjtZQUFXLEdBQ2hCZ1osY0FBYyxHQUFHO2NBQUVBLGNBQWMsRUFBZEE7WUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQzdDLENBQUM7WUFFRjdMLGdCQUFnQixDQUFDckgsT0FBTyxHQUFHN0gsTUFBTSxDQUFDLENBQUM7WUFFN0J1YixzQkFBc0IsYUFBQTVYLE1BQUEsQ0FBYXVMLGdCQUFnQixDQUFDckgsT0FBTztZQUNqRThILHlCQUF5QixDQUFDOUgsT0FBTyxHQUFHMFQsc0JBQXNCO1lBQzFEM0wscUJBQXFCLENBQUMvSCxPQUFPLEdBQUd1SCxhQUFhLENBQUN2SCxPQUFPO1lBQ3JEa0osVUFBVSxDQUFDO2NBQ1RsTyxFQUFFLEVBQUUwWSxzQkFBc0I7Y0FDMUJ4USxPQUFPLEVBQUUsRUFBRTtjQUNYaUgsSUFBSSxFQUFFLElBQUlDLElBQUksQ0FBQyxDQUFDO2NBQ2hCQyxJQUFJLEVBQUU7Z0JBQUVyUCxFQUFFLEVBQUUsV0FBVztnQkFBRUcsSUFBSSxFQUFFLENBQUE4SyxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRTlLLElBQUksS0FBSTtjQUFZLENBQUM7Y0FDM0R5QixJQUFJLEVBQUUvRCxlQUFlLENBQUN5UjtZQUN4QixDQUFDLENBQUM7WUFFRXFKLFlBQVksR0FBR3pRLE9BQU87WUFFMUIsSUFBSUEsT0FBTyxLQUFLbEYsQ0FBQyxDQUFDLGdDQUFnQyxDQUFDLEVBQUU7Y0FDbkQyVixZQUFZLFdBQUE3WCxNQUFBLENBQVdrQyxDQUFDLENBQUMsZ0NBQWdDLENBQUMsK0JBQUFsQyxNQUFBLENBQ3hELEVBQUE4WCxxQkFBQSxHQUFBelosT0FBTyxDQUFDd2EsY0FBYyxjQUFBZixxQkFBQSx1QkFBdEJBLHFCQUFBLENBQXdCZ0IsVUFBVSxPQUFBZixxQkFBQSxHQUFJakwsVUFBVSxDQUFDNUksT0FBTyxDQUFDNEYsT0FBTyxjQUFBaU8scUJBQUEsdUJBQTFCQSxxQkFBQSxDQUE0QmUsVUFBVSxFQUM1RTtZQUNKO1lBRU1kLE9BQU8sR0FBR3JNLFdBQVcsQ0FBQ3pILE9BQU8sQ0FBQ3JFLEdBQUcsQ0FBQyxVQUFBa1osY0FBYztjQUFBLE9BQUs7Z0JBQ3pEN1IsT0FBTyxFQUFFNlIsY0FBYyxDQUFDM1IsT0FBTztnQkFDL0J0RyxJQUFJLEVBQUVpWSxjQUFjLENBQUN4SyxJQUFJLENBQUNyUCxFQUFFLEtBQUswRSxRQUFRLENBQUMxRSxFQUFFLENBQUM0RSxRQUFRLENBQUMsQ0FBQyxHQUFHL0csZUFBZSxDQUFDNmIsSUFBSSxHQUFHN2IsZUFBZSxDQUFDeVI7Y0FDbkcsQ0FBQztZQUFBLENBQUMsQ0FBQztZQUFBeUosbUJBQUEsR0FPQ25MLFVBQVUsQ0FBQzVJLE9BQU8sRUFKTmdVLGVBQWUsR0FBQUQsbUJBQUEsQ0FBN0IxWixZQUFZLEVBQ0hTLFVBQVUsR0FBQWlaLG1CQUFBLENBQW5Cbk8sT0FBTyxFQUNDL0ssU0FBUyxHQUFBa1osbUJBQUEsQ0FBakIxWSxNQUFNLEVBQ0E0WSxPQUFPLEdBQUFGLG1CQUFBLENBQWJoTyxJQUFJO1lBRUF6TCxvQkFBb0IsR0FBR2taLHNCQUFzQixhQUF0QkEsc0JBQXNCLHVCQUF0QkEsc0JBQXNCLENBQUVoWixTQUFTO1lBQ3hEMFosZ0JBQWdCLEdBQUc5Wix1QkFBdUIsQ0FBQzRaLGVBQWUsRUFBRTFaLG9CQUFvQixDQUFDO1lBRXZGMEcsT0FBTyxDQUFDZ0csSUFBSSxDQUFDLGtEQUFrRCxFQUFFO2NBQy9EM00sWUFBWSxFQUFFMlosZUFBZTtjQUM3QnpaLGNBQWMsRUFBRXlaLGVBQWUsYUFBZkEsZUFBZSxlQUFmQSxlQUFlLENBQUV4WixTQUFTLEdBQUdDLE1BQU0sQ0FBQ3VaLGVBQWUsQ0FBQ3haLFNBQVMsQ0FBQyxHQUFHLElBQUk7Y0FDckZGLG9CQUFvQixFQUFwQkEsb0JBQW9CO2NBQ3BCNFosZ0JBQWdCLEVBQWhCQSxnQkFBZ0I7Y0FDaEJoWixRQUFRLEVBQUVMLFNBQVMsYUFBVEEsU0FBUyx1QkFBVEEsU0FBUyxDQUFFRyxFQUFFO2NBQ3ZCb00sTUFBTSxFQUFFNk0sT0FBTyxhQUFQQSxPQUFPLHVCQUFQQSxPQUFPLENBQUVqWixFQUFFO2NBQ25CbU0sYUFBYSxFQUFFck0sVUFBVSxhQUFWQSxVQUFVLHVCQUFWQSxVQUFVLENBQUVFLEVBQUU7Y0FDN0I4WixTQUFTLEVBQUU3TyxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRWxLO1lBQ3BCLENBQUMsQ0FBQztZQUFBd1ksU0FBQSxDQUFBM1IsSUFBQTtZQUFBLE9BRXFCMkQsYUFBYSxDQUFDLENBQUMyTixnQkFBZ0IsQ0FBQyxDQUFDO1VBQUE7WUFBbERDLFFBQVEsR0FBQUksU0FBQSxDQUFBaFEsSUFBQTtZQUVSNlAsWUFBWSxHQUFHMUIsS0FBSyxhQUFMQSxLQUFLLGNBQUxBLEtBQUssR0FBSXZZLE9BQU8sQ0FBQ3VZLEtBQUs7WUFDckMyQix3QkFBd0IsR0FBRzFCLGlCQUFpQixhQUFqQkEsaUJBQWlCLGNBQWpCQSxpQkFBaUIsR0FBSXhZLE9BQU8sQ0FBQ3dZLGlCQUFpQjtZQUV6RTJCLFdBQVcsR0FBQXJaLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUE7Y0FDZmlJLE9BQU8sRUFBRXlRLFlBQVk7Y0FDckJHLE9BQU8sRUFBUEEsT0FBTztjQUNQdFosU0FBUyxFQUFFMFosZ0JBQWdCO2NBQzNCYSxJQUFJLEVBQUVyVixRQUFRLENBQUNxVixJQUFJO2NBQ25CQyxNQUFNLEVBQUV0VixRQUFRLENBQUMxRSxFQUFFLENBQUM0RSxRQUFRLENBQUMsQ0FBQztjQUM5QkMsU0FBUyxFQUFFSCxRQUFRLENBQUNHLFNBQVM7Y0FDN0JvVixRQUFRLEVBQUV2VixRQUFRLENBQUN1VixRQUFRO2NBQzNCQyxTQUFTLEVBQUV4VixRQUFRLENBQUN5VixVQUFVLENBQUN2VixRQUFRLENBQUMsQ0FBQztjQUN6QzBGLE1BQU0sRUFBRWlDLGFBQWEsQ0FBQ3ZILE9BQU87Y0FDN0I4USxTQUFTLEVBQUV6SixnQkFBZ0IsQ0FBQ3JILE9BQU87Y0FDbkNvVixTQUFTLEVBQUUsQ0FBQW5QLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFOUssSUFBSSxLQUFJLEVBQUU7Y0FDNUI0RCxPQUFPLEVBQUUwVSx3QkFBd0IsS0FBSXhOLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFakwsRUFBRSxDQUFDO2NBQy9Da0wsaUJBQWlCLEVBQUV3QyxvQkFBb0IsQ0FBQzFJLE9BQU87Y0FDL0NtRyxrQkFBa0IsRUFBRXdDLHFCQUFxQixDQUFDM0k7WUFBTyxHQUM3QyxDQUFBbEYsVUFBVSxhQUFWQSxVQUFVLHVCQUFWQSxVQUFVLENBQUV1YSxLQUFLLEtBQUksSUFBSSxHQUFHO2NBQUVBLEtBQUssRUFBRTVhLE1BQU0sQ0FBQ0ssVUFBVSxDQUFDdWEsS0FBSztZQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDckV6YSxvQkFBb0IsQ0FBQ0MsU0FBUyxFQUFFQyxVQUFVLENBQUMsR0FDMUNxWixRQUFRLGFBQVJBLFFBQVEsZUFBUkEsUUFBUSxDQUFFdlAsTUFBTSxHQUFHO2NBQUVzQyxXQUFXLEVBQUVpTixRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUNoWjtZQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDekQsQ0FBQThZLE9BQU8sYUFBUEEsT0FBTyx1QkFBUEEsT0FBTyxDQUFFalosRUFBRSxLQUFJLElBQUksR0FBQUMsYUFBQTtjQUNqQm1NLE1BQU0sRUFBRTNNLE1BQU0sQ0FBQ3daLE9BQU8sQ0FBQ2paLEVBQUU7WUFBQyxHQUFNaVosT0FBTyxDQUFDOVksSUFBSSxHQUFHO2NBQUVtYSxRQUFRLEVBQUVyQixPQUFPLENBQUM5WTtZQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFDaEYsQ0FBQyxDQUFDLEdBQ0ZqQixXQUFXLENBQUMwSyxNQUFNLEdBQUcsQ0FBQyxHQUFHO2NBQUUxSyxXQUFXLEVBQVhBO1lBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUM3Q2thLFlBQVksR0FBRztjQUFFMUIsS0FBSyxFQUFFMEI7WUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQzNDQyx3QkFBd0IsR0FBRztjQUFFMUIsaUJBQWlCLEVBQUUwQjtZQUF5QixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQy9FbEIsWUFBWSxHQUFHO2NBQUVOLEtBQUssRUFBRU07WUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQzNDQyxXQUFXLEdBQUc7Y0FBRU4sSUFBSSxFQUFFTTtZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDeEMsQ0FBQW5OLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFc1AsTUFBTSxLQUFJLElBQUksR0FBRztjQUFFQyxXQUFXLEVBQUV2UCxLQUFLLENBQUNzUDtZQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDMUQsQ0FBQXRQLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFbEssSUFBSSxLQUFJLElBQUksR0FBRztjQUFFK1ksU0FBUyxFQUFFN08sS0FBSyxDQUFDbEs7WUFBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQ3BEbVgsY0FBYyxHQUFHO2NBQUVBLGNBQWMsRUFBZEE7WUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQ3hDRyxrQkFBa0IsR0FBRztjQUFFbUIsV0FBVyxFQUFFbkI7WUFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUduRXhCLE9BQU8sQ0FBQ3lDLFdBQVcsQ0FBQztVQUFBO1VBQUE7WUFBQSxPQUFBQyxTQUFBLENBQUExUCxJQUFBO1FBQUE7TUFBQSxHQUFBNE4sUUFBQTtJQUFBLENBQ3JCO0lBQUEsaUJBQUFnRCxHQUFBLEVBQUFDLEdBQUEsRUFBQUMsSUFBQSxFQUFBQyxJQUFBLEVBQUFDLElBQUEsRUFBQUMsSUFBQSxFQUFBQyxJQUFBO01BQUEsT0FBQXZELEtBQUEsQ0FBQXZOLEtBQUEsT0FBQUMsU0FBQTtJQUFBO0VBQUEsS0FDRCxDQUNFZ0UsVUFBVSxFQUNWN0MsS0FBSyxFQUNMd0wsT0FBTyxFQUNQak0sT0FBTyxFQUNQdkssTUFBTSxFQUNOMEssSUFBSSxFQUNKMUwsWUFBWSxFQUNacUYsUUFBUSxFQUNSdUcsS0FBSyxFQUNMakksQ0FBQyxFQUNEOFQsZUFBZSxFQUNmaEosZUFBZSxFQUNmNUMsaUJBQWlCLEVBQ2pCQyxrQkFBa0IsQ0FFdEIsQ0FBQztFQUVELElBQU02UCxhQUFhLEdBQUdsZSxXQUFXLENBQy9CLFVBQUNvWCxNQUFlLEVBQUs7SUFDbkIsSUFBSSxDQUFDNUgsbUJBQW1CLENBQUN0SCxPQUFPLEVBQUU7SUFFbEMsSUFBSWtQLE1BQU0sQ0FBQ2xVLEVBQUUsTUFBSzRLLE9BQU8sYUFBUEEsT0FBTyx1QkFBUEEsT0FBTyxDQUFFNUssRUFBRSxHQUFFO01BQzdCNkssVUFBVSxDQUFDcUosTUFBTSxDQUFDO0lBQ3BCO0lBRUEsSUFBSXRKLE9BQU8sSUFBSTBCLG1CQUFtQixDQUFDdEgsT0FBTyxFQUFFO01BQUEsSUFBQWlXLFlBQUEsRUFBQUMsc0JBQUE7TUFDMUMsSUFBTXBDLE9BQU8sR0FBR3JNLFdBQVcsQ0FBQ3pILE9BQU8sQ0FBQ3JFLEdBQUcsQ0FBQyxVQUFBa1osY0FBYztRQUFBLE9BQUs7VUFDekQ3UixPQUFPLEVBQUU2UixjQUFjLENBQUMzUixPQUFPO1VBQy9CdEcsSUFBSSxFQUFFaVksY0FBYyxDQUFDeEssSUFBSSxDQUFDclAsRUFBRSxLQUFLMEUsUUFBUSxDQUFDMUUsRUFBRSxDQUFDNEUsUUFBUSxDQUFDLENBQUMsR0FBRy9HLGVBQWUsQ0FBQzZiLElBQUksR0FBRzdiLGVBQWUsQ0FBQ3lSO1FBQ25HLENBQUM7TUFBQSxDQUFDLENBQUM7TUFFSHRKLE9BQU8sQ0FBQ2dHLElBQUksQ0FBQyxnRkFBZ0YsRUFBRTtRQUM3Rm1QLFFBQVEsRUFBRWpILE1BQU0sQ0FBQ2xVLEVBQUU7UUFDbkJtTSxhQUFhLEdBQUE4TyxZQUFBLEdBQUVyUSxPQUFPLGFBQVBBLE9BQU8sdUJBQVBBLE9BQU8sQ0FBRTVLLEVBQUUsY0FBQWliLFlBQUEsY0FBQUEsWUFBQSxHQUFJLElBQUk7UUFDbEMxYixjQUFjLEdBQUEyYixzQkFBQSxHQUFFN2IsWUFBWSxhQUFaQSxZQUFZLHVCQUFaQSxZQUFZLENBQUVHLFNBQVMsY0FBQTBiLHNCQUFBLGNBQUFBLHNCQUFBLEdBQUksSUFBSTtRQUMvQ3BCLFNBQVMsRUFBRTdPLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFbEs7TUFDcEIsQ0FBQyxDQUFDO01BRUY4VixPQUFPLENBQUE1VyxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBO1FBQ0xpSSxPQUFPLEVBQUVvRSxtQkFBbUIsQ0FBQ3RILE9BQU87UUFDcEM4VCxPQUFPLEVBQVBBLE9BQU87UUFDUHRaLFNBQVMsRUFBRTBVLE1BQU0sQ0FBQ2xVLEVBQUU7UUFDcEIrWixJQUFJLEVBQUVyVixRQUFRLENBQUNxVixJQUFJO1FBQ25CQyxNQUFNLEVBQUV0VixRQUFRLENBQUMxRSxFQUFFLENBQUM0RSxRQUFRLENBQUMsQ0FBQztRQUM5QkMsU0FBUyxFQUFFSCxRQUFRLENBQUNHLFNBQVM7UUFDN0JvVixRQUFRLEVBQUV2VixRQUFRLENBQUN1VixRQUFRO1FBQzNCQyxTQUFTLEVBQUV4VixRQUFRLENBQUN5VixVQUFVLENBQUN2VixRQUFRLENBQUMsQ0FBQztRQUN6QzBGLE1BQU0sRUFBRWlDLGFBQWEsQ0FBQ3ZILE9BQU87UUFDN0I4USxTQUFTLEVBQUV6SixnQkFBZ0IsQ0FBQ3JILE9BQU87UUFDbkNvVixTQUFTLEVBQUUsQ0FBQW5QLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFOUssSUFBSSxLQUFJLEVBQUU7UUFDNUI0RCxPQUFPLEVBQUUsQ0FBQWtILEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFakwsRUFBRSxLQUFJLEVBQUU7UUFDeEJrTCxpQkFBaUIsRUFBRXdDLG9CQUFvQixDQUFDMUksT0FBTztRQUMvQ21HLGtCQUFrQixFQUFFd0MscUJBQXFCLENBQUMzSTtNQUFPLEdBQzdDLENBQUFrUCxNQUFNLGFBQU5BLE1BQU0sdUJBQU5BLE1BQU0sQ0FBRW1HLEtBQUssS0FBSSxJQUFJLEdBQUc7UUFBRUEsS0FBSyxFQUFFNWEsTUFBTSxDQUFDeVUsTUFBTSxDQUFDbUcsS0FBSztNQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDNUQsQ0FBQW5HLE1BQU0sYUFBTkEsTUFBTSx1QkFBTkEsTUFBTSxDQUFFaFUsUUFBUSxLQUFJLElBQUksR0FBRztRQUFFQSxRQUFRLEVBQUVULE1BQU0sQ0FBQ3lVLE1BQU0sQ0FBQ2hVLFFBQVE7TUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQ3JFLENBQUErSyxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRXNQLE1BQU0sS0FBSSxJQUFJLEdBQUc7UUFBRUMsV0FBVyxFQUFFdlAsS0FBSyxDQUFDc1A7TUFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQzFELENBQUF0UCxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRWxLLElBQUksS0FBSSxJQUFJLEdBQUc7UUFBRStZLFNBQVMsRUFBRTdPLEtBQUssQ0FBQ2xLO01BQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUN6RCxDQUFDO0lBQ0o7RUFDRixDQUFDLEVBQ0QsQ0FBQzZKLE9BQU8sRUFBRUMsVUFBVSxFQUFFZ00sT0FBTyxFQUFFblMsUUFBUSxFQUFFd0csaUJBQWlCLEVBQUVELEtBQUssQ0FDbkUsQ0FBQztFQUVELElBQU1tUSxjQUFjLEdBQUd0ZSxXQUFXO0lBQUEsSUFBQXVlLEtBQUEsR0FBQWpWLGlCQUFBLGNBQUFDLG1CQUFBLENBQUFDLElBQUEsQ0FBQyxTQUFBZ1YsU0FBT0MsWUFBc0IsRUFBRUMsYUFBcUI7TUFBQSxJQUFBaFYsUUFBQTtNQUFBLE9BQUFILG1CQUFBLENBQUFvQixJQUFBLFdBQUFnVSxTQUFBO1FBQUEsa0JBQUFBLFNBQUEsQ0FBQTlULElBQUEsR0FBQThULFNBQUEsQ0FBQTdULElBQUE7VUFBQTtZQUFBNlQsU0FBQSxDQUFBN1QsSUFBQTtZQUFBLE9BQzlEakssSUFBSSxDQUFDK2QsS0FBSyxDQUFDQyxjQUFjLENBQUNILGFBQWEsRUFBRUQsWUFBWSxLQUFLM2QsUUFBUSxDQUFDZ2UsU0FBUyxDQUFDO1VBQUE7WUFBOUZwVixRQUFRLEdBQUFpVixTQUFBLENBQUFsUyxJQUFBO1lBQ2QsSUFBSS9DLFFBQVEsRUFBRTtjQUNaaUcsV0FBVyxDQUFDekgsT0FBTyxHQUFHeUgsV0FBVyxDQUFDekgsT0FBTyxDQUFDckUsR0FBRyxDQUFDLFVBQUF1SCxPQUFPLEVBQUk7Z0JBQ3ZELElBQUlBLE9BQU8sQ0FBQ2xJLEVBQUUsS0FBS3diLGFBQWEsSUFBSXRULE9BQU8sQ0FBQ3RHLElBQUksS0FBSyxXQUFXLEVBQUU7a0JBQ2hFLE9BQUEzQixhQUFBLENBQUFBLGFBQUEsS0FBWWlJLE9BQU87b0JBQUUyVCxVQUFVLEVBQUVOLFlBQVksS0FBSzNkLFFBQVEsQ0FBQ2dlO2tCQUFTO2dCQUN0RTtnQkFDQSxPQUFPMVQsT0FBTztjQUNoQixDQUFDLENBQUM7WUFDSjtVQUFDO1VBQUE7WUFBQSxPQUFBdVQsU0FBQSxDQUFBNVIsSUFBQTtRQUFBO01BQUEsR0FBQXlSLFFBQUE7SUFBQSxDQUNGO0lBQUEsaUJBQUFRLElBQUEsRUFBQUMsSUFBQTtNQUFBLE9BQUFWLEtBQUEsQ0FBQXBSLEtBQUEsT0FBQUMsU0FBQTtJQUFBO0VBQUEsS0FBRSxFQUFFLENBQUM7RUFFTixJQUFNOFIsc0JBQXNCLEdBQUdsZixXQUFXO0lBQUEsSUFBQW1mLEtBQUEsR0FBQTdWLGlCQUFBLGNBQUFDLG1CQUFBLENBQUFDLElBQUEsQ0FDeEMsU0FBQTRWLFNBQ0VqRyxTQUFtQixFQUNuQmhDLFFBQThCLEVBQzlCa0ksYUFBMkU7TUFBQSxJQUFBQyxtQkFBQSxFQUFBNUksUUFBQSxFQUFBc0MsU0FBQSxFQUFBdUcsVUFBQSxFQUFBeEcsV0FBQSxFQUFBeUcsZUFBQSxFQUFBQyxlQUFBLEVBQUFDLFNBQUEsRUFBQXhWLGFBQUEsRUFBQVIsUUFBQSxFQUFBaVcsRUFBQTtNQUFBLE9BQUFwVyxtQkFBQSxDQUFBb0IsSUFBQSxXQUFBaVYsU0FBQTtRQUFBLGtCQUFBQSxTQUFBLENBQUEvVSxJQUFBLEdBQUErVSxTQUFBLENBQUE5VSxJQUFBO1VBQUE7WUFBQSxJQUV0RXFPLFNBQVMsYUFBVEEsU0FBUyxlQUFUQSxTQUFTLENBQUVyTSxNQUFNO2NBQUE4UyxTQUFBLENBQUE5VSxJQUFBO2NBQUE7WUFBQTtZQUNwQjVCLE9BQU8sQ0FBQ0MsS0FBSyxDQUFDLDhDQUE4QyxDQUFDO1lBQUEsT0FBQXlXLFNBQUEsQ0FBQWxULE1BQUE7VUFBQTtZQUkvRDtZQUNNNFMsbUJBQW1CLEdBQUczUCxXQUFXLENBQUN6SCxPQUFPLENBQUNyQixJQUFJLENBQUMsVUFBQTJQLENBQUM7Y0FBQSxJQUFBcUosV0FBQTtjQUFBLFFBQUFBLFdBQUEsR0FDcERySixDQUFDLENBQUNFLFFBQVEsY0FBQW1KLFdBQUEsZ0JBQUFBLFdBQUEsR0FBVkEsV0FBQSxDQUFZbEosZUFBZSxjQUFBa0osV0FBQSx1QkFBM0JBLFdBQUEsQ0FBNkJqSixJQUFJLENBQUMsVUFBQWxSLE1BQU07Z0JBQUEsT0FBSXlULFNBQVMsQ0FBQzlVLFFBQVEsQ0FBQ3FCLE1BQU0sQ0FBQzBULFNBQVMsQ0FBQztjQUFBLEVBQUM7WUFBQSxDQUNuRixDQUFDO1lBQUEsTUFFRyxDQUFDa0csbUJBQW1CLElBQUksQ0FBQ0EsbUJBQW1CLENBQUM1SSxRQUFRO2NBQUFrSixTQUFBLENBQUE5VSxJQUFBO2NBQUE7WUFBQTtZQUN2RDVCLE9BQU8sQ0FBQ0MsS0FBSyxDQUFDLHNEQUFzRCxFQUFFZ1EsU0FBUyxDQUFDO1lBQUEsT0FBQXlHLFNBQUEsQ0FBQWxULE1BQUE7VUFBQTtZQUkxRWdLLFFBQVEsR0FBSzRJLG1CQUFtQixDQUFoQzVJLFFBQVE7WUFDVnNDLFNBQVMsR0FBR3NHLG1CQUFtQixDQUFDcGMsRUFBRTtZQUNsQ3FjLFVBQVUsR0FBR3BHLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFFekJKLFdBQWlDLEdBQUc7Y0FDeENDLFNBQVMsRUFBVEEsU0FBUztjQUNURSxXQUFXLEVBQUVvRyxtQkFBbUIsQ0FBQ2xVLE9BQU87Y0FDeENzTCxRQUFRLEVBQVJBLFFBQVE7Y0FDUjFSLGNBQWMsRUFBRTBSLFFBQVEsQ0FBQ0MsZUFBZTtjQUN4Q3dDLFNBQVMsRUFBVEE7WUFDRixDQUFDO1lBQ0R0Six1QkFBdUIsQ0FBQzNILE9BQU8sR0FBRzZRLFdBQVc7WUFFdkN5RyxlQUFlLEdBQUc3ZCxnQ0FBZ0MsQ0FBQ3VFLENBQUMsRUFBRTZTLFdBQVcsQ0FBQyxFQUV4RTtZQUNBcEosV0FBVyxDQUFDekgsT0FBTyxHQUFHeUgsV0FBVyxDQUFDekgsT0FBTyxDQUFDckUsR0FBRyxDQUFDLFVBQUF1SCxPQUFPLEVBQUk7Y0FDdkQsSUFBSUEsT0FBTyxDQUFDbEksRUFBRSxLQUFLOFYsU0FBUyxFQUFFO2dCQUM1QixJQUFNMEcsU0FBUyxHQUFHdkksUUFBUSxLQUFLLFNBQVMsR0FBRyxVQUFVLEdBQUcsVUFBVTtnQkFDbEUsT0FBQWhVLGFBQUEsQ0FBQUEsYUFBQSxLQUFZaUksT0FBTztrQkFBRXlMLGNBQWMsRUFBRTZJO2dCQUFTO2NBQ2hEO2NBQ0EsT0FBT3RVLE9BQU87WUFDaEIsQ0FBQyxDQUFDOztZQUVGO1lBQ01xVSxlQUFlLEdBQUc5UCxXQUFXLENBQUN6SCxPQUFPLENBQUNyQixJQUFJLENBQUMsVUFBQTJQLENBQUM7Y0FBQSxPQUFJQSxDQUFDLENBQUN0VCxFQUFFLEtBQUs4VixTQUFTO1lBQUEsRUFBQztZQUN6RSxJQUFJeUcsZUFBZSxFQUFFO2NBQ2JDLFNBQVMsR0FBR3ZJLFFBQVEsS0FBSyxTQUFTLEdBQUcsVUFBVSxHQUFHLFVBQVU7Y0FDbEUvRixVQUFVLENBQUFqTyxhQUFBLENBQUFBLGFBQUEsS0FBTXNjLGVBQWU7Z0JBQUU1SSxjQUFjLEVBQUU2STtjQUFTLEVBQUUsQ0FBQztZQUMvRDs7WUFFQTtZQUNBNVAsZUFBZSxDQUFDNUgsT0FBTyxHQUFHLElBQUk7WUFDOUJ5SSxxQkFBcUIsQ0FBQyxJQUFJLENBQUM7WUFDM0JwQixnQkFBZ0IsQ0FBQ3JILE9BQU8sR0FBRzdILE1BQU0sQ0FBQyxDQUFDOztZQUVuQztZQUNBa1EsaUJBQWlCLENBQUMsVUFBQTFGLElBQUk7Y0FBQSxPQUFBMUgsYUFBQSxDQUFBQSxhQUFBLEtBQ2pCMEgsSUFBSSxPQUFBaVYsZUFBQSxLQUNOUCxVQUFVLEVBQUdDLGVBQWUsQ0FBQ3BVLE9BQU87WUFBQSxDQUNyQyxDQUFDO1lBQ0hpUCxvQkFBb0IsQ0FBQ21GLGVBQWUsQ0FBQzs7WUFFckM7WUFDQTtZQUNBO1lBQ0l0VixhQUFhLEdBQUcsS0FBSztZQUFBMFYsU0FBQSxDQUFBL1UsSUFBQTtZQUFBK1UsU0FBQSxDQUFBOVUsSUFBQTtZQUFBLE9BR0FqSyxJQUFJLENBQUNrZixZQUFZLENBQUNDLGNBQWMsQ0FBQztjQUN0RDdHLFNBQVMsRUFBVEEsU0FBUztjQUFFO2NBQ1g4RyxTQUFTLEVBQUV2SixRQUFRLENBQUN3SixVQUFVO2NBQzlCL0ksUUFBUSxFQUFFa0ksYUFBYSxHQUFHLE1BQU0sR0FBR2xJLFFBQVE7Y0FDM0NrSSxhQUFhLEVBQWJBLGFBQWE7Y0FDYnBZLE9BQU8sRUFBRSxDQUFBa0gsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUVqTCxFQUFFLEtBQUksRUFBRTtjQUN4QitaLElBQUksRUFBRXJWLFFBQVEsQ0FBQ3FWO1lBQ2pCLENBQUMsQ0FBQztVQUFBO1lBUEl2VCxRQUFRLEdBQUFrVyxTQUFBLENBQUFuVCxJQUFBO1lBQUEsSUFTVC9DLFFBQVEsQ0FBQ3lXLEVBQUU7Y0FBQVAsU0FBQSxDQUFBOVUsSUFBQTtjQUFBO1lBQUE7WUFDZDZGLHFCQUFxQixDQUFDLEtBQUssQ0FBQztZQUM1QmtCLGlCQUFpQixDQUFDLENBQUM7WUFBQSxPQUFBK04sU0FBQSxDQUFBbFQsTUFBQTtVQUFBO1lBQUFrVCxTQUFBLENBQUE5VSxJQUFBO1lBQUEsT0FLZjFCLGdCQUFnQixDQUFDTSxRQUFRLEVBQUU2VixVQUFVLEVBQUU7Y0FDM0N0VSxVQUFVLEVBQUUsU0FBWkEsVUFBVUEsQ0FBQSxFQUFRO2dCQUNoQixJQUFNbVYsUUFBd0IsR0FBRztrQkFDL0JDLEtBQUssRUFBRSxVQUFVO2tCQUNqQmpWLE9BQU8sRUFBRTVKLHlCQUF5QixDQUFDLENBQUMsRUFBRTBFLENBQUM7Z0JBQ3pDLENBQUM7Z0JBQ0RtVSxvQkFBb0IsQ0FBQytGLFFBQVEsQ0FBQztjQUNoQyxDQUFDO2NBQ0RqVixPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBR0QsT0FBZSxFQUFLO2dCQUM1Qm1QLG9CQUFvQixDQUFDNVksd0JBQXdCLENBQUN5RSxDQUFDLENBQUMsQ0FBQztnQkFDakR1TSxrQkFBa0IsQ0FBQ3ZILE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO2NBQ3ZDLENBQUM7Y0FDREcsTUFBTSxFQUFFLFNBQVJBLE1BQU1BLENBQUdELE9BQWUsRUFBRWtWLGVBQXVCLEVBQUs7Z0JBQ3BELElBQU1DLFlBQVksR0FBRzdlLDZCQUE2QixDQUNoRDBKLE9BQU8sRUFDUGxGLENBQUMsRUFDRDJKLHVCQUF1QixDQUFDM0gsT0FBTyxFQUMvQm9ZLGVBQWUsRUFDZjtrQkFBRUUsbUJBQW1CLEVBQUU7Z0JBQUssQ0FDOUIsQ0FBQztnQkFDRG5HLG9CQUFvQixDQUFDa0csWUFBWSxDQUFDO2dCQUNsQ2hRLGlCQUFpQixDQUFDLFVBQUExRixJQUFJO2tCQUFBLE9BQUExSCxhQUFBLENBQUFBLGFBQUEsS0FDakIwSCxJQUFJLE9BQUFpVixlQUFBLEtBQ05RLGVBQWUsRUFBR0MsWUFBWSxDQUFDblYsT0FBTztnQkFBQSxDQUN2QyxDQUFDO2NBQ0wsQ0FBQztjQUNEbUIsVUFBVSxFQUFFLFNBQVpBLFVBQVVBLENBQ1JqQixZQUFvQixFQUNwQlUsT0FBWSxFQUNaQyxlQUF1QixFQUN2QnFVLGVBQXVCLEVBQ3ZCbGUsV0FBMEIsRUFDMUIrSixXQUE2QixFQUM3QmxGLE9BQXVCLEVBQ3BCO2dCQUNIaUQsYUFBYSxHQUFHLElBQUk7Z0JBQ3BCeUcscUJBQXFCLENBQUMsS0FBSyxDQUFDO2dCQUM1QmlDLGtCQUFrQixDQUFDdEgsWUFBWSxFQUFFVSxPQUFPLEVBQUVDLGVBQWUsRUFBRTdKLFdBQVcsRUFBRStKLFdBQVcsRUFBRWxGLE9BQU8sQ0FBQztnQkFDN0ZvVCxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7Z0JBQzFCeEssdUJBQXVCLENBQUMzSCxPQUFPLEdBQUcsSUFBSTtnQkFDdENxSSxpQkFBaUIsQ0FBQyxVQUFBMUYsSUFBSSxFQUFJO2tCQUN4QixJQUFNNFYsV0FBVyxHQUFBdGQsYUFBQSxLQUFRMEgsSUFBSSxDQUFFO2tCQUMvQixPQUFPNFYsV0FBVyxDQUFDSCxlQUFlLENBQUM7a0JBQ25DLE9BQU9HLFdBQVc7Z0JBQ3BCLENBQUMsQ0FBQztjQUNKLENBQUM7Y0FDRGpWLGtCQUFrQixFQUFFLFNBQXBCQSxrQkFBa0JBLENBQUdrVixlQUFvQixFQUFFelcsa0JBQTBCLEVBQUVxVyxlQUF1QixFQUFLO2dCQUNqRztnQkFDQXBXLGFBQWEsR0FBRyxJQUFJO2dCQUNwQnlHLHFCQUFxQixDQUFDLEtBQUssQ0FBQztnQkFDNUIwSixvQkFBb0IsQ0FBQyxJQUFJLENBQUM7Z0JBQzFCeEssdUJBQXVCLENBQUMzSCxPQUFPLEdBQUcsSUFBSTtnQkFDdENxSSxpQkFBaUIsQ0FBQyxVQUFBMUYsSUFBSSxFQUFJO2tCQUN4QixJQUFNNFYsV0FBVyxHQUFBdGQsYUFBQSxLQUFRMEgsSUFBSSxDQUFFO2tCQUMvQixPQUFPNFYsV0FBVyxDQUFDSCxlQUFlLENBQUM7a0JBQ25DLE9BQU9HLFdBQVc7Z0JBQ3BCLENBQUMsQ0FBQztnQkFDRjVILHNCQUFzQixDQUFDNkgsZUFBZSxFQUFxQnpXLGtCQUFrQixDQUFDO2NBQ2hGLENBQUM7Y0FDRHlCLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBLEVBQVE7Z0JBQ2J4QixhQUFhLEdBQUcsSUFBSTtnQkFDcEJ5RyxxQkFBcUIsQ0FBQyxLQUFLLENBQUM7Z0JBQzVCa0IsaUJBQWlCLENBQUMsQ0FBQztjQUNyQjtZQUNGLENBQUMsQ0FBQztVQUFBO1lBQUErTixTQUFBLENBQUE5VSxJQUFBO1lBQUE7VUFBQTtZQUFBOFUsU0FBQSxDQUFBL1UsSUFBQTtZQUFBOFUsRUFBQSxHQUFBQyxTQUFBO1lBRUYxVixhQUFhLEdBQUcsSUFBSTtZQUNwQnlHLHFCQUFxQixDQUFDLEtBQUssQ0FBQztZQUM1QmtCLGlCQUFpQixDQUFDLENBQUM7VUFBQTtZQUFBK04sU0FBQSxDQUFBL1UsSUFBQTtZQUVuQjhGLHFCQUFxQixDQUFDLEtBQUssQ0FBQztZQUM1QmIsZUFBZSxDQUFDNUgsT0FBTyxHQUFHLEtBQUs7WUFDL0I7WUFDQTtZQUNBLElBQUksQ0FBQ2dDLGFBQWEsRUFBRTtjQUNsQm1RLG9CQUFvQixDQUFDLElBQUksQ0FBQztjQUMxQnhLLHVCQUF1QixDQUFDM0gsT0FBTyxHQUFHLElBQUk7Y0FDdENxSSxpQkFBaUIsQ0FBQyxVQUFBMUYsSUFBSSxFQUFJO2dCQUN4QixJQUFJLEVBQUUwVSxVQUFVLElBQUkxVSxJQUFJLENBQUMsRUFBRSxPQUFPQSxJQUFJO2dCQUN0QyxJQUFNNFYsV0FBVyxHQUFBdGQsYUFBQSxLQUFRMEgsSUFBSSxDQUFFO2dCQUMvQixPQUFPNFYsV0FBVyxDQUFDbEIsVUFBVSxDQUFDO2dCQUM5QixPQUFPa0IsV0FBVztjQUNwQixDQUFDLENBQUM7WUFDSjtZQUFDLE9BQUFiLFNBQUEsQ0FBQWUsTUFBQTtVQUFBO1VBQUE7WUFBQSxPQUFBZixTQUFBLENBQUE3UyxJQUFBO1FBQUE7TUFBQSxHQUFBcVMsUUFBQTtJQUFBLENBRUo7SUFBQSxpQkFBQXdCLElBQUEsRUFBQUMsSUFBQSxFQUFBQyxJQUFBO01BQUEsT0FBQTNCLEtBQUEsQ0FBQWhTLEtBQUEsT0FBQUMsU0FBQTtJQUFBO0VBQUEsS0FDRCxDQUNFeEYsUUFBUSxFQUNSdUcsS0FBSyxFQUNMaUQsVUFBVSxFQUNWUyxpQkFBaUIsRUFDakJZLGtCQUFrQixFQUNsQkcsa0JBQWtCLEVBQ2xCaUcsc0JBQXNCLEVBQ3RCd0Isb0JBQW9CLEVBQ3BCblUsQ0FBQyxDQUVMLENBQUM7RUFFRCxJQUFNNmEsY0FBYyxHQUFHL2dCLFdBQVcsY0FBQXNKLGlCQUFBLGNBQUFDLG1CQUFBLENBQUFDLElBQUEsQ0FBQyxTQUFBd1gsU0FBQTtJQUFBLElBQUFDLHFCQUFBLEVBQUFDLHFCQUFBLEVBQUFDLEtBQUEsRUFBQUMscUJBQUEsRUFBQUMsY0FBQSxFQUFBQyxhQUFBLEVBQUFDLFdBQUEsRUFBQUMscUJBQUEsRUFBQUMsaUJBQUEsRUFBQUMscUJBQUEsRUFBQUMsYUFBQSxFQUFBQyxhQUFBLEVBQUFDLFlBQUEsRUFBQTdGLE9BQUEsRUFBQThGLG9CQUFBLEVBQUE1RixlQUFBLEVBQUFsWixVQUFBLEVBQUFELFNBQUEsRUFBQW9aLE9BQUEsRUFBQUMsZ0JBQUE7SUFBQSxPQUFBN1MsbUJBQUEsQ0FBQW9CLElBQUEsV0FBQW9YLFNBQUE7TUFBQSxrQkFBQUEsU0FBQSxDQUFBbFgsSUFBQSxHQUFBa1gsU0FBQSxDQUFBalgsSUFBQTtRQUFBO1VBQ2pDLElBQUksQ0FBQ2lGLFlBQVksQ0FBQzdILE9BQU8sRUFBRTtZQUN6QjZILFlBQVksQ0FBQzdILE9BQU8sR0FBRyxJQUFJO1VBQzdCO1VBQUMsS0FDR3FGLGFBQWE7WUFBQXdVLFNBQUEsQ0FBQWpYLElBQUE7WUFBQTtVQUFBO1VBQUFpWCxTQUFBLENBQUFqWCxJQUFBO1VBQUEsT0FDVHFHLFlBQVksQ0FBQyxDQUFDO1FBQUE7VUFBQTRRLFNBQUEsQ0FBQWpYLElBQUE7VUFBQTtRQUFBO1VBQUEsS0FDWDJDLGtCQUFrQjtZQUFBc1UsU0FBQSxDQUFBalgsSUFBQTtZQUFBO1VBQUE7VUFDckIyVyxpQkFBaUIsR0FBR08sT0FBTyxFQUFBZixxQkFBQSxHQUFDeFQsa0JBQWtCLENBQUNyQyxPQUFPLGNBQUE2VixxQkFBQSx1QkFBMUJBLHFCQUFBLENBQTRCbGQsSUFBSSxDQUFDLENBQUMsQ0FBQztVQUMvRDJkLHFCQUFxQixHQUFHTSxPQUFPLEVBQUFkLHFCQUFBLEdBQUN6VCxrQkFBa0IsQ0FBQ3JMLFdBQVcsY0FBQThlLHFCQUFBLHVCQUE5QkEscUJBQUEsQ0FBZ0NwVSxNQUFNLENBQUM7VUFDdkU2VSxhQUFhLEdBQUdLLE9BQU8sQ0FBQ3ZVLGtCQUFrQixDQUFDbU4sS0FBSyxDQUFDO1VBQ2pEZ0gsYUFBYSxHQUFHSSxPQUFPLENBQUN2VSxrQkFBa0IsQ0FBQ3NOLEtBQUssQ0FBQztVQUNqRDhHLFlBQVksR0FBR0csT0FBTyxDQUFDdlUsa0JBQWtCLENBQUN1TixJQUFJLENBQUM7VUFBQSxNQUVqRCxDQUFDeUcsaUJBQWlCLElBQUksQ0FBQ0MscUJBQXFCLElBQUksQ0FBQ0MsYUFBYSxJQUFJLENBQUNDLGFBQWEsSUFBSSxDQUFDQyxZQUFZO1lBQUFFLFNBQUEsQ0FBQWpYLElBQUE7WUFBQTtVQUFBO1VBQUEsT0FBQWlYLFNBQUEsQ0FBQXJWLE1BQUE7UUFBQTtVQUkvRnNQLE9BQU8sR0FBR3JNLFdBQVcsQ0FBQ3pILE9BQU8sQ0FBQ3JFLEdBQUcsQ0FBQyxVQUFBa1osY0FBYztZQUFBLE9BQUs7Y0FDekQ3UixPQUFPLEVBQUU2UixjQUFjLENBQUMzUixPQUFPO2NBQy9CdEcsSUFBSSxFQUFFaVksY0FBYyxDQUFDeEssSUFBSSxDQUFDclAsRUFBRSxLQUFLMEUsUUFBUSxDQUFDMUUsRUFBRSxDQUFDNEUsUUFBUSxDQUFDLENBQUMsR0FBRy9HLGVBQWUsQ0FBQzZiLElBQUksR0FBRzdiLGVBQWUsQ0FBQ3lSO1lBQ25HLENBQUM7VUFBQSxDQUFDLENBQUM7VUFBQXNQLG9CQUFBLEdBT0NoUixVQUFVLENBQUM1SSxPQUFPLEVBSk5nVSxlQUFlLEdBQUE0RixvQkFBQSxDQUE3QnZmLFlBQVksRUFDSFMsVUFBVSxHQUFBOGUsb0JBQUEsQ0FBbkJoVSxPQUFPLEVBQ0MvSyxTQUFTLEdBQUErZSxvQkFBQSxDQUFqQnZlLE1BQU0sRUFDQTRZLE9BQU8sR0FBQTJGLG9CQUFBLENBQWI3VCxJQUFJO1VBRUFtTyxnQkFBZ0IsSUFBQStFLEtBQUEsSUFBQUMscUJBQUEsR0FBRzllLHVCQUF1QixDQUFDNFosZUFBZSxFQUFFLElBQUksQ0FBQyxjQUFBa0YscUJBQUEsY0FBQUEscUJBQUEsR0FBSXBlLFVBQVUsYUFBVkEsVUFBVSx1QkFBVkEsVUFBVSxDQUFFRSxFQUFFLGNBQUFpZSxLQUFBLGNBQUFBLEtBQUEsR0FBSSxJQUFJO1VBRWpHalksT0FBTyxDQUFDZ0csSUFBSSxDQUFDLGtGQUFrRixFQUFFO1lBQy9GRyxhQUFhLEdBQUFnUyxjQUFBLEdBQUVyZSxVQUFVLGFBQVZBLFVBQVUsdUJBQVZBLFVBQVUsQ0FBRUUsRUFBRSxjQUFBbWUsY0FBQSxjQUFBQSxjQUFBLEdBQUksSUFBSTtZQUNyQ2plLFFBQVEsR0FBQWtlLGFBQUEsR0FBRXZlLFNBQVMsYUFBVEEsU0FBUyx1QkFBVEEsU0FBUyxDQUFFRyxFQUFFLGNBQUFvZSxhQUFBLGNBQUFBLGFBQUEsR0FBSSxJQUFJO1lBQy9CaFMsTUFBTSxHQUFBaVMsV0FBQSxHQUFFcEYsT0FBTyxhQUFQQSxPQUFPLHVCQUFQQSxPQUFPLENBQUVqWixFQUFFLGNBQUFxZSxXQUFBLGNBQUFBLFdBQUEsR0FBSSxJQUFJO1lBQzNCOWUsY0FBYyxHQUFBK2UscUJBQUEsR0FBRXRGLGVBQWUsYUFBZkEsZUFBZSx1QkFBZkEsZUFBZSxDQUFFeFosU0FBUyxjQUFBOGUscUJBQUEsY0FBQUEscUJBQUEsR0FBSSxJQUFJO1lBQ2xEcEYsZ0JBQWdCLEVBQWhCQSxnQkFBZ0I7WUFDaEJZLFNBQVMsRUFBRTdPLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFbEs7VUFDcEIsQ0FBQyxDQUFDO1VBRUY4VixPQUFPLENBQUE1VyxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBO1lBQ0xpSSxPQUFPLEVBQUVxQyxrQkFBa0IsQ0FBQ3JDLE9BQU87WUFDbkM0USxPQUFPLEVBQVBBLE9BQU87WUFDUHRaLFNBQVMsRUFBRTBaLGdCQUFnQjtZQUMzQmEsSUFBSSxFQUFFclYsUUFBUSxDQUFDcVYsSUFBSTtZQUNuQkMsTUFBTSxFQUFFdFYsUUFBUSxDQUFDMUUsRUFBRSxDQUFDNEUsUUFBUSxDQUFDLENBQUM7WUFDOUJDLFNBQVMsRUFBRUgsUUFBUSxDQUFDRyxTQUFTO1lBQzdCb1YsUUFBUSxFQUFFdlYsUUFBUSxDQUFDdVYsUUFBUTtZQUMzQkMsU0FBUyxFQUFFeFYsUUFBUSxDQUFDeVYsVUFBVSxDQUFDdlYsUUFBUSxDQUFDLENBQUM7WUFDekMwRixNQUFNLEVBQUVpQyxhQUFhLENBQUN2SCxPQUFPO1lBQzdCOFEsU0FBUyxFQUFFekosZ0JBQWdCLENBQUNySCxPQUFPO1lBQ25Db1YsU0FBUyxFQUFFblAsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUU5SyxJQUFLO1lBQ3ZCNEQsT0FBTyxFQUFFa0gsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUVqTCxFQUFHO1lBQ25Ca0wsaUJBQWlCLEVBQUV3QyxvQkFBb0IsQ0FBQzFJLE9BQU87WUFDL0NtRyxrQkFBa0IsRUFBRXdDLHFCQUFxQixDQUFDM0k7VUFBTyxHQUM3QyxDQUFBbEYsVUFBVSxhQUFWQSxVQUFVLHVCQUFWQSxVQUFVLENBQUV1YSxLQUFLLEtBQUksSUFBSSxHQUFHO1lBQUVBLEtBQUssRUFBRTVhLE1BQU0sQ0FBQ0ssVUFBVSxDQUFDdWEsS0FBSztVQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDckV6YSxvQkFBb0IsQ0FBQ0MsU0FBUyxFQUFFQyxVQUFVLENBQUMsR0FDMUNBLFVBQVUsYUFBVkEsVUFBVSxlQUFWQSxVQUFVLENBQUVLLElBQUksR0FBRztZQUFFK0wsV0FBVyxFQUFFcE0sVUFBVSxDQUFDSztVQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDeEQsQ0FBQThZLE9BQU8sYUFBUEEsT0FBTyx1QkFBUEEsT0FBTyxDQUFFalosRUFBRSxLQUFJLElBQUksR0FBQUMsYUFBQTtZQUNqQm1NLE1BQU0sRUFBRTNNLE1BQU0sQ0FBQ3daLE9BQU8sQ0FBQ2paLEVBQUU7VUFBQyxHQUFNaVosT0FBTyxDQUFDOVksSUFBSSxHQUFHO1lBQUVtYSxRQUFRLEVBQUVyQixPQUFPLENBQUM5WTtVQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFDaEYsQ0FBQyxDQUFDLEdBQ0ZvSyxrQkFBa0IsQ0FBQ3JMLFdBQVcsR0FBRztZQUFFQSxXQUFXLEVBQUVxTCxrQkFBa0IsQ0FBQ3JMO1VBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUNyRnFMLGtCQUFrQixDQUFDbU4sS0FBSyxHQUFHO1lBQUVBLEtBQUssRUFBRW5OLGtCQUFrQixDQUFDbU47VUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQ25Fbk4sa0JBQWtCLENBQUNvTixpQkFBaUIsR0FBRztZQUFFQSxpQkFBaUIsRUFBRXBOLGtCQUFrQixDQUFDb047VUFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUN2R3BOLGtCQUFrQixDQUFDc04sS0FBSyxHQUFHO1lBQUVBLEtBQUssRUFBRXROLGtCQUFrQixDQUFDc047VUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQ25FdE4sa0JBQWtCLENBQUN1TixJQUFJLEdBQUc7WUFBRUEsSUFBSSxFQUFFdk4sa0JBQWtCLENBQUN1TjtVQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDaEUsQ0FBQTdNLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFc1AsTUFBTSxLQUFJLElBQUksR0FBRztZQUFFQyxXQUFXLEVBQUV2UCxLQUFLLENBQUNzUDtVQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDMUQsQ0FBQXRQLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFbEssSUFBSSxLQUFJLElBQUksR0FBRztZQUFFK1ksU0FBUyxFQUFFN08sS0FBSyxDQUFDbEs7VUFBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQ3BEakQsbUJBQW1CLENBQUN5TSxrQkFBa0IsQ0FBQ3FOLFFBQVEsQ0FBQyxHQUNoRDtZQUFFTSxjQUFjLEVBQUVwYSxtQkFBbUIsQ0FBQ3lNLGtCQUFrQixDQUFDcU4sUUFBUTtVQUFFLENBQUMsR0FDcEUsQ0FBQyxDQUFDLEdBQ0ZyTixrQkFBa0IsQ0FBQ2lQLFdBQVcsR0FBRztZQUFFQSxXQUFXLEVBQUVqUCxrQkFBa0IsQ0FBQ2lQO1VBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUMxRixDQUFDO1FBQUE7UUFBQTtVQUFBLE9BQUFxRixTQUFBLENBQUFoVixJQUFBO01BQUE7SUFBQSxHQUFBaVUsUUFBQTtFQUFBLENBRUwsSUFBRSxDQUNEelQsYUFBYSxFQUNiRSxrQkFBa0IsRUFDbEJLLE9BQU8sRUFDUHZLLE1BQU0sRUFDTjBLLElBQUksRUFDSnJHLFFBQVEsRUFDUnVHLEtBQUssRUFDTDRMLE9BQU8sRUFDUDNMLGlCQUFpQixFQUNqQkMsa0JBQWtCLENBQ25CLENBQUM7RUFFRixJQUFNNFQsU0FBUyxHQUFHamlCLFdBQVcsQ0FBQyxZQUFNO0lBQ2xDa1Esc0JBQXNCLENBQUNoSSxPQUFPLENBQUMsQ0FBQztJQUNoQ3FILGdCQUFnQixDQUFDckgsT0FBTyxHQUFHN0gsTUFBTSxDQUFDLENBQUM7SUFDbkNtUCxtQkFBbUIsQ0FBQ3RILE9BQU8sR0FBRyxJQUFJO0lBQ2xDdUgsYUFBYSxDQUFDdkgsT0FBTyxHQUFHN0gsTUFBTSxDQUFDLENBQUM7SUFDaENxUCxhQUFhLENBQUN4SCxPQUFPLEdBQUcsS0FBSztJQUM3QjhILHlCQUF5QixDQUFDOUgsT0FBTyxHQUFHLElBQUk7SUFDeEMrSCxxQkFBcUIsQ0FBQy9ILE9BQU8sR0FBRyxJQUFJO0lBQ3BDdEcsY0FBYyxDQUFDZ1EsS0FBSyxDQUFDLENBQUM7SUFDdEJqQixxQkFBcUIsQ0FBQyxLQUFLLENBQUM7RUFDOUIsQ0FBQyxFQUFFLEVBQUUsQ0FBQztFQUVOLElBQU11UixjQUFjLEdBQUdsaUIsV0FBVyxDQUFDLFlBQU07SUFDdkNzYSxhQUFhLENBQUMsQ0FBQztJQUNmeEssZUFBZSxDQUFDNUgsT0FBTyxHQUFHLEtBQUs7SUFDL0J5SSxxQkFBcUIsQ0FBQyxLQUFLLENBQUM7RUFDOUIsQ0FBQyxFQUFFLENBQUMySixhQUFhLENBQUMsQ0FBQztFQUVuQixPQUFPO0lBQ0xySixRQUFRLEVBQVJBLFFBQVE7SUFDUkQsZUFBZSxFQUFmQSxlQUFlO0lBQ2ZFLHFCQUFxQixFQUFyQkEscUJBQXFCO0lBQ3JCOEksZUFBZSxFQUFFQSxlQUFlLElBQUl0SixrQkFBa0I7SUFDdER3SixTQUFTLEVBQVRBLFNBQVM7SUFDVEMsY0FBYyxFQUFkQSxjQUFjO0lBQ2RDLGNBQWMsRUFBZEEsY0FBYztJQUNkOUosY0FBYyxFQUFkQSxjQUFjO0lBQ2RrSyxjQUFjLEVBQWRBLGNBQWM7SUFDZC9LLGFBQWEsRUFBRUEsYUFBYSxDQUFDdkgsT0FBTztJQUNwQ3FILGdCQUFnQixFQUFFQSxnQkFBZ0IsQ0FBQ3JILE9BQU87SUFFMUN1UyxXQUFXLEVBQVhBLFdBQVc7SUFDWHlELGFBQWEsRUFBYkEsYUFBYTtJQUNiSSxjQUFjLEVBQWRBLGNBQWM7SUFDZFksc0JBQXNCLEVBQXRCQSxzQkFBc0I7SUFDdEI1TixZQUFZLEVBQVpBLFlBQVk7SUFDWnlQLGNBQWMsRUFBZEEsY0FBYztJQUNka0IsU0FBUyxFQUFUQSxTQUFTO0lBQ1RDLGNBQWMsRUFBZEEsY0FBYztJQUVkQyxVQUFVLEVBQUVuSSxlQUFlLElBQUl0SixrQkFBa0IsSUFBSU07RUFDdkQsQ0FBQztBQUNILENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
|