@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
@@ -8,61 +8,38 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
8
8
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
9
9
  import { createPortal } from 'react-dom';
10
10
  import { Cross } from '@projectcor/icons/lib/components/Cross';
11
- import { FileUpload } from '@projectcor/icons/lib/components/FileUpload';
12
11
  import { useTranslation } from 'react-i18next';
12
+ import { MaiaStreamdown } from '../../atoms/MaiaStreamdown';
13
13
  import { Backdrop } from '../../atoms/Backdrop';
14
14
  import { Loader } from '../../atoms/Loader';
15
- import { Switch } from '../../atoms/Switch';
16
15
  import { SECTIONS } from '../../../constants/config';
17
- import { useUser, isCollaboratorRole } from '../../../context/cor-user';
18
- import { EVENTS, useEvent } from '../../../hooks/useEvent';
16
+ import { useUser } from '../../../context/cor-user';
19
17
  import { useSnackBarManager } from '../../../hooks/useSnackBarManager/useSnackBarManager';
20
- import { formatDate } from '../../../lang/utils';
21
18
  import { createSkill } from '../../../services/maia/Skills/createSkill';
22
19
  import { updateSkill } from '../../../services/maia/Skills/updateSkill';
23
20
  import { deleteSkill } from '../../../services/maia/Skills/deleteSkill';
24
21
  import { getUnitFileSize } from '../../../utils/getUnitFileSize';
25
22
  import { getSkillContentByteLength, isSkillContentOverLimit, SKILL_CONTENT_MAX_BYTES } from '../../../utils/skillContentSize';
26
23
  import { DeleteQuestionModal } from '../DeleteQuestionModal/DeleteQuestionModal';
27
- import { SCASMByteCounter, SCASMCancelButton, SCASMCloseButton, SCASMBody, SCASMDeleteSlot, SCASMFieldBox, SCASMFieldInput, SCASMFieldLabel, SCASMFieldTextarea, SCASMFooter, SCASMHeader, SCASMHeaderTitle, SCASMHiddenFileInput, SCASMInstructionsField, SCASMInstructionsHeader, SCASMInstructionsPanel, SCASMInstructionsTextarea, SCASMInstructionsTitle, SCASMMetadataItem, SCASMPreviewBody, SCASMPreviewContentBox, SCASMPreviewContentPanel, SCASMPreviewDescription, SCASMPreviewHeadingBlock, SCASMPreviewMetadataLabel, SCASMPreviewMetadataRow, SCASMPreviewMetadataValue, SCASMPreviewName, SCASMSaveOutlinedButton, SCASMSavePrimaryButton, SCASMSwitchLabel, SCASMSwitchRow, SCASMUploadButton, SCASMUseSkillButton, SCASMWrapper } from './AbmSkillModal.styles';
28
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
29
- export var SKILL_USE_AFTER_SAVE_EVENT = 'maia-use-skill-after-save';
30
- var resolveSkillAbmOption = function resolveSkillAbmOption(skillValues) {
31
- if (skillValues.isReadOnly) return 'view';
32
- if (skillValues.isEditing) return 'edit';
33
- return 'create';
34
- };
24
+ import { getUsageStoreState } from '../../../store/useUsageStore';
25
+ import { SCASMByteCounter, SCASMCancelButton, SCASMCloseButton, SCASMContent, SCASMDeleteSlot, SCASMField, SCASMFieldHeader, SCASMFooter, SCASMHeader, SCASMHeaderActions, SCASMHeaderTitle, SCASMHiddenFileInput, SCASMInput, SCASMLabel, SCASMPreview, SCASMPreviewEmpty, SCASMSaveButton, SCASMTextarea, SCASMToggleButton, SCASMToggleGroup, SCASMUploadButton, SCASMWrapper } from './AbmSkillModal.styles';
26
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
35
27
  var initialValues = {
36
28
  isEditing: false,
37
29
  general: {
38
30
  id: undefined,
39
31
  name: '',
40
- description: '',
41
- content: '',
42
- access_type: 'only_me'
32
+ content: ''
43
33
  }
44
34
  };
45
- var emptyBaseline = {
46
- name: '',
47
- description: '',
48
- content: '',
49
- access_type: 'only_me'
50
- };
51
- var parseDescriptionFromContent = function parseDescriptionFromContent(content) {
52
- var frontmatterMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
53
- if (!frontmatterMatch) return '';
54
- var descriptionMatch = frontmatterMatch[1].match(/^description:\s*(.+)$/m);
55
- return descriptionMatch ? descriptionMatch[1].trim() : '';
56
- };
57
35
  export var AbmSkillModal = function AbmSkillModal(_ref) {
58
- var _values$general, _values$general2, _values$general3, _values$general4, _values$general5, _values$general7, _values$general0, _values$general1;
36
+ var _user$permissions, _values$general, _values$general2, _values$general3;
59
37
  var addSkill = _ref.addSkill,
60
38
  updateSkillInList = _ref.updateSkillInList,
61
39
  removeSkill = _ref.removeSkill;
62
40
  var _useTranslation = useTranslation([SECTIONS.chatAI]),
63
41
  t = _useTranslation.t;
64
42
  var user = useUser();
65
- var eventAmplitude = useEvent();
66
43
  var _useSnackBarManager = useSnackBarManager(),
67
44
  handleSnackbarSuccess = _useSnackBarManager.handleSnackbarSuccess,
68
45
  handleSnackbarError = _useSnackBarManager.handleSnackbarError;
@@ -80,103 +57,99 @@ export var AbmSkillModal = function AbmSkillModal(_ref) {
80
57
  setShowDelete = _useState6[1];
81
58
  var _useState7 = useState(false),
82
59
  _useState8 = _slicedToArray(_useState7, 2),
83
- pendingUpload = _useState8[0],
84
- setPendingUpload = _useState8[1];
85
- var _useState9 = useState(initialValues),
60
+ showPreview = _useState8[0],
61
+ setShowPreview = _useState8[1];
62
+ var _useState9 = useState(false),
86
63
  _useState0 = _slicedToArray(_useState9, 2),
87
- values = _useState0[0],
88
- setValues = _useState0[1];
64
+ pendingUpload = _useState0[0],
65
+ setPendingUpload = _useState0[1];
66
+ var _useState1 = useState(initialValues),
67
+ _useState10 = _slicedToArray(_useState1, 2),
68
+ values = _useState10[0],
69
+ setValues = _useState10[1];
89
70
  var fileInputRef = useRef(null);
90
- var initialRef = useRef(emptyBaseline);
91
- var isReadOnly = !!values.isReadOnly;
92
- var isSharedSkill = !!values.isShared;
93
- var canShareWithCompany = !isCollaboratorRole(user.role_id) && !isReadOnly;
71
+ // Baseline to detect changes: the loaded values when editing, empty when creating
72
+ // (a new/generated/uploaded skill always counts as a change).
73
+ var initialRef = useRef({
74
+ name: '',
75
+ content: ''
76
+ });
77
+ var userPermissions = user === null || user === void 0 || (_user$permissions = user.permissions) === null || _user$permissions === void 0 ? void 0 : _user$permissions.ai_agents;
78
+ var canCreate = !!(userPermissions !== null && userPermissions !== void 0 && userPermissions.create);
79
+ var canEdit = !!(userPermissions !== null && userPermissions !== void 0 && userPermissions.edit);
80
+ var canDelete = !!(userPermissions !== null && userPermissions !== void 0 && userPermissions["delete"]);
94
81
  var name = ((_values$general = values.general) === null || _values$general === void 0 ? void 0 : _values$general.name) || '';
95
- var description = ((_values$general2 = values.general) === null || _values$general2 === void 0 ? void 0 : _values$general2.description) || '';
96
- var content = ((_values$general3 = values.general) === null || _values$general3 === void 0 ? void 0 : _values$general3.content) || '';
97
- var accessType = ((_values$general4 = values.general) === null || _values$general4 === void 0 ? void 0 : _values$general4.access_type) || 'only_me';
98
- var effectiveAccessType = canShareWithCompany ? accessType : 'only_me';
99
- var skillId = (_values$general5 = values.general) === null || _values$general5 === void 0 ? void 0 : _values$general5.id;
82
+ var content = ((_values$general2 = values.general) === null || _values$general2 === void 0 ? void 0 : _values$general2.content) || '';
83
+ var skillId = (_values$general3 = values.general) === null || _values$general3 === void 0 ? void 0 : _values$general3.id;
100
84
  var contentBytes = useMemo(function () {
101
85
  return getSkillContentByteLength(content);
102
86
  }, [content]);
103
87
  var isOverLimit = contentBytes > SKILL_CONTENT_MAX_BYTES;
104
88
  var isValid = !!name.trim() && !!content.trim() && !isOverLimit;
105
- var hasChanges = name.trim() !== initialRef.current.name || description.trim() !== initialRef.current.description || content.trim() !== initialRef.current.content || canShareWithCompany && effectiveAccessType !== initialRef.current.access_type;
106
- var createdByLabel = useMemo(function () {
107
- var _values$general6;
108
- var createdBy = (_values$general6 = values.general) === null || _values$general6 === void 0 || (_values$general6 = _values$general6.created_by_name) === null || _values$general6 === void 0 ? void 0 : _values$general6.trim();
109
- if (createdBy) return createdBy;
110
- return isSharedSkill ? '' : "".concat(user.firstName, " ").concat(user.lastName).trim();
111
- }, [(_values$general7 = values.general) === null || _values$general7 === void 0 ? void 0 : _values$general7.created_by_name, user.firstName, user.lastName, isSharedSkill]);
112
- var lastUpdatedLabel = useMemo(function () {
113
- var _values$general8, _values$general9;
114
- var updatedAt = ((_values$general8 = values.general) === null || _values$general8 === void 0 ? void 0 : _values$general8.updated_at) || ((_values$general9 = values.general) === null || _values$general9 === void 0 ? void 0 : _values$general9.created_at);
115
- if (!updatedAt) return '';
116
- var parsed = new Date(updatedAt);
117
- if (Number.isNaN(parsed.getTime())) return '';
118
- return formatDate(parsed);
119
- }, [(_values$general0 = values.general) === null || _values$general0 === void 0 ? void 0 : _values$general0.updated_at, (_values$general1 = values.general) === null || _values$general1 === void 0 ? void 0 : _values$general1.created_at]);
89
+ var hasChanges = name.trim() !== initialRef.current.name || content.trim() !== initialRef.current.content;
120
90
  var handleClose = useCallback(function () {
121
91
  setIsOpen(false);
122
92
  setShowDelete(false);
93
+ setShowPreview(false);
123
94
  setPendingUpload(false);
124
95
  setValues(initialValues);
125
- initialRef.current = emptyBaseline;
126
96
  }, []);
127
- var handleCancel = useCallback(function () {
128
- eventAmplitude(EVENTS.aiChatSkillAbmCancel, {
129
- option: resolveSkillAbmOption(values)
130
- });
131
- handleClose();
132
- }, [eventAmplitude, handleClose, values]);
133
97
  var handleBackdropClick = useCallback(function (event) {
134
98
  if (event.target === event.currentTarget) {
135
- handleCancel();
99
+ handleClose();
136
100
  }
137
- }, [handleCancel]);
101
+ }, [handleClose]);
102
+ var showUsageBlockedError = function showUsageBlockedError() {
103
+ var _getUsageStoreState = getUsageStoreState(),
104
+ blocked = _getUsageStoreState.blocked,
105
+ quotaExceededMessage = _getUsageStoreState.quotaExceededMessage;
106
+ if (!blocked) return false;
107
+ handleSnackbarError(quotaExceededMessage || t('usageBlocked', {
108
+ defaultValue: 'Te quedaste sin usos de IA.'
109
+ }));
110
+ return true;
111
+ };
138
112
  useEffect(function () {
139
113
  var handleSetSkillValues = function handleSetSkillValues(event) {
140
- var _skillValues$values, _skillValues$values2, _skillValues$values3;
114
+ var _skillValues$values, _skillValues$values2, _skillValues$values3, _skillValues$values4, _skillValues$values5, _skillValues$values6;
141
115
  var _ref2 = event.detail || {},
142
- skillValues = _ref2.skillValues,
143
- analyticsSource = _ref2.analyticsSource;
116
+ skillValues = _ref2.skillValues;
144
117
  if (!skillValues) return;
145
- var incomingGeneral = _objectSpread(_objectSpread({}, initialValues.general), (_skillValues$values = skillValues.values) === null || _skillValues$values === void 0 ? void 0 : _skillValues$values.general);
146
- var incomingName = (incomingGeneral.name || '').trim();
147
- var incomingDescription = (incomingGeneral.description || '').trim();
148
- var incomingContent = (incomingGeneral.content || '').trim();
149
- var incomingAccessType = isCollaboratorRole(user.role_id) ? 'only_me' : incomingGeneral.access_type || 'only_me';
150
- var parsedDescription = incomingDescription || (incomingContent ? parseDescriptionFromContent(incomingContent) : '');
151
- var editingBaseline = {
118
+ if (getUsageStoreState().blocked) {
119
+ var _getUsageStoreState2 = getUsageStoreState(),
120
+ quotaExceededMessage = _getUsageStoreState2.quotaExceededMessage;
121
+ handleSnackbarError(quotaExceededMessage || t('usageBlocked', {
122
+ defaultValue: 'Te quedaste sin usos de IA.'
123
+ }));
124
+ return;
125
+ }
126
+ var incomingName = (((_skillValues$values = skillValues.values) === null || _skillValues$values === void 0 || (_skillValues$values = _skillValues$values.general) === null || _skillValues$values === void 0 ? void 0 : _skillValues$values.name) || '').trim();
127
+ var incomingContent = (((_skillValues$values2 = skillValues.values) === null || _skillValues$values2 === void 0 || (_skillValues$values2 = _skillValues$values2.general) === null || _skillValues$values2 === void 0 ? void 0 : _skillValues$values2.content) || '').trim();
128
+ // Editing an existing skill -> baseline is its values; creating -> empty baseline.
129
+ initialRef.current = (_skillValues$values3 = skillValues.values) !== null && _skillValues$values3 !== void 0 && _skillValues$values3.isEditing ? {
152
130
  name: incomingName,
153
- description: parsedDescription,
154
- content: incomingContent,
155
- access_type: incomingAccessType
131
+ content: incomingContent
132
+ } : {
133
+ name: '',
134
+ content: ''
156
135
  };
157
- initialRef.current = (_skillValues$values2 = skillValues.values) !== null && _skillValues$values2 !== void 0 && _skillValues$values2.isEditing ? editingBaseline : emptyBaseline;
158
136
  setValues(_objectSpread(_objectSpread(_objectSpread({}, initialValues), skillValues.values), {}, {
159
- general: _objectSpread(_objectSpread({}, incomingGeneral), {}, {
160
- description: parsedDescription,
161
- access_type: incomingAccessType
162
- })
137
+ general: _objectSpread(_objectSpread({}, initialValues.general), (_skillValues$values4 = skillValues.values) === null || _skillValues$values4 === void 0 ? void 0 : _skillValues$values4.general)
163
138
  }));
164
- setPendingUpload(((_skillValues$values3 = skillValues.values) === null || _skillValues$values3 === void 0 ? void 0 : _skillValues$values3.intent) === 'upload');
139
+ // Con contenido (edición o skill ya generada) arrancamos en "Vista previa"; vacía, en "Editar".
140
+ var hasContent = !!((_skillValues$values5 = skillValues.values) !== null && _skillValues$values5 !== void 0 && (_skillValues$values5 = _skillValues$values5.general) !== null && _skillValues$values5 !== void 0 && (_skillValues$values5 = _skillValues$values5.content) !== null && _skillValues$values5 !== void 0 && _skillValues$values5.trim());
141
+ setShowPreview(hasContent);
142
+ // Si vino con intent "upload", abrimos el selector de archivos al montar.
143
+ setPendingUpload(((_skillValues$values6 = skillValues.values) === null || _skillValues$values6 === void 0 ? void 0 : _skillValues$values6.intent) === 'upload');
165
144
  setIsOpen(!!skillValues.isOpen);
166
- if (skillValues.isOpen) {
167
- var incomingValues = _objectSpread(_objectSpread({}, initialValues), skillValues.values);
168
- var source = analyticsSource === 'dropdown' || analyticsSource === 'empty' || analyticsSource === 'catalog' ? analyticsSource : 'catalog';
169
- eventAmplitude(EVENTS.aiChatSkillAbmAccess, {
170
- option: resolveSkillAbmOption(incomingValues),
171
- source: source
172
- });
173
- }
174
145
  };
175
146
  document.addEventListener('abm-skill-modal-set-values', handleSetSkillValues);
176
147
  return function () {
177
148
  document.removeEventListener('abm-skill-modal-set-values', handleSetSkillValues);
178
149
  };
179
- }, [eventAmplitude, user.role_id]);
150
+ }, []);
151
+
152
+ // When opened with the "upload" intent, open the OS file picker once mounted.
180
153
  useEffect(function () {
181
154
  if (isOpen && pendingUpload) {
182
155
  var _fileInputRef$current;
@@ -197,16 +170,6 @@ export var AbmSkillModal = function AbmSkillModal(_ref) {
197
170
  });
198
171
  });
199
172
  };
200
- var handleAccessTypeChange = function handleAccessTypeChange(checked) {
201
- if (!canShareWithCompany) return;
202
- setValues(function (prev) {
203
- return _objectSpread(_objectSpread({}, prev), {}, {
204
- general: _objectSpread(_objectSpread({}, prev.general), {}, {
205
- access_type: checked ? 'company' : 'only_me'
206
- })
207
- });
208
- });
209
- };
210
173
  var handleUploadClick = function handleUploadClick() {
211
174
  var _fileInputRef$current2;
212
175
  (_fileInputRef$current2 = fileInputRef.current) === null || _fileInputRef$current2 === void 0 || _fileInputRef$current2.click();
@@ -214,11 +177,11 @@ export var AbmSkillModal = function AbmSkillModal(_ref) {
214
177
  var handleFileChange = /*#__PURE__*/function () {
215
178
  var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(event) {
216
179
  var _event$target$files;
217
- var file, isMarkdown, text, baseName, parsedDescription, _t;
180
+ var file, isMarkdown, text, baseName, _t;
218
181
  return _regeneratorRuntime.wrap(function (_context) {
219
182
  while (1) switch (_context.prev = _context.next) {
220
183
  case 0:
221
- file = (_event$target$files = event.target.files) === null || _event$target$files === void 0 ? void 0 : _event$target$files[0];
184
+ file = (_event$target$files = event.target.files) === null || _event$target$files === void 0 ? void 0 : _event$target$files[0]; // Reset the input (via ref) so selecting the same file again still fires onChange.
222
185
  if (fileInputRef.current) {
223
186
  fileInputRef.current.value = '';
224
187
  }
@@ -233,9 +196,6 @@ export var AbmSkillModal = function AbmSkillModal(_ref) {
233
196
  _context.next = 2;
234
197
  break;
235
198
  }
236
- eventAmplitude(EVENTS.aiChatSkillUpload, {
237
- result: 'type_error'
238
- });
239
199
  handleSnackbarError(t('mySkills.uploadError'));
240
200
  return _context.abrupt("return");
241
201
  case 2:
@@ -243,9 +203,6 @@ export var AbmSkillModal = function AbmSkillModal(_ref) {
243
203
  _context.next = 3;
244
204
  break;
245
205
  }
246
- eventAmplitude(EVENTS.aiChatSkillUpload, {
247
- result: 'size_error'
248
- });
249
206
  handleSnackbarError(t('mySkills.uploadSizeError'));
250
207
  return _context.abrupt("return");
251
208
  case 3:
@@ -258,27 +215,22 @@ export var AbmSkillModal = function AbmSkillModal(_ref) {
258
215
  _context.next = 5;
259
216
  break;
260
217
  }
261
- eventAmplitude(EVENTS.aiChatSkillUpload, {
262
- result: 'size_error'
263
- });
264
218
  handleSnackbarError(t('mySkills.uploadSizeError'));
265
219
  return _context.abrupt("return");
266
220
  case 5:
267
221
  baseName = file.name.replace(/\.(md|markdown)$/i, '');
268
- parsedDescription = parseDescriptionFromContent(text);
269
222
  setValues(function (prev) {
270
- var _prev$general, _prev$general2, _prev$general3;
223
+ var _prev$general;
271
224
  return _objectSpread(_objectSpread({}, prev), {}, {
272
225
  general: _objectSpread(_objectSpread({}, prev.general), {}, {
273
226
  content: text,
274
- description: (_prev$general = prev.general) !== null && _prev$general !== void 0 && (_prev$general = _prev$general.description) !== null && _prev$general !== void 0 && _prev$general.trim() ? prev.general.description : parsedDescription || ((_prev$general2 = prev.general) === null || _prev$general2 === void 0 ? void 0 : _prev$general2.description) || '',
275
- name: (_prev$general3 = prev.general) !== null && _prev$general3 !== void 0 && (_prev$general3 = _prev$general3.name) !== null && _prev$general3 !== void 0 && _prev$general3.trim() ? prev.general.name : baseName
227
+ // Only fill the name from the filename when it's still empty.
228
+ name: (_prev$general = prev.general) !== null && _prev$general !== void 0 && (_prev$general = _prev$general.name) !== null && _prev$general !== void 0 && _prev$general.trim() ? prev.general.name : baseName
276
229
  })
277
230
  });
278
231
  });
279
- eventAmplitude(EVENTS.aiChatSkillUpload, {
280
- result: 'success'
281
- });
232
+ // Tras subir un .md mostramos el resultado renderizado por defecto.
233
+ setShowPreview(true);
282
234
  _context.next = 7;
283
235
  break;
284
236
  case 6:
@@ -295,257 +247,112 @@ export var AbmSkillModal = function AbmSkillModal(_ref) {
295
247
  return _ref3.apply(this, arguments);
296
248
  };
297
249
  }();
298
- var persistSkill = /*#__PURE__*/function () {
250
+ var handleSave = /*#__PURE__*/function () {
299
251
  var _ref4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
300
- var payload, updated, created;
252
+ var updated, created, _t2;
301
253
  return _regeneratorRuntime.wrap(function (_context2) {
302
254
  while (1) switch (_context2.prev = _context2.next) {
303
255
  case 0:
304
- payload = {
305
- name: name.trim(),
306
- description: description.trim(),
307
- content: content.trim(),
308
- access_type: effectiveAccessType
309
- };
310
- if (!(values.isEditing && skillId)) {
311
- _context2.next = 2;
256
+ if (!(!isValid || isSubmitting)) {
257
+ _context2.next = 1;
312
258
  break;
313
259
  }
314
- _context2.next = 1;
315
- return updateSkill(skillId, payload);
260
+ return _context2.abrupt("return");
316
261
  case 1:
317
- updated = _context2.sent;
318
- updateSkillInList === null || updateSkillInList === void 0 || updateSkillInList(updated);
319
- handleSnackbarSuccess(t('mySkills.updateSuccess'));
320
- return _context2.abrupt("return", updated);
321
- case 2:
322
- _context2.next = 3;
323
- return createSkill(payload);
324
- case 3:
325
- created = _context2.sent;
326
- addSkill === null || addSkill === void 0 || addSkill(created);
327
- handleSnackbarSuccess(t('mySkills.createSuccess'));
328
- return _context2.abrupt("return", created);
329
- case 4:
330
- case "end":
331
- return _context2.stop();
332
- }
333
- }, _callee2);
334
- }));
335
- return function persistSkill() {
336
- return _ref4.apply(this, arguments);
337
- };
338
- }();
339
- var handleSave = /*#__PURE__*/function () {
340
- var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
341
- var savedSkill, _t2;
342
- return _regeneratorRuntime.wrap(function (_context3) {
343
- while (1) switch (_context3.prev = _context3.next) {
344
- case 0:
345
- if (!(!isValid || isSubmitting || !hasChanges)) {
346
- _context3.next = 1;
262
+ if (!showUsageBlockedError()) {
263
+ _context2.next = 2;
347
264
  break;
348
265
  }
349
- return _context3.abrupt("return");
350
- case 1:
266
+ return _context2.abrupt("return");
267
+ case 2:
351
268
  setIsSubmitting(true);
352
- _context3.prev = 2;
353
- _context3.next = 3;
354
- return persistSkill();
355
- case 3:
356
- savedSkill = _context3.sent;
357
- if (savedSkill) {
358
- eventAmplitude(EVENTS.aiChatSkillAbmConfirm, {
359
- option: values.isEditing ? 'edit' : 'create',
360
- action: 'save',
361
- access_type: effectiveAccessType,
362
- skill_id: savedSkill.id
363
- });
269
+ _context2.prev = 3;
270
+ if (!(values.isEditing && skillId)) {
271
+ _context2.next = 5;
272
+ break;
364
273
  }
365
- handleClose();
366
- _context3.next = 5;
367
- break;
274
+ _context2.next = 4;
275
+ return updateSkill(skillId, {
276
+ name: name.trim(),
277
+ content: content.trim()
278
+ });
368
279
  case 4:
369
- _context3.prev = 4;
370
- _t2 = _context3["catch"](2);
371
- handleSnackbarError(values.isEditing ? t('mySkills.updateError') : t('mySkills.createError'));
280
+ updated = _context2.sent;
281
+ updateSkillInList === null || updateSkillInList === void 0 || updateSkillInList(updated);
282
+ handleSnackbarSuccess(t('mySkills.updateSuccess'));
283
+ _context2.next = 7;
284
+ break;
372
285
  case 5:
373
- _context3.prev = 5;
374
- setIsSubmitting(false);
375
- return _context3.finish(5);
286
+ _context2.next = 6;
287
+ return createSkill({
288
+ name: name.trim(),
289
+ content: content.trim()
290
+ });
376
291
  case 6:
377
- case "end":
378
- return _context3.stop();
379
- }
380
- }, _callee3, null, [[2, 4, 5, 6]]);
381
- }));
382
- return function handleSave() {
383
- return _ref5.apply(this, arguments);
384
- };
385
- }();
386
- var handleSaveAndUse = /*#__PURE__*/function () {
387
- var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
388
- var savedSkill, _t3;
389
- return _regeneratorRuntime.wrap(function (_context4) {
390
- while (1) switch (_context4.prev = _context4.next) {
391
- case 0:
392
- if (!(!isValid || isSubmitting)) {
393
- _context4.next = 1;
394
- break;
395
- }
396
- return _context4.abrupt("return");
397
- case 1:
398
- setIsSubmitting(true);
399
- _context4.prev = 2;
400
- _context4.next = 3;
401
- return persistSkill();
402
- case 3:
403
- savedSkill = _context4.sent;
404
- if (savedSkill) {
405
- eventAmplitude(EVENTS.aiChatSkillAbmConfirm, {
406
- option: values.isEditing ? 'edit' : 'create',
407
- action: 'save_and_use',
408
- access_type: effectiveAccessType,
409
- skill_id: savedSkill.id
410
- });
411
- document.dispatchEvent(new CustomEvent(SKILL_USE_AFTER_SAVE_EVENT, {
412
- detail: {
413
- skill: savedSkill
414
- }
415
- }));
416
- }
292
+ created = _context2.sent;
293
+ addSkill === null || addSkill === void 0 || addSkill(created);
294
+ handleSnackbarSuccess(t('mySkills.createSuccess'));
295
+ case 7:
417
296
  handleClose();
418
- _context4.next = 5;
297
+ _context2.next = 9;
419
298
  break;
420
- case 4:
421
- _context4.prev = 4;
422
- _t3 = _context4["catch"](2);
299
+ case 8:
300
+ _context2.prev = 8;
301
+ _t2 = _context2["catch"](3);
423
302
  handleSnackbarError(values.isEditing ? t('mySkills.updateError') : t('mySkills.createError'));
424
- case 5:
425
- _context4.prev = 5;
303
+ case 9:
304
+ _context2.prev = 9;
426
305
  setIsSubmitting(false);
427
- return _context4.finish(5);
428
- case 6:
306
+ return _context2.finish(9);
307
+ case 10:
429
308
  case "end":
430
- return _context4.stop();
309
+ return _context2.stop();
431
310
  }
432
- }, _callee4, null, [[2, 4, 5, 6]]);
311
+ }, _callee2, null, [[3, 8, 9, 10]]);
433
312
  }));
434
- return function handleSaveAndUse() {
435
- return _ref6.apply(this, arguments);
313
+ return function handleSave() {
314
+ return _ref4.apply(this, arguments);
436
315
  };
437
316
  }();
438
317
  var handleConfirmDelete = /*#__PURE__*/function () {
439
- var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5() {
440
- var _t4;
441
- return _regeneratorRuntime.wrap(function (_context5) {
442
- while (1) switch (_context5.prev = _context5.next) {
318
+ var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
319
+ var _t3;
320
+ return _regeneratorRuntime.wrap(function (_context3) {
321
+ while (1) switch (_context3.prev = _context3.next) {
443
322
  case 0:
444
323
  if (skillId) {
445
- _context5.next = 1;
324
+ _context3.next = 1;
446
325
  break;
447
326
  }
448
- return _context5.abrupt("return");
327
+ return _context3.abrupt("return");
449
328
  case 1:
450
- _context5.prev = 1;
451
- _context5.next = 2;
329
+ _context3.prev = 1;
330
+ _context3.next = 2;
452
331
  return deleteSkill(skillId);
453
332
  case 2:
454
- eventAmplitude(EVENTS.aiChatSkillAbmDelete, {
455
- skill_id: skillId,
456
- source: 'modal'
457
- });
458
333
  removeSkill === null || removeSkill === void 0 || removeSkill(skillId);
459
334
  handleSnackbarSuccess(t('mySkills.deleteSuccess'));
460
335
  handleClose();
461
- _context5.next = 4;
336
+ _context3.next = 4;
462
337
  break;
463
338
  case 3:
464
- _context5.prev = 3;
465
- _t4 = _context5["catch"](1);
339
+ _context3.prev = 3;
340
+ _t3 = _context3["catch"](1);
466
341
  handleSnackbarError(t('mySkills.deleteError'));
467
342
  case 4:
468
343
  case "end":
469
- return _context5.stop();
344
+ return _context3.stop();
470
345
  }
471
- }, _callee5, null, [[1, 3]]);
346
+ }, _callee3, null, [[1, 3]]);
472
347
  }));
473
348
  return function handleConfirmDelete() {
474
- return _ref7.apply(this, arguments);
349
+ return _ref5.apply(this, arguments);
475
350
  };
476
351
  }();
477
- var handleEditFromView = function handleEditFromView() {
478
- setValues(function (prev) {
479
- return _objectSpread(_objectSpread({}, prev), {}, {
480
- isReadOnly: false
481
- });
482
- });
483
- };
484
-
485
- /** Skill ajena en modo lectura: abre un chat nuevo con el primer agente y la mención ya puesta. */
486
- var handleUseSkill = function handleUseSkill() {
487
- if (!skillId) return;
488
- eventAmplitude(EVENTS.aiChatSkillUse, {
489
- skill_id: skillId,
490
- access_type: accessType,
491
- source: 'view_modal',
492
- is_shared: isSharedSkill
493
- });
494
- document.dispatchEvent(new CustomEvent(SKILL_USE_AFTER_SAVE_EVENT, {
495
- detail: {
496
- skill: {
497
- id: skillId,
498
- name: name,
499
- description: description,
500
- content: content,
501
- access_type: accessType
502
- },
503
- useFirstAgent: true
504
- }
505
- }));
506
- handleClose();
507
- };
508
352
  if (!isOpen) return null;
353
+ if (!canCreate && !canEdit && !canDelete) return null;
509
354
  var container = document.getElementById('modal-root-actions');
510
355
  if (!container) return null;
511
- var editOrCreateTitle = values.isEditing ? t('mySkills.editTitle') : t('mySkills.createTitle');
512
- var viewTitle = isSharedSkill ? t('mySkills.viewTitle') : t('mySkills.viewOwnTitle');
513
- var modalTitle = isReadOnly ? viewTitle : editOrCreateTitle;
514
- var previewBody = /*#__PURE__*/_jsxs(SCASMPreviewBody, {
515
- children: [/*#__PURE__*/_jsxs(SCASMPreviewHeadingBlock, {
516
- children: [/*#__PURE__*/_jsx(SCASMPreviewName, {
517
- children: name
518
- }), description ? /*#__PURE__*/_jsx(SCASMPreviewDescription, {
519
- children: description
520
- }) : null]
521
- }), /*#__PURE__*/_jsxs(SCASMPreviewMetadataRow, {
522
- children: [createdByLabel ? /*#__PURE__*/_jsxs(SCASMMetadataItem, {
523
- children: [/*#__PURE__*/_jsx(SCASMPreviewMetadataLabel, {
524
- children: t('mySkills.createdBy')
525
- }), /*#__PURE__*/_jsx(SCASMPreviewMetadataValue, {
526
- children: createdByLabel
527
- })]
528
- }) : null, lastUpdatedLabel ? /*#__PURE__*/_jsxs(SCASMMetadataItem, {
529
- children: [/*#__PURE__*/_jsx(SCASMPreviewMetadataLabel, {
530
- children: t('mySkills.lastUpdated')
531
- }), /*#__PURE__*/_jsx(SCASMPreviewMetadataValue, {
532
- children: lastUpdatedLabel
533
- })]
534
- }) : null, !isSharedSkill ? /*#__PURE__*/_jsxs(SCASMMetadataItem, {
535
- children: [/*#__PURE__*/_jsx(SCASMPreviewMetadataLabel, {
536
- children: t('mySkills.enabledLabel')
537
- }), /*#__PURE__*/_jsx(SCASMPreviewMetadataValue, {
538
- children: accessType === 'company' ? t('mySkills.visibilityEveryone') : t('mySkills.visibilityOnlyMe')
539
- })]
540
- }) : null]
541
- }), /*#__PURE__*/_jsxs(SCASMPreviewContentPanel, {
542
- children: [/*#__PURE__*/_jsx(SCASMInstructionsTitle, {
543
- children: t('mySkills.instructionsLabel')
544
- }), /*#__PURE__*/_jsx(SCASMPreviewContentBox, {
545
- children: content
546
- })]
547
- })]
548
- });
549
356
  return /*#__PURE__*/createPortal(/*#__PURE__*/_jsxs(Backdrop, {
550
357
  zIndex: 1112,
551
358
  onClick: handleBackdropClick,
@@ -555,10 +362,10 @@ export var AbmSkillModal = function AbmSkillModal(_ref) {
555
362
  },
556
363
  children: [/*#__PURE__*/_jsxs(SCASMHeader, {
557
364
  children: [/*#__PURE__*/_jsx(SCASMHeaderTitle, {
558
- children: modalTitle
365
+ children: values.isEditing ? t('mySkills.editTitle') : t('mySkills.createTitle')
559
366
  }), /*#__PURE__*/_jsx(SCASMCloseButton, {
560
367
  type: "button",
561
- onClick: handleCancel,
368
+ onClick: handleClose,
562
369
  "aria-label": t('mySkills.close'),
563
370
  children: /*#__PURE__*/_jsx(Cross, {
564
371
  color: "#a6a6a6",
@@ -566,13 +373,12 @@ export var AbmSkillModal = function AbmSkillModal(_ref) {
566
373
  height: 18
567
374
  })
568
375
  })]
569
- }), isReadOnly ? previewBody : /*#__PURE__*/_jsxs(SCASMBody, {
570
- children: [/*#__PURE__*/_jsxs(SCASMFieldBox, {
571
- $height: 50,
572
- children: [/*#__PURE__*/_jsx(SCASMFieldLabel, {
376
+ }), /*#__PURE__*/_jsxs(SCASMContent, {
377
+ children: [/*#__PURE__*/_jsxs(SCASMField, {
378
+ children: [/*#__PURE__*/_jsx(SCASMLabel, {
573
379
  htmlFor: "skill-name-input",
574
380
  children: t('mySkills.nameLabel')
575
- }), /*#__PURE__*/_jsx(SCASMFieldInput, {
381
+ }), /*#__PURE__*/_jsx(SCASMInput, {
576
382
  id: "skill-name-input",
577
383
  type: "text",
578
384
  maxLength: 150,
@@ -583,60 +389,55 @@ export var AbmSkillModal = function AbmSkillModal(_ref) {
583
389
  return handleChangeField('name', event.target.value);
584
390
  }
585
391
  })]
586
- }), /*#__PURE__*/_jsxs(SCASMFieldBox, {
587
- $height: 120,
588
- $clipOverflow: true,
589
- children: [/*#__PURE__*/_jsx(SCASMFieldLabel, {
590
- htmlFor: "skill-description-input",
591
- children: t('mySkills.descriptionLabel')
592
- }), /*#__PURE__*/_jsx(SCASMFieldTextarea, {
593
- id: "skill-description-input",
594
- maxLength: 500,
595
- placeholder: t('mySkills.descriptionPlaceholder'),
596
- value: description,
392
+ }), /*#__PURE__*/_jsxs(SCASMField, {
393
+ children: [/*#__PURE__*/_jsxs(SCASMFieldHeader, {
394
+ children: [/*#__PURE__*/_jsx(SCASMLabel, {
395
+ htmlFor: "skill-content-input",
396
+ children: t('mySkills.contentLabel')
397
+ }), /*#__PURE__*/_jsxs(SCASMHeaderActions, {
398
+ children: [/*#__PURE__*/_jsx(SCASMUploadButton, {
399
+ type: "button",
400
+ onClick: handleUploadClick,
401
+ disabled: isSubmitting,
402
+ children: t('mySkills.uploadMd')
403
+ }), /*#__PURE__*/_jsx(SCASMHiddenFileInput, {
404
+ ref: fileInputRef,
405
+ type: "file",
406
+ accept: ".md,.markdown,text/markdown",
407
+ onChange: handleFileChange
408
+ }), /*#__PURE__*/_jsxs(SCASMToggleGroup, {
409
+ children: [/*#__PURE__*/_jsx(SCASMToggleButton, {
410
+ type: "button",
411
+ $active: !showPreview,
412
+ onClick: function onClick() {
413
+ return setShowPreview(false);
414
+ },
415
+ children: t('mySkills.edit')
416
+ }), /*#__PURE__*/_jsx(SCASMToggleButton, {
417
+ type: "button",
418
+ $active: showPreview,
419
+ onClick: function onClick() {
420
+ return setShowPreview(true);
421
+ },
422
+ children: t('mySkills.preview')
423
+ })]
424
+ })]
425
+ })]
426
+ }), showPreview ? /*#__PURE__*/_jsx(SCASMPreview, {
427
+ children: content.trim() ? /*#__PURE__*/_jsx(MaiaStreamdown, {
428
+ variant: "preview",
429
+ children: content
430
+ }) : /*#__PURE__*/_jsx(SCASMPreviewEmpty, {
431
+ children: t('mySkills.previewEmpty')
432
+ })
433
+ }) : /*#__PURE__*/_jsx(SCASMTextarea, {
434
+ id: "skill-content-input",
435
+ placeholder: t('mySkills.contentPlaceholder'),
436
+ value: content,
597
437
  disabled: isSubmitting,
598
438
  onChange: function onChange(event) {
599
- return handleChangeField('description', event.target.value);
439
+ return handleChangeField('content', event.target.value);
600
440
  }
601
- })]
602
- }), canShareWithCompany ? /*#__PURE__*/_jsxs(SCASMSwitchRow, {
603
- children: [/*#__PURE__*/_jsx(Switch, {
604
- checked: accessType === 'company',
605
- onChange: handleAccessTypeChange,
606
- disabled: isSubmitting,
607
- "aria-label": t('mySkills.shareWithCompany')
608
- }), /*#__PURE__*/_jsx(SCASMSwitchLabel, {
609
- children: t('mySkills.shareWithCompany')
610
- })]
611
- }) : null, /*#__PURE__*/_jsxs(SCASMInstructionsPanel, {
612
- children: [/*#__PURE__*/_jsxs(SCASMInstructionsHeader, {
613
- children: [/*#__PURE__*/_jsx(SCASMInstructionsTitle, {
614
- children: t('mySkills.instructionsLabel')
615
- }), /*#__PURE__*/_jsxs(SCASMUploadButton, {
616
- type: "button",
617
- onClick: handleUploadClick,
618
- disabled: isSubmitting,
619
- children: [/*#__PURE__*/_jsx(FileUpload, {
620
- width: 18,
621
- height: 18,
622
- color: "#08C"
623
- }), t('mySkills.uploadMd')]
624
- }), /*#__PURE__*/_jsx(SCASMHiddenFileInput, {
625
- ref: fileInputRef,
626
- type: "file",
627
- accept: ".md,.markdown,text/markdown",
628
- onChange: handleFileChange
629
- })]
630
- }), /*#__PURE__*/_jsx(SCASMInstructionsField, {
631
- children: /*#__PURE__*/_jsx(SCASMInstructionsTextarea, {
632
- id: "skill-content-input",
633
- placeholder: t('mySkills.contentPlaceholder'),
634
- value: content,
635
- disabled: isSubmitting,
636
- onChange: function onChange(event) {
637
- return handleChangeField('content', event.target.value);
638
- }
639
- })
640
441
  }), /*#__PURE__*/_jsx(SCASMByteCounter, {
641
442
  $overLimit: isOverLimit,
642
443
  "aria-live": "polite",
@@ -647,50 +448,28 @@ export var AbmSkillModal = function AbmSkillModal(_ref) {
647
448
  })]
648
449
  })]
649
450
  }), /*#__PURE__*/_jsxs(SCASMFooter, {
650
- children: [isReadOnly && isSharedSkill ? /*#__PURE__*/_jsx(SCASMUseSkillButton, {
651
- type: "button",
652
- onClick: handleUseSkill,
653
- children: t('mySkills.useSkill')
654
- }) : null, isReadOnly && !isSharedSkill ? /*#__PURE__*/_jsxs(_Fragment, {
655
- children: [/*#__PURE__*/_jsx(SCASMDeleteSlot, {
656
- children: /*#__PURE__*/_jsx(SCASMCancelButton, {
657
- type: "button",
658
- onClick: function onClick() {
659
- return setShowDelete(true);
660
- },
661
- children: t('mySkills.delete')
662
- })
663
- }), /*#__PURE__*/_jsx(SCASMSavePrimaryButton, {
451
+ children: [values.isEditing && canDelete ? /*#__PURE__*/_jsx(SCASMDeleteSlot, {
452
+ children: /*#__PURE__*/_jsx(SCASMCancelButton, {
664
453
  type: "button",
665
- onClick: handleEditFromView,
666
- children: t('mySkills.edit')
667
- })]
668
- }) : null, !isReadOnly ? /*#__PURE__*/_jsxs(_Fragment, {
669
- children: [values.isEditing ? /*#__PURE__*/_jsx(SCASMDeleteSlot, {
670
- children: /*#__PURE__*/_jsx(SCASMCancelButton, {
671
- type: "button",
672
- onClick: function onClick() {
673
- return setShowDelete(true);
674
- },
675
- disabled: isSubmitting,
676
- children: t('mySkills.delete')
677
- })
678
- }) : null, /*#__PURE__*/_jsx(SCASMSaveOutlinedButton, {
679
- type: "button",
680
- onClick: handleSaveAndUse,
681
- disabled: !isValid || isSubmitting,
682
- children: isSubmitting ? /*#__PURE__*/_jsx(Loader, {
683
- size: "small"
684
- }) : t('mySkills.saveAndUse')
685
- }), /*#__PURE__*/_jsx(SCASMSavePrimaryButton, {
686
- type: "button",
687
- onClick: handleSave,
688
- disabled: !isValid || isSubmitting || !hasChanges,
689
- children: isSubmitting ? /*#__PURE__*/_jsx(Loader, {
690
- size: "small"
691
- }) : t('mySkills.save')
692
- })]
693
- }) : null]
454
+ onClick: function onClick() {
455
+ return setShowDelete(true);
456
+ },
457
+ disabled: isSubmitting,
458
+ children: t('mySkills.delete')
459
+ })
460
+ }) : null, /*#__PURE__*/_jsx(SCASMCancelButton, {
461
+ type: "button",
462
+ onClick: handleClose,
463
+ disabled: isSubmitting,
464
+ children: t('mySkills.cancel')
465
+ }), /*#__PURE__*/_jsx(SCASMSaveButton, {
466
+ type: "button",
467
+ onClick: handleSave,
468
+ disabled: !isValid || isSubmitting || !hasChanges,
469
+ children: isSubmitting ? /*#__PURE__*/_jsx(Loader, {
470
+ size: "small"
471
+ }) : t('mySkills.save')
472
+ })]
694
473
  })]
695
474
  }), showDelete && skillId ? /*#__PURE__*/_jsx(DeleteQuestionModal, {
696
475
  onClose: function onClose() {
@@ -707,4 +486,4 @@ export var AbmSkillModal = function AbmSkillModal(_ref) {
707
486
  }) : null]
708
487
  }), container);
709
488
  };
710
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsImNyZWF0ZVBvcnRhbCIsIkNyb3NzIiwiRmlsZVVwbG9hZCIsInVzZVRyYW5zbGF0aW9uIiwiQmFja2Ryb3AiLCJMb2FkZXIiLCJTd2l0Y2giLCJTRUNUSU9OUyIsInVzZVVzZXIiLCJpc0NvbGxhYm9yYXRvclJvbGUiLCJFVkVOVFMiLCJ1c2VFdmVudCIsInVzZVNuYWNrQmFyTWFuYWdlciIsImZvcm1hdERhdGUiLCJjcmVhdGVTa2lsbCIsInVwZGF0ZVNraWxsIiwiZGVsZXRlU2tpbGwiLCJnZXRVbml0RmlsZVNpemUiLCJnZXRTa2lsbENvbnRlbnRCeXRlTGVuZ3RoIiwiaXNTa2lsbENvbnRlbnRPdmVyTGltaXQiLCJTS0lMTF9DT05URU5UX01BWF9CWVRFUyIsIkRlbGV0ZVF1ZXN0aW9uTW9kYWwiLCJTQ0FTTUJ5dGVDb3VudGVyIiwiU0NBU01DYW5jZWxCdXR0b24iLCJTQ0FTTUNsb3NlQnV0dG9uIiwiU0NBU01Cb2R5IiwiU0NBU01EZWxldGVTbG90IiwiU0NBU01GaWVsZEJveCIsIlNDQVNNRmllbGRJbnB1dCIsIlNDQVNNRmllbGRMYWJlbCIsIlNDQVNNRmllbGRUZXh0YXJlYSIsIlNDQVNNRm9vdGVyIiwiU0NBU01IZWFkZXIiLCJTQ0FTTUhlYWRlclRpdGxlIiwiU0NBU01IaWRkZW5GaWxlSW5wdXQiLCJTQ0FTTUluc3RydWN0aW9uc0ZpZWxkIiwiU0NBU01JbnN0cnVjdGlvbnNIZWFkZXIiLCJTQ0FTTUluc3RydWN0aW9uc1BhbmVsIiwiU0NBU01JbnN0cnVjdGlvbnNUZXh0YXJlYSIsIlNDQVNNSW5zdHJ1Y3Rpb25zVGl0bGUiLCJTQ0FTTU1ldGFkYXRhSXRlbSIsIlNDQVNNUHJldmlld0JvZHkiLCJTQ0FTTVByZXZpZXdDb250ZW50Qm94IiwiU0NBU01QcmV2aWV3Q29udGVudFBhbmVsIiwiU0NBU01QcmV2aWV3RGVzY3JpcHRpb24iLCJTQ0FTTVByZXZpZXdIZWFkaW5nQmxvY2siLCJTQ0FTTVByZXZpZXdNZXRhZGF0YUxhYmVsIiwiU0NBU01QcmV2aWV3TWV0YWRhdGFSb3ciLCJTQ0FTTVByZXZpZXdNZXRhZGF0YVZhbHVlIiwiU0NBU01QcmV2aWV3TmFtZSIsIlNDQVNNU2F2ZU91dGxpbmVkQnV0dG9uIiwiU0NBU01TYXZlUHJpbWFyeUJ1dHRvbiIsIlNDQVNNU3dpdGNoTGFiZWwiLCJTQ0FTTVN3aXRjaFJvdyIsIlNDQVNNVXBsb2FkQnV0dG9uIiwiU0NBU01Vc2VTa2lsbEJ1dHRvbiIsIlNDQVNNV3JhcHBlciIsImpzeCIsIl9qc3giLCJqc3hzIiwiX2pzeHMiLCJGcmFnbWVudCIsIl9GcmFnbWVudCIsIlNLSUxMX1VTRV9BRlRFUl9TQVZFX0VWRU5UIiwicmVzb2x2ZVNraWxsQWJtT3B0aW9uIiwic2tpbGxWYWx1ZXMiLCJpc1JlYWRPbmx5IiwiaXNFZGl0aW5nIiwiaW5pdGlhbFZhbHVlcyIsImdlbmVyYWwiLCJpZCIsInVuZGVmaW5lZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsImNvbnRlbnQiLCJhY2Nlc3NfdHlwZSIsImVtcHR5QmFzZWxpbmUiLCJwYXJzZURlc2NyaXB0aW9uRnJvbUNvbnRlbnQiLCJmcm9udG1hdHRlck1hdGNoIiwibWF0Y2giLCJkZXNjcmlwdGlvbk1hdGNoIiwidHJpbSIsIkFibVNraWxsTW9kYWwiLCJfcmVmIiwiX3ZhbHVlcyRnZW5lcmFsIiwiX3ZhbHVlcyRnZW5lcmFsMiIsIl92YWx1ZXMkZ2VuZXJhbDMiLCJfdmFsdWVzJGdlbmVyYWw0IiwiX3ZhbHVlcyRnZW5lcmFsNSIsIl92YWx1ZXMkZ2VuZXJhbDciLCJfdmFsdWVzJGdlbmVyYWwwIiwiX3ZhbHVlcyRnZW5lcmFsMSIsImFkZFNraWxsIiwidXBkYXRlU2tpbGxJbkxpc3QiLCJyZW1vdmVTa2lsbCIsIl91c2VUcmFuc2xhdGlvbiIsImNoYXRBSSIsInQiLCJ1c2VyIiwiZXZlbnRBbXBsaXR1ZGUiLCJfdXNlU25hY2tCYXJNYW5hZ2VyIiwiaGFuZGxlU25hY2tiYXJTdWNjZXNzIiwiaGFuZGxlU25hY2tiYXJFcnJvciIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsImlzT3BlbiIsInNldElzT3BlbiIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwiaXNTdWJtaXR0aW5nIiwic2V0SXNTdWJtaXR0aW5nIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJzaG93RGVsZXRlIiwic2V0U2hvd0RlbGV0ZSIsIl91c2VTdGF0ZTciLCJfdXNlU3RhdGU4IiwicGVuZGluZ1VwbG9hZCIsInNldFBlbmRpbmdVcGxvYWQiLCJfdXNlU3RhdGU5IiwiX3VzZVN0YXRlMCIsInZhbHVlcyIsInNldFZhbHVlcyIsImZpbGVJbnB1dFJlZiIsImluaXRpYWxSZWYiLCJpc1NoYXJlZFNraWxsIiwiaXNTaGFyZWQiLCJjYW5TaGFyZVdpdGhDb21wYW55Iiwicm9sZV9pZCIsImFjY2Vzc1R5cGUiLCJlZmZlY3RpdmVBY2Nlc3NUeXBlIiwic2tpbGxJZCIsImNvbnRlbnRCeXRlcyIsImlzT3ZlckxpbWl0IiwiaXNWYWxpZCIsImhhc0NoYW5nZXMiLCJjdXJyZW50IiwiY3JlYXRlZEJ5TGFiZWwiLCJfdmFsdWVzJGdlbmVyYWw2IiwiY3JlYXRlZEJ5IiwiY3JlYXRlZF9ieV9uYW1lIiwiY29uY2F0IiwiZmlyc3ROYW1lIiwibGFzdE5hbWUiLCJsYXN0VXBkYXRlZExhYmVsIiwiX3ZhbHVlcyRnZW5lcmFsOCIsIl92YWx1ZXMkZ2VuZXJhbDkiLCJ1cGRhdGVkQXQiLCJ1cGRhdGVkX2F0IiwiY3JlYXRlZF9hdCIsInBhcnNlZCIsIkRhdGUiLCJOdW1iZXIiLCJpc05hTiIsImdldFRpbWUiLCJoYW5kbGVDbG9zZSIsImhhbmRsZUNhbmNlbCIsImFpQ2hhdFNraWxsQWJtQ2FuY2VsIiwib3B0aW9uIiwiaGFuZGxlQmFja2Ryb3BDbGljayIsImV2ZW50IiwidGFyZ2V0IiwiY3VycmVudFRhcmdldCIsImhhbmRsZVNldFNraWxsVmFsdWVzIiwiX3NraWxsVmFsdWVzJHZhbHVlcyIsIl9za2lsbFZhbHVlcyR2YWx1ZXMyIiwiX3NraWxsVmFsdWVzJHZhbHVlczMiLCJfcmVmMiIsImRldGFpbCIsImFuYWx5dGljc1NvdXJjZSIsImluY29taW5nR2VuZXJhbCIsIl9vYmplY3RTcHJlYWQiLCJpbmNvbWluZ05hbWUiLCJpbmNvbWluZ0Rlc2NyaXB0aW9uIiwiaW5jb21pbmdDb250ZW50IiwiaW5jb21pbmdBY2Nlc3NUeXBlIiwicGFyc2VkRGVzY3JpcHRpb24iLCJlZGl0aW5nQmFzZWxpbmUiLCJpbnRlbnQiLCJpbmNvbWluZ1ZhbHVlcyIsInNvdXJjZSIsImFpQ2hhdFNraWxsQWJtQWNjZXNzIiwiZG9jdW1lbnQiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIl9maWxlSW5wdXRSZWYkY3VycmVudCIsImNsaWNrIiwiaGFuZGxlQ2hhbmdlRmllbGQiLCJmaWVsZCIsInZhbHVlIiwibGVuZ3RoIiwicHJldiIsIl9kZWZpbmVQcm9wZXJ0eSIsImhhbmRsZUFjY2Vzc1R5cGVDaGFuZ2UiLCJjaGVja2VkIiwiaGFuZGxlVXBsb2FkQ2xpY2siLCJfZmlsZUlucHV0UmVmJGN1cnJlbnQyIiwiaGFuZGxlRmlsZUNoYW5nZSIsIl9yZWYzIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJfZXZlbnQkdGFyZ2V0JGZpbGVzIiwiZmlsZSIsImlzTWFya2Rvd24iLCJ0ZXh0IiwiYmFzZU5hbWUiLCJfdCIsIndyYXAiLCJfY29udGV4dCIsIm5leHQiLCJmaWxlcyIsImFicnVwdCIsInRlc3QiLCJhaUNoYXRTa2lsbFVwbG9hZCIsInJlc3VsdCIsInNpemUiLCJzZW50IiwicmVwbGFjZSIsIl9wcmV2JGdlbmVyYWwiLCJfcHJldiRnZW5lcmFsMiIsIl9wcmV2JGdlbmVyYWwzIiwic3RvcCIsIl94IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJwZXJzaXN0U2tpbGwiLCJfcmVmNCIsIl9jYWxsZWUyIiwicGF5bG9hZCIsInVwZGF0ZWQiLCJjcmVhdGVkIiwiX2NvbnRleHQyIiwiaGFuZGxlU2F2ZSIsIl9yZWY1IiwiX2NhbGxlZTMiLCJzYXZlZFNraWxsIiwiX3QyIiwiX2NvbnRleHQzIiwiYWlDaGF0U2tpbGxBYm1Db25maXJtIiwiYWN0aW9uIiwic2tpbGxfaWQiLCJmaW5pc2giLCJoYW5kbGVTYXZlQW5kVXNlIiwiX3JlZjYiLCJfY2FsbGVlNCIsIl90MyIsIl9jb250ZXh0NCIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsInNraWxsIiwiaGFuZGxlQ29uZmlybURlbGV0ZSIsIl9yZWY3IiwiX2NhbGxlZTUiLCJfdDQiLCJfY29udGV4dDUiLCJhaUNoYXRTa2lsbEFibURlbGV0ZSIsImhhbmRsZUVkaXRGcm9tVmlldyIsImhhbmRsZVVzZVNraWxsIiwiYWlDaGF0U2tpbGxVc2UiLCJpc19zaGFyZWQiLCJ1c2VGaXJzdEFnZW50IiwiY29udGFpbmVyIiwiZ2V0RWxlbWVudEJ5SWQiLCJlZGl0T3JDcmVhdGVUaXRsZSIsInZpZXdUaXRsZSIsIm1vZGFsVGl0bGUiLCJwcmV2aWV3Qm9keSIsImNoaWxkcmVuIiwiekluZGV4Iiwib25DbGljayIsInN0b3BQcm9wYWdhdGlvbiIsInR5cGUiLCJjb2xvciIsIndpZHRoIiwiaGVpZ2h0IiwiJGhlaWdodCIsImh0bWxGb3IiLCJtYXhMZW5ndGgiLCJwbGFjZWhvbGRlciIsImRpc2FibGVkIiwib25DaGFuZ2UiLCIkY2xpcE92ZXJmbG93IiwicmVmIiwiYWNjZXB0IiwiJG92ZXJMaW1pdCIsInVzZWQiLCJtYXgiLCJvbkNsb3NlIiwiaGFuZGxlcnMiLCJoYW5kbGVDb25maXJtQWN0aW9uIiwiY2hhdCIsInRpdGxlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvb3JnYW5pc21zL0FibVNraWxsTW9kYWwvQWJtU2tpbGxNb2RhbC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQ2hhbmdlRXZlbnQsIE1vdXNlRXZlbnQsIHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGNyZWF0ZVBvcnRhbCB9IGZyb20gJ3JlYWN0LWRvbSdcbmltcG9ydCB7IENyb3NzIH0gZnJvbSAnQHByb2plY3Rjb3IvaWNvbnMvbGliL2NvbXBvbmVudHMvQ3Jvc3MnXG5pbXBvcnQgeyBGaWxlVXBsb2FkIH0gZnJvbSAnQHByb2plY3Rjb3IvaWNvbnMvbGliL2NvbXBvbmVudHMvRmlsZVVwbG9hZCdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCdcbmltcG9ydCB7IEJhY2tkcm9wIH0gZnJvbSAnLi4vLi4vYXRvbXMvQmFja2Ryb3AnXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tICcuLi8uLi9hdG9tcy9Mb2FkZXInXG5pbXBvcnQgeyBTd2l0Y2ggfSBmcm9tICcuLi8uLi9hdG9tcy9Td2l0Y2gnXG5pbXBvcnQgeyBTRUNUSU9OUyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9jb25maWcnXG5pbXBvcnQgeyB1c2VVc2VyLCBpc0NvbGxhYm9yYXRvclJvbGUgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2Nvci11c2VyJ1xuaW1wb3J0IHsgRVZFTlRTLCB1c2VFdmVudCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUV2ZW50J1xuaW1wb3J0IHsgdXNlU25hY2tCYXJNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlU25hY2tCYXJNYW5hZ2VyL3VzZVNuYWNrQmFyTWFuYWdlcidcbmltcG9ydCB7IGZvcm1hdERhdGUgfSBmcm9tICcuLi8uLi8uLi9sYW5nL3V0aWxzJ1xuaW1wb3J0IHsgY3JlYXRlU2tpbGwgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tYWlhL1NraWxscy9jcmVhdGVTa2lsbCdcbmltcG9ydCB7IHVwZGF0ZVNraWxsIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbWFpYS9Ta2lsbHMvdXBkYXRlU2tpbGwnXG5pbXBvcnQgeyBkZWxldGVTa2lsbCB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL21haWEvU2tpbGxzL2RlbGV0ZVNraWxsJ1xuaW1wb3J0IHsgU2tpbGwsIFNraWxsQWNjZXNzVHlwZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL3NraWxsJ1xuaW1wb3J0IHsgZ2V0VW5pdEZpbGVTaXplIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZ2V0VW5pdEZpbGVTaXplJ1xuaW1wb3J0IHtcbiAgZ2V0U2tpbGxDb250ZW50Qnl0ZUxlbmd0aCxcbiAgaXNTa2lsbENvbnRlbnRPdmVyTGltaXQsXG4gIFNLSUxMX0NPTlRFTlRfTUFYX0JZVEVTLFxufSBmcm9tICcuLi8uLi8uLi91dGlscy9za2lsbENvbnRlbnRTaXplJ1xuaW1wb3J0IHsgRGVsZXRlUXVlc3Rpb25Nb2RhbCB9IGZyb20gJy4uL0RlbGV0ZVF1ZXN0aW9uTW9kYWwvRGVsZXRlUXVlc3Rpb25Nb2RhbCdcbmltcG9ydCB7XG4gIFNDQVNNQnl0ZUNvdW50ZXIsXG4gIFNDQVNNQ2FuY2VsQnV0dG9uLFxuICBTQ0FTTUNsb3NlQnV0dG9uLFxuICBTQ0FTTUJvZHksXG4gIFNDQVNNRGVsZXRlU2xvdCxcbiAgU0NBU01GaWVsZEJveCxcbiAgU0NBU01GaWVsZElucHV0LFxuICBTQ0FTTUZpZWxkTGFiZWwsXG4gIFNDQVNNRmllbGRUZXh0YXJlYSxcbiAgU0NBU01Gb290ZXIsXG4gIFNDQVNNSGVhZGVyLFxuICBTQ0FTTUhlYWRlclRpdGxlLFxuICBTQ0FTTUhpZGRlbkZpbGVJbnB1dCxcbiAgU0NBU01JbnN0cnVjdGlvbnNGaWVsZCxcbiAgU0NBU01JbnN0cnVjdGlvbnNIZWFkZXIsXG4gIFNDQVNNSW5zdHJ1Y3Rpb25zUGFuZWwsXG4gIFNDQVNNSW5zdHJ1Y3Rpb25zVGV4dGFyZWEsXG4gIFNDQVNNSW5zdHJ1Y3Rpb25zVGl0bGUsXG4gIFNDQVNNTWV0YWRhdGFJdGVtLFxuICBTQ0FTTVByZXZpZXdCb2R5LFxuICBTQ0FTTVByZXZpZXdDb250ZW50Qm94LFxuICBTQ0FTTVByZXZpZXdDb250ZW50UGFuZWwsXG4gIFNDQVNNUHJldmlld0Rlc2NyaXB0aW9uLFxuICBTQ0FTTVByZXZpZXdIZWFkaW5nQmxvY2ssXG4gIFNDQVNNUHJldmlld01ldGFkYXRhTGFiZWwsXG4gIFNDQVNNUHJldmlld01ldGFkYXRhUm93LFxuICBTQ0FTTVByZXZpZXdNZXRhZGF0YVZhbHVlLFxuICBTQ0FTTVByZXZpZXdOYW1lLFxuICBTQ0FTTVNhdmVPdXRsaW5lZEJ1dHRvbixcbiAgU0NBU01TYXZlUHJpbWFyeUJ1dHRvbixcbiAgU0NBU01Td2l0Y2hMYWJlbCxcbiAgU0NBU01Td2l0Y2hSb3csXG4gIFNDQVNNVXBsb2FkQnV0dG9uLFxuICBTQ0FTTVVzZVNraWxsQnV0dG9uLFxuICBTQ0FTTVdyYXBwZXIsXG59IGZyb20gJy4vQWJtU2tpbGxNb2RhbC5zdHlsZXMnXG5cbmV4cG9ydCBjb25zdCBTS0lMTF9VU0VfQUZURVJfU0FWRV9FVkVOVCA9ICdtYWlhLXVzZS1za2lsbC1hZnRlci1zYXZlJ1xuXG50eXBlIFNraWxsTW9kYWxHZW5lcmFsID0ge1xuICBpZD86IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gIGNvbnRlbnQ/OiBzdHJpbmdcbiAgYWNjZXNzX3R5cGU/OiBTa2lsbEFjY2Vzc1R5cGVcbiAgY3JlYXRlZF9ieV9uYW1lPzogc3RyaW5nXG4gIGNyZWF0ZWRfYXQ/OiBzdHJpbmdcbiAgdXBkYXRlZF9hdD86IHN0cmluZ1xufVxuXG50eXBlIFNraWxsTW9kYWxWYWx1ZXMgPSB7XG4gIGlzRWRpdGluZzogYm9vbGVhblxuICBpc1JlYWRPbmx5PzogYm9vbGVhblxuICBpc1NoYXJlZD86IGJvb2xlYW5cbiAgaW50ZW50PzogJ2dlbmVyYXRlJyB8ICd3cml0ZScgfCAndXBsb2FkJ1xuICBnZW5lcmFsPzogU2tpbGxNb2RhbEdlbmVyYWxcbn1cblxudHlwZSBTa2lsbEFibU9wdGlvbiA9ICdjcmVhdGUnIHwgJ2VkaXQnIHwgJ3ZpZXcnXG50eXBlIFNraWxsQWJtQWNjZXNzU291cmNlID0gJ2NhdGFsb2cnIHwgJ2Ryb3Bkb3duJyB8ICdlbXB0eSdcblxuY29uc3QgcmVzb2x2ZVNraWxsQWJtT3B0aW9uID0gKHNraWxsVmFsdWVzOiBTa2lsbE1vZGFsVmFsdWVzKTogU2tpbGxBYm1PcHRpb24gPT4ge1xuICBpZiAoc2tpbGxWYWx1ZXMuaXNSZWFkT25seSkgcmV0dXJuICd2aWV3J1xuICBpZiAoc2tpbGxWYWx1ZXMuaXNFZGl0aW5nKSByZXR1cm4gJ2VkaXQnXG4gIHJldHVybiAnY3JlYXRlJ1xufVxuXG50eXBlIEFibVNraWxsTW9kYWxQcm9wcyA9IHtcbiAgYWRkU2tpbGw/OiAoc2tpbGw6IFNraWxsKSA9PiB2b2lkXG4gIHVwZGF0ZVNraWxsSW5MaXN0PzogKHNraWxsOiBTa2lsbCkgPT4gdm9pZFxuICByZW1vdmVTa2lsbD86IChza2lsbElkOiBzdHJpbmcpID0+IHZvaWRcbn1cblxuY29uc3QgaW5pdGlhbFZhbHVlczogU2tpbGxNb2RhbFZhbHVlcyA9IHtcbiAgaXNFZGl0aW5nOiBmYWxzZSxcbiAgZ2VuZXJhbDoge1xuICAgIGlkOiB1bmRlZmluZWQsXG4gICAgbmFtZTogJycsXG4gICAgZGVzY3JpcHRpb246ICcnLFxuICAgIGNvbnRlbnQ6ICcnLFxuICAgIGFjY2Vzc190eXBlOiAnb25seV9tZScsXG4gIH0sXG59XG5cbnR5cGUgU2tpbGxGb3JtQmFzZWxpbmUgPSB7XG4gIG5hbWU6IHN0cmluZ1xuICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gIGNvbnRlbnQ6IHN0cmluZ1xuICBhY2Nlc3NfdHlwZTogU2tpbGxBY2Nlc3NUeXBlXG59XG5cbmNvbnN0IGVtcHR5QmFzZWxpbmU6IFNraWxsRm9ybUJhc2VsaW5lID0ge1xuICBuYW1lOiAnJyxcbiAgZGVzY3JpcHRpb246ICcnLFxuICBjb250ZW50OiAnJyxcbiAgYWNjZXNzX3R5cGU6ICdvbmx5X21lJyxcbn1cblxuY29uc3QgcGFyc2VEZXNjcmlwdGlvbkZyb21Db250ZW50ID0gKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGZyb250bWF0dGVyTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eLS0tXFxzKlxcbihbXFxzXFxTXSo/KVxcbi0tLS8pXG4gIGlmICghZnJvbnRtYXR0ZXJNYXRjaCkgcmV0dXJuICcnXG4gIGNvbnN0IGRlc2NyaXB0aW9uTWF0Y2ggPSBmcm9udG1hdHRlck1hdGNoWzFdLm1hdGNoKC9eZGVzY3JpcHRpb246XFxzKiguKykkL20pXG4gIHJldHVybiBkZXNjcmlwdGlvbk1hdGNoID8gZGVzY3JpcHRpb25NYXRjaFsxXS50cmltKCkgOiAnJ1xufVxuXG5leHBvcnQgY29uc3QgQWJtU2tpbGxNb2RhbCA9ICh7IGFkZFNraWxsLCB1cGRhdGVTa2lsbEluTGlzdCwgcmVtb3ZlU2tpbGwgfTogQWJtU2tpbGxNb2RhbFByb3BzKSA9PiB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oW1NFQ1RJT05TLmNoYXRBSV0pXG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3QgZXZlbnRBbXBsaXR1ZGUgPSB1c2VFdmVudCgpXG4gIGNvbnN0IHsgaGFuZGxlU25hY2tiYXJTdWNjZXNzLCBoYW5kbGVTbmFja2JhckVycm9yIH0gPSB1c2VTbmFja0Jhck1hbmFnZXIoKVxuICBjb25zdCBbaXNPcGVuLCBzZXRJc09wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtpc1N1Ym1pdHRpbmcsIHNldElzU3VibWl0dGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3Nob3dEZWxldGUsIHNldFNob3dEZWxldGVdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtwZW5kaW5nVXBsb2FkLCBzZXRQZW5kaW5nVXBsb2FkXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbdmFsdWVzLCBzZXRWYWx1ZXNdID0gdXNlU3RhdGU8U2tpbGxNb2RhbFZhbHVlcz4oaW5pdGlhbFZhbHVlcylcbiAgY29uc3QgZmlsZUlucHV0UmVmID0gdXNlUmVmPEhUTUxJbnB1dEVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IGluaXRpYWxSZWYgPSB1c2VSZWY8U2tpbGxGb3JtQmFzZWxpbmU+KGVtcHR5QmFzZWxpbmUpXG5cbiAgY29uc3QgaXNSZWFkT25seSA9ICEhdmFsdWVzLmlzUmVhZE9ubHlcbiAgY29uc3QgaXNTaGFyZWRTa2lsbCA9ICEhdmFsdWVzLmlzU2hhcmVkXG4gIGNvbnN0IGNhblNoYXJlV2l0aENvbXBhbnkgPSAhaXNDb2xsYWJvcmF0b3JSb2xlKHVzZXIucm9sZV9pZCkgJiYgIWlzUmVhZE9ubHlcblxuICBjb25zdCBuYW1lID0gdmFsdWVzLmdlbmVyYWw/Lm5hbWUgfHwgJydcbiAgY29uc3QgZGVzY3JpcHRpb24gPSB2YWx1ZXMuZ2VuZXJhbD8uZGVzY3JpcHRpb24gfHwgJydcbiAgY29uc3QgY29udGVudCA9IHZhbHVlcy5nZW5lcmFsPy5jb250ZW50IHx8ICcnXG4gIGNvbnN0IGFjY2Vzc1R5cGU6IFNraWxsQWNjZXNzVHlwZSA9IHZhbHVlcy5nZW5lcmFsPy5hY2Nlc3NfdHlwZSB8fCAnb25seV9tZSdcbiAgY29uc3QgZWZmZWN0aXZlQWNjZXNzVHlwZTogU2tpbGxBY2Nlc3NUeXBlID0gY2FuU2hhcmVXaXRoQ29tcGFueSA/IGFjY2Vzc1R5cGUgOiAnb25seV9tZSdcbiAgY29uc3Qgc2tpbGxJZCA9IHZhbHVlcy5nZW5lcmFsPy5pZFxuICBjb25zdCBjb250ZW50Qnl0ZXMgPSB1c2VNZW1vKCgpID0+IGdldFNraWxsQ29udGVudEJ5dGVMZW5ndGgoY29udGVudCksIFtjb250ZW50XSlcbiAgY29uc3QgaXNPdmVyTGltaXQgPSBjb250ZW50Qnl0ZXMgPiBTS0lMTF9DT05URU5UX01BWF9CWVRFU1xuICBjb25zdCBpc1ZhbGlkID0gISFuYW1lLnRyaW0oKSAmJiAhIWNvbnRlbnQudHJpbSgpICYmICFpc092ZXJMaW1pdFxuICBjb25zdCBoYXNDaGFuZ2VzID1cbiAgICBuYW1lLnRyaW0oKSAhPT0gaW5pdGlhbFJlZi5jdXJyZW50Lm5hbWUgfHxcbiAgICBkZXNjcmlwdGlvbi50cmltKCkgIT09IGluaXRpYWxSZWYuY3VycmVudC5kZXNjcmlwdGlvbiB8fFxuICAgIGNvbnRlbnQudHJpbSgpICE9PSBpbml0aWFsUmVmLmN1cnJlbnQuY29udGVudCB8fFxuICAgIChjYW5TaGFyZVdpdGhDb21wYW55ICYmIGVmZmVjdGl2ZUFjY2Vzc1R5cGUgIT09IGluaXRpYWxSZWYuY3VycmVudC5hY2Nlc3NfdHlwZSlcblxuICBjb25zdCBjcmVhdGVkQnlMYWJlbCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGNyZWF0ZWRCeSA9IHZhbHVlcy5nZW5lcmFsPy5jcmVhdGVkX2J5X25hbWU/LnRyaW0oKVxuICAgIGlmIChjcmVhdGVkQnkpIHJldHVybiBjcmVhdGVkQnlcbiAgICByZXR1cm4gaXNTaGFyZWRTa2lsbCA/ICcnIDogYCR7dXNlci5maXJzdE5hbWV9ICR7dXNlci5sYXN0TmFtZX1gLnRyaW0oKVxuICB9LCBbdmFsdWVzLmdlbmVyYWw/LmNyZWF0ZWRfYnlfbmFtZSwgdXNlci5maXJzdE5hbWUsIHVzZXIubGFzdE5hbWUsIGlzU2hhcmVkU2tpbGxdKVxuXG4gIGNvbnN0IGxhc3RVcGRhdGVkTGFiZWwgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB1cGRhdGVkQXQgPSB2YWx1ZXMuZ2VuZXJhbD8udXBkYXRlZF9hdCB8fCB2YWx1ZXMuZ2VuZXJhbD8uY3JlYXRlZF9hdFxuICAgIGlmICghdXBkYXRlZEF0KSByZXR1cm4gJydcbiAgICBjb25zdCBwYXJzZWQgPSBuZXcgRGF0ZSh1cGRhdGVkQXQpXG4gICAgaWYgKE51bWJlci5pc05hTihwYXJzZWQuZ2V0VGltZSgpKSkgcmV0dXJuICcnXG4gICAgcmV0dXJuIGZvcm1hdERhdGUocGFyc2VkKVxuICB9LCBbdmFsdWVzLmdlbmVyYWw/LnVwZGF0ZWRfYXQsIHZhbHVlcy5nZW5lcmFsPy5jcmVhdGVkX2F0XSlcblxuICBjb25zdCBoYW5kbGVDbG9zZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRJc09wZW4oZmFsc2UpXG4gICAgc2V0U2hvd0RlbGV0ZShmYWxzZSlcbiAgICBzZXRQZW5kaW5nVXBsb2FkKGZhbHNlKVxuICAgIHNldFZhbHVlcyhpbml0aWFsVmFsdWVzKVxuICAgIGluaXRpYWxSZWYuY3VycmVudCA9IGVtcHR5QmFzZWxpbmVcbiAgfSwgW10pXG5cbiAgY29uc3QgaGFuZGxlQ2FuY2VsID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGV2ZW50QW1wbGl0dWRlKEVWRU5UUy5haUNoYXRTa2lsbEFibUNhbmNlbCwgeyBvcHRpb246IHJlc29sdmVTa2lsbEFibU9wdGlvbih2YWx1ZXMpIH0pXG4gICAgaGFuZGxlQ2xvc2UoKVxuICB9LCBbZXZlbnRBbXBsaXR1ZGUsIGhhbmRsZUNsb3NlLCB2YWx1ZXNdKVxuXG4gIGNvbnN0IGhhbmRsZUJhY2tkcm9wQ2xpY2sgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC50YXJnZXQgPT09IGV2ZW50LmN1cnJlbnRUYXJnZXQpIHtcbiAgICAgICAgaGFuZGxlQ2FuY2VsKClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtoYW5kbGVDYW5jZWxdXG4gIClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZVNldFNraWxsVmFsdWVzID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHsgc2tpbGxWYWx1ZXMsIGFuYWx5dGljc1NvdXJjZSB9ID0gZXZlbnQuZGV0YWlsIHx8IHt9XG4gICAgICBpZiAoIXNraWxsVmFsdWVzKSByZXR1cm5cblxuICAgICAgY29uc3QgaW5jb21pbmdHZW5lcmFsID0ge1xuICAgICAgICAuLi5pbml0aWFsVmFsdWVzLmdlbmVyYWwsXG4gICAgICAgIC4uLnNraWxsVmFsdWVzLnZhbHVlcz8uZ2VuZXJhbCxcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluY29taW5nTmFtZSA9IChpbmNvbWluZ0dlbmVyYWwubmFtZSB8fCAnJykudHJpbSgpXG4gICAgICBjb25zdCBpbmNvbWluZ0Rlc2NyaXB0aW9uID0gKGluY29taW5nR2VuZXJhbC5kZXNjcmlwdGlvbiB8fCAnJykudHJpbSgpXG4gICAgICBjb25zdCBpbmNvbWluZ0NvbnRlbnQgPSAoaW5jb21pbmdHZW5lcmFsLmNvbnRlbnQgfHwgJycpLnRyaW0oKVxuICAgICAgY29uc3QgaW5jb21pbmdBY2Nlc3NUeXBlOiBTa2lsbEFjY2Vzc1R5cGUgPSBpc0NvbGxhYm9yYXRvclJvbGUodXNlci5yb2xlX2lkKVxuICAgICAgICA/ICdvbmx5X21lJ1xuICAgICAgICA6IGluY29taW5nR2VuZXJhbC5hY2Nlc3NfdHlwZSB8fCAnb25seV9tZSdcbiAgICAgIGNvbnN0IHBhcnNlZERlc2NyaXB0aW9uID1cbiAgICAgICAgaW5jb21pbmdEZXNjcmlwdGlvbiB8fCAoaW5jb21pbmdDb250ZW50ID8gcGFyc2VEZXNjcmlwdGlvbkZyb21Db250ZW50KGluY29taW5nQ29udGVudCkgOiAnJylcblxuICAgICAgY29uc3QgZWRpdGluZ0Jhc2VsaW5lOiBTa2lsbEZvcm1CYXNlbGluZSA9IHtcbiAgICAgICAgbmFtZTogaW5jb21pbmdOYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogcGFyc2VkRGVzY3JpcHRpb24sXG4gICAgICAgIGNvbnRlbnQ6IGluY29taW5nQ29udGVudCxcbiAgICAgICAgYWNjZXNzX3R5cGU6IGluY29taW5nQWNjZXNzVHlwZSxcbiAgICAgIH1cbiAgICAgIGluaXRpYWxSZWYuY3VycmVudCA9IHNraWxsVmFsdWVzLnZhbHVlcz8uaXNFZGl0aW5nID8gZWRpdGluZ0Jhc2VsaW5lIDogZW1wdHlCYXNlbGluZVxuXG4gICAgICBzZXRWYWx1ZXMoe1xuICAgICAgICAuLi5pbml0aWFsVmFsdWVzLFxuICAgICAgICAuLi5za2lsbFZhbHVlcy52YWx1ZXMsXG4gICAgICAgIGdlbmVyYWw6IHtcbiAgICAgICAgICAuLi5pbmNvbWluZ0dlbmVyYWwsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHBhcnNlZERlc2NyaXB0aW9uLFxuICAgICAgICAgIGFjY2Vzc190eXBlOiBpbmNvbWluZ0FjY2Vzc1R5cGUsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgc2V0UGVuZGluZ1VwbG9hZChza2lsbFZhbHVlcy52YWx1ZXM/LmludGVudCA9PT0gJ3VwbG9hZCcpXG4gICAgICBzZXRJc09wZW4oISFza2lsbFZhbHVlcy5pc09wZW4pXG5cbiAgICAgIGlmIChza2lsbFZhbHVlcy5pc09wZW4pIHtcbiAgICAgICAgY29uc3QgaW5jb21pbmdWYWx1ZXMgPSB7IC4uLmluaXRpYWxWYWx1ZXMsIC4uLnNraWxsVmFsdWVzLnZhbHVlcyB9XG4gICAgICAgIGNvbnN0IHNvdXJjZTogU2tpbGxBYm1BY2Nlc3NTb3VyY2UgPVxuICAgICAgICAgIGFuYWx5dGljc1NvdXJjZSA9PT0gJ2Ryb3Bkb3duJyB8fCBhbmFseXRpY3NTb3VyY2UgPT09ICdlbXB0eScgfHwgYW5hbHl0aWNzU291cmNlID09PSAnY2F0YWxvZydcbiAgICAgICAgICAgID8gYW5hbHl0aWNzU291cmNlXG4gICAgICAgICAgICA6ICdjYXRhbG9nJ1xuICAgICAgICBldmVudEFtcGxpdHVkZShFVkVOVFMuYWlDaGF0U2tpbGxBYm1BY2Nlc3MsIHtcbiAgICAgICAgICBvcHRpb246IHJlc29sdmVTa2lsbEFibU9wdGlvbihpbmNvbWluZ1ZhbHVlcyksXG4gICAgICAgICAgc291cmNlLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2FibS1za2lsbC1tb2RhbC1zZXQtdmFsdWVzJywgaGFuZGxlU2V0U2tpbGxWYWx1ZXMpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2FibS1za2lsbC1tb2RhbC1zZXQtdmFsdWVzJywgaGFuZGxlU2V0U2tpbGxWYWx1ZXMpXG4gICAgfVxuICB9LCBbZXZlbnRBbXBsaXR1ZGUsIHVzZXIucm9sZV9pZF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNPcGVuICYmIHBlbmRpbmdVcGxvYWQpIHtcbiAgICAgIHNldFBlbmRpbmdVcGxvYWQoZmFsc2UpXG4gICAgICBmaWxlSW5wdXRSZWYuY3VycmVudD8uY2xpY2soKVxuICAgIH1cbiAgfSwgW2lzT3BlbiwgcGVuZGluZ1VwbG9hZF0pXG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlRmllbGQgPSAoZmllbGQ6ICduYW1lJyB8ICdkZXNjcmlwdGlvbicgfCAnY29udGVudCcsIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoZmllbGQgPT09ICdjb250ZW50JyAmJiBpc1NraWxsQ29udGVudE92ZXJMaW1pdCh2YWx1ZSkpIHtcbiAgICAgIGlmICh2YWx1ZS5sZW5ndGggLSBjb250ZW50Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgaGFuZGxlU25hY2tiYXJFcnJvcih0KCdteVNraWxscy5jb250ZW50U2l6ZUVycm9yJykpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgc2V0VmFsdWVzKHByZXYgPT4gKHtcbiAgICAgIC4uLnByZXYsXG4gICAgICBnZW5lcmFsOiB7IC4uLnByZXYuZ2VuZXJhbCwgW2ZpZWxkXTogdmFsdWUgfSxcbiAgICB9KSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUFjY2Vzc1R5cGVDaGFuZ2UgPSAoY2hlY2tlZDogYm9vbGVhbikgPT4ge1xuICAgIGlmICghY2FuU2hhcmVXaXRoQ29tcGFueSkgcmV0dXJuXG4gICAgc2V0VmFsdWVzKHByZXYgPT4gKHtcbiAgICAgIC4uLnByZXYsXG4gICAgICBnZW5lcmFsOiB7XG4gICAgICAgIC4uLnByZXYuZ2VuZXJhbCxcbiAgICAgICAgYWNjZXNzX3R5cGU6IGNoZWNrZWQgPyAnY29tcGFueScgOiAnb25seV9tZScsXG4gICAgICB9LFxuICAgIH0pKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlVXBsb2FkQ2xpY2sgPSAoKSA9PiB7XG4gICAgZmlsZUlucHV0UmVmLmN1cnJlbnQ/LmNsaWNrKClcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUZpbGVDaGFuZ2UgPSBhc3luYyAoZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LnRhcmdldC5maWxlcz8uWzBdXG4gICAgaWYgKGZpbGVJbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICBmaWxlSW5wdXRSZWYuY3VycmVudC52YWx1ZSA9ICcnXG4gICAgfVxuICAgIGlmICghZmlsZSkgcmV0dXJuXG5cbiAgICBjb25zdCBpc01hcmtkb3duID0gL1xcLihtZHxtYXJrZG93bikkL2kudGVzdChmaWxlLm5hbWUpXG4gICAgaWYgKCFpc01hcmtkb3duKSB7XG4gICAgICBldmVudEFtcGxpdHVkZShFVkVOVFMuYWlDaGF0U2tpbGxVcGxvYWQsIHsgcmVzdWx0OiAndHlwZV9lcnJvcicgfSlcbiAgICAgIGhhbmRsZVNuYWNrYmFyRXJyb3IodCgnbXlTa2lsbHMudXBsb2FkRXJyb3InKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChmaWxlLnNpemUgPiBTS0lMTF9DT05URU5UX01BWF9CWVRFUykge1xuICAgICAgZXZlbnRBbXBsaXR1ZGUoRVZFTlRTLmFpQ2hhdFNraWxsVXBsb2FkLCB7IHJlc3VsdDogJ3NpemVfZXJyb3InIH0pXG4gICAgICBoYW5kbGVTbmFja2JhckVycm9yKHQoJ215U2tpbGxzLnVwbG9hZFNpemVFcnJvcicpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmaWxlLnRleHQoKVxuICAgICAgaWYgKGlzU2tpbGxDb250ZW50T3ZlckxpbWl0KHRleHQpKSB7XG4gICAgICAgIGV2ZW50QW1wbGl0dWRlKEVWRU5UUy5haUNoYXRTa2lsbFVwbG9hZCwgeyByZXN1bHQ6ICdzaXplX2Vycm9yJyB9KVxuICAgICAgICBoYW5kbGVTbmFja2JhckVycm9yKHQoJ215U2tpbGxzLnVwbG9hZFNpemVFcnJvcicpKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhc2VOYW1lID0gZmlsZS5uYW1lLnJlcGxhY2UoL1xcLihtZHxtYXJrZG93bikkL2ksICcnKVxuICAgICAgY29uc3QgcGFyc2VkRGVzY3JpcHRpb24gPSBwYXJzZURlc2NyaXB0aW9uRnJvbUNvbnRlbnQodGV4dClcbiAgICAgIHNldFZhbHVlcyhwcmV2ID0+ICh7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIGdlbmVyYWw6IHtcbiAgICAgICAgICAuLi5wcmV2LmdlbmVyYWwsXG4gICAgICAgICAgY29udGVudDogdGV4dCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogcHJldi5nZW5lcmFsPy5kZXNjcmlwdGlvbj8udHJpbSgpXG4gICAgICAgICAgICA/IHByZXYuZ2VuZXJhbC5kZXNjcmlwdGlvblxuICAgICAgICAgICAgOiBwYXJzZWREZXNjcmlwdGlvbiB8fCBwcmV2LmdlbmVyYWw/LmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgICAgIG5hbWU6IHByZXYuZ2VuZXJhbD8ubmFtZT8udHJpbSgpID8gcHJldi5nZW5lcmFsLm5hbWUgOiBiYXNlTmFtZSxcbiAgICAgICAgfSxcbiAgICAgIH0pKVxuICAgICAgZXZlbnRBbXBsaXR1ZGUoRVZFTlRTLmFpQ2hhdFNraWxsVXBsb2FkLCB7IHJlc3VsdDogJ3N1Y2Nlc3MnIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyRXJyb3IodCgnbXlTa2lsbHMudXBsb2FkRXJyb3InKSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBwZXJzaXN0U2tpbGwgPSBhc3luYyAoKTogUHJvbWlzZTxTa2lsbCB8IG51bGw+ID0+IHtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgbmFtZTogbmFtZS50cmltKCksXG4gICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24udHJpbSgpLFxuICAgICAgY29udGVudDogY29udGVudC50cmltKCksXG4gICAgICBhY2Nlc3NfdHlwZTogZWZmZWN0aXZlQWNjZXNzVHlwZSxcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzLmlzRWRpdGluZyAmJiBza2lsbElkKSB7XG4gICAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdXBkYXRlU2tpbGwoc2tpbGxJZCwgcGF5bG9hZClcbiAgICAgIHVwZGF0ZVNraWxsSW5MaXN0Py4odXBkYXRlZClcbiAgICAgIGhhbmRsZVNuYWNrYmFyU3VjY2Vzcyh0KCdteVNraWxscy51cGRhdGVTdWNjZXNzJykpXG4gICAgICByZXR1cm4gdXBkYXRlZFxuICAgIH1cblxuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBjcmVhdGVTa2lsbChwYXlsb2FkKVxuICAgIGFkZFNraWxsPy4oY3JlYXRlZClcbiAgICBoYW5kbGVTbmFja2JhclN1Y2Nlc3ModCgnbXlTa2lsbHMuY3JlYXRlU3VjY2VzcycpKVxuICAgIHJldHVybiBjcmVhdGVkXG4gIH1cblxuICBjb25zdCBoYW5kbGVTYXZlID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaXNWYWxpZCB8fCBpc1N1Ym1pdHRpbmcgfHwgIWhhc0NoYW5nZXMpIHJldHVyblxuICAgIHNldElzU3VibWl0dGluZyh0cnVlKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYXZlZFNraWxsID0gYXdhaXQgcGVyc2lzdFNraWxsKClcbiAgICAgIGlmIChzYXZlZFNraWxsKSB7XG4gICAgICAgIGV2ZW50QW1wbGl0dWRlKEVWRU5UUy5haUNoYXRTa2lsbEFibUNvbmZpcm0sIHtcbiAgICAgICAgICBvcHRpb246IHZhbHVlcy5pc0VkaXRpbmcgPyAnZWRpdCcgOiAnY3JlYXRlJyxcbiAgICAgICAgICBhY3Rpb246ICdzYXZlJyxcbiAgICAgICAgICBhY2Nlc3NfdHlwZTogZWZmZWN0aXZlQWNjZXNzVHlwZSxcbiAgICAgICAgICBza2lsbF9pZDogc2F2ZWRTa2lsbC5pZCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGhhbmRsZUNsb3NlKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaGFuZGxlU25hY2tiYXJFcnJvcih2YWx1ZXMuaXNFZGl0aW5nID8gdCgnbXlTa2lsbHMudXBkYXRlRXJyb3InKSA6IHQoJ215U2tpbGxzLmNyZWF0ZUVycm9yJykpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldElzU3VibWl0dGluZyhmYWxzZSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVTYXZlQW5kVXNlID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaXNWYWxpZCB8fCBpc1N1Ym1pdHRpbmcpIHJldHVyblxuICAgIHNldElzU3VibWl0dGluZyh0cnVlKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYXZlZFNraWxsID0gYXdhaXQgcGVyc2lzdFNraWxsKClcbiAgICAgIGlmIChzYXZlZFNraWxsKSB7XG4gICAgICAgIGV2ZW50QW1wbGl0dWRlKEVWRU5UUy5haUNoYXRTa2lsbEFibUNvbmZpcm0sIHtcbiAgICAgICAgICBvcHRpb246IHZhbHVlcy5pc0VkaXRpbmcgPyAnZWRpdCcgOiAnY3JlYXRlJyxcbiAgICAgICAgICBhY3Rpb246ICdzYXZlX2FuZF91c2UnLFxuICAgICAgICAgIGFjY2Vzc190eXBlOiBlZmZlY3RpdmVBY2Nlc3NUeXBlLFxuICAgICAgICAgIHNraWxsX2lkOiBzYXZlZFNraWxsLmlkLFxuICAgICAgICB9KVxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudChTS0lMTF9VU0VfQUZURVJfU0FWRV9FVkVOVCwge1xuICAgICAgICAgICAgZGV0YWlsOiB7IHNraWxsOiBzYXZlZFNraWxsIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaGFuZGxlQ2xvc2UoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBoYW5kbGVTbmFja2JhckVycm9yKHZhbHVlcy5pc0VkaXRpbmcgPyB0KCdteVNraWxscy51cGRhdGVFcnJvcicpIDogdCgnbXlTa2lsbHMuY3JlYXRlRXJyb3InKSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0SXNTdWJtaXR0aW5nKGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUNvbmZpcm1EZWxldGUgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFza2lsbElkKSByZXR1cm5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZGVsZXRlU2tpbGwoc2tpbGxJZClcbiAgICAgIGV2ZW50QW1wbGl0dWRlKEVWRU5UUy5haUNoYXRTa2lsbEFibURlbGV0ZSwgeyBza2lsbF9pZDogc2tpbGxJZCwgc291cmNlOiAnbW9kYWwnIH0pXG4gICAgICByZW1vdmVTa2lsbD8uKHNraWxsSWQpXG4gICAgICBoYW5kbGVTbmFja2JhclN1Y2Nlc3ModCgnbXlTa2lsbHMuZGVsZXRlU3VjY2VzcycpKVxuICAgICAgaGFuZGxlQ2xvc2UoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBoYW5kbGVTbmFja2JhckVycm9yKHQoJ215U2tpbGxzLmRlbGV0ZUVycm9yJykpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlRWRpdEZyb21WaWV3ID0gKCkgPT4ge1xuICAgIHNldFZhbHVlcyhwcmV2ID0+ICh7IC4uLnByZXYsIGlzUmVhZE9ubHk6IGZhbHNlIH0pKVxuICB9XG5cbiAgLyoqIFNraWxsIGFqZW5hIGVuIG1vZG8gbGVjdHVyYTogYWJyZSB1biBjaGF0IG51ZXZvIGNvbiBlbCBwcmltZXIgYWdlbnRlIHkgbGEgbWVuY2nDs24geWEgcHVlc3RhLiAqL1xuICBjb25zdCBoYW5kbGVVc2VTa2lsbCA9ICgpID0+IHtcbiAgICBpZiAoIXNraWxsSWQpIHJldHVyblxuICAgIGV2ZW50QW1wbGl0dWRlKEVWRU5UUy5haUNoYXRTa2lsbFVzZSwge1xuICAgICAgc2tpbGxfaWQ6IHNraWxsSWQsXG4gICAgICBhY2Nlc3NfdHlwZTogYWNjZXNzVHlwZSxcbiAgICAgIHNvdXJjZTogJ3ZpZXdfbW9kYWwnLFxuICAgICAgaXNfc2hhcmVkOiBpc1NoYXJlZFNraWxsLFxuICAgIH0pXG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudChTS0lMTF9VU0VfQUZURVJfU0FWRV9FVkVOVCwge1xuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICBza2lsbDogeyBpZDogc2tpbGxJZCwgbmFtZSwgZGVzY3JpcHRpb24sIGNvbnRlbnQsIGFjY2Vzc190eXBlOiBhY2Nlc3NUeXBlIH0sXG4gICAgICAgICAgdXNlRmlyc3RBZ2VudDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKVxuICAgIGhhbmRsZUNsb3NlKClcbiAgfVxuXG4gIGlmICghaXNPcGVuKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RhbC1yb290LWFjdGlvbnMnKVxuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuIG51bGxcblxuICBjb25zdCBlZGl0T3JDcmVhdGVUaXRsZSA9IHZhbHVlcy5pc0VkaXRpbmcgPyB0KCdteVNraWxscy5lZGl0VGl0bGUnKSA6IHQoJ215U2tpbGxzLmNyZWF0ZVRpdGxlJylcbiAgY29uc3Qgdmlld1RpdGxlID0gaXNTaGFyZWRTa2lsbCA/IHQoJ215U2tpbGxzLnZpZXdUaXRsZScpIDogdCgnbXlTa2lsbHMudmlld093blRpdGxlJylcbiAgY29uc3QgbW9kYWxUaXRsZSA9IGlzUmVhZE9ubHkgPyB2aWV3VGl0bGUgOiBlZGl0T3JDcmVhdGVUaXRsZVxuXG4gIGNvbnN0IHByZXZpZXdCb2R5ID0gKFxuICAgIDxTQ0FTTVByZXZpZXdCb2R5PlxuICAgICAgPFNDQVNNUHJldmlld0hlYWRpbmdCbG9jaz5cbiAgICAgICAgPFNDQVNNUHJldmlld05hbWU+e25hbWV9PC9TQ0FTTVByZXZpZXdOYW1lPlxuICAgICAgICB7ZGVzY3JpcHRpb24gPyA8U0NBU01QcmV2aWV3RGVzY3JpcHRpb24+e2Rlc2NyaXB0aW9ufTwvU0NBU01QcmV2aWV3RGVzY3JpcHRpb24+IDogbnVsbH1cbiAgICAgIDwvU0NBU01QcmV2aWV3SGVhZGluZ0Jsb2NrPlxuXG4gICAgICA8U0NBU01QcmV2aWV3TWV0YWRhdGFSb3c+XG4gICAgICAgIHtjcmVhdGVkQnlMYWJlbCA/IChcbiAgICAgICAgICA8U0NBU01NZXRhZGF0YUl0ZW0+XG4gICAgICAgICAgICA8U0NBU01QcmV2aWV3TWV0YWRhdGFMYWJlbD57dCgnbXlTa2lsbHMuY3JlYXRlZEJ5Jyl9PC9TQ0FTTVByZXZpZXdNZXRhZGF0YUxhYmVsPlxuICAgICAgICAgICAgPFNDQVNNUHJldmlld01ldGFkYXRhVmFsdWU+e2NyZWF0ZWRCeUxhYmVsfTwvU0NBU01QcmV2aWV3TWV0YWRhdGFWYWx1ZT5cbiAgICAgICAgICA8L1NDQVNNTWV0YWRhdGFJdGVtPlxuICAgICAgICApIDogbnVsbH1cbiAgICAgICAge2xhc3RVcGRhdGVkTGFiZWwgPyAoXG4gICAgICAgICAgPFNDQVNNTWV0YWRhdGFJdGVtPlxuICAgICAgICAgICAgPFNDQVNNUHJldmlld01ldGFkYXRhTGFiZWw+e3QoJ215U2tpbGxzLmxhc3RVcGRhdGVkJyl9PC9TQ0FTTVByZXZpZXdNZXRhZGF0YUxhYmVsPlxuICAgICAgICAgICAgPFNDQVNNUHJldmlld01ldGFkYXRhVmFsdWU+e2xhc3RVcGRhdGVkTGFiZWx9PC9TQ0FTTVByZXZpZXdNZXRhZGF0YVZhbHVlPlxuICAgICAgICAgIDwvU0NBU01NZXRhZGF0YUl0ZW0+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgICB7IWlzU2hhcmVkU2tpbGwgPyAoXG4gICAgICAgICAgPFNDQVNNTWV0YWRhdGFJdGVtPlxuICAgICAgICAgICAgPFNDQVNNUHJldmlld01ldGFkYXRhTGFiZWw+e3QoJ215U2tpbGxzLmVuYWJsZWRMYWJlbCcpfTwvU0NBU01QcmV2aWV3TWV0YWRhdGFMYWJlbD5cbiAgICAgICAgICAgIDxTQ0FTTVByZXZpZXdNZXRhZGF0YVZhbHVlPlxuICAgICAgICAgICAgICB7YWNjZXNzVHlwZSA9PT0gJ2NvbXBhbnknID8gdCgnbXlTa2lsbHMudmlzaWJpbGl0eUV2ZXJ5b25lJykgOiB0KCdteVNraWxscy52aXNpYmlsaXR5T25seU1lJyl9XG4gICAgICAgICAgICA8L1NDQVNNUHJldmlld01ldGFkYXRhVmFsdWU+XG4gICAgICAgICAgPC9TQ0FTTU1ldGFkYXRhSXRlbT5cbiAgICAgICAgKSA6IG51bGx9XG4gICAgICA8L1NDQVNNUHJldmlld01ldGFkYXRhUm93PlxuXG4gICAgICA8U0NBU01QcmV2aWV3Q29udGVudFBhbmVsPlxuICAgICAgICA8U0NBU01JbnN0cnVjdGlvbnNUaXRsZT57dCgnbXlTa2lsbHMuaW5zdHJ1Y3Rpb25zTGFiZWwnKX08L1NDQVNNSW5zdHJ1Y3Rpb25zVGl0bGU+XG4gICAgICAgIDxTQ0FTTVByZXZpZXdDb250ZW50Qm94Pntjb250ZW50fTwvU0NBU01QcmV2aWV3Q29udGVudEJveD5cbiAgICAgIDwvU0NBU01QcmV2aWV3Q29udGVudFBhbmVsPlxuICAgIDwvU0NBU01QcmV2aWV3Qm9keT5cbiAgKVxuXG4gIHJldHVybiBjcmVhdGVQb3J0YWwoXG4gICAgPEJhY2tkcm9wIHpJbmRleD17MTExMn0gb25DbGljaz17aGFuZGxlQmFja2Ryb3BDbGlja30+XG4gICAgICA8U0NBU01XcmFwcGVyIG9uQ2xpY2s9e2V2ZW50ID0+IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpfT5cbiAgICAgICAgPFNDQVNNSGVhZGVyPlxuICAgICAgICAgIDxTQ0FTTUhlYWRlclRpdGxlPnttb2RhbFRpdGxlfTwvU0NBU01IZWFkZXJUaXRsZT5cbiAgICAgICAgICA8U0NBU01DbG9zZUJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17aGFuZGxlQ2FuY2VsfSBhcmlhLWxhYmVsPXt0KCdteVNraWxscy5jbG9zZScpfT5cbiAgICAgICAgICAgIDxDcm9zcyBjb2xvcj1cIiNhNmE2YTZcIiB3aWR0aD17MTh9IGhlaWdodD17MTh9IC8+XG4gICAgICAgICAgPC9TQ0FTTUNsb3NlQnV0dG9uPlxuICAgICAgICA8L1NDQVNNSGVhZGVyPlxuXG4gICAgICAgIHtpc1JlYWRPbmx5ID8gKFxuICAgICAgICAgIHByZXZpZXdCb2R5XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPFNDQVNNQm9keT5cbiAgICAgICAgICAgIDxTQ0FTTUZpZWxkQm94ICRoZWlnaHQ9ezUwfT5cbiAgICAgICAgICAgICAgPFNDQVNNRmllbGRMYWJlbCBodG1sRm9yPVwic2tpbGwtbmFtZS1pbnB1dFwiPnt0KCdteVNraWxscy5uYW1lTGFiZWwnKX08L1NDQVNNRmllbGRMYWJlbD5cbiAgICAgICAgICAgICAgPFNDQVNNRmllbGRJbnB1dFxuICAgICAgICAgICAgICAgIGlkPVwic2tpbGwtbmFtZS1pbnB1dFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIG1heExlbmd0aD17MTUwfVxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXt0KCdteVNraWxscy5uYW1lUGxhY2Vob2xkZXInKX1cbiAgICAgICAgICAgICAgICB2YWx1ZT17bmFtZX1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17aXNTdWJtaXR0aW5nfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtldmVudCA9PiBoYW5kbGVDaGFuZ2VGaWVsZCgnbmFtZScsIGV2ZW50LnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L1NDQVNNRmllbGRCb3g+XG5cbiAgICAgICAgICAgIDxTQ0FTTUZpZWxkQm94ICRoZWlnaHQ9ezEyMH0gJGNsaXBPdmVyZmxvdz5cbiAgICAgICAgICAgICAgPFNDQVNNRmllbGRMYWJlbCBodG1sRm9yPVwic2tpbGwtZGVzY3JpcHRpb24taW5wdXRcIj57dCgnbXlTa2lsbHMuZGVzY3JpcHRpb25MYWJlbCcpfTwvU0NBU01GaWVsZExhYmVsPlxuICAgICAgICAgICAgICA8U0NBU01GaWVsZFRleHRhcmVhXG4gICAgICAgICAgICAgICAgaWQ9XCJza2lsbC1kZXNjcmlwdGlvbi1pbnB1dFwiXG4gICAgICAgICAgICAgICAgbWF4TGVuZ3RoPXs1MDB9XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3QoJ215U2tpbGxzLmRlc2NyaXB0aW9uUGxhY2Vob2xkZXInKX1cbiAgICAgICAgICAgICAgICB2YWx1ZT17ZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzU3VibWl0dGluZ31cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17ZXZlbnQgPT4gaGFuZGxlQ2hhbmdlRmllbGQoJ2Rlc2NyaXB0aW9uJywgZXZlbnQudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvU0NBU01GaWVsZEJveD5cblxuICAgICAgICAgICAge2NhblNoYXJlV2l0aENvbXBhbnkgPyAoXG4gICAgICAgICAgICAgIDxTQ0FTTVN3aXRjaFJvdz5cbiAgICAgICAgICAgICAgICA8U3dpdGNoXG4gICAgICAgICAgICAgICAgICBjaGVja2VkPXthY2Nlc3NUeXBlID09PSAnY29tcGFueSd9XG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlQWNjZXNzVHlwZUNoYW5nZX1cbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc1N1Ym1pdHRpbmd9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXt0KCdteVNraWxscy5zaGFyZVdpdGhDb21wYW55Jyl9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8U0NBU01Td2l0Y2hMYWJlbD57dCgnbXlTa2lsbHMuc2hhcmVXaXRoQ29tcGFueScpfTwvU0NBU01Td2l0Y2hMYWJlbD5cbiAgICAgICAgICAgICAgPC9TQ0FTTVN3aXRjaFJvdz5cbiAgICAgICAgICAgICkgOiBudWxsfVxuXG4gICAgICAgICAgICA8U0NBU01JbnN0cnVjdGlvbnNQYW5lbD5cbiAgICAgICAgICAgICAgPFNDQVNNSW5zdHJ1Y3Rpb25zSGVhZGVyPlxuICAgICAgICAgICAgICAgIDxTQ0FTTUluc3RydWN0aW9uc1RpdGxlPnt0KCdteVNraWxscy5pbnN0cnVjdGlvbnNMYWJlbCcpfTwvU0NBU01JbnN0cnVjdGlvbnNUaXRsZT5cbiAgICAgICAgICAgICAgICA8U0NBU01VcGxvYWRCdXR0b24gdHlwZT1cImJ1dHRvblwiIG9uQ2xpY2s9e2hhbmRsZVVwbG9hZENsaWNrfSBkaXNhYmxlZD17aXNTdWJtaXR0aW5nfT5cbiAgICAgICAgICAgICAgICAgIDxGaWxlVXBsb2FkIHdpZHRoPXsxOH0gaGVpZ2h0PXsxOH0gY29sb3I9XCIjMDhDXCIgLz5cbiAgICAgICAgICAgICAgICAgIHt0KCdteVNraWxscy51cGxvYWRNZCcpfVxuICAgICAgICAgICAgICAgIDwvU0NBU01VcGxvYWRCdXR0b24+XG4gICAgICAgICAgICAgICAgPFNDQVNNSGlkZGVuRmlsZUlucHV0XG4gICAgICAgICAgICAgICAgICByZWY9e2ZpbGVJbnB1dFJlZn1cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICAgICAgICAgIGFjY2VwdD1cIi5tZCwubWFya2Rvd24sdGV4dC9tYXJrZG93blwiXG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlRmlsZUNoYW5nZX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L1NDQVNNSW5zdHJ1Y3Rpb25zSGVhZGVyPlxuXG4gICAgICAgICAgICAgIDxTQ0FTTUluc3RydWN0aW9uc0ZpZWxkPlxuICAgICAgICAgICAgICAgIDxTQ0FTTUluc3RydWN0aW9uc1RleHRhcmVhXG4gICAgICAgICAgICAgICAgICBpZD1cInNraWxsLWNvbnRlbnQtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3QoJ215U2tpbGxzLmNvbnRlbnRQbGFjZWhvbGRlcicpfVxuICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvbnRlbnR9XG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17aXNTdWJtaXR0aW5nfVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2V2ZW50ID0+IGhhbmRsZUNoYW5nZUZpZWxkKCdjb250ZW50JywgZXZlbnQudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L1NDQVNNSW5zdHJ1Y3Rpb25zRmllbGQ+XG4gICAgICAgICAgICAgIDxTQ0FTTUJ5dGVDb3VudGVyICRvdmVyTGltaXQ9e2lzT3ZlckxpbWl0fSBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cbiAgICAgICAgICAgICAgICB7dCgnbXlTa2lsbHMuYnl0ZXNDb3VudGVyJywge1xuICAgICAgICAgICAgICAgICAgdXNlZDogZ2V0VW5pdEZpbGVTaXplKGNvbnRlbnRCeXRlcyksXG4gICAgICAgICAgICAgICAgICBtYXg6IGdldFVuaXRGaWxlU2l6ZShTS0lMTF9DT05URU5UX01BWF9CWVRFUyksXG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIDwvU0NBU01CeXRlQ291bnRlcj5cbiAgICAgICAgICAgIDwvU0NBU01JbnN0cnVjdGlvbnNQYW5lbD5cbiAgICAgICAgICA8L1NDQVNNQm9keT5cbiAgICAgICAgKX1cblxuICAgICAgICA8U0NBU01Gb290ZXI+XG4gICAgICAgICAge2lzUmVhZE9ubHkgJiYgaXNTaGFyZWRTa2lsbCA/IChcbiAgICAgICAgICAgIDxTQ0FTTVVzZVNraWxsQnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXtoYW5kbGVVc2VTa2lsbH0+XG4gICAgICAgICAgICAgIHt0KCdteVNraWxscy51c2VTa2lsbCcpfVxuICAgICAgICAgICAgPC9TQ0FTTVVzZVNraWxsQnV0dG9uPlxuICAgICAgICAgICkgOiBudWxsfVxuXG4gICAgICAgICAge2lzUmVhZE9ubHkgJiYgIWlzU2hhcmVkU2tpbGwgPyAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICA8U0NBU01EZWxldGVTbG90PlxuICAgICAgICAgICAgICAgIDxTQ0FTTUNhbmNlbEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17KCkgPT4gc2V0U2hvd0RlbGV0ZSh0cnVlKX0+XG4gICAgICAgICAgICAgICAgICB7dCgnbXlTa2lsbHMuZGVsZXRlJyl9XG4gICAgICAgICAgICAgICAgPC9TQ0FTTUNhbmNlbEJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9TQ0FTTURlbGV0ZVNsb3Q+XG4gICAgICAgICAgICAgIDxTQ0FTTVNhdmVQcmltYXJ5QnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXtoYW5kbGVFZGl0RnJvbVZpZXd9PlxuICAgICAgICAgICAgICAgIHt0KCdteVNraWxscy5lZGl0Jyl9XG4gICAgICAgICAgICAgIDwvU0NBU01TYXZlUHJpbWFyeUJ1dHRvbj5cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgICkgOiBudWxsfVxuXG4gICAgICAgICAgeyFpc1JlYWRPbmx5ID8gKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAge3ZhbHVlcy5pc0VkaXRpbmcgPyAoXG4gICAgICAgICAgICAgICAgPFNDQVNNRGVsZXRlU2xvdD5cbiAgICAgICAgICAgICAgICAgIDxTQ0FTTUNhbmNlbEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17KCkgPT4gc2V0U2hvd0RlbGV0ZSh0cnVlKX0gZGlzYWJsZWQ9e2lzU3VibWl0dGluZ30+XG4gICAgICAgICAgICAgICAgICAgIHt0KCdteVNraWxscy5kZWxldGUnKX1cbiAgICAgICAgICAgICAgICAgIDwvU0NBU01DYW5jZWxCdXR0b24+XG4gICAgICAgICAgICAgICAgPC9TQ0FTTURlbGV0ZVNsb3Q+XG4gICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICA8U0NBU01TYXZlT3V0bGluZWRCdXR0b24gdHlwZT1cImJ1dHRvblwiIG9uQ2xpY2s9e2hhbmRsZVNhdmVBbmRVc2V9IGRpc2FibGVkPXshaXNWYWxpZCB8fCBpc1N1Ym1pdHRpbmd9PlxuICAgICAgICAgICAgICAgIHtpc1N1Ym1pdHRpbmcgPyA8TG9hZGVyIHNpemU9XCJzbWFsbFwiIC8+IDogdCgnbXlTa2lsbHMuc2F2ZUFuZFVzZScpfVxuICAgICAgICAgICAgICA8L1NDQVNNU2F2ZU91dGxpbmVkQnV0dG9uPlxuICAgICAgICAgICAgICA8U0NBU01TYXZlUHJpbWFyeUJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVNhdmV9XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFpc1ZhbGlkIHx8IGlzU3VibWl0dGluZyB8fCAhaGFzQ2hhbmdlc31cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtpc1N1Ym1pdHRpbmcgPyA8TG9hZGVyIHNpemU9XCJzbWFsbFwiIC8+IDogdCgnbXlTa2lsbHMuc2F2ZScpfVxuICAgICAgICAgICAgICA8L1NDQVNNU2F2ZVByaW1hcnlCdXR0b24+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9TQ0FTTUZvb3Rlcj5cbiAgICAgIDwvU0NBU01XcmFwcGVyPlxuXG4gICAgICB7c2hvd0RlbGV0ZSAmJiBza2lsbElkID8gKFxuICAgICAgICA8RGVsZXRlUXVlc3Rpb25Nb2RhbFxuICAgICAgICAgIG9uQ2xvc2U9eygpID0+IHNldFNob3dEZWxldGUoZmFsc2UpfVxuICAgICAgICAgIGhhbmRsZXJzPXt7XG4gICAgICAgICAgICBoYW5kbGVDb25maXJtQWN0aW9uOiBoYW5kbGVDb25maXJtRGVsZXRlLFxuICAgICAgICAgIH19XG4gICAgICAgICAgY2hhdD17eyB0aXRsZTogbmFtZSwgaWQ6IHNraWxsSWQgfX1cbiAgICAgICAgICBhY3Rpb249XCJza2lsbFwiXG4gICAgICAgIC8+XG4gICAgICApIDogbnVsbH1cbiAgICA8L0JhY2tkcm9wPixcbiAgICBjb250YWluZXJcbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBLFNBQWtDQSxXQUFXLEVBQUVDLFNBQVMsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBQ2xHLFNBQVNDLFlBQVksUUFBUSxXQUFXO0FBQ3hDLFNBQVNDLEtBQUssUUFBUSx3Q0FBd0M7QUFDOUQsU0FBU0MsVUFBVSxRQUFRLDZDQUE2QztBQUN4RSxTQUFTQyxjQUFjLFFBQVEsZUFBZTtBQUM5QyxTQUFTQyxRQUFRLFFBQVEsc0JBQXNCO0FBQy9DLFNBQVNDLE1BQU0sUUFBUSxvQkFBb0I7QUFDM0MsU0FBU0MsTUFBTSxRQUFRLG9CQUFvQjtBQUMzQyxTQUFTQyxRQUFRLFFBQVEsMkJBQTJCO0FBQ3BELFNBQVNDLE9BQU8sRUFBRUMsa0JBQWtCLFFBQVEsMkJBQTJCO0FBQ3ZFLFNBQVNDLE1BQU0sRUFBRUMsUUFBUSxRQUFRLHlCQUF5QjtBQUMxRCxTQUFTQyxrQkFBa0IsUUFBUSxzREFBc0Q7QUFDekYsU0FBU0MsVUFBVSxRQUFRLHFCQUFxQjtBQUNoRCxTQUFTQyxXQUFXLFFBQVEsMkNBQTJDO0FBQ3ZFLFNBQVNDLFdBQVcsUUFBUSwyQ0FBMkM7QUFDdkUsU0FBU0MsV0FBVyxRQUFRLDJDQUEyQztBQUV2RSxTQUFTQyxlQUFlLFFBQVEsZ0NBQWdDO0FBQ2hFLFNBQ0VDLHlCQUF5QixFQUN6QkMsdUJBQXVCLEVBQ3ZCQyx1QkFBdUIsUUFDbEIsaUNBQWlDO0FBQ3hDLFNBQVNDLG1CQUFtQixRQUFRLDRDQUE0QztBQUNoRixTQUNFQyxnQkFBZ0IsRUFDaEJDLGlCQUFpQixFQUNqQkMsZ0JBQWdCLEVBQ2hCQyxTQUFTLEVBQ1RDLGVBQWUsRUFDZkMsYUFBYSxFQUNiQyxlQUFlLEVBQ2ZDLGVBQWUsRUFDZkMsa0JBQWtCLEVBQ2xCQyxXQUFXLEVBQ1hDLFdBQVcsRUFDWEMsZ0JBQWdCLEVBQ2hCQyxv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
489
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsImNyZWF0ZVBvcnRhbCIsIkNyb3NzIiwidXNlVHJhbnNsYXRpb24iLCJNYWlhU3RyZWFtZG93biIsIkJhY2tkcm9wIiwiTG9hZGVyIiwiU0VDVElPTlMiLCJ1c2VVc2VyIiwidXNlU25hY2tCYXJNYW5hZ2VyIiwiY3JlYXRlU2tpbGwiLCJ1cGRhdGVTa2lsbCIsImRlbGV0ZVNraWxsIiwiZ2V0VW5pdEZpbGVTaXplIiwiZ2V0U2tpbGxDb250ZW50Qnl0ZUxlbmd0aCIsImlzU2tpbGxDb250ZW50T3ZlckxpbWl0IiwiU0tJTExfQ09OVEVOVF9NQVhfQllURVMiLCJEZWxldGVRdWVzdGlvbk1vZGFsIiwiZ2V0VXNhZ2VTdG9yZVN0YXRlIiwiU0NBU01CeXRlQ291bnRlciIsIlNDQVNNQ2FuY2VsQnV0dG9uIiwiU0NBU01DbG9zZUJ1dHRvbiIsIlNDQVNNQ29udGVudCIsIlNDQVNNRGVsZXRlU2xvdCIsIlNDQVNNRmllbGQiLCJTQ0FTTUZpZWxkSGVhZGVyIiwiU0NBU01Gb290ZXIiLCJTQ0FTTUhlYWRlciIsIlNDQVNNSGVhZGVyQWN0aW9ucyIsIlNDQVNNSGVhZGVyVGl0bGUiLCJTQ0FTTUhpZGRlbkZpbGVJbnB1dCIsIlNDQVNNSW5wdXQiLCJTQ0FTTUxhYmVsIiwiU0NBU01QcmV2aWV3IiwiU0NBU01QcmV2aWV3RW1wdHkiLCJTQ0FTTVNhdmVCdXR0b24iLCJTQ0FTTVRleHRhcmVhIiwiU0NBU01Ub2dnbGVCdXR0b24iLCJTQ0FTTVRvZ2dsZUdyb3VwIiwiU0NBU01VcGxvYWRCdXR0b24iLCJTQ0FTTVdyYXBwZXIiLCJqc3giLCJfanN4IiwianN4cyIsIl9qc3hzIiwiaW5pdGlhbFZhbHVlcyIsImlzRWRpdGluZyIsImdlbmVyYWwiLCJpZCIsInVuZGVmaW5lZCIsIm5hbWUiLCJjb250ZW50IiwiQWJtU2tpbGxNb2RhbCIsIl9yZWYiLCJfdXNlciRwZXJtaXNzaW9ucyIsIl92YWx1ZXMkZ2VuZXJhbCIsIl92YWx1ZXMkZ2VuZXJhbDIiLCJfdmFsdWVzJGdlbmVyYWwzIiwiYWRkU2tpbGwiLCJ1cGRhdGVTa2lsbEluTGlzdCIsInJlbW92ZVNraWxsIiwiX3VzZVRyYW5zbGF0aW9uIiwiY2hhdEFJIiwidCIsInVzZXIiLCJfdXNlU25hY2tCYXJNYW5hZ2VyIiwiaGFuZGxlU25hY2tiYXJTdWNjZXNzIiwiaGFuZGxlU25hY2tiYXJFcnJvciIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsImlzT3BlbiIsInNldElzT3BlbiIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwiaXNTdWJtaXR0aW5nIiwic2V0SXNTdWJtaXR0aW5nIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJzaG93RGVsZXRlIiwic2V0U2hvd0RlbGV0ZSIsIl91c2VTdGF0ZTciLCJfdXNlU3RhdGU4Iiwic2hvd1ByZXZpZXciLCJzZXRTaG93UHJldmlldyIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwicGVuZGluZ1VwbG9hZCIsInNldFBlbmRpbmdVcGxvYWQiLCJfdXNlU3RhdGUxIiwiX3VzZVN0YXRlMTAiLCJ2YWx1ZXMiLCJzZXRWYWx1ZXMiLCJmaWxlSW5wdXRSZWYiLCJpbml0aWFsUmVmIiwidXNlclBlcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJhaV9hZ2VudHMiLCJjYW5DcmVhdGUiLCJjcmVhdGUiLCJjYW5FZGl0IiwiZWRpdCIsImNhbkRlbGV0ZSIsInNraWxsSWQiLCJjb250ZW50Qnl0ZXMiLCJpc092ZXJMaW1pdCIsImlzVmFsaWQiLCJ0cmltIiwiaGFzQ2hhbmdlcyIsImN1cnJlbnQiLCJoYW5kbGVDbG9zZSIsImhhbmRsZUJhY2tkcm9wQ2xpY2siLCJldmVudCIsInRhcmdldCIsImN1cnJlbnRUYXJnZXQiLCJzaG93VXNhZ2VCbG9ja2VkRXJyb3IiLCJfZ2V0VXNhZ2VTdG9yZVN0YXRlIiwiYmxvY2tlZCIsInF1b3RhRXhjZWVkZWRNZXNzYWdlIiwiZGVmYXVsdFZhbHVlIiwiaGFuZGxlU2V0U2tpbGxWYWx1ZXMiLCJfc2tpbGxWYWx1ZXMkdmFsdWVzIiwiX3NraWxsVmFsdWVzJHZhbHVlczIiLCJfc2tpbGxWYWx1ZXMkdmFsdWVzMyIsIl9za2lsbFZhbHVlcyR2YWx1ZXM0IiwiX3NraWxsVmFsdWVzJHZhbHVlczUiLCJfc2tpbGxWYWx1ZXMkdmFsdWVzNiIsIl9yZWYyIiwiZGV0YWlsIiwic2tpbGxWYWx1ZXMiLCJfZ2V0VXNhZ2VTdG9yZVN0YXRlMiIsImluY29taW5nTmFtZSIsImluY29taW5nQ29udGVudCIsIl9vYmplY3RTcHJlYWQiLCJoYXNDb250ZW50IiwiaW50ZW50IiwiZG9jdW1lbnQiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIl9maWxlSW5wdXRSZWYkY3VycmVudCIsImNsaWNrIiwiaGFuZGxlQ2hhbmdlRmllbGQiLCJmaWVsZCIsInZhbHVlIiwibGVuZ3RoIiwicHJldiIsIl9kZWZpbmVQcm9wZXJ0eSIsImhhbmRsZVVwbG9hZENsaWNrIiwiX2ZpbGVJbnB1dFJlZiRjdXJyZW50MiIsImhhbmRsZUZpbGVDaGFuZ2UiLCJfcmVmMyIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwiX2V2ZW50JHRhcmdldCRmaWxlcyIsImZpbGUiLCJpc01hcmtkb3duIiwidGV4dCIsImJhc2VOYW1lIiwiX3QiLCJ3cmFwIiwiX2NvbnRleHQiLCJuZXh0IiwiZmlsZXMiLCJhYnJ1cHQiLCJ0ZXN0Iiwic2l6ZSIsInNlbnQiLCJyZXBsYWNlIiwiX3ByZXYkZ2VuZXJhbCIsInN0b3AiLCJfeCIsImFwcGx5IiwiYXJndW1lbnRzIiwiaGFuZGxlU2F2ZSIsIl9yZWY0IiwiX2NhbGxlZTIiLCJ1cGRhdGVkIiwiY3JlYXRlZCIsIl90MiIsIl9jb250ZXh0MiIsImZpbmlzaCIsImhhbmRsZUNvbmZpcm1EZWxldGUiLCJfcmVmNSIsIl9jYWxsZWUzIiwiX3QzIiwiX2NvbnRleHQzIiwiY29udGFpbmVyIiwiZ2V0RWxlbWVudEJ5SWQiLCJ6SW5kZXgiLCJvbkNsaWNrIiwiY2hpbGRyZW4iLCJzdG9wUHJvcGFnYXRpb24iLCJ0eXBlIiwiY29sb3IiLCJ3aWR0aCIsImhlaWdodCIsImh0bWxGb3IiLCJtYXhMZW5ndGgiLCJwbGFjZWhvbGRlciIsImRpc2FibGVkIiwib25DaGFuZ2UiLCJyZWYiLCJhY2NlcHQiLCIkYWN0aXZlIiwidmFyaWFudCIsIiRvdmVyTGltaXQiLCJ1c2VkIiwibWF4Iiwib25DbG9zZSIsImhhbmRsZXJzIiwiaGFuZGxlQ29uZmlybUFjdGlvbiIsImNoYXQiLCJ0aXRsZSIsImFjdGlvbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL29yZ2FuaXNtcy9BYm1Ta2lsbE1vZGFsL0FibVNraWxsTW9kYWwudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IENoYW5nZUV2ZW50LCBNb3VzZUV2ZW50LCB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjcmVhdGVQb3J0YWwgfSBmcm9tICdyZWFjdC1kb20nXG5pbXBvcnQgeyBDcm9zcyB9IGZyb20gJ0Bwcm9qZWN0Y29yL2ljb25zL2xpYi9jb21wb25lbnRzL0Nyb3NzJ1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICdyZWFjdC1pMThuZXh0J1xuaW1wb3J0IHsgTWFpYVN0cmVhbWRvd24gfSBmcm9tICcuLi8uLi9hdG9tcy9NYWlhU3RyZWFtZG93bidcbmltcG9ydCB7IEJhY2tkcm9wIH0gZnJvbSAnLi4vLi4vYXRvbXMvQmFja2Ryb3AnXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tICcuLi8uLi9hdG9tcy9Mb2FkZXInXG5pbXBvcnQgeyBTRUNUSU9OUyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9jb25maWcnXG5pbXBvcnQgeyB1c2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9jb3ItdXNlcidcbmltcG9ydCB7IHVzZVNuYWNrQmFyTWFuYWdlciB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVNuYWNrQmFyTWFuYWdlci91c2VTbmFja0Jhck1hbmFnZXInXG5pbXBvcnQgeyBjcmVhdGVTa2lsbCB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL21haWEvU2tpbGxzL2NyZWF0ZVNraWxsJ1xuaW1wb3J0IHsgdXBkYXRlU2tpbGwgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tYWlhL1NraWxscy91cGRhdGVTa2lsbCdcbmltcG9ydCB7IGRlbGV0ZVNraWxsIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbWFpYS9Ta2lsbHMvZGVsZXRlU2tpbGwnXG5pbXBvcnQgeyBTa2lsbCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL3NraWxsJ1xuaW1wb3J0IHsgZ2V0VW5pdEZpbGVTaXplIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZ2V0VW5pdEZpbGVTaXplJ1xuaW1wb3J0IHtcbiAgZ2V0U2tpbGxDb250ZW50Qnl0ZUxlbmd0aCxcbiAgaXNTa2lsbENvbnRlbnRPdmVyTGltaXQsXG4gIFNLSUxMX0NPTlRFTlRfTUFYX0JZVEVTLFxufSBmcm9tICcuLi8uLi8uLi91dGlscy9za2lsbENvbnRlbnRTaXplJ1xuaW1wb3J0IHsgRGVsZXRlUXVlc3Rpb25Nb2RhbCB9IGZyb20gJy4uL0RlbGV0ZVF1ZXN0aW9uTW9kYWwvRGVsZXRlUXVlc3Rpb25Nb2RhbCdcbmltcG9ydCB7IGdldFVzYWdlU3RvcmVTdGF0ZSB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL3VzZVVzYWdlU3RvcmUnXG5pbXBvcnQge1xuICBTQ0FTTUJ5dGVDb3VudGVyLFxuICBTQ0FTTUNhbmNlbEJ1dHRvbixcbiAgU0NBU01DbG9zZUJ1dHRvbixcbiAgU0NBU01Db250ZW50LFxuICBTQ0FTTURlbGV0ZVNsb3QsXG4gIFNDQVNNRmllbGQsXG4gIFNDQVNNRmllbGRIZWFkZXIsXG4gIFNDQVNNRm9vdGVyLFxuICBTQ0FTTUhlYWRlcixcbiAgU0NBU01IZWFkZXJBY3Rpb25zLFxuICBTQ0FTTUhlYWRlclRpdGxlLFxuICBTQ0FTTUhpZGRlbkZpbGVJbnB1dCxcbiAgU0NBU01JbnB1dCxcbiAgU0NBU01MYWJlbCxcbiAgU0NBU01QcmV2aWV3LFxuICBTQ0FTTVByZXZpZXdFbXB0eSxcbiAgU0NBU01TYXZlQnV0dG9uLFxuICBTQ0FTTVRleHRhcmVhLFxuICBTQ0FTTVRvZ2dsZUJ1dHRvbixcbiAgU0NBU01Ub2dnbGVHcm91cCxcbiAgU0NBU01VcGxvYWRCdXR0b24sXG4gIFNDQVNNV3JhcHBlcixcbn0gZnJvbSAnLi9BYm1Ta2lsbE1vZGFsLnN0eWxlcydcblxudHlwZSBTa2lsbE1vZGFsVmFsdWVzID0ge1xuICBpc0VkaXRpbmc6IGJvb2xlYW5cbiAgZ2VuZXJhbD86IHtcbiAgICBpZD86IHN0cmluZ1xuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBjb250ZW50Pzogc3RyaW5nXG4gIH1cbn1cblxudHlwZSBBYm1Ta2lsbE1vZGFsUHJvcHMgPSB7XG4gIGFkZFNraWxsPzogKHNraWxsOiBTa2lsbCkgPT4gdm9pZFxuICB1cGRhdGVTa2lsbEluTGlzdD86IChza2lsbDogU2tpbGwpID0+IHZvaWRcbiAgcmVtb3ZlU2tpbGw/OiAoc2tpbGxJZDogc3RyaW5nKSA9PiB2b2lkXG59XG5cbmNvbnN0IGluaXRpYWxWYWx1ZXM6IFNraWxsTW9kYWxWYWx1ZXMgPSB7XG4gIGlzRWRpdGluZzogZmFsc2UsXG4gIGdlbmVyYWw6IHsgaWQ6IHVuZGVmaW5lZCwgbmFtZTogJycsIGNvbnRlbnQ6ICcnIH0sXG59XG5cbmV4cG9ydCBjb25zdCBBYm1Ta2lsbE1vZGFsID0gKHsgYWRkU2tpbGwsIHVwZGF0ZVNraWxsSW5MaXN0LCByZW1vdmVTa2lsbCB9OiBBYm1Ta2lsbE1vZGFsUHJvcHMpID0+IHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUcmFuc2xhdGlvbihbU0VDVElPTlMuY2hhdEFJXSlcbiAgY29uc3QgdXNlciA9IHVzZVVzZXIoKVxuICBjb25zdCB7IGhhbmRsZVNuYWNrYmFyU3VjY2VzcywgaGFuZGxlU25hY2tiYXJFcnJvciB9ID0gdXNlU25hY2tCYXJNYW5hZ2VyKClcbiAgY29uc3QgW2lzT3Blbiwgc2V0SXNPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbaXNTdWJtaXR0aW5nLCBzZXRJc1N1Ym1pdHRpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtzaG93RGVsZXRlLCBzZXRTaG93RGVsZXRlXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbc2hvd1ByZXZpZXcsIHNldFNob3dQcmV2aWV3XSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbcGVuZGluZ1VwbG9hZCwgc2V0UGVuZGluZ1VwbG9hZF0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3ZhbHVlcywgc2V0VmFsdWVzXSA9IHVzZVN0YXRlPFNraWxsTW9kYWxWYWx1ZXM+KGluaXRpYWxWYWx1ZXMpXG4gIGNvbnN0IGZpbGVJbnB1dFJlZiA9IHVzZVJlZjxIVE1MSW5wdXRFbGVtZW50PihudWxsKVxuICAvLyBCYXNlbGluZSB0byBkZXRlY3QgY2hhbmdlczogdGhlIGxvYWRlZCB2YWx1ZXMgd2hlbiBlZGl0aW5nLCBlbXB0eSB3aGVuIGNyZWF0aW5nXG4gIC8vIChhIG5ldy9nZW5lcmF0ZWQvdXBsb2FkZWQgc2tpbGwgYWx3YXlzIGNvdW50cyBhcyBhIGNoYW5nZSkuXG4gIGNvbnN0IGluaXRpYWxSZWYgPSB1c2VSZWY8eyBuYW1lOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB9Pih7IG5hbWU6ICcnLCBjb250ZW50OiAnJyB9KVxuXG4gIGNvbnN0IHVzZXJQZXJtaXNzaW9ucyA9IHVzZXI/LnBlcm1pc3Npb25zPy5haV9hZ2VudHNcbiAgY29uc3QgY2FuQ3JlYXRlID0gISF1c2VyUGVybWlzc2lvbnM/LmNyZWF0ZVxuICBjb25zdCBjYW5FZGl0ID0gISF1c2VyUGVybWlzc2lvbnM/LmVkaXRcbiAgY29uc3QgY2FuRGVsZXRlID0gISF1c2VyUGVybWlzc2lvbnM/LmRlbGV0ZVxuXG4gIGNvbnN0IG5hbWUgPSB2YWx1ZXMuZ2VuZXJhbD8ubmFtZSB8fCAnJ1xuICBjb25zdCBjb250ZW50ID0gdmFsdWVzLmdlbmVyYWw/LmNvbnRlbnQgfHwgJydcbiAgY29uc3Qgc2tpbGxJZCA9IHZhbHVlcy5nZW5lcmFsPy5pZFxuICBjb25zdCBjb250ZW50Qnl0ZXMgPSB1c2VNZW1vKCgpID0+IGdldFNraWxsQ29udGVudEJ5dGVMZW5ndGgoY29udGVudCksIFtjb250ZW50XSlcbiAgY29uc3QgaXNPdmVyTGltaXQgPSBjb250ZW50Qnl0ZXMgPiBTS0lMTF9DT05URU5UX01BWF9CWVRFU1xuICBjb25zdCBpc1ZhbGlkID0gISFuYW1lLnRyaW0oKSAmJiAhIWNvbnRlbnQudHJpbSgpICYmICFpc092ZXJMaW1pdFxuICBjb25zdCBoYXNDaGFuZ2VzID0gbmFtZS50cmltKCkgIT09IGluaXRpYWxSZWYuY3VycmVudC5uYW1lIHx8IGNvbnRlbnQudHJpbSgpICE9PSBpbml0aWFsUmVmLmN1cnJlbnQuY29udGVudFxuXG4gIGNvbnN0IGhhbmRsZUNsb3NlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldElzT3BlbihmYWxzZSlcbiAgICBzZXRTaG93RGVsZXRlKGZhbHNlKVxuICAgIHNldFNob3dQcmV2aWV3KGZhbHNlKVxuICAgIHNldFBlbmRpbmdVcGxvYWQoZmFsc2UpXG4gICAgc2V0VmFsdWVzKGluaXRpYWxWYWx1ZXMpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IGhhbmRsZUJhY2tkcm9wQ2xpY2sgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC50YXJnZXQgPT09IGV2ZW50LmN1cnJlbnRUYXJnZXQpIHtcbiAgICAgICAgaGFuZGxlQ2xvc2UoKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2hhbmRsZUNsb3NlXVxuICApXG5cbiAgY29uc3Qgc2hvd1VzYWdlQmxvY2tlZEVycm9yID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgYmxvY2tlZCwgcXVvdGFFeGNlZWRlZE1lc3NhZ2UgfSA9IGdldFVzYWdlU3RvcmVTdGF0ZSgpXG4gICAgaWYgKCFibG9ja2VkKSByZXR1cm4gZmFsc2VcbiAgICBoYW5kbGVTbmFja2JhckVycm9yKHF1b3RhRXhjZWVkZWRNZXNzYWdlIHx8IHQoJ3VzYWdlQmxvY2tlZCcsIHsgZGVmYXVsdFZhbHVlOiAnVGUgcXVlZGFzdGUgc2luIHVzb3MgZGUgSUEuJyB9KSlcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVTZXRTa2lsbFZhbHVlcyA9IChldmVudDogYW55KSA9PiB7XG4gICAgICBjb25zdCB7IHNraWxsVmFsdWVzIH0gPSBldmVudC5kZXRhaWwgfHwge31cbiAgICAgIGlmICghc2tpbGxWYWx1ZXMpIHJldHVyblxuXG4gICAgICBpZiAoZ2V0VXNhZ2VTdG9yZVN0YXRlKCkuYmxvY2tlZCkge1xuICAgICAgICBjb25zdCB7IHF1b3RhRXhjZWVkZWRNZXNzYWdlIH0gPSBnZXRVc2FnZVN0b3JlU3RhdGUoKVxuICAgICAgICBoYW5kbGVTbmFja2JhckVycm9yKHF1b3RhRXhjZWVkZWRNZXNzYWdlIHx8IHQoJ3VzYWdlQmxvY2tlZCcsIHsgZGVmYXVsdFZhbHVlOiAnVGUgcXVlZGFzdGUgc2luIHVzb3MgZGUgSUEuJyB9KSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjb25zdCBpbmNvbWluZ05hbWUgPSAoc2tpbGxWYWx1ZXMudmFsdWVzPy5nZW5lcmFsPy5uYW1lIHx8ICcnKS50cmltKClcbiAgICAgIGNvbnN0IGluY29taW5nQ29udGVudCA9IChza2lsbFZhbHVlcy52YWx1ZXM/LmdlbmVyYWw/LmNvbnRlbnQgfHwgJycpLnRyaW0oKVxuICAgICAgLy8gRWRpdGluZyBhbiBleGlzdGluZyBza2lsbCAtPiBiYXNlbGluZSBpcyBpdHMgdmFsdWVzOyBjcmVhdGluZyAtPiBlbXB0eSBiYXNlbGluZS5cbiAgICAgIGluaXRpYWxSZWYuY3VycmVudCA9IHNraWxsVmFsdWVzLnZhbHVlcz8uaXNFZGl0aW5nXG4gICAgICAgID8geyBuYW1lOiBpbmNvbWluZ05hbWUsIGNvbnRlbnQ6IGluY29taW5nQ29udGVudCB9XG4gICAgICAgIDogeyBuYW1lOiAnJywgY29udGVudDogJycgfVxuXG4gICAgICBzZXRWYWx1ZXMoe1xuICAgICAgICAuLi5pbml0aWFsVmFsdWVzLFxuICAgICAgICAuLi5za2lsbFZhbHVlcy52YWx1ZXMsXG4gICAgICAgIGdlbmVyYWw6IHsgLi4uaW5pdGlhbFZhbHVlcy5nZW5lcmFsLCAuLi5za2lsbFZhbHVlcy52YWx1ZXM/LmdlbmVyYWwgfSxcbiAgICAgIH0pXG4gICAgICAvLyBDb24gY29udGVuaWRvIChlZGljacOzbiBvIHNraWxsIHlhIGdlbmVyYWRhKSBhcnJhbmNhbW9zIGVuIFwiVmlzdGEgcHJldmlhXCI7IHZhY8OtYSwgZW4gXCJFZGl0YXJcIi5cbiAgICAgIGNvbnN0IGhhc0NvbnRlbnQgPSAhIXNraWxsVmFsdWVzLnZhbHVlcz8uZ2VuZXJhbD8uY29udGVudD8udHJpbSgpXG4gICAgICBzZXRTaG93UHJldmlldyhoYXNDb250ZW50KVxuICAgICAgLy8gU2kgdmlubyBjb24gaW50ZW50IFwidXBsb2FkXCIsIGFicmltb3MgZWwgc2VsZWN0b3IgZGUgYXJjaGl2b3MgYWwgbW9udGFyLlxuICAgICAgc2V0UGVuZGluZ1VwbG9hZChza2lsbFZhbHVlcy52YWx1ZXM/LmludGVudCA9PT0gJ3VwbG9hZCcpXG4gICAgICBzZXRJc09wZW4oISFza2lsbFZhbHVlcy5pc09wZW4pXG4gICAgfVxuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYWJtLXNraWxsLW1vZGFsLXNldC12YWx1ZXMnLCBoYW5kbGVTZXRTa2lsbFZhbHVlcylcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJtLXNraWxsLW1vZGFsLXNldC12YWx1ZXMnLCBoYW5kbGVTZXRTa2lsbFZhbHVlcylcbiAgICB9XG4gIH0sIFtdKVxuXG4gIC8vIFdoZW4gb3BlbmVkIHdpdGggdGhlIFwidXBsb2FkXCIgaW50ZW50LCBvcGVuIHRoZSBPUyBmaWxlIHBpY2tlciBvbmNlIG1vdW50ZWQuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGlzT3BlbiAmJiBwZW5kaW5nVXBsb2FkKSB7XG4gICAgICBzZXRQZW5kaW5nVXBsb2FkKGZhbHNlKVxuICAgICAgZmlsZUlucHV0UmVmLmN1cnJlbnQ/LmNsaWNrKClcbiAgICB9XG4gIH0sIFtpc09wZW4sIHBlbmRpbmdVcGxvYWRdKVxuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZUZpZWxkID0gKGZpZWxkOiAnbmFtZScgfCAnY29udGVudCcsIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoZmllbGQgPT09ICdjb250ZW50JyAmJiBpc1NraWxsQ29udGVudE92ZXJMaW1pdCh2YWx1ZSkpIHtcbiAgICAgIGlmICh2YWx1ZS5sZW5ndGggLSBjb250ZW50Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgaGFuZGxlU25hY2tiYXJFcnJvcih0KCdteVNraWxscy5jb250ZW50U2l6ZUVycm9yJykpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgc2V0VmFsdWVzKHByZXYgPT4gKHtcbiAgICAgIC4uLnByZXYsXG4gICAgICBnZW5lcmFsOiB7IC4uLnByZXYuZ2VuZXJhbCwgW2ZpZWxkXTogdmFsdWUgfSxcbiAgICB9KSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVVwbG9hZENsaWNrID0gKCkgPT4ge1xuICAgIGZpbGVJbnB1dFJlZi5jdXJyZW50Py5jbGljaygpXG4gIH1cblxuICBjb25zdCBoYW5kbGVGaWxlQ2hhbmdlID0gYXN5bmMgKGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQuZmlsZXM/LlswXVxuICAgIC8vIFJlc2V0IHRoZSBpbnB1dCAodmlhIHJlZikgc28gc2VsZWN0aW5nIHRoZSBzYW1lIGZpbGUgYWdhaW4gc3RpbGwgZmlyZXMgb25DaGFuZ2UuXG4gICAgaWYgKGZpbGVJbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICBmaWxlSW5wdXRSZWYuY3VycmVudC52YWx1ZSA9ICcnXG4gICAgfVxuICAgIGlmICghZmlsZSkgcmV0dXJuXG5cbiAgICBjb25zdCBpc01hcmtkb3duID0gL1xcLihtZHxtYXJrZG93bikkL2kudGVzdChmaWxlLm5hbWUpXG4gICAgaWYgKCFpc01hcmtkb3duKSB7XG4gICAgICBoYW5kbGVTbmFja2JhckVycm9yKHQoJ215U2tpbGxzLnVwbG9hZEVycm9yJykpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoZmlsZS5zaXplID4gU0tJTExfQ09OVEVOVF9NQVhfQllURVMpIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyRXJyb3IodCgnbXlTa2lsbHMudXBsb2FkU2l6ZUVycm9yJykpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IGZpbGUudGV4dCgpXG4gICAgICBpZiAoaXNTa2lsbENvbnRlbnRPdmVyTGltaXQodGV4dCkpIHtcbiAgICAgICAgaGFuZGxlU25hY2tiYXJFcnJvcih0KCdteVNraWxscy51cGxvYWRTaXplRXJyb3InKSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjb25zdCBiYXNlTmFtZSA9IGZpbGUubmFtZS5yZXBsYWNlKC9cXC4obWR8bWFya2Rvd24pJC9pLCAnJylcbiAgICAgIHNldFZhbHVlcyhwcmV2ID0+ICh7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIGdlbmVyYWw6IHtcbiAgICAgICAgICAuLi5wcmV2LmdlbmVyYWwsXG4gICAgICAgICAgY29udGVudDogdGV4dCxcbiAgICAgICAgICAvLyBPbmx5IGZpbGwgdGhlIG5hbWUgZnJvbSB0aGUgZmlsZW5hbWUgd2hlbiBpdCdzIHN0aWxsIGVtcHR5LlxuICAgICAgICAgIG5hbWU6IHByZXYuZ2VuZXJhbD8ubmFtZT8udHJpbSgpID8gcHJldi5nZW5lcmFsLm5hbWUgOiBiYXNlTmFtZSxcbiAgICAgICAgfSxcbiAgICAgIH0pKVxuICAgICAgLy8gVHJhcyBzdWJpciB1biAubWQgbW9zdHJhbW9zIGVsIHJlc3VsdGFkbyByZW5kZXJpemFkbyBwb3IgZGVmZWN0by5cbiAgICAgIHNldFNob3dQcmV2aWV3KHRydWUpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyRXJyb3IodCgnbXlTa2lsbHMudXBsb2FkRXJyb3InKSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVTYXZlID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaXNWYWxpZCB8fCBpc1N1Ym1pdHRpbmcpIHJldHVyblxuICAgIGlmIChzaG93VXNhZ2VCbG9ja2VkRXJyb3IoKSkgcmV0dXJuXG4gICAgc2V0SXNTdWJtaXR0aW5nKHRydWUpXG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZXMuaXNFZGl0aW5nICYmIHNraWxsSWQpIHtcbiAgICAgICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHVwZGF0ZVNraWxsKHNraWxsSWQsIHsgbmFtZTogbmFtZS50cmltKCksIGNvbnRlbnQ6IGNvbnRlbnQudHJpbSgpIH0pXG4gICAgICAgIHVwZGF0ZVNraWxsSW5MaXN0Py4odXBkYXRlZClcbiAgICAgICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzKHQoJ215U2tpbGxzLnVwZGF0ZVN1Y2Nlc3MnKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBjcmVhdGVTa2lsbCh7IG5hbWU6IG5hbWUudHJpbSgpLCBjb250ZW50OiBjb250ZW50LnRyaW0oKSB9KVxuICAgICAgICBhZGRTa2lsbD8uKGNyZWF0ZWQpXG4gICAgICAgIGhhbmRsZVNuYWNrYmFyU3VjY2Vzcyh0KCdteVNraWxscy5jcmVhdGVTdWNjZXNzJykpXG4gICAgICB9XG4gICAgICBoYW5kbGVDbG9zZSgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyRXJyb3IodmFsdWVzLmlzRWRpdGluZyA/IHQoJ215U2tpbGxzLnVwZGF0ZUVycm9yJykgOiB0KCdteVNraWxscy5jcmVhdGVFcnJvcicpKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRJc1N1Ym1pdHRpbmcoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQ29uZmlybURlbGV0ZSA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXNraWxsSWQpIHJldHVyblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkZWxldGVTa2lsbChza2lsbElkKVxuICAgICAgcmVtb3ZlU2tpbGw/Lihza2lsbElkKVxuICAgICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzKHQoJ215U2tpbGxzLmRlbGV0ZVN1Y2Nlc3MnKSlcbiAgICAgIGhhbmRsZUNsb3NlKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaGFuZGxlU25hY2tiYXJFcnJvcih0KCdteVNraWxscy5kZWxldGVFcnJvcicpKVxuICAgIH1cbiAgfVxuXG4gIGlmICghaXNPcGVuKSByZXR1cm4gbnVsbFxuICBpZiAoIWNhbkNyZWF0ZSAmJiAhY2FuRWRpdCAmJiAhY2FuRGVsZXRlKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RhbC1yb290LWFjdGlvbnMnKVxuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuIG51bGxcblxuICByZXR1cm4gY3JlYXRlUG9ydGFsKFxuICAgIDxCYWNrZHJvcCB6SW5kZXg9ezExMTJ9IG9uQ2xpY2s9e2hhbmRsZUJhY2tkcm9wQ2xpY2t9PlxuICAgICAgPFNDQVNNV3JhcHBlciBvbkNsaWNrPXtldmVudCA9PiBldmVudC5zdG9wUHJvcGFnYXRpb24oKX0+XG4gICAgICAgIDxTQ0FTTUhlYWRlcj5cbiAgICAgICAgICA8U0NBU01IZWFkZXJUaXRsZT57dmFsdWVzLmlzRWRpdGluZyA/IHQoJ215U2tpbGxzLmVkaXRUaXRsZScpIDogdCgnbXlTa2lsbHMuY3JlYXRlVGl0bGUnKX08L1NDQVNNSGVhZGVyVGl0bGU+XG4gICAgICAgICAgPFNDQVNNQ2xvc2VCdXR0b24gdHlwZT1cImJ1dHRvblwiIG9uQ2xpY2s9e2hhbmRsZUNsb3NlfSBhcmlhLWxhYmVsPXt0KCdteVNraWxscy5jbG9zZScpfT5cbiAgICAgICAgICAgIDxDcm9zcyBjb2xvcj1cIiNhNmE2YTZcIiB3aWR0aD17MTh9IGhlaWdodD17MTh9IC8+XG4gICAgICAgICAgPC9TQ0FTTUNsb3NlQnV0dG9uPlxuICAgICAgICA8L1NDQVNNSGVhZGVyPlxuXG4gICAgICAgIDxTQ0FTTUNvbnRlbnQ+XG4gICAgICAgICAgPFNDQVNNRmllbGQ+XG4gICAgICAgICAgICA8U0NBU01MYWJlbCBodG1sRm9yPVwic2tpbGwtbmFtZS1pbnB1dFwiPnt0KCdteVNraWxscy5uYW1lTGFiZWwnKX08L1NDQVNNTGFiZWw+XG4gICAgICAgICAgICA8U0NBU01JbnB1dFxuICAgICAgICAgICAgICBpZD1cInNraWxsLW5hbWUtaW5wdXRcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIG1heExlbmd0aD17MTUwfVxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17dCgnbXlTa2lsbHMubmFtZVBsYWNlaG9sZGVyJyl9XG4gICAgICAgICAgICAgIHZhbHVlPXtuYW1lfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17aXNTdWJtaXR0aW5nfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17ZXZlbnQgPT4gaGFuZGxlQ2hhbmdlRmllbGQoJ25hbWUnLCBldmVudC50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L1NDQVNNRmllbGQ+XG5cbiAgICAgICAgICA8U0NBU01GaWVsZD5cbiAgICAgICAgICAgIDxTQ0FTTUZpZWxkSGVhZGVyPlxuICAgICAgICAgICAgICA8U0NBU01MYWJlbCBodG1sRm9yPVwic2tpbGwtY29udGVudC1pbnB1dFwiPnt0KCdteVNraWxscy5jb250ZW50TGFiZWwnKX08L1NDQVNNTGFiZWw+XG4gICAgICAgICAgICAgIDxTQ0FTTUhlYWRlckFjdGlvbnM+XG4gICAgICAgICAgICAgICAgPFNDQVNNVXBsb2FkQnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXtoYW5kbGVVcGxvYWRDbGlja30gZGlzYWJsZWQ9e2lzU3VibWl0dGluZ30+XG4gICAgICAgICAgICAgICAgICB7dCgnbXlTa2lsbHMudXBsb2FkTWQnKX1cbiAgICAgICAgICAgICAgICA8L1NDQVNNVXBsb2FkQnV0dG9uPlxuICAgICAgICAgICAgICAgIDxTQ0FTTUhpZGRlbkZpbGVJbnB1dFxuICAgICAgICAgICAgICAgICAgcmVmPXtmaWxlSW5wdXRSZWZ9XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICAgICAgICBhY2NlcHQ9XCIubWQsLm1hcmtkb3duLHRleHQvbWFya2Rvd25cIlxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUZpbGVDaGFuZ2V9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8U0NBU01Ub2dnbGVHcm91cD5cbiAgICAgICAgICAgICAgICAgIDxTQ0FTTVRvZ2dsZUJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgJGFjdGl2ZT17IXNob3dQcmV2aWV3fSBvbkNsaWNrPXsoKSA9PiBzZXRTaG93UHJldmlldyhmYWxzZSl9PlxuICAgICAgICAgICAgICAgICAgICB7dCgnbXlTa2lsbHMuZWRpdCcpfVxuICAgICAgICAgICAgICAgICAgPC9TQ0FTTVRvZ2dsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxTQ0FTTVRvZ2dsZUJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgJGFjdGl2ZT17c2hvd1ByZXZpZXd9IG9uQ2xpY2s9eygpID0+IHNldFNob3dQcmV2aWV3KHRydWUpfT5cbiAgICAgICAgICAgICAgICAgICAge3QoJ215U2tpbGxzLnByZXZpZXcnKX1cbiAgICAgICAgICAgICAgICAgIDwvU0NBU01Ub2dnbGVCdXR0b24+XG4gICAgICAgICAgICAgICAgPC9TQ0FTTVRvZ2dsZUdyb3VwPlxuICAgICAgICAgICAgICA8L1NDQVNNSGVhZGVyQWN0aW9ucz5cbiAgICAgICAgICAgIDwvU0NBU01GaWVsZEhlYWRlcj5cbiAgICAgICAgICAgIHtzaG93UHJldmlldyA/IChcbiAgICAgICAgICAgICAgPFNDQVNNUHJldmlldz5cbiAgICAgICAgICAgICAgICB7Y29udGVudC50cmltKCkgPyAoXG4gICAgICAgICAgICAgICAgICA8TWFpYVN0cmVhbWRvd24gdmFyaWFudD1cInByZXZpZXdcIj57Y29udGVudH08L01haWFTdHJlYW1kb3duPlxuICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICA8U0NBU01QcmV2aWV3RW1wdHk+e3QoJ215U2tpbGxzLnByZXZpZXdFbXB0eScpfTwvU0NBU01QcmV2aWV3RW1wdHk+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9TQ0FTTVByZXZpZXc+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICA8U0NBU01UZXh0YXJlYVxuICAgICAgICAgICAgICAgIGlkPVwic2tpbGwtY29udGVudC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3QoJ215U2tpbGxzLmNvbnRlbnRQbGFjZWhvbGRlcicpfVxuICAgICAgICAgICAgICAgIHZhbHVlPXtjb250ZW50fVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc1N1Ym1pdHRpbmd9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e2V2ZW50ID0+IGhhbmRsZUNoYW5nZUZpZWxkKCdjb250ZW50JywgZXZlbnQudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8U0NBU01CeXRlQ291bnRlciAkb3ZlckxpbWl0PXtpc092ZXJMaW1pdH0gYXJpYS1saXZlPVwicG9saXRlXCI+XG4gICAgICAgICAgICAgIHt0KCdteVNraWxscy5ieXRlc0NvdW50ZXInLCB7XG4gICAgICAgICAgICAgICAgdXNlZDogZ2V0VW5pdEZpbGVTaXplKGNvbnRlbnRCeXRlcyksXG4gICAgICAgICAgICAgICAgbWF4OiBnZXRVbml0RmlsZVNpemUoU0tJTExfQ09OVEVOVF9NQVhfQllURVMpLFxuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvU0NBU01CeXRlQ291bnRlcj5cbiAgICAgICAgICA8L1NDQVNNRmllbGQ+XG4gICAgICAgIDwvU0NBU01Db250ZW50PlxuXG4gICAgICAgIDxTQ0FTTUZvb3Rlcj5cbiAgICAgICAgICB7dmFsdWVzLmlzRWRpdGluZyAmJiBjYW5EZWxldGUgPyAoXG4gICAgICAgICAgICA8U0NBU01EZWxldGVTbG90PlxuICAgICAgICAgICAgICA8U0NBU01DYW5jZWxCdXR0b24gdHlwZT1cImJ1dHRvblwiIG9uQ2xpY2s9eygpID0+IHNldFNob3dEZWxldGUodHJ1ZSl9IGRpc2FibGVkPXtpc1N1Ym1pdHRpbmd9PlxuICAgICAgICAgICAgICAgIHt0KCdteVNraWxscy5kZWxldGUnKX1cbiAgICAgICAgICAgICAgPC9TQ0FTTUNhbmNlbEJ1dHRvbj5cbiAgICAgICAgICAgIDwvU0NBU01EZWxldGVTbG90PlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgIDxTQ0FTTUNhbmNlbEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17aGFuZGxlQ2xvc2V9IGRpc2FibGVkPXtpc1N1Ym1pdHRpbmd9PlxuICAgICAgICAgICAge3QoJ215U2tpbGxzLmNhbmNlbCcpfVxuICAgICAgICAgIDwvU0NBU01DYW5jZWxCdXR0b24+XG4gICAgICAgICAgPFNDQVNNU2F2ZUJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17aGFuZGxlU2F2ZX0gZGlzYWJsZWQ9eyFpc1ZhbGlkIHx8IGlzU3VibWl0dGluZyB8fCAhaGFzQ2hhbmdlc30+XG4gICAgICAgICAgICB7aXNTdWJtaXR0aW5nID8gPExvYWRlciBzaXplPVwic21hbGxcIiAvPiA6IHQoJ215U2tpbGxzLnNhdmUnKX1cbiAgICAgICAgICA8L1NDQVNNU2F2ZUJ1dHRvbj5cbiAgICAgICAgPC9TQ0FTTUZvb3Rlcj5cbiAgICAgIDwvU0NBU01XcmFwcGVyPlxuXG4gICAgICB7c2hvd0RlbGV0ZSAmJiBza2lsbElkID8gKFxuICAgICAgICA8RGVsZXRlUXVlc3Rpb25Nb2RhbFxuICAgICAgICAgIG9uQ2xvc2U9eygpID0+IHNldFNob3dEZWxldGUoZmFsc2UpfVxuICAgICAgICAgIGhhbmRsZXJzPXt7XG4gICAgICAgICAgICBoYW5kbGVDb25maXJtQWN0aW9uOiBoYW5kbGVDb25maXJtRGVsZXRlLFxuICAgICAgICAgIH19XG4gICAgICAgICAgY2hhdD17eyB0aXRsZTogbmFtZSwgaWQ6IHNraWxsSWQgfX1cbiAgICAgICAgICBhY3Rpb249XCJza2lsbFwiXG4gICAgICAgIC8+XG4gICAgICApIDogbnVsbH1cbiAgICA8L0JhY2tkcm9wPixcbiAgICBjb250YWluZXJcbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBLFNBQWtDQSxXQUFXLEVBQUVDLFNBQVMsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBQ2xHLFNBQVNDLFlBQVksUUFBUSxXQUFXO0FBQ3hDLFNBQVNDLEtBQUssUUFBUSx3Q0FBd0M7QUFDOUQsU0FBU0MsY0FBYyxRQUFRLGVBQWU7QUFDOUMsU0FBU0MsY0FBYyxRQUFRLDRCQUE0QjtBQUMzRCxTQUFTQyxRQUFRLFFBQVEsc0JBQXNCO0FBQy9DLFNBQVNDLE1BQU0sUUFBUSxvQkFBb0I7QUFD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