@projectcor/maia-components 2.35.4-4 → 2.35.6

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 (213) hide show
  1. package/lib/components/atoms/ActionableButton.js +6 -1
  2. package/lib/components/atoms/ApprovalBox/ApprovalBox.js +4 -63
  3. package/lib/components/atoms/ApprovalBox/ApprovalBox.styles.js +4 -16
  4. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +1 -12
  5. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +5 -127
  6. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +29 -2
  7. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +33 -24
  8. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +19 -2
  9. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +20 -4
  10. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +18 -7
  11. package/lib/components/atoms/MAIAInput/MAIAInput.js +42 -243
  12. package/lib/components/atoms/MAIAInput/styles.js +44 -41
  13. package/lib/components/atoms/icons/SkillsNavIcon.js +7 -4
  14. package/lib/components/atoms/icons/index.js +1 -5
  15. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +11 -34
  16. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +3 -5
  17. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +16 -5
  18. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.js +23 -2
  19. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.styles.js +33 -5
  20. package/lib/components/molecules/ChatAIHome/styles.js +11 -2
  21. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.js +31 -20
  22. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +9 -4
  23. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +21 -61
  24. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
  25. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +8 -1
  26. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.styles.js +15 -9
  27. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +14 -3
  28. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +2 -2
  29. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +17 -11
  30. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +14 -5
  31. package/lib/components/molecules/ChatAIModal/layout.js +2 -2
  32. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +12 -2
  33. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.styles.js +3 -3
  34. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +272 -334
  35. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.styles.js +109 -132
  36. package/lib/components/molecules/ChatFooter/ChatFooter.js +63 -57
  37. package/lib/components/molecules/ChatFooter/styles.js +12 -6
  38. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +3 -1
  39. package/lib/components/molecules/MessageFeedback/MessageFeedback.js +15 -5
  40. package/lib/components/molecules/Sidebar/Sidebar.js +7 -15
  41. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +3 -3
  42. package/lib/components/molecules/UsageBlockedBanner/UsageBlockedBanner.js +33 -0
  43. package/lib/components/molecules/UsageBlockedBanner/UsageBlockedBanner.styles.js +47 -0
  44. package/lib/components/molecules/UsageBlockedBanner/index.js +2 -0
  45. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +46 -30
  46. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.js +38 -26
  47. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +209 -430
  48. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.styles.js +74 -131
  49. package/lib/components/organisms/ChatAI/ChatAI.js +6 -1
  50. package/lib/constants/config.js +4 -1
  51. package/lib/constants/permissions/utils.js +3 -3
  52. package/lib/hooks/useAgentModel/useCreateAgent.js +6 -6
  53. package/lib/hooks/useAgentModel/useUpdateAgent.js +6 -6
  54. package/lib/hooks/useChatManager/useChatManager.js +58 -38
  55. package/lib/hooks/useContextMentions.js +56 -96
  56. package/lib/hooks/useEntitySearch.js +278 -92
  57. package/lib/hooks/useEvent.js +2 -15
  58. package/lib/hooks/useMentionAllowedTypes.js +25 -9
  59. package/lib/hooks/useMentionPopover.js +33 -9
  60. package/lib/lang/br/index.js +12 -39
  61. package/lib/lang/en/index.js +12 -39
  62. package/lib/lang/es/index.js +13 -40
  63. package/lib/lang/fr/index.js +13 -40
  64. package/lib/services/maia/Agents/setAgentToolGroups.js +2 -2
  65. package/lib/services/maia/Chats/getChatsByUserId.js +1 -1
  66. package/lib/services/maia/Orchestrator/orchestrator.js +7 -16
  67. package/lib/services/maia/Skills/createSkill.js +1 -1
  68. package/lib/services/maia/Skills/getSkills.js +40 -70
  69. package/lib/services/maia/Skills/updateSkill.js +1 -1
  70. package/lib/services/maia/Usage/getUsage.js +45 -0
  71. package/lib/services/maia/Usage/index.js +6 -0
  72. package/lib/services/maia/index.js +4 -2
  73. package/lib/services/utils/MaiaApiError.js +34 -0
  74. package/lib/services/utils/fetchCOR.js +106 -57
  75. package/lib/services/utils/index.js +2 -1
  76. package/lib/store/faqsStore.types.js +1 -1
  77. package/lib/store/index.js +2 -1
  78. package/lib/store/sessions/sessionStreamManager.js +61 -35
  79. package/lib/store/sessions/sessions.types.js +1 -1
  80. package/lib/store/useChatsStore.js +3 -3
  81. package/lib/store/useUsageStore.js +108 -0
  82. package/lib/types/Chat.js +1 -1
  83. package/lib/types/FrequentlyAskedQuestion.js +1 -1
  84. package/lib/types/agentModal.js +1 -1
  85. package/lib/types/skill.js +1 -1
  86. package/lib/types/usage.js +9 -0
  87. package/lib/utils/contextMentionTriggers.js +5 -2
  88. package/lib/utils/normalizeAgentConnectors.js +16 -44
  89. package/lib/utils/renderContextMentions.js +18 -39
  90. package/package.json +6 -9
  91. package/CHANGELOG.md +0 -727
  92. package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +0 -135
  93. package/lib/components/atoms/Checkbox/Checkbox.spec.js +0 -27
  94. package/lib/components/atoms/Chip/Chip.spec.js +0 -32
  95. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +0 -29
  96. package/lib/components/atoms/Fade/Fade.spec.js +0 -31
  97. package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +0 -42
  98. package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +0 -283
  99. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +0 -68
  100. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.js +0 -208
  101. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +0 -107
  102. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.styles.js +0 -77
  103. package/lib/components/atoms/SkillsDropdown/index.js +0 -2
  104. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +0 -85
  105. package/lib/components/atoms/Switch/Switch.spec.js +0 -41
  106. package/lib/components/atoms/icons/PlusIcon.js +0 -29
  107. package/lib/components/atoms/icons/SkillCreatedByIcon.js +0 -20
  108. package/lib/components/atoms/icons/SkillVisibilityEveryoneIcon.js +0 -23
  109. package/lib/components/atoms/icons/SkillVisibilityOnlyMeIcon.js +0 -23
  110. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +0 -77
  111. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +0 -104
  112. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +0 -291
  113. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +0 -46
  114. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +0 -128
  115. package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +0 -105
  116. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +0 -84
  117. package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +0 -116
  118. package/lib/components/molecules/Sidebar/Sidebar.spec.js +0 -192
  119. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +0 -335
  120. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +0 -315
  121. package/lib/components/organisms/ChatAI/ChatAI.spec.js +0 -174
  122. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +0 -59
  123. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +0 -79
  124. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +0 -86
  125. package/lib/hooks/useAgentModel/useCreateAgent.spec.js +0 -95
  126. package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +0 -96
  127. package/lib/hooks/useCaretPosition.spec.js +0 -58
  128. package/lib/hooks/useDebounce.spec.js +0 -42
  129. package/lib/hooks/useEvent.spec.js +0 -40
  130. package/lib/hooks/useMentionAllowedTypes.spec.js +0 -89
  131. package/lib/hooks/useModal/useModal.spec.js +0 -73
  132. package/lib/hooks/useResize.spec.js +0 -37
  133. package/lib/hooks/useSkillsCatalog.js +0 -66
  134. package/lib/hooks/useSkillsCatalog.spec.js +0 -88
  135. package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +0 -33
  136. package/lib/hooks/useT.spec.js +0 -20
  137. package/lib/hooks/useToggle.spec.js +0 -33
  138. package/lib/services/maia/Access/updateAccess.spec.js +0 -108
  139. package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +0 -69
  140. package/lib/services/maia/Actions/getSlashCommands.spec.js +0 -74
  141. package/lib/services/maia/Agents/createAgent.spec.js +0 -55
  142. package/lib/services/maia/Agents/deleteAgent.spec.js +0 -42
  143. package/lib/services/maia/Agents/fetchAgentDetail.spec.js +0 -108
  144. package/lib/services/maia/Agents/getAgentById.spec.js +0 -55
  145. package/lib/services/maia/Agents/getAgentSuggestions.spec.js +0 -82
  146. package/lib/services/maia/Agents/setAgentToolGroups.spec.js +0 -45
  147. package/lib/services/maia/Agents/toggleFavorite.spec.js +0 -47
  148. package/lib/services/maia/Agents/updateAgent.spec.js +0 -48
  149. package/lib/services/maia/Chats/deleteChat.spec.js +0 -31
  150. package/lib/services/maia/Chats/getChatMessages.spec.js +0 -150
  151. package/lib/services/maia/Chats/getChatsByUserId.spec.js +0 -149
  152. package/lib/services/maia/Chats/markSessionAsRead.spec.js +0 -30
  153. package/lib/services/maia/Chats/patchChat.spec.js +0 -41
  154. package/lib/services/maia/Chats/wasHelpfulChat.spec.js +0 -28
  155. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +0 -58
  156. package/lib/services/maia/Knowledge/delete.spec.js +0 -45
  157. package/lib/services/maia/Knowledge/download.spec.js +0 -78
  158. package/lib/services/maia/Knowledge/save.spec.js +0 -58
  159. package/lib/services/maia/Orchestrator/orchestrator.spec.js +0 -72
  160. package/lib/services/maia/RecentClients/getRecentClients.spec.js +0 -52
  161. package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +0 -83
  162. package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +0 -82
  163. package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +0 -63
  164. package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +0 -82
  165. package/lib/services/maia/Skills/createSkill.spec.js +0 -68
  166. package/lib/services/maia/Skills/deleteSkill.spec.js +0 -42
  167. package/lib/services/maia/Skills/generateSkill.spec.js +0 -48
  168. package/lib/services/maia/Skills/getSkills.spec.js +0 -152
  169. package/lib/services/maia/Skills/updateSkill.spec.js +0 -62
  170. package/lib/services/maia/client.spec.js +0 -56
  171. package/lib/services/utils/fetchCOR.spec.js +0 -211
  172. package/lib/services/utils/getCookie.spec.js +0 -20
  173. package/lib/store/chatsSidebarOptimistic.spec.js +0 -120
  174. package/lib/store/maiaLastChatPersistence.spec.js +0 -22
  175. package/lib/store/maiaPanelSessionPersistence.spec.js +0 -62
  176. package/lib/store/sessions/sessions.types.spec.js +0 -16
  177. package/lib/store/sessions/useSessionsStore.spec.js +0 -135
  178. package/lib/store/useChatsStore.spec.js +0 -619
  179. package/lib/store/useFaqsStore.spec.js +0 -57
  180. package/lib/test/buttonMock.js +0 -22
  181. package/lib/test/fetchPolyfill.js +0 -160
  182. package/lib/test/fileMock.js +0 -2
  183. package/lib/test/global-context.js +0 -49
  184. package/lib/test/iconMock.js +0 -19
  185. package/lib/test/mockFetch.js +0 -49
  186. package/lib/test/portalRoot.js +0 -13
  187. package/lib/test/styleMock.js +0 -2
  188. package/lib/test/test-utils.js +0 -26
  189. package/lib/test/tooltipMock.js +0 -11
  190. package/lib/utils/agentDisplayName.spec.js +0 -44
  191. package/lib/utils/autoApproveStorage.spec.js +0 -25
  192. package/lib/utils/chatInputFiles.spec.js +0 -39
  193. package/lib/utils/contextMentionLabel.spec.js +0 -13
  194. package/lib/utils/contextMentionTriggers.spec.js +0 -38
  195. package/lib/utils/contextMentionTypeLabel.spec.js +0 -14
  196. package/lib/utils/corConnectorMentionTypes.spec.js +0 -23
  197. package/lib/utils/fileDownloadHelper.spec.js +0 -67
  198. package/lib/utils/formatQuickActionMessage.spec.js +0 -27
  199. package/lib/utils/formatUnreadCount.spec.js +0 -12
  200. package/lib/utils/getUnitFileSize.spec.js +0 -18
  201. package/lib/utils/hitlAnalytics.spec.js +0 -100
  202. package/lib/utils/hoursPlannerQuickActionType.spec.js +0 -64
  203. package/lib/utils/mapBackendLang.spec.js +0 -19
  204. package/lib/utils/normalizeAgentConnectors.spec.js +0 -89
  205. package/lib/utils/orchestratorSubagents.spec.js +0 -32
  206. package/lib/utils/reasoningMappers.spec.js +0 -103
  207. package/lib/utils/retryCompletion.spec.js +0 -99
  208. package/lib/utils/skillContentSize.spec.js +0 -13
  209. package/lib/utils/slashCommandMarker.spec.js +0 -43
  210. package/lib/utils/sortManagerHoursHomeFuas.spec.js +0 -51
  211. package/lib/utils/sseStreamContent.spec.js +0 -31
  212. package/lib/utils/streamActivityMessages.spec.js +0 -98
  213. package/lib/utils/validateTrimmedFields.spec.js +0 -26
@@ -2,9 +2,6 @@ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
2
  import { useCallback, useRef, useState } from 'react';
3
3
  import { serializeMention } from '../utils/renderContextMentions';
4
4
  import { serializeSlashCommand } from '../utils/slashCommandMarker';
5
-
6
- /** Trigger `#` que abre el listado de skills. Misma forma que el de slash. */
7
-
8
5
  /**
9
6
  * Inspecciona la selección actual. Formato: [límite de palabra] @+ query hasta el caret.
10
7
  * Permite espacios simples dentro del query (p. ej. "@Juan Perez") y cierra
@@ -94,9 +91,7 @@ var detectMentionTrigger = function detectMentionTrigger(editorEl, range) {
94
91
  }
95
92
  };
96
93
  };
97
-
98
- /** Detecta un trigger de un solo caracter (`/` o `#`) en límite de palabra, con query hasta el caret. */
99
- var detectCharTrigger = function detectCharTrigger(editorEl, range, _char) {
94
+ var detectSlashTrigger = function detectSlashTrigger(editorEl, range) {
100
95
  if (!editorEl || !editorEl.contains(range.startContainer)) {
101
96
  return {
102
97
  active: false,
@@ -122,16 +117,16 @@ var detectCharTrigger = function detectCharTrigger(editorEl, range, _char) {
122
117
  anchor: null
123
118
  };
124
119
  }
125
- while (i >= 0 && text[i] !== _char) i -= 1;
126
- if (i < 0 || text[i] !== _char) {
120
+ while (i >= 0 && text[i] !== '/') i -= 1;
121
+ if (i < 0 || text[i] !== '/') {
127
122
  return {
128
123
  active: false,
129
124
  query: '',
130
125
  anchor: null
131
126
  };
132
127
  }
133
- var triggerIndex = i;
134
- var prev = triggerIndex > 0 ? text.charAt(triggerIndex - 1) : '';
128
+ var slashIndex = i;
129
+ var prev = slashIndex > 0 ? text.charAt(slashIndex - 1) : '';
135
130
  var isBoundary = !prev || /[\s([{]/.test(prev);
136
131
  if (!isBoundary) {
137
132
  return {
@@ -140,7 +135,7 @@ var detectCharTrigger = function detectCharTrigger(editorEl, range, _char) {
140
135
  anchor: null
141
136
  };
142
137
  }
143
- var query = text.slice(triggerIndex + 1, caret);
138
+ var query = text.slice(slashIndex + 1, caret);
144
139
  if (/\n|\r/.test(query)) {
145
140
  return {
146
141
  active: false,
@@ -160,7 +155,7 @@ var detectCharTrigger = function detectCharTrigger(editorEl, range, _char) {
160
155
  query: query,
161
156
  anchor: {
162
157
  node: node,
163
- offset: triggerIndex
158
+ offset: slashIndex
164
159
  }
165
160
  };
166
161
  };
@@ -183,14 +178,6 @@ export var useContextMentions = function useContextMentions() {
183
178
  _useState4 = _slicedToArray(_useState3, 2),
184
179
  slashTrigger = _useState4[0],
185
180
  setSlashTrigger = _useState4[1];
186
- var _useState5 = useState({
187
- active: false,
188
- query: '',
189
- anchor: null
190
- }),
191
- _useState6 = _slicedToArray(_useState5, 2),
192
- hashTrigger = _useState6[0],
193
- setHashTrigger = _useState6[1];
194
181
  var detectTrigger = useCallback(function () {
195
182
  var selection = window.getSelection();
196
183
  if (!selection || selection.rangeCount === 0 || !editorRef.current) {
@@ -212,18 +199,7 @@ export var useContextMentions = function useContextMentions() {
212
199
  anchor: null
213
200
  };
214
201
  }
215
- return detectCharTrigger(editorRef.current, selection.getRangeAt(0), '/');
216
- }, []);
217
- var detectHash = useCallback(function () {
218
- var selection = window.getSelection();
219
- if (!selection || selection.rangeCount === 0 || !editorRef.current) {
220
- return {
221
- active: false,
222
- query: '',
223
- anchor: null
224
- };
225
- }
226
- return detectCharTrigger(editorRef.current, selection.getRangeAt(0), '#');
202
+ return detectSlashTrigger(editorRef.current, selection.getRangeAt(0));
227
203
  }, []);
228
204
  var updateTrigger = useCallback(function () {
229
205
  var next = detectTrigger();
@@ -250,18 +226,6 @@ export var useContextMentions = function useContextMentions() {
250
226
  anchor: null
251
227
  });
252
228
  }, []);
253
- var updateHashTrigger = useCallback(function () {
254
- var next = detectHash();
255
- setHashTrigger(next);
256
- return next;
257
- }, [detectHash]);
258
- var closeHashTrigger = useCallback(function () {
259
- setHashTrigger({
260
- active: false,
261
- query: '',
262
- anchor: null
263
- });
264
- }, []);
265
229
 
266
230
  /**
267
231
  * Ajusta la cantidad de `@` del trigger activo sin perder el query actual.
@@ -304,15 +268,54 @@ export var useContextMentions = function useContextMentions() {
304
268
  }, [detectTrigger]);
305
269
 
306
270
  /**
307
- * Reemplaza el `@query` pendiente por un chip atómico con la mention.
308
- * Requiere que el caller provea el DOM del chip (se inserta tal cual).
271
+ * Convierte el trigger `@{n}query` activo en `@/query`.
272
+ * Se usa al cambiar a la tab de skills (cuyo trigger es `@/`).
309
273
  */
310
- var replaceTriggerWithChip = useCallback(function (chipNode, mention) {
274
+ var syncSkillTrigger = useCallback(function () {
311
275
  var current = detectTrigger();
312
276
  if (!current.active || !current.anchor) return;
277
+ // Ya es @/ (skill) — no reescribir
278
+ if (current.atRunLength === -1) return;
313
279
  var _current$anchor2 = current.anchor,
314
280
  node = _current$anchor2.node,
315
281
  offset = _current$anchor2.offset;
282
+ if (node.nodeType !== Node.TEXT_NODE) return;
283
+ var textNode = node;
284
+ var full = textNode.data;
285
+ // atRunLength negativo (@@/) incluye el slash; usar abs + 1 como en replaceTriggerWithChip
286
+ var currentRunLen = Math.abs(current.atRunLength);
287
+ var currentHasSlash = current.atRunLength < 0;
288
+ var queryLen = currentRunLen + (currentHasSlash ? 1 : 0) + current.query.length;
289
+ var before = full.slice(0, offset);
290
+ var after = full.slice(offset + queryLen);
291
+ var cleanQuery = current.query.startsWith('/') ? current.query.slice(1) : current.query;
292
+ var nextValue = "".concat(before, "@/").concat(cleanQuery).concat(after);
293
+
294
+ // eslint-disable-next-line no-param-reassign
295
+ textNode.data = nextValue;
296
+ var selection = window.getSelection();
297
+ if (selection) {
298
+ var range = document.createRange();
299
+ var caretOffset = before.length + 2 + cleanQuery.length;
300
+ range.setStart(textNode, Math.min(caretOffset, textNode.data.length));
301
+ range.collapse(true);
302
+ selection.removeAllRanges();
303
+ selection.addRange(range);
304
+ }
305
+ var updated = detectTrigger();
306
+ setTrigger(updated);
307
+ }, [detectTrigger]);
308
+
309
+ /**
310
+ * Reemplaza el `@query` pendiente por un chip atómico con la mention.
311
+ * Requiere que el caller provea el DOM del chip (se inserta tal cual).
312
+ */
313
+ var replaceTriggerWithChip = useCallback(function (chipNode, mention) {
314
+ var current = detectTrigger();
315
+ if (!current.active || !current.anchor) return;
316
+ var _current$anchor3 = current.anchor,
317
+ node = _current$anchor3.node,
318
+ offset = _current$anchor3.offset;
316
319
  var textNode = node;
317
320
  var full = textNode.data;
318
321
  var currentRunLen = Math.abs(current.atRunLength);
@@ -345,15 +348,14 @@ export var useContextMentions = function useContextMentions() {
345
348
  selection.removeAllRanges();
346
349
  selection.addRange(range);
347
350
  }
348
- if (textNode.data === '') textNode.remove();
349
351
  closeTrigger();
350
352
  }, [detectTrigger, closeTrigger]);
351
353
  var replaceTriggerWithSlashChip = useCallback(function (chipNode, slashCommand) {
352
354
  var current = detectSlash();
353
355
  if (!current.active || !current.anchor) return;
354
- var _current$anchor3 = current.anchor,
355
- node = _current$anchor3.node,
356
- offset = _current$anchor3.offset;
356
+ var _current$anchor4 = current.anchor,
357
+ node = _current$anchor4.node,
358
+ offset = _current$anchor4.offset;
357
359
  var textNode = node;
358
360
  var full = textNode.data;
359
361
  var triggerLen = 1 + current.query.length;
@@ -376,46 +378,8 @@ export var useContextMentions = function useContextMentions() {
376
378
  selection.removeAllRanges();
377
379
  selection.addRange(range);
378
380
  }
379
- if (textNode.data === '') textNode.remove();
380
381
  closeSlashTrigger();
381
382
  }, [detectSlash, closeSlashTrigger]);
382
-
383
- /**
384
- * Reemplaza el `#query` pendiente por un chip de skill. La skill sigue viajando
385
- * como mention (`data-mention*`) para que el backend la resuelva por id.
386
- */
387
- var replaceTriggerWithSkillChip = useCallback(function (chipNode, mention) {
388
- var current = detectHash();
389
- if (!current.active || !current.anchor) return;
390
- var _current$anchor4 = current.anchor,
391
- node = _current$anchor4.node,
392
- offset = _current$anchor4.offset;
393
- var textNode = node;
394
- var full = textNode.data;
395
- var triggerLen = 1 + current.query.length;
396
- var after = full.slice(offset + triggerLen);
397
- textNode.data = full.slice(0, offset);
398
- chipNode.setAttribute('data-mention', 'true');
399
- chipNode.setAttribute('data-mention-id', String(mention.id));
400
- chipNode.setAttribute('data-mention-type', mention.type);
401
- chipNode.setAttribute('data-mention-label', mention.label);
402
- chipNode.setAttribute('contenteditable', 'false');
403
- var parent = textNode.parentNode;
404
- if (!parent) return;
405
- var spaceNode = document.createTextNode("\xA0".concat(after));
406
- parent.insertBefore(chipNode, textNode.nextSibling);
407
- parent.insertBefore(spaceNode, chipNode.nextSibling);
408
- var selection = window.getSelection();
409
- if (selection) {
410
- var range = document.createRange();
411
- range.setStart(spaceNode, 1);
412
- range.collapse(true);
413
- selection.removeAllRanges();
414
- selection.addRange(range);
415
- }
416
- if (textNode.data === '') textNode.remove();
417
- closeHashTrigger();
418
- }, [detectHash, closeHashTrigger]);
419
383
  var serialize = useCallback(function () {
420
384
  var el = editorRef.current;
421
385
  if (!el) return {
@@ -474,8 +438,7 @@ export var useContextMentions = function useContextMentions() {
474
438
  if (editorRef.current) editorRef.current.innerHTML = '';
475
439
  closeTrigger();
476
440
  closeSlashTrigger();
477
- closeHashTrigger();
478
- }, [closeTrigger, closeSlashTrigger, closeHashTrigger]);
441
+ }, [closeTrigger, closeSlashTrigger]);
479
442
  var focus = useCallback(function () {
480
443
  var _editorRef$current;
481
444
  (_editorRef$current = editorRef.current) === null || _editorRef$current === void 0 || _editorRef$current.focus();
@@ -486,18 +449,15 @@ export var useContextMentions = function useContextMentions() {
486
449
  updateTrigger: updateTrigger,
487
450
  closeTrigger: closeTrigger,
488
451
  syncTriggerAtRunLength: syncTriggerAtRunLength,
452
+ syncSkillTrigger: syncSkillTrigger,
489
453
  replaceTriggerWithChip: replaceTriggerWithChip,
490
454
  slashTrigger: slashTrigger,
491
455
  updateSlashTrigger: updateSlashTrigger,
492
456
  closeSlashTrigger: closeSlashTrigger,
493
457
  replaceTriggerWithSlashChip: replaceTriggerWithSlashChip,
494
- hashTrigger: hashTrigger,
495
- updateHashTrigger: updateHashTrigger,
496
- closeHashTrigger: closeHashTrigger,
497
- replaceTriggerWithSkillChip: replaceTriggerWithSkillChip,
498
458
  serialize: serialize,
499
459
  clear: clear,
500
460
  focus: focus
501
461
  };
502
462
  };
503
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVJlZiIsInVzZVN0YXRlIiwic2VyaWFsaXplTWVudGlvbiIsInNlcmlhbGl6ZVNsYXNoQ29tbWFuZCIsImRldGVjdE1lbnRpb25UcmlnZ2VyIiwiZWRpdG9yRWwiLCJyYW5nZSIsImNvbnRhaW5zIiwic3RhcnRDb250YWluZXIiLCJhY3RpdmUiLCJxdWVyeSIsImF0UnVuTGVuZ3RoIiwiYW5jaG9yIiwibm9kZSIsIm5vZGVUeXBlIiwiTm9kZSIsIlRFWFRfTk9ERSIsInRleHQiLCJkYXRhIiwiY2FyZXQiLCJzdGFydE9mZnNldCIsImkiLCJydW5FbmQiLCJydW5TdGFydCIsInByZXYiLCJjaGFyQXQiLCJpc0JvdW5kYXJ5IiwidGVzdCIsImhhc1NsYXNoU3VmZml4IiwicXVlcnlTdGFydCIsInNsaWNlIiwiaW5jbHVkZXMiLCJvZmZzZXQiLCJkZXRlY3RDaGFyVHJpZ2dlciIsImNoYXIiLCJ0cmlnZ2VySW5kZXgiLCJ1c2VDb250ZXh0TWVudGlvbnMiLCJlZGl0b3JSZWYiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJ0cmlnZ2VyIiwic2V0VHJpZ2dlciIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0Iiwic2xhc2hUcmlnZ2VyIiwic2V0U2xhc2hUcmlnZ2VyIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJoYXNoVHJpZ2dlciIsInNldEhhc2hUcmlnZ2VyIiwiZGV0ZWN0VHJpZ2dlciIsInNlbGVjdGlvbiIsIndpbmRvdyIsImdldFNlbGVjdGlvbiIsInJhbmdlQ291bnQiLCJjdXJyZW50IiwiZ2V0UmFuZ2VBdCIsImRldGVjdFNsYXNoIiwiZGV0ZWN0SGFzaCIsInVwZGF0ZVRyaWdnZXIiLCJuZXh0IiwiY2xvc2VUcmlnZ2VyIiwidXBkYXRlU2xhc2hUcmlnZ2VyIiwiY2xvc2VTbGFzaFRyaWdnZXIiLCJ1cGRhdGVIYXNoVHJpZ2dlciIsImNsb3NlSGFzaFRyaWdnZXIiLCJzeW5jVHJpZ2dlckF0UnVuTGVuZ3RoIiwibmV4dEF0UnVuTGVuZ3RoIiwibmV4dEhhc1NsYXNoIiwic2FmZU5leHQiLCJNYXRoIiwibWF4IiwiZmxvb3IiLCJhYnMiLCJfY3VycmVudCRhbmNob3IiLCJ0ZXh0Tm9kZSIsImZ1bGwiLCJjdXJyZW50UnVuTGVuIiwiY3VycmVudEhhc1NsYXNoIiwicXVlcnlMZW4iLCJsZW5ndGgiLCJiZWZvcmUiLCJhZnRlciIsIm5leHRSdW4iLCJjb25jYXQiLCJyZXBlYXQiLCJjbGVhblF1ZXJ5Iiwic3RhcnRzV2l0aCIsIm5leHRWYWx1ZSIsImRvY3VtZW50IiwiY3JlYXRlUmFuZ2UiLCJjYXJldE9mZnNldCIsInNldFN0YXJ0IiwibWluIiwiY29sbGFwc2UiLCJyZW1vdmVBbGxSYW5nZXMiLCJhZGRSYW5nZSIsInVwZGF0ZWQiLCJyZXBsYWNlVHJpZ2dlcldpdGhDaGlwIiwiY2hpcE5vZGUiLCJtZW50aW9uIiwiX2N1cnJlbnQkYW5jaG9yMiIsInNldEF0dHJpYnV0ZSIsIlN0cmluZyIsImlkIiwidHlwZSIsImxhYmVsIiwicGFyZW50IiwicGFyZW50Tm9kZSIsInNwYWNlTm9kZSIsImNyZWF0ZVRleHROb2RlIiwiaW5zZXJ0QmVmb3JlIiwibmV4dFNpYmxpbmciLCJyZW1vdmUiLCJyZXBsYWNlVHJpZ2dlcldpdGhTbGFzaENoaXAiLCJzbGFzaENvbW1hbmQiLCJfY3VycmVudCRhbmNob3IzIiwidHJpZ2dlckxlbiIsInJlcGxhY2VUcmlnZ2VyV2l0aFNraWxsQ2hpcCIsIl9jdXJyZW50JGFuY2hvcjQiLCJzZXJpYWxpemUiLCJlbCIsIm1lbnRpb25zIiwic2xhc2hDb21tYW5kcyIsIndhbGsiLCJFTEVNRU5UX05PREUiLCJfZWxOb2RlJGRhdGFzZXQiLCJfZWxOb2RlJGRhdGFzZXQyIiwiZWxOb2RlIiwiZGF0YXNldCIsIl9lbE5vZGUkZGF0YXNldCRtZW50aSIsIl9yZWYiLCJfcmVmMiIsIl9lbE5vZGUkZGF0YXNldCRtZW50aTIiLCJtZW50aW9uSWQiLCJtZW50aW9uVHlwZSIsIm1lbnRpb25MYWJlbCIsInRleHRDb250ZW50IiwicHVzaCIsIl9lbE5vZGUkZGF0YXNldCRzbGFzaCIsIl9yZWYzIiwiX2VsTm9kZSRkYXRhc2V0JHNsYXNoMiIsIl9lbE5vZGUkdGV4dENvbnRlbnQiLCJzbGFzaCIsInNsYXNoSWQiLCJzbGFzaExhYmVsIiwicmVwbGFjZSIsInRhZ05hbWUiLCJjaGlsZE5vZGVzIiwiZm9yRWFjaCIsImNsZWFyIiwiaW5uZXJIVE1MIiwiZm9jdXMiLCJfZWRpdG9yUmVmJGN1cnJlbnQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvaG9va3MvdXNlQ29udGV4dE1lbnRpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBDb250ZXh0TWVudGlvbiB9IGZyb20gJy4uL3R5cGVzL2NvbnRleHRNZW50aW9uJ1xuaW1wb3J0IHsgc2VyaWFsaXplTWVudGlvbiB9IGZyb20gJy4uL3V0aWxzL3JlbmRlckNvbnRleHRNZW50aW9ucydcbmltcG9ydCB7IHNlcmlhbGl6ZVNsYXNoQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NsYXNoQ29tbWFuZE1hcmtlcidcbmltcG9ydCB0eXBlIHsgU2xhc2hDb21tYW5kQ2hpcERhdGEgfSBmcm9tICcuLi9jb21wb25lbnRzL2F0b21zL1NsYXNoQ29tbWFuZENoaXAvYnVpbGRTbGFzaENoaXBFbGVtZW50J1xuXG5leHBvcnQgdHlwZSBNZW50aW9uVHJpZ2dlclN0YXRlID0ge1xuICBhY3RpdmU6IGJvb2xlYW5cbiAgcXVlcnk6IHN0cmluZ1xuICAvKiogQ2FudGlkYWQgZGUgYEBgIGNvbnNlY3V0aXZvcyBkZWwgdHJpZ2dlciAoYEBgIOKGkiAxLCBgQEBgIOKGkiAyKS4gTWFwZWEgYSBsYSB0YWIgZW4gb3JkZW4uICovXG4gIGF0UnVuTGVuZ3RoOiBudW1iZXJcbiAgLyoqIFBvc2ljacOzbiBkZWwgcHJpbWVyIGBAYCBkZWwgcnVuIChyZWVtcGxhem8gZGVsIGNoaXApLiAqL1xuICBhbmNob3I6IHsgbm9kZTogTm9kZTsgb2Zmc2V0OiBudW1iZXIgfSB8IG51bGxcbn1cblxuZXhwb3J0IHR5cGUgU2xhc2hUcmlnZ2VyU3RhdGUgPSB7XG4gIGFjdGl2ZTogYm9vbGVhblxuICBxdWVyeTogc3RyaW5nXG4gIGFuY2hvcjogeyBub2RlOiBOb2RlOyBvZmZzZXQ6IG51bWJlciB9IHwgbnVsbFxufVxuXG4vKiogVHJpZ2dlciBgI2AgcXVlIGFicmUgZWwgbGlzdGFkbyBkZSBza2lsbHMuIE1pc21hIGZvcm1hIHF1ZSBlbCBkZSBzbGFzaC4gKi9cbmV4cG9ydCB0eXBlIEhhc2hUcmlnZ2VyU3RhdGUgPSBTbGFzaFRyaWdnZXJTdGF0ZVxuXG4vKipcbiAqIEluc3BlY2Npb25hIGxhIHNlbGVjY2nDs24gYWN0dWFsLiBGb3JtYXRvOiBbbMOtbWl0ZSBkZSBwYWxhYnJhXSBAKyBxdWVyeSBoYXN0YSBlbCBjYXJldC5cbiAqIFBlcm1pdGUgZXNwYWNpb3Mgc2ltcGxlcyBkZW50cm8gZGVsIHF1ZXJ5IChwLiBlai4gXCJASnVhbiBQZXJlelwiKSB5IGNpZXJyYVxuICogZWwgdHJpZ2dlciBjdWFuZG8gZGV0ZWN0YSBkb3MgZXNwYWNpb3MgY29uc2VjdXRpdm9zLlxuICogTGEgdGFiIG9iamV0aXZvIGVzIGxhIHF1ZSBjb3JyZXNwb25kZSBhbCBuw7ptZXJvIGRlIGBAYCAoMSA9IHByaW1lcmEgdGFiIHZpc2libGUsIGV0Yy4pLlxuICovXG5jb25zdCBkZXRlY3RNZW50aW9uVHJpZ2dlciA9IChlZGl0b3JFbDogSFRNTEVsZW1lbnQgfCBudWxsLCByYW5nZTogUmFuZ2UpOiBNZW50aW9uVHJpZ2dlclN0YXRlID0+IHtcbiAgaWYgKCFlZGl0b3JFbCB8fCAhZWRpdG9yRWwuY29udGFpbnMocmFuZ2Uuc3RhcnRDb250YWluZXIpKSB7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCwgYW5jaG9yOiBudWxsIH1cbiAgfVxuICBjb25zdCBub2RlID0gcmFuZ2Uuc3RhcnRDb250YWluZXJcbiAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCwgYW5jaG9yOiBudWxsIH1cbiAgfVxuICBjb25zdCB0ZXh0ID0gKG5vZGUgYXMgVGV4dCkuZGF0YVxuICBjb25zdCBjYXJldCA9IHJhbmdlLnN0YXJ0T2Zmc2V0XG4gIGxldCBpID0gY2FyZXQgLSAxXG4gIGlmIChpIDwgMCkge1xuICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAsIGFuY2hvcjogbnVsbCB9XG4gIH1cblxuICB3aGlsZSAoaSA+PSAwICYmIHRleHRbaV0gIT09ICdAJykgaSAtPSAxXG4gIGlmIChpIDwgMCB8fCB0ZXh0W2ldICE9PSAnQCcpIHtcbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwLCBhbmNob3I6IG51bGwgfVxuICB9XG5cbiAgY29uc3QgcnVuRW5kID0gaVxuICB3aGlsZSAoaSA+PSAwICYmIHRleHRbaV0gPT09ICdAJykge1xuICAgIGkgLT0gMVxuICB9XG4gIGNvbnN0IHJ1blN0YXJ0ID0gaSArIDFcbiAgY29uc3QgYXRSdW5MZW5ndGggPSBydW5FbmQgLSBydW5TdGFydCArIDFcbiAgY29uc3QgcHJldiA9IHJ1blN0YXJ0ID4gMCA/IHRleHQuY2hhckF0KHJ1blN0YXJ0IC0gMSkgOiAnJ1xuICBjb25zdCBpc0JvdW5kYXJ5ID0gIXByZXYgfHwgL1tcXHMoW3tdLy50ZXN0KHByZXYpXG4gIGlmICghaXNCb3VuZGFyeSkge1xuICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAsIGFuY2hvcjogbnVsbCB9XG4gIH1cblxuICBjb25zdCBoYXNTbGFzaFN1ZmZpeCA9IHRleHRbcnVuRW5kICsgMV0gPT09ICcvJ1xuICBjb25zdCBxdWVyeVN0YXJ0ID0gaGFzU2xhc2hTdWZmaXggPyBydW5FbmQgKyAyIDogcnVuRW5kICsgMVxuICBjb25zdCBxdWVyeSA9IHRleHQuc2xpY2UocXVlcnlTdGFydCwgY2FyZXQpXG4gIGlmICgvXFxufFxcci8udGVzdChxdWVyeSkpIHtcbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwLCBhbmNob3I6IG51bGwgfVxuICB9XG4gIGlmIChxdWVyeS5pbmNsdWRlcygnICAnKSkge1xuICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAsIGFuY2hvcjogbnVsbCB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICBxdWVyeSxcbiAgICBhdFJ1bkxlbmd0aDogaGFzU2xhc2hTdWZmaXggPyAtYXRSdW5MZW5ndGggOiBhdFJ1bkxlbmd0aCxcbiAgICBhbmNob3I6IHsgbm9kZSwgb2Zmc2V0OiBydW5TdGFydCB9LFxuICB9XG59XG5cbi8qKiBEZXRlY3RhIHVuIHRyaWdnZXIgZGUgdW4gc29sbyBjYXJhY3RlciAoYC9gIG8gYCNgKSBlbiBsw61taXRlIGRlIHBhbGFicmEsIGNvbiBxdWVyeSBoYXN0YSBlbCBjYXJldC4gKi9cbmNvbnN0IGRldGVjdENoYXJUcmlnZ2VyID0gKGVkaXRvckVsOiBIVE1MRWxlbWVudCB8IG51bGwsIHJhbmdlOiBSYW5nZSwgY2hhcjogc3RyaW5nKTogU2xhc2hUcmlnZ2VyU3RhdGUgPT4ge1xuICBpZiAoIWVkaXRvckVsIHx8ICFlZGl0b3JFbC5jb250YWlucyhyYW5nZS5zdGFydENvbnRhaW5lcikpIHtcbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGFuY2hvcjogbnVsbCB9XG4gIH1cbiAgY29uc3Qgbm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyXG4gIGlmIChub2RlLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYW5jaG9yOiBudWxsIH1cbiAgfVxuICBjb25zdCB0ZXh0ID0gKG5vZGUgYXMgVGV4dCkuZGF0YVxuICBjb25zdCBjYXJldCA9IHJhbmdlLnN0YXJ0T2Zmc2V0XG4gIGxldCBpID0gY2FyZXQgLSAxXG4gIGlmIChpIDwgMCkge1xuICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYW5jaG9yOiBudWxsIH1cbiAgfVxuXG4gIHdoaWxlIChpID49IDAgJiYgdGV4dFtpXSAhPT0gY2hhcikgaSAtPSAxXG4gIGlmIChpIDwgMCB8fCB0ZXh0W2ldICE9PSBjaGFyKSB7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhbmNob3I6IG51bGwgfVxuICB9XG5cbiAgY29uc3QgdHJpZ2dlckluZGV4ID0gaVxuICBjb25zdCBwcmV2ID0gdHJpZ2dlckluZGV4ID4gMCA/IHRleHQuY2hhckF0KHRyaWdnZXJJbmRleCAtIDEpIDogJydcbiAgY29uc3QgaXNCb3VuZGFyeSA9ICFwcmV2IHx8IC9bXFxzKFt7XS8udGVzdChwcmV2KVxuICBpZiAoIWlzQm91bmRhcnkpIHtcbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGFuY2hvcjogbnVsbCB9XG4gIH1cblxuICBjb25zdCBxdWVyeSA9IHRleHQuc2xpY2UodHJpZ2dlckluZGV4ICsgMSwgY2FyZXQpXG4gIGlmICgvXFxufFxcci8udGVzdChxdWVyeSkpIHtcbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGFuY2hvcjogbnVsbCB9XG4gIH1cbiAgaWYgKHF1ZXJ5LmluY2x1ZGVzKCcgICcpKSB7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhbmNob3I6IG51bGwgfVxuICB9XG5cbiAgcmV0dXJuIHsgYWN0aXZlOiB0cnVlLCBxdWVyeSwgYW5jaG9yOiB7IG5vZGUsIG9mZnNldDogdHJpZ2dlckluZGV4IH0gfVxufVxuXG5leHBvcnQgY29uc3QgdXNlQ29udGV4dE1lbnRpb25zID0gKCkgPT4ge1xuICBjb25zdCBlZGl0b3JSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQgfCBudWxsPihudWxsKVxuICBjb25zdCBbdHJpZ2dlciwgc2V0VHJpZ2dlcl0gPSB1c2VTdGF0ZTxNZW50aW9uVHJpZ2dlclN0YXRlPih7XG4gICAgYWN0aXZlOiBmYWxzZSxcbiAgICBxdWVyeTogJycsXG4gICAgYXRSdW5MZW5ndGg6IDAsXG4gICAgYW5jaG9yOiBudWxsLFxuICB9KVxuICBjb25zdCBbc2xhc2hUcmlnZ2VyLCBzZXRTbGFzaFRyaWdnZXJdID0gdXNlU3RhdGU8U2xhc2hUcmlnZ2VyU3RhdGU+KHtcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIHF1ZXJ5OiAnJyxcbiAgICBhbmNob3I6IG51bGwsXG4gIH0pXG4gIGNvbnN0IFtoYXNoVHJpZ2dlciwgc2V0SGFzaFRyaWdnZXJdID0gdXNlU3RhdGU8SGFzaFRyaWdnZXJTdGF0ZT4oe1xuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgcXVlcnk6ICcnLFxuICAgIGFuY2hvcjogbnVsbCxcbiAgfSlcblxuICBjb25zdCBkZXRlY3RUcmlnZ2VyID0gdXNlQ2FsbGJhY2soKCk6IE1lbnRpb25UcmlnZ2VyU3RhdGUgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwIHx8ICFlZGl0b3JSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCwgYW5jaG9yOiBudWxsIH1cbiAgICB9XG4gICAgcmV0dXJuIGRldGVjdE1lbnRpb25UcmlnZ2VyKGVkaXRvclJlZi5jdXJyZW50LCBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKSlcbiAgfSwgW10pXG5cbiAgY29uc3QgZGV0ZWN0U2xhc2ggPSB1c2VDYWxsYmFjaygoKTogU2xhc2hUcmlnZ2VyU3RhdGUgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwIHx8ICFlZGl0b3JSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhbmNob3I6IG51bGwgfVxuICAgIH1cbiAgICByZXR1cm4gZGV0ZWN0Q2hhclRyaWdnZXIoZWRpdG9yUmVmLmN1cnJlbnQsIHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLCAnLycpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IGRldGVjdEhhc2ggPSB1c2VDYWxsYmFjaygoKTogSGFzaFRyaWdnZXJTdGF0ZSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDAgfHwgIWVkaXRvclJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGFuY2hvcjogbnVsbCB9XG4gICAgfVxuICAgIHJldHVybiBkZXRlY3RDaGFyVHJpZ2dlcihlZGl0b3JSZWYuY3VycmVudCwgc2VsZWN0aW9uLmdldFJhbmdlQXQoMCksICcjJylcbiAgfSwgW10pXG5cbiAgY29uc3QgdXBkYXRlVHJpZ2dlciA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBuZXh0ID0gZGV0ZWN0VHJpZ2dlcigpXG4gICAgc2V0VHJpZ2dlcihuZXh0KVxuICAgIHJldHVybiBuZXh0XG4gIH0sIFtkZXRlY3RUcmlnZ2VyXSlcblxuICBjb25zdCBjbG9zZVRyaWdnZXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0VHJpZ2dlcih7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAsIGFuY2hvcjogbnVsbCB9KVxuICB9LCBbXSlcblxuICBjb25zdCB1cGRhdGVTbGFzaFRyaWdnZXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgbmV4dCA9IGRldGVjdFNsYXNoKClcbiAgICBzZXRTbGFzaFRyaWdnZXIobmV4dClcbiAgICByZXR1cm4gbmV4dFxuICB9LCBbZGV0ZWN0U2xhc2hdKVxuXG4gIGNvbnN0IGNsb3NlU2xhc2hUcmlnZ2VyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldFNsYXNoVHJpZ2dlcih7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYW5jaG9yOiBudWxsIH0pXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHVwZGF0ZUhhc2hUcmlnZ2VyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IG5leHQgPSBkZXRlY3RIYXNoKClcbiAgICBzZXRIYXNoVHJpZ2dlcihuZXh0KVxuICAgIHJldHVybiBuZXh0XG4gIH0sIFtkZXRlY3RIYXNoXSlcblxuICBjb25zdCBjbG9zZUhhc2hUcmlnZ2VyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldEhhc2hUcmlnZ2VyKHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhbmNob3I6IG51bGwgfSlcbiAgfSwgW10pXG5cbiAgLyoqXG4gICAqIEFqdXN0YSBsYSBjYW50aWRhZCBkZSBgQGAgZGVsIHRyaWdnZXIgYWN0aXZvIHNpbiBwZXJkZXIgZWwgcXVlcnkgYWN0dWFsLlxuICAgKiBFai46IGBAQGFiY2AgLT4gYEBhYmNgIGFsIGNhbWJpYXIgZGUgdGFiLlxuICAgKi9cbiAgY29uc3Qgc3luY1RyaWdnZXJBdFJ1bkxlbmd0aCA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXh0QXRSdW5MZW5ndGg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgbmV4dEhhc1NsYXNoID0gbmV4dEF0UnVuTGVuZ3RoIDwgMFxuICAgICAgY29uc3Qgc2FmZU5leHQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKE1hdGguYWJzKG5leHRBdFJ1bkxlbmd0aCkpKVxuICAgICAgY29uc3QgY3VycmVudCA9IGRldGVjdFRyaWdnZXIoKVxuICAgICAgaWYgKCFjdXJyZW50LmFjdGl2ZSB8fCAhY3VycmVudC5hbmNob3IpIHJldHVyblxuXG4gICAgICBjb25zdCB7IG5vZGUsIG9mZnNldCB9ID0gY3VycmVudC5hbmNob3JcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSkgcmV0dXJuXG4gICAgICBjb25zdCB0ZXh0Tm9kZSA9IG5vZGUgYXMgVGV4dFxuICAgICAgY29uc3QgZnVsbCA9IHRleHROb2RlLmRhdGFcbiAgICAgIGNvbnN0IGN1cnJlbnRSdW5MZW4gPSBNYXRoLmFicyhjdXJyZW50LmF0UnVuTGVuZ3RoKVxuICAgICAgY29uc3QgY3VycmVudEhhc1NsYXNoID0gY3VycmVudC5hdFJ1bkxlbmd0aCA8IDBcbiAgICAgIGNvbnN0IHF1ZXJ5TGVuID0gY3VycmVudFJ1bkxlbiArIChjdXJyZW50SGFzU2xhc2ggPyAxIDogMCkgKyBjdXJyZW50LnF1ZXJ5Lmxlbmd0aFxuICAgICAgY29uc3QgYmVmb3JlID0gZnVsbC5zbGljZSgwLCBvZmZzZXQpXG4gICAgICBjb25zdCBhZnRlciA9IGZ1bGwuc2xpY2Uob2Zmc2V0ICsgcXVlcnlMZW4pXG4gICAgICBjb25zdCBuZXh0UnVuID0gbmV4dEhhc1NsYXNoID8gYCR7J0AnLnJlcGVhdChzYWZlTmV4dCl9L2AgOiAnQCcucmVwZWF0KHNhZmVOZXh0KVxuICAgICAgLy8gU2kgdmVuaW1vcyBkZWwgdGFiIHNraWxsLCBlbCBxdWVyeSB0aWVuZSAnLycgY29tbyBwcmVmaWpvIOKAlCBsaW1waWFybG8gYWwgY2FtYmlhciBkZSB0YWIuXG4gICAgICBjb25zdCBjbGVhblF1ZXJ5ID0gY3VycmVudC5xdWVyeS5zdGFydHNXaXRoKCcvJykgPyBjdXJyZW50LnF1ZXJ5LnNsaWNlKDEpIDogY3VycmVudC5xdWVyeVxuICAgICAgY29uc3QgbmV4dFZhbHVlID0gYCR7YmVmb3JlfSR7bmV4dFJ1bn0ke2NsZWFuUXVlcnl9JHthZnRlcn1gXG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgdGV4dE5vZGUuZGF0YSA9IG5leHRWYWx1ZVxuXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG4gICAgICAgIGNvbnN0IGNhcmV0T2Zmc2V0ID0gYmVmb3JlLmxlbmd0aCArIG5leHRSdW4ubGVuZ3RoICsgY2xlYW5RdWVyeS5sZW5ndGhcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQodGV4dE5vZGUsIE1hdGgubWluKGNhcmV0T2Zmc2V0LCB0ZXh0Tm9kZS5kYXRhLmxlbmd0aCkpXG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSBkZXRlY3RUcmlnZ2VyKClcbiAgICAgIHNldFRyaWdnZXIodXBkYXRlZClcbiAgICB9LFxuICAgIFtkZXRlY3RUcmlnZ2VyXVxuICApXG5cbiAgLyoqXG4gICAqIFJlZW1wbGF6YSBlbCBgQHF1ZXJ5YCBwZW5kaWVudGUgcG9yIHVuIGNoaXAgYXTDs21pY28gY29uIGxhIG1lbnRpb24uXG4gICAqIFJlcXVpZXJlIHF1ZSBlbCBjYWxsZXIgcHJvdmVhIGVsIERPTSBkZWwgY2hpcCAoc2UgaW5zZXJ0YSB0YWwgY3VhbCkuXG4gICAqL1xuICBjb25zdCByZXBsYWNlVHJpZ2dlcldpdGhDaGlwID0gdXNlQ2FsbGJhY2soXG4gICAgKGNoaXBOb2RlOiBIVE1MRWxlbWVudCwgbWVudGlvbjogQ29udGV4dE1lbnRpb24pID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBkZXRlY3RUcmlnZ2VyKClcbiAgICAgIGlmICghY3VycmVudC5hY3RpdmUgfHwgIWN1cnJlbnQuYW5jaG9yKSByZXR1cm5cblxuICAgICAgY29uc3QgeyBub2RlLCBvZmZzZXQgfSA9IGN1cnJlbnQuYW5jaG9yXG4gICAgICBjb25zdCB0ZXh0Tm9kZSA9IG5vZGUgYXMgVGV4dFxuICAgICAgY29uc3QgZnVsbCA9IHRleHROb2RlLmRhdGFcbiAgICAgIGNvbnN0IGN1cnJlbnRSdW5MZW4gPSBNYXRoLmFicyhjdXJyZW50LmF0UnVuTGVuZ3RoKVxuICAgICAgY29uc3QgY3VycmVudEhhc1NsYXNoID0gY3VycmVudC5hdFJ1bkxlbmd0aCA8IDBcbiAgICAgIGNvbnN0IHF1ZXJ5TGVuID0gY3VycmVudFJ1bkxlbiArIChjdXJyZW50SGFzU2xhc2ggPyAxIDogMCkgKyBjdXJyZW50LnF1ZXJ5Lmxlbmd0aFxuICAgICAgY29uc3QgYWZ0ZXIgPSBmdWxsLnNsaWNlKG9mZnNldCArIHF1ZXJ5TGVuKVxuXG4gICAgICAvLyBUcnVuY2FyIGVsIHRleHRvIGhhc3RhIGFudGVzIGRlbCBydW4gZGUgYEDigKZgXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgIHRleHROb2RlLmRhdGEgPSBmdWxsLnNsaWNlKDAsIG9mZnNldClcblxuICAgICAgLy8gSW5zZXJ0YXIgZWwgY2hpcCBqdXN0byBkZXNwdcOpcyBkZWwgbm9kbyBkZSB0ZXh0b1xuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdkYXRhLW1lbnRpb24nLCAndHJ1ZScpXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVudGlvbi1pZCcsIFN0cmluZyhtZW50aW9uLmlkKSlcbiAgICAgIGNoaXBOb2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1tZW50aW9uLXR5cGUnLCBtZW50aW9uLnR5cGUpXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVudGlvbi1sYWJlbCcsIG1lbnRpb24ubGFiZWwpXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsICdmYWxzZScpXG5cbiAgICAgIGNvbnN0IHBhcmVudCA9IHRleHROb2RlLnBhcmVudE5vZGVcbiAgICAgIGlmICghcGFyZW50KSByZXR1cm5cblxuICAgICAgY29uc3Qgc3BhY2VOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYFxcdTAwYTAke2FmdGVyfWApXG4gICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaXBOb2RlLCB0ZXh0Tm9kZS5uZXh0U2libGluZylcbiAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoc3BhY2VOb2RlLCBjaGlwTm9kZS5uZXh0U2libGluZylcblxuICAgICAgLy8gUmVwb3NpY2lvbmFyIGNhcmV0IGRlc3B1w6lzIGRlbCBjaGlwIChhbnRlcyBkZWwgZXNwYWNpbyBub24tYnJlYWtpbmcpXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KHNwYWNlTm9kZSwgMSlcbiAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpXG4gICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSlcbiAgICAgIH1cblxuICAgICAgaWYgKHRleHROb2RlLmRhdGEgPT09ICcnKSB0ZXh0Tm9kZS5yZW1vdmUoKVxuXG4gICAgICBjbG9zZVRyaWdnZXIoKVxuICAgIH0sXG4gICAgW2RldGVjdFRyaWdnZXIsIGNsb3NlVHJpZ2dlcl1cbiAgKVxuXG4gIGNvbnN0IHJlcGxhY2VUcmlnZ2VyV2l0aFNsYXNoQ2hpcCA9IHVzZUNhbGxiYWNrKFxuICAgIChjaGlwTm9kZTogSFRNTEVsZW1lbnQsIHNsYXNoQ29tbWFuZDogU2xhc2hDb21tYW5kQ2hpcERhdGEpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBkZXRlY3RTbGFzaCgpXG4gICAgICBpZiAoIWN1cnJlbnQuYWN0aXZlIHx8ICFjdXJyZW50LmFuY2hvcikgcmV0dXJuXG5cbiAgICAgIGNvbnN0IHsgbm9kZSwgb2Zmc2V0IH0gPSBjdXJyZW50LmFuY2hvclxuICAgICAgY29uc3QgdGV4dE5vZGUgPSBub2RlIGFzIFRleHRcbiAgICAgIGNvbnN0IGZ1bGwgPSB0ZXh0Tm9kZS5kYXRhXG4gICAgICBjb25zdCB0cmlnZ2VyTGVuID0gMSArIGN1cnJlbnQucXVlcnkubGVuZ3RoXG4gICAgICBjb25zdCBhZnRlciA9IGZ1bGwuc2xpY2Uob2Zmc2V0ICsgdHJpZ2dlckxlbilcblxuICAgICAgdGV4dE5vZGUuZGF0YSA9IGZ1bGwuc2xpY2UoMCwgb2Zmc2V0KVxuXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2xhc2gtY29tbWFuZCcsICd0cnVlJylcbiAgICAgIGNoaXBOb2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1zbGFzaC1pZCcsIFN0cmluZyhzbGFzaENvbW1hbmQuaWQpKVxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdkYXRhLXNsYXNoLWxhYmVsJywgc2xhc2hDb21tYW5kLmxhYmVsKVxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCAnZmFsc2UnKVxuXG4gICAgICBjb25zdCBwYXJlbnQgPSB0ZXh0Tm9kZS5wYXJlbnROb2RlXG4gICAgICBpZiAoIXBhcmVudCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IHNwYWNlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAgJHthZnRlcn1gKVxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlwTm9kZSwgdGV4dE5vZGUubmV4dFNpYmxpbmcpXG4gICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHNwYWNlTm9kZSwgY2hpcE5vZGUubmV4dFNpYmxpbmcpXG5cbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKClcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoc3BhY2VOb2RlLCAxKVxuICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKVxuICAgICAgfVxuXG4gICAgICBpZiAodGV4dE5vZGUuZGF0YSA9PT0gJycpIHRleHROb2RlLnJlbW92ZSgpXG5cbiAgICAgIGNsb3NlU2xhc2hUcmlnZ2VyKClcbiAgICB9LFxuICAgIFtkZXRlY3RTbGFzaCwgY2xvc2VTbGFzaFRyaWdnZXJdXG4gIClcblxuICAvKipcbiAgICogUmVlbXBsYXphIGVsIGAjcXVlcnlgIHBlbmRpZW50ZSBwb3IgdW4gY2hpcCBkZSBza2lsbC4gTGEgc2tpbGwgc2lndWUgdmlhamFuZG9cbiAgICogY29tbyBtZW50aW9uIChgZGF0YS1tZW50aW9uKmApIHBhcmEgcXVlIGVsIGJhY2tlbmQgbGEgcmVzdWVsdmEgcG9yIGlkLlxuICAgKi9cbiAgY29uc3QgcmVwbGFjZVRyaWdnZXJXaXRoU2tpbGxDaGlwID0gdXNlQ2FsbGJhY2soXG4gICAgKGNoaXBOb2RlOiBIVE1MRWxlbWVudCwgbWVudGlvbjogQ29udGV4dE1lbnRpb24pID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBkZXRlY3RIYXNoKClcbiAgICAgIGlmICghY3VycmVudC5hY3RpdmUgfHwgIWN1cnJlbnQuYW5jaG9yKSByZXR1cm5cblxuICAgICAgY29uc3QgeyBub2RlLCBvZmZzZXQgfSA9IGN1cnJlbnQuYW5jaG9yXG4gICAgICBjb25zdCB0ZXh0Tm9kZSA9IG5vZGUgYXMgVGV4dFxuICAgICAgY29uc3QgZnVsbCA9IHRleHROb2RlLmRhdGFcbiAgICAgIGNvbnN0IHRyaWdnZXJMZW4gPSAxICsgY3VycmVudC5xdWVyeS5sZW5ndGhcbiAgICAgIGNvbnN0IGFmdGVyID0gZnVsbC5zbGljZShvZmZzZXQgKyB0cmlnZ2VyTGVuKVxuXG4gICAgICB0ZXh0Tm9kZS5kYXRhID0gZnVsbC5zbGljZSgwLCBvZmZzZXQpXG5cbiAgICAgIGNoaXBOb2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1tZW50aW9uJywgJ3RydWUnKVxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdkYXRhLW1lbnRpb24taWQnLCBTdHJpbmcobWVudGlvbi5pZCkpXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVudGlvbi10eXBlJywgbWVudGlvbi50eXBlKVxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdkYXRhLW1lbnRpb24tbGFiZWwnLCBtZW50aW9uLmxhYmVsKVxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCAnZmFsc2UnKVxuXG4gICAgICBjb25zdCBwYXJlbnQgPSB0ZXh0Tm9kZS5wYXJlbnROb2RlXG4gICAgICBpZiAoIXBhcmVudCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IHNwYWNlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGBcXHUwMGEwJHthZnRlcn1gKVxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlwTm9kZSwgdGV4dE5vZGUubmV4dFNpYmxpbmcpXG4gICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHNwYWNlTm9kZSwgY2hpcE5vZGUubmV4dFNpYmxpbmcpXG5cbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKClcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoc3BhY2VOb2RlLCAxKVxuICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKVxuICAgICAgfVxuXG4gICAgICBpZiAodGV4dE5vZGUuZGF0YSA9PT0gJycpIHRleHROb2RlLnJlbW92ZSgpXG5cbiAgICAgIGNsb3NlSGFzaFRyaWdnZXIoKVxuICAgIH0sXG4gICAgW2RldGVjdEhhc2gsIGNsb3NlSGFzaFRyaWdnZXJdXG4gIClcblxuICBjb25zdCBzZXJpYWxpemUgPSB1c2VDYWxsYmFjaygoKToge1xuICAgIHRleHQ6IHN0cmluZ1xuICAgIG1lbnRpb25zOiBDb250ZXh0TWVudGlvbltdXG4gICAgc2xhc2hDb21tYW5kczogU2xhc2hDb21tYW5kQ2hpcERhdGFbXVxuICB9ID0+IHtcbiAgICBjb25zdCBlbCA9IGVkaXRvclJlZi5jdXJyZW50XG4gICAgaWYgKCFlbCkgcmV0dXJuIHsgdGV4dDogJycsIG1lbnRpb25zOiBbXSwgc2xhc2hDb21tYW5kczogW10gfVxuICAgIGNvbnN0IG1lbnRpb25zOiBDb250ZXh0TWVudGlvbltdID0gW11cbiAgICBjb25zdCBzbGFzaENvbW1hbmRzOiBTbGFzaENvbW1hbmRDaGlwRGF0YVtdID0gW11cbiAgICBsZXQgdGV4dCA9ICcnXG5cbiAgICBjb25zdCB3YWxrID0gKG5vZGU6IE5vZGUpID0+IHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICB0ZXh0ICs9IChub2RlIGFzIFRleHQpLmRhdGFcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgY29uc3QgZWxOb2RlID0gbm9kZSBhcyBIVE1MRWxlbWVudFxuICAgICAgICBpZiAoZWxOb2RlLmRhdGFzZXQ/Lm1lbnRpb24gPT09ICd0cnVlJykge1xuICAgICAgICAgIGNvbnN0IG1lbnRpb246IENvbnRleHRNZW50aW9uID0ge1xuICAgICAgICAgICAgaWQ6IGVsTm9kZS5kYXRhc2V0Lm1lbnRpb25JZCA/PyAnJyxcbiAgICAgICAgICAgIHR5cGU6IChlbE5vZGUuZGF0YXNldC5tZW50aW9uVHlwZSBhcyBDb250ZXh0TWVudGlvblsndHlwZSddKSA/PyAndXNlcicsXG4gICAgICAgICAgICBsYWJlbDogZWxOb2RlLmRhdGFzZXQubWVudGlvbkxhYmVsID8/IGVsTm9kZS50ZXh0Q29udGVudCA/PyAnJyxcbiAgICAgICAgICB9XG4gICAgICAgICAgbWVudGlvbnMucHVzaChtZW50aW9uKVxuICAgICAgICAgIHRleHQgKz0gc2VyaWFsaXplTWVudGlvbihtZW50aW9uKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChlbE5vZGUuZGF0YXNldD8uc2xhc2hDb21tYW5kID09PSAndHJ1ZScpIHtcbiAgICAgICAgICBjb25zdCBzbGFzaDogU2xhc2hDb21tYW5kQ2hpcERhdGEgPSB7XG4gICAgICAgICAgICBpZDogZWxOb2RlLmRhdGFzZXQuc2xhc2hJZCA/PyAnJyxcbiAgICAgICAgICAgIGxhYmVsOiBlbE5vZGUuZGF0YXNldC5zbGFzaExhYmVsID8/IGVsTm9kZS50ZXh0Q29udGVudD8ucmVwbGFjZSgvXlxcLy8sICcnKSA/PyAnJyxcbiAgICAgICAgICB9XG4gICAgICAgICAgc2xhc2hDb21tYW5kcy5wdXNoKHNsYXNoKVxuICAgICAgICAgIHRleHQgKz0gc2VyaWFsaXplU2xhc2hDb21tYW5kKHNsYXNoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChlbE5vZGUudGFnTmFtZSA9PT0gJ0JSJykge1xuICAgICAgICAgIHRleHQgKz0gJ1xcbidcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBlbE5vZGUuY2hpbGROb2Rlcy5mb3JFYWNoKHdhbGspXG4gICAgICAgIGlmIChlbE5vZGUudGFnTmFtZSA9PT0gJ0RJVicgfHwgZWxOb2RlLnRhZ05hbWUgPT09ICdQJykgdGV4dCArPSAnXFxuJ1xuICAgICAgfVxuICAgIH1cblxuICAgIGVsLmNoaWxkTm9kZXMuZm9yRWFjaCh3YWxrKVxuICAgIHJldHVybiB7IHRleHQ6IHRleHQucmVwbGFjZSgvXFxuKyQvLCAnJyksIG1lbnRpb25zLCBzbGFzaENvbW1hbmRzIH1cbiAgfSwgW10pXG5cbiAgY29uc3QgY2xlYXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKGVkaXRvclJlZi5jdXJyZW50KSBlZGl0b3JSZWYuY3VycmVudC5pbm5lckhUTUwgPSAnJ1xuICAgIGNsb3NlVHJpZ2dlcigpXG4gICAgY2xvc2VTbGFzaFRyaWdnZXIoKVxuICAgIGNsb3NlSGFzaFRyaWdnZXIoKVxuICB9LCBbY2xvc2VUcmlnZ2VyLCBjbG9zZVNsYXNoVHJpZ2dlciwgY2xvc2VIYXNoVHJpZ2dlcl0pXG5cbiAgY29uc3QgZm9jdXMgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKClcbiAgfSwgW10pXG5cbiAgcmV0dXJuIHtcbiAgICBlZGl0b3JSZWYsXG4gICAgdHJpZ2dlcixcbiAgICB1cGRhdGVUcmlnZ2VyLFxuICAgIGNsb3NlVHJpZ2dlcixcbiAgICBzeW5jVHJpZ2dlckF0UnVuTGVuZ3RoLFxuICAgIHJlcGxhY2VUcmlnZ2VyV2l0aENoaXAsXG4gICAgc2xhc2hUcmlnZ2VyLFxuICAgIHVwZGF0ZVNsYXNoVHJpZ2dlcixcbiAgICBjbG9zZVNsYXNoVHJpZ2dlcixcbiAgICByZXBsYWNlVHJpZ2dlcldpdGhTbGFzaENoaXAsXG4gICAgaGFzaFRyaWdnZXIsXG4gICAgdXBkYXRlSGFzaFRyaWdnZXIsXG4gICAgY2xvc2VIYXNoVHJpZ2dlcixcbiAgICByZXBsYWNlVHJpZ2dlcldpdGhTa2lsbENoaXAsXG4gICAgc2VyaWFsaXplLFxuICAgIGNsZWFy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
463
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVJlZiIsInVzZVN0YXRlIiwic2VyaWFsaXplTWVudGlvbiIsInNlcmlhbGl6ZVNsYXNoQ29tbWFuZCIsImRldGVjdE1lbnRpb25UcmlnZ2VyIiwiZWRpdG9yRWwiLCJyYW5nZSIsImNvbnRhaW5zIiwic3RhcnRDb250YWluZXIiLCJhY3RpdmUiLCJxdWVyeSIsImF0UnVuTGVuZ3RoIiwiYW5jaG9yIiwibm9kZSIsIm5vZGVUeXBlIiwiTm9kZSIsIlRFWFRfTk9ERSIsInRleHQiLCJkYXRhIiwiY2FyZXQiLCJzdGFydE9mZnNldCIsImkiLCJydW5FbmQiLCJydW5TdGFydCIsInByZXYiLCJjaGFyQXQiLCJpc0JvdW5kYXJ5IiwidGVzdCIsImhhc1NsYXNoU3VmZml4IiwicXVlcnlTdGFydCIsInNsaWNlIiwiaW5jbHVkZXMiLCJvZmZzZXQiLCJkZXRlY3RTbGFzaFRyaWdnZXIiLCJzbGFzaEluZGV4IiwidXNlQ29udGV4dE1lbnRpb25zIiwiZWRpdG9yUmVmIiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5IiwidHJpZ2dlciIsInNldFRyaWdnZXIiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsInNsYXNoVHJpZ2dlciIsInNldFNsYXNoVHJpZ2dlciIsImRldGVjdFRyaWdnZXIiLCJzZWxlY3Rpb24iLCJ3aW5kb3ciLCJnZXRTZWxlY3Rpb24iLCJyYW5nZUNvdW50IiwiY3VycmVudCIsImdldFJhbmdlQXQiLCJkZXRlY3RTbGFzaCIsInVwZGF0ZVRyaWdnZXIiLCJuZXh0IiwiY2xvc2VUcmlnZ2VyIiwidXBkYXRlU2xhc2hUcmlnZ2VyIiwiY2xvc2VTbGFzaFRyaWdnZXIiLCJzeW5jVHJpZ2dlckF0UnVuTGVuZ3RoIiwibmV4dEF0UnVuTGVuZ3RoIiwibmV4dEhhc1NsYXNoIiwic2FmZU5leHQiLCJNYXRoIiwibWF4IiwiZmxvb3IiLCJhYnMiLCJfY3VycmVudCRhbmNob3IiLCJ0ZXh0Tm9kZSIsImZ1bGwiLCJjdXJyZW50UnVuTGVuIiwiY3VycmVudEhhc1NsYXNoIiwicXVlcnlMZW4iLCJsZW5ndGgiLCJiZWZvcmUiLCJhZnRlciIsIm5leHRSdW4iLCJjb25jYXQiLCJyZXBlYXQiLCJjbGVhblF1ZXJ5Iiwic3RhcnRzV2l0aCIsIm5leHRWYWx1ZSIsImRvY3VtZW50IiwiY3JlYXRlUmFuZ2UiLCJjYXJldE9mZnNldCIsInNldFN0YXJ0IiwibWluIiwiY29sbGFwc2UiLCJyZW1vdmVBbGxSYW5nZXMiLCJhZGRSYW5nZSIsInVwZGF0ZWQiLCJzeW5jU2tpbGxUcmlnZ2VyIiwiX2N1cnJlbnQkYW5jaG9yMiIsInJlcGxhY2VUcmlnZ2VyV2l0aENoaXAiLCJjaGlwTm9kZSIsIm1lbnRpb24iLCJfY3VycmVudCRhbmNob3IzIiwic2V0QXR0cmlidXRlIiwiU3RyaW5nIiwiaWQiLCJ0eXBlIiwibGFiZWwiLCJwYXJlbnQiLCJwYXJlbnROb2RlIiwic3BhY2VOb2RlIiwiY3JlYXRlVGV4dE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJuZXh0U2libGluZyIsInJlcGxhY2VUcmlnZ2VyV2l0aFNsYXNoQ2hpcCIsInNsYXNoQ29tbWFuZCIsIl9jdXJyZW50JGFuY2hvcjQiLCJ0cmlnZ2VyTGVuIiwic2VyaWFsaXplIiwiZWwiLCJtZW50aW9ucyIsInNsYXNoQ29tbWFuZHMiLCJ3YWxrIiwiRUxFTUVOVF9OT0RFIiwiX2VsTm9kZSRkYXRhc2V0IiwiX2VsTm9kZSRkYXRhc2V0MiIsImVsTm9kZSIsImRhdGFzZXQiLCJfZWxOb2RlJGRhdGFzZXQkbWVudGkiLCJfcmVmIiwiX3JlZjIiLCJfZWxOb2RlJGRhdGFzZXQkbWVudGkyIiwibWVudGlvbklkIiwibWVudGlvblR5cGUiLCJtZW50aW9uTGFiZWwiLCJ0ZXh0Q29udGVudCIsInB1c2giLCJfZWxOb2RlJGRhdGFzZXQkc2xhc2giLCJfcmVmMyIsIl9lbE5vZGUkZGF0YXNldCRzbGFzaDIiLCJfZWxOb2RlJHRleHRDb250ZW50Iiwic2xhc2giLCJzbGFzaElkIiwic2xhc2hMYWJlbCIsInJlcGxhY2UiLCJ0YWdOYW1lIiwiY2hpbGROb2RlcyIsImZvckVhY2giLCJjbGVhciIsImlubmVySFRNTCIsImZvY3VzIiwiX2VkaXRvclJlZiRjdXJyZW50Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hvb2tzL3VzZUNvbnRleHRNZW50aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQ29udGV4dE1lbnRpb24gfSBmcm9tICcuLi90eXBlcy9jb250ZXh0TWVudGlvbidcbmltcG9ydCB7IHNlcmlhbGl6ZU1lbnRpb24gfSBmcm9tICcuLi91dGlscy9yZW5kZXJDb250ZXh0TWVudGlvbnMnXG5pbXBvcnQgeyBzZXJpYWxpemVTbGFzaENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zbGFzaENvbW1hbmRNYXJrZXInXG5pbXBvcnQgdHlwZSB7IFNsYXNoQ29tbWFuZENoaXBEYXRhIH0gZnJvbSAnLi4vY29tcG9uZW50cy9hdG9tcy9TbGFzaENvbW1hbmRDaGlwL2J1aWxkU2xhc2hDaGlwRWxlbWVudCdcblxuZXhwb3J0IHR5cGUgTWVudGlvblRyaWdnZXJTdGF0ZSA9IHtcbiAgYWN0aXZlOiBib29sZWFuXG4gIHF1ZXJ5OiBzdHJpbmdcbiAgLyoqIENhbnRpZGFkIGRlIGBAYCBjb25zZWN1dGl2b3MgZGVsIHRyaWdnZXIgKGBAYCDihpIgMSwgYEBAYCDihpIgMikuIE1hcGVhIGEgbGEgdGFiIGVuIG9yZGVuLiAqL1xuICBhdFJ1bkxlbmd0aDogbnVtYmVyXG4gIC8qKiBQb3NpY2nDs24gZGVsIHByaW1lciBgQGAgZGVsIHJ1biAocmVlbXBsYXpvIGRlbCBjaGlwKS4gKi9cbiAgYW5jaG9yOiB7IG5vZGU6IE5vZGU7IG9mZnNldDogbnVtYmVyIH0gfCBudWxsXG59XG5cbmV4cG9ydCB0eXBlIFNsYXNoVHJpZ2dlclN0YXRlID0ge1xuICBhY3RpdmU6IGJvb2xlYW5cbiAgcXVlcnk6IHN0cmluZ1xuICBhbmNob3I6IHsgbm9kZTogTm9kZTsgb2Zmc2V0OiBudW1iZXIgfSB8IG51bGxcbn1cblxuLyoqXG4gKiBJbnNwZWNjaW9uYSBsYSBzZWxlY2Npw7NuIGFjdHVhbC4gRm9ybWF0bzogW2zDrW1pdGUgZGUgcGFsYWJyYV0gQCsgcXVlcnkgaGFzdGEgZWwgY2FyZXQuXG4gKiBQZXJtaXRlIGVzcGFjaW9zIHNpbXBsZXMgZGVudHJvIGRlbCBxdWVyeSAocC4gZWouIFwiQEp1YW4gUGVyZXpcIikgeSBjaWVycmFcbiAqIGVsIHRyaWdnZXIgY3VhbmRvIGRldGVjdGEgZG9zIGVzcGFjaW9zIGNvbnNlY3V0aXZvcy5cbiAqIExhIHRhYiBvYmpldGl2byBlcyBsYSBxdWUgY29ycmVzcG9uZGUgYWwgbsO6bWVybyBkZSBgQGAgKDEgPSBwcmltZXJhIHRhYiB2aXNpYmxlLCBldGMuKS5cbiAqL1xuY29uc3QgZGV0ZWN0TWVudGlvblRyaWdnZXIgPSAoZWRpdG9yRWw6IEhUTUxFbGVtZW50IHwgbnVsbCwgcmFuZ2U6IFJhbmdlKTogTWVudGlvblRyaWdnZXJTdGF0ZSA9PiB7XG4gIGlmICghZWRpdG9yRWwgfHwgIWVkaXRvckVsLmNvbnRhaW5zKHJhbmdlLnN0YXJ0Q29udGFpbmVyKSkge1xuICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAsIGFuY2hvcjogbnVsbCB9XG4gIH1cbiAgY29uc3Qgbm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyXG4gIGlmIChub2RlLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAsIGFuY2hvcjogbnVsbCB9XG4gIH1cbiAgY29uc3QgdGV4dCA9IChub2RlIGFzIFRleHQpLmRhdGFcbiAgY29uc3QgY2FyZXQgPSByYW5nZS5zdGFydE9mZnNldFxuICBsZXQgaSA9IGNhcmV0IC0gMVxuICBpZiAoaSA8IDApIHtcbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwLCBhbmNob3I6IG51bGwgfVxuICB9XG5cbiAgd2hpbGUgKGkgPj0gMCAmJiB0ZXh0W2ldICE9PSAnQCcpIGkgLT0gMVxuICBpZiAoaSA8IDAgfHwgdGV4dFtpXSAhPT0gJ0AnKSB7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCwgYW5jaG9yOiBudWxsIH1cbiAgfVxuXG4gIGNvbnN0IHJ1bkVuZCA9IGlcbiAgd2hpbGUgKGkgPj0gMCAmJiB0ZXh0W2ldID09PSAnQCcpIHtcbiAgICBpIC09IDFcbiAgfVxuICBjb25zdCBydW5TdGFydCA9IGkgKyAxXG4gIGNvbnN0IGF0UnVuTGVuZ3RoID0gcnVuRW5kIC0gcnVuU3RhcnQgKyAxXG4gIGNvbnN0IHByZXYgPSBydW5TdGFydCA+IDAgPyB0ZXh0LmNoYXJBdChydW5TdGFydCAtIDEpIDogJydcbiAgY29uc3QgaXNCb3VuZGFyeSA9ICFwcmV2IHx8IC9bXFxzKFt7XS8udGVzdChwcmV2KVxuICBpZiAoIWlzQm91bmRhcnkpIHtcbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwLCBhbmNob3I6IG51bGwgfVxuICB9XG5cbiAgY29uc3QgaGFzU2xhc2hTdWZmaXggPSB0ZXh0W3J1bkVuZCArIDFdID09PSAnLydcbiAgY29uc3QgcXVlcnlTdGFydCA9IGhhc1NsYXNoU3VmZml4ID8gcnVuRW5kICsgMiA6IHJ1bkVuZCArIDFcbiAgY29uc3QgcXVlcnkgPSB0ZXh0LnNsaWNlKHF1ZXJ5U3RhcnQsIGNhcmV0KVxuICBpZiAoL1xcbnxcXHIvLnRlc3QocXVlcnkpKSB7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCwgYW5jaG9yOiBudWxsIH1cbiAgfVxuICBpZiAocXVlcnkuaW5jbHVkZXMoJyAgJykpIHtcbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwLCBhbmNob3I6IG51bGwgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhY3RpdmU6IHRydWUsXG4gICAgcXVlcnksXG4gICAgYXRSdW5MZW5ndGg6IGhhc1NsYXNoU3VmZml4ID8gLWF0UnVuTGVuZ3RoIDogYXRSdW5MZW5ndGgsXG4gICAgYW5jaG9yOiB7IG5vZGUsIG9mZnNldDogcnVuU3RhcnQgfSxcbiAgfVxufVxuXG5jb25zdCBkZXRlY3RTbGFzaFRyaWdnZXIgPSAoZWRpdG9yRWw6IEhUTUxFbGVtZW50IHwgbnVsbCwgcmFuZ2U6IFJhbmdlKTogU2xhc2hUcmlnZ2VyU3RhdGUgPT4ge1xuICBpZiAoIWVkaXRvckVsIHx8ICFlZGl0b3JFbC5jb250YWlucyhyYW5nZS5zdGFydENvbnRhaW5lcikpIHtcbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGFuY2hvcjogbnVsbCB9XG4gIH1cbiAgY29uc3Qgbm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyXG4gIGlmIChub2RlLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYW5jaG9yOiBudWxsIH1cbiAgfVxuICBjb25zdCB0ZXh0ID0gKG5vZGUgYXMgVGV4dCkuZGF0YVxuICBjb25zdCBjYXJldCA9IHJhbmdlLnN0YXJ0T2Zmc2V0XG4gIGxldCBpID0gY2FyZXQgLSAxXG4gIGlmIChpIDwgMCkge1xuICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYW5jaG9yOiBudWxsIH1cbiAgfVxuXG4gIHdoaWxlIChpID49IDAgJiYgdGV4dFtpXSAhPT0gJy8nKSBpIC09IDFcbiAgaWYgKGkgPCAwIHx8IHRleHRbaV0gIT09ICcvJykge1xuICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYW5jaG9yOiBudWxsIH1cbiAgfVxuXG4gIGNvbnN0IHNsYXNoSW5kZXggPSBpXG4gIGNvbnN0IHByZXYgPSBzbGFzaEluZGV4ID4gMCA/IHRleHQuY2hhckF0KHNsYXNoSW5kZXggLSAxKSA6ICcnXG4gIGNvbnN0IGlzQm91bmRhcnkgPSAhcHJldiB8fCAvW1xccyhbe10vLnRlc3QocHJldilcbiAgaWYgKCFpc0JvdW5kYXJ5KSB7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhbmNob3I6IG51bGwgfVxuICB9XG5cbiAgY29uc3QgcXVlcnkgPSB0ZXh0LnNsaWNlKHNsYXNoSW5kZXggKyAxLCBjYXJldClcbiAgaWYgKC9cXG58XFxyLy50ZXN0KHF1ZXJ5KSkge1xuICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYW5jaG9yOiBudWxsIH1cbiAgfVxuICBpZiAocXVlcnkuaW5jbHVkZXMoJyAgJykpIHtcbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGFuY2hvcjogbnVsbCB9XG4gIH1cblxuICByZXR1cm4geyBhY3RpdmU6IHRydWUsIHF1ZXJ5LCBhbmNob3I6IHsgbm9kZSwgb2Zmc2V0OiBzbGFzaEluZGV4IH0gfVxufVxuXG5leHBvcnQgY29uc3QgdXNlQ29udGV4dE1lbnRpb25zID0gKCkgPT4ge1xuICBjb25zdCBlZGl0b3JSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQgfCBudWxsPihudWxsKVxuICBjb25zdCBbdHJpZ2dlciwgc2V0VHJpZ2dlcl0gPSB1c2VTdGF0ZTxNZW50aW9uVHJpZ2dlclN0YXRlPih7XG4gICAgYWN0aXZlOiBmYWxzZSxcbiAgICBxdWVyeTogJycsXG4gICAgYXRSdW5MZW5ndGg6IDAsXG4gICAgYW5jaG9yOiBudWxsLFxuICB9KVxuICBjb25zdCBbc2xhc2hUcmlnZ2VyLCBzZXRTbGFzaFRyaWdnZXJdID0gdXNlU3RhdGU8U2xhc2hUcmlnZ2VyU3RhdGU+KHtcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIHF1ZXJ5OiAnJyxcbiAgICBhbmNob3I6IG51bGwsXG4gIH0pXG5cbiAgY29uc3QgZGV0ZWN0VHJpZ2dlciA9IHVzZUNhbGxiYWNrKCgpOiBNZW50aW9uVHJpZ2dlclN0YXRlID0+IHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCB8fCAhZWRpdG9yUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAsIGFuY2hvcjogbnVsbCB9XG4gICAgfVxuICAgIHJldHVybiBkZXRlY3RNZW50aW9uVHJpZ2dlcihlZGl0b3JSZWYuY3VycmVudCwgc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IGRldGVjdFNsYXNoID0gdXNlQ2FsbGJhY2soKCk6IFNsYXNoVHJpZ2dlclN0YXRlID0+IHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCB8fCAhZWRpdG9yUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYW5jaG9yOiBudWxsIH1cbiAgICB9XG4gICAgcmV0dXJuIGRldGVjdFNsYXNoVHJpZ2dlcihlZGl0b3JSZWYuY3VycmVudCwgc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHVwZGF0ZVRyaWdnZXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgbmV4dCA9IGRldGVjdFRyaWdnZXIoKVxuICAgIHNldFRyaWdnZXIobmV4dClcbiAgICByZXR1cm4gbmV4dFxuICB9LCBbZGV0ZWN0VHJpZ2dlcl0pXG5cbiAgY29uc3QgY2xvc2VUcmlnZ2VyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldFRyaWdnZXIoeyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwLCBhbmNob3I6IG51bGwgfSlcbiAgfSwgW10pXG5cbiAgY29uc3QgdXBkYXRlU2xhc2hUcmlnZ2VyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IG5leHQgPSBkZXRlY3RTbGFzaCgpXG4gICAgc2V0U2xhc2hUcmlnZ2VyKG5leHQpXG4gICAgcmV0dXJuIG5leHRcbiAgfSwgW2RldGVjdFNsYXNoXSlcblxuICBjb25zdCBjbG9zZVNsYXNoVHJpZ2dlciA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRTbGFzaFRyaWdnZXIoeyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGFuY2hvcjogbnVsbCB9KVxuICB9LCBbXSlcblxuICAvKipcbiAgICogQWp1c3RhIGxhIGNhbnRpZGFkIGRlIGBAYCBkZWwgdHJpZ2dlciBhY3Rpdm8gc2luIHBlcmRlciBlbCBxdWVyeSBhY3R1YWwuXG4gICAqIEVqLjogYEBAYWJjYCAtPiBgQGFiY2AgYWwgY2FtYmlhciBkZSB0YWIuXG4gICAqL1xuICBjb25zdCBzeW5jVHJpZ2dlckF0UnVuTGVuZ3RoID0gdXNlQ2FsbGJhY2soXG4gICAgKG5leHRBdFJ1bkxlbmd0aDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBuZXh0SGFzU2xhc2ggPSBuZXh0QXRSdW5MZW5ndGggPCAwXG4gICAgICBjb25zdCBzYWZlTmV4dCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IoTWF0aC5hYnMobmV4dEF0UnVuTGVuZ3RoKSkpXG4gICAgICBjb25zdCBjdXJyZW50ID0gZGV0ZWN0VHJpZ2dlcigpXG4gICAgICBpZiAoIWN1cnJlbnQuYWN0aXZlIHx8ICFjdXJyZW50LmFuY2hvcikgcmV0dXJuXG5cbiAgICAgIGNvbnN0IHsgbm9kZSwgb2Zmc2V0IH0gPSBjdXJyZW50LmFuY2hvclxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSByZXR1cm5cbiAgICAgIGNvbnN0IHRleHROb2RlID0gbm9kZSBhcyBUZXh0XG4gICAgICBjb25zdCBmdWxsID0gdGV4dE5vZGUuZGF0YVxuICAgICAgY29uc3QgY3VycmVudFJ1bkxlbiA9IE1hdGguYWJzKGN1cnJlbnQuYXRSdW5MZW5ndGgpXG4gICAgICBjb25zdCBjdXJyZW50SGFzU2xhc2ggPSBjdXJyZW50LmF0UnVuTGVuZ3RoIDwgMFxuICAgICAgY29uc3QgcXVlcnlMZW4gPSBjdXJyZW50UnVuTGVuICsgKGN1cnJlbnRIYXNTbGFzaCA/IDEgOiAwKSArIGN1cnJlbnQucXVlcnkubGVuZ3RoXG4gICAgICBjb25zdCBiZWZvcmUgPSBmdWxsLnNsaWNlKDAsIG9mZnNldClcbiAgICAgIGNvbnN0IGFmdGVyID0gZnVsbC5zbGljZShvZmZzZXQgKyBxdWVyeUxlbilcbiAgICAgIGNvbnN0IG5leHRSdW4gPSBuZXh0SGFzU2xhc2ggPyBgJHsnQCcucmVwZWF0KHNhZmVOZXh0KX0vYCA6ICdAJy5yZXBlYXQoc2FmZU5leHQpXG4gICAgICAvLyBTaSB2ZW5pbW9zIGRlbCB0YWIgc2tpbGwsIGVsIHF1ZXJ5IHRpZW5lICcvJyBjb21vIHByZWZpam8g4oCUIGxpbXBpYXJsbyBhbCBjYW1iaWFyIGRlIHRhYi5cbiAgICAgIGNvbnN0IGNsZWFuUXVlcnkgPSBjdXJyZW50LnF1ZXJ5LnN0YXJ0c1dpdGgoJy8nKSA/IGN1cnJlbnQucXVlcnkuc2xpY2UoMSkgOiBjdXJyZW50LnF1ZXJ5XG4gICAgICBjb25zdCBuZXh0VmFsdWUgPSBgJHtiZWZvcmV9JHtuZXh0UnVufSR7Y2xlYW5RdWVyeX0ke2FmdGVyfWBcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICB0ZXh0Tm9kZS5kYXRhID0gbmV4dFZhbHVlXG5cbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKClcbiAgICAgICAgY29uc3QgY2FyZXRPZmZzZXQgPSBiZWZvcmUubGVuZ3RoICsgbmV4dFJ1bi5sZW5ndGggKyBjbGVhblF1ZXJ5Lmxlbmd0aFxuICAgICAgICByYW5nZS5zZXRTdGFydCh0ZXh0Tm9kZSwgTWF0aC5taW4oY2FyZXRPZmZzZXQsIHRleHROb2RlLmRhdGEubGVuZ3RoKSlcbiAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpXG4gICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgdXBkYXRlZCA9IGRldGVjdFRyaWdnZXIoKVxuICAgICAgc2V0VHJpZ2dlcih1cGRhdGVkKVxuICAgIH0sXG4gICAgW2RldGVjdFRyaWdnZXJdXG4gIClcblxuICAvKipcbiAgICogQ29udmllcnRlIGVsIHRyaWdnZXIgYEB7bn1xdWVyeWAgYWN0aXZvIGVuIGBAL3F1ZXJ5YC5cbiAgICogU2UgdXNhIGFsIGNhbWJpYXIgYSBsYSB0YWIgZGUgc2tpbGxzIChjdXlvIHRyaWdnZXIgZXMgYEAvYCkuXG4gICAqL1xuICBjb25zdCBzeW5jU2tpbGxUcmlnZ2VyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBkZXRlY3RUcmlnZ2VyKClcbiAgICBpZiAoIWN1cnJlbnQuYWN0aXZlIHx8ICFjdXJyZW50LmFuY2hvcikgcmV0dXJuXG4gICAgLy8gWWEgZXMgQC8gKHNraWxsKSDigJQgbm8gcmVlc2NyaWJpclxuICAgIGlmIChjdXJyZW50LmF0UnVuTGVuZ3RoID09PSAtMSkgcmV0dXJuXG5cbiAgICBjb25zdCB7IG5vZGUsIG9mZnNldCB9ID0gY3VycmVudC5hbmNob3JcbiAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUpIHJldHVyblxuICAgIGNvbnN0IHRleHROb2RlID0gbm9kZSBhcyBUZXh0XG4gICAgY29uc3QgZnVsbCA9IHRleHROb2RlLmRhdGFcbiAgICAvLyBhdFJ1bkxlbmd0aCBuZWdhdGl2byAoQEAvKSBpbmNsdXllIGVsIHNsYXNoOyB1c2FyIGFicyArIDEgY29tbyBlbiByZXBsYWNlVHJpZ2dlcldpdGhDaGlwXG4gICAgY29uc3QgY3VycmVudFJ1bkxlbiA9IE1hdGguYWJzKGN1cnJlbnQuYXRSdW5MZW5ndGgpXG4gICAgY29uc3QgY3VycmVudEhhc1NsYXNoID0gY3VycmVudC5hdFJ1bkxlbmd0aCA8IDBcbiAgICBjb25zdCBxdWVyeUxlbiA9IGN1cnJlbnRSdW5MZW4gKyAoY3VycmVudEhhc1NsYXNoID8gMSA6IDApICsgY3VycmVudC5xdWVyeS5sZW5ndGhcbiAgICBjb25zdCBiZWZvcmUgPSBmdWxsLnNsaWNlKDAsIG9mZnNldClcbiAgICBjb25zdCBhZnRlciA9IGZ1bGwuc2xpY2Uob2Zmc2V0ICsgcXVlcnlMZW4pXG4gICAgY29uc3QgY2xlYW5RdWVyeSA9IGN1cnJlbnQucXVlcnkuc3RhcnRzV2l0aCgnLycpID8gY3VycmVudC5xdWVyeS5zbGljZSgxKSA6IGN1cnJlbnQucXVlcnlcbiAgICBjb25zdCBuZXh0VmFsdWUgPSBgJHtiZWZvcmV9QC8ke2NsZWFuUXVlcnl9JHthZnRlcn1gXG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICB0ZXh0Tm9kZS5kYXRhID0gbmV4dFZhbHVlXG5cbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKClcbiAgICAgIGNvbnN0IGNhcmV0T2Zmc2V0ID0gYmVmb3JlLmxlbmd0aCArIDIgKyBjbGVhblF1ZXJ5Lmxlbmd0aFxuICAgICAgcmFuZ2Uuc2V0U3RhcnQodGV4dE5vZGUsIE1hdGgubWluKGNhcmV0T2Zmc2V0LCB0ZXh0Tm9kZS5kYXRhLmxlbmd0aCkpXG4gICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpXG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpXG4gICAgfVxuXG4gICAgY29uc3QgdXBkYXRlZCA9IGRldGVjdFRyaWdnZXIoKVxuICAgIHNldFRyaWdnZXIodXBkYXRlZClcbiAgfSwgW2RldGVjdFRyaWdnZXJdKVxuXG4gIC8qKlxuICAgKiBSZWVtcGxhemEgZWwgYEBxdWVyeWAgcGVuZGllbnRlIHBvciB1biBjaGlwIGF0w7NtaWNvIGNvbiBsYSBtZW50aW9uLlxuICAgKiBSZXF1aWVyZSBxdWUgZWwgY2FsbGVyIHByb3ZlYSBlbCBET00gZGVsIGNoaXAgKHNlIGluc2VydGEgdGFsIGN1YWwpLlxuICAgKi9cbiAgY29uc3QgcmVwbGFjZVRyaWdnZXJXaXRoQ2hpcCA9IHVzZUNhbGxiYWNrKFxuICAgIChjaGlwTm9kZTogSFRNTEVsZW1lbnQsIG1lbnRpb246IENvbnRleHRNZW50aW9uKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gZGV0ZWN0VHJpZ2dlcigpXG4gICAgICBpZiAoIWN1cnJlbnQuYWN0aXZlIHx8ICFjdXJyZW50LmFuY2hvcikgcmV0dXJuXG5cbiAgICAgIGNvbnN0IHsgbm9kZSwgb2Zmc2V0IH0gPSBjdXJyZW50LmFuY2hvclxuICAgICAgY29uc3QgdGV4dE5vZGUgPSBub2RlIGFzIFRleHRcbiAgICAgIGNvbnN0IGZ1bGwgPSB0ZXh0Tm9kZS5kYXRhXG4gICAgICBjb25zdCBjdXJyZW50UnVuTGVuID0gTWF0aC5hYnMoY3VycmVudC5hdFJ1bkxlbmd0aClcbiAgICAgIGNvbnN0IGN1cnJlbnRIYXNTbGFzaCA9IGN1cnJlbnQuYXRSdW5MZW5ndGggPCAwXG4gICAgICBjb25zdCBxdWVyeUxlbiA9IGN1cnJlbnRSdW5MZW4gKyAoY3VycmVudEhhc1NsYXNoID8gMSA6IDApICsgY3VycmVudC5xdWVyeS5sZW5ndGhcbiAgICAgIGNvbnN0IGFmdGVyID0gZnVsbC5zbGljZShvZmZzZXQgKyBxdWVyeUxlbilcblxuICAgICAgLy8gVHJ1bmNhciBlbCB0ZXh0byBoYXN0YSBhbnRlcyBkZWwgcnVuIGRlIGBA4oCmYFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICB0ZXh0Tm9kZS5kYXRhID0gZnVsbC5zbGljZSgwLCBvZmZzZXQpXG5cbiAgICAgIC8vIEluc2VydGFyIGVsIGNoaXAganVzdG8gZGVzcHXDqXMgZGVsIG5vZG8gZGUgdGV4dG9cbiAgICAgIGNoaXBOb2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1tZW50aW9uJywgJ3RydWUnKVxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdkYXRhLW1lbnRpb24taWQnLCBTdHJpbmcobWVudGlvbi5pZCkpXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVudGlvbi10eXBlJywgbWVudGlvbi50eXBlKVxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdkYXRhLW1lbnRpb24tbGFiZWwnLCBtZW50aW9uLmxhYmVsKVxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCAnZmFsc2UnKVxuXG4gICAgICBjb25zdCBwYXJlbnQgPSB0ZXh0Tm9kZS5wYXJlbnROb2RlXG4gICAgICBpZiAoIXBhcmVudCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IHNwYWNlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGBcXHUwMGEwJHthZnRlcn1gKVxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlwTm9kZSwgdGV4dE5vZGUubmV4dFNpYmxpbmcpXG4gICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHNwYWNlTm9kZSwgY2hpcE5vZGUubmV4dFNpYmxpbmcpXG5cbiAgICAgIC8vIFJlcG9zaWNpb25hciBjYXJldCBkZXNwdcOpcyBkZWwgY2hpcCAoYW50ZXMgZGVsIGVzcGFjaW8gbm9uLWJyZWFraW5nKVxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgICByYW5nZS5zZXRTdGFydChzcGFjZU5vZGUsIDEpXG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpXG4gICAgICB9XG5cbiAgICAgIGNsb3NlVHJpZ2dlcigpXG4gICAgfSxcbiAgICBbZGV0ZWN0VHJpZ2dlciwgY2xvc2VUcmlnZ2VyXVxuICApXG5cbiAgY29uc3QgcmVwbGFjZVRyaWdnZXJXaXRoU2xhc2hDaGlwID0gdXNlQ2FsbGJhY2soXG4gICAgKGNoaXBOb2RlOiBIVE1MRWxlbWVudCwgc2xhc2hDb21tYW5kOiBTbGFzaENvbW1hbmRDaGlwRGF0YSkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudCA9IGRldGVjdFNsYXNoKClcbiAgICAgIGlmICghY3VycmVudC5hY3RpdmUgfHwgIWN1cnJlbnQuYW5jaG9yKSByZXR1cm5cblxuICAgICAgY29uc3QgeyBub2RlLCBvZmZzZXQgfSA9IGN1cnJlbnQuYW5jaG9yXG4gICAgICBjb25zdCB0ZXh0Tm9kZSA9IG5vZGUgYXMgVGV4dFxuICAgICAgY29uc3QgZnVsbCA9IHRleHROb2RlLmRhdGFcbiAgICAgIGNvbnN0IHRyaWdnZXJMZW4gPSAxICsgY3VycmVudC5xdWVyeS5sZW5ndGhcbiAgICAgIGNvbnN0IGFmdGVyID0gZnVsbC5zbGljZShvZmZzZXQgKyB0cmlnZ2VyTGVuKVxuXG4gICAgICB0ZXh0Tm9kZS5kYXRhID0gZnVsbC5zbGljZSgwLCBvZmZzZXQpXG5cbiAgICAgIGNoaXBOb2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1zbGFzaC1jb21tYW5kJywgJ3RydWUnKVxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdkYXRhLXNsYXNoLWlkJywgU3RyaW5nKHNsYXNoQ29tbWFuZC5pZCkpXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2xhc2gtbGFiZWwnLCBzbGFzaENvbW1hbmQubGFiZWwpXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsICdmYWxzZScpXG5cbiAgICAgIGNvbnN0IHBhcmVudCA9IHRleHROb2RlLnBhcmVudE5vZGVcbiAgICAgIGlmICghcGFyZW50KSByZXR1cm5cblxuICAgICAgY29uc3Qgc3BhY2VOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYCAke2FmdGVyfWApXG4gICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaXBOb2RlLCB0ZXh0Tm9kZS5uZXh0U2libGluZylcbiAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoc3BhY2VOb2RlLCBjaGlwTm9kZS5uZXh0U2libGluZylcblxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgICByYW5nZS5zZXRTdGFydChzcGFjZU5vZGUsIDEpXG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpXG4gICAgICB9XG5cbiAgICAgIGNsb3NlU2xhc2hUcmlnZ2VyKClcbiAgICB9LFxuICAgIFtkZXRlY3RTbGFzaCwgY2xvc2VTbGFzaFRyaWdnZXJdXG4gIClcblxuICBjb25zdCBzZXJpYWxpemUgPSB1c2VDYWxsYmFjaygoKToge1xuICAgIHRleHQ6IHN0cmluZ1xuICAgIG1lbnRpb25zOiBDb250ZXh0TWVudGlvbltdXG4gICAgc2xhc2hDb21tYW5kczogU2xhc2hDb21tYW5kQ2hpcERhdGFbXVxuICB9ID0+IHtcbiAgICBjb25zdCBlbCA9IGVkaXRvclJlZi5jdXJyZW50XG4gICAgaWYgKCFlbCkgcmV0dXJuIHsgdGV4dDogJycsIG1lbnRpb25zOiBbXSwgc2xhc2hDb21tYW5kczogW10gfVxuICAgIGNvbnN0IG1lbnRpb25zOiBDb250ZXh0TWVudGlvbltdID0gW11cbiAgICBjb25zdCBzbGFzaENvbW1hbmRzOiBTbGFzaENvbW1hbmRDaGlwRGF0YVtdID0gW11cbiAgICBsZXQgdGV4dCA9ICcnXG5cbiAgICBjb25zdCB3YWxrID0gKG5vZGU6IE5vZGUpID0+IHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICB0ZXh0ICs9IChub2RlIGFzIFRleHQpLmRhdGFcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgY29uc3QgZWxOb2RlID0gbm9kZSBhcyBIVE1MRWxlbWVudFxuICAgICAgICBpZiAoZWxOb2RlLmRhdGFzZXQ/Lm1lbnRpb24gPT09ICd0cnVlJykge1xuICAgICAgICAgIGNvbnN0IG1lbnRpb246IENvbnRleHRNZW50aW9uID0ge1xuICAgICAgICAgICAgaWQ6IGVsTm9kZS5kYXRhc2V0Lm1lbnRpb25JZCA/PyAnJyxcbiAgICAgICAgICAgIHR5cGU6IChlbE5vZGUuZGF0YXNldC5tZW50aW9uVHlwZSBhcyBDb250ZXh0TWVudGlvblsndHlwZSddKSA/PyAndXNlcicsXG4gICAgICAgICAgICBsYWJlbDogZWxOb2RlLmRhdGFzZXQubWVudGlvbkxhYmVsID8/IGVsTm9kZS50ZXh0Q29udGVudCA/PyAnJyxcbiAgICAgICAgICB9XG4gICAgICAgICAgbWVudGlvbnMucHVzaChtZW50aW9uKVxuICAgICAgICAgIHRleHQgKz0gc2VyaWFsaXplTWVudGlvbihtZW50aW9uKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChlbE5vZGUuZGF0YXNldD8uc2xhc2hDb21tYW5kID09PSAndHJ1ZScpIHtcbiAgICAgICAgICBjb25zdCBzbGFzaDogU2xhc2hDb21tYW5kQ2hpcERhdGEgPSB7XG4gICAgICAgICAgICBpZDogZWxOb2RlLmRhdGFzZXQuc2xhc2hJZCA/PyAnJyxcbiAgICAgICAgICAgIGxhYmVsOiBlbE5vZGUuZGF0YXNldC5zbGFzaExhYmVsID8/IGVsTm9kZS50ZXh0Q29udGVudD8ucmVwbGFjZSgvXlxcLy8sICcnKSA/PyAnJyxcbiAgICAgICAgICB9XG4gICAgICAgICAgc2xhc2hDb21tYW5kcy5wdXNoKHNsYXNoKVxuICAgICAgICAgIHRleHQgKz0gc2VyaWFsaXplU2xhc2hDb21tYW5kKHNsYXNoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChlbE5vZGUudGFnTmFtZSA9PT0gJ0JSJykge1xuICAgICAgICAgIHRleHQgKz0gJ1xcbidcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBlbE5vZGUuY2hpbGROb2Rlcy5mb3JFYWNoKHdhbGspXG4gICAgICAgIGlmIChlbE5vZGUudGFnTmFtZSA9PT0gJ0RJVicgfHwgZWxOb2RlLnRhZ05hbWUgPT09ICdQJykgdGV4dCArPSAnXFxuJ1xuICAgICAgfVxuICAgIH1cblxuICAgIGVsLmNoaWxkTm9kZXMuZm9yRWFjaCh3YWxrKVxuICAgIHJldHVybiB7IHRleHQ6IHRleHQucmVwbGFjZSgvXFxuKyQvLCAnJyksIG1lbnRpb25zLCBzbGFzaENvbW1hbmRzIH1cbiAgfSwgW10pXG5cbiAgY29uc3QgY2xlYXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKGVkaXRvclJlZi5jdXJyZW50KSBlZGl0b3JSZWYuY3VycmVudC5pbm5lckhUTUwgPSAnJ1xuICAgIGNsb3NlVHJpZ2dlcigpXG4gICAgY2xvc2VTbGFzaFRyaWdnZXIoKVxuICB9LCBbY2xvc2VUcmlnZ2VyLCBjbG9zZVNsYXNoVHJpZ2dlcl0pXG5cbiAgY29uc3QgZm9jdXMgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKClcbiAgfSwgW10pXG5cbiAgcmV0dXJuIHtcbiAgICBlZGl0b3JSZWYsXG4gICAgdHJpZ2dlcixcbiAgICB1cGRhdGVUcmlnZ2VyLFxuICAgIGNsb3NlVHJpZ2dlcixcbiAgICBzeW5jVHJpZ2dlckF0UnVuTGVuZ3RoLFxuICAgIHN5bmNTa2lsbFRyaWdnZXIsXG4gICAgcmVwbGFjZVRyaWdnZXJXaXRoQ2hpcCxcbiAgICBzbGFzaFRyaWdnZXIsXG4gICAgdXBkYXRlU2xhc2hUcmlnZ2VyLFxuICAgIGNsb3NlU2xhc2hUcmlnZ2VyLFxuICAgIHJlcGxhY2VUcmlnZ2VyV2l0aFNsYXNoQ2hpcCxcbiAgICBzZXJpYWxpemUsXG4gICAgY2xlYXIsXG4gICAgZm9jdXMsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLFNBQVNBLFdBQVcsRUFBRUMsTUFBTSxFQUFFQyxRQUFRLFFBQVEsT0FBTztBQUVyRCxTQUFTQyxnQkFBZ0IsUUFBUSxnQ0FBZ0M7QUFDakUsU0FBU0MscUJBQXFCLFFBQVEsNkJBQTZCO0FBa0JuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNQyxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQW9CQSxDQUFJQyxRQUE0QixFQUFFQyxLQUFZLEVBQTBCO0VBQ2hHLElBQUksQ0FBQ0QsUUFBUSxJQUFJLENBQUNBLFFBQVEsQ0FBQ0UsUUFBUSxDQUFDRCxLQUFLLENBQUNFLGNBQWMsQ0FBQyxFQUFFO0lBQ3pELE9BQU87TUFBRUMsTUFBTSxFQUFFLEtBQUs7TUFBRUMsS0FBSyxFQUFFLEVBQUU7TUFBRUMsV0FBVyxFQUFFLENBQUM7TUFBRUMsTUFBTSxFQUFFO0lBQUssQ0FBQztFQUNuRTtFQUNBLElBQU1DLElBQUksR0FBR1AsS0FBSyxDQUFDRSxjQUFjO0VBQ2pDLElBQUlL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