@firecms/collection_editor 3.0.0-canary.2 → 3.0.0-canary.21

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 (28) hide show
  1. package/dist/index.es.js +390 -397
  2. package/dist/index.es.js.map +1 -1
  3. package/dist/index.umd.js +2 -2
  4. package/dist/index.umd.js.map +1 -1
  5. package/dist/types/persisted_collection.d.ts +1 -1
  6. package/dist/ui/collection_editor/CollectionEditorDialog.d.ts +1 -1
  7. package/dist/ui/collection_editor/utils/supported_fields.d.ts +2 -2
  8. package/package.json +18 -18
  9. package/src/ConfigControllerProvider.tsx +1 -1
  10. package/src/types/persisted_collection.ts +1 -1
  11. package/src/ui/MissingReferenceWidget.tsx +2 -1
  12. package/src/ui/NewCollectionButton.tsx +12 -10
  13. package/src/ui/collection_editor/CollectionDetailsForm.tsx +17 -18
  14. package/src/ui/collection_editor/CollectionEditorDialog.tsx +13 -9
  15. package/src/ui/collection_editor/CollectionEditorWelcomeView.tsx +1 -1
  16. package/src/ui/collection_editor/CollectionPropertiesEditorForm.tsx +1 -1
  17. package/src/ui/collection_editor/EnumForm.tsx +3 -4
  18. package/src/ui/collection_editor/PropertyEditView.tsx +4 -4
  19. package/src/ui/collection_editor/import/CollectionEditorImportMapping.tsx +1 -1
  20. package/src/ui/collection_editor/properties/CommonPropertyFields.tsx +7 -8
  21. package/src/ui/collection_editor/properties/DateTimePropertyField.tsx +7 -8
  22. package/src/ui/collection_editor/properties/MapPropertyField.tsx +3 -4
  23. package/src/ui/collection_editor/properties/ReferencePropertyField.tsx +3 -4
  24. package/src/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +3 -4
  25. package/src/ui/collection_editor/utils/supported_fields.tsx +3 -3
  26. package/src/useCollectionEditorPlugin.tsx +2 -4
  27. package/dist/ui/collection_editor/properties/FieldHelperView.d.ts +0 -4
  28. package/src/ui/collection_editor/properties/FieldHelperView.tsx +0 -13
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/ui/collection_editor/CollectionYupValidation.tsx","../src/ui/collection_editor/properties/FieldHelperView.tsx","../src/ui/collection_editor/CollectionDetailsForm.tsx","../src/ui/collection_editor/util.ts","../src/ui/collection_editor/EnumForm.tsx","../src/ui/collection_editor/SwitchControl.tsx","../src/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx","../src/ui/collection_editor/properties/validation/StringPropertyValidation.tsx","../src/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx","../src/ui/collection_editor/properties/validation/ValidationPanel.tsx","../src/ui/collection_editor/properties/EnumPropertyField.tsx","../src/ui/collection_editor/properties/StoragePropertyField.tsx","../src/utils/entities.ts","../src/ui/collection_editor/PropertyFieldPreview.tsx","../src/ui/collection_editor/PropertyTree.tsx","../src/ui/collection_editor/properties/MapPropertyField.tsx","../src/ui/collection_editor/properties/RepeatPropertyField.tsx","../src/ui/collection_editor/properties/CommonPropertyFields.tsx","../src/ui/collection_editor/properties/StringPropertyField.tsx","../src/ui/collection_editor/properties/BooleanPropertyField.tsx","../src/ui/collection_editor/properties/BlockPropertyField.tsx","../src/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx","../src/ui/collection_editor/properties/NumberPropertyField.tsx","../src/ui/collection_editor/properties/ReferencePropertyField.tsx","../src/ui/collection_editor/properties/DateTimePropertyField.tsx","../src/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx","../src/ui/collection_editor/properties/KeyValuePropertyField.tsx","../src/ui/collection_editor/utils/update_property_for_widget.ts","../src/ui/collection_editor/PropertySelectItem.tsx","../src/ui/collection_editor/properties/UrlPropertyField.tsx","../src/ui/collection_editor/utils/supported_fields.tsx","../src/ui/collection_editor/PropertyEditView.tsx","../src/ui/collection_editor/utils/strings.ts","../src/ui/collection_editor/GetCodeDialog.tsx","../src/ui/collection_editor/CollectionPropertiesEditorForm.tsx","../src/ui/collection_editor/UnsavedChangesDialog.tsx","../src/ui/collection_editor/EntityCustomViewsSelectDialog.tsx","../src/ui/collection_editor/SubcollectionsEditTab.tsx","../src/ui/collection_editor/templates/products_template.ts","../src/ui/collection_editor/templates/blog_template.ts","../src/ui/collection_editor/templates/users_template.ts","../src/ui/collection_editor/templates/pages_template.ts","../src/ui/collection_editor/CollectionEditorWelcomeView.tsx","../src/ui/collection_editor/import/CollectionEditorImportMapping.tsx","../src/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx","../src/ui/collection_editor/import/clean_import_data.ts","../src/ui/collection_editor/CollectionEditorDialog.tsx","../src/ConfigControllerProvider.tsx","../src/useCollectionEditorController.tsx","../src/useCollectionsConfigController.tsx","../src/ui/EditorCollectionAction.tsx","../src/ui/HomePageEditorCollectionAction.tsx","../src/ui/NewCollectionCard.tsx","../src/ui/RootCollectionSuggestions.tsx","../src/ui/CollectionViewHeaderAction.tsx","../src/ui/PropertyAddColumnComponent.tsx","../src/ui/NewCollectionButton.tsx","../src/useCollectionEditorPlugin.tsx","../src/ui/MissingReferenceWidget.tsx"],"sourcesContent":["import * as Yup from \"yup\";\n\nexport const YupSchema = Yup.object().shape({\n id: Yup.string().required(\"Required\"),\n name: Yup.string().required(\"Required\"),\n path: Yup.string().required(\"Required\")\n});\n","import { Typography } from \"@firecms/ui\";\n\nexport function FieldHelperView({\n error,\n children\n }: { error?: boolean, children?: React.ReactNode }) {\n if (!children) return null;\n return (\n <Typography variant={\"caption\"} color={error ? \"error\" : \"secondary\"} className={\"ml-3.5 mt-0.5\"}>\n {children}\n </Typography>\n );\n}\n","import React, { useEffect, useState } from \"react\";\nimport { EntityCollection, IconForView, SearchIconsView, singular, toSnakeCase, } from \"@firecms/core\";\nimport {\n Autocomplete,\n AutocompleteItem,\n BooleanSwitchWithLabel,\n Chip,\n cn,\n Container,\n DebouncedTextField,\n Dialog,\n ExpandablePanel,\n IconButton,\n Select,\n SelectItem,\n SettingsIcon,\n TextField,\n Tooltip,\n Typography,\n useAutoComplete\n} from \"@firecms/ui\";\n\nimport { FieldHelperView } from \"./properties/FieldHelperView\";\nimport { Field, getIn, useFormex } from \"@firecms/formex\";\n\nexport function CollectionDetailsForm({\n isNewCollection,\n reservedGroups,\n existingPaths,\n existingIds,\n groups,\n parentCollection\n }: {\n isNewCollection: boolean,\n reservedGroups?: string[];\n existingPaths?: string[];\n existingIds?: string[];\n groups: string[] | null;\n parentCollection?: EntityCollection;\n parentCollectionIds?: string[];\n}) {\n\n const groupRef = React.useRef<HTMLInputElement>(null);\n const {\n values,\n setFieldValue,\n handleChange,\n touched,\n errors,\n setFieldTouched,\n isSubmitting,\n submitCount\n } = useFormex<EntityCollection>();\n\n const [iconDialogOpen, setIconDialogOpen] = useState(false);\n const [advancedPanelExpanded, setAdvancedPanelExpanded] = useState(false);\n\n const updateName = (name: string) => {\n setFieldValue(\"name\", name);\n\n const pathTouched = getIn(touched, \"path\");\n if (!pathTouched && isNewCollection && name) {\n setFieldValue(\"path\", toSnakeCase(name));\n }\n\n const idTouched = getIn(touched, \"id\");\n if (!idTouched && isNewCollection && name) {\n setFieldValue(\"id\", toSnakeCase(name));\n }\n\n const singularNameTouched = getIn(touched, \"singularName\");\n if (!singularNameTouched && isNewCollection && name) {\n setFieldValue(\"singularName\", singular(name));\n }\n\n };\n\n useEffect(() => {\n if (errors.id) {\n setAdvancedPanelExpanded(true);\n }\n }, [errors.id]);\n\n const collectionIcon = <IconForView collectionOrView={values}/>;\n\n const groupOptions = groups?.filter((group) => !reservedGroups?.includes(group));\n\n const {\n inputFocused,\n autoCompleteOpen,\n setAutoCompleteOpen\n } = useAutoComplete({\n ref: groupRef\n });\n\n const isSubcollection = !!parentCollection;\n\n let customIdValue: \"true\" | \"false\" | \"optional\" | \"code_defined\" | undefined;\n if (typeof values.customId === \"object\") {\n customIdValue = \"code_defined\";\n } else if (values.customId === true) {\n customIdValue = \"true\";\n } else if (values.customId === false) {\n customIdValue = \"false\";\n } else if (values.customId === \"optional\") {\n customIdValue = \"optional\";\n }\n\n const showErrors = submitCount > 0;\n return (\n <div className={\"overflow-auto my-auto\"}>\n <Container maxWidth={\"4xl\"} className={\"flex flex-col gap-4 p-8 m-auto\"}>\n\n <div>\n <div\n className=\"flex flex-row py-2 pt-3 items-center\">\n <Typography variant={!isNewCollection ? \"h5\" : \"h4\"} className={\"flex-grow\"}>\n {isNewCollection ? \"New collection\" : `${values?.name} collection`}\n </Typography>\n <Tooltip title={\"Change icon\"}>\n <IconButton\n shape={\"square\"}\n onClick={() => setIconDialogOpen(true)}>\n {collectionIcon}\n </IconButton>\n </Tooltip>\n </div>\n\n {parentCollection && <Chip colorScheme={\"tealDarker\"}>\n <Typography variant={\"caption\"}>\n This is a subcollection of <b>{parentCollection.name}</b>\n </Typography>\n </Chip>}\n\n </div>\n <div className={\"grid grid-cols-12 gap-4\"}>\n\n <div className={\"col-span-12\"}>\n <TextField\n value={values.name ?? \"\"}\n onChange={(e: any) => updateName(e.target.value)}\n label={\"Name\"}\n required\n error={showErrors && Boolean(errors.name)}/>\n <FieldHelperView error={touched.name && Boolean(errors.name)}>\n {touched.name && Boolean(errors.name) ? errors.name : \"Name of in this collection, usually a plural name (e.g. Products)\"}\n </FieldHelperView>\n </div>\n\n <div className={cn(\"col-span-12 \", isSubcollection ? \"\" : \"sm:col-span-8\")}>\n <Field name={\"path\"}\n as={DebouncedTextField}\n label={\"Path\"}\n disabled={!isNewCollection}\n required\n error={showErrors && Boolean(errors.path)}/>\n\n <FieldHelperView error={touched.path && Boolean(errors.path)}>\n {touched.path && Boolean(errors.path)\n ? errors.path\n : isSubcollection ? \"Relative path to the parent (no need to include the parent path)\" : \"Path that this collection is stored in, in the database\"}\n </FieldHelperView>\n\n </div>\n\n {!isSubcollection && <div className={\"col-span-12 sm:col-span-4 relative\"}>\n\n <TextField error={showErrors && Boolean(errors.group)}\n disabled={isSubmitting}\n value={values.group ?? \"\"}\n autoComplete=\"off\"\n onChange={(event) => setFieldValue(\"group\", event.target.value)}\n name={\"group\"}\n inputRef={groupRef}\n label=\"Group\"/>\n <Autocomplete\n open={autoCompleteOpen && (groupOptions ?? []).length > 0}\n setOpen={setAutoCompleteOpen}>\n {groupOptions?.map((group, index) => {\n return <AutocompleteItem\n key={index + \"_\" + group}\n onClick={() => {\n setAutoCompleteOpen(false);\n setFieldValue(\"group\", group ?? null);\n }}\n >\n <div className={\"flex-grow\"}>\n {group}\n </div>\n </AutocompleteItem>;\n })}\n </Autocomplete>\n <FieldHelperView>\n {showErrors && Boolean(errors.group) ? errors.group : \"Group of the collection\"}\n </FieldHelperView>\n </div>}\n\n <div className={\"col-span-12\"}>\n <ExpandablePanel\n expanded={advancedPanelExpanded}\n onExpandedChange={setAdvancedPanelExpanded}\n title={\n <div className=\"flex flex-row text-gray-500\">\n <SettingsIcon/>\n <Typography variant={\"subtitle2\"}\n className=\"ml-2\">\n Advanced\n </Typography>\n </div>}\n initiallyExpanded={false}>\n <div className={\"grid grid-cols-12 gap-4 p-4\"}>\n\n <div className={\"col-span-12\"}>\n <Field name={\"id\"}\n as={DebouncedTextField}\n disabled={!isNewCollection}\n label={\"Collection id\"}\n error={showErrors && Boolean(errors.id)}/>\n <FieldHelperView error={touched.id && Boolean(errors.id)}>\n {touched.id && Boolean(errors.id) ? errors.id : \"This id identifies this collection\"}\n </FieldHelperView>\n </div>\n\n <div className={\"col-span-12\"}>\n <TextField\n error={showErrors && Boolean(errors.singularName)}\n name={\"singularName\"}\n aria-describedby={\"singularName-helper\"}\n onChange={(e) => {\n setFieldTouched(\"singularName\", true);\n return handleChange(e);\n }}\n value={values.singularName ?? \"\"}\n label={\"Singular name\"}/>\n <FieldHelperView error={showErrors && Boolean(errors.singularName)}>\n {showErrors && Boolean(errors.singularName) ? errors.singularName : \"Optionally define a singular name for your entities\"}\n </FieldHelperView>\n </div>\n <div className={\"col-span-12\"}>\n <TextField\n error={showErrors && Boolean(errors.description)}\n name=\"description\"\n value={values.description ?? \"\"}\n onChange={handleChange}\n multiline\n rows={2}\n aria-describedby=\"description-helper-text\"\n label=\"Description\"\n />\n <FieldHelperView error={showErrors && Boolean(errors.description)}>\n {showErrors && Boolean(errors.description) ? errors.description : \"Description of the collection, you can use markdown\"}\n </FieldHelperView>\n </div>\n\n <div className={\"col-span-12\"}>\n <Select\n name=\"defaultSize\"\n label=\"Default row size\"\n position={\"item-aligned\"}\n onChange={handleChange}\n value={values.defaultSize ?? \"\"}\n renderValue={(value: any) => value.toUpperCase()}\n >\n {[\"xs\", \"s\", \"m\", \"l\", \"xl\"].map((value) => (\n <SelectItem\n key={`size-select-${value}`}\n value={value}>\n {value.toUpperCase()}\n </SelectItem>\n ))}\n </Select>\n </div>\n <div className={\"col-span-12\"}>\n <Select\n name=\"customId\"\n label=\"Data IDs generation\"\n position={\"item-aligned\"}\n disabled={customIdValue === \"code_defined\"}\n onValueChange={(v) => {\n if (v === \"code_defined\")\n throw new Error(\"This should not happen\");\n else if (v === \"true\")\n setFieldValue(\"customId\", true);\n else if (v === \"false\")\n setFieldValue(\"customId\", false);\n else if (v === \"optional\")\n setFieldValue(\"customId\", \"optional\");\n }}\n value={customIdValue ?? \"\"}\n renderValue={(value: any) => {\n if (value === \"code_defined\")\n return \"Code defined\";\n else if (value === \"true\")\n return \"Users must define an ID\";\n else if (value === \"optional\")\n return \"Users can define an ID, but it is not required\";\n else\n return \"Document ID is generated automatically\";\n }}\n >\n <SelectItem value={\"false\"}>\n Document ID is generated automatically\n </SelectItem>\n <SelectItem value={\"true\"}>\n Users must define an ID\n </SelectItem>\n <SelectItem value={\"optional\"}>\n Users can define an ID, but it is not required\n </SelectItem>\n </Select>\n </div>\n <div className={\"col-span-12\"}>\n <BooleanSwitchWithLabel\n position={\"start\"}\n label=\"Collection group\"\n onValueChange={(v) => setFieldValue(\"collectionGroup\", v)}\n value={values.collectionGroup ?? false}\n />\n <FieldHelperView>\n A collection group consists of all collections with the same path. This allows\n you\n to query over multiple collections at once.\n </FieldHelperView>\n </div>\n <div className={\"col-span-12\"}>\n <BooleanSwitchWithLabel\n position={\"start\"}\n label=\"Enable text search for this collection\"\n onValueChange={(v) => setFieldValue(\"textSearchEnabled\", v)}\n value={values.textSearchEnabled ?? false}\n />\n <FieldHelperView>\n Allow text search for this collection. If you have not specified a text search\n delegate, this will use the built-in local text search. This is not recommended\n for large collections, as it may incur in performance and cost issues.\n </FieldHelperView>\n </div>\n </div>\n </ExpandablePanel>\n\n </div>\n\n </div>\n\n <div style={{ height: \"52px\" }}/>\n\n <Dialog\n open={iconDialogOpen}\n onOpenChange={setIconDialogOpen}\n maxWidth={\"xl\"}\n fullWidth\n >\n <div className={\"p-4 overflow-auto min-h-[200px]\"}>\n <SearchIconsView selectedIcon={values.icon}\n onIconSelected={(icon: string) => {\n setIconDialogOpen(false);\n setFieldValue(\"icon\", icon);\n }}/>\n </div>\n\n </Dialog>\n\n </Container>\n </div>\n );\n}\n","export function idToPropertiesPath(id: string): string {\n return \"properties.\" + id.replaceAll(\".\", \".properties.\");\n}\n\nexport function namespaceToPropertiesPath(namespace?: string): string {\n return namespace\n ? \"properties.\" + namespace.replaceAll(\".\", \".properties.\") + \".properties\"\n : \"properties\";\n}\n\nexport function namespaceToPropertiesOrderPath(namespace?: string): string {\n return namespace\n ? \"properties.\" + namespace.replaceAll(\".\", \".properties.\") + \".propertiesOrder\"\n : \"propertiesOrder\";\n}\n\nexport function getFullId(propertyKey: string, propertyNamespace?: string): string {\n return propertyNamespace\n ? `${propertyNamespace}.${propertyKey}`\n : propertyKey;\n}\n\nexport function getFullIdPath(propertyKey: string, propertyNamespace?: string): string {\n const keyWithNamespace = propertyNamespace\n ? `${propertyNamespace}.${propertyKey}`\n : propertyKey;\n return idToPropertiesPath(keyWithNamespace);\n}\n","import React, { useEffect } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { ArrayContainer, EnumValueConfig, EnumValues, } from \"@firecms/core\";\nimport {\n AutoAwesomeIcon,\n Badge,\n Button,\n CircularProgress,\n DebouncedTextField,\n Dialog,\n DialogActions,\n DialogContent,\n IconButton,\n ListIcon,\n Paper,\n SettingsIcon,\n Typography\n} from \"@firecms/ui\";\nimport { FieldHelperView } from \"./properties/FieldHelperView\";\nimport { extractEnumFromValues } from \"@firecms/schema_inference\";\nimport { Field, Formex, getIn, useCreateFormex, useFormex } from \"@firecms/formex\";\n\ntype EnumFormProps = {\n enumValues: EnumValueConfig[];\n onValuesChanged?: (enumValues: EnumValueConfig[]) => void;\n onError?: (error: boolean) => void;\n updateIds: boolean;\n disabled: boolean;\n allowDataInference?: boolean;\n getData?: () => Promise<string[]>;\n};\n\nexport function EnumForm({\n enumValues,\n onValuesChanged,\n onError,\n updateIds,\n disabled,\n allowDataInference,\n getData\n }: EnumFormProps) {\n\n const formex = useCreateFormex<{\n enumValues: EnumValueConfig[]\n }>({\n initialValues: { enumValues },\n validateOnChange: true,\n validation: (values) => {\n const errors: any = {};\n if (values.enumValues) {\n values.enumValues.forEach((enumValue, index) => {\n if (!enumValue?.label) {\n errors.enumValues = errors.enumValues ?? [];\n errors.enumValues[index] = errors.enumValues[index] ?? {};\n errors.enumValues[index].label = \"You must specify a label for this enum value entry\";\n }\n if (!enumValue?.id) {\n errors.enumValues = errors.enumValues ?? [];\n errors.enumValues[index] = errors.enumValues[index] ?? {};\n errors.enumValues[index].id = \"You must specify an ID for this enum value entry\";\n }\n });\n }\n const hasError = Boolean(errors?.enumValues && Object.keys(errors?.enumValues).length > 0);\n onError?.(hasError);\n return errors;\n }\n });\n\n const { values, errors } = formex;\n\n useEffect(() => {\n if (onValuesChanged) {\n onValuesChanged(values.enumValues);\n }\n }, [values.enumValues]);\n\n return <Formex value={formex}>\n <EnumFormFields enumValuesPath={\"enumValues\"}\n values={values}\n errors={errors}\n shouldUpdateId={updateIds}\n disabled={disabled}\n allowDataInference={allowDataInference}\n getData={getData}/>\n </Formex>\n\n}\n\ntype EnumFormFieldsProps = {\n values: {\n enumValues: EnumValueConfig[]\n };\n errors: any;\n enumValuesPath: string;\n shouldUpdateId: boolean;\n disabled: boolean;\n getData?: () => Promise<string[]>;\n allowDataInference?: boolean;\n};\n\n// const EnumFormFields = React.memo(\nfunction EnumFormFields({\n values,\n errors,\n disabled,\n enumValuesPath,\n shouldUpdateId,\n allowDataInference,\n getData,\n }: EnumFormFieldsProps) {\n\n const {\n setFieldValue\n } = useFormex();\n\n const [lastInternalIdAdded, setLastInternalIdAdded] = React.useState<number | undefined>();\n const [editDialogIndex, setEditDialogIndex] = React.useState<number | undefined>();\n const [inferring, setInferring] = React.useState(false);\n\n const inferredValuesRef = React.useRef(new Set());\n const inferredValues = inferredValuesRef.current;\n\n const buildEntry = (index: number, internalId: number) => {\n const justAdded = lastInternalIdAdded === internalId;\n const entryError = errors?.enumValues && errors?.enumValues[index];\n return <EnumEntry index={index}\n disabled={disabled}\n enumValuesPath={enumValuesPath}\n autoFocus={justAdded}\n entryError={entryError}\n shouldUpdateId={shouldUpdateId || justAdded}\n onDialogOpen={() => setEditDialogIndex(index)}\n inferredEntry={inferredValues.has(values.enumValues[index]?.id as string)}\n key={`${internalId}`}/>;\n };\n\n const inferValues = async () => {\n if (!getData)\n return;\n setInferring(true);\n getData?.().then((data) => {\n if (!data)\n return;\n\n const flatData = data.flat();\n\n const fieldData = Array.from(new Set(flatData));\n\n const currentEnumValues = values.enumValues;\n const foundEnumValues = extractEnumFromValues(fieldData);\n\n // add only new enum values\n const newEnumValues = foundEnumValues.filter((enumValue) => {\n return !currentEnumValues?.some((v: any) => v.id === enumValue.id);\n });\n\n newEnumValues.forEach((enumValue) => {\n inferredValues.add(enumValue.id);\n });\n setFieldValue(enumValuesPath, [...newEnumValues, ...currentEnumValues], true);\n }).catch(e => {\n console.error(e);\n })\n .finally(() => setInferring(false));\n }\n\n return (\n <div className={\"col-span-12\"}>\n <div className=\"ml-3.5 flex flex-row items-center\">\n <ListIcon/>\n <Typography variant={\"subtitle2\"}\n className=\"ml-2 grow\">\n Values\n </Typography>\n {allowDataInference &&\n <Button loading={inferring}\n disabled={disabled || inferring}\n variant={\"text\"}\n size={\"small\"}\n onClick={inferValues}>\n {inferring ? <CircularProgress size={\"small\"}/> : <AutoAwesomeIcon/>}\n Infer values from data\n </Button>}\n </div>\n\n <Paper className=\"p-4 m-1\">\n\n <ArrayContainer droppableId={enumValuesPath}\n addLabel={\"Add enum value\"}\n value={values.enumValues}\n disabled={disabled}\n size={\"small\"}\n buildEntry={buildEntry}\n onInternalIdAdded={setLastInternalIdAdded}\n includeAddButton={true}\n onValueChange={(value) => setFieldValue(enumValuesPath, value)}\n newDefaultEntry={{ id: \"\", label: \"\" }}/>\n\n <EnumEntryDialog index={editDialogIndex}\n open={editDialogIndex !== undefined}\n enumValuesPath={enumValuesPath}\n onClose={() => setEditDialogIndex(undefined)}/>\n </Paper>\n </div>\n );\n}\n\ntype EnumEntryProps = {\n index: number,\n enumValuesPath: string,\n shouldUpdateId: boolean,\n autoFocus: boolean,\n onDialogOpen: () => void;\n disabled: boolean;\n inferredEntry?: boolean;\n entryError?: { label?: string, id?: string }\n};\n\nconst EnumEntry = React.memo(\n function EnumEntryInternal({\n index,\n shouldUpdateId: updateId,\n enumValuesPath,\n autoFocus,\n onDialogOpen,\n disabled,\n inferredEntry,\n entryError\n }: EnumEntryProps) {\n\n const {\n values,\n handleChange,\n errors,\n setFieldValue,\n touched\n } = useFormex<EnumValues>();\n\n const shouldUpdateIdRef = React.useRef(!getIn(values, `${enumValuesPath}[${index}].id`));\n const shouldUpdateId = updateId || shouldUpdateIdRef.current;\n\n const idValue = getIn(values, `${enumValuesPath}[${index}].id`);\n const labelValue = getIn(values, `${enumValuesPath}[${index}].label`);\n\n const currentLabelRef = React.useRef(labelValue);\n\n React.useEffect(() => {\n if ((currentLabelRef.current === idValue || !idValue) && shouldUpdateId) {\n setFieldValue(`${enumValuesPath}[${index}].id`, labelValue);\n }\n currentLabelRef.current = labelValue;\n }, [labelValue]);\n\n return (\n <>\n <div className={\"flex w-full align-center justify-center\"}>\n <Field name={`${enumValuesPath}[${index}].label`}\n as={DebouncedTextField}\n className={\"flex-grow\"}\n required\n disabled={disabled}\n size=\"small\"\n autoFocus={autoFocus}\n autoComplete=\"off\"\n endAdornment={inferredEntry && <AutoAwesomeIcon size={\"small\"}/>}\n error={Boolean(entryError?.label)}/>\n\n {!disabled &&\n <Badge color={\"error\"} invisible={!entryError?.id}>\n <IconButton\n size=\"small\"\n aria-label=\"edit\"\n className={\"m-1\"}\n onClick={() => onDialogOpen()}>\n <SettingsIcon size={\"small\"}/>\n </IconButton>\n </Badge>}\n\n </div>\n\n {entryError?.label && <Typography variant={\"caption\"}\n className={\"ml-3.5 text-red-500 dark:text-red-500\"}>\n {entryError?.label}\n </Typography>}\n\n {entryError?.id && <Typography variant={\"caption\"}\n className={\"ml-3.5 text-red-500 dark:text-red-500\"}>\n {entryError?.id}\n </Typography>}\n\n </>);\n },\n function areEqual(prevProps: EnumEntryProps, nextProps: EnumEntryProps) {\n return prevProps.index === nextProps.index &&\n prevProps.enumValuesPath === nextProps.enumValuesPath &&\n prevProps.shouldUpdateId === nextProps.shouldUpdateId &&\n prevProps.inferredEntry === nextProps.inferredEntry &&\n equal(prevProps.entryError, nextProps.entryError) &&\n prevProps.autoFocus === nextProps.autoFocus;\n }\n);\n\nfunction EnumEntryDialog({\n index,\n open,\n onClose,\n enumValuesPath\n }: {\n index?: number;\n open: boolean;\n enumValuesPath: string;\n onClose: () => void;\n}) {\n\n const {\n errors,\n } = useFormex<EnumValues>();\n\n const idError = index !== undefined ? getIn(errors, `${enumValuesPath}[${index}].id`) : undefined;\n return <Dialog\n maxWidth=\"md\"\n aria-labelledby=\"enum-edit-dialog\"\n open={open}\n onOpenChange={(open) => !open ? onClose() : undefined}\n >\n\n <DialogContent>\n {index !== undefined &&\n <div>\n <Field name={`${enumValuesPath}[${index}].id`}\n as={DebouncedTextField}\n required\n label={\"ID\"}\n size=\"small\"\n autoComplete=\"off\"\n error={Boolean(idError)}/>\n\n <FieldHelperView error={Boolean(idError)}>\n {idError ?? \"Value saved in the data source\"}\n </FieldHelperView>\n </div>}\n </DialogContent>\n\n <DialogActions>\n <Button\n autoFocus\n variant=\"outlined\"\n onClick={onClose}\n color=\"primary\">\n Ok\n </Button>\n </DialogActions>\n\n </Dialog>\n}\n\n","import React from \"react\";\n\nimport { BooleanSwitchWithLabel, Tooltip } from \"@firecms/ui\";\nimport { FormexFieldProps } from \"@firecms/formex\";\n\nexport function SwitchControl({\n field,\n form,\n label,\n tooltip,\n disabled,\n size = \"small\",\n allowIndeterminate\n }: FormexFieldProps & {\n label: string,\n tooltip?: string,\n disabled?: boolean,\n size?: \"small\" | \"medium\",\n allowIndeterminate?: boolean\n}) {\n\n const formControlLabel = <BooleanSwitchWithLabel\n label={label}\n size={size}\n position={\"start\"}\n value={field.value}\n disabled={disabled}\n allowIndeterminate={allowIndeterminate}\n onValueChange={(checked:boolean | null) => form.setFieldValue(field.name, checked)}/>;\n\n if (tooltip)\n return (\n <Tooltip\n title={tooltip}>\n {formControlLabel}\n </Tooltip>\n );\n return formControlLabel;\n}\n","import React from \"react\";\n\nimport { Field, FormexFieldProps, getIn, useFormex } from \"@firecms/formex\";\nimport { DebouncedTextField } from \"@firecms/ui\";\nimport { SwitchControl } from \"../../SwitchControl\";\n\nexport function GeneralPropertyValidation({ disabled }: {\n required?: boolean;\n disabled: boolean;\n}) {\n\n const { values, handleChange } = useFormex();\n\n const validationRequired = \"validation.required\";\n const validationRequiredMessage = \"validation.requiredMessage\";\n const validationUnique = \"validation.unique\";\n const validationUniqueInArray = \"validation.uniqueInArray\";\n\n return (\n <>\n <div className={\"col-span-6\"}>\n <Field name={validationRequired}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n disabled={disabled}\n label={\"Required\"}\n tooltip={\"You won't be able to save this entity if this value is not set\"}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n\n <div className={\"col-span-6\"}>\n\n <Field name={validationUnique}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n disabled={disabled}\n label={\"Unique\"}\n tooltip={\"There cannot be multiple entities with the same value\"}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n\n {getIn(values, validationRequired) && <div className={\"col-span-12\"}>\n <DebouncedTextField\n disabled={disabled}\n value={getIn(values, validationRequiredMessage)}\n label={\"Required message\"}\n name={validationRequiredMessage}\n size=\"small\"\n onChange={handleChange}/>\n </div>}\n </>\n );\n}\n","import React from \"react\";\n\nimport { Field, FormexFieldProps, getIn, useFormex } from \"@firecms/formex\";\nimport { serializeRegExp } from \"@firecms/core\";\nimport { DebouncedTextField, } from \"@firecms/ui\";\nimport { GeneralPropertyValidation } from \"./GeneralPropertyValidation\";\nimport { FieldHelperView } from \"../FieldHelperView\";\nimport { SwitchControl } from \"../../SwitchControl\";\n\nexport function StringPropertyValidation({\n length,\n lowercase,\n matches,\n max,\n min,\n trim,\n uppercase,\n disabled,\n showErrors\n }: {\n length?: boolean;\n min?: boolean;\n max?: boolean;\n trim?: boolean;\n matches?: boolean;\n lowercase?: boolean;\n uppercase?: boolean;\n disabled: boolean;\n showErrors: boolean;\n}) {\n\n const {\n values,\n handleChange,\n errors\n } = useFormex();\n\n const validationLength = \"validation.length\";\n const validationMin = \"validation.min\";\n const validationMax = \"validation.max\";\n const validationTrim = \"validation.trim\";\n const validationMatches = \"validation.matches\";\n const validationLowercase = \"validation.lowercase\";\n const validationUppercase = \"validation.uppercase\";\n\n const matchesError = getIn(errors, validationMatches);\n\n const matchesValue = getIn(values, validationMatches);\n const matchesStringValue = typeof matchesValue === \"string\" ? matchesValue : serializeRegExp(matchesValue);\n return (\n <div className={\"grid grid-cols-12 gap-2\"}>\n\n <GeneralPropertyValidation disabled={disabled}/>\n\n <div className={\"grid grid-cols-12 gap-2 col-span-12\"}>\n\n {lowercase && <div className={\"col-span-4\"}>\n <Field name={validationLowercase}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Lowercase\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>}\n\n {uppercase && <div className={\"col-span-4\"}>\n <Field name={validationUppercase}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Uppercase\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>}\n\n {trim && <div className={\"col-span-4\"}>\n <Field name={validationTrim}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Trim\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>}\n\n </div>\n\n <div className={\"grid grid-cols-12 gap-2 col-span-12\"}>\n {length && <div className={\"col-span-4\"}>\n <DebouncedTextField\n value={getIn(values, validationLength)}\n label={\"Exact length\"}\n name={validationLength}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>}\n\n {min && <div className={\"col-span-4\"}>\n <DebouncedTextField value={getIn(values, validationMin)}\n label={\"Min length\"}\n name={validationMin}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>}\n\n {max && <div className={\"col-span-4\"}>\n <DebouncedTextField value={getIn(values, validationMax)}\n label={\"Max length\"}\n name={validationMax}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>}\n\n </div>\n\n {matches && <div className={\"col-span-12\"}>\n <Field name={validationMatches}\n as={DebouncedTextField}\n label={\"Matches regex\"}\n size=\"small\"\n disabled={disabled}\n value={matchesStringValue}\n error={Boolean(matchesError)}/>\n <FieldHelperView error={Boolean(matchesError)}>\n {matchesError ? \"Not a valid regexp\" : \"e.g. /^\\\\d+$/ for digits only\"}\n </FieldHelperView>\n </div>}\n\n </div>\n );\n\n}\n","import React from \"react\";\n\nimport { getIn, useFormex } from \"@firecms/formex\";\nimport { DebouncedTextField } from \"@firecms/ui\";\nimport { GeneralPropertyValidation } from \"./GeneralPropertyValidation\";\n\nexport function ArrayPropertyValidation({\n max = true,\n min = true,\n disabled\n }: {\n min?: boolean;\n max?: boolean;\n disabled: boolean;\n}) {\n\n const {\n values,\n handleChange\n } = useFormex();\n\n const validationMin = \"validation.min\";\n const validationMax = \"validation.max\";\n\n return (\n <div className={\"grid grid-cols-12 gap-2\"}>\n\n <GeneralPropertyValidation disabled={disabled}/>\n\n {min && <div className={\"col-span-6\"}>\n <DebouncedTextField value={getIn(values, validationMin)}\n disabled={disabled}\n label={\"Min length\"}\n name={validationMin}\n type=\"number\"\n size=\"small\"\n onChange={handleChange}/>\n </div>}\n {max && <div className={\"col-span-6\"}>\n <DebouncedTextField value={getIn(values, validationMax)}\n disabled={disabled}\n label={\"Max length\"}\n name={validationMax}\n type=\"number\"\n size=\"small\"\n onChange={handleChange}/>\n </div>}\n </div>\n );\n}\n","import { PropsWithChildren } from \"react\";\n\nimport { ExpandablePanel, RuleIcon, Typography } from \"@firecms/ui\";\n\nexport function ValidationPanel({\n children\n }: PropsWithChildren<{}>) {\n\n return (\n <ExpandablePanel\n initiallyExpanded={false}\n asField={true}\n className=\"p-4\"\n title={\n <div className=\"flex flex-row text-gray-500\">\n <RuleIcon/>\n <Typography variant={\"subtitle2\"}\n className=\"ml-2\">\n Validation\n </Typography>\n </div>\n }>\n\n {children}\n\n </ExpandablePanel>\n )\n}\n","import React, { useMemo } from \"react\";\nimport { getIn, useFormex } from \"@firecms/formex\";\nimport { EnumValueConfig, resolveEnumValues, useSnackbarController } from \"@firecms/core\";\nimport { Select, SelectItem } from \"@firecms/ui\";\nimport { EnumForm } from \"../EnumForm\";\nimport { StringPropertyValidation } from \"./validation/StringPropertyValidation\";\nimport { ArrayPropertyValidation } from \"./validation/ArrayPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { PropertyWithId } from \"../PropertyEditView\";\n\nexport function EnumPropertyField({\n multiselect,\n updateIds,\n disabled,\n showErrors,\n allowDataInference,\n getData\n }: {\n multiselect: boolean;\n updateIds: boolean;\n disabled: boolean;\n showErrors: boolean;\n allowDataInference?: boolean;\n getData?: () => Promise<object[]>;\n}) {\n\n const {\n values,\n setFieldError,\n setFieldValue\n } = useFormex<PropertyWithId>();\n\n const snackbarContext = useSnackbarController();\n\n const enumValuesPath = multiselect ? \"of.enumValues\" : \"enumValues\";\n\n const defaultValue = getIn(values, \"defaultValue\");\n\n const valuesEnumValues = getIn(values, enumValuesPath);\n const enumValues: EnumValueConfig[] = useMemo(() => {\n if (!valuesEnumValues || typeof valuesEnumValues === \"boolean\")\n return [] as EnumValueConfig[];\n return resolveEnumValues(valuesEnumValues) ?? [] as EnumValueConfig[];\n }, [valuesEnumValues]);\n\n const onValuesChanged = (value: EnumValueConfig[]) => {\n if (!values)\n return;\n setFieldValue(enumValuesPath, value);\n if (!multiselect) {\n const enumIds = value.filter(v => Boolean(v?.id)).map((v: any) => v.id);\n if (defaultValue && !enumIds.includes(defaultValue)) {\n setFieldValue(\"defaultValue\", undefined);\n snackbarContext.open({\n type: \"warning\",\n message: \"Default value was cleared\"\n })\n }\n }\n };\n\n return (\n <>\n <div className={\"col-span-12\"}>\n <EnumForm enumValues={enumValues}\n updateIds={updateIds}\n disabled={disabled}\n allowDataInference={allowDataInference}\n onError={(hasError) => {\n setFieldError(enumValuesPath, hasError ? \"This enum property is missing some values\" : undefined);\n }}\n getData={getData\n ? () => getData()\n .then(res => res.map(d => values.id && getIn(d, values.id)).filter(Boolean))\n : undefined}\n onValuesChanged={onValuesChanged}/>\n </div>\n\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n {!multiselect &&\n <StringPropertyValidation disabled={disabled}\n showErrors={showErrors}/>}\n {multiselect &&\n <ArrayPropertyValidation disabled={disabled}/>}\n </ValidationPanel>\n\n </div>\n\n {!multiselect && <div className={\"col-span-12\"}>\n\n <Select\n disabled={disabled}\n position={\"item-aligned\"}\n onValueChange={(value: string) => {\n setFieldValue(\"defaultValue\", value);\n }}\n label={\"Default value\"}\n value={defaultValue ?? \"\"}>\n {enumValues\n .filter((enumValue) => Boolean(enumValue?.id))\n .map((enumValue) => (\n <SelectItem key={enumValue.id}\n value={enumValue.id?.toString()}>\n {enumValue.label}\n </SelectItem>\n ))}\n </Select>\n\n </div>}\n </>\n );\n}\n","import React from \"react\";\nimport {\n Button,\n Checkbox,\n DebouncedTextField,\n ExpandablePanel,\n FileUploadIcon,\n MultiSelect,\n MultiSelectItem,\n Typography\n} from \"@firecms/ui\";\n\nimport { Field, FormexFieldProps, getIn, useFormex } from \"@firecms/formex\";\nimport { GeneralPropertyValidation } from \"./validation/GeneralPropertyValidation\";\nimport { ArrayPropertyValidation } from \"./validation/ArrayPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { SwitchControl } from \"../SwitchControl\";\n\nconst fileTypes: Record<string, string> = {\n \"image/*\": \"Images\",\n \"video/*\": \"Videos\",\n \"audio/*\": \"Audio files\",\n \"application/*\": \"Files (pdf, zip, csv, excel...)\",\n \"text/*\": \"Text files\"\n}\n\nexport function StoragePropertyField({\n multiple,\n existing,\n disabled\n }: {\n multiple: boolean;\n existing: boolean;\n disabled: boolean;\n}) {\n\n const {\n values,\n setFieldValue\n } = useFormex();\n\n const baseStoragePath = multiple ? \"of.storage\" : \"storage\";\n const acceptedFiles = `${baseStoragePath}.acceptedFiles`;\n\n const metadata = `${baseStoragePath}.metadata`;\n const fileName = `${baseStoragePath}.fileName`;\n const storagePath = `${baseStoragePath}.storagePath`;\n const storeUrl = `${baseStoragePath}.storeUrl`;\n\n const fileNameValue = getIn(values, fileName) ?? \"{rand}_{file}\";\n const storagePathValue = getIn(values, storagePath) ?? \"/\";\n\n const storedValue = getIn(values, acceptedFiles);\n const fileTypesValue: string[] | undefined = Array.isArray(storedValue) ? storedValue : undefined;\n const allFileTypesSelected = !fileTypesValue || fileTypesValue.length === 0;\n\n const handleTypesChange = (value: string[]) => {\n if (!value) setFieldValue(acceptedFiles, undefined);\n else if (value.includes(\"all\")) setFieldValue(acceptedFiles, undefined);\n else if (value.length >= Object.keys(fileTypes).length) setFieldValue(acceptedFiles, undefined);\n else if (allFileTypesSelected)\n setFieldValue(acceptedFiles, Object.keys(fileTypes).filter((v) => !value.includes(v)));\n else setFieldValue(acceptedFiles, value);\n };\n\n const hasFilenameCallback = typeof fileNameValue === \"function\";\n const hasStoragePathCallback = typeof storagePathValue === \"function\";\n\n return (\n <>\n\n <div className={\"col-span-12\"}>\n\n <ExpandablePanel\n title={\n <div className=\"flex flex-row text-gray-500\">\n <FileUploadIcon/>\n <Typography variant={\"subtitle2\"}\n className=\"ml-2\">\n File upload config\n </Typography>\n </div>\n }>\n\n <div className={\"grid grid-cols-12 gap-2 p-4\"}>\n\n <div className={\"col-span-12\"}>\n\n <MultiSelect\n disabled={disabled}\n name={acceptedFiles}\n value={fileTypesValue ?? []}\n onMultiValueChange={handleTypesChange}\n label={allFileTypesSelected ? undefined : \"Allowed file types\"}\n renderValues={(selected) => {\n if (!selected || selected.length === 0) return \"All file types allowed\";\n return selected.map((v: string) => fileTypes[v])\n .filter((v: string) => Boolean(v))\n .join(\", \");\n }}>\n\n <MultiSelectItem key={\"all\"} value={\"all\"} className={\"flex items-center gap-2\"}>\n <Checkbox\n checked={!fileTypesValue}/>\n All\n </MultiSelectItem>\n\n {Object.entries(fileTypes).map(([value, label]) => (\n <MultiSelectItem key={value} value={value} className={\"flex items-center gap-2\"}>\n <Checkbox\n checked={allFileTypesSelected || fileTypesValue.indexOf(value) > -1}/>\n <div className={\"flex-grow\"}>\n {label}\n </div>\n <Button size={\"small\"}\n variant={\"outlined\"}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n return setFieldValue(acceptedFiles, [value]);\n }}>\n Only\n </Button>\n </MultiSelectItem>\n ))}\n\n </MultiSelect>\n </div>\n\n <div className={\"col-span-12\"}>\n <Field name={fileName}\n as={DebouncedTextField}\n label={\"File name\"}\n size={\"small\"}\n disabled={hasFilenameCallback || disabled}\n value={hasFilenameCallback ? \"-\" : fileNameValue}\n />\n </div>\n <div className={\"col-span-12\"}>\n <Field name={storagePath}\n as={DebouncedTextField}\n label={\"Storage path\"}\n disabled={hasStoragePathCallback || disabled}\n size={\"small\"}\n value={hasStoragePathCallback ? \"-\" : storagePathValue}\n />\n <Typography variant={\"caption\"} className={\"ml-3.5 mt-1 mb-2\"}>\n <p>You can use the following placeholders in\n the file name\n and storage path values:</p>\n <ul>\n <li>{\"{file} - Full name of the uploaded file\"}</li>\n <li>{\"{file.name} - Name of the uploaded file without extension\"}</li>\n <li>{\"{file.ext} - Extension of the uploaded file\"}</li>\n <li>{\"{entityId} - ID of the entity\"}</li>\n <li>{\"{propertyKey} - ID of this field\"}</li>\n <li>{\"{path} - Path of this entity\"}</li>\n <li>{\"{rand} - Random value used to avoid name collisions\"}</li>\n </ul>\n </Typography>\n\n <Field name={storeUrl}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Save URL instead of storage path\"}\n disabled={existing || disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n\n <Typography variant={\"caption\"} className={\"ml-3.5 mt-1 mb-2\"}>\n Turn this setting on, if you prefer to save\n the download\n URL of the uploaded file instead of the\n storage path.\n You can only change this prop upon creation.\n </Typography>\n </div>\n </div>\n </ExpandablePanel>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n {!multiple && <div className={\"grid grid-cols-12 gap-2\"}>\n <GeneralPropertyValidation disabled={disabled}/>\n </div>}\n {multiple && <div className={\"col-span-12\"}>\n <ArrayPropertyValidation disabled={disabled}/>\n </div>}\n </ValidationPanel>\n\n </div>\n </>\n );\n}\n","import { isPropertyBuilder, Properties, PropertiesOrBuilders, Property, PropertyOrBuilder } from \"@firecms/core\";\n\nexport function editableProperty(property: PropertyOrBuilder | PropertyOrBuilder): boolean {\n if (isPropertyBuilder(property))\n return false;\n if (isPropertyBuilder(property as PropertyOrBuilder))\n return false;\n else {\n const eProperty = property as Property;\n if (eProperty.dataType === \"array\" && typeof eProperty.of === \"function\")\n return false;\n else if (eProperty.dataType === \"array\" && Array.isArray(eProperty.of))\n return false;\n return Boolean(eProperty.editable);\n }\n}\n\nexport function removeNonEditableProperties(properties: PropertiesOrBuilders<any>): Properties {\n return Object.entries(properties)\n .filter(([_, property]) => editableProperty(property))\n .map(([key, propertyOrBuilder]) => {\n const property = propertyOrBuilder as Property;\n if (!editableProperty(property)) {\n return undefined;\n } else if (property.dataType === \"map\" && property.properties) {\n return {\n [key]: {\n ...property,\n properties: removeNonEditableProperties(property.properties as PropertiesOrBuilders)\n }\n };\n } else {\n return { [key]: property };\n }\n })\n .filter((e) => Boolean(e))\n .reduce((a, b) => ({ ...a, ...b }), {}) as Properties;\n}\n","import {\n ErrorBoundary,\n PropertyConfigBadge,\n getFieldConfig,\n isPropertyBuilder,\n Property,\n PropertyOrBuilder,\n useCustomizationController,\n} from \"@firecms/core\";\nimport {\n cardClickableMixin,\n cardMixin,\n cardSelectedMixin,\n cn,\n FunctionsIcon,\n Paper,\n RemoveCircleIcon,\n Typography,\n} from \"@firecms/ui\";\n\nimport { editableProperty } from \"../../utils/entities\";\n\nexport function PropertyFieldPreview({\n property,\n onClick,\n hasError,\n includeName,\n includeEditButton,\n selected\n }: {\n property: Property,\n hasError?: boolean,\n selected?: boolean,\n includeName?: boolean,\n includeEditButton?: boolean;\n onClick?: () => void\n}) {\n\n const { propertyConfigs } = useCustomizationController();\n\n const propertyConfig = getFieldConfig(property, propertyConfigs);\n const disabled = !editableProperty(property);\n\n const borderColorClass = hasError\n ? \"border-red-500 dark:border-red-500 border-opacity-100 dark:border-opacity-100 ring-0 dark:ring-0\"\n : (selected ? \"border-primary\" : \"border-transparent\");\n\n if(hasError)\n console.log(\"PropertyFieldPreview\", property)\n\n return <ErrorBoundary>\n <div\n onClick={onClick}\n className=\"flex flex-row w-full cursor-pointer\">\n <div className={\"m-4\"}>\n <PropertyConfigBadge propertyConfig={propertyConfig}/>\n </div>\n <Paper\n className={cn(\n \"border\",\n \"pl-2 w-full flex flex-row gap-4 items-center\",\n cardMixin,\n onClick ? cardClickableMixin : \"\",\n selected ? cardSelectedMixin : \"\",\n \"flex-grow p-4 border transition-colors duration-200\",\n borderColorClass\n )}\n >\n\n <div className=\"w-full flex flex-col\">\n\n {includeName &&\n <ErrorBoundary>\n <Typography variant=\"body1\"\n component=\"span\"\n className=\"flex-grow pr-2\">\n {property.name\n ? property.name\n : \"\\u00a0\"\n }\n </Typography>\n </ErrorBoundary>}\n\n <div className=\"flex flex-row items-center\">\n <ErrorBoundary>\n <Typography className=\"flex-grow pr-2\"\n variant={includeName ? \"body2\" : \"subtitle1\"}\n component=\"span\"\n color=\"secondary\">\n {propertyConfig?.name}\n </Typography>\n </ErrorBoundary>\n <ErrorBoundary>\n <Typography variant=\"body2\"\n component=\"span\"\n color=\"disabled\">\n {property.dataType}\n </Typography>\n </ErrorBoundary>\n\n </div>\n </div>\n\n {includeEditButton && <Typography variant={\"button\"}>\n EDIT\n </Typography>}\n\n </Paper>\n </div>\n </ErrorBoundary>\n}\n\nexport function NonEditablePropertyPreview({\n name,\n selected,\n onClick,\n property\n }: {\n name: string,\n selected: boolean,\n onClick?: () => void,\n property?: PropertyOrBuilder\n}) {\n\n const { propertyConfigs } = useCustomizationController();\n\n const propertyConfig = !isPropertyBuilder(property) && property ? getFieldConfig(property, propertyConfigs) : undefined;\n\n return (\n <div\n onClick={onClick}\n className=\"flex flex-row w-full cursor-pointer\">\n <div className={\"relative m-4\"}>\n {propertyConfig && <PropertyConfigBadge propertyConfig={propertyConfig}/>}\n {!propertyConfig && <div\n className={\"h-8 w-8 p-1 rounded-full shadow text-white bg-gray-500\"}>\n <FunctionsIcon color={\"inherit\"} size={\"medium\"}/>\n </div>}\n <RemoveCircleIcon color={\"disabled\"} size={\"small\"} className={\"absolute -right-2 -top-2\"}/>\n </div>\n <Paper\n className={cn(\n \"pl-2 w-full flex flex-row gap-4 items-center\",\n cardMixin,\n onClick ? cardClickableMixin : \"\",\n selected ? cardSelectedMixin : \"\",\n \"flex-grow p-4 border transition-colors duration-200\",\n selected ? \"border-primary\" : \"border-transparent\")}\n >\n\n <div className=\"w-full flex flex-col\">\n <Typography variant=\"body1\"\n component=\"span\"\n className=\"flex-grow pr-2\">\n {property?.name\n ? property.name\n : name\n }\n </Typography>\n\n <div className=\"flex flex-row items-center\">\n {propertyConfig && <Typography className=\"flex-grow pr-2\"\n variant={\"body2\"}\n component=\"span\"\n color=\"secondary\">\n {propertyConfig?.name}\n </Typography>}\n\n {property && !isPropertyBuilder(property) && <ErrorBoundary>\n <Typography variant=\"body2\"\n component=\"span\"\n color=\"disabled\">\n {property.dataType}\n </Typography>\n </ErrorBoundary>}\n\n {property && isPropertyBuilder(property) && <ErrorBoundary>\n <Typography variant=\"body2\"\n component=\"span\"\n color=\"disabled\">\n This property is defined as a property builder in code\n </Typography>\n </ErrorBoundary>}\n\n {!property && <ErrorBoundary>\n <Typography variant=\"body2\"\n component=\"span\"\n color=\"disabled\">\n This field is defined as an additional field in code\n </Typography>\n </ErrorBoundary>}\n\n </div>\n\n {/*<div className=\"flex flex-row text-xs\">*/}\n {/* <Typography className=\"flex-grow pr-2\"*/}\n {/* variant=\"body2\"*/}\n {/* component=\"span\"*/}\n {/* color=\"secondary\">*/}\n {/* This field can only be edited in code*/}\n {/* </Typography>*/}\n {/*</div>*/}\n </div>\n\n </Paper>\n </div>)\n}\n","import React, { useCallback } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport {\n AdditionalFieldDelegate,\n CMSType,\n ErrorBoundary,\n isPropertyBuilder,\n PropertiesOrBuilders,\n PropertyOrBuilder\n} from \"@firecms/core\";\nimport { AutoAwesomeIcon, defaultBorderMixin, DragHandleIcon, IconButton, RemoveIcon, Tooltip } from \"@firecms/ui\";\nimport { NonEditablePropertyPreview, PropertyFieldPreview } from \"./PropertyFieldPreview\";\nimport { DragDropContext, Draggable, DraggableProvided, Droppable } from \"@hello-pangea/dnd\";\nimport { getFullId, getFullIdPath } from \"./util\";\nimport { editableProperty } from \"../../utils/entities\";\n\nexport const PropertyTree = React.memo(\n function PropertyTree<M extends {\n [Key: string]: CMSType\n }>({\n namespace,\n selectedPropertyKey,\n onPropertyClick,\n properties,\n propertiesOrder: propertiesOrderProp,\n additionalFields,\n errors,\n onPropertyMove,\n onPropertyRemove,\n className,\n inferredPropertyKeys,\n collectionEditable\n }: {\n namespace?: string;\n selectedPropertyKey?: string;\n onPropertyClick?: (propertyKey: string, namespace?: string) => void;\n properties: PropertiesOrBuilders<M>;\n propertiesOrder?: string[];\n additionalFields?: AdditionalFieldDelegate<M>[];\n errors: Record<string, any>;\n onPropertyMove?: (propertiesOrder: string[], namespace?: string) => void;\n onPropertyRemove?: (propertyKey: string, namespace?: string) => void;\n className?: string;\n inferredPropertyKeys?: string[];\n collectionEditable: boolean;\n }) {\n\n const propertiesOrder = propertiesOrderProp ?? Object.keys(properties);\n\n const onDragEnd = useCallback((result: any) => {\n // dropped outside the list\n if (!result.destination) {\n return;\n }\n const startIndex = result.source.index;\n const endIndex = result.destination.index;\n\n const newPropertiesOrder = Array.from(propertiesOrder);\n const [removed] = newPropertiesOrder.splice(startIndex, 1);\n newPropertiesOrder.splice(endIndex, 0, removed);\n if (onPropertyMove)\n onPropertyMove(newPropertiesOrder, namespace);\n }, [namespace, onPropertyMove, propertiesOrder])\n\n return (\n <>\n\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable droppableId={`droppable_${namespace}`}>\n {(droppableProvided, droppableSnapshot) => (\n <div\n {...droppableProvided.droppableProps}\n ref={droppableProvided.innerRef}\n className={className}>\n {propertiesOrder && propertiesOrder\n .map((propertyKey: string, index: number) => {\n const property = properties[propertyKey] as PropertyOrBuilder;\n const additionalField = additionalFields?.find(field => field.key === propertyKey);\n\n if (!property && !additionalField) {\n console.warn(`Property ${propertyKey} not found in properties or additionalFields`);\n return null;\n }\n return (\n <Draggable\n key={`array_field_${namespace}_${propertyKey}}`}\n draggableId={`array_field_${namespace}_${propertyKey}}`}\n index={index}>\n {(provided, snapshot) => {\n return (\n <ErrorBoundary>\n <PropertyTreeEntry\n propertyKey={propertyKey as string}\n propertyOrBuilder={property}\n additionalField={additionalField}\n provided={provided}\n errors={errors}\n namespace={namespace}\n inferredPropertyKeys={inferredPropertyKeys}\n onPropertyMove={onPropertyMove}\n onPropertyRemove={onPropertyRemove}\n onPropertyClick={snapshot.isDragging ? undefined : onPropertyClick}\n selectedPropertyKey={selectedPropertyKey}\n collectionEditable={collectionEditable}\n />\n </ErrorBoundary>\n );\n }}\n </Draggable>);\n }).filter(Boolean)}\n\n {droppableProvided.placeholder}\n\n </div>\n )}\n </Droppable>\n </DragDropContext>\n\n </>\n );\n },\n (prevProps, nextProps) => {\n\n const isSelected = nextProps.selectedPropertyKey?.startsWith(nextProps.namespace ?? \"\");\n const wasSelected = prevProps.selectedPropertyKey?.startsWith(prevProps.namespace ?? \"\");\n if (isSelected || wasSelected)\n return false;\n\n return equal(prevProps.properties, nextProps.properties) &&\n prevProps.propertiesOrder === nextProps.propertiesOrder &&\n equal(prevProps.additionalFields, nextProps.additionalFields) &&\n equal(prevProps.errors, nextProps.errors) &&\n equal(prevProps.onPropertyClick, nextProps.onPropertyClick) &&\n // equal(prevProps.onPropertyMove, nextProps.onPropertyMove) &&\n // equal(prevProps.onPropertyRemove, nextProps.onPropertyRemove) &&\n prevProps.namespace === nextProps.namespace &&\n prevProps.collectionEditable === nextProps.collectionEditable;\n }\n);\n\nexport function PropertyTreeEntry({\n propertyKey,\n namespace,\n propertyOrBuilder,\n additionalField,\n provided,\n selectedPropertyKey,\n errors,\n onPropertyClick,\n onPropertyMove,\n onPropertyRemove,\n inferredPropertyKeys,\n collectionEditable\n }: {\n propertyKey: string;\n namespace?: string;\n propertyOrBuilder: PropertyOrBuilder;\n additionalField?: AdditionalFieldDelegate<any>;\n selectedPropertyKey?: string;\n provided: DraggableProvided;\n errors: Record<string, any>;\n onPropertyClick?: (propertyKey: string, namespace?: string) => void;\n onPropertyMove?: (propertiesOrder: string[], namespace?: string) => void;\n onPropertyRemove?: (propertyKey: string, namespace?: string) => void;\n inferredPropertyKeys?: string[];\n collectionEditable: boolean;\n}) {\n\n const isPropertyInferred = inferredPropertyKeys?.includes(namespace ? `${namespace}.${propertyKey}` : propertyKey);\n const fullId = getFullId(propertyKey, namespace);\n const fullIdPath = getFullIdPath(propertyKey, namespace);\n const hasError = fullIdPath in errors;\n\n let subtree;\n if (typeof propertyOrBuilder === \"object\") {\n const property = propertyOrBuilder;\n if (property.dataType === \"map\" && property.properties) {\n subtree = <PropertyTree\n selectedPropertyKey={selectedPropertyKey}\n namespace={fullId}\n properties={property.properties}\n propertiesOrder={property.propertiesOrder}\n errors={errors}\n onPropertyClick={onPropertyClick}\n onPropertyMove={onPropertyMove}\n onPropertyRemove={onPropertyRemove}\n collectionEditable={collectionEditable}\n />\n }\n }\n\n // const hasError = fullId ? getIn(errors, idToPropertiesPath(fullId)) : false;\n const selected = selectedPropertyKey === fullId;\n const editable = propertyOrBuilder && ((collectionEditable && !isPropertyBuilder(propertyOrBuilder)) || editableProperty(propertyOrBuilder));\n\n return (\n <div\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...provided.dragHandleProps}\n className=\"relative -ml-8\"\n >\n {subtree && <div\n className={\"absolute border-l \" + defaultBorderMixin}\n style={{\n left: \"32px\",\n top: \"64px\",\n bottom: \"16px\"\n }}/>}\n\n {!isPropertyBuilder(propertyOrBuilder) && !additionalField && editable\n ? <PropertyFieldPreview\n property={propertyOrBuilder}\n onClick={onPropertyClick ? () => onPropertyClick(propertyKey, namespace) : undefined}\n includeName={true}\n selected={selected}\n hasError={hasError}/>\n : <NonEditablePropertyPreview name={propertyKey}\n property={propertyOrBuilder}\n onClick={onPropertyClick ? () => onPropertyClick(propertyKey, namespace) : undefined}\n selected={selected}/>}\n\n <div className=\"absolute top-2 right-2 flex flex-row \">\n\n {isPropertyInferred && <Tooltip title={\"Inferred property\"}>\n <AutoAwesomeIcon size=\"small\" className={\"p-2\"}/>\n </Tooltip>}\n\n {onPropertyRemove && <Tooltip title={\"Remove\"}>\n <IconButton size=\"small\"\n color=\"inherit\"\n onClick={() => onPropertyRemove(propertyKey, namespace)}>\n <RemoveIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>}\n\n {onPropertyMove && <Tooltip title={\"Move\"}>\n <IconButton\n component={\"span\"}\n size=\"small\"\n >\n <DragHandleIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>}\n </div>\n\n {subtree && <div className={\"ml-16\"}>{subtree}</div>}\n </div>\n );\n\n}\n","import React, { useCallback, useState } from \"react\";\nimport { MapProperty, Property, PropertyConfig, } from \"@firecms/core\";\nimport { AddIcon, BooleanSwitchWithLabel, Button, Paper, Typography } from \"@firecms/ui\";\nimport { PropertyFormDialog } from \"../PropertyEditView\";\nimport { getIn, useFormex } from \"@firecms/formex\";\nimport { PropertyTree } from \"../PropertyTree\";\nimport { getFullId, idToPropertiesPath, namespaceToPropertiesOrderPath, namespaceToPropertiesPath } from \"../util\";\nimport { FieldHelperView } from \"./FieldHelperView\";\n\nexport function MapPropertyField({ disabled, getData, allowDataInference, propertyConfigs, collectionEditable }: {\n disabled: boolean;\n getData?: () => Promise<object[]>;\n allowDataInference: boolean;\n propertyConfigs: Record<string, PropertyConfig>,\n collectionEditable: boolean;\n}) {\n\n const {\n values,\n setFieldValue\n } = useFormex<MapProperty>();\n\n const [propertyDialogOpen, setPropertyDialogOpen] = useState<boolean>(false);\n const [selectedPropertyKey, setSelectedPropertyKey] = useState<string | undefined>();\n const [selectedPropertyNamespace, setSelectedPropertyNamespace] = useState<string | undefined>();\n\n const propertiesOrder = values.propertiesOrder ?? Object.keys(values.properties ?? {});\n const onPropertyCreated = ({\n id,\n property\n }: { id?: string, property: Property }) => {\n if (!id)\n throw Error();\n setFieldValue(\"properties\", {\n ...(values.properties ?? {}),\n [id]: property\n }, false);\n\n const currentPropertiesOrder = values.propertiesOrder ?? Object.keys(values.properties ?? {});\n const newPropertiesOrder = currentPropertiesOrder.includes(id) ? currentPropertiesOrder : [...currentPropertiesOrder, id];\n setFieldValue(\"propertiesOrder\", newPropertiesOrder, false);\n\n setPropertyDialogOpen(false);\n };\n\n const deleteProperty = useCallback((propertyKey?: string, namespace?: string) => {\n const fullId = propertyKey ? getFullId(propertyKey, namespace) : undefined;\n if (!fullId)\n throw Error(\"collection editor miss config\");\n\n const propertiesPath = idToPropertiesPath(fullId);\n const propertiesOrderPath = namespaceToPropertiesOrderPath(namespace);\n\n const currentPropertiesOrder: string[] = getIn(values, propertiesOrderPath) ?? Object.keys(getIn(values, namespaceToPropertiesPath(namespace)));\n\n setFieldValue(propertiesPath, undefined, false);\n setFieldValue(propertiesOrderPath, currentPropertiesOrder.filter((p) => p !== propertyKey), false);\n\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }, [setFieldValue, values]);\n\n const selectedPropertyFullId = selectedPropertyKey ? getFullId(selectedPropertyKey, selectedPropertyNamespace) : undefined;\n const selectedProperty = selectedPropertyFullId ? getIn(values.properties, selectedPropertyFullId.replaceAll(\".\", \".properties.\")) : undefined;\n\n const empty = !propertiesOrder || propertiesOrder.length < 1;\n\n const onPropertyMove = useCallback((propertiesOrder: string[], namespace?: string) => {\n setFieldValue(namespaceToPropertiesOrderPath(namespace), propertiesOrder, false);\n }, []);\n\n return (\n <>\n <div className={\"col-span-12\"}>\n <div className=\"flex justify-between items-end my-4\">\n <Typography variant={\"subtitle2\"}>Properties in this group</Typography>\n <Button\n color=\"primary\"\n variant={\"outlined\"}\n onClick={() => setPropertyDialogOpen(true)}\n startIcon={<AddIcon/>}\n >\n Add property to {values.name ?? \"this group\"}\n </Button>\n </div>\n <Paper className=\"p-2 pl-8\">\n <PropertyTree\n properties={values.properties ?? {}}\n propertiesOrder={propertiesOrder}\n errors={{}}\n collectionEditable={collectionEditable}\n onPropertyClick={(propertyKey, namespace) => {\n setSelectedPropertyKey(propertyKey);\n setSelectedPropertyNamespace(namespace);\n setPropertyDialogOpen(true);\n }}\n onPropertyMove={onPropertyMove}/>\n\n {empty &&\n <Typography variant={\"label\"}\n className=\"h-full flex items-center justify-center p-4\">\n Add the first property to this group\n </Typography>}\n </Paper>\n </div>\n\n <div className={\"col-span-12\"}>\n <BooleanSwitchWithLabel\n position={\"start\"}\n size={\"small\"}\n label=\"Spread children as columns\"\n onValueChange={(v) => setFieldValue(\"spreadChildren\", v)}\n value={values.spreadChildren ?? false}\n />\n <FieldHelperView>\n Set this flag to true if you want to display the children of this group as individual columns.\n </FieldHelperView>\n </div>\n\n <PropertyFormDialog\n inArray={false}\n forceShowErrors={false}\n open={propertyDialogOpen}\n allowDataInference={allowDataInference}\n collectionEditable={collectionEditable}\n onCancel={() => {\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }}\n onOkClicked={() => {\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }}\n getData={getData}\n onDelete={deleteProperty}\n propertyKey={selectedPropertyKey}\n propertyNamespace={selectedPropertyNamespace}\n property={selectedProperty}\n existingProperty={Boolean(selectedPropertyKey)}\n autoUpdateId={!selectedPropertyKey}\n autoOpenTypeSelect={!selectedPropertyKey}\n onPropertyChanged={onPropertyCreated}\n existingPropertyKeys={selectedPropertyKey ? undefined : propertiesOrder}\n propertyConfigs={propertyConfigs}\n />\n\n </>);\n}\n","import React, { useState } from \"react\";\nimport { ArrayProperty, getFieldConfig, Property, PropertyConfig } from \"@firecms/core\";\nimport { Button, Paper, Typography } from \"@firecms/ui\";\nimport { Field, getIn, useFormex } from \"@firecms/formex\";\nimport { PropertyFormDialog } from \"../PropertyEditView\";\nimport { PropertyFieldPreview } from \"../PropertyFieldPreview\";\nimport { ArrayPropertyValidation } from \"./validation/ArrayPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\n\nexport function RepeatPropertyField({\n showErrors,\n existing,\n disabled,\n getData,\n allowDataInference,\n propertyConfigs,\n collectionEditable\n }: {\n showErrors: boolean,\n existing: boolean,\n disabled: boolean,\n getData?: () => Promise<object[]>;\n allowDataInference: boolean;\n propertyConfigs: Record<string, PropertyConfig>,\n collectionEditable: boolean;\n}) {\n\n const {\n values,\n handleChange,\n errors,\n setFieldValue,\n touched\n } = useFormex<ArrayProperty>();\n\n const [propertyDialogOpen, setPropertyDialogOpen] = useState(false);\n const ofProperty = getIn(values, \"of\");\n const ofPropertyError = getIn(touched, \"of\") && getIn(errors, \"of\");\n\n const onPropertyChanged = ({ id, property, namespace }:\n { id?: string, property: Property, namespace?: string }) => {\n console.log(\"onPropertyChanged\", id, property, namespace);\n setFieldValue(\"of\", property);\n };\n\n const widget = ofProperty && getFieldConfig(ofProperty, propertyConfigs);\n return (\n <>\n <div className={\"col-span-12\"}>\n <Typography variant={\"subtitle2\"}>\n Repeat component\n </Typography>\n <Field\n name={\"of\"}\n value={ofProperty}\n // validate={(property: Property) => {\n // return property?.dataType ? undefined : \"You need to specify a repeat field\";\n // }}\n >\n {({}) => (\n <Paper className=\"p-2 mt-4\">\n\n {ofProperty && <PropertyFieldPreview\n property={ofProperty}\n onClick={disabled ? undefined : () => setPropertyDialogOpen(true)}\n includeName={false}\n includeEditButton={true}\n selected={false}\n hasError={false}/>}\n\n {!disabled && !ofProperty && <Button variant={\"text\"}\n size={\"large\"}\n color={ofPropertyError ? \"error\" : \"primary\"}\n onClick={() => setPropertyDialogOpen(true)}>\n Edit {`${widget ? widget.name : \"repeat component\"}`}\n </Button>}\n\n <PropertyFormDialog\n inArray={true}\n open={propertyDialogOpen}\n existingProperty={existing}\n getData={getData}\n autoUpdateId={!existing}\n autoOpenTypeSelect={!existing}\n onOkClicked={() => setPropertyDialogOpen(false)}\n allowDataInference={allowDataInference}\n property={ofProperty}\n includeIdAndName={false}\n onPropertyChanged={onPropertyChanged}\n forceShowErrors={showErrors}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n />\n </Paper>\n )}\n </Field>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n <ArrayPropertyValidation disabled={disabled}/>\n </ValidationPanel>\n\n </div>\n </>\n );\n}\n","import { Field, getIn, useFormex } from \"@firecms/formex\";\nimport { DebouncedTextField } from \"@firecms/ui\";\nimport { PropertyWithId } from \"../PropertyEditView\";\nimport React from \"react\";\nimport { FieldHelperView } from \"./FieldHelperView\";\nimport { toSnakeCase, unslugify } from \"@firecms/core\";\n\ntype CommonPropertyFieldsProps = {\n showErrors: boolean,\n disabledId: boolean,\n disabled: boolean;\n isNewProperty: boolean;\n autoUpdateId: boolean;\n};\n\nexport const CommonPropertyFields = React.forwardRef<HTMLDivElement, CommonPropertyFieldsProps>(\n function CommonPropertyFields({\n showErrors,\n disabledId,\n disabled,\n autoUpdateId,\n isNewProperty\n }, ref) {\n\n const {\n errors,\n values,\n setFieldValue,\n setFieldTouched,\n touched,\n validate\n } = useFormex<PropertyWithId>();\n\n const name = \"name\";\n const nameError = showErrors && getIn(errors, name);\n\n const id = \"id\";\n const idError = showErrors && getIn(errors, id);\n\n const description = \"description\";\n const descriptionError = showErrors && getIn(errors, description);\n\n return (\n <div className={\"flex flex-col gap-2 col-span-12\"}>\n\n <div>\n <Field\n name={name}\n inputRef={ref}\n as={DebouncedTextField}\n value={values[name]}\n onChange={(e: any) => {\n const newNameValue = e.target.value;\n const idTouched = getIn(touched, id);\n if (!idTouched && autoUpdateId) {\n setFieldValue(id, newNameValue ? toSnakeCase(newNameValue) : \"\", false)\n }\n setFieldValue(name, newNameValue, true);\n setFieldTouched(name, true);\n }}\n style={{ fontSize: 20 }}\n placeholder={\"Field name\"}\n required\n disabled={disabled}\n error={Boolean(nameError)}/>\n\n <FieldHelperView error={Boolean(nameError)}>\n {nameError}\n </FieldHelperView>\n </div>\n\n <div>\n <Field\n name={id}\n as={DebouncedTextField}\n label={\"ID\"}\n value={values[id]}\n onChange={(e: any) => {\n const newIdValue = e.target.value;\n const nameTouched = getIn(touched, name);\n if (!nameTouched && autoUpdateId) {\n setFieldValue(name, newIdValue ? unslugify(newIdValue) : \"\")\n }\n setFieldValue(id, newIdValue, true);\n setFieldTouched(id, true);\n }}\n disabled={disabledId || disabled}\n required\n size=\"small\"\n error={Boolean(idError)}/>\n <FieldHelperView error={Boolean(idError)}>\n {idError}\n </FieldHelperView>\n </div>\n\n <div>\n <Field name={description}\n as={DebouncedTextField}\n label={\"Description\"}\n disabled={disabled}\n error={Boolean(descriptionError)}/>\n <FieldHelperView error={Boolean(descriptionError)}>\n {descriptionError}\n </FieldHelperView>\n </div>\n\n </div>\n );\n\n }\n);\n","import React from \"react\";\nimport { StringPropertyValidation } from \"./validation/StringPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { getIn, useFormex } from \"@firecms/formex\";\n\nimport { TextField } from \"@firecms/ui\";\n\nexport function StringPropertyField({\n widgetId,\n disabled,\n showErrors\n }: {\n widgetId: \"text_field\" | \"multiline\" | \"markdown\" | \"email\";\n disabled: boolean;\n showErrors: boolean;\n}) {\n\n const { values, setFieldValue } = useFormex();\n\n return (\n <>\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n\n {widgetId === \"text_field\" &&\n <StringPropertyValidation disabled={disabled}\n length={true}\n lowercase={true}\n matches={true}\n max={true}\n min={true}\n trim={true}\n uppercase={true}\n showErrors={showErrors}/>}\n {widgetId === \"multiline\" &&\n <StringPropertyValidation disabled={disabled}\n length={true}\n lowercase={true}\n max={true}\n min={true}\n trim={true}\n uppercase={true}\n showErrors={showErrors}/>}\n {widgetId === \"markdown\" &&\n <StringPropertyValidation disabled={disabled}\n length={true}\n lowercase={true}\n max={true}\n min={true}\n trim={true}\n uppercase={true}\n showErrors={showErrors}/>}\n\n {widgetId === \"email\" &&\n <StringPropertyValidation disabled={disabled}\n max={true}\n min={true}\n trim={true}\n showErrors={showErrors}/>}\n\n </ValidationPanel>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <TextField name={\"defaultValue\"}\n disabled={disabled}\n onChange={(e: any) => {\n setFieldValue(\"defaultValue\", e.target.value === \"\" ? undefined : e.target.value);\n }}\n label={\"Default value\"}\n value={getIn(values, \"defaultValue\") ?? \"\"}/>\n\n </div>\n </>\n );\n}\n","import React from \"react\";\nimport { Field, FormexFieldProps, getIn, useFormex } from \"@firecms/formex\";\n\nimport { GeneralPropertyValidation } from \"./validation/GeneralPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { SwitchControl } from \"../SwitchControl\";\n\nexport function BooleanPropertyField({ disabled }: {\n disabled: boolean;\n}) {\n const { values } = useFormex();\n const defaultValue = getIn(values, \"defaultValue\");\n\n return (\n <>\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n <GeneralPropertyValidation disabled={disabled}/>\n </ValidationPanel>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <Field\n name={\"defaultValue\"}>\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={defaultValue === null || defaultValue === undefined ? \"Default value not set\" : (\"Default value is \" + defaultValue.toString())}\n disabled={disabled}\n allowIndeterminate={true} field={field}\n form={form}/>\n }}\n </Field>\n\n </div>\n </>\n );\n}\n","import React, { useCallback, useState } from \"react\";\nimport { AddIcon, Button, Paper, Typography } from \"@firecms/ui\";\nimport { getIn, useFormex } from \"@firecms/formex\";\nimport { PropertyFormDialog } from \"../PropertyEditView\";\nimport { getFullId, idToPropertiesPath, namespaceToPropertiesOrderPath } from \"../util\";\nimport { PropertyTree } from \"../PropertyTree\";\nimport { ArrayProperty, Property, PropertyConfig } from \"@firecms/core\";\n\nexport function BlockPropertyField({ disabled, getData, allowDataInference, propertyConfigs, collectionEditable }: {\n disabled: boolean;\n getData?: () => Promise<object[]>;\n allowDataInference: boolean;\n propertyConfigs: Record<string, PropertyConfig>,\n collectionEditable: boolean;\n}) {\n\n const {\n values,\n setFieldValue\n } = useFormex<ArrayProperty>();\n\n const [propertyDialogOpen, setPropertyDialogOpen] = useState<boolean>(false);\n const [selectedPropertyKey, setSelectedPropertyKey] = useState<string | undefined>();\n const [selectedPropertyNamespace, setSelectedPropertyNamespace] = useState<string | undefined>();\n\n const onPropertyChanged = ({\n id,\n property\n }: { id?: string, property: Property }) => {\n if (!id)\n throw Error();\n\n setFieldValue(\"oneOf.properties\", {\n ...(values.oneOf?.properties ?? {}),\n [id]: property\n }, false);\n const currentPropertiesOrder = values.oneOf?.propertiesOrder ?? Object.keys(values.oneOf?.properties ?? {});\n const newPropertiesOrder = currentPropertiesOrder.includes(id) ? currentPropertiesOrder : [...currentPropertiesOrder, id];\n setFieldValue(\"oneOf.propertiesOrder\", newPropertiesOrder, false);\n setPropertyDialogOpen(false);\n };\n\n const selectedPropertyFullId = selectedPropertyKey ? getFullId(selectedPropertyKey, selectedPropertyNamespace) : undefined;\n const selectedProperty = selectedPropertyFullId ? getIn(values.oneOf?.properties, selectedPropertyFullId.replaceAll(\".\", \".properties.\")) : undefined;\n\n const deleteProperty = useCallback((propertyKey?: string, namespace?: string) => {\n const fullId = propertyKey ? getFullId(propertyKey, namespace) : undefined;\n if (!fullId)\n throw Error(\"collection editor miss config\");\n\n setFieldValue(`oneOf.${idToPropertiesPath(fullId)}`, undefined, false);\n const propertiesOrderPath = `oneOf.${namespaceToPropertiesOrderPath(namespace)}`;\n const currentPropertiesOrder: string[] = getIn(values, propertiesOrderPath);\n setFieldValue(propertiesOrderPath, currentPropertiesOrder.filter((p) => p !== propertyKey), false);\n\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }, [setFieldValue, values]);\n\n const addChildButton = <Button\n autoFocus\n color=\"primary\"\n\n onClick={() => setPropertyDialogOpen(true)}\n startIcon={<AddIcon/>}\n >\n Add property to {values.name ?? \"this block\"}\n </Button>;\n\n const onPropertyMove = useCallback((propertiesOrder: string[], namespace?: string) => {\n setFieldValue(`oneOf.${namespaceToPropertiesOrderPath(namespace)}`, propertiesOrder, false);\n }, []);\n\n return (\n <>\n <div className={\"col-span-12\"}>\n <div className={\"flex justify-between items-end mt-8 mb-4\"}>\n <Typography variant={\"subtitle2\"}>Properties in this\n block</Typography>\n {addChildButton}\n </div>\n <Paper className=\"p-2 pl-8\">\n\n <PropertyTree\n properties={values.oneOf?.properties ?? {}}\n propertiesOrder={values.oneOf?.propertiesOrder}\n errors={{}}\n collectionEditable={collectionEditable}\n onPropertyClick={disabled\n ? undefined\n : (propertyKey, namespace) => {\n setSelectedPropertyKey(propertyKey);\n setSelectedPropertyNamespace(namespace);\n setPropertyDialogOpen(true);\n }}\n onPropertyMove={disabled\n ? undefined\n : onPropertyMove}/>\n\n {!disabled && !values.oneOf?.propertiesOrder?.length &&\n <div className=\"h-full flex items-center justify-center p-4\">\n Add the first property to this block\n </div>}\n\n </Paper>\n </div>\n\n {!disabled && <PropertyFormDialog\n inArray={false}\n forceShowErrors={false}\n open={propertyDialogOpen}\n getData={getData}\n allowDataInference={allowDataInference}\n onCancel={() => {\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }}\n onOkClicked={() => {\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }}\n collectionEditable={collectionEditable}\n onDelete={deleteProperty}\n propertyKey={selectedPropertyKey}\n propertyNamespace={selectedPropertyNamespace}\n property={selectedProperty}\n existingProperty={Boolean(selectedPropertyKey)}\n autoUpdateId={!selectedPropertyKey}\n autoOpenTypeSelect={!selectedPropertyKey}\n onPropertyChanged={onPropertyChanged}\n existingPropertyKeys={selectedPropertyKey ? undefined : values.oneOf?.propertiesOrder}\n propertyConfigs={propertyConfigs}/>}\n\n </>);\n}\n","import React from \"react\";\n\nimport { Field, FormexFieldProps, getIn, useFormex } from \"@firecms/formex\";\nimport { DebouncedTextField } from \"@firecms/ui\";\nimport { GeneralPropertyValidation } from \"./GeneralPropertyValidation\";\nimport { SwitchControl } from \"../../SwitchControl\";\n\nexport function NumberPropertyValidation({ disabled }: {\n disabled: boolean;\n}) {\n\n const {\n values,\n handleChange\n } = useFormex();\n\n const validationMin = \"validation.min\";\n const validationMax = \"validation.max\";\n const validationLessThan = \"validation.lessThan\";\n const validationMoreThan = \"validation.moreThan\";\n const validationPositive = \"validation.positive\";\n const validationNegative = \"validation.negative\";\n const validationInteger = \"validation.integer\";\n\n return (\n\n <div className={\"grid grid-cols-12 gap-2\"}>\n <GeneralPropertyValidation disabled={disabled}/>\n\n\n <div className={\"col-span-6\"}>\n <DebouncedTextField value={getIn(values, validationMin)}\n label={\"Min value\"}\n name={validationMin}\n type=\"number\"\n size=\"small\"\n disabled={disabled}\n onChange={handleChange}/>\n </div>\n\n <div className={\"col-span-6\"}>\n <DebouncedTextField value={getIn(values, validationMax)}\n label={\"Max value\"}\n name={validationMax}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>\n\n\n <div className={\"col-span-6\"}>\n <DebouncedTextField\n value={getIn(values, validationLessThan)}\n label={\"Less than\"}\n name={validationLessThan}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>\n\n <div className={\"col-span-6\"}>\n <DebouncedTextField\n value={getIn(values, validationMoreThan)}\n label={\"More than\"}\n name={validationMoreThan}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>\n\n <div className={\"col-span-4\"}>\n <Field name={validationPositive}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Positive value\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n <div className={\"col-span-4\"}>\n <Field name={validationNegative}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Negative value\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n <div className={\"col-span-4\"}>\n <Field name={validationInteger}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Integer value\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { NumberPropertyValidation } from \"./validation/NumberPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { TextField } from \"@firecms/ui\";\nimport { getIn, useFormex } from \"@firecms/formex\";\n\nexport function NumberPropertyField({ disabled }: {\n disabled: boolean;\n}) {\n\n const { values, setFieldValue } = useFormex();\n\n return (\n <>\n\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n <NumberPropertyValidation disabled={disabled}/>\n </ValidationPanel>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <TextField name={\"defaultValue\"}\n disabled={disabled}\n type={\"number\"}\n onChange={(e: any) => {\n setFieldValue(\"defaultValue\", e.target.value === \"\" ? undefined : parseFloat(e.target.value));\n }}\n label={\"Default value\"}\n value={getIn(values, \"defaultValue\") ?? \"\"}/>\n\n </div>\n </>\n );\n}\n","import React from \"react\";\nimport { Field, getIn, useFormex } from \"@firecms/formex\";\nimport { IconForView, NumberProperty, StringProperty, useNavigationController } from \"@firecms/core\";\nimport { CircularProgress, Select, SelectGroup, SelectItem, Typography, } from \"@firecms/ui\";\nimport { FieldHelperView } from \"./FieldHelperView\";\n\nexport function ReferencePropertyField({\n existing,\n multiple,\n disabled,\n showErrors\n }: {\n existing: boolean,\n multiple: boolean,\n disabled: boolean,\n showErrors: boolean\n}) {\n\n const {\n values,\n handleChange,\n errors,\n } = useFormex<StringProperty | NumberProperty>();\n\n const navigation = useNavigationController();\n\n if (!navigation)\n return <div className={\"col-span-12\"}>\n <CircularProgress/>\n </div>;\n\n const pathPath = multiple ? \"of.path\" : \"path\";\n const pathValue: string | undefined = getIn(values, pathPath);\n const pathError: string | undefined = showErrors && getIn(errors, pathPath);\n\n return (\n <>\n <div className={\"col-span-12\"}>\n\n <Field name={pathPath}\n pathPath={pathPath}\n type=\"select\"\n disabled={(existing && Boolean(pathValue)) || disabled}\n value={pathValue}\n error={pathError}\n handleChange={handleChange}\n as={CollectionsSelect}/>\n\n </div>\n\n </>\n );\n}\n\nexport function CollectionsSelect({\n disabled,\n pathPath,\n value,\n handleChange,\n error,\n ...props\n }: {\n disabled: boolean,\n pathPath: string,\n value?: string,\n handleChange: (event: any) => void,\n error?: string\n}) {\n\n const navigation = useNavigationController();\n\n if (!navigation)\n return <div className={\"col-span-12\"}>\n <CircularProgress/>\n </div>;\n\n const collections = navigation?.collections ?? [];\n\n const groups: string[] = Array.from(new Set(\n Object.values(collections).map(e => e.group).filter(Boolean) as string[]\n ).values());\n\n const ungroupedCollections = collections.filter((col) => !col.group);\n\n return (\n <>\n <Select\n error={Boolean(error)}\n disabled={disabled}\n value={value ?? \"\"}\n position={\"item-aligned\"}\n name={pathPath}\n onChange={handleChange}\n label={\"Target collection\"}\n renderValue={(selected) => {\n const selectedCollection = collections.find(collection => collection.id === selected || collection.path === selected);\n if (!selectedCollection) return null;\n return (\n <div className=\"flex flex-row\">\n <IconForView collectionOrView={selectedCollection}/>\n <Typography\n variant={\"subtitle2\"}\n className=\"font-medium ml-4\">\n {selectedCollection?.name.toUpperCase()}\n </Typography>\n </div>)\n }}\n {...props}>\n\n {groups.flatMap((group) => (\n <SelectGroup label={group || \"Views\"}\n key={`group_${group}`}>\n {\n collections.filter(collection => collection.group === group)\n .map((collection) => {\n return <SelectItem\n key={`${collection.id ?? collection.path}-${group}`}\n value={collection.id ?? collection.path}>\n <div className=\"flex flex-row\">\n <IconForView collectionOrView={collection}/>\n <Typography\n variant={\"subtitle2\"}\n className=\"font-medium ml-4\">\n {collection?.name.toUpperCase()}\n </Typography>\n </div>\n </SelectItem>;\n })\n\n }\n </SelectGroup>\n ))}\n\n {ungroupedCollections && <SelectGroup label={\"Views\"}>\n {ungroupedCollections\n .map((collection) => {\n return <SelectItem key={collection.id ?? collection.path}\n value={collection.id ?? collection.path}>\n <div className=\"flex flex-row\">\n <IconForView collectionOrView={collection}/>\n <Typography\n variant={\"subtitle2\"}\n className=\"font-medium ml-4\">\n {collection?.name.toUpperCase()}\n </Typography>\n </div>\n </SelectItem>;\n })\n\n }\n </SelectGroup>}\n\n </Select>\n\n <FieldHelperView>\n You can only edit the reference collection upon field\n creation.\n </FieldHelperView>\n </>\n );\n}\n","import React from \"react\";\nimport { getIn, useFormex } from \"@firecms/formex\";\nimport { NumberProperty, StringProperty } from \"@firecms/core\";\nimport { Select, SelectItem } from \"@firecms/ui\";\nimport { GeneralPropertyValidation } from \"./validation/GeneralPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { FieldHelperView } from \"./FieldHelperView\";\n\nexport function DateTimePropertyField({ disabled }: {\n disabled: boolean;\n}) {\n\n const {\n values,\n errors,\n touched,\n setFieldValue\n } = useFormex<StringProperty | NumberProperty>();\n\n const modePath = \"mode\";\n const modeValue: string | undefined = getIn(values, modePath);\n const modeError: string | undefined = getIn(touched, modePath) && getIn(errors, modePath);\n\n const autoValuePath = \"autoValue\";\n const autoValueValue: string | undefined = getIn(values, autoValuePath);\n const autoValueError: string | undefined = getIn(touched, autoValuePath) && getIn(errors, autoValuePath);\n\n return (\n <>\n <div className={\"flex flex-col col-span-12\"}>\n <Select name={modePath}\n value={modeValue ?? \"date\"}\n error={Boolean(modeError)}\n onValueChange={(v) => setFieldValue(modePath, v)}\n label={\"Mode\"}\n renderValue={(v) => {\n switch (v) {\n case \"date_time\":\n return \"Date/Time\";\n case \"date\":\n return \"Date\";\n default:\n return \"\";\n }\n }}\n disabled={disabled}>\n <SelectItem value={\"date_time\"}> Date/Time </SelectItem>\n <SelectItem value={\"date\"}> Date </SelectItem>\n </Select>\n <FieldHelperView error={Boolean(modeError)}>\n {modeError}\n </FieldHelperView>\n\n <Select name={autoValuePath}\n disabled={disabled}\n value={autoValueValue ?? \"\"}\n onValueChange={(v) => setFieldValue(autoValuePath, v)}\n renderValue={(v) => {\n switch (v) {\n case \"on_create\":\n return \"On create\";\n case \"on_update\":\n return \"On any update\";\n default:\n return \"None\";\n }\n }}\n error={Boolean(autoValueError)}\n label={\"Automatic value\"}>\n <SelectItem value={\"\"}> None </SelectItem>\n <SelectItem value={\"on_create\"}> On create </SelectItem>\n <SelectItem value={\"on_update\"}> On any update </SelectItem>\n </Select>\n <FieldHelperView error={Boolean(autoValueError)}>\n {autoValueError ?? \"Update this field automatically when creating or updating the entity\"}\n </FieldHelperView>\n\n </div>\n\n <div className={\"col-span-12\"}>\n <ValidationPanel>\n <GeneralPropertyValidation disabled={disabled}/>\n </ValidationPanel>\n </div>\n </>\n );\n}\n","import React from \"react\";\n\nimport { Field, FormexFieldProps } from \"@firecms/formex\";\nimport { SwitchControl } from \"../../SwitchControl\";\n\nexport function AdvancedPropertyValidation({ disabled }: {\n disabled: boolean\n}) {\n\n const columnWidth = \"columnWidth\";\n const hideFromCollection = \"hideFromCollection\";\n const readOnly = \"readOnly\";\n\n return (\n\n <div className={\"grid grid-cols-12 gap-2\"}>\n <div className={\"col-span-12\"}>\n <Field type=\"checkbox\" name={hideFromCollection}>\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Hide from collection\"}\n disabled={disabled}\n form={form}\n tooltip={\"Hide this field from the collection view. It will still be visible in the form view\"}\n field={field}/>\n }}\n </Field>\n </div>\n\n <div className={\"col-span-12\"}>\n <Field name={readOnly}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Read only\"}\n disabled={disabled}\n tooltip={\"Is this a read only field. Display only as a preview\"}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { GeneralPropertyValidation } from \"./validation/GeneralPropertyValidation\";\n\nexport function KeyValuePropertyField({ disabled }: {\n disabled: boolean;\n}) {\n\n return (\n <>\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n <GeneralPropertyValidation disabled={disabled}/>\n </ValidationPanel>\n\n </div>\n </>\n );\n}\n","import {\n ArrayProperty,\n BooleanProperty,\n DateProperty,\n MapProperty,\n mergeDeep,\n NumberProperty,\n Property,\n PropertyConfig,\n StringProperty\n} from \"@firecms/core\";\n\nexport function updatePropertyFromWidget(propertyData: any,\n selectedWidgetId: string | undefined,\n propertyConfigs: Record<string, PropertyConfig>): Property {\n\n let updatedProperty;\n if (selectedWidgetId === \"text_field\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"text_field\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: undefined,\n multiline: undefined,\n markdown: undefined,\n email: undefined,\n url: undefined,\n enumValues: undefined\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"multiline\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"multiline\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n multiline: true,\n storage: undefined,\n markdown: undefined,\n email: undefined,\n url: undefined,\n enumValues: undefined\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"markdown\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"markdown\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: undefined,\n multiline: undefined,\n markdown: true,\n email: undefined,\n url: undefined\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"url\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"url\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: undefined,\n multiline: undefined,\n markdown: undefined,\n email: undefined,\n url: true,\n enumValues: undefined\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"email\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"email\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: undefined,\n multiline: undefined,\n markdown: undefined,\n email: true,\n url: undefined,\n enumValues: undefined\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"select\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"select\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: undefined,\n multiline: undefined,\n markdown: undefined,\n email: undefined,\n url: undefined,\n enumValues: propertyData.enumValues ?? []\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"multi_select\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"multi_select\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n of: {\n dataType: \"string\",\n enumValues: propertyData.of?.enumValues ?? []\n }\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId === \"number_input\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"number\",\n propertyConfig: \"number_input\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n enumValues: undefined\n } satisfies NumberProperty\n );\n } else if (selectedWidgetId === \"number_select\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"number\",\n propertyConfig: \"number_select\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n enumValues: propertyData.enumValues ?? []\n } satisfies NumberProperty\n );\n } else if (selectedWidgetId === \"multi_number_select\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"multi_number_select\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n of: {\n dataType: \"number\",\n enumValues: propertyData.of?.enumValues ?? []\n }\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId === \"file_upload\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"file_upload\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: {\n storagePath: \"/\"\n }\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"multi_file_upload\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"multi_file_upload\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n of: {\n dataType: \"string\",\n storage: propertyData.of?.storage ?? {\n storagePath: \"/\"\n }\n }\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId === \"group\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"map\",\n propertyConfig: \"group\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n keyValue: false,\n properties: propertyData.properties ?? {}\n } satisfies MapProperty\n );\n } else if (selectedWidgetId === \"key_value\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"map\",\n propertyConfig: \"key_value\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n keyValue: true,\n properties: undefined\n } satisfies MapProperty\n );\n } else if (selectedWidgetId === \"reference\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"reference\",\n propertyConfig: \"reference\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true\n } satisfies Property\n );\n } else if (selectedWidgetId === \"multi_references\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"multi_references\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n of: {\n dataType: \"reference\"\n }\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId === \"switch\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"boolean\",\n propertyConfig: \"switch\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true\n } satisfies BooleanProperty\n );\n } else if (selectedWidgetId === \"date_time\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"date\",\n propertyConfig: \"date_time\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n mode: \"date_time\"\n } satisfies DateProperty\n );\n } else if (selectedWidgetId === \"repeat\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"repeat\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId === \"block\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"block\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n oneOf: {\n properties: {}\n }\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId && propertyConfigs[selectedWidgetId]) {\n updatedProperty = {\n ...propertyConfigs[selectedWidgetId].property,\n propertyConfig: selectedWidgetId\n };\n }\n\n return updatedProperty;\n}\n","import { PropertyConfigBadge, PropertyConfig } from \"@firecms/core\";\nimport { cn, SelectItem, Typography } from \"@firecms/ui\";\n\nexport interface PropertySelectItemProps {\n value: string;\n optionDisabled: boolean;\n propertyConfig: PropertyConfig;\n existing: boolean;\n}\n\nexport function PropertySelectItem({ value, optionDisabled, propertyConfig, existing }: PropertySelectItemProps) {\n return <SelectItem value={value}\n disabled={optionDisabled}\n className={\"flex flex-row items-center\"}>\n <div\n className={cn(\n \"flex flex-row items-center text-base min-h-[52px]\",\n optionDisabled ? \"w-full\" : \"\")}>\n <div className={\"mr-8\"}>\n <PropertyConfigBadge propertyConfig={propertyConfig}/>\n </div>\n <div>\n <div>{propertyConfig.name}</div>\n <Typography variant={\"caption\"}\n color={\"disabled\"}\n className={\"max-w-sm\"}>\n {existing && optionDisabled ? \"You can only switch to widgets that use the same data type\" : propertyConfig.description}\n </Typography>\n </div>\n </div>\n </SelectItem>\n}\n","import React from \"react\";\nimport { StringPropertyValidation } from \"./validation/StringPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { getIn, useFormex } from \"@firecms/formex\";\n\nimport { Select, SelectItem, TextField } from \"@firecms/ui\";\n\nexport function UrlPropertyField({\n disabled,\n showErrors\n }: {\n disabled: boolean;\n showErrors: boolean;\n}) {\n\n const { values, setFieldValue } = useFormex();\n\n const urlValue = getIn(values, \"url\");\n\n return (\n <>\n <div className={\"col-span-12\"}>\n\n <Select\n disabled={disabled}\n position={\"item-aligned\"}\n onValueChange={(value: string) => {\n if (value === \"[NONE]\")\n setFieldValue(\"url\", true);\n else\n setFieldValue(\"url\", value);\n }}\n label={\"Preview type\"}\n renderValue={(value: string) => {\n switch (value) {\n case \"image\":\n return \"Image\";\n case \"video\":\n return \"Video\";\n case \"audio\":\n return \"Audio\";\n default:\n return \"Display URL\";\n }\n }}\n value={urlValue ?? \"[NONE]\"}>\n <SelectItem value={\"[NONE]\"}>\n Display URL\n </SelectItem>\n <SelectItem value={\"image\"}>\n Image\n </SelectItem>\n <SelectItem value={\"video\"}>\n Video\n </SelectItem>\n <SelectItem value={\"audio\"}>\n Audio\n </SelectItem>\n </Select>\n </div>\n\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n\n <StringPropertyValidation disabled={disabled}\n max={true}\n min={true}\n trim={true}\n showErrors={showErrors}/>\n\n </ValidationPanel>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <TextField name={\"defaultValue\"}\n disabled={disabled}\n onChange={(e: any) => {\n setFieldValue(\"defaultValue\", e.target.value === \"\" ? undefined : e.target.value);\n }}\n label={\"Default value\"}\n value={getIn(values, \"defaultValue\") ?? \"\"}/>\n\n </div>\n </>\n );\n}\n","import { DEFAULT_FIELD_CONFIGS, FieldConfigId, PropertyConfig } from \"@firecms/core\";\n\nexport const supportedFieldsIds: FieldConfigId[] = [\n \"text_field\",\n \"multiline\",\n \"markdown\",\n \"url\",\n \"email\",\n \"select\",\n \"multi_select\",\n \"number_input\",\n \"number_select\",\n \"multi_number_select\",\n \"file_upload\",\n \"multi_file_upload\",\n \"reference\",\n \"multi_references\",\n \"switch\",\n \"date_time\",\n \"group\",\n \"key_value\",\n \"repeat\",\n \"block\"\n];\n\nexport const supportedFields: Record<string, PropertyConfig> = Object.entries(DEFAULT_FIELD_CONFIGS)\n .filter(([id]) => supportedFieldsIds.includes(id as FieldConfigId))\n .map(([id, config]) => ({ [id]: config }))\n .reduce((a, b) => ({ ...a, ...b }), {});\n","import React, { useDeferredValue, useEffect, useRef, useState } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { Formex, FormexController, getIn, useCreateFormex } from \"@firecms/formex\";\nimport {\n DEFAULT_FIELD_CONFIGS,\n DeleteConfirmationDialog,\n FieldConfigId,\n getFieldConfig,\n getFieldId,\n isPropertyBuilder,\n isValidRegExp,\n mergeDeep,\n Property,\n PropertyConfig,\n PropertyConfigBadge,\n} from \"@firecms/core\";\nimport {\n Button,\n cn,\n DeleteIcon,\n Dialog,\n DialogActions,\n DialogContent,\n IconButton,\n InfoLabel,\n Select,\n Typography\n} from \"@firecms/ui\";\nimport { EnumPropertyField } from \"./properties/EnumPropertyField\";\nimport { StoragePropertyField } from \"./properties/StoragePropertyField\";\nimport { MapPropertyField } from \"./properties/MapPropertyField\";\nimport { RepeatPropertyField } from \"./properties/RepeatPropertyField\";\nimport { CommonPropertyFields } from \"./properties/CommonPropertyFields\";\nimport { StringPropertyField } from \"./properties/StringPropertyField\";\nimport { BooleanPropertyField } from \"./properties/BooleanPropertyField\";\nimport { BlockPropertyField } from \"./properties/BlockPropertyField\";\nimport { NumberPropertyField } from \"./properties/NumberPropertyField\";\nimport { ReferencePropertyField } from \"./properties/ReferencePropertyField\";\nimport { DateTimePropertyField } from \"./properties/DateTimePropertyField\";\nimport { AdvancedPropertyValidation } from \"./properties/advanced/AdvancedPropertyValidation\";\nimport { editableProperty } from \"../../utils/entities\";\nimport { KeyValuePropertyField } from \"./properties/KeyValuePropertyField\";\nimport { updatePropertyFromWidget } from \"./utils/update_property_for_widget\";\nimport { PropertySelectItem } from \"./PropertySelectItem\";\nimport { UrlPropertyField } from \"./properties/UrlPropertyField\";\nimport { supportedFields } from \"./utils/supported_fields\";\n\nexport type PropertyWithId = Property & {\n id?: string\n};\n\nexport type OnPropertyChangedParams = {\n id?: string,\n property: Property,\n namespace?: string,\n previousId?: string\n};\n\nexport type PropertyFormProps = {\n includeIdAndName?: boolean;\n existingProperty: boolean;\n autoUpdateId?: boolean;\n autoOpenTypeSelect: boolean;\n inArray: boolean;\n propertyKey?: string;\n propertyNamespace?: string;\n property?: Property;\n onPropertyChanged?: (params: OnPropertyChangedParams) => void;\n onPropertyChangedImmediate?: boolean;\n onDelete?: (id?: string, namespace?: string) => void;\n onError?: (id: string, namespace?: string, error?: Record<string, any>) => void;\n initialErrors?: Record<string, any>;\n existingPropertyKeys?: string[];\n forceShowErrors?: boolean;\n allowDataInference: boolean;\n getData?: () => Promise<object[]>;\n getController?: (formex: FormexController<PropertyWithId>) => void;\n propertyConfigs: Record<string, PropertyConfig>;\n collectionEditable: boolean;\n};\n\nexport const PropertyForm = React.memo(\n function PropertyForm(props: PropertyFormProps) {\n\n const {\n includeIdAndName = true,\n autoOpenTypeSelect,\n existingProperty,\n autoUpdateId,\n inArray,\n propertyKey,\n existingPropertyKeys,\n propertyNamespace,\n property,\n onPropertyChanged,\n onPropertyChangedImmediate = true,\n onDelete,\n onError,\n initialErrors,\n forceShowErrors,\n allowDataInference,\n getController,\n getData,\n propertyConfigs,\n collectionEditable\n } = props;\n\n const initialValue: PropertyWithId = {\n id: \"\",\n name: \"\"\n } as PropertyWithId;\n\n const disabled = (Boolean(property && !editableProperty(property)) && !collectionEditable);\n\n const lastSubmittedProperty = useRef<OnPropertyChangedParams | undefined>(property ? {\n id: propertyKey,\n previousId: propertyKey,\n property\n } : undefined);\n\n const doOnPropertyChanged = ({\n id,\n property\n }: OnPropertyChangedParams) => {\n const params = {\n id,\n previousId: lastSubmittedProperty.current?.id,\n property,\n namespace: propertyNamespace\n };\n lastSubmittedProperty.current = params;\n onPropertyChanged?.(params);\n };\n\n const formexController = useCreateFormex<PropertyWithId>({\n initialValues: property\n ? { id: propertyKey, ...property } as PropertyWithId\n : initialValue,\n initialErrors,\n validateOnChange: true,\n validateOnInitialRender: true,\n onSubmit: (newPropertyWithId, controller) => {\n console.debug(\"onSubmit\", newPropertyWithId);\n const {\n id,\n ...property\n } = newPropertyWithId;\n doOnPropertyChanged({\n id,\n property: { ...property, editable: property.editable ?? true }\n });\n if (!existingProperty)\n controller.resetForm({ values: initialValue });\n },\n validation: (values) => {\n const errors: Record<string, any> = {};\n if (includeIdAndName) {\n if (!values.name) {\n errors.name = \"Required\";\n } else {\n const nameError = validateName(values.name);\n if (nameError)\n errors.name = nameError;\n }\n if (!values.id) {\n errors.id = \"Required\";\n } else {\n const idError = validateId(values.id, existingPropertyKeys);\n if (idError)\n errors.id = idError;\n }\n }\n\n if (values.dataType === \"string\") {\n if (values.validation?.matches && !isValidRegExp(values.validation?.matches.toString())) {\n errors.validation = {\n matches: \"Invalid regular expression\"\n }\n }\n }\n if (values.dataType === \"reference\" && !values.path) {\n errors.path = \"You must specify a target collection for the field\";\n }\n if (values.propertyConfig === \"repeat\") {\n if (!(values as any).of) {\n errors.of = \"You need to specify a repeat field\";\n }\n }\n if (values.propertyConfig === \"block\") {\n if (!(values as any).oneOf) {\n errors.oneOf = \"You need to specify the properties of this block\";\n }\n }\n return errors;\n }\n });\n\n useEffect(() => {\n getController?.(formexController);\n }, [formexController, getController]);\n\n return <Formex value={formexController}>\n <PropertyEditFormFields\n onPropertyChanged={onPropertyChangedImmediate\n ? doOnPropertyChanged\n : undefined}\n onDelete={onDelete}\n includeIdAndTitle={includeIdAndName}\n propertyNamespace={propertyNamespace}\n onError={onError}\n showErrors={forceShowErrors || formexController.submitCount > 0}\n existing={existingProperty}\n autoUpdateId={autoUpdateId}\n inArray={inArray}\n autoOpenTypeSelect={autoOpenTypeSelect}\n disabled={disabled}\n getData={getData}\n allowDataInference={allowDataInference}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n {...formexController}/>\n </Formex>;\n }, (a, b) =>\n a.getData === b.getData &&\n a.propertyKey === b.propertyKey &&\n a.propertyNamespace === b.propertyNamespace &&\n a.includeIdAndName === b.includeIdAndName &&\n a.autoOpenTypeSelect === b.autoOpenTypeSelect &&\n a.autoUpdateId === b.autoUpdateId &&\n a.existingProperty === b.existingProperty\n);\n\nexport function PropertyFormDialog({\n open,\n onCancel,\n onOkClicked,\n onPropertyChanged,\n getData,\n collectionEditable,\n ...formProps\n }: PropertyFormProps & {\n open?: boolean;\n onOkClicked?: () => void;\n onCancel?: () => void;\n}) {\n const formexRef = useRef<FormexController<PropertyWithId>>();\n const getController = (helpers: FormexController<PropertyWithId>) => {\n formexRef.current = helpers;\n };\n\n return <Dialog\n open={open ?? false}\n maxWidth={\"xl\"}\n fullWidth={true}\n >\n <form noValidate={true}\n autoComplete={\"off\"}\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n formexRef.current?.handleSubmit(e)\n }}>\n <DialogContent>\n <PropertyForm {...formProps}\n onPropertyChanged={(params) => {\n onPropertyChanged?.(params);\n onOkClicked?.();\n }}\n collectionEditable={collectionEditable}\n onPropertyChangedImmediate={false}\n getController={getController}\n getData={getData}\n />\n </DialogContent>\n\n <DialogActions>\n\n {onCancel && <Button\n variant={\"text\"}\n onClick={() => {\n onCancel();\n formexRef.current?.resetForm();\n }}>\n Cancel\n </Button>}\n\n <Button variant=\"outlined\"\n type={\"submit\"}\n color=\"primary\">\n Ok\n </Button>\n </DialogActions>\n </form>\n </Dialog>;\n\n}\n\nfunction PropertyEditFormFields({\n values,\n errors,\n setValues,\n existing,\n autoUpdateId = false,\n autoOpenTypeSelect,\n includeIdAndTitle,\n onPropertyChanged,\n onDelete,\n propertyNamespace,\n onError,\n showErrors,\n disabled,\n inArray,\n getData,\n allowDataInference,\n propertyConfigs,\n collectionEditable\n }: {\n includeIdAndTitle?: boolean;\n existing: boolean;\n autoUpdateId?: boolean;\n autoOpenTypeSelect: boolean;\n propertyNamespace?: string;\n onPropertyChanged?: (params: OnPropertyChangedParams) => void;\n onDelete?: (id?: string, namespace?: string) => void;\n onError?: (id: string, namespace?: string, error?: Record<string, any>) => void;\n showErrors: boolean;\n inArray: boolean;\n disabled: boolean;\n getData?: () => Promise<object[]>;\n allowDataInference: boolean;\n propertyConfigs: Record<string, PropertyConfig>;\n collectionEditable: boolean;\n} & FormexController<PropertyWithId>) {\n\n const [selectOpen, setSelectOpen] = useState(autoOpenTypeSelect);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [selectedFieldConfigId, setSelectedFieldConfigId] = useState<string | undefined>(values?.dataType ? getFieldId(values) : undefined);\n\n const allSupportedFields = Object.entries(supportedFields).concat(Object.entries(propertyConfigs));\n\n const displayedWidgets = inArray\n ? allSupportedFields.filter(([_, propertyConfig]) => !isPropertyBuilder(propertyConfig.property) && propertyConfig.property?.dataType !== \"array\")\n : allSupportedFields;\n\n const deferredValues = useDeferredValue(values);\n const nameFieldRef = useRef<HTMLInputElement>(null);\n\n const lastSubmittedProperty = useRef<object>(values);\n\n const selectedWidgetError = showErrors && getIn(errors, \"selectedWidget\");\n\n useEffect(() => {\n if (onPropertyChanged) {\n if ((!includeIdAndTitle || deferredValues.id)) {\n const {\n id,\n ...property\n } = deferredValues;\n if (!equal(deferredValues, lastSubmittedProperty.current)) {\n onPropertyChanged({\n id,\n property,\n namespace: propertyNamespace\n });\n lastSubmittedProperty.current = deferredValues;\n }\n }\n }\n }, [deferredValues, includeIdAndTitle, onPropertyChanged, propertyNamespace]);\n\n useEffect(() => {\n if (values?.id && onError) {\n onError(values?.id, propertyNamespace, errors);\n }\n }, [errors, onError, propertyNamespace, values?.id]);\n\n const onWidgetSelectChanged = (newSelectedWidgetId: FieldConfigId) => {\n setSelectedFieldConfigId(newSelectedWidgetId);\n setValues(updatePropertyFromWidget(values, newSelectedWidgetId, propertyConfigs));\n // Ugly hack to autofocus the name field\n setTimeout(() => {\n nameFieldRef.current?.focus();\n }, 0);\n };\n\n let childComponent;\n if (selectedFieldConfigId === \"text_field\" ||\n selectedFieldConfigId === \"multiline\" ||\n selectedFieldConfigId === \"markdown\" ||\n selectedFieldConfigId === \"email\") {\n childComponent =\n <StringPropertyField widgetId={selectedFieldConfigId}\n disabled={disabled}\n showErrors={showErrors}/>;\n } else if (selectedFieldConfigId === \"url\") {\n childComponent =\n <UrlPropertyField disabled={disabled}\n showErrors={showErrors}/>;\n } else if (selectedFieldConfigId === \"select\" ||\n selectedFieldConfigId === \"number_select\") {\n childComponent = <EnumPropertyField\n multiselect={false}\n allowDataInference={allowDataInference}\n updateIds={!existing}\n disabled={disabled}\n getData={getData}\n showErrors={showErrors}/>;\n } else if (selectedFieldConfigId === \"multi_select\" ||\n selectedFieldConfigId === \"multi_number_select\") {\n childComponent = <EnumPropertyField\n multiselect={true}\n updateIds={!existing}\n disabled={disabled}\n allowDataInference={allowDataInference}\n getData={getData}\n showErrors={showErrors}/>;\n } else if (selectedFieldConfigId === \"file_upload\") {\n childComponent =\n <StoragePropertyField existing={existing}\n multiple={false}\n disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"multi_file_upload\") {\n childComponent =\n <StoragePropertyField existing={existing}\n multiple={true}\n disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"switch\") {\n childComponent = <BooleanPropertyField disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"number_input\") {\n childComponent = <NumberPropertyField disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"group\") {\n childComponent =\n <MapPropertyField disabled={disabled} getData={getData} allowDataInference={allowDataInference}\n collectionEditable={collectionEditable}\n propertyConfigs={propertyConfigs}/>;\n } else if (selectedFieldConfigId === \"block\") {\n childComponent =\n <BlockPropertyField disabled={disabled} getData={getData} allowDataInference={allowDataInference}\n collectionEditable={collectionEditable}\n propertyConfigs={propertyConfigs}/>;\n } else if (selectedFieldConfigId === \"reference\") {\n childComponent =\n <ReferencePropertyField showErrors={showErrors}\n existing={existing}\n multiple={false}\n disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"date_time\") {\n childComponent = <DateTimePropertyField disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"multi_references\") {\n childComponent =\n <ReferencePropertyField showErrors={showErrors}\n existing={existing}\n multiple={true}\n disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"repeat\") {\n childComponent =\n <RepeatPropertyField showErrors={showErrors}\n existing={existing}\n getData={getData}\n allowDataInference={allowDataInference}\n disabled={disabled}\n collectionEditable={collectionEditable}\n propertyConfigs={propertyConfigs}/>;\n } else if (selectedFieldConfigId === \"key_value\") {\n childComponent =\n <KeyValuePropertyField disabled={disabled}/>;\n } else {\n childComponent = null;\n }\n\n return (\n <>\n {disabled && <InfoLabel mode={\"warn\"}>\n <Typography>This property can&apos;t be edited</Typography>\n <Typography variant={\"caption\"}>\n You may not have permission to\n edit it or it is defined in code with no <code>editable</code> flag\n </Typography>\n </InfoLabel>}\n\n <div className=\"flex mt-2 justify-between\">\n <div className={\"w-full flex flex-col gap-2\"}>\n <Select\n // className={\"w-full\"}\n error={Boolean(selectedWidgetError)}\n value={selectedFieldConfigId ?? \"\"}\n placeholder={\"Select a property widget\"}\n open={selectOpen}\n onOpenChange={setSelectOpen}\n position={\"item-aligned\"}\n disabled={disabled}\n renderValue={(value) => {\n if (!value) {\n return <em>Select a property\n widget</em>;\n }\n const key = value as FieldConfigId;\n const propertyConfig = DEFAULT_FIELD_CONFIGS[key] ?? propertyConfigs[key];\n const baseProperty = propertyConfig.property;\n const baseFieldConfig = baseProperty && !isPropertyBuilder(baseProperty) ? getFieldConfig(baseProperty, propertyConfigs) : undefined;\n const optionDisabled = isPropertyBuilder(baseProperty) || (existing && baseProperty.dataType !== values?.dataType);\n const computedFieldConfig = baseFieldConfig ? mergeDeep(baseFieldConfig, propertyConfig) : propertyConfig;\n return <div\n onClick={(e) => {\n if (optionDisabled) {\n e.stopPropagation();\n e.preventDefault();\n }\n }}\n className={cn(\n \"flex items-center\",\n optionDisabled ? \"w-full pointer-events-none opacity-50\" : \"\")}>\n <div className={\"mr-8\"}>\n <PropertyConfigBadge propertyConfig={computedFieldConfig}/>\n </div>\n <div className={\"flex flex-col items-start text-base text-left\"}>\n <div>{computedFieldConfig.name}</div>\n <Typography variant={\"caption\"}\n color={\"disabled\"}>\n {optionDisabled ? \"You can only switch to widgets that use the same data type\" : computedFieldConfig.description}\n </Typography>\n </div>\n </div>\n }}\n onValueChange={(value) => {\n onWidgetSelectChanged(value as FieldConfigId);\n }}>\n {displayedWidgets.map(([key, propertyConfig]) => {\n const baseProperty = propertyConfig.property;\n const optionDisabled = existing && !isPropertyBuilder(baseProperty) && baseProperty.dataType !== values?.dataType;\n return <PropertySelectItem\n key={key}\n value={key}\n optionDisabled={optionDisabled}\n propertyConfig={propertyConfig}\n existing={existing}/>;\n })}\n </Select>\n\n {selectedWidgetError &&\n <Typography variant=\"caption\"\n className={\"ml-3.5\"}\n color={\"error\"}>Required</Typography>}\n\n {/*<Typography variant=\"caption\" className={\"ml-3.5\"}>Define your own custom properties and*/}\n {/* components</Typography>*/}\n\n </div>\n\n {onDelete && values?.id &&\n <IconButton\n variant={\"ghost\"}\n className=\"m-4\"\n disabled={disabled}\n onClick={() => setDeleteDialogOpen(true)}>\n <DeleteIcon/>\n </IconButton>}\n </div>\n\n <div className={\"grid grid-cols-12 gap-y-12 mt-8 mb-8\"}>\n {includeIdAndTitle &&\n <CommonPropertyFields showErrors={showErrors}\n disabledId={existing}\n isNewProperty={!existing}\n disabled={disabled}\n autoUpdateId={autoUpdateId}\n ref={nameFieldRef}/>}\n\n {childComponent}\n\n <div className={\"col-span-12\"}>\n <AdvancedPropertyValidation disabled={disabled}/>\n </div>\n </div>\n\n {onDelete &&\n <DeleteConfirmationDialog open={deleteDialogOpen}\n onAccept={() => onDelete(values?.id, propertyNamespace)}\n onCancel={() => setDeleteDialogOpen(false)}\n title={<div>Delete this property?</div>}\n body={\n <div> This will <b>not delete any\n data</b>, only modify the\n collection.</div>\n }/>}\n\n </>\n );\n}\n\nconst idRegEx = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n\nfunction validateId(value?: string, existingPropertyKeys?: string[]) {\n\n let error;\n if (!value) {\n error = \"You must specify an id for the field\";\n }\n if (value && !value.match(idRegEx)) {\n error = \"The id can only contain letters, numbers and underscores (_), and not start with a number\";\n }\n if (value && existingPropertyKeys && existingPropertyKeys.includes(value)) {\n error = \"There is another field with this ID already\";\n }\n return error;\n}\n\nfunction validateName(value: string) {\n let error;\n if (!value) {\n error = \"You must specify a title for the field\";\n }\n return error;\n}\n","export function camelCase(str: string): string {\n if (!str) return \"\";\n return (str.slice(0, 1).toLowerCase() + str.slice(1))\n .replace(/([-_ ]){1,}/g, \" \")\n .split(/[-_ ]/)\n .reduce((cur, acc) => {\n return cur + acc[0].toUpperCase() + acc.substring(1);\n }, \"\");\n}\n","import { EntityCollection, useSnackbarController } from \"@firecms/core\";\nimport { Button, ContentCopyIcon, Dialog, DialogActions, DialogContent, Typography, } from \"@firecms/ui\";\nimport React from \"react\";\nimport JSON5 from \"json5\";\nimport { Highlight, themes } from \"prism-react-renderer\"\nimport { camelCase } from \"./utils/strings\";\n\nexport function GetCodeDialog({ collection, onOpenChange, open }: { onOpenChange: (open: boolean) => void, collection: any, open: any }) {\n\n const snackbarController = useSnackbarController();\n\n const code = \"import { EntityCollection } from \\\"firecms\\\";\\n\\nconst \" + (collection.name ? camelCase(collection.name) : \"my\") + \"Collection:EntityCollection = \" + JSON5.stringify(collectionToCode(collection), null, \"\\t\");\n return <Dialog open={open}\n onOpenChange={onOpenChange}\n maxWidth={\"4xl\"}>\n <DialogContent>\n <Typography variant={\"h6\"} className={\"my-4\"}>\n Code for {collection.name}\n </Typography>\n <Typography variant={\"body2\"} className={\"my-4 mb-8\"}>\n If you want to customise the collection in code, you can add this collection code to your CMS\n app configuration.\n More info in the <a\n rel=\"noopener noreferrer\"\n href={\"https://firecms.co/docs/customization_quickstart\"}>docs</a>.\n </Typography>\n <Highlight\n theme={themes.vsDark}\n code={code}\n language=\"typescript\"\n >\n {({ className, style, tokens, getLineProps, getTokenProps }) => (\n <pre style={style} className={\"p-4 rounded text-sm\"}>\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))}\n </div>\n ))}\n </pre>\n )}\n </Highlight>\n\n </DialogContent>\n <DialogActions>\n <Button\n variant={\"text\"}\n size={\"small\"}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n snackbarController.open({\n type: \"success\",\n message: `Copied`\n })\n return navigator.clipboard.writeText(code);\n }}>\n <ContentCopyIcon size={\"small\"}/>\n Copy to clipboard\n </Button>\n <Button onClick={() => onOpenChange(false)}>Close</Button>\n </DialogActions>\n </Dialog>;\n}\n\nfunction collectionToCode(collection: EntityCollection): object {\n\n const propertyCleanup = (property: any) => {\n\n const updatedProperty = {\n ...property\n };\n\n delete updatedProperty.fromBuilder;\n delete updatedProperty.resolved;\n delete updatedProperty.propertiesOrder;\n delete updatedProperty.editable;\n\n if (updatedProperty.type === \"map\") {\n return {\n ...updatedProperty,\n properties: updatedProperty.properties.map(propertyCleanup)\n }\n }\n return updatedProperty;\n }\n\n return {\n id: collection.id,\n name: collection.name,\n singularName: collection.singularName,\n path: collection.path,\n description: collection.description,\n editable: true,\n collectionGroup: collection.collectionGroup,\n icon: collection.icon,\n group: collection.group,\n customId: collection.customId,\n initialFilter: collection.initialFilter,\n initialSort: collection.initialSort,\n properties: Object.entries(collection.properties ?? {})\n .map(([key, value]) => ({\n [key]: propertyCleanup(value)\n }))\n .reduce((a, b) => ({ ...a, ...b }), {}),\n subcollections: (collection.subcollections ?? []).map(collectionToCode)\n }\n\n}\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport { Field, getIn, useFormex } from \"@firecms/formex\";\nimport {\n EntityCollection,\n ErrorBoundary,\n isPropertyBuilder,\n makePropertiesEditable,\n Properties,\n Property,\n PropertyConfig,\n PropertyOrBuilder,\n useLargeLayout,\n User,\n useSnackbarController\n} from \"@firecms/core\";\nimport {\n AddIcon,\n AutoAwesomeIcon,\n Button,\n CircularProgress,\n cn,\n CodeIcon,\n DebouncedTextField,\n defaultBorderMixin,\n IconButton,\n Paper,\n Tooltip,\n Typography,\n} from \"@firecms/ui\";\n\nimport { getFullId, idToPropertiesPath, namespaceToPropertiesOrderPath } from \"./util\";\nimport { OnPropertyChangedParams, PropertyForm, PropertyFormDialog } from \"./PropertyEditView\";\nimport { PropertyTree } from \"./PropertyTree\";\nimport { PersistedCollection } from \"../../types/persisted_collection\";\nimport { GetCodeDialog } from \"./GetCodeDialog\";\n\ntype CollectionEditorFormProps = {\n showErrors: boolean;\n isNewCollection: boolean;\n propertyErrorsRef?: React.MutableRefObject<any>;\n onPropertyError: (propertyKey: string, namespace: string | undefined, error?: Record<string, any>) => void;\n setDirty?: (dirty: boolean) => void;\n reservedGroups?: string[];\n extraIcon: React.ReactNode;\n getUser: (uid: string) => User | null;\n getData?: () => Promise<object[]>;\n doCollectionInference: (collection: PersistedCollection) => Promise<Partial<EntityCollection> | null> | undefined;\n propertyConfigs: Record<string, PropertyConfig>;\n collectionEditable: boolean;\n};\n\nexport function CollectionPropertiesEditorForm({\n showErrors,\n isNewCollection,\n propertyErrorsRef,\n onPropertyError,\n setDirty,\n reservedGroups,\n extraIcon,\n getUser,\n getData,\n doCollectionInference,\n propertyConfigs,\n collectionEditable\n }: CollectionEditorFormProps) {\n\n const {\n values,\n setFieldValue,\n setFieldError,\n setFieldTouched,\n errors,\n dirty\n } = useFormex<PersistedCollection>();\n\n const snackbarController = useSnackbarController();\n\n const largeLayout = useLargeLayout();\n const asDialog = !largeLayout\n\n // index of the selected property within the namespace\n const [selectedPropertyIndex, setSelectedPropertyIndex] = useState<number | undefined>();\n const [selectedPropertyKey, setSelectedPropertyKey] = useState<string | undefined>();\n const [selectedPropertyNamespace, setSelectedPropertyNamespace] = useState<string | undefined>();\n\n const selectedPropertyFullId = selectedPropertyKey ? getFullId(selectedPropertyKey, selectedPropertyNamespace) : undefined;\n const selectedProperty = selectedPropertyFullId ? getIn(values.properties, selectedPropertyFullId.replaceAll(\".\", \".properties.\")) : undefined;\n const [codeDialogOpen, setCodeDialogOpen] = useState<boolean>(false);\n\n const [inferringProperties, setInferringProperties] = useState<boolean>(false);\n\n const [newPropertyDialogOpen, setNewPropertyDialogOpen] = useState<boolean>(false);\n const [inferredPropertyKeys, setInferredPropertyKeys] = useState<string[]>([]);\n\n const currentPropertiesOrderRef = React.useRef<{\n [key: string]: string[]\n }>(values.propertiesOrder ? { \"\": values.propertiesOrder } : {});\n\n useEffect(() => {\n if (setDirty)\n setDirty(dirty);\n }, [dirty]);\n\n const inferPropertiesFromData = doCollectionInference\n ? (): void => {\n if (!doCollectionInference)\n return;\n\n setInferringProperties(true);\n // @ts-ignore\n doCollectionInference(values)\n .then((newCollection) => {\n\n if (newCollection)\n makePropertiesEditable(newCollection.properties as Properties);\n\n if (!newCollection) {\n snackbarController.open({\n type: \"error\",\n message: \"Could not infer properties from data\"\n });\n return;\n }\n // find properties in the new collection, not present in the current one\n const newPropertyKeys = (newCollection.properties ? Object.keys(newCollection.properties) : [])\n .filter((propertyKey) => !values.properties[propertyKey]);\n if (newPropertyKeys.length === 0) {\n snackbarController.open({\n type: \"info\",\n message: \"No new properties found in existing data\"\n });\n return;\n }\n // add them to the current collection\n const updatedProperties = {\n ...newPropertyKeys.reduce((acc, propertyKey) => {\n acc[propertyKey] = (newCollection.properties ?? {})[propertyKey];\n return acc;\n }, {} as {\n [key: string]: PropertyOrBuilder\n }),\n ...values.properties\n };\n const updatedPropertiesOrder = [\n ...newPropertyKeys,\n ...(values.propertiesOrder ?? [])\n ];\n setFieldValue(\"properties\", updatedProperties, false);\n\n updatePropertiesOrder(updatedPropertiesOrder);\n\n setInferredPropertyKeys(newPropertyKeys);\n })\n .finally(() => {\n setInferringProperties(false);\n })\n }\n : undefined;\n\n const getCurrentPropertiesOrder = useCallback((namespace?: string) => {\n if (!namespace) return currentPropertiesOrderRef.current[\"\"];\n return currentPropertiesOrderRef.current[namespace] ?? getIn(values, namespaceToPropertiesOrderPath(namespace));\n }, [values]);\n\n const updatePropertiesOrder = useCallback((newPropertiesOrder: string[], namespace?: string) => {\n const propertiesOrderPath = namespaceToPropertiesOrderPath(namespace);\n\n setFieldValue(propertiesOrderPath, newPropertiesOrder, false);\n currentPropertiesOrderRef.current[namespace ?? \"\"] = newPropertiesOrder;\n\n }, [setFieldValue]);\n\n const deleteProperty = useCallback((propertyKey?: string, namespace?: string) => {\n const fullId = propertyKey ? getFullId(propertyKey, namespace) : undefined;\n if (!fullId)\n throw Error(\"collection editor miss config\");\n\n setFieldValue(idToPropertiesPath(fullId), undefined, false);\n\n const currentPropertiesOrder = getCurrentPropertiesOrder(namespace);\n const newPropertiesOrder = currentPropertiesOrder.filter((p) => p !== propertyKey);\n updatePropertiesOrder(newPropertiesOrder, namespace);\n\n setNewPropertyDialogOpen(false);\n\n setSelectedPropertyIndex(undefined);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }, [getCurrentPropertiesOrder, setFieldValue, updatePropertiesOrder]);\n\n const onPropertyMove = (propertiesOrder: string[], namespace?: string) => {\n setFieldValue(namespaceToPropertiesOrderPath(namespace), propertiesOrder, false);\n };\n\n const onPropertyCreated = ({\n id,\n property\n }: {\n id?: string,\n property: Property\n }) => {\n if (!id) {\n throw Error(\"Need to include an ID when creating a new property\")\n }\n setFieldValue(\"properties\", {\n ...(values.properties ?? {}),\n [id]: property\n }, false);\n const newPropertiesOrder = [...(values.propertiesOrder ?? Object.keys(values.properties)), id];\n\n updatePropertiesOrder(newPropertiesOrder);\n\n setNewPropertyDialogOpen(false);\n if (largeLayout) {\n setSelectedPropertyIndex(newPropertiesOrder.indexOf(id));\n setSelectedPropertyKey(id);\n }\n setSelectedPropertyNamespace(undefined);\n };\n\n const onPropertyChanged = ({\n id,\n property,\n previousId,\n namespace\n }: OnPropertyChangedParams) => {\n\n const fullId = id ? getFullId(id, namespace) : undefined;\n const propertyPath = fullId ? idToPropertiesPath(fullId) : undefined;\n\n // If the id has changed we need to a little cleanup\n if (previousId && previousId !== id) {\n console.debug(\"onPropertyChanged, id change\", {\n id,\n property,\n previousId,\n namespace\n })\n\n const previousFullId = getFullId(previousId, namespace);\n const previousPropertyPath = idToPropertiesPath(previousFullId);\n\n const currentPropertiesOrder = getCurrentPropertiesOrder(namespace);\n\n // replace previousId with id in propertiesOrder\n const newPropertiesOrder = currentPropertiesOrder\n .map((p) => p === previousId ? id : p)\n .filter((p) => p !== undefined) as string[];\n\n updatePropertiesOrder(newPropertiesOrder, namespace);\n\n if (id) {\n setSelectedPropertyIndex(newPropertiesOrder.indexOf(id));\n setSelectedPropertyKey(id);\n }\n setFieldValue(previousPropertyPath, undefined, false);\n setFieldTouched(previousPropertyPath, false, false);\n }\n\n console.debug(\"onPropertyChanged\", {\n id,\n property,\n previousId,\n namespace,\n propertyPath\n })\n\n if (propertyPath) {\n setFieldValue(propertyPath, property, false);\n setFieldTouched(propertyPath, true, false);\n }\n\n };\n\n const onPropertyErrorInternal = useCallback((id: string, namespace?: string, error?: Record<string, any>) => {\n const propertyPath = id ? getFullId(id, namespace) : undefined;\n console.debug(\"onPropertyErrorInternal\", {\n id,\n namespace,\n error,\n propertyPath\n });\n if (propertyPath) {\n const hasError = error && Object.keys(error).length > 0;\n onPropertyError(id, namespace, hasError ? error : undefined);\n setFieldError(idToPropertiesPath(propertyPath), hasError ? \"Property error\" : undefined);\n }\n }, [])\n\n const closePropertyDialog = () => {\n setSelectedPropertyIndex(undefined);\n setSelectedPropertyKey(undefined);\n };\n\n const initialErrors = selectedPropertyKey && propertyErrorsRef?.current?.properties ? propertyErrorsRef.current.properties[selectedPropertyKey] : undefined;\n\n const emptyCollection = values?.propertiesOrder === undefined || values.propertiesOrder.length === 0;\n\n const usedPropertiesOrder = (values.propertiesOrder\n ? values.propertiesOrder\n : Object.keys(values.properties)) as string[];\n\n const owner = useMemo(() => getUser(values.ownerId), [getUser, values.ownerId]);\n\n const onPropertyClick = useCallback((propertyKey: string, namespace?: string) => {\n console.debug(\"CollectionEditor: onPropertyClick\", {\n propertyKey,\n namespace\n });\n setSelectedPropertyIndex(usedPropertiesOrder.indexOf(propertyKey));\n setSelectedPropertyKey(propertyKey);\n setSelectedPropertyNamespace(namespace);\n }, [usedPropertiesOrder]);\n\n const body = (\n <div className={\"grid grid-cols-12 gap-2 h-full bg-gray-50 dark:bg-gray-900\"}>\n <div className={cn(\n \"p-4 md:p-8 pb-20 md:pb-20\",\n \"col-span-12 lg:col-span-5 h-full overflow-auto\",\n !asDialog && \"border-r \" + defaultBorderMixin\n )}>\n\n <div className=\"flex my-2\">\n\n <div className=\"flex-grow mb-4\">\n\n <Field\n name={\"name\"}\n as={DebouncedTextField}\n invisible={true}\n className=\"-ml-1\"\n inputClassName=\"text-2xl font-headers\"\n placeholder={\"Collection name\"}\n size={\"small\"}\n required\n error={Boolean(errors?.name)}/>\n\n {owner &&\n <Typography variant={\"body2\"}\n className={\"ml-2\"}\n color={\"secondary\"}>\n Created by {owner.displayName}\n </Typography>}\n </div>\n\n {extraIcon && <div className=\"ml-4\">\n {extraIcon}\n </div>}\n\n <div className=\"ml-1 mt-2 flex flex-row gap-2\">\n <Tooltip title={\"Get the code for this collection\"}>\n <IconButton\n variant={\"filled\"}\n disabled={inferringProperties}\n onClick={() => setCodeDialogOpen(true)}>\n <CodeIcon/>\n </IconButton>\n </Tooltip>\n {inferPropertiesFromData && <Tooltip title={\"Add new properties based on data\"}>\n <IconButton\n variant={\"filled\"}\n disabled={inferringProperties}\n onClick={inferPropertiesFromData}>\n {inferringProperties ? <CircularProgress size={\"small\"}/> : <AutoAwesomeIcon/>}\n </IconButton>\n </Tooltip>}\n <Tooltip title={\"Add new property\"}>\n <Button\n variant={\"outlined\"}\n onClick={() => setNewPropertyDialogOpen(true)}>\n <AddIcon/>\n </Button>\n </Tooltip>\n </div>\n </div>\n\n <ErrorBoundary>\n <PropertyTree\n className={\"pl-8\"}\n inferredPropertyKeys={inferredPropertyKeys}\n selectedPropertyKey={selectedPropertyKey ? getFullId(selectedPropertyKey, selectedPropertyNamespace) : undefined}\n properties={values.properties}\n additionalFields={values.additionalFields}\n propertiesOrder={usedPropertiesOrder}\n onPropertyClick={onPropertyClick}\n onPropertyMove={onPropertyMove}\n onPropertyRemove={isNewCollection ? deleteProperty : undefined}\n collectionEditable={collectionEditable}\n errors={errors}/>\n </ErrorBoundary>\n\n <Button className={\"mt-8 w-full\"}\n color=\"primary\"\n variant={\"outlined\"}\n size={\"large\"}\n onClick={() => setNewPropertyDialogOpen(true)}\n startIcon={<AddIcon/>}>\n Add new property\n </Button>\n </div>\n\n {!asDialog &&\n <div className={\"col-span-12 lg:col-span-7 p-4 md:py-8 md:px-4 h-full overflow-auto pb-20 md:pb-20\"}>\n <Paper\n className=\"sticky top-8 p-4 min-h-full border border-transparent w-full flex flex-col justify-center \">\n\n {selectedPropertyFullId &&\n selectedProperty &&\n !isPropertyBuilder(selectedProperty) &&\n <PropertyForm\n inArray={false}\n key={`edit_view_${selectedPropertyIndex}`}\n existingProperty={!isNewCollection}\n autoUpdateId={false}\n allowDataInference={!isNewCollection}\n autoOpenTypeSelect={false}\n propertyKey={selectedPropertyKey}\n propertyNamespace={selectedPropertyNamespace}\n property={selectedProperty}\n onPropertyChanged={onPropertyChanged}\n onDelete={deleteProperty}\n onError={onPropertyErrorInternal}\n forceShowErrors={showErrors}\n initialErrors={initialErrors}\n getData={getData}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n />}\n\n {!selectedProperty &&\n <div className={\"w-full flex flex-col items-center justify-center h-full gap-4\"}>\n <Typography variant={\"label\"} className=\"\">\n {emptyCollection\n ? \"Now you can add your first property\"\n : \"Select a property to edit it\"}\n </Typography>\n <Button variant={\"outlined\"}\n onClick={() => setNewPropertyDialogOpen(true)}\n >\n <AddIcon/>\n Add new property\n </Button>\n </div>}\n\n {selectedProperty && isPropertyBuilder(selectedProperty) &&\n <Typography variant={\"label\"} className=\"flex items-center justify-center\">\n {\"This property is defined as a property builder in code\"}\n </Typography>}\n </Paper>\n </div>}\n\n {asDialog && <PropertyFormDialog\n inArray={false}\n open={selectedPropertyIndex !== undefined}\n key={`edit_view_${selectedPropertyIndex}`}\n autoUpdateId={!selectedProperty}\n allowDataInference={!isNewCollection}\n existingProperty={true}\n autoOpenTypeSelect={false}\n propertyKey={selectedPropertyKey}\n propertyNamespace={selectedPropertyNamespace}\n property={selectedProperty}\n onPropertyChanged={onPropertyChanged}\n onDelete={deleteProperty}\n onError={onPropertyErrorInternal}\n forceShowErrors={showErrors}\n initialErrors={initialErrors}\n getData={getData}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n onOkClicked={asDialog\n ? closePropertyDialog\n : undefined\n }/>}\n\n </div>);\n\n return (<>\n\n {body}\n\n {/* This is the dialog used for new properties*/}\n <PropertyFormDialog\n inArray={false}\n existingProperty={false}\n autoOpenTypeSelect={true}\n autoUpdateId={true}\n forceShowErrors={showErrors}\n open={newPropertyDialogOpen}\n onCancel={() => setNewPropertyDialogOpen(false)}\n onPropertyChanged={onPropertyCreated}\n getData={getData}\n allowDataInference={!isNewCollection}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n existingPropertyKeys={values.propertiesOrder as string[]}/>\n\n <GetCodeDialog\n collection={values}\n open={codeDialogOpen}\n onOpenChange={setCodeDialogOpen}/>\n\n </>\n );\n}\n","import React from \"react\";\nimport { Button, Dialog, DialogActions, DialogContent, Typography } from \"@firecms/ui\";\n\nexport interface UnsavedChangesDialogProps {\n open: boolean;\n body?: React.ReactNode;\n title?: string;\n handleOk: () => void;\n handleCancel: () => void;\n}\n\nexport function UnsavedChangesDialog({\n open,\n handleOk,\n handleCancel,\n body,\n title\n }: UnsavedChangesDialogProps) {\n\n return (\n <Dialog\n open={open}\n onOpenChange={(open) => open ? handleCancel() : handleOk()}\n aria-labelledby=\"alert-dialog-title\"\n aria-describedby=\"alert-dialog-description\"\n >\n <DialogContent>\n <Typography variant={\"h6\"}>\n {title ?? \"Unsaved changes\"}\n </Typography>\n\n {body && <Typography>\n {body}\n </Typography>}\n <Typography>\n Are you sure?\n </Typography>\n\n </DialogContent>\n\n <DialogActions>\n <Button variant=\"text\" onClick={handleCancel} autoFocus> Cancel </Button>\n <Button onClick={handleOk}> Ok </Button>\n </DialogActions>\n </Dialog>\n );\n}\n","import { useCustomizationController } from \"@firecms/core\";\nimport { Button, Dialog, DialogActions, DialogContent, Typography } from \"@firecms/ui\";\nimport React from \"react\";\n\nexport function EntityCustomViewsSelectDialog({ open, onClose }: { open: boolean, onClose: (selectedViewKey?: string) => void }) {\n const {\n entityViews,\n } = useCustomizationController();\n\n return <Dialog\n maxWidth={\"md\"}\n open={open}>\n <DialogContent className={\"flex flex-col gap-4\"}>\n <Typography variant={\"h6\"}>\n Select view\n </Typography>\n {entityViews?.map((view) => {\n return <Button\n key={view.key}\n onClick={() => onClose(view.key)}\n fullWidth\n variant={\"text\"}\n >\n {view.name} ({view.key})\n </Button>;\n })}\n {(entityViews ?? []).length === 0 &&\n <Typography variant={\"body2\"}>\n No custom views defined\n </Typography>\n }\n </DialogContent>\n <DialogActions>\n <Button variant={\"outlined\"} onClick={() => onClose()}>Cancel</Button>\n </DialogActions>\n </Dialog>\n}\n","import React from \"react\";\nimport {\n DeleteConfirmationDialog,\n EntityCollection,\n EntityCustomView,\n resolveEntityView,\n useCustomizationController,\n User\n} from \"@firecms/core\";\nimport {\n AddIcon,\n Alert,\n Button,\n Container,\n DeleteIcon,\n IconButton,\n Paper,\n Table,\n TableBody,\n TableCell,\n TableRow,\n Tooltip,\n Typography,\n} from \"@firecms/ui\";\nimport { CollectionEditorDialog } from \"./CollectionEditorDialog\";\nimport { CollectionsConfigController } from \"../../types/config_controller\";\nimport { PersistedCollection } from \"../../types/persisted_collection\";\nimport { CollectionInference } from \"../../types/collection_inference\";\nimport { EntityCustomViewsSelectDialog } from \"./EntityCustomViewsSelectDialog\";\nimport { useFormex } from \"@firecms/formex\";\n\nexport function SubcollectionsEditTab({\n collection,\n parentCollection,\n configController,\n collectionInference,\n getUser,\n parentCollectionIds\n }: {\n collection: PersistedCollection,\n parentCollection?: EntityCollection,\n configController: CollectionsConfigController;\n collectionInference?: CollectionInference;\n getUser: (uid: string) => User | null;\n parentCollectionIds?: string[];\n}) {\n\n const { entityViews: contextEntityViews } = useCustomizationController();\n\n const [subcollectionToDelete, setSubcollectionToDelete] = React.useState<string | undefined>();\n const [addEntityViewDialogOpen, setAddEntityViewDialogOpen] = React.useState<boolean>(false);\n const [viewToDelete, setViewToDelete] = React.useState<string | undefined>();\n\n const [currentDialog, setCurrentDialog] = React.useState<{\n isNewCollection: boolean,\n editedCollectionId?: string,\n }>();\n\n const {\n values,\n setFieldValue,\n } = useFormex<EntityCollection>();\n\n const subcollections = collection.subcollections ?? [];\n const resolvedEntityViews = values.entityViews?.filter(e => typeof e === \"string\")\n .map(e => resolveEntityView(e, contextEntityViews))\n .filter(Boolean) as EntityCustomView[] ?? [];\n const hardCodedEntityViews = collection.entityViews?.filter(e => typeof e !== \"string\") as EntityCustomView[] ?? [];\n const totalEntityViews = resolvedEntityViews.length + hardCodedEntityViews.length;\n\n return (\n <div className={\"overflow-auto my-auto\"}>\n <Container maxWidth={\"2xl\"} className={\"flex flex-col gap-4 p-8 m-auto\"}>\n <div className={\"flex flex-col gap-16\"}>\n\n <div className={\"flex-grow flex flex-col gap-4 items-start\"}>\n <Typography variant={\"h5\"}>\n Subcollections of {values.name}\n </Typography>\n\n <Paper className={\"flex flex-col gap-4 p-2 w-full\"}>\n {subcollections && subcollections.length > 0 && <Table>\n <TableBody>\n {subcollections.map((subcollection) => (\n <TableRow key={subcollection.path}\n onClick={() => setCurrentDialog({\n isNewCollection: false,\n editedCollectionId: subcollection.id\n })}>\n <TableCell\n align=\"left\">\n <Typography variant={\"subtitle2\"} className={\"flex-grow\"}>\n {subcollection.name}\n </Typography>\n </TableCell>\n <TableCell\n align=\"right\">\n <Tooltip title={\"Remove\"}>\n <IconButton size=\"small\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setSubcollectionToDelete(subcollection.id);\n }}\n color=\"inherit\">\n <DeleteIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>}\n\n <Button\n onClick={() => {\n setCurrentDialog({\n isNewCollection: true\n });\n }}\n variant={\"text\"}\n startIcon={<AddIcon/>}>\n Add subcollection\n </Button>\n\n </Paper>\n\n </div>\n\n <div className={\"flex-grow flex flex-col gap-4 items-start\"}>\n <Typography variant={\"h5\"}>\n Custom views\n </Typography>\n\n {totalEntityViews === 0 &&\n <Alert action={<Button variant=\"text\"\n size={\"small\"}\n href={\"https://firecms.co/docs/customization_quickstart\"}\n component={\"a\"}\n rel=\"noopener noreferrer\"\n target=\"_blank\">More info</Button>}>\n Define your own custom views by uploading them with the CLI.\n </Alert>\n }\n\n {<>\n <Paper className={\"flex flex-col gap-4 p-2 w-full\"}>\n <Table>\n <TableBody>\n {resolvedEntityViews.map((view) => (\n <TableRow key={view.key}>\n <TableCell\n align=\"left\">\n <Typography variant={\"subtitle2\"} className={\"flex-grow\"}>\n {view.name}\n </Typography>\n </TableCell>\n <TableCell\n align=\"right\">\n <Tooltip title={\"Remove\"}>\n <IconButton size=\"small\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setViewToDelete(view.key);\n }}\n color=\"inherit\">\n <DeleteIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>\n </TableCell>\n </TableRow>\n ))}\n {hardCodedEntityViews.map((view) => (\n <TableRow key={view.key}>\n <TableCell\n align=\"left\">\n <Typography variant={\"subtitle2\"} className={\"flex-grow\"}>\n {view.name}\n </Typography>\n <Typography variant={\"caption\"} className={\"flex-grow\"}>\n This view is defined in code with\n key <code>{view.key}</code>\n </Typography>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n\n <Button\n onClick={() => {\n setAddEntityViewDialogOpen(true);\n }}\n variant={\"text\"}\n startIcon={<AddIcon/>}>\n Add custom entity view\n </Button>\n </Paper>\n\n </>}\n\n\n </div>\n\n </div>\n </Container>\n\n <div style={{ height: \"52px\" }}/>\n\n {subcollectionToDelete &&\n <DeleteConfirmationDialog open={Boolean(subcollectionToDelete)}\n onAccept={() => {\n const props = {\n id: subcollectionToDelete,\n parentCollectionIds: [...(parentCollectionIds ?? []), collection.id]\n };\n console.debug(\"Deleting subcollection\", props)\n configController.deleteCollection(props);\n setSubcollectionToDelete(undefined);\n }}\n onCancel={() => setSubcollectionToDelete(undefined)}\n title={<>Delete this subcollection?</>}\n body={<> This will <b>not\n delete any data</b>, only\n the collection in the CMS</>}/>}\n {viewToDelete &&\n <DeleteConfirmationDialog open={Boolean(viewToDelete)}\n onAccept={() => {\n setFieldValue(\"entityViews\", values.entityViews?.filter(e => e !== viewToDelete));\n setViewToDelete(undefined);\n }}\n onCancel={() => setViewToDelete(undefined)}\n title={<>Remove this view?</>}\n body={<>This will <b>not\n delete any data</b>, only\n the view in the CMS</>}/>}\n\n <CollectionEditorDialog\n open={Boolean(currentDialog)}\n configController={configController}\n parentCollection={collection}\n collectionInference={collectionInference}\n parentCollectionIds={[...parentCollectionIds ?? [], values.id]}\n isNewCollection={false}\n {...currentDialog}\n getUser={getUser}\n handleClose={() => {\n setCurrentDialog(undefined);\n }}/>\n\n <EntityCustomViewsSelectDialog\n open={addEntityViewDialogOpen}\n onClose={(selectedViewKey) => {\n if (selectedViewKey) {\n setFieldValue(\"entityViews\", [...(values.entityViews ?? []), selectedViewKey]);\n }\n setAddEntityViewDialogOpen(false);\n }}/>\n </div>\n );\n}\n","import { EntityCollection, makePropertiesEditable } from \"@firecms/core\";\n\nexport const productsCollectionTemplate: EntityCollection = {\n id: \"products\",\n path: \"products\",\n name: \"Products\",\n singularName: \"Product\",\n icon: \"shopping_cart\",\n description: \"List of the products currently sold in your shop\",\n properties: makePropertiesEditable({\n name: {\n dataType: \"string\",\n name: \"Name\",\n description: \"Name of this product\",\n validation: {\n required: true\n }\n },\n brand: {\n dataType: \"string\",\n name: \"Brand\",\n validation: {\n required: true\n }\n },\n description: {\n dataType: \"string\",\n name: \"Description\",\n description: \"Description of this product, supports markdown\",\n markdown: true\n },\n main_image: {\n dataType: \"string\",\n name: \"Image\",\n storage: {\n storagePath: \"images\",\n acceptedFiles: [\"image/*\"],\n },\n description: \"Upload field for images\"\n },\n available: {\n dataType: \"boolean\",\n name: \"Available\",\n columnWidth: 100,\n description: \"Is this product available in the website\"\n },\n price: {\n dataType: \"number\",\n name: \"Price\",\n validation: {\n requiredMessage: \"You must set a positive price\",\n min: 0\n }\n },\n images: {\n dataType: \"array\",\n name: \"Images\",\n hideFromCollection: true,\n of: {\n dataType: \"string\",\n storage: {\n storagePath: \"images\",\n acceptedFiles: [\"image/*\"]\n }\n }\n },\n related_products: {\n dataType: \"array\",\n name: \"Related products\",\n description: \"Products related to this one\",\n of: {\n dataType: \"reference\",\n path: \"products\"\n }\n },\n metadata: {\n name: \"Metadata\",\n description: \"This is an example of a map property\",\n dataType: \"map\",\n keyValue: true\n },\n added_on: {\n dataType: \"date\",\n name: \"Added on\",\n autoValue: \"on_create\"\n }\n })\n};\n","import { EntityCollection, makePropertiesEditable } from \"@firecms/core\";\n\nexport const blogCollectionTemplate:EntityCollection = {\n id: \"blog\",\n path: \"blog\",\n name: \"Blog\",\n singularName: \"Blog entry\",\n icon: \"article\",\n description: \"A collection of blog entries\",\n defaultSize: \"l\",\n properties: makePropertiesEditable({\n name: {\n name: \"Name\",\n validation: { required: true },\n dataType: \"string\"\n },\n header_image: {\n name: \"Header image\",\n dataType: \"string\",\n storage: {\n storagePath: \"images\",\n acceptedFiles: [\"image/*\"],\n metadata: {\n cacheControl: \"max-age=1000000\"\n }\n }\n },\n content: {\n name: \"Content\",\n description: \"Content blocks for the blog entry\",\n validation: { required: true },\n dataType: \"array\",\n oneOf: {\n typeField: \"type\",\n valueField: \"value\",\n properties: {\n text: {\n dataType: \"string\",\n name: \"Text\",\n markdown: true\n },\n quote: {\n dataType: \"string\",\n name: \"Quote\",\n multiline: true\n },\n images: {\n name: \"Images\",\n dataType: \"array\",\n of: {\n dataType: \"string\",\n storage: {\n storagePath: \"images\",\n acceptedFiles: [\"image/*\"],\n metadata: {\n cacheControl: \"max-age=1000000\"\n }\n }\n },\n description: \"This fields allows uploading multiple images at once and reordering\"\n },\n products: {\n name: \"Products\",\n dataType: \"array\",\n of: {\n dataType: \"reference\",\n path: \"products\",\n previewProperties: [\"name\", \"main_image\"]\n }\n }\n },\n propertiesOrder: [\"text\", \"quote\", \"images\", \"products\"]\n }\n },\n created_on: {\n name: \"Created on\",\n dataType: \"date\",\n autoValue: \"on_create\"\n },\n status: {\n name: \"Status\",\n validation: { required: true },\n dataType: \"string\",\n enumValues: {\n published: {\n id: \"published\",\n label: \"Published\",\n },\n draft: \"Draft\"\n },\n defaultValue: \"draft\"\n },\n publish_date: {\n name: \"Publish date\",\n dataType: \"date\",\n clearable: true\n },\n reviewed: {\n name: \"Reviewed\",\n dataType: \"boolean\"\n },\n tags: {\n name: \"Tags\",\n description: \"Example of generic array\",\n dataType: \"array\",\n of: {\n dataType: \"string\",\n previewAsTag: true\n }\n }\n }),\n initialFilter: {\n status: [\"==\", \"published\"]\n }\n};\n","import { EntityCollection, makePropertiesEditable } from \"@firecms/core\";\n\nexport const usersCollectionTemplate: EntityCollection = {\n id: \"users\",\n path: \"users\",\n name: \"Users\",\n singularName: \"User\",\n description: \"Registered users in the app/web\",\n icon: \"person\",\n properties: makePropertiesEditable({\n displayName: {\n name: \"Display name\",\n dataType: \"string\"\n },\n email: {\n name: \"Email\",\n dataType: \"string\",\n email: true\n },\n emailVerified: {\n name: \"Email verified\",\n dataType: \"boolean\"\n },\n phone: {\n name: \"Phone\",\n dataType: \"string\"\n },\n favourite_products: {\n name: \"Favourite products\",\n dataType: \"array\",\n of: {\n dataType: \"reference\",\n path: \"products\"\n }\n },\n photoURL: {\n name: \"Photo URL\",\n dataType: \"string\",\n url: \"image\"\n }\n }),\n};\n","import { EntityCollection } from \"@firecms/core\";\n\nexport const pagesCollectionTemplate: EntityCollection = {\n id: \"pages\",\n path: \"pages\",\n name: \"Pages\",\n singularName: \"Page\",\n icon: \"insert_drive_file\",\n description: \"List of website pages that can be edited here\",\n properties: {\n title: {\n dataType: \"string\",\n name: \"Page Title\",\n validation: { required: true }\n },\n slug: {\n dataType: \"string\",\n name: \"URL Slug\",\n validation: {\n required: true,\n unique: true,\n matches: /^[a-z0-9]+(?:-[a-z0-9]+)*$/,\n matchesMessage: \"Must be lowercase, alphanumeric, and hyphenated\"\n }\n },\n hero_section: {\n dataType: \"map\",\n name: \"Hero Section\",\n properties: {\n headline: {\n dataType: \"string\",\n name: \"Headline\",\n validation: { required: true }\n },\n subhead: {\n dataType: \"string\",\n name: \"Subheadline\"\n },\n background_image: {\n dataType: \"string\",\n name: \"Background Image\",\n storage: {\n storagePath: \"page_hero/images\",\n acceptedFiles: [\"image/*\"],\n }\n },\n call_to_action: {\n dataType: \"string\",\n name: \"Call to Action\"\n },\n call_to_action_link: {\n dataType: \"string\",\n name: \"CTA Link\",\n url: true\n }\n }\n },\n content: {\n dataType: \"array\",\n name: \"Content\",\n oneOf: {\n properties: {\n section: {\n dataType: \"map\",\n name: \"Section\",\n properties: {\n title: {\n dataType: \"string\",\n name: \"Section Title\",\n validation: { required: true }\n },\n content: {\n dataType: \"string\",\n name: \"Section Content\",\n markdown: true\n },\n image: {\n dataType: \"string\",\n name: \"Section Image\",\n storage: {\n storagePath: \"page_sections/images\",\n acceptedFiles: [\"image/*\"]\n }\n },\n link: {\n dataType: \"string\",\n name: \"Section Link\",\n url: true\n }\n }\n },\n image: {\n dataType: \"string\",\n name: \"Image\",\n storage: {\n storagePath: \"page_sections/images\",\n acceptedFiles: [\"image/*\"]\n }\n },\n slider: {\n dataType: \"array\",\n name: \"Slider\",\n of: {\n dataType: \"map\",\n properties: {\n title: {\n dataType: \"string\",\n name: \"Title\",\n validation: { required: true }\n },\n image: {\n dataType: \"string\",\n storage: {\n storagePath: \"page_sections/images\",\n acceptedFiles: [\"image/*\"]\n }\n }\n }\n }\n },\n }\n }\n },\n sidebar: {\n dataType: \"map\",\n name: \"Sidebar\",\n properties: {\n title: {\n dataType: \"string\",\n name: \"Sidebar Title\",\n validation: { required: false }\n },\n content: {\n dataType: \"string\",\n name: \"Sidebar Content\",\n markdown: true\n }\n }\n },\n seo_metadata: {\n dataType: \"map\",\n name: \"SEO Metadata\",\n properties: {\n meta_title: {\n dataType: \"string\",\n name: \"Meta Title\"\n },\n meta_description: {\n dataType: \"string\",\n name: \"Meta Description\"\n },\n focus_keywords: {\n dataType: \"array\",\n name: \"Focus Keywords\",\n of: {\n dataType: \"string\"\n }\n }\n }\n },\n footer_override: {\n dataType: \"string\",\n name: \"Footer Override\",\n markdown: true\n },\n publish_date: {\n dataType: \"date\",\n name: \"Publish Date\",\n validation: { required: true }\n },\n last_updated: {\n dataType: \"date\",\n name: \"Last Updated\",\n autoValue: \"on_update\"\n },\n is_published: {\n dataType: \"boolean\",\n name: \"Is Published\",\n columnWidth: 100,\n description: \"Should this page be live on the site?\"\n },\n author_uid: {\n dataType: \"reference\",\n name: \"Author\",\n path: \"users\"\n }\n }\n};\n","import React, { useEffect, useState } from \"react\";\nimport { EntityCollection, unslugify, } from \"@firecms/core\";\nimport { Button, Card, Chip, CircularProgress, cn, Container, Icon, Tooltip, Typography, } from \"@firecms/ui\";\n\nimport { productsCollectionTemplate } from \"./templates/products_template\";\nimport { blogCollectionTemplate } from \"./templates/blog_template\";\nimport { usersCollectionTemplate } from \"./templates/users_template\";\nimport { ImportFileUpload } from \"@firecms/data_import_export\";\nimport { pagesCollectionTemplate } from \"./templates/pages_template\";\nimport { useFormex } from \"@firecms/formex\";\n\nexport function CollectionEditorWelcomeView({\n path,\n pathSuggestions,\n parentCollection,\n onContinue,\n existingCollectionPaths\n }: {\n path: string;\n pathSuggestions?: (path: string) => Promise<string[]>;\n parentCollection?: EntityCollection;\n onContinue: (importData?: object[]) => void;\n existingCollectionPaths?: string[];\n}) {\n\n const [loadingPathSuggestions, setLoadingPathSuggestions] = useState(false);\n const [filteredPathSuggestions, setFilteredPathSuggestions] = useState<string[] | undefined>();\n useEffect(() => {\n if (pathSuggestions && existingCollectionPaths) {\n setLoadingPathSuggestions(true);\n pathSuggestions(path)\n .then(suggestions => {\n const filteredSuggestions = suggestions.filter(s => !(existingCollectionPaths ?? []).find(c => c.trim().toLowerCase() === s.trim().toLowerCase()));\n setFilteredPathSuggestions(filteredSuggestions);\n })\n .finally(() => setLoadingPathSuggestions(false));\n }\n }, [existingCollectionPaths, path, pathSuggestions]);\n\n // const {\n // values,\n // setFieldValue,\n // setValues,\n // handleChange,\n // touched,\n // errors,\n // setFieldTouched,\n // isSubmitting,\n // submitCount\n // } = useFormex<EntityCollection>();\n\n const {\n values,\n setFieldValue,\n setValues,\n submitCount\n } = useFormex<EntityCollection>();\n\n return (\n <div className={\"overflow-auto my-auto\"}>\n <Container maxWidth={\"4xl\"} className={\"flex flex-col gap-4 p-8 m-auto\"}>\n\n <div\n className=\"flex flex-row py-2 pt-3 items-center\">\n <Typography variant={\"h4\"} className={\"flex-grow\"}>\n New collection\n </Typography>\n </div>\n\n {parentCollection && <Chip colorScheme={\"tealDarker\"}>\n <Typography variant={\"caption\"}>\n This is a subcollection of <b>{parentCollection.name}</b>\n </Typography>\n </Chip>}\n\n <div className={\"my-2\"}>\n <Typography variant={\"caption\"}\n color={\"secondary\"}>\n ● Use one of the existing paths in your database:\n </Typography>\n <div className={\"flex flex-wrap gap-x-2 gap-y-1 items-center my-2 min-h-7\"}>\n\n {loadingPathSuggestions && !filteredPathSuggestions && <CircularProgress size={\"small\"}/>}\n\n {filteredPathSuggestions?.map((suggestion, index) => (\n <Chip key={suggestion}\n colorScheme={\"cyanLighter\"}\n onClick={() => {\n setFieldValue(\"name\", unslugify(suggestion));\n setFieldValue(\"id\", suggestion);\n setFieldValue(\"path\", suggestion);\n setFieldValue(\"properties\", undefined);\n onContinue();\n }}\n size=\"small\">\n {suggestion}\n </Chip>\n ))}\n\n {!loadingPathSuggestions && (filteredPathSuggestions ?? [])?.length === 0 &&\n <Typography variant={\"caption\"}>\n No suggestions\n </Typography>\n }\n\n </div>\n\n </div>\n\n <div className={\"my-2\"}>\n <Typography variant={\"caption\"}\n color={\"secondary\"}>\n ● Select a template:\n </Typography>\n\n <div className={\"flex gap-4\"}>\n <TemplateButton title={\"Products\"}\n subtitle={\"A collection of products with images, prices and stock\"}\n icon={<Icon size={\"small\"} iconKey={productsCollectionTemplate.icon!}/>}\n onClick={() => {\n setValues(productsCollectionTemplate);\n onContinue();\n }}/>\n <TemplateButton title={\"Users\"}\n subtitle={\"A collection of users with emails, names and roles\"}\n icon={<Icon size={\"small\"} iconKey={usersCollectionTemplate.icon!}/>}\n onClick={() => {\n setValues(usersCollectionTemplate);\n onContinue();\n }}/>\n <TemplateButton title={\"Blog posts\"}\n subtitle={\"A collection of blog posts with images, authors and complex content\"}\n icon={<Icon size={\"small\"} iconKey={blogCollectionTemplate.icon!}/>}\n onClick={() => {\n setValues(blogCollectionTemplate);\n onContinue();\n }}/>\n <TemplateButton title={\"Pages\"}\n subtitle={\"A collection of pages with images, authors and complex content\"}\n icon={<Icon size={\"small\"} iconKey={pagesCollectionTemplate.icon!}/>}\n onClick={() => {\n setValues(pagesCollectionTemplate);\n onContinue();\n }}/>\n </div>\n\n </div>\n\n {!parentCollection && <div>\n\n <Typography variant={\"caption\"}\n color={\"secondary\"}\n className={\"mb-2\"}>\n ● Create a collection from a file (csv, json, xls, xslx...)\n </Typography>\n\n <ImportFileUpload onDataAdded={(data) => onContinue(data)}/>\n\n </div>}\n\n <div>\n\n <Button variant={\"text\"} onClick={() => onContinue()} className={\"my-2\"}>\n Continue from scratch\n </Button>\n </div>\n\n {/*<div style={{ height: \"52px\" }}/>*/}\n\n </Container>\n </div>\n );\n}\n\nexport function TemplateButton({\n title,\n subtitle,\n icon,\n onClick\n }: {\n title: string,\n icon: React.ReactNode,\n subtitle: string,\n onClick?: () => void\n}) {\n\n return (\n <Tooltip title={subtitle}>\n <Card\n onClick={onClick}\n className={cn(\n \"my-2 rounded-md border mx-0 p-6 px-4 focus:outline-none transition ease-in-out duration-150 flex flex-row gap-4 items-center\",\n \"text-gray-700 dark:text-gray-300\",\n \"hover:border-primary-dark hover:text-primary-dark dark:hover:text-primary focus:ring-primary hover:ring-1 hover:ring-primary\",\n \"border-gray-400 dark:border-gray-600 \"\n )}\n >\n {icon}\n <div className={\"flex flex-col items-start\"}>\n\n <Typography variant={\"subtitle1\"}>\n {title}\n </Typography>\n {/*<Typography>*/}\n {/* {subtitle}*/}\n {/*</Typography>*/}\n\n </div>\n </Card>\n </Tooltip>\n );\n\n}\n","import {\n DataNewPropertiesMapping,\n getInferenceType,\n ImportConfig,\n ImportNewPropertyFieldPreview\n} from \"@firecms/data_import_export\";\nimport { getIn, useFormex } from \"@firecms/formex\";\n\nimport { PropertyConfigBadge, getFieldConfig, getFieldId, Properties, Property, PropertyConfig, } from \"@firecms/core\";\nimport { Container, Select, Tooltip, Typography } from \"@firecms/ui\";\nimport React, { useState } from \"react\";\nimport { OnPropertyChangedParams, PropertyFormDialog, PropertyWithId } from \"../PropertyEditView\";\nimport { getFullId, idToPropertiesPath, namespaceToPropertiesOrderPath } from \"../util\";\nimport { PersistedCollection } from \"../../../types/persisted_collection\";\nimport { updatePropertyFromWidget } from \"../utils/update_property_for_widget\";\nimport { PropertySelectItem } from \"../PropertySelectItem\";\nimport { supportedFields } from \"../utils/supported_fields\";\nimport { buildPropertyFromData } from \"@firecms/schema_inference\";\n\nexport function CollectionEditorImportMapping({\n importConfig,\n propertyConfigs,\n collectionEditable\n }:\n {\n importConfig: ImportConfig,\n propertyConfigs: Record<string, PropertyConfig>,\n collectionEditable: boolean\n }) {\n\n // const {\n // values,\n // setFieldValue,\n // setFieldTouched,\n // setValues,\n // submitCount\n // } = useFormex();\n\n const {\n setFieldValue,\n setFieldTouched,\n values\n } = useFormex<PersistedCollection>();\n const [selectedProperty, setSelectedProperty] = useState<PropertyWithId | undefined>(undefined);\n\n const currentPropertiesOrderRef = React.useRef<{\n [key: string]: string[]\n }>(values.propertiesOrder ? { \"\": values.propertiesOrder } : {});\n\n const propertyKey = selectedProperty ? selectedProperty.id : undefined;\n const property = selectedProperty || undefined;\n\n const onPropertyChanged = ({\n id,\n property,\n previousId,\n namespace\n }: OnPropertyChangedParams) => {\n\n const fullId = id ? getFullId(id, namespace) : undefined;\n const propertyPath = fullId ? idToPropertiesPath(fullId) : undefined;\n\n // setSelectedProperty(property);\n const getCurrentPropertiesOrder = (namespace?: string) => {\n if (!namespace) return currentPropertiesOrderRef.current[\"\"];\n return currentPropertiesOrderRef.current[namespace] ?? getIn(values, namespaceToPropertiesOrderPath(namespace));\n }\n\n const updatePropertiesOrder = (newPropertiesOrder: string[], namespace?: string) => {\n const propertiesOrderPath = namespaceToPropertiesOrderPath(namespace);\n\n setFieldValue(propertiesOrderPath, newPropertiesOrder, false);\n currentPropertiesOrderRef.current[namespace ?? \"\"] = newPropertiesOrder;\n\n };\n\n // If the id has changed we need to a little cleanup\n if (previousId && previousId !== id) {\n const previousFullId = getFullId(previousId, namespace);\n const previousPropertyPath = idToPropertiesPath(previousFullId);\n\n const currentPropertiesOrder = getCurrentPropertiesOrder(namespace);\n\n // replace previousId with id in propertiesOrder\n const newPropertiesOrder = currentPropertiesOrder\n .map((p) => p === previousId ? id : p)\n .filter((p) => p !== undefined) as string[];\n updatePropertiesOrder(newPropertiesOrder, namespace);\n\n // replace previousId with id in headersMapping\n const newHeadersMapping = { ...importConfig.headersMapping };\n Object.keys(newHeadersMapping).forEach((key) => {\n if (newHeadersMapping[key] === previousId) {\n newHeadersMapping[key] = id ?? \"\";\n }\n });\n importConfig.setHeadersMapping(newHeadersMapping);\n\n // if (id) {\n // setSelectedPropertyIndex(newPropertiesOrder.indexOf(id));\n // setSelectedPropertyKey(id);\n // }\n setFieldValue(previousPropertyPath, undefined, false);\n setFieldTouched(previousPropertyPath, false, false);\n }\n\n if (propertyPath) {\n setFieldValue(propertyPath, property, false);\n setFieldTouched(propertyPath, true, false);\n }\n };\n const onPropertyTypeChanged = async ({\n id,\n importKey,\n property,\n namespace\n }: OnPropertyChangedParams & {\n importKey: string\n }) => {\n\n const fullId = id ? getFullId(id, namespace) : undefined;\n const propertyPath = fullId ? idToPropertiesPath(fullId) : undefined;\n\n // we try to infer the rest of the properties of a property, from the type and the data\n const propertyData = importConfig.importData.map((d) => getIn(d, importKey));\n const inferredNewProperty = {\n ...buildPropertyFromData(propertyData, property, getInferenceType),\n editable: true\n };\n\n if (propertyPath) {\n if (inferredNewProperty) {\n setFieldValue(propertyPath, inferredNewProperty, false);\n } else {\n setFieldValue(propertyPath, property, false);\n }\n setFieldTouched(propertyPath, true, false);\n }\n };\n\n return (\n\n <div className={\"overflow-auto my-auto\"}>\n <Container maxWidth={\"6xl\"} className={\"flex flex-col gap-4 p-8 m-auto\"}>\n\n <Typography variant=\"h6\" className={\"mt-4\"}>Data property mapping</Typography>\n\n <DataNewPropertiesMapping headersMapping={importConfig.headersMapping}\n idColumn={importConfig.idColumn}\n originProperties={importConfig.originProperties}\n destinationProperties={values.properties as Properties}\n onIdPropertyChanged={(value) => importConfig.setIdColumn(value)}\n buildPropertyView={({\n property,\n propertyKey,\n importKey\n }) => {\n return <ImportNewPropertyFieldPreview\n property={property}\n propertyKey={propertyKey}\n onPropertyNameChanged={(propertyKey: string, value: string) => setFieldValue(`properties.${propertyKey}.name`, value, false)}\n onEditClick={() => {\n if (!propertyKey || !property) return;\n setSelectedProperty({\n ...property,\n id: propertyKey,\n editable: true\n });\n }}\n propertyTypeView={<PropertySelect property={property}\n disabled={false}\n onPropertyChanged={(props) => onPropertyTypeChanged({\n ...props,\n importKey\n })}\n propertyKey={propertyKey}\n propertyConfigs={propertyConfigs}/>}\n />;\n }}/>\n </Container>\n\n <PropertyFormDialog\n open={selectedProperty !== undefined}\n propertyKey={propertyKey}\n property={property}\n inArray={false}\n autoUpdateId={false}\n onPropertyChanged={onPropertyChanged}\n allowDataInference={false}\n collectionEditable={collectionEditable}\n onOkClicked={() => {\n setSelectedProperty(undefined);\n }}\n onCancel={() => {\n setSelectedProperty(undefined);\n }}\n autoOpenTypeSelect={false}\n existingProperty={false}\n propertyConfigs={propertyConfigs}/>\n\n <div style={{ height: \"52px\" }}/>\n </div>\n );\n\n}\n\nfunction PropertySelect({\n property,\n onPropertyChanged,\n propertyKey,\n propertyConfigs,\n disabled\n }: {\n property: Property | null,\n propertyKey: string | null,\n onPropertyChanged: ({\n id,\n property,\n previousId,\n namespace\n }: OnPropertyChangedParams) => void,\n propertyConfigs: Record<string, PropertyConfig>,\n disabled?: boolean\n}) {\n\n const fieldId = property ? getFieldId(property) : null;\n const widget = property ? getFieldConfig(property, propertyConfigs) : null;\n\n const [selectOpen, setSelectOpen] = useState(false);\n\n return <Tooltip title={property && widget ? `${widget?.name} - ${property.dataType}` : undefined}\n open={selectOpen ? false : undefined}>\n <Select\n open={selectOpen}\n onOpenChange={setSelectOpen}\n invisible={true}\n className={\"w-full\"}\n disabled={disabled}\n error={!widget}\n value={fieldId ?? \"\"}\n placeholder={\"Select a property widget\"}\n position={\"item-aligned\"}\n renderValue={(value) => {\n if (!widget) return null;\n return <PropertyConfigBadge propertyConfig={widget}/>\n }}\n onValueChange={(newSelectedWidgetId) => {\n const newProperty = updatePropertyFromWidget(property, newSelectedWidgetId, propertyConfigs)\n if (!propertyKey) return;\n onPropertyChanged({\n id: propertyKey,\n property: newProperty,\n previousId: propertyKey,\n namespace: undefined\n });\n }}>\n {Object.entries(supportedFields).map(([key, widget]) => {\n return <PropertySelectItem\n key={key}\n value={key}\n optionDisabled={false}\n propertyConfig={widget}\n existing={false}/>;\n })\n }\n </Select>\n </Tooltip>;\n}\n","import { convertDataToEntity, getPropertiesMapping, ImportConfig } from \"@firecms/data_import_export\";\nimport { EntityCollectionTable, Properties, useSelectionController } from \"@firecms/core\";\nimport { useEffect } from \"react\";\nimport { Typography } from \"@firecms/ui\";\n\nexport function CollectionEditorImportDataPreview({ importConfig, properties, propertiesOrder }: {\n importConfig: ImportConfig,\n properties: Properties,\n propertiesOrder: string[]\n}) {\n\n useEffect(() => {\n const propertiesMapping = getPropertiesMapping(importConfig.originProperties, properties);\n const mappedData = importConfig.importData.map(d => convertDataToEntity(d, importConfig.idColumn, importConfig.headersMapping, properties, propertiesMapping, \"TEMP_PATH\"));\n importConfig.setEntities(mappedData);\n }, []);\n\n const selectionController = useSelectionController();\n\n return <EntityCollectionTable\n title={<div>\n <Typography variant={\"subtitle2\"}>Imported data preview</Typography>\n <Typography variant={\"caption\"}>Entities with the same id will be overwritten</Typography>\n </div>}\n tableController={{\n data: importConfig.entities,\n dataLoading: false,\n noMoreToLoad: false\n }}\n endAdornment={<div className={\"h-12\"}/>}\n filterable={false}\n sortable={false}\n selectionController={selectionController}\n displayedColumnIds={propertiesOrder.map(p => ({ key: p, disabled: false }))}\n properties={properties}/>\n\n}\n","import { Properties, slugify } from \"@firecms/core\";\nimport { ImportConfig } from \"@firecms/data_import_export\";\n\nexport function cleanPropertiesFromImport(properties: Properties, parentSlug = \"\"): {\n headersMapping: ImportConfig[\"headersMapping\"],\n properties: Properties,\n idColumn?: ImportConfig[\"idColumn\"],\n} {\n\n const result = Object.keys(properties).reduce((acc, key) => {\n const property = properties[key];\n const slug = slugify(key);\n const fullSlug = parentSlug ? `${parentSlug}.${slug}` : slug;\n\n if (property.dataType === \"map\" && property.properties) {\n const slugifiedResult = cleanPropertiesFromImport(property.properties as Properties, fullSlug);\n return {\n headersMapping: { ...acc.headersMapping, [key]: fullSlug },\n properties: {\n ...acc.properties,\n [slug]: {\n ...property,\n properties: slugifiedResult.properties,\n propertiesOrder: Object.keys(slugifiedResult.properties)\n }\n }\n }\n }\n\n const updatedProperties = {\n ...acc.properties,\n [slug]: property\n } as Properties;\n\n const headersMapping = { ...acc.headersMapping, [key]: fullSlug } as Record<string, string>;\n\n return {\n headersMapping,\n properties: updatedProperties,\n }\n }, { headersMapping: {}, properties: {} });\n\n const firstKey = Object.keys(result.headersMapping)?.[0];\n let idColumn: string | undefined;\n if (firstKey?.includes(\"id\") || firstKey?.includes(\"key\")) {\n idColumn = firstKey;\n }\n\n return {\n ...result,\n idColumn\n };\n}\n","import * as React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n CircularProgressCenter,\n EntityCollection,\n ErrorView,\n isPropertyBuilder,\n MapProperty,\n mergeDeep,\n Properties,\n PropertiesOrBuilders,\n Property,\n PropertyConfig,\n PropertyOrBuilder,\n randomString,\n removeInitialAndTrailingSlashes,\n removeUndefined,\n TopNavigationResult,\n useAuthController,\n useCustomizationController,\n useNavigationController,\n User,\n useSnackbarController\n} from \"@firecms/core\";\nimport {\n ArrowBackIcon,\n Button,\n cn,\n coolIconKeys,\n defaultBorderMixin,\n Dialog,\n DialogActions,\n DialogContent,\n DoneIcon,\n IconButton,\n LoadingButton,\n Tab,\n Tabs\n} from \"@firecms/ui\";\nimport { YupSchema } from \"./CollectionYupValidation\";\nimport { CollectionDetailsForm } from \"./CollectionDetailsForm\";\nimport { CollectionPropertiesEditorForm } from \"./CollectionPropertiesEditorForm\";\nimport { UnsavedChangesDialog } from \"./UnsavedChangesDialog\";\nimport { SubcollectionsEditTab } from \"./SubcollectionsEditTab\";\nimport { CollectionsConfigController } from \"../../types/config_controller\";\nimport { CollectionEditorWelcomeView } from \"./CollectionEditorWelcomeView\";\nimport { CollectionInference } from \"../../types/collection_inference\";\nimport { getInferenceType, ImportSaveInProgress, useImportConfig } from \"@firecms/data_import_export\";\nimport { buildEntityPropertiesFromData } from \"@firecms/schema_inference\";\nimport { CollectionEditorImportMapping } from \"./import/CollectionEditorImportMapping\";\nimport { CollectionEditorImportDataPreview } from \"./import/CollectionEditorImportDataPreview\";\nimport { cleanPropertiesFromImport } from \"./import/clean_import_data\";\nimport { PersistedCollection } from \"../../types/persisted_collection\";\nimport { Formex, FormexController, useCreateFormex } from \"@firecms/formex\";\nimport { getFullIdPath } from \"./util\";\n\nexport interface CollectionEditorDialogProps {\n open: boolean;\n isNewCollection: boolean;\n initialValues?: {\n group?: string,\n path?: string,\n name?: string,\n }\n editedCollectionId?: string;\n fullPath?: string; // full path of this particular collection, like `products/123/locales`\n parentCollectionIds?: string[]; // path ids of the parent collection, like [`products`]\n handleClose: (collection?: EntityCollection) => void;\n configController: CollectionsConfigController;\n reservedGroups?: string[];\n collectionInference?: CollectionInference;\n extraView?: {\n View: React.ComponentType<{\n path: string\n }>,\n icon: React.ReactNode\n };\n pathSuggestions?: (path?: string) => Promise<string[]>;\n getUser: (uid: string) => User | null;\n getData?: (path: string, parentPaths: string[]) => Promise<object[]>;\n parentCollection?: PersistedCollection;\n}\n\nexport function CollectionEditorDialog(props: CollectionEditorDialogProps) {\n\n const open = props.open;\n\n const [formDirty, setFormDirty] = React.useState<boolean>(false);\n const [unsavedChangesDialogOpen, setUnsavedChangesDialogOpen] = React.useState<boolean>(false);\n\n const handleCancel = useCallback(() => {\n if (!formDirty) {\n props.handleClose(undefined);\n } else {\n setUnsavedChangesDialogOpen(true);\n }\n }, [formDirty, props.handleClose]);\n\n useEffect(() => {\n if (!open) {\n setFormDirty(false);\n setUnsavedChangesDialogOpen(false);\n }\n }, [open]);\n\n return (\n <Dialog\n open={open}\n fullWidth={true}\n fullHeight={true}\n scrollable={false}\n maxWidth={\"7xl\"}\n onOpenChange={(open) => !open ? handleCancel() : undefined}\n >\n {open && <CollectionEditor {...props}\n handleCancel={handleCancel}\n setFormDirty={setFormDirty}/>}\n\n <UnsavedChangesDialog\n open={unsavedChangesDialogOpen}\n handleOk={() => props.handleClose(undefined)}\n handleCancel={() => setUnsavedChangesDialogOpen(false)}\n body={\"There are unsaved changes in this collection\"}/>\n\n </Dialog>\n );\n}\n\ntype EditorView = \"welcome\"\n | \"details\"\n | \"import_data_mapping\"\n | \"import_data_preview\"\n | \"import_data_saving\"\n | \"properties\"\n | \"loading\"\n | \"extra_view\"\n | \"subcollections\";\n\nexport function CollectionEditor<M extends Record<string, any>>(props: CollectionEditorDialogProps & {\n handleCancel: () => void,\n setFormDirty: (dirty: boolean) => void\n}) {\n const { propertyConfigs } = useCustomizationController();\n const navigation = useNavigationController();\n const authController = useAuthController();\n\n const {\n topLevelNavigation,\n collections\n } = navigation;\n\n const initialValuesProp = props.initialValues;\n const includeTemplates = !initialValuesProp?.path && (props.parentCollectionIds ?? []).length === 0;\n const collectionsInThisLevel = (props.parentCollection ? props.parentCollection.subcollections : collections) ?? [];\n const existingPaths = collectionsInThisLevel.map(col => col.path.trim().toLowerCase());\n const existingIds = collectionsInThisLevel.map(col => col.id?.trim().toLowerCase()).filter(Boolean) as string[];\n const [collection, setCollection] = React.useState<PersistedCollection<M> | undefined>();\n const [initialLoadingCompleted, setInitialLoadingCompleted] = React.useState(false);\n\n useEffect(() => {\n try {\n if (navigation.initialised) {\n if (props.editedCollectionId) {\n setCollection(navigation.getCollectionFromPaths<PersistedCollection<M>>([...(props.parentCollectionIds ?? []), props.editedCollectionId]));\n } else {\n setCollection(undefined);\n }\n setInitialLoadingCompleted(true);\n }\n } catch (e) {\n console.error(e);\n }\n }, [navigation.getCollectionFromPaths, props.editedCollectionId, props.parentCollectionIds, navigation.initialised]);\n if (!topLevelNavigation) {\n throw Error(\"Internal: Navigation not ready in collection editor\");\n }\n\n const {\n groups\n }: TopNavigationResult = topLevelNavigation;\n\n const initialCollection = collection\n ? {\n ...collection,\n id: collection.id ?? collection.path ?? randomString(16)\n }\n : undefined;\n\n const initialValues: PersistedCollection<M> = initialCollection\n ? applyPropertyConfigs(initialCollection, propertyConfigs)\n : {\n id: initialValuesProp?.path ?? randomString(16),\n path: initialValuesProp?.path ?? \"\",\n name: initialValuesProp?.name ?? \"\",\n group: initialValuesProp?.group ?? \"\",\n properties: {} as PropertiesOrBuilders<M>,\n propertiesOrder: [],\n icon: coolIconKeys[Math.floor(Math.random() * coolIconKeys.length)],\n ownerId: authController.user?.uid ?? \"\"\n };\n\n if (!initialLoadingCompleted) {\n return <CircularProgressCenter/>;\n }\n\n if (!props.isNewCollection && (!navigation.initialised || !initialLoadingCompleted)) {\n return <CircularProgressCenter/>;\n }\n\n return <CollectionEditorInternal\n {...props}\n initialValues={initialValues}\n existingPaths={existingPaths}\n existingIds={existingIds}\n includeTemplates={includeTemplates}\n collection={collection}\n setCollection={setCollection}\n groups={groups}\n propertyConfigs={propertyConfigs}/>\n\n}\n\nfunction CollectionEditorInternal<M extends Record<string, any>>({\n isNewCollection,\n configController,\n editedCollectionId,\n parentCollectionIds,\n fullPath,\n collectionInference,\n handleClose,\n reservedGroups,\n extraView,\n handleCancel,\n setFormDirty,\n pathSuggestions,\n getUser,\n parentCollection,\n getData,\n existingPaths,\n existingIds,\n includeTemplates,\n collection,\n setCollection,\n initialValues,\n propertyConfigs,\n groups\n }: CollectionEditorDialogProps & {\n handleCancel: () => void,\n setFormDirty: (dirty: boolean) => void,\n initialValues: PersistedCollection<M>,\n existingPaths: string[],\n existingIds: string[],\n includeTemplates: boolean,\n collection: PersistedCollection<M> | undefined,\n setCollection: (collection: PersistedCollection<M>) => void,\n propertyConfigs: Record<string, PropertyConfig<any>>,\n groups: string[],\n }\n) {\n\n const importConfig = useImportConfig();\n const navigation = useNavigationController();\n const snackbarController = useSnackbarController();\n\n // Use this ref to store which properties have errors\n const propertyErrorsRef = useRef({});\n\n const initialView = isNewCollection ? (includeTemplates ? \"welcome\" : \"details\") : \"properties\";\n const [currentView, setCurrentView] = useState<EditorView>(initialView); // this view can edit either the details view or the properties one\n\n const [error, setError] = React.useState<Error | undefined>();\n\n const saveCollection = (updatedCollection: PersistedCollection<M>): Promise<boolean> => {\n const id = updatedCollection.id || updatedCollection.path;\n return configController.saveCollection({\n id,\n collectionData: updatedCollection,\n previousId: editedCollectionId,\n parentCollectionIds\n })\n .then(() => {\n setError(undefined);\n return true;\n })\n .catch((e) => {\n setError(e);\n console.error(e);\n snackbarController.open({\n type: \"error\",\n message: \"Error persisting collection: \" + (e.message ?? \"Details in the console\")\n });\n return false;\n });\n };\n\n const setNextMode = useCallback(() => {\n if (currentView === \"details\") {\n if (importConfig.inUse) {\n setCurrentView(\"import_data_saving\");\n } else if (extraView) {\n setCurrentView(\"extra_view\");\n } else {\n setCurrentView(\"properties\");\n }\n } else if (currentView === \"welcome\") {\n setCurrentView(\"details\");\n } else if (currentView === \"import_data_mapping\") {\n setCurrentView(\"import_data_preview\");\n } else if (currentView === \"import_data_preview\") {\n setCurrentView(\"details\");\n } else if (currentView === \"extra_view\") {\n setCurrentView(\"properties\");\n } else {\n setCurrentView(\"details\");\n }\n\n }, [currentView, importConfig.inUse, extraView]);\n\n const doCollectionInference = useCallback((collection: PersistedCollection<any>) => {\n if (!collectionInference) return undefined;\n return collectionInference?.(collection.path, collection.collectionGroup ?? false, parentCollectionIds ?? []);\n }, [collectionInference, parentCollectionIds]);\n\n const inferCollectionFromData = useCallback(async (newCollection: PersistedCollection<M>) => {\n\n try {\n if (!doCollectionInference) {\n setCollection(newCollection);\n return Promise.resolve(newCollection);\n }\n\n setCurrentView(\"loading\");\n\n const inferredCollection = await doCollectionInference?.(newCollection);\n\n if (!inferredCollection) {\n setCollection(newCollection);\n return Promise.resolve(newCollection);\n }\n const values = {\n ...(newCollection ?? {})\n };\n\n if (Object.keys(inferredCollection.properties ?? {}).length > 0) {\n values.properties = inferredCollection.properties as PropertiesOrBuilders<M>;\n values.propertiesOrder = inferredCollection.propertiesOrder as Extract<keyof M, string>[];\n }\n\n if (!values.propertiesOrder) {\n values.propertiesOrder = Object.keys(values.properties) as Extract<keyof M, string>[];\n return values;\n }\n\n setCollection(values);\n console.debug(\"Inferred collection\", {\n newCollection: newCollection ?? {},\n values\n });\n return values;\n } catch (e: any) {\n console.error(e);\n snackbarController.open({\n type: \"error\",\n message: \"Error inferring collection: \" + (e.message ?? \"Details in the console\")\n });\n return newCollection;\n }\n }, [parentCollectionIds, doCollectionInference]);\n\n const onSubmit = (newCollectionState: PersistedCollection<M>, formexController: FormexController<PersistedCollection<M>>) => {\n console.log(\"Submitting collection\", newCollectionState);\n try {\n\n if (!isNewCollection) {\n saveCollection(newCollectionState).then(() => {\n formexController.resetForm({ values: initialValues });\n handleClose(newCollectionState);\n });\n return;\n }\n\n if (currentView === \"welcome\") {\n setNextMode();\n formexController.resetForm({ values: newCollectionState });\n } else if (currentView === \"details\") {\n if (extraView || importConfig.inUse) {\n formexController.resetForm({ values: newCollectionState });\n setNextMode();\n } else if (isNewCollection) {\n inferCollectionFromData(newCollectionState)\n .then((values) => {\n formexController.resetForm({\n values: values ?? newCollectionState,\n touched: {\n path: true,\n name: true\n }\n });\n }).finally(() => {\n setNextMode();\n });\n } else {\n formexController.resetForm({ values: newCollectionState });\n setNextMode();\n }\n } else if (currentView === \"extra_view\") {\n setNextMode();\n formexController.resetForm({ values: newCollectionState });\n } else if (currentView === \"import_data_mapping\") {\n setNextMode();\n } else if (currentView === \"import_data_preview\") {\n setNextMode();\n } else if (currentView === \"properties\") {\n saveCollection(newCollectionState).then(() => {\n formexController.resetForm({ values: initialValues });\n setNextMode();\n handleClose(newCollectionState);\n });\n } else {\n setNextMode();\n formexController.resetForm({ values: newCollectionState });\n }\n } catch (e: any) {\n snackbarController.open({\n type: \"error\",\n message: \"Error persisting collection: \" + (e.message ?? \"Details in the console\")\n });\n console.error(e);\n formexController.resetForm({ values: newCollectionState });\n }\n };\n\n const validation = (col: PersistedCollection) => {\n\n let errors: Record<string, any> = {};\n const schema = (currentView === \"properties\" || currentView === \"subcollections\" || currentView === \"details\") && YupSchema;\n if (schema) {\n try {\n schema.validateSync(col, { abortEarly: false });\n } catch (e: any) {\n e.inner.forEach((err: any) => {\n errors[err.path] = err.message;\n });\n }\n }\n if (currentView === \"properties\") {\n errors = { ...errors, ...propertyErrorsRef.current };\n }\n if (currentView === \"details\") {\n const pathError = validatePath(col.path, isNewCollection, existingPaths, col.id);\n if (pathError) {\n errors.path = pathError;\n }\n const idError = validateId(col.id, isNewCollection, existingPaths, existingIds);\n if (idError) {\n errors.id = idError;\n }\n }\n return errors;\n };\n\n const formController = useCreateFormex<PersistedCollection<M>>({\n initialValues,\n onSubmit,\n validation\n });\n\n const {\n values,\n setFieldValue,\n isSubmitting,\n dirty,\n submitCount\n } = formController;\n\n const path = values.path ?? editedCollectionId;\n const updatedFullPath = fullPath?.includes(\"/\") ? fullPath?.split(\"/\").slice(0, -1).join(\"/\") + \"/\" + path : path; // TODO: this path is wrong\n const pathError = validatePath(path, isNewCollection, existingPaths, values.id);\n\n const parentPaths = !pathError && parentCollectionIds ? navigation.convertIdsToPaths(parentCollectionIds) : undefined;\n const resolvedPath = !pathError ? navigation.resolveAliasesFrom(updatedFullPath) : undefined;\n const getDataWithPath = resolvedPath && getData ? () => getData(resolvedPath, parentPaths ?? []) : undefined;\n\n useEffect(() => {\n setFormDirty(dirty);\n }, [dirty]);\n\n function onImportDataSet(data: object[]) {\n importConfig.setInUse(true);\n buildEntityPropertiesFromData(data, getInferenceType)\n .then((properties) => {\n const res = cleanPropertiesFromImport(properties);\n\n setFieldValue(\"properties\", res.properties);\n setFieldValue(\"propertiesOrder\", Object.keys(res.properties));\n\n importConfig.setIdColumn(res.idColumn);\n importConfig.setImportData(data);\n importConfig.setHeadersMapping(res.headersMapping);\n importConfig.setOriginProperties(res.properties);\n });\n }\n\n const validValues = Boolean(values.name) && Boolean(values.id);\n\n const onImportMappingComplete = () => {\n const updatedProperties = { ...values.properties };\n if (importConfig.idColumn)\n delete updatedProperties[importConfig.idColumn];\n setFieldValue(\"properties\", updatedProperties);\n // setFieldValue(\"propertiesOrder\", Object.values(importConfig.headersMapping));\n setNextMode();\n };\n\n const editable = collection?.editable === undefined || collection?.editable === true;\n const collectionEditable = editable || isNewCollection;\n\n return <DialogContent fullHeight={true}>\n <Formex value={formController}>\n\n <>\n {!isNewCollection && <Tabs value={currentView}\n className={cn(defaultBorderMixin, \"justify-end bg-gray-50 dark:bg-gray-950 border-b\")}\n onValueChange={(v) => setCurrentView(v as EditorView)}>\n <Tab value={\"details\"}>\n Details\n </Tab>\n <Tab value={\"properties\"}>\n Properties\n </Tab>\n <Tab value={\"subcollections\"}>\n Additional views\n </Tab>\n </Tabs>}\n\n <form noValidate\n onSubmit={formController.handleSubmit}\n className={cn(\n isNewCollection ? \"h-full\" : \"h-[calc(100%-48px)]\",\n \"flex-grow flex flex-col relative\")}>\n\n {currentView === \"loading\" &&\n <CircularProgressCenter/>}\n\n {currentView === \"extra_view\" &&\n path &&\n extraView?.View &&\n <extraView.View path={path}/>}\n\n {currentView === \"welcome\" &&\n <CollectionEditorWelcomeView\n path={path}\n onContinue={(importData) => {\n if (importData) {\n onImportDataSet(importData);\n setCurrentView(\"import_data_mapping\");\n } else {\n setCurrentView(\"details\");\n }\n }}\n existingCollectionPaths={existingPaths}\n parentCollection={parentCollection}\n pathSuggestions={pathSuggestions}/>}\n\n {currentView === \"import_data_mapping\" && importConfig &&\n <CollectionEditorImportMapping importConfig={importConfig}\n collectionEditable={collectionEditable}\n propertyConfigs={propertyConfigs}/>}\n\n {currentView === \"import_data_preview\" && importConfig &&\n <CollectionEditorImportDataPreview importConfig={importConfig}\n properties={values.properties as Properties}\n propertiesOrder={values.propertiesOrder as string[]}/>}\n\n {currentView === \"import_data_saving\" && importConfig &&\n <ImportSaveInProgress importConfig={importConfig}\n collection={values}\n onImportSuccess={async (importedCollection) => {\n snackbarController.open({\n type: \"info\",\n message: \"Data imported successfully\"\n });\n await saveCollection(values);\n handleClose(importedCollection);\n }}\n />}\n\n {currentView === \"details\" &&\n <CollectionDetailsForm\n existingPaths={existingPaths}\n existingIds={existingIds}\n groups={groups}\n parentCollectionIds={parentCollectionIds}\n parentCollection={parentCollection}\n isNewCollection={isNewCollection}/>}\n\n {currentView === \"subcollections\" && collection &&\n <SubcollectionsEditTab\n parentCollection={parentCollection}\n configController={configController}\n getUser={getUser}\n collectionInference={collectionInference}\n parentCollectionIds={parentCollectionIds}\n collection={collection}/>}\n\n {currentView === \"properties\" &&\n <CollectionPropertiesEditorForm\n showErrors={submitCount > 0}\n isNewCollection={isNewCollection}\n reservedGroups={reservedGroups}\n onPropertyError={(propertyKey, namespace, error) => {\n const current = removeUndefined({\n ...propertyErrorsRef.current,\n [getFullIdPath(propertyKey, namespace)]: removeUndefined(error, true)\n }, true);\n propertyErrorsRef.current = current;\n formController.validate();\n }}\n getUser={getUser}\n getData={getDataWithPath}\n doCollectionInference={doCollectionInference}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n extraIcon={extraView?.icon &&\n <IconButton\n color={\"primary\"}\n onClick={() => setCurrentView(\"extra_view\")}>\n {extraView.icon}\n </IconButton>}/>\n }\n\n {currentView !== \"welcome\" && <DialogActions\n position={\"absolute\"}>\n {error && <ErrorView error={error}/>}\n\n {isNewCollection && includeTemplates && currentView === \"import_data_mapping\" &&\n <Button variant={\"text\"}\n type=\"button\"\n onClick={() => {\n importConfig.setInUse(false);\n return setCurrentView(\"welcome\");\n }}>\n <ArrowBackIcon/>\n Back\n </Button>}\n\n {isNewCollection && includeTemplates && currentView === \"import_data_preview\" &&\n <Button variant={\"text\"}\n type=\"button\"\n onClick={() => {\n setCurrentView(\"import_data_mapping\");\n }}>\n <ArrowBackIcon/>\n Back\n </Button>}\n\n {isNewCollection && includeTemplates && currentView === \"details\" &&\n <Button variant={\"text\"}\n type=\"button\"\n onClick={() => setCurrentView(\"welcome\")}>\n <ArrowBackIcon/>\n Back\n </Button>}\n\n {isNewCollection && currentView === \"properties\" && <Button variant={\"text\"}\n type=\"button\"\n onClick={() => setCurrentView(\"details\")}>\n <ArrowBackIcon/>\n Back\n </Button>}\n\n <Button variant={\"text\"}\n onClick={() => {\n handleCancel();\n }}>\n Cancel\n </Button>\n\n {isNewCollection && currentView === \"import_data_mapping\" &&\n <Button\n variant={\"filled\"}\n color=\"primary\"\n onClick={onImportMappingComplete}\n >\n Next\n </Button>}\n\n {isNewCollection && currentView === \"import_data_preview\" &&\n <Button\n variant={\"filled\"}\n color=\"primary\"\n onClick={() => {\n setNextMode();\n }}\n >\n Next\n </Button>}\n\n {isNewCollection && (currentView === \"details\" || currentView === \"properties\") &&\n <LoadingButton\n variant={\"filled\"}\n color=\"primary\"\n type=\"submit\"\n loading={isSubmitting}\n disabled={isSubmitting || (currentView === \"details\" && !validValues)}\n startIcon={currentView === \"properties\"\n ? <DoneIcon/>\n : undefined}\n >\n {currentView === \"details\" && \"Next\"}\n {currentView === \"properties\" && \"Create collection\"}\n </LoadingButton>}\n\n {!isNewCollection && <LoadingButton\n variant=\"filled\"\n color=\"primary\"\n type=\"submit\"\n loading={isSubmitting}\n >\n Update collection\n </LoadingButton>}\n\n </DialogActions>}\n </form>\n </>\n\n </Formex>\n\n </DialogContent>\n\n}\n\nfunction applyPropertyConfigs<M extends Record<string, any> = any>(collection: PersistedCollection<M>, propertyConfigs: Record<string, PropertyConfig<any>>): PersistedCollection<M> {\n const { properties, ...rest } = collection;\n const propertiesResult: PropertiesOrBuilders<any> = {};\n Object.keys(properties).forEach((key) => {\n propertiesResult[key] = applyPropertiesConfig(properties[key] as PropertyOrBuilder, propertyConfigs);\n });\n\n return { ...rest, properties: propertiesResult };\n}\n\nfunction applyPropertiesConfig(property: PropertyOrBuilder, propertyConfigs: Record<string, PropertyConfig<any>>) {\n let internalProperty = property;\n if (propertyConfigs && typeof internalProperty === \"object\" && internalProperty.propertyConfig) {\n const propertyConfig = propertyConfigs[internalProperty.propertyConfig];\n if (propertyConfig && isPropertyBuilder(propertyConfig.property)) {\n internalProperty = propertyConfig.property;\n } else {\n\n if (propertyConfig) {\n internalProperty = mergeDeep(propertyConfig.property, internalProperty);\n }\n\n if (!isPropertyBuilder(internalProperty) && internalProperty.dataType === \"map\" && internalProperty.properties) {\n const properties: Record<string, PropertyOrBuilder> = {};\n Object.keys(internalProperty.properties).forEach((key) => {\n properties[key] = applyPropertiesConfig(((internalProperty as MapProperty).properties as Properties)[key] as Property, propertyConfigs);\n });\n internalProperty = { ...internalProperty, properties };\n }\n\n }\n }\n return internalProperty;\n\n}\n\nconst validatePath = (value: string, isNewCollection: boolean, existingPaths: string[], idValue?: string) => {\n let error;\n if (!value) {\n error = \"You must specify a path in the database for this collection\";\n }\n // if (isNewCollection && existingIds?.includes(value.trim().toLowerCase()))\n // error = \"There is already a collection which uses this path as an id\";\n if (isNewCollection && existingPaths?.includes(value.trim().toLowerCase()) && !idValue)\n error = \"There is already a collection with the specified path. If you want to have multiple collections referring to the same database path, make sure the have different ids\";\n\n const subpaths = removeInitialAndTrailingSlashes(value).split(\"/\");\n if (subpaths.length % 2 === 0) {\n error = `Collection paths must have an odd number of segments: ${value}`;\n }\n return error;\n};\n\nconst validateId = (value: string, isNewCollection: boolean, existingPaths: string[], existingIds: string[]) => {\n if (!value) return undefined;\n let error;\n if (isNewCollection && existingPaths?.includes(value.trim().toLowerCase()))\n error = \"There is already a collection that uses this value as a path\";\n if (isNewCollection && existingIds?.includes(value.trim().toLowerCase()))\n error = \"There is already a collection which uses this id\";\n // if (error) {\n // setAdvancedPanelExpanded(true);\n // }\n return error;\n};\n","import React, { PropsWithChildren, useCallback, useEffect } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { CollectionsConfigController } from \"./types/config_controller\";\nimport {\n Property,\n useCustomizationController,\n useNavigationController,\n User,\n useSnackbarController\n} from \"@firecms/core\";\nimport { CollectionEditorDialog } from \"./ui/collection_editor/CollectionEditorDialog\";\nimport { useNavigate } from \"react-router\";\nimport { CollectionEditorController } from \"./types/collection_editor_controller\";\nimport { CollectionEditorPermissionsBuilder } from \"./types/config_permissions\";\nimport { CollectionInference } from \"./types/collection_inference\";\nimport { PropertyFormDialog } from \"./ui/collection_editor/PropertyEditView\";\nimport { PersistedCollection } from \"./types/persisted_collection\";\n\nexport const ConfigControllerContext = React.createContext<CollectionsConfigController>({} as any);\nexport const CollectionEditorContext = React.createContext<CollectionEditorController>({} as any);\n\nexport interface ConfigControllerProviderProps {\n /**\n * Controller for managing the collections' config.\n */\n collectionConfigController: CollectionsConfigController;\n\n /**\n * Callback used to infer the schema from the data.\n */\n collectionInference?: CollectionInference;\n\n /**\n * Use this builder to define the permissions for the configuration per user.\n */\n configPermissions?: CollectionEditorPermissionsBuilder;\n\n /**\n * Groups that cannot be used to create new collections.\n */\n reservedGroups?: string[];\n\n extraView?: {\n View: React.ComponentType<{\n path: string\n }>,\n icon: React.ReactNode\n };\n\n pathSuggestions?: (path?: string) => Promise<string[]>;\n\n getUser: (uid: string) => User | null\n\n getData?: (path: string, parentPaths: string[]) => Promise<object[]>;\n\n onAnalyticsEvent?: (event: string, params?: object) => void;\n\n}\n\nexport const ConfigControllerProvider = React.memo(\n function ConfigControllerProvider({\n children,\n collectionConfigController,\n configPermissions,\n reservedGroups,\n collectionInference,\n extraView,\n pathSuggestions,\n getUser,\n getData,\n onAnalyticsEvent\n }: PropsWithChildren<ConfigControllerProviderProps>) {\n\n const navigation = useNavigationController();\n const navigate = useNavigate();\n const snackbarController = useSnackbarController();\n const { propertyConfigs } = useCustomizationController();\n\n const {\n collections\n } = navigation;\n const existingPaths = (collections ?? []).map(col => col.path.trim().toLowerCase());\n\n const [rootPathSuggestions, setRootPathSuggestions] = React.useState<string[] | undefined>();\n useEffect(() => {\n if (pathSuggestions) {\n pathSuggestions().then((paths) => {\n setRootPathSuggestions(paths.filter(p => !existingPaths.includes(p.trim().toLowerCase())));\n });\n }\n }, [pathSuggestions]);\n\n const [currentDialog, setCurrentDialog] = React.useState<{\n isNewCollection: boolean,\n parentCollection?: PersistedCollection,\n editedCollectionId?: string,\n fullPath?: string,\n parentCollectionIds: string[],\n initialValues?: {\n path?: string,\n group?: string,\n name?: string\n },\n redirect: boolean\n }>();\n\n const [currentPropertyDialog, setCurrentPropertyDialog] = React.useState<{\n propertyKey?: string,\n property?: Property,\n namespace?: string,\n parentCollection?: PersistedCollection,\n currentPropertiesOrder?: string[],\n editedCollectionId: string,\n fullPath?: string,\n parentCollectionIds: string[],\n collectionEditable: boolean;\n }>();\n\n const defaultConfigPermissions: CollectionEditorPermissionsBuilder = useCallback(() => ({\n createCollections: true,\n editCollections: true,\n deleteCollections: true\n }), []);\n\n const editCollection = useCallback(({\n id,\n fullPath,\n parentCollectionIds,\n parentCollection\n }: {\n id?: string,\n fullPath?: string,\n parentCollectionIds: string[],\n parentCollection?: PersistedCollection\n }) => {\n console.debug(\"Edit collection\", id, fullPath, parentCollectionIds, parentCollection);\n onAnalyticsEvent?.(\"edit_collection\", { id, fullPath });\n setCurrentDialog({\n editedCollectionId: id,\n fullPath,\n parentCollectionIds,\n isNewCollection: false,\n parentCollection,\n redirect: false\n });\n }, []);\n\n const editProperty = useCallback(({\n propertyKey,\n property,\n editedCollectionId,\n currentPropertiesOrder,\n parentCollectionIds,\n collection\n }: {\n propertyKey?: string,\n property?: Property,\n currentPropertiesOrder?: string[],\n editedCollectionId: string,\n parentCollectionIds: string[],\n collection: PersistedCollection,\n }) => {\n console.debug(\"edit property\", propertyKey, property, editedCollectionId, currentPropertiesOrder, parentCollectionIds, collection);\n onAnalyticsEvent?.(\"edit_property\", { propertyKey, editedCollectionId });\n // namespace is all the path until the last dot\n const namespace = propertyKey && propertyKey.includes(\".\")\n ? propertyKey.substring(0, propertyKey.lastIndexOf(\".\"))\n : undefined;\n const propertyKeyWithoutNamespace = propertyKey && propertyKey.includes(\".\")\n ? propertyKey.substring(propertyKey.lastIndexOf(\".\") + 1)\n : propertyKey;\n setCurrentPropertyDialog({\n propertyKey: propertyKeyWithoutNamespace,\n property,\n namespace,\n currentPropertiesOrder,\n editedCollectionId: editedCollectionId,\n parentCollectionIds,\n collectionEditable: collection?.editable ?? false\n });\n }, []);\n\n const createCollection = React.useCallback(({\n parentCollectionIds,\n parentCollection,\n initialValues,\n redirect,\n sourceClick\n }: {\n parentCollectionIds: string[],\n parentCollection?: PersistedCollection\n initialValues?: {\n group?: string,\n path?: string,\n name?: string\n },\n redirect: boolean,\n sourceClick?: string\n }) => {\n console.debug(\"Create collection\", { parentCollectionIds, parentCollection, initialValues, redirect, sourceClick });\n onAnalyticsEvent?.(\"create_collection\", { parentCollectionIds, parentCollection, initialValues, redirect, sourceClick });\n setCurrentDialog({\n isNewCollection: true,\n parentCollectionIds,\n parentCollection,\n initialValues,\n redirect\n });\n }, []);\n\n const getPathSuggestions = !pathSuggestions\n ? undefined\n : (path?: string) => {\n if (!path && rootPathSuggestions)\n return Promise.resolve(rootPathSuggestions);\n else {\n return pathSuggestions?.(path);\n }\n }\n\n return (\n <ConfigControllerContext.Provider value={collectionConfigController}>\n <CollectionEditorContext.Provider\n value={{\n editCollection,\n createCollection,\n editProperty,\n configPermissions: configPermissions ?? defaultConfigPermissions,\n rootPathSuggestions\n }}>\n\n {children}\n\n <CollectionEditorDialog\n open={Boolean(currentDialog)}\n configController={collectionConfigController}\n isNewCollection={false}\n collectionInference={collectionInference}\n {...currentDialog}\n getData={getData}\n reservedGroups={reservedGroups}\n extraView={extraView}\n pathSuggestions={getPathSuggestions}\n getUser={getUser}\n handleClose={(collection) => {\n if (currentDialog?.redirect) {\n if (collection && currentDialog?.isNewCollection && !currentDialog.parentCollectionIds.length) {\n const url = navigation.buildUrlCollectionPath(collection.id ?? collection.path);\n navigate(url);\n }\n }\n setCurrentDialog(undefined);\n }}/>\n\n {/* Used for editing properties*/}\n <PropertyFormDialog\n open={Boolean(currentPropertyDialog)}\n includeIdAndName={true}\n existingProperty={Boolean(currentPropertyDialog?.propertyKey)}\n autoUpdateId={!currentPropertyDialog ? false : !currentPropertyDialog?.propertyKey}\n autoOpenTypeSelect={!currentPropertyDialog ? false : !currentPropertyDialog?.propertyKey}\n inArray={false}\n collectionEditable={currentPropertyDialog?.collectionEditable ?? false}\n getData={getData && currentPropertyDialog?.editedCollectionId\n ? () => {\n console.debug(\"get data for property\", currentPropertyDialog?.editedCollectionId);\n const resolvedPath = navigation.resolveAliasesFrom(currentPropertyDialog.editedCollectionId!)\n return getData(resolvedPath, []);\n }\n : undefined}\n onPropertyChanged={({\n id,\n property\n }) => {\n if (!currentPropertyDialog) return;\n if (!id) return;\n const newProperty = !(currentPropertyDialog.propertyKey);\n return collectionConfigController.saveProperty({\n path: currentPropertyDialog?.editedCollectionId,\n property,\n propertyKey: id,\n newPropertiesOrder: newProperty && currentPropertyDialog.currentPropertiesOrder ? [...currentPropertyDialog.currentPropertiesOrder, id] : undefined,\n namespace: currentPropertyDialog.namespace,\n parentCollectionIds: currentPropertyDialog.parentCollectionIds\n })\n .catch((e) => {\n console.error(e);\n snackbarController.open({\n type: \"error\",\n message: \"Error persisting property: \" + (e.message ?? \"Details in the console\")\n });\n return false;\n });\n }}\n onPropertyChangedImmediate={false}\n onDelete={() => {\n if (!currentPropertyDialog?.propertyKey) return;\n const newPropertiesOrder = currentPropertyDialog?.currentPropertiesOrder?.filter(p => p !== currentPropertyDialog?.propertyKey);\n return collectionConfigController.deleteProperty({\n path: currentPropertyDialog?.editedCollectionId,\n propertyKey: currentPropertyDialog?.propertyKey,\n namespace: currentPropertyDialog?.namespace,\n newPropertiesOrder,\n parentCollectionIds: currentPropertyDialog?.parentCollectionIds\n })\n .then(() => {\n setCurrentPropertyDialog(undefined);\n }).catch((e) => {\n console.error(e);\n snackbarController.open({\n type: \"error\",\n message: \"Error deleting property: \" + (e.message ?? \"Details in the console\")\n });\n return false;\n });\n }}\n onError={() => {\n }}\n onOkClicked={() => {\n setCurrentPropertyDialog(undefined);\n }}\n onCancel={() => {\n setCurrentPropertyDialog(undefined);\n }}\n initialErrors={{}}\n forceShowErrors={false}\n existingPropertyKeys={[]}\n allowDataInference={true}\n propertyConfigs={propertyConfigs}\n property={currentPropertyDialog?.property}\n propertyKey={currentPropertyDialog?.propertyKey}/>\n\n </CollectionEditorContext.Provider>\n\n </ConfigControllerContext.Provider>\n );\n }, equal);\n","import { useContext } from \"react\";\nimport { CollectionEditorController } from \"./types/collection_editor_controller\";\nimport { CollectionEditorContext } from \"./ConfigControllerProvider\";\n\n/**\n * Hook to access the collection editor controller.\n * The methods in this controller can be used to open the collection editor dialog.\n */\nexport const useCollectionEditorController = (): CollectionEditorController => useContext(CollectionEditorContext);\n","import { useContext } from \"react\";\nimport { CollectionsConfigController } from \"./types/config_controller\";\nimport { ConfigControllerContext } from \"./ConfigControllerProvider\";\n\n/**\n * Use this hook to access the configuration controller.\n * You can use it to get the list of collections, and to save/delete collections.\n */\nexport const useCollectionsConfigController = (): CollectionsConfigController => useContext(ConfigControllerContext);\n","import equal from \"react-fast-compare\"\n\nimport {\n CollectionActionsProps,\n mergeDeep,\n useAuthController,\n useNavigationController,\n useSnackbarController\n} from \"@firecms/core\";\nimport { Button, IconButton, SaveIcon, SettingsIcon, Tooltip, UndoIcon, } from \"@firecms/ui\";\n\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { useCollectionsConfigController } from \"../useCollectionsConfigController\";\nimport { PersistedCollection } from \"../types/persisted_collection\";\n\nexport function EditorCollectionAction({\n path: fullPath,\n parentCollectionIds,\n collection,\n tableController\n }: CollectionActionsProps) {\n\n const authController = useAuthController();\n const navigationController = useNavigationController();\n const collectionEditorController = useCollectionEditorController();\n const configController = useCollectionsConfigController();\n const snackbarController = useSnackbarController();\n\n const parentCollection = navigationController.getCollectionFromIds(parentCollectionIds);\n\n const canEditCollection = collectionEditorController.configPermissions\n ? collectionEditorController.configPermissions({\n user: authController.user,\n collection\n }).editCollections\n : true;\n\n let saveDefaultFilterButton = null;\n if (!equal(getObjectOrNull(tableController.filterValues), getObjectOrNull(collection.initialFilter)) ||\n !equal(getObjectOrNull(tableController.sortBy), getObjectOrNull(collection.initialSort))) {\n saveDefaultFilterButton = <>\n {(collection.initialFilter || collection.initialSort) && <Tooltip\n title={\"Reset to default filter and sort\"}>\n <Button\n color={\"primary\"}\n size={\"small\"}\n variant={\"text\"}\n onClick={() => {\n tableController.clearFilter?.();\n if (collection?.initialFilter)\n tableController.setFilterValues?.(collection?.initialFilter);\n if (collection?.initialSort)\n tableController.setSortBy?.(collection?.initialSort);\n }}>\n <UndoIcon/>\n </Button>\n </Tooltip>}\n\n <Tooltip\n title={tableController.sortBy || tableController.filterValues ? \"Save default filter and sort\" : \"Clear default filter and sort\"}>\n <Button\n color={\"primary\"}\n size={\"small\"}\n variant={\"outlined\"}\n onClick={() => configController\n ?.saveCollection({\n id: collection.id,\n parentCollectionIds,\n collectionData: mergeDeep(collection as PersistedCollection,\n {\n initialFilter: tableController.filterValues ?? null,\n initialSort: tableController.sortBy ?? null\n })\n }).then(() => {\n snackbarController.open({\n type: \"success\",\n message: \"Default config saved\"\n });\n })}>\n <SaveIcon/>\n </Button>\n </Tooltip>\n </>;\n }\n\n const editorButton = <Tooltip\n title={canEditCollection ? \"Edit collection\" : \"You don't have permissions to edit this collection\"}>\n <IconButton\n color={\"primary\"}\n disabled={!canEditCollection}\n onClick={canEditCollection\n ? () => collectionEditorController?.editCollection({ id: collection.id, fullPath, parentCollectionIds, parentCollection: parentCollection as PersistedCollection })\n : undefined}>\n <SettingsIcon/>\n </IconButton>\n </Tooltip>;\n\n return <>\n {canEditCollection && saveDefaultFilterButton}\n {editorButton}\n </>\n\n}\n\nfunction getObjectOrNull(o?: object): object | null {\n if (o && Object.keys(o).length === 0)\n return o\n return o ?? null;\n}\n","import {\n DeleteConfirmationDialog,\n PluginHomePageActionsProps,\n useAuthController,\n useSnackbarController\n} from \"@firecms/core\";\nimport { DeleteIcon, IconButton, Menu, MenuItem, MoreVertIcon, SettingsIcon, } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { useCallback, useState } from \"react\";\nimport { useCollectionsConfigController } from \"../useCollectionsConfigController\";\n\nexport function HomePageEditorCollectionAction({\n path,\n collection\n }: PluginHomePageActionsProps) {\n\n const snackbarController = useSnackbarController();\n const authController = useAuthController();\n const configController = useCollectionsConfigController();\n const collectionEditorController = useCollectionEditorController();\n\n const permissions = collectionEditorController.configPermissions({\n user: authController.user,\n collection\n });\n\n const onEditCollectionClicked = useCallback(() => {\n collectionEditorController?.editCollection({ id: collection.id, parentCollectionIds: [] });\n }, [collectionEditorController, path]);\n\n const [deleteRequested, setDeleteRequested] = useState(false);\n\n const deleteCollection = useCallback(() => {\n configController?.deleteCollection({ id: collection.id }).then(() => {\n setDeleteRequested(false);\n snackbarController.open({\n message: \"Collection deleted\",\n type: \"success\"\n });\n });\n }, [path, configController]);\n\n return <>\n\n <div>\n {permissions.deleteCollections &&\n <Menu\n trigger={<IconButton>\n <MoreVertIcon size={\"small\"}/>\n </IconButton>}\n >\n <MenuItem onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n setDeleteRequested(true);\n }}>\n <DeleteIcon/>\n Delete\n </MenuItem>\n\n </Menu>\n\n }\n\n {permissions.editCollections &&\n <IconButton\n onClick={(event) => {\n onEditCollectionClicked();\n }}>\n <SettingsIcon size={\"small\"}/>\n </IconButton>}\n </div>\n\n <DeleteConfirmationDialog\n open={deleteRequested}\n onAccept={deleteCollection}\n onCancel={() => setDeleteRequested(false)}\n title={<>Delete this collection?</>}\n body={<> This will <b>not\n delete any data</b>, only\n the collection in the CMS</>}/>\n </>;\n\n}\n","import { PluginHomePageAdditionalCardsProps, useAuthController } from \"@firecms/core\";\nimport { AddIcon, Card, cn, Typography } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\n\nexport function NewCollectionCard({\n group,\n context\n }: PluginHomePageAdditionalCardsProps) {\n\n if (!context.navigation.topLevelNavigation)\n throw Error(\"Navigation not ready in FireCMSHomePage\");\n\n const authController = useAuthController();\n\n const collectionEditorController = useCollectionEditorController();\n const canCreateCollections = collectionEditorController.configPermissions\n ? collectionEditorController.configPermissions({\n user: authController.user,\n }).createCollections\n : true;\n\n return (\n <Card className={cn(\"h-full p-4 min-h-[124px]\")}\n onClick={collectionEditorController && canCreateCollections\n ? () => collectionEditorController.createCollection({\n initialValues: group ? { group } : undefined,\n parentCollectionIds: [],\n redirect: true,\n sourceClick: \"new_collection_card\"\n })\n : undefined}>\n\n <div\n className=\"flex flex-col items-start h-full w-full items-center justify-center h-full w-full flex-grow flex-col\">\n <AddIcon color=\"primary\" size={\"large\"}/>\n <Typography color=\"primary\"\n variant={\"caption\"}\n className={\"font-medium\"}>{\"Add new collection\".toUpperCase()}</Typography>\n\n {!canCreateCollections &&\n <Typography variant={\"caption\"}>You don&apos;t have permissions to create\n collections</Typography>\n }\n </div>\n\n </Card>\n );\n}\n","import { unslugify, useAuthController, useNavigationController } from \"@firecms/core\";\nimport { AddIcon, Chip, CircularProgress, Collapse, Typography, } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport React from \"react\";\n\nexport function RootCollectionSuggestions({ introMode }: { introMode?: \"new_project\" | \"existing_project\" }) {\n\n const authController = useAuthController();\n const navigationController = useNavigationController();\n\n const collectionEditorController = useCollectionEditorController();\n const canCreateCollections = collectionEditorController.configPermissions\n ? collectionEditorController.configPermissions({\n user: authController.user\n }).createCollections\n : true;\n\n const rootPathSuggestions = collectionEditorController.rootPathSuggestions;\n\n const showSuggestions = (rootPathSuggestions ?? []).length > 3 || ((navigationController.collections ?? []).length === 0 && (rootPathSuggestions ?? []).length > 0);\n const forceShowSuggestions = introMode === \"existing_project\";\n return <Collapse\n in={forceShowSuggestions || showSuggestions}>\n\n <div\n className={\"flex flex-col gap-1 p-2 my-4\"}>\n\n {!introMode && <Typography variant={\"body2\"} color={\"secondary\"}>\n Create a collection <b>automatically</b> from your data:\n </Typography>}\n\n {introMode === \"existing_project\" && <Typography>\n You will see your <b>database collections</b> here, a few seconds after project creation\n </Typography>}\n\n <div\n className={\"flex flex-row gap-1 overflow-scroll no-scrollbar \"}>\n {(rootPathSuggestions ?? []).map((path) => {\n return (\n <div key={path}>\n <Chip\n icon={<AddIcon size={\"small\"}/>}\n colorScheme={\"cyanLighter\"}\n onClick={collectionEditorController && canCreateCollections\n ? () => collectionEditorController.createCollection({\n initialValues: { path, name: unslugify(path) },\n parentCollectionIds: [],\n redirect: true,\n sourceClick: \"root_collection_suggestion\"\n })\n : undefined}\n size=\"small\">\n {path}\n </Chip>\n </div>\n );\n })}\n {rootPathSuggestions === undefined && <CircularProgress size={\"small\"}/>}\n {rootPathSuggestions?.length === 0 && <Typography variant={\"caption\"}>No suggestions</Typography>}\n </div>\n </div>\n </Collapse>\n}\n","import { ResolvedProperty } from \"@firecms/core\";\nimport { IconButton, SettingsIcon, Tooltip } from \"@firecms/ui\";\nimport React from \"react\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { PersistedCollection } from \"../types/persisted_collection\";\n\nexport function CollectionViewHeaderAction({\n propertyKey,\n onHover,\n property,\n fullPath,\n parentCollectionIds,\n collection\n }: {\n property: ResolvedProperty,\n propertyKey: string,\n onHover: boolean,\n fullPath: string,\n parentCollectionIds: string[],\n collection: PersistedCollection;\n}) {\n\n const collectionEditorController = useCollectionEditorController();\n\n return (\n <Tooltip title={\"Edit\"}>\n <IconButton\n className={onHover ? \"bg-white dark:bg-gray-950\" : \"hidden\"}\n onClick={() => {\n collectionEditorController.editProperty({\n propertyKey,\n property,\n editedCollectionId: collection.id,\n parentCollectionIds,\n collection\n });\n }}\n size={\"small\"}>\n <SettingsIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>\n )\n}\n","import { getDefaultPropertiesOrder, useAuthController } from \"@firecms/core\";\nimport { AddIcon, Tooltip } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { PersistedCollection } from \"../types/persisted_collection\";\n\nexport function PropertyAddColumnComponent({\n fullPath,\n parentCollectionIds,\n collection\n }: {\n fullPath: string,\n parentCollectionIds: string[],\n collection: PersistedCollection;\n}) {\n\n const authController = useAuthController();\n const collectionEditorController = useCollectionEditorController();\n const canEditCollection = collectionEditorController.configPermissions\n ? collectionEditorController.configPermissions({\n user: authController.user,\n collection\n }).editCollections\n : true;\n\n return (\n <Tooltip title={canEditCollection ? \"Add new property\" : \"You don't have permission to add new properties\"}>\n <div\n className={\"p-0.5 w-20 h-full flex items-center justify-center cursor-pointer bg-gray-100 bg-opacity-40 hover:bg-gray-100 dark:bg-gray-950 dark:bg-opacity-40 dark:hover:bg-gray-950\"}\n // className={onHover ? \"bg-white dark:bg-gray-950\" : undefined}\n onClick={() => {\n collectionEditorController.editProperty({\n editedCollectionId: collection.id,\n parentCollectionIds,\n currentPropertiesOrder: getDefaultPropertiesOrder(collection),\n collection\n });\n }}>\n <AddIcon color={\"inherit\"}/>\n </div>\n </Tooltip>\n )\n}\n","import { AddIcon, Button } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\n\nexport function NewCollectionButton() {\n const collectionEditorController = useCollectionEditorController();\n return <Button className={\"min-w-fit\"}\n variant={\"outlined\"}\n onClick={() => collectionEditorController.createCollection({\n parentCollectionIds: [],\n redirect: true,\n sourceClick: \"new_collection_button\"\n })}>\n <AddIcon/>\n New collection\n </Button>\n}\n","import React from \"react\";\nimport { FireCMSPlugin, useAuthController, useNavigationController, User } from \"@firecms/core\";\nimport { ConfigControllerProvider } from \"./ConfigControllerProvider\";\nimport { CollectionEditorPermissionsBuilder } from \"./types/config_permissions\";\nimport { EditorCollectionAction } from \"./ui/EditorCollectionAction\";\nimport { HomePageEditorCollectionAction } from \"./ui/HomePageEditorCollectionAction\";\nimport { NewCollectionCard } from \"./ui/NewCollectionCard\";\nimport { PersistedCollection } from \"./types/persisted_collection\";\nimport { CollectionInference } from \"./types/collection_inference\";\nimport { CollectionsConfigController } from \"./types/config_controller\";\nimport { RootCollectionSuggestions } from \"./ui/RootCollectionSuggestions\";\nimport { CollectionViewHeaderAction } from \"./ui/CollectionViewHeaderAction\";\nimport { PropertyAddColumnComponent } from \"./ui/PropertyAddColumnComponent\";\nimport { NewCollectionButton } from \"./ui/NewCollectionButton\";\nimport { AddIcon, Button, Typography } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"./useCollectionEditorController\";\n\nexport interface CollectionConfigControllerProps<EC extends PersistedCollection = PersistedCollection, UserType extends User = User> {\n\n /**\n * Firebase app where the configuration is saved.\n */\n collectionConfigController: CollectionsConfigController;\n\n /**\n * Define what actions can be performed on the configuration.\n */\n configPermissions?: CollectionEditorPermissionsBuilder<UserType, EC>;\n\n /**\n * The words you define here will not be allowed to be used as group\n * names when creating collections.\n * e.g. [\"admin\"]\n */\n reservedGroups: string[];\n\n extraView?: {\n View: React.ComponentType<{\n path: string\n }>,\n icon: React.ReactNode\n };\n\n pathSuggestions?: (path: string) => Promise<string[]>;\n\n collectionInference?: CollectionInference;\n\n getData?: (path: string, parentPaths: string[]) => Promise<object[]>;\n\n getUser: (uid: string) => UserType | null;\n\n onAnalyticsEvent?: (event: string, params?: object) => void;\n\n introMode?: \"new_project\" | \"existing_project\";\n\n}\n\n/**\n * Use this hook to initialise the Collection Editor plugin.\n * This is likely the only hook you will need to use.\n * @param firebaseApp Firebase app where your project data lives.\n * @param configPermissions\n * @param reservedGroups\n * @param extraView\n * @param pathSuggestions\n * @param getUser\n * @param collectionInference\n */\nexport function useCollectionEditorPlugin<EC extends PersistedCollection = PersistedCollection, UserType extends User = User>\n({\n collectionConfigController,\n introMode,\n configPermissions,\n reservedGroups,\n extraView,\n pathSuggestions,\n getUser,\n collectionInference,\n getData,\n onAnalyticsEvent\n }: CollectionConfigControllerProps<EC, UserType>): FireCMSPlugin<any, any, PersistedCollection> {\n\n return {\n name: \"Collection Editor\",\n loading: collectionConfigController.loading,\n collections: {\n CollectionActions: EditorCollectionAction\n },\n provider: {\n Component: ConfigControllerProvider,\n props: {\n collectionConfigController,\n configPermissions,\n collectionInference,\n reservedGroups,\n extraView,\n pathSuggestions,\n getUser,\n getData,\n onAnalyticsEvent\n }\n },\n homePage: {\n additionalActions: <NewCollectionButton/>,\n additionalChildrenStart: introMode ? <IntroWidget introMode={introMode}/> : undefined,\n additionalChildrenEnd: <RootCollectionSuggestions introMode={introMode}/>,\n CollectionActions: HomePageEditorCollectionAction,\n AdditionalCards: introMode ? undefined : NewCollectionCard,\n },\n collectionView: {\n HeaderAction: CollectionViewHeaderAction,\n AddColumnComponent: PropertyAddColumnComponent\n }\n };\n}\n\nexport function IntroWidget({ introMode }: {\n introMode?: \"new_project\" | \"existing_project\";\n}) {\n\n const navigation = useNavigationController();\n if (!navigation.topLevelNavigation)\n throw Error(\"Navigation not ready in FireCMSHomePage\");\n\n const authController = useAuthController();\n\n const collectionEditorController = useCollectionEditorController();\n const canCreateCollections = collectionEditorController.configPermissions\n ? collectionEditorController.configPermissions({\n user: authController.user,\n }).createCollections\n : true;\n\n return (\n <div className={\"mt-8 flex flex-col mt-8 p-2\"}>\n <Typography variant={\"h4\"} className=\"mb-4\">Welcome</Typography>\n <Typography paragraph={true}>Your admin panel is ready ✌️</Typography>\n <Typography paragraph={true}>\n Start building collections in FireCMS easily. Map them to your existing\n database data, import from files, or use our templates. Simplify your data management process\n now.\n </Typography>\n {canCreateCollections && <Button\n className={\"mt-4\"}\n onClick={collectionEditorController && canCreateCollections\n ? () => collectionEditorController.createCollection({\n parentCollectionIds: [],\n redirect: true,\n sourceClick: \"new_collection_card\"\n })\n : undefined}>\n <AddIcon/>Create your first collection\n </Button>}\n </div>\n );\n}\n","import { ErrorView, unslugify, useNavigationController } from \"@firecms/core\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { Button } from \"@firecms/ui\";\n\nexport function MissingReferenceWidget({ path: pathProp }: {\n path: string\n}) {\n const navigation = useNavigationController();\n const path = getLastSegment(pathProp);\n const parentCollectionIds = navigation.getParentCollectionIds(pathProp);\n const collectionEditor = useCollectionEditorController();\n return <div className={\"p-1 flex flex-col items-center\"}>\n <ErrorView error={\"No collection for path: \" + path}/>\n <Button className={\"mx-2\"} variant={\"outlined\"} size={\"small\"}\n onClick={() => {\n collectionEditor.createCollection({\n initialValues: { path, name: unslugify(path) },\n parentCollectionIds,\n redirect: false,\n sourceClick: \"missing_reference\"\n });\n }}>\n Create\n </Button>\n </div>;\n}\n\nfunction getParentPathSegments(path: string): string[] {\n const segments = path.split(\"/\");\n return segments.filter((segment, index) => index % 2 === 0 && index !== segments.length - 1);\n}\n\nfunction getLastSegment(path: string): string {\n const segments = path.split(\"/\");\n return segments[segments.length - 1];\n}\n"],"names":["YupSchema","Yup","FieldHelperView","error","children","jsx","Typography","CollectionDetailsForm","isNewCollection","reservedGroups","existingPaths","existingIds","groups","parentCollection","groupRef","React","values","setFieldValue","handleChange","touched","errors","setFieldTouched","isSubmitting","submitCount","useFormex","iconDialogOpen","setIconDialogOpen","useState","advancedPanelExpanded","setAdvancedPanelExpanded","updateName","name","getIn","toSnakeCase","singular","useEffect","collectionIcon","IconForView","groupOptions","group","inputFocused","autoCompleteOpen","setAutoCompleteOpen","useAutoComplete","isSubcollection","customIdValue","showErrors","Container","jsxs","Tooltip","IconButton","Chip","TextField","e","cn","Field","DebouncedTextField","event","Autocomplete","index","AutocompleteItem","ExpandablePanel","SettingsIcon","Select","value","SelectItem","v","BooleanSwitchWithLabel","Dialog","SearchIconsView","icon","idToPropertiesPath","id","namespaceToPropertiesPath","namespace","namespaceToPropertiesOrderPath","getFullId","propertyKey","propertyNamespace","getFullIdPath","keyWithNamespace","EnumForm","enumValues","onValuesChanged","onError","updateIds","disabled","allowDataInference","getData","formex","useCreateFormex","enumValue","hasError","Formex","EnumFormFields","enumValuesPath","shouldUpdateId","lastInternalIdAdded","setLastInternalIdAdded","editDialogIndex","setEditDialogIndex","inferring","setInferring","inferredValues","buildEntry","internalId","justAdded","entryError","EnumEntry","ListIcon","Button","data","flatData","fieldData","currentEnumValues","newEnumValues","extractEnumFromValues","CircularProgress","AutoAwesomeIcon","Paper","ArrayContainer","EnumEntryDialog","updateId","autoFocus","onDialogOpen","inferredEntry","shouldUpdateIdRef","idValue","labelValue","currentLabelRef","Fragment","Badge","prevProps","nextProps","equal","open","onClose","idError","DialogContent","DialogActions","SwitchControl","field","form","label","tooltip","size","allowIndeterminate","formControlLabel","checked","GeneralPropertyValidation","validationRequired","validationRequiredMessage","StringPropertyValidation","length","lowercase","matches","max","min","trim","uppercase","validationLength","validationMin","validationMax","validationTrim","validationMatches","validationLowercase","validationUppercase","matchesError","matchesValue","matchesStringValue","serializeRegExp","ArrayPropertyValidation","ValidationPanel","RuleIcon","EnumPropertyField","multiselect","setFieldError","snackbarContext","useSnackbarController","defaultValue","valuesEnumValues","useMemo","resolveEnumValues","res","d","enumIds","fileTypes","StoragePropertyField","multiple","existing","baseStoragePath","acceptedFiles","fileName","storagePath","storeUrl","fileNameValue","storagePathValue","storedValue","fileTypesValue","allFileTypesSelected","handleTypesChange","hasFilenameCallback","hasStoragePathCallback","FileUploadIcon","MultiSelect","selected","MultiSelectItem","Checkbox","editableProperty","property","isPropertyBuilder","eProperty","removeNonEditableProperties","properties","_","key","propertyOrBuilder","a","b","PropertyFieldPreview","onClick","includeName","includeEditButton","propertyConfigs","useCustomizationController","propertyConfig","getFieldConfig","borderColorClass","ErrorBoundary","PropertyConfigBadge","cardMixin","cardClickableMixin","cardSelectedMixin","NonEditablePropertyPreview","FunctionsIcon","RemoveCircleIcon","PropertyTree","selectedPropertyKey","onPropertyClick","propertiesOrderProp","additionalFields","onPropertyMove","onPropertyRemove","className","inferredPropertyKeys","collectionEditable","propertiesOrder","onDragEnd","useCallback","result","startIndex","endIndex","newPropertiesOrder","removed","DragDropContext","Droppable","droppableProvided","droppableSnapshot","additionalField","Draggable","provided","snapshot","PropertyTreeEntry","isSelected","wasSelected","isPropertyInferred","fullId","subtree","editable","defaultBorderMixin","RemoveIcon","DragHandleIcon","MapPropertyField","propertyDialogOpen","setPropertyDialogOpen","setSelectedPropertyKey","selectedPropertyNamespace","setSelectedPropertyNamespace","onPropertyCreated","currentPropertiesOrder","deleteProperty","propertiesPath","propertiesOrderPath","p","selectedPropertyFullId","selectedProperty","empty","AddIcon","PropertyFormDialog","RepeatPropertyField","ofProperty","ofPropertyError","onPropertyChanged","widget","CommonPropertyFields","disabledId","autoUpdateId","isNewProperty","ref","validate","nameError","description","descriptionError","newNameValue","newIdValue","unslugify","StringPropertyField","widgetId","BooleanPropertyField","BlockPropertyField","addChildButton","NumberPropertyValidation","validationLessThan","validationMoreThan","NumberPropertyField","ReferencePropertyField","useNavigationController","pathPath","pathValue","pathError","CollectionsSelect","props","navigation","collections","ungroupedCollections","col","selectedCollection","collection","SelectGroup","DateTimePropertyField","modePath","modeValue","modeError","autoValuePath","autoValueValue","autoValueError","AdvancedPropertyValidation","KeyValuePropertyField","updatePropertyFromWidget","propertyData","selectedWidgetId","updatedProperty","mergeDeep","PropertySelectItem","optionDisabled","UrlPropertyField","urlValue","supportedFieldsIds","supportedFields","DEFAULT_FIELD_CONFIGS","config","PropertyForm","includeIdAndName","autoOpenTypeSelect","existingProperty","inArray","existingPropertyKeys","onPropertyChangedImmediate","onDelete","initialErrors","forceShowErrors","getController","initialValue","lastSubmittedProperty","useRef","doOnPropertyChanged","params","formexController","newPropertyWithId","controller","validateName","validateId","isValidRegExp","PropertyEditFormFields","onCancel","onOkClicked","formProps","formexRef","helpers","setValues","includeIdAndTitle","selectOpen","setSelectOpen","deleteDialogOpen","setDeleteDialogOpen","selectedFieldConfigId","setSelectedFieldConfigId","getFieldId","allSupportedFields","displayedWidgets","deferredValues","useDeferredValue","nameFieldRef","selectedWidgetError","onWidgetSelectChanged","newSelectedWidgetId","childComponent","InfoLabel","baseProperty","baseFieldConfig","computedFieldConfig","DeleteIcon","DeleteConfirmationDialog","idRegEx","camelCase","str","cur","acc","GetCodeDialog","onOpenChange","snackbarController","code","JSON5","collectionToCode","Highlight","themes","style","tokens","getLineProps","getTokenProps","line","i","token","ContentCopyIcon","propertyCleanup","CollectionPropertiesEditorForm","propertyErrorsRef","onPropertyError","setDirty","extraIcon","getUser","doCollectionInference","dirty","largeLayout","useLargeLayout","asDialog","selectedPropertyIndex","setSelectedPropertyIndex","codeDialogOpen","setCodeDialogOpen","inferringProperties","setInferringProperties","newPropertyDialogOpen","setNewPropertyDialogOpen","setInferredPropertyKeys","currentPropertiesOrderRef","inferPropertiesFromData","newCollection","makePropertiesEditable","newPropertyKeys","updatedProperties","updatedPropertiesOrder","updatePropertiesOrder","getCurrentPropertiesOrder","previousId","propertyPath","previousFullId","previousPropertyPath","onPropertyErrorInternal","closePropertyDialog","emptyCollection","usedPropertiesOrder","owner","body","CodeIcon","UnsavedChangesDialog","handleOk","handleCancel","title","EntityCustomViewsSelectDialog","entityViews","view","SubcollectionsEditTab","configController","collectionInference","parentCollectionIds","contextEntityViews","subcollectionToDelete","setSubcollectionToDelete","addEntityViewDialogOpen","setAddEntityViewDialogOpen","viewToDelete","setViewToDelete","currentDialog","setCurrentDialog","subcollections","resolvedEntityViews","resolveEntityView","hardCodedEntityViews","totalEntityViews","Table","TableBody","subcollection","TableRow","TableCell","Alert","CollectionEditorDialog","selectedViewKey","productsCollectionTemplate","blogCollectionTemplate","usersCollectionTemplate","pagesCollectionTemplate","CollectionEditorWelcomeView","path","pathSuggestions","onContinue","existingCollectionPaths","loadingPathSuggestions","setLoadingPathSuggestions","filteredPathSuggestions","setFilteredPathSuggestions","suggestions","filteredSuggestions","s","c","suggestion","TemplateButton","Icon","ImportFileUpload","subtitle","Card","CollectionEditorImportMapping","importConfig","setSelectedProperty","newHeadersMapping","onPropertyTypeChanged","importKey","inferredNewProperty","buildPropertyFromData","getInferenceType","DataNewPropertiesMapping","ImportNewPropertyFieldPreview","PropertySelect","fieldId","newProperty","CollectionEditorImportDataPreview","propertiesMapping","getPropertiesMapping","mappedData","convertDataToEntity","selectionController","useSelectionController","EntityCollectionTable","cleanPropertiesFromImport","parentSlug","slug","slugify","fullSlug","slugifiedResult","firstKey","idColumn","formDirty","setFormDirty","unsavedChangesDialogOpen","setUnsavedChangesDialogOpen","CollectionEditor","authController","useAuthController","topLevelNavigation","initialValuesProp","includeTemplates","collectionsInThisLevel","setCollection","initialLoadingCompleted","setInitialLoadingCompleted","initialCollection","randomString","initialValues","applyPropertyConfigs","coolIconKeys","CircularProgressCenter","CollectionEditorInternal","editedCollectionId","fullPath","handleClose","extraView","useImportConfig","initialView","currentView","setCurrentView","setError","saveCollection","updatedCollection","setNextMode","inferCollectionFromData","inferredCollection","formController","newCollectionState","schema","err","validatePath","updatedFullPath","parentPaths","resolvedPath","getDataWithPath","onImportDataSet","buildEntityPropertiesFromData","validValues","onImportMappingComplete","Tabs","Tab","importData","ImportSaveInProgress","importedCollection","current","removeUndefined","ErrorView","ArrowBackIcon","LoadingButton","DoneIcon","rest","propertiesResult","applyPropertiesConfig","internalProperty","removeInitialAndTrailingSlashes","ConfigControllerContext","CollectionEditorContext","ConfigControllerProvider","collectionConfigController","configPermissions","onAnalyticsEvent","navigate","useNavigate","rootPathSuggestions","setRootPathSuggestions","paths","currentPropertyDialog","setCurrentPropertyDialog","defaultConfigPermissions","editCollection","editProperty","propertyKeyWithoutNamespace","createCollection","redirect","sourceClick","getPathSuggestions","url","useCollectionEditorController","useContext","useCollectionsConfigController","EditorCollectionAction","tableController","navigationController","collectionEditorController","canEditCollection","saveDefaultFilterButton","getObjectOrNull","UndoIcon","SaveIcon","o","HomePageEditorCollectionAction","permissions","onEditCollectionClicked","deleteRequested","setDeleteRequested","deleteCollection","Menu","MoreVertIcon","MenuItem","NewCollectionCard","context","canCreateCollections","RootCollectionSuggestions","introMode","showSuggestions","Collapse","CollectionViewHeaderAction","onHover","PropertyAddColumnComponent","getDefaultPropertiesOrder","NewCollectionButton","useCollectionEditorPlugin","IntroWidget","MissingReferenceWidget","pathProp","getLastSegment","collectionEditor","segments"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/ui/collection_editor/CollectionYupValidation.tsx","../src/ui/collection_editor/CollectionDetailsForm.tsx","../src/ui/collection_editor/util.ts","../src/ui/collection_editor/EnumForm.tsx","../src/ui/collection_editor/SwitchControl.tsx","../src/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx","../src/ui/collection_editor/properties/validation/StringPropertyValidation.tsx","../src/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx","../src/ui/collection_editor/properties/validation/ValidationPanel.tsx","../src/ui/collection_editor/properties/EnumPropertyField.tsx","../src/ui/collection_editor/properties/StoragePropertyField.tsx","../src/utils/entities.ts","../src/ui/collection_editor/PropertyFieldPreview.tsx","../src/ui/collection_editor/PropertyTree.tsx","../src/ui/collection_editor/properties/MapPropertyField.tsx","../src/ui/collection_editor/properties/RepeatPropertyField.tsx","../src/ui/collection_editor/properties/CommonPropertyFields.tsx","../src/ui/collection_editor/properties/StringPropertyField.tsx","../src/ui/collection_editor/properties/BooleanPropertyField.tsx","../src/ui/collection_editor/properties/BlockPropertyField.tsx","../src/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx","../src/ui/collection_editor/properties/NumberPropertyField.tsx","../src/ui/collection_editor/properties/ReferencePropertyField.tsx","../src/ui/collection_editor/properties/DateTimePropertyField.tsx","../src/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx","../src/ui/collection_editor/properties/KeyValuePropertyField.tsx","../src/ui/collection_editor/utils/update_property_for_widget.ts","../src/ui/collection_editor/PropertySelectItem.tsx","../src/ui/collection_editor/properties/UrlPropertyField.tsx","../src/ui/collection_editor/utils/supported_fields.tsx","../src/ui/collection_editor/PropertyEditView.tsx","../src/ui/collection_editor/utils/strings.ts","../src/ui/collection_editor/GetCodeDialog.tsx","../src/ui/collection_editor/CollectionPropertiesEditorForm.tsx","../src/ui/collection_editor/UnsavedChangesDialog.tsx","../src/ui/collection_editor/EntityCustomViewsSelectDialog.tsx","../src/ui/collection_editor/SubcollectionsEditTab.tsx","../src/ui/collection_editor/templates/products_template.ts","../src/ui/collection_editor/templates/blog_template.ts","../src/ui/collection_editor/templates/users_template.ts","../src/ui/collection_editor/templates/pages_template.ts","../src/ui/collection_editor/CollectionEditorWelcomeView.tsx","../src/ui/collection_editor/import/CollectionEditorImportMapping.tsx","../src/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx","../src/ui/collection_editor/import/clean_import_data.ts","../src/ui/collection_editor/CollectionEditorDialog.tsx","../src/ConfigControllerProvider.tsx","../src/useCollectionEditorController.tsx","../src/useCollectionsConfigController.tsx","../src/ui/EditorCollectionAction.tsx","../src/ui/HomePageEditorCollectionAction.tsx","../src/ui/NewCollectionCard.tsx","../src/ui/RootCollectionSuggestions.tsx","../src/ui/CollectionViewHeaderAction.tsx","../src/ui/PropertyAddColumnComponent.tsx","../src/ui/NewCollectionButton.tsx","../src/useCollectionEditorPlugin.tsx","../src/ui/MissingReferenceWidget.tsx"],"sourcesContent":["import * as Yup from \"yup\";\n\nexport const YupSchema = Yup.object().shape({\n id: Yup.string().required(\"Required\"),\n name: Yup.string().required(\"Required\"),\n path: Yup.string().required(\"Required\")\n});\n","import React, { useEffect, useState } from \"react\";\nimport { EntityCollection, FieldCaption, IconForView, SearchIconsView, singular, toSnakeCase, } from \"@firecms/core\";\nimport {\n Autocomplete,\n AutocompleteItem,\n BooleanSwitchWithLabel,\n Chip,\n cn,\n Container,\n DebouncedTextField,\n Dialog,\n ExpandablePanel,\n IconButton,\n Select,\n SelectItem,\n SettingsIcon,\n TextField,\n Tooltip,\n Typography,\n useAutoComplete\n} from \"@firecms/ui\";\n\nimport { Field, getIn, useFormex } from \"@firecms/formex\";\n\nexport function CollectionDetailsForm({\n isNewCollection,\n reservedGroups,\n existingPaths,\n existingIds,\n groups,\n parentCollection\n }: {\n isNewCollection: boolean,\n reservedGroups?: string[];\n existingPaths?: string[];\n existingIds?: string[];\n groups: string[] | null;\n parentCollection?: EntityCollection;\n parentCollectionIds?: string[];\n}) {\n\n const groupRef = React.useRef<HTMLInputElement>(null);\n const {\n values,\n setFieldValue,\n handleChange,\n touched,\n errors,\n setFieldTouched,\n isSubmitting,\n submitCount\n } = useFormex<EntityCollection>();\n\n const [iconDialogOpen, setIconDialogOpen] = useState(false);\n const [advancedPanelExpanded, setAdvancedPanelExpanded] = useState(false);\n\n const updateName = (name: string) => {\n setFieldValue(\"name\", name);\n\n const pathTouched = getIn(touched, \"path\");\n if (!pathTouched && isNewCollection && name) {\n setFieldValue(\"path\", toSnakeCase(name));\n }\n\n const idTouched = getIn(touched, \"id\");\n if (!idTouched && isNewCollection && name) {\n setFieldValue(\"id\", toSnakeCase(name));\n }\n\n const singularNameTouched = getIn(touched, \"singularName\");\n if (!singularNameTouched && isNewCollection && name) {\n setFieldValue(\"singularName\", singular(name));\n }\n\n };\n\n useEffect(() => {\n if (errors.id) {\n setAdvancedPanelExpanded(true);\n }\n }, [errors.id]);\n\n const collectionIcon = <IconForView collectionOrView={values}/>;\n\n const groupOptions = groups?.filter((group) => !reservedGroups?.includes(group));\n\n const {\n inputFocused,\n autoCompleteOpen,\n setAutoCompleteOpen\n } = useAutoComplete({\n ref: groupRef\n });\n\n const isSubcollection = !!parentCollection;\n\n let customIdValue: \"true\" | \"false\" | \"optional\" | \"code_defined\" | undefined;\n if (typeof values.customId === \"object\") {\n customIdValue = \"code_defined\";\n } else if (values.customId === true) {\n customIdValue = \"true\";\n } else if (values.customId === false) {\n customIdValue = \"false\";\n } else if (values.customId === \"optional\") {\n customIdValue = \"optional\";\n }\n\n const showErrors = submitCount > 0;\n return (\n <div className={\"overflow-auto my-auto\"}>\n <Container maxWidth={\"4xl\"} className={\"flex flex-col gap-4 p-8 m-auto\"}>\n\n <div>\n <div\n className=\"flex flex-row py-2 pt-3 items-center\">\n <Typography variant={!isNewCollection ? \"h5\" : \"h4\"} className={\"flex-grow\"}>\n {isNewCollection ? \"New collection\" : `${values?.name} collection`}\n </Typography>\n <Tooltip title={\"Change icon\"}>\n <IconButton\n shape={\"square\"}\n onClick={() => setIconDialogOpen(true)}>\n {collectionIcon}\n </IconButton>\n </Tooltip>\n </div>\n\n {parentCollection && <Chip colorScheme={\"tealDarker\"}>\n <Typography variant={\"caption\"}>\n This is a subcollection of <b>{parentCollection.name}</b>\n </Typography>\n </Chip>}\n\n </div>\n <div className={\"grid grid-cols-12 gap-4\"}>\n\n <div className={\"col-span-12\"}>\n <TextField\n value={values.name ?? \"\"}\n onChange={(e: any) => updateName(e.target.value)}\n label={\"Name\"}\n required\n error={showErrors && Boolean(errors.name)}/>\n <FieldCaption error={touched.name && Boolean(errors.name)}>\n {touched.name && Boolean(errors.name) ? errors.name : \"Name of in this collection, usually a plural name (e.g. Products)\"}\n </FieldCaption>\n </div>\n\n <div className={cn(\"col-span-12 \", isSubcollection ? \"\" : \"sm:col-span-8\")}>\n <Field name={\"path\"}\n as={DebouncedTextField}\n label={\"Path\"}\n disabled={!isNewCollection}\n required\n error={showErrors && Boolean(errors.path)}/>\n\n <FieldCaption error={touched.path && Boolean(errors.path)}>\n {touched.path && Boolean(errors.path)\n ? errors.path\n : isSubcollection ? \"Relative path to the parent (no need to include the parent path)\" : \"Path that this collection is stored in, in the database\"}\n </FieldCaption>\n\n </div>\n\n {!isSubcollection && <div className={\"col-span-12 sm:col-span-4 relative\"}>\n\n <TextField error={showErrors && Boolean(errors.group)}\n disabled={isSubmitting}\n value={values.group ?? \"\"}\n autoComplete=\"off\"\n onChange={(event) => setFieldValue(\"group\", event.target.value)}\n name={\"group\"}\n inputRef={groupRef}\n label=\"Group\"/>\n <Autocomplete\n open={autoCompleteOpen && (groupOptions ?? []).length > 0}\n setOpen={setAutoCompleteOpen}>\n {groupOptions?.map((group, index) => {\n return <AutocompleteItem\n key={index + \"_\" + group}\n onClick={() => {\n setAutoCompleteOpen(false);\n setFieldValue(\"group\", group ?? null);\n }}\n >\n <div className={\"flex-grow\"}>\n {group}\n </div>\n </AutocompleteItem>;\n })}\n </Autocomplete>\n <FieldCaption>\n {showErrors && Boolean(errors.group) ? errors.group : \"Group of the collection\"}\n </FieldCaption>\n </div>}\n\n <div className={\"col-span-12\"}>\n <ExpandablePanel\n expanded={advancedPanelExpanded}\n onExpandedChange={setAdvancedPanelExpanded}\n title={\n <div className=\"flex flex-row text-gray-500\">\n <SettingsIcon/>\n <Typography variant={\"subtitle2\"}\n className=\"ml-2\">\n Advanced\n </Typography>\n </div>}\n initiallyExpanded={false}>\n <div className={\"grid grid-cols-12 gap-4 p-4\"}>\n\n <div className={\"col-span-12\"}>\n <Field name={\"id\"}\n as={DebouncedTextField}\n disabled={!isNewCollection}\n label={\"Collection id\"}\n error={showErrors && Boolean(errors.id)}/>\n <FieldCaption error={touched.id && Boolean(errors.id)}>\n {touched.id && Boolean(errors.id) ? errors.id : \"This id identifies this collection\"}\n </FieldCaption>\n </div>\n\n <div className={\"col-span-12\"}>\n <TextField\n error={showErrors && Boolean(errors.singularName)}\n name={\"singularName\"}\n aria-describedby={\"singularName-helper\"}\n onChange={(e) => {\n setFieldTouched(\"singularName\", true);\n return handleChange(e);\n }}\n value={values.singularName ?? \"\"}\n label={\"Singular name\"}/>\n <FieldCaption error={showErrors && Boolean(errors.singularName)}>\n {showErrors && Boolean(errors.singularName) ? errors.singularName : \"Optionally define a singular name for your entities\"}\n </FieldCaption>\n </div>\n <div className={\"col-span-12\"}>\n <TextField\n error={showErrors && Boolean(errors.description)}\n name=\"description\"\n value={values.description ?? \"\"}\n onChange={handleChange}\n multiline\n rows={2}\n aria-describedby=\"description-helper-text\"\n label=\"Description\"\n />\n <FieldCaption error={showErrors && Boolean(errors.description)}>\n {showErrors && Boolean(errors.description) ? errors.description : \"Description of the collection, you can use markdown\"}\n </FieldCaption>\n </div>\n\n <div className={\"col-span-12\"}>\n <Select\n name=\"defaultSize\"\n label=\"Default row size\"\n position={\"item-aligned\"}\n onChange={handleChange}\n value={values.defaultSize ?? \"\"}\n renderValue={(value: any) => value.toUpperCase()}\n >\n {[\"xs\", \"s\", \"m\", \"l\", \"xl\"].map((value) => (\n <SelectItem\n key={`size-select-${value}`}\n value={value}>\n {value.toUpperCase()}\n </SelectItem>\n ))}\n </Select>\n </div>\n <div className={\"col-span-12\"}>\n <Select\n name=\"customId\"\n label=\"Data IDs generation\"\n position={\"item-aligned\"}\n disabled={customIdValue === \"code_defined\"}\n onValueChange={(v) => {\n if (v === \"code_defined\")\n throw new Error(\"This should not happen\");\n else if (v === \"true\")\n setFieldValue(\"customId\", true);\n else if (v === \"false\")\n setFieldValue(\"customId\", false);\n else if (v === \"optional\")\n setFieldValue(\"customId\", \"optional\");\n }}\n value={customIdValue ?? \"\"}\n renderValue={(value: any) => {\n if (value === \"code_defined\")\n return \"Code defined\";\n else if (value === \"true\")\n return \"Users must define an ID\";\n else if (value === \"optional\")\n return \"Users can define an ID, but it is not required\";\n else\n return \"Document ID is generated automatically\";\n }}\n >\n <SelectItem value={\"false\"}>\n Document ID is generated automatically\n </SelectItem>\n <SelectItem value={\"true\"}>\n Users must define an ID\n </SelectItem>\n <SelectItem value={\"optional\"}>\n Users can define an ID, but it is not required\n </SelectItem>\n </Select>\n </div>\n <div className={\"col-span-12\"}>\n <BooleanSwitchWithLabel\n position={\"start\"}\n label=\"Collection group\"\n onValueChange={(v) => setFieldValue(\"collectionGroup\", v)}\n value={values.collectionGroup ?? false}\n />\n <FieldCaption>\n A collection group consists of all collections with the same path. This allows\n you\n to query over multiple collections at once.\n </FieldCaption>\n </div>\n <div className={\"col-span-12\"}>\n <BooleanSwitchWithLabel\n position={\"start\"}\n label=\"Enable text search for this collection\"\n onValueChange={(v) => setFieldValue(\"textSearchEnabled\", v)}\n value={values.textSearchEnabled ?? false}\n />\n <FieldCaption>\n Allow text search for this collection. If you have not specified a text search\n delegate, this will use the built-in local text search. This is not recommended\n for large collections, as it may incur in performance and cost issues.\n </FieldCaption>\n </div>\n </div>\n </ExpandablePanel>\n\n </div>\n\n </div>\n\n <div style={{ height: \"52px\" }}/>\n\n <Dialog\n open={iconDialogOpen}\n onOpenChange={setIconDialogOpen}\n maxWidth={\"xl\"}\n fullWidth\n >\n <div className={\"p-4 overflow-auto min-h-[200px]\"}>\n <SearchIconsView selectedIcon={values.icon}\n onIconSelected={(icon: string) => {\n setIconDialogOpen(false);\n setFieldValue(\"icon\", icon);\n }}/>\n </div>\n\n </Dialog>\n\n </Container>\n </div>\n );\n}\n","export function idToPropertiesPath(id: string): string {\n return \"properties.\" + id.replaceAll(\".\", \".properties.\");\n}\n\nexport function namespaceToPropertiesPath(namespace?: string): string {\n return namespace\n ? \"properties.\" + namespace.replaceAll(\".\", \".properties.\") + \".properties\"\n : \"properties\";\n}\n\nexport function namespaceToPropertiesOrderPath(namespace?: string): string {\n return namespace\n ? \"properties.\" + namespace.replaceAll(\".\", \".properties.\") + \".propertiesOrder\"\n : \"propertiesOrder\";\n}\n\nexport function getFullId(propertyKey: string, propertyNamespace?: string): string {\n return propertyNamespace\n ? `${propertyNamespace}.${propertyKey}`\n : propertyKey;\n}\n\nexport function getFullIdPath(propertyKey: string, propertyNamespace?: string): string {\n const keyWithNamespace = propertyNamespace\n ? `${propertyNamespace}.${propertyKey}`\n : propertyKey;\n return idToPropertiesPath(keyWithNamespace);\n}\n","import React, { useEffect } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { ArrayContainer, EnumValueConfig, EnumValues, FieldCaption, } from \"@firecms/core\";\nimport {\n AutoAwesomeIcon,\n Badge,\n Button,\n CircularProgress,\n DebouncedTextField,\n Dialog,\n DialogActions,\n DialogContent,\n IconButton,\n ListIcon,\n Paper,\n SettingsIcon,\n Typography\n} from \"@firecms/ui\";\nimport { extractEnumFromValues } from \"@firecms/schema_inference\";\nimport { Field, Formex, getIn, useCreateFormex, useFormex } from \"@firecms/formex\";\n\ntype EnumFormProps = {\n enumValues: EnumValueConfig[];\n onValuesChanged?: (enumValues: EnumValueConfig[]) => void;\n onError?: (error: boolean) => void;\n updateIds: boolean;\n disabled: boolean;\n allowDataInference?: boolean;\n getData?: () => Promise<string[]>;\n};\n\nexport function EnumForm({\n enumValues,\n onValuesChanged,\n onError,\n updateIds,\n disabled,\n allowDataInference,\n getData\n }: EnumFormProps) {\n\n const formex = useCreateFormex<{\n enumValues: EnumValueConfig[]\n }>({\n initialValues: { enumValues },\n validateOnChange: true,\n validation: (values) => {\n const errors: any = {};\n if (values.enumValues) {\n values.enumValues.forEach((enumValue, index) => {\n if (!enumValue?.label) {\n errors.enumValues = errors.enumValues ?? [];\n errors.enumValues[index] = errors.enumValues[index] ?? {};\n errors.enumValues[index].label = \"You must specify a label for this enum value entry\";\n }\n if (!enumValue?.id) {\n errors.enumValues = errors.enumValues ?? [];\n errors.enumValues[index] = errors.enumValues[index] ?? {};\n errors.enumValues[index].id = \"You must specify an ID for this enum value entry\";\n }\n });\n }\n const hasError = Boolean(errors?.enumValues && Object.keys(errors?.enumValues).length > 0);\n onError?.(hasError);\n return errors;\n }\n });\n\n const { values, errors } = formex;\n\n useEffect(() => {\n if (onValuesChanged) {\n onValuesChanged(values.enumValues);\n }\n }, [values.enumValues]);\n\n return <Formex value={formex}>\n <EnumFormFields enumValuesPath={\"enumValues\"}\n values={values}\n errors={errors}\n shouldUpdateId={updateIds}\n disabled={disabled}\n allowDataInference={allowDataInference}\n getData={getData}/>\n </Formex>\n\n}\n\ntype EnumFormFieldsProps = {\n values: {\n enumValues: EnumValueConfig[]\n };\n errors: any;\n enumValuesPath: string;\n shouldUpdateId: boolean;\n disabled: boolean;\n getData?: () => Promise<string[]>;\n allowDataInference?: boolean;\n};\n\n// const EnumFormFields = React.memo(\nfunction EnumFormFields({\n values,\n errors,\n disabled,\n enumValuesPath,\n shouldUpdateId,\n allowDataInference,\n getData,\n }: EnumFormFieldsProps) {\n\n const {\n setFieldValue\n } = useFormex();\n\n const [lastInternalIdAdded, setLastInternalIdAdded] = React.useState<number | undefined>();\n const [editDialogIndex, setEditDialogIndex] = React.useState<number | undefined>();\n const [inferring, setInferring] = React.useState(false);\n\n const inferredValuesRef = React.useRef(new Set());\n const inferredValues = inferredValuesRef.current;\n\n const buildEntry = (index: number, internalId: number) => {\n const justAdded = lastInternalIdAdded === internalId;\n const entryError = errors?.enumValues && errors?.enumValues[index];\n return <EnumEntry index={index}\n disabled={disabled}\n enumValuesPath={enumValuesPath}\n autoFocus={justAdded}\n entryError={entryError}\n shouldUpdateId={shouldUpdateId || justAdded}\n onDialogOpen={() => setEditDialogIndex(index)}\n inferredEntry={inferredValues.has(values.enumValues[index]?.id as string)}\n key={`${internalId}`}/>;\n };\n\n const inferValues = async () => {\n if (!getData)\n return;\n setInferring(true);\n getData?.().then((data) => {\n if (!data)\n return;\n\n const flatData = data.flat();\n\n const fieldData = Array.from(new Set(flatData));\n\n const currentEnumValues = values.enumValues;\n const foundEnumValues = extractEnumFromValues(fieldData);\n\n // add only new enum values\n const newEnumValues = foundEnumValues.filter((enumValue) => {\n return !currentEnumValues?.some((v: any) => v.id === enumValue.id);\n });\n\n newEnumValues.forEach((enumValue) => {\n inferredValues.add(enumValue.id);\n });\n setFieldValue(enumValuesPath, [...newEnumValues, ...currentEnumValues], true);\n }).catch(e => {\n console.error(e);\n })\n .finally(() => setInferring(false));\n }\n\n return (\n <div className={\"col-span-12\"}>\n <div className=\"ml-3.5 flex flex-row items-center\">\n <ListIcon/>\n <Typography variant={\"subtitle2\"}\n className=\"ml-2 grow\">\n Values\n </Typography>\n {allowDataInference &&\n <Button loading={inferring}\n disabled={disabled || inferring}\n variant={\"text\"}\n size={\"small\"}\n onClick={inferValues}>\n {inferring ? <CircularProgress size={\"small\"}/> : <AutoAwesomeIcon/>}\n Infer values from data\n </Button>}\n </div>\n\n <Paper className=\"p-4 m-1\">\n\n <ArrayContainer droppableId={enumValuesPath}\n addLabel={\"Add enum value\"}\n value={values.enumValues}\n disabled={disabled}\n size={\"small\"}\n buildEntry={buildEntry}\n onInternalIdAdded={setLastInternalIdAdded}\n includeAddButton={true}\n onValueChange={(value) => setFieldValue(enumValuesPath, value)}\n newDefaultEntry={{ id: \"\", label: \"\" }}/>\n\n <EnumEntryDialog index={editDialogIndex}\n open={editDialogIndex !== undefined}\n enumValuesPath={enumValuesPath}\n onClose={() => setEditDialogIndex(undefined)}/>\n </Paper>\n </div>\n );\n}\n\ntype EnumEntryProps = {\n index: number,\n enumValuesPath: string,\n shouldUpdateId: boolean,\n autoFocus: boolean,\n onDialogOpen: () => void;\n disabled: boolean;\n inferredEntry?: boolean;\n entryError?: { label?: string, id?: string }\n};\n\nconst EnumEntry = React.memo(\n function EnumEntryInternal({\n index,\n shouldUpdateId: updateId,\n enumValuesPath,\n autoFocus,\n onDialogOpen,\n disabled,\n inferredEntry,\n entryError\n }: EnumEntryProps) {\n\n const {\n values,\n handleChange,\n errors,\n setFieldValue,\n touched\n } = useFormex<EnumValues>();\n\n const shouldUpdateIdRef = React.useRef(!getIn(values, `${enumValuesPath}[${index}].id`));\n const shouldUpdateId = updateId || shouldUpdateIdRef.current;\n\n const idValue = getIn(values, `${enumValuesPath}[${index}].id`);\n const labelValue = getIn(values, `${enumValuesPath}[${index}].label`);\n\n const currentLabelRef = React.useRef(labelValue);\n\n React.useEffect(() => {\n if ((currentLabelRef.current === idValue || !idValue) && shouldUpdateId) {\n setFieldValue(`${enumValuesPath}[${index}].id`, labelValue);\n }\n currentLabelRef.current = labelValue;\n }, [labelValue]);\n\n return (\n <>\n <div className={\"flex w-full align-center justify-center\"}>\n <Field name={`${enumValuesPath}[${index}].label`}\n as={DebouncedTextField}\n className={\"flex-grow\"}\n required\n disabled={disabled}\n size=\"small\"\n autoFocus={autoFocus}\n autoComplete=\"off\"\n endAdornment={inferredEntry && <AutoAwesomeIcon size={\"small\"}/>}\n error={Boolean(entryError?.label)}/>\n\n {!disabled &&\n <Badge color={\"error\"} invisible={!entryError?.id}>\n <IconButton\n size=\"small\"\n aria-label=\"edit\"\n className={\"m-1\"}\n onClick={() => onDialogOpen()}>\n <SettingsIcon size={\"small\"}/>\n </IconButton>\n </Badge>}\n\n </div>\n\n {entryError?.label && <Typography variant={\"caption\"}\n className={\"ml-3.5 text-red-500 dark:text-red-500\"}>\n {entryError?.label}\n </Typography>}\n\n {entryError?.id && <Typography variant={\"caption\"}\n className={\"ml-3.5 text-red-500 dark:text-red-500\"}>\n {entryError?.id}\n </Typography>}\n\n </>);\n },\n function areEqual(prevProps: EnumEntryProps, nextProps: EnumEntryProps) {\n return prevProps.index === nextProps.index &&\n prevProps.enumValuesPath === nextProps.enumValuesPath &&\n prevProps.shouldUpdateId === nextProps.shouldUpdateId &&\n prevProps.inferredEntry === nextProps.inferredEntry &&\n equal(prevProps.entryError, nextProps.entryError) &&\n prevProps.autoFocus === nextProps.autoFocus;\n }\n);\n\nfunction EnumEntryDialog({\n index,\n open,\n onClose,\n enumValuesPath\n }: {\n index?: number;\n open: boolean;\n enumValuesPath: string;\n onClose: () => void;\n}) {\n\n const {\n errors,\n } = useFormex<EnumValues>();\n\n const idError = index !== undefined ? getIn(errors, `${enumValuesPath}[${index}].id`) : undefined;\n return <Dialog\n maxWidth=\"md\"\n aria-labelledby=\"enum-edit-dialog\"\n open={open}\n onOpenChange={(open) => !open ? onClose() : undefined}\n >\n\n <DialogContent>\n {index !== undefined &&\n <div>\n <Field name={`${enumValuesPath}[${index}].id`}\n as={DebouncedTextField}\n required\n label={\"ID\"}\n size=\"small\"\n autoComplete=\"off\"\n error={Boolean(idError)}/>\n\n <FieldCaption error={Boolean(idError)}>\n {idError ?? \"Value saved in the data source\"}\n </FieldCaption>\n </div>}\n </DialogContent>\n\n <DialogActions>\n <Button\n autoFocus\n variant=\"outlined\"\n onClick={onClose}\n color=\"primary\">\n Ok\n </Button>\n </DialogActions>\n\n </Dialog>\n}\n\n","import React from \"react\";\n\nimport { BooleanSwitchWithLabel, Tooltip } from \"@firecms/ui\";\nimport { FormexFieldProps } from \"@firecms/formex\";\n\nexport function SwitchControl({\n field,\n form,\n label,\n tooltip,\n disabled,\n size = \"small\",\n allowIndeterminate\n }: FormexFieldProps & {\n label: string,\n tooltip?: string,\n disabled?: boolean,\n size?: \"small\" | \"medium\",\n allowIndeterminate?: boolean\n}) {\n\n const formControlLabel = <BooleanSwitchWithLabel\n label={label}\n size={size}\n position={\"start\"}\n value={field.value}\n disabled={disabled}\n allowIndeterminate={allowIndeterminate}\n onValueChange={(checked:boolean | null) => form.setFieldValue(field.name, checked)}/>;\n\n if (tooltip)\n return (\n <Tooltip\n title={tooltip}>\n {formControlLabel}\n </Tooltip>\n );\n return formControlLabel;\n}\n","import React from \"react\";\n\nimport { Field, FormexFieldProps, getIn, useFormex } from \"@firecms/formex\";\nimport { DebouncedTextField } from \"@firecms/ui\";\nimport { SwitchControl } from \"../../SwitchControl\";\n\nexport function GeneralPropertyValidation({ disabled }: {\n required?: boolean;\n disabled: boolean;\n}) {\n\n const { values, handleChange } = useFormex();\n\n const validationRequired = \"validation.required\";\n const validationRequiredMessage = \"validation.requiredMessage\";\n const validationUnique = \"validation.unique\";\n const validationUniqueInArray = \"validation.uniqueInArray\";\n\n return (\n <>\n <div className={\"col-span-6\"}>\n <Field name={validationRequired}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n disabled={disabled}\n label={\"Required\"}\n tooltip={\"You won't be able to save this entity if this value is not set\"}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n\n <div className={\"col-span-6\"}>\n\n <Field name={validationUnique}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n disabled={disabled}\n label={\"Unique\"}\n tooltip={\"There cannot be multiple entities with the same value\"}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n\n {getIn(values, validationRequired) && <div className={\"col-span-12\"}>\n <DebouncedTextField\n disabled={disabled}\n value={getIn(values, validationRequiredMessage)}\n label={\"Required message\"}\n name={validationRequiredMessage}\n size=\"small\"\n onChange={handleChange}/>\n </div>}\n </>\n );\n}\n","import React from \"react\";\n\nimport { Field, FormexFieldProps, getIn, useFormex } from \"@firecms/formex\";\nimport { FieldCaption, serializeRegExp } from \"@firecms/core\";\nimport { DebouncedTextField, } from \"@firecms/ui\";\nimport { GeneralPropertyValidation } from \"./GeneralPropertyValidation\";\nimport { SwitchControl } from \"../../SwitchControl\";\n\nexport function StringPropertyValidation({\n length,\n lowercase,\n matches,\n max,\n min,\n trim,\n uppercase,\n disabled,\n showErrors\n }: {\n length?: boolean;\n min?: boolean;\n max?: boolean;\n trim?: boolean;\n matches?: boolean;\n lowercase?: boolean;\n uppercase?: boolean;\n disabled: boolean;\n showErrors: boolean;\n}) {\n\n const {\n values,\n handleChange,\n errors\n } = useFormex();\n\n const validationLength = \"validation.length\";\n const validationMin = \"validation.min\";\n const validationMax = \"validation.max\";\n const validationTrim = \"validation.trim\";\n const validationMatches = \"validation.matches\";\n const validationLowercase = \"validation.lowercase\";\n const validationUppercase = \"validation.uppercase\";\n\n const matchesError = getIn(errors, validationMatches);\n\n const matchesValue = getIn(values, validationMatches);\n const matchesStringValue = typeof matchesValue === \"string\" ? matchesValue : serializeRegExp(matchesValue);\n return (\n <div className={\"grid grid-cols-12 gap-2\"}>\n\n <GeneralPropertyValidation disabled={disabled}/>\n\n <div className={\"grid grid-cols-12 gap-2 col-span-12\"}>\n\n {lowercase && <div className={\"col-span-4\"}>\n <Field name={validationLowercase}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Lowercase\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>}\n\n {uppercase && <div className={\"col-span-4\"}>\n <Field name={validationUppercase}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Uppercase\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>}\n\n {trim && <div className={\"col-span-4\"}>\n <Field name={validationTrim}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Trim\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>}\n\n </div>\n\n <div className={\"grid grid-cols-12 gap-2 col-span-12\"}>\n {length && <div className={\"col-span-4\"}>\n <DebouncedTextField\n value={getIn(values, validationLength)}\n label={\"Exact length\"}\n name={validationLength}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>}\n\n {min && <div className={\"col-span-4\"}>\n <DebouncedTextField value={getIn(values, validationMin)}\n label={\"Min length\"}\n name={validationMin}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>}\n\n {max && <div className={\"col-span-4\"}>\n <DebouncedTextField value={getIn(values, validationMax)}\n label={\"Max length\"}\n name={validationMax}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>}\n\n </div>\n\n {matches && <div className={\"col-span-12\"}>\n <Field name={validationMatches}\n as={DebouncedTextField}\n label={\"Matches regex\"}\n size=\"small\"\n disabled={disabled}\n value={matchesStringValue}\n error={Boolean(matchesError)}/>\n <FieldCaption error={Boolean(matchesError)}>\n {matchesError ? \"Not a valid regexp\" : \"e.g. /^\\\\d+$/ for digits only\"}\n </FieldCaption>\n </div>}\n\n </div>\n );\n\n}\n","import React from \"react\";\n\nimport { getIn, useFormex } from \"@firecms/formex\";\nimport { DebouncedTextField } from \"@firecms/ui\";\nimport { GeneralPropertyValidation } from \"./GeneralPropertyValidation\";\n\nexport function ArrayPropertyValidation({\n max = true,\n min = true,\n disabled\n }: {\n min?: boolean;\n max?: boolean;\n disabled: boolean;\n}) {\n\n const {\n values,\n handleChange\n } = useFormex();\n\n const validationMin = \"validation.min\";\n const validationMax = \"validation.max\";\n\n return (\n <div className={\"grid grid-cols-12 gap-2\"}>\n\n <GeneralPropertyValidation disabled={disabled}/>\n\n {min && <div className={\"col-span-6\"}>\n <DebouncedTextField value={getIn(values, validationMin)}\n disabled={disabled}\n label={\"Min length\"}\n name={validationMin}\n type=\"number\"\n size=\"small\"\n onChange={handleChange}/>\n </div>}\n {max && <div className={\"col-span-6\"}>\n <DebouncedTextField value={getIn(values, validationMax)}\n disabled={disabled}\n label={\"Max length\"}\n name={validationMax}\n type=\"number\"\n size=\"small\"\n onChange={handleChange}/>\n </div>}\n </div>\n );\n}\n","import { PropsWithChildren } from \"react\";\n\nimport { ExpandablePanel, RuleIcon, Typography } from \"@firecms/ui\";\n\nexport function ValidationPanel({\n children\n }: PropsWithChildren<{}>) {\n\n return (\n <ExpandablePanel\n initiallyExpanded={false}\n asField={true}\n className=\"p-4\"\n title={\n <div className=\"flex flex-row text-gray-500\">\n <RuleIcon/>\n <Typography variant={\"subtitle2\"}\n className=\"ml-2\">\n Validation\n </Typography>\n </div>\n }>\n\n {children}\n\n </ExpandablePanel>\n )\n}\n","import React, { useMemo } from \"react\";\nimport { getIn, useFormex } from \"@firecms/formex\";\nimport { EnumValueConfig, resolveEnumValues, useSnackbarController } from \"@firecms/core\";\nimport { Select, SelectItem } from \"@firecms/ui\";\nimport { EnumForm } from \"../EnumForm\";\nimport { StringPropertyValidation } from \"./validation/StringPropertyValidation\";\nimport { ArrayPropertyValidation } from \"./validation/ArrayPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { PropertyWithId } from \"../PropertyEditView\";\n\nexport function EnumPropertyField({\n multiselect,\n updateIds,\n disabled,\n showErrors,\n allowDataInference,\n getData\n }: {\n multiselect: boolean;\n updateIds: boolean;\n disabled: boolean;\n showErrors: boolean;\n allowDataInference?: boolean;\n getData?: () => Promise<object[]>;\n}) {\n\n const {\n values,\n setFieldError,\n setFieldValue\n } = useFormex<PropertyWithId>();\n\n const snackbarContext = useSnackbarController();\n\n const enumValuesPath = multiselect ? \"of.enumValues\" : \"enumValues\";\n\n const defaultValue = getIn(values, \"defaultValue\");\n\n const valuesEnumValues = getIn(values, enumValuesPath);\n const enumValues: EnumValueConfig[] = useMemo(() => {\n if (!valuesEnumValues || typeof valuesEnumValues === \"boolean\")\n return [] as EnumValueConfig[];\n return resolveEnumValues(valuesEnumValues) ?? [] as EnumValueConfig[];\n }, [valuesEnumValues]);\n\n const onValuesChanged = (value: EnumValueConfig[]) => {\n if (!values)\n return;\n setFieldValue(enumValuesPath, value);\n if (!multiselect) {\n const enumIds = value.filter(v => Boolean(v?.id)).map((v: any) => v.id);\n if (defaultValue && !enumIds.includes(defaultValue)) {\n setFieldValue(\"defaultValue\", undefined);\n snackbarContext.open({\n type: \"warning\",\n message: \"Default value was cleared\"\n })\n }\n }\n };\n\n return (\n <>\n <div className={\"col-span-12\"}>\n <EnumForm enumValues={enumValues}\n updateIds={updateIds}\n disabled={disabled}\n allowDataInference={allowDataInference}\n onError={(hasError) => {\n setFieldError(enumValuesPath, hasError ? \"This enum property is missing some values\" : undefined);\n }}\n getData={getData\n ? () => getData()\n .then(res => res.map(d => values.id && getIn(d, values.id)).filter(Boolean))\n : undefined}\n onValuesChanged={onValuesChanged}/>\n </div>\n\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n {!multiselect &&\n <StringPropertyValidation disabled={disabled}\n showErrors={showErrors}/>}\n {multiselect &&\n <ArrayPropertyValidation disabled={disabled}/>}\n </ValidationPanel>\n\n </div>\n\n {!multiselect && <div className={\"col-span-12\"}>\n\n <Select\n disabled={disabled}\n position={\"item-aligned\"}\n onValueChange={(value: string) => {\n setFieldValue(\"defaultValue\", value);\n }}\n label={\"Default value\"}\n value={defaultValue ?? \"\"}>\n {enumValues\n .filter((enumValue) => Boolean(enumValue?.id))\n .map((enumValue) => (\n <SelectItem key={enumValue.id}\n value={enumValue.id?.toString()}>\n {enumValue.label}\n </SelectItem>\n ))}\n </Select>\n\n </div>}\n </>\n );\n}\n","import React from \"react\";\nimport {\n Button,\n Checkbox,\n DebouncedTextField,\n ExpandablePanel,\n FileUploadIcon,\n MultiSelect,\n MultiSelectItem,\n Typography\n} from \"@firecms/ui\";\n\nimport { Field, FormexFieldProps, getIn, useFormex } from \"@firecms/formex\";\nimport { GeneralPropertyValidation } from \"./validation/GeneralPropertyValidation\";\nimport { ArrayPropertyValidation } from \"./validation/ArrayPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { SwitchControl } from \"../SwitchControl\";\n\nconst fileTypes: Record<string, string> = {\n \"image/*\": \"Images\",\n \"video/*\": \"Videos\",\n \"audio/*\": \"Audio files\",\n \"application/*\": \"Files (pdf, zip, csv, excel...)\",\n \"text/*\": \"Text files\"\n}\n\nexport function StoragePropertyField({\n multiple,\n existing,\n disabled\n }: {\n multiple: boolean;\n existing: boolean;\n disabled: boolean;\n}) {\n\n const {\n values,\n setFieldValue\n } = useFormex();\n\n const baseStoragePath = multiple ? \"of.storage\" : \"storage\";\n const acceptedFiles = `${baseStoragePath}.acceptedFiles`;\n\n const metadata = `${baseStoragePath}.metadata`;\n const fileName = `${baseStoragePath}.fileName`;\n const storagePath = `${baseStoragePath}.storagePath`;\n const storeUrl = `${baseStoragePath}.storeUrl`;\n\n const fileNameValue = getIn(values, fileName) ?? \"{rand}_{file}\";\n const storagePathValue = getIn(values, storagePath) ?? \"/\";\n\n const storedValue = getIn(values, acceptedFiles);\n const fileTypesValue: string[] | undefined = Array.isArray(storedValue) ? storedValue : undefined;\n const allFileTypesSelected = !fileTypesValue || fileTypesValue.length === 0;\n\n const handleTypesChange = (value: string[]) => {\n if (!value) setFieldValue(acceptedFiles, undefined);\n else if (value.includes(\"all\")) setFieldValue(acceptedFiles, undefined);\n else if (value.length >= Object.keys(fileTypes).length) setFieldValue(acceptedFiles, undefined);\n else if (allFileTypesSelected)\n setFieldValue(acceptedFiles, Object.keys(fileTypes).filter((v) => !value.includes(v)));\n else setFieldValue(acceptedFiles, value);\n };\n\n const hasFilenameCallback = typeof fileNameValue === \"function\";\n const hasStoragePathCallback = typeof storagePathValue === \"function\";\n\n return (\n <>\n\n <div className={\"col-span-12\"}>\n\n <ExpandablePanel\n title={\n <div className=\"flex flex-row text-gray-500\">\n <FileUploadIcon/>\n <Typography variant={\"subtitle2\"}\n className=\"ml-2\">\n File upload config\n </Typography>\n </div>\n }>\n\n <div className={\"grid grid-cols-12 gap-2 p-4\"}>\n\n <div className={\"col-span-12\"}>\n\n <MultiSelect\n disabled={disabled}\n name={acceptedFiles}\n value={fileTypesValue ?? []}\n onMultiValueChange={handleTypesChange}\n label={allFileTypesSelected ? undefined : \"Allowed file types\"}\n renderValues={(selected) => {\n if (!selected || selected.length === 0) return \"All file types allowed\";\n return selected.map((v: string) => fileTypes[v])\n .filter((v: string) => Boolean(v))\n .join(\", \");\n }}>\n\n <MultiSelectItem key={\"all\"} value={\"all\"} className={\"flex items-center gap-2\"}>\n <Checkbox\n checked={!fileTypesValue}/>\n All\n </MultiSelectItem>\n\n {Object.entries(fileTypes).map(([value, label]) => (\n <MultiSelectItem key={value} value={value} className={\"flex items-center gap-2\"}>\n <Checkbox\n checked={allFileTypesSelected || fileTypesValue.indexOf(value) > -1}/>\n <div className={\"flex-grow\"}>\n {label}\n </div>\n <Button size={\"small\"}\n variant={\"outlined\"}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n return setFieldValue(acceptedFiles, [value]);\n }}>\n Only\n </Button>\n </MultiSelectItem>\n ))}\n\n </MultiSelect>\n </div>\n\n <div className={\"col-span-12\"}>\n <Field name={fileName}\n as={DebouncedTextField}\n label={\"File name\"}\n size={\"small\"}\n disabled={hasFilenameCallback || disabled}\n value={hasFilenameCallback ? \"-\" : fileNameValue}\n />\n </div>\n <div className={\"col-span-12\"}>\n <Field name={storagePath}\n as={DebouncedTextField}\n label={\"Storage path\"}\n disabled={hasStoragePathCallback || disabled}\n size={\"small\"}\n value={hasStoragePathCallback ? \"-\" : storagePathValue}\n />\n <Typography variant={\"caption\"} className={\"ml-3.5 mt-1 mb-2\"}>\n <p>You can use the following placeholders in\n the file name\n and storage path values:</p>\n <ul>\n <li>{\"{file} - Full name of the uploaded file\"}</li>\n <li>{\"{file.name} - Name of the uploaded file without extension\"}</li>\n <li>{\"{file.ext} - Extension of the uploaded file\"}</li>\n <li>{\"{entityId} - ID of the entity\"}</li>\n <li>{\"{propertyKey} - ID of this field\"}</li>\n <li>{\"{path} - Path of this entity\"}</li>\n <li>{\"{rand} - Random value used to avoid name collisions\"}</li>\n </ul>\n </Typography>\n\n <Field name={storeUrl}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Save URL instead of storage path\"}\n disabled={existing || disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n\n <Typography variant={\"caption\"} className={\"ml-3.5 mt-1 mb-2\"}>\n Turn this setting on, if you prefer to save\n the download\n URL of the uploaded file instead of the\n storage path.\n You can only change this prop upon creation.\n </Typography>\n </div>\n </div>\n </ExpandablePanel>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n {!multiple && <div className={\"grid grid-cols-12 gap-2\"}>\n <GeneralPropertyValidation disabled={disabled}/>\n </div>}\n {multiple && <div className={\"col-span-12\"}>\n <ArrayPropertyValidation disabled={disabled}/>\n </div>}\n </ValidationPanel>\n\n </div>\n </>\n );\n}\n","import { isPropertyBuilder, Properties, PropertiesOrBuilders, Property, PropertyOrBuilder } from \"@firecms/core\";\n\nexport function editableProperty(property: PropertyOrBuilder | PropertyOrBuilder): boolean {\n if (isPropertyBuilder(property))\n return false;\n if (isPropertyBuilder(property as PropertyOrBuilder))\n return false;\n else {\n const eProperty = property as Property;\n if (eProperty.dataType === \"array\" && typeof eProperty.of === \"function\")\n return false;\n else if (eProperty.dataType === \"array\" && Array.isArray(eProperty.of))\n return false;\n return Boolean(eProperty.editable);\n }\n}\n\nexport function removeNonEditableProperties(properties: PropertiesOrBuilders<any>): Properties {\n return Object.entries(properties)\n .filter(([_, property]) => editableProperty(property))\n .map(([key, propertyOrBuilder]) => {\n const property = propertyOrBuilder as Property;\n if (!editableProperty(property)) {\n return undefined;\n } else if (property.dataType === \"map\" && property.properties) {\n return {\n [key]: {\n ...property,\n properties: removeNonEditableProperties(property.properties as PropertiesOrBuilders)\n }\n };\n } else {\n return { [key]: property };\n }\n })\n .filter((e) => Boolean(e))\n .reduce((a, b) => ({ ...a, ...b }), {}) as Properties;\n}\n","import {\n ErrorBoundary,\n PropertyConfigBadge,\n getFieldConfig,\n isPropertyBuilder,\n Property,\n PropertyOrBuilder,\n useCustomizationController,\n} from \"@firecms/core\";\nimport {\n cardClickableMixin,\n cardMixin,\n cardSelectedMixin,\n cn,\n FunctionsIcon,\n Paper,\n RemoveCircleIcon,\n Typography,\n} from \"@firecms/ui\";\n\nimport { editableProperty } from \"../../utils/entities\";\n\nexport function PropertyFieldPreview({\n property,\n onClick,\n hasError,\n includeName,\n includeEditButton,\n selected\n }: {\n property: Property,\n hasError?: boolean,\n selected?: boolean,\n includeName?: boolean,\n includeEditButton?: boolean;\n onClick?: () => void\n}) {\n\n const { propertyConfigs } = useCustomizationController();\n\n const propertyConfig = getFieldConfig(property, propertyConfigs);\n const disabled = !editableProperty(property);\n\n const borderColorClass = hasError\n ? \"border-red-500 dark:border-red-500 border-opacity-100 dark:border-opacity-100 ring-0 dark:ring-0\"\n : (selected ? \"border-primary\" : \"border-transparent\");\n\n if(hasError)\n console.log(\"PropertyFieldPreview\", property)\n\n return <ErrorBoundary>\n <div\n onClick={onClick}\n className=\"flex flex-row w-full cursor-pointer\">\n <div className={\"m-4\"}>\n <PropertyConfigBadge propertyConfig={propertyConfig}/>\n </div>\n <Paper\n className={cn(\n \"border\",\n \"pl-2 w-full flex flex-row gap-4 items-center\",\n cardMixin,\n onClick ? cardClickableMixin : \"\",\n selected ? cardSelectedMixin : \"\",\n \"flex-grow p-4 border transition-colors duration-200\",\n borderColorClass\n )}\n >\n\n <div className=\"w-full flex flex-col\">\n\n {includeName &&\n <ErrorBoundary>\n <Typography variant=\"body1\"\n component=\"span\"\n className=\"flex-grow pr-2\">\n {property.name\n ? property.name\n : \"\\u00a0\"\n }\n </Typography>\n </ErrorBoundary>}\n\n <div className=\"flex flex-row items-center\">\n <ErrorBoundary>\n <Typography className=\"flex-grow pr-2\"\n variant={includeName ? \"body2\" : \"subtitle1\"}\n component=\"span\"\n color=\"secondary\">\n {propertyConfig?.name}\n </Typography>\n </ErrorBoundary>\n <ErrorBoundary>\n <Typography variant=\"body2\"\n component=\"span\"\n color=\"disabled\">\n {property.dataType}\n </Typography>\n </ErrorBoundary>\n\n </div>\n </div>\n\n {includeEditButton && <Typography variant={\"button\"}>\n EDIT\n </Typography>}\n\n </Paper>\n </div>\n </ErrorBoundary>\n}\n\nexport function NonEditablePropertyPreview({\n name,\n selected,\n onClick,\n property\n }: {\n name: string,\n selected: boolean,\n onClick?: () => void,\n property?: PropertyOrBuilder\n}) {\n\n const { propertyConfigs } = useCustomizationController();\n\n const propertyConfig = !isPropertyBuilder(property) && property ? getFieldConfig(property, propertyConfigs) : undefined;\n\n return (\n <div\n onClick={onClick}\n className=\"flex flex-row w-full cursor-pointer\">\n <div className={\"relative m-4\"}>\n {propertyConfig && <PropertyConfigBadge propertyConfig={propertyConfig}/>}\n {!propertyConfig && <div\n className={\"h-8 w-8 p-1 rounded-full shadow text-white bg-gray-500\"}>\n <FunctionsIcon color={\"inherit\"} size={\"medium\"}/>\n </div>}\n <RemoveCircleIcon color={\"disabled\"} size={\"small\"} className={\"absolute -right-2 -top-2\"}/>\n </div>\n <Paper\n className={cn(\n \"pl-2 w-full flex flex-row gap-4 items-center\",\n cardMixin,\n onClick ? cardClickableMixin : \"\",\n selected ? cardSelectedMixin : \"\",\n \"flex-grow p-4 border transition-colors duration-200\",\n selected ? \"border-primary\" : \"border-transparent\")}\n >\n\n <div className=\"w-full flex flex-col\">\n <Typography variant=\"body1\"\n component=\"span\"\n className=\"flex-grow pr-2\">\n {property?.name\n ? property.name\n : name\n }\n </Typography>\n\n <div className=\"flex flex-row items-center\">\n {propertyConfig && <Typography className=\"flex-grow pr-2\"\n variant={\"body2\"}\n component=\"span\"\n color=\"secondary\">\n {propertyConfig?.name}\n </Typography>}\n\n {property && !isPropertyBuilder(property) && <ErrorBoundary>\n <Typography variant=\"body2\"\n component=\"span\"\n color=\"disabled\">\n {property.dataType}\n </Typography>\n </ErrorBoundary>}\n\n {property && isPropertyBuilder(property) && <ErrorBoundary>\n <Typography variant=\"body2\"\n component=\"span\"\n color=\"disabled\">\n This property is defined as a property builder in code\n </Typography>\n </ErrorBoundary>}\n\n {!property && <ErrorBoundary>\n <Typography variant=\"body2\"\n component=\"span\"\n color=\"disabled\">\n This field is defined as an additional field in code\n </Typography>\n </ErrorBoundary>}\n\n </div>\n\n {/*<div className=\"flex flex-row text-xs\">*/}\n {/* <Typography className=\"flex-grow pr-2\"*/}\n {/* variant=\"body2\"*/}\n {/* component=\"span\"*/}\n {/* color=\"secondary\">*/}\n {/* This field can only be edited in code*/}\n {/* </Typography>*/}\n {/*</div>*/}\n </div>\n\n </Paper>\n </div>)\n}\n","import React, { useCallback } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport {\n AdditionalFieldDelegate,\n CMSType,\n ErrorBoundary,\n isPropertyBuilder,\n PropertiesOrBuilders,\n PropertyOrBuilder\n} from \"@firecms/core\";\nimport { AutoAwesomeIcon, defaultBorderMixin, DragHandleIcon, IconButton, RemoveIcon, Tooltip } from \"@firecms/ui\";\nimport { NonEditablePropertyPreview, PropertyFieldPreview } from \"./PropertyFieldPreview\";\nimport { DragDropContext, Draggable, DraggableProvided, Droppable } from \"@hello-pangea/dnd\";\nimport { getFullId, getFullIdPath } from \"./util\";\nimport { editableProperty } from \"../../utils/entities\";\n\nexport const PropertyTree = React.memo(\n function PropertyTree<M extends {\n [Key: string]: CMSType\n }>({\n namespace,\n selectedPropertyKey,\n onPropertyClick,\n properties,\n propertiesOrder: propertiesOrderProp,\n additionalFields,\n errors,\n onPropertyMove,\n onPropertyRemove,\n className,\n inferredPropertyKeys,\n collectionEditable\n }: {\n namespace?: string;\n selectedPropertyKey?: string;\n onPropertyClick?: (propertyKey: string, namespace?: string) => void;\n properties: PropertiesOrBuilders<M>;\n propertiesOrder?: string[];\n additionalFields?: AdditionalFieldDelegate<M>[];\n errors: Record<string, any>;\n onPropertyMove?: (propertiesOrder: string[], namespace?: string) => void;\n onPropertyRemove?: (propertyKey: string, namespace?: string) => void;\n className?: string;\n inferredPropertyKeys?: string[];\n collectionEditable: boolean;\n }) {\n\n const propertiesOrder = propertiesOrderProp ?? Object.keys(properties);\n\n const onDragEnd = useCallback((result: any) => {\n // dropped outside the list\n if (!result.destination) {\n return;\n }\n const startIndex = result.source.index;\n const endIndex = result.destination.index;\n\n const newPropertiesOrder = Array.from(propertiesOrder);\n const [removed] = newPropertiesOrder.splice(startIndex, 1);\n newPropertiesOrder.splice(endIndex, 0, removed);\n if (onPropertyMove)\n onPropertyMove(newPropertiesOrder, namespace);\n }, [namespace, onPropertyMove, propertiesOrder])\n\n return (\n <>\n\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable droppableId={`droppable_${namespace}`}>\n {(droppableProvided, droppableSnapshot) => (\n <div\n {...droppableProvided.droppableProps}\n ref={droppableProvided.innerRef}\n className={className}>\n {propertiesOrder && propertiesOrder\n .map((propertyKey: string, index: number) => {\n const property = properties[propertyKey] as PropertyOrBuilder;\n const additionalField = additionalFields?.find(field => field.key === propertyKey);\n\n if (!property && !additionalField) {\n console.warn(`Property ${propertyKey} not found in properties or additionalFields`);\n return null;\n }\n return (\n <Draggable\n key={`array_field_${namespace}_${propertyKey}}`}\n draggableId={`array_field_${namespace}_${propertyKey}}`}\n index={index}>\n {(provided, snapshot) => {\n return (\n <ErrorBoundary>\n <PropertyTreeEntry\n propertyKey={propertyKey as string}\n propertyOrBuilder={property}\n additionalField={additionalField}\n provided={provided}\n errors={errors}\n namespace={namespace}\n inferredPropertyKeys={inferredPropertyKeys}\n onPropertyMove={onPropertyMove}\n onPropertyRemove={onPropertyRemove}\n onPropertyClick={snapshot.isDragging ? undefined : onPropertyClick}\n selectedPropertyKey={selectedPropertyKey}\n collectionEditable={collectionEditable}\n />\n </ErrorBoundary>\n );\n }}\n </Draggable>);\n }).filter(Boolean)}\n\n {droppableProvided.placeholder}\n\n </div>\n )}\n </Droppable>\n </DragDropContext>\n\n </>\n );\n },\n (prevProps, nextProps) => {\n\n const isSelected = nextProps.selectedPropertyKey?.startsWith(nextProps.namespace ?? \"\");\n const wasSelected = prevProps.selectedPropertyKey?.startsWith(prevProps.namespace ?? \"\");\n if (isSelected || wasSelected)\n return false;\n\n return equal(prevProps.properties, nextProps.properties) &&\n prevProps.propertiesOrder === nextProps.propertiesOrder &&\n equal(prevProps.additionalFields, nextProps.additionalFields) &&\n equal(prevProps.errors, nextProps.errors) &&\n equal(prevProps.onPropertyClick, nextProps.onPropertyClick) &&\n // equal(prevProps.onPropertyMove, nextProps.onPropertyMove) &&\n // equal(prevProps.onPropertyRemove, nextProps.onPropertyRemove) &&\n prevProps.namespace === nextProps.namespace &&\n prevProps.collectionEditable === nextProps.collectionEditable;\n }\n);\n\nexport function PropertyTreeEntry({\n propertyKey,\n namespace,\n propertyOrBuilder,\n additionalField,\n provided,\n selectedPropertyKey,\n errors,\n onPropertyClick,\n onPropertyMove,\n onPropertyRemove,\n inferredPropertyKeys,\n collectionEditable\n }: {\n propertyKey: string;\n namespace?: string;\n propertyOrBuilder: PropertyOrBuilder;\n additionalField?: AdditionalFieldDelegate<any>;\n selectedPropertyKey?: string;\n provided: DraggableProvided;\n errors: Record<string, any>;\n onPropertyClick?: (propertyKey: string, namespace?: string) => void;\n onPropertyMove?: (propertiesOrder: string[], namespace?: string) => void;\n onPropertyRemove?: (propertyKey: string, namespace?: string) => void;\n inferredPropertyKeys?: string[];\n collectionEditable: boolean;\n}) {\n\n const isPropertyInferred = inferredPropertyKeys?.includes(namespace ? `${namespace}.${propertyKey}` : propertyKey);\n const fullId = getFullId(propertyKey, namespace);\n const fullIdPath = getFullIdPath(propertyKey, namespace);\n const hasError = fullIdPath in errors;\n\n let subtree;\n if (typeof propertyOrBuilder === \"object\") {\n const property = propertyOrBuilder;\n if (property.dataType === \"map\" && property.properties) {\n subtree = <PropertyTree\n selectedPropertyKey={selectedPropertyKey}\n namespace={fullId}\n properties={property.properties}\n propertiesOrder={property.propertiesOrder}\n errors={errors}\n onPropertyClick={onPropertyClick}\n onPropertyMove={onPropertyMove}\n onPropertyRemove={onPropertyRemove}\n collectionEditable={collectionEditable}\n />\n }\n }\n\n // const hasError = fullId ? getIn(errors, idToPropertiesPath(fullId)) : false;\n const selected = selectedPropertyKey === fullId;\n const editable = propertyOrBuilder && ((collectionEditable && !isPropertyBuilder(propertyOrBuilder)) || editableProperty(propertyOrBuilder));\n\n return (\n <div\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...provided.dragHandleProps}\n className=\"relative -ml-8\"\n >\n {subtree && <div\n className={\"absolute border-l \" + defaultBorderMixin}\n style={{\n left: \"32px\",\n top: \"64px\",\n bottom: \"16px\"\n }}/>}\n\n {!isPropertyBuilder(propertyOrBuilder) && !additionalField && editable\n ? <PropertyFieldPreview\n property={propertyOrBuilder}\n onClick={onPropertyClick ? () => onPropertyClick(propertyKey, namespace) : undefined}\n includeName={true}\n selected={selected}\n hasError={hasError}/>\n : <NonEditablePropertyPreview name={propertyKey}\n property={propertyOrBuilder}\n onClick={onPropertyClick ? () => onPropertyClick(propertyKey, namespace) : undefined}\n selected={selected}/>}\n\n <div className=\"absolute top-2 right-2 flex flex-row \">\n\n {isPropertyInferred && <Tooltip title={\"Inferred property\"}>\n <AutoAwesomeIcon size=\"small\" className={\"p-2\"}/>\n </Tooltip>}\n\n {onPropertyRemove && <Tooltip title={\"Remove\"}>\n <IconButton size=\"small\"\n color=\"inherit\"\n onClick={() => onPropertyRemove(propertyKey, namespace)}>\n <RemoveIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>}\n\n {onPropertyMove && <Tooltip title={\"Move\"}>\n <IconButton\n component={\"span\"}\n size=\"small\"\n >\n <DragHandleIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>}\n </div>\n\n {subtree && <div className={\"ml-16\"}>{subtree}</div>}\n </div>\n );\n\n}\n","import React, { useCallback, useState } from \"react\";\nimport { FieldCaption, MapProperty, Property, PropertyConfig, } from \"@firecms/core\";\nimport { AddIcon, BooleanSwitchWithLabel, Button, Paper, Typography } from \"@firecms/ui\";\nimport { PropertyFormDialog } from \"../PropertyEditView\";\nimport { getIn, useFormex } from \"@firecms/formex\";\nimport { PropertyTree } from \"../PropertyTree\";\nimport { getFullId, idToPropertiesPath, namespaceToPropertiesOrderPath, namespaceToPropertiesPath } from \"../util\";\n\nexport function MapPropertyField({ disabled, getData, allowDataInference, propertyConfigs, collectionEditable }: {\n disabled: boolean;\n getData?: () => Promise<object[]>;\n allowDataInference: boolean;\n propertyConfigs: Record<string, PropertyConfig>,\n collectionEditable: boolean;\n}) {\n\n const {\n values,\n setFieldValue\n } = useFormex<MapProperty>();\n\n const [propertyDialogOpen, setPropertyDialogOpen] = useState<boolean>(false);\n const [selectedPropertyKey, setSelectedPropertyKey] = useState<string | undefined>();\n const [selectedPropertyNamespace, setSelectedPropertyNamespace] = useState<string | undefined>();\n\n const propertiesOrder = values.propertiesOrder ?? Object.keys(values.properties ?? {});\n const onPropertyCreated = ({\n id,\n property\n }: { id?: string, property: Property }) => {\n if (!id)\n throw Error();\n setFieldValue(\"properties\", {\n ...(values.properties ?? {}),\n [id]: property\n }, false);\n\n const currentPropertiesOrder = values.propertiesOrder ?? Object.keys(values.properties ?? {});\n const newPropertiesOrder = currentPropertiesOrder.includes(id) ? currentPropertiesOrder : [...currentPropertiesOrder, id];\n setFieldValue(\"propertiesOrder\", newPropertiesOrder, false);\n\n setPropertyDialogOpen(false);\n };\n\n const deleteProperty = useCallback((propertyKey?: string, namespace?: string) => {\n const fullId = propertyKey ? getFullId(propertyKey, namespace) : undefined;\n if (!fullId)\n throw Error(\"collection editor miss config\");\n\n const propertiesPath = idToPropertiesPath(fullId);\n const propertiesOrderPath = namespaceToPropertiesOrderPath(namespace);\n\n const currentPropertiesOrder: string[] = getIn(values, propertiesOrderPath) ?? Object.keys(getIn(values, namespaceToPropertiesPath(namespace)));\n\n setFieldValue(propertiesPath, undefined, false);\n setFieldValue(propertiesOrderPath, currentPropertiesOrder.filter((p) => p !== propertyKey), false);\n\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }, [setFieldValue, values]);\n\n const selectedPropertyFullId = selectedPropertyKey ? getFullId(selectedPropertyKey, selectedPropertyNamespace) : undefined;\n const selectedProperty = selectedPropertyFullId ? getIn(values.properties, selectedPropertyFullId.replaceAll(\".\", \".properties.\")) : undefined;\n\n const empty = !propertiesOrder || propertiesOrder.length < 1;\n\n const onPropertyMove = useCallback((propertiesOrder: string[], namespace?: string) => {\n setFieldValue(namespaceToPropertiesOrderPath(namespace), propertiesOrder, false);\n }, []);\n\n return (\n <>\n <div className={\"col-span-12\"}>\n <div className=\"flex justify-between items-end my-4\">\n <Typography variant={\"subtitle2\"}>Properties in this group</Typography>\n <Button\n color=\"primary\"\n variant={\"outlined\"}\n onClick={() => setPropertyDialogOpen(true)}\n startIcon={<AddIcon/>}\n >\n Add property to {values.name ?? \"this group\"}\n </Button>\n </div>\n <Paper className=\"p-2 pl-8\">\n <PropertyTree\n properties={values.properties ?? {}}\n propertiesOrder={propertiesOrder}\n errors={{}}\n collectionEditable={collectionEditable}\n onPropertyClick={(propertyKey, namespace) => {\n setSelectedPropertyKey(propertyKey);\n setSelectedPropertyNamespace(namespace);\n setPropertyDialogOpen(true);\n }}\n onPropertyMove={onPropertyMove}/>\n\n {empty &&\n <Typography variant={\"label\"}\n className=\"h-full flex items-center justify-center p-4\">\n Add the first property to this group\n </Typography>}\n </Paper>\n </div>\n\n <div className={\"col-span-12\"}>\n <BooleanSwitchWithLabel\n position={\"start\"}\n size={\"small\"}\n label=\"Spread children as columns\"\n onValueChange={(v) => setFieldValue(\"spreadChildren\", v)}\n value={values.spreadChildren ?? false}\n />\n <FieldCaption>\n Set this flag to true if you want to display the children of this group as individual columns.\n </FieldCaption>\n </div>\n\n <PropertyFormDialog\n inArray={false}\n forceShowErrors={false}\n open={propertyDialogOpen}\n allowDataInference={allowDataInference}\n collectionEditable={collectionEditable}\n onCancel={() => {\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }}\n onOkClicked={() => {\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }}\n getData={getData}\n onDelete={deleteProperty}\n propertyKey={selectedPropertyKey}\n propertyNamespace={selectedPropertyNamespace}\n property={selectedProperty}\n existingProperty={Boolean(selectedPropertyKey)}\n autoUpdateId={!selectedPropertyKey}\n autoOpenTypeSelect={!selectedPropertyKey}\n onPropertyChanged={onPropertyCreated}\n existingPropertyKeys={selectedPropertyKey ? undefined : propertiesOrder}\n propertyConfigs={propertyConfigs}\n />\n\n </>);\n}\n","import React, { useState } from \"react\";\nimport { ArrayProperty, getFieldConfig, Property, PropertyConfig } from \"@firecms/core\";\nimport { Button, Paper, Typography } from \"@firecms/ui\";\nimport { Field, getIn, useFormex } from \"@firecms/formex\";\nimport { PropertyFormDialog } from \"../PropertyEditView\";\nimport { PropertyFieldPreview } from \"../PropertyFieldPreview\";\nimport { ArrayPropertyValidation } from \"./validation/ArrayPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\n\nexport function RepeatPropertyField({\n showErrors,\n existing,\n disabled,\n getData,\n allowDataInference,\n propertyConfigs,\n collectionEditable\n }: {\n showErrors: boolean,\n existing: boolean,\n disabled: boolean,\n getData?: () => Promise<object[]>;\n allowDataInference: boolean;\n propertyConfigs: Record<string, PropertyConfig>,\n collectionEditable: boolean;\n}) {\n\n const {\n values,\n handleChange,\n errors,\n setFieldValue,\n touched\n } = useFormex<ArrayProperty>();\n\n const [propertyDialogOpen, setPropertyDialogOpen] = useState(false);\n const ofProperty = getIn(values, \"of\");\n const ofPropertyError = getIn(touched, \"of\") && getIn(errors, \"of\");\n\n const onPropertyChanged = ({ id, property, namespace }:\n { id?: string, property: Property, namespace?: string }) => {\n console.log(\"onPropertyChanged\", id, property, namespace);\n setFieldValue(\"of\", property);\n };\n\n const widget = ofProperty && getFieldConfig(ofProperty, propertyConfigs);\n return (\n <>\n <div className={\"col-span-12\"}>\n <Typography variant={\"subtitle2\"}>\n Repeat component\n </Typography>\n <Field\n name={\"of\"}\n value={ofProperty}\n // validate={(property: Property) => {\n // return property?.dataType ? undefined : \"You need to specify a repeat field\";\n // }}\n >\n {({}) => (\n <Paper className=\"p-2 mt-4\">\n\n {ofProperty && <PropertyFieldPreview\n property={ofProperty}\n onClick={disabled ? undefined : () => setPropertyDialogOpen(true)}\n includeName={false}\n includeEditButton={true}\n selected={false}\n hasError={false}/>}\n\n {!disabled && !ofProperty && <Button variant={\"text\"}\n size={\"large\"}\n color={ofPropertyError ? \"error\" : \"primary\"}\n onClick={() => setPropertyDialogOpen(true)}>\n Edit {`${widget ? widget.name : \"repeat component\"}`}\n </Button>}\n\n <PropertyFormDialog\n inArray={true}\n open={propertyDialogOpen}\n existingProperty={existing}\n getData={getData}\n autoUpdateId={!existing}\n autoOpenTypeSelect={!existing}\n onOkClicked={() => setPropertyDialogOpen(false)}\n allowDataInference={allowDataInference}\n property={ofProperty}\n includeIdAndName={false}\n onPropertyChanged={onPropertyChanged}\n forceShowErrors={showErrors}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n />\n </Paper>\n )}\n </Field>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n <ArrayPropertyValidation disabled={disabled}/>\n </ValidationPanel>\n\n </div>\n </>\n );\n}\n","import { Field, getIn, useFormex } from \"@firecms/formex\";\nimport { DebouncedTextField } from \"@firecms/ui\";\nimport { PropertyWithId } from \"../PropertyEditView\";\nimport React from \"react\";\nimport { FieldCaption, toSnakeCase, unslugify } from \"@firecms/core\";\n\ntype CommonPropertyFieldsProps = {\n showErrors: boolean,\n disabledId: boolean,\n disabled: boolean;\n isNewProperty: boolean;\n autoUpdateId: boolean;\n};\n\nexport const CommonPropertyFields = React.forwardRef<HTMLDivElement, CommonPropertyFieldsProps>(\n function CommonPropertyFields({\n showErrors,\n disabledId,\n disabled,\n autoUpdateId,\n isNewProperty\n }, ref) {\n\n const {\n errors,\n values,\n setFieldValue,\n setFieldTouched,\n touched,\n validate\n } = useFormex<PropertyWithId>();\n\n const name = \"name\";\n const nameError = showErrors && getIn(errors, name);\n\n const id = \"id\";\n const idError = showErrors && getIn(errors, id);\n\n const description = \"description\";\n const descriptionError = showErrors && getIn(errors, description);\n\n return (\n <div className={\"flex flex-col gap-2 col-span-12\"}>\n\n <div>\n <Field\n name={name}\n inputRef={ref}\n as={DebouncedTextField}\n value={values[name]}\n onChange={(e: any) => {\n const newNameValue = e.target.value;\n const idTouched = getIn(touched, id);\n if (!idTouched && autoUpdateId) {\n setFieldValue(id, newNameValue ? toSnakeCase(newNameValue) : \"\", false)\n }\n setFieldValue(name, newNameValue, true);\n setFieldTouched(name, true);\n }}\n style={{ fontSize: 20 }}\n placeholder={\"Field name\"}\n required\n disabled={disabled}\n error={Boolean(nameError)}/>\n\n <FieldCaption error={Boolean(nameError)}>\n {nameError}\n </FieldCaption>\n </div>\n\n <div>\n <Field\n name={id}\n as={DebouncedTextField}\n label={\"ID\"}\n value={values[id]}\n onChange={(e: any) => {\n const newIdValue = e.target.value;\n const nameTouched = getIn(touched, name);\n if (!nameTouched && autoUpdateId) {\n setFieldValue(name, newIdValue ? unslugify(newIdValue) : \"\")\n }\n setFieldValue(id, newIdValue, true);\n setFieldTouched(id, true);\n }}\n disabled={disabledId || disabled}\n required\n size=\"small\"\n error={Boolean(idError)}/>\n <FieldCaption error={Boolean(idError)}>\n {idError}\n </FieldCaption>\n </div>\n\n <div>\n <Field name={description}\n as={DebouncedTextField}\n label={\"Description\"}\n disabled={disabled}\n error={Boolean(descriptionError)}/>\n <FieldCaption error={Boolean(descriptionError)}>\n {descriptionError}\n </FieldCaption>\n </div>\n\n </div>\n );\n\n }\n);\n","import React from \"react\";\nimport { StringPropertyValidation } from \"./validation/StringPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { getIn, useFormex } from \"@firecms/formex\";\n\nimport { TextField } from \"@firecms/ui\";\n\nexport function StringPropertyField({\n widgetId,\n disabled,\n showErrors\n }: {\n widgetId: \"text_field\" | \"multiline\" | \"markdown\" | \"email\";\n disabled: boolean;\n showErrors: boolean;\n}) {\n\n const { values, setFieldValue } = useFormex();\n\n return (\n <>\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n\n {widgetId === \"text_field\" &&\n <StringPropertyValidation disabled={disabled}\n length={true}\n lowercase={true}\n matches={true}\n max={true}\n min={true}\n trim={true}\n uppercase={true}\n showErrors={showErrors}/>}\n {widgetId === \"multiline\" &&\n <StringPropertyValidation disabled={disabled}\n length={true}\n lowercase={true}\n max={true}\n min={true}\n trim={true}\n uppercase={true}\n showErrors={showErrors}/>}\n {widgetId === \"markdown\" &&\n <StringPropertyValidation disabled={disabled}\n length={true}\n lowercase={true}\n max={true}\n min={true}\n trim={true}\n uppercase={true}\n showErrors={showErrors}/>}\n\n {widgetId === \"email\" &&\n <StringPropertyValidation disabled={disabled}\n max={true}\n min={true}\n trim={true}\n showErrors={showErrors}/>}\n\n </ValidationPanel>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <TextField name={\"defaultValue\"}\n disabled={disabled}\n onChange={(e: any) => {\n setFieldValue(\"defaultValue\", e.target.value === \"\" ? undefined : e.target.value);\n }}\n label={\"Default value\"}\n value={getIn(values, \"defaultValue\") ?? \"\"}/>\n\n </div>\n </>\n );\n}\n","import React from \"react\";\nimport { Field, FormexFieldProps, getIn, useFormex } from \"@firecms/formex\";\n\nimport { GeneralPropertyValidation } from \"./validation/GeneralPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { SwitchControl } from \"../SwitchControl\";\n\nexport function BooleanPropertyField({ disabled }: {\n disabled: boolean;\n}) {\n const { values } = useFormex();\n const defaultValue = getIn(values, \"defaultValue\");\n\n return (\n <>\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n <GeneralPropertyValidation disabled={disabled}/>\n </ValidationPanel>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <Field\n name={\"defaultValue\"}>\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={defaultValue === null || defaultValue === undefined ? \"Default value not set\" : (\"Default value is \" + defaultValue.toString())}\n disabled={disabled}\n allowIndeterminate={true} field={field}\n form={form}/>\n }}\n </Field>\n\n </div>\n </>\n );\n}\n","import React, { useCallback, useState } from \"react\";\nimport { AddIcon, Button, Paper, Typography } from \"@firecms/ui\";\nimport { getIn, useFormex } from \"@firecms/formex\";\nimport { PropertyFormDialog } from \"../PropertyEditView\";\nimport { getFullId, idToPropertiesPath, namespaceToPropertiesOrderPath } from \"../util\";\nimport { PropertyTree } from \"../PropertyTree\";\nimport { ArrayProperty, Property, PropertyConfig } from \"@firecms/core\";\n\nexport function BlockPropertyField({ disabled, getData, allowDataInference, propertyConfigs, collectionEditable }: {\n disabled: boolean;\n getData?: () => Promise<object[]>;\n allowDataInference: boolean;\n propertyConfigs: Record<string, PropertyConfig>,\n collectionEditable: boolean;\n}) {\n\n const {\n values,\n setFieldValue\n } = useFormex<ArrayProperty>();\n\n const [propertyDialogOpen, setPropertyDialogOpen] = useState<boolean>(false);\n const [selectedPropertyKey, setSelectedPropertyKey] = useState<string | undefined>();\n const [selectedPropertyNamespace, setSelectedPropertyNamespace] = useState<string | undefined>();\n\n const onPropertyChanged = ({\n id,\n property\n }: { id?: string, property: Property }) => {\n if (!id)\n throw Error();\n\n setFieldValue(\"oneOf.properties\", {\n ...(values.oneOf?.properties ?? {}),\n [id]: property\n }, false);\n const currentPropertiesOrder = values.oneOf?.propertiesOrder ?? Object.keys(values.oneOf?.properties ?? {});\n const newPropertiesOrder = currentPropertiesOrder.includes(id) ? currentPropertiesOrder : [...currentPropertiesOrder, id];\n setFieldValue(\"oneOf.propertiesOrder\", newPropertiesOrder, false);\n setPropertyDialogOpen(false);\n };\n\n const selectedPropertyFullId = selectedPropertyKey ? getFullId(selectedPropertyKey, selectedPropertyNamespace) : undefined;\n const selectedProperty = selectedPropertyFullId ? getIn(values.oneOf?.properties, selectedPropertyFullId.replaceAll(\".\", \".properties.\")) : undefined;\n\n const deleteProperty = useCallback((propertyKey?: string, namespace?: string) => {\n const fullId = propertyKey ? getFullId(propertyKey, namespace) : undefined;\n if (!fullId)\n throw Error(\"collection editor miss config\");\n\n setFieldValue(`oneOf.${idToPropertiesPath(fullId)}`, undefined, false);\n const propertiesOrderPath = `oneOf.${namespaceToPropertiesOrderPath(namespace)}`;\n const currentPropertiesOrder: string[] = getIn(values, propertiesOrderPath);\n setFieldValue(propertiesOrderPath, currentPropertiesOrder.filter((p) => p !== propertyKey), false);\n\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }, [setFieldValue, values]);\n\n const addChildButton = <Button\n autoFocus\n color=\"primary\"\n\n onClick={() => setPropertyDialogOpen(true)}\n startIcon={<AddIcon/>}\n >\n Add property to {values.name ?? \"this block\"}\n </Button>;\n\n const onPropertyMove = useCallback((propertiesOrder: string[], namespace?: string) => {\n setFieldValue(`oneOf.${namespaceToPropertiesOrderPath(namespace)}`, propertiesOrder, false);\n }, []);\n\n return (\n <>\n <div className={\"col-span-12\"}>\n <div className={\"flex justify-between items-end mt-8 mb-4\"}>\n <Typography variant={\"subtitle2\"}>Properties in this\n block</Typography>\n {addChildButton}\n </div>\n <Paper className=\"p-2 pl-8\">\n\n <PropertyTree\n properties={values.oneOf?.properties ?? {}}\n propertiesOrder={values.oneOf?.propertiesOrder}\n errors={{}}\n collectionEditable={collectionEditable}\n onPropertyClick={disabled\n ? undefined\n : (propertyKey, namespace) => {\n setSelectedPropertyKey(propertyKey);\n setSelectedPropertyNamespace(namespace);\n setPropertyDialogOpen(true);\n }}\n onPropertyMove={disabled\n ? undefined\n : onPropertyMove}/>\n\n {!disabled && !values.oneOf?.propertiesOrder?.length &&\n <div className=\"h-full flex items-center justify-center p-4\">\n Add the first property to this block\n </div>}\n\n </Paper>\n </div>\n\n {!disabled && <PropertyFormDialog\n inArray={false}\n forceShowErrors={false}\n open={propertyDialogOpen}\n getData={getData}\n allowDataInference={allowDataInference}\n onCancel={() => {\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }}\n onOkClicked={() => {\n setPropertyDialogOpen(false);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }}\n collectionEditable={collectionEditable}\n onDelete={deleteProperty}\n propertyKey={selectedPropertyKey}\n propertyNamespace={selectedPropertyNamespace}\n property={selectedProperty}\n existingProperty={Boolean(selectedPropertyKey)}\n autoUpdateId={!selectedPropertyKey}\n autoOpenTypeSelect={!selectedPropertyKey}\n onPropertyChanged={onPropertyChanged}\n existingPropertyKeys={selectedPropertyKey ? undefined : values.oneOf?.propertiesOrder}\n propertyConfigs={propertyConfigs}/>}\n\n </>);\n}\n","import React from \"react\";\n\nimport { Field, FormexFieldProps, getIn, useFormex } from \"@firecms/formex\";\nimport { DebouncedTextField } from \"@firecms/ui\";\nimport { GeneralPropertyValidation } from \"./GeneralPropertyValidation\";\nimport { SwitchControl } from \"../../SwitchControl\";\n\nexport function NumberPropertyValidation({ disabled }: {\n disabled: boolean;\n}) {\n\n const {\n values,\n handleChange\n } = useFormex();\n\n const validationMin = \"validation.min\";\n const validationMax = \"validation.max\";\n const validationLessThan = \"validation.lessThan\";\n const validationMoreThan = \"validation.moreThan\";\n const validationPositive = \"validation.positive\";\n const validationNegative = \"validation.negative\";\n const validationInteger = \"validation.integer\";\n\n return (\n\n <div className={\"grid grid-cols-12 gap-2\"}>\n <GeneralPropertyValidation disabled={disabled}/>\n\n\n <div className={\"col-span-6\"}>\n <DebouncedTextField value={getIn(values, validationMin)}\n label={\"Min value\"}\n name={validationMin}\n type=\"number\"\n size=\"small\"\n disabled={disabled}\n onChange={handleChange}/>\n </div>\n\n <div className={\"col-span-6\"}>\n <DebouncedTextField value={getIn(values, validationMax)}\n label={\"Max value\"}\n name={validationMax}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>\n\n\n <div className={\"col-span-6\"}>\n <DebouncedTextField\n value={getIn(values, validationLessThan)}\n label={\"Less than\"}\n name={validationLessThan}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>\n\n <div className={\"col-span-6\"}>\n <DebouncedTextField\n value={getIn(values, validationMoreThan)}\n label={\"More than\"}\n name={validationMoreThan}\n type=\"number\"\n size=\"small\"\n\n disabled={disabled}\n onChange={handleChange}/>\n </div>\n\n <div className={\"col-span-4\"}>\n <Field name={validationPositive}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Positive value\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n <div className={\"col-span-4\"}>\n <Field name={validationNegative}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Negative value\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n <div className={\"col-span-4\"}>\n <Field name={validationInteger}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Integer value\"}\n disabled={disabled}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { NumberPropertyValidation } from \"./validation/NumberPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { TextField } from \"@firecms/ui\";\nimport { getIn, useFormex } from \"@firecms/formex\";\n\nexport function NumberPropertyField({ disabled }: {\n disabled: boolean;\n}) {\n\n const { values, setFieldValue } = useFormex();\n\n return (\n <>\n\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n <NumberPropertyValidation disabled={disabled}/>\n </ValidationPanel>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <TextField name={\"defaultValue\"}\n disabled={disabled}\n type={\"number\"}\n onChange={(e: any) => {\n setFieldValue(\"defaultValue\", e.target.value === \"\" ? undefined : parseFloat(e.target.value));\n }}\n label={\"Default value\"}\n value={getIn(values, \"defaultValue\") ?? \"\"}/>\n\n </div>\n </>\n );\n}\n","import React from \"react\";\nimport { Field, getIn, useFormex } from \"@firecms/formex\";\nimport { FieldCaption, IconForView, NumberProperty, StringProperty, useNavigationController } from \"@firecms/core\";\nimport { CircularProgress, Select, SelectGroup, SelectItem, Typography, } from \"@firecms/ui\";\n\nexport function ReferencePropertyField({\n existing,\n multiple,\n disabled,\n showErrors\n }: {\n existing: boolean,\n multiple: boolean,\n disabled: boolean,\n showErrors: boolean\n}) {\n\n const {\n values,\n handleChange,\n errors,\n } = useFormex<StringProperty | NumberProperty>();\n\n const navigation = useNavigationController();\n\n if (!navigation)\n return <div className={\"col-span-12\"}>\n <CircularProgress/>\n </div>;\n\n const pathPath = multiple ? \"of.path\" : \"path\";\n const pathValue: string | undefined = getIn(values, pathPath);\n const pathError: string | undefined = showErrors && getIn(errors, pathPath);\n\n return (\n <>\n <div className={\"col-span-12\"}>\n\n <Field name={pathPath}\n pathPath={pathPath}\n type=\"select\"\n disabled={(existing && Boolean(pathValue)) || disabled}\n value={pathValue}\n error={pathError}\n handleChange={handleChange}\n as={CollectionsSelect}/>\n\n </div>\n\n </>\n );\n}\n\nexport function CollectionsSelect({\n disabled,\n pathPath,\n value,\n handleChange,\n error,\n ...props\n }: {\n disabled: boolean,\n pathPath: string,\n value?: string,\n handleChange: (event: any) => void,\n error?: string\n}) {\n\n const navigation = useNavigationController();\n\n if (!navigation)\n return <div className={\"col-span-12\"}>\n <CircularProgress/>\n </div>;\n\n const collections = navigation?.collections ?? [];\n\n const groups: string[] = Array.from(new Set(\n Object.values(collections).map(e => e.group).filter(Boolean) as string[]\n ).values());\n\n const ungroupedCollections = collections.filter((col) => !col.group);\n\n return (\n <>\n <Select\n error={Boolean(error)}\n disabled={disabled}\n value={value ?? \"\"}\n position={\"item-aligned\"}\n name={pathPath}\n onChange={handleChange}\n label={\"Target collection\"}\n renderValue={(selected) => {\n const selectedCollection = collections.find(collection => collection.id === selected || collection.path === selected);\n if (!selectedCollection) return null;\n return (\n <div className=\"flex flex-row\">\n <IconForView collectionOrView={selectedCollection}/>\n <Typography\n variant={\"subtitle2\"}\n className=\"font-medium ml-4\">\n {selectedCollection?.name.toUpperCase()}\n </Typography>\n </div>)\n }}\n {...props}>\n\n {groups.flatMap((group) => (\n <SelectGroup label={group || \"Views\"}\n key={`group_${group}`}>\n {\n collections.filter(collection => collection.group === group)\n .map((collection) => {\n return <SelectItem\n key={`${collection.id ?? collection.path}-${group}`}\n value={collection.id ?? collection.path}>\n <div className=\"flex flex-row\">\n <IconForView collectionOrView={collection}/>\n <Typography\n variant={\"subtitle2\"}\n className=\"font-medium ml-4\">\n {collection?.name.toUpperCase()}\n </Typography>\n </div>\n </SelectItem>;\n })\n\n }\n </SelectGroup>\n ))}\n\n {ungroupedCollections && <SelectGroup label={\"Views\"}>\n {ungroupedCollections\n .map((collection) => {\n return <SelectItem key={collection.id ?? collection.path}\n value={collection.id ?? collection.path}>\n <div className=\"flex flex-row\">\n <IconForView collectionOrView={collection}/>\n <Typography\n variant={\"subtitle2\"}\n className=\"font-medium ml-4\">\n {collection?.name.toUpperCase()}\n </Typography>\n </div>\n </SelectItem>;\n })\n\n }\n </SelectGroup>}\n\n </Select>\n\n <FieldCaption>\n You can only edit the reference collection upon field\n creation.\n </FieldCaption>\n </>\n );\n}\n","import React from \"react\";\nimport { getIn, useFormex } from \"@firecms/formex\";\nimport { FieldCaption, NumberProperty, StringProperty } from \"@firecms/core\";\nimport { Select, SelectItem } from \"@firecms/ui\";\nimport { GeneralPropertyValidation } from \"./validation/GeneralPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\n\nexport function DateTimePropertyField({ disabled }: {\n disabled: boolean;\n}) {\n\n const {\n values,\n errors,\n touched,\n setFieldValue\n } = useFormex<StringProperty | NumberProperty>();\n\n const modePath = \"mode\";\n const modeValue: string | undefined = getIn(values, modePath);\n const modeError: string | undefined = getIn(touched, modePath) && getIn(errors, modePath);\n\n const autoValuePath = \"autoValue\";\n const autoValueValue: string | undefined = getIn(values, autoValuePath);\n const autoValueError: string | undefined = getIn(touched, autoValuePath) && getIn(errors, autoValuePath);\n\n return (\n <>\n <div className={\"flex flex-col col-span-12\"}>\n <Select name={modePath}\n value={modeValue ?? \"date\"}\n error={Boolean(modeError)}\n onValueChange={(v) => setFieldValue(modePath, v)}\n label={\"Mode\"}\n renderValue={(v) => {\n switch (v) {\n case \"date_time\":\n return \"Date/Time\";\n case \"date\":\n return \"Date\";\n default:\n return \"\";\n }\n }}\n disabled={disabled}>\n <SelectItem value={\"date_time\"}> Date/Time </SelectItem>\n <SelectItem value={\"date\"}> Date </SelectItem>\n </Select>\n <FieldCaption error={Boolean(modeError)}>\n {modeError}\n </FieldCaption>\n\n <Select name={autoValuePath}\n disabled={disabled}\n value={autoValueValue ?? \"\"}\n onValueChange={(v) => setFieldValue(autoValuePath, v === \"none\" ? null : v)}\n renderValue={(v) => {\n switch (v) {\n case \"on_create\":\n return \"On create\";\n case \"on_update\":\n return \"On any update\";\n default:\n return \"None\";\n }\n }}\n error={Boolean(autoValueError)}\n label={\"Automatic value\"}>\n <SelectItem value={\"none\"}> None </SelectItem>\n <SelectItem value={\"on_create\"}> On create </SelectItem>\n <SelectItem value={\"on_update\"}> On any update </SelectItem>\n </Select>\n <FieldCaption error={Boolean(autoValueError)}>\n {autoValueError ?? \"Update this field automatically when creating or updating the entity\"}\n </FieldCaption>\n\n </div>\n\n <div className={\"col-span-12\"}>\n <ValidationPanel>\n <GeneralPropertyValidation disabled={disabled}/>\n </ValidationPanel>\n </div>\n </>\n );\n}\n","import React from \"react\";\n\nimport { Field, FormexFieldProps } from \"@firecms/formex\";\nimport { SwitchControl } from \"../../SwitchControl\";\n\nexport function AdvancedPropertyValidation({ disabled }: {\n disabled: boolean\n}) {\n\n const columnWidth = \"columnWidth\";\n const hideFromCollection = \"hideFromCollection\";\n const readOnly = \"readOnly\";\n\n return (\n\n <div className={\"grid grid-cols-12 gap-2\"}>\n <div className={\"col-span-12\"}>\n <Field type=\"checkbox\" name={hideFromCollection}>\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Hide from collection\"}\n disabled={disabled}\n form={form}\n tooltip={\"Hide this field from the collection view. It will still be visible in the form view\"}\n field={field}/>\n }}\n </Field>\n </div>\n\n <div className={\"col-span-12\"}>\n <Field name={readOnly}\n type=\"checkbox\">\n {({ field, form }: FormexFieldProps) => {\n return <SwitchControl\n label={\"Read only\"}\n disabled={disabled}\n tooltip={\"Is this a read only field. Display only as a preview\"}\n form={form}\n field={field}/>\n }}\n </Field>\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { GeneralPropertyValidation } from \"./validation/GeneralPropertyValidation\";\n\nexport function KeyValuePropertyField({ disabled }: {\n disabled: boolean;\n}) {\n\n return (\n <>\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n <GeneralPropertyValidation disabled={disabled}/>\n </ValidationPanel>\n\n </div>\n </>\n );\n}\n","import {\n ArrayProperty,\n BooleanProperty,\n DateProperty,\n MapProperty,\n mergeDeep,\n NumberProperty,\n Property,\n PropertyConfig,\n StringProperty\n} from \"@firecms/core\";\n\nexport function updatePropertyFromWidget(propertyData: any,\n selectedWidgetId: string | undefined,\n propertyConfigs: Record<string, PropertyConfig>): Property {\n\n let updatedProperty;\n if (selectedWidgetId === \"text_field\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"text_field\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: undefined,\n multiline: undefined,\n markdown: undefined,\n email: undefined,\n url: undefined,\n enumValues: undefined\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"multiline\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"multiline\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n multiline: true,\n storage: undefined,\n markdown: undefined,\n email: undefined,\n url: undefined,\n enumValues: undefined\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"markdown\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"markdown\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: undefined,\n multiline: undefined,\n markdown: true,\n email: undefined,\n url: undefined\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"url\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"url\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: undefined,\n multiline: undefined,\n markdown: undefined,\n email: undefined,\n url: true,\n enumValues: undefined\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"email\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"email\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: undefined,\n multiline: undefined,\n markdown: undefined,\n email: true,\n url: undefined,\n enumValues: undefined\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"select\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"select\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: undefined,\n multiline: undefined,\n markdown: undefined,\n email: undefined,\n url: undefined,\n enumValues: propertyData.enumValues ?? []\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"multi_select\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"multi_select\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n of: {\n dataType: \"string\",\n enumValues: propertyData.of?.enumValues ?? []\n }\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId === \"number_input\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"number\",\n propertyConfig: \"number_input\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n enumValues: undefined\n } satisfies NumberProperty\n );\n } else if (selectedWidgetId === \"number_select\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"number\",\n propertyConfig: \"number_select\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n enumValues: propertyData.enumValues ?? []\n } satisfies NumberProperty\n );\n } else if (selectedWidgetId === \"multi_number_select\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"multi_number_select\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n of: {\n dataType: \"number\",\n enumValues: propertyData.of?.enumValues ?? []\n }\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId === \"file_upload\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"string\",\n propertyConfig: \"file_upload\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n storage: {\n storagePath: \"/\"\n }\n } satisfies StringProperty\n );\n } else if (selectedWidgetId === \"multi_file_upload\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"multi_file_upload\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n of: {\n dataType: \"string\",\n storage: propertyData.of?.storage ?? {\n storagePath: \"/\"\n }\n }\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId === \"group\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"map\",\n propertyConfig: \"group\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n keyValue: false,\n properties: propertyData.properties ?? {}\n } satisfies MapProperty\n );\n } else if (selectedWidgetId === \"key_value\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"map\",\n propertyConfig: \"key_value\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n keyValue: true,\n properties: undefined\n } satisfies MapProperty\n );\n } else if (selectedWidgetId === \"reference\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"reference\",\n propertyConfig: \"reference\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true\n } satisfies Property\n );\n } else if (selectedWidgetId === \"multi_references\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"multi_references\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n of: {\n dataType: \"reference\"\n }\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId === \"switch\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"boolean\",\n propertyConfig: \"switch\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true\n } satisfies BooleanProperty\n );\n } else if (selectedWidgetId === \"date_time\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"date\",\n propertyConfig: \"date_time\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n mode: \"date_time\"\n } satisfies DateProperty\n );\n } else if (selectedWidgetId === \"repeat\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"repeat\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId === \"block\") {\n updatedProperty = mergeDeep(\n propertyData,\n {\n dataType: \"array\",\n propertyConfig: \"block\",\n editable: propertyData.editable !== undefined ? propertyData.editable : true,\n oneOf: {\n properties: {}\n }\n } satisfies ArrayProperty\n );\n } else if (selectedWidgetId && propertyConfigs[selectedWidgetId]) {\n updatedProperty = {\n ...propertyConfigs[selectedWidgetId].property,\n propertyConfig: selectedWidgetId\n };\n }\n\n return updatedProperty;\n}\n","import { PropertyConfigBadge, PropertyConfig } from \"@firecms/core\";\nimport { cn, SelectItem, Typography } from \"@firecms/ui\";\n\nexport interface PropertySelectItemProps {\n value: string;\n optionDisabled: boolean;\n propertyConfig: PropertyConfig;\n existing: boolean;\n}\n\nexport function PropertySelectItem({ value, optionDisabled, propertyConfig, existing }: PropertySelectItemProps) {\n return <SelectItem value={value}\n disabled={optionDisabled}\n className={\"flex flex-row items-center\"}>\n <div\n className={cn(\n \"flex flex-row items-center text-base min-h-[52px]\",\n optionDisabled ? \"w-full\" : \"\")}>\n <div className={\"mr-8\"}>\n <PropertyConfigBadge propertyConfig={propertyConfig}/>\n </div>\n <div>\n <div>{propertyConfig.name}</div>\n <Typography variant={\"caption\"}\n color={\"disabled\"}\n className={\"max-w-sm\"}>\n {existing && optionDisabled ? \"You can only switch to widgets that use the same data type\" : propertyConfig.description}\n </Typography>\n </div>\n </div>\n </SelectItem>\n}\n","import React from \"react\";\nimport { StringPropertyValidation } from \"./validation/StringPropertyValidation\";\nimport { ValidationPanel } from \"./validation/ValidationPanel\";\nimport { getIn, useFormex } from \"@firecms/formex\";\n\nimport { Select, SelectItem, TextField } from \"@firecms/ui\";\n\nexport function UrlPropertyField({\n disabled,\n showErrors\n }: {\n disabled: boolean;\n showErrors: boolean;\n}) {\n\n const { values, setFieldValue } = useFormex();\n\n const urlValue = getIn(values, \"url\");\n\n return (\n <>\n <div className={\"col-span-12\"}>\n\n <Select\n disabled={disabled}\n position={\"item-aligned\"}\n onValueChange={(value: string) => {\n if (value === \"[NONE]\")\n setFieldValue(\"url\", true);\n else\n setFieldValue(\"url\", value);\n }}\n label={\"Preview type\"}\n renderValue={(value: string) => {\n switch (value) {\n case \"image\":\n return \"Image\";\n case \"video\":\n return \"Video\";\n case \"audio\":\n return \"Audio\";\n default:\n return \"Display URL\";\n }\n }}\n value={urlValue ?? \"[NONE]\"}>\n <SelectItem value={\"[NONE]\"}>\n Display URL\n </SelectItem>\n <SelectItem value={\"image\"}>\n Image\n </SelectItem>\n <SelectItem value={\"video\"}>\n Video\n </SelectItem>\n <SelectItem value={\"audio\"}>\n Audio\n </SelectItem>\n </Select>\n </div>\n\n <div className={\"col-span-12\"}>\n\n <ValidationPanel>\n\n <StringPropertyValidation disabled={disabled}\n max={true}\n min={true}\n trim={true}\n showErrors={showErrors}/>\n\n </ValidationPanel>\n\n </div>\n\n <div className={\"col-span-12\"}>\n\n <TextField name={\"defaultValue\"}\n disabled={disabled}\n onChange={(e: any) => {\n setFieldValue(\"defaultValue\", e.target.value === \"\" ? undefined : e.target.value);\n }}\n label={\"Default value\"}\n value={getIn(values, \"defaultValue\") ?? \"\"}/>\n\n </div>\n </>\n );\n}\n","import { DEFAULT_FIELD_CONFIGS, PropertyConfigId, PropertyConfig } from \"@firecms/core\";\n\nexport const supportedFieldsIds: PropertyConfigId[] = [\n \"text_field\",\n \"multiline\",\n \"markdown\",\n \"url\",\n \"email\",\n \"select\",\n \"multi_select\",\n \"number_input\",\n \"number_select\",\n \"multi_number_select\",\n \"file_upload\",\n \"multi_file_upload\",\n \"reference\",\n \"multi_references\",\n \"switch\",\n \"date_time\",\n \"group\",\n \"key_value\",\n \"repeat\",\n \"block\"\n];\n\nexport const supportedFields: Record<string, PropertyConfig> = Object.entries(DEFAULT_FIELD_CONFIGS)\n .filter(([id]) => supportedFieldsIds.includes(id as PropertyConfigId))\n .map(([id, config]) => ({ [id]: config }))\n .reduce((a, b) => ({ ...a, ...b }), {});\n","import React, { useDeferredValue, useEffect, useRef, useState } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { Formex, FormexController, getIn, useCreateFormex } from \"@firecms/formex\";\nimport {\n DEFAULT_FIELD_CONFIGS,\n DeleteConfirmationDialog,\n PropertyConfigId,\n getFieldConfig,\n getFieldId,\n isPropertyBuilder,\n isValidRegExp,\n mergeDeep,\n Property,\n PropertyConfig,\n PropertyConfigBadge,\n} from \"@firecms/core\";\nimport {\n Button,\n cn,\n DeleteIcon,\n Dialog,\n DialogActions,\n DialogContent,\n IconButton,\n InfoLabel,\n Select,\n Typography\n} from \"@firecms/ui\";\nimport { EnumPropertyField } from \"./properties/EnumPropertyField\";\nimport { StoragePropertyField } from \"./properties/StoragePropertyField\";\nimport { MapPropertyField } from \"./properties/MapPropertyField\";\nimport { RepeatPropertyField } from \"./properties/RepeatPropertyField\";\nimport { CommonPropertyFields } from \"./properties/CommonPropertyFields\";\nimport { StringPropertyField } from \"./properties/StringPropertyField\";\nimport { BooleanPropertyField } from \"./properties/BooleanPropertyField\";\nimport { BlockPropertyField } from \"./properties/BlockPropertyField\";\nimport { NumberPropertyField } from \"./properties/NumberPropertyField\";\nimport { ReferencePropertyField } from \"./properties/ReferencePropertyField\";\nimport { DateTimePropertyField } from \"./properties/DateTimePropertyField\";\nimport { AdvancedPropertyValidation } from \"./properties/advanced/AdvancedPropertyValidation\";\nimport { editableProperty } from \"../../utils/entities\";\nimport { KeyValuePropertyField } from \"./properties/KeyValuePropertyField\";\nimport { updatePropertyFromWidget } from \"./utils/update_property_for_widget\";\nimport { PropertySelectItem } from \"./PropertySelectItem\";\nimport { UrlPropertyField } from \"./properties/UrlPropertyField\";\nimport { supportedFields } from \"./utils/supported_fields\";\n\nexport type PropertyWithId = Property & {\n id?: string\n};\n\nexport type OnPropertyChangedParams = {\n id?: string,\n property: Property,\n namespace?: string,\n previousId?: string\n};\n\nexport type PropertyFormProps = {\n includeIdAndName?: boolean;\n existingProperty: boolean;\n autoUpdateId?: boolean;\n autoOpenTypeSelect: boolean;\n inArray: boolean;\n propertyKey?: string;\n propertyNamespace?: string;\n property?: Property;\n onPropertyChanged?: (params: OnPropertyChangedParams) => void;\n onPropertyChangedImmediate?: boolean;\n onDelete?: (id?: string, namespace?: string) => void;\n onError?: (id: string, namespace?: string, error?: Record<string, any>) => void;\n initialErrors?: Record<string, any>;\n existingPropertyKeys?: string[];\n forceShowErrors?: boolean;\n allowDataInference: boolean;\n getData?: () => Promise<object[]>;\n getController?: (formex: FormexController<PropertyWithId>) => void;\n propertyConfigs: Record<string, PropertyConfig>;\n collectionEditable: boolean;\n};\n\nexport const PropertyForm = React.memo(\n function PropertyForm(props: PropertyFormProps) {\n\n const {\n includeIdAndName = true,\n autoOpenTypeSelect,\n existingProperty,\n autoUpdateId,\n inArray,\n propertyKey,\n existingPropertyKeys,\n propertyNamespace,\n property,\n onPropertyChanged,\n onPropertyChangedImmediate = true,\n onDelete,\n onError,\n initialErrors,\n forceShowErrors,\n allowDataInference,\n getController,\n getData,\n propertyConfigs,\n collectionEditable\n } = props;\n\n const initialValue: PropertyWithId = {\n id: \"\",\n name: \"\"\n } as PropertyWithId;\n\n const disabled = (Boolean(property && !editableProperty(property)) && !collectionEditable);\n\n const lastSubmittedProperty = useRef<OnPropertyChangedParams | undefined>(property ? {\n id: propertyKey,\n previousId: propertyKey,\n property\n } : undefined);\n\n const doOnPropertyChanged = ({\n id,\n property\n }: OnPropertyChangedParams) => {\n const params = {\n id,\n previousId: lastSubmittedProperty.current?.id,\n property,\n namespace: propertyNamespace\n };\n lastSubmittedProperty.current = params;\n onPropertyChanged?.(params);\n };\n\n const formexController = useCreateFormex<PropertyWithId>({\n initialValues: property\n ? { id: propertyKey, ...property } as PropertyWithId\n : initialValue,\n initialErrors,\n validateOnChange: true,\n validateOnInitialRender: true,\n onSubmit: (newPropertyWithId, controller) => {\n console.debug(\"onSubmit\", newPropertyWithId);\n const {\n id,\n ...property\n } = newPropertyWithId;\n doOnPropertyChanged({\n id,\n property: { ...property, editable: property.editable ?? true }\n });\n if (!existingProperty)\n controller.resetForm({ values: initialValue });\n },\n validation: (values) => {\n const errors: Record<string, any> = {};\n if (includeIdAndName) {\n if (!values.name) {\n errors.name = \"Required\";\n } else {\n const nameError = validateName(values.name);\n if (nameError)\n errors.name = nameError;\n }\n if (!values.id) {\n errors.id = \"Required\";\n } else {\n const idError = validateId(values.id, existingPropertyKeys);\n if (idError)\n errors.id = idError;\n }\n }\n\n if (values.dataType === \"string\") {\n if (values.validation?.matches && !isValidRegExp(values.validation?.matches.toString())) {\n errors.validation = {\n matches: \"Invalid regular expression\"\n }\n }\n }\n if (values.dataType === \"reference\" && !values.path) {\n errors.path = \"You must specify a target collection for the field\";\n }\n if (values.propertyConfig === \"repeat\") {\n if (!(values as any).of) {\n errors.of = \"You need to specify a repeat field\";\n }\n }\n if (values.propertyConfig === \"block\") {\n if (!(values as any).oneOf) {\n errors.oneOf = \"You need to specify the properties of this block\";\n }\n }\n return errors;\n }\n });\n\n useEffect(() => {\n getController?.(formexController);\n }, [formexController, getController]);\n\n return <Formex value={formexController}>\n <PropertyEditFormFields\n onPropertyChanged={onPropertyChangedImmediate\n ? doOnPropertyChanged\n : undefined}\n onDelete={onDelete}\n includeIdAndTitle={includeIdAndName}\n propertyNamespace={propertyNamespace}\n onError={onError}\n showErrors={forceShowErrors || formexController.submitCount > 0}\n existing={existingProperty}\n autoUpdateId={autoUpdateId}\n inArray={inArray}\n autoOpenTypeSelect={autoOpenTypeSelect}\n disabled={disabled}\n getData={getData}\n allowDataInference={allowDataInference}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n {...formexController}/>\n </Formex>;\n }, (a, b) =>\n a.getData === b.getData &&\n a.propertyKey === b.propertyKey &&\n a.propertyNamespace === b.propertyNamespace &&\n a.includeIdAndName === b.includeIdAndName &&\n a.autoOpenTypeSelect === b.autoOpenTypeSelect &&\n a.autoUpdateId === b.autoUpdateId &&\n a.existingProperty === b.existingProperty\n);\n\nexport function PropertyFormDialog({\n open,\n onCancel,\n onOkClicked,\n onPropertyChanged,\n getData,\n collectionEditable,\n ...formProps\n }: PropertyFormProps & {\n open?: boolean;\n onOkClicked?: () => void;\n onCancel?: () => void;\n}) {\n const formexRef = useRef<FormexController<PropertyWithId>>();\n const getController = (helpers: FormexController<PropertyWithId>) => {\n formexRef.current = helpers;\n };\n\n return <Dialog\n open={open ?? false}\n maxWidth={\"xl\"}\n fullWidth={true}\n >\n <form noValidate={true}\n autoComplete={\"off\"}\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n formexRef.current?.handleSubmit(e)\n }}>\n <DialogContent>\n <PropertyForm {...formProps}\n onPropertyChanged={(params) => {\n onPropertyChanged?.(params);\n onOkClicked?.();\n }}\n collectionEditable={collectionEditable}\n onPropertyChangedImmediate={false}\n getController={getController}\n getData={getData}\n />\n </DialogContent>\n\n <DialogActions>\n\n {onCancel && <Button\n variant={\"text\"}\n onClick={() => {\n onCancel();\n formexRef.current?.resetForm();\n }}>\n Cancel\n </Button>}\n\n <Button variant=\"outlined\"\n type={\"submit\"}\n color=\"primary\">\n Ok\n </Button>\n </DialogActions>\n </form>\n </Dialog>;\n\n}\n\nfunction PropertyEditFormFields({\n values,\n errors,\n setValues,\n existing,\n autoUpdateId = false,\n autoOpenTypeSelect,\n includeIdAndTitle,\n onPropertyChanged,\n onDelete,\n propertyNamespace,\n onError,\n showErrors,\n disabled,\n inArray,\n getData,\n allowDataInference,\n propertyConfigs,\n collectionEditable\n }: {\n includeIdAndTitle?: boolean;\n existing: boolean;\n autoUpdateId?: boolean;\n autoOpenTypeSelect: boolean;\n propertyNamespace?: string;\n onPropertyChanged?: (params: OnPropertyChangedParams) => void;\n onDelete?: (id?: string, namespace?: string) => void;\n onError?: (id: string, namespace?: string, error?: Record<string, any>) => void;\n showErrors: boolean;\n inArray: boolean;\n disabled: boolean;\n getData?: () => Promise<object[]>;\n allowDataInference: boolean;\n propertyConfigs: Record<string, PropertyConfig>;\n collectionEditable: boolean;\n} & FormexController<PropertyWithId>) {\n\n const [selectOpen, setSelectOpen] = useState(autoOpenTypeSelect);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [selectedFieldConfigId, setSelectedFieldConfigId] = useState<string | undefined>(values?.dataType ? getFieldId(values) : undefined);\n\n const allSupportedFields = Object.entries(supportedFields).concat(Object.entries(propertyConfigs));\n\n const displayedWidgets = inArray\n ? allSupportedFields.filter(([_, propertyConfig]) => !isPropertyBuilder(propertyConfig.property) && propertyConfig.property?.dataType !== \"array\")\n : allSupportedFields;\n\n const deferredValues = useDeferredValue(values);\n const nameFieldRef = useRef<HTMLInputElement>(null);\n\n const lastSubmittedProperty = useRef<object>(values);\n\n const selectedWidgetError = showErrors && getIn(errors, \"selectedWidget\");\n\n useEffect(() => {\n if (onPropertyChanged) {\n if ((!includeIdAndTitle || deferredValues.id)) {\n const {\n id,\n ...property\n } = deferredValues;\n if (!equal(deferredValues, lastSubmittedProperty.current)) {\n onPropertyChanged({\n id,\n property,\n namespace: propertyNamespace\n });\n lastSubmittedProperty.current = deferredValues;\n }\n }\n }\n }, [deferredValues, includeIdAndTitle, onPropertyChanged, propertyNamespace]);\n\n useEffect(() => {\n if (values?.id && onError) {\n onError(values?.id, propertyNamespace, errors);\n }\n }, [errors, onError, propertyNamespace, values?.id]);\n\n const onWidgetSelectChanged = (newSelectedWidgetId: PropertyConfigId) => {\n setSelectedFieldConfigId(newSelectedWidgetId);\n setValues(updatePropertyFromWidget(values, newSelectedWidgetId, propertyConfigs));\n // Ugly hack to autofocus the name field\n setTimeout(() => {\n nameFieldRef.current?.focus();\n }, 0);\n };\n\n let childComponent;\n if (selectedFieldConfigId === \"text_field\" ||\n selectedFieldConfigId === \"multiline\" ||\n selectedFieldConfigId === \"markdown\" ||\n selectedFieldConfigId === \"email\") {\n childComponent =\n <StringPropertyField widgetId={selectedFieldConfigId}\n disabled={disabled}\n showErrors={showErrors}/>;\n } else if (selectedFieldConfigId === \"url\") {\n childComponent =\n <UrlPropertyField disabled={disabled}\n showErrors={showErrors}/>;\n } else if (selectedFieldConfigId === \"select\" ||\n selectedFieldConfigId === \"number_select\") {\n childComponent = <EnumPropertyField\n multiselect={false}\n allowDataInference={allowDataInference}\n updateIds={!existing}\n disabled={disabled}\n getData={getData}\n showErrors={showErrors}/>;\n } else if (selectedFieldConfigId === \"multi_select\" ||\n selectedFieldConfigId === \"multi_number_select\") {\n childComponent = <EnumPropertyField\n multiselect={true}\n updateIds={!existing}\n disabled={disabled}\n allowDataInference={allowDataInference}\n getData={getData}\n showErrors={showErrors}/>;\n } else if (selectedFieldConfigId === \"file_upload\") {\n childComponent =\n <StoragePropertyField existing={existing}\n multiple={false}\n disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"multi_file_upload\") {\n childComponent =\n <StoragePropertyField existing={existing}\n multiple={true}\n disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"switch\") {\n childComponent = <BooleanPropertyField disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"number_input\") {\n childComponent = <NumberPropertyField disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"group\") {\n childComponent =\n <MapPropertyField disabled={disabled} getData={getData} allowDataInference={allowDataInference}\n collectionEditable={collectionEditable}\n propertyConfigs={propertyConfigs}/>;\n } else if (selectedFieldConfigId === \"block\") {\n childComponent =\n <BlockPropertyField disabled={disabled} getData={getData} allowDataInference={allowDataInference}\n collectionEditable={collectionEditable}\n propertyConfigs={propertyConfigs}/>;\n } else if (selectedFieldConfigId === \"reference\") {\n childComponent =\n <ReferencePropertyField showErrors={showErrors}\n existing={existing}\n multiple={false}\n disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"date_time\") {\n childComponent = <DateTimePropertyField disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"multi_references\") {\n childComponent =\n <ReferencePropertyField showErrors={showErrors}\n existing={existing}\n multiple={true}\n disabled={disabled}/>;\n } else if (selectedFieldConfigId === \"repeat\") {\n childComponent =\n <RepeatPropertyField showErrors={showErrors}\n existing={existing}\n getData={getData}\n allowDataInference={allowDataInference}\n disabled={disabled}\n collectionEditable={collectionEditable}\n propertyConfigs={propertyConfigs}/>;\n } else if (selectedFieldConfigId === \"key_value\") {\n childComponent =\n <KeyValuePropertyField disabled={disabled}/>;\n } else {\n childComponent = null;\n }\n\n return (\n <>\n {disabled && <InfoLabel mode={\"warn\"}>\n <Typography>This property can&apos;t be edited</Typography>\n <Typography variant={\"caption\"}>\n You may not have permission to\n edit it or it is defined in code with no <code>editable</code> flag\n </Typography>\n </InfoLabel>}\n\n <div className=\"flex mt-2 justify-between\">\n <div className={\"w-full flex flex-col gap-2\"}>\n <Select\n // className={\"w-full\"}\n error={Boolean(selectedWidgetError)}\n value={selectedFieldConfigId ?? \"\"}\n placeholder={\"Select a property widget\"}\n open={selectOpen}\n onOpenChange={setSelectOpen}\n position={\"item-aligned\"}\n disabled={disabled}\n renderValue={(value) => {\n if (!value) {\n return <em>Select a property\n widget</em>;\n }\n const key = value as PropertyConfigId;\n const propertyConfig = DEFAULT_FIELD_CONFIGS[key] ?? propertyConfigs[key];\n const baseProperty = propertyConfig.property;\n const baseFieldConfig = baseProperty && !isPropertyBuilder(baseProperty) ? getFieldConfig(baseProperty, propertyConfigs) : undefined;\n const optionDisabled = isPropertyBuilder(baseProperty) || (existing && baseProperty.dataType !== values?.dataType);\n const computedFieldConfig = baseFieldConfig ? mergeDeep(baseFieldConfig, propertyConfig) : propertyConfig;\n return <div\n onClick={(e) => {\n if (optionDisabled) {\n e.stopPropagation();\n e.preventDefault();\n }\n }}\n className={cn(\n \"flex items-center\",\n optionDisabled ? \"w-full pointer-events-none opacity-50\" : \"\")}>\n <div className={\"mr-8\"}>\n <PropertyConfigBadge propertyConfig={computedFieldConfig}/>\n </div>\n <div className={\"flex flex-col items-start text-base text-left\"}>\n <div>{computedFieldConfig.name}</div>\n <Typography variant={\"caption\"}\n color={\"disabled\"}>\n {optionDisabled ? \"You can only switch to widgets that use the same data type\" : computedFieldConfig.description}\n </Typography>\n </div>\n </div>\n }}\n onValueChange={(value) => {\n onWidgetSelectChanged(value as PropertyConfigId);\n }}>\n {displayedWidgets.map(([key, propertyConfig]) => {\n const baseProperty = propertyConfig.property;\n const optionDisabled = existing && !isPropertyBuilder(baseProperty) && baseProperty.dataType !== values?.dataType;\n return <PropertySelectItem\n key={key}\n value={key}\n optionDisabled={optionDisabled}\n propertyConfig={propertyConfig}\n existing={existing}/>;\n })}\n </Select>\n\n {selectedWidgetError &&\n <Typography variant=\"caption\"\n className={\"ml-3.5\"}\n color={\"error\"}>Required</Typography>}\n\n {/*<Typography variant=\"caption\" className={\"ml-3.5\"}>Define your own custom properties and*/}\n {/* components</Typography>*/}\n\n </div>\n\n {onDelete && values?.id &&\n <IconButton\n variant={\"ghost\"}\n className=\"m-4\"\n disabled={disabled}\n onClick={() => setDeleteDialogOpen(true)}>\n <DeleteIcon/>\n </IconButton>}\n </div>\n\n <div className={\"grid grid-cols-12 gap-y-12 mt-8 mb-8\"}>\n {includeIdAndTitle &&\n <CommonPropertyFields showErrors={showErrors}\n disabledId={existing}\n isNewProperty={!existing}\n disabled={disabled}\n autoUpdateId={autoUpdateId}\n ref={nameFieldRef}/>}\n\n {childComponent}\n\n <div className={\"col-span-12\"}>\n <AdvancedPropertyValidation disabled={disabled}/>\n </div>\n </div>\n\n {onDelete &&\n <DeleteConfirmationDialog open={deleteDialogOpen}\n onAccept={() => onDelete(values?.id, propertyNamespace)}\n onCancel={() => setDeleteDialogOpen(false)}\n title={<div>Delete this property?</div>}\n body={\n <div> This will <b>not delete any\n data</b>, only modify the\n collection.</div>\n }/>}\n\n </>\n );\n}\n\nconst idRegEx = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n\nfunction validateId(value?: string, existingPropertyKeys?: string[]) {\n\n let error;\n if (!value) {\n error = \"You must specify an id for the field\";\n }\n if (value && !value.match(idRegEx)) {\n error = \"The id can only contain letters, numbers and underscores (_), and not start with a number\";\n }\n if (value && existingPropertyKeys && existingPropertyKeys.includes(value)) {\n error = \"There is another field with this ID already\";\n }\n return error;\n}\n\nfunction validateName(value: string) {\n let error;\n if (!value) {\n error = \"You must specify a title for the field\";\n }\n return error;\n}\n","export function camelCase(str: string): string {\n if (!str) return \"\";\n return (str.slice(0, 1).toLowerCase() + str.slice(1))\n .replace(/([-_ ]){1,}/g, \" \")\n .split(/[-_ ]/)\n .reduce((cur, acc) => {\n return cur + acc[0].toUpperCase() + acc.substring(1);\n }, \"\");\n}\n","import { EntityCollection, useSnackbarController } from \"@firecms/core\";\nimport { Button, ContentCopyIcon, Dialog, DialogActions, DialogContent, Typography, } from \"@firecms/ui\";\nimport React from \"react\";\nimport JSON5 from \"json5\";\nimport { Highlight, themes } from \"prism-react-renderer\"\nimport { camelCase } from \"./utils/strings\";\n\nexport function GetCodeDialog({ collection, onOpenChange, open }: { onOpenChange: (open: boolean) => void, collection: any, open: any }) {\n\n const snackbarController = useSnackbarController();\n\n const code = \"import { EntityCollection } from \\\"firecms\\\";\\n\\nconst \" + (collection.name ? camelCase(collection.name) : \"my\") + \"Collection:EntityCollection = \" + JSON5.stringify(collectionToCode(collection), null, \"\\t\");\n return <Dialog open={open}\n onOpenChange={onOpenChange}\n maxWidth={\"4xl\"}>\n <DialogContent>\n <Typography variant={\"h6\"} className={\"my-4\"}>\n Code for {collection.name}\n </Typography>\n <Typography variant={\"body2\"} className={\"my-4 mb-8\"}>\n If you want to customise the collection in code, you can add this collection code to your CMS\n app configuration.\n More info in the <a\n rel=\"noopener noreferrer\"\n href={\"https://firecms.co/docs/customization_quickstart\"}>docs</a>.\n </Typography>\n <Highlight\n theme={themes.vsDark}\n code={code}\n language=\"typescript\"\n >\n {({ className, style, tokens, getLineProps, getTokenProps }) => (\n <pre style={style} className={\"p-4 rounded text-sm\"}>\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))}\n </div>\n ))}\n </pre>\n )}\n </Highlight>\n\n </DialogContent>\n <DialogActions>\n <Button\n variant={\"text\"}\n size={\"small\"}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n snackbarController.open({\n type: \"success\",\n message: `Copied`\n })\n return navigator.clipboard.writeText(code);\n }}>\n <ContentCopyIcon size={\"small\"}/>\n Copy to clipboard\n </Button>\n <Button onClick={() => onOpenChange(false)}>Close</Button>\n </DialogActions>\n </Dialog>;\n}\n\nfunction collectionToCode(collection: EntityCollection): object {\n\n const propertyCleanup = (property: any) => {\n\n const updatedProperty = {\n ...property\n };\n\n delete updatedProperty.fromBuilder;\n delete updatedProperty.resolved;\n delete updatedProperty.propertiesOrder;\n delete updatedProperty.editable;\n\n if (updatedProperty.type === \"map\") {\n return {\n ...updatedProperty,\n properties: updatedProperty.properties.map(propertyCleanup)\n }\n }\n return updatedProperty;\n }\n\n return {\n id: collection.id,\n name: collection.name,\n singularName: collection.singularName,\n path: collection.path,\n description: collection.description,\n editable: true,\n collectionGroup: collection.collectionGroup,\n icon: collection.icon,\n group: collection.group,\n customId: collection.customId,\n initialFilter: collection.initialFilter,\n initialSort: collection.initialSort,\n properties: Object.entries(collection.properties ?? {})\n .map(([key, value]) => ({\n [key]: propertyCleanup(value)\n }))\n .reduce((a, b) => ({ ...a, ...b }), {}),\n subcollections: (collection.subcollections ?? []).map(collectionToCode)\n }\n\n}\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport { Field, getIn, useFormex } from \"@firecms/formex\";\nimport {\n EntityCollection,\n ErrorBoundary,\n isPropertyBuilder,\n makePropertiesEditable,\n Properties,\n Property,\n PropertyConfig,\n PropertyOrBuilder,\n useLargeLayout,\n User,\n useSnackbarController\n} from \"@firecms/core\";\nimport {\n AddIcon,\n AutoAwesomeIcon,\n Button,\n CircularProgress,\n cn,\n CodeIcon,\n DebouncedTextField,\n defaultBorderMixin,\n IconButton,\n Paper,\n Tooltip,\n Typography,\n} from \"@firecms/ui\";\n\nimport { getFullId, idToPropertiesPath, namespaceToPropertiesOrderPath } from \"./util\";\nimport { OnPropertyChangedParams, PropertyForm, PropertyFormDialog } from \"./PropertyEditView\";\nimport { PropertyTree } from \"./PropertyTree\";\nimport { PersistedCollection } from \"../../types/persisted_collection\";\nimport { GetCodeDialog } from \"./GetCodeDialog\";\n\ntype CollectionEditorFormProps = {\n showErrors: boolean;\n isNewCollection: boolean;\n propertyErrorsRef?: React.MutableRefObject<any>;\n onPropertyError: (propertyKey: string, namespace: string | undefined, error?: Record<string, any>) => void;\n setDirty?: (dirty: boolean) => void;\n reservedGroups?: string[];\n extraIcon: React.ReactNode;\n getUser: (uid: string) => User | null;\n getData?: () => Promise<object[]>;\n doCollectionInference: (collection: PersistedCollection) => Promise<Partial<EntityCollection> | null> | undefined;\n propertyConfigs: Record<string, PropertyConfig>;\n collectionEditable: boolean;\n};\n\nexport function CollectionPropertiesEditorForm({\n showErrors,\n isNewCollection,\n propertyErrorsRef,\n onPropertyError,\n setDirty,\n reservedGroups,\n extraIcon,\n getUser,\n getData,\n doCollectionInference,\n propertyConfigs,\n collectionEditable\n }: CollectionEditorFormProps) {\n\n const {\n values,\n setFieldValue,\n setFieldError,\n setFieldTouched,\n errors,\n dirty\n } = useFormex<PersistedCollection>();\n\n const snackbarController = useSnackbarController();\n\n const largeLayout = useLargeLayout();\n const asDialog = !largeLayout\n\n // index of the selected property within the namespace\n const [selectedPropertyIndex, setSelectedPropertyIndex] = useState<number | undefined>();\n const [selectedPropertyKey, setSelectedPropertyKey] = useState<string | undefined>();\n const [selectedPropertyNamespace, setSelectedPropertyNamespace] = useState<string | undefined>();\n\n const selectedPropertyFullId = selectedPropertyKey ? getFullId(selectedPropertyKey, selectedPropertyNamespace) : undefined;\n const selectedProperty = selectedPropertyFullId ? getIn(values.properties, selectedPropertyFullId.replaceAll(\".\", \".properties.\")) : undefined;\n const [codeDialogOpen, setCodeDialogOpen] = useState<boolean>(false);\n\n const [inferringProperties, setInferringProperties] = useState<boolean>(false);\n\n const [newPropertyDialogOpen, setNewPropertyDialogOpen] = useState<boolean>(false);\n const [inferredPropertyKeys, setInferredPropertyKeys] = useState<string[]>([]);\n\n const currentPropertiesOrderRef = React.useRef<{\n [key: string]: string[]\n }>(values.propertiesOrder ? { \"\": values.propertiesOrder } : {});\n\n useEffect(() => {\n if (setDirty)\n setDirty(dirty);\n }, [dirty]);\n\n const inferPropertiesFromData = doCollectionInference\n ? (): void => {\n if (!doCollectionInference)\n return;\n\n setInferringProperties(true);\n // @ts-ignore\n doCollectionInference(values)\n .then((newCollection) => {\n\n if (newCollection)\n makePropertiesEditable(newCollection.properties as Properties);\n\n if (!newCollection) {\n snackbarController.open({\n type: \"error\",\n message: \"Could not infer properties from data\"\n });\n return;\n }\n // find properties in the new collection, not present in the current one\n const newPropertyKeys = (newCollection.properties ? Object.keys(newCollection.properties) : [])\n .filter((propertyKey) => !values.properties[propertyKey]);\n if (newPropertyKeys.length === 0) {\n snackbarController.open({\n type: \"info\",\n message: \"No new properties found in existing data\"\n });\n return;\n }\n // add them to the current collection\n const updatedProperties = {\n ...newPropertyKeys.reduce((acc, propertyKey) => {\n acc[propertyKey] = (newCollection.properties ?? {})[propertyKey];\n return acc;\n }, {} as {\n [key: string]: PropertyOrBuilder\n }),\n ...values.properties\n };\n const updatedPropertiesOrder = [\n ...newPropertyKeys,\n ...(values.propertiesOrder ?? [])\n ];\n setFieldValue(\"properties\", updatedProperties, false);\n\n updatePropertiesOrder(updatedPropertiesOrder);\n\n setInferredPropertyKeys(newPropertyKeys);\n })\n .finally(() => {\n setInferringProperties(false);\n })\n }\n : undefined;\n\n const getCurrentPropertiesOrder = useCallback((namespace?: string) => {\n if (!namespace) return currentPropertiesOrderRef.current[\"\"];\n return currentPropertiesOrderRef.current[namespace] ?? getIn(values, namespaceToPropertiesOrderPath(namespace));\n }, [values]);\n\n const updatePropertiesOrder = useCallback((newPropertiesOrder: string[], namespace?: string) => {\n const propertiesOrderPath = namespaceToPropertiesOrderPath(namespace);\n\n setFieldValue(propertiesOrderPath, newPropertiesOrder, false);\n currentPropertiesOrderRef.current[namespace ?? \"\"] = newPropertiesOrder;\n\n }, [setFieldValue]);\n\n const deleteProperty = useCallback((propertyKey?: string, namespace?: string) => {\n const fullId = propertyKey ? getFullId(propertyKey, namespace) : undefined;\n if (!fullId)\n throw Error(\"collection editor miss config\");\n\n setFieldValue(idToPropertiesPath(fullId), undefined, false);\n\n const currentPropertiesOrder = getCurrentPropertiesOrder(namespace);\n const newPropertiesOrder = currentPropertiesOrder.filter((p) => p !== propertyKey);\n updatePropertiesOrder(newPropertiesOrder, namespace);\n\n setNewPropertyDialogOpen(false);\n\n setSelectedPropertyIndex(undefined);\n setSelectedPropertyKey(undefined);\n setSelectedPropertyNamespace(undefined);\n }, [getCurrentPropertiesOrder, setFieldValue, updatePropertiesOrder]);\n\n const onPropertyMove = (propertiesOrder: string[], namespace?: string) => {\n setFieldValue(namespaceToPropertiesOrderPath(namespace), propertiesOrder, false);\n };\n\n const onPropertyCreated = ({\n id,\n property\n }: {\n id?: string,\n property: Property\n }) => {\n if (!id) {\n throw Error(\"Need to include an ID when creating a new property\")\n }\n setFieldValue(\"properties\", {\n ...(values.properties ?? {}),\n [id]: property\n }, false);\n const newPropertiesOrder = [...(values.propertiesOrder ?? Object.keys(values.properties)), id];\n\n updatePropertiesOrder(newPropertiesOrder);\n\n setNewPropertyDialogOpen(false);\n if (largeLayout) {\n setSelectedPropertyIndex(newPropertiesOrder.indexOf(id));\n setSelectedPropertyKey(id);\n }\n setSelectedPropertyNamespace(undefined);\n };\n\n const onPropertyChanged = ({\n id,\n property,\n previousId,\n namespace\n }: OnPropertyChangedParams) => {\n\n const fullId = id ? getFullId(id, namespace) : undefined;\n const propertyPath = fullId ? idToPropertiesPath(fullId) : undefined;\n\n // If the id has changed we need to a little cleanup\n if (previousId && previousId !== id) {\n console.debug(\"onPropertyChanged, id change\", {\n id,\n property,\n previousId,\n namespace\n })\n\n const previousFullId = getFullId(previousId, namespace);\n const previousPropertyPath = idToPropertiesPath(previousFullId);\n\n const currentPropertiesOrder = getCurrentPropertiesOrder(namespace);\n\n // replace previousId with id in propertiesOrder\n const newPropertiesOrder = currentPropertiesOrder\n .map((p) => p === previousId ? id : p)\n .filter((p) => p !== undefined) as string[];\n\n updatePropertiesOrder(newPropertiesOrder, namespace);\n\n if (id) {\n setSelectedPropertyIndex(newPropertiesOrder.indexOf(id));\n setSelectedPropertyKey(id);\n }\n setFieldValue(previousPropertyPath, undefined, false);\n setFieldTouched(previousPropertyPath, false, false);\n }\n\n console.debug(\"onPropertyChanged\", {\n id,\n property,\n previousId,\n namespace,\n propertyPath\n })\n\n if (propertyPath) {\n setFieldValue(propertyPath, property, false);\n setFieldTouched(propertyPath, true, false);\n }\n\n };\n\n const onPropertyErrorInternal = useCallback((id: string, namespace?: string, error?: Record<string, any>) => {\n const propertyPath = id ? getFullId(id, namespace) : undefined;\n console.debug(\"onPropertyErrorInternal\", {\n id,\n namespace,\n error,\n propertyPath\n });\n if (propertyPath) {\n const hasError = error && Object.keys(error).length > 0;\n onPropertyError(id, namespace, hasError ? error : undefined);\n setFieldError(idToPropertiesPath(propertyPath), hasError ? \"Property error\" : undefined);\n }\n }, [])\n\n const closePropertyDialog = () => {\n setSelectedPropertyIndex(undefined);\n setSelectedPropertyKey(undefined);\n };\n\n const initialErrors = selectedPropertyKey && propertyErrorsRef?.current?.properties ? propertyErrorsRef.current.properties[selectedPropertyKey] : undefined;\n\n const emptyCollection = values?.propertiesOrder === undefined || values.propertiesOrder.length === 0;\n\n const usedPropertiesOrder = (values.propertiesOrder\n ? values.propertiesOrder\n : Object.keys(values.properties)) as string[];\n\n const owner = useMemo(() => values.ownerId ? getUser(values.ownerId) : null, [getUser, values.ownerId]);\n\n const onPropertyClick = useCallback((propertyKey: string, namespace?: string) => {\n console.debug(\"CollectionEditor: onPropertyClick\", {\n propertyKey,\n namespace\n });\n setSelectedPropertyIndex(usedPropertiesOrder.indexOf(propertyKey));\n setSelectedPropertyKey(propertyKey);\n setSelectedPropertyNamespace(namespace);\n }, [usedPropertiesOrder]);\n\n const body = (\n <div className={\"grid grid-cols-12 gap-2 h-full bg-gray-50 dark:bg-gray-900\"}>\n <div className={cn(\n \"p-4 md:p-8 pb-20 md:pb-20\",\n \"col-span-12 lg:col-span-5 h-full overflow-auto\",\n !asDialog && \"border-r \" + defaultBorderMixin\n )}>\n\n <div className=\"flex my-2\">\n\n <div className=\"flex-grow mb-4\">\n\n <Field\n name={\"name\"}\n as={DebouncedTextField}\n invisible={true}\n className=\"-ml-1\"\n inputClassName=\"text-2xl font-headers\"\n placeholder={\"Collection name\"}\n size={\"small\"}\n required\n error={Boolean(errors?.name)}/>\n\n {owner &&\n <Typography variant={\"body2\"}\n className={\"ml-2\"}\n color={\"secondary\"}>\n Created by {owner.displayName}\n </Typography>}\n </div>\n\n {extraIcon && <div className=\"ml-4\">\n {extraIcon}\n </div>}\n\n <div className=\"ml-1 mt-2 flex flex-row gap-2\">\n <Tooltip title={\"Get the code for this collection\"}>\n <IconButton\n variant={\"filled\"}\n disabled={inferringProperties}\n onClick={() => setCodeDialogOpen(true)}>\n <CodeIcon/>\n </IconButton>\n </Tooltip>\n {inferPropertiesFromData && <Tooltip title={\"Add new properties based on data\"}>\n <IconButton\n variant={\"filled\"}\n disabled={inferringProperties}\n onClick={inferPropertiesFromData}>\n {inferringProperties ? <CircularProgress size={\"small\"}/> : <AutoAwesomeIcon/>}\n </IconButton>\n </Tooltip>}\n <Tooltip title={\"Add new property\"}>\n <Button\n variant={\"outlined\"}\n onClick={() => setNewPropertyDialogOpen(true)}>\n <AddIcon/>\n </Button>\n </Tooltip>\n </div>\n </div>\n\n <ErrorBoundary>\n <PropertyTree\n className={\"pl-8\"}\n inferredPropertyKeys={inferredPropertyKeys}\n selectedPropertyKey={selectedPropertyKey ? getFullId(selectedPropertyKey, selectedPropertyNamespace) : undefined}\n properties={values.properties}\n additionalFields={values.additionalFields}\n propertiesOrder={usedPropertiesOrder}\n onPropertyClick={onPropertyClick}\n onPropertyMove={onPropertyMove}\n onPropertyRemove={isNewCollection ? deleteProperty : undefined}\n collectionEditable={collectionEditable}\n errors={errors}/>\n </ErrorBoundary>\n\n <Button className={\"mt-8 w-full\"}\n color=\"primary\"\n variant={\"outlined\"}\n size={\"large\"}\n onClick={() => setNewPropertyDialogOpen(true)}\n startIcon={<AddIcon/>}>\n Add new property\n </Button>\n </div>\n\n {!asDialog &&\n <div className={\"col-span-12 lg:col-span-7 p-4 md:py-8 md:px-4 h-full overflow-auto pb-20 md:pb-20\"}>\n <Paper\n className=\"sticky top-8 p-4 min-h-full border border-transparent w-full flex flex-col justify-center \">\n\n {selectedPropertyFullId &&\n selectedProperty &&\n !isPropertyBuilder(selectedProperty) &&\n <PropertyForm\n inArray={false}\n key={`edit_view_${selectedPropertyIndex}`}\n existingProperty={!isNewCollection}\n autoUpdateId={false}\n allowDataInference={!isNewCollection}\n autoOpenTypeSelect={false}\n propertyKey={selectedPropertyKey}\n propertyNamespace={selectedPropertyNamespace}\n property={selectedProperty}\n onPropertyChanged={onPropertyChanged}\n onDelete={deleteProperty}\n onError={onPropertyErrorInternal}\n forceShowErrors={showErrors}\n initialErrors={initialErrors}\n getData={getData}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n />}\n\n {!selectedProperty &&\n <div className={\"w-full flex flex-col items-center justify-center h-full gap-4\"}>\n <Typography variant={\"label\"} className=\"\">\n {emptyCollection\n ? \"Now you can add your first property\"\n : \"Select a property to edit it\"}\n </Typography>\n <Button variant={\"outlined\"}\n onClick={() => setNewPropertyDialogOpen(true)}\n >\n <AddIcon/>\n Add new property\n </Button>\n </div>}\n\n {selectedProperty && isPropertyBuilder(selectedProperty) &&\n <Typography variant={\"label\"} className=\"flex items-center justify-center\">\n {\"This property is defined as a property builder in code\"}\n </Typography>}\n </Paper>\n </div>}\n\n {asDialog && <PropertyFormDialog\n inArray={false}\n open={selectedPropertyIndex !== undefined}\n key={`edit_view_${selectedPropertyIndex}`}\n autoUpdateId={!selectedProperty}\n allowDataInference={!isNewCollection}\n existingProperty={true}\n autoOpenTypeSelect={false}\n propertyKey={selectedPropertyKey}\n propertyNamespace={selectedPropertyNamespace}\n property={selectedProperty}\n onPropertyChanged={onPropertyChanged}\n onDelete={deleteProperty}\n onError={onPropertyErrorInternal}\n forceShowErrors={showErrors}\n initialErrors={initialErrors}\n getData={getData}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n onOkClicked={asDialog\n ? closePropertyDialog\n : undefined\n }/>}\n\n </div>);\n\n return (<>\n\n {body}\n\n {/* This is the dialog used for new properties*/}\n <PropertyFormDialog\n inArray={false}\n existingProperty={false}\n autoOpenTypeSelect={true}\n autoUpdateId={true}\n forceShowErrors={showErrors}\n open={newPropertyDialogOpen}\n onCancel={() => setNewPropertyDialogOpen(false)}\n onPropertyChanged={onPropertyCreated}\n getData={getData}\n allowDataInference={!isNewCollection}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n existingPropertyKeys={values.propertiesOrder as string[]}/>\n\n <GetCodeDialog\n collection={values}\n open={codeDialogOpen}\n onOpenChange={setCodeDialogOpen}/>\n\n </>\n );\n}\n","import React from \"react\";\nimport { Button, Dialog, DialogActions, DialogContent, Typography } from \"@firecms/ui\";\n\nexport interface UnsavedChangesDialogProps {\n open: boolean;\n body?: React.ReactNode;\n title?: string;\n handleOk: () => void;\n handleCancel: () => void;\n}\n\nexport function UnsavedChangesDialog({\n open,\n handleOk,\n handleCancel,\n body,\n title\n }: UnsavedChangesDialogProps) {\n\n return (\n <Dialog\n open={open}\n onOpenChange={(open) => open ? handleCancel() : handleOk()}\n aria-labelledby=\"alert-dialog-title\"\n aria-describedby=\"alert-dialog-description\"\n >\n <DialogContent>\n <Typography variant={\"h6\"}>\n {title ?? \"Unsaved changes\"}\n </Typography>\n\n {body && <Typography>\n {body}\n </Typography>}\n <Typography>\n Are you sure?\n </Typography>\n\n </DialogContent>\n\n <DialogActions>\n <Button variant=\"text\" onClick={handleCancel} autoFocus> Cancel </Button>\n <Button onClick={handleOk}> Ok </Button>\n </DialogActions>\n </Dialog>\n );\n}\n","import { useCustomizationController } from \"@firecms/core\";\nimport { Button, Dialog, DialogActions, DialogContent, Typography } from \"@firecms/ui\";\nimport React from \"react\";\n\nexport function EntityCustomViewsSelectDialog({ open, onClose }: { open: boolean, onClose: (selectedViewKey?: string) => void }) {\n const {\n entityViews,\n } = useCustomizationController();\n\n return <Dialog\n maxWidth={\"md\"}\n open={open}>\n <DialogContent className={\"flex flex-col gap-4\"}>\n <Typography variant={\"h6\"}>\n Select view\n </Typography>\n {entityViews?.map((view) => {\n return <Button\n key={view.key}\n onClick={() => onClose(view.key)}\n fullWidth\n variant={\"text\"}\n >\n {view.name} ({view.key})\n </Button>;\n })}\n {(entityViews ?? []).length === 0 &&\n <Typography variant={\"body2\"}>\n No custom views defined\n </Typography>\n }\n </DialogContent>\n <DialogActions>\n <Button variant={\"outlined\"} onClick={() => onClose()}>Cancel</Button>\n </DialogActions>\n </Dialog>\n}\n","import React from \"react\";\nimport {\n DeleteConfirmationDialog,\n EntityCollection,\n EntityCustomView,\n resolveEntityView,\n useCustomizationController,\n User\n} from \"@firecms/core\";\nimport {\n AddIcon,\n Alert,\n Button,\n Container,\n DeleteIcon,\n IconButton,\n Paper,\n Table,\n TableBody,\n TableCell,\n TableRow,\n Tooltip,\n Typography,\n} from \"@firecms/ui\";\nimport { CollectionEditorDialog } from \"./CollectionEditorDialog\";\nimport { CollectionsConfigController } from \"../../types/config_controller\";\nimport { PersistedCollection } from \"../../types/persisted_collection\";\nimport { CollectionInference } from \"../../types/collection_inference\";\nimport { EntityCustomViewsSelectDialog } from \"./EntityCustomViewsSelectDialog\";\nimport { useFormex } from \"@firecms/formex\";\n\nexport function SubcollectionsEditTab({\n collection,\n parentCollection,\n configController,\n collectionInference,\n getUser,\n parentCollectionIds\n }: {\n collection: PersistedCollection,\n parentCollection?: EntityCollection,\n configController: CollectionsConfigController;\n collectionInference?: CollectionInference;\n getUser: (uid: string) => User | null;\n parentCollectionIds?: string[];\n}) {\n\n const { entityViews: contextEntityViews } = useCustomizationController();\n\n const [subcollectionToDelete, setSubcollectionToDelete] = React.useState<string | undefined>();\n const [addEntityViewDialogOpen, setAddEntityViewDialogOpen] = React.useState<boolean>(false);\n const [viewToDelete, setViewToDelete] = React.useState<string | undefined>();\n\n const [currentDialog, setCurrentDialog] = React.useState<{\n isNewCollection: boolean,\n editedCollectionId?: string,\n }>();\n\n const {\n values,\n setFieldValue,\n } = useFormex<EntityCollection>();\n\n const subcollections = collection.subcollections ?? [];\n const resolvedEntityViews = values.entityViews?.filter(e => typeof e === \"string\")\n .map(e => resolveEntityView(e, contextEntityViews))\n .filter(Boolean) as EntityCustomView[] ?? [];\n const hardCodedEntityViews = collection.entityViews?.filter(e => typeof e !== \"string\") as EntityCustomView[] ?? [];\n const totalEntityViews = resolvedEntityViews.length + hardCodedEntityViews.length;\n\n return (\n <div className={\"overflow-auto my-auto\"}>\n <Container maxWidth={\"2xl\"} className={\"flex flex-col gap-4 p-8 m-auto\"}>\n <div className={\"flex flex-col gap-16\"}>\n\n <div className={\"flex-grow flex flex-col gap-4 items-start\"}>\n <Typography variant={\"h5\"}>\n Subcollections of {values.name}\n </Typography>\n\n <Paper className={\"flex flex-col gap-4 p-2 w-full\"}>\n {subcollections && subcollections.length > 0 && <Table>\n <TableBody>\n {subcollections.map((subcollection) => (\n <TableRow key={subcollection.path}\n onClick={() => setCurrentDialog({\n isNewCollection: false,\n editedCollectionId: subcollection.id\n })}>\n <TableCell\n align=\"left\">\n <Typography variant={\"subtitle2\"} className={\"flex-grow\"}>\n {subcollection.name}\n </Typography>\n </TableCell>\n <TableCell\n align=\"right\">\n <Tooltip title={\"Remove\"}>\n <IconButton size=\"small\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setSubcollectionToDelete(subcollection.id);\n }}\n color=\"inherit\">\n <DeleteIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>}\n\n <Button\n onClick={() => {\n setCurrentDialog({\n isNewCollection: true\n });\n }}\n variant={\"text\"}\n startIcon={<AddIcon/>}>\n Add subcollection\n </Button>\n\n </Paper>\n\n </div>\n\n <div className={\"flex-grow flex flex-col gap-4 items-start\"}>\n <Typography variant={\"h5\"}>\n Custom views\n </Typography>\n\n {totalEntityViews === 0 &&\n <Alert action={<Button variant=\"text\"\n size={\"small\"}\n href={\"https://firecms.co/docs/customization_quickstart\"}\n component={\"a\"}\n rel=\"noopener noreferrer\"\n target=\"_blank\">More info</Button>}>\n Define your own custom views by uploading them with the CLI.\n </Alert>\n }\n\n {<>\n <Paper className={\"flex flex-col gap-4 p-2 w-full\"}>\n <Table>\n <TableBody>\n {resolvedEntityViews.map((view) => (\n <TableRow key={view.key}>\n <TableCell\n align=\"left\">\n <Typography variant={\"subtitle2\"} className={\"flex-grow\"}>\n {view.name}\n </Typography>\n </TableCell>\n <TableCell\n align=\"right\">\n <Tooltip title={\"Remove\"}>\n <IconButton size=\"small\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setViewToDelete(view.key);\n }}\n color=\"inherit\">\n <DeleteIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>\n </TableCell>\n </TableRow>\n ))}\n {hardCodedEntityViews.map((view) => (\n <TableRow key={view.key}>\n <TableCell\n align=\"left\">\n <Typography variant={\"subtitle2\"} className={\"flex-grow\"}>\n {view.name}\n </Typography>\n <Typography variant={\"caption\"} className={\"flex-grow\"}>\n This view is defined in code with\n key <code>{view.key}</code>\n </Typography>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n\n <Button\n onClick={() => {\n setAddEntityViewDialogOpen(true);\n }}\n variant={\"text\"}\n startIcon={<AddIcon/>}>\n Add custom entity view\n </Button>\n </Paper>\n\n </>}\n\n\n </div>\n\n </div>\n </Container>\n\n <div style={{ height: \"52px\" }}/>\n\n {subcollectionToDelete &&\n <DeleteConfirmationDialog open={Boolean(subcollectionToDelete)}\n onAccept={() => {\n const props = {\n id: subcollectionToDelete,\n parentCollectionIds: [...(parentCollectionIds ?? []), collection.id]\n };\n console.debug(\"Deleting subcollection\", props)\n configController.deleteCollection(props);\n setSubcollectionToDelete(undefined);\n }}\n onCancel={() => setSubcollectionToDelete(undefined)}\n title={<>Delete this subcollection?</>}\n body={<> This will <b>not\n delete any data</b>, only\n the collection in the CMS</>}/>}\n {viewToDelete &&\n <DeleteConfirmationDialog open={Boolean(viewToDelete)}\n onAccept={() => {\n setFieldValue(\"entityViews\", values.entityViews?.filter(e => e !== viewToDelete));\n setViewToDelete(undefined);\n }}\n onCancel={() => setViewToDelete(undefined)}\n title={<>Remove this view?</>}\n body={<>This will <b>not\n delete any data</b>, only\n the view in the CMS</>}/>}\n\n <CollectionEditorDialog\n open={Boolean(currentDialog)}\n configController={configController}\n parentCollection={collection}\n collectionInference={collectionInference}\n parentCollectionIds={[...parentCollectionIds ?? [], values.id]}\n isNewCollection={false}\n {...currentDialog}\n getUser={getUser}\n handleClose={() => {\n setCurrentDialog(undefined);\n }}/>\n\n <EntityCustomViewsSelectDialog\n open={addEntityViewDialogOpen}\n onClose={(selectedViewKey) => {\n if (selectedViewKey) {\n setFieldValue(\"entityViews\", [...(values.entityViews ?? []), selectedViewKey]);\n }\n setAddEntityViewDialogOpen(false);\n }}/>\n </div>\n );\n}\n","import { EntityCollection, makePropertiesEditable } from \"@firecms/core\";\n\nexport const productsCollectionTemplate: EntityCollection = {\n id: \"products\",\n path: \"products\",\n name: \"Products\",\n singularName: \"Product\",\n icon: \"shopping_cart\",\n description: \"List of the products currently sold in your shop\",\n properties: makePropertiesEditable({\n name: {\n dataType: \"string\",\n name: \"Name\",\n description: \"Name of this product\",\n validation: {\n required: true\n }\n },\n brand: {\n dataType: \"string\",\n name: \"Brand\",\n validation: {\n required: true\n }\n },\n description: {\n dataType: \"string\",\n name: \"Description\",\n description: \"Description of this product, supports markdown\",\n markdown: true\n },\n main_image: {\n dataType: \"string\",\n name: \"Image\",\n storage: {\n storagePath: \"images\",\n acceptedFiles: [\"image/*\"],\n },\n description: \"Upload field for images\"\n },\n available: {\n dataType: \"boolean\",\n name: \"Available\",\n columnWidth: 100,\n description: \"Is this product available in the website\"\n },\n price: {\n dataType: \"number\",\n name: \"Price\",\n validation: {\n requiredMessage: \"You must set a positive price\",\n min: 0\n }\n },\n images: {\n dataType: \"array\",\n name: \"Images\",\n hideFromCollection: true,\n of: {\n dataType: \"string\",\n storage: {\n storagePath: \"images\",\n acceptedFiles: [\"image/*\"]\n }\n }\n },\n related_products: {\n dataType: \"array\",\n name: \"Related products\",\n description: \"Products related to this one\",\n of: {\n dataType: \"reference\",\n path: \"products\"\n }\n },\n metadata: {\n name: \"Metadata\",\n description: \"This is an example of a map property\",\n dataType: \"map\",\n keyValue: true\n },\n added_on: {\n dataType: \"date\",\n name: \"Added on\",\n autoValue: \"on_create\"\n }\n })\n};\n","import { EntityCollection, makePropertiesEditable } from \"@firecms/core\";\n\nexport const blogCollectionTemplate:EntityCollection = {\n id: \"blog\",\n path: \"blog\",\n name: \"Blog\",\n singularName: \"Blog entry\",\n icon: \"article\",\n description: \"A collection of blog entries\",\n defaultSize: \"l\",\n properties: makePropertiesEditable({\n name: {\n name: \"Name\",\n validation: { required: true },\n dataType: \"string\"\n },\n header_image: {\n name: \"Header image\",\n dataType: \"string\",\n storage: {\n storagePath: \"images\",\n acceptedFiles: [\"image/*\"],\n metadata: {\n cacheControl: \"max-age=1000000\"\n }\n }\n },\n content: {\n name: \"Content\",\n description: \"Content blocks for the blog entry\",\n validation: { required: true },\n dataType: \"array\",\n oneOf: {\n typeField: \"type\",\n valueField: \"value\",\n properties: {\n text: {\n dataType: \"string\",\n name: \"Text\",\n markdown: true\n },\n quote: {\n dataType: \"string\",\n name: \"Quote\",\n multiline: true\n },\n images: {\n name: \"Images\",\n dataType: \"array\",\n of: {\n dataType: \"string\",\n storage: {\n storagePath: \"images\",\n acceptedFiles: [\"image/*\"],\n metadata: {\n cacheControl: \"max-age=1000000\"\n }\n }\n },\n description: \"This fields allows uploading multiple images at once and reordering\"\n },\n products: {\n name: \"Products\",\n dataType: \"array\",\n of: {\n dataType: \"reference\",\n path: \"products\",\n previewProperties: [\"name\", \"main_image\"]\n }\n }\n },\n propertiesOrder: [\"text\", \"quote\", \"images\", \"products\"]\n }\n },\n created_on: {\n name: \"Created on\",\n dataType: \"date\",\n autoValue: \"on_create\"\n },\n status: {\n name: \"Status\",\n validation: { required: true },\n dataType: \"string\",\n enumValues: {\n published: {\n id: \"published\",\n label: \"Published\",\n },\n draft: \"Draft\"\n },\n defaultValue: \"draft\"\n },\n publish_date: {\n name: \"Publish date\",\n dataType: \"date\",\n clearable: true\n },\n reviewed: {\n name: \"Reviewed\",\n dataType: \"boolean\"\n },\n tags: {\n name: \"Tags\",\n description: \"Example of generic array\",\n dataType: \"array\",\n of: {\n dataType: \"string\",\n previewAsTag: true\n }\n }\n }),\n initialFilter: {\n status: [\"==\", \"published\"]\n }\n};\n","import { EntityCollection, makePropertiesEditable } from \"@firecms/core\";\n\nexport const usersCollectionTemplate: EntityCollection = {\n id: \"users\",\n path: \"users\",\n name: \"Users\",\n singularName: \"User\",\n description: \"Registered users in the app/web\",\n icon: \"person\",\n properties: makePropertiesEditable({\n displayName: {\n name: \"Display name\",\n dataType: \"string\"\n },\n email: {\n name: \"Email\",\n dataType: \"string\",\n email: true\n },\n emailVerified: {\n name: \"Email verified\",\n dataType: \"boolean\"\n },\n phone: {\n name: \"Phone\",\n dataType: \"string\"\n },\n favourite_products: {\n name: \"Favourite products\",\n dataType: \"array\",\n of: {\n dataType: \"reference\",\n path: \"products\"\n }\n },\n photoURL: {\n name: \"Photo URL\",\n dataType: \"string\",\n url: \"image\"\n }\n }),\n};\n","import { EntityCollection } from \"@firecms/core\";\n\nexport const pagesCollectionTemplate: EntityCollection = {\n id: \"pages\",\n path: \"pages\",\n name: \"Pages\",\n singularName: \"Page\",\n icon: \"insert_drive_file\",\n description: \"List of website pages that can be edited here\",\n properties: {\n title: {\n dataType: \"string\",\n name: \"Page Title\",\n validation: { required: true }\n },\n slug: {\n dataType: \"string\",\n name: \"URL Slug\",\n validation: {\n required: true,\n unique: true,\n matches: /^[a-z0-9]+(?:-[a-z0-9]+)*$/,\n matchesMessage: \"Must be lowercase, alphanumeric, and hyphenated\"\n }\n },\n hero_section: {\n dataType: \"map\",\n name: \"Hero Section\",\n properties: {\n headline: {\n dataType: \"string\",\n name: \"Headline\",\n validation: { required: true }\n },\n subhead: {\n dataType: \"string\",\n name: \"Subheadline\"\n },\n background_image: {\n dataType: \"string\",\n name: \"Background Image\",\n storage: {\n storagePath: \"page_hero/images\",\n acceptedFiles: [\"image/*\"],\n }\n },\n call_to_action: {\n dataType: \"string\",\n name: \"Call to Action\"\n },\n call_to_action_link: {\n dataType: \"string\",\n name: \"CTA Link\",\n url: true\n }\n }\n },\n content: {\n dataType: \"array\",\n name: \"Content\",\n oneOf: {\n properties: {\n section: {\n dataType: \"map\",\n name: \"Section\",\n properties: {\n title: {\n dataType: \"string\",\n name: \"Section Title\",\n validation: { required: true }\n },\n content: {\n dataType: \"string\",\n name: \"Section Content\",\n markdown: true\n },\n image: {\n dataType: \"string\",\n name: \"Section Image\",\n storage: {\n storagePath: \"page_sections/images\",\n acceptedFiles: [\"image/*\"]\n }\n },\n link: {\n dataType: \"string\",\n name: \"Section Link\",\n url: true\n }\n }\n },\n image: {\n dataType: \"string\",\n name: \"Image\",\n storage: {\n storagePath: \"page_sections/images\",\n acceptedFiles: [\"image/*\"]\n }\n },\n slider: {\n dataType: \"array\",\n name: \"Slider\",\n of: {\n dataType: \"map\",\n properties: {\n title: {\n dataType: \"string\",\n name: \"Title\",\n validation: { required: true }\n },\n image: {\n dataType: \"string\",\n storage: {\n storagePath: \"page_sections/images\",\n acceptedFiles: [\"image/*\"]\n }\n }\n }\n }\n },\n }\n }\n },\n sidebar: {\n dataType: \"map\",\n name: \"Sidebar\",\n properties: {\n title: {\n dataType: \"string\",\n name: \"Sidebar Title\",\n validation: { required: false }\n },\n content: {\n dataType: \"string\",\n name: \"Sidebar Content\",\n markdown: true\n }\n }\n },\n seo_metadata: {\n dataType: \"map\",\n name: \"SEO Metadata\",\n properties: {\n meta_title: {\n dataType: \"string\",\n name: \"Meta Title\"\n },\n meta_description: {\n dataType: \"string\",\n name: \"Meta Description\"\n },\n focus_keywords: {\n dataType: \"array\",\n name: \"Focus Keywords\",\n of: {\n dataType: \"string\"\n }\n }\n }\n },\n footer_override: {\n dataType: \"string\",\n name: \"Footer Override\",\n markdown: true\n },\n publish_date: {\n dataType: \"date\",\n name: \"Publish Date\",\n validation: { required: true }\n },\n last_updated: {\n dataType: \"date\",\n name: \"Last Updated\",\n autoValue: \"on_update\"\n },\n is_published: {\n dataType: \"boolean\",\n name: \"Is Published\",\n columnWidth: 100,\n description: \"Should this page be live on the site?\"\n },\n author_uid: {\n dataType: \"reference\",\n name: \"Author\",\n path: \"users\"\n }\n }\n};\n","import React, { useEffect, useState } from \"react\";\nimport { EntityCollection, unslugify, } from \"@firecms/core\";\nimport { Button, Card, Chip, CircularProgress, cn, Container, Icon, Tooltip, Typography, } from \"@firecms/ui\";\n\nimport { productsCollectionTemplate } from \"./templates/products_template\";\nimport { blogCollectionTemplate } from \"./templates/blog_template\";\nimport { usersCollectionTemplate } from \"./templates/users_template\";\nimport { ImportFileUpload } from \"@firecms/data_import_export\";\nimport { pagesCollectionTemplate } from \"./templates/pages_template\";\nimport { useFormex } from \"@firecms/formex\";\n\nexport function CollectionEditorWelcomeView({\n path,\n pathSuggestions,\n parentCollection,\n onContinue,\n existingCollectionPaths\n }: {\n path: string;\n pathSuggestions?: (path: string) => Promise<string[]>;\n parentCollection?: EntityCollection;\n onContinue: (importData?: object[]) => void;\n existingCollectionPaths?: string[];\n}) {\n\n const [loadingPathSuggestions, setLoadingPathSuggestions] = useState(false);\n const [filteredPathSuggestions, setFilteredPathSuggestions] = useState<string[] | undefined>();\n useEffect(() => {\n if (pathSuggestions && existingCollectionPaths) {\n setLoadingPathSuggestions(true);\n pathSuggestions(path)\n .then(suggestions => {\n const filteredSuggestions = suggestions.filter(s => !(existingCollectionPaths ?? []).find(c => c.trim().toLowerCase() === s.trim().toLowerCase()));\n setFilteredPathSuggestions(filteredSuggestions);\n })\n .finally(() => setLoadingPathSuggestions(false));\n }\n }, [existingCollectionPaths, path, pathSuggestions]);\n\n // const {\n // values,\n // setFieldValue,\n // setValues,\n // handleChange,\n // touched,\n // errors,\n // setFieldTouched,\n // isSubmitting,\n // submitCount\n // } = useFormex<EntityCollection>();\n\n const {\n values,\n setFieldValue,\n setValues,\n submitCount\n } = useFormex<EntityCollection>();\n\n return (\n <div className={\"overflow-auto my-auto\"}>\n <Container maxWidth={\"4xl\"} className={\"flex flex-col gap-4 p-8 m-auto\"}>\n\n <div\n className=\"flex flex-row py-2 pt-3 items-center\">\n <Typography variant={\"h4\"} className={\"flex-grow\"}>\n New collection\n </Typography>\n </div>\n\n {parentCollection && <Chip colorScheme={\"tealDarker\"}>\n <Typography variant={\"caption\"}>\n This is a subcollection of <b>{parentCollection.name}</b>\n </Typography>\n </Chip>}\n\n <div className={\"my-2\"}>\n <Typography variant={\"caption\"}\n color={\"secondary\"}>\n ● Use one of the existing paths in your database:\n </Typography>\n <div className={\"flex flex-wrap gap-x-2 gap-y-1 items-center my-2 min-h-7\"}>\n\n {loadingPathSuggestions && !filteredPathSuggestions && <CircularProgress size={\"small\"}/>}\n\n {filteredPathSuggestions?.map((suggestion, index) => (\n <Chip key={suggestion}\n colorScheme={\"cyanLighter\"}\n onClick={() => {\n setFieldValue(\"name\", unslugify(suggestion));\n setFieldValue(\"id\", suggestion);\n setFieldValue(\"path\", suggestion);\n setFieldValue(\"properties\", undefined);\n onContinue();\n }}\n size=\"small\">\n {suggestion}\n </Chip>\n ))}\n\n {!loadingPathSuggestions && (filteredPathSuggestions ?? [])?.length === 0 &&\n <Typography variant={\"caption\"}>\n No suggestions\n </Typography>\n }\n\n </div>\n\n </div>\n\n <div className={\"my-2\"}>\n <Typography variant={\"caption\"}\n color={\"secondary\"}>\n ● Select a template:\n </Typography>\n\n <div className={\"flex gap-4\"}>\n <TemplateButton title={\"Products\"}\n subtitle={\"A collection of products with images, prices and stock\"}\n icon={<Icon size={\"small\"} iconKey={productsCollectionTemplate.icon!}/>}\n onClick={() => {\n setValues(productsCollectionTemplate);\n onContinue();\n }}/>\n <TemplateButton title={\"Users\"}\n subtitle={\"A collection of users with emails, names and roles\"}\n icon={<Icon size={\"small\"} iconKey={usersCollectionTemplate.icon!}/>}\n onClick={() => {\n setValues(usersCollectionTemplate);\n onContinue();\n }}/>\n <TemplateButton title={\"Blog posts\"}\n subtitle={\"A collection of blog posts with images, authors and complex content\"}\n icon={<Icon size={\"small\"} iconKey={blogCollectionTemplate.icon!}/>}\n onClick={() => {\n setValues(blogCollectionTemplate);\n onContinue();\n }}/>\n <TemplateButton title={\"Pages\"}\n subtitle={\"A collection of pages with images, authors and complex content\"}\n icon={<Icon size={\"small\"} iconKey={pagesCollectionTemplate.icon!}/>}\n onClick={() => {\n setValues(pagesCollectionTemplate);\n onContinue();\n }}/>\n </div>\n\n </div>\n\n {!parentCollection && <div>\n\n <Typography variant={\"caption\"}\n color={\"secondary\"}\n className={\"mb-2\"}>\n ● Create a collection from a file (csv, json, xls, xslx...)\n </Typography>\n\n <ImportFileUpload onDataAdded={(data) => onContinue(data)}/>\n\n </div>}\n\n <div>\n\n <Button variant={\"text\"} onClick={() => onContinue()} className={\"my-2\"}>\n Continue from scratch\n </Button>\n </div>\n\n {/*<div style={{ height: \"52px\" }}/>*/}\n\n </Container>\n </div>\n );\n}\n\nexport function TemplateButton({\n title,\n subtitle,\n icon,\n onClick\n }: {\n title: string,\n icon: React.ReactNode,\n subtitle: string,\n onClick?: () => void\n}) {\n\n return (\n <Tooltip title={subtitle}>\n <Card\n onClick={onClick}\n className={cn(\n \"my-2 rounded-md border mx-0 p-6 px-4 focus:outline-none transition ease-in-out duration-150 flex flex-row gap-4 items-center\",\n \"text-gray-700 dark:text-slate-300\",\n \"hover:border-primary-dark hover:text-primary-dark dark:hover:text-primary focus:ring-primary hover:ring-1 hover:ring-primary\",\n \"border-gray-400 dark:border-gray-600 \"\n )}\n >\n {icon}\n <div className={\"flex flex-col items-start\"}>\n\n <Typography variant={\"subtitle1\"}>\n {title}\n </Typography>\n {/*<Typography>*/}\n {/* {subtitle}*/}\n {/*</Typography>*/}\n\n </div>\n </Card>\n </Tooltip>\n );\n\n}\n","import {\n DataNewPropertiesMapping,\n getInferenceType,\n ImportConfig,\n ImportNewPropertyFieldPreview\n} from \"@firecms/data_import_export\";\nimport { getIn, useFormex } from \"@firecms/formex\";\n\nimport { PropertyConfigBadge, getFieldConfig, getFieldId, Properties, Property, PropertyConfig, } from \"@firecms/core\";\nimport { Container, Select, Tooltip, Typography } from \"@firecms/ui\";\nimport React, { useState } from \"react\";\nimport { OnPropertyChangedParams, PropertyFormDialog, PropertyWithId } from \"../PropertyEditView\";\nimport { getFullId, idToPropertiesPath, namespaceToPropertiesOrderPath } from \"../util\";\nimport { PersistedCollection } from \"../../../types/persisted_collection\";\nimport { updatePropertyFromWidget } from \"../utils/update_property_for_widget\";\nimport { PropertySelectItem } from \"../PropertySelectItem\";\nimport { supportedFields } from \"../utils/supported_fields\";\nimport { buildPropertyFromData } from \"@firecms/schema_inference\";\n\nexport function CollectionEditorImportMapping({\n importConfig,\n propertyConfigs,\n collectionEditable\n }:\n {\n importConfig: ImportConfig,\n propertyConfigs: Record<string, PropertyConfig>,\n collectionEditable: boolean\n }) {\n\n // const {\n // values,\n // setFieldValue,\n // setFieldTouched,\n // setValues,\n // submitCount\n // } = useFormex();\n\n const {\n setFieldValue,\n setFieldTouched,\n values\n } = useFormex<PersistedCollection>();\n const [selectedProperty, setSelectedProperty] = useState<PropertyWithId | undefined>(undefined);\n\n const currentPropertiesOrderRef = React.useRef<{\n [key: string]: string[]\n }>(values.propertiesOrder ? { \"\": values.propertiesOrder } : {});\n\n const propertyKey = selectedProperty ? selectedProperty.id : undefined;\n const property = selectedProperty || undefined;\n\n const onPropertyChanged = ({\n id,\n property,\n previousId,\n namespace\n }: OnPropertyChangedParams) => {\n\n const fullId = id ? getFullId(id, namespace) : undefined;\n const propertyPath = fullId ? idToPropertiesPath(fullId) : undefined;\n\n // setSelectedProperty(property);\n const getCurrentPropertiesOrder = (namespace?: string) => {\n if (!namespace) return currentPropertiesOrderRef.current[\"\"];\n return currentPropertiesOrderRef.current[namespace] ?? getIn(values, namespaceToPropertiesOrderPath(namespace));\n }\n\n const updatePropertiesOrder = (newPropertiesOrder: string[], namespace?: string) => {\n const propertiesOrderPath = namespaceToPropertiesOrderPath(namespace);\n\n setFieldValue(propertiesOrderPath, newPropertiesOrder, false);\n currentPropertiesOrderRef.current[namespace ?? \"\"] = newPropertiesOrder;\n\n };\n\n // If the id has changed we need to a little cleanup\n if (previousId && previousId !== id) {\n const previousFullId = getFullId(previousId, namespace);\n const previousPropertyPath = idToPropertiesPath(previousFullId);\n\n const currentPropertiesOrder = getCurrentPropertiesOrder(namespace);\n\n // replace previousId with id in propertiesOrder\n const newPropertiesOrder = currentPropertiesOrder\n .map((p) => p === previousId ? id : p)\n .filter((p) => p !== undefined) as string[];\n updatePropertiesOrder(newPropertiesOrder, namespace);\n\n // replace previousId with id in headersMapping\n const newHeadersMapping = { ...importConfig.headersMapping };\n Object.keys(newHeadersMapping).forEach((key) => {\n if (newHeadersMapping[key] === previousId) {\n newHeadersMapping[key] = id ?? \"\";\n }\n });\n importConfig.setHeadersMapping(newHeadersMapping);\n\n // if (id) {\n // setSelectedPropertyIndex(newPropertiesOrder.indexOf(id));\n // setSelectedPropertyKey(id);\n // }\n setFieldValue(previousPropertyPath, undefined, false);\n setFieldTouched(previousPropertyPath, false, false);\n }\n\n if (propertyPath) {\n setFieldValue(propertyPath, property, false);\n setFieldTouched(propertyPath, true, false);\n }\n };\n const onPropertyTypeChanged = async ({\n id,\n importKey,\n property,\n namespace\n }: OnPropertyChangedParams & {\n importKey: string\n }) => {\n\n const fullId = id ? getFullId(id, namespace) : undefined;\n const propertyPath = fullId ? idToPropertiesPath(fullId) : undefined;\n\n // we try to infer the rest of the properties of a property, from the type and the data\n const propertyData = importConfig.importData.map((d) => getIn(d, importKey));\n const inferredNewProperty = {\n ...buildPropertyFromData(propertyData, property, getInferenceType),\n editable: true\n };\n\n if (propertyPath) {\n if (inferredNewProperty) {\n setFieldValue(propertyPath, inferredNewProperty, false);\n } else {\n setFieldValue(propertyPath, property, false);\n }\n setFieldTouched(propertyPath, true, false);\n }\n };\n\n return (\n\n <div className={\"overflow-auto my-auto\"}>\n <Container maxWidth={\"6xl\"} className={\"flex flex-col gap-4 p-8 m-auto\"}>\n\n <Typography variant=\"h6\" className={\"mt-4\"}>Data property mapping</Typography>\n\n <DataNewPropertiesMapping headersMapping={importConfig.headersMapping}\n idColumn={importConfig.idColumn}\n originProperties={importConfig.originProperties}\n destinationProperties={values.properties as Properties}\n onIdPropertyChanged={(value) => importConfig.setIdColumn(value ?? undefined)}\n buildPropertyView={({\n property,\n propertyKey,\n importKey\n }) => {\n return <ImportNewPropertyFieldPreview\n property={property}\n propertyKey={propertyKey}\n onPropertyNameChanged={(propertyKey: string, value: string) => setFieldValue(`properties.${propertyKey}.name`, value, false)}\n onEditClick={() => {\n if (!propertyKey || !property) return;\n setSelectedProperty({\n ...property,\n id: propertyKey,\n editable: true\n });\n }}\n propertyTypeView={<PropertySelect property={property}\n disabled={false}\n onPropertyChanged={(props) => onPropertyTypeChanged({\n ...props,\n importKey\n })}\n propertyKey={propertyKey}\n propertyConfigs={propertyConfigs}/>}\n />;\n }}/>\n </Container>\n\n <PropertyFormDialog\n open={selectedProperty !== undefined}\n propertyKey={propertyKey}\n property={property}\n inArray={false}\n autoUpdateId={false}\n onPropertyChanged={onPropertyChanged}\n allowDataInference={false}\n collectionEditable={collectionEditable}\n onOkClicked={() => {\n setSelectedProperty(undefined);\n }}\n onCancel={() => {\n setSelectedProperty(undefined);\n }}\n autoOpenTypeSelect={false}\n existingProperty={false}\n propertyConfigs={propertyConfigs}/>\n\n <div style={{ height: \"52px\" }}/>\n </div>\n );\n\n}\n\nfunction PropertySelect({\n property,\n onPropertyChanged,\n propertyKey,\n propertyConfigs,\n disabled\n }: {\n property: Property | null,\n propertyKey: string | null,\n onPropertyChanged: ({\n id,\n property,\n previousId,\n namespace\n }: OnPropertyChangedParams) => void,\n propertyConfigs: Record<string, PropertyConfig>,\n disabled?: boolean\n}) {\n\n const fieldId = property ? getFieldId(property) : null;\n const widget = property ? getFieldConfig(property, propertyConfigs) : null;\n\n const [selectOpen, setSelectOpen] = useState(false);\n\n return <Tooltip title={property && widget ? `${widget?.name} - ${property.dataType}` : undefined}\n open={selectOpen ? false : undefined}>\n <Select\n open={selectOpen}\n onOpenChange={setSelectOpen}\n invisible={true}\n className={\"w-full\"}\n disabled={disabled}\n error={!widget}\n value={fieldId ?? \"\"}\n placeholder={\"Select a property widget\"}\n position={\"item-aligned\"}\n renderValue={(value) => {\n if (!widget) return null;\n return <PropertyConfigBadge propertyConfig={widget}/>\n }}\n onValueChange={(newSelectedWidgetId) => {\n const newProperty = updatePropertyFromWidget(property, newSelectedWidgetId, propertyConfigs)\n if (!propertyKey) return;\n onPropertyChanged({\n id: propertyKey,\n property: newProperty,\n previousId: propertyKey,\n namespace: undefined\n });\n }}>\n {Object.entries(supportedFields).map(([key, widget]) => {\n return <PropertySelectItem\n key={key}\n value={key}\n optionDisabled={false}\n propertyConfig={widget}\n existing={false}/>;\n })\n }\n </Select>\n </Tooltip>;\n}\n","import { convertDataToEntity, getPropertiesMapping, ImportConfig } from \"@firecms/data_import_export\";\nimport { EntityCollectionTable, Properties, useSelectionController } from \"@firecms/core\";\nimport { useEffect } from \"react\";\nimport { Typography } from \"@firecms/ui\";\n\nexport function CollectionEditorImportDataPreview({ importConfig, properties, propertiesOrder }: {\n importConfig: ImportConfig,\n properties: Properties,\n propertiesOrder: string[]\n}) {\n\n useEffect(() => {\n const propertiesMapping = getPropertiesMapping(importConfig.originProperties, properties);\n const mappedData = importConfig.importData.map(d => convertDataToEntity(d, importConfig.idColumn, importConfig.headersMapping, properties, propertiesMapping, \"TEMP_PATH\"));\n importConfig.setEntities(mappedData);\n }, []);\n\n const selectionController = useSelectionController();\n\n return <EntityCollectionTable\n title={<div>\n <Typography variant={\"subtitle2\"}>Imported data preview</Typography>\n <Typography variant={\"caption\"}>Entities with the same id will be overwritten</Typography>\n </div>}\n tableController={{\n data: importConfig.entities,\n dataLoading: false,\n noMoreToLoad: false\n }}\n endAdornment={<div className={\"h-12\"}/>}\n filterable={false}\n sortable={false}\n selectionController={selectionController}\n displayedColumnIds={propertiesOrder.map(p => ({ key: p, disabled: false }))}\n properties={properties}/>\n\n}\n","import { Properties, slugify } from \"@firecms/core\";\nimport { ImportConfig } from \"@firecms/data_import_export\";\n\nexport function cleanPropertiesFromImport(properties: Properties, parentSlug = \"\"): {\n headersMapping: ImportConfig[\"headersMapping\"],\n properties: Properties,\n idColumn?: ImportConfig[\"idColumn\"],\n} {\n\n const result = Object.keys(properties).reduce((acc, key) => {\n const property = properties[key];\n const slug = slugify(key);\n const fullSlug = parentSlug ? `${parentSlug}.${slug}` : slug;\n\n if (property.dataType === \"map\" && property.properties) {\n const slugifiedResult = cleanPropertiesFromImport(property.properties as Properties, fullSlug);\n return {\n headersMapping: { ...acc.headersMapping, [key]: fullSlug },\n properties: {\n ...acc.properties,\n [slug]: {\n ...property,\n properties: slugifiedResult.properties,\n propertiesOrder: Object.keys(slugifiedResult.properties)\n }\n }\n }\n }\n\n const updatedProperties = {\n ...acc.properties,\n [slug]: property\n } as Properties;\n\n const headersMapping = { ...acc.headersMapping, [key]: fullSlug } as Record<string, string>;\n\n return {\n headersMapping,\n properties: updatedProperties,\n }\n }, { headersMapping: {}, properties: {} });\n\n const firstKey = Object.keys(result.headersMapping)?.[0];\n let idColumn: string | undefined;\n if (firstKey?.includes(\"id\") || firstKey?.includes(\"key\")) {\n idColumn = firstKey;\n }\n\n return {\n ...result,\n idColumn\n };\n}\n","import * as React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n CircularProgressCenter,\n EntityCollection,\n ErrorView,\n isPropertyBuilder,\n MapProperty,\n mergeDeep,\n Properties,\n PropertiesOrBuilders,\n Property,\n PropertyConfig,\n PropertyOrBuilder,\n randomString,\n removeInitialAndTrailingSlashes,\n removeUndefined,\n TopNavigationResult,\n useAuthController,\n useCustomizationController,\n useNavigationController,\n User,\n useSnackbarController\n} from \"@firecms/core\";\nimport {\n ArrowBackIcon,\n Button,\n cn,\n coolIconKeys,\n defaultBorderMixin,\n Dialog,\n DialogActions,\n DialogContent,\n DoneIcon,\n IconButton,\n LoadingButton,\n Tab,\n Tabs\n} from \"@firecms/ui\";\nimport { YupSchema } from \"./CollectionYupValidation\";\nimport { CollectionDetailsForm } from \"./CollectionDetailsForm\";\nimport { CollectionPropertiesEditorForm } from \"./CollectionPropertiesEditorForm\";\nimport { UnsavedChangesDialog } from \"./UnsavedChangesDialog\";\nimport { SubcollectionsEditTab } from \"./SubcollectionsEditTab\";\nimport { CollectionsConfigController } from \"../../types/config_controller\";\nimport { CollectionEditorWelcomeView } from \"./CollectionEditorWelcomeView\";\nimport { CollectionInference } from \"../../types/collection_inference\";\nimport { getInferenceType, ImportSaveInProgress, useImportConfig } from \"@firecms/data_import_export\";\nimport { buildEntityPropertiesFromData } from \"@firecms/schema_inference\";\nimport { CollectionEditorImportMapping } from \"./import/CollectionEditorImportMapping\";\nimport { CollectionEditorImportDataPreview } from \"./import/CollectionEditorImportDataPreview\";\nimport { cleanPropertiesFromImport } from \"./import/clean_import_data\";\nimport { PersistedCollection } from \"../../types/persisted_collection\";\nimport { Formex, FormexController, useCreateFormex } from \"@firecms/formex\";\nimport { getFullIdPath } from \"./util\";\n\nexport interface CollectionEditorDialogProps {\n open: boolean;\n isNewCollection: boolean;\n initialValues?: {\n group?: string,\n path?: string,\n name?: string,\n }\n editedCollectionId?: string;\n fullPath?: string; // full path of this particular collection, like `products/123/locales`\n parentCollectionIds?: string[]; // path ids of the parent collection, like [`products`]\n handleClose: (collection?: EntityCollection) => void;\n configController: CollectionsConfigController;\n reservedGroups?: string[];\n collectionInference?: CollectionInference;\n extraView?: {\n View: React.ComponentType<{\n path: string\n }>,\n icon: React.ReactNode\n };\n pathSuggestions?: (path?: string) => Promise<string[]>;\n getUser: (uid: string) => User | null;\n getData?: (path: string, parentPaths: string[]) => Promise<object[]>;\n parentCollection?: PersistedCollection;\n}\n\nexport function CollectionEditorDialog(props: CollectionEditorDialogProps) {\n\n const open = props.open;\n\n const [formDirty, setFormDirty] = React.useState<boolean>(false);\n const [unsavedChangesDialogOpen, setUnsavedChangesDialogOpen] = React.useState<boolean>(false);\n\n const handleCancel = useCallback(() => {\n if (!formDirty) {\n props.handleClose(undefined);\n } else {\n setUnsavedChangesDialogOpen(true);\n }\n }, [formDirty, props.handleClose]);\n\n useEffect(() => {\n if (!open) {\n setFormDirty(false);\n setUnsavedChangesDialogOpen(false);\n }\n }, [open]);\n\n return (\n <Dialog\n open={open}\n fullWidth={true}\n fullHeight={true}\n scrollable={false}\n maxWidth={\"7xl\"}\n onOpenChange={(open) => !open ? handleCancel() : undefined}\n >\n {open && <CollectionEditor {...props}\n handleCancel={handleCancel}\n setFormDirty={setFormDirty}/>}\n\n <UnsavedChangesDialog\n open={unsavedChangesDialogOpen}\n handleOk={() => props.handleClose(undefined)}\n handleCancel={() => setUnsavedChangesDialogOpen(false)}\n body={\"There are unsaved changes in this collection\"}/>\n\n </Dialog>\n );\n}\n\ntype EditorView = \"welcome\"\n | \"details\"\n | \"import_data_mapping\"\n | \"import_data_preview\"\n | \"import_data_saving\"\n | \"properties\"\n | \"loading\"\n | \"extra_view\"\n | \"subcollections\";\n\nexport function CollectionEditor(props: CollectionEditorDialogProps & {\n handleCancel: () => void,\n setFormDirty: (dirty: boolean) => void\n}) {\n const { propertyConfigs } = useCustomizationController();\n const navigation = useNavigationController();\n const authController = useAuthController();\n\n const {\n topLevelNavigation,\n collections\n } = navigation;\n\n const initialValuesProp = props.initialValues;\n const includeTemplates = !initialValuesProp?.path && (props.parentCollectionIds ?? []).length === 0;\n const collectionsInThisLevel = (props.parentCollection ? props.parentCollection.subcollections : collections) ?? [];\n const existingPaths = collectionsInThisLevel.map(col => col.path.trim().toLowerCase());\n const existingIds = collectionsInThisLevel.map(col => col.id?.trim().toLowerCase()).filter(Boolean) as string[];\n const [collection, setCollection] = React.useState<PersistedCollection<any> | undefined>();\n const [initialLoadingCompleted, setInitialLoadingCompleted] = React.useState(false);\n\n useEffect(() => {\n try {\n if (navigation.initialised) {\n if (props.editedCollectionId) {\n setCollection(navigation.getCollectionFromPaths([...(props.parentCollectionIds ?? []), props.editedCollectionId]));\n } else {\n setCollection(undefined);\n }\n setInitialLoadingCompleted(true);\n }\n } catch (e) {\n console.error(e);\n }\n }, [navigation.getCollectionFromPaths, props.editedCollectionId, props.parentCollectionIds, navigation.initialised]);\n if (!topLevelNavigation) {\n throw Error(\"Internal: Navigation not ready in collection editor\");\n }\n\n const {\n groups\n }: TopNavigationResult = topLevelNavigation;\n\n const initialCollection = collection\n ? {\n ...collection,\n id: collection.id ?? collection.path ?? randomString(16)\n }\n : undefined;\n\n const initialValues: PersistedCollection<any> = initialCollection\n ? applyPropertyConfigs(initialCollection, propertyConfigs)\n : {\n id: initialValuesProp?.path ?? randomString(16),\n path: initialValuesProp?.path ?? \"\",\n name: initialValuesProp?.name ?? \"\",\n group: initialValuesProp?.group ?? \"\",\n properties: {} as PropertiesOrBuilders,\n propertiesOrder: [],\n icon: coolIconKeys[Math.floor(Math.random() * coolIconKeys.length)],\n ownerId: authController.user?.uid ?? \"\"\n };\n\n if (!initialLoadingCompleted) {\n return <CircularProgressCenter/>;\n }\n\n if (!props.isNewCollection && (!navigation.initialised || !initialLoadingCompleted)) {\n return <CircularProgressCenter/>;\n }\n\n return <CollectionEditorInternal\n {...props}\n initialValues={initialValues}\n existingPaths={existingPaths}\n existingIds={existingIds}\n includeTemplates={includeTemplates}\n collection={collection}\n setCollection={setCollection}\n groups={groups}\n propertyConfigs={propertyConfigs}/>\n\n}\n\nfunction CollectionEditorInternal<M extends Record<string, any>>({\n isNewCollection,\n configController,\n editedCollectionId,\n parentCollectionIds,\n fullPath,\n collectionInference,\n handleClose,\n reservedGroups,\n extraView,\n handleCancel,\n setFormDirty,\n pathSuggestions,\n getUser,\n parentCollection,\n getData,\n existingPaths,\n existingIds,\n includeTemplates,\n collection,\n setCollection,\n initialValues,\n propertyConfigs,\n groups\n }: CollectionEditorDialogProps & {\n handleCancel: () => void,\n setFormDirty: (dirty: boolean) => void,\n initialValues: PersistedCollection<M>,\n existingPaths: string[],\n existingIds: string[],\n includeTemplates: boolean,\n collection: PersistedCollection<M> | undefined,\n setCollection: (collection: PersistedCollection<M>) => void,\n propertyConfigs: Record<string, PropertyConfig<any>>,\n groups: string[],\n }\n) {\n\n const importConfig = useImportConfig();\n const navigation = useNavigationController();\n const snackbarController = useSnackbarController();\n\n // Use this ref to store which properties have errors\n const propertyErrorsRef = useRef({});\n\n const initialView = isNewCollection ? (includeTemplates ? \"welcome\" : \"details\") : \"properties\";\n const [currentView, setCurrentView] = useState<EditorView>(initialView); // this view can edit either the details view or the properties one\n\n const [error, setError] = React.useState<Error | undefined>();\n\n const saveCollection = (updatedCollection: PersistedCollection<M>): Promise<boolean> => {\n const id = updatedCollection.id || updatedCollection.path;\n return configController.saveCollection({\n id,\n collectionData: updatedCollection,\n previousId: editedCollectionId,\n parentCollectionIds\n })\n .then(() => {\n setError(undefined);\n return true;\n })\n .catch((e) => {\n setError(e);\n console.error(e);\n snackbarController.open({\n type: \"error\",\n message: \"Error persisting collection: \" + (e.message ?? \"Details in the console\")\n });\n return false;\n });\n };\n\n const setNextMode = useCallback(() => {\n if (currentView === \"details\") {\n if (importConfig.inUse) {\n setCurrentView(\"import_data_saving\");\n } else if (extraView) {\n setCurrentView(\"extra_view\");\n } else {\n setCurrentView(\"properties\");\n }\n } else if (currentView === \"welcome\") {\n setCurrentView(\"details\");\n } else if (currentView === \"import_data_mapping\") {\n setCurrentView(\"import_data_preview\");\n } else if (currentView === \"import_data_preview\") {\n setCurrentView(\"details\");\n } else if (currentView === \"extra_view\") {\n setCurrentView(\"properties\");\n } else {\n setCurrentView(\"details\");\n }\n\n }, [currentView, importConfig.inUse, extraView]);\n\n const doCollectionInference = useCallback((collection: PersistedCollection<any>) => {\n if (!collectionInference) return undefined;\n return collectionInference?.(collection.path, collection.collectionGroup ?? false, parentCollectionIds ?? []);\n }, [collectionInference, parentCollectionIds]);\n\n const inferCollectionFromData = useCallback(async (newCollection: PersistedCollection<M>) => {\n\n try {\n if (!doCollectionInference) {\n setCollection(newCollection);\n return Promise.resolve(newCollection);\n }\n\n setCurrentView(\"loading\");\n\n const inferredCollection = await doCollectionInference?.(newCollection);\n\n if (!inferredCollection) {\n setCollection(newCollection);\n return Promise.resolve(newCollection);\n }\n const values = {\n ...(newCollection ?? {})\n };\n\n if (Object.keys(inferredCollection.properties ?? {}).length > 0) {\n values.properties = inferredCollection.properties as PropertiesOrBuilders<M>;\n values.propertiesOrder = inferredCollection.propertiesOrder as Extract<keyof M, string>[];\n }\n\n if (!values.propertiesOrder) {\n values.propertiesOrder = Object.keys(values.properties) as Extract<keyof M, string>[];\n return values;\n }\n\n setCollection(values);\n console.debug(\"Inferred collection\", {\n newCollection: newCollection ?? {},\n values\n });\n return values;\n } catch (e: any) {\n console.error(e);\n snackbarController.open({\n type: \"error\",\n message: \"Error inferring collection: \" + (e.message ?? \"Details in the console\")\n });\n return newCollection;\n }\n }, [parentCollectionIds, doCollectionInference]);\n\n const onSubmit = (newCollectionState: PersistedCollection<M>, formexController: FormexController<PersistedCollection<M>>) => {\n console.log(\"Submitting collection\", newCollectionState);\n try {\n\n if (!isNewCollection) {\n saveCollection(newCollectionState).then(() => {\n formexController.resetForm({ values: initialValues });\n handleClose(newCollectionState);\n });\n return;\n }\n\n if (currentView === \"welcome\") {\n setNextMode();\n formexController.resetForm({ values: newCollectionState });\n } else if (currentView === \"details\") {\n if (extraView || importConfig.inUse) {\n formexController.resetForm({ values: newCollectionState });\n setNextMode();\n } else if (isNewCollection) {\n inferCollectionFromData(newCollectionState)\n .then((values) => {\n formexController.resetForm({\n values: values ?? newCollectionState,\n touched: {\n path: true,\n name: true\n }\n });\n }).finally(() => {\n setNextMode();\n });\n } else {\n formexController.resetForm({ values: newCollectionState });\n setNextMode();\n }\n } else if (currentView === \"extra_view\") {\n setNextMode();\n formexController.resetForm({ values: newCollectionState });\n } else if (currentView === \"import_data_mapping\") {\n setNextMode();\n } else if (currentView === \"import_data_preview\") {\n setNextMode();\n } else if (currentView === \"properties\") {\n saveCollection(newCollectionState).then(() => {\n formexController.resetForm({ values: initialValues });\n setNextMode();\n handleClose(newCollectionState);\n });\n } else {\n setNextMode();\n formexController.resetForm({ values: newCollectionState });\n }\n } catch (e: any) {\n snackbarController.open({\n type: \"error\",\n message: \"Error persisting collection: \" + (e.message ?? \"Details in the console\")\n });\n console.error(e);\n formexController.resetForm({ values: newCollectionState });\n }\n };\n\n const validation = (col: PersistedCollection) => {\n\n let errors: Record<string, any> = {};\n const schema = (currentView === \"properties\" || currentView === \"subcollections\" || currentView === \"details\") && YupSchema;\n if (schema) {\n try {\n schema.validateSync(col, { abortEarly: false });\n } catch (e: any) {\n e.inner.forEach((err: any) => {\n errors[err.path] = err.message;\n });\n }\n }\n if (currentView === \"properties\") {\n errors = { ...errors, ...propertyErrorsRef.current };\n }\n if (currentView === \"details\") {\n const pathError = validatePath(col.path, isNewCollection, existingPaths, col.id);\n if (pathError) {\n errors.path = pathError;\n }\n const idError = validateId(col.id, isNewCollection, existingPaths, existingIds);\n if (idError) {\n errors.id = idError;\n }\n }\n return errors;\n };\n\n const formController = useCreateFormex<PersistedCollection<M>>({\n initialValues,\n onSubmit,\n validation\n });\n\n const {\n values,\n setFieldValue,\n isSubmitting,\n dirty,\n submitCount\n } = formController;\n\n // TODO: getting data is only working in root collections with this code\n const path = values.path;\n const updatedFullPath = fullPath?.includes(\"/\") ? fullPath?.split(\"/\").slice(0, -1).join(\"/\") + \"/\" + path : path; // TODO: this path is wrong\n const pathError = validatePath(path, isNewCollection, existingPaths, values.id);\n\n const parentPaths = !pathError && parentCollectionIds ? navigation.convertIdsToPaths(parentCollectionIds) : undefined;\n const resolvedPath = !pathError ? navigation.resolveAliasesFrom(updatedFullPath) : undefined;\n const getDataWithPath = resolvedPath && getData ? () => getData(resolvedPath, parentPaths ?? []) : undefined;\n\n useEffect(() => {\n setFormDirty(dirty);\n }, [dirty]);\n\n function onImportDataSet(data: object[]) {\n importConfig.setInUse(true);\n buildEntityPropertiesFromData(data, getInferenceType)\n .then((properties) => {\n const res = cleanPropertiesFromImport(properties);\n\n setFieldValue(\"properties\", res.properties);\n setFieldValue(\"propertiesOrder\", Object.keys(res.properties));\n\n importConfig.setIdColumn(res.idColumn);\n importConfig.setImportData(data);\n importConfig.setHeadersMapping(res.headersMapping);\n importConfig.setOriginProperties(res.properties);\n });\n }\n\n const validValues = Boolean(values.name) && Boolean(values.id);\n\n const onImportMappingComplete = () => {\n const updatedProperties = { ...values.properties };\n if (importConfig.idColumn)\n delete updatedProperties[importConfig.idColumn];\n setFieldValue(\"properties\", updatedProperties);\n // setFieldValue(\"propertiesOrder\", Object.values(importConfig.headersMapping));\n setNextMode();\n };\n\n const editable = collection?.editable === undefined || collection?.editable === true;\n const collectionEditable = editable || isNewCollection;\n\n return <DialogContent fullHeight={true}>\n <Formex value={formController}>\n\n <>\n {!isNewCollection && <Tabs value={currentView}\n className={cn(defaultBorderMixin, \"justify-end bg-gray-50 dark:bg-gray-950 border-b\")}\n onValueChange={(v) => setCurrentView(v as EditorView)}>\n <Tab value={\"details\"}>\n Details\n </Tab>\n <Tab value={\"properties\"}>\n Properties\n </Tab>\n <Tab value={\"subcollections\"}>\n Additional views\n </Tab>\n </Tabs>}\n\n <form noValidate\n onSubmit={formController.handleSubmit}\n className={cn(\n isNewCollection ? \"h-full\" : \"h-[calc(100%-48px)]\",\n \"flex-grow flex flex-col relative\")}>\n\n {currentView === \"loading\" &&\n <CircularProgressCenter/>}\n\n {currentView === \"extra_view\" &&\n path &&\n extraView?.View &&\n <extraView.View path={path}/>}\n\n {currentView === \"welcome\" &&\n <CollectionEditorWelcomeView\n path={path}\n onContinue={(importData) => {\n if (importData) {\n onImportDataSet(importData);\n setCurrentView(\"import_data_mapping\");\n } else {\n setCurrentView(\"details\");\n }\n }}\n existingCollectionPaths={existingPaths}\n parentCollection={parentCollection}\n pathSuggestions={pathSuggestions}/>}\n\n {currentView === \"import_data_mapping\" && importConfig &&\n <CollectionEditorImportMapping importConfig={importConfig}\n collectionEditable={collectionEditable}\n propertyConfigs={propertyConfigs}/>}\n\n {currentView === \"import_data_preview\" && importConfig &&\n <CollectionEditorImportDataPreview importConfig={importConfig}\n properties={values.properties as Properties}\n propertiesOrder={values.propertiesOrder as string[]}/>}\n\n {currentView === \"import_data_saving\" && importConfig &&\n <ImportSaveInProgress importConfig={importConfig}\n collection={values}\n path={path}\n onImportSuccess={async (importedCollection) => {\n snackbarController.open({\n type: \"info\",\n message: \"Data imported successfully\"\n });\n await saveCollection(values);\n handleClose(importedCollection);\n }}\n />}\n\n {currentView === \"details\" &&\n <CollectionDetailsForm\n existingPaths={existingPaths}\n existingIds={existingIds}\n groups={groups}\n parentCollectionIds={parentCollectionIds}\n parentCollection={parentCollection}\n isNewCollection={isNewCollection}/>}\n\n {currentView === \"subcollections\" && collection &&\n <SubcollectionsEditTab\n parentCollection={parentCollection}\n configController={configController}\n getUser={getUser}\n collectionInference={collectionInference}\n parentCollectionIds={parentCollectionIds}\n collection={collection}/>}\n\n {currentView === \"properties\" &&\n <CollectionPropertiesEditorForm\n showErrors={submitCount > 0}\n isNewCollection={isNewCollection}\n reservedGroups={reservedGroups}\n onPropertyError={(propertyKey, namespace, error) => {\n const current = removeUndefined({\n ...propertyErrorsRef.current,\n [getFullIdPath(propertyKey, namespace)]: removeUndefined(error, true)\n }, true);\n propertyErrorsRef.current = current;\n formController.validate();\n }}\n getUser={getUser}\n getData={getDataWithPath}\n doCollectionInference={doCollectionInference}\n propertyConfigs={propertyConfigs}\n collectionEditable={collectionEditable}\n extraIcon={extraView?.icon &&\n <IconButton\n color={\"primary\"}\n onClick={() => setCurrentView(\"extra_view\")}>\n {extraView.icon}\n </IconButton>}/>\n }\n\n {currentView !== \"welcome\" && <DialogActions\n position={\"absolute\"}>\n {error && <ErrorView error={error}/>}\n\n {isNewCollection && includeTemplates && currentView === \"import_data_mapping\" &&\n <Button variant={\"text\"}\n type=\"button\"\n onClick={() => {\n importConfig.setInUse(false);\n return setCurrentView(\"welcome\");\n }}>\n <ArrowBackIcon/>\n Back\n </Button>}\n\n {isNewCollection && includeTemplates && currentView === \"import_data_preview\" &&\n <Button variant={\"text\"}\n type=\"button\"\n onClick={() => {\n setCurrentView(\"import_data_mapping\");\n }}>\n <ArrowBackIcon/>\n Back\n </Button>}\n\n {isNewCollection && includeTemplates && currentView === \"details\" &&\n <Button variant={\"text\"}\n type=\"button\"\n onClick={() => setCurrentView(\"welcome\")}>\n <ArrowBackIcon/>\n Back\n </Button>}\n\n {isNewCollection && currentView === \"properties\" && <Button variant={\"text\"}\n type=\"button\"\n onClick={() => setCurrentView(\"details\")}>\n <ArrowBackIcon/>\n Back\n </Button>}\n\n <Button variant={\"text\"}\n onClick={() => {\n handleCancel();\n }}>\n Cancel\n </Button>\n\n {isNewCollection && currentView === \"import_data_mapping\" &&\n <Button\n variant={\"filled\"}\n color=\"primary\"\n onClick={onImportMappingComplete}\n >\n Next\n </Button>}\n\n {isNewCollection && currentView === \"import_data_preview\" &&\n <Button\n variant={\"filled\"}\n color=\"primary\"\n onClick={() => {\n setNextMode();\n }}\n >\n Next\n </Button>}\n\n {isNewCollection && (currentView === \"details\" || currentView === \"properties\") &&\n <LoadingButton\n variant={\"filled\"}\n color=\"primary\"\n type=\"submit\"\n loading={isSubmitting}\n disabled={isSubmitting || (currentView === \"details\" && !validValues)}\n startIcon={currentView === \"properties\"\n ? <DoneIcon/>\n : undefined}\n >\n {currentView === \"details\" && \"Next\"}\n {currentView === \"properties\" && \"Create collection\"}\n </LoadingButton>}\n\n {!isNewCollection && <LoadingButton\n variant=\"filled\"\n color=\"primary\"\n type=\"submit\"\n loading={isSubmitting}\n >\n Update collection\n </LoadingButton>}\n\n </DialogActions>}\n </form>\n </>\n\n </Formex>\n\n </DialogContent>\n\n}\n\nfunction applyPropertyConfigs<M extends Record<string, any> = any>(collection: PersistedCollection<M>, propertyConfigs: Record<string, PropertyConfig<any>>): PersistedCollection<M> {\n const { properties, ...rest } = collection;\n const propertiesResult: PropertiesOrBuilders<any> = {};\n if (properties) {\n Object.keys(properties).forEach((key) => {\n propertiesResult[key] = applyPropertiesConfig(properties[key] as PropertyOrBuilder, propertyConfigs);\n });\n }\n\n return { ...rest, properties: propertiesResult };\n}\n\nfunction applyPropertiesConfig(property: PropertyOrBuilder, propertyConfigs: Record<string, PropertyConfig<any>>) {\n let internalProperty = property;\n if (propertyConfigs && typeof internalProperty === \"object\" && internalProperty.propertyConfig) {\n const propertyConfig = propertyConfigs[internalProperty.propertyConfig];\n if (propertyConfig && isPropertyBuilder(propertyConfig.property)) {\n internalProperty = propertyConfig.property;\n } else {\n\n if (propertyConfig) {\n internalProperty = mergeDeep(propertyConfig.property, internalProperty);\n }\n\n if (!isPropertyBuilder(internalProperty) && internalProperty.dataType === \"map\" && internalProperty.properties) {\n const properties: Record<string, PropertyOrBuilder> = {};\n Object.keys(internalProperty.properties).forEach((key) => {\n properties[key] = applyPropertiesConfig(((internalProperty as MapProperty).properties as Properties)[key] as Property, propertyConfigs);\n });\n internalProperty = { ...internalProperty, properties };\n }\n\n }\n }\n return internalProperty;\n\n}\n\nconst validatePath = (value: string, isNewCollection: boolean, existingPaths: string[], idValue?: string) => {\n let error;\n if (!value) {\n error = \"You must specify a path in the database for this collection\";\n }\n // if (isNewCollection && existingIds?.includes(value.trim().toLowerCase()))\n // error = \"There is already a collection which uses this path as an id\";\n if (isNewCollection && existingPaths?.includes(value.trim().toLowerCase()) && !idValue)\n error = \"There is already a collection with the specified path. If you want to have multiple collections referring to the same database path, make sure the have different ids\";\n\n const subpaths = removeInitialAndTrailingSlashes(value).split(\"/\");\n if (subpaths.length % 2 === 0) {\n error = `Collection paths must have an odd number of segments: ${value}`;\n }\n return error;\n};\n\nconst validateId = (value: string, isNewCollection: boolean, existingPaths: string[], existingIds: string[]) => {\n if (!value) return undefined;\n let error;\n if (isNewCollection && existingPaths?.includes(value.trim().toLowerCase()))\n error = \"There is already a collection that uses this value as a path\";\n if (isNewCollection && existingIds?.includes(value.trim().toLowerCase()))\n error = \"There is already a collection which uses this id\";\n // if (error) {\n // setAdvancedPanelExpanded(true);\n // }\n return error;\n};\n","import React, { PropsWithChildren, useCallback, useEffect } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { CollectionsConfigController } from \"./types/config_controller\";\nimport {\n Property,\n useCustomizationController,\n useNavigationController,\n User,\n useSnackbarController\n} from \"@firecms/core\";\nimport { CollectionEditorDialog } from \"./ui/collection_editor/CollectionEditorDialog\";\nimport { useNavigate } from \"react-router\";\nimport { CollectionEditorController } from \"./types/collection_editor_controller\";\nimport { CollectionEditorPermissionsBuilder } from \"./types/config_permissions\";\nimport { CollectionInference } from \"./types/collection_inference\";\nimport { PropertyFormDialog } from \"./ui/collection_editor/PropertyEditView\";\nimport { PersistedCollection } from \"./types/persisted_collection\";\n\nexport const ConfigControllerContext = React.createContext<CollectionsConfigController>({} as any);\nexport const CollectionEditorContext = React.createContext<CollectionEditorController>({} as any);\n\nexport interface ConfigControllerProviderProps {\n /**\n * Controller for managing the collections' config.\n */\n collectionConfigController: CollectionsConfigController;\n\n /**\n * Callback used to infer the schema from the data.\n */\n collectionInference?: CollectionInference;\n\n /**\n * Use this builder to define the permissions for the configuration per user.\n */\n configPermissions?: CollectionEditorPermissionsBuilder;\n\n /**\n * Groups that cannot be used to create new collections.\n */\n reservedGroups?: string[];\n\n extraView?: {\n View: React.ComponentType<{\n path: string\n }>,\n icon: React.ReactNode\n };\n\n pathSuggestions?: (path?: string) => Promise<string[]>;\n\n getUser: (uid: string) => User | null\n\n getData?: (path: string, parentPaths: string[]) => Promise<object[]>;\n\n onAnalyticsEvent?: (event: string, params?: object) => void;\n\n}\n\nexport const ConfigControllerProvider = React.memo(\n function ConfigControllerProvider({\n children,\n collectionConfigController,\n configPermissions,\n reservedGroups,\n collectionInference,\n extraView,\n pathSuggestions,\n getUser,\n getData,\n onAnalyticsEvent\n }: PropsWithChildren<ConfigControllerProviderProps>) {\n\n const navigation = useNavigationController();\n const navigate = useNavigate();\n const snackbarController = useSnackbarController();\n const { propertyConfigs } = useCustomizationController();\n\n const {\n collections\n } = navigation;\n const existingPaths = (collections ?? []).map(col => col.path.trim().toLowerCase());\n\n const [rootPathSuggestions, setRootPathSuggestions] = React.useState<string[] | undefined>();\n useEffect(() => {\n if (pathSuggestions) {\n pathSuggestions().then((paths) => {\n setRootPathSuggestions(paths.filter(p => !existingPaths.includes(p.trim().toLowerCase())));\n });\n }\n }, [pathSuggestions]);\n\n const [currentDialog, setCurrentDialog] = React.useState<{\n isNewCollection: boolean,\n parentCollection?: PersistedCollection,\n editedCollectionId?: string,\n fullPath?: string,\n parentCollectionIds: string[],\n initialValues?: {\n path?: string,\n group?: string,\n name?: string\n },\n redirect: boolean\n }>();\n\n const [currentPropertyDialog, setCurrentPropertyDialog] = React.useState<{\n propertyKey?: string,\n property?: Property,\n namespace?: string,\n parentCollection?: PersistedCollection,\n currentPropertiesOrder?: string[],\n editedCollectionId: string,\n fullPath?: string,\n parentCollectionIds: string[],\n collectionEditable: boolean;\n }>();\n\n const defaultConfigPermissions: CollectionEditorPermissionsBuilder = useCallback(() => ({\n createCollections: true,\n editCollections: true,\n deleteCollections: true\n }), []);\n\n const editCollection = useCallback(({\n id,\n fullPath,\n parentCollectionIds,\n parentCollection\n }: {\n id?: string,\n fullPath?: string,\n parentCollectionIds: string[],\n parentCollection?: PersistedCollection\n }) => {\n console.debug(\"Edit collection\", id, fullPath, parentCollectionIds, parentCollection);\n onAnalyticsEvent?.(\"edit_collection\", { id, fullPath });\n setCurrentDialog({\n editedCollectionId: id,\n fullPath,\n parentCollectionIds,\n isNewCollection: false,\n parentCollection,\n redirect: false\n });\n }, []);\n\n const editProperty = useCallback(({\n propertyKey,\n property,\n editedCollectionId,\n currentPropertiesOrder,\n parentCollectionIds,\n collection\n }: {\n propertyKey?: string,\n property?: Property,\n currentPropertiesOrder?: string[],\n editedCollectionId: string,\n parentCollectionIds: string[],\n collection: PersistedCollection,\n }) => {\n console.debug(\"Edit property\", propertyKey, property, editedCollectionId, currentPropertiesOrder, parentCollectionIds, collection);\n onAnalyticsEvent?.(\"edit_property\", { propertyKey, editedCollectionId });\n // namespace is all the path until the last dot\n const namespace = propertyKey && propertyKey.includes(\".\")\n ? propertyKey.substring(0, propertyKey.lastIndexOf(\".\"))\n : undefined;\n const propertyKeyWithoutNamespace = propertyKey && propertyKey.includes(\".\")\n ? propertyKey.substring(propertyKey.lastIndexOf(\".\") + 1)\n : propertyKey;\n setCurrentPropertyDialog({\n propertyKey: propertyKeyWithoutNamespace,\n property,\n namespace,\n currentPropertiesOrder,\n editedCollectionId: editedCollectionId,\n parentCollectionIds,\n collectionEditable: collection?.editable ?? false\n });\n }, []);\n\n const createCollection = React.useCallback(({\n parentCollectionIds,\n parentCollection,\n initialValues,\n redirect,\n sourceClick\n }: {\n parentCollectionIds: string[],\n parentCollection?: PersistedCollection\n initialValues?: {\n group?: string,\n path?: string,\n name?: string\n },\n redirect: boolean,\n sourceClick?: string\n }) => {\n console.debug(\"Create collection\", { parentCollectionIds, parentCollection, initialValues, redirect, sourceClick });\n onAnalyticsEvent?.(\"create_collection\", { parentCollectionIds, parentCollection, initialValues, redirect, sourceClick });\n setCurrentDialog({\n isNewCollection: true,\n parentCollectionIds,\n parentCollection,\n initialValues,\n redirect\n });\n }, []);\n\n const getPathSuggestions = !pathSuggestions\n ? undefined\n : (path?: string) => {\n if (!path && rootPathSuggestions)\n return Promise.resolve(rootPathSuggestions);\n else {\n return pathSuggestions?.(path);\n }\n }\n\n return (\n <ConfigControllerContext.Provider value={collectionConfigController}>\n <CollectionEditorContext.Provider\n value={{\n editCollection,\n createCollection,\n editProperty,\n configPermissions: configPermissions ?? defaultConfigPermissions,\n rootPathSuggestions\n }}>\n\n {children}\n\n <CollectionEditorDialog\n open={Boolean(currentDialog)}\n configController={collectionConfigController}\n isNewCollection={false}\n collectionInference={collectionInference}\n {...currentDialog}\n getData={getData}\n reservedGroups={reservedGroups}\n extraView={extraView}\n pathSuggestions={getPathSuggestions}\n getUser={getUser}\n handleClose={(collection) => {\n if (currentDialog?.redirect) {\n if (collection && currentDialog?.isNewCollection && !currentDialog.parentCollectionIds.length) {\n const url = navigation.buildUrlCollectionPath(collection.id ?? collection.path);\n navigate(url);\n }\n }\n setCurrentDialog(undefined);\n }}/>\n\n {/* Used for editing properties*/}\n <PropertyFormDialog\n open={Boolean(currentPropertyDialog)}\n includeIdAndName={true}\n existingProperty={Boolean(currentPropertyDialog?.propertyKey)}\n autoUpdateId={!currentPropertyDialog ? false : !currentPropertyDialog?.propertyKey}\n autoOpenTypeSelect={!currentPropertyDialog ? false : !currentPropertyDialog?.propertyKey}\n inArray={false}\n collectionEditable={currentPropertyDialog?.collectionEditable ?? false}\n getData={getData && currentPropertyDialog?.editedCollectionId\n ? () => {\n console.debug(\"get data for property\", currentPropertyDialog?.editedCollectionId);\n const resolvedPath = navigation.resolveAliasesFrom(currentPropertyDialog.editedCollectionId!)\n return getData(resolvedPath, []);\n }\n : undefined}\n onPropertyChanged={({\n id,\n property\n }) => {\n if (!currentPropertyDialog) return;\n if (!id) return;\n const newProperty = !(currentPropertyDialog.propertyKey);\n return collectionConfigController.saveProperty({\n path: currentPropertyDialog?.editedCollectionId,\n property,\n propertyKey: id,\n newPropertiesOrder: newProperty && currentPropertyDialog.currentPropertiesOrder ? [...currentPropertyDialog.currentPropertiesOrder, id] : undefined,\n namespace: currentPropertyDialog.namespace,\n parentCollectionIds: currentPropertyDialog.parentCollectionIds\n })\n .catch((e) => {\n console.error(e);\n snackbarController.open({\n type: \"error\",\n message: \"Error persisting property: \" + (e.message ?? \"Details in the console\")\n });\n return false;\n });\n }}\n onPropertyChangedImmediate={false}\n onDelete={() => {\n if (!currentPropertyDialog?.propertyKey) return;\n const newPropertiesOrder = currentPropertyDialog?.currentPropertiesOrder?.filter(p => p !== currentPropertyDialog?.propertyKey);\n return collectionConfigController.deleteProperty({\n path: currentPropertyDialog?.editedCollectionId,\n propertyKey: currentPropertyDialog?.propertyKey,\n namespace: currentPropertyDialog?.namespace,\n newPropertiesOrder,\n parentCollectionIds: currentPropertyDialog?.parentCollectionIds\n })\n .then(() => {\n setCurrentPropertyDialog(undefined);\n }).catch((e) => {\n console.error(e);\n snackbarController.open({\n type: \"error\",\n message: \"Error deleting property: \" + (e.message ?? \"Details in the console\")\n });\n return false;\n });\n }}\n onError={() => {\n }}\n onOkClicked={() => {\n setCurrentPropertyDialog(undefined);\n }}\n onCancel={() => {\n setCurrentPropertyDialog(undefined);\n }}\n initialErrors={{}}\n forceShowErrors={false}\n existingPropertyKeys={[]}\n allowDataInference={true}\n propertyConfigs={propertyConfigs}\n property={currentPropertyDialog?.property}\n propertyKey={currentPropertyDialog?.propertyKey}/>\n\n </CollectionEditorContext.Provider>\n\n </ConfigControllerContext.Provider>\n );\n }, equal);\n","import { useContext } from \"react\";\nimport { CollectionEditorController } from \"./types/collection_editor_controller\";\nimport { CollectionEditorContext } from \"./ConfigControllerProvider\";\n\n/**\n * Hook to access the collection editor controller.\n * The methods in this controller can be used to open the collection editor dialog.\n */\nexport const useCollectionEditorController = (): CollectionEditorController => useContext(CollectionEditorContext);\n","import { useContext } from \"react\";\nimport { CollectionsConfigController } from \"./types/config_controller\";\nimport { ConfigControllerContext } from \"./ConfigControllerProvider\";\n\n/**\n * Use this hook to access the configuration controller.\n * You can use it to get the list of collections, and to save/delete collections.\n */\nexport const useCollectionsConfigController = (): CollectionsConfigController => useContext(ConfigControllerContext);\n","import equal from \"react-fast-compare\"\n\nimport {\n CollectionActionsProps,\n mergeDeep,\n useAuthController,\n useNavigationController,\n useSnackbarController\n} from \"@firecms/core\";\nimport { Button, IconButton, SaveIcon, SettingsIcon, Tooltip, UndoIcon, } from \"@firecms/ui\";\n\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { useCollectionsConfigController } from \"../useCollectionsConfigController\";\nimport { PersistedCollection } from \"../types/persisted_collection\";\n\nexport function EditorCollectionAction({\n path: fullPath,\n parentCollectionIds,\n collection,\n tableController\n }: CollectionActionsProps) {\n\n const authController = useAuthController();\n const navigationController = useNavigationController();\n const collectionEditorController = useCollectionEditorController();\n const configController = useCollectionsConfigController();\n const snackbarController = useSnackbarController();\n\n const parentCollection = navigationController.getCollectionFromIds(parentCollectionIds);\n\n const canEditCollection = collectionEditorController.configPermissions\n ? collectionEditorController.configPermissions({\n user: authController.user,\n collection\n }).editCollections\n : true;\n\n let saveDefaultFilterButton = null;\n if (!equal(getObjectOrNull(tableController.filterValues), getObjectOrNull(collection.initialFilter)) ||\n !equal(getObjectOrNull(tableController.sortBy), getObjectOrNull(collection.initialSort))) {\n saveDefaultFilterButton = <>\n {(collection.initialFilter || collection.initialSort) && <Tooltip\n title={\"Reset to default filter and sort\"}>\n <Button\n color={\"primary\"}\n size={\"small\"}\n variant={\"text\"}\n onClick={() => {\n tableController.clearFilter?.();\n if (collection?.initialFilter)\n tableController.setFilterValues?.(collection?.initialFilter);\n if (collection?.initialSort)\n tableController.setSortBy?.(collection?.initialSort);\n }}>\n <UndoIcon/>\n </Button>\n </Tooltip>}\n\n <Tooltip\n title={tableController.sortBy || tableController.filterValues ? \"Save default filter and sort\" : \"Clear default filter and sort\"}>\n <Button\n color={\"primary\"}\n size={\"small\"}\n variant={\"outlined\"}\n onClick={() => configController\n ?.saveCollection({\n id: collection.id,\n parentCollectionIds,\n collectionData: mergeDeep(collection as PersistedCollection,\n {\n initialFilter: tableController.filterValues ?? null,\n initialSort: tableController.sortBy ?? null\n })\n }).then(() => {\n snackbarController.open({\n type: \"success\",\n message: \"Default config saved\"\n });\n })}>\n <SaveIcon/>\n </Button>\n </Tooltip>\n </>;\n }\n\n const editorButton = <Tooltip\n title={canEditCollection ? \"Edit collection\" : \"You don't have permissions to edit this collection\"}>\n <IconButton\n color={\"primary\"}\n disabled={!canEditCollection}\n onClick={canEditCollection\n ? () => collectionEditorController?.editCollection({ id: collection.id, fullPath, parentCollectionIds, parentCollection: parentCollection as PersistedCollection })\n : undefined}>\n <SettingsIcon/>\n </IconButton>\n </Tooltip>;\n\n return <>\n {canEditCollection && saveDefaultFilterButton}\n {editorButton}\n </>\n\n}\n\nfunction getObjectOrNull(o?: object): object | null {\n if (o && Object.keys(o).length === 0)\n return o\n return o ?? null;\n}\n","import {\n DeleteConfirmationDialog,\n PluginHomePageActionsProps,\n useAuthController,\n useSnackbarController\n} from \"@firecms/core\";\nimport { DeleteIcon, IconButton, Menu, MenuItem, MoreVertIcon, SettingsIcon, } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { useCallback, useState } from \"react\";\nimport { useCollectionsConfigController } from \"../useCollectionsConfigController\";\n\nexport function HomePageEditorCollectionAction({\n path,\n collection\n }: PluginHomePageActionsProps) {\n\n const snackbarController = useSnackbarController();\n const authController = useAuthController();\n const configController = useCollectionsConfigController();\n const collectionEditorController = useCollectionEditorController();\n\n const permissions = collectionEditorController.configPermissions({\n user: authController.user,\n collection\n });\n\n const onEditCollectionClicked = useCallback(() => {\n collectionEditorController?.editCollection({ id: collection.id, parentCollectionIds: [] });\n }, [collectionEditorController, path]);\n\n const [deleteRequested, setDeleteRequested] = useState(false);\n\n const deleteCollection = useCallback(() => {\n configController?.deleteCollection({ id: collection.id }).then(() => {\n setDeleteRequested(false);\n snackbarController.open({\n message: \"Collection deleted\",\n type: \"success\"\n });\n });\n }, [path, configController]);\n\n return <>\n\n <div>\n {permissions.deleteCollections &&\n <Menu\n trigger={<IconButton>\n <MoreVertIcon size={\"small\"}/>\n </IconButton>}\n >\n <MenuItem onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n setDeleteRequested(true);\n }}>\n <DeleteIcon/>\n Delete\n </MenuItem>\n\n </Menu>\n\n }\n\n {permissions.editCollections &&\n <IconButton\n onClick={(event) => {\n onEditCollectionClicked();\n }}>\n <SettingsIcon size={\"small\"}/>\n </IconButton>}\n </div>\n\n <DeleteConfirmationDialog\n open={deleteRequested}\n onAccept={deleteCollection}\n onCancel={() => setDeleteRequested(false)}\n title={<>Delete this collection?</>}\n body={<> This will <b>not\n delete any data</b>, only\n the collection in the CMS</>}/>\n </>;\n\n}\n","import { PluginHomePageAdditionalCardsProps, useAuthController } from \"@firecms/core\";\nimport { AddIcon, Card, cn, Typography } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\n\nexport function NewCollectionCard({\n group,\n context\n }: PluginHomePageAdditionalCardsProps) {\n\n if (!context.navigation.topLevelNavigation)\n throw Error(\"Navigation not ready in FireCMSHomePage\");\n\n const authController = useAuthController();\n\n const collectionEditorController = useCollectionEditorController();\n const canCreateCollections = collectionEditorController.configPermissions\n ? collectionEditorController.configPermissions({\n user: authController.user,\n }).createCollections\n : true;\n\n return (\n <Card className={cn(\"h-full p-4 min-h-[124px]\")}\n onClick={collectionEditorController && canCreateCollections\n ? () => collectionEditorController.createCollection({\n initialValues: group ? { group } : undefined,\n parentCollectionIds: [],\n redirect: true,\n sourceClick: \"new_collection_card\"\n })\n : undefined}>\n\n <div\n className=\"flex flex-col items-start h-full w-full items-center justify-center h-full w-full flex-grow flex-col\">\n <AddIcon color=\"primary\" size={\"large\"}/>\n <Typography color=\"primary\"\n variant={\"caption\"}\n className={\"font-medium\"}>{\"Add new collection\".toUpperCase()}</Typography>\n\n {!canCreateCollections &&\n <Typography variant={\"caption\"}>You don&apos;t have permissions to create\n collections</Typography>\n }\n </div>\n\n </Card>\n );\n}\n","import { unslugify, useAuthController, useNavigationController } from \"@firecms/core\";\nimport { AddIcon, Chip, CircularProgress, Collapse, Typography, } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport React from \"react\";\n\nexport function RootCollectionSuggestions({ introMode }: { introMode?: \"new_project\" | \"existing_project\" }) {\n\n const authController = useAuthController();\n const navigationController = useNavigationController();\n\n const collectionEditorController = useCollectionEditorController();\n const canCreateCollections = collectionEditorController.configPermissions\n ? collectionEditorController.configPermissions({\n user: authController.user\n }).createCollections\n : true;\n\n const rootPathSuggestions = collectionEditorController.rootPathSuggestions;\n\n const showSuggestions = (rootPathSuggestions ?? []).length > 3 || ((navigationController.collections ?? []).length === 0 && (rootPathSuggestions ?? []).length > 0);\n const forceShowSuggestions = introMode === \"existing_project\";\n return <Collapse\n in={forceShowSuggestions || showSuggestions}>\n\n <div\n className={\"flex flex-col gap-1 p-2 my-4\"}>\n\n {!introMode && <Typography variant={\"body2\"} color={\"secondary\"}>\n Create a collection <b>automatically</b> from your data:\n </Typography>}\n\n {introMode === \"existing_project\" && <Typography>\n You will see your <b>database collections</b> here, a few seconds after project creation\n </Typography>}\n\n <div\n className={\"flex flex-row gap-1 overflow-scroll no-scrollbar \"}>\n {(rootPathSuggestions ?? []).map((path) => {\n return (\n <div key={path}>\n <Chip\n icon={<AddIcon size={\"small\"}/>}\n colorScheme={\"cyanLighter\"}\n onClick={collectionEditorController && canCreateCollections\n ? () => collectionEditorController.createCollection({\n initialValues: { path, name: unslugify(path) },\n parentCollectionIds: [],\n redirect: true,\n sourceClick: \"root_collection_suggestion\"\n })\n : undefined}\n size=\"small\">\n {path}\n </Chip>\n </div>\n );\n })}\n {rootPathSuggestions === undefined && <CircularProgress size={\"small\"}/>}\n {rootPathSuggestions?.length === 0 && <Typography variant={\"caption\"}>No suggestions</Typography>}\n </div>\n </div>\n </Collapse>\n}\n","import { ResolvedProperty } from \"@firecms/core\";\nimport { IconButton, SettingsIcon, Tooltip } from \"@firecms/ui\";\nimport React from \"react\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { PersistedCollection } from \"../types/persisted_collection\";\n\nexport function CollectionViewHeaderAction({\n propertyKey,\n onHover,\n property,\n fullPath,\n parentCollectionIds,\n collection\n }: {\n property: ResolvedProperty,\n propertyKey: string,\n onHover: boolean,\n fullPath: string,\n parentCollectionIds: string[],\n collection: PersistedCollection;\n}) {\n\n const collectionEditorController = useCollectionEditorController();\n\n return (\n <Tooltip title={\"Edit\"}>\n <IconButton\n className={onHover ? \"bg-white dark:bg-gray-950\" : \"hidden\"}\n onClick={() => {\n collectionEditorController.editProperty({\n propertyKey,\n property,\n editedCollectionId: collection.id,\n parentCollectionIds,\n collection\n });\n }}\n size={\"small\"}>\n <SettingsIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>\n )\n}\n","import { getDefaultPropertiesOrder, useAuthController } from \"@firecms/core\";\nimport { AddIcon, Tooltip } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { PersistedCollection } from \"../types/persisted_collection\";\n\nexport function PropertyAddColumnComponent({\n fullPath,\n parentCollectionIds,\n collection\n }: {\n fullPath: string,\n parentCollectionIds: string[],\n collection: PersistedCollection;\n}) {\n\n const authController = useAuthController();\n const collectionEditorController = useCollectionEditorController();\n const canEditCollection = collectionEditorController.configPermissions\n ? collectionEditorController.configPermissions({\n user: authController.user,\n collection\n }).editCollections\n : true;\n\n return (\n <Tooltip title={canEditCollection ? \"Add new property\" : \"You don't have permission to add new properties\"}>\n <div\n className={\"p-0.5 w-20 h-full flex items-center justify-center cursor-pointer bg-gray-100 bg-opacity-40 hover:bg-gray-100 dark:bg-gray-950 dark:bg-opacity-40 dark:hover:bg-gray-950\"}\n // className={onHover ? \"bg-white dark:bg-gray-950\" : undefined}\n onClick={() => {\n collectionEditorController.editProperty({\n editedCollectionId: collection.id,\n parentCollectionIds,\n currentPropertiesOrder: getDefaultPropertiesOrder(collection),\n collection\n });\n }}>\n <AddIcon color={\"inherit\"}/>\n </div>\n </Tooltip>\n )\n}\n","import { AddIcon, Button } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\n\nexport function NewCollectionButton() {\n const collectionEditorController = useCollectionEditorController();\n return <div className={\"bg-gray-50 dark:bg-gray-900 min-w-fit rounded\"}>\n <Button className={\"min-w-fit\"}\n variant={\"outlined\"}\n onClick={() => collectionEditorController.createCollection({\n parentCollectionIds: [],\n redirect: true,\n sourceClick: \"new_collection_button\"\n })}>\n <AddIcon/>\n New collection\n </Button>\n </div>\n}\n","import React from \"react\";\nimport { FireCMSPlugin, useAuthController, useNavigationController, User } from \"@firecms/core\";\nimport { ConfigControllerProvider } from \"./ConfigControllerProvider\";\nimport { CollectionEditorPermissionsBuilder } from \"./types/config_permissions\";\nimport { EditorCollectionAction } from \"./ui/EditorCollectionAction\";\nimport { HomePageEditorCollectionAction } from \"./ui/HomePageEditorCollectionAction\";\nimport { NewCollectionCard } from \"./ui/NewCollectionCard\";\nimport { PersistedCollection } from \"./types/persisted_collection\";\nimport { CollectionInference } from \"./types/collection_inference\";\nimport { CollectionsConfigController } from \"./types/config_controller\";\nimport { RootCollectionSuggestions } from \"./ui/RootCollectionSuggestions\";\nimport { CollectionViewHeaderAction } from \"./ui/CollectionViewHeaderAction\";\nimport { PropertyAddColumnComponent } from \"./ui/PropertyAddColumnComponent\";\nimport { NewCollectionButton } from \"./ui/NewCollectionButton\";\nimport { AddIcon, Button, Typography } from \"@firecms/ui\";\nimport { useCollectionEditorController } from \"./useCollectionEditorController\";\n\nexport interface CollectionConfigControllerProps<EC extends PersistedCollection = PersistedCollection, UserType extends User = User> {\n\n /**\n * Firebase app where the configuration is saved.\n */\n collectionConfigController: CollectionsConfigController;\n\n /**\n * Define what actions can be performed on the configuration.\n */\n configPermissions?: CollectionEditorPermissionsBuilder<UserType, EC>;\n\n /**\n * The words you define here will not be allowed to be used as group\n * names when creating collections.\n * e.g. [\"admin\"]\n */\n reservedGroups: string[];\n\n extraView?: {\n View: React.ComponentType<{\n path: string\n }>,\n icon: React.ReactNode\n };\n\n pathSuggestions?: (path: string) => Promise<string[]>;\n\n collectionInference?: CollectionInference;\n\n getData?: (path: string, parentPaths: string[]) => Promise<object[]>;\n\n getUser: (uid: string) => UserType | null;\n\n onAnalyticsEvent?: (event: string, params?: object) => void;\n\n introMode?: \"new_project\" | \"existing_project\";\n\n}\n\n/**\n * Use this hook to initialise the Collection Editor plugin.\n * This is likely the only hook you will need to use.\n * @param firebaseApp Firebase app where your project data lives.\n * @param configPermissions\n * @param reservedGroups\n * @param extraView\n * @param pathSuggestions\n * @param getUser\n * @param collectionInference\n */\nexport function useCollectionEditorPlugin<EC extends PersistedCollection = PersistedCollection, UserType extends User = User>\n({\n collectionConfigController,\n introMode,\n configPermissions,\n reservedGroups,\n extraView,\n pathSuggestions,\n getUser,\n collectionInference,\n getData,\n onAnalyticsEvent\n }: CollectionConfigControllerProps<EC, UserType>): FireCMSPlugin<any, any, PersistedCollection> {\n\n return {\n key: \"collection_editor\",\n loading: collectionConfigController.loading,\n provider: {\n Component: ConfigControllerProvider,\n props: {\n collectionConfigController,\n configPermissions,\n collectionInference,\n reservedGroups,\n extraView,\n pathSuggestions,\n getUser,\n getData,\n onAnalyticsEvent\n }\n },\n homePage: {\n additionalActions: <NewCollectionButton/>,\n additionalChildrenStart: introMode ? <IntroWidget introMode={introMode}/> : undefined,\n additionalChildrenEnd: <RootCollectionSuggestions introMode={introMode}/>,\n CollectionActions: HomePageEditorCollectionAction,\n AdditionalCards: introMode ? undefined : NewCollectionCard,\n },\n collectionView: {\n CollectionActions: EditorCollectionAction,\n HeaderAction: CollectionViewHeaderAction,\n AddColumnComponent: PropertyAddColumnComponent\n }\n };\n}\n\nexport function IntroWidget({ introMode }: {\n introMode?: \"new_project\" | \"existing_project\";\n}) {\n\n const navigation = useNavigationController();\n if (!navigation.topLevelNavigation)\n throw Error(\"Navigation not ready in FireCMSHomePage\");\n\n const authController = useAuthController();\n\n const collectionEditorController = useCollectionEditorController();\n const canCreateCollections = collectionEditorController.configPermissions\n ? collectionEditorController.configPermissions({\n user: authController.user,\n }).createCollections\n : true;\n\n return (\n <div className={\"mt-8 flex flex-col mt-8 p-2\"}>\n <Typography variant={\"h4\"} className=\"mb-4\">Welcome</Typography>\n <Typography paragraph={true}>Your admin panel is ready ✌️</Typography>\n <Typography paragraph={true}>\n Start building collections in FireCMS easily. Map them to your existing\n database data, import from files, or use our templates. Simplify your data management process\n now.\n </Typography>\n {canCreateCollections && <Button\n className={\"mt-4\"}\n onClick={collectionEditorController && canCreateCollections\n ? () => collectionEditorController.createCollection({\n parentCollectionIds: [],\n redirect: true,\n sourceClick: \"new_collection_card\"\n })\n : undefined}>\n <AddIcon/>Create your first collection\n </Button>}\n </div>\n );\n}\n","import { ErrorView, unslugify, useNavigationController } from \"@firecms/core\";\nimport { useCollectionEditorController } from \"../useCollectionEditorController\";\nimport { Button } from \"@firecms/ui\";\n\nexport function MissingReferenceWidget({ path: pathProp }: {\n path: string\n}) {\n const navigation = useNavigationController();\n const path = getLastSegment(pathProp);\n const parentCollectionIds = navigation.getParentCollectionIds(pathProp);\n const collectionEditor = useCollectionEditorController();\n return <div className={\"p-1 flex flex-col items-center\"}>\n <ErrorView error={\"No collection for path: \" + path}/>\n <Button className={\"mx-2\"} variant={\"outlined\"}\n size={\"small\"}\n onClick={() => {\n collectionEditor.createCollection({\n initialValues: { path, name: unslugify(path) },\n parentCollectionIds,\n redirect: false,\n sourceClick: \"missing_reference\"\n });\n }}>\n Create\n </Button>\n </div>;\n}\n\nfunction getParentPathSegments(path: string): string[] {\n const segments = path.split(\"/\");\n return segments.filter((segment, index) => index % 2 === 0 && index !== segments.length - 1);\n}\n\nfunction getLastSegment(path: string): string {\n const segments = path.split(\"/\");\n return segments[segments.length - 1];\n}\n"],"names":["YupSchema","Yup","CollectionDetailsForm","isNewCollection","reservedGroups","existingPaths","existingIds","groups","parentCollection","groupRef","React","values","setFieldValue","handleChange","touched","errors","setFieldTouched","isSubmitting","submitCount","useFormex","iconDialogOpen","setIconDialogOpen","useState","advancedPanelExpanded","setAdvancedPanelExpanded","updateName","name","getIn","toSnakeCase","singular","useEffect","collectionIcon","jsx","IconForView","groupOptions","group","inputFocused","autoCompleteOpen","setAutoCompleteOpen","useAutoComplete","isSubcollection","customIdValue","showErrors","Container","jsxs","Typography","Tooltip","IconButton","Chip","TextField","e","FieldCaption","cn","Field","DebouncedTextField","event","Autocomplete","index","AutocompleteItem","ExpandablePanel","SettingsIcon","Select","value","SelectItem","v","BooleanSwitchWithLabel","Dialog","SearchIconsView","icon","idToPropertiesPath","id","namespaceToPropertiesPath","namespace","namespaceToPropertiesOrderPath","getFullId","propertyKey","propertyNamespace","getFullIdPath","keyWithNamespace","EnumForm","enumValues","onValuesChanged","onError","updateIds","disabled","allowDataInference","getData","formex","useCreateFormex","enumValue","hasError","Formex","EnumFormFields","enumValuesPath","shouldUpdateId","lastInternalIdAdded","setLastInternalIdAdded","editDialogIndex","setEditDialogIndex","inferring","setInferring","inferredValues","buildEntry","internalId","justAdded","entryError","EnumEntry","ListIcon","Button","data","flatData","fieldData","currentEnumValues","newEnumValues","extractEnumFromValues","CircularProgress","AutoAwesomeIcon","Paper","ArrayContainer","EnumEntryDialog","updateId","autoFocus","onDialogOpen","inferredEntry","shouldUpdateIdRef","idValue","labelValue","currentLabelRef","Fragment","Badge","prevProps","nextProps","equal","open","onClose","idError","DialogContent","DialogActions","SwitchControl","field","form","label","tooltip","size","allowIndeterminate","formControlLabel","checked","GeneralPropertyValidation","validationRequired","validationRequiredMessage","StringPropertyValidation","length","lowercase","matches","max","min","trim","uppercase","validationLength","validationMin","validationMax","validationTrim","validationMatches","validationLowercase","validationUppercase","matchesError","matchesValue","matchesStringValue","serializeRegExp","ArrayPropertyValidation","ValidationPanel","children","RuleIcon","EnumPropertyField","multiselect","setFieldError","snackbarContext","useSnackbarController","defaultValue","valuesEnumValues","useMemo","resolveEnumValues","res","d","enumIds","fileTypes","StoragePropertyField","multiple","existing","baseStoragePath","acceptedFiles","fileName","storagePath","storeUrl","fileNameValue","storagePathValue","storedValue","fileTypesValue","allFileTypesSelected","handleTypesChange","hasFilenameCallback","hasStoragePathCallback","FileUploadIcon","MultiSelect","selected","MultiSelectItem","Checkbox","editableProperty","property","isPropertyBuilder","eProperty","removeNonEditableProperties","properties","_","key","propertyOrBuilder","a","b","PropertyFieldPreview","onClick","includeName","includeEditButton","propertyConfigs","useCustomizationController","propertyConfig","getFieldConfig","borderColorClass","ErrorBoundary","PropertyConfigBadge","cardMixin","cardClickableMixin","cardSelectedMixin","NonEditablePropertyPreview","FunctionsIcon","RemoveCircleIcon","PropertyTree","selectedPropertyKey","onPropertyClick","propertiesOrderProp","additionalFields","onPropertyMove","onPropertyRemove","className","inferredPropertyKeys","collectionEditable","propertiesOrder","onDragEnd","useCallback","result","startIndex","endIndex","newPropertiesOrder","removed","DragDropContext","Droppable","droppableProvided","droppableSnapshot","additionalField","Draggable","provided","snapshot","PropertyTreeEntry","isSelected","wasSelected","isPropertyInferred","fullId","subtree","editable","defaultBorderMixin","RemoveIcon","DragHandleIcon","MapPropertyField","propertyDialogOpen","setPropertyDialogOpen","setSelectedPropertyKey","selectedPropertyNamespace","setSelectedPropertyNamespace","onPropertyCreated","currentPropertiesOrder","deleteProperty","propertiesPath","propertiesOrderPath","p","selectedPropertyFullId","selectedProperty","empty","AddIcon","PropertyFormDialog","RepeatPropertyField","ofProperty","ofPropertyError","onPropertyChanged","widget","CommonPropertyFields","disabledId","autoUpdateId","isNewProperty","ref","validate","nameError","description","descriptionError","newNameValue","newIdValue","unslugify","StringPropertyField","widgetId","BooleanPropertyField","BlockPropertyField","addChildButton","NumberPropertyValidation","validationLessThan","validationMoreThan","NumberPropertyField","ReferencePropertyField","useNavigationController","pathPath","pathValue","pathError","CollectionsSelect","error","props","navigation","collections","ungroupedCollections","col","selectedCollection","collection","SelectGroup","DateTimePropertyField","modePath","modeValue","modeError","autoValuePath","autoValueValue","autoValueError","AdvancedPropertyValidation","KeyValuePropertyField","updatePropertyFromWidget","propertyData","selectedWidgetId","updatedProperty","mergeDeep","PropertySelectItem","optionDisabled","UrlPropertyField","urlValue","supportedFieldsIds","supportedFields","DEFAULT_FIELD_CONFIGS","config","PropertyForm","includeIdAndName","autoOpenTypeSelect","existingProperty","inArray","existingPropertyKeys","onPropertyChangedImmediate","onDelete","initialErrors","forceShowErrors","getController","initialValue","lastSubmittedProperty","useRef","doOnPropertyChanged","params","formexController","newPropertyWithId","controller","validateName","validateId","isValidRegExp","PropertyEditFormFields","onCancel","onOkClicked","formProps","formexRef","helpers","setValues","includeIdAndTitle","selectOpen","setSelectOpen","deleteDialogOpen","setDeleteDialogOpen","selectedFieldConfigId","setSelectedFieldConfigId","getFieldId","allSupportedFields","displayedWidgets","deferredValues","useDeferredValue","nameFieldRef","selectedWidgetError","onWidgetSelectChanged","newSelectedWidgetId","childComponent","InfoLabel","baseProperty","baseFieldConfig","computedFieldConfig","DeleteIcon","DeleteConfirmationDialog","idRegEx","camelCase","str","cur","acc","GetCodeDialog","onOpenChange","snackbarController","code","JSON5","collectionToCode","Highlight","themes","style","tokens","getLineProps","getTokenProps","line","i","token","ContentCopyIcon","propertyCleanup","CollectionPropertiesEditorForm","propertyErrorsRef","onPropertyError","setDirty","extraIcon","getUser","doCollectionInference","dirty","largeLayout","useLargeLayout","asDialog","selectedPropertyIndex","setSelectedPropertyIndex","codeDialogOpen","setCodeDialogOpen","inferringProperties","setInferringProperties","newPropertyDialogOpen","setNewPropertyDialogOpen","setInferredPropertyKeys","currentPropertiesOrderRef","inferPropertiesFromData","newCollection","makePropertiesEditable","newPropertyKeys","updatedProperties","updatedPropertiesOrder","updatePropertiesOrder","getCurrentPropertiesOrder","previousId","propertyPath","previousFullId","previousPropertyPath","onPropertyErrorInternal","closePropertyDialog","emptyCollection","usedPropertiesOrder","owner","body","CodeIcon","UnsavedChangesDialog","handleOk","handleCancel","title","EntityCustomViewsSelectDialog","entityViews","view","SubcollectionsEditTab","configController","collectionInference","parentCollectionIds","contextEntityViews","subcollectionToDelete","setSubcollectionToDelete","addEntityViewDialogOpen","setAddEntityViewDialogOpen","viewToDelete","setViewToDelete","currentDialog","setCurrentDialog","subcollections","resolvedEntityViews","resolveEntityView","hardCodedEntityViews","totalEntityViews","Table","TableBody","subcollection","TableRow","TableCell","Alert","CollectionEditorDialog","selectedViewKey","productsCollectionTemplate","blogCollectionTemplate","usersCollectionTemplate","pagesCollectionTemplate","CollectionEditorWelcomeView","path","pathSuggestions","onContinue","existingCollectionPaths","loadingPathSuggestions","setLoadingPathSuggestions","filteredPathSuggestions","setFilteredPathSuggestions","suggestions","filteredSuggestions","s","c","suggestion","TemplateButton","Icon","ImportFileUpload","subtitle","Card","CollectionEditorImportMapping","importConfig","setSelectedProperty","newHeadersMapping","onPropertyTypeChanged","importKey","inferredNewProperty","buildPropertyFromData","getInferenceType","DataNewPropertiesMapping","ImportNewPropertyFieldPreview","PropertySelect","fieldId","newProperty","CollectionEditorImportDataPreview","propertiesMapping","getPropertiesMapping","mappedData","convertDataToEntity","selectionController","useSelectionController","EntityCollectionTable","cleanPropertiesFromImport","parentSlug","slug","slugify","fullSlug","slugifiedResult","firstKey","idColumn","formDirty","setFormDirty","unsavedChangesDialogOpen","setUnsavedChangesDialogOpen","CollectionEditor","authController","useAuthController","topLevelNavigation","initialValuesProp","includeTemplates","collectionsInThisLevel","setCollection","initialLoadingCompleted","setInitialLoadingCompleted","initialCollection","randomString","initialValues","applyPropertyConfigs","coolIconKeys","CircularProgressCenter","CollectionEditorInternal","editedCollectionId","fullPath","handleClose","extraView","useImportConfig","initialView","currentView","setCurrentView","setError","saveCollection","updatedCollection","setNextMode","inferCollectionFromData","inferredCollection","formController","newCollectionState","schema","err","validatePath","updatedFullPath","parentPaths","resolvedPath","getDataWithPath","onImportDataSet","buildEntityPropertiesFromData","validValues","onImportMappingComplete","Tabs","Tab","importData","ImportSaveInProgress","importedCollection","current","removeUndefined","ErrorView","ArrowBackIcon","LoadingButton","DoneIcon","rest","propertiesResult","applyPropertiesConfig","internalProperty","removeInitialAndTrailingSlashes","ConfigControllerContext","CollectionEditorContext","ConfigControllerProvider","collectionConfigController","configPermissions","onAnalyticsEvent","navigate","useNavigate","rootPathSuggestions","setRootPathSuggestions","paths","currentPropertyDialog","setCurrentPropertyDialog","defaultConfigPermissions","editCollection","editProperty","propertyKeyWithoutNamespace","createCollection","redirect","sourceClick","getPathSuggestions","url","useCollectionEditorController","useContext","useCollectionsConfigController","EditorCollectionAction","tableController","navigationController","collectionEditorController","canEditCollection","saveDefaultFilterButton","getObjectOrNull","UndoIcon","SaveIcon","o","HomePageEditorCollectionAction","permissions","onEditCollectionClicked","deleteRequested","setDeleteRequested","deleteCollection","Menu","MoreVertIcon","MenuItem","NewCollectionCard","context","canCreateCollections","RootCollectionSuggestions","introMode","showSuggestions","Collapse","CollectionViewHeaderAction","onHover","PropertyAddColumnComponent","getDefaultPropertiesOrder","NewCollectionButton","useCollectionEditorPlugin","IntroWidget","MissingReferenceWidget","pathProp","getLastSegment","collectionEditor","segments"],"mappings":";;;;;;;;;;;;;;AAEO,MAAMA,KAAYC,GAAI,OAAO,EAAE,MAAM;AAAA,EACxC,IAAIA,GAAI,SAAS,SAAS,UAAU;AAAA,EACpC,MAAMA,GAAI,SAAS,SAAS,UAAU;AAAA,EACtC,MAAMA,GAAI,SAAS,SAAS,UAAU;AAC1C,CAAC;ACkBM,SAASC,GAAsB;AAAA,EACI,iBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA,QAAAC;AAAA,EACA,kBAAAC;AACJ,GAQnC;AAEO,QAAAC,IAAWC,EAAM,OAAyB,IAAI,GAC9C;AAAA,IACF,QAAAC;AAAA,IACA,eAAAC;AAAA,IACA,cAAAC;AAAA,IACA,SAAAC;AAAA,IACA,QAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,aAAAC;AAAA,MACAC,EAA4B,GAE1B,CAACC,GAAgBC,CAAiB,IAAIC,EAAS,EAAK,GACpD,CAACC,GAAuBC,CAAwB,IAAIF,EAAS,EAAK,GAElEG,IAAa,CAACC,MAAiB;AACjC,IAAAd,EAAc,QAAQc,CAAI,GAGtB,CADgBC,EAAMb,GAAS,MAAM,KACrBX,KAAmBuB,KACrBd,EAAA,QAAQgB,GAAYF,CAAI,CAAC,GAIvC,CADcC,EAAMb,GAAS,IAAI,KACnBX,KAAmBuB,KACnBd,EAAA,MAAMgB,GAAYF,CAAI,CAAC,GAIrC,CADwBC,EAAMb,GAAS,cAAc,KAC7BX,KAAmBuB,KAC7Bd,EAAA,gBAAgBiB,GAASH,CAAI,CAAC;AAAA,EAChD;AAIJ,EAAAI,GAAU,MAAM;AACZ,IAAIf,EAAO,MACPS,EAAyB,EAAI;AAAA,EACjC,GACD,CAACT,EAAO,EAAE,CAAC;AAEd,QAAMgB,IAAiB,gBAAAC,EAACC,IAAY,EAAA,kBAAkBtB,EAAO,CAAA,GAEvDuB,IAAe3B,GAAQ,OAAO,CAAC4B,MAAU,CAAC/B,GAAgB,SAAS+B,CAAK,CAAC,GAEzE;AAAA,IACF,cAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,qBAAAC;AAAA,MACAC,GAAgB;AAAA,IAChB,KAAK9B;AAAA,EAAA,CACR,GAEK+B,IAAkB,CAAC,CAAChC;AAEtB,MAAAiC;AACA,EAAA,OAAO9B,EAAO,YAAa,WACX8B,IAAA,iBACT9B,EAAO,aAAa,KACX8B,IAAA,SACT9B,EAAO,aAAa,KACX8B,IAAA,UACT9B,EAAO,aAAa,eACX8B,IAAA;AAGpB,QAAMC,IAAaxB,IAAc;AAE7B,SAAA,gBAAAc,EAAC,SAAI,WAAW,yBACZ,4BAACW,IAAU,EAAA,UAAU,OAAO,WAAW,kCAEnC,UAAA;AAAA,IAAA,gBAAAC,EAAC,OACG,EAAA,UAAA;AAAA,MAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAU;AAAA,UACV,UAAA;AAAA,YAAA,gBAAAZ,EAACa,GAAW,EAAA,SAAU1C,IAAyB,OAAP,MAAa,WAAW,aAC3D,UAAkBA,IAAA,mBAAmB,GAAGQ,GAAQ,IAAI,eACzD;AAAA,YACA,gBAAAqB,EAACc,IAAQ,EAAA,OAAO,eACZ,UAAA,gBAAAd;AAAA,cAACe;AAAA,cAAA;AAAA,gBACG,OAAO;AAAA,gBACP,SAAS,MAAM1B,EAAkB,EAAI;AAAA,gBACpC,UAAAU;AAAA,cAAA;AAAA,YAAA,GAET;AAAA,UAAA;AAAA,QAAA;AAAA,MACJ;AAAA,MAECvB,uBAAqBwC,IAAK,EAAA,aAAa,cACpC,UAAC,gBAAAJ,EAAAC,GAAA,EAAW,SAAS,WAAW,UAAA;AAAA,QAAA;AAAA,QACD,gBAAAb,EAAC,KAAG,EAAA,UAAAxB,EAAiB,KAAK,CAAA;AAAA,MAAA,EAAA,CACzD,EACJ,CAAA;AAAA,IAAA,GAEJ;AAAA,IACA,gBAAAoC,EAAC,OAAI,EAAA,WAAW,2BAEZ,UAAA;AAAA,MAAC,gBAAAA,EAAA,OAAA,EAAI,WAAW,eACZ,UAAA;AAAA,QAAA,gBAAAZ;AAAA,UAACiB;AAAA,UAAA;AAAA,YACG,OAAOtC,EAAO,QAAQ;AAAA,YACtB,UAAU,CAACuC,MAAWzB,EAAWyB,EAAE,OAAO,KAAK;AAAA,YAC/C,OAAO;AAAA,YACP,UAAQ;AAAA,YACR,OAAOR,KAAc,EAAQ3B,EAAO;AAAA,UAAI;AAAA,QAAE;AAAA,0BAC7CoC,GAAa,EAAA,OAAOrC,EAAQ,QAAQ,EAAQC,EAAO,MAC/C,UAAAD,EAAQ,QAAgBC,EAAO,OAAQA,EAAO,OAAO,qEAC1D;AAAA,MAAA,GACJ;AAAA,MAEA,gBAAA6B,EAAC,SAAI,WAAWQ,GAAG,gBAAgBZ,IAAkB,KAAK,eAAe,GACrE,UAAA;AAAA,QAAA,gBAAAR;AAAA,UAACqB;AAAA,UAAA;AAAA,YAAM,MAAM;AAAA,YACN,IAAIC;AAAA,YACJ,OAAO;AAAA,YACP,UAAU,CAACnD;AAAA,YACX,UAAQ;AAAA,YACR,OAAOuC,KAAc,EAAQ3B,EAAO;AAAA,UAAI;AAAA,QAAE;AAAA,0BAEhDoC,GAAa,EAAA,OAAOrC,EAAQ,QAAQ,EAAQC,EAAO,MAC/C,YAAQ,QAAgBA,EAAO,OAC1BA,EAAO,OACPyB,IAAkB,qEAAqE,2DACjG;AAAA,MAAA,GAEJ;AAAA,MAEC,CAACA,KAAoB,gBAAAI,EAAA,OAAA,EAAI,WAAW,sCAEjC,UAAA;AAAA,QAAA,gBAAAZ;AAAA,UAACiB;AAAA,UAAA;AAAA,YAAU,OAAOP,KAAc,EAAQ3B,EAAO;AAAA,YACpC,UAAUE;AAAA,YACV,OAAON,EAAO,SAAS;AAAA,YACvB,cAAa;AAAA,YACb,UAAU,CAAC4C,MAAU3C,EAAc,SAAS2C,EAAM,OAAO,KAAK;AAAA,YAC9D,MAAM;AAAA,YACN,UAAU9C;AAAA,YACV,OAAM;AAAA,UAAA;AAAA,QAAO;AAAA,QACxB,gBAAAuB;AAAA,UAACwB;AAAA,UAAA;AAAA,YACG,MAAMnB,MAAqBH,KAAgB,IAAI,SAAS;AAAA,YACxD,SAASI;AAAA,YACR,UAAcJ,GAAA,IAAI,CAACC,GAAOsB,MAChB,gBAAAzB;AAAA,cAAC0B;AAAA,cAAA;AAAA,gBAEJ,SAAS,MAAM;AACX,kBAAApB,EAAoB,EAAK,GACX1B,EAAA,SAASuB,KAAS,IAAI;AAAA,gBACxC;AAAA,gBAEA,UAAC,gBAAAH,EAAA,OAAA,EAAI,WAAW,aACX,UACLG,GAAA;AAAA,cAAA;AAAA,cARKsB,IAAQ,MAAMtB;AAAA,YAAA,CAU1B;AAAA,UAAA;AAAA,QACL;AAAA,QACA,gBAAAH,EAACmB,KACI,UAAcT,KAAQ3B,EAAO,QAASA,EAAO,QAAQ,0BAC1D,CAAA;AAAA,MAAA,GACJ;AAAA,MAEA,gBAAAiB,EAAC,OAAI,EAAA,WAAW,eACZ,UAAA,gBAAAA;AAAA,QAAC2B;AAAA,QAAA;AAAA,UACG,UAAUpC;AAAA,UACV,kBAAkBC;AAAA,UAClB,OACI,gBAAAoB,EAAC,OAAI,EAAA,WAAU,+BACX,UAAA;AAAA,YAAA,gBAAAZ,EAAC4B,IAAY,EAAA;AAAA,YACb,gBAAA5B;AAAA,cAACa;AAAA,cAAA;AAAA,gBAAW,SAAS;AAAA,gBACT,WAAU;AAAA,gBAAO,UAAA;AAAA,cAAA;AAAA,YAE7B;AAAA,UAAA,GACJ;AAAA,UACJ,mBAAmB;AAAA,UACnB,UAAA,gBAAAD,EAAC,OAAI,EAAA,WAAW,+BAEZ,UAAA;AAAA,YAAC,gBAAAA,EAAA,OAAA,EAAI,WAAW,eACZ,UAAA;AAAA,cAAA,gBAAAZ;AAAA,gBAACqB;AAAA,gBAAA;AAAA,kBAAM,MAAM;AAAA,kBACN,IAAIC;AAAA,kBACJ,UAAU,CAACnD;AAAA,kBACX,OAAO;AAAA,kBACP,OAAOuC,KAAc,EAAQ3B,EAAO;AAAA,gBAAE;AAAA,cAAE;AAAA,gCAC9CoC,GAAa,EAAA,OAAOrC,EAAQ,MAAM,EAAQC,EAAO,IAC7C,UAAAD,EAAQ,MAAcC,EAAO,KAAMA,EAAO,KAAK,sCACpD;AAAA,YAAA,GACJ;AAAA,YAEA,gBAAA6B,EAAC,OAAI,EAAA,WAAW,eACZ,UAAA;AAAA,cAAA,gBAAAZ;AAAA,gBAACiB;AAAA,gBAAA;AAAA,kBACG,OAAOP,KAAc,EAAQ3B,EAAO;AAAA,kBACpC,MAAM;AAAA,kBACN,oBAAkB;AAAA,kBAClB,UAAU,CAACmC,OACPlC,EAAgB,gBAAgB,EAAI,GAC7BH,EAAaqC,CAAC;AAAA,kBAEzB,OAAOvC,EAAO,gBAAgB;AAAA,kBAC9B,OAAO;AAAA,gBAAA;AAAA,cAAgB;AAAA,cAC1B,gBAAAqB,EAAAmB,GAAA,EAAa,OAAOT,KAAc,EAAQ3B,EAAO,cAC7C,UAAA2B,KAAsB3B,EAAO,eAAgBA,EAAO,eAAe,uDACxE;AAAA,YAAA,GACJ;AAAA,YACA,gBAAA6B,EAAC,OAAI,EAAA,WAAW,eACZ,UAAA;AAAA,cAAA,gBAAAZ;AAAA,gBAACiB;AAAA,gBAAA;AAAA,kBACG,OAAOP,KAAc,EAAQ3B,EAAO;AAAA,kBACpC,MAAK;AAAA,kBACL,OAAOJ,EAAO,eAAe;AAAA,kBAC7B,UAAUE;AAAA,kBACV,WAAS;AAAA,kBACT,MAAM;AAAA,kBACN,oBAAiB;AAAA,kBACjB,OAAM;AAAA,gBAAA;AAAA,cACV;AAAA,cACC,gBAAAmB,EAAAmB,GAAA,EAAa,OAAOT,KAAc,EAAQ3B,EAAO,aAC7C,UAAA2B,KAAsB3B,EAAO,cAAeA,EAAO,cAAc,uDACtE;AAAA,YAAA,GACJ;AAAA,YAEA,gBAAAiB,EAAC,OAAI,EAAA,WAAW,eACZ,UAAA,gBAAAA;AAAA,cAAC6B;AAAA,cAAA;AAAA,gBACG,MAAK;AAAA,gBACL,OAAM;AAAA,gBACN,UAAU;AAAA,gBACV,UAAUhD;AAAA,gBACV,OAAOF,EAAO,eAAe;AAAA,gBAC7B,aAAa,CAACmD,MAAeA,EAAM,YAAY;AAAA,gBAE9C,UAAA,CAAC,MAAM,KAAK,KAAK,KAAK,IAAI,EAAE,IAAI,CAACA,MAC9B,gBAAA9B;AAAA,kBAAC+B;AAAA,kBAAA;AAAA,oBAEG,OAAAD;AAAA,oBACC,YAAM,YAAY;AAAA,kBAAA;AAAA,kBAFd,eAAeA,CAAK;AAAA,gBAAA,CAIhC;AAAA,cAAA;AAAA,YAAA,GAET;AAAA,YACA,gBAAA9B,EAAC,OAAI,EAAA,WAAW,eACZ,UAAA,gBAAAY;AAAA,cAACiB;AAAA,cAAA;AAAA,gBACG,MAAK;AAAA,gBACL,OAAM;AAAA,gBACN,UAAU;AAAA,gBACV,UAAUpB,MAAkB;AAAA,gBAC5B,eAAe,CAACuB,MAAM;AAClB,sBAAIA,MAAM;AACA,0BAAA,IAAI,MAAM,wBAAwB;AAAA,kBACnCA,MAAM,SACXpD,EAAc,YAAY,EAAI,IACzBoD,MAAM,UACXpD,EAAc,YAAY,EAAK,IAC1BoD,MAAM,cACXpD,EAAc,YAAY,UAAU;AAAA,gBAC5C;AAAA,gBACA,OAAO6B,KAAiB;AAAA,gBACxB,aAAa,CAACqB,MACNA,MAAU,iBACH,iBACFA,MAAU,SACR,4BACFA,MAAU,aACR,mDAEA;AAAA,gBAGf,UAAA;AAAA,kBAAC,gBAAA9B,EAAA+B,IAAA,EAAW,OAAO,SAAS,UAE5B,0CAAA;AAAA,kBACC,gBAAA/B,EAAA+B,IAAA,EAAW,OAAO,QAAQ,UAE3B,2BAAA;AAAA,kBACC,gBAAA/B,EAAA+B,IAAA,EAAW,OAAO,YAAY,UAE/B,kDAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA,GAER;AAAA,YACA,gBAAAnB,EAAC,OAAI,EAAA,WAAW,eACZ,UAAA;AAAA,cAAA,gBAAAZ;AAAA,gBAACiC;AAAA,gBAAA;AAAA,kBACG,UAAU;AAAA,kBACV,OAAM;AAAA,kBACN,eAAe,CAACD,MAAMpD,EAAc,mBAAmBoD,CAAC;AAAA,kBACxD,OAAOrD,EAAO,mBAAmB;AAAA,gBAAA;AAAA,cACrC;AAAA,cACA,gBAAAqB,EAACmB,KAAa,UAId,iIAAA,CAAA;AAAA,YAAA,GACJ;AAAA,YACA,gBAAAP,EAAC,OAAI,EAAA,WAAW,eACZ,UAAA;AAAA,cAAA,gBAAAZ;AAAA,gBAACiC;AAAA,gBAAA;AAAA,kBACG,UAAU;AAAA,kBACV,OAAM;AAAA,kBACN,eAAe,CAACD,MAAMpD,EAAc,qBAAqBoD,CAAC;AAAA,kBAC1D,OAAOrD,EAAO,qBAAqB;AAAA,gBAAA;AAAA,cACvC;AAAA,cACA,gBAAAqB,EAACmB,KAAa,UAId,wOAAA,CAAA;AAAA,YAAA,GACJ;AAAA,UAAA,GACJ;AAAA,QAAA;AAAA,MAAA,GAGR;AAAA,IAAA,GAEJ;AAAA,sBAEC,OAAI,EAAA,OAAO,EAAE,QAAQ,UAAS;AAAA,IAE/B,gBAAAnB;AAAA,MAACkC;AAAA,MAAA;AAAA,QACG,MAAM9C;AAAA,QACN,cAAcC;AAAA,QACd,UAAU;AAAA,QACV,WAAS;AAAA,QAET,UAAA,gBAAAW,EAAC,OAAI,EAAA,WAAW,mCACZ,UAAA,gBAAAA;AAAA,UAACmC;AAAA,UAAA;AAAA,YAAgB,cAAcxD,EAAO;AAAA,YACrB,gBAAgB,CAACyD,MAAiB;AAC9B,cAAA/C,EAAkB,EAAK,GACvBT,EAAc,QAAQwD,CAAI;AAAA,YAC9B;AAAA,UAAA;AAAA,QAAA,GACrB;AAAA,MAAA;AAAA,IAEJ;AAAA,EAAA,EAEJ,CAAA,EACJ,CAAA;AAER;AC5WO,SAASC,GAAmBC,GAAoB;AACnD,SAAO,gBAAgBA,EAAG,WAAW,KAAK,cAAc;AAC5D;AAEO,SAASC,GAA0BC,GAA4B;AAClE,SAAOA,IACD,gBAAgBA,EAAU,WAAW,KAAK,cAAc,IAAI,gBAC5D;AACV;AAEO,SAASC,GAA+BD,GAA4B;AACvE,SAAOA,IACD,gBAAgBA,EAAU,WAAW,KAAK,cAAc,IAAI,qBAC5D;AACV;AAEgB,SAAAE,GAAUC,GAAqBC,GAAoC;AAC/E,SAAOA,IACD,GAAGA,CAAiB,IAAID,CAAW,KACnCA;AACV;AAEgB,SAAAE,GAAcF,GAAqBC,GAAoC;AACnF,QAAME,IAAmBF,IACnB,GAAGA,CAAiB,IAAID,CAAW,KACnCA;AACN,SAAON,GAAmBS,CAAgB;AAC9C;ACKO,SAASC,GAAS;AAAA,EACI,YAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,SAAAC;AACJ,GAAkB;AAEvC,QAAMC,IAASC,GAEZ;AAAA,IACC,eAAe,EAAE,YAAAR,EAAW;AAAA,IAC5B,kBAAkB;AAAA,IAClB,YAAY,CAACrE,MAAW;AACpB,YAAMI,IAAc,CAAA;AACpB,MAAIJ,EAAO,cACPA,EAAO,WAAW,QAAQ,CAAC8E,GAAWhC,MAAU;AACxC,QAACgC,GAAW,UACZ1E,EAAO,aAAaA,EAAO,cAAc,CAAA,GACzCA,EAAO,WAAW0C,CAAK,IAAI1C,EAAO,WAAW0C,CAAK,KAAK,IACvD1C,EAAO,WAAW0C,CAAK,EAAE,QAAQ,uDAEhCgC,GAAW,OACZ1E,EAAO,aAAaA,EAAO,cAAc,CAAA,GACzCA,EAAO,WAAW0C,CAAK,IAAI1C,EAAO,WAAW0C,CAAK,KAAK,IACvD1C,EAAO,WAAW0C,CAAK,EAAE,KAAK;AAAA,MAClC,CACH;AAEC,YAAAiC,IAAW,GAAQ3E,GAAQ,cAAc,OAAO,KAAKA,GAAQ,UAAU,EAAE,SAAS;AACxF,aAAAmE,IAAUQ,CAAQ,GACX3E;AAAAA,IACX;AAAA,EAAA,CACH,GAEK,EAAE,QAAAJ,GAAQ,QAAAI,EAAW,IAAAwE;AAE3B,SAAAzD,GAAU,MAAM;AACZ,IAAImD,KACAA,EAAgBtE,EAAO,UAAU;AAAA,EACrC,GACD,CAACA,EAAO,UAAU,CAAC,GAEf,gBAAAqB,EAAC2D,IAAO,EAAA,OAAOJ,GAClB,UAAA,gBAAAvD;AAAA,IAAC4D;AAAA,IAAA;AAAA,MAAe,gBAAgB;AAAA,MAChB,QAAAjF;AAAA,MACA,QAAAI;AAAA,MACA,gBAAgBoE;AAAA,MAChB,UAAAC;AAAA,MACA,oBAAAC;AAAA,MACA,SAAAC;AAAA,IAAA;AAAA,EACpB,EAAA,CAAA;AAEJ;AAeA,SAASM,GAAe;AAAA,EACI,QAAAjF;AAAA,EACA,QAAAI;AAAA,EACA,UAAAqE;AAAA,EACA,gBAAAS;AAAA,EACA,gBAAAC;AAAA,EACA,oBAAAT;AAAA,EACA,SAAAC;AACJ,GAAwB;AAEtC,QAAA;AAAA,IACF,eAAA1E;AAAA,MACAO,EAAU,GAER,CAAC4E,GAAqBC,CAAsB,IAAItF,EAAM,SAA6B,GACnF,CAACuF,GAAiBC,CAAkB,IAAIxF,EAAM,SAA6B,GAC3E,CAACyF,GAAWC,CAAY,IAAI1F,EAAM,SAAS,EAAK,GAGhD2F,IADoB3F,EAAM,OAAO,oBAAI,IAAK,CAAA,EACP,SAEnC4F,IAAa,CAAC7C,GAAe8C,MAAuB;AACtD,UAAMC,IAAYT,MAAwBQ,GACpCE,IAAa1F,GAAQ,cAAcA,GAAQ,WAAW0C,CAAK;AAC1D,WAAA,gBAAAzB;AAAA,MAAC0E;AAAA,MAAA;AAAA,QAAU,OAAAjD;AAAA,QACA,UAAA2B;AAAA,QACA,gBAAAS;AAAA,QACA,WAAWW;AAAA,QACX,YAAAC;AAAA,QACA,gBAAgBX,KAAkBU;AAAA,QAClC,cAAc,MAAMN,EAAmBzC,CAAK;AAAA,QAC5C,eAAe4C,EAAe,IAAI1F,EAAO,WAAW8C,CAAK,GAAG,EAAY;AAAA,MAAA;AAAA,MACnE,GAAG8C,CAAU;AAAA,IAAA;AAAA,EAAG;AAkCvC,SAAA,gBAAA3D,EAAC,OAAI,EAAA,WAAW,eACZ,UAAA;AAAA,IAAC,gBAAAA,EAAA,OAAA,EAAI,WAAU,qCACX,UAAA;AAAA,MAAA,gBAAAZ,EAAC2E,IAAQ,EAAA;AAAA,MACT,gBAAA3E;AAAA,QAACa;AAAA,QAAA;AAAA,UAAW,SAAS;AAAA,UACT,WAAU;AAAA,UAAY,UAAA;AAAA,QAAA;AAAA,MAElC;AAAA,MACCwC,KACG,gBAAAzC;AAAA,QAACgE;AAAA,QAAA;AAAA,UAAO,SAAST;AAAA,UACT,UAAUf,KAAYe;AAAA,UACtB,SAAS;AAAA,UACT,MAAM;AAAA,UACN,SA3CJ,YAAY;AAC5B,YAAKb,MAELc,EAAa,EAAI,GACPd,IAAA,EAAE,KAAK,CAACuB,MAAS;AACvB,kBAAI,CAACA;AACD;AAEE,oBAAAC,IAAWD,EAAK,QAEhBE,IAAY,MAAM,KAAK,IAAI,IAAID,CAAQ,CAAC,GAExCE,IAAoBrG,EAAO,YAI3BsG,IAHkBC,GAAsBH,CAAS,EAGjB,OAAO,CAACtB,MACnC,CAACuB,GAAmB,KAAK,CAAChD,MAAWA,EAAE,OAAOyB,EAAU,EAAE,CACpE;AAEa,cAAAwB,EAAA,QAAQ,CAACxB,MAAc;AAClB,gBAAAY,EAAA,IAAIZ,EAAU,EAAE;AAAA,cAAA,CAClC,GACD7E,EAAciF,GAAgB,CAAC,GAAGoB,GAAe,GAAGD,CAAiB,GAAG,EAAI;AAAA,YAAA,CAC/E,EAAE,MAAM,CAAK9D,MAAA;AACV,sBAAQ,MAAMA,CAAC;AAAA,YAClB,CAAA,EACI,QAAQ,MAAMkD,EAAa,EAAK,CAAC;AAAA,UAAA;AAAA,UAiBrB,UAAA;AAAA,YAAAD,sBAAagB,IAAiB,EAAA,MAAM,QAAQ,CAAA,sBAAMC,IAAe,EAAA;AAAA,YAAG;AAAA,UAAA;AAAA,QAAA;AAAA,MAEzE;AAAA,IAAA,GACR;AAAA,IAEA,gBAAAxE,EAACyE,IAAM,EAAA,WAAU,WAEb,UAAA;AAAA,MAAA,gBAAArF;AAAA,QAACsF;AAAA,QAAA;AAAA,UAAe,aAAazB;AAAA,UACb,UAAU;AAAA,UACV,OAAOlF,EAAO;AAAA,UACd,UAAAyE;AAAA,UACA,MAAM;AAAA,UACN,YAAAkB;AAAA,UACA,mBAAmBN;AAAA,UACnB,kBAAkB;AAAA,UAClB,eAAe,CAAClC,MAAUlD,EAAciF,GAAgB/B,CAAK;AAAA,UAC7D,iBAAiB,EAAE,IAAI,IAAI,OAAO,GAAG;AAAA,QAAA;AAAA,MAAE;AAAA,MAEvD,gBAAA9B;AAAA,QAACuF;AAAA,QAAA;AAAA,UAAgB,OAAOtB;AAAA,UACP,MAAMA,MAAoB;AAAA,UAC1B,gBAAAJ;AAAA,UACA,SAAS,MAAMK,EAAmB,MAAS;AAAA,QAAA;AAAA,MAAE;AAAA,IAAA,GAClE;AAAA,EACJ,EAAA,CAAA;AAER;AAaA,MAAMQ,KAAYhG,EAAM;AAAA,EACpB,SAA2B;AAAA,IACI,OAAA+C;AAAA,IACA,gBAAgB+D;AAAA,IAChB,gBAAA3B;AAAA,IACA,WAAA4B;AAAA,IACA,cAAAC;AAAA,IACA,UAAAtC;AAAA,IACA,eAAAuC;AAAA,IACA,YAAAlB;AAAA,EAAA,GACe;AAEpC,UAAA;AAAA,MACF,QAAA9F;AAAA,MACA,cAAAE;AAAA,MACA,QAAAE;AAAA,MACA,eAAAH;AAAA,MACA,SAAAE;AAAA,QACAK,EAAsB,GAEpByG,IAAoBlH,EAAM,OAAO,CAACiB,EAAMhB,GAAQ,GAAGkF,CAAc,IAAIpC,CAAK,MAAM,CAAC,GACjFqC,IAAiB0B,KAAYI,EAAkB,SAE/CC,IAAUlG,EAAMhB,GAAQ,GAAGkF,CAAc,IAAIpC,CAAK,MAAM,GACxDqE,IAAanG,EAAMhB,GAAQ,GAAGkF,CAAc,IAAIpC,CAAK,SAAS,GAE9DsE,IAAkBrH,EAAM,OAAOoH,CAAU;AAE/CpH,WAAAA,EAAM,UAAU,MAAM;AAClB,OAAKqH,EAAgB,YAAYF,KAAW,CAACA,MAAY/B,KACrDlF,EAAc,GAAGiF,CAAc,IAAIpC,CAAK,QAAQqE,CAAU,GAE9DC,EAAgB,UAAUD;AAAA,IAAA,GAC3B,CAACA,CAAU,CAAC,GAIP,gBAAAlF,EAAAoF,GAAA,EAAA,UAAA;AAAA,MAAC,gBAAApF,EAAA,OAAA,EAAI,WAAW,2CACZ,UAAA;AAAA,QAAA,gBAAAZ;AAAA,UAACqB;AAAA,UAAA;AAAA,YAAM,MAAM,GAAGwC,CAAc,IAAIpC,CAAK;AAAA,YAChC,IAAIH;AAAA,YACJ,WAAW;AAAA,YACX,UAAQ;AAAA,YACR,UAAA8B;AAAA,YACA,MAAK;AAAA,YACL,WAAAqC;AAAA,YACA,cAAa;AAAA,YACb,cAAcE,KAAkB,gBAAA3F,EAAAoF,IAAA,EAAgB,MAAM,SAAQ;AAAA,YAC9D,OAAO,EAAQX,GAAY;AAAA,UAAK;AAAA,QAAE;AAAA,QAExC,CAACrB,KACG,gBAAApD,EAAAiG,IAAA,EAAM,OAAO,SAAS,WAAW,CAACxB,GAAY,IAC3C,UAAA,gBAAAzE;AAAA,UAACe;AAAA,UAAA;AAAA,YACG,MAAK;AAAA,YACL,cAAW;AAAA,YACX,WAAW;AAAA,YACX,SAAS,MAAM2E,EAAa;AAAA,YAC5B,UAAA,gBAAA1F,EAAC4B,IAAa,EAAA,MAAM,QAAQ,CAAA;AAAA,UAAA;AAAA,QAAA,GAEpC;AAAA,MAAA,GAER;AAAA,MAEC6C,GAAY,SAAS,gBAAAzE;AAAA,QAACa;AAAA,QAAA;AAAA,UAAW,SAAS;AAAA,UACT,WAAW;AAAA,UACxC,UAAY4D,GAAA;AAAA,QAAA;AAAA,MACjB;AAAA,MAECA,GAAY,MAAM,gBAAAzE;AAAA,QAACa;AAAA,QAAA;AAAA,UAAW,SAAS;AAAA,UACT,WAAW;AAAA,UACrC,UAAY4D,GAAA;AAAA,QAAA;AAAA,MACjB;AAAA,IAEJ,EAAA,CAAA;AAAA,EACR;AAAA,EACA,SAAkByB,GAA2BC,GAA2B;AAC7D,WAAAD,EAAU,UAAUC,EAAU,SACjCD,EAAU,mBAAmBC,EAAU,kBACvCD,EAAU,mBAAmBC,EAAU,kBACvCD,EAAU,kBAAkBC,EAAU,iBACtCC,GAAMF,EAAU,YAAYC,EAAU,UAAU,KAChDD,EAAU,cAAcC,EAAU;AAAA,EAC1C;AACJ;AAEA,SAASZ,GAAgB;AAAA,EACI,OAAA9D;AAAA,EACA,MAAA4E;AAAA,EACA,SAAAC;AAAA,EACA,gBAAAzC;AACJ,GAKtB;AAEO,QAAA;AAAA,IACF,QAAA9E;AAAA,MACAI,EAAsB,GAEpBoH,IAAU9E,MAAU,SAAY9B,EAAMZ,GAAQ,GAAG8E,CAAc,IAAIpC,CAAK,MAAM,IAAI;AACjF,SAAA,gBAAAb;AAAA,IAACsB;AAAA,IAAA;AAAA,MACJ,UAAS;AAAA,MACT,mBAAgB;AAAA,MAChB,MAAAmE;AAAA,MACA,cAAc,CAACA,MAAUA,IAAmB,SAAZC;MAGhC,UAAA;AAAA,QAAA,gBAAAtG,EAACwG,IACI,EAAA,UAAA/E,MAAU,UACP,gBAAAb,EAAC,OACG,EAAA,UAAA;AAAA,UAAA,gBAAAZ;AAAA,YAACqB;AAAA,YAAA;AAAA,cAAM,MAAM,GAAGwC,CAAc,IAAIpC,CAAK;AAAA,cAChC,IAAIH;AAAA,cACJ,UAAQ;AAAA,cACR,OAAO;AAAA,cACP,MAAK;AAAA,cACL,cAAa;AAAA,cACb,OAAO,EAAQiF;AAAA,YAAO;AAAA,UAAE;AAAA,4BAE9BpF,GAAa,EAAA,OAAO,EAAQoF,GACxB,eAAW,kCAChB;AAAA,QAAA,EAAA,CACJ,EACR,CAAA;AAAA,0BAECE,IACG,EAAA,UAAA,gBAAAzG;AAAA,UAAC4E;AAAA,UAAA;AAAA,YACG,WAAS;AAAA,YACT,SAAQ;AAAA,YACR,SAAS0B;AAAA,YACT,OAAM;AAAA,YAAU,UAAA;AAAA,UAAA;AAAA,QAAA,GAGxB;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGR;AC9VO,SAASI,GAAc;AAAA,EACI,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAA1D;AAAA,EACA,MAAA2D,IAAO;AAAA,EACP,oBAAAC;AACJ,GAM3B;AAEC,QAAMC,IAAmB,gBAAAjH;AAAA,IAACiC;AAAA,IAAA;AAAA,MACtB,OAAA4E;AAAA,MACA,MAAAE;AAAA,MACA,UAAU;AAAA,MACV,OAAOJ,EAAM;AAAA,MACb,UAAAvD;AAAA,MACA,oBAAA4D;AAAA,MACA,eAAe,CAACE,MAA2BN,EAAK,cAAcD,EAAM,MAAMO,CAAO;AAAA,IAAA;AAAA,EAAA;AAEjF,SAAAJ,IAEI,gBAAA9G;AAAA,IAACc;AAAA,IAAA;AAAA,MACG,OAAOgG;AAAA,MACN,UAAAG;AAAA,IAAA;AAAA,EAAA,IAGNA;AACX;AChCgB,SAAAE,GAA0B,EAAE,UAAA/D,KAGzC;AAEC,QAAM,EAAE,QAAAzE,GAAQ,cAAAE,EAAa,IAAIM,EAAU,GAErCiI,IAAqB,uBACrBC,IAA4B;AAIlC,SAEQ,gBAAAzG,EAAAoF,GAAA,EAAA,UAAA;AAAA,IAAC,gBAAAhG,EAAA,OAAA,EAAI,WAAW,cACZ,UAAA,gBAAAA;AAAA,MAACqB;AAAA,MAAA;AAAA,QAAM,MAAM+F;AAAA,QACN,MAAK;AAAA,QACP,UAAC,CAAA,EAAE,OAAAT,GAAO,MAAAC,QACA,gBAAA5G;AAAA,UAAC0G;AAAA,UAAA;AAAA,YACJ,UAAAtD;AAAA,YACA,OAAO;AAAA,YACP,SAAS;AAAA,YACT,MAAAwD;AAAA,YACA,OAAAD;AAAA,UAAA;AAAA,QAAA;AAAA,MACR;AAAA,IAAA,GAER;AAAA,IAEA,gBAAA3G,EAAC,OAAI,EAAA,WAAW,cAEZ,UAAA,gBAAAA;AAAA,MAACqB;AAAA,MAAA;AAAA,QAAM,MArBM;AAAA,QAsBN,MAAK;AAAA,QACP,UAAC,CAAA,EAAE,OAAAsF,GAAO,MAAAC,QACA,gBAAA5G;AAAA,UAAC0G;AAAA,UAAA;AAAA,YACJ,UAAAtD;AAAA,YACA,OAAO;AAAA,YACP,SAAS;AAAA,YACT,MAAAwD;AAAA,YACA,OAAAD;AAAA,UAAA;AAAA,QAAA;AAAA,MACR;AAAA,IAAA,GAER;AAAA,IAEChH,EAAMhB,GAAQyI,CAAkB,KAAM,gBAAApH,EAAA,OAAA,EAAI,WAAW,eAClD,UAAA,gBAAAA;AAAA,MAACsB;AAAA,MAAA;AAAA,QACG,UAAA8B;AAAA,QACA,OAAOzD,EAAMhB,GAAQ0I,CAAyB;AAAA,QAC9C,OAAO;AAAA,QACP,MAAMA;AAAA,QACN,MAAK;AAAA,QACL,UAAUxI;AAAA,MAAA;AAAA,IAAA,GAClB;AAAA,EACJ,EAAA,CAAA;AAER;ACpDO,SAASyI,GAAyB;AAAA,EACI,QAAAC;AAAA,EACA,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,KAAAC;AAAA,EACA,KAAAC;AAAA,EACA,MAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAzE;AAAA,EACA,YAAA1C;AACJ,GAUtC;AAEO,QAAA;AAAA,IACF,QAAA/B;AAAA,IACA,cAAAE;AAAA,IACA,QAAAE;AAAA,MACAI,EAAU,GAER2I,IAAmB,qBACnBC,IAAgB,kBAChBC,IAAgB,kBAChBC,IAAiB,mBACjBC,IAAoB,sBACpBC,IAAsB,wBACtBC,IAAsB,wBAEtBC,IAAe1I,EAAMZ,GAAQmJ,CAAiB,GAE9CI,IAAe3I,EAAMhB,GAAQuJ,CAAiB,GAC9CK,IAAqB,OAAOD,KAAiB,WAAWA,IAAeE,GAAgBF,CAAY;AAErG,SAAA,gBAAA1H,EAAC,OAAI,EAAA,WAAW,2BAEZ,UAAA;AAAA,IAAA,gBAAAZ,EAACmH,MAA0B,UAAA/D,GAAmB;AAAA,IAE9C,gBAAAxC,EAAC,OAAI,EAAA,WAAW,uCAEX,UAAA;AAAA,MAAa4G,KAAA,gBAAAxH,EAAC,OAAI,EAAA,WAAW,cAC1B,UAAA,gBAAAA;AAAA,QAACqB;AAAA,QAAA;AAAA,UAAM,MAAM8G;AAAA,UACN,MAAK;AAAA,UACP,UAAC,CAAA,EAAE,OAAAxB,GAAO,MAAAC,QACA,gBAAA5G;AAAA,YAAC0G;AAAA,YAAA;AAAA,cACJ,OAAO;AAAA,cACP,UAAAtD;AAAA,cACA,MAAAwD;AAAA,cACA,OAAAD;AAAA,YAAA;AAAA,UAAA;AAAA,QACR;AAAA,MAAA,GAER;AAAA,MAECkB,KAAa,gBAAA7H,EAAC,OAAI,EAAA,WAAW,cAC1B,UAAA,gBAAAA;AAAA,QAACqB;AAAA,QAAA;AAAA,UAAM,MAAM+G;AAAA,UACN,MAAK;AAAA,UACP,UAAC,CAAA,EAAE,OAAAzB,GAAO,MAAAC,QACA,gBAAA5G;AAAA,YAAC0G;AAAA,YAAA;AAAA,cACJ,OAAO;AAAA,cACP,UAAAtD;AAAA,cACA,MAAAwD;AAAA,cACA,OAAAD;AAAA,YAAA;AAAA,UAAA;AAAA,QACR;AAAA,MAAA,GAER;AAAA,MAECiB,KAAQ,gBAAA5H,EAAC,OAAI,EAAA,WAAW,cACrB,UAAA,gBAAAA;AAAA,QAACqB;AAAA,QAAA;AAAA,UAAM,MAAM4G;AAAA,UACN,MAAK;AAAA,UACP,UAAC,CAAA,EAAE,OAAAtB,GAAO,MAAAC,QACA,gBAAA5G;AAAA,YAAC0G;AAAA,YAAA;AAAA,cACJ,OAAO;AAAA,cACP,UAAAtD;AAAA,cACA,MAAAwD;AAAA,cACA,OAAAD;AAAA,YAAA;AAAA,UAAA;AAAA,QACR;AAAA,MAAA,GAER;AAAA,IAAA,GAEJ;AAAA,IAEA,gBAAA/F,EAAC,OAAI,EAAA,WAAW,uCACX,UAAA;AAAA,MAAU2G,KAAA,gBAAAvH,EAAC,OAAI,EAAA,WAAW,cACvB,UAAA,gBAAAA;AAAA,QAACsB;AAAA,QAAA;AAAA,UACG,OAAO3B,EAAMhB,GAAQmJ,CAAgB;AAAA,UACrC,OAAO;AAAA,UACP,MAAMA;AAAA,UACN,MAAK;AAAA,UACL,MAAK;AAAA,UAEL,UAAA1E;AAAA,UACA,UAAUvE;AAAA,QAAA;AAAA,MAAA,GAClB;AAAA,MAEC8I,KAAO,gBAAA3H,EAAC,OAAI,EAAA,WAAW,cACpB,UAAA,gBAAAA;AAAA,QAACsB;AAAA,QAAA;AAAA,UAAmB,OAAO3B,EAAMhB,GAAQoJ,CAAa;AAAA,UAClC,OAAO;AAAA,UACP,MAAMA;AAAA,UACN,MAAK;AAAA,UACL,MAAK;AAAA,UAEL,UAAA3E;AAAA,UACA,UAAUvE;AAAA,QAAA;AAAA,MAAA,GAClC;AAAA,MAEC6I,KAAO,gBAAA1H,EAAC,OAAI,EAAA,WAAW,cACpB,UAAA,gBAAAA;AAAA,QAACsB;AAAA,QAAA;AAAA,UAAmB,OAAO3B,EAAMhB,GAAQqJ,CAAa;AAAA,UAClC,OAAO;AAAA,UACP,MAAMA;AAAA,UACN,MAAK;AAAA,UACL,MAAK;AAAA,UAEL,UAAA5E;AAAA,UACA,UAAUvE;AAAA,QAAA;AAAA,MAAA,GAClC;AAAA,IAAA,GAEJ;AAAA,IAEC4I,KAAW,gBAAA7G,EAAC,OAAI,EAAA,WAAW,eACxB,UAAA;AAAA,MAAA,gBAAAZ;AAAA,QAACqB;AAAA,QAAA;AAAA,UAAM,MAAM6G;AAAA,UACN,IAAI5G;AAAA,UACJ,OAAO;AAAA,UACP,MAAK;AAAA,UACL,UAAA8B;AAAA,UACA,OAAOmF;AAAA,UACP,OAAO,EAAQF;AAAA,QAAY;AAAA,MAAE;AAAA,MACpC,gBAAArI,EAACmB,KAAa,OAAO,EAAQkH,GACxB,UAAAA,IAAe,uBAAuB,iCAC3C;AAAA,IAAA,GACJ;AAAA,EAEJ,EAAA,CAAA;AAGR;AC/IO,SAASI,GAAwB;AAAA,EACI,KAAAf,IAAM;AAAA,EACN,KAAAC,IAAM;AAAA,EACN,UAAAvE;AACJ,GAIrC;AAEO,QAAA;AAAA,IACF,QAAAzE;AAAA,IACA,cAAAE;AAAA,MACAM,EAAU,GAER4I,IAAgB,kBAChBC,IAAgB;AAGlB,SAAA,gBAAApH,EAAC,OAAI,EAAA,WAAW,2BAEZ,UAAA;AAAA,IAAA,gBAAAZ,EAACmH,MAA0B,UAAA/D,GAAmB;AAAA,IAE7CuE,KAAO,gBAAA3H,EAAC,OAAI,EAAA,WAAW,cACpB,UAAA,gBAAAA;AAAA,MAACsB;AAAA,MAAA;AAAA,QAAmB,OAAO3B,EAAMhB,GAAQoJ,CAAa;AAAA,QAClC,UAAA3E;AAAA,QACA,OAAO;AAAA,QACP,MAAM2E;AAAA,QACN,MAAK;AAAA,QACL,MAAK;AAAA,QACL,UAAUlJ;AAAA,MAAA;AAAA,IAAA,GAClC;AAAA,IACC6I,KAAO,gBAAA1H,EAAC,OAAI,EAAA,WAAW,cACpB,UAAA,gBAAAA;AAAA,MAACsB;AAAA,MAAA;AAAA,QAAmB,OAAO3B,EAAMhB,GAAQqJ,CAAa;AAAA,QAClC,UAAA5E;AAAA,QACA,OAAO;AAAA,QACP,MAAM4E;AAAA,QACN,MAAK;AAAA,QACL,MAAK;AAAA,QACL,UAAUnJ;AAAA,MAAA;AAAA,IAAA,GAClC;AAAA,EACJ,EAAA,CAAA;AAER;AC7CO,SAAS6J,GAAgB;AAAA,EACI,UAAAC;AACJ,GAA0B;AAGlD,SAAA,gBAAA3I;AAAA,IAAC2B;AAAA,IAAA;AAAA,MACG,mBAAmB;AAAA,MACnB,SAAS;AAAA,MACT,WAAU;AAAA,MACV,OACI,gBAAAf,EAAC,OAAI,EAAA,WAAU,+BACX,UAAA;AAAA,QAAA,gBAAAZ,EAAC4I,IAAQ,EAAA;AAAA,QACT,gBAAA5I;AAAA,UAACa;AAAA,UAAA;AAAA,YAAW,SAAS;AAAA,YACT,WAAU;AAAA,YAAO,UAAA;AAAA,UAAA;AAAA,QAE7B;AAAA,MAAA,GACJ;AAAA,MAGH,UAAA8H;AAAA,IAAA;AAAA,EAAA;AAIb;ACjBO,SAASE,GAAkB;AAAA,EACI,aAAAC;AAAA,EACA,WAAA3F;AAAA,EACA,UAAAC;AAAA,EACA,YAAA1C;AAAA,EACA,oBAAA2C;AAAA,EACA,SAAAC;AACJ,GAO/B;AAEO,QAAA;AAAA,IACF,QAAA3E;AAAA,IACA,eAAAoK;AAAA,IACA,eAAAnK;AAAA,MACAO,EAA0B,GAExB6J,IAAkBC,MAElBpF,IAAiBiF,IAAc,kBAAkB,cAEjDI,IAAevJ,EAAMhB,GAAQ,cAAc,GAE3CwK,IAAmBxJ,EAAMhB,GAAQkF,CAAc,GAC/Cb,IAAgCoG,GAAQ,MACtC,CAACD,KAAoB,OAAOA,KAAqB,YAC1C,KACJE,GAAkBF,CAAgB,KAAK,IAC/C,CAACA,CAAgB,CAAC;AAkBrB,SAEQ,gBAAAvI,EAAAoF,GAAA,EAAA,UAAA;AAAA,IAAC,gBAAAhG,EAAA,OAAA,EAAI,WAAW,eACZ,UAAA,gBAAAA;AAAA,MAAC+C;AAAA,MAAA;AAAA,QAAS,YAAAC;AAAA,QACA,WAAAG;AAAA,QACA,UAAAC;AAAA,QACA,oBAAAC;AAAA,QACA,SAAS,CAACK,MAAa;AACL,UAAAqF,EAAAlF,GAAgBH,IAAW,8CAA8C,MAAS;AAAA,QACpG;AAAA,QACA,SAASJ,IACH,MAAMA,IACH,KAAK,CAAAgG,MAAOA,EAAI,IAAI,CAAAC,MAAK5K,EAAO,MAAMgB,EAAM4J,GAAG5K,EAAO,EAAE,CAAC,EAAE,OAAO,OAAO,CAAC,IAC7E;AAAA,QACN,iBA9BE,CAACmD,MAA6B;AAClD,cAAKnD,MAELC,EAAciF,GAAgB/B,CAAK,GAC/B,CAACgH,IAAa;AACd,kBAAMU,IAAU1H,EAAM,OAAO,CAAAE,MAAK,EAAQA,GAAG,EAAG,EAAE,IAAI,CAACA,MAAWA,EAAE,EAAE;AACtE,YAAIkH,KAAgB,CAACM,EAAQ,SAASN,CAAY,MAC9CtK,EAAc,gBAAgB,MAAS,GACvCoK,EAAgB,KAAK;AAAA,cACjB,MAAM;AAAA,cACN,SAAS;AAAA,YAAA,CACZ;AAAA,UAET;AAAA,QAAA;AAAA,MAiBkB;AAAA,IAAA,GACd;AAAA,IAEC,gBAAAhJ,EAAA,OAAA,EAAI,WAAW,eAEZ,4BAAC0I,IACI,EAAA,UAAA;AAAA,MAAA,CAACI,KACE,gBAAA9I;AAAA,QAACsH;AAAA,QAAA;AAAA,UAAyB,UAAAlE;AAAA,UACA,YAAA1C;AAAA,QAAA;AAAA,MAAuB;AAAA,MACpDoI,KACI,gBAAA9I,EAAAyI,IAAA,EAAwB,UAAArF,EAAmB,CAAA;AAAA,IAAA,EAAA,CACpD,EAEJ,CAAA;AAAA,IAEC,CAAC0F,KAAgB,gBAAA9I,EAAA,OAAA,EAAI,WAAW,eAE7B,UAAA,gBAAAA;AAAA,MAAC6B;AAAA,MAAA;AAAA,QACG,UAAAuB;AAAA,QACA,UAAU;AAAA,QACV,eAAe,CAACtB,MAAkB;AAC9B,UAAAlD,EAAc,gBAAgBkD,CAAK;AAAA,QACvC;AAAA,QACA,OAAO;AAAA,QACP,OAAOoH,KAAgB;AAAA,QACtB,UAAAlG,EACI,OAAO,CAACS,MAAc,EAAQA,GAAW,EAAG,EAC5C,IAAI,CAACA,MACF,gBAAAzD;AAAA,UAAC+B;AAAA,UAAA;AAAA,YACW,OAAO0B,EAAU,IAAI,SAAS;AAAA,YACrC,UAAUA,EAAA;AAAA,UAAA;AAAA,UAFEA,EAAU;AAAA,QAAA,CAI9B;AAAA,MAAA;AAAA,IAAA,GAGb;AAAA,EACJ,EAAA,CAAA;AAER;AC/FA,MAAMgG,KAAoC;AAAA,EACtC,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,UAAU;AACd;AAEO,SAASC,GAAqB;AAAA,EACI,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAxG;AACJ,GAIlC;AAEO,QAAA;AAAA,IACF,QAAAzE;AAAA,IACA,eAAAC;AAAA,MACAO,EAAU,GAER0K,IAAkBF,IAAW,eAAe,WAC5CG,IAAgB,GAAGD,CAAe,kBAGlCE,IAAW,GAAGF,CAAe,aAC7BG,IAAc,GAAGH,CAAe,gBAChCI,IAAW,GAAGJ,CAAe,aAE7BK,IAAgBvK,EAAMhB,GAAQoL,CAAQ,KAAK,iBAC3CI,IAAmBxK,EAAMhB,GAAQqL,CAAW,KAAK,KAEjDI,IAAczK,EAAMhB,GAAQmL,CAAa,GACzCO,IAAuC,MAAM,QAAQD,CAAW,IAAIA,IAAc,QAClFE,IAAuB,CAACD,KAAkBA,EAAe,WAAW,GAEpEE,IAAoB,CAACzI,MAAoB;AAC3C,IAAKA,IACIA,EAAM,SAAS,KAAK,KACpBA,EAAM,UAAU,OAAO,KAAK2H,EAAS,EAAE,SADhB7K,EAAckL,GAAe,MAAS,IAE7DQ,IACL1L,EAAckL,GAAe,OAAO,KAAKL,EAAS,EAAE,OAAO,CAACzH,MAAM,CAACF,EAAM,SAASE,CAAC,CAAC,CAAC,IACpFpD,EAAckL,GAAehI,CAAK,IAL3BlD,EAAckL,GAAe,MAAS;AAAA,EAKX,GAGrCU,IAAsB,OAAON,KAAkB,YAC/CO,IAAyB,OAAON,KAAqB;AAE3D,SAGQ,gBAAAvJ,EAAAoF,GAAA,EAAA,UAAA;AAAA,IAAC,gBAAAhG,EAAA,OAAA,EAAI,WAAW,eAEZ,UAAA,gBAAAA;AAAA,MAAC2B;AAAA,MAAA;AAAA,QACG,OACI,gBAAAf,EAAC,OAAI,EAAA,WAAU,+BACX,UAAA;AAAA,UAAA,gBAAAZ,EAAC0K,IAAc,EAAA;AAAA,UACf,gBAAA1K;AAAA,YAACa;AAAA,YAAA;AAAA,cAAW,SAAS;AAAA,cACT,WAAU;AAAA,cAAO,UAAA;AAAA,YAAA;AAAA,UAE7B;AAAA,QAAA,GACJ;AAAA,QAGJ,UAAA,gBAAAD,EAAC,OAAI,EAAA,WAAW,+BAEZ,UAAA;AAAA,UAAC,gBAAAZ,EAAA,OAAA,EAAI,WAAW,eAEZ,UAAA,gBAAAY;AAAA,YAAC+J;AAAA,YAAA;AAAA,cACG,UAAAvH;AAAA,cACA,MAAM0G;AAAA,cACN,OAAOO,KAAkB,CAAC;AAAA,cAC1B,oBAAoBE;AAAA,cACpB,OAAOD,IAAuB,SAAY;AAAA,cAC1C,cAAc,CAACM,MACP,CAACA,KAAYA,EAAS,WAAW,IAAU,2BACxCA,EAAS,IAAI,CAAC5I,MAAcyH,GAAUzH,CAAC,CAAC,EAC1C,OAAO,CAACA,MAAc,EAAQA,CAAE,EAChC,KAAK,IAAI;AAAA,cAGlB,UAAA;AAAA,gBAAA,gBAAApB,EAACiK,IAA4B,EAAA,OAAO,OAAO,WAAW,2BAClD,UAAA;AAAA,kBAAA,gBAAA7K;AAAA,oBAAC8K;AAAA,oBAAA;AAAA,sBACG,SAAS,CAACT;AAAA,oBAAA;AAAA,kBAAe;AAAA,kBAAE;AAAA,gBAAA,EAAA,GAFb,KAItB;AAAA,gBAEC,OAAO,QAAQZ,EAAS,EAAE,IAAI,CAAC,CAAC3H,GAAO+E,CAAK,MACzC,gBAAAjG,EAACiK,IAA4B,EAAA,OAAA/I,GAAc,WAAW,2BAClD,UAAA;AAAA,kBAAA,gBAAA9B;AAAA,oBAAC8K;AAAA,oBAAA;AAAA,sBACG,SAASR,KAAwBD,EAAe,QAAQvI,CAAK,IAAI;AAAA,oBAAA;AAAA,kBAAG;AAAA,kBACvE,gBAAA9B,EAAA,OAAA,EAAI,WAAW,aACX,UACL6G,GAAA;AAAA,kBACA,gBAAA7G;AAAA,oBAAC4E;AAAA,oBAAA;AAAA,sBAAO,MAAM;AAAA,sBACN,SAAS;AAAA,sBACT,SAAS,CAAC1D,OACNA,EAAE,eAAe,GACjBA,EAAE,gBAAgB,GACXtC,EAAckL,GAAe,CAAChI,CAAK,CAAC;AAAA,sBAC5C,UAAA;AAAA,oBAAA;AAAA,kBAEX;AAAA,gBAAA,EAAA,GAdkBA,CAetB,CACH;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA,GAGT;AAAA,UAEA,gBAAA9B,EAAC,OAAI,EAAA,WAAW,eACZ,UAAA,gBAAAA;AAAA,YAACqB;AAAA,YAAA;AAAA,cAAM,MAAM0I;AAAA,cACN,IAAIzI;AAAA,cACJ,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAUkJ,KAAuBpH;AAAA,cACjC,OAAOoH,IAAsB,MAAMN;AAAA,YAAA;AAAA,UAAA,GAE9C;AAAA,UACA,gBAAAtJ,EAAC,OAAI,EAAA,WAAW,eACZ,UAAA;AAAA,YAAA,gBAAAZ;AAAA,cAACqB;AAAA,cAAA;AAAA,gBAAM,MAAM2I;AAAA,gBACN,IAAI1I;AAAA,gBACJ,OAAO;AAAA,gBACP,UAAUmJ,KAA0BrH;AAAA,gBACpC,MAAM;AAAA,gBACN,OAAOqH,IAAyB,MAAMN;AAAA,cAAA;AAAA,YAC7C;AAAA,YACC,gBAAAvJ,EAAAC,GAAA,EAAW,SAAS,WAAW,WAAW,oBACvC,UAAA;AAAA,cAAA,gBAAAb,EAAC,OAAE,UAEyB,mFAAA,CAAA;AAAA,gCAC3B,MACG,EAAA,UAAA;AAAA,gBAAA,gBAAAA,EAAC,QAAI,UAA0C,0CAAA,CAAA;AAAA,gBAC/C,gBAAAA,EAAC,QAAI,UAA4D,4DAAA,CAAA;AAAA,gBACjE,gBAAAA,EAAC,QAAI,UAA8C,8CAAA,CAAA;AAAA,gBACnD,gBAAAA,EAAC,QAAI,UAAgC,gCAAA,CAAA;AAAA,gBACrC,gBAAAA,EAAC,QAAI,UAAmC,mCAAA,CAAA;AAAA,gBACxC,gBAAAA,EAAC,QAAI,UAA+B,+BAAA,CAAA;AAAA,gBACpC,gBAAAA,EAAC,QAAI,UAAsD,sDAAA,CAAA;AAAA,cAAA,GAC/D;AAAA,YAAA,GACJ;AAAA,YAEA,gBAAAA;AAAA,cAACqB;AAAA,cAAA;AAAA,gBAAM,MAAM4I;AAAA,gBACN,MAAK;AAAA,gBACP,UAAC,CAAA,EAAE,OAAAtD,GAAO,MAAAC,QACA,gBAAA5G;AAAA,kBAAC0G;AAAA,kBAAA;AAAA,oBACJ,OAAO;AAAA,oBACP,UAAUkD,KAAYxG;AAAA,oBACtB,MAAAwD;AAAA,oBACA,OAAAD;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACR;AAAA,YACJ;AAAA,8BAEC9F,GAAW,EAAA,SAAS,WAAW,WAAW,oBAAoB,UAM/D,+JAAA;AAAA,UAAA,GACJ;AAAA,QAAA,GACJ;AAAA,MAAA;AAAA,IAAA,GAGR;AAAA,IAEC,gBAAAb,EAAA,OAAA,EAAI,WAAW,eAEZ,4BAAC0I,IACI,EAAA,UAAA;AAAA,MAAC,CAAAiB,uBAAa,OAAI,EAAA,WAAW,2BAC1B,UAAC,gBAAA3J,EAAAmH,IAAA,EAA0B,UAAA/D,GAAmB,EAClD,CAAA;AAAA,MACCuG,uBAAa,OAAI,EAAA,WAAW,eACzB,UAAC,gBAAA3J,EAAAyI,IAAA,EAAwB,UAAArF,GAAmB,EAChD,CAAA;AAAA,IAAA,EAAA,CACJ,EAEJ,CAAA;AAAA,EACJ,EAAA,CAAA;AAER;ACrMO,SAAS2H,GAAiBC,GAA0D;AAGvF,MAFIC,GAAkBD,CAAQ,KAE1BC,GAAkBD,CAA6B;AACxC,WAAA;AACN;AACD,UAAME,IAAYF;AAClB,WAAIE,EAAU,aAAa,WAAW,OAAOA,EAAU,MAAO,cAErDA,EAAU,aAAa,WAAW,MAAM,QAAQA,EAAU,EAAE,IAD1D,KAGJ,EAAQA,EAAU;AAAA,EAC7B;AACJ;AAEO,SAASC,GAA4BC,GAAmD;AAC3F,SAAO,OAAO,QAAQA,CAAU,EAC3B,OAAO,CAAC,CAACC,GAAGL,CAAQ,MAAMD,GAAiBC,CAAQ,CAAC,EACpD,IAAI,CAAC,CAACM,GAAKC,CAAiB,MAAM;AAC/B,UAAMP,IAAWO;AACb,QAACR,GAAiBC,CAAQ;AAEnB,aAAAA,EAAS,aAAa,SAASA,EAAS,aACxC;AAAA,QACH,CAACM,CAAG,GAAG;AAAA,UACH,GAAGN;AAAA,UACH,YAAYG,GAA4BH,EAAS,UAAkC;AAAA,QACvF;AAAA,MAAA,IAGG,EAAE,CAACM,CAAG,GAAGN;EACpB,CACH,EACA,OAAO,CAAC9J,MAAM,EAAQA,CAAE,EACxB,OAAO,CAACsK,GAAGC,OAAO,EAAE,GAAGD,GAAG,GAAGC,EAAE,IAAI,CAAA,CAAE;AAC9C;ACfO,SAASC,GAAqB;AAAA,EACI,UAAAV;AAAA,EACA,SAAAW;AAAA,EACA,UAAAjI;AAAA,EACA,aAAAkI;AAAA,EACA,mBAAAC;AAAA,EACA,UAAAjB;AACJ,GAOlC;AAEO,QAAA,EAAE,iBAAAkB,MAAoBC,MAEtBC,IAAiBC,GAAejB,GAAUc,CAAe;AAC9C,EAACf,GAAiBC,CAAQ;AAE3C,QAAMkB,IAAmBxI,IACnB,qGACCkH,IAAW,mBAAmB;AAElC,SAAAlH,KACK,QAAA,IAAI,wBAAwBsH,CAAQ,qBAEpCmB,IACJ,EAAA,UAAA,gBAAAvL;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,SAAA+K;AAAA,MACA,WAAU;AAAA,MACV,UAAA;AAAA,QAAA,gBAAA3L,EAAC,SAAI,WAAW,OACZ,UAAC,gBAAAA,EAAAoM,IAAA,EAAoB,gBAAAJ,EAA+B,CAAA,GACxD;AAAA,QACA,gBAAApL;AAAA,UAACyE;AAAA,UAAA;AAAA,YACG,WAAWjE;AAAA,cACP;AAAA,cACA;AAAA,cACAiL;AAAA,cACAV,IAAUW,KAAqB;AAAA,cAC/B1B,IAAW2B,KAAoB;AAAA,cAC/B;AAAA,cACAL;AAAA,YACJ;AAAA,YAGA,UAAA;AAAA,cAAC,gBAAAtL,EAAA,OAAA,EAAI,WAAU,wBAEV,UAAA;AAAA,gBAAAgL,uBACIO,IACG,EAAA,UAAA,gBAAAnM;AAAA,kBAACa;AAAA,kBAAA;AAAA,oBAAW,SAAQ;AAAA,oBACR,WAAU;AAAA,oBACV,WAAU;AAAA,oBACjB,UAAAmK,EAAS,OACJA,EAAS,OACT;AAAA,kBAAA;AAAA,gBAAA,GAGd;AAAA,gBAEJ,gBAAApK,EAAC,OAAI,EAAA,WAAU,8BACX,UAAA;AAAA,kBAAA,gBAAAZ,EAACmM,IACG,EAAA,UAAA,gBAAAnM;AAAA,oBAACa;AAAA,oBAAA;AAAA,sBAAW,WAAU;AAAA,sBACV,SAAS+K,IAAc,UAAU;AAAA,sBACjC,WAAU;AAAA,sBACV,OAAM;AAAA,sBACb,UAAgBI,GAAA;AAAA,oBAAA;AAAA,kBAAA,GAEzB;AAAA,oCACCG,IACG,EAAA,UAAA,gBAAAnM;AAAA,oBAACa;AAAA,oBAAA;AAAA,sBAAW,SAAQ;AAAA,sBACR,WAAU;AAAA,sBACV,OAAM;AAAA,sBACb,UAASmK,EAAA;AAAA,oBAAA;AAAA,kBAAA,GAElB;AAAA,gBAAA,GAEJ;AAAA,cAAA,GACJ;AAAA,cAECa,KAAqB,gBAAA7L,EAACa,GAAW,EAAA,SAAS,UAAU,UAErD,QAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAER,EAAA,CAAA;AACJ;AAEO,SAAS2L,GAA2B;AAAA,EACI,MAAA9M;AAAA,EACA,UAAAkL;AAAA,EACA,SAAAe;AAAA,EACA,UAAAX;AACJ,GAKxC;AAEO,QAAA,EAAE,iBAAAc,MAAoBC,MAEtBC,IAAiB,CAACf,GAAkBD,CAAQ,KAAKA,IAAWiB,GAAejB,GAAUc,CAAe,IAAI;AAG1G,SAAA,gBAAAlL;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,SAAA+K;AAAA,MACA,WAAU;AAAA,MACV,UAAA;AAAA,QAAC,gBAAA/K,EAAA,OAAA,EAAI,WAAW,gBACX,UAAA;AAAA,UAAkBoL,KAAA,gBAAAhM,EAACoM,MAAoB,gBAAAJ,EAA+B,CAAA;AAAA,UACtE,CAACA,KAAkB,gBAAAhM;AAAA,YAAC;AAAA,YAAA;AAAA,cACjB,WAAW;AAAA,cACX,UAAC,gBAAAA,EAAAyM,IAAA,EAAc,OAAO,WAAW,MAAM,UAAS;AAAA,YAAA;AAAA,UACpD;AAAA,4BACCC,IAAiB,EAAA,OAAO,YAAY,MAAM,SAAS,WAAW,4BAA2B;AAAA,QAAA,GAC9F;AAAA,QACA,gBAAA1M;AAAA,UAACqF;AAAA,UAAA;AAAA,YACG,WAAWjE;AAAA,cACP;AAAA,cACAiL;AAAA,cACAV,IAAUW,KAAqB;AAAA,cAC/B1B,IAAW2B,KAAoB;AAAA,cAC/B;AAAA,cACA3B,IAAW,mBAAmB;AAAA,YAAoB;AAAA,YAGtD,UAAA,gBAAAhK,EAAC,OAAI,EAAA,WAAU,wBACX,UAAA;AAAA,cAAA,gBAAAZ;AAAA,gBAACa;AAAA,gBAAA;AAAA,kBAAW,SAAQ;AAAA,kBACR,WAAU;AAAA,kBACV,WAAU;AAAA,kBACjB,UAAAmK,GAAU,OACLA,EAAS,OACTtL;AAAA,gBAAA;AAAA,cAEV;AAAA,cAEA,gBAAAkB,EAAC,OAAI,EAAA,WAAU,8BACV,UAAA;AAAA,gBAAkBoL,KAAA,gBAAAhM;AAAA,kBAACa;AAAA,kBAAA;AAAA,oBAAW,WAAU;AAAA,oBACV,SAAS;AAAA,oBACT,WAAU;AAAA,oBACV,OAAM;AAAA,oBAChC,UAAgBmL,GAAA;AAAA,kBAAA;AAAA,gBACrB;AAAA,gBAEChB,KAAY,CAACC,GAAkBD,CAAQ,uBAAMmB,IAC1C,EAAA,UAAA,gBAAAnM;AAAA,kBAACa;AAAA,kBAAA;AAAA,oBAAW,SAAQ;AAAA,oBACR,WAAU;AAAA,oBACV,OAAM;AAAA,oBACb,UAASmK,EAAA;AAAA,kBAAA;AAAA,gBAAA,GAElB;AAAA,gBAECA,KAAYC,GAAkBD,CAAQ,uBAAMmB,IACzC,EAAA,UAAA,gBAAAnM;AAAA,kBAACa;AAAA,kBAAA;AAAA,oBAAW,SAAQ;AAAA,oBACR,WAAU;AAAA,oBACV,OAAM;AAAA,oBAAW,UAAA;AAAA,kBAAA;AAAA,gBAAA,GAGjC;AAAA,gBAEC,CAACmK,KAAY,gBAAAhL,EAACmM,IACX,EAAA,UAAA,gBAAAnM;AAAA,kBAACa;AAAA,kBAAA;AAAA,oBAAW,SAAQ;AAAA,oBACR,WAAU;AAAA,oBACV,OAAM;AAAA,oBAAW,UAAA;AAAA,kBAAA;AAAA,gBAAA,GAGjC;AAAA,cAAA,GAEJ;AAAA,YAAA,GAUJ;AAAA,UAAA;AAAA,QAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAEZ;AC7LO,MAAM8L,KAAejO,EAAM;AAAA,EAC9B,SAEG;AAAA,IACI,WAAA8D;AAAA,IACA,qBAAAoK;AAAA,IACA,iBAAAC;AAAA,IACA,YAAAzB;AAAA,IACA,iBAAiB0B;AAAA,IACjB,kBAAAC;AAAA,IACA,QAAAhO;AAAA,IACA,gBAAAiO;AAAA,IACA,kBAAAC;AAAA,IACA,WAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,oBAAAC;AAAA,EAAA,GAcJ;AAEC,UAAMC,IAAkBP,KAAuB,OAAO,KAAK1B,CAAU,GAE/DkC,IAAYC,EAAY,CAACC,MAAgB;AAEvC,UAAA,CAACA,EAAO;AACR;AAEE,YAAAC,IAAaD,EAAO,OAAO,OAC3BE,IAAWF,EAAO,YAAY,OAE9BG,IAAqB,MAAM,KAAKN,CAAe,GAC/C,CAACO,CAAO,IAAID,EAAmB,OAAOF,GAAY,CAAC;AACtC,MAAAE,EAAA,OAAOD,GAAU,GAAGE,CAAO,GAC1CZ,KACAA,EAAeW,GAAoBnL,CAAS;AAAA,IACjD,GAAA,CAACA,GAAWwK,GAAgBK,CAAe,CAAC;AAE/C,WAGQ,gBAAArN,EAAAgG,GAAA,EAAA,UAAA,gBAAAhG,EAAC6N,IAAgB,EAAA,WAAAP,GACb,UAAC,gBAAAtN,EAAA8N,IAAA,EAAU,aAAa,aAAatL,CAAS,IACzC,UAAC,CAAAuL,GAAmBC,MACjB,gBAAApN;AAAA,MAAC;AAAA,MAAA;AAAA,QACI,GAAGmN,EAAkB;AAAA,QACtB,KAAKA,EAAkB;AAAA,QACvB,WAAAb;AAAA,QACC,UAAA;AAAA,UAAAG,KAAmBA,EACf,IAAI,CAAC1K,GAAqBlB,MAAkB;AACnC,kBAAAuJ,IAAWI,EAAWzI,CAAW,GACjCsL,IAAkBlB,GAAkB,KAAK,CAASpG,MAAAA,EAAM,QAAQhE,CAAW;AAE7E,mBAAA,CAACqI,KAAY,CAACiD,KACN,QAAA,KAAK,YAAYtL,CAAW,8CAA8C,GAC3E,QAGP,gBAAA3C;AAAA,cAACkO;AAAA,cAAA;AAAA,gBAEG,aAAa,eAAe1L,CAAS,IAAIG,CAAW;AAAA,gBACpD,OAAAlB;AAAA,gBACC,UAAA,CAAC0M,GAAUC,wBAEHjC,IACG,EAAA,UAAA,gBAAAnM;AAAA,kBAACqO;AAAA,kBAAA;AAAA,oBACG,aAAA1L;AAAA,oBACA,mBAAmBqI;AAAA,oBACnB,iBAAAiD;AAAA,oBACA,UAAAE;AAAA,oBACA,QAAApP;AAAA,oBACA,WAAAyD;AAAA,oBACA,sBAAA2K;AAAA,oBACA,gBAAAH;AAAA,oBACA,kBAAAC;AAAA,oBACA,iBAAiBmB,EAAS,aAAa,SAAYvB;AAAA,oBACnD,qBAAAD;AAAA,oBACA,oBAAAQ;AAAA,kBAAA;AAAA,gBAER,EAAA,CAAA;AAAA,cAER;AAAA,cAtBK,eAAe5K,CAAS,IAAIG,CAAW;AAAA,YAAA;AAAA,UAuBhD,CACP,EAAE,OAAO,OAAO;AAAA,UAEpBoL,EAAkB;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAI/B,GACJ,EAEJ,CAAA;AAAA,EAER;AAAA,EACA,CAAC7H,GAAWC,MAAc;AAEtB,UAAMmI,IAAanI,EAAU,qBAAqB,WAAWA,EAAU,aAAa,EAAE,GAChFoI,IAAcrI,EAAU,qBAAqB,WAAWA,EAAU,aAAa,EAAE;AACvF,WAAIoI,KAAcC,IACP,KAEJnI,GAAMF,EAAU,YAAYC,EAAU,UAAU,KACnDD,EAAU,oBAAoBC,EAAU,mBACxCC,GAAMF,EAAU,kBAAkBC,EAAU,gBAAgB,KAC5DC,GAAMF,EAAU,QAAQC,EAAU,MAAM,KACxCC,GAAMF,EAAU,iBAAiBC,EAAU,eAAe;AAAA;AAAA,IAG1DD,EAAU,cAAcC,EAAU,aAClCD,EAAU,uBAAuBC,EAAU;AAAA,EACnD;AACJ;AAEO,SAASkI,GAAkB;AAAA,EACI,aAAA1L;AAAA,EACA,WAAAH;AAAA,EACA,mBAAA+I;AAAA,EACA,iBAAA0C;AAAA,EACA,UAAAE;AAAA,EACA,qBAAAvB;AAAA,EACA,QAAA7N;AAAA,EACA,iBAAA8N;AAAA,EACA,gBAAAG;AAAA,EACA,kBAAAC;AAAA,EACA,sBAAAE;AAAA,EACA,oBAAAC;AACJ,GAa/B;AAEO,QAAAoB,IAAqBrB,GAAsB,SAAS3K,IAAY,GAAGA,CAAS,IAAIG,CAAW,KAAKA,CAAW,GAC3G8L,IAAS/L,GAAUC,GAAaH,CAAS,GAEzCkB,IADab,GAAcF,GAAaH,CAAS,KACxBzD;AAE3B,MAAA2P;AACA,MAAA,OAAOnD,KAAsB,UAAU;AACvC,UAAMP,IAAWO;AACjB,IAAIP,EAAS,aAAa,SAASA,EAAS,eAC9B0D,IAAA,gBAAA1O;AAAA,MAAC2M;AAAA,MAAA;AAAA,QACP,qBAAAC;AAAA,QACA,WAAW6B;AAAA,QACX,YAAYzD,EAAS;AAAA,QACrB,iBAAiBA,EAAS;AAAA,QAC1B,QAAAjM;AAAA,QACA,iBAAA8N;AAAA,QACA,gBAAAG;AAAA,QACA,kBAAAC;AAAA,QACA,oBAAAG;AAAA,MAAA;AAAA,IAAA;AAAA,EAGZ;AAGA,QAAMxC,IAAWgC,MAAwB6B,GACnCE,IAAWpD,MAAuB6B,KAAsB,CAACnC,GAAkBM,CAAiB,KAAMR,GAAiBQ,CAAiB;AAGtI,SAAA,gBAAA3K;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,KAAKuN,EAAS;AAAA,MACb,GAAGA,EAAS;AAAA,MACZ,GAAGA,EAAS;AAAA,MACb,WAAU;AAAA,MAET,UAAA;AAAA,QAAWO,KAAA,gBAAA1O;AAAA,UAAC;AAAA,UAAA;AAAA,YACT,WAAW,uBAAuB4O;AAAA,YAClC,OAAO;AAAA,cACH,MAAM;AAAA,cACN,KAAK;AAAA,cACL,QAAQ;AAAA,YACZ;AAAA,UAAA;AAAA,QAAE;AAAA,QAEL,CAAC3D,GAAkBM,CAAiB,KAAK,CAAC0C,KAAmBU,IACxD,gBAAA3O;AAAA,UAAC0L;AAAA,UAAA;AAAA,YACC,UAAUH;AAAA,YACV,SAASsB,IAAkB,MAAMA,EAAgBlK,GAAaH,CAAS,IAAI;AAAA,YAC3E,aAAa;AAAA,YACb,UAAAoI;AAAA,YACA,UAAAlH;AAAA,UAAA;AAAA,QAAA,IACF,gBAAA1D;AAAA,UAACwM;AAAA,UAAA;AAAA,YAA2B,MAAM7J;AAAA,YACN,UAAU4I;AAAA,YACV,SAASsB,IAAkB,MAAMA,EAAgBlK,GAAaH,CAAS,IAAI;AAAA,YAC3E,UAAAoI;AAAA,UAAA;AAAA,QAAmB;AAAA,QAErD,gBAAAhK,EAAC,OAAI,EAAA,WAAU,yCAEV,UAAA;AAAA,UAAsB4N,KAAA,gBAAAxO,EAACc,IAAQ,EAAA,OAAO,qBACnC,UAAA,gBAAAd,EAACoF,MAAgB,MAAK,SAAQ,WAAW,MAAA,CAAM,EACnD,CAAA;AAAA,UAEC6H,KAAoB,gBAAAjN,EAACc,IAAQ,EAAA,OAAO,UACjC,UAAA,gBAAAd;AAAA,YAACe;AAAA,YAAA;AAAA,cAAW,MAAK;AAAA,cACL,OAAM;AAAA,cACN,SAAS,MAAMkM,EAAiBtK,GAAaH,CAAS;AAAA,cAC9D,UAAA,gBAAAxC,EAAC6O,IAAW,EAAA,MAAM,QAAQ,CAAA;AAAA,YAAA;AAAA,UAAA,GAElC;AAAA,UAEC7B,KAAkB,gBAAAhN,EAACc,IAAQ,EAAA,OAAO,QAC/B,UAAA,gBAAAd;AAAA,YAACe;AAAA,YAAA;AAAA,cACG,WAAW;AAAA,cACX,MAAK;AAAA,cAEL,UAAA,gBAAAf,EAAC8O,IAAe,EAAA,MAAM,QAAQ,CAAA;AAAA,YAAA;AAAA,UAAA,GAEtC;AAAA,QAAA,GACJ;AAAA,QAECJ,KAAW,gBAAA1O,EAAC,OAAI,EAAA,WAAW,SAAU,UAAQ0O,GAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAI1D;ACnPO,SAASK,GAAiB,EAAE,UAAA3L,GAAU,SAAAE,GAAS,oBAAAD,GAAoB,iBAAAyI,GAAiB,oBAAAsB,KAMxF;AAEO,QAAA;AAAA,IACF,QAAAzO;AAAA,IACA,eAAAC;AAAA,MACAO,EAAuB,GAErB,CAAC6P,GAAoBC,CAAqB,IAAI3P,EAAkB,EAAK,GACrE,CAACsN,GAAqBsC,CAAsB,IAAI5P,EAA6B,GAC7E,CAAC6P,GAA2BC,CAA4B,IAAI9P,EAA6B,GAEzF+N,IAAkB1O,EAAO,mBAAmB,OAAO,KAAKA,EAAO,cAAc,CAAA,CAAE,GAC/E0Q,IAAoB,CAAC;AAAA,IACI,IAAA/M;AAAA,IACA,UAAA0I;AAAA,EAAA,MACuC;AAClE,QAAI,CAAC1I;AACD,YAAM,MAAM;AAChB,IAAA1D,EAAc,cAAc;AAAA,MACxB,GAAID,EAAO,cAAc,CAAC;AAAA,MAC1B,CAAC2D,CAAE,GAAG0I;AAAA,OACP,EAAK;AAEF,UAAAsE,IAAyB3Q,EAAO,mBAAmB,OAAO,KAAKA,EAAO,cAAc,CAAA,CAAE,GACtFgP,IAAqB2B,EAAuB,SAAShN,CAAE,IAAIgN,IAAyB,CAAC,GAAGA,GAAwBhN,CAAE;AAC1G,IAAA1D,EAAA,mBAAmB+O,GAAoB,EAAK,GAE1DsB,EAAsB,EAAK;AAAA,EAAA,GAGzBM,IAAiBhC,EAAY,CAAC5K,GAAsBH,MAAuB;AAC7E,UAAMiM,IAAS9L,IAAcD,GAAUC,GAAaH,CAAS,IAAI;AACjE,QAAI,CAACiM;AACD,YAAM,MAAM,+BAA+B;AAEzC,UAAAe,IAAiBnN,GAAmBoM,CAAM,GAC1CgB,IAAsBhN,GAA+BD,CAAS,GAE9D8M,IAAmC3P,EAAMhB,GAAQ8Q,CAAmB,KAAK,OAAO,KAAK9P,EAAMhB,GAAQ4D,GAA0BC,CAAS,CAAC,CAAC;AAEhI,IAAA5D,EAAA4Q,GAAgB,QAAW,EAAK,GAChC5Q,EAAA6Q,GAAqBH,EAAuB,OAAO,CAACI,MAAMA,MAAM/M,CAAW,GAAG,EAAK,GAEjGsM,EAAsB,EAAK,GAC3BC,EAAuB,MAAS,GAChCE,EAA6B,MAAS;AAAA,EAAA,GACvC,CAACxQ,GAAeD,CAAM,CAAC,GAEpBgR,IAAyB/C,IAAsBlK,GAAUkK,GAAqBuC,CAAyB,IAAI,QAC3GS,IAAmBD,IAAyBhQ,EAAMhB,EAAO,YAAYgR,EAAuB,WAAW,KAAK,cAAc,CAAC,IAAI,QAE/HE,IAAQ,CAACxC,KAAmBA,EAAgB,SAAS,GAErDL,IAAiBO,EAAY,CAACF,GAA2B7K,MAAuB;AAClF,IAAA5D,EAAc6D,GAA+BD,CAAS,GAAG6K,GAAiB,EAAK;AAAA,EACnF,GAAG,CAAE,CAAA;AAEL,SAEQ,gBAAAzM,EAAAoF,GAAA,EAAA,UAAA;AAAA,IAAC,gBAAApF,EAAA,OAAA,EAAI,WAAW,eACZ,UAAA;AAAA,MAAC,gBAAAA,EAAA,OAAA,EAAI,WAAU,uCACX,UAAA;AAAA,QAAC,gBAAAZ,EAAAa,GAAA,EAAW,SAAS,aAAa,UAAwB,4BAAA;AAAA,QAC1D,gBAAAD;AAAA,UAACgE;AAAA,UAAA;AAAA,YACG,OAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,MAAMqK,EAAsB,EAAI;AAAA,YACzC,6BAAYa,IAAO,EAAA;AAAA,YACtB,UAAA;AAAA,cAAA;AAAA,cACoBnR,EAAO,QAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,QACpC;AAAA,MAAA,GACJ;AAAA,MACA,gBAAAiC,EAACyE,IAAM,EAAA,WAAU,YACb,UAAA;AAAA,QAAA,gBAAArF;AAAA,UAAC2M;AAAA,UAAA;AAAA,YACG,YAAYhO,EAAO,cAAc,CAAC;AAAA,YAClC,iBAAA0O;AAAA,YACA,QAAQ,CAAC;AAAA,YACT,oBAAAD;AAAA,YACA,iBAAiB,CAACzK,GAAaH,MAAc;AACzC,cAAA0M,EAAuBvM,CAAW,GAClCyM,EAA6B5M,CAAS,GACtCyM,EAAsB,EAAI;AAAA,YAC9B;AAAA,YACA,gBAAAjC;AAAA,UAAA;AAAA,QAA+B;AAAA,QAElC6C,KACG,gBAAA7P;AAAA,UAACa;AAAA,UAAA;AAAA,YAAW,SAAS;AAAA,YACT,WAAU;AAAA,YAA8C,UAAA;AAAA,UAAA;AAAA,QAEpE;AAAA,MAAA,GACR;AAAA,IAAA,GACJ;AAAA,IAEA,gBAAAD,EAAC,OAAI,EAAA,WAAW,eACZ,UAAA;AAAA,MAAA,gBAAAZ;AAAA,QAACiC;AAAA,QAAA;AAAA,UACG,UAAU;AAAA,UACV,MAAM;AAAA,UACN,OAAM;AAAA,UACN,eAAe,CAACD,MAAMpD,EAAc,kBAAkBoD,CAAC;AAAA,UACvD,OAAOrD,EAAO,kBAAkB;AAAA,QAAA;AAAA,MACpC;AAAA,MACA,gBAAAqB,EAACmB,KAAa,UAEd,iGAAA,CAAA;AAAA,IAAA,GACJ;AAAA,IAEA,gBAAAnB;AAAA,MAAC+P;AAAA,MAAA;AAAA,QACG,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,MAAMf;AAAA,QACN,oBAAA3L;AAAA,QACA,oBAAA+J;AAAA,QACA,UAAU,MAAM;AACZ,UAAA6B,EAAsB,EAAK,GAC3BC,EAAuB,MAAS,GAChCE,EAA6B,MAAS;AAAA,QAC1C;AAAA,QACA,aAAa,MAAM;AACf,UAAAH,EAAsB,EAAK,GAC3BC,EAAuB,MAAS,GAChCE,EAA6B,MAAS;AAAA,QAC1C;AAAA,QACA,SAAA9L;AAAA,QACA,UAAUiM;AAAA,QACV,aAAa3C;AAAA,QACb,mBAAmBuC;AAAA,QACnB,UAAUS;AAAA,QACV,kBAAkB,EAAQhD;AAAA,QAC1B,cAAc,CAACA;AAAA,QACf,oBAAoB,CAACA;AAAA,QACrB,mBAAmByC;AAAA,QACnB,sBAAsBzC,IAAsB,SAAYS;AAAA,QACxD,iBAAAvB;AAAA,MAAA;AAAA,IACJ;AAAA,EAEJ,EAAA,CAAA;AACR;AC5IO,SAASkE,GAAoB;AAAA,EACI,YAAAtP;AAAA,EACA,UAAAkJ;AAAA,EACA,UAAAxG;AAAA,EACA,SAAAE;AAAA,EACA,oBAAAD;AAAA,EACA,iBAAAyI;AAAA,EACA,oBAAAsB;AACJ,GAQjC;AAEO,QAAA;AAAA,IACF,QAAAzO;AAAA,IACA,cAAAE;AAAA,IACA,QAAAE;AAAA,IACA,eAAAH;AAAA,IACA,SAAAE;AAAA,MACAK,EAAyB,GAEvB,CAAC6P,GAAoBC,CAAqB,IAAI3P,EAAS,EAAK,GAC5D2Q,IAAatQ,EAAMhB,GAAQ,IAAI,GAC/BuR,IAAkBvQ,EAAMb,GAAS,IAAI,KAAKa,EAAMZ,GAAQ,IAAI,GAE5DoR,IAAoB,CAAC,EAAE,IAAA7N,GAAI,UAAA0I,GAAU,WAAAxI,QACgD;AACvF,YAAQ,IAAI,qBAAqBF,GAAI0I,GAAUxI,CAAS,GACxD5D,EAAc,MAAMoM,CAAQ;AAAA,EAAA,GAG1BoF,IAASH,KAAchE,GAAegE,GAAYnE,CAAe;AACvE,SAEQ,gBAAAlL,EAAAoF,GAAA,EAAA,UAAA;AAAA,IAAC,gBAAApF,EAAA,OAAA,EAAI,WAAW,eACZ,UAAA;AAAA,MAAC,gBAAAZ,EAAAa,GAAA,EAAW,SAAS,aAAa,UAElC,oBAAA;AAAA,MACA,gBAAAb;AAAA,QAACqB;AAAA,QAAA;AAAA,UACG,MAAM;AAAA,UACN,OAAO4O;AAAA,UAKN,WAAC,CAAA,MACG,gBAAArP,EAAAyE,IAAA,EAAM,WAAU,YAEZ,UAAA;AAAA,YAAc4K,KAAA,gBAAAjQ;AAAA,cAAC0L;AAAA,cAAA;AAAA,gBACZ,UAAUuE;AAAA,gBACV,SAAS7M,IAAW,SAAY,MAAM6L,EAAsB,EAAI;AAAA,gBAChE,aAAa;AAAA,gBACb,mBAAmB;AAAA,gBACnB,UAAU;AAAA,gBACV,UAAU;AAAA,cAAA;AAAA,YAAM;AAAA,YAEnB,CAAC7L,KAAY,CAAC6M,KAAc,gBAAArP;AAAA,cAACgE;AAAA,cAAA;AAAA,gBAAO,SAAS;AAAA,gBACT,MAAM;AAAA,gBACN,OAAOsL,IAAkB,UAAU;AAAA,gBACnC,SAAS,MAAMjB,EAAsB,EAAI;AAAA,gBAAG,UAAA;AAAA,kBAAA;AAAA,kBACvE,GAAGmB,IAASA,EAAO,OAAO,kBAAkB;AAAA,gBAAA;AAAA,cAAA;AAAA,YACtD;AAAA,YAEA,gBAAApQ;AAAA,cAAC+P;AAAA,cAAA;AAAA,gBACG,SAAS;AAAA,gBACT,MAAMf;AAAA,gBACN,kBAAkBpF;AAAA,gBAClB,SAAAtG;AAAA,gBACA,cAAc,CAACsG;AAAA,gBACf,oBAAoB,CAACA;AAAA,gBACrB,aAAa,MAAMqF,EAAsB,EAAK;AAAA,gBAC9C,oBAAA5L;AAAA,gBACA,UAAU4M;AAAA,gBACV,kBAAkB;AAAA,gBAClB,mBAAAE;AAAA,gBACA,iBAAiBzP;AAAA,gBACjB,iBAAAoL;AAAA,gBACA,oBAAAsB;AAAA,cAAA;AAAA,YACJ;AAAA,UAAA,GACJ;AAAA,QAAA;AAAA,MAER;AAAA,IAAA,GAEJ;AAAA,IAEA,gBAAApN,EAAC,OAAI,EAAA,WAAW,eAEZ,UAAA,gBAAAA,EAAC0I,MACG,UAAC,gBAAA1I,EAAAyI,IAAA,EAAwB,UAAArF,EAAmB,CAAA,EAChD,CAAA,GAEJ;AAAA,EACJ,EAAA,CAAA;AAER;AC9FO,MAAMiN,KAAuB3R,EAAM;AAAA,EACtC,SAA8B;AAAA,IACI,YAAAgC;AAAA,IACA,YAAA4P;AAAA,IACA,UAAAlN;AAAA,IACA,cAAAmN;AAAA,IACA,eAAAC;AAAA,KACDC,GAAK;AAE5B,UAAA;AAAA,MACF,QAAA1R;AAAA,MACA,QAAAJ;AAAA,MACA,eAAAC;AAAA,MACA,iBAAAI;AAAA,MACA,SAAAF;AAAA,MACA,UAAA4R;AAAA,QACAvR,EAA0B,GAExBO,IAAO,QACPiR,IAAYjQ,KAAcf,EAAMZ,GAAQW,CAAI,GAE5C4C,IAAK,MACLiE,IAAU7F,KAAcf,EAAMZ,GAAQuD,CAAE,GAExCsO,IAAc,eACdC,IAAmBnQ,KAAcf,EAAMZ,GAAQ6R,CAAW;AAG5D,WAAA,gBAAAhQ,EAAC,OAAI,EAAA,WAAW,mCAEZ,UAAA;AAAA,MAAA,gBAAAA,EAAC,OACG,EAAA,UAAA;AAAA,QAAA,gBAAAZ;AAAA,UAACqB;AAAA,UAAA;AAAA,YACG,MAAA3B;AAAA,YACA,UAAU+Q;AAAA,YACV,IAAInP;AAAA,YACJ,OAAO3C,EAAOe,CAAI;AAAA,YAClB,UAAU,CAACwB,MAAW;AACZ,oBAAA4P,IAAe5P,EAAE,OAAO;AAE1B,cAAA,CADcvB,EAAMb,GAASwD,CAAE,KACjBiO,KACd3R,EAAc0D,GAAIwO,IAAelR,GAAYkR,CAAY,IAAI,IAAI,EAAK,GAE5DlS,EAAAc,GAAMoR,GAAc,EAAI,GACtC9R,EAAgBU,GAAM,EAAI;AAAA,YAC9B;AAAA,YACA,OAAO,EAAE,UAAU,GAAG;AAAA,YACtB,aAAa;AAAA,YACb,UAAQ;AAAA,YACR,UAAA0D;AAAA,YACA,OAAO,EAAQuN;AAAA,UAAS;AAAA,QAAE;AAAA,0BAE7BxP,GAAa,EAAA,OAAO,EAAQwP,GACxB,UACLA,GAAA;AAAA,MAAA,GACJ;AAAA,wBAEC,OACG,EAAA,UAAA;AAAA,QAAA,gBAAA3Q;AAAA,UAACqB;AAAA,UAAA;AAAA,YACG,MAAMiB;AAAA,YACN,IAAIhB;AAAA,YACJ,OAAO;AAAA,YACP,OAAO3C,EAAO2D,CAAE;AAAA,YAChB,UAAU,CAACpB,MAAW;AACZ,oBAAA6P,IAAa7P,EAAE,OAAO;AAExB,cAAA,CADgBvB,EAAMb,GAASY,CAAI,KACnB6Q,KAChB3R,EAAcc,GAAMqR,IAAaC,GAAUD,CAAU,IAAI,EAAE,GAEjDnS,EAAA0D,GAAIyO,GAAY,EAAI,GAClC/R,EAAgBsD,GAAI,EAAI;AAAA,YAC5B;AAAA,YACA,UAAUgO,KAAclN;AAAA,YACxB,UAAQ;AAAA,YACR,MAAK;AAAA,YACL,OAAO,EAAQmD;AAAA,UAAO;AAAA,QAAE;AAAA,0BAC3BpF,GAAa,EAAA,OAAO,EAAQoF,GACxB,UACLA,GAAA;AAAA,MAAA,GACJ;AAAA,wBAEC,OACG,EAAA,UAAA;AAAA,QAAA,gBAAAvG;AAAA,UAACqB;AAAA,UAAA;AAAA,YAAM,MAAMuP;AAAA,YACN,IAAItP;AAAA,YACJ,OAAO;AAAA,YACP,UAAA8B;AAAA,YACA,OAAO,EAAQyN;AAAA,UAAgB;AAAA,QAAE;AAAA,0BACvC1P,GAAa,EAAA,OAAO,EAAQ0P,GACxB,UACLA,GAAA;AAAA,MAAA,GACJ;AAAA,IAEJ,EAAA,CAAA;AAAA,EAGR;AACJ;ACtGO,SAASI,GAAoB;AAAA,EACI,UAAAC;AAAA,EACA,UAAA9N;AAAA,EACA,YAAA1C;AACJ,GAIjC;AAEC,QAAM,EAAE,QAAA/B,GAAQ,eAAAC,EAAc,IAAIO,EAAU;AAE5C,SAEQ,gBAAAyB,EAAAoF,GAAA,EAAA,UAAA;AAAA,IAAA,gBAAAhG,EAAC,OAAI,EAAA,WAAW,eAEZ,UAAA,gBAAAY,EAAC8H,IAEI,EAAA,UAAA;AAAA,MAAAwI,MAAa,gBACV,gBAAAlR;AAAA,QAACsH;AAAA,QAAA;AAAA,UAAyB,UAAAlE;AAAA,UACA,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,SAAS;AAAA,UACT,KAAK;AAAA,UACL,KAAK;AAAA,UACL,MAAM;AAAA,UACN,WAAW;AAAA,UACX,YAAA1C;AAAA,QAAA;AAAA,MAAuB;AAAA,MACpDwQ,MAAa,eACV,gBAAAlR;AAAA,QAACsH;AAAA,QAAA;AAAA,UAAyB,UAAAlE;AAAA,UACA,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,KAAK;AAAA,UACL,KAAK;AAAA,UACL,MAAM;AAAA,UACN,WAAW;AAAA,UACX,YAAA1C;AAAA,QAAA;AAAA,MAAuB;AAAA,MACpDwQ,MAAa,cACV,gBAAAlR;AAAA,QAACsH;AAAA,QAAA;AAAA,UAAyB,UAAAlE;AAAA,UACA,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,KAAK;AAAA,UACL,KAAK;AAAA,UACL,MAAM;AAAA,UACN,WAAW;AAAA,UACX,YAAA1C;AAAA,QAAA;AAAA,MAAuB;AAAA,MAEpDwQ,MAAa,WACV,gBAAAlR;AAAA,QAACsH;AAAA,QAAA;AAAA,UAAyB,UAAAlE;AAAA,UACA,KAAK;AAAA,UACL,KAAK;AAAA,UACL,MAAM;AAAA,UACN,YAAA1C;AAAA,QAAA;AAAA,MAAuB;AAAA,IAAA,EAAA,CAEzD,EAEJ,CAAA;AAAA,IAEA,gBAAAV,EAAC,OAAI,EAAA,WAAW,eAEZ,UAAA,gBAAAA;AAAA,MAACiB;AAAA,MAAA;AAAA,QAAU,MAAM;AAAA,QACN,UAAAmC;AAAA,QACA,UAAU,CAAClC,MAAW;AACJ,UAAAtC,EAAA,gBAAgBsC,EAAE,OAAO,UAAU,KAAK,SAAYA,EAAE,OAAO,KAAK;AAAA,QACpF;AAAA,QACA,OAAO;AAAA,QACP,OAAOvB,EAAMhB,GAAQ,cAAc,KAAK;AAAA,MAAA;AAAA,IAAA,GAEvD;AAAA,EACJ,EAAA,CAAA;AAER;ACvEgB,SAAAwS,GAAqB,EAAE,UAAA/N,KAEpC;AACO,QAAA,EAAE,QAAAzE,MAAWQ,KACb+J,IAAevJ,EAAMhB,GAAQ,cAAc;AAEjD,SAEQ,gBAAAiC,EAAAoF,GAAA,EAAA,UAAA;AAAA,IAAC,gBAAAhG,EAAA,OAAA,EAAI,WAAW,eAEZ,UAAA,gBAAAA,EAAC0I,MACG,UAAC,gBAAA1I,EAAAmH,IAAA,EAA0B,UAAA/D,EAAmB,CAAA,EAClD,CAAA,GAEJ;AAAA,IAEA,gBAAApD,EAAC,OAAI,EAAA,WAAW,eAEZ,UAAA,gBAAAA;AAAA,MAACqB;AAAA,MAAA;AAAA,QACG,MAAM;AAAA,QACL,UAAC,CAAA,EAAE,OAAAsF,GAAO,MAAAC,QACA,gBAAA5G;AAAA,UAAC0G;AAAA,UAAA;AAAA,YACJ,OAAOwC,KAAiB,OAAqC,0BAA2B,sBAAsBA,EAAa,SAAS;AAAA,YACpI,UAAA9F;AAAA,YACA,oBAAoB;AAAA,YAAM,OAAAuD;AAAA,YAC1B,MAAAC;AAAA,UAAA;AAAA,QAAA;AAAA,MACR;AAAA,IAAA,GAGR;AAAA,EACJ,EAAA,CAAA;AAER;AC/BO,SAASwK,GAAmB,EAAE,UAAAhO,GAAU,SAAAE,GAAS,oBAAAD,GAAoB,iBAAAyI,GAAiB,oBAAAsB,KAM1F;AAEO,QAAA;AAAA,IACF,QAAAzO;AAAA,IACA,eAAAC;AAAA,MACAO,EAAyB,GAEvB,CAAC6P,GAAoBC,CAAqB,IAAI3P,EAAkB,EAAK,GACrE,CAACsN,GAAqBsC,CAAsB,IAAI5P,EAA6B,GAC7E,CAAC6P,GAA2BC,CAA4B,IAAI9P,EAA6B,GAEzF6Q,IAAoB,CAAC;AAAA,IACI,IAAA7N;AAAA,IACA,UAAA0I;AAAA,EAAA,MACuC;AAClE,QAAI,CAAC1I;AACD,YAAM,MAAM;AAEhB,IAAA1D,EAAc,oBAAoB;AAAA,MAC9B,GAAID,EAAO,OAAO,cAAc,CAAC;AAAA,MACjC,CAAC2D,CAAE,GAAG0I;AAAA,OACP,EAAK;AACF,UAAAsE,IAAyB3Q,EAAO,OAAO,mBAAmB,OAAO,KAAKA,EAAO,OAAO,cAAc,CAAE,CAAA,GACpGgP,IAAqB2B,EAAuB,SAAShN,CAAE,IAAIgN,IAAyB,CAAC,GAAGA,GAAwBhN,CAAE;AAC1G,IAAA1D,EAAA,yBAAyB+O,GAAoB,EAAK,GAChEsB,EAAsB,EAAK;AAAA,EAAA,GAGzBU,IAAyB/C,IAAsBlK,GAAUkK,GAAqBuC,CAAyB,IAAI,QAC3GS,IAAmBD,IAAyBhQ,EAAMhB,EAAO,OAAO,YAAYgR,EAAuB,WAAW,KAAK,cAAc,CAAC,IAAI,QAEtIJ,IAAiBhC,EAAY,CAAC5K,GAAsBH,MAAuB;AAC7E,UAAMiM,IAAS9L,IAAcD,GAAUC,GAAaH,CAAS,IAAI;AACjE,QAAI,CAACiM;AACD,YAAM,MAAM,+BAA+B;AAE/C,IAAA7P,EAAc,SAASyD,GAAmBoM,CAAM,CAAC,IAAI,QAAW,EAAK;AACrE,UAAMgB,IAAsB,SAAShN,GAA+BD,CAAS,CAAC,IACxE8M,IAAmC3P,EAAMhB,GAAQ8Q,CAAmB;AAC5D,IAAA7Q,EAAA6Q,GAAqBH,EAAuB,OAAO,CAACI,MAAMA,MAAM/M,CAAW,GAAG,EAAK,GAEjGsM,EAAsB,EAAK,GAC3BC,EAAuB,MAAS,GAChCE,EAA6B,MAAS;AAAA,EAAA,GACvC,CAACxQ,GAAeD,CAAM,CAAC,GAEpB0S,IAAiB,gBAAAzQ;AAAA,IAACgE;AAAA,IAAA;AAAA,MACpB,WAAS;AAAA,MACT,OAAM;AAAA,MAEN,SAAS,MAAMqK,EAAsB,EAAI;AAAA,MACzC,6BAAYa,IAAO,EAAA;AAAA,MACtB,UAAA;AAAA,QAAA;AAAA,QACoBnR,EAAO,QAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAG9BqO,IAAiBO,EAAY,CAACF,GAA2B7K,MAAuB;AAClF,IAAA5D,EAAc,SAAS6D,GAA+BD,CAAS,CAAC,IAAI6K,GAAiB,EAAK;AAAA,EAC9F,GAAG,CAAE,CAAA;AAEL,SAEQ,gBAAAzM,EAAAoF,GAAA,EAAA,UAAA;AAAA,IAAC,gBAAApF,EAAA,OAAA,EAAI,WAAW,eACZ,UAAA;AAAA,MAAC,gBAAAA,EAAA,OAAA,EAAI,WAAW,4CACZ,UAAA;AAAA,QAAC,gBAAAZ,EAAAa,GAAA,EAAW,SAAS,aAAa,UACzB,4BAAA;AAAA,QACRwQ;AAAA,MAAA,GACL;AAAA,MACA,gBAAAzQ,EAACyE,IAAM,EAAA,WAAU,YAEb,UAAA;AAAA,QAAA,gBAAArF;AAAA,UAAC2M;AAAA,UAAA;AAAA,YACG,YAAYhO,EAAO,OAAO,cAAc,CAAC;AAAA,YACzC,iBAAiBA,EAAO,OAAO;AAAA,YAC/B,QAAQ,CAAC;AAAA,YACT,oBAAAyO;AAAA,YACA,iBAAiBhK,IACX,SACA,CAACT,GAAaH,MAAc;AAC1B,cAAA0M,EAAuBvM,CAAW,GAClCyM,EAA6B5M,CAAS,GACtCyM,EAAsB,EAAI;AAAA,YAC9B;AAAA,YACJ,gBAAgB7L,IACV,SACA4J;AAAA,UAAA;AAAA,QAAe;AAAA,QAExB,CAAC5J,KAAY,CAACzE,EAAO,OAAO,iBAAiB,UACzC,gBAAAqB,EAAA,OAAA,EAAI,WAAU,+CAA8C,UAE7D,uCAAA,CAAA;AAAA,MAAA,GAER;AAAA,IAAA,GACJ;AAAA,IAEC,CAACoD,KAAY,gBAAApD;AAAA,MAAC+P;AAAA,MAAA;AAAA,QACX,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,MAAMf;AAAA,QACN,SAAA1L;AAAA,QACA,oBAAAD;AAAA,QACA,UAAU,MAAM;AACZ,UAAA4L,EAAsB,EAAK,GAC3BC,EAAuB,MAAS,GAChCE,EAA6B,MAAS;AAAA,QAC1C;AAAA,QACA,aAAa,MAAM;AACf,UAAAH,EAAsB,EAAK,GAC3BC,EAAuB,MAAS,GAChCE,EAA6B,MAAS;AAAA,QAC1C;AAAA,QACA,oBAAAhC;AAAA,QACA,UAAUmC;AAAA,QACV,aAAa3C;AAAA,QACb,mBAAmBuC;AAAA,QACnB,UAAUS;AAAA,QACV,kBAAkB,EAAQhD;AAAA,QAC1B,cAAc,CAACA;AAAA,QACf,oBAAoB,CAACA;AAAA,QACrB,mBAAAuD;AAAA,QACA,sBAAsBvD,IAAsB,SAAYjO,EAAO,OAAO;AAAA,QACtE,iBAAAmN;AAAA,MAAA;AAAA,IAAiC;AAAA,EAEzC,EAAA,CAAA;AACR;AClIgB,SAAAwF,GAAyB,EAAE,UAAAlO,KAExC;AAEO,QAAA;AAAA,IACF,QAAAzE;AAAA,IACA,cAAAE;AAAA,MACAM,EAAU,GAER4I,IAAgB,kBAChBC,IAAgB,kBAChBuJ,IAAqB,uBACrBC,IAAqB;AAOvB,SAAA,gBAAA5Q,EAAC,OAAI,EAAA,WAAW,2BACZ,UAAA;AAAA,IAAA,gBAAAZ,EAACmH,MAA0B,UAAA/D,GAAmB;AAAA,IAG9C,gBAAApD,EAAC,OAAI,EAAA,WAAW,cACZ,UAAA,gBAAAA;AAAA,MAACsB;AAAA,MAAA;AAAA,QAAmB,OAAO3B,EAAMhB,GAAQoJ,CAAa;AAAA,QAClC,OAAO;AAAA,QACP,MAAMA;AAAA,QACN,MAAK;AAAA,QACL,MAAK;AAAA,QACL,UAAA3E;AAAA,QACA,UAAUvE;AAAA,MAAA;AAAA,IAAA,GAClC;AAAA,IAEA,gBAAAmB,EAAC,OAAI,EAAA,WAAW,cACZ,UAAA,gBAAAA;AAAA,MAACsB;AAAA,MAAA;AAAA,QAAmB,OAAO3B,EAAMhB,GAAQqJ,CAAa;AAAA,QAClC,OAAO;AAAA,QACP,MAAMA;AAAA,QACN,MAAK;AAAA,QACL,MAAK;AAAA,QAEL,UAAA5E;AAAA,QACA,UAAUvE;AAAA,MAAA;AAAA,IAAA,GAClC;AAAA,IAGA,gBAAAmB,EAAC,OAAI,EAAA,WAAW,cACZ,UAAA,gBAAAA;AAAA,MAACsB;AAAA,MAAA;AAAA,QACG,OAAO3B,EAAMhB,GAAQ4S,CAAkB;AAAA,QACvC,OAAO;AAAA,QACP,MAAMA;AAAA,QACN,MAAK;AAAA,QACL,MAAK;AAAA,QAEL,UAAAnO;AAAA,QACA,UAAUvE;AAAA,MAAA;AAAA,IAAA,GAClB;AAAA,IAEA,gBAAAmB,EAAC,OAAI,EAAA,WAAW,cACZ,UAAA,gBAAAA;AAAA,MAACsB;AAAA,MAAA;AAAA,QACG,OAAO3B,EAAMhB,GAAQ6S,CAAkB;AAAA,QACvC,OAAO;AAAA,QACP,MAAMA;AAAA,QACN,MAAK;AAAA,QACL,MAAK;AAAA,QAEL,UAAApO;AAAA,QACA,UAAUvE;AAAA,MAAA;AAAA,IAAA,GAClB;AAAA,IAEA,gBAAAmB,EAAC,OAAI,EAAA,WAAW,cACZ,UAAA,gBAAAA;AAAA,MAACqB;AAAA,MAAA;AAAA,QAAM,MAzDQ;AAAA,QA0DR,MAAK;AAAA,QACP,UAAC,CAAA,EAAE,OAAAsF,GAAO,MAAAC,QACA,gBAAA5G;AAAA,UAAC0G;AAAA,UAAA;AAAA,YACJ,OAAO;AAAA,YACP,UAAAtD;AAAA,YACA,MAAAwD;AAAA,YACA,OAAAD;AAAA,UAAA;AAAA,QAAA;AAAA,MACR;AAAA,IAAA,GAER;AAAA,IACA,gBAAA3G,EAAC,OAAI,EAAA,WAAW,cACZ,UAAA,gBAAAA;AAAA,MAACqB;AAAA,MAAA;AAAA,QAAM,MApEQ;AAAA,QAqER,MAAK;AAAA,QACP,UAAC,CAAA,EAAE,OAAAsF,GAAO,MAAAC,QACA,gBAAA5G;AAAA,UAAC0G;AAAA,UAAA;AAAA,YACJ,OAAO;AAAA,YACP,UAAAtD;AAAA,YACA,MAAAwD;AAAA,YACA,OAAAD;AAAA,UAAA;AAAA,QAAA;AAAA,MACR;AAAA,IAAA,GAER;AAAA,IACA,gBAAA3G,EAAC,OAAI,EAAA,WAAW,cACZ,UAAA,gBAAAA;AAAA,MAACqB;AAAA,MAAA;AAAA,QAAM,MA/EO;AAAA,QAgFP,MAAK;AAAA,QACP,UAAC,CAAA,EAAE,OAAAsF,GAAO,MAAAC,QACA,gBAAA5G;AAAA,UAAC0G;AAAA,UAAA;AAAA,YACJ,OAAO;AAAA,YACP,UAAAtD;AAAA,YACA,MAAAwD;AAAA,YACA,OAAAD;AAAA,UAAA;AAAA,QAAA;AAAA,MACR;AAAA,IAAA,GAER;AAAA,EACJ,EAAA,CAAA;AAER;AC5GgB,SAAA8K,GAAoB,EAAE,UAAArO,KAEnC;AAEC,QAAM,EAAE,QAAAzE,GAAQ,eAAAC,EAAc,IAAIO,EAAU;AAE5C,SAGQ,gBAAAyB,EAAAoF,GAAA,EAAA,UAAA;AAAA,IAAC,gBAAAhG,EAAA,OAAA,EAAI,WAAW,eAEZ,UAAA,gBAAAA,EAAC0I,MACG,UAAC,gBAAA1I,EAAAsR,IAAA,EAAyB,UAAAlO,EAAmB,CAAA,EACjD,CAAA,GAEJ;AAAA,IAEA,gBAAApD,EAAC,OAAI,EAAA,WAAW,eAEZ,UAAA,gBAAAA;AAAA,MAACiB;AAAA,MAAA;AAAA,QAAU,MAAM;AAAA,QACN,UAAAmC;AAAA,QACA,MAAM;AAAA,QACN,UAAU,CAAClC,MAAW;AACJ,UAAAtC,EAAA,gBAAgBsC,EAAE,OAAO,UAAU,KAAK,SAAY,WAAWA,EAAE,OAAO,KAAK,CAAC;AAAA,QAChG;AAAA,QACA,OAAO;AAAA,QACP,OAAOvB,EAAMhB,GAAQ,cAAc,KAAK;AAAA,MAAA;AAAA,IAAA,GAEvD;AAAA,EACJ,EAAA,CAAA;AAER;AChCO,SAAS+S,GAAuB;AAAA,EACI,UAAA9H;AAAA,EACA,UAAAD;AAAA,EACA,UAAAvG;AAAA,EACA,YAAA1C;AACJ,GAKpC;AAEO,QAAA;AAAA,IACF,QAAA/B;AAAA,IACA,cAAAE;AAAA,IACA,QAAAE;AAAA,MACAI,EAA2C;AAI/C,MAAI,CAFewS;AAGf,6BAAQ,OAAI,EAAA,WAAW,eACnB,UAAA,gBAAA3R,EAACmF,MAAgB,EACrB,CAAA;AAEE,QAAAyM,IAAWjI,IAAW,YAAY,QAClCkI,IAAgClS,EAAMhB,GAAQiT,CAAQ,GACtDE,IAAgCpR,KAAcf,EAAMZ,GAAQ6S,CAAQ;AAE1E,SAEQ,gBAAA5R,EAAAgG,GAAA,EAAA,UAAA,gBAAAhG,EAAC,OAAI,EAAA,WAAW,eAEZ,UAAA,gBAAAA;AAAA,IAACqB;AAAA,IAAA;AAAA,MAAM,MAAMuQ;AAAA,MACN,UAAAA;AAAA,MACA,MAAK;AAAA,MACL,UAAWhI,KAAY,EAAQiI,KAAezO;AAAA,MAC9C,OAAOyO;AAAA,MACP,OAAOC;AAAA,MACP,cAAAjT;AAAA,MACA,IAAIkT;AAAA,IAAA;AAAA,EAAA,EAEf,CAAA,EAEJ,CAAA;AAER;AAEO,SAASA,GAAkB;AAAA,EACI,UAAA3O;AAAA,EACA,UAAAwO;AAAA,EACA,OAAA9P;AAAA,EACA,cAAAjD;AAAA,EACA,OAAAmT;AAAA,EACA,GAAGC;AACP,GAM/B;AAEC,QAAMC,IAAaP;AAEnB,MAAI,CAACO;AACD,6BAAQ,OAAI,EAAA,WAAW,eACnB,UAAA,gBAAAlS,EAACmF,MAAgB,EACrB,CAAA;AAEE,QAAAgN,IAAcD,GAAY,eAAe,IAEzC3T,IAAmB,MAAM,KAAK,IAAI;AAAA,IACpC,OAAO,OAAO4T,CAAW,EAAE,IAAI,OAAKjR,EAAE,KAAK,EAAE,OAAO,OAAO;AAAA,EAAA,EAC7D,OAAQ,CAAA,GAEJkR,IAAuBD,EAAY,OAAO,CAACE,MAAQ,CAACA,EAAI,KAAK;AAEnE,SAEQ,gBAAAzR,EAAAoF,GAAA,EAAA,UAAA;AAAA,IAAA,gBAAApF;AAAA,MAACiB;AAAA,MAAA;AAAA,QACG,OAAO,EAAQmQ;AAAA,QACf,UAAA5O;AAAA,QACA,OAAOtB,KAAS;AAAA,QAChB,UAAU;AAAA,QACV,MAAM8P;AAAA,QACN,UAAU/S;AAAA,QACV,OAAO;AAAA,QACP,aAAa,CAAC+L,MAAa;AACjB,gBAAA0H,IAAqBH,EAAY,KAAK,CAAAI,MAAcA,EAAW,OAAO3H,KAAY2H,EAAW,SAAS3H,CAAQ;AACpH,iBAAK0H,IAED,gBAAA1R,EAAC,OAAI,EAAA,WAAU,iBACX,UAAA;AAAA,YAAC,gBAAAZ,EAAAC,IAAA,EAAY,kBAAkBqS,EAAmB,CAAA;AAAA,YAClD,gBAAAtS;AAAA,cAACa;AAAA,cAAA;AAAA,gBACG,SAAS;AAAA,gBACT,WAAU;AAAA,gBACT,UAAAyR,GAAoB,KAAK,YAAY;AAAA,cAAA;AAAA,YAC1C;AAAA,UACJ,EAAA,CAAA,IAT4B;AAAA,QAUpC;AAAA,QACC,GAAGL;AAAA,QAEH,UAAA;AAAA,UAAO1T,EAAA,QAAQ,CAAC4B,MACb,gBAAAH;AAAA,YAACwS;AAAA,YAAA;AAAA,cAAY,OAAOrS,KAAS;AAAA,cAGrB,UAAAgS,EAAY,OAAO,CAAcI,MAAAA,EAAW,UAAUpS,CAAK,EACtD,IAAI,CAACoS,MACK,gBAAAvS;AAAA,gBAAC+B;AAAA,gBAAA;AAAA,kBAEJ,OAAOwQ,EAAW,MAAMA,EAAW;AAAA,kBACnC,UAAA,gBAAA3R,EAAC,OAAI,EAAA,WAAU,iBACX,UAAA;AAAA,oBAAC,gBAAAZ,EAAAC,IAAA,EAAY,kBAAkBsS,EAAW,CAAA;AAAA,oBAC1C,gBAAAvS;AAAA,sBAACa;AAAA,sBAAA;AAAA,wBACG,SAAS;AAAA,wBACT,WAAU;AAAA,wBACT,UAAA0R,GAAY,KAAK,YAAY;AAAA,sBAAA;AAAA,oBAClC;AAAA,kBAAA,GACJ;AAAA,gBAAA;AAAA,gBATK,GAAGA,EAAW,MAAMA,EAAW,IAAI,IAAIpS,CAAK;AAAA,cAAA,CAWxD;AAAA,YAAA;AAAA,YAhBK,SAASA,CAAK;AAAA,UAAA,CAoBnC;AAAA,UAEAiS,uBAAyBI,IAAY,EAAA,OAAO,SACxC,UACIJ,EAAA,IAAI,CAACG,MACK,gBAAAvS;AAAA,YAAC+B;AAAA,YAAA;AAAA,cACW,OAAOwQ,EAAW,MAAMA,EAAW;AAAA,cAClD,UAAA,gBAAA3R,EAAC,OAAI,EAAA,WAAU,iBACX,UAAA;AAAA,gBAAC,gBAAAZ,EAAAC,IAAA,EAAY,kBAAkBsS,EAAW,CAAA;AAAA,gBAC1C,gBAAAvS;AAAA,kBAACa;AAAA,kBAAA;AAAA,oBACG,SAAS;AAAA,oBACT,WAAU;AAAA,oBACT,UAAA0R,GAAY,KAAK,YAAY;AAAA,kBAAA;AAAA,gBAClC;AAAA,cAAA,GACJ;AAAA,YAAA;AAAA,YAToBA,EAAW,MAAMA,EAAW;AAAA,UAAA,CAWvD,GAGT;AAAA,QAAA;AAAA,MAAA;AAAA,IAEJ;AAAA,IAEA,gBAAAvS,EAACmB,KAAa,UAGd,kEAAA,CAAA;AAAA,EACJ,EAAA,CAAA;AAER;ACxJgB,SAAAsR,GAAsB,EAAE,UAAArP,KAErC;AAEO,QAAA;AAAA,IACF,QAAAzE;AAAA,IACA,QAAAI;AAAA,IACA,SAAAD;AAAA,IACA,eAAAF;AAAA,MACAO,EAA2C,GAEzCuT,IAAW,QACXC,IAAgChT,EAAMhB,GAAQ+T,CAAQ,GACtDE,IAAgCjT,EAAMb,GAAS4T,CAAQ,KAAK/S,EAAMZ,GAAQ2T,CAAQ,GAElFG,IAAgB,aAChBC,IAAqCnT,EAAMhB,GAAQkU,CAAa,GAChEE,IAAqCpT,EAAMb,GAAS+T,CAAa,KAAKlT,EAAMZ,GAAQ8T,CAAa;AAEvG,SAEQ,gBAAAjS,EAAAoF,GAAA,EAAA,UAAA;AAAA,IAAC,gBAAApF,EAAA,OAAA,EAAI,WAAW,6BACZ,UAAA;AAAA,MAAA,gBAAAA;AAAA,QAACiB;AAAA,QAAA;AAAA,UAAO,MAAM6Q;AAAA,UACN,OAAOC,KAAa;AAAA,UACpB,OAAO,EAAQC;AAAA,UACf,eAAe,CAAC5Q,MAAMpD,EAAc8T,GAAU1Q,CAAC;AAAA,UAC/C,OAAO;AAAA,UACP,aAAa,CAACA,MAAM;AAChB,oBAAQA,GAAG;AAAA,cACP,KAAK;AACM,uBAAA;AAAA,cACX,KAAK;AACM,uBAAA;AAAA,cACX;AACW,uBAAA;AAAA,YACf;AAAA,UACJ;AAAA,UACA,UAAAoB;AAAA,UACJ,UAAA;AAAA,YAAC,gBAAApD,EAAA+B,IAAA,EAAW,OAAO,aAAa,UAAW,eAAA;AAAA,YAC1C,gBAAA/B,EAAA+B,IAAA,EAAW,OAAO,QAAQ,UAAM,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACrC;AAAA,wBACCZ,GAAa,EAAA,OAAO,EAAQyR,GACxB,UACLA,GAAA;AAAA,MAEA,gBAAAhS;AAAA,QAACiB;AAAA,QAAA;AAAA,UAAO,MAAMgR;AAAA,UACN,UAAAzP;AAAA,UACA,OAAO0P,KAAkB;AAAA,UACzB,eAAe,CAAC9Q,MAAMpD,EAAciU,GAAe7Q,MAAM,SAAS,OAAOA,CAAC;AAAA,UAC1E,aAAa,CAACA,MAAM;AAChB,oBAAQA,GAAG;AAAA,cACP,KAAK;AACM,uBAAA;AAAA,cACX,KAAK;AACM,uBAAA;AAAA,cACX;AACW,uBAAA;AAAA,YACf;AAAA,UACJ;AAAA,UACA,OAAO,EAAQ+Q;AAAA,UACf,OAAO;AAAA,UACX,UAAA;AAAA,YAAC,gBAAA/S,EAAA+B,IAAA,EAAW,OAAO,QAAQ,UAAM,UAAA;AAAA,YAChC,gBAAA/B,EAAA+B,IAAA,EAAW,OAAO,aAAa,UAAW,eAAA;AAAA,YAC1C,gBAAA/B,EAAA+B,IAAA,EAAW,OAAO,aAAa,UAAe,mBAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACnD;AAAA,wBACCZ,GAAa,EAAA,OAAO,EAAQ4R,GACxB,eAAkB,wEACvB;AAAA,IAAA,GAEJ;AAAA,IAEA,gBAAA/S,EAAC,OAAI,EAAA,WAAW,eACZ,UAAA,gBAAAA,EAAC0I,MACG,UAAC,gBAAA1I,EAAAmH,IAAA,EAA0B,UAAA/D,EAAmB,CAAA,EAClD,CAAA,GACJ;AAAA,EACJ,EAAA,CAAA;AAER;AChFgB,SAAA4P,GAA2B,EAAE,UAAA5P,KAE1C;AAQK,SAAA,gBAAAxC,EAAC,OAAI,EAAA,WAAW,2BACZ,UAAA;AAAA,IAAA,gBAAAZ,EAAC,OAAI,EAAA,WAAW,eACZ,UAAA,gBAAAA,EAACqB,GAAM,EAAA,MAAK,YAAW,MAPR,sBAQV,UAAA,CAAC,EAAE,OAAAsF,GAAO,MAAAC,QACA,gBAAA5G;AAAA,MAAC0G;AAAA,MAAA;AAAA,QACJ,OAAO;AAAA,QACP,UAAAtD;AAAA,QACA,MAAAwD;AAAA,QACA,SAAS;AAAA,QACT,OAAAD;AAAA,MAAA;AAAA,IAAA,GAEZ,EACJ,CAAA;AAAA,IAEA,gBAAA3G,EAAC,OAAI,EAAA,WAAW,eACZ,UAAA,gBAAAA;AAAA,MAACqB;AAAA,MAAA;AAAA,QAAM,MAnBF;AAAA,QAoBE,MAAK;AAAA,QACP,UAAC,CAAA,EAAE,OAAAsF,GAAO,MAAAC,QACA,gBAAA5G;AAAA,UAAC0G;AAAA,UAAA;AAAA,YACJ,OAAO;AAAA,YACP,UAAAtD;AAAA,YACA,SAAS;AAAA,YACT,MAAAwD;AAAA,YACA,OAAAD;AAAA,UAAA;AAAA,QAAA;AAAA,MACR;AAAA,IAAA,GAER;AAAA,EACJ,EAAA,CAAA;AAER;ACxCgB,SAAAsM,GAAsB,EAAE,UAAA7P,KAErC;AAEC,SAEQ,gBAAApD,EAAAgG,GAAA,EAAA,UAAA,gBAAAhG,EAAC,OAAI,EAAA,WAAW,eAEZ,UAAA,gBAAAA,EAAC0I,IACG,EAAA,UAAA,gBAAA1I,EAACmH,IAA0B,EAAA,UAAA/D,EAAA,CAAmB,EAClD,CAAA,GAEJ,EACJ,CAAA;AAER;ACPgB,SAAA8P,GAAyBC,GACAC,GACAtH,GAA2D;AAE5F,MAAAuH;AACJ,SAAID,MAAqB,eACHC,IAAAC;AAAA,IACdH;AAAA,IACA;AAAA,MACI,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUA,EAAa,aAAa,SAAYA,EAAa,WAAW;AAAA,MACxE,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,KAAK;AAAA,MACL,YAAY;AAAA,IAChB;AAAA,EAAA,IAEGC,MAAqB,cACVC,IAAAC;AAAA,IACdH;AAAA,IACA;AAAA,MACI,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUA,EAAa,aAAa,SAAYA,EAAa,WAAW;AAAA,MACxE,WAAW;AAAA,MACX,SAAS;AAAA,MACT,UAAU;AAAA,MACV,OAAO;AAAA,MACP,KAAK;AAAA,MACL,YAAY;AAAA,IAChB;AAAA,EAAA,IAEGC,MAAqB,aACVC,IAAAC;AAAA,IACdH;AAAA,IACA;AAAA,MACI,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUA,EAAa,aAAa,SAAYA,EAAa,WAAW;AAAA,MACxE,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,KAAK;AAAA,IACT;AAAA,EAAA,IAEGC,MAAqB,QACVC,IAAAC;AAAA,IACdH;AAAA,IACA;AAAA,MACI,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUA,EAAa,aAAa,SAAYA,EAAa,WAAW;AAAA,MACxE,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,KAAK;AAAA,MACL,YAAY;AAAA,IAChB;AAAA,EAAA,IAEGC,MAAqB,UACVC,IAAAC;AAAA,IACdH;AAAA,IACA;AAAA,MACI,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUA,EAAa,aAAa,SAAYA,EAAa,WAAW;AAAA,MACxE,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,KAAK;AAAA,MACL,YAAY;AAAA,IAChB;AAAA,EAAA,IAEGC,MAAqB,WACVC,IAAAC;AAAA,IACdH;AAAA,IACA;AAAA,MACI,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUA,EAAa,aAAa,SAAYA,EAAa,WAAW;AAAA,MACxE,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,KAAK;AAAA,MACL,YAAYA,EAAa,cAAc,CAAC;AAAA,IAC5C;AAAA,EAAA,IAEGC,MAAqB,iBACVC,IAAAC;AAAA,IACdH;AAAA,IACA;AAAA,MACI,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUA,EAAa,aAAa,SAAYA,EAAa,WAAW;AAAA,MACxE,IAAI;AAAA,QACA,UAAU;AAAA,QACV,YAAYA,EAAa,IAAI,cAAc,CAAC;AAAA,MAChD;AAAA,IACJ;AAAA,EAAA,IAEGC,MAAqB,iBACVC,IAAAC;AAAA,IACdH;AAAA,IACA;AAAA,MACI,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUA,EAAa,aAAa,SAAYA,EAAa,WAAW;AAAA,MACxE,YAAY;AAAA,IAChB;AAAA,EAAA,IAEGC,MAAqB,kBACVC,IAAAC;AAAA,IACdH;AAAA,IACA;AAAA,MACI,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUA,EAAa,aAAa,SAAYA,EAAa,WAAW;AAAA,MACxE,YAAYA,EAAa,cAAc,CAAC;AAAA,IAC5C;AAAA,EAAA,IAEGC,MAAqB,wBACVC,IAAAC;AAAA,IACdH;AAAA,IACA;AAAA,MACI,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUA,EAAa,aAAa,SAAYA,EAAa,WAAW;AAAA,MACxE,IAAI;AAAA,QACA,UAAU;AAAA,QACV,YAAYA,EAAa,IAAI,cAAc,CAAC;AAAA,MAChD;AAAA,IACJ;AAAA,EAAA,IAEGC,MAAqB,gBACVC,IAAAC;AAAA,IACdH;AAAA,IACA;AAAA,MACI,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUA,EAAa,aAAa,SAAYA,EAAa,WAAW;AAAA,MACxE,SAAS;AAAA,QACL,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,EAAA,IAEGC,MAAqB,sBACVC,IAAAC;AAAA,IACdH;AAAA,IACA;AAAA,MACI,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUA,EAAa,aAAa,SAAYA,EAAa,WAAW;AAAA,MACxE,IAAI;AAAA,QACA,UAAU;AAAA,QACV,SAASA,EAAa,IAAI,WAAW;AAAA,UACjC,aAAa;AAAA,QACjB;AAAA,MACJ;AAAA,IACJ;AAAA,EAAA,IAEGC,MAAqB,UACVC,IAAAC;AAAA,IACdH;AAAA,IACA;AAAA,MACI,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUA,EAAa,aAAa,SAAYA,EAAa,WAAW;AAAA,MACxE,UAAU;AAAA,MACV,YAAYA,EAAa,cAAc,CAAC;AAAA,IAC5C;AAAA,EAAA,IAEGC,MAAqB,cACVC,IAAAC;AAAA,IACdH;AAAA,IACA;AAAA,MACI,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUA,EAAa,aAAa,SAAYA,EAAa,WAAW;AAAA,MACxE,UAAU;AAAA,MACV,YAAY;AAAA,IAChB;AAAA,EAAA,IAEGC,MAAqB,cACVC,IAAAC;AAAA,IACdH;AAAA,IACA;AAAA,MACI,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUA,EAAa,aAAa,SAAYA,EAAa,WAAW;AAAA,IAC5E;AAAA,EAAA,IAEGC,MAAqB,qBACVC,IAAAC;AAAA,IACdH;AAAA,IACA;AAAA,MACI,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUA,EAAa,aAAa,SAAYA,EAAa,WAAW;AAAA,MACxE,IAAI;AAAA,QACA,UAAU;AAAA,MACd;AAAA,IACJ;AAAA,EAAA,IAEGC,MAAqB,WACVC,IAAAC;AAAA,IACdH;AAAA,IACA;AAAA,MACI,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUA,EAAa,aAAa,SAAYA,EAAa,WAAW;AAAA,IAC5E;AAAA,EAAA,IAEGC,MAAqB,cACVC,IAAAC;AAAA,IACdH;AAAA,IACA;AAAA,MACI,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUA,EAAa,aAAa,SAAYA,EAAa,WAAW;AAAA,MACxE,MAAM;AAAA,IACV;AAAA,EAAA,IAEGC,MAAqB,WACVC,IAAAC;AAAA,IACdH;AAAA,IACA;AAAA,MACI,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUA,EAAa,aAAa,SAAYA,EAAa,WAAW;AAAA,IAC5E;AAAA,EAAA,IAEGC,MAAqB,UACVC,IAAAC;AAAA,IACdH;AAAA,IACA;AAAA,MACI,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUA,EAAa,aAAa,SAAYA,EAAa,WAAW;AAAA,MACxE,OAAO;AAAA,QACH,YAAY,CAAC;AAAA,MACjB;AAAA,IACJ;AAAA,EAAA,IAEGC,KAAoBtH,EAAgBsH,CAAgB,MACzCC,IAAA;AAAA,IACd,GAAGvH,EAAgBsH,CAAgB,EAAE;AAAA,IACrC,gBAAgBA;AAAA,EAAA,IAIjBC;AACX;ACpQO,SAASE,GAAmB,EAAE,OAAAzR,GAAO,gBAAA0R,GAAgB,gBAAAxH,GAAgB,UAAApC,KAAqC;AACtG,SAAA,gBAAA5J;AAAA,IAAC+B;AAAA,IAAA;AAAA,MAAW,OAAAD;AAAA,MACA,UAAU0R;AAAA,MACV,WAAW;AAAA,MAC1B,UAAA,gBAAA5S;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAWQ;AAAA,YACP;AAAA,YACAoS,IAAiB,WAAW;AAAA,UAAE;AAAA,UAClC,UAAA;AAAA,YAAA,gBAAAxT,EAAC,SAAI,WAAW,QACZ,UAAC,gBAAAA,EAAAoM,IAAA,EAAoB,gBAAAJ,EAA+B,CAAA,GACxD;AAAA,8BACC,OACG,EAAA,UAAA;AAAA,cAAC,gBAAAhM,EAAA,OAAA,EAAK,YAAe,KAAK,CAAA;AAAA,cAC1B,gBAAAA;AAAA,gBAACa;AAAA,gBAAA;AAAA,kBAAW,SAAS;AAAA,kBACT,OAAO;AAAA,kBACP,WAAW;AAAA,kBAClB,UAAA+I,KAAY4J,IAAiB,+DAA+DxH,EAAe;AAAA,gBAAA;AAAA,cAChH;AAAA,YAAA,GACJ;AAAA,UAAA;AAAA,QAAA;AAAA,MACJ;AAAA,IAAA;AAAA,EAAA;AAER;ACxBO,SAASyH,GAAiB;AAAA,EACI,UAAArQ;AAAA,EACA,YAAA1C;AACJ,GAG9B;AAEC,QAAM,EAAE,QAAA/B,GAAQ,eAAAC,EAAc,IAAIO,EAAU,GAEtCuU,IAAW/T,EAAMhB,GAAQ,KAAK;AAEpC,SAEQ,gBAAAiC,EAAAoF,GAAA,EAAA,UAAA;AAAA,IAAC,gBAAAhG,EAAA,OAAA,EAAI,WAAW,eAEZ,UAAA,gBAAAY;AAAA,MAACiB;AAAA,MAAA;AAAA,QACG,UAAAuB;AAAA,QACA,UAAU;AAAA,QACV,eAAe,CAACtB,MAAkB;AAC9B,UAAIA,MAAU,WACVlD,EAAc,OAAO,EAAI,IAEzBA,EAAc,OAAOkD,CAAK;AAAA,QAClC;AAAA,QACA,OAAO;AAAA,QACP,aAAa,CAACA,MAAkB;AAC5B,kBAAQA,GAAO;AAAA,YACX,KAAK;AACM,qBAAA;AAAA,YACX,KAAK;AACM,qBAAA;AAAA,YACX,KAAK;AACM,qBAAA;AAAA,YACX;AACW,qBAAA;AAAA,UACf;AAAA,QACJ;AAAA,QACA,OAAO4R,KAAY;AAAA,QACnB,UAAA;AAAA,UAAC,gBAAA1T,EAAA+B,IAAA,EAAW,OAAO,UAAU,UAE7B,eAAA;AAAA,UACC,gBAAA/B,EAAA+B,IAAA,EAAW,OAAO,SAAS,UAE5B,SAAA;AAAA,UACC,gBAAA/B,EAAA+B,IAAA,EAAW,OAAO,SAAS,UAE5B,SAAA;AAAA,UACC,gBAAA/B,EAAA+B,IAAA,EAAW,OAAO,SAAS,UAE5B,SAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAER;AAAA,IAEC,gBAAA/B,EAAA,OAAA,EAAI,WAAW,eAEZ,4BAAC0I,IAEG,EAAA,UAAA,gBAAA1I;AAAA,MAACsH;AAAA,MAAA;AAAA,QAAyB,UAAAlE;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,QACL,MAAM;AAAA,QACN,YAAA1C;AAAA,MAAA;AAAA,OAE9B,EAEJ,CAAA;AAAA,IAEA,gBAAAV,EAAC,OAAI,EAAA,WAAW,eAEZ,UAAA,gBAAAA;AAAA,MAACiB;AAAA,MAAA;AAAA,QAAU,MAAM;AAAA,QACN,UAAAmC;AAAA,QACA,UAAU,CAAClC,MAAW;AACJ,UAAAtC,EAAA,gBAAgBsC,EAAE,OAAO,UAAU,KAAK,SAAYA,EAAE,OAAO,KAAK;AAAA,QACpF;AAAA,QACA,OAAO;AAAA,QACP,OAAOvB,EAAMhB,GAAQ,cAAc,KAAK;AAAA,MAAA;AAAA,IAAA,GAEvD;AAAA,EACJ,EAAA,CAAA;AAER;ACtFO,MAAMgV,KAAyC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAEaC,KAAkD,OAAO,QAAQC,EAAqB,EAC9F,OAAO,CAAC,CAACvR,CAAE,MAAMqR,GAAmB,SAASrR,CAAsB,CAAC,EACpE,IAAI,CAAC,CAACA,GAAIwR,CAAM,OAAO,EAAE,CAACxR,CAAE,GAAGwR,EAAO,EAAE,EACxC,OAAO,CAACtI,GAAGC,OAAO,EAAE,GAAGD,GAAG,GAAGC,EAAE,IAAI,CAAA,CAAE,GCsD7BsI,KAAerV,EAAM;AAAA,EAC9B,SAAsBuT,GAA0B;AAEtC,UAAA;AAAA,MACF,kBAAA+B,IAAmB;AAAA,MACnB,oBAAAC;AAAA,MACA,kBAAAC;AAAA,MACA,cAAA3D;AAAA,MACA,SAAA4D;AAAA,MACA,aAAAxR;AAAA,MACA,sBAAAyR;AAAA,MACA,mBAAAxR;AAAA,MACA,UAAAoI;AAAA,MACA,mBAAAmF;AAAA,MACA,4BAAAkE,IAA6B;AAAA,MAC7B,UAAAC;AAAA,MACA,SAAApR;AAAA,MACA,eAAAqR;AAAA,MACA,iBAAAC;AAAA,MACA,oBAAAnR;AAAA,MACA,eAAAoR;AAAA,MACA,SAAAnR;AAAA,MACA,iBAAAwI;AAAA,MACA,oBAAAsB;AAAA,IACA,IAAA6E,GAEEyC,IAA+B;AAAA,MACjC,IAAI;AAAA,MACJ,MAAM;AAAA,IAAA,GAGJtR,IAAY,GAAQ4H,KAAY,CAACD,GAAiBC,CAAQ,MAAM,CAACoC,GAEjEuH,IAAwBC,GAA4C5J,IAAW;AAAA,MACjF,IAAIrI;AAAA,MACJ,YAAYA;AAAA,MACZ,UAAAqI;AAAA,IAAA,IACA,MAAS,GAEP6J,IAAsB,CAAC;AAAA,MACI,IAAAvS;AAAA,MACA,UAAA0I;AAAAA,IAAA,MAC2B;AACxD,YAAM8J,IAAS;AAAA,QACX,IAAAxS;AAAA,QACA,YAAYqS,EAAsB,SAAS;AAAA,QAC3C,UAAA3J;AAAAA,QACA,WAAWpI;AAAA,MAAA;AAEf,MAAA+R,EAAsB,UAAUG,GAChC3E,IAAoB2E,CAAM;AAAA,IAAA,GAGxBC,IAAmBvR,GAAgC;AAAA,MACrD,eAAewH,IACT,EAAE,IAAIrI,GAAa,GAAGqI,MACtB0J;AAAA,MACN,eAAAH;AAAA,MACA,kBAAkB;AAAA,MAClB,yBAAyB;AAAA,MACzB,UAAU,CAACS,GAAmBC,MAAe;AACjC,gBAAA,MAAM,YAAYD,CAAiB;AACrC,cAAA;AAAA,UACF,IAAA1S;AAAA,UACA,GAAG0I;AAAAA,QACH,IAAAgK;AACgB,QAAAH,EAAA;AAAA,UAChB,IAAAvS;AAAA,UACA,UAAU,EAAE,GAAG0I,GAAU,UAAUA,EAAS,YAAY,GAAK;AAAA,QAAA,CAChE,GACIkJ,KACDe,EAAW,UAAU,EAAE,QAAQP,EAAc,CAAA;AAAA,MACrD;AAAA,MACA,YAAY,CAAC/V,MAAW;AACpB,cAAMI,IAA8B,CAAA;AACpC,YAAIiV,GAAkB;AACd,cAAA,CAACrV,EAAO;AACR,YAAAI,EAAO,OAAO;AAAA,eACX;AACG,kBAAA4R,IAAYuE,GAAavW,EAAO,IAAI;AACtC,YAAAgS,MACA5R,EAAO,OAAO4R;AAAA,UACtB;AACI,cAAA,CAAChS,EAAO;AACR,YAAAI,EAAO,KAAK;AAAA,eACT;AACH,kBAAMwH,IAAU4O,GAAWxW,EAAO,IAAIyV,CAAoB;AACtD,YAAA7N,MACAxH,EAAO,KAAKwH;AAAA,UACpB;AAAA,QACJ;AAEI,eAAA5H,EAAO,aAAa,YAChBA,EAAO,YAAY,WAAW,CAACyW,GAAczW,EAAO,YAAY,QAAQ,SAAS,CAAC,MAClFI,EAAO,aAAa;AAAA,UAChB,SAAS;AAAA,QAAA,IAIjBJ,EAAO,aAAa,eAAe,CAACA,EAAO,SAC3CI,EAAO,OAAO,uDAEdJ,EAAO,mBAAmB,aACpBA,EAAe,OACjBI,EAAO,KAAK,wCAGhBJ,EAAO,mBAAmB,YACpBA,EAAe,UACjBI,EAAO,QAAQ,sDAGhBA;AAAA,MACX;AAAA,IAAA,CACH;AAED,WAAAe,GAAU,MAAM;AACZ,MAAA2U,IAAgBM,CAAgB;AAAA,IAAA,GACjC,CAACA,GAAkBN,CAAa,CAAC,GAE7B,gBAAAzU,EAAC2D,IAAO,EAAA,OAAOoR,GAClB,UAAA,gBAAA/U;AAAA,MAACqV;AAAA,MAAA;AAAA,QACG,mBAAmBhB,IACbQ,IACA;AAAA,QACN,UAAAP;AAAA,QACA,mBAAmBN;AAAA,QACnB,mBAAApR;AAAA,QACA,SAAAM;AAAA,QACA,YAAYsR,KAAmBO,EAAiB,cAAc;AAAA,QAC9D,UAAUb;AAAA,QACV,cAAA3D;AAAA,QACA,SAAA4D;AAAA,QACA,oBAAAF;AAAA,QACA,UAAA7Q;AAAA,QACA,SAAAE;AAAA,QACA,oBAAAD;AAAA,QACA,iBAAAyI;AAAA,QACA,oBAAAsB;AAAA,QACC,GAAG2H;AAAA,MAAA;AAAA,IACZ,EAAA,CAAA;AAAA,EACJ;AAAA,EAAG,CAACvJ,GAAGC,MACHD,EAAE,YAAYC,EAAE,WAChBD,EAAE,gBAAgBC,EAAE,eACpBD,EAAE,sBAAsBC,EAAE,qBAC1BD,EAAE,qBAAqBC,EAAE,oBACzBD,EAAE,uBAAuBC,EAAE,sBAC3BD,EAAE,iBAAiBC,EAAE,gBACrBD,EAAE,qBAAqBC,EAAE;AACjC;AAEO,SAASsE,GAAmB;AAAA,EACI,MAAA1J;AAAA,EACA,UAAAiP;AAAA,EACA,aAAAC;AAAA,EACA,mBAAApF;AAAA,EACA,SAAA7M;AAAA,EACA,oBAAA8J;AAAA,EACA,GAAGoI;AACP,GAIhC;AACC,QAAMC,IAAYb;AAKX,SAAA,gBAAA5U;AAAA,IAACkC;AAAA,IAAA;AAAA,MACJ,MAAMmE,KAAQ;AAAA,MACd,UAAU;AAAA,MACV,WAAW;AAAA,MAEX,UAAA,gBAAAzF;AAAA,QAAC;AAAA,QAAA;AAAA,UAAK,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,UAAU,CAACM,MAAM;AACb,YAAAA,EAAE,eAAe,GACjBA,EAAE,gBAAgB,GACRuU,EAAA,SAAS,aAAavU,CAAC;AAAA,UACrC;AAAA,UACF,UAAA;AAAA,YAAA,gBAAAlB,EAACwG,IACG,EAAA,UAAA,gBAAAxG;AAAA,cAAC+T;AAAA,cAAA;AAAA,gBAAc,GAAGyB;AAAA,gBACJ,mBAAmB,CAACV,MAAW;AAC3B,kBAAA3E,IAAoB2E,CAAM,GACZS;gBAClB;AAAA,gBACA,oBAAAnI;AAAA,gBACA,4BAA4B;AAAA,gBAC5B,eAxBJ,CAACsI,MAA8C;AACjE,kBAAAD,EAAU,UAAUC;AAAA,gBAAA;AAAA,gBAwBE,SAAApS;AAAA,cAAA;AAAA,YAAA,GAElB;AAAA,8BAECmD,IAEI,EAAA,UAAA;AAAA,cAAY6O,KAAA,gBAAAtV;AAAA,gBAAC4E;AAAA,gBAAA;AAAA,kBACV,SAAS;AAAA,kBACT,SAAS,MAAM;AACF,oBAAA0Q,KACTG,EAAU,SAAS;kBACvB;AAAA,kBAAG,UAAA;AAAA,gBAAA;AAAA,cAEP;AAAA,cAEA,gBAAAzV;AAAA,gBAAC4E;AAAA,gBAAA;AAAA,kBAAO,SAAQ;AAAA,kBACR,MAAM;AAAA,kBACN,OAAM;AAAA,kBAAU,UAAA;AAAA,gBAAA;AAAA,cAExB;AAAA,YAAA,GACJ;AAAA,UAAA;AAAA,QAAA;AAAA,MACJ;AAAA,IAAA;AAAA,EAAA;AAGR;AAEA,SAASyQ,GAAuB;AAAA,EACI,QAAA1W;AAAA,EACA,QAAAI;AAAA,EACA,WAAA4W;AAAA,EACA,UAAA/L;AAAA,EACA,cAAA2G,IAAe;AAAA,EACf,oBAAA0D;AAAA,EACA,mBAAA2B;AAAA,EACA,mBAAAzF;AAAA,EACA,UAAAmE;AAAA,EACA,mBAAA1R;AAAA,EACA,SAAAM;AAAA,EACA,YAAAxC;AAAA,EACA,UAAA0C;AAAA,EACA,SAAA+Q;AAAA,EACA,SAAA7Q;AAAA,EACA,oBAAAD;AAAA,EACA,iBAAAyI;AAAA,EACA,oBAAAsB;AACJ,GAgBM;AAElC,QAAM,CAACyI,GAAYC,CAAa,IAAIxW,EAAS2U,CAAkB,GACzD,CAAC8B,GAAkBC,CAAmB,IAAI1W,EAAS,EAAK,GACxD,CAAC2W,GAAuBC,CAAwB,IAAI5W,EAA6BX,GAAQ,WAAWwX,GAAWxX,CAAM,IAAI,MAAS,GAElIyX,IAAqB,OAAO,QAAQxC,EAAe,EAAE,OAAO,OAAO,QAAQ9H,CAAe,CAAC,GAE3FuK,IAAmBlC,IACnBiC,EAAmB,OAAO,CAAC,CAAC/K,GAAGW,CAAc,MAAM,CAACf,GAAkBe,EAAe,QAAQ,KAAKA,EAAe,UAAU,aAAa,OAAO,IAC/IoK,GAEAE,IAAiBC,GAAiB5X,CAAM,GACxC6X,IAAe5B,GAAyB,IAAI,GAE5CD,IAAwBC,GAAejW,CAAM,GAE7C8X,IAAsB/V,KAAcf,EAAMZ,GAAQ,gBAAgB;AAExE,EAAAe,GAAU,MAAM;AACZ,QAAIqQ,MACK,CAACyF,KAAqBU,EAAe,KAAK;AACrC,YAAA;AAAA,QACF,IAAAhU;AAAA,QACA,GAAG0I;AAAA,MACH,IAAAsL;AACJ,MAAKlQ,GAAMkQ,GAAgB3B,EAAsB,OAAO,MAClCxE,EAAA;AAAA,QACd,IAAA7N;AAAA,QACA,UAAA0I;AAAA,QACA,WAAWpI;AAAA,MAAA,CACd,GACD+R,EAAsB,UAAU2B;AAAA,IAExC;AAAA,KAEL,CAACA,GAAgBV,GAAmBzF,GAAmBvN,CAAiB,CAAC,GAE5E9C,GAAU,MAAM;AACR,IAAAnB,GAAQ,MAAMuE,KACNA,EAAAvE,GAAQ,IAAIiE,GAAmB7D,CAAM;AAAA,EACjD,GACD,CAACA,GAAQmE,GAASN,GAAmBjE,GAAQ,EAAE,CAAC;AAE7C,QAAA+X,IAAwB,CAACC,MAA0C;AACrE,IAAAT,EAAyBS,CAAmB,GAC5ChB,EAAUzC,GAAyBvU,GAAQgY,GAAqB7K,CAAe,CAAC,GAEhF,WAAW,MAAM;AACb,MAAA0K,EAAa,SAAS;OACvB,CAAC;AAAA,EAAA;AAGJ,MAAAI;AACJ,SAAIX,MAA0B,gBAC1BA,MAA0B,eAC1BA,MAA0B,cAC1BA,MAA0B,UAEtBW,IAAA,gBAAA5W;AAAA,IAACiR;AAAA,IAAA;AAAA,MAAoB,UAAUgF;AAAA,MACV,UAAA7S;AAAA,MACA,YAAA1C;AAAA,IAAA;AAAA,EAAA,IAClBuV,MAA0B,QAE7BW,IAAA,gBAAA5W;AAAA,IAACyT;AAAA,IAAA;AAAA,MAAiB,UAAArQ;AAAA,MACA,YAAA1C;AAAA,IAAA;AAAA,EAAA,IACfuV,MAA0B,YACjCA,MAA0B,kBACTW,IAAA,gBAAA5W;AAAA,IAAC6I;AAAA,IAAA;AAAA,MACd,aAAa;AAAA,MACb,oBAAAxF;AAAA,MACA,WAAW,CAACuG;AAAA,MACZ,UAAAxG;AAAA,MACA,SAAAE;AAAA,MACA,YAAA5C;AAAA,IAAA;AAAA,EAAA,IACGuV,MAA0B,kBACjCA,MAA0B,wBACTW,IAAA,gBAAA5W;AAAA,IAAC6I;AAAA,IAAA;AAAA,MACd,aAAa;AAAA,MACb,WAAW,CAACe;AAAA,MACZ,UAAAxG;AAAA,MACA,oBAAAC;AAAA,MACA,SAAAC;AAAA,MACA,YAAA5C;AAAA,IAAA;AAAA,EAAA,IACGuV,MAA0B,gBAE7BW,IAAA,gBAAA5W;AAAA,IAAC0J;AAAA,IAAA;AAAA,MAAqB,UAAAE;AAAA,MACA,UAAU;AAAA,MACV,UAAAxG;AAAA,IAAA;AAAA,EAAA,IACnB6S,MAA0B,sBAE7BW,IAAA,gBAAA5W;AAAA,IAAC0J;AAAA,IAAA;AAAA,MAAqB,UAAAE;AAAA,MACA,UAAU;AAAA,MACV,UAAAxG;AAAA,IAAA;AAAA,EAAA,IACnB6S,MAA0B,WAChBW,IAAA,gBAAA5W,EAACmR,MAAqB,UAAA/N,EAAmB,CAAA,IACnD6S,MAA0B,iBAChBW,IAAA,gBAAA5W,EAACyR,MAAoB,UAAArO,EAAmB,CAAA,IAClD6S,MAA0B,UAE7BW,IAAA,gBAAA5W;AAAA,IAAC+O;AAAA,IAAA;AAAA,MAAiB,UAAA3L;AAAA,MAAoB,SAAAE;AAAA,MAAkB,oBAAAD;AAAA,MACtC,oBAAA+J;AAAA,MACA,iBAAAtB;AAAA,IAAA;AAAA,EAAA,IACfmK,MAA0B,UAE7BW,IAAA,gBAAA5W;AAAA,IAACoR;AAAA,IAAA;AAAA,MAAmB,UAAAhO;AAAA,MAAoB,SAAAE;AAAA,MAAkB,oBAAAD;AAAA,MACtC,oBAAA+J;AAAA,MACA,iBAAAtB;AAAA,IAAA;AAAA,EAAA,IACjBmK,MAA0B,cAE7BW,IAAA,gBAAA5W;AAAA,IAAC0R;AAAA,IAAA;AAAA,MAAuB,YAAAhR;AAAA,MACA,UAAAkJ;AAAA,MACA,UAAU;AAAA,MACV,UAAAxG;AAAA,IAAA;AAAA,EAAA,IACrB6S,MAA0B,cAChBW,IAAA,gBAAA5W,EAACyS,MAAsB,UAAArP,EAAmB,CAAA,IACpD6S,MAA0B,qBAE7BW,IAAA,gBAAA5W;AAAA,IAAC0R;AAAA,IAAA;AAAA,MAAuB,YAAAhR;AAAA,MACA,UAAAkJ;AAAA,MACA,UAAU;AAAA,MACV,UAAAxG;AAAA,IAAA;AAAA,EAAA,IACrB6S,MAA0B,WAE7BW,IAAA,gBAAA5W;AAAA,IAACgQ;AAAA,IAAA;AAAA,MAAoB,YAAAtP;AAAA,MACA,UAAAkJ;AAAA,MACA,SAAAtG;AAAA,MACA,oBAAAD;AAAA,MACA,UAAAD;AAAA,MACA,oBAAAgK;AAAA,MACA,iBAAAtB;AAAA,IAAA;AAAA,EAAA,IAClBmK,MAA0B,cAE7BW,IAAA,gBAAA5W,EAACiT,MAAsB,UAAA7P,EAAmB,CAAA,IAE7BwT,IAAA,MAKZ,gBAAAhW,EAAAoF,GAAA,EAAA,UAAA;AAAA,IAAY5C,KAAA,gBAAAxC,EAACiW,IAAU,EAAA,MAAM,QAC1B,UAAA;AAAA,MAAA,gBAAA7W,EAACa,KAAW,UAAkC,gCAAA,CAAA;AAAA,MAC9C,gBAAAD,EAACC,GAAW,EAAA,SAAS,WAAW,UAAA;AAAA,QAAA;AAAA,QAEa,gBAAAb,EAAC,UAAK,UAAQ,WAAA,CAAA;AAAA,QAAO;AAAA,MAAA,GAClE;AAAA,IAAA,GACJ;AAAA,IAEA,gBAAAY,EAAC,OAAI,EAAA,WAAU,6BACX,UAAA;AAAA,MAAC,gBAAAA,EAAA,OAAA,EAAI,WAAW,8BACZ,UAAA;AAAA,QAAA,gBAAAZ;AAAA,UAAC6B;AAAA,UAAA;AAAA,YAEG,OAAO,EAAQ4U;AAAA,YACf,OAAOR,KAAyB;AAAA,YAChC,aAAa;AAAA,YACb,MAAMJ;AAAA,YACN,cAAcC;AAAA,YACd,UAAU;AAAA,YACV,UAAA1S;AAAA,YACA,aAAa,CAACtB,MAAU;AACpB,kBAAI,CAACA;AACM,uBAAA,gBAAA9B,EAAC,QAAG,UACD,2BAAA,CAAA;AAEd,oBAAMsL,IAAMxJ,GACNkK,IAAiB6H,GAAsBvI,CAAG,KAAKQ,EAAgBR,CAAG,GAClEwL,KAAe9K,EAAe,UAC9B+K,KAAkBD,MAAgB,CAAC7L,GAAkB6L,EAAY,IAAI7K,GAAe6K,IAAchL,CAAe,IAAI,QACrH0H,KAAiBvI,GAAkB6L,EAAY,KAAMlN,KAAYkN,GAAa,aAAanY,GAAQ,UACnGqY,KAAsBD,KAAkBzD,EAAUyD,IAAiB/K,CAAc,IAAIA;AACpF,qBAAA,gBAAApL;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACJ,SAAS,CAACM,OAAM;AACZ,oBAAIsS,OACAtS,GAAE,gBAAgB,GAClBA,GAAE,eAAe;AAAA,kBAEzB;AAAA,kBACA,WAAWE;AAAA,oBACP;AAAA,oBACAoS,KAAiB,0CAA0C;AAAA,kBAAE;AAAA,kBACjE,UAAA;AAAA,oBAAA,gBAAAxT,EAAC,SAAI,WAAW,QACZ,4BAACoM,IAAoB,EAAA,gBAAgB4K,IAAoB,EAC7D,CAAA;AAAA,oBACA,gBAAApW,EAAC,OAAI,EAAA,WAAW,iDACZ,UAAA;AAAA,sBAAC,gBAAAZ,EAAA,OAAA,EAAK,aAAoB,KAAK,CAAA;AAAA,sBAC/B,gBAAAA;AAAA,wBAACa;AAAA,wBAAA;AAAA,0BAAW,SAAS;AAAA,0BACT,OAAO;AAAA,0BACd,UAAA2S,KAAiB,+DAA+DwD,GAAoB;AAAA,wBAAA;AAAA,sBACzG;AAAA,oBAAA,GACJ;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YAER;AAAA,YACA,eAAe,CAAClV,MAAU;AACtB,cAAA4U,EAAsB5U,CAAyB;AAAA,YACnD;AAAA,YACC,YAAiB,IAAI,CAAC,CAACwJ,GAAKU,CAAc,MAAM;AAC7C,oBAAM8K,IAAe9K,EAAe,UAC9BwH,KAAiB5J,KAAY,CAACqB,GAAkB6L,CAAY,KAAKA,EAAa,aAAanY,GAAQ;AAClG,qBAAA,gBAAAqB;AAAA,gBAACuT;AAAA,gBAAA;AAAA,kBAEJ,OAAOjI;AAAA,kBACP,gBAAAkI;AAAA,kBACA,gBAAAxH;AAAA,kBACA,UAAApC;AAAA,gBAAA;AAAA,gBAJK0B;AAAA,cAAA;AAAA,YAIc,CAC1B;AAAA,UAAA;AAAA,QACL;AAAA,QAECmL,KACG,gBAAAzW;AAAA,UAACa;AAAA,UAAA;AAAA,YAAW,SAAQ;AAAA,YACR,WAAW;AAAA,YACX,OAAO;AAAA,YAAS,UAAA;AAAA,UAAA;AAAA,QAAQ;AAAA,MAAA,GAK5C;AAAA,MAECyT,KAAY3V,GAAQ,MACjB,gBAAAqB;AAAA,QAACe;AAAA,QAAA;AAAA,UACG,SAAS;AAAA,UACT,WAAU;AAAA,UACV,UAAAqC;AAAA,UACA,SAAS,MAAM4S,EAAoB,EAAI;AAAA,UACvC,4BAACiB,IAAU,EAAA;AAAA,QAAA;AAAA,MACf;AAAA,IAAA,GACR;AAAA,IAEA,gBAAArW,EAAC,OAAI,EAAA,WAAW,wCACX,UAAA;AAAA,MACGgV,KAAA,gBAAA5V;AAAA,QAACqQ;AAAA,QAAA;AAAA,UAAqB,YAAA3P;AAAA,UACA,YAAYkJ;AAAA,UACZ,eAAe,CAACA;AAAA,UAChB,UAAAxG;AAAA,UACA,cAAAmN;AAAA,UACA,KAAKiG;AAAA,QAAA;AAAA,MAAa;AAAA,MAE3CI;AAAA,wBAEA,OAAI,EAAA,WAAW,eACZ,UAAC,gBAAA5W,EAAAgT,IAAA,EAA2B,UAAA5P,EAAmB,CAAA,GACnD;AAAA,IAAA,GACJ;AAAA,IAECkR,KACG,gBAAAtU;AAAA,MAACkX;AAAA,MAAA;AAAA,QAAyB,MAAMnB;AAAA,QACN,UAAU,MAAMzB,EAAS3V,GAAQ,IAAIiE,CAAiB;AAAA,QACtD,UAAU,MAAMoT,EAAoB,EAAK;AAAA,QACzC,OAAQ,gBAAAhW,EAAA,OAAA,EAAI,UAAqB,wBAAA,CAAA;AAAA,QACjC,wBACK,OAAI,EAAA,UAAA;AAAA,UAAA;AAAA,UAAW,gBAAAA,EAAC,OAAE,UACX,sBAAA,CAAA;AAAA,UAAI;AAAA,QAAA,GACG;AAAA,MAAA;AAAA,IAClB;AAAA,EAEnC,EAAA,CAAA;AAER;AAEA,MAAMmX,KAAU;AAEhB,SAAShC,GAAWrT,GAAgBsS,GAAiC;AAE7D,MAAApC;AACJ,SAAKlQ,MACOkQ,IAAA,yCAERlQ,KAAS,CAACA,EAAM,MAAMqV,EAAO,MACrBnF,IAAA,8FAERlQ,KAASsS,KAAwBA,EAAqB,SAAStS,CAAK,MAC5DkQ,IAAA,gDAELA;AACX;AAEA,SAASkD,GAAapT,GAAe;AAC7B,MAAAkQ;AACJ,SAAKlQ,MACOkQ,IAAA,2CAELA;AACX;ACtmBO,SAASoF,GAAUC,GAAqB;AAC3C,SAAKA,KACGA,EAAI,MAAM,GAAG,CAAC,EAAE,YAAY,IAAIA,EAAI,MAAM,CAAC,GAC9C,QAAQ,gBAAgB,GAAG,EAC3B,MAAM,OAAO,EACb,OAAO,CAACC,GAAKC,MACHD,IAAMC,EAAI,CAAC,EAAE,gBAAgBA,EAAI,UAAU,CAAC,GACpD,EAAE,IANQ;AAOrB;ACDO,SAASC,GAAc,EAAE,YAAAjF,GAAY,cAAAkF,GAAc,MAAApR,KAA+E;AAErI,QAAMqR,IAAqBzO,MAErB0O,IAAO;AAAA;AAAA,WAA6DpF,EAAW,OAAO6E,GAAU7E,EAAW,IAAI,IAAI,QAAQ,mCAAmCqF,GAAM,UAAUC,GAAiBtF,CAAU,GAAG,MAAM,GAAI;AACrN,SAAA,gBAAA3R;AAAA,IAACsB;AAAA,IAAA;AAAA,MAAO,MAAAmE;AAAA,MACA,cAAAoR;AAAA,MACA,UAAU;AAAA,MACrB,UAAA;AAAA,QAAA,gBAAA7W,EAAC4F,IACG,EAAA,UAAA;AAAA,UAAA,gBAAA5F,EAACC,GAAW,EAAA,SAAS,MAAM,WAAW,QAAQ,UAAA;AAAA,YAAA;AAAA,YAChC0R,EAAW;AAAA,UAAA,GACzB;AAAA,UACC,gBAAA3R,EAAAC,GAAA,EAAW,SAAS,SAAS,WAAW,aAAa,UAAA;AAAA,YAAA;AAAA,YAGjC,gBAAAb;AAAA,cAAC;AAAA,cAAA;AAAA,gBAClB,KAAI;AAAA,gBACJ,MAAM;AAAA,gBAAoD,UAAA;AAAA,cAAA;AAAA,YAAI;AAAA,YAAI;AAAA,UAAA,GACtE;AAAA,UACA,gBAAAA;AAAA,YAAC8X;AAAA,YAAA;AAAA,cACG,OAAOC,GAAO;AAAA,cACd,MAAAJ;AAAA,cACA,UAAS;AAAA,cAER,UAAA,CAAC,EAAE,WAAAzK,GAAW,OAAA8K,GAAO,QAAAC,GAAQ,cAAAC,GAAc,eAAAC,EAAA,MACvC,gBAAAnY,EAAA,OAAA,EAAI,OAAAgY,GAAc,WAAW,uBACzC,YAAO,IAAI,CAACI,GAAMC,MACf,gBAAArY,EAAC,SAAa,GAAGkY,EAAa,EAAE,MAAAE,GAAM,GACjC,UAAKA,EAAA,IAAI,CAACE,GAAOhN,wBACb,QAAgB,EAAA,GAAG6M,EAAc,EAAE,OAAAG,EAAA,CAAO,EAAhC,GAAAhN,CAAmC,CACjD,EAHK,GAAA+M,CAIV,CACH,GACH;AAAA,YAAA;AAAA,UAEM;AAAA,QAAA,GAEJ;AAAA,0BACC5R,IACG,EAAA,UAAA;AAAA,UAAA,gBAAA7F;AAAA,YAACgE;AAAA,YAAA;AAAA,cACG,SAAS;AAAA,cACT,MAAM;AAAA,cACN,SAAS,CAAC1D,OACNA,EAAE,gBAAgB,GAClBA,EAAE,eAAe,GACjBwW,EAAmB,KAAK;AAAA,gBACpB,MAAM;AAAA,gBACN,SAAS;AAAA,cAAA,CACZ,GACM,UAAU,UAAU,UAAUC,CAAI;AAAA,cAE7C,UAAA;AAAA,gBAAC,gBAAA3X,EAAAuY,IAAA,EAAgB,MAAM,QAAQ,CAAA;AAAA,gBAAE;AAAA,cAAA;AAAA,YAAA;AAAA,UAErC;AAAA,4BACC3T,GAAO,EAAA,SAAS,MAAM6S,EAAa,EAAK,GAAG,UAAK,SAAA;AAAA,QAAA,GACrD;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAER;AAEA,SAASI,GAAiBtF,GAAsC;AAEtD,QAAAiG,IAAkB,CAACxN,MAAkB;AAEvC,UAAMqI,IAAkB;AAAA,MACpB,GAAGrI;AAAA,IAAA;AAQH,WALJ,OAAOqI,EAAgB,aACvB,OAAOA,EAAgB,UACvB,OAAOA,EAAgB,iBACvB,OAAOA,EAAgB,UAEnBA,EAAgB,SAAS,QAClB;AAAA,MACH,GAAGA;AAAA,MACH,YAAYA,EAAgB,WAAW,IAAImF,CAAe;AAAA,IAAA,IAG3DnF;AAAA,EAAA;AAGJ,SAAA;AAAA,IACH,IAAId,EAAW;AAAA,IACf,MAAMA,EAAW;AAAA,IACjB,cAAcA,EAAW;AAAA,IACzB,MAAMA,EAAW;AAAA,IACjB,aAAaA,EAAW;AAAA,IACxB,UAAU;AAAA,IACV,iBAAiBA,EAAW;AAAA,IAC5B,MAAMA,EAAW;AAAA,IACjB,OAAOA,EAAW;AAAA,IAClB,UAAUA,EAAW;AAAA,IACrB,eAAeA,EAAW;AAAA,IAC1B,aAAaA,EAAW;AAAA,IACxB,YAAY,OAAO,QAAQA,EAAW,cAAc,EAAE,EACjD,IAAI,CAAC,CAACjH,GAAKxJ,CAAK,OAAO;AAAA,MACpB,CAACwJ,CAAG,GAAGkN,EAAgB1W,CAAK;AAAA,IAC9B,EAAA,EACD,OAAO,CAAC0J,GAAGC,OAAO,EAAE,GAAGD,GAAG,GAAGC,MAAM,EAAE;AAAA,IAC1C,iBAAiB8G,EAAW,kBAAkB,CAAA,GAAI,IAAIsF,EAAgB;AAAA,EAAA;AAG9E;ACzDO,SAASY,GAA+B;AAAA,EACI,YAAA/X;AAAA,EACA,iBAAAvC;AAAA,EACA,mBAAAua;AAAA,EACA,iBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,gBAAAxa;AAAA,EACA,WAAAya;AAAA,EACA,SAAAC;AAAA,EACA,SAAAxV;AAAA,EACA,uBAAAyV;AAAA,EACA,iBAAAjN;AAAA,EACA,oBAAAsB;AACJ,GAA8B;AAEnE,QAAA;AAAA,IACF,QAAAzO;AAAA,IACA,eAAAC;AAAA,IACA,eAAAmK;AAAA,IACA,iBAAA/J;AAAA,IACA,QAAAD;AAAA,IACA,OAAAia;AAAA,MACA7Z,EAA+B,GAE7BuY,IAAqBzO,MAErBgQ,IAAcC,MACdC,IAAW,CAACF,GAGZ,CAACG,GAAuBC,CAAwB,IAAI/Z,EAA6B,GACjF,CAACsN,GAAqBsC,CAAsB,IAAI5P,EAA6B,GAC7E,CAAC6P,GAA2BC,CAA4B,IAAI9P,EAA6B,GAEzFqQ,IAAyB/C,IAAsBlK,GAAUkK,GAAqBuC,CAAyB,IAAI,QAC3GS,IAAmBD,IAAyBhQ,EAAMhB,EAAO,YAAYgR,EAAuB,WAAW,KAAK,cAAc,CAAC,IAAI,QAC/H,CAAC2J,GAAgBC,CAAiB,IAAIja,EAAkB,EAAK,GAE7D,CAACka,GAAqBC,CAAsB,IAAIna,EAAkB,EAAK,GAEvE,CAACoa,GAAuBC,CAAwB,IAAIra,EAAkB,EAAK,GAC3E,CAAC6N,IAAsByM,EAAuB,IAAIta,EAAmB,CAAE,CAAA,GAEvEua,KAA4Bnb,EAAM,OAErCC,EAAO,kBAAkB,EAAE,IAAIA,EAAO,gBAAoB,IAAA,CAAE,CAAA;AAE/D,EAAAmB,GAAU,MAAM;AACR,IAAA8Y,KACAA,EAASI,CAAK;AAAA,EAAA,GACnB,CAACA,CAAK,CAAC;AAEJ,QAAAc,KAA0Bf,IAC1B,MAAY;AACV,IAAKA,MAGLU,EAAuB,EAAI,GAE3BV,EAAsBpa,CAAM,EACvB,KAAK,CAACob,MAAkB;AAKrB,UAHIA,KACAC,GAAuBD,EAAc,UAAwB,GAE7D,CAACA,GAAe;AAChB,QAAArC,EAAmB,KAAK;AAAA,UACpB,MAAM;AAAA,UACN,SAAS;AAAA,QAAA,CACZ;AACD;AAAA,MACJ;AAEA,YAAMuC,KAAmBF,EAAc,aAAa,OAAO,KAAKA,EAAc,UAAU,IAAI,CAAA,GACvF,OAAO,CAACpX,MAAgB,CAAChE,EAAO,WAAWgE,CAAW,CAAC;AACxD,UAAAsX,EAAgB,WAAW,GAAG;AAC9B,QAAAvC,EAAmB,KAAK;AAAA,UACpB,MAAM;AAAA,UACN,SAAS;AAAA,QAAA,CACZ;AACD;AAAA,MACJ;AAEA,YAAMwC,IAAoB;AAAA,QACtB,GAAGD,EAAgB,OAAO,CAAC1C,GAAK5U,QAC5B4U,EAAI5U,EAAW,KAAKoX,EAAc,cAAc,CAAA,GAAIpX,EAAW,GACxD4U,IACR,EAEF;AAAA,QACD,GAAG5Y,EAAO;AAAA,MAAA,GAERwb,IAAyB;AAAA,QAC3B,GAAGF;AAAA,QACH,GAAItb,EAAO,mBAAmB,CAAC;AAAA,MAAA;AAErB,MAAAC,EAAA,cAAcsb,GAAmB,EAAK,GAEpDE,GAAsBD,CAAsB,GAE5CP,GAAwBK,CAAe;AAAA,IAAA,CAC1C,EACA,QAAQ,MAAM;AACX,MAAAR,EAAuB,EAAK;AAAA,IAAA,CAC/B;AAAA,EAEP,IAAA,QAEAY,KAA4B9M,EAAY,CAAC/K,MACtCA,IACEqX,GAA0B,QAAQrX,CAAS,KAAK7C,EAAMhB,GAAQ8D,GAA+BD,CAAS,CAAC,IADvFqX,GAA0B,QAAQ,EAAE,GAE5D,CAAClb,CAAM,CAAC,GAELyb,KAAwB7M,EAAY,CAACI,GAA8BnL,MAAuB;AACtF,UAAAiN,IAAsBhN,GAA+BD,CAAS;AAEtD,IAAA5D,EAAA6Q,GAAqB9B,GAAoB,EAAK,GAClCkM,GAAA,QAAQrX,KAAa,EAAE,IAAImL;AAAA,EAAA,GAEtD,CAAC/O,CAAa,CAAC,GAEZ2Q,KAAiBhC,EAAY,CAAC5K,GAAsBH,MAAuB;AAC7E,UAAMiM,IAAS9L,IAAcD,GAAUC,GAAaH,CAAS,IAAI;AACjE,QAAI,CAACiM;AACD,YAAM,MAAM,+BAA+B;AAE/C,IAAA7P,EAAcyD,GAAmBoM,CAAM,GAAG,QAAW,EAAK;AAG1D,UAAMd,IADyB0M,GAA0B7X,CAAS,EAChB,OAAO,CAACkN,OAAMA,OAAM/M,CAAW;AACjF,IAAAyX,GAAsBzM,GAAoBnL,CAAS,GAEnDmX,EAAyB,EAAK,GAE9BN,EAAyB,MAAS,GAClCnK,EAAuB,MAAS,GAChCE,EAA6B,MAAS;AAAA,EACvC,GAAA,CAACiL,IAA2Bzb,GAAewb,EAAqB,CAAC,GAE9DpN,KAAiB,CAACK,GAA2B7K,MAAuB;AACtE,IAAA5D,EAAc6D,GAA+BD,CAAS,GAAG6K,GAAiB,EAAK;AAAA,EAAA,GAG7EgC,KAAoB,CAAC;AAAA,IACI,IAAA/M;AAAA,IACA,UAAA0I;AAAA,EAAA,MAIzB;AACF,QAAI,CAAC1I;AACD,YAAM,MAAM,oDAAoD;AAEpE,IAAA1D,EAAc,cAAc;AAAA,MACxB,GAAID,EAAO,cAAc,CAAC;AAAA,MAC1B,CAAC2D,CAAE,GAAG0I;AAAA,OACP,EAAK;AACF,UAAA2C,IAAqB,CAAC,GAAIhP,EAAO,mBAAmB,OAAO,KAAKA,EAAO,UAAU,GAAI2D,CAAE;AAE7F,IAAA8X,GAAsBzM,CAAkB,GAExCgM,EAAyB,EAAK,GAC1BV,MACyBI,EAAA1L,EAAmB,QAAQrL,CAAE,CAAC,GACvD4M,EAAuB5M,CAAE,IAE7B8M,EAA6B,MAAS;AAAA,EAAA,GAGpCe,KAAoB,CAAC;AAAA,IACI,IAAA7N;AAAA,IACA,UAAA0I;AAAA,IACA,YAAAsP;AAAA,IACA,WAAA9X;AAAA,EAAA,MAC2B;AAEtD,UAAMiM,IAASnM,IAAKI,GAAUJ,GAAIE,CAAS,IAAI,QACzC+X,KAAe9L,IAASpM,GAAmBoM,CAAM,IAAI;AAGvD,QAAA6L,KAAcA,MAAehY,GAAI;AACjC,cAAQ,MAAM,gCAAgC;AAAA,QAC1C,IAAAA;AAAA,QACA,UAAA0I;AAAA,QACA,YAAAsP;AAAA,QACA,WAAA9X;AAAA,MAAA,CACH;AAEK,YAAAgY,KAAiB9X,GAAU4X,GAAY9X,CAAS,GAChDiY,KAAuBpY,GAAmBmY,EAAc,GAKxD7M,KAHyB0M,GAA0B7X,CAAS,EAI7D,IAAI,CAACkN,OAAMA,OAAM4K,IAAahY,IAAKoN,EAAC,EACpC,OAAO,CAACA,OAAMA,OAAM,MAAS;AAElC,MAAA0K,GAAsBzM,IAAoBnL,CAAS,GAE/CF,MACyB+W,EAAA1L,GAAmB,QAAQrL,CAAE,CAAC,GACvD4M,EAAuB5M,CAAE,IAEf1D,EAAA6b,IAAsB,QAAW,EAAK,GACpCzb,EAAAyb,IAAsB,IAAO,EAAK;AAAA,IACtD;AAEA,YAAQ,MAAM,qBAAqB;AAAA,MAC/B,IAAAnY;AAAA,MACA,UAAA0I;AAAA,MACA,YAAAsP;AAAA,MACA,WAAA9X;AAAA,MACA,cAAA+X;AAAA,IAAA,CACH,GAEGA,OACc3b,EAAA2b,IAAcvP,GAAU,EAAK,GAC3BhM,EAAAub,IAAc,IAAM,EAAK;AAAA,EAC7C,GAIEG,KAA0BnN,EAAY,CAACjL,GAAYE,GAAoBwP,MAAgC;AACzG,UAAMuI,IAAejY,IAAKI,GAAUJ,GAAIE,CAAS,IAAI;AAOrD,QANA,QAAQ,MAAM,2BAA2B;AAAA,MACrC,IAAAF;AAAA,MACA,WAAAE;AAAA,MACA,OAAAwP;AAAA,MACA,cAAAuI;AAAA,IAAA,CACH,GACGA,GAAc;AACd,YAAM7W,IAAWsO,KAAS,OAAO,KAAKA,CAAK,EAAE,SAAS;AACtD,MAAA2G,EAAgBrW,GAAIE,GAAWkB,IAAWsO,IAAQ,MAAS,GAC3DjJ,EAAc1G,GAAmBkY,CAAY,GAAG7W,IAAW,mBAAmB,MAAS;AAAA,IAC3F;AAAA,EACJ,GAAG,CAAE,CAAA,GAECiX,KAAsB,MAAM;AAC9B,IAAAtB,EAAyB,MAAS,GAClCnK,EAAuB,MAAS;AAAA,EAAA,GAG9BqF,KAAgB3H,KAAuB8L,GAAmB,SAAS,aAAaA,EAAkB,QAAQ,WAAW9L,CAAmB,IAAI,QAE5IgO,KAAkBjc,GAAQ,oBAAoB,UAAaA,EAAO,gBAAgB,WAAW,GAE7Fkc,KAAuBlc,EAAO,kBAC9BA,EAAO,kBACP,OAAO,KAAKA,EAAO,UAAU,GAE7Bmc,KAAQ1R,GAAQ,MAAMzK,EAAO,UAAUma,EAAQna,EAAO,OAAO,IAAI,MAAM,CAACma,GAASna,EAAO,OAAO,CAAC,GAEhGkO,KAAkBU,EAAY,CAAC5K,GAAqBH,MAAuB;AAC7E,YAAQ,MAAM,qCAAqC;AAAA,MAC/C,aAAAG;AAAA,MACA,WAAAH;AAAA,IAAA,CACH,GACwB6W,EAAAwB,GAAoB,QAAQlY,CAAW,CAAC,GACjEuM,EAAuBvM,CAAW,GAClCyM,EAA6B5M,CAAS;AAAA,EAAA,GACvC,CAACqY,EAAmB,CAAC,GAElBE,KACF,gBAAAna,EAAC,OAAI,EAAA,WAAW,8DACZ,UAAA;AAAA,IAAA,gBAAAA,EAAC,SAAI,WAAWQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA,CAAC+X,KAAY,cAAcvK;AAAA,IAG3B,GAAA,UAAA;AAAA,MAAC,gBAAAhO,EAAA,OAAA,EAAI,WAAU,aAEX,UAAA;AAAA,QAAC,gBAAAA,EAAA,OAAA,EAAI,WAAU,kBAEX,UAAA;AAAA,UAAA,gBAAAZ;AAAA,YAACqB;AAAA,YAAA;AAAA,cACG,MAAM;AAAA,cACN,IAAIC;AAAA,cACJ,WAAW;AAAA,cACX,WAAU;AAAA,cACV,gBAAe;AAAA,cACf,aAAa;AAAA,cACb,MAAM;AAAA,cACN,UAAQ;AAAA,cACR,OAAO,EAAQvC,GAAQ;AAAA,YAAI;AAAA,UAAE;AAAA,UAEhC+b,MACG,gBAAAla;AAAA,YAACC;AAAA,YAAA;AAAA,cAAW,SAAS;AAAA,cACT,WAAW;AAAA,cACX,OAAO;AAAA,cAAa,UAAA;AAAA,gBAAA;AAAA,gBAChBia,GAAM;AAAA,cAAA;AAAA,YAAA;AAAA,UACtB;AAAA,QAAA,GACR;AAAA,QAECjC,KAAa,gBAAA7Y,EAAC,OAAI,EAAA,WAAU,QACxB,UACL6Y,GAAA;AAAA,QAEA,gBAAAjY,EAAC,OAAI,EAAA,WAAU,iCACX,UAAA;AAAA,UAAC,gBAAAZ,EAAAc,IAAA,EAAQ,OAAO,oCACZ,UAAA,gBAAAd;AAAA,YAACe;AAAA,YAAA;AAAA,cACG,SAAS;AAAA,cACT,UAAUyY;AAAA,cACV,SAAS,MAAMD,EAAkB,EAAI;AAAA,cACrC,4BAACyB,IAAQ,EAAA;AAAA,YAAA;AAAA,UAAA,GAEjB;AAAA,UACClB,MAA2B,gBAAA9Z,EAACc,IAAQ,EAAA,OAAO,oCACxC,UAAA,gBAAAd;AAAA,YAACe;AAAA,YAAA;AAAA,cACG,SAAS;AAAA,cACT,UAAUyY;AAAA,cACV,SAASM;AAAA,cACR,cAAuB,gBAAA9Z,EAAAmF,IAAA,EAAiB,MAAM,QAAQ,CAAA,sBAAMC,IAAe,EAAA;AAAA,YAAA;AAAA,UAAA,GAEpF;AAAA,UACA,gBAAApF,EAACc,IAAQ,EAAA,OAAO,oBACZ,UAAA,gBAAAd;AAAA,YAAC4E;AAAA,YAAA;AAAA,cACG,SAAS;AAAA,cACT,SAAS,MAAM+U,EAAyB,EAAI;AAAA,cAC5C,4BAAC7J,IAAO,EAAA;AAAA,YAAA;AAAA,UAAA,GAEhB;AAAA,QAAA,GACJ;AAAA,MAAA,GACJ;AAAA,wBAEC3D,IACG,EAAA,UAAA,gBAAAnM;AAAA,QAAC2M;AAAA,QAAA;AAAA,UACG,WAAW;AAAA,UACX,sBAAAQ;AAAA,UACA,qBAAqBP,IAAsBlK,GAAUkK,GAAqBuC,CAAyB,IAAI;AAAA,UACvG,YAAYxQ,EAAO;AAAA,UACnB,kBAAkBA,EAAO;AAAA,UACzB,iBAAiBkc;AAAA,UACjB,iBAAAhO;AAAA,UACA,gBAAAG;AAAA,UACA,kBAAkB7O,IAAkBoR,KAAiB;AAAA,UACrD,oBAAAnC;AAAA,UACA,QAAArO;AAAA,QAAA;AAAA,MAAA,GACR;AAAA,MAEA,gBAAAiB;AAAA,QAAC4E;AAAA,QAAA;AAAA,UAAO,WAAW;AAAA,UACX,OAAM;AAAA,UACN,SAAS;AAAA,UACT,MAAM;AAAA,UACN,SAAS,MAAM+U,EAAyB,EAAI;AAAA,UAC5C,6BAAY7J,IAAO,EAAA;AAAA,UAAI,UAAA;AAAA,QAAA;AAAA,MAE/B;AAAA,IAAA,GACJ;AAAA,IAEC,CAACqJ,KACG,gBAAAnZ,EAAA,OAAA,EAAI,WAAW,qFACZ,UAAA,gBAAAY;AAAA,MAACyE;AAAA,MAAA;AAAA,QACG,WAAU;AAAA,QAET,UAAA;AAAA,UAAAsK,KACGC,KACA,CAAC3E,GAAkB2E,CAAgB,KACnC,gBAAA5P;AAAA,YAAC+T;AAAA,YAAA;AAAA,cACG,SAAS;AAAA,cAET,kBAAkB,CAAC5V;AAAA,cACnB,cAAc;AAAA,cACd,oBAAoB,CAACA;AAAA,cACrB,oBAAoB;AAAA,cACpB,aAAayO;AAAA,cACb,mBAAmBuC;AAAA,cACnB,UAAUS;AAAA,cACV,mBAAAO;AAAA,cACA,UAAUZ;AAAA,cACV,SAASmL;AAAA,cACT,iBAAiBha;AAAA,cACjB,eAAA6T;AAAA,cACA,SAAAjR;AAAA,cACA,iBAAAwI;AAAA,cACA,oBAAAsB;AAAA,YAAA;AAAA,YAfK,aAAagM,CAAqB;AAAA,UAgB3C;AAAA,UAEH,CAACxJ,KACG,gBAAAhP,EAAA,OAAA,EAAI,WAAW,iEACZ,UAAA;AAAA,YAAA,gBAAAZ,EAACa,KAAW,SAAS,SAAS,WAAU,IACnC,UAAA+Z,KACK,wCACA,+BACV,CAAA;AAAA,YACA,gBAAAha;AAAA,cAACgE;AAAA,cAAA;AAAA,gBAAO,SAAS;AAAA,gBACT,SAAS,MAAM+U,EAAyB,EAAI;AAAA,gBAEhD,UAAA;AAAA,kBAAA,gBAAA3Z,EAAC8P,IAAO,EAAA;AAAA,kBAAE;AAAA,gBAAA;AAAA,cAAA;AAAA,YAEd;AAAA,UAAA,GACJ;AAAA,UAEHF,KAAoB3E,GAAkB2E,CAAgB,KACnD,gBAAA5P,EAACa,KAAW,SAAS,SAAS,WAAU,oCACnC,UACL,yDAAA,CAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAEZ;AAAA,IAEHsY,KAAY,gBAAAnZ;AAAA,MAAC+P;AAAA,MAAA;AAAA,QACV,SAAS;AAAA,QACT,MAAMqJ,MAA0B;AAAA,QAEhC,cAAc,CAACxJ;AAAA,QACf,oBAAoB,CAACzR;AAAA,QACrB,kBAAkB;AAAA,QAClB,oBAAoB;AAAA,QACpB,aAAayO;AAAA,QACb,mBAAmBuC;AAAA,QACnB,UAAUS;AAAA,QACV,mBAAAO;AAAA,QACA,UAAUZ;AAAA,QACV,SAASmL;AAAA,QACT,iBAAiBha;AAAA,QACjB,eAAA6T;AAAA,QACA,SAAAjR;AAAA,QACA,iBAAAwI;AAAA,QACA,oBAAAsB;AAAA,QACA,aAAa+L,IACPwB,KACA;AAAA,MAAA;AAAA,MAlBD,aAAavB,CAAqB;AAAA,IAmBtC;AAAA,EAET,EAAA,CAAA;AAEJ,SAES,gBAAAxY,EAAAoF,GAAA,EAAA,UAAA;AAAA,IAAA+U;AAAA,IAGD,gBAAA/a;AAAA,MAAC+P;AAAA,MAAA;AAAA,QACG,SAAS;AAAA,QACT,kBAAkB;AAAA,QAClB,oBAAoB;AAAA,QACpB,cAAc;AAAA,QACd,iBAAiBrP;AAAA,QACjB,MAAMgZ;AAAA,QACN,UAAU,MAAMC,EAAyB,EAAK;AAAA,QAC9C,mBAAmBtK;AAAA,QACnB,SAAA/L;AAAA,QACA,oBAAoB,CAACnF;AAAA,QACrB,iBAAA2N;AAAA,QACA,oBAAAsB;AAAA,QACA,sBAAsBzO,EAAO;AAAA,MAAA;AAAA,IAA4B;AAAA,IAE7D,gBAAAqB;AAAA,MAACwX;AAAA,MAAA;AAAA,QACG,YAAY7Y;AAAA,QACZ,MAAM2a;AAAA,QACN,cAAcC;AAAA,MAAA;AAAA,IAAkB;AAAA,EAExC,EAAA,CAAA;AAER;AC9eO,SAAS0B,GAAqB;AAAA,EACI,MAAA5U;AAAA,EACA,UAAA6U;AAAA,EACA,cAAAC;AAAA,EACA,MAAAJ;AAAA,EACA,OAAAK;AACJ,GAA8B;AAG3D,SAAA,gBAAAxa;AAAA,IAACsB;AAAA,IAAA;AAAA,MACG,MAAAmE;AAAA,MACA,cAAc,CAACA,MAASA,IAAO8U,EAAA,IAAiBD,EAAS;AAAA,MACzD,mBAAgB;AAAA,MAChB,oBAAiB;AAAA,MAEjB,UAAA;AAAA,QAAA,gBAAAta,EAAC4F,IACG,EAAA,UAAA;AAAA,UAAA,gBAAAxG,EAACa,GAAW,EAAA,SAAS,MAChB,UAAAua,KAAS,mBACd;AAAA,UAECL,KAAS,gBAAA/a,EAAAa,GAAA,EACL,UACLka,EAAA,CAAA;AAAA,UACA,gBAAA/a,EAACa,KAAW,UAEZ,gBAAA,CAAA;AAAA,QAAA,GAEJ;AAAA,0BAEC4F,IACG,EAAA,UAAA;AAAA,UAAA,gBAAAzG,EAAC4E,KAAO,SAAQ,QAAO,SAASuW,GAAc,WAAS,IAAC,UAAQ,WAAA,CAAA;AAAA,UAC/D,gBAAAnb,EAAA4E,GAAA,EAAO,SAASsW,GAAU,UAAI,QAAA;AAAA,QAAA,GACnC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGZ;AC1CO,SAASG,GAA8B,EAAE,MAAAhV,GAAM,SAAAC,KAA2E;AACvH,QAAA;AAAA,IACF,aAAAgV;AAAA,MACAvP,GAA2B;AAExB,SAAA,gBAAAnL;AAAA,IAACsB;AAAA,IAAA;AAAA,MACJ,UAAU;AAAA,MACV,MAAAmE;AAAA,MACA,UAAA;AAAA,QAAC,gBAAAzF,EAAA4F,IAAA,EAAc,WAAW,uBACtB,UAAA;AAAA,UAAC,gBAAAxG,EAAAa,GAAA,EAAW,SAAS,MAAM,UAE3B,eAAA;AAAA,UACCya,GAAa,IAAI,CAACC,MACR,gBAAA3a;AAAA,YAACgE;AAAA,YAAA;AAAA,cAEJ,SAAS,MAAM0B,EAAQiV,EAAK,GAAG;AAAA,cAC/B,WAAS;AAAA,cACT,SAAS;AAAA,cAER,UAAA;AAAA,gBAAKA,EAAA;AAAA,gBAAK;AAAA,gBAAGA,EAAK;AAAA,gBAAI;AAAA,cAAA;AAAA,YAAA;AAAA,YALlBA,EAAK;AAAA,UAAA,CAOjB;AAAA,WACCD,KAAe,CAAA,GAAI,WAAW,KAC3B,gBAAAtb,EAAAa,GAAA,EAAW,SAAS,SAAS,UAE9B,0BAAA,CAAA;AAAA,QAAA,GAER;AAAA,QACA,gBAAAb,EAACyG,IACG,EAAA,UAAA,gBAAAzG,EAAC4E,GAAO,EAAA,SAAS,YAAY,SAAS,MAAM0B,EAAW,GAAA,UAAA,SAAA,CAAM,EACjE,CAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAER;ACLO,SAASkV,GAAsB;AAAA,EACI,YAAAjJ;AAAA,EACA,kBAAA/T;AAAA,EACA,kBAAAid;AAAA,EACA,qBAAAC;AAAA,EACA,SAAA5C;AAAA,EACA,qBAAA6C;AACJ,GAOnC;AAEC,QAAM,EAAE,aAAaC,EAAmB,IAAI7P,GAA2B,GAEjE,CAAC8P,GAAuBC,CAAwB,IAAIpd,EAAM,SAA6B,GACvF,CAACqd,GAAyBC,CAA0B,IAAItd,EAAM,SAAkB,EAAK,GACrF,CAACud,GAAcC,CAAe,IAAIxd,EAAM,SAA6B,GAErE,CAACyd,GAAeC,CAAgB,IAAI1d,EAAM,SAG7C,GAEG;AAAA,IACF,QAAAC;AAAA,IACA,eAAAC;AAAA,MACAO,EAA4B,GAE1Bkd,IAAiB9J,EAAW,kBAAkB,IAC9C+J,IAAsB3d,EAAO,aAAa,OAAO,CAAKuC,MAAA,OAAOA,KAAM,QAAQ,EAC5E,IAAI,CAAKA,MAAAqb,GAAkBrb,GAAG0a,CAAkB,CAAC,EACjD,OAAO,OAAO,KAA2B,IACxCY,IAAuBjK,EAAW,aAAa,OAAO,OAAK,OAAOrR,KAAM,QAAQ,KAA2B,IAC3Gub,IAAmBH,EAAoB,SAASE,EAAqB;AAGvE,SAAA,gBAAA5b,EAAC,OAAI,EAAA,WAAW,yBACZ,UAAA;AAAA,IAAC,gBAAAZ,EAAAW,IAAA,EAAU,UAAU,OAAO,WAAW,kCACnC,UAAC,gBAAAC,EAAA,OAAA,EAAI,WAAW,yBAEZ,UAAA;AAAA,MAAC,gBAAAA,EAAA,OAAA,EAAI,WAAW,6CACZ,UAAA;AAAA,QAAC,gBAAAA,EAAAC,GAAA,EAAW,SAAS,MAAM,UAAA;AAAA,UAAA;AAAA,UACJlC,EAAO;AAAA,QAAA,GAC9B;AAAA,QAEA,gBAAAiC,EAACyE,IAAM,EAAA,WAAW,kCACb,UAAA;AAAA,UAAkBgX,KAAAA,EAAe,SAAS,KAAM,gBAAArc,EAAA0c,IAAA,EAC7C,4BAACC,IACI,EAAA,UAAAN,EAAe,IAAI,CAACO,MACjB,gBAAAhc;AAAA,YAACic;AAAA,YAAA;AAAA,cACS,SAAS,MAAMT,EAAiB;AAAA,gBAC5B,iBAAiB;AAAA,gBACjB,oBAAoBQ,EAAc;AAAA,cAAA,CACrC;AAAA,cACP,UAAA;AAAA,gBAAA,gBAAA5c;AAAA,kBAAC8c;AAAA,kBAAA;AAAA,oBACG,OAAM;AAAA,oBACN,4BAACjc,GAAW,EAAA,SAAS,aAAa,WAAW,aACxC,YAAc,KACnB,CAAA;AAAA,kBAAA;AAAA,gBACJ;AAAA,gBACA,gBAAAb;AAAA,kBAAC8c;AAAA,kBAAA;AAAA,oBACG,OAAM;AAAA,oBACN,UAAA,gBAAA9c,EAACc,IAAQ,EAAA,OAAO,UACZ,UAAA,gBAAAd;AAAA,sBAACe;AAAA,sBAAA;AAAA,wBAAW,MAAK;AAAA,wBACL,SAAS,CAACG,MAAM;AACZ,0BAAAA,EAAE,eAAe,GACjBA,EAAE,gBAAgB,GAClB4a,EAAyBc,EAAc,EAAE;AAAA,wBAC7C;AAAA,wBACA,OAAM;AAAA,wBACd,UAAA,gBAAA5c,EAACiX,IAAW,EAAA,MAAM,QAAQ,CAAA;AAAA,sBAAA;AAAA,oBAAA,GAElC;AAAA,kBAAA;AAAA,gBACJ;AAAA,cAAA;AAAA,YAAA;AAAA,YAxBW2F,EAAc;AAAA,UAAA,CA0BhC,GACL,EACJ,CAAA;AAAA,UAEA,gBAAA5c;AAAA,YAAC4E;AAAA,YAAA;AAAA,cACG,SAAS,MAAM;AACM,gBAAAwX,EAAA;AAAA,kBACb,iBAAiB;AAAA,gBAAA,CACpB;AAAA,cACL;AAAA,cACA,SAAS;AAAA,cACT,6BAAYtM,IAAO,EAAA;AAAA,cAAI,UAAA;AAAA,YAAA;AAAA,UAE3B;AAAA,QAAA,GAEJ;AAAA,MAAA,GAEJ;AAAA,MAEA,gBAAAlP,EAAC,OAAI,EAAA,WAAW,8CACZ,UAAA;AAAA,QAAC,gBAAAZ,EAAAa,GAAA,EAAW,SAAS,MAAM,UAE3B,gBAAA;AAAA,QAEC4b,MAAqB,KACjB,gBAAAzc,EAAA+c,IAAA,EAAM,QAAQ,gBAAA/c;AAAA,UAAC4E;AAAA,UAAA;AAAA,YAAO,SAAQ;AAAA,YACR,MAAM;AAAA,YACN,MAAM;AAAA,YACN,WAAW;AAAA,YACX,KAAI;AAAA,YACJ,QAAO;AAAA,YAAS,UAAA;AAAA,UAAA;AAAA,QAAA,GAAoB,UAE3D,gEAAA;AAAA,QAIA,gBAAA5E,EAAAgG,GAAA,EAAA,UAAA,gBAAApF,EAACyE,IAAM,EAAA,WAAW,kCACd,UAAA;AAAA,UAAC,gBAAArF,EAAA0c,IAAA,EACG,4BAACC,IACI,EAAA,UAAA;AAAA,YAAAL,EAAoB,IAAI,CAACf,MACtB,gBAAA3a,EAACic,IACG,EAAA,UAAA;AAAA,cAAA,gBAAA7c;AAAA,gBAAC8c;AAAA,gBAAA;AAAA,kBACG,OAAM;AAAA,kBACN,4BAACjc,GAAW,EAAA,SAAS,aAAa,WAAW,aACxC,YAAK,KACV,CAAA;AAAA,gBAAA;AAAA,cACJ;AAAA,cACA,gBAAAb;AAAA,gBAAC8c;AAAA,gBAAA;AAAA,kBACG,OAAM;AAAA,kBACN,UAAA,gBAAA9c,EAACc,IAAQ,EAAA,OAAO,UACZ,UAAA,gBAAAd;AAAA,oBAACe;AAAA,oBAAA;AAAA,sBAAW,MAAK;AAAA,sBACL,SAAS,CAACG,MAAM;AACZ,wBAAAA,EAAE,eAAe,GACjBA,EAAE,gBAAgB,GAClBgb,EAAgBX,EAAK,GAAG;AAAA,sBAC5B;AAAA,sBACA,OAAM;AAAA,sBACd,UAAA,gBAAAvb,EAACiX,IAAW,EAAA,MAAM,QAAQ,CAAA;AAAA,oBAAA;AAAA,kBAAA,GAElC;AAAA,gBAAA;AAAA,cACJ;AAAA,YAAA,KApBWsE,EAAK,GAqBpB,CACH;AAAA,YACAiB,EAAqB,IAAI,CAACjB,wBACtBsB,IACG,EAAA,UAAA,gBAAAjc;AAAA,cAACkc;AAAA,cAAA;AAAA,gBACG,OAAM;AAAA,gBACN,UAAA;AAAA,kBAAA,gBAAA9c,EAACa,KAAW,SAAS,aAAa,WAAW,aACxC,YAAK,MACV;AAAA,kBACC,gBAAAD,EAAAC,GAAA,EAAW,SAAS,WAAW,WAAW,aAAa,UAAA;AAAA,oBAAA;AAAA,oBAEhD,gBAAAb,EAAC,QAAM,EAAA,UAAAub,EAAK,IAAI,CAAA;AAAA,kBAAA,GACxB;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA,KATOA,EAAK,GAWpB,CACH;AAAA,UAAA,EAAA,CACL,EACJ,CAAA;AAAA,UAEA,gBAAAvb;AAAA,YAAC4E;AAAA,YAAA;AAAA,cACG,SAAS,MAAM;AACX,gBAAAoX,EAA2B,EAAI;AAAA,cACnC;AAAA,cACA,SAAS;AAAA,cACT,6BAAYlM,IAAO,EAAA;AAAA,cAAI,UAAA;AAAA,YAAA;AAAA,UAE3B;AAAA,QAAA,EAAA,CACJ,EAEJ,CAAA;AAAA,MAAA,GAGJ;AAAA,IAAA,EAAA,CAEJ,EACJ,CAAA;AAAA,sBAEC,OAAI,EAAA,OAAO,EAAE,QAAQ,UAAS;AAAA,IAE9B+L,KACG,gBAAA7b;AAAA,MAACkX;AAAA,MAAA;AAAA,QAAyB,MAAM,EAAQ2E;AAAA,QACd,UAAU,MAAM;AACZ,gBAAM5J,IAAQ;AAAA,YACV,IAAI4J;AAAA,YACJ,qBAAqB,CAAC,GAAIF,KAAuB,CAAA,GAAKpJ,EAAW,EAAE;AAAA,UAAA;AAE/D,kBAAA,MAAM,0BAA0BN,CAAK,GAC7CwJ,EAAiB,iBAAiBxJ,CAAK,GACvC6J,EAAyB,MAAS;AAAA,QACtC;AAAA,QACA,UAAU,MAAMA,EAAyB,MAAS;AAAA,QAClD,8BAAS,UAA0B,6BAAA,CAAA;AAAA,QACnC,MAAQ,gBAAAlb,EAAAoF,GAAA,EAAA,UAAA;AAAA,UAAA;AAAA,UAAW,gBAAAhG,EAAC,OAAE,UACH,sBAAA,CAAA;AAAA,UAAI;AAAA,QAAA,GACM;AAAA,MAAA;AAAA,IAAI;AAAA,IAC9Dic,KACG,gBAAAjc;AAAA,MAACkX;AAAA,MAAA;AAAA,QAAyB,MAAM,EAAQ+E;AAAA,QACd,UAAU,MAAM;AACZ,UAAArd,EAAc,eAAeD,EAAO,aAAa,OAAO,CAAKuC,MAAAA,MAAM+a,CAAY,CAAC,GAChFC,EAAgB,MAAS;AAAA,QAC7B;AAAA,QACA,UAAU,MAAMA,EAAgB,MAAS;AAAA,QACzC,8BAAS,UAAiB,oBAAA,CAAA;AAAA,QAC1B,MAAQ,gBAAAtb,EAAAoF,GAAA,EAAA,UAAA;AAAA,UAAA;AAAA,UAAU,gBAAAhG,EAAC,OAAE,UACF,sBAAA,CAAA;AAAA,UAAI;AAAA,QAAA,GACA;AAAA,MAAA;AAAA,IAAI;AAAA,IAEzD,gBAAAA;AAAA,MAACgd;AAAA,MAAA;AAAA,QACG,MAAM,EAAQb;AAAA,QACd,kBAAAV;AAAA,QACA,kBAAkBlJ;AAAA,QAClB,qBAAAmJ;AAAA,QACA,qBAAqB,CAAC,GAAGC,KAAuB,CAAA,GAAIhd,EAAO,EAAE;AAAA,QAC7D,iBAAiB;AAAA,QAChB,GAAGwd;AAAA,QACJ,SAAArD;AAAA,QACA,aAAa,MAAM;AACf,UAAAsD,EAAiB,MAAS;AAAA,QAC9B;AAAA,MAAA;AAAA,IAAE;AAAA,IAEN,gBAAApc;AAAA,MAACqb;AAAA,MAAA;AAAA,QACG,MAAMU;AAAA,QACN,SAAS,CAACkB,MAAoB;AAC1B,UAAIA,KACcre,EAAA,eAAe,CAAC,GAAID,EAAO,eAAe,CAAC,GAAIse,CAAe,CAAC,GAEjFjB,EAA2B,EAAK;AAAA,QACpC;AAAA,MAAA;AAAA,IAAE;AAAA,EACV,EAAA,CAAA;AAER;ACnQO,MAAMkB,KAA+C;AAAA,EACxD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,cAAc;AAAA,EACd,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAYlD,GAAuB;AAAA,IAC/B,MAAM;AAAA,MACF,UAAU;AAAA,MACV,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY;AAAA,QACR,UAAU;AAAA,MACd;AAAA,IACJ;AAAA,IACA,OAAO;AAAA,MACH,UAAU;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACR,UAAU;AAAA,MACd;AAAA,IACJ;AAAA,IACA,aAAa;AAAA,MACT,UAAU;AAAA,MACV,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACd;AAAA,IACA,YAAY;AAAA,MACR,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,QACL,aAAa;AAAA,QACb,eAAe,CAAC,SAAS;AAAA,MAC7B;AAAA,MACA,aAAa;AAAA,IACjB;AAAA,IACA,WAAW;AAAA,MACP,UAAU;AAAA,MACV,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IACjB;AAAA,IACA,OAAO;AAAA,MACH,UAAU;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACR,iBAAiB;AAAA,QACjB,KAAK;AAAA,MACT;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,MACJ,UAAU;AAAA,MACV,MAAM;AAAA,MACN,oBAAoB;AAAA,MACpB,IAAI;AAAA,QACA,UAAU;AAAA,QACV,SAAS;AAAA,UACL,aAAa;AAAA,UACb,eAAe,CAAC,SAAS;AAAA,QAC7B;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,kBAAkB;AAAA,MACd,UAAU;AAAA,MACV,MAAM;AAAA,MACN,aAAa;AAAA,MACb,IAAI;AAAA,QACA,UAAU;AAAA,QACV,MAAM;AAAA,MACV;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,UAAU;AAAA,IACd;AAAA,IACA,UAAU;AAAA,MACN,UAAU;AAAA,MACV,MAAM;AAAA,MACN,WAAW;AAAA,IACf;AAAA,EAAA,CACH;AACL,GCrFamD,KAA0C;AAAA,EACnD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,cAAc;AAAA,EACd,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,EACb,YAAYnD,GAAuB;AAAA,IAC/B,MAAM;AAAA,MACF,MAAM;AAAA,MACN,YAAY,EAAE,UAAU,GAAK;AAAA,MAC7B,UAAU;AAAA,IACd;AAAA,IACA,cAAc;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,QACL,aAAa;AAAA,QACb,eAAe,CAAC,SAAS;AAAA,QACzB,UAAU;AAAA,UACN,cAAc;AAAA,QAClB;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY,EAAE,UAAU,GAAK;AAAA,MAC7B,UAAU;AAAA,MACV,OAAO;AAAA,QACH,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,YAAY;AAAA,UACR,MAAM;AAAA,YACF,UAAU;AAAA,YACV,MAAM;AAAA,YACN,UAAU;AAAA,UACd;AAAA,UACA,OAAO;AAAA,YACH,UAAU;AAAA,YACV,MAAM;AAAA,YACN,WAAW;AAAA,UACf;AAAA,UACA,QAAQ;AAAA,YACJ,MAAM;AAAA,YACN,UAAU;AAAA,YACV,IAAI;AAAA,cACA,UAAU;AAAA,cACV,SAAS;AAAA,gBACL,aAAa;AAAA,gBACb,eAAe,CAAC,SAAS;AAAA,gBACzB,UAAU;AAAA,kBACN,cAAc;AAAA,gBAClB;AAAA,cACJ;AAAA,YACJ;AAAA,YACA,aAAa;AAAA,UACjB;AAAA,UACA,UAAU;AAAA,YACN,MAAM;AAAA,YACN,UAAU;AAAA,YACV,IAAI;AAAA,cACA,UAAU;AAAA,cACV,MAAM;AAAA,cACN,mBAAmB,CAAC,QAAQ,YAAY;AAAA,YAC5C;AAAA,UACJ;AAAA,QACJ;AAAA,QACA,iBAAiB,CAAC,QAAQ,SAAS,UAAU,UAAU;AAAA,MAC3D;AAAA,IACJ;AAAA,IACA,YAAY;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,WAAW;AAAA,IACf;AAAA,IACA,QAAQ;AAAA,MACJ,MAAM;AAAA,MACN,YAAY,EAAE,UAAU,GAAK;AAAA,MAC7B,UAAU;AAAA,MACV,YAAY;AAAA,QACR,WAAW;AAAA,UACP,IAAI;AAAA,UACJ,OAAO;AAAA,QACX;AAAA,QACA,OAAO;AAAA,MACX;AAAA,MACA,cAAc;AAAA,IAClB;AAAA,IACA,cAAc;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV,WAAW;AAAA,IACf;AAAA,IACA,UAAU;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IACd;AAAA,IACA,MAAM;AAAA,MACF,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,IAAI;AAAA,QACA,UAAU;AAAA,QACV,cAAc;AAAA,MAClB;AAAA,IACJ;AAAA,EAAA,CACH;AAAA,EACD,eAAe;AAAA,IACX,QAAQ,CAAC,MAAM,WAAW;AAAA,EAC9B;AACJ,GChHaoD,KAA4C;AAAA,EACrD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,cAAc;AAAA,EACd,aAAa;AAAA,EACb,MAAM;AAAA,EACN,YAAYpD,GAAuB;AAAA,IAC/B,aAAa;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IACd;AAAA,IACA,OAAO;AAAA,MACH,MAAM;AAAA,MACN,UAAU;AAAA,MACV,OAAO;AAAA,IACX;AAAA,IACA,eAAe;AAAA,MACX,MAAM;AAAA,MACN,UAAU;AAAA,IACd;AAAA,IACA,OAAO;AAAA,MACH,MAAM;AAAA,MACN,UAAU;AAAA,IACd;AAAA,IACA,oBAAoB;AAAA,MAChB,MAAM;AAAA,MACN,UAAU;AAAA,MACV,IAAI;AAAA,QACA,UAAU;AAAA,QACV,MAAM;AAAA,MACV;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,KAAK;AAAA,IACT;AAAA,EAAA,CACH;AACL,GCvCaqD,KAA4C;AAAA,EACrD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,cAAc;AAAA,EACd,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AAAA,IACR,OAAO;AAAA,MACH,UAAU;AAAA,MACV,MAAM;AAAA,MACN,YAAY,EAAE,UAAU,GAAK;AAAA,IACjC;AAAA,IACA,MAAM;AAAA,MACF,UAAU;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACR,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,gBAAgB;AAAA,MACpB;AAAA,IACJ;AAAA,IACA,cAAc;AAAA,MACV,UAAU;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACR,UAAU;AAAA,UACN,UAAU;AAAA,UACV,MAAM;AAAA,UACN,YAAY,EAAE,UAAU,GAAK;AAAA,QACjC;AAAA,QACA,SAAS;AAAA,UACL,UAAU;AAAA,UACV,MAAM;AAAA,QACV;AAAA,QACA,kBAAkB;AAAA,UACd,UAAU;AAAA,UACV,MAAM;AAAA,UACN,SAAS;AAAA,YACL,aAAa;AAAA,YACb,eAAe,CAAC,SAAS;AAAA,UAC7B;AAAA,QACJ;AAAA,QACA,gBAAgB;AAAA,UACZ,UAAU;AAAA,UACV,MAAM;AAAA,QACV;AAAA,QACA,qBAAqB;AAAA,UACjB,UAAU;AAAA,UACV,MAAM;AAAA,UACN,KAAK;AAAA,QACT;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,QACH,YAAY;AAAA,UACR,SAAS;AAAA,YACL,UAAU;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACR,OAAO;AAAA,gBACH,UAAU;AAAA,gBACV,MAAM;AAAA,gBACN,YAAY,EAAE,UAAU,GAAK;AAAA,cACjC;AAAA,cACA,SAAS;AAAA,gBACL,UAAU;AAAA,gBACV,MAAM;AAAA,gBACN,UAAU;AAAA,cACd;AAAA,cACA,OAAO;AAAA,gBACH,UAAU;AAAA,gBACV,MAAM;AAAA,gBACN,SAAS;AAAA,kBACL,aAAa;AAAA,kBACb,eAAe,CAAC,SAAS;AAAA,gBAC7B;AAAA,cACJ;AAAA,cACA,MAAM;AAAA,gBACF,UAAU;AAAA,gBACV,MAAM;AAAA,gBACN,KAAK;AAAA,cACT;AAAA,YACJ;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,YACH,UAAU;AAAA,YACV,MAAM;AAAA,YACN,SAAS;AAAA,cACL,aAAa;AAAA,cACb,eAAe,CAAC,SAAS;AAAA,YAC7B;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,YACJ,UAAU;AAAA,YACV,MAAM;AAAA,YACN,IAAI;AAAA,cACA,UAAU;AAAA,cACV,YAAY;AAAA,gBACR,OAAO;AAAA,kBACH,UAAU;AAAA,kBACV,MAAM;AAAA,kBACN,YAAY,EAAE,UAAU,GAAK;AAAA,gBACjC;AAAA,gBACA,OAAO;AAAA,kBACH,UAAU;AAAA,kBACV,SAAS;AAAA,oBACL,aAAa;AAAA,oBACb,eAAe,CAAC,SAAS;AAAA,kBAC7B;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACR,OAAO;AAAA,UACH,UAAU;AAAA,UACV,MAAM;AAAA,UACN,YAAY,EAAE,UAAU,GAAM;AAAA,QAClC;AAAA,QACA,SAAS;AAAA,UACL,UAAU;AAAA,UACV,MAAM;AAAA,UACN,UAAU;AAAA,QACd;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,cAAc;AAAA,MACV,UAAU;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACR,YAAY;AAAA,UACR,UAAU;AAAA,UACV,MAAM;AAAA,QACV;AAAA,QACA,kBAAkB;AAAA,UACd,UAAU;AAAA,UACV,MAAM;AAAA,QACV;AAAA,QACA,gBAAgB;AAAA,UACZ,UAAU;AAAA,UACV,MAAM;AAAA,UACN,IAAI;AAAA,YACA,UAAU;AAAA,UACd;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,iBAAiB;AAAA,MACb,UAAU;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,IACd;AAAA,IACA,cAAc;AAAA,MACV,UAAU;AAAA,MACV,MAAM;AAAA,MACN,YAAY,EAAE,UAAU,GAAK;AAAA,IACjC;AAAA,IACA,cAAc;AAAA,MACV,UAAU;AAAA,MACV,MAAM;AAAA,MACN,WAAW;AAAA,IACf;AAAA,IACA,cAAc;AAAA,MACV,UAAU;AAAA,MACV,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IACjB;AAAA,IACA,YAAY;AAAA,MACR,UAAU;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,IACV;AAAA,EACJ;AACJ;AChLO,SAASC,GAA4B;AAAA,EACI,MAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,kBAAAhf;AAAA,EACA,YAAAif;AAAA,EACA,yBAAAC;AACJ,GAMzC;AAEC,QAAM,CAACC,GAAwBC,CAAyB,IAAIte,EAAS,EAAK,GACpE,CAACue,GAAyBC,CAA0B,IAAIxe,EAA+B;AAC7F,EAAAQ,GAAU,MAAM;AACZ,IAAI0d,KAAmBE,MACnBE,EAA0B,EAAI,GACdJ,EAAAD,CAAI,EACf,KAAK,CAAeQ,MAAA;AACX,YAAAC,IAAsBD,EAAY,OAAO,CAAAE,MAAK,EAAEP,KAA2B,IAAI,KAAK,CAAAQ,MAAKA,EAAE,KAAK,EAAE,YAAkB,MAAAD,EAAE,KAAO,EAAA,YAAa,CAAA,CAAC;AACjJ,MAAAH,EAA2BE,CAAmB;AAAA,IACjD,CAAA,EACA,QAAQ,MAAMJ,EAA0B,EAAK,CAAC;AAAA,EAExD,GAAA,CAACF,GAAyBH,GAAMC,CAAe,CAAC;AAc7C,QAAA;AAAA,IACF,QAAA7e;AAAA,IACA,eAAAC;AAAA,IACA,WAAA+W;AAAA,IACA,aAAAzW;AAAA,MACAC,EAA4B;AAG5B,SAAA,gBAAAa,EAAC,SAAI,WAAW,yBACZ,4BAACW,IAAU,EAAA,UAAU,OAAO,WAAW,kCAEnC,UAAA;AAAA,IAAA,gBAAAX;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,WAAU;AAAA,QACV,4BAACa,GAAW,EAAA,SAAS,MAAM,WAAW,aAAa,UAEnD,kBAAA;AAAA,MAAA;AAAA,IACJ;AAAA,IAECrC,uBAAqBwC,IAAK,EAAA,aAAa,cACpC,UAAC,gBAAAJ,EAAAC,GAAA,EAAW,SAAS,WAAW,UAAA;AAAA,MAAA;AAAA,MACD,gBAAAb,EAAC,KAAG,EAAA,UAAAxB,EAAiB,KAAK,CAAA;AAAA,IAAA,EAAA,CACzD,EACJ,CAAA;AAAA,IAEA,gBAAAoC,EAAC,OAAI,EAAA,WAAW,QACZ,UAAA;AAAA,MAAA,gBAAAZ;AAAA,QAACa;AAAA,QAAA;AAAA,UAAW,SAAS;AAAA,UACT,OAAO;AAAA,UAAa,UAAA;AAAA,QAAA;AAAA,MAEhC;AAAA,MACA,gBAAAD,EAAC,OAAI,EAAA,WAAW,4DAEX,UAAA;AAAA,QAAA+c,KAA0B,CAACE,KAA4B,gBAAA7d,EAAAmF,IAAA,EAAiB,MAAM,SAAQ;AAAA,QAEtF0Y,GAAyB,IAAI,CAACM,GAAY1c,MACvC,gBAAAzB;AAAA,UAACgB;AAAA,UAAA;AAAA,YACK,aAAa;AAAA,YACb,SAAS,MAAM;AACG,cAAApC,EAAA,QAAQoS,GAAUmN,CAAU,CAAC,GAC3Cvf,EAAc,MAAMuf,CAAU,GAC9Bvf,EAAc,QAAQuf,CAAU,GAChCvf,EAAc,cAAc,MAAS,GAC1B6e;YACf;AAAA,YACA,MAAK;AAAA,YACN,UAAAU;AAAA,UAAA;AAAA,UAVMA;AAAA,QAAA,CAYd;AAAA,QAEA,CAACR,MAA2BE,KAA2B,CAAC,IAAI,WAAW,KACnE,gBAAA7d,EAAAa,GAAA,EAAW,SAAS,WAAW,UAEhC,iBAAA,CAAA;AAAA,MAAA,GAGR;AAAA,IAAA,GAEJ;AAAA,IAEA,gBAAAD,EAAC,OAAI,EAAA,WAAW,QACZ,UAAA;AAAA,MAAA,gBAAAZ;AAAA,QAACa;AAAA,QAAA;AAAA,UAAW,SAAS;AAAA,UACT,OAAO;AAAA,UAAa,UAAA;AAAA,QAAA;AAAA,MAEhC;AAAA,MAEA,gBAAAD,EAAC,OAAI,EAAA,WAAW,cACZ,UAAA;AAAA,QAAA,gBAAAZ;AAAA,UAACoe;AAAA,UAAA;AAAA,YAAe,OAAO;AAAA,YACP,UAAU;AAAA,YACV,MAAO,gBAAApe,EAAAqe,IAAA,EAAK,MAAM,SAAS,SAASnB,GAA2B,MAAM;AAAA,YACrE,SAAS,MAAM;AACX,cAAAvH,EAAUuH,EAA0B,GACzBO;YACf;AAAA,UAAA;AAAA,QAAE;AAAA,QAClB,gBAAAzd;AAAA,UAACoe;AAAA,UAAA;AAAA,YAAe,OAAO;AAAA,YACP,UAAU;AAAA,YACV,MAAO,gBAAApe,EAAAqe,IAAA,EAAK,MAAM,SAAS,SAASjB,GAAwB,MAAM;AAAA,YAClE,SAAS,MAAM;AACX,cAAAzH,EAAUyH,EAAuB,GACtBK;YACf;AAAA,UAAA;AAAA,QAAE;AAAA,QAClB,gBAAAzd;AAAA,UAACoe;AAAA,UAAA;AAAA,YAAe,OAAO;AAAA,YACP,UAAU;AAAA,YACV,MAAO,gBAAApe,EAAAqe,IAAA,EAAK,MAAM,SAAS,SAASlB,GAAuB,MAAM;AAAA,YACjE,SAAS,MAAM;AACX,cAAAxH,EAAUwH,EAAsB,GACrBM;YACf;AAAA,UAAA;AAAA,QAAE;AAAA,QAClB,gBAAAzd;AAAA,UAACoe;AAAA,UAAA;AAAA,YAAe,OAAO;AAAA,YACP,UAAU;AAAA,YACV,MAAO,gBAAApe,EAAAqe,IAAA,EAAK,MAAM,SAAS,SAAShB,GAAwB,MAAM;AAAA,YAClE,SAAS,MAAM;AACX,cAAA1H,EAAU0H,EAAuB,GACtBI;YACf;AAAA,UAAA;AAAA,QAAE;AAAA,MAAA,GACtB;AAAA,IAAA,GAEJ;AAAA,IAEC,CAACjf,KAAoB,gBAAAoC,EAAC,OAEnB,EAAA,UAAA;AAAA,MAAA,gBAAAZ;AAAA,QAACa;AAAA,QAAA;AAAA,UAAW,SAAS;AAAA,UACT,OAAO;AAAA,UACP,WAAW;AAAA,UAAQ,UAAA;AAAA,QAAA;AAAA,MAE/B;AAAA,wBAECyd,IAAiB,EAAA,aAAa,CAACzZ,MAAS4Y,EAAW5Y,CAAI,GAAE;AAAA,IAAA,GAE9D;AAAA,IAEC,gBAAA7E,EAAA,OAAA,EAEG,UAAC,gBAAAA,EAAA4E,GAAA,EAAO,SAAS,QAAQ,SAAS,MAAM6Y,EAAW,GAAG,WAAW,QAAQ,kCAEzE,CAAA,GACJ;AAAA,EAAA,EAIJ,CAAA,EACJ,CAAA;AAER;AAEO,SAASW,GAAe;AAAA,EACI,OAAAhD;AAAA,EACA,UAAAmD;AAAA,EACA,MAAAnc;AAAA,EACA,SAAAuJ;AACJ,GAK5B;AAGK,SAAA,gBAAA3L,EAACc,IAAQ,EAAA,OAAOyd,GACZ,UAAA,gBAAA3d;AAAA,IAAC4d;AAAA,IAAA;AAAA,MACG,SAAA7S;AAAA,MACA,WAAWvK;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,MAEC,UAAA;AAAA,QAAAgB;AAAA,QACD,gBAAApC,EAAC,SAAI,WAAW,6BAEZ,4BAACa,GAAW,EAAA,SAAS,aAChB,UAAAua,EAAA,CACL,EAKJ,CAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAER,EAAA,CAAA;AAGR;ACjMO,SAASqD,GAA8B;AAAA,EACI,cAAAC;AAAA,EACA,iBAAA5S;AAAA,EACA,oBAAAsB;AACJ,GAKO;AAU3C,QAAA;AAAA,IACF,eAAAxO;AAAA,IACA,iBAAAI;AAAA,IACA,QAAAL;AAAA,MACAQ,EAA+B,GAC7B,CAACyQ,GAAkB+O,CAAmB,IAAIrf,EAAqC,MAAS,GAExFua,IAA4Bnb,EAAM,OAErCC,EAAO,kBAAkB,EAAE,IAAIA,EAAO,gBAAoB,IAAA,CAAE,CAAA,GAEzDgE,IAAciN,IAAmBA,EAAiB,KAAK,QACvD5E,IAAW4E,KAAoB,QAE/BO,IAAoB,CAAC;AAAA,IACI,IAAA7N;AAAA,IACA,UAAA0I;AAAAA,IACA,YAAAsP;AAAA,IACA,WAAA9X;AAAA,EAAA,MAC2B;AAEtD,UAAMiM,IAASnM,IAAKI,GAAUJ,GAAIE,CAAS,IAAI,QACzC+X,IAAe9L,IAASpM,GAAmBoM,CAAM,IAAI,QAGrD4L,IAA4B,CAAC7X,MAC1BA,IACEqX,EAA0B,QAAQrX,CAAS,KAAK7C,EAAMhB,GAAQ8D,GAA+BD,CAAS,CAAC,IADvFqX,EAA0B,QAAQ,EAAE,GAIzDO,IAAwB,CAACzM,GAA8BnL,MAAuB;AAC1E,YAAAiN,IAAsBhN,GAA+BD,CAAS;AAEtD,MAAA5D,EAAA6Q,GAAqB9B,GAAoB,EAAK,GAClCkM,EAAA,QAAQrX,KAAa,EAAE,IAAImL;AAAA,IAAA;AAKrD,QAAA2M,KAAcA,MAAehY,GAAI;AAC3B,YAAAkY,IAAiB9X,GAAU4X,GAAY9X,CAAS,GAChDiY,IAAuBpY,GAAmBmY,CAAc,GAKxD7M,IAHyB0M,EAA0B7X,CAAS,EAI7D,IAAI,CAACkN,MAAMA,MAAM4K,IAAahY,IAAKoN,CAAC,EACpC,OAAO,CAACA,MAAMA,MAAM,MAAS;AAClC,MAAA0K,EAAsBzM,GAAoBnL,CAAS;AAGnD,YAAMoc,IAAoB,EAAE,GAAGF,EAAa,eAAe;AAC3D,aAAO,KAAKE,CAAiB,EAAE,QAAQ,CAACtT,MAAQ;AACxC,QAAAsT,EAAkBtT,CAAG,MAAMgP,MACTsE,EAAAtT,CAAG,IAAIhJ,KAAM;AAAA,MACnC,CACH,GACDoc,EAAa,kBAAkBE,CAAiB,GAMlChgB,EAAA6b,GAAsB,QAAW,EAAK,GACpCzb,EAAAyb,GAAsB,IAAO,EAAK;AAAA,IACtD;AAEA,IAAIF,MACc3b,EAAA2b,GAAcvP,GAAU,EAAK,GAC3BhM,EAAAub,GAAc,IAAM,EAAK;AAAA,EAC7C,GAEEsE,IAAwB,OAAO;AAAA,IACI,IAAAvc;AAAA,IACA,WAAAwc;AAAA,IACA,UAAA9T;AAAAA,IACA,WAAAxI;AAAA,EAAA,MAGnC;AAEF,UAAMiM,IAASnM,IAAKI,GAAUJ,GAAIE,CAAS,IAAI,QACzC+X,IAAe9L,IAASpM,GAAmBoM,CAAM,IAAI,QAGrD0E,IAAeuL,EAAa,WAAW,IAAI,CAACnV,MAAM5J,EAAM4J,GAAGuV,CAAS,CAAC,GACrEC,IAAsB;AAAA,MACxB,GAAGC,GAAsB7L,GAAcnI,GAAUiU,EAAgB;AAAA,MACjE,UAAU;AAAA,IAAA;AAGd,IAAI1E,MACIwE,IACcngB,EAAA2b,GAAcwE,GAAqB,EAAK,IAExCngB,EAAA2b,GAAcvP,GAAU,EAAK,GAE/BhM,EAAAub,GAAc,IAAM,EAAK;AAAA,EAC7C;AAKA,SAAA,gBAAA3Z,EAAC,OAAI,EAAA,WAAW,yBACZ,UAAA;AAAA,IAAA,gBAAAA,EAACD,IAAU,EAAA,UAAU,OAAO,WAAW,kCAEnC,UAAA;AAAA,MAAA,gBAAAX,EAACa,GAAW,EAAA,SAAQ,MAAK,WAAW,QAAQ,UAAqB,yBAAA;AAAA,MAEjE,gBAAAb;AAAA,QAACkf;AAAA,QAAA;AAAA,UAAyB,gBAAgBR,EAAa;AAAA,UAC7B,UAAUA,EAAa;AAAA,UACvB,kBAAkBA,EAAa;AAAA,UAC/B,uBAAuB/f,EAAO;AAAA,UAC9B,qBAAqB,CAACmD,MAAU4c,EAAa,YAAY5c,KAAS,MAAS;AAAA,UAC3E,mBAAmB,CAAC;AAAA,YACI,UAAAkJ;AAAAA,YACA,aAAArI;AAAAA,YACA,WAAAmc;AAAA,UAAA,MAEb,gBAAA9e;AAAA,YAACmf;AAAA,YAAA;AAAA,cACJ,UAAUnU;AAAAA,cACV,aAAarI;AAAAA,cACb,uBAAuB,CAACA,GAAqBb,MAAkBlD,EAAc,cAAc+D,CAAW,SAASb,GAAO,EAAK;AAAA,cAC3H,aAAa,MAAM;AACX,gBAAA,CAACa,KAAe,CAACqI,KACD2T,EAAA;AAAA,kBAChB,GAAG3T;AAAAA,kBACH,IAAIrI;AAAAA,kBACJ,UAAU;AAAA,gBAAA,CACb;AAAA,cACL;AAAA,cACA,kBAAkB,gBAAA3C;AAAA,gBAACof;AAAA,gBAAA;AAAA,kBAAe,UAAUpU;AAAAA,kBACV,UAAU;AAAA,kBACV,mBAAmB,CAACiH,MAAU4M,EAAsB;AAAA,oBAChD,GAAG5M;AAAA,oBACH,WAAA6M;AAAA,kBAAA,CACH;AAAA,kBACD,aAAanc;AAAAA,kBACb,iBAAAmJ;AAAA,gBAAA;AAAA,cAAiC;AAAA,YAAA;AAAA,UAAA;AAAA,QAE3E;AAAA,MAAE;AAAA,IAAA,GAChC;AAAA,IAEA,gBAAA9L;AAAA,MAAC+P;AAAA,MAAA;AAAA,QACG,MAAMH,MAAqB;AAAA,QAC3B,aAAAjN;AAAA,QACA,UAAAqI;AAAA,QACA,SAAS;AAAA,QACT,cAAc;AAAA,QACd,mBAAAmF;AAAA,QACA,oBAAoB;AAAA,QACpB,oBAAA/C;AAAA,QACA,aAAa,MAAM;AACf,UAAAuR,EAAoB,MAAS;AAAA,QACjC;AAAA,QACA,UAAU,MAAM;AACZ,UAAAA,EAAoB,MAAS;AAAA,QACjC;AAAA,QACA,oBAAoB;AAAA,QACpB,kBAAkB;AAAA,QAClB,iBAAA7S;AAAA,MAAA;AAAA,IAAiC;AAAA,sBAEpC,OAAI,EAAA,OAAO,EAAE,QAAQ,UAAS;AAAA,EACnC,EAAA,CAAA;AAGR;AAEA,SAASsT,GAAe;AAAA,EACI,UAAApU;AAAA,EACA,mBAAAmF;AAAA,EACA,aAAAxN;AAAA,EACA,iBAAAmJ;AAAA,EACA,UAAA1I;AACJ,GAWrB;AAEC,QAAMic,IAAUrU,IAAWmL,GAAWnL,CAAQ,IAAI,MAC5CoF,IAASpF,IAAWiB,GAAejB,GAAUc,CAAe,IAAI,MAEhE,CAAC+J,GAAYC,CAAa,IAAIxW,EAAS,EAAK;AAE3C,SAAA,gBAAAU;AAAA,IAACc;AAAA,IAAA;AAAA,MAAQ,OAAOkK,KAAYoF,IAAS,GAAGA,GAAQ,IAAI,MAAMpF,EAAS,QAAQ,KAAK;AAAA,MACvE,MAAM6K,IAAa,KAAQ;AAAA,MACvC,UAAA,gBAAA7V;AAAA,QAAC6B;AAAA,QAAA;AAAA,UACG,MAAMgU;AAAA,UACN,cAAcC;AAAA,UACd,WAAW;AAAA,UACX,WAAW;AAAA,UACX,UAAA1S;AAAA,UACA,OAAO,CAACgN;AAAA,UACR,OAAOiP,KAAW;AAAA,UAClB,aAAa;AAAA,UACb,UAAU;AAAA,UACV,aAAa,CAACvd,MACLsO,IACE,gBAAApQ,EAACoM,IAAoB,EAAA,gBAAgBgE,EAAO,CAAA,IAD/B;AAAA,UAGxB,eAAe,CAACuG,MAAwB;AACpC,kBAAM2I,IAAcpM,GAAyBlI,GAAU2L,GAAqB7K,CAAe;AAC3F,YAAKnJ,KACawN,EAAA;AAAA,cACd,IAAIxN;AAAA,cACJ,UAAU2c;AAAA,cACV,YAAY3c;AAAA,cACZ,WAAW;AAAA,YAAA,CACd;AAAA,UACL;AAAA,UACC,UAAA,OAAO,QAAQiR,EAAe,EAAE,IAAI,CAAC,CAACtI,GAAK8E,CAAM,MACvC,gBAAApQ;AAAA,YAACuT;AAAA,YAAA;AAAA,cAEJ,OAAOjI;AAAA,cACP,gBAAgB;AAAA,cAChB,gBAAgB8E;AAAAA,cAChB,UAAU;AAAA,YAAA;AAAA,YAJL9E;AAAA,UAAA,CAKZ;AAAA,QAAA;AAAA,MAEL;AAAA,IAAA;AAAA,EAAA;AAER;ACtQO,SAASiU,GAAkC,EAAE,cAAAb,GAAc,YAAAtT,GAAY,iBAAAiC,KAI3E;AAEC,EAAAvN,GAAU,MAAM;AACZ,UAAM0f,IAAoBC,GAAqBf,EAAa,kBAAkBtT,CAAU,GAClFsU,IAAahB,EAAa,WAAW,IAAI,OAAKiB,GAAoB,GAAGjB,EAAa,UAAUA,EAAa,gBAAgBtT,GAAYoU,GAAmB,WAAW,CAAC;AAC1K,IAAAd,EAAa,YAAYgB,CAAU;AAAA,EACvC,GAAG,CAAE,CAAA;AAEL,QAAME,IAAsBC;AAErB,SAAA,gBAAA7f;AAAA,IAAC8f;AAAA,IAAA;AAAA,MACJ,yBAAQ,OACJ,EAAA,UAAA;AAAA,QAAC,gBAAA9f,EAAAa,GAAA,EAAW,SAAS,aAAa,UAAqB,yBAAA;AAAA,QACtD,gBAAAb,EAAAa,GAAA,EAAW,SAAS,WAAW,UAA6C,iDAAA;AAAA,MAAA,GACjF;AAAA,MACA,iBAAiB;AAAA,QACb,MAAM6d,EAAa;AAAA,QACnB,aAAa;AAAA,QACb,cAAc;AAAA,MAClB;AAAA,MACA,cAAc,gBAAA1e,EAAC,OAAI,EAAA,WAAW,OAAO,CAAA;AAAA,MACrC,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,qBAAA4f;AAAA,MACA,oBAAoBvS,EAAgB,IAAI,CAAAqC,OAAM,EAAE,KAAKA,GAAG,UAAU,GAAA,EAAQ;AAAA,MAC1E,YAAAtE;AAAA,IAAA;AAAA,EAAA;AAER;ACjCgB,SAAA2U,GAA0B3U,GAAwB4U,IAAa,IAI7E;AAEQ,QAAAxS,IAAS,OAAO,KAAKpC,CAAU,EAAE,OAAO,CAACmM,GAAKjM,MAAQ;AAClD,UAAAN,IAAWI,EAAWE,CAAG,GACzB2U,IAAOC,GAAQ5U,CAAG,GAClB6U,IAAWH,IAAa,GAAGA,CAAU,IAAIC,CAAI,KAAKA;AAExD,QAAIjV,EAAS,aAAa,SAASA,EAAS,YAAY;AACpD,YAAMoV,IAAkBL,GAA0B/U,EAAS,YAA0BmV,CAAQ;AACtF,aAAA;AAAA,QACH,gBAAgB,EAAE,GAAG5I,EAAI,gBAAgB,CAACjM,CAAG,GAAG6U,EAAS;AAAA,QACzD,YAAY;AAAA,UACR,GAAG5I,EAAI;AAAA,UACP,CAAC0I,CAAI,GAAG;AAAA,YACJ,GAAGjV;AAAA,YACH,YAAYoV,EAAgB;AAAA,YAC5B,iBAAiB,OAAO,KAAKA,EAAgB,UAAU;AAAA,UAC3D;AAAA,QACJ;AAAA,MAAA;AAAA,IAER;AAEA,UAAMlG,IAAoB;AAAA,MACtB,GAAG3C,EAAI;AAAA,MACP,CAAC0I,CAAI,GAAGjV;AAAA,IAAA;AAKL,WAAA;AAAA,MACH,gBAHmB,EAAE,GAAGuM,EAAI,gBAAgB,CAACjM,CAAG,GAAG6U;MAInD,YAAYjG;AAAA,IAAA;AAAA,EAEpB,GAAG,EAAE,gBAAgB,CAAA,GAAI,YAAY,CAAA,EAAI,CAAA,GAEnCmG,IAAW,OAAO,KAAK7S,EAAO,cAAc,IAAI,CAAC;AACnD,MAAA8S;AACJ,UAAID,GAAU,SAAS,IAAI,KAAKA,GAAU,SAAS,KAAK,OACzCC,IAAAD,IAGR;AAAA,IACH,GAAG7S;AAAA,IACH,UAAA8S;AAAA,EAAA;AAER;AC+BO,SAAStD,GAAuB/K,GAAoC;AAEvE,QAAM5L,IAAO4L,EAAM,MAEb,CAACsO,GAAWC,CAAY,IAAI9hB,GAAM,SAAkB,EAAK,GACzD,CAAC+hB,GAA0BC,CAA2B,IAAIhiB,GAAM,SAAkB,EAAK,GAEvFyc,IAAe5N,EAAY,MAAM;AACnC,IAAKgT,IAGDG,EAA4B,EAAI,IAFhCzO,EAAM,YAAY,MAAS;AAAA,EAIhC,GAAA,CAACsO,GAAWtO,EAAM,WAAW,CAAC;AAEjC,SAAAnS,GAAU,MAAM;AACZ,IAAKuG,MACDma,EAAa,EAAK,GAClBE,EAA4B,EAAK;AAAA,EACrC,GACD,CAACra,CAAI,CAAC,GAGL,gBAAAzF;AAAA,IAACsB;AAAA,IAAA;AAAA,MACG,MAAAmE;AAAA,MACA,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAc,CAACA,MAAUA,IAAwB,SAAjB8U;MAE/B,UAAA;AAAA,QAAQ9U,KAAA,gBAAArG;AAAA,UAAC2gB;AAAA,UAAA;AAAA,YAAkB,GAAG1O;AAAA,YACJ,cAAAkJ;AAAA,YACA,cAAAqF;AAAA,UAAA;AAAA,QAA2B;AAAA,QAEtD,gBAAAxgB;AAAA,UAACib;AAAA,UAAA;AAAA,YACG,MAAMwF;AAAA,YACN,UAAU,MAAMxO,EAAM,YAAY,MAAS;AAAA,YAC3C,cAAc,MAAMyO,EAA4B,EAAK;AAAA,YACrD,MAAM;AAAA,UAAA;AAAA,QAA+C;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIrE;AAYO,SAASC,GAAiB1O,GAG9B;AACO,QAAA,EAAE,iBAAAnG,MAAoBC,MACtBmG,IAAaP,MACbiP,IAAiBC,MAEjB;AAAA,IACF,oBAAAC;AAAA,IACA,aAAA3O;AAAA,EACA,IAAAD,GAEE6O,IAAoB9O,EAAM,eAC1B+O,IAAmB,CAACD,GAAmB,SAAS9O,EAAM,uBAAuB,CAAA,GAAI,WAAW,GAC5FgP,KAA0BhP,EAAM,mBAAmBA,EAAM,iBAAiB,iBAAiBE,MAAgB,IAC3G9T,IAAgB4iB,EAAuB,IAAI,CAAA5O,MAAOA,EAAI,KAAK,KAAA,EAAO,YAAA,CAAa,GAC/E/T,IAAc2iB,EAAuB,IAAI,CAAA5O,MAAOA,EAAI,IAAI,KAAK,EAAE,YAAY,CAAC,EAAE,OAAO,OAAO,GAC5F,CAACE,GAAY2O,CAAa,IAAIxiB,GAAM,SAA+C,GACnF,CAACyiB,GAAyBC,CAA0B,IAAI1iB,GAAM,SAAS,EAAK;AAgBlF,MAdAoB,GAAU,MAAM;AACR,QAAA;AACA,MAAIoS,EAAW,gBACPD,EAAM,qBACQiP,EAAAhP,EAAW,uBAAuB,CAAC,GAAID,EAAM,uBAAuB,CAAA,GAAKA,EAAM,kBAAkB,CAAC,CAAC,IAEjHiP,EAAc,MAAS,GAE3BE,EAA2B,EAAI;AAAA,aAE9BlgB,GAAG;AACR,cAAQ,MAAMA,CAAC;AAAA,IACnB;AAAA,EAAA,GACD,CAACgR,EAAW,wBAAwBD,EAAM,oBAAoBA,EAAM,qBAAqBC,EAAW,WAAW,CAAC,GAC/G,CAAC4O;AACD,UAAM,MAAM,qDAAqD;AAG/D,QAAA;AAAA,IACF,QAAAviB;AAAA,EACqB,IAAAuiB,GAEnBO,IAAoB9O,IACpB;AAAA,IACE,GAAGA;AAAA,IACH,IAAIA,EAAW,MAAMA,EAAW,QAAQ+O,GAAa,EAAE;AAAA,EAEzD,IAAA,QAEAC,IAA0CF,IAC1CG,GAAqBH,GAAmBvV,CAAe,IACvD;AAAA,IACE,IAAIiV,GAAmB,QAAQO,GAAa,EAAE;AAAA,IAC9C,MAAMP,GAAmB,QAAQ;AAAA,IACjC,MAAMA,GAAmB,QAAQ;AAAA,IACjC,OAAOA,GAAmB,SAAS;AAAA,IACnC,YAAY,CAAC;AAAA,IACb,iBAAiB,CAAC;AAAA,IAClB,MAAMU,GAAa,KAAK,MAAM,KAAK,OAAO,IAAIA,GAAa,MAAM,CAAC;AAAA,IAClE,SAASb,EAAe,MAAM,OAAO;AAAA,EAAA;AAG7C,SAAKO,IAID,CAAClP,EAAM,oBAAoB,CAACC,EAAW,eAAe,CAACiP,uBAC/CO,IAAsB,CAAA,CAAA,IAG3B,gBAAA1hB;AAAA,IAAC2hB;AAAA,IAAA;AAAA,MACH,GAAG1P;AAAA,MACJ,eAAAsP;AAAA,MACA,eAAAljB;AAAA,MACA,aAAAC;AAAA,MACA,kBAAA0iB;AAAA,MACA,YAAAzO;AAAA,MACA,eAAA2O;AAAA,MACA,QAAA3iB;AAAA,MACA,iBAAAuN;AAAA,IAAA;AAAA,EAAA,sBAhBQ4V,IAAsB,CAAA,CAAA;AAkBtC;AAEA,SAASC,GAAwD;AAAA,EACI,iBAAAxjB;AAAA,EACA,kBAAAsd;AAAA,EACA,oBAAAmG;AAAA,EACA,qBAAAjG;AAAA,EACA,UAAAkG;AAAA,EACA,qBAAAnG;AAAA,EACA,aAAAoG;AAAA,EACA,gBAAA1jB;AAAA,EACA,WAAA2jB;AAAA,EACA,cAAA5G;AAAA,EACA,cAAAqF;AAAA,EACA,iBAAAhD;AAAA,EACA,SAAA1E;AAAA,EACA,kBAAAta;AAAA,EACA,SAAA8E;AAAA,EACA,eAAAjF;AAAA,EACA,aAAAC;AAAA,EACA,kBAAA0iB;AAAA,EACA,YAAAzO;AAAA,EACA,eAAA2O;AAAA,EACA,eAAAK;AAAA,EACA,iBAAAzV;AAAA,EACA,QAAAvN;AACJ,GAY/D;AAEE,QAAMmgB,IAAesD,MACf9P,IAAaP,MACb+F,IAAqBzO,MAGrByP,IAAoB9D,GAAO,CAAA,CAAE,GAE7BqN,IAAc9jB,IAAmB6iB,IAAmB,YAAY,YAAa,cAC7E,CAACkB,GAAaC,CAAc,IAAI7iB,EAAqB2iB,CAAW,GAEhE,CAACjQ,GAAOoQ,CAAQ,IAAI1jB,GAAM,SAA4B,GAEtD2jB,IAAiB,CAACC,MAAgE;AAC9E,UAAAhgB,IAAKggB,EAAkB,MAAMA,EAAkB;AACrD,WAAO7G,EAAiB,eAAe;AAAA,MACnC,IAAAnZ;AAAA,MACA,gBAAgBggB;AAAA,MAChB,YAAYV;AAAA,MACZ,qBAAAjG;AAAA,IAAA,CACH,EACI,KAAK,OACFyG,EAAS,MAAS,GACX,GACV,EACA,MAAM,CAAClhB,OACJkhB,EAASlhB,CAAC,GACV,QAAQ,MAAMA,CAAC,GACfwW,EAAmB,KAAK;AAAA,MACpB,MAAM;AAAA,MACN,SAAS,mCAAmCxW,EAAE,WAAW;AAAA,IAAA,CAC5D,GACM,GACV;AAAA,EAAA,GAGHqhB,IAAchV,EAAY,MAAM;AAClC,IAAI2U,MAAgB,YACZxD,EAAa,QACbyD,EAAe,oBAAoB,IAEnCA,EADOJ,IACQ,eAEA,YAFY,IAK/BI,EADOD,MAAgB,YACR,YACRA,MAAgB,wBACR,wBACRA,MAAgB,wBACR,YACRA,MAAgB,eACR,eAEA,SARS;AAAA,KAW7B,CAACA,GAAaxD,EAAa,OAAOqD,CAAS,CAAC,GAEzChJ,IAAwBxL,EAAY,CAACgF,MAAyC;AAChF,QAAKmJ;AACE,aAAAA,IAAsBnJ,EAAW,MAAMA,EAAW,mBAAmB,IAAOoJ,KAAuB,CAAA,CAAE;AAAA,EAAA,GAC7G,CAACD,GAAqBC,CAAmB,CAAC,GAEvC6G,KAA0BjV,EAAY,OAAOwM,MAA0C;AAErF,QAAA;AACA,UAAI,CAAChB;AACD,eAAAmI,EAAcnH,CAAa,GACpB,QAAQ,QAAQA,CAAa;AAGxC,MAAAoI,EAAe,SAAS;AAElB,YAAAM,IAAqB,MAAM1J,IAAwBgB,CAAa;AAEtE,UAAI,CAAC0I;AACD,eAAAvB,EAAcnH,CAAa,GACpB,QAAQ,QAAQA,CAAa;AAExC,YAAMpb,IAAS;AAAA,QACX,GAAIob,KAAiB,CAAC;AAAA,MAAA;AAQtB,aALA,OAAO,KAAK0I,EAAmB,cAAc,EAAE,EAAE,SAAS,MAC1D9jB,EAAO,aAAa8jB,EAAmB,YACvC9jB,EAAO,kBAAkB8jB,EAAmB,kBAG3C9jB,EAAO,mBAKZuiB,EAAcviB,CAAM,GACpB,QAAQ,MAAM,uBAAuB;AAAA,QACjC,eAAeob,KAAiB,CAAC;AAAA,QACjC,QAAApb;AAAAA,MAAA,CACH,GACMA,MATHA,EAAO,kBAAkB,OAAO,KAAKA,EAAO,UAAU,GAC/CA;AAAAA,aASNuC,GAAQ;AACb,qBAAQ,MAAMA,CAAC,GACfwW,EAAmB,KAAK;AAAA,QACpB,MAAM;AAAA,QACN,SAAS,kCAAkCxW,EAAE,WAAW;AAAA,MAAA,CAC3D,GACM6Y;AAAA,IACX;AAAA,EAAA,GACD,CAAC4B,GAAqB5C,CAAqB,CAAC,GA8FzC2J,KAAiBlf,GAAwC;AAAA,IAC3D,eAAA+d;AAAA,IACA,UA9Fa,CAACoB,GAA4C5N,MAA+D;AACjH,cAAA,IAAI,yBAAyB4N,CAAkB;AACnD,UAAA;AAEA,YAAI,CAACxkB,GAAiB;AACH,UAAAkkB,EAAAM,CAAkB,EAAE,KAAK,MAAM;AAC1C,YAAA5N,EAAiB,UAAU,EAAE,QAAQwM,EAAe,CAAA,GACpDO,EAAYa,CAAkB;AAAA,UAAA,CACjC;AACD;AAAA,QACJ;AAEA,QAAIT,MAAgB,aACJK,KACZxN,EAAiB,UAAU,EAAE,QAAQ4N,EAAoB,CAAA,KAClDT,MAAgB,YACnBH,KAAarD,EAAa,SAC1B3J,EAAiB,UAAU,EAAE,QAAQ4N,EAAoB,CAAA,GAC7CJ,OACLpkB,IACPqkB,GAAwBG,CAAkB,EACrC,KAAK,CAAChkB,MAAW;AACd,UAAAoW,EAAiB,UAAU;AAAA,YACvB,QAAQpW,KAAUgkB;AAAA,YAClB,SAAS;AAAA,cACL,MAAM;AAAA,cACN,MAAM;AAAA,YACV;AAAA,UAAA,CACH;AAAA,QAAA,CACJ,EAAE,QAAQ,MAAM;AACL,UAAAJ;QAAA,CACf,KAEDxN,EAAiB,UAAU,EAAE,QAAQ4N,EAAoB,CAAA,GAC7CJ,OAETL,MAAgB,gBACXK,KACZxN,EAAiB,UAAU,EAAE,QAAQ4N,EAAoB,CAAA,KAClDT,MAAgB,yBAEhBA,MAAgB,wBADXK,MAGLL,MAAgB,eACRG,EAAAM,CAAkB,EAAE,KAAK,MAAM;AAC1C,UAAA5N,EAAiB,UAAU,EAAE,QAAQwM,EAAe,CAAA,GACxCgB,KACZT,EAAYa,CAAkB;AAAA,QAAA,CACjC,KAEWJ,KACZxN,EAAiB,UAAU,EAAE,QAAQ4N,EAAoB,CAAA;AAAA,eAExDzhB,GAAQ;AACb,QAAAwW,EAAmB,KAAK;AAAA,UACpB,MAAM;AAAA,UACN,SAAS,mCAAmCxW,EAAE,WAAW;AAAA,QAAA,CAC5D,GACD,QAAQ,MAAMA,CAAC,GACf6T,EAAiB,UAAU,EAAE,QAAQ4N,EAAoB,CAAA;AAAA,MAC7D;AAAA,IAAA;AAAA,IAmCA,YAhCe,CAACtQ,MAA6B;AAE7C,UAAItT,IAA8B,CAAA;AAClC,YAAM6jB,KAAUV,MAAgB,gBAAgBA,MAAgB,oBAAoBA,MAAgB,cAAclkB;AAClH,UAAI4kB;AACI,YAAA;AACA,UAAAA,EAAO,aAAavQ,GAAK,EAAE,YAAY,GAAO,CAAA;AAAA,iBACzCnR,IAAQ;AACX,UAAAA,GAAA,MAAM,QAAQ,CAAC2hB,OAAa;AACnB,YAAA9jB,EAAA8jB,GAAI,IAAI,IAAIA,GAAI;AAAA,UAAA,CAC1B;AAAA,QACL;AAKJ,UAHIX,MAAgB,iBAChBnjB,IAAS,EAAE,GAAGA,GAAQ,GAAG2Z,EAAkB,QAAQ,IAEnDwJ,MAAgB,WAAW;AAC3B,cAAMpQ,KAAYgR,GAAazQ,EAAI,MAAMlU,GAAiBE,GAAegU,EAAI,EAAE;AAC/E,QAAIP,OACA/S,EAAO,OAAO+S;AAElB,cAAMvL,KAAU4O,GAAW9C,EAAI,IAAIlU,GAAiBE,GAAeC,CAAW;AAC9E,QAAIiI,OACAxH,EAAO,KAAKwH;AAAA,MAEpB;AACO,aAAAxH;AAAA,IAAA;AAAA,EAMP,CACH,GAEK;AAAA,IACF,QAAAJ;AAAA,IACA,eAAAC;AAAA,IACA,cAAAK;AAAA,IACA,OAAA+Z;AAAA,IACA,aAAA9Z;AAAA,EACA,IAAAwjB,IAGEnF,KAAO5e,GAAO,MACdokB,KAAkBlB,GAAU,SAAS,GAAG,IAAIA,GAAU,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,IAAI,MAAMtE,KAAOA,IACvGzL,KAAYgR,GAAavF,IAAMpf,GAAiBE,GAAeM,GAAO,EAAE,GAExEqkB,KAAc,CAAClR,MAAa6J,IAAsBzJ,EAAW,kBAAkByJ,CAAmB,IAAI,QACtGsH,KAAgBnR,KAA6D,SAAjDI,EAAW,mBAAmB6Q,EAAe,GACzEG,KAAkBD,MAAgB3f,IAAU,MAAMA,EAAQ2f,IAAcD,MAAe,CAAA,CAAE,IAAI;AAEnG,EAAAljB,GAAU,MAAM;AACZ,IAAA0gB,EAAaxH,EAAK;AAAA,EAAA,GACnB,CAACA,EAAK,CAAC;AAEV,WAASmK,GAAgBte,GAAgB;AACrC,IAAA6Z,EAAa,SAAS,EAAI,GAC1B0E,GAA8Bve,GAAMoa,EAAgB,EAC/C,KAAK,CAAC7T,MAAe;AACZ,YAAA9B,IAAMyW,GAA0B3U,CAAU;AAElC,MAAAxM,GAAA,cAAc0K,EAAI,UAAU,GAC1C1K,GAAc,mBAAmB,OAAO,KAAK0K,EAAI,UAAU,CAAC,GAE/CoV,EAAA,YAAYpV,EAAI,QAAQ,GACrCoV,EAAa,cAAc7Z,CAAI,GAClB6Z,EAAA,kBAAkBpV,EAAI,cAAc,GACpCoV,EAAA,oBAAoBpV,EAAI,UAAU;AAAA,IAAA,CAClD;AAAA,EACT;AAEA,QAAM+Z,KAAc,EAAQ1kB,GAAO,QAAS,EAAQA,GAAO,IAErD2kB,KAA0B,MAAM;AAClC,UAAMpJ,IAAoB,EAAE,GAAGvb,GAAO,WAAW;AACjD,IAAI+f,EAAa,YACN,OAAAxE,EAAkBwE,EAAa,QAAQ,GAClD9f,GAAc,cAAcsb,CAAiB,GAEjCqI;EAAA,GAIVnV,IADWmF,GAAY,aAAa,UAAaA,GAAY,aAAa,MACzCpU;AAEhC,SAAA,gBAAA6B,EAACwG,MAAc,YAAY,IAC9B,4BAAC7C,IAAO,EAAA,OAAO+e,IAEX,UACK,gBAAA9hB,EAAAoF,GAAA,EAAA,UAAA;AAAA,IAAA,CAAC7H,KAAmB,gBAAAyC;AAAA,MAAC2iB;AAAA,MAAA;AAAA,QAAK,OAAOrB;AAAA,QACP,WAAW9gB,GAAGwN,IAAoB,kDAAkD;AAAA,QACpF,eAAe,CAAC5M,MAAMmgB,EAAengB,CAAe;AAAA,QAC3E,UAAA;AAAA,UAAC,gBAAAhC,EAAAwjB,IAAA,EAAI,OAAO,WAAW,UAEvB,WAAA;AAAA,UACC,gBAAAxjB,EAAAwjB,IAAA,EAAI,OAAO,cAAc,UAE1B,cAAA;AAAA,UACC,gBAAAxjB,EAAAwjB,IAAA,EAAI,OAAO,kBAAkB,UAE9B,oBAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACJ;AAAA,IAEA,gBAAA5iB;AAAA,MAAC;AAAA,MAAA;AAAA,QAAK,YAAU;AAAA,QACV,UAAU8hB,GAAe;AAAA,QACzB,WAAWthB;AAAA,UACPjD,IAAkB,WAAW;AAAA,UAC7B;AAAA,QAAkC;AAAA,QAEvC,UAAA;AAAA,UAAgB+jB,MAAA,+BACZR,IAAsB,CAAA,CAAA;AAAA,UAE1BQ,MAAgB,gBACb3E,MACAwE,GAAW,QACV,gBAAA/hB,EAAA+hB,EAAU,MAAV,EAAe,MAAAxE,IAAW;AAAA,UAE9B2E,MAAgB,aACb,gBAAAliB;AAAA,YAACsd;AAAA,YAAA;AAAA,cACG,MAAAC;AAAA,cACA,YAAY,CAACkG,MAAe;AACxB,gBAAIA,KACAN,GAAgBM,CAAU,GAC1BtB,EAAe,qBAAqB,KAEpCA,EAAe,SAAS;AAAA,cAEhC;AAAA,cACA,yBAAyB9jB;AAAA,cACzB,kBAAAG;AAAA,cACA,iBAAAgf;AAAA,YAAA;AAAA,UAAiC;AAAA,UAExC0E,MAAgB,yBAAyBxD,KACtC,gBAAA1e;AAAA,YAACye;AAAA,YAAA;AAAA,cAA8B,cAAAC;AAAA,cACA,oBAAAtR;AAAA,cACA,iBAAAtB;AAAA,YAAA;AAAA,UAAiC;AAAA,UAEnEoW,MAAgB,yBAAyBxD,KACtC,gBAAA1e;AAAA,YAACuf;AAAA,YAAA;AAAA,cAAkC,cAAAb;AAAA,cACA,YAAY/f,GAAO;AAAA,cACnB,iBAAiBA,GAAO;AAAA,YAAA;AAAA,UAA4B;AAAA,UAE1FujB,MAAgB,wBAAwBxD,KACrC,gBAAA1e;AAAA,YAAC0jB;AAAA,YAAA;AAAA,cAAqB,cAAAhF;AAAA,cACA,YAAY/f;AAAA,cACZ,MAAA4e;AAAA,cACA,iBAAiB,OAAOoG,MAAuB;AAC3C,gBAAAjM,EAAmB,KAAK;AAAA,kBACpB,MAAM;AAAA,kBACN,SAAS;AAAA,gBAAA,CACZ,GACD,MAAM2K,EAAe1jB,EAAM,GAC3BmjB,EAAY6B,CAAkB;AAAA,cAClC;AAAA,YAAA;AAAA,UACtB;AAAA,UAEHzB,MAAgB,aACb,gBAAAliB;AAAA,YAAC9B;AAAA,YAAA;AAAA,cACG,eAAAG;AAAA,cACA,aAAAC;AAAA,cACA,QAAAC;AAAA,cACA,qBAAAod;AAAA,cACA,kBAAAnd;AAAA,cACA,iBAAAL;AAAA,YAAA;AAAA,UAAiC;AAAA,UAExC+jB,MAAgB,oBAAoB3P,KACjC,gBAAAvS;AAAA,YAACwb;AAAA,YAAA;AAAA,cACG,kBAAAhd;AAAA,cACA,kBAAAid;AAAA,cACA,SAAA3C;AAAA,cACA,qBAAA4C;AAAA,cACA,qBAAAC;AAAA,cACA,YAAApJ;AAAA,YAAA;AAAA,UAAuB;AAAA,UAE9B2P,MAAgB,gBACb,gBAAAliB;AAAA,YAACyY;AAAA,YAAA;AAAA,cACG,YAAYvZ,KAAc;AAAA,cAC1B,iBAAAf;AAAA,cACA,gBAAAC;AAAA,cACA,iBAAiB,CAACuE,GAAaH,GAAWwP,MAAU;AAChD,sBAAM4R,KAAUC,GAAgB;AAAA,kBAC5B,GAAGnL,EAAkB;AAAA,kBACrB,CAAC7V,GAAcF,GAAaH,CAAS,CAAC,GAAGqhB,GAAgB7R,GAAO,EAAI;AAAA,mBACrE,EAAI;AACP,gBAAA0G,EAAkB,UAAUkL,IAC5BlB,GAAe,SAAS;AAAA,cAC5B;AAAA,cACA,SAAA5J;AAAA,cACA,SAASoK;AAAA,cACT,uBAAAnK;AAAA,cACA,iBAAAjN;AAAA,cACA,oBAAAsB;AAAA,cACA,WAAW2U,GAAW,QAClB,gBAAA/hB;AAAA,gBAACe;AAAA,gBAAA;AAAA,kBACG,OAAO;AAAA,kBACP,SAAS,MAAMohB,EAAe,YAAY;AAAA,kBACzC,UAAUJ,EAAA;AAAA,gBAAA;AAAA,cACf;AAAA,YAAA;AAAA,UAAc;AAAA,UAGzBG,MAAgB,aAAa,gBAAAthB;AAAA,YAAC6F;AAAA,YAAA;AAAA,cAC3B,UAAU;AAAA,cACT,UAAA;AAAA,gBAASuL,KAAA,gBAAAhS,EAAC8jB,MAAU,OAAA9R,EAAa,CAAA;AAAA,gBAEjC7T,KAAmB6iB,KAAoBkB,MAAgB,yBACpD,gBAAAthB;AAAA,kBAACgE;AAAA,kBAAA;AAAA,oBAAO,SAAS;AAAA,oBACT,MAAK;AAAA,oBACL,SAAS,OACL8Z,EAAa,SAAS,EAAK,GACpByD,EAAe,SAAS;AAAA,oBAEvC,UAAA;AAAA,sBAAA,gBAAAniB,EAAC+jB,IAAa,EAAA;AAAA,sBAAE;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAEpB;AAAA,gBAEH5lB,KAAmB6iB,KAAoBkB,MAAgB,yBACpD,gBAAAthB;AAAA,kBAACgE;AAAA,kBAAA;AAAA,oBAAO,SAAS;AAAA,oBACT,MAAK;AAAA,oBACL,SAAS,MAAM;AACX,sBAAAud,EAAe,qBAAqB;AAAA,oBACxC;AAAA,oBACJ,UAAA;AAAA,sBAAA,gBAAAniB,EAAC+jB,IAAa,EAAA;AAAA,sBAAE;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAEpB;AAAA,gBAEH5lB,KAAmB6iB,KAAoBkB,MAAgB,aACpD,gBAAAthB;AAAA,kBAACgE;AAAA,kBAAA;AAAA,oBAAO,SAAS;AAAA,oBACT,MAAK;AAAA,oBACL,SAAS,MAAMud,EAAe,SAAS;AAAA,oBAC3C,UAAA;AAAA,sBAAA,gBAAAniB,EAAC+jB,IAAa,EAAA;AAAA,sBAAE;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAEpB;AAAA,gBAEH5lB,KAAmB+jB,MAAgB,gBAAgB,gBAAAthB;AAAA,kBAACgE;AAAA,kBAAA;AAAA,oBAAO,SAAS;AAAA,oBACT,MAAK;AAAA,oBACL,SAAS,MAAMud,EAAe,SAAS;AAAA,oBAC/F,UAAA;AAAA,sBAAA,gBAAAniB,EAAC+jB,IAAa,EAAA;AAAA,sBAAE;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAEpB;AAAA,gBAEA,gBAAA/jB;AAAA,kBAAC4E;AAAA,kBAAA;AAAA,oBAAO,SAAS;AAAA,oBACT,SAAS,MAAM;AACE,sBAAAuW;oBACjB;AAAA,oBAAG,UAAA;AAAA,kBAAA;AAAA,gBAEX;AAAA,gBAEChd,KAAmB+jB,MAAgB,yBAChC,gBAAAliB;AAAA,kBAAC4E;AAAA,kBAAA;AAAA,oBACG,SAAS;AAAA,oBACT,OAAM;AAAA,oBACN,SAAS0e;AAAA,oBACZ,UAAA;AAAA,kBAAA;AAAA,gBAED;AAAA,gBAEHnlB,KAAmB+jB,MAAgB,yBAChC,gBAAAliB;AAAA,kBAAC4E;AAAA,kBAAA;AAAA,oBACG,SAAS;AAAA,oBACT,OAAM;AAAA,oBACN,SAAS,MAAM;AACC,sBAAA2d;oBAChB;AAAA,oBACH,UAAA;AAAA,kBAAA;AAAA,gBAED;AAAA,gBAEHpkB,MAAoB+jB,MAAgB,aAAaA,MAAgB,iBAC9D,gBAAAthB;AAAA,kBAACojB;AAAA,kBAAA;AAAA,oBACG,SAAS;AAAA,oBACT,OAAM;AAAA,oBACN,MAAK;AAAA,oBACL,SAAS/kB;AAAA,oBACT,UAAUA,MAAiBijB,MAAgB,aAAa,CAACmB;AAAA,oBACzD,WAAWnB,MAAgB,eACrB,gBAAAliB,EAACikB,MAAQ,IACT;AAAA,oBAEL,UAAA;AAAA,sBAAA/B,MAAgB,aAAa;AAAA,sBAC7BA,MAAgB,gBAAgB;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACrC;AAAA,gBAEH,CAAC/jB,KAAmB,gBAAA6B;AAAA,kBAACgkB;AAAA,kBAAA;AAAA,oBAClB,SAAQ;AAAA,oBACR,OAAM;AAAA,oBACN,MAAK;AAAA,oBACL,SAAS/kB;AAAA,oBACZ,UAAA;AAAA,kBAAA;AAAA,gBAED;AAAA,cAAA;AAAA,YAAA;AAAA,UAEJ;AAAA,QAAA;AAAA,MAAA;AAAA,IACJ;AAAA,EAAA,GACJ,GAEJ,EAEJ,CAAA;AAEJ;AAEA,SAASuiB,GAA0DjP,GAAoCzG,GAA8E;AACjL,QAAM,EAAE,YAAAV,GAAY,GAAG8Y,EAAA,IAAS3R,GAC1B4R,IAA8C,CAAA;AACpD,SAAI/Y,KACA,OAAO,KAAKA,CAAU,EAAE,QAAQ,CAACE,MAAQ;AACrC,IAAA6Y,EAAiB7Y,CAAG,IAAI8Y,GAAsBhZ,EAAWE,CAAG,GAAwBQ,CAAe;AAAA,EAAA,CACtG,GAGE,EAAE,GAAGoY,GAAM,YAAYC,EAAiB;AACnD;AAEA,SAASC,GAAsBpZ,GAA6Bc,GAAsD;AAC9G,MAAIuY,IAAmBrZ;AACvB,MAAIc,KAAmB,OAAOuY,KAAqB,YAAYA,EAAiB,gBAAgB;AACtF,UAAArY,IAAiBF,EAAgBuY,EAAiB,cAAc;AACtE,QAAIrY,KAAkBf,GAAkBe,EAAe,QAAQ;AAC3D,MAAAqY,IAAmBrY,EAAe;AAAA,aAG9BA,MACmBqY,IAAA/Q,EAAUtH,EAAe,UAAUqY,CAAgB,IAGtE,CAACpZ,GAAkBoZ,CAAgB,KAAKA,EAAiB,aAAa,SAASA,EAAiB,YAAY;AAC5G,YAAMjZ,IAAgD,CAAA;AACtD,aAAO,KAAKiZ,EAAiB,UAAU,EAAE,QAAQ,CAAC/Y,MAAQ;AACtD,QAAAF,EAAWE,CAAG,IAAI8Y,GAAwBC,EAAiC,WAA0B/Y,CAAG,GAAeQ,CAAe;AAAA,MAAA,CACzI,GACkBuY,IAAA,EAAE,GAAGA,GAAkB,YAAAjZ;IAC9C;AAAA,EAGR;AACO,SAAAiZ;AAEX;AAEA,MAAMvB,KAAe,CAAChhB,GAAe3D,GAA0BE,GAAyBwH,MAAqB;AACrG,MAAAmM;AACJ,SAAKlQ,MACOkQ,IAAA,gEAIR7T,KAAmBE,GAAe,SAASyD,EAAM,OAAO,aAAa,KAAK,CAAC+D,MACnEmM,IAAA,0KAEKsS,GAAgCxiB,CAAK,EAAE,MAAM,GAAG,EACpD,SAAS,MAAM,MACxBkQ,IAAQ,yDAAyDlQ,CAAK,KAEnEkQ;AACX,GAEMmD,KAAa,CAACrT,GAAe3D,GAA0BE,GAAyBC,MAA0B;AAC5G,MAAI,CAACwD;AAAc;AACf,MAAAkQ;AACJ,SAAI7T,KAAmBE,GAAe,SAASyD,EAAM,KAAK,EAAE,aAAa,MAC7DkQ,IAAA,iEACR7T,KAAmBG,GAAa,SAASwD,EAAM,KAAK,EAAE,aAAa,MAC3DkQ,IAAA,qDAILA;AACX,GC7wBauS,KAA0B7lB,EAAM,cAA2C,CAAA,CAAS,GACpF8lB,KAA0B9lB,EAAM,cAA0C,CAAA,CAAS,GAwCnF+lB,KAA2B/lB,EAAM;AAAA,EAC1C,SAAkC;AAAA,IACI,UAAAiK;AAAA,IACA,4BAAA+b;AAAA,IACA,mBAAAC;AAAA,IACA,gBAAAvmB;AAAA,IACA,qBAAAsd;AAAA,IACA,WAAAqG;AAAA,IACA,iBAAAvE;AAAA,IACA,SAAA1E;AAAA,IACA,SAAAxV;AAAA,IACA,kBAAAshB;AAAA,EAAA,GACiD;AAEnF,UAAM1S,IAAaP,MACbkT,IAAWC,MACXpN,IAAqBzO,MACrB,EAAE,iBAAA6C,MAAoBC,MAEtB;AAAA,MACF,aAAAoG;AAAA,IACA,IAAAD,GACE7T,KAAiB8T,KAAe,CAAA,GAAI,IAAI,CAAOE,MAAAA,EAAI,KAAK,OAAO,YAAa,CAAA,GAE5E,CAAC0S,GAAqBC,CAAsB,IAAItmB,EAAM,SAA+B;AAC3F,IAAAoB,GAAU,MAAM;AACZ,MAAI0d,KACgBA,EAAA,EAAE,KAAK,CAACyH,MAAU;AAC9B,QAAAD,EAAuBC,EAAM,OAAO,CAAKvV,MAAA,CAACrR,EAAc,SAASqR,EAAE,KAAO,EAAA,YAAa,CAAA,CAAC,CAAC;AAAA,MAAA,CAC5F;AAAA,IACL,GACD,CAAC8N,CAAe,CAAC;AAEpB,UAAM,CAACrB,GAAeC,CAAgB,IAAI1d,EAAM,SAY7C,GAEG,CAACwmB,GAAuBC,CAAwB,IAAIzmB,EAAM,SAU7D,GAEG0mB,IAA+D7X,EAAY,OAAO;AAAA,MACpF,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,IAAA,IACnB,CAAE,CAAA,GAEA8X,IAAiB9X,EAAY,CAAC;AAAA,MACI,IAAAjL;AAAA,MACA,UAAAuf;AAAA,MACA,qBAAAlG;AAAA,MACA,kBAAAnd;AAAA,IAAA,MAMlC;AACF,cAAQ,MAAM,mBAAmB8D,GAAIuf,GAAUlG,GAAqBnd,CAAgB,GACpFomB,IAAmB,mBAAmB,EAAE,IAAAtiB,GAAI,UAAAuf,EAAU,CAAA,GACrCzF,EAAA;AAAA,QACb,oBAAoB9Z;AAAA,QACpB,UAAAuf;AAAA,QACA,qBAAAlG;AAAA,QACA,iBAAiB;AAAA,QACjB,kBAAAnd;AAAA,QACA,UAAU;AAAA,MAAA,CACb;AAAA,IACL,GAAG,CAAE,CAAA,GAEC8mB,IAAe/X,EAAY,CAAC;AAAA,MACI,aAAA5K;AAAA,MACA,UAAAqI;AAAA,MACA,oBAAA4W;AAAA,MACA,wBAAAtS;AAAA,MACA,qBAAAqM;AAAA,MACA,YAAApJ;AAAA,IAAA,MAQhC;AACF,cAAQ,MAAM,iBAAiB5P,GAAaqI,GAAU4W,GAAoBtS,GAAwBqM,GAAqBpJ,CAAU,GACjIqS,IAAmB,iBAAiB,EAAE,aAAAjiB,GAAa,oBAAAif,EAAoB,CAAA;AAEvE,YAAMpf,IAAYG,KAAeA,EAAY,SAAS,GAAG,IACnDA,EAAY,UAAU,GAAGA,EAAY,YAAY,GAAG,CAAC,IACrD,QACA4iB,KAA8B5iB,KAAeA,EAAY,SAAS,GAAG,IACrEA,EAAY,UAAUA,EAAY,YAAY,GAAG,IAAI,CAAC,IACtDA;AACmB,MAAAwiB,EAAA;AAAA,QACrB,aAAaI;AAAA,QACb,UAAAva;AAAA,QACA,WAAAxI;AAAA,QACA,wBAAA8M;AAAA,QACA,oBAAAsS;AAAA,QACA,qBAAAjG;AAAA,QACA,oBAAoBpJ,GAAY,YAAY;AAAA,MAAA,CAC/C;AAAA,IACL,GAAG,CAAE,CAAA,GAECiT,IAAmB9mB,EAAM,YAAY,CAAC;AAAA,MACI,qBAAAid;AAAA,MACA,kBAAAnd;AAAA,MACA,eAAA+iB;AAAA,MACA,UAAAkE;AAAA,MACA,aAAAC;AAAA,IAAA,MAW1C;AACM,cAAA,MAAM,qBAAqB,EAAE,qBAAA/J,GAAqB,kBAAAnd,GAAkB,eAAA+iB,GAAe,UAAAkE,GAAU,aAAAC,GAAa,GAClHd,IAAmB,qBAAqB,EAAE,qBAAAjJ,GAAqB,kBAAAnd,GAAkB,eAAA+iB,GAAe,UAAAkE,GAAU,aAAAC,GAAa,GACtGtJ,EAAA;AAAA,QACb,iBAAiB;AAAA,QACjB,qBAAAT;AAAA,QACA,kBAAAnd;AAAA,QACA,eAAA+iB;AAAA,QACA,UAAAkE;AAAA,MAAA,CACH;AAAA,IACL,GAAG,CAAE,CAAA,GAECE,IAAsBnI,IAEtB,CAACD,MACK,CAACA,KAAQwH,IACF,QAAQ,QAAQA,CAAmB,IAEnCvH,IAAkBD,CAAI,IALnC;AASN,WACK,gBAAAvd,EAAAukB,GAAwB,UAAxB,EAAiC,OAAOG,GACrC,UAAA,gBAAA9jB;AAAA,MAAC4jB,GAAwB;AAAA,MAAxB;AAAA,QACG,OAAO;AAAA,UACH,gBAAAa;AAAA,UACA,kBAAAG;AAAA,UACA,cAAAF;AAAA,UACA,mBAAmBX,KAAqBS;AAAA,UACxC,qBAAAL;AAAA,QACJ;AAAA,QAEC,UAAA;AAAA,UAAApc;AAAA,UAED,gBAAA3I;AAAA,YAACgd;AAAA,YAAA;AAAA,cACG,MAAM,EAAQb;AAAA,cACd,kBAAkBuI;AAAA,cAClB,iBAAiB;AAAA,cACjB,qBAAAhJ;AAAA,cACC,GAAGS;AAAA,cACJ,SAAA7Y;AAAA,cACA,gBAAAlF;AAAA,cACA,WAAA2jB;AAAA,cACA,iBAAiB4D;AAAA,cACjB,SAAA7M;AAAA,cACA,aAAa,CAACvG,MAAe;AACzB,oBAAI4J,GAAe,YACX5J,KAAc4J,GAAe,mBAAmB,CAACA,EAAc,oBAAoB,QAAQ;AAC3F,wBAAMyJ,IAAM1T,EAAW,uBAAuBK,EAAW,MAAMA,EAAW,IAAI;AAC9E,kBAAAsS,EAASe,CAAG;AAAA,gBAChB;AAEJ,gBAAAxJ,EAAiB,MAAS;AAAA,cAC9B;AAAA,YAAA;AAAA,UAAE;AAAA,UAGN,gBAAApc;AAAA,YAAC+P;AAAA,YAAA;AAAA,cACG,MAAM,EAAQmV;AAAA,cACd,kBAAkB;AAAA,cAClB,kBAAkB,EAAQA,GAAuB;AAAA,cACjD,cAAeA,IAAgC,CAACA,GAAuB,cAAhC;AAAA,cACvC,oBAAqBA,IAAgC,CAACA,GAAuB,cAAhC;AAAA,cAC7C,SAAS;AAAA,cACT,oBAAoBA,GAAuB,sBAAsB;AAAA,cACjE,SAAS5hB,KAAW4hB,GAAuB,qBACrC,MAAM;AACI,wBAAA,MAAM,yBAAyBA,GAAuB,kBAAkB;AAChF,sBAAMjC,IAAe/Q,EAAW,mBAAmBgT,EAAsB,kBAAmB;AACrF,uBAAA5hB,EAAQ2f,GAAc,CAAA,CAAE;AAAA,cAEjC,IAAA;AAAA,cACN,mBAAmB,CAAC;AAAA,gBACI,IAAA3gB;AAAA,gBACA,UAAA0I;AAAA,cAAA,MACE;AAEtB,oBADI,CAACka,KACD,CAAC5iB;AAAI;AACH,sBAAAgd,IAAc,CAAE4F,EAAsB;AAC5C,uBAAOR,EAA2B,aAAa;AAAA,kBAC3C,MAAMQ,GAAuB;AAAA,kBAC7B,UAAAla;AAAA,kBACA,aAAa1I;AAAA,kBACb,oBAAoBgd,KAAe4F,EAAsB,yBAAyB,CAAC,GAAGA,EAAsB,wBAAwB5iB,CAAE,IAAI;AAAA,kBAC1I,WAAW4iB,EAAsB;AAAA,kBACjC,qBAAqBA,EAAsB;AAAA,gBAAA,CAC9C,EACI,MAAM,CAAChkB,OACJ,QAAQ,MAAMA,CAAC,GACfwW,EAAmB,KAAK;AAAA,kBACpB,MAAM;AAAA,kBACN,SAAS,iCAAiCxW,EAAE,WAAW;AAAA,gBAAA,CAC1D,GACM,GACV;AAAA,cACT;AAAA,cACA,4BAA4B;AAAA,cAC5B,UAAU,MAAM;AACZ,oBAAI,CAACgkB,GAAuB;AAAa;AACzC,sBAAMvX,IAAqBuX,GAAuB,wBAAwB,OAAO,CAAKxV,MAAAA,MAAMwV,GAAuB,WAAW;AAC9H,uBAAOR,EAA2B,eAAe;AAAA,kBAC7C,MAAMQ,GAAuB;AAAA,kBAC7B,aAAaA,GAAuB;AAAA,kBACpC,WAAWA,GAAuB;AAAA,kBAClC,oBAAAvX;AAAA,kBACA,qBAAqBuX,GAAuB;AAAA,gBAAA,CAC/C,EACI,KAAK,MAAM;AACR,kBAAAC,EAAyB,MAAS;AAAA,gBAAA,CACrC,EAAE,MAAM,CAACjkB,OACN,QAAQ,MAAMA,CAAC,GACfwW,EAAmB,KAAK;AAAA,kBACpB,MAAM;AAAA,kBACN,SAAS,+BAA+BxW,EAAE,WAAW;AAAA,gBAAA,CACxD,GACM,GACV;AAAA,cACT;AAAA,cACA,SAAS,MAAM;AAAA,cACf;AAAA,cACA,aAAa,MAAM;AACf,gBAAAikB,EAAyB,MAAS;AAAA,cACtC;AAAA,cACA,UAAU,MAAM;AACZ,gBAAAA,EAAyB,MAAS;AAAA,cACtC;AAAA,cACA,eAAe,CAAC;AAAA,cAChB,iBAAiB;AAAA,cACjB,sBAAsB,CAAC;AAAA,cACvB,oBAAoB;AAAA,cACpB,iBAAArZ;AAAA,cACA,UAAUoZ,GAAuB;AAAA,cACjC,aAAaA,GAAuB;AAAA,YAAA;AAAA,UAAY;AAAA,QAAA;AAAA,MAAA;AAAA,IAI5D,EAAA,CAAA;AAAA,EAER;AAAA,EAAG9e;AAAK,GCzUCyf,KAAgC,MAAkCC,GAAWtB,EAAuB,GCApGuB,KAAiC,MAAmCD,GAAWvB,EAAuB;ACO5G,SAASyB,GAAuB;AAAA,EACI,MAAMnE;AAAA,EACN,qBAAAlG;AAAA,EACA,YAAApJ;AAAA,EACA,iBAAA0T;AACJ,GAA2B;AAE9D,QAAMrF,IAAiBC,MACjBqF,IAAuBvU,MACvBwU,IAA6BN,MAC7BpK,IAAmBsK,MACnBrO,IAAqBzO,MAErBzK,IAAmB0nB,EAAqB,qBAAqBvK,CAAmB,GAEhFyK,IAAoBD,EAA2B,oBAC/CA,EAA2B,kBAAkB;AAAA,IAC3C,MAAMvF,EAAe;AAAA,IACrB,YAAArO;AAAA,EAAA,CACH,EAAE,kBACD;AAEN,MAAI8T,IAA0B;AAC1B,UAAA,CAACjgB,GAAMkgB,GAAgBL,EAAgB,YAAY,GAAGK,GAAgB/T,EAAW,aAAa,CAAC,KAC/F,CAACnM,GAAMkgB,GAAgBL,EAAgB,MAAM,GAAGK,GAAgB/T,EAAW,WAAW,CAAC,OACvF8T,IACM,gBAAAzlB,EAAAoF,GAAA,EAAA,UAAA;AAAA,KAAWuM,EAAA,iBAAiBA,EAAW,gBAAgB,gBAAAvS;AAAA,MAACc;AAAA,MAAA;AAAA,QACtD,OAAO;AAAA,QACP,UAAA,gBAAAd;AAAA,UAAC4E;AAAA,UAAA;AAAA,YACG,OAAO;AAAA,YACP,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,MAAM;AACX,cAAAqhB,EAAgB,cAAc,GAC1B1T,GAAY,iBACI0T,EAAA,kBAAkB1T,GAAY,aAAa,GAC3DA,GAAY,eACI0T,EAAA,YAAY1T,GAAY,WAAW;AAAA,YAC3D;AAAA,YACA,4BAACgU,IAAQ,EAAA;AAAA,UAAA;AAAA,QACb;AAAA,MAAA;AAAA,IACJ;AAAA,IAEA,gBAAAvmB;AAAA,MAACc;AAAA,MAAA;AAAA,QACG,OAAOmlB,EAAgB,UAAUA,EAAgB,eAAe,iCAAiC;AAAA,QACjG,UAAA,gBAAAjmB;AAAA,UAAC4E;AAAA,UAAA;AAAA,YACG,OAAO;AAAA,YACP,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,MAAM6W,GACT,eAAe;AAAA,cACb,IAAIlJ,EAAW;AAAA,cACf,qBAAAoJ;AAAA,cACA,gBAAgBrI;AAAA,gBAAUf;AAAA,gBACtB;AAAA,kBACI,eAAe0T,EAAgB,gBAAgB;AAAA,kBAC/C,aAAaA,EAAgB,UAAU;AAAA,gBAC3C;AAAA,cAAC;AAAA,YAAA,CACR,EAAE,KAAK,MAAM;AACV,cAAAvO,EAAmB,KAAK;AAAA,gBACpB,MAAM;AAAA,gBACN,SAAS;AAAA,cAAA,CACZ;AAAA,YAAA,CACJ;AAAA,YACL,4BAAC8O,IAAQ,EAAA;AAAA,UAAA;AAAA,QACb;AAAA,MAAA;AAAA,IACJ;AAAA,EACJ,EAAA,CAAA,IAgBC,gBAAA5lB,EAAAoF,GAAA,EAAA,UAAA;AAAA,IAAqBogB,KAAAC;AAAA,IAbL,gBAAArmB;AAAA,MAACc;AAAA,MAAA;AAAA,QAClB,OAAOslB,IAAoB,oBAAoB;AAAA,QAC/C,UAAA,gBAAApmB;AAAA,UAACe;AAAA,UAAA;AAAA,YACG,OAAO;AAAA,YACP,UAAU,CAACqlB;AAAA,YACX,SAASA,IACH,MAAMD,GAA4B,eAAe,EAAE,IAAI5T,EAAW,IAAI,UAAAsP,GAAU,qBAAAlG,GAAqB,kBAAAnd,EAA2D,CAAA,IAChK;AAAA,YACN,4BAACoD,IAAY,EAAA;AAAA,UAAA;AAAA,QACjB;AAAA,MAAA;AAAA,IAAA;AAAA,EAMJ,EAAA,CAAA;AAEJ;AAEA,SAAS0kB,GAAgBG,GAA2B;AAChD,SAAIA,KAAK,OAAO,KAAKA,CAAC,EAAE,WAAW,IACxBA,IACJA,KAAK;AAChB;ACjGO,SAASC,GAA+B;AAAA,EACI,MAAAnJ;AAAA,EACA,YAAAhL;AACJ,GAA+B;AAE1E,QAAMmF,IAAqBzO,MACrB2X,IAAiBC,MACjBpF,IAAmBsK,MACnBI,IAA6BN,MAE7Bc,IAAcR,EAA2B,kBAAkB;AAAA,IAC7D,MAAMvF,EAAe;AAAA,IACrB,YAAArO;AAAA,EAAA,CACH,GAEKqU,IAA0BrZ,EAAY,MAAM;AAClB,IAAA4Y,GAAA,eAAe,EAAE,IAAI5T,EAAW,IAAI,qBAAqB,IAAI;AAAA,EAAA,GAC1F,CAAC4T,GAA4B5I,CAAI,CAAC,GAE/B,CAACsJ,GAAiBC,CAAkB,IAAIxnB,EAAS,EAAK,GAEtDynB,IAAmBxZ,EAAY,MAAM;AACrB,IAAAkO,GAAA,iBAAiB,EAAE,IAAIlJ,EAAW,GAAI,CAAA,EAAE,KAAK,MAAM;AACjE,MAAAuU,EAAmB,EAAK,GACxBpP,EAAmB,KAAK;AAAA,QACpB,SAAS;AAAA,QACT,MAAM;AAAA,MAAA,CACT;AAAA,IAAA,CACJ;AAAA,EAAA,GACF,CAAC6F,GAAM9B,CAAgB,CAAC;AAE3B,SAEI,gBAAA7a,EAAAoF,GAAA,EAAA,UAAA;AAAA,IAAA,gBAAApF,EAAC,OACI,EAAA,UAAA;AAAA,MAAA+lB,EAAY,qBACT,gBAAA3mB;AAAA,QAACgnB;AAAA,QAAA;AAAA,UACG,SAAU,gBAAAhnB,EAAAe,IAAA,EACN,4BAACkmB,IAAa,EAAA,MAAM,QAAQ,CAAA,GAChC;AAAA,UAEA,UAAC,gBAAArmB,EAAAsmB,IAAA,EAAS,SAAS,CAAC3lB,MAAU;AAC1B,YAAAA,EAAM,eAAe,GACrBA,EAAM,gBAAgB,GACtBulB,EAAmB,EAAI;AAAA,UAEvB,GAAA,UAAA;AAAA,YAAA,gBAAA9mB,EAACiX,IAAU,EAAA;AAAA,YAAE;AAAA,UAAA,GAEjB;AAAA,QAAA;AAAA,MAEJ;AAAA,MAIH0P,EAAY,mBACT,gBAAA3mB;AAAA,QAACe;AAAA,QAAA;AAAA,UACG,SAAS,CAACQ,MAAU;AACQ,YAAAqlB;UAC5B;AAAA,UACA,UAAA,gBAAA5mB,EAAC4B,IAAa,EAAA,MAAM,QAAQ,CAAA;AAAA,QAAA;AAAA,MAChC;AAAA,IAAA,GACR;AAAA,IAEA,gBAAA5B;AAAA,MAACkX;AAAA,MAAA;AAAA,QACG,MAAM2P;AAAA,QACN,UAAUE;AAAA,QACV,UAAU,MAAMD,EAAmB,EAAK;AAAA,QACxC,8BAAS,UAAuB,0BAAA,CAAA;AAAA,QAChC,MAAQ,gBAAAlmB,EAAAoF,GAAA,EAAA,UAAA;AAAA,UAAA;AAAA,UAAW,gBAAAhG,EAAC,OAAE,UACH,sBAAA,CAAA;AAAA,UAAI;AAAA,QAAA,GACM;AAAA,MAAA;AAAA,IAAI;AAAA,EACzC,EAAA,CAAA;AAEJ;AC/EO,SAASmnB,GAAkB;AAAA,EACI,OAAAhnB;AAAA,EACA,SAAAinB;AACJ,GAAuC;AAEjE,MAAA,CAACA,EAAQ,WAAW;AACpB,UAAM,MAAM,yCAAyC;AAEzD,QAAMxG,IAAiBC,MAEjBsF,IAA6BN,MAC7BwB,IAAuBlB,EAA2B,oBAClDA,EAA2B,kBAAkB;AAAA,IAC3C,MAAMvF,EAAe;AAAA,EAAA,CACxB,EAAE,oBACD;AAGF,SAAA,gBAAA5gB;AAAA,IAACwe;AAAA,IAAA;AAAA,MAAK,WAAWpd,GAAG,0BAA0B;AAAA,MACxC,SAAS+kB,KAA8BkB,IACjC,MAAMlB,EAA2B,iBAAiB;AAAA,QAChD,eAAehmB,IAAQ,EAAE,OAAAA,EAAA,IAAU;AAAA,QACnC,qBAAqB,CAAC;AAAA,QACtB,UAAU;AAAA,QACV,aAAa;AAAA,MAChB,CAAA,IACC;AAAA,MAER,UAAA,gBAAAS;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAU;AAAA,UACV,UAAA;AAAA,YAAA,gBAAAZ,EAAC8P,IAAQ,EAAA,OAAM,WAAU,MAAM,SAAQ;AAAA,YACvC,gBAAA9P;AAAA,cAACa;AAAA,cAAA;AAAA,gBAAW,OAAM;AAAA,gBACN,SAAS;AAAA,gBACT,WAAW;AAAA,gBAAgB,+BAAqB,YAAY;AAAA,cAAA;AAAA,YAAE;AAAA,YAEzE,CAACwmB,KACE,gBAAArnB,EAACa,GAAW,EAAA,SAAS,WAAW,UACjB,oDAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAEvB;AAAA,IAAA;AAAA,EAAA;AAIZ;AC1CgB,SAAAymB,GAA0B,EAAE,WAAAC,KAAiE;AAEzG,QAAM3G,IAAiBC,MACjBqF,IAAuBvU,MAEvBwU,IAA6BN,MAC7BwB,IAAuBlB,EAA2B,oBAClDA,EAA2B,kBAAkB;AAAA,IAC3C,MAAMvF,EAAe;AAAA,EAAA,CACxB,EAAE,oBACD,IAEAmE,IAAsBoB,EAA2B,qBAEjDqB,KAAmBzC,KAAuB,CAAC,GAAG,SAAS,MAAOmB,EAAqB,eAAe,IAAI,WAAW,MAAMnB,KAAuB,IAAI,SAAS;AAE1J,SAAA,gBAAA/kB;AAAA,IAACynB;AAAA,IAAA;AAAA,MACJ,IAFyBF,MAAc,sBAEXC;AAAA,MAE5B,UAAA,gBAAA5mB;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAW;AAAA,UAEV,UAAA;AAAA,YAAA,CAAC2mB,KAAc,gBAAA3mB,EAAAC,GAAA,EAAW,SAAS,SAAS,OAAO,aAAa,UAAA;AAAA,cAAA;AAAA,cACzC,gBAAAb,EAAC,OAAE,UAAa,gBAAA,CAAA;AAAA,cAAI;AAAA,YAAA,GAC5C;AAAA,YAECunB,MAAc,sBAAsB,gBAAA3mB,EAACC,GAAW,EAAA,UAAA;AAAA,cAAA;AAAA,cAC3B,gBAAAb,EAAC,OAAE,UAAoB,uBAAA,CAAA;AAAA,cAAI;AAAA,YAAA,GACjD;AAAA,YAEA,gBAAAY;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,WAAW;AAAA,gBACT,UAAA;AAAA,mBAAAmkB,KAAuB,CAAA,GAAI,IAAI,CAACxH,wBAEzB,OACG,EAAA,UAAA,gBAAAvd;AAAA,oBAACgB;AAAA,oBAAA;AAAA,sBACG,MAAM,gBAAAhB,EAAC8P,IAAQ,EAAA,MAAM,QAAQ,CAAA;AAAA,sBAC7B,aAAa;AAAA,sBACb,SAASqW,KAA8BkB,IACjC,MAAMlB,EAA2B,iBAAiB;AAAA,wBAChD,eAAe,EAAE,MAAA5I,GAAM,MAAMvM,GAAUuM,CAAI,EAAE;AAAA,wBAC7C,qBAAqB,CAAC;AAAA,wBACtB,UAAU;AAAA,wBACV,aAAa;AAAA,sBAChB,CAAA,IACC;AAAA,sBACN,MAAK;AAAA,sBACJ,UAAAA;AAAA,oBAAA;AAAA,kBAAA,KAbCA,CAeV,CAEP;AAAA,kBACAwH,MAAwB,UAAc,gBAAA/kB,EAAAmF,IAAA,EAAiB,MAAM,SAAQ;AAAA,kBACrE4f,GAAqB,WAAW,uBAAMlkB,GAAW,EAAA,SAAS,WAAW,UAAc,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YACxF;AAAA,UAAA;AAAA,QAAA;AAAA,MACJ;AAAA,IAAA;AAAA,EAAA;AAER;ACxDO,SAAS6mB,GAA2B;AAAA,EACI,aAAA/kB;AAAA,EACA,SAAAglB;AAAA,EACA,UAAA3c;AAAA,EACA,UAAA6W;AAAA,EACA,qBAAAlG;AAAA,EACA,YAAApJ;AACJ,GAOxC;AAEC,QAAM4T,IAA6BN;AAG/B,SAAA,gBAAA7lB,EAACc,IAAQ,EAAA,OAAO,QACZ,UAAA,gBAAAd;AAAA,IAACe;AAAA,IAAA;AAAA,MACG,WAAW4mB,IAAU,8BAA8B;AAAA,MACnD,SAAS,MAAM;AACX,QAAAxB,EAA2B,aAAa;AAAA,UACpC,aAAAxjB;AAAA,UACA,UAAAqI;AAAA,UACA,oBAAoBuH,EAAW;AAAA,UAC/B,qBAAAoJ;AAAA,UACA,YAAApJ;AAAA,QAAA,CACH;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,UAAA,gBAAAvS,EAAC4B,IAAa,EAAA,MAAM,QAAQ,CAAA;AAAA,IAAA;AAAA,EAEpC,EAAA,CAAA;AAER;ACrCO,SAASgmB,GAA2B;AAAA,EACI,UAAA/F;AAAA,EACA,qBAAAlG;AAAA,EACA,YAAApJ;AACJ,GAIxC;AAEC,QAAMqO,IAAiBC,MACjBsF,IAA6BN,MAC7BO,IAAoBD,EAA2B,oBAC/CA,EAA2B,kBAAkB;AAAA,IAC3C,MAAMvF,EAAe;AAAA,IACrB,YAAArO;AAAA,EAAA,CACH,EAAE,kBACD;AAEN,SACK,gBAAAvS,EAAAc,IAAA,EAAQ,OAAOslB,IAAoB,qBAAqB,mDACrD,UAAA,gBAAApmB;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAW;AAAA,MAEX,SAAS,MAAM;AACX,QAAAmmB,EAA2B,aAAa;AAAA,UACpC,oBAAoB5T,EAAW;AAAA,UAC/B,qBAAAoJ;AAAA,UACA,wBAAwBkM,GAA0BtV,CAAU;AAAA,UAC5D,YAAAA;AAAA,QAAA,CACH;AAAA,MACL;AAAA,MACA,UAAA,gBAAAvS,EAAC8P,IAAQ,EAAA,OAAO,UAAU,CAAA;AAAA,IAAA;AAAA,EAElC,EAAA,CAAA;AAER;ACtCO,SAASgY,KAAsB;AAClC,QAAM3B,IAA6BN;AAC5B,SAAA,gBAAA7lB,EAAC,OAAI,EAAA,WAAW,iDACnB,UAAA,gBAAAY;AAAA,IAACgE;AAAA,IAAA;AAAA,MAAO,WAAW;AAAA,MACX,SAAS;AAAA,MACT,SAAS,MAAMuhB,EAA2B,iBAAiB;AAAA,QACvD,qBAAqB,CAAC;AAAA,QACtB,UAAU;AAAA,QACV,aAAa;AAAA,MAAA,CAChB;AAAA,MACL,UAAA;AAAA,QAAA,gBAAAnmB,EAAC8P,IAAO,EAAA;AAAA,QAAE;AAAA,MAAA;AAAA,IAAA;AAAA,EAGlB,EAAA,CAAA;AACJ;ACmDO,SAASiY,GACf;AAAA,EACI,4BAAArD;AAAA,EACA,WAAA6C;AAAA,EACA,mBAAA5C;AAAA,EACA,gBAAAvmB;AAAA,EACA,WAAA2jB;AAAA,EACA,iBAAAvE;AAAA,EACA,SAAA1E;AAAA,EACA,qBAAA4C;AAAA,EACA,SAAApY;AAAA,EACA,kBAAAshB;AACJ,GAAgG;AAEtF,SAAA;AAAA,IACH,KAAK;AAAA,IACL,SAASF,EAA2B;AAAA,IACpC,UAAU;AAAA,MACN,WAAWD;AAAA,MACX,OAAO;AAAA,QACH,4BAAAC;AAAA,QACA,mBAAAC;AAAA,QACA,qBAAAjJ;AAAA,QACA,gBAAAtd;AAAA,QACA,WAAA2jB;AAAA,QACA,iBAAAvE;AAAA,QACA,SAAA1E;AAAA,QACA,SAAAxV;AAAA,QACA,kBAAAshB;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,MACN,qCAAoBkD,IAAmB,EAAA;AAAA,MACvC,yBAAyBP,IAAa,gBAAAvnB,EAAAgoB,IAAA,EAAY,WAAAT,GAAqB,IAAK;AAAA,MAC5E,uBAAwB,gBAAAvnB,EAAAsnB,IAAA,EAA0B,WAAAC,EAAqB,CAAA;AAAA,MACvE,mBAAmBb;AAAA,MACnB,iBAAiBa,IAAY,SAAYJ;AAAA,IAC7C;AAAA,IACA,gBAAgB;AAAA,MACZ,mBAAmBnB;AAAA,MACnB,cAAc0B;AAAA,MACd,oBAAoBE;AAAA,IACxB;AAAA,EAAA;AAER;AAEgB,SAAAI,GAAY,EAAE,WAAAT,KAE3B;AAGC,MAAI,CADe5V,KACH;AACZ,UAAM,MAAM,yCAAyC;AAEzD,QAAMiP,IAAiBC,MAEjBsF,IAA6BN,MAC7BwB,IAAuBlB,EAA2B,oBAClDA,EAA2B,kBAAkB;AAAA,IAC3C,MAAMvF,EAAe;AAAA,EAAA,CACxB,EAAE,oBACD;AAGF,SAAA,gBAAAhgB,EAAC,OAAI,EAAA,WAAW,+BACZ,UAAA;AAAA,IAAA,gBAAAZ,EAACa,GAAW,EAAA,SAAS,MAAM,WAAU,QAAO,UAAO,WAAA;AAAA,IAClD,gBAAAb,EAAAa,GAAA,EAAW,WAAW,IAAM,UAA4B,gCAAA;AAAA,IACxD,gBAAAb,EAAAa,GAAA,EAAW,WAAW,IAAM,UAI7B,8KAAA;AAAA,IACCwmB,KAAwB,gBAAAzmB;AAAA,MAACgE;AAAA,MAAA;AAAA,QACtB,WAAW;AAAA,QACX,SAASuhB,KAA8BkB,IACjC,MAAMlB,EAA2B,iBAAiB;AAAA,UAChD,qBAAqB,CAAC;AAAA,UACtB,UAAU;AAAA,UACV,aAAa;AAAA,QAChB,CAAA,IACC;AAAA,QACN,UAAA;AAAA,UAAA,gBAAAnmB,EAAC8P,IAAO,EAAA;AAAA,UAAE;AAAA,QAAA;AAAA,MAAA;AAAA,IACd;AAAA,EACJ,EAAA,CAAA;AAER;ACrJO,SAASmY,GAAuB,EAAE,MAAMC,KAE5C;AACC,QAAMhW,IAAaP,MACb4L,IAAO4K,GAAeD,CAAQ,GAC9BvM,IAAsBzJ,EAAW,uBAAuBgW,CAAQ,GAChEE,IAAmBvC;AAClB,SAAA,gBAAAjlB,EAAC,OAAI,EAAA,WAAW,kCACnB,UAAA;AAAA,IAAC,gBAAAZ,EAAA8jB,IAAA,EAAU,OAAO,6BAA6BvG,EAAK,CAAA;AAAA,IACpD,gBAAAvd;AAAA,MAAC4E;AAAA,MAAA;AAAA,QAAO,WAAW;AAAA,QAAQ,SAAS;AAAA,QAC5B,MAAM;AAAA,QACN,SAAS,MAAM;AACX,UAAAwjB,EAAiB,iBAAiB;AAAA,YAC9B,eAAe,EAAE,MAAA7K,GAAM,MAAMvM,GAAUuM,CAAI,EAAE;AAAA,YAC7C,qBAAA5B;AAAA,YACA,UAAU;AAAA,YACV,aAAa;AAAA,UAAA,CAChB;AAAA,QACL;AAAA,QAAG,UAAA;AAAA,MAAA;AAAA,IAEX;AAAA,EACJ,EAAA,CAAA;AACJ;AAOA,SAASwM,GAAe5K,GAAsB;AACpC,QAAA8K,IAAW9K,EAAK,MAAM,GAAG;AACxB,SAAA8K,EAASA,EAAS,SAAS,CAAC;AACvC;"}