@projectcor/maia-components 2.49.0-beta.1 → 2.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.js +37 -0
  2. package/lib/components/atoms/ApprovalBox/ApprovalBox.js +3 -37
  3. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +117 -0
  4. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +31 -101
  5. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +91 -0
  6. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +49 -140
  7. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +257 -0
  8. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +53 -205
  9. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.js +4 -0
  10. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +2 -4
  11. package/lib/components/atoms/ClientSelector/ClientSelector.helpers.js +26 -0
  12. package/lib/components/atoms/ClientSelector/ClientSelector.js +12 -21
  13. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.js +227 -0
  14. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +15 -255
  15. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +59 -0
  16. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +12 -57
  17. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +74 -0
  18. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +184 -0
  19. package/lib/components/atoms/MAIAInput/MAIAInput.js +127 -176
  20. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +96 -0
  21. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +40 -113
  22. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.js +17 -0
  23. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +3 -15
  24. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +3 -4
  25. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +3 -11
  26. package/lib/components/atoms/ReasoningBlock/reasoningLeading.js +6 -1
  27. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +2 -3
  28. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.js +10 -0
  29. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.js +101 -0
  30. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +21 -77
  31. package/lib/components/atoms/TextArea/TextArea.helpers.js +23 -0
  32. package/lib/components/atoms/TextArea/TextArea.js +11 -20
  33. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.js +37 -0
  34. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +6 -29
  35. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +68 -0
  36. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +17 -56
  37. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +133 -0
  38. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +31 -112
  39. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.js +17 -0
  40. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +5 -15
  41. package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.js +370 -0
  42. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +197 -233
  43. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +398 -0
  44. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +209 -235
  45. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +515 -4
  46. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +228 -344
  47. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.js +5 -0
  48. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +3 -2
  49. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +49 -0
  50. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +36 -33
  51. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.js +39 -0
  52. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +30 -33
  53. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.js +41 -0
  54. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +9 -35
  55. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.js +48 -0
  56. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +9 -44
  57. package/lib/components/molecules/Sidebar/Sidebar.helpers.js +43 -0
  58. package/lib/components/molecules/Sidebar/Sidebar.js +25 -22
  59. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +512 -0
  60. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +309 -643
  61. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.js +37 -0
  62. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +13 -25
  63. package/lib/constants/formatExtensions.js +7 -8
  64. package/lib/dev/DevReasoningTimeline.js +8 -50
  65. package/lib/hooks/useAgentModel/useCreateAgent.helpers.js +144 -0
  66. package/lib/hooks/useAgentModel/useCreateAgent.js +38 -102
  67. package/lib/hooks/useChatManager/useChatManager.helpers.js +902 -0
  68. package/lib/hooks/useChatManager/useChatManager.js +267 -741
  69. package/lib/hooks/useChatMessages/useChatMessages.helpers.js +365 -0
  70. package/lib/hooks/useChatMessages/useChatMessages.js +59 -285
  71. package/lib/hooks/useClientSearch.helpers.js +36 -0
  72. package/lib/hooks/useClientSearch.js +4 -32
  73. package/lib/hooks/useContextMentions.helpers.js +212 -0
  74. package/lib/hooks/useContextMentions.js +5 -223
  75. package/lib/hooks/useContextMentions.types.js +2 -0
  76. package/lib/hooks/useContextPinPopover.helpers.js +95 -0
  77. package/lib/hooks/useContextPinPopover.js +16 -75
  78. package/lib/hooks/useEntitySearch.helpers.js +407 -0
  79. package/lib/hooks/useEntitySearch.js +52 -436
  80. package/lib/hooks/useMentionPopover.helpers.js +41 -0
  81. package/lib/hooks/useMentionPopover.js +9 -35
  82. package/lib/hooks/useMinimizedPillBottomOffset.helpers.js +47 -0
  83. package/lib/hooks/useMinimizedPillBottomOffset.js +15 -45
  84. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.js +86 -0
  85. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +8 -82
  86. package/lib/hooks/useProjectSearch.helpers.js +61 -0
  87. package/lib/hooks/useProjectSearch.js +4 -58
  88. package/lib/hooks/useProjectSummaryConfig.helpers.js +62 -0
  89. package/lib/hooks/useProjectSummaryConfig.js +14 -52
  90. package/lib/hooks/useReasoningTrace/reasoningStore.js +8 -39
  91. package/lib/hooks/useRecentClientsSearch.helpers.js +33 -0
  92. package/lib/hooks/useRecentClientsSearch.js +4 -32
  93. package/lib/lang/br/index.js +1 -7
  94. package/lib/lang/en/index.js +1 -7
  95. package/lib/lang/es/index.js +1 -7
  96. package/lib/lang/fr/index.js +1 -7
  97. package/lib/services/maia/Agents/getAgents.helpers.js +241 -0
  98. package/lib/services/maia/Agents/getAgents.js +90 -282
  99. package/lib/services/maia/Orchestrator/orchestrator.helpers.js +130 -0
  100. package/lib/services/maia/Orchestrator/orchestrator.js +38 -121
  101. package/lib/services/utils/mapChatMessages.helpers.js +223 -0
  102. package/lib/services/utils/mapChatMessages.js +25 -254
  103. package/lib/store/sessions/sessionNotifications.helpers.js +45 -0
  104. package/lib/store/sessions/sessionNotifications.js +35 -41
  105. package/lib/store/sessions/sessionStreamManager.helpers.js +134 -0
  106. package/lib/store/sessions/sessionStreamManager.js +172 -236
  107. package/lib/test/mockSseStream.js +121 -0
  108. package/lib/test/streamdownCodeMock.js +6 -0
  109. package/lib/test/streamdownMock.js +12 -0
  110. package/lib/types/Chat.js +1 -1
  111. package/lib/types/agentModal.js +1 -1
  112. package/lib/types/reasoning.js +1 -1
  113. package/lib/utils/imagePreprocessor.helpers.js +28 -0
  114. package/lib/utils/imagePreprocessor.js +12 -37
  115. package/lib/utils/renderContextMentions.helpers.js +110 -0
  116. package/lib/utils/renderContextMentions.js +4 -110
  117. package/lib/utils/streamActivityMessages.helpers.js +222 -0
  118. package/lib/utils/streamActivityMessages.js +4 -221
  119. package/package.json +2 -2
  120. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.js +0 -53
  121. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.styles.js +0 -8
  122. package/lib/components/atoms/ContextCompactedNotice/index.js +0 -2
  123. package/lib/types/contextCompaction.js +0 -48
  124. package/lib/types/jest-dom.d.js +0 -2
@@ -1,9 +1,9 @@
1
- import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
3
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
- import _regeneratorRuntime from "@babel/runtime/regenerator";
5
4
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
6
5
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
6
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
7
7
  /* eslint-disable no-nested-ternary */
8
8
  /* eslint-disable @typescript-eslint/indent */
9
9
  /* eslint-disable react/jsx-no-useless-fragment */
@@ -19,7 +19,7 @@ import ReactDOM from 'react-dom';
19
19
  import moment from 'moment';
20
20
  import { useTranslation } from 'react-i18next';
21
21
  import { useUser } from '../../../context/cor-user';
22
- import { canAccessToChatAI, canAccessToSkills } from '../../../constants/permissions';
22
+ import { canAccessToSkills } from '../../../constants/permissions';
23
23
  import { MAIAError } from '../../atoms/MAIAError';
24
24
  import { useMaiaTaskPanelZIndex } from '../../../hooks/useMaiaTaskPanelZIndex';
25
25
  import { ChatAIContent } from '../ChatAIContent';
@@ -39,63 +39,32 @@ import { SCCAIMContent, SCCAIMContentWrapper, SCCAIMMinimizedHide, SCCAIMWrapper
39
39
  import { MaiaMinimizedPill } from './components/MaiaMinimizedPill';
40
40
  import { useMinimizedPillNoveltyDot } from '../../../hooks/useMinimizedPillNoveltyDot';
41
41
  import { getMaiaFloatingPanelWidthPx, resolveInitialMaiaChatLayoutMode, setStoredMaiaChatLayoutMode } from './layout';
42
- import { dispatchSkillMentionInsert, ensureAgentsBeforeSkillUse } from './ChatAIModal.helpers';
43
42
  import { FloatingPanelMotion, useFloatingPanelDragTilt } from './floatingPanelMotion';
44
43
  import { ChatAiModalFooter } from './components/ChatAiModalFooter';
45
- import { validateIsMaia } from '../../../services/utils/validateIsMaia';
46
44
  import { isMarketplaceGlobalCloneAgent } from '../../../utils/agentDisplayName';
47
45
  import { useFaqsStore } from '../../../store/useFaqsStore';
48
46
  import { getChatsStoreState, useChatsStore } from '../../../store/useChatsStore';
49
47
  import { readLastActiveChatId, writeLastActiveChatId } from '../../../store/maiaLastChatPersistence';
50
- import { clearMaiaPanelSession, isValidMaiaPanelOption, patchMaiaPanelSession, readMaiaPanelSession, writeMaiaPanelSession } from '../../../store/maiaPanelSessionPersistence';
48
+ import { clearMaiaPanelSession, patchMaiaPanelSession, readMaiaPanelSession, writeMaiaPanelSession } from '../../../store/maiaPanelSessionPersistence';
51
49
  import { useSessionsStore } from '../../../store/sessions/useSessionsStore';
52
- import { isActiveSessionStatus } from '../../../store/sessions/sessions.types';
53
50
  import { fetchMaia } from '../../../services/maia/client';
54
51
  import { fetchAgentDetail } from '../../../services/maia/Agents/fetchAgentDetail';
55
52
  import { mapCORLang } from '../../../lang/utils';
56
53
  import { EVENTS, useEvent } from '../../../hooks/useEvent';
57
54
  import { MAIA_OPEN_FROM_HOST_EVENT } from '../../../utils/maiaHostOpen';
55
+ import { clampFloatingPanelPosition, hasAnyActiveSessionInMeta, hasBannerFaqTitle, isBannerFaqReadyToAutoSend, resolveAiChatBackDestination, resolveComputedCurrentOption, resolveInitialCurrentOption, resolveLegacyContextSession, resolveSidebarAgentsNavActive, shouldRestoreExpandedPanel, shouldSkipFloatingDragTarget, validateAccessByFeature, resolveHostTakeoverEntityState, buildHostTakeoverPersistContext, buildMaiaPanelSessionPatch, dispatchSkillMentionInsert, ensureAgentsBeforeSkillUse, resolveFloatingPanelDragPosition, resolveHostTakeoverAgentId, resolveMaiaModalI18nLang, resolveMinimizedRestoreTarget, resolveNextDragPosition, resolveUserHasAgentManagementPermissions, shouldBackClearPinnedContext, shouldBackStartNewChatPreservingContext, shouldMarkOrchestratorContextReset, shouldStartNewChatFromCatalog, resolveHasPinnedContext, resolveOrchestratorHomeNavFlags, shouldShowOrchestratorBackButton, shouldClearClientOnGoHomeFromChat, shouldClearTaskOnGoHomeFromChat, shouldResetAgentToFirstOnGoHome, shouldClearOrchestratorGlobalContextOnGoHome, shouldUseActiveChatSendHandler, shouldPrefetchAgentsForCatalogNewChat, canOpenMaiaMarketplace, shouldMarkAgentAsLegacyContext, buildLegacyContextAgent, buildLegacyContextMigrationPatch, findOrchestratorAgent, shouldSetChatViewHiddenOnMount, shouldPersistLastActiveChatId, shouldSyncPanelSessionOnPageHide, resolveCachedAgentsIfAvailable, shouldAttemptInitialAgentsFetch, findAgentForChatItem, shouldApplyClientOnHostTakeover, shouldSelectFirstAgentOnHostTakeover, shouldResetChatStateOnGoHome, shouldClearContextForCatalogOrSkillAgent, resolveOpenNewChatWithAgentContext, canContinueLegacyContextInNewChat, resolveSessionRestoreNavRoute, shouldSkipAgentsLoadOnSessionRestore, shouldFetchAgentDetailOnSessionRestore, shouldPassAgentToGetAgentsOnRestore, shouldSelectFetchedAgentAfterRestore, resolveSnapshotChipsProject, resolveChatModalSectionFlags, shouldRenderChatSidebar, resolveChatModalMainContentView, shouldShowChatModalFooter, shouldUseElevatedMaiaPanel, shouldReselectAgentAfterDelete, shouldClearDragPositionOnLayoutChange, shouldStartFloatingPanelDrag, isActiveFloatingDragPointer, shouldOpenSkillsCatalog, shouldUseDragClampFallback, resolveLayoutDragPositionUpdate, resolvePersistedDragPositionOnEnd, buildUserInitialMessageFromStartChat, shouldResetSidebarErrorOnStartChat } from './ChatAIModal.helpers';
58
56
 
59
57
  /** Metadata de la session abierta (emitida por useChatMessages al cargar una conversación). */
60
58
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
61
- var LEGACY_CONTEXT_ENTITIES = ['project', 'task', 'client'];
62
- /** Home global del orchestrator (solo header). Planner es home de FUAs, no de contextos. */
63
- var isGlobalMaiaSection = function isGlobalMaiaSection(section) {
64
- return section === 'header';
65
- };
66
- var resolveAiChatBackDestination = function resolveAiChatBackDestination(section, agentType, currentOption, homeOption) {
67
- if (isGlobalMaiaSection(section) && agentType === 'orchestrator' && currentOption === homeOption) {
68
- return 'global_context_home';
69
- }
70
- if (section === 'task') return 'task_home';
71
- if (section === 'planner') return 'planner_home';
72
- if (section === 'project') return 'project_home';
73
- if (section === 'client') return 'client_home';
74
- return 'global_context_home';
75
- };
76
59
  export var ID_MODAL_CHAT_AGENT = 'modals-portal-maia-chat-agent';
77
- var validateAccessByFeature = function validateAccessByFeature(section, user) {
78
- if (!section || !canAccessToChatAI(user)) {
79
- return false;
80
- }
81
-
82
- // Planner y task abren siempre el chat (home de FUAs), nunca resumen de proyectos.
83
- if (section === 'planner' || section === 'task') {
84
- return true;
85
- }
86
- if (section === 'header') {
87
- return Boolean(window.MAIA_CHAT_AI_FEATURE_ACCESS || window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS);
88
- }
89
- return Boolean(window.MAIA_CHAT_AI_FEATURE_ACCESS);
90
- };
91
60
  export var ChatAIModal = function ChatAIModal() {
92
- var _savedSessionOnMountR, _savedSessionOnMountR2, _savedSessionOnMountR3, _savedSessionOnMountR4, _user$permissions, _user$permissions2, _user$permissions3, _savedSessionOnMountR7, _savedSessionOnMountR8, _agents$data;
61
+ var _savedSessionOnMountR, _savedSessionOnMountR2, _savedSessionOnMountR5, _savedSessionOnMountR6;
93
62
  var user = useUser();
94
63
  var _useTranslation = useTranslation([SECTIONS.abmAgent]),
95
64
  i18n = _useTranslation.i18n;
96
65
  var amplitudEvent = useEvent();
97
66
  var savedSessionOnMountRef = useRef(readMaiaPanelSession(user.id));
98
- var shouldRestoreExpanded = (_savedSessionOnMountR = (_savedSessionOnMountR2 = savedSessionOnMountRef.current) === null || _savedSessionOnMountR2 === void 0 ? void 0 : _savedSessionOnMountR2.isExpanded) !== null && _savedSessionOnMountR !== void 0 ? _savedSessionOnMountR : false;
67
+ var shouldRestoreExpanded = shouldRestoreExpandedPanel(savedSessionOnMountRef.current);
99
68
  var pendingSessionRestoreRef = useRef(shouldRestoreExpanded ? savedSessionOnMountRef.current : null);
100
69
  var sessionRestoreStartedRef = useRef(false);
101
70
  var _useState = useState(function () {
@@ -104,7 +73,7 @@ export var ChatAIModal = function ChatAIModal() {
104
73
  _useState2 = _slicedToArray(_useState, 2),
105
74
  isRestoringSession = _useState2[0],
106
75
  setIsRestoringSession = _useState2[1];
107
- var sidebarOpenRef = useRef((_savedSessionOnMountR3 = (_savedSessionOnMountR4 = savedSessionOnMountRef.current) === null || _savedSessionOnMountR4 === void 0 ? void 0 : _savedSessionOnMountR4.sidebarOpen) !== null && _savedSessionOnMountR3 !== void 0 ? _savedSessionOnMountR3 : false);
76
+ var sidebarOpenRef = useRef((_savedSessionOnMountR = (_savedSessionOnMountR2 = savedSessionOnMountRef.current) === null || _savedSessionOnMountR2 === void 0 ? void 0 : _savedSessionOnMountR2.sidebarOpen) !== null && _savedSessionOnMountR !== void 0 ? _savedSessionOnMountR : false);
108
77
 
109
78
  // Tras navegar en el host (full page reload), restauramos el panel si estaba abierto.
110
79
  var _useState3 = useState(function () {
@@ -126,9 +95,7 @@ export var ChatAIModal = function ChatAIModal() {
126
95
  // Los "..." del pill salen del motor, no de isStreaming/isWriting: esos reflejan
127
96
  // la sesión activa y quedan stale cuando una respuesta termina en background.
128
97
  var hasActiveStream = useSessionsStore(function (state) {
129
- return Object.values(state.meta).some(function (meta) {
130
- return isActiveSessionStatus(meta.status);
131
- });
98
+ return hasAnyActiveSessionInMeta(state.meta);
132
99
  });
133
100
 
134
101
  /** goToChat / handleGoHome se definen más abajo; los refs evitan depender del orden de declaración. */
@@ -138,7 +105,7 @@ export var ChatAIModal = function ChatAIModal() {
138
105
  // Monta cerrada salvo restauración de sesión: si el panel no está visible, las respuestas
139
106
  // nuevas quedan como no leídas.
140
107
  useEffect(function () {
141
- if (!pendingSessionRestoreRef.current) {
108
+ if (shouldSetChatViewHiddenOnMount(pendingSessionRestoreRef.current != null)) {
142
109
  setChatViewVisible(false);
143
110
  }
144
111
  }, [setChatViewVisible]);
@@ -146,7 +113,7 @@ export var ChatAIModal = function ChatAIModal() {
146
113
  // Persistimos la conversación abierta para poder volver a ella desde el pill después
147
114
  // de navegar o refrescar. El takeover desde un host la limpia (va al Home).
148
115
  useEffect(function () {
149
- if (activeChatId) {
116
+ if (shouldPersistLastActiveChatId(activeChatId)) {
150
117
  writeLastActiveChatId(user.id, activeChatId);
151
118
  }
152
119
  }, [activeChatId, user.id]);
@@ -204,10 +171,7 @@ export var ChatAIModal = function ChatAIModal() {
204
171
  setRefetchChats = _useState20[1];
205
172
  var _useState21 = useState(function () {
206
173
  var saved = savedSessionOnMountRef.current;
207
- if ((saved === null || saved === void 0 ? void 0 : saved.agentsNavActive) === 'myAgents') return options.myAgents;
208
- if ((saved === null || saved === void 0 ? void 0 : saved.agentsNavActive) === 'mySkills' && canAccessToSkills(user)) return options.mySkills;
209
- var savedOption = saved === null || saved === void 0 ? void 0 : saved.currentOption;
210
- return savedOption && isValidMaiaPanelOption(savedOption) ? savedOption : options.home;
174
+ return resolveInitialCurrentOption(saved === null || saved === void 0 ? void 0 : saved.agentsNavActive, saved === null || saved === void 0 ? void 0 : saved.currentOption, user);
211
175
  }),
212
176
  _useState22 = _slicedToArray(_useState21, 2),
213
177
  currentOption = _useState22[0],
@@ -231,7 +195,7 @@ export var ChatAIModal = function ChatAIModal() {
231
195
  _useState28 = _slicedToArray(_useState27, 2),
232
196
  sidebarHasError = _useState28[0],
233
197
  setSidebarHasError = _useState28[1];
234
- var lang = i18n.language === 'br' ? 'pt-br' : i18n.language;
198
+ var lang = resolveMaiaModalI18nLang(i18n.language);
235
199
  moment.locale(lang);
236
200
  var _useGlobalContext = useGlobalContext(),
237
201
  selectAgent = _useGlobalContext.selectAgent,
@@ -282,44 +246,23 @@ export var ChatAIModal = function ChatAIModal() {
282
246
  addSkill = _useGetSkills.addSkill,
283
247
  updateSkillInList = _useGetSkills.updateSkillInList,
284
248
  removeSkill = _useGetSkills.removeSkill;
285
- var isMAIA = validateIsMaia(agent);
286
- var userHasPermissions = ((user === null || user === void 0 || (_user$permissions = user.permissions) === null || _user$permissions === void 0 || (_user$permissions = _user$permissions.ai_agents) === null || _user$permissions === void 0 ? void 0 : _user$permissions.create) || (user === null || user === void 0 || (_user$permissions2 = user.permissions) === null || _user$permissions2 === void 0 || (_user$permissions2 = _user$permissions2.ai_agents) === null || _user$permissions2 === void 0 ? void 0 : _user$permissions2.edit) || (user === null || user === void 0 || (_user$permissions3 = user.permissions) === null || _user$permissions3 === void 0 || (_user$permissions3 = _user$permissions3.ai_agents) === null || _user$permissions3 === void 0 ? void 0 : _user$permissions3["delete"])) && window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
249
+ var userHasPermissions = resolveUserHasAgentManagementPermissions(user === null || user === void 0 ? void 0 : user.permissions, Boolean(window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS));
287
250
  var userHasSkillsAccess = canAccessToSkills(user);
288
251
  var computedCurrentOption = useMemo(function () {
289
- var isGlobalSpecialist = isMAIA && (agent === null || agent === void 0 ? void 0 : agent.entity) === 'global';
290
- var isProjectSpecialist = isMAIA && ((agent === null || agent === void 0 ? void 0 : agent.entity) === 'project' || (agent === null || agent === void 0 ? void 0 : agent.entity) == null);
291
- var isClientSpecialist = isMAIA && (agent === null || agent === void 0 ? void 0 : agent.entity) === 'client';
292
- var isMaiaker = isMarketplaceGlobalCloneAgent(agent);
293
- if (currentOption === options.myAgents && window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
294
- return options.myAgents;
295
- }
296
- if (currentOption === options.mySkills && canAccessToSkills(user)) {
297
- return options.mySkills;
298
- }
299
-
300
- // El orchestrator (MAIA) muestra su home con FAQs/acciones frecuentes; el resto de
301
- // los global specialists (clones globales no-maiaker) siguen yendo directo al chat.
302
- if (isGlobalSpecialist && !isMaiaker && (agent === null || agent === void 0 ? void 0 : agent.type) !== 'orchestrator' && currentOption === options.home) {
303
- return options.chat;
304
- }
305
- var shouldShowProjectSelector = currentOption !== options.chat && isProjectSpecialist && !project;
306
- var shouldShowClientSelector = currentOption !== options.chat && isClientSpecialist && !client;
307
- if (shouldShowProjectSelector) {
308
- return options.projectSelector;
309
- }
310
- if (shouldShowClientSelector) {
311
- return options.clientSelector;
312
- }
313
- return currentOption;
314
- }, [currentOption, project, client, isMAIA, agent === null || agent === void 0 ? void 0 : agent.entity, agent === null || agent === void 0 ? void 0 : agent.name, agent === null || agent === void 0 ? void 0 : agent.type, user]);
252
+ return resolveComputedCurrentOption({
253
+ currentOption: currentOption,
254
+ agent: agent,
255
+ project: project,
256
+ client: client,
257
+ user: user,
258
+ multiAgentsAccess: Boolean(window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS)
259
+ });
260
+ }, [currentOption, project, client, agent, user]);
315
261
  var isMaiakerAgentSelected = useMemo(function () {
316
262
  return isMarketplaceGlobalCloneAgent(agent);
317
263
  }, [agent]);
318
264
  var sidebarAgentsNavActive = useMemo(function () {
319
- if (computedCurrentOption === options.mySkills) return 'mySkills';
320
- if (computedCurrentOption === options.myAgents) return 'myAgents';
321
- if (isMaiakerAgentSelected) return 'maiaker';
322
- return null;
265
+ return resolveSidebarAgentsNavActive(computedCurrentOption, isMaiakerAgentSelected);
323
266
  }, [computedCurrentOption, isMaiakerAgentSelected]);
324
267
 
325
268
  /* Reactivar con la fila “Mis agentes” en Sidebar: myAgentsCount prop
@@ -353,8 +296,8 @@ export var ChatAIModal = function ChatAIModal() {
353
296
  var isFloating = layoutMode === 'floating';
354
297
  var contentWrapperRef = useRef(null);
355
298
  var _useState31 = useState(function () {
356
- var _savedSessionOnMountR5, _savedSessionOnMountR6;
357
- return (_savedSessionOnMountR5 = (_savedSessionOnMountR6 = savedSessionOnMountRef.current) === null || _savedSessionOnMountR6 === void 0 ? void 0 : _savedSessionOnMountR6.dragPosition) !== null && _savedSessionOnMountR5 !== void 0 ? _savedSessionOnMountR5 : null;
299
+ var _savedSessionOnMountR3, _savedSessionOnMountR4;
300
+ return (_savedSessionOnMountR3 = (_savedSessionOnMountR4 = savedSessionOnMountRef.current) === null || _savedSessionOnMountR4 === void 0 ? void 0 : _savedSessionOnMountR4.dragPosition) !== null && _savedSessionOnMountR3 !== void 0 ? _savedSessionOnMountR3 : null;
358
301
  }),
359
302
  _useState32 = _slicedToArray(_useState31, 2),
360
303
  dragPosition = _useState32[0],
@@ -367,48 +310,42 @@ export var ChatAIModal = function ChatAIModal() {
367
310
  var dragStateRef = useRef(null);
368
311
  var clampDragPosition = useCallback(function (x, y) {
369
312
  var contentWrapper = contentWrapperRef.current;
370
- if (!contentWrapper) {
313
+ if (shouldUseDragClampFallback(contentWrapper)) {
371
314
  return {
372
315
  x: x,
373
316
  y: y
374
317
  };
375
318
  }
376
- var _contentWrapper$getBo = contentWrapper.getBoundingClientRect(),
377
- width = _contentWrapper$getBo.width,
378
- height = _contentWrapper$getBo.height;
379
- var offset = 16;
380
- var maxX = Math.max(offset, window.innerWidth - width - offset);
381
- var maxY = Math.max(offset, window.innerHeight - height - offset);
382
- return {
383
- x: Math.min(Math.max(x, offset), maxX),
384
- y: Math.min(Math.max(y, offset), maxY)
385
- };
319
+ var _getBoundingClientRec = contentWrapper.getBoundingClientRect(),
320
+ width = _getBoundingClientRec.width,
321
+ height = _getBoundingClientRec.height;
322
+ return clampFloatingPanelPosition(x, y, width, height, window.innerWidth, window.innerHeight);
386
323
  }, []);
387
324
  useLayoutEffect(function () {
388
- if (layoutMode !== 'floating') {
325
+ if (shouldClearDragPositionOnLayoutChange(layoutMode)) {
389
326
  setDragPosition(null);
390
327
  return;
391
328
  }
392
329
  setDragPosition(function (prev) {
393
- if (prev) {
394
- return clampDragPosition(prev.x, prev.y);
395
- }
396
- var pad = 16;
397
- var x = window.innerWidth - getMaiaFloatingPanelWidthPx() - pad;
398
- return clampDragPosition(x, pad);
330
+ return resolveLayoutDragPositionUpdate(layoutMode, prev, clampDragPosition, {
331
+ innerWidth: window.innerWidth,
332
+ panelWidth: getMaiaFloatingPanelWidthPx(),
333
+ pad: 16
334
+ });
399
335
  });
400
336
  }, [layoutMode, clampDragPosition]);
401
337
  var handleDragEnd = useCallback(function (event) {
402
338
  var _dragStateRef$current;
403
339
  endPointerTracking();
404
- if (((_dragStateRef$current = dragStateRef.current) === null || _dragStateRef$current === void 0 ? void 0 : _dragStateRef$current.pointerId) !== event.pointerId) {
340
+ if (!isActiveFloatingDragPointer((_dragStateRef$current = dragStateRef.current) === null || _dragStateRef$current === void 0 ? void 0 : _dragStateRef$current.pointerId, event.pointerId)) {
405
341
  return;
406
342
  }
407
343
  dragStateRef.current = null;
408
344
  document.body.style.userSelect = '';
409
345
  document.body.style.cursor = '';
410
- if (layoutMode === 'floating' && contentWrapperRef.current) {
411
- var rect = contentWrapperRef.current.getBoundingClientRect();
346
+ var contentWrapper = contentWrapperRef.current;
347
+ if (contentWrapper && resolvePersistedDragPositionOnEnd(layoutMode, contentWrapper)) {
348
+ var rect = contentWrapper.getBoundingClientRect();
412
349
  patchMaiaPanelSession(user.id, {
413
350
  dragPosition: {
414
351
  x: rect.left,
@@ -419,35 +356,30 @@ export var ChatAIModal = function ChatAIModal() {
419
356
  }, [endPointerTracking, layoutMode, user.id]);
420
357
  var handleDragMove = useCallback(function (event) {
421
358
  var dragState = dragStateRef.current;
422
- if (!dragState || dragState.pointerId !== event.pointerId) {
359
+ if (!dragState || !isActiveFloatingDragPointer(dragState.pointerId, event.pointerId)) {
423
360
  return;
424
361
  }
425
362
  samplePointerMove(event.clientX, event.clientY);
426
363
  var nextPosition = clampDragPosition(event.clientX - dragState.offsetX, event.clientY - dragState.offsetY);
427
364
  setDragPosition(function (prev) {
428
- if (prev && prev.x === nextPosition.x && prev.y === nextPosition.y) {
429
- return prev;
430
- }
431
- return nextPosition;
365
+ return resolveNextDragPosition(prev, nextPosition);
432
366
  });
433
367
  }, [clampDragPosition, samplePointerMove]);
434
368
  var resolvedDragPosition = useMemo(function () {
435
- if (layoutMode !== 'floating') {
436
- return dragPosition;
437
- }
438
- if (dragPosition) {
439
- return dragPosition;
440
- }
441
- var pad = 16;
442
- var x = typeof window !== 'undefined' ? window.innerWidth - getMaiaFloatingPanelWidthPx() - pad : pad;
443
- return clampDragPosition(x, pad);
369
+ return resolveFloatingPanelDragPosition({
370
+ layoutMode: layoutMode,
371
+ dragPosition: dragPosition,
372
+ viewportWidth: typeof window !== 'undefined' ? window.innerWidth : 0,
373
+ panelWidth: getMaiaFloatingPanelWidthPx(),
374
+ clamp: clampDragPosition
375
+ });
444
376
  }, [layoutMode, dragPosition, clampDragPosition]);
445
377
  var handleDragStart = useCallback(function (event) {
446
- if (!isFloating || event.button !== 0) {
378
+ if (!shouldStartFloatingPanelDrag(isFloating, event.button)) {
447
379
  return;
448
380
  }
449
381
  var target = event.target;
450
- if (target.closest('button, a, input, textarea, select, [role="button"], [data-no-drag="true"]')) {
382
+ if (shouldSkipFloatingDragTarget(target)) {
451
383
  return;
452
384
  }
453
385
  var contentWrapper = contentWrapperRef.current;
@@ -472,40 +404,44 @@ export var ChatAIModal = function ChatAIModal() {
472
404
  startPointerTracking(event.clientX, event.clientY);
473
405
  }, [clampDragPosition, isFloating, resolvedDragPosition, startPointerTracking]);
474
406
  var startChat = useCallback(function (message, attachments, faqId, agentSuggestionId, mentions, fuaId, scId, contextData) {
475
- if (sidebarHasError) {
407
+ if (shouldResetSidebarErrorOnStartChat(sidebarHasError)) {
476
408
  setSidebarHasError(false);
477
409
  }
478
410
  setInitialChatId(null);
479
411
  setNewChatKey(function (prev) {
480
412
  return prev + 1;
481
413
  });
482
- setUserInitialMessage(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
483
- message: message || '',
484
- attachments: attachments || []
485
- }, faqId ? {
486
- faqId: faqId
487
- } : {}), agentSuggestionId ? {
488
- agentSuggestionId: agentSuggestionId
489
- } : {}), mentions && mentions.length > 0 ? {
490
- mentions: mentions
491
- } : {}), fuaId ? {
492
- fuaId: fuaId
493
- } : {}), scId ? {
494
- scId: scId
495
- } : {}), contextData ? {
414
+ setUserInitialMessage(buildUserInitialMessageFromStartChat({
415
+ message: message,
416
+ attachments: attachments,
417
+ faqId: faqId,
418
+ agentSuggestionId: agentSuggestionId,
419
+ mentions: mentions,
420
+ fuaId: fuaId,
421
+ scId: scId,
496
422
  contextData: contextData
497
- } : {}));
423
+ }));
498
424
  handlers.chat();
499
425
  }, [handlers, sidebarHasError]);
500
426
  var bannerFaqAutoSentRef = useRef(false);
501
427
  useEffect(function () {
502
- var _bannerEntryFaq$faqTi;
503
- var entityReady = section === 'project' ? Boolean(project === null || project === void 0 ? void 0 : project.id) : section === 'client' ? Boolean(client === null || client === void 0 ? void 0 : client.id) : true;
504
- if (!(bannerEntryFaq !== null && bannerEntryFaq !== void 0 && (_bannerEntryFaq$faqTi = bannerEntryFaq.faqTitle) !== null && _bannerEntryFaq$faqTi !== void 0 && _bannerEntryFaq$faqTi.trim()) || bannerFaqAutoSentRef.current || loading || !(agent !== null && agent !== void 0 && agent.id) || !entityReady) {
428
+ var bannerFaq = bannerEntryFaq;
429
+ if (!bannerFaq || !hasBannerFaqTitle(bannerFaq.faqTitle)) {
430
+ return;
431
+ }
432
+ if (!isBannerFaqReadyToAutoSend({
433
+ faqTitle: bannerFaq.faqTitle,
434
+ alreadySent: bannerFaqAutoSentRef.current,
435
+ loading: loading,
436
+ agentId: agent === null || agent === void 0 ? void 0 : agent.id,
437
+ section: section,
438
+ projectId: project === null || project === void 0 ? void 0 : project.id,
439
+ clientId: client === null || client === void 0 ? void 0 : client.id
440
+ })) {
505
441
  return;
506
442
  }
507
443
  bannerFaqAutoSentRef.current = true;
508
- startChat(bannerEntryFaq.faqTitle, [], bannerEntryFaq.faqId, undefined, undefined, undefined, undefined, bannerEntryFaq.contextData);
444
+ startChat(bannerFaq.faqTitle, [], bannerFaq.faqId, undefined, undefined, undefined, undefined, bannerFaq.contextData);
509
445
  }, [bannerEntryFaq === null || bannerEntryFaq === void 0 ? void 0 : bannerEntryFaq.faqId, bannerEntryFaq === null || bannerEntryFaq === void 0 ? void 0 : bannerEntryFaq.faqTitle, bannerEntryFaq === null || bannerEntryFaq === void 0 ? void 0 : bannerEntryFaq.contextData, loading, agent === null || agent === void 0 ? void 0 : agent.id, agent === null || agent === void 0 ? void 0 : agent.entity, project === null || project === void 0 ? void 0 : project.id, client === null || client === void 0 ? void 0 : client.id, section, startChat]);
510
446
  var goToChat = useCallback(function (chat) {
511
447
  var sessionId = chat.sessionExternalId;
@@ -520,9 +456,7 @@ export var ChatAIModal = function ChatAIModal() {
520
456
  attachments: []
521
457
  });
522
458
  setInitialChatId(sessionId);
523
- var selectedAgent = agents.data.find(function (agentItem) {
524
- return agentItem.id === chat.agentId;
525
- });
459
+ var selectedAgent = findAgentForChatItem(agents.data, chat.agentId);
526
460
  if (selectedAgent) {
527
461
  selectAgent(selectedAgent);
528
462
  }
@@ -539,15 +473,15 @@ export var ChatAIModal = function ChatAIModal() {
539
473
  }, [user.id]);
540
474
  var syncPanelSession = useCallback(function () {
541
475
  var _agent$id;
542
- if (isMinimized) return;
543
- patchMaiaPanelSession(user.id, {
544
- isExpanded: true,
476
+ var patch = buildMaiaPanelSessionPatch({
477
+ isMinimized: isMinimized,
545
478
  currentOption: currentOption,
546
479
  agentsNavActive: sidebarAgentsNavActive,
547
480
  activeChatId: activeChatId,
548
481
  agentId: (_agent$id = agent === null || agent === void 0 ? void 0 : agent.id) !== null && _agent$id !== void 0 ? _agent$id : null,
549
482
  sidebarOpen: sidebarOpenRef.current,
550
- dragPosition: layoutMode === 'floating' ? dragPosition : null,
483
+ layoutMode: layoutMode,
484
+ dragPosition: dragPosition,
551
485
  hostContext: {
552
486
  section: section,
553
487
  project: project,
@@ -556,21 +490,24 @@ export var ChatAIModal = function ChatAIModal() {
556
490
  chipsProject: chipsProject
557
491
  }
558
492
  });
493
+ if (!patch) return;
494
+ patchMaiaPanelSession(user.id, patch);
559
495
  }, [activeChatId, agent === null || agent === void 0 ? void 0 : agent.id, chipsProject, client, currentOption, dragPosition, isMinimized, layoutMode, project, section, sidebarAgentsNavActive, task, user.id]);
560
496
 
561
497
  /** Los agentes se piden recién al abrir el panel: en modo pill no hace falta ninguna request. */
562
498
  var ensureAgentsLoaded = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
563
- var loadedAgents;
499
+ var cachedAgents, loadedAgents, loadedFromFetch;
564
500
  return _regeneratorRuntime.wrap(function (_context) {
565
501
  while (1) switch (_context.prev = _context.next) {
566
502
  case 0:
567
- if (!(agentsDataRef.current.length > 0)) {
503
+ cachedAgents = resolveCachedAgentsIfAvailable(agentsDataRef.current);
504
+ if (!cachedAgents) {
568
505
  _context.next = 1;
569
506
  break;
570
507
  }
571
- return _context.abrupt("return", agentsDataRef.current);
508
+ return _context.abrupt("return", cachedAgents);
572
509
  case 1:
573
- if (agentsFetchedRef.current) {
510
+ if (!shouldAttemptInitialAgentsFetch(agentsDataRef.current.length, agentsFetchedRef.current)) {
574
511
  _context.next = 3;
575
512
  break;
576
513
  }
@@ -579,11 +516,12 @@ export var ChatAIModal = function ChatAIModal() {
579
516
  return handleGetAgents();
580
517
  case 2:
581
518
  loadedAgents = _context.sent;
582
- if (!(loadedAgents.length > 0)) {
519
+ loadedFromFetch = resolveCachedAgentsIfAvailable(loadedAgents);
520
+ if (!loadedFromFetch) {
583
521
  _context.next = 3;
584
522
  break;
585
523
  }
586
- return _context.abrupt("return", loadedAgents);
524
+ return _context.abrupt("return", loadedFromFetch);
587
525
  case 3:
588
526
  return _context.abrupt("return", agentsDataRef.current);
589
527
  case 4:
@@ -605,7 +543,7 @@ export var ChatAIModal = function ChatAIModal() {
605
543
  }, [isMinimized, syncPanelSession]);
606
544
  useEffect(function () {
607
545
  var onPageHide = function onPageHide() {
608
- if (!isMinimized) {
546
+ if (shouldSyncPanelSessionOnPageHide(isMinimized)) {
609
547
  syncPanelSession();
610
548
  }
611
549
  };
@@ -619,13 +557,7 @@ export var ChatAIModal = function ChatAIModal() {
619
557
  var _getChatsStoreState = getChatsStoreState(),
620
558
  chats = _getChatsStoreState.chats;
621
559
  var lastActiveChatId = readLastActiveChatId(user.id);
622
- var firstUnread = chats.find(function (chat) {
623
- return chat.isRead === false;
624
- });
625
- var lastActiveChat = lastActiveChatId ? chats.find(function (chat) {
626
- return chat.sessionExternalId === lastActiveChatId;
627
- }) : undefined;
628
- var target = firstUnread !== null && firstUnread !== void 0 ? firstUnread : lastActiveChat;
560
+ var target = resolveMinimizedRestoreTarget(chats, lastActiveChatId);
629
561
 
630
562
  // Navegar antes de expandir: si esperamos agentes, el panel monta con la sesión vieja y el sidebar queda desfasado.
631
563
  if (target) {
@@ -642,9 +574,7 @@ export var ChatAIModal = function ChatAIModal() {
642
574
  });
643
575
  ensureAgentsLoaded().then(function (loadedAgents) {
644
576
  if (target) {
645
- var selectedAgent = loadedAgents.find(function (agentItem) {
646
- return Number(agentItem.id) === target.agentId;
647
- });
577
+ var selectedAgent = findAgentForChatItem(loadedAgents, target.agentId);
648
578
  if (selectedAgent) {
649
579
  selectAgent(selectedAgent);
650
580
  }
@@ -661,8 +591,7 @@ export var ChatAIModal = function ChatAIModal() {
661
591
  * — eso sólo lo hace el pill (`handleRestoreFromMinimized`).
662
592
  */
663
593
  var applyExpandedHostTakeover = useCallback(function (detail) {
664
- var _detail$project2, _detail$client2, _detail$task2;
665
- var isGlobalHeaderOpen = detail.section === 'header' || detail.section === 'planner';
594
+ var entityState = resolveHostTakeoverEntityState(detail);
666
595
  clearMaiaPanelSession(user.id);
667
596
  pendingSessionRestoreRef.current = null;
668
597
  setIsRestoringSession(false);
@@ -685,25 +614,12 @@ export var ChatAIModal = function ChatAIModal() {
685
614
  bannerFaqAutoSentRef.current = false;
686
615
  getChatsStoreState().setActiveChatId(null);
687
616
  document.dispatchEvent(new CustomEvent('chat-session-changed'));
688
- if (detail.section === 'project' || detail.section === 'task') {
689
- var _detail$project;
690
- setProject === null || setProject === void 0 || setProject((_detail$project = detail.project) !== null && _detail$project !== void 0 ? _detail$project : null);
691
- } else {
692
- setProject === null || setProject === void 0 || setProject(null);
617
+ setProject === null || setProject === void 0 || setProject(entityState.project);
618
+ if (shouldApplyClientOnHostTakeover(entityState.client)) {
619
+ setClient === null || setClient === void 0 || setClient(entityState.client);
693
620
  }
694
- if (detail.section === 'client') {
695
- var _detail$client;
696
- setClient === null || setClient === void 0 || setClient((_detail$client = detail.client) !== null && _detail$client !== void 0 ? _detail$client : null);
697
- } else if (isGlobalHeaderOpen) {
698
- setClient === null || setClient === void 0 || setClient(null);
699
- }
700
- if (detail.section === 'task') {
701
- var _detail$task;
702
- setTask === null || setTask === void 0 || setTask((_detail$task = detail.task) !== null && _detail$task !== void 0 ? _detail$task : null);
703
- } else {
704
- setTask === null || setTask === void 0 || setTask(null);
705
- }
706
- if (isGlobalHeaderOpen) {
621
+ setTask === null || setTask === void 0 || setTask(entityState.task);
622
+ if (entityState.clearGlobalPinnedContext) {
707
623
  setChipsProject(null);
708
624
  clearAgent();
709
625
  }
@@ -713,24 +629,12 @@ export var ChatAIModal = function ChatAIModal() {
713
629
  });
714
630
  setLayoutMode(nextLayout);
715
631
  setDragPosition(null);
716
- var hostContext = {
717
- section: detail.section,
718
- project: detail.section === 'project' || detail.section === 'task' ? (_detail$project2 = detail.project) !== null && _detail$project2 !== void 0 ? _detail$project2 : null : null,
719
- client: detail.section === 'client' ? (_detail$client2 = detail.client) !== null && _detail$client2 !== void 0 ? _detail$client2 : null : null,
720
- task: detail.section === 'task' ? (_detail$task2 = detail.task) !== null && _detail$task2 !== void 0 ? _detail$task2 : null : null,
721
- chipsProject: null
722
- };
632
+ var hostContext = buildHostTakeoverPersistContext(detail);
723
633
  ensureAgentsLoaded().then(function () {
724
634
  var _agent$id2;
725
- var resolvedAgentId = (_agent$id2 = agent === null || agent === void 0 ? void 0 : agent.id) !== null && _agent$id2 !== void 0 ? _agent$id2 : null;
726
- if (isGlobalHeaderOpen) {
727
- var firstAgent = agentsDataRef.current[0];
728
- if (firstAgent) {
729
- selectAgent(firstAgent);
730
- resolvedAgentId = firstAgent.id;
731
- } else {
732
- resolvedAgentId = null;
733
- }
635
+ var resolvedAgentId = resolveHostTakeoverAgentId(entityState.clearGlobalPinnedContext, agentsDataRef.current, (_agent$id2 = agent === null || agent === void 0 ? void 0 : agent.id) !== null && _agent$id2 !== void 0 ? _agent$id2 : null);
636
+ if (shouldSelectFirstAgentOnHostTakeover(entityState.clearGlobalPinnedContext, agentsDataRef.current[0])) {
637
+ selectAgent(agentsDataRef.current[0]);
734
638
  }
735
639
  patchMaiaPanelSession(user.id, {
736
640
  isExpanded: true,
@@ -761,35 +665,32 @@ export var ChatAIModal = function ChatAIModal() {
761
665
  if (sidebarHasError) {
762
666
  setSidebarHasError(false);
763
667
  }
764
- if (sendMessageFunction && computedCurrentOption === options.chat) {
765
- sendMessageFunction(message, attachments, faqId, agentSuggestionId, mentions, fuaId, scId);
668
+ if (shouldUseActiveChatSendHandler(computedCurrentOption, options.chat, Boolean(sendMessageFunction))) {
669
+ sendMessageFunction === null || sendMessageFunction === void 0 || sendMessageFunction(message, attachments, faqId, agentSuggestionId, mentions, fuaId, scId);
766
670
  } else {
767
671
  startChat(message, attachments, faqId, agentSuggestionId, mentions, fuaId, scId);
768
672
  }
769
673
  }, [sendMessageFunction, startChat, computedCurrentOption, sidebarHasError]);
770
674
  var handleGoHome = useCallback(function () {
771
675
  // Si estamos en una conversación y vamos a home, resetear initialChatId y incrementar newChatKey
772
- if (currentOption === options.chat) {
676
+ if (shouldResetChatStateOnGoHome(currentOption, options.chat)) {
773
677
  // No cortamos la generación: la sesión sigue respondiendo en background.
774
678
  setInitialChatId(null);
775
679
  setNewChatKey(function (prev) {
776
680
  return prev + 1;
777
681
  });
778
682
  setIsWriting(false);
779
- // No borrar el cliente si es agente de clientes (igual que el proyecto se mantiene)
780
- if ((agent === null || agent === void 0 ? void 0 : agent.entity) !== 'client') {
683
+ if (shouldClearClientOnGoHomeFromChat(agent === null || agent === void 0 ? void 0 : agent.entity)) {
781
684
  setClient === null || setClient === void 0 || setClient(null);
782
685
  }
783
- if (section !== 'task') {
686
+ if (shouldClearTaskOnGoHomeFromChat(section)) {
784
687
  setTask === null || setTask === void 0 || setTask(null);
785
688
  }
786
689
  }
787
- if ((!agent || agent !== null && agent !== void 0 && agent.is_deleted || agent !== null && agent !== void 0 && agent.has_not_permissions || agent !== null && agent !== void 0 && agent.has_not_access || agent !== null && agent !== void 0 && agent.project_deleted) && agents.data.length > 0) {
690
+ if (shouldResetAgentToFirstOnGoHome(agent, agents.data.length)) {
788
691
  selectAgent(agents.data[0]);
789
692
  }
790
- // Orchestrator en home global (header/planner): al iniciar un chat nuevo se debe volver al paso 1
791
- // (lista de contextos recientes), por lo que hay que limpiar todo el contexto pineado.
792
- if (isGlobalMaiaSection(section) && (agent === null || agent === void 0 ? void 0 : agent.type) === 'orchestrator') {
693
+ if (shouldClearOrchestratorGlobalContextOnGoHome(section, agent === null || agent === void 0 ? void 0 : agent.type)) {
793
694
  setProject(null);
794
695
  setClient === null || setClient === void 0 || setClient(null);
795
696
  setTask === null || setTask === void 0 || setTask(null);
@@ -801,13 +702,11 @@ export var ChatAIModal = function ChatAIModal() {
801
702
  }, [options.home, options.chat, currentOption, isWebSearchActive, toggleWebSearch, agent, agents, selectAgent, setProject, setClient, setTask, stopGenerationFunction, section]);
802
703
  goHomeRef.current = handleGoHome;
803
704
  var startNewChatFromCatalog = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
804
- var fromMyAgents, fromMySkills, agentsList, firstAgent, _t;
705
+ var agentsList, firstAgent, _t;
805
706
  return _regeneratorRuntime.wrap(function (_context2) {
806
707
  while (1) switch (_context2.prev = _context2.next) {
807
708
  case 0:
808
- fromMyAgents = computedCurrentOption === options.myAgents;
809
- fromMySkills = computedCurrentOption === options.mySkills;
810
- if (!(fromMyAgents || fromMySkills)) {
709
+ if (!shouldPrefetchAgentsForCatalogNewChat(computedCurrentOption, options.myAgents, options.mySkills)) {
811
710
  _context2.next = 2;
812
711
  break;
813
712
  }
@@ -822,7 +721,7 @@ export var ChatAIModal = function ChatAIModal() {
822
721
  case 3:
823
722
  agentsList = _t;
824
723
  firstAgent = agentsList[0];
825
- if (firstAgent) {
724
+ if (shouldClearContextForCatalogOrSkillAgent(firstAgent)) {
826
725
  setProject(null);
827
726
  setClient === null || setClient === void 0 || setClient(null);
828
727
  setTask === null || setTask === void 0 || setTask(null);
@@ -844,10 +743,7 @@ export var ChatAIModal = function ChatAIModal() {
844
743
  }, _callee2);
845
744
  })), [agents.data, computedCurrentOption, ensureAgentsLoaded, isWebSearchActive, selectAgent, setClient, setProject, setTask, toggleWebSearch]);
846
745
  var handleStartNewChat = useCallback(function () {
847
- var fromMyAgents = computedCurrentOption === options.myAgents;
848
- var fromMySkills = computedCurrentOption === options.mySkills;
849
- var fromMaiakerHome = computedCurrentOption === options.home && isMaiakerAgentSelected;
850
- if (fromMyAgents || fromMySkills || fromMaiakerHome) {
746
+ if (shouldStartNewChatFromCatalog(computedCurrentOption, isMaiakerAgentSelected)) {
851
747
  startNewChatFromCatalog()["catch"](function () {
852
748
  return undefined;
853
749
  });
@@ -887,7 +783,7 @@ export var ChatAIModal = function ChatAIModal() {
887
783
  });
888
784
 
889
785
  // Desde el chat → nueva conversación SIN borrar el contexto pineado, volviendo al home.
890
- if (computedCurrentOption === options.chat) {
786
+ if (shouldBackStartNewChatPreservingContext(computedCurrentOption, options.chat)) {
891
787
  // No cortamos la generación: la sesión sigue respondiendo en background.
892
788
  setIsWriting(false);
893
789
  setUserInitialMessage({
@@ -906,7 +802,7 @@ export var ChatAIModal = function ChatAIModal() {
906
802
  }
907
803
 
908
804
  // Home paso 2 (contexto pineado) → limpiar el contexto y volver al paso 1 (contextos recientes).
909
- if (computedCurrentOption === options.home && (isGlobalMaiaSection(section) || didResetContextInSection)) {
805
+ if (shouldBackClearPinnedContext(computedCurrentOption, options.home, section, didResetContextInSection)) {
910
806
  setProject(null);
911
807
  setClient === null || setClient === void 0 || setClient(null);
912
808
  setTask === null || setTask === void 0 || setTask(null);
@@ -918,10 +814,15 @@ export var ChatAIModal = function ChatAIModal() {
918
814
  // orchestrator (p. ej. al reseleccionar MAIA en el listado). Solo la transición cuenta, así una
919
815
  // apertura fresca (contexto pineado desde la sección) no lo activa.
920
816
  useEffect(function () {
921
- var pinned = !!(task !== null && task !== void 0 && task.id || chipsProject !== null && chipsProject !== void 0 && chipsProject.projectId || client !== null && client !== void 0 && client.id || project !== null && project !== void 0 && project.id);
817
+ var pinned = resolveHasPinnedContext({
818
+ taskId: task === null || task === void 0 ? void 0 : task.id,
819
+ chipsProjectId: chipsProject === null || chipsProject === void 0 ? void 0 : chipsProject.projectId,
820
+ clientId: client === null || client === void 0 ? void 0 : client.id,
821
+ projectId: project === null || project === void 0 ? void 0 : project.id
822
+ });
922
823
  var wasPinned = prevHasPinnedContextRef.current;
923
824
  prevHasPinnedContextRef.current = pinned;
924
- if (!isGlobalMaiaSection(section) && (agent === null || agent === void 0 ? void 0 : agent.type) === 'orchestrator' && wasPinned && !pinned) {
825
+ if (shouldMarkOrchestratorContextReset(section, agent === null || agent === void 0 ? void 0 : agent.type, wasPinned, pinned)) {
925
826
  setDidResetContextInSection(true);
926
827
  }
927
828
  }, [task === null || task === void 0 ? void 0 : task.id, chipsProject === null || chipsProject === void 0 ? void 0 : chipsProject.projectId, client === null || client === void 0 ? void 0 : client.id, project === null || project === void 0 ? void 0 : project.id, section, agent === null || agent === void 0 ? void 0 : agent.type]);
@@ -1020,15 +921,16 @@ export var ChatAIModal = function ChatAIModal() {
1020
921
  * se mantiene el comportamiento original de limpiar project/client. */
1021
922
  useEffect(function () {
1022
923
  var openNewChatWithAgent = function openNewChatWithAgent(event) {
1023
- var _detail$project3, _detail$client3;
1024
924
  var _ref7 = event,
1025
925
  detail = _ref7.detail;
1026
926
  var nextAgent = detail === null || detail === void 0 ? void 0 : detail.agent;
1027
927
  if (!nextAgent) return;
1028
- setProject((_detail$project3 = detail === null || detail === void 0 ? void 0 : detail.project) !== null && _detail$project3 !== void 0 ? _detail$project3 : null);
1029
- setClient === null || setClient === void 0 || setClient((_detail$client3 = detail === null || detail === void 0 ? void 0 : detail.client) !== null && _detail$client3 !== void 0 ? _detail$client3 : null);
1030
- if ((detail === null || detail === void 0 ? void 0 : detail.task) !== undefined) {
1031
- setTask === null || setTask === void 0 || setTask(detail.task);
928
+ var contextPatch = resolveOpenNewChatWithAgentContext(detail !== null && detail !== void 0 ? detail : {});
929
+ setProject(contextPatch.project);
930
+ setClient === null || setClient === void 0 || setClient(contextPatch.client);
931
+ if (contextPatch.shouldSetTask) {
932
+ var _contextPatch$task;
933
+ setTask === null || setTask === void 0 || setTask((_contextPatch$task = contextPatch.task) !== null && _contextPatch$task !== void 0 ? _contextPatch$task : null);
1032
934
  }
1033
935
  selectAgent(nextAgent);
1034
936
  setHasError(false);
@@ -1053,7 +955,7 @@ export var ChatAIModal = function ChatAIModal() {
1053
955
  });
1054
956
  case 1:
1055
957
  firstAgent = _context4.sent;
1056
- if (firstAgent) {
958
+ if (shouldClearContextForCatalogOrSkillAgent(firstAgent)) {
1057
959
  setProject(null);
1058
960
  setClient === null || setClient === void 0 || setClient(null);
1059
961
  setTask === null || setTask === void 0 || setTask(null);
@@ -1119,31 +1021,25 @@ export var ChatAIModal = function ChatAIModal() {
1119
1021
  // Cartel "continuar en un chat nuevo": se muestra al abrir una conversación de un clone legacy
1120
1022
  // (agent_type === 'clone' con entity project/task/client). El input se reemplaza por el cartel.
1121
1023
  var legacyContextSession = useMemo(function () {
1122
- if (computedCurrentOption !== options.chat) return null;
1123
- if (!sessionMeta || sessionMeta.agentType !== 'clone') return null;
1124
- var entity = sessionMeta.agentEntity;
1125
- if (!entity || !LEGACY_CONTEXT_ENTITIES.includes(entity)) return null;
1126
- var contextName = entity === 'task' ? sessionMeta.taskName : entity === 'project' ? sessionMeta.projectName : sessionMeta.clientName;
1127
- return {
1128
- entityType: entity,
1129
- contextName: contextName || ''
1130
- };
1024
+ return resolveLegacyContextSession(computedCurrentOption, options.chat, sessionMeta);
1131
1025
  }, [computedCurrentOption, sessionMeta]);
1132
1026
 
1133
1027
  // Marca el agente de la conversación legacy para que header, selector y avatar muestren el logo
1134
1028
  // MAIA y el nombre tachado (agente obsoleto), sin depender del `type` resuelto de la sesión vieja.
1135
1029
  useEffect(function () {
1136
- if (legacyContextSession && agent && !agent.is_legacy_context) {
1137
- selectAgent(_objectSpread(_objectSpread({}, agent), {}, {
1138
- is_legacy_context: true
1139
- }));
1030
+ if (shouldMarkAgentAsLegacyContext(legacyContextSession, agent)) {
1031
+ selectAgent(buildLegacyContextAgent(agent));
1140
1032
  }
1141
1033
  }, [legacyContextSession, agent, selectAgent]);
1142
1034
 
1143
1035
  // Abre un chat nuevo con el orchestrator seteando el contexto del clone legacy (mismo criterio
1144
1036
  // que clickear un contexto reciente en el home → paso 2 con FAQs/acciones de ese contexto).
1145
1037
  var handleContinueLegacyContextInNewChat = useCallback(function () {
1146
- if (!sessionMeta) return;
1038
+ var _buildLegacyContextMi;
1039
+ var orchestrator = findOrchestratorAgent(agents.data);
1040
+ if (!canContinueLegacyContextInNewChat(sessionMeta, orchestrator) || !sessionMeta || !orchestrator) {
1041
+ return;
1042
+ }
1147
1043
  var agentEntity = sessionMeta.agentEntity,
1148
1044
  pId = sessionMeta.projectId,
1149
1045
  pName = sessionMeta.projectName,
@@ -1151,12 +1047,20 @@ export var ChatAIModal = function ChatAIModal() {
1151
1047
  cName = sessionMeta.clientName,
1152
1048
  tId = sessionMeta.taskId,
1153
1049
  tName = sessionMeta.taskName;
1154
- var orchestrator = agents.data.find(function (a) {
1155
- return a.type === 'orchestrator';
1156
- });
1157
- if (!orchestrator) return;
1158
-
1159
- // Reset del chat → conversación nueva (la anterior sigue en background)
1050
+ var migrationPatch = (_buildLegacyContextMi = buildLegacyContextMigrationPatch({
1051
+ agentEntity: agentEntity,
1052
+ projectId: pId,
1053
+ projectName: pName,
1054
+ clientId: cId,
1055
+ clientName: cName,
1056
+ taskId: tId,
1057
+ taskName: tName
1058
+ })) !== null && _buildLegacyContextMi !== void 0 ? _buildLegacyContextMi : {
1059
+ task: null,
1060
+ project: null,
1061
+ client: null,
1062
+ chipsProject: null
1063
+ };
1160
1064
  setIsWriting(false);
1161
1065
  setUserInitialMessage({
1162
1066
  message: '',
@@ -1167,89 +1071,71 @@ export var ChatAIModal = function ChatAIModal() {
1167
1071
  return prev + 1;
1168
1072
  });
1169
1073
  setHasError(false);
1170
-
1171
- // Setear contexto (mismo criterio que handleSelectRecentContext del home)
1172
- setTask === null || setTask === void 0 || setTask(null);
1173
- setProject(null);
1174
- setClient === null || setClient === void 0 || setClient(null);
1175
- setChipsProject(null);
1176
- if (agentEntity === 'client' && cId != null) {
1177
- setClient === null || setClient === void 0 || setClient({
1178
- id: cId,
1179
- name: cName || ''
1180
- });
1181
- } else if (agentEntity === 'project' && pId != null) {
1182
- setProject(_objectSpread({
1183
- id: pId,
1184
- name: pName || ''
1185
- }, cId != null ? {
1186
- clientId: cId,
1187
- client: {
1188
- id: cId,
1189
- name: cName || ''
1190
- }
1191
- } : {}));
1192
- setChipsProject({
1193
- projectId: String(pId),
1194
- projectName: pName || '',
1195
- clientName: cName || ''
1196
- });
1197
- } else if (agentEntity === 'task' && tId != null) {
1198
- setTask === null || setTask === void 0 || setTask(_objectSpread(_objectSpread({
1199
- id: tId,
1200
- name: tName || ''
1201
- }, pId != null ? {
1202
- projectId: pId
1203
- } : {}), cId != null ? {
1204
- clientId: cId
1205
- } : {}));
1206
- if (cId != null) setClient === null || setClient === void 0 || setClient({
1207
- id: cId,
1208
- name: cName || ''
1209
- });
1210
- if (pId != null) {
1211
- setProject(_objectSpread({
1212
- id: pId,
1213
- name: pName || ''
1214
- }, cId != null ? {
1215
- clientId: cId,
1216
- client: {
1217
- id: cId,
1218
- name: cName || ''
1219
- }
1220
- } : {}));
1221
- setChipsProject({
1222
- projectId: String(pId),
1223
- projectName: pName || '',
1224
- clientName: cName || ''
1225
- });
1226
- }
1227
- }
1074
+ setTask === null || setTask === void 0 || setTask(migrationPatch.task);
1075
+ setProject(migrationPatch.project);
1076
+ setClient === null || setClient === void 0 || setClient(migrationPatch.client);
1077
+ setChipsProject(migrationPatch.chipsProject);
1228
1078
  selectAgent(orchestrator);
1229
1079
  setSessionMeta(null);
1230
1080
  setCurrentOption(options.home);
1231
1081
  document.dispatchEvent(new CustomEvent('chat-session-changed'));
1232
1082
  }, [sessionMeta, agents.data, selectAgent, setClient, setProject, setTask, setChipsProject, stopGenerationFunction]);
1233
- var showNewChat = computedCurrentOption !== options.chat;
1234
- var isMyAgentsSection = computedCurrentOption === options.myAgents;
1235
- var isMySkillsSection = computedCurrentOption === options.mySkills;
1083
+ var _useMemo = useMemo(function () {
1084
+ return resolveChatModalSectionFlags(computedCurrentOption, isMaiakerAgentSelected);
1085
+ }, [computedCurrentOption, isMaiakerAgentSelected]),
1086
+ showNewChat = _useMemo.showNewChat,
1087
+ isMyAgentsSection = _useMemo.isMyAgentsSection,
1088
+ isMySkillsSection = _useMemo.isMySkillsSection,
1089
+ isMaiakerCreatorHome = _useMemo.isMaiakerCreatorHome;
1090
+ var hasChatAccess = validateAccessByFeature(section, user);
1091
+ var mainContentView = resolveChatModalMainContentView(hasError, hasChatAccess);
1092
+ var showModalFooter = shouldShowChatModalFooter({
1093
+ computedCurrentOption: computedCurrentOption,
1094
+ homeOption: options.home,
1095
+ chatOption: options.chat,
1096
+ agentsCount: agents.data.length,
1097
+ isMaiakerCreatorHome: isMaiakerCreatorHome,
1098
+ hasError: hasError,
1099
+ loading: loading,
1100
+ hasAccess: hasChatAccess
1101
+ });
1102
+ var showSidebar = shouldRenderChatSidebar(hasChatAccess, isFloating);
1236
1103
 
1237
1104
  // Botón "volver": solo para el orchestrator.
1238
1105
  // - En el chat: disponible en todas las secciones (header y project/client/task).
1239
1106
  // - En el home paso 2 (FAQs/FUAs con contexto pineado): en el header siempre; en
1240
1107
  // project/client/task solo si el usuario reinició el contexto (pasó por el selector de
1241
1108
  // contextos recientes). En el paso 1 (sin contexto) NO se muestra.
1242
- var hasPinnedContext = !!(task !== null && task !== void 0 && task.id || chipsProject !== null && chipsProject !== void 0 && chipsProject.projectId || client !== null && client !== void 0 && client.id || project !== null && project !== void 0 && project.id);
1243
- var isChatView = computedCurrentOption === options.chat;
1244
- var isHomeStep2 = computedCurrentOption === options.home && hasPinnedContext;
1245
- var isHeaderHomeStep2 = isGlobalMaiaSection(section) && isHomeStep2;
1246
- var isSectionResetHomeStep2 = !isGlobalMaiaSection(section) && isHomeStep2 && didResetContextInSection;
1247
- var showBackButton = (agent === null || agent === void 0 ? void 0 : agent.type) === 'orchestrator' && !hasError && !loading && (isChatView || isHeaderHomeStep2 || isSectionResetHomeStep2);
1109
+ var hasPinnedContext = resolveHasPinnedContext({
1110
+ taskId: task === null || task === void 0 ? void 0 : task.id,
1111
+ chipsProjectId: chipsProject === null || chipsProject === void 0 ? void 0 : chipsProject.projectId,
1112
+ clientId: client === null || client === void 0 ? void 0 : client.id,
1113
+ projectId: project === null || project === void 0 ? void 0 : project.id
1114
+ });
1115
+ var _resolveOrchestratorH = resolveOrchestratorHomeNavFlags({
1116
+ computedCurrentOption: computedCurrentOption,
1117
+ homeOption: options.home,
1118
+ chatOption: options.chat,
1119
+ hasPinnedContext: hasPinnedContext,
1120
+ section: section,
1121
+ didResetContextInSection: didResetContextInSection
1122
+ }),
1123
+ isChatView = _resolveOrchestratorH.isChatView,
1124
+ isHeaderHomeStep2 = _resolveOrchestratorH.isHeaderHomeStep2,
1125
+ isSectionResetHomeStep2 = _resolveOrchestratorH.isSectionResetHomeStep2;
1126
+ var showBackButton = shouldShowOrchestratorBackButton({
1127
+ agentType: agent === null || agent === void 0 ? void 0 : agent.type,
1128
+ hasError: hasError,
1129
+ loading: loading,
1130
+ isChatView: isChatView,
1131
+ isHeaderHomeStep2: isHeaderHomeStep2,
1132
+ isSectionResetHomeStep2: isSectionResetHomeStep2
1133
+ });
1248
1134
  var handleOpenMarketplace = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5() {
1249
1135
  return _regeneratorRuntime.wrap(function (_context5) {
1250
1136
  while (1) switch (_context5.prev = _context5.next) {
1251
1137
  case 0:
1252
- if (window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
1138
+ if (canOpenMaiaMarketplace(Boolean(window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS))) {
1253
1139
  _context5.next = 1;
1254
1140
  break;
1255
1141
  }
@@ -1273,7 +1159,7 @@ export var ChatAIModal = function ChatAIModal() {
1273
1159
  }, _callee5);
1274
1160
  })), [clearAgent, ensureAgentsLoaded, user.id]);
1275
1161
  var handleOpenSkills = useCallback(function () {
1276
- if (!canAccessToSkills(user)) {
1162
+ if (!shouldOpenSkillsCatalog(userHasSkillsAccess)) {
1277
1163
  return;
1278
1164
  }
1279
1165
  clearAgent();
@@ -1284,7 +1170,7 @@ export var ChatAIModal = function ChatAIModal() {
1284
1170
  agentsNavActive: 'mySkills',
1285
1171
  currentOption: options.mySkills
1286
1172
  });
1287
- }, [clearAgent, handleGetSkills, user]);
1173
+ }, [clearAgent, handleGetSkills, user.id, userHasSkillsAccess]);
1288
1174
  var handleGoToMaiaker = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6() {
1289
1175
  var maiakerAgent, response, data, _t2;
1290
1176
  return _regeneratorRuntime.wrap(function (_context6) {
@@ -1349,13 +1235,13 @@ export var ChatAIModal = function ChatAIModal() {
1349
1235
  return _regeneratorRuntime.wrap(function (_context7) {
1350
1236
  while (1) switch (_context7.prev = _context7.next) {
1351
1237
  case 0:
1352
- if (!(snapshot.agentsNavActive === 'mySkills')) {
1238
+ if (!shouldSkipAgentsLoadOnSessionRestore(snapshot.agentsNavActive)) {
1353
1239
  _context7.next = 1;
1354
1240
  break;
1355
1241
  }
1356
1242
  return _context7.abrupt("return");
1357
1243
  case 1:
1358
- if (!(snapshot.agentId && snapshot.agentsNavActive !== 'myAgents')) {
1244
+ if (!shouldFetchAgentDetailOnSessionRestore(snapshot.agentId, snapshot.agentsNavActive)) {
1359
1245
  _context7.next = 5;
1360
1246
  break;
1361
1247
  }
@@ -1377,11 +1263,11 @@ export var ChatAIModal = function ChatAIModal() {
1377
1263
  }
1378
1264
  agentsFetchedRef.current = true;
1379
1265
  _context7.next = 6;
1380
- return handleGetAgents(snapshot.agentsNavActive === 'myAgents' ? undefined : agentToSelect);
1266
+ return handleGetAgents(shouldPassAgentToGetAgentsOnRestore(snapshot.agentsNavActive) ? agentToSelect : undefined);
1381
1267
  case 6:
1382
1268
  return _context7.abrupt("return");
1383
1269
  case 7:
1384
- if (agentToSelect && snapshot.agentsNavActive !== 'myAgents') {
1270
+ if (shouldSelectFetchedAgentAfterRestore(agentToSelect, snapshot.agentsNavActive)) {
1385
1271
  selectAgent(agentToSelect);
1386
1272
  }
1387
1273
  case 8:
@@ -1396,16 +1282,18 @@ export var ChatAIModal = function ChatAIModal() {
1396
1282
  }(), [handleGetAgents, selectAgent]);
1397
1283
  var applySessionRestore = useCallback(/*#__PURE__*/function () {
1398
1284
  var _ref12 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee8(snapshot) {
1399
- var _snapshot$hostContext;
1285
+ var chipsProjectFromSnapshot, restoreRoute, _snapshot$activeChatI, _snapshot$activeChatI2;
1400
1286
  return _regeneratorRuntime.wrap(function (_context8) {
1401
1287
  while (1) switch (_context8.prev = _context8.next) {
1402
1288
  case 0:
1403
1289
  setIsMinimized(false);
1404
1290
  setChatViewVisible(true);
1405
- if ((_snapshot$hostContext = snapshot.hostContext) !== null && _snapshot$hostContext !== void 0 && _snapshot$hostContext.chipsProject) {
1406
- setChipsProject(snapshot.hostContext.chipsProject);
1291
+ chipsProjectFromSnapshot = resolveSnapshotChipsProject(snapshot.hostContext);
1292
+ if (chipsProjectFromSnapshot) {
1293
+ setChipsProject(chipsProjectFromSnapshot);
1407
1294
  }
1408
- if (!(snapshot.agentsNavActive === 'myAgents')) {
1295
+ restoreRoute = resolveSessionRestoreNavRoute(snapshot);
1296
+ if (!(restoreRoute === 'myAgents')) {
1409
1297
  _context8.next = 2;
1410
1298
  break;
1411
1299
  }
@@ -1416,7 +1304,7 @@ export var ChatAIModal = function ChatAIModal() {
1416
1304
  syncPanelSession();
1417
1305
  return _context8.abrupt("return");
1418
1306
  case 2:
1419
- if (!(snapshot.agentsNavActive === 'mySkills')) {
1307
+ if (!(restoreRoute === 'mySkills')) {
1420
1308
  _context8.next = 3;
1421
1309
  break;
1422
1310
  }
@@ -1425,7 +1313,7 @@ export var ChatAIModal = function ChatAIModal() {
1425
1313
  syncPanelSession();
1426
1314
  return _context8.abrupt("return");
1427
1315
  case 3:
1428
- if (!(snapshot.agentsNavActive === 'maiaker')) {
1316
+ if (!(restoreRoute === 'maiaker')) {
1429
1317
  _context8.next = 5;
1430
1318
  break;
1431
1319
  }
@@ -1436,16 +1324,16 @@ export var ChatAIModal = function ChatAIModal() {
1436
1324
  syncPanelSession();
1437
1325
  return _context8.abrupt("return");
1438
1326
  case 5:
1439
- if (snapshot.currentOption === options.chat && snapshot.activeChatId) {
1327
+ if (restoreRoute === 'chat') {
1440
1328
  setUserInitialMessage({
1441
1329
  message: '',
1442
1330
  attachments: []
1443
1331
  });
1444
- setInitialChatId(snapshot.activeChatId);
1445
- getChatsStoreState().setActiveChatId(snapshot.activeChatId);
1332
+ setInitialChatId((_snapshot$activeChatI = snapshot.activeChatId) !== null && _snapshot$activeChatI !== void 0 ? _snapshot$activeChatI : null);
1333
+ getChatsStoreState().setActiveChatId((_snapshot$activeChatI2 = snapshot.activeChatId) !== null && _snapshot$activeChatI2 !== void 0 ? _snapshot$activeChatI2 : null);
1446
1334
  document.dispatchEvent(new CustomEvent('chat-session-changed'));
1447
1335
  handlers.chat();
1448
- } else if (snapshot.currentOption && isValidMaiaPanelOption(snapshot.currentOption)) {
1336
+ } else if (restoreRoute === 'savedOption' && snapshot.currentOption) {
1449
1337
  setCurrentOption(snapshot.currentOption);
1450
1338
  }
1451
1339
  focusChatInput();
@@ -1497,16 +1385,12 @@ export var ChatAIModal = function ChatAIModal() {
1497
1385
  }, [applySessionRestore, loadAgentsForSessionRestore, setChatViewVisible]);
1498
1386
  var handleDeleteAgentFromMyAgents = useCallback(function (agentId) {
1499
1387
  removeAgent(agentId);
1500
- if ((agent === null || agent === void 0 ? void 0 : agent.id) === agentId) {
1388
+ if (shouldReselectAgentAfterDelete(agent === null || agent === void 0 ? void 0 : agent.id, agentId)) {
1501
1389
  selectFirstAgent(agentId);
1502
1390
  }
1503
1391
  }, [agent === null || agent === void 0 ? void 0 : agent.id, removeAgent, selectFirstAgent]);
1504
-
1505
- // El footer (input) se oculta solo en el home marketplace de Maiaker (browse de agentes).
1506
- // El home del orchestrator sí permite escribir, así que mantiene el footer.
1507
- var isMaiakerCreatorHome = computedCurrentOption === options.home && isMaiakerAgentSelected;
1508
1392
  var modalPanel = /*#__PURE__*/_jsxs(_Fragment, {
1509
- children: [validateAccessByFeature(section, user) && !isFloating ? /*#__PURE__*/_jsx(Sidebar, {
1393
+ children: [showSidebar ? /*#__PURE__*/_jsx(Sidebar, {
1510
1394
  onGoToChat: goToChat,
1511
1395
  onError: function onError() {
1512
1396
  return setSidebarHasError(true);
@@ -1522,7 +1406,7 @@ export var ChatAIModal = function ChatAIModal() {
1522
1406
  handleOpenSkills: handleOpenSkills,
1523
1407
  onOpenMaiakerCreator: handleGoToMaiaker,
1524
1408
  isLegacyContextSession: !!legacyContextSession,
1525
- initialOpen: (_savedSessionOnMountR7 = (_savedSessionOnMountR8 = savedSessionOnMountRef.current) === null || _savedSessionOnMountR8 === void 0 ? void 0 : _savedSessionOnMountR8.sidebarOpen) !== null && _savedSessionOnMountR7 !== void 0 ? _savedSessionOnMountR7 : false,
1409
+ initialOpen: (_savedSessionOnMountR5 = (_savedSessionOnMountR6 = savedSessionOnMountRef.current) === null || _savedSessionOnMountR6 === void 0 ? void 0 : _savedSessionOnMountR6.sidebarOpen) !== null && _savedSessionOnMountR5 !== void 0 ? _savedSessionOnMountR5 : false,
1526
1410
  onOpenChange: handleSidebarOpenChange
1527
1411
  }) : null, /*#__PURE__*/_jsxs(SCCAIMContent, {
1528
1412
  expanded: expanded,
@@ -1550,7 +1434,7 @@ export var ChatAIModal = function ChatAIModal() {
1550
1434
  isMaiakerSection: isMaiakerCreatorHome,
1551
1435
  showBackButton: showBackButton,
1552
1436
  onBack: handleBack
1553
- }), hasError ? /*#__PURE__*/_jsx(MAIAError, {}) : validateAccessByFeature(section, user) ? /*#__PURE__*/_jsx(ChatAIContent, {
1437
+ }), mainContentView === 'error' ? /*#__PURE__*/_jsx(MAIAError, {}) : mainContentView === 'chat' ? /*#__PURE__*/_jsx(ChatAIContent, {
1554
1438
  currentOption: computedCurrentOption,
1555
1439
  handlers: _objectSpread(_objectSpread({}, handlers), {}, {
1556
1440
  chat: startChat,
@@ -1585,7 +1469,7 @@ export var ChatAIModal = function ChatAIModal() {
1585
1469
  isRestoringSession: isRestoringSession
1586
1470
  }) : /*#__PURE__*/_jsx(ProjectSummaryContent, {
1587
1471
  onRestartSummary: handlers.home
1588
- }), (computedCurrentOption === options.home && !!(agents !== null && agents !== void 0 && (_agents$data = agents.data) !== null && _agents$data !== void 0 && _agents$data.length) || computedCurrentOption === options.chat) && !isMaiakerCreatorHome && !hasError && !loading && validateAccessByFeature(section, user) && /*#__PURE__*/_jsx(ChatAiModalFooter, {
1472
+ }), showModalFooter && /*#__PURE__*/_jsx(ChatAiModalFooter, {
1589
1473
  agent: agent,
1590
1474
  handleSendMessage: handleSendMessage,
1591
1475
  handleStopGeneration: stopGenerationFunction,
@@ -1610,7 +1494,7 @@ export var ChatAIModal = function ChatAIModal() {
1610
1494
  expanded: expanded,
1611
1495
  layoutMode: layoutMode,
1612
1496
  dragPosition: resolvedDragPosition,
1613
- elevated: section === 'task',
1497
+ elevated: shouldUseElevatedMaiaPanel(section),
1614
1498
  $minimized: isMinimized,
1615
1499
  children: [/*#__PURE__*/_jsx(SCCAIMMinimizedHide, {
1616
1500
  $hidden: isMinimized,
@@ -1636,4 +1520,4 @@ export var ChatAIModal = function ChatAIModal() {
1636
1520
  }), userHasSkillsAccess && /*#__PURE__*/_jsx(AbmSkillGenerateModal, {}), /*#__PURE__*/_jsx(Snackbar, {})]
1637
1521
  }), selector);
1638
1522
  };
1639
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsInVzZVJlZiIsInVzZUVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsIlJlYWN0RE9NIiwibW9tZW50IiwidXNlVHJhbnNsYXRpb24iLCJ1c2VVc2VyIiwiY2FuQWNjZXNzVG9DaGF0QUkiLCJjYW5BY2Nlc3NUb1NraWxscyIsIk1BSUFFcnJvciIsInVzZU1haWFUYXNrUGFuZWxaSW5kZXgiLCJDaGF0QUlDb250ZW50IiwiYnVpbGRIYW5kbGVycyIsIm9wdGlvbnMiLCJTaWRlYmFyIiwidXNlR2V0QWdlbnRzIiwidXNlR2V0U2tpbGxzIiwidXNlR2xvYmFsQ29udGV4dCIsIkNoYXRBSU1vZGFsSGVhZGVyIiwiU25hY2tiYXIiLCJQcm9qZWN0U3VtbWFyeUNvbnRlbnQiLCJBYm1BZ2VudE1vZGFsIiwiQWJtU2tpbGxNb2RhbCIsIlNLSUxMX1VTRV9BRlRFUl9TQVZFX0VWRU5UIiwiQWJtU2tpbGxHZW5lcmF0ZU1vZGFsIiwiU0VDVElPTlMiLCJTQ0NBSU1Db250ZW50IiwiU0NDQUlNQ29udGVudFdyYXBwZXIiLCJTQ0NBSU1NaW5pbWl6ZWRIaWRlIiwiU0NDQUlNV3JhcHBlciIsIk1haWFNaW5pbWl6ZWRQaWxsIiwidXNlTWluaW1pemVkUGlsbE5vdmVsdHlEb3QiLCJnZXRNYWlhRmxvYXRpbmdQYW5lbFdpZHRoUHgiLCJyZXNvbHZlSW5pdGlhbE1haWFDaGF0TGF5b3V0TW9kZSIsInNldFN0b3JlZE1haWFDaGF0TGF5b3V0TW9kZSIsImRpc3BhdGNoU2tpbGxNZW50aW9uSW5zZXJ0IiwiZW5zdXJlQWdlbnRzQmVmb3JlU2tpbGxVc2UiLCJGbG9hdGluZ1BhbmVsTW90aW9uIiwidXNlRmxvYXRpbmdQYW5lbERyYWdUaWx0IiwiQ2hhdEFpTW9kYWxGb290ZXIiLCJ2YWxpZGF0ZUlzTWFpYSIsImlzTWFya2V0cGxhY2VHbG9iYWxDbG9uZUFnZW50IiwidXNlRmFxc1N0b3JlIiwiZ2V0Q2hhdHNTdG9yZVN0YXRlIiwidXNlQ2hhdHNTdG9yZSIsInJlYWRMYXN0QWN0aXZlQ2hhdElkIiwid3JpdGVMYXN0QWN0aXZlQ2hhdElkIiwiY2xlYXJNYWlhUGFuZWxTZXNzaW9uIiwiaXNWYWxpZE1haWFQYW5lbE9wdGlvbiIsInBhdGNoTWFpYVBhbmVsU2Vzc2lvbiIsInJlYWRNYWlhUGFuZWxTZXNzaW9uIiwid3JpdGVNYWlhUGFuZWxTZXNzaW9uIiwidXNlU2Vzc2lvbnNTdG9yZSIsImlzQWN0aXZlU2Vzc2lvblN0YXR1cyIsImZldGNoTWFpYSIsImZldGNoQWdlbnREZXRhaWwiLCJtYXBDT1JMYW5nIiwiRVZFTlRTIiwidXNlRXZlbnQiLCJNQUlBX09QRU5fRlJPTV9IT1NUX0VWRU5UIiwianN4IiwiX2pzeCIsImpzeHMiLCJfanN4cyIsIkZyYWdtZW50IiwiX0ZyYWdtZW50IiwiTEVHQUNZX0NPTlRFWFRfRU5USVRJRVMiLCJpc0dsb2JhbE1haWFTZWN0aW9uIiwic2VjdGlvbiIsInJlc29sdmVBaUNoYXRCYWNrRGVzdGluYXRpb24iLCJhZ2VudFR5cGUiLCJjdXJyZW50T3B0aW9uIiwiaG9tZU9wdGlvbiIsIklEX01PREFMX0NIQVRfQUdFTlQiLCJ2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSIsInVzZXIiLCJCb29sZWFuIiwid2luZG93IiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTIiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyIsIkNoYXRBSU1vZGFsIiwiX3NhdmVkU2Vzc2lvbk9uTW91bnRSIiwiX3NhdmVkU2Vzc2lvbk9uTW91bnRSMiIsIl9zYXZlZFNlc3Npb25Pbk1vdW50UjMiLCJfc2F2ZWRTZXNzaW9uT25Nb3VudFI0IiwiX3VzZXIkcGVybWlzc2lvbnMiLCJfdXNlciRwZXJtaXNzaW9uczIiLCJfdXNlciRwZXJtaXNzaW9uczMiLCJfc2F2ZWRTZXNzaW9uT25Nb3VudFI3IiwiX3NhdmVkU2Vzc2lvbk9uTW91bnRSOCIsIl9hZ2VudHMkZGF0YSIsIl91c2VUcmFuc2xhdGlvbiIsImFibUFnZW50IiwiaTE4biIsImFtcGxpdHVkRXZlbnQiLCJzYXZlZFNlc3Npb25Pbk1vdW50UmVmIiwiaWQiLCJzaG91bGRSZXN0b3JlRXhwYW5kZWQiLCJjdXJyZW50IiwiaXNFeHBhbmRlZCIsInBlbmRpbmdTZXNzaW9uUmVzdG9yZVJlZiIsInNlc3Npb25SZXN0b3JlU3RhcnRlZFJlZiIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsImlzUmVzdG9yaW5nU2Vzc2lvbiIsInNldElzUmVzdG9yaW5nU2Vzc2lvbiIsInNpZGViYXJPcGVuUmVmIiwic2lkZWJhck9wZW4iLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImlzTWluaW1pemVkIiwic2V0SXNNaW5pbWl6ZWQiLCJzZXRDaGF0Vmlld1Zpc2libGUiLCJzdGF0ZSIsInVucmVhZENvdW50Iiwic2hvd01pbmltaXplZE5vdmVsdHlEb3QiLCJhY3RpdmVDaGF0SWQiLCJoYXNBY3RpdmVTdHJlYW0iLCJPYmplY3QiLCJ2YWx1ZXMiLCJtZXRhIiwic29tZSIsInN0YXR1cyIsImdvVG9DaGF0UmVmIiwiZ29Ib21lUmVmIiwiaGFuZGxlTWluaW1pemUiLCJhaUNoYXRNaW5pbWl6ZSIsImZvY3VzQ2hhdElucHV0Iiwic2V0VGltZW91dCIsImRvY3VtZW50IiwiZGlzcGF0Y2hFdmVudCIsIkN1c3RvbUV2ZW50IiwiX3VzZVN0YXRlNSIsIm1lc3NhZ2UiLCJhdHRhY2htZW50cyIsIl91c2VTdGF0ZTYiLCJ1c2VySW5pdGlhbE1lc3NhZ2UiLCJzZXRVc2VySW5pdGlhbE1lc3NhZ2UiLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsImluaXRpYWxDaGF0SWQiLCJzZXRJbml0aWFsQ2hhdElkIiwiX3VzZVN0YXRlOSIsIl91c2VTdGF0ZTAiLCJuZXdDaGF0S2V5Iiwic2V0TmV3Q2hhdEtleSIsIl91c2VTdGF0ZTEiLCJfdXNlU3RhdGUxMCIsInNlc3Npb25NZXRhIiwic2V0U2Vzc2lvbk1ldGEiLCJfdXNlU3RhdGUxMSIsIl91c2VTdGF0ZTEyIiwic2VuZE1lc3NhZ2VGdW5jdGlvbiIsInNldFNlbmRNZXNzYWdlRnVuY3Rpb24iLCJfdXNlU3RhdGUxMyIsIl91c2VTdGF0ZTE0Iiwic3RvcEdlbmVyYXRpb25GdW5jdGlvbiIsInNldFN0b3BHZW5lcmF0aW9uRnVuY3Rpb24iLCJfdXNlU3RhdGUxNSIsIl91c2VTdGF0ZTE2IiwiaXNTdHJlYW1pbmciLCJzZXRJc1N0cmVhbWluZyIsIl91c2VTdGF0ZTE3IiwiX3VzZVN0YXRlMTgiLCJpc1dyaXRpbmciLCJzZXRJc1dyaXRpbmciLCJfdXNlU3RhdGUxOSIsIl91c2VTdGF0ZTIwIiwicmVmZXRjaENoYXRzIiwic2V0UmVmZXRjaENoYXRzIiwiX3VzZVN0YXRlMjEiLCJzYXZlZCIsImFnZW50c05hdkFjdGl2ZSIsIm15QWdlbnRzIiwibXlTa2lsbHMiLCJzYXZlZE9wdGlvbiIsImhvbWUiLCJfdXNlU3RhdGUyMiIsInNldEN1cnJlbnRPcHRpb24iLCJfdXNlU3RhdGUyMyIsIl91c2VTdGF0ZTI0IiwiaGFzRXJyb3IiLCJzZXRIYXNFcnJvciIsIl91c2VTdGF0ZTI1IiwiX3VzZVN0YXRlMjYiLCJkaWRSZXNldENvbnRleHRJblNlY3Rpb24iLCJzZXREaWRSZXNldENvbnRleHRJblNlY3Rpb24iLCJwcmV2SGFzUGlubmVkQ29udGV4dFJlZiIsImhhbmRsZXJzIiwiX3VzZVN0YXRlMjciLCJfdXNlU3RhdGUyOCIsInNpZGViYXJIYXNFcnJvciIsInNldFNpZGViYXJIYXNFcnJvciIsImxhbmciLCJsYW5ndWFnZSIsImxvY2FsZSIsIl91c2VHbG9iYWxDb250ZXh0Iiwic2VsZWN0QWdlbnQiLCJjbGVhckFnZW50IiwiYWdlbnQiLCJwcm9qZWN0IiwiY2xpZW50IiwidGFzayIsImNoaXBzUHJvamVjdCIsInRvZ2dsZVdlYlNlYXJjaCIsImlzV2ViU2VhcmNoQWN0aXZlIiwic2V0Q2hpcHNQcm9qZWN0Iiwic2V0Q2xpZW50Iiwic2V0UHJvamVjdCIsImJhbm5lckVudHJ5RmFxIiwic2V0VGFzayIsInRvb2x0aXBaSW5kZXgiLCJfdXNlR2V0QWdlbnRzIiwiaGFuZGxlR29Ib21lIiwiYWdlbnRzIiwibG9hZGluZyIsImxvYWRpbmdNb3JlIiwiYWdlbnRFcnJvciIsImVycm9yIiwiaGFuZGxlR2V0QWdlbnRzIiwibG9hZE1vcmVBZ2VudHMiLCJzZWFyY2hDdXN0b21BZ2VudHMiLCJzZWFyY2hMb2FkaW5nIiwiYWRkQWdlbnQiLCJyZW1vdmVBZ2VudCIsInVwZGF0ZUFnZW50IiwidXBkYXRlQWdlbnRGYXZvcml0ZSIsInNlbGVjdEZpcnN0QWdlbnQiLCJzb3J0QWdlbnRzTGlzdCIsImFnZW50c0RhdGFSZWYiLCJkYXRhIiwiX3VzZUdldFNraWxscyIsInNoYXJlZFNraWxscyIsImxvYWRpbmdTa2lsbHMiLCJoYW5kbGVHZXRTa2lsbHMiLCJhZGRTa2lsbCIsInVwZGF0ZVNraWxsSW5MaXN0IiwicmVtb3ZlU2tpbGwiLCJpc01BSUEiLCJ1c2VySGFzUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9ucyIsImFpX2FnZW50cyIsImNyZWF0ZSIsImVkaXQiLCJ1c2VySGFzU2tpbGxzQWNjZXNzIiwiY29tcHV0ZWRDdXJyZW50T3B0aW9uIiwiaXNHbG9iYWxTcGVjaWFsaXN0IiwiZW50aXR5IiwiaXNQcm9qZWN0U3BlY2lhbGlzdCIsImlzQ2xpZW50U3BlY2lhbGlzdCIsImlzTWFpYWtlciIsInR5cGUiLCJjaGF0Iiwic2hvdWxkU2hvd1Byb2plY3RTZWxlY3RvciIsInNob3VsZFNob3dDbGllbnRTZWxlY3RvciIsInByb2plY3RTZWxlY3RvciIsImNsaWVudFNlbGVjdG9yIiwibmFtZSIsImlzTWFpYWtlckFnZW50U2VsZWN0ZWQiLCJzaWRlYmFyQWdlbnRzTmF2QWN0aXZlIiwiYWdlbnRzRmV0Y2hlZFJlZiIsInNlbGVjdG9yIiwicXVlcnlTZWxlY3RvciIsImNvbmNhdCIsIl91c2VTdGF0ZTI5IiwiX3VzZVN0YXRlMzAiLCJsYXlvdXRNb2RlIiwic2V0TGF5b3V0TW9kZSIsImhhbmRsZUxheW91dE1vZGVDaGFuZ2UiLCJtb2RlIiwiZXhwYW5kZWQiLCJpc0Zsb2F0aW5nIiwiY29udGVudFdyYXBwZXJSZWYiLCJfdXNlU3RhdGUzMSIsIl9zYXZlZFNlc3Npb25Pbk1vdW50UjUiLCJfc2F2ZWRTZXNzaW9uT25Nb3VudFI2IiwiZHJhZ1Bvc2l0aW9uIiwiX3VzZVN0YXRlMzIiLCJzZXREcmFnUG9zaXRpb24iLCJfdXNlRmxvYXRpbmdQYW5lbERyYWciLCJ0aWx0TW90aW9uIiwic3RhcnRQb2ludGVyVHJhY2tpbmciLCJzYW1wbGVQb2ludGVyTW92ZSIsImVuZFBvaW50ZXJUcmFja2luZyIsImRyYWdTdGF0ZVJlZiIsImNsYW1wRHJhZ1Bvc2l0aW9uIiwieCIsInkiLCJjb250ZW50V3JhcHBlciIsIl9jb250ZW50V3JhcHBlciRnZXRCbyIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsIndpZHRoIiwiaGVpZ2h0Iiwib2Zmc2V0IiwibWF4WCIsIk1hdGgiLCJtYXgiLCJpbm5lcldpZHRoIiwibWF4WSIsImlubmVySGVpZ2h0IiwibWluIiwicHJldiIsInBhZCIsImhhbmRsZURyYWdFbmQiLCJldmVudCIsIl9kcmFnU3RhdGVSZWYkY3VycmVudCIsInBvaW50ZXJJZCIsImJvZHkiLCJzdHlsZSIsInVzZXJTZWxlY3QiLCJjdXJzb3IiLCJyZWN0IiwibGVmdCIsInRvcCIsImhhbmRsZURyYWdNb3ZlIiwiZHJhZ1N0YXRlIiwiY2xpZW50WCIsImNsaWVudFkiLCJuZXh0UG9zaXRpb24iLCJvZmZzZXRYIiwib2Zmc2V0WSIsInJlc29sdmVkRHJhZ1Bvc2l0aW9uIiwiaGFuZGxlRHJhZ1N0YXJ0IiwiYnV0dG9uIiwidGFyZ2V0IiwiY2xvc2VzdCIsImluaXRpYWxQb3NpdGlvbiIsInBvaW50ZXJPZmZzZXRYIiwicG9pbnRlck9mZnNldFkiLCJjdXJyZW50VGFyZ2V0Iiwic2V0UG9pbnRlckNhcHR1cmUiLCJwcmV2ZW50RGVmYXVsdCIsImFpQ2hhdERyYWdnYWJsZSIsInN0YXJ0Q2hhdCIsImZhcUlkIiwiYWdlbnRTdWdnZXN0aW9uSWQiLCJtZW50aW9ucyIsImZ1YUlkIiwic2NJZCIsImNvbnRleHREYXRhIiwiX29iamVjdFNwcmVhZCIsImxlbmd0aCIsImJhbm5lckZhcUF1dG9TZW50UmVmIiwiX2Jhbm5lckVudHJ5RmFxJGZhcVRpIiwiZW50aXR5UmVhZHkiLCJmYXFUaXRsZSIsInRyaW0iLCJ1bmRlZmluZWQiLCJnb1RvQ2hhdCIsInNlc3Npb25JZCIsInNlc3Npb25FeHRlcm5hbElkIiwic2V0QWN0aXZlQ2hhdElkIiwiZGV0YWlsIiwic2VsZWN0ZWRBZ2VudCIsImZpbmQiLCJhZ2VudEl0ZW0iLCJhZ2VudElkIiwiaGFuZGxlU2lkZWJhck9wZW5DaGFuZ2UiLCJvcGVuIiwic3luY1BhbmVsU2Vzc2lvbiIsIl9hZ2VudCRpZCIsImhvc3RDb250ZXh0IiwiZW5zdXJlQWdlbnRzTG9hZGVkIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJsb2FkZWRBZ2VudHMiLCJ3cmFwIiwiX2NvbnRleHQiLCJuZXh0IiwiYWJydXB0Iiwic2VudCIsInN0b3AiLCJ0aW1lciIsImNsZWFyVGltZW91dCIsIm9uUGFnZUhpZGUiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImhhbmRsZVJlc3RvcmVGcm9tTWluaW1pemVkIiwiX2dldENoYXRzU3RvcmVTdGF0ZSIsImNoYXRzIiwibGFzdEFjdGl2ZUNoYXRJZCIsImZpcnN0VW5yZWFkIiwiaXNSZWFkIiwibGFzdEFjdGl2ZUNoYXQiLCJfZ29Ub0NoYXRSZWYkY3VycmVudCIsImNhbGwiLCJfZ29Ib21lUmVmJGN1cnJlbnQiLCJhaUNoYXRPcGVuIiwib3B0aW9uIiwidGhlbiIsIk51bWJlciIsImFwcGx5RXhwYW5kZWRIb3N0VGFrZW92ZXIiLCJfZGV0YWlsJHByb2plY3QyIiwiX2RldGFpbCRjbGllbnQyIiwiX2RldGFpbCR0YXNrMiIsImlzR2xvYmFsSGVhZGVyT3BlbiIsImdldFN0YXRlIiwiY2xlYXJGYXFzIiwiX2RldGFpbCRwcm9qZWN0IiwiX2RldGFpbCRjbGllbnQiLCJfZGV0YWlsJHRhc2siLCJuZXh0TGF5b3V0IiwiZmFxIiwiX2FnZW50JGlkMiIsInJlc29sdmVkQWdlbnRJZCIsImZpcnN0QWdlbnQiLCJoYW5kbGVTZW5kTWVzc2FnZVJlYWR5Iiwic2VuZE1lc3NhZ2UiLCJzdG9wR2VuZXJhdGlvbiIsInN0cmVhbWluZyIsIndyaXRpbmciLCJoYW5kbGVTZW5kTWVzc2FnZSIsImlzX2RlbGV0ZWQiLCJoYXNfbm90X3Blcm1pc3Npb25zIiwiaGFzX25vdF9hY2Nlc3MiLCJwcm9qZWN0X2RlbGV0ZWQiLCJzdGFydE5ld0NoYXRGcm9tQ2F0YWxvZyIsIl9jYWxsZWUyIiwiZnJvbU15QWdlbnRzIiwiZnJvbU15U2tpbGxzIiwiYWdlbnRzTGlzdCIsIl90IiwiX2NvbnRleHQyIiwiaGFuZGxlU3RhcnROZXdDaGF0IiwiZnJvbU1haWFrZXJIb21lIiwiaGFuZGxlUmVzZXRDaGF0IiwiX2NhbGxlZTMiLCJfY29udGV4dDMiLCJoYW5kbGVCYWNrIiwidG8iLCJhaUNoYXRCYWNrIiwicGlubmVkIiwicHJvamVjdElkIiwid2FzUGlubmVkIiwib25NZXJnZUNyZWF0ZWRBZ2VudCIsImV2dCIsIl9yZWY0IiwibmV4dEFnZW50IiwibmF2aWdhdGVIb21lIiwib25TeW5jRWRpdGVkQWdlbnQiLCJfcmVmNSIsIm9wZW5DaGF0VmlldyIsIm9wZW5Ib21lIiwiY2xpZW50SWQiLCJvcGVuRnJvbUhvc3QiLCJfcmVmNiIsIm9wZW5OZXdDaGF0V2l0aEFnZW50IiwiX2RldGFpbCRwcm9qZWN0MyIsIl9kZXRhaWwkY2xpZW50MyIsIl9yZWY3IiwiYXBwbHlTa2lsbFVzZUZsb3ciLCJfcmVmOCIsIl9jYWxsZWU0Iiwic2tpbGwiLCJ1c2VGaXJzdEFnZW50IiwiX2NvbnRleHQ0IiwiX3giLCJfeDIiLCJhcHBseSIsImFyZ3VtZW50cyIsImhhbmRsZVVzZVNraWxsQWZ0ZXJTYXZlIiwiX3JlZjkiLCJfcmVmOSR1c2VGaXJzdEFnZW50Iiwib25TZXNzaW9uTWV0YSIsIl9yZWYwIiwibGVnYWN5Q29udGV4dFNlc3Npb24iLCJhZ2VudEVudGl0eSIsImluY2x1ZGVzIiwiY29udGV4dE5hbWUiLCJ0YXNrTmFtZSIsInByb2plY3ROYW1lIiwiY2xpZW50TmFtZSIsImVudGl0eVR5cGUiLCJpc19sZWdhY3lfY29udGV4dCIsImhhbmRsZUNvbnRpbnVlTGVnYWN5Q29udGV4dEluTmV3Q2hhdCIsInBJZCIsInBOYW1lIiwiY0lkIiwiY05hbWUiLCJ0SWQiLCJ0YXNrSWQiLCJ0TmFtZSIsIm9yY2hlc3RyYXRvciIsImEiLCJTdHJpbmciLCJzaG93TmV3Q2hhdCIsImlzTXlBZ2VudHNTZWN0aW9uIiwiaXNNeVNraWxsc1NlY3Rpb24iLCJoYXNQaW5uZWRDb250ZXh0IiwiaXNDaGF0VmlldyIsImlzSG9tZVN0ZXAyIiwiaXNIZWFkZXJIb21lU3RlcDIiLCJpc1NlY3Rpb25SZXNldEhvbWVTdGVwMiIsInNob3dCYWNrQnV0dG9uIiwiaGFuZGxlT3Blbk1hcmtldHBsYWNlIiwiX2NhbGxlZTUiLCJfY29udGV4dDUiLCJoYW5kbGVPcGVuU2tpbGxzIiwiaGFuZGxlR29Ub01haWFrZXIiLCJfY2FsbGVlNiIsIm1haWFrZXJBZ2VudCIsInJlc3BvbnNlIiwiX3QyIiwiX2NvbnRleHQ2IiwicGF0aCIsIm1ldGhvZCIsImpzb24iLCJsb2FkQWdlbnRzRm9yU2Vzc2lvblJlc3RvcmUiLCJfcmVmMTEiLCJfY2FsbGVlNyIsInNuYXBzaG90IiwiYWdlbnRUb1NlbGVjdCIsIl90MyIsIl9jb250ZXh0NyIsIl94MyIsImFwcGx5U2Vzc2lvblJlc3RvcmUiLCJfcmVmMTIiLCJfY2FsbGVlOCIsIl9zbmFwc2hvdCRob3N0Q29udGV4dCIsIl9jb250ZXh0OCIsIl94NCIsInJ1blJlc3RvcmUiLCJfcmVmMTMiLCJfY2FsbGVlOSIsIl9jb250ZXh0OSIsImZpbmlzaCIsImhhbmRsZURlbGV0ZUFnZW50RnJvbU15QWdlbnRzIiwiaXNNYWlha2VyQ3JlYXRvckhvbWUiLCJtb2RhbFBhbmVsIiwiY2hpbGRyZW4iLCJvbkdvVG9DaGF0Iiwib25FcnJvciIsImhhbmRsZUdvVG9Ib21lIiwiaGFuZGxlU2V0UmVmZXRjaENoYXRzIiwib25PcGVuTWFpYWtlckNyZWF0b3IiLCJpc0xlZ2FjeUNvbnRleHRTZXNzaW9uIiwiaW5pdGlhbE9wZW4iLCJvbk9wZW5DaGFuZ2UiLCJmbG9hdGluZyIsIm9uTGF5b3V0TW9kZUNoYW5nZSIsImRyYWdnYWJsZSIsIm9uRHJhZ1N0YXJ0Iiwib25EcmFnTW92ZSIsIm9uRHJhZ0VuZCIsImhhc01vcmUiLCJoYXNfbW9yZSIsIm9uQWdlbnRVcGRhdGUiLCJpc01haWFrZXJTZWN0aW9uIiwib25CYWNrIiwicmVmcyIsIm9uU2VuZE1lc3NhZ2VSZWFkeSIsImxvYWRpbmdBZ2VudHMiLCJvbkRlbGV0ZUFnZW50Iiwib25GYXZvcml0ZUFnZW50VXBkYXRlIiwiaGFzTW9yZUFnZW50cyIsImxvYWRpbmdNb3JlQWdlbnRzIiwib25Mb2FkTW9yZUFnZW50cyIsIm9uR29Ub01haWFrZXIiLCJvbkRlbGV0ZVNraWxsIiwib25TZWFyY2hBZ2VudHMiLCJzZWFyY2hMb2FkaW5nQWdlbnRzIiwib25SZXN0YXJ0U3VtbWFyeSIsImhhbmRsZVN0b3BHZW5lcmF0aW9uIiwiY2hhdElkIiwib25Db250aW51ZUluTmV3Q2hhdCIsInJlZiIsImNyZWF0ZVBvcnRhbCIsImVsZXZhdGVkIiwiJG1pbmltaXplZCIsIiRoaWRkZW4iLCJ0aWx0Iiwic2hvd05vdmVsdHlEb3QiLCJvblJlc3RvcmUiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvQ2hhdEFJTW9kYWwvQ2hhdEFJTW9kYWwudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvaW5kZW50ICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9qc3gtbm8tdXNlbGVzcy1mcmFnbWVudCAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBqc3gtYTExeS9jbGljay1ldmVudHMtaGF2ZS1rZXktZXZlbnRzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBqc3gtYTExeS9uby1zdGF0aWMtZWxlbWVudC1pbnRlcmFjdGlvbnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L2Z1bmN0aW9uLWNvbXBvbmVudC1kZWZpbml0aW9uICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9yZXF1aXJlLWRlZmF1bHQtcHJvcHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCB7XG4gIHVzZUNhbGxiYWNrLFxuICB1c2VNZW1vLFxuICB1c2VTdGF0ZSxcbiAgdXNlUmVmLFxuICB1c2VFZmZlY3QsXG4gIHVzZUxheW91dEVmZmVjdCxcbiAgUG9pbnRlckV2ZW50IGFzIFJlYWN0UG9pbnRlckV2ZW50LFxufSBmcm9tICdyZWFjdCdcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCdcbmltcG9ydCB7IHVzZVVzZXIgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2Nvci11c2VyJ1xuaW1wb3J0IHsgY2FuQWNjZXNzVG9DaGF0QUksIGNhbkFjY2Vzc1RvU2tpbGxzIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL3Blcm1pc3Npb25zJ1xuaW1wb3J0IHsgTUFJQUVycm9yIH0gZnJvbSAnLi4vLi4vYXRvbXMvTUFJQUVycm9yJ1xuaW1wb3J0IHsgdXNlTWFpYVRhc2tQYW5lbFpJbmRleCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZU1haWFUYXNrUGFuZWxaSW5kZXgnXG5cbmltcG9ydCB7IENoYXRBSUNvbnRlbnQgfSBmcm9tICcuLi9DaGF0QUlDb250ZW50J1xuaW1wb3J0IHsgYnVpbGRIYW5kbGVycywgb3B0aW9ucyB9IGZyb20gJy4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgU2lkZWJhciB9IGZyb20gJy4uL1NpZGViYXInXG5pbXBvcnQgeyB1c2VHZXRBZ2VudHMgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tYWlhL0FnZW50cy9nZXRBZ2VudHMnXG5pbXBvcnQgeyB1c2VHZXRTa2lsbHMgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tYWlhL1NraWxscy9nZXRTa2lsbHMnXG5pbXBvcnQgeyB1c2VHbG9iYWxDb250ZXh0LCB0eXBlIFNlY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2dsb2JhbC1jb250ZXh0J1xuaW1wb3J0IHsgQXR0YWNobWVudEZpbGUgfSBmcm9tICcuLi9DaGF0Rm9vdGVyL0NoYXRGb290ZXInXG5pbXBvcnQgeyBDb250ZXh0TWVudGlvbiB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2NvbnRleHRNZW50aW9uJ1xuaW1wb3J0IHsgQ2hhdEFJTW9kYWxIZWFkZXIgfSBmcm9tICcuL2NvbXBvbmVudHMvQ2hhdEFpTW9kYWxIZWFkZXIvQ2hhdEFpTW9kYWxIZWFkZXInXG5pbXBvcnQgeyBTbmFja2JhciB9IGZyb20gJy4uLy4uL29yZ2FuaXNtcy9TbmFja0Jhci9TbmFja2JhcidcbmltcG9ydCB7IFByb2plY3RTdW1tYXJ5Q29udGVudCB9IGZyb20gJy4uL1Byb2plY3RTdW1tYXJ5Q29udGVudCdcbmltcG9ydCB7IEFibUFnZW50TW9kYWwgfSBmcm9tICcuLi8uLi9vcmdhbmlzbXMvQWJtQWdlbnRNb2RhbC9BYm1BZ2VudE1vZGFsJ1xuaW1wb3J0IHsgQWJtU2tpbGxNb2RhbCwgU0tJTExfVVNFX0FGVEVSX1NBVkVfRVZFTlQgfSBmcm9tICcuLi8uLi9vcmdhbmlzbXMvQWJtU2tpbGxNb2RhbC9BYm1Ta2lsbE1vZGFsJ1xuaW1wb3J0IHsgQWJtU2tpbGxHZW5lcmF0ZU1vZGFsIH0gZnJvbSAnLi4vLi4vb3JnYW5pc21zL0FibVNraWxsR2VuZXJhdGVNb2RhbC9BYm1Ta2lsbEdlbmVyYXRlTW9kYWwnXG5pbXBvcnQgeyBTRUNUSU9OUyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9jb25maWcnXG5pbXBvcnQgeyBTQ0NBSU1Db250ZW50LCBTQ0NBSU1Db250ZW50V3JhcHBlciwgU0NDQUlNTWluaW1pemVkSGlkZSwgU0NDQUlNV3JhcHBlciB9IGZyb20gJy4vQ2hhdEFJTW9kYWwuc3R5bGVzJ1xuaW1wb3J0IHsgTWFpYU1pbmltaXplZFBpbGwgfSBmcm9tICcuL2NvbXBvbmVudHMvTWFpYU1pbmltaXplZFBpbGwnXG5pbXBvcnQgeyB1c2VNaW5pbWl6ZWRQaWxsTm92ZWx0eURvdCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZU1pbmltaXplZFBpbGxOb3ZlbHR5RG90J1xuaW1wb3J0IHtcbiAgZ2V0TWFpYUZsb2F0aW5nUGFuZWxXaWR0aFB4LFxuICBNYWlhQ2hhdE1vZGFsTGF5b3V0TW9kZSxcbiAgcmVzb2x2ZUluaXRpYWxNYWlhQ2hhdExheW91dE1vZGUsXG4gIHNldFN0b3JlZE1haWFDaGF0TGF5b3V0TW9kZSxcbn0gZnJvbSAnLi9sYXlvdXQnXG5pbXBvcnQgeyBkaXNwYXRjaFNraWxsTWVudGlvbkluc2VydCwgZW5zdXJlQWdlbnRzQmVmb3JlU2tpbGxVc2UgfSBmcm9tICcuL0NoYXRBSU1vZGFsLmhlbHBlcnMnXG5pbXBvcnQgeyBGbG9hdGluZ1BhbmVsTW90aW9uLCB1c2VGbG9hdGluZ1BhbmVsRHJhZ1RpbHQgfSBmcm9tICcuL2Zsb2F0aW5nUGFuZWxNb3Rpb24nXG5pbXBvcnQgeyBDaGF0QWlNb2RhbEZvb3RlciB9IGZyb20gJy4vY29tcG9uZW50cy9DaGF0QWlNb2RhbEZvb3RlcidcbmltcG9ydCB7IHZhbGlkYXRlSXNNYWlhIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbHMvdmFsaWRhdGVJc01haWEnXG5pbXBvcnQgeyBpc01hcmtldHBsYWNlR2xvYmFsQ2xvbmVBZ2VudCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2FnZW50RGlzcGxheU5hbWUnXG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2FnZW50J1xuaW1wb3J0IHsgU2tpbGwgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9za2lsbCdcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9Qcm9qZWN0J1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvQ2xpZW50J1xuaW1wb3J0IHsgVGFzayB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL1Rhc2snXG5pbXBvcnQgeyB1c2VGYXFzU3RvcmUgfSBmcm9tICcuLi8uLi8uLi9zdG9yZS91c2VGYXFzU3RvcmUnXG5pbXBvcnQgeyBnZXRDaGF0c1N0b3JlU3RhdGUsIHVzZUNoYXRzU3RvcmUgfSBmcm9tICcuLi8uLi8uLi9zdG9yZS91c2VDaGF0c1N0b3JlJ1xuaW1wb3J0IHR5cGUgeyBDaGF0TGlzdEl0ZW0gfSBmcm9tICcuLi8uLi8uLi9zdG9yZS9jaGF0c1N0b3JlLnR5cGVzJ1xuaW1wb3J0IHsgcmVhZExhc3RBY3RpdmVDaGF0SWQsIHdyaXRlTGFzdEFjdGl2ZUNoYXRJZCB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL21haWFMYXN0Q2hhdFBlcnNpc3RlbmNlJ1xuaW1wb3J0IHtcbiAgY2xlYXJNYWlhUGFuZWxTZXNzaW9uLFxuICBpc1ZhbGlkTWFpYVBhbmVsT3B0aW9uLFxuICBwYXRjaE1haWFQYW5lbFNlc3Npb24sXG4gIHJlYWRNYWlhUGFuZWxTZXNzaW9uLFxuICB0eXBlIE1haWFQYW5lbFNlc3Npb25TbmFwc2hvdCxcbiAgd3JpdGVNYWlhUGFuZWxTZXNzaW9uLFxufSBmcm9tICcuLi8uLi8uLi9zdG9yZS9tYWlhUGFuZWxTZXNzaW9uUGVyc2lzdGVuY2UnXG5pbXBvcnQgeyB1c2VTZXNzaW9uc1N0b3JlIH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUvc2Vzc2lvbnMvdXNlU2Vzc2lvbnNTdG9yZSdcbmltcG9ydCB7IGlzQWN0aXZlU2Vzc2lvblN0YXR1cyB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL3Nlc3Npb25zL3Nlc3Npb25zLnR5cGVzJ1xuaW1wb3J0IHsgZmV0Y2hNYWlhIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbWFpYS9jbGllbnQnXG5pbXBvcnQgeyBmZXRjaEFnZW50RGV0YWlsIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbWFpYS9BZ2VudHMvZmV0Y2hBZ2VudERldGFpbCdcbmltcG9ydCB7IG1hcENPUkxhbmcgfSBmcm9tICcuLi8uLi8uLi9sYW5nL3V0aWxzJ1xuaW1wb3J0IHsgRVZFTlRTLCB1c2VFdmVudCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUV2ZW50J1xuaW1wb3J0IHsgTUFJQV9PUEVOX0ZST01fSE9TVF9FVkVOVCwgdHlwZSBNYWlhSG9zdE9wZW5EZXRhaWwgfSBmcm9tICcuLi8uLi8uLi91dGlscy9tYWlhSG9zdE9wZW4nXG5cbi8qKiBNZXRhZGF0YSBkZSBsYSBzZXNzaW9uIGFiaWVydGEgKGVtaXRpZGEgcG9yIHVzZUNoYXRNZXNzYWdlcyBhbCBjYXJnYXIgdW5hIGNvbnZlcnNhY2nDs24pLiAqL1xudHlwZSBTZXNzaW9uTWV0YSA9IHtcbiAgY2hhdElkOiBzdHJpbmdcbiAgYWdlbnRUeXBlPzogc3RyaW5nXG4gIGFnZW50RW50aXR5Pzogc3RyaW5nXG4gIHByb2plY3RJZD86IG51bWJlclxuICBwcm9qZWN0TmFtZT86IHN0cmluZ1xuICBjbGllbnRJZD86IG51bWJlclxuICBjbGllbnROYW1lPzogc3RyaW5nXG4gIHRhc2tJZD86IG51bWJlclxuICB0YXNrTmFtZT86IHN0cmluZ1xufVxuXG5jb25zdCBMRUdBQ1lfQ09OVEVYVF9FTlRJVElFUyA9IFsncHJvamVjdCcsICd0YXNrJywgJ2NsaWVudCddIGFzIGNvbnN0XG50eXBlIExlZ2FjeUNvbnRleHRFbnRpdHkgPSAodHlwZW9mIExFR0FDWV9DT05URVhUX0VOVElUSUVTKVtudW1iZXJdXG5cbnR5cGUgQWlDaGF0QmFja0Rlc3RpbmF0aW9uID0gJ2dsb2JhbF9jb250ZXh0X2hvbWUnIHwgJ3Rhc2tfaG9tZScgfCAncGxhbm5lcl9ob21lJyB8ICdwcm9qZWN0X2hvbWUnIHwgJ2NsaWVudF9ob21lJ1xuXG4vKiogSG9tZSBnbG9iYWwgZGVsIG9yY2hlc3RyYXRvciAoc29sbyBoZWFkZXIpLiBQbGFubmVyIGVzIGhvbWUgZGUgRlVBcywgbm8gZGUgY29udGV4dG9zLiAqL1xuY29uc3QgaXNHbG9iYWxNYWlhU2VjdGlvbiA9IChzZWN0aW9uOiBTZWN0aW9uKTogYm9vbGVhbiA9PiBzZWN0aW9uID09PSAnaGVhZGVyJ1xuXG5jb25zdCByZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uID0gKFxuICBzZWN0aW9uOiBTZWN0aW9uLFxuICBhZ2VudFR5cGU6IEFnZW50Wyd0eXBlJ10gfCB1bmRlZmluZWQsXG4gIGN1cnJlbnRPcHRpb246IHN0cmluZyxcbiAgaG9tZU9wdGlvbjogc3RyaW5nXG4pOiBBaUNoYXRCYWNrRGVzdGluYXRpb24gPT4ge1xuICBpZiAoaXNHbG9iYWxNYWlhU2VjdGlvbihzZWN0aW9uKSAmJiBhZ2VudFR5cGUgPT09ICdvcmNoZXN0cmF0b3InICYmIGN1cnJlbnRPcHRpb24gPT09IGhvbWVPcHRpb24pIHtcbiAgICByZXR1cm4gJ2dsb2JhbF9jb250ZXh0X2hvbWUnXG4gIH1cbiAgaWYgKHNlY3Rpb24gPT09ICd0YXNrJykgcmV0dXJuICd0YXNrX2hvbWUnXG4gIGlmIChzZWN0aW9uID09PSAncGxhbm5lcicpIHJldHVybiAncGxhbm5lcl9ob21lJ1xuICBpZiAoc2VjdGlvbiA9PT0gJ3Byb2plY3QnKSByZXR1cm4gJ3Byb2plY3RfaG9tZSdcbiAgaWYgKHNlY3Rpb24gPT09ICdjbGllbnQnKSByZXR1cm4gJ2NsaWVudF9ob21lJ1xuICByZXR1cm4gJ2dsb2JhbF9jb250ZXh0X2hvbWUnXG59XG5cbmV4cG9ydCBjb25zdCBJRF9NT0RBTF9DSEFUX0FHRU5UID0gJ21vZGFscy1wb3J0YWwtbWFpYS1jaGF0LWFnZW50J1xuXG5jb25zdCB2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSA9IChzZWN0aW9uOiBTZWN0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCwgdXNlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlVXNlcj4pID0+IHtcbiAgaWYgKCFzZWN0aW9uIHx8ICFjYW5BY2Nlc3NUb0NoYXRBSSh1c2VyKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gUGxhbm5lciB5IHRhc2sgYWJyZW4gc2llbXByZSBlbCBjaGF0IChob21lIGRlIEZVQXMpLCBudW5jYSByZXN1bWVuIGRlIHByb3llY3Rvcy5cbiAgaWYgKHNlY3Rpb24gPT09ICdwbGFubmVyJyB8fCBzZWN0aW9uID09PSAndGFzaycpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKHNlY3Rpb24gPT09ICdoZWFkZXInKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4od2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUyB8fCB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUylcbiAgfVxuXG4gIHJldHVybiBCb29sZWFuKHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MpXG59XG5cbmV4cG9ydCBjb25zdCBDaGF0QUlNb2RhbCA9ICgpID0+IHtcbiAgY29uc3QgdXNlciA9IHVzZVVzZXIoKVxuICBjb25zdCB7IGkxOG4gfSA9IHVzZVRyYW5zbGF0aW9uKFtTRUNUSU9OUy5hYm1BZ2VudF0pXG4gIGNvbnN0IGFtcGxpdHVkRXZlbnQgPSB1c2VFdmVudCgpXG5cbiAgY29uc3Qgc2F2ZWRTZXNzaW9uT25Nb3VudFJlZiA9IHVzZVJlZjxNYWlhUGFuZWxTZXNzaW9uU25hcHNob3QgfCBudWxsPihyZWFkTWFpYVBhbmVsU2Vzc2lvbih1c2VyLmlkKSlcbiAgY29uc3Qgc2hvdWxkUmVzdG9yZUV4cGFuZGVkID0gc2F2ZWRTZXNzaW9uT25Nb3VudFJlZi5jdXJyZW50Py5pc0V4cGFuZGVkID8/IGZhbHNlXG4gIGNvbnN0IHBlbmRpbmdTZXNzaW9uUmVzdG9yZVJlZiA9IHVzZVJlZjxNYWlhUGFuZWxTZXNzaW9uU25hcHNob3QgfCBudWxsPihcbiAgICBzaG91bGRSZXN0b3JlRXhwYW5kZWQgPyBzYXZlZFNlc3Npb25Pbk1vdW50UmVmLmN1cnJlbnQgOiBudWxsXG4gIClcbiAgY29uc3Qgc2Vzc2lvblJlc3RvcmVTdGFydGVkUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBbaXNSZXN0b3JpbmdTZXNzaW9uLCBzZXRJc1Jlc3RvcmluZ1Nlc3Npb25dID0gdXNlU3RhdGUoKCkgPT4gcGVuZGluZ1Nlc3Npb25SZXN0b3JlUmVmLmN1cnJlbnQgIT0gbnVsbClcbiAgY29uc3Qgc2lkZWJhck9wZW5SZWYgPSB1c2VSZWYoc2F2ZWRTZXNzaW9uT25Nb3VudFJlZi5jdXJyZW50Py5zaWRlYmFyT3BlbiA/PyBmYWxzZSlcblxuICAvLyBUcmFzIG5hdmVnYXIgZW4gZWwgaG9zdCAoZnVsbCBwYWdlIHJlbG9hZCksIHJlc3RhdXJhbW9zIGVsIHBhbmVsIHNpIGVzdGFiYSBhYmllcnRvLlxuICBjb25zdCBbaXNNaW5pbWl6ZWQsIHNldElzTWluaW1pemVkXSA9IHVzZVN0YXRlKCgpID0+ICFzaG91bGRSZXN0b3JlRXhwYW5kZWQpXG4gIGNvbnN0IHNldENoYXRWaWV3VmlzaWJsZSA9IHVzZUNoYXRzU3RvcmUoc3RhdGUgPT4gc3RhdGUuc2V0Q2hhdFZpZXdWaXNpYmxlKVxuICBjb25zdCB1bnJlYWRDb3VudCA9IHVzZUNoYXRzU3RvcmUoc3RhdGUgPT4gc3RhdGUudW5yZWFkQ291bnQpXG4gIGNvbnN0IHNob3dNaW5pbWl6ZWROb3ZlbHR5RG90ID0gdXNlTWluaW1pemVkUGlsbE5vdmVsdHlEb3QoaXNNaW5pbWl6ZWQsIHVucmVhZENvdW50KVxuICBjb25zdCBhY3RpdmVDaGF0SWQgPSB1c2VDaGF0c1N0b3JlKHN0YXRlID0+IHN0YXRlLmFjdGl2ZUNoYXRJZClcbiAgLy8gTG9zIFwiLi4uXCIgZGVsIHBpbGwgc2FsZW4gZGVsIG1vdG9yLCBubyBkZSBpc1N0cmVhbWluZy9pc1dyaXRpbmc6IGVzb3MgcmVmbGVqYW5cbiAgLy8gbGEgc2VzacOzbiBhY3RpdmEgeSBxdWVkYW4gc3RhbGUgY3VhbmRvIHVuYSByZXNwdWVzdGEgdGVybWluYSBlbiBiYWNrZ3JvdW5kLlxuICBjb25zdCBoYXNBY3RpdmVTdHJlYW0gPSB1c2VTZXNzaW9uc1N0b3JlKHN0YXRlID0+XG4gICAgT2JqZWN0LnZhbHVlcyhzdGF0ZS5tZXRhKS5zb21lKG1ldGEgPT4gaXNBY3RpdmVTZXNzaW9uU3RhdHVzKG1ldGEuc3RhdHVzKSlcbiAgKVxuXG4gIC8qKiBnb1RvQ2hhdCAvIGhhbmRsZUdvSG9tZSBzZSBkZWZpbmVuIG3DoXMgYWJham87IGxvcyByZWZzIGV2aXRhbiBkZXBlbmRlciBkZWwgb3JkZW4gZGUgZGVjbGFyYWNpw7NuLiAqL1xuICBjb25zdCBnb1RvQ2hhdFJlZiA9IHVzZVJlZjwoKGNoYXQ6IENoYXRMaXN0SXRlbSkgPT4gdm9pZCkgfCBudWxsPihudWxsKVxuICBjb25zdCBnb0hvbWVSZWYgPSB1c2VSZWY8KCgpID0+IHZvaWQpIHwgbnVsbD4obnVsbClcblxuICAvLyBNb250YSBjZXJyYWRhIHNhbHZvIHJlc3RhdXJhY2nDs24gZGUgc2VzacOzbjogc2kgZWwgcGFuZWwgbm8gZXN0w6EgdmlzaWJsZSwgbGFzIHJlc3B1ZXN0YXNcbiAgLy8gbnVldmFzIHF1ZWRhbiBjb21vIG5vIGxlw61kYXMuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFwZW5kaW5nU2Vzc2lvblJlc3RvcmVSZWYuY3VycmVudCkge1xuICAgICAgc2V0Q2hhdFZpZXdWaXNpYmxlKGZhbHNlKVxuICAgIH1cbiAgfSwgW3NldENoYXRWaWV3VmlzaWJsZV0pXG5cbiAgLy8gUGVyc2lzdGltb3MgbGEgY29udmVyc2FjacOzbiBhYmllcnRhIHBhcmEgcG9kZXIgdm9sdmVyIGEgZWxsYSBkZXNkZSBlbCBwaWxsIGRlc3B1w6lzXG4gIC8vIGRlIG5hdmVnYXIgbyByZWZyZXNjYXIuIEVsIHRha2VvdmVyIGRlc2RlIHVuIGhvc3QgbGEgbGltcGlhICh2YSBhbCBIb21lKS5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoYWN0aXZlQ2hhdElkKSB7XG4gICAgICB3cml0ZUxhc3RBY3RpdmVDaGF0SWQodXNlci5pZCwgYWN0aXZlQ2hhdElkKVxuICAgIH1cbiAgfSwgW2FjdGl2ZUNoYXRJZCwgdXNlci5pZF0pXG5cbiAgY29uc3QgaGFuZGxlTWluaW1pemUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgYW1wbGl0dWRFdmVudChFVkVOVFMuYWlDaGF0TWluaW1pemUpXG4gICAgc2V0SXNNaW5pbWl6ZWQodHJ1ZSlcbiAgICBzZXRDaGF0Vmlld1Zpc2libGUoZmFsc2UpXG4gICAgd3JpdGVNYWlhUGFuZWxTZXNzaW9uKHVzZXIuaWQsIHsgaXNFeHBhbmRlZDogZmFsc2UgfSlcbiAgfSwgW2FtcGxpdHVkRXZlbnQsIHNldENoYXRWaWV3VmlzaWJsZSwgdXNlci5pZF0pXG5cbiAgY29uc3QgZm9jdXNDaGF0SW5wdXQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ21haWEtaW5wdXQtcmVmb2N1cycpKVxuICAgIH0sIDEwMClcbiAgfSwgW10pXG5cbiAgY29uc3QgW3VzZXJJbml0aWFsTWVzc2FnZSwgc2V0VXNlckluaXRpYWxNZXNzYWdlXSA9IHVzZVN0YXRlPHtcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgICBhdHRhY2htZW50czogQXR0YWNobWVudEZpbGVbXVxuICAgIGZhcUlkPzogc3RyaW5nXG4gICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmdcbiAgICBtZW50aW9ucz86IENvbnRleHRNZW50aW9uW11cbiAgICBmdWFJZD86IHN0cmluZ1xuICAgIHNjSWQ/OiBzdHJpbmdcbiAgICBjb250ZXh0RGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIH0+KHtcbiAgICBtZXNzYWdlOiAnJyxcbiAgICBhdHRhY2htZW50czogW10sXG4gIH0pXG4gIGNvbnN0IFtpbml0aWFsQ2hhdElkLCBzZXRJbml0aWFsQ2hhdElkXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtuZXdDaGF0S2V5LCBzZXROZXdDaGF0S2V5XSA9IHVzZVN0YXRlKDApXG4gIGNvbnN0IFtzZXNzaW9uTWV0YSwgc2V0U2Vzc2lvbk1ldGFdID0gdXNlU3RhdGU8U2Vzc2lvbk1ldGEgfCBudWxsPihudWxsKVxuICBjb25zdCBbc2VuZE1lc3NhZ2VGdW5jdGlvbiwgc2V0U2VuZE1lc3NhZ2VGdW5jdGlvbl0gPSB1c2VTdGF0ZTxcbiAgICB8ICgoXG4gICAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgICAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLFxuICAgICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcsXG4gICAgICAgIG1lbnRpb25zPzogQ29udGV4dE1lbnRpb25bXSxcbiAgICAgICAgZnVhSWQ/OiBzdHJpbmcsXG4gICAgICAgIHNjSWQ/OiBzdHJpbmdcbiAgICAgICkgPT4gdm9pZClcbiAgICB8IG51bGxcbiAgPihudWxsKVxuICBjb25zdCBbc3RvcEdlbmVyYXRpb25GdW5jdGlvbiwgc2V0U3RvcEdlbmVyYXRpb25GdW5jdGlvbl0gPSB1c2VTdGF0ZTwoKCkgPT4gdm9pZCkgfCBudWxsPihudWxsKVxuICBjb25zdCBbaXNTdHJlYW1pbmcsIHNldElzU3RyZWFtaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbaXNXcml0aW5nLCBzZXRJc1dyaXRpbmddID0gdXNlU3RhdGUoZmFsc2UpXG5cbiAgY29uc3QgW3JlZmV0Y2hDaGF0cywgc2V0UmVmZXRjaENoYXRzXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbY3VycmVudE9wdGlvbiwgc2V0Q3VycmVudE9wdGlvbl0gPSB1c2VTdGF0ZTxvcHRpb25zPigoKSA9PiB7XG4gICAgY29uc3Qgc2F2ZWQgPSBzYXZlZFNlc3Npb25Pbk1vdW50UmVmLmN1cnJlbnRcbiAgICBpZiAoc2F2ZWQ/LmFnZW50c05hdkFjdGl2ZSA9PT0gJ215QWdlbnRzJykgcmV0dXJuIG9wdGlvbnMubXlBZ2VudHNcbiAgICBpZiAoc2F2ZWQ/LmFnZW50c05hdkFjdGl2ZSA9PT0gJ215U2tpbGxzJyAmJiBjYW5BY2Nlc3NUb1NraWxscyh1c2VyKSkgcmV0dXJuIG9wdGlvbnMubXlTa2lsbHNcbiAgICBjb25zdCBzYXZlZE9wdGlvbiA9IHNhdmVkPy5jdXJyZW50T3B0aW9uXG4gICAgcmV0dXJuIHNhdmVkT3B0aW9uICYmIGlzVmFsaWRNYWlhUGFuZWxPcHRpb24oc2F2ZWRPcHRpb24pID8gKHNhdmVkT3B0aW9uIGFzIG9wdGlvbnMpIDogb3B0aW9ucy5ob21lXG4gIH0pXG4gIGNvbnN0IFtoYXNFcnJvciwgc2V0SGFzRXJyb3JdID0gdXNlU3RhdGUoZmFsc2UpXG4gIC8vIEVuIHByb2plY3QvY2xpZW50L3Rhc2s6IGVsIHVzdWFyaW8gcmVpbmljacOzIGVsIGNvbnRleHRvIGRlbCBvcmNoZXN0cmF0b3IgKGxvIGxpbXBpw7MgeSBwYXPDsyBwb3JcbiAgLy8gZWwgc2VsZWN0b3IgZGUgY29udGV4dG9zIHJlY2llbnRlcykuIEhhYmlsaXRhIGVsIGJvdMOzbiBcInZvbHZlclwiIGVuIGVsIGhvbWUgcGFzbyAyIGRlIGVzYXNcbiAgLy8gc2VjY2lvbmVzLiBTZSByZXNldGVhIGFsIGNlcnJhci9yZWFicmlyIGVsIG1vZGFsIChlbCBjb21wb25lbnRlIHNlIGRlc21vbnRhKS5cbiAgY29uc3QgW2RpZFJlc2V0Q29udGV4dEluU2VjdGlvbiwgc2V0RGlkUmVzZXRDb250ZXh0SW5TZWN0aW9uXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBwcmV2SGFzUGlubmVkQ29udGV4dFJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgaGFuZGxlcnMgPSB1c2VNZW1vKCgpID0+IGJ1aWxkSGFuZGxlcnMoc2V0Q3VycmVudE9wdGlvbiwgc2V0SGFzRXJyb3IpLCBbXSlcbiAgY29uc3QgW3NpZGViYXJIYXNFcnJvciwgc2V0U2lkZWJhckhhc0Vycm9yXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBsYW5nID0gaTE4bi5sYW5ndWFnZSA9PT0gJ2JyJyA/ICdwdC1icicgOiBpMThuLmxhbmd1YWdlXG5cbiAgbW9tZW50LmxvY2FsZShsYW5nKVxuXG4gIGNvbnN0IHtcbiAgICBzZWxlY3RBZ2VudCxcbiAgICBjbGVhckFnZW50LFxuICAgIHNlY3Rpb24sXG4gICAgYWdlbnQsXG4gICAgcHJvamVjdCxcbiAgICBjbGllbnQsXG4gICAgdGFzayxcbiAgICBjaGlwc1Byb2plY3QsXG4gICAgdG9nZ2xlV2ViU2VhcmNoLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIHNldENoaXBzUHJvamVjdCxcbiAgICBzZXRDbGllbnQsXG4gICAgc2V0UHJvamVjdCxcbiAgICBiYW5uZXJFbnRyeUZhcSxcbiAgICBzZXRUYXNrLFxuICB9ID0gdXNlR2xvYmFsQ29udGV4dCgpXG5cbiAgLy8gWi1pbmRleCBwYXJhIHRvb2x0aXBzIGVuIHNlY3Rpb24gJ3Rhc2snIChtb2RhbCBmbG90YW50ZSBlbGV2YWRvKVxuICBjb25zdCB0b29sdGlwWkluZGV4ID0gdXNlTWFpYVRhc2tQYW5lbFpJbmRleCgxNTAwLCAnb3ZlcmxheScpXG5cbiAgY29uc3Qge1xuICAgIGFnZW50cyxcbiAgICBsb2FkaW5nLFxuICAgIGxvYWRpbmdNb3JlLFxuICAgIGVycm9yOiBhZ2VudEVycm9yLFxuICAgIGhhbmRsZUdldEFnZW50cyxcbiAgICBsb2FkTW9yZUFnZW50cyxcbiAgICBzZWFyY2hDdXN0b21BZ2VudHMsXG4gICAgc2VhcmNoTG9hZGluZyxcbiAgICBhZGRBZ2VudCxcbiAgICByZW1vdmVBZ2VudCxcbiAgICB1cGRhdGVBZ2VudCxcbiAgICB1cGRhdGVBZ2VudEZhdm9yaXRlLFxuICAgIHNlbGVjdEZpcnN0QWdlbnQsXG4gICAgc29ydEFnZW50c0xpc3QsXG4gIH0gPSB1c2VHZXRBZ2VudHMoeyBzZWxlY3RBZ2VudCwgc2VjdGlvbiwgYWdlbnQsIGhhbmRsZUdvSG9tZTogaGFuZGxlcnMuaG9tZSB9KVxuXG4gIGNvbnN0IGFnZW50c0RhdGFSZWYgPSB1c2VSZWYoYWdlbnRzLmRhdGEpXG4gIGFnZW50c0RhdGFSZWYuY3VycmVudCA9IGFnZW50cy5kYXRhXG5cbiAgY29uc3Qge1xuICAgIG15U2tpbGxzLFxuICAgIHNoYXJlZFNraWxscyxcbiAgICBsb2FkaW5nOiBsb2FkaW5nU2tpbGxzLFxuICAgIGhhbmRsZUdldFNraWxscyxcbiAgICBhZGRTa2lsbCxcbiAgICB1cGRhdGVTa2lsbEluTGlzdCxcbiAgICByZW1vdmVTa2lsbCxcbiAgfSA9IHVzZUdldFNraWxscygpXG5cbiAgY29uc3QgaXNNQUlBID0gdmFsaWRhdGVJc01haWEoYWdlbnQgYXMgQWdlbnQpXG5cbiAgY29uc3QgdXNlckhhc1Blcm1pc3Npb25zID1cbiAgICAodXNlcj8ucGVybWlzc2lvbnM/LmFpX2FnZW50cz8uY3JlYXRlIHx8XG4gICAgICB1c2VyPy5wZXJtaXNzaW9ucz8uYWlfYWdlbnRzPy5lZGl0IHx8XG4gICAgICB1c2VyPy5wZXJtaXNzaW9ucz8uYWlfYWdlbnRzPy5kZWxldGUpICYmXG4gICAgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFNcblxuICBjb25zdCB1c2VySGFzU2tpbGxzQWNjZXNzID0gY2FuQWNjZXNzVG9Ta2lsbHModXNlcilcblxuICBjb25zdCBjb21wdXRlZEN1cnJlbnRPcHRpb24gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBpc0dsb2JhbFNwZWNpYWxpc3QgPSBpc01BSUEgJiYgYWdlbnQ/LmVudGl0eSA9PT0gJ2dsb2JhbCdcbiAgICBjb25zdCBpc1Byb2plY3RTcGVjaWFsaXN0ID0gaXNNQUlBICYmIChhZ2VudD8uZW50aXR5ID09PSAncHJvamVjdCcgfHwgYWdlbnQ/LmVudGl0eSA9PSBudWxsKVxuICAgIGNvbnN0IGlzQ2xpZW50U3BlY2lhbGlzdCA9IGlzTUFJQSAmJiBhZ2VudD8uZW50aXR5ID09PSAnY2xpZW50J1xuICAgIGNvbnN0IGlzTWFpYWtlciA9IGlzTWFya2V0cGxhY2VHbG9iYWxDbG9uZUFnZW50KGFnZW50KVxuXG4gICAgaWYgKGN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMubXlBZ2VudHMgJiYgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLm15QWdlbnRzXG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMubXlTa2lsbHMgJiYgY2FuQWNjZXNzVG9Ta2lsbHModXNlcikpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLm15U2tpbGxzXG4gICAgfVxuXG4gICAgLy8gRWwgb3JjaGVzdHJhdG9yIChNQUlBKSBtdWVzdHJhIHN1IGhvbWUgY29uIEZBUXMvYWNjaW9uZXMgZnJlY3VlbnRlczsgZWwgcmVzdG8gZGVcbiAgICAvLyBsb3MgZ2xvYmFsIHNwZWNpYWxpc3RzIChjbG9uZXMgZ2xvYmFsZXMgbm8tbWFpYWtlcikgc2lndWVuIHllbmRvIGRpcmVjdG8gYWwgY2hhdC5cbiAgICBpZiAoaXNHbG9iYWxTcGVjaWFsaXN0ICYmICFpc01haWFrZXIgJiYgYWdlbnQ/LnR5cGUgIT09ICdvcmNoZXN0cmF0b3InICYmIGN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuaG9tZSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuY2hhdFxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFNob3dQcm9qZWN0U2VsZWN0b3IgPSBjdXJyZW50T3B0aW9uICE9PSBvcHRpb25zLmNoYXQgJiYgaXNQcm9qZWN0U3BlY2lhbGlzdCAmJiAhcHJvamVjdFxuICAgIGNvbnN0IHNob3VsZFNob3dDbGllbnRTZWxlY3RvciA9IGN1cnJlbnRPcHRpb24gIT09IG9wdGlvbnMuY2hhdCAmJiBpc0NsaWVudFNwZWNpYWxpc3QgJiYgIWNsaWVudFxuXG4gICAgaWYgKHNob3VsZFNob3dQcm9qZWN0U2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnByb2plY3RTZWxlY3RvclxuICAgIH1cbiAgICBpZiAoc2hvdWxkU2hvd0NsaWVudFNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5jbGllbnRTZWxlY3RvclxuICAgIH1cbiAgICByZXR1cm4gY3VycmVudE9wdGlvblxuICB9LCBbY3VycmVudE9wdGlvbiwgcHJvamVjdCwgY2xpZW50LCBpc01BSUEsIGFnZW50Py5lbnRpdHksIGFnZW50Py5uYW1lLCBhZ2VudD8udHlwZSwgdXNlcl0pXG5cbiAgY29uc3QgaXNNYWlha2VyQWdlbnRTZWxlY3RlZCA9IHVzZU1lbW8oKCkgPT4gaXNNYXJrZXRwbGFjZUdsb2JhbENsb25lQWdlbnQoYWdlbnQpLCBbYWdlbnRdKVxuXG4gIGNvbnN0IHNpZGViYXJBZ2VudHNOYXZBY3RpdmUgPSB1c2VNZW1vKCgpOiAnbWFpYWtlcicgfCAnbXlBZ2VudHMnIHwgJ215U2tpbGxzJyB8IG51bGwgPT4ge1xuICAgIGlmIChjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMubXlTa2lsbHMpIHJldHVybiAnbXlTa2lsbHMnXG4gICAgaWYgKGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5teUFnZW50cykgcmV0dXJuICdteUFnZW50cydcbiAgICBpZiAoaXNNYWlha2VyQWdlbnRTZWxlY3RlZCkgcmV0dXJuICdtYWlha2VyJ1xuICAgIHJldHVybiBudWxsXG4gIH0sIFtjb21wdXRlZEN1cnJlbnRPcHRpb24sIGlzTWFpYWtlckFnZW50U2VsZWN0ZWRdKVxuXG4gIC8qIFJlYWN0aXZhciBjb24gbGEgZmlsYSDigJxNaXMgYWdlbnRlc+KAnSBlbiBTaWRlYmFyOiBteUFnZW50c0NvdW50IHByb3BcbiAgY29uc3Qgc2lkZWJhck15QWdlbnRzQ291bnQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gYWdlbnRzLmRhdGEuZmlsdGVyKFxuICAgICAgYSA9PiAhKGEudHlwZSA9PT0gJ29yY2hlc3RyYXRvcicgfHwgKGEudHlwZSA9PT0gJ2Nsb25lJyAmJiBhLmVudGl0eSA9PT0gJ2dsb2JhbCcgJiYgLyhtYWlha2VyfG1hcmtldHBsYWNlKS9pLnRlc3QoYS5uYW1lIHx8ICcnKSkpXG4gICAgKVxuICAgICAgLmxlbmd0aFxuICB9LCBbYWdlbnRzLmRhdGFdKVxuICAqL1xuXG4gIGNvbnN0IGFnZW50c0ZldGNoZWRSZWYgPSB1c2VSZWYoZmFsc2UpXG5cbiAgY29uc3Qgc2VsZWN0b3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtJRF9NT0RBTF9DSEFUX0FHRU5UfWApXG5cbiAgLy8gVGFzayBwYW5lbCwgcGxhbm5lciB5IGJhbm5lciBkZSBwcm95ZWN0byBhYnJlbiBlbiBmbG90YW50ZSBwb3IgZGVmYXVsdCAobm8gdGFwYXIgZWwgY29udGV4dG8gZGV0csOhcykuXG4gIC8vIEZ1ZXJhIGRlIGVzb3MgY29udGV4dG9zIHNlIHJlc3BldGEgbGEgcHJlZmVyZW5jaWEgZ3VhcmRhZGEgZW4gbG9jYWxTdG9yYWdlLlxuICBjb25zdCBbbGF5b3V0TW9kZSwgc2V0TGF5b3V0TW9kZV0gPSB1c2VTdGF0ZTxNYWlhQ2hhdE1vZGFsTGF5b3V0TW9kZT4oKCkgPT5cbiAgICByZXNvbHZlSW5pdGlhbE1haWFDaGF0TGF5b3V0TW9kZSh7IHNlY3Rpb24sIGJhbm5lckVudHJ5RmFxIH0pXG4gIClcblxuICBjb25zdCBoYW5kbGVMYXlvdXRNb2RlQ2hhbmdlID0gdXNlQ2FsbGJhY2soKG1vZGU6IE1haWFDaGF0TW9kYWxMYXlvdXRNb2RlKSA9PiB7XG4gICAgc2V0U3RvcmVkTWFpYUNoYXRMYXlvdXRNb2RlKG1vZGUpXG4gICAgc2V0TGF5b3V0TW9kZShtb2RlKVxuICB9LCBbXSlcbiAgY29uc3QgZXhwYW5kZWQgPSBsYXlvdXRNb2RlID09PSAnZnVsbHNjcmVlbidcbiAgY29uc3QgaXNGbG9hdGluZyA9IGxheW91dE1vZGUgPT09ICdmbG9hdGluZydcbiAgY29uc3QgY29udGVudFdyYXBwZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IFtkcmFnUG9zaXRpb24sIHNldERyYWdQb3NpdGlvbl0gPSB1c2VTdGF0ZTx7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsPihcbiAgICAoKSA9PiBzYXZlZFNlc3Npb25Pbk1vdW50UmVmLmN1cnJlbnQ/LmRyYWdQb3NpdGlvbiA/PyBudWxsXG4gIClcbiAgY29uc3QgeyB0aWx0TW90aW9uLCBzdGFydFBvaW50ZXJUcmFja2luZywgc2FtcGxlUG9pbnRlck1vdmUsIGVuZFBvaW50ZXJUcmFja2luZyB9ID1cbiAgICB1c2VGbG9hdGluZ1BhbmVsRHJhZ1RpbHQoaXNGbG9hdGluZylcbiAgY29uc3QgZHJhZ1N0YXRlUmVmID0gdXNlUmVmPHtcbiAgICBwb2ludGVySWQ6IG51bWJlclxuICAgIG9mZnNldFg6IG51bWJlclxuICAgIG9mZnNldFk6IG51bWJlclxuICB9IHwgbnVsbD4obnVsbClcblxuICBjb25zdCBjbGFtcERyYWdQb3NpdGlvbiA9IHVzZUNhbGxiYWNrKCh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnRXcmFwcGVyID0gY29udGVudFdyYXBwZXJSZWYuY3VycmVudFxuICAgIGlmICghY29udGVudFdyYXBwZXIpIHtcbiAgICAgIHJldHVybiB7IHgsIHkgfVxuICAgIH1cblxuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gY29udGVudFdyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCBvZmZzZXQgPSAxNlxuICAgIGNvbnN0IG1heFggPSBNYXRoLm1heChvZmZzZXQsIHdpbmRvdy5pbm5lcldpZHRoIC0gd2lkdGggLSBvZmZzZXQpXG4gICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KG9mZnNldCwgd2luZG93LmlubmVySGVpZ2h0IC0gaGVpZ2h0IC0gb2Zmc2V0KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IE1hdGgubWluKE1hdGgubWF4KHgsIG9mZnNldCksIG1heFgpLFxuICAgICAgeTogTWF0aC5taW4oTWF0aC5tYXgoeSwgb2Zmc2V0KSwgbWF4WSksXG4gICAgfVxuICB9LCBbXSlcblxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChsYXlvdXRNb2RlICE9PSAnZmxvYXRpbmcnKSB7XG4gICAgICBzZXREcmFnUG9zaXRpb24obnVsbClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNldERyYWdQb3NpdGlvbihwcmV2ID0+IHtcbiAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgIHJldHVybiBjbGFtcERyYWdQb3NpdGlvbihwcmV2LngsIHByZXYueSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhZCA9IDE2XG4gICAgICBjb25zdCB4ID0gd2luZG93LmlubmVyV2lkdGggLSBnZXRNYWlhRmxvYXRpbmdQYW5lbFdpZHRoUHgoKSAtIHBhZFxuICAgICAgcmV0dXJuIGNsYW1wRHJhZ1Bvc2l0aW9uKHgsIHBhZClcbiAgICB9KVxuICB9LCBbbGF5b3V0TW9kZSwgY2xhbXBEcmFnUG9zaXRpb25dKVxuXG4gIGNvbnN0IGhhbmRsZURyYWdFbmQgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IFJlYWN0UG9pbnRlckV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgICAgZW5kUG9pbnRlclRyYWNraW5nKClcbiAgICAgIGlmIChkcmFnU3RhdGVSZWYuY3VycmVudD8ucG9pbnRlcklkICE9PSBldmVudC5wb2ludGVySWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGRyYWdTdGF0ZVJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0ID0gJydcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJydcblxuICAgICAgaWYgKGxheW91dE1vZGUgPT09ICdmbG9hdGluZycgJiYgY29udGVudFdyYXBwZXJSZWYuY3VycmVudCkge1xuICAgICAgICBjb25zdCByZWN0ID0gY29udGVudFdyYXBwZXJSZWYuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICBwYXRjaE1haWFQYW5lbFNlc3Npb24odXNlci5pZCwgeyBkcmFnUG9zaXRpb246IHsgeDogcmVjdC5sZWZ0LCB5OiByZWN0LnRvcCB9IH0pXG4gICAgICB9XG4gICAgfSxcbiAgICBbZW5kUG9pbnRlclRyYWNraW5nLCBsYXlvdXRNb2RlLCB1c2VyLmlkXVxuICApXG5cbiAgY29uc3QgaGFuZGxlRHJhZ01vdmUgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IFJlYWN0UG9pbnRlckV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgICAgY29uc3QgZHJhZ1N0YXRlID0gZHJhZ1N0YXRlUmVmLmN1cnJlbnRcbiAgICAgIGlmICghZHJhZ1N0YXRlIHx8IGRyYWdTdGF0ZS5wb2ludGVySWQgIT09IGV2ZW50LnBvaW50ZXJJZCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgc2FtcGxlUG9pbnRlck1vdmUoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSlcblxuICAgICAgY29uc3QgbmV4dFBvc2l0aW9uID0gY2xhbXBEcmFnUG9zaXRpb24oZXZlbnQuY2xpZW50WCAtIGRyYWdTdGF0ZS5vZmZzZXRYLCBldmVudC5jbGllbnRZIC0gZHJhZ1N0YXRlLm9mZnNldFkpXG5cbiAgICAgIHNldERyYWdQb3NpdGlvbihwcmV2ID0+IHtcbiAgICAgICAgaWYgKHByZXYgJiYgcHJldi54ID09PSBuZXh0UG9zaXRpb24ueCAmJiBwcmV2LnkgPT09IG5leHRQb3NpdGlvbi55KSB7XG4gICAgICAgICAgcmV0dXJuIHByZXZcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dFBvc2l0aW9uXG4gICAgICB9KVxuICAgIH0sXG4gICAgW2NsYW1wRHJhZ1Bvc2l0aW9uLCBzYW1wbGVQb2ludGVyTW92ZV1cbiAgKVxuXG4gIGNvbnN0IHJlc29sdmVkRHJhZ1Bvc2l0aW9uID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKGxheW91dE1vZGUgIT09ICdmbG9hdGluZycpIHtcbiAgICAgIHJldHVybiBkcmFnUG9zaXRpb25cbiAgICB9XG4gICAgaWYgKGRyYWdQb3NpdGlvbikge1xuICAgICAgcmV0dXJuIGRyYWdQb3NpdGlvblxuICAgIH1cbiAgICBjb25zdCBwYWQgPSAxNlxuICAgIGNvbnN0IHggPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdy5pbm5lcldpZHRoIC0gZ2V0TWFpYUZsb2F0aW5nUGFuZWxXaWR0aFB4KCkgLSBwYWQgOiBwYWRcbiAgICByZXR1cm4gY2xhbXBEcmFnUG9zaXRpb24oeCwgcGFkKVxuICB9LCBbbGF5b3V0TW9kZSwgZHJhZ1Bvc2l0aW9uLCBjbGFtcERyYWdQb3NpdGlvbl0pXG5cbiAgY29uc3QgaGFuZGxlRHJhZ1N0YXJ0ID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBSZWFjdFBvaW50ZXJFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICAgIGlmICghaXNGbG9hdGluZyB8fCBldmVudC5idXR0b24gIT09IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudFxuICAgICAgaWYgKHRhcmdldC5jbG9zZXN0KCdidXR0b24sIGEsIGlucHV0LCB0ZXh0YXJlYSwgc2VsZWN0LCBbcm9sZT1cImJ1dHRvblwiXSwgW2RhdGEtbm8tZHJhZz1cInRydWVcIl0nKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgY29udGVudFdyYXBwZXIgPSBjb250ZW50V3JhcHBlclJlZi5jdXJyZW50XG4gICAgICBpZiAoIWNvbnRlbnRXcmFwcGVyKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWN0ID0gY29udGVudFdyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgIGNvbnN0IGluaXRpYWxQb3NpdGlvbiA9IHJlc29sdmVkRHJhZ1Bvc2l0aW9uID8/IGNsYW1wRHJhZ1Bvc2l0aW9uKHJlY3QubGVmdCwgcmVjdC50b3ApXG4gICAgICBjb25zdCBwb2ludGVyT2Zmc2V0WCA9IGV2ZW50LmNsaWVudFggLSBpbml0aWFsUG9zaXRpb24ueFxuICAgICAgY29uc3QgcG9pbnRlck9mZnNldFkgPSBldmVudC5jbGllbnRZIC0gaW5pdGlhbFBvc2l0aW9uLnlcblxuICAgICAgc2V0RHJhZ1Bvc2l0aW9uKGluaXRpYWxQb3NpdGlvbilcbiAgICAgIGRyYWdTdGF0ZVJlZi5jdXJyZW50ID0ge1xuICAgICAgICBwb2ludGVySWQ6IGV2ZW50LnBvaW50ZXJJZCxcbiAgICAgICAgb2Zmc2V0WDogcG9pbnRlck9mZnNldFgsXG4gICAgICAgIG9mZnNldFk6IHBvaW50ZXJPZmZzZXRZLFxuICAgICAgfVxuXG4gICAgICBldmVudC5jdXJyZW50VGFyZ2V0LnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZClcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0ID0gJ25vbmUnXG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9ICdncmFiYmluZydcbiAgICAgIGFtcGxpdHVkRXZlbnQoRVZFTlRTLmFpQ2hhdERyYWdnYWJsZSlcbiAgICAgIHN0YXJ0UG9pbnRlclRyYWNraW5nKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpXG4gICAgfSxcbiAgICBbY2xhbXBEcmFnUG9zaXRpb24sIGlzRmxvYXRpbmcsIHJlc29sdmVkRHJhZ1Bvc2l0aW9uLCBzdGFydFBvaW50ZXJUcmFja2luZ11cbiAgKVxuXG4gIGNvbnN0IHN0YXJ0Q2hhdCA9IHVzZUNhbGxiYWNrKFxuICAgIChcbiAgICAgIG1lc3NhZ2U/OiBzdHJpbmcsXG4gICAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sXG4gICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nLFxuICAgICAgbWVudGlvbnM/OiBDb250ZXh0TWVudGlvbltdLFxuICAgICAgZnVhSWQ/OiBzdHJpbmcsXG4gICAgICBzY0lkPzogc3RyaW5nLFxuICAgICAgY29udGV4dERhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgaWYgKHNpZGViYXJIYXNFcnJvcikge1xuICAgICAgICBzZXRTaWRlYmFySGFzRXJyb3IoZmFsc2UpXG4gICAgICB9XG4gICAgICBzZXRJbml0aWFsQ2hhdElkKG51bGwpXG4gICAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2Uoe1xuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8ICcnLFxuICAgICAgICBhdHRhY2htZW50czogYXR0YWNobWVudHMgfHwgW10sXG4gICAgICAgIC4uLihmYXFJZCA/IHsgZmFxSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50U3VnZ2VzdGlvbklkID8geyBhZ2VudFN1Z2dlc3Rpb25JZCB9IDoge30pLFxuICAgICAgICAuLi4obWVudGlvbnMgJiYgbWVudGlvbnMubGVuZ3RoID4gMCA/IHsgbWVudGlvbnMgfSA6IHt9KSxcbiAgICAgICAgLi4uKGZ1YUlkID8geyBmdWFJZCB9IDoge30pLFxuICAgICAgICAuLi4oc2NJZCA/IHsgc2NJZCB9IDoge30pLFxuICAgICAgICAuLi4oY29udGV4dERhdGEgPyB7IGNvbnRleHREYXRhIH0gOiB7fSksXG4gICAgICB9KVxuICAgICAgaGFuZGxlcnMuY2hhdCgpXG4gICAgfSxcbiAgICBbaGFuZGxlcnMsIHNpZGViYXJIYXNFcnJvcl1cbiAgKVxuXG4gIGNvbnN0IGJhbm5lckZhcUF1dG9TZW50UmVmID0gdXNlUmVmKGZhbHNlKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZW50aXR5UmVhZHkgPSBzZWN0aW9uID09PSAncHJvamVjdCcgPyBCb29sZWFuKHByb2plY3Q/LmlkKSA6IHNlY3Rpb24gPT09ICdjbGllbnQnID8gQm9vbGVhbihjbGllbnQ/LmlkKSA6IHRydWVcblxuICAgIGlmICghYmFubmVyRW50cnlGYXE/LmZhcVRpdGxlPy50cmltKCkgfHwgYmFubmVyRmFxQXV0b1NlbnRSZWYuY3VycmVudCB8fCBsb2FkaW5nIHx8ICFhZ2VudD8uaWQgfHwgIWVudGl0eVJlYWR5KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBiYW5uZXJGYXFBdXRvU2VudFJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgIHN0YXJ0Q2hhdChcbiAgICAgIGJhbm5lckVudHJ5RmFxLmZhcVRpdGxlLFxuICAgICAgW10sXG4gICAgICBiYW5uZXJFbnRyeUZhcS5mYXFJZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGJhbm5lckVudHJ5RmFxLmNvbnRleHREYXRhXG4gICAgKVxuICB9LCBbXG4gICAgYmFubmVyRW50cnlGYXE/LmZhcUlkLFxuICAgIGJhbm5lckVudHJ5RmFxPy5mYXFUaXRsZSxcbiAgICBiYW5uZXJFbnRyeUZhcT8uY29udGV4dERhdGEsXG4gICAgbG9hZGluZyxcbiAgICBhZ2VudD8uaWQsXG4gICAgYWdlbnQ/LmVudGl0eSxcbiAgICBwcm9qZWN0Py5pZCxcbiAgICBjbGllbnQ/LmlkLFxuICAgIHNlY3Rpb24sXG4gICAgc3RhcnRDaGF0LFxuICBdKVxuXG4gIGNvbnN0IGdvVG9DaGF0ID0gdXNlQ2FsbGJhY2soXG4gICAgKGNoYXQ6IGFueSkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbklkID0gY2hhdC5zZXNzaW9uRXh0ZXJuYWxJZCBhcyBzdHJpbmdcblxuICAgICAgZ2V0Q2hhdHNTdG9yZVN0YXRlKCkuc2V0QWN0aXZlQ2hhdElkKHNlc3Npb25JZClcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdzaWRlYmFyLXNlbGVjdC1zZXNzaW9uJywgeyBkZXRhaWw6IHsgc2Vzc2lvbklkIH0gfSkpXG5cbiAgICAgIHNldFVzZXJJbml0aWFsTWVzc2FnZSh7IG1lc3NhZ2U6ICcnLCBhdHRhY2htZW50czogW10gfSlcbiAgICAgIHNldEluaXRpYWxDaGF0SWQoc2Vzc2lvbklkKVxuICAgICAgY29uc3Qgc2VsZWN0ZWRBZ2VudCA9IGFnZW50cy5kYXRhLmZpbmQoYWdlbnRJdGVtID0+IGFnZW50SXRlbS5pZCA9PT0gY2hhdC5hZ2VudElkKVxuICAgICAgaWYgKHNlbGVjdGVkQWdlbnQpIHtcbiAgICAgICAgc2VsZWN0QWdlbnQoc2VsZWN0ZWRBZ2VudClcbiAgICAgIH1cbiAgICAgIC8vIERpc3BhdGNoIGV2ZW50IHRvIGNsZWFyIHRoZSBpbnB1dCB0ZXh0YXJlYVxuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2NoYXQtc2Vzc2lvbi1jaGFuZ2VkJykpXG4gICAgICBoYW5kbGVycy5jaGF0KClcbiAgICB9LFxuICAgIFtoYW5kbGVycywgYWdlbnRzLCBzZWxlY3RBZ2VudF1cbiAgKVxuXG4gIGdvVG9DaGF0UmVmLmN1cnJlbnQgPSBnb1RvQ2hhdFxuXG4gIGNvbnN0IGhhbmRsZVNpZGViYXJPcGVuQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wZW46IGJvb2xlYW4pID0+IHtcbiAgICAgIHNpZGViYXJPcGVuUmVmLmN1cnJlbnQgPSBvcGVuXG4gICAgICBwYXRjaE1haWFQYW5lbFNlc3Npb24odXNlci5pZCwgeyBzaWRlYmFyT3Blbjogb3BlbiB9KVxuICAgIH0sXG4gICAgW3VzZXIuaWRdXG4gIClcblxuICBjb25zdCBzeW5jUGFuZWxTZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChpc01pbmltaXplZCkgcmV0dXJuXG5cbiAgICBwYXRjaE1haWFQYW5lbFNlc3Npb24odXNlci5pZCwge1xuICAgICAgaXNFeHBhbmRlZDogdHJ1ZSxcbiAgICAgIGN1cnJlbnRPcHRpb24sXG4gICAgICBhZ2VudHNOYXZBY3RpdmU6IHNpZGViYXJBZ2VudHNOYXZBY3RpdmUsXG4gICAgICBhY3RpdmVDaGF0SWQsXG4gICAgICBhZ2VudElkOiBhZ2VudD8uaWQgPz8gbnVsbCxcbiAgICAgIHNpZGViYXJPcGVuOiBzaWRlYmFyT3BlblJlZi5jdXJyZW50LFxuICAgICAgZHJhZ1Bvc2l0aW9uOiBsYXlvdXRNb2RlID09PSAnZmxvYXRpbmcnID8gZHJhZ1Bvc2l0aW9uIDogbnVsbCxcbiAgICAgIGhvc3RDb250ZXh0OiB7XG4gICAgICAgIHNlY3Rpb24sXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGNsaWVudCxcbiAgICAgICAgdGFzayxcbiAgICAgICAgY2hpcHNQcm9qZWN0LFxuICAgICAgfSxcbiAgICB9KVxuICB9LCBbXG4gICAgYWN0aXZlQ2hhdElkLFxuICAgIGFnZW50Py5pZCxcbiAgICBjaGlwc1Byb2plY3QsXG4gICAgY2xpZW50LFxuICAgIGN1cnJlbnRPcHRpb24sXG4gICAgZHJhZ1Bvc2l0aW9uLFxuICAgIGlzTWluaW1pemVkLFxuICAgIGxheW91dE1vZGUsXG4gICAgcHJvamVjdCxcbiAgICBzZWN0aW9uLFxuICAgIHNpZGViYXJBZ2VudHNOYXZBY3RpdmUsXG4gICAgdGFzayxcbiAgICB1c2VyLmlkLFxuICBdKVxuXG4gIC8qKiBMb3MgYWdlbnRlcyBzZSBwaWRlbiByZWNpw6luIGFsIGFicmlyIGVsIHBhbmVsOiBlbiBtb2RvIHBpbGwgbm8gaGFjZSBmYWx0YSBuaW5ndW5hIHJlcXVlc3QuICovXG4gIGNvbnN0IGVuc3VyZUFnZW50c0xvYWRlZCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpOiBQcm9taXNlPEFnZW50W10+ID0+IHtcbiAgICBpZiAoYWdlbnRzRGF0YVJlZi5jdXJyZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBhZ2VudHNEYXRhUmVmLmN1cnJlbnRcbiAgICB9XG5cbiAgICBpZiAoIWFnZW50c0ZldGNoZWRSZWYuY3VycmVudCkge1xuICAgICAgYWdlbnRzRmV0Y2hlZFJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgY29uc3QgbG9hZGVkQWdlbnRzID0gYXdhaXQgaGFuZGxlR2V0QWdlbnRzKClcbiAgICAgIGlmIChsb2FkZWRBZ2VudHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gbG9hZGVkQWdlbnRzXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFnZW50c0RhdGFSZWYuY3VycmVudFxuICB9LCBbaGFuZGxlR2V0QWdlbnRzXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpc01pbmltaXplZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNvbnN0IHRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gc3luY1BhbmVsU2Vzc2lvbigpLCAxNTApXG4gICAgcmV0dXJuICgpID0+IHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXIpXG4gIH0sIFtpc01pbmltaXplZCwgc3luY1BhbmVsU2Vzc2lvbl0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvblBhZ2VIaWRlID0gKCkgPT4ge1xuICAgICAgaWYgKCFpc01pbmltaXplZCkge1xuICAgICAgICBzeW5jUGFuZWxTZXNzaW9uKClcbiAgICAgIH1cbiAgICB9XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VoaWRlJywgb25QYWdlSGlkZSlcbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BhZ2VoaWRlJywgb25QYWdlSGlkZSlcbiAgfSwgW2lzTWluaW1pemVkLCBzeW5jUGFuZWxTZXNzaW9uXSlcblxuICBjb25zdCBoYW5kbGVSZXN0b3JlRnJvbU1pbmltaXplZCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAvLyBQcmlvcmlkYWQgYWwgcmVhYnJpcjogcHJpbWVyIGNoYXQgc2luIGxlZXIg4oaSIMO6bHRpbWEgY29udmVyc2FjacOzbiBhYmllcnRhIOKGkiBIb21lLlxuICAgIGNvbnN0IHsgY2hhdHMgfSA9IGdldENoYXRzU3RvcmVTdGF0ZSgpXG4gICAgY29uc3QgbGFzdEFjdGl2ZUNoYXRJZCA9IHJlYWRMYXN0QWN0aXZlQ2hhdElkKHVzZXIuaWQpXG4gICAgY29uc3QgZmlyc3RVbnJlYWQgPSBjaGF0cy5maW5kKGNoYXQgPT4gY2hhdC5pc1JlYWQgPT09IGZhbHNlKVxuICAgIGNvbnN0IGxhc3RBY3RpdmVDaGF0ID0gbGFzdEFjdGl2ZUNoYXRJZFxuICAgICAgPyBjaGF0cy5maW5kKGNoYXQgPT4gY2hhdC5zZXNzaW9uRXh0ZXJuYWxJZCA9PT0gbGFzdEFjdGl2ZUNoYXRJZClcbiAgICAgIDogdW5kZWZpbmVkXG4gICAgY29uc3QgdGFyZ2V0ID0gZmlyc3RVbnJlYWQgPz8gbGFzdEFjdGl2ZUNoYXRcblxuICAgIC8vIE5hdmVnYXIgYW50ZXMgZGUgZXhwYW5kaXI6IHNpIGVzcGVyYW1vcyBhZ2VudGVzLCBlbCBwYW5lbCBtb250YSBjb24gbGEgc2VzacOzbiB2aWVqYSB5IGVsIHNpZGViYXIgcXVlZGEgZGVzZmFzYWRvLlxuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIGdvVG9DaGF0UmVmLmN1cnJlbnQ/Lih0YXJnZXQpXG4gICAgfSBlbHNlIHtcbiAgICAgIGdvSG9tZVJlZi5jdXJyZW50Py4oKVxuICAgIH1cblxuICAgIHNldElzTWluaW1pemVkKGZhbHNlKVxuICAgIHNldENoYXRWaWV3VmlzaWJsZSh0cnVlKVxuICAgIGFtcGxpdHVkRXZlbnQoRVZFTlRTLmFpQ2hhdE9wZW4sIHsgb3B0aW9uOiAnbWluaW1pemUnIH0pXG5cbiAgICBlbnN1cmVBZ2VudHNMb2FkZWQoKVxuICAgICAgLnRoZW4obG9hZGVkQWdlbnRzID0+IHtcbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQWdlbnQgPSBsb2FkZWRBZ2VudHMuZmluZChhZ2VudEl0ZW0gPT4gTnVtYmVyKGFnZW50SXRlbS5pZCkgPT09IHRhcmdldC5hZ2VudElkKVxuICAgICAgICAgIGlmIChzZWxlY3RlZEFnZW50KSB7XG4gICAgICAgICAgICBzZWxlY3RBZ2VudChzZWxlY3RlZEFnZW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb2N1c0NoYXRJbnB1dCgpXG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZClcbiAgfSwgW2FtcGxpdHVkRXZlbnQsIGVuc3VyZUFnZW50c0xvYWRlZCwgZm9jdXNDaGF0SW5wdXQsIHNlbGVjdEFnZW50LCBzZXRDaGF0Vmlld1Zpc2libGUsIHVzZXIuaWRdKVxuXG4gIC8qKlxuICAgKiBUb21hIGNvbnRyb2wgZGVzZGUgdW4gaG9zdCAoaGVhZGVyLCBwcm95ZWN0bywgY2xpZW50ZeKApik6IGFicmUgZWwgcGFuZWwsIGRlc2NhcnRhIGxhXG4gICAqIGNvbnZlcnNhY2nDs24gYWJpZXJ0YSB5IGFwbGljYSBlbCBjb250ZXh0byBkZWwgaG9zdC4gTk8gdnVlbHZlIGEgbGEgw7psdGltYSBjb252ZXJzYWNpw7NuXG4gICAqIOKAlCBlc28gc8OzbG8gbG8gaGFjZSBlbCBwaWxsIChgaGFuZGxlUmVzdG9yZUZyb21NaW5pbWl6ZWRgKS5cbiAgICovXG4gIGNvbnN0IGFwcGx5RXhwYW5kZWRIb3N0VGFrZW92ZXIgPSB1c2VDYWxsYmFjayhcbiAgICAoZGV0YWlsOiBNYWlhSG9zdE9wZW5EZXRhaWwpID0+IHtcbiAgICAgIGNvbnN0IGlzR2xvYmFsSGVhZGVyT3BlbiA9IGRldGFpbC5zZWN0aW9uID09PSAnaGVhZGVyJyB8fCBkZXRhaWwuc2VjdGlvbiA9PT0gJ3BsYW5uZXInXG5cbiAgICAgIGNsZWFyTWFpYVBhbmVsU2Vzc2lvbih1c2VyLmlkKVxuICAgICAgcGVuZGluZ1Nlc3Npb25SZXN0b3JlUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBzZXRJc1Jlc3RvcmluZ1Nlc3Npb24oZmFsc2UpXG4gICAgICBzZXRJc01pbmltaXplZChmYWxzZSlcbiAgICAgIHNldENoYXRWaWV3VmlzaWJsZSh0cnVlKVxuICAgICAgd3JpdGVMYXN0QWN0aXZlQ2hhdElkKHVzZXIuaWQsIG51bGwpXG5cbiAgICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICAgIHNldE5ld0NoYXRLZXkocHJldiA9PiBwcmV2ICsgMSlcbiAgICAgIHNldFVzZXJJbml0aWFsTWVzc2FnZSh7IG1lc3NhZ2U6ICcnLCBhdHRhY2htZW50czogW10gfSlcbiAgICAgIHNldEN1cnJlbnRPcHRpb24ob3B0aW9ucy5ob21lKVxuICAgICAgc2V0RGlkUmVzZXRDb250ZXh0SW5TZWN0aW9uKGZhbHNlKVxuICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgICBzZXRJc1dyaXRpbmcoZmFsc2UpXG4gICAgICB1c2VGYXFzU3RvcmUuZ2V0U3RhdGUoKS5jbGVhckZhcXMoKVxuICAgICAgYmFubmVyRmFxQXV0b1NlbnRSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICBnZXRDaGF0c1N0b3JlU3RhdGUoKS5zZXRBY3RpdmVDaGF0SWQobnVsbClcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuXG4gICAgICBpZiAoZGV0YWlsLnNlY3Rpb24gPT09ICdwcm9qZWN0JyB8fCBkZXRhaWwuc2VjdGlvbiA9PT0gJ3Rhc2snKSB7XG4gICAgICAgIHNldFByb2plY3Q/LihkZXRhaWwucHJvamVjdCA/PyBudWxsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0UHJvamVjdD8uKG51bGwpXG4gICAgICB9XG5cbiAgICAgIGlmIChkZXRhaWwuc2VjdGlvbiA9PT0gJ2NsaWVudCcpIHtcbiAgICAgICAgc2V0Q2xpZW50Py4oZGV0YWlsLmNsaWVudCA/PyBudWxsKVxuICAgICAgfSBlbHNlIGlmIChpc0dsb2JhbEhlYWRlck9wZW4pIHtcbiAgICAgICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICAgIH1cblxuICAgICAgaWYgKGRldGFpbC5zZWN0aW9uID09PSAndGFzaycpIHtcbiAgICAgICAgc2V0VGFzaz8uKGRldGFpbC50YXNrID8/IG51bGwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRUYXNrPy4obnVsbClcbiAgICAgIH1cblxuICAgICAgaWYgKGlzR2xvYmFsSGVhZGVyT3Blbikge1xuICAgICAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICAgICAgY2xlYXJBZ2VudCgpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRMYXlvdXQgPSByZXNvbHZlSW5pdGlhbE1haWFDaGF0TGF5b3V0TW9kZSh7XG4gICAgICAgIHNlY3Rpb246IGRldGFpbC5zZWN0aW9uIGFzIFNlY3Rpb24sXG4gICAgICAgIGJhbm5lckVudHJ5RmFxOiBkZXRhaWwuZmFxLFxuICAgICAgfSlcbiAgICAgIHNldExheW91dE1vZGUobmV4dExheW91dClcbiAgICAgIHNldERyYWdQb3NpdGlvbihudWxsKVxuXG4gICAgICBjb25zdCBob3N0Q29udGV4dCA9IHtcbiAgICAgICAgc2VjdGlvbjogZGV0YWlsLnNlY3Rpb24gYXMgU2VjdGlvbixcbiAgICAgICAgcHJvamVjdDogZGV0YWlsLnNlY3Rpb24gPT09ICdwcm9qZWN0JyB8fCBkZXRhaWwuc2VjdGlvbiA9PT0gJ3Rhc2snID8gKGRldGFpbC5wcm9qZWN0ID8/IG51bGwpIDogbnVsbCxcbiAgICAgICAgY2xpZW50OiBkZXRhaWwuc2VjdGlvbiA9PT0gJ2NsaWVudCcgPyAoZGV0YWlsLmNsaWVudCA/PyBudWxsKSA6IG51bGwsXG4gICAgICAgIHRhc2s6IGRldGFpbC5zZWN0aW9uID09PSAndGFzaycgPyAoZGV0YWlsLnRhc2sgPz8gbnVsbCkgOiBudWxsLFxuICAgICAgICBjaGlwc1Byb2plY3Q6IG51bGwsXG4gICAgICB9XG5cbiAgICAgIGVuc3VyZUFnZW50c0xvYWRlZCgpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICBsZXQgcmVzb2x2ZWRBZ2VudElkOiBzdHJpbmcgfCBudWxsID0gYWdlbnQ/LmlkID8/IG51bGxcblxuICAgICAgICAgIGlmIChpc0dsb2JhbEhlYWRlck9wZW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0QWdlbnQgPSBhZ2VudHNEYXRhUmVmLmN1cnJlbnRbMF1cbiAgICAgICAgICAgIGlmIChmaXJzdEFnZW50KSB7XG4gICAgICAgICAgICAgIHNlbGVjdEFnZW50KGZpcnN0QWdlbnQpXG4gICAgICAgICAgICAgIHJlc29sdmVkQWdlbnRJZCA9IGZpcnN0QWdlbnQuaWRcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmVkQWdlbnRJZCA9IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXRjaE1haWFQYW5lbFNlc3Npb24odXNlci5pZCwge1xuICAgICAgICAgICAgaXNFeHBhbmRlZDogdHJ1ZSxcbiAgICAgICAgICAgIGN1cnJlbnRPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgICAgIGFnZW50c05hdkFjdGl2ZTogbnVsbCxcbiAgICAgICAgICAgIGFjdGl2ZUNoYXRJZDogbnVsbCxcbiAgICAgICAgICAgIGFnZW50SWQ6IHJlc29sdmVkQWdlbnRJZCxcbiAgICAgICAgICAgIHNpZGViYXJPcGVuOiBzaWRlYmFyT3BlblJlZi5jdXJyZW50LFxuICAgICAgICAgICAgZHJhZ1Bvc2l0aW9uOiBudWxsLFxuICAgICAgICAgICAgaG9zdENvbnRleHQsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGZvY3VzQ2hhdElucHV0KClcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZClcbiAgICB9LFxuICAgIFtcbiAgICAgIGFnZW50Py5pZCxcbiAgICAgIGNsZWFyQWdlbnQsXG4gICAgICBlbnN1cmVBZ2VudHNMb2FkZWQsXG4gICAgICBmb2N1c0NoYXRJbnB1dCxcbiAgICAgIHNlbGVjdEFnZW50LFxuICAgICAgc2V0Q2hhdFZpZXdWaXNpYmxlLFxuICAgICAgc2V0Q2hpcHNQcm9qZWN0LFxuICAgICAgc2V0Q2xpZW50LFxuICAgICAgc2V0UHJvamVjdCxcbiAgICAgIHNldFRhc2ssXG4gICAgICB1c2VyLmlkLFxuICAgIF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVNlbmRNZXNzYWdlUmVhZHkgPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBzZW5kTWVzc2FnZTogKFxuICAgICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICAgIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSxcbiAgICAgICAgZmFxSWQ/OiBzdHJpbmcsXG4gICAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nLFxuICAgICAgICBtZW50aW9ucz86IENvbnRleHRNZW50aW9uW10sXG4gICAgICAgIGZ1YUlkPzogc3RyaW5nLFxuICAgICAgICBzY0lkPzogc3RyaW5nXG4gICAgICApID0+IHZvaWQsXG4gICAgICBzdG9wR2VuZXJhdGlvbjogKCkgPT4gdm9pZCxcbiAgICAgIHN0cmVhbWluZzogYm9vbGVhbixcbiAgICAgIHdyaXRpbmc6IGJvb2xlYW5cbiAgICApID0+IHtcbiAgICAgIHNldFNlbmRNZXNzYWdlRnVuY3Rpb24oKCkgPT4gc2VuZE1lc3NhZ2UpXG4gICAgICBzZXRTdG9wR2VuZXJhdGlvbkZ1bmN0aW9uKCgpID0+IHN0b3BHZW5lcmF0aW9uKVxuICAgICAgc2V0SXNTdHJlYW1pbmcoc3RyZWFtaW5nKVxuICAgICAgc2V0SXNXcml0aW5nKHdyaXRpbmcpXG4gICAgfSxcbiAgICBbXVxuICApXG5cbiAgY29uc3QgaGFuZGxlU2VuZE1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sXG4gICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nLFxuICAgICAgbWVudGlvbnM/OiBDb250ZXh0TWVudGlvbltdLFxuICAgICAgZnVhSWQ/OiBzdHJpbmcsXG4gICAgICBzY0lkPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoc2lkZWJhckhhc0Vycm9yKSB7XG4gICAgICAgIHNldFNpZGViYXJIYXNFcnJvcihmYWxzZSlcbiAgICAgIH1cbiAgICAgIGlmIChzZW5kTWVzc2FnZUZ1bmN0aW9uICYmIGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5jaGF0KSB7XG4gICAgICAgIHNlbmRNZXNzYWdlRnVuY3Rpb24obWVzc2FnZSwgYXR0YWNobWVudHMsIGZhcUlkLCBhZ2VudFN1Z2dlc3Rpb25JZCwgbWVudGlvbnMsIGZ1YUlkLCBzY0lkKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnRDaGF0KG1lc3NhZ2UsIGF0dGFjaG1lbnRzLCBmYXFJZCwgYWdlbnRTdWdnZXN0aW9uSWQsIG1lbnRpb25zLCBmdWFJZCwgc2NJZClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtzZW5kTWVzc2FnZUZ1bmN0aW9uLCBzdGFydENoYXQsIGNvbXB1dGVkQ3VycmVudE9wdGlvbiwgc2lkZWJhckhhc0Vycm9yXVxuICApXG5cbiAgY29uc3QgaGFuZGxlR29Ib21lID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIC8vIFNpIGVzdGFtb3MgZW4gdW5hIGNvbnZlcnNhY2nDs24geSB2YW1vcyBhIGhvbWUsIHJlc2V0ZWFyIGluaXRpYWxDaGF0SWQgeSBpbmNyZW1lbnRhciBuZXdDaGF0S2V5XG4gICAgaWYgKGN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuY2hhdCkge1xuICAgICAgLy8gTm8gY29ydGFtb3MgbGEgZ2VuZXJhY2nDs246IGxhIHNlc2nDs24gc2lndWUgcmVzcG9uZGllbmRvIGVuIGJhY2tncm91bmQuXG4gICAgICBzZXRJbml0aWFsQ2hhdElkKG51bGwpXG4gICAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgICBzZXRJc1dyaXRpbmcoZmFsc2UpXG4gICAgICAvLyBObyBib3JyYXIgZWwgY2xpZW50ZSBzaSBlcyBhZ2VudGUgZGUgY2xpZW50ZXMgKGlndWFsIHF1ZSBlbCBwcm95ZWN0byBzZSBtYW50aWVuZSlcbiAgICAgIGlmIChhZ2VudD8uZW50aXR5ICE9PSAnY2xpZW50Jykge1xuICAgICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgICAgfVxuICAgICAgaWYgKHNlY3Rpb24gIT09ICd0YXNrJykge1xuICAgICAgICBzZXRUYXNrPy4obnVsbClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgKCFhZ2VudCB8fCBhZ2VudD8uaXNfZGVsZXRlZCB8fCBhZ2VudD8uaGFzX25vdF9wZXJtaXNzaW9ucyB8fCBhZ2VudD8uaGFzX25vdF9hY2Nlc3MgfHwgYWdlbnQ/LnByb2plY3RfZGVsZXRlZCkgJiZcbiAgICAgIGFnZW50cy5kYXRhLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHNlbGVjdEFnZW50KGFnZW50cy5kYXRhWzBdKVxuICAgIH1cbiAgICAvLyBPcmNoZXN0cmF0b3IgZW4gaG9tZSBnbG9iYWwgKGhlYWRlci9wbGFubmVyKTogYWwgaW5pY2lhciB1biBjaGF0IG51ZXZvIHNlIGRlYmUgdm9sdmVyIGFsIHBhc28gMVxuICAgIC8vIChsaXN0YSBkZSBjb250ZXh0b3MgcmVjaWVudGVzKSwgcG9yIGxvIHF1ZSBoYXkgcXVlIGxpbXBpYXIgdG9kbyBlbCBjb250ZXh0byBwaW5lYWRvLlxuICAgIGlmIChpc0dsb2JhbE1haWFTZWN0aW9uKHNlY3Rpb24pICYmIGFnZW50Py50eXBlID09PSAnb3JjaGVzdHJhdG9yJykge1xuICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICAgIHNldFRhc2s/LihudWxsKVxuICAgIH1cbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZSAmJiB0b2dnbGVXZWJTZWFyY2goKVxuICB9LCBbXG4gICAgb3B0aW9ucy5ob21lLFxuICAgIG9wdGlvbnMuY2hhdCxcbiAgICBjdXJyZW50T3B0aW9uLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIHRvZ2dsZVdlYlNlYXJjaCxcbiAgICBhZ2VudCxcbiAgICBhZ2VudHMsXG4gICAgc2VsZWN0QWdlbnQsXG4gICAgc2V0UHJvamVjdCxcbiAgICBzZXRDbGllbnQsXG4gICAgc2V0VGFzayxcbiAgICBzdG9wR2VuZXJhdGlvbkZ1bmN0aW9uLFxuICAgIHNlY3Rpb24sXG4gIF0pXG5cbiAgZ29Ib21lUmVmLmN1cnJlbnQgPSBoYW5kbGVHb0hvbWVcblxuICBjb25zdCBzdGFydE5ld0NoYXRGcm9tQ2F0YWxvZyA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmcm9tTXlBZ2VudHMgPSBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMubXlBZ2VudHNcbiAgICBjb25zdCBmcm9tTXlTa2lsbHMgPSBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMubXlTa2lsbHNcbiAgICBjb25zdCBhZ2VudHNMaXN0ID0gZnJvbU15QWdlbnRzIHx8IGZyb21NeVNraWxscyA/IGF3YWl0IGVuc3VyZUFnZW50c0xvYWRlZCgpIDogYWdlbnRzLmRhdGFcbiAgICBjb25zdCBmaXJzdEFnZW50ID0gYWdlbnRzTGlzdFswXVxuXG4gICAgaWYgKGZpcnN0QWdlbnQpIHtcbiAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgIHNldENsaWVudD8uKG51bGwpXG4gICAgICBzZXRUYXNrPy4obnVsbClcbiAgICAgIHNlbGVjdEFnZW50KGZpcnN0QWdlbnQpXG4gICAgfVxuICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLmhvbWUpXG4gICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgaWYgKGlzV2ViU2VhcmNoQWN0aXZlKSB0b2dnbGVXZWJTZWFyY2goKVxuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuICB9LCBbXG4gICAgYWdlbnRzLmRhdGEsXG4gICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uLFxuICAgIGVuc3VyZUFnZW50c0xvYWRlZCxcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICBzZWxlY3RBZ2VudCxcbiAgICBzZXRDbGllbnQsXG4gICAgc2V0UHJvamVjdCxcbiAgICBzZXRUYXNrLFxuICAgIHRvZ2dsZVdlYlNlYXJjaCxcbiAgXSlcblxuICBjb25zdCBoYW5kbGVTdGFydE5ld0NoYXQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgZnJvbU15QWdlbnRzID0gY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLm15QWdlbnRzXG4gICAgY29uc3QgZnJvbU15U2tpbGxzID0gY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLm15U2tpbGxzXG4gICAgY29uc3QgZnJvbU1haWFrZXJIb21lID0gY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmhvbWUgJiYgaXNNYWlha2VyQWdlbnRTZWxlY3RlZFxuXG4gICAgaWYgKGZyb21NeUFnZW50cyB8fCBmcm9tTXlTa2lsbHMgfHwgZnJvbU1haWFrZXJIb21lKSB7XG4gICAgICBzdGFydE5ld0NoYXRGcm9tQ2F0YWxvZygpLmNhdGNoKCgpID0+IHVuZGVmaW5lZClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGhhbmRsZUdvSG9tZSgpXG4gIH0sIFtjb21wdXRlZEN1cnJlbnRPcHRpb24sIGhhbmRsZUdvSG9tZSwgaXNNYWlha2VyQWdlbnRTZWxlY3RlZCwgc3RhcnROZXdDaGF0RnJvbUNhdGFsb2ddKVxuXG4gIGNvbnN0IGhhbmRsZVJlc2V0Q2hhdCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2UoeyBtZXNzYWdlOiAnJywgYXR0YWNobWVudHM6IFtdIH0pXG4gICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgIC8vIERpc3BhdGNoIGV2ZW50IHRvIGNsZWFyIHRoZSBpbnB1dCB0ZXh0YXJlYVxuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuICAgIGhhbmRsZUdvSG9tZSgpXG4gIH0sIFtoYW5kbGVHb0hvbWVdKVxuXG4gIC8vIEJvdMOzbiBcInZvbHZlclwiIGRlbCBoZWFkZXIgKHNvbG8gb3JjaGVzdHJhdG9yKTpcbiAgLy8gLSBEZXNkZSBlbCBjaGF0IChoZWFkZXIgbyBwcm9qZWN0L2NsaWVudC90YXNrKTogaW5pY2lhIHVuYSBjb252ZXJzYWNpw7NuIG51ZXZhIGNvbnNlcnZhbmRvIGVsXG4gIC8vICAgY29udGV4dG8gcGluZWFkbyB5IHZ1ZWx2ZSBhbCBob21lIChwYXNvIDIgY29uIEZBUXMvRlVBcykuXG4gIC8vIC0gRW4gZWwgaG9tZSBwYXNvIDIgKEZBUXMvRlVBcyBjb24gY29udGV4dG8pOiBsaW1waWEgZWwgY29udGV4dG8gcGluZWFkbyB5IHZ1ZWx2ZSBhbCBwYXNvIDFcbiAgLy8gICAoc2VsZWN0b3IgZGUgY29udGV4dG9zIHJlY2llbnRlcykuIEVuIGhlYWRlciBzaWVtcHJlOyBlbiBwcm9qZWN0L2NsaWVudC90YXNrIHNvbG8gc2kgZWxcbiAgLy8gICB1c3VhcmlvIHJlaW5pY2nDsyBlbCBjb250ZXh0byAoZGlkUmVzZXRDb250ZXh0SW5TZWN0aW9uKS5cbiAgY29uc3QgaGFuZGxlQmFjayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCB0byA9IHJlc29sdmVBaUNoYXRCYWNrRGVzdGluYXRpb24oc2VjdGlvbiwgYWdlbnQ/LnR5cGUsIGNvbXB1dGVkQ3VycmVudE9wdGlvbiwgb3B0aW9ucy5ob21lKVxuICAgIGFtcGxpdHVkRXZlbnQoRVZFTlRTLmFpQ2hhdEJhY2ssIHsgdG8gfSlcblxuICAgIC8vIERlc2RlIGVsIGNoYXQg4oaSIG51ZXZhIGNvbnZlcnNhY2nDs24gU0lOIGJvcnJhciBlbCBjb250ZXh0byBwaW5lYWRvLCB2b2x2aWVuZG8gYWwgaG9tZS5cbiAgICBpZiAoY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmNoYXQpIHtcbiAgICAgIC8vIE5vIGNvcnRhbW9zIGxhIGdlbmVyYWNpw7NuOiBsYSBzZXNpw7NuIHNpZ3VlIHJlc3BvbmRpZW5kbyBlbiBiYWNrZ3JvdW5kLlxuICAgICAgc2V0SXNXcml0aW5nKGZhbHNlKVxuICAgICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgICBpc1dlYlNlYXJjaEFjdGl2ZSAmJiB0b2dnbGVXZWJTZWFyY2goKVxuICAgICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLmhvbWUpXG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIEhvbWUgcGFzbyAyIChjb250ZXh0byBwaW5lYWRvKSDihpIgbGltcGlhciBlbCBjb250ZXh0byB5IHZvbHZlciBhbCBwYXNvIDEgKGNvbnRleHRvcyByZWNpZW50ZXMpLlxuICAgIGlmIChjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuaG9tZSAmJiAoaXNHbG9iYWxNYWlhU2VjdGlvbihzZWN0aW9uKSB8fCBkaWRSZXNldENvbnRleHRJblNlY3Rpb24pKSB7XG4gICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgICAgc2V0VGFzaz8uKG51bGwpXG4gICAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICB9XG4gIH0sIFtcbiAgICBjb21wdXRlZEN1cnJlbnRPcHRpb24sXG4gICAgc2VjdGlvbixcbiAgICBhZ2VudD8udHlwZSxcbiAgICBhbXBsaXR1ZEV2ZW50LFxuICAgIG9wdGlvbnMuaG9tZSxcbiAgICBzdG9wR2VuZXJhdGlvbkZ1bmN0aW9uLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIHRvZ2dsZVdlYlNlYXJjaCxcbiAgICBkaWRSZXNldENvbnRleHRJblNlY3Rpb24sXG4gICAgc2V0UHJvamVjdCxcbiAgICBzZXRDbGllbnQsXG4gICAgc2V0VGFzayxcbiAgICBzZXRDaGlwc1Byb2plY3QsXG4gIF0pXG5cbiAgLy8gRGV0ZWN0YSBlbCByZWluaWNpbyBkZSBjb250ZXh0byBlbiBwcm9qZWN0L2NsaWVudC90YXNrOiBjb250ZXh0byBwaW5lYWRvIOKGkiB2YWPDrW8gY29uIGVsXG4gIC8vIG9yY2hlc3RyYXRvciAocC4gZWouIGFsIHJlc2VsZWNjaW9uYXIgTUFJQSBlbiBlbCBsaXN0YWRvKS4gU29sbyBsYSB0cmFuc2ljacOzbiBjdWVudGEsIGFzw60gdW5hXG4gIC8vIGFwZXJ0dXJhIGZyZXNjYSAoY29udGV4dG8gcGluZWFkbyBkZXNkZSBsYSBzZWNjacOzbikgbm8gbG8gYWN0aXZhLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHBpbm5lZCA9ICEhKHRhc2s/LmlkIHx8IGNoaXBzUHJvamVjdD8ucHJvamVjdElkIHx8IGNsaWVudD8uaWQgfHwgcHJvamVjdD8uaWQpXG4gICAgY29uc3Qgd2FzUGlubmVkID0gcHJldkhhc1Bpbm5lZENvbnRleHRSZWYuY3VycmVudFxuICAgIHByZXZIYXNQaW5uZWRDb250ZXh0UmVmLmN1cnJlbnQgPSBwaW5uZWRcbiAgICBpZiAoIWlzR2xvYmFsTWFpYVNlY3Rpb24oc2VjdGlvbikgJiYgYWdlbnQ/LnR5cGUgPT09ICdvcmNoZXN0cmF0b3InICYmIHdhc1Bpbm5lZCAmJiAhcGlubmVkKSB7XG4gICAgICBzZXREaWRSZXNldENvbnRleHRJblNlY3Rpb24odHJ1ZSlcbiAgICB9XG4gIH0sIFt0YXNrPy5pZCwgY2hpcHNQcm9qZWN0Py5wcm9qZWN0SWQsIGNsaWVudD8uaWQsIHByb2plY3Q/LmlkLCBzZWN0aW9uLCBhZ2VudD8udHlwZV0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvbk1lcmdlQ3JlYXRlZEFnZW50ID0gKGV2dDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHsgYWdlbnQ6IG5leHRBZ2VudCB9ID0gKGV2dCBhcyBDdXN0b21FdmVudDx7IGFnZW50OiBBZ2VudCB9PikuZGV0YWlsIHx8IHt9XG4gICAgICBpZiAobmV4dEFnZW50Py5pZCkge1xuICAgICAgICBhZGRBZ2VudChuZXh0QWdlbnQsIHsgbmF2aWdhdGVIb21lOiBmYWxzZSB9KVxuICAgICAgfVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLW1lcmdlLWNyZWF0ZWQtYWdlbnQtaW50by1saXN0Jywgb25NZXJnZUNyZWF0ZWRBZ2VudClcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWFpYS1tZXJnZS1jcmVhdGVkLWFnZW50LWludG8tbGlzdCcsIG9uTWVyZ2VDcmVhdGVkQWdlbnQpXG4gICAgfVxuICB9LCBbYWRkQWdlbnRdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb25TeW5jRWRpdGVkQWdlbnQgPSAoZXZ0OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgeyBhZ2VudDogbmV4dEFnZW50IH0gPSAoZXZ0IGFzIEN1c3RvbUV2ZW50PHsgYWdlbnQ6IEFnZW50IH0+KS5kZXRhaWwgfHwge31cbiAgICAgIGlmICghbmV4dEFnZW50Py5pZCkgcmV0dXJuXG4gICAgICB1cGRhdGVBZ2VudChuZXh0QWdlbnQpXG4gICAgICBpZiAoYWdlbnQ/LmlkID09PSBuZXh0QWdlbnQuaWQpIHtcbiAgICAgICAgc2VsZWN0QWdlbnQobmV4dEFnZW50KVxuICAgICAgfVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLXN5bmMtZWRpdGVkLWFnZW50LWZyb20tY2hhdCcsIG9uU3luY0VkaXRlZEFnZW50KVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLXN5bmMtZWRpdGVkLWFnZW50LWZyb20tY2hhdCcsIG9uU3luY0VkaXRlZEFnZW50KVxuICAgIH1cbiAgfSwgW3VwZGF0ZUFnZW50LCBzZWxlY3RBZ2VudCwgYWdlbnQ/LmlkXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9wZW5DaGF0VmlldyA9ICgpID0+IHtcbiAgICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuICAgICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLmNoYXQpXG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgICB9XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWFpYS1vcGVuLWNoYXQtdmlldycsIG9wZW5DaGF0VmlldylcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWFpYS1vcGVuLWNoYXQtdmlldycsIG9wZW5DaGF0VmlldylcbiAgICB9XG4gIH0sIFtdKVxuXG4gIC8qKlxuICAgKiBFbCDDrWNvbm8gZGUgTUFJQSBkZWwgaGVhZGVyIGxsZXZhIHNpZW1wcmUgYWwgSG9tZS4gU2kgTUFJQSB5YSBlc3TDoSBtb250YWRhIHBlcm9cbiAgICogbWluaW1pemFkYSwgZWwgaG9zdCBubyBwdWVkZSByZXNvbHZlcmxvIGNhbWJpYW5kbyBgaXNPcGVuYCAoeWEgZXN0w6EgZW4gdHJ1ZSksXG4gICAqIGFzw60gcXVlIGF2aXNhIHBvciBldmVudG8geSBhY8OhIHJlc3RhdXJhbW9zIHkgdmFtb3MgYWwgSG9tZS5cbiAgICovXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb3BlbkhvbWUgPSAoKSA9PiB7XG4gICAgICBhcHBseUV4cGFuZGVkSG9zdFRha2VvdmVyKHtcbiAgICAgICAgc2VjdGlvbjogJ2hlYWRlcicsXG4gICAgICAgIGVudGl0eTogeyBwcm9qZWN0SWQ6IG51bGwsIGNsaWVudElkOiBudWxsIH0sXG4gICAgICB9KVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4taG9tZScsIG9wZW5Ib21lKVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4taG9tZScsIG9wZW5Ib21lKVxuICAgIH1cbiAgfSwgW2FwcGx5RXhwYW5kZWRIb3N0VGFrZW92ZXJdKVxuXG4gIC8qKlxuICAgKiBPdHJvIGhvc3QgKHByb3llY3RvLCBjbGllbnRlLCBiYW5uZXIsIGhlYWRlcuKApikgcGlkZSBhYnJpciBNQUlBIG1pZW50cmFzIHlhIGhheSB1bmFcbiAgICogaW5zdGFuY2lhIG1vbnRhZGEuIEV4cGFuZGUgc2kgZXN0YWJhIG1pbmltaXphZG8sIGFwbGljYSBlbCBjb250ZXh0byBkZWwgaG9zdCBudWV2b1xuICAgKiB5IHZhIGFsIGhvbWUg4oCUIHNpbiByZXN0YXVyYXIgbGEgY29udmVyc2FjacOzbiBwcmV2aWEgKGVzbyBsbyBoYWNlIGVsIHBpbGwpLlxuICAgKi9cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvcGVuRnJvbUhvc3QgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IGRldGFpbCB9ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8TWFpYUhvc3RPcGVuRGV0YWlsPlxuICAgICAgaWYgKCFkZXRhaWwpIHJldHVyblxuICAgICAgYXBwbHlFeHBhbmRlZEhvc3RUYWtlb3ZlcihkZXRhaWwpXG4gICAgfVxuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihNQUlBX09QRU5fRlJPTV9IT1NUX0VWRU5ULCBvcGVuRnJvbUhvc3QpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoTUFJQV9PUEVOX0ZST01fSE9TVF9FVkVOVCwgb3BlbkZyb21Ib3N0KVxuICAgIH1cbiAgfSwgW2FwcGx5RXhwYW5kZWRIb3N0VGFrZW92ZXJdKVxuXG4gIC8qKiBNaXNtbyBmbHVqbyBxdWUgQ2hhdEFJTXlBZ2VudHMuaGFuZGxlVXNlQWdlbnQgKyBvbkJhY2sgKGhhbmRsZXJzLmhvbWUpLlxuICAgKiAgRWwgZGV0YWlsIHB1ZWRlIHRyYWVyIG9wY2lvbmFsbWVudGUgYHByb2plY3RgLCBgY2xpZW50YCwgYHRhc2tgIHBhcmEgZmxvd3MgcXVlXG4gICAqICBuZWNlc2l0YW4gcHJlc2VydmFyIGNvbnRleHRvIChlai4gc2VsZWN0b3IgZGUgYWdlbnRlcyBkZXNkZSB1bmEgdGFyZWEpLiBTaSBubyB2aWVuZW4sXG4gICAqICBzZSBtYW50aWVuZSBlbCBjb21wb3J0YW1pZW50byBvcmlnaW5hbCBkZSBsaW1waWFyIHByb2plY3QvY2xpZW50LiAqL1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9wZW5OZXdDaGF0V2l0aEFnZW50ID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgeyBkZXRhaWwgfSA9IGV2ZW50IGFzIEN1c3RvbUV2ZW50PHtcbiAgICAgICAgYWdlbnQ6IEFnZW50XG4gICAgICAgIHByb2plY3Q/OiBQcm9qZWN0IHwgbnVsbFxuICAgICAgICBjbGllbnQ/OiBDbGllbnQgfCBudWxsXG4gICAgICAgIHRhc2s/OiBUYXNrIHwgbnVsbFxuICAgICAgfT5cbiAgICAgIGNvbnN0IG5leHRBZ2VudCA9IGRldGFpbD8uYWdlbnRcbiAgICAgIGlmICghbmV4dEFnZW50KSByZXR1cm5cblxuICAgICAgc2V0UHJvamVjdChkZXRhaWw/LnByb2plY3QgPz8gbnVsbClcbiAgICAgIHNldENsaWVudD8uKGRldGFpbD8uY2xpZW50ID8/IG51bGwpXG4gICAgICBpZiAoZGV0YWlsPy50YXNrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2V0VGFzaz8uKGRldGFpbC50YXNrKVxuICAgICAgfVxuICAgICAgc2VsZWN0QWdlbnQobmV4dEFnZW50KVxuICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICB9XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tbmV3LWNoYXQtd2l0aC1hZ2VudCcsIG9wZW5OZXdDaGF0V2l0aEFnZW50KVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tbmV3LWNoYXQtd2l0aC1hZ2VudCcsIG9wZW5OZXdDaGF0V2l0aEFnZW50KVxuICAgIH1cbiAgfSwgW3NlbGVjdEFnZW50LCBzZXRDbGllbnQsIHNldFByb2plY3QsIHNldFRhc2tdKVxuXG4gIGNvbnN0IGFwcGx5U2tpbGxVc2VGbG93ID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHNraWxsOiBTa2lsbCwgdXNlRmlyc3RBZ2VudDogYm9vbGVhbikgPT4ge1xuICAgICAgY29uc3QgZmlyc3RBZ2VudCA9IGF3YWl0IGVuc3VyZUFnZW50c0JlZm9yZVNraWxsVXNlKHtcbiAgICAgICAgdXNlRmlyc3RBZ2VudCxcbiAgICAgICAgYWdlbnRzOiBhZ2VudHNEYXRhUmVmLmN1cnJlbnQsXG4gICAgICAgIGVuc3VyZUFnZW50c0xvYWRlZCxcbiAgICAgIH0pXG5cbiAgICAgIGlmIChmaXJzdEFnZW50KSB7XG4gICAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICAgICAgc2V0VGFzaz8uKG51bGwpXG4gICAgICAgIHNlbGVjdEFnZW50KGZpcnN0QWdlbnQpXG4gICAgICB9XG5cbiAgICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuICAgICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLmhvbWUpXG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgICAgIGRpc3BhdGNoU2tpbGxNZW50aW9uSW5zZXJ0KHNraWxsKVxuICAgIH0sXG4gICAgW2Vuc3VyZUFnZW50c0xvYWRlZCwgc2VsZWN0QWdlbnQsIHNldENsaWVudCwgc2V0UHJvamVjdCwgc2V0VGFza11cbiAgKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlVXNlU2tpbGxBZnRlclNhdmUgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IHNraWxsLCB1c2VGaXJzdEFnZW50ID0gZmFsc2UgfSA9XG4gICAgICAgIChldmVudCBhcyBDdXN0b21FdmVudDx7IHNraWxsOiBTa2lsbDsgdXNlRmlyc3RBZ2VudD86IGJvb2xlYW4gfT4pLmRldGFpbCB8fCB7fVxuICAgICAgaWYgKCFza2lsbCkgcmV0dXJuXG5cbiAgICAgIGFwcGx5U2tpbGxVc2VGbG93KHNraWxsLCB1c2VGaXJzdEFnZW50KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpXG4gICAgfVxuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihTS0lMTF9VU0VfQUZURVJfU0FWRV9FVkVOVCwgaGFuZGxlVXNlU2tpbGxBZnRlclNhdmUpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoU0tJTExfVVNFX0FGVEVSX1NBVkVfRVZFTlQsIGhhbmRsZVVzZVNraWxsQWZ0ZXJTYXZlKVxuICAgIH1cbiAgfSwgW2FwcGx5U2tpbGxVc2VGbG93XSlcblxuICAvLyBNZXRhZGF0YSBkZSBsYSBzZXNzaW9uIGFiaWVydGEgKGFnZW50X3R5cGUvYWdlbnRfZW50aXR5ICsgY29udGV4dG8pLCBlbWl0aWRhIHBvciB1c2VDaGF0TWVzc2FnZXMuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb25TZXNzaW9uTWV0YSA9IChldnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IGRldGFpbCB9ID0gZXZ0IGFzIEN1c3RvbUV2ZW50PFNlc3Npb25NZXRhPlxuICAgICAgaWYgKGRldGFpbCkgc2V0U2Vzc2lvbk1ldGEoZGV0YWlsKVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLWNoYXQtc2Vzc2lvbi1tZXRhJywgb25TZXNzaW9uTWV0YSlcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWFpYS1jaGF0LXNlc3Npb24tbWV0YScsIG9uU2Vzc2lvbk1ldGEpXG4gICAgfVxuICB9LCBbXSlcblxuICAvLyBBbCBjYW1iaWFyIGRlIGNvbnZlcnNhY2nDs24gbGltcGlhbW9zIGxhIG1ldGFkYXRhOyBlbCBsb2FkIGRlIGxhIG51ZXZhIHNlc3Npb24gbGEgdnVlbHZlIGEgZW1pdGlyLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldFNlc3Npb25NZXRhKG51bGwpXG4gIH0sIFtpbml0aWFsQ2hhdElkXSlcblxuICAvLyBDYXJ0ZWwgXCJjb250aW51YXIgZW4gdW4gY2hhdCBudWV2b1wiOiBzZSBtdWVzdHJhIGFsIGFicmlyIHVuYSBjb252ZXJzYWNpw7NuIGRlIHVuIGNsb25lIGxlZ2FjeVxuICAvLyAoYWdlbnRfdHlwZSA9PT0gJ2Nsb25lJyBjb24gZW50aXR5IHByb2plY3QvdGFzay9jbGllbnQpLiBFbCBpbnB1dCBzZSByZWVtcGxhemEgcG9yIGVsIGNhcnRlbC5cbiAgY29uc3QgbGVnYWN5Q29udGV4dFNlc3Npb24gPSB1c2VNZW1vPHsgZW50aXR5VHlwZTogTGVnYWN5Q29udGV4dEVudGl0eTsgY29udGV4dE5hbWU6IHN0cmluZyB9IHwgbnVsbD4oKCkgPT4ge1xuICAgIGlmIChjb21wdXRlZEN1cnJlbnRPcHRpb24gIT09IG9wdGlvbnMuY2hhdCkgcmV0dXJuIG51bGxcbiAgICBpZiAoIXNlc3Npb25NZXRhIHx8IHNlc3Npb25NZXRhLmFnZW50VHlwZSAhPT0gJ2Nsb25lJykgcmV0dXJuIG51bGxcbiAgICBjb25zdCBlbnRpdHkgPSBzZXNzaW9uTWV0YS5hZ2VudEVudGl0eVxuICAgIGlmICghZW50aXR5IHx8ICFMRUdBQ1lfQ09OVEVYVF9FTlRJVElFUy5pbmNsdWRlcyhlbnRpdHkgYXMgTGVnYWN5Q29udGV4dEVudGl0eSkpIHJldHVybiBudWxsXG4gICAgY29uc3QgY29udGV4dE5hbWUgPVxuICAgICAgZW50aXR5ID09PSAndGFzaycgPyBzZXNzaW9uTWV0YS50YXNrTmFtZSA6IGVudGl0eSA9PT0gJ3Byb2plY3QnID8gc2Vzc2lvbk1ldGEucHJvamVjdE5hbWUgOiBzZXNzaW9uTWV0YS5jbGllbnROYW1lXG4gICAgcmV0dXJuIHsgZW50aXR5VHlwZTogZW50aXR5IGFzIExlZ2FjeUNvbnRleHRFbnRpdHksIGNvbnRleHROYW1lOiBjb250ZXh0TmFtZSB8fCAnJyB9XG4gIH0sIFtjb21wdXRlZEN1cnJlbnRPcHRpb24sIHNlc3Npb25NZXRhXSlcblxuICAvLyBNYXJjYSBlbCBhZ2VudGUgZGUgbGEgY29udmVyc2FjacOzbiBsZWdhY3kgcGFyYSBxdWUgaGVhZGVyLCBzZWxlY3RvciB5IGF2YXRhciBtdWVzdHJlbiBlbCBsb2dvXG4gIC8vIE1BSUEgeSBlbCBub21icmUgdGFjaGFkbyAoYWdlbnRlIG9ic29sZXRvKSwgc2luIGRlcGVuZGVyIGRlbCBgdHlwZWAgcmVzdWVsdG8gZGUgbGEgc2VzacOzbiB2aWVqYS5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAobGVnYWN5Q29udGV4dFNlc3Npb24gJiYgYWdlbnQgJiYgIWFnZW50LmlzX2xlZ2FjeV9jb250ZXh0KSB7XG4gICAgICBzZWxlY3RBZ2VudCh7IC4uLmFnZW50LCBpc19sZWdhY3lfY29udGV4dDogdHJ1ZSB9KVxuICAgIH1cbiAgfSwgW2xlZ2FjeUNvbnRleHRTZXNzaW9uLCBhZ2VudCwgc2VsZWN0QWdlbnRdKVxuXG4gIC8vIEFicmUgdW4gY2hhdCBudWV2byBjb24gZWwgb3JjaGVzdHJhdG9yIHNldGVhbmRvIGVsIGNvbnRleHRvIGRlbCBjbG9uZSBsZWdhY3kgKG1pc21vIGNyaXRlcmlvXG4gIC8vIHF1ZSBjbGlja2VhciB1biBjb250ZXh0byByZWNpZW50ZSBlbiBlbCBob21lIOKGkiBwYXNvIDIgY29uIEZBUXMvYWNjaW9uZXMgZGUgZXNlIGNvbnRleHRvKS5cbiAgY29uc3QgaGFuZGxlQ29udGludWVMZWdhY3lDb250ZXh0SW5OZXdDaGF0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmICghc2Vzc2lvbk1ldGEpIHJldHVyblxuICAgIGNvbnN0IHtcbiAgICAgIGFnZW50RW50aXR5LFxuICAgICAgcHJvamVjdElkOiBwSWQsXG4gICAgICBwcm9qZWN0TmFtZTogcE5hbWUsXG4gICAgICBjbGllbnRJZDogY0lkLFxuICAgICAgY2xpZW50TmFtZTogY05hbWUsXG4gICAgICB0YXNrSWQ6IHRJZCxcbiAgICAgIHRhc2tOYW1lOiB0TmFtZSxcbiAgICB9ID0gc2Vzc2lvbk1ldGFcblxuICAgIGNvbnN0IG9yY2hlc3RyYXRvciA9IGFnZW50cy5kYXRhLmZpbmQoKGE6IEFnZW50KSA9PiBhLnR5cGUgPT09ICdvcmNoZXN0cmF0b3InKVxuICAgIGlmICghb3JjaGVzdHJhdG9yKSByZXR1cm5cblxuICAgIC8vIFJlc2V0IGRlbCBjaGF0IOKGkiBjb252ZXJzYWNpw7NuIG51ZXZhIChsYSBhbnRlcmlvciBzaWd1ZSBlbiBiYWNrZ3JvdW5kKVxuICAgIHNldElzV3JpdGluZyhmYWxzZSlcbiAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2UoeyBtZXNzYWdlOiAnJywgYXR0YWNobWVudHM6IFtdIH0pXG4gICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgIHNldE5ld0NoYXRLZXkocHJldiA9PiBwcmV2ICsgMSlcbiAgICBzZXRIYXNFcnJvcihmYWxzZSlcblxuICAgIC8vIFNldGVhciBjb250ZXh0byAobWlzbW8gY3JpdGVyaW8gcXVlIGhhbmRsZVNlbGVjdFJlY2VudENvbnRleHQgZGVsIGhvbWUpXG4gICAgc2V0VGFzaz8uKG51bGwpXG4gICAgc2V0UHJvamVjdChudWxsKVxuICAgIHNldENsaWVudD8uKG51bGwpXG4gICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG5cbiAgICBpZiAoYWdlbnRFbnRpdHkgPT09ICdjbGllbnQnICYmIGNJZCAhPSBudWxsKSB7XG4gICAgICBzZXRDbGllbnQ/Lih7IGlkOiBjSWQsIG5hbWU6IGNOYW1lIHx8ICcnIH0pXG4gICAgfSBlbHNlIGlmIChhZ2VudEVudGl0eSA9PT0gJ3Byb2plY3QnICYmIHBJZCAhPSBudWxsKSB7XG4gICAgICBzZXRQcm9qZWN0KHtcbiAgICAgICAgaWQ6IHBJZCxcbiAgICAgICAgbmFtZTogcE5hbWUgfHwgJycsXG4gICAgICAgIC4uLihjSWQgIT0gbnVsbCA/IHsgY2xpZW50SWQ6IGNJZCwgY2xpZW50OiB7IGlkOiBjSWQsIG5hbWU6IGNOYW1lIHx8ICcnIH0gfSA6IHt9KSxcbiAgICAgIH0pXG4gICAgICBzZXRDaGlwc1Byb2plY3QoeyBwcm9qZWN0SWQ6IFN0cmluZyhwSWQpLCBwcm9qZWN0TmFtZTogcE5hbWUgfHwgJycsIGNsaWVudE5hbWU6IGNOYW1lIHx8ICcnIH0pXG4gICAgfSBlbHNlIGlmIChhZ2VudEVudGl0eSA9PT0gJ3Rhc2snICYmIHRJZCAhPSBudWxsKSB7XG4gICAgICBzZXRUYXNrPy4oe1xuICAgICAgICBpZDogdElkLFxuICAgICAgICBuYW1lOiB0TmFtZSB8fCAnJyxcbiAgICAgICAgLi4uKHBJZCAhPSBudWxsID8geyBwcm9qZWN0SWQ6IHBJZCB9IDoge30pLFxuICAgICAgICAuLi4oY0lkICE9IG51bGwgPyB7IGNsaWVudElkOiBjSWQgfSA6IHt9KSxcbiAgICAgIH0pXG4gICAgICBpZiAoY0lkICE9IG51bGwpIHNldENsaWVudD8uKHsgaWQ6IGNJZCwgbmFtZTogY05hbWUgfHwgJycgfSlcbiAgICAgIGlmIChwSWQgIT0gbnVsbCkge1xuICAgICAgICBzZXRQcm9qZWN0KHtcbiAgICAgICAgICBpZDogcElkLFxuICAgICAgICAgIG5hbWU6IHBOYW1lIHx8ICcnLFxuICAgICAgICAgIC4uLihjSWQgIT0gbnVsbCA/IHsgY2xpZW50SWQ6IGNJZCwgY2xpZW50OiB7IGlkOiBjSWQsIG5hbWU6IGNOYW1lIHx8ICcnIH0gfSA6IHt9KSxcbiAgICAgICAgfSlcbiAgICAgICAgc2V0Q2hpcHNQcm9qZWN0KHsgcHJvamVjdElkOiBTdHJpbmcocElkKSwgcHJvamVjdE5hbWU6IHBOYW1lIHx8ICcnLCBjbGllbnROYW1lOiBjTmFtZSB8fCAnJyB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIHNlbGVjdEFnZW50KG9yY2hlc3RyYXRvcilcbiAgICBzZXRTZXNzaW9uTWV0YShudWxsKVxuICAgIHNldEN1cnJlbnRPcHRpb24ob3B0aW9ucy5ob21lKVxuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuICB9LCBbc2Vzc2lvbk1ldGEsIGFnZW50cy5kYXRhLCBzZWxlY3RBZ2VudCwgc2V0Q2xpZW50LCBzZXRQcm9qZWN0LCBzZXRUYXNrLCBzZXRDaGlwc1Byb2plY3QsIHN0b3BHZW5lcmF0aW9uRnVuY3Rpb25dKVxuXG4gIGNvbnN0IHNob3dOZXdDaGF0ID0gY29tcHV0ZWRDdXJyZW50T3B0aW9uICE9PSBvcHRpb25zLmNoYXRcbiAgY29uc3QgaXNNeUFnZW50c1NlY3Rpb24gPSBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMubXlBZ2VudHNcbiAgY29uc3QgaXNNeVNraWxsc1NlY3Rpb24gPSBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMubXlTa2lsbHNcblxuICAvLyBCb3TDs24gXCJ2b2x2ZXJcIjogc29sbyBwYXJhIGVsIG9yY2hlc3RyYXRvci5cbiAgLy8gLSBFbiBlbCBjaGF0OiBkaXNwb25pYmxlIGVuIHRvZGFzIGxhcyBzZWNjaW9uZXMgKGhlYWRlciB5IHByb2plY3QvY2xpZW50L3Rhc2spLlxuICAvLyAtIEVuIGVsIGhvbWUgcGFzbyAyIChGQVFzL0ZVQXMgY29uIGNvbnRleHRvIHBpbmVhZG8pOiBlbiBlbCBoZWFkZXIgc2llbXByZTsgZW5cbiAgLy8gICBwcm9qZWN0L2NsaWVudC90YXNrIHNvbG8gc2kgZWwgdXN1YXJpbyByZWluaWNpw7MgZWwgY29udGV4dG8gKHBhc8OzIHBvciBlbCBzZWxlY3RvciBkZVxuICAvLyAgIGNvbnRleHRvcyByZWNpZW50ZXMpLiBFbiBlbCBwYXNvIDEgKHNpbiBjb250ZXh0bykgTk8gc2UgbXVlc3RyYS5cbiAgY29uc3QgaGFzUGlubmVkQ29udGV4dCA9ICEhKHRhc2s/LmlkIHx8IGNoaXBzUHJvamVjdD8ucHJvamVjdElkIHx8IGNsaWVudD8uaWQgfHwgcHJvamVjdD8uaWQpXG4gIGNvbnN0IGlzQ2hhdFZpZXcgPSBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuY2hhdFxuICBjb25zdCBpc0hvbWVTdGVwMiA9IGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5ob21lICYmIGhhc1Bpbm5lZENvbnRleHRcbiAgY29uc3QgaXNIZWFkZXJIb21lU3RlcDIgPSBpc0dsb2JhbE1haWFTZWN0aW9uKHNlY3Rpb24pICYmIGlzSG9tZVN0ZXAyXG4gIGNvbnN0IGlzU2VjdGlvblJlc2V0SG9tZVN0ZXAyID0gIWlzR2xvYmFsTWFpYVNlY3Rpb24oc2VjdGlvbikgJiYgaXNIb21lU3RlcDIgJiYgZGlkUmVzZXRDb250ZXh0SW5TZWN0aW9uXG4gIGNvbnN0IHNob3dCYWNrQnV0dG9uID1cbiAgICBhZ2VudD8udHlwZSA9PT0gJ29yY2hlc3RyYXRvcicgJiZcbiAgICAhaGFzRXJyb3IgJiZcbiAgICAhbG9hZGluZyAmJlxuICAgIChpc0NoYXRWaWV3IHx8IGlzSGVhZGVySG9tZVN0ZXAyIHx8IGlzU2VjdGlvblJlc2V0SG9tZVN0ZXAyKVxuICBjb25zdCBoYW5kbGVPcGVuTWFya2V0cGxhY2UgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgaWYgKCF3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGF3YWl0IGVuc3VyZUFnZW50c0xvYWRlZCgpXG4gICAgY2xlYXJBZ2VudCgpXG4gICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLm15QWdlbnRzKVxuICAgIHBhdGNoTWFpYVBhbmVsU2Vzc2lvbih1c2VyLmlkLCB7XG4gICAgICBhZ2VudHNOYXZBY3RpdmU6ICdteUFnZW50cycsXG4gICAgICBjdXJyZW50T3B0aW9uOiBvcHRpb25zLm15QWdlbnRzLFxuICAgICAgYWN0aXZlQ2hhdElkOiBudWxsLFxuICAgICAgYWdlbnRJZDogbnVsbCxcbiAgICB9KVxuICB9LCBbY2xlYXJBZ2VudCwgZW5zdXJlQWdlbnRzTG9hZGVkLCB1c2VyLmlkXSlcblxuICBjb25zdCBoYW5kbGVPcGVuU2tpbGxzID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmICghY2FuQWNjZXNzVG9Ta2lsbHModXNlcikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjbGVhckFnZW50KClcbiAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMubXlTa2lsbHMpXG4gICAgaGFuZGxlR2V0U2tpbGxzKClcbiAgICBwYXRjaE1haWFQYW5lbFNlc3Npb24odXNlci5pZCwge1xuICAgICAgYWdlbnRzTmF2QWN0aXZlOiAnbXlTa2lsbHMnLFxuICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5teVNraWxscyxcbiAgICB9KVxuICB9LCBbY2xlYXJBZ2VudCwgaGFuZGxlR2V0U2tpbGxzLCB1c2VyXSlcblxuICBjb25zdCBoYW5kbGVHb1RvTWFpYWtlciA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICBsZXQgbWFpYWtlckFnZW50ID0gYWdlbnRzLmRhdGEuZmluZCgoYTogQWdlbnQpID0+IGlzTWFya2V0cGxhY2VHbG9iYWxDbG9uZUFnZW50KGEpKVxuICAgIGlmICghbWFpYWtlckFnZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgICAgcGF0aDogYGFnZW50cz9hZ2VudF90eXBlPWNsb25lJmVudGl0eT1nbG9iYWwmbGFuZz0ke21hcENPUkxhbmcoaTE4bi5sYW5ndWFnZSl9YCxcbiAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgIG1haWFrZXJBZ2VudCA9IChkYXRhLmRhdGEgfHwgW10pLmZpbmQoKGE6IEFnZW50KSA9PiBpc01hcmtldHBsYWNlR2xvYmFsQ2xvbmVBZ2VudChhKSlcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFtYWlha2VyQWdlbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICBzZXRUYXNrPy4obnVsbClcbiAgICBzZWxlY3RBZ2VudChtYWlha2VyQWdlbnQpXG4gICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLmhvbWUpXG4gICAgcGF0Y2hNYWlhUGFuZWxTZXNzaW9uKHVzZXIuaWQsIHtcbiAgICAgIGFnZW50c05hdkFjdGl2ZTogJ21haWFrZXInLFxuICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgYWdlbnRJZDogbWFpYWtlckFnZW50LmlkLFxuICAgICAgYWN0aXZlQ2hhdElkOiBudWxsLFxuICAgIH0pXG4gIH0sIFthZ2VudHMuZGF0YSwgaTE4bi5sYW5ndWFnZSwgc2VsZWN0QWdlbnQsIHNldENsaWVudCwgc2V0UHJvamVjdCwgc2V0VGFzaywgdXNlci5pZF0pXG5cbiAgY29uc3QgbG9hZEFnZW50c0ZvclNlc3Npb25SZXN0b3JlID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHNuYXBzaG90OiBNYWlhUGFuZWxTZXNzaW9uU25hcHNob3QpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGlmIChzbmFwc2hvdC5hZ2VudHNOYXZBY3RpdmUgPT09ICdteVNraWxscycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGxldCBhZ2VudFRvU2VsZWN0OiBBZ2VudCB8IHVuZGVmaW5lZFxuICAgICAgaWYgKHNuYXBzaG90LmFnZW50SWQgJiYgc25hcHNob3QuYWdlbnRzTmF2QWN0aXZlICE9PSAnbXlBZ2VudHMnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYWdlbnRUb1NlbGVjdCA9IGF3YWl0IGZldGNoQWdlbnREZXRhaWwoc25hcHNob3QuYWdlbnRJZClcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgYWdlbnRUb1NlbGVjdCA9IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghYWdlbnRzRmV0Y2hlZFJlZi5jdXJyZW50KSB7XG4gICAgICAgIGFnZW50c0ZldGNoZWRSZWYuY3VycmVudCA9IHRydWVcbiAgICAgICAgYXdhaXQgaGFuZGxlR2V0QWdlbnRzKHNuYXBzaG90LmFnZW50c05hdkFjdGl2ZSA9PT0gJ215QWdlbnRzJyA/IHVuZGVmaW5lZCA6IGFnZW50VG9TZWxlY3QpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoYWdlbnRUb1NlbGVjdCAmJiBzbmFwc2hvdC5hZ2VudHNOYXZBY3RpdmUgIT09ICdteUFnZW50cycpIHtcbiAgICAgICAgc2VsZWN0QWdlbnQoYWdlbnRUb1NlbGVjdClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtoYW5kbGVHZXRBZ2VudHMsIHNlbGVjdEFnZW50XVxuICApXG5cbiAgY29uc3QgYXBwbHlTZXNzaW9uUmVzdG9yZSA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChzbmFwc2hvdDogTWFpYVBhbmVsU2Vzc2lvblNuYXBzaG90KSA9PiB7XG4gICAgICBzZXRJc01pbmltaXplZChmYWxzZSlcbiAgICAgIHNldENoYXRWaWV3VmlzaWJsZSh0cnVlKVxuXG4gICAgICBpZiAoc25hcHNob3QuaG9zdENvbnRleHQ/LmNoaXBzUHJvamVjdCkge1xuICAgICAgICBzZXRDaGlwc1Byb2plY3Qoc25hcHNob3QuaG9zdENvbnRleHQuY2hpcHNQcm9qZWN0KVxuICAgICAgfVxuXG4gICAgICBpZiAoc25hcHNob3QuYWdlbnRzTmF2QWN0aXZlID09PSAnbXlBZ2VudHMnKSB7XG4gICAgICAgIGF3YWl0IGhhbmRsZU9wZW5NYXJrZXRwbGFjZSgpXG4gICAgICAgIGZvY3VzQ2hhdElucHV0KClcbiAgICAgICAgc3luY1BhbmVsU2Vzc2lvbigpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoc25hcHNob3QuYWdlbnRzTmF2QWN0aXZlID09PSAnbXlTa2lsbHMnKSB7XG4gICAgICAgIGhhbmRsZU9wZW5Ta2lsbHMoKVxuICAgICAgICBmb2N1c0NoYXRJbnB1dCgpXG4gICAgICAgIHN5bmNQYW5lbFNlc3Npb24oKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHNuYXBzaG90LmFnZW50c05hdkFjdGl2ZSA9PT0gJ21haWFrZXInKSB7XG4gICAgICAgIGF3YWl0IGhhbmRsZUdvVG9NYWlha2VyKClcbiAgICAgICAgZm9jdXNDaGF0SW5wdXQoKVxuICAgICAgICBzeW5jUGFuZWxTZXNzaW9uKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChzbmFwc2hvdC5jdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmNoYXQgJiYgc25hcHNob3QuYWN0aXZlQ2hhdElkKSB7XG4gICAgICAgIHNldFVzZXJJbml0aWFsTWVzc2FnZSh7IG1lc3NhZ2U6ICcnLCBhdHRhY2htZW50czogW10gfSlcbiAgICAgICAgc2V0SW5pdGlhbENoYXRJZChzbmFwc2hvdC5hY3RpdmVDaGF0SWQpXG4gICAgICAgIGdldENoYXRzU3RvcmVTdGF0ZSgpLnNldEFjdGl2ZUNoYXRJZChzbmFwc2hvdC5hY3RpdmVDaGF0SWQpXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuICAgICAgICBoYW5kbGVycy5jaGF0KClcbiAgICAgIH0gZWxzZSBpZiAoc25hcHNob3QuY3VycmVudE9wdGlvbiAmJiBpc1ZhbGlkTWFpYVBhbmVsT3B0aW9uKHNuYXBzaG90LmN1cnJlbnRPcHRpb24pKSB7XG4gICAgICAgIHNldEN1cnJlbnRPcHRpb24oc25hcHNob3QuY3VycmVudE9wdGlvbiBhcyBvcHRpb25zKVxuICAgICAgfVxuXG4gICAgICBmb2N1c0NoYXRJbnB1dCgpXG4gICAgICBzeW5jUGFuZWxTZXNzaW9uKClcbiAgICB9LFxuICAgIFtcbiAgICAgIGZvY3VzQ2hhdElucHV0LFxuICAgICAgaGFuZGxlR29Ub01haWFrZXIsXG4gICAgICBoYW5kbGVPcGVuTWFya2V0cGxhY2UsXG4gICAgICBoYW5kbGVPcGVuU2tpbGxzLFxuICAgICAgaGFuZGxlcnMsXG4gICAgICBzZXRDaGF0Vmlld1Zpc2libGUsXG4gICAgICBzZXRDaGlwc1Byb2plY3QsXG4gICAgICBzeW5jUGFuZWxTZXNzaW9uLFxuICAgIF1cbiAgKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgc25hcHNob3QgPSBwZW5kaW5nU2Vzc2lvblJlc3RvcmVSZWYuY3VycmVudFxuICAgIGlmICghc25hcHNob3QgfHwgc2Vzc2lvblJlc3RvcmVTdGFydGVkUmVmLmN1cnJlbnQpIHJldHVyblxuICAgIHNlc3Npb25SZXN0b3JlU3RhcnRlZFJlZi5jdXJyZW50ID0gdHJ1ZVxuXG4gICAgc2V0Q2hhdFZpZXdWaXNpYmxlKHRydWUpXG5cbiAgICBjb25zdCBydW5SZXN0b3JlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgbG9hZEFnZW50c0ZvclNlc3Npb25SZXN0b3JlKHNuYXBzaG90KVxuICAgICAgICBwZW5kaW5nU2Vzc2lvblJlc3RvcmVSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgYXdhaXQgYXBwbHlTZXNzaW9uUmVzdG9yZShzbmFwc2hvdClcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzUmVzdG9yaW5nU2Vzc2lvbihmYWxzZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBydW5SZXN0b3JlKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKVxuICB9LCBbYXBwbHlTZXNzaW9uUmVzdG9yZSwgbG9hZEFnZW50c0ZvclNlc3Npb25SZXN0b3JlLCBzZXRDaGF0Vmlld1Zpc2libGVdKVxuXG4gIGNvbnN0IGhhbmRsZURlbGV0ZUFnZW50RnJvbU15QWdlbnRzID0gdXNlQ2FsbGJhY2soXG4gICAgKGFnZW50SWQ6IHN0cmluZykgPT4ge1xuICAgICAgcmVtb3ZlQWdlbnQoYWdlbnRJZClcbiAgICAgIGlmIChhZ2VudD8uaWQgPT09IGFnZW50SWQpIHtcbiAgICAgICAgc2VsZWN0Rmlyc3RBZ2VudChhZ2VudElkKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2FnZW50Py5pZCwgcmVtb3ZlQWdlbnQsIHNlbGVjdEZpcnN0QWdlbnRdXG4gIClcblxuICAvLyBFbCBmb290ZXIgKGlucHV0KSBzZSBvY3VsdGEgc29sbyBlbiBlbCBob21lIG1hcmtldHBsYWNlIGRlIE1haWFrZXIgKGJyb3dzZSBkZSBhZ2VudGVzKS5cbiAgLy8gRWwgaG9tZSBkZWwgb3JjaGVzdHJhdG9yIHPDrSBwZXJtaXRlIGVzY3JpYmlyLCBhc8OtIHF1ZSBtYW50aWVuZSBlbCBmb290ZXIuXG4gIGNvbnN0IGlzTWFpYWtlckNyZWF0b3JIb21lID0gY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmhvbWUgJiYgaXNNYWlha2VyQWdlbnRTZWxlY3RlZFxuXG4gIGNvbnN0IG1vZGFsUGFuZWwgPSAoXG4gICAgPD5cbiAgICAgIHt2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZShzZWN0aW9uLCB1c2VyKSAmJiAhaXNGbG9hdGluZyA/IChcbiAgICAgICAgPFNpZGViYXJcbiAgICAgICAgICBvbkdvVG9DaGF0PXtnb1RvQ2hhdH1cbiAgICAgICAgICBvbkVycm9yPXsoKSA9PiBzZXRTaWRlYmFySGFzRXJyb3IodHJ1ZSl9XG4gICAgICAgICAgaGFuZGxlR29Ub0hvbWU9e2hhbmRsZUdvSG9tZX1cbiAgICAgICAgICBoYW5kbGVTdGFydE5ld0NoYXQ9e2hhbmRsZVN0YXJ0TmV3Q2hhdH1cbiAgICAgICAgICBoYW5kbGVPcGVuTWFya2V0cGxhY2U9e2hhbmRsZU9wZW5NYXJrZXRwbGFjZX1cbiAgICAgICAgICBzaG93TmV3Q2hhdD17c2hvd05ld0NoYXR9XG4gICAgICAgICAgcmVmZXRjaENoYXRzPXtyZWZldGNoQ2hhdHN9XG4gICAgICAgICAgaGFuZGxlU2V0UmVmZXRjaENoYXRzPXtzZXRSZWZldGNoQ2hhdHN9XG4gICAgICAgICAgaGFzRXJyb3I9e3NpZGViYXJIYXNFcnJvcn1cbiAgICAgICAgICBhZ2VudHNOYXZBY3RpdmU9e3NpZGViYXJBZ2VudHNOYXZBY3RpdmV9XG4gICAgICAgICAgaGFuZGxlT3BlblNraWxscz17aGFuZGxlT3BlblNraWxsc31cbiAgICAgICAgICBvbk9wZW5NYWlha2VyQ3JlYXRvcj17aGFuZGxlR29Ub01haWFrZXJ9XG4gICAgICAgICAgaXNMZWdhY3lDb250ZXh0U2Vzc2lvbj17ISFsZWdhY3lDb250ZXh0U2Vzc2lvbn1cbiAgICAgICAgICBpbml0aWFsT3Blbj17c2F2ZWRTZXNzaW9uT25Nb3VudFJlZi5jdXJyZW50Py5zaWRlYmFyT3BlbiA/PyBmYWxzZX1cbiAgICAgICAgICBvbk9wZW5DaGFuZ2U9e2hhbmRsZVNpZGViYXJPcGVuQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgKSA6IG51bGx9XG4gICAgICA8U0NDQUlNQ29udGVudCBleHBhbmRlZD17ZXhwYW5kZWR9IGZsb2F0aW5nPXtpc0Zsb2F0aW5nfT5cbiAgICAgICAgPENoYXRBSU1vZGFsSGVhZGVyXG4gICAgICAgICAgbGF5b3V0TW9kZT17bGF5b3V0TW9kZX1cbiAgICAgICAgICBvbkxheW91dE1vZGVDaGFuZ2U9e2hhbmRsZUxheW91dE1vZGVDaGFuZ2V9XG4gICAgICAgICAgZXhwYW5kZWQ9e2V4cGFuZGVkfVxuICAgICAgICAgIGRyYWdnYWJsZT17aXNGbG9hdGluZ31cbiAgICAgICAgICBvbkRyYWdTdGFydD17aGFuZGxlRHJhZ1N0YXJ0fVxuICAgICAgICAgIG9uRHJhZ01vdmU9e2hhbmRsZURyYWdNb3ZlfVxuICAgICAgICAgIG9uRHJhZ0VuZD17aGFuZGxlRHJhZ0VuZH1cbiAgICAgICAgICBoYW5kbGVNaW5pbWl6ZT17aGFuZGxlTWluaW1pemV9XG4gICAgICAgICAgYWdlbnRzPXthZ2VudHMuZGF0YX1cbiAgICAgICAgICBoYXNFcnJvcj17ISFhZ2VudEVycm9yfVxuICAgICAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICAgICAgbG9hZGluZ01vcmU9e2xvYWRpbmdNb3JlfVxuICAgICAgICAgIGhhc01vcmU9e2FnZW50cy5oYXNfbW9yZX1cbiAgICAgICAgICBoYW5kbGVSZXNldENoYXQ9e2hhbmRsZVJlc2V0Q2hhdH1cbiAgICAgICAgICBvbkFnZW50VXBkYXRlPXt1cGRhdGVBZ2VudEZhdm9yaXRlfVxuICAgICAgICAgIGxvYWRNb3JlQWdlbnRzPXtsb2FkTW9yZUFnZW50c31cbiAgICAgICAgICBzb3J0QWdlbnRzTGlzdD17c29ydEFnZW50c0xpc3R9XG4gICAgICAgICAgaXNNeUFnZW50c1NlY3Rpb249e2lzTXlBZ2VudHNTZWN0aW9ufVxuICAgICAgICAgIGlzTXlTa2lsbHNTZWN0aW9uPXtpc015U2tpbGxzU2VjdGlvbn1cbiAgICAgICAgICBpc01haWFrZXJTZWN0aW9uPXtpc01haWFrZXJDcmVhdG9ySG9tZX1cbiAgICAgICAgICBzaG93QmFja0J1dHRvbj17c2hvd0JhY2tCdXR0b259XG4gICAgICAgICAgb25CYWNrPXtoYW5kbGVCYWNrfVxuICAgICAgICAvPlxuICAgICAgICB7aGFzRXJyb3IgPyAoXG4gICAgICAgICAgPE1BSUFFcnJvciAvPlxuICAgICAgICApIDogdmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUoc2VjdGlvbiwgdXNlcikgPyAoXG4gICAgICAgICAgPENoYXRBSUNvbnRlbnRcbiAgICAgICAgICAgIGN1cnJlbnRPcHRpb249e2NvbXB1dGVkQ3VycmVudE9wdGlvbn1cbiAgICAgICAgICAgIGhhbmRsZXJzPXt7IC4uLmhhbmRsZXJzLCBjaGF0OiBzdGFydENoYXQsIGhvbWU6IGhhbmRsZXJzLmhvbWUsIGhhbmRsZUdvSG9tZSB9fVxuICAgICAgICAgICAgb25FcnJvcj17KCkgPT4gc2V0SGFzRXJyb3IodHJ1ZSl9XG4gICAgICAgICAgICByZWZzPXt7IHVzZXJJbml0aWFsTWVzc2FnZSwgaW5pdGlhbENoYXRJZCB9fVxuICAgICAgICAgICAgb25TZW5kTWVzc2FnZVJlYWR5PXtoYW5kbGVTZW5kTWVzc2FnZVJlYWR5fVxuICAgICAgICAgICAgZXhwYW5kZWQ9e2V4cGFuZGVkfVxuICAgICAgICAgICAgZmxvYXRpbmc9e2lzRmxvYXRpbmd9XG4gICAgICAgICAgICBhZ2VudHM9e2FnZW50cy5kYXRhfVxuICAgICAgICAgICAgbG9hZGluZ0FnZW50cz17bG9hZGluZ31cbiAgICAgICAgICAgIG9uRGVsZXRlQWdlbnQ9e2hhbmRsZURlbGV0ZUFnZW50RnJvbU15QWdlbnRzfVxuICAgICAgICAgICAgb25GYXZvcml0ZUFnZW50VXBkYXRlPXt1cGRhdGVBZ2VudEZhdm9yaXRlfVxuICAgICAgICAgICAgaGFzTW9yZUFnZW50cz17ISFhZ2VudHMuaGFzX21vcmV9XG4gICAgICAgICAgICBsb2FkaW5nTW9yZUFnZW50cz17bG9hZGluZ01vcmV9XG4gICAgICAgICAgICBvbkxvYWRNb3JlQWdlbnRzPXtsb2FkTW9yZUFnZW50c31cbiAgICAgICAgICAgIG9uR29Ub01haWFrZXI9e2hhbmRsZUdvVG9NYWlha2VyfVxuICAgICAgICAgICAgbXlTa2lsbHM9e215U2tpbGxzfVxuICAgICAgICAgICAgc2hhcmVkU2tpbGxzPXtzaGFyZWRTa2lsbHN9XG4gICAgICAgICAgICBsb2FkaW5nU2tpbGxzPXtsb2FkaW5nU2tpbGxzfVxuICAgICAgICAgICAgb25EZWxldGVTa2lsbD17cmVtb3ZlU2tpbGx9XG4gICAgICAgICAgICBvblNlYXJjaEFnZW50cz17c2VhcmNoQ3VzdG9tQWdlbnRzfVxuICAgICAgICAgICAgc2VhcmNoTG9hZGluZ0FnZW50cz17c2VhcmNoTG9hZGluZ31cbiAgICAgICAgICAgIGFnZW50RXJyb3I9e2FnZW50RXJyb3J9XG4gICAgICAgICAgICBpc1Jlc3RvcmluZ1Nlc3Npb249e2lzUmVzdG9yaW5nU2Vzc2lvbn1cbiAgICAgICAgICAvPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxQcm9qZWN0U3VtbWFyeUNvbnRlbnQgb25SZXN0YXJ0U3VtbWFyeT17aGFuZGxlcnMuaG9tZX0gLz5cbiAgICAgICAgKX1cbiAgICAgICAgeygoY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmhvbWUgJiYgISFhZ2VudHM/LmRhdGE/Lmxlbmd0aCkgfHxcbiAgICAgICAgICBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuY2hhdCkgJiZcbiAgICAgICAgICAhaXNNYWlha2VyQ3JlYXRvckhvbWUgJiZcbiAgICAgICAgICAhaGFzRXJyb3IgJiZcbiAgICAgICAgICAhbG9hZGluZyAmJlxuICAgICAgICAgIHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlKHNlY3Rpb24sIHVzZXIpICYmIChcbiAgICAgICAgICAgIDxDaGF0QWlNb2RhbEZvb3RlclxuICAgICAgICAgICAgICBhZ2VudD17YWdlbnR9XG4gICAgICAgICAgICAgIGhhbmRsZVNlbmRNZXNzYWdlPXtoYW5kbGVTZW5kTWVzc2FnZX1cbiAgICAgICAgICAgICAgaGFuZGxlU3RvcEdlbmVyYXRpb249e3N0b3BHZW5lcmF0aW9uRnVuY3Rpb259XG4gICAgICAgICAgICAgIGlzU3RyZWFtaW5nPXtpc1N0cmVhbWluZ31cbiAgICAgICAgICAgICAgaXNXcml0aW5nPXtpc1dyaXRpbmd9XG4gICAgICAgICAgICAgIGNoYXRJZD17aW5pdGlhbENoYXRJZH1cbiAgICAgICAgICAgICAgbmV3Q2hhdEtleT17bmV3Q2hhdEtleX1cbiAgICAgICAgICAgICAgdG9vbHRpcFpJbmRleD17dG9vbHRpcFpJbmRleH1cbiAgICAgICAgICAgICAgbGVnYWN5Q29udGV4dFNlc3Npb249e2xlZ2FjeUNvbnRleHRTZXNzaW9ufVxuICAgICAgICAgICAgICBvbkNvbnRpbnVlSW5OZXdDaGF0PXtoYW5kbGVDb250aW51ZUxlZ2FjeUNvbnRleHRJbk5ld0NoYXR9XG4gICAgICAgICAgICAgIGxheW91dE1vZGU9e2xheW91dE1vZGV9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICA8L1NDQ0FJTUNvbnRlbnQ+XG4gICAgPC8+XG4gIClcblxuICBjb25zdCBjb250ZW50V3JhcHBlciA9IChcbiAgICA8U0NDQUlNQ29udGVudFdyYXBwZXIgZXhwYW5kZWQ9e2V4cGFuZGVkfSBmbG9hdGluZz17aXNGbG9hdGluZ30gcmVmPXtjb250ZW50V3JhcHBlclJlZn0+XG4gICAgICB7bW9kYWxQYW5lbH1cbiAgICA8L1NDQ0FJTUNvbnRlbnRXcmFwcGVyPlxuICApXG5cbiAgcmV0dXJuIChcbiAgICBzZWxlY3RvciAmJlxuICAgIFJlYWN0RE9NLmNyZWF0ZVBvcnRhbChcbiAgICAgIDxTQ0NBSU1XcmFwcGVyXG4gICAgICAgIGV4cGFuZGVkPXtleHBhbmRlZH1cbiAgICAgICAgbGF5b3V0TW9kZT17bGF5b3V0TW9kZX1cbiAgICAgICAgZHJhZ1Bvc2l0aW9uPXtyZXNvbHZlZERyYWdQb3NpdGlvbn1cbiAgICAgICAgZWxldmF0ZWQ9e3NlY3Rpb24gPT09ICd0YXNrJ31cbiAgICAgICAgJG1pbmltaXplZD17aXNNaW5pbWl6ZWR9XG4gICAgICA+XG4gICAgICAgIDxTQ0NBSU1NaW5pbWl6ZWRIaWRlICRoaWRkZW49e2lzTWluaW1pemVkfT5cbiAgICAgICAgICA8RmxvYXRpbmdQYW5lbE1vdGlvbiB0aWx0PXt0aWx0TW90aW9ufSBleHBhbmRlZD17ZXhwYW5kZWR9PlxuICAgICAgICAgICAge2NvbnRlbnRXcmFwcGVyfVxuICAgICAgICAgIDwvRmxvYXRpbmdQYW5lbE1vdGlvbj5cbiAgICAgICAgPC9TQ0NBSU1NaW5pbWl6ZWRIaWRlPlxuICAgICAgICB7aXNNaW5pbWl6ZWQgJiYgKFxuICAgICAgICAgIDxNYWlhTWluaW1pemVkUGlsbFxuICAgICAgICAgICAgc2hvd05vdmVsdHlEb3Q9e3Nob3dNaW5pbWl6ZWROb3ZlbHR5RG90fVxuICAgICAgICAgICAgaXNTdHJlYW1pbmc9e2hhc0FjdGl2ZVN0cmVhbX1cbiAgICAgICAgICAgIG9uUmVzdG9yZT17aGFuZGxlUmVzdG9yZUZyb21NaW5pbWl6ZWR9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAge3VzZXJIYXNQZXJtaXNzaW9ucyAmJiAoXG4gICAgICAgICAgPEFibUFnZW50TW9kYWxcbiAgICAgICAgICAgIGFkZEFnZW50PXthZGRBZ2VudH1cbiAgICAgICAgICAgIHVwZGF0ZUFnZW50PXt1cGRhdGVBZ2VudH1cbiAgICAgICAgICAgIHJlbW92ZUFnZW50PXtyZW1vdmVBZ2VudH1cbiAgICAgICAgICAgIHVwZGF0ZUFnZW50RmF2b3JpdGU9e3VwZGF0ZUFnZW50RmF2b3JpdGV9XG4gICAgICAgICAgICBzZWxlY3RGaXJzdEFnZW50PXtzZWxlY3RGaXJzdEFnZW50fVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICAgIHt1c2VySGFzU2tpbGxzQWNjZXNzICYmIChcbiAgICAgICAgICA8QWJtU2tpbGxNb2RhbCBhZGRTa2lsbD17YWRkU2tpbGx9IHVwZGF0ZVNraWxsSW5MaXN0PXt1cGRhdGVTa2lsbEluTGlzdH0gcmVtb3ZlU2tpbGw9e3JlbW92ZVNraWxsfSAvPlxuICAgICAgICApfVxuICAgICAgICB7dXNlckhhc1NraWxsc0FjY2VzcyAmJiA8QWJtU2tpbGxHZW5lcmF0ZU1vZGFsIC8+fVxuICAgICAgICA8U25hY2tiYXIgLz5cbiAgICAgIDwvU0NDQUlNV3JhcHBlcj4sXG4gICAgICBzZWxlY3RvclxuICAgIClcbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQ0VBLFdBQVcsRUFDWEMsT0FBTyxFQUNQQyxRQUFRLEVB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
1523
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsInVzZVJlZiIsInVzZUVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsIlJlYWN0RE9NIiwibW9tZW50IiwidXNlVHJhbnNsYXRpb24iLCJ1c2VVc2VyIiwiY2FuQWNjZXNzVG9Ta2lsbHMiLCJNQUlBRXJyb3IiLCJ1c2VNYWlhVGFza1BhbmVsWkluZGV4IiwiQ2hhdEFJQ29udGVudCIsImJ1aWxkSGFuZGxlcnMiLCJvcHRpb25zIiwiU2lkZWJhciIsInVzZUdldEFnZW50cyIsInVzZUdldFNraWxscyIsInVzZUdsb2JhbENvbnRleHQiLCJDaGF0QUlNb2RhbEhlYWRlciIsIlNuYWNrYmFyIiwiUHJvamVjdFN1bW1hcnlDb250ZW50IiwiQWJtQWdlbnRNb2RhbCIsIkFibVNraWxsTW9kYWwiLCJTS0lMTF9VU0VfQUZURVJfU0FWRV9FVkVOVCIsIkFibVNraWxsR2VuZXJhdGVNb2RhbCIsIlNFQ1RJT05TIiwiU0NDQUlNQ29udGVudCIsIlNDQ0FJTUNvbnRlbnRXcmFwcGVyIiwiU0NDQUlNTWluaW1pemVkSGlkZSIsIlNDQ0FJTVdyYXBwZXIiLCJNYWlhTWluaW1pemVkUGlsbCIsInVzZU1pbmltaXplZFBpbGxOb3ZlbHR5RG90IiwiZ2V0TWFpYUZsb2F0aW5nUGFuZWxXaWR0aFB4IiwicmVzb2x2ZUluaXRpYWxNYWlhQ2hhdExheW91dE1vZGUiLCJzZXRTdG9yZWRNYWlhQ2hhdExheW91dE1vZGUiLCJGbG9hdGluZ1BhbmVsTW90aW9uIiwidXNlRmxvYXRpbmdQYW5lbERyYWdUaWx0IiwiQ2hhdEFpTW9kYWxGb290ZXIiLCJpc01hcmtldHBsYWNlR2xvYmFsQ2xvbmVBZ2VudCIsInVzZUZhcXNTdG9yZSIsImdldENoYXRzU3RvcmVTdGF0ZSIsInVzZUNoYXRzU3RvcmUiLCJyZWFkTGFzdEFjdGl2ZUNoYXRJZCIsIndyaXRlTGFzdEFjdGl2ZUNoYXRJZCIsImNsZWFyTWFpYVBhbmVsU2Vzc2lvbiIsInBhdGNoTWFpYVBhbmVsU2Vzc2lvbiIsInJlYWRNYWlhUGFuZWxTZXNzaW9uIiwid3JpdGVNYWlhUGFuZWxTZXNzaW9uIiwidXNlU2Vzc2lvbnNTdG9yZSIsImZldGNoTWFpYSIsImZldGNoQWdlbnREZXRhaWwiLCJtYXBDT1JMYW5nIiwiRVZFTlRTIiwidXNlRXZlbnQiLCJNQUlBX09QRU5fRlJPTV9IT1NUX0VWRU5UIiwiY2xhbXBGbG9hdGluZ1BhbmVsUG9zaXRpb24iLCJoYXNBbnlBY3RpdmVTZXNzaW9uSW5NZXRhIiwiaGFzQmFubmVyRmFxVGl0bGUiLCJpc0Jhbm5lckZhcVJlYWR5VG9BdXRvU2VuZCIsInJlc29sdmVBaUNoYXRCYWNrRGVzdGluYXRpb24iLCJyZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uIiwicmVzb2x2ZUluaXRpYWxDdXJyZW50T3B0aW9uIiwicmVzb2x2ZUxlZ2FjeUNvbnRleHRTZXNzaW9uIiwicmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUiLCJzaG91bGRSZXN0b3JlRXhwYW5kZWRQYW5lbCIsInNob3VsZFNraXBGbG9hdGluZ0RyYWdUYXJnZXQiLCJ2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSIsInJlc29sdmVIb3N0VGFrZW92ZXJFbnRpdHlTdGF0ZSIsImJ1aWxkSG9zdFRha2VvdmVyUGVyc2lzdENvbnRleHQiLCJidWlsZE1haWFQYW5lbFNlc3Npb25QYXRjaCIsImRpc3BhdGNoU2tpbGxNZW50aW9uSW5zZXJ0IiwiZW5zdXJlQWdlbnRzQmVmb3JlU2tpbGxVc2UiLCJyZXNvbHZlRmxvYXRpbmdQYW5lbERyYWdQb3NpdGlvbiIsInJlc29sdmVIb3N0VGFrZW92ZXJBZ2VudElkIiwicmVzb2x2ZU1haWFNb2RhbEkxOG5MYW5nIiwicmVzb2x2ZU1pbmltaXplZFJlc3RvcmVUYXJnZXQiLCJyZXNvbHZlTmV4dERyYWdQb3NpdGlvbiIsInJlc29sdmVVc2VySGFzQWdlbnRNYW5hZ2VtZW50UGVybWlzc2lvbnMiLCJzaG91bGRCYWNrQ2xlYXJQaW5uZWRDb250ZXh0Iiwic2hvdWxkQmFja1N0YXJ0TmV3Q2hhdFByZXNlcnZpbmdDb250ZXh0Iiwic2hvdWxkTWFya09yY2hlc3RyYXRvckNvbnRleHRSZXNldCIsInNob3VsZFN0YXJ0TmV3Q2hhdEZyb21DYXRhbG9nIiwicmVzb2x2ZUhhc1Bpbm5lZENvbnRleHQiLCJyZXNvbHZlT3JjaGVzdHJhdG9ySG9tZU5hdkZsYWdzIiwic2hvdWxkU2hvd09yY2hlc3RyYXRvckJhY2tCdXR0b24iLCJzaG91bGRDbGVhckNsaWVudE9uR29Ib21lRnJvbUNoYXQiLCJzaG91bGRDbGVhclRhc2tPbkdvSG9tZUZyb21DaGF0Iiwic2hvdWxkUmVzZXRBZ2VudFRvRmlyc3RPbkdvSG9tZSIsInNob3VsZENsZWFyT3JjaGVzdHJhdG9yR2xvYmFsQ29udGV4dE9uR29Ib21lIiwic2hvdWxkVXNlQWN0aXZlQ2hhdFNlbmRIYW5kbGVyIiwic2hvdWxkUHJlZmV0Y2hBZ2VudHNGb3JDYXRhbG9nTmV3Q2hhdCIsImNhbk9wZW5NYWlhTWFya2V0cGxhY2UiLCJzaG91bGRNYXJrQWdlbnRBc0xlZ2FjeUNvbnRleHQiLCJidWlsZExlZ2FjeUNvbnRleHRBZ2VudCIsImJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoIiwiZmluZE9yY2hlc3RyYXRvckFnZW50Iiwic2hvdWxkU2V0Q2hhdFZpZXdIaWRkZW5Pbk1vdW50Iiwic2hvdWxkUGVyc2lzdExhc3RBY3RpdmVDaGF0SWQiLCJzaG91bGRTeW5jUGFuZWxTZXNzaW9uT25QYWdlSGlkZSIsInJlc29sdmVDYWNoZWRBZ2VudHNJZkF2YWlsYWJsZSIsInNob3VsZEF0dGVtcHRJbml0aWFsQWdlbnRzRmV0Y2giLCJmaW5kQWdlbnRGb3JDaGF0SXRlbSIsInNob3VsZEFwcGx5Q2xpZW50T25Ib3N0VGFrZW92ZXIiLCJzaG91bGRTZWxlY3RGaXJzdEFnZW50T25Ib3N0VGFrZW92ZXIiLCJzaG91bGRSZXNldENoYXRTdGF0ZU9uR29Ib21lIiwic2hvdWxkQ2xlYXJDb250ZXh0Rm9yQ2F0YWxvZ09yU2tpbGxBZ2VudCIsInJlc29sdmVPcGVuTmV3Q2hhdFdpdGhBZ2VudENvbnRleHQiLCJjYW5Db250aW51ZUxlZ2FjeUNvbnRleHRJbk5ld0NoYXQiLCJyZXNvbHZlU2Vzc2lvblJlc3RvcmVOYXZSb3V0ZSIsInNob3VsZFNraXBBZ2VudHNMb2FkT25TZXNzaW9uUmVzdG9yZSIsInNob3VsZEZldGNoQWdlbnREZXRhaWxPblNlc3Npb25SZXN0b3JlIiwic2hvdWxkUGFzc0FnZW50VG9HZXRBZ2VudHNPblJlc3RvcmUiLCJzaG91bGRTZWxlY3RGZXRjaGVkQWdlbnRBZnRlclJlc3RvcmUiLCJyZXNvbHZlU25hcHNob3RDaGlwc1Byb2plY3QiLCJyZXNvbHZlQ2hhdE1vZGFsU2VjdGlvbkZsYWdzIiwic2hvdWxkUmVuZGVyQ2hhdFNpZGViYXIiLCJyZXNvbHZlQ2hhdE1vZGFsTWFpbkNvbnRlbnRWaWV3Iiwic2hvdWxkU2hvd0NoYXRNb2RhbEZvb3RlciIsInNob3VsZFVzZUVsZXZhdGVkTWFpYVBhbmVsIiwic2hvdWxkUmVzZWxlY3RBZ2VudEFmdGVyRGVsZXRlIiwic2hvdWxkQ2xlYXJEcmFnUG9zaXRpb25PbkxheW91dENoYW5nZSIsInNob3VsZFN0YXJ0RmxvYXRpbmdQYW5lbERyYWciLCJpc0FjdGl2ZUZsb2F0aW5nRHJhZ1BvaW50ZXIiLCJzaG91bGRPcGVuU2tpbGxzQ2F0YWxvZyIsInNob3VsZFVzZURyYWdDbGFtcEZhbGxiYWNrIiwicmVzb2x2ZUxheW91dERyYWdQb3NpdGlvblVwZGF0ZSIsInJlc29sdmVQZXJzaXN0ZWREcmFnUG9zaXRpb25PbkVuZCIsImJ1aWxkVXNlckluaXRpYWxNZXNzYWdlRnJvbVN0YXJ0Q2hhdCIsInNob3VsZFJlc2V0U2lkZWJhckVycm9yT25TdGFydENoYXQiLCJqc3giLCJfanN4IiwianN4cyIsIl9qc3hzIiwiRnJhZ21lbnQiLCJfRnJhZ21lbnQiLCJJRF9NT0RBTF9DSEFUX0FHRU5UIiwiQ2hhdEFJTW9kYWwiLCJfc2F2ZWRTZXNzaW9uT25Nb3VudFIiLCJfc2F2ZWRTZXNzaW9uT25Nb3VudFIyIiwiX3NhdmVkU2Vzc2lvbk9uTW91bnRSNSIsIl9zYXZlZFNlc3Npb25Pbk1vdW50UjYiLCJ1c2VyIiwiX3VzZVRyYW5zbGF0aW9uIiwiYWJtQWdlbnQiLCJpMThuIiwiYW1wbGl0dWRFdmVudCIsInNhdmVkU2Vzc2lvbk9uTW91bnRSZWYiLCJpZCIsInNob3VsZFJlc3RvcmVFeHBhbmRlZCIsImN1cnJlbnQiLCJwZW5kaW5nU2Vzc2lvblJlc3RvcmVSZWYiLCJzZXNzaW9uUmVzdG9yZVN0YXJ0ZWRSZWYiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJpc1Jlc3RvcmluZ1Nlc3Npb24iLCJzZXRJc1Jlc3RvcmluZ1Nlc3Npb24iLCJzaWRlYmFyT3BlblJlZiIsInNpZGViYXJPcGVuIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJpc01pbmltaXplZCIsInNldElzTWluaW1pemVkIiwic2V0Q2hhdFZpZXdWaXNpYmxlIiwic3RhdGUiLCJ1bnJlYWRDb3VudCIsInNob3dNaW5pbWl6ZWROb3ZlbHR5RG90IiwiYWN0aXZlQ2hhdElkIiwiaGFzQWN0aXZlU3RyZWFtIiwibWV0YSIsImdvVG9DaGF0UmVmIiwiZ29Ib21lUmVmIiwiaGFuZGxlTWluaW1pemUiLCJhaUNoYXRNaW5pbWl6ZSIsImlzRXhwYW5kZWQiLCJmb2N1c0NoYXRJbnB1dCIsIndpbmRvdyIsInNldFRpbWVvdXQiLCJkb2N1bWVudCIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsIl91c2VTdGF0ZTUiLCJtZXNzYWdlIiwiYXR0YWNobWVudHMiLCJfdXNlU3RhdGU2IiwidXNlckluaXRpYWxNZXNzYWdlIiwic2V0VXNlckluaXRpYWxNZXNzYWdlIiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJpbml0aWFsQ2hhdElkIiwic2V0SW5pdGlhbENoYXRJZCIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwibmV3Q2hhdEtleSIsInNldE5ld0NoYXRLZXkiLCJfdXNlU3RhdGUxIiwiX3VzZVN0YXRlMTAiLCJzZXNzaW9uTWV0YSIsInNldFNlc3Npb25NZXRhIiwiX3VzZVN0YXRlMTEiLCJfdXNlU3RhdGUxMiIsInNlbmRNZXNzYWdlRnVuY3Rpb24iLCJzZXRTZW5kTWVzc2FnZUZ1bmN0aW9uIiwiX3VzZVN0YXRlMTMiLCJfdXNlU3RhdGUxNCIsInN0b3BHZW5lcmF0aW9uRnVuY3Rpb24iLCJzZXRTdG9wR2VuZXJhdGlvbkZ1bmN0aW9uIiwiX3VzZVN0YXRlMTUiLCJfdXNlU3RhdGUxNiIsImlzU3RyZWFtaW5nIiwic2V0SXNTdHJlYW1pbmciLCJfdXNlU3RhdGUxNyIsIl91c2VTdGF0ZTE4IiwiaXNXcml0aW5nIiwic2V0SXNXcml0aW5nIiwiX3VzZVN0YXRlMTkiLCJfdXNlU3RhdGUyMCIsInJlZmV0Y2hDaGF0cyIsInNldFJlZmV0Y2hDaGF0cyIsIl91c2VTdGF0ZTIxIiwic2F2ZWQiLCJhZ2VudHNOYXZBY3RpdmUiLCJjdXJyZW50T3B0aW9uIiwiX3VzZVN0YXRlMjIiLCJzZXRDdXJyZW50T3B0aW9uIiwiX3VzZVN0YXRlMjMiLCJfdXNlU3RhdGUyNCIsImhhc0Vycm9yIiwic2V0SGFzRXJyb3IiLCJfdXNlU3RhdGUyNSIsIl91c2VTdGF0ZTI2IiwiZGlkUmVzZXRDb250ZXh0SW5TZWN0aW9uIiwic2V0RGlkUmVzZXRDb250ZXh0SW5TZWN0aW9uIiwicHJldkhhc1Bpbm5lZENvbnRleHRSZWYiLCJoYW5kbGVycyIsIl91c2VTdGF0ZTI3IiwiX3VzZVN0YXRlMjgiLCJzaWRlYmFySGFzRXJyb3IiLCJzZXRTaWRlYmFySGFzRXJyb3IiLCJsYW5nIiwibGFuZ3VhZ2UiLCJsb2NhbGUiLCJfdXNlR2xvYmFsQ29udGV4dCIsInNlbGVjdEFnZW50IiwiY2xlYXJBZ2VudCIsInNlY3Rpb24iLCJhZ2VudCIsInByb2plY3QiLCJjbGllbnQiLCJ0YXNrIiwiY2hpcHNQcm9qZWN0IiwidG9nZ2xlV2ViU2VhcmNoIiwiaXNXZWJTZWFyY2hBY3RpdmUiLCJzZXRDaGlwc1Byb2plY3QiLCJzZXRDbGllbnQiLCJzZXRQcm9qZWN0IiwiYmFubmVyRW50cnlGYXEiLCJzZXRUYXNrIiwidG9vbHRpcFpJbmRleCIsIl91c2VHZXRBZ2VudHMiLCJoYW5kbGVHb0hvbWUiLCJob21lIiwiYWdlbnRzIiwibG9hZGluZyIsImxvYWRpbmdNb3JlIiwiYWdlbnRFcnJvciIsImVycm9yIiwiaGFuZGxlR2V0QWdlbnRzIiwibG9hZE1vcmVBZ2VudHMiLCJzZWFyY2hDdXN0b21BZ2VudHMiLCJzZWFyY2hMb2FkaW5nIiwiYWRkQWdlbnQiLCJyZW1vdmVBZ2VudCIsInVwZGF0ZUFnZW50IiwidXBkYXRlQWdlbnRGYXZvcml0ZSIsInNlbGVjdEZpcnN0QWdlbnQiLCJzb3J0QWdlbnRzTGlzdCIsImFnZW50c0RhdGFSZWYiLCJkYXRhIiwiX3VzZUdldFNraWxscyIsIm15U2tpbGxzIiwic2hhcmVkU2tpbGxzIiwibG9hZGluZ1NraWxscyIsImhhbmRsZUdldFNraWxscyIsImFkZFNraWxsIiwidXBkYXRlU2tpbGxJbkxpc3QiLCJyZW1vdmVTa2lsbCIsInVzZXJIYXNQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwiQm9vbGVhbiIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMiLCJ1c2VySGFzU2tpbGxzQWNjZXNzIiwiY29tcHV0ZWRDdXJyZW50T3B0aW9uIiwibXVsdGlBZ2VudHNBY2Nlc3MiLCJpc01haWFrZXJBZ2VudFNlbGVjdGVkIiwic2lkZWJhckFnZW50c05hdkFjdGl2ZSIsImFnZW50c0ZldGNoZWRSZWYiLCJzZWxlY3RvciIsInF1ZXJ5U2VsZWN0b3IiLCJjb25jYXQiLCJfdXNlU3RhdGUyOSIsIl91c2VTdGF0ZTMwIiwibGF5b3V0TW9kZSIsInNldExheW91dE1vZGUiLCJoYW5kbGVMYXlvdXRNb2RlQ2hhbmdlIiwibW9kZSIsImV4cGFuZGVkIiwiaXNGbG9hdGluZyIsImNvbnRlbnRXcmFwcGVyUmVmIiwiX3VzZVN0YXRlMzEiLCJfc2F2ZWRTZXNzaW9uT25Nb3VudFIzIiwiX3NhdmVkU2Vzc2lvbk9uTW91bnRSNCIsImRyYWdQb3NpdGlvbiIsIl91c2VTdGF0ZTMyIiwic2V0RHJhZ1Bvc2l0aW9uIiwiX3VzZUZsb2F0aW5nUGFuZWxEcmFnIiwidGlsdE1vdGlvbiIsInN0YXJ0UG9pbnRlclRyYWNraW5nIiwic2FtcGxlUG9pbnRlck1vdmUiLCJlbmRQb2ludGVyVHJhY2tpbmciLCJkcmFnU3RhdGVSZWYiLCJjbGFtcERyYWdQb3NpdGlvbiIsIngiLCJ5IiwiY29udGVudFdyYXBwZXIiLCJfZ2V0Qm91bmRpbmdDbGllbnRSZWMiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ3aWR0aCIsImhlaWdodCIsImlubmVyV2lkdGgiLCJpbm5lckhlaWdodCIsInByZXYiLCJwYW5lbFdpZHRoIiwicGFkIiwiaGFuZGxlRHJhZ0VuZCIsImV2ZW50IiwiX2RyYWdTdGF0ZVJlZiRjdXJyZW50IiwicG9pbnRlcklkIiwiYm9keSIsInN0eWxlIiwidXNlclNlbGVjdCIsImN1cnNvciIsInJlY3QiLCJsZWZ0IiwidG9wIiwiaGFuZGxlRHJhZ01vdmUiLCJkcmFnU3RhdGUiLCJjbGllbnRYIiwiY2xpZW50WSIsIm5leHRQb3NpdGlvbiIsIm9mZnNldFgiLCJvZmZzZXRZIiwicmVzb2x2ZWREcmFnUG9zaXRpb24iLCJ2aWV3cG9ydFdpZHRoIiwiY2xhbXAiLCJoYW5kbGVEcmFnU3RhcnQiLCJidXR0b24iLCJ0YXJnZXQiLCJpbml0aWFsUG9zaXRpb24iLCJwb2ludGVyT2Zmc2V0WCIsInBvaW50ZXJPZmZzZXRZIiwiY3VycmVudFRhcmdldCIsInNldFBvaW50ZXJDYXB0dXJlIiwicHJldmVudERlZmF1bHQiLCJhaUNoYXREcmFnZ2FibGUiLCJzdGFydENoYXQiLCJmYXFJZCIsImFnZW50U3VnZ2VzdGlvbklkIiwibWVudGlvbnMiLCJmdWFJZCIsInNjSWQiLCJjb250ZXh0RGF0YSIsImNoYXQiLCJiYW5uZXJGYXFBdXRvU2VudFJlZiIsImJhbm5lckZhcSIsImZhcVRpdGxlIiwiYWxyZWFkeVNlbnQiLCJhZ2VudElkIiwicHJvamVjdElkIiwiY2xpZW50SWQiLCJ1bmRlZmluZWQiLCJlbnRpdHkiLCJnb1RvQ2hhdCIsInNlc3Npb25JZCIsInNlc3Npb25FeHRlcm5hbElkIiwic2V0QWN0aXZlQ2hhdElkIiwiZGV0YWlsIiwic2VsZWN0ZWRBZ2VudCIsImhhbmRsZVNpZGViYXJPcGVuQ2hhbmdlIiwib3BlbiIsInN5bmNQYW5lbFNlc3Npb24iLCJfYWdlbnQkaWQiLCJwYXRjaCIsImhvc3RDb250ZXh0IiwiZW5zdXJlQWdlbnRzTG9hZGVkIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJjYWNoZWRBZ2VudHMiLCJsb2FkZWRBZ2VudHMiLCJsb2FkZWRGcm9tRmV0Y2giLCJ3cmFwIiwiX2NvbnRleHQiLCJuZXh0IiwiYWJydXB0IiwibGVuZ3RoIiwic2VudCIsInN0b3AiLCJ0aW1lciIsImNsZWFyVGltZW91dCIsIm9uUGFnZUhpZGUiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImhhbmRsZVJlc3RvcmVGcm9tTWluaW1pemVkIiwiX2dldENoYXRzU3RvcmVTdGF0ZSIsImNoYXRzIiwibGFzdEFjdGl2ZUNoYXRJZCIsIl9nb1RvQ2hhdFJlZiRjdXJyZW50IiwiY2FsbCIsIl9nb0hvbWVSZWYkY3VycmVudCIsImFpQ2hhdE9wZW4iLCJvcHRpb24iLCJ0aGVuIiwiYXBwbHlFeHBhbmRlZEhvc3RUYWtlb3ZlciIsImVudGl0eVN0YXRlIiwiZ2V0U3RhdGUiLCJjbGVhckZhcXMiLCJjbGVhckdsb2JhbFBpbm5lZENvbnRleHQiLCJuZXh0TGF5b3V0IiwiZmFxIiwiX2FnZW50JGlkMiIsInJlc29sdmVkQWdlbnRJZCIsImhhbmRsZVNlbmRNZXNzYWdlUmVhZHkiLCJzZW5kTWVzc2FnZSIsInN0b3BHZW5lcmF0aW9uIiwic3RyZWFtaW5nIiwid3JpdGluZyIsImhhbmRsZVNlbmRNZXNzYWdlIiwidHlwZSIsInN0YXJ0TmV3Q2hhdEZyb21DYXRhbG9nIiwiX2NhbGxlZTIiLCJhZ2VudHNMaXN0IiwiZmlyc3RBZ2VudCIsIl90IiwiX2NvbnRleHQyIiwibXlBZ2VudHMiLCJoYW5kbGVTdGFydE5ld0NoYXQiLCJoYW5kbGVSZXNldENoYXQiLCJfY2FsbGVlMyIsIl9jb250ZXh0MyIsImhhbmRsZUJhY2siLCJ0byIsImFpQ2hhdEJhY2siLCJwaW5uZWQiLCJ0YXNrSWQiLCJjaGlwc1Byb2plY3RJZCIsIndhc1Bpbm5lZCIsIm9uTWVyZ2VDcmVhdGVkQWdlbnQiLCJldnQiLCJfcmVmNCIsIm5leHRBZ2VudCIsIm5hdmlnYXRlSG9tZSIsIm9uU3luY0VkaXRlZEFnZW50IiwiX3JlZjUiLCJvcGVuQ2hhdFZpZXciLCJvcGVuSG9tZSIsIm9wZW5Gcm9tSG9zdCIsIl9yZWY2Iiwib3Blbk5ld0NoYXRXaXRoQWdlbnQiLCJfcmVmNyIsImNvbnRleHRQYXRjaCIsInNob3VsZFNldFRhc2siLCJfY29udGV4dFBhdGNoJHRhc2siLCJhcHBseVNraWxsVXNlRmxvdyIsIl9yZWY4IiwiX2NhbGxlZTQiLCJza2lsbCIsInVzZUZpcnN0QWdlbnQiLCJfY29udGV4dDQiLCJfeCIsIl94MiIsImFwcGx5IiwiYXJndW1lbnRzIiwiaGFuZGxlVXNlU2tpbGxBZnRlclNhdmUiLCJfcmVmOSIsIl9yZWY5JHVzZUZpcnN0QWdlbnQiLCJvblNlc3Npb25NZXRhIiwiX3JlZjAiLCJsZWdhY3lDb250ZXh0U2Vzc2lvbiIsImhhbmRsZUNvbnRpbnVlTGVnYWN5Q29udGV4dEluTmV3Q2hhdCIsIl9idWlsZExlZ2FjeUNvbnRleHRNaSIsIm9yY2hlc3RyYXRvciIsImFnZW50RW50aXR5IiwicElkIiwicE5hbWUiLCJwcm9qZWN0TmFtZSIsImNJZCIsImNOYW1lIiwiY2xpZW50TmFtZSIsInRJZCIsInROYW1lIiwidGFza05hbWUiLCJtaWdyYXRpb25QYXRjaCIsIl91c2VNZW1vIiwic2hvd05ld0NoYXQiLCJpc015QWdlbnRzU2VjdGlvbiIsImlzTXlTa2lsbHNTZWN0aW9uIiwiaXNNYWlha2VyQ3JlYXRvckhvbWUiLCJoYXNDaGF0QWNjZXNzIiwibWFpbkNvbnRlbnRWaWV3Iiwic2hvd01vZGFsRm9vdGVyIiwiaG9tZU9wdGlvbiIsImNoYXRPcHRpb24iLCJhZ2VudHNDb3VudCIsImhhc0FjY2VzcyIsInNob3dTaWRlYmFyIiwiaGFzUGlubmVkQ29udGV4dCIsIl9yZXNvbHZlT3JjaGVzdHJhdG9ySCIsImlzQ2hhdFZpZXciLCJpc0hlYWRlckhvbWVTdGVwMiIsImlzU2VjdGlvblJlc2V0SG9tZVN0ZXAyIiwic2hvd0JhY2tCdXR0b24iLCJhZ2VudFR5cGUiLCJoYW5kbGVPcGVuTWFya2V0cGxhY2UiLCJfY2FsbGVlNSIsIl9jb250ZXh0NSIsImhhbmRsZU9wZW5Ta2lsbHMiLCJoYW5kbGVHb1RvTWFpYWtlciIsIl9jYWxsZWU2IiwibWFpYWtlckFnZW50IiwicmVzcG9uc2UiLCJfdDIiLCJfY29udGV4dDYiLCJmaW5kIiwiYSIsInBhdGgiLCJtZXRob2QiLCJqc29uIiwibG9hZEFnZW50c0ZvclNlc3Npb25SZXN0b3JlIiwiX3JlZjExIiwiX2NhbGxlZTciLCJzbmFwc2hvdCIsImFnZW50VG9TZWxlY3QiLCJfdDMiLCJfY29udGV4dDciLCJfeDMiLCJhcHBseVNlc3Npb25SZXN0b3JlIiwiX3JlZjEyIiwiX2NhbGxlZTgiLCJjaGlwc1Byb2plY3RGcm9tU25hcHNob3QiLCJyZXN0b3JlUm91dGUiLCJfc25hcHNob3QkYWN0aXZlQ2hhdEkiLCJfc25hcHNob3QkYWN0aXZlQ2hhdEkyIiwiX2NvbnRleHQ4IiwiX3g0IiwicnVuUmVzdG9yZSIsIl9yZWYxMyIsIl9jYWxsZWU5IiwiX2NvbnRleHQ5IiwiZmluaXNoIiwiaGFuZGxlRGVsZXRlQWdlbnRGcm9tTXlBZ2VudHMiLCJtb2RhbFBhbmVsIiwiY2hpbGRyZW4iLCJvbkdvVG9DaGF0Iiwib25FcnJvciIsImhhbmRsZUdvVG9Ib21lIiwiaGFuZGxlU2V0UmVmZXRjaENoYXRzIiwib25PcGVuTWFpYWtlckNyZWF0b3IiLCJpc0xlZ2FjeUNvbnRleHRTZXNzaW9uIiwiaW5pdGlhbE9wZW4iLCJvbk9wZW5DaGFuZ2UiLCJmbG9hdGluZyIsIm9uTGF5b3V0TW9kZUNoYW5nZSIsImRyYWdnYWJsZSIsIm9uRHJhZ1N0YXJ0Iiwib25EcmFnTW92ZSIsIm9uRHJhZ0VuZCIsImhhc01vcmUiLCJoYXNfbW9yZSIsIm9uQWdlbnRVcGRhdGUiLCJpc01haWFrZXJTZWN0aW9uIiwib25CYWNrIiwiX29iamVjdFNwcmVhZCIsInJlZnMiLCJvblNlbmRNZXNzYWdlUmVhZHkiLCJsb2FkaW5nQWdlbnRzIiwib25EZWxldGVBZ2VudCIsIm9uRmF2b3JpdGVBZ2VudFVwZGF0ZSIsImhhc01vcmVBZ2VudHMiLCJsb2FkaW5nTW9yZUFnZW50cyIsIm9uTG9hZE1vcmVBZ2VudHMiLCJvbkdvVG9NYWlha2VyIiwib25EZWxldGVTa2lsbCIsIm9uU2VhcmNoQWdlbnRzIiwic2VhcmNoTG9hZGluZ0FnZW50cyIsIm9uUmVzdGFydFN1bW1hcnkiLCJoYW5kbGVTdG9wR2VuZXJhdGlvbiIsImNoYXRJZCIsIm9uQ29udGludWVJbk5ld0NoYXQiLCJyZWYiLCJjcmVhdGVQb3J0YWwiLCJlbGV2YXRlZCIsIiRtaW5pbWl6ZWQiLCIkaGlkZGVuIiwidGlsdCIsInNob3dOb3ZlbHR5RG90Iiwib25SZXN0b3JlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9sZWN1bGVzL0NoYXRBSU1vZGFsL0NoYXRBSU1vZGFsLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1uZXN0ZWQtdGVybmFyeSAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2luZGVudCAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3QvanN4LW5vLXVzZWxlc3MtZnJhZ21lbnQgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L25vLWFycmF5LWluZGV4LWtleSAqL1xuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAqL1xuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9mdW5jdGlvbi1jb21wb25lbnQtZGVmaW5pdGlvbiAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3QvcmVxdWlyZS1kZWZhdWx0LXByb3BzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQge1xuICB1c2VDYWxsYmFjayxcbiAgdXNlTWVtbyxcbiAgdXNlU3RhdGUsXG4gIHVzZVJlZixcbiAgdXNlRWZmZWN0LFxuICB1c2VMYXlvdXRFZmZlY3QsXG4gIFBvaW50ZXJFdmVudCBhcyBSZWFjdFBvaW50ZXJFdmVudCxcbn0gZnJvbSAncmVhY3QnXG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJ1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJ3JlYWN0LWkxOG5leHQnXG5pbXBvcnQgeyB1c2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9jb3ItdXNlcidcbmltcG9ydCB7IGNhbkFjY2Vzc1RvU2tpbGxzIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL3Blcm1pc3Npb25zJ1xuaW1wb3J0IHsgTUFJQUVycm9yIH0gZnJvbSAnLi4vLi4vYXRvbXMvTUFJQUVycm9yJ1xuaW1wb3J0IHsgdXNlTWFpYVRhc2tQYW5lbFpJbmRleCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZU1haWFUYXNrUGFuZWxaSW5kZXgnXG5cbmltcG9ydCB7IENoYXRBSUNvbnRlbnQgfSBmcm9tICcuLi9DaGF0QUlDb250ZW50J1xuaW1wb3J0IHsgYnVpbGRIYW5kbGVycywgb3B0aW9ucyB9IGZyb20gJy4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgU2lkZWJhciB9IGZyb20gJy4uL1NpZGViYXInXG5pbXBvcnQgeyB1c2VHZXRBZ2VudHMgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tYWlhL0FnZW50cy9nZXRBZ2VudHMnXG5pbXBvcnQgeyB1c2VHZXRTa2lsbHMgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tYWlhL1NraWxscy9nZXRTa2lsbHMnXG5pbXBvcnQgeyB1c2VHbG9iYWxDb250ZXh0LCB0eXBlIFNlY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2dsb2JhbC1jb250ZXh0J1xuaW1wb3J0IHsgQXR0YWNobWVudEZpbGUgfSBmcm9tICcuLi9DaGF0Rm9vdGVyL0NoYXRGb290ZXInXG5pbXBvcnQgeyBDb250ZXh0TWVudGlvbiB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2NvbnRleHRNZW50aW9uJ1xuaW1wb3J0IHsgQ2hhdEFJTW9kYWxIZWFkZXIgfSBmcm9tICcuL2NvbXBvbmVudHMvQ2hhdEFpTW9kYWxIZWFkZXIvQ2hhdEFpTW9kYWxIZWFkZXInXG5pbXBvcnQgeyBTbmFja2JhciB9IGZyb20gJy4uLy4uL29yZ2FuaXNtcy9TbmFja0Jhci9TbmFja2JhcidcbmltcG9ydCB7IFByb2plY3RTdW1tYXJ5Q29udGVudCB9IGZyb20gJy4uL1Byb2plY3RTdW1tYXJ5Q29udGVudCdcbmltcG9ydCB7IEFibUFnZW50TW9kYWwgfSBmcm9tICcuLi8uLi9vcmdhbmlzbXMvQWJtQWdlbnRNb2RhbC9BYm1BZ2VudE1vZGFsJ1xuaW1wb3J0IHsgQWJtU2tpbGxNb2RhbCwgU0tJTExfVVNFX0FGVEVSX1NBVkVfRVZFTlQgfSBmcm9tICcuLi8uLi9vcmdhbmlzbXMvQWJtU2tpbGxNb2RhbC9BYm1Ta2lsbE1vZGFsJ1xuaW1wb3J0IHsgQWJtU2tpbGxHZW5lcmF0ZU1vZGFsIH0gZnJvbSAnLi4vLi4vb3JnYW5pc21zL0FibVNraWxsR2VuZXJhdGVNb2RhbC9BYm1Ta2lsbEdlbmVyYXRlTW9kYWwnXG5pbXBvcnQgeyBTRUNUSU9OUyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9jb25maWcnXG5pbXBvcnQgeyBTQ0NBSU1Db250ZW50LCBTQ0NBSU1Db250ZW50V3JhcHBlciwgU0NDQUlNTWluaW1pemVkSGlkZSwgU0NDQUlNV3JhcHBlciB9IGZyb20gJy4vQ2hhdEFJTW9kYWwuc3R5bGVzJ1xuaW1wb3J0IHsgTWFpYU1pbmltaXplZFBpbGwgfSBmcm9tICcuL2NvbXBvbmVudHMvTWFpYU1pbmltaXplZFBpbGwnXG5pbXBvcnQgeyB1c2VNaW5pbWl6ZWRQaWxsTm92ZWx0eURvdCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZU1pbmltaXplZFBpbGxOb3ZlbHR5RG90J1xuaW1wb3J0IHtcbiAgZ2V0TWFpYUZsb2F0aW5nUGFuZWxXaWR0aFB4LFxuICBNYWlhQ2hhdE1vZGFsTGF5b3V0TW9kZSxcbiAgcmVzb2x2ZUluaXRpYWxNYWlhQ2hhdExheW91dE1vZGUsXG4gIHNldFN0b3JlZE1haWFDaGF0TGF5b3V0TW9kZSxcbn0gZnJvbSAnLi9sYXlvdXQnXG5pbXBvcnQgeyBGbG9hdGluZ1BhbmVsTW90aW9uLCB1c2VGbG9hdGluZ1BhbmVsRHJhZ1RpbHQgfSBmcm9tICcuL2Zsb2F0aW5nUGFuZWxNb3Rpb24nXG5pbXBvcnQgeyBDaGF0QWlNb2RhbEZvb3RlciB9IGZyb20gJy4vY29tcG9uZW50cy9DaGF0QWlNb2RhbEZvb3RlcidcbmltcG9ydCB7IGlzTWFya2V0cGxhY2VHbG9iYWxDbG9uZUFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvYWdlbnREaXNwbGF5TmFtZSdcbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyBTa2lsbCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL3NraWxsJ1xuaW1wb3J0IHsgUHJvamVjdCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL1Byb2plY3QnXG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9DbGllbnQnXG5pbXBvcnQgeyBUYXNrIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvVGFzaydcbmltcG9ydCB7IHVzZUZhcXNTdG9yZSB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL3VzZUZhcXNTdG9yZSdcbmltcG9ydCB7IGdldENoYXRzU3RvcmVTdGF0ZSwgdXNlQ2hhdHNTdG9yZSB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL3VzZUNoYXRzU3RvcmUnXG5pbXBvcnQgdHlwZSB7IENoYXRMaXN0SXRlbSB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL2NoYXRzU3RvcmUudHlwZXMnXG5pbXBvcnQgeyByZWFkTGFzdEFjdGl2ZUNoYXRJZCwgd3JpdGVMYXN0QWN0aXZlQ2hhdElkIH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUvbWFpYUxhc3RDaGF0UGVyc2lzdGVuY2UnXG5pbXBvcnQge1xuICBjbGVhck1haWFQYW5lbFNlc3Npb24sXG4gIHBhdGNoTWFpYVBhbmVsU2Vzc2lvbixcbiAgcmVhZE1haWFQYW5lbFNlc3Npb24sXG4gIHR5cGUgTWFpYVBhbmVsU2Vzc2lvblNuYXBzaG90LFxuICB3cml0ZU1haWFQYW5lbFNlc3Npb24sXG59IGZyb20gJy4uLy4uLy4uL3N0b3JlL21haWFQYW5lbFNlc3Npb25QZXJzaXN0ZW5jZSdcbmltcG9ydCB7IHVzZVNlc3Npb25zU3RvcmUgfSBmcm9tICcuLi8uLi8uLi9zdG9yZS9zZXNzaW9ucy91c2VTZXNzaW9uc1N0b3JlJ1xuaW1wb3J0IHsgZmV0Y2hNYWlhIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbWFpYS9jbGllbnQnXG5pbXBvcnQgeyBmZXRjaEFnZW50RGV0YWlsIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbWFpYS9BZ2VudHMvZmV0Y2hBZ2VudERldGFpbCdcbmltcG9ydCB7IG1hcENPUkxhbmcgfSBmcm9tICcuLi8uLi8uLi9sYW5nL3V0aWxzJ1xuaW1wb3J0IHsgRVZFTlRTLCB1c2VFdmVudCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUV2ZW50J1xuaW1wb3J0IHsgTUFJQV9PUEVOX0ZST01fSE9TVF9FVkVOVCwgdHlwZSBNYWlhSG9zdE9wZW5EZXRhaWwgfSBmcm9tICcuLi8uLi8uLi91dGlscy9tYWlhSG9zdE9wZW4nXG5pbXBvcnQge1xuICBjbGFtcEZsb2F0aW5nUGFuZWxQb3NpdGlvbixcbiAgaGFzQW55QWN0aXZlU2Vzc2lvbkluTWV0YSxcbiAgaGFzQmFubmVyRmFxVGl0bGUsXG4gIGlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kLFxuICByZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uLFxuICByZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uLFxuICByZXNvbHZlSW5pdGlhbEN1cnJlbnRPcHRpb24sXG4gIHJlc29sdmVMZWdhY3lDb250ZXh0U2Vzc2lvbixcbiAgcmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUsXG4gIHNob3VsZFJlc3RvcmVFeHBhbmRlZFBhbmVsLFxuICBzaG91bGRTa2lwRmxvYXRpbmdEcmFnVGFyZ2V0LFxuICB2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSxcbiAgcmVzb2x2ZUhvc3RUYWtlb3ZlckVudGl0eVN0YXRlLFxuICBidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0LFxuICBidWlsZE1haWFQYW5lbFNlc3Npb25QYXRjaCxcbiAgZGlzcGF0Y2hTa2lsbE1lbnRpb25JbnNlcnQsXG4gIGVuc3VyZUFnZW50c0JlZm9yZVNraWxsVXNlLFxuICByZXNvbHZlRmxvYXRpbmdQYW5lbERyYWdQb3NpdGlvbixcbiAgcmVzb2x2ZUhvc3RUYWtlb3ZlckFnZW50SWQsXG4gIHJlc29sdmVNYWlhTW9kYWxJMThuTGFuZyxcbiAgcmVzb2x2ZU1pbmltaXplZFJlc3RvcmVUYXJnZXQsXG4gIHJlc29sdmVOZXh0RHJhZ1Bvc2l0aW9uLFxuICByZXNvbHZlVXNlckhhc0FnZW50TWFuYWdlbWVudFBlcm1pc3Npb25zLFxuICBzaG91bGRCYWNrQ2xlYXJQaW5uZWRDb250ZXh0LFxuICBzaG91bGRCYWNrU3RhcnROZXdDaGF0UHJlc2VydmluZ0NvbnRleHQsXG4gIHNob3VsZE1hcmtPcmNoZXN0cmF0b3JDb250ZXh0UmVzZXQsXG4gIHNob3VsZFN0YXJ0TmV3Q2hhdEZyb21DYXRhbG9nLFxuICByZXNvbHZlSGFzUGlubmVkQ29udGV4dCxcbiAgcmVzb2x2ZU9yY2hlc3RyYXRvckhvbWVOYXZGbGFncyxcbiAgc2hvdWxkU2hvd09yY2hlc3RyYXRvckJhY2tCdXR0b24sXG4gIHNob3VsZENsZWFyQ2xpZW50T25Hb0hvbWVGcm9tQ2hhdCxcbiAgc2hvdWxkQ2xlYXJUYXNrT25Hb0hvbWVGcm9tQ2hhdCxcbiAgc2hvdWxkUmVzZXRBZ2VudFRvRmlyc3RPbkdvSG9tZSxcbiAgc2hvdWxkQ2xlYXJPcmNoZXN0cmF0b3JHbG9iYWxDb250ZXh0T25Hb0hvbWUsXG4gIHNob3VsZFVzZUFjdGl2ZUNoYXRTZW5kSGFuZGxlcixcbiAgc2hvdWxkUHJlZmV0Y2hBZ2VudHNGb3JDYXRhbG9nTmV3Q2hhdCxcbiAgY2FuT3Blbk1haWFNYXJrZXRwbGFjZSxcbiAgc2hvdWxkTWFya0FnZW50QXNMZWdhY3lDb250ZXh0LFxuICBidWlsZExlZ2FjeUNvbnRleHRBZ2VudCxcbiAgYnVpbGRMZWdhY3lDb250ZXh0TWlncmF0aW9uUGF0Y2gsXG4gIGZpbmRPcmNoZXN0cmF0b3JBZ2VudCxcbiAgc2hvdWxkU2V0Q2hhdFZpZXdIaWRkZW5Pbk1vdW50LFxuICBzaG91bGRQZXJzaXN0TGFzdEFjdGl2ZUNoYXRJZCxcbiAgc2hvdWxkU3luY1BhbmVsU2Vzc2lvbk9uUGFnZUhpZGUsXG4gIHJlc29sdmVDYWNoZWRBZ2VudHNJZkF2YWlsYWJsZSxcbiAgc2hvdWxkQXR0ZW1wdEluaXRpYWxBZ2VudHNGZXRjaCxcbiAgZmluZEFnZW50Rm9yQ2hhdEl0ZW0sXG4gIHNob3VsZEFwcGx5Q2xpZW50T25Ib3N0VGFrZW92ZXIsXG4gIHNob3VsZFNlbGVjdEZpcnN0QWdlbnRPbkhvc3RUYWtlb3ZlcixcbiAgc2hvdWxkUmVzZXRDaGF0U3RhdGVPbkdvSG9tZSxcbiAgc2hvdWxkQ2xlYXJDb250ZXh0Rm9yQ2F0YWxvZ09yU2tpbGxBZ2VudCxcbiAgcmVzb2x2ZU9wZW5OZXdDaGF0V2l0aEFnZW50Q29udGV4dCxcbiAgY2FuQ29udGludWVMZWdhY3lDb250ZXh0SW5OZXdDaGF0LFxuICByZXNvbHZlU2Vzc2lvblJlc3RvcmVOYXZSb3V0ZSxcbiAgc2hvdWxkU2tpcEFnZW50c0xvYWRPblNlc3Npb25SZXN0b3JlLFxuICBzaG91bGRGZXRjaEFnZW50RGV0YWlsT25TZXNzaW9uUmVzdG9yZSxcbiAgc2hvdWxkUGFzc0FnZW50VG9HZXRBZ2VudHNPblJlc3RvcmUsXG4gIHNob3VsZFNlbGVjdEZldGNoZWRBZ2VudEFmdGVyUmVzdG9yZSxcbiAgcmVzb2x2ZVNuYXBzaG90Q2hpcHNQcm9qZWN0LFxuICByZXNvbHZlQ2hhdE1vZGFsU2VjdGlvbkZsYWdzLFxuICBzaG91bGRSZW5kZXJDaGF0U2lkZWJhcixcbiAgcmVzb2x2ZUNoYXRNb2RhbE1haW5Db250ZW50VmlldyxcbiAgc2hvdWxkU2hvd0NoYXRNb2RhbEZvb3RlcixcbiAgc2hvdWxkVXNlRWxldmF0ZWRNYWlhUGFuZWwsXG4gIHNob3VsZFJlc2VsZWN0QWdlbnRBZnRlckRlbGV0ZSxcbiAgc2hvdWxkQ2xlYXJEcmFnUG9zaXRpb25PbkxheW91dENoYW5nZSxcbiAgc2hvdWxkU3RhcnRGbG9hdGluZ1BhbmVsRHJhZyxcbiAgaXNBY3RpdmVGbG9hdGluZ0RyYWdQb2ludGVyLFxuICBzaG91bGRPcGVuU2tpbGxzQ2F0YWxvZyxcbiAgc2hvdWxkVXNlRHJhZ0NsYW1wRmFsbGJhY2ssXG4gIHJlc29sdmVMYXlvdXREcmFnUG9zaXRpb25VcGRhdGUsXG4gIHJlc29sdmVQZXJzaXN0ZWREcmFnUG9zaXRpb25PbkVuZCxcbiAgYnVpbGRVc2VySW5pdGlhbE1lc3NhZ2VGcm9tU3RhcnRDaGF0LFxuICBzaG91bGRSZXNldFNpZGViYXJFcnJvck9uU3RhcnRDaGF0LFxuICB0eXBlIExlZ2FjeVNlc3Npb25NZXRhLFxufSBmcm9tICcuL0NoYXRBSU1vZGFsLmhlbHBlcnMnXG5cbi8qKiBNZXRhZGF0YSBkZSBsYSBzZXNzaW9uIGFiaWVydGEgKGVtaXRpZGEgcG9yIHVzZUNoYXRNZXNzYWdlcyBhbCBjYXJnYXIgdW5hIGNvbnZlcnNhY2nDs24pLiAqL1xudHlwZSBTZXNzaW9uTWV0YSA9IExlZ2FjeVNlc3Npb25NZXRhICYge1xuICBjaGF0SWQ6IHN0cmluZ1xuICBwcm9qZWN0SWQ/OiBudW1iZXJcbiAgY2xpZW50SWQ/OiBudW1iZXJcbiAgdGFza0lkPzogbnVtYmVyXG59XG5cbmV4cG9ydCBjb25zdCBJRF9NT0RBTF9DSEFUX0FHRU5UID0gJ21vZGFscy1wb3J0YWwtbWFpYS1jaGF0LWFnZW50J1xuXG5leHBvcnQgY29uc3QgQ2hhdEFJTW9kYWwgPSAoKSA9PiB7XG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3QgeyBpMThuIH0gPSB1c2VUcmFuc2xhdGlvbihbU0VDVElPTlMuYWJtQWdlbnRdKVxuICBjb25zdCBhbXBsaXR1ZEV2ZW50ID0gdXNlRXZlbnQoKVxuXG4gIGNvbnN0IHNhdmVkU2Vzc2lvbk9uTW91bnRSZWYgPSB1c2VSZWY8TWFpYVBhbmVsU2Vzc2lvblNuYXBzaG90IHwgbnVsbD4ocmVhZE1haWFQYW5lbFNlc3Npb24odXNlci5pZCkpXG4gIGNvbnN0IHNob3VsZFJlc3RvcmVFeHBhbmRlZCA9IHNob3VsZFJlc3RvcmVFeHBhbmRlZFBhbmVsKHNhdmVkU2Vzc2lvbk9uTW91bnRSZWYuY3VycmVudClcbiAgY29uc3QgcGVuZGluZ1Nlc3Npb25SZXN0b3JlUmVmID0gdXNlUmVmPE1haWFQYW5lbFNlc3Npb25TbmFwc2hvdCB8IG51bGw+KFxuICAgIHNob3VsZFJlc3RvcmVFeHBhbmRlZCA/IHNhdmVkU2Vzc2lvbk9uTW91bnRSZWYuY3VycmVudCA6IG51bGxcbiAgKVxuICBjb25zdCBzZXNzaW9uUmVzdG9yZVN0YXJ0ZWRSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IFtpc1Jlc3RvcmluZ1Nlc3Npb24sIHNldElzUmVzdG9yaW5nU2Vzc2lvbl0gPSB1c2VTdGF0ZSgoKSA9PiBwZW5kaW5nU2Vzc2lvblJlc3RvcmVSZWYuY3VycmVudCAhPSBudWxsKVxuICBjb25zdCBzaWRlYmFyT3BlblJlZiA9IHVzZVJlZihzYXZlZFNlc3Npb25Pbk1vdW50UmVmLmN1cnJlbnQ/LnNpZGViYXJPcGVuID8/IGZhbHNlKVxuXG4gIC8vIFRyYXMgbmF2ZWdhciBlbiBlbCBob3N0IChmdWxsIHBhZ2UgcmVsb2FkKSwgcmVzdGF1cmFtb3MgZWwgcGFuZWwgc2kgZXN0YWJhIGFiaWVydG8uXG4gIGNvbnN0IFtpc01pbmltaXplZCwgc2V0SXNNaW5pbWl6ZWRdID0gdXNlU3RhdGUoKCkgPT4gIXNob3VsZFJlc3RvcmVFeHBhbmRlZClcbiAgY29uc3Qgc2V0Q2hhdFZpZXdWaXNpYmxlID0gdXNlQ2hhdHNTdG9yZShzdGF0ZSA9PiBzdGF0ZS5zZXRDaGF0Vmlld1Zpc2libGUpXG4gIGNvbnN0IHVucmVhZENvdW50ID0gdXNlQ2hhdHNTdG9yZShzdGF0ZSA9PiBzdGF0ZS51bnJlYWRDb3VudClcbiAgY29uc3Qgc2hvd01pbmltaXplZE5vdmVsdHlEb3QgPSB1c2VNaW5pbWl6ZWRQaWxsTm92ZWx0eURvdChpc01pbmltaXplZCwgdW5yZWFkQ291bnQpXG4gIGNvbnN0IGFjdGl2ZUNoYXRJZCA9IHVzZUNoYXRzU3RvcmUoc3RhdGUgPT4gc3RhdGUuYWN0aXZlQ2hhdElkKVxuICAvLyBMb3MgXCIuLi5cIiBkZWwgcGlsbCBzYWxlbiBkZWwgbW90b3IsIG5vIGRlIGlzU3RyZWFtaW5nL2lzV3JpdGluZzogZXNvcyByZWZsZWphblxuICAvLyBsYSBzZXNpw7NuIGFjdGl2YSB5IHF1ZWRhbiBzdGFsZSBjdWFuZG8gdW5hIHJlc3B1ZXN0YSB0ZXJtaW5hIGVuIGJhY2tncm91bmQuXG4gIGNvbnN0IGhhc0FjdGl2ZVN0cmVhbSA9IHVzZVNlc3Npb25zU3RvcmUoc3RhdGUgPT4gaGFzQW55QWN0aXZlU2Vzc2lvbkluTWV0YShzdGF0ZS5tZXRhKSlcblxuICAvKiogZ29Ub0NoYXQgLyBoYW5kbGVHb0hvbWUgc2UgZGVmaW5lbiBtw6FzIGFiYWpvOyBsb3MgcmVmcyBldml0YW4gZGVwZW5kZXIgZGVsIG9yZGVuIGRlIGRlY2xhcmFjacOzbi4gKi9cbiAgY29uc3QgZ29Ub0NoYXRSZWYgPSB1c2VSZWY8KChjaGF0OiBDaGF0TGlzdEl0ZW0pID0+IHZvaWQpIHwgbnVsbD4obnVsbClcbiAgY29uc3QgZ29Ib21lUmVmID0gdXNlUmVmPCgoKSA9PiB2b2lkKSB8IG51bGw+KG51bGwpXG5cbiAgLy8gTW9udGEgY2VycmFkYSBzYWx2byByZXN0YXVyYWNpw7NuIGRlIHNlc2nDs246IHNpIGVsIHBhbmVsIG5vIGVzdMOhIHZpc2libGUsIGxhcyByZXNwdWVzdGFzXG4gIC8vIG51ZXZhcyBxdWVkYW4gY29tbyBubyBsZcOtZGFzLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzaG91bGRTZXRDaGF0Vmlld0hpZGRlbk9uTW91bnQocGVuZGluZ1Nlc3Npb25SZXN0b3JlUmVmLmN1cnJlbnQgIT0gbnVsbCkpIHtcbiAgICAgIHNldENoYXRWaWV3VmlzaWJsZShmYWxzZSlcbiAgICB9XG4gIH0sIFtzZXRDaGF0Vmlld1Zpc2libGVdKVxuXG4gIC8vIFBlcnNpc3RpbW9zIGxhIGNvbnZlcnNhY2nDs24gYWJpZXJ0YSBwYXJhIHBvZGVyIHZvbHZlciBhIGVsbGEgZGVzZGUgZWwgcGlsbCBkZXNwdcOpc1xuICAvLyBkZSBuYXZlZ2FyIG8gcmVmcmVzY2FyLiBFbCB0YWtlb3ZlciBkZXNkZSB1biBob3N0IGxhIGxpbXBpYSAodmEgYWwgSG9tZSkuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNob3VsZFBlcnNpc3RMYXN0QWN0aXZlQ2hhdElkKGFjdGl2ZUNoYXRJZCkpIHtcbiAgICAgIHdyaXRlTGFzdEFjdGl2ZUNoYXRJZCh1c2VyLmlkLCBhY3RpdmVDaGF0SWQpXG4gICAgfVxuICB9LCBbYWN0aXZlQ2hhdElkLCB1c2VyLmlkXSlcblxuICBjb25zdCBoYW5kbGVNaW5pbWl6ZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBhbXBsaXR1ZEV2ZW50KEVWRU5UUy5haUNoYXRNaW5pbWl6ZSlcbiAgICBzZXRJc01pbmltaXplZCh0cnVlKVxuICAgIHNldENoYXRWaWV3VmlzaWJsZShmYWxzZSlcbiAgICB3cml0ZU1haWFQYW5lbFNlc3Npb24odXNlci5pZCwgeyBpc0V4cGFuZGVkOiBmYWxzZSB9KVxuICB9LCBbYW1wbGl0dWRFdmVudCwgc2V0Q2hhdFZpZXdWaXNpYmxlLCB1c2VyLmlkXSlcblxuICBjb25zdCBmb2N1c0NoYXRJbnB1dCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnbWFpYS1pbnB1dC1yZWZvY3VzJykpXG4gICAgfSwgMTAwKVxuICB9LCBbXSlcblxuICBjb25zdCBbdXNlckluaXRpYWxNZXNzYWdlLCBzZXRVc2VySW5pdGlhbE1lc3NhZ2VdID0gdXNlU3RhdGU8e1xuICAgIG1lc3NhZ2U6IHN0cmluZ1xuICAgIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50RmlsZVtdXG4gICAgZmFxSWQ/OiBzdHJpbmdcbiAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZ1xuICAgIG1lbnRpb25zPzogQ29udGV4dE1lbnRpb25bXVxuICAgIGZ1YUlkPzogc3RyaW5nXG4gICAgc2NJZD86IHN0cmluZ1xuICAgIGNvbnRleHREYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgfT4oe1xuICAgIG1lc3NhZ2U6ICcnLFxuICAgIGF0dGFjaG1lbnRzOiBbXSxcbiAgfSlcbiAgY29uc3QgW2luaXRpYWxDaGF0SWQsIHNldEluaXRpYWxDaGF0SWRdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW25ld0NoYXRLZXksIHNldE5ld0NoYXRLZXldID0gdXNlU3RhdGUoMClcbiAgY29uc3QgW3Nlc3Npb25NZXRhLCBzZXRTZXNzaW9uTWV0YV0gPSB1c2VTdGF0ZTxTZXNzaW9uTWV0YSB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtzZW5kTWVzc2FnZUZ1bmN0aW9uLCBzZXRTZW5kTWVzc2FnZUZ1bmN0aW9uXSA9IHVzZVN0YXRlPFxuICAgIHwgKChcbiAgICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sXG4gICAgICAgIGZhcUlkPzogc3RyaW5nLFxuICAgICAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZyxcbiAgICAgICAgbWVudGlvbnM/OiBDb250ZXh0TWVudGlvbltdLFxuICAgICAgICBmdWFJZD86IHN0cmluZyxcbiAgICAgICAgc2NJZD86IHN0cmluZ1xuICAgICAgKSA9PiB2b2lkKVxuICAgIHwgbnVsbFxuICA+KG51bGwpXG4gIGNvbnN0IFtzdG9wR2VuZXJhdGlvbkZ1bmN0aW9uLCBzZXRTdG9wR2VuZXJhdGlvbkZ1bmN0aW9uXSA9IHVzZVN0YXRlPCgoKSA9PiB2b2lkKSB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtpc1N0cmVhbWluZywgc2V0SXNTdHJlYW1pbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtpc1dyaXRpbmcsIHNldElzV3JpdGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcblxuICBjb25zdCBbcmVmZXRjaENoYXRzLCBzZXRSZWZldGNoQ2hhdHNdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtjdXJyZW50T3B0aW9uLCBzZXRDdXJyZW50T3B0aW9uXSA9IHVzZVN0YXRlPG9wdGlvbnM+KCgpID0+IHtcbiAgICBjb25zdCBzYXZlZCA9IHNhdmVkU2Vzc2lvbk9uTW91bnRSZWYuY3VycmVudFxuICAgIHJldHVybiByZXNvbHZlSW5pdGlhbEN1cnJlbnRPcHRpb24oc2F2ZWQ/LmFnZW50c05hdkFjdGl2ZSwgc2F2ZWQ/LmN1cnJlbnRPcHRpb24sIHVzZXIpXG4gIH0pXG4gIGNvbnN0IFtoYXNFcnJvciwgc2V0SGFzRXJyb3JdID0gdXNlU3RhdGUoZmFsc2UpXG4gIC8vIEVuIHByb2plY3QvY2xpZW50L3Rhc2s6IGVsIHVzdWFyaW8gcmVpbmljacOzIGVsIGNvbnRleHRvIGRlbCBvcmNoZXN0cmF0b3IgKGxvIGxpbXBpw7MgeSBwYXPDsyBwb3JcbiAgLy8gZWwgc2VsZWN0b3IgZGUgY29udGV4dG9zIHJlY2llbnRlcykuIEhhYmlsaXRhIGVsIGJvdMOzbiBcInZvbHZlclwiIGVuIGVsIGhvbWUgcGFzbyAyIGRlIGVzYXNcbiAgLy8gc2VjY2lvbmVzLiBTZSByZXNldGVhIGFsIGNlcnJhci9yZWFicmlyIGVsIG1vZGFsIChlbCBjb21wb25lbnRlIHNlIGRlc21vbnRhKS5cbiAgY29uc3QgW2RpZFJlc2V0Q29udGV4dEluU2VjdGlvbiwgc2V0RGlkUmVzZXRDb250ZXh0SW5TZWN0aW9uXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBwcmV2SGFzUGlubmVkQ29udGV4dFJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgaGFuZGxlcnMgPSB1c2VNZW1vKCgpID0+IGJ1aWxkSGFuZGxlcnMoc2V0Q3VycmVudE9wdGlvbiwgc2V0SGFzRXJyb3IpLCBbXSlcbiAgY29uc3QgW3NpZGViYXJIYXNFcnJvciwgc2V0U2lkZWJhckhhc0Vycm9yXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBsYW5nID0gcmVzb2x2ZU1haWFNb2RhbEkxOG5MYW5nKGkxOG4ubGFuZ3VhZ2UpXG5cbiAgbW9tZW50LmxvY2FsZShsYW5nKVxuXG4gIGNvbnN0IHtcbiAgICBzZWxlY3RBZ2VudCxcbiAgICBjbGVhckFnZW50LFxuICAgIHNlY3Rpb24sXG4gICAgYWdlbnQsXG4gICAgcHJvamVjdCxcbiAgICBjbGllbnQsXG4gICAgdGFzayxcbiAgICBjaGlwc1Byb2plY3QsXG4gICAgdG9nZ2xlV2ViU2VhcmNoLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIHNldENoaXBzUHJvamVjdCxcbiAgICBzZXRDbGllbnQsXG4gICAgc2V0UHJvamVjdCxcbiAgICBiYW5uZXJFbnRyeUZhcSxcbiAgICBzZXRUYXNrLFxuICB9ID0gdXNlR2xvYmFsQ29udGV4dCgpXG5cbiAgLy8gWi1pbmRleCBwYXJhIHRvb2x0aXBzIGVuIHNlY3Rpb24gJ3Rhc2snIChtb2RhbCBmbG90YW50ZSBlbGV2YWRvKVxuICBjb25zdCB0b29sdGlwWkluZGV4ID0gdXNlTWFpYVRhc2tQYW5lbFpJbmRleCgxNTAwLCAnb3ZlcmxheScpXG5cbiAgY29uc3Qge1xuICAgIGFnZW50cyxcbiAgICBsb2FkaW5nLFxuICAgIGxvYWRpbmdNb3JlLFxuICAgIGVycm9yOiBhZ2VudEVycm9yLFxuICAgIGhhbmRsZUdldEFnZW50cyxcbiAgICBsb2FkTW9yZUFnZW50cyxcbiAgICBzZWFyY2hDdXN0b21BZ2VudHMsXG4gICAgc2VhcmNoTG9hZGluZyxcbiAgICBhZGRBZ2VudCxcbiAgICByZW1vdmVBZ2VudCxcbiAgICB1cGRhdGVBZ2VudCxcbiAgICB1cGRhdGVBZ2VudEZhdm9yaXRlLFxuICAgIHNlbGVjdEZpcnN0QWdlbnQsXG4gICAgc29ydEFnZW50c0xpc3QsXG4gIH0gPSB1c2VHZXRBZ2VudHMoeyBzZWxlY3RBZ2VudCwgc2VjdGlvbiwgYWdlbnQsIGhhbmRsZUdvSG9tZTogaGFuZGxlcnMuaG9tZSB9KVxuXG4gIGNvbnN0IGFnZW50c0RhdGFSZWYgPSB1c2VSZWYoYWdlbnRzLmRhdGEpXG4gIGFnZW50c0RhdGFSZWYuY3VycmVudCA9IGFnZW50cy5kYXRhXG5cbiAgY29uc3Qge1xuICAgIG15U2tpbGxzLFxuICAgIHNoYXJlZFNraWxscyxcbiAgICBsb2FkaW5nOiBsb2FkaW5nU2tpbGxzLFxuICAgIGhhbmRsZUdldFNraWxscyxcbiAgICBhZGRTa2lsbCxcbiAgICB1cGRhdGVTa2lsbEluTGlzdCxcbiAgICByZW1vdmVTa2lsbCxcbiAgfSA9IHVzZUdldFNraWxscygpXG5cbiAgY29uc3QgdXNlckhhc1Blcm1pc3Npb25zID0gcmVzb2x2ZVVzZXJIYXNBZ2VudE1hbmFnZW1lbnRQZXJtaXNzaW9ucyhcbiAgICB1c2VyPy5wZXJtaXNzaW9ucyxcbiAgICBCb29sZWFuKHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTKVxuICApXG5cbiAgY29uc3QgdXNlckhhc1NraWxsc0FjY2VzcyA9IGNhbkFjY2Vzc1RvU2tpbGxzKHVzZXIpXG5cbiAgY29uc3QgY29tcHV0ZWRDdXJyZW50T3B0aW9uID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgcmVzb2x2ZUNvbXB1dGVkQ3VycmVudE9wdGlvbih7XG4gICAgICAgIGN1cnJlbnRPcHRpb24sXG4gICAgICAgIGFnZW50LFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBjbGllbnQsXG4gICAgICAgIHVzZXIsXG4gICAgICAgIG11bHRpQWdlbnRzQWNjZXNzOiBCb29sZWFuKHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTKSxcbiAgICAgIH0pLFxuICAgIFtjdXJyZW50T3B0aW9uLCBwcm9qZWN0LCBjbGllbnQsIGFnZW50LCB1c2VyXVxuICApXG5cbiAgY29uc3QgaXNNYWlha2VyQWdlbnRTZWxlY3RlZCA9IHVzZU1lbW8oKCkgPT4gaXNNYXJrZXRwbGFjZUdsb2JhbENsb25lQWdlbnQoYWdlbnQpLCBbYWdlbnRdKVxuXG4gIGNvbnN0IHNpZGViYXJBZ2VudHNOYXZBY3RpdmUgPSB1c2VNZW1vKFxuICAgICgpID0+IHJlc29sdmVTaWRlYmFyQWdlbnRzTmF2QWN0aXZlKGNvbXB1dGVkQ3VycmVudE9wdGlvbiwgaXNNYWlha2VyQWdlbnRTZWxlY3RlZCksXG4gICAgW2NvbXB1dGVkQ3VycmVudE9wdGlvbiwgaXNNYWlha2VyQWdlbnRTZWxlY3RlZF1cbiAgKVxuXG4gIC8qIFJlYWN0aXZhciBjb24gbGEgZmlsYSDigJxNaXMgYWdlbnRlc+KAnSBlbiBTaWRlYmFyOiBteUFnZW50c0NvdW50IHByb3BcbiAgY29uc3Qgc2lkZWJhck15QWdlbnRzQ291bnQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gYWdlbnRzLmRhdGEuZmlsdGVyKFxuICAgICAgYSA9PiAhKGEudHlwZSA9PT0gJ29yY2hlc3RyYXRvcicgfHwgKGEudHlwZSA9PT0gJ2Nsb25lJyAmJiBhLmVudGl0eSA9PT0gJ2dsb2JhbCcgJiYgLyhtYWlha2VyfG1hcmtldHBsYWNlKS9pLnRlc3QoYS5uYW1lIHx8ICcnKSkpXG4gICAgKVxuICAgICAgLmxlbmd0aFxuICB9LCBbYWdlbnRzLmRhdGFdKVxuICAqL1xuXG4gIGNvbnN0IGFnZW50c0ZldGNoZWRSZWYgPSB1c2VSZWYoZmFsc2UpXG5cbiAgY29uc3Qgc2VsZWN0b3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtJRF9NT0RBTF9DSEFUX0FHRU5UfWApXG5cbiAgLy8gVGFzayBwYW5lbCwgcGxhbm5lciB5IGJhbm5lciBkZSBwcm95ZWN0byBhYnJlbiBlbiBmbG90YW50ZSBwb3IgZGVmYXVsdCAobm8gdGFwYXIgZWwgY29udGV4dG8gZGV0csOhcykuXG4gIC8vIEZ1ZXJhIGRlIGVzb3MgY29udGV4dG9zIHNlIHJlc3BldGEgbGEgcHJlZmVyZW5jaWEgZ3VhcmRhZGEgZW4gbG9jYWxTdG9yYWdlLlxuICBjb25zdCBbbGF5b3V0TW9kZSwgc2V0TGF5b3V0TW9kZV0gPSB1c2VTdGF0ZTxNYWlhQ2hhdE1vZGFsTGF5b3V0TW9kZT4oKCkgPT5cbiAgICByZXNvbHZlSW5pdGlhbE1haWFDaGF0TGF5b3V0TW9kZSh7IHNlY3Rpb24sIGJhbm5lckVudHJ5RmFxIH0pXG4gIClcblxuICBjb25zdCBoYW5kbGVMYXlvdXRNb2RlQ2hhbmdlID0gdXNlQ2FsbGJhY2soKG1vZGU6IE1haWFDaGF0TW9kYWxMYXlvdXRNb2RlKSA9PiB7XG4gICAgc2V0U3RvcmVkTWFpYUNoYXRMYXlvdXRNb2RlKG1vZGUpXG4gICAgc2V0TGF5b3V0TW9kZShtb2RlKVxuICB9LCBbXSlcbiAgY29uc3QgZXhwYW5kZWQgPSBsYXlvdXRNb2RlID09PSAnZnVsbHNjcmVlbidcbiAgY29uc3QgaXNGbG9hdGluZyA9IGxheW91dE1vZGUgPT09ICdmbG9hdGluZydcbiAgY29uc3QgY29udGVudFdyYXBwZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IFtkcmFnUG9zaXRpb24sIHNldERyYWdQb3NpdGlvbl0gPSB1c2VTdGF0ZTx7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsPihcbiAgICAoKSA9PiBzYXZlZFNlc3Npb25Pbk1vdW50UmVmLmN1cnJlbnQ/LmRyYWdQb3NpdGlvbiA/PyBudWxsXG4gIClcbiAgY29uc3QgeyB0aWx0TW90aW9uLCBzdGFydFBvaW50ZXJUcmFja2luZywgc2FtcGxlUG9pbnRlck1vdmUsIGVuZFBvaW50ZXJUcmFja2luZyB9ID1cbiAgICB1c2VGbG9hdGluZ1BhbmVsRHJhZ1RpbHQoaXNGbG9hdGluZylcbiAgY29uc3QgZHJhZ1N0YXRlUmVmID0gdXNlUmVmPHtcbiAgICBwb2ludGVySWQ6IG51bWJlclxuICAgIG9mZnNldFg6IG51bWJlclxuICAgIG9mZnNldFk6IG51bWJlclxuICB9IHwgbnVsbD4obnVsbClcblxuICBjb25zdCBjbGFtcERyYWdQb3NpdGlvbiA9IHVzZUNhbGxiYWNrKCh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnRXcmFwcGVyID0gY29udGVudFdyYXBwZXJSZWYuY3VycmVudFxuICAgIGlmIChzaG91bGRVc2VEcmFnQ2xhbXBGYWxsYmFjayhjb250ZW50V3JhcHBlcikpIHtcbiAgICAgIHJldHVybiB7IHgsIHkgfVxuICAgIH1cblxuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gY29udGVudFdyYXBwZXIhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgcmV0dXJuIGNsYW1wRmxvYXRpbmdQYW5lbFBvc2l0aW9uKHgsIHksIHdpZHRoLCBoZWlnaHQsIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQpXG4gIH0sIFtdKVxuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNob3VsZENsZWFyRHJhZ1Bvc2l0aW9uT25MYXlvdXRDaGFuZ2UobGF5b3V0TW9kZSkpIHtcbiAgICAgIHNldERyYWdQb3NpdGlvbihudWxsKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2V0RHJhZ1Bvc2l0aW9uKHByZXYgPT5cbiAgICAgIHJlc29sdmVMYXlvdXREcmFnUG9zaXRpb25VcGRhdGUobGF5b3V0TW9kZSwgcHJldiwgY2xhbXBEcmFnUG9zaXRpb24sIHtcbiAgICAgICAgaW5uZXJXaWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICAgIHBhbmVsV2lkdGg6IGdldE1haWFGbG9hdGluZ1BhbmVsV2lkdGhQeCgpLFxuICAgICAgICBwYWQ6IDE2LFxuICAgICAgfSkhXG4gICAgKVxuICB9LCBbbGF5b3V0TW9kZSwgY2xhbXBEcmFnUG9zaXRpb25dKVxuXG4gIGNvbnN0IGhhbmRsZURyYWdFbmQgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IFJlYWN0UG9pbnRlckV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgICAgZW5kUG9pbnRlclRyYWNraW5nKClcbiAgICAgIGlmICghaXNBY3RpdmVGbG9hdGluZ0RyYWdQb2ludGVyKGRyYWdTdGF0ZVJlZi5jdXJyZW50Py5wb2ludGVySWQsIGV2ZW50LnBvaW50ZXJJZCkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGRyYWdTdGF0ZVJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0ID0gJydcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJydcblxuICAgICAgY29uc3QgY29udGVudFdyYXBwZXIgPSBjb250ZW50V3JhcHBlclJlZi5jdXJyZW50XG4gICAgICBpZiAoY29udGVudFdyYXBwZXIgJiYgcmVzb2x2ZVBlcnNpc3RlZERyYWdQb3NpdGlvbk9uRW5kKGxheW91dE1vZGUsIGNvbnRlbnRXcmFwcGVyKSkge1xuICAgICAgICBjb25zdCByZWN0ID0gY29udGVudFdyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgcGF0Y2hNYWlhUGFuZWxTZXNzaW9uKHVzZXIuaWQsIHsgZHJhZ1Bvc2l0aW9uOiB7IHg6IHJlY3QubGVmdCwgeTogcmVjdC50b3AgfSB9KVxuICAgICAgfVxuICAgIH0sXG4gICAgW2VuZFBvaW50ZXJUcmFja2luZywgbGF5b3V0TW9kZSwgdXNlci5pZF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZURyYWdNb3ZlID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBSZWFjdFBvaW50ZXJFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICAgIGNvbnN0IGRyYWdTdGF0ZSA9IGRyYWdTdGF0ZVJlZi5jdXJyZW50XG4gICAgICBpZiAoIWRyYWdTdGF0ZSB8fCAhaXNBY3RpdmVGbG9hdGluZ0RyYWdQb2ludGVyKGRyYWdTdGF0ZS5wb2ludGVySWQsIGV2ZW50LnBvaW50ZXJJZCkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHNhbXBsZVBvaW50ZXJNb3ZlKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpXG5cbiAgICAgIGNvbnN0IG5leHRQb3NpdGlvbiA9IGNsYW1wRHJhZ1Bvc2l0aW9uKGV2ZW50LmNsaWVudFggLSBkcmFnU3RhdGUub2Zmc2V0WCwgZXZlbnQuY2xpZW50WSAtIGRyYWdTdGF0ZS5vZmZzZXRZKVxuXG4gICAgICBzZXREcmFnUG9zaXRpb24ocHJldiA9PiByZXNvbHZlTmV4dERyYWdQb3NpdGlvbihwcmV2LCBuZXh0UG9zaXRpb24pKVxuICAgIH0sXG4gICAgW2NsYW1wRHJhZ1Bvc2l0aW9uLCBzYW1wbGVQb2ludGVyTW92ZV1cbiAgKVxuXG4gIGNvbnN0IHJlc29sdmVkRHJhZ1Bvc2l0aW9uID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgcmVzb2x2ZUZsb2F0aW5nUGFuZWxEcmFnUG9zaXRpb24oe1xuICAgICAgICBsYXlvdXRNb2RlLFxuICAgICAgICBkcmFnUG9zaXRpb24sXG4gICAgICAgIHZpZXdwb3J0V2lkdGg6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LmlubmVyV2lkdGggOiAwLFxuICAgICAgICBwYW5lbFdpZHRoOiBnZXRNYWlhRmxvYXRpbmdQYW5lbFdpZHRoUHgoKSxcbiAgICAgICAgY2xhbXA6IGNsYW1wRHJhZ1Bvc2l0aW9uLFxuICAgICAgfSksXG4gICAgW2xheW91dE1vZGUsIGRyYWdQb3NpdGlvbiwgY2xhbXBEcmFnUG9zaXRpb25dXG4gIClcblxuICBjb25zdCBoYW5kbGVEcmFnU3RhcnQgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IFJlYWN0UG9pbnRlckV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgICAgaWYgKCFzaG91bGRTdGFydEZsb2F0aW5nUGFuZWxEcmFnKGlzRmxvYXRpbmcsIGV2ZW50LmJ1dHRvbikpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudFxuICAgICAgaWYgKHNob3VsZFNraXBGbG9hdGluZ0RyYWdUYXJnZXQodGFyZ2V0KSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgY29udGVudFdyYXBwZXIgPSBjb250ZW50V3JhcHBlclJlZi5jdXJyZW50XG4gICAgICBpZiAoIWNvbnRlbnRXcmFwcGVyKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWN0ID0gY29udGVudFdyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgIGNvbnN0IGluaXRpYWxQb3NpdGlvbiA9IHJlc29sdmVkRHJhZ1Bvc2l0aW9uID8/IGNsYW1wRHJhZ1Bvc2l0aW9uKHJlY3QubGVmdCwgcmVjdC50b3ApXG4gICAgICBjb25zdCBwb2ludGVyT2Zmc2V0WCA9IGV2ZW50LmNsaWVudFggLSBpbml0aWFsUG9zaXRpb24ueFxuICAgICAgY29uc3QgcG9pbnRlck9mZnNldFkgPSBldmVudC5jbGllbnRZIC0gaW5pdGlhbFBvc2l0aW9uLnlcblxuICAgICAgc2V0RHJhZ1Bvc2l0aW9uKGluaXRpYWxQb3NpdGlvbilcbiAgICAgIGRyYWdTdGF0ZVJlZi5jdXJyZW50ID0ge1xuICAgICAgICBwb2ludGVySWQ6IGV2ZW50LnBvaW50ZXJJZCxcbiAgICAgICAgb2Zmc2V0WDogcG9pbnRlck9mZnNldFgsXG4gICAgICAgIG9mZnNldFk6IHBvaW50ZXJPZmZzZXRZLFxuICAgICAgfVxuXG4gICAgICBldmVudC5jdXJyZW50VGFyZ2V0LnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZClcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0ID0gJ25vbmUnXG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9ICdncmFiYmluZydcbiAgICAgIGFtcGxpdHVkRXZlbnQoRVZFTlRTLmFpQ2hhdERyYWdnYWJsZSlcbiAgICAgIHN0YXJ0UG9pbnRlclRyYWNraW5nKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpXG4gICAgfSxcbiAgICBbY2xhbXBEcmFnUG9zaXRpb24sIGlzRmxvYXRpbmcsIHJlc29sdmVkRHJhZ1Bvc2l0aW9uLCBzdGFydFBvaW50ZXJUcmFja2luZ11cbiAgKVxuXG4gIGNvbnN0IHN0YXJ0Q2hhdCA9IHVzZUNhbGxiYWNrKFxuICAgIChcbiAgICAgIG1lc3NhZ2U/OiBzdHJpbmcsXG4gICAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sXG4gICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nLFxuICAgICAgbWVudGlvbnM/OiBDb250ZXh0TWVudGlvbltdLFxuICAgICAgZnVhSWQ/OiBzdHJpbmcsXG4gICAgICBzY0lkPzogc3RyaW5nLFxuICAgICAgY29udGV4dERhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgaWYgKHNob3VsZFJlc2V0U2lkZWJhckVycm9yT25TdGFydENoYXQoc2lkZWJhckhhc0Vycm9yKSkge1xuICAgICAgICBzZXRTaWRlYmFySGFzRXJyb3IoZmFsc2UpXG4gICAgICB9XG4gICAgICBzZXRJbml0aWFsQ2hhdElkKG51bGwpXG4gICAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2UoXG4gICAgICAgIGJ1aWxkVXNlckluaXRpYWxNZXNzYWdlRnJvbVN0YXJ0Q2hhdCh7XG4gICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICBhdHRhY2htZW50cyxcbiAgICAgICAgICBmYXFJZCxcbiAgICAgICAgICBhZ2VudFN1Z2dlc3Rpb25JZCxcbiAgICAgICAgICBtZW50aW9ucyxcbiAgICAgICAgICBmdWFJZCxcbiAgICAgICAgICBzY0lkLFxuICAgICAgICAgIGNvbnRleHREYXRhLFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgaGFuZGxlcnMuY2hhdCgpXG4gICAgfSxcbiAgICBbaGFuZGxlcnMsIHNpZGViYXJIYXNFcnJvcl1cbiAgKVxuXG4gIGNvbnN0IGJhbm5lckZhcUF1dG9TZW50UmVmID0gdXNlUmVmKGZhbHNlKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgYmFubmVyRmFxID0gYmFubmVyRW50cnlGYXFcbiAgICBpZiAoIWJhbm5lckZhcSB8fCAhaGFzQmFubmVyRmFxVGl0bGUoYmFubmVyRmFxLmZhcVRpdGxlKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgIWlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kKHtcbiAgICAgICAgZmFxVGl0bGU6IGJhbm5lckZhcS5mYXFUaXRsZSxcbiAgICAgICAgYWxyZWFkeVNlbnQ6IGJhbm5lckZhcUF1dG9TZW50UmVmLmN1cnJlbnQsXG4gICAgICAgIGxvYWRpbmcsXG4gICAgICAgIGFnZW50SWQ6IGFnZW50Py5pZCxcbiAgICAgICAgc2VjdGlvbixcbiAgICAgICAgcHJvamVjdElkOiBwcm9qZWN0Py5pZCxcbiAgICAgICAgY2xpZW50SWQ6IGNsaWVudD8uaWQsXG4gICAgICB9KVxuICAgICkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYmFubmVyRmFxQXV0b1NlbnRSZWYuY3VycmVudCA9IHRydWVcbiAgICBzdGFydENoYXQoXG4gICAgICBiYW5uZXJGYXEuZmFxVGl0bGUsXG4gICAgICBbXSxcbiAgICAgIGJhbm5lckZhcS5mYXFJZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGJhbm5lckZhcS5jb250ZXh0RGF0YVxuICAgIClcbiAgfSwgW1xuICAgIGJhbm5lckVudHJ5RmFxPy5mYXFJZCxcbiAgICBiYW5uZXJFbnRyeUZhcT8uZmFxVGl0bGUsXG4gICAgYmFubmVyRW50cnlGYXE/LmNvbnRleHREYXRhLFxuICAgIGxvYWRpbmcsXG4gICAgYWdlbnQ/LmlkLFxuICAgIGFnZW50Py5lbnRpdHksXG4gICAgcHJvamVjdD8uaWQsXG4gICAgY2xpZW50Py5pZCxcbiAgICBzZWN0aW9uLFxuICAgIHN0YXJ0Q2hhdCxcbiAgXSlcblxuICBjb25zdCBnb1RvQ2hhdCA9IHVzZUNhbGxiYWNrKFxuICAgIChjaGF0OiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb25JZCA9IGNoYXQuc2Vzc2lvbkV4dGVybmFsSWQgYXMgc3RyaW5nXG5cbiAgICAgIGdldENoYXRzU3RvcmVTdGF0ZSgpLnNldEFjdGl2ZUNoYXRJZChzZXNzaW9uSWQpXG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnc2lkZWJhci1zZWxlY3Qtc2Vzc2lvbicsIHsgZGV0YWlsOiB7IHNlc3Npb25JZCB9IH0pKVxuXG4gICAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2UoeyBtZXNzYWdlOiAnJywgYXR0YWNobWVudHM6IFtdIH0pXG4gICAgICBzZXRJbml0aWFsQ2hhdElkKHNlc3Npb25JZClcbiAgICAgIGNvbnN0IHNlbGVjdGVkQWdlbnQgPSBmaW5kQWdlbnRGb3JDaGF0SXRlbShhZ2VudHMuZGF0YSwgY2hhdC5hZ2VudElkKVxuICAgICAgaWYgKHNlbGVjdGVkQWdlbnQpIHtcbiAgICAgICAgc2VsZWN0QWdlbnQoc2VsZWN0ZWRBZ2VudClcbiAgICAgIH1cbiAgICAgIC8vIERpc3BhdGNoIGV2ZW50IHRvIGNsZWFyIHRoZSBpbnB1dCB0ZXh0YXJlYVxuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2NoYXQtc2Vzc2lvbi1jaGFuZ2VkJykpXG4gICAgICBoYW5kbGVycy5jaGF0KClcbiAgICB9LFxuICAgIFtoYW5kbGVycywgYWdlbnRzLCBzZWxlY3RBZ2VudF1cbiAgKVxuXG4gIGdvVG9DaGF0UmVmLmN1cnJlbnQgPSBnb1RvQ2hhdFxuXG4gIGNvbnN0IGhhbmRsZVNpZGViYXJPcGVuQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wZW46IGJvb2xlYW4pID0+IHtcbiAgICAgIHNpZGViYXJPcGVuUmVmLmN1cnJlbnQgPSBvcGVuXG4gICAgICBwYXRjaE1haWFQYW5lbFNlc3Npb24odXNlci5pZCwgeyBzaWRlYmFyT3Blbjogb3BlbiB9KVxuICAgIH0sXG4gICAgW3VzZXIuaWRdXG4gIClcblxuICBjb25zdCBzeW5jUGFuZWxTZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IHBhdGNoID0gYnVpbGRNYWlhUGFuZWxTZXNzaW9uUGF0Y2goe1xuICAgICAgaXNNaW5pbWl6ZWQsXG4gICAgICBjdXJyZW50T3B0aW9uLFxuICAgICAgYWdlbnRzTmF2QWN0aXZlOiBzaWRlYmFyQWdlbnRzTmF2QWN0aXZlLFxuICAgICAgYWN0aXZlQ2hhdElkLFxuICAgICAgYWdlbnRJZDogYWdlbnQ/LmlkID8/IG51bGwsXG4gICAgICBzaWRlYmFyT3Blbjogc2lkZWJhck9wZW5SZWYuY3VycmVudCxcbiAgICAgIGxheW91dE1vZGUsXG4gICAgICBkcmFnUG9zaXRpb24sXG4gICAgICBob3N0Q29udGV4dDoge1xuICAgICAgICBzZWN0aW9uLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBjbGllbnQsXG4gICAgICAgIHRhc2ssXG4gICAgICAgIGNoaXBzUHJvamVjdCxcbiAgICAgIH0sXG4gICAgfSlcbiAgICBpZiAoIXBhdGNoKSByZXR1cm5cbiAgICBwYXRjaE1haWFQYW5lbFNlc3Npb24odXNlci5pZCwgcGF0Y2gpXG4gIH0sIFtcbiAgICBhY3RpdmVDaGF0SWQsXG4gICAgYWdlbnQ/LmlkLFxuICAgIGNoaXBzUHJvamVjdCxcbiAgICBjbGllbnQsXG4gICAgY3VycmVudE9wdGlvbixcbiAgICBkcmFnUG9zaXRpb24sXG4gICAgaXNNaW5pbWl6ZWQsXG4gICAgbGF5b3V0TW9kZSxcbiAgICBwcm9qZWN0LFxuICAgIHNlY3Rpb24sXG4gICAgc2lkZWJhckFnZW50c05hdkFjdGl2ZSxcbiAgICB0YXNrLFxuICAgIHVzZXIuaWQsXG4gIF0pXG5cbiAgLyoqIExvcyBhZ2VudGVzIHNlIHBpZGVuIHJlY2nDqW4gYWwgYWJyaXIgZWwgcGFuZWw6IGVuIG1vZG8gcGlsbCBubyBoYWNlIGZhbHRhIG5pbmd1bmEgcmVxdWVzdC4gKi9cbiAgY29uc3QgZW5zdXJlQWdlbnRzTG9hZGVkID0gdXNlQ2FsbGJhY2soYXN5bmMgKCk6IFByb21pc2U8QWdlbnRbXT4gPT4ge1xuICAgIGNvbnN0IGNhY2hlZEFnZW50cyA9IHJlc29sdmVDYWNoZWRBZ2VudHNJZkF2YWlsYWJsZShhZ2VudHNEYXRhUmVmLmN1cnJlbnQpXG4gICAgaWYgKGNhY2hlZEFnZW50cykge1xuICAgICAgcmV0dXJuIGNhY2hlZEFnZW50c1xuICAgIH1cblxuICAgIGlmIChzaG91bGRBdHRlbXB0SW5pdGlhbEFnZW50c0ZldGNoKGFnZW50c0RhdGFSZWYuY3VycmVudC5sZW5ndGgsIGFnZW50c0ZldGNoZWRSZWYuY3VycmVudCkpIHtcbiAgICAgIGFnZW50c0ZldGNoZWRSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIGNvbnN0IGxvYWRlZEFnZW50cyA9IGF3YWl0IGhhbmRsZUdldEFnZW50cygpXG4gICAgICBjb25zdCBsb2FkZWRGcm9tRmV0Y2ggPSByZXNvbHZlQ2FjaGVkQWdlbnRzSWZBdmFpbGFibGUobG9hZGVkQWdlbnRzKVxuICAgICAgaWYgKGxvYWRlZEZyb21GZXRjaCkge1xuICAgICAgICByZXR1cm4gbG9hZGVkRnJvbUZldGNoXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFnZW50c0RhdGFSZWYuY3VycmVudFxuICB9LCBbaGFuZGxlR2V0QWdlbnRzXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpc01pbmltaXplZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNvbnN0IHRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gc3luY1BhbmVsU2Vzc2lvbigpLCAxNTApXG4gICAgcmV0dXJuICgpID0+IHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXIpXG4gIH0sIFtpc01pbmltaXplZCwgc3luY1BhbmVsU2Vzc2lvbl0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvblBhZ2VIaWRlID0gKCkgPT4ge1xuICAgICAgaWYgKHNob3VsZFN5bmNQYW5lbFNlc3Npb25PblBhZ2VIaWRlKGlzTWluaW1pemVkKSkge1xuICAgICAgICBzeW5jUGFuZWxTZXNzaW9uKClcbiAgICAgIH1cbiAgICB9XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VoaWRlJywgb25QYWdlSGlkZSlcbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BhZ2VoaWRlJywgb25QYWdlSGlkZSlcbiAgfSwgW2lzTWluaW1pemVkLCBzeW5jUGFuZWxTZXNzaW9uXSlcblxuICBjb25zdCBoYW5kbGVSZXN0b3JlRnJvbU1pbmltaXplZCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAvLyBQcmlvcmlkYWQgYWwgcmVhYnJpcjogcHJpbWVyIGNoYXQgc2luIGxlZXIg4oaSIMO6bHRpbWEgY29udmVyc2FjacOzbiBhYmllcnRhIOKGkiBIb21lLlxuICAgIGNvbnN0IHsgY2hhdHMgfSA9IGdldENoYXRzU3RvcmVTdGF0ZSgpXG4gICAgY29uc3QgbGFzdEFjdGl2ZUNoYXRJZCA9IHJlYWRMYXN0QWN0aXZlQ2hhdElkKHVzZXIuaWQpXG4gICAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZU1pbmltaXplZFJlc3RvcmVUYXJnZXQoY2hhdHMsIGxhc3RBY3RpdmVDaGF0SWQpXG5cbiAgICAvLyBOYXZlZ2FyIGFudGVzIGRlIGV4cGFuZGlyOiBzaSBlc3BlcmFtb3MgYWdlbnRlcywgZWwgcGFuZWwgbW9udGEgY29uIGxhIHNlc2nDs24gdmllamEgeSBlbCBzaWRlYmFyIHF1ZWRhIGRlc2Zhc2Fkby5cbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICBnb1RvQ2hhdFJlZi5jdXJyZW50Py4odGFyZ2V0KVxuICAgIH0gZWxzZSB7XG4gICAgICBnb0hvbWVSZWYuY3VycmVudD8uKClcbiAgICB9XG5cbiAgICBzZXRJc01pbmltaXplZChmYWxzZSlcbiAgICBzZXRDaGF0Vmlld1Zpc2libGUodHJ1ZSlcbiAgICBhbXBsaXR1ZEV2ZW50KEVWRU5UUy5haUNoYXRPcGVuLCB7IG9wdGlvbjogJ21pbmltaXplJyB9KVxuXG4gICAgZW5zdXJlQWdlbnRzTG9hZGVkKClcbiAgICAgIC50aGVuKGxvYWRlZEFnZW50cyA9PiB7XG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZEFnZW50ID0gZmluZEFnZW50Rm9yQ2hhdEl0ZW0obG9hZGVkQWdlbnRzLCB0YXJnZXQuYWdlbnRJZClcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRBZ2VudCkge1xuICAgICAgICAgICAgc2VsZWN0QWdlbnQoc2VsZWN0ZWRBZ2VudClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9jdXNDaGF0SW5wdXQoKVxuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpXG4gIH0sIFthbXBsaXR1ZEV2ZW50LCBlbnN1cmVBZ2VudHNMb2FkZWQsIGZvY3VzQ2hhdElucHV0LCBzZWxlY3RBZ2VudCwgc2V0Q2hhdFZpZXdWaXNpYmxlLCB1c2VyLmlkXSlcblxuICAvKipcbiAgICogVG9tYSBjb250cm9sIGRlc2RlIHVuIGhvc3QgKGhlYWRlciwgcHJveWVjdG8sIGNsaWVudGXigKYpOiBhYnJlIGVsIHBhbmVsLCBkZXNjYXJ0YSBsYVxuICAgKiBjb252ZXJzYWNpw7NuIGFiaWVydGEgeSBhcGxpY2EgZWwgY29udGV4dG8gZGVsIGhvc3QuIE5PIHZ1ZWx2ZSBhIGxhIMO6bHRpbWEgY29udmVyc2FjacOzblxuICAgKiDigJQgZXNvIHPDs2xvIGxvIGhhY2UgZWwgcGlsbCAoYGhhbmRsZVJlc3RvcmVGcm9tTWluaW1pemVkYCkuXG4gICAqL1xuICBjb25zdCBhcHBseUV4cGFuZGVkSG9zdFRha2VvdmVyID0gdXNlQ2FsbGJhY2soXG4gICAgKGRldGFpbDogTWFpYUhvc3RPcGVuRGV0YWlsKSA9PiB7XG4gICAgICBjb25zdCBlbnRpdHlTdGF0ZSA9IHJlc29sdmVIb3N0VGFrZW92ZXJFbnRpdHlTdGF0ZShkZXRhaWwpXG5cbiAgICAgIGNsZWFyTWFpYVBhbmVsU2Vzc2lvbih1c2VyLmlkKVxuICAgICAgcGVuZGluZ1Nlc3Npb25SZXN0b3JlUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBzZXRJc1Jlc3RvcmluZ1Nlc3Npb24oZmFsc2UpXG4gICAgICBzZXRJc01pbmltaXplZChmYWxzZSlcbiAgICAgIHNldENoYXRWaWV3VmlzaWJsZSh0cnVlKVxuICAgICAgd3JpdGVMYXN0QWN0aXZlQ2hhdElkKHVzZXIuaWQsIG51bGwpXG5cbiAgICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICAgIHNldE5ld0NoYXRLZXkocHJldiA9PiBwcmV2ICsgMSlcbiAgICAgIHNldFVzZXJJbml0aWFsTWVzc2FnZSh7IG1lc3NhZ2U6ICcnLCBhdHRhY2htZW50czogW10gfSlcbiAgICAgIHNldEN1cnJlbnRPcHRpb24ob3B0aW9ucy5ob21lKVxuICAgICAgc2V0RGlkUmVzZXRDb250ZXh0SW5TZWN0aW9uKGZhbHNlKVxuICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgICBzZXRJc1dyaXRpbmcoZmFsc2UpXG4gICAgICB1c2VGYXFzU3RvcmUuZ2V0U3RhdGUoKS5jbGVhckZhcXMoKVxuICAgICAgYmFubmVyRmFxQXV0b1NlbnRSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICBnZXRDaGF0c1N0b3JlU3RhdGUoKS5zZXRBY3RpdmVDaGF0SWQobnVsbClcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuXG4gICAgICBzZXRQcm9qZWN0Py4oZW50aXR5U3RhdGUucHJvamVjdClcbiAgICAgIGlmIChzaG91bGRBcHBseUNsaWVudE9uSG9zdFRha2VvdmVyKGVudGl0eVN0YXRlLmNsaWVudCkpIHtcbiAgICAgICAgc2V0Q2xpZW50Py4oZW50aXR5U3RhdGUuY2xpZW50KVxuICAgICAgfVxuICAgICAgc2V0VGFzaz8uKGVudGl0eVN0YXRlLnRhc2spXG5cbiAgICAgIGlmIChlbnRpdHlTdGF0ZS5jbGVhckdsb2JhbFBpbm5lZENvbnRleHQpIHtcbiAgICAgICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgICAgIGNsZWFyQWdlbnQoKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXh0TGF5b3V0ID0gcmVzb2x2ZUluaXRpYWxNYWlhQ2hhdExheW91dE1vZGUoe1xuICAgICAgICBzZWN0aW9uOiBkZXRhaWwuc2VjdGlvbiBhcyBTZWN0aW9uLFxuICAgICAgICBiYW5uZXJFbnRyeUZhcTogZGV0YWlsLmZhcSxcbiAgICAgIH0pXG4gICAgICBzZXRMYXlvdXRNb2RlKG5leHRMYXlvdXQpXG4gICAgICBzZXREcmFnUG9zaXRpb24obnVsbClcblxuICAgICAgY29uc3QgaG9zdENvbnRleHQgPSBidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0KGRldGFpbClcblxuICAgICAgZW5zdXJlQWdlbnRzTG9hZGVkKClcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkQWdlbnRJZCA9IHJlc29sdmVIb3N0VGFrZW92ZXJBZ2VudElkKFxuICAgICAgICAgICAgZW50aXR5U3RhdGUuY2xlYXJHbG9iYWxQaW5uZWRDb250ZXh0LFxuICAgICAgICAgICAgYWdlbnRzRGF0YVJlZi5jdXJyZW50LFxuICAgICAgICAgICAgYWdlbnQ/LmlkID8/IG51bGxcbiAgICAgICAgICApXG4gICAgICAgICAgaWYgKHNob3VsZFNlbGVjdEZpcnN0QWdlbnRPbkhvc3RUYWtlb3ZlcihlbnRpdHlTdGF0ZS5jbGVhckdsb2JhbFBpbm5lZENvbnRleHQsIGFnZW50c0RhdGFSZWYuY3VycmVudFswXSkpIHtcbiAgICAgICAgICAgIHNlbGVjdEFnZW50KGFnZW50c0RhdGFSZWYuY3VycmVudFswXSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXRjaE1haWFQYW5lbFNlc3Npb24odXNlci5pZCwge1xuICAgICAgICAgICAgaXNFeHBhbmRlZDogdHJ1ZSxcbiAgICAgICAgICAgIGN1cnJlbnRPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgICAgIGFnZW50c05hdkFjdGl2ZTogbnVsbCxcbiAgICAgICAgICAgIGFjdGl2ZUNoYXRJZDogbnVsbCxcbiAgICAgICAgICAgIGFnZW50SWQ6IHJlc29sdmVkQWdlbnRJZCxcbiAgICAgICAgICAgIHNpZGViYXJPcGVuOiBzaWRlYmFyT3BlblJlZi5jdXJyZW50LFxuICAgICAgICAgICAgZHJhZ1Bvc2l0aW9uOiBudWxsLFxuICAgICAgICAgICAgaG9zdENvbnRleHQsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGZvY3VzQ2hhdElucHV0KClcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZClcbiAgICB9LFxuICAgIFtcbiAgICAgIGFnZW50Py5pZCxcbiAgICAgIGNsZWFyQWdlbnQsXG4gICAgICBlbnN1cmVBZ2VudHNMb2FkZWQsXG4gICAgICBmb2N1c0NoYXRJbnB1dCxcbiAgICAgIHNlbGVjdEFnZW50LFxuICAgICAgc2V0Q2hhdFZpZXdWaXNpYmxlLFxuICAgICAgc2V0Q2hpcHNQcm9qZWN0LFxuICAgICAgc2V0Q2xpZW50LFxuICAgICAgc2V0UHJvamVjdCxcbiAgICAgIHNldFRhc2ssXG4gICAgICB1c2VyLmlkLFxuICAgIF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVNlbmRNZXNzYWdlUmVhZHkgPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBzZW5kTWVzc2FnZTogKFxuICAgICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICAgIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSxcbiAgICAgICAgZmFxSWQ/OiBzdHJpbmcsXG4gICAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nLFxuICAgICAgICBtZW50aW9ucz86IENvbnRleHRNZW50aW9uW10sXG4gICAgICAgIGZ1YUlkPzogc3RyaW5nLFxuICAgICAgICBzY0lkPzogc3RyaW5nXG4gICAgICApID0+IHZvaWQsXG4gICAgICBzdG9wR2VuZXJhdGlvbjogKCkgPT4gdm9pZCxcbiAgICAgIHN0cmVhbWluZzogYm9vbGVhbixcbiAgICAgIHdyaXRpbmc6IGJvb2xlYW5cbiAgICApID0+IHtcbiAgICAgIHNldFNlbmRNZXNzYWdlRnVuY3Rpb24oKCkgPT4gc2VuZE1lc3NhZ2UpXG4gICAgICBzZXRTdG9wR2VuZXJhdGlvbkZ1bmN0aW9uKCgpID0+IHN0b3BHZW5lcmF0aW9uKVxuICAgICAgc2V0SXNTdHJlYW1pbmcoc3RyZWFtaW5nKVxuICAgICAgc2V0SXNXcml0aW5nKHdyaXRpbmcpXG4gICAgfSxcbiAgICBbXVxuICApXG5cbiAgY29uc3QgaGFuZGxlU2VuZE1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sXG4gICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nLFxuICAgICAgbWVudGlvbnM/OiBDb250ZXh0TWVudGlvbltdLFxuICAgICAgZnVhSWQ/OiBzdHJpbmcsXG4gICAgICBzY0lkPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoc2lkZWJhckhhc0Vycm9yKSB7XG4gICAgICAgIHNldFNpZGViYXJIYXNFcnJvcihmYWxzZSlcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRVc2VBY3RpdmVDaGF0U2VuZEhhbmRsZXIoY29tcHV0ZWRDdXJyZW50T3B0aW9uLCBvcHRpb25zLmNoYXQsIEJvb2xlYW4oc2VuZE1lc3NhZ2VGdW5jdGlvbikpKSB7XG4gICAgICAgIHNlbmRNZXNzYWdlRnVuY3Rpb24/LihtZXNzYWdlLCBhdHRhY2htZW50cywgZmFxSWQsIGFnZW50U3VnZ2VzdGlvbklkLCBtZW50aW9ucywgZnVhSWQsIHNjSWQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydENoYXQobWVzc2FnZSwgYXR0YWNobWVudHMsIGZhcUlkLCBhZ2VudFN1Z2dlc3Rpb25JZCwgbWVudGlvbnMsIGZ1YUlkLCBzY0lkKVxuICAgICAgfVxuICAgIH0sXG4gICAgW3NlbmRNZXNzYWdlRnVuY3Rpb24sIHN0YXJ0Q2hhdCwgY29tcHV0ZWRDdXJyZW50T3B0aW9uLCBzaWRlYmFySGFzRXJyb3JdXG4gIClcblxuICBjb25zdCBoYW5kbGVHb0hvbWUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgLy8gU2kgZXN0YW1vcyBlbiB1bmEgY29udmVyc2FjacOzbiB5IHZhbW9zIGEgaG9tZSwgcmVzZXRlYXIgaW5pdGlhbENoYXRJZCB5IGluY3JlbWVudGFyIG5ld0NoYXRLZXlcbiAgICBpZiAoc2hvdWxkUmVzZXRDaGF0U3RhdGVPbkdvSG9tZShjdXJyZW50T3B0aW9uLCBvcHRpb25zLmNoYXQpKSB7XG4gICAgICAvLyBObyBjb3J0YW1vcyBsYSBnZW5lcmFjacOzbjogbGEgc2VzacOzbiBzaWd1ZSByZXNwb25kaWVuZG8gZW4gYmFja2dyb3VuZC5cbiAgICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICAgIHNldE5ld0NoYXRLZXkocHJldiA9PiBwcmV2ICsgMSlcbiAgICAgIHNldElzV3JpdGluZyhmYWxzZSlcbiAgICAgIGlmIChzaG91bGRDbGVhckNsaWVudE9uR29Ib21lRnJvbUNoYXQoYWdlbnQ/LmVudGl0eSkpIHtcbiAgICAgICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRDbGVhclRhc2tPbkdvSG9tZUZyb21DaGF0KHNlY3Rpb24pKSB7XG4gICAgICAgIHNldFRhc2s/LihudWxsKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2hvdWxkUmVzZXRBZ2VudFRvRmlyc3RPbkdvSG9tZShhZ2VudCwgYWdlbnRzLmRhdGEubGVuZ3RoKSkge1xuICAgICAgc2VsZWN0QWdlbnQoYWdlbnRzLmRhdGFbMF0pXG4gICAgfVxuICAgIGlmIChzaG91bGRDbGVhck9yY2hlc3RyYXRvckdsb2JhbENvbnRleHRPbkdvSG9tZShzZWN0aW9uLCBhZ2VudD8udHlwZSkpIHtcbiAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgIHNldENsaWVudD8uKG51bGwpXG4gICAgICBzZXRUYXNrPy4obnVsbClcbiAgICB9XG4gICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLmhvbWUpXG4gICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgaXNXZWJTZWFyY2hBY3RpdmUgJiYgdG9nZ2xlV2ViU2VhcmNoKClcbiAgfSwgW1xuICAgIG9wdGlvbnMuaG9tZSxcbiAgICBvcHRpb25zLmNoYXQsXG4gICAgY3VycmVudE9wdGlvbixcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICB0b2dnbGVXZWJTZWFyY2gsXG4gICAgYWdlbnQsXG4gICAgYWdlbnRzLFxuICAgIHNlbGVjdEFnZW50LFxuICAgIHNldFByb2plY3QsXG4gICAgc2V0Q2xpZW50LFxuICAgIHNldFRhc2ssXG4gICAgc3RvcEdlbmVyYXRpb25GdW5jdGlvbixcbiAgICBzZWN0aW9uLFxuICBdKVxuXG4gIGdvSG9tZVJlZi5jdXJyZW50ID0gaGFuZGxlR29Ib21lXG5cbiAgY29uc3Qgc3RhcnROZXdDaGF0RnJvbUNhdGFsb2cgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYWdlbnRzTGlzdCA9IHNob3VsZFByZWZldGNoQWdlbnRzRm9yQ2F0YWxvZ05ld0NoYXQoY29tcHV0ZWRDdXJyZW50T3B0aW9uLCBvcHRpb25zLm15QWdlbnRzLCBvcHRpb25zLm15U2tpbGxzKVxuICAgICAgPyBhd2FpdCBlbnN1cmVBZ2VudHNMb2FkZWQoKVxuICAgICAgOiBhZ2VudHMuZGF0YVxuICAgIGNvbnN0IGZpcnN0QWdlbnQgPSBhZ2VudHNMaXN0WzBdXG5cbiAgICBpZiAoc2hvdWxkQ2xlYXJDb250ZXh0Rm9yQ2F0YWxvZ09yU2tpbGxBZ2VudChmaXJzdEFnZW50KSkge1xuICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICAgIHNldFRhc2s/LihudWxsKVxuICAgICAgc2VsZWN0QWdlbnQoZmlyc3RBZ2VudClcbiAgICB9XG4gICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgIHNldE5ld0NoYXRLZXkocHJldiA9PiBwcmV2ICsgMSlcbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICBpZiAoaXNXZWJTZWFyY2hBY3RpdmUpIHRvZ2dsZVdlYlNlYXJjaCgpXG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2NoYXQtc2Vzc2lvbi1jaGFuZ2VkJykpXG4gIH0sIFtcbiAgICBhZ2VudHMuZGF0YSxcbiAgICBjb21wdXRlZEN1cnJlbnRPcHRpb24sXG4gICAgZW5zdXJlQWdlbnRzTG9hZGVkLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIHNlbGVjdEFnZW50LFxuICAgIHNldENsaWVudCxcbiAgICBzZXRQcm9qZWN0LFxuICAgIHNldFRhc2ssXG4gICAgdG9nZ2xlV2ViU2VhcmNoLFxuICBdKVxuXG4gIGNvbnN0IGhhbmRsZVN0YXJ0TmV3Q2hhdCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoc2hvdWxkU3RhcnROZXdDaGF0RnJvbUNhdGFsb2coY29tcHV0ZWRDdXJyZW50T3B0aW9uLCBpc01haWFrZXJBZ2VudFNlbGVjdGVkKSkge1xuICAgICAgc3RhcnROZXdDaGF0RnJvbUNhdGFsb2coKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBoYW5kbGVHb0hvbWUoKVxuICB9LCBbY29tcHV0ZWRDdXJyZW50T3B0aW9uLCBoYW5kbGVHb0hvbWUsIGlzTWFpYWtlckFnZW50U2VsZWN0ZWQsIHN0YXJ0TmV3Q2hhdEZyb21DYXRhbG9nXSlcblxuICBjb25zdCBoYW5kbGVSZXNldENoYXQgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICAvLyBEaXNwYXRjaCBldmVudCB0byBjbGVhciB0aGUgaW5wdXQgdGV4dGFyZWFcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgICBoYW5kbGVHb0hvbWUoKVxuICB9LCBbaGFuZGxlR29Ib21lXSlcblxuICAvLyBCb3TDs24gXCJ2b2x2ZXJcIiBkZWwgaGVhZGVyIChzb2xvIG9yY2hlc3RyYXRvcik6XG4gIC8vIC0gRGVzZGUgZWwgY2hhdCAoaGVhZGVyIG8gcHJvamVjdC9jbGllbnQvdGFzayk6IGluaWNpYSB1bmEgY29udmVyc2FjacOzbiBudWV2YSBjb25zZXJ2YW5kbyBlbFxuICAvLyAgIGNvbnRleHRvIHBpbmVhZG8geSB2dWVsdmUgYWwgaG9tZSAocGFzbyAyIGNvbiBGQVFzL0ZVQXMpLlxuICAvLyAtIEVuIGVsIGhvbWUgcGFzbyAyIChGQVFzL0ZVQXMgY29uIGNvbnRleHRvKTogbGltcGlhIGVsIGNvbnRleHRvIHBpbmVhZG8geSB2dWVsdmUgYWwgcGFzbyAxXG4gIC8vICAgKHNlbGVjdG9yIGRlIGNvbnRleHRvcyByZWNpZW50ZXMpLiBFbiBoZWFkZXIgc2llbXByZTsgZW4gcHJvamVjdC9jbGllbnQvdGFzayBzb2xvIHNpIGVsXG4gIC8vICAgdXN1YXJpbyByZWluaWNpw7MgZWwgY29udGV4dG8gKGRpZFJlc2V0Q29udGV4dEluU2VjdGlvbikuXG4gIGNvbnN0IGhhbmRsZUJhY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgdG8gPSByZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uKHNlY3Rpb24sIGFnZW50Py50eXBlLCBjb21wdXRlZEN1cnJlbnRPcHRpb24sIG9wdGlvbnMuaG9tZSlcbiAgICBhbXBsaXR1ZEV2ZW50KEVWRU5UUy5haUNoYXRCYWNrLCB7IHRvIH0pXG5cbiAgICAvLyBEZXNkZSBlbCBjaGF0IOKGkiBudWV2YSBjb252ZXJzYWNpw7NuIFNJTiBib3JyYXIgZWwgY29udGV4dG8gcGluZWFkbywgdm9sdmllbmRvIGFsIGhvbWUuXG4gICAgaWYgKHNob3VsZEJhY2tTdGFydE5ld0NoYXRQcmVzZXJ2aW5nQ29udGV4dChjb21wdXRlZEN1cnJlbnRPcHRpb24sIG9wdGlvbnMuY2hhdCkpIHtcbiAgICAgIC8vIE5vIGNvcnRhbW9zIGxhIGdlbmVyYWNpw7NuOiBsYSBzZXNpw7NuIHNpZ3VlIHJlc3BvbmRpZW5kbyBlbiBiYWNrZ3JvdW5kLlxuICAgICAgc2V0SXNXcml0aW5nKGZhbHNlKVxuICAgICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgICBpc1dlYlNlYXJjaEFjdGl2ZSAmJiB0b2dnbGVXZWJTZWFyY2goKVxuICAgICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLmhvbWUpXG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIEhvbWUgcGFzbyAyIChjb250ZXh0byBwaW5lYWRvKSDihpIgbGltcGlhciBlbCBjb250ZXh0byB5IHZvbHZlciBhbCBwYXNvIDEgKGNvbnRleHRvcyByZWNpZW50ZXMpLlxuICAgIGlmIChzaG91bGRCYWNrQ2xlYXJQaW5uZWRDb250ZXh0KGNvbXB1dGVkQ3VycmVudE9wdGlvbiwgb3B0aW9ucy5ob21lLCBzZWN0aW9uLCBkaWRSZXNldENvbnRleHRJblNlY3Rpb24pKSB7XG4gICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgICAgc2V0VGFzaz8uKG51bGwpXG4gICAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICB9XG4gIH0sIFtcbiAgICBjb21wdXRlZEN1cnJlbnRPcHRpb24sXG4gICAgc2VjdGlvbixcbiAgICBhZ2VudD8udHlwZSxcbiAgICBhbXBsaXR1ZEV2ZW50LFxuICAgIG9wdGlvbnMuaG9tZSxcbiAgICBzdG9wR2VuZXJhdGlvbkZ1bmN0aW9uLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIHRvZ2dsZVdlYlNlYXJjaCxcbiAgICBkaWRSZXNldENvbnRleHRJblNlY3Rpb24sXG4gICAgc2V0UHJvamVjdCxcbiAgICBzZXRDbGllbnQsXG4gICAgc2V0VGFzayxcbiAgICBzZXRDaGlwc1Byb2plY3QsXG4gIF0pXG5cbiAgLy8gRGV0ZWN0YSBlbCByZWluaWNpbyBkZSBjb250ZXh0byBlbiBwcm9qZWN0L2NsaWVudC90YXNrOiBjb250ZXh0byBwaW5lYWRvIOKGkiB2YWPDrW8gY29uIGVsXG4gIC8vIG9yY2hlc3RyYXRvciAocC4gZWouIGFsIHJlc2VsZWNjaW9uYXIgTUFJQSBlbiBlbCBsaXN0YWRvKS4gU29sbyBsYSB0cmFuc2ljacOzbiBjdWVudGEsIGFzw60gdW5hXG4gIC8vIGFwZXJ0dXJhIGZyZXNjYSAoY29udGV4dG8gcGluZWFkbyBkZXNkZSBsYSBzZWNjacOzbikgbm8gbG8gYWN0aXZhLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHBpbm5lZCA9IHJlc29sdmVIYXNQaW5uZWRDb250ZXh0KHtcbiAgICAgIHRhc2tJZDogdGFzaz8uaWQsXG4gICAgICBjaGlwc1Byb2plY3RJZDogY2hpcHNQcm9qZWN0Py5wcm9qZWN0SWQsXG4gICAgICBjbGllbnRJZDogY2xpZW50Py5pZCxcbiAgICAgIHByb2plY3RJZDogcHJvamVjdD8uaWQsXG4gICAgfSlcbiAgICBjb25zdCB3YXNQaW5uZWQgPSBwcmV2SGFzUGlubmVkQ29udGV4dFJlZi5jdXJyZW50XG4gICAgcHJldkhhc1Bpbm5lZENvbnRleHRSZWYuY3VycmVudCA9IHBpbm5lZFxuICAgIGlmIChzaG91bGRNYXJrT3JjaGVzdHJhdG9yQ29udGV4dFJlc2V0KHNlY3Rpb24sIGFnZW50Py50eXBlLCB3YXNQaW5uZWQsIHBpbm5lZCkpIHtcbiAgICAgIHNldERpZFJlc2V0Q29udGV4dEluU2VjdGlvbih0cnVlKVxuICAgIH1cbiAgfSwgW3Rhc2s/LmlkLCBjaGlwc1Byb2plY3Q/LnByb2plY3RJZCwgY2xpZW50Py5pZCwgcHJvamVjdD8uaWQsIHNlY3Rpb24sIGFnZW50Py50eXBlXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9uTWVyZ2VDcmVhdGVkQWdlbnQgPSAoZXZ0OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgeyBhZ2VudDogbmV4dEFnZW50IH0gPSAoZXZ0IGFzIEN1c3RvbUV2ZW50PHsgYWdlbnQ6IEFnZW50IH0+KS5kZXRhaWwgfHwge31cbiAgICAgIGlmIChuZXh0QWdlbnQ/LmlkKSB7XG4gICAgICAgIGFkZEFnZW50KG5leHRBZ2VudCwgeyBuYXZpZ2F0ZUhvbWU6IGZhbHNlIH0pXG4gICAgICB9XG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtbWVyZ2UtY3JlYXRlZC1hZ2VudC1pbnRvLWxpc3QnLCBvbk1lcmdlQ3JlYXRlZEFnZW50KVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLW1lcmdlLWNyZWF0ZWQtYWdlbnQtaW50by1saXN0Jywgb25NZXJnZUNyZWF0ZWRBZ2VudClcbiAgICB9XG4gIH0sIFthZGRBZ2VudF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvblN5bmNFZGl0ZWRBZ2VudCA9IChldnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IGFnZW50OiBuZXh0QWdlbnQgfSA9IChldnQgYXMgQ3VzdG9tRXZlbnQ8eyBhZ2VudDogQWdlbnQgfT4pLmRldGFpbCB8fCB7fVxuICAgICAgaWYgKCFuZXh0QWdlbnQ/LmlkKSByZXR1cm5cbiAgICAgIHVwZGF0ZUFnZW50KG5leHRBZ2VudClcbiAgICAgIGlmIChhZ2VudD8uaWQgPT09IG5leHRBZ2VudC5pZCkge1xuICAgICAgICBzZWxlY3RBZ2VudChuZXh0QWdlbnQpXG4gICAgICB9XG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtc3luYy1lZGl0ZWQtYWdlbnQtZnJvbS1jaGF0Jywgb25TeW5jRWRpdGVkQWdlbnQpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtc3luYy1lZGl0ZWQtYWdlbnQtZnJvbS1jaGF0Jywgb25TeW5jRWRpdGVkQWdlbnQpXG4gICAgfVxuICB9LCBbdXBkYXRlQWdlbnQsIHNlbGVjdEFnZW50LCBhZ2VudD8uaWRdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb3BlbkNoYXRWaWV3ID0gKCkgPT4ge1xuICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgICBzZXRJbml0aWFsQ2hhdElkKG51bGwpXG4gICAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2UoeyBtZXNzYWdlOiAnJywgYXR0YWNobWVudHM6IFtdIH0pXG4gICAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuY2hhdClcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tY2hhdC12aWV3Jywgb3BlbkNoYXRWaWV3KVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tY2hhdC12aWV3Jywgb3BlbkNoYXRWaWV3KVxuICAgIH1cbiAgfSwgW10pXG5cbiAgLyoqXG4gICAqIEVsIMOtY29ubyBkZSBNQUlBIGRlbCBoZWFkZXIgbGxldmEgc2llbXByZSBhbCBIb21lLiBTaSBNQUlBIHlhIGVzdMOhIG1vbnRhZGEgcGVyb1xuICAgKiBtaW5pbWl6YWRhLCBlbCBob3N0IG5vIHB1ZWRlIHJlc29sdmVybG8gY2FtYmlhbmRvIGBpc09wZW5gICh5YSBlc3TDoSBlbiB0cnVlKSxcbiAgICogYXPDrSBxdWUgYXZpc2EgcG9yIGV2ZW50byB5IGFjw6EgcmVzdGF1cmFtb3MgeSB2YW1vcyBhbCBIb21lLlxuICAgKi9cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvcGVuSG9tZSA9ICgpID0+IHtcbiAgICAgIGFwcGx5RXhwYW5kZWRIb3N0VGFrZW92ZXIoe1xuICAgICAgICBzZWN0aW9uOiAnaGVhZGVyJyxcbiAgICAgICAgZW50aXR5OiB7IHByb2plY3RJZDogbnVsbCwgY2xpZW50SWQ6IG51bGwgfSxcbiAgICAgIH0pXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtb3Blbi1ob21lJywgb3BlbkhvbWUpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtb3Blbi1ob21lJywgb3BlbkhvbWUpXG4gICAgfVxuICB9LCBbYXBwbHlFeHBhbmRlZEhvc3RUYWtlb3Zlcl0pXG5cbiAgLyoqXG4gICAqIE90cm8gaG9zdCAocHJveWVjdG8sIGNsaWVudGUsIGJhbm5lciwgaGVhZGVy4oCmKSBwaWRlIGFicmlyIE1BSUEgbWllbnRyYXMgeWEgaGF5IHVuYVxuICAgKiBpbnN0YW5jaWEgbW9udGFkYS4gRXhwYW5kZSBzaSBlc3RhYmEgbWluaW1pemFkbywgYXBsaWNhIGVsIGNvbnRleHRvIGRlbCBob3N0IG51ZXZvXG4gICAqIHkgdmEgYWwgaG9tZSDigJQgc2luIHJlc3RhdXJhciBsYSBjb252ZXJzYWNpw7NuIHByZXZpYSAoZXNvIGxvIGhhY2UgZWwgcGlsbCkuXG4gICAqL1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9wZW5Gcm9tSG9zdCA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHsgZGV0YWlsIH0gPSBldmVudCBhcyBDdXN0b21FdmVudDxNYWlhSG9zdE9wZW5EZXRhaWw+XG4gICAgICBpZiAoIWRldGFpbCkgcmV0dXJuXG4gICAgICBhcHBseUV4cGFuZGVkSG9zdFRha2VvdmVyKGRldGFpbClcbiAgICB9XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKE1BSUFfT1BFTl9GUk9NX0hPU1RfRVZFTlQsIG9wZW5Gcm9tSG9zdClcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihNQUlBX09QRU5fRlJPTV9IT1NUX0VWRU5ULCBvcGVuRnJvbUhvc3QpXG4gICAgfVxuICB9LCBbYXBwbHlFeHBhbmRlZEhvc3RUYWtlb3Zlcl0pXG5cbiAgLyoqIE1pc21vIGZsdWpvIHF1ZSBDaGF0QUlNeUFnZW50cy5oYW5kbGVVc2VBZ2VudCArIG9uQmFjayAoaGFuZGxlcnMuaG9tZSkuXG4gICAqICBFbCBkZXRhaWwgcHVlZGUgdHJhZXIgb3BjaW9uYWxtZW50ZSBgcHJvamVjdGAsIGBjbGllbnRgLCBgdGFza2AgcGFyYSBmbG93cyBxdWVcbiAgICogIG5lY2VzaXRhbiBwcmVzZXJ2YXIgY29udGV4dG8gKGVqLiBzZWxlY3RvciBkZSBhZ2VudGVzIGRlc2RlIHVuYSB0YXJlYSkuIFNpIG5vIHZpZW5lbixcbiAgICogIHNlIG1hbnRpZW5lIGVsIGNvbXBvcnRhbWllbnRvIG9yaWdpbmFsIGRlIGxpbXBpYXIgcHJvamVjdC9jbGllbnQuICovXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb3Blbk5ld0NoYXRXaXRoQWdlbnQgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IGRldGFpbCB9ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8e1xuICAgICAgICBhZ2VudDogQWdlbnRcbiAgICAgICAgcHJvamVjdD86IFByb2plY3QgfCBudWxsXG4gICAgICAgIGNsaWVudD86IENsaWVudCB8IG51bGxcbiAgICAgICAgdGFzaz86IFRhc2sgfCBudWxsXG4gICAgICB9PlxuICAgICAgY29uc3QgbmV4dEFnZW50ID0gZGV0YWlsPy5hZ2VudFxuICAgICAgaWYgKCFuZXh0QWdlbnQpIHJldHVyblxuXG4gICAgICBjb25zdCBjb250ZXh0UGF0Y2ggPSByZXNvbHZlT3Blbk5ld0NoYXRXaXRoQWdlbnRDb250ZXh0KGRldGFpbCA/PyB7fSlcbiAgICAgIHNldFByb2plY3QoY29udGV4dFBhdGNoLnByb2plY3QpXG4gICAgICBzZXRDbGllbnQ/Lihjb250ZXh0UGF0Y2guY2xpZW50KVxuICAgICAgaWYgKGNvbnRleHRQYXRjaC5zaG91bGRTZXRUYXNrKSB7XG4gICAgICAgIHNldFRhc2s/Lihjb250ZXh0UGF0Y2gudGFzayA/PyBudWxsKVxuICAgICAgfVxuICAgICAgc2VsZWN0QWdlbnQobmV4dEFnZW50KVxuICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICB9XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tbmV3LWNoYXQtd2l0aC1hZ2VudCcsIG9wZW5OZXdDaGF0V2l0aEFnZW50KVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tbmV3LWNoYXQtd2l0aC1hZ2VudCcsIG9wZW5OZXdDaGF0V2l0aEFnZW50KVxuICAgIH1cbiAgfSwgW3NlbGVjdEFnZW50LCBzZXRDbGllbnQsIHNldFByb2plY3QsIHNldFRhc2tdKVxuXG4gIGNvbnN0IGFwcGx5U2tpbGxVc2VGbG93ID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHNraWxsOiBTa2lsbCwgdXNlRmlyc3RBZ2VudDogYm9vbGVhbikgPT4ge1xuICAgICAgY29uc3QgZmlyc3RBZ2VudCA9IGF3YWl0IGVuc3VyZUFnZW50c0JlZm9yZVNraWxsVXNlKHtcbiAgICAgICAgdXNlRmlyc3RBZ2VudCxcbiAgICAgICAgYWdlbnRzOiBhZ2VudHNEYXRhUmVmLmN1cnJlbnQsXG4gICAgICAgIGVuc3VyZUFnZW50c0xvYWRlZCxcbiAgICAgIH0pXG5cbiAgICAgIGlmIChzaG91bGRDbGVhckNvbnRleHRGb3JDYXRhbG9nT3JTa2lsbEFnZW50KGZpcnN0QWdlbnQpKSB7XG4gICAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICAgICAgc2V0VGFzaz8uKG51bGwpXG4gICAgICAgIHNlbGVjdEFnZW50KGZpcnN0QWdlbnQpXG4gICAgICB9XG5cbiAgICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuICAgICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLmhvbWUpXG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgICAgIGRpc3BhdGNoU2tpbGxNZW50aW9uSW5zZXJ0KHNraWxsKVxuICAgIH0sXG4gICAgW2Vuc3VyZUFnZW50c0xvYWRlZCwgc2VsZWN0QWdlbnQsIHNldENsaWVudCwgc2V0UHJvamVjdCwgc2V0VGFza11cbiAgKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlVXNlU2tpbGxBZnRlclNhdmUgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IHNraWxsLCB1c2VGaXJzdEFnZW50ID0gZmFsc2UgfSA9XG4gICAgICAgIChldmVudCBhcyBDdXN0b21FdmVudDx7IHNraWxsOiBTa2lsbDsgdXNlRmlyc3RBZ2VudD86IGJvb2xlYW4gfT4pLmRldGFpbCB8fCB7fVxuICAgICAgaWYgKCFza2lsbCkgcmV0dXJuXG5cbiAgICAgIGFwcGx5U2tpbGxVc2VGbG93KHNraWxsLCB1c2VGaXJzdEFnZW50KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpXG4gICAgfVxuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihTS0lMTF9VU0VfQUZURVJfU0FWRV9FVkVOVCwgaGFuZGxlVXNlU2tpbGxBZnRlclNhdmUpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoU0tJTExfVVNFX0FGVEVSX1NBVkVfRVZFTlQsIGhhbmRsZVVzZVNraWxsQWZ0ZXJTYXZlKVxuICAgIH1cbiAgfSwgW2FwcGx5U2tpbGxVc2VGbG93XSlcblxuICAvLyBNZXRhZGF0YSBkZSBsYSBzZXNzaW9uIGFiaWVydGEgKGFnZW50X3R5cGUvYWdlbnRfZW50aXR5ICsgY29udGV4dG8pLCBlbWl0aWRhIHBvciB1c2VDaGF0TWVzc2FnZXMuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb25TZXNzaW9uTWV0YSA9IChldnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IGRldGFpbCB9ID0gZXZ0IGFzIEN1c3RvbUV2ZW50PFNlc3Npb25NZXRhPlxuICAgICAgaWYgKGRldGFpbCkgc2V0U2Vzc2lvbk1ldGEoZGV0YWlsKVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLWNoYXQtc2Vzc2lvbi1tZXRhJywgb25TZXNzaW9uTWV0YSlcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWFpYS1jaGF0LXNlc3Npb24tbWV0YScsIG9uU2Vzc2lvbk1ldGEpXG4gICAgfVxuICB9LCBbXSlcblxuICAvLyBBbCBjYW1iaWFyIGRlIGNvbnZlcnNhY2nDs24gbGltcGlhbW9zIGxhIG1ldGFkYXRhOyBlbCBsb2FkIGRlIGxhIG51ZXZhIHNlc3Npb24gbGEgdnVlbHZlIGEgZW1pdGlyLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldFNlc3Npb25NZXRhKG51bGwpXG4gIH0sIFtpbml0aWFsQ2hhdElkXSlcblxuICAvLyBDYXJ0ZWwgXCJjb250aW51YXIgZW4gdW4gY2hhdCBudWV2b1wiOiBzZSBtdWVzdHJhIGFsIGFicmlyIHVuYSBjb252ZXJzYWNpw7NuIGRlIHVuIGNsb25lIGxlZ2FjeVxuICAvLyAoYWdlbnRfdHlwZSA9PT0gJ2Nsb25lJyBjb24gZW50aXR5IHByb2plY3QvdGFzay9jbGllbnQpLiBFbCBpbnB1dCBzZSByZWVtcGxhemEgcG9yIGVsIGNhcnRlbC5cbiAgY29uc3QgbGVnYWN5Q29udGV4dFNlc3Npb24gPSB1c2VNZW1vKFxuICAgICgpID0+IHJlc29sdmVMZWdhY3lDb250ZXh0U2Vzc2lvbihjb21wdXRlZEN1cnJlbnRPcHRpb24sIG9wdGlvbnMuY2hhdCwgc2Vzc2lvbk1ldGEpLFxuICAgIFtjb21wdXRlZEN1cnJlbnRPcHRpb24sIHNlc3Npb25NZXRhXVxuICApXG5cbiAgLy8gTWFyY2EgZWwgYWdlbnRlIGRlIGxhIGNvbnZlcnNhY2nDs24gbGVnYWN5IHBhcmEgcXVlIGhlYWRlciwgc2VsZWN0b3IgeSBhdmF0YXIgbXVlc3RyZW4gZWwgbG9nb1xuICAvLyBNQUlBIHkgZWwgbm9tYnJlIHRhY2hhZG8gKGFnZW50ZSBvYnNvbGV0byksIHNpbiBkZXBlbmRlciBkZWwgYHR5cGVgIHJlc3VlbHRvIGRlIGxhIHNlc2nDs24gdmllamEuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNob3VsZE1hcmtBZ2VudEFzTGVnYWN5Q29udGV4dChsZWdhY3lDb250ZXh0U2Vzc2lvbiwgYWdlbnQpKSB7XG4gICAgICBzZWxlY3RBZ2VudChidWlsZExlZ2FjeUNvbnRleHRBZ2VudChhZ2VudCkpXG4gICAgfVxuICB9LCBbbGVnYWN5Q29udGV4dFNlc3Npb24sIGFnZW50LCBzZWxlY3RBZ2VudF0pXG5cbiAgLy8gQWJyZSB1biBjaGF0IG51ZXZvIGNvbiBlbCBvcmNoZXN0cmF0b3Igc2V0ZWFuZG8gZWwgY29udGV4dG8gZGVsIGNsb25lIGxlZ2FjeSAobWlzbW8gY3JpdGVyaW9cbiAgLy8gcXVlIGNsaWNrZWFyIHVuIGNvbnRleHRvIHJlY2llbnRlIGVuIGVsIGhvbWUg4oaSIHBhc28gMiBjb24gRkFRcy9hY2Npb25lcyBkZSBlc2UgY29udGV4dG8pLlxuICBjb25zdCBoYW5kbGVDb250aW51ZUxlZ2FjeUNvbnRleHRJbk5ld0NoYXQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3Qgb3JjaGVzdHJhdG9yID0gZmluZE9yY2hlc3RyYXRvckFnZW50KGFnZW50cy5kYXRhKVxuICAgIGlmICghY2FuQ29udGludWVMZWdhY3lDb250ZXh0SW5OZXdDaGF0KHNlc3Npb25NZXRhLCBvcmNoZXN0cmF0b3IpIHx8ICFzZXNzaW9uTWV0YSB8fCAhb3JjaGVzdHJhdG9yKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgYWdlbnRFbnRpdHksXG4gICAgICBwcm9qZWN0SWQ6IHBJZCxcbiAgICAgIHByb2plY3ROYW1lOiBwTmFtZSxcbiAgICAgIGNsaWVudElkOiBjSWQsXG4gICAgICBjbGllbnROYW1lOiBjTmFtZSxcbiAgICAgIHRhc2tJZDogdElkLFxuICAgICAgdGFza05hbWU6IHROYW1lLFxuICAgIH0gPSBzZXNzaW9uTWV0YVxuXG4gICAgY29uc3QgbWlncmF0aW9uUGF0Y2ggPSBidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaCh7XG4gICAgICBhZ2VudEVudGl0eSxcbiAgICAgIHByb2plY3RJZDogcElkLFxuICAgICAgcHJvamVjdE5hbWU6IHBOYW1lLFxuICAgICAgY2xpZW50SWQ6IGNJZCxcbiAgICAgIGNsaWVudE5hbWU6IGNOYW1lLFxuICAgICAgdGFza0lkOiB0SWQsXG4gICAgICB0YXNrTmFtZTogdE5hbWUsXG4gICAgfSkgPz8geyB0YXNrOiBudWxsLCBwcm9qZWN0OiBudWxsLCBjbGllbnQ6IG51bGwsIGNoaXBzUHJvamVjdDogbnVsbCB9XG5cbiAgICBzZXRJc1dyaXRpbmcoZmFsc2UpXG4gICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgc2V0SGFzRXJyb3IoZmFsc2UpXG5cbiAgICBzZXRUYXNrPy4obWlncmF0aW9uUGF0Y2gudGFzaylcbiAgICBzZXRQcm9qZWN0KG1pZ3JhdGlvblBhdGNoLnByb2plY3QpXG4gICAgc2V0Q2xpZW50Py4obWlncmF0aW9uUGF0Y2guY2xpZW50KVxuICAgIHNldENoaXBzUHJvamVjdChtaWdyYXRpb25QYXRjaC5jaGlwc1Byb2plY3QpXG5cbiAgICBzZWxlY3RBZ2VudChvcmNoZXN0cmF0b3IpXG4gICAgc2V0U2Vzc2lvbk1ldGEobnVsbClcbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgfSwgW3Nlc3Npb25NZXRhLCBhZ2VudHMuZGF0YSwgc2VsZWN0QWdlbnQsIHNldENsaWVudCwgc2V0UHJvamVjdCwgc2V0VGFzaywgc2V0Q2hpcHNQcm9qZWN0LCBzdG9wR2VuZXJhdGlvbkZ1bmN0aW9uXSlcblxuICBjb25zdCB7IHNob3dOZXdDaGF0LCBpc015QWdlbnRzU2VjdGlvbiwgaXNNeVNraWxsc1NlY3Rpb24sIGlzTWFpYWtlckNyZWF0b3JIb21lIH0gPSB1c2VNZW1vKFxuICAgICgpID0+IHJlc29sdmVDaGF0TW9kYWxTZWN0aW9uRmxhZ3MoY29tcHV0ZWRDdXJyZW50T3B0aW9uLCBpc01haWFrZXJBZ2VudFNlbGVjdGVkKSxcbiAgICBbY29tcHV0ZWRDdXJyZW50T3B0aW9uLCBpc01haWFrZXJBZ2VudFNlbGVjdGVkXVxuICApXG5cbiAgY29uc3QgaGFzQ2hhdEFjY2VzcyA9IHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlKHNlY3Rpb24sIHVzZXIpXG4gIGNvbnN0IG1haW5Db250ZW50VmlldyA9IHJlc29sdmVDaGF0TW9kYWxNYWluQ29udGVudFZpZXcoaGFzRXJyb3IsIGhhc0NoYXRBY2Nlc3MpXG4gIGNvbnN0IHNob3dNb2RhbEZvb3RlciA9IHNob3VsZFNob3dDaGF0TW9kYWxGb290ZXIoe1xuICAgIGNvbXB1dGVkQ3VycmVudE9wdGlvbixcbiAgICBob21lT3B0aW9uOiBvcHRpb25zLmhvbWUsXG4gICAgY2hhdE9wdGlvbjogb3B0aW9ucy5jaGF0LFxuICAgIGFnZW50c0NvdW50OiBhZ2VudHMuZGF0YS5sZW5ndGgsXG4gICAgaXNNYWlha2VyQ3JlYXRvckhvbWUsXG4gICAgaGFzRXJyb3IsXG4gICAgbG9hZGluZyxcbiAgICBoYXNBY2Nlc3M6IGhhc0NoYXRBY2Nlc3MsXG4gIH0pXG4gIGNvbnN0IHNob3dTaWRlYmFyID0gc2hvdWxkUmVuZGVyQ2hhdFNpZGViYXIoaGFzQ2hhdEFjY2VzcywgaXNGbG9hdGluZylcblxuICAvLyBCb3TDs24gXCJ2b2x2ZXJcIjogc29sbyBwYXJhIGVsIG9yY2hlc3RyYXRvci5cbiAgLy8gLSBFbiBlbCBjaGF0OiBkaXNwb25pYmxlIGVuIHRvZGFzIGxhcyBzZWNjaW9uZXMgKGhlYWRlciB5IHByb2plY3QvY2xpZW50L3Rhc2spLlxuICAvLyAtIEVuIGVsIGhvbWUgcGFzbyAyIChGQVFzL0ZVQXMgY29uIGNvbnRleHRvIHBpbmVhZG8pOiBlbiBlbCBoZWFkZXIgc2llbXByZTsgZW5cbiAgLy8gICBwcm9qZWN0L2NsaWVudC90YXNrIHNvbG8gc2kgZWwgdXN1YXJpbyByZWluaWNpw7MgZWwgY29udGV4dG8gKHBhc8OzIHBvciBlbCBzZWxlY3RvciBkZVxuICAvLyAgIGNvbnRleHRvcyByZWNpZW50ZXMpLiBFbiBlbCBwYXNvIDEgKHNpbiBjb250ZXh0bykgTk8gc2UgbXVlc3RyYS5cbiAgY29uc3QgaGFzUGlubmVkQ29udGV4dCA9IHJlc29sdmVIYXNQaW5uZWRDb250ZXh0KHtcbiAgICB0YXNrSWQ6IHRhc2s/LmlkLFxuICAgIGNoaXBzUHJvamVjdElkOiBjaGlwc1Byb2plY3Q/LnByb2plY3RJZCxcbiAgICBjbGllbnRJZDogY2xpZW50Py5pZCxcbiAgICBwcm9qZWN0SWQ6IHByb2plY3Q/LmlkLFxuICB9KVxuICBjb25zdCB7IGlzQ2hhdFZpZXcsIGlzSGVhZGVySG9tZVN0ZXAyLCBpc1NlY3Rpb25SZXNldEhvbWVTdGVwMiB9ID0gcmVzb2x2ZU9yY2hlc3RyYXRvckhvbWVOYXZGbGFncyh7XG4gICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uLFxuICAgIGhvbWVPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICBjaGF0T3B0aW9uOiBvcHRpb25zLmNoYXQsXG4gICAgaGFzUGlubmVkQ29udGV4dCxcbiAgICBzZWN0aW9uLFxuICAgIGRpZFJlc2V0Q29udGV4dEluU2VjdGlvbixcbiAgfSlcbiAgY29uc3Qgc2hvd0JhY2tCdXR0b24gPSBzaG91bGRTaG93T3JjaGVzdHJhdG9yQmFja0J1dHRvbih7XG4gICAgYWdlbnRUeXBlOiBhZ2VudD8udHlwZSxcbiAgICBoYXNFcnJvcixcbiAgICBsb2FkaW5nLFxuICAgIGlzQ2hhdFZpZXcsXG4gICAgaXNIZWFkZXJIb21lU3RlcDIsXG4gICAgaXNTZWN0aW9uUmVzZXRIb21lU3RlcDIsXG4gIH0pXG4gIGNvbnN0IGhhbmRsZU9wZW5NYXJrZXRwbGFjZSA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNhbk9wZW5NYWlhTWFya2V0cGxhY2UoQm9vbGVhbih3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUykpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgYXdhaXQgZW5zdXJlQWdlbnRzTG9hZGVkKClcbiAgICBjbGVhckFnZW50KClcbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMubXlBZ2VudHMpXG4gICAgcGF0Y2hNYWlhUGFuZWxTZXNzaW9uKHVzZXIuaWQsIHtcbiAgICAgIGFnZW50c05hdkFjdGl2ZTogJ215QWdlbnRzJyxcbiAgICAgIGN1cnJlbnRPcHRpb246IG9wdGlvbnMubXlBZ2VudHMsXG4gICAgICBhY3RpdmVDaGF0SWQ6IG51bGwsXG4gICAgICBhZ2VudElkOiBudWxsLFxuICAgIH0pXG4gIH0sIFtjbGVhckFnZW50LCBlbnN1cmVBZ2VudHNMb2FkZWQsIHVzZXIuaWRdKVxuXG4gIGNvbnN0IGhhbmRsZU9wZW5Ta2lsbHMgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKCFzaG91bGRPcGVuU2tpbGxzQ2F0YWxvZyh1c2VySGFzU2tpbGxzQWNjZXNzKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNsZWFyQWdlbnQoKVxuICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuICAgIHNldEN1cnJlbnRPcHRpb24ob3B0aW9ucy5teVNraWxscylcbiAgICBoYW5kbGVHZXRTa2lsbHMoKVxuICAgIHBhdGNoTWFpYVBhbmVsU2Vzc2lvbih1c2VyLmlkLCB7XG4gICAgICBhZ2VudHNOYXZBY3RpdmU6ICdteVNraWxscycsXG4gICAgICBjdXJyZW50T3B0aW9uOiBvcHRpb25zLm15U2tpbGxzLFxuICAgIH0pXG4gIH0sIFtjbGVhckFnZW50LCBoYW5kbGVHZXRTa2lsbHMsIHVzZXIuaWQsIHVzZXJIYXNTa2lsbHNBY2Nlc3NdKVxuXG4gIGNvbnN0IGhhbmRsZUdvVG9NYWlha2VyID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuICAgIGxldCBtYWlha2VyQWdlbnQgPSBhZ2VudHMuZGF0YS5maW5kKChhOiBBZ2VudCkgPT4gaXNNYXJrZXRwbGFjZUdsb2JhbENsb25lQWdlbnQoYSkpXG4gICAgaWYgKCFtYWlha2VyQWdlbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgICBwYXRoOiBgYWdlbnRzP2FnZW50X3R5cGU9Y2xvbmUmZW50aXR5PWdsb2JhbCZsYW5nPSR7bWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKX1gLFxuICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgICAgbWFpYWtlckFnZW50ID0gKGRhdGEuZGF0YSB8fCBbXSkuZmluZCgoYTogQWdlbnQpID0+IGlzTWFya2V0cGxhY2VHbG9iYWxDbG9uZUFnZW50KGEpKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIW1haWFrZXJBZ2VudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHNldFByb2plY3QobnVsbClcbiAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgIHNldFRhc2s/LihudWxsKVxuICAgIHNlbGVjdEFnZW50KG1haWFrZXJBZ2VudClcbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICBwYXRjaE1haWFQYW5lbFNlc3Npb24odXNlci5pZCwge1xuICAgICAgYWdlbnRzTmF2QWN0aXZlOiAnbWFpYWtlcicsXG4gICAgICBjdXJyZW50T3B0aW9uOiBvcHRpb25zLmhvbWUsXG4gICAgICBhZ2VudElkOiBtYWlha2VyQWdlbnQuaWQsXG4gICAgICBhY3RpdmVDaGF0SWQ6IG51bGwsXG4gICAgfSlcbiAgfSwgW2FnZW50cy5kYXRhLCBpMThuLmxhbmd1YWdlLCBzZWxlY3RBZ2VudCwgc2V0Q2xpZW50LCBzZXRQcm9qZWN0LCBzZXRUYXNrLCB1c2VyLmlkXSlcblxuICBjb25zdCBsb2FkQWdlbnRzRm9yU2Vzc2lvblJlc3RvcmUgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoc25hcHNob3Q6IE1haWFQYW5lbFNlc3Npb25TbmFwc2hvdCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgaWYgKHNob3VsZFNraXBBZ2VudHNMb2FkT25TZXNzaW9uUmVzdG9yZShzbmFwc2hvdC5hZ2VudHNOYXZBY3RpdmUpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBsZXQgYWdlbnRUb1NlbGVjdDogQWdlbnQgfCB1bmRlZmluZWRcbiAgICAgIGlmIChzaG91bGRGZXRjaEFnZW50RGV0YWlsT25TZXNzaW9uUmVzdG9yZShzbmFwc2hvdC5hZ2VudElkLCBzbmFwc2hvdC5hZ2VudHNOYXZBY3RpdmUpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYWdlbnRUb1NlbGVjdCA9IGF3YWl0IGZldGNoQWdlbnREZXRhaWwoc25hcHNob3QuYWdlbnRJZCBhcyBzdHJpbmcpXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGFnZW50VG9TZWxlY3QgPSB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWFnZW50c0ZldGNoZWRSZWYuY3VycmVudCkge1xuICAgICAgICBhZ2VudHNGZXRjaGVkUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICAgIGF3YWl0IGhhbmRsZUdldEFnZW50cyhzaG91bGRQYXNzQWdlbnRUb0dldEFnZW50c09uUmVzdG9yZShzbmFwc2hvdC5hZ2VudHNOYXZBY3RpdmUpID8gYWdlbnRUb1NlbGVjdCA6IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRTZWxlY3RGZXRjaGVkQWdlbnRBZnRlclJlc3RvcmUoYWdlbnRUb1NlbGVjdCwgc25hcHNob3QuYWdlbnRzTmF2QWN0aXZlKSkge1xuICAgICAgICBzZWxlY3RBZ2VudChhZ2VudFRvU2VsZWN0IGFzIEFnZW50KVxuICAgICAgfVxuICAgIH0sXG4gICAgW2hhbmRsZUdldEFnZW50cywgc2VsZWN0QWdlbnRdXG4gIClcblxuICBjb25zdCBhcHBseVNlc3Npb25SZXN0b3JlID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHNuYXBzaG90OiBNYWlhUGFuZWxTZXNzaW9uU25hcHNob3QpID0+IHtcbiAgICAgIHNldElzTWluaW1pemVkKGZhbHNlKVxuICAgICAgc2V0Q2hhdFZpZXdWaXNpYmxlKHRydWUpXG5cbiAgICAgIGNvbnN0IGNoaXBzUHJvamVjdEZyb21TbmFwc2hvdCA9IHJlc29sdmVTbmFwc2hvdENoaXBzUHJvamVjdChzbmFwc2hvdC5ob3N0Q29udGV4dClcbiAgICAgIGlmIChjaGlwc1Byb2plY3RGcm9tU25hcHNob3QpIHtcbiAgICAgICAgc2V0Q2hpcHNQcm9qZWN0KGNoaXBzUHJvamVjdEZyb21TbmFwc2hvdClcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdG9yZVJvdXRlID0gcmVzb2x2ZVNlc3Npb25SZXN0b3JlTmF2Um91dGUoc25hcHNob3QpXG5cbiAgICAgIGlmIChyZXN0b3JlUm91dGUgPT09ICdteUFnZW50cycpIHtcbiAgICAgICAgYXdhaXQgaGFuZGxlT3Blbk1hcmtldHBsYWNlKClcbiAgICAgICAgZm9jdXNDaGF0SW5wdXQoKVxuICAgICAgICBzeW5jUGFuZWxTZXNzaW9uKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN0b3JlUm91dGUgPT09ICdteVNraWxscycpIHtcbiAgICAgICAgaGFuZGxlT3BlblNraWxscygpXG4gICAgICAgIGZvY3VzQ2hhdElucHV0KClcbiAgICAgICAgc3luY1BhbmVsU2Vzc2lvbigpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAocmVzdG9yZVJvdXRlID09PSAnbWFpYWtlcicpIHtcbiAgICAgICAgYXdhaXQgaGFuZGxlR29Ub01haWFrZXIoKVxuICAgICAgICBmb2N1c0NoYXRJbnB1dCgpXG4gICAgICAgIHN5bmNQYW5lbFNlc3Npb24oKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3RvcmVSb3V0ZSA9PT0gJ2NoYXQnKSB7XG4gICAgICAgIHNldFVzZXJJbml0aWFsTWVzc2FnZSh7IG1lc3NhZ2U6ICcnLCBhdHRhY2htZW50czogW10gfSlcbiAgICAgICAgc2V0SW5pdGlhbENoYXRJZChzbmFwc2hvdC5hY3RpdmVDaGF0SWQgPz8gbnVsbClcbiAgICAgICAgZ2V0Q2hhdHNTdG9yZVN0YXRlKCkuc2V0QWN0aXZlQ2hhdElkKHNuYXBzaG90LmFjdGl2ZUNoYXRJZCA/PyBudWxsKVxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgICAgICAgaGFuZGxlcnMuY2hhdCgpXG4gICAgICB9IGVsc2UgaWYgKHJlc3RvcmVSb3V0ZSA9PT0gJ3NhdmVkT3B0aW9uJyAmJiBzbmFwc2hvdC5jdXJyZW50T3B0aW9uKSB7XG4gICAgICAgIHNldEN1cnJlbnRPcHRpb24oc25hcHNob3QuY3VycmVudE9wdGlvbiBhcyBvcHRpb25zKVxuICAgICAgfVxuXG4gICAgICBmb2N1c0NoYXRJbnB1dCgpXG4gICAgICBzeW5jUGFuZWxTZXNzaW9uKClcbiAgICB9LFxuICAgIFtcbiAgICAgIGZvY3VzQ2hhdElucHV0LFxuICAgICAgaGFuZGxlR29Ub01haWFrZXIsXG4gICAgICBoYW5kbGVPcGVuTWFya2V0cGxhY2UsXG4gICAgICBoYW5kbGVPcGVuU2tpbGxzLFxuICAgICAgaGFuZGxlcnMsXG4gICAgICBzZXRDaGF0Vmlld1Zpc2libGUsXG4gICAgICBzZXRDaGlwc1Byb2plY3QsXG4gICAgICBzeW5jUGFuZWxTZXNzaW9uLFxuICAgIF1cbiAgKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgc25hcHNob3QgPSBwZW5kaW5nU2Vzc2lvblJlc3RvcmVSZWYuY3VycmVudFxuICAgIGlmICghc25hcHNob3QgfHwgc2Vzc2lvblJlc3RvcmVTdGFydGVkUmVmLmN1cnJlbnQpIHJldHVyblxuICAgIHNlc3Npb25SZXN0b3JlU3RhcnRlZFJlZi5jdXJyZW50ID0gdHJ1ZVxuXG4gICAgc2V0Q2hhdFZpZXdWaXNpYmxlKHRydWUpXG5cbiAgICBjb25zdCBydW5SZXN0b3JlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgbG9hZEFnZW50c0ZvclNlc3Npb25SZXN0b3JlKHNuYXBzaG90KVxuICAgICAgICBwZW5kaW5nU2Vzc2lvblJlc3RvcmVSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgYXdhaXQgYXBwbHlTZXNzaW9uUmVzdG9yZShzbmFwc2hvdClcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzUmVzdG9yaW5nU2Vzc2lvbihmYWxzZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBydW5SZXN0b3JlKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKVxuICB9LCBbYXBwbHlTZXNzaW9uUmVzdG9yZSwgbG9hZEFnZW50c0ZvclNlc3Npb25SZXN0b3JlLCBzZXRDaGF0Vmlld1Zpc2libGVdKVxuXG4gIGNvbnN0IGhhbmRsZURlbGV0ZUFnZW50RnJvbU15QWdlbnRzID0gdXNlQ2FsbGJhY2soXG4gICAgKGFnZW50SWQ6IHN0cmluZykgPT4ge1xuICAgICAgcmVtb3ZlQWdlbnQoYWdlbnRJZClcbiAgICAgIGlmIChzaG91bGRSZXNlbGVjdEFnZW50QWZ0ZXJEZWxldGUoYWdlbnQ/LmlkLCBhZ2VudElkKSkge1xuICAgICAgICBzZWxlY3RGaXJzdEFnZW50KGFnZW50SWQpXG4gICAgICB9XG4gICAgfSxcbiAgICBbYWdlbnQ/LmlkLCByZW1vdmVBZ2VudCwgc2VsZWN0Rmlyc3RBZ2VudF1cbiAgKVxuXG4gIGNvbnN0IG1vZGFsUGFuZWwgPSAoXG4gICAgPD5cbiAgICAgIHtzaG93U2lkZWJhciA/IChcbiAgICAgICAgPFNpZGViYXJcbiAgICAgICAgICBvbkdvVG9DaGF0PXtnb1RvQ2hhdH1cbiAgICAgICAgICBvbkVycm9yPXsoKSA9PiBzZXRTaWRlYmFySGFzRXJyb3IodHJ1ZSl9XG4gICAgICAgICAgaGFuZGxlR29Ub0hvbWU9e2hhbmRsZUdvSG9tZX1cbiAgICAgICAgICBoYW5kbGVTdGFydE5ld0NoYXQ9e2hhbmRsZVN0YXJ0TmV3Q2hhdH1cbiAgICAgICAgICBoYW5kbGVPcGVuTWFya2V0cGxhY2U9e2hhbmRsZU9wZW5NYXJrZXRwbGFjZX1cbiAgICAgICAgICBzaG93TmV3Q2hhdD17c2hvd05ld0NoYXR9XG4gICAgICAgICAgcmVmZXRjaENoYXRzPXtyZWZldGNoQ2hhdHN9XG4gICAgICAgICAgaGFuZGxlU2V0UmVmZXRjaENoYXRzPXtzZXRSZWZldGNoQ2hhdHN9XG4gICAgICAgICAgaGFzRXJyb3I9e3NpZGViYXJIYXNFcnJvcn1cbiAgICAgICAgICBhZ2VudHNOYXZBY3RpdmU9e3NpZGViYXJBZ2VudHNOYXZBY3RpdmV9XG4gICAgICAgICAgaGFuZGxlT3BlblNraWxscz17aGFuZGxlT3BlblNraWxsc31cbiAgICAgICAgICBvbk9wZW5NYWlha2VyQ3JlYXRvcj17aGFuZGxlR29Ub01haWFrZXJ9XG4gICAgICAgICAgaXNMZWdhY3lDb250ZXh0U2Vzc2lvbj17ISFsZWdhY3lDb250ZXh0U2Vzc2lvbn1cbiAgICAgICAgICBpbml0aWFsT3Blbj17c2F2ZWRTZXNzaW9uT25Nb3VudFJlZi5jdXJyZW50Py5zaWRlYmFyT3BlbiA/PyBmYWxzZX1cbiAgICAgICAgICBvbk9wZW5DaGFuZ2U9e2hhbmRsZVNpZGViYXJPcGVuQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgKSA6IG51bGx9XG4gICAgICA8U0NDQUlNQ29udGVudCBleHBhbmRlZD17ZXhwYW5kZWR9IGZsb2F0aW5nPXtpc0Zsb2F0aW5nfT5cbiAgICAgICAgPENoYXRBSU1vZGFsSGVhZGVyXG4gICAgICAgICAgbGF5b3V0TW9kZT17bGF5b3V0TW9kZX1cbiAgICAgICAgICBvbkxheW91dE1vZGVDaGFuZ2U9e2hhbmRsZUxheW91dE1vZGVDaGFuZ2V9XG4gICAgICAgICAgZXhwYW5kZWQ9e2V4cGFuZGVkfVxuICAgICAgICAgIGRyYWdnYWJsZT17aXNGbG9hdGluZ31cbiAgICAgICAgICBvbkRyYWdTdGFydD17aGFuZGxlRHJhZ1N0YXJ0fVxuICAgICAgICAgIG9uRHJhZ01vdmU9e2hhbmRsZURyYWdNb3ZlfVxuICAgICAgICAgIG9uRHJhZ0VuZD17aGFuZGxlRHJhZ0VuZH1cbiAgICAgICAgICBoYW5kbGVNaW5pbWl6ZT17aGFuZGxlTWluaW1pemV9XG4gICAgICAgICAgYWdlbnRzPXthZ2VudHMuZGF0YX1cbiAgICAgICAgICBoYXNFcnJvcj17ISFhZ2VudEVycm9yfVxuICAgICAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICAgICAgbG9hZGluZ01vcmU9e2xvYWRpbmdNb3JlfVxuICAgICAgICAgIGhhc01vcmU9e2FnZW50cy5oYXNfbW9yZX1cbiAgICAgICAgICBoYW5kbGVSZXNldENoYXQ9e2hhbmRsZVJlc2V0Q2hhdH1cbiAgICAgICAgICBvbkFnZW50VXBkYXRlPXt1cGRhdGVBZ2VudEZhdm9yaXRlfVxuICAgICAgICAgIGxvYWRNb3JlQWdlbnRzPXtsb2FkTW9yZUFnZW50c31cbiAgICAgICAgICBzb3J0QWdlbnRzTGlzdD17c29ydEFnZW50c0xpc3R9XG4gICAgICAgICAgaXNNeUFnZW50c1NlY3Rpb249e2lzTXlBZ2VudHNTZWN0aW9ufVxuICAgICAgICAgIGlzTXlTa2lsbHNTZWN0aW9uPXtpc015U2tpbGxzU2VjdGlvbn1cbiAgICAgICAgICBpc01haWFrZXJTZWN0aW9uPXtpc01haWFrZXJDcmVhdG9ySG9tZX1cbiAgICAgICAgICBzaG93QmFja0J1dHRvbj17c2hvd0JhY2tCdXR0b259XG4gICAgICAgICAgb25CYWNrPXtoYW5kbGVCYWNrfVxuICAgICAgICAvPlxuICAgICAgICB7bWFpbkNvbnRlbnRWaWV3ID09PSAnZXJyb3InID8gKFxuICAgICAgICAgIDxNQUlBRXJyb3IgLz5cbiAgICAgICAgKSA6IG1haW5Db250ZW50VmlldyA9PT0gJ2NoYXQnID8gKFxuICAgICAgICAgIDxDaGF0QUlDb250ZW50XG4gICAgICAgICAgICBjdXJyZW50T3B0aW9uPXtjb21wdXRlZEN1cnJlbnRPcHRpb259XG4gICAgICAgICAgICBoYW5kbGVycz17eyAuLi5oYW5kbGVycywgY2hhdDogc3RhcnRDaGF0LCBob21lOiBoYW5kbGVycy5ob21lLCBoYW5kbGVHb0hvbWUgfX1cbiAgICAgICAgICAgIG9uRXJyb3I9eygpID0+IHNldEhhc0Vycm9yKHRydWUpfVxuICAgICAgICAgICAgcmVmcz17eyB1c2VySW5pdGlhbE1lc3NhZ2UsIGluaXRpYWxDaGF0SWQgfX1cbiAgICAgICAgICAgIG9uU2VuZE1lc3NhZ2VSZWFkeT17aGFuZGxlU2VuZE1lc3NhZ2VSZWFkeX1cbiAgICAgICAgICAgIGV4cGFuZGVkPXtleHBhbmRlZH1cbiAgICAgICAgICAgIGZsb2F0aW5nPXtpc0Zsb2F0aW5nfVxuICAgICAgICAgICAgYWdlbnRzPXthZ2VudHMuZGF0YX1cbiAgICAgICAgICAgIGxvYWRpbmdBZ2VudHM9e2xvYWRpbmd9XG4gICAgICAgICAgICBvbkRlbGV0ZUFnZW50PXtoYW5kbGVEZWxldGVBZ2VudEZyb21NeUFnZW50c31cbiAgICAgICAgICAgIG9uRmF2b3JpdGVBZ2VudFVwZGF0ZT17dXBkYXRlQWdlbnRGYXZvcml0ZX1cbiAgICAgICAgICAgIGhhc01vcmVBZ2VudHM9eyEhYWdlbnRzLmhhc19tb3JlfVxuICAgICAgICAgICAgbG9hZGluZ01vcmVBZ2VudHM9e2xvYWRpbmdNb3JlfVxuICAgICAgICAgICAgb25Mb2FkTW9yZUFnZW50cz17bG9hZE1vcmVBZ2VudHN9XG4gICAgICAgICAgICBvbkdvVG9NYWlha2VyPXtoYW5kbGVHb1RvTWFpYWtlcn1cbiAgICAgICAgICAgIG15U2tpbGxzPXtteVNraWxsc31cbiAgICAgICAgICAgIHNoYXJlZFNraWxscz17c2hhcmVkU2tpbGxzfVxuICAgICAgICAgICAgbG9hZGluZ1NraWxscz17bG9hZGluZ1NraWxsc31cbiAgICAgICAgICAgIG9uRGVsZXRlU2tpbGw9e3JlbW92ZVNraWxsfVxuICAgICAgICAgICAgb25TZWFyY2hBZ2VudHM9e3NlYXJjaEN1c3RvbUFnZW50c31cbiAgICAgICAgICAgIHNlYXJjaExvYWRpbmdBZ2VudHM9e3NlYXJjaExvYWRpbmd9XG4gICAgICAgICAgICBhZ2VudEVycm9yPXthZ2VudEVycm9yfVxuICAgICAgICAgICAgaXNSZXN0b3JpbmdTZXNzaW9uPXtpc1Jlc3RvcmluZ1Nlc3Npb259XG4gICAgICAgICAgLz5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8UHJvamVjdFN1bW1hcnlDb250ZW50IG9uUmVzdGFydFN1bW1hcnk9e2hhbmRsZXJzLmhvbWV9IC8+XG4gICAgICAgICl9XG4gICAgICAgIHtzaG93TW9kYWxGb290ZXIgJiYgKFxuICAgICAgICAgIDxDaGF0QWlNb2RhbEZvb3RlclxuICAgICAgICAgICAgYWdlbnQ9e2FnZW50fVxuICAgICAgICAgICAgaGFuZGxlU2VuZE1lc3NhZ2U9e2hhbmRsZVNlbmRNZXNzYWdlfVxuICAgICAgICAgICAgaGFuZGxlU3RvcEdlbmVyYXRpb249e3N0b3BHZW5lcmF0aW9uRnVuY3Rpb259XG4gICAgICAgICAgICBpc1N0cmVhbWluZz17aXNTdHJlYW1pbmd9XG4gICAgICAgICAgICBpc1dyaXRpbmc9e2lzV3JpdGluZ31cbiAgICAgICAgICAgIGNoYXRJZD17aW5pdGlhbENoYXRJZH1cbiAgICAgICAgICAgIG5ld0NoYXRLZXk9e25ld0NoYXRLZXl9XG4gICAgICAgICAgICB0b29sdGlwWkluZGV4PXt0b29sdGlwWkluZGV4fVxuICAgICAgICAgICAgbGVnYWN5Q29udGV4dFNlc3Npb249e2xlZ2FjeUNvbnRleHRTZXNzaW9ufVxuICAgICAgICAgICAgb25Db250aW51ZUluTmV3Q2hhdD17aGFuZGxlQ29udGludWVMZWdhY3lDb250ZXh0SW5OZXdDaGF0fVxuICAgICAgICAgICAgbGF5b3V0TW9kZT17bGF5b3V0TW9kZX1cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgPC9TQ0NBSU1Db250ZW50PlxuICAgIDwvPlxuICApXG5cbiAgY29uc3QgY29udGVudFdyYXBwZXIgPSAoXG4gICAgPFNDQ0FJTUNvbnRlbnRXcmFwcGVyIGV4cGFuZGVkPXtleHBhbmRlZH0gZmxvYXRpbmc9e2lzRmxvYXRpbmd9IHJlZj17Y29udGVudFdyYXBwZXJSZWZ9PlxuICAgICAge21vZGFsUGFuZWx9XG4gICAgPC9TQ0NBSU1Db250ZW50V3JhcHBlcj5cbiAgKVxuXG4gIHJldHVybiAoXG4gICAgc2VsZWN0b3IgJiZcbiAgICBSZWFjdERPTS5jcmVhdGVQb3J0YWwoXG4gICAgICA8U0NDQUlNV3JhcHBlclxuICAgICAgICBleHBhbmRlZD17ZXhwYW5kZWR9XG4gICAgICAgIGxheW91dE1vZGU9e2xheW91dE1vZGV9XG4gICAgICAgIGRyYWdQb3NpdGlvbj17cmVzb2x2ZWREcmFnUG9zaXRpb259XG4gICAgICAgIGVsZXZhdGVkPXtzaG91bGRVc2VFbGV2YXRlZE1haWFQYW5lbChzZWN0aW9uKX1cbiAgICAgICAgJG1pbmltaXplZD17aXNNaW5pbWl6ZWR9XG4gICAgICA+XG4gICAgICAgIDxTQ0NBSU1NaW5pbWl6ZWRIaWRlICRoaWRkZW49e2lzTWluaW1pemVkfT5cbiAgICAgICAgICA8RmxvYXRpbmdQYW5lbE1vdGlvbiB0aWx0PXt0aWx0TW90aW9ufSBleHBhbmRlZD17ZXhwYW5kZWR9PlxuICAgICAgICAgICAge2NvbnRlbnRXcmFwcGVyfVxuICAgICAgICAgIDwvRmxvYXRpbmdQYW5lbE1vdGlvbj5cbiAgICAgICAgPC9TQ0NBSU1NaW5pbWl6ZWRIaWRlPlxuICAgICAgICB7aXNNaW5pbWl6ZWQgJiYgKFxuICAgICAgICAgIDxNYWlhTWluaW1pemVkUGlsbFxuICAgICAgICAgICAgc2hvd05vdmVsdHlEb3Q9e3Nob3dNaW5pbWl6ZWROb3ZlbHR5RG90fVxuICAgICAgICAgICAgaXNTdHJlYW1pbmc9e2hhc0FjdGl2ZVN0cmVhbX1cbiAgICAgICAgICAgIG9uUmVzdG9yZT17aGFuZGxlUmVzdG9yZUZyb21NaW5pbWl6ZWR9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAge3VzZXJIYXNQZXJtaXNzaW9ucyAmJiAoXG4gICAgICAgICAgPEFibUFnZW50TW9kYWxcbiAgICAgICAgICAgIGFkZEFnZW50PXthZGRBZ2VudH1cbiAgICAgICAgICAgIHVwZGF0ZUFnZW50PXt1cGRhdGVBZ2VudH1cbiAgICAgICAgICAgIHJlbW92ZUFnZW50PXtyZW1vdmVBZ2VudH1cbiAgICAgICAgICAgIHVwZGF0ZUFnZW50RmF2b3JpdGU9e3VwZGF0ZUFnZW50RmF2b3JpdGV9XG4gICAgICAgICAgICBzZWxlY3RGaXJzdEFnZW50PXtzZWxlY3RGaXJzdEFnZW50fVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICAgIHt1c2VySGFzU2tpbGxzQWNjZXNzICYmIChcbiAgICAgICAgICA8QWJtU2tpbGxNb2RhbCBhZGRTa2lsbD17YWRkU2tpbGx9IHVwZGF0ZVNraWxsSW5MaXN0PXt1cGRhdGVTa2lsbEluTGlzdH0gcmVtb3ZlU2tpbGw9e3JlbW92ZVNraWxsfSAvPlxuICAgICAgICApfVxuICAgICAgICB7dXNlckhhc1NraWxsc0FjY2VzcyAmJiA8QWJtU2tpbGxHZW5lcmF0ZU1vZGFsIC8+fVxuICAgICAgICA8U25hY2tiYXIgLz5cbiAgICAgIDwvU0NDQUlNV3JhcHBlcj4sXG4gICAgICBzZWxlY3RvclxuICAgIClcbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQ0VBLFdBQVcsRUFDWEMsT0FBTyxFQUNQQyxRQUFRLEVBQ1JDLE1BQU0sRUFDTkMsU0FBUyxFQUNUQyxlQUFlLFFBRVYsT0FBTztBQUNkLE9BQU9DLFFBQVEsTUFBTSxXQUFXO0FBQ2hDLE9BQU9DLE1BQU0sTUFBTSxRQUFRO0FBQzNCLFNBQVNDLGNBQWMsUUFBUSxlQUFlO0FBQzlDLFNBQVNDLE9BQU8sUUFBUSwyQkFBMkI7QUFDbkQsU0FBU0MsaUJBQWlCLFFBQVEsZ0NBQWdDO0FBQ2xFLFNBQVNDLFNBQVMsUUFBUSx1QkFBdUI7QUFDakQsU0FBU0Msc0JB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QUN1UixRQUFRLEVBQUVBLFFBQVM7SUFBQzBRLFFBQVEsRUFBRXpRLFVBQVc7SUFBQ3FTLEdBQUcsRUFBRXBTLGlCQUFrQjtJQUFBK1AsUUFBQSxFQUNwRkQ7RUFBVSxDQUNTLENBQ3ZCO0VBRUQsT0FDRXpRLFFBQVEsaUJBQ1JyUyxRQUFRLENBQUNxbEIsWUFBWSxjQUNuQnJkLEtBQUEsQ0FBQ3ZHLGFBQWE7SUFDWnFSLFFBQVEsRUFBRUEsUUFBUztJQUNuQkosVUFBVSxFQUFFQSxVQUFXO0lBQ3ZCVSxZQUFZLEVBQUV3QyxvQkFBcUI7SUFDbkMwUCxRQUFRLEVBQUVwZSwwQkFBMEIsQ0FBQytILE9BQU8sQ0FBRTtJQUM5Q3NXLFVBQVUsRUFBRTFiLFdBQVk7SUFBQWtaLFFBQUEsZ0JBRXhCamIsSUFBQSxDQUFDdEcsbUJBQW1CO01BQUNna0IsT0FBTyxFQUFFM2IsV0FBWTtNQUFBa1osUUFBQSxlQUN4Q2piLElBQUEsQ0FBQy9GLG1CQUFtQjtRQUFDMGpCLElBQUksRUFBRWpTLFVBQVc7UUFBQ1YsUUFBUSxFQUFFQSxRQUFTO1FBQUFpUSxRQUFBLEVBQ3ZEL087TUFBYyxDQUNJO0lBQUMsQ0FDSCxDQUFDLEVBQ3JCbkssV0FBVyxpQkFDVi9CLElBQUEsQ0FBQ3BHLGlCQUFpQjtNQUNoQmdrQixjQUFjLEVBQUV4Yix1QkFBd0I7TUFDeEMyQyxXQUFXLEVBQUV6QyxlQUFnQjtNQUM3QnViLFNBQVMsRUFBRWpNO0lBQTJCLENBQ3ZDLENBQ0YsRUFDQS9ILGtCQUFrQixpQkFDakI3SixJQUFBLENBQUM3RyxhQUFhO01BQ1owUCxRQUFRLEVBQUVBLFFBQVM7TUFDbkJFLFdBQVcsRUFBRUEsV0FBWTtNQUN6QkQsV0FBVyxFQUFFQSxXQUFZO01BQ3pCRSxtQkFBbUIsRUFBRUEsbUJBQW9CO01BQ3pDQyxnQkFBZ0IsRUFBRUE7SUFBaUIsQ0FDcEMsQ0FDRixFQUNBZ0IsbUJBQW1CLGlCQUNsQmpLLElBQUEsQ0FBQzVHLGFBQWE7TUFBQ3NRLFFBQVEsRUFBRUEsUUFBUztNQUFDQyxpQkFBaUIsRUFBRUEsaUJBQWtCO01BQUNDLFdBQVcsRUFBRUE7SUFBWSxDQUFFLENBQ3JHLEVBQ0FLLG1CQUFtQixpQkFBSWpLLElBQUEsQ0FBQzFHLHFCQUFxQixJQUFFLENBQUMsZUFDakQwRyxJQUFBLENBQUMvRyxRQUFRLElBQUUsQ0FBQztFQUFBLENBQ0MsQ0FBQyxFQUNoQnNSLFFBQ0YsQ0FBQztBQUVMLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=