@kizenapps/engine 1.9.1-83a6c38 → 1.9.2-ce64cf0

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.
Files changed (32) hide show
  1. package/README.md +136 -120
  2. package/dist/{chunk-ZA5NLC5A.js → chunk-2AJY4I2T.js} +6 -8
  3. package/dist/chunk-2AJY4I2T.js.map +1 -0
  4. package/dist/{chunk-4DK3CMXY.js → chunk-2V75NG3U.js} +3 -3
  5. package/dist/{chunk-4DK3CMXY.js.map → chunk-2V75NG3U.js.map} +1 -1
  6. package/dist/{chunk-5NF4DYQJ.js → chunk-5BBUKTOE.js} +3 -3
  7. package/dist/{chunk-5NF4DYQJ.js.map → chunk-5BBUKTOE.js.map} +1 -1
  8. package/dist/{chunk-JJ73EPHG.js → chunk-G43HJUPD.js} +4 -4
  9. package/dist/{chunk-JJ73EPHG.js.map → chunk-G43HJUPD.js.map} +1 -1
  10. package/dist/{chunk-JVRZSUQ2.js → chunk-REAN7GYY.js} +3 -3
  11. package/dist/{chunk-JVRZSUQ2.js.map → chunk-REAN7GYY.js.map} +1 -1
  12. package/dist/{chunk-RVMKI3GK.js → chunk-S4WCVWFO.js} +3 -3
  13. package/dist/{chunk-RVMKI3GK.js.map → chunk-S4WCVWFO.js.map} +1 -1
  14. package/dist/{chunk-Z4KYP5P5.js → chunk-TLZXIYKG.js} +3 -3
  15. package/dist/{chunk-Z4KYP5P5.js.map → chunk-TLZXIYKG.js.map} +1 -1
  16. package/dist/{chunk-TP7GSF2G.js → chunk-TPV5Q6GW.js} +6 -6
  17. package/dist/{chunk-TP7GSF2G.js.map → chunk-TPV5Q6GW.js.map} +1 -1
  18. package/dist/{chunk-2KN64BCJ.js → chunk-XEZJ3I3F.js} +3 -3
  19. package/dist/{chunk-2KN64BCJ.js.map → chunk-XEZJ3I3F.js.map} +1 -1
  20. package/dist/communication.js +2 -2
  21. package/dist/contexts/base.js +4 -4
  22. package/dist/contexts/floatingFrame.js +5 -5
  23. package/dist/contexts/recordDetail.js +5 -5
  24. package/dist/index.js +4 -4
  25. package/dist/react.js +5 -5
  26. package/dist/util.js +6 -6
  27. package/dist/workers/calendarSource.worker.js +6 -6
  28. package/dist/workers/floatingFrame.worker.js +7 -7
  29. package/dist/workers/generic.worker.js +6 -6
  30. package/dist/workers/recordDetail.worker.js +7 -7
  31. package/package.json +21 -3
  32. package/dist/chunk-ZA5NLC5A.js.map +0 -1
package/README.md CHANGED
@@ -1,11 +1,21 @@
1
1
  ## Kizen App Engine
2
2
 
3
- The core app engine for the Kizen developer platform for running plugin apps in web workers.
3
+ The runtime that powers plugin apps on the Kizen developer platform. It executes plugin JavaScript
4
+ inside sandboxed Web Workers and brokers everything that crosses the worker boundary — network
5
+ requests, rendered UI, modals, toasts, navigation, and file uploads.
6
+
7
+ **If you are writing a plugin,** you want the [plugin developer
8
+ documentation](https://kizen.github.io/app-engine/) (source under [`docs/`](docs/README.md)) and the
9
+ `@kizenapps/cli` app builder. The engine is what your plugin runs _on_ — you do not install it
10
+ yourself.
11
+
12
+ **If you are embedding the engine in a host application,** that is what the rest of this README
13
+ covers.
4
14
 
5
15
  ### Installation
6
16
 
7
17
  ```
8
- yarn add @kizenapps/engine
18
+ pnpm add @kizenapps/engine
9
19
  ```
10
20
 
11
21
  #### Usage With Vite
@@ -40,160 +50,137 @@ In order for translated strings to appear, you'll need to pass the app's transla
40
50
 
41
51
  ### Engine Usage
42
52
 
43
- Your app needs to be wrapped in the `AppEngineProvider`. This provider gives the internal components access to the worker runner, network requests, and other consumer-specific features, and adapts your application's common UI components like modals and toasts to a common API that plugins can use.
53
+ The engine has two halves:
54
+
55
+ - **Worker side** — the `this.*` API a plugin script calls. Fully documented in [`docs/`](docs/README.md); nothing to configure here.
56
+ - **Host side** — a React provider plus hooks, which is what you integrate.
57
+
58
+ The host side is deliberately unopinionated about your UI. You supply primitives — how to navigate,
59
+ how to show a toast, how to open a modal, how to make an authenticated request — and the engine
60
+ adapts them to the stable API that plugins are written against. That indirection is the point: a
61
+ plugin written once runs in any host that satisfies this contract.
44
62
 
45
63
  #### Context Provider
46
64
 
65
+ Wrap your application in `AppEngineProvider`.
66
+
67
+ **Required props**
68
+
69
+ | Prop | Type | Purpose |
70
+ | --------------------------- | --------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
71
+ | `user` | `{ id, crm_client_id }` | The signed-in user. |
72
+ | `teamMember` | `{ id, full_name, first_name, last_name, email, phone, created }` | Team-member profile, exposed to plugins as `this.currentUser.profile`. |
73
+ | `business` | `{ id }` | The active business/tenant. |
74
+ | `appPath` | `string` | Your API base path. |
75
+ | `onNavigate` | `(path: string, options?: { replace?: boolean }) => void` | Hand off to your router. |
76
+ | `performRequest` | `(method, url, payload?, options?) => Promise<{ data } \| undefined>` | Your authenticated HTTP client. Every plugin `this.get/post/patch/delete` is routed through it. |
77
+ | `showToast` | `({ message, variant?, autohide? }) => void` | Your toast implementation. |
78
+ | `clearToasts` | `() => void` | Dismiss all toasts. |
79
+ | `monitoringExceptionHelper` | `(error: Error, extra: { extra }) => void` | Where uncaught plugin errors are reported. |
80
+ | `modal` | `{ showing, show, showPrompt, onConfirm, onHide }` | Your confirm/prompt modal primitives. |
81
+ | `children` | render prop | See the render-prop table below. |
82
+
83
+ **Optional props**
84
+
85
+ | Prop | Type | Notes |
86
+ | ---------------------- | -------------------------------------------------------------- | --------------------------------------------------------------- |
87
+ | `clientObject` | `{ id, objectName }` | Contextual record object, when there is one. |
88
+ | `bootstrapPlugins` | `{ id, api_name }[]` | Plugins to bootstrap on mount. Defaults to `[]`. |
89
+ | `userConfigs` | `{ config, api_name }[]` | Per-user plugin config. Defaults to `[]`. |
90
+ | `onCompleteSetup` | `(pluginApiName, payload, options?) => Promise<unknown>` | Persist a plugin's setup-assistant result. |
91
+ | `createFileId` | `() => string` | Required only if plugins upload files. |
92
+ | `performFileUpload` | `(args) => Promise<unknown>` | Required only if plugins upload files. |
93
+ | `getPendingCacheCount` | `(search: string) => number` | Lets the engine wait on your in-flight cache writes. |
94
+ | `invalidateCache` | `(category: 'timeline' \| 'entity', entityId: string) => void` | Called when a plugin mutates a record. |
95
+ | `hideFramesOnModal` | `boolean` | Hide floating frames while a modal is open. Defaults to `true`. |
96
+ | `t` | `(s: string) => string` | Translation function. Omit for English. |
97
+
98
+ **A minimal integration**
99
+
47
100
  ```tsx
48
101
  import { AppEngineProvider } from '@kizenapps/engine/react';
49
- import { useHistory } from 'react-router-dom';
50
- import PluginContext from 'contexts/Plugins';
51
- import { useTranslation } from 'react-i18next';
102
+ import { useNavigate } from 'react-router-dom';
103
+ import { useCallback } from 'react';
52
104
 
53
- const AppProvider = ({ user, teamMember, business, clientObject }) => {
54
- const history = useHistory();
105
+ const AppProvider = ({ user, teamMember, business, children }) => {
106
+ const navigate = useNavigate();
55
107
 
56
108
  const onNavigate = useCallback(
57
- (path: string, args?: { replace?: boolean }) => {
58
- if (args?.replace) {
59
- history.replace(path);
60
- } else {
61
- history.push(path);
62
- }
109
+ (path: string, options?: { replace?: boolean }) => {
110
+ navigate(path, { replace: Boolean(options?.replace) });
63
111
  },
64
- [history],
112
+ [navigate],
65
113
  );
66
114
 
67
- const [showToast, , clearToasts] = useToast();
68
-
69
- const [integrationModalProps, , integrationModalTriggerProps] = useModal({});
70
-
71
- const { onConfirm, show, onHide } = integrationModalProps;
72
- const { show: showPrompt, showing } = integrationModalTriggerProps;
73
-
74
- const { t } = useTranslation();
75
-
76
-
77
115
  return (
78
116
  <AppEngineProvider
79
117
  user={user}
80
118
  teamMember={teamMember}
81
119
  business={business}
82
- clientObject={clientObject}
120
+ appPath={API_BASE_PATH}
83
121
  onNavigate={onNavigate}
84
- monitoringExceptionHelper={onError}
85
- showToast={showToast}
86
- clearToasts={clearToasts}
87
- modal={{
88
- showing,
89
- show,
90
- onConfirm,
91
- onHide,
92
- showPrompt,
93
- }}
94
- performRequest={performKizenRequest}
95
- appPath={import.meta.env.VITE_API_BASE_PATH}
96
- bootstrapPlugins={pluginApps}
97
- performFileUpload={FileService.upload}
98
- getPendingCacheCount={getPendingCacheCount}
99
- invalidateCache={invalidateCache}
100
- t={t}
122
+ performRequest={myApiClient.request}
123
+ showToast={myToast.show}
124
+ clearToasts={myToast.clearAll}
125
+ monitoringExceptionHelper={reportError}
126
+ modal={myConfirmModal}
101
127
  >
102
- {({
103
- handleCreateRecordComplete,
104
- handleCreateRelatedRecordComplete,
105
- showCreateRecordModal,
106
- showCreateRelatedRecordModal,
107
- createRecordModalObjectId,
108
- createRelatedRecordModalObjectId,
109
- createRelatedRecordModalRelatedEntityId,
110
- showLoadingIndicator,
111
- hasFinishedBootstrapping,
112
- derivedModalState,
113
- showPluginModal,
114
- pluginApiName,
115
- ...rest
116
- }) => {
117
- return (
118
- <PluginContext.Provider
119
- value={{
120
- isFetched: hasFetchedBootstrap,
121
- isLoading,
122
- pluginNames,
123
- floatingFrames: isLoading ? [] : floatingFrames,
124
- routablePages,
125
- dataAdornments,
126
- calendarSources,
127
- refetch,
128
- fullRefetch,
129
- installedPluginAPINamesToIds,
130
- plugins: data,
131
- toolbarItems,
132
- toolbarItemsByFullId,
133
- routeScripts,
134
- automationSteps: isLoading ? [] : automationSteps,
135
- objectSettingsMenuItems,
136
- userConfigsByApiName,
137
- featureFlags,
138
- refetchFeatureFlags,
139
- featureFlagsLoading: !hasCalculatedFeatureFlags && !hasFinishedBootstrapping,
140
- businessPluginAppsByApiName,
141
- ...rest,
142
- }}
143
- >
144
- {showLoadingIndicator ? <StyledLoader loading /> : null}
145
- {children}
146
- {showPluginModal ? (
147
- <PluginModal modalState={derivedModalState} pluginApiName={pluginApiName} />
148
- ) : null}
149
- {showCreateRecordModal ? (
150
- <Suspense fallback={null}>
151
- <CreateRecordModal
152
- objectId={createRecordModalObjectId}
153
- onComplete={handleCreateRecordComplete}
154
- />
155
- </Suspense>
156
- ) : null}
157
- {showCreateRelatedRecordModal ? (
158
- <Suspense fallback={null}>
159
- <CreateRelatedRecordModal
160
- objectId={createRelatedRecordModalObjectId}
161
- relatedEntityId={createRelatedRecordModalRelatedEntityId}
162
- onComplete={handleCreateRelatedRecordComplete}
163
- />
164
- </Suspense>
165
- ) : null}
166
- </PluginContext.Provider>
167
- );
168
- }}
169
- </PluginEngineProvider>
128
+ {({ showLoadingIndicator, showPluginModal, pluginApiName, derivedModalState }) => (
129
+ <>
130
+ {showLoadingIndicator ? <YourSpinner /> : null}
131
+ {children}
132
+ {showPluginModal ? (
133
+ <YourPluginModal modalState={derivedModalState} pluginApiName={pluginApiName} />
134
+ ) : null}
135
+ </>
136
+ )}
137
+ </AppEngineProvider>
170
138
  );
171
139
  };
172
140
  ```
173
141
 
142
+ **The render prop**
143
+
144
+ The engine tells you _when_ to render something and _what_ to render it for; you supply the
145
+ component. Alongside the modal callbacks it passes:
146
+
147
+ | Key | Meaning |
148
+ | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
149
+ | `showLoadingIndicator` | A blocking plugin script is running. |
150
+ | `hasFinishedBootstrapping` | All bootstrapped plugins have loaded. |
151
+ | `waitingOnRouteScript` | A route script is still resolving. |
152
+ | `hiddenByModal` | Floating frames are hidden behind a modal. |
153
+ | `showPluginModal`, `pluginApiName`, `derivedModalState` | Render a plugin-owned modal. |
154
+ | `showCreateRecordModal`, `createRecordModalObjectId`, `handleCreateRecordComplete` | A plugin asked for a record-creation modal. Call the handler with the created record. |
155
+ | `showCreateRelatedRecordModal`, `createRelatedRecordModalObjectId`, `createRelatedRecordModalRelatedEntityId`, `handleCreateRelatedRecordComplete` | Same, for a related record. |
156
+ | `handleShowModal`, `handleShowCreateRecordModal`, `handleShowCreateRelatedRecordModal`, `closeCurrentModal` | Imperative modal controls. |
157
+
174
158
  #### Running Scripts
175
159
 
176
- ```tsx
177
- import { useGenericPluginCustomScript } from '@kizenapps/engine/react';
178
- import { useToast } from 'components/ToastProvider';
160
+ Hooks are provided for each surface a plugin script can run on. The generic one:
179
161
 
180
- const ScriptButton = ({ pluginScript }: { pluginScript: string }) => {
181
- const [showToast] = useToast();
162
+ ```tsx
163
+ import { useGenericAppCustomScript } from '@kizenapps/engine/react';
182
164
 
183
- const [executeInline, { pending: inlinePending }] = useGenericPluginCustomScript({
165
+ const ScriptButton = ({ plugin, pluginScript }) => {
166
+ const [executeInline, { pending }] = useGenericAppCustomScript({
167
+ plugin,
184
168
  onError: (e) => {
185
- showToast({
169
+ myToast.show({
186
170
  message: `Script could not be executed: ${e?.message}`,
187
171
  variant: 'failure',
188
172
  });
189
173
  },
190
- plugin: item,
191
174
  });
192
175
 
193
- return <button onClick={() => executeInline(pluginScript)} disabled={inlinePending} />;
176
+ return <button onClick={() => executeInline(pluginScript)} disabled={pending} />;
194
177
  };
195
178
  ```
196
179
 
180
+ Surface-specific equivalents are exported from `@kizenapps/engine/react` — `useAppPage`,
181
+ `useCustomBlock`, `useFloatingFrame`, `useRecordDetailCustomScript`,
182
+ `useCalendarSourceCustomScript`, and others.
183
+
197
184
  #### Worker Runner
198
185
 
199
186
  Some worker calls are coordinated using `@tanstack/react-query`. If your consumer app also uses react-query, the app engine will use your existing query provider. If you aren't already using react-query, the engine provider will be wrapped in its own query context and no additional action is needed.
@@ -275,3 +262,32 @@ if (context?.unsavedFilter) {
275
262
  applyUnsavedFilter(context.unsavedFilter);
276
263
  }
277
264
  ```
265
+
266
+ ### Development
267
+
268
+ This repo uses pnpm.
269
+
270
+ ```
271
+ pnpm install
272
+ pnpm build # extract translations, bundle with tsup, verify worker bundles
273
+ pnpm test # unit tests
274
+ pnpm typecheck
275
+ pnpm lint
276
+ pnpm format:check
277
+ ```
278
+
279
+ `pnpm build` finishes by running `scripts/check-worker-bundles.js`, which fails the build if a
280
+ worker bundle pulls in code that must never run inside a worker (`localStorage`, React, and
281
+ similar) or if the worker chunks exceed their size budget.
282
+
283
+ The plugin developer documentation lives in [`docs/`](docs/README.md) and publishes to GitHub Pages
284
+ on merge to `main`. Its static-site generator is a standalone project under `docs/site`, with its
285
+ own lockfile and tests.
286
+
287
+ ### License
288
+
289
+ Licensed under the GNU General Public License, version 3. See [LICENSE.md](LICENSE.md) for the full
290
+ text.
291
+
292
+ This matches the other published Kizen developer platform packages, `@kizenapps/cli` and
293
+ `@kizenapps/packager`. Note that the plugins themselves are licensed separately, under GPL 2.0.
@@ -1,6 +1,6 @@
1
- import { cleanConfig, buildIframeURLWithProxy, serializeConsoleArg } from './chunk-4DK3CMXY.js';
2
- import { Communicate } from './chunk-2KN64BCJ.js';
3
- import { RESPONSES, ACTIONS, ThirdPartyScript } from './chunk-5NF4DYQJ.js';
1
+ import { cleanConfig, buildIframeURLWithProxy, serializeConsoleArg } from './chunk-2V75NG3U.js';
2
+ import { Communicate } from './chunk-XEZJ3I3F.js';
3
+ import { RESPONSES, ACTIONS, ThirdPartyScript } from './chunk-5BBUKTOE.js';
4
4
 
5
5
  // src/contexts/BaseWorkerContext.ts
6
6
  var buildErrorResponse = async (result) => {
@@ -358,9 +358,7 @@ var BaseWorkerContext = class {
358
358
  }
359
359
  async completeSetup(payload, options) {
360
360
  if (!this.pluginApiName) {
361
- throw new Error(
362
- "completeSetup is not available for scripts not associated to a plugin"
363
- );
361
+ throw new Error("completeSetup is not available for scripts not associated to a plugin");
364
362
  }
365
363
  const candidate = payload;
366
364
  if (typeof candidate !== "object" || candidate === null || Array.isArray(candidate)) {
@@ -812,5 +810,5 @@ ${this.scriptBody}`);
812
810
  };
813
811
 
814
812
  export { BaseWorkerContext };
815
- //# sourceMappingURL=chunk-ZA5NLC5A.js.map
816
- //# sourceMappingURL=chunk-ZA5NLC5A.js.map
813
+ //# sourceMappingURL=chunk-2AJY4I2T.js.map
814
+ //# sourceMappingURL=chunk-2AJY4I2T.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/contexts/BaseWorkerContext.ts"],"names":[],"mappings":";;;;;AAuDA,IAAM,kBAAA,GAAqB,OAAO,MAAA,KAA6C;AAC7E,EAAA,IAAI,SAAA,GAAqB,IAAA;AAEzB,EAAA,IAAI;AACF,IAAA,SAAA,GAAY,MAAM,OAAO,IAAA,EAAK;AAAA,EAChC,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,OAAO,KAAA;AACT,CAAA;AAEA,IAAM,6BAAA,GAAgC,CACpC,EAAA,EACA,QAAA,EACA,OAAoB,EAAC,EACrB,UAAU,EAAA,KACC;AACX,EAAA,MAAM,cAAA,GAAiB,GAAG,QAAA,EAAS;AAEnC,EAAA,MAAM,MAAA,GAAS,IAAI,cAAc,CAAA,aAAA,EAAgB,QAAQ,CAAA,UAAA,EAAa,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA,yBAAA,CAAA;AAG1F,EAAA,MAAM,IAAA,GAAO,iBAAiB,OAAO;AAAA,OAAA,EAAY,MAAM,CAAA,MAAA,CAAA;AAEvD,EAAA,OAAO,IAAA;AACT,CAAA;AAOO,IAAM,oBAAN,MAAwB;AAAA,EACnB,IAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA,uBAAoC,GAAA,EAAI;AAAA,EACxC,eAAe,EAAC;AAAA,EAClB,GAAA;AAAA,EACD,YAAA;AAAA,EACC,cAAA,GAAiB,CAAA;AAAA,EACjB,eAAA,GAAkB,CAAA;AAAA,EAClB,iBAAA,GAAoB,CAAA;AAAA,EAClB,OAAA,GAAU,KAAA;AAAA,EACV,UAAA;AAAA,EACA,aAAA,GAAoC,EAAE,SAAA,EAAA,MAAA,aAA+B;AAAA,EACrE,QAAA;AAAA,EACF,gBAAA,GAAmB,KAAA;AAAA,EACpB,IAAA;AAAA,EACA,WAAA;AAAA,EACC,cAAA,GAAiB,KAAA;AAAA,EACjB,iBAAA;AAAA,EACA,mBAAA;AAAA,EACA,iBAAA;AAAA,EACA,8BAAA;AAAA,EACA,aAAA;AAAA,EACA,oBAAA;AAAA,EACA,sBAAA;AAAA,EACA,iBAAA;AAAA,EACA,oBAAA;AAAA,EACA,uBAAA;AAAA,EACA,8BAAA;AAAA,EACA,oBAAA;AAAA,EACE,UAAA;AAAA,EACH,aAAA;AAAA,EACA,kBAA+B,EAAC;AAAA,EAC/B,eAAA;AAAA,EAER,WAAA,CAAY;AAAA,IACV,IAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,uBAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,uBAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF,EAAsB;AACpB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AACpB,IAAA,IAAA,CAAK,eAAA,GAAkB,QAAA;AACvB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,UAAU,OAAA,IAAW,KAAA;AAC1B,IAAA,IAAA,CAAK,GAAA,GAAM;AAAA,MACT,GAAA,EAAK,aAAa,KAAK,CAAA;AAAA,MACvB,IAAA,EAAM,aAAa,MAAM,CAAA;AAAA,MACzB,GAAA,EAAK,aAAa,KAAK,CAAA;AAAA,MACvB,MAAA,EAAQ,aAAa,QAAQ,CAAA;AAAA,MAC7B,KAAA,EAAO,aAAa,OAAO;AAAA,KAC7B;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AACpB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,WAAA,CAAY,QAAQ,CAAA;AAC3C,IAAA,IAAA,CAAK,iBAAA,GAAoB,UAAA;AACzB,IAAA,IAAA,CAAK,mBAAA,GAAsB,eAAe,EAAC;AAC3C,IAAA,IAAA,CAAK,iBAAA,GAAoB,iBAAA;AACzB,IAAA,IAAA,CAAK,8BAAA,GAAiC,uBAAA;AACtC,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,IAAA,IAAA,CAAK,oBAAA,GAAuB,aAAA;AAC5B,IAAA,IAAA,CAAK,uBAAA,GAA0B,gBAAA;AAC/B,IAAA,IAAA,CAAK,8BAAA,GAAiC,uBAAA;AACtC,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,IAAA,CAAK,oBAAA,GAAuB,aAAA;AAC5B,IAAA,IAAA,CAAK,sBAAA,GAAyB,eAAA;AAC9B,IAAA,IAAA,CAAK,iBAAA,GAAoB,UAAA;AACzB,IAAA,IAAA,CAAK,oBAAA,GAAuB,aAAA;AAE5B,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,IAAQ,IAAI,CAAA;AAAA,IACrC,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,OAAO,EAAC;AAAA,IACf;AAAA,EACF;AAAA,EAEO,QAAQ,KAAA,EAAmC;AAChD,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,WAAA;AAAA,MACZ,KAAK,SAAA,CAAU;AAAA,QACb,QAAQ,SAAA,CAAU,KAAA;AAAA,QAClB,OAAO,KAAA,EAAO;AAAA,OACf;AAAA,KACH;AAAA,EACF;AAAA,EAEA,IAAI,MAAM,KAAA,EAAgB;AACxB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AAAA,EAC1B;AAAA,EAEA,IAAI,SAAS,KAAA,EAAgB;AAC3B,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AAAA,EACxB;AAAA,EAEA,IAAI,QAAA,GAAoB;AACtB,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA,EAEA,UAAU,IAAA,EAAwB;AAChC,IAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACvB;AAAA,EAEA,WAAW,KAAA,EAAuB;AAChC,IAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAAA,EAChC;AAAA,EAEA,UAAA,CAAW,GAAA,EAAa,MAAA,GAAS,QAAA,EAAU,OAAA,EAAyC;AAClF,IAAA,IAAA,CAAK,QAAA,CAAS,WAAA;AAAA,MACZ,KAAK,SAAA,CAAU;AAAA,QACb,QAAQ,OAAA,CAAQ,WAAA;AAAA,QAChB,GAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA,EAAU,qBAAA;AAAA,QACV;AAAA,OACD;AAAA,KACH;AAAA,EACF;AAAA,EAEA,SAAA,CACE,WAAA,EACA,MAAA,GAAuE,EAAC,EAClE;AACN,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,WAAA;AAAA,MACZ,KAAK,SAAA,CAAU;AAAA,QACb,QAAQ,OAAA,CAAQ,SAAA;AAAA,QAChB,WAAA;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,mBAAA,EACE,MAAA,CAAO,mBAAA,IAAuB,CAAA,aAAA,EAAgB,KAAK,aAAa,CAAA,KAAA,CAAA;AAAA,UAClE,iBAAA,EAAmB,MAAA,CAAO,iBAAA,IAAqB,CAAA,aAAA,EAAgB,KAAK,aAAa,CAAA,KAAA;AAAA;AACnF,OACD;AAAA,KACH;AAAA,EACF;AAAA,EAEA,aAAA,CAAc,aAAqB,IAAA,EAAsB;AACvD,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IACjE;AAEA,IAAA,MAAM,IAAA,GAAO,CAAA,6BAAA,EAAgC,IAAA,CAAK,aAAa,IAAI,WAAW,CAAA,CAAA;AAE9E,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACxB,MAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,IAAI,CAAA,CAAA;AAAA,IACvB;AAEA,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,EACxB;AAAA,EAEA,IAAI,eAAA,GAA+C;AACjD,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,IAAI,eAAA,GAAsC;AACxC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,IAAI,WAAA,GAA2B;AAC7B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP,EAAA,EAAI,IAAA,CAAK,UAAA,EAAY,EAAA,IAAM,EAAA;AAAA,QAC3B,SAAA,EAAW,IAAA,CAAK,UAAA,EAAY,SAAA,IAAa,EAAA;AAAA,QACzC,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,UAAA,IAAc,EAAA;AAAA,QAC3C,SAAA,EAAW,IAAA,CAAK,UAAA,EAAY,SAAA,IAAa,EAAA;AAAA,QACzC,KAAA,EAAO,IAAA,CAAK,UAAA,EAAY,KAAA,IAAS,EAAA;AAAA,QACjC,KAAA,EAAO,IAAA,CAAK,UAAA,EAAY,KAAA,IAAS,EAAA;AAAA,QACjC,OAAA,EAAS,IAAA,CAAK,UAAA,EAAY,OAAA,IAAW,EAAA;AAAA,QACrC,aAAA,EAAe,IAAA,CAAK,IAAA,EAAM,aAAA,IAAiB;AAAA;AAC7C,KACF;AAAA,EACF;AAAA,EAEA,IAAI,WAAA,GAAmC;AACrC,IAAA,OAAO,IAAA,CAAK,mBAAA;AAAA,EACd;AAAA,EAEA,IAAI,MAAA,GAAkB;AACpB,IAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,oBAAoB,CAAA;AAE9D,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,UAAU,IAAI,KAAA,CAAM,KAAK,IAAA,CAAK,oBAAA,IAAwB,EAAC,EAAG;AAAA,MAC9D,GAAA,EAAK,CAAC,MAAA,EAAQ,IAAA,KAAS;AACrB,QAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA,EAAG;AAC7B,UAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAAA,QACjC;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,KACD,CAAA;AAED,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,IAAI,QAAA,GAA4B;AAC9B,IAAA,OAAO,IAAI,KAAA,CAAM,IAAA,CAAK,eAAA,EAAiB;AAAA,MACrC,GAAA,EAAK,CAAC,MAAA,EAAQ,IAAA,KAAS;AACrB,QAAA,IAAI,SAAS,QAAA,EAAU;AACrB,UAAA,OAAO,MAAM;AACX,YAAA,OAAO,IAAA,CAAK,eAAA;AAAA,UACd,CAAA;AAAA,QACF;AAEA,QAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA,EAAG;AAC7B,UAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAAA,QACjC;AAEA,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,SAAA,EAAY,MAAA,CAAO,IAAI,CAAC,CAAA,oDAAA;AAAA,SAC1B;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,IAAI,UAAA,GAAsB;AACxB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,mBAAA,EAAqB,oBAAA;AAEpD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAM,YAAA,EAAc;AAAA,MACtC,GAAA,EAAK,CAAC,MAAA,EAAQ,IAAA,KAAS;AACrB,QAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA,EAAG;AAC7B,UAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAAA,QACjC;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,KACD,CAAA;AAED,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,eAAe,MAAA,EAA2B;AACxC,IAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,OAAO,MAAM,CAAA,CAAE,CAAA;AAAA,IACrE;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,MAAM,CAAA,sCAAA,CAAwC,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAA,CAAK,mBAAA,GAAsB;AAAA,MACzB,GAAG,IAAA,CAAK,mBAAA;AAAA,MACR,GAAG;AAAA,KACL;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,WAAA;AAAA,MACZ,KAAK,SAAA,CAAU;AAAA,QACb,QAAQ,OAAA,CAAQ,mBAAA;AAAA,QAChB;AAAA,OACD;AAAA,KACH;AAAA,EACF;AAAA,EAEA,MAAM,GAAA,CAAI,GAAA,EAAa,OAAA,EAAwC;AAC7D,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA,EAAG;AAC3B,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAE3C,QAAA,IAAI,YAAA,IAAgB,CAAC,OAAA,EAAS,WAAA,EAAa;AACzC,UAAA,IAAI,SAAS,YAAA,EAAc;AACzB,YAAA,OAAO,CAAC,YAAA,CAAa,IAAA,EAAM,IAAI,CAAA;AAAA,UACjC;AAEA,UAAA,OAAO,YAAA,CAAa,IAAA;AAAA,QACtB;AAEA,QAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,GAAA,CAAI,IAAI,GAAA,EAAK;AAAA,UACvC,GAAG,IAAA,CAAK,YAAA;AAAA,UACR,OAAA,EAAS,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,OAAO;AAAA,SAC5C,CAAA;AAED,QAAA,IAAA,CAAK,SAAA,CAAU,IAAI,GAAA,EAAK,EAAE,IAAI,IAAA,CAAK,GAAA,EAAI,EAAG,IAAA,EAAM,CAAA;AAEhD,QAAA,IAAI,SAAS,YAAA,EAAc;AACzB,UAAA,OAAO,CAAC,MAAM,IAAI,CAAA;AAAA,QACpB;AAEA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,UAC3B,MAAA,EAAQ,KAAA;AAAA,UACR,OAAA,EAAS,IAAI,OAAA,CAAQ,OAAA,EAAS,OAAO,CAAA;AAAA,UACrC,WAAA,EAAa,SAAS,WAAA,IAAe;AAAA,SACtC,CAAA;AAED,QAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,UAAA,MAAM,GAAA,GAAM,MAAM,kBAAA,CAAmB,GAAG,CAAA;AAExC,UAAA,MAAM,GAAA;AAAA,QACR;AAEA,QAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAE7B,QAAA,IAAI,SAAS,YAAA,EAAc;AACzB,UAAA,OAAO,CAAC,MAAM,IAAI,CAAA;AAAA,QACpB;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,SAAS,EAAA,EAAI;AACX,MAAA,IAAI,SAAS,YAAA,EAAc;AACzB,QAAA,OAAO,CAAC,MAAM,EAAE,CAAA;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,QAAQ,EAAiB,CAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aAAA,CACJ,GAAA,EACA,OAAA,EACoC;AACpC,IAAA,OAAO,IAAA,CAAK,IAAI,GAAA,EAAK;AAAA,MACnB,GAAG,OAAA;AAAA,MACH,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,aAAA,GAAsC;AAC1C,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,QAAA,IAAY,CAAC,KAAK,iBAAA,EAAmB;AAClD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAgB,MAAM,IAAA,CAAK,GAAA,CAAI,kCAAkC,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI;AAAA,MAC3F,WAAA,EAAa;AAAA,KACd,CAAA;AAED,IAAA,OAAO,YAAA,CAAa,MAAA,GAAS,IAAA,CAAK,iBAAiB,KAAK,EAAC;AAAA,EAC3D;AAAA,EAEA,MAAM,cAAc,MAAA,EAAuC;AACzD,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,QAAA,IAAY,CAAC,KAAK,iBAAA,EAAmB;AAClD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAa,MAAM,IAAA,CAAK,GAAA,CAAI,kCAAkC,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI;AAAA,MACxF,WAAA,EAAa;AAAA,KACd,CAAA;AAED,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,IAAA,CAAK,kCAAkC,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI;AAAA,MAC7F,MAAA,EAAQ;AAAA,QACN,GAAG,SAAA,EAAW,MAAA;AAAA,QACd,CAAC,IAAA,CAAK,iBAAiB,GAAG;AAAA,UACxB,GAAG,SAAA,EAAW,MAAA,GAAS,IAAA,CAAK,iBAAiB,CAAA;AAAA,UAC7C,GAAG;AAAA;AACL;AACF,KACD,CAAA;AAED,IAAA,OAAO,cAAA;AAAA,EACT;AAAA,EAEA,MAAa,aAAA,CAAc,OAAA,EAAsB,OAAA,EAA+C;AAC9F,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,MAAM,IAAI,MAAM,uEAAuE,CAAA;AAAA,IACzF;AAEA,IAAA,MAAM,SAAA,GAAqB,OAAA;AAE3B,IAAA,IAAI,OAAO,cAAc,QAAA,IAAY,SAAA,KAAc,QAAQ,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AACnF,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IACjE;AAEA,IAAA,MAAM,SAAA,GAAqB,MAAA,CAAO,cAAA,CAAe,SAAS,CAAA;AAE1D,IAAA,IAAI,SAAA,KAAc,MAAA,CAAO,SAAA,IAAa,SAAA,KAAc,IAAA,EAAM;AACxD,MAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,IACvE;AAEA,IAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,OAAA,EAAS,OAAO,CAAA;AAAA,EAClD;AAAA,EAEA,MAAM,KAAA,CAAM,GAAA,EAAa,IAAA,EAAoB,OAAA,EAA4C;AACvF,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA,EAAG;AAC3B,QAAA,MAAM,EAAE,MAAK,GAAI,MAAM,KAAK,GAAA,CAAI,KAAA,CAAM,KAAK,IAAA,EAAM;AAAA,UAC/C,GAAG,IAAA,CAAK,YAAA;AAAA,UACR,SAAS,OAAA,EAAS;AAAA,SACnB,CAAA;AAED,QAAA,IAAI,SAAS,YAAA,EAAc;AACzB,UAAA,OAAO,CAAC,MAAM,IAAI,CAAA;AAAA,QACpB;AAEA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,UAC3B,MAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,IAAA;AAAA,UACpC,OAAA,EAAS,IAAI,OAAA,CAAQ,OAAA,EAAS,OAAO,CAAA;AAAA,UACrC,WAAA,EAAa,SAAS,WAAA,IAAe;AAAA,SACtC,CAAA;AAED,QAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,UAAA,MAAM,GAAA,GAAM,MAAM,kBAAA,CAAmB,GAAG,CAAA;AACxC,UAAA,MAAM,GAAA;AAAA,QACR;AAEA,QAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAE7B,QAAA,IAAI,SAAS,YAAA,EAAc;AACzB,UAAA,OAAO,CAAC,MAAM,IAAI,CAAA;AAAA,QACpB;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,SAAS,EAAA,EAAI;AACX,MAAA,IAAI,SAAS,YAAA,EAAc;AACzB,QAAA,OAAO,CAAC,MAAM,EAAE,CAAA;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,QAAQ,EAAiB,CAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,eAAA,CACJ,GAAA,EACA,IAAA,EACA,OAAA,EACoC;AACpC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,IAAA,EAAM;AAAA,MAC3B,GAAG,OAAA;AAAA,MACH,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,IAAA,CAAK,GAAA,EAAa,IAAA,EAAoB,OAAA,EAA4C;AACtF,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA,EAAG;AAC3B,QAAA,MAAM,EAAE,MAAK,GAAI,MAAM,KAAK,GAAA,CAAI,IAAA,CAAK,KAAK,IAAA,EAAM;AAAA,UAC9C,GAAG,IAAA,CAAK,YAAA;AAAA,UACR,OAAA,EAAS,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,OAAO;AAAA,SAC5C,CAAA;AAED,QAAA,IAAI,SAAS,YAAA,EAAc;AACzB,UAAA,OAAO,CAAC,MAAM,IAAI,CAAA;AAAA,QACpB;AAEA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,UAC3B,MAAA,EAAQ,MAAA;AAAA,UACR,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,IAAA;AAAA,UACpC,OAAA,EAAS,IAAI,OAAA,CAAQ,OAAA,EAAS,OAAO,CAAA;AAAA,UACrC,WAAA,EAAa,SAAS,WAAA,IAAe;AAAA,SACtC,CAAA;AAED,QAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,UAAA,MAAM,GAAA,GAAM,MAAM,kBAAA,CAAmB,GAAG,CAAA;AACxC,UAAA,MAAM,GAAA;AAAA,QACR;AAEA,QAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAE7B,QAAA,IAAI,SAAS,YAAA,EAAc;AACzB,UAAA,OAAO,CAAC,MAAM,IAAI,CAAA;AAAA,QACpB;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,SAAS,EAAA,EAAI;AACX,MAAA,IAAI,SAAS,YAAA,EAAc;AACzB,QAAA,OAAO,CAAC,MAAM,EAAE,CAAA;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,QAAQ,EAAiB,CAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,cAAA,CACJ,GAAA,EACA,IAAA,EACA,OAAA,EACoC;AACpC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,IAAA,EAAM;AAAA,MAC1B,GAAG,OAAA;AAAA,MACH,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,MAAA,CAAO,GAAA,EAAa,OAAA,EAA4C;AACpE,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA,EAAG;AAC3B,QAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,GAAA,CAAI,OAAO,GAAA,EAAK;AAAA,UAC1C,GAAG,IAAA,CAAK,YAAA;AAAA,UACR,OAAA,EAAS,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,OAAO;AAAA,SAC5C,CAAA;AAED,QAAA,IAAI,SAAS,YAAA,EAAc;AACzB,UAAA,OAAO,CAAC,MAAM,IAAI,CAAA;AAAA,QACpB;AAEA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,UAC3B,MAAA,EAAQ,QAAA;AAAA,UACR,OAAA,EAAS,IAAI,OAAA,CAAQ,OAAA,EAAS,OAAO,CAAA;AAAA,UACrC,WAAA,EAAa,SAAS,WAAA,IAAe;AAAA,SACtC,CAAA;AAED,QAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,UAAA,MAAM,GAAA,GAAM,MAAM,kBAAA,CAAmB,GAAG,CAAA;AACxC,UAAA,MAAM,GAAA;AAAA,QACR;AAEA,QAAA,IAAI,IAAA,GAA2B,IAAA;AAE/B,QAAA,IAAI,GAAA,CAAI,WAAW,GAAA,EAAK;AACtB,UAAA,IAAA,GAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,QACzB;AAEA,QAAA,IAAI,SAAS,YAAA,EAAc;AACzB,UAAA,OAAO,CAAC,MAAM,IAAI,CAAA;AAAA,QACpB;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,SAAS,EAAA,EAAI;AACX,MAAA,IAAI,SAAS,YAAA,EAAc;AACzB,QAAA,OAAO,CAAC,MAAM,EAAE,CAAA;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,QAAQ,EAAiB,CAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,gBAAA,CACJ,GAAA,EACA,OAAA,EACoC;AACpC,IAAA,OAAO,IAAA,CAAK,OAAO,GAAA,EAAK;AAAA,MACtB,GAAG,OAAA;AAAA,MACH,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH;AAAA,EAEA,MAAa,sBAAsB,QAAA,EAAoC;AACrE,IAAA,OAAO,IAAA,CAAK,wBAAwB,QAAQ,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAa,4BAAA,CACX,QAAA,EACA,eAAA,EACkB;AAClB,IAAA,OAAO,IAAA,CAAK,8BAAA,CAA+B,QAAA,EAAU,eAAe,CAAA;AAAA,EACtE;AAAA,EAEO,SAAA,CAAU,SAAiB,YAAA,EAAsC;AACtE,IAAA,IAAA,CAAK,QAAA,CAAS,WAAA;AAAA,MACZ,KAAK,SAAA,CAAU;AAAA,QACb,QAAQ,OAAA,CAAQ,UAAA;AAAA,QAChB,OAAA;AAAA,QACA;AAAA,OACD;AAAA,KACH;AAAA,EACF;AAAA,EAEO,WAAA,GAAoB;AACzB,IAAA,IAAA,CAAK,QAAA,CAAS,WAAA;AAAA,MACZ,KAAK,SAAA,CAAU;AAAA,QACb,QAAQ,OAAA,CAAQ;AAAA,OACjB;AAAA,KACH;AAAA,EACF;AAAA,EAEO,QAAA,CAAS,QAAgB,OAAA,EAAgD;AAC9E,IAAA,IAAA,CAAK,QAAA,CAAS,WAAA;AAAA,MACZ,KAAK,SAAA,CAAU;AAAA,QACb,QAAQ,OAAA,CAAQ,SAAA;AAAA,QAChB,MAAA;AAAA,QACA;AAAA,OACD;AAAA,KACH;AAAA,EACF;AAAA,EAEO,cAAA,CAAe,UAAA,EAAoB,IAAA,GAAoB,EAAC,EAAS;AACtE,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,IACpE;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,WAAA;AAAA,MACZ,KAAK,SAAA,CAAU;AAAA,QACb,QAAQ,OAAA,CAAQ,gBAAA;AAAA,QAChB,UAAA;AAAA,QACA;AAAA,OACD;AAAA,KACH;AAAA,EACF;AAAA,EAEO,OAAO,MAAA,EAAuC;AACnD,IAAA,OAAO,IAAA,CAAK,cAAc,MAAM,CAAA;AAAA,EAClC;AAAA,EAEA,MAAa,eAAA,CACX,EAAA,EACA,MAAA,EACkB;AAClB,IAAA,OAAO,IAAA,CAAK,sBAAA,CAAuB,EAAA,EAAI,MAAM,CAAA;AAAA,EAC/C;AAAA,EAEO,UAAA,CAAW,QAAsB,QAAA,EAA0B;AAChE,IAAA,IAAA,CAAK,iBAAA,CAAkB,QAAQ,QAAQ,CAAA;AAAA,EACzC;AAAA,EAEA,MAAa,cAAc,OAAA,EAAgD;AACzE,IAAA,MAAM,cAAA,GAAiB,eAAA;AAEvB,IAAA,IAAI,OAAA,GAAU,6BAAA;AAEd,IAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,aAAa,CAAA;AAC/C,MAAA,OAAA,IAAW,KAAA,CACR,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,QAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,aAAA,GAAgB,CAAC,CAAA;AAEtC,QAAA,IAAI,OAAO,SAAS,UAAA,EAAY;AAC9B,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,CAAC,CAAA,wBAAA,EAA2B,OAAO,IAAI,CAAA,CAAE,CAAA;AAAA,QAC9E;AAEA,QAAA,OAAO,CAAA,eAAA,EAAkB,CAAC,CAAA,MAAA,EAAS,IAAA,CAAK,UAAU,CAAA,EAAA,CAAA;AAAA,MACpD,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAAA,IACd;AAEA,IAAA,MAAM,mBAAA,GAAsB,OAAA,CAAQ,OAAA,EAAS,GAAA,CAAI,CAAC,CAAA,KAAM;AACtD,MAAA,IAAI,YAAA,GAAe,EAAA;AACnB,MAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,QAAA,YAAA,GAAe,6BAAA;AAAA,UACb,CAAA,CAAE,YAAA;AAAA,UACF,cAAA;AAAA,UACA,CAAA,CAAE,IAAA;AAAA,UACF;AAAA,SACF;AAAA,MACF;AAEA,MAAA,IAAI,WAAA,GAAc,EAAA;AAClB,MAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,QAAA,WAAA,GAAc,8BAA8B,CAAA,CAAE,WAAA,EAAa,cAAA,EAAgB,CAAA,CAAE,MAAM,OAAO,CAAA;AAAA,MAC5F;AAEA,MAAA,IAAI,UAAA,GAAa,EAAA;AACjB,MAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,QAAA,UAAA,GAAa,8BAA8B,CAAA,CAAE,UAAA,EAAY,cAAA,EAAgB,CAAA,CAAE,MAAM,OAAO,CAAA;AAAA,MAC1F;AAEA,MAAA,IAAI,OAAA,GAAU,EAAA;AACd,MAAA,IAAI,aAAa,CAAA,EAAG;AAClB,QAAA,OAAA,GAAU,8BAA8B,CAAA,CAAE,OAAA,EAAS,cAAA,EAAgB,CAAA,CAAE,MAAM,OAAO,CAAA;AAAA,MACpF;AAEA,MAAA,OAAO;AAAA,QACL,GAAG,CAAA;AAAA,QACH,YAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,GAAG,OAAA;AAAA,MACH,OAAA,EAAS;AAAA,KACX;AAEA,IAAA,MAAM,oBAAA,GAAuB;AAAA,MAC3B,QAAQ,MAAA,CAAO;AAAA,KACjB;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,oBAAA,CAAqB,MAAM,CAAA;AAErD,IAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,oBAAA,EAAsB,MAAA,CAAO,MAAM,CAAA;AAExE,IAAA,OAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA,EAEO,YAAA,CACL,GAAA,EACA,KAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,IAAA,MAAM,EAAE,GAAA,EAAK,YAAA,EAAc,YAAA,EAAa,GAAI,uBAAA;AAAA,MAC1C,GAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA,EAAO,KAAK,IAAI;AAAA,KAClB;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,WAAA;AAAA,MACZ,KAAK,SAAA,CAAU;AAAA,QACb,QAAQ,OAAA,CAAQ,aAAA;AAAA,QAChB,GAAA,EAAK,YAAA;AAAA,QACL,MAAM,IAAA,CAAK,aAAA;AAAA,QACX,KAAA;AAAA,QACA,OAAA;AAAA,QACA,UAAU,IAAA,CAAK,QAAA;AAAA,QACf;AAAA,OACD;AAAA,KACH;AAAA,EACF;AAAA,EAEQ,qBAAqB,IAAA,EAA6B;AACxD,IAAA,OAAO,IAAI,OAAA,CAAgB,CAAC,OAAA,EAAS,MAAA,KAAW;AAC9C,MAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAE9B,MAAA,MAAA,CAAO,cAAc,IAAI,CAAA;AAEzB,MAAA,MAAA,CAAO,SAAS,MAAM;AACpB,QAAA,OAAA,CAAQ,OAAO,MAAgB,CAAA;AAAA,MACjC,CAAA;AAEA,MAAA,MAAA,CAAO,OAAA,GAAU,CAAC,KAAA,KAAU;AAE1B,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,MACd,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAa,UAAA,CAAW,IAAA,EAAY,QAAA,EAAmB,WAAW,KAAA,EAAyB;AACzF,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,oBAAA,CAAqB,IAAI,CAAA;AACpD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,iBAAA,CAAkB;AAAA,MACvC,IAAA,EAAM,OAAA;AAAA,MACN,UAAU,QAAA,IAAY,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,MACjD;AAAA,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEU,UAAA,GAAmB;AAAA,EAE7B;AAAA,EAEU,OAAA,GAAgB;AACxB,IAAA,IAAI,IAAA,CAAK,oBAAoB,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,sBAAsB,CAAA,EAAG;AAChC,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AAEA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,CAAA;;AAAA,EAAsB,IAAA,CAAK,UAAU,CAAA,CAAE,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAA,CAAK,eAAA,EAAA;AACL,IAAA,IAAA,CAAK,cAAA,GAAiB,YAAY,GAAA,EAAI;AAEtC,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA,EAEU,UAAU,MAAA,EAAwB;AAC1C,IAAA,IAAI,IAAA,CAAK,sBAAsB,CAAA,EAAG;AAChC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,oBAAoB,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,IACnD;AAEA,IAAA,IAAA,CAAK,iBAAA,EAAA;AACL,IAAA,IAAA,CAAK,YAAA,CAAA,MAAA,YAAgC;AACrC,IAAA,MAAM,GAAA,GAAM,YAAY,GAAA,EAAI;AAC5B,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,sBAAA,EAAyB,MAAA,CAAO,MAAM,IAAA,CAAK,cAAc,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,IACjF;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,MAAM,CAAA;AAAA,EACjC;AAAA,EAEA,aAAa,SAAA,GAAA,MAAA,aAAwE;AACnF,IAAA,IAAA,CAAK,cAAc,SAAA,GAAY,SAAA;AAE/B,IAAA,IAAA,CAAK,QAAA,CAAS,EAAE,SAAA,EAAW,CAAA;AAAA,EAC7B;AAAA,EAEA,KAAK,EAAA,EAA2B;AAC9B,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACzD;AAAA,EAEQ,IAAA,CAAK,UAAmB,MAAA,EAAwB;AACtD,IAAA,IAAA,CAAK,QAAA,CAAS,WAAA;AAAA,MACZ,KAAK,SAAA,CAAU;AAAA,QACb,QAAQ,OAAA,CAAQ,IAAA;AAAA,QAChB,MAAA;AAAA,QACA;AAAA,OACD;AAAA,KACH;AAAA,EACF;AAAA,EAEQ,SAAS,KAAA,EAAsB;AACrC,IAAA,IAAA,CAAK,QAAA,CAAS,WAAA;AAAA,MACZ,KAAK,SAAA,CAAU;AAAA,QACb,QAAQ,OAAA,CAAQ,QAAA;AAAA,QAChB;AAAA,OACD;AAAA,KACH;AAAA,EACF;AAAA,EAEU,cAAc,GAAA,EAAsB;AAC5C,IAAA,OAAO,GAAA,CAAI,WAAW,GAAG,CAAA;AAAA,EAC3B;AAAA,EAEQ,YAAA,CAAa,OAAA,GAAkC,EAAC,EAA2B;AACjF,IAAA,OAAO;AAAA,MACL,GAAG,OAAA;AAAA,MACH,gBAAA,EAAkB;AAAA,KACpB;AAAA,EACF;AAAA,EAEO,qBAAqB,EAAA,EAAmB;AAC7C,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,IAAA,CAAK,QAAA,CAAS,WAAA;AAAA,QACZ,KAAK,SAAA,CAAU;AAAA,UACb,QAAQ,OAAA,CAAQ,gBAAA;AAAA,UAChB,QAAA,EAAU;AAAA,SACX;AAAA,OACH;AAAA,IACF;AAAA,EACF;AAAA,EAEO,mBAAmB,EAAA,EAAsB;AAC9C,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,OAAO,IAAA,CAAK,qBAAqB,EAAE,CAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,MAAa,wBAAwB,SAAA,EAA0D;AAC7F,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,8BAAA,CAA+B,SAAA,EAAW,KAAK,IAAI,CAAA;AAC7E,MAAA,MAAM,UAAU,IAAI,gBAAA,CAAiB,IAAA,CAAK,QAAA,EAAU,OAAO,GAAG,CAAA;AAE9D,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,QAAQ,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,SAAS,0BAA0B,CAAC,CAAA;AAAA,IACnF;AAAA,EACF;AAAA,EAEO,qBAAA,GAA8B;AACnC,IAAA,IAAA,CAAK,QAAA,CAAS,WAAA;AAAA,MACZ,KAAK,SAAA,CAAU;AAAA,QACb,QAAQ,OAAA,CAAQ;AAAA,OACjB;AAAA,KACH;AAAA,EACF;AAAA,EAEO,gBAAgB,IAAA,EAAoB;AACzC,IAAA,IAAA,CAAK,QAAA,CAAS,WAAA;AAAA,MACZ,KAAK,SAAA,CAAU;AAAA,QACb,QAAQ,OAAA,CAAQ,iBAAA;AAAA,QAChB;AAAA,OACD;AAAA,KACH;AAAA,EACF;AAAA,EAEO,iBAAiB,UAAA,EAA0B;AAChD,IAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,MAAA,CAAO,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7D;AAEA,IAAA,IAAI,CAAC,qBAAA,CAAsB,IAAA,CAAK,UAAU,CAAA,EAAG;AAC3C,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,UAAU,CAAA,gCAAA,CAAkC,CAAA;AAAA,IAC7E;AAEA,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,QAAA,CAAS,IAAA,EAAM,EAAE,CAAC,CAAA;AAEpE,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,UAAU,CAAA,0CAAA,CAA4C,CAAA;AAAA,IACvF;AAGA,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAI,KAAA,CAAM,CAAC,CAAA,GAAK,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AAE3D,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEO,sBAAsB,IAAA,EAAoB;AAC/C,IAAA,OAAO,KAAK,OAAA,EAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,OAAA,GAAyB;AAC3B,IAAA,MAAM,SAAA,uBAAgB,GAAA,CAAI,CAAC,OAAO,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAC,CAAA;AACnE,IAAA,OAAO,IAAI,KAAA,CAAM,EAAC,EAAoB;AAAA,MACpC,GAAA,EAAK,CAAC,CAAA,EAAG,IAAA,KAAS;AAChB,QAAA,MAAM,KAAA,GAAQ,UAAU,GAAA,CAAI,MAAA,CAAO,IAAI,CAAC,CAAA,GAAI,MAAA,CAAO,IAAI,CAAA,GAAI,KAAA;AAC3D,QAAA,OAAO,IAAI,IAAA,KAAoB;AAC7B,UAAA,IAAI;AACF,YAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACvC,cAAA,IAAI;AACF,gBAAA,OAAO,oBAAoB,GAAG,CAAA;AAAA,cAChC,CAAA,CAAA,MAAQ;AACN,gBAAA,OAAO,IAAA;AAAA,cACT;AAAA,YACF,CAAC,CAAA;AACD,YAAA,IAAI,OAAA;AACJ,YAAA,IAAI;AACF,cAAA,OAAA,GAAU,KAAK,SAAA,CAAU;AAAA,gBACvB,QAAQ,OAAA,CAAQ,WAAA;AAAA,gBAChB,KAAA;AAAA,gBACA,IAAA,EAAM;AAAA,eACP,CAAA;AAAA,YACH,CAAA,CAAA,MAAQ;AACN,cAAA,OAAA,GAAU,KAAK,SAAA,CAAU;AAAA,gBACvB,QAAQ,OAAA,CAAQ,WAAA;AAAA,gBAChB,KAAA;AAAA,gBACA,IAAA,EAAM,CAAC,8BAA8B;AAAA,eACtC,CAAA;AAAA,YACH;AACA,YAAA,IAAA,CAAK,QAAA,CAAS,YAAY,OAAO,CAAA;AAAA,UACnC,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF,CAAA;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH;AACF","file":"chunk-2AJY4I2T.js","sourcesContent":["/* eslint-disable @typescript-eslint/only-throw-error */\nimport { Communicate } from '../communication/Communicate.js';\nimport { ACTIONS, INDICATOR_TYPE, RESPONSES } from '../communication/constants.js';\nimport { ThirdPartyScript } from '../communication/ThirdPartyScript.js';\nimport type {\n ConsoleBridge,\n CurrentUser,\n PartialBusiness,\n PartialClientObject,\n PartialLocation,\n PartialTeamMember,\n PartialUser,\n UnknownJSON,\n} from '../types/common.js';\nimport type {\n Args,\n BaseAPI,\n CompleteSetupFn,\n CompleteSetupOptions,\n DataCache,\n ErrorResponse,\n InstallThirdPartyScriptFn,\n Instance,\n InternalSessionData,\n OpenCreateRecordFn,\n OpenCreateRelatedRecordFn,\n PostFormDataFn,\n PromptFn,\n RefreshEntityFn,\n ShowToastOptions,\n StateChangePayload,\n UploadFileFn,\n UserConfig,\n WorkerContextArgs,\n} from '../types/contexts.js';\nimport type {\n DynamicPromptConfig,\n CloseModalFn,\n DynamicPromptFn,\n ModalConfig,\n ShowViewInModalFn,\n ShowViewInModalOptions,\n PromptState,\n UnknownFunction,\n} from '../types/modals.js';\nimport type {\n GetOptions,\n GetReturnValue,\n RequestOptions,\n RequestWithErrorsResponse,\n} from '../types/request.js';\nimport { serializeConsoleArg } from '../util/console.js';\nimport { cleanConfig } from '../workers/util.js';\nimport { buildIframeURLWithProxy, type BuildIframeURLWithProxyOptions } from '../util/frames.js';\n\nconst buildErrorResponse = async (result: Response): Promise<ErrorResponse> => {\n let errorJSON: unknown = null;\n\n try {\n errorJSON = await result.json();\n } catch {\n // If the response is not JSON, we just return the text\n }\n\n const error = {\n status: result.status,\n statusText: result.statusText,\n body: errorJSON,\n };\n\n return error;\n};\n\nconst convertToSelfInvokingFunction = (\n fn: UnknownFunction,\n variable: string,\n args: UnknownJSON = {},\n prepend = '',\n): string => {\n const functionString = fn.toString();\n // Create a self-invoking function that takes in the replacement variable, and additional args as the arguments\n const innner = `(${functionString})({ state: {{${variable}}}, args: ${JSON.stringify(args)}, utils: __kizen_utils })`;\n\n // Wrap the function in a closure that includes any prepended code (like registered utils) and returns the result of the function\n const full = `(function() { ${prepend}\\nreturn ${innner}; })()`;\n\n return full;\n};\n\n/*\n * This is the primary class that exposes the public methods available\n * to our custom scripts. It should only be used in the context of a worker\n * script.\n */\nexport class BaseWorkerContext {\n protected user?: PartialUser;\n protected teamMember?: PartialTeamMember;\n protected business?: PartialBusiness;\n protected clientObject?: PartialClientObject | undefined;\n protected appPath?: string;\n protected dataCache: DataCache<unknown> = new Map();\n protected queryOptions = {};\n private api: BaseAPI;\n public postFormData: PostFormDataFn;\n private executionTimer = 0;\n private setupExecutions = 0;\n private cleanupExecutions = 0;\n protected isDebug = false;\n protected scriptBody: string;\n protected internalState: StateChangePayload = { indicator: INDICATOR_TYPE.NONE };\n protected instance: Instance;\n private breakOnException = false;\n public args: Args;\n public communicate: Communicate;\n private shouldPreserve = false;\n private uploadFileHandler: UploadFileFn;\n private internalSessionData: InternalSessionData;\n private pluginComponentId: string | undefined;\n private installThirdPartyScriptHandler: InstallThirdPartyScriptFn;\n private promptHandler: PromptFn;\n private dynamicPromptHandler: DynamicPromptFn;\n private showViewInModalHandler: ShowViewInModalFn;\n private closeModalHandler: CloseModalFn;\n private refreshEntityHandler: RefreshEntityFn;\n private openCreateRecordHandler: OpenCreateRecordFn;\n private openCreateRelatedRecordHandler: OpenCreateRelatedRecordFn;\n private completeSetupHandler: CompleteSetupFn;\n protected runnerType: 'base' | 'floatingFrame' | 'recordDetail';\n public pluginApiName: string;\n public tempPromptState: PromptState = {};\n private partialLocation: PartialLocation;\n\n constructor({\n user,\n teamMember,\n business,\n clientObject,\n appPath,\n isDebug,\n kizenRequest,\n postFormData,\n scriptBody,\n instance,\n args,\n uploadFile,\n sessionData,\n pluginComponentId,\n installThirdPartyScript,\n prompt,\n refreshEntity,\n openCreateRecord,\n openCreateRelatedRecord,\n pluginApiName,\n dynamicPrompt,\n showViewInModal,\n closeModal,\n completeSetup,\n location,\n }: WorkerContextArgs) {\n this.user = user;\n this.teamMember = teamMember;\n this.business = business;\n this.clientObject = clientObject;\n this.partialLocation = location;\n this.appPath = appPath;\n this.isDebug = isDebug ?? false;\n this.api = {\n get: kizenRequest('get'),\n post: kizenRequest('post'),\n put: kizenRequest('put'),\n delete: kizenRequest('delete'),\n patch: kizenRequest('patch'),\n };\n\n this.postFormData = postFormData;\n this.scriptBody = scriptBody;\n this.instance = instance;\n this.communicate = new Communicate(instance);\n this.uploadFileHandler = uploadFile;\n this.internalSessionData = sessionData ?? {};\n this.pluginComponentId = pluginComponentId;\n this.installThirdPartyScriptHandler = installThirdPartyScript;\n this.promptHandler = prompt;\n this.refreshEntityHandler = refreshEntity;\n this.openCreateRecordHandler = openCreateRecord;\n this.openCreateRelatedRecordHandler = openCreateRelatedRecord;\n this.runnerType = 'base';\n this.pluginApiName = pluginApiName;\n this.dynamicPromptHandler = dynamicPrompt;\n this.showViewInModalHandler = showViewInModal;\n this.closeModalHandler = closeModal;\n this.completeSetupHandler = completeSetup;\n\n try {\n this.args = JSON.parse(args ?? '{}') as Args;\n } catch {\n this.args = {} as Args;\n }\n }\n\n public onError(error?: UnknownJSON | Error): void {\n if (this.breakOnException) {\n debugger;\n }\n\n this.instance.postMessage(\n JSON.stringify({\n action: RESPONSES.ERROR,\n error: error?.message,\n }),\n );\n }\n\n set debug(value: boolean) {\n this.isDebug = value;\n this.breakOnException = value;\n }\n\n set preserve(value: boolean) {\n this.shouldPreserve = value;\n }\n\n get preserve(): boolean {\n return this.shouldPreserve;\n }\n\n parseDate(date: string): string[] {\n return date.split('-');\n }\n\n parsePhone(phone: string): string {\n return phone.replace(/\\+/g, '');\n }\n\n openWindow(url: string, target = '_blank', context?: Record<string, unknown>): void {\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.OPEN_WINDOW,\n url,\n target,\n features: 'noopener noreferrer',\n context,\n }),\n );\n }\n\n authorize(\n serviceName?: string,\n config: { successRedirectPath?: string; errorRedirectPath?: string } = {},\n ): void {\n if (!serviceName) {\n throw new Error('Service name is required to authorize');\n }\n\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.AUTHORIZE,\n serviceName,\n config: {\n successRedirectPath:\n config.successRedirectPath ?? `/marketplace/${this.pluginApiName}/auth`,\n errorRedirectPath: config.errorRedirectPath ?? `/marketplace/${this.pluginApiName}/auth`,\n },\n }),\n );\n }\n\n getServiceUrl(serviceName: string, path: string): string {\n if (!serviceName) {\n throw new Error('Service name is required to get a service url');\n }\n\n const base = `/external-integrations/proxy/${this.pluginApiName}/${serviceName}`;\n\n if (path.startsWith('/')) {\n return `${base}${path}`;\n }\n\n return `${base}/${path}`;\n }\n\n get currentBusiness(): PartialBusiness | undefined {\n return this.business;\n }\n\n get applicationPath(): string | undefined {\n return this.appPath;\n }\n\n get currentUser(): CurrentUser {\n return {\n profile: {\n id: this.teamMember?.id ?? '',\n full_name: this.teamMember?.full_name ?? '',\n first_name: this.teamMember?.first_name ?? '',\n last_name: this.teamMember?.last_name ?? '',\n email: this.teamMember?.email ?? '',\n phone: this.teamMember?.phone ?? '',\n created: this.teamMember?.created ?? '',\n crm_client_id: this.user?.crm_client_id ?? '',\n },\n };\n }\n\n get sessionData(): InternalSessionData {\n return this.internalSessionData;\n }\n\n get config(): unknown {\n const hasCustomConfig = Boolean(this.args.__kizen_clean_config);\n\n if (!hasCustomConfig) {\n return {};\n }\n\n const manager = new Proxy(this.args.__kizen_clean_config ?? {}, {\n get: (target, name) => {\n if (Reflect.has(target, name)) {\n return Reflect.get(target, name) as unknown;\n }\n\n return undefined;\n },\n });\n\n return manager;\n }\n\n get location(): PartialLocation {\n return new Proxy(this.partialLocation, {\n get: (target, name) => {\n if (name === 'toJSON') {\n return () => {\n return this.partialLocation;\n };\n }\n\n if (Reflect.has(target, name)) {\n return Reflect.get(target, name) as string;\n }\n\n throw new Error(\n `Property ${String(name)} is not available on location object for plugin apps`,\n );\n },\n });\n }\n\n get userConfig(): unknown {\n const customConfig = this.args.__kizen_user_config?.__kizen_clean_config;\n\n if (!customConfig) {\n return {};\n }\n\n const manager = new Proxy(customConfig, {\n get: (target, name) => {\n if (Reflect.has(target, name)) {\n return Reflect.get(target, name) as unknown;\n }\n\n return undefined;\n },\n });\n\n return manager;\n }\n\n setSessionData(update: UnknownJSON): void {\n if (typeof update !== 'object') {\n throw new Error(`Invalid session update with type ${typeof update}`);\n }\n\n if (Array.isArray(update)) {\n throw new Error(`Invalid session update with type array`);\n }\n\n this.internalSessionData = {\n ...this.internalSessionData,\n ...update,\n };\n\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.UPDATE_SESSION_DATA,\n update,\n }),\n );\n }\n\n async get(url: string, options?: GetOptions): Promise<unknown> {\n try {\n if (this.isRelativeUrl(url)) {\n const cachedResult = this.dataCache.get(url) as GetReturnValue | undefined;\n\n if (cachedResult && !options?.ignoreCache) {\n if (options?.returnErrors) {\n return [cachedResult.data, null];\n }\n\n return cachedResult.data;\n }\n\n const { data } = await this.api.get(url, {\n ...this.queryOptions,\n headers: this.buildHeaders(options?.headers),\n });\n\n this.dataCache.set(url, { ts: Date.now(), data });\n\n if (options?.returnErrors) {\n return [data, null];\n }\n\n return data;\n } else {\n const res = await fetch(url, {\n method: 'GET',\n headers: new Headers(options?.headers),\n credentials: options?.credentials ?? 'same-origin',\n });\n\n if (!res.ok) {\n const err = await buildErrorResponse(res);\n\n throw err;\n }\n\n const json = (await res.json()) as UnknownJSON;\n\n if (options?.returnErrors) {\n return [json, null];\n }\n\n return json;\n }\n } catch (ex) {\n if (options?.returnErrors) {\n return [null, ex];\n } else {\n this.onError(ex as UnknownJSON);\n }\n }\n }\n\n async getWithErrors(\n url: string,\n options?: Omit<GetOptions, 'returnErrors'>,\n ): Promise<RequestWithErrorsResponse> {\n return this.get(url, {\n ...options,\n returnErrors: true,\n }) as Promise<RequestWithErrorsResponse>;\n }\n\n async getUserConfig(): Promise<UnknownJSON> {\n if (!this.args.pluginId || !this.pluginComponentId) {\n throw new Error(\n 'User config is not available for scripts not associated to a plugin or plugin component',\n );\n }\n\n const configResult = (await this.get(`/employee/mine/configs/plugins/${this.args.pluginId}`, {\n ignoreCache: true,\n })) as UserConfig;\n\n return configResult.config?.[this.pluginComponentId] ?? {};\n }\n\n async setUserConfig(config: UnknownJSON): Promise<unknown> {\n if (!this.args.pluginId || !this.pluginComponentId) {\n throw new Error(\n 'User config is not available for scripts not associated to a plugin or plugin component',\n );\n }\n\n const oldConfig = (await this.get(`/employee/mine/configs/plugins/${this.args.pluginId}`, {\n ignoreCache: true,\n })) as UserConfig | undefined;\n\n const mutationResult = await this.post(`/employee/mine/configs/plugins/${this.args.pluginId}`, {\n config: {\n ...oldConfig?.config,\n [this.pluginComponentId]: {\n ...oldConfig?.config?.[this.pluginComponentId],\n ...config,\n },\n },\n });\n\n return mutationResult;\n }\n\n public async completeSetup(payload: UnknownJSON, options?: CompleteSetupOptions): Promise<void> {\n if (!this.pluginApiName) {\n throw new Error('completeSetup is not available for scripts not associated to a plugin');\n }\n\n const candidate: unknown = payload;\n\n if (typeof candidate !== 'object' || candidate === null || Array.isArray(candidate)) {\n throw new Error('completeSetup requires a configuration object');\n }\n\n const prototype: unknown = Object.getPrototypeOf(candidate);\n\n if (prototype !== Object.prototype && prototype !== null) {\n throw new Error('completeSetup requires a plain configuration object');\n }\n\n await this.completeSetupHandler(payload, options);\n }\n\n async patch(url: string, body?: UnknownJSON, options?: RequestOptions): Promise<unknown> {\n try {\n if (this.isRelativeUrl(url)) {\n const { data } = await this.api.patch(url, body, {\n ...this.queryOptions,\n headers: options?.headers,\n });\n\n if (options?.returnErrors) {\n return [data, null];\n }\n\n return data;\n } else {\n const res = await fetch(url, {\n method: 'PATCH',\n body: body ? JSON.stringify(body) : null,\n headers: new Headers(options?.headers),\n credentials: options?.credentials ?? 'same-origin',\n });\n\n if (!res.ok) {\n const err = await buildErrorResponse(res);\n throw err;\n }\n\n const json = (await res.json()) as UnknownJSON;\n\n if (options?.returnErrors) {\n return [json, null];\n }\n\n return json;\n }\n } catch (ex) {\n if (options?.returnErrors) {\n return [null, ex];\n } else {\n this.onError(ex as UnknownJSON);\n }\n }\n }\n\n async patchWithErrors(\n url: string,\n body: UnknownJSON,\n options?: Omit<RequestOptions, 'returnErrors'>,\n ): Promise<RequestWithErrorsResponse> {\n return this.patch(url, body, {\n ...options,\n returnErrors: true,\n }) as Promise<RequestWithErrorsResponse>;\n }\n\n async post(url: string, body?: UnknownJSON, options?: RequestOptions): Promise<unknown> {\n try {\n if (this.isRelativeUrl(url)) {\n const { data } = await this.api.post(url, body, {\n ...this.queryOptions,\n headers: this.buildHeaders(options?.headers),\n });\n\n if (options?.returnErrors) {\n return [data, null];\n }\n\n return data;\n } else {\n const res = await fetch(url, {\n method: 'POST',\n body: body ? JSON.stringify(body) : null,\n headers: new Headers(options?.headers),\n credentials: options?.credentials ?? 'same-origin',\n });\n\n if (!res.ok) {\n const err = await buildErrorResponse(res);\n throw err;\n }\n\n const json = (await res.json()) as UnknownJSON;\n\n if (options?.returnErrors) {\n return [json, null];\n }\n\n return json;\n }\n } catch (ex) {\n if (options?.returnErrors) {\n return [null, ex];\n } else {\n this.onError(ex as UnknownJSON);\n }\n }\n }\n\n async postWithErrors(\n url: string,\n body: UnknownJSON,\n options?: Omit<RequestOptions, 'returnErrors'>,\n ): Promise<RequestWithErrorsResponse> {\n return this.post(url, body, {\n ...options,\n returnErrors: true,\n }) as Promise<RequestWithErrorsResponse>;\n }\n\n async delete(url: string, options?: RequestOptions): Promise<unknown> {\n try {\n if (this.isRelativeUrl(url)) {\n const { data } = await this.api.delete(url, {\n ...this.queryOptions,\n headers: this.buildHeaders(options?.headers),\n });\n\n if (options?.returnErrors) {\n return [data, null];\n }\n\n return data;\n } else {\n const res = await fetch(url, {\n method: 'DELETE',\n headers: new Headers(options?.headers),\n credentials: options?.credentials ?? 'same-origin',\n });\n\n if (!res.ok) {\n const err = await buildErrorResponse(res);\n throw err;\n }\n\n let json: UnknownJSON | null = null;\n\n if (res.status !== 204) {\n json = (await res.json()) as UnknownJSON;\n }\n\n if (options?.returnErrors) {\n return [json, null];\n }\n\n return json;\n }\n } catch (ex) {\n if (options?.returnErrors) {\n return [null, ex];\n } else {\n this.onError(ex as UnknownJSON);\n }\n }\n }\n\n async deleteWithErrors(\n url: string,\n options?: Omit<RequestOptions, 'returnErrors'>,\n ): Promise<RequestWithErrorsResponse> {\n return this.delete(url, {\n ...options,\n returnErrors: true,\n }) as Promise<RequestWithErrorsResponse>;\n }\n\n public async openCreateRecordModal(objectId: string): Promise<unknown> {\n return this.openCreateRecordHandler(objectId);\n }\n\n public async openCreateRelatedRecordModal(\n objectId: string,\n relatedEntityId: string,\n ): Promise<unknown> {\n return this.openCreateRelatedRecordHandler(objectId, relatedEntityId);\n }\n\n public showToast(message: string, toastOptions: ShowToastOptions): void {\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.SHOW_TOAST,\n message,\n toastOptions,\n }),\n );\n }\n\n public clearToasts(): void {\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.CLEAR_TOASTS,\n }),\n );\n }\n\n public outputUI(markup: string, options?: BuildIframeURLWithProxyOptions): void {\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.UI_OUTPUT,\n markup,\n options,\n }),\n );\n }\n\n public runEventScript(scriptName: string, args: UnknownJSON = {}): void {\n if (!scriptName) {\n throw new Error('A script name is required to run an event script');\n }\n\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.RUN_EVENT_SCRIPT,\n scriptName,\n args,\n }),\n );\n }\n\n public prompt(config: ModalConfig): Promise<unknown> {\n return this.promptHandler(config);\n }\n\n public async showViewInModal(\n id: string,\n config?: { args?: UnknownJSON; options?: ShowViewInModalOptions },\n ): Promise<unknown> {\n return this.showViewInModalHandler(id, config);\n }\n\n public closeModal(values?: UnknownJSON, canceled?: boolean): void {\n this.closeModalHandler(values, canceled);\n }\n\n public async dynamicPrompt(_config: DynamicPromptConfig): Promise<unknown> {\n const replacementVar = '__kizen_state';\n\n let prepend = 'const __kizen_utils = {};\\n';\n\n if (_config.registerUtils) {\n const utils = Object.keys(_config.registerUtils);\n prepend += utils\n .map((u) => {\n const body = _config.registerUtils?.[u];\n\n if (typeof body !== 'function') {\n throw new Error(`Registered util ${u} is not a function, got ${typeof body}`);\n }\n\n return `__kizen_utils[\"${u}\"] = (${body.toString()});`;\n })\n .join('\\n');\n }\n\n const configContentResult = _config.content?.map((f) => {\n let optionMapper = '';\n if ('optionMapper' in f) {\n optionMapper = convertToSelfInvokingFunction(\n f.optionMapper,\n replacementVar,\n f.args,\n prepend,\n );\n }\n\n let getFetchUrl = '';\n if ('getFetchUrl' in f) {\n getFetchUrl = convertToSelfInvokingFunction(f.getFetchUrl, replacementVar, f.args, prepend);\n }\n\n let getHeaders = '';\n if ('getHeaders' in f) {\n getHeaders = convertToSelfInvokingFunction(f.getHeaders, replacementVar, f.args, prepend);\n }\n\n let getBody = '';\n if ('getBody' in f) {\n getBody = convertToSelfInvokingFunction(f.getBody, replacementVar, f.args, prepend);\n }\n\n return {\n ...f,\n optionMapper,\n getFetchUrl,\n getHeaders,\n getBody,\n };\n });\n\n const config = {\n ..._config,\n content: configContentResult,\n } as DynamicPromptConfig;\n\n const setupAssistantConfig = {\n fields: config.content,\n };\n\n const result = await this.dynamicPromptHandler(config);\n\n const cleanConfigValue = cleanConfig(setupAssistantConfig, result.values);\n\n return {\n ...result,\n values: cleanConfigValue,\n };\n }\n\n public outputIframe(\n url: string,\n allow?: string[],\n sandbox?: string[],\n options?: BuildIframeURLWithProxyOptions,\n ): void {\n const { url: formattedUrl, isUsingProxy } = buildIframeURLWithProxy(\n url,\n options,\n allow?.join('; '),\n );\n\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.IFRAME_OUTPUT,\n url: formattedUrl,\n name: this.pluginApiName,\n allow,\n sandbox,\n preserve: this.preserve,\n isUsingProxy,\n }),\n );\n }\n\n private getBase64EncodedBlob(data: Blob): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n\n reader.readAsDataURL(data);\n\n reader.onload = () => {\n resolve(reader.result as string);\n };\n\n reader.onerror = (error) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n reject(error);\n };\n });\n }\n\n public async uploadFile(data: Blob, fileName?: string, isPublic = false): Promise<unknown> {\n const encoded = await this.getBase64EncodedBlob(data);\n const res = await this.uploadFileHandler({\n file: encoded,\n fileName: fileName ?? 'file_' + String(Date.now()),\n isPublic,\n });\n\n return res;\n }\n\n protected afterSetup(): void {\n /* empty */\n }\n\n protected __setup(): void {\n if (this.setupExecutions !== 0) {\n throw new Error(\n 'Setup must be called exactly once, and should never be called by a script directly.',\n );\n }\n\n if (this.cleanupExecutions !== 0) {\n throw new Error('Setup was called after cleanup');\n }\n\n if (this.isDebug) {\n this.console.log(`Running script:\\n\\n${this.scriptBody}`);\n }\n\n this.setupExecutions++;\n this.executionTimer = performance.now();\n\n this.afterSetup();\n }\n\n protected __cleanup(result?: unknown): void {\n if (this.cleanupExecutions !== 0) {\n throw new Error(\n 'Cleanup must be called exactly once, and should never be called by a script directly.',\n );\n }\n\n if (this.setupExecutions !== 1) {\n throw new Error('Cleanup was called before setup');\n }\n\n this.cleanupExecutions++;\n this.setIndicator(INDICATOR_TYPE.NONE);\n const end = performance.now();\n if (this.isDebug) {\n this.console.log(`Script execution took ${String(end - this.executionTimer)}ms`);\n }\n\n this.done(this.preserve, result);\n }\n\n setIndicator(indicator: StateChangePayload['indicator'] = INDICATOR_TYPE.NONE): void {\n this.internalState.indicator = indicator;\n\n this.setState({ indicator });\n }\n\n wait(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private done(preserve: boolean, result?: unknown): void {\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.DONE,\n result,\n preserve,\n }),\n );\n }\n\n private setState(state: unknown): void {\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.SETSTATE,\n state,\n }),\n );\n }\n\n protected isRelativeUrl(url: string): boolean {\n return url.startsWith('/');\n }\n\n private buildHeaders(headers: Record<string, string> = {}): Record<string, string> {\n return {\n ...headers,\n 'X-Request-Type': 'kizen-ui-scripting-api',\n };\n }\n\n public refreshTimelineForId(id?: string): void {\n if (id) {\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.REFRESH_TIMELINE,\n entityId: id,\n }),\n );\n }\n }\n\n public refreshEntityForId(id?: string): unknown {\n if (id) {\n return this.refreshEntityHandler(id);\n }\n }\n\n public async installThirdPartyScript(scriptUrl: string): Promise<ThirdPartyScript | undefined> {\n try {\n const result = await this.installThirdPartyScriptHandler(scriptUrl, this.args);\n const manager = new ThirdPartyScript(this.instance, result.url);\n\n return manager;\n } catch {\n this.onError(new Error(`Third party script ${scriptUrl} could not be installed.`));\n }\n }\n\n public releaseBlockingScript(): void {\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.RELEASE_BLOCKING_SCRIPT,\n }),\n );\n }\n\n public copyToClipboard(text: string): void {\n this.instance.postMessage(\n JSON.stringify({\n action: ACTIONS.COPY_TO_CLIPBOARD,\n text,\n }),\n );\n }\n\n public createDateObject(dateString: string): Date {\n if (typeof dateString !== 'string') {\n throw new Error(`Invalid date string ${String(dateString)}`);\n }\n\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(dateString)) {\n throw new Error(`Date string ${dateString} is not in the format YYYY-MM-DD`);\n }\n\n const parts = dateString.split('-').map((part) => parseInt(part, 10));\n\n if (parts.length < 3) {\n throw new Error(`Date string ${dateString} could not be parsed into valid date parts`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const dateObj = new Date(parts[0]!, parts[1]! - 1, parts[2]);\n\n return dateObj;\n }\n\n public formatDateForResponse(date: Date): number {\n return date.getTime();\n }\n\n get console(): ConsoleBridge {\n const supported = new Set(['log', 'warn', 'error', 'info', 'debug']);\n return new Proxy({} as ConsoleBridge, {\n get: (_, prop) => {\n const level = supported.has(String(prop)) ? String(prop) : 'log';\n return (...args: unknown[]) => {\n try {\n const serializedArgs = args.map((arg) => {\n try {\n return serializeConsoleArg(arg);\n } catch {\n return null;\n }\n });\n let payload: string;\n try {\n payload = JSON.stringify({\n action: ACTIONS.CONSOLE_LOG,\n level,\n args: serializedArgs,\n });\n } catch {\n payload = JSON.stringify({\n action: ACTIONS.CONSOLE_LOG,\n level,\n args: ['[unserializable log payload]'],\n });\n }\n this.instance.postMessage(payload);\n } catch {\n /* never crash plugin code from logging */\n }\n };\n },\n });\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { ACTIONS, RESPONSES } from './chunk-5NF4DYQJ.js';
1
+ import { ACTIONS, RESPONSES } from './chunk-5BBUKTOE.js';
2
2
 
3
3
  // src/util/console.ts
4
4
  var UNSERIALIZABLE = (reason) => ({
@@ -681,5 +681,5 @@ var getParentFrameAllowParam = () => {
681
681
  };
682
682
 
683
683
  export { KizenRequestError, buildIframeURLWithProxy, cleanConfig, closeModalHandler, completeSetupHandler, deserializeConsoleArg, dynamicPromptHandler, filterAllowList, filterSandboxList, getActionContainerKey, getActionFieldKey, getActionMenuFieldKey, getActionMenuHeadingKey, getAllNestedInputsFromConfig, getFieldFromAction, getParentFrameAllowParam, handleCommonResponse, installThirdPartyScriptHandler, isActionFieldKey, isActionMenuFieldKey, kizenRequestHandler, openCreateRecordHandler, openCreateRelatedRecordHandler, postFormDataHandler, promptHandler, refreshEntityHandler, serializeConsoleArg, showViewInModalHandler, splitActionFieldKey, splitActionMenuFieldKey, unwrapProxyMessage, uploadFileHandler };
684
- //# sourceMappingURL=chunk-4DK3CMXY.js.map
685
- //# sourceMappingURL=chunk-4DK3CMXY.js.map
684
+ //# sourceMappingURL=chunk-2V75NG3U.js.map
685
+ //# sourceMappingURL=chunk-2V75NG3U.js.map