@sanity/studio-secrets
4.0.214.0.22
dist/index.js.map~
dist/index.js.mapModified+1−1
Index: package/dist/index.js.map
===================================================================
--- package/dist/index.js.map
+++ package/dist/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["{apiVersion: '2021-03-01'}","documentPreviewStore.unstable_observeDocument(id).pipe(\n map((doc) => ({\n loading: false,\n // oxlint-disable-next-line no-unsafe-type-assertion\n secrets: (doc as Record<string, unknown> | undefined)?.['secrets'] as T | undefined,\n })),\n )","(doc) => ({\n loading: false,\n // oxlint-disable-next-line no-unsafe-type-assertion\n secrets: (doc as Record<string, unknown> | undefined)?.['secrets'] as T | undefined,\n })","useMemo(\n () =>\n documentPreviewStore.unstable_observeDocument(id).pipe(\n map((doc) => ({\n loading: false,\n // oxlint-disable-next-line no-unsafe-type-assertion\n secrets: (doc as Record<string, unknown> | undefined)?.['secrets'] as T | undefined,\n })),\n ),\n [id, documentPreviewStore],\n )","(updatedSecret: T) => {\n setSaving(true)\n const keysPatch = client.patch(id).set({secrets: updatedSecret})\n void client\n .transaction()\n .createIfNotExists({_id: id, _type: type})\n .patch(keysPatch)\n .commit({visibility: 'async', tag: 'secrets.store'})\n .catch(() => {\n // Non-fatal — the listener will deliver the updated value\n })\n .finally(() => setSaving(false))\n }","() => {\n // Non-fatal — the listener will deliver the updated value\n }","useCallback(\n (updatedSecret: T) => {\n setSaving(true)\n const keysPatch = client.patch(id).set({secrets: updatedSecret})\n void client\n .transaction()\n .createIfNotExists({_id: id, _type: type})\n .patch(keysPatch)\n .commit({visibility: 'async', tag: 'secrets.store'})\n .catch(() => {\n // Non-fatal — the listener will deliver the updated value\n })\n .finally(() => setSaving(false))\n },\n [client, id],\n )","{loading: readLoading || saving, secrets, storeSecrets}","readLoading || saving","_c","secrets$","{\n namespace,\n keys,\n onClose,\n // oxlint-disable-next-line no-useless-default-assignment\n title = 'Configure',\n}: SettingsViewProps","title = 'Configure'","{}","() => {\n if (secrets) {\n // oxlint-disable-next-line react/set-state-in-effect\n setNewSecrets(secrets)\n }\n }","[secrets]","() => storeSecrets(newSecrets)","useCallback(() => storeSecrets(newSecrets), [storeSecrets, newSecrets])","keys.map((keyEntry) => (\n <SettingsKeyEntry\n key={keyEntry.key}\n keyEntry={keyEntry}\n loading={loading}\n newSecrets={newSecrets}\n setNewSecrets={setNewSecrets}\n />\n ))","(keyEntry) => (\n <SettingsKeyEntry\n key={keyEntry.key}\n keyEntry={keyEntry}\n loading={loading}\n newSecrets={newSecrets}\n setNewSecrets={setNewSecrets}\n />\n )","<Button\n disabled={loading}\n onClick={onClick}\n text={loading ? 'Loading…' : 'Save'}\n tone=\"positive\"\n />","loading ? 'Loading…' : 'Save'","<Card padding={3}>\n <Stack gap={3}>\n {keys.map((keyEntry) => (\n <SettingsKeyEntry\n key={keyEntry.key}\n keyEntry={keyEntry}\n loading={loading}\n newSecrets={newSecrets}\n setNewSecrets={setNewSecrets}\n />\n ))}\n <Button\n disabled={loading}\n onClick={onClick}\n text={loading ? 'Loading…' : 'Save'}\n tone=\"positive\"\n />\n </Stack>\n </Card>","<Dialog animate id=\"studio-secrets-settings\" onClose={onClose} header={title}>\n <Card padding={3}>\n <Stack gap={3}>\n {keys.map((keyEntry) => (\n <SettingsKeyEntry\n key={keyEntry.key}\n keyEntry={keyEntry}\n loading={loading}\n newSecrets={newSecrets}\n setNewSecrets={setNewSecrets}\n />\n ))}\n <Button\n disabled={loading}\n onClick={onClick}\n text={loading ? 'Loading…' : 'Save'}\n tone=\"positive\"\n />\n </Stack>\n </Card>\n </Dialog>","{loading, setNewSecrets, newSecrets, keyEntry}: SettingsKeyProps","(event: ChangeEvent<HTMLInputElement>) => {\n const target = event.currentTarget\n const {value} = target\n setNewSecrets((prevState) => {\n const newState = {...prevState}\n newState[keyEntry.key] = value\n return newState\n })\n }","key","useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const target = event.currentTarget\n const {value} = target\n setNewSecrets((prevState) => {\n const newState = {...prevState}\n newState[keyEntry.key] = value\n return newState\n })\n },\n [keyEntry, setNewSecrets],\n )","<Text as=\"label\" htmlFor={inputId} weight=\"semibold\" size={1}>\n {keyEntry.title}\n </Text>","title","keyEntry.description && (\n <Text id={descriptionId} muted size={1}>\n {keyEntry.description}\n </Text>\n )","description","<TextInput\n disabled={loading}\n id={inputId}\n aria-describedby={keyEntry.description ? descriptionId : undefined}\n onChange={onChange}\n value={newSecrets[keyEntry.key] ?? ''}\n />","keyEntry.description ? descriptionId : undefined","newSecrets[keyEntry.key] ?? ''","<Stack gap={2}>\n <Text as=\"label\" htmlFor={inputId} weight=\"semibold\" size={1}>\n {keyEntry.title}\n </Text>\n {keyEntry.description && (\n <Text id={descriptionId} muted size={1}>\n {keyEntry.description}\n </Text>\n )}\n <TextInput\n disabled={loading}\n id={inputId}\n aria-describedby={keyEntry.description ? descriptionId : undefined}\n onChange={onChange}\n value={newSecrets[keyEntry.key] ?? ''}\n />\n </Stack>","_c","\"secrets\""],"sources":["../src/useSecrets.ts","../src/Settings.tsx"],"sourcesContent":["import {useCallback, useMemo, useState} from 'react'\nimport {useObservable} from 'react-rx'\nimport {map} from 'rxjs'\nimport {useClient, useDocumentPreviewStore} from 'sanity'\n\nconst type = 'pluginSecrets'\n\nexport interface Secrets<T> {\n loading: boolean\n secrets?: T\n storeSecrets: (secrets: T) => void\n}\n\nconst INITIAL_STATE = {loading: true, secrets: undefined}\n\nexport function useSecrets<T>(namespace: string): Secrets<T> {\n const [saving, setSaving] = useState(false)\n\n const client = useClient({apiVersion: '2021-03-01'})\n const documentPreviewStore = useDocumentPreviewStore()\n const id = `secrets.${namespace}`\n\n const secrets$ = useMemo(\n () =>\n documentPreviewStore.unstable_observeDocument(id).pipe(\n map((doc) => ({\n loading: false,\n // oxlint-disable-next-line no-unsafe-type-assertion\n secrets: (doc as Record<string, unknown> | undefined)?.['secrets'] as T | undefined,\n })),\n ),\n [id, documentPreviewStore],\n )\n\n const {loading: readLoading, secrets} = useObservable(secrets$, INITIAL_STATE)\n\n const storeSecrets = useCallback(\n (updatedSecret: T) => {\n setSaving(true)\n const keysPatch = client.patch(id).set({secrets: updatedSecret})\n void client\n .transaction()\n .createIfNotExists({_id: id, _type: type})\n .patch(keysPatch)\n .commit({visibility: 'async', tag: 'secrets.store'})\n .catch(() => {\n // Non-fatal — the listener will deliver the updated value\n })\n .finally(() => setSaving(false))\n },\n [client, id],\n )\n\n return {loading: readLoading || saving, secrets, storeSecrets}\n}\n","import {Button, Card, Dialog, Stack, Text, TextInput} from '@sanity/ui'\nimport {\n type ChangeEvent,\n type Dispatch,\n type ReactElement,\n type SetStateAction,\n useCallback,\n useEffect,\n useState,\n} from 'react'\n\nimport {useSecrets} from './useSecrets'\n\nexport type SettingsKey = {\n key: string\n title: string\n description?: string\n}\n\nexport type SettingsViewProps = {\n title: string\n namespace: string\n keys: SettingsKey[]\n onClose: () => void\n}\n\nexport const SettingsView = ({\n namespace,\n keys,\n onClose,\n // oxlint-disable-next-line no-useless-default-assignment\n title = 'Configure',\n}: SettingsViewProps): ReactElement => {\n const {loading, secrets, storeSecrets} = useSecrets<Record<string, any>>(namespace)\n const [newSecrets, setNewSecrets] = useState<Record<string, any>>({})\n\n // Sync async-loaded secrets into form state. This is a legitimate\n // useEffect for external data sync, not a cascading render issue.\n // See: https://github.com/facebook/react/issues/34743\n useEffect(() => {\n if (secrets) {\n // oxlint-disable-next-line react/set-state-in-effect\n setNewSecrets(secrets)\n }\n }, [secrets])\n\n const onClick = useCallback(() => storeSecrets(newSecrets), [storeSecrets, newSecrets])\n\n return (\n <Dialog animate id=\"studio-secrets-settings\" onClose={onClose} header={title}>\n <Card padding={3}>\n <Stack gap={3}>\n {keys.map((keyEntry) => (\n <SettingsKeyEntry\n key={keyEntry.key}\n keyEntry={keyEntry}\n loading={loading}\n newSecrets={newSecrets}\n setNewSecrets={setNewSecrets}\n />\n ))}\n <Button\n disabled={loading}\n onClick={onClick}\n text={loading ? 'Loading…' : 'Save'}\n tone=\"positive\"\n />\n </Stack>\n </Card>\n </Dialog>\n )\n}\n\ninterface SettingsKeyProps {\n loading: boolean\n newSecrets: Record<string, any>\n setNewSecrets: Dispatch<SetStateAction<Record<string, any>>>\n keyEntry: SettingsKey\n}\n\nfunction SettingsKeyEntry({loading, setNewSecrets, newSecrets, keyEntry}: SettingsKeyProps) {\n const onChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const target = event.currentTarget\n const {value} = target\n setNewSecrets((prevState) => {\n const newState = {...prevState}\n newState[keyEntry.key] = value\n return newState\n })\n },\n [keyEntry, setNewSecrets],\n )\n\n const inputId = `studio-secrets-${keyEntry.key}`\n const descriptionId = `${inputId}-description`\n\n return (\n <Stack gap={2}>\n <Text as=\"label\" htmlFor={inputId} weight=\"semibold\" size={1}>\n {keyEntry.title}\n </Text>\n {keyEntry.description && (\n <Text id={descriptionId} muted size={1}>\n {keyEntry.description}\n </Text>\n )}\n <TextInput\n disabled={loading}\n id={inputId}\n aria-describedby={keyEntry.description ? descriptionId : undefined}\n onChange={onChange}\n value={newSecrets[keyEntry.key] ?? ''}\n />\n </Stack>\n )\n}\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["{apiVersion: '2021-03-01'}","documentPreviewStore.unstable_observeDocument(id).pipe(\n map((doc) => ({\n loading: false,\n // oxlint-disable-next-line no-unsafe-type-assertion\n secrets: (doc as Record<string, unknown> | undefined)?.['secrets'] as T | undefined,\n })),\n )","(doc) => ({\n loading: false,\n // oxlint-disable-next-line no-unsafe-type-assertion\n secrets: (doc as Record<string, unknown> | undefined)?.['secrets'] as T | undefined,\n })","useMemo(\n () =>\n documentPreviewStore.unstable_observeDocument(id).pipe(\n map((doc) => ({\n loading: false,\n // oxlint-disable-next-line no-unsafe-type-assertion\n secrets: (doc as Record<string, unknown> | undefined)?.['secrets'] as T | undefined,\n })),\n ),\n [id, documentPreviewStore],\n )","(updatedSecret: T) => {\n setSaving(true)\n const keysPatch = client.patch(id).set({secrets: updatedSecret})\n void client\n .transaction()\n .createIfNotExists({_id: id, _type: type})\n .patch(keysPatch)\n .commit({visibility: 'async', tag: 'secrets.store'})\n .catch(() => {\n // Non-fatal — the listener will deliver the updated value\n })\n .finally(() => setSaving(false))\n }","() => {\n // Non-fatal — the listener will deliver the updated value\n }","useCallback(\n (updatedSecret: T) => {\n setSaving(true)\n const keysPatch = client.patch(id).set({secrets: updatedSecret})\n void client\n .transaction()\n .createIfNotExists({_id: id, _type: type})\n .patch(keysPatch)\n .commit({visibility: 'async', tag: 'secrets.store'})\n .catch(() => {\n // Non-fatal — the listener will deliver the updated value\n })\n .finally(() => setSaving(false))\n },\n [client, id],\n )","{loading: readLoading || saving, secrets, storeSecrets}","readLoading || saving","_c","secrets$","{\n namespace,\n keys,\n onClose,\n // oxlint-disable-next-line no-useless-default-assignment\n title = 'Configure',\n}: SettingsViewProps","title = 'Configure'","{}","() => {\n if (secrets) {\n // oxlint-disable-next-line react/set-state-in-effect\n setNewSecrets(secrets)\n }\n }","[secrets]","() => storeSecrets(newSecrets)","useCallback(() => storeSecrets(newSecrets), [storeSecrets, newSecrets])","keys.map((keyEntry) => (\n <SettingsKeyEntry\n key={keyEntry.key}\n keyEntry={keyEntry}\n loading={loading}\n newSecrets={newSecrets}\n setNewSecrets={setNewSecrets}\n />\n ))","(keyEntry) => (\n <SettingsKeyEntry\n key={keyEntry.key}\n keyEntry={keyEntry}\n loading={loading}\n newSecrets={newSecrets}\n setNewSecrets={setNewSecrets}\n />\n )","<Button\n disabled={loading}\n onClick={onClick}\n text={loading ? 'Loading…' : 'Save'}\n tone=\"positive\"\n />","loading ? 'Loading…' : 'Save'","<Card padding={3}>\n <Stack gap={3}>\n {keys.map((keyEntry) => (\n <SettingsKeyEntry\n key={keyEntry.key}\n keyEntry={keyEntry}\n loading={loading}\n newSecrets={newSecrets}\n setNewSecrets={setNewSecrets}\n />\n ))}\n <Button\n disabled={loading}\n onClick={onClick}\n text={loading ? 'Loading…' : 'Save'}\n tone=\"positive\"\n />\n </Stack>\n </Card>","<Dialog animate id=\"studio-secrets-settings\" onClose={onClose} header={title}>\n <Card padding={3}>\n <Stack gap={3}>\n {keys.map((keyEntry) => (\n <SettingsKeyEntry\n key={keyEntry.key}\n keyEntry={keyEntry}\n loading={loading}\n newSecrets={newSecrets}\n setNewSecrets={setNewSecrets}\n />\n ))}\n <Button\n disabled={loading}\n onClick={onClick}\n text={loading ? 'Loading…' : 'Save'}\n tone=\"positive\"\n />\n </Stack>\n </Card>\n </Dialog>","{loading, setNewSecrets, newSecrets, keyEntry}: SettingsKeyProps","(event: ChangeEvent<HTMLInputElement>) => {\n const target = event.currentTarget\n const {value} = target\n setNewSecrets((prevState) => {\n const newState = {...prevState}\n newState[keyEntry.key] = value\n return newState\n })\n }","key","useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const target = event.currentTarget\n const {value} = target\n setNewSecrets((prevState) => {\n const newState = {...prevState}\n newState[keyEntry.key] = value\n return newState\n })\n },\n [keyEntry, setNewSecrets],\n )","<Text as=\"label\" htmlFor={inputId} weight=\"semibold\" size={1}>\n {keyEntry.title}\n </Text>","title","keyEntry.description && (\n <Text id={descriptionId} muted size={1}>\n {keyEntry.description}\n </Text>\n )","description","<TextInput\n disabled={loading}\n id={inputId}\n aria-describedby={keyEntry.description ? descriptionId : undefined}\n onChange={onChange}\n value={newSecrets[keyEntry.key] ?? ''}\n />","keyEntry.description ? descriptionId : undefined","newSecrets[keyEntry.key] ?? ''","<Stack gap={2}>\n <Text as=\"label\" htmlFor={inputId} weight=\"semibold\" size={1}>\n {keyEntry.title}\n </Text>\n {keyEntry.description && (\n <Text id={descriptionId} muted size={1}>\n {keyEntry.description}\n </Text>\n )}\n <TextInput\n disabled={loading}\n id={inputId}\n aria-describedby={keyEntry.description ? descriptionId : undefined}\n onChange={onChange}\n value={newSecrets[keyEntry.key] ?? ''}\n />\n </Stack>","_c","\"secrets\""],"sources":["../src/useSecrets.ts","../src/Settings.tsx"],"sourcesContent":["import {useCallback, useMemo, useState} from 'react'\nimport {useSyncObservable} from 'react-rx'\nimport {map} from 'rxjs'\nimport {useClient, useDocumentPreviewStore} from 'sanity'\n\nconst type = 'pluginSecrets'\n\nexport interface Secrets<T> {\n loading: boolean\n secrets?: T\n storeSecrets: (secrets: T) => void\n}\n\nconst INITIAL_STATE = {loading: true, secrets: undefined}\n\nexport function useSecrets<T>(namespace: string): Secrets<T> {\n const [saving, setSaving] = useState(false)\n\n const client = useClient({apiVersion: '2021-03-01'})\n const documentPreviewStore = useDocumentPreviewStore()\n const id = `secrets.${namespace}`\n\n const secrets$ = useMemo(\n () =>\n documentPreviewStore.unstable_observeDocument(id).pipe(\n map((doc) => ({\n loading: false,\n // oxlint-disable-next-line no-unsafe-type-assertion\n secrets: (doc as Record<string, unknown> | undefined)?.['secrets'] as T | undefined,\n })),\n ),\n [id, documentPreviewStore],\n )\n\n // Kept synchronous: the stream is keyed to the live `namespace` and consumers\n // read `secrets` straight into API clients and form state, so a deferred\n // snapshot could hand them the previous namespace's secrets as `loading: false`\n // or lag a just-saved value behind the store.\n const {loading: readLoading, secrets} = useSyncObservable(secrets$, INITIAL_STATE)\n\n const storeSecrets = useCallback(\n (updatedSecret: T) => {\n setSaving(true)\n const keysPatch = client.patch(id).set({secrets: updatedSecret})\n void client\n .transaction()\n .createIfNotExists({_id: id, _type: type})\n .patch(keysPatch)\n .commit({visibility: 'async', tag: 'secrets.store'})\n .catch(() => {\n // Non-fatal — the listener will deliver the updated value\n })\n .finally(() => setSaving(false))\n },\n [client, id],\n )\n\n return {loading: readLoading || saving, secrets, storeSecrets}\n}\n","import {Button, Card, Dialog, Stack, Text, TextInput} from '@sanity/ui'\nimport {\n type ChangeEvent,\n type Dispatch,\n type ReactElement,\n type SetStateAction,\n useCallback,\n useEffect,\n useState,\n} from 'react'\n\nimport {useSecrets} from './useSecrets'\n\nexport type SettingsKey = {\n key: string\n title: string\n description?: string\n}\n\nexport type SettingsViewProps = {\n title: string\n namespace: string\n keys: SettingsKey[]\n onClose: () => void\n}\n\nexport const SettingsView = ({\n namespace,\n keys,\n onClose,\n // oxlint-disable-next-line no-useless-default-assignment\n title = 'Configure',\n}: SettingsViewProps): ReactElement => {\n const {loading, secrets, storeSecrets} = useSecrets<Record<string, any>>(namespace)\n const [newSecrets, setNewSecrets] = useState<Record<string, any>>({})\n\n // Sync async-loaded secrets into form state. This is a legitimate\n // useEffect for external data sync, not a cascading render issue.\n // See: https://github.com/facebook/react/issues/34743\n useEffect(() => {\n if (secrets) {\n // oxlint-disable-next-line react/set-state-in-effect\n setNewSecrets(secrets)\n }\n }, [secrets])\n\n const onClick = useCallback(() => storeSecrets(newSecrets), [storeSecrets, newSecrets])\n\n return (\n <Dialog animate id=\"studio-secrets-settings\" onClose={onClose} header={title}>\n <Card padding={3}>\n <Stack gap={3}>\n {keys.map((keyEntry) => (\n <SettingsKeyEntry\n key={keyEntry.key}\n keyEntry={keyEntry}\n loading={loading}\n newSecrets={newSecrets}\n setNewSecrets={setNewSecrets}\n />\n ))}\n <Button\n disabled={loading}\n onClick={onClick}\n text={loading ? 'Loading…' : 'Save'}\n tone=\"positive\"\n />\n </Stack>\n </Card>\n </Dialog>\n )\n}\n\ninterface SettingsKeyProps {\n loading: boolean\n newSecrets: Record<string, any>\n setNewSecrets: Dispatch<SetStateAction<Record<string, any>>>\n keyEntry: SettingsKey\n}\n\nfunction SettingsKeyEntry({loading, setNewSecrets, newSecrets, keyEntry}: SettingsKeyProps) {\n const onChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const target = event.currentTarget\n const {value} = target\n setNewSecrets((prevState) => {\n const newState = {...prevState}\n newState[keyEntry.key] = value\n return newState\n })\n },\n [keyEntry, setNewSecrets],\n )\n\n const inputId = `studio-secrets-${keyEntry.key}`\n const descriptionId = `${inputId}-description`\n\n return (\n <Stack gap={2}>\n <Text as=\"label\" htmlFor={inputId} weight=\"semibold\" size={1}>\n {keyEntry.title}\n </Text>\n {keyEntry.description && (\n <Text id={descriptionId} muted size={1}>\n {keyEntry.description}\n </Text>\n )}\n <TextInput\n disabled={loading}\n id={inputId}\n aria-describedby={keyEntry.description ? descriptionId : undefined}\n onChange={onChange}\n value={newSecrets[keyEntry.key] ?? ''}\n />\n </Stack>\n )\n}\n"],"mappings":";;;;;;;;AAKA,MAQM,gBAAgB;CAAC,SAAS;CAAM,SAAS,KAAA;AAAS;AAExD,SAAgB,WAAc,WAA+B;gBACrD,CAAC,QAAQ,aAAa,SAAS,EAAK,GAEjBA;qDAAC,KAAA,EAAA,YAAY,aAAY;CAAlD,IAAM,SAAS,UAAUA,EAA0B,GAC7C,uBAAuB,wBAAwB,GAC/C,KAAK,WAAW,aAIlBC;CAA8C,AAAA,EAAA,OAAA,wBAAA,EAAA,OAAA,MAA9C,KAAA,qBAAqB,yBAAyB,EAAE,CAAC,CAAC,KAChD,IAAIC,KAIF,CACJ,GANA,EAAA,KAAA,sBAA8C,EAAA,KAAA;CAclD,IAAM,EAAC,SAAS,aAAa,YAAW,kBAAkBQ,IAAU,aAAa,GAG/EN;CAEoB,AAAA,EAAA,OAAA,UAAA,EAAA,OAAa,MAFjC,MAAC,kBAAqB;EACpB,UAAU,EAAI;EACd,IAAM,YAAY,OAAO,MAAM,EAAE,CAAC,CAAC,IAAI,EAAC,SAAS,cAAa,CAAC;EAC1D,OACF,YAAY,CAAC,CACb,kBAAkB;GAAC,KAAK;GAAI,OAAO;EAAI,CAAC,CAAC,CACzC,MAAM,SAAS,CAAC,CAChB,OAAO;GAAC,YAAY;GAAS,KAAK;EAAe,CAAC,CAAC,CACnD,MAAMC,MAEN,CAAC,CACD,cAAc,UAAU,EAAK,CAAC;CACnC,GAVoB,EAAA,KAAA,QAAa,EAAA,KAAA;CAHnC,IAAM,eAAeC,IAiBJ,KAAA,eAAe,QAAzBC;CAAP,OAAwC,EAAA,OAAA,WAAA,EAAA,OAAS,gBAAA,EAAA,OAAhCC,MAAV,KAAA;EAAC,SAASA;EAAuB;EAAS;CAAY,GAArB,EAAA,KAAA,SAAS,EAAA,KAAA,cAAhCA,EAAAA,KAAAA,8BAAVD;AACT;AATe,SAAA,SAAM,CAEb;AA1BI,SAAA,MAAC,KAAA;CAAS,OAAA;EACZ,SAAS;EAET,SAAU,KAA8C8B;CAC1D;;ACHR,MAAa,gBAAA,OAM0B;gBANV,EAC3B,WACA,MACA,SAEA,OAAA,OAL2B1B,IAK3B,QAAA,OAAA,KAAA,IAAQ,cAARC,IAEM,EAAC,SAAS,SAAS,iBAAgB,WAAgC,SAAS,GAChBC;qDAAC,KAAA,CAAA;CAAnE,IAAM,CAAC,YAAY,iBAAiB,SAA8BA,EAAE,GAK1DC,IAKPC;CALH,AACM,EAAA,OAAA,oCADI,WAAM;EACd,AAAI,WAEF,cAAc,OAAO;CAEzB,GAAG,KAAA,CAAC,OAAO,GAJL,EAAA,KAAA,gCADN,UAAUD,IAKPC,EAAS;CAEgBC,IAAAA;CAAmB,AAAA,EAAA,OAAA,cAAA,EAAA,OAAb,gBAAN,WAAM,aAAa,UAAU,GAAV,EAAA,KAAA,YAAb,EAAA,KAAA;CAAlC,IAAM,UAAUC,IAMPC;CAIY,IAAA,EAAA,OAAA,QAAA,EAAA,OAAA,WAAA,EAAA,OACG,YAAA;EALNC,IAAAA;EAIG,EAAA,QAAA,WAAA,EAAA,QACG,cALN,MAAC,aACT,oBAAC,kBAAD;GAEY;GACD;GACG;GACG;EAChB,GALM,SAAS,GAKf,GAHU,EAAA,MAAA,SACG,EAAA,MAAA,sCALf,KAAA,KAAK,IAAIA,EAQT,GARA,EAAA,KAAA,MAIY,EAAA,KAAA,SACG,EAAA,KAAA;;CAOR,IAAA,KAAA,UAAU,aAAa,QAH/BC;CACY,AAAA,EAAA,QAAA,WAAA,EAAA,QACD,WAAA,EAAA,QACHC,MAHR,KAAA,oBAAC,QAAD;EACE,UAAU;EACD;EACT,MAAMA;EACN,MAAK;CACN,CAAA,GAJW,EAAA,MAAA,SACD,EAAA,MAAA,SACHA,EAAAA,MAAAA;CAdZC,IAAAA;CAEKJ,AAAAA,EAAAA,QAAAA,MAAAA,EAAAA,QASDE,MAXJ,KAAA,oBAAC,MAAD;EAAM,SAAS;EACb,UAAA,qBAAC,OAAD;GAAO,KAAK;GAAZ,UAAA,CACGF,IASDE,EAMK;;CACH,CAAA,GAhBDF,EAAAA,MAAAA,IASDE,EAAAA,MAAAA;CAZNG,IAAAA;CADF,OACwD,EAAA,QAAA,WAAA,EAAA,QACpDD,MAAAA,EAAAA,QADqE,SAAvE,MAAA,oBAAC,QAAD;EAAQ,SAAA;EAAQ,IAAG;EAAmC;EAAS,QAAQ;EACrEA,UAAAA;CAmBM,CAAA,GApB8C,EAAA,MAAA,SACpDA,EAAAA,MAAAA,IADqE,EAAA,MAAA,mCAAvEC;AAsBJ;AASA,SAAS,iBAAA,IAAmF;gBAAlE,EAAC,SAAS,eAAe,YAAY,aAArCC,IAEtBC;CAKsBC,AAAAA,EAAAA,OAAAA,SAAAA,OAAAA,EAAAA,OAFpB,iBAHF,MAAC,UAAyC;EAExC,IAAM,EAAC,UADQ,MAAM;EAErB,eAAe,cAAc;GAC3B,IAAM,WAAW,EAAC,GAAG,UAAS;GAE9B,OADA,SAAS,SAAS,OAAO,OAClB;EACT,CAAC;CACH,GAHsBA,EAAAA,KAAAA,SAAAA,KAFpB,EAAA,KAAA;CAJJ,IAAM,WAAWC,IAaX,UAAU,kBAAkB,SAAS,OACrC,gBAAgB,GAAG,QAAQ,eAI7BC;CAA0B,AAAA,EAAA,OAAA,WAAA,EAAA,OACdC,SAAAA,SADZ,KAAA,oBAAC,MAAD;EAAM,IAAG;EAAQ,SAAS;EAAS,QAAO;EAAW,MAAM;EACxD,UAAA,SAAS;CACN,CAAA,GAFoB,EAAA,KAAA,SACdA,EAAAA,KAAAA,SAAAA;CAEXC,IAAAA;CACW,AAAA,EAAA,OAAA,iBAAA,EAAA,OADFC,SAAAA,eAAT,KAAA,SAAS,eACR,oBAAC,MAAD;EAAM,IAAI;EAAe,OAAA;EAAM,MAAM;EAClC,UAAA,SAAS;CACN,CAAA,GAFI,EAAA,KAAA,eADFA,EAAAA,KAAAA,SAAAA;CAQU,IAAA,KAAA,SAAS,cAAc,gBAAgB,KAAA,GAElD,KAAA,WAAW,SAAS,QAAQ,IALrCC;CAEM,AAAA,EAAA,OAAA,WAAA,EAAA,QADM,WAAA,EAAA,QAGA,YAAA,EAAA,QADQC,MAAAA,EAAAA,QAEXC,MALT,KAAA,oBAAC,WAAD;EACE,UAAU;EACV,IAAI;EACJ,oBAAkBD;EACR;EACV,OAAOC;CACR,CAAA,GAJK,EAAA,KAAA,SADM,EAAA,MAAA,SAGA,EAAA,MAAA,UADQD,EAAAA,MAAAA,IAEXC,EAAAA,MAAAA;CAdXC,IAAAA;CADF,OAEIP,EAAAA,QAAAA,MAAAA,EAAAA,QAGCE,MAAAA,EAAAA,QAKDE,MATF,KAAA,qBAAC,OAAD;EAAO,KAAK;EAAZ,UAAA;GACEJ;GAGCE;GAKDE;EAOK;KAfLJ,EAAAA,MAAAA,IAGCE,EAAAA,MAAAA,IAKDE,EAAAA,MAAAA,8BATFG;AAkBJ"}
\ No newline at end of file