@frigade/react 1.38.11 → 2.0.0-alpha

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/FrigadeProvider/index.tsx","../src/components/DataFetcher/index.tsx","../src/api/flows.ts","../src/api/common.ts","../src/api/version.ts","../src/api/flow-responses.ts","../src/api/user-flow-states.ts","../src/api/flow-opens.ts","../src/shared/deepmerge.ts","../src/shared/parse.ts","../src/shared/completion-util.ts","../src/api/users.tsx","../src/FrigadeForm/index.tsx","../src/components/Modal/index.tsx","../src/components/Modal/ModalBackground.tsx","../src/shared/appearance.ts","../src/components/Icons/Close.tsx","../src/components/branding/PoweredByFrigade.tsx","../src/components/Icons/FrigadeLogo.tsx","../src/components/branding/styled.ts","../src/components/Tooltips/styled.ts","../src/components/CornerModal/index.tsx","../src/hooks/useTheme.ts","../src/components/Forms/MultiInputStepType/MultiInputStepType.tsx","../src/components/Forms/MultiInputStepType/form-components/TextField/index.tsx","../src/components/Forms/MultiInputStepType/form-components/shared/styled.tsx","../src/components/Forms/MultiInputStepType/form-components/shared/Label.tsx","../src/types/index.tsx","../src/components/Forms/MultiInputStepType/form-components/shared/SubLabel.tsx","../src/components/Forms/MultiInputStepType/form-components/shared/validation.ts","../src/components/Forms/MultiInputStepType/form-components/MultipleChoice/index.tsx","../src/components/Forms/MultiInputStepType/form-components/MultipleChoiceList/index.tsx","../src/components/CheckBox/index.tsx","../src/components/Progress/ProgressRing/ProgressRing.tsx","../src/components/TitleSubtitle/TitleSubtitle.tsx","../src/shared/sanitizer.ts","../src/components/Icons/Warning.tsx","../src/FrigadeForm/styled.ts","../src/FrigadeForm/FormFooter.tsx","../src/components/Button/index.tsx","../src/components/Spinner/index.tsx","../src/FrigadeForm/FormPagination.tsx","../src/components/Forms/LinkCollectionStepType/index.tsx","../src/hooks/useCTAClickSideEffects.ts","../src/components/Forms/CallToActionStepType/CallToActionStepType.tsx","../src/components/Icons/Play.tsx","../src/components/Video/VideoCard.tsx","../src/components/Forms/SelectListStepType/SelectListStepType.tsx","../src/components/Forms/SelectListStepType/styled.ts","../src/FrigadeForm/FormContent.tsx","../src/components/RenderInlineStyles.tsx","../src/hooks/useFlowImpressions.ts","../src/api/organizations.tsx","../src/shared/appearanceToOverrides.ts","../src/components/Button/Button.styles.ts","../src/components/Box/index.tsx","../src/components/Text/Text.styles.ts","../src/shared/theme.ts","../src/components/HeroChecklist/index.tsx","../src/FrigadeChecklist/index.tsx","../src/components/Checklists/HeroChecklist/HeroChecklist.tsx","../src/components/Checklists/HeroChecklist/StepChecklistItem.tsx","../src/components/CheckBoxRow/index.tsx","../src/components/Checklists/HeroChecklist/styled.ts","../src/components/Checklists/Checklist/ProgressBar.tsx","../src/components/Checklists/Checklist/styled.ts","../src/components/checklist-step-content/HeroStepContent.tsx","../src/components/checklist-step-content/shared/TitleSubtitleWithCTA.tsx","../src/components/checklist-step-content/shared/TitleSubtitle.tsx","../src/components/checklist-step-content/shared/CTA.tsx","../src/components/Video/VideoPlayer.tsx","../src/components/checklist-step-content/VideoCarousel.tsx","../src/components/checklist-step-content/CodeSnippetContent.tsx","../src/components/Checklists/ChecklistWithGuide/ChecklistWithGuide.tsx","../src/components/Icons/Chevron.tsx","../src/components/Checklists/ChecklistWithGuide/styled.ts","../src/components/styled.ts","../src/components/Guides/Guide.tsx","../src/components/Guides/styled.ts","../src/components/Checklists/CondensedChecklist/CondensedChecklist.tsx","../src/components/Checklists/CondensedChecklist/CollapsibleStep/index.tsx","../src/components/Checklists/CondensedChecklist/CollapsibleStep/styled.ts","../src/components/Checklists/CondensedChecklist/styled.ts","../src/components/Checklists/CarouselChecklist/index.tsx","../src/hooks/useMediaQuery.ts","../src/components/Checklists/CarouselChecklist/CarouselCard.tsx","../src/components/Checklists/CarouselChecklist/styled.ts","../src/FrigadeProgressBadge/index.tsx","../src/components/Checklists/MiniProgressBadge/index.tsx","../src/components/Checklists/MiniProgressBadge/styled.ts","../src/components/Checklists/FullWidthProgressBadge/index.tsx","../src/components/Checklists/FullWidthProgressBadge/styled.ts","../src/FrigadeGuide/FrigadeGuide.tsx","../src/FrigadeTour/index.tsx","../src/components/Tooltips/Tooltips.tsx","../src/components/Tooltips/position.ts","../src/hooks/useDebug.ts","../src/FrigadeSupportWidget/index.tsx","../src/FrigadeSupportWidget/styled.ts","../src/components/Icons/Question.tsx","../src/components/Icons/QuestionCircle.tsx","../src/FrigadeEmbeddedTip/index.tsx","../src/FrigadeEmbeddedTip/styled.ts","../src/FrigadeAnnouncement/styled.ts","../src/components/Media/index.tsx","../src/FrigadeBanner/index.tsx","../src/FrigadeBanner/styled.ts","../src/components/Icons/Info.tsx","../src/FrigadeNPSSurvey/index.tsx","../src/FrigadeNPSSurvey/styled.ts","../src/FrigadeAnnouncement/index.tsx","../src/components/Button/TEMP_index.tsx","../src/components/Text/index.tsx"],"sourcesContent":["import React, { createContext, FC, useEffect, useState } from 'react'\nimport { ThemeProvider } from 'styled-components'\nimport { DataFetcher, guestUserIdField, realUserIdField } from '../components/DataFetcher'\nimport { Flow } from '../api/flows'\nimport { FlowResponse } from '../api/flow-responses'\nimport { Appearance, DefaultAppearance } from '../types'\nimport { deepmerge } from '../shared/deepmerge'\nimport { appearanceToOverrides } from '../shared/appearanceToOverrides'\n\nimport { tokens } from '../shared/theme'\n\nexport interface IFrigadeContext {\n publicApiKey: string\n userId?: string | null\n setUserId: React.Dispatch<React.SetStateAction<string | null>>\n flows: Flow[]\n setFlows: React.Dispatch<React.SetStateAction<Flow[]>>\n failedFlowResponses: FlowResponse[]\n setFailedFlowResponses: React.Dispatch<React.SetStateAction<FlowResponse[]>>\n flowResponses?: FlowResponse[]\n setFlowResponses?: React.Dispatch<React.SetStateAction<FlowResponse[]>>\n children?: React.ReactNode\n userProperties?: { [key: string]: string | boolean | number | null }\n setUserProperties?: React.Dispatch<\n React.SetStateAction<{ [key: string]: string | boolean | number | null }>\n >\n openFlowStates: { [key: string]: boolean }\n setOpenFlowStates: React.Dispatch<React.SetStateAction<{ [key: string]: boolean }>>\n completedFlowsToKeepOpenDuringSession: string[]\n setCompletedFlowsToKeepOpenDuringSession: React.Dispatch<React.SetStateAction<string[]>>\n customVariables?: { [key: string]: string | boolean | number | null }\n setCustomVariables?: React.Dispatch<\n React.SetStateAction<{ [key: string]: string | boolean | number | null }>\n >\n isNewGuestUser: boolean\n setIsNewGuestUser: React.Dispatch<React.SetStateAction<boolean>>\n hasActiveFullPageFlow: boolean\n setHasActiveFullPageFlow: React.Dispatch<React.SetStateAction<boolean>>\n organizationId?: string\n setOrganizationId?: React.Dispatch<React.SetStateAction<string | null>>\n navigate: (url: string, target: string) => void\n defaultAppearance: Appearance\n shouldGracefullyDegrade: boolean\n setShouldGracefullyDegrade: React.Dispatch<React.SetStateAction<boolean>>\n apiUrl: string\n readonly: boolean\n debug: boolean\n flowDataOverrides?: { [key: string]: string }\n}\n\nexport interface FrigadeProviderProps {\n publicApiKey: string\n /**\n * The user id of the user that is currently logged in.\n */\n userId?: string\n /**\n * The organization id of the organization that is currently logged in.\n */\n organizationId?: string\n config?: FrigadeConfig\n children?: React.ReactNode\n}\n\nconst DEFAULT_API_URL = 'https://api.frigade.com'\nexport const FrigadeContext = createContext<IFrigadeContext>({\n publicApiKey: '',\n setUserId: () => {},\n flows: [],\n setFlows: () => {},\n failedFlowResponses: [],\n setFailedFlowResponses: () => {},\n flowResponses: [],\n setFlowResponses: () => {},\n userProperties: {},\n setUserProperties: () => {},\n openFlowStates: {},\n setOpenFlowStates: () => {},\n completedFlowsToKeepOpenDuringSession: [],\n setCompletedFlowsToKeepOpenDuringSession: () => {},\n customVariables: {},\n setCustomVariables: () => {},\n isNewGuestUser: false,\n setIsNewGuestUser: () => {},\n hasActiveFullPageFlow: false,\n setHasActiveFullPageFlow: () => {},\n organizationId: '',\n setOrganizationId: () => {},\n navigate: () => {},\n defaultAppearance: DefaultAppearance,\n shouldGracefullyDegrade: false,\n setShouldGracefullyDegrade: () => {},\n apiUrl: DEFAULT_API_URL,\n readonly: false,\n debug: false,\n})\n\ninterface FrigadeConfig {\n /**\n * Override the default router used by Frigade.\n * This is useful if you are using a router and want to avoid doing a full page refresh on navigation.\n * @param url The url to navigate to.\n */\n navigate?: (url: string, target: string) => void\n /**\n * Default Appearance for all flows.\n */\n defaultAppearance?: Appearance\n /**\n * API url to use for all requests. Defaults to https://api.frigade.com\n */\n apiUrl?: string\n /**\n * When true, Frigade will be in read-only mode and state will not be updated. Default false.\n * Used mostly for demo purposes.\n */\n readonly?: boolean\n\n theme?: Record<string, any>\n /**\n * Flag to turn on debug mode which will log all events to the console. Default false.\n * Default false.\n */\n debug?: boolean\n\n /**\n * @ignore\n */\n __internal__?: { [key: string]: string }\n}\n\nfunction clearLocalStorage() {\n Object.keys(localStorage).forEach((key) => {\n if (key.startsWith('frigade-')) {\n localStorage.removeItem(key)\n }\n })\n}\n\nexport const FrigadeProvider: FC<FrigadeProviderProps> = ({\n publicApiKey,\n userId,\n organizationId,\n config,\n children,\n}) => {\n const guestId = typeof window !== 'undefined' ? localStorage.getItem(guestUserIdField) : null\n const [userIdValue, setUserIdValue] = useState<string | null>(!userId ? guestId : userId)\n const [organizationIdValue, setOrganizationIdValue] = useState<string | null>(\n !organizationId ? null : organizationId\n )\n const [flows, setFlows] = useState<Flow[]>([])\n const [failedFlowResponses, setFailedFlowResponses] = useState<FlowResponse[]>([])\n const [flowResponses, setFlowResponses] = useState<FlowResponse[]>([])\n const [userProperties, setUserProperties] = useState<{\n [key: string]: string | boolean | number | null\n }>({})\n const [openFlowStates, setOpenFlowStates] = useState<{ [key: string]: boolean }>({})\n const [completedFlowsToKeepOpenDuringSession, setCompletedFlowsToKeepOpenDuringSession] =\n useState<string[]>([])\n const [customVariables, setCustomVariables] = useState<{\n [key: string]: string | boolean | number | null\n }>({})\n const [isNewGuestUser, setIsNewGuestUser] = useState(false)\n const [hasActiveFullPageFlow, setHasActiveFullPageFlow] = useState(false)\n const [shouldGracefullyDegrade, setShouldGracefullyDegrade] = useState(\n !isValidApiKey(publicApiKey)\n )\n const internalNavigate = (url: string, target: string) => {\n if (target === '_blank') {\n window.open(url, '_blank')\n return\n }\n setTimeout(() => {\n window.location.href = url\n }, 50)\n }\n\n const appearance: Appearance = {\n theme: { ...DefaultAppearance.theme, ...(config?.defaultAppearance?.theme ?? {}) },\n styleOverrides: {\n ...DefaultAppearance.styleOverrides,\n ...(config?.defaultAppearance?.styleOverrides ?? {}),\n },\n }\n\n function isValidApiKey(apiKey: string): boolean {\n return Boolean(apiKey && apiKey.length > 10 && apiKey.substring(0, 10) === 'api_public')\n }\n\n useEffect(() => {\n if (userId) {\n setUserIdValue(userId)\n }\n }, [userId])\n\n useEffect(() => {\n if (userIdValue) {\n if (\n typeof window !== 'undefined' &&\n window.localStorage &&\n window.localStorage.getItem(realUserIdField)\n ) {\n if (window.localStorage.getItem(realUserIdField) !== userIdValue) {\n clearLocalStorage()\n }\n }\n }\n }, [userIdValue])\n\n useEffect(() => {\n if (organizationId) {\n setOrganizationIdValue(organizationId)\n }\n }, [organizationId])\n\n useEffect(() => {\n if (!isValidApiKey(publicApiKey)) {\n console.error(\n 'Frigade SDK failed to initialize. API key provided is either missing or valid.'\n )\n setShouldGracefullyDegrade(true)\n return\n } else {\n setShouldGracefullyDegrade(false)\n }\n }, [publicApiKey, setShouldGracefullyDegrade])\n\n const contextParams = {\n publicApiKey,\n userId: userIdValue,\n setUserId: setUserIdValue,\n setFlows,\n flows: flows,\n failedFlowResponses,\n setFailedFlowResponses,\n flowResponses,\n setFlowResponses,\n userProperties,\n setUserProperties,\n openFlowStates,\n setOpenFlowStates,\n completedFlowsToKeepOpenDuringSession,\n setCompletedFlowsToKeepOpenDuringSession,\n customVariables,\n setCustomVariables,\n isNewGuestUser,\n setIsNewGuestUser,\n hasActiveFullPageFlow,\n setHasActiveFullPageFlow,\n organizationId: organizationIdValue,\n setOrganizationId: setOrganizationIdValue,\n navigate: config && config.navigate ? config.navigate : internalNavigate,\n defaultAppearance: appearance,\n shouldGracefullyDegrade,\n setShouldGracefullyDegrade,\n apiUrl: config && config.apiUrl ? config.apiUrl : DEFAULT_API_URL,\n readonly: config && config.readonly ? config.readonly : false,\n debug: config && config.debug ? config.debug : false,\n flowDataOverrides: config && config.__internal__ ? config.__internal__ : undefined,\n } as IFrigadeContext\n\n // Forward-port appearance.theme into theme tokens\n const { overrides } = appearanceToOverrides(appearance)\n\n if (shouldGracefullyDegrade) {\n return (\n <FrigadeContext.Provider value={contextParams}>\n <ThemeProvider\n theme={deepmerge(appearance.theme, tokens, overrides ?? {}, config?.theme ?? {})}\n >\n {children}\n </ThemeProvider>\n </FrigadeContext.Provider>\n )\n }\n\n return (\n <FrigadeContext.Provider value={contextParams}>\n {/* TEMP: Merge old appearance.theme vars in for backwards compatibility */}\n <ThemeProvider\n theme={deepmerge(appearance.theme, tokens, overrides ?? {}, config?.theme ?? {})}\n >\n {children}\n <DataFetcher />\n </ThemeProvider>\n </FrigadeContext.Provider>\n )\n}\n","import React, { FC, useContext, useEffect, useState } from 'react'\nimport { Flow, FlowType, TriggerType, useFlows } from '../../api/flows'\nimport { FrigadeContext } from '../../FrigadeProvider'\nimport { GUEST_PREFIX, useUser } from '../../api/users'\nimport { v4 as uuidv4 } from 'uuid'\nimport { useFlowResponses } from '../../api/flow-responses'\nimport { useUserFlowStates } from '../../api/user-flow-states'\nimport FrigadeForm from '../../FrigadeForm'\nimport { NOT_STARTED_FLOW } from '../../api/common'\nimport { useOrganization } from '../../api/organizations'\n\ninterface DataFetcherProps {}\n\nexport const guestUserIdField = 'frigade-xFrigade_guestUserId'\nexport const realUserIdField = 'frigade-xFrigade_userId'\n\nexport const DataFetcher: FC<DataFetcherProps> = ({}) => {\n const { setFlowResponses } = useFlowResponses()\n const { userFlowStatesData, isLoadingUserFlowStateData, mutateUserFlowState } =\n useUserFlowStates()\n const { userId, setUserId } = useUser()\n const [lastUserId, setLastUserId] = useState<string | null>(userId)\n const { getFlowStatus } = useFlows()\n const { flows, userProperties, setIsNewGuestUser, flowResponses } = useContext(FrigadeContext)\n const [automaticFlowIdsToTrigger, setAutomaticFlowIdsToTrigger] = useState<Flow[]>([])\n // Add list of flows already triggered\n const [triggeredFlows, setTriggeredFlows] = useState<string[]>([])\n const { organizationId } = useOrganization()\n const [lastOrganizationId, setLastOrganizationId] = useState<string | null>(organizationId)\n const [hasFinishedInitialLoad, setHasFinishedInitialLoad] = useState(false)\n\n useEffect(() => {\n if (!isLoadingUserFlowStateData) {\n if (userFlowStatesData) {\n for (let i = 0; i < userFlowStatesData.length; i++) {\n const flowState = userFlowStatesData[i]\n const flow = flows.find((flow) => flow.slug === flowState?.flowId)\n if (\n flow &&\n flowState &&\n flowState.shouldTrigger === true &&\n flow.type == FlowType.FORM &&\n flow.triggerType === TriggerType.AUTOMATIC &&\n !triggeredFlows.includes(flow.slug)\n ) {\n // If the flow should be triggered, trigger it\n // Give a small grace period before triggering the flow\n setTimeout(() => {\n triggerFlow(flowState.flowId)\n }, 500)\n\n // We only want to trigger one at a time\n break\n }\n }\n }\n }\n }, [isLoadingUserFlowStateData, userFlowStatesData])\n\n useEffect(() => {\n if (flowResponses.length > 0) {\n mutateUserFlowState()\n }\n }, [flowResponses])\n\n useEffect(() => {\n if (!hasFinishedInitialLoad) {\n setHasFinishedInitialLoad(true)\n mutateUserFlowState()\n }\n }, [isLoadingUserFlowStateData, setHasFinishedInitialLoad])\n\n function triggerFlow(flowId: string) {\n const flow = flows.find((flow) => flow.slug === flowId)\n if (flow && flow.triggerType === TriggerType.AUTOMATIC && !triggeredFlows.includes(flow.slug)) {\n // We only trigger one at a time\n setTriggeredFlows([...triggeredFlows, flow.slug])\n setAutomaticFlowIdsToTrigger([flow])\n }\n }\n\n function generateGuestUserId() {\n // If userId is null, generate a guest user id using uuid\n if (!userId) {\n // Check if a real user id exists in local storage\n const realUserId = localStorage.getItem(realUserIdField)\n if (realUserId) {\n setUserId(realUserId)\n return\n }\n\n // Call local storage to see if we already have a guest user id\n const guestUserId = localStorage.getItem(guestUserIdField)\n if (guestUserId) {\n setUserId(guestUserId)\n return\n }\n\n // If we don't have a guest user id, generate one and save it to local storage\n setIsNewGuestUser(true)\n const newGuestUserId = GUEST_PREFIX + uuidv4()\n try {\n localStorage.setItem(guestUserIdField, newGuestUserId)\n } catch (e) {\n console.log('Failed to save guest user id locally: Local storage unavailable', e)\n }\n setUserId((userId) => (userId ? userId : newGuestUserId))\n }\n }\n\n useEffect(() => {\n try {\n // Parse all image urls from flows (contained in flow.data) and asynchronously load them\n if (flows) {\n const loadedImageUrls: string[] = []\n flows.forEach((flow) => {\n if (flow.data) {\n // Find all image urls in flow data. All image urls are in the json data as \"imageUri\" fields\n const imageUrls = flow.data.match(/\"imageUri\":\"(.*?)\"/g)\n if (imageUrls) {\n imageUrls.forEach((imageUrl) => {\n // Remove the \"imageUri\" and \" from the url\n const url = imageUrl.replace('\"imageUri\":\"', '').replace('\"', '')\n // If the url has already been loaded, skip it\n if (loadedImageUrls.includes(url)) {\n return\n }\n // Create an image element and set the src to the url\n const img = new Image()\n img.src = url\n loadedImageUrls.push(url)\n })\n }\n }\n })\n }\n } catch (e) {}\n }, [flows])\n\n useEffect(() => {\n if (userId !== lastUserId) {\n // Reset responses\n setFlowResponses([])\n mutateUserFlowState()\n }\n\n setLastUserId(userId)\n // if user id isn't null and doesn't begin with GUEST_PREFIX , save it to local storage\n if (userId && !userId.startsWith(GUEST_PREFIX)) {\n try {\n localStorage.setItem(realUserIdField, userId)\n } catch (e) {\n console.log('Failed to save user id locally: Local storage available', e)\n }\n }\n // If the user ID is null, give a grace period of 50ms to set the real user id\n if (userId === null) {\n setTimeout(() => {\n if (userId === null) {\n generateGuestUserId()\n }\n }, 50)\n }\n }, [userId, flows, userProperties])\n\n useEffect(() => {\n if (organizationId != lastOrganizationId) {\n setLastOrganizationId(organizationId)\n setFlowResponses([])\n mutateUserFlowState()\n }\n }, [organizationId, lastOrganizationId, setLastOrganizationId])\n\n function AutomaticFlowIdsToTrigger() {\n return (\n <>\n {automaticFlowIdsToTrigger.map((flow) => {\n if (getFlowStatus(flow.slug) !== NOT_STARTED_FLOW) {\n return null\n }\n\n return (\n <span key={flow.slug}>\n <FrigadeForm\n flowId={flow.slug}\n type={'modal'}\n modalPosition={'center'}\n endFlowOnDismiss={true}\n />\n </span>\n )\n })}\n </>\n )\n }\n\n return (\n <>\n <AutomaticFlowIdsToTrigger />\n </>\n )\n}\n","import { useCallback, useContext, useEffect } from 'react'\nimport {\n COMPLETED_FLOW,\n COMPLETED_STEP,\n NOT_STARTED_FLOW,\n NOT_STARTED_STEP,\n SKIPPED_FLOW,\n STARTED_FLOW,\n STARTED_STEP,\n StepActionType,\n useCheckHasInitiatedAPI,\n useConfig,\n} from './common'\n\nimport { FrigadeContext } from '../FrigadeProvider'\nimport { FlowResponse, useFlowResponses } from './flow-responses'\nimport useSWR from 'swr'\nimport { useUserFlowStates } from './user-flow-states'\nimport { StepData } from '../types'\nimport { getSubFlowFromCompletionCriteria } from '../shared/completion-util'\nimport { safeParse } from '../shared/parse'\n\nexport interface Flow {\n id: number\n name: string\n description: string\n data: string\n createdAt: string\n modifiedAt: string\n slug: string\n type: FlowType\n triggerType: TriggerType\n targetingLogic?: string\n active: boolean\n}\n\nexport enum FlowType {\n CHECKLIST = 'CHECKLIST',\n FORM = 'FORM',\n TOUR = 'TOUR',\n SUPPORT = 'SUPPORT',\n CUSTOM = 'CUSTOM',\n BANNER = 'BANNER',\n EMBEDDED_TIP = 'EMBEDDED_TIP',\n NPS_SURVEY = 'NPS_SURVEY',\n ANNOUNCEMENT = 'ANNOUNCEMENT',\n}\n\nexport enum TriggerType {\n MANUAL = 'MANUAL',\n AUTOMATIC = 'AUTOMATIC',\n}\n\nexport function useFlows() {\n const { config, apiUrl } = useConfig()\n const {\n flows,\n setFlows,\n userId,\n organizationId,\n publicApiKey,\n customVariables,\n setCustomVariables,\n hasActiveFullPageFlow,\n setHasActiveFullPageFlow,\n setFlowResponses,\n setShouldGracefullyDegrade,\n shouldGracefullyDegrade,\n readonly,\n flowDataOverrides,\n } = useContext(FrigadeContext)\n\n const emptyResponse = {\n data: [],\n }\n const { verifySDKInitiated } = useCheckHasInitiatedAPI()\n const { addResponse, getFlowResponses } = useFlowResponses()\n const fetcher = (url) =>\n fetch(url, config)\n .then((response) => {\n if (response.ok) {\n return response.json()\n }\n console.log(\n `Error fetching ${url} (${response.status}): ${response.statusText}. Will gracefully degrade and hide Frigade`\n )\n setShouldGracefullyDegrade(true)\n return emptyResponse\n })\n .catch((error) => {\n console.log(`Error fetching ${url}: ${error}. Will gracefully degrade and hide Frigade`)\n setShouldGracefullyDegrade(true)\n return emptyResponse\n })\n const {\n mutateUserFlowState,\n userFlowStatesData,\n isLoadingUserFlowStateData,\n optimisticallyMarkFlowCompleted,\n optimisticallyMarkFlowSkipped,\n optimisticallyMarkFlowNotStarted,\n optimisticallyMarkStepCompleted,\n optimisticallyMarkStepNotStarted,\n optimisticallyMarkStepStarted,\n } = useUserFlowStates()\n\n const {\n data: flowData,\n error,\n isLoading: isLoadingFlows,\n } = useSWR(publicApiKey ? `${apiUrl}flows${readonly ? `?readonly=true` : ''}` : null, fetcher, {\n keepPreviousData: true,\n })\n\n useEffect(() => {\n if (error) {\n console.error(error)\n return\n }\n if (flowData && flowData.data) {\n setFlows(flowData.data)\n }\n }, [flowData, error])\n\n function getFlow(flowId: string): Flow {\n if (isLoadingFlows) {\n return null\n }\n const flow = flows.find((f) => f.slug === flowId)\n if (!flow && flows.length > 0 && !isLoadingUserFlowStateData && !isLoadingFlows) {\n console.log(`Flow with id ${flowId} not found`)\n return null\n }\n if (flow && flowDataOverrides && flowDataOverrides[flowId]) {\n flow.data = flowDataOverrides[flowId]\n }\n if (flow?.active === false && !readonly) {\n return null\n }\n return flow\n }\n\n function getFlowSteps(flowId: string): StepData[] {\n if (!getFlow(flowId)) {\n return []\n }\n let flowData = getFlow(flowId)?.data\n if (!flowData) {\n return []\n }\n\n flowData = substituteVariables(flowData)\n\n const steps = safeParse<any>(flowData)?.data ?? safeParse<any>(flowData)?.steps ?? []\n\n return steps\n .map((step: StepData) => {\n const autoCalculatedProgress = getStepOptionalProgress(step)\n return {\n handleSecondaryButtonClick: () => {\n if (step.skippable === true) {\n markStepCompleted(flowId, step.id, { skipped: true })\n }\n },\n ...step,\n complete:\n getStepStatus(flowId, step.id) === COMPLETED_STEP || autoCalculatedProgress >= 1,\n started:\n getStepStatus(flowId, step.id) === STARTED_STEP ||\n getStepStatus(flowId, step.id) === COMPLETED_STEP,\n currentlyActive: userFlowStatesData?.some(\n (data) => data.flowId == flowId && data.lastStepId === step.id\n ),\n blocked: isStepBlocked(flowId, step.id),\n hidden: isStepHidden(flowId, step.id),\n handlePrimaryButtonClick: () => {\n if (\n (!step.completionCriteria &&\n (step.autoMarkCompleted || step.autoMarkCompleted === undefined)) ||\n (step.completionCriteria && step.autoMarkCompleted === true)\n ) {\n markStepCompleted(flowId, step.id)\n }\n },\n progress: autoCalculatedProgress,\n }\n })\n .filter((step: StepData) => !(step.hidden === true))\n }\n\n function substituteVariables(flowData: string) {\n return flowData.replaceAll(/\\${(.*?)}/g, (_, variableName) => {\n if (customVariables[variableName] === undefined) {\n return ''\n }\n\n return String(customVariables[variableName])\n .replace(/[\\u00A0-\\u9999<>\\&]/g, function (i) {\n return '&#' + i.charCodeAt(0) + ';'\n })\n .replaceAll(/[\\\\]/g, '\\\\\\\\')\n .replaceAll(/[\\\"]/g, '\\\\\"')\n .replaceAll(/[\\/]/g, '\\\\/')\n .replaceAll(/[\\b]/g, '\\\\b')\n .replaceAll(/[\\f]/g, '\\\\f')\n .replaceAll(/[\\n]/g, '\\\\n')\n .replaceAll(/[\\r]/g, '\\\\r')\n .replaceAll(/[\\t]/g, '\\\\t')\n })\n }\n\n /**\n * Get high-level props for a flow such as title and subtitle\n * @param slug\n */\n function getFlowMetadata(slug: string): any {\n if (!getFlow(slug)) {\n return []\n }\n let flowData = getFlow(slug).data\n if (!flowData) {\n return []\n }\n\n flowData = substituteVariables(flowData)\n\n return JSON.parse(flowData) ?? {}\n }\n\n function setCustomVariable(key: string, value: string | number | boolean) {\n setCustomVariables((prev) => ({ ...prev, [key]: value }))\n }\n\n function updateCustomVariables(newCustomVariables?: {\n [key: string]: string | number | boolean\n }) {\n if (\n !isLoadingUserFlowStateData &&\n !isLoadingFlows &&\n newCustomVariables &&\n JSON.stringify(customVariables) !=\n JSON.stringify({ ...customVariables, ...newCustomVariables })\n ) {\n Object.keys(newCustomVariables).forEach((key) => {\n setCustomVariable(key, newCustomVariables[key])\n })\n }\n }\n\n const markStepStarted = useCallback(\n async (flowId: string, stepId: string, data?: any) => {\n if (!verifySDKInitiated()) {\n return\n }\n const flowResponse = {\n foreignUserId: userId,\n foreignUserGroupId: organizationId ?? null,\n flowSlug: flowId,\n stepId,\n actionType: STARTED_STEP,\n data: data ?? {},\n createdAt: new Date(),\n blocked: false,\n hidden: false,\n }\n if (!shouldSendServerSideCall(flowResponse)) {\n return\n }\n\n await optimisticallyMarkStepStarted(flowId, stepId, flowResponse)\n addResponse(flowResponse)\n },\n [userId, organizationId, userFlowStatesData]\n )\n\n const markStepNotStarted = useCallback(\n async (flowId: string, stepId: string, data?: any) => {\n if (!verifySDKInitiated()) {\n return\n }\n const flowResponse = {\n foreignUserId: userId,\n foreignUserGroupId: organizationId ?? null,\n flowSlug: flowId,\n stepId,\n actionType: NOT_STARTED_STEP,\n data: data ?? {},\n createdAt: new Date(),\n blocked: false,\n hidden: false,\n }\n\n if (!shouldSendServerSideCall(flowResponse)) {\n return\n }\n await optimisticallyMarkStepNotStarted(flowId, stepId, flowResponse)\n addResponse(flowResponse)\n },\n [userId, organizationId, userFlowStatesData]\n )\n\n const markStepCompleted = useCallback(\n async (flowId: string, stepId: string, data?: any) => {\n if (!verifySDKInitiated()) {\n return\n }\n const flowResponse = {\n foreignUserId: userId,\n foreignUserGroupId: organizationId ?? null,\n flowSlug: flowId,\n stepId,\n actionType: COMPLETED_STEP,\n data: data ?? {},\n createdAt: new Date(),\n blocked: false,\n hidden: false,\n }\n if (!shouldSendServerSideCall(flowResponse)) {\n return\n }\n await optimisticallyMarkStepCompleted(flowId, stepId, flowResponse)\n addResponse(flowResponse)\n },\n [userId, organizationId, userFlowStatesData]\n )\n\n const markFlowNotStarted = useCallback(\n async (flowId: string, data?: any) => {\n if (!verifySDKInitiated()) {\n return\n }\n if (getFlowStatus(flowId) === NOT_STARTED_FLOW) {\n return\n }\n const flowResponse = {\n foreignUserId: userId,\n foreignUserGroupId: organizationId ?? null,\n flowSlug: flowId,\n stepId: 'unknown',\n actionType: NOT_STARTED_FLOW,\n data: data ?? {},\n createdAt: new Date(),\n blocked: false,\n hidden: false,\n }\n\n await optimisticallyMarkFlowNotStarted(flowId)\n\n if (!shouldSendServerSideCall(flowResponse)) {\n return\n }\n addResponse(flowResponse)\n },\n [userId, organizationId, userFlowStatesData]\n )\n\n const markFlowStarted = useCallback(\n async (flowId: string, data?: any) => {\n if (!verifySDKInitiated()) {\n return\n }\n const flowResponse = {\n foreignUserId: userId,\n foreignUserGroupId: organizationId ?? null,\n flowSlug: flowId,\n stepId: 'unknown',\n actionType: STARTED_FLOW,\n data: data ?? {},\n createdAt: new Date(),\n blocked: false,\n hidden: false,\n }\n if (!shouldSendServerSideCall(flowResponse)) {\n return\n }\n addResponse(flowResponse)\n },\n [userId, organizationId, userFlowStatesData]\n )\n\n const markFlowCompleted = useCallback(\n async (flowId: string, data?: any) => {\n if (!verifySDKInitiated()) {\n return\n }\n const flowResponse = {\n foreignUserId: userId,\n foreignUserGroupId: organizationId ?? null,\n flowSlug: flowId,\n stepId: 'unknown',\n actionType: COMPLETED_FLOW,\n data: data ?? {},\n createdAt: new Date(),\n blocked: false,\n hidden: false,\n }\n if (!shouldSendServerSideCall(flowResponse)) {\n return\n }\n\n await optimisticallyMarkFlowCompleted(flowId)\n addResponse(flowResponse)\n },\n [userId, organizationId, userFlowStatesData]\n )\n\n const markFlowSkipped = useCallback(\n async (flowId: string, data?: any) => {\n if (!verifySDKInitiated()) {\n return\n }\n const flowResponse = {\n foreignUserId: userId,\n foreignUserGroupId: organizationId ?? null,\n flowSlug: flowId,\n stepId: 'unknown',\n actionType: SKIPPED_FLOW,\n data: data ?? {},\n createdAt: new Date(),\n blocked: false,\n hidden: false,\n }\n if (!shouldSendServerSideCall(flowResponse)) {\n return\n }\n await optimisticallyMarkFlowSkipped(flowId)\n addResponse(flowResponse)\n },\n [userId, organizationId, userFlowStatesData]\n )\n\n function shouldSendServerSideCall(flowResponse: FlowResponse) {\n if (userFlowStatesData === undefined) {\n return false\n }\n if (userFlowStatesData) {\n const flowState = userFlowStatesData.find((state) => state.flowId === flowResponse.flowSlug)\n\n if (\n flowResponse.actionType === NOT_STARTED_STEP &&\n (!flowState?.stepStates[flowResponse.stepId] ||\n flowState.stepStates[flowResponse.stepId].actionType === NOT_STARTED_STEP)\n ) {\n return false\n }\n if (\n flowState &&\n flowState.stepStates[flowResponse.stepId]?.actionType === flowResponse.actionType\n ) {\n if (\n flowResponse.actionType === COMPLETED_STEP &&\n (!flowResponse.data || JSON.stringify(flowResponse.data) === JSON.stringify({}))\n ) {\n return false\n }\n // Sort flowState.stepDates by createdAt date\n const sortedStepStates = Object.keys(flowState.stepStates).sort((a, b) => {\n const aDate = new Date(flowState.stepStates[a].createdAt)\n const bDate = new Date(flowState.stepStates[b].createdAt)\n return aDate.getTime() - bDate.getTime()\n })\n\n // Only return false if the newest stepState is the same as the flowResponse\n if (\n flowState.stepStates[sortedStepStates[sortedStepStates.length - 1]].actionType ===\n flowResponse.actionType &&\n flowResponse.stepId === sortedStepStates[sortedStepStates.length - 1]\n ) {\n return false\n }\n }\n if (\n flowState &&\n flowState.flowState === COMPLETED_FLOW &&\n flowResponse.actionType === COMPLETED_FLOW\n ) {\n return false\n }\n }\n\n return true\n }\n\n function getStepStatus(flowId: string, stepId: string): StepActionType | null {\n const maybeFlowResponse = getStepStateForFlow(flowId, stepId)\n\n if (isLoadingUserFlowStateData) {\n return null\n }\n\n return (maybeFlowResponse ? maybeFlowResponse.actionType : NOT_STARTED_STEP) as StepActionType\n }\n\n function isStepBlocked(flowId: string, stepId: string): boolean {\n const maybeFlowResponse = getStepStateForFlow(flowId, stepId)\n\n if (!maybeFlowResponse) {\n return false\n }\n\n return maybeFlowResponse.blocked\n }\n\n function isStepHidden(flowId: string, stepId: string): boolean {\n const maybeFlowResponse = getStepStateForFlow(flowId, stepId)\n\n if (!maybeFlowResponse) {\n return false\n }\n\n return maybeFlowResponse.hidden\n }\n\n function getStepStateForFlow(flowId: string, stepId: string): FlowResponse | null {\n if (isLoadingUserFlowStateData) {\n return null\n }\n\n const flowState = userFlowStatesData?.find((state) => state.flowId === flowId)\n if (!flowState || !flowState.stepStates[stepId]) {\n return null\n }\n\n return flowState.stepStates[stepId] ?? null\n }\n\n function getCurrentStep(flowId: string): StepData | null {\n if (isLoadingUserFlowStateData || !userFlowStatesData) {\n return null\n }\n if (getFlowStatus(flowId) === NOT_STARTED_FLOW) {\n return getFlowSteps(flowId)[0] ?? null\n }\n\n const lastStep = userFlowStatesData.find((f) => f.flowId === flowId)?.lastStepId\n if (lastStep) {\n return getFlowSteps(flowId).find((s) => s.id === lastStep)\n }\n return null\n }\n\n function getCurrentStepIndex(flowId: string): number {\n const currentStep = getCurrentStep(flowId)\n if (!currentStep) {\n return 0\n }\n const index = getFlowSteps(flowId).findIndex((s) => s.id === currentStep.id) ?? 0\n if (\n getStepStatus(flowId, currentStep.id) === COMPLETED_STEP &&\n index < getFlowSteps(flowId).length - 1\n ) {\n return index + 1\n }\n return index\n }\n\n function getStepOptionalProgress(step: StepData) {\n if (!step.completionCriteria) return undefined\n\n const stepSubFlowSlug = getSubFlowFromCompletionCriteria(step.completionCriteria)\n if (stepSubFlowSlug === null) return undefined\n\n const completed = getNumberOfStepsCompleted(stepSubFlowSlug)\n const total = getNumberOfSteps(stepSubFlowSlug)\n\n return total === 0 ? undefined : completed / total\n }\n\n function getFlowStatus(flowId: string) {\n const userFlowState = userFlowStatesData?.find((f) => f.flowId === flowId)\n if (!userFlowState) {\n return null\n }\n return userFlowState.flowState\n }\n\n function getNumberOfStepsCompleted(flowId: string): number {\n const steps = getFlowSteps(flowId)\n if (steps.length === 0) {\n return 0\n }\n\n const completedSteps = steps.filter((s) => getStepStatus(flowId, s.id) === COMPLETED_STEP)\n\n return completedSteps.length\n }\n\n function getNumberOfSteps(flowId: string) {\n return getFlowSteps(flowId).length\n }\n\n /**\n * Generic method for getting the raw Flow data as a Javascript object.\n * For typescript, pass in T to get the correct type.\n * @param flowId\n */\n function getFlowData<T>(flowId: string): T | null {\n const maybeFlow = flows.find((f) => f.slug === flowId)\n if (!maybeFlow) {\n return null\n }\n if (flowDataOverrides && flowDataOverrides[flowId]) {\n maybeFlow.data = flowDataOverrides[flowId]\n }\n return safeParse<T>(maybeFlow.data)\n }\n\n function targetingLogicShouldHideFlow(flow: Flow) {\n if (readonly) {\n return false\n }\n if (isLoadingUserFlowStateData) {\n return true\n }\n if (shouldGracefullyDegrade) {\n return true\n }\n if (flow?.targetingLogic && userFlowStatesData) {\n // Iterate through matching userFlowState for the flow and if shouldTrigger is true, return false\n const matchingUserFlowState = userFlowStatesData.find((ufs) => ufs.flowId === flow.slug)\n if (matchingUserFlowState) {\n return matchingUserFlowState.shouldTrigger === false\n }\n }\n if (flow?.targetingLogic && userId && userId.startsWith('guest_')) {\n return true\n }\n\n return false\n }\n\n function isFlowAvailableToUser(flowId: string) {\n const flow = getFlow(flowId)\n if (flow?.active === false) {\n return false\n }\n return !targetingLogicShouldHideFlow(getFlow(flowId))\n }\n\n function refresh() {\n if (userId) {\n mutateUserFlowState()\n }\n }\n\n function getAllFlows() {\n return flows\n }\n\n return {\n getAllFlows,\n getFlow,\n getFlowData,\n isLoading: isLoadingUserFlowStateData || isLoadingFlows,\n getStepStatus,\n getFlowSteps,\n getCurrentStepIndex,\n markStepStarted,\n markStepCompleted,\n markFlowNotStarted,\n markFlowStarted,\n markFlowCompleted,\n markFlowSkipped,\n markStepNotStarted,\n getFlowStatus,\n getNumberOfStepsCompleted,\n getNumberOfSteps,\n targetingLogicShouldHideFlow,\n setCustomVariable,\n updateCustomVariables,\n customVariables,\n getStepOptionalProgress,\n getFlowMetadata,\n isStepBlocked,\n isStepHidden,\n hasActiveFullPageFlow,\n setHasActiveFullPageFlow,\n isFlowAvailableToUser,\n refresh,\n }\n}\n","import React, { useMemo } from 'react'\nimport { FrigadeContext } from '../FrigadeProvider'\nimport { VERSION_NUMBER } from './version'\n\nexport const NOT_STARTED_STEP = 'NOT_STARTED_STEP'\nexport const COMPLETED_FLOW = 'COMPLETED_FLOW'\nexport const SKIPPED_FLOW = 'SKIPPED_FLOW'\nexport const STARTED_FLOW = 'STARTED_FLOW'\nexport const NOT_STARTED_FLOW = 'NOT_STARTED_FLOW'\nexport const COMPLETED_STEP = 'COMPLETED_STEP'\nexport const STARTED_STEP = 'STARTED_STEP'\n// Define a string type that is either STARTED_STEP or COMPLETED_STEP\nexport type StepActionType = 'STARTED_STEP' | 'COMPLETED_STEP' | 'NOT_STARTED_STEP'\n\nexport function useConfig() {\n const { publicApiKey, userId, apiUrl } = React.useContext(FrigadeContext)\n\n return {\n config: useMemo(\n () => ({\n headers: {\n Authorization: `Bearer ${publicApiKey}`,\n 'Content-Type': 'application/json',\n 'X-Frigade-SDK-Version': VERSION_NUMBER,\n 'X-Frigade-SDK-Platform': 'React',\n },\n }),\n [publicApiKey, userId]\n ),\n apiUrl: useMemo(() => `${apiUrl}/v1/public/`, [apiUrl]),\n }\n}\n\nconst LAST_POST_CALL_AT = 'frigade-last-call-at-'\nconst LAST_POST_CALL_DATA = 'frigade-last-call-data-'\nexport function useGracefulFetch() {\n const { shouldGracefullyDegrade, readonly } = React.useContext(FrigadeContext)\n\n return async (url: string, options: any) => {\n if (\n readonly &&\n (options.method === 'POST' || options.method === 'PUT' || options.method === 'DELETE')\n ) {\n return getEmptyResponse()\n }\n if (shouldGracefullyDegrade) {\n console.log(`Skipping ${url} call to Frigade due to error`)\n return getEmptyResponse()\n }\n const lastCallAtKey = LAST_POST_CALL_AT + url\n const lastCallDataKey = LAST_POST_CALL_DATA + url\n if (\n typeof window !== 'undefined' &&\n window.localStorage &&\n options &&\n options.body &&\n options.method === 'POST'\n ) {\n const lastCall = window.localStorage.getItem(lastCallAtKey)\n const lastCallData = window.localStorage.getItem(lastCallDataKey)\n if (lastCall && lastCallData && lastCallData == options.body) {\n const lastCallDate = new Date(lastCall)\n const now = new Date()\n const diff = now.getTime() - lastCallDate.getTime()\n // Throttle consecutive POST calls to 1 second\n if (diff < 1000) {\n return getEmptyResponse()\n }\n }\n if (typeof window !== 'undefined') {\n window.localStorage.setItem(lastCallAtKey, new Date().toISOString())\n window.localStorage.setItem(lastCallDataKey, options.body)\n }\n }\n\n let response\n try {\n response = await fetch(url, options)\n } catch (error) {\n return getEmptyResponse(error)\n }\n\n if (!response) {\n return getEmptyResponse()\n }\n\n if (!response.ok) {\n return getEmptyResponse(response.statusText)\n }\n\n return response\n }\n}\n\nfunction getEmptyResponse(error?: any) {\n if (error) {\n console.log('Call to Frigade failed', error)\n }\n\n // Create empty response that contains the .json method and returns an empty object\n return {\n json: () => ({}),\n }\n}\n\nexport interface PaginatedResult<T> {\n data: T[]\n offset: number\n limit: number\n}\n\nexport function useCheckHasInitiatedAPI() {\n const { publicApiKey, shouldGracefullyDegrade } = React.useContext(FrigadeContext)\n\n function verifySDKInitiated() {\n if (shouldGracefullyDegrade) {\n return false\n }\n if (!publicApiKey) {\n console.error('Frigade hooks cannot be used outside the scope of FrigadeProvider')\n return false\n }\n return true\n }\n\n return {\n verifySDKInitiated,\n }\n}\n","export const VERSION_NUMBER = '1.38.11'\n","import { useContext, useState } from 'react'\nimport {\n COMPLETED_FLOW,\n COMPLETED_STEP,\n NOT_STARTED_FLOW,\n NOT_STARTED_STEP,\n SKIPPED_FLOW,\n STARTED_FLOW,\n STARTED_STEP,\n useConfig,\n useGracefulFetch,\n} from './common'\nimport { FrigadeContext } from '../FrigadeProvider'\nimport { useUserFlowStates } from './user-flow-states'\n\nexport interface FlowResponse {\n foreignUserId: string\n foreignUserGroupId?: string\n flowSlug: string\n stepId: string\n actionType: string\n data: object\n createdAt: Date\n blocked: boolean\n hidden: boolean\n}\n\nexport interface PublicStepState {\n stepId: string\n actionType: 'COMPLETED_STEP' | 'STARTED_STEP' | 'NOT_STARTED_STEP'\n blocked: boolean\n hidden: boolean\n createdAt: Date\n}\n\nexport function useFlowResponses() {\n const { config, apiUrl } = useConfig()\n const { userFlowStatesData, mutateUserFlowState } = useUserFlowStates()\n const { failedFlowResponses, setFailedFlowResponses, flowResponses, setFlowResponses } =\n useContext(FrigadeContext)\n const [successfulFlowResponsesStrings, setSuccessfulFlowResponsesStrings] = useState<Set<String>>(\n new Set()\n )\n const [successfulFlowResponses, setSuccessfulFlowResponses] = useState<Set<FlowResponse>>(\n new Set()\n )\n\n const gracefullyFetch = useGracefulFetch()\n\n function postFlowResponse(flowResponse: FlowResponse) {\n const flowResponseString = JSON.stringify(flowResponse)\n\n if (successfulFlowResponsesStrings.has(flowResponseString)) {\n return null\n }\n // For steps that are already in the same state, do not update the API.\n successfulFlowResponsesStrings.add(flowResponseString)\n setSuccessfulFlowResponsesStrings(successfulFlowResponsesStrings)\n successfulFlowResponses.add(flowResponse)\n setSuccessfulFlowResponses(successfulFlowResponses)\n // Only update flow responses if there is not already an entry for this step.\n // Check for flow id, step id, and action type, and date\n const existingFlowResponse = flowResponses?.find(\n (r) =>\n r.flowSlug === flowResponse.flowSlug &&\n r.stepId === flowResponse.stepId &&\n r.actionType === flowResponse.actionType &&\n r.createdAt === flowResponse.createdAt\n )\n\n return gracefullyFetch(`${apiUrl}flowResponses`, {\n ...config,\n method: 'POST',\n body: flowResponseString,\n }).then((r) => {\n if (r.status !== 200 && r.status !== 201) {\n console.log(\n 'Failed to send flow response for step ' +\n flowResponse.stepId +\n '. Will retry again later.'\n )\n setFailedFlowResponses([...failedFlowResponses, flowResponse])\n } else {\n if (!existingFlowResponse) {\n setFlowResponses((prev) => [...(prev ?? []), flowResponse])\n }\n }\n })\n }\n\n async function addResponse(flowResponse: FlowResponse) {\n if (!flowResponse.foreignUserId) {\n return\n }\n\n if (flowResponse.actionType === STARTED_FLOW || flowResponse.actionType === NOT_STARTED_FLOW) {\n await postFlowResponse(flowResponse)\n } else if (flowResponse.actionType === COMPLETED_FLOW) {\n await postFlowResponse(flowResponse)\n } else if (flowResponse.actionType === STARTED_STEP) {\n await postFlowResponse(flowResponse)\n } else if (flowResponse.actionType === COMPLETED_STEP) {\n await postFlowResponse(flowResponse)\n } else if (flowResponse.actionType === SKIPPED_FLOW) {\n await postFlowResponse(flowResponse)\n } else if (flowResponse.actionType === NOT_STARTED_STEP) {\n await postFlowResponse(flowResponse)\n }\n }\n\n function getFlowResponses() {\n const apiFlowResponses: FlowResponse[] = []\n\n userFlowStatesData?.forEach((flowState) => {\n if (flowState && flowState.stepStates && Object.keys(flowState.stepStates).length !== 0) {\n // Convert flowState.stepStates map to flowResponses\n\n for (const stepSlug in flowState.stepStates) {\n const stepState = flowState.stepStates[stepSlug] as PublicStepState\n\n apiFlowResponses.push({\n foreignUserId: flowState.foreignUserId,\n flowSlug: flowState.flowId,\n stepId: stepState.stepId,\n actionType: stepState.actionType,\n data: {},\n createdAt: new Date(stepState.createdAt),\n blocked: stepState.blocked,\n hidden: stepState.hidden,\n } as FlowResponse)\n }\n }\n })\n\n return [...apiFlowResponses, ...flowResponses]\n }\n\n return {\n addResponse,\n setFlowResponses,\n getFlowResponses,\n }\n}\n","import {\n COMPLETED_FLOW,\n NOT_STARTED_FLOW,\n NOT_STARTED_STEP,\n SKIPPED_FLOW,\n STARTED_FLOW,\n useConfig,\n} from './common'\nimport { useContext, useEffect, useState } from 'react'\nimport { FrigadeContext } from '../FrigadeProvider'\nimport useSWR from 'swr'\nimport { useFlowOpens } from './flow-opens'\nimport { FlowResponse } from './flow-responses'\nimport useSWRImmutable from 'swr/immutable'\nimport { deepmerge } from '../shared/deepmerge'\nimport { safeParse } from '../shared/parse'\n\nexport interface PublicUserFlowState {\n flowId: string\n flowState: 'COMPLETED_FLOW' | 'STARTED_FLOW' | 'NOT_STARTED_FLOW'\n lastStepId: string\n userId: string\n foreignUserId: string\n stepStates: object\n shouldTrigger: boolean\n}\n\nconst UNKNOWN_STEP_ID = 'unknown'\n\nexport function useUserFlowStates(): {\n userFlowStatesData: PublicUserFlowState[]\n isLoadingUserFlowStateData: boolean\n mutateUserFlowState: () => any\n optimisticallyMarkFlowCompleted: (flowId: string) => void\n optimisticallyMarkFlowSkipped: (flowId: string) => void\n optimisticallyMarkFlowNotStarted: (flowId: string) => void\n optimisticallyMarkStepCompleted: (\n flowId: string,\n stepId: string,\n flowResponse: FlowResponse\n ) => void\n optimisticallyMarkStepNotStarted: (\n flowId: string,\n stepId: string,\n flowResponse: FlowResponse\n ) => void\n optimisticallyMarkStepStarted: (\n flowId: string,\n stepId: string,\n flowResponse: FlowResponse\n ) => void\n error: any\n} {\n const { config, apiUrl } = useConfig()\n const { publicApiKey, userId, organizationId, flows, setShouldGracefullyDegrade, readonly } =\n useContext(FrigadeContext)\n const { resetOpenFlowState } = useFlowOpens()\n const [hasFinishedInitialLoad, setHasFinishedInitialLoad] = useState(false)\n const emptyResponse = {\n data: flows.map((flow) => ({\n flowId: flow.id,\n flowState: COMPLETED_FLOW,\n lastStepId: null,\n userId,\n foreignUserId: userId,\n stepStates: {},\n shouldTrigger: false,\n })),\n }\n const fetcher = (url) =>\n fetch(url, config)\n .then((response) => {\n if (response.ok) {\n return response.json()\n }\n throw new Error('Failed to fetch user flow states')\n })\n .catch((error) => {\n console.log(`Error fetching ${url}: ${error}. Will gracefully degrade and hide Frigade`)\n setShouldGracefullyDegrade(true)\n return emptyResponse\n })\n\n const key =\n publicApiKey && flows && userId\n ? `${apiUrl}userFlowStates?foreignUserId=${encodeURIComponent(userId)}${\n organizationId ? `&foreignUserGroupId=${encodeURIComponent(organizationId)}` : ''\n }`\n : null\n\n const {\n data,\n isLoading: isLoadingUserFlowStateData,\n mutate: mutateUserFlowState,\n error,\n } = readonly\n ? useSWRImmutable(key, fetcher)\n : useSWR(key, fetcher, {\n revalidateOnFocus: true,\n revalidateIfStale: true,\n keepPreviousData: true,\n revalidateOnMount: false,\n errorRetryInterval: 10000,\n errorRetryCount: 3,\n onError: () => {\n // In case of errors fetching the user flow states, hide all Frigade flow by setting shouldTrigger to false\n return emptyResponse\n },\n onLoadingSlow: () => {\n return emptyResponse\n },\n })\n const userFlowStatesData = data?.data\n\n useEffect(() => {\n if (!hasFinishedInitialLoad && !isLoadingUserFlowStateData && userFlowStatesData) {\n setHasFinishedInitialLoad(true)\n }\n }, [userFlowStatesData, hasFinishedInitialLoad, isLoadingUserFlowStateData])\n\n async function optimisticallyMarkFlowCompleted(flowId: string) {\n if (userFlowStatesData && !readonly) {\n const flowState = userFlowStatesData.find((state) => state.flowId === flowId)\n if (flowState && flowState.flowState !== COMPLETED_FLOW) {\n flowState.flowState = COMPLETED_FLOW\n }\n await mutateUserFlowState(Promise.resolve(deepmerge(data, { data: userFlowStatesData })), {\n optimisticData: deepmerge(data, { data: userFlowStatesData }),\n revalidate: false,\n rollbackOnError: false,\n })\n }\n }\n\n async function optimisticallyMarkFlowSkipped(flowId: string) {\n if (userFlowStatesData && !readonly) {\n const flowState = userFlowStatesData.find((state) => state.flowId === flowId)\n if (flowState && flowState.flowState !== SKIPPED_FLOW) {\n flowState.flowState = SKIPPED_FLOW\n }\n await mutateUserFlowState(Promise.resolve(deepmerge(data, { data: userFlowStatesData })), {\n optimisticData: deepmerge(data, { data: userFlowStatesData }),\n revalidate: false,\n rollbackOnError: false,\n })\n }\n }\n\n async function optimisticallyMarkStepCompleted(\n flowId: string,\n stepId: string,\n flowResponse: FlowResponse\n ) {\n if (userFlowStatesData) {\n const flowState = userFlowStatesData.find(\n (state) => state.flowId === flowId\n ) as PublicUserFlowState\n if (flowState) {\n const flow = flows.find((flow) => flow.slug === flowId)\n const data = safeParse<any>(flow?.data)\n const steps = data?.steps ?? data?.data ?? []\n const currentStepIndex = steps.findIndex((step) => step.id === stepId)\n const nextStep =\n steps && steps.length > currentStepIndex + 1 ? steps[currentStepIndex + 1] : null\n if (nextStep) {\n flowState.lastStepId = nextStep.id\n }\n flowState.stepStates[stepId] = flowResponse\n flowState.flowState = STARTED_FLOW\n }\n if (!readonly) {\n await mutateUserFlowState(Promise.resolve(deepmerge(data, { data: userFlowStatesData })), {\n optimisticData: deepmerge(data, { data: userFlowStatesData }),\n revalidate: false,\n rollbackOnError: false,\n })\n }\n }\n }\n\n async function optimisticallyMarkStepStarted(\n flowId: string,\n stepId: string,\n flowResponse: FlowResponse\n ) {\n if (userFlowStatesData) {\n const flowState = userFlowStatesData.find(\n (state) => state.flowId === flowId\n ) as PublicUserFlowState\n if (flowState) {\n flowState.lastStepId = stepId\n flowState.stepStates[stepId] = flowResponse\n flowState.flowState = STARTED_FLOW\n }\n if (!readonly) {\n await mutateUserFlowState(deepmerge(data, { data: userFlowStatesData }), {\n optimisticData: deepmerge(data, { data: userFlowStatesData }),\n revalidate: false,\n rollbackOnError: false,\n })\n }\n }\n }\n\n async function optimisticallyMarkFlowNotStarted(flowId: string) {\n if (userFlowStatesData) {\n const flowState = userFlowStatesData.find((state) => state.flowId === flowId)\n if (flowState && flowState.flowState !== NOT_STARTED_FLOW) {\n flowState.flowState = NOT_STARTED_FLOW\n flowState.lastStepId = UNKNOWN_STEP_ID\n // Update all sets to NOT_STARTED_STEP\n Object.keys(flowState.stepStates).forEach((stepId) => {\n flowState.stepStates[stepId].actionType = NOT_STARTED_STEP\n flowState.stepStates[stepId].createdAt = new Date().toISOString()\n })\n await mutateUserFlowState(deepmerge(data, { data: userFlowStatesData }), {\n optimisticData: deepmerge(data, { data: userFlowStatesData }),\n revalidate: false,\n rollbackOnError: false,\n })\n resetOpenFlowState(flowId)\n }\n }\n }\n\n async function optimisticallyMarkStepNotStarted(\n flowId: string,\n stepId: string,\n flowResponse: FlowResponse\n ) {\n if (userFlowStatesData) {\n const flowState = userFlowStatesData.find(\n (state) => state.flowId === flowId\n ) as PublicUserFlowState\n if (flowState) {\n flowState.stepStates[stepId] = flowResponse\n }\n await mutateUserFlowState(Promise.resolve(deepmerge(data, { data: userFlowStatesData })), {\n optimisticData: deepmerge(data, { data: userFlowStatesData }),\n revalidate: false,\n rollbackOnError: false,\n })\n }\n }\n\n return {\n userFlowStatesData,\n isLoadingUserFlowStateData: !hasFinishedInitialLoad,\n mutateUserFlowState,\n optimisticallyMarkFlowCompleted,\n optimisticallyMarkFlowSkipped,\n optimisticallyMarkFlowNotStarted,\n optimisticallyMarkStepCompleted,\n optimisticallyMarkStepNotStarted,\n optimisticallyMarkStepStarted,\n error,\n }\n}\n","import { useContext } from 'react'\nimport { FrigadeContext } from '../FrigadeProvider'\n\nexport function useFlowOpens() {\n const {\n openFlowStates,\n setOpenFlowStates,\n hasActiveFullPageFlow,\n setCompletedFlowsToKeepOpenDuringSession,\n completedFlowsToKeepOpenDuringSession,\n } = useContext(FrigadeContext)\n\n function getOpenFlowState(flowId: string, defaultValue = false) {\n return openFlowStates[flowId] ?? defaultValue\n }\n\n function setOpenFlowState(flowId: string, isOpen: boolean) {\n setOpenFlowStates((prev) => ({ ...prev, [flowId]: isOpen }))\n }\n\n function resetOpenFlowState(flowId: string) {\n setOpenFlowStates((prev) => {\n const { [flowId]: _, ...rest } = prev\n return { ...rest }\n })\n }\n\n function setKeepCompletedFlowOpenDuringSession(flowId: string) {\n if (completedFlowsToKeepOpenDuringSession.includes(flowId)) {\n return\n }\n setCompletedFlowsToKeepOpenDuringSession((prev) => [...prev, flowId])\n }\n\n function shouldKeepCompletedFlowOpenDuringSession(flowId: string): boolean {\n return completedFlowsToKeepOpenDuringSession.includes(flowId)\n }\n\n function hasOpenModals(currentFlowId?: string) {\n return (\n Object.entries(openFlowStates).some(\n ([flowId, isOpen]) => isOpen && flowId != currentFlowId\n ) || hasActiveFullPageFlow\n )\n }\n\n return {\n getOpenFlowState,\n setOpenFlowState,\n resetOpenFlowState,\n hasOpenModals,\n setKeepCompletedFlowOpenDuringSession,\n shouldKeepCompletedFlowOpenDuringSession,\n }\n}\n","import structuredClone from 'core-js-pure/actual/structured-clone'\n\nfunction isObject(obj) {\n return typeof obj === 'object' && obj !== null && !Array.isArray(obj)\n}\n\nexport function deepmerge(...args) {\n const target = args.shift()\n\n // Recurse to the right until we've merged all the way back to a single target and source\n const source = args.length === 1 ? args[0] : deepmerge(...args)\n\n if (!isObject(target) || !isObject(source)) {\n throw new Error('deepmerge can only merge Objects')\n }\n\n const result = structuredClone(target)\n\n Object.entries(source).forEach(([key, value]) => {\n // Is value an Object, i.e. are we at risk of passing by reference?\n if (isObject(value)) {\n // Does key already exist in result?\n if (result[key] !== undefined) {\n // Deepmerge it on\n Object.assign(result, { [key]: deepmerge(result[key], structuredClone(value)) })\n } else {\n // Else clone value onto result\n Object.assign(result, { [key]: structuredClone(value) })\n }\n } else if (Array.isArray(value)) {\n // Does key already exist in result?\n if (result[key] !== undefined) {\n // Clone and spread onto existing\n // TODO: This only shallow-merges arrays. Add ability to deep merge here, so nested structures aren't overwritten\n Object.assign(result, { [key]: [...result[key], ...structuredClone(value)] })\n } else {\n // Else spread array onto result\n Object.assign(result, { [key]: structuredClone(value) })\n }\n } else {\n // Assign value onto result\n Object.assign(result, { [key]: value })\n }\n })\n\n return result\n}\n","/**\n * Safely parse a stringified JSON object.\n *\n * @param stringified A stringified JSON object (or other value)\n * @returns The parsed object or null if the stringified value is not a valid JSON object\n */\nexport function safeParse<R>(stringified: string): R | null {\n try {\n return JSON.parse(stringified) as R\n } catch (e) {\n console.error('Failed to parse Frigade config.yml to JSON', e)\n return null\n }\n}\n","const regex = /user.flow\\(([^\\)]+)\\) == '?COMPLETED_FLOW'?/gm\n\nexport const getSubFlowFromCompletionCriteria = (completionCriteria: string) => {\n const flowMatch = regex.exec(completionCriteria)\n if (flowMatch === null) return null\n\n /**\n * Use the grouped regex match to\n * - match on full completion criteria for a 'Flow' completion\n * - get the flowId slug from within the completion criteria\n */\n let flow = null\n flowMatch.forEach((match, _) => {\n let trimmed = replaceAll(match, \"'\", '')\n if (trimmed.startsWith('flow_')) {\n flow = trimmed\n }\n })\n return flow\n}\n\nexport const replaceAll = function (target, search, replacement) {\n return target.replace(new RegExp(search, 'g'), replacement)\n}\n","import React, { useCallback, useContext, useEffect } from 'react'\nimport { FrigadeContext } from '../FrigadeProvider'\nimport { useCheckHasInitiatedAPI, useConfig, useGracefulFetch } from './common'\nimport { useUserFlowStates } from './user-flow-states'\nimport { EntityProperties } from '../FrigadeForm/types'\nimport { guestUserIdField } from '../components/DataFetcher'\n\ninterface AddPropertyToUserDTO {\n readonly foreignId: string\n readonly properties?: { [key: string]: string | boolean | number | null }\n readonly events?: UserEvent[]\n readonly linkGuestId?: string\n}\n\ninterface UserEvent {\n readonly event: string\n readonly properties?: { [key: string]: string | boolean | number | null }\n}\n\nexport const GUEST_PREFIX = 'guest_'\n\nexport function useUser(): {\n readonly userId: string | null\n readonly setUserId: React.Dispatch<React.SetStateAction<string | null>>\n readonly setUserIdWithProperties: (userId: string, properties?: EntityProperties) => Promise<void>\n readonly addPropertiesToUser: (properties: EntityProperties) => Promise<void>\n readonly trackEventForUser: (event: string, properties?: EntityProperties) => Promise<void>\n readonly linkExistingGuestSessionToUser: (userId: string) => Promise<void>\n} {\n const {\n userId: userIdInternal,\n organizationId,\n setUserId,\n setUserProperties,\n shouldGracefullyDegrade,\n } = useContext(FrigadeContext)\n const { config, apiUrl } = useConfig()\n const { mutateUserFlowState } = useUserFlowStates()\n const gracefullyFetch = useGracefulFetch()\n const { verifySDKInitiated } = useCheckHasInitiatedAPI()\n\n function getUserIdKey(id?: string) {\n return `frigade-user-registered-${id}`\n }\n\n // Use local storage to mark if user has already been registered in frigade\n useEffect(() => {\n // Check if user is not a guest\n if (userIdInternal && !organizationId) {\n // Check if userid begins with the guest prefix\n if (userIdInternal.startsWith(GUEST_PREFIX)) {\n return\n }\n const userRegisteredKey = getUserIdKey(userIdInternal)\n // Check if user has already been registered in frigade\n if (!localStorage.getItem(userRegisteredKey)) {\n // Register user in frigade\n gracefullyFetch(`${apiUrl}users`, {\n ...config,\n method: 'POST',\n body: JSON.stringify({ foreignId: userIdInternal }),\n })\n // Mark user as registered in frigade\n localStorage.setItem(userRegisteredKey, 'true')\n }\n }\n }, [userIdInternal, shouldGracefullyDegrade, organizationId])\n\n const addPropertiesToUser = useCallback(\n async (properties: EntityProperties) => {\n if (!verifySDKInitiated()) {\n return\n }\n const data: AddPropertyToUserDTO = {\n foreignId: userIdInternal,\n properties,\n }\n await gracefullyFetch(`${apiUrl}users`, {\n ...config,\n method: 'POST',\n body: JSON.stringify(data),\n })\n setUserProperties((userProperties) => ({ ...userProperties, ...properties }))\n mutateUserFlowState()\n },\n [userIdInternal, config, shouldGracefullyDegrade, mutateUserFlowState]\n )\n\n const trackEventForUser = useCallback(\n async (event: string, properties?: EntityProperties) => {\n if (!verifySDKInitiated()) {\n return\n }\n const eventData: UserEvent = {\n event,\n properties,\n }\n const data: AddPropertyToUserDTO = {\n foreignId: userIdInternal,\n events: [eventData],\n }\n await gracefullyFetch(`${apiUrl}users`, {\n ...config,\n method: 'POST',\n body: JSON.stringify(data),\n })\n mutateUserFlowState()\n },\n [userIdInternal, config, mutateUserFlowState]\n )\n\n const setUserIdWithProperties = useCallback(\n async (userId: string, properties?: EntityProperties) => {\n if (!verifySDKInitiated()) {\n return\n }\n if (properties && Object.keys(properties).length > 0) {\n const userRegisteredKey = getUserIdKey(userId)\n localStorage.setItem(userRegisteredKey, 'true')\n setUserId(userId)\n const data: AddPropertyToUserDTO = {\n foreignId: userId,\n properties,\n }\n await gracefullyFetch(`${apiUrl}users`, {\n ...config,\n method: 'POST',\n body: JSON.stringify(data),\n })\n setUserProperties((userProperties) => ({ ...userProperties, ...properties }))\n mutateUserFlowState()\n } else {\n setUserId(userId)\n }\n },\n [config, shouldGracefullyDegrade, mutateUserFlowState]\n )\n\n const linkExistingGuestSessionToUser = useCallback(\n async (userId: string) => {\n if (!verifySDKInitiated()) {\n return\n }\n const existingGuestId =\n typeof window !== 'undefined' ? localStorage.getItem(guestUserIdField) : null\n console.log('id', localStorage.getItem(guestUserIdField))\n if (!existingGuestId) {\n return\n }\n\n const data: AddPropertyToUserDTO = {\n foreignId: userId,\n linkGuestId: existingGuestId,\n }\n await gracefullyFetch(`${apiUrl}users`, {\n ...config,\n method: 'POST',\n body: JSON.stringify(data),\n })\n mutateUserFlowState()\n },\n [config, shouldGracefullyDegrade, mutateUserFlowState]\n )\n\n return {\n userId: userIdInternal,\n setUserId,\n setUserIdWithProperties,\n addPropertiesToUser,\n trackEventForUser,\n linkExistingGuestSessionToUser,\n }\n}\n","import React, { CSSProperties, FC, useEffect, useState } from 'react'\n\nimport { Appearance, DefaultFrigadeFlowProps, StepData } from '../types'\nimport { useFlows } from '../api/flows'\nimport { COMPLETED_FLOW } from '../api/common'\nimport { Modal } from '../components/Modal'\nimport { CornerModal } from '../components/CornerModal'\nimport { FormInputProps } from './types'\nimport { useTheme } from '../hooks/useTheme'\nimport { FormContent } from './FormContent'\nimport { RenderInlineStyles } from '../components/RenderInlineStyles'\nimport { useFlowOpens } from '../api/flow-opens'\nimport { useFlowImpressions } from '../hooks/useFlowImpressions'\n\nexport type FrigadeFormType = 'inline' | 'modal' | 'large-modal' | 'corner-modal'\n\nexport interface FrigadeFormProps extends DefaultFrigadeFlowProps {\n /**\n * @ignore\n */\n title?: string\n /**\n * @ignore\n */\n subtitle?: string\n type?: FrigadeFormType\n /**\n * Map of custom components. The key must match the `type` property of the step defined in `config.yml`\n */\n customStepTypes?: {\n [key: string]:\n | ((params: {\n flowId: string\n stepData: StepData\n canContinue: boolean\n setCanContinue: (canContinue: boolean) => void\n onSaveData: (data: object) => void\n appearance?: Appearance\n prefillData?: Record<string, any>\n customFormElements?: { [key: string]: (params: FormInputProps) => React.ReactNode }\n }) => React.ReactNode)\n | React.ReactNode\n }\n /**\n * Map of custom form components. Can only be used with a step of type `multiInput` (defined in `config.yml`).\n * The key must match the `type` property of the input defined in `config.yml`\n */\n customFormElements?: { [key: string]: (params: FormInputProps) => React.ReactNode }\n visible?: boolean\n setVisible?: (visible: boolean) => void\n onComplete?: () => void\n /**\n * Whether to show a dismiss button to exit out of the form. Applicable only for modal forms.\n */\n dismissible?: boolean\n /**\n * If true, the form can be repeated multiple times. Default is false. Useful for e.g. contact/support forms.\n */\n repeatable?: boolean\n /**\n * If true, the user will be excited from the flow when the form is dismissed. Default is false.\n */\n endFlowOnDismiss?: boolean\n /**\n * Indicates the position of the modal if the form type is a modal. Default is center.\n */\n modalPosition?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'center'\n /**\n * Show a pagination indicator at the bottom of the form. Default is false.\n */\n showPagination?: boolean\n /**\n * Whether to allow the user to navigate back to previous steps. Default is false.\n * The title of the button can be controlled by the `backButtonTitle` prop on the step.\n */\n allowBackNavigation?: boolean\n /**\n * @ignore\n */\n showFrigadeBranding?: boolean\n /**\n * Async function resolved when the user submits data in a step.\n * If the promise evaluates to a string or `false`, the flow will not proceed to the next step. The string will be displayed as an error message if passed.\n * If the promise evaluates to `true`, the flow will proceed to the next step.\n */\n validationHandler?: (\n step: StepData,\n index: number,\n nextStep?: StepData,\n allFormData?: any,\n stepSpecificFormData?: any\n ) => Promise<string | null | boolean | undefined>\n /**\n * Handler that is called when the form data changes.\n */\n onFormDataChange?: (\n allFormData: any,\n stepSpecificFormData: any,\n step: StepData,\n index: number\n ) => void\n /**\n * Show or hide the form footer\n */\n showFooter?: boolean\n /**\n * Data to use for prefilling forms with data.\n * Useful when you want to prefill a form with data from another source.\n * The format of the data maps a step id to the prefill data. Depending on the implementation of the given step type,\n * the value of the data will follow a different structure.\n *\n * For `type` multiInputStep, the value contains another map similar to the structure returned from `onFormDataChange`\n */\n prefillData?: Record<string, any>\n /**\n * Whether to update the url when the page changes in multi-page forms. If enabled, the current url will be updated with the\n * current step id in the following format: <my_url>?p=<current_step_id>\n *\n * This is useful when wanting to capture URL changes with third-party tracking tools.\n *\n * Default is false.\n */\n updateUrlOnPageChange?: boolean\n}\n\nexport const FrigadeForm: FC<FrigadeFormProps> = ({\n flowId,\n customStepTypes = {},\n type = 'inline',\n visible,\n setVisible,\n customVariables,\n customFormElements,\n onComplete,\n appearance,\n hideOnFlowCompletion = true,\n onStepCompletion,\n onButtonClick,\n dismissible = true,\n endFlowOnDismiss = false,\n modalPosition = 'center',\n repeatable = false,\n onDismiss,\n showPagination = false,\n allowBackNavigation = false,\n validationHandler,\n showFrigadeBranding = false,\n onFormDataChange,\n showFooter = true,\n prefillData = {},\n updateUrlOnPageChange = false,\n}) => {\n const {\n getFlow,\n getFlowSteps,\n isLoading,\n targetingLogicShouldHideFlow,\n getFlowStatus,\n getCurrentStepIndex,\n markFlowCompleted,\n markFlowNotStarted,\n markStepStarted,\n } = useFlows()\n const selectedStep = getCurrentStepIndex(flowId)\n const { mergeAppearanceWithDefault } = useTheme()\n const [lastHashNavigationStepId, setLastHashNavigationStepId] = useState(null)\n const { setOpenFlowState, getOpenFlowState, hasOpenModals } = useFlowOpens()\n useFlowImpressions(flowId, visible)\n const steps = getFlowSteps(flowId)\n\n appearance = mergeAppearanceWithDefault(appearance)\n\n const [showModal, setShowModal] =\n visible !== undefined && setVisible !== undefined\n ? [visible, setVisible]\n : [getOpenFlowState(flowId, true), (value) => setOpenFlowState(flowId, value)]\n\n const hash = typeof window !== 'undefined' ? window.location.hash : null\n useEffect(() => {\n if (steps && steps.length > 0 && allowBackNavigation) {\n const stepIdFromHash =\n typeof window !== 'undefined' && window?.location?.hash\n ? window.location.hash.replace('#', '')\n : ''\n if (steps && steps?.length > 0) {\n let newStepIndex = -1\n if (stepIdFromHash) {\n const stepIdToGoTo = stepIdFromHash\n newStepIndex = steps.findIndex((step) => step.id === stepIdToGoTo)\n if (lastHashNavigationStepId === stepIdFromHash) {\n newStepIndex = -1\n }\n }\n if (newStepIndex !== -1) {\n setLastHashNavigationStepId(stepIdFromHash)\n markStepStarted(flowId, steps[newStepIndex].id)\n }\n }\n }\n }, [hash])\n\n useEffect(() => {\n if (\n !isLoading &&\n steps &&\n steps.length &&\n typeof window !== 'undefined' &&\n allowBackNavigation\n ) {\n setLastHashNavigationStepId(steps[selectedStep].id)\n window.location.hash = steps[selectedStep].id\n }\n }, [isLoading, selectedStep, steps])\n\n if (isLoading) {\n return null\n }\n const flow = getFlow(flowId)\n if (!flow) {\n return null\n }\n\n if (targetingLogicShouldHideFlow(flow)) {\n return null\n }\n\n if (!steps) {\n return null\n }\n\n if (visible !== undefined && visible === false) {\n return null\n }\n\n if (getFlowStatus(flowId) === COMPLETED_FLOW && hideOnFlowCompletion && !repeatable) {\n return null\n }\n\n if ((type == 'modal' || type == 'corner-modal') && hasOpenModals(flowId)) {\n return null\n }\n\n const handleClose = () => {\n setShowModal(false)\n if (onDismiss) {\n onDismiss()\n }\n if (endFlowOnDismiss === true) {\n markFlowCompleted(flowId)\n }\n }\n\n if ((modalPosition == 'center' && type === 'modal') || type === 'large-modal') {\n const overrideStyle: CSSProperties = {\n padding: '24px',\n }\n if (type === 'large-modal') {\n overrideStyle.width = '85%'\n overrideStyle.height = '90%'\n overrideStyle.maxHeight = '800px'\n overrideStyle.minHeight = '500px'\n overrideStyle.padding = '0'\n } else {\n overrideStyle.width = '400px'\n }\n return (\n <Modal\n appearance={appearance}\n onClose={handleClose}\n visible={showModal}\n style={overrideStyle}\n dismissible={dismissible}\n showFrigadeBranding={showFrigadeBranding}\n >\n <RenderInlineStyles appearance={appearance} />\n <FormContent\n appearance={appearance}\n steps={steps}\n selectedStep={selectedStep}\n customStepTypes={customStepTypes}\n customVariables={customVariables}\n onButtonClick={onButtonClick}\n onStepCompletion={onStepCompletion}\n flowId={flowId}\n type={type}\n hideOnFlowCompletion={hideOnFlowCompletion}\n onComplete={onComplete}\n setVisible={setVisible}\n setShowModal={setShowModal}\n onDismiss={onDismiss}\n showPagination={showPagination}\n customFormElements={customFormElements}\n allowBackNavigation={allowBackNavigation}\n validationHandler={validationHandler}\n onFormDataChange={onFormDataChange}\n showFooter={showFooter}\n prefillData={prefillData}\n updateUrlOnPageChange={updateUrlOnPageChange}\n repeatable={repeatable}\n />\n </Modal>\n )\n }\n\n if (type === 'modal' && modalPosition !== 'center') {\n return (\n <CornerModal\n appearance={appearance}\n onClose={handleClose}\n visible={showModal}\n modalPosition={modalPosition}\n >\n <RenderInlineStyles appearance={appearance} />\n <FormContent\n appearance={appearance}\n steps={steps}\n selectedStep={selectedStep}\n customStepTypes={customStepTypes}\n customVariables={customVariables}\n onButtonClick={onButtonClick}\n onStepCompletion={onStepCompletion}\n flowId={flowId}\n type={type}\n hideOnFlowCompletion={hideOnFlowCompletion}\n onComplete={onComplete}\n setVisible={setVisible}\n setShowModal={setShowModal}\n onDismiss={onDismiss}\n showPagination={showPagination}\n customFormElements={customFormElements}\n allowBackNavigation={allowBackNavigation}\n validationHandler={validationHandler}\n onFormDataChange={onFormDataChange}\n showFooter={showFooter}\n prefillData={prefillData}\n updateUrlOnPageChange={updateUrlOnPageChange}\n repeatable={repeatable}\n />\n </CornerModal>\n )\n }\n\n return (\n <>\n <RenderInlineStyles appearance={appearance} />\n <FormContent\n appearance={appearance}\n steps={steps}\n selectedStep={selectedStep}\n customStepTypes={customStepTypes}\n customVariables={customVariables}\n onButtonClick={onButtonClick}\n onStepCompletion={onStepCompletion}\n flowId={flowId}\n type={type}\n hideOnFlowCompletion={hideOnFlowCompletion}\n onComplete={onComplete}\n setVisible={setVisible}\n setShowModal={setShowModal}\n onDismiss={onDismiss}\n showPagination={showPagination}\n customFormElements={customFormElements}\n allowBackNavigation={allowBackNavigation}\n validationHandler={validationHandler}\n onFormDataChange={onFormDataChange}\n showFooter={showFooter}\n prefillData={prefillData}\n updateUrlOnPageChange={updateUrlOnPageChange}\n repeatable={repeatable}\n />\n </>\n )\n}\n\nexport default FrigadeForm\n","import React, { FC, useEffect, useState } from 'react'\nimport styled from 'styled-components'\n\nimport { ModalBackground } from './ModalBackground'\nimport { Close } from '../Icons/Close'\nimport { getClassName, getCustomClassOverrides, styleOverridesToCSS } from '../../shared/appearance'\nimport { Appearance } from '../../types'\nimport { Portal } from 'react-portal'\nimport { PoweredByFrigade } from '../branding/PoweredByFrigade'\nimport { PoweredByFrigadeModalRibbon } from '../branding/styled'\n\nconst ModalContainer = styled.div<{ appearance; maxWidth }>`\n ${(props) => getCustomClassOverrides(props)} {\n // Anything inside this block will be ignored if the user provides a custom class\n background-color: ${(props) => props.appearance?.theme?.colorBackground};\n /* Mobile */\n @media (max-width: 500px) {\n width: 90%;\n height: 90%;\n top: 50%;\n left: 50%;\n }\n\n width: ${(props) => props.width ?? '1000px'};\n z-index: 1500;\n border-radius: ${(props) => props.appearance?.theme?.borderRadius ?? 8}px;\n ${(props) => styleOverridesToCSS(props)}\n }\n\n padding: 32px;\n\n position: fixed;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n max-height: 90%;\n\n display: flex;\n flex-direction: column;\n box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.1);\n animation-duration: 0.15s;\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n animation-name: fadeIn;\n box-sizing: border-box;\n\n @keyframes fadeIn {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n }\n`\n\nconst ModalHeader = styled.div`\n position: relative;\n flex: 0 1 auto;\n`\n\nconst ModalClose = styled.div<{ appearance }>`\n position: absolute;\n top: 16px;\n right: 16px;\n cursor: pointer;\n z-index: 1501;\n ${(props) => getCustomClassOverrides(props)} {\n // Anything inside this block will be ignored if the user provides a custom class\n color: ${(props) => props.appearance?.theme?.colorText};\n }\n`\n\nconst Body = styled.div`\n overflow: scroll;\n flex: 1 1;\n display: flex;\n ::-webkit-scrollbar {\n display: none;\n }\n`\n\ninterface ModalProps {\n onClose: () => void\n visible: boolean\n headerContent?: React.ReactNode\n children: React.ReactNode\n style?: React.CSSProperties\n appearance?: Appearance\n dismissible?: boolean // defaults to true\n showFrigadeBranding?: boolean\n}\n\nexport const Modal: FC<ModalProps> = ({\n onClose,\n visible,\n headerContent = null,\n style = null,\n children,\n appearance,\n dismissible = true,\n showFrigadeBranding = false,\n}) => {\n const [initialBodyOverflow, setInitialBodyOverflow] = useState('')\n\n useEffect(() => {\n const initialOverflow = getComputedStyle(document.body).getPropertyValue('overflow')\n setInitialBodyOverflow(initialOverflow)\n }, [])\n\n // If user presses escape key, close modal\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose()\n }\n }\n document.addEventListener('keydown', handleEscape)\n\n return () => {\n document.removeEventListener('keydown', handleEscape)\n }\n }, [onClose])\n\n useEffect(() => {\n const bodyStyle = document.body.style\n\n if (visible) {\n bodyStyle.setProperty('overflow', 'hidden')\n } else {\n bodyStyle.setProperty('overflow', initialBodyOverflow)\n }\n\n return () => {\n bodyStyle.setProperty('overflow', initialBodyOverflow)\n }\n }, [visible])\n\n if (!visible) return <></>\n\n return (\n <Portal>\n <ModalBackground\n appearance={appearance}\n onClose={() => {\n if (dismissible) {\n onClose()\n }\n }}\n />\n <ModalContainer\n appearance={appearance}\n className={getClassName('modalContainer', appearance)}\n styleOverrides={style}\n >\n {dismissible && (\n <ModalClose\n className={getClassName('modalClose', appearance)}\n onClick={() => onClose()}\n appearance={appearance}\n >\n <Close />\n </ModalClose>\n )}\n {headerContent && <ModalHeader>{headerContent}</ModalHeader>}\n <Body>{children}</Body>\n\n {showFrigadeBranding && (\n <PoweredByFrigadeModalRibbon\n appearance={appearance}\n className={getClassName('poweredByFrigadeRibbon', appearance)}\n >\n <PoweredByFrigade appearance={appearance} />\n </PoweredByFrigadeModalRibbon>\n )}\n </ModalContainer>\n </Portal>\n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\nimport { getClassName, getCustomClassOverrides } from '../../shared/appearance'\n\nconst Background = styled.div`\n display: flex;\n justify-content: center;\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n ${(props) => getCustomClassOverrides(props)} {\n background-color: rgba(0, 0, 0, 0.6);\n z-index: 1400;\n }\n animation-duration: 0.15s;\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n animation-name: fadeIn;\n\n @keyframes fadeIn {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n }\n`\n\nexport const ModalBackground = ({ onClose, appearance }) => {\n return (\n <Background\n className={getClassName('modalBackground', appearance)}\n onClick={() => onClose()}\n ></Background>\n )\n}\n","import { Appearance } from '../types'\n\nexport const CSS_CLASS_PREFIX = 'fr-'\nexport const CUSTOM_CSS_STYLES_PREFIX = 'cfr-'\nconst defaultClass = '.fr-element'\n\nexport function getClassName(className: string, appearance?: Appearance) {\n const defaultClass = `${CSS_CLASS_PREFIX}${className}`\n if (!appearance) {\n return defaultClass\n }\n\n if (appearance.styleOverrides && appearance.styleOverrides[className]) {\n if (typeof appearance.styleOverrides[className] === 'string') {\n // It's a class name\n return defaultClass + ' ' + appearance.styleOverrides[className]\n } else if (typeof appearance.styleOverrides[className] === 'object') {\n // It's a style object\n return defaultClass + ' ' + CUSTOM_CSS_STYLES_PREFIX + className\n }\n }\n\n return defaultClass\n}\n\nexport function getCustomClassOverrides(props: any) {\n if (!props.className) {\n return ''\n }\n if (props.className.indexOf(CUSTOM_CSS_STYLES_PREFIX) !== -1) {\n return ''\n }\n\n // Remove any extra spaces from props.customClasses. Only allow one space per class.\n const customClasses = props.className.replace(/\\s+/g, ' ')\n const customClassesArray = customClasses.split(' ')\n if (customClassesArray.length == 1 && customClassesArray[0].startsWith(CSS_CLASS_PREFIX)) {\n return ''\n }\n return `:not(${customClassesArray\n .map((className: string) => {\n return `.${className}`\n })\n .join(', ')})`\n}\n\nexport function toKebabKey(key: string) {\n return key.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, '$1-$2').toLowerCase()\n}\n\nexport function styleOverridesToCSS(props: any) {\n return props?.styleOverrides\n ? Object.keys(props.styleOverrides)\n .map((key) => `${toKebabKey(key)}: ${props.styleOverrides[key]};`)\n .join(' ')\n : ''\n}\n\nexport function mergeClasses(...classes: string[]) {\n return classes.filter(Boolean).join(' ')\n}\n\nexport function ucFirst(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n","import React from 'react'\nimport styled from 'styled-components'\n\nconst CloseContainer = styled.div`\n :hover {\n opacity: 0.8;\n }\n`\n\nexport const Close = () => (\n <CloseContainer>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\" viewBox=\"0 0 20 20\">\n <path\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.5\"\n d=\"M5 15L15 5M5 5l10 10\"\n ></path>\n </svg>\n </CloseContainer>\n)\n","import React from 'react'\nimport FrigadeLogo from '../Icons/FrigadeLogo'\nimport { Appearance } from '../../types'\nimport { PoweredByFrigadeContainer } from './styled'\nimport { getClassName } from '../../shared/appearance'\n\nexport function PoweredByFrigade({ appearance }: { appearance: Appearance }) {\n return (\n <PoweredByFrigadeContainer\n className={getClassName('poweredByFrigadeContainer', appearance)}\n appearance={appearance}\n >\n Powered by &nbsp;\n <FrigadeLogo />\n </PoweredByFrigadeContainer>\n )\n}\n","import React, { CSSProperties } from 'react'\n\nfunction FrigadeLogo({ style, className }: { style?: CSSProperties; className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"54\"\n height=\"14\"\n fill=\"none\"\n viewBox=\"0 0 54 14\"\n style={style}\n className={className}\n >\n <path\n fill=\"currentColor\"\n d=\"M16.293 3.476v1.036h1.593v1.256h-1.593v5.098h-1.41V5.768H14V4.512h.883V3.244c0-.67.294-1.744 1.777-1.744.515 0 .969.049 1.361.146l-.233 1.232a5.939 5.939 0 00-.833-.073c-.442 0-.662.22-.662.67zm6.534.975V5.83c-.846 0-1.63.159-2.342.476v4.56h-1.41V4.513h1.263l.086.61c.846-.451 1.655-.67 2.403-.67zm2.505-.951c-.331.33-.944.33-1.287 0a.93.93 0 01-.246-.659c0-.268.086-.487.246-.646.343-.33.956-.33 1.287 0 .343.33.343.964 0 1.305zm.061 7.366h-1.41V4.512h1.41v6.354zm6.928-5.756c.246.146.368.402.368.756v4.976c0 1.804-.858 2.658-2.672 2.658-.92 0-1.753-.146-2.514-.439l.417-1.073c.674.22 1.336.33 1.974.33.98 0 1.385-.379 1.385-1.403v-.171c-.588.134-1.09.207-1.52.207-.907 0-1.655-.305-2.231-.902-.576-.598-.87-1.39-.87-2.354 0-.963.294-1.756.87-2.354.576-.61 1.324-.914 2.231-.914 1.005 0 1.864.232 2.562.683zm-2.488 4.634a5.15 5.15 0 001.446-.22V5.951a3.695 3.695 0 00-1.446-.292c-1.08 0-1.778.841-1.778 2.048 0 1.22.699 2.037 1.778 2.037zm7.34-5.317c1.52 0 2.28.878 2.28 2.634v3.805h-1.275l-.073-.524c-.601.414-1.288.621-2.084.621-1.263 0-2.06-.658-2.06-1.731 0-1.269 1.25-2.025 3.408-2.025.135 0 .503.013.662.013v-.171c0-1.012-.343-1.451-1.115-1.451-.675 0-1.435.158-2.256.475l-.466-1.012c1.017-.427 2.01-.634 2.979-.634zm-1.839 4.756c0 .427.343.695 1.017.695.528 0 1.251-.22 1.68-.512V8.22h-.441c-1.508 0-2.256.317-2.256.963zm9.953-4.549v-2.83h1.41v7.72c0 .354-.123.598-.368.757-.71.45-1.57.67-2.562.67-.907 0-1.655-.305-2.231-.902-.577-.61-.87-1.39-.87-2.354 0-.963.293-1.756.87-2.354.576-.61 1.324-.914 2.23-.914.43 0 .933.073 1.521.207zM43.84 9.72c.503 0 .981-.098 1.447-.293V5.854a5.15 5.15 0 00-1.447-.22c-1.078 0-1.777.817-1.777 2.037s.699 2.049 1.777 2.049zM54 7.866v.439h-4.573c.184.963.858 1.512 1.827 1.512.613 0 1.275-.146 1.986-.451l.466 1.024c-.87.378-1.729.573-2.575.573-.931 0-1.692-.304-2.268-.902-.576-.61-.87-1.402-.87-2.366 0-.975.294-1.768.87-2.366.576-.597 1.324-.902 2.244-.902.968 0 1.691.33 2.17.975.478.647.723 1.464.723 2.464zm-4.61-.586h3.298c-.086-1.073-.613-1.731-1.581-1.731-.969 0-1.582.695-1.717 1.731z\"\n ></path>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M1.196 1.229A4.009 4.009 0 014.08 0l4.092.027C9.183.027 10 .867 10 1.904c0 .6-.273 1.133-.7 1.478-.31.25-.7.399-1.126.4h-.001l-4.09-.027h-.002a4.804 4.804 0 00-2.614.77A4.986 4.986 0 000 5.974v-1.78C0 3.036.456 1.988 1.196 1.23zm4.525 4.65a4.282 4.282 0 00-1.184 2.513l3.637.023c.131 0 .259-.015.382-.042h.002c.81-.178 1.42-.908 1.44-1.788v-.046a1.9 1.9 0 00-.533-1.328 1.813 1.813 0 00-.908-.508h-.002l-.002-.001a1.68 1.68 0 00-.366-.042A4.084 4.084 0 005.72 5.88zm-4.525-.016A4.235 4.235 0 000 8.829C0 10.997 1.601 12.78 3.654 13V9.265h-.005l.005-.439v-.437h.023a5.175 5.175 0 011.439-3.13 5.05 5.05 0 01.72-.614l-1.754-.011H4.08c-.787 0-1.521.229-2.144.625a4.11 4.11 0 00-.74.603z\"\n clipRule=\"evenodd\"\n ></path>\n </svg>\n )\n}\n\nexport default FrigadeLogo\n","import styled from 'styled-components'\nimport { TooltipContainer } from '../Tooltips/styled'\n\nexport const PoweredByFrigadeModalRibbon = styled.div`\n background-color: ${(props) => props.appearance?.theme.colorBackground};\n position: absolute;\n bottom: -47px;\n left: 0;\n width: 100%;\n height: 40px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: ${(props) => props.appearance?.theme.borderRadius}px;\n`\n\nexport const PoweredByFrigadeTooltipRibbon = styled(TooltipContainer)`\n background-color: ${(props) => props.appearance?.theme.colorBackground};\n position: absolute;\n bottom: -60px;\n left: 0;\n width: 100%;\n height: 40px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: ${(props) => props.appearance?.theme.borderRadius}px;\n padding: 0;\n z-index: ${(props) => props.zIndex};\n`\n\nexport const PoweredByFrigadeContainer = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n font-style: normal;\n font-weight: 500;\n font-size: 12px;\n line-height: 18px;\n color: ${(props) => props.appearance?.theme?.colorTextSecondary};\n`\n","import styled from 'styled-components'\nimport { Appearance } from '../../types'\nimport { getCustomClassOverrides } from '../../shared/appearance'\n\nexport const TooltipContainer = styled.div<{ maxWidth: number; appearance: Appearance }>`\n ${(props) => getCustomClassOverrides(props)} {\n background: ${(props) => props.appearance.theme.colorBackground};\n }\n\n box-shadow: 0px 6px 25px rgba(0, 0, 0, 0.06);\n border-radius: ${(props) => props.appearance.theme.borderRadius}px;\n max-width: ${(props) => props.maxWidth}px;\n min-width: 300px;\n z-index: ${(props) => props.zIndex};\n overflow: hidden;\n`\nconst dismissWithImageStyle = `\n display: block;\n cursor: pointer;\n position: absolute;\n background-color: rgba(0, 0, 0, 0.2);\n color: #ffffff;\n padding: 4px;\n border-radius: 100px;\n border-width: 0px;\n top: 12px;\n right: 12px;\n box-sizing: border-box;\n :hover {\n opacity: 0.8;\n }`\n\nconst dismissWithoutImageStyle = `\n display: block;\n cursor: pointer;\n position: absolute;\n top: 12px;\n right: 12px;\n background-color: transparent;\n border: none;\n `\n\nexport const TooltipDismissButton = styled.button`\n ${(props) => getCustomClassOverrides(props)} {\n ${(props) => (props.hasImage ? dismissWithImageStyle : dismissWithoutImageStyle)};\n }\n`\n\nexport const TooltipImageContainer = styled.img`\n ${(props) => getCustomClassOverrides(props)} {\n display: block;\n width: 100%;\n height: auto;\n min-height: 200px;\n object-fit: cover;\n }\n`\n\nexport const TooltipVideoContainer = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n display: block;\n width: 100%;\n height: auto;\n margin-top: ${(props) => (props.dismissible ? '24px' : '0px')};\n object-fit: cover;\n }\n`\n\nexport const TooltipFooter = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-content: center;\n`\n\nexport const TooltipContentContainer = styled.div`\n padding: 22px 22px 12px;\n`\n\nexport const TooltipStepCountContainer = styled.div`\n display: flex;\n flex: 1;\n flex-direction: column;\n justify-content: center;\n`\n\nexport const TooltipCTAContainer = styled.div`\n display: flex;\n flex: 2;\n flex-shrink: 1;\n gap: 8px;\n height: 64px;\n ${(props) => getCustomClassOverrides(props)} {\n flex-direction: row;\n justify-content: ${(props) => (props.showStepCount ? 'flex-end' : 'flex-start')};\n align-content: center;\n align-items: center;\n }\n`\n\nexport const TooltipStepCounter = styled.p`\n ${(props) => getCustomClassOverrides(props)} {\n font-style: normal;\n font-weight: 600;\n font-size: 15px;\n line-height: 22px;\n color: #808080;\n }\n margin: 0;\n`\n","import React, { FC, useEffect, useState } from 'react'\nimport styled from 'styled-components'\nimport { Portal } from 'react-portal'\nimport { Appearance } from '../../types'\nimport { getClassName, getCustomClassOverrides } from '../../shared/appearance'\nimport { Close } from '../Icons/Close'\n\nfunction getModalPosition(\n modalPosition?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n) {\n switch (modalPosition) {\n case 'top-left':\n return `\n top: 0;\n left: 0;\n `\n case 'top-right':\n return `\n top: 0;\n right: 0;\n `\n case 'bottom-left':\n return `\n bottom: 0;\n left: 0;\n `\n }\n\n return `right: 0; bottom: 0;`\n}\n\nconst CornerModalContainer = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n // Anything inside this block will be ignored if the user provides a custom class\n background: ${(props) => props.appearance?.theme?.colorBackground};\n position: fixed;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n z-index: 1500;\n box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.1);\n border-radius: 12px;\n width: 350px;\n padding: 24px;\n }\n ${(props) => getModalPosition(props.modalPosition)}\n margin: 28px;\n`\n\nconst CornerModalHeader = styled.div`\n position: relative;\n flex: 1;\n`\n\nconst CornerModalClose = styled.div`\n position: absolute;\n top: 16px;\n right: 16px;\n cursor: pointer;\n z-index: 1501;\n ${(props) => getCustomClassOverrides(props)} {\n // Anything inside this block will be ignored if the user provides a custom class\n color: ${(props) => props.appearance?.theme?.colorText};\n }\n`\n\nconst Body = styled.div`\n overflow: scroll;\n flex: 5;\n ::-webkit-scrollbar {\n display: none;\n }\n`\n\ninterface CornerModalProps {\n onClose: () => void\n visible: boolean\n headerContent?: React.ReactNode\n children: React.ReactNode\n style?: React.CSSProperties\n appearance?: Appearance\n modalPosition?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n dismissible?: boolean\n}\n\nexport const CornerModal: FC<CornerModalProps> = ({\n onClose,\n visible,\n headerContent = null,\n children,\n appearance,\n modalPosition = 'bottom-right',\n dismissible = true,\n}) => {\n const [initialBodyOverflow, setInitialBodyOverflow] = useState('')\n\n useEffect(() => {\n const initialOverflow = getComputedStyle(document.body).getPropertyValue('overflow')\n setInitialBodyOverflow(initialOverflow)\n }, [])\n\n // If user presses escape key, close modal\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose()\n }\n }\n document.addEventListener('keydown', handleEscape)\n\n return () => {\n document.removeEventListener('keydown', handleEscape)\n }\n }, [onClose])\n\n useEffect(() => {\n const bodyStyle = document.body.style\n\n if (visible) {\n bodyStyle.setProperty('overflow', 'hidden')\n } else {\n bodyStyle.setProperty('overflow', initialBodyOverflow)\n }\n\n return () => {\n bodyStyle.setProperty('overflow', initialBodyOverflow)\n }\n }, [visible])\n\n if (!visible) return <></>\n\n return (\n <Portal>\n <CornerModalContainer\n appearance={appearance}\n className={getClassName('cornerModalContainer', appearance)}\n modalPosition={modalPosition}\n >\n {dismissible && (\n <CornerModalClose\n className={getClassName('cornerModalClose', appearance)}\n onClick={() => onClose()}\n >\n <Close />\n </CornerModalClose>\n )}\n {headerContent && <CornerModalHeader>{headerContent}</CornerModalHeader>}\n <Body>{children}</Body>\n </CornerModalContainer>\n </Portal>\n )\n}\n","import { useContext } from 'react'\nimport { FrigadeContext } from '../FrigadeProvider'\nimport { Appearance } from '../types'\n\nexport function useTheme() {\n const { defaultAppearance } = useContext(FrigadeContext)\n\n function mergeAppearanceWithDefault(appearance?: Appearance): Appearance {\n const _appearance = JSON.parse(JSON.stringify(defaultAppearance))\n\n if (!appearance) {\n return _appearance\n }\n\n return {\n styleOverrides: Object.assign(\n _appearance.styleOverrides ?? {},\n appearance.styleOverrides ?? {}\n ),\n theme: Object.assign(_appearance.theme, appearance.theme ?? {}),\n }\n }\n\n return { mergeAppearanceWithDefault }\n}\n","import React, { useContext, useEffect, useState } from 'react'\nimport styled from 'styled-components'\nimport {\n CustomFormTypeProps,\n FormInputProps,\n FormInputType,\n FormValidationError,\n} from '../../../FrigadeForm/types'\nimport { TextField } from './form-components/TextField'\nimport { MultipleChoice } from './form-components/MultipleChoice'\nimport { MultipleChoiceList } from './form-components/MultipleChoiceList'\nimport { TitleSubtitle } from '../../TitleSubtitle/TitleSubtitle'\nimport { getClassName } from '../../../shared/appearance'\nimport { useUser } from '../../../api/users'\nimport { Warning } from '../../Icons/Warning'\nimport { FrigadeContext } from '../../../FrigadeProvider'\n\ninterface MultiInputStepProps {\n data?: FormInputType[]\n}\n\nconst MultiInputContainer = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n overflow: visible;\n padding-top: 14px;\n`\n\nconst MultiInputValidationError = styled.div`\n color: ${(props) => props.appearance?.theme?.colorTextError};\n font-size: 12px;\n margin-bottom: 12px;\n display: flex;\n align-items: center;\n`\n\nconst MultiInputValidationErrorIcon = styled.div`\n margin-right: 4px;\n display: inline-flex;\n`\n\nconst MultiInput = styled.div`\n padding-left: 1px;\n padding-right: 1px;\n`\n\nconst DEFAULT_INPUT_TYPES: { [key: string]: (params: FormInputProps) => React.ReactNode } = {\n text: TextField,\n multipleChoice: MultipleChoice,\n multipleChoiceList: MultipleChoiceList,\n}\n\nexport const FORM_DATA_KEY_PREFIX = `frigade-multiInputStepTypeData`\n\nexport function MultiInputStepType({\n flowId,\n stepData,\n canContinue,\n setCanContinue,\n onSaveData,\n appearance,\n customFormElements,\n prefillData,\n}: CustomFormTypeProps) {\n const formElements = stepData.props as MultiInputStepProps\n const [formValidationErrors, setFormValidationErrors] = useState<FormValidationError[]>([])\n const [touchedInputs, setTouchedInputs] = useState<string[]>([])\n const { userId } = useUser()\n const [allFormData, setAllFormData] = useState(\n loadFromLocalStorage() || (prefillData ? prefillData[stepData.id] : null) || {}\n )\n const { readonly } = useContext(FrigadeContext)\n const mergedInputTypes = { ...DEFAULT_INPUT_TYPES, ...customFormElements }\n\n useEffect(() => {\n setCanContinue(formValidationErrors.length === 0)\n }, [formValidationErrors, setCanContinue])\n\n useEffect(() => {\n onSaveData(allFormData)\n }, [allFormData])\n\n function saveDataFromInputs(input: FormInputType, data: object) {\n setAllFormData((prevData) => {\n const newData = { ...prevData, [input.id]: data }\n if (typeof window !== 'undefined' && window.localStorage && !readonly) {\n window.localStorage.setItem(getLocalStorageKey(), JSON.stringify(newData))\n }\n return newData\n })\n }\n\n function loadFromLocalStorage() {\n if (typeof window !== 'undefined' && window.localStorage) {\n const data = window.localStorage.getItem(getLocalStorageKey())\n if (data) {\n return JSON.parse(data)\n }\n }\n return null\n }\n\n function getLocalStorageKey() {\n return `${FORM_DATA_KEY_PREFIX}-${flowId}-${stepData.id}-${userId}`\n }\n\n return (\n <MultiInput className={getClassName('multiInput', appearance)}>\n <TitleSubtitle appearance={appearance} title={stepData.title} subtitle={stepData.subtitle} />\n <MultiInputContainer className={getClassName('multiInputContainer', appearance)}>\n {formElements?.data?.map((input: FormInputType) => {\n const err = formValidationErrors.reverse().find((error) => error.id === input.id)\n return mergedInputTypes[input.type] ? (\n <span\n key={input.id}\n data-field-id={input.id}\n className={getClassName('multiInputField', appearance)}\n >\n {mergedInputTypes[input.type]({\n formInput: input,\n customFormTypeProps: {\n flowId,\n stepData,\n canContinue,\n setCanContinue,\n onSaveData,\n appearance,\n },\n onSaveInputData: (data) => {\n if (\n !touchedInputs.includes(input.id) &&\n // Ensure not empty string\n data &&\n data?.text !== ''\n ) {\n setTouchedInputs((prev) => [...prev, input.id])\n }\n saveDataFromInputs(input, data)\n },\n inputData: allFormData[input.id],\n setFormValidationErrors: (errors) => {\n if (errors.length === 0 && formValidationErrors.length === 0) {\n return\n }\n setFormValidationErrors((prev) => {\n if (errors.length === 0) {\n return prev.filter((error) => error.id !== input.id)\n }\n return [...prev, ...errors]\n })\n },\n })}\n {err && err.message && touchedInputs.includes(input.id) && err.hidden !== true && (\n <MultiInputValidationError\n key={input.id}\n style={{ overflow: 'hidden' }}\n appearance={appearance}\n className={getClassName('multiInputValidationError', appearance)}\n >\n <MultiInputValidationErrorIcon\n appearance={appearance}\n className={getClassName('multiInputValidationErrorIcon', appearance)}\n >\n <Warning />\n </MultiInputValidationErrorIcon>\n {err.message}\n </MultiInputValidationError>\n )}\n </span>\n ) : null\n })}\n </MultiInputContainer>\n </MultiInput>\n )\n}\n","import React, { useEffect, useState } from 'react'\n\nimport styled from 'styled-components'\nimport { FormInputProps, FormInputType } from '../../../../../FrigadeForm/types'\nimport { getClassName, getCustomClassOverrides } from '../../../../../shared/appearance'\nimport { Label } from '../shared/Label'\nimport { SubLabel } from '../shared/SubLabel'\nimport { getErrorsFromValidationResult } from '../shared/validation'\n\ninterface TextFieldProps extends FormInputType {\n id: string\n title?: string\n placeholder?: string\n multiline?: boolean\n}\n\nconst TextInputWrapper = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n`\n\nexport const TextInput = styled.input`\n ${(props) => getCustomClassOverrides(props)} {\n // Anything inside this block will be ignored if the user provides a custom class\n border: 1px solid ${(props) => props.appearance?.theme?.colorBorder};\n font-size: 14px;\n ::placeholder {\n color: ${(props) => props.appearance?.theme?.colorTextDisabled};\n font-size: 14px;\n }\n border-radius: 6px;\n }\n width: 100%;\n height: 40px;\n box-sizing: border-box;\n padding: 0 10px;\n margin-bottom: 10px;\n`\nconst TextArea = styled.textarea`\n ${(props) => getCustomClassOverrides(props)} {\n // Anything inside this block will be ignored if the user provides a custom class\n border: 1px solid ${(props) => props.appearance?.theme?.colorBorder};\n font-size: 14px;\n padding: 10px;\n ::placeholder {\n color: #c7c7c7;\n font-size: 14px;\n }\n border-radius: 6px;\n }\n width: 100%;\n min-height: 70px;\n box-sizing: border-box;\n margin-bottom: 10px;\n resize: none;\n`\n\nexport function TextField({\n formInput,\n customFormTypeProps,\n onSaveInputData,\n setFormValidationErrors,\n inputData,\n}: FormInputProps) {\n const input = formInput as TextFieldProps\n const [data, setData] = useState(inputData?.text || '')\n const [hasLoaded, setHasLoaded] = useState(false)\n const [hasGivenFocus, setHasGivenFocus] = useState(false)\n let InputComponent = TextInput\n useEffect(() => {\n if (data === '' && !hasLoaded) {\n setHasLoaded(true)\n handleDataChange('')\n }\n }, [])\n\n useEffect(() => {\n if (hasGivenFocus) {\n handleDataChange(data)\n return\n }\n }, [hasGivenFocus])\n\n function handleDataChange(value: string) {\n setData(value)\n onSaveInputData({ text: value })\n if (input.required === true && value.trim() === '') {\n setFormValidationErrors([\n {\n id: input.id,\n message: `${input.title ?? `Field`} is required`,\n hidden: !hasGivenFocus,\n },\n ])\n return\n }\n const validationError = getErrorsFromValidationResult(value, input.validation)\n if (validationError && (value.trim() !== '' || input.required === true)) {\n setFormValidationErrors([\n {\n id: input.id,\n message: validationError,\n hidden: !hasGivenFocus,\n },\n ])\n return\n }\n setFormValidationErrors([])\n }\n\n if (input.multiline) {\n InputComponent = TextArea\n }\n\n function getType() {\n switch (input?.validation?.type) {\n case 'email':\n return 'email'\n case 'number':\n return 'number'\n case 'password':\n return 'password'\n }\n\n return null\n }\n\n return (\n <TextInputWrapper>\n <Label\n title={input.title}\n required={input.required}\n appearance={customFormTypeProps.appearance}\n />\n <InputComponent\n className={getClassName('inputComponent', customFormTypeProps.appearance)}\n value={data}\n onChange={(e) => {\n handleDataChange(e.target.value)\n }}\n appearance={customFormTypeProps.appearance}\n placeholder={input.placeholder}\n type={getType()}\n onBlur={() => {\n setHasGivenFocus(true)\n }}\n ></InputComponent>\n <SubLabel title={input.subtitle} appearance={customFormTypeProps.appearance} />\n </TextInputWrapper>\n )\n}\n","import styled from 'styled-components'\nimport { getCustomClassOverrides } from '../../../../../shared/appearance'\n\nexport const FormLabel = styled.label`\n ${(props) => getCustomClassOverrides(props)} {\n font-size: 12px;\n line-height: 18px;\n margin-bottom: 5px;\n margin-top: 10px;\n font-style: normal;\n font-weight: 600;\n letter-spacing: 0.24px;\n }\n display: flex;\n`\n\nexport const FormSubLabel = styled.label`\n ${(props) => getCustomClassOverrides(props)} {\n font-size: 12px;\n line-height: 20px;\n margin-bottom: 5px;\n }\n display: flex;\n`\n\nexport const RequiredSymbol = styled.span`\n font-weight: 400;\n font-size: 14px;\n line-height: 22px;\n color: ${(props) => props.appearance?.theme?.colorTextError};\n display: flex;\n margin-right: 5px;\n margin-top: 10px;\n`\n\nexport const LabelWrapper = styled.div`\n display: flex;\n align-items: flex-start;\n justify-content: left;\n margin-bottom: 10px;\n`\n","import { FormLabel, LabelWrapper, RequiredSymbol } from './styled'\nimport { getClassName } from '../../../../../shared/appearance'\nimport React from 'react'\nimport { Appearance, DefaultAppearance } from '../../../../../types'\n\nexport function Label({\n title,\n required,\n appearance = DefaultAppearance,\n}: {\n title?: string\n required: boolean\n appearance?: Appearance\n}) {\n if (!title) {\n return null\n }\n\n return (\n <LabelWrapper className={getClassName('formLabelWrapper', appearance)}>\n {required ? (\n <RequiredSymbol\n className={getClassName('formLabelRequired', appearance)}\n appearance={appearance}\n >\n *\n </RequiredSymbol>\n ) : null}\n <FormLabel className={getClassName('formLabel', appearance)}>{title}</FormLabel>\n </LabelWrapper>\n )\n}\n","import React, { CSSProperties } from 'react'\n\nexport interface StepData {\n /**\n * Unique identifier for the step.\n */\n id: string\n /**\n * Name of the step when shown in a list view\n */\n stepName?: string\n /**\n * Title of the step\n */\n title?: string\n /**\n * Subtitle of the step\n */\n subtitle?: string\n /**\n * Primary button title. If omitted, the primary button will not be shown.\n */\n primaryButtonTitle?: string\n /**\n * Primary button URI.\n */\n primaryButtonUri?: string\n /**\n * Primary button URI target (either _blank or _self)\n */\n primaryButtonUriTarget?: string\n /**\n * Secondary button title. If omitted, the secondary button will not be shown.\n */\n secondaryButtonTitle?: string\n /**\n * Secondary button URI.\n */\n secondaryButtonUri?: string\n /**\n * Secondary button URI target (either _blank or _self)\n */\n secondaryButtonUriTarget?: string\n /**\n * Text on button if a back button is present\n */\n backButtonTitle?: string\n /**\n * If true, the step will be marked as completed when the secondary button is clicked.\n */\n skippable?: boolean\n /**\n * @deprecated use primaryButtonUri instead\n */\n url?: string\n /**\n * @deprecated use primaryButtonUriTarget instead\n */\n urlTarget?: string\n type?: string\n /**\n * Video url to be shown for components supporting video.\n */\n videoUri?: string\n /**\n * Image url to be shown for components supporting image.\n */\n imageUri?: string | null\n /**\n * Automatically mark the step as completed when the primary button is clicked. Default is false.\n */\n autoMarkCompleted?: boolean\n /**\n * Whether the step is completed.\n */\n complete: boolean\n /**\n * Whether the step has been started by the user. True if either the step was marked started or completed.\n */\n started: boolean\n /**\n * Whether the step is currently active/the flow is currently on this step. Can only be true for on step at a time.\n */\n currentlyActive: boolean\n /**\n * Whether the step is blocked (can't be accessed yet)\n */\n blocked?: boolean\n /**\n * Whether the step is hidden (not shown in the list view)\n */\n hidden?: boolean\n StepContent?: React.ReactNode\n /**\n * Handler for when the primary button is clicked.\n */\n handlePrimaryButtonClick?: () => void\n /**\n * Handler for when the secondary button is clicked.\n */\n handleSecondaryButtonClick?: () => void\n ctaActionType?: 'complete'\n props?: any\n /**\n * Criteria that needs to be met for the step to complete\n */\n completionCriteria?: string\n /**\n * Criteria that needs to be met for the step to start\n */\n startCriteria?: string\n progress?: number\n /**\n * Whether the step is dismissible (for instance, tooltips or other non-essential steps)\n */\n dismissible?: boolean\n /**\n * Whether to show a highlight in the page where the step is shown. Typically used in tooltips for creating small pings.\n */\n showHighlight?: boolean\n /**\n * Any other additional props defined in config.yml\n */\n [x: string | number | symbol]: unknown\n}\n\nexport interface DefaultFrigadeFlowProps {\n flowId: string\n style?: CSSProperties\n className?: string\n /**\n * The appearance of the flow. See https://docs.frigade.com/sdk/styling\n */\n appearance?: Appearance\n /**\n * Dynamic variables to use in config.yml. See https://docs.frigade.com/flows/dynamic-variables\n */\n customVariables?: { [key: string]: string | number | boolean }\n hideOnFlowCompletion?: boolean\n /**\n * Handler for when a step is completed.\n * @param step\n * @param index\n * @param nextStep\n * @param allFormData All form data collected so far (only applicable to FrigadeForms)\n * @param stepSpecificFormData Form data collected for the finished step (only applicable to FrigadeForms)\n */\n onStepCompletion?: (\n step: StepData,\n index: number,\n nextStep?: StepData,\n allFormData?: any,\n stepSpecificFormData?: any\n ) => boolean\n /**\n * Handler for when a primary or secondary CTA is clicked (regardless if step is completed or not).\n * Return true if your app performs an action (e.g. open other modal or page transition).\n * @param step\n * @param index\n * @param cta\n */\n onButtonClick?: (\n step: StepData,\n index?: number,\n cta?: 'primary' | 'secondary' | 'link' | 'back' | 'collapse' | 'expand',\n nextStep?: StepData\n ) => boolean\n\n onDismiss?: () => void\n onComplete?: () => void\n}\n\nexport interface Appearance {\n /**\n * Overrides of individual components and classes.\n * This map can either be className(s) or CSSProperties.\n */\n styleOverrides?: {\n [key: string]: CSSProperties | string\n }\n /**\n * The base theme to use with Frigade components.\n */\n theme?: BaseTheme\n}\n\nexport interface BaseTheme {\n /**\n * The base theme color used on CTAs and other primary elements.\n */\n colorPrimary?: string\n /**\n * Secondary color, used for CTAs and other secondary elements.\n */\n colorSecondary?: string\n\n colorBackground?: string\n colorBackgroundSecondary?: string\n colorText?: string\n colorTextOnPrimaryBackground?: string\n colorTextSecondary?: string\n colorTextDisabled?: string\n colorTextError?: string\n colorTextSuccess?: string\n colorBorder?: string\n fontSize?: string | number\n fontSmoothing?: string\n fontWeight?: string | number\n borderRadius?: number\n modalContainer?: CSSProperties\n}\n\nexport const DefaultAppearance: Appearance = {\n theme: {\n colorPrimary: '#0171F8',\n colorSecondary: '#2E343D',\n colorText: '#0F1114',\n colorBackground: '#ffffff',\n colorBackgroundSecondary: '#d2d2d2',\n colorTextOnPrimaryBackground: '#ffffff',\n colorTextSecondary: '#2E343D',\n colorTextDisabled: '#5A6472',\n colorBorder: '#E5E5E5',\n colorTextError: '#c00000',\n colorTextSuccess: '#00D149',\n borderRadius: 10,\n },\n}\n","import { FormSubLabel, LabelWrapper } from './styled'\nimport { getClassName } from '../../../../../shared/appearance'\nimport React from 'react'\nimport { Appearance } from '../../../../../types'\n\nexport function SubLabel({ title, appearance }: { title?: string; appearance: Appearance }) {\n if (!title) {\n return null\n }\n\n return (\n <LabelWrapper>\n <FormSubLabel className={getClassName('formSubLabel', appearance)}>{title}</FormSubLabel>\n </LabelWrapper>\n )\n}\n","import { InputValidation } from '../../../../../FrigadeForm/types'\nimport { z } from 'zod'\n\nexport function getErrorsFromValidationResult(\n value?: string,\n validation?: InputValidation\n): string | null {\n try {\n if (validation) {\n if (validation.type == 'number') {\n let validator = z.number()\n if (validation.props) {\n for (const validationProp of validation.props) {\n if (validationProp.requirement == 'min') {\n validator = validator.min(\n Number(validationProp.value),\n validationProp.message ?? 'Value is too small'\n )\n } else if (validationProp.requirement == 'max') {\n validator = validator.max(\n Number(validationProp.value),\n validationProp.message ?? 'Value is too large'\n )\n } else if (validationProp.requirement == 'positive') {\n validator = validator.positive(validationProp.message ?? 'Value must be positive')\n } else if (validationProp.requirement == 'negative') {\n validator = validator.nonpositive(validationProp.message ?? 'Value must be negative')\n }\n }\n }\n validator.parse(Number(value))\n }\n if (validation.type == 'string') {\n let validator = z.string()\n if (validation.props) {\n for (const validationProp of validation.props) {\n if (validationProp.requirement == 'min') {\n validator = validator.min(\n Number(validationProp.value),\n validationProp.message ?? 'Value is too short'\n )\n } else if (validationProp.requirement == 'max') {\n validator = validator.max(\n Number(validationProp.value),\n validationProp.message ?? 'Value is too long'\n )\n } else if (validationProp.requirement == 'regex') {\n validator = validator.regex(\n new RegExp(String(validationProp.value)),\n validationProp.message ?? 'Value does not match requirements'\n )\n }\n }\n }\n validator.parse(value)\n }\n\n return\n }\n } catch (e) {\n if (e instanceof z.ZodError) {\n if (e.issues && e.issues.length > 0) {\n return e.issues[0].message\n }\n return null\n }\n console.error('Frigade Form validation failed for rule ', validation, e)\n }\n\n return null\n}\n","import React, { useEffect, useState } from 'react'\n\nimport styled from 'styled-components'\nimport { FormInputProps, FormInputType } from '../../../../../FrigadeForm/types'\nimport { getClassName, getCustomClassOverrides } from '../../../../../shared/appearance'\nimport { Label } from '../shared/Label'\nimport { TextInput } from '../TextField'\nimport { SubLabel } from '../shared/SubLabel'\n\nconst NULL_VALUE = ''\n\ninterface MultipleChoiceProps extends FormInputType {\n id: string\n title?: string\n placeholder?: string\n defaultValue?: string\n requireSelection?: boolean\n props: {\n options?: MultipleChoiceOption[]\n }\n}\n\ninterface MultipleChoiceOption {\n id: string\n title: string\n isOpenEnded: boolean\n openEndedLabel?: string\n}\n\nconst MultipleChoiceWrapper = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n -webkit-appearance: none;\n appearance: none;\n`\n\nconst MultipleChoiceSelect = styled.select`\n ${(props) => getCustomClassOverrides(props)} {\n // Anything inside this block will be ignored if the user provides a custom class\n border: 1px solid ${(props) => props.appearance?.theme?.colorBorder};\n font-size: 14px;\n border-radius: 6px;\n }\n width: 100%;\n height: 40px;\n box-sizing: border-box;\n\n padding: 0 10px;\n margin-bottom: 10px;\n color: ${(props) =>\n props.value == ''\n ? props.appearance?.theme?.colorTextDisabled\n : props.appearance?.theme?.colorText};\n\n appearance: none;\n background-image: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'><path stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/></svg>\");\n background-position: right 0.5rem center;\n background-repeat: no-repeat;\n background-size: 1.5em 1.5em;\n -webkit-print-color-adjust: exact;\n`\n\nexport function MultipleChoice({\n formInput,\n customFormTypeProps,\n onSaveInputData,\n inputData,\n setFormValidationErrors,\n}: FormInputProps) {\n const input = formInput as MultipleChoiceProps\n const [hasLoaded, setHasLoaded] = useState(false)\n const [hasSelected, setHasSelected] = useState(false)\n\n useEffect(() => {\n if (!inputData?.choice?.[0] && !hasLoaded) {\n setHasLoaded(true)\n if (input.requireSelection) {\n onSaveInputData({ choice: [NULL_VALUE] })\n return\n }\n if (\n input.defaultValue &&\n input.props.options?.find((option) => option.id === input.defaultValue)\n ) {\n // Find input.props.options with id == defaultValue\n const defaultValue = input.props.options?.find((option) => option.id === input.defaultValue)\n onSaveInputData({ choice: [defaultValue.id] })\n } else {\n onSaveInputData({ choice: [input.props.options?.[0].id || ''] })\n }\n }\n }, [])\n\n useEffect(() => {\n if (!hasSelected) {\n return\n }\n if (input.requireSelection && inputData?.choice?.[0] === NULL_VALUE) {\n setFormValidationErrors([\n {\n message: 'Please select an option',\n id: input.id,\n },\n ])\n } else {\n setFormValidationErrors([])\n }\n }, [inputData?.choice?.[0], hasSelected])\n\n return (\n <MultipleChoiceWrapper>\n <Label\n title={input.title}\n required={false} // MultipleChoice is always required as it has a default value\n appearance={customFormTypeProps.appearance}\n />\n <MultipleChoiceSelect\n value={inputData?.choice?.[0]}\n onChange={(e) => {\n setHasSelected(true)\n onSaveInputData({ choice: [e.target.value] })\n }}\n placeholder={input.placeholder}\n appearance={customFormTypeProps.appearance}\n className={getClassName('multipleChoiceSelect', customFormTypeProps.appearance)}\n >\n {input.requireSelection && (\n <option key=\"null-value\" value={NULL_VALUE} disabled>\n {input.placeholder ?? `Select an option`}\n </option>\n )}\n {input.props.options?.map((option) => {\n return (\n <option key={option.id} value={option.id}>\n {option.title}\n </option>\n )\n })}\n </MultipleChoiceSelect>\n {/*// If selected data is option.isOpenEnded is true, render an input field*/}\n {input.props.options?.find((option) => option.id === inputData?.choice?.[0])?.isOpenEnded && (\n <>\n <Label\n title={\n input.props.options?.find((option) => option.id === inputData?.choice?.[0])\n ?.openEndedLabel ?? `Please specify`\n }\n required={false}\n appearance={customFormTypeProps.appearance}\n />\n <TextInput\n type=\"text\"\n placeholder=\"Enter your answer here\"\n onChange={(e) => {\n onSaveInputData({ choice: [e.target.value] })\n }}\n appearance={customFormTypeProps.appearance}\n />\n </>\n )}\n <SubLabel title={input.subtitle} appearance={customFormTypeProps.appearance} />\n </MultipleChoiceWrapper>\n )\n}\n","import React, { useEffect, useState } from 'react'\n\nimport styled from 'styled-components'\nimport { FormInputProps, MultipleChoiceListProps } from '../../../../../FrigadeForm/types'\nimport { getClassName, getCustomClassOverrides } from '../../../../../shared/appearance'\nimport { Label } from '../shared/Label'\nimport { SubLabel } from '../shared/SubLabel'\nimport { CheckBox } from '../../../../CheckBox'\n\nconst MultipleChoiceListWrapper = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n -webkit-appearance: none;\n appearance: none;\n`\n\nconst MultipleChoiceListItem = styled.button`\n ${(props) => getCustomClassOverrides(props)} {\n // Anything inside this block will be ignored if the user provides a custom class\n border: 1px solid ${(props) => props.appearance?.theme?.colorBorder};\n font-size: 14px;\n // Selector for when selected=true\n &[data-selected='true'] {\n border: 1px solid ${(props) => props.appearance.theme.colorPrimary};\n background-color: ${(props) => props.appearance.theme.colorPrimary}1a;\n }\n\n :hover {\n border: 1px solid ${(props) => props.appearance.theme.colorPrimary};\n }\n text-align: left;\n border-radius: 10px;\n }\n display: inline-flex;\n justify-content: space-between;\n align-items: center;\n cursor: pointer;\n width: 100%;\n height: 48px;\n padding: 0 18px;\n margin-bottom: 10px;\n`\n\nexport function MultipleChoiceList({\n formInput,\n customFormTypeProps,\n onSaveInputData,\n inputData,\n setFormValidationErrors,\n}: FormInputProps) {\n const input = formInput as MultipleChoiceListProps\n const [selectedIds, setSelectedIds] = useState<string[]>(inputData?.choice || [])\n const [hasLoaded, setHasLoaded] = useState(false)\n\n useEffect(() => {\n if (selectedIds.length == 0 && !hasLoaded) {\n setHasLoaded(true)\n onSaveInputData({ choice: [] })\n }\n }, [])\n\n useEffect(() => {\n onSaveInputData({ choice: selectedIds })\n }, [selectedIds])\n\n useEffect(() => {\n // Set errors if inputData does not meet min/max requirements and if field is required\n if (\n input.required &&\n (selectedIds.length < input.props.minChoices || selectedIds.length > input.props.maxChoices)\n ) {\n setFormValidationErrors([\n {\n message: ``,\n id: input.id,\n },\n ])\n } else {\n setFormValidationErrors([])\n }\n }, [selectedIds])\n\n return (\n <MultipleChoiceListWrapper>\n <Label\n title={input.title}\n required={input.required}\n appearance={customFormTypeProps.appearance}\n />\n {input.props.options?.map((option) => {\n return (\n <MultipleChoiceListItem\n appearance={customFormTypeProps.appearance}\n className={getClassName(\n selectedIds.includes(option.id)\n ? 'multipleChoiceListItemSelected'\n : 'multipleChoiceListItem',\n customFormTypeProps.appearance\n )}\n key={option.id}\n value={option.id}\n data-selected={selectedIds.includes(option.id)}\n onClick={() => {\n // If the option is already selected, remove it from the selectedIds\n if (selectedIds.includes(option.id)) {\n setSelectedIds(selectedIds.filter((id) => id !== option.id))\n return\n }\n // Select the input if we are still under maxChoices\n if (selectedIds.length < input.props.maxChoices) {\n setSelectedIds([...selectedIds, option.id])\n } else {\n if (selectedIds.length == 1 && input.props.maxChoices == 1) {\n // deselect the input if we are at maxChoices and minChoices is 1\n setSelectedIds([option.id])\n }\n }\n }}\n >\n {option.title}\n <CheckBox\n type=\"round\"\n primaryColor={customFormTypeProps.appearance.theme.colorPrimary}\n value={selectedIds.includes(option.id)}\n appearance={customFormTypeProps.appearance}\n />\n </MultipleChoiceListItem>\n )\n })}\n <SubLabel title={input.subtitle} appearance={customFormTypeProps.appearance} />\n </MultipleChoiceListWrapper>\n )\n}\n","import React, { CSSProperties, FC } from 'react'\nimport { ProgressRing } from '../Progress/ProgressRing'\nimport { getClassName, mergeClasses, styleOverridesToCSS } from '../../shared/appearance'\nimport { Appearance, DefaultAppearance } from '../../types'\nimport styled from 'styled-components'\n\nconst CheckIcon = ({ color = '#FFFFFF' }) => (\n <svg width={10} height={8} viewBox=\"0 0 10 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M1 4.34815L3.4618 7L3.4459 6.98287L9 1\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n\nconst BASE_CHECKBOX_STYLES_SQUARE: CSSProperties = {\n width: '22px',\n height: '22px',\n borderRadius: '8px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n}\n\nconst BASE_CHECKBOX_STYLES_ROUND: CSSProperties = {\n width: '22px',\n height: '22px',\n borderRadius: '40px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n}\n\nconst BASE_CHECKBOX_STYLES_SQUARE__CHECKED = {\n border: '1px solid #000000',\n color: '#FFFFFF',\n}\n\nconst BASE_CHECKBOX_STYLES_SQUARE__UNCHECKED = {\n border: '1px solid #C5CBD3',\n}\n\nconst BASE_CHECKBOX_STYLES_ROUND__CHECKED = {\n color: '#FFFFFF',\n}\n\nconst BASE_CHECKBOX_STYLES_ROUND__UNCHECKED = {\n border: '1px solid #C5CBD3',\n}\n\nconst getBaseStyle = (type: CheckBoxType): CSSProperties => {\n if (type === 'square') return BASE_CHECKBOX_STYLES_SQUARE\n else return BASE_CHECKBOX_STYLES_ROUND\n}\n\nconst getStateStyle = (type: CheckBoxType, checked: boolean): CSSProperties => {\n if (type === 'square')\n return checked ? BASE_CHECKBOX_STYLES_SQUARE__CHECKED : BASE_CHECKBOX_STYLES_SQUARE__UNCHECKED\n return checked ? BASE_CHECKBOX_STYLES_ROUND__CHECKED : BASE_CHECKBOX_STYLES_ROUND__UNCHECKED\n}\n\nexport type CheckBoxType = 'square' | 'round'\n\nexport interface CheckBoxProps {\n value: boolean\n type?: CheckBoxType\n primaryColor?: string\n progress?: number // progress percentage our of 1. e.g. 0.5\n appearance?: Appearance\n className?: string\n style?: React.CSSProperties\n}\n\nconst CheckIconContainer = styled.div`\n ${(props) => styleOverridesToCSS(props)}\n`\n\nexport const CheckBox: FC<CheckBoxProps> = ({\n value,\n type = 'round',\n primaryColor = '#000000',\n progress,\n appearance = DefaultAppearance,\n style,\n className,\n}) => {\n let checkBoxStyle = getBaseStyle(type as CheckBoxType)\n let stateStyle = getStateStyle(type as CheckBoxType, value)\n\n if (value === true) {\n checkBoxStyle = {\n ...checkBoxStyle,\n ...stateStyle,\n backgroundColor: appearance.theme.colorTextSuccess,\n borderColor: type === 'square' ? primaryColor : 'none',\n }\n } else {\n checkBoxStyle = {\n ...checkBoxStyle,\n ...stateStyle,\n }\n }\n\n if (value !== true && type === 'round' && progress !== undefined && progress !== 1) {\n return <ProgressRing fillColor={primaryColor} percentage={progress} size={22} />\n }\n\n return (\n <CheckIconContainer\n styleOverrides={checkBoxStyle}\n style={style}\n role=\"checkbox\"\n className={mergeClasses(\n getClassName('checkIconContainer', appearance),\n getClassName(\n value ? 'checkIconContainerChecked' : 'checkIconContainerUnchecked',\n appearance\n ),\n value ? 'checkIconContainerChecked' : 'checkIconContainerUnchecked',\n className\n )}\n >\n {value && <CheckIcon color={'#FFFFFF'} />}\n </CheckIconContainer>\n )\n}\n","import React, { FC } from 'react'\n\nconst Circle: FC<{ color: string; percentage?: number; size: number }> = ({\n color,\n percentage,\n size,\n}) => {\n const r = size * 0.5 - 2\n const circum = 2 * Math.PI * r\n const strokePct = (1 - percentage) * circum // where stroke will start, e.g. from 15% to 100%.\n\n return (\n <circle\n r={r}\n cx={size * 0.5}\n cy={size * 0.5}\n fill=\"transparent\"\n stroke={strokePct !== circum ? color : ''}\n strokeWidth={'3px'}\n strokeDasharray={circum}\n strokeDashoffset={percentage ? strokePct : 0}\n ></circle>\n )\n}\n\ninterface ProgressRingProps {\n fillColor: string\n size: number\n bgColor?: string\n percentage: number\n className?: string\n style?: React.CSSProperties\n children?: React.ReactNode\n}\n\nconst ProgressRing: FC<ProgressRingProps> = ({\n fillColor,\n size,\n percentage,\n children,\n bgColor = '#D9D9D9',\n className,\n style,\n}) => {\n return (\n <svg style={style} className={className} width={size} height={size} overflow=\"visible\">\n <g transform={`rotate(-90 ${`${size * 0.5} ${size * 0.5}`})`}>\n <Circle color={bgColor} size={size} />\n <Circle color={fillColor} percentage={Math.max(percentage, 0.1)} size={size} />\n </g>\n {children}\n </svg>\n )\n}\n\nexport default ProgressRing\n","import React from 'react'\n\nimport { Appearance } from '../../types'\nimport { getClassName, getCustomClassOverrides, ucFirst } from '../../shared/appearance'\nimport styled from 'styled-components'\nimport { sanitize } from '../../shared/sanitizer'\n\nconst HeaderTitle = styled.h1`\n ${(props) => getCustomClassOverrides(props)} {\n font-style: normal;\n font-weight: 700;\n font-size: ${(props) => (props.size == 'small' ? '15px' : '18px')};\n line-height: ${(props) => (props.size == 'small' ? '22px' : '24px')};\n letter-spacing: 0.36px;\n display: flex;\n align-items: center;\n margin-bottom: 4px;\n color: ${(props) => props.appearance.theme.colorText};\n }\n`\n\nconst HeaderSubtitle = styled.h2`\n ${(props) => getCustomClassOverrides(props)} {\n font-style: normal;\n font-weight: 400;\n font-size: 14px;\n line-height: 22px;\n letter-spacing: 0.28px;\n color: ${(props) => props.appearance.theme.colorTextSecondary};\n }\n`\n\nexport function TitleSubtitle({\n appearance,\n title,\n subtitle,\n size = 'medium',\n classPrefix = '',\n ariaPrefix = '',\n}: {\n appearance: Appearance\n title: string\n subtitle?: string\n size?: 'small' | 'medium' | 'large'\n classPrefix?: string\n ariaPrefix?: string\n}) {\n return (\n <>\n <HeaderTitle\n appearance={appearance}\n id={ariaPrefix ? `frigade${ariaPrefix}Title` : 'frigadeTitle'}\n className={getClassName(\n `${classPrefix}${classPrefix ? ucFirst(size) : size}Title`,\n appearance\n )}\n dangerouslySetInnerHTML={sanitize(title)}\n size={size}\n />\n {subtitle && (\n <HeaderSubtitle\n id={ariaPrefix ? `frigade${ariaPrefix}Subtitle` : 'frigadeSubtitle'}\n appearance={appearance}\n className={getClassName(\n `${classPrefix}${classPrefix ? ucFirst(size) : size}Subtitle`,\n appearance\n )}\n dangerouslySetInnerHTML={sanitize(subtitle)}\n size={size}\n />\n )}\n </>\n )\n}\n","import DOMPurify from 'dompurify'\n\nexport function sanitize(dirty?: string) {\n if (!dirty) {\n return { __html: '' }\n }\n return {\n __html: DOMPurify.sanitize(dirty, {\n ALLOWED_TAGS: [\n 'b',\n 'i',\n 'a',\n 'span',\n 'div',\n 'p',\n 'pre',\n 'u',\n 'br',\n 'img',\n 'code',\n 'li',\n 'ul',\n 'table',\n 'tbody',\n 'thead',\n 'tr',\n 'td',\n 'th',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n ],\n ALLOWED_ATTR: ['style', 'class', 'target', 'id', 'href', 'alt', 'src'],\n }),\n }\n}\n","import * as React from 'react'\n\nexport const Warning = (props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={12}\n height={12}\n aria-hidden=\"true\"\n viewBox=\"0 0 16 16\"\n {...props}\n >\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"m10.115 1.308 5.635 11.269A2.365 2.365 0 0 1 13.634 16H2.365A2.365 2.365 0 0 1 .25 12.577L5.884 1.308a2.365 2.365 0 0 1 4.231 0zM8 10.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3zM8 9c.552 0 1-.32 1-.714V4.714C9 4.32 8.552 4 8 4s-1 .32-1 .714v3.572C7 8.68 7.448 9 8 9z\"\n />\n </svg>\n)\n","import styled from 'styled-components'\n\nexport const FormCTAContainer = styled.div`\n align-items: center;\n display: flex;\n justify-content: ${(props) => (props.showBackButton ? 'space-between' : 'flex-end')};\n padding-top: 14px;\n`\n\nexport const FormCTAError = styled.div`\n color: ${(props) => props.appearance.theme.colorTextError};\n font-size: 12px;\n`\n\nexport const CTAWrapper = styled.div`\n display: flex;\n gap: 12px;\n width: 100%;\n justify-content: flex-end;\n`\nexport const FormContainer = styled.div`\n display: flex;\n // If type is set to large-modal, use padding 60px horizontal, 80px vertical\n // Otherwise, use 4px padding\n flex-direction: column;\n flex-grow: 1;\n flex-basis: 0;\n position: relative;\n`\n\nexport const FormContainerWrapper = styled.div`\n padding: ${(props) => (props.type === 'large-modal' ? '50px' : '0px')};\n position: relative;\n overflow-y: auto;\n`\n\nexport const FormContainerSidebarImage = styled.div`\n display: flex;\n align-self: stretch;\n flex-grow: 1;\n flex-basis: 0;\n // If props.image is set, use it as the background image\n background-image: ${(props) => (props.image ? `url(${props.image})` : 'none')};\n // scale background image to fit\n background-size: contain;\n background-position: center;\n border-top-right-radius: ${(props) => props.appearance.theme.borderRadius}px;\n border-bottom-right-radius: ${(props) => props.appearance.theme.borderRadius}px;\n`\n","import React, { FC } from 'react'\nimport { FrigadeFormType } from './index'\nimport { Button } from '../components/Button'\nimport { getClassName } from '../shared/appearance'\nimport { Appearance, StepData } from '../types'\nimport { CTAWrapper, FormCTAContainer, FormCTAError } from './styled'\n\ninterface FormFooterProps {\n step: StepData\n canContinue: boolean\n appearance: Appearance\n onPrimaryClick: () => void\n onSecondaryClick: () => void\n onBack: () => void\n formType: FrigadeFormType\n steps: StepData[]\n selectedStep: number\n allowBackNavigation: boolean\n errorMessage?: string\n isSaving?: boolean\n}\n\nexport const FormFooter: FC<FormFooterProps> = ({\n step,\n canContinue,\n appearance,\n onPrimaryClick,\n onSecondaryClick,\n selectedStep,\n steps,\n onBack,\n allowBackNavigation,\n errorMessage,\n isSaving,\n}) => {\n const showBackButton = steps.length > 1 && selectedStep != 0 && allowBackNavigation\n const buttonType =\n (step.primaryButtonTitle && step.secondaryButtonTitle) || showBackButton\n ? 'inline'\n : 'full-width'\n\n return (\n <>\n {errorMessage !== null && errorMessage != undefined && (\n <FormCTAError appearance={appearance} className={getClassName('formCTAError', appearance)}>\n {errorMessage}\n </FormCTAError>\n )}\n <FormCTAContainer\n showBackButton={showBackButton}\n className={getClassName('formCTAContainer', appearance)}\n >\n {showBackButton && (\n <Button\n title={step.backButtonTitle ?? 'Back'}\n onClick={onBack}\n secondary={true}\n withMargin={false}\n type={buttonType}\n appearance={appearance}\n style={{ width: '90px', maxWidth: '90px' }}\n classPrefix=\"back\"\n />\n )}\n <CTAWrapper className={getClassName('ctaWrapper', appearance)}>\n {step.secondaryButtonTitle ? (\n <Button\n title={step.secondaryButtonTitle}\n onClick={onSecondaryClick}\n secondary={true}\n withMargin={false}\n type={buttonType}\n appearance={appearance}\n disabled={isSaving}\n />\n ) : null}{' '}\n {step.primaryButtonTitle ? (\n <Button\n disabled={!canContinue}\n withMargin={false}\n title={step.primaryButtonTitle}\n onClick={onPrimaryClick}\n type={buttonType}\n appearance={appearance}\n loading={isSaving}\n />\n ) : null}\n </CTAWrapper>\n </FormCTAContainer>\n </>\n )\n}\n","import React, { CSSProperties, FC } from 'react'\nimport styled from 'styled-components'\nimport { Appearance } from '../../types'\nimport {\n getClassName,\n getCustomClassOverrides,\n styleOverridesToCSS,\n ucFirst,\n} from '../../shared/appearance'\nimport { Spinner } from '../Spinner'\n\ninterface ButtonProps {\n onClick?: () => void\n title?: string\n style?: CSSProperties\n textStyle?: CSSProperties\n disabled?: boolean\n type?: 'full-width' | 'inline'\n secondary?: boolean\n appearance?: Appearance\n withMargin?: boolean\n size?: 'small' | 'medium' | 'large'\n classPrefix?: string\n loading?: boolean\n autoFocus?: boolean\n}\n\nconst ButtonContainer = styled.button`\n justify-content: center;\n align-content: center;\n align-items: center;\n ${(props) => getCustomClassOverrides(props)} {\n display: flex;\n // Anything inside this block will be ignored if the user provides a custom class\n width: ${(props) => (props.type === 'full-width' ? '100%' : 'auto')};\n // Only add margin if prop withMargin is true\n ${(props) => (props.withMargin ? 'margin: 16px 0px 16px 0px;' : '')}\n\n border: 1px solid ${(props) =>\n props.secondary ? '#C5CBD3' : props?.appearance?.theme?.colorPrimary};\n color: ${(props) =>\n props.secondary\n ? props.appearance?.theme?.colorText\n : props.appearance?.theme?.colorTextOnPrimaryBackground};\n background-color: ${(props) =>\n props.secondary\n ? props.appearance?.theme?.colorBackground\n : props?.appearance?.theme?.colorPrimary};\n border-radius: ${(props) => props.appearance?.theme?.borderRadius}px;\n padding: ${(props) => (props.size == 'small' ? '6px 14px 6px 14px' : '8px 20px 8px 20px')};\n font-size: ${(props) => (props.size == 'small' ? '14px' : '15px')};\n line-height: 20px;\n font-weight: 500;\n ${(props) => styleOverridesToCSS(props)}\n }\n\n font-family: inherit;\n\n cursor: pointer;\n :hover {\n opacity: ${(props) => (props.loading == 'true' ? '1.0' : '0.8')};\n }\n\n :disabled {\n opacity: ${(props) => (props.loading == 'true' ? '1.0' : '0.3')};\n cursor: not-allowed;\n }\n`\n\nexport const MultipleButtonContainer = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n margin-top: 8px;\n\n & > * {\n margin-right: 8px;\n }\n }\n`\n\nexport const Button: FC<ButtonProps> = ({\n onClick,\n title,\n style,\n disabled,\n type = 'inline',\n size = 'medium',\n secondary = false,\n appearance,\n withMargin = true,\n classPrefix = '',\n loading = false,\n autoFocus = false,\n}) => {\n function getClassNameWithPrefix() {\n const name = secondary ? 'buttonSecondary' : 'button'\n if (classPrefix === '') {\n return name\n }\n\n return `${classPrefix}${ucFirst(name)}`\n }\n\n return (\n <ButtonContainer\n tabindex={secondary ? '0' : '1'}\n secondary={secondary}\n appearance={appearance}\n disabled={disabled || loading}\n loading={loading?.toString() ?? ''}\n onClick={onClick}\n styleOverrides={style}\n type={type}\n withMargin={withMargin}\n size={size}\n className={getClassName(getClassNameWithPrefix(), appearance)}\n autoFocus={autoFocus}\n >\n {loading ? (\n <Spinner className={getClassName('buttonLoader', appearance)} />\n ) : (\n title ?? `Continue`\n )}\n </ButtonContainer>\n )\n}\n","import styled from 'styled-components'\n\nexport const Spinner = styled.div`\n width: 24px;\n height: 24px;\n border: 3px solid rgba(255, 255, 255, 0.25);\n border-bottom-color: #fff;\n border-radius: 50%;\n display: inline-block;\n box-sizing: border-box;\n animation: rotation 0.75s linear infinite;\n\n @keyframes rotation {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n`\n","import React, { FC } from 'react'\nimport styled from 'styled-components'\n\nimport { useTheme } from '../hooks/useTheme'\nimport { Appearance } from '../types'\n\nconst Wrapper = styled.div`\n text-align: center;\n color: #e6e6e6;\n`\n\ninterface FormPaginationProps {\n stepCount: number\n currentStep: number\n appearance: Appearance\n className?: string\n}\n\nexport const FormPagination: FC<FormPaginationProps> = ({\n stepCount = 0,\n currentStep = 0,\n className,\n appearance,\n}) => {\n const { theme } = useTheme().mergeAppearanceWithDefault(appearance)\n\n return (\n <Wrapper className={className}>\n <svg\n width={16 * stepCount - 8}\n height={8}\n viewBox={`0 0 ${16 * stepCount - 8} 8`}\n fill=\"none\"\n >\n {Array(stepCount)\n .fill(null)\n .map((_, idx) => (\n <rect\n key={idx}\n x={16 * idx}\n y={0}\n width={8}\n height={8}\n rx={4}\n fill={currentStep === idx ? theme.colorPrimary : 'currentColor'}\n />\n ))}\n </svg>\n </Wrapper>\n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\nimport { CustomFormTypeProps } from '../../../FrigadeForm/types'\nimport { useCTAClickSideEffects } from '../../../hooks/useCTAClickSideEffects'\nimport { sanitize } from '../../../shared/sanitizer'\n\ninterface Link {\n title?: string\n uri?: string\n uriTarget?: string\n imageUri?: string\n}\n\n// create flex that wraps if not enoug space\nconst LinkContainer = styled.div`\n display: flex;\n flex-wrap: wrap;\n align-content: center;\n justify-content: center;\n`\n\nconst Link = styled.div`\n align-content: center;\n align-items: center;\n display: flex;\n flex-direction: column;\n justify-content: center;\n flex-grow: 1;\n box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.1);\n border-radius: 8px;\n margin: 15px;\n padding: 20px;\n flex-basis: 255px;\n flex-grow: 0;\n flex-shrink: 0;\n`\n\nconst LinkIcon = styled.img`\n width: 78px;\n height: auto;\n`\n\nconst LinkTitle = styled.button`\n font-style: normal;\n font-weight: 600;\n font-size: 13px;\n line-height: 16px;\n\n display: flex;\n align-items: center;\n text-align: center;\n border: 1px solid;\n border-radius: 100px;\n padding: 8px 12px;\n margin-top: 16px;\n`\n\nconst HeaderTitle = styled.h1`\n font-weight: 700;\n font-size: 28px;\n line-height: 34px;\n`\n\nconst HeaderSubtitle = styled.h2`\n font-style: normal;\n font-weight: 400;\n font-size: 16px;\n line-height: 24px;\n color: #7e7e7e;\n margin-top: 12px;\n margin-bottom: 16px;\n max-width: 70%;\n`\n\nexport function LinkCollectionStepType({ stepData, appearance }: CustomFormTypeProps) {\n const { handleUrl } = useCTAClickSideEffects()\n\n return (\n <div>\n <HeaderTitle dangerouslySetInnerHTML={sanitize(stepData.title)} />\n <HeaderSubtitle dangerouslySetInnerHTML={sanitize(stepData.subtitle)} />\n <LinkContainer>\n {stepData.props?.links?.map((link: Link) => (\n <Link key={link.title}>\n <LinkIcon src={link.imageUri} />\n <LinkTitle\n style={{\n borderColor: appearance.theme.colorPrimary,\n color: appearance.theme.colorPrimary,\n }}\n onClick={() => {\n if (link.uri) {\n handleUrl(link.uri, link.uriTarget ?? '_blank')\n }\n }}\n >\n {link.title}\n </LinkTitle>\n </Link>\n ))}\n </LinkContainer>\n </div>\n )\n}\n","import { StepData } from '../types'\nimport { FrigadeContext } from '../FrigadeProvider'\nimport { useContext } from 'react'\n\nexport function useCTAClickSideEffects() {\n const context = useContext(FrigadeContext)\n\n function primaryCTAClickSideEffects(step: StepData) {\n handleUrl(step.primaryButtonUri, step.primaryButtonUriTarget)\n }\n\n function secondaryCTAClickSideEffects(step: StepData) {\n handleUrl(step.secondaryButtonUri, step.secondaryButtonUriTarget)\n }\n\n function handleUrl(url?: string, target?: string) {\n if (!url) {\n return\n }\n // Check if url starts with http -- if so, default to _blank otherwise default to _self\n let updatedTarget = url.startsWith('http') ? '_blank' : '_self'\n\n if (target && target !== '_blank') {\n updatedTarget = '_self'\n }\n context.navigate(url, updatedTarget)\n }\n\n return {\n primaryCTAClickSideEffects,\n secondaryCTAClickSideEffects,\n handleUrl,\n }\n}\n","import React, { useEffect } from 'react'\nimport styled from 'styled-components'\nimport { CustomFormTypeProps, FormInputType } from '../../../FrigadeForm/types'\nimport { getClassName, getCustomClassOverrides } from '../../../shared/appearance'\nimport { TitleSubtitle } from '../../TitleSubtitle/TitleSubtitle'\nimport { VideoCard } from '../../Video/VideoCard'\n\ninterface CallToActionStepProps {\n data?: FormInputType[]\n}\n\n// create flex that wraps if not enoug space\nconst CallToActionStepContainer = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n`\n\nconst CallToActionImage = styled.img`\n ${(props) => getCustomClassOverrides(props)} {\n width: 100%;\n height: auto;\n max-height: 250px;\n margin-bottom: 24px;\n }\n`\n\nconst CallToActionTextContainer = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n margin-bottom: 24px;\n }\n`\n\nconst CallToActionVideo = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n width: 100%;\n height: auto;\n max-height: 250px;\n margin-bottom: 24px;\n }\n`\n\nexport function CallToActionStepType({\n stepData,\n appearance,\n setCanContinue,\n}: CustomFormTypeProps) {\n useEffect(() => {\n setCanContinue(true)\n }, [])\n\n return (\n <CallToActionStepContainer className={getClassName('callToActionContainer', appearance)}>\n <CallToActionTextContainer className={getClassName('callToActionTextContainer', appearance)}>\n <TitleSubtitle\n appearance={appearance}\n title={stepData.title}\n subtitle={stepData.subtitle}\n />\n </CallToActionTextContainer>\n {stepData.imageUri && (\n <CallToActionImage\n className={getClassName('callToActionImage', appearance)}\n src={stepData.imageUri}\n />\n )}\n {!stepData.imageUri && stepData.videoUri && (\n <CallToActionVideo\n appearance={appearance}\n className={getClassName('callToActionVideo', appearance)}\n >\n <VideoCard appearance={appearance} videoUri={stepData.videoUri} />\n </CallToActionVideo>\n )}\n </CallToActionStepContainer>\n )\n}\n","import React, { CSSProperties } from 'react'\n\nexport const Play = ({\n style,\n className,\n}: {\n color?: string\n style?: CSSProperties\n className?: string\n}) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className={className}\n style={style}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15.91 11.672a.375.375 0 010 .656l-5.603 3.113a.375.375 0 01-.557-.328V8.887c0-.286.307-.466.557-.327l5.603 3.112z\"\n />\n </svg>\n)\n","import { Play } from '../Icons/Play'\nimport { Appearance } from '../../types'\nimport React, { useRef, useState } from 'react'\nimport styled from 'styled-components'\nimport { getClassName } from '../../shared/appearance'\n\nconst VideoPlayerWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex-direction: column;\n width: 100%;\n height: 100%;\n position: relative;\n`\n\nconst PlayIconWrapper = styled.div`\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n cursor: pointer;\n :hover {\n opacity: 0.6;\n }\n z-index: 10;\n\n > svg {\n width: 40px;\n height: 40px;\n color: ${(props) => props.appearance.theme.colorBackground};\n box-shadow: 0px 6px 25px rgba(0, 0, 0, 0.06);\n border-radius: 50%;\n }\n`\nconst Video = styled.video`\n width: 100%;\n height: 100%;\n border-radius: ${(props) => props.appearance.theme.borderRadius}px;\n`\nconst YouTubeVideoSource = styled.iframe`\n width: 100%;\n height: 100%;\n min-height: 260px;\n border-radius: ${(props) => props.appearance.theme.borderRadius}px;\n`\n\nconst VimeoVideoSource = styled.iframe`\n width: 100%;\n height: 100%;\n min-height: 400px;\n border-radius: ${(props) => props.appearance.theme.borderRadius}px;\n`\nconst WistiaVideoSource = styled.iframe`\n width: 100%;\n height: 100%;\n min-height: 400px;\n border-radius: ${(props) => props.appearance.theme.borderRadius}px;\n`\n\nexport function VideoCard({\n appearance,\n videoUri,\n autoplay = false,\n}: {\n appearance: Appearance\n videoUri: string\n autoplay?: boolean\n}) {\n // Create ref to use with videoplayer\n\n const ref = useRef<any>()\n\n const [isPlaying, setIsPlaying] = useState(autoplay)\n\n if (videoUri.includes('youtube')) {\n let videoId = videoUri.split('v=')[1]\n const ampersandPosition = videoId.indexOf('&')\n if (ampersandPosition !== -1) {\n videoId = videoId.substring(0, ampersandPosition)\n }\n return (\n <YouTubeVideoSource\n width=\"100%\"\n height=\"100%\"\n src={`https://www.youtube.com/embed/${videoId}`}\n frameBorder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n appearance={appearance}\n className={getClassName('youtubePlayer', appearance)}\n />\n )\n }\n // Check if vimeo\n if (videoUri.includes('vimeo')) {\n let videoId = videoUri.split('vimeo.com/')[1]\n const ampersandPosition = videoId.indexOf('&')\n if (ampersandPosition !== -1) {\n videoId = videoId.substring(0, ampersandPosition)\n }\n return (\n <VimeoVideoSource\n width=\"100%\"\n height=\"100%\"\n src={`https://player.vimeo.com/video/${videoId}`}\n frameBorder=\"0\"\n allow=\"autoplay; fullscreen; picture-in-picture\"\n allowFullScreen\n appearance={appearance}\n className={getClassName('vimeoPlayer', appearance)}\n />\n )\n }\n // Check if wistia\n if (videoUri.includes('wistia')) {\n let videoId = videoUri.split('wistia.com/medias/')[1]\n const ampersandPosition = videoId.indexOf('&')\n if (ampersandPosition !== -1) {\n videoId = videoId.substring(0, ampersandPosition)\n }\n return (\n <WistiaVideoSource\n width=\"100%\"\n height=\"100%\"\n src={`https://fast.wistia.net/embed/iframe/${videoId}`}\n frameBorder=\"0\"\n allow=\"autoplay; fullscreen; picture-in-picture\"\n allowFullScreen\n appearance={appearance}\n className={getClassName('wistiaPlayer', appearance)}\n />\n )\n }\n\n return (\n <VideoPlayerWrapper\n className={getClassName('videoPlayerWrapper', appearance)}\n appearance={appearance}\n >\n {!isPlaying && (\n <PlayIconWrapper\n onClick={() => {\n setIsPlaying(true)\n ref.current.play()\n }}\n appearance={appearance}\n className={getClassName('playIconWrapper', appearance)}\n >\n <Play />\n </PlayIconWrapper>\n )}\n <Video\n appearance={appearance}\n controls={isPlaying}\n ref={ref}\n play={isPlaying}\n src={videoUri}\n autoPlay={autoplay}\n muted={autoplay}\n />\n </VideoPlayerWrapper>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { CheckBox } from '../../CheckBox'\nimport { getClassName } from '../../../shared/appearance'\nimport {\n ItemIcon,\n SelectItem,\n SelectItemLeft,\n SelectItemText,\n SelectListHeader,\n SelectListSelectionContainer,\n SelectListSubtitle,\n SelectListTitle,\n} from './styled'\nimport { CustomFormTypeProps, MultipleChoiceProps } from '../../../FrigadeForm/types'\n\nexport const SelectListStepType = ({\n stepData,\n setCanContinue,\n onSaveData,\n appearance,\n}: CustomFormTypeProps) => {\n const multipleChoiceProps = stepData.props as MultipleChoiceProps\n const [selectedIds, setSelectedIds] = useState<string[]>([])\n const [hasLoaded, setHasLoaded] = useState(false)\n const [lastStepId, setLastStepId] = useState(stepData.id)\n\n useEffect(() => {\n if (selectedIds.length == 0 && !hasLoaded) {\n setHasLoaded(true)\n onSaveData({ choice: [] })\n }\n }, [hasLoaded])\n\n useEffect(() => {\n if (lastStepId !== stepData.id) {\n setLastStepId(stepData.id)\n setSelectedIds([])\n }\n }, [stepData])\n\n useEffect(() => {\n onSaveData({ choice: selectedIds })\n if (selectedIds.length >= multipleChoiceProps.minChoices) {\n setCanContinue(true)\n } else {\n setCanContinue(false)\n }\n }, [selectedIds])\n\n return (\n <SelectListSelectionContainer className={getClassName('selectListContainer', appearance)}>\n <SelectListHeader>\n <SelectListTitle className={getClassName('selectListTitle', appearance)}>\n {stepData.title}\n </SelectListTitle>\n <SelectListSubtitle\n appearance={appearance}\n className={getClassName('selectListSubtitle', appearance)}\n >\n {stepData.subtitle}\n </SelectListSubtitle>\n </SelectListHeader>\n {multipleChoiceProps.options.map((option, idx) => {\n const isSelected = selectedIds.includes(option.id)\n return (\n <SelectItem\n key={`select-item-${idx}`}\n onClick={() => {\n // If the option is already selected, remove it from the selectedIds\n if (selectedIds.includes(option.id)) {\n setSelectedIds(selectedIds.filter((id) => id !== option.id))\n return\n }\n // Select the input if we are still under maxChoices\n if (selectedIds.length < multipleChoiceProps.maxChoices) {\n setSelectedIds([...selectedIds, option.id])\n } else {\n if (selectedIds.length == 1 && multipleChoiceProps.maxChoices == 1) {\n // deselect the input if we are at maxChoices and minChoices is 1\n setSelectedIds([option.id])\n }\n }\n }}\n hideBottomBorder={idx === multipleChoiceProps.options.length - 1}\n className={getClassName('selectListSelectItem', appearance)}\n >\n <SelectItemLeft className={getClassName('selectListItemImage', appearance)}>\n {option.imageUri && <ItemIcon src={option.imageUri} alt={`select-icon-${idx}`} />}\n <SelectItemText\n appearance={appearance}\n className={getClassName('selectListSelectItemText', appearance)}\n >\n {option.title}\n </SelectItemText>\n </SelectItemLeft>\n <CheckBox\n appearance={appearance}\n value={isSelected}\n primaryColor={appearance.theme.colorPrimary}\n />\n </SelectItem>\n )\n })}\n </SelectListSelectionContainer>\n )\n}\n","import styled from 'styled-components'\n\nexport const SelectListSelectionContainer = styled.div`\n width: auto;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n padding: 4px;\n`\n\nexport const SelectListHeader = styled.div`\n width: 100%;\n text-align: left;\n`\n\nexport const SelectListTitle = styled.h1<{ appearance }>`\n font-style: normal;\n font-weight: 700;\n font-size: 32px;\n line-height: 38px;\n color: ${(props) => props.appearance?.theme?.colorText};\n`\n\nexport const SelectListSubtitle = styled.h1<{ appearance }>`\n font-style: normal;\n font-weight: 400;\n font-size: 16px;\n line-height: 27px;\n margin-top: 16px;\n margin-bottom: 16px;\n color: ${(props) => props.appearance?.theme?.colorTextSecondary};\n`\n\nexport const SelectItem = styled.div<{ hideBottomBorder }>`\n padding-top: 12px;\n padding-bottom: 12px;\n flex-direction: row;\n display: flex;\n justify-content: space-between;\n align-items: center;\n align-content: center;\n cursor: pointer;\n border-bottom: ${(props) => (props.hideBottomBorder ? 'none' : '1px solid #D8D8D8')};\n width: 100%;\n`\n\nexport const SelectItemLeft = styled.div`\n padding-top: 10px;\n padding-bottom: 10px;\n flex-direction: row;\n display: flex;\n justify-content: flex-start;\n`\n\nexport const ItemIcon = styled.img`\n width: 42px;\n height: 42px;\n margin-right: 12px;\n`\n\nexport const SelectItemText = styled.p`\n font-style: normal;\n font-weight: 500;\n font-size: 17px;\n line-height: 21px;\n color: ${(props) => props.appearance?.theme?.colorText};\n display: flex;\n align-self: center;\n`\n","import {\n FORM_DATA_KEY_PREFIX,\n MultiInputStepType,\n} from '../components/Forms/MultiInputStepType/MultiInputStepType'\nimport { Appearance, StepData } from '../types'\nimport { FormContainer, FormContainerSidebarImage, FormContainerWrapper } from './styled'\nimport { getClassName } from '../shared/appearance'\nimport { FormFooter } from './FormFooter'\nimport { FormPagination } from './FormPagination'\nimport { LinkCollectionStepType } from '../components/Forms/LinkCollectionStepType'\nimport { CallToActionStepType } from '../components/Forms/CallToActionStepType/CallToActionStepType'\nimport { SelectListStepType } from '../components/Forms/SelectListStepType/SelectListStepType'\nimport { useCTAClickSideEffects } from '../hooks/useCTAClickSideEffects'\nimport { FrigadeFormProps, FrigadeFormType } from './index'\nimport React, { FC, useEffect, useState } from 'react'\nimport { CustomFormTypeProps, FormInputProps } from './types'\nimport { useFlows } from '../api/flows'\n\nconst AnimationWrapper = ({ children, id, shouldWrap = false }) => {\n return (\n <>\n {shouldWrap ? (\n <div\n key={id}\n style={{\n width: '100%',\n height: '100%',\n position: 'absolute',\n top: 0,\n left: 0,\n zIndex: 1,\n overflowY: 'auto',\n }}\n >\n {children}\n </div>\n ) : (\n children\n )}\n </>\n )\n}\n\ninterface FormContentProps extends FrigadeFormProps {\n appearance: Appearance\n steps: StepData[]\n selectedStep: number\n customStepTypes?: {\n [key: string]: ((params: CustomFormTypeProps) => React.ReactNode) | React.ReactNode\n }\n type: FrigadeFormType\n setShowModal: (showModal: boolean) => void\n setVisible?: (visible: boolean) => void\n showPagination?: boolean\n customFormElements?: { [key: string]: (params: FormInputProps) => React.ReactNode }\n allowBackNavigation: boolean\n}\nexport const FormContent: FC<FormContentProps> = ({\n appearance,\n steps,\n selectedStep,\n customStepTypes,\n customVariables,\n onButtonClick,\n onStepCompletion,\n flowId,\n type,\n hideOnFlowCompletion,\n onComplete,\n setVisible,\n setShowModal,\n onDismiss,\n showPagination = false,\n customFormElements,\n allowBackNavigation,\n validationHandler,\n onFormDataChange,\n showFooter,\n prefillData,\n updateUrlOnPageChange,\n repeatable,\n}) => {\n const DEFAULT_CUSTOM_STEP_TYPES = {\n linkCollection: LinkCollectionStepType,\n multiInput: MultiInputStepType,\n callToAction: CallToActionStepType,\n selectList: SelectListStepType,\n }\n\n const mergedCustomStepTypes = { ...DEFAULT_CUSTOM_STEP_TYPES, ...customStepTypes }\n const { primaryCTAClickSideEffects, secondaryCTAClickSideEffects } = useCTAClickSideEffects()\n\n const [canContinue, setCanContinue] = useState(false)\n const [formData, setFormData] = useState({})\n const [isSaving, setIsSaving] = useState(false)\n const [errorMessage, setErrorMessage] = useState<string | null | undefined>(null)\n\n const currentStep = steps[selectedStep] ?? null\n const {\n markStepCompleted,\n markStepStarted,\n isLoading,\n updateCustomVariables,\n markFlowCompleted,\n } = useFlows()\n\n useEffect(() => {\n updateCustomVariables(customVariables)\n }, [customVariables, isLoading])\n\n useEffect(() => {\n if (onFormDataChange) {\n onFormDataChange(formData, getDataPayload(), steps[selectedStep], selectedStep)\n }\n }, [formData])\n\n function getDataPayload() {\n const data = formData[steps[selectedStep].id] ?? {}\n return {\n data: data,\n stepId: steps[selectedStep].id,\n customVariables: customVariables,\n }\n }\n\n function handleStepCompletionHandlers(step: StepData, cta: 'primary' | 'secondary', idx: number) {\n const maybeNextStep = selectedStep + 1 < steps.length ? steps[selectedStep + 1] : null\n if (onStepCompletion) {\n onStepCompletion(step, idx, maybeNextStep, formData, getDataPayload())\n }\n if (onButtonClick) {\n return onButtonClick(step, selectedStep, cta, maybeNextStep)\n }\n return true\n }\n\n function updateData(step: StepData, data: object) {\n setFormData((prevState) => {\n let newObj = {}\n newObj[step.id] = data\n return {\n ...prevState,\n ...newObj,\n }\n })\n }\n\n function FormContainerSidebar(props: { selectedStep: StepData }) {\n if (props.selectedStep.imageUri) {\n return (\n <FormContainerSidebarImage\n image={props.selectedStep.imageUri}\n appearance={appearance}\n className={getClassName('formContainerSidebarImage', appearance)}\n />\n )\n }\n return null\n }\n\n const formFooter = showFooter && (\n <FormFooter\n step={steps[selectedStep]}\n canContinue={canContinue && !isSaving}\n formType={type}\n selectedStep={selectedStep}\n appearance={appearance}\n onPrimaryClick={async () => {\n setIsSaving(true)\n if (validationHandler) {\n const validationError = await validationHandler(\n steps[selectedStep],\n selectedStep,\n steps[selectedStep + 1],\n formData,\n getDataPayload()\n )\n if (validationError !== true) {\n // check if validation error is a string\n if (typeof validationError === 'string') {\n setErrorMessage(validationError)\n } else {\n setErrorMessage(null)\n }\n setIsSaving(false)\n return\n } else {\n setErrorMessage(null)\n }\n }\n const payload = { ...getDataPayload() }\n await markStepCompleted(flowId, steps[selectedStep].id, payload)\n if (\n selectedStep + 1 < steps.length &&\n // the url hash will control current step if allowBackNavigation is true\n !allowBackNavigation\n ) {\n await markStepStarted(flowId, steps[selectedStep + 1].id)\n }\n const shouldClose = handleStepCompletionHandlers(\n steps[selectedStep],\n 'primary',\n selectedStep\n )\n if (selectedStep + 1 >= steps.length) {\n if (onComplete) {\n onComplete()\n }\n if (onDismiss) {\n onDismiss()\n }\n if (hideOnFlowCompletion && shouldClose) {\n if (setVisible) {\n setVisible(false)\n }\n setShowModal(false)\n }\n await markFlowCompleted(flowId)\n if (repeatable) {\n // Set index back to 0\n await markStepStarted(flowId, steps[0].id)\n // Clear all cached form fill data\n if (typeof window !== 'undefined' && window.localStorage) {\n const localStorageKeys = Object.keys(window.localStorage)\n localStorageKeys.forEach((key) => {\n if (key.startsWith(FORM_DATA_KEY_PREFIX)) {\n window.localStorage.removeItem(key)\n }\n })\n }\n }\n }\n primaryCTAClickSideEffects(steps[selectedStep])\n setIsSaving(false)\n if (\n typeof window !== 'undefined' &&\n !allowBackNavigation &&\n updateUrlOnPageChange &&\n selectedStep + 1 < steps.length\n ) {\n // Update the current url with a query param p=stepId -- only use when allowbacknavigation is false\n const url = new URL(window.location.href)\n url.searchParams.set('p', steps[selectedStep + 1].id)\n window.history.pushState({}, '', url.toString())\n }\n }}\n onSecondaryClick={() => {\n handleStepCompletionHandlers(steps[selectedStep], 'secondary', selectedStep)\n secondaryCTAClickSideEffects(steps[selectedStep])\n }}\n onBack={async () => {\n if (selectedStep - 1 >= 0) {\n setIsSaving(true)\n await markStepStarted(flowId, steps[selectedStep - 1].id)\n setIsSaving(false)\n }\n }}\n steps={steps}\n allowBackNavigation={allowBackNavigation}\n errorMessage={errorMessage}\n isSaving={isSaving}\n />\n )\n\n return (\n <>\n <FormContainer className={getClassName('formContainer', appearance)}>\n <AnimationWrapper id={selectedStep} shouldWrap={type === 'large-modal'}>\n <FormContainerWrapper\n key={currentStep.id}\n type={type}\n className={getClassName('formContent', appearance)}\n >\n {steps.map((step) => {\n const StepComponent = mergedCustomStepTypes[step.type ?? 'multiInput']\n\n if (currentStep.id !== step.id) {\n return null\n }\n\n // Check if StepComponent is a function\n if (typeof StepComponent !== 'function') {\n return StepComponent\n }\n\n return (\n <StepComponent\n key={step.id}\n stepData={step}\n canContinue={canContinue}\n setCanContinue={setCanContinue}\n onSaveData={(data) => {\n updateData(step, data)\n }}\n appearance={appearance}\n customFormElements={customFormElements}\n flowId={flowId}\n prefillData={prefillData}\n />\n )\n })}\n {showPagination && (\n <FormPagination\n className={getClassName('formPagination', appearance)}\n appearance={appearance}\n stepCount={steps.length}\n currentStep={selectedStep}\n />\n )}\n {formFooter}\n </FormContainerWrapper>\n </AnimationWrapper>\n {type == 'large-modal' && <FormContainerSidebar selectedStep={steps[selectedStep]} />}\n </FormContainer>\n </>\n )\n}\n","import React from 'react'\nimport { Appearance } from '../types'\nimport { createGlobalStyle } from 'styled-components'\nimport { CUSTOM_CSS_STYLES_PREFIX, toKebabKey } from '../shared/appearance'\n\nconst GlobalStyleComponent = createGlobalStyle`\n${(props) =>\n props.inlineStyles\n .map(([key, value]) => {\n return `.${CUSTOM_CSS_STYLES_PREFIX}${key}.${CUSTOM_CSS_STYLES_PREFIX}${key} { ${Object.entries(\n value\n )\n .map(([key, value]) => {\n if (typeof value === 'object') {\n // This is a selector. Render it.\n return `${key} { ${Object.entries(value)\n .map(([nestedKey, nestedValue]) => {\n let kebabKey = toKebabKey(nestedKey)\n\n return `${kebabKey}: ${nestedValue};`\n })\n .join(' ')} }`\n }\n\n let kebabKey = toKebabKey(key)\n\n return `${kebabKey}: ${value};`\n })\n .join(' ')} }`\n })\n .join(' ')}`\n\nexport function RenderInlineStyles({ appearance }: { appearance?: Appearance }) {\n if (!appearance || !appearance.styleOverrides) {\n return <></>\n }\n const inlineStyles = Object.entries(appearance.styleOverrides).filter(([_, value]) => {\n return typeof value === 'object'\n })\n\n if (inlineStyles.length === 0) {\n return <></>\n }\n\n return <GlobalStyleComponent inlineStyles={inlineStyles} />\n}\n","import { useEffect, useState } from 'react'\nimport { NOT_STARTED_FLOW } from '../api/common'\nimport { useFlows } from '../api/flows'\n\nexport function useFlowImpressions(flowId: string, visible: boolean = true) {\n const [hasMarkedFlowStarted, setHasMarkedFlowStarted] = useState(false)\n const {\n markStepStarted,\n isLoading,\n getFlowStatus,\n getFlowSteps,\n getCurrentStepIndex,\n targetingLogicShouldHideFlow,\n getFlow,\n } = useFlows()\n const steps = getFlowSteps(flowId)\n\n async function markFlowStartedIfNeeded() {\n if (\n !hasMarkedFlowStarted &&\n !isLoading &&\n getFlowStatus(flowId) === NOT_STARTED_FLOW &&\n targetingLogicShouldHideFlow(getFlow(flowId)) === false &&\n visible &&\n steps &&\n steps.length > 0\n ) {\n setHasMarkedFlowStarted(true)\n await markStepStarted(flowId, steps[getCurrentStepIndex(flowId)].id)\n }\n }\n\n useEffect(() => {\n markFlowStartedIfNeeded()\n }, [isLoading, flowId, visible])\n\n return {}\n}\n","import React, { useCallback, useContext, useEffect } from 'react'\nimport { FrigadeContext } from '../FrigadeProvider'\nimport { useCheckHasInitiatedAPI, useConfig, useGracefulFetch } from './common'\nimport { useUserFlowStates } from './user-flow-states'\nimport { GUEST_PREFIX } from './users'\nimport { EntityProperties } from '../FrigadeForm/types'\n\ninterface AddPropertyToOrganizationDTO {\n readonly foreignUserId: string\n readonly foreignUserGroupId: string\n readonly properties?: { [key: string]: string | boolean | number | null }\n readonly events?: OrganizationEvent[]\n}\n\ninterface OrganizationEvent {\n readonly event: string\n readonly properties?: { [key: string]: string | boolean | number | null }\n}\n\nexport function useOrganization(): {\n readonly organizationId: string | null\n readonly setOrganizationId: React.Dispatch<React.SetStateAction<string | null>>\n readonly setOrganizationIdWithProperties: (\n organizationId: string,\n properties?: EntityProperties\n ) => Promise<void>\n readonly addPropertiesToOrganization: (properties: EntityProperties) => Promise<void>\n readonly trackEventForOrganization: (\n event: string,\n properties?: EntityProperties\n ) => Promise<void>\n} {\n const {\n organizationId: organizationIdInternal,\n userId,\n setOrganizationId,\n } = useContext(FrigadeContext)\n const { mutateUserFlowState } = useUserFlowStates()\n const { config, apiUrl } = useConfig()\n const gracefullyFetch = useGracefulFetch()\n const { verifySDKInitiated } = useCheckHasInitiatedAPI()\n\n function getUserGroupKey(uId?: string, oId?: string) {\n return `frigade-user-group-registered-${uId}-${oId}`\n }\n\n useEffect(() => {\n // Check if user is not a guest\n\n if (userId && organizationIdInternal) {\n // Check if userid begins with the guest prefix\n if (userId.startsWith(GUEST_PREFIX)) {\n return\n }\n const userRegisteredKey = getUserGroupKey(userId, organizationIdInternal)\n // Check if user has already been registered in frigade\n if (!localStorage.getItem(userRegisteredKey)) {\n // Register user in frigade\n gracefullyFetch(`${apiUrl}userGroups`, {\n ...config,\n method: 'POST',\n body: JSON.stringify({\n foreignUserId: userId,\n foreignUserGroupId: organizationIdInternal,\n }),\n })\n // Mark user as registered in frigade\n localStorage.setItem(userRegisteredKey, 'true')\n }\n }\n }, [userId, organizationIdInternal])\n\n const addPropertiesToOrganization = useCallback(\n async (properties: EntityProperties) => {\n if (!verifySDKInitiated()) {\n return\n }\n if (!organizationIdInternal || !userId) {\n console.error(\n 'Cannot add properties to organization: Organization ID and User ID must both be set.',\n { organizationIdInternal, userId }\n )\n return\n }\n\n const data: AddPropertyToOrganizationDTO = {\n foreignUserId: userId,\n foreignUserGroupId: organizationIdInternal,\n properties,\n }\n await gracefullyFetch(`${apiUrl}userGroups`, {\n ...config,\n method: 'POST',\n body: JSON.stringify(data),\n })\n mutateUserFlowState()\n },\n [organizationIdInternal, userId, config, mutateUserFlowState]\n )\n\n const trackEventForOrganization = useCallback(\n async (event: string, properties?: EntityProperties) => {\n if (!verifySDKInitiated()) {\n return\n }\n if (!organizationIdInternal || !userId) {\n console.error(\n 'Cannot track event for organization: Organization ID and User ID must both be set.',\n { organizationIdInternal, userId }\n )\n return\n }\n const eventData: OrganizationEvent = {\n event,\n properties,\n }\n const data: AddPropertyToOrganizationDTO = {\n foreignUserId: userId,\n foreignUserGroupId: organizationIdInternal,\n events: [eventData],\n }\n await gracefullyFetch(`${apiUrl}userGroups`, {\n ...config,\n method: 'POST',\n body: JSON.stringify(data),\n })\n mutateUserFlowState()\n },\n [organizationIdInternal, userId, config, mutateUserFlowState]\n )\n\n const setOrganizationIdWithProperties = useCallback(\n async (organizationId: string, properties?: EntityProperties) => {\n if (!verifySDKInitiated()) {\n return\n }\n if (properties) {\n const userRegisteredKey = getUserGroupKey(userId, organizationId)\n localStorage.setItem(userRegisteredKey, 'true')\n setOrganizationId(organizationId)\n const data: AddPropertyToOrganizationDTO = {\n foreignUserId: userId,\n foreignUserGroupId: organizationId,\n properties,\n }\n await gracefullyFetch(`${apiUrl}userGroups`, {\n ...config,\n method: 'POST',\n body: JSON.stringify(data),\n })\n mutateUserFlowState()\n } else {\n setOrganizationId(organizationId)\n }\n },\n [userId, config, mutateUserFlowState]\n )\n\n return {\n organizationId: organizationIdInternal,\n setOrganizationId,\n setOrganizationIdWithProperties,\n addPropertiesToOrganization,\n trackEventForOrganization,\n }\n}\n","import { deepmerge } from './deepmerge'\n\nconst THEME_MAP = {\n // { oldThemeKey: 'path.to.new.theme.token' }\n colorPrimary: 'colors.primary.background',\n colorText: 'colors.neutral.foreground',\n colorBackground: 'colors.neutral.background',\n colorBackgroundSecondary: 'colors.secondary.background',\n colorTextOnPrimaryBackground: 'colors.primary.foreground',\n colorTextSecondary: 'colors.secondary.foreground',\n colorTextDisabled: 'colors.gray700',\n colorBorder: 'colors.gray800',\n colorTextError: 'colors.negative.foreground',\n borderRadius: 'radii.lg',\n}\n\n// Convert appearance.theme prop (old) to theme tokens for overrides prop (new)\nfunction themeToTokens(theme) {\n if (!theme) return undefined\n\n const overrides = {}\n\n Object.entries(theme).forEach(([key, value]) => {\n if (THEME_MAP[key]) {\n // Step 1: 'foo.bar.baz' -> ['foo', 'bar', 'baz']\n const levels = THEME_MAP[key].split('.')\n\n // Step 2: ['foo', 'bar', 'baz'] -> { foo: { bar: { baz: value } } }\n let currentLevel = overrides\n levels.forEach((nextLevel, i) => {\n if (!currentLevel[nextLevel]) {\n currentLevel[nextLevel] = i === levels.length - 1 ? value : {}\n }\n\n currentLevel = currentLevel[nextLevel]\n })\n }\n })\n\n return overrides\n}\n\nfunction styleOverridesToCSS(styleOverrides) {\n // Walk overrides and convert them to CSS descendent selectors\n // ...that's pretty much it?\n if (!styleOverrides) return undefined\n\n // We don't want to reference the original object\n const copiedOverrides = deepmerge({}, styleOverrides)\n\n const css = {}\n\n Object.keys(copiedOverrides).forEach((oldSelector) => {\n const newSelector = `.fr-${oldSelector}`\n\n css[newSelector] = copiedOverrides[oldSelector]\n })\n\n return css\n}\n\nexport function appearanceToOverrides(appearance) {\n const { theme, styleOverrides } = appearance\n\n const overrides = themeToTokens(theme)\n const css = styleOverridesToCSS(styleOverrides)\n\n return {\n overrides,\n css,\n }\n}\n","import styled from 'styled-components'\nimport { compose, variant } from 'styled-system'\n\nimport { Box } from '../Box'\n\nexport const buttonVariants = {\n Primary: {\n backgroundColor: 'primary.background',\n color: 'primary.foreground',\n\n '&:hover': {\n backgroundColor: 'blue400',\n },\n },\n Secondary: {\n backgroundColor: 'white',\n border: '1px solid',\n borderColor: 'gray800',\n color: 'neutral.foreground',\n\n '&:hover': {\n backgroundColor: 'blue900',\n },\n },\n Link: {\n backgroundColor: 'transparent',\n color: 'primary.inverted',\n },\n Plain: {\n backgroundColor: 'transparent',\n color: 'neutral.foreground',\n },\n} as const\n\nexport const buttonSizes = {\n sm: {\n paddingX: 4,\n paddingY: 1,\n },\n md: {\n paddingX: 6,\n paddingY: 2,\n },\n}\n\nexport const StyledButton = styled(Box)(\n () => ({\n whiteSpace: 'nowrap',\n }),\n compose(\n variant({\n scale: 'components.Button',\n variants: 'components.Button',\n }),\n variant({\n prop: 'size',\n variants: buttonSizes,\n })\n )\n)\n\n// export type ButtonVariant = keyof typeof buttonVariants\n// export type ButtonSize = keyof typeof buttonSizes\n","import React, { ComponentPropsWithoutRef, CSSProperties, ElementType, ReactNode } from 'react'\nimport styled, { ThemeProvider, useTheme } from 'styled-components'\nimport {\n border,\n BorderProps,\n color,\n ColorProps,\n compose,\n get,\n LayoutProps,\n shadow,\n ShadowProps,\n space,\n SpaceProps,\n system,\n typography,\n TypographyProps,\n} from 'styled-system'\nimport { deepmerge } from '../../shared/deepmerge'\n\ninterface Overrides extends Record<string, Overrides | CSSProperties> {}\n\n// Drop the size property from layout props, it conflicts with our own size prop\n// SEE: https://github.com/styled-system/styled-system/blob/master/packages/layout/src/index.js\nconst layoutWithoutSize = {\n width: {\n property: 'width',\n scale: 'sizes',\n transform: (n, scale) =>\n get(scale, n, !(typeof n === 'number' && !isNaN(n)) || n > 1 ? n : n * 100 + '%'),\n },\n height: {\n property: 'height',\n scale: 'sizes',\n },\n minWidth: {\n property: 'minWidth',\n scale: 'sizes',\n },\n minHeight: {\n property: 'minHeight',\n scale: 'sizes',\n },\n maxWidth: {\n property: 'maxWidth',\n scale: 'sizes',\n },\n maxHeight: {\n property: 'maxHeight',\n scale: 'sizes',\n },\n overflow: true,\n overflowX: true,\n overflowY: true,\n display: true,\n verticalAlign: true,\n}\n\nexport type BoxProps<T extends ElementType = 'div'> = {\n as?: T\n css?: Record<string, any> // TODO: Fix any\n children?: ReactNode\n overrides?: Overrides\n} & BorderProps &\n ColorProps &\n Exclude<LayoutProps, 'size'> &\n ShadowProps &\n SpaceProps &\n TypographyProps &\n ComponentPropsWithoutRef<T>\n\nconst StyledBox = styled('div')(\n ({ css }) => css,\n compose(border, color, shadow, space, typography, system(layoutWithoutSize))\n)\n\nexport const Box = <T extends React.ElementType = 'div'>({\n as,\n children,\n overrides,\n ...rest\n}: BoxProps<T>) => {\n const theme = useTheme()\n\n const styleResetProps = {\n border: 'none',\n boxSizing: 'border-box',\n m: 0,\n p: 0,\n }\n\n const renderBox = () => (\n <StyledBox as={as} {...styleResetProps} {...rest}>\n {children}\n </StyledBox>\n )\n\n if (overrides !== undefined) {\n const newTheme = deepmerge(theme, overrides)\n\n return <ThemeProvider theme={newTheme}>{renderBox()}</ThemeProvider>\n }\n\n return renderBox()\n}\n","import styled from 'styled-components'\nimport { variant, system } from 'styled-system'\n\nimport { Box } from '../Box'\n\nexport const textVariants = {\n Display1: {\n fontSize: '5xl',\n fontWeight: 'bold',\n letterSpacing: 'md',\n lineHeight: '4xl',\n },\n Display2: {\n fontSize: '4xl',\n fontWeight: 'bold',\n letterSpacing: 'md',\n lineHeight: '3xl',\n },\n H1: {\n fontSize: '3xl',\n fontWeight: 'bold',\n letterSpacing: 'md',\n lineHeight: '2xl',\n },\n H2: {\n fontSize: '2xl',\n fontWeight: 'bold',\n letterSpacing: 'md',\n lineHeight: 'xl',\n },\n H3: {\n fontSize: 'xl',\n fontWeight: 'bold',\n letterSpacing: 'md',\n lineHeight: 'lg',\n },\n H4: {\n fontSize: 'lg',\n fontWeight: 'bold',\n letterSpacing: 'md',\n lineHeight: 'md',\n },\n Body1: {\n fontSize: 'md',\n fontWeight: 'regular',\n letterSpacing: 'md',\n lineHeight: 'md',\n },\n Body2: {\n fontSize: 'sm',\n fontWeight: 'regular',\n letterSpacing: 'md',\n lineHeight: 'md',\n },\n Caption: {\n fontSize: 'xs',\n fontWeight: 'regular',\n letterSpacing: 'md',\n lineHeight: 'sm',\n },\n} as const\n\nexport const fontWeights = {\n regular: 400,\n semibold: 600,\n bold: 700,\n}\n\nexport const StyledText = styled(Box)(\n variant({\n scale: 'components.Text',\n variants: 'components.Text',\n }),\n system({\n fontWeight: {\n property: 'fontWeight',\n scale: 'fontWeights',\n },\n })\n)\n","import { buttonVariants } from '../components/Button/Button.styles'\nimport { textVariants } from '../components/Text/Text.styles'\n\nconst SPACE_VALUE = 4\nconst SPACE_UNIT = 'px'\nconst SPACE_SCALE_EXTENT = 20\n\n// Fill an array with SPACE_SCALE_EXTENT multiples of SPACE_VALUE\nconst spaceScale = Object.fromEntries(\n Array.from(Array(SPACE_SCALE_EXTENT + 1), (_, i) => {\n // Just a cute lil' 0.5 space would you look at this tiny guy over here\n if (i === 0) {\n return [0.5, `${0.5 * SPACE_VALUE}${SPACE_UNIT}`]\n }\n\n return [i, `${i * SPACE_VALUE}${SPACE_UNIT}`]\n })\n)\n\nconst palette = {\n black: '#000000',\n gray100: '#14161A',\n gray200: '#181B20',\n gray300: '#1F2329',\n gray400: '#2E343D',\n gray500: '#4C5766',\n gray600: '#5A6472',\n gray700: '#C5CBD3',\n gray800: '#E2E5E9',\n gray900: '#F1F2F4',\n white: '#ffffff',\n blue400: '#015AC6',\n blue500: '#0171F8',\n blue800: '#DBECFF',\n blue900: '#F5F9FF',\n green400: '#009E37',\n green500: '#00D149',\n green800: '#DBFFE8',\n transparent: '#FFFFFF00',\n\n // This color isn't in the Design System yet, but it's used in old components\n red500: '#c00000',\n}\n\nexport const tokens = {\n colors: {\n ...palette,\n\n neutral: {\n foreground: palette.gray300,\n },\n primary: {\n background: palette.blue500,\n foreground: palette.white,\n inverted: palette.blue500,\n },\n negative: {\n foreground: palette.red500,\n },\n },\n fonts: {\n default: 'TT Interphases Pro, sans-serif',\n },\n fontSizes: {\n xs: '12px',\n sm: '14px',\n md: '16px',\n lg: '18px',\n xl: '20px',\n '2xl': '24px',\n '3xl': '30px',\n '4xl': '36px',\n '5xl': '48px',\n },\n fontWeights: {\n regular: 400,\n semibold: 500,\n bold: 700,\n },\n letterSpacings: {\n md: '0.02em',\n },\n lineHeights: {\n xs: '18px',\n sm: '22px',\n md: '24px',\n lg: '26px',\n xl: '30px',\n '2xl': '38px',\n '3xl': '46px',\n '4xl': '60px',\n },\n radii: {\n md: '8px',\n lg: '20px',\n round: '50%',\n },\n shadows: {\n md: '0px 4px 20px rgba(0, 0, 0, 0.06)',\n },\n space: spaceScale,\n components: {\n Button: buttonVariants,\n Text: textVariants,\n },\n}\n","import React, { CSSProperties } from 'react'\nimport { FrigadeChecklist } from '../../FrigadeChecklist'\nimport { HeroChecklistProps } from '../Checklists/HeroChecklist'\nimport { StepData } from '../../types'\n\nexport interface FrigadeHeroChecklistProps extends HeroChecklistProps {\n flowId: string\n title?: string\n subtitle?: string\n primaryColor?: string\n\n onCompleteStep?: (index: number, stepData: StepData) => void\n style?: CSSProperties\n // Optional props\n initialSelectedStep?: number\n\n className?: string\n}\n\nexport const FrigadeHeroChecklist: React.FC<FrigadeHeroChecklistProps> = (props) => {\n return <FrigadeChecklist type=\"inline\" {...props} />\n}\n","import React, { CSSProperties, useEffect, useState } from 'react'\n\nimport { useFlows } from '../api/flows'\nimport { HeroChecklist, HeroChecklistProps } from '../components/Checklists/HeroChecklist'\nimport { StepData } from '../types'\nimport { COMPLETED_FLOW, COMPLETED_STEP } from '../api/common'\nimport { useFlowOpens } from '../api/flow-opens'\nimport { RenderInlineStyles } from '../components/RenderInlineStyles'\n\nimport { ChecklistWithGuide } from '../components/Checklists/ChecklistWithGuide'\nimport { useCTAClickSideEffects } from '../hooks/useCTAClickSideEffects'\nimport { useTheme } from '../hooks/useTheme'\nimport { CondensedChecklist } from '../components/Checklists/CondensedChecklist'\nimport { Modal } from '../components/Modal'\nimport { CarouselChecklist } from '../components/Checklists/CarouselChecklist'\nimport { useFlowImpressions } from '../hooks/useFlowImpressions'\n\nexport interface FrigadeChecklistProps extends HeroChecklistProps {\n flowId: string\n title?: string\n subtitle?: string\n\n style?: CSSProperties\n // Optional props\n /** @ignore */\n initialSelectedStep?: number\n\n className?: string\n type?: 'inline' | 'modal'\n checklistStyle?: 'with-guide' | 'default' | 'condensed' | 'carousel'\n\n visible?: boolean\n setVisible?: (visible: boolean) => void\n\n onDismiss?: () => void\n\n /**\n * See https://docs.frigade.com/flows/dynamic-variables\n */\n customVariables?: { [key: string]: string | number | boolean }\n\n /** @ignore */\n guideFlowId?: string\n /** @ignore */\n guideTitle?: string\n\n autoExpandFirstIncompleteStep?: boolean\n autoExpandNextStep?: boolean\n}\n\nexport const FrigadeChecklist: React.FC<FrigadeChecklistProps> = ({\n flowId,\n title,\n subtitle,\n style,\n initialSelectedStep,\n className,\n type = 'inline',\n onDismiss,\n visible,\n customVariables,\n onStepCompletion,\n onButtonClick,\n appearance,\n hideOnFlowCompletion,\n setVisible,\n customStepTypes,\n checklistStyle = 'default',\n autoExpandFirstIncompleteStep,\n autoExpandNextStep,\n ...guideProps\n}) => {\n const {\n getFlow,\n getFlowSteps,\n markStepCompleted,\n getStepStatus,\n getNumberOfStepsCompleted,\n isLoading,\n targetingLogicShouldHideFlow,\n updateCustomVariables,\n getFlowMetadata,\n isStepBlocked,\n getFlowStatus,\n hasActiveFullPageFlow,\n setHasActiveFullPageFlow,\n markStepStarted,\n getCurrentStepIndex,\n } = useFlows()\n const { primaryCTAClickSideEffects, secondaryCTAClickSideEffects } = useCTAClickSideEffects()\n const { getOpenFlowState, setOpenFlowState } = useFlowOpens()\n const [selectedStep, setSelectedStep] = useState(initialSelectedStep || 0)\n const [finishedInitialLoad, setFinishedInitialLoad] = useState(false)\n const showModal = visible === undefined ? getOpenFlowState(flowId) : visible\n const isModal = type === 'modal'\n const { mergeAppearanceWithDefault } = useTheme()\n\n useFlowImpressions(flowId, visible)\n\n const steps = getFlowSteps(flowId)\n const index = getCurrentStepIndex(flowId)\n\n appearance = mergeAppearanceWithDefault(appearance)\n\n useEffect(() => {\n updateCustomVariables(customVariables)\n }, [customVariables, isLoading])\n\n useEffect(() => {\n if (visible !== undefined) {\n if (isModal && visible === true) {\n setHasActiveFullPageFlow(true)\n } else if (isModal && visible === false) {\n setHasActiveFullPageFlow(false)\n }\n }\n }, [visible, setVisible, hasActiveFullPageFlow])\n\n useEffect(() => {\n if (selectedStep === index) {\n return\n }\n setSelectedStep(index)\n }, [index])\n\n if (isLoading) {\n return null\n }\n\n const flow = getFlow(flowId)\n if (!flow) {\n return null\n }\n\n if (targetingLogicShouldHideFlow(flow)) {\n return null\n }\n\n if (!steps) {\n return null\n }\n\n if (hideOnFlowCompletion === true && getFlowStatus(flowId) === COMPLETED_FLOW) {\n return null\n }\n\n const metaData = getFlowMetadata(flowId)\n if (metaData?.title) {\n title = metaData.title\n }\n if (metaData?.subtitle) {\n subtitle = metaData.subtitle\n }\n\n if (\n !finishedInitialLoad &&\n initialSelectedStep === undefined &&\n getNumberOfStepsCompleted(flowId) > 0\n ) {\n const firstIncompleteStep = steps.findIndex((step) => step.complete === false)\n setSelectedStep(firstIncompleteStep > -1 ? firstIncompleteStep : steps.length - 1)\n setFinishedInitialLoad(true)\n }\n\n function goToNextStepIfPossible() {\n if (selectedStep + 1 >= steps.length) {\n // If modal, close it\n if (isModal) {\n setOpenFlowState(flowId, false)\n }\n return\n }\n // Double check next step is not blocked\n if (isStepBlocked(flowId, steps[selectedStep + 1].id)) {\n return\n }\n\n setSelectedStep(selectedStep + 1)\n }\n\n function handleStepCompletionHandlers(\n step: StepData,\n cta: 'primary' | 'secondary' | 'link',\n idx: number\n ) {\n const maybeNextStep = selectedStep + 1 < steps.length ? steps[selectedStep + 1] : null\n if (onButtonClick) {\n const completion = onButtonClick(step, selectedStep, cta, maybeNextStep)\n if (completion === true && isModal) {\n handleClose()\n }\n }\n if (onStepCompletion) {\n onStepCompletion(step, idx, maybeNextStep)\n }\n if (!onStepCompletion && !onButtonClick && (step.primaryButtonUri || step.secondaryButtonUri)) {\n if (isModal) {\n handleClose()\n }\n }\n }\n\n function getSteps() {\n return steps.map((step: StepData, idx: number) => {\n return {\n ...step,\n handleSecondaryButtonClick: () => {\n // Default to skip behavior for secondary click but allow for override\n goToNextStepIfPossible()\n secondaryCTAClickSideEffects(step)\n if (step.skippable === true) {\n markStepCompleted(flowId, step.id, { skipped: true })\n }\n handleStepCompletionHandlers(step, 'secondary', idx)\n },\n handlePrimaryButtonClick: () => {\n if (\n (!step.completionCriteria &&\n (step.autoMarkCompleted || step.autoMarkCompleted === undefined)) ||\n (step.completionCriteria && step.autoMarkCompleted === true)\n ) {\n markStepCompleted(flowId, step.id)\n goToNextStepIfPossible()\n }\n handleStepCompletionHandlers(step, 'primary', idx)\n primaryCTAClickSideEffects(step)\n // If step is done, try to go to next step\n if (getStepStatus(flowId, step.id) === COMPLETED_STEP) {\n goToNextStepIfPossible()\n }\n },\n }\n })\n }\n\n function CommonDom() {\n return <RenderInlineStyles appearance={appearance} />\n }\n\n const commonProps = {\n steps: getSteps(),\n title,\n subtitle,\n primaryColor: appearance.theme.colorPrimary,\n appearance,\n customStepTypes,\n type,\n className,\n autoExpandFirstIncompleteStep,\n autoExpandNextStep,\n }\n\n function handleClose() {\n setOpenFlowState(flowId, false)\n if (onDismiss) {\n onDismiss()\n }\n if (setVisible) {\n setVisible(false)\n }\n }\n\n function getCarouselChecklist() {\n return (\n <>\n <CommonDom />\n <CarouselChecklist\n flowId={flowId}\n appearance={appearance}\n customVariables={customVariables}\n className={className}\n />\n </>\n )\n }\n\n function getCondensedChecklist() {\n return (\n <>\n <CommonDom />\n <CondensedChecklist\n visible={showModal}\n onClose={() => {\n handleClose()\n }}\n selectedStep={selectedStep}\n setSelectedStep={setSelectedStep}\n autoExpandNextStep={true}\n appearance={appearance}\n onButtonClick={onButtonClick}\n {...commonProps}\n />\n </>\n )\n }\n\n function getChecklistWithGuide() {\n const guideFlowId = guideProps.guideFlowId\n let guideFlowSteps\n if (guideFlowId) {\n const guideFlow = getFlow(guideFlowId)\n if (guideFlow) {\n guideFlowSteps = getFlowSteps(guideFlowId)\n }\n }\n\n return (\n <>\n <CommonDom />\n <ChecklistWithGuide\n visible={showModal}\n stepsTitle={metaData.stepsTitle ? metaData.stepsTitle : 'Your quick start guide'}\n onClose={() => {\n handleClose()\n }}\n selectedStep={selectedStep}\n setSelectedStep={setSelectedStep}\n guideData={guideFlowSteps}\n guideTitle={guideProps.guideTitle ?? 'Guide'}\n appearance={appearance}\n title={title}\n subtitle={subtitle}\n onGuideButtonClick={(step) => {\n handleStepCompletionHandlers(step, 'link', 0)\n }}\n customStepTypes={customStepTypes}\n {...commonProps}\n />\n </>\n )\n }\n\n function getDefaultChecklist() {\n const checklist = (\n <HeroChecklist\n flowId={flowId}\n style={style}\n selectedStep={selectedStep}\n setSelectedStep={setSelectedStep}\n appearance={appearance}\n type={type}\n {...commonProps}\n />\n )\n\n if (!isModal) {\n return (\n <>\n <CommonDom />\n {checklist}\n </>\n )\n }\n\n return (\n <Modal\n onClose={() => {\n handleClose()\n }}\n visible={showModal}\n appearance={appearance}\n style={{\n paddingTop: '0px',\n padding: '12px',\n paddingLeft: 0,\n }}\n >\n <CommonDom />\n {checklist}\n </Modal>\n )\n }\n\n switch (checklistStyle) {\n case 'condensed':\n return getCondensedChecklist()\n case 'with-guide':\n return getChecklistWithGuide()\n case 'default':\n return getDefaultChecklist()\n case 'carousel':\n return getCarouselChecklist()\n default:\n return getDefaultChecklist()\n }\n}\n","import React, { FC, useState } from 'react'\n\nimport styled from 'styled-components'\nimport { StepChecklistItem } from './StepChecklistItem'\nimport { ProgressBar } from '../Checklist/ProgressBar'\nimport { Appearance, DefaultFrigadeFlowProps, StepData } from '../../../types'\nimport {\n HERO_STEP_CONTENT_TYPE,\n HeroStepContent,\n} from '../../checklist-step-content/HeroStepContent'\nimport { VIDEO_CAROUSEL_TYPE, VideoCarousel } from '../../checklist-step-content/VideoCarousel'\nimport {\n CODE_SNIPPET_CONTENT_TYPE,\n CodeSnippetContent,\n} from '../../checklist-step-content/CodeSnippetContent'\nimport { useTheme } from '../../../hooks/useTheme'\nimport { FrigadeChecklistProps } from '../../../FrigadeChecklist'\nimport { getClassName, styleOverridesToCSS } from '../../../shared/appearance'\n\nexport interface HeroChecklistProps extends Omit<DefaultFrigadeFlowProps, 'flowId'> {\n title?: string\n subtitle?: string\n /**\n * @deprecated Use `appearance` instead\n * @ignore\n */\n primaryColor?: string\n /** @ignore */\n steps?: StepData[]\n\n /** @ignore */\n selectedStep?: number\n /** @ignore */\n setSelectedStep?: (index: number) => void\n\n /**\n * Map of custom step types that the checklist supports. To use a custom steps in your checklist, see [Component Customization](/component/customization#customizing-frigade-components)\n */\n customStepTypes?: Record<\n string,\n ((stepData: StepData, appearance: Appearance) => React.ReactNode) | React.ReactNode\n >\n}\n\nconst HeroChecklistContainer = styled.div<{ appearance }>`\n display: flex;\n flex-direction: row;\n overflow: hidden;\n min-width: ${(props) => (props.type != 'modal' ? '600px' : '100%')};\n background: ${(props) => props.appearance?.theme.colorBackground};\n border-radius: ${(props) => props.appearance?.theme.borderRadius}px;\n ${(props) => styleOverridesToCSS(props)}\n`\n\nconst HeroChecklistTitle = styled.h1<{ appearance }>`\n font-size: 18px;\n font-style: normal;\n font-weight: 700;\n line-height: 24px;\n letter-spacing: 0.36px;\n color: ${(props) => props.appearance?.theme?.colorText};\n`\n\nconst HeroChecklistSubtitle = styled.h2`\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 22px;\n letter-spacing: 0.28px;\n color: ${(props) => props.appearance?.theme?.colorTextSecondary};\n margin: 10px 0px 0px 0px;\n`\n\nconst ChecklistHeader = styled.div`\n padding: 28px 0px 28px 28px;\n border-bottom: 1px solid ${(props) => props.appearance?.theme?.colorBorder};\n`\n\nconst ChecklistHeaderContainer = styled.div`\n flex: 1;\n`\n\nconst ChecklistStepsContainer = styled.div`\n list-style: none;\n padding: 0;\n margin: 0;\n cursor: pointer;\n min-width: 300px;\n`\n\nconst Divider = styled.div`\n width: 1px;\n margin-right: 40px;\n background: ${(props) => props.appearance?.theme?.colorBorder};\n`\n\nconst HeroChecklistStepContentContainer = styled.div`\n flex: 2;\n padding: 40px 40px 40px 0px;\n`\n\nconst HeroChecklist: FC<FrigadeChecklistProps> = ({\n title,\n subtitle,\n steps = [],\n style = {},\n selectedStep,\n setSelectedStep,\n className = '',\n customStepTypes = new Map(),\n appearance,\n type,\n}) => {\n const { mergeAppearanceWithDefault } = useTheme()\n appearance = mergeAppearanceWithDefault(appearance)\n\n const DEFAULT_CUSTOM_STEP_TYPES = {\n [HERO_STEP_CONTENT_TYPE]: HeroStepContent,\n [VIDEO_CAROUSEL_TYPE]: VideoCarousel,\n [CODE_SNIPPET_CONTENT_TYPE]: CodeSnippetContent,\n }\n\n const mergedCustomStepTypes = {\n ...DEFAULT_CUSTOM_STEP_TYPES,\n ...customStepTypes,\n }\n\n const [selectedStepInternal, setSelectedStepInternal] = useState(0)\n\n const selectedStepValue = selectedStep ?? selectedStepInternal\n const setSelectedStepValue = setSelectedStep ?? setSelectedStepInternal\n\n const completeCount = steps.filter((s) => s.complete === true).length\n\n const StepContent = () => {\n if (!steps[selectedStepValue]?.type || !mergedCustomStepTypes[steps[selectedStepValue].type]) {\n return mergedCustomStepTypes[HERO_STEP_CONTENT_TYPE]({\n stepData: steps[selectedStepValue],\n appearance: appearance,\n })\n }\n\n // Check if the custom step type is a functional component or a React component\n if (typeof mergedCustomStepTypes[steps[selectedStepValue].type] !== 'function') {\n return mergedCustomStepTypes[steps[selectedStepValue].type]\n }\n\n return mergedCustomStepTypes[steps[selectedStepValue].type]({\n stepData: steps[selectedStepValue],\n appearance: appearance,\n })\n }\n\n return (\n <HeroChecklistContainer\n type={type}\n styleOverrides={style}\n className={className}\n appearance={appearance}\n >\n <ChecklistHeaderContainer\n className={getClassName('checklistHeaderContainer', appearance)}\n appearance={appearance}\n >\n <ChecklistHeader\n className={getClassName('checklistHeader', appearance)}\n appearance={appearance}\n >\n <HeroChecklistTitle\n className={getClassName('checklistTitle', appearance)}\n appearance={appearance}\n >\n {title}\n </HeroChecklistTitle>\n <HeroChecklistSubtitle\n className={getClassName('checklistSubtitle', appearance)}\n appearance={appearance}\n >\n {subtitle}\n </HeroChecklistSubtitle>\n <ProgressBar\n total={steps.length}\n count={completeCount}\n style={{ marginTop: '24px', paddingRight: `40px` }}\n appearance={appearance}\n />\n </ChecklistHeader>\n <ChecklistStepsContainer className={getClassName('checklistStepsContainer', appearance)}>\n {steps.map((s: StepData, idx: number) => {\n return (\n <StepChecklistItem\n data={s}\n index={idx}\n key={idx}\n listLength={steps.length}\n isSelected={idx === selectedStepValue}\n primaryColor={appearance.theme.colorPrimary}\n style={{ justifyContent: 'space-between' }}\n onClick={() => {\n setSelectedStepValue(idx)\n }}\n appearance={appearance}\n />\n )\n })}\n </ChecklistStepsContainer>\n </ChecklistHeaderContainer>\n <Divider appearance={appearance} className={getClassName('checklistDivider', appearance)} />\n <HeroChecklistStepContentContainer>\n <StepContent />\n </HeroChecklistStepContentContainer>\n </HeroChecklistContainer>\n )\n}\n\nexport default HeroChecklist\n","import React, { CSSProperties, FC } from 'react'\nimport { CheckBoxRow } from '../../CheckBoxRow'\nimport { Appearance, StepData } from '../../../types'\nimport { ChecklistStepItem, StepItemSelectedIndicator } from './styled'\nimport { getClassName } from '../../../shared/appearance'\n\ninterface StepItemProps {\n data: StepData\n index: number\n listLength: number\n isSelected: boolean\n primaryColor: string\n style: CSSProperties\n onClick: () => void\n appearance: Appearance\n}\n\nexport const StepChecklistItem: FC<StepItemProps> = ({\n data,\n index,\n isSelected,\n primaryColor,\n style,\n onClick,\n appearance,\n}) => {\n return (\n <div\n style={{ position: 'relative', paddingLeft: '0px' }}\n onClick={() => {\n onClick()\n }}\n >\n {isSelected && (\n <StepItemSelectedIndicator\n className={getClassName('checklistStepItemSelectedIndicator', appearance)}\n layoutId=\"checklis-step-selected\"\n style={{ backgroundColor: appearance?.theme?.colorPrimary ?? primaryColor }}\n ></StepItemSelectedIndicator>\n )}\n <ChecklistStepItem\n className={getClassName('checklistStepItem', appearance)}\n key={`hero-checklist-step-${index}`}\n appearance={appearance}\n role=\"listitem\"\n >\n <CheckBoxRow\n value={data.complete}\n labelPosition=\"left\"\n label={data.stepName ?? data.title}\n style={style}\n primaryColor={appearance?.theme?.colorPrimary ?? primaryColor}\n appearance={appearance}\n />\n </ChecklistStepItem>\n </div>\n )\n}\n","import React, { CSSProperties, FC } from 'react'\nimport styled from 'styled-components'\nimport { CheckBox, CheckBoxType } from '../CheckBox'\nimport { Appearance } from '../../types'\nimport { getClassName, styleOverridesToCSS } from '../../shared/appearance'\nimport { RenderInlineStyles } from '../RenderInlineStyles'\n\ninterface CheckBoxRowProps {\n label?: string\n value: boolean\n labelStyle?: CSSProperties\n labelPosition?: 'left' | 'right'\n style?: CSSProperties\n primaryColor?: string\n secondaryColor?: string\n checkBoxType?: CheckBoxType\n appearance?: Appearance\n}\n\nconst Label = styled.span`\n font-weight: 600;\n font-size: 14px;\n font-style: normal;\n line-height: 22px;\n letter-spacing: 0.28px;\n color: #4d4d4d;\n display: inline-block;\n vertical-align: middle;\n margin-left: 32px;\n padding-right: 12px;\n ${(props) => styleOverridesToCSS(props)}\n`\n\nconst CheckBoxRowContainer = styled.div`\n flex-direction: row;\n justify-content: space-between;\n display: flex;\n padding-top: 20px;\n padding-bottom: 20px;\n padding-right: 8px;\n width: 100%;\n ${(props) => styleOverridesToCSS(props)}\n`\n\nexport const CheckBoxRow: FC<CheckBoxRowProps> = ({\n label,\n value,\n labelStyle = {},\n labelPosition = 'right',\n style,\n primaryColor = '#000000',\n checkBoxType = 'round',\n appearance,\n}) => {\n return (\n <>\n <CheckBoxRowContainer\n className={getClassName('checklistStepsContainer', appearance)}\n appearance={appearance}\n styleOverrides={{ ...style }}\n >\n {labelPosition === 'left' && label && (\n <Label\n className={getClassName('checklistStepLabel', appearance)}\n styleOverrides={labelStyle}\n appearnace={appearance}\n >\n {label}\n </Label>\n )}\n <CheckBox\n appearance={appearance}\n value={value}\n type={checkBoxType}\n primaryColor={primaryColor}\n />\n {labelPosition === 'right' && label && (\n <Label\n className={getClassName('checklistStepLabel', appearance)}\n styleOverrides={labelStyle}\n appearance={appearance}\n >\n {label}\n </Label>\n )}\n </CheckBoxRowContainer>\n <RenderInlineStyles appearance={appearance} />\n </>\n )\n}\n","import styled from 'styled-components'\n\nexport const HeroChecklistStepContent = styled.div`\n font-weight: 700;\n font-size: 18px;\n line-height: 22px;\n`\n\nexport const HeroChecklistStepTitle = styled.p<{ appearance }>`\n font-weight: 600;\n font-size: 16px;\n line-height: 24px;\n margin: 20px 0px 0px 0px;\n letter-spacing: 0.32px;\n font-style: normal;\n color: ${(props) => props.appearance?.theme?.colorText};\n`\n\nexport const HeroChecklistStepSubtitle = styled.p<{ appearance }>`\n font-weight: 400;\n font-size: 14px;\n font-style: normal;\n line-height: 22px;\n max-width: 540px;\n letter-spacing: 0.28px;\n margin: 8px 0px 0px 0px;\n color: ${(props) => props.appearance?.theme?.colorTextSecondary};\n`\n\nexport const StepItemSelectedIndicator = styled.div`\n width: 6px;\n position: absolute;\n left: 0;\n height: 100%;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n`\n\nexport const ChecklistStepItem = styled.div`\n flex-direction: row;\n justify-content: flex-start;\n border-bottom: 1px solid ${(props) => props.theme.colorBorder};\n padding-right: 16px;\n`\n","import React, { CSSProperties } from 'react'\nimport styled from 'styled-components'\nimport { Appearance } from '../../../types'\nimport { getClassName, styleOverridesToCSS } from '../../../shared/appearance'\nimport { ProgressBarBackground, ProgressBarFill } from './styled'\n\n// TODO: remove once secondary color is passed from theme\nconst PROGRESS_BAR_COLOR_STYLES = {\n backgroundColor: '#E6E6E6',\n}\n\nconst ProgressContainer = styled.div`\n display: flex;\n flex-direction: ${(props) => (props.textLocation == 'top' ? 'column' : 'row')};\n justify-content: flex-start;\n align-items: ${(props) => (props.textLocation == 'top' ? 'flex-end' : 'center')};\n width: 100%;\n\n ${(props) => styleOverridesToCSS(props)}\n`\nconst ProgressProgressBar = styled.div`\n flex-grow: 1;\n position: relative;\n ${(props) => (props.textLocation == 'top' ? `width: 100%;` : ``)}\n`\n\nconst StepText = styled.span<{ padding; appearance }>`\n font-weight: 600;\n font-size: 14px;\n line-height: 18px;\n padding-right: ${(props) => props.padding};\n margin-bottom: ${(props) => (props.textLocation == 'top' ? '8px' : '0px')};\n ${(props) => styleOverridesToCSS(props)}\n`\n\nconst progressBgStyle: CSSProperties = {\n position: 'relative',\n left: 0,\n top: 0,\n width: '100%',\n minWidth: '40px',\n height: '10px',\n borderRadius: '20px',\n}\n\nexport const ProgressBar = ({\n count,\n total,\n display = 'count',\n textLocation = 'left',\n style = {},\n textStyle = {},\n appearance,\n}: {\n count: number\n total: number\n bgColor?: string\n display?: 'count' | 'percent' | 'compact'\n textLocation?: 'top' | 'left'\n style?: CSSProperties\n textStyle?: CSSProperties\n appearance?: Appearance\n}) => {\n if (total === 0) {\n return <></>\n }\n\n if (Object.keys(textStyle).length === 0 && textStyle.constructor === Object) {\n textStyle = {\n color: appearance?.theme?.colorText,\n }\n }\n\n const fgWidth = count === 0 ? '10px' : `${(count / total) * 100}%`\n const barHeight = display === 'compact' ? '8px' : '10px'\n const percentComplete = Math.round((count / total) * 100)\n let padding = display === 'compact' ? '10px' : '14px'\n\n let stepText\n if (display === 'count' || display === 'compact') {\n stepText = `${count}/${total}`\n } else if (display === 'percent') {\n stepText = `${percentComplete}% complete`\n }\n if (textLocation === 'top') {\n padding = '0px'\n }\n\n return (\n <ProgressContainer\n className={getClassName('progressBarContainer', appearance)}\n textLocation={textLocation}\n styleOverrides={style}\n >\n <StepText\n className={getClassName('progressBarStepText', appearance)}\n styleOverrides={{\n ...textStyle,\n fontSize: display === 'compact' ? 12 : 14,\n fontWeight: 600,\n }}\n appearance={appearance}\n padding={padding}\n textLocation={textLocation}\n >\n {stepText}\n </StepText>\n <ProgressProgressBar\n textLocation={textLocation}\n className={getClassName('progressBar', appearance)}\n >\n <ProgressBarFill\n style={{\n zIndex: display == 'compact' ? 1 : 5,\n }}\n fgWidth={fgWidth}\n barHeight={barHeight}\n appearance={appearance}\n className={getClassName('progressBarFill', appearance)}\n />\n <ProgressBarBackground\n className={getClassName('progressBarBackground', appearance)}\n barHeight={barHeight}\n appearance={appearance}\n />\n </ProgressProgressBar>\n </ProgressContainer>\n )\n}\n","import styled from 'styled-components'\n\nexport const ChecklistTitle = styled.h1`\n display: flex;\n margin: 0;\n font-size: 18px;\n`\n\nexport const ChecklistSubtitle = styled.h2`\n font-size: 15px;\n color: #4d4d4d;\n`\n\nexport const ProgressBarFill = styled.div`\n position: absolute;\n left: 0;\n top: 0;\n height: ${(props) => props.barHeight};\n width: ${(props) => props.fgWidth};\n border-radius: 20px;\n background-color: ${(props) => props.theme.colorPrimary};\n transition: width 0.5s;\n`\nexport const ProgressBarBackground = styled.div`\n position: relative;\n left: 0;\n top: 0;\n width: 100%;\n min-width: 40px;\n height: ${(props) => props.barHeight};\n border-radius: 20px;\n background-color: ${(props) => props.theme.colorPrimary};\n opacity: 0.12;\n`\n","import { HeroChecklistStepContent } from '../Checklists/HeroChecklist/styled'\n\nimport React, { FC } from 'react'\nimport { StepContentProps } from '../../FrigadeForm/types'\nimport styled from 'styled-components'\nimport { TitleSubtitleWithCTA } from './shared/TitleSubtitleWithCTA'\nimport { VideoPlayer } from '../Video/VideoPlayer'\nimport { getClassName } from '../../shared/appearance'\n\nexport const HERO_STEP_CONTENT_TYPE = 'default'\nconst StepImage = styled.img`\n border-radius: ${(props) => props.appearance?.theme.borderRadius}px;\n width: 100%;\n height: auto;\n min-height: 200px;\n`\nexport const HeroStepContent: FC<StepContentProps> = ({ stepData, appearance }) => {\n if (stepData?.StepContent) {\n const Content: React.ReactNode = stepData.StepContent\n return <div>{Content}</div>\n }\n\n return (\n <HeroChecklistStepContent className={getClassName('checklistStepContent', appearance)}>\n {stepData.imageUri ? (\n <StepImage\n className={getClassName('checklistStepImage', appearance)}\n src={stepData.imageUri}\n appearance={appearance}\n />\n ) : null}\n {stepData.videoUri ? (\n <VideoPlayer\n videoUri={stepData.videoUri}\n appearance={appearance}\n autoplay={stepData.props?.autoplayVideo}\n />\n ) : null}\n <TitleSubtitleWithCTA stepData={stepData} appearance={appearance} />\n </HeroChecklistStepContent>\n )\n}\n","import React, { FC } from 'react'\nimport { StepContentProps } from '../../../FrigadeForm/types'\nimport { TitleSubtitle } from './TitleSubtitle'\nimport { CTA } from './CTA'\n\nexport const TitleSubtitleWithCTA: FC<StepContentProps> = ({ stepData, appearance }) => {\n return (\n <>\n <TitleSubtitle stepData={stepData} appearance={appearance} />\n <CTA stepData={stepData} appearance={appearance} />\n </>\n )\n}\n","import React, { FC } from 'react'\n\nimport {\n HeroChecklistStepSubtitle,\n HeroChecklistStepTitle,\n} from '../../Checklists/HeroChecklist/styled'\nimport { StepContentProps } from '../../../FrigadeForm/types'\nimport { sanitize } from '../../../shared/sanitizer'\nimport { getClassName } from '../../../shared/appearance'\n\nexport const TitleSubtitle: FC<StepContentProps> = ({ stepData, appearance }) => {\n return (\n <>\n <HeroChecklistStepTitle\n appearance={appearance}\n className={getClassName('checklistStepTitle', appearance)}\n dangerouslySetInnerHTML={sanitize(stepData.title)}\n />\n <HeroChecklistStepSubtitle\n appearance={appearance}\n className={getClassName('checklistStepSubtitle', appearance)}\n dangerouslySetInnerHTML={sanitize(stepData.subtitle)}\n />\n </>\n )\n}\n","import React, { FC } from 'react'\nimport { Button, MultipleButtonContainer } from '../../Button'\nimport { StepContentProps } from '../../../FrigadeForm/types'\nimport { getClassName } from '../../../shared/appearance'\n\nexport const CTA: FC<StepContentProps> = ({ stepData, appearance }) => {\n const handlePrimaryButtonClick = () => {\n if (stepData.handlePrimaryButtonClick) {\n stepData.handlePrimaryButtonClick()\n }\n }\n\n const handleSecondaryButtonClick = () => {\n if (stepData.handleSecondaryButtonClick) {\n stepData.handleSecondaryButtonClick()\n }\n }\n\n return (\n <MultipleButtonContainer className={getClassName('ctaContainer', appearance)}>\n <Button\n appearance={appearance}\n title={stepData.primaryButtonTitle}\n onClick={handlePrimaryButtonClick}\n />\n {stepData.secondaryButtonTitle && (\n <Button\n appearance={appearance}\n secondary\n title={stepData.secondaryButtonTitle}\n onClick={handleSecondaryButtonClick}\n style={{\n width: 'auto',\n marginRight: '12px',\n }}\n />\n )}\n </MultipleButtonContainer>\n )\n}\n","import React from 'react'\nimport { Appearance } from '../../types'\nimport { VideoCard } from './VideoCard'\n\nexport function VideoPlayer(props: {\n videoUri: string\n autoplay: boolean\n appearance?: Appearance\n}) {\n return (\n <VideoCard appearance={props.appearance} videoUri={props.videoUri} autoplay={props.autoplay} />\n )\n}\n","import React, { FC, useRef, useState } from 'react'\nimport styled from 'styled-components'\nimport { TitleSubtitleWithCTA } from './shared/TitleSubtitleWithCTA'\nimport { StepContentProps } from '../../FrigadeForm/types'\nimport { Play } from '../Icons/Play'\nimport { TitleSubtitle } from './shared/TitleSubtitle'\nimport { CTA } from './shared/CTA'\n\nconst VideoCarouselContainer = styled.div`\n display: block;\n`\n\nconst VideoList = styled.div`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n gap: 0px;\n align-items: center;\n align-content: center;\n margin-top: 24px;\n margin-bottom: 24px;\n`\n\nconst Video = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex-direction: column;\n margin-right: 16px;\n`\n\nconst VideoSource = styled.video`\n width: 200px;\n height: 120px;\n`\n\nconst VideoTitle = styled.div`\n font-size: 14px;\n line-height: 20px;\n text-align: center;\n`\n\nconst PlayIconWrapper = styled.div`\n position: absolute;\n width: 200px;\n height: 120px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n :hover {\n opacity: 0.6;\n }\n z-index: 10;\n\n > svg {\n width: 40px;\n height: 40px;\n color: ${(props) => props.appearance.theme.colorBackground};\n box-shadow: 0px 6px 25px rgba(0, 0, 0, 0.06);\n border-radius: 50%;\n }\n`\n\ninterface VideoMetadata {\n uri: string\n thumbnailUri?: string\n title?: string\n}\n\ninterface VideoCarouselProps {\n videos: VideoMetadata[]\n}\n\nexport const VIDEO_CAROUSEL_TYPE = 'videoCarousel'\n\nexport const VideoCarousel: FC<StepContentProps> = ({ stepData, appearance }) => {\n if (!stepData.props?.videos) {\n return (\n <VideoCarouselContainer>\n <TitleSubtitleWithCTA stepData={stepData} appearance={appearance} />\n </VideoCarouselContainer>\n )\n }\n\n function VideoCard({ video }: { video: VideoMetadata }) {\n // Create ref to use with videoplayer\n\n const ref = useRef<any>()\n\n const [isPlaying, setIsPlaying] = useState(false)\n\n return (\n <Video>\n {!isPlaying && (\n <PlayIconWrapper\n onClick={() => {\n setIsPlaying(true)\n ref.current.play()\n }}\n appearance={appearance}\n >\n <Play />\n </PlayIconWrapper>\n )}\n <VideoSource controls={isPlaying} ref={ref} play={isPlaying} src={video.uri} />\n <VideoTitle>{video.title}</VideoTitle>\n </Video>\n )\n }\n\n const videoProps = stepData.props as VideoCarouselProps\n\n if (videoProps.videos) {\n return (\n <VideoCarouselContainer>\n <TitleSubtitle stepData={stepData} appearance={appearance} />\n <VideoList>\n {videoProps.videos.map((video: VideoMetadata, idx: number) => (\n <span key={`${video.uri}-${idx}`}>\n <VideoCard video={video} />\n </span>\n ))}\n </VideoList>\n <CTA stepData={stepData} appearance={appearance} />\n </VideoCarouselContainer>\n )\n }\n return null\n}\n","import React, { FC } from 'react'\nimport styled from 'styled-components'\nimport { TitleSubtitleWithCTA } from './shared/TitleSubtitleWithCTA'\nimport { StepContentProps } from '../../FrigadeForm/types'\nimport { CTA } from './shared/CTA'\nimport { TitleSubtitle } from './shared/TitleSubtitle'\nimport { sanitize } from '../../shared/sanitizer'\nimport { getClassName } from '../../shared/appearance'\n\nconst CodeSnippetContainer = styled.div`\n display: block;\n`\n\n// Create a cool code snippet style that is dark background white text\nconst CodeSnippet = styled.pre`\n display: block;\n background-color: #2a2a2a;\n color: #f8f8f8;\n padding: 16px;\n border-radius: 6px;\n font-size: 14px;\n line-height: 20px;\n font-family: 'Source Code Pro', monospace;\n width: 600px;\n white-space: pre-wrap; /* css-3 */\n white-space: -moz-pre-wrap; /* Mozilla, since 1999 */\n white-space: -pre-wrap; /* Opera 4-6 */\n white-space: -o-pre-wrap; /* Opera 7 */\n word-wrap: break-word; /* Internet Explorer 5.5+ */\n margin-bottom: 24px;\n`\nconst CodeSnippetTitle = styled.div`\n font-size: 15px;\n line-height: 20px;\n margin-bottom: 12px;\n margin-top: 12px;\n`\n\nconst CodeSnippets = styled.div`\n margin-top: 24px;\n`\n\ninterface CodeSnippetMetadata {\n code?: string\n title?: string\n}\n\ninterface CodeSnippetProps {\n codeSnippets: CodeSnippetMetadata[]\n}\n\nexport const CODE_SNIPPET_CONTENT_TYPE = 'codeSnippet'\n\nexport const CodeSnippetContent: FC<StepContentProps> = ({ stepData, appearance }) => {\n if (!stepData.props?.codeSnippets) {\n return (\n <CodeSnippetContainer>\n <TitleSubtitleWithCTA stepData={stepData} appearance={appearance} />\n </CodeSnippetContainer>\n )\n }\n\n const codeProps = stepData.props as CodeSnippetProps\n\n if (codeProps.codeSnippets) {\n return (\n <CodeSnippetContainer className={getClassName('codeSnippetContainer', appearance)}>\n <TitleSubtitle stepData={stepData} appearance={appearance} />\n <CodeSnippets>\n {codeProps.codeSnippets.map((codeSnippet, index) => {\n return (\n <div key={index}>\n {codeSnippet.title ? (\n <CodeSnippetTitle dangerouslySetInnerHTML={sanitize(codeSnippet.title)} />\n ) : null}\n {codeSnippet.code ? <CodeSnippet>{codeSnippet.code}</CodeSnippet> : null}\n </div>\n )\n })}\n </CodeSnippets>\n <CTA stepData={stepData} appearance={appearance} />\n </CodeSnippetContainer>\n )\n }\n return null\n}\n","import React, { FC, useState } from 'react'\nimport { Button } from '../../Button'\nimport { CheckBox } from '../../CheckBox'\nimport { Chevron } from '../../Icons/Chevron'\nimport { StepData } from '../../../types'\nimport { ProgressBar } from '../Checklist/ProgressBar'\nimport { StepItemSelectedIndicator } from '../HeroChecklist/styled'\nimport {\n ChecklistContainer,\n ChecklistSubtitle,\n ChecklistTitle,\n ContainerStyle,\n HeaderContent,\n MultipleButtonContainer,\n ProgressBarContainer,\n ScrollContainer,\n StepContainer,\n StepListContainer,\n StepListItem,\n StepListItemRight,\n StepListStepName,\n StepsBody,\n StepsContainer,\n StepsHeader,\n StepsTitle,\n StepSubtitle,\n StepTitle,\n} from './styled'\nimport { CenterVertical } from '../../styled'\nimport { Modal } from '../../Modal'\nimport Guide, { GuideStepData } from '../../Guides/Guide'\nimport { getClassName } from '../../../shared/appearance'\nimport { ChecklistProps } from '../index'\nimport { sanitize } from '../../../shared/sanitizer'\n\nexport interface ChecklistWithGuideProps extends ChecklistProps {\n // Map from string to function with StepData returning React.ReactNode\n visible: boolean\n stepsTitle: string\n\n guideData?: GuideStepData[]\n guideTitle?: string\n\n onGuideButtonClick?: (stepData: StepData) => void\n}\n\nconst ChecklistWithGuide: FC<ChecklistWithGuideProps> = ({\n steps,\n title,\n subtitle,\n stepsTitle,\n\n visible,\n onClose,\n\n selectedStep,\n setSelectedStep,\n customStepTypes,\n\n appearance,\n\n guideData,\n guideTitle,\n\n onGuideButtonClick,\n}) => {\n const DefaultStepContent = ({ stepData, handleSecondaryCTAClick, handleCTAClick }) => {\n if (!stepData) return <></>\n\n return (\n <StepContainer\n className={getClassName('checklistStepContainer', appearance)}\n data-testid=\"checklistStepContainer\"\n >\n <StepTitle\n appearance={appearance}\n className={getClassName('checklistStepTitle', appearance)}\n dangerouslySetInnerHTML={sanitize(stepData.title)}\n />\n <StepSubtitle\n appearance={appearance}\n className={getClassName('checklistStepSubtitle', appearance)}\n dangerouslySetInnerHTML={sanitize(stepData.subtitle)}\n />\n <MultipleButtonContainer className={getClassName('checklistCTAContainer', appearance)}>\n {stepData.secondaryButtonTitle && (\n <Button\n title={stepData.secondaryButtonTitle}\n onClick={handleSecondaryCTAClick}\n appearance={appearance}\n secondary\n />\n )}\n <Button\n title={stepData.primaryButtonTitle}\n onClick={handleCTAClick}\n appearance={appearance}\n />\n </MultipleButtonContainer>\n </StepContainer>\n )\n }\n\n const DEFAULT_CUSTOM_STEP_TYPES = {\n default: (stepData: StepData) => {\n if (steps[selectedStepValue]?.StepContent) {\n const Content: React.ReactNode = steps[selectedStepValue].StepContent\n return <div>{Content}</div>\n }\n const currentStep = steps[selectedStepValue]\n\n const handleCTAClick = () => {\n if (currentStep.handlePrimaryButtonClick) {\n currentStep.handlePrimaryButtonClick()\n }\n }\n\n const handleSecondaryCTAClick = () => {\n if (currentStep.handleSecondaryButtonClick) {\n currentStep.handleSecondaryButtonClick()\n }\n }\n\n return (\n <DefaultStepContent\n stepData={stepData}\n handleCTAClick={handleCTAClick}\n handleSecondaryCTAClick={handleSecondaryCTAClick}\n />\n )\n },\n }\n\n const mergedCustomStepTypes = { ...DEFAULT_CUSTOM_STEP_TYPES, ...customStepTypes }\n\n const [selectedStepInternal, setSelectedStepInternal] = useState(0)\n\n const selectedStepValue = selectedStep ?? selectedStepInternal\n const setSelectedStepValue = setSelectedStep ?? setSelectedStepInternal\n\n const StepContent = () => {\n if (!steps) return <></>\n if (!steps[selectedStepValue]?.type || !mergedCustomStepTypes[steps[selectedStepValue].type]) {\n return mergedCustomStepTypes['default'](steps[selectedStepValue])\n }\n\n // check if mergedCustomStepTypes[steps[selectedStepValue].type] is a function\n if (typeof mergedCustomStepTypes[steps[selectedStepValue].type] !== 'function') {\n return mergedCustomStepTypes[steps[selectedStepValue].type]\n }\n\n return mergedCustomStepTypes[steps[selectedStepValue].type]({\n stepData: steps[selectedStepValue],\n primaryColor: appearance.theme.colorPrimary,\n })\n }\n\n const completeCount = steps.filter((s) => s.complete).length\n\n if (!visible) return <></>\n\n if (!appearance.theme.modalContainer) {\n if (appearance.theme.borderRadius) {\n ContainerStyle.borderRadius = appearance.theme.borderRadius + 'px'\n }\n appearance.theme.modalContainer = ContainerStyle\n }\n\n return (\n <Modal onClose={onClose} visible={visible} appearance={appearance}>\n <ChecklistContainer>\n <HeaderContent>\n <ChecklistTitle\n appearance={appearance}\n className={getClassName('checklistTitle', appearance)}\n >\n {title}\n </ChecklistTitle>\n <ChecklistSubtitle\n appearance={appearance}\n className={getClassName('checklistSubtitle', appearance)}\n >\n {subtitle}\n </ChecklistSubtitle>\n </HeaderContent>\n\n <ScrollContainer>\n {steps && steps.length > 0 && (\n <StepsContainer className={getClassName('stepsContainer', appearance)}>\n <StepsHeader>\n <div style={{ flex: 3 }}>\n <StepsTitle className={getClassName('stepsTitle', appearance)}>\n {stepsTitle}\n </StepsTitle>\n </div>\n <ProgressBarContainer>\n <ProgressBar\n style={{ width: '100%' }}\n count={completeCount}\n total={steps.length}\n appearance={appearance}\n />\n </ProgressBarContainer>\n </StepsHeader>\n <StepsBody>\n <StepListContainer\n className={getClassName('checklistStepListContainer', appearance)}\n appearance={appearance}\n >\n {steps.map((stepData: StepData, idx: number) => {\n const isSelected = selectedStepValue === idx\n return (\n <StepListItem\n selected={isSelected}\n className={getClassName(\n `checklistStepListItem${isSelected ? 'Selected' : ''}`,\n appearance\n )}\n key={`checklist-guide-step-${stepData.id ?? idx}`}\n disabled={stepData.blocked}\n onClick={() => {\n if (stepData.blocked) {\n return\n }\n setSelectedStepValue(idx)\n }}\n title={stepData.blocked ? 'Finish remaining steps to continue' : undefined}\n >\n {isSelected && (\n <StepItemSelectedIndicator\n className={getClassName(\n 'checklistStepItemSelectedIndicator',\n appearance\n )}\n layoutId=\"checklist-step-selected\"\n style={{\n backgroundColor: appearance.theme.colorPrimary,\n borderRadius: 0,\n height: '100%',\n top: '0%',\n width: '2px',\n }}\n ></StepItemSelectedIndicator>\n )}\n <StepListStepName\n selected={isSelected}\n className={getClassName(\n `checklistStepListStepName${isSelected ? 'Selected' : ''}`,\n appearance\n )}\n >\n {stepData.stepName}\n </StepListStepName>\n <StepListItemRight>\n <CheckBox\n value={stepData.complete}\n type=\"round\"\n primaryColor={appearance.theme.colorPrimary}\n progress={stepData.progress}\n appearance={appearance}\n />\n <CenterVertical>\n <Chevron\n style={{ marginLeft: '10px' }}\n color={appearance.theme.colorBackgroundSecondary}\n />\n </CenterVertical>\n </StepListItemRight>\n </StepListItem>\n )\n })}\n </StepListContainer>\n\n <StepContent />\n </StepsBody>\n </StepsContainer>\n )}\n {guideData && guideData.length > 0 && (\n <Guide\n steps={guideData}\n title={guideTitle}\n primaryColor={appearance.theme.colorPrimary}\n style={{\n border: 'none',\n boxShadow: 'none',\n }}\n appearance={appearance}\n onButtonClick={(step) => {\n if (onGuideButtonClick) {\n onGuideButtonClick(step)\n }\n\n return true\n }}\n />\n )}\n </ScrollContainer>\n </ChecklistContainer>\n </Modal>\n )\n}\n\nexport default ChecklistWithGuide\n","import React, { CSSProperties } from 'react'\nimport styled from 'styled-components'\n\nconst ChevronSVG = styled.svg`\n transition: 'transform 0.35s ease-in-out';\n`\n\nexport const Chevron = ({\n style,\n className,\n}: {\n color?: string\n style?: CSSProperties\n className?: string\n}) => (\n <ChevronSVG\n width=\"7\"\n height=\"10\"\n viewBox=\"0 0 9 15\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={style}\n className={className}\n >\n <path\n d=\"M1 13L7.5 7L0.999999 1\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </ChevronSVG>\n)\n","import { CSSProperties } from 'react'\nimport styled from 'styled-components'\nimport { getCustomClassOverrides } from '../../../shared/appearance'\n\n// Styles for top level container and text\n\nexport const ContainerStyle: CSSProperties = {\n boxShadow: '0px 6px 25px rgba(0, 0, 0, 0.06)',\n padding: '32px',\n maxHeight: '700px',\n msOverflowStyle: 'none' /* IE and Edge */,\n scrollbarWidth: 'none' /* Firefox */,\n paddingBottom: '12px',\n minHeight: '610px',\n}\n\nexport const ScrollContainer = styled.div`\n max-height: 350px;\n padding-bottom: 40px;\n`\n\nexport const HeaderContent = styled.div`\n display: flex;\n flex-direction: column;\n margin-top: 20px;\n`\n\nexport const ChecklistTitle = styled.h1<{ appearance }>`\n font-style: normal;\n font-weight: 600;\n font-size: 30px;\n line-height: 36px;\n margin-bottom: 16px;\n color: ${(props) => props.appearance?.theme?.colorText};\n`\nexport const ChecklistSubtitle = styled.h2<{ appearance }>`\n font-weight: 400;\n font-size: 16px;\n line-height: 20px;\n margin-bottom: 16px;\n padding-left: 1px;\n color: ${(props) => props.appearance?.theme?.colorTextSecondary};\n`\n\nexport const StepsContainer = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n border: 1px solid #fafafa;\n }\n box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.05);\n border-radius: 14px;\n display: flex;\n flex-direction: column;\n min-height: 240px;\n overflow: hidden;\n`\n\nexport const StepsHeader = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n`\n\nexport const StepsTitle = styled.p`\n ${(props) => getCustomClassOverrides(props)} {\n font-weight: 400;\n font-size: 10px;\n line-height: 12px;\n text-transform: uppercase;\n color: #8c8c8c;\n margin: 20px;\n }\n`\n\nexport const StepsBody = styled.div`\n display: flex;\n flex-direction: row;\n`\n\nexport const StepListContainer = styled.div`\n flex: 1;\n`\n\n// Styles for Step content\n\nexport const StepContainer = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n display: flex;\n justify-content: center;\n align-content: center;\n flex-direction: column;\n flex: 1;\n padding-left: 8px;\n padding-right: 8px;\n }\n`\n\nexport const StepTitle = styled.p`\n ${(props) => getCustomClassOverrides(props)} {\n font-style: normal;\n font-weight: 600;\n font-size: 22px;\n line-height: 26px;\n\n text-align: center;\n color: ${(props) => props.appearance.theme.colorText};\n margin-top: 20px;\n margin-bottom: 16px;\n }\n`\n\nexport const StepSubtitle = styled.p`\n ${(props) => getCustomClassOverrides(props)} {\n font-weight: 400;\n font-size: 14px;\n line-height: 18px;\n text-align: center;\n color: ${(props) => props.appearance.theme.colorTextSecondary};\n margin-bottom: 8px;\n }\n`\n\nexport const MultipleButtonContainer = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n display: flex;\n flex-direction: row;\n justify-content: center;\n gap: 8px;\n }\n`\n\nexport const StepListItem = styled.div<{ selected: boolean }>`\n ${(props) => getCustomClassOverrides(props)} {\n // Anything inside this block will be ignored if the user provides a custom class\n background-color: ${(props) => (props.selected ? '#FAFAFA' : '#FFFFFF')};\n :hover {\n background-color: #fafafa;\n }\n }\n //Check if attr disabled is true\n &[disabled] {\n opacity: 0.3;\n cursor: not-allowed;\n }\n\n padding: 20px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n position: relative;\n cursor: pointer;\n`\n\nexport const StepListStepName = styled.p<{ selected: boolean }>`\n ${(props) => getCustomClassOverrides(props)} {\n // Anything inside this block will be ignored if the user provides a custom class\n color: ${(props) => (props.selected ? '#434343' : '#BFBFBF')};\n }\n font-weight: ${(props) => (props.selected ? 500 : 400)};\n font-size: 14px;\n line-height: 22px;\n margin: 0;\n`\n\nexport const StepListItemRight = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n align-content: center;\n`\n\nexport const ProgressBarContainer = styled.div`\n display: flex;\n flex: 1;\n flex-direction: row;\n justify-content: flex-end;\n align-content: center;\n align-items: center;\n margin-right: 20px;\n`\n\nexport const ChecklistContainer = styled.div`\n display: block;\n width: 100%;\n`\n","import styled from 'styled-components'\n\nexport const CenterVertical = styled.div`\n flex-direction: column;\n justify-content: center;\n display: flex;\n`","import React, { CSSProperties, FC } from 'react'\nimport { Appearance, DefaultFrigadeFlowProps, StepData } from '../../types'\n\nimport {\n GuideContainer,\n GuideIcon,\n GuideIconWrapper,\n GuideItem,\n GuideItemLink,\n GuideItems,\n GuideItemSubtitle,\n GuideItemTitle,\n GuideTitle,\n} from './styled'\nimport { getClassName } from '../../shared/appearance'\nimport { useCTAClickSideEffects } from '../../hooks/useCTAClickSideEffects'\nimport { sanitize } from '../../shared/sanitizer'\n\nexport interface GuideStepData extends StepData {\n icon?: string\n}\n\ninterface GuideProps extends Pick<DefaultFrigadeFlowProps, 'onButtonClick'> {\n steps: GuideStepData[]\n title: string\n style?: CSSProperties\n primaryColor?: string\n appearance: Appearance\n}\n\n/**\n * A guide is essentially a list of links that does not have a state\n */\nconst Guide: FC<GuideProps> = ({\n steps,\n style,\n title,\n primaryColor,\n appearance,\n onButtonClick,\n}) => {\n const { primaryCTAClickSideEffects } = useCTAClickSideEffects()\n\n return (\n <GuideContainer style={style} className={getClassName('guideContainer', appearance)}>\n <GuideTitle className={getClassName('guideTitle', appearance)}>{title}</GuideTitle>\n <GuideItems className={getClassName('guideItemContainer', appearance)}>\n {steps.map((stepData: GuideStepData, idx) => {\n return (\n <GuideItem\n key={`guide-${stepData.id ?? idx}`}\n className={getClassName('guideItem', appearance)}\n >\n {stepData.icon && (\n <GuideIconWrapper className={getClassName('guideIcon', appearance)}>\n <GuideIcon>{stepData.icon}</GuideIcon>\n </GuideIconWrapper>\n )}\n\n <GuideItemTitle\n className={getClassName('guideItemTitle', appearance)}\n dangerouslySetInnerHTML={sanitize(stepData.title)}\n />\n <GuideItemSubtitle\n className={getClassName('guideItemSubtitle', appearance)}\n dangerouslySetInnerHTML={sanitize(stepData.subtitle)}\n />\n <GuideItemLink\n className={getClassName('guideItemLink', appearance)}\n color={primaryColor}\n onClick={() => {\n if (stepData.primaryButtonUri) {\n primaryCTAClickSideEffects(stepData)\n }\n if (onButtonClick) {\n onButtonClick(stepData)\n }\n }}\n >\n {stepData.primaryButtonTitle}\n </GuideItemLink>\n </GuideItem>\n )\n })}\n </GuideItems>\n </GuideContainer>\n )\n}\n\nexport default Guide\n","import styled from 'styled-components'\nimport { getCustomClassOverrides } from '../../shared/appearance'\n\nexport const GuideContainer = styled.div`\n border: 1px solid #fafafa;\n box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.05);\n border-radius: 14px;\n padding-top: 20px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n`\n\nexport const GuideItems = styled.div`\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n overflow: hidden;\n row-gap: 10px;\n`\n\nexport const GuideTitle = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n color: #595959;\n }\n text-transform: uppercase;\n font-weight: 400;\n font-size: 10px;\n line-height: 12px;\n letter-spacing: 0.09em;\n margin-bottom: 12px;\n`\n\nexport const GuideItem = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n // Anything inside this block will be ignored if the user provides a custom class\n background: #ffffff;\n border: 1px solid #fafafa;\n }\n border-radius: 14px;\n padding: 20px;\n flex-direction: column;\n align-content: center;\n\n max-width: 150px;\n min-width: 200px;\n`\n\nexport const GuideIconWrapper = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n background: radial-gradient(50% 50% at 50% 50%, #ffffff 0%, #f7f7f7 100%);\n }\n width: 40px;\n height: 40px;\n\n border-radius: 7px;\n display: flex;\n justify-content: center;\n align-content: center;\n align-items: center;\n`\n\nexport const GuideIcon = styled.div`\n font-weight: 600;\n font-size: 20px;\n line-height: 24px;\n width: 20px;\n height: 20px;\n`\n\nexport const GuideItemTitle = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n color: #434343;\n }\n font-weight: 600;\n font-size: 14px;\n line-height: 17px;\n margin-top: 12px;\n margin-bottom: 8px;\n`\n\nexport const GuideItemSubtitle = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n color: #8c8c8c;\n }\n font-weight: 400;\n font-size: 12px;\n line-height: 14px;\n`\n\nexport const GuideItemLink = styled.a<{ color: string }>`\n color: ${(props) => props.color};\n font-size: 12px;\n line-height: 14px;\n font-weight: 400;\n cursor: pointer;\n`\n","import React, { FC, useEffect, useState } from 'react'\nimport { StepData } from '../../../types'\nimport { Modal } from '../../Modal'\nimport { ProgressBar } from '../Checklist/ProgressBar'\nimport { CollapsibleStep } from './CollapsibleStep'\n\nimport {\n ChecklistContainer,\n CondensedInlineChecklistContainer,\n HeaderContent,\n ModalChecklistSubtitle,\n ModalChecklistTitle,\n} from './styled'\nimport { sanitize } from '../../../shared/sanitizer'\nimport { getClassName, mergeClasses } from '../../../shared/appearance'\nimport { FrigadeChecklistProps } from '../../../FrigadeChecklist'\n\nexport interface CondensedChecklistProps extends Omit<FrigadeChecklistProps, 'flowId'> {\n autoCollapse?: boolean\n onClose: () => void\n}\n\nconst CondensedChecklist: FC<CondensedChecklistProps> = ({\n title,\n subtitle,\n steps,\n onClose,\n visible,\n autoExpandFirstIncompleteStep = true,\n autoCollapse = true,\n autoExpandNextStep = true,\n setSelectedStep,\n appearance,\n type,\n className,\n customStepTypes,\n style,\n onButtonClick,\n}) => {\n const completeCount = steps.filter((s) => s.complete).length\n const [collapsedSteps, setCollapsedSteps] = useState<boolean[]>(Array(steps.length).fill(true))\n\n useEffect(() => {\n const initCollapsedState = [...collapsedSteps]\n if (!autoExpandFirstIncompleteStep) return\n for (let i = 0; i < steps.length; i++) {\n if (!steps[i].complete) {\n initCollapsedState[i] = false\n break\n }\n }\n setCollapsedSteps(initCollapsedState)\n }, [])\n\n //\n // useEffect(() => {\n // if (!autoExpandFirstIncompleteStep) {\n // return\n // }\n // handleStepClick(selectedStep)\n // }, [selectedStep])\n //\n // useEffect(() => {\n // if (!autoExpandNextStep) return\n // // If selected step is not open, open it\n // if (collapsedSteps[selectedStep]) {\n // handleStepClick(selectedStep)\n // }\n // }, [selectedStep])\n\n const handleStepClick = (idx: number) => {\n const newCollapsedState = [...collapsedSteps]\n if (autoCollapse) {\n for (let i = 0; i < collapsedSteps.length; ++i) {\n if (i != idx && newCollapsedState[idx]) {\n newCollapsedState[i] = true\n }\n }\n }\n newCollapsedState[idx] = !collapsedSteps[idx]\n setCollapsedSteps(newCollapsedState)\n }\n\n if (!visible && type == 'modal') return <></>\n\n const headerContent = (\n <>\n <HeaderContent>\n <ModalChecklistTitle\n appearance={appearance}\n className={getClassName('checklistTitle', appearance)}\n dangerouslySetInnerHTML={sanitize(title)}\n />\n <ModalChecklistSubtitle\n appearance={appearance}\n className={getClassName('checklistSubtitle', appearance)}\n dangerouslySetInnerHTML={sanitize(subtitle)}\n />\n </HeaderContent>\n <ProgressBar\n display=\"percent\"\n count={completeCount}\n total={steps.length}\n style={{ margin: '14px 0px 8px 0px' }}\n appearance={appearance}\n />\n </>\n )\n\n const checklistContent = (\n <ChecklistContainer\n className={mergeClasses(getClassName('checklistContainer', appearance), className)}\n >\n {steps.map((step: StepData, idx: number) => {\n const isCollapsed = collapsedSteps[idx]\n return (\n <CollapsibleStep\n appearance={appearance}\n stepData={step}\n collapsed={isCollapsed}\n key={`modal-checklist-${step.id ?? idx}`}\n onClick={() => {\n handleStepClick(idx)\n setSelectedStep(idx)\n if (onButtonClick) {\n onButtonClick(steps[idx], idx, collapsedSteps[idx] ? 'expand' : 'collapse')\n }\n }}\n onPrimaryButtonClick={() => {\n handleStepClick(idx)\n if (autoExpandNextStep && idx < steps.length - 1) {\n setSelectedStep(idx + 1)\n }\n if (step.handlePrimaryButtonClick) {\n step.handlePrimaryButtonClick()\n }\n }}\n onSecondaryButtonClick={() => {\n if (step.handleSecondaryButtonClick) {\n step.handleSecondaryButtonClick()\n }\n }}\n customStepTypes={customStepTypes}\n />\n )\n })}\n </ChecklistContainer>\n )\n\n if (type === 'inline') {\n return (\n <CondensedInlineChecklistContainer\n appearance={appearance}\n className={mergeClasses(getClassName('checklistInlineContainer', appearance), className)}\n style={style}\n >\n {headerContent}\n {checklistContent}\n </CondensedInlineChecklistContainer>\n )\n }\n\n return (\n <>\n <Modal\n onClose={onClose}\n visible={visible}\n appearance={appearance}\n style={{ maxWidth: '600px' }}\n headerContent={headerContent}\n >\n {checklistContent}\n </Modal>\n </>\n )\n}\n\nexport default CondensedChecklist\n","import React, { FC } from 'react'\nimport { Appearance, StepData } from '../../../../types'\nimport { CheckBoxRow } from '../../../CheckBoxRow'\nimport { Chevron } from '../../../Icons/Chevron'\nimport { Button, MultipleButtonContainer } from '../../../Button'\n\nimport {\n CollapseChevronContainer,\n HeaderLeft,\n StepContainer,\n StepHeader,\n StepImage,\n StepMediaContainer,\n StepSubtitle,\n StepTitle,\n} from './styled'\nimport { sanitize } from '../../../../shared/sanitizer'\nimport { getClassName } from '../../../../shared/appearance'\nimport { VideoCard } from '../../../Video/VideoCard'\n\ninterface CollapsibleStepProps {\n stepData: StepData\n collapsed: boolean\n onClick: () => void\n onSecondaryButtonClick: () => void\n onPrimaryButtonClick: () => void\n appearance?: Appearance\n /**\n * Map of custom step types that the checklist supports. To use a custom steps in your checklist, see [Component Customization](/component/customization#customizing-frigade-components)\n */\n customStepTypes?: Record<\n string,\n ((stepData: StepData, appearance: Appearance) => React.ReactNode) | React.ReactNode\n >\n}\n\nexport const CollapsibleStep: FC<CollapsibleStepProps> = ({\n stepData,\n collapsed,\n onClick,\n onPrimaryButtonClick,\n onSecondaryButtonClick,\n appearance,\n customStepTypes,\n}) => {\n const iconStyle = collapsed ? {} : { transform: 'rotate(90deg)' }\n const stepContentStyle = collapsed\n ? {\n overflow: 'hidden',\n maxHeight: '0px',\n transition: 'max-height 0.35s ease-out',\n }\n : {\n overflow: 'hidden',\n maxHeight: '1000px',\n transition: 'max-height 0.7s ease-out',\n }\n\n function getDefaultStepContent() {\n return (\n <>\n {stepData.imageUri || stepData.videoUri ? (\n <StepMediaContainer className={getClassName('stepMediaContainer', appearance)}>\n {stepData.imageUri ? (\n <StepImage\n className={getClassName('stepImage', appearance)}\n src={stepData.imageUri}\n />\n ) : null}\n {stepData.videoUri ? (\n <VideoCard\n appearance={appearance}\n videoUri={stepData.videoUri}\n autoplay={stepData.props?.autoplayVideo}\n />\n ) : null}\n </StepMediaContainer>\n ) : null}\n <StepSubtitle\n className={getClassName('stepSubtitle', appearance)}\n appearance={appearance}\n dangerouslySetInnerHTML={sanitize(stepData.subtitle)}\n />\n <MultipleButtonContainer className={getClassName('checklistCTAContainer', appearance)}>\n {stepData.secondaryButtonTitle ? (\n <Button\n secondary\n title={stepData.secondaryButtonTitle}\n onClick={() => onSecondaryButtonClick()}\n appearance={appearance}\n />\n ) : null}\n <Button\n title={stepData.primaryButtonTitle ?? 'Continue'}\n onClick={() => onPrimaryButtonClick()}\n appearance={appearance}\n />\n </MultipleButtonContainer>\n </>\n )\n }\n\n function getCustomStep() {\n if (!customStepTypes) {\n return null\n }\n const customStep = customStepTypes[stepData.type]\n if (!customStep) {\n return null\n }\n // Check if not a function\n if (typeof customStep !== 'function') {\n return customStep\n }\n\n return customStep(stepData, appearance)\n }\n\n return (\n <StepContainer\n data-testid={`step-${stepData.id}`}\n className={getClassName('checklistStepContainer', appearance)}\n appearance={appearance}\n >\n <StepHeader className={getClassName('stepHeader', appearance)} onClick={() => onClick()}>\n <HeaderLeft className={getClassName('stepHeaderContent', appearance)}>\n <CheckBoxRow\n value={stepData.complete}\n style={{ width: 'auto', borderTop: 0 }}\n primaryColor={appearance?.theme?.colorPrimary}\n appearance={appearance}\n />\n <StepTitle\n appearance={appearance}\n className={getClassName('stepTitle', appearance)}\n dangerouslySetInnerHTML={sanitize(stepData.title)}\n />\n </HeaderLeft>\n\n <CollapseChevronContainer\n className={getClassName('stepChevronContainer', appearance)}\n appearance={appearance}\n >\n <Chevron style={{ ...iconStyle, transition: 'transform 0.2s ease-in-out' }} />\n </CollapseChevronContainer>\n </StepHeader>\n\n <div\n key={stepData.id}\n style={{\n ...stepContentStyle,\n }}\n className={getClassName('stepContent', appearance)}\n >\n {getCustomStep() ?? getDefaultStepContent()}\n </div>\n </StepContainer>\n )\n}\n","import styled from 'styled-components'\n\nexport const StepContainer = styled.div<{ appearance }>`\n background-color: ${(props) => props.appearance?.theme?.colorBackground};\n border: 1px solid;\n border-color: ${(props) => props.appearance?.theme?.colorBorder};\n border-radius: 6px;\n padding: 2px 20px 2px 20px;\n display: flex;\n margin-top: 14px;\n margin-bottom: 14px;\n display: flex;\n flex-direction: column;\n transition: max-height 0.25s;\n`\n\nexport const StepMediaContainer = styled.div`\n display: flex;\n margin-bottom: 20px;\n`\n\nexport const StepImage = styled.img`\n border-radius: 4px;\n max-height: 260px;\n min-height: 200px;\n`\nexport const StepHeader = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n cursor: pointer;\n :hover {\n opacity: 0.8;\n }\n`\n\nexport const StepTitle = styled.p<{ appearance }>`\n color: ${(props) => props.appearance?.theme?.colorText};\n font-style: normal;\n font-weight: 500;\n font-size: 16px;\n line-height: 18px;\n margin-left: 8px;\n cursor: pointer;\n :hover {\n opacity: 0.8;\n }\n`\n\nexport const CollapseChevronContainer = styled.div`\n cursor: pointer;\n color: ${(props) => props.appearance.theme.colorTextSecondary};\n :hover {\n opacity: 0.8;\n }\n`\n\nexport const ExpandedContentContainer = styled.div``\n\nexport const StepSubtitle = styled.p<{ appearance }>`\n color: ${(props) => props.appearance?.theme?.colorText};\n font-weight: 400;\n font-size: 14px;\n line-height: 22px;\n`\n\nexport const HeaderLeft = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n`\n","import styled from 'styled-components'\n\nexport const ModalChecklistContainer = styled.div`\n background: #ffffff;\n box-shadow: 0px 6px 25px rgba(0, 0, 0, 0.06);\n border-radius: 6px;\n z-index: 10;\n padding: 32px;\n\n position: absolute;\n width: 80%;\n top: 20%;\n left: 20%;\n\n max-width: 800px;\n min-width: 350px;\n`\n\nexport const HeaderContent = styled.div`\n display: flex;\n flex-direction: column;\n`\n\nexport const ModalChecklistTitle = styled.h1<{ appearance }>`\n color: ${(props) => props.appearance?.theme?.colorText};\n font-style: normal;\n font-weight: 700;\n font-size: 20px;\n line-height: 24px;\n margin-bottom: 8px;\n`\nexport const ModalChecklistSubtitle = styled.h2<{ appearance }>`\n color: ${(props) => props.appearance?.theme?.colorTextSecondary};\n font-weight: 400;\n font-size: 14px;\n line-height: 23px;\n margin: 2px 0 0 0;\n`\nexport const ChecklistContainer = styled.div`\n display: block;\n width: 100%;\n`\nexport const CondensedInlineChecklistContainer = styled.div`\n display: flex;\n width: 100%;\n flex-direction: column;\n justify-content: space-between;\n padding: 24px;\n border-radius: ${(props) => props.appearance?.theme?.borderRadius}px;\n background-color: ${(props) => props.appearance?.theme?.colorBackground};\n`\n","import React, { useEffect, useRef, useState } from 'react'\nimport { useFlows } from '../../../api/flows'\nimport { useMediaQuery } from '../../../hooks/useMediaQuery'\n\nimport { CarouselCard } from './CarouselCard'\n\nimport {\n Body,\n CarouselContainer,\n CarouselScroll,\n CarouselScrollGroup,\n CarouselTitle,\n ProgressWrapper,\n StyledCarouselFade,\n StyledScrollButton,\n} from './styled'\nimport { DefaultFrigadeFlowProps } from '../../../types'\nimport { getClassName, mergeClasses } from '../../../shared/appearance'\nimport { RenderInlineStyles } from '../../RenderInlineStyles'\nimport { ProgressBar } from '../Checklist/ProgressBar'\nimport { sanitize } from '../../../shared/sanitizer'\n\nconst RightArrow = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 6L20 12\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" />\n <path d=\"M14 18L20 12\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" />\n <path d=\"M4 12H20\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" />\n </svg>\n)\n\nconst CarouselFade: React.FC<{ side?: string; show?: boolean; onClick?: any }> = ({\n side = 'left',\n show = false,\n onClick = () => {},\n}) => {\n const [mounted, setMounted] = useState(false)\n const [reversed, setReversed] = useState(false)\n\n useEffect(() => {\n if (show === true && mounted === false) {\n setMounted(true)\n } else if (show === false && mounted === true) {\n setReversed(true)\n }\n }, [show])\n\n const handleFadeOutEnd = () => {\n setMounted(false)\n setReversed(false)\n }\n\n const style: React.CSSProperties =\n side == 'left'\n ? { top: 0, bottom: 0, left: -20, transform: 'rotate(180deg)' }\n : { top: 0, bottom: 0, right: -20 }\n\n return mounted ? (\n <StyledCarouselFade\n style={style}\n reversed={reversed}\n onAnimationEnd={reversed ? handleFadeOutEnd : null}\n >\n <StyledScrollButton onClick={() => onClick()} style={{ right: 16, top: 'calc(50% - 24px)' }}>\n <RightArrow />\n </StyledScrollButton>\n </StyledCarouselFade>\n ) : null\n}\n\nexport interface CarouselChecklistProps extends DefaultFrigadeFlowProps {\n flowId: string\n}\n\nexport const CarouselChecklist: React.FC<CarouselChecklistProps> = ({\n flowId,\n appearance,\n customVariables,\n className,\n}) => {\n const scrollContainerRef = useRef<HTMLDivElement>(null)\n const [showLeftFade, setShowLeftFade] = useState(false)\n const [showRightFade, setShowRightFade] = useState(false)\n const [flowMetadata, setFlowMetadata] = useState(null)\n const [flowSteps, setFlowSteps] = useState([])\n const [numberOfStepsCompleted, setNumberOfStepsCompleted] = useState(0)\n const { isSmall } = useMediaQuery()\n\n const pageSize = isSmall ? 1 : 3\n\n const {\n getFlowMetadata,\n getFlowSteps,\n getNumberOfStepsCompleted,\n updateCustomVariables,\n isLoading,\n } = useFlows()\n\n useEffect(() => {\n updateCustomVariables(customVariables)\n }, [customVariables, isLoading])\n\n useEffect(() => {\n if (isLoading) return\n\n const metadata = getFlowMetadata(flowId)\n const completedStepCount = getNumberOfStepsCompleted(flowId)\n const steps = getFlowSteps(flowId)\n\n setFlowMetadata(metadata)\n if (metadata.data !== null || metadata.steps !== null) {\n setFlowSteps(steps.sort((a, b) => Number(a.complete) - Number(b.complete)))\n setShowRightFade(steps.length > pageSize)\n setNumberOfStepsCompleted(completedStepCount)\n }\n }, [isLoading])\n\n const scrollGroups: any[][] = []\n for (let i = 0; i < flowSteps.length; i += pageSize) {\n scrollGroups.push(flowSteps.slice(i, i + pageSize))\n }\n\n const handleScroll = (e: React.UIEvent<HTMLElement>) => {\n const target = e.target as HTMLElement\n const maxScroll = target.scrollWidth - target.clientWidth\n // Round up to avoid issues with fractional pixels\n const currentScroll = Math.ceil(target.scrollLeft)\n\n if (currentScroll > 0 && showLeftFade === false) {\n setShowLeftFade(true)\n }\n\n if (currentScroll === 0 && showLeftFade === true) {\n setShowLeftFade(false)\n }\n\n if (currentScroll < maxScroll && showRightFade === false) {\n setShowRightFade(true)\n }\n\n if (currentScroll === maxScroll && showRightFade === true) {\n setShowRightFade(false)\n }\n }\n\n const handleScrollByPage = (forward = true) => {\n const direction = forward ? 1 : -1\n\n if (scrollContainerRef.current === null) return\n\n scrollContainerRef.current.scrollBy({\n left: scrollContainerRef.current.clientWidth * direction,\n behavior: 'smooth',\n })\n }\n\n let scrollTimeout = null\n const throttledScroll = (e: React.UIEvent<HTMLElement>) => {\n if (scrollTimeout !== null) {\n clearTimeout(scrollTimeout)\n } else {\n // Invoke once before starting to throttle\n handleScroll(e)\n }\n\n scrollTimeout = setTimeout(() => {\n handleScroll(e)\n }, 16)\n }\n\n if (isLoading) {\n return null\n }\n\n return (\n <CarouselContainer\n className={mergeClasses(getClassName('carouselContainer', appearance), className)}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: isSmall ? 'center' : 'space-between',\n marginBottom: 20,\n flexWrap: isSmall ? 'wrap' : 'nowrap',\n gap: isSmall ? 16 : 20,\n }}\n >\n <div>\n <CarouselTitle\n className={getClassName('carouselTitle', appearance)}\n dangerouslySetInnerHTML={sanitize(flowMetadata?.title)}\n />\n <Body.Quiet\n className={getClassName('carouselSubtitle', appearance)}\n dangerouslySetInnerHTML={sanitize(flowMetadata?.subtitle)}\n />\n </div>\n <ProgressWrapper className={getClassName('progressWrapper', appearance)}>\n <ProgressBar\n count={numberOfStepsCompleted}\n total={flowSteps.length}\n appearance={appearance}\n />\n </ProgressWrapper>\n </div>\n\n <div style={{ position: 'relative' }}>\n <CarouselFade show={showLeftFade} onClick={() => handleScrollByPage(false)} />\n <CarouselFade side=\"right\" show={showRightFade} onClick={handleScrollByPage} />\n\n <CarouselScroll ref={scrollContainerRef} onScroll={throttledScroll}>\n {scrollGroups.map((group, i) => (\n <CarouselScrollGroup\n key={i}\n style={{\n flex: `0 0 calc(100% - ${flowSteps.length > pageSize ? 36 : 0}px)`,\n }}\n >\n {group.map((stepData, j) => (\n <CarouselCard\n key={j}\n stepData={stepData}\n style={{\n flex:\n flowSteps.length > pageSize\n ? `0 1 calc(100% / ${pageSize} - 16px * 2 / ${pageSize})`\n : 1,\n }}\n appearance={appearance}\n />\n ))}\n </CarouselScrollGroup>\n ))}\n </CarouselScroll>\n </div>\n <RenderInlineStyles appearance={appearance} />\n </CarouselContainer>\n )\n}\n","import { useEffect, useState } from 'react'\n\nexport const useMediaQuery = () => {\n const queries = {\n isSmall: '(max-width: 480px)',\n isMedium: '(min-width: 481px) AND (max-width: 1023px)',\n isLarge: '(min-width: 1025px)',\n }\n\n const defaultMatches = Object.fromEntries(Object.entries(queries).map(([key]) => [key, false]))\n\n const [matches, setMatches] = useState(defaultMatches)\n\n let updateTimeout = null\n const throttledUpdate = () => {\n if (updateTimeout !== null) {\n clearTimeout(updateTimeout)\n } else {\n updateMatches()\n }\n\n updateTimeout = setTimeout(() => {\n updateMatches()\n }, 16)\n }\n\n const updateMatches = () => {\n const freshMatches = Object.fromEntries(\n Object.entries(queries).map(([key, query]) => {\n if (!window) {\n return [key, false]\n }\n\n const mediaQuery = window.matchMedia(query)\n\n mediaQuery.addEventListener('change', throttledUpdate)\n\n return [key, mediaQuery.matches]\n })\n )\n\n setMatches(freshMatches)\n }\n\n useEffect(() => {\n updateMatches()\n }, [])\n\n return matches\n}\n","import React, { FC } from 'react'\nimport { Appearance, StepData } from '../../../types'\nimport { useCTAClickSideEffects } from '../../../hooks/useCTAClickSideEffects'\n\nimport {\n Body,\n CardTitle,\n CompletedPill,\n Small,\n StyledCarouselCard,\n StyledCarouselCardImage,\n} from './styled'\nimport { useTheme } from '../../../hooks/useTheme'\nimport { getClassName } from '../../../shared/appearance'\nimport { sanitize } from '../../../shared/sanitizer'\n\ninterface CarouselCardProps {\n stepData: StepData\n style?: React.CSSProperties\n appearance?: Appearance\n}\n\nexport const CarouselCard: FC<CarouselCardProps> = ({ stepData, style = {}, appearance }) => {\n const { mergeAppearanceWithDefault } = useTheme()\n const { primaryCTAClickSideEffects } = useCTAClickSideEffects()\n\n appearance = mergeAppearanceWithDefault(appearance)\n\n const {\n imageUri = null,\n subtitle = null,\n title = null,\n complete = false,\n blocked = false,\n } = stepData\n\n const hasCTA = stepData.primaryButtonTitle || stepData.secondaryButtonTitle\n\n const handleClick = () => {\n primaryCTAClickSideEffects(stepData)\n }\n\n return (\n <StyledCarouselCard\n className={getClassName('carouselCard', appearance)}\n onClick={blocked ? null : handleClick}\n style={style}\n blocked={blocked}\n complete={complete}\n >\n {imageUri && (\n <StyledCarouselCardImage\n className={getClassName('carouselCardImage', appearance)}\n src={imageUri}\n alt={title}\n style={{ opacity: complete || blocked ? 0.4 : 1 }}\n />\n )}\n {complete && (\n <CompletedPill className={getClassName('carouselCompletedPill', appearance)}>\n <Small style={{ color: '#108E0B' }}>Complete</Small>\n </CompletedPill>\n )}\n {title && (\n <CardTitle\n blocked={blocked}\n complete={complete}\n className={getClassName('carouselCardTitle', appearance)}\n dangerouslySetInnerHTML={sanitize(title)}\n />\n )}\n {subtitle && (\n <Body.Quiet\n blocked={blocked}\n complete={complete}\n className={getClassName('carouselCardSubtitle', appearance)}\n dangerouslySetInnerHTML={sanitize(subtitle)}\n />\n )}\n {/* !(complete || blocked) && hasCTA && <CTA stepData={stepData} appearance={appearance} /> */}\n </StyledCarouselCard>\n )\n}\n","import styled, { css, keyframes } from 'styled-components'\nimport { getCustomClassOverrides } from '../../../shared/appearance'\n\nconst defaultBorder = css`\n border: 1px solid ${({ theme }) => theme.colorBorder};\n`\n\nconst defaultShadow = css`\n box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.06);\n`\n\nconst fadeIn = keyframes`\n from {\n opacity: 0;\n } to {\n opacity: 1;\n }\n`\n\nconst fadeOut = keyframes`\n from {\n opacity: 1;\n } to {\n opacity: 0;\n }\n`\n\nexport const CarouselScroll = styled.div`\n margin: 0 -20px;\n overflow-x: auto;\n padding-left: 20px;\n padding-right: 20px;\n scroll-snap-type: x mandatory;\n\n display: flex;\n flex-flow: row nowrap;\n gap: 0 16px;\n\n -ms-overflow-style: none;\n scrollbar-width: none;\n\n ::-webkit-scrollbar {\n display: none;\n }\n`\n\nexport const CarouselScrollGroup = styled.div`\n display: flex;\n flex-flow: row nowrap;\n gap: 0 16px;\n scroll-snap-align: center;\n scroll-snap-stop: always;\n`\n\nexport const StyledCarouselFade = styled.div`\n animation: ${(props) => (props.reversed ? fadeOut : fadeIn)} 0.25s ease-out;\n background: linear-gradient(\n to right,\n ${({ theme }) => theme.colorBackground}00,\n ${({ theme }) => theme.colorBackground} 100%\n );\n position: absolute;\n width: 64px;\n z-index: 10;\n`\n\nexport const StyledScrollButton = styled.button`\n ${defaultBorder}\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1);\n align-items: center;\n border-radius: 50%;\n background: ${({ theme }) => theme.colorBackground};\n color: ${({ theme }) => theme.colorPrimary};\n display: flex;\n height: 48px;\n justify-content: center;\n position: absolute;\n width: 48px;\n`\n\nexport const Card = styled.div`\n border-radius: ${({ theme }) => theme.borderRadius}px;\n padding: 20px;\n`\n\nexport const StyledCarouselCard = styled(Card)`\n ${defaultBorder}\n background: ${({ theme }) => theme.colorBackground};\n position: relative;\n\n &:active {\n ${(props) => (!props.blocked ? `background: ${props.theme.colorBackgroundSecondary};` : ``)}\n }\n\n &:hover {\n ${(props) => (!props.blocked ? `border: 1px solid ${props.theme.colorPrimary};` : ``)}\n ${(props) => (!props.blocked ? `cursor: pointer` : `cursor: default`)}\n }\n`\n\nexport const StyledCarouselCardImage = styled.img`\n border-radius: 50%;\n height: 40px;\n margin-bottom: 12px;\n width: 40px;\n`\n\nexport const CarouselContainer = styled(Card)`\n ${(props) => getCustomClassOverrides(props)} {\n ${defaultShadow}\n\n background: ${({ theme }) => theme.colorBackground};\n }\n`\n\nexport const CarouselProgressBar = styled.div`\n color: ${({ theme }) => theme.colorPrimary};\n display: flex;\n flex-flow: row nowrap;\n align-items: center;\n`\n\nexport const ProgressBarLabel = styled.div`\n white-space: nowrap;\n`\n\nexport const CompletedPill = styled.div`\n background: #d8fed8;\n border-radius: 6px;\n float: right;\n margin-bottom: 12px;\n padding: 4px 10px;\n`\n\nexport const H3 = styled.p`\n font-weight: bold;\n font-size: 18px;\n line-height: 22px;\n letter-spacing: calc(18px * -0.01);\n margin: 0;\n`\n\nexport const CarouselTitle = styled(H3)`\n margin-bottom: 4px;\n`\n\nexport const ProgressWrapper = styled.div`\n display: flex;\n flex-flow: row nowrap;\n align-items: center;\n min-width: 50%;\n`\n\nexport const H4 = styled.p`\n font-weight: bold;\n font-size: 16px;\n line-height: 20px;\n letter-spacing: calc(16px * -0.01);\n margin: 0;\n`\n\nexport const CardTitle = styled(H4)`\n margin-bottom: 4px;\n ${(props) =>\n props.blocked || props.complete\n ? `opacity: 0.4;`\n : `\n `}\n`\n\nexport const Body = styled.p`\n color: ${({ theme }) => theme.colorText};\n font-weight: normal;\n font-size: 14px;\n line-height: 22px;\n margin: 0;\n`\n\nexport const Small = styled.p`\n color: ${({ theme }) => theme.colorText};\n font-weight: 600;\n font-size: 12px;\n line-height: 16px;\n margin: 0;\n`\n\nBody.Loud = styled(Body)`\n font-weight: 600;\n`\n\nBody.Quiet = styled(Body)`\n color: ${({ theme }) => theme.colorTextSecondary};\n ${(props) =>\n props.blocked || props.complete\n ? `opacity: 0.4;`\n : `\n `}\n`\n","import React, { CSSProperties, useEffect } from 'react'\nimport { useFlows } from '../api/flows'\nimport { MiniProgressBadge, ProgressBadgeType } from '../components/Checklists/MiniProgressBadge'\nimport { useFlowOpens } from '../api/flow-opens'\nimport { DefaultFrigadeFlowProps } from '../types'\nimport { COMPLETED_FLOW } from '../api/common'\nimport { RenderInlineStyles } from '../components/RenderInlineStyles'\nimport { useTheme } from '../hooks/useTheme'\nimport { FullWidthProgressBadge } from '../components/Checklists/FullWidthProgressBadge'\n\nexport interface FrigadeProgressBadgeProps extends DefaultFrigadeFlowProps {\n title: string\n subtitle?: string\n icon?: React.ReactNode\n textStyle?: CSSProperties\n onClick?: () => void\n hideOnFlowCompletion?: boolean\n type?: ProgressBadgeType\n}\n\nexport const FrigadeProgressBadge: React.FC<FrigadeProgressBadgeProps> = ({\n flowId,\n title,\n subtitle,\n icon,\n style,\n onClick,\n className,\n customVariables,\n hideOnFlowCompletion,\n appearance,\n type = 'default',\n}) => {\n const {\n getFlow,\n getFlowSteps,\n getFlowStatus,\n getNumberOfStepsCompleted,\n isLoading,\n targetingLogicShouldHideFlow,\n updateCustomVariables,\n } = useFlows()\n const { mergeAppearanceWithDefault } = useTheme()\n\n appearance = mergeAppearanceWithDefault(appearance)\n\n const { setOpenFlowState, getOpenFlowState } = useFlowOpens()\n\n useEffect(() => {\n updateCustomVariables(customVariables)\n }, [customVariables, isLoading])\n\n if (isLoading) {\n return null\n }\n\n const flow = getFlow(flowId)\n if (!flow) {\n return null\n }\n\n if (targetingLogicShouldHideFlow(flow)) {\n return null\n }\n\n if (hideOnFlowCompletion === true && getFlowStatus(flowId) === COMPLETED_FLOW) {\n return null\n }\n\n const steps = getFlowSteps(flowId)\n const completedCount = getNumberOfStepsCompleted(flowId)\n\n if (type === 'full-width') {\n return (\n <>\n <RenderInlineStyles appearance={appearance} />\n <FullWidthProgressBadge\n title={title}\n subtitle={subtitle}\n count={completedCount}\n total={steps.length}\n style={style}\n className={className}\n appearance={appearance}\n icon={icon}\n onClick={() => {}}\n />\n </>\n )\n }\n\n return (\n <>\n <RenderInlineStyles appearance={appearance} />\n <MiniProgressBadge\n count={completedCount}\n total={steps.length}\n title={title}\n style={style}\n onClick={() => {\n setOpenFlowState(flowId, true)\n if (onClick) {\n onClick()\n }\n }}\n type={type}\n className={className}\n appearance={appearance}\n />\n </>\n )\n}\n","import React, { CSSProperties, FC } from 'react'\nimport { Chevron } from '../../Icons/Chevron'\nimport { ProgressBar } from '../Checklist/ProgressBar'\nimport { BadgeContainer, BadgeRow, BadgeTitle, ProgressRingContainer } from './styled'\nimport { Appearance } from '../../../types'\nimport ProgressRing from '../../Progress/ProgressRing/ProgressRing'\nimport { getClassName, mergeClasses } from '../../../shared/appearance'\nimport { RenderInlineStyles } from '../../RenderInlineStyles'\n\nexport type ProgressBadgeType = 'condensed' | 'default' | 'full-width'\n\nexport interface ProgressBadgeProps {\n title: string\n subtitle?: string\n icon?: React.ReactNode\n count: number\n total: number\n style?: CSSProperties\n onClick: () => void\n className?: string\n type?: ProgressBadgeType\n appearance?: Appearance\n}\n\nexport const MiniProgressBadge: FC<ProgressBadgeProps> = ({\n title,\n count,\n total,\n onClick,\n style = {},\n className,\n appearance,\n type = 'default',\n}) => {\n return (\n <>\n <RenderInlineStyles appearance={appearance} />\n <BadgeContainer\n onClick={() => onClick !== undefined && onClick()}\n styleOverrides={{\n ...(type == 'condensed' ? { display: 'flex', justifyContent: 'space-between' } : {}),\n ...style,\n }}\n className={mergeClasses(\n className ?? '',\n getClassName('progressBadgeContainer', appearance)\n )}\n appearance={appearance}\n >\n {type == 'condensed' && total && total !== 0 && (\n <ProgressRingContainer className={getClassName('progressRingContainer', appearance)}>\n <ProgressRing\n size={19}\n percentage={count / total}\n fillColor={appearance.theme.colorPrimary}\n bgColor={appearance.theme.colorBackgroundSecondary}\n />\n </ProgressRingContainer>\n )}\n <BadgeRow type={type} className={getClassName('badgeTitleContainer', appearance)}>\n <BadgeTitle\n type={type}\n appearance={appearance}\n className={getClassName('badgeTitle', appearance)}\n >\n {title}\n </BadgeTitle>\n {onClick !== undefined && (\n <Chevron\n className={getClassName('badgeChevron', appearance)}\n color={appearance.theme.colorPrimary}\n />\n )}\n </BadgeRow>\n {type == 'default' && total && total !== 0 && (\n <ProgressBar\n display=\"compact\"\n count={count}\n total={total}\n bgColor={appearance.theme.colorBackgroundSecondary}\n style={{ width: '100%' }}\n appearance={appearance}\n textStyle={{\n color: '#818898',\n }}\n />\n )}\n </BadgeContainer>\n </>\n )\n}\n","import styled from 'styled-components'\nimport { styleOverridesToCSS } from '../../../shared/appearance'\n\nexport const BadgeContainer = styled.div`\n border: 1px solid ${(props) => props.appearance.theme.colorBorder};\n border-radius: ${(props) => props.appearance.theme.borderRadius}px;\n padding: 10px 12px 10px 12px;\n min-width: 160px;\n cursor: pointer;\n background-color: ${(props) => props.appearance.theme.colorBackground}};\n ${(props) => styleOverridesToCSS(props)}\n \n &:hover {\n filter: brightness(.99);\n }\n`\n\nexport const BadgeRow = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n margin-bottom: ${(props) => (props.type === 'condensed' ? '0' : '6px')};\n flex-grow: 2;\n`\n\nexport const BadgeTitle = styled.div<{ color; type }>`\n text-overflow: ellipsis;\n font-weight: 600;\n font-size: 14px;\n line-height: 16px;\n margin-right: ${(props) => (props.type === 'condensed' ? '8px' : '0')};\n text-align: ${(props) => (props.type === 'condensed' ? 'left' : 'right')};\n`\nexport const ProgressRingContainer = styled.div`\n width: 20px;\n margin-right: 8px;\n display: flex;\n height: 100%;\n align-items: center;\n`\n","import React from 'react'\n\nimport {\n FullWidthProgressBadgeContainer,\n IconContainer,\n ProgressBarContainer,\n TextContainer,\n} from './styled'\nimport { ProgressBadgeProps } from '../MiniProgressBadge'\nimport { TitleSubtitle } from '../../TitleSubtitle/TitleSubtitle'\nimport { getClassName, mergeClasses } from '../../../shared/appearance'\nimport { ProgressBar } from '../Checklist/ProgressBar'\n\nexport const FullWidthProgressBadge: React.FC<ProgressBadgeProps> = ({\n title,\n subtitle,\n icon,\n appearance,\n count,\n total,\n className,\n style,\n}) => {\n return (\n <>\n <FullWidthProgressBadgeContainer\n appearance={appearance}\n className={mergeClasses(\n getClassName('fullWidthProgressBadgeContainer', appearance),\n className ?? ''\n )}\n style={style}\n >\n {icon && (\n <IconContainer className={getClassName('fullWidthProgressBadgeIcon', appearance)}>\n {icon}\n </IconContainer>\n )}\n <TextContainer>\n <TitleSubtitle size={'small'} appearance={appearance} title={title} subtitle={subtitle} />\n </TextContainer>\n <ProgressBarContainer\n className={getClassName('fullWidthProgressBadgeProgressContainer', appearance)}\n >\n <ProgressBar count={count} total={total} display=\"percent\" textLocation=\"top\" />\n </ProgressBarContainer>\n </FullWidthProgressBadgeContainer>\n </>\n )\n}\n","import styled from 'styled-components'\nimport { getCustomClassOverrides } from '../../../shared/appearance'\n\nexport const FullWidthProgressBadgeContainer = styled.div`\n display: flex;\n flex-direction: row;\n width: 100%;\n padding: 16px;\n box-sizing: border-box;\n align-items: center;\n background-color: ${(props) => props.appearance.theme.colorBackground};\n border: 1px solid ${(props) => props.appearance.theme.colorBorder};\n border-radius: ${(props) => props.appearance.theme.borderRadius}px;\n`\n\nexport const IconContainer = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n display: flex;\n justify-content: center;\n align-items: center;\n margin-right: 16px;\n }\n`\n\nexport const TextContainer = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n margin-top: 0;\n`\nexport const ProgressBarContainer = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n margin-left: 16px;\n min-width: 200px;\n`\n\nexport const DismissButton = styled.div`\n display: flex;\n justify-content: center;\n align-items: flex-end;\n margin-left: 16px;\n cursor: pointer;\n :hover {\n opacity: 0.8;\n }\n`\n","import React, { FC } from 'react'\nimport { useFlows } from '../api/flows'\nimport { Guide } from '../components/Guides'\nimport { DefaultFrigadeFlowProps } from '../types'\nimport { useTheme } from '../hooks/useTheme'\n\nexport interface FrigadeGuideProps extends DefaultFrigadeFlowProps {\n title: string\n primaryColor?: string\n}\n\nexport const FrigadeGuide: FC<FrigadeGuideProps> = ({ flowId, style, appearance, ...props }) => {\n const { getFlow, targetingLogicShouldHideFlow, getFlowSteps } = useFlows()\n const { mergeAppearanceWithDefault } = useTheme()\n appearance = mergeAppearanceWithDefault(appearance)\n\n const flow = getFlow(flowId)\n if (!flow) {\n return null\n }\n\n if (targetingLogicShouldHideFlow(flow)) {\n return null\n }\n\n const steps = getFlowSteps(flowId)\n\n return <Guide steps={steps} style={style} appearance={appearance} {...props} />\n}\n","import React, { CSSProperties, FC, useContext, useEffect } from 'react'\nimport { useFlows } from '../api/flows'\nimport { ToolTipData, Tooltips } from '../components/Tooltips'\nimport { Appearance, DefaultFrigadeFlowProps, StepData } from '../types'\nimport { COMPLETED_FLOW, COMPLETED_STEP } from '../api/common'\nimport { Portal } from 'react-portal'\nimport { useFlowOpens } from '../api/flow-opens'\nimport { FrigadeContext } from '../FrigadeProvider'\nimport { RenderInlineStyles } from '../components/RenderInlineStyles'\nimport { useCTAClickSideEffects } from '../hooks/useCTAClickSideEffects'\nimport { useTheme } from '../hooks/useTheme'\nimport { useUserFlowStates } from '../api/user-flow-states'\nimport { ToolTipPosition } from '../components/Tooltips/Tooltips'\n\nexport interface FrigadeTourProps extends Omit<DefaultFrigadeFlowProps, 'flowId'> {\n /**\n * @ignore\n */\n steps?: ToolTipData[]\n onDismiss?: () => void\n onComplete?: () => void\n tooltipPosition?: ToolTipPosition\n /**\n * Whether to show the highlight (the small circle/ping) or not. Defaults to true.\n */\n showHighlight?: boolean\n /**\n * Whether to show more than one tooltip at a time. Defaults to false.\n */\n showTooltipsSimultaneously?: boolean\n /**\n * @ignore\n */\n buttonStyle?: CSSProperties\n /**\n * Offset to apply to all tooltips. If you only wish to apply an offset to a single tooltip you can use `props.offset` in the config.yml instead.\n */\n offset?: { x: number; y: number }\n visible?: boolean\n /**\n * @ignore\n */\n containerStyle?: CSSProperties\n customVariables?: { [key: string]: string | number | boolean }\n /**\n * @ignore\n */\n selectedStep?: number\n customStepTypes?: Record<\n string,\n (props: { stepData: StepData; primaryColor: string }) => React.ReactNode\n >\n appearance?: Appearance\n /**\n * Shows a close button in the top right corner of the tooltip. Depending on dismissBehavior, it will either end the entire flow or just the current step.\n */\n dismissible?: boolean\n primaryColor?: string\n /**\n * If true, the tooltip will only show the highlight and not the tooltip itself.\n * Clicking the highlight will reveal it.\n */\n showHighlightOnly?: boolean\n /**\n * If true, a step counter will show up in the tooltip.\n */\n showStepCount?: boolean\n /**\n * `skip-flow` (default): Completes the entire flow/tour when a single tooltip is dismissed.\n * `complete-step`: Completes the current step when a tooltip is dismissed. The user can continue in the tour.\n */\n dismissBehavior?: 'skip-flow' | 'complete-step'\n\n /**\n * @ignore\n */\n showFrigadeBranding?: boolean\n\n /**\n * If true, the tour will go to the next existing step/tip if the current selector element is not found on the page.\n * Be careful with this, as it can lead to unexpected behavior of tooltip ordering if the selector is slow to load on the page.\n * Defaults to false.\n */\n skipIfNotFound?: boolean\n /**\n * How to position the tooltips with CSS. Defaults to `absolute`.\n * @ignore\n */\n cssPosition?: 'fixed' | 'absolute' | 'static'\n}\n\nexport const FrigadeTour: FC<\n FrigadeTourProps & { flowId: string; initialSelectedStep?: number }\n> = ({\n flowId,\n customVariables,\n appearance,\n onStepCompletion,\n onButtonClick,\n showTooltipsSimultaneously = false,\n onDismiss,\n dismissible,\n tooltipPosition = 'auto',\n showHighlightOnly = false,\n dismissBehavior = 'skip-flow',\n onComplete,\n skipIfNotFound = false,\n cssPosition = 'absolute',\n className,\n ...props\n}) => {\n const {\n getFlow,\n getFlowSteps,\n isLoading,\n targetingLogicShouldHideFlow,\n markStepCompleted,\n markStepStarted,\n markFlowCompleted,\n markFlowSkipped,\n updateCustomVariables,\n getCurrentStepIndex,\n getStepStatus,\n isStepBlocked,\n getFlowStatus,\n getNumberOfStepsCompleted,\n } = useFlows()\n const { isLoadingUserFlowStateData } = useUserFlowStates()\n const { primaryCTAClickSideEffects, secondaryCTAClickSideEffects } = useCTAClickSideEffects()\n const { hasOpenModals } = useFlowOpens()\n const selectedStep = getCurrentStepIndex(flowId)\n const { openFlowStates } = useContext(FrigadeContext)\n\n const { mergeAppearanceWithDefault } = useTheme()\n\n appearance = mergeAppearanceWithDefault(appearance)\n\n useEffect(() => {\n updateCustomVariables(customVariables)\n }, [customVariables, isLoading])\n\n if (isLoadingUserFlowStateData) {\n return null\n }\n\n const flow = getFlow(flowId)\n if (!flow) {\n return null\n }\n\n if (targetingLogicShouldHideFlow(flow)) {\n return null\n }\n\n if (getFlowStatus(flowId) == COMPLETED_FLOW) {\n return null\n }\n\n // Check if any other flow modals are open. If so hide this one\n if (hasOpenModals()) {\n return null\n }\n\n const steps: ToolTipData[] = getFlowSteps(flowId)\n\n // Hide tour flow if another flow is open\n if (Object.keys(openFlowStates).length > 0) {\n const otherFlowId = Object.keys(openFlowStates).find(\n (_flowID) => openFlowStates[_flowID] === true\n )\n if (otherFlowId !== undefined && otherFlowId !== flowId) {\n return <></>\n }\n }\n\n async function markTooltipCompleted(stepData: StepData) {\n await markStepCompleted(flowId, stepData.id)\n\n // Check if all steps are now completed\n if (\n steps\n .map((step: StepData) => getStepStatus(flowId, step.id))\n .every((status) => status === COMPLETED_STEP)\n ) {\n await markFlowCompleted(flowId)\n return\n }\n if (!showHighlightOnly && selectedStep + 1 < steps.length && !showTooltipsSimultaneously) {\n // Double check next step is not blocked\n if (isStepBlocked(flowId, steps[selectedStep + 1].id)) {\n return\n }\n }\n }\n\n function handleStepCompletionHandlers(step: StepData, cta: 'primary' | 'secondary', idx: number) {\n const maybeNextStep = selectedStep + 1 < steps.length ? steps[selectedStep + 1] : null\n if (onButtonClick) {\n onButtonClick(step, selectedStep, cta, maybeNextStep)\n }\n if (onStepCompletion) {\n onStepCompletion(step, idx, maybeNextStep)\n }\n }\n\n function getSteps() {\n return steps.map((step: StepData) => {\n return {\n ...step,\n handleSecondaryButtonClick: async () => {\n // Default to skip behavior for secondary click but allow for override\n secondaryCTAClickSideEffects(step)\n if (step.skippable === true) {\n await markStepCompleted(flowId, step.id, { skipped: true })\n }\n handleStepCompletionHandlers(step, 'secondary', selectedStep)\n },\n handlePrimaryButtonClick: async () => {\n if (\n (!step.completionCriteria &&\n (step.autoMarkCompleted || step.autoMarkCompleted === undefined)) ||\n (step.completionCriteria && step.autoMarkCompleted === true)\n ) {\n await markTooltipCompleted(step)\n }\n handleStepCompletionHandlers(step, 'primary', selectedStep)\n primaryCTAClickSideEffects(step)\n },\n }\n })\n }\n\n async function onDismissTooltip(stepData: StepData) {\n if (onDismiss) {\n onDismiss()\n }\n if (dismissBehavior === 'skip-flow') {\n await markFlowSkipped(flowId)\n } else {\n await markStepCompleted(flowId, stepData.id)\n }\n }\n\n function handleComplete() {\n if (onComplete) {\n onComplete()\n }\n }\n\n async function handleViewTooltip(index: number) {\n await markStepStarted(flowId, steps[index].id)\n }\n\n const isCurrentSelectorMissing = !Boolean(document.querySelector(steps[selectedStep].selector))\n\n function renderMultipleToolTips() {\n const firstVisibleIndex = steps.findIndex((step, idx) => {\n return Boolean(document.querySelector(step.selector)) && idx >= selectedStep\n })\n\n return steps.map((step: StepData, idx: number) => {\n if (showTooltipsSimultaneously) {\n return (\n <Tooltips\n key={step.id}\n appearance={appearance}\n steps={getSteps()}\n selectedStep={idx}\n showTooltipsSimultaneously={showTooltipsSimultaneously}\n dismissible={dismissible}\n onDismiss={() => onDismissTooltip(step)}\n tooltipPosition={tooltipPosition}\n showHighlightOnly={showHighlightOnly}\n completedStepsCount={getNumberOfStepsCompleted(flowId)}\n onComplete={handleComplete}\n cssPosition={cssPosition}\n onViewTooltip={handleViewTooltip}\n className={className}\n {...props}\n />\n )\n }\n\n if (skipIfNotFound && isCurrentSelectorMissing && idx === firstVisibleIndex) {\n return (\n <Tooltips\n key={step.id}\n appearance={appearance}\n steps={getSteps()}\n selectedStep={idx}\n showTooltipsSimultaneously={showTooltipsSimultaneously}\n dismissible={dismissible}\n onDismiss={() => onDismissTooltip(step)}\n tooltipPosition={tooltipPosition}\n showHighlightOnly={showHighlightOnly}\n completedStepsCount={getNumberOfStepsCompleted(flowId)}\n onComplete={handleComplete}\n cssPosition={cssPosition}\n onViewTooltip={handleViewTooltip}\n className={className}\n {...props}\n />\n )\n }\n\n if (idx != selectedStep) {\n return null\n }\n\n return (\n <Tooltips\n key={step.id}\n appearance={appearance}\n steps={getSteps()}\n selectedStep={idx}\n showTooltipsSimultaneously={showTooltipsSimultaneously}\n dismissible={dismissible}\n onDismiss={() => onDismissTooltip(step)}\n tooltipPosition={tooltipPosition}\n showHighlightOnly={showHighlightOnly}\n completedStepsCount={getNumberOfStepsCompleted(flowId)}\n onComplete={handleComplete}\n cssPosition={cssPosition}\n onViewTooltip={handleViewTooltip}\n className={className}\n {...props}\n />\n )\n })\n }\n\n function getTooltips() {\n return (\n <>\n <RenderInlineStyles appearance={appearance} />\n {renderMultipleToolTips()}\n </>\n )\n }\n\n if (cssPosition === 'static') {\n return getTooltips()\n }\n\n return <Portal>{getTooltips()}</Portal>\n}\n\nexport default FrigadeTour\n","import React, { CSSProperties, FC, useEffect, useLayoutEffect, useRef, useState } from 'react'\n\nimport { Button } from '../Button'\nimport { Close } from '../Icons/Close'\nimport styled from 'styled-components'\nimport { getPosition, useElemRect } from './position'\nimport {\n TooltipContainer,\n TooltipContentContainer,\n TooltipCTAContainer,\n TooltipDismissButton,\n TooltipFooter,\n TooltipImageContainer,\n TooltipStepCountContainer,\n TooltipStepCounter,\n TooltipVideoContainer,\n} from './styled'\nimport { StepData } from '../../types'\n\nimport { getClassName } from '../../shared/appearance'\nimport { TitleSubtitle } from '../TitleSubtitle/TitleSubtitle'\nimport { VideoCard } from '../Video/VideoCard'\nimport { PoweredByFrigadeTooltipRibbon } from '../branding/styled'\nimport { PoweredByFrigade } from '../branding/PoweredByFrigade'\nimport { FrigadeTourProps } from '../../FrigadeTour'\nimport { useDebug } from '../../hooks/useDebug'\n\nexport type ToolTipPosition = 'left' | 'right' | 'auto'\n\nconst DEFAULT_CARD_WIDTH = 300\nconst DEFAULT_CARD_HEIGHT = 100\nconst DEFAULT_REFRESH_DELAY = 500\nconst HIGHLIGHT_RADIUS = 12\n\nexport interface ToolTipData extends StepData {\n selector?: string\n subtitleStyle?: CSSProperties\n titleStyle?: CSSProperties\n buttonStyle?: CSSProperties\n}\n\ninterface ToolTipPropsInternal extends FrigadeTourProps {\n completedStepsCount: number\n onViewTooltip: (step: number) => void\n}\n\nconst HighlightOuter = styled.div<{ primaryColor: string }>`\n width: 100%;\n height: 100%;\n border-radius: 9999px;\n display: inline-flex;\n background-color: ${(props: any) => props.primaryColor};\n animation-duration: 1.5s;\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n animation-delay: 0.15s;\n animation-iteration-count: infinite;\n animation-direction: normal;\n animation-fill-mode: none;\n animation-play-state: running;\n animation-name: ping;\n opacity: 0.15;\n\n @keyframes ping {\n 75%,\n to {\n transform: scale(1.75);\n opacity: 0;\n }\n }\n`\n\nconst HighlightInner = styled.div<{ primaryColor: string }>`\n width: ${HIGHLIGHT_RADIUS}px;\n height: ${HIGHLIGHT_RADIUS}px;\n border-radius: 100px;\n background-color: ${(props) => props.primaryColor};\n z-index: 20;\n opacity: 1;\n`\n\nconst TooltipWrapper = styled.div`\n pointer-events: all;\n`\n\nconst PositionWrapper = styled.div<{ primaryColor: string }>`\n display: flex;\n align-content: center;\n justify-content: center;\n align-items: center;\n z-index: ${(props) => (props.zIndex ? props.zIndex : 90)};\n`\n\nconst HighlightContainer = styled(PositionWrapper)`\n width: ${HIGHLIGHT_RADIUS + 12}px;\n height: ${HIGHLIGHT_RADIUS + 12}px;\n`\n\nconst Tooltips: FC<ToolTipPropsInternal> = ({\n steps = [],\n onDismiss,\n onComplete = () => {},\n tooltipPosition = 'auto',\n showHighlight = true,\n primaryColor = '#000000',\n offset = { x: 0, y: 0 },\n visible = true,\n containerStyle = {},\n selectedStep = 0,\n customStepTypes,\n appearance,\n dismissible = false,\n showHighlightOnly,\n showStepCount = true,\n completedStepsCount = 0,\n showFrigadeBranding = false,\n cssPosition = 'absolute',\n onViewTooltip,\n className,\n}) => {\n const { logErrorIfDebugMode } = useDebug()\n const [selfBounds, setSelfBounds] = useState<undefined | Partial<DOMRect>>()\n const [needsUpdate, setNeedsUpdate] = useState(new Date())\n const selfRef = useRef(null)\n\n const [elem, setElem] = useState(document.querySelector(steps[selectedStep].selector))\n const boundingRect = useElemRect(elem, needsUpdate)\n const [lastBoundingRect, setLastBoundingRect] = useState<string>()\n const [showTooltipContainer, setShowTooltipContainer] = useState(!showHighlightOnly)\n const positionStyle = steps[selectedStep]?.props?.position\n ? steps[selectedStep].props.position\n : cssPosition\n const zIndex = steps[selectedStep]?.props?.zIndex ?? 90\n const cardWidth = selfBounds?.width ?? DEFAULT_CARD_WIDTH\n const cardHeight = selfBounds?.height ?? DEFAULT_CARD_HEIGHT\n const [renderTime, setRenderTime] = useState(new Date().getTime())\n offset = steps[selectedStep]?.props?.offset ?? offset\n\n const url = window.location.pathname.split('/').pop()\n\n useLayoutEffect(() => {\n if (selfRef.current) {\n setSelfBounds({\n width: selfRef.current.clientWidth,\n height: selfRef.current.clientHeight,\n })\n }\n }, [selectedStep, needsUpdate, positionStyle])\n\n useEffect(() => {\n if (!showHighlightOnly) {\n setShowTooltipContainer(true)\n }\n }, [selectedStep])\n\n useEffect(() => {\n if (visible && showTooltipContainer) {\n onViewTooltip(selectedStep)\n }\n }, [showTooltipContainer])\n\n const handleRefreshPosition = () => {\n if (positionStyle === 'static') {\n return\n }\n\n const elem = document.querySelector(steps[selectedStep].selector)\n if (!elem) {\n setLastBoundingRect(undefined)\n setElem(null)\n logErrorIfDebugMode(\n `FrigadeTour: Could not find element with selector \"${steps[selectedStep].selector}\" for step ${steps[selectedStep].id}`\n )\n return\n }\n if (lastBoundingRect && lastBoundingRect === JSON.stringify(elem?.getBoundingClientRect())) {\n return\n }\n setElem(elem)\n setNeedsUpdate(new Date())\n if (elem) {\n setLastBoundingRect(JSON.stringify(elem.getBoundingClientRect()))\n }\n }\n\n useEffect(() => {\n const observer = new MutationObserver(handleRefreshPosition)\n observer.observe(document.body, { subtree: true, childList: true })\n return () => observer.disconnect()\n }, [handleRefreshPosition])\n\n useEffect(() => {\n const observer = new MutationObserver(handleRefreshPosition)\n observer.observe(document.body, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeFilter: ['style', 'class'],\n })\n return () => observer.disconnect()\n }, [handleRefreshPosition])\n\n useEffect(() => {\n const intervalId = setInterval(() => {\n handleRefreshPosition()\n }, 10)\n return () => clearInterval(intervalId)\n }, [handleRefreshPosition])\n\n useLayoutEffect(() => {\n setTimeout(() => {\n handleRefreshPosition()\n }, DEFAULT_REFRESH_DELAY)\n\n handleRefreshPosition()\n }, [selectedStep, url])\n\n useEffect(() => {\n if (!visible) {\n return\n }\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onDismiss()\n }\n }\n document.addEventListener('keydown', handleEscape)\n\n return () => {\n document.removeEventListener('keydown', handleEscape)\n }\n }, [])\n\n if (elem === null || !visible) {\n return null\n }\n\n let tooltipPositionValue: ToolTipPosition =\n tooltipPosition === 'auto' ? 'right' : (tooltipPosition as ToolTipPosition)\n\n let position = getPosition(boundingRect, tooltipPositionValue, cardWidth, offset, positionStyle)\n\n const rightSideIsCropped =\n boundingRect.right + cardWidth > (window.innerWidth || document.documentElement.clientWidth)\n const bottomIsCropped =\n boundingRect.bottom + DEFAULT_CARD_HEIGHT >\n (window.innerHeight || document.documentElement.clientHeight)\n\n if (rightSideIsCropped && tooltipPosition === 'auto') {\n position = getPosition(boundingRect, 'left', cardWidth, offset, positionStyle)\n tooltipPositionValue = 'left'\n }\n\n if (\n steps[selectedStep]?.props?.tooltipPosition &&\n steps[selectedStep]?.props?.tooltipPosition !== 'auto' &&\n (steps[selectedStep]?.props?.tooltipPosition === 'left' ||\n steps[selectedStep]?.props?.tooltipPosition === 'right')\n ) {\n tooltipPositionValue = steps[selectedStep].props.tooltipPosition\n }\n\n const DefaultFooterContent = () => {\n const handleOnCTAClick = () => {\n if (steps[selectedStep].handlePrimaryButtonClick) {\n steps[selectedStep].handlePrimaryButtonClick()\n setShowTooltipContainer(false)\n setTimeout(() => {\n handleRefreshPosition()\n }, 30)\n }\n if (completedStepsCount === steps.length - 1) {\n return onComplete()\n }\n }\n\n const handleOnSecondaryCTAClick = () => {\n if (steps[selectedStep].handleSecondaryButtonClick) {\n steps[selectedStep].handleSecondaryButtonClick()\n if (showHighlightOnly && !steps[selectedStep].secondaryButtonUri) {\n setShowTooltipContainer(false)\n }\n }\n }\n\n return (\n <>\n {showStepCount && steps.length > 1 && (\n <TooltipStepCountContainer>\n <TooltipStepCounter\n role=\"status\"\n className={getClassName('tooltipStepCounter', appearance)}\n >\n {selectedStep + 1} of {steps.length}\n </TooltipStepCounter>\n </TooltipStepCountContainer>\n )}\n {(steps[selectedStep].primaryButtonTitle || steps[selectedStep].secondaryButtonTitle) && (\n <TooltipCTAContainer\n showStepCount={showStepCount}\n className={getClassName('tooltipCTAContainer', appearance)}\n >\n {steps[selectedStep].secondaryButtonTitle && (\n <Button\n title={steps[selectedStep].secondaryButtonTitle}\n appearance={appearance}\n onClick={handleOnSecondaryCTAClick}\n size=\"small\"\n withMargin={false}\n secondary\n />\n )}\n {steps[selectedStep].primaryButtonTitle && (\n <Button\n title={steps[selectedStep].primaryButtonTitle}\n appearance={appearance}\n onClick={handleOnCTAClick}\n autoFocus={true}\n withMargin={false}\n size=\"small\"\n />\n )}\n </TooltipCTAContainer>\n )}\n </>\n )\n }\n\n const DefaultTooltipStepContent = () => {\n return (\n <>\n {dismissible && (\n <TooltipDismissButton\n data-testid=\"tooltip-dismiss\"\n onClick={() => {\n if (onDismiss) {\n onDismiss()\n }\n }}\n className={getClassName('tooltipClose', appearance)}\n hasImage={!!steps[selectedStep].imageUri || !!steps[selectedStep].videoUri}\n aria-label=\"Close Tooltip\"\n role=\"button\"\n tabIndex={0}\n >\n <Close />\n </TooltipDismissButton>\n )}\n {steps[selectedStep].imageUri && (\n <TooltipImageContainer\n dismissible={dismissible}\n appearance={appearance}\n role=\"img\"\n aria-label={steps[selectedStep].title}\n src={steps[selectedStep].imageUri}\n className={getClassName('tooltipImageContainer', appearance)}\n />\n )}\n {steps[selectedStep].videoUri && !steps[selectedStep].imageUri && (\n <TooltipVideoContainer\n dismissible={dismissible}\n appearance={appearance}\n role=\"video\"\n aria-label={steps[selectedStep].title}\n className={getClassName('tooltipVideoContainer', appearance)}\n >\n <VideoCard\n appearance={appearance}\n videoUri={steps[selectedStep].videoUri}\n autoplay={steps[selectedStep].props?.autoplayVideo}\n />\n </TooltipVideoContainer>\n )}\n <TooltipContentContainer className={getClassName('tooltipContentContainer', appearance)}>\n <TitleSubtitle\n appearance={appearance}\n title={steps[selectedStep].title}\n subtitle={steps[selectedStep].subtitle}\n size=\"small\"\n ariaPrefix={`Tooltip${steps[selectedStep].id}`}\n />\n <TooltipFooter className={getClassName('tooltipFooter', appearance)}>\n <DefaultFooterContent />\n </TooltipFooter>\n </TooltipContentContainer>\n </>\n )\n }\n\n const DEFAULT_CUSTOM_STEP_TYPES = {\n default: (_: StepData) => {\n if (steps[selectedStep]?.StepContent) {\n const Content: React.ReactNode = steps[selectedStep].StepContent\n return <div>{Content}</div>\n }\n\n return <DefaultTooltipStepContent />\n },\n }\n\n const mergedCustomStepTypes = { ...DEFAULT_CUSTOM_STEP_TYPES, ...customStepTypes }\n\n const StepContent = () => {\n if (!steps) return <></>\n if (!steps[selectedStep]?.type || !mergedCustomStepTypes[steps[selectedStep].type]) {\n return mergedCustomStepTypes['default'](steps[selectedStep])\n }\n return mergedCustomStepTypes[steps[selectedStep].type]({\n stepData: steps[selectedStep],\n primaryColor: primaryColor,\n })\n }\n\n if (steps[selectedStep].complete === true) {\n return null\n }\n\n // Do not position the tooltip until 10ms after the first render\n // This is to prevent the tooltip from appearing in the wrong place\n // when the page is loading\n if (position.x == 0 && position.y == 0 && new Date().getTime() - renderTime < 100) {\n return null\n }\n\n const cssPos = {\n top: position?.y - HIGHLIGHT_RADIUS ?? 0,\n left:\n (tooltipPositionValue == 'left'\n ? boundingRect.x + offset.x\n : position?.x - HIGHLIGHT_RADIUS) ?? 0,\n cursor: showHighlightOnly ? 'pointer' : 'default',\n position: positionStyle,\n }\n\n // Lock tooltip position to be within bounds of the window\n const getBoundedLeftPosition = () => {\n const spaceFromEdge = 20\n const leftOffset = cssPos.left + (tooltipPositionValue == 'left' ? -cardWidth : 24)\n\n return Math.min(\n Math.max(leftOffset, spaceFromEdge),\n window.innerWidth - cardWidth - spaceFromEdge\n )\n }\n\n const getBoundedTopPosition = () => {\n if (positionStyle === 'fixed') {\n return cssPos.top\n }\n\n const tooltipBottom = cssPos.top + cardHeight\n const spaceFromEdge = 20\n if (tooltipBottom > window.innerHeight - spaceFromEdge) {\n return cssPos.top + -cardHeight\n }\n return cssPos.top\n }\n\n const handleClick = () => {\n if (showHighlightOnly) {\n setNeedsUpdate(new Date())\n setShowTooltipContainer(!showTooltipContainer)\n }\n }\n\n return (\n <TooltipWrapper className={className}>\n <HighlightContainer\n style={cssPos}\n zIndex={zIndex}\n className={getClassName('tourHighlightContainer', appearance)}\n >\n {showHighlight &&\n steps[selectedStep].showHighlight !== false &&\n cssPosition !== 'static' && (\n <>\n <HighlightInner\n style={{\n position: positionStyle,\n }}\n onClick={handleClick}\n primaryColor={appearance.theme.colorPrimary}\n className={getClassName('tourHighlightInnerCircle', appearance)}\n ></HighlightInner>\n <HighlightOuter\n style={{\n position: 'absolute',\n }}\n onClick={handleClick}\n primaryColor={appearance.theme.colorPrimary}\n className={getClassName('tourHighlightOuterCircle', appearance)}\n ></HighlightOuter>\n </>\n )}\n </HighlightContainer>\n <PositionWrapper\n style={{\n ...cssPos,\n left: getBoundedLeftPosition(),\n top: getBoundedTopPosition(),\n }}\n zIndex={zIndex + 1}\n className={getClassName('tooltipContainerWrapper', appearance)}\n >\n {showTooltipContainer && (\n <>\n <TooltipContainer\n ref={selfRef}\n role=\"dialog\"\n aria-labelledby={`frigadeTooltip${steps[selectedStep].id}Title`}\n aria-describedby={`frigadeTooltip${steps[selectedStep].id}Subtitle`}\n layoutId=\"tooltip-container\"\n tabIndex={0}\n aria-label=\"Tooltip\"\n style={{\n position: 'relative',\n width: 'max-content',\n right: 0,\n top: cssPosition !== 'static' ? 12 : 0,\n ...containerStyle,\n }}\n appearance={appearance}\n className={getClassName('tooltipContainer', appearance)}\n maxWidth={DEFAULT_CARD_WIDTH}\n zIndex={zIndex + 10}\n >\n <StepContent />\n </TooltipContainer>\n {showFrigadeBranding && (\n <PoweredByFrigadeTooltipRibbon\n className={getClassName('poweredByFrigadeTooltipRibbon', appearance)}\n appearance={appearance}\n zIndex={zIndex + 10}\n >\n <PoweredByFrigade appearance={appearance} />\n </PoweredByFrigadeTooltipRibbon>\n )}\n </>\n )}\n </PositionWrapper>\n </TooltipWrapper>\n )\n}\n\nexport default Tooltips\n","import { ToolTipPosition } from './Tooltips'\nimport { useCallback, useEffect, useState } from 'react'\n\ntype Point = {\n x: number\n y: number\n}\n\nexport const getPosition = (\n boundingRect: DOMRect,\n position: ToolTipPosition,\n cardWidth: number,\n offset: Point = { x: 20, y: 20 },\n positionStyle: string\n): Point => {\n const scrollY = positionStyle == 'fixed' ? 0 : window.scrollY\n const scrollX = positionStyle == 'fixed' ? 0 : window.scrollX\n\n if (position === 'left') {\n return {\n x: boundingRect.left - cardWidth + offset.x + scrollX,\n y: boundingRect.top - offset.y + scrollY,\n }\n } else if (position === 'right') {\n return {\n x: boundingRect.left + boundingRect.width + offset.x + scrollX,\n y: boundingRect.top - offset.y + scrollY,\n }\n }\n\n return { x: 0, y: 0 }\n}\n\nexport function useElemRect(elem: Element | undefined, refresher?: any): DOMRect {\n // Spoof DOMRect for server renders\n const initialRect =\n 'DOMRect' in globalThis\n ? new DOMRect()\n : {\n height: 0,\n width: 0,\n x: 0,\n y: 0,\n bottom: 0,\n top: 0,\n right: 0,\n left: 0,\n toJSON: () => {},\n }\n\n const [dimensions, setDimensions] = useState(initialRect)\n const handleResize = useCallback(() => {\n if (!elem) return\n setDimensions(elem.getBoundingClientRect())\n }, [elem])\n\n useEffect(() => {\n handleResize()\n window.addEventListener('resize', handleResize)\n return () => window.removeEventListener('resize', handleResize)\n }, [elem, refresher])\n\n return dimensions\n}\n","import { useContext, useState } from 'react'\nimport { FrigadeContext } from '../FrigadeProvider'\n\nexport function useDebug() {\n const { debug } = useContext(FrigadeContext)\n const [logMessages, setLogMessages] = useState<string[]>([])\n\n function logIfDebugMode(message) {\n if (!debug) {\n return\n }\n if (logMessages.find((m) => m === message)) {\n return\n }\n setLogMessages([...logMessages, message])\n console.log(message)\n }\n\n function logErrorIfDebugMode(message) {\n if (!debug) {\n return\n }\n if (logMessages.find((m) => m === message)) {\n return\n }\n setLogMessages([...logMessages, message])\n console.warn(message)\n }\n\n return {\n logIfDebugMode,\n logErrorIfDebugMode,\n }\n}\n","import React, { FC, useEffect, useRef, useState } from 'react'\n\nimport { DefaultFrigadeFlowProps, StepData } from '../types'\nimport { useFlows } from '../api/flows'\nimport { Portal } from 'react-portal'\nimport {\n FloatingWidgetButton,\n FloatingWidgetContainer,\n FloatingWidgetMenu,\n FlowWidgetMenuItem,\n SupportButton,\n SupportIconContainer,\n SupportTitle,\n} from './styled'\nimport { Question } from '../components/Icons/Question'\nimport { getClassName } from '../shared/appearance'\nimport { QuestionCircle } from '../components/Icons/QuestionCircle'\nimport { useCTAClickSideEffects } from '../hooks/useCTAClickSideEffects'\nimport { useTheme } from '../hooks/useTheme'\nimport { RenderInlineStyles } from '../components/RenderInlineStyles'\n\nexport interface FrigadeSupportWidgetProps extends DefaultFrigadeFlowProps {\n type?: 'floating' | 'inline'\n visible?: boolean\n title?: string\n}\n\nexport const FrigadeSupportWidget: FC<FrigadeSupportWidgetProps> = ({\n flowId,\n style,\n onStepCompletion,\n visible = true,\n type = 'inline',\n title = 'Help',\n appearance,\n}) => {\n const {\n getFlow,\n getFlowSteps,\n markStepCompleted,\n getStepStatus,\n getNumberOfStepsCompleted,\n isLoading,\n targetingLogicShouldHideFlow,\n } = useFlows()\n const { primaryCTAClickSideEffects } = useCTAClickSideEffects()\n const wrapperRef = useRef(null)\n const [showMenu, setShowMenu] = useState(false)\n const { mergeAppearanceWithDefault } = useTheme()\n\n appearance = mergeAppearanceWithDefault(appearance)\n\n // below is the same as componentDidMount and componentDidUnmount\n useEffect(() => {\n document.addEventListener('click', handleClickOutside, false)\n return () => {\n document.removeEventListener('click', handleClickOutside, false)\n }\n }, [])\n\n const handleClickOutside = (event) => {\n if (wrapperRef.current && !wrapperRef.current.contains(event.target)) {\n setShowMenu(false)\n }\n }\n\n if (isLoading) {\n return null\n }\n const flow = getFlow(flowId)\n if (!flow) {\n return null\n }\n\n if (targetingLogicShouldHideFlow(flow)) {\n return null\n }\n\n const steps: StepData[] = getFlowSteps(flowId)\n if (!steps) {\n return null\n }\n\n if (!visible) {\n return null\n }\n\n function handlePrimaryButtonClick(step: StepData, index: number) {\n if (\n !step.completionCriteria &&\n (step.autoMarkCompleted || step.autoMarkCompleted === undefined)\n ) {\n markStepCompleted(flowId, step.id)\n }\n primaryCTAClickSideEffects(step)\n if (onStepCompletion) {\n onStepCompletion(step, index)\n }\n setShowMenu(false)\n }\n\n function Menu() {\n return (\n showMenu && (\n <FloatingWidgetMenu\n className={getClassName('floatingWidgetMenu', appearance)}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.1 }}\n type={type}\n >\n {steps.map((step, index) => (\n <FlowWidgetMenuItem\n className={getClassName('floatingWidgetMenuItem', appearance)}\n key={index}\n onClick={() => handlePrimaryButtonClick(step, index)}\n >\n {step.title}\n </FlowWidgetMenuItem>\n ))}\n </FloatingWidgetMenu>\n )\n )\n }\n\n if (type == 'inline') {\n return (\n <span ref={wrapperRef}>\n <RenderInlineStyles appearance={appearance} />\n <SupportButton\n style={style}\n onClick={() => {\n setShowMenu(!showMenu)\n }}\n className={getClassName('supportButton', appearance)}\n >\n <SupportIconContainer className={getClassName('supportIconContainer', appearance)}>\n <QuestionCircle\n className={getClassName('supportIcon', appearance)}\n style={{ width: '18px', height: '18px' }}\n />\n </SupportIconContainer>\n <SupportTitle className={getClassName('supportButtonTitle', appearance)}>\n {title}\n </SupportTitle>\n </SupportButton>\n <Menu />\n </span>\n )\n }\n\n return (\n <Portal>\n <RenderInlineStyles appearance={appearance} />\n <FloatingWidgetContainer style={style} ref={wrapperRef}>\n <Menu />\n <FloatingWidgetButton\n onClick={() => {\n setShowMenu(!showMenu)\n }}\n whileHover={{ scale: 1.1 }}\n className={getClassName('floatingWidgetButton', appearance)}\n >\n <Question\n className={getClassName('floatingWidgetButtonIcon', appearance)}\n style={{ display: 'flex', width: '20px', height: '20px' }}\n />\n </FloatingWidgetButton>\n </FloatingWidgetContainer>\n </Portal>\n )\n}\n\nexport default FrigadeSupportWidget\n","import styled from 'styled-components'\nimport { getCustomClassOverrides } from '../shared/appearance'\n\nexport const SupportButton = styled.button`\n ${(props) => getCustomClassOverrides(props)} {\n // Anything inside this block will be ignored if the user provides a custom class\n\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n padding: 6px 10px;\n gap: 8px;\n\n background: #fafafa;\n border: 1px solid #d9d9d9;\n border-radius: 21px;\n font-size: 12px;\n :hover {\n opacity: 0.8;\n }\n }\n`\n\nexport const SupportTitle = styled.span`\n ${(props) => getCustomClassOverrides(props)} {\n font-size: 12px;\n display: inline-block;\n }\n`\nexport const SupportIconContainer = styled.span`\n ${(props) => getCustomClassOverrides(props)} {\n font-size: 12px;\n display: inline-block;\n }\n`\n\nexport const FloatingWidgetContainer = styled.div`\n position: fixed;\n right: 0;\n bottom: 0;\n margin-right: 24px;\n margin-bottom: 24px;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n z-index: 50;\n`\n\nexport const FloatingWidgetButton = styled.button`\n ${(props) => getCustomClassOverrides(props)} {\n // Anything inside this block will be ignored if the user provides a custom class\n background-color: #ffffff;\n border: 1px solid #f5f5f5;\n }\n width: 50px;\n height: 50px;\n display: flex;\n align-content: center;\n align-items: center;\n justify-content: center;\n box-shadow: 0px 9px 28px 8px rgba(0, 0, 0, 0.05), 0px 6px 16px rgba(0, 0, 0, 0.08),\n 0px 3px 6px -4px rgba(0, 0, 0, 0.12);\n border-radius: 45px;\n cursor: pointer;\n`\nexport const FloatingWidgetMenu = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n // Anything inside this block will be ignored if the user provides a custom class\n background: #ffffff;\n }\n\n display: flex;\n flex-direction: column;\n min-width: 200px;\n padding: 4px;\n box-shadow: 0px 9px 28px 8px rgba(0, 0, 0, 0.05), 0px 6px 16px rgba(0, 0, 0, 0.08),\n 0px 3px 6px -4px rgba(0, 0, 0, 0.12);\n border-radius: 8px;\n margin-bottom: 22px;\n position: ${(props) => (props.type == 'inline' ? 'absolute' : 'relative')};\n top: ${(props) => (props.type == 'inline' ? '68px' : 0)};\n margin-left: ${(props) => (props.type == 'inline' ? '-127px' : 0)};\n`\n\nexport const FlowWidgetMenuItem = styled.button`\n ${(props) => getCustomClassOverrides(props)} {\n // Anything inside this block will be ignored if the user provides a custom class\n color: #434343;\n :hover {\n background-color: #f5f5f5;\n }\n }\n\n display: flex;\n border-radius: 8px;\n background-color: transparent;\n border: none;\n cursor: pointer;\n font-size: 14px;\n\n padding: 8px 12px;\n`\n","import React, { CSSProperties } from 'react'\n\nexport const Question = ({\n style,\n className,\n}: {\n color?: string\n style?: CSSProperties\n className?: string\n}) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n viewBox=\"0 0 18 18\"\n style={style}\n className={className}\n >\n <path\n fill=\"currentColor\"\n d=\"M13.43 4.938a4.494 4.494 0 00-1.043-1.435A4.955 4.955 0 009 2.197c-1.276 0-2.48.464-3.387 1.305A4.502 4.502 0 004.57 4.938a4.242 4.242 0 00-.386 1.773v.475c0 .109.087.197.196.197h.95a.197.197 0 00.197-.197V6.71c0-1.749 1.557-3.17 3.473-3.17s3.473 1.421 3.473 3.17c0 .718-.254 1.393-.738 1.955a3.537 3.537 0 01-1.9 1.125 1.928 1.928 0 00-1.085.682c-.271.343-.42.768-.42 1.206v.552c0 .109.088.197.197.197h.95a.197.197 0 00.196-.197v-.552c0-.276.192-.519.457-.578a4.904 4.904 0 002.625-1.56c.335-.392.597-.828.778-1.3a4.256 4.256 0 00-.103-3.303zM9 13.834a.985.985 0 10.001 1.97.985.985 0 00-.001-1.97z\"\n ></path>\n </svg>\n)\n","import React, { CSSProperties } from 'react'\n\nexport const QuestionCircle = ({\n style,\n className,\n}: {\n color?: string\n style?: CSSProperties\n className?: string\n}) => (\n <svg\n style={style}\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"1.5\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z\"\n />\n </svg>\n)\n","import { DefaultFrigadeFlowProps } from '../types'\nimport React, { useEffect } from 'react'\nimport { useFlows } from '../api/flows'\nimport { useCTAClickSideEffects } from '../hooks/useCTAClickSideEffects'\nimport { useTheme } from '../hooks/useTheme'\nimport { COMPLETED_FLOW } from '../api/common'\nimport { RenderInlineStyles } from '../components/RenderInlineStyles'\nimport { CallToActionContainer, DismissButton, EmbeddedTipContainer, TextContainer } from './styled'\nimport { getClassName, mergeClasses } from '../shared/appearance'\nimport { Close } from '../components/Icons/Close'\nimport { TitleSubtitle } from '../components/TitleSubtitle/TitleSubtitle'\nimport { Button } from '../components/Button'\nimport { useFlowImpressions } from '../hooks/useFlowImpressions'\nimport { MediaContainer } from '../FrigadeAnnouncement/styled'\nimport { Media } from '../components/Media'\n\nexport interface FrigadeEmbeddedTipProps extends DefaultFrigadeFlowProps {\n dismissible?: boolean\n /**\n * Handler for when the container is clicked\n */\n onClick?: () => void\n}\n\nexport const FrigadeEmbeddedTip: React.FC<FrigadeEmbeddedTipProps> = ({\n flowId,\n onDismiss,\n customVariables,\n onButtonClick,\n appearance,\n className,\n style,\n dismissible,\n onClick,\n}) => {\n const {\n getFlow,\n markFlowCompleted,\n markFlowSkipped,\n markStepCompleted,\n isLoading,\n targetingLogicShouldHideFlow,\n updateCustomVariables,\n getFlowSteps,\n getFlowStatus,\n getCurrentStepIndex,\n } = useFlows()\n const { primaryCTAClickSideEffects, secondaryCTAClickSideEffects } = useCTAClickSideEffects()\n const { mergeAppearanceWithDefault } = useTheme()\n useFlowImpressions(flowId)\n\n appearance = mergeAppearanceWithDefault(appearance)\n\n useEffect(() => {\n updateCustomVariables(customVariables)\n }, [customVariables, isLoading])\n\n if (isLoading) {\n return null\n }\n\n const flow = getFlow(flowId)\n if (!flow) {\n return null\n }\n\n if (targetingLogicShouldHideFlow(flow)) {\n return null\n }\n\n if (getFlowStatus(flowId) === COMPLETED_FLOW) {\n return null\n }\n\n const steps = getFlowSteps(flowId)\n\n const currentStep = steps[getCurrentStepIndex(flowId)]\n\n return (\n <>\n <RenderInlineStyles appearance={appearance} />\n <EmbeddedTipContainer\n appearance={appearance}\n className={mergeClasses(getClassName('embeddedTipContainer', appearance), className)}\n style={style}\n onClick={onClick}\n >\n {(dismissible === true || currentStep.dismissible) && (\n <DismissButton\n onClick={async () => {\n await markFlowSkipped(flowId)\n if (onDismiss) {\n onDismiss()\n }\n }}\n className={getClassName('embeddedTipDismissButton', appearance)}\n >\n <Close />\n </DismissButton>\n )}\n {(currentStep.imageUri || currentStep.videoUri) && (\n <MediaContainer className={getClassName('embeddedTipMediaContainer', appearance)}>\n <Media appearance={appearance} stepData={currentStep} />\n </MediaContainer>\n )}\n <TextContainer>\n <TitleSubtitle\n size=\"small\"\n appearance={appearance}\n title={currentStep.title}\n subtitle={currentStep.subtitle}\n />\n </TextContainer>\n {(currentStep.primaryButtonTitle || currentStep.secondaryButtonTitle) && (\n <CallToActionContainer\n className={getClassName('embeddedTipCallToActionContainer', appearance)}\n >\n {currentStep.primaryButtonTitle && (\n <Button\n classPrefix=\"embeddedTip\"\n title={currentStep.primaryButtonTitle}\n appearance={appearance}\n withMargin={false}\n size=\"medium\"\n type=\"inline\"\n onClick={async () => {\n currentStep.handlePrimaryButtonClick()\n primaryCTAClickSideEffects(currentStep)\n if (onButtonClick) {\n const result = onButtonClick(\n currentStep,\n getCurrentStepIndex(flowId),\n 'primary'\n )\n if (result === false) {\n return\n }\n }\n await markStepCompleted(flowId, currentStep.id)\n await markFlowCompleted(flowId)\n }}\n />\n )}\n {currentStep.secondaryButtonTitle && (\n <Button\n classPrefix=\"embeddedTip\"\n title={currentStep.secondaryButtonTitle}\n appearance={appearance}\n withMargin={false}\n size=\"medium\"\n type=\"inline\"\n onClick={async () => {\n currentStep.handleSecondaryButtonClick()\n secondaryCTAClickSideEffects(currentStep)\n if (onButtonClick) {\n const result = onButtonClick(\n currentStep,\n getCurrentStepIndex(flowId),\n 'secondary'\n )\n if (result === false) {\n return\n }\n }\n }}\n secondary\n />\n )}\n </CallToActionContainer>\n )}\n </EmbeddedTipContainer>\n </>\n )\n}\n","import styled from 'styled-components'\nimport { getCustomClassOverrides } from '../shared/appearance'\n\nexport const EmbeddedTipContainer = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n display: flex;\n flex-direction: column;\n width: 100%;\n max-width: 400px;\n padding: 28px 18px;\n box-sizing: border-box;\n align-items: unset;\n background-color: ${(props) => props.appearance.theme.colorBackground};\n border-width: 1px;\n border-color: ${(props) => props.appearance.theme.colorBorder};\n border-radius: 12px;\n position: relative;\n }\n`\nexport const TextContainer = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n`\nexport const CallToActionContainer = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n margin-top: 16px;\n gap: 12px;\n`\n\nexport const DismissButton = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n position: absolute;\n top: 16px;\n right: 16px;\n cursor: pointer;\n\n :hover {\n opacity: 0.8;\n }\n }\n`\n","import styled from 'styled-components'\nimport { getCustomClassOverrides } from '../shared/appearance'\n\nexport const AnnouncementContainer = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n display: flex;\n flex-direction: column;\n width: 100%;\n max-width: 500px;\n box-sizing: border-box;\n align-items: unset;\n background-color: ${(props) => props.appearance.theme.colorBackground};\n position: relative;\n }\n`\nexport const TextContainer = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n`\n\nexport const PaginationContainer = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n margin-bottom: 12px;\n margin-top: 4px;\n`\n\nexport const CallToActionContainer = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: stretch;\n gap: 16px;\n margin-top: 8px;\n`\n\nexport const MediaContainer = styled.div`\n margin-top: 16px;\n margin-bottom: 16px;\n`\n\nexport const DismissButton = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n position: absolute;\n top: -16px;\n right: -16px;\n cursor: pointer;\n\n :hover {\n opacity: 0.8;\n }\n }\n`\n\nexport const HeaderTitle = styled.h1`\n ${(props) => getCustomClassOverrides(props)} {\n font-style: normal;\n justify-content: center;\n text-align: center;\n font-size: 18px;\n font-weight: 700;\n line-height: 24px; /* 125% */\n letter-spacing: 0.36px;\n display: flex;\n align-items: center;\n color: ${(props) => props.appearance.theme.colorText};\n margin-bottom: 8px;\n }\n`\n\nexport const HeaderSubtitle = styled.h2`\n ${(props) => getCustomClassOverrides(props)} {\n font-style: normal;\n justify-content: center;\n text-align: center;\n font-weight: 400;\n color: ${(props) => props.appearance.theme.colorTextSecondary};\n font-size: 14px;\n line-height: 22px; /* 150% */\n letter-spacing: 0.28px;\n margin-bottom: 8px;\n }\n`\n","import { Appearance, StepData } from '../../types'\nimport { VideoCard } from '../Video/VideoCard'\nimport React from 'react'\nimport styled from 'styled-components'\nimport { getClassName } from '../../shared/appearance'\n\nexport const Image = styled.img`\n width: 100%;\n height: 100%;\n min-height: 200px;\n border-radius: ${(props) => props.appearance.theme.borderRadius}px;\n`\n\nexport function Media({\n stepData,\n appearance,\n classPrefix = '',\n}: {\n stepData: StepData\n appearance: Appearance\n classPrefix?: string\n}) {\n if (stepData.videoUri) {\n return (\n <VideoCard\n appearance={appearance}\n videoUri={stepData.videoUri}\n autoplay={stepData.props?.autoplayVideo}\n />\n )\n }\n\n if (stepData.imageUri) {\n return (\n <Image\n className={getClassName(`${classPrefix}image`, appearance)}\n appearance={appearance}\n src={stepData.imageUri}\n />\n )\n }\n\n return null\n}\n","import React, { useEffect } from 'react'\n\nimport { useFlows } from '../api/flows'\nimport { DefaultFrigadeFlowProps, StepData } from '../types'\nimport { COMPLETED_FLOW } from '../api/common'\nimport {\n BannerContainer,\n CallToActionContainer,\n DismissButton,\n DismissButtonContainer,\n IconContainer,\n TextContainer,\n} from './styled'\nimport { Info } from '../components/Icons/Info'\nimport { Button } from '../components/Button'\nimport { Close } from '../components/Icons/Close'\nimport { getClassName } from '../shared/appearance'\nimport { RenderInlineStyles } from '../components/RenderInlineStyles'\nimport { useCTAClickSideEffects } from '../hooks/useCTAClickSideEffects'\nimport { TitleSubtitle } from '../components/TitleSubtitle/TitleSubtitle'\nimport { useTheme } from '../hooks/useTheme'\nimport { useFlowImpressions } from '../hooks/useFlowImpressions'\n\nexport type FrigadeBannerType = 'full-width' | 'square'\n\nexport interface FrigadeBannerProps extends DefaultFrigadeFlowProps {\n /**\n * full-width: Full width banner, useful in top of the page.\n *\n * square: Square sized banner, useful in sidebars\n */\n type?: FrigadeBannerType\n title?: string\n subtitle?: string\n onDismiss?: () => void\n /**\n * Icon to use in the banner\n */\n icon?: React.ReactNode\n /**\n * Handler for when the banner container is clicked\n */\n onClick?: () => void\n}\n\nexport const FrigadeBanner: React.FC<FrigadeBannerProps> = ({\n flowId,\n title,\n subtitle,\n onDismiss,\n customVariables,\n onButtonClick,\n appearance,\n type = 'full-width',\n icon,\n onClick,\n}) => {\n const {\n getFlow,\n markFlowCompleted,\n markFlowSkipped,\n isLoading,\n targetingLogicShouldHideFlow,\n updateCustomVariables,\n getFlowMetadata,\n getFlowStatus,\n getFlowSteps,\n getCurrentStepIndex,\n } = useFlows()\n const { primaryCTAClickSideEffects } = useCTAClickSideEffects()\n const { mergeAppearanceWithDefault } = useTheme()\n useFlowImpressions(flowId)\n\n appearance = mergeAppearanceWithDefault(appearance)\n\n useEffect(() => {\n updateCustomVariables(customVariables)\n }, [customVariables, isLoading])\n\n if (isLoading) {\n return null\n }\n\n const flow = getFlow(flowId)\n if (!flow) {\n return null\n }\n\n if (targetingLogicShouldHideFlow(flow)) {\n return null\n }\n\n if (getFlowStatus(flowId) === COMPLETED_FLOW) {\n return null\n }\n\n const steps = getFlowSteps(flowId)\n\n const metaData = (\n steps.length > 0 ? steps[getCurrentStepIndex(flowId)] : getFlowMetadata(flowId)\n ) as StepData\n\n if (metaData?.title) {\n title = metaData.title\n }\n if (metaData?.subtitle) {\n subtitle = metaData.subtitle\n }\n\n return (\n <>\n <RenderInlineStyles appearance={appearance} />\n <BannerContainer\n type={type}\n appearance={appearance}\n className={getClassName('bannerContainer', appearance)}\n onClick={onClick}\n >\n {type != 'square' && (\n <IconContainer className={getClassName('bannerIconContainer', appearance)}>\n {icon ? icon : <Info />}\n </IconContainer>\n )}\n {type === 'square' && metaData.dismissible && (\n <DismissButtonContainer\n type={type}\n className={getClassName('bannerDismissButtonContainer', appearance)}\n >\n <DismissButton\n type={type}\n onClick={async () => {\n await markFlowSkipped(flowId)\n if (onDismiss) {\n onDismiss()\n }\n }}\n className={getClassName('bannerDismissButton', appearance)}\n >\n <Close />\n </DismissButton>\n </DismissButtonContainer>\n )}\n <TextContainer type={type}>\n <TitleSubtitle\n appearance={appearance}\n title={title}\n subtitle={subtitle}\n classPrefix=\"banner\"\n />\n </TextContainer>\n {metaData?.primaryButtonTitle && (\n <CallToActionContainer\n type={type}\n className={getClassName('bannerCallToActionContainer', appearance)}\n >\n <Button\n title={metaData?.primaryButtonTitle}\n appearance={appearance}\n onClick={() => {\n primaryCTAClickSideEffects(metaData)\n if (onButtonClick) {\n onButtonClick(metaData, 0, 'primary')\n }\n }}\n classPrefix=\"banner\"\n />\n </CallToActionContainer>\n )}\n {type !== 'square' && metaData.dismissible && (\n <DismissButtonContainer\n type={type}\n className={getClassName('bannerDismissButtonContainer', appearance)}\n >\n <DismissButton\n type={type}\n onClick={async () => {\n await markFlowSkipped(flowId)\n if (onDismiss) {\n onDismiss()\n }\n }}\n className={getClassName('bannerDismissButton', appearance)}\n >\n <Close />\n </DismissButton>\n </DismissButtonContainer>\n )}\n </BannerContainer>\n </>\n )\n}\n","import styled from 'styled-components'\nimport { getCustomClassOverrides } from '../shared/appearance'\n\nexport const BannerContainer = styled.div`\n // use the :not annotation\n ${(props) => getCustomClassOverrides(props)} {\n display: flex;\n flex-direction: ${(props) => (props.type === 'square' ? 'column' : 'row')};\n width: 100%;\n padding: 16px;\n box-sizing: border-box;\n align-items: ${(props) => (props.type === 'square' ? 'unset' : 'center')};\n background-color: ${(props) => props.appearance.theme.colorBackground};\n border-radius: 12px;\n }\n`\n\nexport const IconContainer = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n display: flex;\n width: 46px;\n height: 46px;\n }\n`\n\nexport const TextContainer = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n margin-left: ${(props) => (props.type === 'square' ? '0px' : '16px')};\n margin-top: ${(props) => (props.type === 'square' ? '12px' : '0')};\n`\nexport const CallToActionContainer = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n margin-left: ${(props) => (props.type === 'square' ? '0px' : '16px')};\n`\n\nexport const DismissButton = styled.div`\n display: flex;\n justify-content: ${(props) => (props.type === 'square' ? 'flex-end' : 'center')};\n align-items: flex-end;\n cursor: pointer;\n :hover {\n opacity: 0.8;\n }\n`\n\nexport const DismissButtonContainer = styled.div`\n display: flex;\n justify-content: ${(props) => (props.type === 'square' ? 'flex-end' : 'center')};\n align-items: flex-end;\n margin-left: ${(props) => (props.type === 'square' ? '0px' : '16px')};\n`\n","import React, { CSSProperties } from 'react'\n\nexport const Info = ({\n style,\n className,\n}: {\n color?: string\n style?: CSSProperties\n className?: string\n}) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"46\"\n height=\"46\"\n fill=\"none\"\n viewBox=\"0 0 46 46\"\n style={style}\n className={className}\n >\n <circle cx=\"23\" cy=\"23\" r=\"23\" fill=\"#E6F1FF\"></circle>\n <path\n stroke=\"#0171F8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.5\"\n d=\"M32 18.5l-2.25-1.313M32 18.5v2.25m0-2.25l-2.25 1.313M14 18.5l2.25-1.313M14 18.5l2.25 1.313M14 18.5v2.25m9 3l2.25-1.313M23 23.75l-2.25-1.313M23 23.75V26m0 6.75l2.25-1.313M23 32.75V30.5m0 2.25l-2.25-1.313m0-16.875L23 13.25l2.25 1.313M32 25.25v2.25l-2.25 1.313m-13.5 0L14 27.5v-2.25\"\n ></path>\n </svg>\n)\n","import { DefaultFrigadeFlowProps } from '../types'\nimport React, { useEffect } from 'react'\nimport { useFlows } from '../api/flows'\nimport { useCTAClickSideEffects } from '../hooks/useCTAClickSideEffects'\nimport { useTheme } from '../hooks/useTheme'\nimport { COMPLETED_FLOW } from '../api/common'\nimport { RenderInlineStyles } from '../components/RenderInlineStyles'\nimport { Portal } from 'react-portal'\nimport {\n DismissButton,\n NPSLabel,\n NPSLabelContainer,\n NPSNumberButton,\n NPSNumberButtonContainer,\n NPSSurveyContainer,\n TextArea,\n TextContainer,\n} from './styled'\nimport { getClassName, mergeClasses } from '../shared/appearance'\nimport { Close } from '../components/Icons/Close'\nimport { TitleSubtitle } from '../components/TitleSubtitle/TitleSubtitle'\nimport { useFlowOpens } from '../api/flow-opens'\nimport { Button } from '../components/Button'\nimport { useFlowImpressions } from '../hooks/useFlowImpressions'\n\nexport interface FrigadeNPSSurveyProps extends DefaultFrigadeFlowProps {\n dismissible?: boolean\n type?: 'inline' | 'modal'\n}\n\nexport const FrigadeNPSSurvey: React.FC<FrigadeNPSSurveyProps> = ({\n flowId,\n onDismiss,\n customVariables,\n onButtonClick,\n appearance,\n className,\n style,\n type = 'modal',\n}) => {\n const {\n getFlow,\n markFlowCompleted,\n markFlowSkipped,\n markStepCompleted,\n getNumberOfStepsCompleted,\n isLoading,\n targetingLogicShouldHideFlow,\n updateCustomVariables,\n getFlowSteps,\n getFlowStatus,\n getFlowMetadata,\n } = useFlows()\n const { primaryCTAClickSideEffects } = useCTAClickSideEffects()\n const { mergeAppearanceWithDefault } = useTheme()\n const [score, setScore] = React.useState<number | null>(null)\n const [feedbackText, setFeedbackText] = React.useState<string>('')\n const metadata = getFlowMetadata(flowId)\n const {\n hasOpenModals,\n setKeepCompletedFlowOpenDuringSession,\n shouldKeepCompletedFlowOpenDuringSession,\n } = useFlowOpens()\n useFlowImpressions(flowId)\n\n appearance = mergeAppearanceWithDefault(appearance)\n\n useEffect(() => {\n updateCustomVariables(customVariables)\n }, [customVariables, isLoading])\n\n if (isLoading) {\n return null\n }\n\n const flow = getFlow(flowId)\n if (!flow) {\n return null\n }\n\n if (targetingLogicShouldHideFlow(flow)) {\n return null\n }\n\n if (getFlowStatus(flowId) === COMPLETED_FLOW) {\n return null\n }\n\n if (\n getNumberOfStepsCompleted(flowId) === 1 &&\n !shouldKeepCompletedFlowOpenDuringSession(flowId)\n ) {\n return null\n }\n\n if (hasOpenModals()) {\n return null\n }\n\n const steps = getFlowSteps(flowId)\n\n const currentStep = steps[getNumberOfStepsCompleted(flowId)]\n\n function getScoreChooser() {\n return (\n <>\n <TextContainer>\n <TitleSubtitle\n size=\"large\"\n appearance={appearance}\n title={currentStep.title}\n subtitle={currentStep.subtitle}\n />\n </TextContainer>\n <NPSNumberButtonContainer\n className={getClassName('npsNumberButtonContainer', appearance)}\n appearance={appearance}\n >\n {Array.from(Array(10).keys()).map((i) => (\n <NPSNumberButton\n className={getClassName('npsNumberButton', appearance)}\n selected={score === i + 1}\n key={i}\n onClick={async () => {\n setKeepCompletedFlowOpenDuringSession(flowId)\n setScore(i + 1)\n await markStepCompleted(flowId, currentStep.id, { score: i + 1 })\n }}\n appearance={appearance}\n >\n {i + 1}\n </NPSNumberButton>\n ))}\n </NPSNumberButtonContainer>\n <NPSLabelContainer appearance={appearance}>\n <NPSLabel appearance={appearance}>\n {metadata?.negativeLabel ?? `Not likely at all`}\n </NPSLabel>\n <NPSLabel appearance={appearance}>\n {metadata?.positiveLabel ?? `Extremely likely`}\n </NPSLabel>\n </NPSLabelContainer>\n </>\n )\n }\n\n function getScoreReason() {\n return (\n <>\n <TextContainer>\n <TitleSubtitle\n appearance={appearance}\n title={currentStep.title ?? `Why did you choose this score?`}\n size=\"large\"\n />\n </TextContainer>\n <TextArea\n appearance={appearance}\n value={feedbackText}\n onChange={(e) => {\n setFeedbackText(e.target.value)\n }}\n placeholder=\"Add your optional feedback here...\"\n ></TextArea>\n <NPSNumberButtonContainer\n appearance={appearance}\n className={getClassName('npsNumberButtonContainer', appearance)}\n >\n <Button\n size={'large'}\n withMargin={false}\n onClick={async () => {\n await markFlowCompleted(flowId)\n if (onButtonClick) {\n onButtonClick(currentStep, 1, 'primary')\n }\n }}\n appearance={appearance}\n title={currentStep.secondaryButtonTitle || 'Skip'}\n secondary\n />\n <Button\n size={'large'}\n withMargin={false}\n onClick={async () => {\n await markStepCompleted(flowId, currentStep.id, { feedbackText })\n await markFlowCompleted(flowId)\n if (onButtonClick) {\n onButtonClick(currentStep, 1, 'primary')\n }\n }}\n appearance={appearance}\n title={currentStep.primaryButtonTitle || 'Submit'}\n />\n </NPSNumberButtonContainer>\n </>\n )\n }\n\n function getContent() {\n if (getNumberOfStepsCompleted(flowId) >= 2) {\n return null\n }\n\n return (\n <>\n <RenderInlineStyles appearance={appearance} />\n <NPSSurveyContainer\n appearance={appearance}\n className={mergeClasses(getClassName('npsSurveyContainer', appearance), className)}\n style={style}\n type={type}\n >\n <DismissButton\n onClick={async () => {\n await markFlowSkipped(flowId)\n if (onDismiss) {\n onDismiss()\n }\n }}\n className={getClassName('npsSurveyDismissButton', appearance)}\n >\n <Close />\n </DismissButton>\n {getNumberOfStepsCompleted(flowId) == 0 && getScoreChooser()}\n {getNumberOfStepsCompleted(flowId) == 1 && getScoreReason()}\n </NPSSurveyContainer>\n </>\n )\n }\n\n if (type === 'inline') {\n return getContent()\n }\n\n return <Portal>{getContent()}</Portal>\n}\n","import styled from 'styled-components'\nimport { getCustomClassOverrides } from '../shared/appearance'\n\nexport const NPSSurveyContainer = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n max-width: 600px;\n padding: 28px 18px;\n box-sizing: border-box;\n align-items: unset;\n background-color: ${(props) => props.appearance.theme.colorBackground};\n position: ${(props) => (props.type == 'modal' ? 'fixed' : 'relative')};\n\n min-width: 550px;\n\n ${(props) =>\n props.type == 'modal'\n ? `\n left: 50%;\n transform: translate(-50%);\n bottom: 24px;\n z-index: 1000;\n box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.1);\n border-width: 1px;\n border-color: ${(props) => props.appearance.theme.colorBorder};\n border-radius: ${(props) => props.appearance.theme.borderRadius}px;`\n : ''}\n`\n\nexport const NPSNumberButton = styled.button`\n border: 1px solid ${(props) => props.appearance.theme.colorBorder};\n border-radius: 8px;\n // If selected make border color primary and text color color priamry\n border-color: ${(props) =>\n props.selected ? props.appearance.theme.colorPrimary : props.appearance.theme.colorBorder};\n color: ${(props) =>\n props.selected ? props.appearance.theme.colorPrimary : props.appearance.theme.colorText};\n :hover {\n border-color: ${(props) => props.appearance.theme.colorPrimary};\n }\n :focus {\n border-color: ${(props) => props.appearance.theme.colorPrimary};\n color: ${(props) => props.appearance.theme.colorPrimary};\n }\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n width: 44px;\n height: 44px;\n display: flex;\n justify-content: center;\n align-items: center;\n`\n\nexport const NPSNumberButtonContainer = styled.div`\n display: flex;\n justify-content: space-between;\n margin-top: 16px;\n gap: 8px;\n`\n\nexport const NPSLabelContainer = styled.div`\n display: flex;\n justify-content: space-between;\n margin-top: 8px;\n`\n\nexport const NPSLabel = styled.div`\n font-size: 12px;\n line-height: 18px;\n color: ${(props) => props.appearance.theme.colorTextDisabled};\n font-style: normal;\n font-weight: 400;\n letter-spacing: 0.24px;\n`\n\nexport const TextContainer = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n`\nexport const CallToActionContainer = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: flex-start;\n margin-top: 16px;\n`\n\nexport const TextArea = styled.textarea`\n ${(props) => getCustomClassOverrides(props)} {\n color: ${(props) => props.appearance.theme.colorText};\n margin-top: 16px;\n border: 1px solid ${(props) => props.appearance.theme.colorBorder};\n border-radius: ${(props) => props.appearance.theme.borderRadius}px;\n padding: 12px 16px;\n font-size: 16px;\n line-height: 24px;\n width: 100%;\n height: 100px;\n resize: none;\n }\n`\n\nexport const DismissButton = styled.div`\n ${(props) => getCustomClassOverrides(props)} {\n position: absolute;\n top: 16px;\n right: 16px;\n cursor: pointer;\n\n :hover {\n opacity: 0.8;\n }\n }\n`\n","import { DefaultFrigadeFlowProps } from '../types'\nimport React, { CSSProperties, useEffect } from 'react'\nimport { useFlows } from '../api/flows'\nimport { useCTAClickSideEffects } from '../hooks/useCTAClickSideEffects'\nimport { useTheme } from '../hooks/useTheme'\nimport { COMPLETED_FLOW } from '../api/common'\nimport { RenderInlineStyles } from '../components/RenderInlineStyles'\nimport {\n AnnouncementContainer,\n CallToActionContainer,\n DismissButton,\n HeaderSubtitle,\n HeaderTitle,\n MediaContainer,\n PaginationContainer,\n TextContainer,\n} from './styled'\nimport { getClassName, mergeClasses } from '../shared/appearance'\nimport { Close } from '../components/Icons/Close'\nimport { Button } from '../components/Button'\nimport { Modal } from '../components/Modal'\nimport { CornerModal } from '../components/CornerModal'\nimport { useFlowOpens } from '../api/flow-opens'\nimport { Media } from '../components/Media'\nimport { sanitize } from '../shared/sanitizer'\nimport { useFlowImpressions } from '../hooks/useFlowImpressions'\nimport { FormPagination } from '../FrigadeForm/FormPagination'\n\nexport interface FrigadeAnnouncementProps extends DefaultFrigadeFlowProps {\n dismissible?: boolean\n /**\n * Indicates the position of the modal if the form type is a modal. Default is center.\n */\n modalPosition?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'center' | 'inline'\n /**\n * Show a pagination indicator at the bottom of the announcement when using more than 1 page. Default is true.\n */\n showPagination?: boolean\n /**\n * Whether to allow the user to navigate back to previous steps. Default is false.\n * The title of the button can be controlled by the `backButtonTitle` prop on the step.\n */\n allowBackNavigation?: boolean\n}\n\nexport const FrigadeAnnouncement: React.FC<FrigadeAnnouncementProps> = ({\n flowId,\n onDismiss,\n customVariables,\n onButtonClick,\n appearance,\n className,\n style,\n dismissible = true,\n modalPosition = 'center',\n showPagination = true,\n allowBackNavigation,\n}) => {\n const {\n getFlow,\n markFlowCompleted,\n markFlowSkipped,\n markStepCompleted,\n markStepStarted,\n isLoading,\n targetingLogicShouldHideFlow,\n updateCustomVariables,\n getFlowSteps,\n getFlowStatus,\n getCurrentStepIndex,\n } = useFlows()\n const { primaryCTAClickSideEffects, secondaryCTAClickSideEffects } = useCTAClickSideEffects()\n const { mergeAppearanceWithDefault } = useTheme()\n const { setOpenFlowState, getOpenFlowState, hasOpenModals } = useFlowOpens()\n useFlowImpressions(flowId)\n\n const [showModal, setShowModal] = [\n getOpenFlowState(flowId, true),\n (value) => setOpenFlowState(flowId, value),\n ]\n\n appearance = mergeAppearanceWithDefault(appearance)\n\n useEffect(() => {\n updateCustomVariables(customVariables)\n }, [customVariables, isLoading])\n\n if (isLoading) {\n return null\n }\n\n const flow = getFlow(flowId)\n if (!flow) {\n return null\n }\n\n if (targetingLogicShouldHideFlow(flow)) {\n return null\n }\n\n if (getFlowStatus(flowId) === COMPLETED_FLOW) {\n return null\n }\n\n if (hasOpenModals()) {\n return null\n }\n\n const steps = getFlowSteps(flowId)\n const currentStepIndex = getCurrentStepIndex(flowId)\n const totalSteps = steps.length\n\n const currentStep = steps[currentStepIndex]\n\n const handleClose = async () => {\n setShowModal(false)\n await markFlowSkipped(flowId)\n if (onDismiss) {\n onDismiss()\n }\n }\n\n function getContent() {\n return (\n <>\n <RenderInlineStyles appearance={appearance} />\n <AnnouncementContainer\n appearance={appearance}\n className={mergeClasses(getClassName('announcementContainer', appearance), className)}\n style={style}\n >\n {(dismissible === true || currentStep.dismissible) && modalPosition == 'inline' && (\n <DismissButton\n onClick={async () => {\n await markFlowSkipped(flowId)\n if (onDismiss) {\n onDismiss()\n }\n }}\n className={getClassName('announcementDismissButton', appearance)}\n >\n <Close />\n </DismissButton>\n )}\n <TextContainer>\n <HeaderTitle\n appearance={appearance}\n className={getClassName('announcementTitle', appearance)}\n dangerouslySetInnerHTML={sanitize(currentStep.title)}\n />\n {currentStep.subtitle && (\n <HeaderSubtitle\n appearance={appearance}\n className={getClassName('announcementSubtitle', appearance)}\n dangerouslySetInnerHTML={sanitize(currentStep.subtitle)}\n />\n )}\n </TextContainer>\n {(currentStep.imageUri || currentStep.videoUri) && (\n <MediaContainer className={getClassName('announcementMediaContainer', appearance)}>\n <Media appearance={appearance} stepData={currentStep} />\n </MediaContainer>\n )}\n\n {showPagination && totalSteps > 1 && (\n <PaginationContainer\n className={getClassName('announcementPaginationContainer', appearance)}\n >\n <FormPagination\n className={getClassName('announcementPagination', appearance)}\n appearance={appearance}\n stepCount={totalSteps}\n currentStep={currentStepIndex}\n />\n </PaginationContainer>\n )}\n {(currentStep.primaryButtonTitle || currentStep.secondaryButtonTitle) && (\n <CallToActionContainer\n allowBackNavigation={allowBackNavigation}\n className={getClassName('announcementCTAContainer', appearance)}\n >\n {allowBackNavigation && currentStepIndex > 0 && (\n <Button\n classPrefix=\"announcementBack\"\n title={currentStep.backButtonTitle ?? 'Back'}\n appearance={appearance}\n withMargin={false}\n size=\"small\"\n type=\"full-width\"\n onClick={async () => {\n if (onButtonClick) {\n onButtonClick(currentStep, getCurrentStepIndex(flowId), 'back')\n }\n await markStepStarted(flowId, steps[currentStepIndex - 1].id)\n }}\n secondary\n />\n )}\n {currentStep.secondaryButtonTitle && (\n <Button\n classPrefix=\"announcement\"\n title={currentStep.secondaryButtonTitle}\n appearance={appearance}\n withMargin={false}\n size=\"small\"\n type=\"full-width\"\n onClick={async () => {\n currentStep.handleSecondaryButtonClick()\n secondaryCTAClickSideEffects(currentStep)\n if (onButtonClick) {\n onButtonClick(currentStep, getCurrentStepIndex(flowId), 'secondary')\n }\n }}\n secondary\n />\n )}\n {currentStep.primaryButtonTitle && (\n <Button\n classPrefix=\"announcement\"\n title={currentStep.primaryButtonTitle}\n appearance={appearance}\n withMargin={false}\n size=\"small\"\n type={'full-width'}\n onClick={async () => {\n primaryCTAClickSideEffects(currentStep)\n if (onButtonClick) {\n const result = onButtonClick(\n currentStep,\n getCurrentStepIndex(flowId),\n 'primary'\n )\n if (result === false) {\n return\n }\n }\n if (getCurrentStepIndex(flowId) === totalSteps - 1) {\n currentStep.handlePrimaryButtonClick()\n await markFlowCompleted(flowId)\n } else {\n currentStep.handlePrimaryButtonClick()\n }\n }}\n />\n )}\n </CallToActionContainer>\n )}\n </AnnouncementContainer>\n </>\n )\n }\n\n const overrideStyle: CSSProperties = {\n padding: '24px',\n maxWidth: '400px',\n }\n\n if (modalPosition === 'inline') {\n return getContent()\n }\n\n if (modalPosition !== 'center') {\n return (\n <CornerModal\n modalPosition={modalPosition}\n onClose={handleClose}\n visible={showModal}\n dismissible={dismissible}\n appearance={appearance}\n >\n {getContent()}\n </CornerModal>\n )\n }\n\n return (\n <Modal\n appearance={appearance}\n onClose={handleClose}\n visible={showModal}\n style={overrideStyle}\n dismissible={dismissible}\n >\n {getContent()}\n </Modal>\n )\n}\n","import * as React from 'react'\nimport { StyledButton } from './Button.styles'\nimport { BoxProps } from '../Box'\nimport { Text } from '../Text'\n\nimport { buttonVariants } from './Button.styles'\n\n// TEMP: Non-standard filename to avoid conflict with existing/deprecated button component\n\nexport interface ButtonProps extends BoxProps {\n title: string\n}\n\nconst BaseButton: React.FC<ButtonProps> = ({\n as = 'button',\n className,\n size = 'md',\n title,\n variant = 'Primary',\n ...rest\n}) => {\n return (\n <StyledButton\n className={`fr-button-${variant.toLowerCase()}${className ? ` ${className}` : ''}`}\n forwardedAs={as}\n variant={variant}\n size={size}\n borderRadius=\"md\"\n {...rest}\n >\n <Text color={buttonVariants[variant]?.color} fontWeight=\"semibold\">\n {title}\n </Text>\n </StyledButton>\n )\n}\n\nconst buttonVariantComponents = Object.fromEntries(\n Object.keys(buttonVariants).map((variant) => {\n const component = (props: ButtonProps) => <BaseButton {...props} variant={variant} />\n\n component.displayName = `Button.${variant}`\n\n return [variant, component]\n })\n)\n\nexport const Button = Object.assign(BaseButton, buttonVariantComponents)\n","import React from 'react'\nimport { FontProps } from 'styled-system'\nimport { BoxProps } from '../Box'\nimport { StyledText, textVariants } from './Text.styles'\n\ntype TextVariant = keyof typeof textVariants\nexport interface BaseTextProps extends BoxProps, Partial<Pick<FontProps, 'fontWeight'>> {\n variant?: TextVariant\n}\n\nconst BaseText: React.FC<BaseTextProps> = ({\n as = 'span',\n children,\n variant = 'Body1',\n ...rest\n}) => {\n return (\n <StyledText\n color=\"neutral.foreground\"\n fontFamily=\"default\"\n forwardedAs={as}\n variant={variant}\n {...rest}\n >\n {children}\n </StyledText>\n )\n}\n\nconst textVariantComponents = Object.fromEntries(\n Object.keys(textVariants).map((variant) => {\n const asProp = ['H1', 'H2', 'H3', 'H4'].includes(variant) ? variant.toLowerCase() : undefined\n const component = (props: BaseTextProps) => (\n <BaseText as={asProp} {...props} variant={variant as TextVariant}>\n {props.children}\n </BaseText>\n )\n\n component.displayName = `Text.${variant}`\n\n return [variant, component]\n })\n)\n\nexport const Text = Object.assign(BaseText, textVariantComponents)\n"],"mappings":";i1BAAA,OAAOA,IAAS,iBAAAC,GAAmB,aAAAC,GAAW,YAAAC,OAAgB,QAC9D,OAAS,iBAAAC,OAAqB,oBCD9B,OAAOC,IAAa,cAAAC,GAAY,aAAAC,GAAW,YAAAC,OAAgB,QCA3D,OAAS,eAAAC,GAAa,cAAAC,GAAY,aAAAC,OAAiB,QCAnD,OAAOC,IAAS,WAAAC,OAAe,QCAxB,IAAMC,GAAiB,UDIvB,IAAMC,GAAmB,mBACnBC,GAAiB,iBACjBC,GAAe,eACfC,GAAe,eACfC,GAAmB,mBACnBC,GAAiB,iBACjBC,GAAe,eAIrB,SAASC,IAAY,CAC1B,GAAM,CAAE,aAAAC,EAAc,OAAAC,EAAQ,OAAAC,CAAO,EAAIC,GAAM,WAAWC,EAAc,EAExE,MAAO,CACL,OAAQC,GACN,KAAO,CACL,QAAS,CACP,cAAe,UAAUL,IACzB,eAAgB,mBAChB,wBAAyBM,GACzB,yBAA0B,OAC5B,CACF,GACA,CAACN,EAAcC,CAAM,CACvB,EACA,OAAQI,GAAQ,IAAM,GAAGH,eAAqB,CAACA,CAAM,CAAC,CACxD,CACF,CAEA,IAAMK,GAAoB,wBACpBC,GAAsB,0BACrB,SAASC,IAAmB,CACjC,GAAM,CAAE,wBAAAC,EAAyB,SAAAC,CAAS,EAAIR,GAAM,WAAWC,EAAc,EAE7E,MAAO,CAAOQ,EAAaC,IAAiBC,EAAA,sBAC1C,GACEH,IACCE,EAAQ,SAAW,QAAUA,EAAQ,SAAW,OAASA,EAAQ,SAAW,UAE7E,OAAOE,GAAiB,EAE1B,GAAIL,EACF,eAAQ,IAAI,YAAYE,gCAAkC,EACnDG,GAAiB,EAE1B,IAAMC,EAAgBT,GAAoBK,EACpCK,EAAkBT,GAAsBI,EAC9C,GACE,OAAO,QAAW,aAClB,OAAO,cACPC,GACAA,EAAQ,MACRA,EAAQ,SAAW,OACnB,CACA,IAAMK,EAAW,OAAO,aAAa,QAAQF,CAAa,EACpDG,EAAe,OAAO,aAAa,QAAQF,CAAe,EAChE,GAAIC,GAAYC,GAAgBA,GAAgBN,EAAQ,KAAM,CAC5D,IAAMO,EAAe,IAAI,KAAKF,CAAQ,EAItC,GAHY,IAAI,KAAK,EACJ,QAAQ,EAAIE,EAAa,QAAQ,EAEvC,IACT,OAAOL,GAAiB,EAGxB,OAAO,QAAW,cACpB,OAAO,aAAa,QAAQC,EAAe,IAAI,KAAK,EAAE,YAAY,CAAC,EACnE,OAAO,aAAa,QAAQC,EAAiBJ,EAAQ,IAAI,GAI7D,IAAIQ,EACJ,GAAI,CACFA,EAAW,MAAM,MAAMT,EAAKC,CAAO,CACrC,OAASS,EAAP,CACA,OAAOP,GAAiBO,CAAK,CAC/B,CAEA,OAAKD,EAIAA,EAAS,GAIPA,EAHEN,GAAiBM,EAAS,UAAU,EAJpCN,GAAiB,CAQ5B,EACF,CAEA,SAASA,GAAiBO,EAAa,CACrC,OAAIA,GACF,QAAQ,IAAI,yBAA0BA,CAAK,EAItC,CACL,KAAM,KAAO,CAAC,EAChB,CACF,CAQO,SAASC,IAA0B,CACxC,GAAM,CAAE,aAAAvB,EAAc,wBAAAU,CAAwB,EAAIP,GAAM,WAAWC,EAAc,EAEjF,SAASoB,GAAqB,CAC5B,OAAId,EACK,GAEJV,EAIE,IAHL,QAAQ,MAAM,mEAAmE,EAC1E,GAGX,CAEA,MAAO,CACL,mBAAAwB,CACF,CACF,CEhIA,OAAS,cAAAC,GAAY,YAAAC,OAAgB,QCQrC,OAAS,cAAAC,GAAY,aAAAC,GAAW,YAAAC,OAAgB,QAEhD,OAAOC,OAAY,MCVnB,OAAS,cAAAC,OAAkB,QAGpB,SAASC,IAAe,CAC7B,GAAM,CACJ,eAAAC,EACA,kBAAAC,EACA,sBAAAC,EACA,yCAAAC,EACA,sCAAAC,CACF,EAAIC,GAAWC,EAAc,EAE7B,SAASC,EAAiBC,EAAgBC,EAAe,GAAO,CAZlE,IAAAC,EAaI,OAAOA,EAAAV,EAAeQ,CAAM,IAArB,KAAAE,EAA0BD,CACnC,CAEA,SAASE,EAAiBH,EAAgBI,EAAiB,CACzDX,EAAmBY,GAAUC,EAAAC,EAAA,GAAKF,GAAL,CAAW,CAACL,CAAM,EAAGI,CAAO,EAAE,CAC7D,CAEA,SAASI,EAAmBR,EAAgB,CAC1CP,EAAmBY,GAAS,CAC1B,IAAiCH,EAAAG,EAAxB,CAtBf,CAsBeL,GAASS,CAtBxB,EAsBuCP,EAATQ,EAAAC,GAAST,EAAT,CAAfU,GAAAZ,KACT,OAAOO,EAAA,GAAKG,EACd,CAAC,CACH,CAEA,SAASG,EAAsCb,EAAgB,CACzDJ,EAAsC,SAASI,CAAM,GAGzDL,EAA0CU,GAAS,CAAC,GAAGA,EAAML,CAAM,CAAC,CACtE,CAEA,SAASc,EAAyCd,EAAyB,CACzE,OAAOJ,EAAsC,SAASI,CAAM,CAC9D,CAEA,SAASe,EAAcC,EAAwB,CAC7C,OACE,OAAO,QAAQxB,CAAc,EAAE,KAC7B,CAAC,CAACQ,EAAQI,CAAM,IAAMA,GAAUJ,GAAUgB,CAC5C,GAAKtB,CAET,CAEA,MAAO,CACL,iBAAAK,EACA,iBAAAI,EACA,mBAAAK,EACA,cAAAO,EACA,sCAAAF,EACA,yCAAAC,CACF,CACF,CDzCA,OAAOG,OAAqB,gBEb5B,OAAOC,OAAqB,uCAE5B,SAASC,GAASC,EAAK,CACrB,OAAO,OAAOA,GAAQ,UAAYA,IAAQ,MAAQ,CAAC,MAAM,QAAQA,CAAG,CACtE,CAEO,SAASC,MAAaC,EAAM,CACjC,IAAMC,EAASD,EAAK,MAAM,EAGpBE,EAASF,EAAK,SAAW,EAAIA,EAAK,CAAC,EAAID,GAAU,GAAGC,CAAI,EAE9D,GAAI,CAACH,GAASI,CAAM,GAAK,CAACJ,GAASK,CAAM,EACvC,MAAM,IAAI,MAAM,kCAAkC,EAGpD,IAAMC,EAASP,GAAgBK,CAAM,EAErC,cAAO,QAAQC,CAAM,EAAE,QAAQ,CAAC,CAACE,EAAKC,CAAK,IAAM,CAE3CR,GAASQ,CAAK,EAEZF,EAAOC,CAAG,IAAM,OAElB,OAAO,OAAOD,EAAQ,CAAE,CAACC,CAAG,EAAGL,GAAUI,EAAOC,CAAG,EAAGR,GAAgBS,CAAK,CAAC,CAAE,CAAC,EAG/E,OAAO,OAAOF,EAAQ,CAAE,CAACC,CAAG,EAAGR,GAAgBS,CAAK,CAAE,CAAC,EAEhD,MAAM,QAAQA,CAAK,EAExBF,EAAOC,CAAG,IAAM,OAGlB,OAAO,OAAOD,EAAQ,CAAE,CAACC,CAAG,EAAG,CAAC,GAAGD,EAAOC,CAAG,EAAG,GAAGR,GAAgBS,CAAK,CAAC,CAAE,CAAC,EAG5E,OAAO,OAAOF,EAAQ,CAAE,CAACC,CAAG,EAAGR,GAAgBS,CAAK,CAAE,CAAC,EAIzD,OAAO,OAAOF,EAAQ,CAAE,CAACC,CAAG,EAAGC,CAAM,CAAC,CAE1C,CAAC,EAEMF,CACT,CCxCO,SAASG,GAAaC,EAA+B,CAC1D,GAAI,CACF,OAAO,KAAK,MAAMA,CAAW,CAC/B,OAASC,EAAP,CACA,eAAQ,MAAM,6CAA8CA,CAAC,EACtD,IACT,CACF,CHcA,IAAMC,GAAkB,UAEjB,SAASC,IAuBd,CACA,GAAM,CAAE,OAAAC,EAAQ,OAAAC,CAAO,EAAIC,GAAU,EAC/B,CAAE,aAAAC,EAAc,OAAAC,EAAQ,eAAAC,EAAgB,MAAAC,EAAO,2BAAAC,EAA4B,SAAAC,CAAS,EACxFC,GAAWC,EAAc,EACrB,CAAE,mBAAAC,CAAmB,EAAIC,GAAa,EACtC,CAACC,EAAwBC,CAAyB,EAAIC,GAAS,EAAK,EACpEC,EAAgB,CACpB,KAAMV,EAAM,IAAKW,IAAU,CACzB,OAAQA,EAAK,GACb,UAAWC,GACX,WAAY,KACZ,OAAAd,EACA,cAAeA,EACf,WAAY,CAAC,EACb,cAAe,EACjB,EAAE,CACJ,EACMe,EAAWC,GACf,MAAMA,EAAKpB,CAAM,EACd,KAAMqB,GAAa,CAClB,GAAIA,EAAS,GACX,OAAOA,EAAS,KAAK,EAEvB,MAAM,IAAI,MAAM,kCAAkC,CACpD,CAAC,EACA,MAAOC,IACN,QAAQ,IAAI,kBAAkBF,MAAQE,6CAAiD,EACvFf,EAA2B,EAAI,EACxBS,EACR,EAECO,EACJpB,GAAgBG,GAASF,EACrB,GAAGH,iCAAsC,mBAAmBG,CAAM,IAChEC,EAAiB,uBAAuB,mBAAmBA,CAAc,IAAM,KAEjF,KAEA,CACJ,KAAAmB,EACA,UAAWC,EACX,OAAQC,EACR,MAAAJ,CACF,EAAId,EACAmB,GAAgBJ,EAAKJ,CAAO,EAC5BS,GAAOL,EAAKJ,EAAS,CACnB,kBAAmB,GACnB,kBAAmB,GACnB,iBAAkB,GAClB,kBAAmB,GACnB,mBAAoB,IACpB,gBAAiB,EACjB,QAAS,IAEAH,EAET,cAAe,IACNA,CAEX,CAAC,EACCa,EAAqBL,GAAA,YAAAA,EAAM,KAEjCM,GAAU,IAAM,CACV,CAACjB,GAA0B,CAACY,GAA8BI,GAC5Df,EAA0B,EAAI,CAElC,EAAG,CAACe,EAAoBhB,EAAwBY,CAA0B,CAAC,EAE3E,SAAeM,EAAgCC,EAAgB,QAAAC,EAAA,sBAC7D,GAAIJ,GAAsB,CAACrB,EAAU,CACnC,IAAM0B,EAAYL,EAAmB,KAAMM,GAAUA,EAAM,SAAWH,CAAM,EACxEE,GAAaA,EAAU,YAAchB,KACvCgB,EAAU,UAAYhB,IAExB,MAAMQ,EAAoB,QAAQ,QAAQU,GAAUZ,EAAM,CAAE,KAAMK,CAAmB,CAAC,CAAC,EAAG,CACxF,eAAgBO,GAAUZ,EAAM,CAAE,KAAMK,CAAmB,CAAC,EAC5D,WAAY,GACZ,gBAAiB,EACnB,CAAC,EAEL,GAEA,SAAeQ,EAA8BL,EAAgB,QAAAC,EAAA,sBAC3D,GAAIJ,GAAsB,CAACrB,EAAU,CACnC,IAAM0B,EAAYL,EAAmB,KAAMM,GAAUA,EAAM,SAAWH,CAAM,EACxEE,GAAaA,EAAU,YAAcI,KACvCJ,EAAU,UAAYI,IAExB,MAAMZ,EAAoB,QAAQ,QAAQU,GAAUZ,EAAM,CAAE,KAAMK,CAAmB,CAAC,CAAC,EAAG,CACxF,eAAgBO,GAAUZ,EAAM,CAAE,KAAMK,CAAmB,CAAC,EAC5D,WAAY,GACZ,gBAAiB,EACnB,CAAC,EAEL,GAEA,SAAeU,EACbP,EACAQ,EACAC,EACA,QAAAR,EAAA,sBAxJJ,IAAAS,EAAAC,EAyJI,GAAId,EAAoB,CACtB,IAAMK,EAAYL,EAAmB,KAClCM,GAAUA,EAAM,SAAWH,CAC9B,EACA,GAAIE,EAAW,CACb,IAAMjB,EAAOX,EAAM,KAAMW,GAASA,EAAK,OAASe,CAAM,EAChDR,EAAOoB,GAAe3B,GAAA,YAAAA,EAAM,IAAI,EAChC4B,GAAQF,GAAAD,EAAAlB,GAAA,YAAAA,EAAM,QAAN,KAAAkB,EAAelB,GAAA,YAAAA,EAAM,OAArB,KAAAmB,EAA6B,CAAC,EACtCG,EAAmBD,EAAM,UAAWE,GAASA,EAAK,KAAOP,CAAM,EAC/DQ,GACJH,GAASA,EAAM,OAASC,EAAmB,EAAID,EAAMC,EAAmB,CAAC,EAAI,KAC3EE,KACFd,EAAU,WAAac,GAAS,IAElCd,EAAU,WAAWM,CAAM,EAAIC,EAC/BP,EAAU,UAAYe,GAEnBzC,IACH,MAAMkB,EAAoB,QAAQ,QAAQU,GAAUZ,EAAM,CAAE,KAAMK,CAAmB,CAAC,CAAC,EAAG,CACxF,eAAgBO,GAAUZ,EAAM,CAAE,KAAMK,CAAmB,CAAC,EAC5D,WAAY,GACZ,gBAAiB,EACnB,CAAC,GAGP,GAEA,SAAeqB,EACblB,EACAQ,EACAC,EACA,QAAAR,EAAA,sBACA,GAAIJ,EAAoB,CACtB,IAAMK,EAAYL,EAAmB,KAClCM,GAAUA,EAAM,SAAWH,CAC9B,EACIE,IACFA,EAAU,WAAaM,EACvBN,EAAU,WAAWM,CAAM,EAAIC,EAC/BP,EAAU,UAAYe,IAEnBzC,IACH,MAAMkB,EAAoBU,GAAUZ,EAAM,CAAE,KAAMK,CAAmB,CAAC,EAAG,CACvE,eAAgBO,GAAUZ,EAAM,CAAE,KAAMK,CAAmB,CAAC,EAC5D,WAAY,GACZ,gBAAiB,EACnB,CAAC,GAGP,GAEA,SAAesB,EAAiCnB,EAAgB,QAAAC,EAAA,sBAC9D,GAAIJ,EAAoB,CACtB,IAAMK,EAAYL,EAAmB,KAAMM,GAAUA,EAAM,SAAWH,CAAM,EACxEE,GAAaA,EAAU,YAAckB,KACvClB,EAAU,UAAYkB,GACtBlB,EAAU,WAAapC,GAEvB,OAAO,KAAKoC,EAAU,UAAU,EAAE,QAASM,GAAW,CACpDN,EAAU,WAAWM,CAAM,EAAE,WAAaa,GAC1CnB,EAAU,WAAWM,CAAM,EAAE,UAAY,IAAI,KAAK,EAAE,YAAY,CAClE,CAAC,EACD,MAAMd,EAAoBU,GAAUZ,EAAM,CAAE,KAAMK,CAAmB,CAAC,EAAG,CACvE,eAAgBO,GAAUZ,EAAM,CAAE,KAAMK,CAAmB,CAAC,EAC5D,WAAY,GACZ,gBAAiB,EACnB,CAAC,EACDlB,EAAmBqB,CAAM,GAG/B,GAEA,SAAesB,EACbtB,EACAQ,EACAC,EACA,QAAAR,EAAA,sBACA,GAAIJ,EAAoB,CACtB,IAAMK,EAAYL,EAAmB,KAClCM,GAAUA,EAAM,SAAWH,CAC9B,EACIE,IACFA,EAAU,WAAWM,CAAM,EAAIC,GAEjC,MAAMf,EAAoB,QAAQ,QAAQU,GAAUZ,EAAM,CAAE,KAAMK,CAAmB,CAAC,CAAC,EAAG,CACxF,eAAgBO,GAAUZ,EAAM,CAAE,KAAMK,CAAmB,CAAC,EAC5D,WAAY,GACZ,gBAAiB,EACnB,CAAC,EAEL,GAEA,MAAO,CACL,mBAAAA,EACA,2BAA4B,CAAChB,EAC7B,oBAAAa,EACA,gCAAAK,EACA,8BAAAM,EACA,iCAAAc,EACA,gCAAAZ,EACA,iCAAAe,EACA,8BAAAJ,EACA,MAAA5B,CACF,CACF,CD9NO,SAASiC,IAAmB,CACjC,GAAM,CAAE,OAAAC,EAAQ,OAAAC,CAAO,EAAIC,GAAU,EAC/B,CAAE,mBAAAC,EAAoB,oBAAAC,CAAoB,EAAIC,GAAkB,EAChE,CAAE,oBAAAC,EAAqB,uBAAAC,EAAwB,cAAAC,EAAe,iBAAAC,CAAiB,EACnFC,GAAWC,EAAc,EACrB,CAACC,EAAgCC,CAAiC,EAAIC,GAC1E,IAAI,GACN,EACM,CAACC,EAAyBC,CAA0B,EAAIF,GAC5D,IAAI,GACN,EAEMG,EAAkBC,GAAiB,EAEzC,SAASC,EAAiBC,EAA4B,CACpD,IAAMC,EAAqB,KAAK,UAAUD,CAAY,EAEtD,GAAIR,EAA+B,IAAIS,CAAkB,EACvD,OAAO,KAGTT,EAA+B,IAAIS,CAAkB,EACrDR,EAAkCD,CAA8B,EAChEG,EAAwB,IAAIK,CAAY,EACxCJ,EAA2BD,CAAuB,EAGlD,IAAMO,EAAuBd,GAAA,YAAAA,EAAe,KACzCe,GACCA,EAAE,WAAaH,EAAa,UAC5BG,EAAE,SAAWH,EAAa,QAC1BG,EAAE,aAAeH,EAAa,YAC9BG,EAAE,YAAcH,EAAa,WAGjC,OAAOH,EAAgB,GAAGhB,iBAAuBuB,EAAAC,EAAA,GAC5CzB,GAD4C,CAE/C,OAAQ,OACR,KAAMqB,CACR,EAAC,EAAE,KAAME,GAAM,CACTA,EAAE,SAAW,KAAOA,EAAE,SAAW,KACnC,QAAQ,IACN,yCACEH,EAAa,OACb,2BACJ,EACAb,EAAuB,CAAC,GAAGD,EAAqBc,CAAY,CAAC,GAExDE,GACHb,EAAkBiB,GAAS,CAAC,GAAIA,GAAA,KAAAA,EAAQ,CAAC,EAAIN,CAAY,CAAC,CAGhE,CAAC,CACH,CAEA,SAAeO,EAAYP,EAA4B,QAAAQ,EAAA,sBAChDR,EAAa,gBAIdA,EAAa,aAAeS,IAAgBT,EAAa,aAAeU,GAC1E,MAAMX,EAAiBC,CAAY,EAC1BA,EAAa,aAAeW,GACrC,MAAMZ,EAAiBC,CAAY,EAC1BA,EAAa,aAAeY,GACrC,MAAMb,EAAiBC,CAAY,EAC1BA,EAAa,aAAea,GACrC,MAAMd,EAAiBC,CAAY,EAC1BA,EAAa,aAAec,GACrC,MAAMf,EAAiBC,CAAY,EAC1BA,EAAa,aAAee,KACrC,MAAMhB,EAAiBC,CAAY,GAEvC,GAEA,SAASgB,GAAmB,CAC1B,IAAMC,EAAmC,CAAC,EAE1C,OAAAlC,GAAA,MAAAA,EAAoB,QAASmC,GAAc,CACzC,GAAIA,GAAaA,EAAU,YAAc,OAAO,KAAKA,EAAU,UAAU,EAAE,SAAW,EAGpF,QAAWC,KAAYD,EAAU,WAAY,CAC3C,IAAME,EAAYF,EAAU,WAAWC,CAAQ,EAE/CF,EAAiB,KAAK,CACpB,cAAeC,EAAU,cACzB,SAAUA,EAAU,OACpB,OAAQE,EAAU,OAClB,WAAYA,EAAU,WACtB,KAAM,CAAC,EACP,UAAW,IAAI,KAAKA,EAAU,SAAS,EACvC,QAASA,EAAU,QACnB,OAAQA,EAAU,MACpB,CAAiB,EAGvB,GAEO,CAAC,GAAGH,EAAkB,GAAG7B,CAAa,CAC/C,CAEA,MAAO,CACL,YAAAmB,EACA,iBAAAlB,EACA,iBAAA2B,CACF,CACF,CH9HA,OAAOK,OAAY,MQhBnB,IAAMC,GAAQ,gDAEDC,GAAoCC,GAA+B,CAC9E,IAAMC,EAAYH,GAAM,KAAKE,CAAkB,EAC/C,GAAIC,IAAc,KAAM,OAAO,KAO/B,IAAIC,EAAO,KACX,OAAAD,EAAU,QAAQ,CAACE,EAAOC,IAAM,CAC9B,IAAIC,EAAUC,GAAWH,EAAO,IAAK,EAAE,EACnCE,EAAQ,WAAW,OAAO,IAC5BH,EAAOG,EAEX,CAAC,EACMH,CACT,EAEaI,GAAa,SAAUC,EAAQC,EAAQC,EAAa,CAC/D,OAAOF,EAAO,QAAQ,IAAI,OAAOC,EAAQ,GAAG,EAAGC,CAAW,CAC5D,ERaO,IAAKC,QACVA,EAAA,UAAY,YACZA,EAAA,KAAO,OACPA,EAAA,KAAO,OACPA,EAAA,QAAU,UACVA,EAAA,OAAS,SACTA,EAAA,OAAS,SACTA,EAAA,aAAe,eACfA,EAAA,WAAa,aACbA,EAAA,aAAe,eATLA,QAAA,IAiBL,SAASC,IAAW,CACzB,GAAM,CAAE,OAAAC,EAAQ,OAAAC,CAAO,EAAIC,GAAU,EAC/B,CACJ,MAAAC,EACA,SAAAC,EACA,OAAAC,EACA,eAAAC,EACA,aAAAC,EACA,gBAAAC,EACA,mBAAAC,EACA,sBAAAC,EACA,yBAAAC,EACA,iBAAAC,EACA,2BAAAC,EACA,wBAAAC,EACA,SAAAC,EACA,kBAAAC,CACF,EAAIC,GAAWC,EAAc,EAEvBC,EAAgB,CACpB,KAAM,CAAC,CACT,EACM,CAAE,mBAAAC,CAAmB,EAAIC,GAAwB,EACjD,CAAE,YAAAC,EAAa,iBAAAC,CAAiB,EAAIC,GAAiB,EACrDC,EAAWC,GACf,MAAMA,EAAK1B,CAAM,EACd,KAAM2B,GACDA,EAAS,GACJA,EAAS,KAAK,GAEvB,QAAQ,IACN,kBAAkBD,MAAQC,EAAS,YAAYA,EAAS,sDAC1D,EACAd,EAA2B,EAAI,EACxBM,EACR,EACA,MAAOS,IACN,QAAQ,IAAI,kBAAkBF,MAAQE,6CAAiD,EACvFf,EAA2B,EAAI,EACxBM,EACR,EACC,CACJ,oBAAAU,EACA,mBAAAC,EACA,2BAAAC,EACA,gCAAAC,EACA,8BAAAC,EACA,iCAAAC,EACA,gCAAAC,EACA,iCAAAC,EACA,8BAAAC,CACF,EAAIC,GAAkB,EAEhB,CACJ,KAAMC,EACN,MAAAX,EACA,UAAWY,CACb,EAAIC,GAAOlC,EAAe,GAAGN,SAAcc,EAAW,iBAAmB,KAAO,KAAMU,EAAS,CAC7F,iBAAkB,EACpB,CAAC,EAEDiB,GAAU,IAAM,CACd,GAAId,EAAO,CACT,QAAQ,MAAMA,CAAK,EACnB,OAEEW,GAAYA,EAAS,MACvBnC,EAASmC,EAAS,IAAI,CAE1B,EAAG,CAACA,EAAUX,CAAK,CAAC,EAEpB,SAASe,EAAQC,EAAsB,CACrC,GAAIJ,EACF,OAAO,KAET,IAAMK,EAAO1C,EAAM,KAAM2C,GAAMA,EAAE,OAASF,CAAM,EAChD,MAAI,CAACC,GAAQ1C,EAAM,OAAS,GAAK,CAAC4B,GAA8B,CAACS,GAC/D,QAAQ,IAAI,gBAAgBI,aAAkB,EACvC,OAELC,GAAQ7B,GAAqBA,EAAkB4B,CAAM,IACvDC,EAAK,KAAO7B,EAAkB4B,CAAM,IAElCC,GAAA,YAAAA,EAAM,UAAW,IAAS,CAAC9B,EACtB,KAEF8B,EACT,CAEA,SAASE,EAAaH,EAA4B,CA9IpD,IAAAI,EAAAC,GAAAC,GAAAC,GAAAC,GA+II,GAAI,CAACT,EAAQC,CAAM,EACjB,MAAO,CAAC,EAEV,IAAIL,GAAWS,EAAAL,EAAQC,CAAM,IAAd,YAAAI,EAAiB,KAChC,OAAKT,GAILA,EAAWc,GAAoBd,CAAQ,IAEzBa,IAAAD,IAAAF,GAAAK,GAAef,CAAQ,IAAvB,YAAAU,GAA0B,OAA1B,KAAAE,IAAkCD,GAAAI,GAAef,CAAQ,IAAvB,YAAAW,GAA0B,QAA5D,KAAAE,GAAqE,CAAC,GAGjF,IAAKG,IAAmB,CACvB,IAAMC,GAAyBC,GAAwBF,EAAI,EAC3D,OAAOG,EAAAC,EAAA,CACL,2BAA4B,IAAM,CAC5BJ,GAAK,YAAc,IACrBK,EAAkBhB,EAAQW,GAAK,GAAI,CAAE,QAAS,EAAK,CAAC,CAExD,GACGA,IANE,CAOL,SACEM,EAAcjB,EAAQW,GAAK,EAAE,IAAMO,IAAkBN,IAA0B,EACjF,QACEK,EAAcjB,EAAQW,GAAK,EAAE,IAAMQ,IACnCF,EAAcjB,EAAQW,GAAK,EAAE,IAAMO,GACrC,gBAAiBhC,GAAA,YAAAA,EAAoB,KAClCkC,IAASA,GAAK,QAAUpB,GAAUoB,GAAK,aAAeT,GAAK,IAE9D,QAASU,EAAcrB,EAAQW,GAAK,EAAE,EACtC,OAAQW,GAAatB,EAAQW,GAAK,EAAE,EACpC,yBAA0B,IAAM,EAE3B,CAACA,GAAK,qBACJA,GAAK,mBAAqBA,GAAK,oBAAsB,SACvDA,GAAK,oBAAsBA,GAAK,oBAAsB,KAEvDK,EAAkBhB,EAAQW,GAAK,EAAE,CAErC,EACA,SAAUC,EACZ,EACF,CAAC,EACA,OAAQD,IAAqBA,GAAK,SAAW,EAAK,GAvC5C,CAAC,CAwCZ,CAEA,SAASF,GAAoBd,EAAkB,CAC7C,OAAOA,EAAS,WAAW,aAAc,CAAC4B,EAAGC,IACvC5D,EAAgB4D,CAAY,IAAM,OAC7B,GAGF,OAAO5D,EAAgB4D,CAAY,CAAC,EACxC,QAAQ,uBAAwB,SAAUC,EAAG,CAC5C,MAAO,KAAOA,EAAE,WAAW,CAAC,EAAI,GAClC,CAAC,EACA,WAAW,QAAS,MAAM,EAC1B,WAAW,QAAS,KAAK,EACzB,WAAW,QAAS,KAAK,EACzB,WAAW,QAAS,KAAK,EACzB,WAAW,QAAS,KAAK,EACzB,WAAW,QAAS,KAAK,EACzB,WAAW,QAAS,KAAK,EACzB,WAAW,QAAS,KAAK,CAC7B,CACH,CAMA,SAASC,EAAgBC,EAAmB,CAvN9C,IAAAvB,EAwNI,GAAI,CAACL,EAAQ4B,CAAI,EACf,MAAO,CAAC,EAEV,IAAIhC,EAAWI,EAAQ4B,CAAI,EAAE,KAC7B,OAAKhC,GAILA,EAAWc,GAAoBd,CAAQ,GAEhCS,EAAA,KAAK,MAAMT,CAAQ,IAAnB,KAAAS,EAAwB,CAAC,GALvB,CAAC,CAMZ,CAEA,SAASwB,GAAkBC,EAAaC,EAAkC,CACxEjE,EAAoBkE,GAAUjB,EAAAC,EAAA,GAAKgB,GAAL,CAAW,CAACF,CAAG,EAAGC,CAAM,EAAE,CAC1D,CAEA,SAASE,GAAsBC,EAE5B,CAEC,CAAC9C,GACD,CAACS,GACDqC,GACA,KAAK,UAAUrE,CAAe,GAC5B,KAAK,UAAUmD,IAAA,GAAKnD,GAAoBqE,EAAoB,GAE9D,OAAO,KAAKA,CAAkB,EAAE,QAASJ,GAAQ,CAC/CD,GAAkBC,EAAKI,EAAmBJ,CAAG,CAAC,CAChD,CAAC,CAEL,CAEA,IAAMK,GAAkBC,GACtB,CAAOnC,EAAgBoC,EAAgBhB,IAAeiB,EAAA,sBACpD,GAAI,CAAC7D,EAAmB,EACtB,OAEF,IAAM8D,EAAe,CACnB,cAAe7E,EACf,mBAAoBC,GAAA,KAAAA,EAAkB,KACtC,SAAUsC,EACV,OAAAoC,EACA,WAAYjB,GACZ,KAAMC,GAAA,KAAAA,EAAQ,CAAC,EACf,UAAW,IAAI,KACf,QAAS,GACT,OAAQ,EACV,EACKmB,GAAyBD,CAAY,IAI1C,MAAM7C,EAA8BO,EAAQoC,EAAQE,CAAY,EAChE5D,EAAY4D,CAAY,EAC1B,GACA,CAAC7E,EAAQC,EAAgBwB,CAAkB,CAC7C,EAEMsD,EAAqBL,GACzB,CAAOnC,EAAgBoC,EAAgBhB,IAAeiB,EAAA,sBACpD,GAAI,CAAC7D,EAAmB,EACtB,OAEF,IAAM8D,EAAe,CACnB,cAAe7E,EACf,mBAAoBC,GAAA,KAAAA,EAAkB,KACtC,SAAUsC,EACV,OAAAoC,EACA,WAAYK,GACZ,KAAMrB,GAAA,KAAAA,EAAQ,CAAC,EACf,UAAW,IAAI,KACf,QAAS,GACT,OAAQ,EACV,EAEKmB,GAAyBD,CAAY,IAG1C,MAAM9C,EAAiCQ,EAAQoC,EAAQE,CAAY,EACnE5D,EAAY4D,CAAY,EAC1B,GACA,CAAC7E,EAAQC,EAAgBwB,CAAkB,CAC7C,EAEM8B,EAAoBmB,GACxB,CAAOnC,EAAgBoC,EAAgBhB,IAAeiB,EAAA,sBACpD,GAAI,CAAC7D,EAAmB,EACtB,OAEF,IAAM8D,EAAe,CACnB,cAAe7E,EACf,mBAAoBC,GAAA,KAAAA,EAAkB,KACtC,SAAUsC,EACV,OAAAoC,EACA,WAAYlB,GACZ,KAAME,GAAA,KAAAA,EAAQ,CAAC,EACf,UAAW,IAAI,KACf,QAAS,GACT,OAAQ,EACV,EACKmB,GAAyBD,CAAY,IAG1C,MAAM/C,EAAgCS,EAAQoC,EAAQE,CAAY,EAClE5D,EAAY4D,CAAY,EAC1B,GACA,CAAC7E,EAAQC,EAAgBwB,CAAkB,CAC7C,EAEMwD,GAAqBP,GACzB,CAAOnC,EAAgBoB,IAAeiB,EAAA,sBAIpC,GAHI,CAAC7D,EAAmB,GAGpBmE,GAAc3C,CAAM,IAAM4C,GAC5B,OAEF,IAAMN,EAAe,CACnB,cAAe7E,EACf,mBAAoBC,GAAA,KAAAA,EAAkB,KACtC,SAAUsC,EACV,OAAQ,UACR,WAAY4C,GACZ,KAAMxB,GAAA,KAAAA,EAAQ,CAAC,EACf,UAAW,IAAI,KACf,QAAS,GACT,OAAQ,EACV,EAEA,MAAM9B,EAAiCU,CAAM,EAExCuC,GAAyBD,CAAY,GAG1C5D,EAAY4D,CAAY,CAC1B,GACA,CAAC7E,EAAQC,EAAgBwB,CAAkB,CAC7C,EAEM2D,GAAkBV,GACtB,CAAOnC,EAAgBoB,IAAeiB,EAAA,sBACpC,GAAI,CAAC7D,EAAmB,EACtB,OAEF,IAAM8D,EAAe,CACnB,cAAe7E,EACf,mBAAoBC,GAAA,KAAAA,EAAkB,KACtC,SAAUsC,EACV,OAAQ,UACR,WAAY8C,GACZ,KAAM1B,GAAA,KAAAA,EAAQ,CAAC,EACf,UAAW,IAAI,KACf,QAAS,GACT,OAAQ,EACV,EACKmB,GAAyBD,CAAY,GAG1C5D,EAAY4D,CAAY,CAC1B,GACA,CAAC7E,EAAQC,EAAgBwB,CAAkB,CAC7C,EAEM6D,GAAoBZ,GACxB,CAAOnC,EAAgBoB,IAAeiB,EAAA,sBACpC,GAAI,CAAC7D,EAAmB,EACtB,OAEF,IAAM8D,EAAe,CACnB,cAAe7E,EACf,mBAAoBC,GAAA,KAAAA,EAAkB,KACtC,SAAUsC,EACV,OAAQ,UACR,WAAYgD,GACZ,KAAM5B,GAAA,KAAAA,EAAQ,CAAC,EACf,UAAW,IAAI,KACf,QAAS,GACT,OAAQ,EACV,EACKmB,GAAyBD,CAAY,IAI1C,MAAMlD,EAAgCY,CAAM,EAC5CtB,EAAY4D,CAAY,EAC1B,GACA,CAAC7E,EAAQC,EAAgBwB,CAAkB,CAC7C,EAEM+D,GAAkBd,GACtB,CAAOnC,EAAgBoB,IAAeiB,EAAA,sBACpC,GAAI,CAAC7D,EAAmB,EACtB,OAEF,IAAM8D,EAAe,CACnB,cAAe7E,EACf,mBAAoBC,GAAA,KAAAA,EAAkB,KACtC,SAAUsC,EACV,OAAQ,UACR,WAAYkD,GACZ,KAAM9B,GAAA,KAAAA,EAAQ,CAAC,EACf,UAAW,IAAI,KACf,QAAS,GACT,OAAQ,EACV,EACKmB,GAAyBD,CAAY,IAG1C,MAAMjD,EAA8BW,CAAM,EAC1CtB,EAAY4D,CAAY,EAC1B,GACA,CAAC7E,EAAQC,EAAgBwB,CAAkB,CAC7C,EAEA,SAASqD,GAAyBD,EAA4B,CA/ahE,IAAAlC,EAgbI,GAAIlB,IAAuB,OACzB,MAAO,GAET,GAAIA,EAAoB,CACtB,IAAMiE,EAAYjE,EAAmB,KAAMkE,GAAUA,EAAM,SAAWd,EAAa,QAAQ,EAE3F,GACEA,EAAa,aAAeG,KAC3B,EAACU,GAAA,MAAAA,EAAW,WAAWb,EAAa,UACnCa,EAAU,WAAWb,EAAa,MAAM,EAAE,aAAeG,IAE3D,MAAO,GAET,GACEU,KACA/C,EAAA+C,EAAU,WAAWb,EAAa,MAAM,IAAxC,YAAAlC,EAA2C,cAAekC,EAAa,WACvE,CACA,GACEA,EAAa,aAAepB,KAC3B,CAACoB,EAAa,MAAQ,KAAK,UAAUA,EAAa,IAAI,IAAM,KAAK,UAAU,CAAC,CAAC,GAE9E,MAAO,GAGT,IAAMe,EAAmB,OAAO,KAAKF,EAAU,UAAU,EAAE,KAAK,CAACG,GAAGC,KAAM,CACxE,IAAMC,GAAQ,IAAI,KAAKL,EAAU,WAAWG,EAAC,EAAE,SAAS,EAClDG,GAAQ,IAAI,KAAKN,EAAU,WAAWI,EAAC,EAAE,SAAS,EACxD,OAAOC,GAAM,QAAQ,EAAIC,GAAM,QAAQ,CACzC,CAAC,EAGD,GACEN,EAAU,WAAWE,EAAiBA,EAAiB,OAAS,CAAC,CAAC,EAAE,aAClEf,EAAa,YACfA,EAAa,SAAWe,EAAiBA,EAAiB,OAAS,CAAC,EAEpE,MAAO,GAGX,GACEF,GACAA,EAAU,YAAcH,IACxBV,EAAa,aAAeU,GAE5B,MAAO,GAIX,MAAO,EACT,CAEA,SAAS/B,EAAcjB,EAAgBoC,EAAuC,CAC5E,IAAMsB,EAAoBC,EAAoB3D,EAAQoC,CAAM,EAE5D,OAAIjD,EACK,KAGDuE,EAAoBA,EAAkB,WAAajB,EAC7D,CAEA,SAASpB,EAAcrB,EAAgBoC,EAAyB,CAC9D,IAAMsB,EAAoBC,EAAoB3D,EAAQoC,CAAM,EAE5D,OAAKsB,EAIEA,EAAkB,QAHhB,EAIX,CAEA,SAASpC,GAAatB,EAAgBoC,EAAyB,CAC7D,IAAMsB,EAAoBC,EAAoB3D,EAAQoC,CAAM,EAE5D,OAAKsB,EAIEA,EAAkB,OAHhB,EAIX,CAEA,SAASC,EAAoB3D,EAAgBoC,EAAqC,CAjgBpF,IAAAhC,EAkgBI,GAAIjB,EACF,OAAO,KAGT,IAAMgE,EAAYjE,GAAA,YAAAA,EAAoB,KAAMkE,IAAUA,GAAM,SAAWpD,GACvE,MAAI,CAACmD,GAAa,CAACA,EAAU,WAAWf,CAAM,EACrC,MAGFhC,EAAA+C,EAAU,WAAWf,CAAM,IAA3B,KAAAhC,EAAgC,IACzC,CAEA,SAASwD,EAAe5D,EAAiC,CA9gB3D,IAAAI,EAAAC,EA+gBI,GAAIlB,GAA8B,CAACD,EACjC,OAAO,KAET,GAAIyD,GAAc3C,CAAM,IAAM4C,GAC5B,OAAOxC,EAAAD,EAAaH,CAAM,EAAE,CAAC,IAAtB,KAAAI,EAA2B,KAGpC,IAAMyD,GAAWxD,EAAAnB,EAAmB,KAAMgB,IAAMA,GAAE,SAAWF,CAAM,IAAlD,YAAAK,EAAqD,WACtE,OAAIwD,EACK1D,EAAaH,CAAM,EAAE,KAAM8D,IAAMA,GAAE,KAAOD,CAAQ,EAEpD,IACT,CAEA,SAASE,GAAoB/D,EAAwB,CA7hBvD,IAAAI,EA8hBI,IAAM4D,EAAcJ,EAAe5D,CAAM,EACzC,GAAI,CAACgE,EACH,MAAO,GAET,IAAMC,GAAQ7D,EAAAD,EAAaH,CAAM,EAAE,UAAW8D,IAAMA,GAAE,KAAOE,EAAY,EAAE,IAA7D,KAAA5D,EAAkE,EAChF,OACEa,EAAcjB,EAAQgE,EAAY,EAAE,IAAM9C,IAC1C+C,EAAQ9D,EAAaH,CAAM,EAAE,OAAS,EAE/BiE,EAAQ,EAEVA,CACT,CAEA,SAASpD,GAAwBF,EAAgB,CAC/C,GAAI,CAACA,EAAK,mBAAoB,OAE9B,IAAMuD,EAAkBC,GAAiCxD,EAAK,kBAAkB,EAChF,GAAIuD,IAAoB,KAAM,OAE9B,IAAME,EAAYC,GAA0BH,CAAe,EACrDI,EAAQC,GAAiBL,CAAe,EAE9C,OAAOI,IAAU,EAAI,OAAYF,EAAYE,CAC/C,CAEA,SAAS3B,GAAc3C,EAAgB,CACrC,IAAMwE,EAAgBtF,GAAA,YAAAA,EAAoB,KAAMgB,GAAMA,EAAE,SAAWF,GACnE,OAAKwE,EAGEA,EAAc,UAFZ,IAGX,CAEA,SAASH,GAA0BrE,EAAwB,CACzD,IAAMyE,EAAQtE,EAAaH,CAAM,EACjC,OAAIyE,EAAM,SAAW,EACZ,EAGcA,EAAM,OAAQX,GAAM7C,EAAcjB,EAAQ8D,EAAE,EAAE,IAAM5C,EAAc,EAEnE,MACxB,CAEA,SAASqD,GAAiBvE,EAAgB,CACxC,OAAOG,EAAaH,CAAM,EAAE,MAC9B,CAOA,SAAS0E,GAAe1E,EAA0B,CAChD,IAAM2E,EAAYpH,EAAM,KAAM2C,GAAMA,EAAE,OAASF,CAAM,EACrD,OAAK2E,GAGDvG,GAAqBA,EAAkB4B,CAAM,IAC/C2E,EAAU,KAAOvG,EAAkB4B,CAAM,GAEpCU,GAAaiE,EAAU,IAAI,GALzB,IAMX,CAEA,SAASC,GAA6B3E,EAAY,CAChD,GAAI9B,EACF,MAAO,GAKT,GAHIgB,GAGAjB,EACF,MAAO,GAET,GAAI+B,GAAA,MAAAA,EAAM,gBAAkBf,EAAoB,CAE9C,IAAM2F,EAAwB3F,EAAmB,KAAM4F,GAAQA,EAAI,SAAW7E,EAAK,IAAI,EACvF,GAAI4E,EACF,OAAOA,EAAsB,gBAAkB,GAGnD,MAAI,GAAA5E,GAAA,MAAAA,EAAM,gBAAkBxC,GAAUA,EAAO,WAAW,QAAQ,EAKlE,CAEA,SAASsH,GAAsB/E,EAAgB,CAC7C,IAAMC,EAAOF,EAAQC,CAAM,EAC3B,OAAIC,GAAA,YAAAA,EAAM,UAAW,GACZ,GAEF,CAAC2E,GAA6B7E,EAAQC,CAAM,CAAC,CACtD,CAEA,SAASgF,IAAU,CACbvH,GACFwB,EAAoB,CAExB,CAEA,SAASgG,IAAc,CACrB,OAAO1H,CACT,CAEA,MAAO,CACL,YAAA0H,GACA,QAAAlF,EACA,YAAA2E,GACA,UAAWvF,GAA8BS,EACzC,cAAAqB,EACA,aAAAd,EACA,oBAAA4D,GACA,gBAAA7B,GACA,kBAAAlB,EACA,mBAAA0B,GACA,gBAAAG,GACA,kBAAAE,GACA,gBAAAE,GACA,mBAAAT,EACA,cAAAG,GACA,0BAAA0B,GACA,iBAAAE,GACA,6BAAAK,GACA,kBAAAhD,GACA,sBAAAI,GACA,gBAAApE,EACA,wBAAAiD,GACA,gBAAAa,EACA,cAAAL,EACA,aAAAC,GACA,sBAAAxD,EACA,yBAAAC,EACA,sBAAAgH,GACA,QAAAC,EACF,CACF,CSxqBA,OAAgB,eAAAE,GAAa,cAAAC,GAAY,aAAAC,OAAiB,QAmBnD,IAAMC,GAAe,SAErB,SAASC,IAOd,CACA,GAAM,CACJ,OAAQC,EACR,eAAAC,EACA,UAAAC,EACA,kBAAAC,EACA,wBAAAC,CACF,EAAIC,GAAWC,EAAc,EACvB,CAAE,OAAAC,EAAQ,OAAAC,CAAO,EAAIC,GAAU,EAC/B,CAAE,oBAAAC,CAAoB,EAAIC,GAAkB,EAC5CC,EAAkBC,GAAiB,EACnC,CAAE,mBAAAC,CAAmB,EAAIC,GAAwB,EAEvD,SAASC,EAAaC,EAAa,CACjC,MAAO,2BAA2BA,GACpC,CAGAC,GAAU,IAAM,CAEd,GAAIlB,GAAkB,CAACC,EAAgB,CAErC,GAAID,EAAe,WAAWF,EAAY,EACxC,OAEF,IAAMqB,EAAoBH,EAAahB,CAAc,EAEhD,aAAa,QAAQmB,CAAiB,IAEzCP,EAAgB,GAAGJ,SAAeY,EAAAC,EAAA,GAC7Bd,GAD6B,CAEhC,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,UAAWP,CAAe,CAAC,CACpD,EAAC,EAED,aAAa,QAAQmB,EAAmB,MAAM,GAGpD,EAAG,CAACnB,EAAgBI,EAAyBH,CAAc,CAAC,EAE5D,IAAMqB,EAAsBC,GACnBC,GAAiCC,EAAA,sBACtC,GAAI,CAACX,EAAmB,EACtB,OAEF,IAAMY,EAA6B,CACjC,UAAW1B,EACX,WAAAwB,CACF,EACA,MAAMZ,EAAgB,GAAGJ,SAAeY,EAAAC,EAAA,GACnCd,GADmC,CAEtC,OAAQ,OACR,KAAM,KAAK,UAAUmB,CAAI,CAC3B,EAAC,EACDvB,EAAmBwB,GAAoBN,IAAA,GAAKM,GAAmBH,EAAa,EAC5Ed,EAAoB,CACtB,GACA,CAACV,EAAgBO,EAAQH,EAAyBM,CAAmB,CACvE,EAEMkB,EAAoBL,GACxB,CAAOM,EAAeL,IAAkCC,EAAA,sBACtD,GAAI,CAACX,EAAmB,EACtB,OAMF,IAAMY,EAA6B,CACjC,UAAW1B,EACX,OAAQ,CANmB,CAC3B,MAAA6B,EACA,WAAAL,CACF,CAGoB,CACpB,EACA,MAAMZ,EAAgB,GAAGJ,SAAeY,EAAAC,EAAA,GACnCd,GADmC,CAEtC,OAAQ,OACR,KAAM,KAAK,UAAUmB,CAAI,CAC3B,EAAC,EACDhB,EAAoB,CACtB,GACA,CAACV,EAAgBO,EAAQG,CAAmB,CAC9C,EAEMoB,EAA0BP,GAC9B,CAAOQ,EAAgBP,IAAkCC,EAAA,sBACvD,GAAKX,EAAmB,EAGxB,GAAIU,GAAc,OAAO,KAAKA,CAAU,EAAE,OAAS,EAAG,CACpD,IAAML,EAAoBH,EAAae,CAAM,EAC7C,aAAa,QAAQZ,EAAmB,MAAM,EAC9CjB,EAAU6B,CAAM,EAChB,IAAML,EAA6B,CACjC,UAAWK,EACX,WAAAP,CACF,EACA,MAAMZ,EAAgB,GAAGJ,SAAeY,EAAAC,EAAA,GACnCd,GADmC,CAEtC,OAAQ,OACR,KAAM,KAAK,UAAUmB,CAAI,CAC3B,EAAC,EACDvB,EAAmBwB,GAAoBN,IAAA,GAAKM,GAAmBH,EAAa,EAC5Ed,EAAoB,OAEpBR,EAAU6B,CAAM,CAEpB,GACA,CAACxB,EAAQH,EAAyBM,CAAmB,CACvD,EAEMsB,EAAiCT,GAC9BQ,GAAmBN,EAAA,sBACxB,GAAI,CAACX,EAAmB,EACtB,OAEF,IAAMmB,EACJ,OAAO,QAAW,YAAc,aAAa,QAAQC,EAAgB,EAAI,KAE3E,GADA,QAAQ,IAAI,KAAM,aAAa,QAAQA,EAAgB,CAAC,EACpD,CAACD,EACH,OAGF,IAAMP,EAA6B,CACjC,UAAWK,EACX,YAAaE,CACf,EACA,MAAMrB,EAAgB,GAAGJ,SAAeY,EAAAC,EAAA,GACnCd,GADmC,CAEtC,OAAQ,OACR,KAAM,KAAK,UAAUmB,CAAI,CAC3B,EAAC,EACDhB,EAAoB,CACtB,GACA,CAACH,EAAQH,EAAyBM,CAAmB,CACvD,EAEA,MAAO,CACL,OAAQV,EACR,UAAAE,EACA,wBAAA4B,EACA,oBAAAR,EACA,kBAAAM,EACA,+BAAAI,CACF,CACF,CVxKA,OAAS,MAAMG,OAAc,OWJ7B,OAAOC,IAA4B,aAAAC,GAAW,YAAAC,OAAgB,QCA9D,OAAOC,IAAa,aAAAC,GAAW,YAAAC,OAAgB,QAC/C,OAAOC,OAAY,oBCDnB,OAAOC,OAAW,QAClB,OAAOC,OAAY,oBCCZ,IAAMC,GAAmB,MACnBC,GAA2B,OAGjC,SAASC,EAAaC,EAAmBC,EAAyB,CACvE,IAAMC,EAAe,GAAGC,KAAmBH,IAC3C,GAAI,CAACC,EACH,OAAOC,EAGT,GAAID,EAAW,gBAAkBA,EAAW,eAAeD,CAAS,EAAG,CACrE,GAAI,OAAOC,EAAW,eAAeD,CAAS,GAAM,SAElD,OAAOE,EAAe,IAAMD,EAAW,eAAeD,CAAS,EAC1D,GAAI,OAAOC,EAAW,eAAeD,CAAS,GAAM,SAEzD,OAAOE,EAAe,IAAME,GAA2BJ,EAI3D,OAAOE,CACT,CAEO,SAASG,EAAwBC,EAAY,CAIlD,GAHI,CAACA,EAAM,WAGPA,EAAM,UAAU,QAAQF,EAAwB,IAAM,GACxD,MAAO,GAKT,IAAMG,EADgBD,EAAM,UAAU,QAAQ,OAAQ,GAAG,EAChB,MAAM,GAAG,EAClD,OAAIC,EAAmB,QAAU,GAAKA,EAAmB,CAAC,EAAE,WAAWJ,EAAgB,EAC9E,GAEF,QAAQI,EACZ,IAAKP,GACG,IAAIA,GACZ,EACA,KAAK,IAAI,IACd,CAEO,SAASQ,GAAWC,EAAa,CACtC,OAAOA,EAAI,QAAQ,+BAAgC,OAAO,EAAE,YAAY,CAC1E,CAEO,SAASC,GAAoBJ,EAAY,CAC9C,OAAOA,GAAA,MAAAA,EAAO,eACV,OAAO,KAAKA,EAAM,cAAc,EAC7B,IAAKG,GAAQ,GAAGD,GAAWC,CAAG,MAAMH,EAAM,eAAeG,CAAG,IAAI,EAChE,KAAK,GAAG,EACX,EACN,CAEO,SAASE,MAAgBC,EAAmB,CACjD,OAAOA,EAAQ,OAAO,OAAO,EAAE,KAAK,GAAG,CACzC,CAEO,SAASC,GAAQC,EAAa,CACnC,OAAOA,EAAI,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAI,MAAM,CAAC,CAClD,CD5DA,IAAMC,GAAaC,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQrBC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkB/BE,GAAkB,CAAC,CAAE,QAAAC,EAAS,WAAAC,CAAW,IAElDC,GAAA,cAACP,GAAA,CACC,UAAWQ,EAAa,kBAAmBF,CAAU,EACrD,QAAS,IAAMD,EAAQ,EACxB,EEnCL,OAAOI,OAAW,QAClB,OAAOC,OAAY,oBAEnB,IAAMC,GAAiBD,GAAO;AAAA;AAAA;AAAA;AAAA,EAMjBE,GAAQ,IACnBH,GAAA,cAACE,GAAA,KACCF,GAAA,cAAC,OAAI,MAAM,6BAA6B,MAAM,KAAK,OAAO,KAAK,KAAK,OAAO,QAAQ,aACjFA,GAAA,cAAC,QACC,OAAO,eACP,cAAc,QACd,eAAe,QACf,YAAY,MACZ,EAAE,uBACH,CACH,CACF,EHbF,OAAS,UAAAI,OAAc,eIPvB,OAAOC,OAAW,QCAlB,OAAOC,OAA8B,QAErC,SAASC,GAAY,CAAE,MAAAC,EAAO,UAAAC,CAAU,EAAkD,CACxF,OACEH,GAAA,cAAC,OACC,MAAM,6BACN,MAAM,KACN,OAAO,KACP,KAAK,OACL,QAAQ,YACR,MAAOE,EACP,UAAWC,GAEXH,GAAA,cAAC,QACC,KAAK,eACL,EAAE,w/DACH,EACDA,GAAA,cAAC,QACC,KAAK,eACL,SAAS,UACT,EAAE,8qBACF,SAAS,UACV,CACH,CAEJ,CAEA,IAAOI,GAAQH,GC3Bf,OAAOI,OAAY,oBCAnB,OAAOC,OAAY,oBAIZ,IAAMC,GAAmBC,GAAO;AAAA,IAClCC,GAAUC,EAAwBD,CAAK;AAAA,kBACzBA,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA,mBAIhCA,GAAUA,EAAM,WAAW,MAAM;AAAA,eACrCA,GAAUA,EAAM;AAAA;AAAA,aAElBA,GAAUA,EAAM;AAAA;AAAA,EAGxBE,GAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAgBxBC,GAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUpBC,GAAuBL,GAAO;AAAA,IACtCC,GAAUC,EAAwBD,CAAK;AAAA,MACrCA,GAAWA,EAAM,SAAWE,GAAwBC;AAAA;AAAA,EAI9CE,GAAwBN,GAAO;AAAA,IACvCC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS/BM,GAAwBP,GAAO;AAAA,IACvCC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA,kBAIzBA,GAAWA,EAAM,YAAc,OAAS;AAAA;AAAA;AAAA,EAK9CO,GAAgBR,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvBS,GAA0BT,GAAO;AAAA;AAAA,EAIjCU,GAA4BV,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOnCW,GAAsBX,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMrCC,GAAUC,EAAwBD,CAAK;AAAA;AAAA,uBAEpBA,GAAWA,EAAM,cAAgB,WAAa;AAAA;AAAA;AAAA;AAAA,EAMzDW,GAAqBZ,GAAO;AAAA,IACpCC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EDlGrC,IAAMY,GAA8BC,GAAO;AAAA,sBAC3BC,GAAO,CAJ9B,IAAAC,EAIiC,OAAAA,EAAAD,EAAM,aAAN,YAAAC,EAAkB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBASrCD,GAAO,CAb3B,IAAAC,EAa8B,OAAAA,EAAAD,EAAM,aAAN,YAAAC,EAAkB,MAAM;AAAA,EAGzCC,GAAgCH,GAAOI,EAAgB;AAAA,sBAC7CH,GAAO,CAjB9B,IAAAC,EAiBiC,OAAAA,EAAAD,EAAM,aAAN,YAAAC,EAAkB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBASrCD,GAAO,CA1B3B,IAAAC,EA0B8B,OAAAA,EAAAD,EAAM,aAAN,YAAAC,EAAkB,MAAM;AAAA;AAAA,aAExCD,GAAUA,EAAM;AAAA,EAGjBI,GAA4BL,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAQpCC,GAAO,CAvCnB,IAAAC,EAAAI,EAuCsB,OAAAA,GAAAJ,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAI,EAAyB;EFjCxC,SAASC,GAAiB,CAAE,WAAAC,CAAW,EAA+B,CAC3E,OACEC,GAAA,cAACC,GAAA,CACC,UAAWC,EAAa,4BAA6BH,CAAU,EAC/D,WAAYA,GACb,kBAECC,GAAA,cAACG,GAAA,IAAY,CACf,CAEJ,CJLA,IAAMC,GAAiBC,GAAO;AAAA,IACzBC,GAAUC,EAAwBD,CAAK;AAAA;AAAA,wBAEnBA,GAAO,CAdhC,IAAAE,EAAAC,EAcmC,OAAAA,GAAAD,EAAAF,EAAM,aAAN,YAAAE,EAAkB,QAAlB,YAAAC,EAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAS9CH,GAAO,CAvBrB,IAAAE,EAuBwB,OAAAA,EAAAF,EAAM,QAAN,KAAAE,EAAe;AAAA;AAAA,qBAEjBF,GAAO,CAzB7B,IAAAE,EAAAC,EAAAC,EAyBgC,OAAAA,GAAAD,GAAAD,EAAAF,EAAM,aAAN,YAAAE,EAAkB,QAAlB,YAAAC,EAAyB,eAAzB,KAAAC,EAAyC;AAAA,MAClEJ,GAAUK,GAAoBL,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BpCM,GAAcP,GAAO;AAAA;AAAA;AAAA,EAKrBQ,GAAaR,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMrBC,GAAUC,EAAwBD,CAAK;AAAA;AAAA,aAE9BA,GAAO,CApErB,IAAAE,EAAAC,EAoEwB,OAAAA,GAAAD,EAAAF,EAAM,aAAN,YAAAE,EAAkB,QAAlB,YAAAC,EAAyB;AAAA;AAAA,EAI3CK,GAAOT,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBPU,GAAwB,CAAC,CACpC,QAAAC,EACA,QAAAC,EACA,cAAAC,EAAgB,KAChB,MAAAC,EAAQ,KACR,SAAAC,EACA,WAAAC,EACA,YAAAC,EAAc,GACd,oBAAAC,EAAsB,EACxB,IAAM,CACJ,GAAM,CAACC,EAAqBC,CAAsB,EAAIC,GAAS,EAAE,EAmCjE,OAjCAC,GAAU,IAAM,CACd,IAAMC,EAAkB,iBAAiB,SAAS,IAAI,EAAE,iBAAiB,UAAU,EACnFH,EAAuBG,CAAe,CACxC,EAAG,CAAC,CAAC,EAGLD,GAAU,IAAM,CACd,IAAME,EAAgBC,GAAqB,CACrCA,EAAE,MAAQ,UACZd,EAAQ,CAEZ,EACA,gBAAS,iBAAiB,UAAWa,CAAY,EAE1C,IAAM,CACX,SAAS,oBAAoB,UAAWA,CAAY,CACtD,CACF,EAAG,CAACb,CAAO,CAAC,EAEZW,GAAU,IAAM,CACd,IAAMI,EAAY,SAAS,KAAK,MAEhC,OAAId,EACFc,EAAU,YAAY,WAAY,QAAQ,EAE1CA,EAAU,YAAY,WAAYP,CAAmB,EAGhD,IAAM,CACXO,EAAU,YAAY,WAAYP,CAAmB,CACvD,CACF,EAAG,CAACP,CAAO,CAAC,EAEPA,EAGHe,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CACC,WAAYb,EACZ,QAAS,IAAM,CACTC,GACFN,EAAQ,CAEZ,EACF,EACAgB,GAAA,cAAC5B,GAAA,CACC,WAAYiB,EACZ,UAAWc,EAAa,iBAAkBd,CAAU,EACpD,eAAgBF,GAEfG,GACCU,GAAA,cAACnB,GAAA,CACC,UAAWsB,EAAa,aAAcd,CAAU,EAChD,QAAS,IAAML,EAAQ,EACvB,WAAYK,GAEZW,GAAA,cAACI,GAAA,IAAM,CACT,EAEDlB,GAAiBc,GAAA,cAACpB,GAAA,KAAaM,CAAc,EAC9Cc,GAAA,cAAClB,GAAA,KAAMM,CAAS,EAEfG,GACCS,GAAA,cAACK,GAAA,CACC,WAAYhB,EACZ,UAAWc,EAAa,yBAA0Bd,CAAU,GAE5DW,GAAA,cAACM,GAAA,CAAiB,WAAYjB,EAAY,CAC5C,CAEJ,CACF,EAtCmBW,GAAA,cAAAA,GAAA,aAAE,CAwCzB,EQjLA,OAAOO,IAAa,aAAAC,GAAW,YAAAC,OAAgB,QAC/C,OAAOC,OAAY,oBACnB,OAAS,UAAAC,OAAc,eAKvB,SAASC,GACPC,EACA,CACA,OAAQA,EAAe,CACrB,IAAK,WACH,MAAO;AAAA;AAAA;AAAA,QAIT,IAAK,YACH,MAAO;AAAA;AAAA;AAAA,QAIT,IAAK,cACH,MAAO;AAAA;AAAA;AAAA,OAIX,CAEA,MAAO,sBACT,CAEA,IAAMC,GAAuBC,GAAO;AAAA,IAC/BC,GAAUC,EAAwBD,CAAK;AAAA;AAAA,kBAEzBA,GAAO,CAlC1B,IAAAE,EAAAC,EAkC6B,OAAAA,GAAAD,EAAAF,EAAM,aAAN,YAAAE,EAAkB,QAAlB,YAAAC,EAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWjDH,GAAUJ,GAAiBI,EAAM,aAAa;AAAA;AAAA,EAI7CI,GAAoBL,GAAO;AAAA;AAAA;AAAA,EAK3BM,GAAmBN,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAM3BC,GAAUC,EAAwBD,CAAK;AAAA;AAAA,aAE9BA,GAAO,CA9DrB,IAAAE,EAAAC,EA8DwB,OAAAA,GAAAD,EAAAF,EAAM,aAAN,YAAAE,EAAkB,QAAlB,YAAAC,EAAyB;AAAA;AAAA,EAI3CG,GAAOP,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBPQ,GAAoC,CAAC,CAChD,QAAAC,EACA,QAAAC,EACA,cAAAC,EAAgB,KAChB,SAAAC,EACA,WAAAC,EACA,cAAAf,EAAgB,eAChB,YAAAgB,EAAc,EAChB,IAAM,CACJ,GAAM,CAACC,EAAqBC,CAAsB,EAAIC,GAAS,EAAE,EAmCjE,OAjCAC,GAAU,IAAM,CACd,IAAMC,EAAkB,iBAAiB,SAAS,IAAI,EAAE,iBAAiB,UAAU,EACnFH,EAAuBG,CAAe,CACxC,EAAG,CAAC,CAAC,EAGLD,GAAU,IAAM,CACd,IAAME,EAAgBC,GAAqB,CACrCA,EAAE,MAAQ,UACZZ,EAAQ,CAEZ,EACA,gBAAS,iBAAiB,UAAWW,CAAY,EAE1C,IAAM,CACX,SAAS,oBAAoB,UAAWA,CAAY,CACtD,CACF,EAAG,CAACX,CAAO,CAAC,EAEZS,GAAU,IAAM,CACd,IAAMI,EAAY,SAAS,KAAK,MAEhC,OAAIZ,EACFY,EAAU,YAAY,WAAY,QAAQ,EAE1CA,EAAU,YAAY,WAAYP,CAAmB,EAGhD,IAAM,CACXO,EAAU,YAAY,WAAYP,CAAmB,CACvD,CACF,EAAG,CAACL,CAAO,CAAC,EAEPA,EAGHa,GAAA,cAACC,GAAA,KACCD,GAAA,cAACxB,GAAA,CACC,WAAYc,EACZ,UAAWY,EAAa,uBAAwBZ,CAAU,EAC1D,cAAef,GAEdgB,GACCS,GAAA,cAACjB,GAAA,CACC,UAAWmB,EAAa,mBAAoBZ,CAAU,EACtD,QAAS,IAAMJ,EAAQ,GAEvBc,GAAA,cAACG,GAAA,IAAM,CACT,EAEDf,GAAiBY,GAAA,cAAClB,GAAA,KAAmBM,CAAc,EACpDY,GAAA,cAAChB,GAAA,KAAMK,CAAS,CAClB,CACF,EApBmBW,GAAA,cAAAA,GAAA,aAAE,CAsBzB,ECvJA,OAAS,cAAAI,OAAkB,QAIpB,SAASC,IAAW,CACzB,GAAM,CAAE,kBAAAC,CAAkB,EAAIC,GAAWC,EAAc,EAEvD,SAASC,EAA2BC,EAAqC,CAP3E,IAAAC,EAAAC,EAAAC,EAQI,IAAMC,EAAc,KAAK,MAAM,KAAK,UAAUR,CAAiB,CAAC,EAEhE,OAAKI,EAIE,CACL,eAAgB,OAAO,QACrBC,EAAAG,EAAY,iBAAZ,KAAAH,EAA8B,CAAC,GAC/BC,EAAAF,EAAW,iBAAX,KAAAE,EAA6B,CAAC,CAChC,EACA,MAAO,OAAO,OAAOE,EAAY,OAAOD,EAAAH,EAAW,QAAX,KAAAG,EAAoB,CAAC,CAAC,CAChE,EATSC,CAUX,CAEA,MAAO,CAAE,2BAAAL,CAA2B,CACtC,CCxBA,OAAOM,IAAS,cAAAC,GAAY,aAAAC,GAAW,YAAAC,OAAgB,QACvD,OAAOC,OAAY,oBCDnB,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QAE3C,OAAOC,OAAY,oBCFnB,OAAOC,OAAY,oBAGZ,IAAMC,GAAYC,GAAO;AAAA,IAC3BC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAY/BE,GAAeH,GAAO;AAAA,IAC9BC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ/BG,GAAiBJ,GAAO;AAAA;AAAA;AAAA;AAAA,WAIzBC,GAAO,CA7BnB,IAAAI,EAAAC,EA6BsB,OAAAA,GAAAD,EAAAJ,EAAM,aAAN,YAAAI,EAAkB,QAAlB,YAAAC,EAAyB;AAAA;AAAA;AAAA;AAAA,EAMlCC,GAAeP,GAAO;AAAA;AAAA;AAAA;AAAA;ECjCnC,OAAOQ,OAAW,QCkNX,IAAMC,GAAgC,CAC3C,MAAO,CACL,aAAc,UACd,eAAgB,UAChB,UAAW,UACX,gBAAiB,UACjB,yBAA0B,UAC1B,6BAA8B,UAC9B,mBAAoB,UACpB,kBAAmB,UACnB,YAAa,UACb,eAAgB,UAChB,iBAAkB,UAClB,aAAc,EAChB,CACF,ED9NO,SAASC,GAAM,CACpB,MAAAC,EACA,SAAAC,EACA,WAAAC,EAAaC,EACf,EAIG,CACD,OAAKH,EAKHI,GAAA,cAACC,GAAA,CAAa,UAAWC,EAAa,mBAAoBJ,CAAU,GACjED,EACCG,GAAA,cAACG,GAAA,CACC,UAAWD,EAAa,oBAAqBJ,CAAU,EACvD,WAAYA,GACb,GAED,EACE,KACJE,GAAA,cAACI,GAAA,CAAU,UAAWF,EAAa,YAAaJ,CAAU,GAAIF,CAAM,CACtE,EAdO,IAgBX,CE7BA,OAAOS,OAAW,QAGX,SAASC,GAAS,CAAE,MAAAC,EAAO,WAAAC,CAAW,EAA+C,CAC1F,OAAKD,EAKHF,GAAA,cAACI,GAAA,KACCJ,GAAA,cAACK,GAAA,CAAa,UAAWC,EAAa,eAAgBH,CAAU,GAAID,CAAM,CAC5E,EANO,IAQX,CCdA,OAAS,KAAAK,OAAS,MAEX,SAASC,GACdC,EACAC,EACe,CANjB,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAOE,GAAI,CACF,GAAIP,EAAY,CACd,GAAIA,EAAW,MAAQ,SAAU,CAC/B,IAAIQ,EAAYX,GAAE,OAAO,EACzB,GAAIG,EAAW,MACb,QAAWS,KAAkBT,EAAW,MAClCS,EAAe,aAAe,MAChCD,EAAYA,EAAU,IACpB,OAAOC,EAAe,KAAK,GAC3BR,EAAAQ,EAAe,UAAf,KAAAR,EAA0B,oBAC5B,EACSQ,EAAe,aAAe,MACvCD,EAAYA,EAAU,IACpB,OAAOC,EAAe,KAAK,GAC3BP,EAAAO,EAAe,UAAf,KAAAP,EAA0B,oBAC5B,EACSO,EAAe,aAAe,WACvCD,EAAYA,EAAU,UAASL,EAAAM,EAAe,UAAf,KAAAN,EAA0B,wBAAwB,EACxEM,EAAe,aAAe,aACvCD,EAAYA,EAAU,aAAYJ,EAAAK,EAAe,UAAf,KAAAL,EAA0B,wBAAwB,GAI1FI,EAAU,MAAM,OAAOT,CAAK,CAAC,EAE/B,GAAIC,EAAW,MAAQ,SAAU,CAC/B,IAAIQ,EAAYX,GAAE,OAAO,EACzB,GAAIG,EAAW,MACb,QAAWS,KAAkBT,EAAW,MAClCS,EAAe,aAAe,MAChCD,EAAYA,EAAU,IACpB,OAAOC,EAAe,KAAK,GAC3BJ,EAAAI,EAAe,UAAf,KAAAJ,EAA0B,oBAC5B,EACSI,EAAe,aAAe,MACvCD,EAAYA,EAAU,IACpB,OAAOC,EAAe,KAAK,GAC3BH,EAAAG,EAAe,UAAf,KAAAH,EAA0B,mBAC5B,EACSG,EAAe,aAAe,UACvCD,EAAYA,EAAU,MACpB,IAAI,OAAO,OAAOC,EAAe,KAAK,CAAC,GACvCF,EAAAE,EAAe,UAAf,KAAAF,EAA0B,mCAC5B,GAINC,EAAU,MAAMT,CAAK,EAGvB,OAEJ,OAASW,EAAP,CACA,GAAIA,aAAab,GAAE,SACjB,OAAIa,EAAE,QAAUA,EAAE,OAAO,OAAS,EACzBA,EAAE,OAAO,CAAC,EAAE,QAEd,KAET,QAAQ,MAAM,2CAA4CV,EAAYU,CAAC,CACzE,CAEA,OAAO,IACT,CLtDA,IAAMC,GAAmBC,GAAO;AAAA;AAAA;AAAA;AAAA,EAMnBC,GAAYD,GAAO;AAAA,IAC3BE,GAAUC,EAAwBD,CAAK;AAAA;AAAA,wBAEnBA,GAAO,CAzBhC,IAAAE,EAAAC,EAyBmC,OAAAA,GAAAD,EAAAF,EAAM,aAAN,YAAAE,EAAkB,QAAlB,YAAAC,EAAyB;AAAA;AAAA;AAAA,eAG5CH,GAAO,CA5BvB,IAAAE,EAAAC,EA4B0B,OAAAA,GAAAD,EAAAF,EAAM,aAAN,YAAAE,EAAkB,QAAlB,YAAAC,EAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAW7CC,GAAWN,GAAO;AAAA,IACnBE,GAAUC,EAAwBD,CAAK;AAAA;AAAA,wBAEnBA,GAAO,CA1ChC,IAAAE,EAAAC,EA0CmC,OAAAA,GAAAD,EAAAF,EAAM,aAAN,YAAAE,EAAkB,QAAlB,YAAAC,EAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBrD,SAASE,GAAU,CACxB,UAAAC,EACA,oBAAAC,EACA,gBAAAC,EACA,wBAAAC,EACA,UAAAC,CACF,EAAmB,CACjB,IAAMC,EAAQL,EACR,CAACM,EAAMC,CAAO,EAAIC,IAASJ,GAAA,YAAAA,EAAW,OAAQ,EAAE,EAChD,CAACK,EAAWC,CAAY,EAAIF,GAAS,EAAK,EAC1C,CAACG,EAAeC,CAAgB,EAAIJ,GAAS,EAAK,EACpDK,EAAiBpB,GACrBqB,GAAU,IAAM,CACVR,IAAS,IAAM,CAACG,IAClBC,EAAa,EAAI,EACjBK,EAAiB,EAAE,EAEvB,EAAG,CAAC,CAAC,EAELD,GAAU,IAAM,CACd,GAAIH,EAAe,CACjBI,EAAiBT,CAAI,EACrB,OAEJ,EAAG,CAACK,CAAa,CAAC,EAElB,SAASI,EAAiBC,EAAe,CApF3C,IAAApB,EAuFI,GAFAW,EAAQS,CAAK,EACbd,EAAgB,CAAE,KAAMc,CAAM,CAAC,EAC3BX,EAAM,WAAa,IAAQW,EAAM,KAAK,IAAM,GAAI,CAClDb,EAAwB,CACtB,CACE,GAAIE,EAAM,GACV,QAAS,IAAGT,EAAAS,EAAM,QAAN,KAAAT,EAAe,sBAC3B,OAAQ,CAACe,CACX,CACF,CAAC,EACD,OAEF,IAAMM,EAAkBC,GAA8BF,EAAOX,EAAM,UAAU,EAC7E,GAAIY,IAAoBD,EAAM,KAAK,IAAM,IAAMX,EAAM,WAAa,IAAO,CACvEF,EAAwB,CACtB,CACE,GAAIE,EAAM,GACV,QAASY,EACT,OAAQ,CAACN,CACX,CACF,CAAC,EACD,OAEFR,EAAwB,CAAC,CAAC,CAC5B,CAEIE,EAAM,YACRQ,EAAiBf,IAGnB,SAASqB,GAAU,CAnHrB,IAAAvB,EAoHI,QAAQA,EAAAS,GAAA,YAAAA,EAAO,aAAP,YAAAT,EAAmB,KAAM,CAC/B,IAAK,QACH,MAAO,QACT,IAAK,SACH,MAAO,SACT,IAAK,WACH,MAAO,UACX,CAEA,OAAO,IACT,CAEA,OACEwB,GAAA,cAAC7B,GAAA,KACC6B,GAAA,cAACC,GAAA,CACC,MAAOhB,EAAM,MACb,SAAUA,EAAM,SAChB,WAAYJ,EAAoB,WAClC,EACAmB,GAAA,cAACP,EAAA,CACC,UAAWS,EAAa,iBAAkBrB,EAAoB,UAAU,EACxE,MAAOK,EACP,SAAWiB,GAAM,CACfR,EAAiBQ,EAAE,OAAO,KAAK,CACjC,EACA,WAAYtB,EAAoB,WAChC,YAAaI,EAAM,YACnB,KAAMc,EAAQ,EACd,OAAQ,IAAM,CACZP,EAAiB,EAAI,CACvB,EACD,EACDQ,GAAA,cAACI,GAAA,CAAS,MAAOnB,EAAM,SAAU,WAAYJ,EAAoB,WAAY,CAC/E,CAEJ,CMvJA,OAAOwB,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QAE3C,OAAOC,OAAY,oBAOnB,IAAMC,GAAa,GAoBbC,GAAwBC,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ/BC,GAAuBD,GAAO;AAAA,IAC/BE,GAAUC,EAAwBD,CAAK;AAAA;AAAA,wBAEnBA,GAAO,CAxChC,IAAAE,EAAAC,EAwCmC,OAAAA,GAAAD,EAAAF,EAAM,aAAN,YAAAE,EAAkB,QAAlB,YAAAC,EAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAUhDH,GAAO,CAlDnB,IAAAE,EAAAC,EAAAC,EAAAC,EAmDI,OAAAL,EAAM,OAAS,IACXG,GAAAD,EAAAF,EAAM,aAAN,YAAAE,EAAkB,QAAlB,YAAAC,EAAyB,mBACzBE,GAAAD,EAAAJ,EAAM,aAAN,YAAAI,EAAkB,QAAlB,YAAAC,EAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU1B,SAASC,GAAe,CAC7B,UAAAC,EACA,oBAAAC,EACA,gBAAAC,EACA,UAAAC,EACA,wBAAAC,CACF,EAAmB,CArEnB,IAAAT,EAAAC,EAAAC,EAAAC,EAAAO,EAAAC,EAAAC,EAAAC,EAAAC,EAsEE,IAAMC,EAAQV,EACR,CAACW,EAAWC,CAAY,EAAIC,GAAS,EAAK,EAC1C,CAACC,EAAaC,CAAc,EAAIF,GAAS,EAAK,EAEpD,OAAAG,GAAU,IAAM,CA1ElB,IAAArB,EAAAC,EAAAC,EAAAC,EA2EI,GAAI,GAACH,EAAAQ,GAAA,YAAAA,EAAW,SAAX,MAAAR,EAAoB,KAAM,CAACgB,EAAW,CAEzC,GADAC,EAAa,EAAI,EACbF,EAAM,iBAAkB,CAC1BR,EAAgB,CAAE,OAAQ,CAACb,EAAU,CAAE,CAAC,EACxC,OAEF,GACEqB,EAAM,gBACNd,EAAAc,EAAM,MAAM,UAAZ,MAAAd,EAAqB,KAAMqB,GAAWA,EAAO,KAAOP,EAAM,eAC1D,CAEA,IAAMQ,GAAerB,EAAAa,EAAM,MAAM,UAAZ,YAAAb,EAAqB,KAAMoB,GAAWA,EAAO,KAAOP,EAAM,cAC/ER,EAAgB,CAAE,OAAQ,CAACgB,EAAa,EAAE,CAAE,CAAC,OAE7ChB,EAAgB,CAAE,OAAQ,GAACJ,EAAAY,EAAM,MAAM,UAAZ,YAAAZ,EAAsB,GAAG,KAAM,EAAE,CAAE,CAAC,EAGrE,EAAG,CAAC,CAAC,EAELkB,GAAU,IAAM,CA9FlB,IAAArB,EA+FSmB,IAGDJ,EAAM,oBAAoBf,EAAAQ,GAAA,YAAAA,EAAW,SAAX,YAAAR,EAAoB,MAAON,GACvDe,EAAwB,CACtB,CACE,QAAS,0BACT,GAAIM,EAAM,EACZ,CACF,CAAC,EAEDN,EAAwB,CAAC,CAAC,EAE9B,EAAG,EAACT,EAAAQ,GAAA,YAAAA,EAAW,SAAX,YAAAR,EAAoB,GAAImB,CAAW,CAAC,EAGtCK,GAAA,cAAC7B,GAAA,KACC6B,GAAA,cAACC,GAAA,CACC,MAAOV,EAAM,MACb,SAAU,GACV,WAAYT,EAAoB,WAClC,EACAkB,GAAA,cAAC3B,GAAA,CACC,OAAOI,EAAAO,GAAA,YAAAA,EAAW,SAAX,YAAAP,EAAoB,GAC3B,SAAWyB,GAAM,CACfN,EAAe,EAAI,EACnBb,EAAgB,CAAE,OAAQ,CAACmB,EAAE,OAAO,KAAK,CAAE,CAAC,CAC9C,EACA,YAAaX,EAAM,YACnB,WAAYT,EAAoB,WAChC,UAAWqB,EAAa,uBAAwBrB,EAAoB,UAAU,GAE7ES,EAAM,kBACLS,GAAA,cAAC,UAAO,IAAI,aAAa,MAAO9B,GAAY,SAAQ,KACjDQ,EAAAa,EAAM,cAAN,KAAAb,EAAqB,kBACxB,GAEDC,EAAAY,EAAM,MAAM,UAAZ,YAAAZ,EAAqB,IAAKmB,GAEvBE,GAAA,cAAC,UAAO,IAAKF,EAAO,GAAI,MAAOA,EAAO,IACnCA,EAAO,KACV,EAGN,IAECX,GAAAD,EAAAK,EAAM,MAAM,UAAZ,YAAAL,EAAqB,KAAMY,GAAQ,CA7I1C,IAAAtB,EA6I6C,OAAAsB,EAAO,OAAOtB,EAAAQ,GAAA,YAAAA,EAAW,SAAX,YAAAR,EAAoB,QAAxE,YAAAW,EAA6E,cAC5Ea,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CACC,OACEX,GAAAD,GAAAD,EAAAG,EAAM,MAAM,UAAZ,YAAAH,EAAqB,KAAMU,GAAQ,CAjJjD,IAAAtB,EAiJoD,OAAAsB,EAAO,OAAOtB,EAAAQ,GAAA,YAAAA,EAAW,SAAX,YAAAR,EAAoB,QAAxE,YAAAa,EACI,iBADJ,KAAAC,EACsB,iBAExB,SAAU,GACV,WAAYR,EAAoB,WAClC,EACAkB,GAAA,cAACI,GAAA,CACC,KAAK,OACL,YAAY,yBACZ,SAAWF,GAAM,CACfnB,EAAgB,CAAE,OAAQ,CAACmB,EAAE,OAAO,KAAK,CAAE,CAAC,CAC9C,EACA,WAAYpB,EAAoB,WAClC,CACF,EAEFkB,GAAA,cAACK,GAAA,CAAS,MAAOd,EAAM,SAAU,WAAYT,EAAoB,WAAY,CAC/E,CAEJ,CCpKA,OAAOwB,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QAE3C,OAAOC,OAAY,oBCFnB,OAAOC,OAAkC,QCAzC,OAAOC,OAAmB,QAE1B,IAAMC,GAAmE,CAAC,CACxE,MAAAC,EACA,WAAAC,EACA,KAAAC,CACF,IAAM,CACJ,IAAMC,EAAID,EAAO,GAAM,EACjBE,EAAS,EAAI,KAAK,GAAKD,EACvBE,GAAa,EAAIJ,GAAcG,EAErC,OACEN,GAAA,cAAC,UACC,EAAGK,EACH,GAAID,EAAO,GACX,GAAIA,EAAO,GACX,KAAK,cACL,OAAQG,IAAcD,EAASJ,EAAQ,GACvC,YAAa,MACb,gBAAiBI,EACjB,iBAAkBH,EAAaI,EAAY,EAC5C,CAEL,EAYMC,GAAsC,CAAC,CAC3C,UAAAC,EACA,KAAAL,EACA,WAAAD,EACA,SAAAO,EACA,QAAAC,EAAU,UACV,UAAAC,EACA,MAAAC,CACF,IAEIb,GAAA,cAAC,OAAI,MAAOa,EAAO,UAAWD,EAAW,MAAOR,EAAM,OAAQA,EAAM,SAAS,WAC3EJ,GAAA,cAAC,KAAE,UAAW,cAAc,GAAGI,EAAO,MAAOA,EAAO,SAClDJ,GAAA,cAACC,GAAA,CAAO,MAAOU,EAAS,KAAMP,EAAM,EACpCJ,GAAA,cAACC,GAAA,CAAO,MAAOQ,EAAW,WAAY,KAAK,IAAIN,EAAY,EAAG,EAAG,KAAMC,EAAM,CAC/E,EACCM,CACH,EAIGI,GAAQN,GDnDf,OAAOO,OAAY,oBAEnB,IAAMC,GAAY,CAAC,CAAE,MAAAC,EAAQ,SAAU,IACrCC,GAAA,cAAC,OAAI,MAAO,GAAI,OAAQ,EAAG,QAAQ,WAAW,KAAK,OAAO,MAAM,8BAC9DA,GAAA,cAAC,QACC,EAAE,yCACF,OAAQD,EACR,YAAY,MACZ,cAAc,QACd,eAAe,QACjB,CACF,EAGIE,GAA6C,CACjD,MAAO,OACP,OAAQ,OACR,aAAc,MACd,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,EAEMC,GAA4C,CAChD,MAAO,OACP,OAAQ,OACR,aAAc,OACd,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,EAEMC,GAAuC,CAC3C,OAAQ,oBACR,MAAO,SACT,EAEMC,GAAyC,CAC7C,OAAQ,mBACV,EAEMC,GAAsC,CAC1C,MAAO,SACT,EAEMC,GAAwC,CAC5C,OAAQ,mBACV,EAEMC,GAAgBC,GAChBA,IAAS,SAAiBP,GAClBC,GAGRO,GAAgB,CAACD,EAAoBE,IACrCF,IAAS,SACJE,EAAUP,GAAuCC,GACnDM,EAAUL,GAAsCC,GAenDK,GAAqBC,GAAO;AAAA,IAC7BC,GAAUC,GAAoBD,CAAK;AAAA,EAG3BE,GAA8B,CAAC,CAC1C,MAAAC,EACA,KAAAR,EAAO,QACP,aAAAS,EAAe,UACf,SAAAC,EACA,WAAAC,EAAaC,GACb,MAAAC,EACA,UAAAC,CACF,IAAM,CACJ,IAAIC,EAAgBhB,GAAaC,CAAoB,EACjDgB,EAAaf,GAAcD,EAAsBQ,CAAK,EAgB1D,OAdIA,IAAU,GACZO,EAAgBE,EAAAC,IAAA,GACXH,GACAC,GAFW,CAGd,gBAAiBL,EAAW,MAAM,iBAClC,YAAaX,IAAS,SAAWS,EAAe,MAClD,GAEAM,EAAgBG,IAAA,GACXH,GACAC,GAIHR,IAAU,IAAQR,IAAS,SAAWU,IAAa,QAAaA,IAAa,EACxElB,GAAA,cAAC2B,GAAA,CAAa,UAAWV,EAAc,WAAYC,EAAU,KAAM,GAAI,EAI9ElB,GAAA,cAACW,GAAA,CACC,eAAgBY,EAChB,MAAOF,EACP,KAAK,WACL,UAAWO,GACTC,EAAa,qBAAsBV,CAAU,EAC7CU,EACEb,EAAQ,4BAA8B,8BACtCG,CACF,EACAH,EAAQ,4BAA8B,8BACtCM,CACF,GAECN,GAAShB,GAAA,cAACF,GAAA,CAAU,MAAO,UAAW,CACzC,CAEJ,EDvHA,IAAMgC,GAA4BC,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQnCC,GAAyBD,GAAO;AAAA,IACjCE,GAAUC,EAAwBD,CAAK;AAAA;AAAA,wBAEnBA,GAAO,CApBhC,IAAAE,EAAAC,EAoBmC,OAAAA,GAAAD,EAAAF,EAAM,aAAN,YAAAE,EAAkB,QAAlB,YAAAC,EAAyB;AAAA;AAAA;AAAA;AAAA,0BAIjCH,GAAUA,EAAM,WAAW,MAAM;AAAA,0BACjCA,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA,0BAIjCA,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAerD,SAASI,GAAmB,CACjC,UAAAC,EACA,oBAAAC,EACA,gBAAAC,EACA,UAAAC,EACA,wBAAAC,CACF,EAAmB,CAlDnB,IAAAP,EAmDE,IAAMQ,EAAQL,EACR,CAACM,EAAaC,CAAc,EAAIC,IAAmBL,GAAA,YAAAA,EAAW,SAAU,CAAC,CAAC,EAC1E,CAACM,EAAWC,CAAY,EAAIF,GAAS,EAAK,EAEhD,OAAAG,GAAU,IAAM,CACVL,EAAY,QAAU,GAAK,CAACG,IAC9BC,EAAa,EAAI,EACjBR,EAAgB,CAAE,OAAQ,CAAC,CAAE,CAAC,EAElC,EAAG,CAAC,CAAC,EAELS,GAAU,IAAM,CACdT,EAAgB,CAAE,OAAQI,CAAY,CAAC,CACzC,EAAG,CAACA,CAAW,CAAC,EAEhBK,GAAU,IAAM,CAGZN,EAAM,WACLC,EAAY,OAASD,EAAM,MAAM,YAAcC,EAAY,OAASD,EAAM,MAAM,YAEjFD,EAAwB,CACtB,CACE,QAAS,GACT,GAAIC,EAAM,EACZ,CACF,CAAC,EAEDD,EAAwB,CAAC,CAAC,CAE9B,EAAG,CAACE,CAAW,CAAC,EAGdM,GAAA,cAACpB,GAAA,KACCoB,GAAA,cAACC,GAAA,CACC,MAAOR,EAAM,MACb,SAAUA,EAAM,SAChB,WAAYJ,EAAoB,WAClC,GACCJ,EAAAQ,EAAM,MAAM,UAAZ,YAAAR,EAAqB,IAAKiB,GAEvBF,GAAA,cAAClB,GAAA,CACC,WAAYO,EAAoB,WAChC,UAAWc,EACTT,EAAY,SAASQ,EAAO,EAAE,EAC1B,iCACA,yBACJb,EAAoB,UACtB,EACA,IAAKa,EAAO,GACZ,MAAOA,EAAO,GACd,gBAAeR,EAAY,SAASQ,EAAO,EAAE,EAC7C,QAAS,IAAM,CAEb,GAAIR,EAAY,SAASQ,EAAO,EAAE,EAAG,CACnCP,EAAeD,EAAY,OAAQU,GAAOA,IAAOF,EAAO,EAAE,CAAC,EAC3D,OAGER,EAAY,OAASD,EAAM,MAAM,WACnCE,EAAe,CAAC,GAAGD,EAAaQ,EAAO,EAAE,CAAC,EAEtCR,EAAY,QAAU,GAAKD,EAAM,MAAM,YAAc,GAEvDE,EAAe,CAACO,EAAO,EAAE,CAAC,CAGhC,GAECA,EAAO,MACRF,GAAA,cAACK,GAAA,CACC,KAAK,QACL,aAAchB,EAAoB,WAAW,MAAM,aACnD,MAAOK,EAAY,SAASQ,EAAO,EAAE,EACrC,WAAYb,EAAoB,WAClC,CACF,GAGJW,GAAA,cAACM,GAAA,CAAS,MAAOb,EAAM,SAAU,WAAYJ,EAAoB,WAAY,CAC/E,CAEJ,CGrIA,OAAOkB,OAAW,QAIlB,OAAOC,OAAY,oBCJnB,OAAOC,OAAe,YAEf,SAASC,EAASC,EAAgB,CACvC,OAAKA,EAGE,CACL,OAAQF,GAAU,SAASE,EAAO,CAChC,aAAc,CACZ,IACA,IACA,IACA,OACA,MACA,IACA,MACA,IACA,KACA,MACA,OACA,KACA,KACA,QACA,QACA,QACA,KACA,KACA,KACA,KACA,KACA,KACA,IACF,EACA,aAAc,CAAC,QAAS,QAAS,SAAU,KAAM,OAAQ,MAAO,KAAK,CACvE,CAAC,CACH,EA/BS,CAAE,OAAQ,EAAG,CAgCxB,CD7BA,IAAMC,GAAcC,GAAO;AAAA,IACtBC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA,iBAG1BA,GAAWA,EAAM,MAAQ,QAAU,OAAS;AAAA,mBAC1CA,GAAWA,EAAM,MAAQ,QAAU,OAAS;AAAA;AAAA;AAAA;AAAA;AAAA,aAKlDA,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA,EAIzCE,GAAiBH,GAAO;AAAA,IACzBC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAM9BA,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA,EAIxC,SAASG,GAAc,CAC5B,WAAAC,EACA,MAAAC,EACA,SAAAC,EACA,KAAAC,EAAO,SACP,YAAAC,EAAc,GACd,WAAAC,EAAa,EACf,EAOG,CACD,OACEC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACZ,GAAA,CACC,WAAYM,EACZ,GAAIK,EAAa,UAAUA,SAAoB,eAC/C,UAAWE,EACT,GAAGH,IAAcA,EAAcI,GAAQL,CAAI,EAAIA,SAC/CH,CACF,EACA,wBAAyBS,EAASR,CAAK,EACvC,KAAME,EACR,EACCD,GACCI,GAAA,cAACR,GAAA,CACC,GAAIO,EAAa,UAAUA,YAAuB,kBAClD,WAAYL,EACZ,UAAWO,EACT,GAAGH,IAAcA,EAAcI,GAAQL,CAAI,EAAIA,YAC/CH,CACF,EACA,wBAAyBS,EAASP,CAAQ,EAC1C,KAAMC,EACR,CAEJ,CAEJ,CEzEA,UAAYO,OAAW,QAEhB,IAAMC,GAAWC,GACtB,iBAAC,MAAAC,EAAA,CACC,MAAM,6BACN,MAAO,GACP,OAAQ,GACR,cAAY,OACZ,QAAQ,aACJD,GAEJ,iBAAC,QACC,KAAK,eACL,SAAS,UACT,EAAE,wQACJ,CACF,EbKF,IAAME,GAAsBC,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ7BC,GAA4BD,GAAO;AAAA,WAC7BE,GAAO,CA9BnB,IAAAC,EAAAC,EA8BsB,OAAAA,GAAAD,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAC,EAAyB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOzCC,GAAgCL,GAAO;AAAA;AAAA;AAAA,EAKvCM,GAAaN,GAAO;AAAA;AAAA;AAAA,EAKpBO,GAAsF,CAC1F,KAAMC,GACN,eAAgBC,GAChB,mBAAoBC,EACtB,EAEaC,GAAuB,iCAE7B,SAASC,GAAmB,CACjC,OAAAC,EACA,SAAAC,EACA,YAAAC,EACA,eAAAC,EACA,WAAAC,EACA,WAAAC,EACA,mBAAAC,EACA,YAAAC,CACF,EAAwB,CAhExB,IAAAjB,EAiEE,IAAMkB,EAAeP,EAAS,MACxB,CAACQ,EAAsBC,CAAuB,EAAIC,GAAgC,CAAC,CAAC,EACpF,CAACC,EAAeC,CAAgB,EAAIF,GAAmB,CAAC,CAAC,EACzD,CAAE,OAAAG,CAAO,EAAIC,GAAQ,EACrB,CAACC,EAAaC,CAAc,EAAIN,GACpCO,EAAqB,IAAMX,EAAcA,EAAYN,EAAS,EAAE,EAAI,OAAS,CAAC,CAChF,EACM,CAAE,SAAAkB,CAAS,EAAIC,GAAWC,EAAc,EACxCC,EAAmBC,IAAA,GAAK7B,IAAwBY,GAEtDkB,GAAU,IAAM,CACdrB,EAAeM,EAAqB,SAAW,CAAC,CAClD,EAAG,CAACA,EAAsBN,CAAc,CAAC,EAEzCqB,GAAU,IAAM,CACdpB,EAAWY,CAAW,CACxB,EAAG,CAACA,CAAW,CAAC,EAEhB,SAASS,EAAmBC,EAAsBC,EAAc,CAC9DV,EAAgBW,GAAa,CAC3B,IAAMC,EAAUC,EAAAP,EAAA,GAAKK,GAAL,CAAe,CAACF,EAAM,EAAE,EAAGC,CAAK,GAChD,OAAI,OAAO,QAAW,aAAe,OAAO,cAAgB,CAACR,GAC3D,OAAO,aAAa,QAAQY,EAAmB,EAAG,KAAK,UAAUF,CAAO,CAAC,EAEpEA,CACT,CAAC,CACH,CAEA,SAASX,GAAuB,CAC9B,GAAI,OAAO,QAAW,aAAe,OAAO,aAAc,CACxD,IAAMS,EAAO,OAAO,aAAa,QAAQI,EAAmB,CAAC,EAC7D,GAAIJ,EACF,OAAO,KAAK,MAAMA,CAAI,EAG1B,OAAO,IACT,CAEA,SAASI,GAAqB,CAC5B,MAAO,GAAGjC,MAAwBE,KAAUC,EAAS,MAAMa,GAC7D,CAEA,OACEkB,GAAA,cAACvC,GAAA,CAAW,UAAWwC,EAAa,aAAc5B,CAAU,GAC1D2B,GAAA,cAACE,GAAA,CAAc,WAAY7B,EAAY,MAAOJ,EAAS,MAAO,SAAUA,EAAS,SAAU,EAC3F+B,GAAA,cAAC9C,GAAA,CAAoB,UAAW+C,EAAa,sBAAuB5B,CAAU,IAC3Ef,EAAAkB,GAAA,YAAAA,EAAc,OAAd,YAAAlB,EAAoB,IAAKoC,GAAyB,CACjD,IAAMS,EAAM1B,EAAqB,QAAQ,EAAE,KAAM2B,GAAUA,EAAM,KAAOV,EAAM,EAAE,EAChF,OAAOJ,EAAiBI,EAAM,IAAI,EAChCM,GAAA,cAAC,QACC,IAAKN,EAAM,GACX,gBAAeA,EAAM,GACrB,UAAWO,EAAa,kBAAmB5B,CAAU,GAEpDiB,EAAiBI,EAAM,IAAI,EAAE,CAC5B,UAAWA,EACX,oBAAqB,CACnB,OAAA1B,EACA,SAAAC,EACA,YAAAC,EACA,eAAAC,EACA,WAAAC,EACA,WAAAC,CACF,EACA,gBAAkBsB,GAAS,CAEvB,CAACf,EAAc,SAASc,EAAM,EAAE,GAEhCC,IACAA,GAAA,YAAAA,EAAM,QAAS,IAEfd,EAAkBwB,GAAS,CAAC,GAAGA,EAAMX,EAAM,EAAE,CAAC,EAEhDD,EAAmBC,EAAOC,CAAI,CAChC,EACA,UAAWX,EAAYU,EAAM,EAAE,EAC/B,wBAA0BY,GAAW,CAC/BA,EAAO,SAAW,GAAK7B,EAAqB,SAAW,GAG3DC,EAAyB2B,GACnBC,EAAO,SAAW,EACbD,EAAK,OAAQD,GAAUA,EAAM,KAAOV,EAAM,EAAE,EAE9C,CAAC,GAAGW,EAAM,GAAGC,CAAM,CAC3B,CACH,CACF,CAAC,EACAH,GAAOA,EAAI,SAAWvB,EAAc,SAASc,EAAM,EAAE,GAAKS,EAAI,SAAW,IACxEH,GAAA,cAAC5C,GAAA,CACC,IAAKsC,EAAM,GACX,MAAO,CAAE,SAAU,QAAS,EAC5B,WAAYrB,EACZ,UAAW4B,EAAa,4BAA6B5B,CAAU,GAE/D2B,GAAA,cAACxC,GAAA,CACC,WAAYa,EACZ,UAAW4B,EAAa,gCAAiC5B,CAAU,GAEnE2B,GAAA,cAACO,GAAA,IAAQ,CACX,EACCJ,EAAI,OACP,CAEJ,EACE,IACN,EACF,CACF,CAEJ,Cc/KA,OAAOK,OAAY,oBAEZ,IAAMC,GAAmBD,GAAO;AAAA;AAAA;AAAA,qBAGjBE,GAAWA,EAAM,eAAiB,gBAAkB;AAAA;AAAA,EAI7DC,GAAeH,GAAO;AAAA,WACvBE,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA,EAIhCE,GAAaJ,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpBK,GAAgBL,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUvBM,GAAuBN,GAAO;AAAA,aAC7BE,GAAWA,EAAM,OAAS,cAAgB,OAAS;AAAA;AAAA;AAAA,EAKpDK,GAA4BP,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAMzBE,GAAWA,EAAM,MAAQ,OAAOA,EAAM,SAAW;AAAA;AAAA;AAAA;AAAA,6BAI1CA,GAAUA,EAAM,WAAW,MAAM;AAAA,gCAC9BA,GAAUA,EAAM,WAAW,MAAM;EC/ClE,OAAOM,OAAmB,QCA1B,OAAOC,OAAkC,QACzC,OAAOC,OAAY,oBCDnB,OAAOC,OAAY,oBAEZ,IAAMC,GAAUD,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EDyB9B,IAAME,GAAkBC,GAAO;AAAA;AAAA;AAAA;AAAA,IAI1BC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA,aAG9BA,GAAWA,EAAM,OAAS,aAAe,OAAS;AAAA;AAAA,MAEzDA,GAAWA,EAAM,WAAa,6BAA+B;AAAA;AAAA,wBAE3CA,GAAO,CAtChC,IAAAE,EAAAC,EAuCM,OAAAH,EAAM,UAAY,WAAYG,GAAAD,EAAAF,GAAA,YAAAA,EAAO,aAAP,YAAAE,EAAmB,QAAnB,YAAAC,EAA0B;AAAA,aAChDH,GAAO,CAxCrB,IAAAE,EAAAC,EAAAC,EAAAC,EAyCM,OAAAL,EAAM,WACFG,GAAAD,EAAAF,EAAM,aAAN,YAAAE,EAAkB,QAAlB,YAAAC,EAAyB,WACzBE,GAAAD,EAAAJ,EAAM,aAAN,YAAAI,EAAkB,QAAlB,YAAAC,EAAyB;AAAA,wBACVL,GAAO,CA5ChC,IAAAE,EAAAC,EAAAC,EAAAC,EA6CM,OAAAL,EAAM,WACFG,GAAAD,EAAAF,EAAM,aAAN,YAAAE,EAAkB,QAAlB,YAAAC,EAAyB,iBACzBE,GAAAD,EAAAJ,GAAA,YAAAA,EAAO,aAAP,YAAAI,EAAmB,QAAnB,YAAAC,EAA0B;AAAA,qBACdL,GAAO,CAhD7B,IAAAE,EAAAC,EAgDgC,OAAAA,GAAAD,EAAAF,EAAM,aAAN,YAAAE,EAAkB,QAAlB,YAAAC,EAAyB;AAAA,eACzCH,GAAWA,EAAM,MAAQ,QAAU,oBAAsB;AAAA,iBACvDA,GAAWA,EAAM,MAAQ,QAAU,OAAS;AAAA;AAAA;AAAA,MAGvDA,GAAUM,GAAoBN,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAO1BA,GAAWA,EAAM,SAAW,OAAS,MAAQ;AAAA;AAAA;AAAA;AAAA,eAI7CA,GAAWA,EAAM,SAAW,OAAS,MAAQ;AAAA;AAAA;AAAA,EAKhDO,GAA0BR,GAAO;AAAA,IACzCC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAY/BQ,GAA0B,CAAC,CACtC,QAAAC,EACA,MAAAC,EACA,MAAAC,EACA,SAAAC,EACA,KAAAC,EAAO,SACP,KAAAC,EAAO,SACP,UAAAC,EAAY,GACZ,WAAAC,EACA,WAAAC,EAAa,GACb,YAAAC,EAAc,GACd,QAAAC,EAAU,GACV,UAAAC,EAAY,EACd,IAAM,CA/FN,IAAAlB,EAgGE,SAASmB,GAAyB,CAChC,IAAMC,EAAOP,EAAY,kBAAoB,SAC7C,OAAIG,IAAgB,GACXI,EAGF,GAAGJ,IAAcK,GAAQD,CAAI,GACtC,CAEA,OACEE,GAAA,cAAC1B,GAAA,CACC,SAAUiB,EAAY,IAAM,IAC5B,UAAWA,EACX,WAAYC,EACZ,SAAUJ,GAAYO,EACtB,SAASjB,EAAAiB,GAAA,YAAAA,EAAS,aAAT,KAAAjB,EAAuB,GAChC,QAASO,EACT,eAAgBE,EAChB,KAAME,EACN,WAAYI,EACZ,KAAMH,EACN,UAAWW,EAAaJ,EAAuB,EAAGL,CAAU,EAC5D,UAAWI,GAEVD,EACCK,GAAA,cAACE,GAAA,CAAQ,UAAWD,EAAa,eAAgBT,CAAU,EAAG,EAE9DN,GAAA,KAAAA,EAAS,UAEb,CAEJ,EDzGO,IAAMiB,GAAkC,CAAC,CAC9C,KAAAC,EACA,YAAAC,EACA,WAAAC,EACA,eAAAC,EACA,iBAAAC,EACA,aAAAC,EACA,MAAAC,EACA,OAAAC,EACA,oBAAAC,EACA,aAAAC,EACA,SAAAC,CACF,IAAM,CAlCN,IAAAC,EAmCE,IAAMC,EAAiBN,EAAM,OAAS,GAAKD,GAAgB,GAAKG,EAC1DK,EACHb,EAAK,oBAAsBA,EAAK,sBAAyBY,EACtD,SACA,aAEN,OACEE,GAAA,cAAAA,GAAA,cACGL,IAAiB,MAAQA,GAAgB,MACxCK,GAAA,cAACC,GAAA,CAAa,WAAYb,EAAY,UAAWc,EAAa,eAAgBd,CAAU,GACrFO,CACH,EAEFK,GAAA,cAACG,GAAA,CACC,eAAgBL,EAChB,UAAWI,EAAa,mBAAoBd,CAAU,GAErDU,GACCE,GAAA,cAACI,GAAA,CACC,OAAOP,EAAAX,EAAK,kBAAL,KAAAW,EAAwB,OAC/B,QAASJ,EACT,UAAW,GACX,WAAY,GACZ,KAAMM,EACN,WAAYX,EACZ,MAAO,CAAE,MAAO,OAAQ,SAAU,MAAO,EACzC,YAAY,OACd,EAEFY,GAAA,cAACK,GAAA,CAAW,UAAWH,EAAa,aAAcd,CAAU,GACzDF,EAAK,qBACJc,GAAA,cAACI,GAAA,CACC,MAAOlB,EAAK,qBACZ,QAASI,EACT,UAAW,GACX,WAAY,GACZ,KAAMS,EACN,WAAYX,EACZ,SAAUQ,EACZ,EACE,KAAM,IACTV,EAAK,mBACJc,GAAA,cAACI,GAAA,CACC,SAAU,CAACjB,EACX,WAAY,GACZ,MAAOD,EAAK,mBACZ,QAASG,EACT,KAAMU,EACN,WAAYX,EACZ,QAASQ,EACX,EACE,IACN,CACF,CACF,CAEJ,EG3FA,OAAOU,OAAmB,QAC1B,OAAOC,OAAY,oBAKnB,IAAMC,GAAUC,GAAO;AAAA;AAAA;AAAA,EAYVC,GAA0C,CAAC,CACtD,UAAAC,EAAY,EACZ,YAAAC,EAAc,EACd,UAAAC,EACA,WAAAC,CACF,IAAM,CACJ,GAAM,CAAE,MAAAC,CAAM,EAAIC,GAAS,EAAE,2BAA2BF,CAAU,EAElE,OACEG,GAAA,cAACT,GAAA,CAAQ,UAAWK,GAClBI,GAAA,cAAC,OACC,MAAO,GAAKN,EAAY,EACxB,OAAQ,EACR,QAAS,OAAO,GAAKA,EAAY,MACjC,KAAK,QAEJ,MAAMA,CAAS,EACb,KAAK,IAAI,EACT,IAAI,CAACO,EAAGC,IACPF,GAAA,cAAC,QACC,IAAKE,EACL,EAAG,GAAKA,EACR,EAAG,EACH,MAAO,EACP,OAAQ,EACR,GAAI,EACJ,KAAMP,IAAgBO,EAAMJ,EAAM,aAAe,eACnD,CACD,CACL,CACF,CAEJ,EClDA,OAAOK,OAAW,QAClB,OAAOC,OAAY,oBCCnB,OAAS,cAAAC,OAAkB,QAEpB,SAASC,IAAyB,CACvC,IAAMC,EAAUF,GAAWG,EAAc,EAEzC,SAASC,EAA2BC,EAAgB,CAClDC,EAAUD,EAAK,iBAAkBA,EAAK,sBAAsB,CAC9D,CAEA,SAASE,EAA6BF,EAAgB,CACpDC,EAAUD,EAAK,mBAAoBA,EAAK,wBAAwB,CAClE,CAEA,SAASC,EAAUE,EAAcC,EAAiB,CAChD,GAAI,CAACD,EACH,OAGF,IAAIE,EAAgBF,EAAI,WAAW,MAAM,EAAI,SAAW,QAEpDC,GAAUA,IAAW,WACvBC,EAAgB,SAElBR,EAAQ,SAASM,EAAKE,CAAa,CACrC,CAEA,MAAO,CACL,2BAAAN,EACA,6BAAAG,EACA,UAAAD,CACF,CACF,CDnBA,IAAMK,GAAgBC,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvBC,GAAOD,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBdE,GAAWF,GAAO;AAAA;AAAA;AAAA,EAKlBG,GAAYH,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAenBI,GAAcJ,GAAO;AAAA;AAAA;AAAA;AAAA,EAMrBK,GAAiBL,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWvB,SAASM,GAAuB,CAAE,SAAAC,EAAU,WAAAC,CAAW,EAAwB,CA1EtF,IAAAC,EAAAC,EA2EE,GAAM,CAAE,UAAAC,CAAU,EAAIC,GAAuB,EAE7C,OACEC,GAAA,cAAC,WACCA,GAAA,cAACT,GAAA,CAAY,wBAAyBU,EAASP,EAAS,KAAK,EAAG,EAChEM,GAAA,cAACR,GAAA,CAAe,wBAAyBS,EAASP,EAAS,QAAQ,EAAG,EACtEM,GAAA,cAACd,GAAA,MACEW,GAAAD,EAAAF,EAAS,QAAT,YAAAE,EAAgB,QAAhB,YAAAC,EAAuB,IAAKK,GAC3BF,GAAA,cAACZ,GAAA,CAAK,IAAKc,EAAK,OACdF,GAAA,cAACX,GAAA,CAAS,IAAKa,EAAK,SAAU,EAC9BF,GAAA,cAACV,GAAA,CACC,MAAO,CACL,YAAaK,EAAW,MAAM,aAC9B,MAAOA,EAAW,MAAM,YAC1B,EACA,QAAS,IAAM,CA1F7B,IAAAC,EA2FoBM,EAAK,KACPJ,EAAUI,EAAK,KAAKN,EAAAM,EAAK,YAAL,KAAAN,EAAkB,QAAQ,CAElD,GAECM,EAAK,KACR,CACF,EAEJ,CACF,CAEJ,CEvGA,OAAOC,IAAS,aAAAC,OAAiB,QACjC,OAAOC,OAAY,oBCDnB,OAAOC,OAA8B,QAE9B,IAAMC,GAAO,CAAC,CACnB,MAAAC,EACA,UAAAC,CACF,IAKEH,GAAA,cAAC,OACC,MAAM,6BACN,KAAK,OACL,QAAQ,YACR,YAAa,IACb,OAAO,eACP,UAAWG,EACX,MAAOD,GAEPF,GAAA,cAAC,QAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,qCAAqC,EAC1FA,GAAA,cAAC,QACC,cAAc,QACd,eAAe,QACf,EAAE,qHACJ,CACF,ECvBF,OAAOI,IAAS,UAAAC,GAAQ,YAAAC,OAAgB,QACxC,OAAOC,OAAY,oBAGnB,IAAMC,GAAqBC,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU5BC,GAAkBD,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAejBE,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA,EAKzCC,GAAQH,GAAO;AAAA;AAAA;AAAA,mBAGDE,GAAUA,EAAM,WAAW,MAAM;AAAA,EAE/CE,GAAqBJ,GAAO;AAAA;AAAA;AAAA;AAAA,mBAIdE,GAAUA,EAAM,WAAW,MAAM;AAAA,EAG/CG,GAAmBL,GAAO;AAAA;AAAA;AAAA;AAAA,mBAIZE,GAAUA,EAAM,WAAW,MAAM;AAAA,EAE/CI,GAAoBN,GAAO;AAAA;AAAA;AAAA;AAAA,mBAIbE,GAAUA,EAAM,WAAW,MAAM;AAAA,EAG9C,SAASK,GAAU,CACxB,WAAAC,EACA,SAAAC,EACA,SAAAC,EAAW,EACb,EAIG,CAGD,IAAMC,EAAMC,GAAY,EAElB,CAACC,EAAWC,CAAY,EAAIC,GAASL,CAAQ,EAEnD,GAAID,EAAS,SAAS,SAAS,EAAG,CAChC,IAAIO,EAAUP,EAAS,MAAM,IAAI,EAAE,CAAC,EAC9BQ,EAAoBD,EAAQ,QAAQ,GAAG,EAC7C,OAAIC,IAAsB,KACxBD,EAAUA,EAAQ,UAAU,EAAGC,CAAiB,GAGhDC,GAAA,cAACd,GAAA,CACC,MAAM,OACN,OAAO,OACP,IAAK,iCAAiCY,IACtC,YAAY,IACZ,MAAM,2FACN,gBAAe,GACf,WAAYR,EACZ,UAAWW,EAAa,gBAAiBX,CAAU,EACrD,EAIJ,GAAIC,EAAS,SAAS,OAAO,EAAG,CAC9B,IAAIO,EAAUP,EAAS,MAAM,YAAY,EAAE,CAAC,EACtCQ,EAAoBD,EAAQ,QAAQ,GAAG,EAC7C,OAAIC,IAAsB,KACxBD,EAAUA,EAAQ,UAAU,EAAGC,CAAiB,GAGhDC,GAAA,cAACb,GAAA,CACC,MAAM,OACN,OAAO,OACP,IAAK,kCAAkCW,IACvC,YAAY,IACZ,MAAM,2CACN,gBAAe,GACf,WAAYR,EACZ,UAAWW,EAAa,cAAeX,CAAU,EACnD,EAIJ,GAAIC,EAAS,SAAS,QAAQ,EAAG,CAC/B,IAAIO,EAAUP,EAAS,MAAM,oBAAoB,EAAE,CAAC,EAC9CQ,EAAoBD,EAAQ,QAAQ,GAAG,EAC7C,OAAIC,IAAsB,KACxBD,EAAUA,EAAQ,UAAU,EAAGC,CAAiB,GAGhDC,GAAA,cAACZ,GAAA,CACC,MAAM,OACN,OAAO,OACP,IAAK,wCAAwCU,IAC7C,YAAY,IACZ,MAAM,2CACN,gBAAe,GACf,WAAYR,EACZ,UAAWW,EAAa,eAAgBX,CAAU,EACpD,EAIJ,OACEU,GAAA,cAACnB,GAAA,CACC,UAAWoB,EAAa,qBAAsBX,CAAU,EACxD,WAAYA,GAEX,CAACK,GACAK,GAAA,cAACjB,GAAA,CACC,QAAS,IAAM,CACba,EAAa,EAAI,EACjBH,EAAI,QAAQ,KAAK,CACnB,EACA,WAAYH,EACZ,UAAWW,EAAa,kBAAmBX,CAAU,GAErDU,GAAA,cAACE,GAAA,IAAK,CACR,EAEFF,GAAA,cAACf,GAAA,CACC,WAAYK,EACZ,SAAUK,EACV,IAAKF,EACL,KAAME,EACN,IAAKJ,EACL,SAAUC,EACV,MAAOA,EACT,CACF,CAEJ,CFxJA,IAAMW,GAA4BC,GAAO;AAAA,IACpCC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAOtCE,GAAoBH,GAAO;AAAA,IAC5BC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQtCG,GAA4BJ,GAAO;AAAA,IACpCC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA,EAKtCI,GAAoBL,GAAO;AAAA,IAC5BC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQrC,SAASK,GAAqB,CACnC,SAAAC,EACA,WAAAC,EACA,eAAAC,CACF,EAAwB,CACtB,OAAAC,GAAU,IAAM,CACdD,EAAe,EAAI,CACrB,EAAG,CAAC,CAAC,EAGHE,GAAA,cAACZ,GAAA,CAA0B,UAAWa,EAAa,wBAAyBJ,CAAU,GACpFG,GAAA,cAACP,GAAA,CAA0B,UAAWQ,EAAa,4BAA6BJ,CAAU,GACxFG,GAAA,cAACE,GAAA,CACC,WAAYL,EACZ,MAAOD,EAAS,MAChB,SAAUA,EAAS,SACrB,CACF,EACCA,EAAS,UACRI,GAAA,cAACR,GAAA,CACC,UAAWS,EAAa,oBAAqBJ,CAAU,EACvD,IAAKD,EAAS,SAChB,EAED,CAACA,EAAS,UAAYA,EAAS,UAC9BI,GAAA,cAACN,GAAA,CACC,WAAYG,EACZ,UAAWI,EAAa,oBAAqBJ,CAAU,GAEvDG,GAAA,cAACG,GAAA,CAAU,WAAYN,EAAY,SAAUD,EAAS,SAAU,CAClE,CAEJ,CAEJ,CG9EA,OAAOQ,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QCA3C,OAAOC,OAAY,oBAEZ,IAAMC,GAA+BD,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAStCE,GAAmBF,GAAO;AAAA;AAAA;AAAA,EAK1BG,GAAkBH,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,WAK1BI,GAAO,CArBnB,IAAAC,EAAAC,EAqBsB,OAAAA,GAAAD,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAC,EAAyB;AAAA,EAGlCC,GAAqBP,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAO7BI,GAAO,CA/BnB,IAAAC,EAAAC,EA+BsB,OAAAA,GAAAD,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAC,EAAyB;AAAA,EAGlCE,GAAaR,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBASbI,GAAWA,EAAM,iBAAmB,OAAS;AAAA;AAAA,EAIpDK,GAAiBT,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQxBU,GAAWV,GAAO;AAAA;AAAA;AAAA;AAAA,EAMlBW,GAAiBX,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,WAKzBI,GAAO,CAlEnB,IAAAC,EAAAC,EAkEsB,OAAAA,GAAAD,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAC,EAAyB;AAAA;AAAA;EDnDxC,IAAMM,GAAqB,CAAC,CACjC,SAAAC,EACA,eAAAC,EACA,WAAAC,EACA,WAAAC,CACF,IAA2B,CACzB,IAAMC,EAAsBJ,EAAS,MAC/B,CAACK,EAAaC,CAAc,EAAIC,GAAmB,CAAC,CAAC,EACrD,CAACC,EAAWC,CAAY,EAAIF,GAAS,EAAK,EAC1C,CAACG,EAAYC,CAAa,EAAIJ,GAASP,EAAS,EAAE,EAExD,OAAAY,GAAU,IAAM,CACVP,EAAY,QAAU,GAAK,CAACG,IAC9BC,EAAa,EAAI,EACjBP,EAAW,CAAE,OAAQ,CAAC,CAAE,CAAC,EAE7B,EAAG,CAACM,CAAS,CAAC,EAEdI,GAAU,IAAM,CACVF,IAAeV,EAAS,KAC1BW,EAAcX,EAAS,EAAE,EACzBM,EAAe,CAAC,CAAC,EAErB,EAAG,CAACN,CAAQ,CAAC,EAEbY,GAAU,IAAM,CACdV,EAAW,CAAE,OAAQG,CAAY,CAAC,EAC9BA,EAAY,QAAUD,EAAoB,WAC5CH,EAAe,EAAI,EAEnBA,EAAe,EAAK,CAExB,EAAG,CAACI,CAAW,CAAC,EAGdQ,GAAA,cAACC,GAAA,CAA6B,UAAWC,EAAa,sBAAuBZ,CAAU,GACrFU,GAAA,cAACG,GAAA,KACCH,GAAA,cAACI,GAAA,CAAgB,UAAWF,EAAa,kBAAmBZ,CAAU,GACnEH,EAAS,KACZ,EACAa,GAAA,cAACK,GAAA,CACC,WAAYf,EACZ,UAAWY,EAAa,qBAAsBZ,CAAU,GAEvDH,EAAS,QACZ,CACF,EACCI,EAAoB,QAAQ,IAAI,CAACe,EAAQC,IAAQ,CAChD,IAAMC,EAAahB,EAAY,SAASc,EAAO,EAAE,EACjD,OACEN,GAAA,cAACS,GAAA,CACC,IAAK,eAAeF,IACpB,QAAS,IAAM,CAEb,GAAIf,EAAY,SAASc,EAAO,EAAE,EAAG,CACnCb,EAAeD,EAAY,OAAQkB,GAAOA,IAAOJ,EAAO,EAAE,CAAC,EAC3D,OAGEd,EAAY,OAASD,EAAoB,WAC3CE,EAAe,CAAC,GAAGD,EAAac,EAAO,EAAE,CAAC,EAEtCd,EAAY,QAAU,GAAKD,EAAoB,YAAc,GAE/DE,EAAe,CAACa,EAAO,EAAE,CAAC,CAGhC,EACA,iBAAkBC,IAAQhB,EAAoB,QAAQ,OAAS,EAC/D,UAAWW,EAAa,uBAAwBZ,CAAU,GAE1DU,GAAA,cAACW,GAAA,CAAe,UAAWT,EAAa,sBAAuBZ,CAAU,GACtEgB,EAAO,UAAYN,GAAA,cAACY,GAAA,CAAS,IAAKN,EAAO,SAAU,IAAK,eAAeC,IAAO,EAC/EP,GAAA,cAACa,GAAA,CACC,WAAYvB,EACZ,UAAWY,EAAa,2BAA4BZ,CAAU,GAE7DgB,EAAO,KACV,CACF,EACAN,GAAA,cAACc,GAAA,CACC,WAAYxB,EACZ,MAAOkB,EACP,aAAclB,EAAW,MAAM,aACjC,CACF,CAEJ,CAAC,CACH,CAEJ,EE3FA,OAAOyB,IAAa,aAAAC,GAAW,YAAAC,OAAgB,QAI/C,IAAMC,GAAmB,CAAC,CAAE,SAAAC,EAAU,GAAAC,EAAI,WAAAC,EAAa,EAAM,IAEzDC,GAAA,cAAAA,GAAA,cACGD,EACCC,GAAA,cAAC,OACC,IAAKF,EACL,MAAO,CACL,MAAO,OACP,OAAQ,OACR,SAAU,WACV,IAAK,EACL,KAAM,EACN,OAAQ,EACR,UAAW,MACb,GAECD,CACH,EAEAA,CAEJ,EAkBSI,GAAoC,CAAC,CAChD,WAAAC,EACA,MAAAC,EACA,aAAAC,EACA,gBAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,OAAAC,EACA,KAAAC,EACA,qBAAAC,EACA,WAAAC,EACA,WAAAC,EACA,aAAAC,EACA,UAAAC,EACA,eAAAC,EAAiB,GACjB,mBAAAC,EACA,oBAAAC,EACA,kBAAAC,EACA,iBAAAC,EACA,WAAAC,EACA,YAAAC,EACA,sBAAAC,EACA,WAAAC,CACF,IAAM,CAjFN,IAAAC,GAyFE,IAAMC,EAAwBC,IAAA,GAPI,CAChC,eAAgBC,GAChB,WAAYC,GACZ,aAAcC,GACd,WAAYC,EACd,GAEiE1B,GAC3D,CAAE,2BAAA2B,EAA4B,6BAAAC,CAA6B,EAAIC,GAAuB,EAEtF,CAACC,EAAaC,CAAc,EAAIC,GAAS,EAAK,EAC9C,CAACC,EAAUC,CAAW,EAAIF,GAAS,CAAC,CAAC,EACrC,CAACG,EAAUC,CAAW,EAAIJ,GAAS,EAAK,EACxC,CAACK,EAAcC,CAAe,EAAIN,GAAoC,IAAI,EAE1EO,IAAcnB,GAAAtB,EAAMC,CAAY,IAAlB,KAAAqB,GAAuB,KACrC,CACJ,kBAAAoB,EACA,gBAAAC,GACA,UAAAC,GACA,sBAAAC,GACA,kBAAAC,CACF,EAAIC,GAAS,EAEbC,GAAU,IAAM,CACdH,GAAsB1C,CAAe,CACvC,EAAG,CAACA,EAAiByC,EAAS,CAAC,EAE/BI,GAAU,IAAM,CACV/B,GACFA,EAAiBkB,EAAUc,EAAe,EAAGjD,EAAMC,CAAY,EAAGA,CAAY,CAElF,EAAG,CAACkC,CAAQ,CAAC,EAEb,SAASc,GAAiB,CApH5B,IAAA3B,EAsHI,MAAO,CACL,MAFWA,EAAAa,EAASnC,EAAMC,CAAY,EAAE,EAAE,IAA/B,KAAAqB,EAAoC,CAAC,EAGhD,OAAQtB,EAAMC,CAAY,EAAE,GAC5B,gBAAiBE,CACnB,CACF,CAEA,SAAS+C,GAA6BC,EAAgBC,EAA8BC,GAAa,CAC/F,IAAMC,EAAgBrD,EAAe,EAAID,EAAM,OAASA,EAAMC,EAAe,CAAC,EAAI,KAIlF,OAHII,GACFA,EAAiB8C,EAAME,GAAKC,EAAenB,EAAUc,EAAe,CAAC,EAEnE7C,EACKA,EAAc+C,EAAMlD,EAAcmD,EAAKE,CAAa,EAEtD,EACT,CAEA,SAASC,GAAWJ,EAAgBK,EAAc,CAChDpB,EAAaqB,IAAc,CACzB,IAAIC,EAAS,CAAC,EACd,OAAAA,EAAOP,EAAK,EAAE,EAAIK,EACXhC,IAAA,GACFiC,IACAC,EAEP,CAAC,CACH,CAEA,SAASC,GAAqBC,EAAmC,CAC/D,OAAIA,EAAM,aAAa,SAEnB/D,GAAA,cAACgE,GAAA,CACC,MAAOD,EAAM,aAAa,SAC1B,WAAY7D,EACZ,UAAW+D,EAAa,4BAA6B/D,CAAU,EACjE,EAGG,IACT,CAEA,IAAMgE,GAAa7C,GACjBrB,GAAA,cAACmE,GAAA,CACC,KAAMhE,EAAMC,CAAY,EACxB,YAAa+B,GAAe,CAACK,EAC7B,SAAU9B,EACV,aAAcN,EACd,WAAYF,EACZ,eAAgB,IAAYkE,EAAA,wBAE1B,GADA3B,EAAY,EAAI,EACZtB,EAAmB,CACrB,IAAMkD,GAAkB,MAAMlD,EAC5BhB,EAAMC,CAAY,EAClBA,EACAD,EAAMC,EAAe,CAAC,EACtBkC,EACAc,EAAe,CACjB,EACA,GAAIiB,KAAoB,GAAM,CAG1B1B,EADE,OAAO0B,IAAoB,SACbA,GAEA,IAFe,EAIjC5B,EAAY,EAAK,EACjB,YAEAE,EAAgB,IAAI,EAGxB,IAAM2B,EAAU3C,EAAA,GAAKyB,EAAe,GACpC,MAAMP,EAAkBpC,EAAQN,EAAMC,CAAY,EAAE,GAAIkE,CAAO,EAE7DlE,EAAe,EAAID,EAAM,QAEzB,CAACe,IAED,MAAM4B,GAAgBrC,EAAQN,EAAMC,EAAe,CAAC,EAAE,EAAE,GAE1D,IAAMmE,EAAclB,GAClBlD,EAAMC,CAAY,EAClB,UACAA,CACF,EA+BA,GA9BIA,EAAe,GAAKD,EAAM,SACxBS,GACFA,EAAW,EAETG,GACFA,EAAU,EAERJ,GAAwB4D,IACtB1D,GACFA,EAAW,EAAK,EAElBC,EAAa,EAAK,GAEpB,MAAMmC,EAAkBxC,CAAM,EAC1Be,IAEF,MAAMsB,GAAgBrC,EAAQN,EAAM,CAAC,EAAE,EAAE,EAErC,OAAO,QAAW,aAAe,OAAO,cACjB,OAAO,KAAK,OAAO,YAAY,EACvC,QAASqE,GAAQ,CAC5BA,EAAI,WAAWC,EAAoB,GACrC,OAAO,aAAa,WAAWD,CAAG,CAEtC,CAAC,IAIPxC,EAA2B7B,EAAMC,CAAY,CAAC,EAC9CqC,EAAY,EAAK,EAEf,OAAO,QAAW,aAClB,CAACvB,GACDK,GACAnB,EAAe,EAAID,EAAM,OACzB,CAEA,IAAMuE,GAAM,IAAI,IAAI,OAAO,SAAS,IAAI,EACxCA,GAAI,aAAa,IAAI,IAAKvE,EAAMC,EAAe,CAAC,EAAE,EAAE,EACpD,OAAO,QAAQ,UAAU,CAAC,EAAG,GAAIsE,GAAI,SAAS,CAAC,EAEnD,GACA,iBAAkB,IAAM,CACtBrB,GAA6BlD,EAAMC,CAAY,EAAG,YAAaA,CAAY,EAC3E6B,EAA6B9B,EAAMC,CAAY,CAAC,CAClD,EACA,OAAQ,IAAYgE,EAAA,wBACdhE,EAAe,GAAK,IACtBqC,EAAY,EAAI,EAChB,MAAMK,GAAgBrC,EAAQN,EAAMC,EAAe,CAAC,EAAE,EAAE,EACxDqC,EAAY,EAAK,EAErB,GACA,MAAOtC,EACP,oBAAqBe,EACrB,aAAcwB,EACd,SAAUF,EACZ,EAGF,OACExC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAAC2E,GAAA,CAAc,UAAWV,EAAa,gBAAiB/D,CAAU,GAChEF,GAAA,cAACJ,GAAA,CAAiB,GAAIQ,EAAc,WAAYM,IAAS,eACvDV,GAAA,cAAC4E,GAAA,CACC,IAAKhC,GAAY,GACjB,KAAMlC,EACN,UAAWuD,EAAa,cAAe/D,CAAU,GAEhDC,EAAM,IAAKmD,GAAS,CAjRjC,IAAA7B,GAkRc,IAAMoD,EAAgBnD,GAAsBD,GAAA6B,EAAK,OAAL,KAAA7B,GAAa,YAAY,EAErE,OAAImB,GAAY,KAAOU,EAAK,GACnB,KAIL,OAAOuB,GAAkB,WACpBA,EAIP7E,GAAA,cAAC6E,EAAA,CACC,IAAKvB,EAAK,GACV,SAAUA,EACV,YAAanB,EACb,eAAgBC,EAChB,WAAauB,GAAS,CACpBD,GAAWJ,EAAMK,CAAI,CACvB,EACA,WAAYzD,EACZ,mBAAoBe,EACpB,OAAQR,EACR,YAAaa,EACf,CAEJ,CAAC,EACAN,GACChB,GAAA,cAAC8E,GAAA,CACC,UAAWb,EAAa,iBAAkB/D,CAAU,EACpD,WAAYA,EACZ,UAAWC,EAAM,OACjB,YAAaC,EACf,EAED8D,EACH,CACF,EACCxD,GAAQ,eAAiBV,GAAA,cAAC8D,GAAA,CAAqB,aAAc3D,EAAMC,CAAY,EAAG,CACrF,CACF,CAEJ,EC5TA,OAAO2E,OAAW,QAElB,OAAS,qBAAAC,OAAyB,oBAGlC,IAAMC,GAAuBC;AAAA,EAC1BC,GACDA,EAAM,aACH,IAAI,CAAC,CAACC,EAAKC,CAAK,IACR,IAAIC,KAA2BF,KAAOE,KAA2BF,OAAS,OAAO,QACtFC,CACF,EACG,IAAI,CAAC,CAACD,EAAKC,CAAK,IACX,OAAOA,GAAU,SAEZ,GAAGD,OAAS,OAAO,QAAQC,CAAK,EACpC,IAAI,CAAC,CAACE,EAAWC,CAAW,IAGpB,GAFQC,GAAWF,CAAS,MAEZC,IACxB,EACA,KAAK,GAAG,MAKN,GAFQC,GAAWL,CAAG,MAENC,IACxB,EACA,KAAK,GAAG,KACZ,EACA,KAAK,GAAG,IAEN,SAASK,GAAmB,CAAE,WAAAC,CAAW,EAAgC,CAC9E,GAAI,CAACA,GAAc,CAACA,EAAW,eAC7B,OAAOC,GAAA,cAAAA,GAAA,aAAE,EAEX,IAAMC,EAAe,OAAO,QAAQF,EAAW,cAAc,EAAE,OAAO,CAAC,CAACG,EAAGT,CAAK,IACvE,OAAOA,GAAU,QACzB,EAED,OAAIQ,EAAa,SAAW,EACnBD,GAAA,cAAAA,GAAA,aAAE,EAGJA,GAAA,cAACX,GAAA,CAAqB,aAAcY,EAAc,CAC3D,CC7CA,OAAS,aAAAE,GAAW,YAAAC,OAAgB,QAI7B,SAASC,GAAmBC,EAAgBC,EAAmB,GAAM,CAC1E,GAAM,CAACC,EAAsBC,CAAuB,EAAIC,GAAS,EAAK,EAChE,CACJ,gBAAAC,EACA,UAAAC,EACA,cAAAC,EACA,aAAAC,EACA,oBAAAC,EACA,6BAAAC,EACA,QAAAC,CACF,EAAIC,GAAS,EACPC,EAAQL,EAAaR,CAAM,EAEjC,SAAec,GAA0B,QAAAC,EAAA,sBAErC,CAACb,GACD,CAACI,GACDC,EAAcP,CAAM,IAAMgB,IAC1BN,EAA6BC,EAAQX,CAAM,CAAC,IAAM,IAClDC,GACAY,GACAA,EAAM,OAAS,IAEfV,EAAwB,EAAI,EAC5B,MAAME,EAAgBL,EAAQa,EAAMJ,EAAoBT,CAAM,CAAC,EAAE,EAAE,EAEvE,GAEA,OAAAiB,GAAU,IAAM,CACdH,EAAwB,CAC1B,EAAG,CAACR,EAAWN,EAAQC,CAAO,CAAC,EAExB,CAAC,CACV,CvCwFO,IAAMiB,GAAoC,CAAC,CAChD,OAAAC,EACA,gBAAAC,EAAkB,CAAC,EACnB,KAAAC,EAAO,SACP,QAAAC,EACA,WAAAC,EACA,gBAAAC,EACA,mBAAAC,EACA,WAAAC,EACA,WAAAC,EACA,qBAAAC,EAAuB,GACvB,iBAAAC,EACA,cAAAC,EACA,YAAAC,EAAc,GACd,iBAAAC,EAAmB,GACnB,cAAAC,EAAgB,SAChB,WAAAC,EAAa,GACb,UAAAC,EACA,eAAAC,EAAiB,GACjB,oBAAAC,EAAsB,GACtB,kBAAAC,EACA,oBAAAC,EAAsB,GACtB,iBAAAC,EACA,WAAAC,EAAa,GACb,YAAAC,EAAc,CAAC,EACf,sBAAAC,EAAwB,EAC1B,IAAM,CACJ,GAAM,CACJ,QAAAC,EACA,aAAAC,EACA,UAAAC,EACA,6BAAAC,EACA,cAAAC,EACA,oBAAAC,EACA,kBAAAC,EACA,mBAAAC,EACA,gBAAAC,CACF,EAAIC,GAAS,EACPC,EAAeL,EAAoB9B,CAAM,EACzC,CAAE,2BAAAoC,EAA2B,EAAIC,GAAS,EAC1C,CAACC,EAA0BC,EAA2B,EAAIC,GAAS,IAAI,EACvE,CAAE,iBAAAC,GAAkB,iBAAAC,GAAkB,cAAAC,CAAc,EAAIC,GAAa,EAC3EC,GAAmB7C,EAAQG,CAAO,EAClC,IAAM2C,EAAQpB,EAAa1B,CAAM,EAEjCQ,EAAa4B,GAA2B5B,CAAU,EAElD,GAAM,CAACuC,GAAWC,EAAY,EAC5B7C,IAAY,QAAaC,IAAe,OACpC,CAACD,EAASC,CAAU,EACpB,CAACsC,GAAiB1C,EAAQ,EAAI,EAAIiD,GAAUR,GAAiBzC,EAAQiD,CAAK,CAAC,EAE3EC,GAAO,OAAO,QAAW,YAAc,OAAO,SAAS,KAAO,KAqCpE,GApCAC,GAAU,IAAM,CAlLlB,IAAAC,EAmLI,GAAIN,GAASA,EAAM,OAAS,GAAK5B,EAAqB,CACpD,IAAMmC,EACJ,OAAO,QAAW,eAAeD,EAAA,2BAAQ,WAAR,MAAAA,EAAkB,MAC/C,OAAO,SAAS,KAAK,QAAQ,IAAK,EAAE,EACpC,GACN,GAAIN,IAASA,GAAA,YAAAA,EAAO,QAAS,EAAG,CAC9B,IAAIQ,GAAe,GACnB,GAAID,EAAgB,CAClB,IAAME,EAAeF,EACrBC,GAAeR,EAAM,UAAWU,GAASA,EAAK,KAAOD,CAAY,EAC7DjB,IAA6Be,IAC/BC,GAAe,IAGfA,KAAiB,KACnBf,GAA4Bc,CAAc,EAC1CpB,EAAgBjC,EAAQ8C,EAAMQ,EAAY,EAAE,EAAE,IAItD,EAAG,CAACJ,EAAI,CAAC,EAETC,GAAU,IAAM,CAEZ,CAACxB,GACDmB,GACAA,EAAM,QACN,OAAO,QAAW,aAClB5B,IAEAqB,GAA4BO,EAAMX,CAAY,EAAE,EAAE,EAClD,OAAO,SAAS,KAAOW,EAAMX,CAAY,EAAE,GAE/C,EAAG,CAACR,EAAWQ,EAAcW,CAAK,CAAC,EAE/BnB,EACF,OAAO,KAET,IAAM8B,GAAOhC,EAAQzB,CAAM,EAqB3B,GApBI,CAACyD,IAID7B,EAA6B6B,EAAI,GAIjC,CAACX,GAID3C,IAAY,QAAaA,IAAY,IAIrC0B,EAAc7B,CAAM,IAAM0D,IAAkBjD,GAAwB,CAACM,IAIpEb,GAAQ,SAAWA,GAAQ,iBAAmByC,EAAc3C,CAAM,EACrE,OAAO,KAGT,IAAM2D,GAAc,IAAM,CACxBX,GAAa,EAAK,EACdhC,GACFA,EAAU,EAERH,IAAqB,IACvBkB,EAAkB/B,CAAM,CAE5B,EAEA,GAAKc,GAAiB,UAAYZ,IAAS,SAAYA,IAAS,cAAe,CAC7E,IAAM0D,EAA+B,CACnC,QAAS,MACX,EACA,OAAI1D,IAAS,eACX0D,EAAc,MAAQ,MACtBA,EAAc,OAAS,MACvBA,EAAc,UAAY,QAC1BA,EAAc,UAAY,QAC1BA,EAAc,QAAU,KAExBA,EAAc,MAAQ,QAGtBC,GAAA,cAACC,GAAA,CACC,WAAYtD,EACZ,QAASmD,GACT,QAASZ,GACT,MAAOa,EACP,YAAahD,EACb,oBAAqBQ,GAErByC,GAAA,cAACE,GAAA,CAAmB,WAAYvD,EAAY,EAC5CqD,GAAA,cAACG,GAAA,CACC,WAAYxD,EACZ,MAAOsC,EACP,aAAcX,EACd,gBAAiBlC,EACjB,gBAAiBI,EACjB,cAAeM,EACf,iBAAkBD,EAClB,OAAQV,EACR,KAAME,EACN,qBAAsBO,EACtB,WAAYF,EACZ,WAAYH,EACZ,aAAc4C,GACd,UAAWhC,EACX,eAAgBC,EAChB,mBAAoBX,EACpB,oBAAqBY,EACrB,kBAAmBC,EACnB,iBAAkBE,EAClB,WAAYC,EACZ,YAAaC,EACb,sBAAuBC,EACvB,WAAYT,EACd,CACF,EAIJ,OAAIb,IAAS,SAAWY,IAAkB,SAEtC+C,GAAA,cAACI,GAAA,CACC,WAAYzD,EACZ,QAASmD,GACT,QAASZ,GACT,cAAejC,GAEf+C,GAAA,cAACE,GAAA,CAAmB,WAAYvD,EAAY,EAC5CqD,GAAA,cAACG,GAAA,CACC,WAAYxD,EACZ,MAAOsC,EACP,aAAcX,EACd,gBAAiBlC,EACjB,gBAAiBI,EACjB,cAAeM,EACf,iBAAkBD,EAClB,OAAQV,EACR,KAAME,EACN,qBAAsBO,EACtB,WAAYF,EACZ,WAAYH,EACZ,aAAc4C,GACd,UAAWhC,EACX,eAAgBC,EAChB,mBAAoBX,EACpB,oBAAqBY,EACrB,kBAAmBC,EACnB,iBAAkBE,EAClB,WAAYC,EACZ,YAAaC,EACb,sBAAuBC,EACvB,WAAYT,EACd,CACF,EAKF8C,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACE,GAAA,CAAmB,WAAYvD,EAAY,EAC5CqD,GAAA,cAACG,GAAA,CACC,WAAYxD,EACZ,MAAOsC,EACP,aAAcX,EACd,gBAAiBlC,EACjB,gBAAiBI,EACjB,cAAeM,EACf,iBAAkBD,EAClB,OAAQV,EACR,KAAME,EACN,qBAAsBO,EACtB,WAAYF,EACZ,WAAYH,EACZ,aAAc4C,GACd,UAAWhC,EACX,eAAgBC,EAChB,mBAAoBX,EACpB,oBAAqBY,EACrB,kBAAmBC,EACnB,iBAAkBE,EAClB,WAAYC,EACZ,YAAaC,EACb,sBAAuBC,EACvB,WAAYT,EACd,CACF,CAEJ,EAEOmD,GAAQnE,GwCtXf,OAAgB,eAAAoE,GAAa,cAAAC,GAAY,aAAAC,OAAiB,QAmBnD,SAASC,IAYd,CACA,GAAM,CACJ,eAAgBC,EAChB,OAAAC,EACA,kBAAAC,CACF,EAAIC,GAAWC,EAAc,EACvB,CAAE,oBAAAC,CAAoB,EAAIC,GAAkB,EAC5C,CAAE,OAAAC,EAAQ,OAAAC,CAAO,EAAIC,GAAU,EAC/BC,EAAkBC,GAAiB,EACnC,CAAE,mBAAAC,CAAmB,EAAIC,GAAwB,EAEvD,SAASC,EAAgBC,EAAcC,EAAc,CACnD,MAAO,iCAAiCD,KAAOC,GACjD,CAEAC,GAAU,IAAM,CAGd,GAAIhB,GAAUD,EAAwB,CAEpC,GAAIC,EAAO,WAAWiB,EAAY,EAChC,OAEF,IAAMC,EAAoBL,EAAgBb,EAAQD,CAAsB,EAEnE,aAAa,QAAQmB,CAAiB,IAEzCT,EAAgB,GAAGF,cAAoBY,EAAAC,EAAA,GAClCd,GADkC,CAErC,OAAQ,OACR,KAAM,KAAK,UAAU,CACnB,cAAeN,EACf,mBAAoBD,CACtB,CAAC,CACH,EAAC,EAED,aAAa,QAAQmB,EAAmB,MAAM,GAGpD,EAAG,CAAClB,EAAQD,CAAsB,CAAC,EAEnC,IAAMsB,EAA8BC,GAC3BC,GAAiCC,EAAA,sBACtC,GAAI,CAACb,EAAmB,EACtB,OAEF,GAAI,CAACZ,GAA0B,CAACC,EAAQ,CACtC,QAAQ,MACN,uFACA,CAAE,uBAAAD,EAAwB,OAAAC,CAAO,CACnC,EACA,OAGF,IAAMyB,EAAqC,CACzC,cAAezB,EACf,mBAAoBD,EACpB,WAAAwB,CACF,EACA,MAAMd,EAAgB,GAAGF,cAAoBY,EAAAC,EAAA,GACxCd,GADwC,CAE3C,OAAQ,OACR,KAAM,KAAK,UAAUmB,CAAI,CAC3B,EAAC,EACDrB,EAAoB,CACtB,GACA,CAACL,EAAwBC,EAAQM,EAAQF,CAAmB,CAC9D,EAEMsB,EAA4BJ,GAChC,CAAOK,EAAeJ,IAAkCC,EAAA,sBACtD,GAAI,CAACb,EAAmB,EACtB,OAEF,GAAI,CAACZ,GAA0B,CAACC,EAAQ,CACtC,QAAQ,MACN,qFACA,CAAE,uBAAAD,EAAwB,OAAAC,CAAO,CACnC,EACA,OAMF,IAAMyB,EAAqC,CACzC,cAAezB,EACf,mBAAoBD,EACpB,OAAQ,CAP2B,CACnC,MAAA4B,EACA,WAAAJ,CACF,CAIoB,CACpB,EACA,MAAMd,EAAgB,GAAGF,cAAoBY,EAAAC,EAAA,GACxCd,GADwC,CAE3C,OAAQ,OACR,KAAM,KAAK,UAAUmB,CAAI,CAC3B,EAAC,EACDrB,EAAoB,CACtB,GACA,CAACL,EAAwBC,EAAQM,EAAQF,CAAmB,CAC9D,EAEMwB,EAAkCN,GACtC,CAAOO,EAAwBN,IAAkCC,EAAA,sBAC/D,GAAKb,EAAmB,EAGxB,GAAIY,EAAY,CACd,IAAML,EAAoBL,EAAgBb,EAAQ6B,CAAc,EAChE,aAAa,QAAQX,EAAmB,MAAM,EAC9CjB,EAAkB4B,CAAc,EAChC,IAAMJ,EAAqC,CACzC,cAAezB,EACf,mBAAoB6B,EACpB,WAAAN,CACF,EACA,MAAMd,EAAgB,GAAGF,cAAoBY,EAAAC,EAAA,GACxCd,GADwC,CAE3C,OAAQ,OACR,KAAM,KAAK,UAAUmB,CAAI,CAC3B,EAAC,EACDrB,EAAoB,OAEpBH,EAAkB4B,CAAc,CAEpC,GACA,CAAC7B,EAAQM,EAAQF,CAAmB,CACtC,EAEA,MAAO,CACL,eAAgBL,EAChB,kBAAAE,EACA,gCAAA2B,EACA,4BAAAP,EACA,0BAAAK,CACF,CACF,CnDxJO,IAAMI,GAAmB,+BACnBC,GAAkB,0BAElBC,GAAoC,CAAC,CAAC,IAAM,CACvD,GAAM,CAAE,iBAAAC,CAAiB,EAAIC,GAAiB,EACxC,CAAE,mBAAAC,EAAoB,2BAAAC,EAA4B,oBAAAC,CAAoB,EAC1EC,GAAkB,EACd,CAAE,OAAAC,EAAQ,UAAAC,CAAU,EAAIC,GAAQ,EAChC,CAACC,EAAYC,CAAa,EAAIC,GAAwBL,CAAM,EAC5D,CAAE,cAAAM,CAAc,EAAIC,GAAS,EAC7B,CAAE,MAAAC,EAAO,eAAAC,EAAgB,kBAAAC,EAAmB,cAAAC,CAAc,EAAIC,GAAWC,EAAc,EACvF,CAACC,EAA2BC,CAA4B,EAAIV,GAAiB,CAAC,CAAC,EAE/E,CAACW,EAAgBC,CAAiB,EAAIZ,GAAmB,CAAC,CAAC,EAC3D,CAAE,eAAAa,CAAe,EAAIC,GAAgB,EACrC,CAACC,EAAoBC,CAAqB,EAAIhB,GAAwBa,CAAc,EACpF,CAACI,EAAwBC,CAAyB,EAAIlB,GAAS,EAAK,EAE1EmB,GAAU,IAAM,CACd,GAAI,CAAC3B,GACCD,EACF,QAAS6B,EAAI,EAAGA,EAAI7B,EAAmB,OAAQ6B,IAAK,CAClD,IAAMC,EAAY9B,EAAmB6B,CAAC,EAChCE,EAAOnB,EAAM,KAAMmB,GAASA,EAAK,QAASD,GAAA,YAAAA,EAAW,OAAM,EACjE,GACEC,GACAD,GACAA,EAAU,gBAAkB,IAC5BC,EAAK,cACLA,EAAK,2BACL,CAACX,EAAe,SAASW,EAAK,IAAI,EAClC,CAGA,WAAW,IAAM,CACfC,EAAYF,EAAU,MAAM,CAC9B,EAAG,GAAG,EAGN,OAKV,EAAG,CAAC7B,EAA4BD,CAAkB,CAAC,EAEnD4B,GAAU,IAAM,CACVb,EAAc,OAAS,GACzBb,EAAoB,CAExB,EAAG,CAACa,CAAa,CAAC,EAElBa,GAAU,IAAM,CACTF,IACHC,EAA0B,EAAI,EAC9BzB,EAAoB,EAExB,EAAG,CAACD,EAA4B0B,CAAyB,CAAC,EAE1D,SAASK,EAAYC,EAAgB,CACnC,IAAMF,EAAOnB,EAAM,KAAMmB,GAASA,EAAK,OAASE,CAAM,EAClDF,GAAQA,EAAK,2BAAyC,CAACX,EAAe,SAASW,EAAK,IAAI,IAE1FV,EAAkB,CAAC,GAAGD,EAAgBW,EAAK,IAAI,CAAC,EAChDZ,EAA6B,CAACY,CAAI,CAAC,EAEvC,CAEA,SAASG,GAAsB,CAE7B,GAAI,CAAC9B,EAAQ,CAEX,IAAM+B,EAAa,aAAa,QAAQvC,EAAe,EACvD,GAAIuC,EAAY,CACd9B,EAAU8B,CAAU,EACpB,OAIF,IAAMC,EAAc,aAAa,QAAQzC,EAAgB,EACzD,GAAIyC,EAAa,CACf/B,EAAU+B,CAAW,EACrB,OAIFtB,EAAkB,EAAI,EACtB,IAAMuB,EAAiBC,GAAeC,GAAO,EAC7C,GAAI,CACF,aAAa,QAAQ5C,GAAkB0C,CAAc,CACvD,OAASG,EAAP,CACA,QAAQ,IAAI,kEAAmEA,CAAC,CAClF,CACAnC,EAAWD,GAAYA,GAAkBiC,CAAe,EAE5D,CAEAT,GAAU,IAAM,CACd,GAAI,CAEF,GAAIhB,EAAO,CACT,IAAM6B,EAA4B,CAAC,EACnC7B,EAAM,QAASmB,GAAS,CACtB,GAAIA,EAAK,KAAM,CAEb,IAAMW,EAAYX,EAAK,KAAK,MAAM,qBAAqB,EACnDW,GACFA,EAAU,QAASC,GAAa,CAE9B,IAAMC,EAAMD,EAAS,QAAQ,eAAgB,EAAE,EAAE,QAAQ,IAAK,EAAE,EAEhE,GAAIF,EAAgB,SAASG,CAAG,EAC9B,OAGF,IAAMC,EAAM,IAAI,MAChBA,EAAI,IAAMD,EACVH,EAAgB,KAAKG,CAAG,CAC1B,CAAC,EAGP,CAAC,EAEL,OAASJ,EAAP,CAAW,CACf,EAAG,CAAC5B,CAAK,CAAC,EAEVgB,GAAU,IAAM,CASd,GARIxB,IAAWG,IAEbT,EAAiB,CAAC,CAAC,EACnBI,EAAoB,GAGtBM,EAAcJ,CAAM,EAEhBA,GAAU,CAACA,EAAO,WAAWkC,EAAY,EAC3C,GAAI,CACF,aAAa,QAAQ1C,GAAiBQ,CAAM,CAC9C,OAASoC,EAAP,CACA,QAAQ,IAAI,0DAA2DA,CAAC,CAC1E,CAGEpC,IAAW,MACb,WAAW,IAAM,CACXA,IAAW,MACb8B,EAAoB,CAExB,EAAG,EAAE,CAET,EAAG,CAAC9B,EAAQQ,EAAOC,CAAc,CAAC,EAElCe,GAAU,IAAM,CACVN,GAAkBE,IACpBC,EAAsBH,CAAc,EACpCxB,EAAiB,CAAC,CAAC,EACnBI,EAAoB,EAExB,EAAG,CAACoB,EAAgBE,EAAoBC,CAAqB,CAAC,EAE9D,SAASqB,GAA4B,CACnC,OACEC,GAAA,cAAAA,GAAA,cACG7B,EAA0B,IAAKa,GAC1BrB,EAAcqB,EAAK,IAAI,IAAMiB,GACxB,KAIPD,GAAA,cAAC,QAAK,IAAKhB,EAAK,MACdgB,GAAA,cAACE,GAAA,CACC,OAAQlB,EAAK,KACb,KAAM,QACN,cAAe,SACf,iBAAkB,GACpB,CACF,CAEH,CACH,CAEJ,CAEA,OACEgB,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACD,EAAA,IAA0B,CAC7B,CAEJ,EoDvMA,IAAMI,GAAY,CAEhB,aAAc,4BACd,UAAW,4BACX,gBAAiB,4BACjB,yBAA0B,8BAC1B,6BAA8B,4BAC9B,mBAAoB,8BACpB,kBAAmB,iBACnB,YAAa,iBACb,eAAgB,6BAChB,aAAc,UAChB,EAGA,SAASC,GAAcC,EAAO,CAC5B,GAAI,CAACA,EAAO,OAEZ,IAAMC,EAAY,CAAC,EAEnB,cAAO,QAAQD,CAAK,EAAE,QAAQ,CAAC,CAACE,EAAKC,CAAK,IAAM,CAC9C,GAAIL,GAAUI,CAAG,EAAG,CAElB,IAAME,EAASN,GAAUI,CAAG,EAAE,MAAM,GAAG,EAGnCG,EAAeJ,EACnBG,EAAO,QAAQ,CAACE,EAAWC,IAAM,CAC1BF,EAAaC,CAAS,IACzBD,EAAaC,CAAS,EAAIC,IAAMH,EAAO,OAAS,EAAID,EAAQ,CAAC,GAG/DE,EAAeA,EAAaC,CAAS,CACvC,CAAC,EAEL,CAAC,EAEML,CACT,CAEA,SAASO,GAAoBC,EAAgB,CAG3C,GAAI,CAACA,EAAgB,OAGrB,IAAMC,EAAkBC,GAAU,CAAC,EAAGF,CAAc,EAE9CG,EAAM,CAAC,EAEb,cAAO,KAAKF,CAAe,EAAE,QAASG,GAAgB,CACpD,IAAMC,EAAc,OAAOD,IAE3BD,EAAIE,CAAW,EAAIJ,EAAgBG,CAAW,CAChD,CAAC,EAEMD,CACT,CAEO,SAASG,GAAsBC,EAAY,CAChD,GAAM,CAAE,MAAAhB,EAAO,eAAAS,CAAe,EAAIO,EAE5Bf,EAAYF,GAAcC,CAAK,EAC/BY,EAAMJ,GAAoBC,CAAc,EAE9C,MAAO,CACL,UAAAR,EACA,IAAAW,CACF,CACF,CCvEA,OAAOK,OAAY,oBACnB,OAAS,WAAAC,GAAS,WAAAC,OAAe,gBCDjC,OAAOC,OAAgF,QACvF,OAAOC,IAAU,iBAAAC,GAAe,YAAAC,OAAgB,oBAChD,OACE,UAAAC,GAEA,SAAAC,GAEA,WAAAC,GACA,OAAAC,GAEA,UAAAC,GAEA,SAAAC,GAEA,UAAAC,GACA,cAAAC,OAEK,gBAOP,IAAMC,GAAoB,CACxB,MAAO,CACL,SAAU,QACV,MAAO,QACP,UAAW,CAACC,EAAGC,IACbC,GAAID,EAAOD,EAAG,EAAE,OAAOA,GAAM,UAAY,CAAC,MAAMA,CAAC,IAAMA,EAAI,EAAIA,EAAIA,EAAI,IAAM,GAAG,CACpF,EACA,OAAQ,CACN,SAAU,SACV,MAAO,OACT,EACA,SAAU,CACR,SAAU,WACV,MAAO,OACT,EACA,UAAW,CACT,SAAU,YACV,MAAO,OACT,EACA,SAAU,CACR,SAAU,WACV,MAAO,OACT,EACA,UAAW,CACT,SAAU,YACV,MAAO,OACT,EACA,SAAU,GACV,UAAW,GACX,UAAW,GACX,QAAS,GACT,cAAe,EACjB,EAeMG,GAAYC,GAAO,KAAK,EAC5B,CAAC,CAAE,IAAAC,CAAI,IAAMA,EACbC,GAAQC,GAAQC,GAAOC,GAAQC,GAAOC,GAAYC,GAAOb,EAAiB,CAAC,CAC7E,EAEac,GAA4CC,GAKtC,CALsC,IAAAC,EAAAD,EACvD,IAAAE,EACA,SAAAC,EACA,UAAAC,CA/EF,EA4EyDH,EAIpDI,EAAAC,GAJoDL,EAIpD,CAHH,KACA,WACA,cAGA,IAAMM,EAAQC,GAAS,EAEjBC,EAAkB,CACtB,OAAQ,OACR,UAAW,aACX,EAAG,EACH,EAAG,CACL,EAEMC,EAAY,IAChBC,GAAA,cAACtB,GAAAuB,IAAA,CAAU,GAAIV,GAAQO,GAAqBJ,GACzCF,CACH,EAGF,GAAIC,IAAc,OAAW,CAC3B,IAAMS,EAAWC,GAAUP,EAAOH,CAAS,EAE3C,OAAOO,GAAA,cAACI,GAAA,CAAc,MAAOF,GAAWH,EAAU,CAAE,EAGtD,OAAOA,EAAU,CACnB,EDnGO,IAAMM,GAAiB,CAC5B,QAAS,CACP,gBAAiB,qBACjB,MAAO,qBAEP,UAAW,CACT,gBAAiB,SACnB,CACF,EACA,UAAW,CACT,gBAAiB,QACjB,OAAQ,YACR,YAAa,UACb,MAAO,qBAEP,UAAW,CACT,gBAAiB,SACnB,CACF,EACA,KAAM,CACJ,gBAAiB,cACjB,MAAO,kBACT,EACA,MAAO,CACL,gBAAiB,cACjB,MAAO,oBACT,CACF,EAEaC,GAAc,CACzB,GAAI,CACF,SAAU,EACV,SAAU,CACZ,EACA,GAAI,CACF,SAAU,EACV,SAAU,CACZ,CACF,EAEaC,GAAeC,GAAOC,EAAG,EACpC,KAAO,CACL,WAAY,QACd,GACAC,GACEC,GAAQ,CACN,MAAO,oBACP,SAAU,mBACZ,CAAC,EACDA,GAAQ,CACN,KAAM,OACN,SAAUL,EACZ,CAAC,CACH,CACF,EE3DA,OAAOM,OAAY,oBACnB,OAAS,WAAAC,GAAS,UAAAC,OAAc,gBAIzB,IAAMC,GAAe,CAC1B,SAAU,CACR,SAAU,MACV,WAAY,OACZ,cAAe,KACf,WAAY,KACd,EACA,SAAU,CACR,SAAU,MACV,WAAY,OACZ,cAAe,KACf,WAAY,KACd,EACA,GAAI,CACF,SAAU,MACV,WAAY,OACZ,cAAe,KACf,WAAY,KACd,EACA,GAAI,CACF,SAAU,MACV,WAAY,OACZ,cAAe,KACf,WAAY,IACd,EACA,GAAI,CACF,SAAU,KACV,WAAY,OACZ,cAAe,KACf,WAAY,IACd,EACA,GAAI,CACF,SAAU,KACV,WAAY,OACZ,cAAe,KACf,WAAY,IACd,EACA,MAAO,CACL,SAAU,KACV,WAAY,UACZ,cAAe,KACf,WAAY,IACd,EACA,MAAO,CACL,SAAU,KACV,WAAY,UACZ,cAAe,KACf,WAAY,IACd,EACA,QAAS,CACP,SAAU,KACV,WAAY,UACZ,cAAe,KACf,WAAY,IACd,CACF,EAQO,IAAMC,GAAaC,GAAOC,EAAG,EAClCC,GAAQ,CACN,MAAO,kBACP,SAAU,iBACZ,CAAC,EACDC,GAAO,CACL,WAAY,CACV,SAAU,aACV,MAAO,aACT,CACF,CAAC,CACH,EC5EA,IAAMC,GAAc,EACdC,GAAa,KACbC,GAAqB,GAGrBC,GAAa,OAAO,YACxB,MAAM,KAAK,MAAMD,GAAqB,CAAC,EAAG,CAACE,EAAGC,IAExCA,IAAM,EACD,CAAC,GAAK,GAAG,GAAML,KAAcC,IAAY,EAG3C,CAACI,EAAG,GAAGA,EAAIL,KAAcC,IAAY,CAC7C,CACH,EAEMK,GAAU,CACd,MAAO,UACP,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,MAAO,UACP,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,SAAU,UACV,SAAU,UACV,SAAU,UACV,YAAa,YAGb,OAAQ,SACV,EAEaC,GAAS,CACpB,OAAQC,EAAAC,EAAA,GACHH,IADG,CAGN,QAAS,CACP,WAAYA,GAAQ,OACtB,EACA,QAAS,CACP,WAAYA,GAAQ,QACpB,WAAYA,GAAQ,MACpB,SAAUA,GAAQ,OACpB,EACA,SAAU,CACR,WAAYA,GAAQ,MACtB,CACF,GACA,MAAO,CACL,QAAS,gCACX,EACA,UAAW,CACT,GAAI,OACJ,GAAI,OACJ,GAAI,OACJ,GAAI,OACJ,GAAI,OACJ,MAAO,OACP,MAAO,OACP,MAAO,OACP,MAAO,MACT,EACA,YAAa,CACX,QAAS,IACT,SAAU,IACV,KAAM,GACR,EACA,eAAgB,CACd,GAAI,QACN,EACA,YAAa,CACX,GAAI,OACJ,GAAI,OACJ,GAAI,OACJ,GAAI,OACJ,GAAI,OACJ,MAAO,OACP,MAAO,OACP,MAAO,MACT,EACA,MAAO,CACL,GAAI,MACJ,GAAI,OACJ,MAAO,KACT,EACA,QAAS,CACP,GAAI,kCACN,EACA,MAAOH,GACP,WAAY,CACV,OAAQO,GACR,KAAMC,EACR,CACF,EzDzCA,IAAMC,GAAkB,0BACXC,GAAiBC,GAA+B,CAC3D,aAAc,GACd,UAAW,IAAM,CAAC,EAClB,MAAO,CAAC,EACR,SAAU,IAAM,CAAC,EACjB,oBAAqB,CAAC,EACtB,uBAAwB,IAAM,CAAC,EAC/B,cAAe,CAAC,EAChB,iBAAkB,IAAM,CAAC,EACzB,eAAgB,CAAC,EACjB,kBAAmB,IAAM,CAAC,EAC1B,eAAgB,CAAC,EACjB,kBAAmB,IAAM,CAAC,EAC1B,sCAAuC,CAAC,EACxC,yCAA0C,IAAM,CAAC,EACjD,gBAAiB,CAAC,EAClB,mBAAoB,IAAM,CAAC,EAC3B,eAAgB,GAChB,kBAAmB,IAAM,CAAC,EAC1B,sBAAuB,GACvB,yBAA0B,IAAM,CAAC,EACjC,eAAgB,GAChB,kBAAmB,IAAM,CAAC,EAC1B,SAAU,IAAM,CAAC,EACjB,kBAAmBC,GACnB,wBAAyB,GACzB,2BAA4B,IAAM,CAAC,EACnC,OAAQH,GACR,SAAU,GACV,MAAO,EACT,CAAC,EAoCD,SAASI,IAAoB,CAC3B,OAAO,KAAK,YAAY,EAAE,QAASC,GAAQ,CACrCA,EAAI,WAAW,UAAU,GAC3B,aAAa,WAAWA,CAAG,CAE/B,CAAC,CACH,CAEO,IAAMC,GAA4C,CAAC,CACxD,aAAAC,EACA,OAAAC,EACA,eAAAC,EACA,OAAAC,EACA,SAAAC,CACF,IAAM,CAjJN,IAAAC,GAAAC,EAAAC,GAAAC,GAAAC,GAAAC,EAkJE,IAAMC,EAAU,OAAO,QAAW,YAAc,aAAa,QAAQC,EAAgB,EAAI,KACnF,CAACC,EAAaC,CAAc,EAAIC,GAAyBd,GAASU,CAAgB,EAClF,CAACK,EAAqBC,CAAsB,EAAIF,GACnDb,GAAiB,IACpB,EACM,CAACgB,EAAOC,CAAQ,EAAIJ,GAAiB,CAAC,CAAC,EACvC,CAACK,EAAqBC,CAAsB,EAAIN,GAAyB,CAAC,CAAC,EAC3E,CAACO,EAAeC,CAAgB,EAAIR,GAAyB,CAAC,CAAC,EAC/D,CAACS,EAAgBC,CAAiB,EAAIV,GAEzC,CAAC,CAAC,EACC,CAACW,EAAgBC,CAAiB,EAAIZ,GAAqC,CAAC,CAAC,EAC7E,CAACa,EAAuCC,CAAwC,EACpFd,GAAmB,CAAC,CAAC,EACjB,CAACe,EAAiBC,CAAkB,EAAIhB,GAE3C,CAAC,CAAC,EACC,CAACiB,EAAgBC,CAAiB,EAAIlB,GAAS,EAAK,EACpD,CAACmB,EAAuBC,CAAwB,EAAIpB,GAAS,EAAK,EAClE,CAACqB,EAAyBC,CAA0B,EAAItB,GAC5D,CAACuB,EAActC,CAAY,CAC7B,EACMuC,EAAmB,CAACC,EAAaC,KAAmB,CACxD,GAAIA,KAAW,SAAU,CACvB,OAAO,KAAKD,EAAK,QAAQ,EACzB,OAEF,WAAW,IAAM,CACf,OAAO,SAAS,KAAOA,CACzB,EAAG,EAAE,CACP,EAEME,EAAyB,CAC7B,MAAOC,IAAA,GAAK/C,GAAkB,QAAWU,GAAAD,GAAAF,GAAA,YAAAA,EAAQ,oBAAR,YAAAE,GAA2B,QAA3B,KAAAC,EAAoC,CAAC,GAC9E,eAAgBqC,IAAA,GACX/C,GAAkB,iBACjBY,IAAAD,GAAAJ,GAAA,YAAAA,EAAQ,oBAAR,YAAAI,GAA2B,iBAA3B,KAAAC,GAA6C,CAAC,EAEtD,EAEA,SAAS8B,EAAcM,EAAyB,CAC9C,MAAO,GAAQA,GAAUA,EAAO,OAAS,IAAMA,EAAO,UAAU,EAAG,EAAE,IAAM,aAC7E,CAEAC,GAAU,IAAM,CACV5C,GACFa,EAAeb,CAAM,CAEzB,EAAG,CAACA,CAAM,CAAC,EAEX4C,GAAU,IAAM,CACVhC,GAEA,OAAO,QAAW,aAClB,OAAO,cACP,OAAO,aAAa,QAAQiC,EAAe,GAEvC,OAAO,aAAa,QAAQA,EAAe,IAAMjC,GACnDhB,GAAkB,CAI1B,EAAG,CAACgB,CAAW,CAAC,EAEhBgC,GAAU,IAAM,CACV3C,GACFe,EAAuBf,CAAc,CAEzC,EAAG,CAACA,CAAc,CAAC,EAEnB2C,GAAU,IAAM,CACd,GAAKP,EAActC,CAAY,EAO7BqC,EAA2B,EAAK,MAPA,CAChC,QAAQ,MACN,gFACF,EACAA,EAA2B,EAAI,EAC/B,OAIJ,EAAG,CAACrC,EAAcqC,CAA0B,CAAC,EAE7C,IAAMU,EAAgB,CACpB,aAAA/C,EACA,OAAQa,EACR,UAAWC,EACX,SAAAK,EACA,MAAOD,EACP,oBAAAE,EACA,uBAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,eAAAC,EACA,kBAAAC,EACA,eAAAC,EACA,kBAAAC,EACA,sCAAAC,EACA,yCAAAC,EACA,gBAAAC,EACA,mBAAAC,EACA,eAAAC,EACA,kBAAAC,EACA,sBAAAC,EACA,yBAAAC,EACA,eAAgBnB,EAChB,kBAAmBC,EACnB,SAAUd,GAAUA,EAAO,SAAWA,EAAO,SAAWoC,EACxD,kBAAmBG,EACnB,wBAAAN,EACA,2BAAAC,EACA,OAAQlC,GAAUA,EAAO,OAASA,EAAO,OAASV,GAClD,SAAUU,GAAUA,EAAO,SAAWA,EAAO,SAAW,GACxD,MAAOA,GAAUA,EAAO,MAAQA,EAAO,MAAQ,GAC/C,kBAAmBA,GAAUA,EAAO,aAAeA,EAAO,aAAe,MAC3E,EAGM,CAAE,UAAA6C,CAAU,EAAIC,GAAsBP,CAAU,EAEtD,OAAIN,EAEAc,GAAA,cAACxD,GAAe,SAAf,CAAwB,MAAOqD,GAC9BG,GAAA,cAACC,GAAA,CACC,MAAOC,GAAUV,EAAW,MAAOW,GAAQL,GAAA,KAAAA,EAAa,CAAC,GAAGvC,GAAAN,GAAA,YAAAA,EAAQ,QAAR,KAAAM,GAAiB,CAAC,CAAC,GAE9EL,CACH,CACF,EAKF8C,GAAA,cAACxD,GAAe,SAAf,CAAwB,MAAOqD,GAE9BG,GAAA,cAACC,GAAA,CACC,MAAOC,GAAUV,EAAW,MAAOW,GAAQL,GAAA,KAAAA,EAAa,CAAC,GAAGtC,EAAAP,GAAA,YAAAA,EAAQ,QAAR,KAAAO,EAAiB,CAAC,CAAC,GAE9EN,EACD8C,GAAA,cAACI,GAAA,IAAY,CACf,CACF,CAEJ,E0DhSA,OAAOC,OAA8B,QCArC,OAAOC,IAAwB,aAAAC,GAAW,YAAAC,OAAgB,QCA1D,OAAOC,IAAa,YAAAC,OAAgB,QAEpC,OAAOC,OAAY,oBCFnB,OAAOC,OAAkC,QCAzC,OAAOC,OAAkC,QACzC,OAAOC,OAAY,oBAkBnB,IAAMC,GAAQC,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWhBC,GAAUC,GAAoBD,CAAK;AAAA,EAGlCE,GAAuBH,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQ/BC,GAAUC,GAAoBD,CAAK;AAAA,EAG3BG,GAAoC,CAAC,CAChD,MAAAC,EACA,MAAAC,EACA,WAAAC,EAAa,CAAC,EACd,cAAAC,EAAgB,QAChB,MAAAC,EACA,aAAAC,EAAe,UACf,aAAAC,EAAe,QACf,WAAAC,CACF,IAEIC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACV,GAAA,CACC,UAAWW,EAAa,0BAA2BF,CAAU,EAC7D,WAAYA,EACZ,eAAgBG,EAAA,GAAKN,IAEpBD,IAAkB,QAAUH,GAC3BQ,GAAA,cAACd,GAAA,CACC,UAAWe,EAAa,qBAAsBF,CAAU,EACxD,eAAgBL,EAChB,WAAYK,GAEXP,CACH,EAEFQ,GAAA,cAACG,GAAA,CACC,WAAYJ,EACZ,MAAON,EACP,KAAMK,EACN,aAAcD,EAChB,EACCF,IAAkB,SAAWH,GAC5BQ,GAAA,cAACd,GAAA,CACC,UAAWe,EAAa,qBAAsBF,CAAU,EACxD,eAAgBL,EAChB,WAAYK,GAEXP,CACH,CAEJ,EACAQ,GAAA,cAACI,GAAA,CAAmB,WAAYL,EAAY,CAC9C,ECvFJ,OAAOM,OAAY,oBAEZ,IAAMC,GAA2BD,GAAO;AAAA;AAAA;AAAA;AAAA,EAMlCE,GAAyBF,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAOjCG,GAAO,CAfnB,IAAAC,EAAAC,EAesB,OAAAA,GAAAD,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAC,EAAyB;AAAA,EAGlCC,GAA4BN,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAQpCG,GAAO,CA1BnB,IAAAC,EAAAC,EA0BsB,OAAAA,GAAAD,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAC,EAAyB;AAAA,EAGlCE,GAA4BP,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASnCQ,GAAoBR,GAAO;AAAA;AAAA;AAAA,6BAGVG,GAAUA,EAAM,MAAM;AAAA;EFxB7C,IAAMM,GAAuC,CAAC,CACnD,KAAAC,EACA,MAAAC,EACA,WAAAC,EACA,aAAAC,EACA,MAAAC,EACA,QAAAC,EACA,WAAAC,CACF,IAAM,CAzBN,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EA0BE,OACEC,GAAA,cAAC,OACC,MAAO,CAAE,SAAU,WAAY,YAAa,KAAM,EAClD,QAAS,IAAM,CACbP,EAAQ,CACV,GAECH,GACCU,GAAA,cAACC,GAAA,CACC,UAAWC,EAAa,qCAAsCR,CAAU,EACxE,SAAS,yBACT,MAAO,CAAE,iBAAiBE,GAAAD,EAAAD,GAAA,YAAAA,EAAY,QAAZ,YAAAC,EAAmB,eAAnB,KAAAC,EAAmCL,CAAa,EAC3E,EAEHS,GAAA,cAACG,GAAA,CACC,UAAWD,EAAa,oBAAqBR,CAAU,EACvD,IAAK,uBAAuBL,IAC5B,WAAYK,EACZ,KAAK,YAELM,GAAA,cAACI,GAAA,CACC,MAAOhB,EAAK,SACZ,cAAc,OACd,OAAOS,EAAAT,EAAK,WAAL,KAAAS,EAAiBT,EAAK,MAC7B,MAAOI,EACP,cAAcO,GAAAD,EAAAJ,GAAA,YAAAA,EAAY,QAAZ,YAAAI,EAAmB,eAAnB,KAAAC,EAAmCR,EACjD,WAAYG,EACd,CACF,CACF,CAEJ,EGzDA,OAAOW,OAA8B,QACrC,OAAOC,OAAY,oBCDnB,OAAOC,OAAY,oBAEZ,IAAMC,GAAiBD,GAAO;AAAA;AAAA;AAAA;AAAA,EAMxBE,GAAoBF,GAAO;AAAA;AAAA;AAAA,EAK3BG,GAAkBH,GAAO;AAAA;AAAA;AAAA;AAAA,YAIzBI,GAAUA,EAAM;AAAA,WACjBA,GAAUA,EAAM;AAAA;AAAA,sBAELA,GAAUA,EAAM,MAAM;AAAA;AAAA,EAGhCC,GAAwBL,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAM/BI,GAAUA,EAAM;AAAA;AAAA,sBAENA,GAAUA,EAAM,MAAM;AAAA;EDpB7C,IAAME,GAAoBC,GAAO;AAAA;AAAA,oBAEZC,GAAWA,EAAM,cAAgB,MAAQ,SAAW;AAAA;AAAA,iBAEvDA,GAAWA,EAAM,cAAgB,MAAQ,WAAa;AAAA;AAAA;AAAA,IAGnEA,GAAUC,GAAoBD,CAAK;AAAA,EAElCE,GAAsBH,GAAO;AAAA;AAAA;AAAA,IAG9BC,GAAWA,EAAM,cAAgB,MAAQ,eAAiB;AAAA,EAGzDG,GAAWJ,GAAO;AAAA;AAAA;AAAA;AAAA,mBAIJC,GAAUA,EAAM;AAAA,mBAChBA,GAAWA,EAAM,cAAgB,MAAQ,MAAQ;AAAA,IAChEA,GAAUC,GAAoBD,CAAK;EAajC,IAAMI,GAAc,CAAC,CAC1B,MAAAC,EACA,MAAAC,EACA,QAAAC,EAAU,QACV,aAAAC,EAAe,OACf,MAAAC,EAAQ,CAAC,EACT,UAAAC,EAAY,CAAC,EACb,WAAAC,CACF,IASM,CA9DN,IAAAC,EA+DE,GAAIN,IAAU,EACZ,OAAOO,GAAA,cAAAA,GAAA,aAAE,EAGP,OAAO,KAAKH,CAAS,EAAE,SAAW,GAAKA,EAAU,cAAgB,SACnEA,EAAY,CACV,OAAOE,EAAAD,GAAA,YAAAA,EAAY,QAAZ,YAAAC,EAAmB,SAC5B,GAGF,IAAME,EAAUT,IAAU,EAAI,OAAS,GAAIA,EAAQC,EAAS,OACtDS,EAAYR,IAAY,UAAY,MAAQ,OAC5CS,EAAkB,KAAK,MAAOX,EAAQC,EAAS,GAAG,EACpDW,EAAUV,IAAY,UAAY,OAAS,OAE3CW,EACJ,OAAIX,IAAY,SAAWA,IAAY,UACrCW,EAAW,GAAGb,KAASC,IACdC,IAAY,YACrBW,EAAW,GAAGF,eAEZR,IAAiB,QACnBS,EAAU,OAIVJ,GAAA,cAACM,GAAA,CACC,UAAWC,EAAa,uBAAwBT,CAAU,EAC1D,aAAcH,EACd,eAAgBC,GAEhBI,GAAA,cAACQ,GAAA,CACC,UAAWD,EAAa,sBAAuBT,CAAU,EACzD,eAAgBW,EAAAC,EAAA,GACXb,GADW,CAEd,SAAUH,IAAY,UAAY,GAAK,GACvC,WAAY,GACd,GACA,WAAYI,EACZ,QAASM,EACT,aAAcT,GAEbU,CACH,EACAL,GAAA,cAACW,GAAA,CACC,aAAchB,EACd,UAAWY,EAAa,cAAeT,CAAU,GAEjDE,GAAA,cAACY,GAAA,CACC,MAAO,CACL,OAAQlB,GAAW,UAAY,EAAI,CACrC,EACA,QAASO,EACT,UAAWC,EACX,WAAYJ,EACZ,UAAWS,EAAa,kBAAmBT,CAAU,EACvD,EACAE,GAAA,cAACa,GAAA,CACC,UAAWN,EAAa,wBAAyBT,CAAU,EAC3D,UAAWI,EACX,WAAYJ,EACd,CACF,CACF,CAEJ,EE9HA,OAAOgB,OAAmB,QAE1B,OAAOC,OAAY,oBCJnB,OAAOC,OAAmB,QCA1B,OAAOC,OAAmB,QAUnB,IAAMC,GAAsC,CAAC,CAAE,SAAAC,EAAU,WAAAC,CAAW,IAEvEC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CACC,WAAYF,EACZ,UAAWG,EAAa,qBAAsBH,CAAU,EACxD,wBAAyBI,EAASL,EAAS,KAAK,EAClD,EACAE,GAAA,cAACI,GAAA,CACC,WAAYL,EACZ,UAAWG,EAAa,wBAAyBH,CAAU,EAC3D,wBAAyBI,EAASL,EAAS,QAAQ,EACrD,CACF,ECvBJ,OAAOO,OAAmB,QAKnB,IAAMC,GAA4B,CAAC,CAAE,SAAAC,EAAU,WAAAC,CAAW,IAAM,CACrE,IAAMC,EAA2B,IAAM,CACjCF,EAAS,0BACXA,EAAS,yBAAyB,CAEtC,EAEMG,EAA6B,IAAM,CACnCH,EAAS,4BACXA,EAAS,2BAA2B,CAExC,EAEA,OACEI,GAAA,cAACC,GAAA,CAAwB,UAAWC,EAAa,eAAgBL,CAAU,GACzEG,GAAA,cAACG,GAAA,CACC,WAAYN,EACZ,MAAOD,EAAS,mBAChB,QAASE,EACX,EACCF,EAAS,sBACRI,GAAA,cAACG,GAAA,CACC,WAAYN,EACZ,UAAS,GACT,MAAOD,EAAS,qBAChB,QAASG,EACT,MAAO,CACL,MAAO,OACP,YAAa,MACf,EACF,CAEJ,CAEJ,EFlCO,IAAMK,GAA6C,CAAC,CAAE,SAAAC,EAAU,WAAAC,CAAW,IAE9EC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAc,SAAUH,EAAU,WAAYC,EAAY,EAC3DC,GAAA,cAACE,GAAA,CAAI,SAAUJ,EAAU,WAAYC,EAAY,CACnD,EGVJ,OAAOI,OAAW,QAIX,SAASC,GAAYC,EAIzB,CACD,OACEC,GAAA,cAACC,GAAA,CAAU,WAAYF,EAAM,WAAY,SAAUA,EAAM,SAAU,SAAUA,EAAM,SAAU,CAEjG,CJHO,IAAMG,GAAyB,UAChCC,GAAYC,GAAO;AAAA,mBACLC,GAAO,CAX3B,IAAAC,EAW8B,OAAAA,EAAAD,EAAM,aAAN,YAAAC,EAAkB,MAAM;AAAA;AAAA;AAAA;AAAA,EAKzCC,GAAwC,CAAC,CAAE,SAAAC,EAAU,WAAAC,CAAW,IAAM,CAhBnF,IAAAH,EAiBE,GAAIE,GAAA,MAAAA,EAAU,YAAa,CACzB,IAAME,EAA2BF,EAAS,YAC1C,OAAOG,GAAA,cAAC,WAAKD,CAAQ,EAGvB,OACEC,GAAA,cAACC,GAAA,CAAyB,UAAWC,EAAa,uBAAwBJ,CAAU,GACjFD,EAAS,SACRG,GAAA,cAACR,GAAA,CACC,UAAWU,EAAa,qBAAsBJ,CAAU,EACxD,IAAKD,EAAS,SACd,WAAYC,EACd,EACE,KACHD,EAAS,SACRG,GAAA,cAACG,GAAA,CACC,SAAUN,EAAS,SACnB,WAAYC,EACZ,UAAUH,EAAAE,EAAS,QAAT,YAAAF,EAAgB,cAC5B,EACE,KACJK,GAAA,cAACI,GAAA,CAAqB,SAAUP,EAAU,WAAYC,EAAY,CACpE,CAEJ,EKzCA,OAAOO,IAAa,UAAAC,GAAQ,YAAAC,OAAgB,QAC5C,OAAOC,OAAY,oBAOnB,IAAMC,GAAyBC,GAAO;AAAA;AAAA,EAIhCC,GAAYD,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYnBE,GAAQF,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQfG,GAAcH,GAAO;AAAA;AAAA;AAAA,EAKrBI,GAAaJ,GAAO;AAAA;AAAA;AAAA;AAAA,EAMpBK,GAAkBL,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAgBjBM,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA,EAgBlCC,GAAsB,gBAEtBC,GAAsC,CAAC,CAAE,SAAAC,EAAU,WAAAC,CAAW,IAAM,CA7EjF,IAAAC,EA8EE,GAAI,GAACA,EAAAF,EAAS,QAAT,MAAAE,EAAgB,QACnB,OACEC,GAAA,cAACb,GAAA,KACCa,GAAA,cAACC,GAAA,CAAqB,SAAUJ,EAAU,WAAYC,EAAY,CACpE,EAIJ,SAASI,EAAU,CAAE,MAAAC,CAAM,EAA6B,CAGtD,IAAMC,EAAMC,GAAY,EAElB,CAACC,EAAWC,CAAY,EAAIC,GAAS,EAAK,EAEhD,OACER,GAAA,cAACV,GAAA,KACE,CAACgB,GACAN,GAAA,cAACP,GAAA,CACC,QAAS,IAAM,CACbc,EAAa,EAAI,EACjBH,EAAI,QAAQ,KAAK,CACnB,EACA,WAAYN,GAEZE,GAAA,cAACS,GAAA,IAAK,CACR,EAEFT,GAAA,cAACT,GAAA,CAAY,SAAUe,EAAW,IAAKF,EAAK,KAAME,EAAW,IAAKH,EAAM,IAAK,EAC7EH,GAAA,cAACR,GAAA,KAAYW,EAAM,KAAM,CAC3B,CAEJ,CAEA,IAAMO,EAAab,EAAS,MAE5B,OAAIa,EAAW,OAEXV,GAAA,cAACb,GAAA,KACCa,GAAA,cAACW,GAAA,CAAc,SAAUd,EAAU,WAAYC,EAAY,EAC3DE,GAAA,cAACX,GAAA,KACEqB,EAAW,OAAO,IAAI,CAACP,EAAsBS,IAC5CZ,GAAA,cAAC,QAAK,IAAK,GAAGG,EAAM,OAAOS,KACzBZ,GAAA,cAACE,EAAA,CAAU,MAAOC,EAAO,CAC3B,CACD,CACH,EACAH,GAAA,cAACa,GAAA,CAAI,SAAUhB,EAAU,WAAYC,EAAY,CACnD,EAGG,IACT,EClIA,OAAOgB,OAAmB,QAC1B,OAAOC,OAAY,oBAQnB,IAAMC,GAAuBC,GAAO;AAAA;AAAA,EAK9BC,GAAcD,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBrBE,GAAmBF,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAO1BG,GAAeH,GAAO;AAAA;AAAA,EAafI,GAA4B,cAE5BC,GAA2C,CAAC,CAAE,SAAAC,EAAU,WAAAC,CAAW,IAAM,CArDtF,IAAAC,EAsDE,GAAI,GAACA,EAAAF,EAAS,QAAT,MAAAE,EAAgB,cACnB,OACEC,GAAA,cAACV,GAAA,KACCU,GAAA,cAACC,GAAA,CAAqB,SAAUJ,EAAU,WAAYC,EAAY,CACpE,EAIJ,IAAMI,EAAYL,EAAS,MAE3B,OAAIK,EAAU,aAEVF,GAAA,cAACV,GAAA,CAAqB,UAAWa,EAAa,uBAAwBL,CAAU,GAC9EE,GAAA,cAACI,GAAA,CAAc,SAAUP,EAAU,WAAYC,EAAY,EAC3DE,GAAA,cAACN,GAAA,KACEQ,EAAU,aAAa,IAAI,CAACG,EAAaC,IAEtCN,GAAA,cAAC,OAAI,IAAKM,GACPD,EAAY,MACXL,GAAA,cAACP,GAAA,CAAiB,wBAAyBc,EAASF,EAAY,KAAK,EAAG,EACtE,KACHA,EAAY,KAAOL,GAAA,cAACR,GAAA,KAAaa,EAAY,IAAK,EAAiB,IACtE,CAEH,CACH,EACAL,GAAA,cAACQ,GAAA,CAAI,SAAUX,EAAU,WAAYC,EAAY,CACnD,EAGG,IACT,EZzCA,IAAMW,GAAyBC,GAAO;AAAA;AAAA;AAAA;AAAA,eAItBC,GAAWA,EAAM,MAAQ,QAAU,QAAU;AAAA,gBAC5CA,GAAO,CAjDxB,IAAAC,EAiD2B,OAAAA,EAAAD,EAAM,aAAN,YAAAC,EAAkB,MAAM;AAAA,mBAC/BD,GAAO,CAlD3B,IAAAC,EAkD8B,OAAAA,EAAAD,EAAM,aAAN,YAAAC,EAAkB,MAAM;AAAA,IACjDD,GAAUE,GAAoBF,CAAK;AAAA,EAGlCG,GAAqBJ,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAMtBC,GAAO,CA5DnB,IAAAC,EAAAG,EA4DsB,OAAAA,GAAAH,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAG,EAAyB;AAAA,EAGzCC,GAAwBN,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAMzBC,GAAO,CArEnB,IAAAC,EAAAG,EAqEsB,OAAAA,GAAAH,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAG,EAAyB;AAAA;AAAA,EAIzCE,GAAkBP,GAAO;AAAA;AAAA,6BAEDC,GAAO,CA3ErC,IAAAC,EAAAG,EA2EwC,OAAAA,GAAAH,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAG,EAAyB;AAAA,EAG3DG,GAA2BR,GAAO;AAAA;AAAA,EAIlCS,GAA0BT,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQjCU,GAAUV,GAAO;AAAA;AAAA;AAAA,gBAGNC,GAAO,CA7FxB,IAAAC,EAAAG,EA6F2B,OAAAA,GAAAH,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAG,EAAyB;AAAA,EAG9CM,GAAoCX,GAAO;AAAA;AAAA;AAAA,EAK3CY,GAA2C,CAAC,CAChD,MAAAC,EACA,SAAAC,EACA,MAAAC,EAAQ,CAAC,EACT,MAAAC,EAAQ,CAAC,EACT,aAAAC,EACA,gBAAAC,EACA,UAAAC,EAAY,GACZ,gBAAAC,EAAkB,IAAI,IACtB,WAAAC,EACA,KAAAC,CACF,IAAM,CACJ,GAAM,CAAE,2BAAAC,CAA2B,EAAIC,GAAS,EAChDH,EAAaE,EAA2BF,CAAU,EAElD,IAAMI,EAA4B,CAChC,CAACC,EAAsB,EAAGC,GAC1B,CAACC,EAAmB,EAAGC,GACvB,CAACC,EAAyB,EAAGC,EAC/B,EAEMC,EAAwBC,IAAA,GACzBR,GACAL,GAGC,CAACc,EAAsBC,CAAuB,EAAIC,GAAS,CAAC,EAE5DC,EAAoBpB,GAAA,KAAAA,EAAgBiB,EACpCI,EAAuBpB,GAAA,KAAAA,EAAmBiB,EAE1CI,EAAgBxB,EAAM,OAAQyB,GAAMA,EAAE,WAAa,EAAI,EAAE,OAEzDC,EAAc,IAAM,CAtI5B,IAAAvC,EAuII,MAAI,GAACA,EAAAa,EAAMsB,CAAiB,IAAvB,MAAAnC,EAA0B,OAAQ,CAAC8B,EAAsBjB,EAAMsB,CAAiB,EAAE,IAAI,EAClFL,EAAsBN,EAAsB,EAAE,CACnD,SAAUX,EAAMsB,CAAiB,EACjC,WAAYhB,CACd,CAAC,EAIC,OAAOW,EAAsBjB,EAAMsB,CAAiB,EAAE,IAAI,GAAM,WAC3DL,EAAsBjB,EAAMsB,CAAiB,EAAE,IAAI,EAGrDL,EAAsBjB,EAAMsB,CAAiB,EAAE,IAAI,EAAE,CAC1D,SAAUtB,EAAMsB,CAAiB,EACjC,WAAYhB,CACd,CAAC,CACH,EAEA,OACEqB,GAAA,cAAC3C,GAAA,CACC,KAAMuB,EACN,eAAgBN,EAChB,UAAWG,EACX,WAAYE,GAEZqB,GAAA,cAAClC,GAAA,CACC,UAAWmC,EAAa,2BAA4BtB,CAAU,EAC9D,WAAYA,GAEZqB,GAAA,cAACnC,GAAA,CACC,UAAWoC,EAAa,kBAAmBtB,CAAU,EACrD,WAAYA,GAEZqB,GAAA,cAACtC,GAAA,CACC,UAAWuC,EAAa,iBAAkBtB,CAAU,EACpD,WAAYA,GAEXR,CACH,EACA6B,GAAA,cAACpC,GAAA,CACC,UAAWqC,EAAa,oBAAqBtB,CAAU,EACvD,WAAYA,GAEXP,CACH,EACA4B,GAAA,cAACE,GAAA,CACC,MAAO7B,EAAM,OACb,MAAOwB,EACP,MAAO,CAAE,UAAW,OAAQ,aAAc,MAAO,EACjD,WAAYlB,EACd,CACF,EACAqB,GAAA,cAACjC,GAAA,CAAwB,UAAWkC,EAAa,0BAA2BtB,CAAU,GACnFN,EAAM,IAAI,CAACyB,EAAaK,IAErBH,GAAA,cAACI,GAAA,CACC,KAAMN,EACN,MAAOK,EACP,IAAKA,EACL,WAAY9B,EAAM,OAClB,WAAY8B,IAAQR,EACpB,aAAchB,EAAW,MAAM,aAC/B,MAAO,CAAE,eAAgB,eAAgB,EACzC,QAAS,IAAM,CACbiB,EAAqBO,CAAG,CAC1B,EACA,WAAYxB,EACd,CAEH,CACH,CACF,EACAqB,GAAA,cAAChC,GAAA,CAAQ,WAAYW,EAAY,UAAWsB,EAAa,mBAAoBtB,CAAU,EAAG,EAC1FqB,GAAA,cAAC/B,GAAA,KACC+B,GAAA,cAACD,EAAA,IAAY,CACf,CACF,CAEJ,EAEOM,GAAQnC,GavNf,OAAOoC,GAAa,YAAAC,OAAgB,QCApC,OAAOC,OAA8B,QACrC,OAAOC,OAAY,oBAEnB,IAAMC,GAAaD,GAAO;AAAA;AAAA,EAIbE,GAAU,CAAC,CACtB,MAAAC,EACA,UAAAC,CACF,IAKEL,GAAA,cAACE,GAAA,CACC,MAAM,IACN,OAAO,KACP,QAAQ,WACR,KAAK,OACL,MAAM,6BACN,MAAOE,EACP,UAAWC,GAEXL,GAAA,cAAC,QACC,EAAE,yBACF,OAAO,eACP,YAAY,IACZ,cAAc,QACd,eAAe,QACjB,CACF,EC9BF,OAAOM,OAAY,oBAKZ,IAAMC,GAAgC,CAC3C,UAAW,mCACX,QAAS,OACT,UAAW,QACX,gBAAiB,OACjB,eAAgB,OAChB,cAAe,OACf,UAAW,OACb,EAEaC,GAAkBC,GAAO;AAAA;AAAA;AAAA,EAKzBC,GAAgBD,GAAO;AAAA;AAAA;AAAA;AAAA,EAMvBE,GAAiBF,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAMzBG,GAAO,CAjCnB,IAAAC,EAAAC,EAiCsB,OAAAA,GAAAD,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAC,EAAyB;AAAA,EAElCC,GAAoBN,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAM5BG,GAAO,CAzCnB,IAAAC,EAAAC,EAyCsB,OAAAA,GAAAD,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAC,EAAyB;AAAA,EAGlCE,GAAiBP,GAAO;AAAA,IAChCG,GAAUK,EAAwBL,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAW/BM,GAAcT,GAAO;AAAA;AAAA;AAAA;AAAA,EAMrBU,GAAaV,GAAO;AAAA,IAC5BG,GAAUK,EAAwBL,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU/BQ,GAAYX,GAAO;AAAA;AAAA;AAAA,EAKnBY,GAAoBZ,GAAO;AAAA;AAAA,EAM3Ba,GAAgBb,GAAO;AAAA,IAC/BG,GAAUK,EAAwBL,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAW/BW,GAAYd,GAAO;AAAA,IAC3BG,GAAUK,EAAwBL,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAO9BA,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA,EAMlCY,GAAef,GAAO;AAAA,IAC9BG,GAAUK,EAAwBL,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA,aAK9BA,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA;AAAA,EAKlCa,GAA0BhB,GAAO;AAAA,IACzCG,GAAUK,EAAwBL,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ/Bc,GAAejB,GAAO;AAAA,IAC9BG,GAAUK,EAAwBL,CAAK;AAAA;AAAA,wBAEnBA,GAAWA,EAAM,SAAW,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBpDe,GAAmBlB,GAAO;AAAA,IAClCG,GAAUK,EAAwBL,CAAK;AAAA;AAAA,aAE9BA,GAAWA,EAAM,SAAW,UAAY;AAAA;AAAA,iBAEpCA,GAAWA,EAAM,SAAW,IAAM;AAAA;AAAA;AAAA;AAAA,EAMvCgB,GAAoBnB,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAO3BoB,GAAuBpB,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU9BqB,GAAqBrB,GAAO;AAAA;AAAA;ECpLzC,OAAOsB,OAAY,oBAEZ,IAAMC,GAAiBD,GAAO;AAAA;AAAA;AAAA;ECFrC,OAAOE,OAAkC,QCAzC,OAAOC,OAAY,oBAGZ,IAAMC,GAAiBC,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUxBC,GAAaD,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQpBE,GAAaF,GAAO;AAAA,IAC5BG,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAW/BE,GAAYL,GAAO;AAAA,IAC3BG,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAc/BG,GAAmBN,GAAO;AAAA,IAClCG,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAa/BI,GAAYP,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQnBQ,GAAiBR,GAAO;AAAA,IAChCG,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU/BM,GAAoBT,GAAO;AAAA,IACnCG,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ/BO,GAAgBV,GAAO;AAAA,WACxBG,GAAUA,EAAM;AAAA;AAAA;AAAA;AAAA;ED1D5B,IAAMQ,GAAwB,CAAC,CAC7B,MAAAC,EACA,MAAAC,EACA,MAAAC,EACA,aAAAC,EACA,WAAAC,EACA,cAAAC,CACF,IAAM,CACJ,GAAM,CAAE,2BAAAC,CAA2B,EAAIC,GAAuB,EAE9D,OACEC,GAAA,cAACC,GAAA,CAAe,MAAOR,EAAO,UAAWS,EAAa,iBAAkBN,CAAU,GAChFI,GAAA,cAACG,GAAA,CAAW,UAAWD,EAAa,aAAcN,CAAU,GAAIF,CAAM,EACtEM,GAAA,cAACI,GAAA,CAAW,UAAWF,EAAa,qBAAsBN,CAAU,GACjEJ,EAAM,IAAI,CAACa,EAAyBC,IAAQ,CA/CrD,IAAAC,EAgDU,OACEP,GAAA,cAACQ,GAAA,CACC,IAAK,UAASD,EAAAF,EAAS,KAAT,KAAAE,EAAeD,IAC7B,UAAWJ,EAAa,YAAaN,CAAU,GAE9CS,EAAS,MACRL,GAAA,cAACS,GAAA,CAAiB,UAAWP,EAAa,YAAaN,CAAU,GAC/DI,GAAA,cAACU,GAAA,KAAWL,EAAS,IAAK,CAC5B,EAGFL,GAAA,cAACW,GAAA,CACC,UAAWT,EAAa,iBAAkBN,CAAU,EACpD,wBAAyBgB,EAASP,EAAS,KAAK,EAClD,EACAL,GAAA,cAACa,GAAA,CACC,UAAWX,EAAa,oBAAqBN,CAAU,EACvD,wBAAyBgB,EAASP,EAAS,QAAQ,EACrD,EACAL,GAAA,cAACc,GAAA,CACC,UAAWZ,EAAa,gBAAiBN,CAAU,EACnD,MAAOD,EACP,QAAS,IAAM,CACTU,EAAS,kBACXP,EAA2BO,CAAQ,EAEjCR,GACFA,EAAcQ,CAAQ,CAE1B,GAECA,EAAS,kBACZ,CACF,CAEJ,CAAC,CACH,CACF,CAEJ,EAEOU,GAAQxB,GJ3Cf,IAAMyB,GAAkD,CAAC,CACvD,MAAAC,EACA,MAAAC,EACA,SAAAC,EACA,WAAAC,EAEA,QAAAC,EACA,QAAAC,EAEA,aAAAC,EACA,gBAAAC,EACA,gBAAAC,EAEA,WAAAC,EAEA,UAAAC,EACA,WAAAC,EAEA,mBAAAC,CACF,IAAM,CACJ,IAAMC,EAAqB,CAAC,CAAE,SAAAC,EAAU,wBAAAC,EAAyB,eAAAC,CAAe,IACzEF,EAGHG,EAAA,cAACC,GAAA,CACC,UAAWC,EAAa,yBAA0BV,CAAU,EAC5D,cAAY,0BAEZQ,EAAA,cAACG,GAAA,CACC,WAAYX,EACZ,UAAWU,EAAa,qBAAsBV,CAAU,EACxD,wBAAyBY,EAASP,EAAS,KAAK,EAClD,EACAG,EAAA,cAACK,GAAA,CACC,WAAYb,EACZ,UAAWU,EAAa,wBAAyBV,CAAU,EAC3D,wBAAyBY,EAASP,EAAS,QAAQ,EACrD,EACAG,EAAA,cAACM,GAAA,CAAwB,UAAWJ,EAAa,wBAAyBV,CAAU,GACjFK,EAAS,sBACRG,EAAA,cAACO,GAAA,CACC,MAAOV,EAAS,qBAChB,QAASC,EACT,WAAYN,EACZ,UAAS,GACX,EAEFQ,EAAA,cAACO,GAAA,CACC,MAAOV,EAAS,mBAChB,QAASE,EACT,WAAYP,EACd,CACF,CACF,EAhCoBQ,EAAA,cAAAA,EAAA,aAAE,EAkEpBQ,EAAwBC,IAAA,GA9BI,CAChC,QAAUZ,GAAuB,CAxGrC,IAAAa,EAyGM,IAAIA,EAAA3B,EAAM4B,CAAiB,IAAvB,MAAAD,EAA0B,YAAa,CACzC,IAAME,EAA2B7B,EAAM4B,CAAiB,EAAE,YAC1D,OAAOX,EAAA,cAAC,WAAKY,CAAQ,EAEvB,IAAMC,EAAc9B,EAAM4B,CAAiB,EAc3C,OACEX,EAAA,cAACJ,EAAA,CACC,SAAUC,EACV,eAfmB,IAAM,CACvBgB,EAAY,0BACdA,EAAY,yBAAyB,CAEzC,EAYI,wBAV4B,IAAM,CAChCA,EAAY,4BACdA,EAAY,2BAA2B,CAE3C,EAOE,CAEJ,CACF,GAEiEtB,GAE3D,CAACuB,EAAsBC,CAAuB,EAAIC,GAAS,CAAC,EAE5DL,EAAoBtB,GAAA,KAAAA,EAAgByB,EACpCG,EAAuB3B,GAAA,KAAAA,EAAmByB,EAE1CG,EAAc,IAAM,CA5I5B,IAAAR,EA6II,OAAK3B,EACD,GAAC2B,EAAA3B,EAAM4B,CAAiB,IAAvB,MAAAD,EAA0B,OAAQ,CAACF,EAAsBzB,EAAM4B,CAAiB,EAAE,IAAI,EAClFH,EAAsB,QAAWzB,EAAM4B,CAAiB,CAAC,EAI9D,OAAOH,EAAsBzB,EAAM4B,CAAiB,EAAE,IAAI,GAAM,WAC3DH,EAAsBzB,EAAM4B,CAAiB,EAAE,IAAI,EAGrDH,EAAsBzB,EAAM4B,CAAiB,EAAE,IAAI,EAAE,CAC1D,SAAU5B,EAAM4B,CAAiB,EACjC,aAAcnB,EAAW,MAAM,YACjC,CAAC,EAbkBQ,EAAA,cAAAA,EAAA,aAAE,CAcvB,EAEMmB,EAAgBpC,EAAM,OAAQqC,GAAMA,EAAE,QAAQ,EAAE,OAEtD,OAAKjC,GAEAK,EAAW,MAAM,iBAChBA,EAAW,MAAM,eACnB6B,GAAe,aAAe7B,EAAW,MAAM,aAAe,MAEhEA,EAAW,MAAM,eAAiB6B,IAIlCrB,EAAA,cAACsB,GAAA,CAAM,QAASlC,EAAS,QAASD,EAAS,WAAYK,GACrDQ,EAAA,cAACuB,GAAA,KACCvB,EAAA,cAACwB,GAAA,KACCxB,EAAA,cAACyB,GAAA,CACC,WAAYjC,EACZ,UAAWU,EAAa,iBAAkBV,CAAU,GAEnDR,CACH,EACAgB,EAAA,cAAC0B,GAAA,CACC,WAAYlC,EACZ,UAAWU,EAAa,oBAAqBV,CAAU,GAEtDP,CACH,CACF,EAEAe,EAAA,cAAC2B,GAAA,KACE5C,GAASA,EAAM,OAAS,GACvBiB,EAAA,cAAC4B,GAAA,CAAe,UAAW1B,EAAa,iBAAkBV,CAAU,GAClEQ,EAAA,cAAC6B,GAAA,KACC7B,EAAA,cAAC,OAAI,MAAO,CAAE,KAAM,CAAE,GACpBA,EAAA,cAAC8B,GAAA,CAAW,UAAW5B,EAAa,aAAcV,CAAU,GACzDN,CACH,CACF,EACAc,EAAA,cAAC+B,GAAA,KACC/B,EAAA,cAACgC,GAAA,CACC,MAAO,CAAE,MAAO,MAAO,EACvB,MAAOb,EACP,MAAOpC,EAAM,OACb,WAAYS,EACd,CACF,CACF,EACAQ,EAAA,cAACiC,GAAA,KACCjC,EAAA,cAACkC,GAAA,CACC,UAAWhC,EAAa,6BAA8BV,CAAU,EAChE,WAAYA,GAEXT,EAAM,IAAI,CAACc,EAAoBsC,IAAgB,CAjNlE,IAAAzB,EAkNoB,IAAM0B,EAAazB,IAAsBwB,EACzC,OACEnC,EAAA,cAACqC,GAAA,CACC,SAAUD,EACV,UAAWlC,EACT,wBAAwBkC,EAAa,WAAa,KAClD5C,CACF,EACA,IAAK,yBAAwBkB,EAAAb,EAAS,KAAT,KAAAa,EAAeyB,IAC5C,SAAUtC,EAAS,QACnB,QAAS,IAAM,CACTA,EAAS,SAGboB,EAAqBkB,CAAG,CAC1B,EACA,MAAOtC,EAAS,QAAU,qCAAuC,QAEhEuC,GACCpC,EAAA,cAACsC,GAAA,CACC,UAAWpC,EACT,qCACAV,CACF,EACA,SAAS,0BACT,MAAO,CACL,gBAAiBA,EAAW,MAAM,aAClC,aAAc,EACd,OAAQ,OACR,IAAK,KACL,MAAO,KACT,EACD,EAEHQ,EAAA,cAACuC,GAAA,CACC,SAAUH,EACV,UAAWlC,EACT,4BAA4BkC,EAAa,WAAa,KACtD5C,CACF,GAECK,EAAS,QACZ,EACAG,EAAA,cAACwC,GAAA,KACCxC,EAAA,cAACyC,GAAA,CACC,MAAO5C,EAAS,SAChB,KAAK,QACL,aAAcL,EAAW,MAAM,aAC/B,SAAUK,EAAS,SACnB,WAAYL,EACd,EACAQ,EAAA,cAAC0C,GAAA,KACC1C,EAAA,cAAC2C,GAAA,CACC,MAAO,CAAE,WAAY,MAAO,EAC5B,MAAOnD,EAAW,MAAM,yBAC1B,CACF,CACF,CACF,CAEJ,CAAC,CACH,EAEAQ,EAAA,cAACkB,EAAA,IAAY,CACf,CACF,EAEDzB,GAAaA,EAAU,OAAS,GAC/BO,EAAA,cAAC4C,GAAA,CACC,MAAOnD,EACP,MAAOC,EACP,aAAcF,EAAW,MAAM,aAC/B,MAAO,CACL,OAAQ,OACR,UAAW,MACb,EACA,WAAYA,EACZ,cAAgBqD,IACVlD,GACFA,EAAmBkD,CAAI,EAGlB,IAEX,CAEJ,CACF,CACF,GA3ImB7C,EAAA,cAAAA,EAAA,aAAE,CA6IzB,EAEO8C,GAAQhE,GM9Sf,OAAOiE,IAAa,aAAAC,GAAW,YAAAC,OAAgB,QCA/C,OAAOC,OAAmB,QCA1B,OAAOC,OAAY,oBAEZ,IAAMC,GAAgBD,GAAO;AAAA,sBACbE,GAAO,CAH9B,IAAAC,EAAAC,EAGiC,OAAAA,GAAAD,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAC,EAAyB;AAAA;AAAA,kBAEvCF,GAAO,CAL1B,IAAAC,EAAAC,EAK6B,OAAAA,GAAAD,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAC,EAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWzCC,GAAqBL,GAAO;AAAA;AAAA;AAAA,EAK5BM,GAAYN,GAAO;AAAA;AAAA;AAAA;AAAA,EAKnBO,GAAaP,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWpBQ,GAAYR,GAAO;AAAA,WACpBE,GAAO,CAtCnB,IAAAC,EAAAC,EAsCsB,OAAAA,GAAAD,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAC,EAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYlCK,GAA2BT,GAAO;AAAA;AAAA,WAEnCE,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA,EAMhCQ,GAA2BV,GAAO,MAElCW,GAAeX,GAAO;AAAA,WACvBE,GAAO,CA7DnB,IAAAC,EAAAC,EA6DsB,OAAAA,GAAAD,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAC,EAAyB;AAAA;AAAA;AAAA;AAAA,EAMlCQ,GAAaZ,GAAO;AAAA;AAAA;AAAA;AAAA;ED/B1B,IAAMa,GAA4C,CAAC,CACxD,SAAAC,EACA,UAAAC,EACA,QAAAC,EACA,qBAAAC,EACA,uBAAAC,EACA,WAAAC,EACA,gBAAAC,CACF,IAAM,CA5CN,IAAAC,EAAAC,EA6CE,IAAMC,EAAYR,EAAY,CAAC,EAAI,CAAE,UAAW,eAAgB,EAC1DS,EAAmBT,EACrB,CACE,SAAU,SACV,UAAW,MACX,WAAY,2BACd,EACA,CACE,SAAU,SACV,UAAW,SACX,WAAY,0BACd,EAEJ,SAASU,GAAwB,CA1DnC,IAAAJ,EAAAC,EA2DI,OACEI,GAAA,cAAAA,GAAA,cACGZ,EAAS,UAAYA,EAAS,SAC7BY,GAAA,cAACC,GAAA,CAAmB,UAAWC,EAAa,qBAAsBT,CAAU,GACzEL,EAAS,SACRY,GAAA,cAACG,GAAA,CACC,UAAWD,EAAa,YAAaT,CAAU,EAC/C,IAAKL,EAAS,SAChB,EACE,KACHA,EAAS,SACRY,GAAA,cAACI,GAAA,CACC,WAAYX,EACZ,SAAUL,EAAS,SACnB,UAAUO,EAAAP,EAAS,QAAT,YAAAO,EAAgB,cAC5B,EACE,IACN,EACE,KACJK,GAAA,cAACK,GAAA,CACC,UAAWH,EAAa,eAAgBT,CAAU,EAClD,WAAYA,EACZ,wBAAyBa,EAASlB,EAAS,QAAQ,EACrD,EACAY,GAAA,cAACO,GAAA,CAAwB,UAAWL,EAAa,wBAAyBT,CAAU,GACjFL,EAAS,qBACRY,GAAA,cAACQ,GAAA,CACC,UAAS,GACT,MAAOpB,EAAS,qBAChB,QAAS,IAAMI,EAAuB,EACtC,WAAYC,EACd,EACE,KACJO,GAAA,cAACQ,GAAA,CACC,OAAOZ,EAAAR,EAAS,qBAAT,KAAAQ,EAA+B,WACtC,QAAS,IAAML,EAAqB,EACpC,WAAYE,EACd,CACF,CACF,CAEJ,CAEA,SAASgB,GAAgB,CACvB,GAAI,CAACf,EACH,OAAO,KAET,IAAMgB,EAAahB,EAAgBN,EAAS,IAAI,EAChD,OAAKsB,EAID,OAAOA,GAAe,WACjBA,EAGFA,EAAWtB,EAAUK,CAAU,EAP7B,IAQX,CAEA,OACEO,GAAA,cAACW,GAAA,CACC,cAAa,QAAQvB,EAAS,KAC9B,UAAWc,EAAa,yBAA0BT,CAAU,EAC5D,WAAYA,GAEZO,GAAA,cAACY,GAAA,CAAW,UAAWV,EAAa,aAAcT,CAAU,EAAG,QAAS,IAAMH,EAAQ,GACpFU,GAAA,cAACa,GAAA,CAAW,UAAWX,EAAa,oBAAqBT,CAAU,GACjEO,GAAA,cAACc,GAAA,CACC,MAAO1B,EAAS,SAChB,MAAO,CAAE,MAAO,OAAQ,UAAW,CAAE,EACrC,cAAcO,EAAAF,GAAA,YAAAA,EAAY,QAAZ,YAAAE,EAAmB,aACjC,WAAYF,EACd,EACAO,GAAA,cAACe,GAAA,CACC,WAAYtB,EACZ,UAAWS,EAAa,YAAaT,CAAU,EAC/C,wBAAyBa,EAASlB,EAAS,KAAK,EAClD,CACF,EAEAY,GAAA,cAACgB,GAAA,CACC,UAAWd,EAAa,uBAAwBT,CAAU,EAC1D,WAAYA,GAEZO,GAAA,cAACiB,GAAA,CAAQ,MAAOC,EAAAC,EAAA,GAAKtB,GAAL,CAAgB,WAAY,4BAA6B,GAAG,CAC9E,CACF,EAEAG,GAAA,cAAC,OACC,IAAKZ,EAAS,GACd,MAAO+B,EAAA,GACFrB,GAEL,UAAWI,EAAa,cAAeT,CAAU,IAEhDG,EAAAa,EAAc,IAAd,KAAAb,EAAmBG,EAAsB,CAC5C,CACF,CAEJ,EE9JA,OAAOqB,OAAY,oBAEZ,IAAMC,GAA0BD,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBjCE,GAAgBF,GAAO;AAAA;AAAA;AAAA,EAKvBG,GAAsBH,GAAO;AAAA,WAC9BI,GAAO,CAxBnB,IAAAC,EAAAC,EAwBsB,OAAAA,GAAAD,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAC,EAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlCC,GAAyBP,GAAO;AAAA,WACjCI,GAAO,CAhCnB,IAAAC,EAAAC,EAgCsB,OAAAA,GAAAD,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAC,EAAyB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlCE,GAAqBR,GAAO;AAAA;AAAA;AAAA,EAI5BS,GAAoCT,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAMpCI,GAAO,CAhD3B,IAAAC,EAAAC,EAgD8B,OAAAA,GAAAD,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAC,EAAyB;AAAA,sBAChCF,GAAO,CAjD9B,IAAAC,EAAAC,EAiDiC,OAAAA,GAAAD,EAAAD,EAAM,aAAN,YAAAC,EAAkB,QAAlB,YAAAC,EAAyB;EH3B1D,IAAMI,GAAkD,CAAC,CACvD,MAAAC,EACA,SAAAC,EACA,MAAAC,EACA,QAAAC,EACA,QAAAC,EACA,8BAAAC,EAAgC,GAChC,aAAAC,EAAe,GACf,mBAAAC,EAAqB,GACrB,gBAAAC,EACA,WAAAC,EACA,KAAAC,EACA,UAAAC,EACA,gBAAAC,EACA,MAAAC,EACA,cAAAC,CACF,IAAM,CACJ,IAAMC,EAAgBb,EAAM,OAAQc,GAAMA,EAAE,QAAQ,EAAE,OAChD,CAACC,EAAgBC,CAAiB,EAAIC,GAAoB,MAAMjB,EAAM,MAAM,EAAE,KAAK,EAAI,CAAC,EAE9FkB,GAAU,IAAM,CACd,IAAMC,EAAqB,CAAC,GAAGJ,CAAc,EAC7C,GAAKZ,EACL,SAASiB,EAAI,EAAGA,EAAIpB,EAAM,OAAQoB,IAChC,GAAI,CAACpB,EAAMoB,CAAC,EAAE,SAAU,CACtBD,EAAmBC,CAAC,EAAI,GACxB,MAGJJ,EAAkBG,CAAkB,EACtC,EAAG,CAAC,CAAC,EAkBL,IAAME,EAAmBC,GAAgB,CACvC,IAAMC,EAAoB,CAAC,GAAGR,CAAc,EAC5C,GAAIX,EACF,QAASgB,EAAI,EAAGA,EAAIL,EAAe,OAAQ,EAAEK,EACvCA,GAAKE,GAAOC,EAAkBD,CAAG,IACnCC,EAAkBH,CAAC,EAAI,IAI7BG,EAAkBD,CAAG,EAAI,CAACP,EAAeO,CAAG,EAC5CN,EAAkBO,CAAiB,CACrC,EAEA,GAAI,CAACrB,GAAWM,GAAQ,QAAS,OAAOgB,GAAA,cAAAA,GAAA,aAAE,EAE1C,IAAMC,EACJD,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACE,GAAA,KACCF,GAAA,cAACG,GAAA,CACC,WAAYpB,EACZ,UAAWqB,EAAa,iBAAkBrB,CAAU,EACpD,wBAAyBsB,EAAS/B,CAAK,EACzC,EACA0B,GAAA,cAACM,GAAA,CACC,WAAYvB,EACZ,UAAWqB,EAAa,oBAAqBrB,CAAU,EACvD,wBAAyBsB,EAAS9B,CAAQ,EAC5C,CACF,EACAyB,GAAA,cAACO,GAAA,CACC,QAAQ,UACR,MAAOlB,EACP,MAAOb,EAAM,OACb,MAAO,CAAE,OAAQ,kBAAmB,EACpC,WAAYO,EACd,CACF,EAGIyB,EACJR,GAAA,cAACS,GAAA,CACC,UAAWC,GAAaN,EAAa,qBAAsBrB,CAAU,EAAGE,CAAS,GAEhFT,EAAM,IAAI,CAACmC,EAAgBb,IAAgB,CAjHlD,IAAAc,EAkHQ,IAAMC,EAActB,EAAeO,CAAG,EACtC,OACEE,GAAA,cAACc,GAAA,CACC,WAAY/B,EACZ,SAAU4B,EACV,UAAWE,EACX,IAAK,oBAAmBD,EAAAD,EAAK,KAAL,KAAAC,EAAWd,IACnC,QAAS,IAAM,CACbD,EAAgBC,CAAG,EACnBhB,EAAgBgB,CAAG,EACfV,GACFA,EAAcZ,EAAMsB,CAAG,EAAGA,EAAKP,EAAeO,CAAG,EAAI,SAAW,UAAU,CAE9E,EACA,qBAAsB,IAAM,CAC1BD,EAAgBC,CAAG,EACfjB,GAAsBiB,EAAMtB,EAAM,OAAS,GAC7CM,EAAgBgB,EAAM,CAAC,EAErBa,EAAK,0BACPA,EAAK,yBAAyB,CAElC,EACA,uBAAwB,IAAM,CACxBA,EAAK,4BACPA,EAAK,2BAA2B,CAEpC,EACA,gBAAiBzB,EACnB,CAEJ,CAAC,CACH,EAGF,OAAIF,IAAS,SAETgB,GAAA,cAACe,GAAA,CACC,WAAYhC,EACZ,UAAW2B,GAAaN,EAAa,2BAA4BrB,CAAU,EAAGE,CAAS,EACvF,MAAOE,GAENc,EACAO,CACH,EAKFR,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACgB,GAAA,CACC,QAASvC,EACT,QAASC,EACT,WAAYK,EACZ,MAAO,CAAE,SAAU,OAAQ,EAC3B,cAAekB,GAEdO,CACH,CACF,CAEJ,EAEOS,GAAQ5C,GIjLf,OAAO6C,IAAS,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QCAnD,OAAS,aAAAC,GAAW,YAAAC,OAAgB,QAE7B,IAAMC,GAAgB,IAAM,CACjC,IAAMC,EAAU,CACd,QAAS,qBACT,SAAU,6CACV,QAAS,qBACX,EAEMC,EAAiB,OAAO,YAAY,OAAO,QAAQD,CAAO,EAAE,IAAI,CAAC,CAACE,CAAG,IAAM,CAACA,EAAK,EAAK,CAAC,CAAC,EAExF,CAACC,EAASC,CAAU,EAAIN,GAASG,CAAc,EAEjDI,EAAgB,KACdC,EAAkB,IAAM,CACxBD,IAAkB,KACpB,aAAaA,CAAa,EAE1BE,EAAc,EAGhBF,EAAgB,WAAW,IAAM,CAC/BE,EAAc,CAChB,EAAG,EAAE,CACP,EAEMA,EAAgB,IAAM,CAC1B,IAAMC,EAAe,OAAO,YAC1B,OAAO,QAAQR,CAAO,EAAE,IAAI,CAAC,CAACE,EAAKO,CAAK,IAAM,CAC5C,GAAI,CAAC,OACH,MAAO,CAACP,EAAK,EAAK,EAGpB,IAAMQ,EAAa,OAAO,WAAWD,CAAK,EAE1C,OAAAC,EAAW,iBAAiB,SAAUJ,CAAe,EAE9C,CAACJ,EAAKQ,EAAW,OAAO,CACjC,CAAC,CACH,EAEAN,EAAWI,CAAY,CACzB,EAEA,OAAAX,GAAU,IAAM,CACdU,EAAc,CAChB,EAAG,CAAC,CAAC,EAEEJ,CACT,ECjDA,OAAOQ,OAAmB,QCA1B,OAAOC,IAAU,OAAAC,GAAK,aAAAC,OAAiB,oBAGvC,IAAMC,GAAgBC;AAAA,sBACA,CAAC,CAAE,MAAAC,CAAM,IAAMA,EAAM;AAAA,EAGrCC,GAAgBF;AAAA;AAAA,EAIhBG,GAASC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQTC,GAAUD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQHE,GAAiBC,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBxBC,GAAsBD,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ7BE,GAAqBF,GAAO;AAAA,eACzBG,GAAWA,EAAM,SAAWL,GAAUF;AAAA;AAAA;AAAA,MAGhD,CAAC,CAAE,MAAAF,CAAM,IAAMA,EAAM;AAAA,MACrB,CAAC,CAAE,MAAAA,CAAM,IAAMA,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA,EAOdU,GAAqBJ,GAAO;AAAA,IACrCR;AAAA;AAAA;AAAA;AAAA,gBAIY,CAAC,CAAE,MAAAE,CAAM,IAAMA,EAAM;AAAA,WAC1B,CAAC,CAAE,MAAAA,CAAM,IAAMA,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQnBW,GAAOL,GAAO;AAAA,mBACR,CAAC,CAAE,MAAAN,CAAM,IAAMA,EAAM;AAAA;AAAA,EAI3BY,GAAqBN,GAAOK,EAAI;AAAA,IACzCb;AAAA,gBACY,CAAC,CAAE,MAAAE,CAAM,IAAMA,EAAM;AAAA;AAAA;AAAA;AAAA,MAI9BS,GAAYA,EAAM,QAAmE,GAAzD,eAAeA,EAAM,MAAM;AAAA;AAAA;AAAA;AAAA,MAIvDA,GAAYA,EAAM,QAA6D,GAAnD,qBAAqBA,EAAM,MAAM;AAAA,MAC7DA,GAAYA,EAAM,QAA8B,kBAApB;AAAA;AAAA,EAItBI,GAA0BP,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjCQ,GAAoBR,GAAOK,EAAI;AAAA,IACvCF,GAAUM,EAAwBN,CAAK;AAAA,MACtCR;AAAA;AAAA,kBAEY,CAAC,CAAE,MAAAD,CAAM,IAAMA,EAAM;AAAA;AAAA,EAI1BgB,GAAsBV,GAAO;AAAA,WAC/B,CAAC,CAAE,MAAAN,CAAM,IAAMA,EAAM;AAAA;AAAA;AAAA;AAAA,EAMnBiB,GAAmBX,GAAO;AAAA;AAAA,EAI1BY,GAAgBZ,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQvBa,GAAKb,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQZc,GAAgBd,GAAOa,EAAE;AAAA;AAAA,EAIzBE,GAAkBf,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOzBgB,GAAKhB,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQZiB,GAAYjB,GAAOgB,EAAE;AAAA;AAAA,IAE7Bb,GACDA,EAAM,SAAWA,EAAM,SACnB,gBACA;AAAA;AAAA,EAIKe,GAAOlB,GAAO;AAAA,WAChB,CAAC,CAAE,MAAAN,CAAM,IAAMA,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA,EAOnByB,GAAQnB,GAAO;AAAA,WACjB,CAAC,CAAE,MAAAN,CAAM,IAAMA,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhCwB,GAAK,KAAOlB,GAAOkB,EAAI;AAAA;AAAA,EAIvBA,GAAK,MAAQlB,GAAOkB,EAAI;AAAA,WACb,CAAC,CAAE,MAAAxB,CAAM,IAAMA,EAAM;AAAA,IAC3BS,GACDA,EAAM,SAAWA,EAAM,SACnB,gBACA;AAAA;ED7KD,IAAMiB,GAAsC,CAAC,CAAE,SAAAC,EAAU,MAAAC,EAAQ,CAAC,EAAG,WAAAC,CAAW,IAAM,CAC3F,GAAM,CAAE,2BAAAC,CAA2B,EAAIC,GAAS,EAC1C,CAAE,2BAAAC,CAA2B,EAAIC,GAAuB,EAE9DJ,EAAaC,EAA2BD,CAAU,EAElD,GAAM,CACJ,SAAAK,EAAW,KACX,SAAAC,EAAW,KACX,MAAAC,EAAQ,KACR,SAAAC,EAAW,GACX,QAAAC,EAAU,EACZ,EAAIX,EAEEY,EAASZ,EAAS,oBAAsBA,EAAS,qBAEjDa,EAAc,IAAM,CACxBR,EAA2BL,CAAQ,CACrC,EAEA,OACEc,GAAA,cAACC,GAAA,CACC,UAAWC,EAAa,eAAgBd,CAAU,EAClD,QAASS,EAAU,KAAOE,EAC1B,MAAOZ,EACP,QAASU,EACT,SAAUD,GAETH,GACCO,GAAA,cAACG,GAAA,CACC,UAAWD,EAAa,oBAAqBd,CAAU,EACvD,IAAKK,EACL,IAAKE,EACL,MAAO,CAAE,QAASC,GAAYC,EAAU,GAAM,CAAE,EAClD,EAEDD,GACCI,GAAA,cAACI,GAAA,CAAc,UAAWF,EAAa,wBAAyBd,CAAU,GACxEY,GAAA,cAACK,GAAA,CAAM,MAAO,CAAE,MAAO,SAAU,GAAG,UAAQ,CAC9C,EAEDV,GACCK,GAAA,cAACM,GAAA,CACC,QAAST,EACT,SAAUD,EACV,UAAWM,EAAa,oBAAqBd,CAAU,EACvD,wBAAyBmB,EAASZ,CAAK,EACzC,EAEDD,GACCM,GAAA,cAACQ,GAAK,MAAL,CACC,QAASX,EACT,SAAUD,EACV,UAAWM,EAAa,uBAAwBd,CAAU,EAC1D,wBAAyBmB,EAASb,CAAQ,EAC5C,CAGJ,CAEJ,EF5DA,IAAMe,GAAa,IACjBC,GAAA,cAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OAAO,MAAM,8BAChEA,GAAA,cAAC,QAAK,EAAE,cAAc,OAAO,eAAe,YAAY,MAAM,cAAc,QAAQ,EACpFA,GAAA,cAAC,QAAK,EAAE,eAAe,OAAO,eAAe,YAAY,MAAM,cAAc,QAAQ,EACrFA,GAAA,cAAC,QAAK,EAAE,WAAW,OAAO,eAAe,YAAY,MAAM,cAAc,QAAQ,CACnF,EAGIC,GAA2E,CAAC,CAChF,KAAAC,EAAO,OACP,KAAAC,EAAO,GACP,QAAAC,EAAU,IAAM,CAAC,CACnB,IAAM,CACJ,GAAM,CAACC,EAASC,CAAU,EAAIC,GAAS,EAAK,EACtC,CAACC,EAAUC,CAAW,EAAIF,GAAS,EAAK,EAE9CG,GAAU,IAAM,CACVP,IAAS,IAAQE,IAAY,GAC/BC,EAAW,EAAI,EACNH,IAAS,IAASE,IAAY,IACvCI,EAAY,EAAI,CAEpB,EAAG,CAACN,CAAI,CAAC,EAET,IAAMQ,EAAmB,IAAM,CAC7BL,EAAW,EAAK,EAChBG,EAAY,EAAK,CACnB,EAEMG,EACJV,GAAQ,OACJ,CAAE,IAAK,EAAG,OAAQ,EAAG,KAAM,IAAK,UAAW,gBAAiB,EAC5D,CAAE,IAAK,EAAG,OAAQ,EAAG,MAAO,GAAI,EAEtC,OAAOG,EACLL,GAAA,cAACa,GAAA,CACC,MAAOD,EACP,SAAUJ,EACV,eAAgBA,EAAWG,EAAmB,MAE9CX,GAAA,cAACc,GAAA,CAAmB,QAAS,IAAMV,EAAQ,EAAG,MAAO,CAAE,MAAO,GAAI,IAAK,kBAAmB,GACxFJ,GAAA,cAACD,GAAA,IAAW,CACd,CACF,EACE,IACN,EAMagB,GAAsD,CAAC,CAClE,OAAAC,EACA,WAAAC,EACA,gBAAAC,EACA,UAAAC,CACF,IAAM,CACJ,IAAMC,EAAqBC,GAAuB,IAAI,EAChD,CAACC,EAAcC,CAAe,EAAIhB,GAAS,EAAK,EAChD,CAACiB,EAAeC,CAAgB,EAAIlB,GAAS,EAAK,EAClD,CAACmB,EAAcC,CAAe,EAAIpB,GAAS,IAAI,EAC/C,CAACqB,EAAWC,CAAY,EAAItB,GAAS,CAAC,CAAC,EACvC,CAACuB,EAAwBC,CAAyB,EAAIxB,GAAS,CAAC,EAChE,CAAE,QAAAyB,CAAQ,EAAIC,GAAc,EAE5BC,EAAWF,EAAU,EAAI,EAEzB,CACJ,gBAAAG,EACA,aAAAC,EACA,0BAAAC,EACA,sBAAAC,EACA,UAAAC,CACF,EAAIC,GAAS,EAEb9B,GAAU,IAAM,CACd4B,EAAsBpB,CAAe,CACvC,EAAG,CAACA,EAAiBqB,CAAS,CAAC,EAE/B7B,GAAU,IAAM,CACd,GAAI6B,EAAW,OAEf,IAAME,EAAWN,EAAgBnB,CAAM,EACjC0B,EAAqBL,EAA0BrB,CAAM,EACrD2B,EAAQP,EAAapB,CAAM,EAEjCW,EAAgBc,CAAQ,GACpBA,EAAS,OAAS,MAAQA,EAAS,QAAU,QAC/CZ,EAAac,EAAM,KAAK,CAACC,EAAGC,IAAM,OAAOD,EAAE,QAAQ,EAAI,OAAOC,EAAE,QAAQ,CAAC,CAAC,EAC1EpB,EAAiBkB,EAAM,OAAST,CAAQ,EACxCH,EAA0BW,CAAkB,EAEhD,EAAG,CAACH,CAAS,CAAC,EAEd,IAAMO,EAAwB,CAAC,EAC/B,QAASC,EAAI,EAAGA,EAAInB,EAAU,OAAQmB,GAAKb,EACzCY,EAAa,KAAKlB,EAAU,MAAMmB,EAAGA,EAAIb,CAAQ,CAAC,EAGpD,IAAMc,EAAgBC,GAAkC,CACtD,IAAMC,EAASD,EAAE,OACXE,EAAYD,EAAO,YAAcA,EAAO,YAExCE,EAAgB,KAAK,KAAKF,EAAO,UAAU,EAE7CE,EAAgB,GAAK9B,IAAiB,IACxCC,EAAgB,EAAI,EAGlB6B,IAAkB,GAAK9B,IAAiB,IAC1CC,EAAgB,EAAK,EAGnB6B,EAAgBD,GAAa3B,IAAkB,IACjDC,EAAiB,EAAI,EAGnB2B,IAAkBD,GAAa3B,IAAkB,IACnDC,EAAiB,EAAK,CAE1B,EAEM4B,EAAqB,CAACC,EAAU,KAAS,CAC7C,IAAMC,EAAYD,EAAU,EAAI,GAE5BlC,EAAmB,UAAY,MAEnCA,EAAmB,QAAQ,SAAS,CAClC,KAAMA,EAAmB,QAAQ,YAAcmC,EAC/C,SAAU,QACZ,CAAC,CACH,EAEIC,EAAgB,KACdC,EAAmBR,GAAkC,CACrDO,IAAkB,KACpB,aAAaA,CAAa,EAG1BR,EAAaC,CAAC,EAGhBO,EAAgB,WAAW,IAAM,CAC/BR,EAAaC,CAAC,CAChB,EAAG,EAAE,CACP,EAEA,OAAIV,EACK,KAIPvC,GAAA,cAAC0D,GAAA,CACC,UAAWC,GAAaC,EAAa,oBAAqB3C,CAAU,EAAGE,CAAS,GAEhFnB,GAAA,cAAC,OACC,MAAO,CACL,QAAS,OACT,eAAgBgC,EAAU,SAAW,gBACrC,aAAc,GACd,SAAUA,EAAU,OAAS,SAC7B,IAAKA,EAAU,GAAK,EACtB,GAEAhC,GAAA,cAAC,WACCA,GAAA,cAAC6D,GAAA,CACC,UAAWD,EAAa,gBAAiB3C,CAAU,EACnD,wBAAyB6C,EAASpC,GAAA,YAAAA,EAAc,KAAK,EACvD,EACA1B,GAAA,cAAC+D,GAAK,MAAL,CACC,UAAWH,EAAa,mBAAoB3C,CAAU,EACtD,wBAAyB6C,EAASpC,GAAA,YAAAA,EAAc,QAAQ,EAC1D,CACF,EACA1B,GAAA,cAACgE,GAAA,CAAgB,UAAWJ,EAAa,kBAAmB3C,CAAU,GACpEjB,GAAA,cAACiE,GAAA,CACC,MAAOnC,EACP,MAAOF,EAAU,OACjB,WAAYX,EACd,CACF,CACF,EAEAjB,GAAA,cAAC,OAAI,MAAO,CAAE,SAAU,UAAW,GACjCA,GAAA,cAACC,GAAA,CAAa,KAAMqB,EAAc,QAAS,IAAM+B,EAAmB,EAAK,EAAG,EAC5ErD,GAAA,cAACC,GAAA,CAAa,KAAK,QAAQ,KAAMuB,EAAe,QAAS6B,EAAoB,EAE7ErD,GAAA,cAACkE,GAAA,CAAe,IAAK9C,EAAoB,SAAUqC,GAChDX,EAAa,IAAI,CAACqB,EAAOpB,IACxB/C,GAAA,cAACoE,GAAA,CACC,IAAKrB,EACL,MAAO,CACL,KAAM,mBAAmBnB,EAAU,OAASM,EAAW,GAAK,MAC9D,GAECiC,EAAM,IAAI,CAACE,EAAU,IACpBrE,GAAA,cAACsE,GAAA,CACC,IAAK,EACL,SAAUD,EACV,MAAO,CACL,KACEzC,EAAU,OAASM,EACf,mBAAmBA,kBAAyBA,KAC5C,CACR,EACA,WAAYjB,EACd,CACD,CACH,CACD,CACH,CACF,EACAjB,GAAA,cAACuE,GAAA,CAAmB,WAAYtD,EAAY,CAC9C,CAEJ,ExB3LO,IAAMuD,GAAqDC,GAqB5D,CArB4D,IAAAC,EAAAD,EAChE,QAAAE,EACA,MAAAC,EACA,SAAAC,EACA,MAAAC,EACA,oBAAAC,EACA,UAAAC,EACA,KAAAC,EAAO,SACP,UAAAC,EACA,QAAAC,EACA,gBAAAC,EACA,iBAAAC,EACA,cAAAC,EACA,WAAAC,EACA,qBAAAC,EACA,WAAAC,EACA,gBAAAC,EACA,eAAAC,EAAiB,UACjB,8BAAAC,EACA,mBAAAC,CArEF,EAkDkEnB,EAoB7DoB,EAAAC,GApB6DrB,EAoB7D,CAnBH,SACA,QACA,WACA,QACA,sBACA,YACA,OACA,YACA,UACA,kBACA,mBACA,gBACA,aACA,uBACA,aACA,kBACA,iBACA,gCACA,uBAGA,GAAM,CACJ,QAAAsB,EACA,aAAAC,EACA,kBAAAC,EACA,cAAAC,EACA,0BAAAC,EACA,UAAAC,EACA,6BAAAC,EACA,sBAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,cAAAC,EACA,sBAAAC,EACA,yBAAAC,EACA,gBAAAC,GACA,oBAAAC,CACF,EAAIC,GAAS,EACP,CAAE,2BAAAC,GAA4B,6BAAAC,EAA6B,EAAIC,GAAuB,EACtF,CAAE,iBAAAC,GAAkB,iBAAAC,CAAiB,EAAIC,GAAa,EACtD,CAACC,EAAcC,EAAe,EAAIC,GAASzC,GAAuB,CAAC,EACnE,CAAC0C,GAAqBC,EAAsB,EAAIF,GAAS,EAAK,EAC9DG,GAAYxC,IAAY,OAAYgC,GAAiBxC,CAAM,EAAIQ,EAC/DyC,GAAU3C,IAAS,QACnB,CAAE,2BAAA4C,CAA2B,EAAIC,GAAS,EAEhDC,GAAmBpD,EAAQQ,CAAO,EAElC,IAAM6C,EAAQ/B,EAAatB,CAAM,EAC3BsD,GAAQnB,EAAoBnC,CAAM,EAyBxC,GAvBAY,EAAasC,EAA2BtC,CAAU,EAElD2C,GAAU,IAAM,CACd3B,EAAsBnB,CAAe,CACvC,EAAG,CAACA,EAAiBiB,CAAS,CAAC,EAE/B6B,GAAU,IAAM,CACV/C,IAAY,SACVyC,IAAWzC,IAAY,GACzByB,EAAyB,EAAI,EACpBgB,IAAWzC,IAAY,IAChCyB,EAAyB,EAAK,EAGpC,EAAG,CAACzB,EAASM,EAAYkB,CAAqB,CAAC,EAE/CuB,GAAU,IAAM,CACVZ,IAAiBW,IAGrBV,GAAgBU,EAAK,CACvB,EAAG,CAACA,EAAK,CAAC,EAEN5B,EACF,OAAO,KAGT,IAAM8B,EAAOnC,EAAQrB,CAAM,EAa3B,GAZI,CAACwD,GAID7B,EAA6B6B,CAAI,GAIjC,CAACH,GAIDxC,IAAyB,IAAQkB,EAAc/B,CAAM,IAAMyD,GAC7D,OAAO,KAGT,IAAMC,EAAW7B,EAAgB7B,CAAM,EAQvC,GAPI0D,GAAA,MAAAA,EAAU,QACZzD,EAAQyD,EAAS,OAEfA,GAAA,MAAAA,EAAU,WACZxD,EAAWwD,EAAS,UAIpB,CAACZ,IACD1C,IAAwB,QACxBqB,EAA0BzB,CAAM,EAAI,EACpC,CACA,IAAM2D,EAAsBN,EAAM,UAAWO,GAASA,EAAK,WAAa,EAAK,EAC7EhB,GAAgBe,EAAsB,GAAKA,EAAsBN,EAAM,OAAS,CAAC,EACjFN,GAAuB,EAAI,EAG7B,SAASc,IAAyB,CAChC,GAAIlB,EAAe,GAAKU,EAAM,OAAQ,CAEhCJ,IACFR,EAAiBzC,EAAQ,EAAK,EAEhC,OAGE8B,EAAc9B,EAAQqD,EAAMV,EAAe,CAAC,EAAE,EAAE,GAIpDC,GAAgBD,EAAe,CAAC,CAClC,CAEA,SAASmB,GACPF,EACAG,EACAC,EACA,CACA,IAAMC,EAAgBtB,EAAe,EAAIU,EAAM,OAASA,EAAMV,EAAe,CAAC,EAAI,KAC9EhC,GACiBA,EAAciD,EAAMjB,EAAcoB,EAAKE,CAAa,IACpD,IAAQhB,IACzBiB,GAAY,EAGZxD,GACFA,EAAiBkD,EAAMI,EAAKC,CAAa,EAEvC,CAACvD,GAAoB,CAACC,IAAkBiD,EAAK,kBAAoBA,EAAK,qBACpEX,IACFiB,GAAY,CAGlB,CAEA,SAASC,IAAW,CAClB,OAAOd,EAAM,IAAI,CAACO,EAAgBI,IACzBI,EAAAC,EAAA,GACFT,GADE,CAEL,2BAA4B,IAAM,CAEhCC,GAAuB,EACvBvB,GAA6BsB,CAAI,EAC7BA,EAAK,YAAc,IACrBrC,EAAkBvB,EAAQ4D,EAAK,GAAI,CAAE,QAAS,EAAK,CAAC,EAEtDE,GAA6BF,EAAM,YAAaI,CAAG,CACrD,EACA,yBAA0B,IAAM,EAE3B,CAACJ,EAAK,qBACJA,EAAK,mBAAqBA,EAAK,oBAAsB,SACvDA,EAAK,oBAAsBA,EAAK,oBAAsB,MAEvDrC,EAAkBvB,EAAQ4D,EAAK,EAAE,EACjCC,GAAuB,GAEzBC,GAA6BF,EAAM,UAAWI,CAAG,EACjD3B,GAA2BuB,CAAI,EAE3BpC,EAAcxB,EAAQ4D,EAAK,EAAE,IAAMU,IACrCT,GAAuB,CAE3B,CACF,EACD,CACH,CAEA,SAASU,IAAY,CACnB,OAAOC,GAAA,cAACC,GAAA,CAAmB,WAAY7D,EAAY,CACrD,CAEA,IAAM8D,GAAc,CAClB,MAAOP,GAAS,EAChB,MAAAlE,EACA,SAAAC,EACA,aAAcU,EAAW,MAAM,aAC/B,WAAAA,EACA,gBAAAG,EACA,KAAAT,EACA,UAAAD,EACA,8BAAAY,EACA,mBAAAC,CACF,EAEA,SAASgD,IAAc,CACrBzB,EAAiBzC,EAAQ,EAAK,EAC1BO,GACFA,EAAU,EAERO,GACFA,EAAW,EAAK,CAEpB,CAEA,SAAS6D,IAAuB,CAC9B,OACEH,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACD,GAAA,IAAU,EACXC,GAAA,cAACI,GAAA,CACC,OAAQ5E,EACR,WAAYY,EACZ,gBAAiBH,EACjB,UAAWJ,EACb,CACF,CAEJ,CAEA,SAASwE,IAAwB,CAC/B,OACEL,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACD,GAAA,IAAU,EACXC,GAAA,cAACM,GAAAT,EAAA,CACC,QAASrB,GACT,QAAS,IAAM,CACbkB,GAAY,CACd,EACA,aAAcvB,EACd,gBAAiBC,GACjB,mBAAoB,GACpB,WAAYhC,EACZ,cAAeD,GACX+D,GACN,CACF,CAEJ,CAEA,SAASK,IAAwB,CAxSnC,IAAAjF,EAySI,IAAMkF,EAAc7D,EAAW,YAC3B8D,EACJ,OAAID,GACgB3D,EAAQ2D,CAAW,IAEnCC,EAAiB3D,EAAa0D,CAAW,GAK3CR,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACD,GAAA,IAAU,EACXC,GAAA,cAACU,GAAAb,EAAA,CACC,QAASrB,GACT,WAAYU,EAAS,WAAaA,EAAS,WAAa,yBACxD,QAAS,IAAM,CACbQ,GAAY,CACd,EACA,aAAcvB,EACd,gBAAiBC,GACjB,UAAWqC,EACX,YAAYnF,EAAAqB,EAAW,aAAX,KAAArB,EAAyB,QACrC,WAAYc,EACZ,MAAOX,EACP,SAAUC,EACV,mBAAqB0D,GAAS,CAC5BE,GAA6BF,EAAM,OAAQ,CAAC,CAC9C,EACA,gBAAiB7C,GACb2D,GACN,CACF,CAEJ,CAEA,SAASS,IAAsB,CAC7B,IAAMC,EACJZ,GAAA,cAACa,GAAAhB,EAAA,CACC,OAAQrE,EACR,MAAOG,EACP,aAAcwC,EACd,gBAAiBC,GACjB,WAAYhC,EACZ,KAAMN,GACFoE,GACN,EAGF,OAAKzB,GAUHuB,GAAA,cAACc,GAAA,CACC,QAAS,IAAM,CACbpB,GAAY,CACd,EACA,QAASlB,GACT,WAAYpC,EACZ,MAAO,CACL,WAAY,MACZ,QAAS,OACT,YAAa,CACf,GAEA4D,GAAA,cAACD,GAAA,IAAU,EACVa,CACH,EAtBEZ,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACD,GAAA,IAAU,EACVa,CACH,CAqBN,CAEA,OAAQpE,EAAgB,CACtB,IAAK,YACH,OAAO6D,GAAsB,EAC/B,IAAK,aACH,OAAOE,GAAsB,EAC/B,IAAK,UACH,OAAOI,GAAoB,EAC7B,IAAK,WACH,OAAOR,GAAqB,EAC9B,QACE,OAAOQ,GAAoB,CAC/B,CACF,ED9WO,IAAMI,GAA6DC,GACjEC,GAAA,cAACC,GAAAC,EAAA,CAAiB,KAAK,UAAaH,EAAO,E6BpBpD,OAAOI,IAAwB,aAAAC,OAAiB,QCAhD,OAAOC,OAAkC,QCAzC,OAAOC,OAAY,oBAGZ,IAAMC,GAAiBC,GAAO;AAAA,sBACdC,GAAUA,EAAM,WAAW,MAAM;AAAA,mBACpCA,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA,sBAI9BA,GAAUA,EAAM,WAAW,MAAM;AAAA,IACnDA,GAAUC,GAAoBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAO3BE,GAAWH,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKXC,GAAWA,EAAM,OAAS,YAAc,IAAM;AAAA;AAAA,EAIrDG,GAAaJ,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,kBAKdC,GAAWA,EAAM,OAAS,YAAc,MAAQ;AAAA,gBAClDA,GAAWA,EAAM,OAAS,YAAc,OAAS;AAAA,EAErDI,GAAwBL,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;EDVrC,IAAMM,GAA4C,CAAC,CACxD,MAAAC,EACA,MAAAC,EACA,MAAAC,EACA,QAAAC,EACA,MAAAC,EAAQ,CAAC,EACT,UAAAC,EACA,WAAAC,EACA,KAAAC,EAAO,SACT,IAEIC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAmB,WAAYH,EAAY,EAC5CE,GAAA,cAACE,GAAA,CACC,QAAS,IAAMP,IAAY,QAAaA,EAAQ,EAChD,eAAgBQ,IAAA,GACVJ,GAAQ,YAAc,CAAE,QAAS,OAAQ,eAAgB,eAAgB,EAAI,CAAC,GAC/EH,GAEL,UAAWQ,GACTP,GAAA,KAAAA,EAAa,GACbQ,EAAa,yBAA0BP,CAAU,CACnD,EACA,WAAYA,GAEXC,GAAQ,aAAeL,GAASA,IAAU,GACzCM,GAAA,cAACM,GAAA,CAAsB,UAAWD,EAAa,wBAAyBP,CAAU,GAChFE,GAAA,cAACO,GAAA,CACC,KAAM,GACN,WAAYd,EAAQC,EACpB,UAAWI,EAAW,MAAM,aAC5B,QAASA,EAAW,MAAM,yBAC5B,CACF,EAEFE,GAAA,cAACQ,GAAA,CAAS,KAAMT,EAAM,UAAWM,EAAa,sBAAuBP,CAAU,GAC7EE,GAAA,cAACS,GAAA,CACC,KAAMV,EACN,WAAYD,EACZ,UAAWO,EAAa,aAAcP,CAAU,GAE/CN,CACH,EACCG,IAAY,QACXK,GAAA,cAACU,GAAA,CACC,UAAWL,EAAa,eAAgBP,CAAU,EAClD,MAAOA,EAAW,MAAM,aAC1B,CAEJ,EACCC,GAAQ,WAAaL,GAASA,IAAU,GACvCM,GAAA,cAACW,GAAA,CACC,QAAQ,UACR,MAAOlB,EACP,MAAOC,EACP,QAASI,EAAW,MAAM,yBAC1B,MAAO,CAAE,MAAO,MAAO,EACvB,WAAYA,EACZ,UAAW,CACT,MAAO,SACT,EACF,CAEJ,CACF,EExFJ,OAAOc,OAAW,QCAlB,OAAOC,OAAY,oBAGZ,IAAMC,GAAkCC,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAO/BC,GAAUA,EAAM,WAAW,MAAM;AAAA,sBACjCA,GAAUA,EAAM,WAAW,MAAM;AAAA,mBACpCA,GAAUA,EAAM,WAAW,MAAM;AAAA,EAGxCC,GAAgBF,GAAO;AAAA,IAC/BC,GAAUE,EAAwBF,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ/BG,GAAgBJ,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvBK,GAAuBL,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ9BM,GAAgBN,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EDzB7B,IAAMO,GAAuD,CAAC,CACnE,MAAAC,EACA,SAAAC,EACA,KAAAC,EACA,WAAAC,EACA,MAAAC,EACA,MAAAC,EACA,UAAAC,EACA,MAAAC,CACF,IAEIC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CACC,WAAYN,EACZ,UAAWO,GACTC,EAAa,kCAAmCR,CAAU,EAC1DG,GAAA,KAAAA,EAAa,EACf,EACA,MAAOC,GAENL,GACCM,GAAA,cAACI,GAAA,CAAc,UAAWD,EAAa,6BAA8BR,CAAU,GAC5ED,CACH,EAEFM,GAAA,cAACK,GAAA,KACCL,GAAA,cAACM,GAAA,CAAc,KAAM,QAAS,WAAYX,EAAY,MAAOH,EAAO,SAAUC,EAAU,CAC1F,EACAO,GAAA,cAACO,GAAA,CACC,UAAWJ,EAAa,0CAA2CR,CAAU,GAE7EK,GAAA,cAACQ,GAAA,CAAY,MAAOZ,EAAO,MAAOC,EAAO,QAAQ,UAAU,aAAa,MAAM,CAChF,CACF,CACF,EH3BG,IAAMY,GAA4D,CAAC,CACxE,OAAAC,EACA,MAAAC,EACA,SAAAC,EACA,KAAAC,EACA,MAAAC,EACA,QAAAC,EACA,UAAAC,EACA,gBAAAC,EACA,qBAAAC,EACA,WAAAC,EACA,KAAAC,EAAO,SACT,IAAM,CACJ,GAAM,CACJ,QAAAC,EACA,aAAAC,EACA,cAAAC,EACA,0BAAAC,EACA,UAAAC,EACA,6BAAAC,EACA,sBAAAC,CACF,EAAIC,GAAS,EACP,CAAE,2BAAAC,CAA2B,EAAIC,GAAS,EAEhDX,EAAaU,EAA2BV,CAAU,EAElD,GAAM,CAAE,iBAAAY,EAAkB,iBAAAC,CAAiB,EAAIC,GAAa,EAM5D,GAJAC,GAAU,IAAM,CACdP,EAAsBV,CAAe,CACvC,EAAG,CAACA,EAAiBQ,CAAS,CAAC,EAE3BA,EACF,OAAO,KAGT,IAAMU,EAAOd,EAAQX,CAAM,EAS3B,GARI,CAACyB,GAIDT,EAA6BS,CAAI,GAIjCjB,IAAyB,IAAQK,EAAcb,CAAM,IAAM0B,GAC7D,OAAO,KAGT,IAAMC,EAAQf,EAAaZ,CAAM,EAC3B4B,EAAiBd,EAA0Bd,CAAM,EAEvD,OAAIU,IAAS,aAETmB,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAmB,WAAYrB,EAAY,EAC5CoB,GAAA,cAACE,GAAA,CACC,MAAO9B,EACP,SAAUC,EACV,MAAO0B,EACP,MAAOD,EAAM,OACb,MAAOvB,EACP,UAAWE,EACX,WAAYG,EACZ,KAAMN,EACN,QAAS,IAAM,CAAC,EAClB,CACF,EAKF0B,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAmB,WAAYrB,EAAY,EAC5CoB,GAAA,cAACG,GAAA,CACC,MAAOJ,EACP,MAAOD,EAAM,OACb,MAAO1B,EACP,MAAOG,EACP,QAAS,IAAM,CACbiB,EAAiBrB,EAAQ,EAAI,EACzBK,GACFA,EAAQ,CAEZ,EACA,KAAMK,EACN,UAAWJ,EACX,WAAYG,EACd,CACF,CAEJ,EK/GA,OAAOwB,OAAmB,QAWnB,IAAMC,GAAuCC,GAA4C,CAA5C,IAAAC,EAAAD,EAAE,QAAAE,EAAQ,MAAAC,EAAO,WAAAC,CAXrE,EAWoDH,EAAgCI,EAAAC,GAAhCL,EAAgC,CAA9B,SAAQ,QAAO,eACnE,GAAM,CAAE,QAAAM,EAAS,6BAAAC,EAA8B,aAAAC,CAAa,EAAIC,GAAS,EACnE,CAAE,2BAAAC,CAA2B,EAAIC,GAAS,EAChDR,EAAaO,EAA2BP,CAAU,EAElD,IAAMS,EAAON,EAAQL,CAAM,EAK3B,GAJI,CAACW,GAIDL,EAA6BK,CAAI,EACnC,OAAO,KAGT,IAAMC,EAAQL,EAAaP,CAAM,EAEjC,OAAOa,GAAA,cAACC,GAAAC,EAAA,CAAM,MAAOH,EAAO,MAAOX,EAAO,WAAYC,GAAgBC,EAAO,CAC/E,EC5BA,OAAOa,IAA4B,cAAAC,GAAY,aAAAC,OAAiB,QCAhE,OAAOC,GAA4B,aAAAC,GAAW,mBAAAC,GAAiB,UAAAC,GAAQ,YAAAC,OAAgB,QAIvF,OAAOC,OAAY,oBCHnB,OAAS,eAAAC,GAAa,aAAAC,GAAW,YAAAC,OAAgB,QAO1C,IAAMC,GAAc,CACzBC,EACAC,EACAC,EACAC,EAAgB,CAAE,EAAG,GAAI,EAAG,EAAG,EAC/BC,IACU,CACV,IAAMC,EAAUD,GAAiB,QAAU,EAAI,OAAO,QAChDE,EAAUF,GAAiB,QAAU,EAAI,OAAO,QAEtD,OAAIH,IAAa,OACR,CACL,EAAGD,EAAa,KAAOE,EAAYC,EAAO,EAAIG,EAC9C,EAAGN,EAAa,IAAMG,EAAO,EAAIE,CACnC,EACSJ,IAAa,QACf,CACL,EAAGD,EAAa,KAAOA,EAAa,MAAQG,EAAO,EAAIG,EACvD,EAAGN,EAAa,IAAMG,EAAO,EAAIE,CACnC,EAGK,CAAE,EAAG,EAAG,EAAG,CAAE,CACtB,EAEO,SAASE,GAAYC,EAA2BC,EAA0B,CAE/E,IAAMC,EACJ,YAAa,WACT,IAAI,QACJ,CACE,OAAQ,EACR,MAAO,EACP,EAAG,EACH,EAAG,EACH,OAAQ,EACR,IAAK,EACL,MAAO,EACP,KAAM,EACN,OAAQ,IAAM,CAAC,CACjB,EAEA,CAACC,EAAYC,CAAa,EAAId,GAASY,CAAW,EAClDG,EAAejB,GAAY,IAAM,CAChCY,GACLI,EAAcJ,EAAK,sBAAsB,CAAC,CAC5C,EAAG,CAACA,CAAI,CAAC,EAET,OAAAX,GAAU,KACRgB,EAAa,EACb,OAAO,iBAAiB,SAAUA,CAAY,EACvC,IAAM,OAAO,oBAAoB,SAAUA,CAAY,GAC7D,CAACL,EAAMC,CAAS,CAAC,EAEbE,CACT,CC/DA,OAAS,cAAAG,GAAY,YAAAC,OAAgB,QAG9B,SAASC,IAAW,CACzB,GAAM,CAAE,MAAAC,CAAM,EAAIC,GAAWC,EAAc,EACrC,CAACC,EAAaC,CAAc,EAAIC,GAAmB,CAAC,CAAC,EAE3D,SAASC,EAAeC,EAAS,CAC1BP,IAGDG,EAAY,KAAMK,GAAMA,IAAMD,CAAO,IAGzCH,EAAe,CAAC,GAAGD,EAAaI,CAAO,CAAC,EACxC,QAAQ,IAAIA,CAAO,GACrB,CAEA,SAASE,EAAoBF,EAAS,CAC/BP,IAGDG,EAAY,KAAMK,GAAMA,IAAMD,CAAO,IAGzCH,EAAe,CAAC,GAAGD,EAAaI,CAAO,CAAC,EACxC,QAAQ,KAAKA,CAAO,GACtB,CAEA,MAAO,CACL,eAAAD,EACA,oBAAAG,CACF,CACF,CFJA,IAAMC,GAAqB,IACrBC,GAAsB,IACtBC,GAAwB,IACxBC,GAAmB,GAcnBC,GAAiBC,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,sBAKPC,GAAeA,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBtCC,GAAiBF,GAAO;AAAA,WACnBF;AAAA,YACCA;AAAA;AAAA,sBAEWG,GAAUA,EAAM;AAAA;AAAA;AAAA,EAKjCE,GAAiBH,GAAO;AAAA;AAAA,EAIxBI,GAAkBJ,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,aAKjBC,GAAWA,EAAM,OAASA,EAAM,OAAS;AAAA,EAGjDI,GAAqBL,GAAOI,EAAe;AAAA,WACtCN,GAAmB;AAAA,YAClBA,GAAmB;AAAA,EAGzBQ,GAAqC,CAAC,CAC1C,MAAAC,EAAQ,CAAC,EACT,UAAAC,EACA,WAAAC,EAAa,IAAM,CAAC,EACpB,gBAAAC,EAAkB,OAClB,cAAAC,EAAgB,GAChB,aAAAC,EAAe,UACf,OAAAC,EAAS,CAAE,EAAG,EAAG,EAAG,CAAE,EACtB,QAAAC,EAAU,GACV,eAAAC,EAAiB,CAAC,EAClB,aAAAC,EAAe,EACf,gBAAAC,EACA,WAAAC,EACA,YAAAC,EAAc,GACd,kBAAAC,EACA,cAAAC,EAAgB,GAChB,oBAAAC,EAAsB,EACtB,oBAAAC,EAAsB,GACtB,YAAAC,EAAc,WACd,cAAAC,EACA,UAAAC,CACF,IAAM,CAtHN,IAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAuHE,GAAM,CAAE,oBAAAC,CAAoB,EAAIC,GAAS,EACnC,CAACC,EAAYC,CAAa,EAAIC,GAAuC,EACrE,CAACC,EAAaC,CAAc,EAAIF,GAAS,IAAI,IAAM,EACnDG,EAAUC,GAAO,IAAI,EAErB,CAACC,EAAMC,CAAO,EAAIN,GAAS,SAAS,cAAc3C,EAAMS,CAAY,EAAE,QAAQ,CAAC,EAC/EyC,EAAeC,GAAYH,EAAMJ,CAAW,EAC5C,CAACQ,EAAkBC,CAAmB,EAAIV,GAAiB,EAC3D,CAACW,EAAsBC,CAAuB,EAAIZ,GAAS,CAAC9B,CAAiB,EAC7E2C,GAAgBnC,IAAAD,GAAApB,EAAMS,CAAY,IAAlB,YAAAW,GAAqB,QAArB,MAAAC,GAA4B,SAC9CrB,EAAMS,CAAY,EAAE,MAAM,SAC1BQ,EACEwC,GAASjC,IAAAD,IAAAD,GAAAtB,EAAMS,CAAY,IAAlB,YAAAa,GAAqB,QAArB,YAAAC,GAA4B,SAA5B,KAAAC,GAAsC,GAC/CkC,IAAYjC,GAAAgB,GAAA,YAAAA,EAAY,QAAZ,KAAAhB,GAAqBrC,GACjCuE,GAAajC,GAAAe,GAAA,YAAAA,EAAY,SAAZ,KAAAf,GAAsBrC,GACnC,CAACuE,GAAYC,EAAa,EAAIlB,GAAS,IAAI,KAAK,EAAE,QAAQ,CAAC,EACjErC,GAASuB,GAAAD,GAAAD,GAAA3B,EAAMS,CAAY,IAAlB,YAAAkB,GAAqB,QAArB,YAAAC,EAA4B,SAA5B,KAAAC,EAAsCvB,EAE/C,IAAMwD,GAAM,OAAO,SAAS,SAAS,MAAM,GAAG,EAAE,IAAI,EAEpDC,GAAgB,IAAM,CAChBjB,EAAQ,SACVJ,EAAc,CACZ,MAAOI,EAAQ,QAAQ,YACvB,OAAQA,EAAQ,QAAQ,YAC1B,CAAC,CAEL,EAAG,CAACrC,EAAcmC,EAAaY,CAAa,CAAC,EAE7CQ,GAAU,IAAM,CACTnD,GACH0C,EAAwB,EAAI,CAEhC,EAAG,CAAC9C,CAAY,CAAC,EAEjBuD,GAAU,IAAM,CACVzD,GAAW+C,GACbpC,EAAcT,CAAY,CAE9B,EAAG,CAAC6C,CAAoB,CAAC,EAEzB,IAAMW,EAAwB,IAAM,CAClC,GAAIT,IAAkB,SACpB,OAGF,IAAMR,GAAO,SAAS,cAAchD,EAAMS,CAAY,EAAE,QAAQ,EAChE,GAAI,CAACuC,GAAM,CACTK,EAAoB,MAAS,EAC7BJ,EAAQ,IAAI,EACZV,EACE,sDAAsDvC,EAAMS,CAAY,EAAE,sBAAsBT,EAAMS,CAAY,EAAE,IACtH,EACA,OAEE2C,GAAoBA,IAAqB,KAAK,UAAUJ,IAAA,YAAAA,GAAM,uBAAuB,IAGzFC,EAAQD,EAAI,EACZH,EAAe,IAAI,IAAM,EACrBG,IACFK,EAAoB,KAAK,UAAUL,GAAK,sBAAsB,CAAC,CAAC,EAEpE,EAkDA,GAhDAgB,GAAU,IAAM,CACd,IAAME,GAAW,IAAI,iBAAiBD,CAAqB,EAC3D,OAAAC,GAAS,QAAQ,SAAS,KAAM,CAAE,QAAS,GAAM,UAAW,EAAK,CAAC,EAC3D,IAAMA,GAAS,WAAW,CACnC,EAAG,CAACD,CAAqB,CAAC,EAE1BD,GAAU,IAAM,CACd,IAAME,GAAW,IAAI,iBAAiBD,CAAqB,EAC3D,OAAAC,GAAS,QAAQ,SAAS,KAAM,CAC9B,QAAS,GACT,UAAW,GACX,WAAY,GACZ,gBAAiB,CAAC,QAAS,OAAO,CACpC,CAAC,EACM,IAAMA,GAAS,WAAW,CACnC,EAAG,CAACD,CAAqB,CAAC,EAE1BD,GAAU,IAAM,CACd,IAAMG,GAAa,YAAY,IAAM,CACnCF,EAAsB,CACxB,EAAG,EAAE,EACL,MAAO,IAAM,cAAcE,EAAU,CACvC,EAAG,CAACF,CAAqB,CAAC,EAE1BF,GAAgB,IAAM,CACpB,WAAW,IAAM,CACfE,EAAsB,CACxB,EAAG3E,EAAqB,EAExB2E,EAAsB,CACxB,EAAG,CAACxD,EAAcqD,EAAG,CAAC,EAEtBE,GAAU,IAAM,CACd,GAAI,CAACzD,EACH,OAEF,IAAM6D,GAAgBC,IAAqB,CACrCA,GAAE,MAAQ,UACZpE,EAAU,CAEd,EACA,gBAAS,iBAAiB,UAAWmE,EAAY,EAE1C,IAAM,CACX,SAAS,oBAAoB,UAAWA,EAAY,CACtD,CACF,EAAG,CAAC,CAAC,EAEDpB,IAAS,MAAQ,CAACzC,EACpB,OAAO,KAGT,IAAI+D,EACFnE,IAAoB,OAAS,QAAWA,EAEtCoE,GAAWC,GAAYtB,EAAcoB,EAAsBZ,GAAWpD,EAAQkD,CAAa,EAEzFiB,GACJvB,EAAa,MAAQQ,IAAa,OAAO,YAAc,SAAS,gBAAgB,aAC5EgB,GACJxB,EAAa,OAAS7D,IACrB,OAAO,aAAe,SAAS,gBAAgB,cAE9CoF,IAAsBtE,IAAoB,SAC5CoE,GAAWC,GAAYtB,EAAc,OAAQQ,GAAWpD,EAAQkD,CAAa,EAC7Ec,EAAuB,SAIvBvC,GAAAD,EAAA9B,EAAMS,CAAY,IAAlB,YAAAqB,EAAqB,QAArB,MAAAC,EAA4B,mBAC5BE,IAAAD,GAAAhC,EAAMS,CAAY,IAAlB,YAAAuB,GAAqB,QAArB,YAAAC,GAA4B,mBAAoB,WAC/CE,IAAAD,GAAAlC,EAAMS,CAAY,IAAlB,YAAAyB,GAAqB,QAArB,YAAAC,GAA4B,mBAAoB,UAC/CE,IAAAD,GAAApC,EAAMS,CAAY,IAAlB,YAAA2B,GAAqB,QAArB,YAAAC,GAA4B,mBAAoB,WAElDiC,EAAuBtE,EAAMS,CAAY,EAAE,MAAM,iBAGnD,IAAMkE,GAAuB,IAAM,CACjC,IAAMC,GAAmB,IAAM,CAQ7B,GAPI5E,EAAMS,CAAY,EAAE,2BACtBT,EAAMS,CAAY,EAAE,yBAAyB,EAC7C8C,EAAwB,EAAK,EAC7B,WAAW,IAAM,CACfU,EAAsB,CACxB,EAAG,EAAE,GAEHlD,IAAwBf,EAAM,OAAS,EACzC,OAAOE,EAAW,CAEtB,EAEM2E,GAA4B,IAAM,CAClC7E,EAAMS,CAAY,EAAE,6BACtBT,EAAMS,CAAY,EAAE,2BAA2B,EAC3CI,GAAqB,CAACb,EAAMS,CAAY,EAAE,oBAC5C8C,EAAwB,EAAK,EAGnC,EAEA,OACEuB,EAAA,cAAAA,EAAA,cACGhE,GAAiBd,EAAM,OAAS,GAC/B8E,EAAA,cAACC,GAAA,KACCD,EAAA,cAACE,GAAA,CACC,KAAK,SACL,UAAWC,EAAa,qBAAsBtE,CAAU,GAEvDF,EAAe,EAAE,OAAKT,EAAM,MAC/B,CACF,GAEAA,EAAMS,CAAY,EAAE,oBAAsBT,EAAMS,CAAY,EAAE,uBAC9DqE,EAAA,cAACI,GAAA,CACC,cAAepE,EACf,UAAWmE,EAAa,sBAAuBtE,CAAU,GAExDX,EAAMS,CAAY,EAAE,sBACnBqE,EAAA,cAACK,GAAA,CACC,MAAOnF,EAAMS,CAAY,EAAE,qBAC3B,WAAYE,EACZ,QAASkE,GACT,KAAK,QACL,WAAY,GACZ,UAAS,GACX,EAED7E,EAAMS,CAAY,EAAE,oBACnBqE,EAAA,cAACK,GAAA,CACC,MAAOnF,EAAMS,CAAY,EAAE,mBAC3B,WAAYE,EACZ,QAASiE,GACT,UAAW,GACX,WAAY,GACZ,KAAK,QACP,CAEJ,CAEJ,CAEJ,EAEMQ,GAA4B,IAAM,CAvU1C,IAAAhE,GAwUI,OACE0D,EAAA,cAAAA,EAAA,cACGlE,GACCkE,EAAA,cAACO,GAAA,CACC,cAAY,kBACZ,QAAS,IAAM,CACTpF,GACFA,EAAU,CAEd,EACA,UAAWgF,EAAa,eAAgBtE,CAAU,EAClD,SAAU,CAAC,CAACX,EAAMS,CAAY,EAAE,UAAY,CAAC,CAACT,EAAMS,CAAY,EAAE,SAClE,aAAW,gBACX,KAAK,SACL,SAAU,GAEVqE,EAAA,cAACQ,GAAA,IAAM,CACT,EAEDtF,EAAMS,CAAY,EAAE,UACnBqE,EAAA,cAACS,GAAA,CACC,YAAa3E,EACb,WAAYD,EACZ,KAAK,MACL,aAAYX,EAAMS,CAAY,EAAE,MAChC,IAAKT,EAAMS,CAAY,EAAE,SACzB,UAAWwE,EAAa,wBAAyBtE,CAAU,EAC7D,EAEDX,EAAMS,CAAY,EAAE,UAAY,CAACT,EAAMS,CAAY,EAAE,UACpDqE,EAAA,cAACU,GAAA,CACC,YAAa5E,EACb,WAAYD,EACZ,KAAK,QACL,aAAYX,EAAMS,CAAY,EAAE,MAChC,UAAWwE,EAAa,wBAAyBtE,CAAU,GAE3DmE,EAAA,cAACW,GAAA,CACC,WAAY9E,EACZ,SAAUX,EAAMS,CAAY,EAAE,SAC9B,UAAUW,GAAApB,EAAMS,CAAY,EAAE,QAApB,YAAAW,GAA2B,cACvC,CACF,EAEF0D,EAAA,cAACY,GAAA,CAAwB,UAAWT,EAAa,0BAA2BtE,CAAU,GACpFmE,EAAA,cAACa,GAAA,CACC,WAAYhF,EACZ,MAAOX,EAAMS,CAAY,EAAE,MAC3B,SAAUT,EAAMS,CAAY,EAAE,SAC9B,KAAK,QACL,WAAY,UAAUT,EAAMS,CAAY,EAAE,KAC5C,EACAqE,EAAA,cAACc,GAAA,CAAc,UAAWX,EAAa,gBAAiBtE,CAAU,GAChEmE,EAAA,cAACH,GAAA,IAAqB,CACxB,CACF,CACF,CAEJ,EAaMkB,EAAwBC,IAAA,GAXI,CAChC,QAAUC,IAAgB,CArY9B,IAAA3E,GAsYM,IAAIA,GAAApB,EAAMS,CAAY,IAAlB,MAAAW,GAAqB,YAAa,CACpC,IAAM4E,GAA2BhG,EAAMS,CAAY,EAAE,YACrD,OAAOqE,EAAA,cAAC,WAAKkB,EAAQ,EAGvB,OAAOlB,EAAA,cAACM,GAAA,IAA0B,CACpC,CACF,GAEiE1E,GAE3DuF,GAAc,IAAM,CAjZ5B,IAAA7E,GAkZI,OAAKpB,EACD,GAACoB,GAAApB,EAAMS,CAAY,IAAlB,MAAAW,GAAqB,OAAQ,CAACyE,EAAsB7F,EAAMS,CAAY,EAAE,IAAI,EACxEoF,EAAsB,QAAW7F,EAAMS,CAAY,CAAC,EAEtDoF,EAAsB7F,EAAMS,CAAY,EAAE,IAAI,EAAE,CACrD,SAAUT,EAAMS,CAAY,EAC5B,aAAcJ,CAChB,CAAC,EAPkByE,EAAA,cAAAA,EAAA,aAAE,CAQvB,EASA,GAPI9E,EAAMS,CAAY,EAAE,WAAa,IAOjC8D,GAAS,GAAK,GAAKA,GAAS,GAAK,GAAK,IAAI,KAAK,EAAE,QAAQ,EAAIX,GAAa,IAC5E,OAAO,KAGT,IAAMsC,EAAS,CACb,KAAK3B,IAAA,YAAAA,GAAU,GAAIhF,GACnB,MACG+C,GAAAgC,GAAwB,OACrBpB,EAAa,EAAI5C,EAAO,GACxBiE,IAAA,YAAAA,GAAU,GAAIhF,KAFjB,KAAA+C,GAEsC,EACzC,OAAQzB,EAAoB,UAAY,UACxC,SAAU2C,CACZ,EAGM2C,EAAyB,IAAM,CAEnC,IAAMC,GAAaF,EAAO,MAAQ5B,GAAwB,OAAS,CAACZ,GAAY,IAEhF,OAAO,KAAK,IACV,KAAK,IAAI0C,GAAY,EAAa,EAClC,OAAO,WAAa1C,GAAY,EAClC,CACF,EAEM2C,GAAwB,IAAM,CAClC,GAAI7C,IAAkB,QACpB,OAAO0C,EAAO,IAGhB,IAAMI,GAAgBJ,EAAO,IAAMvC,EAC7B4C,GAAgB,GACtB,OAAID,GAAgB,OAAO,YAAcC,GAChCL,EAAO,IAAM,CAACvC,EAEhBuC,EAAO,GAChB,EAEMM,GAAc,IAAM,CACpB3F,IACFgC,EAAe,IAAI,IAAM,EACzBU,EAAwB,CAACD,CAAoB,EAEjD,EAEA,OACEwB,EAAA,cAAClF,GAAA,CAAe,UAAWuB,GACzB2D,EAAA,cAAChF,GAAA,CACC,MAAOoG,EACP,OAAQzC,EACR,UAAWwB,EAAa,yBAA0BtE,CAAU,GAE3DP,GACCJ,EAAMS,CAAY,EAAE,gBAAkB,IACtCQ,IAAgB,UACd6D,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACnF,GAAA,CACC,MAAO,CACL,SAAU6D,CACZ,EACA,QAASgD,GACT,aAAc7F,EAAW,MAAM,aAC/B,UAAWsE,EAAa,2BAA4BtE,CAAU,EAC/D,EACDmE,EAAA,cAACtF,GAAA,CACC,MAAO,CACL,SAAU,UACZ,EACA,QAASgH,GACT,aAAc7F,EAAW,MAAM,aAC/B,UAAWsE,EAAa,2BAA4BtE,CAAU,EAC/D,CACH,CAEN,EACAmE,EAAA,cAACjF,GAAA,CACC,MAAO4G,EAAAX,EAAA,GACFI,GADE,CAEL,KAAMC,EAAuB,EAC7B,IAAKE,GAAsB,CAC7B,GACA,OAAQ5C,EAAS,EACjB,UAAWwB,EAAa,0BAA2BtE,CAAU,GAE5D2C,GACCwB,EAAA,cAAAA,EAAA,cACEA,EAAA,cAAC4B,GAAA,CACC,IAAK5D,EACL,KAAK,SACL,kBAAiB,iBAAiB9C,EAAMS,CAAY,EAAE,UACtD,mBAAkB,iBAAiBT,EAAMS,CAAY,EAAE,aACvD,SAAS,oBACT,SAAU,EACV,aAAW,UACX,MAAOqF,EAAA,CACL,SAAU,WACV,MAAO,cACP,MAAO,EACP,IAAK7E,IAAgB,SAAW,GAAK,GAClCT,GAEL,WAAYG,EACZ,UAAWsE,EAAa,mBAAoBtE,CAAU,EACtD,SAAUvB,GACV,OAAQqE,EAAS,IAEjBqB,EAAA,cAACmB,GAAA,IAAY,CACf,EACCjF,GACC8D,EAAA,cAAC6B,GAAA,CACC,UAAW1B,EAAa,gCAAiCtE,CAAU,EACnE,WAAYA,EACZ,OAAQ8C,EAAS,IAEjBqB,EAAA,cAAC8B,GAAA,CAAiB,WAAYjG,EAAY,CAC5C,CAEJ,CAEJ,CACF,CAEJ,EAEOkG,GAAQ9G,GD1hBf,OAAS,UAAA+G,OAAc,eAsFhB,IAAMC,GAERC,GAiBC,CAjBD,IAAAC,EAAAD,EACH,QAAAE,EACA,gBAAAC,EACA,WAAAC,EACA,iBAAAC,EACA,cAAAC,EACA,2BAAAC,EAA6B,GAC7B,UAAAC,EACA,YAAAC,EACA,gBAAAC,EAAkB,OAClB,kBAAAC,EAAoB,GACpB,gBAAAC,EAAkB,YAClB,WAAAC,EACA,eAAAC,EAAiB,GACjB,YAAAC,EAAc,WACd,UAAAC,CA5GF,EA6FKf,EAgBAgB,EAAAC,GAhBAjB,EAgBA,CAfH,SACA,kBACA,aACA,mBACA,gBACA,6BACA,YACA,cACA,kBACA,oBACA,kBACA,aACA,iBACA,cACA,cAGA,GAAM,CACJ,QAAAkB,EACA,aAAAC,EACA,UAAAC,EACA,6BAAAC,EACA,kBAAAC,EACA,gBAAAC,EACA,kBAAAC,EACA,gBAAAC,EACA,sBAAAC,EACA,oBAAAC,EACA,cAAAC,EACA,cAAAC,EACA,cAAAC,EACA,0BAAAC,CACF,EAAIC,GAAS,EACP,CAAE,2BAAAC,CAA2B,EAAIC,GAAkB,EACnD,CAAE,2BAAAC,EAA4B,6BAAAC,CAA6B,EAAIC,GAAuB,EACtF,CAAE,cAAAC,EAAc,EAAIC,GAAa,EACjCC,EAAeb,EAAoB1B,CAAM,EACzC,CAAE,eAAAwC,EAAe,EAAIC,GAAWC,EAAc,EAE9C,CAAE,2BAAAC,EAA2B,EAAIC,GAAS,EAQhD,GANA1C,EAAayC,GAA2BzC,CAAU,EAElD2C,GAAU,IAAM,CACdpB,EAAsBxB,CAAe,CACvC,EAAG,CAACA,EAAiBkB,CAAS,CAAC,EAE3Ba,EACF,OAAO,KAGT,IAAMc,GAAO7B,EAAQjB,CAAM,EAc3B,GAbI,CAAC8C,IAID1B,EAA6B0B,EAAI,GAIjCjB,EAAc7B,CAAM,GAAK+C,IAKzBV,GAAc,EAChB,OAAO,KAGT,IAAMW,EAAuB9B,EAAalB,CAAM,EAGhD,GAAI,OAAO,KAAKwC,EAAc,EAAE,OAAS,EAAG,CAC1C,IAAMS,EAAc,OAAO,KAAKT,EAAc,EAAE,KAC7CU,GAAYV,GAAeU,CAAO,IAAM,EAC3C,EACA,GAAID,IAAgB,QAAaA,IAAgBjD,EAC/C,OAAOmD,GAAA,cAAAA,GAAA,aAAE,EAIb,SAAeC,EAAqBC,EAAoB,QAAAC,EAAA,sBAItD,GAHA,MAAMjC,EAAkBrB,EAAQqD,EAAS,EAAE,EAIzCL,EACG,IAAKO,GAAmB5B,EAAc3B,EAAQuD,EAAK,EAAE,CAAC,EACtD,MAAOC,GAAWA,IAAWC,EAAc,EAC9C,CACA,MAAMlC,EAAkBvB,CAAM,EAC9B,OAEE,CAACS,GAAqB8B,EAAe,EAAIS,EAAM,QAAU,CAAC3C,GAExDuB,EAAc5B,EAAQgD,EAAMT,EAAe,CAAC,EAAE,EAAE,CAIxD,GAEA,SAASmB,GAA6BH,EAAgBI,EAA8BC,GAAa,CAC/F,IAAMC,GAAgBtB,EAAe,EAAIS,EAAM,OAASA,EAAMT,EAAe,CAAC,EAAI,KAC9EnC,GACFA,EAAcmD,EAAMhB,EAAcoB,EAAKE,EAAa,EAElD1D,GACFA,EAAiBoD,EAAMK,GAAKC,EAAa,CAE7C,CAEA,SAASC,IAAW,CAClB,OAAOd,EAAM,IAAKO,GACTQ,EAAAC,EAAA,GACFT,GADE,CAEL,2BAA4B,IAAYD,EAAA,sBAEtCnB,EAA6BoB,CAAI,EAC7BA,EAAK,YAAc,KACrB,MAAMlC,EAAkBrB,EAAQuD,EAAK,GAAI,CAAE,QAAS,EAAK,CAAC,GAE5DG,GAA6BH,EAAM,YAAahB,CAAY,CAC9D,GACA,yBAA0B,IAAYe,EAAA,uBAEjC,CAACC,EAAK,qBACJA,EAAK,mBAAqBA,EAAK,oBAAsB,SACvDA,EAAK,oBAAsBA,EAAK,oBAAsB,MAEvD,MAAMH,EAAqBG,CAAI,GAEjCG,GAA6BH,EAAM,UAAWhB,CAAY,EAC1DL,EAA2BqB,CAAI,CACjC,EACF,EACD,CACH,CAEA,SAAeU,GAAiBZ,EAAoB,QAAAC,EAAA,sBAC9ChD,GACFA,EAAU,EAERI,IAAoB,YACtB,MAAMc,EAAgBxB,CAAM,EAE5B,MAAMqB,EAAkBrB,EAAQqD,EAAS,EAAE,CAE/C,GAEA,SAASa,IAAiB,CACpBvD,GACFA,EAAW,CAEf,CAEA,SAAewD,GAAkBC,EAAe,QAAAd,EAAA,sBAC9C,MAAMhC,EAAgBtB,EAAQgD,EAAMoB,CAAK,EAAE,EAAE,CAC/C,GAEA,IAAMC,EAA2B,CAAS,SAAS,cAAcrB,EAAMT,CAAY,EAAE,QAAQ,EAE7F,SAAS+B,GAAyB,CAChC,IAAMC,EAAoBvB,EAAM,UAAU,CAACO,EAAMK,KACxC,EAAQ,SAAS,cAAcL,EAAK,QAAQ,GAAMK,IAAOrB,CACjE,EAED,OAAOS,EAAM,IAAI,CAACO,EAAgBK,KAC5BvD,EAEA8C,GAAA,cAACqB,GAAAR,EAAA,CACC,IAAKT,EAAK,GACV,WAAYrD,EACZ,MAAO4D,GAAS,EAChB,aAAcF,GACd,2BAA4BvD,EAC5B,YAAaE,EACb,UAAW,IAAM0D,GAAiBV,CAAI,EACtC,gBAAiB/C,EACjB,kBAAmBC,EACnB,oBAAqBqB,EAA0B9B,CAAM,EACrD,WAAYkE,GACZ,YAAarD,EACb,cAAesD,GACf,UAAWrD,GACPC,EACN,EAIAH,GAAkByD,GAA4BT,KAAQW,EAEtDpB,GAAA,cAACqB,GAAAR,EAAA,CACC,IAAKT,EAAK,GACV,WAAYrD,EACZ,MAAO4D,GAAS,EAChB,aAAcF,GACd,2BAA4BvD,EAC5B,YAAaE,EACb,UAAW,IAAM0D,GAAiBV,CAAI,EACtC,gBAAiB/C,EACjB,kBAAmBC,EACnB,oBAAqBqB,EAA0B9B,CAAM,EACrD,WAAYkE,GACZ,YAAarD,EACb,cAAesD,GACf,UAAWrD,GACPC,EACN,EAIA6C,IAAOrB,EACF,KAIPY,GAAA,cAACqB,GAAAR,EAAA,CACC,IAAKT,EAAK,GACV,WAAYrD,EACZ,MAAO4D,GAAS,EAChB,aAAcF,GACd,2BAA4BvD,EAC5B,YAAaE,EACb,UAAW,IAAM0D,GAAiBV,CAAI,EACtC,gBAAiB/C,EACjB,kBAAmBC,EACnB,oBAAqBqB,EAA0B9B,CAAM,EACrD,WAAYkE,GACZ,YAAarD,EACb,cAAesD,GACf,UAAWrD,GACPC,EACN,CAEH,CACH,CAEA,SAAS0D,IAAc,CACrB,OACEtB,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACuB,GAAA,CAAmB,WAAYxE,EAAY,EAC3CoE,EAAuB,CAC1B,CAEJ,CAEA,OAAIzD,IAAgB,SACX4D,GAAY,EAGdtB,GAAA,cAACwB,GAAA,KAAQF,GAAY,CAAE,CAChC,EIzVA,OAAOG,IAAa,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QAIvD,OAAS,UAAAC,OAAc,eCJvB,OAAOC,OAAY,oBAGZ,IAAMC,GAAgBC,GAAO;AAAA,IAC/BC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmB/BE,GAAeH,GAAO;AAAA,IAC9BC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA,EAK/BG,GAAuBJ,GAAO;AAAA,IACtCC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA,EAM/BI,GAA0BL,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYjCM,GAAuBN,GAAO;AAAA,IACtCC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgB/BM,GAAqBP,GAAO;AAAA,IACpCC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAa7BA,GAAWA,EAAM,MAAQ,SAAW,WAAa;AAAA,SACtDA,GAAWA,EAAM,MAAQ,SAAW,OAAS;AAAA,iBACrCA,GAAWA,EAAM,MAAQ,SAAW,SAAW;AAAA,EAGpDO,GAAqBR,GAAO;AAAA,IACpCC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ECrF5C,OAAOQ,OAA8B,QAE9B,IAAMC,GAAW,CAAC,CACvB,MAAAC,EACA,UAAAC,CACF,IAKEH,GAAA,cAAC,OACC,MAAM,6BACN,MAAM,KACN,OAAO,KACP,KAAK,OACL,QAAQ,YACR,MAAOE,EACP,UAAWC,GAEXH,GAAA,cAAC,QACC,KAAK,eACL,EAAE,0lBACH,CACH,ECvBF,OAAOI,OAA8B,QAE9B,IAAMC,GAAiB,CAAC,CAC7B,MAAAC,EACA,UAAAC,CACF,IAKEH,GAAA,cAAC,OACC,MAAOE,EACP,UAAWC,EACX,MAAM,6BACN,KAAK,OACL,QAAQ,YACR,YAAY,MACZ,OAAO,gBAEPH,GAAA,cAAC,QACC,cAAc,QACd,eAAe,QACf,EAAE,uMACJ,CACF,EHGK,IAAMI,GAAsD,CAAC,CAClE,OAAAC,EACA,MAAAC,EACA,iBAAAC,EACA,QAAAC,EAAU,GACV,KAAAC,EAAO,SACP,MAAAC,EAAQ,OACR,WAAAC,CACF,IAAM,CACJ,GAAM,CACJ,QAAAC,EACA,aAAAC,EACA,kBAAAC,EACA,cAAAC,EACA,0BAAAC,EACA,UAAAC,EACA,6BAAAC,CACF,EAAIC,GAAS,EACP,CAAE,2BAAAC,CAA2B,EAAIC,GAAuB,EACxDC,EAAaC,GAAO,IAAI,EACxB,CAACC,EAAUC,CAAW,EAAIC,GAAS,EAAK,EACxC,CAAE,2BAAAC,CAA2B,EAAIC,GAAS,EAEhDjB,EAAagB,EAA2BhB,CAAU,EAGlDkB,GAAU,KACR,SAAS,iBAAiB,QAASC,EAAoB,EAAK,EACrD,IAAM,CACX,SAAS,oBAAoB,QAASA,EAAoB,EAAK,CACjE,GACC,CAAC,CAAC,EAEL,IAAMA,EAAsBC,GAAU,CAChCT,EAAW,SAAW,CAACA,EAAW,QAAQ,SAASS,EAAM,MAAM,GACjEN,EAAY,EAAK,CAErB,EAEA,GAAIR,EACF,OAAO,KAET,IAAMe,EAAOpB,EAAQP,CAAM,EAK3B,GAJI,CAAC2B,GAIDd,EAA6Bc,CAAI,EACnC,OAAO,KAGT,IAAMC,EAAoBpB,EAAaR,CAAM,EAK7C,GAJI,CAAC4B,GAID,CAACzB,EACH,OAAO,KAGT,SAAS0B,EAAyBC,EAAgBC,EAAe,CAE7D,CAACD,EAAK,qBACLA,EAAK,mBAAqBA,EAAK,oBAAsB,SAEtDrB,EAAkBT,EAAQ8B,EAAK,EAAE,EAEnCf,EAA2Be,CAAI,EAC3B5B,GACFA,EAAiB4B,EAAMC,CAAK,EAE9BX,EAAY,EAAK,CACnB,CAEA,SAASY,GAAO,CACd,OACEb,GACEc,GAAA,cAACC,GAAA,CACC,UAAWC,EAAa,qBAAsB7B,CAAU,EACxD,QAAS,CAAE,QAAS,CAAE,EACtB,QAAS,CAAE,QAAS,CAAE,EACtB,KAAM,CAAE,QAAS,CAAE,EACnB,WAAY,CAAE,SAAU,EAAI,EAC5B,KAAMF,GAELwB,EAAM,IAAI,CAACE,EAAMC,IAChBE,GAAA,cAACG,GAAA,CACC,UAAWD,EAAa,yBAA0B7B,CAAU,EAC5D,IAAKyB,EACL,QAAS,IAAMF,EAAyBC,EAAMC,CAAK,GAElDD,EAAK,KACR,CACD,CACH,CAGN,CAEA,OAAI1B,GAAQ,SAER6B,GAAA,cAAC,QAAK,IAAKhB,GACTgB,GAAA,cAACI,GAAA,CAAmB,WAAY/B,EAAY,EAC5C2B,GAAA,cAACK,GAAA,CACC,MAAOrC,EACP,QAAS,IAAM,CACbmB,EAAY,CAACD,CAAQ,CACvB,EACA,UAAWgB,EAAa,gBAAiB7B,CAAU,GAEnD2B,GAAA,cAACM,GAAA,CAAqB,UAAWJ,EAAa,uBAAwB7B,CAAU,GAC9E2B,GAAA,cAACO,GAAA,CACC,UAAWL,EAAa,cAAe7B,CAAU,EACjD,MAAO,CAAE,MAAO,OAAQ,OAAQ,MAAO,EACzC,CACF,EACA2B,GAAA,cAACQ,GAAA,CAAa,UAAWN,EAAa,qBAAsB7B,CAAU,GACnED,CACH,CACF,EACA4B,GAAA,cAACD,EAAA,IAAK,CACR,EAKFC,GAAA,cAACS,GAAA,KACCT,GAAA,cAACI,GAAA,CAAmB,WAAY/B,EAAY,EAC5C2B,GAAA,cAACU,GAAA,CAAwB,MAAO1C,EAAO,IAAKgB,GAC1CgB,GAAA,cAACD,EAAA,IAAK,EACNC,GAAA,cAACW,GAAA,CACC,QAAS,IAAM,CACbxB,EAAY,CAACD,CAAQ,CACvB,EACA,WAAY,CAAE,MAAO,GAAI,EACzB,UAAWgB,EAAa,uBAAwB7B,CAAU,GAE1D2B,GAAA,cAACY,GAAA,CACC,UAAWV,EAAa,2BAA4B7B,CAAU,EAC9D,MAAO,CAAE,QAAS,OAAQ,MAAO,OAAQ,OAAQ,MAAO,EAC1D,CACF,CACF,CACF,CAEJ,EI3KA,OAAOwC,IAAS,aAAAC,OAAiB,QCDjC,OAAOC,OAAY,oBAGZ,IAAMC,GAAuBC,GAAO;AAAA,IACtCC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAQnBA,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA,oBAErCA,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA,EAKzCE,GAAgBH,GAAO;AAAA;AAAA;AAAA;AAAA,EAKvBI,GAAwBJ,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS/BK,GAAgBL,GAAO;AAAA,IAC/BC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EClC5C,OAAOK,OAAY,oBAGZ,IAAMC,GAAwBC,GAAO;AAAA,IACvCC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAOnBA,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA;AAAA,EAI7CE,GAAgBH,GAAO;AAAA;AAAA;AAAA;AAAA,EAMvBI,GAAsBJ,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS7BK,GAAwBL,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS/BM,GAAiBN,GAAO;AAAA;AAAA;AAAA,EAKxBO,GAAgBP,GAAO;AAAA,IAC/BC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAY/BO,GAAcR,GAAO;AAAA,IAC7BC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAU9BA,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA;AAAA,EAKlCQ,GAAiBT,GAAO;AAAA,IAChCC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA,aAK9BA,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;EC7E/C,OAAOS,OAAW,QAClB,OAAOC,OAAY,oBAGZ,IAAMC,GAAQC,GAAO;AAAA;AAAA;AAAA;AAAA,mBAIRC,GAAUA,EAAM,WAAW,MAAM;AAAA,EAG9C,SAASC,GAAM,CACpB,SAAAC,EACA,WAAAC,EACA,YAAAC,EAAc,EAChB,EAIG,CArBH,IAAAC,EAsBE,OAAIH,EAAS,SAETI,GAAA,cAACC,GAAA,CACC,WAAYJ,EACZ,SAAUD,EAAS,SACnB,UAAUG,EAAAH,EAAS,QAAT,YAAAG,EAAgB,cAC5B,EAIAH,EAAS,SAETI,GAAA,cAACR,GAAA,CACC,UAAWU,EAAa,GAAGJ,SAAoBD,CAAU,EACzD,WAAYA,EACZ,IAAKD,EAAS,SAChB,EAIG,IACT,CHnBO,IAAMO,GAAwD,CAAC,CACpE,OAAAC,EACA,UAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,WAAAC,EACA,UAAAC,EACA,MAAAC,EACA,YAAAC,EACA,QAAAC,CACF,IAAM,CACJ,GAAM,CACJ,QAAAC,EACA,kBAAAC,EACA,gBAAAC,EACA,kBAAAC,EACA,UAAAC,EACA,6BAAAC,EACA,sBAAAC,EACA,aAAAC,EACA,cAAAC,EACA,oBAAAC,CACF,EAAIC,GAAS,EACP,CAAE,2BAAAC,EAA4B,6BAAAC,CAA6B,EAAIC,GAAuB,EACtF,CAAE,2BAAAC,CAA2B,EAAIC,GAAS,EAShD,GARAC,GAAmBzB,CAAM,EAEzBI,EAAamB,EAA2BnB,CAAU,EAElDsB,GAAU,IAAM,CACdX,EAAsBb,CAAe,CACvC,EAAG,CAACA,EAAiBW,CAAS,CAAC,EAE3BA,EACF,OAAO,KAGT,IAAMc,EAAOlB,EAAQT,CAAM,EAS3B,GARI,CAAC2B,GAIDb,EAA6Ba,CAAI,GAIjCV,EAAcjB,CAAM,IAAM4B,GAC5B,OAAO,KAKT,IAAMC,EAFQb,EAAahB,CAAM,EAEPkB,EAAoBlB,CAAM,CAAC,EAErD,OACE8B,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAmB,WAAY3B,EAAY,EAC5C0B,GAAA,cAACE,GAAA,CACC,WAAY5B,EACZ,UAAW6B,GAAaC,EAAa,uBAAwB9B,CAAU,EAAGC,CAAS,EACnF,MAAOC,EACP,QAASE,IAEPD,IAAgB,IAAQsB,EAAY,cACpCC,GAAA,cAACK,GAAA,CACC,QAAS,IAAYC,EAAA,wBACnB,MAAMzB,EAAgBX,CAAM,EACxBC,GACFA,EAAU,CAEd,GACA,UAAWiC,EAAa,2BAA4B9B,CAAU,GAE9D0B,GAAA,cAACO,GAAA,IAAM,CACT,GAEAR,EAAY,UAAYA,EAAY,WACpCC,GAAA,cAACQ,GAAA,CAAe,UAAWJ,EAAa,4BAA6B9B,CAAU,GAC7E0B,GAAA,cAACS,GAAA,CAAM,WAAYnC,EAAY,SAAUyB,EAAa,CACxD,EAEFC,GAAA,cAACU,GAAA,KACCV,GAAA,cAACW,GAAA,CACC,KAAK,QACL,WAAYrC,EACZ,MAAOyB,EAAY,MACnB,SAAUA,EAAY,SACxB,CACF,GACEA,EAAY,oBAAsBA,EAAY,uBAC9CC,GAAA,cAACY,GAAA,CACC,UAAWR,EAAa,mCAAoC9B,CAAU,GAErEyB,EAAY,oBACXC,GAAA,cAACa,GAAA,CACC,YAAY,cACZ,MAAOd,EAAY,mBACnB,WAAYzB,EACZ,WAAY,GACZ,KAAK,SACL,KAAK,SACL,QAAS,IAAYgC,EAAA,wBACnBP,EAAY,yBAAyB,EACrCT,EAA2BS,CAAW,EAClC,EAAA1B,GACaA,EACb0B,EACAX,EAAoBlB,CAAM,EAC1B,SACF,IACe,MAIjB,MAAMY,EAAkBZ,EAAQ6B,EAAY,EAAE,EAC9C,MAAMnB,EAAkBV,CAAM,EAChC,GACF,EAED6B,EAAY,sBACXC,GAAA,cAACa,GAAA,CACC,YAAY,cACZ,MAAOd,EAAY,qBACnB,WAAYzB,EACZ,WAAY,GACZ,KAAK,SACL,KAAK,SACL,QAAS,IAAYgC,EAAA,wBACnBP,EAAY,2BAA2B,EACvCR,EAA6BQ,CAAW,EACpC1B,GACaA,EACb0B,EACAX,EAAoBlB,CAAM,EAC1B,WACF,CAKJ,GACA,UAAS,GACX,CAEJ,CAEJ,CACF,CAEJ,EI7KA,OAAO4C,IAAS,aAAAC,OAAiB,QCAjC,OAAOC,OAAY,oBAGZ,IAAMC,GAAkBC,GAAO;AAAA;AAAA,IAEjCC,GAAUC,EAAwBD,CAAK;AAAA;AAAA,sBAErBA,GAAWA,EAAM,OAAS,SAAW,SAAW;AAAA;AAAA;AAAA;AAAA,mBAInDA,GAAWA,EAAM,OAAS,SAAW,QAAU;AAAA,wBAC1CA,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA;AAAA,EAK7CE,GAAgBH,GAAO;AAAA,IAC/BC,GAAUC,EAAwBD,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAO/BG,GAAgBJ,GAAO;AAAA;AAAA;AAAA;AAAA,iBAIlBC,GAAWA,EAAM,OAAS,SAAW,MAAQ;AAAA,gBAC9CA,GAAWA,EAAM,OAAS,SAAW,OAAS;AAAA,EAElDI,GAAwBL,GAAO;AAAA;AAAA;AAAA;AAAA,iBAI1BC,GAAWA,EAAM,OAAS,SAAW,MAAQ;AAAA,EAGlDK,GAAgBN,GAAO;AAAA;AAAA,qBAEdC,GAAWA,EAAM,OAAS,SAAW,WAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ3DM,GAAyBP,GAAO;AAAA;AAAA,qBAEvBC,GAAWA,EAAM,OAAS,SAAW,WAAa;AAAA;AAAA,iBAEtDA,GAAWA,EAAM,OAAS,SAAW,MAAQ;ECrD/D,OAAOO,OAA8B,QAE9B,IAAMC,GAAO,CAAC,CACnB,MAAAC,EACA,UAAAC,CACF,IAKEH,GAAA,cAAC,OACC,MAAM,6BACN,MAAM,KACN,OAAO,KACP,KAAK,OACL,QAAQ,YACR,MAAOE,EACP,UAAWC,GAEXH,GAAA,cAAC,UAAO,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,KAAK,UAAU,EAC9CA,GAAA,cAAC,QACC,OAAO,UACP,cAAc,QACd,eAAe,QACf,YAAY,MACZ,EAAE,0RACH,CACH,EFkBK,IAAMI,GAA8C,CAAC,CAC1D,OAAAC,EACA,MAAAC,EACA,SAAAC,EACA,UAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,WAAAC,EACA,KAAAC,EAAO,aACP,KAAAC,EACA,QAAAC,CACF,IAAM,CACJ,GAAM,CACJ,QAAAC,EACA,kBAAAC,EACA,gBAAAC,EACA,UAAAC,EACA,6BAAAC,EACA,sBAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,aAAAC,EACA,oBAAAC,CACF,EAAIC,GAAS,EACP,CAAE,2BAAAC,CAA2B,EAAIC,GAAuB,EACxD,CAAE,2BAAAC,CAA2B,EAAIC,GAAS,EAShD,GARAC,GAAmBzB,CAAM,EAEzBM,EAAaiB,EAA2BjB,CAAU,EAElDoB,GAAU,IAAM,CACdX,EAAsBX,CAAe,CACvC,EAAG,CAACA,EAAiBS,CAAS,CAAC,EAE3BA,EACF,OAAO,KAGT,IAAMc,EAAOjB,EAAQV,CAAM,EAS3B,GARI,CAAC2B,GAIDb,EAA6Ba,CAAI,GAIjCV,EAAcjB,CAAM,IAAM4B,GAC5B,OAAO,KAGT,IAAMC,EAAQX,EAAalB,CAAM,EAE3B8B,EACJD,EAAM,OAAS,EAAIA,EAAMV,EAAoBnB,CAAM,CAAC,EAAIgB,EAAgBhB,CAAM,EAGhF,OAAI8B,GAAA,MAAAA,EAAU,QACZ7B,EAAQ6B,EAAS,OAEfA,GAAA,MAAAA,EAAU,WACZ5B,EAAW4B,EAAS,UAIpBC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAmB,WAAY1B,EAAY,EAC5CyB,GAAA,cAACE,GAAA,CACC,KAAM1B,EACN,WAAYD,EACZ,UAAW4B,EAAa,kBAAmB5B,CAAU,EACrD,QAASG,GAERF,GAAQ,UACPwB,GAAA,cAACI,GAAA,CAAc,UAAWD,EAAa,sBAAuB5B,CAAU,GACrEE,GAAcuB,GAAA,cAACK,GAAA,IAAK,CACvB,EAED7B,IAAS,UAAYuB,EAAS,aAC7BC,GAAA,cAACM,GAAA,CACC,KAAM9B,EACN,UAAW2B,EAAa,+BAAgC5B,CAAU,GAElEyB,GAAA,cAACO,GAAA,CACC,KAAM/B,EACN,QAAS,IAAYgC,EAAA,wBACnB,MAAM3B,EAAgBZ,CAAM,EACxBG,GACFA,EAAU,CAEd,GACA,UAAW+B,EAAa,sBAAuB5B,CAAU,GAEzDyB,GAAA,cAACS,GAAA,IAAM,CACT,CACF,EAEFT,GAAA,cAACU,GAAA,CAAc,KAAMlC,GACnBwB,GAAA,cAACW,GAAA,CACC,WAAYpC,EACZ,MAAOL,EACP,SAAUC,EACV,YAAY,SACd,CACF,GACC4B,GAAA,YAAAA,EAAU,qBACTC,GAAA,cAACY,GAAA,CACC,KAAMpC,EACN,UAAW2B,EAAa,8BAA+B5B,CAAU,GAEjEyB,GAAA,cAACa,GAAA,CACC,MAAOd,GAAA,YAAAA,EAAU,mBACjB,WAAYxB,EACZ,QAAS,IAAM,CACbe,EAA2BS,CAAQ,EAC/BzB,GACFA,EAAcyB,EAAU,EAAG,SAAS,CAExC,EACA,YAAY,SACd,CACF,EAEDvB,IAAS,UAAYuB,EAAS,aAC7BC,GAAA,cAACM,GAAA,CACC,KAAM9B,EACN,UAAW2B,EAAa,+BAAgC5B,CAAU,GAElEyB,GAAA,cAACO,GAAA,CACC,KAAM/B,EACN,QAAS,IAAYgC,EAAA,wBACnB,MAAM3B,EAAgBZ,CAAM,EACxBG,GACFA,EAAU,CAEd,GACA,UAAW+B,EAAa,sBAAuB5B,CAAU,GAEzDyB,GAAA,cAACS,GAAA,IAAM,CACT,CACF,CAEJ,CACF,CAEJ,EG7LA,OAAOK,IAAS,aAAAC,OAAiB,QAMjC,OAAS,UAAAC,OAAc,eCPvB,OAAOC,OAAY,oBAGZ,IAAMC,GAAqBC,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAQlBC,GAAUA,EAAM,WAAW,MAAM;AAAA,cACzCA,GAAWA,EAAM,MAAQ,QAAU,QAAU;AAAA;AAAA;AAAA;AAAA,IAIvDA,GACDA,EAAM,MAAQ,QACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAOWA,GAAUA,EAAM,WAAW,MAAM;AAAA,mBAChCA,GAAUA,EAAM,WAAW,MAAM,kBAC7C;AAAA,EAGKC,GAAkBF,GAAO;AAAA,sBACfC,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA;AAAA,kBAGrCA,GACfA,EAAM,SAAWA,EAAM,WAAW,MAAM,aAAeA,EAAM,WAAW,MAAM;AAAA,WACtEA,GACRA,EAAM,SAAWA,EAAM,WAAW,MAAM,aAAeA,EAAM,WAAW,MAAM;AAAA;AAAA,oBAE7DA,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA;AAAA,oBAGjCA,GAAUA,EAAM,WAAW,MAAM;AAAA,aACxCA,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYlCE,GAA2BH,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlCI,GAAoBJ,GAAO;AAAA;AAAA;AAAA;AAAA,EAM3BK,GAAWL,GAAO;AAAA;AAAA;AAAA,WAGnBC,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA,EAMhCK,GAAgBN,GAAO;AAAA;AAAA;AAAA;AAAA,EAKvBO,GAAwBP,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ/BQ,GAAWR,GAAO;AAAA,IAC1BC,GAAUQ,EAAwBR,CAAK;AAAA,aAC9BA,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA,wBAEtBA,GAAUA,EAAM,WAAW,MAAM;AAAA,qBACpCA,GAAUA,EAAM,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU1CS,GAAgBV,GAAO;AAAA,IAC/BC,GAAUQ,EAAwBR,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ED5ErC,IAAMU,GAAoD,CAAC,CAChE,OAAAC,EACA,UAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,WAAAC,EACA,UAAAC,EACA,MAAAC,EACA,KAAAC,EAAO,OACT,IAAM,CACJ,GAAM,CACJ,QAAAC,EACA,kBAAAC,EACA,gBAAAC,EACA,kBAAAC,EACA,0BAAAC,EACA,UAAAC,EACA,6BAAAC,EACA,sBAAAC,EACA,aAAAC,EACA,cAAAC,EACA,gBAAAC,CACF,EAAIC,GAAS,EACP,CAAE,2BAAAC,CAA2B,EAAIC,GAAuB,EACxD,CAAE,2BAAAC,CAA2B,EAAIC,GAAS,EAC1C,CAACC,EAAOC,CAAQ,EAAIC,GAAM,SAAwB,IAAI,EACtD,CAACC,EAAcC,CAAe,EAAIF,GAAM,SAAiB,EAAE,EAC3DG,EAAWX,EAAgBlB,CAAM,EACjC,CACJ,cAAA8B,EACA,sCAAAC,EACA,yCAAAC,CACF,EAAIC,GAAa,EASjB,GARAC,GAAmBlC,CAAM,EAEzBI,EAAakB,EAA2BlB,CAAU,EAElD+B,GAAU,IAAM,CACdpB,EAAsBb,CAAe,CACvC,EAAG,CAACA,EAAiBW,CAAS,CAAC,EAE3BA,EACF,OAAO,KAGT,IAAMuB,EAAO5B,EAAQR,CAAM,EAoB3B,GAnBI,CAACoC,GAIDtB,EAA6BsB,CAAI,GAIjCnB,EAAcjB,CAAM,IAAMqC,IAK5BzB,EAA0BZ,CAAM,IAAM,GACtC,CAACgC,EAAyChC,CAAM,GAK9C8B,EAAc,EAChB,OAAO,KAKT,IAAMQ,EAFQtB,EAAahB,CAAM,EAEPY,EAA0BZ,CAAM,CAAC,EAE3D,SAASuC,GAAkB,CAvG7B,IAAAC,GAAAC,EAwGI,OACEf,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACgB,GAAA,KACChB,GAAA,cAACiB,GAAA,CACC,KAAK,QACL,WAAYvC,EACZ,MAAOkC,EAAY,MACnB,SAAUA,EAAY,SACxB,CACF,EACAZ,GAAA,cAACkB,GAAA,CACC,UAAWC,EAAa,2BAA4BzC,CAAU,EAC9D,WAAYA,GAEX,MAAM,KAAK,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,IAAK0C,IACjCpB,GAAA,cAACqB,GAAA,CACC,UAAWF,EAAa,kBAAmBzC,CAAU,EACrD,SAAUoB,IAAUsB,GAAI,EACxB,IAAKA,GACL,QAAS,IAAYE,EAAA,sBACnBjB,EAAsC/B,CAAM,EAC5CyB,EAASqB,GAAI,CAAC,EACd,MAAMnC,EAAkBX,EAAQsC,EAAY,GAAI,CAAE,MAAOQ,GAAI,CAAE,CAAC,CAClE,GACA,WAAY1C,GAEX0C,GAAI,CACP,CACD,CACH,EACApB,GAAA,cAACuB,GAAA,CAAkB,WAAY7C,GAC7BsB,GAAA,cAACwB,GAAA,CAAS,WAAY9C,IACnBoC,GAAAX,GAAA,YAAAA,EAAU,gBAAV,KAAAW,GAA2B,mBAC9B,EACAd,GAAA,cAACwB,GAAA,CAAS,WAAY9C,IACnBqC,EAAAZ,GAAA,YAAAA,EAAU,gBAAV,KAAAY,EAA2B,kBAC9B,CACF,CACF,CAEJ,CAEA,SAASU,GAAiB,CAlJ5B,IAAAX,GAmJI,OACEd,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACgB,GAAA,KACChB,GAAA,cAACiB,GAAA,CACC,WAAYvC,EACZ,OAAOoC,GAAAF,EAAY,QAAZ,KAAAE,GAAqB,iCAC5B,KAAK,QACP,CACF,EACAd,GAAA,cAAC0B,GAAA,CACC,WAAYhD,EACZ,MAAOuB,EACP,SAAW0B,GAAM,CACfzB,EAAgByB,EAAE,OAAO,KAAK,CAChC,EACA,YAAY,qCACb,EACD3B,GAAA,cAACkB,GAAA,CACC,WAAYxC,EACZ,UAAWyC,EAAa,2BAA4BzC,CAAU,GAE9DsB,GAAA,cAAC4B,GAAA,CACC,KAAM,QACN,WAAY,GACZ,QAAS,IAAYN,EAAA,sBACnB,MAAMvC,EAAkBT,CAAM,EAC1BG,GACFA,EAAcmC,EAAa,EAAG,SAAS,CAE3C,GACA,WAAYlC,EACZ,MAAOkC,EAAY,sBAAwB,OAC3C,UAAS,GACX,EACAZ,GAAA,cAAC4B,GAAA,CACC,KAAM,QACN,WAAY,GACZ,QAAS,IAAYN,EAAA,sBACnB,MAAMrC,EAAkBX,EAAQsC,EAAY,GAAI,CAAE,aAAAX,CAAa,CAAC,EAChE,MAAMlB,EAAkBT,CAAM,EAC1BG,GACFA,EAAcmC,EAAa,EAAG,SAAS,CAE3C,GACA,WAAYlC,EACZ,MAAOkC,EAAY,oBAAsB,SAC3C,CACF,CACF,CAEJ,CAEA,SAASiB,GAAa,CACpB,OAAI3C,EAA0BZ,CAAM,GAAK,EAChC,KAIP0B,GAAA,cAAAA,GAAA,cACEA,GAAA,cAAC8B,GAAA,CAAmB,WAAYpD,EAAY,EAC5CsB,GAAA,cAAC+B,GAAA,CACC,WAAYrD,EACZ,UAAWsD,GAAab,EAAa,qBAAsBzC,CAAU,EAAGC,CAAS,EACjF,MAAOC,EACP,KAAMC,GAENmB,GAAA,cAACiC,GAAA,CACC,QAAS,IAAYX,EAAA,sBACnB,MAAMtC,EAAgBV,CAAM,EACxBC,GACFA,EAAU,CAEd,GACA,UAAW4C,EAAa,yBAA0BzC,CAAU,GAE5DsB,GAAA,cAACkC,GAAA,IAAM,CACT,EACChD,EAA0BZ,CAAM,GAAK,GAAKuC,EAAgB,EAC1D3B,EAA0BZ,CAAM,GAAK,GAAKmD,EAAe,CAC5D,CACF,CAEJ,CAEA,OAAI5C,IAAS,SACJgD,EAAW,EAGb7B,GAAA,cAACmC,GAAA,KAAQN,EAAW,CAAE,CAC/B,EE3OA,OAAOO,IAAwB,aAAAC,OAAiB,QA4CzC,IAAMC,GAA0D,CAAC,CACtE,OAAAC,EACA,UAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,WAAAC,EACA,UAAAC,EACA,MAAAC,EACA,YAAAC,EAAc,GACd,cAAAC,EAAgB,SAChB,eAAAC,EAAiB,GACjB,oBAAAC,CACF,IAAM,CACJ,GAAM,CACJ,QAAAC,EACA,kBAAAC,EACA,gBAAAC,EACA,kBAAAC,EACA,gBAAAC,EACA,UAAAC,EACA,6BAAAC,EACA,sBAAAC,EACA,aAAAC,EACA,cAAAC,EACA,oBAAAC,CACF,EAAIC,GAAS,EACP,CAAE,2BAAAC,EAA4B,6BAAAC,CAA6B,EAAIC,GAAuB,EACtF,CAAE,2BAAAC,CAA2B,EAAIC,GAAS,EAC1C,CAAE,iBAAAC,EAAkB,iBAAAC,EAAkB,cAAAC,CAAc,EAAIC,GAAa,EAC3EC,GAAmBhC,CAAM,EAEzB,GAAM,CAACiC,EAAWC,CAAY,EAAI,CAChCL,EAAiB7B,EAAQ,EAAI,EAC5BmC,IAAUP,EAAiB5B,EAAQmC,EAAK,CAC3C,EAQA,GANA/B,EAAasB,EAA2BtB,CAAU,EAElDgC,GAAU,IAAM,CACdlB,EAAsBhB,CAAe,CACvC,EAAG,CAACA,EAAiBc,CAAS,CAAC,EAE3BA,EACF,OAAO,KAGT,IAAMqB,EAAO1B,EAAQX,CAAM,EAa3B,GAZI,CAACqC,GAIDpB,EAA6BoB,CAAI,GAIjCjB,EAAcpB,CAAM,IAAMsC,IAI1BR,EAAc,EAChB,OAAO,KAGT,IAAMS,EAAQpB,EAAanB,CAAM,EAC3BwC,EAAmBnB,EAAoBrB,CAAM,EAC7CyC,EAAaF,EAAM,OAEnBG,EAAcH,EAAMC,CAAgB,EAEpCG,GAAc,IAAYC,EAAA,wBAC9BV,EAAa,EAAK,EAClB,MAAMrB,EAAgBb,CAAM,EACxBC,GACFA,EAAU,CAEd,GAEA,SAAS4C,GAAa,CA1HxB,IAAAC,GA2HI,OACEC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAmB,WAAY5C,EAAY,EAC5C2C,GAAA,cAACE,GAAA,CACC,WAAY7C,EACZ,UAAW8C,GAAaC,EAAa,wBAAyB/C,CAAU,EAAGC,CAAS,EACpF,MAAOC,IAELC,IAAgB,IAAQmC,EAAY,cAAgBlC,GAAiB,UACrEuC,GAAA,cAACK,GAAA,CACC,QAAS,IAAYR,EAAA,sBACnB,MAAM/B,EAAgBb,CAAM,EACxBC,GACFA,EAAU,CAEd,GACA,UAAWkD,EAAa,4BAA6B/C,CAAU,GAE/D2C,GAAA,cAACM,GAAA,IAAM,CACT,EAEFN,GAAA,cAACO,GAAA,KACCP,GAAA,cAACQ,GAAA,CACC,WAAYnD,EACZ,UAAW+C,EAAa,oBAAqB/C,CAAU,EACvD,wBAAyBoD,EAASd,EAAY,KAAK,EACrD,EACCA,EAAY,UACXK,GAAA,cAACU,GAAA,CACC,WAAYrD,EACZ,UAAW+C,EAAa,uBAAwB/C,CAAU,EAC1D,wBAAyBoD,EAASd,EAAY,QAAQ,EACxD,CAEJ,GACEA,EAAY,UAAYA,EAAY,WACpCK,GAAA,cAACW,GAAA,CAAe,UAAWP,EAAa,6BAA8B/C,CAAU,GAC9E2C,GAAA,cAACY,GAAA,CAAM,WAAYvD,EAAY,SAAUsC,EAAa,CACxD,EAGDjC,GAAkBgC,EAAa,GAC9BM,GAAA,cAACa,GAAA,CACC,UAAWT,EAAa,kCAAmC/C,CAAU,GAErE2C,GAAA,cAACc,GAAA,CACC,UAAWV,EAAa,yBAA0B/C,CAAU,EAC5D,WAAYA,EACZ,UAAWqC,EACX,YAAaD,EACf,CACF,GAEAE,EAAY,oBAAsBA,EAAY,uBAC9CK,GAAA,cAACe,GAAA,CACC,oBAAqBpD,EACrB,UAAWyC,EAAa,2BAA4B/C,CAAU,GAE7DM,GAAuB8B,EAAmB,GACzCO,GAAA,cAACgB,GAAA,CACC,YAAY,mBACZ,OAAOjB,GAAAJ,EAAY,kBAAZ,KAAAI,GAA+B,OACtC,WAAY1C,EACZ,WAAY,GACZ,KAAK,QACL,KAAK,aACL,QAAS,IAAYwC,EAAA,sBACfzC,GACFA,EAAcuC,EAAarB,EAAoBrB,CAAM,EAAG,MAAM,EAEhE,MAAMe,EAAgBf,EAAQuC,EAAMC,EAAmB,CAAC,EAAE,EAAE,CAC9D,GACA,UAAS,GACX,EAEDE,EAAY,sBACXK,GAAA,cAACgB,GAAA,CACC,YAAY,eACZ,MAAOrB,EAAY,qBACnB,WAAYtC,EACZ,WAAY,GACZ,KAAK,QACL,KAAK,aACL,QAAS,IAAYwC,EAAA,sBACnBF,EAAY,2BAA2B,EACvClB,EAA6BkB,CAAW,EACpCvC,GACFA,EAAcuC,EAAarB,EAAoBrB,CAAM,EAAG,WAAW,CAEvE,GACA,UAAS,GACX,EAED0C,EAAY,oBACXK,GAAA,cAACgB,GAAA,CACC,YAAY,eACZ,MAAOrB,EAAY,mBACnB,WAAYtC,EACZ,WAAY,GACZ,KAAK,QACL,KAAM,aACN,QAAS,IAAYwC,EAAA,sBACnBrB,EAA2BmB,CAAW,EAClC,EAAAvC,GACaA,EACbuC,EACArB,EAAoBrB,CAAM,EAC1B,SACF,IACe,MAIbqB,EAAoBrB,CAAM,IAAMyC,EAAa,GAC/CC,EAAY,yBAAyB,EACrC,MAAM9B,EAAkBZ,CAAM,GAE9B0C,EAAY,yBAAyB,EAEzC,GACF,CAEJ,CAEJ,CACF,CAEJ,CAEA,IAAMsB,GAA+B,CACnC,QAAS,OACT,SAAU,OACZ,EAEA,OAAIxD,IAAkB,SACbqC,EAAW,EAGhBrC,IAAkB,SAElBuC,GAAA,cAACkB,GAAA,CACC,cAAezD,EACf,QAASmC,GACT,QAASV,EACT,YAAa1B,EACb,WAAYH,GAEXyC,EAAW,CACd,EAKFE,GAAA,cAACmB,GAAA,CACC,WAAY9D,EACZ,QAASuC,GACT,QAASV,EACT,MAAO+B,GACP,YAAazD,GAEZsC,EAAW,CACd,CAEJ,EC9RA,UAAYsB,OAAW,QCAvB,OAAOC,OAAW,QAUlB,IAAMC,GAAqCC,GAKrC,CALqC,IAAAC,EAAAD,EACzC,IAAAE,EAAK,OACL,SAAAC,EACA,QAAAC,EAAU,OAbZ,EAU2CH,EAItCI,EAAAC,GAJsCL,EAItC,CAHH,KACA,WACA,YAGA,OACEM,GAAA,cAACC,GAAAC,EAAA,CACC,MAAM,qBACN,WAAW,UACX,YAAaP,EACb,QAASE,GACLC,GAEHF,CACH,CAEJ,EAEMO,GAAwB,OAAO,YACnC,OAAO,KAAKC,EAAY,EAAE,IAAKP,GAAY,CACzC,IAAMQ,EAAS,CAAC,KAAM,KAAM,KAAM,IAAI,EAAE,SAASR,CAAO,EAAIA,EAAQ,YAAY,EAAI,OAC9ES,EAAaC,GACjBP,GAAA,cAACR,GAAAgB,EAAAN,EAAA,CAAS,GAAIG,GAAYE,GAAzB,CAAgC,QAASV,IACvCU,EAAM,QACT,EAGF,OAAAD,EAAU,YAAc,QAAQT,IAEzB,CAACA,EAASS,CAAS,CAC5B,CAAC,CACH,EAEaG,GAAO,OAAO,OAAOjB,GAAUW,EAAqB,ED/BjE,IAAMO,GAAqCC,GAOrC,CAPqC,IAAAC,EAAAD,EACzC,IAAAE,EAAK,SACL,UAAAC,EACA,KAAAC,EAAO,KACP,MAAAC,EACA,QAAAC,EAAU,SAlBZ,EAa2CL,EAMtCM,EAAAC,GANsCP,EAMtC,CALH,KACA,YACA,OACA,QACA,YAlBF,IAAAD,EAqBE,OACE,iBAACS,GAAAC,EAAA,CACC,UAAW,aAAaJ,EAAQ,YAAY,IAAIH,EAAY,IAAIA,IAAc,KAC9E,YAAaD,EACb,QAASI,EACT,KAAMF,EACN,aAAa,MACTG,GAEJ,iBAACI,GAAA,CAAK,OAAOX,EAAAY,GAAeN,CAAO,IAAtB,YAAAN,EAAyB,MAAO,WAAW,YACrDK,CACH,CACF,CAEJ,EAEMQ,GAA0B,OAAO,YACrC,OAAO,KAAKD,EAAc,EAAE,IAAKN,GAAY,CAC3C,IAAMQ,EAAaC,GAAuB,iBAAChB,GAAAiB,EAAAN,EAAA,GAAeK,GAAf,CAAsB,QAAST,GAAS,EAEnF,OAAAQ,EAAU,YAAc,UAAUR,IAE3B,CAACA,EAASQ,CAAS,CAC5B,CAAC,CACH,EAEaG,GAAS,OAAO,OAAOlB,GAAYc,EAAuB","names":["React","createContext","useEffect","useState","ThemeProvider","React","useContext","useEffect","useState","useCallback","useContext","useEffect","React","useMemo","VERSION_NUMBER","NOT_STARTED_STEP","COMPLETED_FLOW","SKIPPED_FLOW","STARTED_FLOW","NOT_STARTED_FLOW","COMPLETED_STEP","STARTED_STEP","useConfig","publicApiKey","userId","apiUrl","React","FrigadeContext","useMemo","VERSION_NUMBER","LAST_POST_CALL_AT","LAST_POST_CALL_DATA","useGracefulFetch","shouldGracefullyDegrade","readonly","url","options","__async","getEmptyResponse","lastCallAtKey","lastCallDataKey","lastCall","lastCallData","lastCallDate","response","error","useCheckHasInitiatedAPI","verifySDKInitiated","useContext","useState","useContext","useEffect","useState","useSWR","useContext","useFlowOpens","openFlowStates","setOpenFlowStates","hasActiveFullPageFlow","setCompletedFlowsToKeepOpenDuringSession","completedFlowsToKeepOpenDuringSession","useContext","FrigadeContext","getOpenFlowState","flowId","defaultValue","_a","setOpenFlowState","isOpen","prev","__spreadProps","__spreadValues","resetOpenFlowState","_","rest","__objRest","__restKey","setKeepCompletedFlowOpenDuringSession","shouldKeepCompletedFlowOpenDuringSession","hasOpenModals","currentFlowId","useSWRImmutable","structuredClone","isObject","obj","deepmerge","args","target","source","result","key","value","safeParse","stringified","e","UNKNOWN_STEP_ID","useUserFlowStates","config","apiUrl","useConfig","publicApiKey","userId","organizationId","flows","setShouldGracefullyDegrade","readonly","useContext","FrigadeContext","resetOpenFlowState","useFlowOpens","hasFinishedInitialLoad","setHasFinishedInitialLoad","useState","emptyResponse","flow","COMPLETED_FLOW","fetcher","url","response","error","key","data","isLoadingUserFlowStateData","mutateUserFlowState","useSWRImmutable","useSWR","userFlowStatesData","useEffect","optimisticallyMarkFlowCompleted","flowId","__async","flowState","state","deepmerge","optimisticallyMarkFlowSkipped","SKIPPED_FLOW","optimisticallyMarkStepCompleted","stepId","flowResponse","_a","_b","safeParse","steps","currentStepIndex","step","nextStep","STARTED_FLOW","optimisticallyMarkStepStarted","optimisticallyMarkFlowNotStarted","NOT_STARTED_FLOW","NOT_STARTED_STEP","optimisticallyMarkStepNotStarted","useFlowResponses","config","apiUrl","useConfig","userFlowStatesData","mutateUserFlowState","useUserFlowStates","failedFlowResponses","setFailedFlowResponses","flowResponses","setFlowResponses","useContext","FrigadeContext","successfulFlowResponsesStrings","setSuccessfulFlowResponsesStrings","useState","successfulFlowResponses","setSuccessfulFlowResponses","gracefullyFetch","useGracefulFetch","postFlowResponse","flowResponse","flowResponseString","existingFlowResponse","r","__spreadProps","__spreadValues","prev","addResponse","__async","STARTED_FLOW","NOT_STARTED_FLOW","COMPLETED_FLOW","STARTED_STEP","COMPLETED_STEP","SKIPPED_FLOW","NOT_STARTED_STEP","getFlowResponses","apiFlowResponses","flowState","stepSlug","stepState","useSWR","regex","getSubFlowFromCompletionCriteria","completionCriteria","flowMatch","flow","match","_","trimmed","replaceAll","target","search","replacement","FlowType","useFlows","config","apiUrl","useConfig","flows","setFlows","userId","organizationId","publicApiKey","customVariables","setCustomVariables","hasActiveFullPageFlow","setHasActiveFullPageFlow","setFlowResponses","setShouldGracefullyDegrade","shouldGracefullyDegrade","readonly","flowDataOverrides","useContext","FrigadeContext","emptyResponse","verifySDKInitiated","useCheckHasInitiatedAPI","addResponse","getFlowResponses","useFlowResponses","fetcher","url","response","error","mutateUserFlowState","userFlowStatesData","isLoadingUserFlowStateData","optimisticallyMarkFlowCompleted","optimisticallyMarkFlowSkipped","optimisticallyMarkFlowNotStarted","optimisticallyMarkStepCompleted","optimisticallyMarkStepNotStarted","optimisticallyMarkStepStarted","useUserFlowStates","flowData","isLoadingFlows","useSWR","useEffect","getFlow","flowId","flow","f","getFlowSteps","_a","_b","_c","_d","_e","substituteVariables","safeParse","step","autoCalculatedProgress","getStepOptionalProgress","__spreadProps","__spreadValues","markStepCompleted","getStepStatus","COMPLETED_STEP","STARTED_STEP","data","isStepBlocked","isStepHidden","_","variableName","i","getFlowMetadata","slug","setCustomVariable","key","value","prev","updateCustomVariables","newCustomVariables","markStepStarted","useCallback","stepId","__async","flowResponse","shouldSendServerSideCall","markStepNotStarted","NOT_STARTED_STEP","markFlowNotStarted","getFlowStatus","NOT_STARTED_FLOW","markFlowStarted","STARTED_FLOW","markFlowCompleted","COMPLETED_FLOW","markFlowSkipped","SKIPPED_FLOW","flowState","state","sortedStepStates","a","b","aDate","bDate","maybeFlowResponse","getStepStateForFlow","getCurrentStep","lastStep","s","getCurrentStepIndex","currentStep","index","stepSubFlowSlug","getSubFlowFromCompletionCriteria","completed","getNumberOfStepsCompleted","total","getNumberOfSteps","userFlowState","steps","getFlowData","maybeFlow","targetingLogicShouldHideFlow","matchingUserFlowState","ufs","isFlowAvailableToUser","refresh","getAllFlows","useCallback","useContext","useEffect","GUEST_PREFIX","useUser","userIdInternal","organizationId","setUserId","setUserProperties","shouldGracefullyDegrade","useContext","FrigadeContext","config","apiUrl","useConfig","mutateUserFlowState","useUserFlowStates","gracefullyFetch","useGracefulFetch","verifySDKInitiated","useCheckHasInitiatedAPI","getUserIdKey","id","useEffect","userRegisteredKey","__spreadProps","__spreadValues","addPropertiesToUser","useCallback","properties","__async","data","userProperties","trackEventForUser","event","setUserIdWithProperties","userId","linkExistingGuestSessionToUser","existingGuestId","guestUserIdField","uuidv4","React","useEffect","useState","React","useEffect","useState","styled","React","styled","CSS_CLASS_PREFIX","CUSTOM_CSS_STYLES_PREFIX","getClassName","className","appearance","defaultClass","CSS_CLASS_PREFIX","CUSTOM_CSS_STYLES_PREFIX","getCustomClassOverrides","props","customClassesArray","toKebabKey","key","styleOverridesToCSS","mergeClasses","classes","ucFirst","str","Background","styled","props","getCustomClassOverrides","ModalBackground","onClose","appearance","React","getClassName","React","styled","CloseContainer","Close","Portal","React","React","FrigadeLogo","style","className","FrigadeLogo_default","styled","styled","TooltipContainer","styled","props","getCustomClassOverrides","dismissWithImageStyle","dismissWithoutImageStyle","TooltipDismissButton","TooltipImageContainer","TooltipVideoContainer","TooltipFooter","TooltipContentContainer","TooltipStepCountContainer","TooltipCTAContainer","TooltipStepCounter","PoweredByFrigadeModalRibbon","styled","props","_a","PoweredByFrigadeTooltipRibbon","TooltipContainer","PoweredByFrigadeContainer","_b","PoweredByFrigade","appearance","React","PoweredByFrigadeContainer","getClassName","FrigadeLogo_default","ModalContainer","styled","props","getCustomClassOverrides","_a","_b","_c","styleOverridesToCSS","ModalHeader","ModalClose","Body","Modal","onClose","visible","headerContent","style","children","appearance","dismissible","showFrigadeBranding","initialBodyOverflow","setInitialBodyOverflow","useState","useEffect","initialOverflow","handleEscape","e","bodyStyle","React","Portal","ModalBackground","getClassName","Close","PoweredByFrigadeModalRibbon","PoweredByFrigade","React","useEffect","useState","styled","Portal","getModalPosition","modalPosition","CornerModalContainer","styled","props","getCustomClassOverrides","_a","_b","CornerModalHeader","CornerModalClose","Body","CornerModal","onClose","visible","headerContent","children","appearance","dismissible","initialBodyOverflow","setInitialBodyOverflow","useState","useEffect","initialOverflow","handleEscape","e","bodyStyle","React","Portal","getClassName","Close","useContext","useTheme","defaultAppearance","useContext","FrigadeContext","mergeAppearanceWithDefault","appearance","_a","_b","_c","_appearance","React","useContext","useEffect","useState","styled","React","useEffect","useState","styled","styled","FormLabel","styled","props","getCustomClassOverrides","FormSubLabel","RequiredSymbol","_a","_b","LabelWrapper","React","DefaultAppearance","Label","title","required","appearance","DefaultAppearance","React","LabelWrapper","getClassName","RequiredSymbol","FormLabel","React","SubLabel","title","appearance","LabelWrapper","FormSubLabel","getClassName","z","getErrorsFromValidationResult","value","validation","_a","_b","_c","_d","_e","_f","_g","validator","validationProp","e","TextInputWrapper","styled","TextInput","props","getCustomClassOverrides","_a","_b","TextArea","TextField","formInput","customFormTypeProps","onSaveInputData","setFormValidationErrors","inputData","input","data","setData","useState","hasLoaded","setHasLoaded","hasGivenFocus","setHasGivenFocus","InputComponent","useEffect","handleDataChange","value","validationError","getErrorsFromValidationResult","getType","React","Label","getClassName","e","SubLabel","React","useEffect","useState","styled","NULL_VALUE","MultipleChoiceWrapper","styled","MultipleChoiceSelect","props","getCustomClassOverrides","_a","_b","_c","_d","MultipleChoice","formInput","customFormTypeProps","onSaveInputData","inputData","setFormValidationErrors","_e","_f","_g","_h","_i","input","hasLoaded","setHasLoaded","useState","hasSelected","setHasSelected","useEffect","option","defaultValue","React","Label","e","getClassName","TextInput","SubLabel","React","useEffect","useState","styled","React","React","Circle","color","percentage","size","r","circum","strokePct","ProgressRing","fillColor","children","bgColor","className","style","ProgressRing_default","styled","CheckIcon","color","React","BASE_CHECKBOX_STYLES_SQUARE","BASE_CHECKBOX_STYLES_ROUND","BASE_CHECKBOX_STYLES_SQUARE__CHECKED","BASE_CHECKBOX_STYLES_SQUARE__UNCHECKED","BASE_CHECKBOX_STYLES_ROUND__CHECKED","BASE_CHECKBOX_STYLES_ROUND__UNCHECKED","getBaseStyle","type","getStateStyle","checked","CheckIconContainer","styled","props","styleOverridesToCSS","CheckBox","value","primaryColor","progress","appearance","DefaultAppearance","style","className","checkBoxStyle","stateStyle","__spreadProps","__spreadValues","ProgressRing_default","mergeClasses","getClassName","MultipleChoiceListWrapper","styled","MultipleChoiceListItem","props","getCustomClassOverrides","_a","_b","MultipleChoiceList","formInput","customFormTypeProps","onSaveInputData","inputData","setFormValidationErrors","input","selectedIds","setSelectedIds","useState","hasLoaded","setHasLoaded","useEffect","React","Label","option","getClassName","id","CheckBox","SubLabel","React","styled","DOMPurify","sanitize","dirty","HeaderTitle","styled","props","getCustomClassOverrides","HeaderSubtitle","TitleSubtitle","appearance","title","subtitle","size","classPrefix","ariaPrefix","React","getClassName","ucFirst","sanitize","React","Warning","props","__spreadValues","MultiInputContainer","styled","MultiInputValidationError","props","_a","_b","MultiInputValidationErrorIcon","MultiInput","DEFAULT_INPUT_TYPES","TextField","MultipleChoice","MultipleChoiceList","FORM_DATA_KEY_PREFIX","MultiInputStepType","flowId","stepData","canContinue","setCanContinue","onSaveData","appearance","customFormElements","prefillData","formElements","formValidationErrors","setFormValidationErrors","useState","touchedInputs","setTouchedInputs","userId","useUser","allFormData","setAllFormData","loadFromLocalStorage","readonly","useContext","FrigadeContext","mergedInputTypes","__spreadValues","useEffect","saveDataFromInputs","input","data","prevData","newData","__spreadProps","getLocalStorageKey","React","getClassName","TitleSubtitle","err","error","prev","errors","Warning","styled","FormCTAContainer","props","FormCTAError","CTAWrapper","FormContainer","FormContainerWrapper","FormContainerSidebarImage","React","React","styled","styled","Spinner","ButtonContainer","styled","props","getCustomClassOverrides","_a","_b","_c","_d","styleOverridesToCSS","MultipleButtonContainer","Button","onClick","title","style","disabled","type","size","secondary","appearance","withMargin","classPrefix","loading","autoFocus","getClassNameWithPrefix","name","ucFirst","React","getClassName","Spinner","FormFooter","step","canContinue","appearance","onPrimaryClick","onSecondaryClick","selectedStep","steps","onBack","allowBackNavigation","errorMessage","isSaving","_a","showBackButton","buttonType","React","FormCTAError","getClassName","FormCTAContainer","Button","CTAWrapper","React","styled","Wrapper","styled","FormPagination","stepCount","currentStep","className","appearance","theme","useTheme","React","_","idx","React","styled","useContext","useCTAClickSideEffects","context","FrigadeContext","primaryCTAClickSideEffects","step","handleUrl","secondaryCTAClickSideEffects","url","target","updatedTarget","LinkContainer","styled","Link","LinkIcon","LinkTitle","HeaderTitle","HeaderSubtitle","LinkCollectionStepType","stepData","appearance","_a","_b","handleUrl","useCTAClickSideEffects","React","sanitize","link","React","useEffect","styled","React","Play","style","className","React","useRef","useState","styled","VideoPlayerWrapper","styled","PlayIconWrapper","props","Video","YouTubeVideoSource","VimeoVideoSource","WistiaVideoSource","VideoCard","appearance","videoUri","autoplay","ref","useRef","isPlaying","setIsPlaying","useState","videoId","ampersandPosition","React","getClassName","Play","CallToActionStepContainer","styled","props","getCustomClassOverrides","CallToActionImage","CallToActionTextContainer","CallToActionVideo","CallToActionStepType","stepData","appearance","setCanContinue","useEffect","React","getClassName","TitleSubtitle","VideoCard","React","useEffect","useState","styled","SelectListSelectionContainer","SelectListHeader","SelectListTitle","props","_a","_b","SelectListSubtitle","SelectItem","SelectItemLeft","ItemIcon","SelectItemText","SelectListStepType","stepData","setCanContinue","onSaveData","appearance","multipleChoiceProps","selectedIds","setSelectedIds","useState","hasLoaded","setHasLoaded","lastStepId","setLastStepId","useEffect","React","SelectListSelectionContainer","getClassName","SelectListHeader","SelectListTitle","SelectListSubtitle","option","idx","isSelected","SelectItem","id","SelectItemLeft","ItemIcon","SelectItemText","CheckBox","React","useEffect","useState","AnimationWrapper","children","id","shouldWrap","React","FormContent","appearance","steps","selectedStep","customStepTypes","customVariables","onButtonClick","onStepCompletion","flowId","type","hideOnFlowCompletion","onComplete","setVisible","setShowModal","onDismiss","showPagination","customFormElements","allowBackNavigation","validationHandler","onFormDataChange","showFooter","prefillData","updateUrlOnPageChange","repeatable","_a","mergedCustomStepTypes","__spreadValues","LinkCollectionStepType","MultiInputStepType","CallToActionStepType","SelectListStepType","primaryCTAClickSideEffects","secondaryCTAClickSideEffects","useCTAClickSideEffects","canContinue","setCanContinue","useState","formData","setFormData","isSaving","setIsSaving","errorMessage","setErrorMessage","currentStep","markStepCompleted","markStepStarted","isLoading","updateCustomVariables","markFlowCompleted","useFlows","useEffect","getDataPayload","handleStepCompletionHandlers","step","cta","idx","maybeNextStep","updateData","data","prevState","newObj","FormContainerSidebar","props","FormContainerSidebarImage","getClassName","formFooter","FormFooter","__async","validationError","payload","shouldClose","key","FORM_DATA_KEY_PREFIX","url","FormContainer","FormContainerWrapper","StepComponent","FormPagination","React","createGlobalStyle","GlobalStyleComponent","createGlobalStyle","props","key","value","CUSTOM_CSS_STYLES_PREFIX","nestedKey","nestedValue","toKebabKey","RenderInlineStyles","appearance","React","inlineStyles","_","useEffect","useState","useFlowImpressions","flowId","visible","hasMarkedFlowStarted","setHasMarkedFlowStarted","useState","markStepStarted","isLoading","getFlowStatus","getFlowSteps","getCurrentStepIndex","targetingLogicShouldHideFlow","getFlow","useFlows","steps","markFlowStartedIfNeeded","__async","NOT_STARTED_FLOW","useEffect","FrigadeForm","flowId","customStepTypes","type","visible","setVisible","customVariables","customFormElements","onComplete","appearance","hideOnFlowCompletion","onStepCompletion","onButtonClick","dismissible","endFlowOnDismiss","modalPosition","repeatable","onDismiss","showPagination","allowBackNavigation","validationHandler","showFrigadeBranding","onFormDataChange","showFooter","prefillData","updateUrlOnPageChange","getFlow","getFlowSteps","isLoading","targetingLogicShouldHideFlow","getFlowStatus","getCurrentStepIndex","markFlowCompleted","markFlowNotStarted","markStepStarted","useFlows","selectedStep","mergeAppearanceWithDefault","useTheme","lastHashNavigationStepId","setLastHashNavigationStepId","useState","setOpenFlowState","getOpenFlowState","hasOpenModals","useFlowOpens","useFlowImpressions","steps","showModal","setShowModal","value","hash","useEffect","_a","stepIdFromHash","newStepIndex","stepIdToGoTo","step","flow","COMPLETED_FLOW","handleClose","overrideStyle","React","Modal","RenderInlineStyles","FormContent","CornerModal","FrigadeForm_default","useCallback","useContext","useEffect","useOrganization","organizationIdInternal","userId","setOrganizationId","useContext","FrigadeContext","mutateUserFlowState","useUserFlowStates","config","apiUrl","useConfig","gracefullyFetch","useGracefulFetch","verifySDKInitiated","useCheckHasInitiatedAPI","getUserGroupKey","uId","oId","useEffect","GUEST_PREFIX","userRegisteredKey","__spreadProps","__spreadValues","addPropertiesToOrganization","useCallback","properties","__async","data","trackEventForOrganization","event","setOrganizationIdWithProperties","organizationId","guestUserIdField","realUserIdField","DataFetcher","setFlowResponses","useFlowResponses","userFlowStatesData","isLoadingUserFlowStateData","mutateUserFlowState","useUserFlowStates","userId","setUserId","useUser","lastUserId","setLastUserId","useState","getFlowStatus","useFlows","flows","userProperties","setIsNewGuestUser","flowResponses","useContext","FrigadeContext","automaticFlowIdsToTrigger","setAutomaticFlowIdsToTrigger","triggeredFlows","setTriggeredFlows","organizationId","useOrganization","lastOrganizationId","setLastOrganizationId","hasFinishedInitialLoad","setHasFinishedInitialLoad","useEffect","i","flowState","flow","triggerFlow","flowId","generateGuestUserId","realUserId","guestUserId","newGuestUserId","GUEST_PREFIX","uuidv4","e","loadedImageUrls","imageUrls","imageUrl","url","img","AutomaticFlowIdsToTrigger","React","NOT_STARTED_FLOW","FrigadeForm_default","THEME_MAP","themeToTokens","theme","overrides","key","value","levels","currentLevel","nextLevel","i","styleOverridesToCSS","styleOverrides","copiedOverrides","deepmerge","css","oldSelector","newSelector","appearanceToOverrides","appearance","styled","compose","variant","React","styled","ThemeProvider","useTheme","border","color","compose","get","shadow","space","system","typography","layoutWithoutSize","n","scale","get","StyledBox","styled","css","compose","border","color","shadow","space","typography","system","Box","_a","_b","as","children","overrides","rest","__objRest","theme","useTheme","styleResetProps","renderBox","React","__spreadValues","newTheme","deepmerge","ThemeProvider","buttonVariants","buttonSizes","StyledButton","styled","Box","compose","variant","styled","variant","system","textVariants","StyledText","styled","Box","variant","system","SPACE_VALUE","SPACE_UNIT","SPACE_SCALE_EXTENT","spaceScale","_","i","palette","tokens","__spreadProps","__spreadValues","buttonVariants","textVariants","DEFAULT_API_URL","FrigadeContext","createContext","DefaultAppearance","clearLocalStorage","key","FrigadeProvider","publicApiKey","userId","organizationId","config","children","_a","_b","_c","_d","_e","_f","guestId","guestUserIdField","userIdValue","setUserIdValue","useState","organizationIdValue","setOrganizationIdValue","flows","setFlows","failedFlowResponses","setFailedFlowResponses","flowResponses","setFlowResponses","userProperties","setUserProperties","openFlowStates","setOpenFlowStates","completedFlowsToKeepOpenDuringSession","setCompletedFlowsToKeepOpenDuringSession","customVariables","setCustomVariables","isNewGuestUser","setIsNewGuestUser","hasActiveFullPageFlow","setHasActiveFullPageFlow","shouldGracefullyDegrade","setShouldGracefullyDegrade","isValidApiKey","internalNavigate","url","target","appearance","__spreadValues","apiKey","useEffect","realUserIdField","contextParams","overrides","appearanceToOverrides","React","ThemeProvider","deepmerge","tokens","DataFetcher","React","React","useEffect","useState","React","useState","styled","React","React","styled","Label","styled","props","styleOverridesToCSS","CheckBoxRowContainer","CheckBoxRow","label","value","labelStyle","labelPosition","style","primaryColor","checkBoxType","appearance","React","getClassName","__spreadValues","CheckBox","RenderInlineStyles","styled","HeroChecklistStepContent","HeroChecklistStepTitle","props","_a","_b","HeroChecklistStepSubtitle","StepItemSelectedIndicator","ChecklistStepItem","StepChecklistItem","data","index","isSelected","primaryColor","style","onClick","appearance","_a","_b","_c","_d","_e","React","StepItemSelectedIndicator","getClassName","ChecklistStepItem","CheckBoxRow","React","styled","styled","ChecklistTitle","ChecklistSubtitle","ProgressBarFill","props","ProgressBarBackground","ProgressContainer","styled","props","styleOverridesToCSS","ProgressProgressBar","StepText","ProgressBar","count","total","display","textLocation","style","textStyle","appearance","_a","React","fgWidth","barHeight","percentComplete","padding","stepText","ProgressContainer","getClassName","StepText","__spreadProps","__spreadValues","ProgressProgressBar","ProgressBarFill","ProgressBarBackground","React","styled","React","React","TitleSubtitle","stepData","appearance","React","HeroChecklistStepTitle","getClassName","sanitize","HeroChecklistStepSubtitle","React","CTA","stepData","appearance","handlePrimaryButtonClick","handleSecondaryButtonClick","React","MultipleButtonContainer","getClassName","Button","TitleSubtitleWithCTA","stepData","appearance","React","TitleSubtitle","CTA","React","VideoPlayer","props","React","VideoCard","HERO_STEP_CONTENT_TYPE","StepImage","styled","props","_a","HeroStepContent","stepData","appearance","Content","React","HeroChecklistStepContent","getClassName","VideoPlayer","TitleSubtitleWithCTA","React","useRef","useState","styled","VideoCarouselContainer","styled","VideoList","Video","VideoSource","VideoTitle","PlayIconWrapper","props","VIDEO_CAROUSEL_TYPE","VideoCarousel","stepData","appearance","_a","React","TitleSubtitleWithCTA","VideoCard","video","ref","useRef","isPlaying","setIsPlaying","useState","Play","videoProps","TitleSubtitle","idx","CTA","React","styled","CodeSnippetContainer","styled","CodeSnippet","CodeSnippetTitle","CodeSnippets","CODE_SNIPPET_CONTENT_TYPE","CodeSnippetContent","stepData","appearance","_a","React","TitleSubtitleWithCTA","codeProps","getClassName","TitleSubtitle","codeSnippet","index","sanitize","CTA","HeroChecklistContainer","styled","props","_a","styleOverridesToCSS","HeroChecklistTitle","_b","HeroChecklistSubtitle","ChecklistHeader","ChecklistHeaderContainer","ChecklistStepsContainer","Divider","HeroChecklistStepContentContainer","HeroChecklist","title","subtitle","steps","style","selectedStep","setSelectedStep","className","customStepTypes","appearance","type","mergeAppearanceWithDefault","useTheme","DEFAULT_CUSTOM_STEP_TYPES","HERO_STEP_CONTENT_TYPE","HeroStepContent","VIDEO_CAROUSEL_TYPE","VideoCarousel","CODE_SNIPPET_CONTENT_TYPE","CodeSnippetContent","mergedCustomStepTypes","__spreadValues","selectedStepInternal","setSelectedStepInternal","useState","selectedStepValue","setSelectedStepValue","completeCount","s","StepContent","React","getClassName","ProgressBar","idx","StepChecklistItem","HeroChecklist_default","React","useState","React","styled","ChevronSVG","Chevron","style","className","styled","ContainerStyle","ScrollContainer","styled","HeaderContent","ChecklistTitle","props","_a","_b","ChecklistSubtitle","StepsContainer","getCustomClassOverrides","StepsHeader","StepsTitle","StepsBody","StepListContainer","StepContainer","StepTitle","StepSubtitle","MultipleButtonContainer","StepListItem","StepListStepName","StepListItemRight","ProgressBarContainer","ChecklistContainer","styled","CenterVertical","React","styled","GuideContainer","styled","GuideItems","GuideTitle","props","getCustomClassOverrides","GuideItem","GuideIconWrapper","GuideIcon","GuideItemTitle","GuideItemSubtitle","GuideItemLink","Guide","steps","style","title","primaryColor","appearance","onButtonClick","primaryCTAClickSideEffects","useCTAClickSideEffects","React","GuideContainer","getClassName","GuideTitle","GuideItems","stepData","idx","_a","GuideItem","GuideIconWrapper","GuideIcon","GuideItemTitle","sanitize","GuideItemSubtitle","GuideItemLink","Guide_default","ChecklistWithGuide","steps","title","subtitle","stepsTitle","visible","onClose","selectedStep","setSelectedStep","customStepTypes","appearance","guideData","guideTitle","onGuideButtonClick","DefaultStepContent","stepData","handleSecondaryCTAClick","handleCTAClick","React","StepContainer","getClassName","StepTitle","sanitize","StepSubtitle","MultipleButtonContainer","Button","mergedCustomStepTypes","__spreadValues","_a","selectedStepValue","Content","currentStep","selectedStepInternal","setSelectedStepInternal","useState","setSelectedStepValue","StepContent","completeCount","s","ContainerStyle","Modal","ChecklistContainer","HeaderContent","ChecklistTitle","ChecklistSubtitle","ScrollContainer","StepsContainer","StepsHeader","StepsTitle","ProgressBarContainer","ProgressBar","StepsBody","StepListContainer","idx","isSelected","StepListItem","StepItemSelectedIndicator","StepListStepName","StepListItemRight","CheckBox","CenterVertical","Chevron","Guide_default","step","ChecklistWithGuide_default","React","useEffect","useState","React","styled","StepContainer","props","_a","_b","StepMediaContainer","StepImage","StepHeader","StepTitle","CollapseChevronContainer","ExpandedContentContainer","StepSubtitle","HeaderLeft","CollapsibleStep","stepData","collapsed","onClick","onPrimaryButtonClick","onSecondaryButtonClick","appearance","customStepTypes","_a","_b","iconStyle","stepContentStyle","getDefaultStepContent","React","StepMediaContainer","getClassName","StepImage","VideoCard","StepSubtitle","sanitize","MultipleButtonContainer","Button","getCustomStep","customStep","StepContainer","StepHeader","HeaderLeft","CheckBoxRow","StepTitle","CollapseChevronContainer","Chevron","__spreadProps","__spreadValues","styled","ModalChecklistContainer","HeaderContent","ModalChecklistTitle","props","_a","_b","ModalChecklistSubtitle","ChecklistContainer","CondensedInlineChecklistContainer","CondensedChecklist","title","subtitle","steps","onClose","visible","autoExpandFirstIncompleteStep","autoCollapse","autoExpandNextStep","setSelectedStep","appearance","type","className","customStepTypes","style","onButtonClick","completeCount","s","collapsedSteps","setCollapsedSteps","useState","useEffect","initCollapsedState","i","handleStepClick","idx","newCollapsedState","React","headerContent","HeaderContent","ModalChecklistTitle","getClassName","sanitize","ModalChecklistSubtitle","ProgressBar","checklistContent","ChecklistContainer","mergeClasses","step","_a","isCollapsed","CollapsibleStep","CondensedInlineChecklistContainer","Modal","CondensedChecklist_default","React","useEffect","useRef","useState","useEffect","useState","useMediaQuery","queries","defaultMatches","key","matches","setMatches","updateTimeout","throttledUpdate","updateMatches","freshMatches","query","mediaQuery","React","styled","css","keyframes","defaultBorder","css","theme","defaultShadow","fadeIn","keyframes","fadeOut","CarouselScroll","styled","CarouselScrollGroup","StyledCarouselFade","props","StyledScrollButton","Card","StyledCarouselCard","StyledCarouselCardImage","CarouselContainer","getCustomClassOverrides","CarouselProgressBar","ProgressBarLabel","CompletedPill","H3","CarouselTitle","ProgressWrapper","H4","CardTitle","Body","Small","CarouselCard","stepData","style","appearance","mergeAppearanceWithDefault","useTheme","primaryCTAClickSideEffects","useCTAClickSideEffects","imageUri","subtitle","title","complete","blocked","hasCTA","handleClick","React","StyledCarouselCard","getClassName","StyledCarouselCardImage","CompletedPill","Small","CardTitle","sanitize","Body","RightArrow","React","CarouselFade","side","show","onClick","mounted","setMounted","useState","reversed","setReversed","useEffect","handleFadeOutEnd","style","StyledCarouselFade","StyledScrollButton","CarouselChecklist","flowId","appearance","customVariables","className","scrollContainerRef","useRef","showLeftFade","setShowLeftFade","showRightFade","setShowRightFade","flowMetadata","setFlowMetadata","flowSteps","setFlowSteps","numberOfStepsCompleted","setNumberOfStepsCompleted","isSmall","useMediaQuery","pageSize","getFlowMetadata","getFlowSteps","getNumberOfStepsCompleted","updateCustomVariables","isLoading","useFlows","metadata","completedStepCount","steps","a","b","scrollGroups","i","handleScroll","e","target","maxScroll","currentScroll","handleScrollByPage","forward","direction","scrollTimeout","throttledScroll","CarouselContainer","mergeClasses","getClassName","CarouselTitle","sanitize","Body","ProgressWrapper","ProgressBar","CarouselScroll","group","CarouselScrollGroup","stepData","CarouselCard","RenderInlineStyles","FrigadeChecklist","_a","_b","flowId","title","subtitle","style","initialSelectedStep","className","type","onDismiss","visible","customVariables","onStepCompletion","onButtonClick","appearance","hideOnFlowCompletion","setVisible","customStepTypes","checklistStyle","autoExpandFirstIncompleteStep","autoExpandNextStep","guideProps","__objRest","getFlow","getFlowSteps","markStepCompleted","getStepStatus","getNumberOfStepsCompleted","isLoading","targetingLogicShouldHideFlow","updateCustomVariables","getFlowMetadata","isStepBlocked","getFlowStatus","hasActiveFullPageFlow","setHasActiveFullPageFlow","markStepStarted","getCurrentStepIndex","useFlows","primaryCTAClickSideEffects","secondaryCTAClickSideEffects","useCTAClickSideEffects","getOpenFlowState","setOpenFlowState","useFlowOpens","selectedStep","setSelectedStep","useState","finishedInitialLoad","setFinishedInitialLoad","showModal","isModal","mergeAppearanceWithDefault","useTheme","useFlowImpressions","steps","index","useEffect","flow","COMPLETED_FLOW","metaData","firstIncompleteStep","step","goToNextStepIfPossible","handleStepCompletionHandlers","cta","idx","maybeNextStep","handleClose","getSteps","__spreadProps","__spreadValues","COMPLETED_STEP","CommonDom","React","RenderInlineStyles","commonProps","getCarouselChecklist","CarouselChecklist","getCondensedChecklist","CondensedChecklist_default","getChecklistWithGuide","guideFlowId","guideFlowSteps","ChecklistWithGuide_default","getDefaultChecklist","checklist","HeroChecklist_default","Modal","FrigadeHeroChecklist","props","React","FrigadeChecklist","__spreadValues","React","useEffect","React","styled","BadgeContainer","styled","props","styleOverridesToCSS","BadgeRow","BadgeTitle","ProgressRingContainer","MiniProgressBadge","title","count","total","onClick","style","className","appearance","type","React","RenderInlineStyles","BadgeContainer","__spreadValues","mergeClasses","getClassName","ProgressRingContainer","ProgressRing_default","BadgeRow","BadgeTitle","Chevron","ProgressBar","React","styled","FullWidthProgressBadgeContainer","styled","props","IconContainer","getCustomClassOverrides","TextContainer","ProgressBarContainer","DismissButton","FullWidthProgressBadge","title","subtitle","icon","appearance","count","total","className","style","React","FullWidthProgressBadgeContainer","mergeClasses","getClassName","IconContainer","TextContainer","TitleSubtitle","ProgressBarContainer","ProgressBar","FrigadeProgressBadge","flowId","title","subtitle","icon","style","onClick","className","customVariables","hideOnFlowCompletion","appearance","type","getFlow","getFlowSteps","getFlowStatus","getNumberOfStepsCompleted","isLoading","targetingLogicShouldHideFlow","updateCustomVariables","useFlows","mergeAppearanceWithDefault","useTheme","setOpenFlowState","getOpenFlowState","useFlowOpens","useEffect","flow","COMPLETED_FLOW","steps","completedCount","React","RenderInlineStyles","FullWidthProgressBadge","MiniProgressBadge","React","FrigadeGuide","_a","_b","flowId","style","appearance","props","__objRest","getFlow","targetingLogicShouldHideFlow","getFlowSteps","useFlows","mergeAppearanceWithDefault","useTheme","flow","steps","React","Guide_default","__spreadValues","React","useContext","useEffect","React","useEffect","useLayoutEffect","useRef","useState","styled","useCallback","useEffect","useState","getPosition","boundingRect","position","cardWidth","offset","positionStyle","scrollY","scrollX","useElemRect","elem","refresher","initialRect","dimensions","setDimensions","handleResize","useContext","useState","useDebug","debug","useContext","FrigadeContext","logMessages","setLogMessages","useState","logIfDebugMode","message","m","logErrorIfDebugMode","DEFAULT_CARD_WIDTH","DEFAULT_CARD_HEIGHT","DEFAULT_REFRESH_DELAY","HIGHLIGHT_RADIUS","HighlightOuter","styled","props","HighlightInner","TooltipWrapper","PositionWrapper","HighlightContainer","Tooltips","steps","onDismiss","onComplete","tooltipPosition","showHighlight","primaryColor","offset","visible","containerStyle","selectedStep","customStepTypes","appearance","dismissible","showHighlightOnly","showStepCount","completedStepsCount","showFrigadeBranding","cssPosition","onViewTooltip","className","_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","_p","_q","_r","_s","logErrorIfDebugMode","useDebug","selfBounds","setSelfBounds","useState","needsUpdate","setNeedsUpdate","selfRef","useRef","elem","setElem","boundingRect","useElemRect","lastBoundingRect","setLastBoundingRect","showTooltipContainer","setShowTooltipContainer","positionStyle","zIndex","cardWidth","cardHeight","renderTime","setRenderTime","url","useLayoutEffect","useEffect","handleRefreshPosition","observer","intervalId","handleEscape","e","tooltipPositionValue","position","getPosition","rightSideIsCropped","bottomIsCropped","DefaultFooterContent","handleOnCTAClick","handleOnSecondaryCTAClick","React","TooltipStepCountContainer","TooltipStepCounter","getClassName","TooltipCTAContainer","Button","DefaultTooltipStepContent","TooltipDismissButton","Close","TooltipImageContainer","TooltipVideoContainer","VideoCard","TooltipContentContainer","TitleSubtitle","TooltipFooter","mergedCustomStepTypes","__spreadValues","_","Content","StepContent","cssPos","getBoundedLeftPosition","leftOffset","getBoundedTopPosition","tooltipBottom","spaceFromEdge","handleClick","__spreadProps","TooltipContainer","PoweredByFrigadeTooltipRibbon","PoweredByFrigade","Tooltips_default","Portal","FrigadeTour","_a","_b","flowId","customVariables","appearance","onStepCompletion","onButtonClick","showTooltipsSimultaneously","onDismiss","dismissible","tooltipPosition","showHighlightOnly","dismissBehavior","onComplete","skipIfNotFound","cssPosition","className","props","__objRest","getFlow","getFlowSteps","isLoading","targetingLogicShouldHideFlow","markStepCompleted","markStepStarted","markFlowCompleted","markFlowSkipped","updateCustomVariables","getCurrentStepIndex","getStepStatus","isStepBlocked","getFlowStatus","getNumberOfStepsCompleted","useFlows","isLoadingUserFlowStateData","useUserFlowStates","primaryCTAClickSideEffects","secondaryCTAClickSideEffects","useCTAClickSideEffects","hasOpenModals","useFlowOpens","selectedStep","openFlowStates","useContext","FrigadeContext","mergeAppearanceWithDefault","useTheme","useEffect","flow","COMPLETED_FLOW","steps","otherFlowId","_flowID","React","markTooltipCompleted","stepData","__async","step","status","COMPLETED_STEP","handleStepCompletionHandlers","cta","idx","maybeNextStep","getSteps","__spreadProps","__spreadValues","onDismissTooltip","handleComplete","handleViewTooltip","index","isCurrentSelectorMissing","renderMultipleToolTips","firstVisibleIndex","Tooltips_default","getTooltips","RenderInlineStyles","Portal","React","useEffect","useRef","useState","Portal","styled","SupportButton","styled","props","getCustomClassOverrides","SupportTitle","SupportIconContainer","FloatingWidgetContainer","FloatingWidgetButton","FloatingWidgetMenu","FlowWidgetMenuItem","React","Question","style","className","React","QuestionCircle","style","className","FrigadeSupportWidget","flowId","style","onStepCompletion","visible","type","title","appearance","getFlow","getFlowSteps","markStepCompleted","getStepStatus","getNumberOfStepsCompleted","isLoading","targetingLogicShouldHideFlow","useFlows","primaryCTAClickSideEffects","useCTAClickSideEffects","wrapperRef","useRef","showMenu","setShowMenu","useState","mergeAppearanceWithDefault","useTheme","useEffect","handleClickOutside","event","flow","steps","handlePrimaryButtonClick","step","index","Menu","React","FloatingWidgetMenu","getClassName","FlowWidgetMenuItem","RenderInlineStyles","SupportButton","SupportIconContainer","QuestionCircle","SupportTitle","Portal","FloatingWidgetContainer","FloatingWidgetButton","Question","React","useEffect","styled","EmbeddedTipContainer","styled","props","getCustomClassOverrides","TextContainer","CallToActionContainer","DismissButton","styled","AnnouncementContainer","styled","props","getCustomClassOverrides","TextContainer","PaginationContainer","CallToActionContainer","MediaContainer","DismissButton","HeaderTitle","HeaderSubtitle","React","styled","Image","styled","props","Media","stepData","appearance","classPrefix","_a","React","VideoCard","getClassName","FrigadeEmbeddedTip","flowId","onDismiss","customVariables","onButtonClick","appearance","className","style","dismissible","onClick","getFlow","markFlowCompleted","markFlowSkipped","markStepCompleted","isLoading","targetingLogicShouldHideFlow","updateCustomVariables","getFlowSteps","getFlowStatus","getCurrentStepIndex","useFlows","primaryCTAClickSideEffects","secondaryCTAClickSideEffects","useCTAClickSideEffects","mergeAppearanceWithDefault","useTheme","useFlowImpressions","useEffect","flow","COMPLETED_FLOW","currentStep","React","RenderInlineStyles","EmbeddedTipContainer","mergeClasses","getClassName","DismissButton","__async","Close","MediaContainer","Media","TextContainer","TitleSubtitle","CallToActionContainer","Button","React","useEffect","styled","BannerContainer","styled","props","getCustomClassOverrides","IconContainer","TextContainer","CallToActionContainer","DismissButton","DismissButtonContainer","React","Info","style","className","FrigadeBanner","flowId","title","subtitle","onDismiss","customVariables","onButtonClick","appearance","type","icon","onClick","getFlow","markFlowCompleted","markFlowSkipped","isLoading","targetingLogicShouldHideFlow","updateCustomVariables","getFlowMetadata","getFlowStatus","getFlowSteps","getCurrentStepIndex","useFlows","primaryCTAClickSideEffects","useCTAClickSideEffects","mergeAppearanceWithDefault","useTheme","useFlowImpressions","useEffect","flow","COMPLETED_FLOW","steps","metaData","React","RenderInlineStyles","BannerContainer","getClassName","IconContainer","Info","DismissButtonContainer","DismissButton","__async","Close","TextContainer","TitleSubtitle","CallToActionContainer","Button","React","useEffect","Portal","styled","NPSSurveyContainer","styled","props","NPSNumberButton","NPSNumberButtonContainer","NPSLabelContainer","NPSLabel","TextContainer","CallToActionContainer","TextArea","getCustomClassOverrides","DismissButton","FrigadeNPSSurvey","flowId","onDismiss","customVariables","onButtonClick","appearance","className","style","type","getFlow","markFlowCompleted","markFlowSkipped","markStepCompleted","getNumberOfStepsCompleted","isLoading","targetingLogicShouldHideFlow","updateCustomVariables","getFlowSteps","getFlowStatus","getFlowMetadata","useFlows","primaryCTAClickSideEffects","useCTAClickSideEffects","mergeAppearanceWithDefault","useTheme","score","setScore","React","feedbackText","setFeedbackText","metadata","hasOpenModals","setKeepCompletedFlowOpenDuringSession","shouldKeepCompletedFlowOpenDuringSession","useFlowOpens","useFlowImpressions","useEffect","flow","COMPLETED_FLOW","currentStep","getScoreChooser","_a","_b","TextContainer","TitleSubtitle","NPSNumberButtonContainer","getClassName","i","NPSNumberButton","__async","NPSLabelContainer","NPSLabel","getScoreReason","TextArea","e","Button","getContent","RenderInlineStyles","NPSSurveyContainer","mergeClasses","DismissButton","Close","Portal","React","useEffect","FrigadeAnnouncement","flowId","onDismiss","customVariables","onButtonClick","appearance","className","style","dismissible","modalPosition","showPagination","allowBackNavigation","getFlow","markFlowCompleted","markFlowSkipped","markStepCompleted","markStepStarted","isLoading","targetingLogicShouldHideFlow","updateCustomVariables","getFlowSteps","getFlowStatus","getCurrentStepIndex","useFlows","primaryCTAClickSideEffects","secondaryCTAClickSideEffects","useCTAClickSideEffects","mergeAppearanceWithDefault","useTheme","setOpenFlowState","getOpenFlowState","hasOpenModals","useFlowOpens","useFlowImpressions","showModal","setShowModal","value","useEffect","flow","COMPLETED_FLOW","steps","currentStepIndex","totalSteps","currentStep","handleClose","__async","getContent","_a","React","RenderInlineStyles","AnnouncementContainer","mergeClasses","getClassName","DismissButton","Close","TextContainer","HeaderTitle","sanitize","HeaderSubtitle","MediaContainer","Media","PaginationContainer","FormPagination","CallToActionContainer","Button","overrideStyle","CornerModal","Modal","React","React","BaseText","_a","_b","as","children","variant","rest","__objRest","React","StyledText","__spreadValues","textVariantComponents","textVariants","asProp","component","props","__spreadProps","Text","BaseButton","_a","_b","as","className","size","title","variant","rest","__objRest","StyledButton","__spreadValues","Text","buttonVariants","buttonVariantComponents","component","props","__spreadProps","Button"]}