@projectcor/maia-components 2.49.0-beta.1 → 2.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.js +37 -0
- package/lib/components/atoms/ApprovalBox/ApprovalBox.js +3 -37
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +117 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +31 -101
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +91 -0
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +49 -140
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +257 -0
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +53 -205
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.js +4 -0
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +2 -4
- package/lib/components/atoms/ClientSelector/ClientSelector.helpers.js +26 -0
- package/lib/components/atoms/ClientSelector/ClientSelector.js +12 -21
- package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.js +227 -0
- package/lib/components/atoms/ContextMentionChip/buildChipElement.js +15 -255
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +59 -0
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +12 -57
- package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +74 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +184 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.js +127 -176
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +96 -0
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +40 -113
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.js +17 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +3 -15
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +3 -4
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +3 -11
- package/lib/components/atoms/ReasoningBlock/reasoningLeading.js +6 -1
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +2 -3
- package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.js +10 -0
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.js +101 -0
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +21 -77
- package/lib/components/atoms/TextArea/TextArea.helpers.js +23 -0
- package/lib/components/atoms/TextArea/TextArea.js +11 -20
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.js +37 -0
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +6 -29
- package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +68 -0
- package/lib/components/molecules/AbmSection/AbmGeneralSection.js +17 -56
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +133 -0
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +31 -112
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.js +17 -0
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +5 -15
- package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.js +370 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHome.js +197 -233
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +398 -0
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +209 -235
- package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +515 -4
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +228 -344
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.js +5 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +3 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +49 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +36 -33
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.js +39 -0
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +30 -33
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.js +41 -0
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +9 -35
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.js +48 -0
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +9 -44
- package/lib/components/molecules/Sidebar/Sidebar.helpers.js +43 -0
- package/lib/components/molecules/Sidebar/Sidebar.js +25 -22
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +512 -0
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +309 -643
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.js +37 -0
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +13 -25
- package/lib/constants/formatExtensions.js +7 -8
- package/lib/dev/DevReasoningTimeline.js +8 -50
- package/lib/hooks/useAgentModel/useCreateAgent.helpers.js +144 -0
- package/lib/hooks/useAgentModel/useCreateAgent.js +38 -102
- package/lib/hooks/useChatManager/useChatManager.helpers.js +902 -0
- package/lib/hooks/useChatManager/useChatManager.js +267 -741
- package/lib/hooks/useChatMessages/useChatMessages.helpers.js +365 -0
- package/lib/hooks/useChatMessages/useChatMessages.js +59 -285
- package/lib/hooks/useClientSearch.helpers.js +36 -0
- package/lib/hooks/useClientSearch.js +4 -32
- package/lib/hooks/useContextMentions.helpers.js +212 -0
- package/lib/hooks/useContextMentions.js +5 -223
- package/lib/hooks/useContextMentions.types.js +2 -0
- package/lib/hooks/useContextPinPopover.helpers.js +95 -0
- package/lib/hooks/useContextPinPopover.js +16 -75
- package/lib/hooks/useEntitySearch.helpers.js +407 -0
- package/lib/hooks/useEntitySearch.js +52 -436
- package/lib/hooks/useMentionPopover.helpers.js +41 -0
- package/lib/hooks/useMentionPopover.js +9 -35
- package/lib/hooks/useMinimizedPillBottomOffset.helpers.js +47 -0
- package/lib/hooks/useMinimizedPillBottomOffset.js +15 -45
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.js +86 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +8 -82
- package/lib/hooks/useProjectSearch.helpers.js +61 -0
- package/lib/hooks/useProjectSearch.js +4 -58
- package/lib/hooks/useProjectSummaryConfig.helpers.js +62 -0
- package/lib/hooks/useProjectSummaryConfig.js +14 -52
- package/lib/hooks/useReasoningTrace/reasoningStore.js +8 -39
- package/lib/hooks/useRecentClientsSearch.helpers.js +33 -0
- package/lib/hooks/useRecentClientsSearch.js +4 -32
- package/lib/lang/br/index.js +1 -7
- package/lib/lang/en/index.js +1 -7
- package/lib/lang/es/index.js +1 -7
- package/lib/lang/fr/index.js +1 -7
- package/lib/services/maia/Agents/getAgents.helpers.js +241 -0
- package/lib/services/maia/Agents/getAgents.js +90 -282
- package/lib/services/maia/Orchestrator/orchestrator.helpers.js +130 -0
- package/lib/services/maia/Orchestrator/orchestrator.js +38 -121
- package/lib/services/utils/mapChatMessages.helpers.js +223 -0
- package/lib/services/utils/mapChatMessages.js +25 -254
- package/lib/store/sessions/sessionNotifications.helpers.js +45 -0
- package/lib/store/sessions/sessionNotifications.js +35 -41
- package/lib/store/sessions/sessionStreamManager.helpers.js +134 -0
- package/lib/store/sessions/sessionStreamManager.js +172 -236
- package/lib/test/mockSseStream.js +121 -0
- package/lib/test/streamdownCodeMock.js +6 -0
- package/lib/test/streamdownMock.js +12 -0
- package/lib/types/Chat.js +1 -1
- package/lib/types/agentModal.js +1 -1
- package/lib/types/reasoning.js +1 -1
- package/lib/utils/imagePreprocessor.helpers.js +28 -0
- package/lib/utils/imagePreprocessor.js +12 -37
- package/lib/utils/renderContextMentions.helpers.js +110 -0
- package/lib/utils/renderContextMentions.js +4 -110
- package/lib/utils/streamActivityMessages.helpers.js +222 -0
- package/lib/utils/streamActivityMessages.js +4 -221
- package/package.json +2 -2
- package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.js +0 -53
- package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.styles.js +0 -8
- package/lib/components/atoms/ContextCompactedNotice/index.js +0 -2
- package/lib/types/contextCompaction.js +0 -48
- package/lib/types/jest-dom.d.js +0 -2
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
2
|
+
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
|
|
3
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
4
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
5
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
6
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
7
|
+
import { buildContextMessage } from '../../types/contextMention';
|
|
8
|
+
import { TASK_URL_REGEX_PATTERN } from '../../constants/taskUrls';
|
|
9
|
+
import { formatQuickActionMessageForDisplay } from '../../utils/formatQuickActionMessage';
|
|
10
|
+
import { getChatsStoreState } from '../../store/useChatsStore';
|
|
11
|
+
import { isActiveSessionStatus } from '../../store/sessions/sessions.types';
|
|
12
|
+
/** El modal usa `{ message: '', attachments: [] }` como "sin mensaje inicial"; no es falsy. */
|
|
13
|
+
export var hasMeaningfulUserInitialMessage = function hasMeaningfulUserInitialMessage(userInitialMessage) {
|
|
14
|
+
var _userInitialMessage$m, _userInitialMessage$a;
|
|
15
|
+
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));
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/** Marca la sesión como leída cuando terminó de hidratarse y sigue siendo la activa y visible. */
|
|
19
|
+
export var markOpenedSessionAsReadIfVisible = function markOpenedSessionAsReadIfVisible(sessionId) {
|
|
20
|
+
var _getChatsStoreState = getChatsStoreState(),
|
|
21
|
+
isChatViewVisible = _getChatsStoreState.isChatViewVisible,
|
|
22
|
+
activeChatId = _getChatsStoreState.activeChatId,
|
|
23
|
+
markChatAsRead = _getChatsStoreState.markChatAsRead;
|
|
24
|
+
if (!isChatViewVisible || activeChatId !== sessionId) return;
|
|
25
|
+
markChatAsRead(sessionId);
|
|
26
|
+
};
|
|
27
|
+
export 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
|
+
export var rewriteTaskUrlsInContent = function rewriteTaskUrlsInContent(content, tabSegment) {
|
|
43
|
+
var taskUrlRegex = new RegExp(TASK_URL_REGEX_PATTERN, 'g');
|
|
44
|
+
return content.replace(taskUrlRegex, function (url) {
|
|
45
|
+
return url.replace(/\/(detail|message|messages|files|history|hours)(?=$|\?)/, tabSegment);
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
export var conversationProjectToGlobalProject = function conversationProjectToGlobalProject(project) {
|
|
49
|
+
var _project$client;
|
|
50
|
+
if (!project) return null;
|
|
51
|
+
var id = typeof project.id === 'number' ? project.id : Number(project.id);
|
|
52
|
+
if (!Number.isFinite(id)) return null;
|
|
53
|
+
return _objectSpread({
|
|
54
|
+
id: id,
|
|
55
|
+
name: project.name
|
|
56
|
+
}, ((_project$client = project.client) === null || _project$client === void 0 ? void 0 : _project$client.id) != null && project.client.name ? {
|
|
57
|
+
client: {
|
|
58
|
+
id: project.client.id,
|
|
59
|
+
name: project.client.name
|
|
60
|
+
}
|
|
61
|
+
} : {});
|
|
62
|
+
};
|
|
63
|
+
export var resolveTaskFromConversationMetadata = function resolveTaskFromConversationMetadata(taskId, taskName) {
|
|
64
|
+
return taskId != null && taskName ? {
|
|
65
|
+
id: taskId,
|
|
66
|
+
name: taskName
|
|
67
|
+
} : null;
|
|
68
|
+
};
|
|
69
|
+
export var hasClientConversationMetadata = function hasClientConversationMetadata(clientId, clientName) {
|
|
70
|
+
return clientId != null && Boolean(clientName);
|
|
71
|
+
};
|
|
72
|
+
export var shouldApplyMultiAgentProjectContext = function shouldApplyMultiAgentProjectContext(projectIdMessage, hasMultiAgentsAccess) {
|
|
73
|
+
return Boolean(projectIdMessage && hasMultiAgentsAccess);
|
|
74
|
+
};
|
|
75
|
+
export var resolveProjectChipFromSession = function resolveProjectChipFromSession(projectIdMessage, projectNameFromSession) {
|
|
76
|
+
var clientName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
|
|
77
|
+
return {
|
|
78
|
+
projectName: projectNameFromSession,
|
|
79
|
+
clientName: clientName,
|
|
80
|
+
projectId: String(projectIdMessage)
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
export var resolveProjectContextFromFetch = function resolveProjectContextFromFetch(projectIdMessage, projects, projectNameFromSession) {
|
|
84
|
+
var projectIdNum = Number(projectIdMessage);
|
|
85
|
+
var foundProject = projects.find(function (project) {
|
|
86
|
+
return Number(project.id) === projectIdNum;
|
|
87
|
+
});
|
|
88
|
+
if (foundProject) {
|
|
89
|
+
var _foundProject$client;
|
|
90
|
+
return {
|
|
91
|
+
chipsProject: {
|
|
92
|
+
projectName: foundProject.name,
|
|
93
|
+
clientName: ((_foundProject$client = foundProject.client) === null || _foundProject$client === void 0 ? void 0 : _foundProject$client.name) || '',
|
|
94
|
+
projectId: String(foundProject.id)
|
|
95
|
+
},
|
|
96
|
+
project: foundProject
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (projectNameFromSession) {
|
|
100
|
+
return {
|
|
101
|
+
chipsProject: resolveProjectChipFromSession(projectIdMessage, projectNameFromSession),
|
|
102
|
+
project: {
|
|
103
|
+
id: projectIdNum,
|
|
104
|
+
name: projectNameFromSession
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
chipsProject: null,
|
|
110
|
+
project: null
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
export var resolveTaskUrlTabSegment = function resolveTaskUrlTabSegment(tab) {
|
|
114
|
+
return tab ? "/".concat(tab) : '/detail';
|
|
115
|
+
};
|
|
116
|
+
export var rewriteChatMessagesTaskUrls = function rewriteChatMessagesTaskUrls(items, tabSegment) {
|
|
117
|
+
return items.map(function (item) {
|
|
118
|
+
return _objectSpread(_objectSpread({}, item), {}, {
|
|
119
|
+
message: rewriteTaskUrlsInContent(item.message || '', tabSegment)
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
};
|
|
123
|
+
export var mergeChatMessagesWithActiveSessionTail = function mergeChatMessagesWithActiveSessionTail(historical, tail) {
|
|
124
|
+
var existingIds = new Set(historical.map(function (item) {
|
|
125
|
+
return item.id;
|
|
126
|
+
}));
|
|
127
|
+
var extra = tail.filter(function (item) {
|
|
128
|
+
return !existingIds.has(item.id);
|
|
129
|
+
});
|
|
130
|
+
return extra.length ? [].concat(_toConsumableArray(historical), _toConsumableArray(extra)) : historical;
|
|
131
|
+
};
|
|
132
|
+
export var shouldAbortStaleMessageLoad = function shouldAbortStaleMessageLoad(seq, currentSeq, targetChatId, activeChatId) {
|
|
133
|
+
return seq !== currentSeq || targetChatId !== activeChatId;
|
|
134
|
+
};
|
|
135
|
+
export var buildDeletedSessionAgent = function buildDeletedSessionAgent(agentDeleted, agentNoPermission) {
|
|
136
|
+
return _objectSpread(_objectSpread({
|
|
137
|
+
id: agentDeleted.id,
|
|
138
|
+
name: agentDeleted.name,
|
|
139
|
+
emoji: agentDeleted.emoji,
|
|
140
|
+
type: 'custom',
|
|
141
|
+
is_deleted: true
|
|
142
|
+
}, agentDeleted.deletedAt ? {
|
|
143
|
+
deleted_at: agentDeleted.deletedAt
|
|
144
|
+
} : {}), agentNoPermission !== null && agentNoPermission !== void 0 && agentNoPermission.connectors ? {
|
|
145
|
+
connectors: agentNoPermission.connectors
|
|
146
|
+
} : {});
|
|
147
|
+
};
|
|
148
|
+
export var shouldSelectOrphanSessionAgent = function shouldSelectOrphanSessionAgent(params) {
|
|
149
|
+
return Boolean(params.agentNoPermission && !params.agentDeleted && params.userCanViewAgents && params.hasAgentAccess && params.hasAgentPermission && !params.agentExistsInList);
|
|
150
|
+
};
|
|
151
|
+
export var buildOrphanSessionAgent = function buildOrphanSessionAgent(agentNoPermission, projectDeleted) {
|
|
152
|
+
return _objectSpread(_objectSpread({
|
|
153
|
+
id: agentNoPermission.id,
|
|
154
|
+
name: agentNoPermission.name,
|
|
155
|
+
emoji: agentNoPermission.emoji,
|
|
156
|
+
type: agentNoPermission.type,
|
|
157
|
+
is_from_conversation: true
|
|
158
|
+
}, agentNoPermission.connectors ? {
|
|
159
|
+
connectors: agentNoPermission.connectors
|
|
160
|
+
} : {}), projectDeleted ? {
|
|
161
|
+
project_deleted: {
|
|
162
|
+
name: projectDeleted.name
|
|
163
|
+
}
|
|
164
|
+
} : {});
|
|
165
|
+
};
|
|
166
|
+
export var shouldMergeListedSessionAgent = function shouldMergeListedSessionAgent(params) {
|
|
167
|
+
return Boolean(params.agentNoPermission && !params.agentDeleted && params.hasAgentAccess && params.hasAgentPermission && params.agentExistsInList);
|
|
168
|
+
};
|
|
169
|
+
export var mergeListedSessionAgent = function mergeListedSessionAgent(agentInList, agentNoPermission, projectDeleted) {
|
|
170
|
+
return _objectSpread(_objectSpread(_objectSpread({}, agentInList), agentNoPermission.connectors ? {
|
|
171
|
+
connectors: agentNoPermission.connectors
|
|
172
|
+
} : {}), projectDeleted ? {
|
|
173
|
+
project_deleted: {
|
|
174
|
+
name: projectDeleted.name
|
|
175
|
+
}
|
|
176
|
+
} : {
|
|
177
|
+
project_deleted: undefined
|
|
178
|
+
});
|
|
179
|
+
};
|
|
180
|
+
export var resolveRestrictedSessionAgent = function resolveRestrictedSessionAgent(agentNoPermission, params) {
|
|
181
|
+
var base = _objectSpread(_objectSpread({
|
|
182
|
+
id: agentNoPermission.id,
|
|
183
|
+
name: agentNoPermission.name,
|
|
184
|
+
emoji: agentNoPermission.emoji,
|
|
185
|
+
type: agentNoPermission.type
|
|
186
|
+
}, agentNoPermission.connectors ? {
|
|
187
|
+
connectors: agentNoPermission.connectors
|
|
188
|
+
} : {}), params.projectDeleted ? {
|
|
189
|
+
project_deleted: {
|
|
190
|
+
name: params.projectDeleted.name
|
|
191
|
+
}
|
|
192
|
+
} : {});
|
|
193
|
+
if (!params.hasAgentAccess) {
|
|
194
|
+
return {
|
|
195
|
+
reason: 'no_access',
|
|
196
|
+
agent: _objectSpread(_objectSpread({}, base), {}, {
|
|
197
|
+
has_not_access: true
|
|
198
|
+
})
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
if (!params.hasAgentPermission) {
|
|
202
|
+
return {
|
|
203
|
+
reason: 'no_permission',
|
|
204
|
+
agent: _objectSpread(_objectSpread({}, base), {}, {
|
|
205
|
+
has_not_permissions: true
|
|
206
|
+
})
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
if (params.projectDeleted) {
|
|
210
|
+
return {
|
|
211
|
+
reason: 'project_deleted',
|
|
212
|
+
agent: _objectSpread(_objectSpread({
|
|
213
|
+
id: agentNoPermission.id,
|
|
214
|
+
name: agentNoPermission.name,
|
|
215
|
+
emoji: agentNoPermission.emoji,
|
|
216
|
+
type: agentNoPermission.type
|
|
217
|
+
}, agentNoPermission.connectors ? {
|
|
218
|
+
connectors: agentNoPermission.connectors
|
|
219
|
+
} : {}), {}, {
|
|
220
|
+
project_deleted: {
|
|
221
|
+
name: params.projectDeleted.name
|
|
222
|
+
}
|
|
223
|
+
})
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
return null;
|
|
227
|
+
};
|
|
228
|
+
/** Réplica la cadena de `selectAgent` en `loadMessages` (última selección gana). */
|
|
229
|
+
export var resolveSessionAgentFromChatLoad = function resolveSessionAgentFromChatLoad(ctx) {
|
|
230
|
+
var agentDeleted = ctx.agentDeleted,
|
|
231
|
+
agentNoPermission = ctx.agentNoPermission,
|
|
232
|
+
agents = ctx.agents,
|
|
233
|
+
projectDeleted = ctx.projectDeleted;
|
|
234
|
+
var selected = null;
|
|
235
|
+
if (agentDeleted) {
|
|
236
|
+
selected = buildDeletedSessionAgent(agentDeleted, agentNoPermission);
|
|
237
|
+
}
|
|
238
|
+
var agentExistsInList = Boolean(agentNoPermission && agents.some(function (agentItem) {
|
|
239
|
+
return agentItem.id === agentNoPermission.id;
|
|
240
|
+
}));
|
|
241
|
+
if (shouldSelectOrphanSessionAgent({
|
|
242
|
+
agentNoPermission: agentNoPermission,
|
|
243
|
+
agentDeleted: agentDeleted,
|
|
244
|
+
userCanViewAgents: ctx.userCanViewAgents,
|
|
245
|
+
hasAgentAccess: ctx.hasAgentAccess,
|
|
246
|
+
hasAgentPermission: ctx.hasAgentPermission,
|
|
247
|
+
agentExistsInList: agentExistsInList
|
|
248
|
+
}) && agentNoPermission) {
|
|
249
|
+
selected = buildOrphanSessionAgent(agentNoPermission, projectDeleted);
|
|
250
|
+
}
|
|
251
|
+
if (shouldMergeListedSessionAgent({
|
|
252
|
+
agentNoPermission: agentNoPermission,
|
|
253
|
+
agentDeleted: agentDeleted,
|
|
254
|
+
hasAgentAccess: ctx.hasAgentAccess,
|
|
255
|
+
hasAgentPermission: ctx.hasAgentPermission,
|
|
256
|
+
agentExistsInList: agentExistsInList
|
|
257
|
+
}) && agentNoPermission) {
|
|
258
|
+
var agentInList = agents.find(function (agentItem) {
|
|
259
|
+
return agentItem.id === agentNoPermission.id;
|
|
260
|
+
});
|
|
261
|
+
if (agentInList) {
|
|
262
|
+
selected = mergeListedSessionAgent(agentInList, agentNoPermission, projectDeleted);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
if (agentNoPermission && !agentDeleted) {
|
|
266
|
+
var restricted = resolveRestrictedSessionAgent(agentNoPermission, {
|
|
267
|
+
hasAgentAccess: ctx.hasAgentAccess,
|
|
268
|
+
hasAgentPermission: ctx.hasAgentPermission,
|
|
269
|
+
projectDeleted: projectDeleted
|
|
270
|
+
});
|
|
271
|
+
if (restricted) {
|
|
272
|
+
selected = restricted.agent;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return selected;
|
|
276
|
+
};
|
|
277
|
+
export var buildSessionConversationMeta = function buildSessionConversationMeta(fields) {
|
|
278
|
+
return {
|
|
279
|
+
projectIdMessage: fields.projectIdMessage,
|
|
280
|
+
projectNameFromSession: fields.projectNameFromSession,
|
|
281
|
+
clientIdFromSession: fields.clientIdFromSession,
|
|
282
|
+
clientNameFromSession: fields.clientNameFromSession,
|
|
283
|
+
taskIdFromSession: fields.taskIdFromSession,
|
|
284
|
+
taskNameFromSession: fields.taskNameFromSession
|
|
285
|
+
};
|
|
286
|
+
};
|
|
287
|
+
export var buildSessionMetaEventDetail = function buildSessionMetaEventDetail(chatId, fields) {
|
|
288
|
+
return {
|
|
289
|
+
chatId: chatId,
|
|
290
|
+
agentType: fields.agentType,
|
|
291
|
+
agentEntity: fields.agentEntity,
|
|
292
|
+
projectId: fields.projectId,
|
|
293
|
+
projectName: fields.projectName,
|
|
294
|
+
clientId: fields.clientId,
|
|
295
|
+
clientName: fields.clientName,
|
|
296
|
+
taskId: fields.taskId,
|
|
297
|
+
taskName: fields.taskName
|
|
298
|
+
};
|
|
299
|
+
};
|
|
300
|
+
export var hasConversationProjectContext = function hasConversationProjectContext(projectIdMessage) {
|
|
301
|
+
return Boolean(projectIdMessage);
|
|
302
|
+
};
|
|
303
|
+
export var rewriteMessagesForProjectTaskUrls = /*#__PURE__*/function () {
|
|
304
|
+
var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(items, projectIdMessage, getTabTaskDefault) {
|
|
305
|
+
var tab;
|
|
306
|
+
return _regeneratorRuntime.wrap(function (_context) {
|
|
307
|
+
while (1) switch (_context.prev = _context.next) {
|
|
308
|
+
case 0:
|
|
309
|
+
if (hasConversationProjectContext(projectIdMessage)) {
|
|
310
|
+
_context.next = 1;
|
|
311
|
+
break;
|
|
312
|
+
}
|
|
313
|
+
return _context.abrupt("return", items);
|
|
314
|
+
case 1:
|
|
315
|
+
_context.next = 2;
|
|
316
|
+
return getTabTaskDefault(1);
|
|
317
|
+
case 2:
|
|
318
|
+
tab = _context.sent;
|
|
319
|
+
return _context.abrupt("return", rewriteChatMessagesTaskUrls(items, resolveTaskUrlTabSegment(tab)));
|
|
320
|
+
case 3:
|
|
321
|
+
case "end":
|
|
322
|
+
return _context.stop();
|
|
323
|
+
}
|
|
324
|
+
}, _callee);
|
|
325
|
+
}));
|
|
326
|
+
return function rewriteMessagesForProjectTaskUrls(_x, _x2, _x3) {
|
|
327
|
+
return _ref.apply(this, arguments);
|
|
328
|
+
};
|
|
329
|
+
}();
|
|
330
|
+
export var resolveFinalMessagesWithActiveStreamingTail = function resolveFinalMessagesWithActiveStreamingTail(items, tail, sessionStatus) {
|
|
331
|
+
if (sessionStatus && isActiveSessionStatus(sessionStatus)) {
|
|
332
|
+
return mergeChatMessagesWithActiveSessionTail(items, tail);
|
|
333
|
+
}
|
|
334
|
+
return items;
|
|
335
|
+
};
|
|
336
|
+
export var shouldLoadMoreMessagesOnScroll = function shouldLoadMoreMessagesOnScroll(scrollTop, scrollHeight, clientHeight) {
|
|
337
|
+
var thresholdPercent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 90;
|
|
338
|
+
var scrollable = scrollHeight - clientHeight;
|
|
339
|
+
if (scrollable <= 0) return false;
|
|
340
|
+
var scrollPercentage = scrollTop / scrollable * 100;
|
|
341
|
+
return scrollPercentage > thresholdPercent;
|
|
342
|
+
};
|
|
343
|
+
export var messagesNeedTabRewrite = function messagesNeedTabRewrite(messages, tabTaskDefault) {
|
|
344
|
+
var taskUrlRegex = new RegExp(TASK_URL_REGEX_PATTERN, 'g');
|
|
345
|
+
return messages.some(function (msg) {
|
|
346
|
+
var content = msg.message || '';
|
|
347
|
+
var matches = content.match(taskUrlRegex);
|
|
348
|
+
if (!(matches !== null && matches !== void 0 && matches.length)) return false;
|
|
349
|
+
return matches.some(function (url) {
|
|
350
|
+
return !url.endsWith("/".concat(tabTaskDefault)) && !url.includes("/".concat(tabTaskDefault, "?"));
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
};
|
|
354
|
+
export var upsertChatMessage = function upsertChatMessage(previous, message) {
|
|
355
|
+
var existingMessageIndex = previous.findIndex(function (msg) {
|
|
356
|
+
return msg.id === message.id;
|
|
357
|
+
});
|
|
358
|
+
if (existingMessageIndex >= 0) {
|
|
359
|
+
return previous.map(function (msg, index) {
|
|
360
|
+
return index === existingMessageIndex ? message : msg;
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
return [].concat(_toConsumableArray(previous), [message]);
|
|
364
|
+
};
|
|
365
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJidWlsZENvbnRleHRNZXNzYWdlIiwiVEFTS19VUkxfUkVHRVhfUEFUVEVSTiIsImZvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZUZvckRpc3BsYXkiLCJnZXRDaGF0c1N0b3JlU3RhdGUiLCJpc0FjdGl2ZVNlc3Npb25TdGF0dXMiLCJoYXNNZWFuaW5nZnVsVXNlckluaXRpYWxNZXNzYWdlIiwidXNlckluaXRpYWxNZXNzYWdlIiwiX3VzZXJJbml0aWFsTWVzc2FnZSRtIiwiX3VzZXJJbml0aWFsTWVzc2FnZSRhIiwiQm9vbGVhbiIsIm1lc3NhZ2UiLCJ0cmltIiwiYXR0YWNobWVudHMiLCJsZW5ndGgiLCJmdWFJZCIsInNjSWQiLCJtYXJrT3BlbmVkU2Vzc2lvbkFzUmVhZElmVmlzaWJsZSIsInNlc3Npb25JZCIsIl9nZXRDaGF0c1N0b3JlU3RhdGUiLCJpc0NoYXRWaWV3VmlzaWJsZSIsImFjdGl2ZUNoYXRJZCIsIm1hcmtDaGF0QXNSZWFkIiwiYnVpbGRJbml0aWFsTWVzc2FnZVBsYWNlaG9sZGVyIiwiY3VycmVudFVzZXIiLCJfb2JqZWN0U3ByZWFkIiwiaWQiLCJkYXRlIiwiRGF0ZSIsInVzZXIiLCJtZW50aW9ucyIsImNvbnRleHRNZXNzYWdlIiwicmV3cml0ZVRhc2tVcmxzSW5Db250ZW50IiwiY29udGVudCIsInRhYlNlZ21lbnQiLCJ0YXNrVXJsUmVnZXgiLCJSZWdFeHAiLCJyZXBsYWNlIiwidXJsIiwiY29udmVyc2F0aW9uUHJvamVjdFRvR2xvYmFsUHJvamVjdCIsInByb2plY3QiLCJfcHJvamVjdCRjbGllbnQiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsIm5hbWUiLCJjbGllbnQiLCJyZXNvbHZlVGFza0Zyb21Db252ZXJzYXRpb25NZXRhZGF0YSIsInRhc2tJZCIsInRhc2tOYW1lIiwiaGFzQ2xpZW50Q29udmVyc2F0aW9uTWV0YWRhdGEiLCJjbGllbnRJZCIsImNsaWVudE5hbWUiLCJzaG91bGRBcHBseU11bHRpQWdlbnRQcm9qZWN0Q29udGV4dCIsInByb2plY3RJZE1lc3NhZ2UiLCJoYXNNdWx0aUFnZW50c0FjY2VzcyIsInJlc29sdmVQcm9qZWN0Q2hpcEZyb21TZXNzaW9uIiwicHJvamVjdE5hbWVGcm9tU2Vzc2lvbiIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsInByb2plY3ROYW1lIiwicHJvamVjdElkIiwiU3RyaW5nIiwicmVzb2x2ZVByb2plY3RDb250ZXh0RnJvbUZldGNoIiwicHJvamVjdHMiLCJwcm9qZWN0SWROdW0iLCJmb3VuZFByb2plY3QiLCJmaW5kIiwiX2ZvdW5kUHJvamVjdCRjbGllbnQiLCJjaGlwc1Byb2plY3QiLCJyZXNvbHZlVGFza1VybFRhYlNlZ21lbnQiLCJ0YWIiLCJjb25jYXQiLCJyZXdyaXRlQ2hhdE1lc3NhZ2VzVGFza1VybHMiLCJpdGVtcyIsIm1hcCIsIml0ZW0iLCJtZXJnZUNoYXRNZXNzYWdlc1dpdGhBY3RpdmVTZXNzaW9uVGFpbCIsImhpc3RvcmljYWwiLCJ0YWlsIiwiZXhpc3RpbmdJZHMiLCJTZXQiLCJleHRyYSIsImZpbHRlciIsImhhcyIsIl90b0NvbnN1bWFibGVBcnJheSIsInNob3VsZEFib3J0U3RhbGVNZXNzYWdlTG9hZCIsInNlcSIsImN1cnJlbnRTZXEiLCJ0YXJnZXRDaGF0SWQiLCJidWlsZERlbGV0ZWRTZXNzaW9uQWdlbnQiLCJhZ2VudERlbGV0ZWQiLCJhZ2VudE5vUGVybWlzc2lvbiIsImVtb2ppIiwidHlwZSIsImlzX2RlbGV0ZWQiLCJkZWxldGVkQXQiLCJkZWxldGVkX2F0IiwiY29ubmVjdG9ycyIsInNob3VsZFNlbGVjdE9ycGhhblNlc3Npb25BZ2VudCIsInBhcmFtcyIsInVzZXJDYW5WaWV3QWdlbnRzIiwiaGFzQWdlbnRBY2Nlc3MiLCJoYXNBZ2VudFBlcm1pc3Npb24iLCJhZ2VudEV4aXN0c0luTGlzdCIsImJ1aWxkT3JwaGFuU2Vzc2lvbkFnZW50IiwicHJvamVjdERlbGV0ZWQiLCJpc19mcm9tX2NvbnZlcnNhdGlvbiIsInByb2plY3RfZGVsZXRlZCIsInNob3VsZE1lcmdlTGlzdGVkU2Vzc2lvbkFnZW50IiwibWVyZ2VMaXN0ZWRTZXNzaW9uQWdlbnQiLCJhZ2VudEluTGlzdCIsInJlc29sdmVSZXN0cmljdGVkU2Vzc2lvbkFnZW50IiwiYmFzZSIsInJlYXNvbiIsImFnZW50IiwiaGFzX25vdF9hY2Nlc3MiLCJoYXNfbm90X3Blcm1pc3Npb25zIiwicmVzb2x2ZVNlc3Npb25BZ2VudEZyb21DaGF0TG9hZCIsImN0eCIsImFnZW50cyIsInNlbGVjdGVkIiwic29tZSIsImFnZW50SXRlbSIsInJlc3RyaWN0ZWQiLCJidWlsZFNlc3Npb25Db252ZXJzYXRpb25NZXRhIiwiZmllbGRzIiwiY2xpZW50SWRGcm9tU2Vzc2lvbiIsImNsaWVudE5hbWVGcm9tU2Vzc2lvbiIsInRhc2tJZEZyb21TZXNzaW9uIiwidGFza05hbWVGcm9tU2Vzc2lvbiIsImJ1aWxkU2Vzc2lvbk1ldGFFdmVudERldGFpbCIsImNoYXRJZCIsImFnZW50VHlwZSIsImFnZW50RW50aXR5IiwiaGFzQ29udmVyc2F0aW9uUHJvamVjdENvbnRleHQiLCJyZXdyaXRlTWVzc2FnZXNGb3JQcm9qZWN0VGFza1VybHMiLCJfcmVmIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJnZXRUYWJUYXNrRGVmYXVsdCIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiYWJydXB0Iiwic2VudCIsInN0b3AiLCJfeCIsIl94MiIsIl94MyIsImFwcGx5IiwicmVzb2x2ZUZpbmFsTWVzc2FnZXNXaXRoQWN0aXZlU3RyZWFtaW5nVGFpbCIsInNlc3Npb25TdGF0dXMiLCJzaG91bGRMb2FkTW9yZU1lc3NhZ2VzT25TY3JvbGwiLCJzY3JvbGxUb3AiLCJzY3JvbGxIZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJ0aHJlc2hvbGRQZXJjZW50Iiwic2Nyb2xsYWJsZSIsInNjcm9sbFBlcmNlbnRhZ2UiLCJtZXNzYWdlc05lZWRUYWJSZXdyaXRlIiwibWVzc2FnZXMiLCJ0YWJUYXNrRGVmYXVsdCIsIm1zZyIsIm1hdGNoZXMiLCJtYXRjaCIsImVuZHNXaXRoIiwiaW5jbHVkZXMiLCJ1cHNlcnRDaGF0TWVzc2FnZSIsInByZXZpb3VzIiwiZXhpc3RpbmdNZXNzYWdlSW5kZXgiLCJmaW5kSW5kZXgiLCJpbmRleCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy91c2VDaGF0TWVzc2FnZXMvdXNlQ2hhdE1lc3NhZ2VzLmhlbHBlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhdE1lc3NhZ2UsIENoYXRNZXNzYWdlVXNlciB9IGZyb20gJy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQgeyBidWlsZENvbnRleHRNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvY29udGV4dE1lbnRpb24nXG5pbXBvcnQgeyBUQVNLX1VSTF9SRUdFWF9QQVRURVJOIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3Rhc2tVcmxzJ1xuaW1wb3J0IHsgZm9ybWF0UXVpY2tBY3Rpb25NZXNzYWdlRm9yRGlzcGxheSB9IGZyb20gJy4uLy4uL3V0aWxzL2Zvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZSdcbmltcG9ydCB7IGdldENoYXRzU3RvcmVTdGF0ZSB9IGZyb20gJy4uLy4uL3N0b3JlL3VzZUNoYXRzU3RvcmUnXG5pbXBvcnQgdHlwZSB7IEFnZW50LCBBZ2VudFR5cGUgfSBmcm9tICcuLi8uLi90eXBlcy9hZ2VudCdcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3R5cGVzL1Byb2plY3QnXG5pbXBvcnQgdHlwZSB7IFVzZUNoYXRNZXNzYWdlc1Byb3BzIH0gZnJvbSAnLi91c2VDaGF0TWVzc2FnZXMuaW50ZXJmYWNlJ1xuaW1wb3J0IHtcbiAgaXNBY3RpdmVTZXNzaW9uU3RhdHVzLFxuICB0eXBlIFNlc3Npb25Db252ZXJzYXRpb25NZXRhLFxuICB0eXBlIFNlc3Npb25NZXRhRXZlbnREZXRhaWwsXG4gIHR5cGUgU2Vzc2lvblN0YXR1cyxcbn0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvc2Vzc2lvbnMudHlwZXMnXG5cbnR5cGUgVXNlckluaXRpYWxNZXNzYWdlID0gVXNlQ2hhdE1lc3NhZ2VzUHJvcHNbJ3VzZXJJbml0aWFsTWVzc2FnZSddXG5cbi8qKiBFbCBtb2RhbCB1c2EgYHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9YCBjb21vIFwic2luIG1lbnNhamUgaW5pY2lhbFwiOyBubyBlcyBmYWxzeS4gKi9cbmV4cG9ydCBjb25zdCBoYXNNZWFuaW5nZnVsVXNlckluaXRpYWxNZXNzYWdlID0gKHVzZXJJbml0aWFsTWVzc2FnZT86IFVzZXJJbml0aWFsTWVzc2FnZSk6IGJvb2xlYW4gPT5cbiAgQm9vbGVhbihcbiAgICB1c2VySW5pdGlhbE1lc3NhZ2UgJiZcbiAgICAodXNlckluaXRpYWxNZXNzYWdlLm1lc3NhZ2U/LnRyaW0oKSB8fFxuICAgICAgdXNlckluaXRpYWxNZXNzYWdlLmF0dGFjaG1lbnRzPy5sZW5ndGggfHxcbiAgICAgIHVzZXJJbml0aWFsTWVzc2FnZS5mdWFJZCB8fFxuICAgICAgdXNlckluaXRpYWxNZXNzYWdlLnNjSWQpXG4gIClcblxuLyoqIE1hcmNhIGxhIHNlc2nDs24gY29tbyBsZcOtZGEgY3VhbmRvIHRlcm1pbsOzIGRlIGhpZHJhdGFyc2UgeSBzaWd1ZSBzaWVuZG8gbGEgYWN0aXZhIHkgdmlzaWJsZS4gKi9cbmV4cG9ydCBjb25zdCBtYXJrT3BlbmVkU2Vzc2lvbkFzUmVhZElmVmlzaWJsZSA9IChzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQgPT4ge1xuICBjb25zdCB7IGlzQ2hhdFZpZXdWaXNpYmxlLCBhY3RpdmVDaGF0SWQsIG1hcmtDaGF0QXNSZWFkIH0gPSBnZXRDaGF0c1N0b3JlU3RhdGUoKVxuICBpZiAoIWlzQ2hhdFZpZXdWaXNpYmxlIHx8IGFjdGl2ZUNoYXRJZCAhPT0gc2Vzc2lvbklkKSByZXR1cm5cbiAgbWFya0NoYXRBc1JlYWQoc2Vzc2lvbklkKVxufVxuXG5leHBvcnQgY29uc3QgYnVpbGRJbml0aWFsTWVzc2FnZVBsYWNlaG9sZGVyID0gKFxuICB1c2VySW5pdGlhbE1lc3NhZ2U6IE5vbk51bGxhYmxlPFVzZXJJbml0aWFsTWVzc2FnZT4sXG4gIGN1cnJlbnRVc2VyOiBDaGF0TWVzc2FnZVVzZXJcbik6IENoYXRNZXNzYWdlW10gPT4gW1xuICB7XG4gICAgaWQ6ICd1c2VyLWluaXRpYWwtbWVzc2FnZScsXG4gICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICB1c2VyOiBjdXJyZW50VXNlcixcbiAgICBtZXNzYWdlOiBmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5KHVzZXJJbml0aWFsTWVzc2FnZS5tZXNzYWdlLCB7XG4gICAgICBmdWFJZDogdXNlckluaXRpYWxNZXNzYWdlLmZ1YUlkLFxuICAgICAgc2NJZDogdXNlckluaXRpYWxNZXNzYWdlLnNjSWQsXG4gICAgfSksXG4gICAgLi4uKHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cyA/IHsgYXR0YWNobWVudHM6IHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cyB9IDoge30pLFxuICAgIC4uLihidWlsZENvbnRleHRNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZS5tZW50aW9ucylcbiAgICAgID8geyBjb250ZXh0TWVzc2FnZTogYnVpbGRDb250ZXh0TWVzc2FnZSh1c2VySW5pdGlhbE1lc3NhZ2UubWVudGlvbnMpIH1cbiAgICAgIDoge30pLFxuICB9LFxuXVxuXG5leHBvcnQgY29uc3QgcmV3cml0ZVRhc2tVcmxzSW5Db250ZW50ID0gKGNvbnRlbnQ6IHN0cmluZywgdGFiU2VnbWVudDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdGFza1VybFJlZ2V4ID0gbmV3IFJlZ0V4cChUQVNLX1VSTF9SRUdFWF9QQVRURVJOLCAnZycpXG4gIHJldHVybiBjb250ZW50LnJlcGxhY2UodGFza1VybFJlZ2V4LCB1cmwgPT5cbiAgICB1cmwucmVwbGFjZSgvXFwvKGRldGFpbHxtZXNzYWdlfG1lc3NhZ2VzfGZpbGVzfGhpc3Rvcnl8aG91cnMpKD89JHxcXD8pLywgdGFiU2VnbWVudClcbiAgKVxufVxuXG5leHBvcnQgdHlwZSBDb252ZXJzYXRpb25Qcm9qZWN0T3B0aW9uID0ge1xuICBpZDogbnVtYmVyIHwgc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICBjbGllbnQ/OiB7IG5hbWU/OiBzdHJpbmc7IGlkPzogbnVtYmVyIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNvbnZlcnNhdGlvblByb2plY3RUb0dsb2JhbFByb2plY3QgPSAocHJvamVjdDogQ29udmVyc2F0aW9uUHJvamVjdE9wdGlvbiB8IG51bGwpOiBQcm9qZWN0IHwgbnVsbCA9PiB7XG4gIGlmICghcHJvamVjdCkgcmV0dXJuIG51bGxcbiAgY29uc3QgaWQgPSB0eXBlb2YgcHJvamVjdC5pZCA9PT0gJ251bWJlcicgPyBwcm9qZWN0LmlkIDogTnVtYmVyKHByb2plY3QuaWQpXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGlkKSkgcmV0dXJuIG51bGxcblxuICByZXR1cm4ge1xuICAgIGlkLFxuICAgIG5hbWU6IHByb2plY3QubmFtZSxcbiAgICAuLi4ocHJvamVjdC5jbGllbnQ/LmlkICE9IG51bGwgJiYgcHJvamVjdC5jbGllbnQubmFtZVxuICAgICAgPyB7IGNsaWVudDogeyBpZDogcHJvamVjdC5jbGllbnQuaWQsIG5hbWU6IHByb2plY3QuY2xpZW50Lm5hbWUgfSB9XG4gICAgICA6IHt9KSxcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBDb252ZXJzYXRpb25Qcm9qZWN0Q2hpcCA9IHtcbiAgcHJvamVjdE5hbWU6IHN0cmluZ1xuICBjbGllbnROYW1lOiBzdHJpbmdcbiAgcHJvamVjdElkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVUYXNrRnJvbUNvbnZlcnNhdGlvbk1ldGFkYXRhID0gKFxuICB0YXNrSWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsLFxuICB0YXNrTmFtZT86IHN0cmluZyB8IG51bGxcbik6IHsgaWQ6IHN0cmluZyB8IG51bWJlcjsgbmFtZTogc3RyaW5nIH0gfCBudWxsID0+ICh0YXNrSWQgIT0gbnVsbCAmJiB0YXNrTmFtZSA/IHsgaWQ6IHRhc2tJZCwgbmFtZTogdGFza05hbWUgfSA6IG51bGwpXG5cbmV4cG9ydCBjb25zdCBoYXNDbGllbnRDb252ZXJzYXRpb25NZXRhZGF0YSA9IChjbGllbnRJZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIGNsaWVudE5hbWU/OiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiA9PlxuICBjbGllbnRJZCAhPSBudWxsICYmIEJvb2xlYW4oY2xpZW50TmFtZSlcblxuZXhwb3J0IGNvbnN0IHNob3VsZEFwcGx5TXVsdGlBZ2VudFByb2plY3RDb250ZXh0ID0gKFxuICBwcm9qZWN0SWRNZXNzYWdlOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBoYXNNdWx0aUFnZW50c0FjY2VzczogYm9vbGVhblxuKTogYm9vbGVhbiA9PiBCb29sZWFuKHByb2plY3RJZE1lc3NhZ2UgJiYgaGFzTXVsdGlBZ2VudHNBY2Nlc3MpXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlUHJvamVjdENoaXBGcm9tU2Vzc2lvbiA9IChcbiAgcHJvamVjdElkTWVzc2FnZTogc3RyaW5nIHwgbnVtYmVyLFxuICBwcm9qZWN0TmFtZUZyb21TZXNzaW9uOiBzdHJpbmcsXG4gIGNsaWVudE5hbWUgPSAnJ1xuKTogQ29udmVyc2F0aW9uUHJvamVjdENoaXAgPT4gKHtcbiAgcHJvamVjdE5hbWU6IHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gIGNsaWVudE5hbWUsXG4gIHByb2plY3RJZDogU3RyaW5nKHByb2plY3RJZE1lc3NhZ2UpLFxufSlcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVQcm9qZWN0Q29udGV4dEZyb21GZXRjaCA9IChcbiAgcHJvamVjdElkTWVzc2FnZTogc3RyaW5nIHwgbnVtYmVyLFxuICBwcm9qZWN0czogQ29udmVyc2F0aW9uUHJvamVjdE9wdGlvbltdLFxuICBwcm9qZWN0TmFtZUZyb21TZXNzaW9uPzogc3RyaW5nIHwgbnVsbFxuKTogeyBjaGlwc1Byb2plY3Q6IENvbnZlcnNhdGlvblByb2plY3RDaGlwIHwgbnVsbDsgcHJvamVjdDogQ29udmVyc2F0aW9uUHJvamVjdE9wdGlvbiB8IG51bGwgfSA9PiB7XG4gIGNvbnN0IHByb2plY3RJZE51bSA9IE51bWJlcihwcm9qZWN0SWRNZXNzYWdlKVxuICBjb25zdCBmb3VuZFByb2plY3QgPSBwcm9qZWN0cy5maW5kKHByb2plY3QgPT4gTnVtYmVyKHByb2plY3QuaWQpID09PSBwcm9qZWN0SWROdW0pXG5cbiAgaWYgKGZvdW5kUHJvamVjdCkge1xuICAgIHJldHVybiB7XG4gICAgICBjaGlwc1Byb2plY3Q6IHtcbiAgICAgICAgcHJvamVjdE5hbWU6IGZvdW5kUHJvamVjdC5uYW1lLFxuICAgICAgICBjbGllbnROYW1lOiBmb3VuZFByb2plY3QuY2xpZW50Py5uYW1lIHx8ICcnLFxuICAgICAgICBwcm9qZWN0SWQ6IFN0cmluZyhmb3VuZFByb2plY3QuaWQpLFxuICAgICAgfSxcbiAgICAgIHByb2plY3Q6IGZvdW5kUHJvamVjdCxcbiAgICB9XG4gIH1cblxuICBpZiAocHJvamVjdE5hbWVGcm9tU2Vzc2lvbikge1xuICAgIHJldHVybiB7XG4gICAgICBjaGlwc1Byb2plY3Q6IHJlc29sdmVQcm9qZWN0Q2hpcEZyb21TZXNzaW9uKHByb2plY3RJZE1lc3NhZ2UsIHByb2plY3ROYW1lRnJvbVNlc3Npb24pLFxuICAgICAgcHJvamVjdDogeyBpZDogcHJvamVjdElkTnVtLCBuYW1lOiBwcm9qZWN0TmFtZUZyb21TZXNzaW9uIH0sXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgY2hpcHNQcm9qZWN0OiBudWxsLCBwcm9qZWN0OiBudWxsIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVUYXNrVXJsVGFiU2VnbWVudCA9ICh0YWI6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4gKHRhYiA/IGAvJHt0YWJ9YCA6ICcvZGV0YWlsJylcblxuZXhwb3J0IGNvbnN0IHJld3JpdGVDaGF0TWVzc2FnZXNUYXNrVXJscyA9IChpdGVtczogQ2hhdE1lc3NhZ2VbXSwgdGFiU2VnbWVudDogc3RyaW5nKTogQ2hhdE1lc3NhZ2VbXSA9PlxuICBpdGVtcy5tYXAoaXRlbSA9PiAoe1xuICAgIC4uLml0ZW0sXG4gICAgbWVzc2FnZTogcmV3cml0ZVRhc2tVcmxzSW5Db250ZW50KGl0ZW0ubWVzc2FnZSB8fCAnJywgdGFiU2VnbWVudCksXG4gIH0pKVxuXG5leHBvcnQgY29uc3QgbWVyZ2VDaGF0TWVzc2FnZXNXaXRoQWN0aXZlU2Vzc2lvblRhaWwgPSAoXG4gIGhpc3RvcmljYWw6IENoYXRNZXNzYWdlW10sXG4gIHRhaWw6IENoYXRNZXNzYWdlW11cbik6IENoYXRNZXNzYWdlW10gPT4ge1xuICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQoaGlzdG9yaWNhbC5tYXAoaXRlbSA9PiBpdGVtLmlkKSlcbiAgY29uc3QgZXh0cmEgPSB0YWlsLmZpbHRlcihpdGVtID0+ICFleGlzdGluZ0lkcy5oYXMoaXRlbS5pZCkpXG4gIHJldHVybiBleHRyYS5sZW5ndGggPyBbLi4uaGlzdG9yaWNhbCwgLi4uZXh0cmFdIDogaGlzdG9yaWNhbFxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkQWJvcnRTdGFsZU1lc3NhZ2VMb2FkID0gKFxuICBzZXE6IG51bWJlcixcbiAgY3VycmVudFNlcTogbnVtYmVyLFxuICB0YXJnZXRDaGF0SWQ6IHN0cmluZyxcbiAgYWN0aXZlQ2hhdElkOiBzdHJpbmdcbik6IGJvb2xlYW4gPT4gc2VxICE9PSBjdXJyZW50U2VxIHx8IHRhcmdldENoYXRJZCAhPT0gYWN0aXZlQ2hhdElkXG5cbmV4cG9ydCB0eXBlIFNlc3Npb25BZ2VudE5vUGVybWlzc2lvbiA9IHtcbiAgaWQ6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgZW1vamk6IHN0cmluZ1xuICB0eXBlOiBzdHJpbmdcbiAgY29ubmVjdG9ycz86IEFnZW50Wydjb25uZWN0b3JzJ11cbn1cblxuZXhwb3J0IHR5cGUgU2Vzc2lvbkFnZW50RGVsZXRlZCA9IHtcbiAgaWQ6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgZW1vamk6IHN0cmluZ1xuICBkZWxldGVkQXQ/OiBzdHJpbmcgfCBudWxsXG4gIGNvbm5lY3RvcnM/OiBBZ2VudFsnY29ubmVjdG9ycyddXG59XG5cbmV4cG9ydCBjb25zdCBidWlsZERlbGV0ZWRTZXNzaW9uQWdlbnQgPSAoXG4gIGFnZW50RGVsZXRlZDogU2Vzc2lvbkFnZW50RGVsZXRlZCxcbiAgYWdlbnROb1Blcm1pc3Npb24/OiBTZXNzaW9uQWdlbnROb1Blcm1pc3Npb24gfCBudWxsXG4pOiBBZ2VudCA9PiAoe1xuICBpZDogYWdlbnREZWxldGVkLmlkLFxuICBuYW1lOiBhZ2VudERlbGV0ZWQubmFtZSxcbiAgZW1vamk6IGFnZW50RGVsZXRlZC5lbW9qaSxcbiAgdHlwZTogJ2N1c3RvbScsXG4gIGlzX2RlbGV0ZWQ6IHRydWUsXG4gIC4uLihhZ2VudERlbGV0ZWQuZGVsZXRlZEF0ID8geyBkZWxldGVkX2F0OiBhZ2VudERlbGV0ZWQuZGVsZXRlZEF0IH0gOiB7fSksXG4gIC4uLihhZ2VudE5vUGVybWlzc2lvbj8uY29ubmVjdG9ycyA/IHsgY29ubmVjdG9yczogYWdlbnROb1Blcm1pc3Npb24uY29ubmVjdG9ycyB9IDoge30pLFxufSlcblxuZXhwb3J0IGNvbnN0IHNob3VsZFNlbGVjdE9ycGhhblNlc3Npb25BZ2VudCA9IChwYXJhbXM6IHtcbiAgYWdlbnROb1Blcm1pc3Npb246IFNlc3Npb25BZ2VudE5vUGVybWlzc2lvbiB8IG51bGwgfCB1bmRlZmluZWRcbiAgYWdlbnREZWxldGVkOiBTZXNzaW9uQWdlbnREZWxldGVkIHwgbnVsbCB8IHVuZGVmaW5lZFxuICB1c2VyQ2FuVmlld0FnZW50czogYm9vbGVhblxuICBoYXNBZ2VudEFjY2VzczogYm9vbGVhblxuICBoYXNBZ2VudFBlcm1pc3Npb246IGJvb2xlYW5cbiAgYWdlbnRFeGlzdHNJbkxpc3Q6IGJvb2xlYW5cbn0pOiBib29sZWFuID0+XG4gIEJvb2xlYW4oXG4gICAgcGFyYW1zLmFnZW50Tm9QZXJtaXNzaW9uICYmXG4gICAgIXBhcmFtcy5hZ2VudERlbGV0ZWQgJiZcbiAgICBwYXJhbXMudXNlckNhblZpZXdBZ2VudHMgJiZcbiAgICBwYXJhbXMuaGFzQWdlbnRBY2Nlc3MgJiZcbiAgICBwYXJhbXMuaGFzQWdlbnRQZXJtaXNzaW9uICYmXG4gICAgIXBhcmFtcy5hZ2VudEV4aXN0c0luTGlzdFxuICApXG5cbmV4cG9ydCBjb25zdCBidWlsZE9ycGhhblNlc3Npb25BZ2VudCA9IChcbiAgYWdlbnROb1Blcm1pc3Npb246IFNlc3Npb25BZ2VudE5vUGVybWlzc2lvbixcbiAgcHJvamVjdERlbGV0ZWQ/OiB7IG5hbWU6IHN0cmluZyB9IHwgbnVsbFxuKTogQWdlbnQgPT4gKHtcbiAgaWQ6IGFnZW50Tm9QZXJtaXNzaW9uLmlkLFxuICBuYW1lOiBhZ2VudE5vUGVybWlzc2lvbi5uYW1lLFxuICBlbW9qaTogYWdlbnROb1Blcm1pc3Npb24uZW1vamksXG4gIHR5cGU6IGFnZW50Tm9QZXJtaXNzaW9uLnR5cGUgYXMgQWdlbnRUeXBlLFxuICBpc19mcm9tX2NvbnZlcnNhdGlvbjogdHJ1ZSxcbiAgLi4uKGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgPyB7IGNvbm5lY3RvcnM6IGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgfSA6IHt9KSxcbiAgLi4uKHByb2plY3REZWxldGVkID8geyBwcm9qZWN0X2RlbGV0ZWQ6IHsgbmFtZTogcHJvamVjdERlbGV0ZWQubmFtZSB9IH0gOiB7fSksXG59KVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkTWVyZ2VMaXN0ZWRTZXNzaW9uQWdlbnQgPSAocGFyYW1zOiB7XG4gIGFnZW50Tm9QZXJtaXNzaW9uOiBTZXNzaW9uQWdlbnROb1Blcm1pc3Npb24gfCBudWxsIHwgdW5kZWZpbmVkXG4gIGFnZW50RGVsZXRlZDogU2Vzc2lvbkFnZW50RGVsZXRlZCB8IG51bGwgfCB1bmRlZmluZWRcbiAgaGFzQWdlbnRBY2Nlc3M6IGJvb2xlYW5cbiAgaGFzQWdlbnRQZXJtaXNzaW9uOiBib29sZWFuXG4gIGFnZW50RXhpc3RzSW5MaXN0OiBib29sZWFuXG59KTogYm9vbGVhbiA9PlxuICBCb29sZWFuKFxuICAgIHBhcmFtcy5hZ2VudE5vUGVybWlzc2lvbiAmJlxuICAgICFwYXJhbXMuYWdlbnREZWxldGVkICYmXG4gICAgcGFyYW1zLmhhc0FnZW50QWNjZXNzICYmXG4gICAgcGFyYW1zLmhhc0FnZW50UGVybWlzc2lvbiAmJlxuICAgIHBhcmFtcy5hZ2VudEV4aXN0c0luTGlzdFxuICApXG5cbmV4cG9ydCBjb25zdCBtZXJnZUxpc3RlZFNlc3Npb25BZ2VudCA9IChcbiAgYWdlbnRJbkxpc3Q6IEFnZW50LFxuICBhZ2VudE5vUGVybWlzc2lvbjogU2Vzc2lvbkFnZW50Tm9QZXJtaXNzaW9uLFxuICBwcm9qZWN0RGVsZXRlZD86IHsgbmFtZTogc3RyaW5nIH0gfCBudWxsXG4pOiBBZ2VudCA9PiAoe1xuICAuLi5hZ2VudEluTGlzdCxcbiAgLi4uKGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgPyB7IGNvbm5lY3RvcnM6IGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgfSA6IHt9KSxcbiAgLi4uKHByb2plY3REZWxldGVkID8geyBwcm9qZWN0X2RlbGV0ZWQ6IHsgbmFtZTogcHJvamVjdERlbGV0ZWQubmFtZSB9IH0gOiB7IHByb2plY3RfZGVsZXRlZDogdW5kZWZpbmVkIH0pLFxufSlcblxuZXhwb3J0IHR5cGUgUmVzdHJpY3RlZFNlc3Npb25BZ2VudFJlYXNvbiA9ICdub19hY2Nlc3MnIHwgJ25vX3Blcm1pc3Npb24nIHwgJ3Byb2plY3RfZGVsZXRlZCdcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVSZXN0cmljdGVkU2Vzc2lvbkFnZW50ID0gKFxuICBhZ2VudE5vUGVybWlzc2lvbjogU2Vzc2lvbkFnZW50Tm9QZXJtaXNzaW9uLFxuICBwYXJhbXM6IHtcbiAgICBoYXNBZ2VudEFjY2VzczogYm9vbGVhblxuICAgIGhhc0FnZW50UGVybWlzc2lvbjogYm9vbGVhblxuICAgIHByb2plY3REZWxldGVkPzogeyBuYW1lOiBzdHJpbmcgfSB8IG51bGxcbiAgfVxuKTogeyBhZ2VudDogQWdlbnQ7IHJlYXNvbjogUmVzdHJpY3RlZFNlc3Npb25BZ2VudFJlYXNvbiB9IHwgbnVsbCA9PiB7XG4gIGNvbnN0IGJhc2UgPSB7XG4gICAgaWQ6IGFnZW50Tm9QZXJtaXNzaW9uLmlkLFxuICAgIG5hbWU6IGFnZW50Tm9QZXJtaXNzaW9uLm5hbWUsXG4gICAgZW1vamk6IGFnZW50Tm9QZXJtaXNzaW9uLmVtb2ppLFxuICAgIHR5cGU6IGFnZW50Tm9QZXJtaXNzaW9uLnR5cGUgYXMgQWdlbnRUeXBlLFxuICAgIC4uLihhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzID8geyBjb25uZWN0b3JzOiBhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzIH0gOiB7fSksXG4gICAgLi4uKHBhcmFtcy5wcm9qZWN0RGVsZXRlZCA/IHsgcHJvamVjdF9kZWxldGVkOiB7IG5hbWU6IHBhcmFtcy5wcm9qZWN0RGVsZXRlZC5uYW1lIH0gfSA6IHt9KSxcbiAgfVxuXG4gIGlmICghcGFyYW1zLmhhc0FnZW50QWNjZXNzKSB7XG4gICAgcmV0dXJuIHsgcmVhc29uOiAnbm9fYWNjZXNzJywgYWdlbnQ6IHsgLi4uYmFzZSwgaGFzX25vdF9hY2Nlc3M6IHRydWUgfSB9XG4gIH1cbiAgaWYgKCFwYXJhbXMuaGFzQWdlbnRQZXJtaXNzaW9uKSB7XG4gICAgcmV0dXJuIHsgcmVhc29uOiAnbm9fcGVybWlzc2lvbicsIGFnZW50OiB7IC4uLmJhc2UsIGhhc19ub3RfcGVybWlzc2lvbnM6IHRydWUgfSB9XG4gIH1cbiAgaWYgKHBhcmFtcy5wcm9qZWN0RGVsZXRlZCkge1xuICAgIHJldHVybiB7XG4gICAgICByZWFzb246ICdwcm9qZWN0X2RlbGV0ZWQnLFxuICAgICAgYWdlbnQ6IHtcbiAgICAgICAgaWQ6IGFnZW50Tm9QZXJtaXNzaW9uLmlkLFxuICAgICAgICBuYW1lOiBhZ2VudE5vUGVybWlzc2lvbi5uYW1lLFxuICAgICAgICBlbW9qaTogYWdlbnROb1Blcm1pc3Npb24uZW1vamksXG4gICAgICAgIHR5cGU6IGFnZW50Tm9QZXJtaXNzaW9uLnR5cGUgYXMgQWdlbnRUeXBlLFxuICAgICAgICAuLi4oYWdlbnROb1Blcm1pc3Npb24uY29ubmVjdG9ycyA/IHsgY29ubmVjdG9yczogYWdlbnROb1Blcm1pc3Npb24uY29ubmVjdG9ycyB9IDoge30pLFxuICAgICAgICBwcm9qZWN0X2RlbGV0ZWQ6IHsgbmFtZTogcGFyYW1zLnByb2plY3REZWxldGVkLm5hbWUgfSxcbiAgICAgIH0sXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCB0eXBlIENoYXRMb2FkU2Vzc2lvbkFnZW50Q29udGV4dCA9IHtcbiAgYWdlbnREZWxldGVkOiBTZXNzaW9uQWdlbnREZWxldGVkIHwgbnVsbCB8IHVuZGVmaW5lZFxuICBhZ2VudE5vUGVybWlzc2lvbjogU2Vzc2lvbkFnZW50Tm9QZXJtaXNzaW9uIHwgbnVsbCB8IHVuZGVmaW5lZFxuICBhZ2VudHM6IEFnZW50W11cbiAgdXNlckNhblZpZXdBZ2VudHM6IGJvb2xlYW5cbiAgaGFzQWdlbnRBY2Nlc3M6IGJvb2xlYW5cbiAgaGFzQWdlbnRQZXJtaXNzaW9uOiBib29sZWFuXG4gIHByb2plY3REZWxldGVkPzogeyBuYW1lOiBzdHJpbmcgfSB8IG51bGxcbn1cblxuLyoqIFLDqXBsaWNhIGxhIGNhZGVuYSBkZSBgc2VsZWN0QWdlbnRgIGVuIGBsb2FkTWVzc2FnZXNgICjDumx0aW1hIHNlbGVjY2nDs24gZ2FuYSkuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZVNlc3Npb25BZ2VudEZyb21DaGF0TG9hZCA9IChjdHg6IENoYXRMb2FkU2Vzc2lvbkFnZW50Q29udGV4dCk6IEFnZW50IHwgbnVsbCA9PiB7XG4gIGNvbnN0IHsgYWdlbnREZWxldGVkLCBhZ2VudE5vUGVybWlzc2lvbiwgYWdlbnRzLCBwcm9qZWN0RGVsZXRlZCB9ID0gY3R4XG4gIGxldCBzZWxlY3RlZDogQWdlbnQgfCBudWxsID0gbnVsbFxuXG4gIGlmIChhZ2VudERlbGV0ZWQpIHtcbiAgICBzZWxlY3RlZCA9IGJ1aWxkRGVsZXRlZFNlc3Npb25BZ2VudChhZ2VudERlbGV0ZWQsIGFnZW50Tm9QZXJtaXNzaW9uKVxuICB9XG5cbiAgY29uc3QgYWdlbnRFeGlzdHNJbkxpc3QgPSBCb29sZWFuKFxuICAgIGFnZW50Tm9QZXJtaXNzaW9uICYmIGFnZW50cy5zb21lKGFnZW50SXRlbSA9PiBhZ2VudEl0ZW0uaWQgPT09IGFnZW50Tm9QZXJtaXNzaW9uLmlkKVxuICApXG5cbiAgaWYgKFxuICAgIHNob3VsZFNlbGVjdE9ycGhhblNlc3Npb25BZ2VudCh7XG4gICAgICBhZ2VudE5vUGVybWlzc2lvbixcbiAgICAgIGFnZW50RGVsZXRlZCxcbiAgICAgIHVzZXJDYW5WaWV3QWdlbnRzOiBjdHgudXNlckNhblZpZXdBZ2VudHMsXG4gICAgICBoYXNBZ2VudEFjY2VzczogY3R4Lmhhc0FnZW50QWNjZXNzLFxuICAgICAgaGFzQWdlbnRQZXJtaXNzaW9uOiBjdHguaGFzQWdlbnRQZXJtaXNzaW9uLFxuICAgICAgYWdlbnRFeGlzdHNJbkxpc3QsXG4gICAgfSkgJiZcbiAgICBhZ2VudE5vUGVybWlzc2lvblxuICApIHtcbiAgICBzZWxlY3RlZCA9IGJ1aWxkT3JwaGFuU2Vzc2lvbkFnZW50KGFnZW50Tm9QZXJtaXNzaW9uLCBwcm9qZWN0RGVsZXRlZClcbiAgfVxuXG4gIGlmIChcbiAgICBzaG91bGRNZXJnZUxpc3RlZFNlc3Npb25BZ2VudCh7XG4gICAgICBhZ2VudE5vUGVybWlzc2lvbixcbiAgICAgIGFnZW50RGVsZXRlZCxcbiAgICAgIGhhc0FnZW50QWNjZXNzOiBjdHguaGFzQWdlbnRBY2Nlc3MsXG4gICAgICBoYXNBZ2VudFBlcm1pc3Npb246IGN0eC5oYXNBZ2VudFBlcm1pc3Npb24sXG4gICAgICBhZ2VudEV4aXN0c0luTGlzdCxcbiAgICB9KSAmJlxuICAgIGFnZW50Tm9QZXJtaXNzaW9uXG4gICkge1xuICAgIGNvbnN0IGFnZW50SW5MaXN0ID0gYWdlbnRzLmZpbmQoYWdlbnRJdGVtID0+IGFnZW50SXRlbS5pZCA9PT0gYWdlbnROb1Blcm1pc3Npb24uaWQpXG4gICAgaWYgKGFnZW50SW5MaXN0KSB7XG4gICAgICBzZWxlY3RlZCA9IG1lcmdlTGlzdGVkU2Vzc2lvbkFnZW50KGFnZW50SW5MaXN0LCBhZ2VudE5vUGVybWlzc2lvbiwgcHJvamVjdERlbGV0ZWQpXG4gICAgfVxuICB9XG5cbiAgaWYgKGFnZW50Tm9QZXJtaXNzaW9uICYmICFhZ2VudERlbGV0ZWQpIHtcbiAgICBjb25zdCByZXN0cmljdGVkID0gcmVzb2x2ZVJlc3RyaWN0ZWRTZXNzaW9uQWdlbnQoYWdlbnROb1Blcm1pc3Npb24sIHtcbiAgICAgIGhhc0FnZW50QWNjZXNzOiBjdHguaGFzQWdlbnRBY2Nlc3MsXG4gICAgICBoYXNBZ2VudFBlcm1pc3Npb246IGN0eC5oYXNBZ2VudFBlcm1pc3Npb24sXG4gICAgICBwcm9qZWN0RGVsZXRlZCxcbiAgICB9KVxuICAgIGlmIChyZXN0cmljdGVkKSB7XG4gICAgICBzZWxlY3RlZCA9IHJlc3RyaWN0ZWQuYWdlbnRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2VsZWN0ZWRcbn1cblxuZXhwb3J0IGNvbnN0IGJ1aWxkU2Vzc2lvbkNvbnZlcnNhdGlvbk1ldGEgPSAoZmllbGRzOiB7XG4gIHByb2plY3RJZE1lc3NhZ2U/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIHByb2plY3ROYW1lRnJvbVNlc3Npb24/OiBzdHJpbmcgfCBudWxsXG4gIGNsaWVudElkRnJvbVNlc3Npb24/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIGNsaWVudE5hbWVGcm9tU2Vzc2lvbj86IHN0cmluZyB8IG51bGxcbiAgdGFza0lkRnJvbVNlc3Npb24/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIHRhc2tOYW1lRnJvbVNlc3Npb24/OiBzdHJpbmcgfCBudWxsXG59KTogU2Vzc2lvbkNvbnZlcnNhdGlvbk1ldGEgPT4gKHtcbiAgcHJvamVjdElkTWVzc2FnZTogZmllbGRzLnByb2plY3RJZE1lc3NhZ2UsXG4gIHByb2plY3ROYW1lRnJvbVNlc3Npb246IGZpZWxkcy5wcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICBjbGllbnRJZEZyb21TZXNzaW9uOiBmaWVsZHMuY2xpZW50SWRGcm9tU2Vzc2lvbixcbiAgY2xpZW50TmFtZUZyb21TZXNzaW9uOiBmaWVsZHMuY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICB0YXNrSWRGcm9tU2Vzc2lvbjogZmllbGRzLnRhc2tJZEZyb21TZXNzaW9uLFxuICB0YXNrTmFtZUZyb21TZXNzaW9uOiBmaWVsZHMudGFza05hbWVGcm9tU2Vzc2lvbixcbn0pXG5cbmV4cG9ydCBjb25zdCBidWlsZFNlc3Npb25NZXRhRXZlbnREZXRhaWwgPSAoXG4gIGNoYXRJZDogc3RyaW5nLFxuICBmaWVsZHM6IE9taXQ8U2Vzc2lvbk1ldGFFdmVudERldGFpbCwgJ2NoYXRJZCc+XG4pOiBTZXNzaW9uTWV0YUV2ZW50RGV0YWlsID0+ICh7XG4gIGNoYXRJZCxcbiAgYWdlbnRUeXBlOiBmaWVsZHMuYWdlbnRUeXBlLFxuICBhZ2VudEVudGl0eTogZmllbGRzLmFnZW50RW50aXR5LFxuICBwcm9qZWN0SWQ6IGZpZWxkcy5wcm9qZWN0SWQsXG4gIHByb2plY3ROYW1lOiBmaWVsZHMucHJvamVjdE5hbWUsXG4gIGNsaWVudElkOiBmaWVsZHMuY2xpZW50SWQsXG4gIGNsaWVudE5hbWU6IGZpZWxkcy5jbGllbnROYW1lLFxuICB0YXNrSWQ6IGZpZWxkcy50YXNrSWQsXG4gIHRhc2tOYW1lOiBmaWVsZHMudGFza05hbWUsXG59KVxuXG5leHBvcnQgY29uc3QgaGFzQ29udmVyc2F0aW9uUHJvamVjdENvbnRleHQgPSAocHJvamVjdElkTWVzc2FnZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT5cbiAgQm9vbGVhbihwcm9qZWN0SWRNZXNzYWdlKVxuXG5leHBvcnQgY29uc3QgcmV3cml0ZU1lc3NhZ2VzRm9yUHJvamVjdFRhc2tVcmxzID0gYXN5bmMgKFxuICBpdGVtczogQ2hhdE1lc3NhZ2VbXSxcbiAgcHJvamVjdElkTWVzc2FnZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgZ2V0VGFiVGFza0RlZmF1bHQ6IChwYWdlOiBudW1iZXIpID0+IFByb21pc2U8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD5cbik6IFByb21pc2U8Q2hhdE1lc3NhZ2VbXT4gPT4ge1xuICBpZiAoIWhhc0NvbnZlcnNhdGlvblByb2plY3RDb250ZXh0KHByb2plY3RJZE1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGl0ZW1zXG4gIH1cbiAgY29uc3QgdGFiID0gYXdhaXQgZ2V0VGFiVGFza0RlZmF1bHQoMSlcbiAgcmV0dXJuIHJld3JpdGVDaGF0TWVzc2FnZXNUYXNrVXJscyhpdGVtcywgcmVzb2x2ZVRhc2tVcmxUYWJTZWdtZW50KHRhYikpXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlRmluYWxNZXNzYWdlc1dpdGhBY3RpdmVTdHJlYW1pbmdUYWlsID0gKFxuICBpdGVtczogQ2hhdE1lc3NhZ2VbXSxcbiAgdGFpbDogQ2hhdE1lc3NhZ2VbXSxcbiAgc2Vzc2lvblN0YXR1czogU2Vzc2lvblN0YXR1cyB8IHVuZGVmaW5lZFxuKTogQ2hhdE1lc3NhZ2VbXSA9PiB7XG4gIGlmIChzZXNzaW9uU3RhdHVzICYmIGlzQWN0aXZlU2Vzc2lvblN0YXR1cyhzZXNzaW9uU3RhdHVzKSkge1xuICAgIHJldHVybiBtZXJnZUNoYXRNZXNzYWdlc1dpdGhBY3RpdmVTZXNzaW9uVGFpbChpdGVtcywgdGFpbClcbiAgfVxuICByZXR1cm4gaXRlbXNcbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZExvYWRNb3JlTWVzc2FnZXNPblNjcm9sbCA9IChcbiAgc2Nyb2xsVG9wOiBudW1iZXIsXG4gIHNjcm9sbEhlaWdodDogbnVtYmVyLFxuICBjbGllbnRIZWlnaHQ6IG51bWJlcixcbiAgdGhyZXNob2xkUGVyY2VudCA9IDkwXG4pOiBib29sZWFuID0+IHtcbiAgY29uc3Qgc2Nyb2xsYWJsZSA9IHNjcm9sbEhlaWdodCAtIGNsaWVudEhlaWdodFxuICBpZiAoc2Nyb2xsYWJsZSA8PSAwKSByZXR1cm4gZmFsc2VcbiAgY29uc3Qgc2Nyb2xsUGVyY2VudGFnZSA9IChzY3JvbGxUb3AgLyBzY3JvbGxhYmxlKSAqIDEwMFxuICByZXR1cm4gc2Nyb2xsUGVyY2VudGFnZSA+IHRocmVzaG9sZFBlcmNlbnRcbn1cblxuZXhwb3J0IGNvbnN0IG1lc3NhZ2VzTmVlZFRhYlJld3JpdGUgPSAobWVzc2FnZXM6IENoYXRNZXNzYWdlW10sIHRhYlRhc2tEZWZhdWx0OiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgY29uc3QgdGFza1VybFJlZ2V4ID0gbmV3IFJlZ0V4cChUQVNLX1VSTF9SRUdFWF9QQVRURVJOLCAnZycpXG4gIHJldHVybiBtZXNzYWdlcy5zb21lKG1zZyA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IG1zZy5tZXNzYWdlIHx8ICcnXG4gICAgY29uc3QgbWF0Y2hlcyA9IGNvbnRlbnQubWF0Y2godGFza1VybFJlZ2V4KVxuICAgIGlmICghbWF0Y2hlcz8ubGVuZ3RoKSByZXR1cm4gZmFsc2VcbiAgICByZXR1cm4gbWF0Y2hlcy5zb21lKHVybCA9PiAhdXJsLmVuZHNXaXRoKGAvJHt0YWJUYXNrRGVmYXVsdH1gKSAmJiAhdXJsLmluY2x1ZGVzKGAvJHt0YWJUYXNrRGVmYXVsdH0/YCkpXG4gIH0pXG59XG5cbmV4cG9ydCBjb25zdCB1cHNlcnRDaGF0TWVzc2FnZSA9IChwcmV2aW91czogQ2hhdE1lc3NhZ2VbXSwgbWVzc2FnZTogQ2hhdE1lc3NhZ2UpOiBDaGF0TWVzc2FnZVtdID0+IHtcbiAgY29uc3QgZXhpc3RpbmdNZXNzYWdlSW5kZXggPSBwcmV2aW91cy5maW5kSW5kZXgobXNnID0+IG1zZy5pZCA9PT0gbWVzc2FnZS5pZClcbiAgaWYgKGV4aXN0aW5nTWVzc2FnZUluZGV4ID49IDApIHtcbiAgICByZXR1cm4gcHJldmlvdXMubWFwKChtc2csIGluZGV4KSA9PiAoaW5kZXggPT09IGV4aXN0aW5nTWVzc2FnZUluZGV4ID8gbWVzc2FnZSA6IG1zZykpXG4gIH1cbiAgcmV0dXJuIFsuLi5wcmV2aW91cywgbWVzc2FnZV1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsU0FBU0EsbUJBQW1CLFFBQVEsNEJBQTRCO0FBQ2hFLFNBQVNDLHNCQUFzQixRQUFRLDBCQUEwQjtBQUNqRSxTQUFTQyxrQ0FBa0MsUUFBUSxzQ0FBc0M7QUFDekYsU0FBU0Msa0JBQWtCLFFBQVEsMkJBQTJCO0FBSTlELFNBQ0VDLHFCQUFxQixRQUloQixxQ0FBcUM7QUFJNUM7QUFDQSxPQUFPLElBQU1DLCtCQUErQixHQUFHLFNBQWxDQSwrQkFBK0JBLENBQUlDLGtCQUF1QztFQUFBLElBQUFDLHFCQUFBLEVBQUFDLHFCQUFBO0VBQUEsT0FDckZDLE9BQU8sQ0FDTEgsa0JBQWtCLEtBQ2pCLEVBQUFDLHFCQUFBLEdBQUFELGtCQUFrQixDQUFDSSxPQUFPLGNBQUFILHFCQUFBLHVCQUExQkEscUJBQUEsQ0FBNEJJLElBQUksQ0FBQyxDQUFDLE9BQUFILHFCQUFBLEdBQ2pDRixrQkFBa0IsQ0FBQ00sV0FBVyxjQUFBSixxQkFBQSx1QkFBOUJBLHFCQUFBLENBQWdDSyxNQUFNLEtBQ3RDUCxrQkFBa0IsQ0FBQ1EsS0FBSyxJQUN4QlIsa0JBQWtCLENBQUNTLElBQUksQ0FDM0IsQ0FBQztBQUFBOztBQUVIO0FBQ0EsT0FBTyxJQUFNQyxnQ0FBZ0MsR0FBRyxTQUFuQ0EsZ0NBQWdDQSxDQUFJQyxTQUFpQixFQUFXO0VBQzNFLElBQUFDLG1CQUFBLEdBQTREZixrQkFBa0IsQ0FBQyxDQUFDO0lBQXhFZ0IsaUJBQWlCLEdBQUFELG1CQUFBLENBQWpCQyxpQkFBaUI7SUFBRUMsWUFB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
|