@projectcor/maia-components 2.49.0-beta.1 → 2.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.js +37 -0
  2. package/lib/components/atoms/ApprovalBox/ApprovalBox.js +3 -37
  3. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +117 -0
  4. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +31 -101
  5. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +91 -0
  6. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +49 -140
  7. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +257 -0
  8. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +53 -205
  9. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.js +4 -0
  10. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +2 -4
  11. package/lib/components/atoms/ClientSelector/ClientSelector.helpers.js +26 -0
  12. package/lib/components/atoms/ClientSelector/ClientSelector.js +12 -21
  13. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.js +227 -0
  14. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +15 -255
  15. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +59 -0
  16. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +12 -57
  17. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +74 -0
  18. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +184 -0
  19. package/lib/components/atoms/MAIAInput/MAIAInput.js +127 -176
  20. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +96 -0
  21. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +40 -113
  22. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.js +17 -0
  23. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +3 -15
  24. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +3 -4
  25. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +3 -11
  26. package/lib/components/atoms/ReasoningBlock/reasoningLeading.js +6 -1
  27. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +2 -3
  28. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.js +10 -0
  29. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.js +101 -0
  30. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +21 -77
  31. package/lib/components/atoms/TextArea/TextArea.helpers.js +23 -0
  32. package/lib/components/atoms/TextArea/TextArea.js +11 -20
  33. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.js +37 -0
  34. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +6 -29
  35. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +68 -0
  36. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +17 -56
  37. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +133 -0
  38. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +31 -112
  39. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.js +17 -0
  40. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +5 -15
  41. package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.js +370 -0
  42. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +197 -233
  43. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +398 -0
  44. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +209 -235
  45. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +515 -4
  46. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +228 -344
  47. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.js +5 -0
  48. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +3 -2
  49. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +49 -0
  50. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +36 -33
  51. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.js +39 -0
  52. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +30 -33
  53. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.js +41 -0
  54. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +9 -35
  55. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.js +48 -0
  56. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +9 -44
  57. package/lib/components/molecules/Sidebar/Sidebar.helpers.js +43 -0
  58. package/lib/components/molecules/Sidebar/Sidebar.js +25 -22
  59. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +512 -0
  60. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +309 -643
  61. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.js +37 -0
  62. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +13 -25
  63. package/lib/constants/formatExtensions.js +7 -8
  64. package/lib/dev/DevReasoningTimeline.js +8 -50
  65. package/lib/hooks/useAgentModel/useCreateAgent.helpers.js +144 -0
  66. package/lib/hooks/useAgentModel/useCreateAgent.js +38 -102
  67. package/lib/hooks/useChatManager/useChatManager.helpers.js +902 -0
  68. package/lib/hooks/useChatManager/useChatManager.js +267 -741
  69. package/lib/hooks/useChatMessages/useChatMessages.helpers.js +365 -0
  70. package/lib/hooks/useChatMessages/useChatMessages.js +59 -285
  71. package/lib/hooks/useClientSearch.helpers.js +36 -0
  72. package/lib/hooks/useClientSearch.js +4 -32
  73. package/lib/hooks/useContextMentions.helpers.js +212 -0
  74. package/lib/hooks/useContextMentions.js +5 -223
  75. package/lib/hooks/useContextMentions.types.js +2 -0
  76. package/lib/hooks/useContextPinPopover.helpers.js +95 -0
  77. package/lib/hooks/useContextPinPopover.js +16 -75
  78. package/lib/hooks/useEntitySearch.helpers.js +407 -0
  79. package/lib/hooks/useEntitySearch.js +52 -436
  80. package/lib/hooks/useMentionPopover.helpers.js +41 -0
  81. package/lib/hooks/useMentionPopover.js +9 -35
  82. package/lib/hooks/useMinimizedPillBottomOffset.helpers.js +47 -0
  83. package/lib/hooks/useMinimizedPillBottomOffset.js +15 -45
  84. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.js +86 -0
  85. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +8 -82
  86. package/lib/hooks/useProjectSearch.helpers.js +61 -0
  87. package/lib/hooks/useProjectSearch.js +4 -58
  88. package/lib/hooks/useProjectSummaryConfig.helpers.js +62 -0
  89. package/lib/hooks/useProjectSummaryConfig.js +14 -52
  90. package/lib/hooks/useReasoningTrace/reasoningStore.js +8 -39
  91. package/lib/hooks/useRecentClientsSearch.helpers.js +33 -0
  92. package/lib/hooks/useRecentClientsSearch.js +4 -32
  93. package/lib/lang/br/index.js +1 -7
  94. package/lib/lang/en/index.js +1 -7
  95. package/lib/lang/es/index.js +1 -7
  96. package/lib/lang/fr/index.js +1 -7
  97. package/lib/services/maia/Agents/getAgents.helpers.js +241 -0
  98. package/lib/services/maia/Agents/getAgents.js +90 -282
  99. package/lib/services/maia/Orchestrator/orchestrator.helpers.js +130 -0
  100. package/lib/services/maia/Orchestrator/orchestrator.js +38 -121
  101. package/lib/services/utils/mapChatMessages.helpers.js +223 -0
  102. package/lib/services/utils/mapChatMessages.js +25 -254
  103. package/lib/store/sessions/sessionNotifications.helpers.js +45 -0
  104. package/lib/store/sessions/sessionNotifications.js +35 -41
  105. package/lib/store/sessions/sessionStreamManager.helpers.js +134 -0
  106. package/lib/store/sessions/sessionStreamManager.js +172 -236
  107. package/lib/test/mockSseStream.js +121 -0
  108. package/lib/test/streamdownCodeMock.js +6 -0
  109. package/lib/test/streamdownMock.js +12 -0
  110. package/lib/types/Chat.js +1 -1
  111. package/lib/types/agentModal.js +1 -1
  112. package/lib/types/reasoning.js +1 -1
  113. package/lib/utils/imagePreprocessor.helpers.js +28 -0
  114. package/lib/utils/imagePreprocessor.js +12 -37
  115. package/lib/utils/renderContextMentions.helpers.js +110 -0
  116. package/lib/utils/renderContextMentions.js +4 -110
  117. package/lib/utils/streamActivityMessages.helpers.js +222 -0
  118. package/lib/utils/streamActivityMessages.js +4 -221
  119. package/package.json +2 -2
  120. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.js +0 -53
  121. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.styles.js +0 -8
  122. package/lib/components/atoms/ContextCompactedNotice/index.js +0 -2
  123. package/lib/types/contextCompaction.js +0 -48
  124. package/lib/types/jest-dom.d.js +0 -2
@@ -1,61 +1,21 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
1
2
  import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
3
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
4
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
5
- import _regeneratorRuntime from "@babel/runtime/regenerator";
6
5
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
7
6
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
7
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
8
8
  /* eslint-disable @typescript-eslint/indent */
9
9
  import { useCallback, useState, useRef, useEffect } from 'react';
10
10
  import { useProjects } from '../useProjects';
11
- import { buildContextMessage } from '../../types/contextMention';
12
11
  import maia from '../../services/maia';
13
12
  import { useGlobalContext } from '../../context/global-context';
14
13
  import { useT } from '../useT';
15
14
  import { useUser } from '../../context/cor-user';
16
15
  import { useTabTaskDefault } from '../useTabTaskDefault';
17
- import { TASK_URL_REGEX_PATTERN } from '../../constants/taskUrls';
18
16
  import { mapCORLang } from '../../lang/utils';
19
- import { formatQuickActionMessageForDisplay } from '../../utils/formatQuickActionMessage';
20
17
  import { useSessionsStore } from '../../store/sessions/useSessionsStore';
21
- import { isActiveSessionStatus } from '../../store/sessions/sessions.types';
22
- import { getChatsStoreState } from '../../store/useChatsStore';
23
- /** El modal usa `{ message: '', attachments: [] }` como "sin mensaje inicial"; no es falsy. */
24
- var hasMeaningfulUserInitialMessage = function hasMeaningfulUserInitialMessage(userInitialMessage) {
25
- var _userInitialMessage$m, _userInitialMessage$a;
26
- return Boolean(userInitialMessage && (((_userInitialMessage$m = userInitialMessage.message) === null || _userInitialMessage$m === void 0 ? void 0 : _userInitialMessage$m.trim()) || ((_userInitialMessage$a = userInitialMessage.attachments) === null || _userInitialMessage$a === void 0 ? void 0 : _userInitialMessage$a.length) || userInitialMessage.fuaId || userInitialMessage.scId));
27
- };
28
-
29
- /** Marca la sesión como leída cuando terminó de hidratarse y sigue siendo la activa y visible. */
30
- var markOpenedSessionAsReadIfVisible = function markOpenedSessionAsReadIfVisible(sessionId) {
31
- var _getChatsStoreState = getChatsStoreState(),
32
- isChatViewVisible = _getChatsStoreState.isChatViewVisible,
33
- activeChatId = _getChatsStoreState.activeChatId,
34
- markChatAsRead = _getChatsStoreState.markChatAsRead;
35
- if (!isChatViewVisible || activeChatId !== sessionId) return;
36
- markChatAsRead(sessionId);
37
- };
38
- var buildInitialMessagePlaceholder = function buildInitialMessagePlaceholder(userInitialMessage, currentUser) {
39
- return [_objectSpread(_objectSpread({
40
- id: 'user-initial-message',
41
- date: new Date(),
42
- user: currentUser,
43
- message: formatQuickActionMessageForDisplay(userInitialMessage.message, {
44
- fuaId: userInitialMessage.fuaId,
45
- scId: userInitialMessage.scId
46
- })
47
- }, userInitialMessage.attachments ? {
48
- attachments: userInitialMessage.attachments
49
- } : {}), buildContextMessage(userInitialMessage.mentions) ? {
50
- contextMessage: buildContextMessage(userInitialMessage.mentions)
51
- } : {})];
52
- };
53
- var rewriteTaskUrlsInContent = function rewriteTaskUrlsInContent(content, tabSegment) {
54
- var taskUrlRegex = new RegExp(TASK_URL_REGEX_PATTERN, 'g');
55
- return content.replace(taskUrlRegex, function (url) {
56
- return url.replace(/\/(detail|message|messages|files|history|hours)(?=$|\?)/, tabSegment);
57
- });
58
- };
18
+ import { buildInitialMessagePlaceholder, conversationProjectToGlobalProject, hasClientConversationMetadata, hasMeaningfulUserInitialMessage, markOpenedSessionAsReadIfVisible, resolveProjectContextFromFetch, resolveTaskFromConversationMetadata, buildSessionConversationMeta, buildSessionMetaEventDetail, resolveFinalMessagesWithActiveStreamingTail, resolveSessionAgentFromChatLoad, rewriteMessagesForProjectTaskUrls, rewriteTaskUrlsInContent, shouldAbortStaleMessageLoad, shouldApplyMultiAgentProjectContext, shouldLoadMoreMessagesOnScroll, messagesNeedTabRewrite, upsertChatMessage } from './useChatMessages.helpers';
59
19
  export var useChatMessages = function useChatMessages(_ref) {
60
20
  var _user$permissions;
61
21
  var onError = _ref.onError,
@@ -114,24 +74,14 @@ export var useChatMessages = function useChatMessages(_ref) {
114
74
  }, []);
115
75
  var setConversationContextFromMetadata = useCallback(/*#__PURE__*/function () {
116
76
  var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref2) {
117
- var projectIdMessage, projectNameFromSession, clientIdFromSession, clientNameFromSession, taskIdFromSession, taskNameFromSession, projects, hasMultiAgentsAccess, projectIdNum, foundProject, _foundProject$client;
77
+ var projectIdMessage, projectNameFromSession, clientIdFromSession, clientNameFromSession, taskIdFromSession, taskNameFromSession, task, projects, hasMultiAgentsAccess, _resolveProjectContex, chipsProject, resolvedProject;
118
78
  return _regeneratorRuntime.wrap(function (_context) {
119
79
  while (1) switch (_context.prev = _context.next) {
120
80
  case 0:
121
81
  projectIdMessage = _ref2.projectIdMessage, projectNameFromSession = _ref2.projectNameFromSession, clientIdFromSession = _ref2.clientIdFromSession, clientNameFromSession = _ref2.clientNameFromSession, taskIdFromSession = _ref2.taskIdFromSession, taskNameFromSession = _ref2.taskNameFromSession;
122
- // Tarea de la conversación: se deriva de la metadata de la session para mostrar el chip
123
- // de la tarea (y reenviar la metadata en cada mensaje) sin importar desde dónde se abra.
124
- if (taskIdFromSession != null && taskNameFromSession) {
125
- setTask({
126
- id: taskIdFromSession,
127
- name: taskNameFromSession
128
- });
129
- } else {
130
- setTask(null);
131
- }
132
-
133
- // Conversación con client_metadata: setear cliente y limpiar proyecto
134
- if (!(clientIdFromSession != null && clientNameFromSession)) {
82
+ task = resolveTaskFromConversationMetadata(taskIdFromSession, taskNameFromSession);
83
+ setTask(task);
84
+ if (!hasClientConversationMetadata(clientIdFromSession, clientNameFromSession)) {
135
85
  _context.next = 1;
136
86
  break;
137
87
  }
@@ -148,32 +98,10 @@ export var useChatMessages = function useChatMessages(_ref) {
148
98
  case 2:
149
99
  projects = _context.sent;
150
100
  hasMultiAgentsAccess = !!window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
151
- if (projectIdMessage && hasMultiAgentsAccess) {
152
- projectIdNum = Number(projectIdMessage);
153
- foundProject = projects === null || projects === void 0 ? void 0 : projects.find(function (p) {
154
- return Number(p.id) === projectIdNum;
155
- });
156
- if (foundProject) {
157
- setChipsProject({
158
- projectName: foundProject.name,
159
- clientName: ((_foundProject$client = foundProject.client) === null || _foundProject$client === void 0 ? void 0 : _foundProject$client.name) || '',
160
- projectId: String(foundProject.id)
161
- });
162
- setProject(foundProject);
163
- } else if (projectNameFromSession) {
164
- setChipsProject({
165
- projectName: projectNameFromSession,
166
- clientName: '',
167
- projectId: String(projectIdMessage)
168
- });
169
- setProject({
170
- id: projectIdNum,
171
- name: projectNameFromSession
172
- });
173
- } else {
174
- setChipsProject(null);
175
- setProject(null);
176
- }
101
+ if (shouldApplyMultiAgentProjectContext(projectIdMessage, hasMultiAgentsAccess)) {
102
+ _resolveProjectContex = resolveProjectContextFromFetch(projectIdMessage, projects || [], projectNameFromSession), chipsProject = _resolveProjectContex.chipsProject, resolvedProject = _resolveProjectContex.project;
103
+ setChipsProject(chipsProject);
104
+ setProject(conversationProjectToGlobalProject(resolvedProject));
177
105
  setClient === null || setClient === void 0 || setClient(null);
178
106
  } else {
179
107
  setChipsProject(null);
@@ -238,7 +166,7 @@ export var useChatMessages = function useChatMessages(_ref) {
238
166
  }(), [selectAgent, setConversationContextFromMetadata]);
239
167
  var loadMessages = useCallback(/*#__PURE__*/function () {
240
168
  var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(options) {
241
- var seq, targetChatId, agentSnapshot, selectAgentForSession, _yield$maia$Chats$get, items, nextItem, agentDeleted, agentNoPermission, hasAgentAccess, hasAgentPermission, agentTypeFromSession, agentEntityFromSession, projectIdMessage, projectNameFromSession, projectDeleted, clientIdFromSession, clientNameFromSession, taskIdFromSession, taskNameFromSession, agentInList, contextProjectId, itemsToSet, tab, tabSegment, sessionMeta, finalMessages, tail, existingIds, extra, conversationMeta, sessionMetaEvent, paginationKey, _t;
169
+ var seq, targetChatId, agentSnapshot, _yield$maia$Chats$get, items, nextItem, agentDeleted, agentNoPermission, hasAgentAccess, hasAgentPermission, agentTypeFromSession, agentEntityFromSession, projectIdMessage, projectNameFromSession, projectDeleted, clientIdFromSession, clientNameFromSession, taskIdFromSession, taskNameFromSession, sessionAgent, itemsToSet, sessionMeta, finalMessages, conversationMeta, sessionMetaEvent, paginationKey, _t;
242
170
  return _regeneratorRuntime.wrap(function (_context3) {
243
171
  while (1) switch (_context3.prev = _context3.next) {
244
172
  case 0:
@@ -258,10 +186,6 @@ export var useChatMessages = function useChatMessages(_ref) {
258
186
  setLoadingMessages(true);
259
187
  initialLoadDone.current = false;
260
188
  agentSnapshot = null;
261
- selectAgentForSession = function selectAgentForSession(next) {
262
- selectAgent(next);
263
- agentSnapshot = next;
264
- };
265
189
  _context3.next = 4;
266
190
  return maia.Chats.getChatMessages({
267
191
  chatId: targetChatId,
@@ -287,113 +211,24 @@ export var useChatMessages = function useChatMessages(_ref) {
287
211
  clientNameFromSession = _yield$maia$Chats$get.clientName;
288
212
  taskIdFromSession = _yield$maia$Chats$get.taskId;
289
213
  taskNameFromSession = _yield$maia$Chats$get.taskName;
290
- if (!(seq !== loadSeqRef.current || targetChatId !== chatId)) {
214
+ if (!shouldAbortStaleMessageLoad(seq, loadSeqRef.current, targetChatId, chatId)) {
291
215
  _context3.next = 5;
292
216
  break;
293
217
  }
294
218
  return _context3.abrupt("return");
295
219
  case 5:
296
- if (agentDeleted) {
297
- selectAgentForSession(_objectSpread({
298
- id: agentDeleted.id,
299
- name: agentDeleted.name,
300
- emoji: agentDeleted.emoji,
301
- type: 'custom',
302
- is_deleted: true,
303
- deleted_at: agentDeleted.deletedAt
304
- }, agentNoPermission !== null && agentNoPermission !== void 0 && agentNoPermission.connectors ? {
305
- connectors: agentNoPermission.connectors
306
- } : {}));
307
- }
308
-
309
- // Si el agente no está en la lista pero tiene permisos, acceso y no está eliminado, setearlo normalmente
310
- // Excluir agentes no-custom para usuarios con roles deshabilitados
311
- if (agentNoPermission && !agentDeleted && userPermissions !== null && userPermissions !== void 0 && userPermissions.view && hasAgentAccess && hasAgentPermission && !agents.find(function (agent) {
312
- return agent.id === agentNoPermission.id;
313
- })) {
314
- selectAgentForSession(_objectSpread(_objectSpread({
315
- id: agentNoPermission.id,
316
- name: agentNoPermission.name,
317
- emoji: agentNoPermission.emoji,
318
- type: agentNoPermission.type,
319
- is_from_conversation: true
320
- }, agentNoPermission.connectors ? {
321
- connectors: agentNoPermission.connectors
322
- } : {}), projectDeleted ? {
323
- project_deleted: {
324
- name: projectDeleted.name
325
- }
326
- } : {}));
327
- }
328
-
329
- // Si el agente está en la lista y tiene acceso/permisos, actualizar project_deleted (o limpiarlo al cambiar de chat)
330
- if (agentNoPermission && !agentDeleted && hasAgentAccess && hasAgentPermission && agents.find(function (a) {
331
- return a.id === agentNoPermission.id;
332
- })) {
333
- agentInList = agents.find(function (a) {
334
- return a.id === agentNoPermission.id;
335
- });
336
- if (agentInList) {
337
- selectAgentForSession(_objectSpread(_objectSpread(_objectSpread({}, agentInList), agentNoPermission.connectors ? {
338
- connectors: agentNoPermission.connectors
339
- } : {}), projectDeleted ? {
340
- project_deleted: {
341
- name: projectDeleted.name
342
- }
343
- } : {
344
- project_deleted: undefined
345
- }));
346
- }
347
- }
348
-
349
- // Si el agente no tiene acceso o permisos según la respuesta de sessions, seleccionarlo con el flag correspondiente
350
- // La validación ahora se basa en las propiedades has_agent_access y has_agent_permission de la respuesta
351
- if (agentNoPermission && !agentDeleted) {
352
- if (!hasAgentAccess) {
353
- // Caso 1: No tiene acceso al agente
354
- selectAgentForSession(_objectSpread(_objectSpread({
355
- id: agentNoPermission.id,
356
- name: agentNoPermission.name,
357
- emoji: agentNoPermission.emoji,
358
- type: agentNoPermission.type,
359
- has_not_access: true
360
- }, agentNoPermission.connectors ? {
361
- connectors: agentNoPermission.connectors
362
- } : {}), projectDeleted ? {
363
- project_deleted: {
364
- name: projectDeleted.name
365
- }
366
- } : {}));
367
- } else if (!hasAgentPermission) {
368
- // Caso 2: No tiene permisos para visualizar/interactuar con el agente
369
- selectAgentForSession(_objectSpread(_objectSpread({
370
- id: agentNoPermission.id,
371
- name: agentNoPermission.name,
372
- emoji: agentNoPermission.emoji,
373
- type: agentNoPermission.type,
374
- has_not_permissions: true
375
- }, agentNoPermission.connectors ? {
376
- connectors: agentNoPermission.connectors
377
- } : {}), projectDeleted ? {
378
- project_deleted: {
379
- name: projectDeleted.name
380
- }
381
- } : {}));
382
- } else if (projectDeleted) {
383
- // Caso 3: El proyecto de la conversación fue eliminado
384
- selectAgentForSession(_objectSpread(_objectSpread({
385
- id: agentNoPermission.id,
386
- name: agentNoPermission.name,
387
- emoji: agentNoPermission.emoji,
388
- type: agentNoPermission.type
389
- }, agentNoPermission.connectors ? {
390
- connectors: agentNoPermission.connectors
391
- } : {}), {}, {
392
- project_deleted: {
393
- name: projectDeleted.name
394
- }
395
- }));
396
- }
220
+ sessionAgent = resolveSessionAgentFromChatLoad({
221
+ agentDeleted: agentDeleted,
222
+ agentNoPermission: agentNoPermission,
223
+ agents: agents,
224
+ userCanViewAgents: Boolean(userPermissions === null || userPermissions === void 0 ? void 0 : userPermissions.view),
225
+ hasAgentAccess: Boolean(hasAgentAccess),
226
+ hasAgentPermission: Boolean(hasAgentPermission),
227
+ projectDeleted: projectDeleted
228
+ });
229
+ if (sessionAgent) {
230
+ selectAgent(sessionAgent);
231
+ agentSnapshot = sessionAgent;
397
232
  }
398
233
  _context3.next = 6;
399
234
  return setConversationContextFromMetadata({
@@ -408,8 +243,7 @@ export var useChatMessages = function useChatMessages(_ref) {
408
243
  // Metadata de la session (agent_type / agent_entity + contexto) para el cartel de
409
244
  // "continuar en un chat nuevo" del footer cuando se abre una conversación de un clone legacy.
410
245
  document.dispatchEvent(new CustomEvent('maia-chat-session-meta', {
411
- detail: {
412
- chatId: chatId,
246
+ detail: buildSessionMetaEventDetail(chatId, {
413
247
  agentType: agentTypeFromSession,
414
248
  agentEntity: agentEntityFromSession,
415
249
  projectId: projectIdMessage,
@@ -418,54 +252,23 @@ export var useChatMessages = function useChatMessages(_ref) {
418
252
  clientName: clientNameFromSession,
419
253
  taskId: taskIdFromSession,
420
254
  taskName: taskNameFromSession
421
- }
255
+ })
422
256
  }));
423
-
424
- // Si hay proyecto en la conversación, reescribir URLs de tareas con el tab del usuario (me)
425
- contextProjectId = projectIdMessage ? parseInt(String(projectIdMessage), 10) : null;
426
- itemsToSet = items;
427
- if (!contextProjectId) {
428
- _context3.next = 8;
429
- break;
430
- }
431
257
  _context3.next = 7;
432
- return getTabTaskDefault(1);
258
+ return rewriteMessagesForProjectTaskUrls(items, projectIdMessage, getTabTaskDefault);
433
259
  case 7:
434
- tab = _context3.sent;
435
- tabSegment = tab ? "/".concat(tab) : '/detail';
436
- itemsToSet = items.map(function (item) {
437
- return _objectSpread(_objectSpread({}, item), {}, {
438
- message: rewriteTaskUrlsInContent(item.message || '', tabSegment)
439
- });
440
- });
441
- case 8:
442
- // Si la sesión sigue generando (stream en background), reconstruimos el
443
- // tail en vuelo (pregunta + placeholder) que aún no está persistido en el
444
- // backend, mergeándolo al historial cargado sin duplicar por id.
260
+ itemsToSet = _context3.sent;
445
261
  sessionMeta = useSessionsStore.getState().getMeta(chatId);
446
- finalMessages = itemsToSet;
447
- if (sessionMeta && isActiveSessionStatus(sessionMeta.status)) {
448
- tail = useSessionsStore.getState().getMessages(chatId);
449
- existingIds = new Set(itemsToSet.map(function (item) {
450
- return item.id;
451
- }));
452
- extra = tail.filter(function (item) {
453
- return !existingIds.has(item.id);
454
- });
455
- if (extra.length) {
456
- finalMessages = [].concat(_toConsumableArray(itemsToSet), _toConsumableArray(extra));
457
- }
458
- }
459
- conversationMeta = {
262
+ finalMessages = resolveFinalMessagesWithActiveStreamingTail(itemsToSet, useSessionsStore.getState().getMessages(chatId), sessionMeta === null || sessionMeta === void 0 ? void 0 : sessionMeta.status);
263
+ conversationMeta = buildSessionConversationMeta({
460
264
  projectIdMessage: projectIdMessage,
461
265
  projectNameFromSession: projectNameFromSession,
462
266
  clientIdFromSession: clientIdFromSession,
463
267
  clientNameFromSession: clientNameFromSession,
464
268
  taskIdFromSession: taskIdFromSession,
465
269
  taskNameFromSession: taskNameFromSession
466
- };
467
- sessionMetaEvent = {
468
- chatId: chatId,
270
+ });
271
+ sessionMetaEvent = buildSessionMetaEventDetail(chatId, {
469
272
  agentType: agentTypeFromSession,
470
273
  agentEntity: agentEntityFromSession,
471
274
  projectId: projectIdMessage,
@@ -474,7 +277,7 @@ export var useChatMessages = function useChatMessages(_ref) {
474
277
  clientName: clientNameFromSession,
475
278
  taskId: taskIdFromSession,
476
279
  taskName: taskNameFromSession
477
- };
280
+ });
478
281
  setMessages(finalMessages);
479
282
  paginationKey = Number(nextItem);
480
283
  setLastEvaluatedKey(paginationKey);
@@ -488,25 +291,25 @@ export var useChatMessages = function useChatMessages(_ref) {
488
291
  agentSnapshot: agentSnapshot
489
292
  });
490
293
  markOpenedSessionAsReadIfVisible(targetChatId);
491
- _context3.next = 10;
294
+ _context3.next = 9;
492
295
  break;
493
- case 9:
494
- _context3.prev = 9;
296
+ case 8:
297
+ _context3.prev = 8;
495
298
  _t = _context3["catch"](3);
496
- if (seq === loadSeqRef.current && targetChatId === chatId) {
299
+ if (!shouldAbortStaleMessageLoad(seq, loadSeqRef.current, targetChatId, chatId)) {
497
300
  onError === null || onError === void 0 || onError();
498
301
  }
499
- case 10:
500
- _context3.prev = 10;
501
- if (seq === loadSeqRef.current && targetChatId === chatId) {
302
+ case 9:
303
+ _context3.prev = 9;
304
+ if (!shouldAbortStaleMessageLoad(seq, loadSeqRef.current, targetChatId, chatId)) {
502
305
  setLoadingMessages(false);
503
306
  }
504
- return _context3.finish(10);
505
- case 11:
307
+ return _context3.finish(9);
308
+ case 10:
506
309
  case "end":
507
310
  return _context3.stop();
508
311
  }
509
- }, _callee3, null, [[3, 9, 10, 11]]);
312
+ }, _callee3, null, [[3, 8, 9, 10]]);
510
313
  }));
511
314
  return function (_x3) {
512
315
  return _ref5.apply(this, arguments);
@@ -514,7 +317,7 @@ export var useChatMessages = function useChatMessages(_ref) {
514
317
  }(), [chatId, currentUser, setConversationContextFromMetadata, onError, getTabTaskDefault, restoreSessionFromStore, selectAgent, agents, t, i18n.language, userPermissions === null || userPermissions === void 0 ? void 0 : userPermissions.view]);
515
318
  var loadMoreMessages = useCallback(/*#__PURE__*/function () {
516
319
  var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(container) {
517
- var oldScrollTop, _yield$maia$Chats$get2, items, nextItem, projectIdMessage, projectNameFromSession, clientIdFromSession, clientNameFromSession, taskIdFromSession, taskNameFromSession, contextProjectId, itemsToMerge, tab, tabSegment, newMessages, paginationKey, _t2;
320
+ var oldScrollTop, _yield$maia$Chats$get2, items, nextItem, projectIdMessage, projectNameFromSession, clientIdFromSession, clientNameFromSession, taskIdFromSession, taskNameFromSession, itemsToMerge, newMessages, paginationKey, _t2;
518
321
  return _regeneratorRuntime.wrap(function (_context4) {
519
322
  while (1) switch (_context4.prev = _context4.next) {
520
323
  case 0:
@@ -555,24 +358,10 @@ export var useChatMessages = function useChatMessages(_ref) {
555
358
  taskNameFromSession: taskNameFromSession
556
359
  });
557
360
  case 3:
558
- // Si hay proyecto en la conversación, reescribir URLs de tareas en los mensajes cargados
559
- contextProjectId = projectIdMessage ? parseInt(String(projectIdMessage), 10) : null;
560
- itemsToMerge = items;
561
- if (!contextProjectId) {
562
- _context4.next = 5;
563
- break;
564
- }
565
361
  _context4.next = 4;
566
- return getTabTaskDefault(1);
362
+ return rewriteMessagesForProjectTaskUrls(items, projectIdMessage, getTabTaskDefault);
567
363
  case 4:
568
- tab = _context4.sent;
569
- tabSegment = tab ? "/".concat(tab) : '/detail';
570
- itemsToMerge = items.map(function (item) {
571
- return _objectSpread(_objectSpread({}, item), {}, {
572
- message: rewriteTaskUrlsInContent(item.message || '', tabSegment)
573
- });
574
- });
575
- case 5:
364
+ itemsToMerge = _context4.sent;
576
365
  // The API paginates oldest-first: subsequent pages belong after the
577
366
  // loaded conversation, never between its first question and answer.
578
367
  newMessages = [].concat(_toConsumableArray(messages), _toConsumableArray(itemsToMerge));
@@ -588,22 +377,22 @@ export var useChatMessages = function useChatMessages(_ref) {
588
377
  }
589
378
  });
590
379
  });
591
- _context4.next = 7;
380
+ _context4.next = 6;
592
381
  break;
593
- case 6:
594
- _context4.prev = 6;
382
+ case 5:
383
+ _context4.prev = 5;
595
384
  _t2 = _context4["catch"](1);
596
385
  onError === null || onError === void 0 || onError();
597
- case 7:
598
- _context4.prev = 7;
386
+ case 6:
387
+ _context4.prev = 6;
599
388
  setIsLoadingMoreMessages(false);
600
389
  isLoadingRef.current = false;
601
- return _context4.finish(7);
602
- case 8:
390
+ return _context4.finish(6);
391
+ case 7:
603
392
  case "end":
604
393
  return _context4.stop();
605
394
  }
606
- }, _callee4, null, [[1, 6, 7, 8]]);
395
+ }, _callee4, null, [[1, 5, 6, 7]]);
607
396
  }));
608
397
  return function (_x4) {
609
398
  return _ref6.apply(this, arguments);
@@ -614,8 +403,7 @@ export var useChatMessages = function useChatMessages(_ref) {
614
403
  var scrollTop = container.scrollTop,
615
404
  scrollHeight = container.scrollHeight,
616
405
  clientHeight = container.clientHeight;
617
- var scrollPercentage = scrollHeight - clientHeight > 0 ? scrollTop / (scrollHeight - clientHeight) * 100 : 100;
618
- if (scrollPercentage > 90) {
406
+ if (shouldLoadMoreMessagesOnScroll(scrollTop, scrollHeight, clientHeight)) {
619
407
  loadMoreMessages(container);
620
408
  }
621
409
  }, [loadMoreMessages]);
@@ -652,16 +440,8 @@ export var useChatMessages = function useChatMessages(_ref) {
652
440
  var didRewriteRef = useRef(false);
653
441
  useEffect(function () {
654
442
  if (!tabTaskDefault || !(project !== null && project !== void 0 && project.id) || messages.length === 0) return;
655
- var taskUrlRegex = new RegExp(TASK_URL_REGEX_PATTERN, 'g');
656
443
  var tabSegment = "/".concat(tabTaskDefault);
657
- var needsRewrite = messages.some(function (msg) {
658
- var content = msg.message || '';
659
- var matches = content.match(taskUrlRegex);
660
- if (!(matches !== null && matches !== void 0 && matches.length)) return false;
661
- return matches.some(function (url) {
662
- return !url.endsWith("/".concat(tabTaskDefault)) && !url.includes("/".concat(tabTaskDefault, "?"));
663
- });
664
- });
444
+ var needsRewrite = messagesNeedTabRewrite(messages, tabTaskDefault);
665
445
  if (!needsRewrite) {
666
446
  didRewriteRef.current = false;
667
447
  return;
@@ -691,13 +471,7 @@ export var useChatMessages = function useChatMessages(_ref) {
691
471
  syncMessagesToStore(chatId, nextMessages);
692
472
  }, [chatId, syncMessagesToStore]);
693
473
  var addMessage = useCallback(function (message) {
694
- var prev = messagesRef.current;
695
- var existingMessageIndex = prev.findIndex(function (msg) {
696
- return msg.id === message.id;
697
- });
698
- applyMessages(existingMessageIndex >= 0 ? prev.map(function (msg, index) {
699
- return index === existingMessageIndex ? message : msg;
700
- }) : [].concat(_toConsumableArray(prev), [message]));
474
+ applyMessages(upsertChatMessage(messagesRef.current, message));
701
475
  }, [applyMessages]);
702
476
  var removeMessage = useCallback(function (messageId) {
703
477
  applyMessages(messagesRef.current.filter(function (msg) {
@@ -719,4 +493,4 @@ export var useChatMessages = function useChatMessages(_ref) {
719
493
  handleScroll: handleScroll
720
494
  };
721
495
  };
722
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVN0YXRlIiwidXNlUmVmIiwidXNlRWZmZWN0IiwidXNlUHJvamVjdHMiLCJidWlsZENvbnRleHRNZXNzYWdlIiwibWFpYSIsInVzZUdsb2JhbENvbnRleHQiLCJ1c2VUIiwidXNlVXNlciIsInVzZVRhYlRhc2tEZWZhdWx0IiwiVEFTS19VUkxfUkVHRVhfUEFUVEVSTiIsIm1hcENPUkxhbmciLCJmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5IiwidXNlU2Vzc2lvbnNTdG9yZSIsImlzQWN0aXZlU2Vzc2lvblN0YXR1cyIsImdldENoYXRzU3RvcmVTdGF0ZSIsImhhc01lYW5pbmdmdWxVc2VySW5pdGlhbE1lc3NhZ2UiLCJ1c2VySW5pdGlhbE1lc3NhZ2UiLCJfdXNlckluaXRpYWxNZXNzYWdlJG0iLCJfdXNlckluaXRpYWxNZXNzYWdlJGEiLCJCb29sZWFuIiwibWVzc2FnZSIsInRyaW0iLCJhdHRhY2htZW50cyIsImxlbmd0aCIsImZ1YUlkIiwic2NJZCIsIm1hcmtPcGVuZWRTZXNzaW9uQXNSZWFkSWZWaXNpYmxlIiwic2Vzc2lvbklkIiwiX2dldENoYXRzU3RvcmVTdGF0ZSIsImlzQ2hhdFZpZXdWaXNpYmxlIiwiYWN0aXZlQ2hhdElkIiwibWFya0NoYXRBc1JlYWQiLCJidWlsZEluaXRpYWxNZXNzYWdlUGxhY2Vob2xkZXIiLCJjdXJyZW50VXNlciIsIl9vYmplY3RTcHJlYWQiLCJpZCIsImRhdGUiLCJEYXRlIiwidXNlciIsIm1lbnRpb25zIiwiY29udGV4dE1lc3NhZ2UiLCJyZXdyaXRlVGFza1VybHNJbkNvbnRlbnQiLCJjb250ZW50IiwidGFiU2VnbWVudCIsInRhc2tVcmxSZWdleCIsIlJlZ0V4cCIsInJlcGxhY2UiLCJ1cmwiLCJ1c2VDaGF0TWVzc2FnZXMiLCJfcmVmIiwiX3VzZXIkcGVybWlzc2lvbnMiLCJvbkVycm9yIiwiY2hhdElkIiwiX3JlZiRhZ2VudHMiLCJhZ2VudHMiLCJfdXNlVCIsInQiLCJpMThuIiwidXNlclBlcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJhaV9hZ2VudHMiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJsb2FkaW5nTWVzc2FnZXMiLCJzZXRMb2FkaW5nTWVzc2FnZXMiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsIm1lc3NhZ2VzIiwic2V0TWVzc2FnZXMiLCJfdXNlUHJvamVjdHMiLCJmZXRjaFByb2plY3RzIiwiX3VzZUdsb2JhbENvbnRleHQiLCJzZWxlY3RBZ2VudCIsInNldENoaXBzUHJvamVjdCIsInNldFByb2plY3QiLCJzZXRDbGllbnQiLCJzZXRUYXNrIiwicHJvamVjdCIsIl91c2VUYWJUYXNrRGVmYXVsdCIsImdldFRhYlRhc2tEZWZhdWx0IiwidGFiVGFza0RlZmF1bHQiLCJyZWZldGNoVGFiVGFza0RlZmF1bHQiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImlzTG9hZGluZ01vcmVNZXNzYWdlcyIsInNldElzTG9hZGluZ01vcmVNZXNzYWdlcyIsIl91c2VTdGF0ZTciLCJfdXNlU3RhdGU4IiwibGFzdEV2YWx1YXRlZEtleSIsInNldExhc3RFdmFsdWF0ZWRLZXkiLCJpc0xvYWRpbmdSZWYiLCJpbml0aWFsTG9hZERvbmUiLCJwcmV2aW91c0NoYXRJZCIsImxvYWRTZXFSZWYiLCJzeW5jTWVzc2FnZXNUb1N0b3JlIiwidGFyZ2V0Q2hhdElkIiwibmV4dE1lc3NhZ2VzIiwibGFzdEV2YWx1YXRlZEtleVZhbHVlIiwiZ2V0U3RhdGUiLCJ1bmRlZmluZWQiLCJwYXRjaFZpZXdDYWNoZSIsInNldENvbnZlcnNhdGlvbkNvbnRleHRGcm9tTWV0YWRhdGEiLCJfcmVmMyIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwiX3JlZjIiLCJwcm9qZWN0SWRNZXNzYWdlIiwicHJvamVjdE5hbWVGcm9tU2Vzc2lvbiIsImNsaWVudElkRnJvbVNlc3Npb24iLCJjbGllbnROYW1lRnJvbVNlc3Npb24iLCJ0YXNrSWRGcm9tU2Vzc2lvbiIsInRhc2tOYW1lRnJvbVNlc3Npb24iLCJwcm9qZWN0cyIsImhhc011bHRpQWdlbnRzQWNjZXNzIiwicHJvamVjdElkTnVtIiwiZm91bmRQcm9qZWN0IiwiX2ZvdW5kUHJvamVjdCRjbGllbnQiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsIm5hbWUiLCJOdW1iZXIiLCJhYnJ1cHQiLCJzZW50Iiwid2luZG93IiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyIsImZpbmQiLCJwIiwicHJvamVjdE5hbWUiLCJjbGllbnROYW1lIiwiY2xpZW50IiwicHJvamVjdElkIiwiU3RyaW5nIiwic3RvcCIsIl94IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJyZXN0b3JlU2Vzc2lvbkZyb21TdG9yZSIsIl9yZWY0IiwiX2NhbGxlZTIiLCJfY2FjaGUkbGFzdEV2YWx1YXRlZEsiLCJzZXNzaW9uc1N0b3JlIiwiY2FjaGVkTWVzc2FnZXMiLCJjYWNoZSIsIl9jb250ZXh0MiIsImdldE1lc3NhZ2VzIiwiZ2V0Vmlld0NhY2hlIiwiY3VycmVudCIsImFnZW50U25hcHNob3QiLCJjb252ZXJzYXRpb25NZXRhIiwic2Vzc2lvbk1ldGFFdmVudCIsImRvY3VtZW50IiwiZGlzcGF0Y2hFdmVudCIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwiX3gyIiwibG9hZE1lc3NhZ2VzIiwiX3JlZjUiLCJfY2FsbGVlMyIsIm9wdGlvbnMiLCJzZXEiLCJzZWxlY3RBZ2VudEZvclNlc3Npb24iLCJfeWllbGQkbWFpYSRDaGF0cyRnZXQiLCJpdGVtcyIsIm5leHRJdGVtIiwiYWdlbnREZWxldGVkIiwiYWdlbnROb1Blcm1pc3Npb24iLCJoYXNBZ2VudEFjY2VzcyIsImhhc0FnZW50UGVybWlzc2lvbiIsImFnZW50VHlwZUZyb21TZXNzaW9uIiwiYWdlbnRFbnRpdHlGcm9tU2Vzc2lvbiIsInByb2plY3REZWxldGVkIiwiYWdlbnRJbkxpc3QiLCJjb250ZXh0UHJvamVjdElkIiwiaXRlbXNUb1NldCIsInRhYiIsInNlc3Npb25NZXRhIiwiZmluYWxNZXNzYWdlcyIsInRhaWwiLCJleGlzdGluZ0lkcyIsImV4dHJhIiwicGFnaW5hdGlvbktleSIsIl90IiwiX2NvbnRleHQzIiwiZm9yY2UiLCJjYW5SZXN0b3JlU2Vzc2lvbiIsIkNoYXRzIiwiZ2V0Q2hhdE1lc3NhZ2VzIiwib2Zmc2V0IiwiY2FuY2VsbGVkVGV4dCIsImxhbmciLCJsYW5ndWFnZSIsImFnZW50VHlwZSIsImFnZW50RW50aXR5IiwiY2xpZW50SWQiLCJ0YXNrSWQiLCJ0YXNrTmFtZSIsImVtb2ppIiwidHlwZSIsImlzX2RlbGV0ZWQiLCJkZWxldGVkX2F0IiwiZGVsZXRlZEF0IiwiY29ubmVjdG9ycyIsInZpZXciLCJhZ2VudCIsImlzX2Zyb21fY29udmVyc2F0aW9uIiwicHJvamVjdF9kZWxldGVkIiwiYSIsImhhc19ub3RfYWNjZXNzIiwiaGFzX25vdF9wZXJtaXNzaW9ucyIsInBhcnNlSW50IiwiY29uY2F0IiwibWFwIiwiaXRlbSIsImdldE1ldGEiLCJzdGF0dXMiLCJTZXQiLCJmaWx0ZXIiLCJoYXMiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJzZXRWaWV3Q2FjaGUiLCJoeWRyYXRlZEZyb21BcGkiLCJmaW5pc2giLCJfeDMiLCJsb2FkTW9yZU1lc3NhZ2VzIiwiX3JlZjYiLCJfY2FsbGVlNCIsImNvbnRhaW5lciIsIm9sZFNjcm9sbFRvcCIsIl95aWVsZCRtYWlhJENoYXRzJGdldDIiLCJpdGVtc1RvTWVyZ2UiLCJuZXdNZXNzYWdlcyIsIl90MiIsIl9jb250ZXh0NCIsInNjcm9sbFRvcCIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImNvbnRhaW5lclJlZiIsIl94NCIsImhhbmRsZVNjcm9sbCIsInNjcm9sbEhlaWdodCIsImNsaWVudEhlaWdodCIsInNjcm9sbFBlcmNlbnRhZ2UiLCJjYW5SZXN0b3JlIiwicGVuZGluZ0luaXRpYWxNZXNzYWdlIiwiZXJyb3IiLCJjb25zb2xlIiwiZGlkUmV3cml0ZVJlZiIsIm5lZWRzUmV3cml0ZSIsInNvbWUiLCJtc2ciLCJtYXRjaGVzIiwibWF0Y2giLCJlbmRzV2l0aCIsImluY2x1ZGVzIiwicmV3cml0dGVuIiwibWVzc2FnZXNSZWYiLCJhcHBseU1lc3NhZ2VzIiwiYWRkTWVzc2FnZSIsImV4aXN0aW5nTWVzc2FnZUluZGV4IiwiZmluZEluZGV4IiwiaW5kZXgiLCJyZW1vdmVNZXNzYWdlIiwibWVzc2FnZUlkIiwiaGFzTW9yZU1lc3NhZ2VzIiwicmVwbGFjZU1lc3NhZ2VzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2hvb2tzL3VzZUNoYXRNZXNzYWdlcy91c2VDaGF0TWVzc2FnZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2luZGVudCAqL1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlUHJvamVjdHMgfSBmcm9tICcuLi91c2VQcm9qZWN0cydcbmltcG9ydCB7IENoYXRNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvQ2hhdCdcbmltcG9ydCB7IGJ1aWxkQ29udGV4dE1lc3NhZ2UgfSBmcm9tICcuLi8uLi90eXBlcy9jb250ZXh0TWVudGlvbidcbmltcG9ydCBtYWlhIGZyb20gJy4uLy4uL3NlcnZpY2VzL21haWEnXG5pbXBvcnQgeyBVc2VDaGF0TWVzc2FnZXNQcm9wcyB9IGZyb20gJy4vdXNlQ2hhdE1lc3NhZ2VzLmludGVyZmFjZSdcbmltcG9ydCB7IHVzZUdsb2JhbENvbnRleHQgfSBmcm9tICcuLi8uLi9jb250ZXh0L2dsb2JhbC1jb250ZXh0J1xuaW1wb3J0IHsgdXNlVCB9IGZyb20gJy4uL3VzZVQnXG5pbXBvcnQgeyB1c2VVc2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dC9jb3ItdXNlcidcbmltcG9ydCB7IHVzZVRhYlRhc2tEZWZhdWx0IH0gZnJvbSAnLi4vdXNlVGFiVGFza0RlZmF1bHQnXG5pbXBvcnQgeyBUQVNLX1VSTF9SRUdFWF9QQVRURVJOIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3Rhc2tVcmxzJ1xuaW1wb3J0IHsgbWFwQ09STGFuZyB9IGZyb20gJy4uLy4uL2xhbmcvdXRpbHMnXG5pbXBvcnQgeyBmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5IH0gZnJvbSAnLi4vLi4vdXRpbHMvZm9ybWF0UXVpY2tBY3Rpb25NZXNzYWdlJ1xuaW1wb3J0IHsgdXNlU2Vzc2lvbnNTdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3Nlc3Npb25zL3VzZVNlc3Npb25zU3RvcmUnXG5pbXBvcnQgeyBpc0FjdGl2ZVNlc3Npb25TdGF0dXMgfSBmcm9tICcuLi8uLi9zdG9yZS9zZXNzaW9ucy9zZXNzaW9ucy50eXBlcydcbmltcG9ydCB7IGdldENoYXRzU3RvcmVTdGF0ZSB9IGZyb20gJy4uLy4uL3N0b3JlL3VzZUNoYXRzU3RvcmUnXG5pbXBvcnQgdHlwZSB7IEFnZW50IH0gZnJvbSAnLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgdHlwZSB7IFNlc3Npb25Db252ZXJzYXRpb25NZXRhLCBTZXNzaW9uTWV0YUV2ZW50RGV0YWlsIH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvc2Vzc2lvbnMudHlwZXMnXG5cbnR5cGUgTG9hZE1lc3NhZ2VzT3B0aW9ucyA9IHtcbiAgLyoqIElnbm9yYSBjYWNoZSBlbiBtZW1vcmlhIHkgdnVlbHZlIGEgcGVkaXIgZ2V0Q2hhdE1lc3NhZ2VzLiAqL1xuICBmb3JjZT86IGJvb2xlYW5cbn1cblxudHlwZSBVc2VySW5pdGlhbE1lc3NhZ2UgPSBVc2VDaGF0TWVzc2FnZXNQcm9wc1sndXNlckluaXRpYWxNZXNzYWdlJ11cblxuLyoqIEVsIG1vZGFsIHVzYSBgeyBtZXNzYWdlOiAnJywgYXR0YWNobWVudHM6IFtdIH1gIGNvbW8gXCJzaW4gbWVuc2FqZSBpbmljaWFsXCI7IG5vIGVzIGZhbHN5LiAqL1xuY29uc3QgaGFzTWVhbmluZ2Z1bFVzZXJJbml0aWFsTWVzc2FnZSA9ICh1c2VySW5pdGlhbE1lc3NhZ2U/OiBVc2VySW5pdGlhbE1lc3NhZ2UpOiBib29sZWFuID0+XG4gIEJvb2xlYW4oXG4gICAgdXNlckluaXRpYWxNZXNzYWdlICYmXG4gICAgKHVzZXJJbml0aWFsTWVzc2FnZS5tZXNzYWdlPy50cmltKCkgfHxcbiAgICAgIHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cz8ubGVuZ3RoIHx8XG4gICAgICB1c2VySW5pdGlhbE1lc3NhZ2UuZnVhSWQgfHxcbiAgICAgIHVzZXJJbml0aWFsTWVzc2FnZS5zY0lkKVxuICApXG5cbi8qKiBNYXJjYSBsYSBzZXNpw7NuIGNvbW8gbGXDrWRhIGN1YW5kbyB0ZXJtaW7DsyBkZSBoaWRyYXRhcnNlIHkgc2lndWUgc2llbmRvIGxhIGFjdGl2YSB5IHZpc2libGUuICovXG5jb25zdCBtYXJrT3BlbmVkU2Vzc2lvbkFzUmVhZElmVmlzaWJsZSA9IChzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQgPT4ge1xuICBjb25zdCB7IGlzQ2hhdFZpZXdWaXNpYmxlLCBhY3RpdmVDaGF0SWQsIG1hcmtDaGF0QXNSZWFkIH0gPSBnZXRDaGF0c1N0b3JlU3RhdGUoKVxuICBpZiAoIWlzQ2hhdFZpZXdWaXNpYmxlIHx8IGFjdGl2ZUNoYXRJZCAhPT0gc2Vzc2lvbklkKSByZXR1cm5cbiAgbWFya0NoYXRBc1JlYWQoc2Vzc2lvbklkKVxufVxuXG5jb25zdCBidWlsZEluaXRpYWxNZXNzYWdlUGxhY2Vob2xkZXIgPSAoXG4gIHVzZXJJbml0aWFsTWVzc2FnZTogTm9uTnVsbGFibGU8VXNlckluaXRpYWxNZXNzYWdlPixcbiAgY3VycmVudFVzZXI6IFVzZUNoYXRNZXNzYWdlc1Byb3BzWydjdXJyZW50VXNlciddXG4pOiBDaGF0TWVzc2FnZVtdID0+IFtcbiAge1xuICAgIGlkOiAndXNlci1pbml0aWFsLW1lc3NhZ2UnLFxuICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgdXNlcjogY3VycmVudFVzZXIsXG4gICAgbWVzc2FnZTogZm9ybWF0UXVpY2tBY3Rpb25NZXNzYWdlRm9yRGlzcGxheSh1c2VySW5pdGlhbE1lc3NhZ2UubWVzc2FnZSwge1xuICAgICAgZnVhSWQ6IHVzZXJJbml0aWFsTWVzc2FnZS5mdWFJZCxcbiAgICAgIHNjSWQ6IHVzZXJJbml0aWFsTWVzc2FnZS5zY0lkLFxuICAgIH0pLFxuICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2UuYXR0YWNobWVudHMgPyB7IGF0dGFjaG1lbnRzOiB1c2VySW5pdGlhbE1lc3NhZ2UuYXR0YWNobWVudHMgfSA6IHt9KSxcbiAgICAuLi4oYnVpbGRDb250ZXh0TWVzc2FnZSh1c2VySW5pdGlhbE1lc3NhZ2UubWVudGlvbnMpXG4gICAgICA/IHsgY29udGV4dE1lc3NhZ2U6IGJ1aWxkQ29udGV4dE1lc3NhZ2UodXNlckluaXRpYWxNZXNzYWdlLm1lbnRpb25zKSB9XG4gICAgICA6IHt9KSxcbiAgfSxcbl1cblxuY29uc3QgcmV3cml0ZVRhc2tVcmxzSW5Db250ZW50ID0gKGNvbnRlbnQ6IHN0cmluZywgdGFiU2VnbWVudDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdGFza1VybFJlZ2V4ID0gbmV3IFJlZ0V4cChUQVNLX1VSTF9SRUdFWF9QQVRURVJOLCAnZycpXG4gIHJldHVybiBjb250ZW50LnJlcGxhY2UodGFza1VybFJlZ2V4LCB1cmwgPT5cbiAgICB1cmwucmVwbGFjZSgvXFwvKGRldGFpbHxtZXNzYWdlfG1lc3NhZ2VzfGZpbGVzfGhpc3Rvcnl8aG91cnMpKD89JHxcXD8pLywgdGFiU2VnbWVudClcbiAgKVxufVxuXG5leHBvcnQgY29uc3QgdXNlQ2hhdE1lc3NhZ2VzID0gKHtcbiAgb25FcnJvcixcbiAgY2hhdElkLFxuICBjdXJyZW50VXNlcixcbiAgdXNlckluaXRpYWxNZXNzYWdlLFxuICBhZ2VudHMgPSBbXSxcbn06IFVzZUNoYXRNZXNzYWdlc1Byb3BzKSA9PiB7XG4gIGNvbnN0IHsgdCwgaTE4biB9ID0gdXNlVCgpXG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3QgdXNlclBlcm1pc3Npb25zID0gdXNlcj8ucGVybWlzc2lvbnM/LmFpX2FnZW50c1xuICBjb25zdCBbbG9hZGluZ01lc3NhZ2VzLCBzZXRMb2FkaW5nTWVzc2FnZXNdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFttZXNzYWdlcywgc2V0TWVzc2FnZXNdID0gdXNlU3RhdGU8Q2hhdE1lc3NhZ2VbXT4oKCkgPT5cbiAgICBoYXNNZWFuaW5nZnVsVXNlckluaXRpYWxNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZSkgJiYgdXNlckluaXRpYWxNZXNzYWdlXG4gICAgICA/IGJ1aWxkSW5pdGlhbE1lc3NhZ2VQbGFjZWhvbGRlcih1c2VySW5pdGlhbE1lc3NhZ2UsIGN1cnJlbnRVc2VyKVxuICAgICAgOiBbXVxuICApXG4gIGNvbnN0IHsgZmV0Y2hQcm9qZWN0cyB9ID0gdXNlUHJvamVjdHMoKVxuICBjb25zdCB7IHNlbGVjdEFnZW50LCBzZXRDaGlwc1Byb2plY3QsIHNldFByb2plY3QsIHNldENsaWVudCwgc2V0VGFzaywgcHJvamVjdCB9ID0gdXNlR2xvYmFsQ29udGV4dCgpXG4gIGNvbnN0IHsgZ2V0VGFiVGFza0RlZmF1bHQsIHRhYlRhc2tEZWZhdWx0LCByZWZldGNoVGFiVGFza0RlZmF1bHQgfSA9IHVzZVRhYlRhc2tEZWZhdWx0KClcbiAgY29uc3QgW2lzTG9hZGluZ01vcmVNZXNzYWdlcywgc2V0SXNMb2FkaW5nTW9yZU1lc3NhZ2VzXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbbGFzdEV2YWx1YXRlZEtleSwgc2V0TGFzdEV2YWx1YXRlZEtleV0gPSB1c2VTdGF0ZTxudW1iZXIgfCB1bmRlZmluZWQ+KDApXG4gIGNvbnN0IGlzTG9hZGluZ1JlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgaW5pdGlhbExvYWREb25lID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBwcmV2aW91c0NoYXRJZCA9IHVzZVJlZihjaGF0SWQpXG4gIGNvbnN0IGxvYWRTZXFSZWYgPSB1c2VSZWYoMClcblxuICBjb25zdCBzeW5jTWVzc2FnZXNUb1N0b3JlID0gdXNlQ2FsbGJhY2soXG4gICAgKHRhcmdldENoYXRJZDogc3RyaW5nLCBuZXh0TWVzc2FnZXM6IENoYXRNZXNzYWdlW10sIGxhc3RFdmFsdWF0ZWRLZXlWYWx1ZT86IG51bWJlcikgPT4ge1xuICAgICAgdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLnNldE1lc3NhZ2VzKHRhcmdldENoYXRJZCwgbmV4dE1lc3NhZ2VzKVxuICAgICAgaWYgKGxhc3RFdmFsdWF0ZWRLZXlWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5wYXRjaFZpZXdDYWNoZSh0YXJnZXRDaGF0SWQsIHsgbGFzdEV2YWx1YXRlZEtleTogbGFzdEV2YWx1YXRlZEtleVZhbHVlIH0pXG4gICAgICB9XG4gICAgfSxcbiAgICBbXVxuICApXG5cbiAgY29uc3Qgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YSA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jICh7XG4gICAgICBwcm9qZWN0SWRNZXNzYWdlLFxuICAgICAgcHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgIGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICBjbGllbnROYW1lRnJvbVNlc3Npb24sXG4gICAgICB0YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgIHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgfToge1xuICAgICAgcHJvamVjdElkTWVzc2FnZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZFxuICAgICAgcHJvamVjdE5hbWVGcm9tU2Vzc2lvbjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxuICAgICAgY2xpZW50SWRGcm9tU2Vzc2lvbjogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZFxuICAgICAgY2xpZW50TmFtZUZyb21TZXNzaW9uOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgICB0YXNrSWRGcm9tU2Vzc2lvbjogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZFxuICAgICAgdGFza05hbWVGcm9tU2Vzc2lvbjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxuICAgIH0pID0+IHtcbiAgICAgIC8vIFRhcmVhIGRlIGxhIGNvbnZlcnNhY2nDs246IHNlIGRlcml2YSBkZSBsYSBtZXRhZGF0YSBkZSBsYSBzZXNzaW9uIHBhcmEgbW9zdHJhciBlbCBjaGlwXG4gICAgICAvLyBkZSBsYSB0YXJlYSAoeSByZWVudmlhciBsYSBtZXRhZGF0YSBlbiBjYWRhIG1lbnNhamUpIHNpbiBpbXBvcnRhciBkZXNkZSBkw7NuZGUgc2UgYWJyYS5cbiAgICAgIGlmICh0YXNrSWRGcm9tU2Vzc2lvbiAhPSBudWxsICYmIHRhc2tOYW1lRnJvbVNlc3Npb24pIHtcbiAgICAgICAgc2V0VGFzayh7IGlkOiB0YXNrSWRGcm9tU2Vzc2lvbiwgbmFtZTogdGFza05hbWVGcm9tU2Vzc2lvbiB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0VGFzayhudWxsKVxuICAgICAgfVxuXG4gICAgICAvLyBDb252ZXJzYWNpw7NuIGNvbiBjbGllbnRfbWV0YWRhdGE6IHNldGVhciBjbGllbnRlIHkgbGltcGlhciBwcm95ZWN0b1xuICAgICAgaWYgKGNsaWVudElkRnJvbVNlc3Npb24gIT0gbnVsbCAmJiBjbGllbnROYW1lRnJvbVNlc3Npb24pIHtcbiAgICAgICAgc2V0Q2xpZW50KHsgaWQ6IE51bWJlcihjbGllbnRJZEZyb21TZXNzaW9uKSwgbmFtZTogY2xpZW50TmFtZUZyb21TZXNzaW9uIH0pXG4gICAgICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZldGNoUHJvamVjdHMocHJvamVjdElkTWVzc2FnZSlcbiAgICAgIGNvbnN0IGhhc011bHRpQWdlbnRzQWNjZXNzID0gISF3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UU1xuXG4gICAgICBpZiAocHJvamVjdElkTWVzc2FnZSAmJiBoYXNNdWx0aUFnZW50c0FjY2Vzcykge1xuICAgICAgICBjb25zdCBwcm9qZWN0SWROdW0gPSBOdW1iZXIocHJvamVjdElkTWVzc2FnZSlcbiAgICAgICAgY29uc3QgZm91bmRQcm9qZWN0ID0gcHJvamVjdHM/LmZpbmQocCA9PiBOdW1iZXIocC5pZCkgPT09IHByb2plY3RJZE51bSlcblxuICAgICAgICBpZiAoZm91bmRQcm9qZWN0KSB7XG4gICAgICAgICAgc2V0Q2hpcHNQcm9qZWN0KHtcbiAgICAgICAgICAgIHByb2plY3ROYW1lOiBmb3VuZFByb2plY3QubmFtZSxcbiAgICAgICAgICAgIGNsaWVudE5hbWU6IGZvdW5kUHJvamVjdC5jbGllbnQ/Lm5hbWUgfHwgJycsXG4gICAgICAgICAgICBwcm9qZWN0SWQ6IFN0cmluZyhmb3VuZFByb2plY3QuaWQpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgc2V0UHJvamVjdChmb3VuZFByb2plY3QpXG4gICAgICAgIH0gZWxzZSBpZiAocHJvamVjdE5hbWVGcm9tU2Vzc2lvbikge1xuICAgICAgICAgIHNldENoaXBzUHJvamVjdCh7XG4gICAgICAgICAgICBwcm9qZWN0TmFtZTogcHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICAgIGNsaWVudE5hbWU6ICcnLFxuICAgICAgICAgICAgcHJvamVjdElkOiBTdHJpbmcocHJvamVjdElkTWVzc2FnZSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBzZXRQcm9qZWN0KHsgaWQ6IHByb2plY3RJZE51bSwgbmFtZTogcHJvamVjdE5hbWVGcm9tU2Vzc2lvbiB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgICAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgICAgfVxuXG4gICAgICAgIHNldENsaWVudD8uKG51bGwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2ZldGNoUHJvamVjdHMsIHNldENsaWVudCwgc2V0Q2hpcHNQcm9qZWN0LCBzZXRQcm9qZWN0LCBzZXRUYXNrXVxuICApXG5cbiAgY29uc3QgcmVzdG9yZVNlc3Npb25Gcm9tU3RvcmUgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAodGFyZ2V0Q2hhdElkOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb25zU3RvcmUgPSB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKClcbiAgICAgIGNvbnN0IGNhY2hlZE1lc3NhZ2VzID0gc2Vzc2lvbnNTdG9yZS5nZXRNZXNzYWdlcyh0YXJnZXRDaGF0SWQpXG4gICAgICBjb25zdCBjYWNoZSA9IHNlc3Npb25zU3RvcmUuZ2V0Vmlld0NhY2hlKHRhcmdldENoYXRJZClcblxuICAgICAgc2V0TWVzc2FnZXMoY2FjaGVkTWVzc2FnZXMpXG4gICAgICBzZXRMYXN0RXZhbHVhdGVkS2V5KGNhY2hlPy5sYXN0RXZhbHVhdGVkS2V5ID8/IDApXG4gICAgICBpbml0aWFsTG9hZERvbmUuY3VycmVudCA9IHRydWVcblxuICAgICAgaWYgKGNhY2hlPy5hZ2VudFNuYXBzaG90KSB7XG4gICAgICAgIHNlbGVjdEFnZW50KGNhY2hlLmFnZW50U25hcHNob3QpXG4gICAgICB9XG5cbiAgICAgIGlmIChjYWNoZT8uY29udmVyc2F0aW9uTWV0YSkge1xuICAgICAgICBhd2FpdCBzZXRDb252ZXJzYXRpb25Db250ZXh0RnJvbU1ldGFkYXRhKHtcbiAgICAgICAgICBwcm9qZWN0SWRNZXNzYWdlOiBjYWNoZS5jb252ZXJzYXRpb25NZXRhLnByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWVGcm9tU2Vzc2lvbjogY2FjaGUuY29udmVyc2F0aW9uTWV0YS5wcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudElkRnJvbVNlc3Npb246IGNhY2hlLmNvbnZlcnNhdGlvbk1ldGEuY2xpZW50SWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnROYW1lRnJvbVNlc3Npb246IGNhY2hlLmNvbnZlcnNhdGlvbk1ldGEuY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tJZEZyb21TZXNzaW9uOiBjYWNoZS5jb252ZXJzYXRpb25NZXRhLnRhc2tJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tOYW1lRnJvbVNlc3Npb246IGNhY2hlLmNvbnZlcnNhdGlvbk1ldGEudGFza05hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGNhY2hlPy5zZXNzaW9uTWV0YUV2ZW50KSB7XG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdtYWlhLWNoYXQtc2Vzc2lvbi1tZXRhJywge1xuICAgICAgICAgICAgZGV0YWlsOiBjYWNoZS5zZXNzaW9uTWV0YUV2ZW50LFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgbWFya09wZW5lZFNlc3Npb25Bc1JlYWRJZlZpc2libGUodGFyZ2V0Q2hhdElkKVxuICAgIH0sXG4gICAgW3NlbGVjdEFnZW50LCBzZXRDb252ZXJzYXRpb25Db250ZXh0RnJvbU1ldGFkYXRhXVxuICApXG5cbiAgY29uc3QgbG9hZE1lc3NhZ2VzID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKG9wdGlvbnM/OiBMb2FkTWVzc2FnZXNPcHRpb25zKSA9PiB7XG4gICAgICBpZiAoIW9wdGlvbnM/LmZvcmNlICYmIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5jYW5SZXN0b3JlU2Vzc2lvbihjaGF0SWQpKSB7XG4gICAgICAgIGF3YWl0IHJlc3RvcmVTZXNzaW9uRnJvbVN0b3JlKGNoYXRJZClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGxvYWRTZXFSZWYuY3VycmVudCArPSAxXG4gICAgICBjb25zdCBzZXEgPSBsb2FkU2VxUmVmLmN1cnJlbnRcbiAgICAgIGNvbnN0IHRhcmdldENoYXRJZCA9IGNoYXRJZFxuXG4gICAgICB0cnkge1xuICAgICAgICBzZXRMb2FkaW5nTWVzc2FnZXModHJ1ZSlcbiAgICAgICAgaW5pdGlhbExvYWREb25lLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICBsZXQgYWdlbnRTbmFwc2hvdDogQWdlbnQgfCBudWxsID0gbnVsbFxuICAgICAgICBjb25zdCBzZWxlY3RBZ2VudEZvclNlc3Npb24gPSAobmV4dDogQWdlbnQpID0+IHtcbiAgICAgICAgICBzZWxlY3RBZ2VudChuZXh0KVxuICAgICAgICAgIGFnZW50U25hcHNob3QgPSBuZXh0XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGl0ZW1zLFxuICAgICAgICAgIG5leHRJdGVtLFxuICAgICAgICAgIGFnZW50RGVsZXRlZCxcbiAgICAgICAgICBhZ2VudE5vUGVybWlzc2lvbixcbiAgICAgICAgICBoYXNBZ2VudEFjY2VzcyxcbiAgICAgICAgICBoYXNBZ2VudFBlcm1pc3Npb24sXG4gICAgICAgICAgYWdlbnRUeXBlOiBhZ2VudFR5cGVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBhZ2VudEVudGl0eTogYWdlbnRFbnRpdHlGcm9tU2Vzc2lvbixcbiAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWU6IHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgcHJvamVjdERlbGV0ZWQsXG4gICAgICAgICAgY2xpZW50SWQ6IGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZTogY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tJZDogdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza05hbWU6IHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH0gPSBhd2FpdCBtYWlhLkNoYXRzLmdldENoYXRNZXNzYWdlcyh7XG4gICAgICAgICAgY2hhdElkOiB0YXJnZXRDaGF0SWQsXG4gICAgICAgICAgY3VycmVudFVzZXIsXG4gICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgIGNhbmNlbGxlZFRleHQ6IHQoJ2NoYXQuY2FuY2VsbGVkJyksXG4gICAgICAgICAgbGFuZzogbWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKSxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoc2VxICE9PSBsb2FkU2VxUmVmLmN1cnJlbnQgfHwgdGFyZ2V0Q2hhdElkICE9PSBjaGF0SWQpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhZ2VudERlbGV0ZWQpIHtcbiAgICAgICAgICBzZWxlY3RBZ2VudEZvclNlc3Npb24oe1xuICAgICAgICAgICAgaWQ6IGFnZW50RGVsZXRlZC5pZCxcbiAgICAgICAgICAgIG5hbWU6IGFnZW50RGVsZXRlZC5uYW1lLFxuICAgICAgICAgICAgZW1vamk6IGFnZW50RGVsZXRlZC5lbW9qaSxcbiAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxuICAgICAgICAgICAgaXNfZGVsZXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZWRfYXQ6IGFnZW50RGVsZXRlZC5kZWxldGVkQXQsXG4gICAgICAgICAgICAuLi4oYWdlbnROb1Blcm1pc3Npb24/LmNvbm5lY3RvcnMgPyB7IGNvbm5lY3RvcnM6IGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgfSA6IHt9KSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2kgZWwgYWdlbnRlIG5vIGVzdMOhIGVuIGxhIGxpc3RhIHBlcm8gdGllbmUgcGVybWlzb3MsIGFjY2VzbyB5IG5vIGVzdMOhIGVsaW1pbmFkbywgc2V0ZWFybG8gbm9ybWFsbWVudGVcbiAgICAgICAgLy8gRXhjbHVpciBhZ2VudGVzIG5vLWN1c3RvbSBwYXJhIHVzdWFyaW9zIGNvbiByb2xlcyBkZXNoYWJpbGl0YWRvc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgYWdlbnROb1Blcm1pc3Npb24gJiZcbiAgICAgICAgICAhYWdlbnREZWxldGVkICYmXG4gICAgICAgICAgdXNlclBlcm1pc3Npb25zPy52aWV3ICYmXG4gICAgICAgICAgaGFzQWdlbnRBY2Nlc3MgJiZcbiAgICAgICAgICBoYXNBZ2VudFBlcm1pc3Npb24gJiZcbiAgICAgICAgICAhYWdlbnRzLmZpbmQoYWdlbnQgPT4gYWdlbnQuaWQgPT09IGFnZW50Tm9QZXJtaXNzaW9uLmlkKVxuICAgICAgICApIHtcbiAgICAgICAgICBzZWxlY3RBZ2VudEZvclNlc3Npb24oe1xuICAgICAgICAgICAgaWQ6IGFnZW50Tm9QZXJtaXNzaW9uLmlkLFxuICAgICAgICAgICAgbmFtZTogYWdlbnROb1Blcm1pc3Npb24ubmFtZSxcbiAgICAgICAgICAgIGVtb2ppOiBhZ2VudE5vUGVybWlzc2lvbi5lbW9qaSxcbiAgICAgICAgICAgIHR5cGU6IGFnZW50Tm9QZXJtaXNzaW9uLnR5cGUgYXMgJ3BtJyB8ICdjdXN0b20nIHwgJ2Nsb25lJyB8ICdvcmNoZXN0cmF0b3InLFxuICAgICAgICAgICAgaXNfZnJvbV9jb252ZXJzYXRpb246IHRydWUsXG4gICAgICAgICAgICAuLi4oYWdlbnROb1Blcm1pc3Npb24uY29ubmVjdG9ycyA/IHsgY29ubmVjdG9yczogYWdlbnROb1Blcm1pc3Npb24uY29ubmVjdG9ycyB9IDoge30pLFxuICAgICAgICAgICAgLi4uKHByb2plY3REZWxldGVkID8geyBwcm9qZWN0X2RlbGV0ZWQ6IHsgbmFtZTogcHJvamVjdERlbGV0ZWQubmFtZSB9IH0gOiB7fSksXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNpIGVsIGFnZW50ZSBlc3TDoSBlbiBsYSBsaXN0YSB5IHRpZW5lIGFjY2Vzby9wZXJtaXNvcywgYWN0dWFsaXphciBwcm9qZWN0X2RlbGV0ZWQgKG8gbGltcGlhcmxvIGFsIGNhbWJpYXIgZGUgY2hhdClcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGFnZW50Tm9QZXJtaXNzaW9uICYmXG4gICAgICAgICAgIWFnZW50RGVsZXRlZCAmJlxuICAgICAgICAgIGhhc0FnZW50QWNjZXNzICYmXG4gICAgICAgICAgaGFzQWdlbnRQZXJtaXNzaW9uICYmXG4gICAgICAgICAgYWdlbnRzLmZpbmQoYSA9PiBhLmlkID09PSBhZ2VudE5vUGVybWlzc2lvbi5pZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgYWdlbnRJbkxpc3QgPSBhZ2VudHMuZmluZChhID0+IGEuaWQgPT09IGFnZW50Tm9QZXJtaXNzaW9uLmlkKVxuICAgICAgICAgIGlmIChhZ2VudEluTGlzdCkge1xuICAgICAgICAgICAgc2VsZWN0QWdlbnRGb3JTZXNzaW9uKHtcbiAgICAgICAgICAgICAgLi4uYWdlbnRJbkxpc3QsXG4gICAgICAgICAgICAgIC4uLihhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzID8geyBjb25uZWN0b3JzOiBhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzIH0gOiB7fSksXG4gICAgICAgICAgICAgIC4uLihwcm9qZWN0RGVsZXRlZCA/IHsgcHJvamVjdF9kZWxldGVkOiB7IG5hbWU6IHByb2plY3REZWxldGVkLm5hbWUgfSB9IDogeyBwcm9qZWN0X2RlbGV0ZWQ6IHVuZGVmaW5lZCB9KSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2kgZWwgYWdlbnRlIG5vIHRpZW5lIGFjY2VzbyBvIHBlcm1pc29zIHNlZ8O6biBsYSByZXNwdWVzdGEgZGUgc2Vzc2lvbnMsIHNlbGVjY2lvbmFybG8gY29uIGVsIGZsYWcgY29ycmVzcG9uZGllbnRlXG4gICAgICAgIC8vIExhIHZhbGlkYWNpw7NuIGFob3JhIHNlIGJhc2EgZW4gbGFzIHByb3BpZWRhZGVzIGhhc19hZ2VudF9hY2Nlc3MgeSBoYXNfYWdlbnRfcGVybWlzc2lvbiBkZSBsYSByZXNwdWVzdGFcbiAgICAgICAgaWYgKGFnZW50Tm9QZXJtaXNzaW9uICYmICFhZ2VudERlbGV0ZWQpIHtcbiAgICAgICAgICBpZiAoIWhhc0FnZW50QWNjZXNzKSB7XG4gICAgICAgICAgICAvLyBDYXNvIDE6IE5vIHRpZW5lIGFjY2VzbyBhbCBhZ2VudGVcbiAgICAgICAgICAgIHNlbGVjdEFnZW50Rm9yU2Vzc2lvbih7XG4gICAgICAgICAgICAgIGlkOiBhZ2VudE5vUGVybWlzc2lvbi5pZCxcbiAgICAgICAgICAgICAgbmFtZTogYWdlbnROb1Blcm1pc3Npb24ubmFtZSxcbiAgICAgICAgICAgICAgZW1vamk6IGFnZW50Tm9QZXJtaXNzaW9uLmVtb2ppLFxuICAgICAgICAgICAgICB0eXBlOiBhZ2VudE5vUGVybWlzc2lvbi50eXBlIGFzICdwbScgfCAnY3VzdG9tJyB8ICdjbG9uZScgfCAnb3JjaGVzdHJhdG9yJyxcbiAgICAgICAgICAgICAgaGFzX25vdF9hY2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgIC4uLihhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzID8geyBjb25uZWN0b3JzOiBhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzIH0gOiB7fSksXG4gICAgICAgICAgICAgIC4uLihwcm9qZWN0RGVsZXRlZCA/IHsgcHJvamVjdF9kZWxldGVkOiB7IG5hbWU6IHByb2plY3REZWxldGVkLm5hbWUgfSB9IDoge30pLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2UgaWYgKCFoYXNBZ2VudFBlcm1pc3Npb24pIHtcbiAgICAgICAgICAgIC8vIENhc28gMjogTm8gdGllbmUgcGVybWlzb3MgcGFyYSB2aXN1YWxpemFyL2ludGVyYWN0dWFyIGNvbiBlbCBhZ2VudGVcbiAgICAgICAgICAgIHNlbGVjdEFnZW50Rm9yU2Vzc2lvbih7XG4gICAgICAgICAgICAgIGlkOiBhZ2VudE5vUGVybWlzc2lvbi5pZCxcbiAgICAgICAgICAgICAgbmFtZTogYWdlbnROb1Blcm1pc3Npb24ubmFtZSxcbiAgICAgICAgICAgICAgZW1vamk6IGFnZW50Tm9QZXJtaXNzaW9uLmVtb2ppLFxuICAgICAgICAgICAgICB0eXBlOiBhZ2VudE5vUGVybWlzc2lvbi50eXBlIGFzICdwbScgfCAnY3VzdG9tJyB8ICdjbG9uZScgfCAnb3JjaGVzdHJhdG9yJyxcbiAgICAgICAgICAgICAgaGFzX25vdF9wZXJtaXNzaW9uczogdHJ1ZSxcbiAgICAgICAgICAgICAgLi4uKGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgPyB7IGNvbm5lY3RvcnM6IGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgfSA6IHt9KSxcbiAgICAgICAgICAgICAgLi4uKHByb2plY3REZWxldGVkID8geyBwcm9qZWN0X2RlbGV0ZWQ6IHsgbmFtZTogcHJvamVjdERlbGV0ZWQubmFtZSB9IH0gOiB7fSksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSBpZiAocHJvamVjdERlbGV0ZWQpIHtcbiAgICAgICAgICAgIC8vIENhc28gMzogRWwgcHJveWVjdG8gZGUgbGEgY29udmVyc2FjacOzbiBmdWUgZWxpbWluYWRvXG4gICAgICAgICAgICBzZWxlY3RBZ2VudEZvclNlc3Npb24oe1xuICAgICAgICAgICAgICBpZDogYWdlbnROb1Blcm1pc3Npb24uaWQsXG4gICAgICAgICAgICAgIG5hbWU6IGFnZW50Tm9QZXJtaXNzaW9uLm5hbWUsXG4gICAgICAgICAgICAgIGVtb2ppOiBhZ2VudE5vUGVybWlzc2lvbi5lbW9qaSxcbiAgICAgICAgICAgICAgdHlwZTogYWdlbnROb1Blcm1pc3Npb24udHlwZSBhcyAncG0nIHwgJ2N1c3RvbScgfCAnY2xvbmUnIHwgJ29yY2hlc3RyYXRvcicsXG4gICAgICAgICAgICAgIC4uLihhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzID8geyBjb25uZWN0b3JzOiBhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzIH0gOiB7fSksXG4gICAgICAgICAgICAgIHByb2plY3RfZGVsZXRlZDogeyBuYW1lOiBwcm9qZWN0RGVsZXRlZC5uYW1lIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHNldENvbnZlcnNhdGlvbkNvbnRleHRGcm9tTWV0YWRhdGEoe1xuICAgICAgICAgIHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnRJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrTmFtZUZyb21TZXNzaW9uLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIE1ldGFkYXRhIGRlIGxhIHNlc3Npb24gKGFnZW50X3R5cGUgLyBhZ2VudF9lbnRpdHkgKyBjb250ZXh0bykgcGFyYSBlbCBjYXJ0ZWwgZGVcbiAgICAgICAgLy8gXCJjb250aW51YXIgZW4gdW4gY2hhdCBudWV2b1wiIGRlbCBmb290ZXIgY3VhbmRvIHNlIGFicmUgdW5hIGNvbnZlcnNhY2nDs24gZGUgdW4gY2xvbmUgbGVnYWN5LlxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnbWFpYS1jaGF0LXNlc3Npb24tbWV0YScsIHtcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICBjaGF0SWQsXG4gICAgICAgICAgICAgIGFnZW50VHlwZTogYWdlbnRUeXBlRnJvbVNlc3Npb24sXG4gICAgICAgICAgICAgIGFnZW50RW50aXR5OiBhZ2VudEVudGl0eUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgICAgIHByb2plY3ROYW1lOiBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgICBjbGllbnRJZDogY2xpZW50SWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICAgICAgY2xpZW50TmFtZTogY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgICB0YXNrSWQ6IHRhc2tJZEZyb21TZXNzaW9uLFxuICAgICAgICAgICAgICB0YXNrTmFtZTogdGFza05hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuXG4gICAgICAgIC8vIFNpIGhheSBwcm95ZWN0byBlbiBsYSBjb252ZXJzYWNpw7NuLCByZWVzY3JpYmlyIFVSTHMgZGUgdGFyZWFzIGNvbiBlbCB0YWIgZGVsIHVzdWFyaW8gKG1lKVxuICAgICAgICBjb25zdCBjb250ZXh0UHJvamVjdElkID0gcHJvamVjdElkTWVzc2FnZSA/IHBhcnNlSW50KFN0cmluZyhwcm9qZWN0SWRNZXNzYWdlKSwgMTApIDogbnVsbFxuICAgICAgICBsZXQgaXRlbXNUb1NldCA9IGl0ZW1zXG4gICAgICAgIGlmIChjb250ZXh0UHJvamVjdElkKSB7XG4gICAgICAgICAgY29uc3QgdGFiID0gYXdhaXQgZ2V0VGFiVGFza0RlZmF1bHQoMSlcbiAgICAgICAgICBjb25zdCB0YWJTZWdtZW50ID0gdGFiID8gYC8ke3RhYn1gIDogJy9kZXRhaWwnXG4gICAgICAgICAgaXRlbXNUb1NldCA9IGl0ZW1zLm1hcChpdGVtID0+ICh7XG4gICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgbWVzc2FnZTogcmV3cml0ZVRhc2tVcmxzSW5Db250ZW50KGl0ZW0ubWVzc2FnZSB8fCAnJywgdGFiU2VnbWVudCksXG4gICAgICAgICAgfSkpXG4gICAgICAgIH1cbiAgICAgICAgLy8gU2kgbGEgc2VzacOzbiBzaWd1ZSBnZW5lcmFuZG8gKHN0cmVhbSBlbiBiYWNrZ3JvdW5kKSwgcmVjb25zdHJ1aW1vcyBlbFxuICAgICAgICAvLyB0YWlsIGVuIHZ1ZWxvIChwcmVndW50YSArIHBsYWNlaG9sZGVyKSBxdWUgYcO6biBubyBlc3TDoSBwZXJzaXN0aWRvIGVuIGVsXG4gICAgICAgIC8vIGJhY2tlbmQsIG1lcmdlw6FuZG9sbyBhbCBoaXN0b3JpYWwgY2FyZ2FkbyBzaW4gZHVwbGljYXIgcG9yIGlkLlxuICAgICAgICBjb25zdCBzZXNzaW9uTWV0YSA9IHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5nZXRNZXRhKGNoYXRJZClcbiAgICAgICAgbGV0IGZpbmFsTWVzc2FnZXMgPSBpdGVtc1RvU2V0XG4gICAgICAgIGlmIChzZXNzaW9uTWV0YSAmJiBpc0FjdGl2ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbk1ldGEuc3RhdHVzKSkge1xuICAgICAgICAgIGNvbnN0IHRhaWwgPSB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuZ2V0TWVzc2FnZXMoY2hhdElkKVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChpdGVtc1RvU2V0Lm1hcChpdGVtID0+IGl0ZW0uaWQpKVxuICAgICAgICAgIGNvbnN0IGV4dHJhID0gdGFpbC5maWx0ZXIoaXRlbSA9PiAhZXhpc3RpbmdJZHMuaGFzKGl0ZW0uaWQpKVxuICAgICAgICAgIGlmIChleHRyYS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZpbmFsTWVzc2FnZXMgPSBbLi4uaXRlbXNUb1NldCwgLi4uZXh0cmFdXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udmVyc2F0aW9uTWV0YTogU2Vzc2lvbkNvbnZlcnNhdGlvbk1ldGEgPSB7XG4gICAgICAgICAgcHJvamVjdElkTWVzc2FnZSxcbiAgICAgICAgICBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXNzaW9uTWV0YUV2ZW50OiBTZXNzaW9uTWV0YUV2ZW50RGV0YWlsID0ge1xuICAgICAgICAgIGNoYXRJZCxcbiAgICAgICAgICBhZ2VudFR5cGU6IGFnZW50VHlwZUZyb21TZXNzaW9uLFxuICAgICAgICAgIGFnZW50RW50aXR5OiBhZ2VudEVudGl0eUZyb21TZXNzaW9uLFxuICAgICAgICAgIHByb2plY3RJZDogcHJvamVjdElkTWVzc2FnZSxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogcHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnRJZDogY2xpZW50SWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnROYW1lOiBjbGllbnROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza0lkOiB0YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrTmFtZTogdGFza05hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgfVxuXG4gICAgICAgIHNldE1lc3NhZ2VzKGZpbmFsTWVzc2FnZXMpXG4gICAgICAgIGNvbnN0IHBhZ2luYXRpb25LZXkgPSBOdW1iZXIobmV4dEl0ZW0pXG4gICAgICAgIHNldExhc3RFdmFsdWF0ZWRLZXkocGFnaW5hdGlvbktleSlcbiAgICAgICAgaW5pdGlhbExvYWREb25lLmN1cnJlbnQgPSB0cnVlXG5cbiAgICAgICAgdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLnNldE1lc3NhZ2VzKHRhcmdldENoYXRJZCwgZmluYWxNZXNzYWdlcylcbiAgICAgICAgdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLnNldFZpZXdDYWNoZSh0YXJnZXRDaGF0SWQsIHtcbiAgICAgICAgICBoeWRyYXRlZEZyb21BcGk6IHRydWUsXG4gICAgICAgICAgbGFzdEV2YWx1YXRlZEtleTogcGFnaW5hdGlvbktleSxcbiAgICAgICAgICBjb252ZXJzYXRpb25NZXRhLFxuICAgICAgICAgIHNlc3Npb25NZXRhRXZlbnQsXG4gICAgICAgICAgYWdlbnRTbmFwc2hvdCxcbiAgICAgICAgfSlcblxuICAgICAgICBtYXJrT3BlbmVkU2Vzc2lvbkFzUmVhZElmVmlzaWJsZSh0YXJnZXRDaGF0SWQpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoc2VxID09PSBsb2FkU2VxUmVmLmN1cnJlbnQgJiYgdGFyZ2V0Q2hhdElkID09PSBjaGF0SWQpIHtcbiAgICAgICAgICBvbkVycm9yPy4oKVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoc2VxID09PSBsb2FkU2VxUmVmLmN1cnJlbnQgJiYgdGFyZ2V0Q2hhdElkID09PSBjaGF0SWQpIHtcbiAgICAgICAgICBzZXRMb2FkaW5nTWVzc2FnZXMoZmFsc2UpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIGNoYXRJZCxcbiAgICAgIGN1cnJlbnRVc2VyLFxuICAgICAgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YSxcbiAgICAgIG9uRXJyb3IsXG4gICAgICBnZXRUYWJUYXNrRGVmYXVsdCxcbiAgICAgIHJlc3RvcmVTZXNzaW9uRnJvbVN0b3JlLFxuICAgICAgc2VsZWN0QWdlbnQsXG4gICAgICBhZ2VudHMsXG4gICAgICB0LFxuICAgICAgaTE4bi5sYW5ndWFnZSxcbiAgICAgIHVzZXJQZXJtaXNzaW9ucz8udmlldyxcbiAgICBdXG4gIClcblxuICBjb25zdCBsb2FkTW9yZU1lc3NhZ2VzID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgfCBudWxsKSA9PiB7XG4gICAgICBpZiAoaXNMb2FkaW5nUmVmLmN1cnJlbnQgfHwgIWxhc3RFdmFsdWF0ZWRLZXkgfHwgIWNvbnRhaW5lcikgcmV0dXJuXG4gICAgICB0cnkge1xuICAgICAgICBpc0xvYWRpbmdSZWYuY3VycmVudCA9IHRydWVcbiAgICAgICAgc2V0SXNMb2FkaW5nTW9yZU1lc3NhZ2VzKHRydWUpXG5cbiAgICAgICAgY29uc3Qgb2xkU2Nyb2xsVG9wID0gY29udGFpbmVyLnNjcm9sbFRvcFxuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBpdGVtcyxcbiAgICAgICAgICBuZXh0SXRlbSxcbiAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWU6IHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50SWQ6IGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZTogY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tJZDogdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza05hbWU6IHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH0gPSBhd2FpdCBtYWlhLkNoYXRzLmdldENoYXRNZXNzYWdlcyh7XG4gICAgICAgICAgY2hhdElkLFxuICAgICAgICAgIGN1cnJlbnRVc2VyLFxuICAgICAgICAgIG9mZnNldDogbGFzdEV2YWx1YXRlZEtleSxcbiAgICAgICAgICBsYW5nOiBtYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpLFxuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IHNldENvbnZlcnNhdGlvbkNvbnRleHRGcm9tTWV0YWRhdGEoe1xuICAgICAgICAgIHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnRJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrTmFtZUZyb21TZXNzaW9uLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIFNpIGhheSBwcm95ZWN0byBlbiBsYSBjb252ZXJzYWNpw7NuLCByZWVzY3JpYmlyIFVSTHMgZGUgdGFyZWFzIGVuIGxvcyBtZW5zYWplcyBjYXJnYWRvc1xuICAgICAgICBjb25zdCBjb250ZXh0UHJvamVjdElkID0gcHJvamVjdElkTWVzc2FnZSA/IHBhcnNlSW50KFN0cmluZyhwcm9qZWN0SWRNZXNzYWdlKSwgMTApIDogbnVsbFxuICAgICAgICBsZXQgaXRlbXNUb01lcmdlID0gaXRlbXNcbiAgICAgICAgaWYgKGNvbnRleHRQcm9qZWN0SWQpIHtcbiAgICAgICAgICBjb25zdCB0YWIgPSBhd2FpdCBnZXRUYWJUYXNrRGVmYXVsdCgxKVxuICAgICAgICAgIGNvbnN0IHRhYlNlZ21lbnQgPSB0YWIgPyBgLyR7dGFifWAgOiAnL2RldGFpbCdcbiAgICAgICAgICBpdGVtc1RvTWVyZ2UgPSBpdGVtcy5tYXAoaXRlbSA9PiAoe1xuICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHJld3JpdGVUYXNrVXJsc0luQ29udGVudChpdGVtLm1lc3NhZ2UgfHwgJycsIHRhYlNlZ21lbnQpLFxuICAgICAgICAgIH0pKVxuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBBUEkgcGFnaW5hdGVzIG9sZGVzdC1maXJzdDogc3Vic2VxdWVudCBwYWdlcyBiZWxvbmcgYWZ0ZXIgdGhlXG4gICAgICAgIC8vIGxvYWRlZCBjb252ZXJzYXRpb24sIG5ldmVyIGJldHdlZW4gaXRzIGZpcnN0IHF1ZXN0aW9uIGFuZCBhbnN3ZXIuXG4gICAgICAgIGNvbnN0IG5ld01lc3NhZ2VzID0gWy4uLm1lc3NhZ2VzLCAuLi5pdGVtc1RvTWVyZ2VdXG4gICAgICAgIHNldE1lc3NhZ2VzKG5ld01lc3NhZ2VzKVxuICAgICAgICBjb25zdCBwYWdpbmF0aW9uS2V5ID0gTnVtYmVyKG5leHRJdGVtKVxuICAgICAgICBzZXRMYXN0RXZhbHVhdGVkS2V5KHBhZ2luYXRpb25LZXkpXG4gICAgICAgIHN5bmNNZXNzYWdlc1RvU3RvcmUoY2hhdElkLCBuZXdNZXNzYWdlcywgcGFnaW5hdGlvbktleSlcblxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJSZWYgPSBjb250YWluZXJcbiAgICAgICAgICAgIGlmIChjb250YWluZXJSZWYpIHtcbiAgICAgICAgICAgICAgY29udGFpbmVyUmVmLnNjcm9sbFRvcCA9IG9sZFNjcm9sbFRvcFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBvbkVycm9yPy4oKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNMb2FkaW5nTW9yZU1lc3NhZ2VzKGZhbHNlKVxuICAgICAgICBpc0xvYWRpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBjaGF0SWQsXG4gICAgICBjdXJyZW50VXNlcixcbiAgICAgIGxhc3RFdmFsdWF0ZWRLZXksXG4gICAgICBvbkVycm9yLFxuICAgICAgbWVzc2FnZXMsXG4gICAgICBnZXRUYWJUYXNrRGVmYXVsdCxcbiAgICAgIHNldENvbnZlcnNhdGlvbkNvbnRleHRGcm9tTWV0YWRhdGEsXG4gICAgICBzeW5jTWVzc2FnZXNUb1N0b3JlLFxuICAgIF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVNjcm9sbCA9IHVzZUNhbGxiYWNrKFxuICAgIChjb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgICAgaWYgKCFjb250YWluZXIgfHwgaXNMb2FkaW5nUmVmLmN1cnJlbnQgfHwgIWluaXRpYWxMb2FkRG9uZS5jdXJyZW50KSByZXR1cm5cblxuICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0IH0gPSBjb250YWluZXJcbiAgICAgIGNvbnN0IHNjcm9sbFBlcmNlbnRhZ2UgPSBzY3JvbGxIZWlnaHQgLSBjbGllbnRIZWlnaHQgPiAwID8gKHNjcm9sbFRvcCAvIChzY3JvbGxIZWlnaHQgLSBjbGllbnRIZWlnaHQpKSAqIDEwMCA6IDEwMFxuXG4gICAgICBpZiAoc2Nyb2xsUGVyY2VudGFnZSA+IDkwKSB7XG4gICAgICAgIGxvYWRNb3JlTWVzc2FnZXMoY29udGFpbmVyKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2xvYWRNb3JlTWVzc2FnZXNdXG4gIClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChjaGF0SWQgIT09IHByZXZpb3VzQ2hhdElkLmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGNhblJlc3RvcmUgPSB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuY2FuUmVzdG9yZVNlc3Npb24oY2hhdElkKVxuXG4gICAgICBpc0xvYWRpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICBpbml0aWFsTG9hZERvbmUuY3VycmVudCA9IGZhbHNlXG4gICAgICBwcmV2aW91c0NoYXRJZC5jdXJyZW50ID0gY2hhdElkXG4gICAgICBzZXRMYXN0RXZhbHVhdGVkS2V5KDApXG4gICAgICBsb2FkU2VxUmVmLmN1cnJlbnQgKz0gMVxuXG4gICAgICByZWZldGNoVGFiVGFza0RlZmF1bHQoKVxuXG4gICAgICBjb25zdCBwZW5kaW5nSW5pdGlhbE1lc3NhZ2UgPSBoYXNNZWFuaW5nZnVsVXNlckluaXRpYWxNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZSlcblxuICAgICAgaWYgKCFwZW5kaW5nSW5pdGlhbE1lc3NhZ2UgJiYgY2FuUmVzdG9yZSkge1xuICAgICAgICByZXN0b3JlU2Vzc2lvbkZyb21TdG9yZShjaGF0SWQpLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbdXNlQ2hhdE1lc3NhZ2VzXSByZXN0b3JlU2Vzc2lvbkZyb21TdG9yZSBmYWlsZWQnLCBlcnJvcilcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHNldE1lc3NhZ2VzKFxuICAgICAgICBwZW5kaW5nSW5pdGlhbE1lc3NhZ2UgJiYgdXNlckluaXRpYWxNZXNzYWdlXG4gICAgICAgICAgPyBidWlsZEluaXRpYWxNZXNzYWdlUGxhY2Vob2xkZXIodXNlckluaXRpYWxNZXNzYWdlLCBjdXJyZW50VXNlcilcbiAgICAgICAgICA6IFtdXG4gICAgICApXG5cbiAgICAgIC8vIExpbXBpYXIgZWwgZXN0YWRvIGRlbCBwcm95ZWN0byB5IGxhIHRhcmVhIGN1YW5kbyBjYW1iaWEgZGUgY29udmVyc2FjacOzblxuICAgICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgICBzZXRUYXNrKG51bGwpXG5cbiAgICAgIGlmICghcGVuZGluZ0luaXRpYWxNZXNzYWdlKSB7XG4gICAgICAgIGxvYWRNZXNzYWdlcygpXG4gICAgICB9XG4gICAgfVxuICB9LCBbXG4gICAgY2hhdElkLFxuICAgIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgICBjdXJyZW50VXNlcixcbiAgICBsb2FkTWVzc2FnZXMsXG4gICAgcmVzdG9yZVNlc3Npb25Gcm9tU3RvcmUsXG4gICAgc2V0Q2hpcHNQcm9qZWN0LFxuICAgIHNldFByb2plY3QsXG4gICAgc2V0VGFzayxcbiAgICByZWZldGNoVGFiVGFza0RlZmF1bHQsXG4gIF0pXG5cbiAgLy8gQ3VhbmRvIHRhYlRhc2tEZWZhdWx0IHBhc2EgYSBlc3RhciBkaXNwb25pYmxlIGRlc3B1w6lzIGRlIGNhcmdhciwgcmVlc2NyaWJpciBVUkxzIGRlIHRhcmVhcyBlbiBsb3MgbWVuc2FqZXMgeWEgY2FyZ2Fkb3MuXG4gIC8vIFJlZiBwYXJhIGV2aXRhciBidWNsZTogc2V0TWVzc2FnZXMocmV3cml0dGVuKSBjYW1iaWEgbWVzc2FnZXMgeSByZS1lamVjdXRhIGVsIGVmZWN0bzsgc29sbyByZWVzY3JpYmltb3MgdW5hIHZleiBwb3IgbG90ZS5cbiAgY29uc3QgZGlkUmV3cml0ZVJlZiA9IHVzZVJlZihmYWxzZSlcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXRhYlRhc2tEZWZhdWx0IHx8ICFwcm9qZWN0Py5pZCB8fCBtZXNzYWdlcy5sZW5ndGggPT09IDApIHJldHVyblxuICAgIGNvbnN0IHRhc2tVcmxSZWdleCA9IG5ldyBSZWdFeHAoVEFTS19VUkxfUkVHRVhfUEFUVEVSTiwgJ2cnKVxuICAgIGNvbnN0IHRhYlNlZ21lbnQgPSBgLyR7dGFiVGFza0RlZmF1bHR9YFxuICAgIGNvbnN0IG5lZWRzUmV3cml0ZSA9IG1lc3NhZ2VzLnNvbWUobXNnID0+IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBtc2cubWVzc2FnZSB8fCAnJ1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGNvbnRlbnQubWF0Y2godGFza1VybFJlZ2V4KVxuICAgICAgaWYgKCFtYXRjaGVzPy5sZW5ndGgpIHJldHVybiBmYWxzZVxuICAgICAgcmV0dXJuIG1hdGNoZXMuc29tZSh1cmwgPT4gIXVybC5lbmRzV2l0aChgLyR7dGFiVGFza0RlZmF1bHR9YCkgJiYgIXVybC5pbmNsdWRlcyhgLyR7dGFiVGFza0RlZmF1bHR9P2ApKVxuICAgIH0pXG4gICAgaWYgKCFuZWVkc1Jld3JpdGUpIHtcbiAgICAgIGRpZFJld3JpdGVSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRpZFJld3JpdGVSZWYuY3VycmVudCkgcmV0dXJuXG4gICAgZGlkUmV3cml0ZVJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgIGNvbnN0IHJld3JpdHRlbiA9IG1lc3NhZ2VzLm1hcChtc2cgPT4gKHtcbiAgICAgIC4uLm1zZyxcbiAgICAgIG1lc3NhZ2U6IHJld3JpdGVUYXNrVXJsc0luQ29udGVudChtc2cubWVzc2FnZSB8fCAnJywgdGFiU2VnbWVudCksXG4gICAgfSkpXG4gICAgc2V0TWVzc2FnZXMocmV3cml0dGVuKVxuICAgIHN5bmNNZXNzYWdlc1RvU3RvcmUoY2hhdElkLCByZXdyaXR0ZW4pXG4gIH0sIFt0YWJUYXNrRGVmYXVsdCwgcHJvamVjdD8uaWQsIG1lc3NhZ2VzLCBjaGF0SWQsIHN5bmNNZXNzYWdlc1RvU3RvcmVdKVxuXG4gIC8vIEVsIHVwZGF0ZXIgZGUgYHVzZVN0YXRlYCB0aWVuZSBxdWUgc2VyIHB1cm86IFJlYWN0IGxvIGVqZWN1dGEgZW4gZmFzZSBkZVxuICAvLyByZW5kZXIgeSBgc3luY01lc3NhZ2VzVG9TdG9yZWAgZXNjcmliZSBlbiB1biBzdG9yZSBleHRlcm5vLCBsbyBxdWUgZGlzcGFyYVxuICAvLyBcIkNhbm5vdCB1cGRhdGUgYSBjb21wb25lbnQgd2hpbGUgcmVuZGVyaW5nIGEgZGlmZmVyZW50IGNvbXBvbmVudFwiLiBTZVxuICAvLyBjb21wdXRhIGNvbnRyYSBlc3RlIGVzcGVqbyBwYXJhIHBvZGVyIGVuY2FkZW5hciB2YXJpYXMgbXV0YWNpb25lcyBlbiBlbFxuICAvLyBtaXNtbyB0aWNrIChwLiBlai4gcmVtb3ZlICsgYWRkIGRlbCBzd2FwIGRlIGZpbiBkZSBzdHJlYW0pIHNpbiBkZXBlbmRlciBkZVxuICAvLyBxdWUgUmVhY3QgeWEgaGF5YSByZS1yZW5kZXJpemFkby5cbiAgY29uc3QgbWVzc2FnZXNSZWYgPSB1c2VSZWYobWVzc2FnZXMpXG4gIG1lc3NhZ2VzUmVmLmN1cnJlbnQgPSBtZXNzYWdlc1xuXG4gIGNvbnN0IGFwcGx5TWVzc2FnZXMgPSB1c2VDYWxsYmFjayhcbiAgICAobmV4dE1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdKSA9PiB7XG4gICAgICBtZXNzYWdlc1JlZi5jdXJyZW50ID0gbmV4dE1lc3NhZ2VzXG4gICAgICBzZXRNZXNzYWdlcyhuZXh0TWVzc2FnZXMpXG4gICAgICBzeW5jTWVzc2FnZXNUb1N0b3JlKGNoYXRJZCwgbmV4dE1lc3NhZ2VzKVxuICAgIH0sXG4gICAgW2NoYXRJZCwgc3luY01lc3NhZ2VzVG9TdG9yZV1cbiAgKVxuXG4gIGNvbnN0IGFkZE1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAobWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IHtcbiAgICAgIGNvbnN0IHByZXYgPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgICBjb25zdCBleGlzdGluZ01lc3NhZ2VJbmRleCA9IHByZXYuZmluZEluZGV4KG1zZyA9PiBtc2cuaWQgPT09IG1lc3NhZ2UuaWQpXG4gICAgICBhcHBseU1lc3NhZ2VzKFxuICAgICAgICBleGlzdGluZ01lc3NhZ2VJbmRleCA+PSAwXG4gICAgICAgICAgPyBwcmV2Lm1hcCgobXNnLCBpbmRleCkgPT4gKGluZGV4ID09PSBleGlzdGluZ01lc3NhZ2VJbmRleCA/IG1lc3NhZ2UgOiBtc2cpKVxuICAgICAgICAgIDogWy4uLnByZXYsIG1lc3NhZ2VdXG4gICAgICApXG4gICAgfSxcbiAgICBbYXBwbHlNZXNzYWdlc11cbiAgKVxuXG4gIGNvbnN0IHJlbW92ZU1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAobWVzc2FnZUlkOiBzdHJpbmcpID0+IHtcbiAgICAgIGFwcGx5TWVzc2FnZXMobWVzc2FnZXNSZWYuY3VycmVudC5maWx0ZXIobXNnID0+IG1zZy5pZCAhPT0gbWVzc2FnZUlkKSlcbiAgICB9LFxuICAgIFthcHBseU1lc3NhZ2VzXVxuICApXG5cbiAgcmV0dXJuIHtcbiAgICBsb2FkaW5nTWVzc2FnZXMsXG4gICAgbWVzc2FnZXMsXG4gICAgaGFzTW9yZU1lc3NhZ2VzOiAhIWxhc3RFdmFsdWF0ZWRLZXksXG4gICAgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzLFxuICAgIGxvYWRNZXNzYWdlcyxcbiAgICBsb2FkTW9yZU1lc3NhZ2VzLFxuICAgIGFkZE1lc3NhZ2UsXG4gICAgcmVtb3ZlTWVzc2FnZSxcbiAgICAvLyBgcmVwbGFjZU1lc3NhZ2VzYCBkZSBtYXN0ZXIgaGFjw61hIGxvIG1pc21vIHF1ZSBgYXBwbHlNZXNzYWdlc2AgcGVybyBzaW5cbiAgICAvLyBzaW5jcm9uaXphciBgbWVzc2FnZXNSZWZgLCB5IGVzYSByZWYgZXMgbGEgcXVlIGV2aXRhIGxvcyB1cGRhdGVycyBpbXB1cm9zLlxuICAgIHJlcGxhY2VNZXNzYWdlczogYXBwbHlNZXNzYWdlcyxcbiAgICBoYW5kbGVTY3JvbGwsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0EsU0FBU0EsV0FBVyxFQUFFQyxRQUFRLEVBQUVDLE1BQU0sRUFBRUMsU0FBUyxRQUFRLE9BQU87QUFDaEUsU0FBU0MsV0FBVyxRQUFRLGdCQUFnQjtBQUU1QyxTQUFTQyxtQkFBbUIsUUFBUSw0QkFBNEI7QUFDaEUsT0FBT0MsSUFBSSxNQUFNLHFCQUFxQjtBQUV0QyxTQUFTQyxnQkFBZ0IsUUFBUSw4QkFBOEI7QUFDL0QsU0FBU0MsSUFBSSxRQUFRLFNBQVM7QUFDOUIsU0FBU0MsT0FBTyxRQUFRLHdCQUF3QjtBQUNoRCxTQUFTQyxpQkFBaUIsUUFBUSxzQkFBc0I7QUFDeEQsU0FBU0Msc0JBQXNCLFFBQVEsMEJBQTBCO0FBQ2pFLFNBQVNDLFVBQVUsUUFBUSxrQkFBa0I7QUFDN0MsU0FBU0Msa0NBQWtDLFFBQVEsc0NBQXNDO0FBQ3pGLFNBQVNDLGdCQUFnQixRQUFRLHVDQUF1QztBQUN4RSxTQUFTQyxxQkFBcUIsUUFBUSxxQ0FBcUM7QUFDM0UsU0FBU0Msa0JBQWtCLFFBQVEsMkJBQTJCO0FBVzlEO0FBQ0EsSUFBTUMsK0JBQStCLEdBQUcsU0FBbENBLCtCQUErQkEsQ0FBSUMsa0JBQXVDO0VBQUEsSUFBQUMscUJBQUEsRUFBQUMscUJBQUE7RUFBQSxPQUM5RUMsT0FBTyxDQUNMSCxrQkFBa0IsS0FDakIsRUFBQUMscUJBQUEsR0FBQUQsa0JBQWtCLENBQUNJLE9BQU8sY0FBQUgscUJBQUEsdUJBQTFCQSxxQkFBQSxDQUE0QkksSUFBSSxDQUFDLENBQUMsT0FBQUgscUJBQUEsR0FDakNGLGtCQUFrQixDQUFDTSxXQUFXLGNBQUFKLHFCQUFBLHVCQUE5QkEscUJBQUEsQ0FBZ0NLLE1BQU0sS0FDdENQLGtCQUFrQixDQUFDUSxLQUFLLElBQ3hCUixrQkFB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LFlBQVksQ0FBQztJQUN6QkYsbUJBQW1CLENBQUMzQyxNQUFNLEVBQUU2QyxZQUFZLENBQUM7RUFDM0MsQ0FBQyxFQUNELENBQUM3QyxNQUFNLEVBQUUyQyxtQkFBbUIsQ0FDOUIsQ0FBQztFQUVELElBQU1zSyxVQUFVLEdBQUd2USxXQUFXLENBQzVCLFVBQUNzQixPQUFvQixFQUFLO0lBQ3hCLElBQU1zRyxJQUFJLEdBQUd5SSxXQUFXLENBQUM1RyxPQUFPO0lBQ2hDLElBQU0rRyxvQkFBb0IsR0FBRzVJLElBQUksQ0FBQzZJLFNBQVMsQ0FBQyxVQUFBVixHQUFHO01BQUEsT0FBSUEsR0FBRyxDQUFDMU4sRUFBRSxLQUFLZixPQUFPLENBQUNlLEVBQUU7SUFBQSxFQUFDO0lBQ3pFaU8sYUFBYSxDQUNYRSxvQkFBb0IsSUFBSSxDQUFDLEdBQ3JCNUksSUFBSSxDQUFDOEYsR0FBRyxDQUFDLFVBQUNxQyxHQUFHLEVBQUVXLEtBQUs7TUFBQSxPQUFNQSxLQUFLLEtBQUtGLG9CQUFvQixHQUFHbFAsT0FBTyxHQUFHeU8sR0FBRztJQUFBLENBQUMsQ0FBQyxNQUFBdEMsTUFBQSxDQUFBUSxrQkFBQSxDQUN0RXJHLElBQUksSUFBRXRHLE9BQU8sRUFDdkIsQ0FBQztFQUNILENBQUMsRUFDRCxDQUFDZ1AsYUFBYSxDQUNoQixDQUFDO0VBRUQsSUFBTUssYUFBYSxHQUFHM1EsV0FBVyxDQUMvQixVQUFDNFEsU0FBaUIsRUFBSztJQUNyQk4sYUFBYSxDQUFDRCxXQUFXLENBQUM1RyxPQUFPLENBQUNzRSxNQUFNLENBQUMsVUFBQWdDLEdBQUc7TUFBQSxPQUFJQSxHQUFHLENBQUMxTixFQUFFLEtBQUt1TyxTQUFTO0lBQUEsRUFBQyxDQUFDO0VBQ3hFLENBQUMsRUFDRCxDQUFDTixhQUFhLENBQ2hCLENBQUM7RUFFRCxPQUFPO0lBQ0xwTSxlQUFlLEVBQWZBLGVBQWU7SUFDZkksUUFBUSxFQUFSQSxRQUFRO0lBQ1J1TSxlQUFlLEVBQUUsQ0FBQyxDQUFDbEwsZ0JBQWdCO0lBQ25DSixxQkFBcUIsRUFBckJBLHFCQUFxQjtJQUNyQjJFLFlBQVksRUFBWkEsWUFBWTtJQUNab0UsZ0JBQWdCLEVBQWhCQSxnQkFBZ0I7SUFDaEJpQyxVQUFVLEVBQVZBLFVBQVU7SUFDVkksYUFBYSxFQUFiQSxhQUFhO0lBQ2I7SUFDQTtJQUNBRyxlQUFlLEVBQUVSLGFBQWE7SUFDOUJsQixZQUFZLEVBQVpBO0VBQ0YsQ0FBQztBQUNILENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
496
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVN0YXRlIiwidXNlUmVmIiwidXNlRWZmZWN0IiwidXNlUHJvamVjdHMiLCJtYWlhIiwidXNlR2xvYmFsQ29udGV4dCIsInVzZVQiLCJ1c2VVc2VyIiwidXNlVGFiVGFza0RlZmF1bHQiLCJtYXBDT1JMYW5nIiwidXNlU2Vzc2lvbnNTdG9yZSIsImJ1aWxkSW5pdGlhbE1lc3NhZ2VQbGFjZWhvbGRlciIsImNvbnZlcnNhdGlvblByb2plY3RUb0dsb2JhbFByb2plY3QiLCJoYXNDbGllbnRDb252ZXJzYXRpb25NZXRhZGF0YSIsImhhc01lYW5pbmdmdWxVc2VySW5pdGlhbE1lc3NhZ2UiLCJtYXJrT3BlbmVkU2Vzc2lvbkFzUmVhZElmVmlzaWJsZSIsInJlc29sdmVQcm9qZWN0Q29udGV4dEZyb21GZXRjaCIsInJlc29sdmVUYXNrRnJvbUNvbnZlcnNhdGlvbk1ldGFkYXRhIiwiYnVpbGRTZXNzaW9uQ29udmVyc2F0aW9uTWV0YSIsImJ1aWxkU2Vzc2lvbk1ldGFFdmVudERldGFpbCIsInJlc29sdmVGaW5hbE1lc3NhZ2VzV2l0aEFjdGl2ZVN0cmVhbWluZ1RhaWwiLCJyZXNvbHZlU2Vzc2lvbkFnZW50RnJvbUNoYXRMb2FkIiwicmV3cml0ZU1lc3NhZ2VzRm9yUHJvamVjdFRhc2tVcmxzIiwicmV3cml0ZVRhc2tVcmxzSW5Db250ZW50Iiwic2hvdWxkQWJvcnRTdGFsZU1lc3NhZ2VMb2FkIiwic2hvdWxkQXBwbHlNdWx0aUFnZW50UHJvamVjdENvbnRleHQiLCJzaG91bGRMb2FkTW9yZU1lc3NhZ2VzT25TY3JvbGwiLCJtZXNzYWdlc05lZWRUYWJSZXdyaXRlIiwidXBzZXJ0Q2hhdE1lc3NhZ2UiLCJ1c2VDaGF0TWVzc2FnZXMiLCJfcmVmIiwiX3VzZXIkcGVybWlzc2lvbnMiLCJvbkVycm9yIiwiY2hhdElkIiwiY3VycmVudFVzZXIiLCJ1c2VySW5pdGlhbE1lc3NhZ2UiLCJfcmVmJGFnZW50cyIsImFnZW50cyIsIl91c2VUIiwidCIsImkxOG4iLCJ1c2VyIiwidXNlclBlcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJhaV9hZ2VudHMiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJsb2FkaW5nTWVzc2FnZXMiLCJzZXRMb2FkaW5nTWVzc2FnZXMiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsIm1lc3NhZ2VzIiwic2V0TWVzc2FnZXMiLCJfdXNlUHJvamVjdHMiLCJmZXRjaFByb2plY3RzIiwiX3VzZUdsb2JhbENvbnRleHQiLCJzZWxlY3RBZ2VudCIsInNldENoaXBzUHJvamVjdCIsInNldFByb2plY3QiLCJzZXRDbGllbnQiLCJzZXRUYXNrIiwicHJvamVjdCIsIl91c2VUYWJUYXNrRGVmYXVsdCIsImdldFRhYlRhc2tEZWZhdWx0IiwidGFiVGFza0RlZmF1bHQiLCJyZWZldGNoVGFiVGFza0RlZmF1bHQiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImlzTG9hZGluZ01vcmVNZXNzYWdlcyIsInNldElzTG9hZGluZ01vcmVNZXNzYWdlcyIsIl91c2VTdGF0ZTciLCJfdXNlU3RhdGU4IiwibGFzdEV2YWx1YXRlZEtleSIsInNldExhc3RFdmFsdWF0ZWRLZXkiLCJpc0xvYWRpbmdSZWYiLCJpbml0aWFsTG9hZERvbmUiLCJwcmV2aW91c0NoYXRJZCIsImxvYWRTZXFSZWYiLCJzeW5jTWVzc2FnZXNUb1N0b3JlIiwidGFyZ2V0Q2hhdElkIiwibmV4dE1lc3NhZ2VzIiwibGFzdEV2YWx1YXRlZEtleVZhbHVlIiwiZ2V0U3RhdGUiLCJ1bmRlZmluZWQiLCJwYXRjaFZpZXdDYWNoZSIsInNldENvbnZlcnNhdGlvbkNvbnRleHRGcm9tTWV0YWRhdGEiLCJfcmVmMyIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwiX3JlZjIiLCJwcm9qZWN0SWRNZXNzYWdlIiwicHJvamVjdE5hbWVGcm9tU2Vzc2lvbiIsImNsaWVudElkRnJvbVNlc3Npb24iLCJjbGllbnROYW1lRnJvbVNlc3Npb24iLCJ0YXNrSWRGcm9tU2Vzc2lvbiIsInRhc2tOYW1lRnJvbVNlc3Npb24iLCJ0YXNrIiwicHJvamVjdHMiLCJoYXNNdWx0aUFnZW50c0FjY2VzcyIsIl9yZXNvbHZlUHJvamVjdENvbnRleCIsImNoaXBzUHJvamVjdCIsInJlc29sdmVkUHJvamVjdCIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiaWQiLCJOdW1iZXIiLCJuYW1lIiwiYWJydXB0Iiwic2VudCIsIndpbmRvdyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMiLCJzdG9wIiwiX3giLCJhcHBseSIsImFyZ3VtZW50cyIsInJlc3RvcmVTZXNzaW9uRnJvbVN0b3JlIiwiX3JlZjQiLCJfY2FsbGVlMiIsIl9jYWNoZSRsYXN0RXZhbHVhdGVkSyIsInNlc3Npb25zU3RvcmUiLCJjYWNoZWRNZXNzYWdlcyIsImNhY2hlIiwiX2NvbnRleHQyIiwiZ2V0TWVzc2FnZXMiLCJnZXRWaWV3Q2FjaGUiLCJjdXJyZW50IiwiYWdlbnRTbmFwc2hvdCIsImNvbnZlcnNhdGlvbk1ldGEiLCJzZXNzaW9uTWV0YUV2ZW50IiwiZG9jdW1lbnQiLCJkaXNwYXRjaEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJkZXRhaWwiLCJfeDIiLCJsb2FkTWVzc2FnZXMiLCJfcmVmNSIsIl9jYWxsZWUzIiwib3B0aW9ucyIsInNlcSIsIl95aWVsZCRtYWlhJENoYXRzJGdldCIsIml0ZW1zIiwibmV4dEl0ZW0iLCJhZ2VudERlbGV0ZWQiLCJhZ2VudE5vUGVybWlzc2lvbiIsImhhc0FnZW50QWNjZXNzIiwiaGFzQWdlbnRQZXJtaXNzaW9uIiwiYWdlbnRUeXBlRnJvbVNlc3Npb24iLCJhZ2VudEVudGl0eUZyb21TZXNzaW9uIiwicHJvamVjdERlbGV0ZWQiLCJzZXNzaW9uQWdlbnQiLCJpdGVtc1RvU2V0Iiwic2Vzc2lvbk1ldGEiLCJmaW5hbE1lc3NhZ2VzIiwicGFnaW5hdGlvbktleSIsIl90IiwiX2NvbnRleHQzIiwiZm9yY2UiLCJjYW5SZXN0b3JlU2Vzc2lvbiIsIkNoYXRzIiwiZ2V0Q2hhdE1lc3NhZ2VzIiwib2Zmc2V0IiwiY2FuY2VsbGVkVGV4dCIsImxhbmciLCJsYW5ndWFnZSIsImFnZW50VHlwZSIsImFnZW50RW50aXR5IiwicHJvamVjdElkIiwicHJvamVjdE5hbWUiLCJjbGllbnRJZCIsImNsaWVudE5hbWUiLCJ0YXNrSWQiLCJ0YXNrTmFtZSIsInVzZXJDYW5WaWV3QWdlbnRzIiwiQm9vbGVhbiIsInZpZXciLCJnZXRNZXRhIiwic3RhdHVzIiwic2V0Vmlld0NhY2hlIiwiaHlkcmF0ZWRGcm9tQXBpIiwiZmluaXNoIiwiX3gzIiwibG9hZE1vcmVNZXNzYWdlcyIsIl9yZWY2IiwiX2NhbGxlZTQiLCJjb250YWluZXIiLCJvbGRTY3JvbGxUb3AiLCJfeWllbGQkbWFpYSRDaGF0cyRnZXQyIiwiaXRlbXNUb01lcmdlIiwibmV3TWVzc2FnZXMiLCJfdDIiLCJfY29udGV4dDQiLCJzY3JvbGxUb3AiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJjb250YWluZXJSZWYiLCJfeDQiLCJoYW5kbGVTY3JvbGwiLCJzY3JvbGxIZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJjYW5SZXN0b3JlIiwicGVuZGluZ0luaXRpYWxNZXNzYWdlIiwiZXJyb3IiLCJjb25zb2xlIiwiZGlkUmV3cml0ZVJlZiIsImxlbmd0aCIsInRhYlNlZ21lbnQiLCJuZWVkc1Jld3JpdGUiLCJyZXdyaXR0ZW4iLCJtYXAiLCJtc2ciLCJfb2JqZWN0U3ByZWFkIiwibWVzc2FnZSIsIm1lc3NhZ2VzUmVmIiwiYXBwbHlNZXNzYWdlcyIsImFkZE1lc3NhZ2UiLCJyZW1vdmVNZXNzYWdlIiwibWVzc2FnZUlkIiwiZmlsdGVyIiwiaGFzTW9yZU1lc3NhZ2VzIiwicmVwbGFjZU1lc3NhZ2VzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2hvb2tzL3VzZUNoYXRNZXNzYWdlcy91c2VDaGF0TWVzc2FnZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2luZGVudCAqL1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlUHJvamVjdHMgfSBmcm9tICcuLi91c2VQcm9qZWN0cydcbmltcG9ydCB7IENoYXRNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvQ2hhdCdcbmltcG9ydCBtYWlhIGZyb20gJy4uLy4uL3NlcnZpY2VzL21haWEnXG5pbXBvcnQgeyBVc2VDaGF0TWVzc2FnZXNQcm9wcyB9IGZyb20gJy4vdXNlQ2hhdE1lc3NhZ2VzLmludGVyZmFjZSdcbmltcG9ydCB7IHVzZUdsb2JhbENvbnRleHQgfSBmcm9tICcuLi8uLi9jb250ZXh0L2dsb2JhbC1jb250ZXh0J1xuaW1wb3J0IHsgdXNlVCB9IGZyb20gJy4uL3VzZVQnXG5pbXBvcnQgeyB1c2VVc2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dC9jb3ItdXNlcidcbmltcG9ydCB7IHVzZVRhYlRhc2tEZWZhdWx0IH0gZnJvbSAnLi4vdXNlVGFiVGFza0RlZmF1bHQnXG5pbXBvcnQgeyBtYXBDT1JMYW5nIH0gZnJvbSAnLi4vLi4vbGFuZy91dGlscydcbmltcG9ydCB7IHVzZVNlc3Npb25zU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS9zZXNzaW9ucy91c2VTZXNzaW9uc1N0b3JlJ1xuaW1wb3J0IHR5cGUgeyBBZ2VudCB9IGZyb20gJy4uLy4uL3R5cGVzL2FnZW50J1xuaW1wb3J0IHtcbiAgYnVpbGRJbml0aWFsTWVzc2FnZVBsYWNlaG9sZGVyLFxuICBjb252ZXJzYXRpb25Qcm9qZWN0VG9HbG9iYWxQcm9qZWN0LFxuICBoYXNDbGllbnRDb252ZXJzYXRpb25NZXRhZGF0YSxcbiAgaGFzTWVhbmluZ2Z1bFVzZXJJbml0aWFsTWVzc2FnZSxcbiAgbWFya09wZW5lZFNlc3Npb25Bc1JlYWRJZlZpc2libGUsXG4gIHJlc29sdmVQcm9qZWN0Q29udGV4dEZyb21GZXRjaCxcbiAgcmVzb2x2ZVRhc2tGcm9tQ29udmVyc2F0aW9uTWV0YWRhdGEsXG4gIGJ1aWxkU2Vzc2lvbkNvbnZlcnNhdGlvbk1ldGEsXG4gIGJ1aWxkU2Vzc2lvbk1ldGFFdmVudERldGFpbCxcbiAgcmVzb2x2ZUZpbmFsTWVzc2FnZXNXaXRoQWN0aXZlU3RyZWFtaW5nVGFpbCxcbiAgcmVzb2x2ZVNlc3Npb25BZ2VudEZyb21DaGF0TG9hZCxcbiAgcmV3cml0ZU1lc3NhZ2VzRm9yUHJvamVjdFRhc2tVcmxzLFxuICByZXdyaXRlVGFza1VybHNJbkNvbnRlbnQsXG4gIHNob3VsZEFib3J0U3RhbGVNZXNzYWdlTG9hZCxcbiAgc2hvdWxkQXBwbHlNdWx0aUFnZW50UHJvamVjdENvbnRleHQsXG4gIHNob3VsZExvYWRNb3JlTWVzc2FnZXNPblNjcm9sbCxcbiAgbWVzc2FnZXNOZWVkVGFiUmV3cml0ZSxcbiAgdXBzZXJ0Q2hhdE1lc3NhZ2UsXG59IGZyb20gJy4vdXNlQ2hhdE1lc3NhZ2VzLmhlbHBlcnMnXG5cbnR5cGUgTG9hZE1lc3NhZ2VzT3B0aW9ucyA9IHtcbiAgLyoqIElnbm9yYSBjYWNoZSBlbiBtZW1vcmlhIHkgdnVlbHZlIGEgcGVkaXIgZ2V0Q2hhdE1lc3NhZ2VzLiAqL1xuICBmb3JjZT86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNvbnN0IHVzZUNoYXRNZXNzYWdlcyA9ICh7XG4gIG9uRXJyb3IsXG4gIGNoYXRJZCxcbiAgY3VycmVudFVzZXIsXG4gIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgYWdlbnRzID0gW10sXG59OiBVc2VDaGF0TWVzc2FnZXNQcm9wcykgPT4ge1xuICBjb25zdCB7IHQsIGkxOG4gfSA9IHVzZVQoKVxuICBjb25zdCB1c2VyID0gdXNlVXNlcigpXG4gIGNvbnN0IHVzZXJQZXJtaXNzaW9ucyA9IHVzZXI/LnBlcm1pc3Npb25zPy5haV9hZ2VudHNcbiAgY29uc3QgW2xvYWRpbmdNZXNzYWdlcywgc2V0TG9hZGluZ01lc3NhZ2VzXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbbWVzc2FnZXMsIHNldE1lc3NhZ2VzXSA9IHVzZVN0YXRlPENoYXRNZXNzYWdlW10+KCgpID0+XG4gICAgaGFzTWVhbmluZ2Z1bFVzZXJJbml0aWFsTWVzc2FnZSh1c2VySW5pdGlhbE1lc3NhZ2UpICYmIHVzZXJJbml0aWFsTWVzc2FnZVxuICAgICAgPyBidWlsZEluaXRpYWxNZXNzYWdlUGxhY2Vob2xkZXIodXNlckluaXRpYWxNZXNzYWdlLCBjdXJyZW50VXNlcilcbiAgICAgIDogW11cbiAgKVxuICBjb25zdCB7IGZldGNoUHJvamVjdHMgfSA9IHVzZVByb2plY3RzKClcbiAgY29uc3QgeyBzZWxlY3RBZ2VudCwgc2V0Q2hpcHNQcm9qZWN0LCBzZXRQcm9qZWN0LCBzZXRDbGllbnQsIHNldFRhc2ssIHByb2plY3QgfSA9IHVzZUdsb2JhbENvbnRleHQoKVxuICBjb25zdCB7IGdldFRhYlRhc2tEZWZhdWx0LCB0YWJUYXNrRGVmYXVsdCwgcmVmZXRjaFRhYlRhc2tEZWZhdWx0IH0gPSB1c2VUYWJUYXNrRGVmYXVsdCgpXG4gIGNvbnN0IFtpc0xvYWRpbmdNb3JlTWVzc2FnZXMsIHNldElzTG9hZGluZ01vcmVNZXNzYWdlc10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2xhc3RFdmFsdWF0ZWRLZXksIHNldExhc3RFdmFsdWF0ZWRLZXldID0gdXNlU3RhdGU8bnVtYmVyIHwgdW5kZWZpbmVkPigwKVxuICBjb25zdCBpc0xvYWRpbmdSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGluaXRpYWxMb2FkRG9uZSA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgcHJldmlvdXNDaGF0SWQgPSB1c2VSZWYoY2hhdElkKVxuICBjb25zdCBsb2FkU2VxUmVmID0gdXNlUmVmKDApXG5cbiAgY29uc3Qgc3luY01lc3NhZ2VzVG9TdG9yZSA9IHVzZUNhbGxiYWNrKFxuICAgICh0YXJnZXRDaGF0SWQ6IHN0cmluZywgbmV4dE1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdLCBsYXN0RXZhbHVhdGVkS2V5VmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5zZXRNZXNzYWdlcyh0YXJnZXRDaGF0SWQsIG5leHRNZXNzYWdlcylcbiAgICAgIGlmIChsYXN0RXZhbHVhdGVkS2V5VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkucGF0Y2hWaWV3Q2FjaGUodGFyZ2V0Q2hhdElkLCB7IGxhc3RFdmFsdWF0ZWRLZXk6IGxhc3RFdmFsdWF0ZWRLZXlWYWx1ZSB9KVxuICAgICAgfVxuICAgIH0sXG4gICAgW11cbiAgKVxuXG4gIGNvbnN0IHNldENvbnZlcnNhdGlvbkNvbnRleHRGcm9tTWV0YWRhdGEgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoe1xuICAgICAgcHJvamVjdElkTWVzc2FnZSxcbiAgICAgIHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICBjbGllbnRJZEZyb21TZXNzaW9uLFxuICAgICAgY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICB0YXNrTmFtZUZyb21TZXNzaW9uLFxuICAgIH06IHtcbiAgICAgIHByb2plY3RJZE1lc3NhZ2U6IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWRcbiAgICAgIHByb2plY3ROYW1lRnJvbVNlc3Npb246IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbiAgICAgIGNsaWVudElkRnJvbVNlc3Npb246IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWRcbiAgICAgIGNsaWVudE5hbWVGcm9tU2Vzc2lvbjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxuICAgICAgdGFza0lkRnJvbVNlc3Npb246IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWRcbiAgICAgIHRhc2tOYW1lRnJvbVNlc3Npb246IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbiAgICB9KSA9PiB7XG4gICAgICBjb25zdCB0YXNrID0gcmVzb2x2ZVRhc2tGcm9tQ29udmVyc2F0aW9uTWV0YWRhdGEodGFza0lkRnJvbVNlc3Npb24sIHRhc2tOYW1lRnJvbVNlc3Npb24pXG4gICAgICBzZXRUYXNrKHRhc2spXG5cbiAgICAgIGlmIChoYXNDbGllbnRDb252ZXJzYXRpb25NZXRhZGF0YShjbGllbnRJZEZyb21TZXNzaW9uLCBjbGllbnROYW1lRnJvbVNlc3Npb24pKSB7XG4gICAgICAgIHNldENsaWVudCh7IGlkOiBOdW1iZXIoY2xpZW50SWRGcm9tU2Vzc2lvbiksIG5hbWU6IGNsaWVudE5hbWVGcm9tU2Vzc2lvbiBhcyBzdHJpbmcgfSlcbiAgICAgICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmV0Y2hQcm9qZWN0cyhwcm9qZWN0SWRNZXNzYWdlKVxuICAgICAgY29uc3QgaGFzTXVsdGlBZ2VudHNBY2Nlc3MgPSAhIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTXG5cbiAgICAgIGlmIChzaG91bGRBcHBseU11bHRpQWdlbnRQcm9qZWN0Q29udGV4dChwcm9qZWN0SWRNZXNzYWdlLCBoYXNNdWx0aUFnZW50c0FjY2VzcykpIHtcbiAgICAgICAgY29uc3QgeyBjaGlwc1Byb2plY3QsIHByb2plY3Q6IHJlc29sdmVkUHJvamVjdCB9ID0gcmVzb2x2ZVByb2plY3RDb250ZXh0RnJvbUZldGNoKFxuICAgICAgICAgIHByb2plY3RJZE1lc3NhZ2UgYXMgc3RyaW5nIHwgbnVtYmVyLFxuICAgICAgICAgIHByb2plY3RzIHx8IFtdLFxuICAgICAgICAgIHByb2plY3ROYW1lRnJvbVNlc3Npb25cbiAgICAgICAgKVxuXG4gICAgICAgIHNldENoaXBzUHJvamVjdChjaGlwc1Byb2plY3QpXG4gICAgICAgIHNldFByb2plY3QoY29udmVyc2F0aW9uUHJvamVjdFRvR2xvYmFsUHJvamVjdChyZXNvbHZlZFByb2plY3QpKVxuICAgICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtmZXRjaFByb2plY3RzLCBzZXRDbGllbnQsIHNldENoaXBzUHJvamVjdCwgc2V0UHJvamVjdCwgc2V0VGFza11cbiAgKVxuXG4gIGNvbnN0IHJlc3RvcmVTZXNzaW9uRnJvbVN0b3JlID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHRhcmdldENoYXRJZDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uc1N0b3JlID0gdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpXG4gICAgICBjb25zdCBjYWNoZWRNZXNzYWdlcyA9IHNlc3Npb25zU3RvcmUuZ2V0TWVzc2FnZXModGFyZ2V0Q2hhdElkKVxuICAgICAgY29uc3QgY2FjaGUgPSBzZXNzaW9uc1N0b3JlLmdldFZpZXdDYWNoZSh0YXJnZXRDaGF0SWQpXG5cbiAgICAgIHNldE1lc3NhZ2VzKGNhY2hlZE1lc3NhZ2VzKVxuICAgICAgc2V0TGFzdEV2YWx1YXRlZEtleShjYWNoZT8ubGFzdEV2YWx1YXRlZEtleSA/PyAwKVxuICAgICAgaW5pdGlhbExvYWREb25lLmN1cnJlbnQgPSB0cnVlXG5cbiAgICAgIGlmIChjYWNoZT8uYWdlbnRTbmFwc2hvdCkge1xuICAgICAgICBzZWxlY3RBZ2VudChjYWNoZS5hZ2VudFNuYXBzaG90KVxuICAgICAgfVxuXG4gICAgICBpZiAoY2FjaGU/LmNvbnZlcnNhdGlvbk1ldGEpIHtcbiAgICAgICAgYXdhaXQgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YSh7XG4gICAgICAgICAgcHJvamVjdElkTWVzc2FnZTogY2FjaGUuY29udmVyc2F0aW9uTWV0YS5wcm9qZWN0SWRNZXNzYWdlLFxuICAgICAgICAgIHByb2plY3ROYW1lRnJvbVNlc3Npb246IGNhY2hlLmNvbnZlcnNhdGlvbk1ldGEucHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnRJZEZyb21TZXNzaW9uOiBjYWNoZS5jb252ZXJzYXRpb25NZXRhLmNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZUZyb21TZXNzaW9uOiBjYWNoZS5jb252ZXJzYXRpb25NZXRhLmNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrSWRGcm9tU2Vzc2lvbjogY2FjaGUuY29udmVyc2F0aW9uTWV0YS50YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrTmFtZUZyb21TZXNzaW9uOiBjYWNoZS5jb252ZXJzYXRpb25NZXRhLnRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChjYWNoZT8uc2Vzc2lvbk1ldGFFdmVudCkge1xuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnbWFpYS1jaGF0LXNlc3Npb24tbWV0YScsIHtcbiAgICAgICAgICAgIGRldGFpbDogY2FjaGUuc2Vzc2lvbk1ldGFFdmVudCxcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIG1hcmtPcGVuZWRTZXNzaW9uQXNSZWFkSWZWaXNpYmxlKHRhcmdldENoYXRJZClcbiAgICB9LFxuICAgIFtzZWxlY3RBZ2VudCwgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YV1cbiAgKVxuXG4gIGNvbnN0IGxvYWRNZXNzYWdlcyA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChvcHRpb25zPzogTG9hZE1lc3NhZ2VzT3B0aW9ucykgPT4ge1xuICAgICAgaWYgKCFvcHRpb25zPy5mb3JjZSAmJiB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuY2FuUmVzdG9yZVNlc3Npb24oY2hhdElkKSkge1xuICAgICAgICBhd2FpdCByZXN0b3JlU2Vzc2lvbkZyb21TdG9yZShjaGF0SWQpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBsb2FkU2VxUmVmLmN1cnJlbnQgKz0gMVxuICAgICAgY29uc3Qgc2VxID0gbG9hZFNlcVJlZi5jdXJyZW50XG4gICAgICBjb25zdCB0YXJnZXRDaGF0SWQgPSBjaGF0SWRcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0TG9hZGluZ01lc3NhZ2VzKHRydWUpXG4gICAgICAgIGluaXRpYWxMb2FkRG9uZS5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgbGV0IGFnZW50U25hcHNob3Q6IEFnZW50IHwgbnVsbCA9IG51bGxcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGl0ZW1zLFxuICAgICAgICAgIG5leHRJdGVtLFxuICAgICAgICAgIGFnZW50RGVsZXRlZCxcbiAgICAgICAgICBhZ2VudE5vUGVybWlzc2lvbixcbiAgICAgICAgICBoYXNBZ2VudEFjY2VzcyxcbiAgICAgICAgICBoYXNBZ2VudFBlcm1pc3Npb24sXG4gICAgICAgICAgYWdlbnRUeXBlOiBhZ2VudFR5cGVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBhZ2VudEVudGl0eTogYWdlbnRFbnRpdHlGcm9tU2Vzc2lvbixcbiAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWU6IHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgcHJvamVjdERlbGV0ZWQsXG4gICAgICAgICAgY2xpZW50SWQ6IGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZTogY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tJZDogdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza05hbWU6IHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH0gPSBhd2FpdCBtYWlhLkNoYXRzLmdldENoYXRNZXNzYWdlcyh7XG4gICAgICAgICAgY2hhdElkOiB0YXJnZXRDaGF0SWQsXG4gICAgICAgICAgY3VycmVudFVzZXIsXG4gICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgIGNhbmNlbGxlZFRleHQ6IHQoJ2NoYXQuY2FuY2VsbGVkJyksXG4gICAgICAgICAgbGFuZzogbWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKSxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoc2hvdWxkQWJvcnRTdGFsZU1lc3NhZ2VMb2FkKHNlcSwgbG9hZFNlcVJlZi5jdXJyZW50LCB0YXJnZXRDaGF0SWQsIGNoYXRJZCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlc3Npb25BZ2VudCA9IHJlc29sdmVTZXNzaW9uQWdlbnRGcm9tQ2hhdExvYWQoe1xuICAgICAgICAgIGFnZW50RGVsZXRlZCxcbiAgICAgICAgICBhZ2VudE5vUGVybWlzc2lvbixcbiAgICAgICAgICBhZ2VudHMsXG4gICAgICAgICAgdXNlckNhblZpZXdBZ2VudHM6IEJvb2xlYW4odXNlclBlcm1pc3Npb25zPy52aWV3KSxcbiAgICAgICAgICBoYXNBZ2VudEFjY2VzczogQm9vbGVhbihoYXNBZ2VudEFjY2VzcyksXG4gICAgICAgICAgaGFzQWdlbnRQZXJtaXNzaW9uOiBCb29sZWFuKGhhc0FnZW50UGVybWlzc2lvbiksXG4gICAgICAgICAgcHJvamVjdERlbGV0ZWQsXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChzZXNzaW9uQWdlbnQpIHtcbiAgICAgICAgICBzZWxlY3RBZ2VudChzZXNzaW9uQWdlbnQpXG4gICAgICAgICAgYWdlbnRTbmFwc2hvdCA9IHNlc3Npb25BZ2VudFxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YSh7XG4gICAgICAgICAgcHJvamVjdElkTWVzc2FnZSxcbiAgICAgICAgICBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gTWV0YWRhdGEgZGUgbGEgc2Vzc2lvbiAoYWdlbnRfdHlwZSAvIGFnZW50X2VudGl0eSArIGNvbnRleHRvKSBwYXJhIGVsIGNhcnRlbCBkZVxuICAgICAgICAvLyBcImNvbnRpbnVhciBlbiB1biBjaGF0IG51ZXZvXCIgZGVsIGZvb3RlciBjdWFuZG8gc2UgYWJyZSB1bmEgY29udmVyc2FjacOzbiBkZSB1biBjbG9uZSBsZWdhY3kuXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdtYWlhLWNoYXQtc2Vzc2lvbi1tZXRhJywge1xuICAgICAgICAgICAgZGV0YWlsOiBidWlsZFNlc3Npb25NZXRhRXZlbnREZXRhaWwoY2hhdElkLCB7XG4gICAgICAgICAgICAgIGFnZW50VHlwZTogYWdlbnRUeXBlRnJvbVNlc3Npb24sXG4gICAgICAgICAgICAgIGFnZW50RW50aXR5OiBhZ2VudEVudGl0eUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgICAgIHByb2plY3ROYW1lOiBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgICBjbGllbnRJZDogY2xpZW50SWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICAgICAgY2xpZW50TmFtZTogY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgICB0YXNrSWQ6IHRhc2tJZEZyb21TZXNzaW9uLFxuICAgICAgICAgICAgICB0YXNrTmFtZTogdGFza05hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0pXG4gICAgICAgIClcblxuICAgICAgICBjb25zdCBpdGVtc1RvU2V0ID0gYXdhaXQgcmV3cml0ZU1lc3NhZ2VzRm9yUHJvamVjdFRhc2tVcmxzKGl0ZW1zLCBwcm9qZWN0SWRNZXNzYWdlLCBnZXRUYWJUYXNrRGVmYXVsdClcbiAgICAgICAgY29uc3Qgc2Vzc2lvbk1ldGEgPSB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuZ2V0TWV0YShjaGF0SWQpXG4gICAgICAgIGNvbnN0IGZpbmFsTWVzc2FnZXMgPSByZXNvbHZlRmluYWxNZXNzYWdlc1dpdGhBY3RpdmVTdHJlYW1pbmdUYWlsKFxuICAgICAgICAgIGl0ZW1zVG9TZXQsXG4gICAgICAgICAgdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLmdldE1lc3NhZ2VzKGNoYXRJZCksXG4gICAgICAgICAgc2Vzc2lvbk1ldGE/LnN0YXR1c1xuICAgICAgICApXG5cbiAgICAgICAgY29uc3QgY29udmVyc2F0aW9uTWV0YSA9IGJ1aWxkU2Vzc2lvbkNvbnZlcnNhdGlvbk1ldGEoe1xuICAgICAgICAgIHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnRJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrTmFtZUZyb21TZXNzaW9uLFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHNlc3Npb25NZXRhRXZlbnQgPSBidWlsZFNlc3Npb25NZXRhRXZlbnREZXRhaWwoY2hhdElkLCB7XG4gICAgICAgICAgYWdlbnRUeXBlOiBhZ2VudFR5cGVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBhZ2VudEVudGl0eTogYWdlbnRFbnRpdHlGcm9tU2Vzc2lvbixcbiAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWU6IHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50SWQ6IGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZTogY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tJZDogdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza05hbWU6IHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH0pXG5cbiAgICAgICAgc2V0TWVzc2FnZXMoZmluYWxNZXNzYWdlcylcbiAgICAgICAgY29uc3QgcGFnaW5hdGlvbktleSA9IE51bWJlcihuZXh0SXRlbSlcbiAgICAgICAgc2V0TGFzdEV2YWx1YXRlZEtleShwYWdpbmF0aW9uS2V5KVxuICAgICAgICBpbml0aWFsTG9hZERvbmUuY3VycmVudCA9IHRydWVcblxuICAgICAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuc2V0TWVzc2FnZXModGFyZ2V0Q2hhdElkLCBmaW5hbE1lc3NhZ2VzKVxuICAgICAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuc2V0Vmlld0NhY2hlKHRhcmdldENoYXRJZCwge1xuICAgICAgICAgIGh5ZHJhdGVkRnJvbUFwaTogdHJ1ZSxcbiAgICAgICAgICBsYXN0RXZhbHVhdGVkS2V5OiBwYWdpbmF0aW9uS2V5LFxuICAgICAgICAgIGNvbnZlcnNhdGlvbk1ldGEsXG4gICAgICAgICAgc2Vzc2lvbk1ldGFFdmVudCxcbiAgICAgICAgICBhZ2VudFNuYXBzaG90LFxuICAgICAgICB9KVxuXG4gICAgICAgIG1hcmtPcGVuZWRTZXNzaW9uQXNSZWFkSWZWaXNpYmxlKHRhcmdldENoYXRJZClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghc2hvdWxkQWJvcnRTdGFsZU1lc3NhZ2VMb2FkKHNlcSwgbG9hZFNlcVJlZi5jdXJyZW50LCB0YXJnZXRDaGF0SWQsIGNoYXRJZCkpIHtcbiAgICAgICAgICBvbkVycm9yPy4oKVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoIXNob3VsZEFib3J0U3RhbGVNZXNzYWdlTG9hZChzZXEsIGxvYWRTZXFSZWYuY3VycmVudCwgdGFyZ2V0Q2hhdElkLCBjaGF0SWQpKSB7XG4gICAgICAgICAgc2V0TG9hZGluZ01lc3NhZ2VzKGZhbHNlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBjaGF0SWQsXG4gICAgICBjdXJyZW50VXNlcixcbiAgICAgIHNldENvbnZlcnNhdGlvbkNvbnRleHRGcm9tTWV0YWRhdGEsXG4gICAgICBvbkVycm9yLFxuICAgICAgZ2V0VGFiVGFza0RlZmF1bHQsXG4gICAgICByZXN0b3JlU2Vzc2lvbkZyb21TdG9yZSxcbiAgICAgIHNlbGVjdEFnZW50LFxuICAgICAgYWdlbnRzLFxuICAgICAgdCxcbiAgICAgIGkxOG4ubGFuZ3VhZ2UsXG4gICAgICB1c2VyUGVybWlzc2lvbnM/LnZpZXcsXG4gICAgXVxuICApXG5cbiAgY29uc3QgbG9hZE1vcmVNZXNzYWdlcyA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChjb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgICAgaWYgKGlzTG9hZGluZ1JlZi5jdXJyZW50IHx8ICFsYXN0RXZhbHVhdGVkS2V5IHx8ICFjb250YWluZXIpIHJldHVyblxuICAgICAgdHJ5IHtcbiAgICAgICAgaXNMb2FkaW5nUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICAgIHNldElzTG9hZGluZ01vcmVNZXNzYWdlcyh0cnVlKVxuXG4gICAgICAgIGNvbnN0IG9sZFNjcm9sbFRvcCA9IGNvbnRhaW5lci5zY3JvbGxUb3BcblxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgaXRlbXMsXG4gICAgICAgICAgbmV4dEl0ZW0sXG4gICAgICAgICAgcHJvamVjdElkOiBwcm9qZWN0SWRNZXNzYWdlLFxuICAgICAgICAgIHByb2plY3ROYW1lOiBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudElkOiBjbGllbnRJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudE5hbWU6IGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrSWQ6IHRhc2tJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tOYW1lOiB0YXNrTmFtZUZyb21TZXNzaW9uLFxuICAgICAgICB9ID0gYXdhaXQgbWFpYS5DaGF0cy5nZXRDaGF0TWVzc2FnZXMoe1xuICAgICAgICAgIGNoYXRJZCxcbiAgICAgICAgICBjdXJyZW50VXNlcixcbiAgICAgICAgICBvZmZzZXQ6IGxhc3RFdmFsdWF0ZWRLZXksXG4gICAgICAgICAgbGFuZzogbWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKSxcbiAgICAgICAgfSlcblxuICAgICAgICBhd2FpdCBzZXRDb252ZXJzYXRpb25Db250ZXh0RnJvbU1ldGFkYXRhKHtcbiAgICAgICAgICBwcm9qZWN0SWRNZXNzYWdlLFxuICAgICAgICAgIHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50SWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza05hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBTaSBoYXkgcHJveWVjdG8gZW4gbGEgY29udmVyc2FjacOzbiwgcmVlc2NyaWJpciBVUkxzIGRlIHRhcmVhcyBlbiBsb3MgbWVuc2FqZXMgY2FyZ2Fkb3NcbiAgICAgICAgY29uc3QgaXRlbXNUb01lcmdlID0gYXdhaXQgcmV3cml0ZU1lc3NhZ2VzRm9yUHJvamVjdFRhc2tVcmxzKGl0ZW1zLCBwcm9qZWN0SWRNZXNzYWdlLCBnZXRUYWJUYXNrRGVmYXVsdClcbiAgICAgICAgLy8gVGhlIEFQSSBwYWdpbmF0ZXMgb2xkZXN0LWZpcnN0OiBzdWJzZXF1ZW50IHBhZ2VzIGJlbG9uZyBhZnRlciB0aGVcbiAgICAgICAgLy8gbG9hZGVkIGNvbnZlcnNhdGlvbiwgbmV2ZXIgYmV0d2VlbiBpdHMgZmlyc3QgcXVlc3Rpb24gYW5kIGFuc3dlci5cbiAgICAgICAgY29uc3QgbmV3TWVzc2FnZXMgPSBbLi4ubWVzc2FnZXMsIC4uLml0ZW1zVG9NZXJnZV1cbiAgICAgICAgc2V0TWVzc2FnZXMobmV3TWVzc2FnZXMpXG4gICAgICAgIGNvbnN0IHBhZ2luYXRpb25LZXkgPSBOdW1iZXIobmV4dEl0ZW0pXG4gICAgICAgIHNldExhc3RFdmFsdWF0ZWRLZXkocGFnaW5hdGlvbktleSlcbiAgICAgICAgc3luY01lc3NhZ2VzVG9TdG9yZShjaGF0SWQsIG5ld01lc3NhZ2VzLCBwYWdpbmF0aW9uS2V5KVxuXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclJlZiA9IGNvbnRhaW5lclxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lclJlZikge1xuICAgICAgICAgICAgICBjb250YWluZXJSZWYuc2Nyb2xsVG9wID0gb2xkU2Nyb2xsVG9wXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIG9uRXJyb3I/LigpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc0xvYWRpbmdNb3JlTWVzc2FnZXMoZmFsc2UpXG4gICAgICAgIGlzTG9hZGluZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIGNoYXRJZCxcbiAgICAgIGN1cnJlbnRVc2VyLFxuICAgICAgbGFzdEV2YWx1YXRlZEtleSxcbiAgICAgIG9uRXJyb3IsXG4gICAgICBtZXNzYWdlcyxcbiAgICAgIGdldFRhYlRhc2tEZWZhdWx0LFxuICAgICAgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YSxcbiAgICAgIHN5bmNNZXNzYWdlc1RvU3RvcmUsXG4gICAgXVxuICApXG5cbiAgY29uc3QgaGFuZGxlU2Nyb2xsID0gdXNlQ2FsbGJhY2soXG4gICAgKGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgfCBudWxsKSA9PiB7XG4gICAgICBpZiAoIWNvbnRhaW5lciB8fCBpc0xvYWRpbmdSZWYuY3VycmVudCB8fCAhaW5pdGlhbExvYWREb25lLmN1cnJlbnQpIHJldHVyblxuXG4gICAgICBjb25zdCB7IHNjcm9sbFRvcCwgc2Nyb2xsSGVpZ2h0LCBjbGllbnRIZWlnaHQgfSA9IGNvbnRhaW5lclxuICAgICAgaWYgKHNob3VsZExvYWRNb3JlTWVzc2FnZXNPblNjcm9sbChzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0KSkge1xuICAgICAgICBsb2FkTW9yZU1lc3NhZ2VzKGNvbnRhaW5lcilcbiAgICAgIH1cbiAgICB9LFxuICAgIFtsb2FkTW9yZU1lc3NhZ2VzXVxuICApXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoY2hhdElkICE9PSBwcmV2aW91c0NoYXRJZC5jdXJyZW50KSB7XG4gICAgICBjb25zdCBjYW5SZXN0b3JlID0gdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLmNhblJlc3RvcmVTZXNzaW9uKGNoYXRJZClcblxuICAgICAgaXNMb2FkaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgaW5pdGlhbExvYWREb25lLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgcHJldmlvdXNDaGF0SWQuY3VycmVudCA9IGNoYXRJZFxuICAgICAgc2V0TGFzdEV2YWx1YXRlZEtleSgwKVxuICAgICAgbG9hZFNlcVJlZi5jdXJyZW50ICs9IDFcblxuICAgICAgcmVmZXRjaFRhYlRhc2tEZWZhdWx0KClcblxuICAgICAgY29uc3QgcGVuZGluZ0luaXRpYWxNZXNzYWdlID0gaGFzTWVhbmluZ2Z1bFVzZXJJbml0aWFsTWVzc2FnZSh1c2VySW5pdGlhbE1lc3NhZ2UpXG5cbiAgICAgIGlmICghcGVuZGluZ0luaXRpYWxNZXNzYWdlICYmIGNhblJlc3RvcmUpIHtcbiAgICAgICAgcmVzdG9yZVNlc3Npb25Gcm9tU3RvcmUoY2hhdElkKS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW3VzZUNoYXRNZXNzYWdlc10gcmVzdG9yZVNlc3Npb25Gcm9tU3RvcmUgZmFpbGVkJywgZXJyb3IpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBzZXRNZXNzYWdlcyhcbiAgICAgICAgcGVuZGluZ0luaXRpYWxNZXNzYWdlICYmIHVzZXJJbml0aWFsTWVzc2FnZVxuICAgICAgICAgID8gYnVpbGRJbml0aWFsTWVzc2FnZVBsYWNlaG9sZGVyKHVzZXJJbml0aWFsTWVzc2FnZSwgY3VycmVudFVzZXIpXG4gICAgICAgICAgOiBbXVxuICAgICAgKVxuXG4gICAgICAvLyBMaW1waWFyIGVsIGVzdGFkbyBkZWwgcHJveWVjdG8geSBsYSB0YXJlYSBjdWFuZG8gY2FtYmlhIGRlIGNvbnZlcnNhY2nDs25cbiAgICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgc2V0VGFzayhudWxsKVxuXG4gICAgICBpZiAoIXBlbmRpbmdJbml0aWFsTWVzc2FnZSkge1xuICAgICAgICBsb2FkTWVzc2FnZXMoKVxuICAgICAgfVxuICAgIH1cbiAgfSwgW1xuICAgIGNoYXRJZCxcbiAgICB1c2VySW5pdGlhbE1lc3NhZ2UsXG4gICAgY3VycmVudFVzZXIsXG4gICAgbG9hZE1lc3NhZ2VzLFxuICAgIHJlc3RvcmVTZXNzaW9uRnJvbVN0b3JlLFxuICAgIHNldENoaXBzUHJvamVjdCxcbiAgICBzZXRQcm9qZWN0LFxuICAgIHNldFRhc2ssXG4gICAgcmVmZXRjaFRhYlRhc2tEZWZhdWx0LFxuICBdKVxuXG4gIC8vIEN1YW5kbyB0YWJUYXNrRGVmYXVsdCBwYXNhIGEgZXN0YXIgZGlzcG9uaWJsZSBkZXNwdcOpcyBkZSBjYXJnYXIsIHJlZXNjcmliaXIgVVJMcyBkZSB0YXJlYXMgZW4gbG9zIG1lbnNhamVzIHlhIGNhcmdhZG9zLlxuICAvLyBSZWYgcGFyYSBldml0YXIgYnVjbGU6IHNldE1lc3NhZ2VzKHJld3JpdHRlbikgY2FtYmlhIG1lc3NhZ2VzIHkgcmUtZWplY3V0YSBlbCBlZmVjdG87IHNvbG8gcmVlc2NyaWJpbW9zIHVuYSB2ZXogcG9yIGxvdGUuXG4gIGNvbnN0IGRpZFJld3JpdGVSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCF0YWJUYXNrRGVmYXVsdCB8fCAhcHJvamVjdD8uaWQgfHwgbWVzc2FnZXMubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICBjb25zdCB0YWJTZWdtZW50ID0gYC8ke3RhYlRhc2tEZWZhdWx0fWBcbiAgICBjb25zdCBuZWVkc1Jld3JpdGUgPSBtZXNzYWdlc05lZWRUYWJSZXdyaXRlKG1lc3NhZ2VzLCB0YWJUYXNrRGVmYXVsdClcbiAgICBpZiAoIW5lZWRzUmV3cml0ZSkge1xuICAgICAgZGlkUmV3cml0ZVJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGlkUmV3cml0ZVJlZi5jdXJyZW50KSByZXR1cm5cbiAgICBkaWRSZXdyaXRlUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgY29uc3QgcmV3cml0dGVuID0gbWVzc2FnZXMubWFwKG1zZyA9PiAoe1xuICAgICAgLi4ubXNnLFxuICAgICAgbWVzc2FnZTogcmV3cml0ZVRhc2tVcmxzSW5Db250ZW50KG1zZy5tZXNzYWdlIHx8ICcnLCB0YWJTZWdtZW50KSxcbiAgICB9KSlcbiAgICBzZXRNZXNzYWdlcyhyZXdyaXR0ZW4pXG4gICAgc3luY01lc3NhZ2VzVG9TdG9yZShjaGF0SWQsIHJld3JpdHRlbilcbiAgfSwgW3RhYlRhc2tEZWZhdWx0LCBwcm9qZWN0Py5pZCwgbWVzc2FnZXMsIGNoYXRJZCwgc3luY01lc3NhZ2VzVG9TdG9yZV0pXG5cbiAgLy8gRWwgdXBkYXRlciBkZSBgdXNlU3RhdGVgIHRpZW5lIHF1ZSBzZXIgcHVybzogUmVhY3QgbG8gZWplY3V0YSBlbiBmYXNlIGRlXG4gIC8vIHJlbmRlciB5IGBzeW5jTWVzc2FnZXNUb1N0b3JlYCBlc2NyaWJlIGVuIHVuIHN0b3JlIGV4dGVybm8sIGxvIHF1ZSBkaXNwYXJhXG4gIC8vIFwiQ2Fubm90IHVwZGF0ZSBhIGNvbXBvbmVudCB3aGlsZSByZW5kZXJpbmcgYSBkaWZmZXJlbnQgY29tcG9uZW50XCIuIFNlXG4gIC8vIGNvbXB1dGEgY29udHJhIGVzdGUgZXNwZWpvIHBhcmEgcG9kZXIgZW5jYWRlbmFyIHZhcmlhcyBtdXRhY2lvbmVzIGVuIGVsXG4gIC8vIG1pc21vIHRpY2sgKHAuIGVqLiByZW1vdmUgKyBhZGQgZGVsIHN3YXAgZGUgZmluIGRlIHN0cmVhbSkgc2luIGRlcGVuZGVyIGRlXG4gIC8vIHF1ZSBSZWFjdCB5YSBoYXlhIHJlLXJlbmRlcml6YWRvLlxuICBjb25zdCBtZXNzYWdlc1JlZiA9IHVzZVJlZihtZXNzYWdlcylcbiAgbWVzc2FnZXNSZWYuY3VycmVudCA9IG1lc3NhZ2VzXG5cbiAgY29uc3QgYXBwbHlNZXNzYWdlcyA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXh0TWVzc2FnZXM6IENoYXRNZXNzYWdlW10pID0+IHtcbiAgICAgIG1lc3NhZ2VzUmVmLmN1cnJlbnQgPSBuZXh0TWVzc2FnZXNcbiAgICAgIHNldE1lc3NhZ2VzKG5leHRNZXNzYWdlcylcbiAgICAgIHN5bmNNZXNzYWdlc1RvU3RvcmUoY2hhdElkLCBuZXh0TWVzc2FnZXMpXG4gICAgfSxcbiAgICBbY2hhdElkLCBzeW5jTWVzc2FnZXNUb1N0b3JlXVxuICApXG5cbiAgY29uc3QgYWRkTWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgIChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xuICAgICAgYXBwbHlNZXNzYWdlcyh1cHNlcnRDaGF0TWVzc2FnZShtZXNzYWdlc1JlZi5jdXJyZW50LCBtZXNzYWdlKSlcbiAgICB9LFxuICAgIFthcHBseU1lc3NhZ2VzXVxuICApXG5cbiAgY29uc3QgcmVtb3ZlTWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgIChtZXNzYWdlSWQ6IHN0cmluZykgPT4ge1xuICAgICAgYXBwbHlNZXNzYWdlcyhtZXNzYWdlc1JlZi5jdXJyZW50LmZpbHRlcihtc2cgPT4gbXNnLmlkICE9PSBtZXNzYWdlSWQpKVxuICAgIH0sXG4gICAgW2FwcGx5TWVzc2FnZXNdXG4gIClcblxuICByZXR1cm4ge1xuICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICBtZXNzYWdlcyxcbiAgICBoYXNNb3JlTWVzc2FnZXM6ICEhbGFzdEV2YWx1YXRlZEtleSxcbiAgICBpc0xvYWRpbmdNb3JlTWVzc2FnZXMsXG4gICAgbG9hZE1lc3NhZ2VzLFxuICAgIGxvYWRNb3JlTWVzc2FnZXMsXG4gICAgYWRkTWVzc2FnZSxcbiAgICByZW1vdmVNZXNzYWdlLFxuICAgIC8vIGByZXBsYWNlTWVzc2FnZXNgIGRlIG1hc3RlciBoYWPDrWEgbG8gbWlzbW8gcXVlIGBhcHBseU1lc3NhZ2VzYCBwZXJvIHNpblxuICAgIC8vIHNpbmNyb25pemFyIGBtZXNzYWdlc1JlZmAsIHkgZXNhIHJlZiBlcyBsYSBxdWUgZXZpdGEgbG9zIHVwZGF0ZXJzIGltcHVyb3MuXG4gICAgcmVwbGFjZU1lc3NhZ2VzOiBhcHBseU1lc3NhZ2VzLFxuICAgIGhhbmRsZVNjcm9sbCxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQSxTQUFTQSxXQUFXLEVBQUVDLFFBQVEsRUFBRUMsTUFBTSxFQUFFQyxTQUFTLFFBQVEsT0FBTztBQUNoRSxTQUFTQyxXQUFXLFFBQVEsZ0JBQWdCO0FBRTVDLE9BQU9DLElBQUks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