import { c as _c } from "react/compiler-runtime"; import React, { createContext, useCallback, useContext, useEffect, useState } from 'react'; import { useIsInsideModal, useModalScrollRef } from '../../context/modalContext.js'; import { useTerminalSize } from '../../hooks/useTerminalSize.js'; import ScrollBox from '../../ink/components/ScrollBox.js'; import type { KeyboardEvent } from '../../ink/events/keyboard-event.js'; import { stringWidth } from '../../ink/stringWidth.js'; import { Box, Text } from '../../ink.js'; import { useKeybindings } from '../../keybindings/useKeybinding.js'; import type { Theme } from '../../utils/theme.js'; type TabsProps = { children: Array>; title?: string; color?: keyof Theme; defaultTab?: string; hidden?: boolean; useFullWidth?: boolean; /** Controlled mode: current selected tab id/title */ selectedTab?: string; /** Controlled mode: callback when tab changes */ onTabChange?: (tabId: string) => void; /** Optional banner to display below tabs header */ banner?: React.ReactNode; /** Disable keyboard navigation (e.g. when a child component handles arrow keys) */ disableNavigation?: boolean; /** * Initial focus state for the tab header row. Defaults to true (header * focused, nav always works). Keep the default for Select/list content — * those only use up/down so there's no conflict; pass * isDisabled={headerFocused} to the Select instead. Only set false when * content actually binds left/right/tab (e.g. enum cycling), and show a * "↑ tabs" footer hint — without it tabs look broken. */ initialHeaderFocused?: boolean; /** * Fixed height for the content area. When set, all tabs render within the * same height (overflow hidden) so switching tabs doesn't cause layout * shifts. Shorter tabs get whitespace; taller tabs are clipped. */ contentHeight?: number; /** * Let Tab/←/→ switch tabs from focused content. Opt-in since some * content uses those keys; pass a reactive boolean to cede them when * needed. Switching from content focuses the header. */ navFromContent?: boolean; }; type TabsContextValue = { selectedTab: string | undefined; width: number | undefined; headerFocused: boolean; focusHeader: () => void; blurHeader: () => void; registerOptIn: () => () => void; }; const TabsContext = createContext({ selectedTab: undefined, width: undefined, // Default for components rendered outside a Tabs (tests, standalone): // content has focus, focusHeader is a no-op. headerFocused: false, focusHeader: () => {}, blurHeader: () => {}, registerOptIn: () => () => {} }); export function Tabs(t0) { const $ = _c(25); const { title, color, defaultTab, children, hidden, useFullWidth, selectedTab: controlledSelectedTab, onTabChange, banner, disableNavigation, initialHeaderFocused: t1, contentHeight, navFromContent: t2 } = t0; const initialHeaderFocused = t1 === undefined ? true : t1; const navFromContent = t2 === undefined ? false : t2; const { columns: terminalWidth } = useTerminalSize(); const tabs = children.map(_temp); const defaultTabIndex = defaultTab ? tabs.findIndex(tab => defaultTab === tab[0]) : 0; const isControlled = controlledSelectedTab !== undefined; const [internalSelectedTab, setInternalSelectedTab] = useState(defaultTabIndex !== -1 ? defaultTabIndex : 0); const controlledTabIndex = isControlled ? tabs.findIndex(tab_0 => tab_0[0] === controlledSelectedTab) : -1; const selectedTabIndex = isControlled ? controlledTabIndex !== -1 ? controlledTabIndex : 0 : internalSelectedTab; const modalScrollRef = useModalScrollRef(); const [headerFocused, setHeaderFocused] = useState(initialHeaderFocused); let t3; if ($[0] === Symbol.for("react.memo_cache_sentinel")) { t3 = () => setHeaderFocused(true); $[0] = t3; } else { t3 = $[0]; } const focusHeader = t3; let t4; if ($[1] === Symbol.for("react.memo_cache_sentinel")) { t4 = () => setHeaderFocused(false); $[1] = t4; } else { t4 = $[1]; } const blurHeader = t4; const [optInCount, setOptInCount] = useState(0); let t5; if ($[2] === Symbol.for("react.memo_cache_sentinel")) { t5 = () => { setOptInCount(_temp2); return () => setOptInCount(_temp3); }; $[2] = t5; } else { t5 = $[2]; } const registerOptIn = t5; const optedIn = optInCount > 0; const handleTabChange = offset => { const newIndex = (selectedTabIndex + tabs.length + offset) % tabs.length; const newTabId = tabs[newIndex]?.[0]; if (isControlled && onTabChange && newTabId) { onTabChange(newTabId); } else { setInternalSelectedTab(newIndex); } setHeaderFocused(true); }; const t6 = !hidden && !disableNavigation && headerFocused; let t7; if ($[3] !== t6) { t7 = { context: "Tabs", isActive: t6 }; $[3] = t6; $[4] = t7; } else { t7 = $[4]; } useKeybindings({ "tabs:next": () => handleTabChange(1), "tabs:previous": () => handleTabChange(-1) }, t7); let t8; if ($[5] !== headerFocused || $[6] !== hidden || $[7] !== optedIn) { t8 = e => { if (!headerFocused || !optedIn || hidden) { return; } if (e.key === "down") { e.preventDefault(); setHeaderFocused(false); } }; $[5] = headerFocused; $[6] = hidden; $[7] = optedIn; $[8] = t8; } else { t8 = $[8]; } const handleKeyDown = t8; const t9 = navFromContent && !headerFocused && optedIn && !hidden && !disableNavigation; let t10; if ($[9] !== t9) { t10 = { context: "Tabs", isActive: t9 }; $[9] = t9; $[10] = t10; } else { t10 = $[10]; } useKeybindings({ "tabs:next": () => { handleTabChange(1); setHeaderFocused(true); }, "tabs:previous": () => { handleTabChange(-1); setHeaderFocused(true); } }, t10); const titleWidth = title ? stringWidth(title) + 1 : 0; const tabsWidth = tabs.reduce(_temp4, 0); const usedWidth = titleWidth + tabsWidth; const spacerWidth = useFullWidth ? Math.max(0, terminalWidth - usedWidth) : 0; const contentWidth = useFullWidth ? terminalWidth : undefined; const T0 = Box; const t11 = "column"; const t12 = 0; const t13 = true; const t14 = modalScrollRef ? 0 : undefined; const t15 = !hidden && {title !== undefined && {title}}{tabs.map((t16, i) => { const [id, title_0] = t16; const isCurrent = selectedTabIndex === i; const hasColorCursor = color && isCurrent && headerFocused; return {" "}{title_0}{" "}; })}{spacerWidth > 0 && {" ".repeat(spacerWidth)}}; let t17; if ($[11] !== children || $[12] !== contentHeight || $[13] !== contentWidth || $[14] !== hidden || $[15] !== modalScrollRef || $[16] !== selectedTabIndex) { t17 = modalScrollRef ? {children} : {children}; $[11] = children; $[12] = contentHeight; $[13] = contentWidth; $[14] = hidden; $[15] = modalScrollRef; $[16] = selectedTabIndex; $[17] = t17; } else { t17 = $[17]; } let t18; if ($[18] !== T0 || $[19] !== banner || $[20] !== handleKeyDown || $[21] !== t14 || $[22] !== t15 || $[23] !== t17) { t18 = {t15}{banner}{t17}; $[18] = T0; $[19] = banner; $[20] = handleKeyDown; $[21] = t14; $[22] = t15; $[23] = t17; $[24] = t18; } else { t18 = $[24]; } return {t18}; } function _temp4(sum, t0) { const [, tabTitle] = t0; return sum + (tabTitle ? stringWidth(tabTitle) : 0) + 2 + 1; } function _temp3(n_0) { return n_0 - 1; } function _temp2(n) { return n + 1; } function _temp(child) { return [child.props.id ?? child.props.title, child.props.title]; } type TabProps = { title: string; id?: string; children: React.ReactNode; }; export function Tab(t0) { const $ = _c(4); const { title, id, children } = t0; const { selectedTab, width } = useContext(TabsContext); const insideModal = useIsInsideModal(); if (selectedTab !== (id ?? title)) { return null; } const t1 = insideModal ? 0 : undefined; let t2; if ($[0] !== children || $[1] !== t1 || $[2] !== width) { t2 = {children}; $[0] = children; $[1] = t1; $[2] = width; $[3] = t2; } else { t2 = $[3]; } return t2; } export function useTabsWidth() { const { width } = useContext(TabsContext); return width; } /** * Opt into header-focus gating. Returns the current header focus state and a * callback to hand focus back to the tab row. For a Select, pass * `isDisabled={headerFocused}` and `onUpFromFirstItem={focusHeader}`; keep the * parent Tabs' initialHeaderFocused at its default so tab/←/→ work on mount. * * Calling this hook registers a ↓-blurs-header opt-in on mount. Don't call it * above an early return that renders static text — ↓ will blur the header with * no onUpFromFirstItem to recover. Split the component so the hook only runs * when the Select renders. */ export function useTabHeaderFocus() { const $ = _c(6); const { headerFocused, focusHeader, blurHeader, registerOptIn } = useContext(TabsContext); let t0; if ($[0] !== registerOptIn) { t0 = [registerOptIn]; $[0] = registerOptIn; $[1] = t0; } else { t0 = $[1]; } useEffect(registerOptIn, t0); let t1; if ($[2] !== blurHeader || $[3] !== focusHeader || $[4] !== headerFocused) { t1 = { headerFocused, focusHeader, blurHeader }; $[2] = blurHeader; $[3] = focusHeader; $[4] = headerFocused; $[5] = t1; } else { t1 = $[5]; } return t1; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsImNyZWF0ZUNvbnRleHQiLCJ1c2VDYWxsYmFjayIsInVzZUNvbnRleHQiLCJ1c2VFZmZlY3QiLCJ1c2VTdGF0ZSIsInVzZUlzSW5zaWRlTW9kYWwiLCJ1c2VNb2RhbFNjcm9sbFJlZiIsInVzZVRlcm1pbmFsU2l6ZSIsIlNjcm9sbEJveCIsIktleWJvYXJkRXZlbnQiLCJzdHJpbmdXaWR0aCIsIkJveCIsIlRleHQiLCJ1c2VLZXliaW5kaW5ncyIsIlRoZW1lIiwiVGFic1Byb3BzIiwiY2hpbGRyZW4iLCJBcnJheSIsIlJlYWN0RWxlbWVudCIsIlRhYlByb3BzIiwidGl0bGUiLCJjb2xvciIsImRlZmF1bHRUYWIiLCJoaWRkZW4iLCJ1c2VGdWxsV2lkdGgiLCJzZWxlY3RlZFRhYiIsIm9uVGFiQ2hhbmdlIiwidGFiSWQiLCJiYW5uZXIiLCJSZWFjdE5vZGUiLCJkaXNhYmxlTmF2aWdhdGlvbiIsImluaXRpYWxIZWFkZXJGb2N1c2VkIiwiY29udGVudEhlaWdodCIsIm5hdkZyb21Db250ZW50IiwiVGFic0NvbnRleHRWYWx1ZSIsIndpZHRoIiwiaGVhZGVyRm9jdXNlZCIsImZvY3VzSGVhZGVyIiwiYmx1ckhlYWRlciIsInJlZ2lzdGVyT3B0SW4iLCJUYWJzQ29udGV4dCIsInVuZGVmaW5lZCIsIlRhYnMiLCJ0MCIsIiQiLCJfYyIsImNvbnRyb2xsZWRTZWxlY3RlZFRhYiIsInQxIiwidDIiLCJjb2x1bW5zIiwidGVybWluYWxXaWR0aCIsInRhYnMiLCJtYXAiLCJfdGVtcCIsImRlZmF1bHRUYWJJbmRleCIsImZpbmRJbmRleCIsInRhYiIsImlzQ29udHJvbGxlZCIsImludGVybmFsU2VsZWN0ZWRUYWIiLCJzZXRJbnRlcm5hbFNlbGVjdGVkVGFiIiwiY29udHJvbGxlZFRhYkluZGV4IiwidGFiXzAiLCJzZWxlY3RlZFRhYkluZGV4IiwibW9kYWxTY3JvbGxSZWYiLCJzZXRIZWFkZXJGb2N1c2VkIiwidDMiLCJTeW1ib2wiLCJmb3IiLCJ0NCIsIm9wdEluQ291bnQiLCJzZXRPcHRJbkNvdW50IiwidDUiLCJfdGVtcDIiLCJfdGVtcDMiLCJvcHRlZEluIiwiaGFuZGxlVGFiQ2hhbmdlIiwib2Zmc2V0IiwibmV3SW5kZXgiLCJsZW5ndGgiLCJuZXdUYWJJZCIsInQ2IiwidDciLCJjb250ZXh0IiwiaXNBY3RpdmUiLCJ0YWJzOm5leHQiLCJ0YWJzOnByZXZpb3VzIiwidDgiLCJlIiwia2V5IiwicHJldmVudERlZmF1bHQiLCJoYW5kbGVLZXlEb3duIiwidDkiLCJ0MTAiLCJ0aXRsZVdpZHRoIiwidGFic1dpZHRoIiwicmVkdWNlIiwiX3RlbXA0IiwidXNlZFdpZHRoIiwic3BhY2VyV2lkdGgiLCJNYXRoIiwibWF4IiwiY29udGVudFdpZHRoIiwiVDAiLCJ0MTEiLCJ0MTIiLCJ0MTMiLCJ0MTQiLCJ0MTUiLCJ0MTYiLCJpIiwiaWQiLCJ0aXRsZV8wIiwiaXNDdXJyZW50IiwiaGFzQ29sb3JDdXJzb3IiLCJyZXBlYXQiLCJ0MTciLCJ0MTgiLCJzdW0iLCJ0YWJUaXRsZSIsIm5fMCIsIm4iLCJjaGlsZCIsInByb3BzIiwiVGFiIiwiaW5zaWRlTW9kYWwiLCJ1c2VUYWJzV2lkdGgiLCJ1c2VUYWJIZWFkZXJGb2N1cyJdLCJzb3VyY2VzIjpbIlRhYnMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwge1xuICBjcmVhdGVDb250ZXh0LFxuICB1c2VDYWxsYmFjayxcbiAgdXNlQ29udGV4dCxcbiAgdXNlRWZmZWN0LFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnXG5pbXBvcnQge1xuICB1c2VJc0luc2lkZU1vZGFsLFxuICB1c2VNb2RhbFNjcm9sbFJlZixcbn0gZnJvbSAnLi4vLi4vY29udGV4dC9tb2RhbENvbnRleHQuanMnXG5pbXBvcnQgeyB1c2VUZXJtaW5hbFNpemUgfSBmcm9tICcuLi8uLi9ob29rcy91c2VUZXJtaW5hbFNpemUuanMnXG5pbXBvcnQgU2Nyb2xsQm94IGZyb20gJy4uLy4uL2luay9jb21wb25lbnRzL1Njcm9sbEJveC5qcydcbmltcG9ydCB0eXBlIHsgS2V5Ym9hcmRFdmVudCB9IGZyb20gJy4uLy4uL2luay9ldmVudHMva2V5Ym9hcmQtZXZlbnQuanMnXG5pbXBvcnQgeyBzdHJpbmdXaWR0aCB9IGZyb20gJy4uLy4uL2luay9zdHJpbmdXaWR0aC5qcydcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IHVzZUtleWJpbmRpbmdzIH0gZnJvbSAnLi4vLi4va2V5YmluZGluZ3MvdXNlS2V5YmluZGluZy5qcydcbmltcG9ydCB0eXBlIHsgVGhlbWUgfSBmcm9tICcuLi8uLi91dGlscy90aGVtZS5qcydcblxudHlwZSBUYWJzUHJvcHMgPSB7XG4gIGNoaWxkcmVuOiBBcnJheTxSZWFjdC5SZWFjdEVsZW1lbnQ8VGFiUHJvcHM+PlxuICB0aXRsZT86IHN0cmluZ1xuICBjb2xvcj86IGtleW9mIFRoZW1lXG4gIGRlZmF1bHRUYWI/OiBzdHJpbmdcbiAgaGlkZGVuPzogYm9vbGVhblxuICB1c2VGdWxsV2lkdGg/OiBib29sZWFuXG4gIC8qKiBDb250cm9sbGVkIG1vZGU6IGN1cnJlbnQgc2VsZWN0ZWQgdGFiIGlkL3RpdGxlICovXG4gIHNlbGVjdGVkVGFiPzogc3RyaW5nXG4gIC8qKiBDb250cm9sbGVkIG1vZGU6IGNhbGxiYWNrIHdoZW4gdGFiIGNoYW5nZXMgKi9cbiAgb25UYWJDaGFuZ2U/OiAodGFiSWQ6IHN0cmluZykgPT4gdm9pZFxuICAvKiogT3B0aW9uYWwgYmFubmVyIHRvIGRpc3BsYXkgYmVsb3cgdGFicyBoZWFkZXIgKi9cbiAgYmFubmVyPzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKiBEaXNhYmxlIGtleWJvYXJkIG5hdmlnYXRpb24gKGUuZy4gd2hlbiBhIGNoaWxkIGNvbXBvbmVudCBoYW5kbGVzIGFycm93IGtleXMpICovXG4gIGRpc2FibGVOYXZpZ2F0aW9uPzogYm9vbGVhblxuICAvKipcbiAgICogSW5pdGlhbCBmb2N1cyBzdGF0ZSBmb3IgdGhlIHRhYiBoZWFkZXIgcm93LiBEZWZhdWx0cyB0byB0cnVlIChoZWFkZXJcbiAgICogZm9jdXNlZCwgbmF2IGFsd2F5cyB3b3JrcykuIEtlZXAgdGhlIGRlZmF1bHQgZm9yIFNlbGVjdC9saXN0IGNvbnRlbnQg4oCUXG4gICAqIHRob3NlIG9ubHkgdXNlIHVwL2Rvd24gc28gdGhlcmUncyBubyBjb25mbGljdDsgcGFzc1xuICAgKiBpc0Rpc2FibGVkPXtoZWFkZXJGb2N1c2VkfSB0byB0aGUgU2VsZWN0IGluc3RlYWQuIE9ubHkgc2V0IGZhbHNlIHdoZW5cbiAgICogY29udGVudCBhY3R1YWxseSBiaW5kcyBsZWZ0L3JpZ2h0L3RhYiAoZS5nLiBlbnVtIGN5Y2xpbmcpLCBhbmQgc2hvdyBhXG4gICAqIFwi4oaRIHRhYnNcIiBmb290ZXIgaGludCDigJQgd2l0aG91dCBpdCB0YWJzIGxvb2sgYnJva2VuLlxuICAgKi9cbiAgaW5pdGlhbEhlYWRlckZvY3VzZWQ/OiBib29sZWFuXG4gIC8qKlxuICAgKiBGaXhlZCBoZWlnaHQgZm9yIHRoZSBjb250ZW50IGFyZWEuIFdoZW4gc2V0LCBhbGwgdGFicyByZW5kZXIgd2l0aGluIHRoZVxuICAgKiBzYW1lIGhlaWdodCAob3ZlcmZsb3cgaGlkZGVuKSBzbyBzd2l0Y2hpbmcgdGFicyBkb2Vzbid0IGNhdXNlIGxheW91dFxuICAgKiBzaGlmdHMuIFNob3J0ZXIgdGFicyBnZXQgd2hpdGVzcGFjZTsgdGFsbGVyIHRhYnMgYXJlIGNsaXBwZWQuXG4gICAqL1xuICBjb250ZW50SGVpZ2h0PzogbnVtYmVyXG4gIC8qKlxuICAgKiBMZXQgVGFiL+KGkC/ihpIgc3dpdGNoIHRhYnMgZnJvbSBmb2N1c2VkIGNvbnRlbnQuIE9wdC1pbiBzaW5jZSBzb21lXG4gICAqIGNvbnRlbnQgdXNlcyB0aG9zZSBrZXlzOyBwYXNzIGEgcmVhY3RpdmUgYm9vbGVhbiB0byBjZWRlIHRoZW0gd2hlblxuICAgKiBuZWVkZWQuIFN3aXRjaGluZyBmcm9tIGNvbnRlbnQgZm9jdXNlcyB0aGUgaGVhZGVyLlxuICAgKi9cbiAgbmF2RnJvbUNvbnRlbnQ/OiBib29sZWFuXG59XG5cbnR5cGUgVGFic0NvbnRleHRWYWx1ZSA9IHtcbiAgc2VsZWN0ZWRUYWI6IHN0cmluZyB8IHVuZGVmaW5lZFxuICB3aWR0aDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gIGhlYWRlckZvY3VzZWQ6IGJvb2xlYW5cbiAgZm9jdXNIZWFkZXI6ICgpID0+IHZvaWRcbiAgYmx1ckhlYWRlcjogKCkgPT4gdm9pZFxuICByZWdpc3Rlck9wdEluOiAoKSA9PiAoKSA9PiB2b2lkXG59XG5cbmNvbnN0IFRhYnNDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxUYWJzQ29udGV4dFZhbHVlPih7XG4gIHNlbGVjdGVkVGFiOiB1bmRlZmluZWQsXG4gIHdpZHRoOiB1bmRlZmluZWQsXG4gIC8vIERlZmF1bHQgZm9yIGNvbXBvbmVudHMgcmVuZGVyZWQgb3V0c2lkZSBhIFRhYnMgKHRlc3RzLCBzdGFuZGFsb25lKTpcbiAgLy8gY29udGVudCBoYXMgZm9jdXMsIGZvY3VzSGVhZGVyIGlzIGEgbm8tb3AuXG4gIGhlYWRlckZvY3VzZWQ6IGZhbHNlLFxuICBmb2N1c0hlYWRlcjogKCkgPT4ge30sXG4gIGJsdXJIZWFkZXI6ICgpID0+IHt9LFxuICByZWdpc3Rlck9wdEluOiAoKSA9PiAoKSA9PiB7fSxcbn0pXG5cbmV4cG9ydCBmdW5jdGlvbiBUYWJzKHtcbiAgdGl0bGUsXG4gIGNvbG9yLFxuICBkZWZhdWx0VGFiLFxuICBjaGlsZHJlbixcbiAgaGlkZGVuLFxuICB1c2VGdWxsV2lkdGgsXG4gIHNlbGVjdGVkVGFiOiBjb250cm9sbGVkU2VsZWN0ZWRUYWIsXG4gIG9uVGFiQ2hhbmdlLFxuICBiYW5uZXIsXG4gIGRpc2FibGVOYXZpZ2F0aW9uLFxuICBpbml0aWFsSGVhZGVyRm9jdXNlZCA9IHRydWUsXG4gIGNvbnRlbnRIZWlnaHQsXG4gIG5hdkZyb21Db250ZW50ID0gZmFsc2UsXG59OiBUYWJzUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCB7IGNvbHVtbnM6IHRlcm1pbmFsV2lkdGggfSA9IHVzZVRlcm1pbmFsU2l6ZSgpXG4gIGNvbnN0IHRhYnMgPSBjaGlsZHJlbi5tYXAoY2hpbGQgPT4gW1xuICAgIGNoaWxkLnByb3BzLmlkID8/IGNoaWxkLnByb3BzLnRpdGxlLFxuICAgIGNoaWxkLnByb3BzLnRpdGxlLFxuICBdKVxuICBjb25zdCBkZWZhdWx0VGFiSW5kZXggPSBkZWZhdWx0VGFiXG4gICAgPyB0YWJzLmZpbmRJbmRleCh0YWIgPT4gZGVmYXVsdFRhYiA9PT0gdGFiWzBdKVxuICAgIDogMFxuXG4gIC8vIFN1cHBvcnQgYm90aCBjb250cm9sbGVkIGFuZCB1bmNvbnRyb2xsZWQgbW9kZXNcbiAgY29uc3QgaXNDb250cm9sbGVkID0gY29udHJvbGxlZFNlbGVjdGVkVGFiICE9PSB1bmRlZmluZWRcbiAgY29uc3QgW2ludGVybmFsU2VsZWN0ZWRUYWIsIHNldEludGVybmFsU2VsZWN0ZWRUYWJdID0gdXNlU3RhdGUoXG4gICAgZGVmYXVsdFRhYkluZGV4ICE9PSAtMSA/IGRlZmF1bHRUYWJJbmRleCA6IDAsXG4gIClcblxuICAvLyBJbiBjb250cm9sbGVkIG1vZGUsIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBjb250cm9sbGVkIHRhYlxuICBjb25zdCBjb250cm9sbGVkVGFiSW5kZXggPSBpc0NvbnRyb2xsZWRcbiAgICA/IHRhYnMuZmluZEluZGV4KHRhYiA9PiB0YWJbMF0gPT09IGNvbnRyb2xsZWRTZWxlY3RlZFRhYilcbiAgICA6IC0xXG4gIGNvbnN0IHNlbGVjdGVkVGFiSW5kZXggPSBpc0NvbnRyb2xsZWRcbiAgICA/IGNvbnRyb2xsZWRUYWJJbmRleCAhPT0gLTFcbiAgICAgID8gY29udHJvbGxlZFRhYkluZGV4XG4gICAgICA6IDBcbiAgICA6IGludGVybmFsU2VsZWN0ZWRUYWJcblxuICBjb25zdCBtb2RhbFNjcm9sbFJlZiA9IHVzZU1vZGFsU2Nyb2xsUmVmKClcblxuICAvLyBIZWFkZXIgZm9jdXM6IGxlZnQvcmlnaHQvdGFiIG9ubHkgc3dpdGNoIHRhYnMgd2hlbiB0aGUgaGVhZGVyIHJvdyBpc1xuICAvLyBmb2N1c2VkLiBDaGlsZHJlbiB3aXRoIGludGVyYWN0aXZlIGNvbnRlbnQgY2FsbCBmb2N1c0hlYWRlcigpICh2aWFcbiAgLy8gdXNlVGFiSGVhZGVyRm9jdXMpIG9uIHVwLWFycm93IHRvIGhhbmQgZm9jdXMgYmFjayBoZXJlOyBkb3duLWFycm93XG4gIC8vIHJldHVybnMgaXQuIFRhYnMgdGhhdCBuZXZlciBjYWxsIHRoZSBob29rIHNlZSBubyBiZWhhdmlvciBjaGFuZ2Ug4oCUXG4gIC8vIGluaXRpYWxIZWFkZXJGb2N1c2VkIGRlZmF1bHRzIHRvIHRydWUgc28gbmF2IGFsd2F5cyB3b3Jrcy5cbiAgY29uc3QgW2hlYWRlckZvY3VzZWQsIHNldEhlYWRlckZvY3VzZWRdID0gdXNlU3RhdGUoaW5pdGlhbEhlYWRlckZvY3VzZWQpXG4gIGNvbnN0IGZvY3VzSGVhZGVyID0gdXNlQ2FsbGJhY2soKCkgPT4gc2V0SGVhZGVyRm9jdXNlZCh0cnVlKSwgW10pXG4gIGNvbnN0IGJsdXJIZWFkZXIgPSB1c2VDYWxsYmFjaygoKSA9PiBzZXRIZWFkZXJGb2N1c2VkKGZhbHNlKSwgW10pXG4gIC8vIENvdW50IG9mIG1vdW50ZWQgY2hpbGRyZW4gdXNpbmcgdXNlVGFiSGVhZGVyRm9jdXMoKS4gRG93bi1hcnJvdyBibHVyIGFuZFxuICAvLyB0aGUg4oaTIGhpbnQgb25seSBlbmdhZ2Ugd2hlbiBhdCBsZWFzdCBvbmUgY2hpbGQgaGFzIG9wdGVkIGluIOKAlCBvdGhlcndpc2VcbiAgLy8gcHJlc3NpbmcgZG93biBvbiBhIGxlZ2FjeSB0YWIgd291bGQgc3RyYW5kIHRoZSB1c2VyIHdpdGggbmF2IGRpc2FibGVkLlxuICBjb25zdCBbb3B0SW5Db3VudCwgc2V0T3B0SW5Db3VudF0gPSB1c2VTdGF0ZSgwKVxuICBjb25zdCByZWdpc3Rlck9wdEluID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldE9wdEluQ291bnQobiA9PiBuICsgMSlcbiAgICByZXR1cm4gKCkgPT4gc2V0T3B0SW5Db3VudChuID0+IG4gLSAxKVxuICB9LCBbXSlcbiAgY29uc3Qgb3B0ZWRJbiA9IG9wdEluQ291bnQgPiAwXG5cbiAgY29uc3QgaGFuZGxlVGFiQ2hhbmdlID0gKG9mZnNldDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgbmV3SW5kZXggPSAoc2VsZWN0ZWRUYWJJbmRleCArIHRhYnMubGVuZ3RoICsgb2Zmc2V0KSAlIHRhYnMubGVuZ3RoXG4gICAgY29uc3QgbmV3VGFiSWQgPSB0YWJzW25ld0luZGV4XT8uWzBdXG5cbiAgICBpZiAoaXNDb250cm9sbGVkICYmIG9uVGFiQ2hhbmdlICYmIG5ld1RhYklkKSB7XG4gICAgICBvblRhYkNoYW5nZShuZXdUYWJJZClcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0SW50ZXJuYWxTZWxlY3RlZFRhYihuZXdJbmRleClcbiAgICB9XG4gICAgLy8gVGFiIHN3aXRjaGluZyBpcyBhIGhlYWRlciBhY3Rpb24g4oCUIHN0YXkgZm9jdXNlZCBzbyB0aGUgdXNlciBjYW4ga2VlcFxuICAgIC8vIGN5Y2xpbmcuIFRoZSBuZXdseSBtb3VudGVkIHRhYiBjYW4gYmx1ciB2aWEgaXRzIG93biBpbnRlcmFjdGlvbi5cbiAgICBzZXRIZWFkZXJGb2N1c2VkKHRydWUpXG4gIH1cblxuICB1c2VLZXliaW5kaW5ncyhcbiAgICB7XG4gICAgICAndGFiczpuZXh0JzogKCkgPT4gaGFuZGxlVGFiQ2hhbmdlKDEpLFxuICAgICAgJ3RhYnM6cHJldmlvdXMnOiAoKSA9PiBoYW5kbGVUYWJDaGFuZ2UoLTEpLFxuICAgIH0sXG4gICAge1xuICAgICAgY29udGV4dDogJ1RhYnMnLFxuICAgICAgaXNBY3RpdmU6ICFoaWRkZW4gJiYgIWRpc2FibGVOYXZpZ2F0aW9uICYmIGhlYWRlckZvY3VzZWQsXG4gICAgfSxcbiAgKVxuXG4gIC8vIFdoZW4gdGhlIGhlYWRlciBpcyBmb2N1c2VkLCBkb3duLWFycm93IHJldHVybnMgZm9jdXMgdG8gY29udGVudC4gT25seVxuICAvLyBhY3RpdmUgd2hlbiB0aGUgc2VsZWN0ZWQgdGFiIGhhcyBvcHRlZCBpbiB2aWEgdXNlVGFiSGVhZGVyRm9jdXMoKSDigJRcbiAgLy8gbGVnYWN5IHRhYnMgaGF2ZSBub3doZXJlIHRvIHJldHVybiBmb2N1cyB0by5cbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgaWYgKCFoZWFkZXJGb2N1c2VkIHx8ICFvcHRlZEluIHx8IGhpZGRlbikgcmV0dXJuXG4gICAgaWYgKGUua2V5ID09PSAnZG93bicpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgc2V0SGVhZGVyRm9jdXNlZChmYWxzZSlcbiAgICB9XG4gIH1cblxuICAvLyBPcHQtaW46IHNhbWUgdGFiczpuZXh0L3ByZXZpb3VzIGFjdGlvbnMsIGFjdGl2ZSBmcm9tIGNvbnRlbnQuIEZvY3VzZXNcbiAgLy8gdGhlIGhlYWRlciBzbyBzdWJzZXF1ZW50IHByZXNzZXMgY3ljbGUgdmlhIHRoZSBoYW5kbGVyIGFib3ZlLlxuICB1c2VLZXliaW5kaW5ncyhcbiAgICB7XG4gICAgICAndGFiczpuZXh0JzogKCkgPT4ge1xuICAgICAgICBoYW5kbGVUYWJDaGFuZ2UoMSlcbiAgICAgICAgc2V0SGVhZGVyRm9jdXNlZCh0cnVlKVxuICAgICAgfSxcbiAgICAgICd0YWJzOnByZXZpb3VzJzogKCkgPT4ge1xuICAgICAgICBoYW5kbGVUYWJDaGFuZ2UoLTEpXG4gICAgICAgIHNldEhlYWRlckZvY3VzZWQodHJ1ZSlcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBjb250ZXh0OiAnVGFicycsXG4gICAgICBpc0FjdGl2ZTpcbiAgICAgICAgbmF2RnJvbUNvbnRlbnQgJiZcbiAgICAgICAgIWhlYWRlckZvY3VzZWQgJiZcbiAgICAgICAgb3B0ZWRJbiAmJlxuICAgICAgICAhaGlkZGVuICYmXG4gICAgICAgICFkaXNhYmxlTmF2aWdhdGlvbixcbiAgICB9LFxuICApXG5cbiAgLy8gQ2FsY3VsYXRlIHNwYWNpbmcgdG8gZmlsbCB0aGUgYXZhaWxhYmxlIHdpZHRoLiBObyBrZXlib2FyZCBoaW50IGluIHRoZVxuICAvLyBoZWFkZXIgcm93IOKAlCBjb250ZW50IGZvb3RlcnMgb3duIGhpbnRzIChzZWUgdXNlVGFiSGVhZGVyRm9jdXMgZG9jcykuXG4gIGNvbnN0IHRpdGxlV2lkdGggPSB0aXRsZSA/IHN0cmluZ1dpZHRoKHRpdGxlKSArIDEgOiAwIC8vICsxIGZvciBnYXBcbiAgY29uc3QgdGFic1dpZHRoID0gdGFicy5yZWR1Y2UoXG4gICAgKHN1bSwgWywgdGFiVGl0bGVdKSA9PiBzdW0gKyAodGFiVGl0bGUgPyBzdHJpbmdXaWR0aCh0YWJUaXRsZSkgOiAwKSArIDIgKyAxLCAvLyArMiBmb3IgcGFkZGluZywgKzEgZm9yIGdhcFxuICAgIDAsXG4gIClcbiAgY29uc3QgdXNlZFdpZHRoID0gdGl0bGVXaWR0aCArIHRhYnNXaWR0aFxuICBjb25zdCBzcGFjZXJXaWR0aCA9IHVzZUZ1bGxXaWR0aCA/IE1hdGgubWF4KDAsIHRlcm1pbmFsV2lkdGggLSB1c2VkV2lkdGgpIDogMFxuXG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IHVzZUZ1bGxXaWR0aCA/IHRlcm1pbmFsV2lkdGggOiB1bmRlZmluZWRcblxuICByZXR1cm4gKFxuICAgIDxUYWJzQ29udGV4dC5Qcm92aWRlclxuICAgICAgdmFsdWU9e3tcbiAgICAgICAgc2VsZWN0ZWRUYWI6IHRhYnNbc2VsZWN0ZWRUYWJJbmRleF0hWzBdLFxuICAgICAgICB3aWR0aDogY29udGVudFdpZHRoLFxuICAgICAgICBoZWFkZXJGb2N1c2VkLFxuICAgICAgICBmb2N1c0hlYWRlcixcbiAgICAgICAgYmx1ckhlYWRlcixcbiAgICAgICAgcmVnaXN0ZXJPcHRJbixcbiAgICAgIH19XG4gICAgPlxuICAgICAgPEJveFxuICAgICAgICBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCJcbiAgICAgICAgdGFiSW5kZXg9ezB9XG4gICAgICAgIGF1dG9Gb2N1c1xuICAgICAgICBvbktleURvd249e2hhbmRsZUtleURvd259XG4gICAgICAgIC8vIGZsZXhTaHJpbms9MCBpbnNpZGUgbW9kYWwgc2xvdCDigJQgdGhlIG1vZGFsJ3MgYWJzb2x1dGUgQm94IGhhcyBub1xuICAgICAgICAvLyBleHBsaWNpdCBoZWlnaHQgKGdyb3dzIHRvIGZpdCwgbWF4SGVpZ2h0IGNhcCksIHNvIGZsZXhHcm93PTEgaGVyZVxuICAgICAgICAvLyByZXNvbHZlcyB0byAwIG9uIHJlLXJlbmRlciBhbmQgdGhlIGJvZHkgYmxhbmtzIG9uIERvd24gYXJyb3cuXG4gICAgICAgIC8vIFNlZSAjMjM1OTIuIE91dHNpZGUgbW9kYWwsIGxlYXZlIGxheW91dCBhbG9uZS5cbiAgICAgICAgZmxleFNocmluaz17bW9kYWxTY3JvbGxSZWYgPyAwIDogdW5kZWZpbmVkfVxuICAgICAgPlxuICAgICAgICB7IWhpZGRlbiAmJiAoXG4gICAgICAgICAgPEJveFxuICAgICAgICAgICAgZmxleERpcmVjdGlvbj1cInJvd1wiXG4gICAgICAgICAgICBnYXA9ezF9XG4gICAgICAgICAgICBmbGV4U2hyaW5rPXttb2RhbFNjcm9sbFJlZiA/IDAgOiB1bmRlZmluZWR9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge3RpdGxlICE9PSB1bmRlZmluZWQgJiYgKFxuICAgICAgICAgICAgICA8VGV4dCBib2xkIGNvbG9yPXtjb2xvcn0+XG4gICAgICAgICAgICAgICAge3RpdGxlfVxuICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge3RhYnMubWFwKChbaWQsIHRpdGxlXSwgaSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpc0N1cnJlbnQgPSBzZWxlY3RlZFRhYkluZGV4ID09PSBpXG4gICAgICAgICAgICAgIGNvbnN0IGhhc0NvbG9yQ3Vyc29yID0gY29sb3IgJiYgaXNDdXJyZW50ICYmIGhlYWRlckZvY3VzZWRcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8VGV4dFxuICAgICAgICAgICAgICAgICAga2V5PXtpZH1cbiAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcj17aGFzQ29sb3JDdXJzb3IgPyBjb2xvciA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgIGNvbG9yPXtoYXNDb2xvckN1cnNvciA/ICdpbnZlcnNlVGV4dCcgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICBpbnZlcnNlPXtpc0N1cnJlbnQgJiYgIWhhc0NvbG9yQ3Vyc29yfVxuICAgICAgICAgICAgICAgICAgYm9sZD17aXNDdXJyZW50fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHsnICd9XG4gICAgICAgICAgICAgICAgICB7dGl0bGV9eycgJ31cbiAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAge3NwYWNlcldpZHRoID4gMCAmJiA8VGV4dD57JyAnLnJlcGVhdChzcGFjZXJXaWR0aCl9PC9UZXh0Pn1cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgKX1cbiAgICAgICAge2Jhbm5lcn1cbiAgICAgICAge21vZGFsU2Nyb2xsUmVmID8gKFxuICAgICAgICAgIC8vIEluc2lkZSB0aGUgbW9kYWwgc2xvdDogb3duIHRoZSBTY3JvbGxCb3ggaGVyZSBzbyB0aGUgdGFic1xuICAgICAgICAgIC8vIGhlYWRlciByb3cgYWJvdmUgc2l0cyBPVVRTSURFIHRoZSBzY3JvbGwgYXJlYSDigJQgaXQgY2FuIG5ldmVyXG4gICAgICAgICAgLy8gc2Nyb2xsIG9mZi4gVGhlIHJlZiByZWFjaGVzIFJFUEwncyBTY3JvbGxLZXliaW5kaW5nSGFuZGxlciB2aWFcbiAgICAgICAgICAvLyBNb2RhbENvbnRleHQuIEtleWVkIGJ5IHNlbGVjdGVkVGFiSW5kZXgg4oaSIHJlbW91bnRzIG9uIHRhYlxuICAgICAgICAgIC8vIHN3aXRjaCwgcmVzZXR0aW5nIHNjcm9sbFRvcCB0byAwIHdpdGhvdXQgc2Nyb2xsVG8oKSB0aW1pbmcgZ2FtZXMuXG4gICAgICAgICAgPEJveCB3aWR0aD17Y29udGVudFdpZHRofSBtYXJnaW5Ub3A9e2hpZGRlbiA/IDAgOiAxfSBmbGV4U2hyaW5rPXswfT5cbiAgICAgICAgICAgIDxTY3JvbGxCb3hcbiAgICAgICAgICAgICAga2V5PXtzZWxlY3RlZFRhYkluZGV4fVxuICAgICAgICAgICAgICByZWY9e21vZGFsU2Nyb2xsUmVmfVxuICAgICAgICAgICAgICBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgZmxleFNocmluaz17MH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgICAgPC9TY3JvbGxCb3g+XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPEJveFxuICAgICAgICAgICAgd2lkdGg9e2NvbnRlbnRXaWR0aH1cbiAgICAgICAgICAgIG1hcmdpblRvcD17aGlkZGVuID8gMCA6IDF9XG4gICAgICAgICAgICBoZWlnaHQ9e2NvbnRlbnRIZWlnaHR9XG4gICAgICAgICAgICBvdmVyZmxvd1k9e2NvbnRlbnRIZWlnaHQgIT09IHVuZGVmaW5lZCA/ICdoaWRkZW4nIDogdW5kZWZpbmVkfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgKX1cbiAgICAgIDwvQm94PlxuICAgIDwvVGFic0NvbnRleHQuUHJvdmlkZXI+XG4gIClcbn1cblxudHlwZSBUYWJQcm9wcyA9IHtcbiAgdGl0bGU6IHN0cmluZ1xuICBpZD86IHN0cmluZ1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBUYWIoeyB0aXRsZSwgaWQsIGNoaWxkcmVuIH06IFRhYlByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgeyBzZWxlY3RlZFRhYiwgd2lkdGggfSA9IHVzZUNvbnRleHQoVGFic0NvbnRleHQpXG4gIGNvbnN0IGluc2lkZU1vZGFsID0gdXNlSXNJbnNpZGVNb2RhbCgpXG4gIGlmIChzZWxlY3RlZFRhYiAhPT0gKGlkID8/IHRpdGxlKSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxCb3ggd2lkdGg9e3dpZHRofSBmbGV4U2hyaW5rPXtpbnNpZGVNb2RhbCA/IDAgOiB1bmRlZmluZWR9PlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvQm94PlxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUYWJzV2lkdGgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyB3aWR0aCB9ID0gdXNlQ29udGV4dChUYWJzQ29udGV4dClcbiAgcmV0dXJuIHdpZHRoXG59XG5cbi8qKlxuICogT3B0IGludG8gaGVhZGVyLWZvY3VzIGdhdGluZy4gUmV0dXJucyB0aGUgY3VycmVudCBoZWFkZXIgZm9jdXMgc3RhdGUgYW5kIGFcbiAqIGNhbGxiYWNrIHRvIGhhbmQgZm9jdXMgYmFjayB0byB0aGUgdGFiIHJvdy4gRm9yIGEgU2VsZWN0LCBwYXNzXG4gKiBgaXNEaXNhYmxlZD17aGVhZGVyRm9jdXNlZH1gIGFuZCBgb25VcEZyb21GaXJzdEl0ZW09e2ZvY3VzSGVhZGVyfWA7IGtlZXAgdGhlXG4gKiBwYXJlbnQgVGFicycgaW5pdGlhbEhlYWRlckZvY3VzZWQgYXQgaXRzIGRlZmF1bHQgc28gdGFiL+KGkC/ihpIgd29yayBvbiBtb3VudC5cbiAqXG4gKiBDYWxsaW5nIHRoaXMgaG9vayByZWdpc3RlcnMgYSDihpMtYmx1cnMtaGVhZGVyIG9wdC1pbiBvbiBtb3VudC4gRG9uJ3QgY2FsbCBpdFxuICogYWJvdmUgYW4gZWFybHkgcmV0dXJuIHRoYXQgcmVuZGVycyBzdGF0aWMgdGV4dCDigJQg4oaTIHdpbGwgYmx1ciB0aGUgaGVhZGVyIHdpdGhcbiAqIG5vIG9uVXBGcm9tRmlyc3RJdGVtIHRvIHJlY292ZXIuIFNwbGl0IHRoZSBjb21wb25lbnQgc28gdGhlIGhvb2sgb25seSBydW5zXG4gKiB3aGVuIHRoZSBTZWxlY3QgcmVuZGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVRhYkhlYWRlckZvY3VzKCk6IHtcbiAgaGVhZGVyRm9jdXNlZDogYm9vbGVhblxuICBmb2N1c0hlYWRlcjogKCkgPT4gdm9pZFxuICBibHVySGVhZGVyOiAoKSA9PiB2b2lkXG59IHtcbiAgY29uc3QgeyBoZWFkZXJGb2N1c2VkLCBmb2N1c0hlYWRlciwgYmx1ckhlYWRlciwgcmVnaXN0ZXJPcHRJbiB9ID1cbiAgICB1c2VDb250ZXh0KFRhYnNDb250ZXh0KVxuICB1c2VFZmZlY3QocmVnaXN0ZXJPcHRJbiwgW3JlZ2lzdGVyT3B0SW5dKVxuICByZXR1cm4geyBoZWFkZXJGb2N1c2VkLCBmb2N1c0hlYWRlciwgYmx1ckhlYWRlciB9XG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPQSxLQUFLLElBQ1ZDLGFBQWEsRUFDYkMsV0FBVyxFQUNYQyxVQUFVLEVBQ1ZDLFNBQVMsRUFDVEMsUUFBUSxRQUNILE9BQU87QUFDZCxTQUNFQyxnQkFBZ0IsRUFDaEJDLGlCQUFpQixRQUNaLCtCQUErQjtBQUN0QyxTQUFTQyxlQUFlLFFBQVEsZ0NBQWdDO0FBQ2hFLE9BQU9DLFNBQVMsTUFBTSxtQ0FBbUM7QUFDekQsY0FBY0MsYUFBYSxRQUFRLG9DQUFvQztBQUN2RSxTQUFTQyxXQUFXLFFBQVEsMEJBQTBCO0FBQ3RELFNBQVNDLEdBQUcsRUFBRUMsSUFBSSxRQUFRLGNBQWM7QUFDeEMsU0FBU0MsY0FBYyxRQUFRLG9DQUFvQztBQUNuRSxjQUFjQyxLQUFLLFFBQVEsc0JBQXNCO0FBRWpELEtBQUtDLFNBQVMsR0FBRztFQUNmQyxRQUFRLEVBQUVDLEtBQUssQ0FBQ2xCLEtBQUssQ0FBQ21CLFlBQVksQ0FBQ0MsUUFBUSxDQUFDLENBQUM7RUFDN0NDLEtBQUssQ0FBQyxFQUFFLE1BQU07RUFDZEMs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