sanity-plugin-iframe-pane 4.0.0 → 5.0.0

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.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 Simeon Griggs
3
+ Copyright (c) 2025 Sanity.io
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,7 +1,5 @@
1
1
  # sanity-plugin-iframe-pane
2
2
 
3
- > For the v2 version, please refer to the [v2-branch](https://github.com/sanity-io/sanity-plugin-iframe-pane/tree/studio-v2).
4
-
5
3
  Display any URL in a View Pane, along with helpful buttons to Copy the URL or open it in a new tab.
6
4
 
7
5
  Accepts either a string or an async function to resolve a URL based on the current document.
@@ -117,18 +115,3 @@ attributes: {
117
115
  ## License
118
116
 
119
117
  MIT-licensed. See LICENSE.
120
-
121
- ## Develop & test
122
-
123
- This plugin uses [@sanity/plugin-kit](https://github.com/sanity-io/plugin-kit)
124
- with default configuration for build & watch scripts.
125
-
126
- See [Testing a plugin in Sanity Studio](https://github.com/sanity-io/plugin-kit#testing-a-plugin-in-sanity-studio)
127
- on how to run this plugin with hotreload in the studio.
128
-
129
- ### Release new version
130
-
131
- Run ["CI & Release" workflow](https://github.com/sanity-io/sanity-plugin-iframe-pane/actions/workflows/main.yml).
132
- Make sure to select the `main` branch and check "Release new version".
133
-
134
- Semantic release will only release on configured branches, so it is safe to run release on any branch.
@@ -0,0 +1,56 @@
1
+ import { HTMLAttributeReferrerPolicy } from "react";
2
+ import { SanityDocument, usePerspective } from "sanity";
3
+ type IframeSizeKey = keyof SizeProps;
4
+ type Size = 'desktop' | 'mobile';
5
+ type SizeProps = { [key in Size]: {
6
+ width: string | number;
7
+ height: string | number;
8
+ } };
9
+ type UrlResolver = (document: SanityDocument | null, perspective: Pick<ReturnType<typeof usePerspective>, 'selectedPerspectiveName' | 'perspectiveStack'>) => string | Error | undefined | Promise<string | Error | undefined>;
10
+ interface IframeOptions {
11
+ /**
12
+ * If you have multiple iframe instances side-by-side you need to give each a unique key.
13
+ */
14
+ key?: string;
15
+ url: string | UrlResolver | {
16
+ /**
17
+ * The URL origin of where the preview is hosted, for example `https://example.com`.
18
+ * If it's an embedded Studio then set it to `'same-origin'`.
19
+ */
20
+ origin: 'same-origin' | (string & {});
21
+ /**
22
+ * The route to redirect to after enabling Draft Mode.
23
+ * If you don't have enough data to build the URL, return an `Error` instance to show an error message.
24
+ * @example `return new Error('Missing slug')`
25
+ * To prolong the loading state, return `undefined`
26
+ */
27
+ preview: string | UrlResolver;
28
+ /**
29
+ * The route that enables Draft Mode
30
+ * @example '/api/draft'
31
+ */
32
+ draftMode: string;
33
+ };
34
+ defaultSize?: IframeSizeKey;
35
+ showDisplayUrl?: boolean;
36
+ reload?: {
37
+ button?: boolean;
38
+ };
39
+ attributes?: Partial<{
40
+ allow: string;
41
+ referrerPolicy: HTMLAttributeReferrerPolicy | undefined;
42
+ sandbox: string;
43
+ onLoad: () => void;
44
+ }>;
45
+ }
46
+ interface IframeProps {
47
+ document: {
48
+ displayed: SanityDocument;
49
+ draft: SanityDocument | null;
50
+ published: SanityDocument | null;
51
+ };
52
+ options: IframeOptions;
53
+ }
54
+ declare function Iframe(props: IframeProps): React.JSX.Element;
55
+ export { Iframe, type IframeOptions, type IframeProps, type IframeSizeKey, type Size, type SizeProps, type UrlResolver };
56
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/Iframe.tsx"],"sourcesContent":[],"mappings":";;KAAY,aAAA,SAAsB;KAEtB,IAAA;KAEA,SAAA,aACF,IALE,GAAA;EAEA,KAAI,EAAA,MAAA,GAAA,MAAA;EAEJ,MAAA,EAAS,MAAA,GAAA,MACX;GC0BV;AD/BY,KC+BA,WAAA,GD/Ba,CAAA,QAAS,ECgCtB,cDhC+B,GAAA,IAAA,EAAA,WAAA,ECiC5B,IDjC4B,CCkCvC,UDlCuC,CAAA,OCkCrB,cDlCqB,CAAA,EAAA,yBAAA,GAAA,kBAAA,CAAA,EAAA,GAAA,MAAA,GCqC7B,KDrC6B,GAAA,SAAA,GCqCT,ODrCS,CAAA,MAAA,GCqCQ,KDrCR,GAAA,SAAA,CAAA;AAI/B,UCqCK,aAAA,CDpCP;;AC0BV;;EAGsB,GAAA,CAAA,EAAA,MAAA;EAAlB,GAAA,EAAA,MAAA,GAcE,WAdF,GAAA;IADW;;;;IAI0B,MAAA,EAAA,aAAA,GAAA,CAAA,MAAA,GAAA,CAAA,CAAA,CAAA;IAIxB;;;;;;IAgCK,OAAA,EAAA,MAAA,GAZI,WAYJ;IAUL;;;;IAMN,SAAA,EAAA,MAAA;EAAa,CAAA;EAOR,WAAM,CAAA,EA5BN,aA4Bc;;;;;eAvBf;;oBAEK;;;;;UAQH,WAAA;;eAEF;WACJ;eACI;;WAEJ;;iBAOK,MAAA,QAAc,cAAc,KAAA,CAAM,GAAA,CAAI"}
package/dist/index.js ADDED
@@ -0,0 +1,417 @@
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { c } from "react/compiler-runtime";
3
+ import { MobileDeviceIcon, RefreshIcon, CopyIcon, LaunchIcon, WarningOutlineIcon } from "@sanity/icons";
4
+ import { createPreviewSecret } from "@sanity/preview-url-secret/create-secret";
5
+ import { definePreviewUrl } from "@sanity/preview-url-secret/define-preview-url";
6
+ import { Text, useToast, Button, Flex, Tooltip, Box, Card, usePrefersReducedMotion, Container, Stack, Spinner } from "@sanity/ui";
7
+ import { motion, MotionConfig, AnimatePresence } from "motion/react";
8
+ import { useRef, useState, memo, forwardRef, useEffect, useTransition, Suspense } from "react";
9
+ import { useActiveWorkspace, useCurrentUser, useClient, usePerspective } from "sanity";
10
+ import { suspend } from "suspend-react";
11
+ import { getRedirectTo } from "@sanity/preview-url-secret/get-redirect-to";
12
+ function DisplayUrl(props) {
13
+ const $ = c(4);
14
+ let t0;
15
+ $[0] !== props.url ? (t0 = getRedirectTo(props.url), $[0] = props.url, $[1] = t0) : t0 = $[1];
16
+ const url = t0, truncatedUrl = `${url.origin === location.origin ? "" : url.origin}${url.pathname}${url.search}`;
17
+ let t1;
18
+ return $[2] !== truncatedUrl ? (t1 = /* @__PURE__ */ jsx(Text, { size: 0, textOverflow: "ellipsis", children: truncatedUrl }), $[2] = truncatedUrl, $[3] = t1) : t1 = $[3], t1;
19
+ }
20
+ const sizes = {
21
+ desktop: {
22
+ width: "100%",
23
+ height: "100%"
24
+ },
25
+ mobile: {
26
+ width: 414,
27
+ height: 746
28
+ }
29
+ }, DEFAULT_SIZE = "desktop";
30
+ function Toolbar(props) {
31
+ const $ = c(60), {
32
+ url,
33
+ iframeSize,
34
+ setIframeSize,
35
+ reloading,
36
+ showUrl,
37
+ reloadButton,
38
+ handleReload
39
+ } = props, validUrl = url instanceof URL, input = useRef(null), {
40
+ push: pushToast
41
+ } = useToast(), [, copy] = useCopyToClipboard();
42
+ let t0;
43
+ $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t0 = {
44
+ position: "absolute",
45
+ pointerEvents: "none",
46
+ opacity: 0
47
+ }, $[0] = t0) : t0 = $[0];
48
+ let t1;
49
+ $[1] !== url || $[2] !== validUrl ? (t1 = validUrl ? url.toString() : "", $[1] = url, $[2] = validUrl, $[3] = t1) : t1 = $[3];
50
+ let t2;
51
+ $[4] !== t1 ? (t2 = /* @__PURE__ */ jsx("textarea", { style: t0, ref: input, value: t1, readOnly: !0, tabIndex: -1 }), $[4] = t1, $[5] = t2) : t2 = $[5];
52
+ let t3;
53
+ $[6] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t3 = {
54
+ whiteSpace: "nowrap"
55
+ }, $[6] = t3) : t3 = $[6];
56
+ const t4 = iframeSize === "mobile" ? "Exit mobile preview" : "Preview mobile viewport";
57
+ let t5;
58
+ $[7] !== t4 ? (t5 = /* @__PURE__ */ jsx(Text, { size: 1, style: t3, children: t4 }), $[7] = t4, $[8] = t5) : t5 = $[8];
59
+ const t6 = !validUrl;
60
+ let t7;
61
+ $[9] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t7 = [1], $[9] = t7) : t7 = $[9];
62
+ const t8 = iframeSize === "mobile" ? "default" : "ghost";
63
+ let t9;
64
+ $[10] !== iframeSize || $[11] !== setIframeSize ? (t9 = () => setIframeSize(iframeSize === "mobile" ? "desktop" : "mobile"), $[10] = iframeSize, $[11] = setIframeSize, $[12] = t9) : t9 = $[12];
65
+ let t10;
66
+ $[13] !== t6 || $[14] !== t8 || $[15] !== t9 ? (t10 = /* @__PURE__ */ jsx(Button, { disabled: t6, fontSize: t7, padding: 2, mode: t8, icon: MobileDeviceIcon, onClick: t9 }), $[13] = t6, $[14] = t8, $[15] = t9, $[16] = t10) : t10 = $[16];
67
+ let t11;
68
+ $[17] !== t10 || $[18] !== t5 ? (t11 = /* @__PURE__ */ jsx(Flex, { align: "center", gap: 1, children: /* @__PURE__ */ jsx(Tooltip, { animate: !0, content: t5, padding: 2, placement: "bottom-start", children: t10 }) }), $[17] = t10, $[18] = t5, $[19] = t11) : t11 = $[19];
69
+ let t12;
70
+ $[20] !== showUrl || $[21] !== url || $[22] !== validUrl ? (t12 = showUrl && validUrl && /* @__PURE__ */ jsx(DisplayUrl, { url }), $[20] = showUrl, $[21] = url, $[22] = validUrl, $[23] = t12) : t12 = $[23];
71
+ let t13;
72
+ $[24] !== t12 ? (t13 = /* @__PURE__ */ jsx(Box, { flex: 1, children: t12 }), $[24] = t12, $[25] = t13) : t13 = $[25];
73
+ let t14;
74
+ $[26] !== handleReload || $[27] !== reloadButton || $[28] !== reloading || $[29] !== validUrl ? (t14 = reloadButton ? /* @__PURE__ */ jsx(Tooltip, { animate: !0, content: /* @__PURE__ */ jsx(Text, { size: 1, style: {
75
+ whiteSpace: "nowrap"
76
+ }, children: reloading ? "Reloading\u2026" : "Reload" }), padding: 2, children: /* @__PURE__ */ jsx(Button, { disabled: !validUrl, mode: "bleed", fontSize: [1], padding: 2, icon: RefreshIcon, loading: reloading, "aria-label": "Reload", onClick: () => handleReload() }) }) : null, $[26] = handleReload, $[27] = reloadButton, $[28] = reloading, $[29] = validUrl, $[30] = t14) : t14 = $[30];
77
+ let t15;
78
+ $[31] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t15 = /* @__PURE__ */ jsx(Text, { size: 1, style: {
79
+ whiteSpace: "nowrap"
80
+ }, children: "Copy URL" }), $[31] = t15) : t15 = $[31];
81
+ const t16 = !validUrl;
82
+ let t17;
83
+ $[32] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t17 = [1], $[32] = t17) : t17 = $[32];
84
+ let t18;
85
+ $[33] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t18 = [2], $[33] = t18) : t18 = $[33];
86
+ let t19;
87
+ $[34] !== copy || $[35] !== pushToast ? (t19 = () => {
88
+ input?.current?.value && copy(input.current.value).then((copied) => (pushToast(copied ? {
89
+ closable: !0,
90
+ status: "success",
91
+ title: "The URL is copied to the clipboard"
92
+ } : {
93
+ closable: !0,
94
+ status: "error",
95
+ title: "Failed to copy the URL to the clipboard"
96
+ }), copied));
97
+ }, $[34] = copy, $[35] = pushToast, $[36] = t19) : t19 = $[36];
98
+ let t20;
99
+ $[37] !== t16 || $[38] !== t19 ? (t20 = /* @__PURE__ */ jsx(Tooltip, { animate: !0, content: t15, padding: 2, children: /* @__PURE__ */ jsx(Button, { mode: "bleed", disabled: t16, fontSize: t17, icon: CopyIcon, padding: t18, "aria-label": "Copy URL", onClick: t19 }) }), $[37] = t16, $[38] = t19, $[39] = t20) : t20 = $[39];
100
+ let t21;
101
+ $[40] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t21 = /* @__PURE__ */ jsx(Text, { size: 1, style: {
102
+ whiteSpace: "nowrap"
103
+ }, children: "Open URL in a new tab" }), $[40] = t21) : t21 = $[40];
104
+ const t22 = !validUrl;
105
+ let t23;
106
+ $[41] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t23 = [1], $[41] = t23) : t23 = $[41];
107
+ let t24;
108
+ $[42] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t24 = [2], $[42] = t24) : t24 = $[42];
109
+ let t25;
110
+ $[43] !== url || $[44] !== validUrl ? (t25 = validUrl ? () => window.open(url.toString()) : void 0, $[43] = url, $[44] = validUrl, $[45] = t25) : t25 = $[45];
111
+ let t26;
112
+ $[46] !== t22 || $[47] !== t25 ? (t26 = /* @__PURE__ */ jsx(Tooltip, { animate: !0, content: t21, padding: 2, placement: "bottom-end", children: /* @__PURE__ */ jsx(Button, { disabled: t22, fontSize: t23, icon: LaunchIcon, mode: "ghost", paddingY: t24, text: "Open", "aria-label": "Open URL in a new tab", onClick: t25 }) }), $[46] = t22, $[47] = t25, $[48] = t26) : t26 = $[48];
113
+ let t27;
114
+ $[49] !== t14 || $[50] !== t20 || $[51] !== t26 ? (t27 = /* @__PURE__ */ jsxs(Flex, { align: "center", gap: 1, children: [
115
+ t14,
116
+ t20,
117
+ t26
118
+ ] }), $[49] = t14, $[50] = t20, $[51] = t26, $[52] = t27) : t27 = $[52];
119
+ let t28;
120
+ $[53] !== t11 || $[54] !== t13 || $[55] !== t27 ? (t28 = /* @__PURE__ */ jsx(Card, { padding: 2, borderBottom: !0, children: /* @__PURE__ */ jsxs(Flex, { align: "center", gap: 2, children: [
121
+ t11,
122
+ t13,
123
+ t27
124
+ ] }) }), $[53] = t11, $[54] = t13, $[55] = t27, $[56] = t28) : t28 = $[56];
125
+ let t29;
126
+ return $[57] !== t2 || $[58] !== t28 ? (t29 = /* @__PURE__ */ jsxs(Fragment, { children: [
127
+ t2,
128
+ t28
129
+ ] }), $[57] = t2, $[58] = t28, $[59] = t29) : t29 = $[59], t29;
130
+ }
131
+ function useCopyToClipboard() {
132
+ const $ = c(3), [copiedText, setCopiedText] = useState(null);
133
+ let t0;
134
+ $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t0 = async (text) => {
135
+ if (!navigator?.clipboard)
136
+ return console.warn("Clipboard not supported"), !1;
137
+ try {
138
+ return await navigator.clipboard.writeText(text), setCopiedText(text), !0;
139
+ } catch (t12) {
140
+ return console.warn("Copy failed", t12), setCopiedText(null), !1;
141
+ }
142
+ }, $[0] = t0) : t0 = $[0];
143
+ const copy = t0;
144
+ let t1;
145
+ return $[1] !== copiedText ? (t1 = [copiedText, copy], $[1] = copiedText, $[2] = t1) : t1 = $[2], t1;
146
+ }
147
+ const MotionFlex = motion.create(Flex);
148
+ function encodeStudioPerspective(studioPerspective) {
149
+ return Array.isArray(studioPerspective) ? studioPerspective.join(",") : studioPerspective;
150
+ }
151
+ function Iframe(props) {
152
+ const $ = c(36), {
153
+ document,
154
+ options
155
+ } = props, draft = document.draft || document.published || document.displayed, {
156
+ defaultSize: t0,
157
+ reload,
158
+ attributes,
159
+ showDisplayUrl: t1,
160
+ key
161
+ } = options, defaultSize = t0 === void 0 ? DEFAULT_SIZE : t0, showDisplayUrl = t1 === void 0 ? !0 : t1, basePath = useActiveWorkspace()?.activeWorkspace?.basePath || "/", urlRef = useRef(options.url);
162
+ let t2;
163
+ $[0] !== draft || $[1] !== key ? (t2 = () => ({
164
+ key,
165
+ draft
166
+ }), $[0] = draft, $[1] = key, $[2] = t2) : t2 = $[2];
167
+ const [draftSnapshot, setDraftSnapshot] = useState(t2);
168
+ let t3, t4;
169
+ $[3] !== options.url ? (t3 = () => {
170
+ urlRef.current = options.url;
171
+ }, t4 = [options.url], $[3] = options.url, $[4] = t3, $[5] = t4) : (t3 = $[4], t4 = $[5]), useEffect(t3, t4);
172
+ const currentUser = useCurrentUser();
173
+ let t5;
174
+ $[6] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t5 = {
175
+ apiVersion: "2023-10-16"
176
+ }, $[6] = t5) : t5 = $[6];
177
+ const client = useClient(t5), [expiresAt, setExpiresAt] = useState(), previewSecretRef = useRef(void 0), [isResolvingUrl, startTransition] = useTransition(), {
178
+ perspectiveStack,
179
+ selectedPerspectiveName
180
+ } = usePerspective();
181
+ let t6;
182
+ $[7] !== perspectiveStack || $[8] !== selectedPerspectiveName ? (t6 = {
183
+ perspectiveStack,
184
+ selectedPerspectiveName
185
+ }, $[7] = perspectiveStack, $[8] = selectedPerspectiveName, $[9] = t6) : t6 = $[9];
186
+ const perspective = t6;
187
+ let t7, t8;
188
+ $[10] !== draft || $[11] !== draftSnapshot || $[12] !== key ? (t7 = () => {
189
+ JSON.stringify({
190
+ key,
191
+ draft
192
+ }) !== JSON.stringify(draftSnapshot) && startTransition(() => setDraftSnapshot({
193
+ key,
194
+ draft
195
+ }));
196
+ }, t8 = [draft, draftSnapshot, key, startTransition], $[10] = draft, $[11] = draftSnapshot, $[12] = key, $[13] = t7, $[14] = t8) : (t7 = $[13], t8 = $[14]), useEffect(t7, t8);
197
+ let t9;
198
+ $[15] !== basePath || $[16] !== client || $[17] !== currentUser?.id || $[18] !== perspective ? (t9 = async (draft_0) => {
199
+ if (typeof location > "u")
200
+ return;
201
+ const urlProp = urlRef.current;
202
+ if (typeof urlProp == "string")
203
+ return new URL(urlProp, location.origin);
204
+ if (typeof urlProp == "function") {
205
+ const url = await urlProp(draft_0, perspective);
206
+ return typeof url == "string" ? new URL(url, location.origin) : url;
207
+ }
208
+ if (typeof urlProp == "object") {
209
+ const preview = typeof urlProp.preview == "function" ? await urlProp.preview(draft_0, perspective) : urlProp.preview;
210
+ if (typeof preview != "string")
211
+ return preview;
212
+ if (!previewSecretRef.current) {
213
+ const {
214
+ secret,
215
+ expiresAt: expiresAt_0
216
+ } = await createPreviewSecret(client, "sanity-plugin-iframe-pane", location.href, currentUser?.id);
217
+ previewSecretRef.current = secret, startTransition(() => setExpiresAt(expiresAt_0.getTime()));
218
+ }
219
+ const url_0 = await definePreviewUrl({
220
+ origin: urlProp.origin === "same-origin" ? location.origin : urlProp.origin,
221
+ preview,
222
+ draftMode: {
223
+ enable: urlProp.draftMode
224
+ }
225
+ })({
226
+ client,
227
+ previewUrlSecret: previewSecretRef.current,
228
+ previewSearchParam: null,
229
+ studioBasePath: basePath,
230
+ studioPreviewPerspective: encodeStudioPerspective(perspective.perspectiveStack)
231
+ });
232
+ return new URL(url_0, location.origin);
233
+ }
234
+ }, $[15] = basePath, $[16] = client, $[17] = currentUser?.id, $[18] = perspective, $[19] = t9) : t9 = $[19];
235
+ const url_1 = t9;
236
+ let t10, t11;
237
+ $[20] !== expiresAt ? (t10 = () => {
238
+ if (expiresAt) {
239
+ const timeout = setTimeout(() => {
240
+ startTransition(() => setExpiresAt(void 0)), previewSecretRef.current = void 0;
241
+ }, Math.max(0, expiresAt - Date.now()));
242
+ return () => clearTimeout(timeout);
243
+ }
244
+ }, t11 = [expiresAt], $[20] = expiresAt, $[21] = t10, $[22] = t11) : (t10 = $[21], t11 = $[22]), useEffect(t10, t11);
245
+ let t12;
246
+ $[23] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t12 = /* @__PURE__ */ jsx(Loading, { iframeSize: "desktop" }), $[23] = t12) : t12 = $[23];
247
+ const t13 = `${draftSnapshot.key}-${selectedPerspectiveName || "draft"}`, t14 = currentUser?.id;
248
+ let t15;
249
+ return $[24] !== attributes || $[25] !== defaultSize || $[26] !== draftSnapshot.draft || $[27] !== draftSnapshot.key || $[28] !== isResolvingUrl || $[29] !== perspective || $[30] !== reload || $[31] !== showDisplayUrl || $[32] !== t13 || $[33] !== t14 || $[34] !== url_1 ? (t15 = /* @__PURE__ */ jsx(Suspense, { fallback: t12, children: /* @__PURE__ */ jsx(IframeInner, { _key: draftSnapshot.key, draftSnapshot: draftSnapshot.draft, url: url_1, isResolvingUrl, attributes, perspective, defaultSize, reload, showDisplayUrl, userId: t14 }, t13) }), $[24] = attributes, $[25] = defaultSize, $[26] = draftSnapshot.draft, $[27] = draftSnapshot.key, $[28] = isResolvingUrl, $[29] = perspective, $[30] = reload, $[31] = showDisplayUrl, $[32] = t13, $[33] = t14, $[34] = url_1, $[35] = t15) : t15 = $[35], t15;
250
+ }
251
+ const IframeInner = memo(function(props) {
252
+ const $ = c(35), {
253
+ isResolvingUrl,
254
+ defaultSize: t0,
255
+ reload,
256
+ attributes: t1,
257
+ showDisplayUrl: t2,
258
+ draftSnapshot,
259
+ userId,
260
+ expiresAt,
261
+ perspective: t3,
262
+ _key
263
+ } = props, defaultSize = t0 === void 0 ? DEFAULT_SIZE : t0;
264
+ let t4;
265
+ $[0] !== t1 ? (t4 = t1 === void 0 ? {} : t1, $[0] = t1, $[1] = t4) : t4 = $[1];
266
+ const attributes = t4, showDisplayUrl = t2 === void 0 ? !0 : t2, {
267
+ selectedPerspectiveName,
268
+ perspectiveStack
269
+ } = t3, [iframeSize, setIframeSize] = useState(sizes?.[defaultSize] ? defaultSize : DEFAULT_SIZE), prefersReducedMotion = usePrefersReducedMotion();
270
+ let t5;
271
+ $[2] !== draftSnapshot || $[3] !== props ? (t5 = () => props.url(draftSnapshot), $[2] = draftSnapshot, $[3] = props, $[4] = t5) : t5 = $[4];
272
+ let t6;
273
+ $[5] !== _key || $[6] !== draftSnapshot || $[7] !== expiresAt || $[8] !== perspectiveStack || $[9] !== selectedPerspectiveName || $[10] !== t5 || $[11] !== userId ? (t6 = suspend(t5, ["sanity-plugin-iframe-pane", draftSnapshot, selectedPerspectiveName, perspectiveStack, userId, expiresAt, _key, resolveUUID]), $[5] = _key, $[6] = draftSnapshot, $[7] = expiresAt, $[8] = perspectiveStack, $[9] = selectedPerspectiveName, $[10] = t5, $[11] = userId, $[12] = t6) : t6 = $[12];
274
+ const url = t6, [loading, setLoading] = useState(!0), [_reloading, setReloading] = useState(!1), reloading = _reloading || isResolvingUrl, iframe = useRef(null);
275
+ let t7;
276
+ $[13] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t7 = () => {
277
+ if (!iframe?.current)
278
+ return;
279
+ const {
280
+ src
281
+ } = iframe.current;
282
+ iframe.current.src = src, setReloading(!0);
283
+ }, $[13] = t7) : t7 = $[13];
284
+ const handleReload = t7;
285
+ let t8;
286
+ $[14] !== prefersReducedMotion ? (t8 = prefersReducedMotion ? {
287
+ duration: 0
288
+ } : void 0, $[14] = prefersReducedMotion, $[15] = t8) : t8 = $[15];
289
+ let t9;
290
+ $[16] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t9 = {
291
+ height: "100%"
292
+ }, $[16] = t9) : t9 = $[16];
293
+ const t10 = !!reload?.button;
294
+ let t11;
295
+ $[17] !== iframeSize || $[18] !== reloading || $[19] !== showDisplayUrl || $[20] !== t10 || $[21] !== url ? (t11 = /* @__PURE__ */ jsx(Toolbar, { url, iframeSize, reloading, setIframeSize, showUrl: showDisplayUrl, reloadButton: t10, handleReload }), $[17] = iframeSize, $[18] = reloading, $[19] = showDisplayUrl, $[20] = t10, $[21] = url, $[22] = t11) : t11 = $[22];
296
+ let t12;
297
+ $[23] !== attributes || $[24] !== iframeSize || $[25] !== loading || $[26] !== reloading || $[27] !== url ? (t12 = url instanceof Error ? /* @__PURE__ */ jsx(ErrorCard, { error: url }) : /* @__PURE__ */ jsx(Card, { tone: "transparent", style: {
298
+ height: "100%"
299
+ }, children: /* @__PURE__ */ jsx(Frame, { ref: iframe, loading, reloading, iframeSize, setReloading, setLoading, url, attributes }) }), $[23] = attributes, $[24] = iframeSize, $[25] = loading, $[26] = reloading, $[27] = url, $[28] = t12) : t12 = $[28];
300
+ let t13;
301
+ $[29] !== t11 || $[30] !== t12 ? (t13 = /* @__PURE__ */ jsxs(Flex, { direction: "column", style: t9, children: [
302
+ t11,
303
+ t12
304
+ ] }), $[29] = t11, $[30] = t12, $[31] = t13) : t13 = $[31];
305
+ let t14;
306
+ return $[32] !== t13 || $[33] !== t8 ? (t14 = /* @__PURE__ */ jsx(MotionConfig, { transition: t8, children: t13 }), $[32] = t13, $[33] = t8, $[34] = t14) : t14 = $[34], t14;
307
+ }), Frame = forwardRef(function(props, iframe) {
308
+ const $ = c(22), {
309
+ loading,
310
+ setLoading,
311
+ iframeSize,
312
+ attributes,
313
+ reloading,
314
+ url,
315
+ setReloading
316
+ } = props;
317
+ let t0;
318
+ $[0] !== attributes || $[1] !== setLoading || $[2] !== setReloading ? (t0 = function() {
319
+ setLoading(!1), setReloading(!1), attributes.onLoad && typeof attributes.onLoad == "function" && attributes.onLoad();
320
+ }, $[0] = attributes, $[1] = setLoading, $[2] = setReloading, $[3] = t0) : t0 = $[3];
321
+ const handleIframeLoad = t0;
322
+ let t1;
323
+ $[4] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t1 = {
324
+ height: "100%",
325
+ position: "relative"
326
+ }, $[4] = t1) : t1 = $[4];
327
+ let t2;
328
+ $[5] !== iframeSize || $[6] !== loading || $[7] !== url ? (t2 = !url || loading && /* @__PURE__ */ jsx(MotionFlex, { initial: "initial", animate: "animate", exit: "exit", variants: spinnerVariants, justify: "center", align: "center", style: {
329
+ inset: "0",
330
+ position: "absolute"
331
+ }, children: /* @__PURE__ */ jsx(Loading, { iframeSize }) }), $[5] = iframeSize, $[6] = loading, $[7] = url, $[8] = t2) : t2 = $[8];
332
+ let t3;
333
+ $[9] !== t2 ? (t3 = /* @__PURE__ */ jsx(AnimatePresence, { children: t2 }), $[9] = t2, $[10] = t3) : t3 = $[10];
334
+ let t4;
335
+ $[11] !== attributes || $[12] !== handleIframeLoad || $[13] !== iframe || $[14] !== iframeSize || $[15] !== loading || $[16] !== reloading || $[17] !== url ? (t4 = url && /* @__PURE__ */ jsx(motion.iframe, { ref: iframe, title: "preview", frameBorder: "0", style: {
336
+ maxHeight: "100%"
337
+ }, src: url.toString(), initial: ["background", iframeSize], variants: iframeVariants, animate: [loading ? "background" : "active", reloading ? "reloading" : "idle", iframeSize], ...attributes, onLoad: handleIframeLoad }), $[11] = attributes, $[12] = handleIframeLoad, $[13] = iframe, $[14] = iframeSize, $[15] = loading, $[16] = reloading, $[17] = url, $[18] = t4) : t4 = $[18];
338
+ let t5;
339
+ return $[19] !== t3 || $[20] !== t4 ? (t5 = /* @__PURE__ */ jsxs(Flex, { align: "center", justify: "center", style: t1, children: [
340
+ t3,
341
+ t4
342
+ ] }), $[19] = t3, $[20] = t4, $[21] = t5) : t5 = $[21], t5;
343
+ }), spinnerVariants = {
344
+ initial: {
345
+ opacity: 1
346
+ },
347
+ animate: {
348
+ opacity: [0, 0, 1]
349
+ },
350
+ exit: {
351
+ opacity: [1, 0, 0]
352
+ }
353
+ }, iframeVariants = {
354
+ ...sizes,
355
+ desktop: {
356
+ ...sizes.desktop,
357
+ boxShadow: "0 0 0 0px var(--card-shadow-outline-color)"
358
+ },
359
+ mobile: {
360
+ ...sizes.mobile,
361
+ boxShadow: "0 0 0 1px var(--card-shadow-outline-color)"
362
+ },
363
+ background: {
364
+ opacity: 0,
365
+ scale: 1
366
+ },
367
+ idle: {
368
+ scale: 1
369
+ },
370
+ reloading: {
371
+ scale: [1, 1, 1, 0.98]
372
+ },
373
+ active: {
374
+ opacity: [0, 0, 1],
375
+ scale: 1
376
+ }
377
+ };
378
+ function Loading(t0) {
379
+ const $ = c(6), {
380
+ iframeSize
381
+ } = t0, t1 = sizes[iframeSize];
382
+ let t2;
383
+ $[0] !== t1 ? (t2 = {
384
+ ...t1
385
+ }, $[0] = t1, $[1] = t2) : t2 = $[1];
386
+ let t3, t4;
387
+ $[2] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t3 = /* @__PURE__ */ jsx(Spinner, { muted: !0 }), t4 = /* @__PURE__ */ jsx(Text, { muted: !0, size: 1, children: "Loading\u2026" }), $[2] = t3, $[3] = t4) : (t3 = $[2], t4 = $[3]);
388
+ let t5;
389
+ return $[4] !== t2 ? (t5 = /* @__PURE__ */ jsxs(Flex, { style: t2, justify: "center", align: "center", direction: "column", gap: 4, children: [
390
+ t3,
391
+ t4
392
+ ] }), $[4] = t2, $[5] = t5) : t5 = $[5], t5;
393
+ }
394
+ function ErrorCard(t0) {
395
+ const $ = c(8), {
396
+ error
397
+ } = t0;
398
+ let t1;
399
+ $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t1 = /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, { size: 1, children: /* @__PURE__ */ jsx(WarningOutlineIcon, {}) }) }), $[0] = t1) : t1 = $[0];
400
+ let t2;
401
+ $[1] !== error.name ? (t2 = /* @__PURE__ */ jsx(Text, { as: "h1", size: 1, weight: "bold", children: error.name }), $[1] = error.name, $[2] = t2) : t2 = $[2];
402
+ let t3;
403
+ $[3] !== error.message ? (t3 = /* @__PURE__ */ jsx(Text, { as: "p", muted: !0, size: 1, children: error.message }), $[3] = error.message, $[4] = t3) : t3 = $[4];
404
+ let t4;
405
+ return $[5] !== t2 || $[6] !== t3 ? (t4 = /* @__PURE__ */ jsx(Card, { height: "fill", children: /* @__PURE__ */ jsx(Flex, { align: "center", height: "fill", justify: "center", padding: 4, sizing: "border", children: /* @__PURE__ */ jsx(Container, { width: 0, children: /* @__PURE__ */ jsx(Card, { padding: 4, radius: 2, shadow: 1, tone: "caution", children: /* @__PURE__ */ jsxs(Flex, { children: [
406
+ t1,
407
+ /* @__PURE__ */ jsxs(Stack, { flex: 1, marginLeft: 3, space: 3, children: [
408
+ t2,
409
+ t3
410
+ ] })
411
+ ] }) }) }) }) }), $[5] = t2, $[6] = t3, $[7] = t4) : t4 = $[7], t4;
412
+ }
413
+ const resolveUUID = /* @__PURE__ */ Symbol();
414
+ export {
415
+ Iframe
416
+ };
417
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/DisplayUrl.tsx","../src/Toolbar.tsx","../src/Iframe.tsx"],"sourcesContent":["import {getRedirectTo} from '@sanity/preview-url-secret/get-redirect-to'\nimport {Text} from '@sanity/ui'\nimport {useMemo} from 'react'\n\nexport function DisplayUrl(props: {url: URL}) {\n const truncatedUrl = useMemo(() => {\n const url = getRedirectTo(props.url)\n return `${url.origin === location.origin ? '' : url.origin}${url.pathname}${url.search}`\n }, [props.url])\n\n return (\n <Text size={0} textOverflow=\"ellipsis\">\n {truncatedUrl}\n </Text>\n )\n}\n","import {CopyIcon, LaunchIcon, MobileDeviceIcon, RefreshIcon} from '@sanity/icons'\nimport {Box, Button, Card, Flex, Text, Tooltip, useToast} from '@sanity/ui'\nimport {useCallback, useRef, useState} from 'react'\n\nimport type {IframeSizeKey, SizeProps} from './types'\n\nimport {DisplayUrl} from './DisplayUrl'\n\nexport const sizes: SizeProps = {\n desktop: {\n width: '100%',\n height: '100%',\n },\n mobile: {\n width: 414,\n height: 746,\n },\n}\n\nexport const DEFAULT_SIZE = 'desktop'\n\nexport interface ToolbarProps {\n url: URL | Error | undefined\n iframeSize: IframeSizeKey\n setIframeSize: (size: IframeSizeKey) => void\n showUrl: boolean\n reloading: boolean\n reloadButton: boolean\n handleReload: () => void\n}\nexport function Toolbar(props: ToolbarProps) {\n const {url, iframeSize, setIframeSize, reloading, showUrl, reloadButton, handleReload} = props\n const validUrl = url instanceof URL\n\n const input = useRef<HTMLTextAreaElement>(null)\n const {push: pushToast} = useToast()\n const [, copy] = useCopyToClipboard()\n\n return (\n <>\n <textarea\n style={{position: 'absolute', pointerEvents: 'none', opacity: 0}}\n ref={input}\n value={validUrl ? url.toString() : ''}\n readOnly\n tabIndex={-1}\n />\n <Card padding={2} borderBottom>\n <Flex align=\"center\" gap={2}>\n <Flex align=\"center\" gap={1}>\n <Tooltip\n animate\n content={\n <Text size={1} style={{whiteSpace: 'nowrap'}}>\n {iframeSize === 'mobile' ? 'Exit mobile preview' : 'Preview mobile viewport'}\n </Text>\n }\n padding={2}\n placement=\"bottom-start\"\n >\n <Button\n disabled={!validUrl}\n fontSize={[1]}\n padding={2}\n mode={iframeSize === 'mobile' ? 'default' : 'ghost'}\n icon={MobileDeviceIcon}\n onClick={() => setIframeSize(iframeSize === 'mobile' ? 'desktop' : 'mobile')}\n />\n </Tooltip>\n </Flex>\n <Box flex={1}>{showUrl && validUrl && <DisplayUrl url={url} />}</Box>\n <Flex align=\"center\" gap={1}>\n {reloadButton ? (\n <Tooltip\n animate\n content={\n <Text size={1} style={{whiteSpace: 'nowrap'}}>\n {reloading ? 'Reloading…' : 'Reload'}\n </Text>\n }\n padding={2}\n >\n <Button\n disabled={!validUrl}\n mode=\"bleed\"\n fontSize={[1]}\n padding={2}\n icon={RefreshIcon}\n loading={reloading}\n aria-label=\"Reload\"\n onClick={() => handleReload()}\n />\n </Tooltip>\n ) : null}\n <Tooltip\n animate\n content={\n <Text size={1} style={{whiteSpace: 'nowrap'}}>\n Copy URL\n </Text>\n }\n padding={2}\n >\n <Button\n mode=\"bleed\"\n disabled={!validUrl}\n fontSize={[1]}\n icon={CopyIcon}\n padding={[2]}\n aria-label=\"Copy URL\"\n onClick={() => {\n if (!input?.current?.value) return\n\n void copy(input.current.value).then((copied) => {\n if (copied) {\n pushToast({\n closable: true,\n status: 'success',\n title: 'The URL is copied to the clipboard',\n })\n } else {\n pushToast({\n closable: true,\n status: 'error',\n title: 'Failed to copy the URL to the clipboard',\n })\n }\n return copied\n })\n }}\n />\n </Tooltip>\n <Tooltip\n animate\n content={\n <Text size={1} style={{whiteSpace: 'nowrap'}}>\n Open URL in a new tab\n </Text>\n }\n padding={2}\n placement=\"bottom-end\"\n >\n <Button\n disabled={!validUrl}\n fontSize={[1]}\n icon={LaunchIcon}\n mode=\"ghost\"\n paddingY={[2]}\n text=\"Open\"\n aria-label=\"Open URL in a new tab\"\n onClick={validUrl ? () => window.open(url.toString()) : undefined}\n />\n </Tooltip>\n </Flex>\n </Flex>\n </Card>\n </>\n )\n}\n\ntype CopiedValue = string | null\n\ntype CopyFn = (text: string) => Promise<boolean>\n\nfunction useCopyToClipboard(): [CopiedValue, CopyFn] {\n const [copiedText, setCopiedText] = useState<CopiedValue>(null)\n\n const copy: CopyFn = useCallback(async (text) => {\n if (!navigator?.clipboard) {\n console.warn('Clipboard not supported')\n return false\n }\n\n // Try to save to clipboard then save it in the state if worked\n try {\n await navigator.clipboard.writeText(text)\n setCopiedText(text)\n return true\n } catch (error) {\n console.warn('Copy failed', error)\n setCopiedText(null)\n return false\n }\n }, [])\n\n return [copiedText, copy]\n}\n","import type {HTMLAttributeReferrerPolicy} from 'react'\n\nimport {WarningOutlineIcon} from '@sanity/icons'\nimport {createPreviewSecret} from '@sanity/preview-url-secret/create-secret'\nimport {definePreviewUrl} from '@sanity/preview-url-secret/define-preview-url'\nimport {Box, Card, Container, Flex, Spinner, Stack, Text, usePrefersReducedMotion} from '@sanity/ui'\nimport {AnimatePresence, motion, MotionConfig} from 'motion/react'\nimport {\n forwardRef,\n memo,\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useTransition,\n} from 'react'\nimport {\n type SanityDocument,\n useActiveWorkspace,\n useClient,\n useCurrentUser,\n usePerspective,\n} from 'sanity'\nimport {suspend} from 'suspend-react'\n\nimport type {IframeSizeKey} from './types'\n\nimport {DEFAULT_SIZE, sizes, Toolbar} from './Toolbar'\n\nexport type UrlResolver = (\n document: SanityDocument | null,\n perspective: Pick<\n ReturnType<typeof usePerspective>,\n 'selectedPerspectiveName' | 'perspectiveStack'\n >,\n) => string | Error | undefined | Promise<string | Error | undefined>\n\nexport type {IframeSizeKey}\n\nexport interface IframeOptions {\n /**\n * If you have multiple iframe instances side-by-side you need to give each a unique key.\n */\n key?: string\n url:\n | string\n | UrlResolver\n | {\n /**\n * The URL origin of where the preview is hosted, for example `https://example.com`.\n * If it's an embedded Studio then set it to `'same-origin'`.\n */\n origin: 'same-origin' | (string & {})\n /**\n * The route to redirect to after enabling Draft Mode.\n * If you don't have enough data to build the URL, return an `Error` instance to show an error message.\n * @example `return new Error('Missing slug')`\n * To prolong the loading state, return `undefined`\n */\n preview: string | UrlResolver\n /**\n * The route that enables Draft Mode\n * @example '/api/draft'\n */\n draftMode: string\n }\n defaultSize?: IframeSizeKey\n showDisplayUrl?: boolean\n reload?: {\n button?: boolean\n }\n attributes?: Partial<{\n allow: string\n referrerPolicy: HTMLAttributeReferrerPolicy | undefined\n sandbox: string\n onLoad: () => void\n }>\n}\n\nconst MotionFlex = motion.create(Flex)\n\nexport interface IframeProps {\n document: {\n displayed: SanityDocument\n draft: SanityDocument | null\n published: SanityDocument | null\n }\n options: IframeOptions\n}\n\nfunction encodeStudioPerspective(studioPerspective: string[] | string): string {\n return Array.isArray(studioPerspective) ? studioPerspective.join(',') : studioPerspective\n}\n\nexport function Iframe(props: IframeProps): React.JSX.Element {\n const {document, options} = props\n const draft = document.draft || document.published || document.displayed\n\n const {defaultSize = DEFAULT_SIZE, reload, attributes, showDisplayUrl = true, key} = options\n\n const workspace = useActiveWorkspace()\n const basePath = workspace?.activeWorkspace?.basePath || '/'\n const urlRef = useRef(options.url)\n const [draftSnapshot, setDraftSnapshot] = useState(() => ({key, draft}))\n useEffect(() => {\n urlRef.current = options.url\n }, [options.url])\n const currentUser = useCurrentUser()\n const client = useClient({apiVersion: '2023-10-16'})\n const [expiresAt, setExpiresAt] = useState<number | undefined>()\n const previewSecretRef = useRef<string | undefined>(undefined)\n const [isResolvingUrl, startTransition] = useTransition()\n const {perspectiveStack, selectedPerspectiveName} = usePerspective()\n const perspective = useMemo(\n () => ({\n perspectiveStack,\n selectedPerspectiveName,\n }),\n [perspectiveStack, selectedPerspectiveName],\n )\n\n useEffect(() => {\n if (JSON.stringify({key, draft}) !== JSON.stringify(draftSnapshot)) {\n startTransition(() => setDraftSnapshot({key, draft}))\n }\n }, [draft, draftSnapshot, key, startTransition])\n\n const url = useCallback(\n async (draft: SanityDocument | null) => {\n if (typeof location === 'undefined') {\n return undefined\n }\n const urlProp = urlRef.current\n if (typeof urlProp === 'string') {\n return new URL(urlProp, location.origin)\n }\n if (typeof urlProp === 'function') {\n const url = await urlProp(draft, perspective)\n return typeof url === 'string' ? new URL(url, location.origin) : url\n }\n if (typeof urlProp === 'object') {\n const preview =\n typeof urlProp.preview === 'function'\n ? await urlProp.preview(draft, perspective)\n : urlProp.preview\n if (typeof preview !== 'string') {\n return preview\n }\n if (!previewSecretRef.current) {\n const {secret, expiresAt} = await createPreviewSecret(\n client,\n 'sanity-plugin-iframe-pane',\n location.href,\n currentUser?.id,\n )\n previewSecretRef.current = secret\n startTransition(() => setExpiresAt(expiresAt.getTime()))\n }\n\n const resolvePreviewUrl = definePreviewUrl({\n origin: urlProp.origin === 'same-origin' ? location.origin : urlProp.origin,\n preview,\n draftMode: {\n enable: urlProp.draftMode,\n },\n })\n const url = await resolvePreviewUrl({\n client,\n previewUrlSecret: previewSecretRef.current,\n previewSearchParam: null,\n studioBasePath: basePath,\n studioPreviewPerspective: encodeStudioPerspective(perspective.perspectiveStack),\n })\n return new URL(url, location.origin)\n }\n return undefined\n },\n [basePath, client, currentUser?.id, perspective, startTransition],\n )\n useEffect(() => {\n if (expiresAt) {\n const timeout = setTimeout(\n () => {\n startTransition(() => setExpiresAt(undefined))\n previewSecretRef.current = undefined\n },\n Math.max(0, expiresAt - Date.now()),\n )\n return () => clearTimeout(timeout)\n }\n return undefined\n }, [expiresAt])\n\n return (\n <Suspense fallback={<Loading iframeSize=\"desktop\" />}>\n <IframeInner\n key={`${draftSnapshot.key}-${selectedPerspectiveName || 'draft'}`}\n _key={draftSnapshot.key}\n draftSnapshot={draftSnapshot.draft}\n url={url}\n isResolvingUrl={isResolvingUrl}\n attributes={attributes}\n perspective={perspective}\n defaultSize={defaultSize}\n reload={reload}\n showDisplayUrl={showDisplayUrl}\n userId={currentUser?.id}\n />\n </Suspense>\n )\n}\n\nexport interface IframeInnerProps extends Omit<IframeOptions, 'url'> {\n url: (draftSnapshot: SanityDocument | null) => Promise<URL | Error | undefined>\n isResolvingUrl: boolean\n draftSnapshot: SanityDocument | null\n perspective: Parameters<UrlResolver>[1]\n userId?: string\n expiresAt?: number\n _key?: string\n}\nconst IframeInner = memo(function IframeInner(props: IframeInnerProps) {\n const {\n isResolvingUrl,\n defaultSize = DEFAULT_SIZE,\n reload,\n attributes = {},\n showDisplayUrl = true,\n draftSnapshot,\n userId,\n expiresAt,\n perspective: {selectedPerspectiveName, perspectiveStack},\n _key,\n } = props\n const [iframeSize, setIframeSize] = useState(sizes?.[defaultSize] ? defaultSize : DEFAULT_SIZE)\n\n const prefersReducedMotion = usePrefersReducedMotion()\n\n const url = suspend(\n () => props.url(draftSnapshot),\n [\n // Cache based on a few specific conditions\n 'sanity-plugin-iframe-pane',\n draftSnapshot,\n selectedPerspectiveName,\n perspectiveStack,\n userId,\n expiresAt,\n _key,\n resolveUUID,\n ],\n )\n\n const [loading, setLoading] = useState(true)\n const [_reloading, setReloading] = useState(false)\n const reloading = _reloading || isResolvingUrl\n\n const iframe = useRef<HTMLIFrameElement>(null)\n\n const handleReload = useCallback(() => {\n if (!iframe?.current) {\n return\n }\n\n // Funky way to reload an iframe without CORS issues\n const {src} = iframe.current\n iframe.current.src = src\n\n setReloading(true)\n }, [])\n\n return (\n <MotionConfig transition={prefersReducedMotion ? {duration: 0} : undefined}>\n <Flex direction=\"column\" style={{height: '100%'}}>\n <Toolbar\n url={url}\n iframeSize={iframeSize}\n reloading={reloading}\n setIframeSize={setIframeSize}\n showUrl={showDisplayUrl}\n reloadButton={!!reload?.button}\n handleReload={handleReload}\n />\n {url instanceof Error ? (\n <ErrorCard error={url} />\n ) : (\n <Card tone=\"transparent\" style={{height: '100%'}}>\n <Frame\n ref={iframe}\n loading={loading}\n reloading={reloading}\n iframeSize={iframeSize}\n setReloading={setReloading}\n setLoading={setLoading}\n url={url}\n attributes={attributes}\n />\n </Card>\n )}\n </Flex>\n </MotionConfig>\n )\n})\n\ninterface FrameProps extends Required<Pick<IframeOptions, 'attributes'>> {\n loading: boolean\n reloading: boolean\n setLoading: (loading: boolean) => void\n setReloading: (reloading: boolean) => void\n iframeSize: IframeSizeKey\n url: URL | undefined\n}\nconst Frame = forwardRef(function Frame(\n props: FrameProps,\n iframe: React.ForwardedRef<HTMLIFrameElement>,\n) {\n const {loading, setLoading, iframeSize, attributes, reloading, url, setReloading} = props\n\n function handleIframeLoad() {\n setLoading(false)\n setReloading(false)\n // Run onLoad from attributes\n if (attributes.onLoad && typeof attributes.onLoad === 'function') {\n attributes.onLoad()\n }\n }\n\n return (\n <Flex align=\"center\" justify=\"center\" style={{height: '100%', position: 'relative'}}>\n <AnimatePresence>\n {!url ||\n (loading && (\n <MotionFlex\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n variants={spinnerVariants}\n justify=\"center\"\n align=\"center\"\n style={{inset: '0', position: 'absolute'}}\n >\n <Loading iframeSize={iframeSize} />\n </MotionFlex>\n ))}\n </AnimatePresence>\n {url && (\n <motion.iframe\n ref={iframe}\n title=\"preview\"\n frameBorder=\"0\"\n style={{maxHeight: '100%'}}\n src={url.toString()}\n initial={['background', iframeSize]}\n variants={iframeVariants}\n animate={[\n loading ? 'background' : 'active',\n reloading ? 'reloading' : 'idle',\n iframeSize,\n ]}\n {...attributes}\n onLoad={handleIframeLoad}\n />\n )}\n </Flex>\n )\n})\n\nconst spinnerVariants = {\n initial: {opacity: 1},\n animate: {opacity: [0, 0, 1]},\n exit: {opacity: [1, 0, 0]},\n}\n\nconst iframeVariants = {\n ...sizes,\n desktop: {\n ...sizes.desktop,\n boxShadow: '0 0 0 0px var(--card-shadow-outline-color)',\n },\n mobile: {\n ...sizes.mobile,\n boxShadow: '0 0 0 1px var(--card-shadow-outline-color)',\n },\n background: {\n opacity: 0,\n scale: 1,\n },\n idle: {\n scale: 1,\n },\n reloading: {\n scale: [1, 1, 1, 0.98],\n },\n active: {\n opacity: [0, 0, 1],\n scale: 1,\n },\n}\n\nfunction Loading({iframeSize}: {iframeSize: IframeSizeKey}) {\n return (\n <Flex style={{...sizes[iframeSize]}} justify=\"center\" align=\"center\" direction=\"column\" gap={4}>\n <Spinner muted />\n <Text muted size={1}>\n Loading…\n </Text>\n </Flex>\n )\n}\n\nexport function ErrorCard({error}: {error: Error}) {\n return (\n <Card height=\"fill\">\n <Flex align=\"center\" height=\"fill\" justify=\"center\" padding={4} sizing=\"border\">\n <Container width={0}>\n <Card padding={4} radius={2} shadow={1} tone=\"caution\">\n <Flex>\n <Box>\n <Text size={1}>\n <WarningOutlineIcon />\n </Text>\n </Box>\n <Stack flex={1} marginLeft={3} space={3}>\n <Text as=\"h1\" size={1} weight=\"bold\">\n {error.name}\n </Text>\n <Text as=\"p\" muted size={1}>\n {error.message}\n </Text>\n </Stack>\n </Flex>\n </Card>\n </Container>\n </Flex>\n </Card>\n )\n}\n\n// https://github.com/pmndrs/suspend-react?tab=readme-ov-file#making-cache-keys-unique\nconst resolveUUID = Symbol()\n"],"names":["DisplayUrl","props","$","_c","t0","url","getRedirectTo","truncatedUrl","origin","location","pathname","search","t1","sizes","desktop","width","height","mobile","DEFAULT_SIZE","Toolbar","iframeSize","setIframeSize","reloading","showUrl","reloadButton","handleReload","validUrl","URL","input","useRef","push","pushToast","useToast","copy","useCopyToClipboard","for","position","pointerEvents","opacity","toString","t2","t3","whiteSpace","t4","t5","t6","t7","Symbol","t8","t9","t10","MobileDeviceIcon","t11","t12","t13","t14","RefreshIcon","t15","t16","t17","t18","t19","current","value","then","copied","closable","status","title","t20","CopyIcon","t21","t22","t23","t24","t25","window","open","undefined","t26","LaunchIcon","t27","t28","t29","copiedText","setCopiedText","useState","text","navigator","clipboard","console","warn","writeText","error","MotionFlex","motion","create","Flex","encodeStudioPerspective","studioPerspective","Array","isArray","join","Iframe","document","options","draft","published","displayed","defaultSize","reload","attributes","showDisplayUrl","key","basePath","useActiveWorkspace","activeWorkspace","urlRef","draftSnapshot","setDraftSnapshot","useEffect","currentUser","useCurrentUser","apiVersion","client","useClient","expiresAt","setExpiresAt","previewSecretRef","isResolvingUrl","startTransition","useTransition","perspectiveStack","selectedPerspectiveName","usePerspective","perspective","JSON","stringify","id","draft_0","urlProp","preview","secret","expiresAt_0","createPreviewSecret","href","getTime","url_0","definePreviewUrl","draftMode","enable","previewUrlSecret","previewSearchParam","studioBasePath","studioPreviewPerspective","url_1","timeout","setTimeout","Math","max","Date","now","clearTimeout","IframeInner","memo","userId","_key","prefersReducedMotion","usePrefersReducedMotion","suspend","resolveUUID","loading","setLoading","_reloading","setReloading","iframe","src","duration","button","Error","Frame","forwardRef","onLoad","handleIframeLoad","spinnerVariants","inset","maxHeight","iframeVariants","initial","animate","exit","boxShadow","background","scale","idle","active","Loading","ErrorCard","name","message"],"mappings":";;;;;;;;;;;AAIO,SAAAA,WAAAC,OAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA;AAAA,MAAAC;AAAAF,IAAA,CAAA,MAAAD,MAAAI,OAESD,KAAAE,cAAcL,MAAKI,GAAI,GAACH,EAAA,CAAA,IAAAD,MAAAI,KAAAH,OAAAE,MAAAA,KAAAF,EAAA,CAAA;AAApC,QAAAG,MAAYD,IADdG,eAEE,GAAUF,IAAGG,WAAYC,SAAQD,SAAvB,KAAsCH,IAAGG,MAAO,GAAGH,IAAGK,QAAS,GAAGL,IAAGM,MAAO;AACzE,MAAAC;AAAA,SAAAV,SAAAK,gBAGbK,yBAAC,MAAA,EAAW,MAAA,GAAgB,cAAA,YACzBL,UAAAA,aAAAA,CACH,GAAOL,OAAAK,cAAAL,OAAAU,MAAAA,KAAAV,EAAA,CAAA,GAFPU;AAEO;ACLJ,MAAMC,QAAmB;AAAA,EAC9BC,SAAS;AAAA,IACPC,OAAO;AAAA,IACPC,QAAQ;AAAA,EAAA;AAAA,EAEVC,QAAQ;AAAA,IACNF,OAAO;AAAA,IACPC,QAAQ;AAAA,EAAA;AAEZ,GAEaE,eAAe;AAWrB,SAAAC,QAAAlB,OAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GACL;AAAA,IAAAE;AAAAA,IAAAe;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,EAAAA,IAAyFxB,OACzFyB,WAAiBrB,eAAesB,KAEhCC,QAAcC,OAA4B,IAAI,GAC9C;AAAA,IAAAC,MAAAC;AAAAA,EAAAA,IAA0BC,SAAAA,GAC1B,GAAAC,IAAA,IAAiBC,mBAAAA;AAAoB,MAAA9B;AAAAF,IAAA,CAAA,6BAAAiC,IAAA,2BAAA,KAKxB/B,KAAA;AAAA,IAAAgC,UAAW;AAAA,IAAUC,eAAiB;AAAA,IAAMC,SAAW;AAAA,EAAA,GAAEpC,OAAAE,MAAAA,KAAAF,EAAA,CAAA;AAAA,MAAAU;AAAAV,IAAA,CAAA,MAAAG,OAAAH,SAAAwB,YAEzDd,KAAAc,WAAWrB,IAAGkC,SAAAA,IAAd,IAA8BrC,OAAAG,KAAAH,OAAAwB,UAAAxB,OAAAU,MAAAA,KAAAV,EAAA,CAAA;AAAA,MAAAsC;AAAAtC,WAAAU,MAHvC4B,KAAA,oBAAA,YAAA,EACS,OAAApC,IACFwB,KAAAA,OACE,OAAAhB,IACP,UAAA,IACU,UAAA,GAAA,CAAE,GACZV,OAAAU,IAAAV,OAAAsC,MAAAA,KAAAtC,EAAA,CAAA;AAAA,MAAAuC;AAAAvC,IAAA,CAAA,6BAAAiC,IAAA,2BAAA,KAO8BM,KAAA;AAAA,IAAAC,YAAa;AAAA,EAAA,GAASxC,OAAAuC,MAAAA,KAAAvC,EAAA,CAAA;AACzC,QAAAyC,KAAAvB,eAAe,WAAf,wBAAA;AAA2E,MAAAwB;AAAA1C,WAAAyC,MAD9EC,yBAAC,MAAA,EAAW,MAAA,GAAU,OAAAH,IACnBE,cACH,GAAOzC,OAAAyC,IAAAzC,OAAA0C,MAAAA,KAAA1C,EAAA,CAAA;AAMG,QAAA2C,MAACnB;AAAQ,MAAAoB;AAAA5C,IAAA,CAAA,MAAA6C,uBAAAZ,IAAA,2BAAA,KACTW,KAAA,CAAC,CAAC,GAAC5C,OAAA4C,MAAAA,KAAA5C,EAAA,CAAA;AAEP,QAAA8C,KAAA5B,eAAe,WAAf,YAAA;AAA6C,MAAA6B;AAAA/C,IAAA,EAAA,MAAAkB,cAAAlB,UAAAmB,iBAE1C4B,KAAAA,MAAM5B,cAAcD,eAAe,WAAf,YAAA,QAA8C,GAAClB,QAAAkB,YAAAlB,QAAAmB,eAAAnB,QAAA+C,MAAAA,KAAA/C,EAAA,EAAA;AAAA,MAAAgD;AAAAhD,IAAA,EAAA,MAAA2C,MAAA3C,UAAA8C,MAAA9C,EAAA,EAAA,MAAA+C,MAN9EC,0BAAC,QAAA,EACW,UAAAL,IACA,UAAAC,IACD,SAAA,GACH,MAAAE,IACAG,MAAAA,kBACG,SAAAF,IAAmE,GAC5E/C,QAAA2C,IAAA3C,QAAA8C,IAAA9C,QAAA+C,IAAA/C,QAAAgD,OAAAA,MAAAhD,EAAA,EAAA;AAAA,MAAAkD;AAAAlD,IAAA,EAAA,MAAAgD,OAAAhD,UAAA0C,MAlBNQ,0BAAC,MAAA,EAAW,OAAA,UAAc,KAAA,GACxB,8BAAC,SAAA,EACC,SAAA,IAEE,SAAAR,IAIO,SAAA,GACC,WAAA,gBAEVM,UAAAA,IAAAA,CAQF,GACF,GAAOhD,QAAAgD,KAAAhD,QAAA0C,IAAA1C,QAAAkD,OAAAA,MAAAlD,EAAA,EAAA;AAAA,MAAAmD;AAAAnD,IAAA,EAAA,MAAAqB,WAAArB,UAAAG,OAAAH,EAAA,EAAA,MAAAwB,YACQ2B,MAAA9B,WAAAG,gCAAwB,YAAA,EAAgBrB,IAAAA,CAAG,GAAIH,QAAAqB,SAAArB,QAAAG,KAAAH,QAAAwB,UAAAxB,QAAAmD,OAAAA,MAAAnD,EAAA,EAAA;AAAA,MAAAoD;AAAApD,YAAAmD,OAA9DC,MAAA,oBAAC,KAAA,EAAU,MAAA,GAAID,UAAAA,KAAgD,GAAMnD,QAAAmD,KAAAnD,QAAAoD,OAAAA,MAAApD,EAAA,EAAA;AAAA,MAAAqD;AAAArD,IAAA,EAAA,MAAAuB,gBAAAvB,EAAA,EAAA,MAAAsB,gBAAAtB,EAAA,EAAA,MAAAoB,aAAApB,UAAAwB,YAElE6B,MAAA/B,eACC,oBAAC,SAAA,EACC,SAAA,IAEE,6BAAC,MAAA,EAAW,MAAA,GAAU,OAAA;AAAA,IAAAkB,YAAa;AAAA,EAAA,GAChCpB,UAAAA,YAAA,oBAAA,SAAA,CACH,GAEO,SAAA,GAET,UAAA,oBAAC,QAAA,EACW,UAAA,CAACI,UACN,MAAA,SACK,UAAA,CAAC,CAAC,GACH,SAAA,GACH8B,MAAAA,aACGlC,SAAAA,WACE,cAAA,UACF,SAAA,MAAMG,aAAAA,GAAc,EAAA,CAEjC,IApBD,MAqBOvB,QAAAuB,cAAAvB,QAAAsB,cAAAtB,QAAAoB,WAAApB,QAAAwB,UAAAxB,QAAAqD,OAAAA,MAAArD,EAAA,EAAA;AAAA,MAAAuD;AAAAvD,IAAA,EAAA,MAAA6C,uBAAAZ,IAAA,2BAAA,KAIJsB,MAAA,oBAAC,MAAA,EAAW,MAAA,GAAU,OAAA;AAAA,IAAAf,YAAa;AAAA,EAAA,GAAW,sBAE9C,GAAOxC,QAAAuD,OAAAA,MAAAvD,EAAA,EAAA;AAMG,QAAAwD,OAAChC;AAAQ,MAAAiC;AAAAzD,IAAA,EAAA,MAAA6C,uBAAAZ,IAAA,2BAAA,KACTwB,MAAA,CAAC,CAAC,GAACzD,QAAAyD,OAAAA,MAAAzD,EAAA,EAAA;AAAA,MAAA0D;AAAA1D,IAAA,EAAA,MAAA6C,uBAAAZ,IAAA,2BAAA,KAEJyB,MAAA,CAAC,CAAC,GAAC1D,QAAA0D,OAAAA,MAAA1D,EAAA,EAAA;AAAA,MAAA2D;AAAA3D,IAAA,EAAA,MAAA+B,QAAA/B,UAAA6B,aAEH8B,MAAAA,MAAA;AACFjC,WAAKkC,SAAgBC,SAErB9B,KAAKL,MAAKkC,QAAQC,KAAM,EAACC,KAAMC,CAAAA,YAEhClC,UADEkC,SACQ;AAAA,MAAAC,UACE;AAAA,MAAIC,QACN;AAAA,MAASC,OACV;AAAA,IAAA,IAGC;AAAA,MAAAF,UACE;AAAA,MAAIC,QACN;AAAA,MAAOC,OACR;AAAA,IAAA,CALR,GAQIH,OACR;AAAA,EAAC,GACH/D,QAAA+B,MAAA/B,QAAA6B,WAAA7B,QAAA2D,OAAAA,MAAA3D,EAAA,EAAA;AAAA,MAAAmE;AAAAnE,IAAA,EAAA,MAAAwD,OAAAxD,UAAA2D,OAnCLQ,MAAA,oBAAC,SAAA,EACC,SAAA,IAEE,SAAAZ,KAIO,SAAA,GAET,8BAAC,QAAA,EACM,MAAA,SACK,UAAAC,KACA,UAAAC,KACJW,MAAAA,UACG,SAAAV,KACE,cAAA,YACF,SAAAC,KAmBR,EAAA,CAEL,GAAU3D,QAAAwD,KAAAxD,QAAA2D,KAAA3D,QAAAmE,OAAAA,MAAAnE,EAAA,EAAA;AAAA,MAAAqE;AAAArE,IAAA,EAAA,MAAA6C,uBAAAZ,IAAA,2BAAA,KAINoC,MAAA,oBAAC,MAAA,EAAW,MAAA,GAAU,OAAA;AAAA,IAAA7B,YAAa;AAAA,EAAA,GAAW,mCAE9C,GAAOxC,QAAAqE,OAAAA,MAAArE,EAAA,EAAA;AAMG,QAAAsE,OAAC9C;AAAQ,MAAA+C;AAAAvE,IAAA,EAAA,MAAA6C,uBAAAZ,IAAA,2BAAA,KACTsC,MAAA,CAAC,CAAC,GAACvE,QAAAuE,OAAAA,MAAAvE,EAAA,EAAA;AAAA,MAAAwE;AAAAxE,IAAA,EAAA,MAAA6C,uBAAAZ,IAAA,2BAAA,KAGHuC,MAAA,CAAC,CAAC,GAACxE,QAAAwE,OAAAA,MAAAxE,EAAA,EAAA;AAAA,MAAAyE;AAAAzE,IAAA,EAAA,MAAAG,OAAAH,UAAAwB,YAGJiD,MAAAjD,WAAA,MAAiBkD,OAAMC,KAAMxE,IAAGkC,SAAAA,CAAW,IAA3CuC,QAAwD5E,QAAAG,KAAAH,QAAAwB,UAAAxB,QAAAyE,OAAAA,MAAAzE,EAAA,EAAA;AAAA,MAAA6E;AAAA7E,IAAA,EAAA,MAAAsE,OAAAtE,UAAAyE,OAlBrEI,MAAA,oBAAC,SAAA,EACC,SAAA,IAEE,SAAAR,KAIO,SAAA,GACC,WAAA,cAEV,8BAAC,QAAA,EACW,UAAAC,KACA,UAAAC,KACJO,MAAAA,YACD,MAAA,SACK,UAAAN,KACL,MAAA,QACM,cAAA,yBACF,SAAAC,IAAAA,CAAwD,EAAA,CAErE,GAAUzE,QAAAsE,KAAAtE,QAAAyE,KAAAzE,QAAA6E,OAAAA,MAAA7E,EAAA,EAAA;AAAA,MAAA+E;AAAA/E,IAAA,EAAA,MAAAqD,OAAArD,UAAAmE,OAAAnE,EAAA,EAAA,MAAA6E,OAjFZE,MAAA,qBAAC,QAAW,OAAA,UAAc,KAAA,GACvB1B,UAAAA;AAAAA,IAAAA;AAAAA,IAsBDc;AAAAA,IAsCAU;AAAAA,EAAAA,GAqBF,GAAO7E,QAAAqD,KAAArD,QAAAmE,KAAAnE,QAAA6E,KAAA7E,QAAA+E,OAAAA,MAAA/E,EAAA,EAAA;AAAA,MAAAgF;AAAAhF,IAAA,EAAA,MAAAkD,OAAAlD,UAAAoD,OAAApD,EAAA,EAAA,MAAA+E,OA1GXC,0BAAC,MAAA,EAAc,YAAG,cAAA,IAChB,+BAAC,MAAA,EAAW,OAAA,UAAc,KAAA,GACxB9B,UAAAA;AAAAA,IAAAA;AAAAA,IAqBAE;AAAAA,IACA2B;AAAAA,EAAAA,GAmFF,EAAA,CACF,GAAO/E,QAAAkD,KAAAlD,QAAAoD,KAAApD,QAAA+E,KAAA/E,QAAAgF,OAAAA,MAAAhF,EAAA,EAAA;AAAA,MAAAiF;AAAA,SAAAjF,EAAA,EAAA,MAAAsC,MAAAtC,UAAAgF,OApHTC,uCACE3C,UAAAA;AAAAA,IAAAA;AAAAA,IAOA0C;AAAAA,EAAAA,EAAAA,CA4GO,GACNhF,QAAAsC,IAAAtC,QAAAgF,KAAAhF,QAAAiF,OAAAA,MAAAjF,EAAA,EAAA,GArHHiF;AAqHG;AAQP,SAAAjD,qBAAA;AAAA,QAAAhC,IAAAC,EAAA,CAAA,GACE,CAAAiF,YAAAC,aAAA,IAAoCC,SAAsB,IAAI;AAAC,MAAAlF;AAAAF,IAAA,CAAA,MAAA6C,uBAAAZ,IAAA,2BAAA,KAE9B/B,YAAAmF,SAAA;AAC/B,QAAI,CAACC,WAASC;AACZC,aAAAA,QAAOC,KAAM,yBAAyB,GAC/B;AAIT,QAAA;AACE,aAAA,MAAMH,UAASC,UAAUG,UAAWL,IAAI,GACxCF,cAAcE,IAAI,GACX;AAAA,IAAI,SAAA3E,KAAA;AAEX8E,aAAAA,QAAOC,KAAM,eADNE,GAC0B,GACjCR,cAAc,IAAI,GACX;AAAA,IAAK;AAAA,EACb,GACFnF,OAAAE,MAAAA,KAAAF,EAAA,CAAA;AAhBD,QAAA+B,OAAqB7B;AAgBf,MAAAQ;AAAA,SAAAV,SAAAkF,cAECxE,KAAA,CAACwE,YAAYnD,IAAI,GAAC/B,OAAAkF,YAAAlF,OAAAU,MAAAA,KAAAV,EAAA,CAAA,GAAlBU;AAAkB;ACxG3B,MAAMkF,aAAaC,OAAOC,OAAOC,IAAI;AAWrC,SAASC,wBAAwBC,mBAA8C;AAC7E,SAAOC,MAAMC,QAAQF,iBAAiB,IAAIA,kBAAkBG,KAAK,GAAG,IAAIH;AAC1E;AAEO,SAAAI,OAAAtG,OAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GACL;AAAA,IAAAqG;AAAAA,IAAAC;AAAAA,EAAAA,IAA4BxG,OAC5ByG,QAAcF,SAAQE,SAAUF,SAAQG,aAAcH,SAAQI,WAE9D;AAAA,IAAAC,aAAAzG;AAAAA,IAAA0G;AAAAA,IAAAC;AAAAA,IAAAC,gBAAApG;AAAAA,IAAAqG;AAAAA,EAAAA,IAAqFR,SAA9EI,cAAAzG,OAAA0E,SAAA5D,eAAAd,IAAgD4G,iBAAApG,OAAAkE,SAAA,KAAAlE,IAGvDsG,WADkBC,sBACQC,iBAA2BF,YAApC,KACjBG,SAAexF,OAAO4E,QAAOpG,GAAI;AAAC,MAAAmC;AAAAtC,IAAA,CAAA,MAAAwG,SAAAxG,SAAA+G,OACiBzE,KAAAA,OAAO;AAAA,IAAAyE;AAAAA,IAAAP;AAAAA,EAAAA,IAAaxG,OAAAwG,OAAAxG,OAAA+G,KAAA/G,OAAAsC,MAAAA,KAAAtC,EAAA,CAAA;AAAvE,QAAA,CAAAoH,eAAAC,gBAAA,IAA0CjC,SAAS9C,EAAoB;AAAC,MAAAC,IAAAE;AAAAzC,IAAA,CAAA,MAAAuG,QAAApG,OAC9DoC,KAAAA,MAAA;AACR4E,WAAMvD,UAAW2C,QAAOpG;AAAAA,EAAV,GACbsC,KAAA,CAAC8D,QAAOpG,GAAI,GAACH,EAAA,CAAA,IAAAuG,QAAApG,KAAAH,OAAAuC,IAAAvC,OAAAyC,OAAAF,KAAAvC,EAAA,CAAA,GAAAyC,KAAAzC,EAAA,CAAA,IAFhBsH,UAAU/E,IAEPE,EAAa;AAChB,QAAA8E,cAAoBC,eAAAA;AAAgB,MAAA9E;AAAA1C,IAAA,CAAA,6BAAAiC,IAAA,2BAAA,KACXS,KAAA;AAAA,IAAA+E,YAAa;AAAA,EAAA,GAAazH,OAAA0C,MAAAA,KAAA1C,EAAA,CAAA;AAAnD,QAAA0H,SAAeC,UAAUjF,EAA0B,GACnD,CAAAkF,WAAAC,YAAA,IAAkCzC,SAAAA,GAClC0C,mBAAyBnG,OAA2BiD,MAAS,GAC7D,CAAAmD,gBAAAC,eAAA,IAA0CC,iBAC1C;AAAA,IAAAC;AAAAA,IAAAC;AAAAA,EAAAA,IAAoDC,eAAAA;AAAgB,MAAAzF;AAAA3C,IAAA,CAAA,MAAAkI,oBAAAlI,SAAAmI,2BAE3DxF,KAAA;AAAA,IAAAuF;AAAAA,IAAAC;AAAAA,EAAAA,GAGNnI,OAAAkI,kBAAAlI,OAAAmI,yBAAAnI,OAAA2C,MAAAA,KAAA3C,EAAA,CAAA;AAJH,QAAAqI,cACS1F;AAKR,MAAAC,IAAAE;AAAA9C,IAAA,EAAA,MAAAwG,SAAAxG,UAAAoH,iBAAApH,EAAA,EAAA,MAAA+G,OAESnE,KAAAA,MAAA;AACJ0F,SAAIC,UAAW;AAAA,MAAAxB;AAAAA,MAAAP;AAAAA,IAAAA,CAAY,MAAM8B,KAAIC,UAAWnB,aAAa,KAC/DY,gBAAgB,MAAMX,iBAAiB;AAAA,MAAAN;AAAAA,MAAAP;AAAAA,IAAAA,CAAY,CAAC;AAAA,EACrD,GACA1D,KAAA,CAAC0D,OAAOY,eAAeL,KAAKiB,eAAe,GAAChI,QAAAwG,OAAAxG,QAAAoH,eAAApH,QAAA+G,KAAA/G,QAAA4C,IAAA5C,QAAA8C,OAAAF,KAAA5C,EAAA,EAAA,GAAA8C,KAAA9C,EAAA,EAAA,IAJ/CsH,UAAU1E,IAIPE,EAA4C;AAAC,MAAAC;AAAA/C,IAAA,EAAA,MAAAgH,YAAAhH,UAAA0H,UAAA1H,EAAA,EAAA,MAAAuH,aAAAiB,MAAAxI,UAAAqI,eAG9CtF,YAAA0F,YAAA;AACE,QAAI,OAAOlI,WAAa;AAAW;AAGnC,UAAAmI,UAAgBvB,OAAMvD;AACtB,QAAI,OAAO8E,WAAY;AAAQ,aACtB,IAAIjH,IAAIiH,SAASnI,SAAQD,MAAO;AAEzC,QAAI,OAAOoI,WAAY,YAAU;AAC/B,YAAAvI,MAAY,MAAMuI,QAAQlC,SAAO6B,WAAW;AAAC,aACtC,OAAOlI,OAAQ,WAAf,IAA8BsB,IAAItB,KAAKI,SAAQD,MAAa,IAA5DH;AAAAA,IAA6D;AAEtE,QAAI,OAAOuI,WAAY,UAAQ;AAC7B,YAAAC,UACE,OAAOD,QAAOC,WAAa,aAA3B,MACUD,QAAOC,QAASnC,SAAO6B,WAAW,IACxCK,QAAOC;AACb,UAAI,OAAOA,WAAY;AAAQ,eACtBA;AAET,UAAI,CAACb,iBAAgBlE,SAAQ;AAC3B,cAAA;AAAA,UAAAgF;AAAAA,UAAAhB,WAAAiB;AAAAA,QAAAA,IAA4B,MAAMC,oBAChCpB,QACA,6BACAnH,SAAQwI,MACRxB,aAAWiB,EACb;AACAV,yBAAgBlE,UAAWgF,QAC3BZ,gBAAgB,MAAMH,aAAaD,YAASoB,QAAAA,CAAU,CAAC;AAAA,MAAC;AAU1D,YAAAC,QAAY,MAPcC,iBAAiB;AAAA,QAAA5I,QACjCoI,QAAOpI,WAAY,gBAAgBC,SAAQD,SAAUoI,QAAOpI;AAAAA,QAAOqI;AAAAA,QAAAQ,WAEhE;AAAA,UAAAC,QACDV,QAAOS;AAAAA,QAAAA;AAAAA,MACjB,CACD,EACmC;AAAA,QAAAzB;AAAAA,QAAA2B,kBAEhBvB,iBAAgBlE;AAAAA,QAAQ0F,oBACtB;AAAA,QAAIC,gBACRvC;AAAAA,QAAQwC,0BACExD,wBAAwBqC,YAAWH,gBAAiB;AAAA,MAAA,CAC/E;AAAC,aACK,IAAIzG,IAAItB,OAAKI,SAAQD,MAAO;AAAA,IAAC;AAAA,EACrC,GAEFN,QAAAgH,UAAAhH,QAAA0H,QAAA1H,EAAA,EAAA,IAAAuH,aAAAiB,IAAAxI,QAAAqI,aAAArI,QAAA+C,MAAAA,KAAA/C,EAAA,EAAA;AAjDH,QAAAyJ,QAAY1G;AAmDX,MAAAC,KAAAE;AAAAlD,YAAA4H,aACS5E,MAAAA,MAAA;AACR,QAAI4E,WAAS;AACX,YAAA8B,UAAgBC,WACd,MAAA;AACE3B,wBAAgB,MAAMH,aAAajD,MAAS,CAAC,GAC7CkD,iBAAgBlE,UAAWgB;AAAAA,MAAH,GAE1BgF,KAAIC,IAAK,GAAGjC,YAAYkC,KAAIC,IAAAA,CAAM,CACpC;AAAC,aACM,MAAMC,aAAaN,OAAO;AAAA,IAAC;AAAA,EACnC,GAEAxG,MAAA,CAAC0E,SAAS,GAAC5H,QAAA4H,WAAA5H,QAAAgD,KAAAhD,QAAAkD,QAAAF,MAAAhD,EAAA,EAAA,GAAAkD,MAAAlD,EAAA,EAAA,IAZdsH,UAAUtE,KAYPE,GAAW;AAAC,MAAAC;AAAAnD,IAAA,EAAA,6BAAAiC,IAAA,2BAAA,KAGOkB,0BAAC,WAAmB,YAAA,UAAA,CAAS,GAAGnD,QAAAmD,OAAAA,MAAAnD,EAAA,EAAA;AAE3C,QAAAoD,SAAGgE,cAAaL,GAAI,IAAIoB,2BAAA,OAAkC,IAUvD9E,MAAAkE,aAAWiB;AAAI,MAAAjF;AAAA,SAAAvD,UAAA6G,cAAA7G,EAAA,EAAA,MAAA2G,eAAA3G,EAAA,EAAA,MAAAoH,cAAAZ,SAAAxG,EAAA,EAAA,MAAAoH,cAAAL,OAAA/G,EAAA,EAAA,MAAA+H,kBAAA/H,EAAA,EAAA,MAAAqI,eAAArI,UAAA4G,UAAA5G,EAAA,EAAA,MAAA8G,kBAAA9G,EAAA,EAAA,MAAAoD,OAAApD,UAAAqD,OAAArD,EAAA,EAAA,MAAAyJ,SAZ3BlG,0BAAC,UAAA,EAAmB,UAAAJ,KAClB,UAAA,oBAAC,aAAA,EAEO,MAAAiE,cAAaL,KACJ,eAAAK,cAAaZ,OACvBrG,KAAAA,OACW4H,gBACJlB,YACCwB,aACA1B,aACLC,QACQE,gBACR,QAAAzD,IAAAA,GAVHD,GAUkB,EAAA,CAE3B,GAAWpD,QAAA6G,YAAA7G,QAAA2G,aAAA3G,EAAA,EAAA,IAAAoH,cAAAZ,OAAAxG,EAAA,EAAA,IAAAoH,cAAAL,KAAA/G,QAAA+H,gBAAA/H,QAAAqI,aAAArI,QAAA4G,QAAA5G,QAAA8G,gBAAA9G,QAAAoD,KAAApD,QAAAqD,KAAArD,QAAAyJ,OAAAzJ,QAAAuD,OAAAA,MAAAvD,EAAA,EAAA,GAdXuD;AAcW;AAaf,MAAM0G,cAAcC,KAAK,SAAAnK,OAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GACvB;AAAA,IAAA8H;AAAAA,IAAApB,aAAAzG;AAAAA,IAAA0G;AAAAA,IAAAC,YAAAnG;AAAAA,IAAAoG,gBAAAxE;AAAAA,IAAA8E;AAAAA,IAAA+C;AAAAA,IAAAvC;AAAAA,IAAAS,aAAA9F;AAAAA,IAAA6H;AAAAA,EAAAA,IAWIrK,OATF4G,cAAAzG,OAAA0E,SAAA5D,eAAAd;AAA0B,MAAAuC;AAAAzC,WAAAU,MAE1B+B,KAAA/B,OAAAkE,SAAA,CAAA,IAAAlE,IAAeV,OAAAU,IAAAV,OAAAyC,MAAAA,KAAAzC,EAAA,CAAA;AAAf,QAAA6G,aAAApE,IACAqE,iBAAAxE,OAAAsC,SAAA,KAAAtC,IAIa;AAAA,IAAA6F;AAAAA,IAAAD;AAAAA,EAAAA,IAAA3F,IAGf,CAAArB,YAAAC,aAAA,IAAoCiE,SAASzE,QAAQgG,WAAW,IAAnBA,cAAA3F,YAAiD,GAE9FqJ,uBAA6BC,wBAAAA;AAAyB,MAAA5H;AAAA1C,IAAA,CAAA,MAAAoH,iBAAApH,SAAAD,SAGpD2C,KAAAA,MAAM3C,MAAKI,IAAKiH,aAAa,GAACpH,OAAAoH,eAAApH,OAAAD,OAAAC,OAAA0C,MAAAA,KAAA1C,EAAA,CAAA;AAAA,MAAA2C;AAAA3C,IAAA,CAAA,MAAAoK,QAAApK,EAAA,CAAA,MAAAoH,iBAAApH,EAAA,CAAA,MAAA4H,aAAA5H,SAAAkI,oBAAAlI,EAAA,CAAA,MAAAmI,2BAAAnI,EAAA,EAAA,MAAA0C,MAAA1C,EAAA,EAAA,MAAAmK,UADpBxH,KAAA4H,QACV7H,IACA,CAEE,6BACA0E,eACAe,yBACAD,kBACAiC,QACAvC,WACAwC,MACAI,WAAW,CAEf,GAACxK,OAAAoK,MAAApK,OAAAoH,eAAApH,OAAA4H,WAAA5H,OAAAkI,kBAAAlI,OAAAmI,yBAAAnI,QAAA0C,IAAA1C,QAAAmK,QAAAnK,QAAA2C,MAAAA,KAAA3C,EAAA,EAAA;AAbD,QAAAG,MAAYwC,IAeZ,CAAA8H,SAAAC,UAAA,IAA8BtF,SAAS,EAAI,GAC3C,CAAAuF,YAAAC,YAAA,IAAmCxF,SAAS,EAAK,GACjDhE,YAAkBuJ,cAAA5C,gBAElB8C,SAAelJ,OAA0B,IAAI;AAAC,MAAAiB;AAAA5C,IAAA,EAAA,MAAA6C,uBAAAZ,IAAA,2BAAA,KAEbW,KAAAA,MAAA;AAC/B,QAAI,CAACiI,QAAMjH;AAAS;AAKpB,UAAA;AAAA,MAAAkH;AAAAA,IAAAA,IAAcD,OAAMjH;AACpBiH,WAAMjH,QAAQkH,MAAOA,KAErBF,aAAa,EAAI;AAAA,EAAC,GACnB5K,QAAA4C,MAAAA,KAAA5C,EAAA,EAAA;AAVD,QAAAuB,eAAqBqB;AAUf,MAAAE;AAAA9C,YAAAqK,wBAGsBvH,KAAAuH,uBAAA;AAAA,IAAAU,UAAkC;AAAA,EAAA,IAAlCnG,QAAgD5E,QAAAqK,sBAAArK,QAAA8C,MAAAA,KAAA9C,EAAA,EAAA;AAAA,MAAA+C;AAAA/C,IAAA,EAAA,6BAAAiC,IAAA,2BAAA,KACxCc,KAAA;AAAA,IAAAjC,QAAS;AAAA,EAAA,GAAOd,QAAA+C,MAAAA,KAAA/C,EAAA,EAAA;AAO9B,QAAAgD,MAAA,CAAC,CAAC4D,QAAMoE;AAAQ,MAAA9H;AAAAlD,IAAA,EAAA,MAAAkB,cAAAlB,EAAA,EAAA,MAAAoB,aAAApB,EAAA,EAAA,MAAA8G,kBAAA9G,EAAA,EAAA,MAAAgD,OAAAhD,UAAAG,OANhC+C,0BAAC,SAAA,EACM/C,KACOe,YACDE,WACID,eACN2F,SAAAA,gBACK,cAAA9D,KACAzB,aAAAA,CAAY,GAC1BvB,QAAAkB,YAAAlB,QAAAoB,WAAApB,QAAA8G,gBAAA9G,QAAAgD,KAAAhD,QAAAG,KAAAH,QAAAkD,OAAAA,MAAAlD,EAAA,EAAA;AAAA,MAAAmD;AAAAnD,IAAA,EAAA,MAAA6G,cAAA7G,EAAA,EAAA,MAAAkB,cAAAlB,EAAA,EAAA,MAAAyK,WAAAzK,EAAA,EAAA,MAAAoB,aAAApB,UAAAG,OACDgD,MAAAhD,eAAe8K,QACd,oBAAC,WAAA,EAAiB9K,OAAAA,IAAAA,CAAG,IAErB,oBAAC,MAAA,EAAU,MAAA,eAAqB,OAAA;AAAA,IAAAW,QAAS;AAAA,EAAA,GACvC,UAAA,oBAAC,OAAA,EACM+J,KAAAA,QACIJ,SACErJ,WACCF,YACE0J,cACFF,YACPvK,KACO0G,YAAU,EAAA,CAE1B,GACD7G,QAAA6G,YAAA7G,QAAAkB,YAAAlB,QAAAyK,SAAAzK,QAAAoB,WAAApB,QAAAG,KAAAH,QAAAmD,OAAAA,MAAAnD,EAAA,EAAA;AAAA,MAAAoD;AAAApD,IAAA,EAAA,MAAAkD,OAAAlD,UAAAmD,OAzBHC,MAAA,qBAAC,MAAA,EAAe,WAAA,UAAgB,OAAAL,IAC9BG,UAAAA;AAAAA,IAAAA;AAAAA,IASCC;AAAAA,EAAAA,EAAAA,CAgBH,GAAOnD,QAAAkD,KAAAlD,QAAAmD,KAAAnD,QAAAoD,OAAAA,MAAApD,EAAA,EAAA;AAAA,MAAAqD;AAAA,SAAArD,EAAA,EAAA,MAAAoD,OAAApD,UAAA8C,MA3BTO,MAAA,oBAAC,cAAA,EAAyB,YAAAP,IACxBM,UAAAA,IAAAA,CA2BF,GAAepD,QAAAoD,KAAApD,QAAA8C,IAAA9C,QAAAqD,OAAAA,MAAArD,EAAA,EAAA,GA5BfqD;AA4Be,CAElB,GAUK6H,QAAQC,WAAW,SAAApL,OAAA8K,QAAA;AAAA,QAAA7K,IAAAC,EAAA,EAAA,GAIvB;AAAA,IAAAwK;AAAAA,IAAAC;AAAAA,IAAAxJ;AAAAA,IAAA2F;AAAAA,IAAAzF;AAAAA,IAAAjB;AAAAA,IAAAyK;AAAAA,EAAAA,IAAoF7K;AAAK,MAAAG;AAAAF,IAAA,CAAA,MAAA6G,cAAA7G,SAAA0K,cAAA1K,EAAA,CAAA,MAAA4K,gBAEzF1K,gBAAA;AACEwK,eAAW,EAAK,GAChBE,aAAa,EAAK,GAEd/D,WAAUuE,UAAW,OAAOvE,WAAUuE,UAAY,cACpDvE,WAAUuE,OAAAA;AAAAA,EACX,GACFpL,OAAA6G,YAAA7G,OAAA0K,YAAA1K,OAAA4K,cAAA5K,OAAAE,MAAAA,KAAAF,EAAA,CAAA;AAPD,QAAAqL,mBAAAnL;AAOC,MAAAQ;AAAAV,IAAA,CAAA,6BAAAiC,IAAA,2BAAA,KAG8CvB,KAAA;AAAA,IAAAI,QAAS;AAAA,IAAMoB,UAAY;AAAA,EAAA,GAAWlC,OAAAU,MAAAA,KAAAV,EAAA,CAAA;AAAA,MAAAsC;AAAAtC,IAAA,CAAA,MAAAkB,cAAAlB,SAAAyK,WAAAzK,EAAA,CAAA,MAAAG,OAE9EmC,KAAA,CAACnC,OACCsK,WACC,oBAAC,YAAA,EACS,SAAA,WACA,SAAA,WACH,MAAA,QACKa,UAAAA,iBACF,SAAA,UACF,OAAA,UACC,OAAA;AAAA,IAAAC,OAAQ;AAAA,IAAGrJ,UAAY;AAAA,EAAA,GAE9B,UAAA,oBAAC,SAAA,EAAoBhB,WAAAA,CAAU,EAAA,CACjC,GACAlB,OAAAkB,YAAAlB,OAAAyK,SAAAzK,OAAAG,KAAAH,OAAAsC,MAAAA,KAAAtC,EAAA,CAAA;AAAA,MAAAuC;AAAAvC,WAAAsC,MAdNC,KAAA,oBAAC,mBACED,UAAAA,GAAAA,CAcH,GAAkBtC,OAAAsC,IAAAtC,QAAAuC,MAAAA,KAAAvC,EAAA,EAAA;AAAA,MAAAyC;AAAAzC,IAAA,EAAA,MAAA6G,cAAA7G,EAAA,EAAA,MAAAqL,oBAAArL,EAAA,EAAA,MAAA6K,UAAA7K,UAAAkB,cAAAlB,EAAA,EAAA,MAAAyK,WAAAzK,EAAA,EAAA,MAAAoB,aAAApB,EAAA,EAAA,MAAAG,OACjBsC,KAAAtC,OACC,qCACO0K,aACC,OAAA,WACM,aAAA,KACL,OAAA;AAAA,IAAAW,WAAY;AAAA,EAAA,GACd,KAAArL,IAAGkC,SAAAA,GACC,SAAA,CAAC,cAAcnB,UAAU,GACxBuK,UAAAA,gBACD,SAAA,CACPhB,UAAA,eAAA,UACArJ,YAAA,cAAA,QACAF,UAAU,GACX,GACG2F,YACIwE,QAAAA,iBAAAA,CAAgB,GAE3BrL,QAAA6G,YAAA7G,QAAAqL,kBAAArL,QAAA6K,QAAA7K,QAAAkB,YAAAlB,QAAAyK,SAAAzK,QAAAoB,WAAApB,QAAAG,KAAAH,QAAAyC,MAAAA,KAAAzC,EAAA,EAAA;AAAA,MAAA0C;AAAA,SAAA1C,EAAA,EAAA,MAAAuC,MAAAvC,UAAAyC,MAlCHC,KAAA,qBAAC,QAAW,OAAA,UAAiB,SAAA,UAAgB,OAAAhC,IAC3C6B,UAAAA;AAAAA,IAAAA;AAAAA,IAgBCE;AAAAA,EAAAA,EAAAA,CAkBH,GAAOzC,QAAAuC,IAAAvC,QAAAyC,IAAAzC,QAAA0C,MAAAA,KAAA1C,EAAA,EAAA,GAnCP0C;AAmCO,CAEV,GAEK4I,kBAAkB;AAAA,EACtBI,SAAS;AAAA,IAACtJ,SAAS;AAAA,EAAA;AAAA,EACnBuJ,SAAS;AAAA,IAACvJ,SAAS,CAAC,GAAG,GAAG,CAAC;AAAA,EAAA;AAAA,EAC3BwJ,MAAM;AAAA,IAACxJ,SAAS,CAAC,GAAG,GAAG,CAAC;AAAA,EAAA;AAC1B,GAEMqJ,iBAAiB;AAAA,EACrB,GAAG9K;AAAAA,EACHC,SAAS;AAAA,IACP,GAAGD,MAAMC;AAAAA,IACTiL,WAAW;AAAA,EAAA;AAAA,EAEb9K,QAAQ;AAAA,IACN,GAAGJ,MAAMI;AAAAA,IACT8K,WAAW;AAAA,EAAA;AAAA,EAEbC,YAAY;AAAA,IACV1J,SAAS;AAAA,IACT2J,OAAO;AAAA,EAAA;AAAA,EAETC,MAAM;AAAA,IACJD,OAAO;AAAA,EAAA;AAAA,EAET3K,WAAW;AAAA,IACT2K,OAAO,CAAC,GAAG,GAAG,GAAG,IAAI;AAAA,EAAA;AAAA,EAEvBE,QAAQ;AAAA,IACN7J,SAAS,CAAC,GAAG,GAAG,CAAC;AAAA,IACjB2J,OAAO;AAAA,EAAA;AAEX;AAEA,SAAAG,QAAAhM,IAAA;AAAA,QAAAF,IAAAC,EAAA,CAAA,GAAiB;AAAA,IAAAiB;AAAAA,EAAAA,IAAAhB,IAEIQ,KAAAC,MAAMO,UAAU;AAAC,MAAAoB;AAAAtC,WAAAU,MAArB4B,KAAA;AAAA,IAAA,GAAI5B;AAAAA,EAAAA,GAAkBV,OAAAU,IAAAV,OAAAsC,MAAAA,KAAAtC,EAAA,CAAA;AAAA,MAAAuC,IAAAE;AAAAzC,IAAA,CAAA,MAAA6C,uBAAAZ,IAAA,2BAAA,KACjCM,yBAAC,SAAA,EAAQ,OAAA,GAAA,CAAK,GACdE,KAAA,oBAAC,QAAK,OAAA,IAAY,MAAA,GAAG,2BAErB,GAAOzC,OAAAuC,IAAAvC,OAAAyC,OAAAF,KAAAvC,EAAA,CAAA,GAAAyC,KAAAzC,EAAA,CAAA;AAAA,MAAA0C;AAAA,SAAA1C,SAAAsC,MAJTI,0BAAC,MAAA,EAAY,OAAAJ,IAAgC,SAAA,UAAe,OAAA,UAAmB,WAAA,UAAc,KAAA,GAC3FC,UAAAA;AAAAA,IAAAA;AAAAA,IACAE;AAAAA,EAAAA,EAAAA,CAGF,GAAOzC,OAAAsC,IAAAtC,OAAA0C,MAAAA,KAAA1C,EAAA,CAAA,GALP0C;AAKO;AAIJ,SAAAyJ,UAAAjM,IAAA;AAAA,QAAAF,IAAAC,EAAA,CAAA,GAAmB;AAAA,IAAA0F;AAAAA,EAAAA,IAAAzF;AAAuB,MAAAQ;AAAAV,IAAA,CAAA,MAAA6C,uBAAAZ,IAAA,2BAAA,KAOnCvB,yBAAC,KAAA,EACC,UAAA,oBAAC,MAAA,EAAW,MAAA,GACV,UAAA,oBAAC,oBAAA,CAAA,CAAkB,EAAA,CACrB,EAAA,CACF,GAAMV,OAAAU,MAAAA,KAAAV,EAAA,CAAA;AAAA,MAAAsC;AAAAtC,IAAA,CAAA,MAAA2F,MAAAyG,QAEJ9J,KAAA,oBAAC,MAAA,EAAQ,IAAA,MAAW,MAAA,GAAU,QAAA,QAC3BqD,UAAAA,MAAKyG,KAAAA,CACR,GAAOpM,EAAA,CAAA,IAAA2F,MAAAyG,MAAApM,OAAAsC,MAAAA,KAAAtC,EAAA,CAAA;AAAA,MAAAuC;AAAAvC,IAAA,CAAA,MAAA2F,MAAA0G,WACP9J,KAAA,oBAAC,MAAA,EAAQ,IAAA,KAAI,OAAA,IAAY,MAAA,GACtBoD,UAAAA,MAAK0G,QAAAA,CACR,GAAOrM,EAAA,CAAA,IAAA2F,MAAA0G,SAAArM,OAAAuC,MAAAA,KAAAvC,EAAA,CAAA;AAAA,MAAAyC;AAAA,SAAAzC,EAAA,CAAA,MAAAsC,MAAAtC,SAAAuC,MAhBnBE,KAAA,oBAAC,MAAA,EAAY,QAAA,QACX,UAAA,oBAAC,QAAW,OAAA,UAAgB,QAAA,QAAe,SAAA,UAAkB,YAAU,QAAA,UACrE,8BAAC,WAAA,EAAiB,OAAA,GAChB,UAAA,oBAAC,MAAA,EAAc,SAAA,GAAW,QAAA,GAAW,WAAQ,MAAA,WAC3C,+BAAC,MAAA,EACC/B,UAAAA;AAAAA,IAAAA;AAAAA,yBAKC,OAAA,EAAY,MAAA,GAAe,YAAA,GAAU,OAAA,GACpC4B,UAAAA;AAAAA,MAAAA;AAAAA,MAGAC;AAAAA,IAAAA,EAAAA,CAGF;AAAA,EAAA,GACF,EAAA,CACF,GACF,EAAA,CACF,EAAA,CACF,GAAOvC,OAAAsC,IAAAtC,OAAAuC,IAAAvC,OAAAyC,MAAAA,KAAAzC,EAAA,CAAA,GAtBPyC;AAsBO;AAKX,MAAM+H,cAAc3H,uBAAAA;"}