@projectcor/maia-components 2.11.94-0 → 2.11.94

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 (130) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.styles.js +2 -2
  3. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +28 -41
  4. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +128 -0
  5. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +7 -3
  6. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +41 -2
  7. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +29 -2
  8. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +33 -24
  9. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +23 -4
  10. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +15 -7
  11. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +10 -4
  12. package/lib/components/atoms/MAIAInput/MAIAInput.js +47 -26
  13. package/lib/components/atoms/icons/ActionCalendarIcon.js +112 -0
  14. package/lib/components/atoms/icons/ActionChatIcon.js +71 -0
  15. package/lib/components/atoms/icons/ActionTimeBackIcon.js +112 -0
  16. package/lib/components/atoms/icons/SkillIcon.js +30 -0
  17. package/lib/components/atoms/icons/SkillsNavIcon.js +27 -0
  18. package/lib/components/atoms/icons/index.js +3 -2
  19. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +4 -1
  20. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +14 -1
  21. package/lib/components/molecules/ChatAIContent/ChatAIContent.skeleton.js +3 -3
  22. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +117 -30
  23. package/lib/components/molecules/ChatAIHome/styles.js +142 -49
  24. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +12 -48
  25. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.js +6 -2
  26. package/lib/components/molecules/ChatAIMessages/newStyles.js +2 -2
  27. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +122 -212
  28. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +18 -28
  29. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +3 -10
  30. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +7 -17
  31. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +1 -5
  32. package/lib/components/molecules/ChatAIModal/constants.js +6 -2
  33. package/lib/components/molecules/ChatAIModal/layout.js +2 -2
  34. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +357 -0
  35. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.styles.js +145 -0
  36. package/lib/components/molecules/ChatAIMySkills/index.js +2 -0
  37. package/lib/components/molecules/ChatFooter/ChatFooter.js +19 -8
  38. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +3 -1
  39. package/lib/components/molecules/Sidebar/Sidebar.js +92 -111
  40. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +1 -16
  41. package/lib/components/molecules/Sidebar/Sidebar.styles.js +29 -34
  42. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.js +175 -0
  43. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.styles.js +34 -0
  44. package/lib/components/organisms/AbmSkillGenerateModal/index.js +2 -0
  45. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +451 -0
  46. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.styles.js +98 -0
  47. package/lib/components/organisms/AbmSkillModal/index.js +2 -0
  48. package/lib/components/organisms/ChatAI/ChatAI.js +17 -10
  49. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +8 -1
  50. package/lib/constants/config.js +4 -1
  51. package/lib/constants/maiaHourAgentAccess.js +15 -0
  52. package/lib/constants/maiaTaskPanelAccess.js +4 -4
  53. package/lib/constants/permissions/index.js +2 -2
  54. package/lib/constants/permissions/utils.js +4 -1
  55. package/lib/constants/plannerSyncEvents.js +15 -0
  56. package/lib/context/cor-user.js +9 -1
  57. package/lib/context/global-context.js +1 -1
  58. package/lib/dev/DevChatAI.js +2 -2
  59. package/lib/hooks/useChatManager/useChatManager.js +456 -560
  60. package/lib/hooks/useChatMessages/useChatMessages.js +236 -414
  61. package/lib/hooks/useChats/useChats.js +4 -21
  62. package/lib/hooks/useContextMentions.js +51 -9
  63. package/lib/hooks/useContextPinPopover.js +1 -8
  64. package/lib/hooks/useEntitySearch.js +277 -91
  65. package/lib/hooks/useEvent.js +2 -1
  66. package/lib/hooks/useFrequentlyUsedActions.js +4 -2
  67. package/lib/hooks/useMentionAllowedTypes.js +26 -8
  68. package/lib/hooks/useMentionPopover.js +43 -13
  69. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +1 -1
  70. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +521 -139
  71. package/lib/hooks/useProjectSummaryConfig.js +23 -30
  72. package/lib/hooks/useSlashCommands.js +3 -2
  73. package/lib/hooks/useStreamingMessage/index.js +3 -2
  74. package/lib/hooks/useStreamingMessage/streamingStore.js +69 -0
  75. package/lib/hooks/useStreamingMessage/useStreamingMessage.js +17 -13
  76. package/lib/lang/br/index.js +73 -15
  77. package/lib/lang/en/index.js +73 -15
  78. package/lib/lang/es/index.js +73 -15
  79. package/lib/lang/fr/index.js +70 -17
  80. package/lib/services/appcues.js +3 -2
  81. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
  82. package/lib/services/maia/Agents/getAgents.js +2 -2
  83. package/lib/services/maia/Chats/getChatsByUserId.js +4 -6
  84. package/lib/services/maia/Chats/index.js +1 -3
  85. package/lib/services/maia/Orchestrator/orchestrator.js +1 -7
  86. package/lib/services/maia/Skills/createSkill.js +39 -0
  87. package/lib/services/maia/Skills/deleteSkill.js +38 -0
  88. package/lib/services/maia/Skills/generateSkill.js +41 -0
  89. package/lib/services/maia/Skills/getSkills.js +90 -0
  90. package/lib/services/maia/Skills/updateSkill.js +39 -0
  91. package/lib/store/chatsStore.types.js +1 -1
  92. package/lib/store/useChatsStore.js +12 -149
  93. package/lib/types/Action.js +1 -1
  94. package/lib/types/Chat.js +1 -1
  95. package/lib/types/agent.js +1 -1
  96. package/lib/types/contextMention.js +1 -1
  97. package/lib/types/global.d.js +1 -1
  98. package/lib/types/skill.js +2 -0
  99. package/lib/utils/actionCategoryMap.js +6 -2
  100. package/lib/utils/actionIconMap.js +8 -2
  101. package/lib/utils/contextMentionIcons.js +29 -1
  102. package/lib/utils/contextMentionTriggers.js +6 -3
  103. package/lib/utils/hoursPlannerQuickActionType.js +64 -0
  104. package/lib/utils/orchestratorSubagents.js +11 -0
  105. package/lib/utils/renderContextMentions.js +9 -4
  106. package/lib/utils/streamActivityMessages.js +2 -1
  107. package/package.json +15 -10
  108. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.js +0 -17
  109. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.styles.js +0 -15
  110. package/lib/components/atoms/SessionGeneratingDot/index.js +0 -2
  111. package/lib/components/atoms/icons/MaiaSparkleIcon.js +0 -75
  112. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.js +0 -55
  113. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.styles.js +0 -46
  114. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/index.js +0 -2
  115. package/lib/services/maia/Chats/markSessionAsRead.js +0 -32
  116. package/lib/store/chatsSidebarOptimistic.js +0 -92
  117. package/lib/store/maiaMinimizedPersistence.js +0 -49
  118. package/lib/store/sessions/activeView.js +0 -22
  119. package/lib/store/sessions/index.js +0 -9
  120. package/lib/store/sessions/sessionHitlContext.js +0 -15
  121. package/lib/store/sessions/sessionNotificationSound.js +0 -57
  122. package/lib/store/sessions/sessionNotifications.js +0 -110
  123. package/lib/store/sessions/sessionNotifications.types.js +0 -2
  124. package/lib/store/sessions/sessionStreamManager.js +0 -576
  125. package/lib/store/sessions/sessionStreamingText.js +0 -80
  126. package/lib/store/sessions/sessions.types.js +0 -35
  127. package/lib/store/sessions/useSessionMeta.js +0 -39
  128. package/lib/store/sessions/useSessionStreamingText.js +0 -18
  129. package/lib/store/sessions/useSessionsStore.js +0 -197
  130. package/lib/utils/formatUnreadCount.js +0 -6
@@ -1,27 +1,28 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
- import _regeneratorRuntime from "@babel/runtime/regenerator";
3
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
4
  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; }
5
5
  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; }
6
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
7
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
8
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
9
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
10
+ /* eslint-disable no-console */
11
+ /* eslint-disable @typescript-eslint/no-shadow */
12
+ /* eslint-disable no-constant-condition */
13
+ /* eslint-disable no-continue */
14
+ /* eslint-disable no-await-in-loop */
15
+ /* eslint-disable no-case-declarations */
16
+ /* eslint-disable no-restricted-syntax */
6
17
  /* eslint-disable @typescript-eslint/no-explicit-any */
7
- import { useCallback, useRef } from 'react';
18
+ import { useState, useCallback, useRef, useEffect } from 'react';
8
19
  import { useTranslation } from 'react-i18next';
20
+ import maia from '../../services/maia';
9
21
  import { SECTIONS } from '../../constants/config';
10
- import { sessionStreamManager } from '../../store/sessions/sessionStreamManager';
11
- import { useSessionsStore } from '../../store/sessions/useSessionsStore';
12
- import { useSessionStreamState } from '../../store/sessions/useSessionMeta';
13
- /**
14
- * Adapter sobre `sessionStreamManager`. Mantiene la API pública histórica
15
- * (`askMaia`, `isLoading`, `isWriting`, `stopStreaming`, etc.) pero ahora el
16
- * motor de streaming vive en el manager (module-level), lo que permite tener
17
- * varias sesiones generando a la vez y que sobrevivan a cambios de vista.
18
- *
19
- * Los flags reactivos (`isLoading`/`isWriting`/`streamActivity`) se leen del
20
- * store para la sesión actualmente activa (`activeSessionId`).
21
- */
22
+ import { ACTIVITY_MESSAGE_ROTATE_MS, advanceStreamActivityMessage, canAdvanceStreamActivityMessage, canRotateStreamActivityPhase, getInitialStreamActivity, getThinkingLoadingMessage, getWritingStreamActivity, resolveHitlNodeStreamActivity, resolveInitialHitlStreamActivity } from '../../utils/streamActivityMessages';
23
+ import { isCompleteLikeSsePayload, mergeStreamChunk } from '../../utils/sseStreamContent';
22
24
  export var useOrchestratorStream = function useOrchestratorStream(_ref) {
23
- var activeSessionId = _ref.activeSessionId,
24
- onStreamUpdate = _ref.onStreamUpdate,
25
+ var onStreamUpdate = _ref.onStreamUpdate,
25
26
  onFinishStream = _ref.onFinishStream,
26
27
  onStartWriting = _ref.onStartWriting,
27
28
  onStop = _ref.onStop,
@@ -30,11 +31,30 @@ export var useOrchestratorStream = function useOrchestratorStream(_ref) {
30
31
  hitlExecutionContextRef = _ref.hitlExecutionContextRef;
31
32
  var _useTranslation = useTranslation([SECTIONS.chatAI]),
32
33
  t = _useTranslation.t;
33
- var _useSessionStreamStat = useSessionStreamState(activeSessionId),
34
- isLoading = _useSessionStreamStat.isLoading,
35
- isWriting = _useSessionStreamStat.isWriting,
36
- loadingMessage = _useSessionStreamStat.loadingMessage,
37
- streamActivity = _useSessionStreamStat.streamActivity;
34
+ var _useState = useState(null),
35
+ _useState2 = _slicedToArray(_useState, 2),
36
+ data = _useState2[0],
37
+ setData = _useState2[1];
38
+ var _useState3 = useState(false),
39
+ _useState4 = _slicedToArray(_useState3, 2),
40
+ isLoading = _useState4[0],
41
+ setLoading = _useState4[1];
42
+ var _useState5 = useState(false),
43
+ _useState6 = _slicedToArray(_useState5, 2),
44
+ isWriting = _useState6[0],
45
+ setIsWriting = _useState6[1];
46
+ var _useState7 = useState(null),
47
+ _useState8 = _slicedToArray(_useState7, 2),
48
+ loadingMessage = _useState8[0],
49
+ setLoadingMessage = _useState8[1];
50
+ var _useState9 = useState(null),
51
+ _useState0 = _slicedToArray(_useState9, 2),
52
+ streamActivity = _useState0[0],
53
+ setStreamActivity = _useState0[1];
54
+ var abortControllerRef = useRef(null);
55
+ var isStoppedRef = useRef(false);
56
+ var activityMessageIndexRef = useRef(0);
57
+ var streamActivityRef = useRef(null);
38
58
  var onStreamUpdateRef = useRef(onStreamUpdate);
39
59
  var onFinishStreamRef = useRef(onFinishStream);
40
60
  var onStartWritingRef = useRef(onStartWriting);
@@ -47,140 +67,501 @@ export var useOrchestratorStream = function useOrchestratorStream(_ref) {
47
67
  onStopRef.current = onStop;
48
68
  onErrorRef.current = onError;
49
69
  onApprovalRequiredRef.current = onApprovalRequired;
50
- var askMaia = useCallback(/*#__PURE__*/function () {
51
- var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(payload) {
52
- var _payload$attachments, _payload$attachments$, _payload$attachments2, _hitlExecutionContext;
53
- var sessionId, messageId, placeholderId, ctx, request;
70
+ var clearStreamLoadingState = useCallback(function () {
71
+ activityMessageIndexRef.current = 0;
72
+ streamActivityRef.current = null;
73
+ setStreamActivity(null);
74
+ setLoadingMessage(null);
75
+ }, []);
76
+ var applyStreamActivity = useCallback(function (activity) {
77
+ var prev = streamActivityRef.current;
78
+ if ((prev === null || prev === void 0 ? void 0 : prev.phase) === activity.phase && canRotateStreamActivityPhase(activity.phase)) {
79
+ return;
80
+ }
81
+ if ((prev === null || prev === void 0 ? void 0 : prev.phase) !== activity.phase) {
82
+ activityMessageIndexRef.current = 0;
83
+ }
84
+ streamActivityRef.current = activity;
85
+ setStreamActivity(activity);
86
+ setLoadingMessage(activity.message);
87
+ }, []);
88
+ useEffect(function () {
89
+ streamActivityRef.current = streamActivity;
90
+ }, [streamActivity]);
91
+ useEffect(function () {
92
+ if (!isLoading || isWriting || !streamActivity) {
93
+ return undefined;
94
+ }
95
+ if (!canRotateStreamActivityPhase(streamActivity.phase)) {
96
+ return undefined;
97
+ }
98
+ var intervalId = window.setInterval(function () {
99
+ var prev = streamActivityRef.current;
100
+ if (!prev || !canRotateStreamActivityPhase(prev.phase)) {
101
+ return;
102
+ }
103
+ if (!canAdvanceStreamActivityMessage(prev.phase, activityMessageIndexRef.current)) {
104
+ return;
105
+ }
106
+ var advanced = advanceStreamActivityMessage(prev, activityMessageIndexRef.current, t);
107
+ if (!advanced) {
108
+ return;
109
+ }
110
+ activityMessageIndexRef.current = advanced.nextIndex;
111
+ streamActivityRef.current = advanced.activity;
112
+ setStreamActivity(advanced.activity);
113
+ setLoadingMessage(advanced.activity.message);
114
+ }, ACTIVITY_MESSAGE_ROTATE_MS);
115
+ return function () {
116
+ return window.clearInterval(intervalId);
117
+ };
118
+ }, [isLoading, isWriting, streamActivity === null || streamActivity === void 0 ? void 0 : streamActivity.phase, t]);
119
+ var handleSSEStream = useCallback(/*#__PURE__*/function () {
120
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(response) {
121
+ var _onErrorRef$current, _data$error, _data$error2;
122
+ var pendingContent, throttleTimer, streamSettled, emitThrottled, flushPending, _response$body, reader, decoder, buffer, accumulatedContent, hasStartedWriting, ensureWritingStarted, applyStreamChunk, applyStreamComplete, _yield$reader$read, done, value, lines, _iterator, _step, line, _line$split, _line$split2, eventLine, dataLine, eventType, dataStr, _data, chunk, _chunk, _onApprovalRequiredRe, isManualApproval, _onErrorRef$current2, _t, _t2, _t3, _t4;
54
123
  return _regeneratorRuntime.wrap(function (_context) {
55
124
  while (1) switch (_context.prev = _context.next) {
56
125
  case 0:
57
- sessionId = payload.chatId, messageId = payload.messageId;
58
- placeholderId = "answer-".concat(messageId, "-streaming");
59
- ctx = {
60
- sessionId: sessionId,
61
- messageId: messageId,
62
- placeholderId: placeholderId
63
- };
64
- request = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
65
- input: payload.message,
66
- history: payload.history,
67
- lang: payload.lang,
68
- userId: payload.userId
69
- }, payload.firstName ? {
70
- firstName: payload.firstName
71
- } : {}), payload.lastName ? {
72
- lastName: payload.lastName
73
- } : {}), {}, {
74
- companyId: payload.companyId,
75
- chatId: payload.chatId,
76
- messageId: payload.messageId,
77
- clientId: payload.clientId
78
- }, payload.feeId != null ? {
79
- feeId: payload.feeId
80
- } : {}), {}, {
81
- agentName: payload.agentName,
82
- agentId: payload.agentId,
83
- isWebSearchActive: payload.isWebSearchActive,
84
- isDeepSearchActive: payload.isDeepSearchActive
85
- }, payload.projectId ? {
86
- projectId: payload.projectId
87
- } : {}), payload.attachments ? {
88
- attachments: payload.attachments
89
- } : {}), payload.projectName ? {
90
- projectName: payload.projectName
91
- } : {}), payload.clientName ? {
92
- clientName: payload.clientName
93
- } : {}), payload.taskId != null ? {
94
- taskId: payload.taskId
95
- } : {}), payload.taskName ? {
96
- taskName: payload.taskName
97
- } : {}), payload.faqId ? {
98
- faqId: payload.faqId
99
- } : {}), payload.agentSuggestionId ? {
100
- agentSuggestionId: payload.agentSuggestionId
101
- } : {}), payload.fuaId ? {
102
- fuaId: payload.fuaId
103
- } : {}), payload.scId ? {
104
- scId: payload.scId
105
- } : {}), payload.agentEntity != null ? {
106
- agentEntity: payload.agentEntity
107
- } : {}), payload.agentType != null ? {
108
- agentType: payload.agentType
109
- } : {}), payload.contextMessage ? {
110
- contextMessage: payload.contextMessage
111
- } : {}), payload.contextData ? {
112
- contextData: payload.contextData
113
- } : {});
114
- return _context.abrupt("return", sessionStreamManager.startStream({
115
- sessionId: sessionId,
116
- placeholderId: placeholderId,
117
- request: request,
118
- t: t,
119
- activityOptions: {
120
- isWebSearchActive: payload.isWebSearchActive,
121
- isDeepSearchActive: payload.isDeepSearchActive,
122
- hasAttachments: Boolean((_payload$attachments = payload.attachments) === null || _payload$attachments === void 0 ? void 0 : _payload$attachments.length),
123
- attachmentsCount: (_payload$attachments$ = (_payload$attachments2 = payload.attachments) === null || _payload$attachments2 === void 0 ? void 0 : _payload$attachments2.length) !== null && _payload$attachments$ !== void 0 ? _payload$attachments$ : 0
124
- },
125
- hitlExecutionContext: (_hitlExecutionContext = hitlExecutionContextRef === null || hitlExecutionContextRef === void 0 ? void 0 : hitlExecutionContextRef.current) !== null && _hitlExecutionContext !== void 0 ? _hitlExecutionContext : null,
126
- agentId: payload.agentId,
127
- agentName: payload.agentName,
128
- callbacks: {
129
- onStreamUpdate: function onStreamUpdate(content) {
126
+ // Time-throttle: evita emitir onStreamUpdate más de una vez cada ~16ms.
127
+ // Usamos timer para que el stream siga pintando aunque rAF esté throttleado.
128
+ // Nota: no tocamos el state `data` en el hot path (solo se actualiza en
129
+ // `complete`/resets) para no re-renderizar a los consumidores del hook
130
+ // en cada frame; el texto en vivo viaja por el streamingStore.
131
+ pendingContent = null;
132
+ throttleTimer = null;
133
+ streamSettled = false;
134
+ emitThrottled = function emitThrottled(content) {
135
+ pendingContent = content;
136
+ if (throttleTimer != null) return;
137
+ throttleTimer = window.setTimeout(function () {
138
+ throttleTimer = null;
139
+ if (streamSettled) {
140
+ pendingContent = null;
141
+ return;
142
+ }
143
+ if (pendingContent != null) {
130
144
  var _onStreamUpdateRef$cu;
131
- return (_onStreamUpdateRef$cu = onStreamUpdateRef.current) === null || _onStreamUpdateRef$cu === void 0 ? void 0 : _onStreamUpdateRef$cu.call(onStreamUpdateRef, ctx, content);
132
- },
133
- onStartWriting: function onStartWriting() {
134
- var _onStartWritingRef$cu;
135
- return (_onStartWritingRef$cu = onStartWritingRef.current) === null || _onStartWritingRef$cu === void 0 ? void 0 : _onStartWritingRef$cu.call(onStartWritingRef);
136
- },
137
- onFinishStream: function onFinishStream(finishPayload) {
138
- var _onFinishStreamRef$cu;
139
- return (_onFinishStreamRef$cu = onFinishStreamRef.current) === null || _onFinishStreamRef$cu === void 0 ? void 0 : _onFinishStreamRef$cu.call(onFinishStreamRef, ctx, finishPayload.content, finishPayload.sources, finishPayload.memorySessionId, finishPayload.attachments, finishPayload.suggestions, finishPayload.completedAgentId, finishPayload.resolvedContext);
140
- },
141
- onError: function onError(errorType, errorMessage) {
142
- var _onErrorRef$current;
143
- return (_onErrorRef$current = onErrorRef.current) === null || _onErrorRef$current === void 0 ? void 0 : _onErrorRef$current.call(onErrorRef, ctx, errorType, errorMessage);
144
- },
145
- onApprovalRequired: function onApprovalRequired(approval, accumulatedContent) {
146
- var _onApprovalRequiredRe;
147
- return (_onApprovalRequiredRe = onApprovalRequiredRef.current) === null || _onApprovalRequiredRe === void 0 ? void 0 : _onApprovalRequiredRe.call(onApprovalRequiredRef, ctx, approval, accumulatedContent);
145
+ var toEmit = pendingContent;
146
+ pendingContent = null;
147
+ (_onStreamUpdateRef$cu = onStreamUpdateRef.current) === null || _onStreamUpdateRef$cu === void 0 || _onStreamUpdateRef$cu.call(onStreamUpdateRef, toEmit, null, '');
148
148
  }
149
+ }, 16);
150
+ };
151
+ flushPending = function flushPending() {
152
+ if (throttleTimer != null) {
153
+ window.clearTimeout(throttleTimer);
154
+ throttleTimer = null;
155
+ }
156
+ if (pendingContent != null) {
157
+ var _onStreamUpdateRef$cu2;
158
+ var toEmit = pendingContent;
159
+ pendingContent = null;
160
+ (_onStreamUpdateRef$cu2 = onStreamUpdateRef.current) === null || _onStreamUpdateRef$cu2 === void 0 || _onStreamUpdateRef$cu2.call(onStreamUpdateRef, toEmit, null, '');
161
+ }
162
+ };
163
+ _context.prev = 1;
164
+ reader = (_response$body = response.body) === null || _response$body === void 0 ? void 0 : _response$body.getReader();
165
+ if (reader) {
166
+ _context.next = 2;
167
+ break;
168
+ }
169
+ throw new Error('No reader available');
170
+ case 2:
171
+ decoder = new TextDecoder();
172
+ buffer = '';
173
+ accumulatedContent = '';
174
+ hasStartedWriting = false;
175
+ ensureWritingStarted = function ensureWritingStarted() {
176
+ var _onStartWritingRef$cu;
177
+ if (hasStartedWriting) return;
178
+ hasStartedWriting = true;
179
+ setIsWriting(true);
180
+ applyStreamActivity(getWritingStreamActivity(t));
181
+ (_onStartWritingRef$cu = onStartWritingRef.current) === null || _onStartWritingRef$cu === void 0 || _onStartWritingRef$cu.call(onStartWritingRef);
182
+ };
183
+ applyStreamChunk = function applyStreamChunk(chunk) {
184
+ if (!chunk) return;
185
+ accumulatedContent = mergeStreamChunk(accumulatedContent, chunk);
186
+ emitThrottled(accumulatedContent);
187
+ };
188
+ applyStreamComplete = function applyStreamComplete(payload) {
189
+ var _payload$agent_id, _subagentRaw$resolved, _onFinishStreamRef$cu;
190
+ if (streamSettled) return;
191
+ streamSettled = true;
192
+ var finalContent = payload.content || accumulatedContent;
193
+ var sources = payload.sources || null;
194
+ var memorySessionId = payload.memory_session_id || '';
195
+ var attachments = Array.isArray(payload.attachments) ? payload.attachments : null;
196
+ var suggestions = null;
197
+ if (Array.isArray(payload.suggest_reply)) {
198
+ suggestions = payload.suggest_reply;
199
+ } else if (Array.isArray(payload.suggestions)) {
200
+ suggestions = payload.suggestions;
149
201
  }
150
- }));
151
- case 1:
202
+ var agentIdRaw = (_payload$agent_id = payload.agent_id) !== null && _payload$agent_id !== void 0 ? _payload$agent_id : payload.agentId;
203
+ var completedAgentId = agentIdRaw != null && String(agentIdRaw).trim() !== '' ? String(agentIdRaw).trim() : null;
204
+ var subagentRaw = payload.subagent;
205
+ var resolvedContext = (_subagentRaw$resolved = subagentRaw === null || subagentRaw === void 0 ? void 0 : subagentRaw.resolved_context) !== null && _subagentRaw$resolved !== void 0 ? _subagentRaw$resolved : null;
206
+ flushPending();
207
+ setData(finalContent);
208
+ setLoading(false);
209
+ setIsWriting(false);
210
+ clearStreamLoadingState();
211
+ (_onFinishStreamRef$cu = onFinishStreamRef.current) === null || _onFinishStreamRef$cu === void 0 || _onFinishStreamRef$cu.call(onFinishStreamRef, finalContent, sources, memorySessionId, attachments, suggestions, completedAgentId, resolvedContext);
212
+ };
213
+ case 3:
214
+ if (!true) {
215
+ _context.next = 29;
216
+ break;
217
+ }
218
+ if (!isStoppedRef.current) {
219
+ _context.next = 4;
220
+ break;
221
+ }
222
+ reader.cancel();
223
+ return _context.abrupt("continue", 29);
224
+ case 4:
225
+ _context.next = 5;
226
+ return reader.read();
227
+ case 5:
228
+ _yield$reader$read = _context.sent;
229
+ done = _yield$reader$read.done;
230
+ value = _yield$reader$read.value;
231
+ if (!done) {
232
+ _context.next = 6;
233
+ break;
234
+ }
235
+ return _context.abrupt("continue", 29);
236
+ case 6:
237
+ if (!isStoppedRef.current) {
238
+ _context.next = 7;
239
+ break;
240
+ }
241
+ reader.cancel();
242
+ return _context.abrupt("continue", 29);
243
+ case 7:
244
+ buffer += decoder.decode(value, {
245
+ stream: true
246
+ });
247
+ lines = buffer.split('\n\n');
248
+ buffer = lines.pop() || '';
249
+ _iterator = _createForOfIteratorHelper(lines);
250
+ _context.prev = 8;
251
+ _iterator.s();
252
+ case 9:
253
+ if ((_step = _iterator.n()).done) {
254
+ _context.next = 25;
255
+ break;
256
+ }
257
+ line = _step.value;
258
+ if (!(line.trim() === '')) {
259
+ _context.next = 10;
260
+ break;
261
+ }
262
+ return _context.abrupt("continue", 24);
263
+ case 10:
264
+ _line$split = line.split('\n'), _line$split2 = _slicedToArray(_line$split, 2), eventLine = _line$split2[0], dataLine = _line$split2[1];
265
+ if (!(!eventLine || !dataLine)) {
266
+ _context.next = 11;
267
+ break;
268
+ }
269
+ return _context.abrupt("continue", 24);
270
+ case 11:
271
+ eventType = eventLine.replace('event: ', '').trim();
272
+ dataStr = dataLine.replace('data: ', '').trim();
273
+ _context.prev = 12;
274
+ _data = JSON.parse(dataStr);
275
+ if (!(streamSettled && eventType !== 'error')) {
276
+ _context.next = 13;
277
+ break;
278
+ }
279
+ return _context.abrupt("continue", 24);
280
+ case 13:
281
+ _t = eventType;
282
+ _context.next = _t === 'thinking' ? 14 : _t === 'token' ? 15 : _t === 'content' ? 16 : _t === 'node' ? 17 : _t === 'complete' ? 18 : _t === 'approval_required' ? 19 : _t === 'error' ? 20 : 21;
283
+ break;
284
+ case 14:
285
+ if (!hasStartedWriting) {
286
+ setLoading(true);
287
+ applyStreamActivity({
288
+ phase: 'thinking',
289
+ message: getThinkingLoadingMessage(0, t)
290
+ });
291
+ }
292
+ return _context.abrupt("continue", 22);
293
+ case 15:
294
+ chunk = typeof _data.content === 'string' ? _data.content : '';
295
+ ensureWritingStarted();
296
+ applyStreamChunk(chunk);
297
+ return _context.abrupt("continue", 22);
298
+ case 16:
299
+ _chunk = typeof _data.content === 'string' ? _data.content : '';
300
+ ensureWritingStarted();
301
+ applyStreamChunk(_chunk);
302
+ if (isCompleteLikeSsePayload(_data)) {
303
+ applyStreamComplete(_data);
304
+ }
305
+ return _context.abrupt("continue", 22);
306
+ case 17:
307
+ // El orchestrator delegó a un subagente: NO lo exponemos. Mantenemos
308
+ // el indicador de actividad genérico de MAIA, sin anunciar la
309
+ // transferencia ni el nombre del subagente.
310
+ if (_data.node === 'agent_transfer') {
311
+ setLoading(true);
312
+ } else if (_data.message && typeof _data.message === 'string') {
313
+ setLoading(true);
314
+ applyStreamActivity(resolveHitlNodeStreamActivity(_data.message, t, hitlExecutionContextRef === null || hitlExecutionContextRef === void 0 ? void 0 : hitlExecutionContextRef.current, typeof _data.thread_id === 'string' ? _data.thread_id : undefined));
315
+ }
316
+ return _context.abrupt("continue", 22);
317
+ case 18:
318
+ applyStreamComplete(_data);
319
+ return _context.abrupt("continue", 22);
320
+ case 19:
321
+ // Manual approval: el SSE sigue con node/token/complete (y puede
322
+ // encadenar más approval_required). Solo el approval "pausado"
323
+ // (botón) es terminal para este stream.
324
+ flushPending();
325
+ setIsWriting(false);
326
+ isManualApproval = _data.manual_approval_detected === true;
327
+ if (!isManualApproval) {
328
+ streamSettled = true;
329
+ setLoading(false);
330
+ clearStreamLoadingState();
331
+ }
332
+ (_onApprovalRequiredRe = onApprovalRequiredRef.current) === null || _onApprovalRequiredRe === void 0 || _onApprovalRequiredRe.call(onApprovalRequiredRef, _data, accumulatedContent);
333
+ if (isManualApproval && Array.isArray(_data.pending_actions) && _data.pending_actions.length > 0) {
334
+ setLoading(true);
335
+ applyStreamActivity(resolveInitialHitlStreamActivity(t, hitlExecutionContextRef === null || hitlExecutionContextRef === void 0 ? void 0 : hitlExecutionContextRef.current));
336
+ }
337
+ return _context.abrupt("continue", 22);
338
+ case 20:
339
+ streamSettled = true;
340
+ console.error('SSE Error:', _data.error);
341
+ flushPending();
342
+ setIsWriting(false);
343
+ setLoading(false);
344
+ clearStreamLoadingState();
345
+ setLoadingMessage(null); // Limpiar mensaje cuando hay error
346
+ (_onErrorRef$current = onErrorRef.current) === null || _onErrorRef$current === void 0 || _onErrorRef$current.call(onErrorRef, (_data$error = _data.error) === null || _data$error === void 0 ? void 0 : _data$error.type, (_data$error2 = _data.error) === null || _data$error2 === void 0 ? void 0 : _data$error2.message);
347
+ return _context.abrupt("continue", 22);
348
+ case 21:
349
+ console.warn('Unknown SSE event type:', eventType);
350
+ return _context.abrupt("continue", 22);
351
+ case 22:
352
+ _context.next = 24;
353
+ break;
354
+ case 23:
355
+ _context.prev = 23;
356
+ _t2 = _context["catch"](12);
357
+ console.error('Error parsing SSE data:', _t2, dataStr);
358
+ case 24:
359
+ _context.next = 9;
360
+ break;
361
+ case 25:
362
+ _context.next = 27;
363
+ break;
364
+ case 26:
365
+ _context.prev = 26;
366
+ _t3 = _context["catch"](8);
367
+ _iterator.e(_t3);
368
+ case 27:
369
+ _context.prev = 27;
370
+ _iterator.f();
371
+ return _context.finish(27);
372
+ case 28:
373
+ _context.next = 3;
374
+ break;
375
+ case 29:
376
+ _context.next = 31;
377
+ break;
378
+ case 30:
379
+ _context.prev = 30;
380
+ _t4 = _context["catch"](1);
381
+ flushPending();
382
+ setIsWriting(false);
383
+
384
+ // Solo ejecutar onError si no fue un stop intencional
385
+ if (!isStoppedRef.current) {
386
+ (_onErrorRef$current2 = onErrorRef.current) === null || _onErrorRef$current2 === void 0 || _onErrorRef$current2.call(onErrorRef);
387
+ }
388
+ case 31:
389
+ _context.prev = 31;
390
+ flushPending();
391
+ if (!streamSettled) {
392
+ setLoading(false);
393
+ setIsWriting(false);
394
+ clearStreamLoadingState();
395
+ }
396
+ return _context.finish(31);
397
+ case 32:
152
398
  case "end":
153
399
  return _context.stop();
154
400
  }
155
- }, _callee);
401
+ }, _callee, null, [[1, 30, 31, 32], [8, 26, 27, 28], [12, 23]]);
156
402
  }));
157
403
  return function (_x) {
158
404
  return _ref2.apply(this, arguments);
159
405
  };
160
- }(), [t, hitlExecutionContextRef]);
406
+ }(), [applyStreamActivity, clearStreamLoadingState, hitlExecutionContextRef, t]);
407
+ var askMaia = /*#__PURE__*/function () {
408
+ var _ref4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(_ref3) {
409
+ var message, history, projectId, lang, userId, firstName, lastName, companyId, chatId, messageId, clientId, clientName, feeId, agentName, agentId, isWebSearchActive, isDeepSearchActive, attachments, projectName, taskId, taskName, faqId, agentSuggestionId, fuaId, scId, agentEntity, agentType, contextMessage, contextData, _attachments$length, _abortControllerRef$c, initialActivity, response, _onErrorRef$current3, _t5;
410
+ return _regeneratorRuntime.wrap(function (_context2) {
411
+ while (1) switch (_context2.prev = _context2.next) {
412
+ case 0:
413
+ message = _ref3.message, history = _ref3.history, projectId = _ref3.projectId, lang = _ref3.lang, userId = _ref3.userId, firstName = _ref3.firstName, lastName = _ref3.lastName, companyId = _ref3.companyId, chatId = _ref3.chatId, messageId = _ref3.messageId, clientId = _ref3.clientId, clientName = _ref3.clientName, feeId = _ref3.feeId, agentName = _ref3.agentName, agentId = _ref3.agentId, isWebSearchActive = _ref3.isWebSearchActive, isDeepSearchActive = _ref3.isDeepSearchActive, attachments = _ref3.attachments, projectName = _ref3.projectName, taskId = _ref3.taskId, taskName = _ref3.taskName, faqId = _ref3.faqId, agentSuggestionId = _ref3.agentSuggestionId, fuaId = _ref3.fuaId, scId = _ref3.scId, agentEntity = _ref3.agentEntity, agentType = _ref3.agentType, contextMessage = _ref3.contextMessage, contextData = _ref3.contextData;
414
+ _context2.prev = 1;
415
+ setLoading(true);
416
+ setIsWriting(false);
417
+ setData(null);
418
+ activityMessageIndexRef.current = 0;
419
+ initialActivity = getInitialStreamActivity(t, {
420
+ isWebSearchActive: isWebSearchActive,
421
+ isDeepSearchActive: isDeepSearchActive,
422
+ hasAttachments: Boolean(attachments === null || attachments === void 0 ? void 0 : attachments.length),
423
+ attachmentsCount: (_attachments$length = attachments === null || attachments === void 0 ? void 0 : attachments.length) !== null && _attachments$length !== void 0 ? _attachments$length : 0
424
+ });
425
+ applyStreamActivity(initialActivity);
426
+ isStoppedRef.current = false; // Resetear flag al iniciar nueva petición
427
+
428
+ abortControllerRef.current = new AbortController();
429
+ _context2.next = 2;
430
+ return maia.Orchestrator.orchestrator(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
431
+ input: message,
432
+ history: history,
433
+ lang: lang,
434
+ userId: userId
435
+ }, firstName ? {
436
+ firstName: firstName
437
+ } : {}), lastName ? {
438
+ lastName: lastName
439
+ } : {}), {}, {
440
+ companyId: companyId,
441
+ chatId: chatId,
442
+ messageId: messageId,
443
+ clientId: clientId
444
+ }, feeId != null ? {
445
+ feeId: feeId
446
+ } : {}), {}, {
447
+ agentName: agentName,
448
+ agentId: agentId,
449
+ isWebSearchActive: isWebSearchActive,
450
+ isDeepSearchActive: isDeepSearchActive
451
+ }, projectId ? {
452
+ projectId: projectId
453
+ } : {}), attachments ? {
454
+ attachments: attachments
455
+ } : {}), projectName ? {
456
+ projectName: projectName
457
+ } : {}), clientName ? {
458
+ clientName: clientName
459
+ } : {}), taskId != null ? {
460
+ taskId: taskId
461
+ } : {}), taskName ? {
462
+ taskName: taskName
463
+ } : {}), faqId ? {
464
+ faqId: faqId
465
+ } : {}), agentSuggestionId ? {
466
+ agentSuggestionId: agentSuggestionId
467
+ } : {}), fuaId ? {
468
+ fuaId: fuaId
469
+ } : {}), scId ? {
470
+ scId: scId
471
+ } : {}), agentEntity != null ? {
472
+ agentEntity: agentEntity
473
+ } : {}), agentType != null ? {
474
+ agentType: agentType
475
+ } : {}), contextMessage ? {
476
+ contextMessage: contextMessage
477
+ } : {}), contextData ? {
478
+ contextData: contextData
479
+ } : {}), (_abortControllerRef$c = abortControllerRef.current) === null || _abortControllerRef$c === void 0 ? void 0 : _abortControllerRef$c.signal);
480
+ case 2:
481
+ response = _context2.sent;
482
+ _context2.next = 3;
483
+ return handleSSEStream(response);
484
+ case 3:
485
+ _context2.next = 5;
486
+ break;
487
+ case 4:
488
+ _context2.prev = 4;
489
+ _t5 = _context2["catch"](1);
490
+ // Si fue un abort intencional (stop manual o cambio de chat), no disparar onError
491
+ // porque eso inserta un "mensaje de error" en el chat al que acabamos de navegar.
492
+ if (!isStoppedRef.current) {
493
+ (_onErrorRef$current3 = onErrorRef.current) === null || _onErrorRef$current3 === void 0 || _onErrorRef$current3.call(onErrorRef);
494
+ }
495
+ clearStreamLoadingState();
496
+ setLoading(false);
497
+ setIsWriting(false);
498
+ case 5:
499
+ case "end":
500
+ return _context2.stop();
501
+ }
502
+ }, _callee2, null, [[1, 4]]);
503
+ }));
504
+ return function askMaia(_x2) {
505
+ return _ref4.apply(this, arguments);
506
+ };
507
+ }();
161
508
  var stopStreaming = useCallback(function () {
162
- sessionStreamManager.stopStream(activeSessionId, {
163
- onStop: function onStop() {
164
- var _onStopRef$current;
165
- return (_onStopRef$current = onStopRef.current) === null || _onStopRef$current === void 0 ? void 0 : _onStopRef$current.call(onStopRef);
166
- }
167
- });
168
- }, [activeSessionId]);
509
+ if (abortControllerRef.current) {
510
+ var _onStopRef$current;
511
+ isStoppedRef.current = true;
512
+ abortControllerRef.current.abort();
513
+ abortControllerRef.current = null;
514
+ setLoading(false);
515
+ setIsWriting(false);
516
+ clearStreamLoadingState();
517
+ (_onStopRef$current = onStopRef.current) === null || _onStopRef$current === void 0 || _onStopRef$current.call(onStopRef);
518
+ }
519
+ }, [clearStreamLoadingState]);
520
+
521
+ /**
522
+ * Aborta el stream en curso (si existe) sin disparar `onStop`.
523
+ * Úselo en casos donde no queremos agregar el mensaje de "cancelado"
524
+ * (por ejemplo, al cambiar de chat).
525
+ */
169
526
  var abortStreamSilently = useCallback(function () {
170
- sessionStreamManager.abortSilently(activeSessionId);
171
- }, [activeSessionId]);
527
+ if (abortControllerRef.current) {
528
+ isStoppedRef.current = true;
529
+ abortControllerRef.current.abort();
530
+ abortControllerRef.current = null;
531
+ setLoading(false);
532
+ setIsWriting(false);
533
+ clearStreamLoadingState();
534
+ }
535
+ }, [clearStreamLoadingState]);
536
+
537
+ // Cleanup al desmontar: si queda un stream activo, abortarlo para evitar
538
+ // que intente actualizar estado en un componente ya desmontado (fugas de
539
+ // memoria y warnings).
540
+ useEffect(function () {
541
+ return function () {
542
+ if (abortControllerRef.current) {
543
+ abortControllerRef.current.abort();
544
+ abortControllerRef.current = null;
545
+ }
546
+ };
547
+ }, []);
172
548
  var updateStreamActivity = useCallback(function (activity) {
173
- useSessionsStore.getState().setActivity(activeSessionId, activity);
174
- }, [activeSessionId]);
175
- var reset = useCallback(function () {
176
- useSessionsStore.getState().patchMeta(activeSessionId, {
177
- isLoading: false,
178
- isWriting: false
179
- });
180
- useSessionsStore.getState().setActivity(activeSessionId, null);
181
- }, [activeSessionId]);
549
+ if (!activity) {
550
+ clearStreamLoadingState();
551
+ return;
552
+ }
553
+ applyStreamActivity(activity);
554
+ }, [applyStreamActivity, clearStreamLoadingState]);
555
+ var reset = function reset() {
556
+ setData(null);
557
+ setLoading(false);
558
+ setIsWriting(false);
559
+ clearStreamLoadingState();
560
+ isStoppedRef.current = false;
561
+ };
182
562
  return {
183
563
  askMaia: askMaia,
564
+ response: data,
184
565
  isLoading: isLoading,
185
566
  isWriting: isWriting,
186
567
  loadingMessage: loadingMessage,
@@ -188,7 +569,8 @@ export var useOrchestratorStream = function useOrchestratorStream(_ref) {
188
569
  updateStreamActivity: updateStreamActivity,
189
570
  reset: reset,
190
571
  stopStreaming: stopStreaming,
191
- abortStreamSilently: abortStreamSilently
572
+ abortStreamSilently: abortStreamSilently,
573
+ handleSSEStream: handleSSEStream // Exponer para poder usarlo en continue-thread
192
574
  };
193
575
  };
194
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVJlZiIsInVzZVRyYW5zbGF0aW9uIiwiU0VDVElPTlMiLCJzZXNzaW9uU3RyZWFtTWFuYWdlciIsInVzZVNlc3Npb25zU3RvcmUiLCJ1c2VTZXNzaW9uU3RyZWFtU3RhdGUiLCJ1c2VPcmNoZXN0cmF0b3JTdHJlYW0iLCJfcmVmIiwiYWN0aXZlU2Vzc2lvbklkIiwib25TdHJlYW1VcGRhdGUiLCJvbkZpbmlzaFN0cmVhbSIsIm9uU3RhcnRXcml0aW5nIiwib25TdG9wIiwib25FcnJvciIsIm9uQXBwcm92YWxSZXF1aXJlZCIsImhpdGxFeGVjdXRpb25Db250ZXh0UmVmIiwiX3VzZVRyYW5zbGF0aW9uIiwiY2hhdEFJIiwidCIsIl91c2VTZXNzaW9uU3RyZWFtU3RhdCIsImlzTG9hZGluZyIsImlzV3JpdGluZyIsImxvYWRpbmdNZXNzYWdlIiwic3RyZWFtQWN0aXZpdHkiLCJvblN0cmVhbVVwZGF0ZVJlZiIsIm9uRmluaXNoU3RyZWFtUmVmIiwib25TdGFydFdyaXRpbmdSZWYiLCJvblN0b3BSZWYiLCJvbkVycm9yUmVmIiwib25BcHByb3ZhbFJlcXVpcmVkUmVmIiwiY3VycmVudCIsImFza01haWEiLCJfcmVmMiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwicGF5bG9hZCIsIl9wYXlsb2FkJGF0dGFjaG1lbnRzIiwiX3BheWxvYWQkYXR0YWNobWVudHMkIiwiX3BheWxvYWQkYXR0YWNobWVudHMyIiwiX2hpdGxFeGVjdXRpb25Db250ZXh0Iiwic2Vzc2lvbklkIiwibWVzc2FnZUlkIiwicGxhY2Vob2xkZXJJZCIsImN0eCIsInJlcXVlc3QiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImNoYXRJZCIsImNvbmNhdCIsIl9vYmplY3RTcHJlYWQiLCJpbnB1dCIsIm1lc3NhZ2UiLCJoaXN0b3J5IiwibGFuZyIsInVzZXJJZCIsImZpcnN0TmFtZSIsImxhc3ROYW1lIiwiY29tcGFueUlkIiwiY2xpZW50SWQiLCJmZWVJZCIsImFnZW50TmFtZSIsImFnZW50SWQiLCJpc1dlYlNlYXJjaEFjdGl2ZSIsImlzRGVlcFNlYXJjaEFjdGl2ZSIsInByb2plY3RJZCIsImF0dGFjaG1lbnRzIiwicHJvamVjdE5hbWUiLCJjbGllbnROYW1lIiwidGFza0lkIiwidGFza05hbWUiLCJmYXFJZCIsImFnZW50U3VnZ2VzdGlvbklkIiwiZnVhSWQiLCJzY0lkIiwiYWdlbnRFbnRpdHkiLCJhZ2VudFR5cGUiLCJjb250ZXh0TWVzc2FnZSIsImNvbnRleHREYXRhIiwiYWJydXB0Iiwic3RhcnRTdHJlYW0iLCJhY3Rpdml0eU9wdGlvbnMiLCJoYXNBdHRhY2htZW50cyIsIkJvb2xlYW4iLCJsZW5ndGgiLCJhdHRhY2htZW50c0NvdW50IiwiaGl0bEV4ZWN1dGlvbkNvbnRleHQiLCJjYWxsYmFja3MiLCJjb250ZW50IiwiX29uU3RyZWFtVXBkYXRlUmVmJGN1IiwiY2FsbCIsIl9vblN0YXJ0V3JpdGluZ1JlZiRjdSIsImZpbmlzaFBheWxvYWQiLCJfb25GaW5pc2hTdHJlYW1SZWYkY3UiLCJzb3VyY2VzIiwibWVtb3J5U2Vzc2lvbklkIiwic3VnZ2VzdGlvbnMiLCJjb21wbGV0ZWRBZ2VudElkIiwicmVzb2x2ZWRDb250ZXh0IiwiZXJyb3JUeXBlIiwiZXJyb3JNZXNzYWdlIiwiX29uRXJyb3JSZWYkY3VycmVudCIsImFwcHJvdmFsIiwiYWNjdW11bGF0ZWRDb250ZW50IiwiX29uQXBwcm92YWxSZXF1aXJlZFJlIiwic3RvcCIsIl94IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJzdG9wU3RyZWFtaW5nIiwic3RvcFN0cmVhbSIsIl9vblN0b3BSZWYkY3VycmVudCIsImFib3J0U3RyZWFtU2lsZW50bHkiLCJhYm9ydFNpbGVudGx5IiwidXBkYXRlU3RyZWFtQWN0aXZpdHkiLCJhY3Rpdml0eSIsImdldFN0YXRlIiwic2V0QWN0aXZpdHkiLCJyZXNldCIsInBhdGNoTWV0YSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy91c2VPcmNoZXN0cmF0b3JTdHJlYW0vdXNlT3JjaGVzdHJhdG9yU3RyZWFtLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VSZWYgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCdcbmltcG9ydCB7IEF0dGFjaG1lbnRGaWxlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9tb2xlY3VsZXMvQ2hhdEZvb3Rlci9DaGF0Rm9vdGVyJ1xuaW1wb3J0IHsgQ2hhdEhpc3RvcnkgfSBmcm9tICcuLi8uLi90eXBlcy9DaGF0J1xuaW1wb3J0IHsgQWdlbnRFbnRpdHksIEFnZW50VHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzL2FnZW50J1xuaW1wb3J0IHsgQ29udGV4dE1lc3NhZ2UgfSBmcm9tICcuLi8uLi90eXBlcy9jb250ZXh0TWVudGlvbidcbmltcG9ydCB7IFVzZU9yY2hlc3RyYXRvclN0cmVhbVByb3BzLCBTdHJlYW1Db250ZXh0IH0gZnJvbSAnLi91c2VPcmNoZXN0cmF0b3JTdHJlYW0uaW50ZXJmYWNlJ1xuaW1wb3J0IHsgU0VDVElPTlMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvY29uZmlnJ1xuaW1wb3J0IHR5cGUgeyBTdHJlYW1BY3Rpdml0eSB9IGZyb20gJy4uLy4uL3R5cGVzL3N0cmVhbUFjdGl2aXR5J1xuaW1wb3J0IHsgc2Vzc2lvblN0cmVhbU1hbmFnZXIgfSBmcm9tICcuLi8uLi9zdG9yZS9zZXNzaW9ucy9zZXNzaW9uU3RyZWFtTWFuYWdlcidcbmltcG9ydCB7IHVzZVNlc3Npb25zU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS9zZXNzaW9ucy91c2VTZXNzaW9uc1N0b3JlJ1xuaW1wb3J0IHsgdXNlU2Vzc2lvblN0cmVhbVN0YXRlIH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvdXNlU2Vzc2lvbk1ldGEnXG5pbXBvcnQgdHlwZSB7IFN0YXJ0U3RyZWFtUmVzdWx0IH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvc2Vzc2lvbnMudHlwZXMnXG5cbnR5cGUgQXNrTWFpYVBheWxvYWQgPSB7XG4gIG1lc3NhZ2U6IHN0cmluZ1xuICBoaXN0b3J5OiBDaGF0SGlzdG9yeVtdXG4gIHByb2plY3RJZDogbnVtYmVyIHwgbnVsbFxuICBsYW5nOiBzdHJpbmdcbiAgdXNlcklkOiBzdHJpbmdcbiAgZmlyc3ROYW1lPzogc3RyaW5nXG4gIGxhc3ROYW1lPzogc3RyaW5nXG4gIGNvbXBhbnlJZDogc3RyaW5nXG4gIGNoYXRJZDogc3RyaW5nXG4gIG1lc3NhZ2VJZDogc3RyaW5nXG4gIGNsaWVudElkPzogbnVtYmVyXG4gIGNsaWVudE5hbWU/OiBzdHJpbmdcbiAgZmVlSWQ/OiBudW1iZXJcbiAgYWdlbnROYW1lOiBzdHJpbmdcbiAgYWdlbnRJZDogc3RyaW5nXG4gIGlzV2ViU2VhcmNoQWN0aXZlPzogYm9vbGVhblxuICBpc0RlZXBTZWFyY2hBY3RpdmU/OiBib29sZWFuXG4gIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXVxuICBwcm9qZWN0TmFtZT86IHN0cmluZ1xuICB0YXNrSWQ/OiBudW1iZXJcbiAgdGFza05hbWU/OiBzdHJpbmdcbiAgZmFxSWQ/OiBzdHJpbmdcbiAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmdcbiAgZnVhSWQ/OiBzdHJpbmdcbiAgc2NJZD86IHN0cmluZ1xuICBhZ2VudEVudGl0eT86IEFnZW50RW50aXR5XG4gIGFnZW50VHlwZT86IEFnZW50VHlwZVxuICBhZ2VudEVtb2ppPzogc3RyaW5nIHwgbnVsbFxuICBjb250ZXh0TWVzc2FnZT86IENvbnRleHRNZXNzYWdlXG4gIGNvbnRleHREYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbn1cblxuLyoqXG4gKiBBZGFwdGVyIHNvYnJlIGBzZXNzaW9uU3RyZWFtTWFuYWdlcmAuIE1hbnRpZW5lIGxhIEFQSSBww7pibGljYSBoaXN0w7NyaWNhXG4gKiAoYGFza01haWFgLCBgaXNMb2FkaW5nYCwgYGlzV3JpdGluZ2AsIGBzdG9wU3RyZWFtaW5nYCwgZXRjLikgcGVybyBhaG9yYSBlbFxuICogbW90b3IgZGUgc3RyZWFtaW5nIHZpdmUgZW4gZWwgbWFuYWdlciAobW9kdWxlLWxldmVsKSwgbG8gcXVlIHBlcm1pdGUgdGVuZXJcbiAqIHZhcmlhcyBzZXNpb25lcyBnZW5lcmFuZG8gYSBsYSB2ZXogeSBxdWUgc29icmV2aXZhbiBhIGNhbWJpb3MgZGUgdmlzdGEuXG4gKlxuICogTG9zIGZsYWdzIHJlYWN0aXZvcyAoYGlzTG9hZGluZ2AvYGlzV3JpdGluZ2AvYHN0cmVhbUFjdGl2aXR5YCkgc2UgbGVlbiBkZWxcbiAqIHN0b3JlIHBhcmEgbGEgc2VzacOzbiBhY3R1YWxtZW50ZSBhY3RpdmEgKGBhY3RpdmVTZXNzaW9uSWRgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IHVzZU9yY2hlc3RyYXRvclN0cmVhbSA9ICh7XG4gIGFjdGl2ZVNlc3Npb25JZCxcbiAgb25TdHJlYW1VcGRhdGUsXG4gIG9uRmluaXNoU3RyZWFtLFxuICBvblN0YXJ0V3JpdGluZyxcbiAgb25TdG9wLFxuICBvbkVycm9yLFxuICBvbkFwcHJvdmFsUmVxdWlyZWQsXG4gIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLFxufTogVXNlT3JjaGVzdHJhdG9yU3RyZWFtUHJvcHMpID0+IHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUcmFuc2xhdGlvbihbU0VDVElPTlMuY2hhdEFJXSlcblxuICBjb25zdCB7IGlzTG9hZGluZywgaXNXcml0aW5nLCBsb2FkaW5nTWVzc2FnZSwgc3RyZWFtQWN0aXZpdHkgfSA9IHVzZVNlc3Npb25TdHJlYW1TdGF0ZShhY3RpdmVTZXNzaW9uSWQpXG5cbiAgY29uc3Qgb25TdHJlYW1VcGRhdGVSZWYgPSB1c2VSZWYob25TdHJlYW1VcGRhdGUpXG4gIGNvbnN0IG9uRmluaXNoU3RyZWFtUmVmID0gdXNlUmVmKG9uRmluaXNoU3RyZWFtKVxuICBjb25zdCBvblN0YXJ0V3JpdGluZ1JlZiA9IHVzZVJlZihvblN0YXJ0V3JpdGluZylcbiAgY29uc3Qgb25TdG9wUmVmID0gdXNlUmVmKG9uU3RvcClcbiAgY29uc3Qgb25FcnJvclJlZiA9IHVzZVJlZihvbkVycm9yKVxuICBjb25zdCBvbkFwcHJvdmFsUmVxdWlyZWRSZWYgPSB1c2VSZWYob25BcHByb3ZhbFJlcXVpcmVkKVxuXG4gIG9uU3RyZWFtVXBkYXRlUmVmLmN1cnJlbnQgPSBvblN0cmVhbVVwZGF0ZVxuICBvbkZpbmlzaFN0cmVhbVJlZi5jdXJyZW50ID0gb25GaW5pc2hTdHJlYW1cbiAgb25TdGFydFdyaXRpbmdSZWYuY3VycmVudCA9IG9uU3RhcnRXcml0aW5nXG4gIG9uU3RvcFJlZi5jdXJyZW50ID0gb25TdG9wXG4gIG9uRXJyb3JSZWYuY3VycmVudCA9IG9uRXJyb3JcbiAgb25BcHByb3ZhbFJlcXVpcmVkUmVmLmN1cnJlbnQgPSBvbkFwcHJvdmFsUmVxdWlyZWRcblxuICBjb25zdCBhc2tNYWlhID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHBheWxvYWQ6IEFza01haWFQYXlsb2FkKTogUHJvbWlzZTxTdGFydFN0cmVhbVJlc3VsdD4gPT4ge1xuICAgICAgY29uc3QgeyBjaGF0SWQ6IHNlc3Npb25JZCwgbWVzc2FnZUlkIH0gPSBwYXlsb2FkXG4gICAgICBjb25zdCBwbGFjZWhvbGRlcklkID0gYGFuc3dlci0ke21lc3NhZ2VJZH0tc3RyZWFtaW5nYFxuICAgICAgY29uc3QgY3R4OiBTdHJlYW1Db250ZXh0ID0geyBzZXNzaW9uSWQsIG1lc3NhZ2VJZCwgcGxhY2Vob2xkZXJJZCB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgIGlucHV0OiBwYXlsb2FkLm1lc3NhZ2UsXG4gICAgICAgIGhpc3Rvcnk6IHBheWxvYWQuaGlzdG9yeSxcbiAgICAgICAgbGFuZzogcGF5bG9hZC5sYW5nLFxuICAgICAgICB1c2VySWQ6IHBheWxvYWQudXNlcklkLFxuICAgICAgICAuLi4ocGF5bG9hZC5maXJzdE5hbWUgPyB7IGZpcnN0TmFtZTogcGF5bG9hZC5maXJzdE5hbWUgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWQubGFzdE5hbWUgPyB7IGxhc3ROYW1lOiBwYXlsb2FkLmxhc3ROYW1lIH0gOiB7fSksXG4gICAgICAgIGNvbXBhbnlJZDogcGF5bG9hZC5jb21wYW55SWQsXG4gICAgICAgIGNoYXRJZDogcGF5bG9hZC5jaGF0SWQsXG4gICAgICAgIG1lc3NhZ2VJZDogcGF5bG9hZC5tZXNzYWdlSWQsXG4gICAgICAgIGNsaWVudElkOiBwYXlsb2FkLmNsaWVudElkLFxuICAgICAgICAuLi4ocGF5bG9hZC5mZWVJZCAhPSBudWxsID8geyBmZWVJZDogcGF5bG9hZC5mZWVJZCB9IDoge30pLFxuICAgICAgICBhZ2VudE5hbWU6IHBheWxvYWQuYWdlbnROYW1lLFxuICAgICAgICBhZ2VudElkOiBwYXlsb2FkLmFnZW50SWQsXG4gICAgICAgIGlzV2ViU2VhcmNoQWN0aXZlOiBwYXlsb2FkLmlzV2ViU2VhcmNoQWN0aXZlLFxuICAgICAgICBpc0RlZXBTZWFyY2hBY3RpdmU6IHBheWxvYWQuaXNEZWVwU2VhcmNoQWN0aXZlLFxuICAgICAgICAuLi4ocGF5bG9hZC5wcm9qZWN0SWQgPyB7IHByb2plY3RJZDogcGF5bG9hZC5wcm9qZWN0SWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWQuYXR0YWNobWVudHMgPyB7IGF0dGFjaG1lbnRzOiBwYXlsb2FkLmF0dGFjaG1lbnRzIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkLnByb2plY3ROYW1lID8geyBwcm9qZWN0TmFtZTogcGF5bG9hZC5wcm9qZWN0TmFtZSB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZC5jbGllbnROYW1lID8geyBjbGllbnROYW1lOiBwYXlsb2FkLmNsaWVudE5hbWUgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWQudGFza0lkICE9IG51bGwgPyB7IHRhc2tJZDogcGF5bG9hZC50YXNrSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWQudGFza05hbWUgPyB7IHRhc2tOYW1lOiBwYXlsb2FkLnRhc2tOYW1lIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkLmZhcUlkID8geyBmYXFJZDogcGF5bG9hZC5mYXFJZCB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZC5hZ2VudFN1Z2dlc3Rpb25JZCA/IHsgYWdlbnRTdWdnZXN0aW9uSWQ6IHBheWxvYWQuYWdlbnRTdWdnZXN0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWQuZnVhSWQgPyB7IGZ1YUlkOiBwYXlsb2FkLmZ1YUlkIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkLnNjSWQgPyB7IHNjSWQ6IHBheWxvYWQuc2NJZCB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZC5hZ2VudEVudGl0eSAhPSBudWxsID8geyBhZ2VudEVudGl0eTogcGF5bG9hZC5hZ2VudEVudGl0eSB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZC5hZ2VudFR5cGUgIT0gbnVsbCA/IHsgYWdlbnRUeXBlOiBwYXlsb2FkLmFnZW50VHlwZSB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZC5jb250ZXh0TWVzc2FnZSA/IHsgY29udGV4dE1lc3NhZ2U6IHBheWxvYWQuY29udGV4dE1lc3NhZ2UgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWQuY29udGV4dERhdGEgPyB7IGNvbnRleHREYXRhOiBwYXlsb2FkLmNvbnRleHREYXRhIH0gOiB7fSksXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZXNzaW9uU3RyZWFtTWFuYWdlci5zdGFydFN0cmVhbSh7XG4gICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgcGxhY2Vob2xkZXJJZCxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgdCxcbiAgICAgICAgYWN0aXZpdHlPcHRpb25zOiB7XG4gICAgICAgICAgaXNXZWJTZWFyY2hBY3RpdmU6IHBheWxvYWQuaXNXZWJTZWFyY2hBY3RpdmUsXG4gICAgICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlOiBwYXlsb2FkLmlzRGVlcFNlYXJjaEFjdGl2ZSxcbiAgICAgICAgICBoYXNBdHRhY2htZW50czogQm9vbGVhbihwYXlsb2FkLmF0dGFjaG1lbnRzPy5sZW5ndGgpLFxuICAgICAgICAgIGF0dGFjaG1lbnRzQ291bnQ6IHBheWxvYWQuYXR0YWNobWVudHM/Lmxlbmd0aCA/PyAwLFxuICAgICAgICB9LFxuICAgICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dDogaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWY/LmN1cnJlbnQgPz8gbnVsbCxcbiAgICAgICAgYWdlbnRJZDogcGF5bG9hZC5hZ2VudElkLFxuICAgICAgICBhZ2VudE5hbWU6IHBheWxvYWQuYWdlbnROYW1lLFxuICAgICAgICBjYWxsYmFja3M6IHtcbiAgICAgICAgICBvblN0cmVhbVVwZGF0ZTogY29udGVudCA9PiBvblN0cmVhbVVwZGF0ZVJlZi5jdXJyZW50Py4oY3R4LCBjb250ZW50KSxcbiAgICAgICAgICBvblN0YXJ0V3JpdGluZzogKCkgPT4gb25TdGFydFdyaXRpbmdSZWYuY3VycmVudD8uKCksXG4gICAgICAgICAgb25GaW5pc2hTdHJlYW06IGZpbmlzaFBheWxvYWQgPT5cbiAgICAgICAgICAgIG9uRmluaXNoU3RyZWFtUmVmLmN1cnJlbnQ/LihcbiAgICAgICAgICAgICAgY3R4LFxuICAgICAgICAgICAgICBmaW5pc2hQYXlsb2FkLmNvbnRlbnQsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuc291cmNlcyxcbiAgICAgICAgICAgICAgZmluaXNoUGF5bG9hZC5tZW1vcnlTZXNzaW9uSWQsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuYXR0YWNobWVudHMsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuc3VnZ2VzdGlvbnMsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuY29tcGxldGVkQWdlbnRJZCxcbiAgICAgICAgICAgICAgZmluaXNoUGF5bG9hZC5yZXNvbHZlZENvbnRleHQgYXMgYW55XG4gICAgICAgICAgICApLFxuICAgICAgICAgIG9uRXJyb3I6IChlcnJvclR5cGUsIGVycm9yTWVzc2FnZSkgPT4gb25FcnJvclJlZi5jdXJyZW50Py4oY3R4LCBlcnJvclR5cGUsIGVycm9yTWVzc2FnZSksXG4gICAgICAgICAgb25BcHByb3ZhbFJlcXVpcmVkOiAoYXBwcm92YWwsIGFjY3VtdWxhdGVkQ29udGVudCkgPT5cbiAgICAgICAgICAgIG9uQXBwcm92YWxSZXF1aXJlZFJlZi5jdXJyZW50Py4oY3R4LCBhcHByb3ZhbCwgYWNjdW11bGF0ZWRDb250ZW50KSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSxcbiAgICBbdCwgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWZdXG4gIClcblxuICBjb25zdCBzdG9wU3RyZWFtaW5nID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNlc3Npb25TdHJlYW1NYW5hZ2VyLnN0b3BTdHJlYW0oYWN0aXZlU2Vzc2lvbklkLCB7XG4gICAgICBvblN0b3A6ICgpID0+IG9uU3RvcFJlZi5jdXJyZW50Py4oKSxcbiAgICB9KVxuICB9LCBbYWN0aXZlU2Vzc2lvbklkXSlcblxuICBjb25zdCBhYm9ydFN0cmVhbVNpbGVudGx5ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNlc3Npb25TdHJlYW1NYW5hZ2VyLmFib3J0U2lsZW50bHkoYWN0aXZlU2Vzc2lvbklkKVxuICB9LCBbYWN0aXZlU2Vzc2lvbklkXSlcblxuICBjb25zdCB1cGRhdGVTdHJlYW1BY3Rpdml0eSA9IHVzZUNhbGxiYWNrKFxuICAgIChhY3Rpdml0eTogU3RyZWFtQWN0aXZpdHkgfCBudWxsKSA9PiB7XG4gICAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuc2V0QWN0aXZpdHkoYWN0aXZlU2Vzc2lvbklkLCBhY3Rpdml0eSlcbiAgICB9LFxuICAgIFthY3RpdmVTZXNzaW9uSWRdXG4gIClcblxuICBjb25zdCByZXNldCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkucGF0Y2hNZXRhKGFjdGl2ZVNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLnNldEFjdGl2aXR5KGFjdGl2ZVNlc3Npb25JZCwgbnVsbClcbiAgfSwgW2FjdGl2ZVNlc3Npb25JZF0pXG5cbiAgcmV0dXJuIHtcbiAgICBhc2tNYWlhLFxuICAgIGlzTG9hZGluZyxcbiAgICBpc1dyaXRpbmcsXG4gICAgbG9hZGluZ01lc3NhZ2UsXG4gICAgc3RyZWFtQWN0aXZpdHksXG4gICAgdXBkYXRlU3RyZWFtQWN0aXZpdHksXG4gICAgcmVzZXQsXG4gICAgc3RvcFN0cmVhbWluZyxcbiAgICBhYm9ydFN0cmVhbVNpbGVudGx5LFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQSxTQUFTQSxXQUFXLEVBQUVDLE1BQU0sUUFBUSxPQUFPO0FBQzNDLFNBQVNDLGNBQWMsUUFBUSxlQUFlO0FBTTlDLFNBQVNDLFFBQVEsUUFBUSx3QkFBd0I7QUFFakQsU0FBU0Msb0JBQW9CLFFBQVEsMkNBQTJDO0FBQ2hGLFNBQVNDLGdCQUFnQixRQUFRLHVDQUF1QztBQUN4RSxTQUFTQyxxQkFBcUIsUUFBUSxxQ0FBcUM7QUFvQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sSUFBTUMscUJBQXFCLEdBQUcsU0FBeEJBLHFCQUFxQkEsQ0FBQUMsSUFBQSxFQVNBO0VBQUEsSUFSaENDLGVBQWUsR0FBQUQsSUFBQSxDQUFmQyxlQUFlO0lBQ2ZDLGNBQWMsR0FBQUYsSUFBQSxDQUFkRSxjQUFjO0lBQ2RDLGNBQWMsR0FBQUgsSUFBQSxDQUFkRyxjQUFjO0lBQ2RDLGNBQWMsR0FBQUosSUFBQSxDQUFk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
576
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VTdGF0ZSIsInVzZUNhbGxiYWNrIiwidXNlUmVmIiwidXNlRWZmZWN0IiwidXNlVHJhbnNsYXRpb24iLCJtYWlhIiwiU0VDVElPTlMiLCJBQ1RJVklUWV9NRVNTQUdFX1JPVEFURV9NUyIsImFkdmFuY2VTdHJlYW1BY3Rpdml0eU1lc3NhZ2UiLCJjYW5BZHZhbmNlU3RyZWFtQWN0aXZpdHlNZXNzYWdlIiwiY2FuUm90YXRlU3RyZWFtQWN0aXZpdHlQaGFzZSIsImdldEluaXRpYWxTdHJlYW1BY3Rpdml0eSIsImdldFRoaW5raW5nTG9hZGluZ01lc3NhZ2UiLCJnZXRXcml0aW5nU3RyZWFtQWN0aXZpdHkiLCJyZXNvbHZlSGl0bE5vZGVTdHJlYW1BY3Rpdml0eSIsInJlc29sdmVJbml0aWFsSGl0bFN0cmVhbUFjdGl2aXR5IiwiaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkIiwibWVyZ2VTdHJlYW1DaHVuayIsInVzZU9yY2hlc3RyYXRvclN0cmVhbSIsIl9yZWYiLCJvblN0cmVhbVVwZGF0ZSIsIm9uRmluaXNoU3RyZWFtIiwib25TdGFydFdyaXRpbmciLCJvblN0b3AiLCJvbkVycm9yIiwib25BcHByb3ZhbFJlcXVpcmVkIiwiaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYiLCJfdXNlVHJhbnNsYXRpb24iLCJjaGF0QUkiLCJ0IiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5IiwiZGF0YSIsInNldERhdGEiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImlzTG9hZGluZyIsInNldExvYWRpbmciLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImlzV3JpdGluZyIsInNldElzV3JpdGluZyIsIl91c2VTdGF0ZTciLCJfdXNlU3RhdGU4IiwibG9hZGluZ01lc3NhZ2UiLCJzZXRMb2FkaW5nTWVzc2FnZSIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwic3RyZWFtQWN0aXZpdHkiLCJzZXRTdHJlYW1BY3Rpdml0eSIsImFib3J0Q29udHJvbGxlclJlZiIsImlzU3RvcHBlZFJlZiIsImFjdGl2aXR5TWVzc2FnZUluZGV4UmVmIiwic3RyZWFtQWN0aXZpdHlSZWYiLCJvblN0cmVhbVVwZGF0ZVJlZiIsIm9uRmluaXNoU3RyZWFtUmVmIiwib25TdGFydFdyaXRpbmdSZWYiLCJvblN0b3BSZWYiLCJvbkVycm9yUmVmIiwib25BcHByb3ZhbFJlcXVpcmVkUmVmIiwiY3VycmVudCIsImNsZWFyU3RyZWFtTG9hZGluZ1N0YXRlIiwiYXBwbHlTdHJlYW1BY3Rpdml0eSIsImFjdGl2aXR5IiwicHJldiIsInBoYXNlIiwibWVzc2FnZSIsInVuZGVmaW5lZCIsImludGVydmFsSWQiLCJ3aW5kb3ciLCJzZXRJbnRlcnZhbCIsImFkdmFuY2VkIiwibmV4dEluZGV4IiwiY2xlYXJJbnRlcnZhbCIsImhhbmRsZVNTRVN0cmVhbSIsIl9yZWYyIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJyZXNwb25zZSIsIl9vbkVycm9yUmVmJGN1cnJlbnQiLCJfZGF0YSRlcnJvciIsIl9kYXRhJGVycm9yMiIsInBlbmRpbmdDb250ZW50IiwidGhyb3R0bGVUaW1lciIsInN0cmVhbVNldHRsZWQiLCJlbWl0VGhyb3R0bGVkIiwiZmx1c2hQZW5kaW5nIiwiX3Jlc3BvbnNlJGJvZHkiLCJyZWFkZXIiLCJkZWNvZGVyIiwiYnVmZmVyIiwiYWNjdW11bGF0ZWRDb250ZW50IiwiaGFzU3RhcnRlZFdyaXRpbmciLCJlbnN1cmVXcml0aW5nU3RhcnRlZCIsImFwcGx5U3RyZWFtQ2h1bmsiLCJhcHBseVN0cmVhbUNvbXBsZXRlIiwiX3lpZWxkJHJlYWRlciRyZWFkIiwiZG9uZSIsInZhbHVlIiwibGluZXMiLCJfaXRlcmF0b3IiLCJfc3RlcCIsImxpbmUiLCJfbGluZSRzcGxpdCIsIl9saW5lJHNwbGl0MiIsImV2ZW50TGluZSIsImRhdGFMaW5lIiwiZXZlbnRUeXBlIiwiZGF0YVN0ciIsIl9kYXRhIiwiY2h1bmsiLCJfY2h1bmsiLCJfb25BcHByb3ZhbFJlcXVpcmVkUmUiLCJpc01hbnVhbEFwcHJvdmFsIiwiX29uRXJyb3JSZWYkY3VycmVudDIiLCJfdCIsIl90MiIsIl90MyIsIl90NCIsIndyYXAiLCJfY29udGV4dCIsIm5leHQiLCJjb250ZW50Iiwic2V0VGltZW91dCIsIl9vblN0cmVhbVVwZGF0ZVJlZiRjdSIsInRvRW1pdCIsImNhbGwiLCJjbGVhclRpbWVvdXQiLCJfb25TdHJlYW1VcGRhdGVSZWYkY3UyIiwiYm9keSIsImdldFJlYWRlciIsIkVycm9yIiwiVGV4dERlY29kZXIiLCJfb25TdGFydFdyaXRpbmdSZWYkY3UiLCJwYXlsb2FkIiwiX3BheWxvYWQkYWdlbnRfaWQiLCJfc3ViYWdlbnRSYXckcmVzb2x2ZWQiLCJfb25GaW5pc2hTdHJlYW1SZWYkY3UiLCJmaW5hbENvbnRlbnQiLCJzb3VyY2VzIiwibWVtb3J5U2Vzc2lvbklkIiwibWVtb3J5X3Nlc3Npb25faWQiLCJhdHRhY2htZW50cyIsIkFycmF5IiwiaXNBcnJheSIsInN1Z2dlc3Rpb25zIiwic3VnZ2VzdF9yZXBseSIsImFnZW50SWRSYXciLCJhZ2VudF9pZCIsImFnZW50SWQiLCJjb21wbGV0ZWRBZ2VudElkIiwiU3RyaW5nIiwidHJpbSIsInN1YmFnZW50UmF3Iiwic3ViYWdlbnQiLCJyZXNvbHZlZENvbnRleHQiLCJyZXNvbHZlZF9jb250ZXh0IiwiY2FuY2VsIiwiYWJydXB0IiwicmVhZCIsInNlbnQiLCJkZWNvZGUiLCJzdHJlYW0iLCJzcGxpdCIsInBvcCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwicyIsIm4iLCJyZXBsYWNlIiwiSlNPTiIsInBhcnNlIiwibm9kZSIsInRocmVhZF9pZCIsIm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZCIsInBlbmRpbmdfYWN0aW9ucyIsImxlbmd0aCIsImNvbnNvbGUiLCJlcnJvciIsInR5cGUiLCJ3YXJuIiwiZSIsImYiLCJmaW5pc2giLCJzdG9wIiwiX3giLCJhcHBseSIsImFyZ3VtZW50cyIsImFza01haWEiLCJfcmVmNCIsIl9jYWxsZWUyIiwiX3JlZjMiLCJoaXN0b3J5IiwicHJvamVjdElkIiwibGFuZyIsInVzZXJJZCIsImZpcnN0TmFtZSIsImxhc3ROYW1lIiwiY29tcGFueUlkIiwiY2hhdElkIiwibWVzc2FnZUlkIiwiY2xpZW50SWQiLCJjbGllbnROYW1lIiwiZmVlSWQiLCJhZ2VudE5hbWUiLCJpc1dlYlNlYXJjaEFjdGl2ZSIsImlzRGVlcFNlYXJjaEFjdGl2ZSIsInByb2plY3ROYW1lIiwidGFza0lkIiwidGFza05hbWUiLCJmYXFJZCIsImFnZW50U3VnZ2VzdGlvbklkIiwiZnVhSWQiLCJzY0lkIiwiYWdlbnRFbnRpdHkiLCJhZ2VudFR5cGUiLCJjb250ZXh0TWVzc2FnZSIsImNvbnRleHREYXRhIiwiX2F0dGFjaG1lbnRzJGxlbmd0aCIsIl9hYm9ydENvbnRyb2xsZXJSZWYkYyIsImluaXRpYWxBY3Rpdml0eSIsIl9vbkVycm9yUmVmJGN1cnJlbnQzIiwiX3Q1IiwiX2NvbnRleHQyIiwiaGFzQXR0YWNobWVudHMiLCJCb29sZWFuIiwiYXR0YWNobWVudHNDb3VudCIsIkFib3J0Q29udHJvbGxlciIsIk9yY2hlc3RyYXRvciIsIm9yY2hlc3RyYXRvciIsIl9vYmplY3RTcHJlYWQiLCJpbnB1dCIsInNpZ25hbCIsIl94MiIsInN0b3BTdHJlYW1pbmciLCJfb25TdG9wUmVmJGN1cnJlbnQiLCJhYm9ydCIsImFib3J0U3RyZWFtU2lsZW50bHkiLCJ1cGRhdGVTdHJlYW1BY3Rpdml0eSIsInJlc2V0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2hvb2tzL3VzZU9yY2hlc3RyYXRvclN0cmVhbS91c2VPcmNoZXN0cmF0b3JTdHJlYW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXNoYWRvdyAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY29uc3RhbnQtY29uZGl0aW9uICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb250aW51ZSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY2FzZS1kZWNsYXJhdGlvbnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXJlc3RyaWN0ZWQtc3ludGF4ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJ3JlYWN0LWkxOG5leHQnXG5pbXBvcnQgeyBBdHRhY2htZW50RmlsZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbW9sZWN1bGVzL0NoYXRGb290ZXIvQ2hhdEZvb3RlcidcbmltcG9ydCBtYWlhIGZyb20gJy4uLy4uL3NlcnZpY2VzL21haWEnXG5pbXBvcnQgeyBDaGF0SGlzdG9yeSB9IGZyb20gJy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQgeyBBZ2VudEVudGl0eSwgQWdlbnRUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyBDb250ZXh0TWVzc2FnZSB9IGZyb20gJy4uLy4uL3R5cGVzL2NvbnRleHRNZW50aW9uJ1xuaW1wb3J0IHsgVXNlT3JjaGVzdHJhdG9yU3RyZWFtUHJvcHMsIFJlc29sdmVkQ29udGV4dCB9IGZyb20gJy4vdXNlT3JjaGVzdHJhdG9yU3RyZWFtLmludGVyZmFjZSdcbmltcG9ydCB7IFNFQ1RJT05TIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2NvbmZpZydcbmltcG9ydCB0eXBlIHsgU3RyZWFtQWN0aXZpdHkgfSBmcm9tICcuLi8uLi90eXBlcy9zdHJlYW1BY3Rpdml0eSdcbmltcG9ydCB7XG4gIEFDVElWSVRZX01FU1NBR0VfUk9UQVRFX01TLFxuICBhZHZhbmNlU3RyZWFtQWN0aXZpdHlNZXNzYWdlLFxuICBjYW5BZHZhbmNlU3RyZWFtQWN0aXZpdHlNZXNzYWdlLFxuICBjYW5Sb3RhdGVTdHJlYW1BY3Rpdml0eVBoYXNlLFxuICBnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHksXG4gIGdldFRoaW5raW5nTG9hZGluZ01lc3NhZ2UsXG4gIGdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSxcbiAgcmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHksXG4gIHJlc29sdmVJbml0aWFsSGl0bFN0cmVhbUFjdGl2aXR5LFxufSBmcm9tICcuLi8uLi91dGlscy9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuaW1wb3J0IHsgaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkLCBtZXJnZVN0cmVhbUNodW5rIH0gZnJvbSAnLi4vLi4vdXRpbHMvc3NlU3RyZWFtQ29udGVudCdcblxudHlwZSBTdWJhZ2VudFJhdyA9IHsgbmFtZT86IHN0cmluZzsgcmVzb2x2ZWRfY29udGV4dD86IFJlc29sdmVkQ29udGV4dCB8IG51bGwgfSB8IG51bGwgfCB1bmRlZmluZWRcblxuZXhwb3J0IGNvbnN0IHVzZU9yY2hlc3RyYXRvclN0cmVhbSA9ICh7XG4gIG9uU3RyZWFtVXBkYXRlLFxuICBvbkZpbmlzaFN0cmVhbSxcbiAgb25TdGFydFdyaXRpbmcsXG4gIG9uU3RvcCxcbiAgb25FcnJvcixcbiAgb25BcHByb3ZhbFJlcXVpcmVkLFxuICBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZixcbn06IFVzZU9yY2hlc3RyYXRvclN0cmVhbVByb3BzKSA9PiB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oW1NFQ1RJT05TLmNoYXRBSV0pXG4gIGNvbnN0IFtkYXRhLCBzZXREYXRhXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtpc0xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtpc1dyaXRpbmcsIHNldElzV3JpdGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2xvYWRpbmdNZXNzYWdlLCBzZXRMb2FkaW5nTWVzc2FnZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBbc3RyZWFtQWN0aXZpdHksIHNldFN0cmVhbUFjdGl2aXR5XSA9IHVzZVN0YXRlPFN0cmVhbUFjdGl2aXR5IHwgbnVsbD4obnVsbClcbiAgY29uc3QgYWJvcnRDb250cm9sbGVyUmVmID0gdXNlUmVmPEFib3J0Q29udHJvbGxlciB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGlzU3RvcHBlZFJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgYWN0aXZpdHlNZXNzYWdlSW5kZXhSZWYgPSB1c2VSZWYoMClcbiAgY29uc3Qgc3RyZWFtQWN0aXZpdHlSZWYgPSB1c2VSZWY8U3RyZWFtQWN0aXZpdHkgfCBudWxsPihudWxsKVxuXG4gIGNvbnN0IG9uU3RyZWFtVXBkYXRlUmVmID0gdXNlUmVmKG9uU3RyZWFtVXBkYXRlKVxuICBjb25zdCBvbkZpbmlzaFN0cmVhbVJlZiA9IHVzZVJlZihvbkZpbmlzaFN0cmVhbSlcbiAgY29uc3Qgb25TdGFydFdyaXRpbmdSZWYgPSB1c2VSZWYob25TdGFydFdyaXRpbmcpXG4gIGNvbnN0IG9uU3RvcFJlZiA9IHVzZVJlZihvblN0b3ApXG4gIGNvbnN0IG9uRXJyb3JSZWYgPSB1c2VSZWYob25FcnJvcilcbiAgY29uc3Qgb25BcHByb3ZhbFJlcXVpcmVkUmVmID0gdXNlUmVmKG9uQXBwcm92YWxSZXF1aXJlZClcblxuICBvblN0cmVhbVVwZGF0ZVJlZi5jdXJyZW50ID0gb25TdHJlYW1VcGRhdGVcbiAgb25GaW5pc2hTdHJlYW1SZWYuY3VycmVudCA9IG9uRmluaXNoU3RyZWFtXG4gIG9uU3RhcnRXcml0aW5nUmVmLmN1cnJlbnQgPSBvblN0YXJ0V3JpdGluZ1xuICBvblN0b3BSZWYuY3VycmVudCA9IG9uU3RvcFxuICBvbkVycm9yUmVmLmN1cnJlbnQgPSBvbkVycm9yXG4gIG9uQXBwcm92YWxSZXF1aXJlZFJlZi5jdXJyZW50ID0gb25BcHByb3ZhbFJlcXVpcmVkXG5cbiAgY29uc3QgY2xlYXJTdHJlYW1Mb2FkaW5nU3RhdGUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgYWN0aXZpdHlNZXNzYWdlSW5kZXhSZWYuY3VycmVudCA9IDBcbiAgICBzdHJlYW1BY3Rpdml0eVJlZi5jdXJyZW50ID0gbnVsbFxuICAgIHNldFN0cmVhbUFjdGl2aXR5KG51bGwpXG4gICAgc2V0TG9hZGluZ01lc3NhZ2UobnVsbClcbiAgfSwgW10pXG5cbiAgY29uc3QgYXBwbHlTdHJlYW1BY3Rpdml0eSA9IHVzZUNhbGxiYWNrKChhY3Rpdml0eTogU3RyZWFtQWN0aXZpdHkpID0+IHtcbiAgICBjb25zdCBwcmV2ID0gc3RyZWFtQWN0aXZpdHlSZWYuY3VycmVudFxuICAgIGlmIChwcmV2Py5waGFzZSA9PT0gYWN0aXZpdHkucGhhc2UgJiYgY2FuUm90YXRlU3RyZWFtQWN0aXZpdHlQaGFzZShhY3Rpdml0eS5waGFzZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAocHJldj8ucGhhc2UgIT09IGFjdGl2aXR5LnBoYXNlKSB7XG4gICAgICBhY3Rpdml0eU1lc3NhZ2VJbmRleFJlZi5jdXJyZW50ID0gMFxuICAgIH1cbiAgICBzdHJlYW1BY3Rpdml0eVJlZi5jdXJyZW50ID0gYWN0aXZpdHlcbiAgICBzZXRTdHJlYW1BY3Rpdml0eShhY3Rpdml0eSlcbiAgICBzZXRMb2FkaW5nTWVzc2FnZShhY3Rpdml0eS5tZXNzYWdlKVxuICB9LCBbXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHN0cmVhbUFjdGl2aXR5UmVmLmN1cnJlbnQgPSBzdHJlYW1BY3Rpdml0eVxuICB9LCBbc3RyZWFtQWN0aXZpdHldKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFpc0xvYWRpbmcgfHwgaXNXcml0aW5nIHx8ICFzdHJlYW1BY3Rpdml0eSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgICBpZiAoIWNhblJvdGF0ZVN0cmVhbUFjdGl2aXR5UGhhc2Uoc3RyZWFtQWN0aXZpdHkucGhhc2UpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3QgaW50ZXJ2YWxJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCBwcmV2ID0gc3RyZWFtQWN0aXZpdHlSZWYuY3VycmVudFxuICAgICAgaWYgKCFwcmV2IHx8ICFjYW5Sb3RhdGVTdHJlYW1BY3Rpdml0eVBoYXNlKHByZXYucGhhc2UpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKCFjYW5BZHZhbmNlU3RyZWFtQWN0aXZpdHlNZXNzYWdlKHByZXYucGhhc2UsIGFjdGl2aXR5TWVzc2FnZUluZGV4UmVmLmN1cnJlbnQpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3QgYWR2YW5jZWQgPSBhZHZhbmNlU3RyZWFtQWN0aXZpdHlNZXNzYWdlKHByZXYsIGFjdGl2aXR5TWVzc2FnZUluZGV4UmVmLmN1cnJlbnQsIHQpXG4gICAgICBpZiAoIWFkdmFuY2VkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgYWN0aXZpdHlNZXNzYWdlSW5kZXhSZWYuY3VycmVudCA9IGFkdmFuY2VkLm5leHRJbmRleFxuICAgICAgc3RyZWFtQWN0aXZpdHlSZWYuY3VycmVudCA9IGFkdmFuY2VkLmFjdGl2aXR5XG4gICAgICBzZXRTdHJlYW1BY3Rpdml0eShhZHZhbmNlZC5hY3Rpdml0eSlcbiAgICAgIHNldExvYWRpbmdNZXNzYWdlKGFkdmFuY2VkLmFjdGl2aXR5Lm1lc3NhZ2UpXG4gICAgfSwgQUNUSVZJVFlfTUVTU0FHRV9ST1RBVEVfTVMpXG5cbiAgICByZXR1cm4gKCkgPT4gd2luZG93LmNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZClcbiAgfSwgW2lzTG9hZGluZywgaXNXcml0aW5nLCBzdHJlYW1BY3Rpdml0eT8ucGhhc2UsIHRdKVxuXG4gIGNvbnN0IGhhbmRsZVNTRVN0cmVhbSA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChyZXNwb25zZTogUmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIFRpbWUtdGhyb3R0bGU6IGV2aXRhIGVtaXRpciBvblN0cmVhbVVwZGF0ZSBtw6FzIGRlIHVuYSB2ZXogY2FkYSB+MTZtcy5cbiAgICAgIC8vIFVzYW1vcyB0aW1lciBwYXJhIHF1ZSBlbCBzdHJlYW0gc2lnYSBwaW50YW5kbyBhdW5xdWUgckFGIGVzdMOpIHRocm90dGxlYWRvLlxuICAgICAgLy8gTm90YTogbm8gdG9jYW1vcyBlbCBzdGF0ZSBgZGF0YWAgZW4gZWwgaG90IHBhdGggKHNvbG8gc2UgYWN0dWFsaXphIGVuXG4gICAgICAvLyBgY29tcGxldGVgL3Jlc2V0cykgcGFyYSBubyByZS1yZW5kZXJpemFyIGEgbG9zIGNvbnN1bWlkb3JlcyBkZWwgaG9va1xuICAgICAgLy8gZW4gY2FkYSBmcmFtZTsgZWwgdGV4dG8gZW4gdml2byB2aWFqYSBwb3IgZWwgc3RyZWFtaW5nU3RvcmUuXG4gICAgICBsZXQgcGVuZGluZ0NvbnRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgICBsZXQgdGhyb3R0bGVUaW1lcjogbnVtYmVyIHwgbnVsbCA9IG51bGxcbiAgICAgIGxldCBzdHJlYW1TZXR0bGVkID0gZmFsc2VcbiAgICAgIGNvbnN0IGVtaXRUaHJvdHRsZWQgPSAoY29udGVudDogc3RyaW5nKSA9PiB7XG4gICAgICAgIHBlbmRpbmdDb250ZW50ID0gY29udGVudFxuICAgICAgICBpZiAodGhyb3R0bGVUaW1lciAhPSBudWxsKSByZXR1cm5cbiAgICAgICAgdGhyb3R0bGVUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aHJvdHRsZVRpbWVyID0gbnVsbFxuICAgICAgICAgIGlmIChzdHJlYW1TZXR0bGVkKSB7XG4gICAgICAgICAgICBwZW5kaW5nQ29udGVudCA9IG51bGxcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocGVuZGluZ0NvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgdG9FbWl0ID0gcGVuZGluZ0NvbnRlbnRcbiAgICAgICAgICAgIHBlbmRpbmdDb250ZW50ID0gbnVsbFxuICAgICAgICAgICAgb25TdHJlYW1VcGRhdGVSZWYuY3VycmVudD8uKHRvRW1pdCwgbnVsbCwgJycpXG4gICAgICAgICAgfVxuICAgICAgICB9LCAxNilcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmx1c2hQZW5kaW5nID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhyb3R0bGVUaW1lciAhPSBudWxsKSB7XG4gICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aHJvdHRsZVRpbWVyKVxuICAgICAgICAgIHRocm90dGxlVGltZXIgPSBudWxsXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlbmRpbmdDb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCB0b0VtaXQgPSBwZW5kaW5nQ29udGVudFxuICAgICAgICAgIHBlbmRpbmdDb250ZW50ID0gbnVsbFxuICAgICAgICAgIG9uU3RyZWFtVXBkYXRlUmVmLmN1cnJlbnQ/Lih0b0VtaXQsIG51bGwsICcnKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHk/LmdldFJlYWRlcigpXG4gICAgICAgIGlmICghcmVhZGVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByZWFkZXIgYXZhaWxhYmxlJylcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKVxuICAgICAgICBsZXQgYnVmZmVyID0gJydcbiAgICAgICAgbGV0IGFjY3VtdWxhdGVkQ29udGVudCA9ICcnXG4gICAgICAgIGxldCBoYXNTdGFydGVkV3JpdGluZyA9IGZhbHNlXG5cbiAgICAgICAgY29uc3QgZW5zdXJlV3JpdGluZ1N0YXJ0ZWQgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKGhhc1N0YXJ0ZWRXcml0aW5nKSByZXR1cm5cbiAgICAgICAgICBoYXNTdGFydGVkV3JpdGluZyA9IHRydWVcbiAgICAgICAgICBzZXRJc1dyaXRpbmcodHJ1ZSlcbiAgICAgICAgICBhcHBseVN0cmVhbUFjdGl2aXR5KGdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSh0KSlcbiAgICAgICAgICBvblN0YXJ0V3JpdGluZ1JlZi5jdXJyZW50Py4oKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXBwbHlTdHJlYW1DaHVuayA9IChjaHVuazogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgaWYgKCFjaHVuaykgcmV0dXJuXG4gICAgICAgICAgYWNjdW11bGF0ZWRDb250ZW50ID0gbWVyZ2VTdHJlYW1DaHVuayhhY2N1bXVsYXRlZENvbnRlbnQsIGNodW5rKVxuICAgICAgICAgIGVtaXRUaHJvdHRsZWQoYWNjdW11bGF0ZWRDb250ZW50KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXBwbHlTdHJlYW1Db21wbGV0ZSA9IChwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgICAgIGlmIChzdHJlYW1TZXR0bGVkKSByZXR1cm5cbiAgICAgICAgICBzdHJlYW1TZXR0bGVkID0gdHJ1ZVxuXG4gICAgICAgICAgY29uc3QgZmluYWxDb250ZW50ID0gKHBheWxvYWQuY29udGVudCBhcyBzdHJpbmcpIHx8IGFjY3VtdWxhdGVkQ29udGVudFxuICAgICAgICAgIGNvbnN0IHNvdXJjZXMgPSBwYXlsb2FkLnNvdXJjZXMgfHwgbnVsbFxuICAgICAgICAgIGNvbnN0IG1lbW9yeVNlc3Npb25JZCA9IChwYXlsb2FkLm1lbW9yeV9zZXNzaW9uX2lkIGFzIHN0cmluZykgfHwgJydcbiAgICAgICAgICBjb25zdCBhdHRhY2htZW50cyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZC5hdHRhY2htZW50cykgPyBwYXlsb2FkLmF0dGFjaG1lbnRzIDogbnVsbFxuICAgICAgICAgIGxldCBzdWdnZXN0aW9uczogc3RyaW5nW10gfCBudWxsID0gbnVsbFxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBheWxvYWQuc3VnZ2VzdF9yZXBseSkpIHtcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zID0gcGF5bG9hZC5zdWdnZXN0X3JlcGx5IGFzIHN0cmluZ1tdXG4gICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBheWxvYWQuc3VnZ2VzdGlvbnMpKSB7XG4gICAgICAgICAgICBzdWdnZXN0aW9ucyA9IHBheWxvYWQuc3VnZ2VzdGlvbnMgYXMgc3RyaW5nW11cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYWdlbnRJZFJhdyA9IHBheWxvYWQuYWdlbnRfaWQgPz8gcGF5bG9hZC5hZ2VudElkXG4gICAgICAgICAgY29uc3QgY29tcGxldGVkQWdlbnRJZCA9XG4gICAgICAgICAgICBhZ2VudElkUmF3ICE9IG51bGwgJiYgU3RyaW5nKGFnZW50SWRSYXcpLnRyaW0oKSAhPT0gJycgPyBTdHJpbmcoYWdlbnRJZFJhdykudHJpbSgpIDogbnVsbFxuICAgICAgICAgIGNvbnN0IHN1YmFnZW50UmF3ID0gcGF5bG9hZC5zdWJhZ2VudCBhcyBTdWJhZ2VudFJhd1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ29udGV4dCA9IHN1YmFnZW50UmF3Py5yZXNvbHZlZF9jb250ZXh0ID8/IG51bGxcbiAgICAgICAgICBmbHVzaFBlbmRpbmcoKVxuICAgICAgICAgIHNldERhdGEoZmluYWxDb250ZW50KVxuICAgICAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICAgICAgc2V0SXNXcml0aW5nKGZhbHNlKVxuICAgICAgICAgIGNsZWFyU3RyZWFtTG9hZGluZ1N0YXRlKClcbiAgICAgICAgICBvbkZpbmlzaFN0cmVhbVJlZi5jdXJyZW50Py4oXG4gICAgICAgICAgICBmaW5hbENvbnRlbnQsXG4gICAgICAgICAgICBzb3VyY2VzLFxuICAgICAgICAgICAgbWVtb3J5U2Vzc2lvbklkLFxuICAgICAgICAgICAgYXR0YWNobWVudHMsXG4gICAgICAgICAgICBzdWdnZXN0aW9ucyxcbiAgICAgICAgICAgIGNvbXBsZXRlZEFnZW50SWQsXG4gICAgICAgICAgICByZXNvbHZlZENvbnRleHRcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIGlmIChpc1N0b3BwZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgcmVhZGVyLmNhbmNlbCgpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKClcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaXNTdG9wcGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHJlYWRlci5jYW5jZWwoKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBidWZmZXIgKz0gZGVjb2Rlci5kZWNvZGUodmFsdWUsIHsgc3RyZWFtOiB0cnVlIH0pXG4gICAgICAgICAgY29uc3QgbGluZXMgPSBidWZmZXIuc3BsaXQoJ1xcblxcbicpXG4gICAgICAgICAgYnVmZmVyID0gbGluZXMucG9wKCkgfHwgJydcblxuICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICAgICAgaWYgKGxpbmUudHJpbSgpID09PSAnJykgY29udGludWVcblxuICAgICAgICAgICAgY29uc3QgW2V2ZW50TGluZSwgZGF0YUxpbmVdID0gbGluZS5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgIGlmICghZXZlbnRMaW5lIHx8ICFkYXRhTGluZSkgY29udGludWVcblxuICAgICAgICAgICAgY29uc3QgZXZlbnRUeXBlID0gZXZlbnRMaW5lLnJlcGxhY2UoJ2V2ZW50OiAnLCAnJykudHJpbSgpXG4gICAgICAgICAgICBjb25zdCBkYXRhU3RyID0gZGF0YUxpbmUucmVwbGFjZSgnZGF0YTogJywgJycpLnRyaW0oKVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShkYXRhU3RyKVxuXG4gICAgICAgICAgICAgIGlmIChzdHJlYW1TZXR0bGVkICYmIGV2ZW50VHlwZSAhPT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50VHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3RoaW5raW5nJzpcbiAgICAgICAgICAgICAgICAgIGlmICghaGFzU3RhcnRlZFdyaXRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0TG9hZGluZyh0cnVlKVxuICAgICAgICAgICAgICAgICAgICBhcHBseVN0cmVhbUFjdGl2aXR5KHtcbiAgICAgICAgICAgICAgICAgICAgICBwaGFzZTogJ3RoaW5raW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBnZXRUaGlua2luZ0xvYWRpbmdNZXNzYWdlKDAsIHQpLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgICAgIGNhc2UgJ3Rva2VuJzoge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0eXBlb2YgZGF0YS5jb250ZW50ID09PSAnc3RyaW5nJyA/IGRhdGEuY29udGVudCA6ICcnXG4gICAgICAgICAgICAgICAgICBlbnN1cmVXcml0aW5nU3RhcnRlZCgpXG4gICAgICAgICAgICAgICAgICBhcHBseVN0cmVhbUNodW5rKGNodW5rKVxuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjYXNlICdjb250ZW50Jzoge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0eXBlb2YgZGF0YS5jb250ZW50ID09PSAnc3RyaW5nJyA/IGRhdGEuY29udGVudCA6ICcnXG4gICAgICAgICAgICAgICAgICBlbnN1cmVXcml0aW5nU3RhcnRlZCgpXG4gICAgICAgICAgICAgICAgICBhcHBseVN0cmVhbUNodW5rKGNodW5rKVxuICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tcGxldGVMaWtlU3NlUGF5bG9hZChkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBhcHBseVN0cmVhbUNvbXBsZXRlKGRhdGEpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNhc2UgJ25vZGUnOlxuICAgICAgICAgICAgICAgICAgLy8gRWwgb3JjaGVzdHJhdG9yIGRlbGVnw7MgYSB1biBzdWJhZ2VudGU6IE5PIGxvIGV4cG9uZW1vcy4gTWFudGVuZW1vc1xuICAgICAgICAgICAgICAgICAgLy8gZWwgaW5kaWNhZG9yIGRlIGFjdGl2aWRhZCBnZW7DqXJpY28gZGUgTUFJQSwgc2luIGFudW5jaWFyIGxhXG4gICAgICAgICAgICAgICAgICAvLyB0cmFuc2ZlcmVuY2lhIG5pIGVsIG5vbWJyZSBkZWwgc3ViYWdlbnRlLlxuICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubm9kZSA9PT0gJ2FnZW50X3RyYW5zZmVyJykge1xuICAgICAgICAgICAgICAgICAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEubWVzc2FnZSAmJiB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtQWN0aXZpdHkoXG4gICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHkoXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWY/LmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZGF0YS50aHJlYWRfaWQgPT09ICdzdHJpbmcnID8gZGF0YS50aHJlYWRfaWQgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgICAgICBjYXNlICdjb21wbGV0ZSc6XG4gICAgICAgICAgICAgICAgICBhcHBseVN0cmVhbUNvbXBsZXRlKGRhdGEpXG4gICAgICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnYXBwcm92YWxfcmVxdWlyZWQnOiB7XG4gICAgICAgICAgICAgICAgICAvLyBNYW51YWwgYXBwcm92YWw6IGVsIFNTRSBzaWd1ZSBjb24gbm9kZS90b2tlbi9jb21wbGV0ZSAoeSBwdWVkZVxuICAgICAgICAgICAgICAgICAgLy8gZW5jYWRlbmFyIG3DoXMgYXBwcm92YWxfcmVxdWlyZWQpLiBTb2xvIGVsIGFwcHJvdmFsIFwicGF1c2Fkb1wiXG4gICAgICAgICAgICAgICAgICAvLyAoYm90w7NuKSBlcyB0ZXJtaW5hbCBwYXJhIGVzdGUgc3RyZWFtLlxuICAgICAgICAgICAgICAgICAgZmx1c2hQZW5kaW5nKClcbiAgICAgICAgICAgICAgICAgIHNldElzV3JpdGluZyhmYWxzZSlcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzTWFudWFsQXBwcm92YWwgPSBkYXRhLm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZCA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgaWYgKCFpc01hbnVhbEFwcHJvdmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbVNldHRsZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIGNsZWFyU3RyZWFtTG9hZGluZ1N0YXRlKClcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIG9uQXBwcm92YWxSZXF1aXJlZFJlZi5jdXJyZW50Py4oZGF0YSwgYWNjdW11bGF0ZWRDb250ZW50KVxuICAgICAgICAgICAgICAgICAgaWYgKGlzTWFudWFsQXBwcm92YWwgJiYgQXJyYXkuaXNBcnJheShkYXRhLnBlbmRpbmdfYWN0aW9ucykgJiYgZGF0YS5wZW5kaW5nX2FjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtQWN0aXZpdHkocmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHkodCwgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWY/LmN1cnJlbnQpKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICAgICAgICBzdHJlYW1TZXR0bGVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignU1NFIEVycm9yOicsIGRhdGEuZXJyb3IpXG4gICAgICAgICAgICAgICAgICBmbHVzaFBlbmRpbmcoKVxuICAgICAgICAgICAgICAgICAgc2V0SXNXcml0aW5nKGZhbHNlKVxuICAgICAgICAgICAgICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICAgICAgICAgICAgICAgIGNsZWFyU3RyZWFtTG9hZGluZ1N0YXRlKClcbiAgICAgICAgICAgICAgICAgIHNldExvYWRpbmdNZXNzYWdlKG51bGwpIC8vIExpbXBpYXIgbWVuc2FqZSBjdWFuZG8gaGF5IGVycm9yXG4gICAgICAgICAgICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQ/LihkYXRhLmVycm9yPy50eXBlLCBkYXRhLmVycm9yPy5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1Vua25vd24gU1NFIGV2ZW50IHR5cGU6JywgZXZlbnRUeXBlKVxuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIFNTRSBkYXRhOicsIHBhcnNlRXJyb3IsIGRhdGFTdHIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBmbHVzaFBlbmRpbmcoKVxuICAgICAgICBzZXRJc1dyaXRpbmcoZmFsc2UpXG5cbiAgICAgICAgLy8gU29sbyBlamVjdXRhciBvbkVycm9yIHNpIG5vIGZ1ZSB1biBzdG9wIGludGVuY2lvbmFsXG4gICAgICAgIGlmICghaXNTdG9wcGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQ/LigpXG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGZsdXNoUGVuZGluZygpXG4gICAgICAgIGlmICghc3RyZWFtU2V0dGxlZCkge1xuICAgICAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICAgICAgc2V0SXNXcml0aW5nKGZhbHNlKVxuICAgICAgICAgIGNsZWFyU3RyZWFtTG9hZGluZ1N0YXRlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW2FwcGx5U3RyZWFtQWN0aXZpdHksIGNsZWFyU3RyZWFtTG9hZGluZ1N0YXRlLCBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZiwgdF1cbiAgKVxuXG4gIGNvbnN0IGFza01haWEgPSBhc3luYyAoe1xuICAgIG1lc3NhZ2UsXG4gICAgaGlzdG9yeSxcbiAgICBwcm9qZWN0SWQsXG4gICAgbGFuZyxcbiAgICB1c2VySWQsXG4gICAgZmlyc3ROYW1lLFxuICAgIGxhc3ROYW1lLFxuICAgIGNvbXBhbnlJZCxcbiAgICBjaGF0SWQsXG4gICAgbWVzc2FnZUlkLFxuICAgIGNsaWVudElkLFxuICAgIGNsaWVudE5hbWUsXG4gICAgZmVlSWQsXG4gICAgYWdlbnROYW1lLFxuICAgIGFnZW50SWQsXG4gICAgaXNXZWJTZWFyY2hBY3RpdmUsXG4gICAgaXNEZWVwU2VhcmNoQWN0aXZlLFxuICAgIGF0dGFjaG1lbnRzLFxuICAgIHByb2plY3ROYW1lLFxuICAgIHRhc2tJZCxcbiAgICB0YXNrTmFtZSxcbiAgICBmYXFJZCxcbiAgICBhZ2VudFN1Z2dlc3Rpb25JZCxcbiAgICBmdWFJZCxcbiAgICBzY0lkLFxuICAgIGFnZW50RW50aXR5LFxuICAgIGFnZW50VHlwZSxcbiAgICBjb250ZXh0TWVzc2FnZSxcbiAgICBjb250ZXh0RGF0YSxcbiAgfToge1xuICAgIG1lc3NhZ2U6IHN0cmluZ1xuICAgIGhpc3Rvcnk6IENoYXRIaXN0b3J5W11cbiAgICBwcm9qZWN0SWQ6IG51bWJlciB8IG51bGxcbiAgICBsYW5nOiBzdHJpbmdcbiAgICB1c2VySWQ6IHN0cmluZ1xuICAgIGZpcnN0TmFtZT86IHN0cmluZ1xuICAgIGxhc3ROYW1lPzogc3RyaW5nXG4gICAgY29tcGFueUlkOiBzdHJpbmdcbiAgICBjaGF0SWQ6IHN0cmluZ1xuICAgIG1lc3NhZ2VJZDogc3RyaW5nXG4gICAgY2xpZW50SWQ/OiBudW1iZXJcbiAgICBjbGllbnROYW1lPzogc3RyaW5nXG4gICAgZmVlSWQ/OiBudW1iZXJcbiAgICBhZ2VudE5hbWU6IHN0cmluZ1xuICAgIGFnZW50SWQ6IHN0cmluZ1xuICAgIGlzV2ViU2VhcmNoQWN0aXZlPzogYm9vbGVhblxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZT86IGJvb2xlYW5cbiAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW11cbiAgICBwcm9qZWN0TmFtZT86IHN0cmluZ1xuICAgIHRhc2tJZD86IG51bWJlclxuICAgIHRhc2tOYW1lPzogc3RyaW5nXG4gICAgZmFxSWQ/OiBzdHJpbmdcbiAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZ1xuICAgIGZ1YUlkPzogc3RyaW5nXG4gICAgc2NJZD86IHN0cmluZ1xuICAgIGFnZW50RW50aXR5PzogQWdlbnRFbnRpdHlcbiAgICBhZ2VudFR5cGU/OiBBZ2VudFR5cGVcbiAgICBjb250ZXh0TWVzc2FnZT86IENvbnRleHRNZXNzYWdlXG4gICAgY29udGV4dERhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICB9KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHNldExvYWRpbmcodHJ1ZSlcbiAgICAgIHNldElzV3JpdGluZyhmYWxzZSlcbiAgICAgIHNldERhdGEobnVsbClcbiAgICAgIGFjdGl2aXR5TWVzc2FnZUluZGV4UmVmLmN1cnJlbnQgPSAwXG4gICAgICBjb25zdCBpbml0aWFsQWN0aXZpdHkgPSBnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHkodCwge1xuICAgICAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlLFxuICAgICAgICBoYXNBdHRhY2htZW50czogQm9vbGVhbihhdHRhY2htZW50cz8ubGVuZ3RoKSxcbiAgICAgICAgYXR0YWNobWVudHNDb3VudDogYXR0YWNobWVudHM/Lmxlbmd0aCA/PyAwLFxuICAgICAgfSlcbiAgICAgIGFwcGx5U3RyZWFtQWN0aXZpdHkoaW5pdGlhbEFjdGl2aXR5KVxuICAgICAgaXNTdG9wcGVkUmVmLmN1cnJlbnQgPSBmYWxzZSAvLyBSZXNldGVhciBmbGFnIGFsIGluaWNpYXIgbnVldmEgcGV0aWNpw7NuXG5cbiAgICAgIGFib3J0Q29udHJvbGxlclJlZi5jdXJyZW50ID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWFpYS5PcmNoZXN0cmF0b3Iub3JjaGVzdHJhdG9yKFxuICAgICAgICB7XG4gICAgICAgICAgaW5wdXQ6IG1lc3NhZ2UsXG4gICAgICAgICAgaGlzdG9yeSxcbiAgICAgICAgICBsYW5nLFxuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICAuLi4oZmlyc3ROYW1lID8geyBmaXJzdE5hbWUgfSA6IHt9KSxcbiAgICAgICAgICAuLi4obGFzdE5hbWUgPyB7IGxhc3ROYW1lIH0gOiB7fSksXG4gICAgICAgICAgY29tcGFueUlkLFxuICAgICAgICAgIGNoYXRJZCxcbiAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgY2xpZW50SWQsXG4gICAgICAgICAgLi4uKGZlZUlkICE9IG51bGwgPyB7IGZlZUlkIH0gOiB7fSksXG4gICAgICAgICAgYWdlbnROYW1lLFxuICAgICAgICAgIGFnZW50SWQsXG4gICAgICAgICAgaXNXZWJTZWFyY2hBY3RpdmUsXG4gICAgICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlLFxuICAgICAgICAgIC4uLihwcm9qZWN0SWQgPyB7IHByb2plY3RJZCB9IDoge30pLFxuICAgICAgICAgIC4uLihhdHRhY2htZW50cyA/IHsgYXR0YWNobWVudHMgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ocHJvamVjdE5hbWUgPyB7IHByb2plY3ROYW1lIH0gOiB7fSksXG4gICAgICAgICAgLi4uKGNsaWVudE5hbWUgPyB7IGNsaWVudE5hbWUgfSA6IHt9KSxcbiAgICAgICAgICAuLi4odGFza0lkICE9IG51bGwgPyB7IHRhc2tJZCB9IDoge30pLFxuICAgICAgICAgIC4uLih0YXNrTmFtZSA/IHsgdGFza05hbWUgfSA6IHt9KSxcbiAgICAgICAgICAuLi4oZmFxSWQgPyB7IGZhcUlkIH0gOiB7fSksXG4gICAgICAgICAgLi4uKGFnZW50U3VnZ2VzdGlvbklkID8geyBhZ2VudFN1Z2dlc3Rpb25JZCB9IDoge30pLFxuICAgICAgICAgIC4uLihmdWFJZCA/IHsgZnVhSWQgfSA6IHt9KSxcbiAgICAgICAgICAuLi4oc2NJZCA/IHsgc2NJZCB9IDoge30pLFxuICAgICAgICAgIC4uLihhZ2VudEVudGl0eSAhPSBudWxsID8geyBhZ2VudEVudGl0eSB9IDoge30pLFxuICAgICAgICAgIC4uLihhZ2VudFR5cGUgIT0gbnVsbCA/IHsgYWdlbnRUeXBlIH0gOiB7fSksXG4gICAgICAgICAgLi4uKGNvbnRleHRNZXNzYWdlID8geyBjb250ZXh0TWVzc2FnZSB9IDoge30pLFxuICAgICAgICAgIC4uLihjb250ZXh0RGF0YSA/IHsgY29udGV4dERhdGEgfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgYWJvcnRDb250cm9sbGVyUmVmLmN1cnJlbnQ/LnNpZ25hbFxuICAgICAgKVxuXG4gICAgICBhd2FpdCBoYW5kbGVTU0VTdHJlYW0ocmVzcG9uc2UpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFNpIGZ1ZSB1biBhYm9ydCBpbnRlbmNpb25hbCAoc3RvcCBtYW51YWwgbyBjYW1iaW8gZGUgY2hhdCksIG5vIGRpc3BhcmFyIG9uRXJyb3JcbiAgICAgIC8vIHBvcnF1ZSBlc28gaW5zZXJ0YSB1biBcIm1lbnNhamUgZGUgZXJyb3JcIiBlbiBlbCBjaGF0IGFsIHF1ZSBhY2FiYW1vcyBkZSBuYXZlZ2FyLlxuICAgICAgaWYgKCFpc1N0b3BwZWRSZWYuY3VycmVudCkge1xuICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQ/LigpXG4gICAgICB9XG4gICAgICBjbGVhclN0cmVhbUxvYWRpbmdTdGF0ZSgpXG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgc2V0SXNXcml0aW5nKGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN0b3BTdHJlYW1pbmcgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKGFib3J0Q29udHJvbGxlclJlZi5jdXJyZW50KSB7XG4gICAgICBpc1N0b3BwZWRSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIGFib3J0Q29udHJvbGxlclJlZi5jdXJyZW50LmFib3J0KClcbiAgICAgIGFib3J0Q29udHJvbGxlclJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICAgIHNldElzV3JpdGluZyhmYWxzZSlcbiAgICAgIGNsZWFyU3RyZWFtTG9hZGluZ1N0YXRlKClcbiAgICAgIG9uU3RvcFJlZi5jdXJyZW50Py4oKVxuICAgIH1cbiAgfSwgW2NsZWFyU3RyZWFtTG9hZGluZ1N0YXRlXSlcblxuICAvKipcbiAgICogQWJvcnRhIGVsIHN0cmVhbSBlbiBjdXJzbyAoc2kgZXhpc3RlKSBzaW4gZGlzcGFyYXIgYG9uU3RvcGAuXG4gICAqIMOac2VsbyBlbiBjYXNvcyBkb25kZSBubyBxdWVyZW1vcyBhZ3JlZ2FyIGVsIG1lbnNhamUgZGUgXCJjYW5jZWxhZG9cIlxuICAgKiAocG9yIGVqZW1wbG8sIGFsIGNhbWJpYXIgZGUgY2hhdCkuXG4gICAqL1xuICBjb25zdCBhYm9ydFN0cmVhbVNpbGVudGx5ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChhYm9ydENvbnRyb2xsZXJSZWYuY3VycmVudCkge1xuICAgICAgaXNTdG9wcGVkUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICBhYm9ydENvbnRyb2xsZXJSZWYuY3VycmVudC5hYm9ydCgpXG4gICAgICBhYm9ydENvbnRyb2xsZXJSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICBzZXRJc1dyaXRpbmcoZmFsc2UpXG4gICAgICBjbGVhclN0cmVhbUxvYWRpbmdTdGF0ZSgpXG4gICAgfVxuICB9LCBbY2xlYXJTdHJlYW1Mb2FkaW5nU3RhdGVdKVxuXG4gIC8vIENsZWFudXAgYWwgZGVzbW9udGFyOiBzaSBxdWVkYSB1biBzdHJlYW0gYWN0aXZvLCBhYm9ydGFybG8gcGFyYSBldml0YXJcbiAgLy8gcXVlIGludGVudGUgYWN0dWFsaXphciBlc3RhZG8gZW4gdW4gY29tcG9uZW50ZSB5YSBkZXNtb250YWRvIChmdWdhcyBkZVxuICAvLyBtZW1vcmlhIHkgd2FybmluZ3MpLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoYWJvcnRDb250cm9sbGVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyUmVmLmN1cnJlbnQuYWJvcnQoKVxuICAgICAgICBhYm9ydENvbnRyb2xsZXJSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtdKVxuXG4gIGNvbnN0IHVwZGF0ZVN0cmVhbUFjdGl2aXR5ID0gdXNlQ2FsbGJhY2soXG4gICAgKGFjdGl2aXR5OiBTdHJlYW1BY3Rpdml0eSB8IG51bGwpID0+IHtcbiAgICAgIGlmICghYWN0aXZpdHkpIHtcbiAgICAgICAgY2xlYXJTdHJlYW1Mb2FkaW5nU3RhdGUoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGFwcGx5U3RyZWFtQWN0aXZpdHkoYWN0aXZpdHkpXG4gICAgfSxcbiAgICBbYXBwbHlTdHJlYW1BY3Rpdml0eSwgY2xlYXJTdHJlYW1Mb2FkaW5nU3RhdGVdXG4gIClcblxuICBjb25zdCByZXNldCA9ICgpID0+IHtcbiAgICBzZXREYXRhKG51bGwpXG4gICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICBzZXRJc1dyaXRpbmcoZmFsc2UpXG4gICAgY2xlYXJTdHJlYW1Mb2FkaW5nU3RhdGUoKVxuICAgIGlzU3RvcHBlZFJlZi5jdXJyZW50ID0gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYXNrTWFpYSxcbiAgICByZXNwb25zZTogZGF0YSxcbiAgICBpc0xvYWRpbmcsXG4gICAgaXNXcml0aW5nLFxuICAgIGxvYWRpbmdNZXNzYWdlLFxuICAgIHN0cmVhbUFjdGl2aXR5LFxuICAgIHVwZGF0ZVN0cmVhbUFjdGl2aXR5LFxuICAgIHJlc2V0LFxuICAgIHN0b3BTdHJlYW1pbmcsXG4gICAgYWJvcnRTdHJlYW1TaWxlbnRseSxcbiAgICBoYW5kbGVTU0VTdHJlYW0sIC8vIEV4cG9uZXIgcGFyYSBwb2RlciB1c2FybG8gZW4gY29udGludWUtdGhyZWFkXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLFFBQVEsRUFBRUMsV0FBVyxFQUFFQyxNQUFNLEVBQUVDLFNBQVMsUUFBUSxPQUFPO0FBQ2hFLFNBQVNDLGNBQWMsUUFBUSxlQUFlO0FBRTlDLE9BQU9DLElBQUksTUFBTSxxQkFBcUI7QUFLdEMsU0FBU0MsUUFBUSxRQUFRLHdCQUF3QjtBQUVqRCxTQUNFQywwQkFBMEIsRUFDMUJDLDRCQUE0QixFQUM1QkMsK0JBQStCLEVBQy9CQyw0QkFBNEIsRUFDNUJDLHdCQUF3QixFQUN4QkMseUJBQXlCLEVBQ3pCQyx3QkFBd0IsRUFDeEJDLDZCQUE2QixFQUM3QkMsZ0NBQWdDLFFBQzNCLG9DQUFvQztBQUMzQyxTQUFTQyx3QkFBd0IsRUFBRUMsZ0JBQWdCLFFBQVEsOEJBQThCO0FBSXpGLE9BQU8sSUFBTUMscUJBQXFCLEdBQUcsU0FBeEJBLHFCQUFxQkEsQ0FBQUMsSUFBQSxFQVFBO0VBQUEsSUFQaENDLGNBQWMsR0FBQUQsSUFBQSxDQUFkQyxjQUFjO0lBQ2RDLGNBQWMsR0FBQUYsSUFBQSxDQUFkRSxjQUFjO0lBQ2RDLGNBQWMsR0FBQUgsSUFBQSxDQUFkRyxjQUFjO0lBQ2RDLE1BQU0sR0FBQUosSUFBQSxDQUFOSSxNQUFNO0lBQ05DLE9BQU8sR0FBQUwsSUFBQSxDQUFQSyxPQUFPO0lBQ1BDLGtCQUFrQixHQUFBTixJQUFBLENBQWxCTSxrQkFBa0I7SUFDbEJDLHVCQUF1QixHQUFBUCxJQUFBLENBQXZCTyx1QkFBdUI7RUFFdkIsSUFBQUMsZUFBQSxHQUFjdkIsY0FB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