{"version":3,"file":"website.4b144c52.js","sources":["app/assets/vite/modules/website/elements/CourseLikeButton.ts","app/assets/vite/factories/menu.ts","app/assets/vite/modules/website/elements/Badge.ts","app/assets/vite/modules/website/elements/Container.ts","app/assets/vite/modules/website/elements/CourseLayout.ts","app/assets/vite/modules/website/elements/Dropdown.ts","app/assets/vite/modules/website/elements/GdprBanner.ts","app/assets/vite/modules/website/elements/Header.ts","app/assets/vite/modules/website/elements/Footer.ts","app/assets/vite/modules/website/elements/FormLayout.ts","app/assets/vite/modules/website/elements/HeaderMenu.ts","node_modules/@github/time-elements/dist/index.js","app/assets/vite/stores/Notification.ts","app/assets/vite/modules/website/elements/HeaderNotifications.ts","app/assets/vite/modules/website/elements/ShareBox.ts","app/assets/vite/modules/website/elements/ShareButton.ts","app/assets/vite/modules/website/elements/SocialButton.ts","app/assets/vite/modules/website/elements/User.ts","app/assets/vite/modules/website/elements/AppBadges.ts","app/assets/vite/modules/website/views/EmptyVideoList.ts"],"sourcesContent":["import { define, html, store } from \"hybrids\";\nimport Course from \"~/stores/Course\";\n\ninterface VWebsiteCourseLikeButton {\n defaultValue: number;\n href: string;\n courseId: string;\n course: Course;\n count: number;\n liked: boolean;\n}\n\nfunction toggleLike(host: VWebsiteCourseLikeButton) {\n store\n .set(host.course, {\n likeCount: host.liked ? host.count - 1 : host.count + 1,\n })\n .then(() => {\n host.liked = !host.liked;\n });\n}\n\nexport default define({\n tag: \"v-website-course-like-button\",\n defaultValue: 0,\n href: \"\",\n courseId: \"\",\n course: store(Course, { id: \"courseId\" }),\n count: ({ defaultValue, course }) =>\n store.ready(course) ? course.likeCount : defaultValue,\n liked: false,\n render: ({ href, count, liked }) => html`\n \n Like\n \n `.css`\n :host { display: block; }\n `,\n});\n","import { Descriptor } from \"hybrids\";\n\nlet activeTarget: HTMLElement | null;\nlet scrollRestoration: ScrollRestoration;\n\nconst clearMap = new WeakMap();\n\nfunction push(host: HTMLElement) {\n if (!activeTarget) {\n scrollRestoration = window.history.scrollRestoration;\n window.history.scrollRestoration = \"manual\";\n window.history.pushState(window.history.state, \"\");\n }\n\n activeTarget = host;\n}\n\nfunction clearHistory() {\n window.history.back();\n window.history.scrollRestoration = scrollRestoration;\n activeTarget = null;\n}\n\nfunction pull(host: HTMLElement) {\n if (activeTarget === host) {\n setTimeout(() => {\n if (activeTarget === host) {\n clearHistory();\n }\n }, 0);\n }\n}\n\nwindow.addEventListener(\"popstate\", () => {\n if (activeTarget) {\n const clear = clearMap.get(activeTarget);\n clear();\n activeTarget = null;\n }\n});\n\ndocument.addEventListener(\n \"mouseup\",\n (event: Event) => {\n if (activeTarget) {\n const path = event.composedPath();\n const clear = clearMap.get(activeTarget);\n\n if (!path.includes(activeTarget)) {\n clear();\n } else if (path.some((el) => el instanceof HTMLAnchorElement)) {\n clear();\n clearHistory();\n }\n }\n },\n {\n passive: true,\n }\n);\n\ndocument.addEventListener(\n \"touchmove\",\n (event: Event) => {\n if (activeTarget) {\n const path = event.composedPath();\n const clear = clearMap.get(activeTarget);\n\n if (!path.includes(activeTarget)) {\n clear();\n }\n }\n },\n {\n passive: true,\n }\n);\n\nexport default function menu(\n observe?: Descriptor[\"observe\"]\n): Descriptor {\n return {\n value: false,\n connect: (host, key) => {\n clearMap.set(host, () => {\n host[key] = false;\n });\n\n return () => {\n pull(host);\n };\n },\n observe: (host, value, lastValue) => {\n if (value) {\n push(host);\n } else if (lastValue) {\n pull(host);\n }\n\n if (observe) {\n observe(host, value, lastValue);\n }\n },\n };\n}\n","import { define, html } from \"hybrids\";\n\ninterface VWebsiteBadge {\n color: string;\n}\n\nexport default define({\n tag: \"v-website-badge\",\n color: \"secondary\",\n render: ({ color }) => html`\n \n \n \n `.css`\n :host {\n display: inline-block;\n background: var(--v-ui-color-${color});\n padding: 3px 8px;\n border-radius: 6px;\n --v-ui-color-primary: #d62252;\n }\n\n v-ui-text {\n color: white;\n }\n `,\n});\n","import { define, html } from \"hybrids\";\n\ninterface VWebsiteContainer {}\n\nexport default define({\n tag: \"v-website-container\",\n render: () => html`\n
\n \n
\n `.css`\n :host { \n display: block;\n background: white;\n }\n\n :host(:empty) {\n display: none;\n }\n\n #container {\n max-width: 1120px;\n margin: 0 auto;\n padding: 0 var(--v-ui-layout-spacing);\n }\n `,\n});\n","import { define, html } from \"hybrids\";\nimport mediaQuery from \"~/factories/mediaQuery\";\n\ninterface VWebsiteCourseLayout {\n isDesktop: boolean;\n}\n\nexport default define({\n tag: \"v-website-course-layout\",\n isDesktop: mediaQuery(\"(min-width: 768px)\"),\n render: ({ isDesktop }) => html`\n
\n \n
\n
\n ${!isDesktop &&\n html`\n \n \n \n `}\n \n
\n \n \n \n \n ${!isDesktop && html`\n
\n \n
`}\n `.css`\n :host {\n display: grid;\n grid-gap: var(--v-website-course-layout-gap);\n grid-template-rows: repeat(4, min-content) auto;\n padding-bottom: var(--v-website-course-layout-gap);\n min-height: 74vh;\n\n --v-ui-color-link: var(--v-ui-color-action);\n --v-ui-avatar-size: 32px;\n --v-website-course-layout-gap: 24px;\n }\n\n #poster ::slotted(*) {\n display: block;\n max-width: 100%;\n }\n\n #content {\n max-width: 100%;\n --v-ui-line-height: 1.7em;\n hyphens: auto;\n word-break: break-word;\n }\n\n #content, #aside {\n font-size: 16px;\n --v-ui-font-size-default: 16px;\n }\n\n #aside slot[name=\"aside\"]::slotted(*),\n #aside slot[name=\"type\"]::slotted(*) {\n --v-ui-font-size-button: 14px;\n }\n \n #aside slot[name=\"actions\"]::slotted(*) {\n --v-ui-font-size-default: 14px;\n }\n\n #content ::slotted(h1), #content ::slotted(h2) {\n font-size: 20px;\n font-weight: 700;\n }\n\n #actions ::slotted(*) {\n margin: calc(var(--v-ui-layout-spacing) / 2) 0;\n }\n\n #actions {\n margin: calc(var(--v-ui-layout-spacing) / -2) 0;\n }\n\n @media (max-width: 767px) {\n #poster {\n margin: 0 calc(var(--v-ui-layout-spacing) * -1) -16px;\n }\n\n #actions {\n z-index: 1;\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n background: white;\n margin: 0;\n padding: 0 var(--v-ui-layout-spacing);\n border-top: 1px solid var(--v-ui-color-background);\n box-shadow: 0px -4px 40px rgba(0, 0, 0, 0.05);\n font-size: 12px;\n --v-ui-font-size-default: 12px;\n --v-ui-flexbox-gap: 8px;\n }\n \n #aside slot[name=\"actions\"]::slotted(v-ui-flexbox) {\n width: 45%;\n margin-right: 5px;\n }\n #aside slot[name=\"type\"]::slotted(*) {\n visibility: hidden;\n height: 0;\n }\n }\n\n @media (min-width: 768px) {\n :host {\n margin: var(--v-ui-layout-spacing) 0;\n grid-template-rows: repeat(2, min-content) auto;\n grid-template-columns: 1fr 280px;\n --v-website-course-layout-gap: 24px;\n }\n\n #poster {\n grid-row: 2 / 3;\n }\n\n #poster ::slotted(*) {\n display: block;\n border-radius: 8px;\n overflow: hidden;\n -webkit-mask-image: -webkit-radial-gradient(white, black);\n }\n\n #poster, #content {\n grid-column: 1 / 2;\n }\n\n #content {\n padding-bottom: 0;\n }\n\n #aside {\n grid-row: 2 / 4;\n grid-column: 2 / 3;\n border-top: none;\n padding-top: 0;\n }\n \n #aside slot[name=\"share\"]::slotted(*), #aside slot[name=\"aside\"]::slotted(*) {\n margin-bottom: var(--v-website-course-layout-gap);\n }\n\n #actions {\n padding-bottom: var(--v-website-course-layout-gap);\n }\n }\n\n @media (min-width: 1200px) {\n :host {\n margin: calc(2 * var(--v-ui-layout-spacing)) 0;\n }\n }\n `,\n});\n","import { html, define } from \"hybrids\";\nimport menu from \"~/factories/menu\";\n\ninterface VWebsiteDropdown {\n arrow: boolean;\n dot: boolean;\n open: boolean;\n}\n\nfunction toggleOpen(host: VWebsiteDropdown) {\n host.open = !host.open;\n}\n\nexport default define({\n tag: \"v-website-dropdown\",\n arrow: false,\n dot: false,\n open: menu(),\n render: ({ arrow, open, dot, title }) =>\n html`\n \n \n ${arrow && html``}\n \n
\n \n
\n `.css`\n :host {\n display: grid;\n place-items: center;\n position: relative;\n }\n\n v-ui-button {\n height: auto;\n }\n\n v-ui-icon {\n margin-left: 8px;\n --v-ui-icon-color: var(--v-ui-color-text-primary);\n }\n\n #dropdown {\n visibility: hidden;\n position: absolute;\n top: calc(100% + 8px);\n right: var(--v-website-dropdown-right, 0);\n background: var(--v-ui-nav-dropdown-background-color);\n color: var(--v-ui-nav-text-color);\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n border: 1px solid var(--v-ui-nav-dropdown-border-color);\n box-shadow: 4px 7px 40px rgba(0, 0, 0, 0.05);\n border-radius: 8px;\n opacity: 0;\n transform: translateY(-10px);\n transition: opacity 200ms, visibility 0s 200ms, transform 200ms;\n }\n\n #dropdown.open {\n z-index: 1;\n visibility: visible;\n opacity: 1;\n transform: none;\n transition: opacity 100ms, transform 100ms;\n }\n `,\n});\n","import { define, html } from \"hybrids\";\nimport { post } from \"~/utils/api\";\n\nfunction close(host: HTMLElement) {\n post(\"/accept_cookies\");\n host.parentElement?.removeChild(host);\n}\n\nexport default define({\n tag: \"v-website-gdpr-banner\",\n render: () => html`\n \n \n We use cookies to improve your browsing experience on our website. By\n closing this banner or interacting with our site, you acknowledge and\n agree to our Privacy Policy.\n \n \n \n `.css`\n :host {\n z-index: var(--v-ui-z-index-banner);\n display: block;\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n background: white;\n padding: var(--v-ui-layout-spacing);\n box-shadow: 0px -4px 40px rgba(0, 0, 0, 0.05);\n }\n\n v-ui-button {\n flex-basis: 140px;\n }\n `,\n});\n","import { html, define, Component } from \"hybrids\";\nimport menu from \"~/factories/menu\";\n\ninterface VWebsiteHeader extends HTMLElement {\n search: boolean;\n}\n\nfunction toggleSearch(host: VWebsiteHeader) {\n host.search = !host.search;\n}\n\nexport default define({\n tag: \"v-website-header\",\n search: menu((host, value) => {\n const input = host.querySelector(\n 'input[slot=\"search\"]'\n ) as HTMLInputElement;\n\n if (input) {\n if (value) {\n const length = input.value.length;\n if (length) {\n input.selectionStart = length;\n input.selectionEnd = length;\n }\n } else {\n input.value = input.getAttribute(\"value\") || \"\";\n }\n\n Promise.resolve().then(() => input.focus());\n }\n }),\n render: ({ search }) => html`\n \n \n ${search &&\n html`\n
\n \n \n \n \n \n \n \n
\n `}\n `.css`\n :host {\n z-index: var(--v-ui-z-index-dialog);\n position: relative;\n display: grid;\n grid: 60px / max-content 1fr max-content;\n align-items: stretch;\n padding: 0px 16px;\n background: var(--v-ui-nav-background-color);\n box-shadow: 0px 4px 40px rgba(0, 0, 0, 0.05);\n border-bottom: 1px solid var(--v-ui-nav-border-color);\n font-size: 14px;\n --v-ui-font-size-button: 14px;\n --v-ui-avatar-size: 28px;\n --v-ui-color-primary: #252525;\n --v-ui-color-secondary: #6874de;\n }\n\n :host([search]) {\n z-index: calc(var(--v-ui-z-index-dialog) + 1);\n }\n\n :host([search]) #main, :host([search]) #logo {\n display: none;\n }\n\n #logo {\n display: grid;\n place-items: center;\n --v-ui-icon-height: 36px;\n }\n\n #main {\n grid-column: 3;\n display: grid;\n grid-auto-flow: column;\n grid-auto-columns: max-content;\n grid-template-rows: 34px;\n grid-gap: 4px;\n align-self: center;\n align-items: stretch;\n }\n\n #main v-ui-button, #main ::slotted(*) {\n min-width: 34px;\n }\n\n #main ::slotted(v-ui-avatar) {\n width: 28px;\n }\n\n #search {\n display: flex;\n align-items: center;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n background: var(--v-ui-nav-background-color);\n }\n\n #search v-ui-icon, #search v-ui-button {\n width: 48px;\n }\n\n #search v-ui-input {\n flex: 1;\n padding: 0 10px;\n --v-ui-input-border-color: transparent;\n }\n\n @media (min-width: 768px) {\n :host {\n grid-template-rows: 70px;\n padding: 0 30px;\n font-size: 16px;\n }\n\n #main {\n grid-gap: 12px;\n }\n\n #search v-ui-icon, #search v-ui-button {\n width: 80px;\n }\n }\n `,\n});\n","import { html, define, Component } from \"hybrids\";\n\nexport default define({\n tag: \"v-website-footer\",\n render: () => html`\n
\n
\n \n \n\n \n Creator tools and funding\n
\n For musicians, by musicians\n
\n
\n
\n\n
\n \n About\n \n \n
\n\n
\n \n Community\n \n \n
\n\n
\n \n Help\n \n \n
\n\n
\n \n Legal\n \n \n
\n\n
\n \n Follow\n \n
\n \n \n \n
\n \n
\n\n
\n
\n \n
\n
\n\n
\n \n \n \n
\n `.css`\n :host {\n display: grid;\n justify-items: center;\n background: black;\n padding: 44px 44px 112px;\n color: white;\n font-size: var(--v-ui-font-size-default);\n text-align: center;\n --v-ui-color-link: white;\n --v-ui-color-text-primary: white;\n --v-ui-color-text-secondary: #666;\n --v-ui-font-size-caption: 14px;\n }\n\n :host ::slotted(a) {\n user-select: none;\n margin: 10px 0;\n }\n\n #logo {\n margin-bottom: var(--v-ui-layout-spacing);\n }\n \n #follow {\n --v-ui-icon-color: #666;\n }\n \n #follow v-ui-flexbox {\n margin: 0 -8px;\n }\n\n #follow ::slotted(*) {\n margin: 20px 8px;\n }\n\n .footer-column {\n display: grid;\n gap: 0;\n }\n \n #apps {\n display: grid;\n grid-template-rows: auto auto;\n }\n \n #apps ::slotted(a) {\n margin: 0;\n }\n \n @media (max-width: 991px) {\n #logo v-ui-icon[name=\"logo\"] { display: none; }\n #footer {\n padding-top: 36px;\n }\n }\n\n @media (max-width: 768px) {\n .header { display: none; }\n #apps {\n gap: 20px;\n }\n }\n\n @media (min-width: 768px) {\n :host {\n grid-gap: 25px;\n grid-template-columns: repeat(7, auto);\n justify-items: flex-start;\n justify-content: center;\n padding: 44px 16px;\n --v-ui-font-size-default: 13px;\n text-align: left;\n }\n\n :host ::slotted(a) {\n margin: 0;\n }\n\n #follow ::slotted(*) {\n margin: 0px 8px;\n }\n\n #logo {\n grid-row: 1/4;\n display: grid;\n justify-self: stretch;\n align-content: flex-start;\n margin: 0;\n }\n\n #logo v-ui-text,\n #logo v-ui-icon[name=\"logofullwhite\"] { display: none; }\n\n #footer {\n padding-top: 36px;\n justify-self: center;\n grid-column: 1/6;\n grid-row: 2;\n }\n\n .footer-column {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .header {\n font-size: 12px;\n }\n \n #apps {\n gap: 10px;\n }\n }\n \n @media (min-width: 931px) {\n :host {\n grid-gap: 80px;\n grid-template-columns: repeat(6, auto);\n }\n \n #apps-column {\n display: none;\n }\n }\n \n `,\n});\n","import { define, html } from \"hybrids\";\n\ninterface VWebsiteFormLayout {\n backUrl: string;\n}\n\nexport default define({\n tag: \"v-website-form-layout\",\n backUrl: \"\",\n render: ({ backUrl }) => html`\n
\n ${backUrl &&\n html`\n `}\n \n \n \n \n
\n \n
\n
\n `.css`\n :host {\n display: block;\n padding: calc(var(--v-ui-layout-spacing) * 2) var(--v-ui-layout-spacing);\n --v-ui-font-size-default: 14px;\n --v-ui-color-link: var(--v-ui-color-action);\n }\n\n #container {\n display: flex;\n flex-direction: column;\n min-height: 74vh;\n position: relative;\n max-width: 808px;\n margin: 0 auto;\n }\n\n #content {\n flex: 1 0;\n display: flex;\n flex-direction: column;\n margin-top: calc(var(--v-ui-layout-spacing) * 2);\n }\n\n #nav {\n margin: 0 0 var(--v-ui-layout-spacing);\n --v-ui-color-button: var(--v-ui-color-text-primary);\n --v-ui-font-size-button: 14px;\n }\n\n @media (min-width: 1100px) {\n #nav {\n position: absolute;\n right: 100%;\n margin-right: calc(var(--v-ui-layout-spacing) * 2);\n }\n }\n `,\n});\n","import { html, define, Component } from \"hybrids\";\n\ninterface VWebsiteHeaderMenu {\n showOrganizations: boolean;\n showBadges: boolean;\n}\n\nexport default define({\n tag: \"v-website-header-menu\",\n showOrganizations: false,\n showBadges: false,\n render: ({ showOrganizations, showBadges }) => html`\n \n ${showOrganizations && html``}\n \n ${showBadges && html``}\n \n `.css`\n :host {\n font-size: 16px;\n --v-ui-font-size-button: 16px;\n }\n\n nav {\n display: grid;\n padding: 4px;\n }\n\n ::slotted(a) {\n padding: 10px 0 10px 20px;\n }\n\n #actions {\n border-top: 1px solid var(--v-ui-nav-dropdown-border-color);\n }\n\n #organizations {\n border-top: 1px solid var(--v-ui-nav-dropdown-border-color);\n }\n\n #footer {\n border-top: 1px solid var(--v-ui-nav-dropdown-border-color);\n }\n \n #app-badges {\n border-top: 1px solid var(--v-ui-nav-dropdown-border-color);\n }\n \n @media (min-width: 931px) {\n #app-badges {\n display: none;\n }\n }\n `,\n});\n","const weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nconst months = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December'\n];\nfunction pad(num) {\n return `0${num}`.slice(-2);\n}\nfunction strftime(time, formatString) {\n const day = time.getDay();\n const date = time.getDate();\n const month = time.getMonth();\n const year = time.getFullYear();\n const hour = time.getHours();\n const minute = time.getMinutes();\n const second = time.getSeconds();\n return formatString.replace(/%([%aAbBcdeHIlmMpPSwyYZz])/g, function (_arg) {\n let match;\n const modifier = _arg[1];\n switch (modifier) {\n case '%':\n return '%';\n case 'a':\n return weekdays[day].slice(0, 3);\n case 'A':\n return weekdays[day];\n case 'b':\n return months[month].slice(0, 3);\n case 'B':\n return months[month];\n case 'c':\n return time.toString();\n case 'd':\n return pad(date);\n case 'e':\n return String(date);\n case 'H':\n return pad(hour);\n case 'I':\n return pad(strftime(time, '%l'));\n case 'l':\n if (hour === 0 || hour === 12) {\n return String(12);\n }\n else {\n return String((hour + 12) % 12);\n }\n case 'm':\n return pad(month + 1);\n case 'M':\n return pad(minute);\n case 'p':\n if (hour > 11) {\n return 'PM';\n }\n else {\n return 'AM';\n }\n case 'P':\n if (hour > 11) {\n return 'pm';\n }\n else {\n return 'am';\n }\n case 'S':\n return pad(second);\n case 'w':\n return String(day);\n case 'y':\n return pad(year % 100);\n case 'Y':\n return String(year);\n case 'Z':\n match = time.toString().match(/\\((\\w+)\\)$/);\n return match ? match[1] : '';\n case 'z':\n match = time.toString().match(/\\w([+-]\\d\\d\\d\\d) /);\n return match ? match[1] : '';\n }\n return '';\n });\n}\nfunction makeFormatter(options) {\n let format;\n return function () {\n if (format)\n return format;\n if ('Intl' in window) {\n try {\n format = new Intl.DateTimeFormat(undefined, options);\n return format;\n }\n catch (e) {\n if (!(e instanceof RangeError)) {\n throw e;\n }\n }\n }\n };\n}\nlet dayFirst = null;\nconst dayFirstFormatter = makeFormatter({ day: 'numeric', month: 'short' });\nfunction isDayFirst() {\n if (dayFirst !== null) {\n return dayFirst;\n }\n const formatter = dayFirstFormatter();\n if (formatter) {\n const output = formatter.format(new Date(0));\n dayFirst = !!output.match(/^\\d/);\n return dayFirst;\n }\n else {\n return false;\n }\n}\nlet yearSeparator = null;\nconst yearFormatter = makeFormatter({ day: 'numeric', month: 'short', year: 'numeric' });\nfunction isYearSeparator() {\n if (yearSeparator !== null) {\n return yearSeparator;\n }\n const formatter = yearFormatter();\n if (formatter) {\n const output = formatter.format(new Date(0));\n yearSeparator = !!output.match(/\\d,/);\n return yearSeparator;\n }\n else {\n return true;\n }\n}\nfunction isThisYear(date) {\n const now = new Date();\n return now.getUTCFullYear() === date.getUTCFullYear();\n}\nfunction makeRelativeFormat(locale, options) {\n if ('Intl' in window && 'RelativeTimeFormat' in window.Intl) {\n try {\n return new Intl.RelativeTimeFormat(locale, options);\n }\n catch (e) {\n if (!(e instanceof RangeError)) {\n throw e;\n }\n }\n }\n}\nfunction localeFromElement(el) {\n const container = el.closest('[lang]');\n if (container instanceof HTMLElement && container.lang) {\n return container.lang;\n }\n return 'default';\n}\n\nconst datetimes = new WeakMap();\nclass ExtendedTimeElement extends HTMLElement {\n static get observedAttributes() {\n return [\n 'datetime',\n 'day',\n 'format',\n 'lang',\n 'hour',\n 'minute',\n 'month',\n 'second',\n 'title',\n 'weekday',\n 'year',\n 'time-zone-name'\n ];\n }\n connectedCallback() {\n const title = this.getFormattedTitle();\n if (title && !this.hasAttribute('title')) {\n this.setAttribute('title', title);\n }\n const text = this.getFormattedDate();\n if (text) {\n this.textContent = text;\n }\n }\n attributeChangedCallback(attrName, oldValue, newValue) {\n const oldTitle = this.getFormattedTitle();\n if (attrName === 'datetime') {\n const millis = Date.parse(newValue);\n if (isNaN(millis)) {\n datetimes.delete(this);\n }\n else {\n datetimes.set(this, new Date(millis));\n }\n }\n const title = this.getFormattedTitle();\n const currentTitle = this.getAttribute('title');\n if (attrName !== 'title' && title && (!currentTitle || currentTitle === oldTitle)) {\n this.setAttribute('title', title);\n }\n const text = this.getFormattedDate();\n if (text) {\n this.textContent = text;\n }\n }\n get date() {\n return datetimes.get(this);\n }\n getFormattedTitle() {\n const date = this.date;\n if (!date)\n return;\n const formatter = titleFormatter();\n if (formatter) {\n return formatter.format(date);\n }\n else {\n try {\n return date.toLocaleString();\n }\n catch (e) {\n if (e instanceof RangeError) {\n return date.toString();\n }\n else {\n throw e;\n }\n }\n }\n }\n getFormattedDate() {\n return;\n }\n}\nconst titleFormatter = makeFormatter({\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n timeZoneName: 'short'\n});\n\nconst formatters = new WeakMap();\nclass LocalTimeElement extends ExtendedTimeElement {\n attributeChangedCallback(attrName, oldValue, newValue) {\n if (attrName === 'hour' || attrName === 'minute' || attrName === 'second' || attrName === 'time-zone-name') {\n formatters.delete(this);\n }\n super.attributeChangedCallback(attrName, oldValue, newValue);\n }\n getFormattedDate() {\n const d = this.date;\n if (!d)\n return;\n const date = formatDate(this, d) || '';\n const time = formatTime(this, d) || '';\n return `${date} ${time}`.trim();\n }\n}\nfunction formatDate(el, date) {\n const props = {\n weekday: {\n short: '%a',\n long: '%A'\n },\n day: {\n numeric: '%e',\n '2-digit': '%d'\n },\n month: {\n short: '%b',\n long: '%B'\n },\n year: {\n numeric: '%Y',\n '2-digit': '%y'\n }\n };\n let format = isDayFirst() ? 'weekday day month year' : 'weekday month day, year';\n for (const prop in props) {\n const value = props[prop][el.getAttribute(prop) || ''];\n format = format.replace(prop, value || '');\n }\n format = format.replace(/(\\s,)|(,\\s$)/, '');\n return strftime(date, format).replace(/\\s+/, ' ').trim();\n}\nfunction formatTime(el, date) {\n const options = {};\n const hour = el.getAttribute('hour');\n if (hour === 'numeric' || hour === '2-digit')\n options.hour = hour;\n const minute = el.getAttribute('minute');\n if (minute === 'numeric' || minute === '2-digit')\n options.minute = minute;\n const second = el.getAttribute('second');\n if (second === 'numeric' || second === '2-digit')\n options.second = second;\n const tz = el.getAttribute('time-zone-name');\n if (tz === 'short' || tz === 'long')\n options.timeZoneName = tz;\n if (Object.keys(options).length === 0) {\n return;\n }\n let factory = formatters.get(el);\n if (!factory) {\n factory = makeFormatter(options);\n formatters.set(el, factory);\n }\n const formatter = factory();\n if (formatter) {\n return formatter.format(date);\n }\n else {\n const timef = options.second ? '%H:%M:%S' : '%H:%M';\n return strftime(date, timef);\n }\n}\nif (!window.customElements.get('local-time')) {\n window.LocalTimeElement = LocalTimeElement;\n window.customElements.define('local-time', LocalTimeElement);\n}\n\nclass RelativeTime {\n constructor(date, locale) {\n this.date = date;\n this.locale = locale;\n }\n toString() {\n const ago = this.timeElapsed();\n if (ago) {\n return ago;\n }\n else {\n const ahead = this.timeAhead();\n if (ahead) {\n return ahead;\n }\n else {\n return `on ${this.formatDate()}`;\n }\n }\n }\n timeElapsed() {\n const ms = new Date().getTime() - this.date.getTime();\n const sec = Math.round(ms / 1000);\n const min = Math.round(sec / 60);\n const hr = Math.round(min / 60);\n const day = Math.round(hr / 24);\n if (ms >= 0 && day < 30) {\n return this.timeAgoFromMs(ms);\n }\n else {\n return null;\n }\n }\n timeAhead() {\n const ms = this.date.getTime() - new Date().getTime();\n const sec = Math.round(ms / 1000);\n const min = Math.round(sec / 60);\n const hr = Math.round(min / 60);\n const day = Math.round(hr / 24);\n if (ms >= 0 && day < 30) {\n return this.timeUntil();\n }\n else {\n return null;\n }\n }\n timeAgo() {\n const ms = new Date().getTime() - this.date.getTime();\n return this.timeAgoFromMs(ms);\n }\n timeAgoFromMs(ms) {\n const sec = Math.round(ms / 1000);\n const min = Math.round(sec / 60);\n const hr = Math.round(min / 60);\n const day = Math.round(hr / 24);\n const month = Math.round(day / 30);\n const year = Math.round(month / 12);\n if (ms < 0) {\n return formatRelativeTime(this.locale, 0, 'second');\n }\n else if (sec < 10) {\n return formatRelativeTime(this.locale, 0, 'second');\n }\n else if (sec < 45) {\n return formatRelativeTime(this.locale, -sec, 'second');\n }\n else if (sec < 90) {\n return formatRelativeTime(this.locale, -min, 'minute');\n }\n else if (min < 45) {\n return formatRelativeTime(this.locale, -min, 'minute');\n }\n else if (min < 90) {\n return formatRelativeTime(this.locale, -hr, 'hour');\n }\n else if (hr < 24) {\n return formatRelativeTime(this.locale, -hr, 'hour');\n }\n else if (hr < 36) {\n return formatRelativeTime(this.locale, -day, 'day');\n }\n else if (day < 30) {\n return formatRelativeTime(this.locale, -day, 'day');\n }\n else if (month < 18) {\n return formatRelativeTime(this.locale, -month, 'month');\n }\n else {\n return formatRelativeTime(this.locale, -year, 'year');\n }\n }\n microTimeAgo() {\n const ms = new Date().getTime() - this.date.getTime();\n const sec = Math.round(ms / 1000);\n const min = Math.round(sec / 60);\n const hr = Math.round(min / 60);\n const day = Math.round(hr / 24);\n const month = Math.round(day / 30);\n const year = Math.round(month / 12);\n if (min < 1) {\n return '1m';\n }\n else if (min < 60) {\n return `${min}m`;\n }\n else if (hr < 24) {\n return `${hr}h`;\n }\n else if (day < 365) {\n return `${day}d`;\n }\n else {\n return `${year}y`;\n }\n }\n timeUntil() {\n const ms = this.date.getTime() - new Date().getTime();\n return this.timeUntilFromMs(ms);\n }\n timeUntilFromMs(ms) {\n const sec = Math.round(ms / 1000);\n const min = Math.round(sec / 60);\n const hr = Math.round(min / 60);\n const day = Math.round(hr / 24);\n const month = Math.round(day / 30);\n const year = Math.round(month / 12);\n if (month >= 18) {\n return formatRelativeTime(this.locale, year, 'year');\n }\n else if (month >= 12) {\n return formatRelativeTime(this.locale, year, 'year');\n }\n else if (day >= 45) {\n return formatRelativeTime(this.locale, month, 'month');\n }\n else if (day >= 30) {\n return formatRelativeTime(this.locale, month, 'month');\n }\n else if (hr >= 36) {\n return formatRelativeTime(this.locale, day, 'day');\n }\n else if (hr >= 24) {\n return formatRelativeTime(this.locale, day, 'day');\n }\n else if (min >= 90) {\n return formatRelativeTime(this.locale, hr, 'hour');\n }\n else if (min >= 45) {\n return formatRelativeTime(this.locale, hr, 'hour');\n }\n else if (sec >= 90) {\n return formatRelativeTime(this.locale, min, 'minute');\n }\n else if (sec >= 45) {\n return formatRelativeTime(this.locale, min, 'minute');\n }\n else if (sec >= 10) {\n return formatRelativeTime(this.locale, sec, 'second');\n }\n else {\n return formatRelativeTime(this.locale, 0, 'second');\n }\n }\n microTimeUntil() {\n const ms = this.date.getTime() - new Date().getTime();\n const sec = Math.round(ms / 1000);\n const min = Math.round(sec / 60);\n const hr = Math.round(min / 60);\n const day = Math.round(hr / 24);\n const month = Math.round(day / 30);\n const year = Math.round(month / 12);\n if (day >= 365) {\n return `${year}y`;\n }\n else if (hr >= 24) {\n return `${day}d`;\n }\n else if (min >= 60) {\n return `${hr}h`;\n }\n else if (min > 1) {\n return `${min}m`;\n }\n else {\n return '1m';\n }\n }\n formatDate() {\n let format = isDayFirst() ? '%e %b' : '%b %e';\n if (!isThisYear(this.date)) {\n format += isYearSeparator() ? ', %Y' : ' %Y';\n }\n return strftime(this.date, format);\n }\n formatTime() {\n const formatter = timeFormatter();\n if (formatter) {\n return formatter.format(this.date);\n }\n else {\n return strftime(this.date, '%l:%M%P');\n }\n }\n}\nfunction formatRelativeTime(locale, value, unit) {\n const formatter = makeRelativeFormat(locale, { numeric: 'auto' });\n if (formatter) {\n return formatter.format(value, unit);\n }\n else {\n return formatEnRelativeTime(value, unit);\n }\n}\nfunction formatEnRelativeTime(value, unit) {\n if (value === 0) {\n switch (unit) {\n case 'year':\n case 'quarter':\n case 'month':\n case 'week':\n return `this ${unit}`;\n case 'day':\n return 'today';\n case 'hour':\n case 'minute':\n return `in 0 ${unit}s`;\n case 'second':\n return 'now';\n }\n }\n else if (value === 1) {\n switch (unit) {\n case 'year':\n case 'quarter':\n case 'month':\n case 'week':\n return `next ${unit}`;\n case 'day':\n return 'tomorrow';\n case 'hour':\n case 'minute':\n case 'second':\n return `in 1 ${unit}`;\n }\n }\n else if (value === -1) {\n switch (unit) {\n case 'year':\n case 'quarter':\n case 'month':\n case 'week':\n return `last ${unit}`;\n case 'day':\n return 'yesterday';\n case 'hour':\n case 'minute':\n case 'second':\n return `1 ${unit} ago`;\n }\n }\n else if (value > 1) {\n switch (unit) {\n case 'year':\n case 'quarter':\n case 'month':\n case 'week':\n case 'day':\n case 'hour':\n case 'minute':\n case 'second':\n return `in ${value} ${unit}s`;\n }\n }\n else if (value < -1) {\n switch (unit) {\n case 'year':\n case 'quarter':\n case 'month':\n case 'week':\n case 'day':\n case 'hour':\n case 'minute':\n case 'second':\n return `${-value} ${unit}s ago`;\n }\n }\n throw new RangeError(`Invalid unit argument for format() '${unit}'`);\n}\nconst timeFormatter = makeFormatter({ hour: 'numeric', minute: '2-digit' });\n\nclass RelativeTimeElement extends ExtendedTimeElement {\n getFormattedDate() {\n const date = this.date;\n if (!date)\n return;\n return new RelativeTime(date, localeFromElement(this)).toString();\n }\n connectedCallback() {\n nowElements.push(this);\n if (!updateNowElementsId) {\n updateNowElements();\n updateNowElementsId = window.setInterval(updateNowElements, 60 * 1000);\n }\n super.connectedCallback();\n }\n disconnectedCallback() {\n const ix = nowElements.indexOf(this);\n if (ix !== -1) {\n nowElements.splice(ix, 1);\n }\n if (!nowElements.length) {\n if (updateNowElementsId) {\n clearInterval(updateNowElementsId);\n updateNowElementsId = null;\n }\n }\n }\n}\nconst nowElements = [];\nlet updateNowElementsId;\nfunction updateNowElements() {\n let time, i, len;\n for (i = 0, len = nowElements.length; i < len; i++) {\n time = nowElements[i];\n time.textContent = time.getFormattedDate() || '';\n }\n}\nif (!window.customElements.get('relative-time')) {\n window.RelativeTimeElement = RelativeTimeElement;\n window.customElements.define('relative-time', RelativeTimeElement);\n}\n\nclass TimeAgoElement extends RelativeTimeElement {\n getFormattedDate() {\n const format = this.getAttribute('format');\n const date = this.date;\n if (!date)\n return;\n if (format === 'micro') {\n return new RelativeTime(date, localeFromElement(this)).microTimeAgo();\n }\n else {\n return new RelativeTime(date, localeFromElement(this)).timeAgo();\n }\n }\n}\nif (!window.customElements.get('time-ago')) {\n window.TimeAgoElement = TimeAgoElement;\n window.customElements.define('time-ago', TimeAgoElement);\n}\n\nclass TimeUntilElement extends RelativeTimeElement {\n getFormattedDate() {\n const format = this.getAttribute('format');\n const date = this.date;\n if (!date)\n return;\n if (format === 'micro') {\n return new RelativeTime(date, localeFromElement(this)).microTimeUntil();\n }\n else {\n return new RelativeTime(date, localeFromElement(this)).timeUntil();\n }\n }\n}\nif (!window.customElements.get('time-until')) {\n window.TimeUntilElement = TimeUntilElement;\n window.customElements.define('time-until', TimeUntilElement);\n}\n\nexport { LocalTimeElement, RelativeTimeElement, TimeAgoElement, TimeUntilElement };\n","import { store, Model } from \"hybrids\";\nimport { get, post } from \"~/utils/api\";\n\nimport User from \"./User\";\n\ninterface Notification {\n id: string;\n key: string;\n user: User;\n content: string;\n createdAt: string;\n read: boolean;\n}\n\nconst Notification: Model = {\n id: true,\n key: \"\",\n user: User,\n content: \"\",\n createdAt: \"\",\n read: false,\n [store.connect]: {\n cache: 1000 * 60, // a minute\n offline: 1000 * 60 * 5, // 5 minutes\n set: (id, values) => values,\n list(params) {\n return get(\"/notifications\", params);\n },\n },\n};\n\nexport default Notification;\n\nexport function markAsRead(notification: Notification) {\n post(\"/notifications/:id/mark_as_read\", null, notification.id).catch(() => {\n store.set(notification, { read: false });\n });\n\n return store.set(notification, { read: true });\n}\n\nexport function markAllAsRead() {\n return post(\"/notifications/mark_all_as_read\").then(() => {\n store.clear([Notification], false);\n });\n}\n","import { html, define, Component, store } from \"hybrids\";\nimport \"@github/time-elements\";\n\nimport Notification, { markAsRead, markAllAsRead } from \"~/stores/Notification\";\n\ninterface VWebsiteHeaderNotifications {\n page: number;\n pages: Notification[][];\n loadMore: boolean;\n dot: boolean;\n}\n\nfunction setNextPage(host: VWebsiteHeaderNotifications) {\n host.page += 1;\n}\n\nconst PER_PAGE = 50;\n\nexport default define({\n tag: \"v-website-header-notifications\",\n page: 1,\n pages: ({ page }) => {\n const result: Notification[][] = [];\n\n for (let i = 1; i <= page; i += 1) {\n const notifications = store.get([Notification], { page: i });\n result.push(notifications);\n }\n\n return result;\n },\n loadMore: ({ pages }) => pages[pages.length - 1].length === PER_PAGE,\n dot: ({ pages }) =>\n pages.some(\n (notifications) =>\n store.ready(notifications) && notifications.some((n) => !n.read)\n ),\n render: ({ pages, loadMore, dot }) => html`\n \n \n
\n \n Notifications\n ${dot &&\n html``}\n \n \n ${pages.map(\n (page) =>\n store.ready(page) &&\n page.map(\n (notification) => html`\n markAsRead(notification))}\"\n >\n \n ${!notification.read && html`
`}\n \n
\n \n \n \n \n \n `\n )\n )}\n ${loadMore &&\n html``}\n
\n
\n
\n `.css`\n :host {\n display: grid;\n }\n\n #notifications {\n display: block;\n width: 320px;\n max-width: 90vw;\n font-size: 14px;\n }\n\n v-website-dropdown {\n --v-ui-button-dot-top: -2px;\n --v-ui-button-dot-right: 0px;\n --v-ui-button-dot-border: 2px solid white;\n }\n\n #header {\n padding: 16px;\n border-bottom: 1px solid var(--v-ui-nav-dropdown-border-color);\n }\n\n #list {\n max-height: min(55vh, 520px);\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n }\n\n #load-more {\n padding: 8px;\n }\n\n .notification {\n position: relative;\n display: grid;\n grid: min-content min-content / max-content 1fr;\n grid-gap: 4px 8px;\n padding: 16px 0;\n margin: 0 16px;\n --v-ui-font-size-default: 14px;\n border-bottom: 1px solid var(--v-ui-nav-dropdown-border-color);\n }\n\n .notification:last-child {\n border: none;\n }\n\n .notification a {\n color: var(--v-ui-color-secondary);\n font-weight: 600;\n text-decoration: none;\n }\n\n .notification .avatar {\n margin-top: 4px;\n grid-row: 1/3;\n grid-column: 1;\n --v-ui-avatar-size: 32px;\n }\n\n .notification .time {\n grid-column: 2;\n }\n\n .notification .dot {\n width: 8px;\n height: 8px;\n border-radius: 8px;\n margin: 12px 8px 0 0;\n background: var(--v-ui-color-text-error);\n }\n\n @media (max-width: 767px) {\n v-website-dropdown {\n --v-website-dropdown-right: -84px;\n }\n }\n\n @media (min-width: 768px) {\n #notifications {\n width: 365px;\n }\n }\n `,\n});\n","import { define, html } from \"hybrids\";\nimport { shareSocial, copy, ShareHost } from \"~/utils/share\";\n\ninterface VWebstieShareBox extends ShareHost {\n border: boolean;\n}\n\nexport default define({\n url: \"\",\n name: \"\",\n copied: false,\n tag: \"v-website-share-box\",\n border: false,\n render: ({ url, copied }) => html`\n \n \n Link:\n \n \n \n \n \n \n \n ${copied ? \"Copied\" : \"Copy link\"}\n \n \n \n \n Social networks:\n \n \n \n \n \n \n \n \n \n \n `.css`\n :host {\n display: block;\n --v-ui-icon-width: 32px;\n --v-ui-icon-height: 32px;\n }\n\n :host([border]) {\n border: 1px solid #EAEAEA;\n border-radius: 8px;\n padding: calc(var(--v-ui-layout-spacing) * 2);\n }\n `,\n});\n","import { define, html } from \"hybrids\";\nimport { share, supportsNative } from \"~/utils/share\";\n\ninterface VWebsiteShareButton {\n url: \"\";\n name: \"\";\n}\n\nexport default define({\n tag: \"v-website-share-button\",\n name: \"\",\n url: \"\",\n render: ({ url }) => (supportsNative\n ? html`\n Share\n `\n : html`\n \n \n Share\n \n \n \n \n `\n ).css`\n :host {\n display: block;\n }\n\n input {\n min-width: 240px;\n }\n\n #content {\n padding: var(--v-ui-layout-spacing);\n }\n `,\n});\n","import { define, html } from \"hybrids\";\n\ninterface VWebsiteSocialButton {\n icon: string;\n iconText: string;\n href: string;\n}\n\nexport default define({\n tag: \"v-website-social-button\",\n icon: \"\",\n iconText: \"\",\n href: \"\",\n render: ({ icon, iconText, href }) => html`\n \n \n \n \n ${iconText &&\n html`\n ${iconText}\n `}\n \n \n \n \n `.css`\n :host {\n display: flex;\n align-items: center;\n justify-content: center;\n --v-ui-icon-width: 20px;\n --v-ui-icon-height: 20px;\n }\n\n v-ui-button { min-width: 34px; }\n #icon { height: 32px; }\n #icon v-ui-text { margin-left: 2px; }\n #name { display: none }\n\n @media (min-width: 768px) {\n #icon { height: 20px; flex-flow: row-reverse; }\n #icon v-ui-text { margin-left: 0; margin-right: 2px; }\n #name { display: block; margin-top: 4px }\n }\n `,\n});\n","import { html, define, Component } from \"hybrids\";\n\ninterface VWebsiteUser {\n avatar: string;\n}\n\nexport default define({\n tag: \"v-website-user\",\n avatar: \"\",\n render: ({ avatar }) => html`\n \n \n `.css`\n :host {\n display: flex;\n align-items: center;\n }\n\n v-ui-avatar {\n margin-right: 4px;\n }\n `,\n});\n","import { define, html } from \"hybrids\";\n\ninterface VAppBadges {\n flow: \"row\" | \"column\";\n appStoreIconName: string;\n playStoreIconName: string;\n desktopVisibility: string;\n}\n\nexport default define({\n tag: \"v-website-app-badges\",\n flow: \"column\",\n appStoreIconName: \"appstore\",\n playStoreIconName: \"playstore\",\n desktopVisibility: \"none\",\n render: ({ flow, appStoreIconName, playStoreIconName, desktopVisibility }) => html`\n \n \n \n \n \n\n \n \n \n \n \n `.css`\n :host([flow=\"column\"]) v-ui-link {\n margin: calc(var(--v-ui-layout-spacing) / 2) 0;\n }\n \n :host([flow=\"row\"]) v-ui-link {\n margin: 0 calc(var(--v-ui-layout-spacing) / 4);\n }\n \n @media (min-width: 931px) {\n :host {\n display: ${desktopVisibility};\n }\n }\n `,\n});\n","import {define, html, router, store} from \"hybrids\";\nimport Tag from \"~/stores/Tag\";\nimport TagMain from \"~/modules/home/views/TagMain\";\nimport layout from \"~/factories/layout\";\n\n\ninterface VEmptyCollectionList {\n message: string;\n featuredTags: Tag[];\n}\n\nexport default define({\n tag: \"v-empty-video-list\",\n message: \"\",\n featuredTags: store([Tag], { id: () => ({ featured: true }) }),\n content: ({ message, featuredTags }) => html`\n \n \n ${message}\n \n \n \n \n Explore\n \n \n ${store.ready(featuredTags) &&\n !!featuredTags.length && html`\n \n \n ${featuredTags.map((featuredTag) => html`\n `\n )}\n \n `}`\n});\n"],"names":["toggleLike","host","store","set","course","likeCount","liked","count","then","activeTarget","scrollRestoration","define","tag","color","render","html","css","isDesktop","mediaQuery","defaultValue","href","courseId","Course","id","ready","clearMap","WeakMap","clearHistory","window","history","back","pull","setTimeout","menu","observe","value","connect","key","lastValue","pushState","state","push","toggleOpen","open","close","post","_a","parentElement","removeChild","toggleSearch","search","addEventListener","get","document","event","path","composedPath","clear","includes","some","el","HTMLAnchorElement","passive","arrow","dot","title","backUrl","input","querySelector","length","selectionStart","selectionEnd","getAttribute","Promise","resolve","focus","showOrganizations","showBadges","weekdays","months","pad","num","slice","strftime","time","formatString","day","getDay","date","getDate","month","getMonth","year","getFullYear","hour","getHours","minute","getMinutes","second","getSeconds","replace","_arg","match","toString","String","makeFormatter","options","format","Intl","DateTimeFormat","e","RangeError","dayFirst","dayFirstFormatter","isDayFirst","formatter","output","Date","yearSeparator","yearFormatter","localeFromElement","container","closest","HTMLElement","lang","datetimes","ExtendedTimeElement","observedAttributes","connectedCallback","this","getFormattedTitle","hasAttribute","setAttribute","text","getFormattedDate","textContent","attributeChangedCallback","attrName","oldValue","newValue","oldTitle","millis","parse","isNaN","delete","currentTitle","titleFormatter","toLocaleString","timeZoneName","formatters","LocalTimeElement","super","d","props","weekday","short","long","numeric","prop","trim","formatDate","tz","Object","keys","factory","formatTime","customElements","RelativeTime","constructor","locale","ago","timeElapsed","ahead","timeAhead","ms","getTime","sec","Math","round","min","hr","timeAgoFromMs","timeUntil","timeAgo","formatRelativeTime","microTimeAgo","timeUntilFromMs","microTimeUntil","getUTCFullYear","isYearSeparator","timeFormatter","unit","RelativeTimeFormat","makeRelativeFormat","formatEnRelativeTime","RelativeTimeElement","nowElements","updateNowElementsId","setInterval","updateNowElements","disconnectedCallback","ix","indexOf","splice","clearInterval","i","len","TimeAgoElement","TimeUntilElement","Notification","user","User","content","createdAt","read","cache","offline","values","list","params","markAllAsRead","setNextPage","page","pages","result","notifications","loadMore","n","map","notification","catch","markAsRead","avatarThumbnail","url","name","copied","border","copy","shareSocial","supportsNative","share","icon","iconText","avatar","flow","appStoreIconName","playStoreIconName","desktopVisibility","message","featuredTags","Tag","featured","featuredTag","router","TagMain","tagObject"],"mappings":"ubAYA,SAASA,EAAWC,GAEfC,EAAAC,IAAIF,EAAKG,OAAQ,CAChBC,UAAWJ,EAAKK,MAAQL,EAAKM,MAAQ,EAAIN,EAAKM,MAAQ,IAEvDC,MAAK,KACCP,EAAAK,OAASL,EAAKK,SChBzB,IAAIG,EACAC,ECGWC,EAAsB,CACnCC,IAAK,kBACLC,MAAO,YACPC,OAAQ,EAAGD,MAAAA,KAAYE,CAAA;;;;IAIrBC,GAAA;;;qCAGiCH;;;;;;;;;MCZtBF,EAA0B,CACvCC,IAAK,sBACLE,OAAQ,IAAMC,CAAA;;;;IAIZC,GAAA;;;;;;;;;;;;;;;MCHWL,EAA6B,CAC1CC,IAAK,0BACLK,UAAWC,EAAW,sBACtBJ,OAAQ,EAAGG,UAAAA,KAAgBF,CAAA;;;;;SAKpBE,GACHF,CAAA;;;;;;;;;;gBAUUE,EAAY,SAAW;;;8BAGTA,EAAY,SAAW;;;;QAI7CA,GAAaF,CAAA;;;QAGbE,GAAaF,CAAA;;;;;;OAMdE,GAAaF,CAAA;;;;IAIhBC,GAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MJxBWL,EAAiC,CAC9CC,IAAK,+BACLO,aAAc,EACdC,KAAM,GACNC,SAAU,GACVjB,OAAQF,EAAMoB,EAAQ,CAAEC,GAAI,aAC5BhB,MAAO,EAAGY,aAAAA,EAAcf,OAAAA,KACtBF,EAAMsB,MAAMpB,GAAUA,EAAOC,UAAYc,EAC3Cb,OAAO,EACPQ,OAAQ,EAAGM,KAAAA,EAAMb,MAAAA,EAAOD,MAAAA,KAAYS,CAAA;;cAExBT,EAAQ,YAAc;kBAClBC,GAAS;iBACVa,EAAO,KAAOpB;cACjBoB;;;;IAIVJ,GAAA;;MCnCJ,MAAMS,MAAeC,QAYrB,SAASC,IACPC,OAAOC,QAAQC,OACfF,OAAOC,QAAQnB,kBAAoBA,EACpBD,EAAA,KAGjB,SAASsB,EAAK9B,GACRQ,IAAiBR,GACnB+B,YAAW,KACLvB,IAAiBR,SAGpB,GAiDP,SAAwBgC,EACtBC,GAEO,MAAA,CACLC,OAAO,EACPC,QAAS,CAACnC,EAAMoC,KACLZ,EAAAtB,IAAIF,GAAM,KACjBA,EAAKoC,IAAO,KAGP,KACLN,EAAK9B,KAGTiC,QAAS,CAACjC,EAAMkC,EAAOG,KACjBH,EAtFV,SAAclC,GACPQ,IACHC,EAAoBkB,OAAOC,QAAQnB,kBACnCkB,OAAOC,QAAQnB,kBAAoB,SACnCkB,OAAOC,QAAQU,UAAUX,OAAOC,QAAQW,MAAO,KAGlC/B,EAAAR,EAgFTwC,CAAKxC,GACIqC,GACTP,EAAK9B,GAGHiC,GACMA,EAAAjC,EAAMkC,EAAOG,KI3F7B,SAASI,EAAWzC,GACbA,EAAA0C,MAAQ1C,EAAK0C,KCPpB,SAASC,EAAM3C,SACb4C,EAAK,mBACA,OAAAC,EAAA7C,EAAA8C,kBAAeC,YAAY/C,GCElC,SAASgD,EAAahD,GACfA,EAAAiD,QAAUjD,EAAKiD,ONyBtBtB,OAAOuB,iBAAiB,YAAY,KAClC,GAAI1C,EAAc,CACFgB,EAAS2B,IAAI3C,KAEZA,EAAA,SAInB4C,SAASF,iBACP,WACCG,IACC,GAAI7C,EAAc,CACV,MAAA8C,EAAOD,EAAME,eACbC,EAAQhC,EAAS2B,IAAI3C,GAEtB8C,EAAKG,SAASjD,GAER8C,EAAKI,MAAMC,GAAOA,aAAcC,sCAM/C,CACEC,SAAS,IAIbT,SAASF,iBACP,aACCG,IACC,GAAI7C,EAAc,CACV,MAAA8C,EAAOD,EAAME,eACbC,EAAQhC,EAAS2B,IAAI3C,GAEtB8C,EAAKG,SAASjD,WAKvB,CACEqD,SAAS,II7DEnD,EAAyB,CACtCC,IAAK,qBACLmD,OAAO,EACPC,KAAK,EACLrB,KAAMV,IACNnB,OAAQ,EAAGiD,MAAAA,EAAOpB,KAAAA,EAAMqB,IAAAA,EAAKC,MAAAA,KAC3BlD,CAAA;;;mBAGe2B;eACJsB;iBACEC;;;UAGPF,GAAShD,CAAA;;sCAEmB,CAAE4B,KAAAA;;;MAGlC3B,GAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QG9BSL,EAAO,CACpBC,IAAK,mBACLE,OAAQ,IAAMC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAiEZC,GAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MC/DWL,EAA2B,CACxCC,IAAK,wBACLsD,QAAS,GACTpD,OAAQ,EAAGoD,QAAAA,KAAcnD,CAAA;;QAEnBmD,GACFnD,CAAA;;kBAEYmD;;;;;;;;;;;;;;IAcdlD,GAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MHpBWL,EAAO,CACpBC,IAAK,wBACLE,OAAQ,IAAMC,CAAA;;;;;;;6CAO6B6B;;IAEzC5B,GAAA;;;;;;;;;;;;;;;;MCRWL,EAAuB,CACpCC,IAAK,mBACLsC,OAAQjB,GAAK,CAAChC,EAAMkC,KAClB,MAAMgC,EAAQlE,EAAKmE,cACjB,wBAGF,GAAID,EAAO,CACT,GAAIhC,EAAO,CACH,MAAAkC,EAASF,EAAMhC,MAAMkC,OACvBA,IACFF,EAAMG,eAAiBD,EACvBF,EAAMI,aAAeF,QAGvBF,EAAMhC,MAAQgC,EAAMK,aAAa,UAAY,GAG/CC,QAAQC,UAAUlE,MAAK,IAAM2D,EAAMQ,cAGvC7D,OAAQ,EAAGoC,OAAAA,KAAanC,CAAA;;;+CAGqBkC;;;;;MAKzCC,GACFnC,CAAA;;;;;;;;;;4DAUwDkC;;;;;IAKxDjC,GAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MGjDWL,EAA2B,CACxCC,IAAK,wBACLgE,mBAAmB,EACnBC,YAAY,EACZ/D,OAAQ,EAAG8D,kBAAAA,EAAmBC,WAAAA,KAAiB9D,CAAA;;MAE3C6D,GAAqB7D,CAAA;;MAErB8D,GAAc9D,CAAA;;IAEhBC,GAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MCjBJ,MAAM8D,EAAW,CAAC,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,YAC9EC,EAAS,CACX,UACA,WACA,QACA,QACA,MACA,OACA,OACA,SACA,YACA,UACA,WACA,YAEJ,SAASC,EAAIC,GACF,MAAA,IAAIA,IAAMC,OAAQ,GAE7B,SAASC,EAASC,EAAMC,GACd,MAAAC,EAAMF,EAAKG,SACXC,EAAOJ,EAAKK,UACZC,EAAQN,EAAKO,WACbC,EAAOR,EAAKS,cACZC,EAAOV,EAAKW,WACZC,EAASZ,EAAKa,aACdC,EAASd,EAAKe,aACpB,OAAOd,EAAae,QAAQ,+BAA+B,SAAUC,GAC7D,IAAAC,EAEI,OADSD,EAAK,IAEb,IAAA,IACM,MAAA,IACN,IAAA,IACD,OAAOvB,EAASQ,GAAKJ,MAAM,EAAG,GAC7B,IAAA,IACD,OAAOJ,EAASQ,GACf,IAAA,IACD,OAAOP,EAAOW,GAAOR,MAAM,EAAG,GAC7B,IAAA,IACD,OAAOH,EAAOW,GACb,IAAA,IACD,OAAON,EAAKmB,WACX,IAAA,IACD,OAAOvB,EAAIQ,GACV,IAAA,IACD,OAAOgB,OAAOhB,GACb,IAAA,IACD,OAAOR,EAAIc,GACV,IAAA,IACD,OAAOd,EAAIG,EAASC,EAAM,OACzB,IAAA,IACG,OACOoB,OADE,IAATV,GAAuB,KAATA,EACA,IAGCA,EAAO,IAAM,IAE/B,IAAA,IACM,OAAAd,EAAIU,EAAQ,GAClB,IAAA,IACD,OAAOV,EAAIgB,GACV,IAAA,IACD,OAAIF,EAAO,GACA,KAGA,KAEV,IAAA,IACD,OAAIA,EAAO,GACA,KAGA,KAEV,IAAA,IACD,OAAOd,EAAIkB,GACV,IAAA,IACD,OAAOM,OAAOlB,GACb,IAAA,IACM,OAAAN,EAAIY,EAAO,KACjB,IAAA,IACD,OAAOY,OAAOZ,GACb,IAAA,IAEM,OADPU,EAAQlB,EAAKmB,WAAWD,MAAM,cACvBA,EAAQA,EAAM,GAAK,GACzB,IAAA,IAEM,OADPA,EAAQlB,EAAKmB,WAAWD,MAAM,qBACvBA,EAAQA,EAAM,GAAK,GAE3B,MAAA,MAGf,SAASG,EAAcC,GACf,IAAAC,EACJ,OAAO,WACC,GAAAA,EACO,OAAAA,EACX,GAAI,SAAU/E,OACN,IAEO,OADP+E,EAAS,IAAIC,KAAKC,oBAAe,EAAWH,GACrCC,QAEJG,GACC,KAAEA,aAAaC,YACT,MAAAD,IAM1B,IAAIE,EAAW,KACf,MAAMC,EAAoBR,EAAc,CAAEnB,IAAK,UAAWI,MAAO,UACjE,SAASwB,IACL,GAAiB,OAAbF,EACO,OAAAA,EAEX,MAAMG,EAAYF,IAClB,GAAIE,EAAW,CACX,MAAMC,EAASD,EAAUR,OAAO,IAAIU,KAAK,IAElC,OADPL,IAAaI,EAAOd,MAAM,OACnBU,EAGA,OAAA,EAGf,IAAIM,EAAgB,KACpB,MAAMC,EAAgBd,EAAc,CAAEnB,IAAK,UAAWI,MAAO,QAASE,KAAM,YA+B5E,SAAS4B,EAAkB5D,GACjB,MAAA6D,EAAY7D,EAAG8D,QAAQ,UACzB,OAAAD,aAAqBE,aAAeF,EAAUG,KACvCH,EAAUG,KAEd,UAGX,MAAMC,MAAgBnG,QACtB,MAAMoG,UAA4BH,YACnBI,gCACA,MAAA,CACH,WACA,MACA,SACA,OACA,OACA,SACA,QACA,SACA,QACA,UACA,OACA,kBAGRC,oBACU,MAAA/D,EAAQgE,KAAKC,oBACfjE,IAAUgE,KAAKE,aAAa,UACvBF,KAAAG,aAAa,QAASnE,GAEzB,MAAAoE,EAAOJ,KAAKK,mBACdD,IACAJ,KAAKM,YAAcF,GAG3BG,yBAAyBC,EAAUC,EAAUC,GACnC,MAAAC,EAAWX,KAAKC,oBACtB,GAAiB,aAAbO,EAAyB,CACnB,MAAAI,EAASxB,KAAKyB,MAAMH,GACtBI,MAAMF,GACNhB,EAAUmB,OAAOf,MAGjBJ,EAAU1H,IAAI8H,KAAM,IAAIZ,KAAKwB,IAG/B,MAAA5E,EAAQgE,KAAKC,oBACbe,EAAehB,KAAKzD,aAAa,SACtB,UAAbiE,IAAwBxE,GAAWgF,GAAgBA,IAAiBL,GAC/DX,KAAAG,aAAa,QAASnE,GAEzB,MAAAoE,EAAOJ,KAAKK,mBACdD,IACAJ,KAAKM,YAAcF,GAGvB7C,WACO,OAAAqC,EAAUzE,IAAI6E,MAEzBC,oBACI,MAAM1C,EAAOyC,KAAKzC,KAClB,IAAKA,EACD,OACJ,MAAM2B,EAAY+B,IAClB,GAAI/B,EACO,OAAAA,EAAUR,OAAOnB,GAGpB,IACA,OAAOA,EAAK2D,uBAETrC,GACH,GAAIA,aAAaC,WACb,OAAOvB,EAAKe,WAGN,MAAAO,GAKtBwB,qBAIJ,MAAMY,EAAiBzC,EAAc,CACjCnB,IAAK,UACLI,MAAO,QACPE,KAAM,UACNE,KAAM,UACNE,OAAQ,UACRoD,aAAc,UAGZC,MAAiB3H,QACvB,MAAM4H,UAAyBxB,EAC3BU,yBAAyBC,EAAUC,EAAUC,GACxB,SAAbF,GAAoC,WAAbA,GAAsC,WAAbA,GAAsC,mBAAbA,GACzEY,EAAWL,OAAOf,MAEhBsB,MAAAf,yBAAyBC,EAAUC,EAAUC,GAEvDL,mBACI,MAAMkB,EAAIvB,KAAKzC,KACf,IAAKgE,EACD,OACJ,MAAMhE,EAKd,SAAoB5B,EAAI4B,GACpB,MAAMiE,EAAQ,CACVC,QAAS,CACLC,MAAO,KACPC,KAAM,MAEVtE,IAAK,CACDuE,QAAS,KACT,UAAW,MAEfnE,MAAO,CACHiE,MAAO,KACPC,KAAM,MAEVhE,KAAM,CACFiE,QAAS,KACT,UAAW,OAGf,IAAAlD,EAASO,IAAe,yBAA2B,0BACvD,IAAA,MAAW4C,KAAQL,EAAO,CACtB,MAAMtH,EAAQsH,EAAMK,GAAMlG,EAAGY,aAAasF,IAAS,IACnDnD,EAASA,EAAOP,QAAQ0D,EAAM3H,GAAS,IAGpC,OADEwE,EAAAA,EAAOP,QAAQ,eAAgB,IACjCjB,EAASK,EAAMmB,GAAQP,QAAQ,MAAO,KAAK2D,OA9BjCC,CAAW/B,KAAMuB,IAAM,GAC9BpE,EA+Bd,SAAoBxB,EAAI4B,GACpB,MAAMkB,EAAU,GACVZ,EAAOlC,EAAGY,aAAa,QAChB,YAATsB,GAA+B,YAATA,IACtBY,EAAQZ,KAAOA,GACb,MAAAE,EAASpC,EAAGY,aAAa,UAChB,YAAXwB,GAAmC,YAAXA,IACxBU,EAAQV,OAASA,GACf,MAAAE,EAAStC,EAAGY,aAAa,UAChB,YAAX0B,GAAmC,YAAXA,IACxBQ,EAAQR,OAASA,GACf,MAAA+D,EAAKrG,EAAGY,aAAa,kBAChB,UAAPyF,GAAyB,SAAPA,IAClBvD,EAAQ0C,aAAea,GAC3B,GAAoC,IAAhCC,OAAOC,KAAKzD,GAASrC,OACrB,OAEA,IAAA+F,EAAUf,EAAWjG,IAAIQ,GACxBwG,IACDA,EAAU3D,EAAcC,GACb2C,EAAAlJ,IAAIyD,EAAIwG,IAEvB,MAAMjD,EAAYiD,IAClB,GAAIjD,EACO,OAAAA,EAAUR,OAAOnB,GAIjB,OAAAL,EAASK,EADFkB,EAAQR,OAAS,WAAa,SA1D/BmE,CAAWpC,KAAMuB,IAAM,GAC7B,MAAA,GAAGhE,KAAQJ,IAAO2E,QA6D5BnI,OAAO0I,eAAelH,IAAI,gBAC3BxB,OAAO0H,iBAAmBA,EACnB1H,OAAA0I,eAAe3J,OAAO,aAAc2I,IAG/C,MAAMiB,EACFC,YAAYhF,EAAMiF,GACdxC,KAAKzC,KAAOA,EACZyC,KAAKwC,OAASA,EAElBlE,WACU,MAAAmE,EAAMzC,KAAK0C,cACjB,GAAID,EACO,OAAAA,EAEN,CACK,MAAAE,EAAQ3C,KAAK4C,YACnB,OAAID,GAIO,MAAM3C,KAAK+B,gBAI9BW,cACU,MAAAG,GAAK,IAAIzD,MAAO0D,UAAY9C,KAAKzC,KAAKuF,UACtCC,EAAMC,KAAKC,MAAMJ,EAAK,KACtBK,EAAMF,KAAKC,MAAMF,EAAM,IACvBI,EAAKH,KAAKC,MAAMC,EAAM,IACtB7F,EAAM2F,KAAKC,MAAME,EAAK,IACxB,OAAAN,GAAM,GAAKxF,EAAM,GACV2C,KAAKoD,cAAcP,GAGnB,KAGfD,YACU,MAAAC,EAAK7C,KAAKzC,KAAKuF,WAAY,IAAI1D,MAAO0D,UACtCC,EAAMC,KAAKC,MAAMJ,EAAK,KACtBK,EAAMF,KAAKC,MAAMF,EAAM,IACvBI,EAAKH,KAAKC,MAAMC,EAAM,IACtB7F,EAAM2F,KAAKC,MAAME,EAAK,IACxB,OAAAN,GAAM,GAAKxF,EAAM,GACV2C,KAAKqD,YAGL,KAGfC,UACU,MAAAT,GAAK,IAAIzD,MAAO0D,UAAY9C,KAAKzC,KAAKuF,UACrC,OAAA9C,KAAKoD,cAAcP,GAE9BO,cAAcP,GACV,MAAME,EAAMC,KAAKC,MAAMJ,EAAK,KACtBK,EAAMF,KAAKC,MAAMF,EAAM,IACvBI,EAAKH,KAAKC,MAAMC,EAAM,IACtB7F,EAAM2F,KAAKC,MAAME,EAAK,IACtB1F,EAAQuF,KAAKC,MAAM5F,EAAM,IACzBM,EAAOqF,KAAKC,MAAMxF,EAAQ,IAChC,OAAIoF,EAAK,GAGAE,EAAM,GAFJQ,EAAmBvD,KAAKwC,OAAQ,EAAG,UAKrCO,EAAM,GACJQ,EAAmBvD,KAAKwC,QAASO,EAAK,UAExCA,EAAM,IAGNG,EAAM,GAFJK,EAAmBvD,KAAKwC,QAASU,EAAK,UAKxCA,EAAM,IAGNC,EAAK,GAFHI,EAAmBvD,KAAKwC,QAASW,EAAI,QAKvCA,EAAK,IAGL9F,EAAM,GAFJkG,EAAmBvD,KAAKwC,QAASnF,EAAK,OAKxCI,EAAQ,GACN8F,EAAmBvD,KAAKwC,QAAS/E,EAAO,SAGxC8F,EAAmBvD,KAAKwC,QAAS7E,EAAM,QAGtD6F,eACU,MAAAX,GAAK,IAAIzD,MAAO0D,UAAY9C,KAAKzC,KAAKuF,UACtCC,EAAMC,KAAKC,MAAMJ,EAAK,KACtBK,EAAMF,KAAKC,MAAMF,EAAM,IACvBI,EAAKH,KAAKC,MAAMC,EAAM,IACtB7F,EAAM2F,KAAKC,MAAME,EAAK,IACtB1F,EAAQuF,KAAKC,MAAM5F,EAAM,IACzBM,EAAOqF,KAAKC,MAAMxF,EAAQ,IAChC,OAAIyF,EAAM,EACC,KAEFA,EAAM,GACJ,GAAGA,KAELC,EAAK,GACH,GAAGA,KAEL9F,EAAM,IACJ,GAAGA,KAGH,GAAGM,KAGlB0F,YACU,MAAAR,EAAK7C,KAAKzC,KAAKuF,WAAY,IAAI1D,MAAO0D,UACrC,OAAA9C,KAAKyD,gBAAgBZ,GAEhCY,gBAAgBZ,GACZ,MAAME,EAAMC,KAAKC,MAAMJ,EAAK,KACtBK,EAAMF,KAAKC,MAAMF,EAAM,IACvBI,EAAKH,KAAKC,MAAMC,EAAM,IACtB7F,EAAM2F,KAAKC,MAAME,EAAK,IACtB1F,EAAQuF,KAAKC,MAAM5F,EAAM,IACzBM,EAAOqF,KAAKC,MAAMxF,EAAQ,IAChC,OAAIA,GAAS,IAGJA,GAAS,GAFP8F,EAAmBvD,KAAKwC,OAAQ7E,EAAM,QAKxCN,GAAO,IAGPA,GAAO,GAFLkG,EAAmBvD,KAAKwC,OAAQ/E,EAAO,SAKzC0F,GAAM,IAGNA,GAAM,GAFJI,EAAmBvD,KAAKwC,OAAQnF,EAAK,OAKvC6F,GAAO,IAGPA,GAAO,GAFLK,EAAmBvD,KAAKwC,OAAQW,EAAI,QAKtCJ,GAAO,IAGPA,GAAO,GAFLQ,EAAmBvD,KAAKwC,OAAQU,EAAK,UAMrCK,EAAmBvD,KAAKwC,OAD1BO,GAAO,GAC2BA,EAGA,EAHK,UAMpDW,iBACU,MAAAb,EAAK7C,KAAKzC,KAAKuF,WAAY,IAAI1D,MAAO0D,UACtCC,EAAMC,KAAKC,MAAMJ,EAAK,KACtBK,EAAMF,KAAKC,MAAMF,EAAM,IACvBI,EAAKH,KAAKC,MAAMC,EAAM,IACtB7F,EAAM2F,KAAKC,MAAME,EAAK,IACtB1F,EAAQuF,KAAKC,MAAM5F,EAAM,IACzBM,EAAOqF,KAAKC,MAAMxF,EAAQ,IAChC,OAAIJ,GAAO,IACA,GAAGM,KAELwF,GAAM,GACJ,GAAG9F,KAEL6F,GAAO,GACL,GAAGC,KAELD,EAAM,EACJ,GAAGA,KAGH,KAGfnB,aACQ,IAAArD,EAASO,IAAe,QAAU,QA3X9C,IAAoB1B,EA+XL,OA/XKA,EA4XIyC,KAAKzC,MA3Xb,IAAI6B,MACLuE,mBAAqBpG,EAAKoG,mBA2XnBjF,GA3YtB,WACI,GAAsB,OAAlBW,EACO,OAAAA,EAEX,MAAMH,EAAYI,IAClB,GAAIJ,EAAW,CACX,MAAMC,EAASD,EAAUR,OAAO,IAAIU,KAAK,IAElC,OADPC,IAAkBF,EAAOd,MAAM,OACxBgB,EAGA,OAAA,EAgYOuE,GAAoB,OAAS,OAEpC1G,EAAS8C,KAAKzC,KAAMmB,GAE/B0D,aACI,MAAMlD,EAAY2E,IAClB,OAAI3E,EACOA,EAAUR,OAAOsB,KAAKzC,MAGtBL,EAAS8C,KAAKzC,KAAM,YAIvC,SAASgG,EAAmBf,EAAQtI,EAAO4J,GACvC,MAAM5E,EAxYV,SAA4BsD,EAAQ/D,GAChC,GAAI,SAAU9E,QAAU,uBAAwBA,OAAOgF,KAC/C,IACA,OAAO,IAAIA,KAAKoF,mBAAmBvB,EAAQ/D,SAExCI,GACC,KAAEA,aAAaC,YACT,MAAAD,GAiYAmF,CAAmBxB,EAAQ,CAAEZ,QAAS,SACxD,OAAI1C,EACOA,EAAUR,OAAOxE,EAAO4J,GAMvC,SAA8B5J,EAAO4J,GACjC,GAAc,IAAV5J,EACQ,OAAA4J,GACC,IAAA,OACA,IAAA,UACA,IAAA,QACA,IAAA,OACD,MAAO,QAAQA,IACd,IAAA,MACM,MAAA,QACN,IAAA,OACA,IAAA,SACD,MAAO,QAAQA,KACd,IAAA,SACM,MAAA,WAElB,GACkB,IAAV5J,EACG,OAAA4J,GACC,IAAA,OACA,IAAA,UACA,IAAA,QACA,IAAA,OACD,MAAO,QAAQA,IACd,IAAA,MACM,MAAA,WACN,IAAA,OACA,IAAA,SACA,IAAA,SACD,MAAO,QAAQA,SAE1B,IACsB,IAAd5J,EACG,OAAA4J,GACC,IAAA,OACA,IAAA,UACA,IAAA,QACA,IAAA,OACD,MAAO,QAAQA,IACd,IAAA,MACM,MAAA,YACN,IAAA,OACA,IAAA,SACA,IAAA,SACD,MAAO,KAAKA,aAEvB,GACQ5J,EAAQ,EACL,OAAA4J,GACC,IAAA,OACA,IAAA,UACA,IAAA,QACA,IAAA,OACA,IAAA,MACA,IAAA,OACA,IAAA,SACA,IAAA,SACD,MAAO,MAAM5J,KAAS4J,UAEjC,GACQ5J,GAAY,EACT,OAAA4J,GACC,IAAA,OACA,IAAA,UACA,IAAA,QACA,IAAA,OACA,IAAA,MACA,IAAA,OACA,IAAA,SACA,IAAA,SACM,MAAA,IAAI5J,KAAS4J,SAG1B,MAAA,IAAIhF,WAAW,uCAAuCgF,MA5EjDG,CAAqB/J,EAAO4J,GA8E3C,MAAMD,EAAgBrF,EAAc,CAAEX,KAAM,UAAWE,OAAQ,YAE/D,MAAMmG,UAA4BrE,EAC9BQ,mBACI,MAAM9C,EAAOyC,KAAKzC,KAClB,GAAKA,EAEL,OAAO,IAAI+E,EAAa/E,EAAMgC,EAAkBS,OAAO1B,WAE3DyB,oBACIoE,EAAY3J,KAAKwF,MACZoE,QAEDA,EAAsBzK,OAAO0K,YAAYC,EAAmB,MAEhEhD,MAAMvB,oBAEVwE,uBACU,MAAAC,EAAKL,EAAYM,QAAQzE,OAChB,IAAXwE,GACYL,EAAAO,OAAOF,EAAI,GAEtBL,EAAY/H,QACTgI,IACAO,cAAcP,GACQA,EAAA,OAKtC,MAAMD,EAAc,GACpB,IAAIC,EACJ,SAASE,IACL,IAAInH,EAAMyH,EAAGC,EACb,IAAKD,EAAI,EAAGC,EAAMV,EAAY/H,OAAQwI,EAAIC,EAAKD,IAC3CzH,EAAOgH,EAAYS,GACdzH,EAAAmD,YAAcnD,EAAKkD,oBAAsB,GAGjD1G,OAAO0I,eAAelH,IAAI,mBAC3BxB,OAAOuK,oBAAsBA,EACtBvK,OAAA0I,eAAe3J,OAAO,gBAAiBwL,IAGlD,MAAMY,UAAuBZ,EACzB7D,mBACU,MAAA3B,EAASsB,KAAKzD,aAAa,UAC3BgB,EAAOyC,KAAKzC,KAClB,GAAKA,EAEL,MAAe,UAAXmB,EACO,IAAI4D,EAAa/E,EAAMgC,EAAkBS,OAAOwD,eAGhD,IAAIlB,EAAa/E,EAAMgC,EAAkBS,OAAOsD,WAI9D3J,OAAO0I,eAAelH,IAAI,cAC3BxB,OAAOmL,eAAiBA,EACjBnL,OAAA0I,eAAe3J,OAAO,WAAYoM,IAG7C,MAAMC,UAAyBb,EAC3B7D,mBACU,MAAA3B,EAASsB,KAAKzD,aAAa,UAC3BgB,EAAOyC,KAAKzC,KAClB,GAAKA,EAEL,MAAe,UAAXmB,EACO,IAAI4D,EAAa/E,EAAMgC,EAAkBS,OAAO0D,iBAGhD,IAAIpB,EAAa/E,EAAMgC,EAAkBS,OAAOqD,aAI9D1J,OAAO0I,eAAelH,IAAI,gBAC3BxB,OAAOoL,iBAAmBA,EACnBpL,OAAA0I,eAAe3J,OAAO,aAAcqM,IC/qB/C,MAAMC,EAAoC,CACxC1L,IAAI,EACJc,IAAK,GACL6K,KAAMC,EACNC,QAAS,GACTC,UAAW,GACXC,MAAM,EACN,CAACpN,EAAMkC,SAAU,CACfmL,MAAO,IACPC,QAAS,IACTrN,IAAK,CAACoB,EAAIkM,IAAWA,EACrBC,KAAKC,GACIvK,EAAI,iBAAkBuK,KAe5B,SAASC,IACd,OAAO/K,EAAK,mCAAmCrC,MAAK,KAClDN,EAAMuD,MAAM,CAACwJ,IAAe,MC/BhC,SAASY,EAAY5N,GACnBA,EAAK6N,MAAQ,EAKAnN,EAAoC,CACjDC,IAAK,iCACLkN,KAAM,EACNC,MAAO,EAAGD,KAAAA,MACR,MAAME,EAA2B,GAEjC,IAAA,IAASnB,EAAI,EAAGA,GAAKiB,EAAMjB,GAAK,EAAG,CAC3B,MAAAoB,EAAgB/N,EAAMkD,IAAI,CAAC6J,GAAe,CAAEa,KAAMjB,IACxDmB,EAAOvL,KAAKwL,GAGP,OAAAD,GAETE,SAAU,EAAGH,MAAAA,KAfE,KAeUA,EAAMA,EAAM1J,OAAS,GAAGA,OACjDL,IAAK,EAAG+J,MAAAA,KACNA,EAAMpK,MACHsK,GACC/N,EAAMsB,MAAMyM,IAAkBA,EAActK,MAAMwK,IAAOA,EAAEb,SAEjExM,OAAQ,EAAGiN,MAAAA,EAAOG,SAAAA,EAAUlK,IAAAA,KAAUjD,CAAA;8BACViD;;;;;YAKlBA,GACFjD,CAAA;;;;;uBAKa6M;;;;YAIXG,EAAMK,KACLN,GACC5N,EAAMsB,MAAMsM,IACZA,EAAKM,KACFC,GAAiBtN,CAAA;;;gCAGFsN,EAAaf,MACxB,KD5Bd,SAAoBe,GAKzB,OAJAxL,EAAK,kCAAmC,KAAMwL,EAAa9M,IAAI+M,OAAM,KACnEpO,EAAMC,IAAIkO,EAAc,CAAEf,MAAM,OAG3BpN,EAAMC,IAAIkO,EAAc,CAAEf,MAAM,ICuBdiB,CAAWF;;;yBAGbA,EAAaf,MAAQvM,CAAA;;+BAEfsN,EAAanB,KAAKsB;;;4CAGLH,EAAajB;;;;;;;oCAOrBiB,EAAahB;;;;;YAOrCa,GACFnN,CAAA;;;uBAGa8M;;;;;;IAMnB7M,GAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QCtFWL,EAAyB,CACtC8N,IAAK,GACLC,KAAM,GACNC,QAAQ,EACR/N,IAAK,sBACLgO,QAAQ,EACR9N,OAAQ,EAAG2N,IAAAA,EAAKE,OAAAA,KAAa5N,CAAA;;;;;;0BAML0N;;;qDAG2BI;;cAEvCF,EAAS,SAAW;;;;;;;;;qBASbG,EAAY;;;;;qBAKZA,EAAY;;;;;kCAKCJ,aAAaD;;;;;qBAK1BK,EAAY;;;;;qBAKZA,EAAY;;;;;qBAKZA,EAAY;;;;;;IAM7B9N,GAAA;;;;;;;;;;;;MCxDWL,EAA4B,CACzCC,IAAK,yBACL8N,KAAM,GACND,IAAK,GACL3N,OAAQ,EAAG2N,IAAAA,MAAWM,EAClBhO,CAAsD,kDAAAiO;;kCAGtDjO,CAAA;;;;;mEAK6D0N;;;SAI/DzN,GAAA;;;;;;;;;;;;MCjBWL,EAA6B,CAC1CC,IAAK,0BACLqO,KAAM,GACNC,SAAU,GACV9N,KAAM,GACNN,OAAQ,EAAGmO,KAAAA,EAAMC,SAAAA,EAAU9N,KAAAA,KAAWL,CAAA;;;;;cAK1BK;;;;6BAIe6N;YACjBC,GACFnO,CAAA;;;;;;cAMImO;;;;;;IAMVlO,GAAA;;;;;;;;;;;;;;;;;;;MC9BWL,EAAqB,CAClCC,IAAK,iBACLuO,OAAQ,GACRrO,OAAQ,EAAGqO,OAAAA,KAAapO,CAAA;wBACFoO;;IAEpBnO,GAAA;;;;;;;;;MCHWL,EAAmB,CAChCC,IAAK,uBACLwO,KAAM,SACNC,iBAAkB,WAClBC,kBAAmB,YACnBC,kBAAmB,OACnBzO,OAAQ,EAAGsO,KAAAA,EAAMC,iBAAAA,EAAkBC,kBAAAA,EAAmBC,kBAAAA,KAAwBxO,CAAA;qDAC3BqO;;;;;0BAK3BC;;;;;;;;0BAQAC;;;;IAItBtO,GAAA;;;;;;;;;;;mBAWeuO;;;MCjCJ5O,EAA6B,CAC1CC,IAAK,qBACL4O,QAAS,GACTC,aAAcvP,EAAM,CAACwP,GAAM,CAAEnO,GAAI,KAAA,CAASoO,UAAU,MACpDvC,QAAS,EAAGoC,QAAAA,EAASC,aAAAA,KAAmB1O,CAAA;;;UAGhCyO;;;;;;;;;;MAUJtP,EAAMsB,MAAMiO,MACZA,EAAapL,QAAUtD,CAAA;;;YAGjB0O,EAAarB,KAAKwB,GAAgB7O,CAAA;;sBAExB6O,EAAYlB;;;sBAGZmB,EAAOpB,IAAIqB,EAAS,CAAEC,UAAWH"}