@projectcor/maia-components 2.11.11-6 → 2.11.11-7

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 (74) hide show
  1. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.js +69 -0
  2. package/lib/components/atoms/ChatClientSelector/index.js +2 -0
  3. package/lib/components/atoms/Chip/Chip.js +4 -3
  4. package/lib/components/atoms/Chip/styles.js +2 -2
  5. package/lib/components/atoms/EntitySelector/EntitySelector.js +181 -0
  6. package/lib/components/atoms/EntitySelector/EntitySelector.styles.js +57 -0
  7. package/lib/components/atoms/EntitySelector/index.js +2 -0
  8. package/lib/components/atoms/ErrorSearchProjects/ErrorSearchProjects.js +5 -3
  9. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.js +36 -33
  10. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.styles.js +67 -7
  11. package/lib/components/atoms/MAIAInput/MAIAInput.js +122 -18
  12. package/lib/components/atoms/MAIAInput/styles.js +27 -11
  13. package/lib/components/atoms/ProjectSelector/ProjectSelector.js +56 -193
  14. package/lib/components/atoms/SlashCommandDropdown/CategoryStepRegistry.js +5 -0
  15. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +56 -0
  16. package/lib/components/atoms/SlashCommandDropdown/SlashCommandList.js +26 -0
  17. package/lib/components/atoms/SlashCommandDropdown/index.js +2 -0
  18. package/lib/components/atoms/SlashCommandDropdown/steps/TaskStepSelector.js +208 -0
  19. package/lib/components/atoms/SlashCommandDropdown/steps/index.js +2 -0
  20. package/lib/components/atoms/SlashCommandDropdown/styles.js +50 -0
  21. package/lib/components/atoms/SlashCommandDropdown/types.js +2 -0
  22. package/lib/components/index.js +2 -1
  23. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.js +56 -0
  24. package/lib/components/molecules/ChatAIClientSelector/index.js +2 -0
  25. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +9 -1
  26. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +2 -3
  27. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +105 -213
  28. package/lib/components/molecules/ChatAIMessages/newStyles.js +3 -5
  29. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +18 -6
  30. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +72 -2
  31. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +10 -2
  32. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +5 -3
  33. package/lib/components/molecules/ChatAIModal/constants.js +6 -2
  34. package/lib/components/molecules/ChatFooter/ChatFooter.js +12 -10
  35. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +4 -21
  36. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.styles.js +2 -2
  37. package/lib/components/organisms/ChatAI/ChatAI.js +11 -3
  38. package/lib/components/organisms/ClientAIButton/ClientAIButton.js +26 -0
  39. package/lib/components/organisms/ClientAIButton/index.js +2 -0
  40. package/lib/constants/config.js +3 -2
  41. package/lib/context/global-context.js +1 -1
  42. package/lib/hooks/useChatManager/useChatManager.js +49 -19
  43. package/lib/hooks/useChatMessages/useChatMessages.js +72 -38
  44. package/lib/hooks/useFrequentlyAskedQuestions.js +1 -1
  45. package/lib/hooks/useFrequentlyUsedActions.js +73 -0
  46. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +6 -4
  47. package/lib/hooks/useProjectSummaryConfig.js +35 -7
  48. package/lib/hooks/useRecentClientsSearch.js +176 -0
  49. package/lib/hooks/useSlashCommands.js +73 -0
  50. package/lib/lang/br/index.js +38 -5
  51. package/lib/lang/en/index.js +38 -5
  52. package/lib/lang/es/index.js +38 -5
  53. package/lib/lang/fr/index.js +21 -2
  54. package/lib/services/cor/getProjectTasks.js +71 -0
  55. package/lib/services/maia/Agents/getAgents.js +6 -4
  56. package/lib/services/maia/Chats/getChatMessages.js +27 -14
  57. package/lib/services/maia/Chats/getChatsByUserId.js +1 -1
  58. package/lib/services/maia/FrequentlyUsedActions/getFrequentlyUsedActions.js +48 -0
  59. package/lib/services/maia/FrequentlyUsedActions/index.js +5 -0
  60. package/lib/services/maia/Orchestrator/orchestrator.js +6 -4
  61. package/lib/services/maia/RecentClients/getRecentClients.js +43 -0
  62. package/lib/services/maia/RecentClients/index.js +6 -0
  63. package/lib/services/maia/SlashCommands/getSlashCommands.js +48 -0
  64. package/lib/services/maia/SlashCommands/index.js +5 -0
  65. package/lib/services/maia/index.js +4 -2
  66. package/lib/services/query/getTaskFamilyProjectsQuery.js +5 -0
  67. package/lib/services/utils/mapChatMessages.js +12 -4
  68. package/lib/store/chatsStore.types.js +1 -1
  69. package/lib/types/Chat.js +1 -1
  70. package/lib/types/Client.js +2 -0
  71. package/lib/types/FrequentlyUsedAction.js +2 -0
  72. package/lib/types/SlashCommand.js +2 -0
  73. package/lib/types/agent.js +1 -1
  74. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
2
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
4
  var _excluded = ["isCurrentUser", "children"],
5
5
  _excluded2 = ["isCurrentUser"],
6
6
  _excluded3 = ["href", "children"];
@@ -17,7 +17,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
17
17
  /* eslint-disable react/require-default-props */
18
18
  /* eslint-disable jsx-a11y/click-events-have-key-events */
19
19
  /* eslint-disable jsx-a11y/no-static-element-interactions */
20
- import React, { memo, useCallback, useEffect, useLayoutEffect, useRef, useState, createElement as _createElement } from 'react';
20
+ import React, { memo, useEffect, useRef, useState, useCallback, createElement as _createElement } from 'react';
21
21
  import { Streamdown } from 'streamdown';
22
22
  import { createCodePlugin } from '@streamdown/code';
23
23
  import { ArrowSmallDown } from '@projectcor/icons/lib/components/ArrowSmallDown';
@@ -39,24 +39,27 @@ import { Feedback } from '../MessageFeedback/MessageFeedback';
39
39
  import { useGlobalContext } from '../../../context/global-context';
40
40
  import { MAIAIsologo } from '../../atoms/icons';
41
41
  import { TASK_URL_REGEX_PATTERN } from '../../../constants/taskUrls';
42
-
43
- /** Contexto con el texto del mensaje en streaming. Solo el componente que lo consume re-renderiza cuando cambia. */
44
42
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
45
- var StreamingMessageContext = /*#__PURE__*/React.createContext('');
46
43
  var code = createCodePlugin({
47
44
  themes: ['github-light', 'github-light']
48
45
  });
49
- var AssistantAvatarInner = function AssistantAvatarInner() {
46
+ var AssistantAvatar = function AssistantAvatar() {
47
+ var _useState = useState(null),
48
+ _useState2 = _slicedToArray(_useState, 2),
49
+ localAgent = _useState2[0],
50
+ setLocalAgent = _useState2[1];
50
51
  var _useGlobalContext = useGlobalContext(),
51
52
  agent = _useGlobalContext.agent;
53
+ useEffect(function () {
54
+ setLocalAgent(agent);
55
+ }, [agent]);
52
56
  return /*#__PURE__*/_jsx(SCAssistantAvatar, {
53
- children: (agent === null || agent === void 0 ? void 0 : agent.type) === 'clone' ? /*#__PURE__*/_jsx(MAIAIsologo, {
57
+ children: (localAgent === null || localAgent === void 0 ? void 0 : localAgent.type) === 'clone' ? /*#__PURE__*/_jsx(MAIAIsologo, {
54
58
  width: 18,
55
59
  height: 18
56
- }) : agent === null || agent === void 0 ? void 0 : agent.emoji
60
+ }) : localAgent === null || localAgent === void 0 ? void 0 : localAgent.emoji
57
61
  });
58
62
  };
59
- var AssistantAvatar = /*#__PURE__*/memo(AssistantAvatarInner);
60
63
  var MessageWrapper = function MessageWrapper(_ref) {
61
64
  var isCurrentUser = _ref.isCurrentUser,
62
65
  children = _ref.children,
@@ -75,10 +78,10 @@ var MessageContentWrapper = function MessageContentWrapper(_ref2) {
75
78
  function MessageOptions(_ref3) {
76
79
  var options = _ref3.options,
77
80
  handleSelectOption = _ref3.handleSelectOption;
78
- var _useState = useState(null),
79
- _useState2 = _slicedToArray(_useState, 2),
80
- selectedOption = _useState2[0],
81
- setSelectedOption = _useState2[1];
81
+ var _useState3 = useState(null),
82
+ _useState4 = _slicedToArray(_useState3, 2),
83
+ selectedOption = _useState4[0],
84
+ setSelectedOption = _useState4[1];
82
85
  var handleSelect = function handleSelect(option) {
83
86
  if (selectedOption) return;
84
87
  setSelectedOption(option);
@@ -98,10 +101,10 @@ function MessageOptions(_ref3) {
98
101
  });
99
102
  }
100
103
  var AssistantMessageHeader = function AssistantMessageHeader() {
101
- var _useState3 = useState(null),
102
- _useState4 = _slicedToArray(_useState3, 2),
103
- localAgent = _useState4[0],
104
- setLocalAgent = _useState4[1];
104
+ var _useState5 = useState(null),
105
+ _useState6 = _slicedToArray(_useState5, 2),
106
+ localAgent = _useState6[0],
107
+ setLocalAgent = _useState6[1];
105
108
  var _useGlobalContext2 = useGlobalContext(),
106
109
  agent = _useGlobalContext2.agent;
107
110
  useEffect(function () {
@@ -120,36 +123,6 @@ var getTabSegmentFromHref = function getTabSegmentFromHref(href) {
120
123
  return match && /^(detail|message|messages|files|history|hours)$/.test(match[1]) ? match[1] : 'detail';
121
124
  };
122
125
 
123
- /** Extrae las tareas enlazadas en el texto (URLs que coinciden con TASK_URL_REGEX_PATTERN). */
124
- var extractTasksFromMessage = function extractTasksFromMessage(message) {
125
- if (!message) return [];
126
- var taskUrlRegex = new RegExp(TASK_URL_REGEX_PATTERN, 'g');
127
- var tasks = [];
128
- var seenIds = new Set();
129
- var match = null;
130
- // eslint-disable-next-line no-cond-assign
131
- while ((match = taskUrlRegex.exec(message)) !== null) {
132
- var taskId = match[1];
133
- var url = match[0];
134
- if (!seenIds.has(taskId)) {
135
- seenIds.add(taskId);
136
- var escapedUrl = url.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
137
- var markdownLinkRegex = new RegExp("\\[([^\\]]+)\\]\\(".concat(escapedUrl, "\\)"));
138
- var linkMatch = message.match(markdownLinkRegex);
139
- var title = linkMatch ? linkMatch[1] : "Tarea #".concat(taskId);
140
- tasks.push({
141
- id: taskId,
142
- title: title,
143
- url: url
144
- });
145
- }
146
- }
147
- return tasks;
148
- };
149
- var hasTaskLinks = function hasTaskLinks(text) {
150
- return extractTasksFromMessage(text).length > 0;
151
- };
152
-
153
126
  // Component for task links that uses the useTaskPanel hook
154
127
  var TaskLink = function TaskLink(_ref4) {
155
128
  var href = _ref4.href,
@@ -202,58 +175,11 @@ var CustomLink = function CustomLink(_ref5) {
202
175
  children: children
203
176
  }));
204
177
  };
205
-
206
- /** Solo este componente re-renderiza cuando cambia el texto en streaming (lee del context). */
207
- var StreamingMessageBody = /*#__PURE__*/memo(function (props) {
208
- var fromContext = React.useContext(StreamingMessageContext);
209
- var displayText = props.isStreaming ? fromContext : props.message;
210
- var debugCountRef = React.useRef(0);
211
- if (typeof window !== 'undefined' && window.MAIA_DEBUG_STREAMING_RENDER && props.isStreaming) {
212
- debugCountRef.current += 1;
213
- // eslint-disable-next-line no-console
214
- console.log('[StreamingMessageBody] render', {
215
- count: debugCountRef.current,
216
- len: displayText === null || displayText === void 0 ? void 0 : displayText.length
217
- });
218
- }
219
- if (!displayText && !props.isStreaming) return null;
220
- return /*#__PURE__*/_jsxs(_Fragment, {
221
- children: [/*#__PURE__*/_jsx(SCCAIMessageWrapper, {
222
- isCurrentUser: props.isCurrentUser,
223
- isFrontendCancelled: props.isFrontendCancelled,
224
- className: props.isAssistant && hasTaskLinks(displayText) ? 'has-task-links' : '',
225
- children: /*#__PURE__*/_jsx(Streamdown, {
226
- plugins: {
227
- code: code
228
- },
229
- components: {
230
- a: CustomLink
231
- },
232
- linkSafety: {
233
- enabled: false
234
- },
235
- isAnimating: !!props.isStreaming,
236
- shikiTheme: ['github-light', 'github-light'],
237
- controls: {
238
- table: false,
239
- code: false
240
- },
241
- children: displayText
242
- })
243
- }), props.isAssistant && !props.isError && !props.isFrontendCancelled && !props.approval && !props.isStreaming && /*#__PURE__*/_jsx(MessageFeedback, {
244
- content: displayText,
245
- sources: props.sources,
246
- handleFeedback: props.handleFeedbackClick,
247
- disableFeedback: props.disableFeedback
248
- })]
249
- });
250
- });
251
178
  var MessageItem = /*#__PURE__*/memo(function (props) {
252
- var _message$length, _ref6, _ref7;
179
+ var _ref6, _ref7;
253
180
  var id = props.id,
254
181
  user = props.user,
255
182
  message = props.message,
256
- isStreaming = props.isStreaming,
257
183
  isError = props.isError,
258
184
  authUser = props.authUser,
259
185
  options = props.options,
@@ -267,30 +193,40 @@ var MessageItem = /*#__PURE__*/memo(function (props) {
267
193
  attachments = props.attachments,
268
194
  approval = props.approval,
269
195
  approvalStatus = props.approvalStatus;
270
- var _useState5 = useState(null),
271
- _useState6 = _slicedToArray(_useState5, 2),
272
- previewAttachment = _useState6[0],
273
- setPreviewAttachment = _useState6[1];
196
+ var extractTasksFromMessage = function extractTasksFromMessage(message) {
197
+ if (!message) return [];
198
+
199
+ // Match URLs like: .../tasks/123456/(detail|message|messages|files|history|hours)
200
+ var taskUrlRegex = new RegExp(TASK_URL_REGEX_PATTERN, 'g');
201
+ var tasks = [];
202
+ var seenIds = new Set();
203
+ var match = null;
204
+ // eslint-disable-next-line no-cond-assign
205
+ while ((match = taskUrlRegex.exec(message)) !== null) {
206
+ var taskId = match[1];
207
+ var url = match[0];
208
+ if (!seenIds.has(taskId)) {
209
+ seenIds.add(taskId);
210
+
211
+ // Try to extract the task title from markdown link [title](url)
212
+ var markdownLinkRegex = new RegExp("\\[([^\\]]+)\\]\\(".concat(url.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "\\)"));
213
+ var linkMatch = message.match(markdownLinkRegex);
214
+ var title = linkMatch ? linkMatch[1] : "Tarea #".concat(taskId);
215
+ tasks.push({
216
+ id: taskId,
217
+ title: title,
218
+ url: url
219
+ });
220
+ }
221
+ }
222
+ return tasks;
223
+ };
224
+ var _useState7 = useState(null),
225
+ _useState8 = _slicedToArray(_useState7, 2),
226
+ previewAttachment = _useState8[0],
227
+ setPreviewAttachment = _useState8[1];
274
228
  var isCurrentUser = role === ChatHistoryRole.USER || user.id === authUser.id.toString();
275
229
  var isAssistant = role === ChatHistoryRole.ASSISTANT || user.id === 'assistant';
276
-
277
- // DEBUG streaming: ver re-renders y remounts. Habilitar con window.MAIA_DEBUG_STREAMING_RENDER = true
278
- var renderCountRef = useRef(0);
279
- var prevMessageLenRef = useRef((_message$length = message === null || message === void 0 ? void 0 : message.length) !== null && _message$length !== void 0 ? _message$length : 0);
280
- renderCountRef.current += 1;
281
- if (isStreaming && typeof window !== 'undefined' && window.MAIA_DEBUG_STREAMING_RENDER) {
282
- var _message$length2;
283
- var prevLen = prevMessageLenRef.current;
284
- prevMessageLenRef.current = (_message$length2 = message === null || message === void 0 ? void 0 : message.length) !== null && _message$length2 !== void 0 ? _message$length2 : 0;
285
- // eslint-disable-next-line no-console
286
- console.log('[MessageItem] render', {
287
- messageId: id,
288
- renderCount: renderCountRef.current,
289
- messageLen: message === null || message === void 0 ? void 0 : message.length,
290
- prevMessageLen: prevLen,
291
- isStreaming: true
292
- });
293
- }
294
230
  var handleAttachmentClick = function handleAttachmentClick(attachment) {
295
231
  // Permitir previsualización si tiene archivo local o URLs del backend
296
232
  if (attachment.file instanceof File || attachment.originalFile instanceof File || attachment.url_thumbnail || attachment.url_original || attachment.url_file) {
@@ -367,17 +303,36 @@ var MessageItem = /*#__PURE__*/memo(function (props) {
367
303
  isExpanded: props.expanded
368
304
  }, "".concat(action.thread_id, "-").concat(action.tool_call_id));
369
305
  })
370
- }), (!!message || isStreaming) && !approval && /*#__PURE__*/_jsx(StreamingMessageBody, {
371
- message: message !== null && message !== void 0 ? message : '',
372
- isStreaming: !!isStreaming,
306
+ }), !!message &&
307
+ // Si hay approval (distinto de null), no renderizar el answer en este mensaje
308
+ // El mensaje de rechazo se renderiza como mensaje separado
309
+ !approval && /*#__PURE__*/_jsx(SCCAIMessageWrapper, {
373
310
  isCurrentUser: isCurrentUser,
374
- isAssistant: isAssistant,
375
311
  isFrontendCancelled: props.isFrontendCancelled,
376
- approval: approval,
377
- isError: isError,
312
+ className: isAssistant && extractTasksFromMessage(message).length > 0 ? 'has-task-links' : '',
313
+ children: /*#__PURE__*/_jsx(Streamdown, {
314
+ plugins: {
315
+ code: code
316
+ },
317
+ components: {
318
+ a: CustomLink
319
+ },
320
+ linkSafety: {
321
+ enabled: false
322
+ },
323
+ isAnimating: !!props.isStreaming,
324
+ shikiTheme: ['github-light', 'github-light'],
325
+ controls: {
326
+ table: false,
327
+ code: false
328
+ },
329
+ children: message
330
+ })
331
+ }), isAssistant && !isError && !props.isFrontendCancelled && !approval && /*#__PURE__*/_jsx(MessageFeedback, {
332
+ content: message,
378
333
  sources: sources,
379
- handleFeedbackClick: handleFeedbackClick,
380
- disableFeedback: disableFeedback !== null && disableFeedback !== void 0 ? disableFeedback : null
334
+ handleFeedback: handleFeedbackClick,
335
+ disableFeedback: disableFeedback
381
336
  })]
382
337
  }), /*#__PURE__*/_jsx(AttachmentPreviewModal, {
383
338
  isOpen: !!previewAttachment,
@@ -387,7 +342,6 @@ var MessageItem = /*#__PURE__*/memo(function (props) {
387
342
  });
388
343
  });
389
344
  var ChatAIMessagesInner = function ChatAIMessagesInner(_ref8) {
390
- var _lastMsg$user, _lastMsg$message2;
391
345
  var userInitialMessage = _ref8.userInitialMessage,
392
346
  initialChatId = _ref8.initialChatId,
393
347
  onError = _ref8.onError,
@@ -410,12 +364,10 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref8) {
410
364
  var lastScrollTopRef = useRef(0);
411
365
  var showScrollToBottomRef = useRef(false);
412
366
  var scrollRafRef = useRef(null);
413
- var _useState7 = useState(false),
414
- _useState8 = _slicedToArray(_useState7, 2),
415
- showScrollToBottom = _useState8[0],
416
- setShowScrollToBottom = _useState8[1];
417
- var streamingMessagePropsRef = useRef({});
418
- var streamingMessageIdRef = useRef(null);
367
+ var _useState9 = useState(false),
368
+ _useState0 = _slicedToArray(_useState9, 2),
369
+ showScrollToBottom = _useState0[0],
370
+ setShowScrollToBottom = _useState0[1];
419
371
  var _useChatManager = useChatManager({
420
372
  chatId: initialChatId || undefined,
421
373
  userInitialMessage: userInitialMessage,
@@ -437,9 +389,9 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref8) {
437
389
  initializeChat = _useChatManager.initializeChat,
438
390
  handleScroll = _useChatManager.handleScroll,
439
391
  stopGeneration = _useChatManager.stopGeneration;
440
- var handleSelectOption = useCallback(function (option) {
392
+ var handleSelectOption = function handleSelectOption(option) {
441
393
  changeProject(option);
442
- }, [changeProject]);
394
+ };
443
395
  var handleClickScrollToBottom = useCallback(function () {
444
396
  if (messagesRef.current) {
445
397
  messagesRef.current.scrollTo({
@@ -652,83 +604,26 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref8) {
652
604
  }).at(-1);
653
605
  var hasAttachments = Array.isArray(lastUserMessage === null || lastUserMessage === void 0 ? void 0 : lastUserMessage.attachments) && lastUserMessage.attachments.length || Array.isArray(lastUserMessage === null || lastUserMessage === void 0 ? void 0 : lastUserMessage.sources) && lastUserMessage.sources.length;
654
606
  var isScrollOnParent = !!expanded;
655
-
656
- // DEBUG streaming: re-renders del contenedor. Habilitar con window.MAIA_DEBUG_STREAMING_RENDER = true
657
- var listRenderCountRef = useRef(0);
658
- if ((waitingResponse || isWriting) && typeof window !== 'undefined' && window.MAIA_DEBUG_STREAMING_RENDER) {
659
- var _lastMsg$id, _lastMsg$message$leng, _lastMsg$message;
660
- listRenderCountRef.current += 1;
661
- var _lastMsg = messages[messages.length - 1];
662
- var lastKey = (_lastMsg$id = _lastMsg === null || _lastMsg === void 0 ? void 0 : _lastMsg.id) !== null && _lastMsg$id !== void 0 ? _lastMsg$id : "msg-".concat(messages.length - 1);
663
- // eslint-disable-next-line no-console
664
- console.log('[ChatAIMessages] render', {
665
- count: listRenderCountRef.current,
666
- lastMessageKey: lastKey,
667
- lastMessageLen: (_lastMsg$message$leng = _lastMsg === null || _lastMsg === void 0 || (_lastMsg$message = _lastMsg.message) === null || _lastMsg$message === void 0 ? void 0 : _lastMsg$message.length) !== null && _lastMsg$message$leng !== void 0 ? _lastMsg$message$leng : 0,
668
- messagesCount: messages.length
669
- });
670
- }
671
-
672
- // Al expandir/contraer el modal el ref pasa a otro contenedor (scrollTop se resetea a 0).
673
- // Restaurar la posición de scroll antes del paint para evitar que la conversación salte arriba.
674
- var expandedRef = useRef(expanded);
675
- useLayoutEffect(function () {
676
- if (expandedRef.current !== expanded && messagesRef.current) {
677
- var savedScrollTop = lastScrollTopRef.current;
678
- messagesRef.current.scrollTop = savedScrollTop;
679
- expandedRef.current = expanded;
680
- } else {
681
- expandedRef.current = expanded;
682
- }
683
- }, [expanded]);
684
- var lastMsg = messages[messages.length - 1];
685
- var isStreamingActive = (waitingResponse || isWriting) && lastMsg && (lastMsg.role === ChatHistoryRole.ASSISTANT || ((_lastMsg$user = lastMsg.user) === null || _lastMsg$user === void 0 ? void 0 : _lastMsg$user.id) === 'assistant');
686
- var streamingText = isStreamingActive ? (_lastMsg$message2 = lastMsg.message) !== null && _lastMsg$message2 !== void 0 ? _lastMsg$message2 : '' : '';
687
607
  var messagesContent = /*#__PURE__*/_jsxs(_Fragment, {
688
608
  children: [isLoadingMoreMessages && /*#__PURE__*/_jsx(LoadingText, {
689
609
  text: t('chat.loadingMore')
690
- }), /*#__PURE__*/_jsx(StreamingMessageContext.Provider, {
691
- value: streamingText,
692
- children: messages.map(function (message, index) {
693
- var _message$attachments, _message$sources, _message$project, _message$id;
694
- if (!((_message$attachments = message.attachments) !== null && _message$attachments !== void 0 && _message$attachments.length || (_message$sources = message.sources) !== null && _message$sources !== void 0 && _message$sources.length) && !message.message && !((_message$project = message.project) !== null && _message$project !== void 0 && _message$project.name) && !message.approval) return null;
695
- var messageFeedback = (message === null || message === void 0 ? void 0 : message.wasHelpful) === undefined || message.wasHelpful === null ? null : message.wasHelpful ? Feedback.THUMBS_UP : Feedback.THUMBS_DOWN;
696
- var isAssistantMessage = message.role === ChatHistoryRole.ASSISTANT || message.user.id === 'assistant';
697
- var isLastMessage = index === messages.length - 1;
698
- var isStreaming = isAssistantMessage && isLastMessage && (waitingResponse || isWriting);
699
-
700
- // Key estable: solo message.id para evitar remount durante streaming (message.date puede cambiar)
701
- var messageKey = (_message$id = message.id) !== null && _message$id !== void 0 ? _message$id : "msg-".concat(index);
702
- if (isStreaming) {
703
- if (streamingMessageIdRef.current !== message.id) {
704
- var _message$id2;
705
- streamingMessageIdRef.current = (_message$id2 = message.id) !== null && _message$id2 !== void 0 ? _message$id2 : null;
706
- Object.assign(streamingMessagePropsRef.current, message, {
707
- message: undefined
708
- }, {
709
- authUser: authUser,
710
- handleSelectOption: handleSelectOption,
711
- handleFeedback: handleFeedback,
712
- handleApprovalDecision: handleApprovalDecision,
713
- disableFeedback: messageFeedback,
714
- isStreaming: true,
715
- expanded: expanded
716
- });
717
- }
718
- return /*#__PURE__*/_jsx(MessageItem, _objectSpread({}, streamingMessagePropsRef.current), messageKey);
719
- }
720
- streamingMessageIdRef.current = null;
721
- return /*#__PURE__*/_createElement(MessageItem, _objectSpread(_objectSpread({}, message), {}, {
722
- key: messageKey,
723
- authUser: authUser,
724
- handleSelectOption: handleSelectOption,
725
- handleFeedback: handleFeedback,
726
- handleApprovalDecision: handleApprovalDecision,
727
- disableFeedback: messageFeedback,
728
- isStreaming: false,
729
- expanded: expanded
730
- }));
731
- })
610
+ }), messages.map(function (message, index) {
611
+ var _message$attachments, _message$sources, _message$project;
612
+ if (!((_message$attachments = message.attachments) !== null && _message$attachments !== void 0 && _message$attachments.length || (_message$sources = message.sources) !== null && _message$sources !== void 0 && _message$sources.length) && !message.message && !((_message$project = message.project) !== null && _message$project !== void 0 && _message$project.name) && !message.approval) return null;
613
+ var messageFeedback = (message === null || message === void 0 ? void 0 : message.wasHelpful) === undefined || message.wasHelpful === null ? null : message.wasHelpful ? Feedback.THUMBS_UP : Feedback.THUMBS_DOWN;
614
+ var isAssistantMessage = message.role === ChatHistoryRole.ASSISTANT || message.user.id === 'assistant';
615
+ var isLastMessage = index === messages.length - 1;
616
+ var isStreaming = isAssistantMessage && isLastMessage && (waitingResponse || isWriting);
617
+ return /*#__PURE__*/_createElement(MessageItem, _objectSpread(_objectSpread({}, message), {}, {
618
+ key: message.id != null ? "".concat(message.id, "-").concat(message.date) : "msg-".concat(index),
619
+ authUser: authUser,
620
+ handleSelectOption: handleSelectOption,
621
+ handleFeedback: handleFeedback,
622
+ handleApprovalDecision: handleApprovalDecision,
623
+ disableFeedback: messageFeedback,
624
+ isStreaming: isStreaming,
625
+ expanded: expanded
626
+ }));
732
627
  }), (waitingResponse || loadingMessage || Object.keys(activeLoadings || {}).length > 0) && /*#__PURE__*/_jsxs(SCLoadingMessagesColumn, {
733
628
  children: [(waitingResponse || loadingMessage) && /*#__PURE__*/_jsx(LoadingText, {
734
629
  text: loadingMessage || (isWebSearchActive ? 'Buscando en la web' : isDeepSearchActive ? t('chat.generatingDeepSearch') : hasAttachments ? t('chat.generatingAttachment') : t('chat.generating'))
@@ -742,9 +637,6 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref8) {
742
637
  })]
743
638
  })]
744
639
  });
745
- if (loadingMessages) {
746
- return /*#__PURE__*/_jsx(Loader, {});
747
- }
748
640
  return /*#__PURE__*/_jsxs(SCMessagesOuter, {
749
641
  $scrollOnParent: isScrollOnParent,
750
642
  children: [isScrollOnParent ? /*#__PURE__*/_jsx(SCMessagesScroll, {
@@ -767,8 +659,8 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref8) {
767
659
  width: "20px",
768
660
  height: "20px"
769
661
  })
770
- })]
662
+ }), loadingMessages && /*#__PURE__*/_jsx(Loader, {})]
771
663
  });
772
664
  };
773
665
  export var ChatAIMessages = /*#__PURE__*/React.memo(ChatAIMessagesInner);
774
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIm1lbW8iLCJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsInVzZVJlZiIsInVzZVN0YXRlIiwiY3JlYXRlRWxlbWVudCIsIl9jcmVhdGVFbGVtZW50IiwiU3RyZWFtZG93biIsImNyZWF0ZUNvZGVQbHVnaW4iLCJBcnJvd1NtYWxsRG93biIsIkF0dGFjaG1lbnRDYXJkIiwiQXBwcm92YWxCb3giLCJBdHRhY2htZW50UHJldmlld01vZGFsIiwiQXR0YWNobWVudENhcmRBdWRpbyIsIkNoYXRIaXN0b3J5Um9sZSIsInVzZVVzZXIiLCJ1c2VUIiwidXNlQ2hhdE1hbmFnZXIiLCJ1c2VUYXNrUGFuZWwiLCJMb2FkaW5nVGV4dCIsIkxvYWRlciIsIk1lc3NhZ2VGcm9tVXNlciIsIk1lc3NhZ2VGcm9tT3RoZXIiLCJNZXNzYWdlQ29udGVudEZyb21Vc2VyIiwiTWVzc2FnZUNvbnRlbnRGcm9tT3RoZXIiLCJNZXNzYWdlRmVlZGJhY2siLCJTQ0NBSU1lc3NhZ2VXcmFwcGVyIiwiU2Nyb2xsVG9Cb3R0b21CdXR0b24iLCJTQ01lc3NhZ2VzT3V0ZXIiLCJTQ01lc3NhZ2VzU2Nyb2xsIiwiU0NNZXNzYWdlc0lubmVyIiwiU0NMb2FkaW5nTWVzc2FnZXNDb2x1bW4iLCJTQ09wdGlvbnNMaXN0IiwiU0NPcHRpb25JdGVtIiwiU0NBc3Npc3RhbnRNZXNzYWdlSGVhZGVyIiwiU0NBc3Npc3RhbnROYW1lIiwiU0NBc3Npc3RhbnRBdmF0YXIiLCJTQ1Rhc2tMaW5rIiwiU0NNZXNzYWdlSXRlbVdyYXBwZXIiLCJTQ01lc3NhZ2VJdGVtSW5uZXIiLCJTQ0F0dGFjaG1lbnRzUm93IiwiU0NBcHByb3ZhbEFjdGlvbnNDb2x1bW4iLCJGZWVkYmFjayIsInVzZUdsb2JhbENvbnRleHQiLCJNQUlBSXNvbG9nbyIsIlRBU0tfVVJMX1JFR0VYX1BBVFRFUk4iLCJqc3giLCJfanN4IiwianN4cyIsIl9qc3hzIiwiRnJhZ21lbnQiLCJfRnJhZ21lbnQiLCJTdHJlYW1pbmdNZXNzYWdlQ29udGV4dCIsImNyZWF0ZUNvbnRleHQiLCJjb2RlIiwidGhlbWVzIiwiQXNzaXN0YW50QXZhdGFySW5uZXIiLCJfdXNlR2xvYmFsQ29udGV4dCIsImFnZW50IiwiY2hpbGRyZW4iLCJ0eXBlIiwid2lkdGgiLCJoZWlnaHQiLCJlbW9qaSIsIkFzc2lzdGFudEF2YXRhciIsIk1lc3NhZ2VXcmFwcGVyIiwiX3JlZiIsImlzQ3VycmVudFVzZXIiLCJwcm9wcyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllcyIsIl9leGNsdWRlZCIsIk1lc3NhZ2VDb21wb25lbnQiLCJfb2JqZWN0U3ByZWFkIiwiTWVzc2FnZUNvbnRlbnRXcmFwcGVyIiwiX3JlZjIiLCJfZXhjbHVkZWQyIiwiTWVzc2FnZUNvbnRlbnRDb21wb25lbnQiLCJNZXNzYWdlT3B0aW9ucyIsIl9yZWYzIiwib3B0aW9ucyIsImhhbmRsZVNlbGVjdE9wdGlvbiIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsInNlbGVjdGVkT3B0aW9uIiwic2V0U2VsZWN0ZWRPcHRpb24iLCJoYW5kbGVTZWxlY3QiLCJvcHRpb24iLCJtYXAiLCIkaGFzU2VsZWN0aW9uIiwiJGRpbW1lZCIsImlkIiwib25DbGljayIsIm5hbWUiLCJBc3Npc3RhbnRNZXNzYWdlSGVhZGVyIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJsb2NhbEFnZW50Iiwic2V0TG9jYWxBZ2VudCIsIl91c2VHbG9iYWxDb250ZXh0MiIsImdldFRhYlNlZ21lbnRGcm9tSHJlZiIsImhyZWYiLCJtYXRjaCIsInRlc3QiLCJleHRyYWN0VGFza3NGcm9tTWVzc2FnZSIsIm1lc3NhZ2UiLCJ0YXNrVXJsUmVnZXgiLCJSZWdFeHAiLCJ0YXNrcyIsInNlZW5JZHMiLCJTZXQiLCJleGVjIiwidGFza0lkIiwidXJsIiwiaGFzIiwiYWRkIiwiZXNjYXBlZFVybCIsInJlcGxhY2UiLCJtYXJrZG93bkxpbmtSZWdleCIsImNvbmNhdCIsImxpbmtNYXRjaCIsInRpdGxlIiwicHVzaCIsImhhc1Rhc2tMaW5rcyIsInRleHQiLCJsZW5ndGgiLCJUYXNrTGluayIsIl9yZWY0IiwidGFiU2VnbWVudCIsIl91c2VUYXNrUGFuZWwiLCJidWlsZE9wZW5UYXNrIiwib3BlblRhc2siLCJoYW5kbGVDbGljayIsImUiLCJtZXRhS2V5IiwiY3RybEtleSIsInByZXZlbnREZWZhdWx0IiwiQ3VzdG9tTGluayIsIl9yZWY1IiwicmVzdCIsIl9leGNsdWRlZDMiLCJ0YXNrTWF0Y2giLCJTdHJlYW1pbmdNZXNzYWdlQm9keSIsImZyb21Db250ZXh0IiwidXNlQ29udGV4dCIsImRpc3BsYXlUZXh0IiwiaXNTdHJlYW1pbmciLCJkZWJ1Z0NvdW50UmVmIiwid2luZG93IiwiTUFJQV9ERUJVR19TVFJFQU1JTkdfUkVOREVSIiwiY3VycmVudCIsImNvbnNvbGUiLCJsb2ciLCJjb3VudCIsImxlbiIsImlzRnJvbnRlbmRDYW5jZWxsZWQiLCJjbGFzc05hbWUiLCJpc0Fzc2lzdGFudCIsInBsdWdpbnMiLCJjb21wb25lbnRzIiwiYSIsImxpbmtTYWZldHkiLCJlbmFibGVkIiwiaXNBbmltYXRpbmciLCJzaGlraVRoZW1lIiwiY29udHJvbHMiLCJ0YWJsZSIsImlzRXJyb3IiLCJhcHByb3ZhbCIsImNvbnRlbnQiLCJzb3VyY2VzIiwiaGFuZGxlRmVlZGJhY2siLCJoYW5kbGVGZWVkYmFja0NsaWNrIiwiZGlzYWJsZUZlZWRiYWNrIiwiTWVzc2FnZUl0ZW0iLCJfbWVzc2FnZSRsZW5ndGgiLCJfcmVmNiIsIl9yZWY3IiwidXNlciIsImF1dGhVc2VyIiwiaXNDaGFuZ2VQcm9qZWN0IiwiaGFuZGxlQXBwcm92YWxEZWNpc2lvbiIsInJvbGUiLCJhdHRhY2htZW50cyIsImFwcHJvdmFsU3RhdHVzIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJwcmV2aWV3QXR0YWNobWVudCIsInNldFByZXZpZXdBdHRhY2htZW50IiwiVVNFUiIsInRvU3RyaW5nIiwiQVNTSVNUQU5UIiwicmVuZGVyQ291bnRSZWYiLCJwcmV2TWVzc2FnZUxlblJlZiIsIl9tZXNzYWdlJGxlbmd0aDIiLCJwcmV2TGVuIiwibWVzc2FnZUlkIiwicmVuZGVyQ291bnQiLCJtZXNzYWdlTGVuIiwicHJldk1lc3NhZ2VMZW4iLCJoYW5kbGVBdHRhY2htZW50Q2xpY2siLCJhdHRhY2htZW50IiwiZmlsZSIsIkZpbGUiLCJvcmlnaW5hbEZpbGUiLCJ1cmxfdGh1bWJuYWlsIiwidXJsX29yaWdpbmFsIiwidXJsX2ZpbGUiLCJoYW5kbGVDbG9zZVByZXZpZXciLCJoYXNGZWVkYmFjayIsIiRpc0Fzc2lzdGFudCIsIm1lc3NhZ2VFeHRyYUNvbnRlbnQiLCJmZWVkYmFjayIsInNlc3Npb25JZCIsInNwbGl0IiwiZmlsdGVyIiwicXVlc3Rpb25JZCIsImpvaW4iLCJpbmRleCIsIl9hdHRhY2htZW50JHR5cGUiLCJfYXR0YWNobWVudCRuYW1lIiwiYXR0YWNobWVudFR5cGUiLCJ0b0xvd2VyQ2FzZSIsImF0dGFjaG1lbnROYW1lIiwiaXNBdWRpb0ZpbGUiLCJzdGFydHNXaXRoIiwiaW5jbHVkZXMiLCJzb21lIiwiZXh0IiwiZW5kc1dpdGgiLCJwb3NpdGlvbkluZGV4IiwicGVuZGluZ19hY3Rpb25zIiwiYWN0aW9uIiwiX3Byb3BzJHByb2plY3RNZXRhZGF0Iiwic3RhdHVzIiwib25BcHByb3ZlIiwidGhyZWFkSWQiLCJvblJlamVjdCIsImlzUHJvamVjdERlbGV0ZWQiLCJwcm9qZWN0TWV0YWRhdGEiLCJpc19kZWxldGVkIiwiaXNFeHBhbmRlZCIsImV4cGFuZGVkIiwidGhyZWFkX2lkIiwidG9vbF9jYWxsX2lkIiwiaXNPcGVuIiwib25DbG9zZSIsIkNoYXRBSU1lc3NhZ2VzSW5uZXIiLCJfcmVmOCIsIl9sYXN0TXNnJHVzZXIiLCJfbGFzdE1zZyRtZXNzYWdlMiIsInVzZXJJbml0aWFsTWVzc2FnZSIsImluaXRpYWxDaGF0SWQiLCJvbkVycm9yIiwib25TZW5kTWVzc2FnZVJlYWR5Iiwib25TY3JvbGxUb0JvdHRvbSIsImFnZW50cyIsIl91c2VUIiwidCIsIl91c2VHbG9iYWxDb250ZXh0MyIsImlzV2ViU2VhcmNoQWN0aXZlIiwiaXNEZWVwU2VhcmNoQWN0aXZlIiwibWVzc2FnZXNSZWYiLCJjaGF0SW5pdGlhbGl6ZWRSZWYiLCJpc0xvYWRpbmdNb3JlUmVmIiwidXNlclNjcm9sbGluZ1JlZiIsInNjcm9sbFRocmVzaG9sZFJlZiIsImxhc3RTY3JvbGxUb3BSZWYiLCJzaG93U2Nyb2xsVG9Cb3R0b21SZWYiLCJzY3JvbGxSYWZSZWYiLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsInNob3dTY3JvbGxUb0JvdHRvbSIsInNldFNob3dTY3JvbGxUb0JvdHRvbSIsInN0cmVhbWluZ01lc3NhZ2VQcm9wc1JlZiIsInN0cmVhbWluZ01lc3NhZ2VJZFJlZiIsIl91c2VDaGF0TWFuYWdlciIsImNoYXRJZCIsInVuZGVmaW5lZCIsIm1lc3NhZ2VzIiwibG9hZGluZ01lc3NhZ2VzIiwiaXNMb2FkaW5nTW9yZU1lc3NhZ2VzIiwid2FpdGluZ1Jlc3BvbnNlIiwiaXNXcml0aW5nIiwibG9hZGluZ01lc3NhZ2UiLCJhY3RpdmVMb2FkaW5ncyIsInNlbmRNZXNzYWdlIiwiY2hhbmdlUHJvamVjdCIsImluaXRpYWxpemVDaGF0IiwiaGFuZGxlU2Nyb2xsIiwic3RvcEdlbmVyYXRpb24iLCJoYW5kbGVDbGlja1Njcm9sbFRvQm90dG9tIiwic2Nyb2xsVG8iLCJ0b3AiLCJzY3JvbGxIZWlnaHQiLCJiZWhhdmlvciIsInNldFRpbWVvdXQiLCJfbWVzc2FnZXNSZWYkY3VycmVudCIsInNjcm9sbFRvcCIsImNsaWVudEhlaWdodCIsImRpc3RhbmNlRnJvbUJvdHRvbSIsInNob3VsZFNob3ciLCJoYW5kbGVTY3JvbGxUb0JvdHRvbSIsImNvbnRhaW5lciIsImN1cnJlbnRUYXJnZXQiLCJjYW5jZWxBbmltYXRpb25GcmFtZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImlzU2Nyb2xsaW5nVXAiLCJpc05lYXJCb3R0b20iLCJkaWRTZXRTdGF0ZSIsInNlbmRNZXNzYWdlUmVmIiwic3RvcEdlbmVyYXRpb25SZWYiLCJvblNlbmRNZXNzYWdlUmVhZHlSZWYiLCJsYXN0TWVzc2FnZSIsImhhc0FwcHJvdmFsIiwiaXNBdEJvdHRvbSIsInNjcm9sbFRvQm90dG9tIiwiX21lc3NhZ2VzUmVmJGN1cnJlbnQyIiwiaXNOZXdBbnN3ZXJNZXNzYWdlIiwiaXNOZXdVc2VyTWVzc2FnZSIsImlzTmV3QXBwcm92YWxNZXNzYWdlIiwiaGFzTWVzc2FnZXMiLCJpc05vdEluaXRpYWxNZXNzYWdlIiwibXNnIiwic2Nyb2xsRGVsYXkiLCJkb1Njcm9sbCIsIl9tZXNzYWdlc1JlZiRjdXJyZW50MyIsIl9tZXNzYWdlc1JlZiRjdXJyZW50NCIsImxhc3RVc2VyTWVzc2FnZSIsImF0IiwiaGFzQXR0YWNobWVudHMiLCJBcnJheSIsImlzQXJyYXkiLCJpc1Njcm9sbE9uUGFyZW50IiwibGlzdFJlbmRlckNvdW50UmVmIiwiX2xhc3RNc2ckaWQiLCJfbGFzdE1zZyRtZXNzYWdlJGxlbmciLCJfbGFzdE1zZyRtZXNzYWdlIiwibGFzdE1zZyIsImxhc3RLZXkiLCJsYXN0TWVzc2FnZUtleSIsImxhc3RNZXNzYWdlTGVuIiwibWVzc2FnZXNDb3VudCIsImV4cGFuZGVkUmVmIiwic2F2ZWRTY3JvbGxUb3AiLCJpc1N0cmVhbWluZ0FjdGl2ZSIsInN0cmVhbWluZ1RleHQiLCJtZXNzYWdlc0NvbnRlbnQiLCJQcm92aWRlciIsInZhbHVlIiwiX21lc3NhZ2UkYXR0YWNobWVudHMiLCJfbWVzc2FnZSRzb3VyY2VzIiwiX21lc3NhZ2UkcHJvamVjdCIsIl9tZXNzYWdlJGlkIiwicHJvamVjdCIsIm1lc3NhZ2VGZWVkYmFjayIsIndhc0hlbHBmdWwiLCJUSFVNQlNfVVAiLCJUSFVNQlNfRE9XTiIsImlzQXNzaXN0YW50TWVzc2FnZSIsImlzTGFzdE1lc3NhZ2UiLCJtZXNzYWdlS2V5IiwiX21lc3NhZ2UkaWQyIiwiT2JqZWN0IiwiYXNzaWduIiwia2V5Iiwia2V5cyIsImVudHJpZXMiLCJfcmVmOSIsIl9yZWYwIiwiJHNjcm9sbE9uUGFyZW50IiwicmVmIiwib25TY3JvbGwiLCJjb2xvciIsIkNoYXRBSU1lc3NhZ2VzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9sZWN1bGVzL0NoYXRBSU1lc3NhZ2VzL0NoYXRBSU1lc3NhZ2VzLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9pbmRlbnQgKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L25vLXVuc3RhYmxlLW5lc3RlZC1jb21wb25lbnRzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tc2hhZG93ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1uZXN0ZWQtdGVybmFyeSAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L2Z1bmN0aW9uLWNvbXBvbmVudC1kZWZpbml0aW9uICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9yZXF1aXJlLWRlZmF1bHQtcHJvcHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L2NsaWNrLWV2ZW50cy1oYXZlLWtleS1ldmVudHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L25vLXN0YXRpYy1lbGVtZW50LWludGVyYWN0aW9ucyAqL1xuaW1wb3J0IFJlYWN0LCB7IEZDLCBtZW1vLCBSZWFjdE5vZGUsIHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUxheW91dEVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgU3RyZWFtZG93biB9IGZyb20gJ3N0cmVhbWRvd24nXG5pbXBvcnQgeyBjcmVhdGVDb2RlUGx1Z2luIH0gZnJvbSAnQHN0cmVhbWRvd24vY29kZSdcbmltcG9ydCB7IEFycm93U21hbGxEb3duIH0gZnJvbSAnQHByb2plY3Rjb3IvaWNvbnMvbGliL2NvbXBvbmVudHMvQXJyb3dTbWFsbERvd24nXG5cbmltcG9ydCB7IEF0dGFjaG1lbnRDYXJkIH0gZnJvbSAnLi4vLi4vYXRvbXMvQXR0YWNobWVudENhcmQvQXR0YWNobWVudENhcmQnXG5pbXBvcnQgeyBBcHByb3ZhbEJveCB9IGZyb20gJy4uLy4uL2F0b21zL0FwcHJvdmFsQm94L0FwcHJvdmFsQm94J1xuaW1wb3J0IHsgQXR0YWNobWVudFByZXZpZXdNb2RhbCB9IGZyb20gJy4uLy4uL2F0b21zL0F0dGFjaG1lbnRQcmV2aWV3TW9kYWwnXG5pbXBvcnQgeyBBdHRhY2htZW50Q2FyZEF1ZGlvIH0gZnJvbSAnLi4vLi4vYXRvbXMvQXR0YWNobWVudENhcmQvQXR0YWNobWVudENhcmRBdWRpbydcbmltcG9ydCB7IE1BSUFNZXNzYWdlUHJvcHMgfSBmcm9tICcuLi8uLi9hdG9tcy9NQUlBTWVzc2FnZS9NQUlBTWVzc2FnZS5pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2UsIENoYXRIaXN0b3J5Um9sZSwgVGFza0luZm8gfSBmcm9tICcuLi8uLi8uLi90eXBlcy9DaGF0J1xuXG5pbXBvcnQgeyBDT1JVc2VyLCB1c2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9jb3ItdXNlcidcblxuaW1wb3J0IHsgdXNlVCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVQnXG5pbXBvcnQgeyB1c2VDaGF0TWFuYWdlciB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUNoYXRNYW5hZ2VyL3VzZUNoYXRNYW5hZ2VyJ1xuaW1wb3J0IHsgdXNlVGFza1BhbmVsIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlVGFza1BhbmVsJ1xuXG5pbXBvcnQgeyBMb2FkaW5nVGV4dCB9IGZyb20gJy4uLy4uL2F0b21zL0xvYWRpbmdUZXh0J1xuaW1wb3J0IHsgTG9hZGVyIH0gZnJvbSAnLi4vLi4vYXRvbXMvTG9hZGVyJ1xuXG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvUHJvamVjdCdcblxuaW1wb3J0IHsgTWVzc2FnZUZyb21Vc2VyLCBNZXNzYWdlRnJvbU90aGVyLCBNZXNzYWdlQ29udGVudEZyb21Vc2VyLCBNZXNzYWdlQ29udGVudEZyb21PdGhlciB9IGZyb20gJy4vc3R5bGVzJ1xuaW1wb3J0IHsgTWVzc2FnZUZlZWRiYWNrIH0gZnJvbSAnLi4vTWVzc2FnZUZlZWRiYWNrJ1xuaW1wb3J0IHtcbiAgU0NDQUlNZXNzYWdlV3JhcHBlcixcbiAgU2Nyb2xsVG9Cb3R0b21CdXR0b24sXG4gIFNDTWVzc2FnZXNPdXRlcixcbiAgU0NNZXNzYWdlc1Njcm9sbCxcbiAgU0NNZXNzYWdlc0lubmVyLFxuICBTQ0xvYWRpbmdNZXNzYWdlc0NvbHVtbixcbiAgU0NPcHRpb25zTGlzdCxcbiAgU0NPcHRpb25JdGVtLFxuICBTQ0Fzc2lzdGFudE1lc3NhZ2VIZWFkZXIsXG4gIFNDQXNzaXN0YW50TmFtZSxcbiAgU0NBc3Npc3RhbnRBdmF0YXIsXG4gIFNDVGFza0xpbmssXG4gIFNDTWVzc2FnZUl0ZW1XcmFwcGVyLFxuICBTQ01lc3NhZ2VJdGVtSW5uZXIsXG4gIFNDQXR0YWNobWVudHNSb3csXG4gIFNDQXBwcm92YWxBY3Rpb25zQ29sdW1uLFxufSBmcm9tICcuL25ld1N0eWxlcydcbmltcG9ydCB7IEZlZWRiYWNrIH0gZnJvbSAnLi4vTWVzc2FnZUZlZWRiYWNrL01lc3NhZ2VGZWVkYmFjaydcbmltcG9ydCB7IHVzZUdsb2JhbENvbnRleHQgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2dsb2JhbC1jb250ZXh0J1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9hZ2VudCdcbmltcG9ydCB7IEF0dGFjaG1lbnRGaWxlIH0gZnJvbSAnLi4vQ2hhdEZvb3Rlci9DaGF0Rm9vdGVyJ1xuaW1wb3J0IHsgTUFJQUlzb2xvZ28gfSBmcm9tICcuLi8uLi9hdG9tcy9pY29ucydcbmltcG9ydCB7IFRBU0tfVVJMX1JFR0VYX1BBVFRFUk4gfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvdGFza1VybHMnXG5cbi8qKiBDb250ZXh0byBjb24gZWwgdGV4dG8gZGVsIG1lbnNhamUgZW4gc3RyZWFtaW5nLiBTb2xvIGVsIGNvbXBvbmVudGUgcXVlIGxvIGNvbnN1bWUgcmUtcmVuZGVyaXphIGN1YW5kbyBjYW1iaWEuICovXG5jb25zdCBTdHJlYW1pbmdNZXNzYWdlQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQ8c3RyaW5nPignJylcblxuY29uc3QgY29kZSA9IGNyZWF0ZUNvZGVQbHVnaW4oeyB0aGVtZXM6IFsnZ2l0aHViLWxpZ2h0JywgJ2dpdGh1Yi1saWdodCddIH0pXG5cbmNvbnN0IEFzc2lzdGFudEF2YXRhcklubmVyOiBGQyA9ICgpID0+IHtcbiAgY29uc3QgeyBhZ2VudCB9ID0gdXNlR2xvYmFsQ29udGV4dCgpXG4gIHJldHVybiAoXG4gICAgPFNDQXNzaXN0YW50QXZhdGFyPlxuICAgICAge2FnZW50Py50eXBlID09PSAnY2xvbmUnID8gPE1BSUFJc29sb2dvIHdpZHRoPXsxOH0gaGVpZ2h0PXsxOH0gLz4gOiBhZ2VudD8uZW1vaml9XG4gICAgPC9TQ0Fzc2lzdGFudEF2YXRhcj5cbiAgKVxufVxuXG5jb25zdCBBc3Npc3RhbnRBdmF0YXIgPSBtZW1vKEFzc2lzdGFudEF2YXRhcklubmVyKVxuXG50eXBlIENoYXRBSU1lc3NhZ2VzUHJvcHMgPSB7XG4gIHVzZXJJbml0aWFsTWVzc2FnZTogeyBtZXNzYWdlOiBzdHJpbmc7IGF0dGFjaG1lbnRzOiBBdHRhY2htZW50RmlsZVtdOyBmYXFJZD86IHN0cmluZyB9XG4gIGluaXRpYWxDaGF0SWQ6IHN0cmluZyB8IG51bGxcbiAgb25FcnJvcjogKCkgPT4gdm9pZFxuICBvblNlbmRNZXNzYWdlUmVhZHk/OiAoXG4gICAgc2VuZE1lc3NhZ2U6IChtZXNzYWdlOiBzdHJpbmcsIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSwgZmFxSWQ/OiBzdHJpbmcpID0+IHZvaWQsXG4gICAgc3RvcEdlbmVyYXRpb246ICgpID0+IHZvaWQsXG4gICAgaXNTdHJlYW1pbmc6IGJvb2xlYW4sXG4gICAgaXNXcml0aW5nOiBib29sZWFuXG4gICkgPT4gdm9pZFxuICBpc0Rpc2FibGVkPzogYm9vbGVhblxuICBvblNjcm9sbFRvQm90dG9tPzogKCkgPT4gdm9pZFxuICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW11cbiAgYWdlbnRzPzogQWdlbnRbXVxuICBleHBhbmRlZD86IGJvb2xlYW5cbn1cblxudHlwZSBNZXNzYWdlSXRlbVByb3BzID0gQ2hhdE1lc3NhZ2UgJiB7XG4gIGF1dGhVc2VyOiBDT1JVc2VyXG4gIGhhbmRsZVNlbGVjdE9wdGlvbjogKG9wdGlvbjogUHJvamVjdCkgPT4gdm9pZFxuICBoYW5kbGVGZWVkYmFjazogKGZlZWRiYWNrOiBGZWVkYmFjaywgY2hhdE1lc3NhZ2VJZDogc3RyaW5nKSA9PiB2b2lkXG4gIGhhbmRsZUFwcHJvdmFsRGVjaXNpb246ICh0aHJlYWRJZDogc3RyaW5nLCBkZWNpc2lvbjogJ2FwcHJvdmUnIHwgJ3JlamVjdCcpID0+IHZvaWRcbiAgZGlzYWJsZUZlZWRiYWNrPzogRmVlZGJhY2sgfCBudWxsXG4gIHNvdXJjZXM/OiBhbnlcbiAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdXG4gIGlzU3RyZWFtaW5nPzogYm9vbGVhblxuICBleHBhbmRlZD86IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIE1lc3NhZ2VXcmFwcGVyUHJvcHMge1xuICBpc0N1cnJlbnRVc2VyOiBib29sZWFuXG4gIGNoaWxkcmVuOiBSZWFjdE5vZGVcbiAgJ2RhdGEtbWVzc2FnZS1pZCc/OiBzdHJpbmdcbiAgaGFzRmVlZGJhY2s/OiBib29sZWFuXG59XG5cbnR5cGUgTWVzc2FnZUNvbnRlbnRXcmFwcGVyUHJvcHMgPSBNQUlBTWVzc2FnZVByb3BzICYge1xuICBpc0N1cnJlbnRVc2VyOiBib29sZWFuXG4gIGlzRXJyb3I/OiBib29sZWFuXG4gIGlzQ2hhbmdlUHJvamVjdD86IGJvb2xlYW5cbn1cblxuY29uc3QgTWVzc2FnZVdyYXBwZXI6IEZDPE1lc3NhZ2VXcmFwcGVyUHJvcHM+ID0gKHsgaXNDdXJyZW50VXNlciwgY2hpbGRyZW4sIC4uLnByb3BzIH0pID0+IHtcbiAgY29uc3QgTWVzc2FnZUNvbXBvbmVudCA9IGlzQ3VycmVudFVzZXIgPyBNZXNzYWdlRnJvbVVzZXIgOiBNZXNzYWdlRnJvbU90aGVyXG4gIHJldHVybiA8TWVzc2FnZUNvbXBvbmVudCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L01lc3NhZ2VDb21wb25lbnQ+XG59XG5cbmNvbnN0IE1lc3NhZ2VDb250ZW50V3JhcHBlcjogRkM8TWVzc2FnZUNvbnRlbnRXcmFwcGVyUHJvcHM+ID0gKHsgaXNDdXJyZW50VXNlciwgLi4ucHJvcHMgfSkgPT4ge1xuICBjb25zdCBNZXNzYWdlQ29udGVudENvbXBvbmVudCA9IGlzQ3VycmVudFVzZXIgPyBNZXNzYWdlQ29udGVudEZyb21Vc2VyIDogTWVzc2FnZUNvbnRlbnRGcm9tT3RoZXJcbiAgcmV0dXJuIDxNZXNzYWdlQ29udGVudENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIE1lc3NhZ2VPcHRpb25zKHtcbiAgb3B0aW9ucyxcbiAgaGFuZGxlU2VsZWN0T3B0aW9uLFxufToge1xuICBvcHRpb25zOiBQcm9qZWN0W10gfCBudWxsXG4gIGhhbmRsZVNlbGVjdE9wdGlvbjogKG9wdGlvbjogUHJvamVjdCkgPT4gdm9pZFxufSkge1xuICBjb25zdCBbc2VsZWN0ZWRPcHRpb24sIHNldFNlbGVjdGVkT3B0aW9uXSA9IHVzZVN0YXRlPFByb2plY3QgfCBudWxsPihudWxsKVxuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdCA9IChvcHRpb246IFByb2plY3QpID0+IHtcbiAgICBpZiAoc2VsZWN0ZWRPcHRpb24pIHJldHVyblxuICAgIHNldFNlbGVjdGVkT3B0aW9uKG9wdGlvbilcbiAgICBoYW5kbGVTZWxlY3RPcHRpb24ob3B0aW9uKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8U0NPcHRpb25zTGlzdD5cbiAgICAgIHsob3B0aW9ucyB8fCBbXSkubWFwKG9wdGlvbiA9PiAoXG4gICAgICAgIDxTQ09wdGlvbkl0ZW1cbiAgICAgICAgICAkaGFzU2VsZWN0aW9uPXshIXNlbGVjdGVkT3B0aW9ufVxuICAgICAgICAgICRkaW1tZWQ9eyEhc2VsZWN0ZWRPcHRpb24gJiYgc2VsZWN0ZWRPcHRpb24/LmlkICE9PSBvcHRpb24uaWR9XG4gICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlU2VsZWN0KG9wdGlvbil9XG4gICAgICAgICAga2V5PXtvcHRpb24uaWR9XG4gICAgICAgID5cbiAgICAgICAgICB7b3B0aW9uLm5hbWV9XG4gICAgICAgIDwvU0NPcHRpb25JdGVtPlxuICAgICAgKSl9XG4gICAgPC9TQ09wdGlvbnNMaXN0PlxuICApXG59XG5cbmNvbnN0IEFzc2lzdGFudE1lc3NhZ2VIZWFkZXIgPSAoKSA9PiB7XG4gIGNvbnN0IFtsb2NhbEFnZW50LCBzZXRMb2NhbEFnZW50XSA9IHVzZVN0YXRlPEFnZW50IHwgbnVsbD4obnVsbClcbiAgY29uc3QgeyBhZ2VudCB9ID0gdXNlR2xvYmFsQ29udGV4dCgpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXRMb2NhbEFnZW50KGFnZW50KVxuICB9LCBbYWdlbnRdKVxuXG4gIHJldHVybiAoXG4gICAgPFNDQXNzaXN0YW50TWVzc2FnZUhlYWRlcj5cbiAgICAgIDxBc3Npc3RhbnRBdmF0YXIgLz5cbiAgICAgIHtsb2NhbEFnZW50Py5uYW1lICYmIChcbiAgICAgICAgPFNDQXNzaXN0YW50TmFtZT57bG9jYWxBZ2VudD8udHlwZSA9PT0gJ2Nsb25lJyA/ICdNQUlBJyA6IGxvY2FsQWdlbnQ/Lm5hbWV9PC9TQ0Fzc2lzdGFudE5hbWU+XG4gICAgICApfVxuICAgIDwvU0NBc3Npc3RhbnRNZXNzYWdlSGVhZGVyPlxuICApXG59XG5cbi8vIEV4dHJhZSBlbCBzZWdtZW50byBkZSB0YWIgKGRldGFpbHxtZXNzYWdlfG1lc3NhZ2VzfGZpbGVzfGhpc3Rvcnl8aG91cnMpIGRlbCBocmVmIHBhcmEgYWJyaXIgZWwgbW9kYWwgY29uIGVsIHRhYiBjb3JyZWN0b1xuY29uc3QgZ2V0VGFiU2VnbWVudEZyb21IcmVmID0gKGhyZWY6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IG1hdGNoID0gaHJlZi5tYXRjaCgvXFwvdGFza3NcXC9cXGQrXFwvKFteLz9dKykvKVxuICByZXR1cm4gbWF0Y2ggJiYgL14oZGV0YWlsfG1lc3NhZ2V8bWVzc2FnZXN8ZmlsZXN8aGlzdG9yeXxob3VycykkLy50ZXN0KG1hdGNoWzFdKSA/IG1hdGNoWzFdIDogJ2RldGFpbCdcbn1cblxuLyoqIEV4dHJhZSBsYXMgdGFyZWFzIGVubGF6YWRhcyBlbiBlbCB0ZXh0byAoVVJMcyBxdWUgY29pbmNpZGVuIGNvbiBUQVNLX1VSTF9SRUdFWF9QQVRURVJOKS4gKi9cbmNvbnN0IGV4dHJhY3RUYXNrc0Zyb21NZXNzYWdlID0gKG1lc3NhZ2U6IHN0cmluZyk6IFRhc2tJbmZvW10gPT4ge1xuICBpZiAoIW1lc3NhZ2UpIHJldHVybiBbXVxuICBjb25zdCB0YXNrVXJsUmVnZXggPSBuZXcgUmVnRXhwKFRBU0tfVVJMX1JFR0VYX1BBVFRFUk4sICdnJylcbiAgY29uc3QgdGFza3M6IFRhc2tJbmZvW10gPSBbXVxuICBjb25zdCBzZWVuSWRzID0gbmV3IFNldDxzdHJpbmc+KClcbiAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsID0gbnVsbFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uZC1hc3NpZ25cbiAgd2hpbGUgKChtYXRjaCA9IHRhc2tVcmxSZWdleC5leGVjKG1lc3NhZ2UpKSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHRhc2tJZCA9IG1hdGNoWzFdXG4gICAgY29uc3QgdXJsID0gbWF0Y2hbMF1cbiAgICBpZiAoIXNlZW5JZHMuaGFzKHRhc2tJZCkpIHtcbiAgICAgIHNlZW5JZHMuYWRkKHRhc2tJZClcbiAgICAgIGNvbnN0IGVzY2FwZWRVcmwgPSB1cmwucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKVxuICAgICAgY29uc3QgbWFya2Rvd25MaW5rUmVnZXggPSBuZXcgUmVnRXhwKGBcXFxcWyhbXlxcXFxdXSspXFxcXF1cXFxcKCR7ZXNjYXBlZFVybH1cXFxcKWApXG4gICAgICBjb25zdCBsaW5rTWF0Y2ggPSBtZXNzYWdlLm1hdGNoKG1hcmtkb3duTGlua1JlZ2V4KVxuICAgICAgY29uc3QgdGl0bGUgPSBsaW5rTWF0Y2ggPyBsaW5rTWF0Y2hbMV0gOiBgVGFyZWEgIyR7dGFza0lkfWBcbiAgICAgIHRhc2tzLnB1c2goeyBpZDogdGFza0lkLCB0aXRsZSwgdXJsIH0pXG4gICAgfVxuICB9XG4gIHJldHVybiB0YXNrc1xufVxuXG5jb25zdCBoYXNUYXNrTGlua3MgPSAodGV4dDogc3RyaW5nKTogYm9vbGVhbiA9PiBleHRyYWN0VGFza3NGcm9tTWVzc2FnZSh0ZXh0KS5sZW5ndGggPiAwXG5cbi8vIENvbXBvbmVudCBmb3IgdGFzayBsaW5rcyB0aGF0IHVzZXMgdGhlIHVzZVRhc2tQYW5lbCBob29rXG5jb25zdCBUYXNrTGluazogRkM8eyBocmVmOiBzdHJpbmc7IHRhc2tJZDogc3RyaW5nOyBjaGlsZHJlbjogUmVhY3ROb2RlIH0+ID0gKHsgaHJlZiwgdGFza0lkLCBjaGlsZHJlbiB9KSA9PiB7XG4gIGNvbnN0IHRhYlNlZ21lbnQgPSBnZXRUYWJTZWdtZW50RnJvbUhyZWYoaHJlZilcbiAgY29uc3QgeyBidWlsZE9wZW5UYXNrIH0gPSB1c2VUYXNrUGFuZWwodGFza0lkLCB0YWJTZWdtZW50KVxuICBjb25zdCBvcGVuVGFzayA9IGJ1aWxkT3BlblRhc2soKVxuXG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gKGU6IFJlYWN0Lk1vdXNlRXZlbnQ8SFRNTEFuY2hvckVsZW1lbnQ+KSA9PiB7XG4gICAgLy8gU2kgZXMgQ21kL0N0cmwgKyBjbGljaywgZGVqYXIgcXVlIHNlIGFicmEgZW4gbnVldmEgcGVzdGHDsWEgKGNvbXBvcnRhbWllbnRvIHBvciBkZWZlY3RvKVxuICAgIGlmIChlLm1ldGFLZXkgfHwgZS5jdHJsS2V5KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICBvcGVuVGFzaygpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxTQ1Rhc2tMaW5rIGhyZWY9e2hyZWZ9IG9uQ2xpY2s9e2hhbmRsZUNsaWNrfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L1NDVGFza0xpbms+XG4gIClcbn1cblxuLy8gQ3VzdG9tIGxpbmsgY29tcG9uZW50IGZvciBTdHJlYW1kb3duOiB0YXNrIFVSTHMgb3BlbiB0aGUgdGFzayBwYW5lbCwgb3RoZXIgbGlua3MgcmVuZGVyIG5vcm1hbGx5XG50eXBlIEN1c3RvbUxpbmtQcm9wcyA9IFJlYWN0LkFuY2hvckhUTUxBdHRyaWJ1dGVzPEhUTUxBbmNob3JFbGVtZW50PiAmIHsgbm9kZT86IHVua25vd24gfVxuY29uc3QgQ3VzdG9tTGluazogRkM8Q3VzdG9tTGlua1Byb3BzPiA9ICh7IGhyZWYsIGNoaWxkcmVuLCAuLi5yZXN0IH0pID0+IHtcbiAgaWYgKCFocmVmIHx8IHR5cGVvZiBocmVmICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAoXG4gICAgICA8YSBocmVmPXtocmVmfSB7Li4ucmVzdH0+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDwvYT5cbiAgICApXG4gIH1cbiAgY29uc3QgdGFza01hdGNoID0gaHJlZi5tYXRjaChuZXcgUmVnRXhwKFRBU0tfVVJMX1JFR0VYX1BBVFRFUk4pKVxuICBpZiAodGFza01hdGNoKSB7XG4gICAgY29uc3QgdGFza0lkID0gdGFza01hdGNoWzFdXG4gICAgcmV0dXJuIChcbiAgICAgIDxUYXNrTGluayBocmVmPXtocmVmfSB0YXNrSWQ9e3Rhc2tJZH0+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDwvVGFza0xpbms+XG4gICAgKVxuICB9XG4gIHJldHVybiAoXG4gICAgPGEgaHJlZj17aHJlZn0gey4uLnJlc3R9PlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvYT5cbiAgKVxufVxuXG4vKiogU29sbyBlc3RlIGNvbXBvbmVudGUgcmUtcmVuZGVyaXphIGN1YW5kbyBjYW1iaWEgZWwgdGV4dG8gZW4gc3RyZWFtaW5nIChsZWUgZGVsIGNvbnRleHQpLiAqL1xuY29uc3QgU3RyZWFtaW5nTWVzc2FnZUJvZHkgPSBtZW1vKFxuICAocHJvcHM6IHtcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgICBpc1N0cmVhbWluZzogYm9vbGVhblxuICAgIGlzQ3VycmVudFVzZXI6IGJvb2xlYW5cbiAgICBpc0Fzc2lzdGFudDogYm9vbGVhblxuICAgIGlzRnJvbnRlbmRDYW5jZWxsZWQ/OiBib29sZWFuXG4gICAgYXBwcm92YWw/OiBNZXNzYWdlSXRlbVByb3BzWydhcHByb3ZhbCddXG4gICAgaXNFcnJvcj86IGJvb2xlYW5cbiAgICBzb3VyY2VzPzogTWVzc2FnZUl0ZW1Qcm9wc1snc291cmNlcyddXG4gICAgaGFuZGxlRmVlZGJhY2tDbGljazogKGY6IEZlZWRiYWNrKSA9PiB2b2lkXG4gICAgZGlzYWJsZUZlZWRiYWNrOiBGZWVkYmFjayB8IG51bGxcbiAgfSkgPT4ge1xuICAgIGNvbnN0IGZyb21Db250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChTdHJlYW1pbmdNZXNzYWdlQ29udGV4dClcbiAgICBjb25zdCBkaXNwbGF5VGV4dCA9IHByb3BzLmlzU3RyZWFtaW5nID8gZnJvbUNvbnRleHQgOiBwcm9wcy5tZXNzYWdlXG4gICAgY29uc3QgZGVidWdDb3VudFJlZiA9IFJlYWN0LnVzZVJlZigwKVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAod2luZG93IGFzIGFueSkuTUFJQV9ERUJVR19TVFJFQU1JTkdfUkVOREVSICYmIHByb3BzLmlzU3RyZWFtaW5nKSB7XG4gICAgICBkZWJ1Z0NvdW50UmVmLmN1cnJlbnQgKz0gMVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKCdbU3RyZWFtaW5nTWVzc2FnZUJvZHldIHJlbmRlcicsIHsgY291bnQ6IGRlYnVnQ291bnRSZWYuY3VycmVudCwgbGVuOiBkaXNwbGF5VGV4dD8ubGVuZ3RoIH0pXG4gICAgfVxuICAgIGlmICghZGlzcGxheVRleHQgJiYgIXByb3BzLmlzU3RyZWFtaW5nKSByZXR1cm4gbnVsbFxuICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgICA8U0NDQUlNZXNzYWdlV3JhcHBlclxuICAgICAgICAgIGlzQ3VycmVudFVzZXI9e3Byb3BzLmlzQ3VycmVudFVzZXJ9XG4gICAgICAgICAgaXNGcm9udGVuZENhbmNlbGxlZD17cHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZH1cbiAgICAgICAgICBjbGFzc05hbWU9e3Byb3BzLmlzQXNzaXN0YW50ICYmIGhhc1Rhc2tMaW5rcyhkaXNwbGF5VGV4dCkgPyAnaGFzLXRhc2stbGlua3MnIDogJyd9XG4gICAgICAgID5cbiAgICAgICAgICA8U3RyZWFtZG93blxuICAgICAgICAgICAgcGx1Z2lucz17eyBjb2RlIH19XG4gICAgICAgICAgICBjb21wb25lbnRzPXt7IGE6IEN1c3RvbUxpbmsgfSBhcyBQYXJhbWV0ZXJzPHR5cGVvZiBTdHJlYW1kb3duPlswXVsnY29tcG9uZW50cyddfVxuICAgICAgICAgICAgbGlua1NhZmV0eT17eyBlbmFibGVkOiBmYWxzZSB9fVxuICAgICAgICAgICAgaXNBbmltYXRpbmc9eyEhcHJvcHMuaXNTdHJlYW1pbmd9XG4gICAgICAgICAgICBzaGlraVRoZW1lPXtbJ2dpdGh1Yi1saWdodCcsICdnaXRodWItbGlnaHQnXX1cbiAgICAgICAgICAgIGNvbnRyb2xzPXt7IHRhYmxlOiBmYWxzZSwgY29kZTogZmFsc2UgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7ZGlzcGxheVRleHR9XG4gICAgICAgICAgPC9TdHJlYW1kb3duPlxuICAgICAgICA8L1NDQ0FJTWVzc2FnZVdyYXBwZXI+XG4gICAgICAgIHtwcm9wcy5pc0Fzc2lzdGFudCAmJiAhcHJvcHMuaXNFcnJvciAmJiAhcHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZCAmJiAhcHJvcHMuYXBwcm92YWwgJiYgIXByb3BzLmlzU3RyZWFtaW5nICYmIChcbiAgICAgICAgICA8TWVzc2FnZUZlZWRiYWNrXG4gICAgICAgICAgICBjb250ZW50PXtkaXNwbGF5VGV4dH1cbiAgICAgICAgICAgIHNvdXJjZXM9e3Byb3BzLnNvdXJjZXN9XG4gICAgICAgICAgICBoYW5kbGVGZWVkYmFjaz17cHJvcHMuaGFuZGxlRmVlZGJhY2tDbGlja31cbiAgICAgICAgICAgIGRpc2FibGVGZWVkYmFjaz17cHJvcHMuZGlzYWJsZUZlZWRiYWNrfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICA8Lz5cbiAgICApXG4gIH1cbilcblxuY29uc3QgTWVzc2FnZUl0ZW0gPSBtZW1vKChwcm9wczogTWVzc2FnZUl0ZW1Qcm9wcykgPT4ge1xuICBjb25zdCB7XG4gICAgaWQsXG4gICAgdXNlcixcbiAgICBtZXNzYWdlLFxuICAgIGlzU3RyZWFtaW5nLFxuICAgIGlzRXJyb3IsXG4gICAgYXV0aFVzZXIsXG4gICAgb3B0aW9ucyxcbiAgICBpc0NoYW5nZVByb2plY3QsXG4gICAgaGFuZGxlU2VsZWN0T3B0aW9uLFxuICAgIGhhbmRsZUZlZWRiYWNrLFxuICAgIGhhbmRsZUFwcHJvdmFsRGVjaXNpb24sXG4gICAgZGlzYWJsZUZlZWRiYWNrLFxuICAgIHJvbGUsXG4gICAgc291cmNlcyxcbiAgICBhdHRhY2htZW50cyxcbiAgICBhcHByb3ZhbCxcbiAgICBhcHByb3ZhbFN0YXR1cyxcbiAgfSA9IHByb3BzXG5cbiAgY29uc3QgW3ByZXZpZXdBdHRhY2htZW50LCBzZXRQcmV2aWV3QXR0YWNobWVudF0gPSB1c2VTdGF0ZTxBdHRhY2htZW50RmlsZSB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGlzQ3VycmVudFVzZXIgPSByb2xlID09PSBDaGF0SGlzdG9yeVJvbGUuVVNFUiB8fCB1c2VyLmlkID09PSBhdXRoVXNlci5pZC50b1N0cmluZygpXG4gIGNvbnN0IGlzQXNzaXN0YW50ID0gcm9sZSA9PT0gQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCB8fCB1c2VyLmlkID09PSAnYXNzaXN0YW50J1xuXG4gIC8vIERFQlVHIHN0cmVhbWluZzogdmVyIHJlLXJlbmRlcnMgeSByZW1vdW50cy4gSGFiaWxpdGFyIGNvbiB3aW5kb3cuTUFJQV9ERUJVR19TVFJFQU1JTkdfUkVOREVSID0gdHJ1ZVxuICBjb25zdCByZW5kZXJDb3VudFJlZiA9IHVzZVJlZigwKVxuICBjb25zdCBwcmV2TWVzc2FnZUxlblJlZiA9IHVzZVJlZjxudW1iZXI+KG1lc3NhZ2U/Lmxlbmd0aCA/PyAwKVxuICByZW5kZXJDb3VudFJlZi5jdXJyZW50ICs9IDFcbiAgaWYgKGlzU3RyZWFtaW5nICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmICh3aW5kb3cgYXMgYW55KS5NQUlBX0RFQlVHX1NUUkVBTUlOR19SRU5ERVIpIHtcbiAgICBjb25zdCBwcmV2TGVuID0gcHJldk1lc3NhZ2VMZW5SZWYuY3VycmVudFxuICAgIHByZXZNZXNzYWdlTGVuUmVmLmN1cnJlbnQgPSBtZXNzYWdlPy5sZW5ndGggPz8gMFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2coJ1tNZXNzYWdlSXRlbV0gcmVuZGVyJywge1xuICAgICAgbWVzc2FnZUlkOiBpZCxcbiAgICAgIHJlbmRlckNvdW50OiByZW5kZXJDb3VudFJlZi5jdXJyZW50LFxuICAgICAgbWVzc2FnZUxlbjogbWVzc2FnZT8ubGVuZ3RoLFxuICAgICAgcHJldk1lc3NhZ2VMZW46IHByZXZMZW4sXG4gICAgICBpc1N0cmVhbWluZzogdHJ1ZSxcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQXR0YWNobWVudENsaWNrID0gKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnRGaWxlKSA9PiB7XG4gICAgLy8gUGVybWl0aXIgcHJldmlzdWFsaXphY2nDs24gc2kgdGllbmUgYXJjaGl2byBsb2NhbCBvIFVSTHMgZGVsIGJhY2tlbmRcbiAgICBpZiAoXG4gICAgICBhdHRhY2htZW50LmZpbGUgaW5zdGFuY2VvZiBGaWxlIHx8XG4gICAgICBhdHRhY2htZW50Lm9yaWdpbmFsRmlsZSBpbnN0YW5jZW9mIEZpbGUgfHxcbiAgICAgIGF0dGFjaG1lbnQudXJsX3RodW1ibmFpbCB8fFxuICAgICAgYXR0YWNobWVudC51cmxfb3JpZ2luYWwgfHxcbiAgICAgIGF0dGFjaG1lbnQudXJsX2ZpbGVcbiAgICApIHtcbiAgICAgIHNldFByZXZpZXdBdHRhY2htZW50KGF0dGFjaG1lbnQpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQ2xvc2VQcmV2aWV3ID0gKCkgPT4ge1xuICAgIHNldFByZXZpZXdBdHRhY2htZW50KG51bGwpXG4gIH1cblxuICBpZiAoaXNDaGFuZ2VQcm9qZWN0ICYmIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPE1lc3NhZ2VXcmFwcGVyIGtleT17aWR9IGlzQ3VycmVudFVzZXI9e2lzQ3VycmVudFVzZXJ9IGRhdGEtbWVzc2FnZS1pZD17aWR9IGhhc0ZlZWRiYWNrPXtmYWxzZX0+XG4gICAgICAgIDxTQ01lc3NhZ2VJdGVtV3JhcHBlciAkaXNBc3Npc3RhbnQ9e2lzQXNzaXN0YW50fT5cbiAgICAgICAgICB7aXNBc3Npc3RhbnQgJiYgPEFzc2lzdGFudE1lc3NhZ2VIZWFkZXIgLz59XG4gICAgICAgICAgPE1lc3NhZ2VDb250ZW50V3JhcHBlclxuICAgICAgICAgICAgaXNDaGFuZ2VQcm9qZWN0PXtpc0NoYW5nZVByb2plY3R9XG4gICAgICAgICAgICBtZXNzYWdlPXttZXNzYWdlfVxuICAgICAgICAgICAgaXNDdXJyZW50VXNlcj17aXNDdXJyZW50VXNlcn1cbiAgICAgICAgICAgIGlzRXJyb3I9e2lzRXJyb3J9XG4gICAgICAgICAgICBtZXNzYWdlRXh0cmFDb250ZW50PXs8TWVzc2FnZU9wdGlvbnMgb3B0aW9ucz17b3B0aW9ucyBhcyBhbnl9IGhhbmRsZVNlbGVjdE9wdGlvbj17aGFuZGxlU2VsZWN0T3B0aW9ufSAvPn1cbiAgICAgICAgICAvPlxuICAgICAgICA8L1NDTWVzc2FnZUl0ZW1XcmFwcGVyPlxuICAgICAgPC9NZXNzYWdlV3JhcHBlcj5cbiAgICApXG4gIH1cblxuICBjb25zdCBoYW5kbGVGZWVkYmFja0NsaWNrID0gKGZlZWRiYWNrOiBGZWVkYmFjaykgPT4ge1xuICAgIGNvbnN0IHNlc3Npb25JZCA9IGlkXG4gICAgICAuc3BsaXQoJy0nKVxuICAgICAgLmZpbHRlcihxdWVzdGlvbklkID0+IHF1ZXN0aW9uSWQgIT09ICdhbnN3ZXInKVxuICAgICAgLmpvaW4oJy0nKVxuICAgIGhhbmRsZUZlZWRiYWNrPy4oZmVlZGJhY2ssIHNlc3Npb25JZClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFNDTWVzc2FnZUl0ZW1XcmFwcGVyICRpc0Fzc2lzdGFudD17aXNBc3Npc3RhbnR9PlxuICAgICAge2lzQXNzaXN0YW50ICYmIDxBc3Npc3RhbnRNZXNzYWdlSGVhZGVyIC8+fVxuICAgICAgPFNDTWVzc2FnZUl0ZW1Jbm5lcj5cbiAgICAgICAgeyEhKGF0dGFjaG1lbnRzIHx8IHNvdXJjZXMpPy5sZW5ndGggJiYgIWlzQXNzaXN0YW50ICYmIChcbiAgICAgICAgICA8U0NBdHRhY2htZW50c1Jvdz5cbiAgICAgICAgICAgIHsoYXR0YWNobWVudHMgfHwgc291cmNlcyk/Lm1hcCgoYXR0YWNobWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgLy8gRGV0ZWN0YXIgc2kgZXMgdW4gYXJjaGl2byBkZSBhdWRpb1xuICAgICAgICAgICAgICBjb25zdCBhdHRhY2htZW50VHlwZSA9IGF0dGFjaG1lbnQ/LnR5cGU/LnRvTG93ZXJDYXNlKCkgfHwgJydcbiAgICAgICAgICAgICAgY29uc3QgYXR0YWNobWVudE5hbWUgPSBhdHRhY2htZW50Py5uYW1lPy50b0xvd2VyQ2FzZSgpIHx8ICcnXG4gICAgICAgICAgICAgIGNvbnN0IGlzQXVkaW9GaWxlID1cbiAgICAgICAgICAgICAgICBhdHRhY2htZW50VHlwZS5zdGFydHNXaXRoKCdhdWRpby8nKSB8fFxuICAgICAgICAgICAgICAgIFsnZmxhYycsICdtNGEnLCAnbXAzJywgJ21wNCcsICdvZ2EnLCAnb2dnJywgJ3dhdicsICd3ZWJtJ10uaW5jbHVkZXMoYXR0YWNobWVudFR5cGUpIHx8XG4gICAgICAgICAgICAgICAgWycuZmxhYycsICcubTRhJywgJy5tcDMnLCAnLm1wNCcsICcub2dhJywgJy5vZ2cnLCAnLndhdicsICcud2VibSddLnNvbWUoZXh0ID0+XG4gICAgICAgICAgICAgICAgICBhdHRhY2htZW50TmFtZS5lbmRzV2l0aChleHQpXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgIGlmIChpc0F1ZGlvRmlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiA8QXR0YWNobWVudENhcmRBdWRpbyBrZXk9e2Ake2F0dGFjaG1lbnQuaWR9LSR7YXR0YWNobWVudC5uYW1lfWB9IGF0dGFjaG1lbnQ9e2F0dGFjaG1lbnR9IC8+XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxBdHRhY2htZW50Q2FyZFxuICAgICAgICAgICAgICAgICAga2V5PXtgJHthdHRhY2htZW50LmlkfS0ke2F0dGFjaG1lbnQubmFtZX1gfVxuICAgICAgICAgICAgICAgICAgYXR0YWNobWVudD17YXR0YWNobWVudH1cbiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uSW5kZXg9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlQXR0YWNobWVudENsaWNrKGF0dGFjaG1lbnQpfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvU0NBdHRhY2htZW50c1Jvdz5cbiAgICAgICAgKX1cbiAgICAgICAge2FwcHJvdmFsICYmIGFwcHJvdmFsLnBlbmRpbmdfYWN0aW9ucyAmJiAoXG4gICAgICAgICAgPFNDQXBwcm92YWxBY3Rpb25zQ29sdW1uPlxuICAgICAgICAgICAge2FwcHJvdmFsLnBlbmRpbmdfYWN0aW9ucy5tYXAoYWN0aW9uID0+IChcbiAgICAgICAgICAgICAgPEFwcHJvdmFsQm94XG4gICAgICAgICAgICAgICAga2V5PXtgJHthY3Rpb24udGhyZWFkX2lkfS0ke2FjdGlvbi50b29sX2NhbGxfaWR9YH1cbiAgICAgICAgICAgICAgICBhY3Rpb249e2FjdGlvbn1cbiAgICAgICAgICAgICAgICBzdGF0dXM9e2FwcHJvdmFsU3RhdHVzfVxuICAgICAgICAgICAgICAgIG9uQXBwcm92ZT17dGhyZWFkSWQgPT4gaGFuZGxlQXBwcm92YWxEZWNpc2lvbih0aHJlYWRJZCwgJ2FwcHJvdmUnKX1cbiAgICAgICAgICAgICAgICBvblJlamVjdD17dGhyZWFkSWQgPT4gaGFuZGxlQXBwcm92YWxEZWNpc2lvbih0aHJlYWRJZCwgJ3JlamVjdCcpfVxuICAgICAgICAgICAgICAgIGlzUHJvamVjdERlbGV0ZWQ9e3Byb3BzLnByb2plY3RNZXRhZGF0YT8uaXNfZGVsZXRlZCA9PT0gdHJ1ZX1cbiAgICAgICAgICAgICAgICBpc0V4cGFuZGVkPXtwcm9wcy5leHBhbmRlZH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgIDwvU0NBcHByb3ZhbEFjdGlvbnNDb2x1bW4+XG4gICAgICAgICl9XG4gICAgICAgIHsoISFtZXNzYWdlIHx8IGlzU3RyZWFtaW5nKSAmJiAhYXBwcm92YWwgJiYgKFxuICAgICAgICAgIDxTdHJlYW1pbmdNZXNzYWdlQm9keVxuICAgICAgICAgICAgbWVzc2FnZT17bWVzc2FnZSA/PyAnJ31cbiAgICAgICAgICAgIGlzU3RyZWFtaW5nPXshIWlzU3RyZWFtaW5nfVxuICAgICAgICAgICAgaXNDdXJyZW50VXNlcj17aXNDdXJyZW50VXNlcn1cbiAgICAgICAgICAgIGlzQXNzaXN0YW50PXtpc0Fzc2lzdGFudH1cbiAgICAgICAgICAgIGlzRnJvbnRlbmRDYW5jZWxsZWQ9e3Byb3BzLmlzRnJvbnRlbmRDYW5jZWxsZWR9XG4gICAgICAgICAgICBhcHByb3ZhbD17YXBwcm92YWx9XG4gICAgICAgICAgICBpc0Vycm9yPXtpc0Vycm9yfVxuICAgICAgICAgICAgc291cmNlcz17c291cmNlc31cbiAgICAgICAgICAgIGhhbmRsZUZlZWRiYWNrQ2xpY2s9e2hhbmRsZUZlZWRiYWNrQ2xpY2t9XG4gICAgICAgICAgICBkaXNhYmxlRmVlZGJhY2s9e2Rpc2FibGVGZWVkYmFjayA/PyBudWxsfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICA8L1NDTWVzc2FnZUl0ZW1Jbm5lcj5cbiAgICAgIDxBdHRhY2htZW50UHJldmlld01vZGFsXG4gICAgICAgIGlzT3Blbj17ISFwcmV2aWV3QXR0YWNobWVudH1cbiAgICAgICAgb25DbG9zZT17aGFuZGxlQ2xvc2VQcmV2aWV3fVxuICAgICAgICBhdHRhY2htZW50PXtwcmV2aWV3QXR0YWNobWVudH1cbiAgICAgIC8+XG4gICAgPC9TQ01lc3NhZ2VJdGVtV3JhcHBlcj5cbiAgKVxufSlcblxuY29uc3QgQ2hhdEFJTWVzc2FnZXNJbm5lciA9ICh7XG4gIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgaW5pdGlhbENoYXRJZCxcbiAgb25FcnJvcixcbiAgb25TZW5kTWVzc2FnZVJlYWR5LFxuICBvblNjcm9sbFRvQm90dG9tLFxuICBhdHRhY2htZW50cyxcbiAgYWdlbnRzLFxuICBleHBhbmRlZCxcbn06IENoYXRBSU1lc3NhZ2VzUHJvcHMpID0+IHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUKClcbiAgY29uc3QgeyBpc1dlYlNlYXJjaEFjdGl2ZSwgaXNEZWVwU2VhcmNoQWN0aXZlIH0gPSB1c2VHbG9iYWxDb250ZXh0KClcbiAgY29uc3QgYXV0aFVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3QgbWVzc2FnZXNSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IGNoYXRJbml0aWFsaXplZFJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgaXNMb2FkaW5nTW9yZVJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgdXNlclNjcm9sbGluZ1JlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3Qgc2Nyb2xsVGhyZXNob2xkUmVmID0gdXNlUmVmKDM5KVxuICBjb25zdCBsYXN0U2Nyb2xsVG9wUmVmID0gdXNlUmVmKDApXG4gIGNvbnN0IHNob3dTY3JvbGxUb0JvdHRvbVJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3Qgc2Nyb2xsUmFmUmVmID0gdXNlUmVmPG51bWJlciB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtzaG93U2Nyb2xsVG9Cb3R0b20sIHNldFNob3dTY3JvbGxUb0JvdHRvbV0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3Qgc3RyZWFtaW5nTWVzc2FnZVByb3BzUmVmID0gdXNlUmVmPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih7fSlcbiAgY29uc3Qgc3RyZWFtaW5nTWVzc2FnZUlkUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpXG5cbiAgY29uc3Qge1xuICAgIG1lc3NhZ2VzLFxuICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICBpc0xvYWRpbmdNb3JlTWVzc2FnZXMsXG4gICAgd2FpdGluZ1Jlc3BvbnNlLFxuICAgIGlzV3JpdGluZyxcbiAgICBsb2FkaW5nTWVzc2FnZSxcbiAgICBhY3RpdmVMb2FkaW5ncyxcbiAgICBzZW5kTWVzc2FnZSxcbiAgICBjaGFuZ2VQcm9qZWN0LFxuICAgIGhhbmRsZUZlZWRiYWNrLFxuICAgIGhhbmRsZUFwcHJvdmFsRGVjaXNpb24sXG4gICAgaW5pdGlhbGl6ZUNoYXQsXG4gICAgaGFuZGxlU2Nyb2xsLFxuICAgIHN0b3BHZW5lcmF0aW9uLFxuICB9ID0gdXNlQ2hhdE1hbmFnZXIoe1xuICAgIGNoYXRJZDogaW5pdGlhbENoYXRJZCB8fCB1bmRlZmluZWQsXG4gICAgdXNlckluaXRpYWxNZXNzYWdlLFxuICAgIG9uRXJyb3IsXG4gICAgYXR0YWNobWVudHMsXG4gICAgYWdlbnRzLFxuICB9KVxuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdE9wdGlvbiA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFByb2plY3QpID0+IHtcbiAgICAgIGNoYW5nZVByb2plY3Qob3B0aW9uKVxuICAgIH0sXG4gICAgW2NoYW5nZVByb2plY3RdXG4gIClcblxuICBjb25zdCBoYW5kbGVDbGlja1Njcm9sbFRvQm90dG9tID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChtZXNzYWdlc1JlZi5jdXJyZW50KSB7XG4gICAgICBtZXNzYWdlc1JlZi5jdXJyZW50LnNjcm9sbFRvKHtcbiAgICAgICAgdG9wOiBtZXNzYWdlc1JlZi5jdXJyZW50LnNjcm9sbEhlaWdodCxcbiAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgfSlcbiAgICAgIC8vIEFjdHVhbGl6YXIgZXN0YWRvIGRlc3B1w6lzIGRlIHVuIGJyZXZlIGRlbGF5IHBhcmEgcGVybWl0aXIgcXVlIGVsIHNjcm9sbCBzZSBjb21wbGV0ZVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlc1JlZi5jdXJyZW50KSB7XG4gICAgICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0IH0gPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsVG9wIC0gY2xpZW50SGVpZ2h0XG4gICAgICAgICAgY29uc3Qgc2hvdWxkU2hvdyA9IGRpc3RhbmNlRnJvbUJvdHRvbSA+IDUwXG4gICAgICAgICAgc2hvd1Njcm9sbFRvQm90dG9tUmVmLmN1cnJlbnQgPSBzaG91bGRTaG93XG4gICAgICAgICAgc2V0U2hvd1Njcm9sbFRvQm90dG9tKHNob3VsZFNob3cpXG4gICAgICAgIH1cbiAgICAgIH0sIDUwMClcbiAgICB9XG4gIH0sIFtdKVxuXG4gIGNvbnN0IGhhbmRsZVNjcm9sbFRvQm90dG9tID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IFJlYWN0LlVJRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBlLmN1cnJlbnRUYXJnZXRcblxuICAgICAgaWYgKHNjcm9sbFJhZlJlZi5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHNjcm9sbFJhZlJlZi5jdXJyZW50KVxuICAgICAgfVxuXG4gICAgICBzY3JvbGxSYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHNjcm9sbFJhZlJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICBjb25zdCB7IHNjcm9sbFRvcCwgc2Nyb2xsSGVpZ2h0LCBjbGllbnRIZWlnaHQgfSA9IGNvbnRhaW5lclxuXG4gICAgICAgIGNvbnN0IGlzU2Nyb2xsaW5nVXAgPSBzY3JvbGxUb3AgPCBsYXN0U2Nyb2xsVG9wUmVmLmN1cnJlbnRcblxuICAgICAgICBpZiAoaXNTY3JvbGxpbmdVcCkge1xuICAgICAgICAgIHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50ID0gMTVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzTmVhckJvdHRvbSA9IHNjcm9sbEhlaWdodCAtIHNjcm9sbFRvcCAtIGNsaWVudEhlaWdodCA8IHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50XG5cbiAgICAgICAgaWYgKGlzTmVhckJvdHRvbSkge1xuICAgICAgICAgIHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50ID0gMzlcbiAgICAgICAgfVxuXG4gICAgICAgIHVzZXJTY3JvbGxpbmdSZWYuY3VycmVudCA9ICFpc05lYXJCb3R0b21cbiAgICAgICAgbGFzdFNjcm9sbFRvcFJlZi5jdXJyZW50ID0gc2Nyb2xsVG9wXG5cbiAgICAgICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsVG9wIC0gY2xpZW50SGVpZ2h0XG4gICAgICAgIGNvbnN0IHNob3VsZFNob3cgPSBkaXN0YW5jZUZyb21Cb3R0b20gPiA1MFxuICAgICAgICBjb25zdCBkaWRTZXRTdGF0ZSA9IHNob3dTY3JvbGxUb0JvdHRvbVJlZi5jdXJyZW50ICE9PSBzaG91bGRTaG93XG4gICAgICAgIGlmIChkaWRTZXRTdGF0ZSkge1xuICAgICAgICAgIHNob3dTY3JvbGxUb0JvdHRvbVJlZi5jdXJyZW50ID0gc2hvdWxkU2hvd1xuICAgICAgICAgIHNldFNob3dTY3JvbGxUb0JvdHRvbShzaG91bGRTaG93KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTmVhckJvdHRvbSAmJiBvblNjcm9sbFRvQm90dG9tKSB7XG4gICAgICAgICAgb25TY3JvbGxUb0JvdHRvbSgpXG4gICAgICAgIH1cblxuICAgICAgICBoYW5kbGVTY3JvbGwoY29udGFpbmVyKVxuICAgICAgfSlcbiAgICB9LFxuICAgIFtvblNjcm9sbFRvQm90dG9tLCBoYW5kbGVTY3JvbGxdXG4gIClcblxuICAvLyByZWZzIHRvIHN0YWJpbGl6ZSBmdW5jdGlvbnMgYW5kIGF2b2lkIHVubmVjZXNzYXJ5IHJlLXJlbmRlcnNcbiAgY29uc3Qgc2VuZE1lc3NhZ2VSZWYgPSB1c2VSZWYoc2VuZE1lc3NhZ2UpXG4gIGNvbnN0IHN0b3BHZW5lcmF0aW9uUmVmID0gdXNlUmVmKHN0b3BHZW5lcmF0aW9uKVxuICBjb25zdCBvblNlbmRNZXNzYWdlUmVhZHlSZWYgPSB1c2VSZWYob25TZW5kTWVzc2FnZVJlYWR5KVxuXG4gIC8vIHVwZGF0ZSByZWZzIHdoZW4gZnVuY3Rpb25zIGNoYW5nZVxuICBzZW5kTWVzc2FnZVJlZi5jdXJyZW50ID0gc2VuZE1lc3NhZ2VcbiAgc3RvcEdlbmVyYXRpb25SZWYuY3VycmVudCA9IHN0b3BHZW5lcmF0aW9uXG4gIG9uU2VuZE1lc3NhZ2VSZWFkeVJlZi5jdXJyZW50ID0gb25TZW5kTWVzc2FnZVJlYWR5XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAob25TZW5kTWVzc2FnZVJlYWR5UmVmLmN1cnJlbnQpIHtcbiAgICAgIG9uU2VuZE1lc3NhZ2VSZWFkeVJlZi5jdXJyZW50KHNlbmRNZXNzYWdlUmVmLmN1cnJlbnQsIHN0b3BHZW5lcmF0aW9uUmVmLmN1cnJlbnQsIHdhaXRpbmdSZXNwb25zZSwgaXNXcml0aW5nKVxuICAgIH1cbiAgfSwgW3dhaXRpbmdSZXNwb25zZSwgaXNXcml0aW5nXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlzTG9hZGluZ01vcmVSZWYuY3VycmVudCA9IGlzTG9hZGluZ01vcmVNZXNzYWdlc1xuICB9LCBbaXNMb2FkaW5nTW9yZU1lc3NhZ2VzXSlcblxuICAvLyBDdWFuZG8gZWwgYWdlbnRlIGVtcGllemEgYSByZXNwb25kZXIsIHJlc2V0ZWFyIGVsIGZsYWcgeSBlbCB1bWJyYWwgcGFyYSBhY3RpdmFyIGVsIGF1dG8tc2Nyb2xsXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHdhaXRpbmdSZXNwb25zZSkge1xuICAgICAgdXNlclNjcm9sbGluZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50ID0gMzlcbiAgICB9XG4gIH0sIFt3YWl0aW5nUmVzcG9uc2VdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFjaGF0SW5pdGlhbGl6ZWRSZWYuY3VycmVudCkge1xuICAgICAgY2hhdEluaXRpYWxpemVkUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICBpbml0aWFsaXplQ2hhdCgpXG4gICAgfVxuICB9LCBbXSlcblxuICAvLyBTY3JvbGwgY3VhbmRvIGxsZWdhIHVuIG1lbnNhamUgZGUgYXByb2JhY2nDs24gKEFwcHJvdmFsQm94KS4gU2luIFJlc2l6ZU9ic2VydmVyIGVuIGVsXG4gIC8vIGNvbnRlbmVkb3I6IG9ic2VydmFybG8gZGlzcGFyYWJhIGNhbGxiYWNrcyBhbCBjYW1iaWFyIGVsIGxheW91dC9zY3JvbGxiYXIgeSBjYWRhIHVub1xuICAvLyBsbGFtYWJhIHNjcm9sbFRvQm90dG9tKCksIHByb3ZvY2FuZG8gdGlyb25lcyBhbCBzY3JvbGxlYXIuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFtZXNzYWdlc1JlZi5jdXJyZW50IHx8IGxvYWRpbmdNZXNzYWdlcyB8fCBpc0xvYWRpbmdNb3JlTWVzc2FnZXMpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjb25zdCBsYXN0TWVzc2FnZSA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdXG4gICAgY29uc3QgaGFzQXBwcm92YWwgPSBsYXN0TWVzc2FnZSAmJiAobGFzdE1lc3NhZ2UuaWQuc3RhcnRzV2l0aCgnYXBwcm92YWwtJykgfHwgISFsYXN0TWVzc2FnZS5hcHByb3ZhbClcblxuICAgIGlmICghaGFzQXBwcm92YWwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjb25zdCBjb250YWluZXIgPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgY29uc3QgaXNBdEJvdHRvbSA9IGNvbnRhaW5lci5zY3JvbGxIZWlnaHQgLSBjb250YWluZXIuc2Nyb2xsVG9wIDw9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQgKyAxMDBcblxuICAgIGlmICghKGlzQXRCb3R0b20gfHwgIXVzZXJTY3JvbGxpbmdSZWYuY3VycmVudCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjb25zdCBzY3JvbGxUb0JvdHRvbSA9ICgpID0+IHtcbiAgICAgIGlmIChtZXNzYWdlc1JlZi5jdXJyZW50KSB7XG4gICAgICAgIG1lc3NhZ2VzUmVmLmN1cnJlbnQuc2Nyb2xsVG9wID0gbWVzc2FnZXNSZWYuY3VycmVudC5zY3JvbGxIZWlnaHRcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZWN1ZW5jaWEgaW5pY2lhbCBkZSBzY3JvbGwgcGFyYSBjdWFuZG8gZWwgQXBwcm92YWxCb3ggYWNhYmEgZGUgcmVuZGVyaXphcnNlXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHNjcm9sbFRvQm90dG9tKClcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHNjcm9sbFRvQm90dG9tKClcbiAgICAgICAgc2V0VGltZW91dChzY3JvbGxUb0JvdHRvbSwgMTAwKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9LCBbbWVzc2FnZXMsIGxvYWRpbmdNZXNzYWdlcywgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIFNpIGVsIHVzdWFyaW8gZXN0w6Egc2Nyb2xsZWFuZG8gbWFudWFsbWVudGUsIG5vIGhhY2VyIGF1dG8gc2Nyb2xsXG4gICAgaWYgKHVzZXJTY3JvbGxpbmdSZWYuY3VycmVudCAmJiB3YWl0aW5nUmVzcG9uc2UpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh3YWl0aW5nUmVzcG9uc2UgJiYgbWVzc2FnZXNSZWYuY3VycmVudCkge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgaWYgKG1lc3NhZ2VzUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBtZXNzYWdlc1JlZi5jdXJyZW50LnNjcm9sbFRvcCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQuc2Nyb2xsSGVpZ2h0XG4gICAgICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0IH0gPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsVG9wIC0gY2xpZW50SGVpZ2h0XG4gICAgICAgICAgY29uc3Qgc2hvdWxkU2hvdyA9IGRpc3RhbmNlRnJvbUJvdHRvbSA+IDUwXG4gICAgICAgICAgc2hvd1Njcm9sbFRvQm90dG9tUmVmLmN1cnJlbnQgPSBzaG91bGRTaG93XG4gICAgICAgICAgc2V0U2hvd1Njcm9sbFRvQm90dG9tKHNob3VsZFNob3cpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIW1lc3NhZ2VzUmVmLmN1cnJlbnQgfHwgbG9hZGluZ01lc3NhZ2VzIHx8IGlzTG9hZGluZ01vcmVNZXNzYWdlcyB8fCBpc0xvYWRpbmdNb3JlUmVmLmN1cnJlbnQpIHJldHVyblxuXG4gICAgY29uc3QgY29udGFpbmVyID0gbWVzc2FnZXNSZWYuY3VycmVudFxuICAgIGNvbnN0IGxhc3RNZXNzYWdlID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV1cblxuICAgIGNvbnN0IGlzTmV3QW5zd2VyTWVzc2FnZSA9IGxhc3RNZXNzYWdlICYmIGxhc3RNZXNzYWdlLmlkLnN0YXJ0c1dpdGgoJ2Fuc3dlci0nKVxuICAgIGNvbnN0IGlzTmV3VXNlck1lc3NhZ2UgPSBsYXN0TWVzc2FnZSAmJiBsYXN0TWVzc2FnZS5pZC5zdGFydHNXaXRoKCdxdWVzdGlvbi0nKVxuICAgIGNvbnN0IGlzTmV3QXBwcm92YWxNZXNzYWdlID0gbGFzdE1lc3NhZ2UgJiYgKGxhc3RNZXNzYWdlLmlkLnN0YXJ0c1dpdGgoJ2FwcHJvdmFsLScpIHx8ICEhbGFzdE1lc3NhZ2UuYXBwcm92YWwpXG4gICAgY29uc3QgaXNBdEJvdHRvbSA9IGNvbnRhaW5lci5zY3JvbGxIZWlnaHQgLSBjb250YWluZXIuc2Nyb2xsVG9wIDw9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQgKyAxMDBcbiAgICBjb25zdCBoYXNNZXNzYWdlcyA9ICEhbWVzc2FnZXMubGVuZ3RoXG4gICAgY29uc3QgaXNOb3RJbml0aWFsTWVzc2FnZSA9ICFtZXNzYWdlcy5zb21lKG1zZyA9PiBtc2cuaWQgPT09ICd1c2VyLWluaXRpYWwtbWVzc2FnZScpXG5cbiAgICBpZiAoKGlzTmV3QW5zd2VyTWVzc2FnZSB8fCBpc05ld1VzZXJNZXNzYWdlIHx8IGlzTmV3QXBwcm92YWxNZXNzYWdlKSAmJiBpc0F0Qm90dG9tKSB7XG4gICAgICAvLyBQYXJhIG1lbnNhamVzIGRlIGFwcm9iYWNpw7NuLCB1c2FyIHVuIHBlcXVlw7FvIGRlbGF5IHBhcmEgYXNlZ3VyYXIgcXVlIGVsIEFwcHJvdmFsQm94IHNlIGhheWEgcmVuZGVyaXphZG9cbiAgICAgIGNvbnN0IHNjcm9sbERlbGF5ID0gaXNOZXdBcHByb3ZhbE1lc3NhZ2UgPyAxMDAgOiAwXG4gICAgICBjb25zdCBkb1Njcm9sbCA9ICgpID0+IHtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBpZiAobWVzc2FnZXNSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgbWVzc2FnZXNSZWYuY3VycmVudC5zY3JvbGxUb3AgPSBtZXNzYWdlc1JlZi5jdXJyZW50LnNjcm9sbEhlaWdodFxuICAgICAgICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0IH0gPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgICAgICAgICBjb25zdCBkaXN0YW5jZUZyb21Cb3R0b20gPSBzY3JvbGxIZWlnaHQgLSBzY3JvbGxUb3AgLSBjbGllbnRIZWlnaHRcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFNob3cgPSBkaXN0YW5jZUZyb21Cb3R0b20gPiA1MFxuICAgICAgICAgICAgc2hvd1Njcm9sbFRvQm90dG9tUmVmLmN1cnJlbnQgPSBzaG91bGRTaG93XG4gICAgICAgICAgICBzZXRTaG93U2Nyb2xsVG9Cb3R0b20oc2hvdWxkU2hvdylcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoc2Nyb2xsRGVsYXkgPiAwKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZG9TY3JvbGwsIHNjcm9sbERlbGF5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9TY3JvbGwoKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBoYXNNZXNzYWdlcyAmJlxuICAgICAgaXNOb3RJbml0aWFsTWVzc2FnZSAmJlxuICAgICAgIWlzTmV3QW5zd2VyTWVzc2FnZSAmJlxuICAgICAgIWlzTmV3VXNlck1lc3NhZ2UgJiZcbiAgICAgICFpc05ld0FwcHJvdmFsTWVzc2FnZVxuICAgICkge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgaWYgKG1lc3NhZ2VzUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBtZXNzYWdlc1JlZi5jdXJyZW50LnNjcm9sbFRvcCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQuc2Nyb2xsSGVpZ2h0XG4gICAgICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0IH0gPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsVG9wIC0gY2xpZW50SGVpZ2h0XG4gICAgICAgICAgY29uc3Qgc2hvdWxkU2hvdyA9IGRpc3RhbmNlRnJvbUJvdHRvbSA+IDUwXG4gICAgICAgICAgc2hvd1Njcm9sbFRvQm90dG9tUmVmLmN1cnJlbnQgPSBzaG91bGRTaG93XG4gICAgICAgICAgc2V0U2hvd1Njcm9sbFRvQm90dG9tKHNob3VsZFNob3cpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9LCBbbWVzc2FnZXMsIGxvYWRpbmdNZXNzYWdlcywgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzLCB3YWl0aW5nUmVzcG9uc2VdKVxuXG4gIC8vIFZlcmlmaWNhciBlbCBlc3RhZG8gaW5pY2lhbCBkZWwgc2Nyb2xsXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKG1lc3NhZ2VzUmVmLmN1cnJlbnQgJiYgIWxvYWRpbmdNZXNzYWdlcykge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gbWVzc2FnZXNSZWYuY3VycmVudFxuICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0IH0gPSBjb250YWluZXJcbiAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IHNjcm9sbEhlaWdodCAtIHNjcm9sbFRvcCAtIGNsaWVudEhlaWdodFxuICAgICAgY29uc3Qgc2hvdWxkU2hvdyA9IGRpc3RhbmNlRnJvbUJvdHRvbSA+IDUwXG4gICAgICBzaG93U2Nyb2xsVG9Cb3R0b21SZWYuY3VycmVudCA9IHNob3VsZFNob3dcbiAgICAgIHNldFNob3dTY3JvbGxUb0JvdHRvbShzaG91bGRTaG93KVxuICAgIH1cbiAgfSwgW2xvYWRpbmdNZXNzYWdlcywgbWVzc2FnZXMubGVuZ3RoXSlcblxuICAvLyBPYnRlbmVyIGVsIMO6bHRpbW8gbWVuc2FqZSBkZWwgdXN1YXJpbyBwYXJhIHZlcmlmaWNhciBzaSB0aWVuZSBhdHRhY2htZW50c1xuICBjb25zdCBsYXN0VXNlck1lc3NhZ2UgPSBtZXNzYWdlc1xuICAgIC5maWx0ZXIobXNnID0+IG1zZy5yb2xlID09PSBDaGF0SGlzdG9yeVJvbGUuVVNFUiB8fCBtc2cudXNlci5pZCA9PT0gYXV0aFVzZXIuaWQudG9TdHJpbmcoKSlcbiAgICAuYXQoLTEpXG5cbiAgY29uc3QgaGFzQXR0YWNobWVudHMgPVxuICAgIChBcnJheS5pc0FycmF5KGxhc3RVc2VyTWVzc2FnZT8uYXR0YWNobWVudHMpICYmIGxhc3RVc2VyTWVzc2FnZS5hdHRhY2htZW50cy5sZW5ndGgpIHx8XG4gICAgKEFycmF5LmlzQXJyYXkobGFzdFVzZXJNZXNzYWdlPy5zb3VyY2VzKSAmJiBsYXN0VXNlck1lc3NhZ2Uuc291cmNlcy5sZW5ndGgpXG5cbiAgY29uc3QgaXNTY3JvbGxPblBhcmVudCA9ICEhZXhwYW5kZWRcblxuICAvLyBERUJVRyBzdHJlYW1pbmc6IHJlLXJlbmRlcnMgZGVsIGNvbnRlbmVkb3IuIEhhYmlsaXRhciBjb24gd2luZG93Lk1BSUFfREVCVUdfU1RSRUFNSU5HX1JFTkRFUiA9IHRydWVcbiAgY29uc3QgbGlzdFJlbmRlckNvdW50UmVmID0gdXNlUmVmKDApXG4gIGlmICgod2FpdGluZ1Jlc3BvbnNlIHx8IGlzV3JpdGluZykgJiYgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgKHdpbmRvdyBhcyBhbnkpLk1BSUFfREVCVUdfU1RSRUFNSU5HX1JFTkRFUikge1xuICAgIGxpc3RSZW5kZXJDb3VudFJlZi5jdXJyZW50ICs9IDFcbiAgICBjb25zdCBsYXN0TXNnID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV1cbiAgICBjb25zdCBsYXN0S2V5ID0gbGFzdE1zZz8uaWQgPz8gYG1zZy0ke21lc3NhZ2VzLmxlbmd0aCAtIDF9YFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2coJ1tDaGF0QUlNZXNzYWdlc10gcmVuZGVyJywge1xuICAgICAgY291bnQ6IGxpc3RSZW5kZXJDb3VudFJlZi5jdXJyZW50LFxuICAgICAgbGFzdE1lc3NhZ2VLZXk6IGxhc3RLZXksXG4gICAgICBsYXN0TWVzc2FnZUxlbjogbGFzdE1zZz8ubWVzc2FnZT8ubGVuZ3RoID8/IDAsXG4gICAgICBtZXNzYWdlc0NvdW50OiBtZXNzYWdlcy5sZW5ndGgsXG4gICAgfSlcbiAgfVxuXG4gIC8vIEFsIGV4cGFuZGlyL2NvbnRyYWVyIGVsIG1vZGFsIGVsIHJlZiBwYXNhIGEgb3RybyBjb250ZW5lZG9yIChzY3JvbGxUb3Agc2UgcmVzZXRlYSBhIDApLlxuICAvLyBSZXN0YXVyYXIgbGEgcG9zaWNpw7NuIGRlIHNjcm9sbCBhbnRlcyBkZWwgcGFpbnQgcGFyYSBldml0YXIgcXVlIGxhIGNvbnZlcnNhY2nDs24gc2FsdGUgYXJyaWJhLlxuICBjb25zdCBleHBhbmRlZFJlZiA9IHVzZVJlZihleHBhbmRlZClcbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZXhwYW5kZWRSZWYuY3VycmVudCAhPT0gZXhwYW5kZWQgJiYgbWVzc2FnZXNSZWYuY3VycmVudCkge1xuICAgICAgY29uc3Qgc2F2ZWRTY3JvbGxUb3AgPSBsYXN0U2Nyb2xsVG9wUmVmLmN1cnJlbnRcbiAgICAgIG1lc3NhZ2VzUmVmLmN1cnJlbnQuc2Nyb2xsVG9wID0gc2F2ZWRTY3JvbGxUb3BcbiAgICAgIGV4cGFuZGVkUmVmLmN1cnJlbnQgPSBleHBhbmRlZFxuICAgIH0gZWxzZSB7XG4gICAgICBleHBhbmRlZFJlZi5jdXJyZW50ID0gZXhwYW5kZWRcbiAgICB9XG4gIH0sIFtleHBhbmRlZF0pXG5cbiAgY29uc3QgbGFzdE1zZyA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdXG4gIGNvbnN0IGlzU3RyZWFtaW5nQWN0aXZlID1cbiAgICAod2FpdGluZ1Jlc3BvbnNlIHx8IGlzV3JpdGluZykgJiZcbiAgICBsYXN0TXNnICYmXG4gICAgKGxhc3RNc2cucm9sZSA9PT0gQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCB8fCBsYXN0TXNnLnVzZXI/LmlkID09PSAnYXNzaXN0YW50JylcbiAgY29uc3Qgc3RyZWFtaW5nVGV4dCA9IGlzU3RyZWFtaW5nQWN0aXZlID8gKGxhc3RNc2cubWVzc2FnZSA/PyAnJykgOiAnJ1xuXG4gIGNvbnN0IG1lc3NhZ2VzQ29udGVudCA9IChcbiAgICA8PlxuICAgICAge2lzTG9hZGluZ01vcmVNZXNzYWdlcyAmJiA8TG9hZGluZ1RleHQgdGV4dD17dCgnY2hhdC5sb2FkaW5nTW9yZScpfSAvPn1cbiAgICAgIDxTdHJlYW1pbmdNZXNzYWdlQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17c3RyZWFtaW5nVGV4dH0+XG4gICAgICAgIHttZXNzYWdlcy5tYXAoKG1lc3NhZ2UsIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIShtZXNzYWdlLmF0dGFjaG1lbnRzPy5sZW5ndGggfHwgbWVzc2FnZS5zb3VyY2VzPy5sZW5ndGgpICYmXG4gICAgICAgICAgICAhbWVzc2FnZS5tZXNzYWdlICYmXG4gICAgICAgICAgICAhbWVzc2FnZS5wcm9qZWN0Py5uYW1lICYmXG4gICAgICAgICAgICAhbWVzc2FnZS5hcHByb3ZhbFxuICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgY29uc3QgbWVzc2FnZUZlZWRiYWNrID1cbiAgICAgICAgICAgIG1lc3NhZ2U/Lndhc0hlbHBmdWwgPT09IHVuZGVmaW5lZCB8fCBtZXNzYWdlLndhc0hlbHBmdWwgPT09IG51bGxcbiAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgIDogbWVzc2FnZS53YXNIZWxwZnVsXG4gICAgICAgICAgICAgICAgPyBGZWVkYmFjay5USFVNQlNfVVBcbiAgICAgICAgICAgICAgICA6IEZlZWRiYWNrLlRIVU1CU19ET1dOXG5cbiAgICAgICAgICBjb25zdCBpc0Fzc2lzdGFudE1lc3NhZ2UgPSBtZXNzYWdlLnJvbGUgPT09IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQgfHwgbWVzc2FnZS51c2VyLmlkID09PSAnYXNzaXN0YW50J1xuICAgICAgICAgIGNvbnN0IGlzTGFzdE1lc3NhZ2UgPSBpbmRleCA9PT0gbWVzc2FnZXMubGVuZ3RoIC0gMVxuICAgICAgICAgIGNvbnN0IGlzU3RyZWFtaW5nID0gaXNBc3Npc3RhbnRNZXNzYWdlICYmIGlzTGFzdE1lc3NhZ2UgJiYgKHdhaXRpbmdSZXNwb25zZSB8fCBpc1dyaXRpbmcpXG5cbiAgICAgICAgICAvLyBLZXkgZXN0YWJsZTogc29sbyBtZXNzYWdlLmlkIHBhcmEgZXZpdGFyIHJlbW91bnQgZHVyYW50ZSBzdHJlYW1pbmcgKG1lc3NhZ2UuZGF0ZSBwdWVkZSBjYW1iaWFyKVxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VLZXkgPSBtZXNzYWdlLmlkID8/IGBtc2ctJHtpbmRleH1gXG5cbiAgICAgICAgICBpZiAoaXNTdHJlYW1pbmcpIHtcbiAgICAgICAgICAgIGlmIChzdHJlYW1pbmdNZXNzYWdlSWRSZWYuY3VycmVudCAhPT0gbWVzc2FnZS5pZCkge1xuICAgICAgICAgICAgICBzdHJlYW1pbmdNZXNzYWdlSWRSZWYuY3VycmVudCA9IG1lc3NhZ2UuaWQgPz8gbnVsbFxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgIHN0cmVhbWluZ01lc3NhZ2VQcm9wc1JlZi5jdXJyZW50LFxuICAgICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgeyBtZXNzYWdlOiB1bmRlZmluZWQgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBhdXRoVXNlcixcbiAgICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdE9wdGlvbixcbiAgICAgICAgICAgICAgICAgIGhhbmRsZUZlZWRiYWNrLFxuICAgICAgICAgICAgICAgICAgaGFuZGxlQXBwcm92YWxEZWNpc2lvbixcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVGZWVkYmFjazogbWVzc2FnZUZlZWRiYWNrLFxuICAgICAgICAgICAgICAgICAgaXNTdHJlYW1pbmc6IHRydWUsXG4gICAgICAgICAgICAgICAgICBleHBhbmRlZCxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiA8TWVzc2FnZUl0ZW0ga2V5PXttZXNzYWdlS2V5fSB7Li4uKHN0cmVhbWluZ01lc3NhZ2VQcm9wc1JlZi5jdXJyZW50IGFzIE1lc3NhZ2VJdGVtUHJvcHMpfSAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBzdHJlYW1pbmdNZXNzYWdlSWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPE1lc3NhZ2VJdGVtXG4gICAgICAgICAgICAgIHsuLi5tZXNzYWdlfVxuICAgICAgICAgICAgICBrZXk9e21lc3NhZ2VLZXl9XG4gICAgICAgICAgICAgIGF1dGhVc2VyPXthdXRoVXNlcn1cbiAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0T3B0aW9uPXtoYW5kbGVTZWxlY3RPcHRpb259XG4gICAgICAgICAgICAgIGhhbmRsZUZlZWRiYWNrPXtoYW5kbGVGZWVkYmFja31cbiAgICAgICAgICAgICAgaGFuZGxlQXBwcm92YWxEZWNpc2lvbj17aGFuZGxlQXBwcm92YWxEZWNpc2lvbn1cbiAgICAgICAgICAgICAgZGlzYWJsZUZlZWRiYWNrPXttZXNzYWdlRmVlZGJhY2t9XG4gICAgICAgICAgICAgIGlzU3RyZWFtaW5nPXtmYWxzZX1cbiAgICAgICAgICAgICAgZXhwYW5kZWQ9e2V4cGFuZGVkfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApXG4gICAgICAgIH0pfVxuICAgICAgPC9TdHJlYW1pbmdNZXNzYWdlQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgIHsod2FpdGluZ1Jlc3BvbnNlIHx8IGxvYWRpbmdNZXNzYWdlIHx8IE9iamVjdC5rZXlzKGFjdGl2ZUxvYWRpbmdzIHx8IHt9KS5sZW5ndGggPiAwKSAmJiAoXG4gICAgICAgIDxTQ0xvYWRpbmdNZXNzYWdlc0NvbHVtbj5cbiAgICAgICAgICB7KHdhaXRpbmdSZXNwb25zZSB8fCBsb2FkaW5nTWVzc2FnZSkgJiYgKFxuICAgICAgICAgICAgPExvYWRpbmdUZXh0XG4gICAgICAgICAgICAgIHRleHQ9e1xuICAgICAgICAgICAgICAgIGxvYWRpbmdNZXNzYWdlIHx8XG4gICAgICAgICAgICAgICAgKGlzV2ViU2VhcmNoQWN0aXZlXG4gICAgICAgICAgICAgICAgICA/ICdCdXNjYW5kbyBlbiBsYSB3ZWInXG4gICAgICAgICAgICAgICAgICA6IGlzRGVlcFNlYXJjaEFjdGl2ZVxuICAgICAgICAgICAgICAgICAgICA/IHQoJ2NoYXQuZ2VuZXJhdGluZ0RlZXBTZWFyY2gnKVxuICAgICAgICAgICAgICAgICAgICA6IGhhc0F0dGFjaG1lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgPyB0KCdjaGF0LmdlbmVyYXRpbmdBdHRhY2htZW50JylcbiAgICAgICAgICAgICAgICAgICAgICA6IHQoJ2NoYXQuZ2VuZXJhdGluZycpKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgICAge09iamVjdC5lbnRyaWVzKGFjdGl2ZUxvYWRpbmdzIHx8IHt9KS5tYXAoKFt0aHJlYWRJZCwgbWVzc2FnZV0pID0+IChcbiAgICAgICAgICAgIDxMb2FkaW5nVGV4dCBrZXk9e2Bsb2FkaW5nLSR7dGhyZWFkSWR9YH0gdGV4dD17bWVzc2FnZX0gLz5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9TQ0xvYWRpbmdNZXNzYWdlc0NvbHVtbj5cbiAgICAgICl9XG4gICAgPC8+XG4gIClcblxuICBpZiAobG9hZGluZ01lc3NhZ2VzKSB7XG4gICAgcmV0dXJuIDxMb2FkZXIgLz5cbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFNDTWVzc2FnZXNPdXRlciAkc2Nyb2xsT25QYXJlbnQ9e2lzU2Nyb2xsT25QYXJlbnR9PlxuICAgICAge2lzU2Nyb2xsT25QYXJlbnQgPyAoXG4gICAgICAgIDxTQ01lc3NhZ2VzU2Nyb2xsIHJlZj17bWVzc2FnZXNSZWZ9IG9uU2Nyb2xsPXtoYW5kbGVTY3JvbGxUb0JvdHRvbX0+XG4gICAgICAgICAgPFNDTWVzc2FnZXNJbm5lciAkc2Nyb2xsT25QYXJlbnQ9e2lzU2Nyb2xsT25QYXJlbnR9PnttZXNzYWdlc0NvbnRlbnR9PC9TQ01lc3NhZ2VzSW5uZXI+XG4gICAgICAgIDwvU0NNZXNzYWdlc1Njcm9sbD5cbiAgICAgICkgOiAoXG4gICAgICAgIDxTQ01lc3NhZ2VzSW5uZXIgcmVmPXttZXNzYWdlc1JlZn0gb25TY3JvbGw9e2hhbmRsZVNjcm9sbFRvQm90dG9tfSAkc2Nyb2xsT25QYXJlbnQ9e2ZhbHNlfT5cbiAgICAgICAgICB7bWVzc2FnZXNDb250ZW50fVxuICAgICAgICA8L1NDTWVzc2FnZXNJbm5lcj5cbiAgICAgICl9XG5cbiAgICAgIHtzaG93U2Nyb2xsVG9Cb3R0b20gJiYgKFxuICAgICAgICA8U2Nyb2xsVG9Cb3R0b21CdXR0b24gdHlwZT1cImJ1dHRvblwiIG9uQ2xpY2s9e2hhbmRsZUNsaWNrU2Nyb2xsVG9Cb3R0b219PlxuICAgICAgICAgIDxBcnJvd1NtYWxsRG93biBjb2xvcj1cIiM2NjZcIiB3aWR0aD1cIjIwcHhcIiBoZWlnaHQ9XCIyMHB4XCIgLz5cbiAgICAgICAgPC9TY3JvbGxUb0JvdHRvbUJ1dHRvbj5cbiAgICAgICl9XG4gICAgPC9TQ01lc3NhZ2VzT3V0ZXI+XG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IENoYXRBSU1lc3NhZ2VzID0gUmVhY3QubWVtbyhDaGF0QUlNZXNzYWdlc0lubmVyKVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPQSxLQUFLLElBQVFDLElBQUksRUFBYUMsV0FBVyxFQUFFQyxTQUFTLEVBQUVDLGVBQWUsRUFBRUMsTUFBTSxFQUFFQyxRQUFRLEVBQUFDLGFBQUEsSUFBQUMsY0FBQSxRQUFRLE9BQU87QUFDN0csU0FBU0MsVUFBVSxRQUFRLFlBQVk7QUFDdkMsU0FBU0MsZ0JBQWdCLFFBQVEsa0JBQWtCO0FBQ25ELFNBQVNDLGNBQWMsUUFBUSxpREFBaUQ7QUFFaEYsU0FBU0MsY0FBYyxRQUFRLDJDQUEyQztBQUMxRSxTQUFTQyxXQUFXLFFBQVEscUNBQXFDO0FBQ2pFLFNBQVNDLHNCQUFzQixRQUFRLG9DQUFvQztBQUMzRSxTQUFTQyxtQkFBbUIsUUFBUSxnREFBZ0Q7QUFFcEYsU0FBc0JDLGVBQWUsUUFBa0IscUJBQXFCO0FBRTVFLFNBQWtCQyxPQUFPLFFBQVEsMkJBQTJCO0FBRTVELFNBQVNDLElBQUks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
666
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIm1lbW8iLCJ1c2VFZmZlY3QiLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsInVzZUNhbGxiYWNrIiwiY3JlYXRlRWxlbWVudCIsIl9jcmVhdGVFbGVtZW50IiwiU3RyZWFtZG93biIsImNyZWF0ZUNvZGVQbHVnaW4iLCJBcnJvd1NtYWxsRG93biIsIkF0dGFjaG1lbnRDYXJkIiwiQXBwcm92YWxCb3giLCJBdHRhY2htZW50UHJldmlld01vZGFsIiwiQXR0YWNobWVudENhcmRBdWRpbyIsIkNoYXRIaXN0b3J5Um9sZSIsInVzZVVzZXIiLCJ1c2VUIiwidXNlQ2hhdE1hbmFnZXIiLCJ1c2VUYXNrUGFuZWwiLCJMb2FkaW5nVGV4dCIsIkxvYWRlciIsIk1lc3NhZ2VGcm9tVXNlciIsIk1lc3NhZ2VGcm9tT3RoZXIiLCJNZXNzYWdlQ29udGVudEZyb21Vc2VyIiwiTWVzc2FnZUNvbnRlbnRGcm9tT3RoZXIiLCJNZXNzYWdlRmVlZGJhY2siLCJTQ0NBSU1lc3NhZ2VXcmFwcGVyIiwiU2Nyb2xsVG9Cb3R0b21CdXR0b24iLCJTQ01lc3NhZ2VzT3V0ZXIiLCJTQ01lc3NhZ2VzU2Nyb2xsIiwiU0NNZXNzYWdlc0lubmVyIiwiU0NMb2FkaW5nTWVzc2FnZXNDb2x1bW4iLCJTQ09wdGlvbnNMaXN0IiwiU0NPcHRpb25JdGVtIiwiU0NBc3Npc3RhbnRNZXNzYWdlSGVhZGVyIiwiU0NBc3Npc3RhbnROYW1lIiwiU0NBc3Npc3RhbnRBdmF0YXIiLCJTQ1Rhc2tMaW5rIiwiU0NNZXNzYWdlSXRlbVdyYXBwZXIiLCJTQ01lc3NhZ2VJdGVtSW5uZXIiLCJTQ0F0dGFjaG1lbnRzUm93IiwiU0NBcHByb3ZhbEFjdGlvbnNDb2x1bW4iLCJGZWVkYmFjayIsInVzZUdsb2JhbENvbnRleHQiLCJNQUlBSXNvbG9nbyIsIlRBU0tfVVJMX1JFR0VYX1BBVFRFUk4iLCJqc3giLCJfanN4IiwianN4cyIsIl9qc3hzIiwiRnJhZ21lbnQiLCJfRnJhZ21lbnQiLCJjb2RlIiwidGhlbWVzIiwiQXNzaXN0YW50QXZhdGFyIiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5IiwibG9jYWxBZ2VudCIsInNldExvY2FsQWdlbnQiLCJfdXNlR2xvYmFsQ29udGV4dCIsImFnZW50IiwiY2hpbGRyZW4iLCJ0eXBlIiwid2lkdGgiLCJoZWlnaHQiLCJlbW9qaSIsIk1lc3NhZ2VXcmFwcGVyIiwiX3JlZiIsImlzQ3VycmVudFVzZXIiLCJwcm9wcyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllcyIsIl9leGNsdWRlZCIsIk1lc3NhZ2VDb21wb25lbnQiLCJfb2JqZWN0U3ByZWFkIiwiTWVzc2FnZUNvbnRlbnRXcmFwcGVyIiwiX3JlZjIiLCJfZXhjbHVkZWQyIiwiTWVzc2FnZUNvbnRlbnRDb21wb25lbnQiLCJNZXNzYWdlT3B0aW9ucyIsIl9yZWYzIiwib3B0aW9ucyIsImhhbmRsZVNlbGVjdE9wdGlvbiIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0Iiwic2VsZWN0ZWRPcHRpb24iLCJzZXRTZWxlY3RlZE9wdGlvbiIsImhhbmRsZVNlbGVjdCIsIm9wdGlvbiIsIm1hcCIsIiRoYXNTZWxlY3Rpb24iLCIkZGltbWVkIiwiaWQiLCJvbkNsaWNrIiwibmFtZSIsIkFzc2lzdGFudE1lc3NhZ2VIZWFkZXIiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsIl91c2VHbG9iYWxDb250ZXh0MiIsImdldFRhYlNlZ21lbnRGcm9tSHJlZiIsImhyZWYiLCJtYXRjaCIsInRlc3QiLCJUYXNrTGluayIsIl9yZWY0IiwidGFza0lkIiwidGFiU2VnbWVudCIsIl91c2VUYXNrUGFuZWwiLCJidWlsZE9wZW5UYXNrIiwib3BlblRhc2siLCJoYW5kbGVDbGljayIsImUiLCJtZXRhS2V5IiwiY3RybEtleSIsInByZXZlbnREZWZhdWx0IiwiQ3VzdG9tTGluayIsIl9yZWY1IiwicmVzdCIsIl9leGNsdWRlZDMiLCJ0YXNrTWF0Y2giLCJSZWdFeHAiLCJNZXNzYWdlSXRlbSIsIl9yZWY2IiwiX3JlZjciLCJ1c2VyIiwibWVzc2FnZSIsImlzRXJyb3IiLCJhdXRoVXNlciIsImlzQ2hhbmdlUHJvamVjdCIsImhhbmRsZUZlZWRiYWNrIiwiaGFuZGxlQXBwcm92YWxEZWNpc2lvbiIsImRpc2FibGVGZWVkYmFjayIsInJvbGUiLCJzb3VyY2VzIiwiYXR0YWNobWVudHMiLCJhcHByb3ZhbCIsImFwcHJvdmFsU3RhdHVzIiwiZXh0cmFjdFRhc2tzRnJvbU1lc3NhZ2UiLCJ0YXNrVXJsUmVnZXgiLCJ0YXNrcyIsInNlZW5JZHMiLCJTZXQiLCJleGVjIiwidXJsIiwiaGFzIiwiYWRkIiwibWFya2Rvd25MaW5rUmVnZXgiLCJjb25jYXQiLCJyZXBsYWNlIiwibGlua01hdGNoIiwidGl0bGUiLCJwdXNoIiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJwcmV2aWV3QXR0YWNobWVudCIsInNldFByZXZpZXdBdHRhY2htZW50IiwiVVNFUiIsInRvU3RyaW5nIiwiaXNBc3Npc3RhbnQiLCJBU1NJU1RBTlQiLCJoYW5kbGVBdHRhY2htZW50Q2xpY2siLCJhdHRhY2htZW50IiwiZmlsZSIsIkZpbGUiLCJvcmlnaW5hbEZpbGUiLCJ1cmxfdGh1bWJuYWlsIiwidXJsX29yaWdpbmFsIiwidXJsX2ZpbGUiLCJoYW5kbGVDbG9zZVByZXZpZXciLCJoYXNGZWVkYmFjayIsIiRpc0Fzc2lzdGFudCIsIm1lc3NhZ2VFeHRyYUNvbnRlbnQiLCJoYW5kbGVGZWVkYmFja0NsaWNrIiwiZmVlZGJhY2siLCJzZXNzaW9uSWQiLCJzcGxpdCIsImZpbHRlciIsInF1ZXN0aW9uSWQiLCJqb2luIiwibGVuZ3RoIiwiaW5kZXgiLCJfYXR0YWNobWVudCR0eXBlIiwiX2F0dGFjaG1lbnQkbmFtZSIsImF0dGFjaG1lbnRUeXBlIiwidG9Mb3dlckNhc2UiLCJhdHRhY2htZW50TmFtZSIsImlzQXVkaW9GaWxlIiwic3RhcnRzV2l0aCIsImluY2x1ZGVzIiwic29tZSIsImV4dCIsImVuZHNXaXRoIiwicG9zaXRpb25JbmRleCIsInBlbmRpbmdfYWN0aW9ucyIsImFjdGlvbiIsIl9wcm9wcyRwcm9qZWN0TWV0YWRhdCIsInN0YXR1cyIsIm9uQXBwcm92ZSIsInRocmVhZElkIiwib25SZWplY3QiLCJpc1Byb2plY3REZWxldGVkIiwicHJvamVjdE1ldGFkYXRhIiwiaXNfZGVsZXRlZCIsImlzRXhwYW5kZWQiLCJleHBhbmRlZCIsInRocmVhZF9pZCIsInRvb2xfY2FsbF9pZCIsImlzRnJvbnRlbmRDYW5jZWxsZWQiLCJjbGFzc05hbWUiLCJwbHVnaW5zIiwiY29tcG9uZW50cyIsImEiLCJsaW5rU2FmZXR5IiwiZW5hYmxlZCIsImlzQW5pbWF0aW5nIiwiaXNTdHJlYW1pbmciLCJzaGlraVRoZW1lIiwiY29udHJvbHMiLCJ0YWJsZSIsImNvbnRlbnQiLCJpc09wZW4iLCJvbkNsb3NlIiwiQ2hhdEFJTWVzc2FnZXNJbm5lciIsIl9yZWY4IiwidXNlckluaXRpYWxNZXNzYWdlIiwiaW5pdGlhbENoYXRJZCIsIm9uRXJyb3IiLCJvblNlbmRNZXNzYWdlUmVhZHkiLCJvblNjcm9sbFRvQm90dG9tIiwiYWdlbnRzIiwiX3VzZVQiLCJ0IiwiX3VzZUdsb2JhbENvbnRleHQzIiwiaXNXZWJTZWFyY2hBY3RpdmUiLCJpc0RlZXBTZWFyY2hBY3RpdmUiLCJtZXNzYWdlc1JlZiIsImNoYXRJbml0aWFsaXplZFJlZiIsImlzTG9hZGluZ01vcmVSZWYiLCJ1c2VyU2Nyb2xsaW5nUmVmIiwic2Nyb2xsVGhyZXNob2xkUmVmIiwibGFzdFNjcm9sbFRvcFJlZiIsInNob3dTY3JvbGxUb0JvdHRvbVJlZiIsInNjcm9sbFJhZlJlZiIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwic2hvd1Njcm9sbFRvQm90dG9tIiwic2V0U2hvd1Njcm9sbFRvQm90dG9tIiwiX3VzZUNoYXRNYW5hZ2VyIiwiY2hhdElkIiwidW5kZWZpbmVkIiwibWVzc2FnZXMiLCJsb2FkaW5nTWVzc2FnZXMiLCJpc0xvYWRpbmdNb3JlTWVzc2FnZXMiLCJ3YWl0aW5nUmVzcG9uc2UiLCJpc1dyaXRpbmciLCJsb2FkaW5nTWVzc2FnZSIsImFjdGl2ZUxvYWRpbmdzIiwic2VuZE1lc3NhZ2UiLCJjaGFuZ2VQcm9qZWN0IiwiaW5pdGlhbGl6ZUNoYXQiLCJoYW5kbGVTY3JvbGwiLCJzdG9wR2VuZXJhdGlvbiIsImhhbmRsZUNsaWNrU2Nyb2xsVG9Cb3R0b20iLCJjdXJyZW50Iiwic2Nyb2xsVG8iLCJ0b3AiLCJzY3JvbGxIZWlnaHQiLCJiZWhhdmlvciIsInNldFRpbWVvdXQiLCJfbWVzc2FnZXNSZWYkY3VycmVudCIsInNjcm9sbFRvcCIsImNsaWVudEhlaWdodCIsImRpc3RhbmNlRnJvbUJvdHRvbSIsInNob3VsZFNob3ciLCJoYW5kbGVTY3JvbGxUb0JvdHRvbSIsImNvbnRhaW5lciIsImN1cnJlbnRUYXJnZXQiLCJjYW5jZWxBbmltYXRpb25GcmFtZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImlzU2Nyb2xsaW5nVXAiLCJpc05lYXJCb3R0b20iLCJkaWRTZXRTdGF0ZSIsInNlbmRNZXNzYWdlUmVmIiwic3RvcEdlbmVyYXRpb25SZWYiLCJvblNlbmRNZXNzYWdlUmVhZHlSZWYiLCJsYXN0TWVzc2FnZSIsImhhc0FwcHJvdmFsIiwiaXNBdEJvdHRvbSIsInNjcm9sbFRvQm90dG9tIiwiX21lc3NhZ2VzUmVmJGN1cnJlbnQyIiwiaXNOZXdBbnN3ZXJNZXNzYWdlIiwiaXNOZXdVc2VyTWVzc2FnZSIsImlzTmV3QXBwcm92YWxNZXNzYWdlIiwiaGFzTWVzc2FnZXMiLCJpc05vdEluaXRpYWxNZXNzYWdlIiwibXNnIiwic2Nyb2xsRGVsYXkiLCJkb1Njcm9sbCIsIl9tZXNzYWdlc1JlZiRjdXJyZW50MyIsIl9tZXNzYWdlc1JlZiRjdXJyZW50NCIsImxhc3RVc2VyTWVzc2FnZSIsImF0IiwiaGFzQXR0YWNobWVudHMiLCJBcnJheSIsImlzQXJyYXkiLCJpc1Njcm9sbE9uUGFyZW50IiwibWVzc2FnZXNDb250ZW50IiwidGV4dCIsIl9tZXNzYWdlJGF0dGFjaG1lbnRzIiwiX21lc3NhZ2Ukc291cmNlcyIsIl9tZXNzYWdlJHByb2plY3QiLCJwcm9qZWN0IiwibWVzc2FnZUZlZWRiYWNrIiwid2FzSGVscGZ1bCIsIlRIVU1CU19VUCIsIlRIVU1CU19ET1dOIiwiaXNBc3Npc3RhbnRNZXNzYWdlIiwiaXNMYXN0TWVzc2FnZSIsImtleSIsImRhdGUiLCJPYmplY3QiLCJrZXlzIiwiZW50cmllcyIsIl9yZWY5IiwiX3JlZjAiLCIkc2Nyb2xsT25QYXJlbnQiLCJyZWYiLCJvblNjcm9sbCIsImNvbG9yIiwiQ2hhdEFJTWVzc2FnZXMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvQ2hhdEFJTWVzc2FnZXMvQ2hhdEFJTWVzc2FnZXMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2luZGVudCAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3Qvbm8tdW5zdGFibGUtbmVzdGVkLWNvbXBvbmVudHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1zaGFkb3cgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3QvZnVuY3Rpb24tY29tcG9uZW50LWRlZmluaXRpb24gKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L3JlcXVpcmUtZGVmYXVsdC1wcm9wcyAqL1xuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAqL1xuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zICovXG5pbXBvcnQgUmVhY3QsIHsgRkMsIG1lbW8sIFJlYWN0Tm9kZSwgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlLCB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgU3RyZWFtZG93biB9IGZyb20gJ3N0cmVhbWRvd24nXG5pbXBvcnQgeyBjcmVhdGVDb2RlUGx1Z2luIH0gZnJvbSAnQHN0cmVhbWRvd24vY29kZSdcbmltcG9ydCB7IEFycm93U21hbGxEb3duIH0gZnJvbSAnQHByb2plY3Rjb3IvaWNvbnMvbGliL2NvbXBvbmVudHMvQXJyb3dTbWFsbERvd24nXG5cbmltcG9ydCB7IEF0dGFjaG1lbnRDYXJkIH0gZnJvbSAnLi4vLi4vYXRvbXMvQXR0YWNobWVudENhcmQvQXR0YWNobWVudENhcmQnXG5pbXBvcnQgeyBBcHByb3ZhbEJveCB9IGZyb20gJy4uLy4uL2F0b21zL0FwcHJvdmFsQm94L0FwcHJvdmFsQm94J1xuaW1wb3J0IHsgQXR0YWNobWVudFByZXZpZXdNb2RhbCB9IGZyb20gJy4uLy4uL2F0b21zL0F0dGFjaG1lbnRQcmV2aWV3TW9kYWwnXG5pbXBvcnQgeyBBdHRhY2htZW50Q2FyZEF1ZGlvIH0gZnJvbSAnLi4vLi4vYXRvbXMvQXR0YWNobWVudENhcmQvQXR0YWNobWVudENhcmRBdWRpbydcbmltcG9ydCB7IE1BSUFNZXNzYWdlUHJvcHMgfSBmcm9tICcuLi8uLi9hdG9tcy9NQUlBTWVzc2FnZS9NQUlBTWVzc2FnZS5pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2UsIENoYXRIaXN0b3J5Um9sZSwgVGFza0luZm8gfSBmcm9tICcuLi8uLi8uLi90eXBlcy9DaGF0J1xuXG5pbXBvcnQgeyBDT1JVc2VyLCB1c2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9jb3ItdXNlcidcblxuaW1wb3J0IHsgdXNlVCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVQnXG5pbXBvcnQgeyB1c2VDaGF0TWFuYWdlciB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUNoYXRNYW5hZ2VyL3VzZUNoYXRNYW5hZ2VyJ1xuaW1wb3J0IHsgdXNlVGFza1BhbmVsIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlVGFza1BhbmVsJ1xuXG5pbXBvcnQgeyBMb2FkaW5nVGV4dCB9IGZyb20gJy4uLy4uL2F0b21zL0xvYWRpbmdUZXh0J1xuaW1wb3J0IHsgTG9hZGVyIH0gZnJvbSAnLi4vLi4vYXRvbXMvTG9hZGVyJ1xuXG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvUHJvamVjdCdcblxuaW1wb3J0IHsgTWVzc2FnZUZyb21Vc2VyLCBNZXNzYWdlRnJvbU90aGVyLCBNZXNzYWdlQ29udGVudEZyb21Vc2VyLCBNZXNzYWdlQ29udGVudEZyb21PdGhlciB9IGZyb20gJy4vc3R5bGVzJ1xuaW1wb3J0IHsgTWVzc2FnZUZlZWRiYWNrIH0gZnJvbSAnLi4vTWVzc2FnZUZlZWRiYWNrJ1xuaW1wb3J0IHtcbiAgU0NDQUlNZXNzYWdlV3JhcHBlcixcbiAgU2Nyb2xsVG9Cb3R0b21CdXR0b24sXG4gIFNDTWVzc2FnZXNPdXRlcixcbiAgU0NNZXNzYWdlc1Njcm9sbCxcbiAgU0NNZXNzYWdlc0lubmVyLFxuICBTQ0xvYWRpbmdNZXNzYWdlc0NvbHVtbixcbiAgU0NPcHRpb25zTGlzdCxcbiAgU0NPcHRpb25JdGVtLFxuICBTQ0Fzc2lzdGFudE1lc3NhZ2VIZWFkZXIsXG4gIFNDQXNzaXN0YW50TmFtZSxcbiAgU0NBc3Npc3RhbnRBdmF0YXIsXG4gIFNDVGFza0xpbmssXG4gIFNDTWVzc2FnZUl0ZW1XcmFwcGVyLFxuICBTQ01lc3NhZ2VJdGVtSW5uZXIsXG4gIFNDQXR0YWNobWVudHNSb3csXG4gIFNDQXBwcm92YWxBY3Rpb25zQ29sdW1uLFxufSBmcm9tICcuL25ld1N0eWxlcydcbmltcG9ydCB7IEZlZWRiYWNrIH0gZnJvbSAnLi4vTWVzc2FnZUZlZWRiYWNrL01lc3NhZ2VGZWVkYmFjaydcbmltcG9ydCB7IHVzZUdsb2JhbENvbnRleHQgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2dsb2JhbC1jb250ZXh0J1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9hZ2VudCdcbmltcG9ydCB7IEF0dGFjaG1lbnRGaWxlIH0gZnJvbSAnLi4vQ2hhdEZvb3Rlci9DaGF0Rm9vdGVyJ1xuaW1wb3J0IHsgTUFJQUlzb2xvZ28gfSBmcm9tICcuLi8uLi9hdG9tcy9pY29ucydcbmltcG9ydCB7IFRBU0tfVVJMX1JFR0VYX1BBVFRFUk4gfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvdGFza1VybHMnXG5cbmNvbnN0IGNvZGUgPSBjcmVhdGVDb2RlUGx1Z2luKHsgdGhlbWVzOiBbJ2dpdGh1Yi1saWdodCcsICdnaXRodWItbGlnaHQnXSB9KVxuXG5jb25zdCBBc3Npc3RhbnRBdmF0YXIgPSAoKSA9PiB7XG4gIGNvbnN0IFtsb2NhbEFnZW50LCBzZXRMb2NhbEFnZW50XSA9IHVzZVN0YXRlPEFnZW50IHwgbnVsbD4obnVsbClcbiAgY29uc3QgeyBhZ2VudCB9ID0gdXNlR2xvYmFsQ29udGV4dCgpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXRMb2NhbEFnZW50KGFnZW50KVxuICB9LCBbYWdlbnRdKVxuXG4gIHJldHVybiAoXG4gICAgPFNDQXNzaXN0YW50QXZhdGFyPlxuICAgICAge2xvY2FsQWdlbnQ/LnR5cGUgPT09ICdjbG9uZScgPyA8TUFJQUlzb2xvZ28gd2lkdGg9ezE4fSBoZWlnaHQ9ezE4fSAvPiA6IGxvY2FsQWdlbnQ/LmVtb2ppfVxuICAgIDwvU0NBc3Npc3RhbnRBdmF0YXI+XG4gIClcbn1cblxudHlwZSBDaGF0QUlNZXNzYWdlc1Byb3BzID0ge1xuICB1c2VySW5pdGlhbE1lc3NhZ2U6IHsgbWVzc2FnZTogc3RyaW5nOyBhdHRhY2htZW50czogQXR0YWNobWVudEZpbGVbXTsgZmFxSWQ/OiBzdHJpbmcgfVxuICBpbml0aWFsQ2hhdElkOiBzdHJpbmcgfCBudWxsXG4gIG9uRXJyb3I6ICgpID0+IHZvaWRcbiAgb25TZW5kTWVzc2FnZVJlYWR5PzogKFxuICAgIHNlbmRNZXNzYWdlOiAobWVzc2FnZTogc3RyaW5nLCBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sIGZhcUlkPzogc3RyaW5nKSA9PiB2b2lkLFxuICAgIHN0b3BHZW5lcmF0aW9uOiAoKSA9PiB2b2lkLFxuICAgIGlzU3RyZWFtaW5nOiBib29sZWFuLFxuICAgIGlzV3JpdGluZzogYm9vbGVhblxuICApID0+IHZvaWRcbiAgaXNEaXNhYmxlZD86IGJvb2xlYW5cbiAgb25TY3JvbGxUb0JvdHRvbT86ICgpID0+IHZvaWRcbiAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdXG4gIGFnZW50cz86IEFnZW50W11cbiAgZXhwYW5kZWQ/OiBib29sZWFuXG59XG5cbnR5cGUgTWVzc2FnZUl0ZW1Qcm9wcyA9IENoYXRNZXNzYWdlICYge1xuICBhdXRoVXNlcjogQ09SVXNlclxuICBoYW5kbGVTZWxlY3RPcHRpb246IChvcHRpb246IFByb2plY3QpID0+IHZvaWRcbiAgaGFuZGxlRmVlZGJhY2s6IChmZWVkYmFjazogRmVlZGJhY2ssIGNoYXRNZXNzYWdlSWQ6IHN0cmluZykgPT4gdm9pZFxuICBoYW5kbGVBcHByb3ZhbERlY2lzaW9uOiAodGhyZWFkSWQ6IHN0cmluZywgZGVjaXNpb246ICdhcHByb3ZlJyB8ICdyZWplY3QnKSA9PiB2b2lkXG4gIGRpc2FibGVGZWVkYmFjaz86IEZlZWRiYWNrIHwgbnVsbFxuICBzb3VyY2VzPzogYW55XG4gIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXVxuICBpc1N0cmVhbWluZz86IGJvb2xlYW5cbiAgZXhwYW5kZWQ/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBNZXNzYWdlV3JhcHBlclByb3BzIHtcbiAgaXNDdXJyZW50VXNlcjogYm9vbGVhblxuICBjaGlsZHJlbjogUmVhY3ROb2RlXG4gICdkYXRhLW1lc3NhZ2UtaWQnPzogc3RyaW5nXG4gIGhhc0ZlZWRiYWNrPzogYm9vbGVhblxufVxuXG50eXBlIE1lc3NhZ2VDb250ZW50V3JhcHBlclByb3BzID0gTUFJQU1lc3NhZ2VQcm9wcyAmIHtcbiAgaXNDdXJyZW50VXNlcjogYm9vbGVhblxuICBpc0Vycm9yPzogYm9vbGVhblxuICBpc0NoYW5nZVByb2plY3Q/OiBib29sZWFuXG59XG5cbmNvbnN0IE1lc3NhZ2VXcmFwcGVyOiBGQzxNZXNzYWdlV3JhcHBlclByb3BzPiA9ICh7IGlzQ3VycmVudFVzZXIsIGNoaWxkcmVuLCAuLi5wcm9wcyB9KSA9PiB7XG4gIGNvbnN0IE1lc3NhZ2VDb21wb25lbnQgPSBpc0N1cnJlbnRVc2VyID8gTWVzc2FnZUZyb21Vc2VyIDogTWVzc2FnZUZyb21PdGhlclxuICByZXR1cm4gPE1lc3NhZ2VDb21wb25lbnQgey4uLnByb3BzfT57Y2hpbGRyZW59PC9NZXNzYWdlQ29tcG9uZW50PlxufVxuXG5jb25zdCBNZXNzYWdlQ29udGVudFdyYXBwZXI6IEZDPE1lc3NhZ2VDb250ZW50V3JhcHBlclByb3BzPiA9ICh7IGlzQ3VycmVudFVzZXIsIC4uLnByb3BzIH0pID0+IHtcbiAgY29uc3QgTWVzc2FnZUNvbnRlbnRDb21wb25lbnQgPSBpc0N1cnJlbnRVc2VyID8gTWVzc2FnZUNvbnRlbnRGcm9tVXNlciA6IE1lc3NhZ2VDb250ZW50RnJvbU90aGVyXG4gIHJldHVybiA8TWVzc2FnZUNvbnRlbnRDb21wb25lbnQgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBNZXNzYWdlT3B0aW9ucyh7XG4gIG9wdGlvbnMsXG4gIGhhbmRsZVNlbGVjdE9wdGlvbixcbn06IHtcbiAgb3B0aW9uczogUHJvamVjdFtdIHwgbnVsbFxuICBoYW5kbGVTZWxlY3RPcHRpb246IChvcHRpb246IFByb2plY3QpID0+IHZvaWRcbn0pIHtcbiAgY29uc3QgW3NlbGVjdGVkT3B0aW9uLCBzZXRTZWxlY3RlZE9wdGlvbl0gPSB1c2VTdGF0ZTxQcm9qZWN0IHwgbnVsbD4obnVsbClcblxuICBjb25zdCBoYW5kbGVTZWxlY3QgPSAob3B0aW9uOiBQcm9qZWN0KSA9PiB7XG4gICAgaWYgKHNlbGVjdGVkT3B0aW9uKSByZXR1cm5cbiAgICBzZXRTZWxlY3RlZE9wdGlvbihvcHRpb24pXG4gICAgaGFuZGxlU2VsZWN0T3B0aW9uKG9wdGlvbilcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFNDT3B0aW9uc0xpc3Q+XG4gICAgICB7KG9wdGlvbnMgfHwgW10pLm1hcChvcHRpb24gPT4gKFxuICAgICAgICA8U0NPcHRpb25JdGVtXG4gICAgICAgICAgJGhhc1NlbGVjdGlvbj17ISFzZWxlY3RlZE9wdGlvbn1cbiAgICAgICAgICAkZGltbWVkPXshIXNlbGVjdGVkT3B0aW9uICYmIHNlbGVjdGVkT3B0aW9uPy5pZCAhPT0gb3B0aW9uLmlkfVxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZVNlbGVjdChvcHRpb24pfVxuICAgICAgICAgIGtleT17b3B0aW9uLmlkfVxuICAgICAgICA+XG4gICAgICAgICAge29wdGlvbi5uYW1lfVxuICAgICAgICA8L1NDT3B0aW9uSXRlbT5cbiAgICAgICkpfVxuICAgIDwvU0NPcHRpb25zTGlzdD5cbiAgKVxufVxuXG5jb25zdCBBc3Npc3RhbnRNZXNzYWdlSGVhZGVyID0gKCkgPT4ge1xuICBjb25zdCBbbG9jYWxBZ2VudCwgc2V0TG9jYWxBZ2VudF0gPSB1c2VTdGF0ZTxBZ2VudCB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHsgYWdlbnQgfSA9IHVzZUdsb2JhbENvbnRleHQoKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0TG9jYWxBZ2VudChhZ2VudClcbiAgfSwgW2FnZW50XSlcblxuICByZXR1cm4gKFxuICAgIDxTQ0Fzc2lzdGFudE1lc3NhZ2VIZWFkZXI+XG4gICAgICA8QXNzaXN0YW50QXZhdGFyIC8+XG4gICAgICB7bG9jYWxBZ2VudD8ubmFtZSAmJiAoXG4gICAgICAgIDxTQ0Fzc2lzdGFudE5hbWU+e2xvY2FsQWdlbnQ/LnR5cGUgPT09ICdjbG9uZScgPyAnTUFJQScgOiBsb2NhbEFnZW50Py5uYW1lfTwvU0NBc3Npc3RhbnROYW1lPlxuICAgICAgKX1cbiAgICA8L1NDQXNzaXN0YW50TWVzc2FnZUhlYWRlcj5cbiAgKVxufVxuXG4vLyBFeHRyYWUgZWwgc2VnbWVudG8gZGUgdGFiIChkZXRhaWx8bWVzc2FnZXxtZXNzYWdlc3xmaWxlc3xoaXN0b3J5fGhvdXJzKSBkZWwgaHJlZiBwYXJhIGFicmlyIGVsIG1vZGFsIGNvbiBlbCB0YWIgY29ycmVjdG9cbmNvbnN0IGdldFRhYlNlZ21lbnRGcm9tSHJlZiA9IChocmVmOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBtYXRjaCA9IGhyZWYubWF0Y2goL1xcL3Rhc2tzXFwvXFxkK1xcLyhbXi8/XSspLylcbiAgcmV0dXJuIG1hdGNoICYmIC9eKGRldGFpbHxtZXNzYWdlfG1lc3NhZ2VzfGZpbGVzfGhpc3Rvcnl8aG91cnMpJC8udGVzdChtYXRjaFsxXSkgPyBtYXRjaFsxXSA6ICdkZXRhaWwnXG59XG5cbi8vIENvbXBvbmVudCBmb3IgdGFzayBsaW5rcyB0aGF0IHVzZXMgdGhlIHVzZVRhc2tQYW5lbCBob29rXG5jb25zdCBUYXNrTGluazogRkM8eyBocmVmOiBzdHJpbmc7IHRhc2tJZDogc3RyaW5nOyBjaGlsZHJlbjogUmVhY3ROb2RlIH0+ID0gKHsgaHJlZiwgdGFza0lkLCBjaGlsZHJlbiB9KSA9PiB7XG4gIGNvbnN0IHRhYlNlZ21lbnQgPSBnZXRUYWJTZWdtZW50RnJvbUhyZWYoaHJlZilcbiAgY29uc3QgeyBidWlsZE9wZW5UYXNrIH0gPSB1c2VUYXNrUGFuZWwodGFza0lkLCB0YWJTZWdtZW50KVxuICBjb25zdCBvcGVuVGFzayA9IGJ1aWxkT3BlblRhc2soKVxuXG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gKGU6IFJlYWN0Lk1vdXNlRXZlbnQ8SFRNTEFuY2hvckVsZW1lbnQ+KSA9PiB7XG4gICAgLy8gU2kgZXMgQ21kL0N0cmwgKyBjbGljaywgZGVqYXIgcXVlIHNlIGFicmEgZW4gbnVldmEgcGVzdGHDsWEgKGNvbXBvcnRhbWllbnRvIHBvciBkZWZlY3RvKVxuICAgIGlmIChlLm1ldGFLZXkgfHwgZS5jdHJsS2V5KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICBvcGVuVGFzaygpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxTQ1Rhc2tMaW5rIGhyZWY9e2hyZWZ9IG9uQ2xpY2s9e2hhbmRsZUNsaWNrfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L1NDVGFza0xpbms+XG4gIClcbn1cblxuLy8gQ3VzdG9tIGxpbmsgY29tcG9uZW50IGZvciBTdHJlYW1kb3duOiB0YXNrIFVSTHMgb3BlbiB0aGUgdGFzayBwYW5lbCwgb3RoZXIgbGlua3MgcmVuZGVyIG5vcm1hbGx5XG50eXBlIEN1c3RvbUxpbmtQcm9wcyA9IFJlYWN0LkFuY2hvckhUTUxBdHRyaWJ1dGVzPEhUTUxBbmNob3JFbGVtZW50PiAmIHsgbm9kZT86IHVua25vd24gfVxuY29uc3QgQ3VzdG9tTGluazogRkM8Q3VzdG9tTGlua1Byb3BzPiA9ICh7IGhyZWYsIGNoaWxkcmVuLCAuLi5yZXN0IH0pID0+IHtcbiAgaWYgKCFocmVmIHx8IHR5cGVvZiBocmVmICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAoXG4gICAgICA8YSBocmVmPXtocmVmfSB7Li4ucmVzdH0+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDwvYT5cbiAgICApXG4gIH1cbiAgY29uc3QgdGFza01hdGNoID0gaHJlZi5tYXRjaChuZXcgUmVnRXhwKFRBU0tfVVJMX1JFR0VYX1BBVFRFUk4pKVxuICBpZiAodGFza01hdGNoKSB7XG4gICAgY29uc3QgdGFza0lkID0gdGFza01hdGNoWzFdXG4gICAgcmV0dXJuIChcbiAgICAgIDxUYXNrTGluayBocmVmPXtocmVmfSB0YXNrSWQ9e3Rhc2tJZH0+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDwvVGFza0xpbms+XG4gICAgKVxuICB9XG4gIHJldHVybiAoXG4gICAgPGEgaHJlZj17aHJlZn0gey4uLnJlc3R9PlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvYT5cbiAgKVxufVxuXG5jb25zdCBNZXNzYWdlSXRlbSA9IG1lbW8oKHByb3BzOiBNZXNzYWdlSXRlbVByb3BzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBpZCxcbiAgICB1c2VyLFxuICAgIG1lc3NhZ2UsXG4gICAgaXNFcnJvcixcbiAgICBhdXRoVXNlcixcbiAgICBvcHRpb25zLFxuICAgIGlzQ2hhbmdlUHJvamVjdCxcbiAgICBoYW5kbGVTZWxlY3RPcHRpb24sXG4gICAgaGFuZGxlRmVlZGJhY2ssXG4gICAgaGFuZGxlQXBwcm92YWxEZWNpc2lvbixcbiAgICBkaXNhYmxlRmVlZGJhY2ssXG4gICAgcm9sZSxcbiAgICBzb3VyY2VzLFxuICAgIGF0dGFjaG1lbnRzLFxuICAgIGFwcHJvdmFsLFxuICAgIGFwcHJvdmFsU3RhdHVzLFxuICB9ID0gcHJvcHNcblxuICBjb25zdCBleHRyYWN0VGFza3NGcm9tTWVzc2FnZSA9IChtZXNzYWdlOiBzdHJpbmcpOiBUYXNrSW5mb1tdID0+IHtcbiAgICBpZiAoIW1lc3NhZ2UpIHJldHVybiBbXVxuXG4gICAgLy8gTWF0Y2ggVVJMcyBsaWtlOiAuLi4vdGFza3MvMTIzNDU2LyhkZXRhaWx8bWVzc2FnZXxtZXNzYWdlc3xmaWxlc3xoaXN0b3J5fGhvdXJzKVxuICAgIGNvbnN0IHRhc2tVcmxSZWdleCA9IG5ldyBSZWdFeHAoVEFTS19VUkxfUkVHRVhfUEFUVEVSTiwgJ2cnKVxuICAgIGNvbnN0IHRhc2tzOiBUYXNrSW5mb1tdID0gW11cbiAgICBjb25zdCBzZWVuSWRzID0gbmV3IFNldDxzdHJpbmc+KClcblxuICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbCA9IG51bGxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uZC1hc3NpZ25cbiAgICB3aGlsZSAoKG1hdGNoID0gdGFza1VybFJlZ2V4LmV4ZWMobWVzc2FnZSkpICE9PSBudWxsKSB7XG4gICAgICBjb25zdCB0YXNrSWQgPSBtYXRjaFsxXVxuICAgICAgY29uc3QgdXJsID0gbWF0Y2hbMF1cblxuICAgICAgaWYgKCFzZWVuSWRzLmhhcyh0YXNrSWQpKSB7XG4gICAgICAgIHNlZW5JZHMuYWRkKHRhc2tJZClcblxuICAgICAgICAvLyBUcnkgdG8gZXh0cmFjdCB0aGUgdGFzayB0aXRsZSBmcm9tIG1hcmtkb3duIGxpbmsgW3RpdGxlXSh1cmwpXG4gICAgICAgIGNvbnN0IG1hcmtkb3duTGlua1JlZ2V4ID0gbmV3IFJlZ0V4cChgXFxcXFsoW15cXFxcXV0rKVxcXFxdXFxcXCgke3VybC5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpfVxcXFwpYClcbiAgICAgICAgY29uc3QgbGlua01hdGNoID0gbWVzc2FnZS5tYXRjaChtYXJrZG93bkxpbmtSZWdleClcbiAgICAgICAgY29uc3QgdGl0bGUgPSBsaW5rTWF0Y2ggPyBsaW5rTWF0Y2hbMV0gOiBgVGFyZWEgIyR7dGFza0lkfWBcblxuICAgICAgICB0YXNrcy5wdXNoKHtcbiAgICAgICAgICBpZDogdGFza0lkLFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgIHVybCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFza3NcbiAgfVxuXG4gIGNvbnN0IFtwcmV2aWV3QXR0YWNobWVudCwgc2V0UHJldmlld0F0dGFjaG1lbnRdID0gdXNlU3RhdGU8QXR0YWNobWVudEZpbGUgfCBudWxsPihudWxsKVxuICBjb25zdCBpc0N1cnJlbnRVc2VyID0gcm9sZSA9PT0gQ2hhdEhpc3RvcnlSb2xlLlVTRVIgfHwgdXNlci5pZCA9PT0gYXV0aFVzZXIuaWQudG9TdHJpbmcoKVxuICBjb25zdCBpc0Fzc2lzdGFudCA9IHJvbGUgPT09IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQgfHwgdXNlci5pZCA9PT0gJ2Fzc2lzdGFudCdcblxuICBjb25zdCBoYW5kbGVBdHRhY2htZW50Q2xpY2sgPSAoYXR0YWNobWVudDogQXR0YWNobWVudEZpbGUpID0+IHtcbiAgICAvLyBQZXJtaXRpciBwcmV2aXN1YWxpemFjacOzbiBzaSB0aWVuZSBhcmNoaXZvIGxvY2FsIG8gVVJMcyBkZWwgYmFja2VuZFxuICAgIGlmIChcbiAgICAgIGF0dGFjaG1lbnQuZmlsZSBpbnN0YW5jZW9mIEZpbGUgfHxcbiAgICAgIGF0dGFjaG1lbnQub3JpZ2luYWxGaWxlIGluc3RhbmNlb2YgRmlsZSB8fFxuICAgICAgYXR0YWNobWVudC51cmxfdGh1bWJuYWlsIHx8XG4gICAgICBhdHRhY2htZW50LnVybF9vcmlnaW5hbCB8fFxuICAgICAgYXR0YWNobWVudC51cmxfZmlsZVxuICAgICkge1xuICAgICAgc2V0UHJldmlld0F0dGFjaG1lbnQoYXR0YWNobWVudClcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVDbG9zZVByZXZpZXcgPSAoKSA9PiB7XG4gICAgc2V0UHJldmlld0F0dGFjaG1lbnQobnVsbClcbiAgfVxuXG4gIGlmIChpc0NoYW5nZVByb2plY3QgJiYgb3B0aW9ucykge1xuICAgIHJldHVybiAoXG4gICAgICA8TWVzc2FnZVdyYXBwZXIga2V5PXtpZH0gaXNDdXJyZW50VXNlcj17aXNDdXJyZW50VXNlcn0gZGF0YS1tZXNzYWdlLWlkPXtpZH0gaGFzRmVlZGJhY2s9e2ZhbHNlfT5cbiAgICAgICAgPFNDTWVzc2FnZUl0ZW1XcmFwcGVyICRpc0Fzc2lzdGFudD17aXNBc3Npc3RhbnR9PlxuICAgICAgICAgIHtpc0Fzc2lzdGFudCAmJiA8QXNzaXN0YW50TWVzc2FnZUhlYWRlciAvPn1cbiAgICAgICAgICA8TWVzc2FnZUNvbnRlbnRXcmFwcGVyXG4gICAgICAgICAgICBpc0NoYW5nZVByb2plY3Q9e2lzQ2hhbmdlUHJvamVjdH1cbiAgICAgICAgICAgIG1lc3NhZ2U9e21lc3NhZ2V9XG4gICAgICAgICAgICBpc0N1cnJlbnRVc2VyPXtpc0N1cnJlbnRVc2VyfVxuICAgICAgICAgICAgaXNFcnJvcj17aXNFcnJvcn1cbiAgICAgICAgICAgIG1lc3NhZ2VFeHRyYUNvbnRlbnQ9ezxNZXNzYWdlT3B0aW9ucyBvcHRpb25zPXtvcHRpb25zIGFzIGFueX0gaGFuZGxlU2VsZWN0T3B0aW9uPXtoYW5kbGVTZWxlY3RPcHRpb259IC8+fVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvU0NNZXNzYWdlSXRlbVdyYXBwZXI+XG4gICAgICA8L01lc3NhZ2VXcmFwcGVyPlxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUZlZWRiYWNrQ2xpY2sgPSAoZmVlZGJhY2s6IEZlZWRiYWNrKSA9PiB7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gaWRcbiAgICAgIC5zcGxpdCgnLScpXG4gICAgICAuZmlsdGVyKHF1ZXN0aW9uSWQgPT4gcXVlc3Rpb25JZCAhPT0gJ2Fuc3dlcicpXG4gICAgICAuam9pbignLScpXG4gICAgaGFuZGxlRmVlZGJhY2s/LihmZWVkYmFjaywgc2Vzc2lvbklkKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8U0NNZXNzYWdlSXRlbVdyYXBwZXIgJGlzQXNzaXN0YW50PXtpc0Fzc2lzdGFudH0+XG4gICAgICB7aXNBc3Npc3RhbnQgJiYgPEFzc2lzdGFudE1lc3NhZ2VIZWFkZXIgLz59XG4gICAgICA8U0NNZXNzYWdlSXRlbUlubmVyPlxuICAgICAgICB7ISEoYXR0YWNobWVudHMgfHwgc291cmNlcyk/Lmxlbmd0aCAmJiAhaXNBc3Npc3RhbnQgJiYgKFxuICAgICAgICAgIDxTQ0F0dGFjaG1lbnRzUm93PlxuICAgICAgICAgICAgeyhhdHRhY2htZW50cyB8fCBzb3VyY2VzKT8ubWFwKChhdHRhY2htZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAvLyBEZXRlY3RhciBzaSBlcyB1biBhcmNoaXZvIGRlIGF1ZGlvXG4gICAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRUeXBlID0gYXR0YWNobWVudD8udHlwZT8udG9Mb3dlckNhc2UoKSB8fCAnJ1xuICAgICAgICAgICAgICBjb25zdCBhdHRhY2htZW50TmFtZSA9IGF0dGFjaG1lbnQ/Lm5hbWU/LnRvTG93ZXJDYXNlKCkgfHwgJydcbiAgICAgICAgICAgICAgY29uc3QgaXNBdWRpb0ZpbGUgPVxuICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRUeXBlLnN0YXJ0c1dpdGgoJ2F1ZGlvLycpIHx8XG4gICAgICAgICAgICAgICAgWydmbGFjJywgJ200YScsICdtcDMnLCAnbXA0JywgJ29nYScsICdvZ2cnLCAnd2F2JywgJ3dlYm0nXS5pbmNsdWRlcyhhdHRhY2htZW50VHlwZSkgfHxcbiAgICAgICAgICAgICAgICBbJy5mbGFjJywgJy5tNGEnLCAnLm1wMycsICcubXA0JywgJy5vZ2EnLCAnLm9nZycsICcud2F2JywgJy53ZWJtJ10uc29tZShleHQgPT5cbiAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnROYW1lLmVuZHNXaXRoKGV4dClcbiAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgaWYgKGlzQXVkaW9GaWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDxBdHRhY2htZW50Q2FyZEF1ZGlvIGtleT17YCR7YXR0YWNobWVudC5pZH0tJHthdHRhY2htZW50Lm5hbWV9YH0gYXR0YWNobWVudD17YXR0YWNobWVudH0gLz5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPEF0dGFjaG1lbnRDYXJkXG4gICAgICAgICAgICAgICAgICBrZXk9e2Ake2F0dGFjaG1lbnQuaWR9LSR7YXR0YWNobWVudC5uYW1lfWB9XG4gICAgICAgICAgICAgICAgICBhdHRhY2htZW50PXthdHRhY2htZW50fVxuICAgICAgICAgICAgICAgICAgcG9zaXRpb25JbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVBdHRhY2htZW50Q2xpY2soYXR0YWNobWVudCl9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPC9TQ0F0dGFjaG1lbnRzUm93PlxuICAgICAgICApfVxuICAgICAgICB7YXBwcm92YWwgJiYgYXBwcm92YWwucGVuZGluZ19hY3Rpb25zICYmIChcbiAgICAgICAgICA8U0NBcHByb3ZhbEFjdGlvbnNDb2x1bW4+XG4gICAgICAgICAgICB7YXBwcm92YWwucGVuZGluZ19hY3Rpb25zLm1hcChhY3Rpb24gPT4gKFxuICAgICAgICAgICAgICA8QXBwcm92YWxCb3hcbiAgICAgICAgICAgICAgICBrZXk9e2Ake2FjdGlvbi50aHJlYWRfaWR9LSR7YWN0aW9uLnRvb2xfY2FsbF9pZH1gfVxuICAgICAgICAgICAgICAgIGFjdGlvbj17YWN0aW9ufVxuICAgICAgICAgICAgICAgIHN0YXR1cz17YXBwcm92YWxTdGF0dXN9XG4gICAgICAgICAgICAgICAgb25BcHByb3ZlPXt0aHJlYWRJZCA9PiBoYW5kbGVBcHByb3ZhbERlY2lzaW9uKHRocmVhZElkLCAnYXBwcm92ZScpfVxuICAgICAgICAgICAgICAgIG9uUmVqZWN0PXt0aHJlYWRJZCA9PiBoYW5kbGVBcHByb3ZhbERlY2lzaW9uKHRocmVhZElkLCAncmVqZWN0Jyl9XG4gICAgICAgICAgICAgICAgaXNQcm9qZWN0RGVsZXRlZD17cHJvcHMucHJvamVjdE1ldGFkYXRhPy5pc19kZWxldGVkID09PSB0cnVlfVxuICAgICAgICAgICAgICAgIGlzRXhwYW5kZWQ9e3Byb3BzLmV4cGFuZGVkfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9TQ0FwcHJvdmFsQWN0aW9uc0NvbHVtbj5cbiAgICAgICAgKX1cbiAgICAgICAgeyEhbWVzc2FnZSAmJlxuICAgICAgICAgIC8vIFNpIGhheSBhcHByb3ZhbCAoZGlzdGludG8gZGUgbnVsbCksIG5vIHJlbmRlcml6YXIgZWwgYW5zd2VyIGVuIGVzdGUgbWVuc2FqZVxuICAgICAgICAgIC8vIEVsIG1lbnNhamUgZGUgcmVjaGF6byBzZSByZW5kZXJpemEgY29tbyBtZW5zYWplIHNlcGFyYWRvXG4gICAgICAgICAgIWFwcHJvdmFsICYmIChcbiAgICAgICAgICAgIDxTQ0NBSU1lc3NhZ2VXcmFwcGVyXG4gICAgICAgICAgICAgIGlzQ3VycmVudFVzZXI9e2lzQ3VycmVudFVzZXJ9XG4gICAgICAgICAgICAgIGlzRnJvbnRlbmRDYW5jZWxsZWQ9e3Byb3BzLmlzRnJvbnRlbmRDYW5jZWxsZWR9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17aXNBc3Npc3RhbnQgJiYgZXh0cmFjdFRhc2tzRnJvbU1lc3NhZ2UobWVzc2FnZSkubGVuZ3RoID4gMCA/ICdoYXMtdGFzay1saW5rcycgOiAnJ31cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgey8qIGxpbmtTYWZldHkgbW9kYWwgZGVzaGFiaWxpdGFkbyBwb3IgZWwgbW9tZW50bzogbGlua1NhZmV0eT17eyBlbmFibGVkOiB0cnVlIH19ICovfVxuICAgICAgICAgICAgICA8U3RyZWFtZG93blxuICAgICAgICAgICAgICAgIHBsdWdpbnM9e3sgY29kZSB9fVxuICAgICAgICAgICAgICAgIGNvbXBvbmVudHM9e3sgYTogQ3VzdG9tTGluayB9IGFzIFBhcmFtZXRlcnM8dHlwZW9mIFN0cmVhbWRvd24+WzBdWydjb21wb25lbnRzJ119XG4gICAgICAgICAgICAgICAgbGlua1NhZmV0eT17eyBlbmFibGVkOiBmYWxzZSB9fVxuICAgICAgICAgICAgICAgIGlzQW5pbWF0aW5nPXshIXByb3BzLmlzU3RyZWFtaW5nfVxuICAgICAgICAgICAgICAgIHNoaWtpVGhlbWU9e1snZ2l0aHViLWxpZ2h0JywgJ2dpdGh1Yi1saWdodCddfVxuICAgICAgICAgICAgICAgIGNvbnRyb2xzPXt7IHRhYmxlOiBmYWxzZSwgY29kZTogZmFsc2UgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHttZXNzYWdlfVxuICAgICAgICAgICAgICA8L1N0cmVhbWRvd24+XG4gICAgICAgICAgICA8L1NDQ0FJTWVzc2FnZVdyYXBwZXI+XG4gICAgICAgICAgKX1cbiAgICAgICAge2lzQXNzaXN0YW50ICYmICFpc0Vycm9yICYmICFwcm9wcy5pc0Zyb250ZW5kQ2FuY2VsbGVkICYmICFhcHByb3ZhbCAmJiAoXG4gICAgICAgICAgPE1lc3NhZ2VGZWVkYmFja1xuICAgICAgICAgICAgY29udGVudD17bWVzc2FnZX1cbiAgICAgICAgICAgIHNvdXJjZXM9e3NvdXJjZXN9XG4gICAgICAgICAgICBoYW5kbGVGZWVkYmFjaz17aGFuZGxlRmVlZGJhY2tDbGlja31cbiAgICAgICAgICAgIGRpc2FibGVGZWVkYmFjaz17ZGlzYWJsZUZlZWRiYWNrfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICA8L1NDTWVzc2FnZUl0ZW1Jbm5lcj5cbiAgICAgIDxBdHRhY2htZW50UHJldmlld01vZGFsXG4gICAgICAgIGlzT3Blbj17ISFwcmV2aWV3QXR0YWNobWVudH1cbiAgICAgICAgb25DbG9zZT17aGFuZGxlQ2xvc2VQcmV2aWV3fVxuICAgICAgICBhdHRhY2htZW50PXtwcmV2aWV3QXR0YWNobWVudH1cbiAgICAgIC8+XG4gICAgPC9TQ01lc3NhZ2VJdGVtV3JhcHBlcj5cbiAgKVxufSlcblxuY29uc3QgQ2hhdEFJTWVzc2FnZXNJbm5lciA9ICh7XG4gIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgaW5pdGlhbENoYXRJZCxcbiAgb25FcnJvcixcbiAgb25TZW5kTWVzc2FnZVJlYWR5LFxuICBvblNjcm9sbFRvQm90dG9tLFxuICBhdHRhY2htZW50cyxcbiAgYWdlbnRzLFxuICBleHBhbmRlZCxcbn06IENoYXRBSU1lc3NhZ2VzUHJvcHMpID0+IHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUKClcbiAgY29uc3QgeyBpc1dlYlNlYXJjaEFjdGl2ZSwgaXNEZWVwU2VhcmNoQWN0aXZlIH0gPSB1c2VHbG9iYWxDb250ZXh0KClcbiAgY29uc3QgYXV0aFVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3QgbWVzc2FnZXNSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IGNoYXRJbml0aWFsaXplZFJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgaXNMb2FkaW5nTW9yZVJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgdXNlclNjcm9sbGluZ1JlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3Qgc2Nyb2xsVGhyZXNob2xkUmVmID0gdXNlUmVmKDM5KVxuICBjb25zdCBsYXN0U2Nyb2xsVG9wUmVmID0gdXNlUmVmKDApXG4gIGNvbnN0IHNob3dTY3JvbGxUb0JvdHRvbVJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3Qgc2Nyb2xsUmFmUmVmID0gdXNlUmVmPG51bWJlciB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtzaG93U2Nyb2xsVG9Cb3R0b20sIHNldFNob3dTY3JvbGxUb0JvdHRvbV0gPSB1c2VTdGF0ZShmYWxzZSlcblxuICBjb25zdCB7XG4gICAgbWVzc2FnZXMsXG4gICAgbG9hZGluZ01lc3NhZ2VzLFxuICAgIGlzTG9hZGluZ01vcmVNZXNzYWdlcyxcbiAgICB3YWl0aW5nUmVzcG9uc2UsXG4gICAgaXNXcml0aW5nLFxuICAgIGxvYWRpbmdNZXNzYWdlLFxuICAgIGFjdGl2ZUxvYWRpbmdzLFxuICAgIHNlbmRNZXNzYWdlLFxuICAgIGNoYW5nZVByb2plY3QsXG4gICAgaGFuZGxlRmVlZGJhY2ssXG4gICAgaGFuZGxlQXBwcm92YWxEZWNpc2lvbixcbiAgICBpbml0aWFsaXplQ2hhdCxcbiAgICBoYW5kbGVTY3JvbGwsXG4gICAgc3RvcEdlbmVyYXRpb24sXG4gIH0gPSB1c2VDaGF0TWFuYWdlcih7XG4gICAgY2hhdElkOiBpbml0aWFsQ2hhdElkIHx8IHVuZGVmaW5lZCxcbiAgICB1c2VySW5pdGlhbE1lc3NhZ2UsXG4gICAgb25FcnJvcixcbiAgICBhdHRhY2htZW50cyxcbiAgICBhZ2VudHMsXG4gIH0pXG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0T3B0aW9uID0gKG9wdGlvbjogUHJvamVjdCkgPT4ge1xuICAgIGNoYW5nZVByb2plY3Qob3B0aW9uKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQ2xpY2tTY3JvbGxUb0JvdHRvbSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAobWVzc2FnZXNSZWYuY3VycmVudCkge1xuICAgICAgbWVzc2FnZXNSZWYuY3VycmVudC5zY3JvbGxUbyh7XG4gICAgICAgIHRvcDogbWVzc2FnZXNSZWYuY3VycmVudC5zY3JvbGxIZWlnaHQsXG4gICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgIH0pXG4gICAgICAvLyBBY3R1YWxpemFyIGVzdGFkbyBkZXNwdcOpcyBkZSB1biBicmV2ZSBkZWxheSBwYXJhIHBlcm1pdGlyIHF1ZSBlbCBzY3JvbGwgc2UgY29tcGxldGVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAobWVzc2FnZXNSZWYuY3VycmVudCkge1xuICAgICAgICAgIGNvbnN0IHsgc2Nyb2xsVG9wLCBzY3JvbGxIZWlnaHQsIGNsaWVudEhlaWdodCB9ID0gbWVzc2FnZXNSZWYuY3VycmVudFxuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IHNjcm9sbEhlaWdodCAtIHNjcm9sbFRvcCAtIGNsaWVudEhlaWdodFxuICAgICAgICAgIGNvbnN0IHNob3VsZFNob3cgPSBkaXN0YW5jZUZyb21Cb3R0b20gPiA1MFxuICAgICAgICAgIHNob3dTY3JvbGxUb0JvdHRvbVJlZi5jdXJyZW50ID0gc2hvdWxkU2hvd1xuICAgICAgICAgIHNldFNob3dTY3JvbGxUb0JvdHRvbShzaG91bGRTaG93KVxuICAgICAgICB9XG4gICAgICB9LCA1MDApXG4gICAgfVxuICB9LCBbXSlcblxuICBjb25zdCBoYW5kbGVTY3JvbGxUb0JvdHRvbSA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5VSUV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZS5jdXJyZW50VGFyZ2V0XG5cbiAgICAgIGlmIChzY3JvbGxSYWZSZWYuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShzY3JvbGxSYWZSZWYuY3VycmVudClcbiAgICAgIH1cblxuICAgICAgc2Nyb2xsUmFmUmVmLmN1cnJlbnQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICBzY3JvbGxSYWZSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0IH0gPSBjb250YWluZXJcblxuICAgICAgICBjb25zdCBpc1Njcm9sbGluZ1VwID0gc2Nyb2xsVG9wIDwgbGFzdFNjcm9sbFRvcFJlZi5jdXJyZW50XG5cbiAgICAgICAgaWYgKGlzU2Nyb2xsaW5nVXApIHtcbiAgICAgICAgICBzY3JvbGxUaHJlc2hvbGRSZWYuY3VycmVudCA9IDE1XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc05lYXJCb3R0b20gPSBzY3JvbGxIZWlnaHQgLSBzY3JvbGxUb3AgLSBjbGllbnRIZWlnaHQgPCBzY3JvbGxUaHJlc2hvbGRSZWYuY3VycmVudFxuXG4gICAgICAgIGlmIChpc05lYXJCb3R0b20pIHtcbiAgICAgICAgICBzY3JvbGxUaHJlc2hvbGRSZWYuY3VycmVudCA9IDM5XG4gICAgICAgIH1cblxuICAgICAgICB1c2VyU2Nyb2xsaW5nUmVmLmN1cnJlbnQgPSAhaXNOZWFyQm90dG9tXG4gICAgICAgIGxhc3RTY3JvbGxUb3BSZWYuY3VycmVudCA9IHNjcm9sbFRvcFxuXG4gICAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IHNjcm9sbEhlaWdodCAtIHNjcm9sbFRvcCAtIGNsaWVudEhlaWdodFxuICAgICAgICBjb25zdCBzaG91bGRTaG93ID0gZGlzdGFuY2VGcm9tQm90dG9tID4gNTBcbiAgICAgICAgY29uc3QgZGlkU2V0U3RhdGUgPSBzaG93U2Nyb2xsVG9Cb3R0b21SZWYuY3VycmVudCAhPT0gc2hvdWxkU2hvd1xuICAgICAgICBpZiAoZGlkU2V0U3RhdGUpIHtcbiAgICAgICAgICBzaG93U2Nyb2xsVG9Cb3R0b21SZWYuY3VycmVudCA9IHNob3VsZFNob3dcbiAgICAgICAgICBzZXRTaG93U2Nyb2xsVG9Cb3R0b20oc2hvdWxkU2hvdylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc05lYXJCb3R0b20gJiYgb25TY3JvbGxUb0JvdHRvbSkge1xuICAgICAgICAgIG9uU2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICB9XG5cbiAgICAgICAgaGFuZGxlU2Nyb2xsKGNvbnRhaW5lcilcbiAgICAgIH0pXG4gICAgfSxcbiAgICBbb25TY3JvbGxUb0JvdHRvbSwgaGFuZGxlU2Nyb2xsXVxuICApXG5cbiAgLy8gcmVmcyB0byBzdGFiaWxpemUgZnVuY3Rpb25zIGFuZCBhdm9pZCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gIGNvbnN0IHNlbmRNZXNzYWdlUmVmID0gdXNlUmVmKHNlbmRNZXNzYWdlKVxuICBjb25zdCBzdG9wR2VuZXJhdGlvblJlZiA9IHVzZVJlZihzdG9wR2VuZXJhdGlvbilcbiAgY29uc3Qgb25TZW5kTWVzc2FnZVJlYWR5UmVmID0gdXNlUmVmKG9uU2VuZE1lc3NhZ2VSZWFkeSlcblxuICAvLyB1cGRhdGUgcmVmcyB3aGVuIGZ1bmN0aW9ucyBjaGFuZ2VcbiAgc2VuZE1lc3NhZ2VSZWYuY3VycmVudCA9IHNlbmRNZXNzYWdlXG4gIHN0b3BHZW5lcmF0aW9uUmVmLmN1cnJlbnQgPSBzdG9wR2VuZXJhdGlvblxuICBvblNlbmRNZXNzYWdlUmVhZHlSZWYuY3VycmVudCA9IG9uU2VuZE1lc3NhZ2VSZWFkeVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKG9uU2VuZE1lc3NhZ2VSZWFkeVJlZi5jdXJyZW50KSB7XG4gICAgICBvblNlbmRNZXNzYWdlUmVhZHlSZWYuY3VycmVudChzZW5kTWVzc2FnZVJlZi5jdXJyZW50LCBzdG9wR2VuZXJhdGlvblJlZi5jdXJyZW50LCB3YWl0aW5nUmVzcG9uc2UsIGlzV3JpdGluZylcbiAgICB9XG4gIH0sIFt3YWl0aW5nUmVzcG9uc2UsIGlzV3JpdGluZ10pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpc0xvYWRpbmdNb3JlUmVmLmN1cnJlbnQgPSBpc0xvYWRpbmdNb3JlTWVzc2FnZXNcbiAgfSwgW2lzTG9hZGluZ01vcmVNZXNzYWdlc10pXG5cbiAgLy8gQ3VhbmRvIGVsIGFnZW50ZSBlbXBpZXphIGEgcmVzcG9uZGVyLCByZXNldGVhciBlbCBmbGFnIHkgZWwgdW1icmFsIHBhcmEgYWN0aXZhciBlbCBhdXRvLXNjcm9sbFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh3YWl0aW5nUmVzcG9uc2UpIHtcbiAgICAgIHVzZXJTY3JvbGxpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICBzY3JvbGxUaHJlc2hvbGRSZWYuY3VycmVudCA9IDM5XG4gICAgfVxuICB9LCBbd2FpdGluZ1Jlc3BvbnNlXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghY2hhdEluaXRpYWxpemVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNoYXRJbml0aWFsaXplZFJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgaW5pdGlhbGl6ZUNoYXQoKVxuICAgIH1cbiAgfSwgW10pXG5cbiAgLy8gU2Nyb2xsIGN1YW5kbyBsbGVnYSB1biBtZW5zYWplIGRlIGFwcm9iYWNpw7NuIChBcHByb3ZhbEJveCkuIFNpbiBSZXNpemVPYnNlcnZlciBlbiBlbFxuICAvLyBjb250ZW5lZG9yOiBvYnNlcnZhcmxvIGRpc3BhcmFiYSBjYWxsYmFja3MgYWwgY2FtYmlhciBlbCBsYXlvdXQvc2Nyb2xsYmFyIHkgY2FkYSB1bm9cbiAgLy8gbGxhbWFiYSBzY3JvbGxUb0JvdHRvbSgpLCBwcm92b2NhbmRvIHRpcm9uZXMgYWwgc2Nyb2xsZWFyLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghbWVzc2FnZXNSZWYuY3VycmVudCB8fCBsb2FkaW5nTWVzc2FnZXMgfHwgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3QgbGFzdE1lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXVxuICAgIGNvbnN0IGhhc0FwcHJvdmFsID0gbGFzdE1lc3NhZ2UgJiYgKGxhc3RNZXNzYWdlLmlkLnN0YXJ0c1dpdGgoJ2FwcHJvdmFsLScpIHx8ICEhbGFzdE1lc3NhZ2UuYXBwcm92YWwpXG5cbiAgICBpZiAoIWhhc0FwcHJvdmFsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVyID0gbWVzc2FnZXNSZWYuY3VycmVudFxuICAgIGNvbnN0IGlzQXRCb3R0b20gPSBjb250YWluZXIuc2Nyb2xsSGVpZ2h0IC0gY29udGFpbmVyLnNjcm9sbFRvcCA8PSBjb250YWluZXIuY2xpZW50SGVpZ2h0ICsgMTAwXG5cbiAgICBpZiAoIShpc0F0Qm90dG9tIHx8ICF1c2VyU2Nyb2xsaW5nUmVmLmN1cnJlbnQpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3Qgc2Nyb2xsVG9Cb3R0b20gPSAoKSA9PiB7XG4gICAgICBpZiAobWVzc2FnZXNSZWYuY3VycmVudCkge1xuICAgICAgICBtZXNzYWdlc1JlZi5jdXJyZW50LnNjcm9sbFRvcCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQuc2Nyb2xsSGVpZ2h0XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2VjdWVuY2lhIGluaWNpYWwgZGUgc2Nyb2xsIHBhcmEgY3VhbmRvIGVsIEFwcHJvdmFsQm94IGFjYWJhIGRlIHJlbmRlcml6YXJzZVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBzY3JvbGxUb0JvdHRvbSgpXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICBzY3JvbGxUb0JvdHRvbSgpXG4gICAgICAgIHNldFRpbWVvdXQoc2Nyb2xsVG9Cb3R0b20sIDEwMClcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSwgW21lc3NhZ2VzLCBsb2FkaW5nTWVzc2FnZXMsIGlzTG9hZGluZ01vcmVNZXNzYWdlc10pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBTaSBlbCB1c3VhcmlvIGVzdMOhIHNjcm9sbGVhbmRvIG1hbnVhbG1lbnRlLCBubyBoYWNlciBhdXRvIHNjcm9sbFxuICAgIGlmICh1c2VyU2Nyb2xsaW5nUmVmLmN1cnJlbnQgJiYgd2FpdGluZ1Jlc3BvbnNlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAod2FpdGluZ1Jlc3BvbnNlICYmIG1lc3NhZ2VzUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlc1JlZi5jdXJyZW50KSB7XG4gICAgICAgICAgbWVzc2FnZXNSZWYuY3VycmVudC5zY3JvbGxUb3AgPSBtZXNzYWdlc1JlZi5jdXJyZW50LnNjcm9sbEhlaWdodFxuICAgICAgICAgIGNvbnN0IHsgc2Nyb2xsVG9wLCBzY3JvbGxIZWlnaHQsIGNsaWVudEhlaWdodCB9ID0gbWVzc2FnZXNSZWYuY3VycmVudFxuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IHNjcm9sbEhlaWdodCAtIHNjcm9sbFRvcCAtIGNsaWVudEhlaWdodFxuICAgICAgICAgIGNvbnN0IHNob3VsZFNob3cgPSBkaXN0YW5jZUZyb21Cb3R0b20gPiA1MFxuICAgICAgICAgIHNob3dTY3JvbGxUb0JvdHRvbVJlZi5jdXJyZW50ID0gc2hvdWxkU2hvd1xuICAgICAgICAgIHNldFNob3dTY3JvbGxUb0JvdHRvbShzaG91bGRTaG93KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFtZXNzYWdlc1JlZi5jdXJyZW50IHx8IGxvYWRpbmdNZXNzYWdlcyB8fCBpc0xvYWRpbmdNb3JlTWVzc2FnZXMgfHwgaXNMb2FkaW5nTW9yZVJlZi5jdXJyZW50KSByZXR1cm5cblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICBjb25zdCBsYXN0TWVzc2FnZSA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdXG5cbiAgICBjb25zdCBpc05ld0Fuc3dlck1lc3NhZ2UgPSBsYXN0TWVzc2FnZSAmJiBsYXN0TWVzc2FnZS5pZC5zdGFydHNXaXRoKCdhbnN3ZXItJylcbiAgICBjb25zdCBpc05ld1VzZXJNZXNzYWdlID0gbGFzdE1lc3NhZ2UgJiYgbGFzdE1lc3NhZ2UuaWQuc3RhcnRzV2l0aCgncXVlc3Rpb24tJylcbiAgICBjb25zdCBpc05ld0FwcHJvdmFsTWVzc2FnZSA9IGxhc3RNZXNzYWdlICYmIChsYXN0TWVzc2FnZS5pZC5zdGFydHNXaXRoKCdhcHByb3ZhbC0nKSB8fCAhIWxhc3RNZXNzYWdlLmFwcHJvdmFsKVxuICAgIGNvbnN0IGlzQXRCb3R0b20gPSBjb250YWluZXIuc2Nyb2xsSGVpZ2h0IC0gY29udGFpbmVyLnNjcm9sbFRvcCA8PSBjb250YWluZXIuY2xpZW50SGVpZ2h0ICsgMTAwXG4gICAgY29uc3QgaGFzTWVzc2FnZXMgPSAhIW1lc3NhZ2VzLmxlbmd0aFxuICAgIGNvbnN0IGlzTm90SW5pdGlhbE1lc3NhZ2UgPSAhbWVzc2FnZXMuc29tZShtc2cgPT4gbXNnLmlkID09PSAndXNlci1pbml0aWFsLW1lc3NhZ2UnKVxuXG4gICAgaWYgKChpc05ld0Fuc3dlck1lc3NhZ2UgfHwgaXNOZXdVc2VyTWVzc2FnZSB8fCBpc05ld0FwcHJvdmFsTWVzc2FnZSkgJiYgaXNBdEJvdHRvbSkge1xuICAgICAgLy8gUGFyYSBtZW5zYWplcyBkZSBhcHJvYmFjacOzbiwgdXNhciB1biBwZXF1ZcOxbyBkZWxheSBwYXJhIGFzZWd1cmFyIHF1ZSBlbCBBcHByb3ZhbEJveCBzZSBoYXlhIHJlbmRlcml6YWRvXG4gICAgICBjb25zdCBzY3JvbGxEZWxheSA9IGlzTmV3QXBwcm92YWxNZXNzYWdlID8gMTAwIDogMFxuICAgICAgY29uc3QgZG9TY3JvbGwgPSAoKSA9PiB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKG1lc3NhZ2VzUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIG1lc3NhZ2VzUmVmLmN1cnJlbnQuc2Nyb2xsVG9wID0gbWVzc2FnZXNSZWYuY3VycmVudC5zY3JvbGxIZWlnaHRcbiAgICAgICAgICAgIGNvbnN0IHsgc2Nyb2xsVG9wLCBzY3JvbGxIZWlnaHQsIGNsaWVudEhlaWdodCB9ID0gbWVzc2FnZXNSZWYuY3VycmVudFxuICAgICAgICAgICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsVG9wIC0gY2xpZW50SGVpZ2h0XG4gICAgICAgICAgICBjb25zdCBzaG91bGRTaG93ID0gZGlzdGFuY2VGcm9tQm90dG9tID4gNTBcbiAgICAgICAgICAgIHNob3dTY3JvbGxUb0JvdHRvbVJlZi5jdXJyZW50ID0gc2hvdWxkU2hvd1xuICAgICAgICAgICAgc2V0U2hvd1Njcm9sbFRvQm90dG9tKHNob3VsZFNob3cpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKHNjcm9sbERlbGF5ID4gMCkge1xuICAgICAgICBzZXRUaW1lb3V0KGRvU2Nyb2xsLCBzY3JvbGxEZWxheSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvU2Nyb2xsKClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgaGFzTWVzc2FnZXMgJiZcbiAgICAgIGlzTm90SW5pdGlhbE1lc3NhZ2UgJiZcbiAgICAgICFpc05ld0Fuc3dlck1lc3NhZ2UgJiZcbiAgICAgICFpc05ld1VzZXJNZXNzYWdlICYmXG4gICAgICAhaXNOZXdBcHByb3ZhbE1lc3NhZ2VcbiAgICApIHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlc1JlZi5jdXJyZW50KSB7XG4gICAgICAgICAgbWVzc2FnZXNSZWYuY3VycmVudC5zY3JvbGxUb3AgPSBtZXNzYWdlc1JlZi5jdXJyZW50LnNjcm9sbEhlaWdodFxuICAgICAgICAgIGNvbnN0IHsgc2Nyb2xsVG9wLCBzY3JvbGxIZWlnaHQsIGNsaWVudEhlaWdodCB9ID0gbWVzc2FnZXNSZWYuY3VycmVudFxuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IHNjcm9sbEhlaWdodCAtIHNjcm9sbFRvcCAtIGNsaWVudEhlaWdodFxuICAgICAgICAgIGNvbnN0IHNob3VsZFNob3cgPSBkaXN0YW5jZUZyb21Cb3R0b20gPiA1MFxuICAgICAgICAgIHNob3dTY3JvbGxUb0JvdHRvbVJlZi5jdXJyZW50ID0gc2hvdWxkU2hvd1xuICAgICAgICAgIHNldFNob3dTY3JvbGxUb0JvdHRvbShzaG91bGRTaG93KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfSwgW21lc3NhZ2VzLCBsb2FkaW5nTWVzc2FnZXMsIGlzTG9hZGluZ01vcmVNZXNzYWdlcywgd2FpdGluZ1Jlc3BvbnNlXSlcblxuICAvLyBWZXJpZmljYXIgZWwgZXN0YWRvIGluaWNpYWwgZGVsIHNjcm9sbFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChtZXNzYWdlc1JlZi5jdXJyZW50ICYmICFsb2FkaW5nTWVzc2FnZXMpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICAgIGNvbnN0IHsgc2Nyb2xsVG9wLCBzY3JvbGxIZWlnaHQsIGNsaWVudEhlaWdodCB9ID0gY29udGFpbmVyXG4gICAgICBjb25zdCBkaXN0YW5jZUZyb21Cb3R0b20gPSBzY3JvbGxIZWlnaHQgLSBzY3JvbGxUb3AgLSBjbGllbnRIZWlnaHRcbiAgICAgIGNvbnN0IHNob3VsZFNob3cgPSBkaXN0YW5jZUZyb21Cb3R0b20gPiA1MFxuICAgICAgc2hvd1Njcm9sbFRvQm90dG9tUmVmLmN1cnJlbnQgPSBzaG91bGRTaG93XG4gICAgICBzZXRTaG93U2Nyb2xsVG9Cb3R0b20oc2hvdWxkU2hvdylcbiAgICB9XG4gIH0sIFtsb2FkaW5nTWVzc2FnZXMsIG1lc3NhZ2VzLmxlbmd0aF0pXG5cbiAgLy8gT2J0ZW5lciBlbCDDumx0aW1vIG1lbnNhamUgZGVsIHVzdWFyaW8gcGFyYSB2ZXJpZmljYXIgc2kgdGllbmUgYXR0YWNobWVudHNcbiAgY29uc3QgbGFzdFVzZXJNZXNzYWdlID0gbWVzc2FnZXNcbiAgICAuZmlsdGVyKG1zZyA9PiBtc2cucm9sZSA9PT0gQ2hhdEhpc3RvcnlSb2xlLlVTRVIgfHwgbXNnLnVzZXIuaWQgPT09IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCkpXG4gICAgLmF0KC0xKVxuXG4gIGNvbnN0IGhhc0F0dGFjaG1lbnRzID1cbiAgICAoQXJyYXkuaXNBcnJheShsYXN0VXNlck1lc3NhZ2U/LmF0dGFjaG1lbnRzKSAmJiBsYXN0VXNlck1lc3NhZ2UuYXR0YWNobWVudHMubGVuZ3RoKSB8fFxuICAgIChBcnJheS5pc0FycmF5KGxhc3RVc2VyTWVzc2FnZT8uc291cmNlcykgJiYgbGFzdFVzZXJNZXNzYWdlLnNvdXJjZXMubGVuZ3RoKVxuXG4gIGNvbnN0IGlzU2Nyb2xsT25QYXJlbnQgPSAhIWV4cGFuZGVkXG5cbiAgY29uc3QgbWVzc2FnZXNDb250ZW50ID0gKFxuICAgIDw+XG4gICAgICB7aXNMb2FkaW5nTW9yZU1lc3NhZ2VzICYmIDxMb2FkaW5nVGV4dCB0ZXh0PXt0KCdjaGF0LmxvYWRpbmdNb3JlJyl9IC8+fVxuICAgICAge21lc3NhZ2VzLm1hcCgobWVzc2FnZSwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICEobWVzc2FnZS5hdHRhY2htZW50cz8ubGVuZ3RoIHx8IG1lc3NhZ2Uuc291cmNlcz8ubGVuZ3RoKSAmJlxuICAgICAgICAgICFtZXNzYWdlLm1lc3NhZ2UgJiZcbiAgICAgICAgICAhbWVzc2FnZS5wcm9qZWN0Py5uYW1lICYmXG4gICAgICAgICAgIW1lc3NhZ2UuYXBwcm92YWxcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VGZWVkYmFjayA9XG4gICAgICAgICAgbWVzc2FnZT8ud2FzSGVscGZ1bCA9PT0gdW5kZWZpbmVkIHx8IG1lc3NhZ2Uud2FzSGVscGZ1bCA9PT0gbnVsbFxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IG1lc3NhZ2Uud2FzSGVscGZ1bFxuICAgICAgICAgICAgICA/IEZlZWRiYWNrLlRIVU1CU19VUFxuICAgICAgICAgICAgICA6IEZlZWRiYWNrLlRIVU1CU19ET1dOXG5cbiAgICAgICAgY29uc3QgaXNBc3Npc3RhbnRNZXNzYWdlID0gbWVzc2FnZS5yb2xlID09PSBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5UIHx8IG1lc3NhZ2UudXNlci5pZCA9PT0gJ2Fzc2lzdGFudCdcbiAgICAgICAgY29uc3QgaXNMYXN0TWVzc2FnZSA9IGluZGV4ID09PSBtZXNzYWdlcy5sZW5ndGggLSAxXG4gICAgICAgIGNvbnN0IGlzU3RyZWFtaW5nID0gaXNBc3Npc3RhbnRNZXNzYWdlICYmIGlzTGFzdE1lc3NhZ2UgJiYgKHdhaXRpbmdSZXNwb25zZSB8fCBpc1dyaXRpbmcpXG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8TWVzc2FnZUl0ZW1cbiAgICAgICAgICAgIHsuLi5tZXNzYWdlfVxuICAgICAgICAgICAga2V5PXttZXNzYWdlLmlkICE9IG51bGwgPyBgJHttZXNzYWdlLmlkfS0ke21lc3NhZ2UuZGF0ZX1gIDogYG1zZy0ke2luZGV4fWB9XG4gICAgICAgICAgICBhdXRoVXNlcj17YXV0aFVzZXJ9XG4gICAgICAgICAgICBoYW5kbGVTZWxlY3RPcHRpb249e2hhbmRsZVNlbGVjdE9wdGlvbn1cbiAgICAgICAgICAgIGhhbmRsZUZlZWRiYWNrPXtoYW5kbGVGZWVkYmFja31cbiAgICAgICAgICAgIGhhbmRsZUFwcHJvdmFsRGVjaXNpb249e2hhbmRsZUFwcHJvdmFsRGVjaXNpb259XG4gICAgICAgICAgICBkaXNhYmxlRmVlZGJhY2s9e21lc3NhZ2VGZWVkYmFja31cbiAgICAgICAgICAgIGlzU3RyZWFtaW5nPXtpc1N0cmVhbWluZ31cbiAgICAgICAgICAgIGV4cGFuZGVkPXtleHBhbmRlZH1cbiAgICAgICAgICAvPlxuICAgICAgICApXG4gICAgICB9KX1cbiAgICAgIHsod2FpdGluZ1Jlc3BvbnNlIHx8IGxvYWRpbmdNZXNzYWdlIHx8IE9iamVjdC5rZXlzKGFjdGl2ZUxvYWRpbmdzIHx8IHt9KS5sZW5ndGggPiAwKSAmJiAoXG4gICAgICAgIDxTQ0xvYWRpbmdNZXNzYWdlc0NvbHVtbj5cbiAgICAgICAgICB7KHdhaXRpbmdSZXNwb25zZSB8fCBsb2FkaW5nTWVzc2FnZSkgJiYgKFxuICAgICAgICAgICAgPExvYWRpbmdUZXh0XG4gICAgICAgICAgICAgIHRleHQ9e1xuICAgICAgICAgICAgICAgIGxvYWRpbmdNZXNzYWdlIHx8XG4gICAgICAgICAgICAgICAgKGlzV2ViU2VhcmNoQWN0aXZlXG4gICAgICAgICAgICAgICAgICA/ICdCdXNjYW5kbyBlbiBsYSB3ZWInXG4gICAgICAgICAgICAgICAgICA6IGlzRGVlcFNlYXJjaEFjdGl2ZVxuICAgICAgICAgICAgICAgICAgICA/IHQoJ2NoYXQuZ2VuZXJhdGluZ0RlZXBTZWFyY2gnKVxuICAgICAgICAgICAgICAgICAgICA6IGhhc0F0dGFjaG1lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgPyB0KCdjaGF0LmdlbmVyYXRpbmdBdHRhY2htZW50JylcbiAgICAgICAgICAgICAgICAgICAgICA6IHQoJ2NoYXQuZ2VuZXJhdGluZycpKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgICAge09iamVjdC5lbnRyaWVzKGFjdGl2ZUxvYWRpbmdzIHx8IHt9KS5tYXAoKFt0aHJlYWRJZCwgbWVzc2FnZV0pID0+IChcbiAgICAgICAgICAgIDxMb2FkaW5nVGV4dCBrZXk9e2Bsb2FkaW5nLSR7dGhyZWFkSWR9YH0gdGV4dD17bWVzc2FnZX0gLz5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9TQ0xvYWRpbmdNZXNzYWdlc0NvbHVtbj5cbiAgICAgICl9XG4gICAgPC8+XG4gIClcblxuICByZXR1cm4gKFxuICAgIDxTQ01lc3NhZ2VzT3V0ZXIgJHNjcm9sbE9uUGFyZW50PXtpc1Njcm9sbE9uUGFyZW50fT5cbiAgICAgIHtpc1Njcm9sbE9uUGFyZW50ID8gKFxuICAgICAgICA8U0NNZXNzYWdlc1Njcm9sbCByZWY9e21lc3NhZ2VzUmVmfSBvblNjcm9sbD17aGFuZGxlU2Nyb2xsVG9Cb3R0b219PlxuICAgICAgICAgIDxTQ01lc3NhZ2VzSW5uZXIgJHNjcm9sbE9uUGFyZW50PXtpc1Njcm9sbE9uUGFyZW50fT57bWVzc2FnZXNDb250ZW50fTwvU0NNZXNzYWdlc0lubmVyPlxuICAgICAgICA8L1NDTWVzc2FnZXNTY3JvbGw+XG4gICAgICApIDogKFxuICAgICAgICA8U0NNZXNzYWdlc0lubmVyIHJlZj17bWVzc2FnZXNSZWZ9IG9uU2Nyb2xsPXtoYW5kbGVTY3JvbGxUb0JvdHRvbX0gJHNjcm9sbE9uUGFyZW50PXtmYWxzZX0+XG4gICAgICAgICAge21lc3NhZ2VzQ29udGVudH1cbiAgICAgICAgPC9TQ01lc3NhZ2VzSW5uZXI+XG4gICAgICApfVxuXG4gICAgICB7c2hvd1Njcm9sbFRvQm90dG9tICYmIChcbiAgICAgICAgPFNjcm9sbFRvQm90dG9tQnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXtoYW5kbGVDbGlja1Njcm9sbFRvQm90dG9tfT5cbiAgICAgICAgICA8QXJyb3dTbWFsbERvd24gY29sb3I9XCIjNjY2XCIgd2lkdGg9XCIyMHB4XCIgaGVpZ2h0PVwiMjBweFwiIC8+XG4gICAgICAgIDwvU2Nyb2xsVG9Cb3R0b21CdXR0b24+XG4gICAgICApfVxuXG4gICAgICB7bG9hZGluZ01lc3NhZ2VzICYmIDxMb2FkZXIgLz59XG4gICAgPC9TQ01lc3NhZ2VzT3V0ZXI+XG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IENoYXRBSU1lc3NhZ2VzID0gUmVhY3QubWVtbyhDaGF0QUlNZXNzYWdlc0lubmVyKVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPQSxLQUFLLElBQVFDLElBQUksRUFBYUMsU0FBUyxFQUFFQyxNQUFNLEVBQUVDLFFBQVEsRUFBRUMsV0FBVyxFQUFBQyxhQUFBLElBQUFDLGNBQUEsUUFBUSxPQUFPO0FBQzVGLFNBQVNDLFVBQVUsUUFBUSxZQUFZO0FBQ3ZDLFNBQVNDLGdCQUFnQixRQUFRLGtCQUFrQjtBQUNuRCxTQUFTQyxjQUFjLFFBQVEsaURBQWlEO0FBRWhGLFNBQVNDLGNBQWMsUUFBUSwyQ0FBMkM7QUFDMUUsU0FBU0MsV0FBVyxRQUFRLHFDQUFxQztBQUNqRSxTQUFTQyxzQkFBc0IsUUFBUSxvQ0FBb0M7QUFDM0UsU0FBU0MsbUJBQW1CLFFBQVEsZ0RBQWdEO0FBRXBGLFNBQXNCQyxlQUFlLFFBQWtCLHFCQUFxQjtBQUU1RSxTQUFrQkMsT0FBTyxRQUFRLDJCQUEyQjtBQUU1RCxTQUFTQyxJQUFJLFFBQVEscUJBQXFCO0FBQzFDLFNBQVNDLGNBQWMsUUFBUSw4Q0FBOEM7QUFDN0UsU0FBU0MsWUFBWSxRQUFRLDZCQUE2QjtBQUUxRCxTQUFTQyxXQUFXLFFBQVEseUJBQXlCO0FBQ3JELFNBQVNDLE1BQU0sUUFBUSxvQkFBb0I7QUFJM0MsU0FBU0MsZUFBZSxFQUFFQyxnQkFBZ0IsRUFBRUMsc0JBQXNCLEVBQUVDLHVCQUF1QixRQUFRLFVBQVU7QUFDN0csU0FBU0MsZUFBZSxRQUFRLG9CQUFvQjtBQUNwRCxTQUNFQyxtQkFBbUIsRUFDbkJDLG9CQUFvQixFQUNwQkMsZUFBZSxFQUNmQyxnQkFBZ0IsRUFDaEJDLGVBQWUsRUFDZkMs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