@projectcor/maia-components 2.11.96-0 → 2.11.96-1

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 (79) hide show
  1. package/lib/components/atoms/Chip/Chip.js +12 -5
  2. package/lib/components/atoms/Chip/styles.js +6 -6
  3. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +121 -28
  4. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.styles.js +6 -2
  5. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +88 -25
  6. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +33 -19
  7. package/lib/components/atoms/MAIAInput/MAIAInput.js +385 -270
  8. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +5 -8
  9. package/lib/components/atoms/MAIAInput/maiaInputLayout.js +23 -0
  10. package/lib/components/atoms/MAIAInput/styles.js +99 -83
  11. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +54 -41
  12. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.styles.js +25 -12
  13. package/lib/components/atoms/icons/MaiaInputAddIcon.js +42 -0
  14. package/lib/components/atoms/icons/MaiaInputAttachIcon.js +29 -0
  15. package/lib/components/atoms/icons/MaiaInputAttachmentImageIcon.js +33 -0
  16. package/lib/components/atoms/icons/MaiaInputDeepSearchIcon.js +35 -0
  17. package/lib/components/atoms/icons/MaiaInputMentionIcon.js +44 -0
  18. package/lib/components/atoms/icons/MaiaInputRobotIcon.js +29 -0
  19. package/lib/components/atoms/icons/MaiaInputSendIcon.js +29 -0
  20. package/lib/components/atoms/icons/MaiaInputSlashIcon.js +29 -0
  21. package/lib/components/atoms/icons/MaiaInputWebSearchIcon.js +35 -0
  22. package/lib/components/atoms/icons/index.js +10 -2
  23. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +18 -7
  24. package/lib/components/molecules/ChatAIHome/styles.js +54 -38
  25. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +17 -81
  26. package/lib/components/molecules/ChatAIMessages/newStyles.js +10 -26
  27. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +62 -196
  28. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +18 -28
  29. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +2 -12
  30. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +3 -22
  31. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +1 -5
  32. package/lib/components/molecules/ChatFooter/ChatFooter.js +24 -65
  33. package/lib/components/molecules/Sidebar/Sidebar.js +73 -109
  34. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +1 -16
  35. package/lib/components/molecules/Sidebar/Sidebar.styles.js +29 -34
  36. package/lib/components/organisms/ChatAI/ChatAI.js +2 -6
  37. package/lib/hooks/useChatManager/useChatManager.js +438 -530
  38. package/lib/hooks/useChatMessages/useChatMessages.js +236 -414
  39. package/lib/hooks/useChats/useChats.js +4 -21
  40. package/lib/hooks/useMentionPopover.js +4 -2
  41. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +1 -1
  42. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +521 -139
  43. package/lib/hooks/useStreamingMessage/index.js +3 -2
  44. package/lib/hooks/useStreamingMessage/streamingStore.js +69 -0
  45. package/lib/hooks/useStreamingMessage/useStreamingMessage.js +17 -13
  46. package/lib/lang/br/index.js +6 -13
  47. package/lib/lang/en/index.js +6 -13
  48. package/lib/lang/es/index.js +6 -13
  49. package/lib/lang/fr/index.js +9 -14
  50. package/lib/services/maia/Chats/getChatsByUserId.js +4 -6
  51. package/lib/services/maia/Chats/index.js +1 -3
  52. package/lib/store/chatsStore.types.js +1 -1
  53. package/lib/store/useChatsStore.js +12 -149
  54. package/lib/styles/config.js +2 -2
  55. package/lib/types/Chat.js +1 -1
  56. package/package.json +1 -1
  57. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.js +0 -17
  58. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.styles.js +0 -15
  59. package/lib/components/atoms/SessionGeneratingDot/index.js +0 -2
  60. package/lib/components/atoms/icons/MaiaSparkleIcon.js +0 -75
  61. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.js +0 -55
  62. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.styles.js +0 -46
  63. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/index.js +0 -2
  64. package/lib/services/maia/Chats/markSessionAsRead.js +0 -32
  65. package/lib/store/chatsSidebarOptimistic.js +0 -92
  66. package/lib/store/maiaMinimizedPersistence.js +0 -49
  67. package/lib/store/sessions/activeView.js +0 -22
  68. package/lib/store/sessions/index.js +0 -9
  69. package/lib/store/sessions/sessionHitlContext.js +0 -15
  70. package/lib/store/sessions/sessionNotificationSound.js +0 -57
  71. package/lib/store/sessions/sessionNotifications.js +0 -110
  72. package/lib/store/sessions/sessionNotifications.types.js +0 -2
  73. package/lib/store/sessions/sessionStreamManager.js +0 -576
  74. package/lib/store/sessions/sessionStreamingText.js +0 -80
  75. package/lib/store/sessions/sessions.types.js +0 -35
  76. package/lib/store/sessions/useSessionMeta.js +0 -39
  77. package/lib/store/sessions/useSessionStreamingText.js +0 -18
  78. package/lib/store/sessions/useSessionsStore.js +0 -197
  79. package/lib/utils/formatUnreadCount.js +0 -6
@@ -1,7 +1,7 @@
1
1
  import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
2
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
3
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
4
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
5
5
  import _regeneratorRuntime from "@babel/runtime/regenerator";
6
6
  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
7
  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; }
@@ -17,28 +17,6 @@ import { useTabTaskDefault } from '../useTabTaskDefault';
17
17
  import { TASK_URL_REGEX_PATTERN } from '../../constants/taskUrls';
18
18
  import { mapCORLang } from '../../lang/utils';
19
19
  import { formatQuickActionMessageForDisplay } from '../../utils/formatQuickActionMessage';
20
- import { useSessionsStore } from '../../store/sessions/useSessionsStore';
21
- import { isActiveSessionStatus } from '../../store/sessions/sessions.types';
22
- /** El modal usa `{ message: '', attachments: [] }` como "sin mensaje inicial"; no es falsy. */
23
- var hasMeaningfulUserInitialMessage = function hasMeaningfulUserInitialMessage(userInitialMessage) {
24
- var _userInitialMessage$m, _userInitialMessage$a;
25
- 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));
26
- };
27
- var buildInitialMessagePlaceholder = function buildInitialMessagePlaceholder(userInitialMessage, currentUser) {
28
- return [_objectSpread(_objectSpread({
29
- id: 'user-initial-message',
30
- date: new Date(),
31
- user: currentUser,
32
- message: formatQuickActionMessageForDisplay(userInitialMessage.message, {
33
- fuaId: userInitialMessage.fuaId,
34
- scId: userInitialMessage.scId
35
- })
36
- }, userInitialMessage.attachments ? {
37
- attachments: userInitialMessage.attachments
38
- } : {}), buildContextMessage(userInitialMessage.mentions) ? {
39
- contextMessage: buildContextMessage(userInitialMessage.mentions)
40
- } : {})];
41
- };
42
20
  var rewriteTaskUrlsInContent = function rewriteTaskUrlsInContent(content, tabSegment) {
43
21
  var taskUrlRegex = new RegExp(TASK_URL_REGEX_PATTERN, 'g');
44
22
  return content.replace(taskUrlRegex, function (url) {
@@ -62,9 +40,19 @@ export var useChatMessages = function useChatMessages(_ref) {
62
40
  _useState2 = _slicedToArray(_useState, 2),
63
41
  loadingMessages = _useState2[0],
64
42
  setLoadingMessages = _useState2[1];
65
- var _useState3 = useState(function () {
66
- return hasMeaningfulUserInitialMessage(userInitialMessage) && userInitialMessage ? buildInitialMessagePlaceholder(userInitialMessage, currentUser) : [];
67
- }),
43
+ var _useState3 = useState(userInitialMessage ? [_objectSpread(_objectSpread({
44
+ id: 'user-initial-message',
45
+ date: new Date(),
46
+ user: currentUser,
47
+ message: formatQuickActionMessageForDisplay(userInitialMessage.message, {
48
+ fuaId: userInitialMessage.fuaId,
49
+ scId: userInitialMessage.scId
50
+ })
51
+ }, userInitialMessage.attachments ? {
52
+ attachments: userInitialMessage.attachments
53
+ } : {}), buildContextMessage(userInitialMessage.mentions) ? {
54
+ contextMessage: buildContextMessage(userInitialMessage.mentions)
55
+ } : {})] : []),
68
56
  _useState4 = _slicedToArray(_useState3, 2),
69
57
  messages = _useState4[0],
70
58
  setMessages = _useState4[1];
@@ -92,15 +80,6 @@ export var useChatMessages = function useChatMessages(_ref) {
92
80
  var isLoadingRef = useRef(false);
93
81
  var initialLoadDone = useRef(false);
94
82
  var previousChatId = useRef(chatId);
95
- var loadSeqRef = useRef(0);
96
- var syncMessagesToStore = useCallback(function (targetChatId, nextMessages, lastEvaluatedKeyValue) {
97
- useSessionsStore.getState().setMessages(targetChatId, nextMessages);
98
- if (lastEvaluatedKeyValue !== undefined) {
99
- useSessionsStore.getState().patchViewCache(targetChatId, {
100
- lastEvaluatedKey: lastEvaluatedKeyValue
101
- });
102
- }
103
- }, []);
104
83
  var setConversationContextFromMetadata = useCallback(/*#__PURE__*/function () {
105
84
  var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref2) {
106
85
  var projectIdMessage, projectNameFromSession, clientIdFromSession, clientNameFromSession, taskIdFromSession, taskNameFromSession, projects, hasMultiAgentsAccess, projectIdNum, foundProject, _foundProject$client;
@@ -179,156 +158,118 @@ export var useChatMessages = function useChatMessages(_ref) {
179
158
  return _ref3.apply(this, arguments);
180
159
  };
181
160
  }(), [fetchProjects, setClient, setChipsProject, setProject, setTask]);
182
- var restoreSessionFromStore = useCallback(/*#__PURE__*/function () {
183
- var _ref4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(targetChatId) {
184
- var _cache$lastEvaluatedK;
185
- var sessionsStore, cachedMessages, cache;
186
- return _regeneratorRuntime.wrap(function (_context2) {
187
- while (1) switch (_context2.prev = _context2.next) {
188
- case 0:
189
- sessionsStore = useSessionsStore.getState();
190
- cachedMessages = sessionsStore.getMessages(targetChatId);
191
- cache = sessionsStore.getViewCache(targetChatId);
192
- setMessages(cachedMessages);
193
- setLastEvaluatedKey((_cache$lastEvaluatedK = cache === null || cache === void 0 ? void 0 : cache.lastEvaluatedKey) !== null && _cache$lastEvaluatedK !== void 0 ? _cache$lastEvaluatedK : 0);
194
- initialLoadDone.current = true;
195
- if (cache !== null && cache !== void 0 && cache.agentSnapshot) {
196
- selectAgent(cache.agentSnapshot);
197
- }
198
- if (!(cache !== null && cache !== void 0 && cache.conversationMeta)) {
199
- _context2.next = 1;
200
- break;
201
- }
202
- _context2.next = 1;
203
- return setConversationContextFromMetadata({
204
- projectIdMessage: cache.conversationMeta.projectIdMessage,
205
- projectNameFromSession: cache.conversationMeta.projectNameFromSession,
206
- clientIdFromSession: cache.conversationMeta.clientIdFromSession,
207
- clientNameFromSession: cache.conversationMeta.clientNameFromSession,
208
- taskIdFromSession: cache.conversationMeta.taskIdFromSession,
209
- taskNameFromSession: cache.conversationMeta.taskNameFromSession
161
+ var loadMessages = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
162
+ var _yield$maia$Chats$get, items, nextItem, agentDeleted, agentNoPermission, hasAgentAccess, hasAgentPermission, agentTypeFromSession, agentEntityFromSession, projectIdMessage, projectNameFromSession, projectDeleted, clientIdFromSession, clientNameFromSession, taskIdFromSession, taskNameFromSession, agentInList, contextProjectId, itemsToSet, tab, tabSegment, _t;
163
+ return _regeneratorRuntime.wrap(function (_context2) {
164
+ while (1) switch (_context2.prev = _context2.next) {
165
+ case 0:
166
+ _context2.prev = 0;
167
+ setLoadingMessages(true);
168
+ initialLoadDone.current = false;
169
+ _context2.next = 1;
170
+ return maia.Chats.getChatMessages({
171
+ chatId: chatId,
172
+ currentUser: currentUser,
173
+ offset: lastEvaluatedKey,
174
+ cancelledText: t('chat.cancelled'),
175
+ lang: mapCORLang(i18n.language)
176
+ });
177
+ case 1:
178
+ _yield$maia$Chats$get = _context2.sent;
179
+ items = _yield$maia$Chats$get.items;
180
+ nextItem = _yield$maia$Chats$get.nextItem;
181
+ agentDeleted = _yield$maia$Chats$get.agentDeleted;
182
+ agentNoPermission = _yield$maia$Chats$get.agentNoPermission;
183
+ hasAgentAccess = _yield$maia$Chats$get.hasAgentAccess;
184
+ hasAgentPermission = _yield$maia$Chats$get.hasAgentPermission;
185
+ agentTypeFromSession = _yield$maia$Chats$get.agentType;
186
+ agentEntityFromSession = _yield$maia$Chats$get.agentEntity;
187
+ projectIdMessage = _yield$maia$Chats$get.projectId;
188
+ projectNameFromSession = _yield$maia$Chats$get.projectName;
189
+ projectDeleted = _yield$maia$Chats$get.projectDeleted;
190
+ clientIdFromSession = _yield$maia$Chats$get.clientId;
191
+ clientNameFromSession = _yield$maia$Chats$get.clientName;
192
+ taskIdFromSession = _yield$maia$Chats$get.taskId;
193
+ taskNameFromSession = _yield$maia$Chats$get.taskName;
194
+ if (agentDeleted) {
195
+ selectAgent(_objectSpread({
196
+ id: agentDeleted.id,
197
+ name: agentDeleted.name,
198
+ emoji: agentDeleted.emoji,
199
+ type: 'custom',
200
+ is_deleted: true,
201
+ deleted_at: agentDeleted.deletedAt
202
+ }, agentNoPermission !== null && agentNoPermission !== void 0 && agentNoPermission.connectors ? {
203
+ connectors: agentNoPermission.connectors
204
+ } : {}));
205
+ }
206
+
207
+ // Si el agente no está en la lista pero tiene permisos, acceso y no está eliminado, setearlo normalmente
208
+ // Excluir agentes no-custom para usuarios con roles deshabilitados
209
+ if (agentNoPermission && !agentDeleted && userPermissions !== null && userPermissions !== void 0 && userPermissions.view && hasAgentAccess && hasAgentPermission && !agents.find(function (agent) {
210
+ return agent.id === agentNoPermission.id;
211
+ })) {
212
+ selectAgent(_objectSpread(_objectSpread({
213
+ id: agentNoPermission.id,
214
+ name: agentNoPermission.name,
215
+ emoji: agentNoPermission.emoji,
216
+ type: agentNoPermission.type,
217
+ is_from_conversation: true
218
+ }, agentNoPermission.connectors ? {
219
+ connectors: agentNoPermission.connectors
220
+ } : {}), projectDeleted ? {
221
+ project_deleted: {
222
+ name: projectDeleted.name
223
+ }
224
+ } : {}));
225
+ }
226
+
227
+ // Si el agente está en la lista y tiene acceso/permisos, actualizar project_deleted (o limpiarlo al cambiar de chat)
228
+ if (agentNoPermission && !agentDeleted && hasAgentAccess && hasAgentPermission && agents.find(function (a) {
229
+ return a.id === agentNoPermission.id;
230
+ })) {
231
+ agentInList = agents.find(function (a) {
232
+ return a.id === agentNoPermission.id;
210
233
  });
211
- case 1:
212
- if (cache !== null && cache !== void 0 && cache.sessionMetaEvent) {
213
- document.dispatchEvent(new CustomEvent('maia-chat-session-meta', {
214
- detail: cache.sessionMetaEvent
234
+ if (agentInList) {
235
+ selectAgent(_objectSpread(_objectSpread(_objectSpread({}, agentInList), agentNoPermission.connectors ? {
236
+ connectors: agentNoPermission.connectors
237
+ } : {}), projectDeleted ? {
238
+ project_deleted: {
239
+ name: projectDeleted.name
240
+ }
241
+ } : {
242
+ project_deleted: undefined
215
243
  }));
216
244
  }
217
- case 2:
218
- case "end":
219
- return _context2.stop();
220
- }
221
- }, _callee2);
222
- }));
223
- return function (_x2) {
224
- return _ref4.apply(this, arguments);
225
- };
226
- }(), [selectAgent, setConversationContextFromMetadata]);
227
- var loadMessages = useCallback(/*#__PURE__*/function () {
228
- var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(options) {
229
- 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;
230
- return _regeneratorRuntime.wrap(function (_context3) {
231
- while (1) switch (_context3.prev = _context3.next) {
232
- case 0:
233
- if (!(!(options !== null && options !== void 0 && options.force) && useSessionsStore.getState().canRestoreSession(chatId))) {
234
- _context3.next = 2;
235
- break;
236
- }
237
- _context3.next = 1;
238
- return restoreSessionFromStore(chatId);
239
- case 1:
240
- return _context3.abrupt("return");
241
- case 2:
242
- loadSeqRef.current += 1;
243
- seq = loadSeqRef.current;
244
- targetChatId = chatId;
245
- _context3.prev = 3;
246
- setLoadingMessages(true);
247
- initialLoadDone.current = false;
248
- console.info('[useChatMessages] loadMessages start', {
249
- chatId: targetChatId,
250
- seq: seq,
251
- force: options === null || options === void 0 ? void 0 : options.force
252
- });
253
- agentSnapshot = null;
254
- selectAgentForSession = function selectAgentForSession(next) {
255
- selectAgent(next);
256
- agentSnapshot = next;
257
- };
258
- _context3.next = 4;
259
- return maia.Chats.getChatMessages({
260
- chatId: targetChatId,
261
- currentUser: currentUser,
262
- offset: 0,
263
- cancelledText: t('chat.cancelled'),
264
- lang: mapCORLang(i18n.language)
265
- });
266
- case 4:
267
- _yield$maia$Chats$get = _context3.sent;
268
- items = _yield$maia$Chats$get.items;
269
- nextItem = _yield$maia$Chats$get.nextItem;
270
- agentDeleted = _yield$maia$Chats$get.agentDeleted;
271
- agentNoPermission = _yield$maia$Chats$get.agentNoPermission;
272
- hasAgentAccess = _yield$maia$Chats$get.hasAgentAccess;
273
- hasAgentPermission = _yield$maia$Chats$get.hasAgentPermission;
274
- agentTypeFromSession = _yield$maia$Chats$get.agentType;
275
- agentEntityFromSession = _yield$maia$Chats$get.agentEntity;
276
- projectIdMessage = _yield$maia$Chats$get.projectId;
277
- projectNameFromSession = _yield$maia$Chats$get.projectName;
278
- projectDeleted = _yield$maia$Chats$get.projectDeleted;
279
- clientIdFromSession = _yield$maia$Chats$get.clientId;
280
- clientNameFromSession = _yield$maia$Chats$get.clientName;
281
- taskIdFromSession = _yield$maia$Chats$get.taskId;
282
- taskNameFromSession = _yield$maia$Chats$get.taskName;
283
- if (!(seq !== loadSeqRef.current || targetChatId !== chatId)) {
284
- _context3.next = 5;
285
- break;
286
- }
287
- console.info('[useChatMessages] loadMessages stale response discarded', {
288
- targetChatId: targetChatId,
289
- currentChatId: chatId,
290
- seq: seq,
291
- currentSeq: loadSeqRef.current,
292
- itemCount: items.length
293
- });
294
- return _context3.abrupt("return");
295
- case 5:
296
- console.info('[useChatMessages] loadMessages result:', {
297
- chatId: targetChatId,
298
- itemCount: items.length,
299
- agentNoPermission: agentNoPermission,
300
- agentDeleted: !!agentDeleted,
301
- hasAgentAccess: hasAgentAccess,
302
- hasAgentPermission: hasAgentPermission,
303
- userPermissionsView: userPermissions === null || userPermissions === void 0 ? void 0 : userPermissions.view,
304
- agentInAgentsList: agentNoPermission ? !!agents.find(function (a) {
305
- return a.id === agentNoPermission.id;
306
- }) : null
307
- });
308
- if (agentDeleted) {
309
- selectAgentForSession(_objectSpread({
310
- id: agentDeleted.id,
311
- name: agentDeleted.name,
312
- emoji: agentDeleted.emoji,
313
- type: 'custom',
314
- is_deleted: true,
315
- deleted_at: agentDeleted.deletedAt
316
- }, agentNoPermission !== null && agentNoPermission !== void 0 && agentNoPermission.connectors ? {
245
+ }
246
+
247
+ // Si el agente no tiene acceso o permisos según la respuesta de sessions, seleccionarlo con el flag correspondiente
248
+ // La validación ahora se basa en las propiedades has_agent_access y has_agent_permission de la respuesta
249
+ if (agentNoPermission && !agentDeleted) {
250
+ if (!hasAgentAccess) {
251
+ // Caso 1: No tiene acceso al agente
252
+ selectAgent(_objectSpread(_objectSpread({
253
+ id: agentNoPermission.id,
254
+ name: agentNoPermission.name,
255
+ emoji: agentNoPermission.emoji,
256
+ type: agentNoPermission.type,
257
+ has_not_access: true
258
+ }, agentNoPermission.connectors ? {
317
259
  connectors: agentNoPermission.connectors
260
+ } : {}), projectDeleted ? {
261
+ project_deleted: {
262
+ name: projectDeleted.name
263
+ }
318
264
  } : {}));
319
- }
320
-
321
- // Si el agente no está en la lista pero tiene permisos, acceso y no está eliminado, setearlo normalmente
322
- // Excluir agentes no-custom para usuarios con roles deshabilitados
323
- if (agentNoPermission && !agentDeleted && userPermissions !== null && userPermissions !== void 0 && userPermissions.view && hasAgentAccess && hasAgentPermission && !agents.find(function (agent) {
324
- return agent.id === agentNoPermission.id;
325
- })) {
326
- selectAgentForSession(_objectSpread(_objectSpread({
265
+ } else if (!hasAgentPermission) {
266
+ // Caso 2: No tiene permisos para visualizar/interactuar con el agente
267
+ selectAgent(_objectSpread(_objectSpread({
327
268
  id: agentNoPermission.id,
328
269
  name: agentNoPermission.name,
329
270
  emoji: agentNoPermission.emoji,
330
271
  type: agentNoPermission.type,
331
- is_from_conversation: true
272
+ has_not_permissions: true
332
273
  }, agentNoPermission.connectors ? {
333
274
  connectors: agentNoPermission.connectors
334
275
  } : {}), projectDeleted ? {
@@ -336,149 +277,36 @@ export var useChatMessages = function useChatMessages(_ref) {
336
277
  name: projectDeleted.name
337
278
  }
338
279
  } : {}));
339
- }
340
-
341
- // Si el agente está en la lista y tiene acceso/permisos, actualizar project_deleted (o limpiarlo al cambiar de chat)
342
- if (agentNoPermission && !agentDeleted && hasAgentAccess && hasAgentPermission && agents.find(function (a) {
343
- return a.id === agentNoPermission.id;
344
- })) {
345
- agentInList = agents.find(function (a) {
346
- return a.id === agentNoPermission.id;
347
- });
348
- if (agentInList) {
349
- selectAgentForSession(_objectSpread(_objectSpread(_objectSpread({}, agentInList), agentNoPermission.connectors ? {
350
- connectors: agentNoPermission.connectors
351
- } : {}), projectDeleted ? {
352
- project_deleted: {
353
- name: projectDeleted.name
354
- }
355
- } : {
356
- project_deleted: undefined
357
- }));
358
- }
359
- }
360
-
361
- // Si el agente no tiene acceso o permisos según la respuesta de sessions, seleccionarlo con el flag correspondiente
362
- // La validación ahora se basa en las propiedades has_agent_access y has_agent_permission de la respuesta
363
- if (agentNoPermission && !agentDeleted) {
364
- if (!hasAgentAccess) {
365
- // Caso 1: No tiene acceso al agente
366
- console.info('[useChatMessages] BRANCH: has_not_access — hasAgentAccess:', hasAgentAccess);
367
- selectAgentForSession(_objectSpread(_objectSpread({
368
- id: agentNoPermission.id,
369
- name: agentNoPermission.name,
370
- emoji: agentNoPermission.emoji,
371
- type: agentNoPermission.type,
372
- has_not_access: true
373
- }, agentNoPermission.connectors ? {
374
- connectors: agentNoPermission.connectors
375
- } : {}), projectDeleted ? {
376
- project_deleted: {
377
- name: projectDeleted.name
378
- }
379
- } : {}));
380
- } else if (!hasAgentPermission) {
381
- // Caso 2: No tiene permisos para visualizar/interactuar con el agente
382
- console.info('[useChatMessages] BRANCH: has_not_permissions — hasAgentPermission:', hasAgentPermission);
383
- selectAgentForSession(_objectSpread(_objectSpread({
384
- id: agentNoPermission.id,
385
- name: agentNoPermission.name,
386
- emoji: agentNoPermission.emoji,
387
- type: agentNoPermission.type,
388
- has_not_permissions: true
389
- }, agentNoPermission.connectors ? {
390
- connectors: agentNoPermission.connectors
391
- } : {}), projectDeleted ? {
392
- project_deleted: {
393
- name: projectDeleted.name
394
- }
395
- } : {}));
396
- } else if (projectDeleted) {
397
- // Caso 3: El proyecto de la conversación fue eliminado
398
- selectAgentForSession(_objectSpread(_objectSpread({
399
- id: agentNoPermission.id,
400
- name: agentNoPermission.name,
401
- emoji: agentNoPermission.emoji,
402
- type: agentNoPermission.type
403
- }, agentNoPermission.connectors ? {
404
- connectors: agentNoPermission.connectors
405
- } : {}), {}, {
406
- project_deleted: {
407
- name: projectDeleted.name
408
- }
409
- }));
410
- }
411
- }
412
- _context3.next = 6;
413
- return setConversationContextFromMetadata({
414
- projectIdMessage: projectIdMessage,
415
- projectNameFromSession: projectNameFromSession,
416
- clientIdFromSession: clientIdFromSession,
417
- clientNameFromSession: clientNameFromSession,
418
- taskIdFromSession: taskIdFromSession,
419
- taskNameFromSession: taskNameFromSession
420
- });
421
- case 6:
422
- // Metadata de la session (agent_type / agent_entity + contexto) para el cartel de
423
- // "continuar en un chat nuevo" del footer cuando se abre una conversación de un clone legacy.
424
- document.dispatchEvent(new CustomEvent('maia-chat-session-meta', {
425
- detail: {
426
- chatId: chatId,
427
- agentType: agentTypeFromSession,
428
- agentEntity: agentEntityFromSession,
429
- projectId: projectIdMessage,
430
- projectName: projectNameFromSession,
431
- clientId: clientIdFromSession,
432
- clientName: clientNameFromSession,
433
- taskId: taskIdFromSession,
434
- taskName: taskNameFromSession
435
- }
436
- }));
437
-
438
- // Si hay proyecto en la conversación, reescribir URLs de tareas con el tab del usuario (me)
439
- contextProjectId = projectIdMessage ? parseInt(String(projectIdMessage), 10) : null;
440
- itemsToSet = items;
441
- if (!contextProjectId) {
442
- _context3.next = 8;
443
- break;
444
- }
445
- _context3.next = 7;
446
- return getTabTaskDefault(1);
447
- case 7:
448
- tab = _context3.sent;
449
- tabSegment = tab ? "/".concat(tab) : '/detail';
450
- itemsToSet = items.map(function (item) {
451
- return _objectSpread(_objectSpread({}, item), {}, {
452
- message: rewriteTaskUrlsInContent(item.message || '', tabSegment)
453
- });
454
- });
455
- case 8:
456
- // Si la sesión sigue generando (stream en background), reconstruimos el
457
- // tail en vuelo (pregunta + placeholder) que aún no está persistido en el
458
- // backend, mergeándolo al historial cargado sin duplicar por id.
459
- sessionMeta = useSessionsStore.getState().getMeta(chatId);
460
- finalMessages = itemsToSet;
461
- if (sessionMeta && isActiveSessionStatus(sessionMeta.status)) {
462
- tail = useSessionsStore.getState().getMessages(chatId);
463
- existingIds = new Set(itemsToSet.map(function (item) {
464
- return item.id;
280
+ } else if (projectDeleted) {
281
+ // Caso 3: El proyecto de la conversación fue eliminado
282
+ selectAgent(_objectSpread(_objectSpread({
283
+ id: agentNoPermission.id,
284
+ name: agentNoPermission.name,
285
+ emoji: agentNoPermission.emoji,
286
+ type: agentNoPermission.type
287
+ }, agentNoPermission.connectors ? {
288
+ connectors: agentNoPermission.connectors
289
+ } : {}), {}, {
290
+ project_deleted: {
291
+ name: projectDeleted.name
292
+ }
465
293
  }));
466
- extra = tail.filter(function (item) {
467
- return !existingIds.has(item.id);
468
- });
469
- if (extra.length) {
470
- finalMessages = [].concat(_toConsumableArray(itemsToSet), _toConsumableArray(extra));
471
- }
472
294
  }
473
- conversationMeta = {
474
- projectIdMessage: projectIdMessage,
475
- projectNameFromSession: projectNameFromSession,
476
- clientIdFromSession: clientIdFromSession,
477
- clientNameFromSession: clientNameFromSession,
478
- taskIdFromSession: taskIdFromSession,
479
- taskNameFromSession: taskNameFromSession
480
- };
481
- sessionMetaEvent = {
295
+ }
296
+ _context2.next = 2;
297
+ return setConversationContextFromMetadata({
298
+ projectIdMessage: projectIdMessage,
299
+ projectNameFromSession: projectNameFromSession,
300
+ clientIdFromSession: clientIdFromSession,
301
+ clientNameFromSession: clientNameFromSession,
302
+ taskIdFromSession: taskIdFromSession,
303
+ taskNameFromSession: taskNameFromSession
304
+ });
305
+ case 2:
306
+ // Metadata de la session (agent_type / agent_entity + contexto) para el cartel de
307
+ // "continuar en un chat nuevo" del footer cuando se abre una conversación de un clone legacy.
308
+ document.dispatchEvent(new CustomEvent('maia-chat-session-meta', {
309
+ detail: {
482
310
  chatId: chatId,
483
311
  agentType: agentTypeFromSession,
484
312
  agentEntity: agentEntityFromSession,
@@ -488,61 +316,64 @@ export var useChatMessages = function useChatMessages(_ref) {
488
316
  clientName: clientNameFromSession,
489
317
  taskId: taskIdFromSession,
490
318
  taskName: taskNameFromSession
491
- };
492
- setMessages(finalMessages);
493
- paginationKey = Number(nextItem);
494
- setLastEvaluatedKey(paginationKey);
495
- initialLoadDone.current = true;
496
- useSessionsStore.getState().setMessages(targetChatId, finalMessages);
497
- useSessionsStore.getState().setViewCache(targetChatId, {
498
- hydratedFromApi: true,
499
- lastEvaluatedKey: paginationKey,
500
- conversationMeta: conversationMeta,
501
- sessionMetaEvent: sessionMetaEvent,
502
- agentSnapshot: agentSnapshot
503
- });
504
- _context3.next = 10;
505
- break;
506
- case 9:
507
- _context3.prev = 9;
508
- _t = _context3["catch"](3);
509
- if (seq === loadSeqRef.current && targetChatId === chatId) {
510
- onError === null || onError === void 0 || onError();
511
- }
512
- case 10:
513
- _context3.prev = 10;
514
- if (seq === loadSeqRef.current && targetChatId === chatId) {
515
- setLoadingMessages(false);
516
319
  }
517
- return _context3.finish(10);
518
- case 11:
519
- case "end":
520
- return _context3.stop();
521
- }
522
- }, _callee3, null, [[3, 9, 10, 11]]);
523
- }));
524
- return function (_x3) {
525
- return _ref5.apply(this, arguments);
526
- };
527
- }(), [chatId, currentUser, setConversationContextFromMetadata, onError, getTabTaskDefault, restoreSessionFromStore, selectAgent, agents, t, i18n.language, userPermissions === null || userPermissions === void 0 ? void 0 : userPermissions.view]);
320
+ }));
321
+
322
+ // Si hay proyecto en la conversación, reescribir URLs de tareas con el tab del usuario (me)
323
+ contextProjectId = projectIdMessage ? parseInt(String(projectIdMessage), 10) : null;
324
+ itemsToSet = items;
325
+ if (!contextProjectId) {
326
+ _context2.next = 4;
327
+ break;
328
+ }
329
+ _context2.next = 3;
330
+ return getTabTaskDefault(1);
331
+ case 3:
332
+ tab = _context2.sent;
333
+ tabSegment = tab ? "/".concat(tab) : '/detail';
334
+ itemsToSet = items.map(function (item) {
335
+ return _objectSpread(_objectSpread({}, item), {}, {
336
+ message: rewriteTaskUrlsInContent(item.message || '', tabSegment)
337
+ });
338
+ });
339
+ case 4:
340
+ setMessages(itemsToSet);
341
+ setLastEvaluatedKey(Number(nextItem));
342
+ initialLoadDone.current = true;
343
+ _context2.next = 6;
344
+ break;
345
+ case 5:
346
+ _context2.prev = 5;
347
+ _t = _context2["catch"](0);
348
+ onError === null || onError === void 0 || onError();
349
+ case 6:
350
+ _context2.prev = 6;
351
+ setLoadingMessages(false);
352
+ return _context2.finish(6);
353
+ case 7:
354
+ case "end":
355
+ return _context2.stop();
356
+ }
357
+ }, _callee2, null, [[0, 5, 6, 7]]);
358
+ })), [chatId, currentUser, setConversationContextFromMetadata, onError, getTabTaskDefault]);
528
359
  var loadMoreMessages = useCallback(/*#__PURE__*/function () {
529
- var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(container) {
530
- var oldScrollHeight, oldScrollTop, _yield$maia$Chats$get2, items, nextItem, projectIdMessage, projectNameFromSession, clientIdFromSession, clientNameFromSession, taskIdFromSession, taskNameFromSession, contextProjectId, itemsToMerge, tab, tabSegment, newMessages, paginationKey, _t2;
531
- return _regeneratorRuntime.wrap(function (_context4) {
532
- while (1) switch (_context4.prev = _context4.next) {
360
+ var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(container) {
361
+ var oldScrollHeight, oldScrollTop, _yield$maia$Chats$get2, items, nextItem, projectIdMessage, projectNameFromSession, clientIdFromSession, clientNameFromSession, taskIdFromSession, taskNameFromSession, contextProjectId, itemsToMerge, tab, tabSegment, newMessages, _t2;
362
+ return _regeneratorRuntime.wrap(function (_context3) {
363
+ while (1) switch (_context3.prev = _context3.next) {
533
364
  case 0:
534
365
  if (!(isLoadingRef.current || !lastEvaluatedKey || !container)) {
535
- _context4.next = 1;
366
+ _context3.next = 1;
536
367
  break;
537
368
  }
538
- return _context4.abrupt("return");
369
+ return _context3.abrupt("return");
539
370
  case 1:
540
- _context4.prev = 1;
371
+ _context3.prev = 1;
541
372
  isLoadingRef.current = true;
542
373
  setIsLoadingMoreMessages(true);
543
374
  oldScrollHeight = container.scrollHeight;
544
375
  oldScrollTop = container.scrollTop;
545
- _context4.next = 2;
376
+ _context3.next = 2;
546
377
  return maia.Chats.getChatMessages({
547
378
  chatId: chatId,
548
379
  currentUser: currentUser,
@@ -550,7 +381,7 @@ export var useChatMessages = function useChatMessages(_ref) {
550
381
  lang: mapCORLang(i18n.language)
551
382
  });
552
383
  case 2:
553
- _yield$maia$Chats$get2 = _context4.sent;
384
+ _yield$maia$Chats$get2 = _context3.sent;
554
385
  items = _yield$maia$Chats$get2.items;
555
386
  nextItem = _yield$maia$Chats$get2.nextItem;
556
387
  projectIdMessage = _yield$maia$Chats$get2.projectId;
@@ -559,7 +390,7 @@ export var useChatMessages = function useChatMessages(_ref) {
559
390
  clientNameFromSession = _yield$maia$Chats$get2.clientName;
560
391
  taskIdFromSession = _yield$maia$Chats$get2.taskId;
561
392
  taskNameFromSession = _yield$maia$Chats$get2.taskName;
562
- _context4.next = 3;
393
+ _context3.next = 3;
563
394
  return setConversationContextFromMetadata({
564
395
  projectIdMessage: projectIdMessage,
565
396
  projectNameFromSession: projectNameFromSession,
@@ -573,13 +404,13 @@ export var useChatMessages = function useChatMessages(_ref) {
573
404
  contextProjectId = projectIdMessage ? parseInt(String(projectIdMessage), 10) : null;
574
405
  itemsToMerge = items;
575
406
  if (!contextProjectId) {
576
- _context4.next = 5;
407
+ _context3.next = 5;
577
408
  break;
578
409
  }
579
- _context4.next = 4;
410
+ _context3.next = 4;
580
411
  return getTabTaskDefault(1);
581
412
  case 4:
582
- tab = _context4.sent;
413
+ tab = _context3.sent;
583
414
  tabSegment = tab ? "/".concat(tab) : '/detail';
584
415
  itemsToMerge = items.map(function (item) {
585
416
  return _objectSpread(_objectSpread({}, item), {}, {
@@ -589,9 +420,7 @@ export var useChatMessages = function useChatMessages(_ref) {
589
420
  case 5:
590
421
  newMessages = [].concat(_toConsumableArray(messages.slice(0, 1)), _toConsumableArray(itemsToMerge), _toConsumableArray(messages.slice(1)));
591
422
  setMessages(newMessages);
592
- paginationKey = Number(nextItem);
593
- setLastEvaluatedKey(paginationKey);
594
- syncMessagesToStore(chatId, newMessages, paginationKey);
423
+ setLastEvaluatedKey(Number(nextItem));
595
424
  requestAnimationFrame(function () {
596
425
  requestAnimationFrame(function () {
597
426
  var containerRef = container;
@@ -602,27 +431,27 @@ export var useChatMessages = function useChatMessages(_ref) {
602
431
  }
603
432
  });
604
433
  });
605
- _context4.next = 7;
434
+ _context3.next = 7;
606
435
  break;
607
436
  case 6:
608
- _context4.prev = 6;
609
- _t2 = _context4["catch"](1);
437
+ _context3.prev = 6;
438
+ _t2 = _context3["catch"](1);
610
439
  onError === null || onError === void 0 || onError();
611
440
  case 7:
612
- _context4.prev = 7;
441
+ _context3.prev = 7;
613
442
  setIsLoadingMoreMessages(false);
614
443
  isLoadingRef.current = false;
615
- return _context4.finish(7);
444
+ return _context3.finish(7);
616
445
  case 8:
617
446
  case "end":
618
- return _context4.stop();
447
+ return _context3.stop();
619
448
  }
620
- }, _callee4, null, [[1, 6, 7, 8]]);
449
+ }, _callee3, null, [[1, 6, 7, 8]]);
621
450
  }));
622
- return function (_x4) {
623
- return _ref6.apply(this, arguments);
451
+ return function (_x2) {
452
+ return _ref5.apply(this, arguments);
624
453
  };
625
- }(), [chatId, currentUser, lastEvaluatedKey, onError, messages, getTabTaskDefault, setConversationContextFromMetadata, syncMessagesToStore]);
454
+ }(), [chatId, currentUser, lastEvaluatedKey, onError, messages, getTabTaskDefault, setConversationContextFromMetadata]);
626
455
  var handleScroll = useCallback(function (container) {
627
456
  if (!container || isLoadingRef.current || !initialLoadDone.current) return;
628
457
  var scrollTop = container.scrollTop,
@@ -635,37 +464,36 @@ export var useChatMessages = function useChatMessages(_ref) {
635
464
  }, [loadMoreMessages]);
636
465
  useEffect(function () {
637
466
  if (chatId !== previousChatId.current) {
638
- var fromChatId = previousChatId.current;
639
- var canRestore = useSessionsStore.getState().canRestoreSession(chatId);
640
- console.info('[useChatMessages] session switch', {
641
- from: fromChatId,
642
- to: chatId,
643
- canRestore: canRestore
644
- });
467
+ setMessages(userInitialMessage ? [_objectSpread(_objectSpread({
468
+ id: 'user-initial-message',
469
+ date: new Date(),
470
+ user: currentUser,
471
+ message: formatQuickActionMessageForDisplay(userInitialMessage.message, {
472
+ fuaId: userInitialMessage.fuaId,
473
+ scId: userInitialMessage.scId
474
+ })
475
+ }, userInitialMessage.attachments ? {
476
+ attachments: userInitialMessage.attachments
477
+ } : {}), buildContextMessage(userInitialMessage.mentions) ? {
478
+ contextMessage: buildContextMessage(userInitialMessage.mentions)
479
+ } : {})] : []);
480
+ setLastEvaluatedKey(0);
645
481
  isLoadingRef.current = false;
646
482
  initialLoadDone.current = false;
647
483
  previousChatId.current = chatId;
648
- setLastEvaluatedKey(0);
649
- loadSeqRef.current += 1;
650
- refetchTabTaskDefault();
651
- var pendingInitialMessage = hasMeaningfulUserInitialMessage(userInitialMessage);
652
- if (!pendingInitialMessage && canRestore) {
653
- restoreSessionFromStore(chatId)["catch"](function (error) {
654
- console.error('[useChatMessages] restoreSessionFromStore failed', error);
655
- });
656
- return;
657
- }
658
- setMessages(pendingInitialMessage && userInitialMessage ? buildInitialMessagePlaceholder(userInitialMessage, currentUser) : []);
659
484
 
660
485
  // Limpiar el estado del proyecto y la tarea cuando cambia de conversación
661
486
  setChipsProject(null);
662
487
  setProject(null);
663
488
  setTask(null);
664
- if (!pendingInitialMessage) {
489
+
490
+ // Volver a ejecutar la query me para tener tabTaskDefault actualizado en la nueva conversación
491
+ refetchTabTaskDefault();
492
+ if (!userInitialMessage) {
665
493
  loadMessages();
666
494
  }
667
495
  }
668
- }, [chatId, userInitialMessage, currentUser, loadMessages, restoreSessionFromStore, setChipsProject, setProject, setTask, refetchTabTaskDefault]);
496
+ }, [chatId, userInitialMessage, currentUser, loadMessages, setChipsProject, setProject, setTask, refetchTabTaskDefault]);
669
497
 
670
498
  // Cuando tabTaskDefault pasa a estar disponible después de cargar, reescribir URLs de tareas en los mensajes ya cargados.
671
499
  // Ref para evitar bucle: setMessages(rewritten) cambia messages y re-ejecuta el efecto; solo reescribimos una vez por lote.
@@ -694,33 +522,27 @@ export var useChatMessages = function useChatMessages(_ref) {
694
522
  });
695
523
  });
696
524
  setMessages(rewritten);
697
- syncMessagesToStore(chatId, rewritten);
698
- }, [tabTaskDefault, project === null || project === void 0 ? void 0 : project.id, messages, chatId, syncMessagesToStore]);
525
+ }, [tabTaskDefault, project === null || project === void 0 ? void 0 : project.id, messages]);
699
526
  var addMessage = useCallback(function (message) {
700
527
  setMessages(function (prev) {
701
528
  var existingMessageIndex = prev.findIndex(function (msg) {
702
529
  return msg.id === message.id;
703
530
  });
704
531
  if (existingMessageIndex >= 0) {
705
- var _newMessages = _toConsumableArray(prev);
706
- _newMessages[existingMessageIndex] = message;
707
- syncMessagesToStore(chatId, _newMessages);
708
- return _newMessages;
532
+ var newMessages = _toConsumableArray(prev);
533
+ newMessages[existingMessageIndex] = message;
534
+ return newMessages;
709
535
  }
710
- var newMessages = [].concat(_toConsumableArray(prev), [message]);
711
- syncMessagesToStore(chatId, newMessages);
712
- return newMessages;
536
+ return [].concat(_toConsumableArray(prev), [message]);
713
537
  });
714
- }, [chatId, syncMessagesToStore]);
538
+ }, []);
715
539
  var removeMessage = useCallback(function (messageId) {
716
540
  setMessages(function (prev) {
717
- var newMessages = prev.filter(function (msg) {
541
+ return prev.filter(function (msg) {
718
542
  return msg.id !== messageId;
719
543
  });
720
- syncMessagesToStore(chatId, newMessages);
721
- return newMessages;
722
544
  });
723
- }, [chatId, syncMessagesToStore]);
545
+ }, []);
724
546
  return {
725
547
  loadingMessages: loadingMessages,
726
548
  messages: messages,
@@ -733,4 +555,4 @@ export var useChatMessages = function useChatMessages(_ref) {
733
555
  handleScroll: handleScroll
734
556
  };
735
557
  };
736
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVN0YXRlIiwidXNlUmVmIiwidXNlRWZmZWN0IiwidXNlUHJvamVjdHMiLCJidWlsZENvbnRleHRNZXNzYWdlIiwibWFpYSIsInVzZUdsb2JhbENvbnRleHQiLCJ1c2VUIiwidXNlVXNlciIsInVzZVRhYlRhc2tEZWZhdWx0IiwiVEFTS19VUkxfUkVHRVhfUEFUVEVSTiIsIm1hcENPUkxhbmciLCJmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5IiwidXNlU2Vzc2lvbnNTdG9yZSIsImlzQWN0aXZlU2Vzc2lvblN0YXR1cyIsImhhc01lYW5pbmdmdWxVc2VySW5pdGlhbE1lc3NhZ2UiLCJ1c2VySW5pdGlhbE1lc3NhZ2UiLCJfdXNlckluaXRpYWxNZXNzYWdlJG0iLCJfdXNlckluaXRpYWxNZXNzYWdlJGEiLCJCb29sZWFuIiwibWVzc2FnZSIsInRyaW0iLCJhdHRhY2htZW50cyIsImxlbmd0aCIsImZ1YUlkIiwic2NJZCIsImJ1aWxkSW5pdGlhbE1lc3NhZ2VQbGFjZWhvbGRlciIsImN1cnJlbnRVc2VyIiwiX29iamVjdFNwcmVhZCIsImlkIiwiZGF0ZSIsIkRhdGUiLCJ1c2VyIiwibWVudGlvbnMiLCJjb250ZXh0TWVzc2FnZSIsInJld3JpdGVUYXNrVXJsc0luQ29udGVudCIsImNvbnRlbnQiLCJ0YWJTZWdtZW50IiwidGFza1VybFJlZ2V4IiwiUmVnRXhwIiwicmVwbGFjZSIsInVybCIsInVzZUNoYXRNZXNzYWdlcyIsIl9yZWYiLCJfdXNlciRwZXJtaXNzaW9ucyIsIm9uRXJyb3IiLCJjaGF0SWQiLCJfcmVmJGFnZW50cyIsImFnZW50cyIsIl91c2VUIiwidCIsImkxOG4iLCJ1c2VyUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9ucyIsImFpX2FnZW50cyIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsImxvYWRpbmdNZXNzYWdlcyIsInNldExvYWRpbmdNZXNzYWdlcyIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwibWVzc2FnZXMiLCJzZXRNZXNzYWdlcyIsIl91c2VQcm9qZWN0cyIsImZldGNoUHJvamVjdHMiLCJfdXNlR2xvYmFsQ29udGV4dCIsInNlbGVjdEFnZW50Iiwic2V0Q2hpcHNQcm9qZWN0Iiwic2V0UHJvamVjdCIsInNldENsaWVudCIsInNldFRhc2siLCJwcm9qZWN0IiwiX3VzZVRhYlRhc2tEZWZhdWx0IiwiZ2V0VGFiVGFza0RlZmF1bHQiLCJ0YWJUYXNrRGVmYXVsdCIsInJlZmV0Y2hUYWJUYXNrRGVmYXVsdCIsIl91c2VTdGF0ZTUiLCJfdXNlU3RhdGU2IiwiaXNMb2FkaW5nTW9yZU1lc3NhZ2VzIiwic2V0SXNMb2FkaW5nTW9yZU1lc3NhZ2VzIiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJsYXN0RXZhbHVhdGVkS2V5Iiwic2V0TGFzdEV2YWx1YXRlZEtleSIsImlzTG9hZGluZ1JlZiIsImluaXRpYWxMb2FkRG9uZSIsInByZXZpb3VzQ2hhdElkIiwibG9hZFNlcVJlZiIsInN5bmNNZXNzYWdlc1RvU3RvcmUiLCJ0YXJnZXRDaGF0SWQiLCJuZXh0TWVzc2FnZXMiLCJsYXN0RXZhbHVhdGVkS2V5VmFsdWUiLCJnZXRTdGF0ZSIsInVuZGVmaW5lZCIsInBhdGNoVmlld0NhY2hlIiwic2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YSIsIl9yZWYzIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJfcmVmMiIsInByb2plY3RJZE1lc3NhZ2UiLCJwcm9qZWN0TmFtZUZyb21TZXNzaW9uIiwiY2xpZW50SWRGcm9tU2Vzc2lvbiIsImNsaWVudE5hbWVGcm9tU2Vzc2lvbiIsInRhc2tJZEZyb21TZXNzaW9uIiwidGFza05hbWVGcm9tU2Vzc2lvbiIsInByb2plY3RzIiwiaGFzTXVsdGlBZ2VudHNBY2Nlc3MiLCJwcm9qZWN0SWROdW0iLCJmb3VuZFByb2plY3QiLCJfZm91bmRQcm9qZWN0JGNsaWVudCIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwibmFtZSIsIk51bWJlciIsImFicnVwdCIsInNlbnQiLCJ3aW5kb3ciLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTIiwiZmluZCIsInAiLCJwcm9qZWN0TmFtZSIsImNsaWVudE5hbWUiLCJjbGllbnQiLCJwcm9qZWN0SWQiLCJTdHJpbmciLCJzdG9wIiwiX3giLCJhcHBseSIsImFyZ3VtZW50cyIsInJlc3RvcmVTZXNzaW9uRnJvbVN0b3JlIiwiX3JlZjQiLCJfY2FsbGVlMiIsIl9jYWNoZSRsYXN0RXZhbHVhdGVkSyIsInNlc3Npb25zU3RvcmUiLCJjYWNoZWRNZXNzYWdlcyIsImNhY2hlIiwiX2NvbnRleHQyIiwiZ2V0TWVzc2FnZXMiLCJnZXRWaWV3Q2FjaGUiLCJjdXJyZW50IiwiYWdlbnRTbmFwc2hvdCIsImNvbnZlcnNhdGlvbk1ldGEiLCJzZXNzaW9uTWV0YUV2ZW50IiwiZG9jdW1lbnQiLCJkaXNwYXRjaEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJkZXRhaWwiLCJfeDIiLCJsb2FkTWVzc2FnZXMiLCJfcmVmNSIsIl9jYWxsZWUzIiwib3B0aW9ucyIsInNlcSIsInNlbGVjdEFnZW50Rm9yU2Vzc2lvbiIsIl95aWVsZCRtYWlhJENoYXRzJGdldCIsIml0ZW1zIiwibmV4dEl0ZW0iLCJhZ2VudERlbGV0ZWQiLCJhZ2VudE5vUGVybWlzc2lvbiIsImhhc0FnZW50QWNjZXNzIiwiaGFzQWdlbnRQZXJtaXNzaW9uIiwiYWdlbnRUeXBlRnJvbVNlc3Npb24iLCJhZ2VudEVudGl0eUZyb21TZXNzaW9uIiwicHJvamVjdERlbGV0ZWQiLCJhZ2VudEluTGlzdCIsImNvbnRleHRQcm9qZWN0SWQiLCJpdGVtc1RvU2V0IiwidGFiIiwic2Vzc2lvbk1ldGEiLCJmaW5hbE1lc3NhZ2VzIiwidGFpbCIsImV4aXN0aW5nSWRzIiwiZXh0cmEiLCJwYWdpbmF0aW9uS2V5IiwiX3QiLCJfY29udGV4dDMiLCJmb3JjZSIsImNhblJlc3RvcmVTZXNzaW9uIiwiY29uc29sZSIsImluZm8iLCJDaGF0cyIsImdldENoYXRNZXNzYWdlcyIsIm9mZnNldCIsImNhbmNlbGxlZFRleHQiLCJsYW5nIiwibGFuZ3VhZ2UiLCJhZ2VudFR5cGUiLCJhZ2VudEVudGl0eSIsImNsaWVudElkIiwidGFza0lkIiwidGFza05hbWUiLCJjdXJyZW50Q2hhdElkIiwiY3VycmVudFNlcSIsIml0ZW1Db3VudCIsInVzZXJQZXJtaXNzaW9uc1ZpZXciLCJ2aWV3IiwiYWdlbnRJbkFnZW50c0xpc3QiLCJhIiwiZW1vamkiLCJ0eXBlIiwiaXNfZGVsZXRlZCIsImRlbGV0ZWRfYXQiLCJkZWxldGVkQXQiLCJjb25uZWN0b3JzIiwiYWdlbnQiLCJpc19mcm9tX2NvbnZlcnNhdGlvbiIsInByb2plY3RfZGVsZXRlZCIsImhhc19ub3RfYWNjZXNzIiwiaGFzX25vdF9wZXJtaXNzaW9ucyIsInBhcnNlSW50IiwiY29uY2F0IiwibWFwIiwiaXRlbSIsImdldE1ldGEiLCJzdGF0dXMiLCJTZXQiLCJmaWx0ZXIiLCJoYXMiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJzZXRWaWV3Q2FjaGUiLCJoeWRyYXRlZEZyb21BcGkiLCJmaW5pc2giLCJfeDMiLCJsb2FkTW9yZU1lc3NhZ2VzIiwiX3JlZjYiLCJfY2FsbGVlNCIsImNvbnRhaW5lciIsIm9sZFNjcm9sbEhlaWdodCIsIm9sZFNjcm9sbFRvcCIsIl95aWVsZCRtYWlhJENoYXRzJGdldDIiLCJpdGVtc1RvTWVyZ2UiLCJuZXdNZXNzYWdlcyIsIl90MiIsIl9jb250ZXh0NCIsInNjcm9sbEhlaWdodCIsInNjcm9sbFRvcCIsInNsaWNlIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiY29udGFpbmVyUmVmIiwibmV3U2Nyb2xsSGVpZ2h0IiwiaGVpZ2h0RGlmZmVyZW5jZSIsIl94NCIsImhhbmRsZVNjcm9sbCIsImNsaWVudEhlaWdodCIsInNjcm9sbFBlcmNlbnRhZ2UiLCJmcm9tQ2hhdElkIiwiY2FuUmVzdG9yZSIsImZyb20iLCJ0byIsInBlbmRpbmdJbml0aWFsTWVzc2FnZSIsImVycm9yIiwiZGlkUmV3cml0ZVJlZiIsIm5lZWRzUmV3cml0ZSIsInNvbWUiLCJtc2ciLCJtYXRjaGVzIiwibWF0Y2giLCJlbmRzV2l0aCIsImluY2x1ZGVzIiwicmV3cml0dGVuIiwiYWRkTWVzc2FnZSIsImV4aXN0aW5nTWVzc2FnZUluZGV4IiwiZmluZEluZGV4IiwicmVtb3ZlTWVzc2FnZSIsIm1lc3NhZ2VJZCIsImhhc01vcmVNZXNzYWdlcyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy91c2VDaGF0TWVzc2FnZXMvdXNlQ2hhdE1lc3NhZ2VzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9pbmRlbnQgKi9cbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VTdGF0ZSwgdXNlUmVmLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZVByb2plY3RzIH0gZnJvbSAnLi4vdXNlUHJvamVjdHMnXG5pbXBvcnQgeyBDaGF0TWVzc2FnZSB9IGZyb20gJy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQgeyBidWlsZENvbnRleHRNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvY29udGV4dE1lbnRpb24nXG5pbXBvcnQgbWFpYSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tYWlhJ1xuaW1wb3J0IHsgVXNlQ2hhdE1lc3NhZ2VzUHJvcHMgfSBmcm9tICcuL3VzZUNoYXRNZXNzYWdlcy5pbnRlcmZhY2UnXG5pbXBvcnQgeyB1c2VHbG9iYWxDb250ZXh0IH0gZnJvbSAnLi4vLi4vY29udGV4dC9nbG9iYWwtY29udGV4dCdcbmltcG9ydCB7IHVzZVQgfSBmcm9tICcuLi91c2VUJ1xuaW1wb3J0IHsgdXNlVXNlciB9IGZyb20gJy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgeyB1c2VUYWJUYXNrRGVmYXVsdCB9IGZyb20gJy4uL3VzZVRhYlRhc2tEZWZhdWx0J1xuaW1wb3J0IHsgVEFTS19VUkxfUkVHRVhfUEFUVEVSTiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy90YXNrVXJscydcbmltcG9ydCB7IG1hcENPUkxhbmcgfSBmcm9tICcuLi8uLi9sYW5nL3V0aWxzJ1xuaW1wb3J0IHsgZm9ybWF0UXVpY2tBY3Rpb25NZXNzYWdlRm9yRGlzcGxheSB9IGZyb20gJy4uLy4uL3V0aWxzL2Zvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZSdcbmltcG9ydCB7IHVzZVNlc3Npb25zU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS9zZXNzaW9ucy91c2VTZXNzaW9uc1N0b3JlJ1xuaW1wb3J0IHsgaXNBY3RpdmVTZXNzaW9uU3RhdHVzIH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvc2Vzc2lvbnMudHlwZXMnXG5pbXBvcnQgdHlwZSB7IEFnZW50IH0gZnJvbSAnLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgdHlwZSB7IFNlc3Npb25Db252ZXJzYXRpb25NZXRhLCBTZXNzaW9uTWV0YUV2ZW50RGV0YWlsIH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvc2Vzc2lvbnMudHlwZXMnXG5cbnR5cGUgTG9hZE1lc3NhZ2VzT3B0aW9ucyA9IHtcbiAgLyoqIElnbm9yYSBjYWNoZSBlbiBtZW1vcmlhIHkgdnVlbHZlIGEgcGVkaXIgZ2V0Q2hhdE1lc3NhZ2VzLiAqL1xuICBmb3JjZT86IGJvb2xlYW5cbn1cblxudHlwZSBVc2VySW5pdGlhbE1lc3NhZ2UgPSBVc2VDaGF0TWVzc2FnZXNQcm9wc1sndXNlckluaXRpYWxNZXNzYWdlJ11cblxuLyoqIEVsIG1vZGFsIHVzYSBgeyBtZXNzYWdlOiAnJywgYXR0YWNobWVudHM6IFtdIH1gIGNvbW8gXCJzaW4gbWVuc2FqZSBpbmljaWFsXCI7IG5vIGVzIGZhbHN5LiAqL1xuY29uc3QgaGFzTWVhbmluZ2Z1bFVzZXJJbml0aWFsTWVzc2FnZSA9ICh1c2VySW5pdGlhbE1lc3NhZ2U/OiBVc2VySW5pdGlhbE1lc3NhZ2UpOiBib29sZWFuID0+XG4gIEJvb2xlYW4oXG4gICAgdXNlckluaXRpYWxNZXNzYWdlICYmXG4gICAgKHVzZXJJbml0aWFsTWVzc2FnZS5tZXNzYWdlPy50cmltKCkgfHxcbiAgICAgIHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cz8ubGVuZ3RoIHx8XG4gICAgICB1c2VySW5pdGlhbE1lc3NhZ2UuZnVhSWQgfHxcbiAgICAgIHVzZXJJbml0aWFsTWVzc2FnZS5zY0lkKVxuICApXG5cbmNvbnN0IGJ1aWxkSW5pdGlhbE1lc3NhZ2VQbGFjZWhvbGRlciA9IChcbiAgdXNlckluaXRpYWxNZXNzYWdlOiBOb25OdWxsYWJsZTxVc2VySW5pdGlhbE1lc3NhZ2U+LFxuICBjdXJyZW50VXNlcjogVXNlQ2hhdE1lc3NhZ2VzUHJvcHNbJ2N1cnJlbnRVc2VyJ11cbik6IENoYXRNZXNzYWdlW10gPT4gW1xuICB7XG4gICAgaWQ6ICd1c2VyLWluaXRpYWwtbWVzc2FnZScsXG4gICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICB1c2VyOiBjdXJyZW50VXNlcixcbiAgICBtZXNzYWdlOiBmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5KHVzZXJJbml0aWFsTWVzc2FnZS5tZXNzYWdlLCB7XG4gICAgICBmdWFJZDogdXNlckluaXRpYWxNZXNzYWdlLmZ1YUlkLFxuICAgICAgc2NJZDogdXNlckluaXRpYWxNZXNzYWdlLnNjSWQsXG4gICAgfSksXG4gICAgLi4uKHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cyA/IHsgYXR0YWNobWVudHM6IHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cyB9IDoge30pLFxuICAgIC4uLihidWlsZENvbnRleHRNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZS5tZW50aW9ucylcbiAgICAgID8geyBjb250ZXh0TWVzc2FnZTogYnVpbGRDb250ZXh0TWVzc2FnZSh1c2VySW5pdGlhbE1lc3NhZ2UubWVudGlvbnMpIH1cbiAgICAgIDoge30pLFxuICB9LFxuXVxuXG5jb25zdCByZXdyaXRlVGFza1VybHNJbkNvbnRlbnQgPSAoY29udGVudDogc3RyaW5nLCB0YWJTZWdtZW50OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB0YXNrVXJsUmVnZXggPSBuZXcgUmVnRXhwKFRBU0tfVVJMX1JFR0VYX1BBVFRFUk4sICdnJylcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZSh0YXNrVXJsUmVnZXgsIHVybCA9PlxuICAgIHVybC5yZXBsYWNlKC9cXC8oZGV0YWlsfG1lc3NhZ2V8bWVzc2FnZXN8ZmlsZXN8aGlzdG9yeXxob3VycykoPz0kfFxcPykvLCB0YWJTZWdtZW50KVxuICApXG59XG5cbmV4cG9ydCBjb25zdCB1c2VDaGF0TWVzc2FnZXMgPSAoe1xuICBvbkVycm9yLFxuICBjaGF0SWQsXG4gIGN1cnJlbnRVc2VyLFxuICB1c2VySW5pdGlhbE1lc3NhZ2UsXG4gIGFnZW50cyA9IFtdLFxufTogVXNlQ2hhdE1lc3NhZ2VzUHJvcHMpID0+IHtcbiAgY29uc3QgeyB0LCBpMThuIH0gPSB1c2VUKClcbiAgY29uc3QgdXNlciA9IHVzZVVzZXIoKVxuICBjb25zdCB1c2VyUGVybWlzc2lvbnMgPSB1c2VyPy5wZXJtaXNzaW9ucz8uYWlfYWdlbnRzXG4gIGNvbnN0IFtsb2FkaW5nTWVzc2FnZXMsIHNldExvYWRpbmdNZXNzYWdlc10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW21lc3NhZ2VzLCBzZXRNZXNzYWdlc10gPSB1c2VTdGF0ZTxDaGF0TWVzc2FnZVtdPigoKSA9PlxuICAgIGhhc01lYW5pbmdmdWxVc2VySW5pdGlhbE1lc3NhZ2UodXNlckluaXRpYWxNZXNzYWdlKSAmJiB1c2VySW5pdGlhbE1lc3NhZ2VcbiAgICAgID8gYnVpbGRJbml0aWFsTWVzc2FnZVBsYWNlaG9sZGVyKHVzZXJJbml0aWFsTWVzc2FnZSwgY3VycmVudFVzZXIpXG4gICAgICA6IFtdXG4gIClcbiAgY29uc3QgeyBmZXRjaFByb2plY3RzIH0gPSB1c2VQcm9qZWN0cygpXG4gIGNvbnN0IHsgc2VsZWN0QWdlbnQsIHNldENoaXBzUHJvamVjdCwgc2V0UHJvamVjdCwgc2V0Q2xpZW50LCBzZXRUYXNrLCBwcm9qZWN0IH0gPSB1c2VHbG9iYWxDb250ZXh0KClcbiAgY29uc3QgeyBnZXRUYWJUYXNrRGVmYXVsdCwgdGFiVGFza0RlZmF1bHQsIHJlZmV0Y2hUYWJUYXNrRGVmYXVsdCB9ID0gdXNlVGFiVGFza0RlZmF1bHQoKVxuICBjb25zdCBbaXNMb2FkaW5nTW9yZU1lc3NhZ2VzLCBzZXRJc0xvYWRpbmdNb3JlTWVzc2FnZXNdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtsYXN0RXZhbHVhdGVkS2V5LCBzZXRMYXN0RXZhbHVhdGVkS2V5XSA9IHVzZVN0YXRlPG51bWJlciB8IHVuZGVmaW5lZD4oMClcbiAgY29uc3QgaXNMb2FkaW5nUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBpbml0aWFsTG9hZERvbmUgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IHByZXZpb3VzQ2hhdElkID0gdXNlUmVmKGNoYXRJZClcbiAgY29uc3QgbG9hZFNlcVJlZiA9IHVzZVJlZigwKVxuXG4gIGNvbnN0IHN5bmNNZXNzYWdlc1RvU3RvcmUgPSB1c2VDYWxsYmFjayhcbiAgICAodGFyZ2V0Q2hhdElkOiBzdHJpbmcsIG5leHRNZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSwgbGFzdEV2YWx1YXRlZEtleVZhbHVlPzogbnVtYmVyKSA9PiB7XG4gICAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuc2V0TWVzc2FnZXModGFyZ2V0Q2hhdElkLCBuZXh0TWVzc2FnZXMpXG4gICAgICBpZiAobGFzdEV2YWx1YXRlZEtleVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLnBhdGNoVmlld0NhY2hlKHRhcmdldENoYXRJZCwgeyBsYXN0RXZhbHVhdGVkS2V5OiBsYXN0RXZhbHVhdGVkS2V5VmFsdWUgfSlcbiAgICAgIH1cbiAgICB9LFxuICAgIFtdXG4gIClcblxuICBjb25zdCBzZXRDb252ZXJzYXRpb25Db250ZXh0RnJvbU1ldGFkYXRhID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHtcbiAgICAgIHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgY2xpZW50SWRGcm9tU2Vzc2lvbixcbiAgICAgIGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgIHRhc2tJZEZyb21TZXNzaW9uLFxuICAgICAgdGFza05hbWVGcm9tU2Vzc2lvbixcbiAgICB9OiB7XG4gICAgICBwcm9qZWN0SWRNZXNzYWdlOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgICBwcm9qZWN0TmFtZUZyb21TZXNzaW9uOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgICBjbGllbnRJZEZyb21TZXNzaW9uOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgICBjbGllbnROYW1lRnJvbVNlc3Npb246IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbiAgICAgIHRhc2tJZEZyb21TZXNzaW9uOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgICB0YXNrTmFtZUZyb21TZXNzaW9uOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgfSkgPT4ge1xuICAgICAgLy8gVGFyZWEgZGUgbGEgY29udmVyc2FjacOzbjogc2UgZGVyaXZhIGRlIGxhIG1ldGFkYXRhIGRlIGxhIHNlc3Npb24gcGFyYSBtb3N0cmFyIGVsIGNoaXBcbiAgICAgIC8vIGRlIGxhIHRhcmVhICh5IHJlZW52aWFyIGxhIG1ldGFkYXRhIGVuIGNhZGEgbWVuc2FqZSkgc2luIGltcG9ydGFyIGRlc2RlIGTDs25kZSBzZSBhYnJhLlxuICAgICAgaWYgKHRhc2tJZEZyb21TZXNzaW9uICE9IG51bGwgJiYgdGFza05hbWVGcm9tU2Vzc2lvbikge1xuICAgICAgICBzZXRUYXNrKHsgaWQ6IHRhc2tJZEZyb21TZXNzaW9uLCBuYW1lOiB0YXNrTmFtZUZyb21TZXNzaW9uIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRUYXNrKG51bGwpXG4gICAgICB9XG5cbiAgICAgIC8vIENvbnZlcnNhY2nDs24gY29uIGNsaWVudF9tZXRhZGF0YTogc2V0ZWFyIGNsaWVudGUgeSBsaW1waWFyIHByb3llY3RvXG4gICAgICBpZiAoY2xpZW50SWRGcm9tU2Vzc2lvbiAhPSBudWxsICYmIGNsaWVudE5hbWVGcm9tU2Vzc2lvbikge1xuICAgICAgICBzZXRDbGllbnQoeyBpZDogTnVtYmVyKGNsaWVudElkRnJvbVNlc3Npb24pLCBuYW1lOiBjbGllbnROYW1lRnJvbVNlc3Npb24gfSlcbiAgICAgICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmV0Y2hQcm9qZWN0cyhwcm9qZWN0SWRNZXNzYWdlKVxuICAgICAgY29uc3QgaGFzTXVsdGlBZ2VudHNBY2Nlc3MgPSAhIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTXG5cbiAgICAgIGlmIChwcm9qZWN0SWRNZXNzYWdlICYmIGhhc011bHRpQWdlbnRzQWNjZXNzKSB7XG4gICAgICAgIGNvbnN0IHByb2plY3RJZE51bSA9IE51bWJlcihwcm9qZWN0SWRNZXNzYWdlKVxuICAgICAgICBjb25zdCBmb3VuZFByb2plY3QgPSBwcm9qZWN0cz8uZmluZChwID0+IE51bWJlcihwLmlkKSA9PT0gcHJvamVjdElkTnVtKVxuXG4gICAgICAgIGlmIChmb3VuZFByb2plY3QpIHtcbiAgICAgICAgICBzZXRDaGlwc1Byb2plY3Qoe1xuICAgICAgICAgICAgcHJvamVjdE5hbWU6IGZvdW5kUHJvamVjdC5uYW1lLFxuICAgICAgICAgICAgY2xpZW50TmFtZTogZm91bmRQcm9qZWN0LmNsaWVudD8ubmFtZSB8fCAnJyxcbiAgICAgICAgICAgIHByb2plY3RJZDogU3RyaW5nKGZvdW5kUHJvamVjdC5pZCksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBzZXRQcm9qZWN0KGZvdW5kUHJvamVjdClcbiAgICAgICAgfSBlbHNlIGlmIChwcm9qZWN0TmFtZUZyb21TZXNzaW9uKSB7XG4gICAgICAgICAgc2V0Q2hpcHNQcm9qZWN0KHtcbiAgICAgICAgICAgIHByb2plY3ROYW1lOiBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgY2xpZW50TmFtZTogJycsXG4gICAgICAgICAgICBwcm9qZWN0SWQ6IFN0cmluZyhwcm9qZWN0SWRNZXNzYWdlKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHNldFByb2plY3QoeyBpZDogcHJvamVjdElkTnVtLCBuYW1lOiBwcm9qZWN0TmFtZUZyb21TZXNzaW9uIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgICAgIHNldENsaWVudD8uKG51bGwpXG4gICAgICB9XG4gICAgfSxcbiAgICBbZmV0Y2hQcm9qZWN0cywgc2V0Q2xpZW50LCBzZXRDaGlwc1Byb2plY3QsIHNldFByb2plY3QsIHNldFRhc2tdXG4gIClcblxuICBjb25zdCByZXN0b3JlU2Vzc2lvbkZyb21TdG9yZSA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jICh0YXJnZXRDaGF0SWQ6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbnNTdG9yZSA9IHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKVxuICAgICAgY29uc3QgY2FjaGVkTWVzc2FnZXMgPSBzZXNzaW9uc1N0b3JlLmdldE1lc3NhZ2VzKHRhcmdldENoYXRJZClcbiAgICAgIGNvbnN0IGNhY2hlID0gc2Vzc2lvbnNTdG9yZS5nZXRWaWV3Q2FjaGUodGFyZ2V0Q2hhdElkKVxuXG4gICAgICBzZXRNZXNzYWdlcyhjYWNoZWRNZXNzYWdlcylcbiAgICAgIHNldExhc3RFdmFsdWF0ZWRLZXkoY2FjaGU/Lmxhc3RFdmFsdWF0ZWRLZXkgPz8gMClcbiAgICAgIGluaXRpYWxMb2FkRG9uZS5jdXJyZW50ID0gdHJ1ZVxuXG4gICAgICBpZiAoY2FjaGU/LmFnZW50U25hcHNob3QpIHtcbiAgICAgICAgc2VsZWN0QWdlbnQoY2FjaGUuYWdlbnRTbmFwc2hvdClcbiAgICAgIH1cblxuICAgICAgaWYgKGNhY2hlPy5jb252ZXJzYXRpb25NZXRhKSB7XG4gICAgICAgIGF3YWl0IHNldENvbnZlcnNhdGlvbkNvbnRleHRGcm9tTWV0YWRhdGEoe1xuICAgICAgICAgIHByb2plY3RJZE1lc3NhZ2U6IGNhY2hlLmNvbnZlcnNhdGlvbk1ldGEucHJvamVjdElkTWVzc2FnZSxcbiAgICAgICAgICBwcm9qZWN0TmFtZUZyb21TZXNzaW9uOiBjYWNoZS5jb252ZXJzYXRpb25NZXRhLnByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50SWRGcm9tU2Vzc2lvbjogY2FjaGUuY29udmVyc2F0aW9uTWV0YS5jbGllbnRJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudE5hbWVGcm9tU2Vzc2lvbjogY2FjaGUuY29udmVyc2F0aW9uTWV0YS5jbGllbnROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza0lkRnJvbVNlc3Npb246IGNhY2hlLmNvbnZlcnNhdGlvbk1ldGEudGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza05hbWVGcm9tU2Vzc2lvbjogY2FjaGUuY29udmVyc2F0aW9uTWV0YS50YXNrTmFtZUZyb21TZXNzaW9uLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoY2FjaGU/LnNlc3Npb25NZXRhRXZlbnQpIHtcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ21haWEtY2hhdC1zZXNzaW9uLW1ldGEnLCB7XG4gICAgICAgICAgICBkZXRhaWw6IGNhY2hlLnNlc3Npb25NZXRhRXZlbnQsXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0sXG4gICAgW3NlbGVjdEFnZW50LCBzZXRDb252ZXJzYXRpb25Db250ZXh0RnJvbU1ldGFkYXRhXVxuICApXG5cbiAgY29uc3QgbG9hZE1lc3NhZ2VzID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKG9wdGlvbnM/OiBMb2FkTWVzc2FnZXNPcHRpb25zKSA9PiB7XG4gICAgICBpZiAoIW9wdGlvbnM/LmZvcmNlICYmIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5jYW5SZXN0b3JlU2Vzc2lvbihjaGF0SWQpKSB7XG4gICAgICAgIGF3YWl0IHJlc3RvcmVTZXNzaW9uRnJvbVN0b3JlKGNoYXRJZClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGxvYWRTZXFSZWYuY3VycmVudCArPSAxXG4gICAgICBjb25zdCBzZXEgPSBsb2FkU2VxUmVmLmN1cnJlbnRcbiAgICAgIGNvbnN0IHRhcmdldENoYXRJZCA9IGNoYXRJZFxuXG4gICAgICB0cnkge1xuICAgICAgICBzZXRMb2FkaW5nTWVzc2FnZXModHJ1ZSlcbiAgICAgICAgaW5pdGlhbExvYWREb25lLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICBjb25zb2xlLmluZm8oJ1t1c2VDaGF0TWVzc2FnZXNdIGxvYWRNZXNzYWdlcyBzdGFydCcsIHsgY2hhdElkOiB0YXJnZXRDaGF0SWQsIHNlcSwgZm9yY2U6IG9wdGlvbnM/LmZvcmNlIH0pXG4gICAgICAgIGxldCBhZ2VudFNuYXBzaG90OiBBZ2VudCB8IG51bGwgPSBudWxsXG4gICAgICAgIGNvbnN0IHNlbGVjdEFnZW50Rm9yU2Vzc2lvbiA9IChuZXh0OiBBZ2VudCkgPT4ge1xuICAgICAgICAgIHNlbGVjdEFnZW50KG5leHQpXG4gICAgICAgICAgYWdlbnRTbmFwc2hvdCA9IG5leHRcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgaXRlbXMsXG4gICAgICAgICAgbmV4dEl0ZW0sXG4gICAgICAgICAgYWdlbnREZWxldGVkLFxuICAgICAgICAgIGFnZW50Tm9QZXJtaXNzaW9uLFxuICAgICAgICAgIGhhc0FnZW50QWNjZXNzLFxuICAgICAgICAgIGhhc0FnZW50UGVybWlzc2lvbixcbiAgICAgICAgICBhZ2VudFR5cGU6IGFnZW50VHlwZUZyb21TZXNzaW9uLFxuICAgICAgICAgIGFnZW50RW50aXR5OiBhZ2VudEVudGl0eUZyb21TZXNzaW9uLFxuICAgICAgICAgIHByb2plY3RJZDogcHJvamVjdElkTWVzc2FnZSxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogcHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBwcm9qZWN0RGVsZXRlZCxcbiAgICAgICAgICBjbGllbnRJZDogY2xpZW50SWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnROYW1lOiBjbGllbnROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza0lkOiB0YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrTmFtZTogdGFza05hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgfSA9IGF3YWl0IG1haWEuQ2hhdHMuZ2V0Q2hhdE1lc3NhZ2VzKHtcbiAgICAgICAgICBjaGF0SWQ6IHRhcmdldENoYXRJZCxcbiAgICAgICAgICBjdXJyZW50VXNlcixcbiAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgY2FuY2VsbGVkVGV4dDogdCgnY2hhdC5jYW5jZWxsZWQnKSxcbiAgICAgICAgICBsYW5nOiBtYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpLFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChzZXEgIT09IGxvYWRTZXFSZWYuY3VycmVudCB8fCB0YXJnZXRDaGF0SWQgIT09IGNoYXRJZCkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbygnW3VzZUNoYXRNZXNzYWdlc10gbG9hZE1lc3NhZ2VzIHN0YWxlIHJlc3BvbnNlIGRpc2NhcmRlZCcsIHtcbiAgICAgICAgICAgIHRhcmdldENoYXRJZCxcbiAgICAgICAgICAgIGN1cnJlbnRDaGF0SWQ6IGNoYXRJZCxcbiAgICAgICAgICAgIHNlcSxcbiAgICAgICAgICAgIGN1cnJlbnRTZXE6IGxvYWRTZXFSZWYuY3VycmVudCxcbiAgICAgICAgICAgIGl0ZW1Db3VudDogaXRlbXMubGVuZ3RoLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmluZm8oJ1t1c2VDaGF0TWVzc2FnZXNdIGxvYWRNZXNzYWdlcyByZXN1bHQ6Jywge1xuICAgICAgICAgIGNoYXRJZDogdGFyZ2V0Q2hhdElkLFxuICAgICAgICAgIGl0ZW1Db3VudDogaXRlbXMubGVuZ3RoLFxuICAgICAgICAgIGFnZW50Tm9QZXJtaXNzaW9uLFxuICAgICAgICAgIGFnZW50RGVsZXRlZDogISFhZ2VudERlbGV0ZWQsXG4gICAgICAgICAgaGFzQWdlbnRBY2Nlc3MsXG4gICAgICAgICAgaGFzQWdlbnRQZXJtaXNzaW9uLFxuICAgICAgICAgIHVzZXJQZXJtaXNzaW9uc1ZpZXc6IHVzZXJQZXJtaXNzaW9ucz8udmlldyxcbiAgICAgICAgICBhZ2VudEluQWdlbnRzTGlzdDogYWdlbnROb1Blcm1pc3Npb24gPyAhIWFnZW50cy5maW5kKGEgPT4gYS5pZCA9PT0gYWdlbnROb1Blcm1pc3Npb24uaWQpIDogbnVsbCxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoYWdlbnREZWxldGVkKSB7XG4gICAgICAgICAgc2VsZWN0QWdlbnRGb3JTZXNzaW9uKHtcbiAgICAgICAgICAgIGlkOiBhZ2VudERlbGV0ZWQuaWQsXG4gICAgICAgICAgICBuYW1lOiBhZ2VudERlbGV0ZWQubmFtZSxcbiAgICAgICAgICAgIGVtb2ppOiBhZ2VudERlbGV0ZWQuZW1vamksXG4gICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgICAgIGlzX2RlbGV0ZWQ6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVkX2F0OiBhZ2VudERlbGV0ZWQuZGVsZXRlZEF0LFxuICAgICAgICAgICAgLi4uKGFnZW50Tm9QZXJtaXNzaW9uPy5jb25uZWN0b3JzID8geyBjb25uZWN0b3JzOiBhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzIH0gOiB7fSksXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNpIGVsIGFnZW50ZSBubyBlc3TDoSBlbiBsYSBsaXN0YSBwZXJvIHRpZW5lIHBlcm1pc29zLCBhY2Nlc28geSBubyBlc3TDoSBlbGltaW5hZG8sIHNldGVhcmxvIG5vcm1hbG1lbnRlXG4gICAgICAgIC8vIEV4Y2x1aXIgYWdlbnRlcyBuby1jdXN0b20gcGFyYSB1c3VhcmlvcyBjb24gcm9sZXMgZGVzaGFiaWxpdGFkb3NcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGFnZW50Tm9QZXJtaXNzaW9uICYmXG4gICAgICAgICAgIWFnZW50RGVsZXRlZCAmJlxuICAgICAgICAgIHVzZXJQZXJtaXNzaW9ucz8udmlldyAmJlxuICAgICAgICAgIGhhc0FnZW50QWNjZXNzICYmXG4gICAgICAgICAgaGFzQWdlbnRQZXJtaXNzaW9uICYmXG4gICAgICAgICAgIWFnZW50cy5maW5kKGFnZW50ID0+IGFnZW50LmlkID09PSBhZ2VudE5vUGVybWlzc2lvbi5pZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2VsZWN0QWdlbnRGb3JTZXNzaW9uKHtcbiAgICAgICAgICAgIGlkOiBhZ2VudE5vUGVybWlzc2lvbi5pZCxcbiAgICAgICAgICAgIG5hbWU6IGFnZW50Tm9QZXJtaXNzaW9uLm5hbWUsXG4gICAgICAgICAgICBlbW9qaTogYWdlbnROb1Blcm1pc3Npb24uZW1vamksXG4gICAgICAgICAgICB0eXBlOiBhZ2VudE5vUGVybWlzc2lvbi50eXBlIGFzICdwbScgfCAnY3VzdG9tJyB8ICdjbG9uZScgfCAnb3JjaGVzdHJhdG9yJyxcbiAgICAgICAgICAgIGlzX2Zyb21fY29udmVyc2F0aW9uOiB0cnVlLFxuICAgICAgICAgICAgLi4uKGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgPyB7IGNvbm5lY3RvcnM6IGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihwcm9qZWN0RGVsZXRlZCA/IHsgcHJvamVjdF9kZWxldGVkOiB7IG5hbWU6IHByb2plY3REZWxldGVkLm5hbWUgfSB9IDoge30pLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaSBlbCBhZ2VudGUgZXN0w6EgZW4gbGEgbGlzdGEgeSB0aWVuZSBhY2Nlc28vcGVybWlzb3MsIGFjdHVhbGl6YXIgcHJvamVjdF9kZWxldGVkIChvIGxpbXBpYXJsbyBhbCBjYW1iaWFyIGRlIGNoYXQpXG4gICAgICAgIGlmIChcbiAgICAgICAgICBhZ2VudE5vUGVybWlzc2lvbiAmJlxuICAgICAgICAgICFhZ2VudERlbGV0ZWQgJiZcbiAgICAgICAgICBoYXNBZ2VudEFjY2VzcyAmJlxuICAgICAgICAgIGhhc0FnZW50UGVybWlzc2lvbiAmJlxuICAgICAgICAgIGFnZW50cy5maW5kKGEgPT4gYS5pZCA9PT0gYWdlbnROb1Blcm1pc3Npb24uaWQpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGFnZW50SW5MaXN0ID0gYWdlbnRzLmZpbmQoYSA9PiBhLmlkID09PSBhZ2VudE5vUGVybWlzc2lvbi5pZClcbiAgICAgICAgICBpZiAoYWdlbnRJbkxpc3QpIHtcbiAgICAgICAgICAgIHNlbGVjdEFnZW50Rm9yU2Vzc2lvbih7XG4gICAgICAgICAgICAgIC4uLmFnZW50SW5MaXN0LFxuICAgICAgICAgICAgICAuLi4oYWdlbnROb1Blcm1pc3Npb24uY29ubmVjdG9ycyA/IHsgY29ubmVjdG9yczogYWdlbnROb1Blcm1pc3Npb24uY29ubmVjdG9ycyB9IDoge30pLFxuICAgICAgICAgICAgICAuLi4ocHJvamVjdERlbGV0ZWQgPyB7IHByb2plY3RfZGVsZXRlZDogeyBuYW1lOiBwcm9qZWN0RGVsZXRlZC5uYW1lIH0gfSA6IHsgcHJvamVjdF9kZWxldGVkOiB1bmRlZmluZWQgfSksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNpIGVsIGFnZW50ZSBubyB0aWVuZSBhY2Nlc28gbyBwZXJtaXNvcyBzZWfDum4gbGEgcmVzcHVlc3RhIGRlIHNlc3Npb25zLCBzZWxlY2Npb25hcmxvIGNvbiBlbCBmbGFnIGNvcnJlc3BvbmRpZW50ZVxuICAgICAgICAvLyBMYSB2YWxpZGFjacOzbiBhaG9yYSBzZSBiYXNhIGVuIGxhcyBwcm9waWVkYWRlcyBoYXNfYWdlbnRfYWNjZXNzIHkgaGFzX2FnZW50X3Blcm1pc3Npb24gZGUgbGEgcmVzcHVlc3RhXG4gICAgICAgIGlmIChhZ2VudE5vUGVybWlzc2lvbiAmJiAhYWdlbnREZWxldGVkKSB7XG4gICAgICAgICAgaWYgKCFoYXNBZ2VudEFjY2Vzcykge1xuICAgICAgICAgICAgLy8gQ2FzbyAxOiBObyB0aWVuZSBhY2Nlc28gYWwgYWdlbnRlXG4gICAgICAgICAgICBjb25zb2xlLmluZm8oJ1t1c2VDaGF0TWVzc2FnZXNdIEJSQU5DSDogaGFzX25vdF9hY2Nlc3Mg4oCUIGhhc0FnZW50QWNjZXNzOicsIGhhc0FnZW50QWNjZXNzKVxuICAgICAgICAgICAgc2VsZWN0QWdlbnRGb3JTZXNzaW9uKHtcbiAgICAgICAgICAgICAgaWQ6IGFnZW50Tm9QZXJtaXNzaW9uLmlkLFxuICAgICAgICAgICAgICBuYW1lOiBhZ2VudE5vUGVybWlzc2lvbi5uYW1lLFxuICAgICAgICAgICAgICBlbW9qaTogYWdlbnROb1Blcm1pc3Npb24uZW1vamksXG4gICAgICAgICAgICAgIHR5cGU6IGFnZW50Tm9QZXJtaXNzaW9uLnR5cGUgYXMgJ3BtJyB8ICdjdXN0b20nIHwgJ2Nsb25lJyB8ICdvcmNoZXN0cmF0b3InLFxuICAgICAgICAgICAgICBoYXNfbm90X2FjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgLi4uKGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgPyB7IGNvbm5lY3RvcnM6IGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgfSA6IHt9KSxcbiAgICAgICAgICAgICAgLi4uKHByb2plY3REZWxldGVkID8geyBwcm9qZWN0X2RlbGV0ZWQ6IHsgbmFtZTogcHJvamVjdERlbGV0ZWQubmFtZSB9IH0gOiB7fSksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSBpZiAoIWhhc0FnZW50UGVybWlzc2lvbikge1xuICAgICAgICAgICAgLy8gQ2FzbyAyOiBObyB0aWVuZSBwZXJtaXNvcyBwYXJhIHZpc3VhbGl6YXIvaW50ZXJhY3R1YXIgY29uIGVsIGFnZW50ZVxuICAgICAgICAgICAgY29uc29sZS5pbmZvKCdbdXNlQ2hhdE1lc3NhZ2VzXSBCUkFOQ0g6IGhhc19ub3RfcGVybWlzc2lvbnMg4oCUIGhhc0FnZW50UGVybWlzc2lvbjonLCBoYXNBZ2VudFBlcm1pc3Npb24pXG4gICAgICAgICAgICBzZWxlY3RBZ2VudEZvclNlc3Npb24oe1xuICAgICAgICAgICAgICBpZDogYWdlbnROb1Blcm1pc3Npb24uaWQsXG4gICAgICAgICAgICAgIG5hbWU6IGFnZW50Tm9QZXJtaXNzaW9uLm5hbWUsXG4gICAgICAgICAgICAgIGVtb2ppOiBhZ2VudE5vUGVybWlzc2lvbi5lbW9qaSxcbiAgICAgICAgICAgICAgdHlwZTogYWdlbnROb1Blcm1pc3Npb24udHlwZSBhcyAncG0nIHwgJ2N1c3RvbScgfCAnY2xvbmUnIHwgJ29yY2hlc3RyYXRvcicsXG4gICAgICAgICAgICAgIGhhc19ub3RfcGVybWlzc2lvbnM6IHRydWUsXG4gICAgICAgICAgICAgIC4uLihhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzID8geyBjb25uZWN0b3JzOiBhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzIH0gOiB7fSksXG4gICAgICAgICAgICAgIC4uLihwcm9qZWN0RGVsZXRlZCA/IHsgcHJvamVjdF9kZWxldGVkOiB7IG5hbWU6IHByb2plY3REZWxldGVkLm5hbWUgfSB9IDoge30pLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHByb2plY3REZWxldGVkKSB7XG4gICAgICAgICAgICAvLyBDYXNvIDM6IEVsIHByb3llY3RvIGRlIGxhIGNvbnZlcnNhY2nDs24gZnVlIGVsaW1pbmFkb1xuICAgICAgICAgICAgc2VsZWN0QWdlbnRGb3JTZXNzaW9uKHtcbiAgICAgICAgICAgICAgaWQ6IGFnZW50Tm9QZXJtaXNzaW9uLmlkLFxuICAgICAgICAgICAgICBuYW1lOiBhZ2VudE5vUGVybWlzc2lvbi5uYW1lLFxuICAgICAgICAgICAgICBlbW9qaTogYWdlbnROb1Blcm1pc3Npb24uZW1vamksXG4gICAgICAgICAgICAgIHR5cGU6IGFnZW50Tm9QZXJtaXNzaW9uLnR5cGUgYXMgJ3BtJyB8ICdjdXN0b20nIHwgJ2Nsb25lJyB8ICdvcmNoZXN0cmF0b3InLFxuICAgICAgICAgICAgICAuLi4oYWdlbnROb1Blcm1pc3Npb24uY29ubmVjdG9ycyA/IHsgY29ubmVjdG9yczogYWdlbnROb1Blcm1pc3Npb24uY29ubmVjdG9ycyB9IDoge30pLFxuICAgICAgICAgICAgICBwcm9qZWN0X2RlbGV0ZWQ6IHsgbmFtZTogcHJvamVjdERlbGV0ZWQubmFtZSB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBzZXRDb252ZXJzYXRpb25Db250ZXh0RnJvbU1ldGFkYXRhKHtcbiAgICAgICAgICBwcm9qZWN0SWRNZXNzYWdlLFxuICAgICAgICAgIHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50SWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza05hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBNZXRhZGF0YSBkZSBsYSBzZXNzaW9uIChhZ2VudF90eXBlIC8gYWdlbnRfZW50aXR5ICsgY29udGV4dG8pIHBhcmEgZWwgY2FydGVsIGRlXG4gICAgICAgIC8vIFwiY29udGludWFyIGVuIHVuIGNoYXQgbnVldm9cIiBkZWwgZm9vdGVyIGN1YW5kbyBzZSBhYnJlIHVuYSBjb252ZXJzYWNpw7NuIGRlIHVuIGNsb25lIGxlZ2FjeS5cbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ21haWEtY2hhdC1zZXNzaW9uLW1ldGEnLCB7XG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgY2hhdElkLFxuICAgICAgICAgICAgICBhZ2VudFR5cGU6IGFnZW50VHlwZUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgICBhZ2VudEVudGl0eTogYWdlbnRFbnRpdHlGcm9tU2Vzc2lvbixcbiAgICAgICAgICAgICAgcHJvamVjdElkOiBwcm9qZWN0SWRNZXNzYWdlLFxuICAgICAgICAgICAgICBwcm9qZWN0TmFtZTogcHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICAgICAgY2xpZW50SWQ6IGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgICAgIGNsaWVudE5hbWU6IGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICAgICAgdGFza0lkOiB0YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICAgICAgdGFza05hbWU6IHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgIClcblxuICAgICAgICAvLyBTaSBoYXkgcHJveWVjdG8gZW4gbGEgY29udmVyc2FjacOzbiwgcmVlc2NyaWJpciBVUkxzIGRlIHRhcmVhcyBjb24gZWwgdGFiIGRlbCB1c3VhcmlvIChtZSlcbiAgICAgICAgY29uc3QgY29udGV4dFByb2plY3RJZCA9IHByb2plY3RJZE1lc3NhZ2UgPyBwYXJzZUludChTdHJpbmcocHJvamVjdElkTWVzc2FnZSksIDEwKSA6IG51bGxcbiAgICAgICAgbGV0IGl0ZW1zVG9TZXQgPSBpdGVtc1xuICAgICAgICBpZiAoY29udGV4dFByb2plY3RJZCkge1xuICAgICAgICAgIGNvbnN0IHRhYiA9IGF3YWl0IGdldFRhYlRhc2tEZWZhdWx0KDEpXG4gICAgICAgICAgY29uc3QgdGFiU2VnbWVudCA9IHRhYiA/IGAvJHt0YWJ9YCA6ICcvZGV0YWlsJ1xuICAgICAgICAgIGl0ZW1zVG9TZXQgPSBpdGVtcy5tYXAoaXRlbSA9PiAoe1xuICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHJld3JpdGVUYXNrVXJsc0luQ29udGVudChpdGVtLm1lc3NhZ2UgfHwgJycsIHRhYlNlZ21lbnQpLFxuICAgICAgICAgIH0pKVxuICAgICAgICB9XG4gICAgICAgIC8vIFNpIGxhIHNlc2nDs24gc2lndWUgZ2VuZXJhbmRvIChzdHJlYW0gZW4gYmFja2dyb3VuZCksIHJlY29uc3RydWltb3MgZWxcbiAgICAgICAgLy8gdGFpbCBlbiB2dWVsbyAocHJlZ3VudGEgKyBwbGFjZWhvbGRlcikgcXVlIGHDum4gbm8gZXN0w6EgcGVyc2lzdGlkbyBlbiBlbFxuICAgICAgICAvLyBiYWNrZW5kLCBtZXJnZcOhbmRvbG8gYWwgaGlzdG9yaWFsIGNhcmdhZG8gc2luIGR1cGxpY2FyIHBvciBpZC5cbiAgICAgICAgY29uc3Qgc2Vzc2lvbk1ldGEgPSB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuZ2V0TWV0YShjaGF0SWQpXG4gICAgICAgIGxldCBmaW5hbE1lc3NhZ2VzID0gaXRlbXNUb1NldFxuICAgICAgICBpZiAoc2Vzc2lvbk1ldGEgJiYgaXNBY3RpdmVTZXNzaW9uU3RhdHVzKHNlc3Npb25NZXRhLnN0YXR1cykpIHtcbiAgICAgICAgICBjb25zdCB0YWlsID0gdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLmdldE1lc3NhZ2VzKGNoYXRJZClcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQoaXRlbXNUb1NldC5tYXAoaXRlbSA9PiBpdGVtLmlkKSlcbiAgICAgICAgICBjb25zdCBleHRyYSA9IHRhaWwuZmlsdGVyKGl0ZW0gPT4gIWV4aXN0aW5nSWRzLmhhcyhpdGVtLmlkKSlcbiAgICAgICAgICBpZiAoZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgICAgICBmaW5hbE1lc3NhZ2VzID0gWy4uLml0ZW1zVG9TZXQsIC4uLmV4dHJhXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbk1ldGE6IFNlc3Npb25Db252ZXJzYXRpb25NZXRhID0ge1xuICAgICAgICAgIHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnRJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrTmFtZUZyb21TZXNzaW9uLFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2Vzc2lvbk1ldGFFdmVudDogU2Vzc2lvbk1ldGFFdmVudERldGFpbCA9IHtcbiAgICAgICAgICBjaGF0SWQsXG4gICAgICAgICAgYWdlbnRUeXBlOiBhZ2VudFR5cGVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBhZ2VudEVudGl0eTogYWdlbnRFbnRpdHlGcm9tU2Vzc2lvbixcbiAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWU6IHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50SWQ6IGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZTogY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tJZDogdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza05hbWU6IHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH1cblxuICAgICAgICBzZXRNZXNzYWdlcyhmaW5hbE1lc3NhZ2VzKVxuICAgICAgICBjb25zdCBwYWdpbmF0aW9uS2V5ID0gTnVtYmVyKG5leHRJdGVtKVxuICAgICAgICBzZXRMYXN0RXZhbHVhdGVkS2V5KHBhZ2luYXRpb25LZXkpXG4gICAgICAgIGluaXRpYWxMb2FkRG9uZS5jdXJyZW50ID0gdHJ1ZVxuXG4gICAgICAgIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5zZXRNZXNzYWdlcyh0YXJnZXRDaGF0SWQsIGZpbmFsTWVzc2FnZXMpXG4gICAgICAgIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5zZXRWaWV3Q2FjaGUodGFyZ2V0Q2hhdElkLCB7XG4gICAgICAgICAgaHlkcmF0ZWRGcm9tQXBpOiB0cnVlLFxuICAgICAgICAgIGxhc3RFdmFsdWF0ZWRLZXk6IHBhZ2luYXRpb25LZXksXG4gICAgICAgICAgY29udmVyc2F0aW9uTWV0YSxcbiAgICAgICAgICBzZXNzaW9uTWV0YUV2ZW50LFxuICAgICAgICAgIGFnZW50U25hcHNob3QsXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoc2VxID09PSBsb2FkU2VxUmVmLmN1cnJlbnQgJiYgdGFyZ2V0Q2hhdElkID09PSBjaGF0SWQpIHtcbiAgICAgICAgICBvbkVycm9yPy4oKVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoc2VxID09PSBsb2FkU2VxUmVmLmN1cnJlbnQgJiYgdGFyZ2V0Q2hhdElkID09PSBjaGF0SWQpIHtcbiAgICAgICAgICBzZXRMb2FkaW5nTWVzc2FnZXMoZmFsc2UpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIGNoYXRJZCxcbiAgICAgIGN1cnJlbnRVc2VyLFxuICAgICAgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YSxcbiAgICAgIG9uRXJyb3IsXG4gICAgICBnZXRUYWJUYXNrRGVmYXVsdCxcbiAgICAgIHJlc3RvcmVTZXNzaW9uRnJvbVN0b3JlLFxuICAgICAgc2VsZWN0QWdlbnQsXG4gICAgICBhZ2VudHMsXG4gICAgICB0LFxuICAgICAgaTE4bi5sYW5ndWFnZSxcbiAgICAgIHVzZXJQZXJtaXNzaW9ucz8udmlldyxcbiAgICBdXG4gIClcblxuICBjb25zdCBsb2FkTW9yZU1lc3NhZ2VzID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgfCBudWxsKSA9PiB7XG4gICAgICBpZiAoaXNMb2FkaW5nUmVmLmN1cnJlbnQgfHwgIWxhc3RFdmFsdWF0ZWRLZXkgfHwgIWNvbnRhaW5lcikgcmV0dXJuXG4gICAgICB0cnkge1xuICAgICAgICBpc0xvYWRpbmdSZWYuY3VycmVudCA9IHRydWVcbiAgICAgICAgc2V0SXNMb2FkaW5nTW9yZU1lc3NhZ2VzKHRydWUpXG5cbiAgICAgICAgY29uc3Qgb2xkU2Nyb2xsSGVpZ2h0ID0gY29udGFpbmVyLnNjcm9sbEhlaWdodFxuICAgICAgICBjb25zdCBvbGRTY3JvbGxUb3AgPSBjb250YWluZXIuc2Nyb2xsVG9wXG5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGl0ZW1zLFxuICAgICAgICAgIG5leHRJdGVtLFxuICAgICAgICAgIHByb2plY3RJZDogcHJvamVjdElkTWVzc2FnZSxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogcHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnRJZDogY2xpZW50SWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnROYW1lOiBjbGllbnROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza0lkOiB0YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrTmFtZTogdGFza05hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgfSA9IGF3YWl0IG1haWEuQ2hhdHMuZ2V0Q2hhdE1lc3NhZ2VzKHtcbiAgICAgICAgICBjaGF0SWQsXG4gICAgICAgICAgY3VycmVudFVzZXIsXG4gICAgICAgICAgb2Zmc2V0OiBsYXN0RXZhbHVhdGVkS2V5LFxuICAgICAgICAgIGxhbmc6IG1hcENPUkxhbmcoaTE4bi5sYW5ndWFnZSksXG4gICAgICAgIH0pXG5cbiAgICAgICAgYXdhaXQgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YSh7XG4gICAgICAgICAgcHJvamVjdElkTWVzc2FnZSxcbiAgICAgICAgICBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gU2kgaGF5IHByb3llY3RvIGVuIGxhIGNvbnZlcnNhY2nDs24sIHJlZXNjcmliaXIgVVJMcyBkZSB0YXJlYXMgZW4gbG9zIG1lbnNhamVzIGNhcmdhZG9zXG4gICAgICAgIGNvbnN0IGNvbnRleHRQcm9qZWN0SWQgPSBwcm9qZWN0SWRNZXNzYWdlID8gcGFyc2VJbnQoU3RyaW5nKHByb2plY3RJZE1lc3NhZ2UpLCAxMCkgOiBudWxsXG4gICAgICAgIGxldCBpdGVtc1RvTWVyZ2UgPSBpdGVtc1xuICAgICAgICBpZiAoY29udGV4dFByb2plY3RJZCkge1xuICAgICAgICAgIGNvbnN0IHRhYiA9IGF3YWl0IGdldFRhYlRhc2tEZWZhdWx0KDEpXG4gICAgICAgICAgY29uc3QgdGFiU2VnbWVudCA9IHRhYiA/IGAvJHt0YWJ9YCA6ICcvZGV0YWlsJ1xuICAgICAgICAgIGl0ZW1zVG9NZXJnZSA9IGl0ZW1zLm1hcChpdGVtID0+ICh7XG4gICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgbWVzc2FnZTogcmV3cml0ZVRhc2tVcmxzSW5Db250ZW50KGl0ZW0ubWVzc2FnZSB8fCAnJywgdGFiU2VnbWVudCksXG4gICAgICAgICAgfSkpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3TWVzc2FnZXMgPSBbLi4ubWVzc2FnZXMuc2xpY2UoMCwgMSksIC4uLml0ZW1zVG9NZXJnZSwgLi4ubWVzc2FnZXMuc2xpY2UoMSldXG4gICAgICAgIHNldE1lc3NhZ2VzKG5ld01lc3NhZ2VzKVxuICAgICAgICBjb25zdCBwYWdpbmF0aW9uS2V5ID0gTnVtYmVyKG5leHRJdGVtKVxuICAgICAgICBzZXRMYXN0RXZhbHVhdGVkS2V5KHBhZ2luYXRpb25LZXkpXG4gICAgICAgIHN5bmNNZXNzYWdlc1RvU3RvcmUoY2hhdElkLCBuZXdNZXNzYWdlcywgcGFnaW5hdGlvbktleSlcblxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJSZWYgPSBjb250YWluZXJcbiAgICAgICAgICAgIGlmIChjb250YWluZXJSZWYpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3U2Nyb2xsSGVpZ2h0ID0gY29udGFpbmVyUmVmLnNjcm9sbEhlaWdodFxuICAgICAgICAgICAgICBjb25zdCBoZWlnaHREaWZmZXJlbmNlID0gbmV3U2Nyb2xsSGVpZ2h0IC0gb2xkU2Nyb2xsSGVpZ2h0XG4gICAgICAgICAgICAgIGNvbnRhaW5lclJlZi5zY3JvbGxUb3AgPSBvbGRTY3JvbGxUb3AgKyBoZWlnaHREaWZmZXJlbmNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIG9uRXJyb3I/LigpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc0xvYWRpbmdNb3JlTWVzc2FnZXMoZmFsc2UpXG4gICAgICAgIGlzTG9hZGluZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIGNoYXRJZCxcbiAgICAgIGN1cnJlbnRVc2VyLFxuICAgICAgbGFzdEV2YWx1YXRlZEtleSxcbiAgICAgIG9uRXJyb3IsXG4gICAgICBtZXNzYWdlcyxcbiAgICAgIGdldFRhYlRhc2tEZWZhdWx0LFxuICAgICAgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YSxcbiAgICAgIHN5bmNNZXNzYWdlc1RvU3RvcmUsXG4gICAgXVxuICApXG5cbiAgY29uc3QgaGFuZGxlU2Nyb2xsID0gdXNlQ2FsbGJhY2soXG4gICAgKGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgfCBudWxsKSA9PiB7XG4gICAgICBpZiAoIWNvbnRhaW5lciB8fCBpc0xvYWRpbmdSZWYuY3VycmVudCB8fCAhaW5pdGlhbExvYWREb25lLmN1cnJlbnQpIHJldHVyblxuXG4gICAgICBjb25zdCB7IHNjcm9sbFRvcCwgc2Nyb2xsSGVpZ2h0LCBjbGllbnRIZWlnaHQgfSA9IGNvbnRhaW5lclxuICAgICAgY29uc3Qgc2Nyb2xsUGVyY2VudGFnZSA9IHNjcm9sbEhlaWdodCAtIGNsaWVudEhlaWdodCA+IDAgPyAoc2Nyb2xsVG9wIC8gKHNjcm9sbEhlaWdodCAtIGNsaWVudEhlaWdodCkpICogMTAwIDogMFxuXG4gICAgICBpZiAoc2Nyb2xsUGVyY2VudGFnZSA8IDEwKSB7XG4gICAgICAgIGxvYWRNb3JlTWVzc2FnZXMoY29udGFpbmVyKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2xvYWRNb3JlTWVzc2FnZXNdXG4gIClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChjaGF0SWQgIT09IHByZXZpb3VzQ2hhdElkLmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGZyb21DaGF0SWQgPSBwcmV2aW91c0NoYXRJZC5jdXJyZW50XG4gICAgICBjb25zdCBjYW5SZXN0b3JlID0gdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLmNhblJlc3RvcmVTZXNzaW9uKGNoYXRJZClcbiAgICAgIGNvbnNvbGUuaW5mbygnW3VzZUNoYXRNZXNzYWdlc10gc2Vzc2lvbiBzd2l0Y2gnLCB7IGZyb206IGZyb21DaGF0SWQsIHRvOiBjaGF0SWQsIGNhblJlc3RvcmUgfSlcblxuICAgICAgaXNMb2FkaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgaW5pdGlhbExvYWREb25lLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgcHJldmlvdXNDaGF0SWQuY3VycmVudCA9IGNoYXRJZFxuICAgICAgc2V0TGFzdEV2YWx1YXRlZEtleSgwKVxuICAgICAgbG9hZFNlcVJlZi5jdXJyZW50ICs9IDFcblxuICAgICAgcmVmZXRjaFRhYlRhc2tEZWZhdWx0KClcblxuICAgICAgY29uc3QgcGVuZGluZ0luaXRpYWxNZXNzYWdlID0gaGFzTWVhbmluZ2Z1bFVzZXJJbml0aWFsTWVzc2FnZSh1c2VySW5pdGlhbE1lc3NhZ2UpXG5cbiAgICAgIGlmICghcGVuZGluZ0luaXRpYWxNZXNzYWdlICYmIGNhblJlc3RvcmUpIHtcbiAgICAgICAgcmVzdG9yZVNlc3Npb25Gcm9tU3RvcmUoY2hhdElkKS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW3VzZUNoYXRNZXNzYWdlc10gcmVzdG9yZVNlc3Npb25Gcm9tU3RvcmUgZmFpbGVkJywgZXJyb3IpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBzZXRNZXNzYWdlcyhcbiAgICAgICAgcGVuZGluZ0luaXRpYWxNZXNzYWdlICYmIHVzZXJJbml0aWFsTWVzc2FnZVxuICAgICAgICAgID8gYnVpbGRJbml0aWFsTWVzc2FnZVBsYWNlaG9sZGVyKHVzZXJJbml0aWFsTWVzc2FnZSwgY3VycmVudFVzZXIpXG4gICAgICAgICAgOiBbXVxuICAgICAgKVxuXG4gICAgICAvLyBMaW1waWFyIGVsIGVzdGFkbyBkZWwgcHJveWVjdG8geSBsYSB0YXJlYSBjdWFuZG8gY2FtYmlhIGRlIGNvbnZlcnNhY2nDs25cbiAgICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgc2V0VGFzayhudWxsKVxuXG4gICAgICBpZiAoIXBlbmRpbmdJbml0aWFsTWVzc2FnZSkge1xuICAgICAgICBsb2FkTWVzc2FnZXMoKVxuICAgICAgfVxuICAgIH1cbiAgfSwgW1xuICAgIGNoYXRJZCxcbiAgICB1c2VySW5pdGlhbE1lc3NhZ2UsXG4gICAgY3VycmVudFVzZXIsXG4gICAgbG9hZE1lc3NhZ2VzLFxuICAgIHJlc3RvcmVTZXNzaW9uRnJvbVN0b3JlLFxuICAgIHNldENoaXBzUHJvamVjdCxcbiAgICBzZXRQcm9qZWN0LFxuICAgIHNldFRhc2ssXG4gICAgcmVmZXRjaFRhYlRhc2tEZWZhdWx0LFxuICBdKVxuXG4gIC8vIEN1YW5kbyB0YWJUYXNrRGVmYXVsdCBwYXNhIGEgZXN0YXIgZGlzcG9uaWJsZSBkZXNwdcOpcyBkZSBjYXJnYXIsIHJlZXNjcmliaXIgVVJMcyBkZSB0YXJlYXMgZW4gbG9zIG1lbnNhamVzIHlhIGNhcmdhZG9zLlxuICAvLyBSZWYgcGFyYSBldml0YXIgYnVjbGU6IHNldE1lc3NhZ2VzKHJld3JpdHRlbikgY2FtYmlhIG1lc3NhZ2VzIHkgcmUtZWplY3V0YSBlbCBlZmVjdG87IHNvbG8gcmVlc2NyaWJpbW9zIHVuYSB2ZXogcG9yIGxvdGUuXG4gIGNvbnN0IGRpZFJld3JpdGVSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCF0YWJUYXNrRGVmYXVsdCB8fCAhcHJvamVjdD8uaWQgfHwgbWVzc2FnZXMubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICBjb25zdCB0YXNrVXJsUmVnZXggPSBuZXcgUmVnRXhwKFRBU0tfVVJMX1JFR0VYX1BBVFRFUk4sICdnJylcbiAgICBjb25zdCB0YWJTZWdtZW50ID0gYC8ke3RhYlRhc2tEZWZhdWx0fWBcbiAgICBjb25zdCBuZWVkc1Jld3JpdGUgPSBtZXNzYWdlcy5zb21lKG1zZyA9PiB7XG4gICAgICBjb25zdCBjb250ZW50ID0gbXNnLm1lc3NhZ2UgfHwgJydcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBjb250ZW50Lm1hdGNoKHRhc2tVcmxSZWdleClcbiAgICAgIGlmICghbWF0Y2hlcz8ubGVuZ3RoKSByZXR1cm4gZmFsc2VcbiAgICAgIHJldHVybiBtYXRjaGVzLnNvbWUodXJsID0+ICF1cmwuZW5kc1dpdGgoYC8ke3RhYlRhc2tEZWZhdWx0fWApICYmICF1cmwuaW5jbHVkZXMoYC8ke3RhYlRhc2tEZWZhdWx0fT9gKSlcbiAgICB9KVxuICAgIGlmICghbmVlZHNSZXdyaXRlKSB7XG4gICAgICBkaWRSZXdyaXRlUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkaWRSZXdyaXRlUmVmLmN1cnJlbnQpIHJldHVyblxuICAgIGRpZFJld3JpdGVSZWYuY3VycmVudCA9IHRydWVcbiAgICBjb25zdCByZXdyaXR0ZW4gPSBtZXNzYWdlcy5tYXAobXNnID0+ICh7XG4gICAgICAuLi5tc2csXG4gICAgICBtZXNzYWdlOiByZXdyaXRlVGFza1VybHNJbkNvbnRlbnQobXNnLm1lc3NhZ2UgfHwgJycsIHRhYlNlZ21lbnQpLFxuICAgIH0pKVxuICAgIHNldE1lc3NhZ2VzKHJld3JpdHRlbilcbiAgICBzeW5jTWVzc2FnZXNUb1N0b3JlKGNoYXRJZCwgcmV3cml0dGVuKVxuICB9LCBbdGFiVGFza0RlZmF1bHQsIHByb2plY3Q/LmlkLCBtZXNzYWdlcywgY2hhdElkLCBzeW5jTWVzc2FnZXNUb1N0b3JlXSlcblxuICBjb25zdCBhZGRNZXNzYWdlID0gdXNlQ2FsbGJhY2soXG4gICAgKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB7XG4gICAgICBzZXRNZXNzYWdlcyhwcmV2ID0+IHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdNZXNzYWdlSW5kZXggPSBwcmV2LmZpbmRJbmRleChtc2cgPT4gbXNnLmlkID09PSBtZXNzYWdlLmlkKVxuXG4gICAgICAgIGlmIChleGlzdGluZ01lc3NhZ2VJbmRleCA+PSAwKSB7XG4gICAgICAgICAgY29uc3QgbmV3TWVzc2FnZXMgPSBbLi4ucHJldl1cbiAgICAgICAgICBuZXdNZXNzYWdlc1tleGlzdGluZ01lc3NhZ2VJbmRleF0gPSBtZXNzYWdlXG4gICAgICAgICAgc3luY01lc3NhZ2VzVG9TdG9yZShjaGF0SWQsIG5ld01lc3NhZ2VzKVxuICAgICAgICAgIHJldHVybiBuZXdNZXNzYWdlc1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld01lc3NhZ2VzID0gWy4uLnByZXYsIG1lc3NhZ2VdXG4gICAgICAgIHN5bmNNZXNzYWdlc1RvU3RvcmUoY2hhdElkLCBuZXdNZXNzYWdlcylcbiAgICAgICAgcmV0dXJuIG5ld01lc3NhZ2VzXG4gICAgICB9KVxuICAgIH0sXG4gICAgW2NoYXRJZCwgc3luY01lc3NhZ2VzVG9TdG9yZV1cbiAgKVxuXG4gIGNvbnN0IHJlbW92ZU1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAobWVzc2FnZUlkOiBzdHJpbmcpID0+IHtcbiAgICAgIHNldE1lc3NhZ2VzKHByZXYgPT4ge1xuICAgICAgICBjb25zdCBuZXdNZXNzYWdlcyA9IHByZXYuZmlsdGVyKG1zZyA9PiBtc2cuaWQgIT09IG1lc3NhZ2VJZClcbiAgICAgICAgc3luY01lc3NhZ2VzVG9TdG9yZShjaGF0SWQsIG5ld01lc3NhZ2VzKVxuICAgICAgICByZXR1cm4gbmV3TWVzc2FnZXNcbiAgICAgIH0pXG4gICAgfSxcbiAgICBbY2hhdElkLCBzeW5jTWVzc2FnZXNUb1N0b3JlXVxuICApXG5cbiAgcmV0dXJuIHtcbiAgICBsb2FkaW5nTWVzc2FnZXMsXG4gICAgbWVzc2FnZXMsXG4gICAgaGFzTW9yZU1lc3NhZ2VzOiAhIWxhc3RFdmFsdWF0ZWRLZXksXG4gICAgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzLFxuICAgIGxvYWRNZXNzYWdlcyxcbiAgICBsb2FkTW9yZU1lc3NhZ2VzLFxuICAgIGFkZE1lc3NhZ2UsXG4gICAgcmVtb3ZlTWVzc2FnZSxcbiAgICBoYW5kbGVTY3JvbGwsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0EsU0FBU0EsV0FBVyxFQUFFQyxRQUFRLEVBQUVDLE1BQU0sRUFBRUMsU0FBUyxRQUFRLE9BQU87QUFDaEUsU0FBU0MsV0FBVyxRQUFRLGdCQUFnQjtBQUU1QyxTQUFTQyxtQkFBbUIsUUFBUSw0QkFBNEI7QUFDaEUsT0FBT0MsSUFBSSxNQUFNLHFCQUFxQjtBQUV0QyxTQUFTQyxnQkFBZ0IsUUFBUSw4QkFBOEI7QUFDL0QsU0FBU0MsSUFBSSxRQUFRLFNBQVM7QUFDOUIsU0FBU0MsT0FBTyxRQUFRLHdCQUF3QjtBQUNoRCxTQUFTQyxpQkFBaUIsUUFBUSxzQkFBc0I7QUFDeEQsU0FBU0Msc0JBQXNCLFFBQVEsMEJBQTBCO0FBQ2pFLFNBQVNDLFVBQVUsUUFBUSxrQkFBa0I7QUFDN0MsU0FBU0Msa0NBQWtDLFFBQVEsc0NBQXNDO0FBQ3pGLFNBQVNDLGdCQUFnQixRQUFRLHVDQUF1QztBQUN4RSxTQUFTQyxxQkFBcUIsUUFBUSxxQ0FBcUM7QUFXM0U7QUFDQSxJQUFNQywrQkFBK0IsR0FBRyxTQUFsQ0EsK0JBQStCQSxDQUFJQyxrQkFBdUM7RUFBQSxJQUFBQyxxQkFBQSxFQUFBQyxxQkFBQTtFQUFBLE9BQzlFQyxPQUFPLENBQ0xILGtCQUFrQixLQUNqQixFQUFBQyxxQkFBQSxHQUFBRCxrQkFBa0IsQ0FBQ0ksT0FBTyxjQUFBSCxxQkFBQSx1QkFBMUJBLHFCQUFBLENBQTRCSSxJQUFJLENBQUMsQ0FBQyxPQUFBSCxxQkFBQSxHQUNqQ0Ysa0JBQWtCLENBQUNNLFdBQVcsY0FBQUoscUJBQUEsdUJBQTlCQSxxQkFBQSxDQUFn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
558
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVN0YXRlIiwidXNlUmVmIiwidXNlRWZmZWN0IiwidXNlUHJvamVjdHMiLCJidWlsZENvbnRleHRNZXNzYWdlIiwibWFpYSIsInVzZUdsb2JhbENvbnRleHQiLCJ1c2VUIiwidXNlVXNlciIsInVzZVRhYlRhc2tEZWZhdWx0IiwiVEFTS19VUkxfUkVHRVhfUEFUVEVSTiIsIm1hcENPUkxhbmciLCJmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5IiwicmV3cml0ZVRhc2tVcmxzSW5Db250ZW50IiwiY29udGVudCIsInRhYlNlZ21lbnQiLCJ0YXNrVXJsUmVnZXgiLCJSZWdFeHAiLCJyZXBsYWNlIiwidXJsIiwidXNlQ2hhdE1lc3NhZ2VzIiwiX3JlZiIsIl91c2VyJHBlcm1pc3Npb25zIiwib25FcnJvciIsImNoYXRJZCIsImN1cnJlbnRVc2VyIiwidXNlckluaXRpYWxNZXNzYWdlIiwiX3JlZiRhZ2VudHMiLCJhZ2VudHMiLCJfdXNlVCIsInQiLCJpMThuIiwidXNlciIsInVzZXJQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwiYWlfYWdlbnRzIiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5IiwibG9hZGluZ01lc3NhZ2VzIiwic2V0TG9hZGluZ01lc3NhZ2VzIiwiX3VzZVN0YXRlMyIsIl9vYmplY3RTcHJlYWQiLCJpZCIsImRhdGUiLCJEYXRlIiwibWVzc2FnZSIsImZ1YUlkIiwic2NJZCIsImF0dGFjaG1lbnRzIiwibWVudGlvbnMiLCJjb250ZXh0TWVzc2FnZSIsIl91c2VTdGF0ZTQiLCJtZXNzYWdlcyIsInNldE1lc3NhZ2VzIiwiX3VzZVByb2plY3RzIiwiZmV0Y2hQcm9qZWN0cyIsIl91c2VHbG9iYWxDb250ZXh0Iiwic2VsZWN0QWdlbnQiLCJzZXRDaGlwc1Byb2plY3QiLCJzZXRQcm9qZWN0Iiwic2V0Q2xpZW50Iiwic2V0VGFzayIsInByb2plY3QiLCJfdXNlVGFiVGFza0RlZmF1bHQiLCJnZXRUYWJUYXNrRGVmYXVsdCIsInRhYlRhc2tEZWZhdWx0IiwicmVmZXRjaFRhYlRhc2tEZWZhdWx0IiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJpc0xvYWRpbmdNb3JlTWVzc2FnZXMiLCJzZXRJc0xvYWRpbmdNb3JlTWVzc2FnZXMiLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsImxhc3RFdmFsdWF0ZWRLZXkiLCJzZXRMYXN0RXZhbHVhdGVkS2V5IiwiaXNMb2FkaW5nUmVmIiwiaW5pdGlhbExvYWREb25lIiwicHJldmlvdXNDaGF0SWQiLCJzZXRDb252ZXJzYXRpb25Db250ZXh0RnJvbU1ldGFkYXRhIiwiX3JlZjMiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsIl9yZWYyIiwicHJvamVjdElkTWVzc2FnZSIsInByb2plY3ROYW1lRnJvbVNlc3Npb24iLCJjbGllbnRJZEZyb21TZXNzaW9uIiwiY2xpZW50TmFtZUZyb21TZXNzaW9uIiwidGFza0lkRnJvbVNlc3Npb24iLCJ0YXNrTmFtZUZyb21TZXNzaW9uIiwicHJvamVjdHMiLCJoYXNNdWx0aUFnZW50c0FjY2VzcyIsInByb2plY3RJZE51bSIsImZvdW5kUHJvamVjdCIsIl9mb3VuZFByb2plY3QkY2xpZW50Iiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJuYW1lIiwiTnVtYmVyIiwiYWJydXB0Iiwic2VudCIsIndpbmRvdyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMiLCJmaW5kIiwicCIsInByb2plY3ROYW1lIiwiY2xpZW50TmFtZSIsImNsaWVudCIsInByb2plY3RJZCIsIlN0cmluZyIsInN0b3AiLCJfeCIsImFwcGx5IiwiYXJndW1lbnRzIiwibG9hZE1lc3NhZ2VzIiwiX2NhbGxlZTIiLCJfeWllbGQkbWFpYSRDaGF0cyRnZXQiLCJpdGVtcyIsIm5leHRJdGVtIiwiYWdlbnREZWxldGVkIiwiYWdlbnROb1Blcm1pc3Npb24iLCJoYXNBZ2VudEFjY2VzcyIsImhhc0FnZW50UGVybWlzc2lvbiIsImFnZW50VHlwZUZyb21TZXNzaW9uIiwiYWdlbnRFbnRpdHlGcm9tU2Vzc2lvbiIsInByb2plY3REZWxldGVkIiwiYWdlbnRJbkxpc3QiLCJjb250ZXh0UHJvamVjdElkIiwiaXRlbXNUb1NldCIsInRhYiIsIl90IiwiX2NvbnRleHQyIiwiY3VycmVudCIsIkNoYXRzIiwiZ2V0Q2hhdE1lc3NhZ2VzIiwib2Zmc2V0IiwiY2FuY2VsbGVkVGV4dCIsImxhbmciLCJsYW5ndWFnZSIsImFnZW50VHlwZSIsImFnZW50RW50aXR5IiwiY2xpZW50SWQiLCJ0YXNrSWQiLCJ0YXNrTmFtZSIsImVtb2ppIiwidHlwZSIsImlzX2RlbGV0ZWQiLCJkZWxldGVkX2F0IiwiZGVsZXRlZEF0IiwiY29ubmVjdG9ycyIsInZpZXciLCJhZ2VudCIsImlzX2Zyb21fY29udmVyc2F0aW9uIiwicHJvamVjdF9kZWxldGVkIiwiYSIsInVuZGVmaW5lZCIsImhhc19ub3RfYWNjZXNzIiwiaGFzX25vdF9wZXJtaXNzaW9ucyIsImRvY3VtZW50IiwiZGlzcGF0Y2hFdmVudCIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwicGFyc2VJbnQiLCJjb25jYXQiLCJtYXAiLCJpdGVtIiwiZmluaXNoIiwibG9hZE1vcmVNZXNzYWdlcyIsIl9yZWY1IiwiX2NhbGxlZTMiLCJjb250YWluZXIiLCJvbGRTY3JvbGxIZWlnaHQiLCJvbGRTY3JvbGxUb3AiLCJfeWllbGQkbWFpYSRDaGF0cyRnZXQyIiwiaXRlbXNUb01lcmdlIiwibmV3TWVzc2FnZXMiLCJfdDIiLCJfY29udGV4dDMiLCJzY3JvbGxIZWlnaHQiLCJzY3JvbGxUb3AiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJzbGljZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImNvbnRhaW5lclJlZiIsIm5ld1Njcm9sbEhlaWdodCIsImhlaWdodERpZmZlcmVuY2UiLCJfeDIiLCJoYW5kbGVTY3JvbGwiLCJjbGllbnRIZWlnaHQiLCJzY3JvbGxQZXJjZW50YWdlIiwiZGlkUmV3cml0ZVJlZiIsImxlbmd0aCIsIm5lZWRzUmV3cml0ZSIsInNvbWUiLCJtc2ciLCJtYXRjaGVzIiwibWF0Y2giLCJlbmRzV2l0aCIsImluY2x1ZGVzIiwicmV3cml0dGVuIiwiYWRkTWVzc2FnZSIsImV4aXN0aW5nTWVzc2FnZUluZGV4IiwiZmluZEluZGV4IiwicmVtb3ZlTWVzc2FnZSIsIm1lc3NhZ2VJZCIsImZpbHRlciIsImhhc01vcmVNZXNzYWdlcyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy91c2VDaGF0TWVzc2FnZXMvdXNlQ2hhdE1lc3NhZ2VzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9pbmRlbnQgKi9cbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VTdGF0ZSwgdXNlUmVmLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZVByb2plY3RzIH0gZnJvbSAnLi4vdXNlUHJvamVjdHMnXG5pbXBvcnQgeyBDaGF0TWVzc2FnZSB9IGZyb20gJy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQgeyBidWlsZENvbnRleHRNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvY29udGV4dE1lbnRpb24nXG5pbXBvcnQgbWFpYSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tYWlhJ1xuaW1wb3J0IHsgVXNlQ2hhdE1lc3NhZ2VzUHJvcHMgfSBmcm9tICcuL3VzZUNoYXRNZXNzYWdlcy5pbnRlcmZhY2UnXG5pbXBvcnQgeyB1c2VHbG9iYWxDb250ZXh0IH0gZnJvbSAnLi4vLi4vY29udGV4dC9nbG9iYWwtY29udGV4dCdcbmltcG9ydCB7IHVzZVQgfSBmcm9tICcuLi91c2VUJ1xuaW1wb3J0IHsgdXNlVXNlciB9IGZyb20gJy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgeyB1c2VUYWJUYXNrRGVmYXVsdCB9IGZyb20gJy4uL3VzZVRhYlRhc2tEZWZhdWx0J1xuaW1wb3J0IHsgVEFTS19VUkxfUkVHRVhfUEFUVEVSTiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy90YXNrVXJscydcbmltcG9ydCB7IG1hcENPUkxhbmcgfSBmcm9tICcuLi8uLi9sYW5nL3V0aWxzJ1xuaW1wb3J0IHsgZm9ybWF0UXVpY2tBY3Rpb25NZXNzYWdlRm9yRGlzcGxheSB9IGZyb20gJy4uLy4uL3V0aWxzL2Zvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZSdcblxuY29uc3QgcmV3cml0ZVRhc2tVcmxzSW5Db250ZW50ID0gKGNvbnRlbnQ6IHN0cmluZywgdGFiU2VnbWVudDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdGFza1VybFJlZ2V4ID0gbmV3IFJlZ0V4cChUQVNLX1VSTF9SRUdFWF9QQVRURVJOLCAnZycpXG4gIHJldHVybiBjb250ZW50LnJlcGxhY2UodGFza1VybFJlZ2V4LCB1cmwgPT5cbiAgICB1cmwucmVwbGFjZSgvXFwvKGRldGFpbHxtZXNzYWdlfG1lc3NhZ2VzfGZpbGVzfGhpc3Rvcnl8aG91cnMpKD89JHxcXD8pLywgdGFiU2VnbWVudClcbiAgKVxufVxuXG5leHBvcnQgY29uc3QgdXNlQ2hhdE1lc3NhZ2VzID0gKHtcbiAgb25FcnJvcixcbiAgY2hhdElkLFxuICBjdXJyZW50VXNlcixcbiAgdXNlckluaXRpYWxNZXNzYWdlLFxuICBhZ2VudHMgPSBbXSxcbn06IFVzZUNoYXRNZXNzYWdlc1Byb3BzKSA9PiB7XG4gIGNvbnN0IHsgdCwgaTE4biB9ID0gdXNlVCgpXG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3QgdXNlclBlcm1pc3Npb25zID0gdXNlcj8ucGVybWlzc2lvbnM/LmFpX2FnZW50c1xuICBjb25zdCBbbG9hZGluZ01lc3NhZ2VzLCBzZXRMb2FkaW5nTWVzc2FnZXNdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFttZXNzYWdlcywgc2V0TWVzc2FnZXNdID0gdXNlU3RhdGU8Q2hhdE1lc3NhZ2VbXT4oXG4gICAgdXNlckluaXRpYWxNZXNzYWdlXG4gICAgICA/IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ3VzZXItaW5pdGlhbC1tZXNzYWdlJyxcbiAgICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICB1c2VyOiBjdXJyZW50VXNlcixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZUZvckRpc3BsYXkodXNlckluaXRpYWxNZXNzYWdlLm1lc3NhZ2UsIHtcbiAgICAgICAgICAgICAgZnVhSWQ6IHVzZXJJbml0aWFsTWVzc2FnZS5mdWFJZCxcbiAgICAgICAgICAgICAgc2NJZDogdXNlckluaXRpYWxNZXNzYWdlLnNjSWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2UuYXR0YWNobWVudHMgPyB7IGF0dGFjaG1lbnRzOiB1c2VySW5pdGlhbE1lc3NhZ2UuYXR0YWNobWVudHMgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihidWlsZENvbnRleHRNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZS5tZW50aW9ucylcbiAgICAgICAgICAgICAgPyB7IGNvbnRleHRNZXNzYWdlOiBidWlsZENvbnRleHRNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZS5tZW50aW9ucykgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgICA6IFtdXG4gIClcbiAgY29uc3QgeyBmZXRjaFByb2plY3RzIH0gPSB1c2VQcm9qZWN0cygpXG4gIGNvbnN0IHsgc2VsZWN0QWdlbnQsIHNldENoaXBzUHJvamVjdCwgc2V0UHJvamVjdCwgc2V0Q2xpZW50LCBzZXRUYXNrLCBwcm9qZWN0IH0gPSB1c2VHbG9iYWxDb250ZXh0KClcbiAgY29uc3QgeyBnZXRUYWJUYXNrRGVmYXVsdCwgdGFiVGFza0RlZmF1bHQsIHJlZmV0Y2hUYWJUYXNrRGVmYXVsdCB9ID0gdXNlVGFiVGFza0RlZmF1bHQoKVxuICBjb25zdCBbaXNMb2FkaW5nTW9yZU1lc3NhZ2VzLCBzZXRJc0xvYWRpbmdNb3JlTWVzc2FnZXNdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtsYXN0RXZhbHVhdGVkS2V5LCBzZXRMYXN0RXZhbHVhdGVkS2V5XSA9IHVzZVN0YXRlPG51bWJlciB8IHVuZGVmaW5lZD4oMClcbiAgY29uc3QgaXNMb2FkaW5nUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBpbml0aWFsTG9hZERvbmUgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IHByZXZpb3VzQ2hhdElkID0gdXNlUmVmKGNoYXRJZClcblxuICBjb25zdCBzZXRDb252ZXJzYXRpb25Db250ZXh0RnJvbU1ldGFkYXRhID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHtcbiAgICAgIHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgY2xpZW50SWRGcm9tU2Vzc2lvbixcbiAgICAgIGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgIHRhc2tJZEZyb21TZXNzaW9uLFxuICAgICAgdGFza05hbWVGcm9tU2Vzc2lvbixcbiAgICB9OiB7XG4gICAgICBwcm9qZWN0SWRNZXNzYWdlOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgICBwcm9qZWN0TmFtZUZyb21TZXNzaW9uOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgICBjbGllbnRJZEZyb21TZXNzaW9uOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgICBjbGllbnROYW1lRnJvbVNlc3Npb246IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbiAgICAgIHRhc2tJZEZyb21TZXNzaW9uOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgICB0YXNrTmFtZUZyb21TZXNzaW9uOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgfSkgPT4ge1xuICAgICAgLy8gVGFyZWEgZGUgbGEgY29udmVyc2FjacOzbjogc2UgZGVyaXZhIGRlIGxhIG1ldGFkYXRhIGRlIGxhIHNlc3Npb24gcGFyYSBtb3N0cmFyIGVsIGNoaXBcbiAgICAgIC8vIGRlIGxhIHRhcmVhICh5IHJlZW52aWFyIGxhIG1ldGFkYXRhIGVuIGNhZGEgbWVuc2FqZSkgc2luIGltcG9ydGFyIGRlc2RlIGTDs25kZSBzZSBhYnJhLlxuICAgICAgaWYgKHRhc2tJZEZyb21TZXNzaW9uICE9IG51bGwgJiYgdGFza05hbWVGcm9tU2Vzc2lvbikge1xuICAgICAgICBzZXRUYXNrKHsgaWQ6IHRhc2tJZEZyb21TZXNzaW9uLCBuYW1lOiB0YXNrTmFtZUZyb21TZXNzaW9uIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRUYXNrKG51bGwpXG4gICAgICB9XG5cbiAgICAgIC8vIENvbnZlcnNhY2nDs24gY29uIGNsaWVudF9tZXRhZGF0YTogc2V0ZWFyIGNsaWVudGUgeSBsaW1waWFyIHByb3llY3RvXG4gICAgICBpZiAoY2xpZW50SWRGcm9tU2Vzc2lvbiAhPSBudWxsICYmIGNsaWVudE5hbWVGcm9tU2Vzc2lvbikge1xuICAgICAgICBzZXRDbGllbnQoeyBpZDogTnVtYmVyKGNsaWVudElkRnJvbVNlc3Npb24pLCBuYW1lOiBjbGllbnROYW1lRnJvbVNlc3Npb24gfSlcbiAgICAgICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmV0Y2hQcm9qZWN0cyhwcm9qZWN0SWRNZXNzYWdlKVxuICAgICAgY29uc3QgaGFzTXVsdGlBZ2VudHNBY2Nlc3MgPSAhIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTXG5cbiAgICAgIGlmIChwcm9qZWN0SWRNZXNzYWdlICYmIGhhc011bHRpQWdlbnRzQWNjZXNzKSB7XG4gICAgICAgIGNvbnN0IHByb2plY3RJZE51bSA9IE51bWJlcihwcm9qZWN0SWRNZXNzYWdlKVxuICAgICAgICBjb25zdCBmb3VuZFByb2plY3QgPSBwcm9qZWN0cz8uZmluZChwID0+IE51bWJlcihwLmlkKSA9PT0gcHJvamVjdElkTnVtKVxuXG4gICAgICAgIGlmIChmb3VuZFByb2plY3QpIHtcbiAgICAgICAgICBzZXRDaGlwc1Byb2plY3Qoe1xuICAgICAgICAgICAgcHJvamVjdE5hbWU6IGZvdW5kUHJvamVjdC5uYW1lLFxuICAgICAgICAgICAgY2xpZW50TmFtZTogZm91bmRQcm9qZWN0LmNsaWVudD8ubmFtZSB8fCAnJyxcbiAgICAgICAgICAgIHByb2plY3RJZDogU3RyaW5nKGZvdW5kUHJvamVjdC5pZCksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBzZXRQcm9qZWN0KGZvdW5kUHJvamVjdClcbiAgICAgICAgfSBlbHNlIGlmIChwcm9qZWN0TmFtZUZyb21TZXNzaW9uKSB7XG4gICAgICAgICAgc2V0Q2hpcHNQcm9qZWN0KHtcbiAgICAgICAgICAgIHByb2plY3ROYW1lOiBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgY2xpZW50TmFtZTogJycsXG4gICAgICAgICAgICBwcm9qZWN0SWQ6IFN0cmluZyhwcm9qZWN0SWRNZXNzYWdlKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHNldFByb2plY3QoeyBpZDogcHJvamVjdElkTnVtLCBuYW1lOiBwcm9qZWN0TmFtZUZyb21TZXNzaW9uIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgICAgIHNldENsaWVudD8uKG51bGwpXG4gICAgICB9XG4gICAgfSxcbiAgICBbZmV0Y2hQcm9qZWN0cywgc2V0Q2xpZW50LCBzZXRDaGlwc1Byb2plY3QsIHNldFByb2plY3QsIHNldFRhc2tdXG4gIClcblxuICBjb25zdCBsb2FkTWVzc2FnZXMgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHNldExvYWRpbmdNZXNzYWdlcyh0cnVlKVxuICAgICAgaW5pdGlhbExvYWREb25lLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgY29uc3Qge1xuICAgICAgICBpdGVtcyxcbiAgICAgICAgbmV4dEl0ZW0sXG4gICAgICAgIGFnZW50RGVsZXRlZCxcbiAgICAgICAgYWdlbnROb1Blcm1pc3Npb24sXG4gICAgICAgIGhhc0FnZW50QWNjZXNzLFxuICAgICAgICBoYXNBZ2VudFBlcm1pc3Npb24sXG4gICAgICAgIGFnZW50VHlwZTogYWdlbnRUeXBlRnJvbVNlc3Npb24sXG4gICAgICAgIGFnZW50RW50aXR5OiBhZ2VudEVudGl0eUZyb21TZXNzaW9uLFxuICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgIHByb2plY3ROYW1lOiBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICBwcm9qZWN0RGVsZXRlZCxcbiAgICAgICAgY2xpZW50SWQ6IGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgIGNsaWVudE5hbWU6IGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgdGFza0lkOiB0YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgdGFza05hbWU6IHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICB9ID0gYXdhaXQgbWFpYS5DaGF0cy5nZXRDaGF0TWVzc2FnZXMoe1xuICAgICAgICBjaGF0SWQsXG4gICAgICAgIGN1cnJlbnRVc2VyLFxuICAgICAgICBvZmZzZXQ6IGxhc3RFdmFsdWF0ZWRLZXksXG4gICAgICAgIGNhbmNlbGxlZFRleHQ6IHQoJ2NoYXQuY2FuY2VsbGVkJyksXG4gICAgICAgIGxhbmc6IG1hcENPUkxhbmcoaTE4bi5sYW5ndWFnZSksXG4gICAgICB9KVxuXG4gICAgICBpZiAoYWdlbnREZWxldGVkKSB7XG4gICAgICAgIHNlbGVjdEFnZW50KHtcbiAgICAgICAgICBpZDogYWdlbnREZWxldGVkLmlkLFxuICAgICAgICAgIG5hbWU6IGFnZW50RGVsZXRlZC5uYW1lLFxuICAgICAgICAgIGVtb2ppOiBhZ2VudERlbGV0ZWQuZW1vamksXG4gICAgICAgICAgdHlwZTogJ2N1c3RvbScsXG4gICAgICAgICAgaXNfZGVsZXRlZDogdHJ1ZSxcbiAgICAgICAgICBkZWxldGVkX2F0OiBhZ2VudERlbGV0ZWQuZGVsZXRlZEF0LFxuICAgICAgICAgIC4uLihhZ2VudE5vUGVybWlzc2lvbj8uY29ubmVjdG9ycyA/IHsgY29ubmVjdG9yczogYWdlbnROb1Blcm1pc3Npb24uY29ubmVjdG9ycyB9IDoge30pLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyBTaSBlbCBhZ2VudGUgbm8gZXN0w6EgZW4gbGEgbGlzdGEgcGVybyB0aWVuZSBwZXJtaXNvcywgYWNjZXNvIHkgbm8gZXN0w6EgZWxpbWluYWRvLCBzZXRlYXJsbyBub3JtYWxtZW50ZVxuICAgICAgLy8gRXhjbHVpciBhZ2VudGVzIG5vLWN1c3RvbSBwYXJhIHVzdWFyaW9zIGNvbiByb2xlcyBkZXNoYWJpbGl0YWRvc1xuICAgICAgaWYgKFxuICAgICAgICBhZ2VudE5vUGVybWlzc2lvbiAmJlxuICAgICAgICAhYWdlbnREZWxldGVkICYmXG4gICAgICAgIHVzZXJQZXJtaXNzaW9ucz8udmlldyAmJlxuICAgICAgICBoYXNBZ2VudEFjY2VzcyAmJlxuICAgICAgICBoYXNBZ2VudFBlcm1pc3Npb24gJiZcbiAgICAgICAgIWFnZW50cy5maW5kKGFnZW50ID0+IGFnZW50LmlkID09PSBhZ2VudE5vUGVybWlzc2lvbi5pZClcbiAgICAgICkge1xuICAgICAgICBzZWxlY3RBZ2VudCh7XG4gICAgICAgICAgaWQ6IGFnZW50Tm9QZXJtaXNzaW9uLmlkLFxuICAgICAgICAgIG5hbWU6IGFnZW50Tm9QZXJtaXNzaW9uLm5hbWUsXG4gICAgICAgICAgZW1vamk6IGFnZW50Tm9QZXJtaXNzaW9uLmVtb2ppLFxuICAgICAgICAgIHR5cGU6IGFnZW50Tm9QZXJtaXNzaW9uLnR5cGUgYXMgJ3BtJyB8ICdjdXN0b20nIHwgJ2Nsb25lJyB8ICdvcmNoZXN0cmF0b3InLFxuICAgICAgICAgIGlzX2Zyb21fY29udmVyc2F0aW9uOiB0cnVlLFxuICAgICAgICAgIC4uLihhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzID8geyBjb25uZWN0b3JzOiBhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzIH0gOiB7fSksXG4gICAgICAgICAgLi4uKHByb2plY3REZWxldGVkID8geyBwcm9qZWN0X2RlbGV0ZWQ6IHsgbmFtZTogcHJvamVjdERlbGV0ZWQubmFtZSB9IH0gOiB7fSksXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIFNpIGVsIGFnZW50ZSBlc3TDoSBlbiBsYSBsaXN0YSB5IHRpZW5lIGFjY2Vzby9wZXJtaXNvcywgYWN0dWFsaXphciBwcm9qZWN0X2RlbGV0ZWQgKG8gbGltcGlhcmxvIGFsIGNhbWJpYXIgZGUgY2hhdClcbiAgICAgIGlmIChcbiAgICAgICAgYWdlbnROb1Blcm1pc3Npb24gJiZcbiAgICAgICAgIWFnZW50RGVsZXRlZCAmJlxuICAgICAgICBoYXNBZ2VudEFjY2VzcyAmJlxuICAgICAgICBoYXNBZ2VudFBlcm1pc3Npb24gJiZcbiAgICAgICAgYWdlbnRzLmZpbmQoYSA9PiBhLmlkID09PSBhZ2VudE5vUGVybWlzc2lvbi5pZClcbiAgICAgICkge1xuICAgICAgICBjb25zdCBhZ2VudEluTGlzdCA9IGFnZW50cy5maW5kKGEgPT4gYS5pZCA9PT0gYWdlbnROb1Blcm1pc3Npb24uaWQpXG4gICAgICAgIGlmIChhZ2VudEluTGlzdCkge1xuICAgICAgICAgIHNlbGVjdEFnZW50KHtcbiAgICAgICAgICAgIC4uLmFnZW50SW5MaXN0LFxuICAgICAgICAgICAgLi4uKGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgPyB7IGNvbm5lY3RvcnM6IGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihwcm9qZWN0RGVsZXRlZCA/IHsgcHJvamVjdF9kZWxldGVkOiB7IG5hbWU6IHByb2plY3REZWxldGVkLm5hbWUgfSB9IDogeyBwcm9qZWN0X2RlbGV0ZWQ6IHVuZGVmaW5lZCB9KSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNpIGVsIGFnZW50ZSBubyB0aWVuZSBhY2Nlc28gbyBwZXJtaXNvcyBzZWfDum4gbGEgcmVzcHVlc3RhIGRlIHNlc3Npb25zLCBzZWxlY2Npb25hcmxvIGNvbiBlbCBmbGFnIGNvcnJlc3BvbmRpZW50ZVxuICAgICAgLy8gTGEgdmFsaWRhY2nDs24gYWhvcmEgc2UgYmFzYSBlbiBsYXMgcHJvcGllZGFkZXMgaGFzX2FnZW50X2FjY2VzcyB5IGhhc19hZ2VudF9wZXJtaXNzaW9uIGRlIGxhIHJlc3B1ZXN0YVxuICAgICAgaWYgKGFnZW50Tm9QZXJtaXNzaW9uICYmICFhZ2VudERlbGV0ZWQpIHtcbiAgICAgICAgaWYgKCFoYXNBZ2VudEFjY2Vzcykge1xuICAgICAgICAgIC8vIENhc28gMTogTm8gdGllbmUgYWNjZXNvIGFsIGFnZW50ZVxuICAgICAgICAgIHNlbGVjdEFnZW50KHtcbiAgICAgICAgICAgIGlkOiBhZ2VudE5vUGVybWlzc2lvbi5pZCxcbiAgICAgICAgICAgIG5hbWU6IGFnZW50Tm9QZXJtaXNzaW9uLm5hbWUsXG4gICAgICAgICAgICBlbW9qaTogYWdlbnROb1Blcm1pc3Npb24uZW1vamksXG4gICAgICAgICAgICB0eXBlOiBhZ2VudE5vUGVybWlzc2lvbi50eXBlIGFzICdwbScgfCAnY3VzdG9tJyB8ICdjbG9uZScgfCAnb3JjaGVzdHJhdG9yJyxcbiAgICAgICAgICAgIGhhc19ub3RfYWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgLi4uKGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgPyB7IGNvbm5lY3RvcnM6IGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihwcm9qZWN0RGVsZXRlZCA/IHsgcHJvamVjdF9kZWxldGVkOiB7IG5hbWU6IHByb2plY3REZWxldGVkLm5hbWUgfSB9IDoge30pLFxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAoIWhhc0FnZW50UGVybWlzc2lvbikge1xuICAgICAgICAgIC8vIENhc28gMjogTm8gdGllbmUgcGVybWlzb3MgcGFyYSB2aXN1YWxpemFyL2ludGVyYWN0dWFyIGNvbiBlbCBhZ2VudGVcbiAgICAgICAgICBzZWxlY3RBZ2VudCh7XG4gICAgICAgICAgICBpZDogYWdlbnROb1Blcm1pc3Npb24uaWQsXG4gICAgICAgICAgICBuYW1lOiBhZ2VudE5vUGVybWlzc2lvbi5uYW1lLFxuICAgICAgICAgICAgZW1vamk6IGFnZW50Tm9QZXJtaXNzaW9uLmVtb2ppLFxuICAgICAgICAgICAgdHlwZTogYWdlbnROb1Blcm1pc3Npb24udHlwZSBhcyAncG0nIHwgJ2N1c3RvbScgfCAnY2xvbmUnIHwgJ29yY2hlc3RyYXRvcicsXG4gICAgICAgICAgICBoYXNfbm90X3Blcm1pc3Npb25zOiB0cnVlLFxuICAgICAgICAgICAgLi4uKGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgPyB7IGNvbm5lY3RvcnM6IGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihwcm9qZWN0RGVsZXRlZCA/IHsgcHJvamVjdF9kZWxldGVkOiB7IG5hbWU6IHByb2plY3REZWxldGVkLm5hbWUgfSB9IDoge30pLFxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocHJvamVjdERlbGV0ZWQpIHtcbiAgICAgICAgICAvLyBDYXNvIDM6IEVsIHByb3llY3RvIGRlIGxhIGNvbnZlcnNhY2nDs24gZnVlIGVsaW1pbmFkb1xuICAgICAgICAgIHNlbGVjdEFnZW50KHtcbiAgICAgICAgICAgIGlkOiBhZ2VudE5vUGVybWlzc2lvbi5pZCxcbiAgICAgICAgICAgIG5hbWU6IGFnZW50Tm9QZXJtaXNzaW9uLm5hbWUsXG4gICAgICAgICAgICBlbW9qaTogYWdlbnROb1Blcm1pc3Npb24uZW1vamksXG4gICAgICAgICAgICB0eXBlOiBhZ2VudE5vUGVybWlzc2lvbi50eXBlIGFzICdwbScgfCAnY3VzdG9tJyB8ICdjbG9uZScgfCAnb3JjaGVzdHJhdG9yJyxcbiAgICAgICAgICAgIC4uLihhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzID8geyBjb25uZWN0b3JzOiBhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzIH0gOiB7fSksXG4gICAgICAgICAgICBwcm9qZWN0X2RlbGV0ZWQ6IHsgbmFtZTogcHJvamVjdERlbGV0ZWQubmFtZSB9LFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YSh7XG4gICAgICAgIHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgIHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgIGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgIHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICB9KVxuXG4gICAgICAvLyBNZXRhZGF0YSBkZSBsYSBzZXNzaW9uIChhZ2VudF90eXBlIC8gYWdlbnRfZW50aXR5ICsgY29udGV4dG8pIHBhcmEgZWwgY2FydGVsIGRlXG4gICAgICAvLyBcImNvbnRpbnVhciBlbiB1biBjaGF0IG51ZXZvXCIgZGVsIGZvb3RlciBjdWFuZG8gc2UgYWJyZSB1bmEgY29udmVyc2FjacOzbiBkZSB1biBjbG9uZSBsZWdhY3kuXG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ21haWEtY2hhdC1zZXNzaW9uLW1ldGEnLCB7XG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICBjaGF0SWQsXG4gICAgICAgICAgICBhZ2VudFR5cGU6IGFnZW50VHlwZUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgYWdlbnRFbnRpdHk6IGFnZW50RW50aXR5RnJvbVNlc3Npb24sXG4gICAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgICBwcm9qZWN0TmFtZTogcHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICAgIGNsaWVudElkOiBjbGllbnRJZEZyb21TZXNzaW9uLFxuICAgICAgICAgICAgY2xpZW50TmFtZTogY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgdGFza0lkOiB0YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICAgIHRhc2tOYW1lOiB0YXNrTmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApXG5cbiAgICAgIC8vIFNpIGhheSBwcm95ZWN0byBlbiBsYSBjb252ZXJzYWNpw7NuLCByZWVzY3JpYmlyIFVSTHMgZGUgdGFyZWFzIGNvbiBlbCB0YWIgZGVsIHVzdWFyaW8gKG1lKVxuICAgICAgY29uc3QgY29udGV4dFByb2plY3RJZCA9IHByb2plY3RJZE1lc3NhZ2UgPyBwYXJzZUludChTdHJpbmcocHJvamVjdElkTWVzc2FnZSksIDEwKSA6IG51bGxcbiAgICAgIGxldCBpdGVtc1RvU2V0ID0gaXRlbXNcbiAgICAgIGlmIChjb250ZXh0UHJvamVjdElkKSB7XG4gICAgICAgIGNvbnN0IHRhYiA9IGF3YWl0IGdldFRhYlRhc2tEZWZhdWx0KDEpXG4gICAgICAgIGNvbnN0IHRhYlNlZ21lbnQgPSB0YWIgPyBgLyR7dGFifWAgOiAnL2RldGFpbCdcbiAgICAgICAgaXRlbXNUb1NldCA9IGl0ZW1zLm1hcChpdGVtID0+ICh7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBtZXNzYWdlOiByZXdyaXRlVGFza1VybHNJbkNvbnRlbnQoaXRlbS5tZXNzYWdlIHx8ICcnLCB0YWJTZWdtZW50KSxcbiAgICAgICAgfSkpXG4gICAgICB9XG4gICAgICBzZXRNZXNzYWdlcyhpdGVtc1RvU2V0KVxuICAgICAgc2V0TGFzdEV2YWx1YXRlZEtleShOdW1iZXIobmV4dEl0ZW0pKVxuICAgICAgaW5pdGlhbExvYWREb25lLmN1cnJlbnQgPSB0cnVlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIG9uRXJyb3I/LigpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldExvYWRpbmdNZXNzYWdlcyhmYWxzZSlcbiAgICB9XG4gIH0sIFtjaGF0SWQsIGN1cnJlbnRVc2VyLCBzZXRDb252ZXJzYXRpb25Db250ZXh0RnJvbU1ldGFkYXRhLCBvbkVycm9yLCBnZXRUYWJUYXNrRGVmYXVsdF0pXG5cbiAgY29uc3QgbG9hZE1vcmVNZXNzYWdlcyA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChjb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgICAgaWYgKGlzTG9hZGluZ1JlZi5jdXJyZW50IHx8ICFsYXN0RXZhbHVhdGVkS2V5IHx8ICFjb250YWluZXIpIHJldHVyblxuICAgICAgdHJ5IHtcbiAgICAgICAgaXNMb2FkaW5nUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICAgIHNldElzTG9hZGluZ01vcmVNZXNzYWdlcyh0cnVlKVxuXG4gICAgICAgIGNvbnN0IG9sZFNjcm9sbEhlaWdodCA9IGNvbnRhaW5lci5zY3JvbGxIZWlnaHRcbiAgICAgICAgY29uc3Qgb2xkU2Nyb2xsVG9wID0gY29udGFpbmVyLnNjcm9sbFRvcFxuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBpdGVtcyxcbiAgICAgICAgICBuZXh0SXRlbSxcbiAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWU6IHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50SWQ6IGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZTogY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tJZDogdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza05hbWU6IHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH0gPSBhd2FpdCBtYWlhLkNoYXRzLmdldENoYXRNZXNzYWdlcyh7XG4gICAgICAgICAgY2hhdElkLFxuICAgICAgICAgIGN1cnJlbnRVc2VyLFxuICAgICAgICAgIG9mZnNldDogbGFzdEV2YWx1YXRlZEtleSxcbiAgICAgICAgICBsYW5nOiBtYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpLFxuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IHNldENvbnZlcnNhdGlvbkNvbnRleHRGcm9tTWV0YWRhdGEoe1xuICAgICAgICAgIHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnRJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrTmFtZUZyb21TZXNzaW9uLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIFNpIGhheSBwcm95ZWN0byBlbiBsYSBjb252ZXJzYWNpw7NuLCByZWVzY3JpYmlyIFVSTHMgZGUgdGFyZWFzIGVuIGxvcyBtZW5zYWplcyBjYXJnYWRvc1xuICAgICAgICBjb25zdCBjb250ZXh0UHJvamVjdElkID0gcHJvamVjdElkTWVzc2FnZSA/IHBhcnNlSW50KFN0cmluZyhwcm9qZWN0SWRNZXNzYWdlKSwgMTApIDogbnVsbFxuICAgICAgICBsZXQgaXRlbXNUb01lcmdlID0gaXRlbXNcbiAgICAgICAgaWYgKGNvbnRleHRQcm9qZWN0SWQpIHtcbiAgICAgICAgICBjb25zdCB0YWIgPSBhd2FpdCBnZXRUYWJUYXNrRGVmYXVsdCgxKVxuICAgICAgICAgIGNvbnN0IHRhYlNlZ21lbnQgPSB0YWIgPyBgLyR7dGFifWAgOiAnL2RldGFpbCdcbiAgICAgICAgICBpdGVtc1RvTWVyZ2UgPSBpdGVtcy5tYXAoaXRlbSA9PiAoe1xuICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHJld3JpdGVUYXNrVXJsc0luQ29udGVudChpdGVtLm1lc3NhZ2UgfHwgJycsIHRhYlNlZ21lbnQpLFxuICAgICAgICAgIH0pKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld01lc3NhZ2VzID0gWy4uLm1lc3NhZ2VzLnNsaWNlKDAsIDEpLCAuLi5pdGVtc1RvTWVyZ2UsIC4uLm1lc3NhZ2VzLnNsaWNlKDEpXVxuICAgICAgICBzZXRNZXNzYWdlcyhuZXdNZXNzYWdlcylcbiAgICAgICAgc2V0TGFzdEV2YWx1YXRlZEtleShOdW1iZXIobmV4dEl0ZW0pKVxuXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclJlZiA9IGNvbnRhaW5lclxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lclJlZikge1xuICAgICAgICAgICAgICBjb25zdCBuZXdTY3JvbGxIZWlnaHQgPSBjb250YWluZXJSZWYuc2Nyb2xsSGVpZ2h0XG4gICAgICAgICAgICAgIGNvbnN0IGhlaWdodERpZmZlcmVuY2UgPSBuZXdTY3JvbGxIZWlnaHQgLSBvbGRTY3JvbGxIZWlnaHRcbiAgICAgICAgICAgICAgY29udGFpbmVyUmVmLnNjcm9sbFRvcCA9IG9sZFNjcm9sbFRvcCArIGhlaWdodERpZmZlcmVuY2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgb25FcnJvcj8uKClcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzTG9hZGluZ01vcmVNZXNzYWdlcyhmYWxzZSlcbiAgICAgICAgaXNMb2FkaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgfVxuICAgIH0sXG4gICAgW2NoYXRJZCwgY3VycmVudFVzZXIsIGxhc3RFdmFsdWF0ZWRLZXksIG9uRXJyb3IsIG1lc3NhZ2VzLCBnZXRUYWJUYXNrRGVmYXVsdCwgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YV1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVNjcm9sbCA9IHVzZUNhbGxiYWNrKFxuICAgIChjb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgICAgaWYgKCFjb250YWluZXIgfHwgaXNMb2FkaW5nUmVmLmN1cnJlbnQgfHwgIWluaXRpYWxMb2FkRG9uZS5jdXJyZW50KSByZXR1cm5cblxuICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0IH0gPSBjb250YWluZXJcbiAgICAgIGNvbnN0IHNjcm9sbFBlcmNlbnRhZ2UgPSBzY3JvbGxIZWlnaHQgLSBjbGllbnRIZWlnaHQgPiAwID8gKHNjcm9sbFRvcCAvIChzY3JvbGxIZWlnaHQgLSBjbGllbnRIZWlnaHQpKSAqIDEwMCA6IDBcblxuICAgICAgaWYgKHNjcm9sbFBlcmNlbnRhZ2UgPCAxMCkge1xuICAgICAgICBsb2FkTW9yZU1lc3NhZ2VzKGNvbnRhaW5lcilcbiAgICAgIH1cbiAgICB9LFxuICAgIFtsb2FkTW9yZU1lc3NhZ2VzXVxuICApXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoY2hhdElkICE9PSBwcmV2aW91c0NoYXRJZC5jdXJyZW50KSB7XG4gICAgICBzZXRNZXNzYWdlcyhcbiAgICAgICAgdXNlckluaXRpYWxNZXNzYWdlXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogJ3VzZXItaW5pdGlhbC1tZXNzYWdlJyxcbiAgICAgICAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIHVzZXI6IGN1cnJlbnRVc2VyLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZUZvckRpc3BsYXkodXNlckluaXRpYWxNZXNzYWdlLm1lc3NhZ2UsIHtcbiAgICAgICAgICAgICAgICAgIGZ1YUlkOiB1c2VySW5pdGlhbE1lc3NhZ2UuZnVhSWQsXG4gICAgICAgICAgICAgICAgICBzY0lkOiB1c2VySW5pdGlhbE1lc3NhZ2Uuc2NJZCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLmF0dGFjaG1lbnRzID8geyBhdHRhY2htZW50czogdXNlckluaXRpYWxNZXNzYWdlLmF0dGFjaG1lbnRzIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgLi4uKGJ1aWxkQ29udGV4dE1lc3NhZ2UodXNlckluaXRpYWxNZXNzYWdlLm1lbnRpb25zKVxuICAgICAgICAgICAgICAgICAgPyB7IGNvbnRleHRNZXNzYWdlOiBidWlsZENvbnRleHRNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZS5tZW50aW9ucykgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXVxuICAgICAgKVxuICAgICAgc2V0TGFzdEV2YWx1YXRlZEtleSgwKVxuICAgICAgaXNMb2FkaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgaW5pdGlhbExvYWREb25lLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgcHJldmlvdXNDaGF0SWQuY3VycmVudCA9IGNoYXRJZFxuXG4gICAgICAvLyBMaW1waWFyIGVsIGVzdGFkbyBkZWwgcHJveWVjdG8geSBsYSB0YXJlYSBjdWFuZG8gY2FtYmlhIGRlIGNvbnZlcnNhY2nDs25cbiAgICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgc2V0VGFzayhudWxsKVxuXG4gICAgICAvLyBWb2x2ZXIgYSBlamVjdXRhciBsYSBxdWVyeSBtZSBwYXJhIHRlbmVyIHRhYlRhc2tEZWZhdWx0IGFjdHVhbGl6YWRvIGVuIGxhIG51ZXZhIGNvbnZlcnNhY2nDs25cbiAgICAgIHJlZmV0Y2hUYWJUYXNrRGVmYXVsdCgpXG5cbiAgICAgIGlmICghdXNlckluaXRpYWxNZXNzYWdlKSB7XG4gICAgICAgIGxvYWRNZXNzYWdlcygpXG4gICAgICB9XG4gICAgfVxuICB9LCBbXG4gICAgY2hhdElkLFxuICAgIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgICBjdXJyZW50VXNlcixcbiAgICBsb2FkTWVzc2FnZXMsXG4gICAgc2V0Q2hpcHNQcm9qZWN0LFxuICAgIHNldFByb2plY3QsXG4gICAgc2V0VGFzayxcbiAgICByZWZldGNoVGFiVGFza0RlZmF1bHQsXG4gIF0pXG5cbiAgLy8gQ3VhbmRvIHRhYlRhc2tEZWZhdWx0IHBhc2EgYSBlc3RhciBkaXNwb25pYmxlIGRlc3B1w6lzIGRlIGNhcmdhciwgcmVlc2NyaWJpciBVUkxzIGRlIHRhcmVhcyBlbiBsb3MgbWVuc2FqZXMgeWEgY2FyZ2Fkb3MuXG4gIC8vIFJlZiBwYXJhIGV2aXRhciBidWNsZTogc2V0TWVzc2FnZXMocmV3cml0dGVuKSBjYW1iaWEgbWVzc2FnZXMgeSByZS1lamVjdXRhIGVsIGVmZWN0bzsgc29sbyByZWVzY3JpYmltb3MgdW5hIHZleiBwb3IgbG90ZS5cbiAgY29uc3QgZGlkUmV3cml0ZVJlZiA9IHVzZVJlZihmYWxzZSlcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXRhYlRhc2tEZWZhdWx0IHx8ICFwcm9qZWN0Py5pZCB8fCBtZXNzYWdlcy5sZW5ndGggPT09IDApIHJldHVyblxuICAgIGNvbnN0IHRhc2tVcmxSZWdleCA9IG5ldyBSZWdFeHAoVEFTS19VUkxfUkVHRVhfUEFUVEVSTiwgJ2cnKVxuICAgIGNvbnN0IHRhYlNlZ21lbnQgPSBgLyR7dGFiVGFza0RlZmF1bHR9YFxuICAgIGNvbnN0IG5lZWRzUmV3cml0ZSA9IG1lc3NhZ2VzLnNvbWUobXNnID0+IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBtc2cubWVzc2FnZSB8fCAnJ1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGNvbnRlbnQubWF0Y2godGFza1VybFJlZ2V4KVxuICAgICAgaWYgKCFtYXRjaGVzPy5sZW5ndGgpIHJldHVybiBmYWxzZVxuICAgICAgcmV0dXJuIG1hdGNoZXMuc29tZSh1cmwgPT4gIXVybC5lbmRzV2l0aChgLyR7dGFiVGFza0RlZmF1bHR9YCkgJiYgIXVybC5pbmNsdWRlcyhgLyR7dGFiVGFza0RlZmF1bHR9P2ApKVxuICAgIH0pXG4gICAgaWYgKCFuZWVkc1Jld3JpdGUpIHtcbiAgICAgIGRpZFJld3JpdGVSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRpZFJld3JpdGVSZWYuY3VycmVudCkgcmV0dXJuXG4gICAgZGlkUmV3cml0ZVJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgIGNvbnN0IHJld3JpdHRlbiA9IG1lc3NhZ2VzLm1hcChtc2cgPT4gKHtcbiAgICAgIC4uLm1zZyxcbiAgICAgIG1lc3NhZ2U6IHJld3JpdGVUYXNrVXJsc0luQ29udGVudChtc2cubWVzc2FnZSB8fCAnJywgdGFiU2VnbWVudCksXG4gICAgfSkpXG4gICAgc2V0TWVzc2FnZXMocmV3cml0dGVuKVxuICB9LCBbdGFiVGFza0RlZmF1bHQsIHByb2plY3Q/LmlkLCBtZXNzYWdlc10pXG5cbiAgY29uc3QgYWRkTWVzc2FnZSA9IHVzZUNhbGxiYWNrKChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xuICAgIHNldE1lc3NhZ2VzKHByZXYgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmdNZXNzYWdlSW5kZXggPSBwcmV2LmZpbmRJbmRleChtc2cgPT4gbXNnLmlkID09PSBtZXNzYWdlLmlkKVxuXG4gICAgICBpZiAoZXhpc3RpbmdNZXNzYWdlSW5kZXggPj0gMCkge1xuICAgICAgICBjb25zdCBuZXdNZXNzYWdlcyA9IFsuLi5wcmV2XVxuICAgICAgICBuZXdNZXNzYWdlc1tleGlzdGluZ01lc3NhZ2VJbmRleF0gPSBtZXNzYWdlXG4gICAgICAgIHJldHVybiBuZXdNZXNzYWdlc1xuICAgICAgfVxuICAgICAgcmV0dXJuIFsuLi5wcmV2LCBtZXNzYWdlXVxuICAgIH0pXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHJlbW92ZU1lc3NhZ2UgPSB1c2VDYWxsYmFjaygobWVzc2FnZUlkOiBzdHJpbmcpID0+IHtcbiAgICBzZXRNZXNzYWdlcyhwcmV2ID0+IHByZXYuZmlsdGVyKG1zZyA9PiBtc2cuaWQgIT09IG1lc3NhZ2VJZCkpXG4gIH0sIFtdKVxuXG4gIHJldHVybiB7XG4gICAgbG9hZGluZ01lc3NhZ2VzLFxuICAgIG1lc3NhZ2VzLFxuICAgIGhhc01vcmVNZXNzYWdlczogISFsYXN0RXZhbHVhdGVkS2V5LFxuICAgIGlzTG9hZGluZ01vcmVNZXNzYWdlcyxcbiAgICBsb2FkTWVzc2FnZXMsXG4gICAgbG9hZE1vcmVNZXNzYWdlcyxcbiAgICBhZGRNZXNzYWdlLFxuICAgIHJlbW92ZU1lc3NhZ2UsXG4gICAgaGFuZGxlU2Nyb2xsLFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBLFNBQVNBLFdBQVcsRUFBRUMsUUFBUSxFQUFFQyxNQUFNLEVBQUVDLFNBQVMsUUFBUSxPQUFPO0FBQ2hFLFNBQVNDLFdBQVcsUUFBUSxnQkFBZ0I7QUFFNUMsU0FBU0MsbUJBQW1CLFFBQVEsNEJBQTRCO0FBQ2hFLE9BQU9DLElBQUksTUFBTSxxQkFBcUI7QUFFdEMsU0FBU0MsZ0JBQWdCLFFBQVEsOEJBQThCO0FBQy9ELFNBQVNDLElBQUks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