@projectcor/maia-components 2.11.41 → 2.11.42-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/lib/App.js +22 -11
  2. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.js +38 -0
  3. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +184 -0
  4. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.js +39 -0
  5. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +432 -0
  6. package/lib/components/atoms/ContextMentionChip/index.js +4 -0
  7. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +225 -0
  8. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.styles.js +6 -0
  9. package/lib/components/atoms/ContextMentionEditor/index.js +2 -0
  10. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +282 -0
  11. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +148 -0
  12. package/lib/components/atoms/ContextMentionItem/index.js +2 -0
  13. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +160 -0
  14. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +79 -0
  15. package/lib/components/atoms/ContextMentionPopover/index.js +3 -0
  16. package/lib/components/atoms/EntitySelector/EntitySelector.js +47 -3
  17. package/lib/components/atoms/EntitySelector/EntitySelector.styles.js +3 -3
  18. package/lib/components/atoms/MAIAInput/MAIAInput.js +246 -321
  19. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +269 -0
  20. package/lib/components/atoms/MAIAInput/styles.js +75 -46
  21. package/lib/components/atoms/icons/NotionIcon.js +36 -0
  22. package/lib/components/atoms/icons/SubtaskIcon.js +36 -0
  23. package/lib/components/atoms/icons/index.js +2 -1
  24. package/lib/components/index.js +2 -1
  25. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.js +8 -4
  26. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +31 -3
  27. package/lib/components/molecules/ChatAIMessages/newStyles.js +5 -2
  28. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +8 -6
  29. package/lib/components/molecules/ChatFooter/ChatFooter.js +5 -4
  30. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +68 -0
  31. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.styles.js +6 -0
  32. package/lib/components/molecules/ContextMentionInput/index.js +2 -0
  33. package/lib/components/molecules/Sidebar/Sidebar.js +9 -5
  34. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +6 -2
  35. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +5 -2
  36. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +6 -3
  37. package/lib/constants/config.js +3 -1
  38. package/lib/constants/taskLinkIcon.js +6 -0
  39. package/lib/context/cor-user.js +1 -1
  40. package/lib/dev/DevContextMentionInput.js +65 -0
  41. package/lib/dev/Providers.js +11 -6
  42. package/lib/hooks/useCaretPosition.js +35 -0
  43. package/lib/hooks/useChatManager/useChatManager.interface.js +1 -1
  44. package/lib/hooks/useChatManager/useChatManager.js +21 -11
  45. package/lib/hooks/useChatMessages/useChatMessages.interface.js +1 -1
  46. package/lib/hooks/useChatMessages/useChatMessages.js +30 -14
  47. package/lib/hooks/useClientSearch.js +3 -2
  48. package/lib/hooks/useContextMentions.js +270 -0
  49. package/lib/hooks/useEntitySearch.js +1097 -0
  50. package/lib/hooks/useEvent.js +6 -1
  51. package/lib/hooks/useMentionAllowedTypes.js +103 -0
  52. package/lib/hooks/useMentionPopover.js +334 -0
  53. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +6 -4
  54. package/lib/hooks/useProjectSearch.js +3 -2
  55. package/lib/hooks/useRecentClientsSearch.js +3 -2
  56. package/lib/hooks/useTaskPanel.js +3 -10
  57. package/lib/hooks/useTextOverflowEllipsisTooltip.js +34 -0
  58. package/lib/lang/br/index.js +24 -1
  59. package/lib/lang/en/index.js +24 -1
  60. package/lib/lang/es/index.js +24 -1
  61. package/lib/lang/fr/index.js +23 -1
  62. package/lib/services/maia/Chats/getChatMessages.js +29 -4
  63. package/lib/services/maia/Orchestrator/orchestrator.js +8 -5
  64. package/lib/services/maia/RecentProjects/getRecentProjects.js +12 -4
  65. package/lib/services/maia/RecentTasks/getRecentTasks.js +54 -0
  66. package/lib/services/maia/RecentTasks/index.js +6 -0
  67. package/lib/services/maia/RecentUsers/getRecentUsers.js +59 -0
  68. package/lib/services/maia/RecentUsers/index.js +6 -0
  69. package/lib/services/query/entitySearchQuery.js +18 -0
  70. package/lib/services/query/usersDirectoryQuery.js +19 -0
  71. package/lib/services/utils/mapChatMessages.js +12 -5
  72. package/lib/types/Chat.js +1 -1
  73. package/lib/types/agent.js +1 -1
  74. package/lib/types/contextMention.js +37 -0
  75. package/lib/utils/contextMentionIcons.js +115 -0
  76. package/lib/utils/contextMentionLabel.js +4 -0
  77. package/lib/utils/contextMentionTypeLabel.js +17 -0
  78. package/lib/utils/maiaStreamdownRehypePlugins.js +27 -0
  79. package/lib/utils/openTaskInCorPanel.js +18 -0
  80. package/lib/utils/renderContextMentions.js +355 -0
  81. package/package.json +2 -1
@@ -0,0 +1,1097 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
4
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
5
+ import _typeof from "@babel/runtime/helpers/typeof";
6
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
7
+ 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; }
8
+ 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; }
9
+ import { useLazyQuery } from '@apollo/client';
10
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
11
+ import { getRecentClients } from '../services/maia/RecentClients/getRecentClients';
12
+ import { getRecentProjects } from '../services/maia/RecentProjects/getRecentProjects';
13
+ import { getRecentTasks } from '../services/maia/RecentTasks/getRecentTasks';
14
+ import { useUser } from '../context/cor-user';
15
+ import { PROJECTS_FALLBACK, SEARCH_ENTITIES, TASK_FAMILY_FALLBACK } from '../services/query/entitySearchQuery';
16
+ import { SEARCH_CLIENTS } from '../services/query/ClientSearchQuery';
17
+ import { USERS_DIRECTORY } from '../services/query/usersDirectoryQuery';
18
+ import { SEARCH_QUERY_DEBOUNCE_MS } from '../constants/config';
19
+ import { useDebounce } from './useDebounce';
20
+ import { useT } from './useT';
21
+ var normalizePositiveInt = function normalizePositiveInt(value, fallback) {
22
+ var parsed = Number(value);
23
+ if (!Number.isFinite(parsed)) return fallback;
24
+ var normalized = Math.floor(parsed);
25
+ return normalized > 0 ? normalized : fallback;
26
+ };
27
+
28
+ /**
29
+ * Restringe los resultados al `clientId`/`projectId` del agente activo.
30
+ * Cuando el agente está scopeado a un client/project, tanto los recents como
31
+ * el search deben filtrar por ese contexto. Si el backend no entiende algún
32
+ * campo lo ignora y se cae al comportamiento global.
33
+ */
34
+
35
+ var BASE_FILTERS_BY_TYPE = {
36
+ project: {
37
+ project: 'true',
38
+ archived: 'all'
39
+ },
40
+ task: {
41
+ task: 'true',
42
+ archived: 'false'
43
+ }
44
+ };
45
+
46
+ /**
47
+ * Entradas para el argumento GraphQL `extra` (JSON string de array) al buscar tareas con contexto.
48
+ * Ej.: [{"projectId":"881552"}]
49
+ */
50
+ var buildTaskSearchExtraEntries = function buildTaskSearchExtraEntries(scope) {
51
+ var rawClient = (scope === null || scope === void 0 ? void 0 : scope.clientId) !== undefined && (scope === null || scope === void 0 ? void 0 : scope.clientId) !== null && (scope === null || scope === void 0 ? void 0 : scope.clientId) !== '' ? String(scope.clientId) : null;
52
+ var rawProject = (scope === null || scope === void 0 ? void 0 : scope.projectId) !== undefined && (scope === null || scope === void 0 ? void 0 : scope.projectId) !== null && (scope === null || scope === void 0 ? void 0 : scope.projectId) !== '' ? String(scope.projectId) : null;
53
+ var agentEntity = scope === null || scope === void 0 ? void 0 : scope.agentEntity;
54
+ var entries = [];
55
+ var pushClient = function pushClient() {
56
+ if (rawClient) entries.push({
57
+ clientId: rawClient
58
+ });
59
+ };
60
+ var pushProject = function pushProject() {
61
+ if (rawProject) entries.push({
62
+ projectId: rawProject
63
+ });
64
+ };
65
+ if (agentEntity === 'project') {
66
+ if (rawProject) {
67
+ pushProject();
68
+ } else if (rawClient) {
69
+ pushClient();
70
+ }
71
+ } else if (agentEntity === 'client') {
72
+ pushClient();
73
+ pushProject();
74
+ } else {
75
+ pushClient();
76
+ pushProject();
77
+ }
78
+ return entries;
79
+ };
80
+ var buildTaskSearchExtra = function buildTaskSearchExtra(scope) {
81
+ var entries = buildTaskSearchExtraEntries(scope);
82
+ if (entries.length === 0) return undefined;
83
+ return JSON.stringify(entries);
84
+ };
85
+
86
+ /**
87
+ * Tab proyecto: con `clientId` en el scope, `extra` acota la búsqueda a proyectos de ese cliente.
88
+ * Ej.: `[{"clientId":"47105"}]` junto a `filters` `{"project":"true","archived":"all"}`.
89
+ */
90
+ var buildProjectSearchExtra = function buildProjectSearchExtra(scope) {
91
+ var rawClient = (scope === null || scope === void 0 ? void 0 : scope.clientId) !== undefined && (scope === null || scope === void 0 ? void 0 : scope.clientId) !== null && (scope === null || scope === void 0 ? void 0 : scope.clientId) !== '' ? String(scope.clientId) : null;
92
+ if (!rawClient) return undefined;
93
+ return JSON.stringify([{
94
+ clientId: rawClient
95
+ }]);
96
+ };
97
+ var buildSearchEntitiesExtra = function buildSearchEntitiesExtra(type, scope) {
98
+ if (type === 'task') return buildTaskSearchExtra(scope);
99
+ if (type === 'project') return buildProjectSearchExtra(scope);
100
+ return undefined;
101
+ };
102
+
103
+ /**
104
+ * Tab `task` / `project`: `filters` sólo tipo + archived (tareas: no archivadas); scope (clientId / projectId en tareas) en `extra`.
105
+ */
106
+ var buildFiltersForType = function buildFiltersForType(type) {
107
+ if (type === 'project') {
108
+ return JSON.stringify(BASE_FILTERS_BY_TYPE.project);
109
+ }
110
+ return JSON.stringify(BASE_FILTERS_BY_TYPE.task);
111
+ };
112
+
113
+ /**
114
+ * Filtros para usersDirectory. El backend espera un JSON string con
115
+ * withPosition, withTeams y searchInput. Le agregamos clientId/projectId
116
+ * del scope en caso de que el backend los aproveche para filtrar por
117
+ * contexto (si no los entiende los ignora).
118
+ */
119
+ var buildUsersDirectoryFilters = function buildUsersDirectoryFilters(q) {
120
+ var base = {
121
+ withPosition: true,
122
+ withTeams: true
123
+ };
124
+ var trimmedQ = q.trim();
125
+ if (trimmedQ) {
126
+ base.searchInput = trimmedQ;
127
+ }
128
+ return JSON.stringify(base);
129
+ };
130
+ var highlightRange = function highlightRange(text, searchValue) {
131
+ if (!searchValue) return undefined;
132
+ var idx = text.toLowerCase().indexOf(searchValue.toLowerCase());
133
+ if (idx < 0) return undefined;
134
+ return {
135
+ start: idx,
136
+ length: searchValue.length
137
+ };
138
+ };
139
+ var firstDefined = function firstDefined() {
140
+ for (var _len = arguments.length, values = new Array(_len), _key = 0; _key < _len; _key++) {
141
+ values[_key] = arguments[_key];
142
+ }
143
+ return values.find(function (value) {
144
+ return value !== undefined && value !== null;
145
+ });
146
+ };
147
+ var normalizeTrimmedString = function normalizeTrimmedString(value) {
148
+ if (typeof value !== 'string') return '';
149
+ return value.trim();
150
+ };
151
+ var getUserPositionName = function getUserPositionName(userPosition) {
152
+ if (typeof userPosition === 'string') return userPosition.trim();
153
+ if (userPosition && _typeof(userPosition) === 'object' && 'name' in userPosition) {
154
+ return normalizeTrimmedString(userPosition.name);
155
+ }
156
+ return '';
157
+ };
158
+ var mapClientToItem = function mapClientToItem(c, searchValue) {
159
+ var _c$totalProyectos, _c$totalProyectos2;
160
+ return {
161
+ id: c.id,
162
+ type: 'client',
163
+ primary: c.name,
164
+ primaryHighlight: highlightRange(c.name, searchValue),
165
+ breadcrumb: {
166
+ count: (_c$totalProyectos = c.totalProyectos) !== null && _c$totalProyectos !== void 0 ? _c$totalProyectos : undefined,
167
+ countLabel: 'projects'
168
+ },
169
+ raw: {
170
+ id: c.id,
171
+ name: c.name,
172
+ totalProyectos: (_c$totalProyectos2 = c.totalProyectos) !== null && _c$totalProyectos2 !== void 0 ? _c$totalProyectos2 : null
173
+ }
174
+ };
175
+ };
176
+ var mapUserToItem = function mapUserToItem(u, searchValue) {
177
+ var _u$firstName, _u$lastName, _u$picture, _u$positionName, _u$email;
178
+ var fullName = "".concat((_u$firstName = u.firstName) !== null && _u$firstName !== void 0 ? _u$firstName : '', " ").concat((_u$lastName = u.lastName) !== null && _u$lastName !== void 0 ? _u$lastName : '').trim();
179
+ var primary = fullName || u.email || String(u.id);
180
+ return {
181
+ id: u.id,
182
+ type: 'user',
183
+ primary: primary,
184
+ primaryHighlight: highlightRange(primary, searchValue),
185
+ raw: {
186
+ id: u.id,
187
+ name: primary,
188
+ picture: (_u$picture = u.picture) !== null && _u$picture !== void 0 ? _u$picture : null,
189
+ positionName: (_u$positionName = u.positionName) !== null && _u$positionName !== void 0 ? _u$positionName : null,
190
+ email: (_u$email = u.email) !== null && _u$email !== void 0 ? _u$email : null
191
+ }
192
+ };
193
+ };
194
+ var mapCorUserToUserItem = function mapCorUserToUserItem(user, searchValue, meLabel) {
195
+ var _user$firstName, _user$lastName;
196
+ var fullName = "".concat((_user$firstName = user.firstName) !== null && _user$firstName !== void 0 ? _user$firstName : '', " ").concat((_user$lastName = user.lastName) !== null && _user$lastName !== void 0 ? _user$lastName : '').trim();
197
+ /** Solo cargo real; sin fallback a `role` (la UI muestra “Sin posición” si falta). */
198
+ var positionLine = getUserPositionName(user.user_position) || null;
199
+ var email = normalizeTrimmedString(user.email) || null;
200
+ return {
201
+ id: user.id,
202
+ type: 'user',
203
+ primary: meLabel,
204
+ primaryHighlight: highlightRange(meLabel, searchValue),
205
+ raw: {
206
+ id: user.id,
207
+ name: fullName || String(user.id),
208
+ picture: user.picture || null,
209
+ positionName: positionLine,
210
+ email: email
211
+ }
212
+ };
213
+ };
214
+ var mapRecentTaskToItem = function mapRecentTaskToItem(task, searchValue) {
215
+ var _task$projectName;
216
+ var showProjectNameInTaskRow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
217
+ var primary = task.title && task.title.trim() || String(task.id);
218
+ var projectName = showProjectNameInTaskRow ? (_task$projectName = task.projectName) !== null && _task$projectName !== void 0 ? _task$projectName : null : null;
219
+ return {
220
+ id: task.id,
221
+ type: 'task',
222
+ primary: primary,
223
+ primaryHighlight: highlightRange(primary, searchValue),
224
+ breadcrumb: projectName ? {
225
+ parent: projectName
226
+ } : undefined,
227
+ raw: {
228
+ id: task.id,
229
+ name: primary,
230
+ projectName: projectName
231
+ }
232
+ };
233
+ };
234
+ var normalizeTaskFamilyRecord = function normalizeTaskFamilyRecord(record) {
235
+ var _record$title, _firstDefined, _record$project, _record$father, _record$father2;
236
+ var taskFamilyId = record._id;
237
+ var id = taskFamilyId;
238
+ if (id === undefined || id === null || String(id) === '') return null;
239
+ var title = ((_record$title = record.title) !== null && _record$title !== void 0 ? _record$title : '').trim() || String(id);
240
+ var projectName = (_firstDefined = firstDefined((_record$project = record.project) === null || _record$project === void 0 ? void 0 : _record$project.name, (_record$father = record.father) === null || _record$father === void 0 ? void 0 : _record$father.title)) !== null && _firstDefined !== void 0 ? _firstDefined : null;
241
+ var hasFather = !!firstDefined(record.taskFather, (_record$father2 = record.father) === null || _record$father2 === void 0 ? void 0 : _record$father2.id);
242
+ return {
243
+ id: id,
244
+ title: title,
245
+ type: hasFather ? 'subtask' : 'task',
246
+ projectName: projectName
247
+ };
248
+ };
249
+ var normalizeProjectsFallbackRecord = function normalizeProjectsFallbackRecord(record) {
250
+ var _record$name, _firstDefined2, _record$client, _record$client$name, _record$client2;
251
+ var id = record.id;
252
+ if (id === undefined || id === null || String(id) === '') return null;
253
+ var title = (_record$name = record.name) !== null && _record$name !== void 0 ? _record$name : '';
254
+ var clientId = (_firstDefined2 = firstDefined(record.clientId, (_record$client = record.client) === null || _record$client === void 0 ? void 0 : _record$client.id)) !== null && _firstDefined2 !== void 0 ? _firstDefined2 : null;
255
+ var clientName = (_record$client$name = (_record$client2 = record.client) === null || _record$client2 === void 0 ? void 0 : _record$client2.name) !== null && _record$client$name !== void 0 ? _record$client$name : null;
256
+ return {
257
+ id: id,
258
+ title: title,
259
+ type: 'project',
260
+ clientId: clientId,
261
+ clientName: clientName
262
+ };
263
+ };
264
+ var mapSearchToItem = function mapSearchToItem(r, type, searchValue) {
265
+ var _r$projectName, _r$projectName2, _r$clientId, _r$clientName, _r$feeId, _father$title;
266
+ var showProjectNameInTaskRow = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
267
+ var primary = r.title || r.projectName || '';
268
+ var parent;
269
+ if (type === 'project') parent = r.clientName;else if (type === 'task') parent = undefined;else parent = (_r$projectName = r.projectName) !== null && _r$projectName !== void 0 ? _r$projectName : r.clientName;
270
+ var father = type === 'task' ? r.father : null;
271
+ var hasFather = type === 'task' && father != null && father.id != null && String(father.id).length > 0;
272
+ var taskProjectName = type === 'task' && !showProjectNameInTaskRow ? null : (_r$projectName2 = r.projectName) !== null && _r$projectName2 !== void 0 ? _r$projectName2 : null;
273
+ return {
274
+ id: r.id,
275
+ type: type,
276
+ primary: primary,
277
+ primaryHighlight: highlightRange(primary, searchValue),
278
+ breadcrumb: parent ? {
279
+ parent: parent
280
+ } : undefined,
281
+ raw: {
282
+ id: r.id,
283
+ name: primary,
284
+ clientId: (_r$clientId = r.clientId) !== null && _r$clientId !== void 0 ? _r$clientId : null,
285
+ clientName: (_r$clientName = r.clientName) !== null && _r$clientName !== void 0 ? _r$clientName : null,
286
+ projectName: taskProjectName,
287
+ feeId: (_r$feeId = r.feeId) !== null && _r$feeId !== void 0 ? _r$feeId : null,
288
+ fatherId: hasFather ? father.id : null,
289
+ fatherTitle: hasFather ? ((_father$title = father.title) === null || _father$title === void 0 ? void 0 : _father$title.trim()) || null : null
290
+ }
291
+ };
292
+ };
293
+ var formatMcpPrimaryLabel = function formatMcpPrimaryLabel(slug) {
294
+ return slug.replace(/_/g, ' ').replace(/\b\w/g, function (_char) {
295
+ return _char.toUpperCase();
296
+ });
297
+ };
298
+ var mapMcpSlugsToItems = function mapMcpSlugsToItems(slugs, searchValue) {
299
+ var q = searchValue.trim().toLowerCase();
300
+ var filtered = slugs;
301
+ if (q) {
302
+ filtered = slugs.filter(function (s) {
303
+ var primary = formatMcpPrimaryLabel(s);
304
+ return s.toLowerCase().includes(q) || primary.toLowerCase().includes(q);
305
+ });
306
+ }
307
+ return filtered.map(function (slug) {
308
+ var primary = formatMcpPrimaryLabel(slug);
309
+ return {
310
+ id: slug,
311
+ type: 'mcp',
312
+ primary: primary,
313
+ primaryHighlight: highlightRange(primary, searchValue),
314
+ raw: {
315
+ id: slug,
316
+ name: primary
317
+ }
318
+ };
319
+ });
320
+ };
321
+ export var useEntitySearch = function useEntitySearch(type, scope) {
322
+ var _scope$mcpSlugs;
323
+ var corUser = useUser();
324
+ var _useT = useT(),
325
+ t = _useT.t;
326
+ /** Evita aplicar resultados de un `fetchRecent` viejo cuando el usuario ya cambió de tab (race async). */
327
+ var recentsFetchGenerationRef = useRef(0);
328
+ var _useState = useState(''),
329
+ _useState2 = _slicedToArray(_useState, 2),
330
+ searchValue = _useState2[0],
331
+ setSearchValue = _useState2[1];
332
+ var debouncedSearchValue = useDebounce(searchValue, SEARCH_QUERY_DEBOUNCE_MS);
333
+ var _useState3 = useState([]),
334
+ _useState4 = _slicedToArray(_useState3, 2),
335
+ items = _useState4[0],
336
+ setItems = _useState4[1];
337
+ var _useState5 = useState(false),
338
+ _useState6 = _slicedToArray(_useState5, 2),
339
+ loading = _useState6[0],
340
+ setLoading = _useState6[1];
341
+ var _useState7 = useState(false),
342
+ _useState8 = _slicedToArray(_useState7, 2),
343
+ error = _useState8[0],
344
+ setError = _useState8[1];
345
+ var _useState9 = useState(false),
346
+ _useState0 = _slicedToArray(_useState9, 2),
347
+ hideRecentsLabel = _useState0[0],
348
+ setHideRecentsLabel = _useState0[1];
349
+ var _useState1 = useState(false),
350
+ _useState10 = _slicedToArray(_useState1, 2),
351
+ hasMore = _useState10[0],
352
+ setHasMore = _useState10[1];
353
+ var _useState11 = useState(false),
354
+ _useState12 = _slicedToArray(_useState11, 2),
355
+ isLoadingMore = _useState12[0],
356
+ setIsLoadingMore = _useState12[1];
357
+ var _useState13 = useState(1),
358
+ _useState14 = _slicedToArray(_useState13, 2),
359
+ currentPage = _useState14[0],
360
+ setCurrentPage = _useState14[1];
361
+ var _useState15 = useState('none'),
362
+ _useState16 = _slicedToArray(_useState15, 2),
363
+ activePaginationSource = _useState16[0],
364
+ setActivePaginationSource = _useState16[1];
365
+ var mcpSlugsKey = ((_scope$mcpSlugs = scope === null || scope === void 0 ? void 0 : scope.mcpSlugs) !== null && _scope$mcpSlugs !== void 0 ? _scope$mcpSlugs : []).join('|');
366
+ var showProjectNameInTaskRow = (scope === null || scope === void 0 ? void 0 : scope.agentEntity) !== 'project';
367
+
368
+ // Estabilizamos el scope para no disparar fetchs por cambios de identidad de objeto.
369
+ var stableScope = useMemo(function () {
370
+ var _scope$clientId, _scope$projectId, _scope$mcpSlugs2, _scope$agentEntity;
371
+ return {
372
+ clientId: (_scope$clientId = scope === null || scope === void 0 ? void 0 : scope.clientId) !== null && _scope$clientId !== void 0 ? _scope$clientId : null,
373
+ projectId: (_scope$projectId = scope === null || scope === void 0 ? void 0 : scope.projectId) !== null && _scope$projectId !== void 0 ? _scope$projectId : null,
374
+ mcpSlugs: (_scope$mcpSlugs2 = scope === null || scope === void 0 ? void 0 : scope.mcpSlugs) !== null && _scope$mcpSlugs2 !== void 0 ? _scope$mcpSlugs2 : [],
375
+ agentEntity: (_scope$agentEntity = scope === null || scope === void 0 ? void 0 : scope.agentEntity) !== null && _scope$agentEntity !== void 0 ? _scope$agentEntity : null
376
+ };
377
+ }, [scope === null || scope === void 0 ? void 0 : scope.clientId, scope === null || scope === void 0 ? void 0 : scope.projectId, mcpSlugsKey, scope === null || scope === void 0 ? void 0 : scope.agentEntity]);
378
+
379
+ // --- Search: project | task (GraphQL: search) ---
380
+ var _useLazyQuery = useLazyQuery(SEARCH_ENTITIES, {
381
+ variables: {
382
+ limit: 20
383
+ },
384
+ fetchPolicy: 'network-only'
385
+ }),
386
+ _useLazyQuery2 = _slicedToArray(_useLazyQuery, 2),
387
+ fetchSearchEntities = _useLazyQuery2[0],
388
+ _useLazyQuery2$ = _useLazyQuery2[1],
389
+ searchData = _useLazyQuery2$.data,
390
+ searchLoading = _useLazyQuery2$.loading,
391
+ searchError = _useLazyQuery2$.error;
392
+
393
+ // --- Search: client (GraphQL) ---
394
+ var _useLazyQuery3 = useLazyQuery(SEARCH_CLIENTS, {
395
+ fetchPolicy: 'network-only'
396
+ }),
397
+ _useLazyQuery4 = _slicedToArray(_useLazyQuery3, 2),
398
+ fetchSearchClients = _useLazyQuery4[0],
399
+ _useLazyQuery4$ = _useLazyQuery4[1],
400
+ clientsData = _useLazyQuery4$.data,
401
+ clientsLoading = _useLazyQuery4$.loading,
402
+ clientsError = _useLazyQuery4$.error;
403
+
404
+ // --- Search: user (GraphQL: usersDirectory) ---
405
+ var _useLazyQuery5 = useLazyQuery(USERS_DIRECTORY, {
406
+ fetchPolicy: 'network-only'
407
+ }),
408
+ _useLazyQuery6 = _slicedToArray(_useLazyQuery5, 2),
409
+ fetchUsersDirectory = _useLazyQuery6[0],
410
+ _useLazyQuery6$ = _useLazyQuery6[1],
411
+ usersData = _useLazyQuery6$.data,
412
+ usersLoading = _useLazyQuery6$.loading,
413
+ usersError = _useLazyQuery6$.error;
414
+ var syncUsersPagination = useCallback(function (payload) {
415
+ var _payload$usersDirecto, _payload$usersDirecto2;
416
+ var page = normalizePositiveInt(payload === null || payload === void 0 || (_payload$usersDirecto = payload.usersDirectory) === null || _payload$usersDirecto === void 0 ? void 0 : _payload$usersDirecto.page, 1);
417
+ var lastPage = normalizePositiveInt(payload === null || payload === void 0 || (_payload$usersDirecto2 = payload.usersDirectory) === null || _payload$usersDirecto2 === void 0 ? void 0 : _payload$usersDirecto2.lastPage, page);
418
+ setCurrentPage(page);
419
+ setHasMore(page < lastPage);
420
+ }, []);
421
+ var syncClientsPagination = useCallback(function (payload) {
422
+ var _payload$clients, _payload$clients2;
423
+ var page = normalizePositiveInt(payload === null || payload === void 0 || (_payload$clients = payload.clients) === null || _payload$clients === void 0 ? void 0 : _payload$clients.page, 1);
424
+ var lastPage = normalizePositiveInt(payload === null || payload === void 0 || (_payload$clients2 = payload.clients) === null || _payload$clients2 === void 0 ? void 0 : _payload$clients2.lastPage, page);
425
+ setCurrentPage(page);
426
+ setHasMore(page < lastPage);
427
+ }, []);
428
+ var syncTaskFallbackPagination = useCallback(function (payload) {
429
+ var _payload$taskFamily, _payload$taskFamily2;
430
+ var rawPage = Number(payload === null || payload === void 0 || (_payload$taskFamily = payload.taskFamily) === null || _payload$taskFamily === void 0 ? void 0 : _payload$taskFamily.page);
431
+ // taskFamily usa páginas 0-based; convertimos a 1-based para consistencia con el resto
432
+ var page = Number.isFinite(rawPage) && rawPage >= 0 ? Math.floor(rawPage) + 1 : 1;
433
+ var lastPage = normalizePositiveInt(payload === null || payload === void 0 || (_payload$taskFamily2 = payload.taskFamily) === null || _payload$taskFamily2 === void 0 ? void 0 : _payload$taskFamily2.lastPage, page);
434
+ setCurrentPage(page);
435
+ setHasMore(page < lastPage);
436
+ }, []);
437
+ var syncProjectFallbackPagination = useCallback(function (payload) {
438
+ var _payload$projects, _payload$projects2;
439
+ var page = normalizePositiveInt(payload === null || payload === void 0 || (_payload$projects = payload.projects) === null || _payload$projects === void 0 ? void 0 : _payload$projects.page, 1);
440
+ var lastPage = normalizePositiveInt(payload === null || payload === void 0 || (_payload$projects2 = payload.projects) === null || _payload$projects2 === void 0 ? void 0 : _payload$projects2.lastPage, page);
441
+ setCurrentPage(page);
442
+ setHasMore(page < lastPage);
443
+ }, []);
444
+ var _useLazyQuery7 = useLazyQuery(TASK_FAMILY_FALLBACK, {
445
+ fetchPolicy: 'network-only'
446
+ }),
447
+ _useLazyQuery8 = _slicedToArray(_useLazyQuery7, 1),
448
+ fetchTaskFamilyFallback = _useLazyQuery8[0];
449
+ var _useLazyQuery9 = useLazyQuery(PROJECTS_FALLBACK, {
450
+ fetchPolicy: 'network-only'
451
+ }),
452
+ _useLazyQuery0 = _slicedToArray(_useLazyQuery9, 1),
453
+ fetchProjectsFallback = _useLazyQuery0[0];
454
+ var fetchRecent = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
455
+ var generation, _stableScope$mcpSlugs, slugs, data, mapped, _data, _mapped, _fallbackData$project, _fallbackData$project2, argumentsFilter, _yield$fetchProjectsF, fallbackData, fallbackMapped, recentTaskFilters, _data2, taskItems, _fallbackData$taskFam, _fallbackData$taskFam2, filter, _yield$fetchTaskFamil, _fallbackData, _data3$usersDirectory, _data3$usersDirectory2, _yield$fetchUsersDire, _data3, _mapped2, meItem, withoutMe, _t;
456
+ return _regeneratorRuntime.wrap(function (_context) {
457
+ while (1) switch (_context.prev = _context.next) {
458
+ case 0:
459
+ recentsFetchGenerationRef.current += 1;
460
+ generation = recentsFetchGenerationRef.current;
461
+ if (!(type === 'mcp')) {
462
+ _context.next = 1;
463
+ break;
464
+ }
465
+ slugs = (_stableScope$mcpSlugs = stableScope.mcpSlugs) !== null && _stableScope$mcpSlugs !== void 0 ? _stableScope$mcpSlugs : [];
466
+ setLoading(false);
467
+ setError(false);
468
+ setItems(mapMcpSlugsToItems(slugs, ''));
469
+ setHideRecentsLabel(false);
470
+ setActivePaginationSource('none');
471
+ setHasMore(false);
472
+ return _context.abrupt("return");
473
+ case 1:
474
+ setLoading(true);
475
+ setError(false);
476
+ _context.prev = 2;
477
+ if (!(type === 'client')) {
478
+ _context.next = 6;
479
+ break;
480
+ }
481
+ _context.next = 3;
482
+ return getRecentClients();
483
+ case 3:
484
+ data = _context.sent;
485
+ if (!(generation !== recentsFetchGenerationRef.current)) {
486
+ _context.next = 4;
487
+ break;
488
+ }
489
+ return _context.abrupt("return");
490
+ case 4:
491
+ mapped = (data !== null && data !== void 0 ? data : []).map(function (c) {
492
+ return mapClientToItem(c, '');
493
+ });
494
+ if (!(generation !== recentsFetchGenerationRef.current)) {
495
+ _context.next = 5;
496
+ break;
497
+ }
498
+ return _context.abrupt("return");
499
+ case 5:
500
+ setItems(mapped);
501
+ setHideRecentsLabel(false);
502
+ setActivePaginationSource('none');
503
+ setHasMore(false);
504
+ _context.next = 28;
505
+ break;
506
+ case 6:
507
+ if (!(type === 'project')) {
508
+ _context.next = 14;
509
+ break;
510
+ }
511
+ _context.next = 7;
512
+ return getRecentProjects(stableScope.clientId ? {
513
+ clientId: stableScope.clientId
514
+ } : undefined);
515
+ case 7:
516
+ _data = _context.sent;
517
+ if (!(generation !== recentsFetchGenerationRef.current)) {
518
+ _context.next = 8;
519
+ break;
520
+ }
521
+ return _context.abrupt("return");
522
+ case 8:
523
+ _mapped = (Array.isArray(_data) ? _data : []).map(function (p) {
524
+ return mapSearchToItem({
525
+ id: p.id,
526
+ title: p.title,
527
+ type: 'project',
528
+ clientId: p.clientId,
529
+ feeId: p.feeId,
530
+ clientName: p.clientName
531
+ }, 'project', '');
532
+ });
533
+ if (!(_mapped.length === 0)) {
534
+ _context.next = 11;
535
+ break;
536
+ }
537
+ argumentsFilter = stableScope.clientId !== null && stableScope.clientId !== undefined && stableScope.clientId !== '' ? {
538
+ client_id: [String(stableScope.clientId)]
539
+ } : undefined;
540
+ _context.next = 9;
541
+ return fetchProjectsFallback({
542
+ variables: _objectSpread(_objectSpread({}, argumentsFilter ? {
543
+ arguments: argumentsFilter
544
+ } : {}), {}, {
545
+ page: 1,
546
+ perPage: 20
547
+ })
548
+ });
549
+ case 9:
550
+ _yield$fetchProjectsF = _context.sent;
551
+ fallbackData = _yield$fetchProjectsF.data;
552
+ if (!(generation !== recentsFetchGenerationRef.current)) {
553
+ _context.next = 10;
554
+ break;
555
+ }
556
+ return _context.abrupt("return");
557
+ case 10:
558
+ fallbackMapped = ((_fallbackData$project = fallbackData === null || fallbackData === void 0 || (_fallbackData$project2 = fallbackData.projects) === null || _fallbackData$project2 === void 0 ? void 0 : _fallbackData$project2.data) !== null && _fallbackData$project !== void 0 ? _fallbackData$project : []).map(normalizeProjectsFallbackRecord).filter(function (item) {
559
+ return item !== null;
560
+ }).map(function (item) {
561
+ return mapSearchToItem(item, 'project', '');
562
+ });
563
+ _mapped = fallbackMapped;
564
+ setHideRecentsLabel(fallbackMapped.length > 0);
565
+ setActivePaginationSource('project-fallback');
566
+ syncProjectFallbackPagination(fallbackData);
567
+ _context.next = 12;
568
+ break;
569
+ case 11:
570
+ setHideRecentsLabel(false);
571
+ setActivePaginationSource('none');
572
+ setHasMore(false);
573
+ case 12:
574
+ if (!(generation !== recentsFetchGenerationRef.current)) {
575
+ _context.next = 13;
576
+ break;
577
+ }
578
+ return _context.abrupt("return");
579
+ case 13:
580
+ setItems(_mapped);
581
+ _context.next = 28;
582
+ break;
583
+ case 14:
584
+ if (!(type === 'task')) {
585
+ _context.next = 22;
586
+ break;
587
+ }
588
+ if (stableScope.agentEntity === 'project') {
589
+ recentTaskFilters = {
590
+ projectId: stableScope.projectId
591
+ };
592
+ } else if (stableScope.agentEntity === 'client') {
593
+ recentTaskFilters = {
594
+ clientId: stableScope.clientId
595
+ };
596
+ }
597
+ _context.next = 15;
598
+ return getRecentTasks(recentTaskFilters);
599
+ case 15:
600
+ _data2 = _context.sent;
601
+ if (!(generation !== recentsFetchGenerationRef.current)) {
602
+ _context.next = 16;
603
+ break;
604
+ }
605
+ return _context.abrupt("return");
606
+ case 16:
607
+ taskItems = (_data2 !== null && _data2 !== void 0 ? _data2 : []).map(function (task) {
608
+ return mapRecentTaskToItem(task, '', showProjectNameInTaskRow);
609
+ });
610
+ if (!(taskItems.length === 0)) {
611
+ _context.next = 19;
612
+ break;
613
+ }
614
+ filter = {};
615
+ if (stableScope.projectId !== null && stableScope.projectId !== undefined && stableScope.projectId !== '') {
616
+ filter.projectIds = [String(stableScope.projectId)];
617
+ }
618
+ if (stableScope.clientId !== null && stableScope.clientId !== undefined && stableScope.clientId !== '') {
619
+ filter.clientIds = [String(stableScope.clientId)];
620
+ }
621
+ _context.next = 17;
622
+ return fetchTaskFamilyFallback({
623
+ variables: {
624
+ filter: _objectSpread({
625
+ archived: false
626
+ }, filter),
627
+ pagination: {
628
+ offset: 0,
629
+ size: 20
630
+ }
631
+ }
632
+ });
633
+ case 17:
634
+ _yield$fetchTaskFamil = _context.sent;
635
+ _fallbackData = _yield$fetchTaskFamil.data;
636
+ if (!(generation !== recentsFetchGenerationRef.current)) {
637
+ _context.next = 18;
638
+ break;
639
+ }
640
+ return _context.abrupt("return");
641
+ case 18:
642
+ taskItems = ((_fallbackData$taskFam = _fallbackData === null || _fallbackData === void 0 || (_fallbackData$taskFam2 = _fallbackData.taskFamily) === null || _fallbackData$taskFam2 === void 0 ? void 0 : _fallbackData$taskFam2.data) !== null && _fallbackData$taskFam !== void 0 ? _fallbackData$taskFam : []).map(normalizeTaskFamilyRecord).filter(function (item) {
643
+ return item !== null;
644
+ }).map(function (task) {
645
+ return mapRecentTaskToItem(task, '', showProjectNameInTaskRow);
646
+ });
647
+ setHideRecentsLabel(taskItems.length > 0);
648
+ setActivePaginationSource('task-fallback');
649
+ syncTaskFallbackPagination(_fallbackData);
650
+ _context.next = 20;
651
+ break;
652
+ case 19:
653
+ setHideRecentsLabel(false);
654
+ setActivePaginationSource('none');
655
+ setHasMore(false);
656
+ case 20:
657
+ if (!(generation !== recentsFetchGenerationRef.current)) {
658
+ _context.next = 21;
659
+ break;
660
+ }
661
+ return _context.abrupt("return");
662
+ case 21:
663
+ setItems(taskItems);
664
+ _context.next = 28;
665
+ break;
666
+ case 22:
667
+ if (!(type === 'user')) {
668
+ _context.next = 26;
669
+ break;
670
+ }
671
+ _context.next = 23;
672
+ return fetchUsersDirectory({
673
+ variables: {
674
+ filters: buildUsersDirectoryFilters(''),
675
+ page: 1
676
+ }
677
+ });
678
+ case 23:
679
+ _yield$fetchUsersDire = _context.sent;
680
+ _data3 = _yield$fetchUsersDire.data;
681
+ if (!(generation !== recentsFetchGenerationRef.current)) {
682
+ _context.next = 24;
683
+ break;
684
+ }
685
+ return _context.abrupt("return");
686
+ case 24:
687
+ _mapped2 = ((_data3$usersDirectory = _data3 === null || _data3 === void 0 || (_data3$usersDirectory2 = _data3.usersDirectory) === null || _data3$usersDirectory2 === void 0 ? void 0 : _data3$usersDirectory2.data) !== null && _data3$usersDirectory !== void 0 ? _data3$usersDirectory : []).map(function (u) {
688
+ return mapUserToItem(u, '');
689
+ });
690
+ if (!(generation !== recentsFetchGenerationRef.current)) {
691
+ _context.next = 25;
692
+ break;
693
+ }
694
+ return _context.abrupt("return");
695
+ case 25:
696
+ meItem = mapCorUserToUserItem(corUser, '', t('contextMention.me'));
697
+ withoutMe = _mapped2.filter(function (item) {
698
+ return String(item.id) !== String(meItem.id);
699
+ });
700
+ setItems([meItem].concat(_toConsumableArray(withoutMe)));
701
+ syncUsersPagination(_data3);
702
+ setHideRecentsLabel(false);
703
+ setActivePaginationSource('users');
704
+ _context.next = 28;
705
+ break;
706
+ case 26:
707
+ if (!(generation !== recentsFetchGenerationRef.current)) {
708
+ _context.next = 27;
709
+ break;
710
+ }
711
+ return _context.abrupt("return");
712
+ case 27:
713
+ setItems([]);
714
+ setHideRecentsLabel(false);
715
+ setActivePaginationSource('none');
716
+ setHasMore(false);
717
+ setCurrentPage(1);
718
+ case 28:
719
+ _context.next = 31;
720
+ break;
721
+ case 29:
722
+ _context.prev = 29;
723
+ _t = _context["catch"](2);
724
+ if (!(generation !== recentsFetchGenerationRef.current)) {
725
+ _context.next = 30;
726
+ break;
727
+ }
728
+ return _context.abrupt("return");
729
+ case 30:
730
+ setError(true);
731
+ setItems([]);
732
+ setHideRecentsLabel(false);
733
+ case 31:
734
+ _context.prev = 31;
735
+ if (generation === recentsFetchGenerationRef.current) {
736
+ setLoading(false);
737
+ }
738
+ return _context.finish(31);
739
+ case 32:
740
+ case "end":
741
+ return _context.stop();
742
+ }
743
+ }, _callee, null, [[2, 29, 31, 32]]);
744
+ })), [type, stableScope, fetchUsersDirectory, fetchTaskFamilyFallback, fetchProjectsFallback, syncUsersPagination, syncTaskFallbackPagination, syncProjectFallbackPagination, showProjectNameInTaskRow, corUser, t]);
745
+
746
+ // Disparar search al cambiar debounced value
747
+ useEffect(function () {
748
+ var q = debouncedSearchValue.trim();
749
+ if (type === 'mcp') {
750
+ var _stableScope$mcpSlugs2;
751
+ var slugs = (_stableScope$mcpSlugs2 = stableScope.mcpSlugs) !== null && _stableScope$mcpSlugs2 !== void 0 ? _stableScope$mcpSlugs2 : [];
752
+ setLoading(false);
753
+ setError(false);
754
+ setItems(mapMcpSlugsToItems(slugs, q));
755
+ return;
756
+ }
757
+ if (!q) return;
758
+ if (type === 'client') {
759
+ fetchSearchClients({
760
+ variables: {
761
+ filter: {
762
+ name: q
763
+ },
764
+ page: 1,
765
+ perPage: 20
766
+ }
767
+ });
768
+ setActivePaginationSource('clients-search');
769
+ } else if (type === 'user') {
770
+ fetchUsersDirectory({
771
+ variables: {
772
+ filters: buildUsersDirectoryFilters(q),
773
+ page: 1
774
+ }
775
+ });
776
+ setActivePaginationSource('users');
777
+ } else {
778
+ var filters = buildFiltersForType(type);
779
+ var extra = buildSearchEntitiesExtra(type, stableScope);
780
+ fetchSearchEntities({
781
+ variables: _objectSpread({
782
+ q: q,
783
+ filters: filters
784
+ }, extra !== undefined ? {
785
+ extra: extra
786
+ } : {})
787
+ });
788
+ setActivePaginationSource('none');
789
+ setHasMore(false);
790
+ }
791
+ }, [debouncedSearchValue, type, stableScope, fetchSearchEntities, fetchSearchClients, fetchUsersDirectory]);
792
+
793
+ // Sincronizar resultados de search
794
+ useEffect(function () {
795
+ if (type === 'mcp') return;
796
+ var q = debouncedSearchValue.trim();
797
+ if (!q) return;
798
+ setHideRecentsLabel(false);
799
+ if (type === 'client') {
800
+ var _clientsData$clients;
801
+ setLoading(clientsLoading);
802
+ if (clientsError) {
803
+ setError(true);
804
+ return;
805
+ }
806
+ if (clientsData !== null && clientsData !== void 0 && (_clientsData$clients = clientsData.clients) !== null && _clientsData$clients !== void 0 && _clientsData$clients.data) {
807
+ setItems(clientsData.clients.data.map(function (c) {
808
+ return mapClientToItem(c, q);
809
+ }));
810
+ syncClientsPagination(clientsData);
811
+ setError(false);
812
+ }
813
+ } else if (type === 'user') {
814
+ var _usersData$usersDirec;
815
+ setLoading(usersLoading);
816
+ if (usersError) {
817
+ setError(true);
818
+ return;
819
+ }
820
+ if (usersData !== null && usersData !== void 0 && (_usersData$usersDirec = usersData.usersDirectory) !== null && _usersData$usersDirec !== void 0 && _usersData$usersDirec.data) {
821
+ var mapped = usersData.usersDirectory.data.map(function (u) {
822
+ return mapUserToItem(u, q);
823
+ });
824
+ var meId = String(corUser.id);
825
+ var hasMeInResults = mapped.some(function (item) {
826
+ return String(item.id) === meId;
827
+ });
828
+ var withoutMe = mapped.filter(function (item) {
829
+ return String(item.id) !== meId;
830
+ });
831
+ var meItem = mapCorUserToUserItem(corUser, q, t('contextMention.me'));
832
+ setItems(hasMeInResults ? [meItem].concat(_toConsumableArray(withoutMe)) : mapped);
833
+ syncUsersPagination(usersData);
834
+ setError(false);
835
+ }
836
+ } else {
837
+ setLoading(searchLoading);
838
+ if (searchError) {
839
+ setError(true);
840
+ return;
841
+ }
842
+ if (searchData !== null && searchData !== void 0 && searchData.search) {
843
+ setItems(searchData.search.map(function (r) {
844
+ return mapSearchToItem(r, type, q, showProjectNameInTaskRow);
845
+ }));
846
+ setHasMore(false);
847
+ setError(false);
848
+ }
849
+ }
850
+ }, [searchData, clientsData, usersData, searchLoading, clientsLoading, usersLoading, searchError, clientsError, usersError, debouncedSearchValue, type, syncClientsPagination, syncUsersPagination, showProjectNameInTaskRow, corUser, t]);
851
+ var loadMore = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
852
+ var safeCurrentPage, nextPage, q, loadMoreBaselineGen, _data$usersDirectory$, _data$usersDirectory, _yield$fetchUsersDire2, data, nextItems, _data4$clients$data, _data4$clients, _yield$fetchSearchCli, _data4, _nextItems, _data5$taskFamily$dat, _data5$taskFamily, filter, _yield$fetchTaskFamil2, _data5, _nextItems2, _data6$projects$data, _data6$projects, argumentsFilter, _yield$fetchProjectsF2, _data6, _nextItems3, _t2;
853
+ return _regeneratorRuntime.wrap(function (_context2) {
854
+ while (1) switch (_context2.prev = _context2.next) {
855
+ case 0:
856
+ if (!(isLoadingMore || !hasMore || activePaginationSource === 'none')) {
857
+ _context2.next = 1;
858
+ break;
859
+ }
860
+ return _context2.abrupt("return");
861
+ case 1:
862
+ safeCurrentPage = normalizePositiveInt(currentPage, 1);
863
+ nextPage = safeCurrentPage + 1;
864
+ q = debouncedSearchValue.trim();
865
+ loadMoreBaselineGen = recentsFetchGenerationRef.current;
866
+ setIsLoadingMore(true);
867
+ _context2.prev = 2;
868
+ if (!(activePaginationSource === 'users')) {
869
+ _context2.next = 5;
870
+ break;
871
+ }
872
+ _context2.next = 3;
873
+ return fetchUsersDirectory({
874
+ variables: {
875
+ filters: buildUsersDirectoryFilters(q),
876
+ page: nextPage
877
+ }
878
+ });
879
+ case 3:
880
+ _yield$fetchUsersDire2 = _context2.sent;
881
+ data = _yield$fetchUsersDire2.data;
882
+ if (!(loadMoreBaselineGen !== recentsFetchGenerationRef.current)) {
883
+ _context2.next = 4;
884
+ break;
885
+ }
886
+ return _context2.abrupt("return");
887
+ case 4:
888
+ nextItems = ((_data$usersDirectory$ = data === null || data === void 0 || (_data$usersDirectory = data.usersDirectory) === null || _data$usersDirectory === void 0 ? void 0 : _data$usersDirectory.data) !== null && _data$usersDirectory$ !== void 0 ? _data$usersDirectory$ : []).map(function (u) {
889
+ return mapUserToItem(u, q);
890
+ });
891
+ setItems(function (prev) {
892
+ if (!q) {
893
+ var _prev$;
894
+ var meItem = ((_prev$ = prev[0]) === null || _prev$ === void 0 ? void 0 : _prev$.type) === 'user' ? prev[0] : mapCorUserToUserItem(corUser, '', t('contextMention.me'));
895
+ var _existingIds = new Set(prev.map(function (item) {
896
+ return String(item.id);
897
+ }));
898
+ var _appended = nextItems.filter(function (item) {
899
+ return !_existingIds.has(String(item.id));
900
+ });
901
+ var withoutMe = prev.filter(function (item) {
902
+ return String(item.id) !== String(meItem.id);
903
+ });
904
+ return [meItem].concat(_toConsumableArray(withoutMe), _toConsumableArray(_appended));
905
+ }
906
+ var existingIds = new Set(prev.map(function (item) {
907
+ return "".concat(item.type, "-").concat(item.id);
908
+ }));
909
+ var appended = nextItems.filter(function (item) {
910
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
911
+ });
912
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
913
+ });
914
+ syncUsersPagination(data);
915
+ _context2.next = 14;
916
+ break;
917
+ case 5:
918
+ if (!(activePaginationSource === 'clients-search')) {
919
+ _context2.next = 8;
920
+ break;
921
+ }
922
+ _context2.next = 6;
923
+ return fetchSearchClients({
924
+ variables: {
925
+ filter: {
926
+ name: q
927
+ },
928
+ page: nextPage,
929
+ perPage: 20
930
+ }
931
+ });
932
+ case 6:
933
+ _yield$fetchSearchCli = _context2.sent;
934
+ _data4 = _yield$fetchSearchCli.data;
935
+ if (!(loadMoreBaselineGen !== recentsFetchGenerationRef.current)) {
936
+ _context2.next = 7;
937
+ break;
938
+ }
939
+ return _context2.abrupt("return");
940
+ case 7:
941
+ _nextItems = ((_data4$clients$data = _data4 === null || _data4 === void 0 || (_data4$clients = _data4.clients) === null || _data4$clients === void 0 ? void 0 : _data4$clients.data) !== null && _data4$clients$data !== void 0 ? _data4$clients$data : []).map(function (c) {
942
+ return mapClientToItem(c, q);
943
+ });
944
+ setItems(function (prev) {
945
+ var existingIds = new Set(prev.map(function (item) {
946
+ return "".concat(item.type, "-").concat(item.id);
947
+ }));
948
+ var appended = _nextItems.filter(function (item) {
949
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
950
+ });
951
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
952
+ });
953
+ syncClientsPagination(_data4);
954
+ _context2.next = 14;
955
+ break;
956
+ case 8:
957
+ if (!(activePaginationSource === 'task-fallback')) {
958
+ _context2.next = 11;
959
+ break;
960
+ }
961
+ filter = {};
962
+ if (stableScope.projectId !== null && stableScope.projectId !== undefined && stableScope.projectId !== '') {
963
+ filter.projectIds = [String(stableScope.projectId)];
964
+ }
965
+ if (stableScope.clientId !== null && stableScope.clientId !== undefined && stableScope.clientId !== '') {
966
+ filter.clientIds = [String(stableScope.clientId)];
967
+ }
968
+ _context2.next = 9;
969
+ return fetchTaskFamilyFallback({
970
+ variables: {
971
+ filter: _objectSpread({
972
+ archived: false
973
+ }, filter),
974
+ pagination: {
975
+ offset: (nextPage - 1) * 20,
976
+ size: 20
977
+ }
978
+ }
979
+ });
980
+ case 9:
981
+ _yield$fetchTaskFamil2 = _context2.sent;
982
+ _data5 = _yield$fetchTaskFamil2.data;
983
+ if (!(loadMoreBaselineGen !== recentsFetchGenerationRef.current)) {
984
+ _context2.next = 10;
985
+ break;
986
+ }
987
+ return _context2.abrupt("return");
988
+ case 10:
989
+ _nextItems2 = ((_data5$taskFamily$dat = _data5 === null || _data5 === void 0 || (_data5$taskFamily = _data5.taskFamily) === null || _data5$taskFamily === void 0 ? void 0 : _data5$taskFamily.data) !== null && _data5$taskFamily$dat !== void 0 ? _data5$taskFamily$dat : []).map(normalizeTaskFamilyRecord).filter(function (item) {
990
+ return item !== null;
991
+ }).map(function (task) {
992
+ return mapRecentTaskToItem(task, '', showProjectNameInTaskRow);
993
+ });
994
+ setItems(function (prev) {
995
+ var existingIds = new Set(prev.map(function (item) {
996
+ return "".concat(item.type, "-").concat(item.id);
997
+ }));
998
+ var appended = _nextItems2.filter(function (item) {
999
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
1000
+ });
1001
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
1002
+ });
1003
+ syncTaskFallbackPagination(_data5);
1004
+ _context2.next = 14;
1005
+ break;
1006
+ case 11:
1007
+ if (!(activePaginationSource === 'project-fallback')) {
1008
+ _context2.next = 14;
1009
+ break;
1010
+ }
1011
+ argumentsFilter = stableScope.clientId !== null && stableScope.clientId !== undefined && stableScope.clientId !== '' ? {
1012
+ client_id: [String(stableScope.clientId)]
1013
+ } : undefined;
1014
+ _context2.next = 12;
1015
+ return fetchProjectsFallback({
1016
+ variables: _objectSpread(_objectSpread({}, argumentsFilter ? {
1017
+ arguments: argumentsFilter
1018
+ } : {}), {}, {
1019
+ page: nextPage,
1020
+ perPage: 20
1021
+ })
1022
+ });
1023
+ case 12:
1024
+ _yield$fetchProjectsF2 = _context2.sent;
1025
+ _data6 = _yield$fetchProjectsF2.data;
1026
+ if (!(loadMoreBaselineGen !== recentsFetchGenerationRef.current)) {
1027
+ _context2.next = 13;
1028
+ break;
1029
+ }
1030
+ return _context2.abrupt("return");
1031
+ case 13:
1032
+ _nextItems3 = ((_data6$projects$data = _data6 === null || _data6 === void 0 || (_data6$projects = _data6.projects) === null || _data6$projects === void 0 ? void 0 : _data6$projects.data) !== null && _data6$projects$data !== void 0 ? _data6$projects$data : []).map(normalizeProjectsFallbackRecord).filter(function (item) {
1033
+ return item !== null;
1034
+ }).map(function (item) {
1035
+ return mapSearchToItem(item, 'project', '');
1036
+ });
1037
+ setItems(function (prev) {
1038
+ var existingIds = new Set(prev.map(function (item) {
1039
+ return "".concat(item.type, "-").concat(item.id);
1040
+ }));
1041
+ var appended = _nextItems3.filter(function (item) {
1042
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
1043
+ });
1044
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
1045
+ });
1046
+ syncProjectFallbackPagination(_data6);
1047
+ case 14:
1048
+ _context2.next = 17;
1049
+ break;
1050
+ case 15:
1051
+ _context2.prev = 15;
1052
+ _t2 = _context2["catch"](2);
1053
+ if (!(loadMoreBaselineGen !== recentsFetchGenerationRef.current)) {
1054
+ _context2.next = 16;
1055
+ break;
1056
+ }
1057
+ return _context2.abrupt("return");
1058
+ case 16:
1059
+ console.error('[useEntitySearch] loadMore failed', {
1060
+ source: activePaginationSource,
1061
+ nextPage: nextPage,
1062
+ error: _t2
1063
+ });
1064
+ // Evita loop de reintentos automáticos por scroll cuando backend está caído (ej. 503).
1065
+ setError(true);
1066
+ setHasMore(false);
1067
+ case 17:
1068
+ _context2.prev = 17;
1069
+ setIsLoadingMore(false);
1070
+ return _context2.finish(17);
1071
+ case 18:
1072
+ case "end":
1073
+ return _context2.stop();
1074
+ }
1075
+ }, _callee2, null, [[2, 15, 17, 18]]);
1076
+ })), [isLoadingMore, hasMore, currentPage, activePaginationSource, debouncedSearchValue, fetchUsersDirectory, fetchSearchClients, fetchTaskFamilyFallback, fetchProjectsFallback, stableScope.projectId, stableScope.clientId, showProjectNameInTaskRow, corUser, t, syncClientsPagination, syncUsersPagination, syncTaskFallbackPagination, syncProjectFallbackPagination]);
1077
+
1078
+ // Cuando se limpia el search, volver a recents
1079
+ useEffect(function () {
1080
+ if (!debouncedSearchValue.trim()) {
1081
+ fetchRecent();
1082
+ }
1083
+ }, [debouncedSearchValue, fetchRecent]);
1084
+ return {
1085
+ items: items,
1086
+ loading: loading,
1087
+ error: error,
1088
+ hideRecentsLabel: hideRecentsLabel,
1089
+ hasMore: hasMore,
1090
+ isLoadingMore: isLoadingMore,
1091
+ loadMore: loadMore,
1092
+ searchValue: searchValue,
1093
+ updateSearchValue: setSearchValue,
1094
+ fetchRecent: fetchRecent
1095
+ };
1096
+ };
1097
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VMYXp5UXVlcnkiLCJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsImdldFJlY2VudENsaWVudHMiLCJnZXRSZWNlbnRQcm9qZWN0cyIsImdldFJlY2VudFRhc2tzIiwidXNlVXNlciIsIlBST0pFQ1RTX0ZBTExCQUNLIiwiU0VBUkNIX0VOVElUSUVTIiwiVEFTS19GQU1JTFlfRkFMTEJBQ0siLCJTRUFSQ0hfQ0xJRU5UUyIsIlVTRVJTX0RJUkVDVE9SWSIsIlNFQVJDSF9RVUVSWV9ERUJPVU5DRV9NUyIsInVzZURlYm91bmNlIiwidXNlVCIsIm5vcm1hbGl6ZVBvc2l0aXZlSW50IiwidmFsdWUiLCJmYWxsYmFjayIsInBhcnNlZCIsIk51bWJlciIsImlzRmluaXRlIiwibm9ybWFsaXplZCIsIk1hdGgiLCJmbG9vciIsIkJBU0VfRklMVEVSU19CWV9UWVBFIiwicHJvamVjdCIsImFyY2hpdmVkIiwidGFzayIsImJ1aWxkVGFza1NlYXJjaEV4dHJhRW50cmllcyIsInNjb3BlIiwicmF3Q2xpZW50IiwiY2xpZW50SWQiLCJ1bmRlZmluZWQiLCJTdHJpbmciLCJyYXdQcm9qZWN0IiwicHJvamVjdElkIiwiYWdlbnRFbnRpdHkiLCJlbnRyaWVzIiwicHVzaENsaWVudCIsInB1c2giLCJwdXNoUHJvamVjdCIsImJ1aWxkVGFza1NlYXJjaEV4dHJhIiwibGVuZ3RoIiwiSlNPTiIsInN0cmluZ2lmeSIsImJ1aWxkUHJvamVjdFNlYXJjaEV4dHJhIiwiYnVpbGRTZWFyY2hFbnRpdGllc0V4dHJhIiwidHlwZSIsImJ1aWxkRmlsdGVyc0ZvclR5cGUiLCJidWlsZFVzZXJzRGlyZWN0b3J5RmlsdGVycyIsInEiLCJiYXNlIiwid2l0aFBvc2l0aW9uIiwid2l0aFRlYW1zIiwidHJpbW1lZFEiLCJ0cmltIiwic2VhcmNoSW5wdXQiLCJoaWdobGlnaHRSYW5nZSIsInRleHQiLCJzZWFyY2hWYWx1ZSIsImlkeCIsInRvTG93ZXJDYXNlIiwiaW5kZXhPZiIsInN0YXJ0IiwiZmlyc3REZWZpbmVkIiwiX2xlbiIsImFyZ3VtZW50cyIsInZhbHVlcyIsIkFycmF5IiwiX2tleSIsImZpbmQiLCJub3JtYWxpemVUcmltbWVkU3RyaW5nIiwiZ2V0VXNlclBvc2l0aW9uTmFtZSIsInVzZXJQb3NpdGlvbiIsIl90eXBlb2YiLCJuYW1lIiwibWFwQ2xpZW50VG9JdGVtIiwiYyIsIl9jJHRvdGFsUHJveWVjdG9zIiwiX2MkdG90YWxQcm95ZWN0b3MyIiwiaWQiLCJwcmltYXJ5IiwicHJpbWFyeUhpZ2hsaWdodCIsImJyZWFkY3J1bWIiLCJjb3VudCIsInRvdGFsUHJveWVjdG9zIiwiY291bnRMYWJlbCIsInJhdyIsIm1hcFVzZXJUb0l0ZW0iLCJ1IiwiX3UkZmlyc3ROYW1lIiwiX3UkbGFzdE5hbWUiLCJfdSRwaWN0dXJlIiwiX3UkcG9zaXRpb25OYW1lIiwiX3UkZW1haWwiLCJmdWxsTmFtZSIsImNvbmNhdCIsImZpcnN0TmFtZSIsImxhc3ROYW1lIiwiZW1haWwiLCJwaWN0dXJlIiwicG9zaXRpb25OYW1lIiwibWFwQ29yVXNlclRvVXNlckl0ZW0iLCJ1c2VyIiwibWVMYWJlbCIsIl91c2VyJGZpcnN0TmFtZSIsIl91c2VyJGxhc3ROYW1lIiwicG9zaXRpb25MaW5lIiwidXNlcl9wb3NpdGlvbiIsIm1hcFJlY2VudFRhc2tUb0l0ZW0iLCJfdGFzayRwcm9qZWN0TmFtZSIsInNob3dQcm9qZWN0TmFtZUluVGFza1JvdyIsInRpdGxlIiwicHJvamVjdE5hbWUiLCJwYXJlbnQiLCJub3JtYWxpemVUYXNrRmFtaWx5UmVjb3JkIiwicmVjb3JkIiwiX3JlY29yZCR0aXRsZSIsIl9maXJzdERlZmluZWQiLCJfcmVjb3JkJHByb2plY3QiLCJfcmVjb3JkJGZhdGhlciIsIl9yZWNvcmQkZmF0aGVyMiIsInRhc2tGYW1pbHlJZCIsIl9pZCIsImZhdGhlciIsImhhc0ZhdGhlciIsInRhc2tGYXRoZXIiLCJub3JtYWxpemVQcm9qZWN0c0ZhbGxiYWNrUmVjb3JkIiwiX3JlY29yZCRuYW1lIiwiX2ZpcnN0RGVmaW5lZDIiLCJfcmVjb3JkJGNsaWVudCIsIl9yZWNvcmQkY2xpZW50JG5hbWUiLCJfcmVjb3JkJGNsaWVudDIiLCJjbGllbnQiLCJjbGllbnROYW1lIiwibWFwU2VhcmNoVG9JdGVtIiwiciIsIl9yJHByb2plY3ROYW1lIiwiX3IkcHJvamVjdE5hbWUyIiwiX3IkY2xpZW50SWQiLCJfciRjbGllbnROYW1lIiwiX3IkZmVlSWQiLCJfZmF0aGVyJHRpdGxlIiwidGFza1Byb2plY3ROYW1lIiwiZmVlSWQiLCJmYXRoZXJJZCIsImZhdGhlclRpdGxlIiwiZm9ybWF0TWNwUHJpbWFyeUxhYmVsIiwic2x1ZyIsInJlcGxhY2UiLCJjaGFyIiwidG9VcHBlckNhc2UiLCJtYXBNY3BTbHVnc1RvSXRlbXMiLCJzbHVncyIsImZpbHRlcmVkIiwiZmlsdGVyIiwicyIsImluY2x1ZGVzIiwibWFwIiwidXNlRW50aXR5U2VhcmNoIiwiX3Njb3BlJG1jcFNsdWdzIiwiY29yVXNlciIsIl91c2VUIiwidCIsInJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJzZXRTZWFyY2hWYWx1ZSIsImRlYm91bmNlZFNlYXJjaFZhbHVlIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJpdGVtcyIsInNldEl0ZW1zIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJsb2FkaW5nIiwic2V0TG9hZGluZyIsIl91c2VTdGF0ZTciLCJfdXNlU3RhdGU4IiwiZXJyb3IiLCJzZXRFcnJvciIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwiaGlkZVJlY2VudHNMYWJlbCIsInNldEhpZGVSZWNlbnRzTGFiZWwiLCJfdXNlU3RhdGUxIiwiX3VzZVN0YXRlMTAiLCJoYXNNb3JlIiwic2V0SGFzTW9yZSIsIl91c2VTdGF0ZTExIiwiX3VzZVN0YXRlMTIiLCJpc0xvYWRpbmdNb3JlIiwic2V0SXNMb2FkaW5nTW9yZSIsIl91c2VTdGF0ZTEzIiwiX3VzZVN0YXRlMTQiLCJjdXJyZW50UGFnZSIsInNldEN1cnJlbnRQYWdlIiwiX3VzZVN0YXRlMTUiLCJfdXNlU3RhdGUxNiIsImFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UiLCJzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlIiwibWNwU2x1Z3NLZXkiLCJtY3BTbHVncyIsImpvaW4iLCJzdGFibGVTY29wZSIsIl9zY29wZSRjbGllbnRJZCIsIl9zY29wZSRwcm9qZWN0SWQiLCJfc2NvcGUkbWNwU2x1Z3MyIiwiX3Njb3BlJGFnZW50RW50aXR5IiwiX3VzZUxhenlRdWVyeSIsInZhcmlhYmxlcyIsImxpbWl0IiwiZmV0Y2hQb2xpY3kiLCJfdXNlTGF6eVF1ZXJ5MiIsImZldGNoU2VhcmNoRW50aXRpZXMiLCJfdXNlTGF6eVF1ZXJ5MiQiLCJzZWFyY2hEYXRhIiwiZGF0YSIsInNlYXJjaExvYWRpbmciLCJzZWFyY2hFcnJvciIsIl91c2VMYXp5UXVlcnkzIiwiX3VzZUxhenlRdWVyeTQiLCJmZXRjaFNlYXJjaENsaWVudHMiLCJfdXNlTGF6eVF1ZXJ5NCQiLCJjbGllbnRzRGF0YSIsImNsaWVudHNMb2FkaW5nIiwiY2xpZW50c0Vycm9yIiwiX3VzZUxhenlRdWVyeTUiLCJfdXNlTGF6eVF1ZXJ5NiIsImZldGNoVXNlcnNEaXJlY3RvcnkiLCJfdXNlTGF6eVF1ZXJ5NiQiLCJ1c2Vyc0RhdGEiLCJ1c2Vyc0xvYWRpbmciLCJ1c2Vyc0Vycm9yIiwic3luY1VzZXJzUGFnaW5hdGlvbiIsInBheWxvYWQiLCJfcGF5bG9hZCR1c2Vyc0RpcmVjdG8iLCJfcGF5bG9hZCR1c2Vyc0RpcmVjdG8yIiwicGFnZSIsInVzZXJzRGlyZWN0b3J5IiwibGFzdFBhZ2UiLCJzeW5jQ2xpZW50c1BhZ2luYXRpb24iLCJfcGF5bG9hZCRjbGllbnRzIiwiX3BheWxvYWQkY2xpZW50czIiLCJjbGllbnRzIiwic3luY1Rhc2tGYWxsYmFja1BhZ2luYXRpb24iLCJfcGF5bG9hZCR0YXNrRmFtaWx5IiwiX3BheWxvYWQkdGFza0ZhbWlseTIiLCJyYXdQYWdlIiwidGFza0ZhbWlseSIsInN5bmNQcm9qZWN0RmFsbGJhY2tQYWdpbmF0aW9uIiwiX3BheWxvYWQkcHJvamVjdHMiLCJfcGF5bG9hZCRwcm9qZWN0czIiLCJwcm9qZWN0cyIsIl91c2VMYXp5UXVlcnk3IiwiX3VzZUxhenlRdWVyeTgiLCJmZXRjaFRhc2tGYW1pbHlGYWxsYmFjayIsIl91c2VMYXp5UXVlcnk5IiwiX3VzZUxhenlRdWVyeTAiLCJmZXRjaFByb2plY3RzRmFsbGJhY2siLCJmZXRjaFJlY2VudCIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwiZ2VuZXJhdGlvbiIsIl9zdGFibGVTY29wZSRtY3BTbHVncyIsIm1hcHBlZCIsIl9kYXRhIiwiX21hcHBlZCIsIl9mYWxsYmFja0RhdGEkcHJvamVjdCIsIl9mYWxsYmFja0RhdGEkcHJvamVjdDIiLCJhcmd1bWVudHNGaWx0ZXIiLCJfeWllbGQkZmV0Y2hQcm9qZWN0c0YiLCJmYWxsYmFja0RhdGEiLCJmYWxsYmFja01hcHBlZCIsInJlY2VudFRhc2tGaWx0ZXJzIiwiX2RhdGEyIiwidGFza0l0ZW1zIiwiX2ZhbGxiYWNrRGF0YSR0YXNrRmFtIiwiX2ZhbGxiYWNrRGF0YSR0YXNrRmFtMiIsIl95aWVsZCRmZXRjaFRhc2tGYW1pbCIsIl9mYWxsYmFja0RhdGEiLCJfZGF0YTMkdXNlcnNEaXJlY3RvcnkiLCJfZGF0YTMkdXNlcnNEaXJlY3RvcnkyIiwiX3lpZWxkJGZldGNoVXNlcnNEaXJlIiwiX2RhdGEzIiwiX21hcHBlZDIiLCJtZUl0ZW0iLCJ3aXRob3V0TWUiLCJfdCIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiY3VycmVudCIsImFicnVwdCIsInNlbnQiLCJpc0FycmF5IiwicCIsImNsaWVudF9pZCIsIl9vYmplY3RTcHJlYWQiLCJwZXJQYWdlIiwiaXRlbSIsInByb2plY3RJZHMiLCJjbGllbnRJZHMiLCJwYWdpbmF0aW9uIiwib2Zmc2V0Iiwic2l6ZSIsImZpbHRlcnMiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJmaW5pc2giLCJzdG9wIiwiX3N0YWJsZVNjb3BlJG1jcFNsdWdzMiIsImV4dHJhIiwiX2NsaWVudHNEYXRhJGNsaWVudHMiLCJfdXNlcnNEYXRhJHVzZXJzRGlyZWMiLCJtZUlkIiwiaGFzTWVJblJlc3VsdHMiLCJzb21lIiwic2VhcmNoIiwibG9hZE1vcmUiLCJfY2FsbGVlMiIsInNhZmVDdXJyZW50UGFnZSIsIm5leHRQYWdlIiwibG9hZE1vcmVCYXNlbGluZUdlbiIsIl9kYXRhJHVzZXJzRGlyZWN0b3J5JCIsIl9kYXRhJHVzZXJzRGlyZWN0b3J5IiwiX3lpZWxkJGZldGNoVXNlcnNEaXJlMiIsIm5leHRJdGVtcyIsIl9kYXRhNCRjbGllbnRzJGRhdGEiLCJfZGF0YTQkY2xpZW50cyIsIl95aWVsZCRmZXRjaFNlYXJjaENsaSIsIl9kYXRhNCIsIl9uZXh0SXRlbXMiLCJfZGF0YTUkdGFza0ZhbWlseSRkYXQiLCJfZGF0YTUkdGFza0ZhbWlseSIsIl95aWVsZCRmZXRjaFRhc2tGYW1pbDIiLCJfZGF0YTUiLCJfbmV4dEl0ZW1zMiIsIl9kYXRhNiRwcm9qZWN0cyRkYXRhIiwiX2RhdGE2JHByb2plY3RzIiwiX3lpZWxkJGZldGNoUHJvamVjdHNGMiIsIl9kYXRhNiIsIl9uZXh0SXRlbXMzIiwiX3QyIiwiX2NvbnRleHQyIiwiX3ByZXYkIiwiZXhpc3RpbmdJZHMiLCJTZXQiLCJhcHBlbmRlZCIsImhhcyIsImNvbnNvbGUiLCJzb3VyY2UiLCJ1cGRhdGVTZWFyY2hWYWx1ZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VFbnRpdHlTZWFyY2gudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlTGF6eVF1ZXJ5IH0gZnJvbSAnQGFwb2xsby9jbGllbnQnXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBnZXRSZWNlbnRDbGllbnRzIH0gZnJvbSAnLi4vc2VydmljZXMvbWFpYS9SZWNlbnRDbGllbnRzL2dldFJlY2VudENsaWVudHMnXG5pbXBvcnQgeyBnZXRSZWNlbnRQcm9qZWN0cyB9IGZyb20gJy4uL3NlcnZpY2VzL21haWEvUmVjZW50UHJvamVjdHMvZ2V0UmVjZW50UHJvamVjdHMnXG5pbXBvcnQgeyBnZXRSZWNlbnRUYXNrcyB9IGZyb20gJy4uL3NlcnZpY2VzL21haWEvUmVjZW50VGFza3MvZ2V0UmVjZW50VGFza3MnXG5pbXBvcnQgdHlwZSB7IFJlY2VudFRhc2tJdGVtIH0gZnJvbSAnLi4vc2VydmljZXMvbWFpYS9SZWNlbnRUYXNrcy9nZXRSZWNlbnRUYXNrcydcbmltcG9ydCB7IHVzZVVzZXIgfSBmcm9tICcuLi9jb250ZXh0L2Nvci11c2VyJ1xuaW1wb3J0IHsgUFJPSkVDVFNfRkFMTEJBQ0ssIFNFQVJDSF9FTlRJVElFUywgVEFTS19GQU1JTFlfRkFMTEJBQ0sgfSBmcm9tICcuLi9zZXJ2aWNlcy9xdWVyeS9lbnRpdHlTZWFyY2hRdWVyeSdcbmltcG9ydCB7IFNFQVJDSF9DTElFTlRTIH0gZnJvbSAnLi4vc2VydmljZXMvcXVlcnkvQ2xpZW50U2VhcmNoUXVlcnknXG5pbXBvcnQgeyBVU0VSU19ESVJFQ1RPUlkgfSBmcm9tICcuLi9zZXJ2aWNlcy9xdWVyeS91c2Vyc0RpcmVjdG9yeVF1ZXJ5J1xuaW1wb3J0IHsgU0VBUkNIX1FVRVJZX0RFQk9VTkNFX01TIH0gZnJvbSAnLi4vY29uc3RhbnRzL2NvbmZpZydcbmltcG9ydCB7IHVzZURlYm91bmNlIH0gZnJvbSAnLi91c2VEZWJvdW5jZSdcbmltcG9ydCB7IHVzZVQgfSBmcm9tICcuL3VzZVQnXG5pbXBvcnQgeyBDb250ZXh0RW50aXR5VHlwZSwgQ29udGV4dE1lbnRpb25JdGVtIH0gZnJvbSAnLi4vdHlwZXMvY29udGV4dE1lbnRpb24nXG5pbXBvcnQgdHlwZSB7IEFnZW50RW50aXR5IH0gZnJvbSAnLi4vdHlwZXMvYWdlbnQnXG5cbnR5cGUgUmF3U2VhcmNoUmVzdWx0ID0ge1xuICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gIHRpdGxlOiBzdHJpbmdcbiAgdHlwZT86IHN0cmluZ1xuICBjbGllbnRJZD86IG51bWJlciB8IHN0cmluZyB8IG51bGxcbiAgZmVlSWQ/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsXG4gIGNsaWVudE5hbWU/OiBzdHJpbmcgfCBudWxsXG4gIHByb2plY3ROYW1lPzogc3RyaW5nIHwgbnVsbFxuICBmYXRoZXI/OiB7IGlkOiBzdHJpbmcgfCBudW1iZXI7IHRpdGxlPzogc3RyaW5nIHwgbnVsbCB9IHwgbnVsbFxufVxuXG50eXBlIFJhd0NsaWVudCA9IHtcbiAgaWQ6IG51bWJlciB8IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgdG90YWxQcm95ZWN0b3M/OiBudW1iZXIgfCBudWxsXG59XG5cbnR5cGUgUmF3RGlyZWN0b3J5VXNlciA9IHtcbiAgaWQ6IHN0cmluZyB8IG51bWJlclxuICBmaXJzdE5hbWU/OiBzdHJpbmcgfCBudWxsXG4gIGxhc3ROYW1lPzogc3RyaW5nIHwgbnVsbFxuICBlbWFpbD86IHN0cmluZyB8IG51bGxcbiAgcGljdHVyZT86IHN0cmluZyB8IG51bGxcbiAgcG9zaXRpb25OYW1lPzogc3RyaW5nIHwgbnVsbFxufVxuXG50eXBlIFNlYXJjaEVudGl0aWVzRGF0YSA9IHsgc2VhcmNoOiBSYXdTZWFyY2hSZXN1bHRbXSB8IG51bGwgfVxudHlwZSBTZWFyY2hDbGllbnRzRGF0YSA9IHtcbiAgY2xpZW50czoge1xuICAgIHRvdGFsPzogbnVtYmVyIHwgbnVsbFxuICAgIHBlclBhZ2U/OiBudW1iZXIgfCBudWxsXG4gICAgcGFnZT86IG51bWJlciB8IG51bGxcbiAgICBsYXN0UGFnZT86IG51bWJlciB8IG51bGxcbiAgICBkYXRhOiBSYXdDbGllbnRbXVxuICB9IHwgbnVsbFxufVxudHlwZSBVc2Vyc0RpcmVjdG9yeURhdGEgPSB7XG4gIHVzZXJzRGlyZWN0b3J5OiB7XG4gICAgdG90YWw/OiBudW1iZXIgfCBudWxsXG4gICAgcGVyUGFnZT86IG51bWJlciB8IG51bGxcbiAgICBwYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIGxhc3RQYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIGRhdGE6IFJhd0RpcmVjdG9yeVVzZXJbXSB8IG51bGxcbiAgfSB8IG51bGxcbn1cblxudHlwZSBUYXNrRmFtaWx5UmVjb3JkID0ge1xuICBfaWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIHRpdGxlPzogc3RyaW5nIHwgbnVsbFxuICBwcm9qZWN0SWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIHRhc2tGYXRoZXI/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIGZhdGhlcj86IHsgaWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsOyB0aXRsZT86IHN0cmluZyB8IG51bGwgfSB8IG51bGxcbiAgcHJvamVjdD86IHsgaWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsOyBuYW1lPzogc3RyaW5nIHwgbnVsbCB9IHwgbnVsbFxufVxuXG50eXBlIFRhc2tGYW1pbHlEYXRhID0ge1xuICB0YXNrRmFtaWx5Pzoge1xuICAgIHRvdGFsPzogbnVtYmVyIHwgbnVsbFxuICAgIHBlclBhZ2U/OiBudW1iZXIgfCBudWxsXG4gICAgcGFnZT86IG51bWJlciB8IG51bGxcbiAgICBsYXN0UGFnZT86IG51bWJlciB8IG51bGxcbiAgICBkYXRhPzogVGFza0ZhbWlseVJlY29yZFtdIHwgbnVsbFxuICB9IHwgbnVsbFxufVxuXG50eXBlIEZhbGxiYWNrUHJvamVjdFJlY29yZCA9IHtcbiAgaWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIG5hbWU/OiBzdHJpbmcgfCBudWxsXG4gIGNsaWVudElkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbFxuICBjbGllbnQ/OiB7IGlkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbDsgbmFtZT86IHN0cmluZyB8IG51bGwgfSB8IG51bGxcbn1cblxudHlwZSBQcm9qZWN0c0ZhbGxiYWNrRGF0YSA9IHtcbiAgcHJvamVjdHM/OiB7XG4gICAgdG90YWw/OiBudW1iZXIgfCBudWxsXG4gICAgcGVyUGFnZT86IG51bWJlciB8IG51bGxcbiAgICBwYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIGxhc3RQYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIGRhdGE/OiBGYWxsYmFja1Byb2plY3RSZWNvcmRbXSB8IG51bGxcbiAgfSB8IG51bGxcbn1cblxudHlwZSBQYWdpbmF0aW9uU291cmNlID0gJ25vbmUnIHwgJ3VzZXJzJyB8ICdjbGllbnRzLXNlYXJjaCcgfCAndGFzay1mYWxsYmFjaycgfCAncHJvamVjdC1mYWxsYmFjaydcblxuY29uc3Qgbm9ybWFsaXplUG9zaXRpdmVJbnQgPSAodmFsdWU6IHVua25vd24sIGZhbGxiYWNrOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkpIHJldHVybiBmYWxsYmFja1xuICBjb25zdCBub3JtYWxpemVkID0gTWF0aC5mbG9vcihwYXJzZWQpXG4gIHJldHVybiBub3JtYWxpemVkID4gMCA/IG5vcm1hbGl6ZWQgOiBmYWxsYmFja1xufVxuXG4vKipcbiAqIFJlc3RyaW5nZSBsb3MgcmVzdWx0YWRvcyBhbCBgY2xpZW50SWRgL2Bwcm9qZWN0SWRgIGRlbCBhZ2VudGUgYWN0aXZvLlxuICogQ3VhbmRvIGVsIGFnZW50ZSBlc3TDoSBzY29wZWFkbyBhIHVuIGNsaWVudC9wcm9qZWN0LCB0YW50byBsb3MgcmVjZW50cyBjb21vXG4gKiBlbCBzZWFyY2ggZGViZW4gZmlsdHJhciBwb3IgZXNlIGNvbnRleHRvLiBTaSBlbCBiYWNrZW5kIG5vIGVudGllbmRlIGFsZ8O6blxuICogY2FtcG8gbG8gaWdub3JhIHkgc2UgY2FlIGFsIGNvbXBvcnRhbWllbnRvIGdsb2JhbC5cbiAqL1xuZXhwb3J0IHR5cGUgRW50aXR5U2VhcmNoU2NvcGUgPSB7XG4gIGNsaWVudElkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbFxuICBwcm9qZWN0SWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIC8qKiBTbHVncyBkZWwgY29uZWN0b3IgTUNQIGRlbCBhZ2VudGUgKGxpc3RhZG8gbG9jYWwsIHNpbiBHcmFwaFFMKS4gKi9cbiAgbWNwU2x1Z3M/OiBzdHJpbmdbXVxuICAvKipcbiAgICogYGVudGl0eWAgZGVsIGFnZW50ZSBhY3Rpdm8uIFBhcmEgZXNwZWNpYWxpc3RhczpcbiAgICogLSBgcHJvamVjdGA6IGLDunNxdWVkYSBkZSB0YXJlYXMgZnVlcnphIGZpbHRybyBwb3IgYHByb2plY3RJZGAgZGVsIGNvbnRleHRvLlxuICAgKiAtIGBjbGllbnRgOiBiw7pzcXVlZGEgZGUgcHJveWVjdG9zIHBvciBgY2xpZW50SWRgOyB0YXJlYXMgcG9yIGNsaWVudGUgKHkgcHJveWVjdG8gc2kgYXBsaWNhKS5cbiAgICovXG4gIGFnZW50RW50aXR5PzogQWdlbnRFbnRpdHkgfCBudWxsXG59XG5cbnR5cGUgU2VhcmNoRmlsdGVyYWJsZVR5cGUgPSAncHJvamVjdCcgfCAndGFzaydcblxuY29uc3QgQkFTRV9GSUxURVJTX0JZX1RZUEU6IFJlY29yZDxTZWFyY2hGaWx0ZXJhYmxlVHlwZSwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPSB7XG4gIHByb2plY3Q6IHsgcHJvamVjdDogJ3RydWUnLCBhcmNoaXZlZDogJ2FsbCcgfSxcbiAgdGFzazogeyB0YXNrOiAndHJ1ZScsIGFyY2hpdmVkOiAnZmFsc2UnIH0sXG59XG5cbi8qKlxuICogRW50cmFkYXMgcGFyYSBlbCBhcmd1bWVudG8gR3JhcGhRTCBgZXh0cmFgIChKU09OIHN0cmluZyBkZSBhcnJheSkgYWwgYnVzY2FyIHRhcmVhcyBjb24gY29udGV4dG8uXG4gKiBFai46IFt7XCJwcm9qZWN0SWRcIjpcIjg4MTU1MlwifV1cbiAqL1xuY29uc3QgYnVpbGRUYXNrU2VhcmNoRXh0cmFFbnRyaWVzID0gKHNjb3BlPzogRW50aXR5U2VhcmNoU2NvcGUpOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9PiB7XG4gIGNvbnN0IHJhd0NsaWVudCA9XG4gICAgc2NvcGU/LmNsaWVudElkICE9PSB1bmRlZmluZWQgJiYgc2NvcGU/LmNsaWVudElkICE9PSBudWxsICYmIHNjb3BlPy5jbGllbnRJZCAhPT0gJycgPyBTdHJpbmcoc2NvcGUuY2xpZW50SWQpIDogbnVsbFxuICBjb25zdCByYXdQcm9qZWN0ID1cbiAgICBzY29wZT8ucHJvamVjdElkICE9PSB1bmRlZmluZWQgJiYgc2NvcGU/LnByb2plY3RJZCAhPT0gbnVsbCAmJiBzY29wZT8ucHJvamVjdElkICE9PSAnJ1xuICAgICAgPyBTdHJpbmcoc2NvcGUucHJvamVjdElkKVxuICAgICAgOiBudWxsXG5cbiAgY29uc3QgYWdlbnRFbnRpdHkgPSBzY29wZT8uYWdlbnRFbnRpdHlcbiAgY29uc3QgZW50cmllczogQXJyYXk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPSBbXVxuXG4gIGNvbnN0IHB1c2hDbGllbnQgPSAoKSA9PiB7XG4gICAgaWYgKHJhd0NsaWVudCkgZW50cmllcy5wdXNoKHsgY2xpZW50SWQ6IHJhd0NsaWVudCB9KVxuICB9XG4gIGNvbnN0IHB1c2hQcm9qZWN0ID0gKCkgPT4ge1xuICAgIGlmIChyYXdQcm9qZWN0KSBlbnRyaWVzLnB1c2goeyBwcm9qZWN0SWQ6IHJhd1Byb2plY3QgfSlcbiAgfVxuXG4gIGlmIChhZ2VudEVudGl0eSA9PT0gJ3Byb2plY3QnKSB7XG4gICAgaWYgKHJhd1Byb2plY3QpIHtcbiAgICAgIHB1c2hQcm9qZWN0KClcbiAgICB9IGVsc2UgaWYgKHJhd0NsaWVudCkge1xuICAgICAgcHVzaENsaWVudCgpXG4gICAgfVxuICB9IGVsc2UgaWYgKGFnZW50RW50aXR5ID09PSAnY2xpZW50Jykge1xuICAgIHB1c2hDbGllbnQoKVxuICAgIHB1c2hQcm9qZWN0KClcbiAgfSBlbHNlIHtcbiAgICBwdXNoQ2xpZW50KClcbiAgICBwdXNoUHJvamVjdCgpXG4gIH1cblxuICByZXR1cm4gZW50cmllc1xufVxuXG5jb25zdCBidWlsZFRhc2tTZWFyY2hFeHRyYSA9IChzY29wZT86IEVudGl0eVNlYXJjaFNjb3BlKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgZW50cmllcyA9IGJ1aWxkVGFza1NlYXJjaEV4dHJhRW50cmllcyhzY29wZSlcbiAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShlbnRyaWVzKVxufVxuXG4vKipcbiAqIFRhYiBwcm95ZWN0bzogY29uIGBjbGllbnRJZGAgZW4gZWwgc2NvcGUsIGBleHRyYWAgYWNvdGEgbGEgYsO6c3F1ZWRhIGEgcHJveWVjdG9zIGRlIGVzZSBjbGllbnRlLlxuICogRWouOiBgW3tcImNsaWVudElkXCI6XCI0NzEwNVwifV1gIGp1bnRvIGEgYGZpbHRlcnNgIGB7XCJwcm9qZWN0XCI6XCJ0cnVlXCIsXCJhcmNoaXZlZFwiOlwiYWxsXCJ9YC5cbiAqL1xuY29uc3QgYnVpbGRQcm9qZWN0U2VhcmNoRXh0cmEgPSAoc2NvcGU/OiBFbnRpdHlTZWFyY2hTY29wZSk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHJhd0NsaWVudCA9XG4gICAgc2NvcGU/LmNsaWVudElkICE9PSB1bmRlZmluZWQgJiYgc2NvcGU/LmNsaWVudElkICE9PSBudWxsICYmIHNjb3BlPy5jbGllbnRJZCAhPT0gJycgPyBTdHJpbmcoc2NvcGUuY2xpZW50SWQpIDogbnVsbFxuICBpZiAoIXJhd0NsaWVudCkgcmV0dXJuIHVuZGVmaW5lZFxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoW3sgY2xpZW50SWQ6IHJhd0NsaWVudCB9XSlcbn1cblxuY29uc3QgYnVpbGRTZWFyY2hFbnRpdGllc0V4dHJhID0gKHR5cGU6IFNlYXJjaEZpbHRlcmFibGVUeXBlLCBzY29wZT86IEVudGl0eVNlYXJjaFNjb3BlKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHR5cGUgPT09ICd0YXNrJykgcmV0dXJuIGJ1aWxkVGFza1NlYXJjaEV4dHJhKHNjb3BlKVxuICBpZiAodHlwZSA9PT0gJ3Byb2plY3QnKSByZXR1cm4gYnVpbGRQcm9qZWN0U2VhcmNoRXh0cmEoc2NvcGUpXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBUYWIgYHRhc2tgIC8gYHByb2plY3RgOiBgZmlsdGVyc2Agc8OzbG8gdGlwbyArIGFyY2hpdmVkICh0YXJlYXM6IG5vIGFyY2hpdmFkYXMpOyBzY29wZSAoY2xpZW50SWQgLyBwcm9qZWN0SWQgZW4gdGFyZWFzKSBlbiBgZXh0cmFgLlxuICovXG5jb25zdCBidWlsZEZpbHRlcnNGb3JUeXBlID0gKHR5cGU6IFNlYXJjaEZpbHRlcmFibGVUeXBlKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGUgPT09ICdwcm9qZWN0Jykge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShCQVNFX0ZJTFRFUlNfQllfVFlQRS5wcm9qZWN0KVxuICB9XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShCQVNFX0ZJTFRFUlNfQllfVFlQRS50YXNrKVxufVxuXG4vKipcbiAqIEZpbHRyb3MgcGFyYSB1c2Vyc0RpcmVjdG9yeS4gRWwgYmFja2VuZCBlc3BlcmEgdW4gSlNPTiBzdHJpbmcgY29uXG4gKiB3aXRoUG9zaXRpb24sIHdpdGhUZWFtcyB5IHNlYXJjaElucHV0LiBMZSBhZ3JlZ2Ftb3MgY2xpZW50SWQvcHJvamVjdElkXG4gKiBkZWwgc2NvcGUgZW4gY2FzbyBkZSBxdWUgZWwgYmFja2VuZCBsb3MgYXByb3ZlY2hlIHBhcmEgZmlsdHJhciBwb3JcbiAqIGNvbnRleHRvIChzaSBubyBsb3MgZW50aWVuZGUgbG9zIGlnbm9yYSkuXG4gKi9cbmNvbnN0IGJ1aWxkVXNlcnNEaXJlY3RvcnlGaWx0ZXJzID0gKHE6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGJhc2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIHdpdGhQb3NpdGlvbjogdHJ1ZSxcbiAgICB3aXRoVGVhbXM6IHRydWUsXG4gIH1cbiAgY29uc3QgdHJpbW1lZFEgPSBxLnRyaW0oKVxuICBpZiAodHJpbW1lZFEpIHtcbiAgICBiYXNlLnNlYXJjaElucHV0ID0gdHJpbW1lZFFcbiAgfVxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYmFzZSlcbn1cblxuY29uc3QgaGlnaGxpZ2h0UmFuZ2UgPSAodGV4dDogc3RyaW5nLCBzZWFyY2hWYWx1ZTogc3RyaW5nKSA9PiB7XG4gIGlmICghc2VhcmNoVmFsdWUpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgaWR4ID0gdGV4dC50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc2VhcmNoVmFsdWUudG9Mb3dlckNhc2UoKSlcbiAgaWYgKGlkeCA8IDApIHJldHVybiB1bmRlZmluZWRcbiAgcmV0dXJuIHsgc3RhcnQ6IGlkeCwgbGVuZ3RoOiBzZWFyY2hWYWx1ZS5sZW5ndGggfVxufVxuXG5jb25zdCBmaXJzdERlZmluZWQgPSA8VD4oLi4udmFsdWVzOiBBcnJheTxUIHwgbnVsbCB8IHVuZGVmaW5lZD4pOiBUIHwgdW5kZWZpbmVkID0+XG4gIHZhbHVlcy5maW5kKHZhbHVlID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpXG5cbmNvbnN0IG5vcm1hbGl6ZVRyaW1tZWRTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgcmV0dXJuICcnXG4gIHJldHVybiB2YWx1ZS50cmltKClcbn1cblxuY29uc3QgZ2V0VXNlclBvc2l0aW9uTmFtZSA9ICh1c2VyUG9zaXRpb246IFJldHVyblR5cGU8dHlwZW9mIHVzZVVzZXI+Wyd1c2VyX3Bvc2l0aW9uJ10pOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZW9mIHVzZXJQb3NpdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiB1c2VyUG9zaXRpb24udHJpbSgpXG4gIGlmICh1c2VyUG9zaXRpb24gJiYgdHlwZW9mIHVzZXJQb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgJ25hbWUnIGluIHVzZXJQb3NpdGlvbikge1xuICAgIHJldHVybiBub3JtYWxpemVUcmltbWVkU3RyaW5nKHVzZXJQb3NpdGlvbi5uYW1lKVxuICB9XG4gIHJldHVybiAnJ1xufVxuXG5jb25zdCBtYXBDbGllbnRUb0l0ZW0gPSAoYzogUmF3Q2xpZW50LCBzZWFyY2hWYWx1ZTogc3RyaW5nKTogQ29udGV4dE1lbnRpb25JdGVtID0+ICh7XG4gIGlkOiBjLmlkLFxuICB0eXBlOiAnY2xpZW50JyxcbiAgcHJpbWFyeTogYy5uYW1lLFxuICBwcmltYXJ5SGlnaGxpZ2h0OiBoaWdobGlnaHRSYW5nZShjLm5hbWUsIHNlYXJjaFZhbHVlKSxcbiAgYnJlYWRjcnVtYjoge1xuICAgIGNvdW50OiBjLnRvdGFsUHJveWVjdG9zID8/IHVuZGVmaW5lZCxcbiAgICBjb3VudExhYmVsOiAncHJvamVjdHMnLFxuICB9LFxuICByYXc6IHtcbiAgICBpZDogYy5pZCxcbiAgICBuYW1lOiBjLm5hbWUsXG4gICAgdG90YWxQcm95ZWN0b3M6IGMudG90YWxQcm95ZWN0b3MgPz8gbnVsbCxcbiAgfSxcbn0pXG5cbmNvbnN0IG1hcFVzZXJUb0l0ZW0gPSAodTogUmF3RGlyZWN0b3J5VXNlciwgc2VhcmNoVmFsdWU6IHN0cmluZyk6IENvbnRleHRNZW50aW9uSXRlbSA9PiB7XG4gIGNvbnN0IGZ1bGxOYW1lID0gYCR7dS5maXJzdE5hbWUgPz8gJyd9ICR7dS5sYXN0TmFtZSA/PyAnJ31gLnRyaW0oKVxuICBjb25zdCBwcmltYXJ5ID0gZnVsbE5hbWUgfHwgdS5lbWFpbCB8fCBTdHJpbmcodS5pZClcblxuICByZXR1cm4ge1xuICAgIGlkOiB1LmlkLFxuICAgIHR5cGU6ICd1c2VyJyxcbiAgICBwcmltYXJ5LFxuICAgIHByaW1hcnlIaWdobGlnaHQ6IGhpZ2hsaWdodFJhbmdlKHByaW1hcnksIHNlYXJjaFZhbHVlKSxcbiAgICByYXc6IHtcbiAgICAgIGlkOiB1LmlkLFxuICAgICAgbmFtZTogcHJpbWFyeSxcbiAgICAgIHBpY3R1cmU6IHUucGljdHVyZSA/PyBudWxsLFxuICAgICAgcG9zaXRpb25OYW1lOiB1LnBvc2l0aW9uTmFtZSA/PyBudWxsLFxuICAgICAgZW1haWw6IHUuZW1haWwgPz8gbnVsbCxcbiAgICB9LFxuICB9XG59XG5cbmNvbnN0IG1hcENvclVzZXJUb1VzZXJJdGVtID0gKFxuICB1c2VyOiBSZXR1cm5UeXBlPHR5cGVvZiB1c2VVc2VyPixcbiAgc2VhcmNoVmFsdWU6IHN0cmluZyxcbiAgbWVMYWJlbDogc3RyaW5nXG4pOiBDb250ZXh0TWVudGlvbkl0ZW0gPT4ge1xuICBjb25zdCBmdWxsTmFtZSA9IGAke3VzZXIuZmlyc3ROYW1lID8/ICcnfSAke3VzZXIubGFzdE5hbWUgPz8gJyd9YC50cmltKClcbiAgLyoqIFNvbG8gY2FyZ28gcmVhbDsgc2luIGZhbGxiYWNrIGEgYHJvbGVgIChsYSBVSSBtdWVzdHJhIOKAnFNpbiBwb3NpY2nDs27igJ0gc2kgZmFsdGEpLiAqL1xuICBjb25zdCBwb3NpdGlvbkxpbmUgPSBnZXRVc2VyUG9zaXRpb25OYW1lKHVzZXIudXNlcl9wb3NpdGlvbikgfHwgbnVsbFxuICBjb25zdCBlbWFpbCA9IG5vcm1hbGl6ZVRyaW1tZWRTdHJpbmcodXNlci5lbWFpbCkgfHwgbnVsbFxuXG4gIHJldHVybiB7XG4gICAgaWQ6IHVzZXIuaWQsXG4gICAgdHlwZTogJ3VzZXInLFxuICAgIHByaW1hcnk6IG1lTGFiZWwsXG4gICAgcHJpbWFyeUhpZ2hsaWdodDogaGlnaGxpZ2h0UmFuZ2UobWVMYWJlbCwgc2VhcmNoVmFsdWUpLFxuICAgIHJhdzoge1xuICAgICAgaWQ6IHVzZXIuaWQsXG4gICAgICBuYW1lOiBmdWxsTmFtZSB8fCBTdHJpbmcodXNlci5pZCksXG4gICAgICBwaWN0dXJlOiB1c2VyLnBpY3R1cmUgfHwgbnVsbCxcbiAgICAgIHBvc2l0aW9uTmFtZTogcG9zaXRpb25MaW5lLFxuICAgICAgZW1haWwsXG4gICAgfSxcbiAgfVxufVxuXG5jb25zdCBtYXBSZWNlbnRUYXNrVG9JdGVtID0gKFxuICB0YXNrOiBSZWNlbnRUYXNrSXRlbSxcbiAgc2VhcmNoVmFsdWU6IHN0cmluZyxcbiAgc2hvd1Byb2plY3ROYW1lSW5UYXNrUm93ID0gdHJ1ZVxuKTogQ29udGV4dE1lbnRpb25JdGVtID0+IHtcbiAgY29uc3QgcHJpbWFyeSA9ICh0YXNrLnRpdGxlICYmIHRhc2sudGl0bGUudHJpbSgpKSB8fCBTdHJpbmcodGFzay5pZClcbiAgY29uc3QgcHJvamVjdE5hbWUgPSBzaG93UHJvamVjdE5hbWVJblRhc2tSb3cgPyAodGFzay5wcm9qZWN0TmFtZSA/PyBudWxsKSA6IG51bGxcbiAgcmV0dXJuIHtcbiAgICBpZDogdGFzay5pZCxcbiAgICB0eXBlOiAndGFzaycsXG4gICAgcHJpbWFyeSxcbiAgICBwcmltYXJ5SGlnaGxpZ2h0OiBoaWdobGlnaHRSYW5nZShwcmltYXJ5LCBzZWFyY2hWYWx1ZSksXG4gICAgYnJlYWRjcnVtYjogcHJvamVjdE5hbWUgPyB7IHBhcmVudDogcHJvamVjdE5hbWUgfSA6IHVuZGVmaW5lZCxcbiAgICByYXc6IHtcbiAgICAgIGlkOiB0YXNrLmlkLFxuICAgICAgbmFtZTogcHJpbWFyeSxcbiAgICAgIHByb2plY3ROYW1lLFxuICAgIH0sXG4gIH1cbn1cblxuY29uc3Qgbm9ybWFsaXplVGFza0ZhbWlseVJlY29yZCA9IChyZWNvcmQ6IFRhc2tGYW1pbHlSZWNvcmQpOiBSZWNlbnRUYXNrSXRlbSB8IG51bGwgPT4ge1xuICBjb25zdCB7IF9pZDogdGFza0ZhbWlseUlkIH0gPSByZWNvcmRcbiAgY29uc3QgaWQgPSB0YXNrRmFtaWx5SWRcbiAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwgfHwgU3RyaW5nKGlkKSA9PT0gJycpIHJldHVybiBudWxsXG4gIGNvbnN0IHRpdGxlID0gKHJlY29yZC50aXRsZSA/PyAnJykudHJpbSgpIHx8IFN0cmluZyhpZClcbiAgY29uc3QgcHJvamVjdE5hbWUgPSBmaXJzdERlZmluZWQocmVjb3JkLnByb2plY3Q/Lm5hbWUsIHJlY29yZC5mYXRoZXI/LnRpdGxlKSA/PyBudWxsXG4gIGNvbnN0IGhhc0ZhdGhlciA9ICEhZmlyc3REZWZpbmVkKHJlY29yZC50YXNrRmF0aGVyLCByZWNvcmQuZmF0aGVyPy5pZClcbiAgcmV0dXJuIHtcbiAgICBpZCxcbiAgICB0aXRsZSxcbiAgICB0eXBlOiBoYXNGYXRoZXIgPyAnc3VidGFzaycgOiAndGFzaycsXG4gICAgcHJvamVjdE5hbWUsXG4gIH1cbn1cblxuY29uc3Qgbm9ybWFsaXplUHJvamVjdHNGYWxsYmFja1JlY29yZCA9IChyZWNvcmQ6IEZhbGxiYWNrUHJvamVjdFJlY29yZCk6IFJhd1NlYXJjaFJlc3VsdCB8IG51bGwgPT4ge1xuICBjb25zdCB7IGlkIH0gPSByZWNvcmRcbiAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwgfHwgU3RyaW5nKGlkKSA9PT0gJycpIHJldHVybiBudWxsXG4gIGNvbnN0IHRpdGxlID0gcmVjb3JkLm5hbWUgPz8gJydcbiAgY29uc3QgY2xpZW50SWQgPSBmaXJzdERlZmluZWQocmVjb3JkLmNsaWVudElkLCByZWNvcmQuY2xpZW50Py5pZCkgPz8gbnVsbFxuICBjb25zdCBjbGllbnROYW1lID0gcmVjb3JkLmNsaWVudD8ubmFtZSA/PyBudWxsXG4gIHJldHVybiB7XG4gICAgaWQsXG4gICAgdGl0bGUsXG4gICAgdHlwZTogJ3Byb2plY3QnLFxuICAgIGNsaWVudElkLFxuICAgIGNsaWVudE5hbWUsXG4gIH1cbn1cblxuY29uc3QgbWFwU2VhcmNoVG9JdGVtID0gKFxuICByOiBSYXdTZWFyY2hSZXN1bHQsXG4gIHR5cGU6IENvbnRleHRFbnRpdHlUeXBlLFxuICBzZWFyY2hWYWx1ZTogc3RyaW5nLFxuICBzaG93UHJvamVjdE5hbWVJblRhc2tSb3cgPSB0cnVlXG4pOiBDb250ZXh0TWVudGlvbkl0ZW0gPT4ge1xuICBjb25zdCBwcmltYXJ5ID0gci50aXRsZSB8fCByLnByb2plY3ROYW1lIHx8ICcnXG4gIGxldCBwYXJlbnQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbiAgaWYgKHR5cGUgPT09ICdwcm9qZWN0JykgcGFyZW50ID0gci5jbGllbnROYW1lXG4gIGVsc2UgaWYgKHR5cGUgPT09ICd0YXNrJykgcGFyZW50ID0gdW5kZWZpbmVkXG4gIGVsc2UgcGFyZW50ID0gci5wcm9qZWN0TmFtZSA/PyByLmNsaWVudE5hbWVcblxuICBjb25zdCBmYXRoZXIgPSB0eXBlID09PSAndGFzaycgPyByLmZhdGhlciA6IG51bGxcbiAgY29uc3QgaGFzRmF0aGVyID0gdHlwZSA9PT0gJ3Rhc2snICYmIGZhdGhlciAhPSBudWxsICYmIGZhdGhlci5pZCAhPSBudWxsICYmIFN0cmluZyhmYXRoZXIuaWQpLmxlbmd0aCA+IDBcblxuICBjb25zdCB0YXNrUHJvamVjdE5hbWUgPSB0eXBlID09PSAndGFzaycgJiYgIXNob3dQcm9qZWN0TmFtZUluVGFza1JvdyA/IG51bGwgOiAoci5wcm9qZWN0TmFtZSA/PyBudWxsKVxuXG4gIHJldHVybiB7XG4gICAgaWQ6IHIuaWQsXG4gICAgdHlwZSxcbiAgICBwcmltYXJ5LFxuICAgIHByaW1hcnlIaWdobGlnaHQ6IGhpZ2hsaWdodFJhbmdlKHByaW1hcnksIHNlYXJjaFZhbHVlKSxcbiAgICBicmVhZGNydW1iOiBwYXJlbnQgPyB7IHBhcmVudCB9IDogdW5kZWZpbmVkLFxuICAgIHJhdzoge1xuICAgICAgaWQ6IHIuaWQsXG4gICAgICBuYW1lOiBwcmltYXJ5LFxuICAgICAgY2xpZW50SWQ6IHIuY2xpZW50SWQgPz8gbnVsbCxcbiAgICAgIGNsaWVudE5hbWU6IHIuY2xpZW50TmFtZSA/PyBudWxsLFxuICAgICAgcHJvamVjdE5hbWU6IHRhc2tQcm9qZWN0TmFtZSxcbiAgICAgIGZlZUlkOiByLmZlZUlkID8/IG51bGwsXG4gICAgICBmYXRoZXJJZDogaGFzRmF0aGVyID8gZmF0aGVyLmlkIDogbnVsbCxcbiAgICAgIGZhdGhlclRpdGxlOiBoYXNGYXRoZXIgPyBmYXRoZXIudGl0bGU/LnRyaW0oKSB8fCBudWxsIDogbnVsbCxcbiAgICB9LFxuICB9XG59XG5cbmNvbnN0IGZvcm1hdE1jcFByaW1hcnlMYWJlbCA9IChzbHVnOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgc2x1Zy5yZXBsYWNlKC9fL2csICcgJykucmVwbGFjZSgvXFxiXFx3L2csIGNoYXIgPT4gY2hhci50b1VwcGVyQ2FzZSgpKVxuXG5jb25zdCBtYXBNY3BTbHVnc1RvSXRlbXMgPSAoc2x1Z3M6IHN0cmluZ1tdLCBzZWFyY2hWYWx1ZTogc3RyaW5nKTogQ29udGV4dE1lbnRpb25JdGVtW10gPT4ge1xuICBjb25zdCBxID0gc2VhcmNoVmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgbGV0IGZpbHRlcmVkID0gc2x1Z3NcbiAgaWYgKHEpIHtcbiAgICBmaWx0ZXJlZCA9IHNsdWdzLmZpbHRlcihzID0+IHtcbiAgICAgIGNvbnN0IHByaW1hcnkgPSBmb3JtYXRNY3BQcmltYXJ5TGFiZWwocylcbiAgICAgIHJldHVybiBzLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgfHwgcHJpbWFyeS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpXG4gICAgfSlcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQubWFwKHNsdWcgPT4ge1xuICAgIGNvbnN0IHByaW1hcnkgPSBmb3JtYXRNY3BQcmltYXJ5TGFiZWwoc2x1ZylcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHNsdWcsXG4gICAgICB0eXBlOiAnbWNwJyBhcyBjb25zdCxcbiAgICAgIHByaW1hcnksXG4gICAgICBwcmltYXJ5SGlnaGxpZ2h0OiBoaWdobGlnaHRSYW5nZShwcmltYXJ5LCBzZWFyY2hWYWx1ZSksXG4gICAgICByYXc6IHtcbiAgICAgICAgaWQ6IHNsdWcsXG4gICAgICAgIG5hbWU6IHByaW1hcnksXG4gICAgICB9LFxuICAgIH1cbiAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IHVzZUVudGl0eVNlYXJjaCA9ICh0eXBlOiBDb250ZXh0RW50aXR5VHlwZSwgc2NvcGU/OiBFbnRpdHlTZWFyY2hTY29wZSkgPT4ge1xuICBjb25zdCBjb3JVc2VyID0gdXNlVXNlcigpXG4gIGNvbnN0IHsgdCB9ID0gdXNlVCgpXG4gIC8qKiBFdml0YSBhcGxpY2FyIHJlc3VsdGFkb3MgZGUgdW4gYGZldGNoUmVjZW50YCB2aWVqbyBjdWFuZG8gZWwgdXN1YXJpbyB5YSBjYW1iacOzIGRlIHRhYiAocmFjZSBhc3luYykuICovXG4gIGNvbnN0IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYgPSB1c2VSZWYoMClcbiAgY29uc3QgW3NlYXJjaFZhbHVlLCBzZXRTZWFyY2hWYWx1ZV0gPSB1c2VTdGF0ZSgnJylcbiAgY29uc3QgZGVib3VuY2VkU2VhcmNoVmFsdWUgPSB1c2VEZWJvdW5jZShzZWFyY2hWYWx1ZSwgU0VBUkNIX1FVRVJZX0RFQk9VTkNFX01TKVxuXG4gIGNvbnN0IFtpdGVtcywgc2V0SXRlbXNdID0gdXNlU3RhdGU8Q29udGV4dE1lbnRpb25JdGVtW10+KFtdKVxuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2hpZGVSZWNlbnRzTGFiZWwsIHNldEhpZGVSZWNlbnRzTGFiZWxdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtoYXNNb3JlLCBzZXRIYXNNb3JlXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbaXNMb2FkaW5nTW9yZSwgc2V0SXNMb2FkaW5nTW9yZV0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2N1cnJlbnRQYWdlLCBzZXRDdXJyZW50UGFnZV0gPSB1c2VTdGF0ZSgxKVxuICBjb25zdCBbYWN0aXZlUGFnaW5hdGlvblNvdXJjZSwgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZV0gPSB1c2VTdGF0ZTxQYWdpbmF0aW9uU291cmNlPignbm9uZScpXG5cbiAgY29uc3QgbWNwU2x1Z3NLZXkgPSAoc2NvcGU/Lm1jcFNsdWdzID8/IFtdKS5qb2luKCd8JylcbiAgY29uc3Qgc2hvd1Byb2plY3ROYW1lSW5UYXNrUm93ID0gc2NvcGU/LmFnZW50RW50aXR5ICE9PSAncHJvamVjdCdcblxuICAvLyBFc3RhYmlsaXphbW9zIGVsIHNjb3BlIHBhcmEgbm8gZGlzcGFyYXIgZmV0Y2hzIHBvciBjYW1iaW9zIGRlIGlkZW50aWRhZCBkZSBvYmpldG8uXG4gIGNvbnN0IHN0YWJsZVNjb3BlID0gdXNlTWVtbzxFbnRpdHlTZWFyY2hTY29wZT4oXG4gICAgKCkgPT4gKHtcbiAgICAgIGNsaWVudElkOiBzY29wZT8uY2xpZW50SWQgPz8gbnVsbCxcbiAgICAgIHByb2plY3RJZDogc2NvcGU/LnByb2plY3RJZCA/PyBudWxsLFxuICAgICAgbWNwU2x1Z3M6IHNjb3BlPy5tY3BTbHVncyA/PyBbXSxcbiAgICAgIGFnZW50RW50aXR5OiBzY29wZT8uYWdlbnRFbnRpdHkgPz8gbnVsbCxcbiAgICB9KSxcbiAgICBbc2NvcGU/LmNsaWVudElkLCBzY29wZT8ucHJvamVjdElkLCBtY3BTbHVnc0tleSwgc2NvcGU/LmFnZW50RW50aXR5XVxuICApXG5cbiAgLy8gLS0tIFNlYXJjaDogcHJvamVjdCB8IHRhc2sgKEdyYXBoUUw6IHNlYXJjaCkgLS0tXG4gIGNvbnN0IFtmZXRjaFNlYXJjaEVudGl0aWVzLCB7IGRhdGE6IHNlYXJjaERhdGEsIGxvYWRpbmc6IHNlYXJjaExvYWRpbmcsIGVycm9yOiBzZWFyY2hFcnJvciB9XSA9XG4gICAgdXNlTGF6eVF1ZXJ5PFNlYXJjaEVudGl0aWVzRGF0YT4oU0VBUkNIX0VOVElUSUVTLCB7XG4gICAgICB2YXJpYWJsZXM6IHsgbGltaXQ6IDIwIH0sXG4gICAgICBmZXRjaFBvbGljeTogJ25ldHdvcmstb25seScsXG4gICAgfSlcblxuICAvLyAtLS0gU2VhcmNoOiBjbGllbnQgKEdyYXBoUUwpIC0tLVxuICBjb25zdCBbZmV0Y2hTZWFyY2hDbGllbnRzLCB7IGRhdGE6IGNsaWVudHNEYXRhLCBsb2FkaW5nOiBjbGllbnRzTG9hZGluZywgZXJyb3I6IGNsaWVudHNFcnJvciB9XSA9XG4gICAgdXNlTGF6eVF1ZXJ5PFNlYXJjaENsaWVudHNEYXRhPihTRUFSQ0hfQ0xJRU5UUywge1xuICAgICAgZmV0Y2hQb2xpY3k6ICduZXR3b3JrLW9ubHknLFxuICAgIH0pXG5cbiAgLy8gLS0tIFNlYXJjaDogdXNlciAoR3JhcGhRTDogdXNlcnNEaXJlY3RvcnkpIC0tLVxuICBjb25zdCBbZmV0Y2hVc2Vyc0RpcmVjdG9yeSwgeyBkYXRhOiB1c2Vyc0RhdGEsIGxvYWRpbmc6IHVzZXJzTG9hZGluZywgZXJyb3I6IHVzZXJzRXJyb3IgfV0gPVxuICAgIHVzZUxhenlRdWVyeTxVc2Vyc0RpcmVjdG9yeURhdGE+KFVTRVJTX0RJUkVDVE9SWSwge1xuICAgICAgZmV0Y2hQb2xpY3k6ICduZXR3b3JrLW9ubHknLFxuICAgIH0pXG5cbiAgY29uc3Qgc3luY1VzZXJzUGFnaW5hdGlvbiA9IHVzZUNhbGxiYWNrKChwYXlsb2FkPzogVXNlcnNEaXJlY3RvcnlEYXRhIHwgbnVsbCkgPT4ge1xuICAgIGNvbnN0IHBhZ2UgPSBub3JtYWxpemVQb3NpdGl2ZUludChwYXlsb2FkPy51c2Vyc0RpcmVjdG9yeT8ucGFnZSwgMSlcbiAgICBjb25zdCBsYXN0UGFnZSA9IG5vcm1hbGl6ZVBvc2l0aXZlSW50KHBheWxvYWQ/LnVzZXJzRGlyZWN0b3J5Py5sYXN0UGFnZSwgcGFnZSlcbiAgICBzZXRDdXJyZW50UGFnZShwYWdlKVxuICAgIHNldEhhc01vcmUocGFnZSA8IGxhc3RQYWdlKVxuICB9LCBbXSlcblxuICBjb25zdCBzeW5jQ2xpZW50c1BhZ2luYXRpb24gPSB1c2VDYWxsYmFjaygocGF5bG9hZD86IFNlYXJjaENsaWVudHNEYXRhIHwgbnVsbCkgPT4ge1xuICAgIGNvbnN0IHBhZ2UgPSBub3JtYWxpemVQb3NpdGl2ZUludChwYXlsb2FkPy5jbGllbnRzPy5wYWdlLCAxKVxuICAgIGNvbnN0IGxhc3RQYWdlID0gbm9ybWFsaXplUG9zaXRpdmVJbnQocGF5bG9hZD8uY2xpZW50cz8ubGFzdFBhZ2UsIHBhZ2UpXG4gICAgc2V0Q3VycmVudFBhZ2UocGFnZSlcbiAgICBzZXRIYXNNb3JlKHBhZ2UgPCBsYXN0UGFnZSlcbiAgfSwgW10pXG5cbiAgY29uc3Qgc3luY1Rhc2tGYWxsYmFja1BhZ2luYXRpb24gPSB1c2VDYWxsYmFjaygocGF5bG9hZD86IFRhc2tGYW1pbHlEYXRhIHwgbnVsbCkgPT4ge1xuICAgIGNvbnN0IHJhd1BhZ2UgPSBOdW1iZXIocGF5bG9hZD8udGFza0ZhbWlseT8ucGFnZSlcbiAgICAvLyB0YXNrRmFtaWx5IHVzYSBww6FnaW5hcyAwLWJhc2VkOyBjb252ZXJ0aW1vcyBhIDEtYmFzZWQgcGFyYSBjb25zaXN0ZW5jaWEgY29uIGVsIHJlc3RvXG4gICAgY29uc3QgcGFnZSA9IE51bWJlci5pc0Zpbml0ZShyYXdQYWdlKSAmJiByYXdQYWdlID49IDAgPyBNYXRoLmZsb29yKHJhd1BhZ2UpICsgMSA6IDFcbiAgICBjb25zdCBsYXN0UGFnZSA9IG5vcm1hbGl6ZVBvc2l0aXZlSW50KHBheWxvYWQ/LnRhc2tGYW1pbHk/Lmxhc3RQYWdlLCBwYWdlKVxuICAgIHNldEN1cnJlbnRQYWdlKHBhZ2UpXG4gICAgc2V0SGFzTW9yZShwYWdlIDwgbGFzdFBhZ2UpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHN5bmNQcm9qZWN0RmFsbGJhY2tQYWdpbmF0aW9uID0gdXNlQ2FsbGJhY2soKHBheWxvYWQ/OiBQcm9qZWN0c0ZhbGxiYWNrRGF0YSB8IG51bGwpID0+IHtcbiAgICBjb25zdCBwYWdlID0gbm9ybWFsaXplUG9zaXRpdmVJbnQocGF5bG9hZD8ucHJvamVjdHM/LnBhZ2UsIDEpXG4gICAgY29uc3QgbGFzdFBhZ2UgPSBub3JtYWxpemVQb3NpdGl2ZUludChwYXlsb2FkPy5wcm9qZWN0cz8ubGFzdFBhZ2UsIHBhZ2UpXG4gICAgc2V0Q3VycmVudFBhZ2UocGFnZSlcbiAgICBzZXRIYXNNb3JlKHBhZ2UgPCBsYXN0UGFnZSlcbiAgfSwgW10pXG5cbiAgY29uc3QgW2ZldGNoVGFza0ZhbWlseUZhbGxiYWNrXSA9IHVzZUxhenlRdWVyeTxUYXNrRmFtaWx5RGF0YT4oVEFTS19GQU1JTFlfRkFMTEJBQ0ssIHtcbiAgICBmZXRjaFBvbGljeTogJ25ldHdvcmstb25seScsXG4gIH0pXG5cbiAgY29uc3QgW2ZldGNoUHJvamVjdHNGYWxsYmFja10gPSB1c2VMYXp5UXVlcnk8UHJvamVjdHNGYWxsYmFja0RhdGE+KFBST0pFQ1RTX0ZBTExCQUNLLCB7XG4gICAgZmV0Y2hQb2xpY3k6ICduZXR3b3JrLW9ubHknLFxuICB9KVxuXG4gIGNvbnN0IGZldGNoUmVjZW50ID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudCArPSAxXG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudFxuXG4gICAgaWYgKHR5cGUgPT09ICdtY3AnKSB7XG4gICAgICBjb25zdCBzbHVncyA9IHN0YWJsZVNjb3BlLm1jcFNsdWdzID8/IFtdXG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgc2V0RXJyb3IoZmFsc2UpXG4gICAgICBzZXRJdGVtcyhtYXBNY3BTbHVnc1RvSXRlbXMoc2x1Z3MsICcnKSlcbiAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwoZmFsc2UpXG4gICAgICBzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlKCdub25lJylcbiAgICAgIHNldEhhc01vcmUoZmFsc2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgc2V0RXJyb3IoZmFsc2UpXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlID09PSAnY2xpZW50Jykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0UmVjZW50Q2xpZW50cygpXG4gICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgICBjb25zdCBtYXBwZWQgPSAoZGF0YSA/PyBbXSkubWFwKGMgPT4gbWFwQ2xpZW50VG9JdGVtKGMsICcnKSlcbiAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG4gICAgICAgIHNldEl0ZW1zKG1hcHBlZClcbiAgICAgICAgc2V0SGlkZVJlY2VudHNMYWJlbChmYWxzZSlcbiAgICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgnbm9uZScpXG4gICAgICAgIHNldEhhc01vcmUoZmFsc2UpXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdwcm9qZWN0Jykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0UmVjZW50UHJvamVjdHMoc3RhYmxlU2NvcGUuY2xpZW50SWQgPyB7IGNsaWVudElkOiBzdGFibGVTY29wZS5jbGllbnRJZCB9IDogdW5kZWZpbmVkKVxuICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPT0gcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZi5jdXJyZW50KSByZXR1cm5cbiAgICAgICAgbGV0IG1hcHBlZCA9IChBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtdKS5tYXAocCA9PlxuICAgICAgICAgIG1hcFNlYXJjaFRvSXRlbShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWQ6IHAuaWQsXG4gICAgICAgICAgICAgIHRpdGxlOiBwLnRpdGxlLFxuICAgICAgICAgICAgICB0eXBlOiAncHJvamVjdCcsXG4gICAgICAgICAgICAgIGNsaWVudElkOiBwLmNsaWVudElkLFxuICAgICAgICAgICAgICBmZWVJZDogcC5mZWVJZCxcbiAgICAgICAgICAgICAgY2xpZW50TmFtZTogcC5jbGllbnROYW1lLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdwcm9qZWN0JyxcbiAgICAgICAgICAgICcnXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIGlmIChtYXBwZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29uc3QgYXJndW1lbnRzRmlsdGVyID1cbiAgICAgICAgICAgIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSBudWxsICYmIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSB1bmRlZmluZWQgJiYgc3RhYmxlU2NvcGUuY2xpZW50SWQgIT09ICcnXG4gICAgICAgICAgICAgID8geyBjbGllbnRfaWQ6IFtTdHJpbmcoc3RhYmxlU2NvcGUuY2xpZW50SWQpXSB9XG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgY29uc3QgeyBkYXRhOiBmYWxsYmFja0RhdGEgfSA9IGF3YWl0IGZldGNoUHJvamVjdHNGYWxsYmFjayh7XG4gICAgICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICAgICAgLi4uKGFyZ3VtZW50c0ZpbHRlciA/IHsgYXJndW1lbnRzOiBhcmd1bWVudHNGaWx0ZXIgfSA6IHt9KSxcbiAgICAgICAgICAgICAgcGFnZTogMSxcbiAgICAgICAgICAgICAgcGVyUGFnZTogMjAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG4gICAgICAgICAgY29uc3QgZmFsbGJhY2tNYXBwZWQgPSAoZmFsbGJhY2tEYXRhPy5wcm9qZWN0cz8uZGF0YSA/PyBbXSlcbiAgICAgICAgICAgIC5tYXAobm9ybWFsaXplUHJvamVjdHNGYWxsYmFja1JlY29yZClcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIFJhd1NlYXJjaFJlc3VsdCA9PiBpdGVtICE9PSBudWxsKVxuICAgICAgICAgICAgLm1hcChpdGVtID0+IG1hcFNlYXJjaFRvSXRlbShpdGVtLCAncHJvamVjdCcsICcnKSlcbiAgICAgICAgICBtYXBwZWQgPSBmYWxsYmFja01hcHBlZFxuICAgICAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwoZmFsbGJhY2tNYXBwZWQubGVuZ3RoID4gMClcbiAgICAgICAgICBzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlKCdwcm9qZWN0LWZhbGxiYWNrJylcbiAgICAgICAgICBzeW5jUHJvamVjdEZhbGxiYWNrUGFnaW5hdGlvbihmYWxsYmFja0RhdGEpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0SGlkZVJlY2VudHNMYWJlbChmYWxzZSlcbiAgICAgICAgICBzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlKCdub25lJylcbiAgICAgICAgICBzZXRIYXNNb3JlKGZhbHNlKVxuICAgICAgICB9XG4gICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgICBzZXRJdGVtcyhtYXBwZWQpXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd0YXNrJykge1xuICAgICAgICBsZXQgcmVjZW50VGFza0ZpbHRlcnM6IHsgcHJvamVjdElkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbDsgY2xpZW50SWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIH0gfCB1bmRlZmluZWRcbiAgICAgICAgaWYgKHN0YWJsZVNjb3BlLmFnZW50RW50aXR5ID09PSAncHJvamVjdCcpIHtcbiAgICAgICAgICByZWNlbnRUYXNrRmlsdGVycyA9IHsgcHJvamVjdElkOiBzdGFibGVTY29wZS5wcm9qZWN0SWQgfVxuICAgICAgICB9IGVsc2UgaWYgKHN0YWJsZVNjb3BlLmFnZW50RW50aXR5ID09PSAnY2xpZW50Jykge1xuICAgICAgICAgIHJlY2VudFRhc2tGaWx0ZXJzID0geyBjbGllbnRJZDogc3RhYmxlU2NvcGUuY2xpZW50SWQgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRSZWNlbnRUYXNrcyhyZWNlbnRUYXNrRmlsdGVycylcbiAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG4gICAgICAgIGxldCB0YXNrSXRlbXMgPSAoZGF0YSA/PyBbXSkubWFwKHRhc2sgPT4gbWFwUmVjZW50VGFza1RvSXRlbSh0YXNrLCAnJywgc2hvd1Byb2plY3ROYW1lSW5UYXNrUm93KSlcbiAgICAgICAgaWYgKHRhc2tJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9XG4gICAgICAgICAgaWYgKHN0YWJsZVNjb3BlLnByb2plY3RJZCAhPT0gbnVsbCAmJiBzdGFibGVTY29wZS5wcm9qZWN0SWQgIT09IHVuZGVmaW5lZCAmJiBzdGFibGVTY29wZS5wcm9qZWN0SWQgIT09ICcnKSB7XG4gICAgICAgICAgICBmaWx0ZXIucHJvamVjdElkcyA9IFtTdHJpbmcoc3RhYmxlU2NvcGUucHJvamVjdElkKV1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSBudWxsICYmIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSB1bmRlZmluZWQgJiYgc3RhYmxlU2NvcGUuY2xpZW50SWQgIT09ICcnKSB7XG4gICAgICAgICAgICBmaWx0ZXIuY2xpZW50SWRzID0gW1N0cmluZyhzdGFibGVTY29wZS5jbGllbnRJZCldXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHsgZGF0YTogZmFsbGJhY2tEYXRhIH0gPSBhd2FpdCBmZXRjaFRhc2tGYW1pbHlGYWxsYmFjayh7XG4gICAgICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICAgICAgZmlsdGVyOiB7IGFyY2hpdmVkOiBmYWxzZSwgLi4uZmlsdGVyIH0sXG4gICAgICAgICAgICAgIHBhZ2luYXRpb246IHsgb2Zmc2V0OiAwLCBzaXplOiAyMCB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgICAgIHRhc2tJdGVtcyA9IChmYWxsYmFja0RhdGE/LnRhc2tGYW1pbHk/LmRhdGEgPz8gW10pXG4gICAgICAgICAgICAubWFwKG5vcm1hbGl6ZVRhc2tGYW1pbHlSZWNvcmQpXG4gICAgICAgICAgICAuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBSZWNlbnRUYXNrSXRlbSA9PiBpdGVtICE9PSBudWxsKVxuICAgICAgICAgICAgLm1hcCh0YXNrID0+IG1hcFJlY2VudFRhc2tUb0l0ZW0odGFzaywgJycsIHNob3dQcm9qZWN0TmFtZUluVGFza1JvdykpXG4gICAgICAgICAgc2V0SGlkZVJlY2VudHNMYWJlbCh0YXNrSXRlbXMubGVuZ3RoID4gMClcbiAgICAgICAgICBzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlKCd0YXNrLWZhbGxiYWNrJylcbiAgICAgICAgICBzeW5jVGFza0ZhbGxiYWNrUGFnaW5hdGlvbihmYWxsYmFja0RhdGEpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0SGlkZVJlY2VudHNMYWJlbChmYWxzZSlcbiAgICAgICAgICBzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlKCdub25lJylcbiAgICAgICAgICBzZXRIYXNNb3JlKGZhbHNlKVxuICAgICAgICB9XG4gICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSByZWNlbnRzRmV0Y2hHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgICBzZXRJdGVtcyh0YXNrSXRlbXMpXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd1c2VyJykge1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGZldGNoVXNlcnNEaXJlY3Rvcnkoe1xuICAgICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgICAgZmlsdGVyczogYnVpbGRVc2Vyc0RpcmVjdG9yeUZpbHRlcnMoJycpLFxuICAgICAgICAgICAgcGFnZTogMSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPT0gcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZi5jdXJyZW50KSByZXR1cm5cbiAgICAgICAgY29uc3QgbWFwcGVkID0gKGRhdGE/LnVzZXJzRGlyZWN0b3J5Py5kYXRhID8/IFtdKS5tYXAodSA9PiBtYXBVc2VyVG9JdGVtKHUsICcnKSlcbiAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG4gICAgICAgIGNvbnN0IG1lSXRlbSA9IG1hcENvclVzZXJUb1VzZXJJdGVtKGNvclVzZXIsICcnLCB0KCdjb250ZXh0TWVudGlvbi5tZScpKVxuICAgICAgICBjb25zdCB3aXRob3V0TWUgPSBtYXBwZWQuZmlsdGVyKGl0ZW0gPT4gU3RyaW5nKGl0ZW0uaWQpICE9PSBTdHJpbmcobWVJdGVtLmlkKSlcbiAgICAgICAgc2V0SXRlbXMoW21lSXRlbSwgLi4ud2l0aG91dE1lXSlcbiAgICAgICAgc3luY1VzZXJzUGFnaW5hdGlvbihkYXRhKVxuICAgICAgICBzZXRIaWRlUmVjZW50c0xhYmVsKGZhbHNlKVxuICAgICAgICBzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlKCd1c2VycycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPT0gcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZi5jdXJyZW50KSByZXR1cm5cbiAgICAgICAgc2V0SXRlbXMoW10pXG4gICAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwoZmFsc2UpXG4gICAgICAgIHNldEFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UoJ25vbmUnKVxuICAgICAgICBzZXRIYXNNb3JlKGZhbHNlKVxuICAgICAgICBzZXRDdXJyZW50UGFnZSgxKVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG4gICAgICBzZXRFcnJvcih0cnVlKVxuICAgICAgc2V0SXRlbXMoW10pXG4gICAgICBzZXRIaWRlUmVjZW50c0xhYmVsKGZhbHNlKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoZ2VuZXJhdGlvbiA9PT0gcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZi5jdXJyZW50KSB7XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICB9XG4gICAgfVxuICB9LCBbXG4gICAgdHlwZSxcbiAgICBzdGFibGVTY29wZSxcbiAgICBmZXRjaFVzZXJzRGlyZWN0b3J5LFxuICAgIGZldGNoVGFza0ZhbWlseUZhbGxiYWNrLFxuICAgIGZldGNoUHJvamVjdHNGYWxsYmFjayxcbiAgICBzeW5jVXNlcnNQYWdpbmF0aW9uLFxuICAgIHN5bmNUYXNrRmFsbGJhY2tQYWdpbmF0aW9uLFxuICAgIHN5bmNQcm9qZWN0RmFsbGJhY2tQYWdpbmF0aW9uLFxuICAgIHNob3dQcm9qZWN0TmFtZUluVGFza1JvdyxcbiAgICBjb3JVc2VyLFxuICAgIHQsXG4gIF0pXG5cbiAgLy8gRGlzcGFyYXIgc2VhcmNoIGFsIGNhbWJpYXIgZGVib3VuY2VkIHZhbHVlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgcSA9IGRlYm91bmNlZFNlYXJjaFZhbHVlLnRyaW0oKVxuXG4gICAgaWYgKHR5cGUgPT09ICdtY3AnKSB7XG4gICAgICBjb25zdCBzbHVncyA9IHN0YWJsZVNjb3BlLm1jcFNsdWdzID8/IFtdXG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgc2V0RXJyb3IoZmFsc2UpXG4gICAgICBzZXRJdGVtcyhtYXBNY3BTbHVnc1RvSXRlbXMoc2x1Z3MsIHEpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFxKSByZXR1cm5cblxuICAgIGlmICh0eXBlID09PSAnY2xpZW50Jykge1xuICAgICAgZmV0Y2hTZWFyY2hDbGllbnRzKHtcbiAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgZmlsdGVyOiB7IG5hbWU6IHEgfSxcbiAgICAgICAgICBwYWdlOiAxLFxuICAgICAgICAgIHBlclBhZ2U6IDIwLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIHNldEFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UoJ2NsaWVudHMtc2VhcmNoJylcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd1c2VyJykge1xuICAgICAgZmV0Y2hVc2Vyc0RpcmVjdG9yeSh7XG4gICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgIGZpbHRlcnM6IGJ1aWxkVXNlcnNEaXJlY3RvcnlGaWx0ZXJzKHEpLFxuICAgICAgICAgIHBhZ2U6IDEsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgndXNlcnMnKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmaWx0ZXJzID0gYnVpbGRGaWx0ZXJzRm9yVHlwZSh0eXBlKVxuICAgICAgY29uc3QgZXh0cmEgPSBidWlsZFNlYXJjaEVudGl0aWVzRXh0cmEodHlwZSwgc3RhYmxlU2NvcGUpXG4gICAgICBmZXRjaFNlYXJjaEVudGl0aWVzKHtcbiAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgcSxcbiAgICAgICAgICBmaWx0ZXJzLFxuICAgICAgICAgIC4uLihleHRyYSAhPT0gdW5kZWZpbmVkID8geyBleHRyYSB9IDoge30pLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIHNldEFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UoJ25vbmUnKVxuICAgICAgc2V0SGFzTW9yZShmYWxzZSlcbiAgICB9XG4gIH0sIFtkZWJvdW5jZWRTZWFyY2hWYWx1ZSwgdHlwZSwgc3RhYmxlU2NvcGUsIGZldGNoU2VhcmNoRW50aXRpZXMsIGZldGNoU2VhcmNoQ2xpZW50cywgZmV0Y2hVc2Vyc0RpcmVjdG9yeV0pXG5cbiAgLy8gU2luY3Jvbml6YXIgcmVzdWx0YWRvcyBkZSBzZWFyY2hcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZSA9PT0gJ21jcCcpIHJldHVyblxuXG4gICAgY29uc3QgcSA9IGRlYm91bmNlZFNlYXJjaFZhbHVlLnRyaW0oKVxuICAgIGlmICghcSkgcmV0dXJuXG4gICAgc2V0SGlkZVJlY2VudHNMYWJlbChmYWxzZSlcblxuICAgIGlmICh0eXBlID09PSAnY2xpZW50Jykge1xuICAgICAgc2V0TG9hZGluZyhjbGllbnRzTG9hZGluZylcbiAgICAgIGlmIChjbGllbnRzRXJyb3IpIHtcbiAgICAgICAgc2V0RXJyb3IodHJ1ZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoY2xpZW50c0RhdGE/LmNsaWVudHM/LmRhdGEpIHtcbiAgICAgICAgc2V0SXRlbXMoY2xpZW50c0RhdGEuY2xpZW50cy5kYXRhLm1hcChjID0+IG1hcENsaWVudFRvSXRlbShjLCBxKSkpXG4gICAgICAgIHN5bmNDbGllbnRzUGFnaW5hdGlvbihjbGllbnRzRGF0YSlcbiAgICAgICAgc2V0RXJyb3IoZmFsc2UpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAndXNlcicpIHtcbiAgICAgIHNldExvYWRpbmcodXNlcnNMb2FkaW5nKVxuICAgICAgaWYgKHVzZXJzRXJyb3IpIHtcbiAgICAgICAgc2V0RXJyb3IodHJ1ZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAodXNlcnNEYXRhPy51c2Vyc0RpcmVjdG9yeT8uZGF0YSkge1xuICAgICAgICBjb25zdCBtYXBwZWQgPSB1c2Vyc0RhdGEudXNlcnNEaXJlY3RvcnkuZGF0YS5tYXAodSA9PiBtYXBVc2VyVG9JdGVtKHUsIHEpKVxuICAgICAgICBjb25zdCBtZUlkID0gU3RyaW5nKGNvclVzZXIuaWQpXG4gICAgICAgIGNvbnN0IGhhc01lSW5SZXN1bHRzID0gbWFwcGVkLnNvbWUoaXRlbSA9PiBTdHJpbmcoaXRlbS5pZCkgPT09IG1lSWQpXG4gICAgICAgIGNvbnN0IHdpdGhvdXRNZSA9IG1hcHBlZC5maWx0ZXIoaXRlbSA9PiBTdHJpbmcoaXRlbS5pZCkgIT09IG1lSWQpXG4gICAgICAgIGNvbnN0IG1lSXRlbSA9IG1hcENvclVzZXJUb1VzZXJJdGVtKGNvclVzZXIsIHEsIHQoJ2NvbnRleHRNZW50aW9uLm1lJykpXG4gICAgICAgIHNldEl0ZW1zKGhhc01lSW5SZXN1bHRzID8gW21lSXRlbSwgLi4ud2l0aG91dE1lXSA6IG1hcHBlZClcbiAgICAgICAgc3luY1VzZXJzUGFnaW5hdGlvbih1c2Vyc0RhdGEpXG4gICAgICAgIHNldEVycm9yKGZhbHNlKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXRMb2FkaW5nKHNlYXJjaExvYWRpbmcpXG4gICAgICBpZiAoc2VhcmNoRXJyb3IpIHtcbiAgICAgICAgc2V0RXJyb3IodHJ1ZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoc2VhcmNoRGF0YT8uc2VhcmNoKSB7XG4gICAgICAgIHNldEl0ZW1zKHNlYXJjaERhdGEuc2VhcmNoLm1hcChyID0+IG1hcFNlYXJjaFRvSXRlbShyLCB0eXBlLCBxLCBzaG93UHJvamVjdE5hbWVJblRhc2tSb3cpKSlcbiAgICAgICAgc2V0SGFzTW9yZShmYWxzZSlcbiAgICAgICAgc2V0RXJyb3IoZmFsc2UpXG4gICAgICB9XG4gICAgfVxuICB9LCBbXG4gICAgc2VhcmNoRGF0YSxcbiAgICBjbGllbnRzRGF0YSxcbiAgICB1c2Vyc0RhdGEsXG4gICAgc2VhcmNoTG9hZGluZyxcbiAgICBjbGllbnRzTG9hZGluZyxcbiAgICB1c2Vyc0xvYWRpbmcsXG4gICAgc2VhcmNoRXJyb3IsXG4gICAgY2xpZW50c0Vycm9yLFxuICAgIHVzZXJzRXJyb3IsXG4gICAgZGVib3VuY2VkU2VhcmNoVmFsdWUsXG4gICAgdHlwZSxcbiAgICBzeW5jQ2xpZW50c1BhZ2luYXRpb24sXG4gICAgc3luY1VzZXJzUGFnaW5hdGlvbixcbiAgICBzaG93UHJvamVjdE5hbWVJblRhc2tSb3csXG4gICAgY29yVXNlcixcbiAgICB0LFxuICBdKVxuXG4gIGNvbnN0IGxvYWRNb3JlID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc0xvYWRpbmdNb3JlIHx8ICFoYXNNb3JlIHx8IGFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UgPT09ICdub25lJykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHNhZmVDdXJyZW50UGFnZSA9IG5vcm1hbGl6ZVBvc2l0aXZlSW50KGN1cnJlbnRQYWdlLCAxKVxuICAgIGNvbnN0IG5leHRQYWdlID0gc2FmZUN1cnJlbnRQYWdlICsgMVxuICAgIGNvbnN0IHEgPSBkZWJvdW5jZWRTZWFyY2hWYWx1ZS50cmltKClcbiAgICBjb25zdCBsb2FkTW9yZUJhc2VsaW5lR2VuID0gcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZi5jdXJyZW50XG4gICAgc2V0SXNMb2FkaW5nTW9yZSh0cnVlKVxuICAgIHRyeSB7XG4gICAgICBpZiAoYWN0aXZlUGFnaW5hdGlvblNvdXJjZSA9PT0gJ3VzZXJzJykge1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGZldGNoVXNlcnNEaXJlY3Rvcnkoe1xuICAgICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgICAgZmlsdGVyczogYnVpbGRVc2Vyc0RpcmVjdG9yeUZpbHRlcnMocSksXG4gICAgICAgICAgICBwYWdlOiBuZXh0UGFnZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICBpZiAobG9hZE1vcmVCYXNlbGluZUdlbiAhPT0gcmVjZW50c0ZldGNoR2VuZXJhdGlvblJlZi5jdXJyZW50KSByZXR1cm5cbiAgICAgICAgY29uc3QgbmV4dEl0ZW1zID0gKGRhdGE/LnVzZXJzRGlyZWN0b3J5Py5kYXRhID8/IFtdKS5tYXAodSA9PiBtYXBVc2VyVG9JdGVtKHUsIHEpKVxuICAgICAgICBzZXRJdGVtcyhwcmV2ID0+IHtcbiAgICAgICAgICBpZiAoIXEpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lSXRlbSA9XG4gICAgICAgICAgICAgIHByZXZbMF0/LnR5cGUgPT09ICd1c2VyJyA/IHByZXZbMF0gOiBtYXBDb3JVc2VyVG9Vc2VySXRlbShjb3JVc2VyLCAnJywgdCgnY29udGV4dE1lbnRpb24ubWUnKSlcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChwcmV2Lm1hcChpdGVtID0+IFN0cmluZyhpdGVtLmlkKSkpXG4gICAgICAgICAgICBjb25zdCBhcHBlbmRlZCA9IG5leHRJdGVtcy5maWx0ZXIoaXRlbSA9PiAhZXhpc3RpbmdJZHMuaGFzKFN0cmluZyhpdGVtLmlkKSkpXG4gICAgICAgICAgICBjb25zdCB3aXRob3V0TWUgPSBwcmV2LmZpbHRlcihpdGVtID0+IFN0cmluZyhpdGVtLmlkKSAhPT0gU3RyaW5nKG1lSXRlbS5pZCkpXG4gICAgICAgICAgICByZXR1cm4gW21lSXRlbSwgLi4ud2l0aG91dE1lLCAuLi5hcHBlbmRlZF1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KHByZXYubWFwKGl0ZW0gPT4gYCR7aXRlbS50eXBlfS0ke2l0ZW0uaWR9YCkpXG4gICAgICAgICAgY29uc3QgYXBwZW5kZWQgPSBuZXh0SXRlbXMuZmlsdGVyKGl0ZW0gPT4gIWV4aXN0aW5nSWRzLmhhcyhgJHtpdGVtLnR5cGV9LSR7aXRlbS5pZH1gKSlcbiAgICAgICAgICByZXR1cm4gWy4uLnByZXYsIC4uLmFwcGVuZGVkXVxuICAgICAgICB9KVxuICAgICAgICBzeW5jVXNlcnNQYWdpbmF0aW9uKGRhdGEpXG4gICAgICB9IGVsc2UgaWYgKGFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UgPT09ICdjbGllbnRzLXNlYXJjaCcpIHtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBmZXRjaFNlYXJjaENsaWVudHMoe1xuICAgICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgICAgZmlsdGVyOiB7IG5hbWU6IHEgfSxcbiAgICAgICAgICAgIHBhZ2U6IG5leHRQYWdlLFxuICAgICAgICAgICAgcGVyUGFnZTogMjAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKGxvYWRNb3JlQmFzZWxpbmVHZW4gIT09IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG4gICAgICAgIGNvbnN0IG5leHRJdGVtcyA9IChkYXRhPy5jbGllbnRzPy5kYXRhID8/IFtdKS5tYXAoYyA9PiBtYXBDbGllbnRUb0l0ZW0oYywgcSkpXG4gICAgICAgIHNldEl0ZW1zKHByZXYgPT4ge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChwcmV2Lm1hcChpdGVtID0+IGAke2l0ZW0udHlwZX0tJHtpdGVtLmlkfWApKVxuICAgICAgICAgIGNvbnN0IGFwcGVuZGVkID0gbmV4dEl0ZW1zLmZpbHRlcihpdGVtID0+ICFleGlzdGluZ0lkcy5oYXMoYCR7aXRlbS50eXBlfS0ke2l0ZW0uaWR9YCkpXG4gICAgICAgICAgcmV0dXJuIFsuLi5wcmV2LCAuLi5hcHBlbmRlZF1cbiAgICAgICAgfSlcbiAgICAgICAgc3luY0NsaWVudHNQYWdpbmF0aW9uKGRhdGEpXG4gICAgICB9IGVsc2UgaWYgKGFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UgPT09ICd0YXNrLWZhbGxiYWNrJykge1xuICAgICAgICBjb25zdCBmaWx0ZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9XG4gICAgICAgIGlmIChzdGFibGVTY29wZS5wcm9qZWN0SWQgIT09IG51bGwgJiYgc3RhYmxlU2NvcGUucHJvamVjdElkICE9PSB1bmRlZmluZWQgJiYgc3RhYmxlU2NvcGUucHJvamVjdElkICE9PSAnJykge1xuICAgICAgICAgIGZpbHRlci5wcm9qZWN0SWRzID0gW1N0cmluZyhzdGFibGVTY29wZS5wcm9qZWN0SWQpXVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFibGVTY29wZS5jbGllbnRJZCAhPT0gbnVsbCAmJiBzdGFibGVTY29wZS5jbGllbnRJZCAhPT0gdW5kZWZpbmVkICYmIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSAnJykge1xuICAgICAgICAgIGZpbHRlci5jbGllbnRJZHMgPSBbU3RyaW5nKHN0YWJsZVNjb3BlLmNsaWVudElkKV1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGZldGNoVGFza0ZhbWlseUZhbGxiYWNrKHtcbiAgICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICAgIGZpbHRlcjogeyBhcmNoaXZlZDogZmFsc2UsIC4uLmZpbHRlciB9LFxuICAgICAgICAgICAgcGFnaW5hdGlvbjogeyBvZmZzZXQ6IChuZXh0UGFnZSAtIDEpICogMjAsIHNpemU6IDIwIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKGxvYWRNb3JlQmFzZWxpbmVHZW4gIT09IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG4gICAgICAgIGNvbnN0IG5leHRJdGVtcyA9IChkYXRhPy50YXNrRmFtaWx5Py5kYXRhID8/IFtdKVxuICAgICAgICAgIC5tYXAobm9ybWFsaXplVGFza0ZhbWlseVJlY29yZClcbiAgICAgICAgICAuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBSZWNlbnRUYXNrSXRlbSA9PiBpdGVtICE9PSBudWxsKVxuICAgICAgICAgIC5tYXAodGFzayA9PiBtYXBSZWNlbnRUYXNrVG9JdGVtKHRhc2ssICcnLCBzaG93UHJvamVjdE5hbWVJblRhc2tSb3cpKVxuICAgICAgICBzZXRJdGVtcyhwcmV2ID0+IHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQocHJldi5tYXAoaXRlbSA9PiBgJHtpdGVtLnR5cGV9LSR7aXRlbS5pZH1gKSlcbiAgICAgICAgICBjb25zdCBhcHBlbmRlZCA9IG5leHRJdGVtcy5maWx0ZXIoaXRlbSA9PiAhZXhpc3RpbmdJZHMuaGFzKGAke2l0ZW0udHlwZX0tJHtpdGVtLmlkfWApKVxuICAgICAgICAgIHJldHVybiBbLi4ucHJldiwgLi4uYXBwZW5kZWRdXG4gICAgICAgIH0pXG4gICAgICAgIHN5bmNUYXNrRmFsbGJhY2tQYWdpbmF0aW9uKGRhdGEpXG4gICAgICB9IGVsc2UgaWYgKGFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UgPT09ICdwcm9qZWN0LWZhbGxiYWNrJykge1xuICAgICAgICBjb25zdCBhcmd1bWVudHNGaWx0ZXIgPVxuICAgICAgICAgIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSBudWxsICYmIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSB1bmRlZmluZWQgJiYgc3RhYmxlU2NvcGUuY2xpZW50SWQgIT09ICcnXG4gICAgICAgICAgICA/IHsgY2xpZW50X2lkOiBbU3RyaW5nKHN0YWJsZVNjb3BlLmNsaWVudElkKV0gfVxuICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBmZXRjaFByb2plY3RzRmFsbGJhY2soe1xuICAgICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgICAgLi4uKGFyZ3VtZW50c0ZpbHRlciA/IHsgYXJndW1lbnRzOiBhcmd1bWVudHNGaWx0ZXIgfSA6IHt9KSxcbiAgICAgICAgICAgIHBhZ2U6IG5leHRQYWdlLFxuICAgICAgICAgICAgcGVyUGFnZTogMjAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKGxvYWRNb3JlQmFzZWxpbmVHZW4gIT09IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG4gICAgICAgIGNvbnN0IG5leHRJdGVtcyA9IChkYXRhPy5wcm9qZWN0cz8uZGF0YSA/PyBbXSlcbiAgICAgICAgICAubWFwKG5vcm1hbGl6ZVByb2plY3RzRmFsbGJhY2tSZWNvcmQpXG4gICAgICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgUmF3U2VhcmNoUmVzdWx0ID0+IGl0ZW0gIT09IG51bGwpXG4gICAgICAgICAgLm1hcChpdGVtID0+IG1hcFNlYXJjaFRvSXRlbShpdGVtLCAncHJvamVjdCcsICcnKSlcbiAgICAgICAgc2V0SXRlbXMocHJldiA9PiB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KHByZXYubWFwKGl0ZW0gPT4gYCR7aXRlbS50eXBlfS0ke2l0ZW0uaWR9YCkpXG4gICAgICAgICAgY29uc3QgYXBwZW5kZWQgPSBuZXh0SXRlbXMuZmlsdGVyKGl0ZW0gPT4gIWV4aXN0aW5nSWRzLmhhcyhgJHtpdGVtLnR5cGV9LSR7aXRlbS5pZH1gKSlcbiAgICAgICAgICByZXR1cm4gWy4uLnByZXYsIC4uLmFwcGVuZGVkXVxuICAgICAgICB9KVxuICAgICAgICBzeW5jUHJvamVjdEZhbGxiYWNrUGFnaW5hdGlvbihkYXRhKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGxvYWRNb3JlQmFzZWxpbmVHZW4gIT09IHJlY2VudHNGZXRjaEdlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG4gICAgICBjb25zb2xlLmVycm9yKCdbdXNlRW50aXR5U2VhcmNoXSBsb2FkTW9yZSBmYWlsZWQnLCB7XG4gICAgICAgIHNvdXJjZTogYWN0aXZlUGFnaW5hdGlvblNvdXJjZSxcbiAgICAgICAgbmV4dFBhZ2UsXG4gICAgICAgIGVycm9yOiBlcnIsXG4gICAgICB9KVxuICAgICAgLy8gRXZpdGEgbG9vcCBkZSByZWludGVudG9zIGF1dG9tw6F0aWNvcyBwb3Igc2Nyb2xsIGN1YW5kbyBiYWNrZW5kIGVzdMOhIGNhw61kbyAoZWouIDUwMykuXG4gICAgICBzZXRFcnJvcih0cnVlKVxuICAgICAgc2V0SGFzTW9yZShmYWxzZSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0SXNMb2FkaW5nTW9yZShmYWxzZSlcbiAgICB9XG4gIH0sIFtcbiAgICBpc0xvYWRpbmdNb3JlLFxuICAgIGhhc01vcmUsXG4gICAgY3VycmVudFBhZ2UsXG4gICAgYWN0aXZlUGFnaW5hdGlvblNvdXJjZSxcbiAgICBkZWJvdW5jZWRTZWFyY2hWYWx1ZSxcbiAgICBmZXRjaFVzZXJzRGlyZWN0b3J5LFxuICAgIGZldGNoU2VhcmNoQ2xpZW50cyxcbiAgICBmZXRjaFRhc2tGYW1pbHlGYWxsYmFjayxcbiAgICBmZXRjaFByb2plY3RzRmFsbGJhY2ssXG4gICAgc3RhYmxlU2NvcGUucHJvamVjdElkLFxuICAgIHN0YWJsZVNjb3BlLmNsaWVudElkLFxuICAgIHNob3dQcm9qZWN0TmFtZUluVGFza1JvdyxcbiAgICBjb3JVc2VyLFxuICAgIHQsXG4gICAgc3luY0NsaWVudHNQYWdpbmF0aW9uLFxuICAgIHN5bmNVc2Vyc1BhZ2luYXRpb24sXG4gICAgc3luY1Rhc2tGYWxsYmFja1BhZ2luYXRpb24sXG4gICAgc3luY1Byb2plY3RGYWxsYmFja1BhZ2luYXRpb24sXG4gIF0pXG5cbiAgLy8gQ3VhbmRvIHNlIGxpbXBpYSBlbCBzZWFyY2gsIHZvbHZlciBhIHJlY2VudHNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWRlYm91bmNlZFNlYXJjaFZhbHVlLnRyaW0oKSkge1xuICAgICAgZmV0Y2hSZWNlbnQoKVxuICAgIH1cbiAgfSwgW2RlYm91bmNlZFNlYXJjaFZhbHVlLCBmZXRjaFJlY2VudF0pXG5cbiAgcmV0dXJuIHtcbiAgICBpdGVtcyxcbiAgICBsb2FkaW5nLFxuICAgIGVycm9yLFxuICAgIGhpZGVSZWNlbnRzTGFiZWwsXG4gICAgaGFzTW9yZSxcbiAgICBpc0xvYWRpbmdNb3JlLFxuICAgIGxvYWRNb3JlLFxuICAgIHNlYXJjaFZhbHVlLFxuICAgIHVwZGF0ZVNlYXJjaFZhbHVlOiBzZXRTZWFyY2hWYWx1ZSxcbiAgICBmZXRjaFJlY2VudCxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLFNBQVNBLFlBQVksUUFBUSxnQkFBZ0I7QUFDN0MsU0FBU0MsV0FBVyxFQUFFQyxTQUFTLEVBQUVDLE9BQU8sRUFBRUMsTUFBTSxFQUFFQyxRQUFRLFFBQVEs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