el-plus-powerful-form
Version:
## [DOCS](https://peng-xiao-shuai.github.io/vite-vue-admin-docs/zh-CN/component_directive/component/powerful-form-doc.html)
1 lines • 25.7 kB
Source Map (JSON)
{"version":3,"file":"form-view-data.mjs","sources":["../../../packages/powerful-form/src/form-view-data.ts"],"sourcesContent":["import { ElMessage, type FormInstance, type FormItemRule } from 'element-plus'\nimport type {\n PowerfulTableExpose,\n PowerfulTableHeader,\n} from 'el-plus-powerful-table'\nimport type { ComponentPublicInstance, ComputedRef, PropType, Ref } from 'vue'\nimport type {\n FormEventType,\n FormItem,\n FormType,\n PTHeadersProps,\n PowerfulFormData,\n PowerfulFormListApi,\n PowerfulFormPTHeaders,\n PowerfulFormProps,\n SetDataType,\n} from '~/index'\nimport { LangKey, useLocale } from '~/locale/lang'\nimport {\n FormTypeEnum,\n clearSymbol,\n deepClone,\n isTypeProtect,\n useAsyncGetRefs,\n useGetRefs,\n verifyFormItemRule,\n} from '~/index'\n\n/**\n * 定义初始数据对象,用于重置表单\n */\nconst DEFAULT_DATA: { [s: string]: any } = {}\n\n/**\n * form-view 组件 props\n */\nexport const formViewProps = {\n // 表单配置数据\n formItems: {\n type: Array as PropType<PowerfulFormProps['formItems']>,\n default: () => [],\n },\n extendTable: {\n type: [Boolean, String] as PropType<PowerfulFormProps['extendTable']>,\n default: false,\n },\n\n formDataDefault: {\n type: Object as PropType<PowerfulFormProps['formDataDefault']>,\n default: () => ({}),\n },\n disabled: {\n type: Boolean as PropType<PowerfulFormProps['disabled']>,\n default: false,\n },\n showType: {\n type: String as PropType<PowerfulFormProps['showType']>,\n default: undefined,\n },\n property: {\n type: Object as PropType<PowerfulFormProps['property']>,\n default: () => ({}),\n },\n\n apis: {\n type: [Object, Function] as PropType<PowerfulFormProps['apis']>,\n default: undefined,\n },\n\n showLabel: {\n type: Boolean as PropType<PowerfulFormProps['showLabel']>,\n default: true,\n },\n}\n\n/**\n * components Props\n */\nexport const componentProps = () => ({\n // 按钮组件配置数据\n formItem: {\n type: Object as PropType<FormItem>,\n default: () => ({}),\n },\n\n formData: {\n type: Object as PropType<PowerfulFormData['formData']>,\n default: () => ({}),\n },\n index: {\n type: Number as PropType<number>,\n },\n inline: {\n type: Boolean as PropType<boolean>,\n default: false,\n },\n})\n\n// 对部分支持函数的 property 参数进行判断返回\nexport const isProperty = <T, R>(e: T, property?: R | ((e: T) => R)) => {\n return isTypeProtect<typeof property, R>(\n property,\n (pet) => typeof (<R>pet) != 'function'\n )\n ? property\n : property!(e)\n}\n\n/**\n * form-view 组件 数据\n */\nexport const useFormViewState = (props: PowerfulFormProps) => {\n const proxy = getCurrentInstance()?.proxy!\n\n const formViewData: PowerfulFormData = reactive({\n formItems: [],\n rules: {},\n formData: {},\n watchCache: [],\n })\n const elFormRef = ref<FormInstance | null>(null)\n const { t } = useLocale()\n\n onMounted(() => {\n if (props.showType === 'query') {\n setTimeout(() => {\n const formEl = elFormRef.value?.$el\n const parentEl = formEl?.parentNode\n\n if (parentEl && formEl) {\n parentEl.style.height = `${formEl.offsetHeight}px`\n }\n }, 100)\n }\n })\n\n /**\n * @description 写入 formItems 数据,在基于 formItems 数据写入 rules、formData\n * @param {PowerfulTableHeader} PTHeader 表格header数据\n * @param {PTHeadersProps} PTHeaderProps props 数据,基于表格 props 进行补充了部分属性\n */\n const setFormItems = (\n PTHeader: PowerfulTableHeader,\n PTHeaderProps: PTHeadersProps\n ) => {\n /**\n * 判断 PTHeaderProps.type 类型是否可以表单组件接受, 可以接受那么这个值就在 FormType 中存在\n */\n const typeComparison = Object.values(FormTypeEnum).includes(\n PTHeaderProps.type as any // 这里由于是继承了列表的type,但是表单也有type不好去断言,故此直接使用了 any\n )\n\n // 深拷贝数据\n const formItem = deepClone<FormItem>({\n text: PTHeaderProps.text || PTHeader.label,\n prop: PTHeaderProps.formItem?.prop || PTHeaderProps.prop,\n render: typeComparison ? PTHeaderProps.render : undefined,\n type: typeComparison ? (PTHeaderProps.type as keyof FormType) : undefined,\n slotName: PTHeaderProps.slotName,\n\n ...(PTHeaderProps.formItem || {}),\n\n data:\n typeComparison && !PTHeaderProps.formItem?.data\n ? PTHeaderProps.data || {}\n : {\n ...(typeComparison ? PTHeaderProps.data : {}),\n ...PTHeaderProps.formItem?.data,\n },\n } as FormItem)\n\n // 写入 formItems 对 el-form-item 循环\n formViewData.formItems.push(formItem)\n\n // 写入相应类型其他默认值\n setDefaultData(\n formItem as Required<FormItem>,\n formViewData.formData,\n PTHeaderProps\n )\n\n // 写入 rules (表单校验)\n setRules(formItem as Required<FormItem>)\n }\n\n /**\n * @description 写入 rules 数据\n * @param {FormItem} formItem\n */\n const setRules = (formItem: FormItem) => {\n // 如果 formItem.rule 直接是 FormItemRule[] 类型,则 return\n if (\n formItem.rule &&\n isTypeProtect<typeof formItem.rule, FormItemRule[]>(\n formItem.rule,\n (rule) =>\n Array.isArray(rule) &&\n typeof rule[0] === 'object' &&\n !Array.isArray(rule[0])\n )\n ) {\n formViewData.rules[formItem.prop] = formItem.rule\n return\n }\n\n const rules = []\n\n // 判断是否存在\n if (formItem.rule) {\n rules.push({\n required: true,\n message: `${clearSymbol(formItem.text)} ${t(LangKey.VerifyEmpty)}`,\n trigger: 'blur',\n })\n\n // rule 长度限制\n if (Array.isArray(formItem.rule)) {\n rules.push({\n min: formItem.rule[0],\n max: formItem.rule[1],\n message: `${t(LangKey.VerifyLength)}${formItem.rule[0]} ~ ${\n formItem.rule[1]\n }`,\n trigger: 'blur',\n })\n } else if (typeof formItem.rule === 'string') {\n if (verifyFormItemRule[formItem.rule]) {\n rules.push({\n ...verifyFormItemRule[formItem.rule],\n message: t(verifyFormItemRule[formItem.rule].message as LangKey),\n })\n } else {\n console.warn(\n `${\n verifyFormItemRule[\n formItem.rule as keyof typeof verifyFormItemRule\n ]\n ? '在 verifyFormItemRule 中存在'\n : '在 verifyFormItemRule 中不存在'\n } 支持 ${Object.keys(verifyFormItemRule).join('、')}`\n )\n }\n }\n\n formViewData.rules[formItem.prop] = rules\n }\n }\n\n /**\n * @description 更具类型写入数据\n * @param {FormItem} formItem\n * @param {PowerfulFormData['formData']} formData\n * @param {PTHeadersProps} formItem\n */\n const setDefaultData = (\n formItem: FormItem,\n formData: PowerfulFormData['formData'],\n PTHeaderProps?: PTHeadersProps\n ) => {\n // 写入 formData (表单数据)\n Object.assign(formViewData.formData, props.formDataDefault || {})\n\n formViewData.formData[formItem.prop!] =\n props.formDataDefault?.[formItem.prop!] ?? formItem.defaultData ?? ''\n DEFAULT_DATA[formItem.prop!] = formItem.defaultData ?? ''\n\n switch (formItem.type) {\n case FormTypeEnum.Select:\n case FormTypeEnum.SelectV2:\n // 给select类型添加默认值\n if (PTHeaderProps) {\n if (!formItem.data?.options && Array.isArray(PTHeaderProps.filters)) {\n formItem.data!.options = PTHeaderProps.filters.map((f) => ({\n ...f,\n label: f.value,\n value: f.key,\n }))\n }\n }\n /**\n * 这是解决 select-v2 上 value = '' 时不会显示 placeholder\n */\n formData[formItem.prop] = formData[formItem.prop] || undefined\n DEFAULT_DATA[formItem.prop!] = formItem.defaultData ?? ''\n\n break\n case FormTypeEnum.Rate:\n formData[formItem.prop] = Number.isNaN(Number(formData[formItem.prop]))\n ? 0\n : Number(formData[formItem.prop])\n break\n case FormTypeEnum.Checkbox:\n /**\n * 由于是使用 checkboxGroup 实现,checkboxGroup v-model 接受数组形式,故此在此格式化数据\n */\n formData[formItem.prop] =\n typeof formData[formItem.prop] === 'string'\n ? formData[formItem.prop].split(',').filter((v: string) => v.length)\n : Array.isArray(formData[formItem.prop])\n ? formData[formItem.prop]\n : []\n\n DEFAULT_DATA[formItem.prop!] = formItem.defaultData || []\n break\n }\n }\n\n /**\n * 转换数据\n * @param { PowerfulFormPTHeaders[] } headerLists\n */\n const transformHeader = (headerLists: PowerfulFormPTHeaders[]) => {\n /**\n * 清除数据\n */\n formViewData.formItems = []\n Object.keys(DEFAULT_DATA).forEach((k) => delete DEFAULT_DATA[k])\n\n headerLists.forEach((item) => {\n // item.props 是肯定存在的\n if (Array.isArray(item.props)) {\n // 过滤 prop 下不存在 formItem\n item.props\n .filter((prop) => prop.formItem)\n .forEach((prop: PTHeadersProps) => {\n setFormItems(item, prop)\n })\n } else {\n if (item.props.formItem) setFormItems(item, item.props)\n }\n })\n }\n\n /**\n * @description 打平 PowerfulTable 组件 header。修改初始数据\n */\n formViewData.watchCache.push(\n ...[\n /**\n * 监听 extendTable 数据变化\n */\n watch(\n () => props.extendTable,\n (val) => {\n if (val) {\n let headerLists = []\n useAsyncGetRefs<PowerfulTableExpose>(\n typeof val === 'boolean' ? 'PTable' : val,\n proxy\n ).then((res) => {\n headerLists = res?.props.header as PowerfulFormPTHeaders[]\n\n transformHeader(headerLists)\n })\n }\n },\n {\n immediate: true,\n }\n ),\n watch(\n () => props.formDataDefault,\n (val) => {\n // 写入 formData (表单数据)\n Object.assign(formViewData.formData, val || {})\n },\n {\n immediate: true,\n deep: true,\n }\n ),\n watch(\n () => props.formItems,\n (val) => {\n if (val && props.extendTable === false) {\n /**\n * 清除数据\n */\n formViewData.formItems = val\n Object.keys(DEFAULT_DATA).forEach((k) => delete DEFAULT_DATA[k])\n\n formViewData.formItems.forEach((item) => {\n setRules(item)\n\n setDefaultData(item, formViewData.formData)\n })\n }\n },\n {\n immediate: true,\n deep: true,\n }\n ),\n ]\n )\n\n /**\n * 更具显示类型过滤\n */\n const formRenderItems: ComputedRef<FormItem[]> = computed(() =>\n formViewData.formItems.filter((item) =>\n typeof item.visible === 'undefined'\n ? (Array.isArray(item.showType)\n ? item.showType.includes(props.showType || '')\n : item.showType === props.showType) ||\n !props.showType ||\n !item.showType\n : item.visible(formViewData.formData, props.showType)\n )\n )\n\n onBeforeUnmount(() => {\n // 清除监听事件\n formViewData.watchCache.forEach((item) => item())\n })\n\n return {\n formViewData,\n formRenderItems,\n elFormRef,\n transformHeader,\n }\n}\n\nexport const useFunction = (\n props: PowerfulFormProps,\n formData: PowerfulFormData['formData'],\n elFormRef: Ref<FormInstance | null>,\n transformHeader: (headerLists: PowerfulFormPTHeaders[]) => void\n) => {\n const { proxy: _proxy_ } = getCurrentInstance()!\n\n let visible = true\n /**\n * @param {object} [params = {}] apis 请求的格外参数\n */\n const submitForm = (\n params: object = {},\n options?: {\n successMessage?: string\n errorMessage?: string\n cb: (type: 'success' | 'error', res?: any) => void\n }\n ) => {\n elFormRef\n .value!.validate()\n .then(() => {\n if (props.apis) {\n // 是否存在 apis\n // 自定义类型保护判断\n if (\n isTypeProtect<\n typeof props.apis,\n { [key: string]: PowerfulFormListApi }\n >(props.apis, (apis) => !!Object.keys(apis!).length)\n ) {\n // 通过自定义类型保护后,在判断 props.showType 是否存在,props.showType 作为 apis 键值,props.showType 不存在就报错\n if (props.showType) {\n if (props.apis?.[props.showType]) {\n props.apis?.[props.showType]({\n ...params,\n ...formData.value,\n })\n .then((res) => {\n if (options) {\n ElMessage.success(options.successMessage || '提交成功!')\n }\n options?.cb('success', res)\n })\n .catch((err) => {\n if (options) {\n ElMessage.error(options.errorMessage || '提交失败!')\n }\n options?.cb('error', err)\n })\n } else console.error(`apis.${props.showType} 不存在`)\n } else\n console.error(\n `showType 为空,但是 apis 为对象时需要 showType 作为键值。或者 apis 传递一个 Promise`\n )\n } else {\n props\n .apis?.({ ...params, ...formData.value })\n .then((res) => {\n if (options) {\n ElMessage.success(options.successMessage || '提交成功!')\n }\n options?.cb('success', res)\n })\n .catch((err) => {\n if (options) {\n ElMessage.error(options.errorMessage || '提交失败!')\n }\n options?.cb('error', err)\n })\n }\n }\n })\n .catch(() => {\n return false\n })\n\n return elFormRef.value!.validate()\n }\n\n const resetForm = () => {\n formData.value = deepClone(DEFAULT_DATA)\n }\n\n /**\n * 刷新从表格继承数据\n * @param {string} [refName = 'PTable'] PowerfulTable 组件 refName\n */\n const refreshRender = (\n refName: string = typeof props.extendTable === 'boolean'\n ? 'PTable'\n : props.extendTable!,\n proxy?: ComponentPublicInstance\n ) => {\n const _proxy = proxy ? proxy : _proxy_!\n const PTExpose = useGetRefs<PowerfulTableExpose>(refName, _proxy)\n\n if (PTExpose.value?.props.header) {\n transformHeader(PTExpose.value?.props.header as PowerfulFormPTHeaders[])\n }\n }\n\n const visibleFormTrigger = () => {\n const formEl = elFormRef.value?.$el\n const parentEl = formEl?.parentNode\n\n if (parentEl && formEl) {\n visible = !visible\n const height = formEl.offsetHeight\n parentEl.style.height = visible ? `${height}px` : '0px'\n }\n\n return visible\n }\n\n return {\n submitForm,\n resetForm,\n refreshRender,\n visibleFormTrigger,\n bindAttr(\n formItem: FormItem,\n formData: PowerfulFormData['formData'],\n index: number\n ): {\n formItem: FormItem\n formData: PowerfulFormData['formData']\n index: number\n inline: boolean\n } {\n return {\n formItem,\n formData,\n index,\n inline: props.property?.inline || false,\n }\n },\n }\n}\n\n/**\n * 对 components文件夹下组件内部事件处理\n * @param {{ formData: PowerfulFormData['formData']; index: number; formItem: FormItem<T> }} props 事件携带的一个参数数据\n */\nexport const useEvent = <T extends FormEventType>(props: {\n formData: PowerfulFormData['formData']\n formItem: FormItem\n index: number\n}) => {\n const event = (\n eventType: keyof NonNullable<SetDataType<T>['on']>,\n ...arg: any\n ) => {\n if (\n isTypeProtect<SetDataType<FormEventType>, SetDataType<FormEventType>>(\n props.formItem.data!,\n (data) => typeof data?.on != undefined\n )\n ) {\n ;(props.formItem.data?.on as { [key: string]: any })?.[\n eventType as string\n ]?.({ ...props }, ...arg)\n }\n }\n\n return {\n event,\n }\n}\n"],"names":["DEFAULT_DATA","formViewProps","componentProps","isProperty","e","property","isTypeProtect","pet","useFormViewState","props","proxy","_a","getCurrentInstance","formViewData","reactive","elFormRef","ref","t","useLocale","onMounted","formEl","parentEl","setFormItems","PTHeader","PTHeaderProps","typeComparison","FormTypeEnum","formItem","deepClone","_b","_c","setDefaultData","setRules","rule","rules","clearSymbol","LangKey","verifyFormItemRule","formData","f","v","transformHeader","headerLists","k","item","prop","watch","val","useAsyncGetRefs","res","formRenderItems","computed","onBeforeUnmount","useFunction","_proxy_","visible","params","options","apis","ElMessage","err","refName","PTExpose","useGetRefs","height","index","useEvent","eventType","arg","data"],"mappings":";;;;;;;;AA+BA,MAAMA,IAAqC,CAAA,GAK9BC,IAAgB;AAAA;AAAA,EAE3B,WAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,MAAM,CAAC;AAAA,EAClB;AAAA,EACA,aAAa;AAAA,IACX,MAAM,CAAC,SAAS,MAAM;AAAA,IACtB,SAAS;AAAA,EACX;AAAA,EAEA,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,SAAS,OAAO,CAAA;AAAA,EAClB;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,SAAS,OAAO,CAAA;AAAA,EAClB;AAAA,EAEA,MAAM;AAAA,IACJ,MAAM,CAAC,QAAQ,QAAQ;AAAA,IACvB,SAAS;AAAA,EACX;AAAA,EAEA,WAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF,GAKaC,IAAiB,OAAO;AAAA;AAAA,EAEnC,UAAU;AAAA,IACR,MAAM;AAAA,IACN,SAAS,OAAO,CAAA;AAAA,EAClB;AAAA,EAEA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,SAAS,OAAO,CAAA;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF,IAGaC,IAAa,CAAOC,GAAMC,MAC9BC;AAAA,EACLD;AAAA,EACA,CAACE,MAAQ,OAAWA,KAAQ;AAAA,IAE1BF,IACAA,EAAUD,CAAC,GAMJI,IAAmB,CAACC,MAA6B;;AACtD,QAAAC,KAAQC,IAAAC,EAAsB,MAAtB,gBAAAD,EAAsB,OAE9BE,IAAiCC,EAAS;AAAA,IAC9C,WAAW,CAAC;AAAA,IACZ,OAAO,CAAC;AAAA,IACR,UAAU,CAAC;AAAA,IACX,YAAY,CAAC;AAAA,EAAA,CACd,GACKC,IAAYC,EAAyB,IAAI,GACzC,EAAE,GAAAC,MAAMC;AAEd,EAAAC,EAAU,MAAM;AACV,IAAAV,EAAM,aAAa,WACrB,WAAW,MAAM;;AACT,YAAAW,KAAST,IAAAI,EAAU,UAAV,gBAAAJ,EAAiB,KAC1BU,IAAWD,KAAA,gBAAAA,EAAQ;AAEzB,MAAIC,KAAYD,MACdC,EAAS,MAAM,SAAS,GAAGD,EAAO,YAAY;AAAA,OAE/C,GAAG;AAAA,EACR,CACD;AAOK,QAAAE,IAAe,CACnBC,GACAC,MACG;;AAIH,UAAMC,IAAiB,OAAO,OAAOC,CAAY,EAAE;AAAA,MACjDF,EAAc;AAAA;AAAA,IAAA,GAIVG,IAAWC,EAAoB;AAAA,MACnC,MAAMJ,EAAc,QAAQD,EAAS;AAAA,MACrC,QAAMZ,IAAAa,EAAc,aAAd,gBAAAb,EAAwB,SAAQa,EAAc;AAAA,MACpD,QAAQC,IAAiBD,EAAc,SAAS;AAAA,MAChD,MAAMC,IAAkBD,EAAc,OAA0B;AAAA,MAChE,UAAUA,EAAc;AAAA,MAExB,GAAIA,EAAc,YAAY,CAAC;AAAA,MAE/B,MACEC,KAAkB,GAACI,IAAAL,EAAc,aAAd,QAAAK,EAAwB,QACvCL,EAAc,QAAQ,KACtB;AAAA,QACE,GAAIC,IAAiBD,EAAc,OAAO,CAAC;AAAA,QAC3C,IAAGM,IAAAN,EAAc,aAAd,gBAAAM,EAAwB;AAAA,MAC7B;AAAA,IAAA,CACK;AAGA,IAAAjB,EAAA,UAAU,KAAKc,CAAQ,GAGpCI;AAAA,MACEJ;AAAA,MACAd,EAAa;AAAA,MACbW;AAAA,IAAA,GAIFQ,EAASL,CAA8B;AAAA,EAAA,GAOnCK,IAAW,CAACL,MAAuB;AAEvC,QACEA,EAAS,QACTrB;AAAA,MACEqB,EAAS;AAAA,MACT,CAACM,MACC,MAAM,QAAQA,CAAI,KAClB,OAAOA,EAAK,CAAC,KAAM,YACnB,CAAC,MAAM,QAAQA,EAAK,CAAC,CAAC;AAAA,IAAA,GAE1B;AACA,MAAApB,EAAa,MAAMc,EAAS,IAAI,IAAIA,EAAS;AAC7C;AAAA,IACF;AAEA,UAAMO,IAAQ,CAAA;AAGd,IAAIP,EAAS,SACXO,EAAM,KAAK;AAAA,MACT,UAAU;AAAA,MACV,SAAS,GAAGC,EAAYR,EAAS,IAAI,CAAC,IAAIV,EAAEmB,EAAQ,WAAW,CAAC;AAAA,MAChE,SAAS;AAAA,IAAA,CACV,GAGG,MAAM,QAAQT,EAAS,IAAI,IAC7BO,EAAM,KAAK;AAAA,MACT,KAAKP,EAAS,KAAK,CAAC;AAAA,MACpB,KAAKA,EAAS,KAAK,CAAC;AAAA,MACpB,SAAS,GAAGV,EAAEmB,EAAQ,YAAY,CAAC,GAAGT,EAAS,KAAK,CAAC,CAAC,MACpDA,EAAS,KAAK,CAAC,CACjB;AAAA,MACA,SAAS;AAAA,IAAA,CACV,IACQ,OAAOA,EAAS,QAAS,aAC9BU,EAAmBV,EAAS,IAAI,IAClCO,EAAM,KAAK;AAAA,MACT,GAAGG,EAAmBV,EAAS,IAAI;AAAA,MACnC,SAASV,EAAEoB,EAAmBV,EAAS,IAAI,EAAE,OAAkB;AAAA,IAAA,CAChE,IAEO,QAAA;AAAA,MACN,GACEU,EACEV,EAAS,IACX,IACI,6BACA,2BACN,OAAO,OAAO,KAAKU,CAAkB,EAAE,KAAK,GAAG,CAAC;AAAA,IAAA,IAKzCxB,EAAA,MAAMc,EAAS,IAAI,IAAIO;AAAA,EACtC,GASIH,IAAiB,CACrBJ,GACAW,GACAd,MACG;;AAQH,YANA,OAAO,OAAOX,EAAa,UAAUJ,EAAM,mBAAmB,CAAA,CAAE,GAEnDI,EAAA,SAASc,EAAS,IAAK,MAClChB,IAAAF,EAAM,oBAAN,gBAAAE,EAAwBgB,EAAS,UAAUA,EAAS,eAAe,IACrE3B,EAAa2B,EAAS,IAAK,IAAIA,EAAS,eAAe,IAE/CA,EAAS,MAAM;AAAA,MACrB,KAAKD,EAAa;AAAA,MAClB,KAAKA,EAAa;AAEhB,QAAIF,KACE,GAACK,IAAAF,EAAS,SAAT,QAAAE,EAAe,YAAW,MAAM,QAAQL,EAAc,OAAO,MAChEG,EAAS,KAAM,UAAUH,EAAc,QAAQ,IAAI,CAACe,OAAO;AAAA,UACzD,GAAGA;AAAA,UACH,OAAOA,EAAE;AAAA,UACT,OAAOA,EAAE;AAAA,QACT,EAAA,IAMND,EAASX,EAAS,IAAI,IAAIW,EAASX,EAAS,IAAI,KAAK,QACrD3B,EAAa2B,EAAS,IAAK,IAAIA,EAAS,eAAe;AAEvD;AAAA,MACF,KAAKD,EAAa;AAChB,QAAAY,EAASX,EAAS,IAAI,IAAI,OAAO,MAAM,OAAOW,EAASX,EAAS,IAAI,CAAC,CAAC,IAClE,IACA,OAAOW,EAASX,EAAS,IAAI,CAAC;AAClC;AAAA,MACF,KAAKD,EAAa;AAIhB,QAAAY,EAASX,EAAS,IAAI,IACpB,OAAOW,EAASX,EAAS,IAAI,KAAM,WAC/BW,EAASX,EAAS,IAAI,EAAE,MAAM,GAAG,EAAE,OAAO,CAACa,MAAcA,EAAE,MAAM,IACjE,MAAM,QAAQF,EAASX,EAAS,IAAI,CAAC,IACrCW,EAASX,EAAS,IAAI,IACtB,CAAA,GAEN3B,EAAa2B,EAAS,IAAK,IAAIA,EAAS,eAAe,CAAA;AACvD;AAAA,IACJ;AAAA,EAAA,GAOIc,IAAkB,CAACC,MAAyC;AAIhE,IAAA7B,EAAa,YAAY,IAClB,OAAA,KAAKb,CAAY,EAAE,QAAQ,CAAC2C,MAAM,OAAO3C,EAAa2C,CAAC,CAAC,GAEnDD,EAAA,QAAQ,CAACE,MAAS;AAE5B,MAAI,MAAM,QAAQA,EAAK,KAAK,IAErBA,EAAA,MACF,OAAO,CAACC,MAASA,EAAK,QAAQ,EAC9B,QAAQ,CAACA,MAAyB;AACjC,QAAAvB,EAAasB,GAAMC,CAAI;AAAA,MAAA,CACxB,IAECD,EAAK,MAAM,YAAuBtB,EAAAsB,GAAMA,EAAK,KAAK;AAAA,IACxD,CACD;AAAA,EAAA;AAMH,EAAA/B,EAAa,WAAW;AAAA;AAAA;AAAA;AAAA,IAKpBiC;AAAA,MACE,MAAMrC,EAAM;AAAA,MACZ,CAACsC,MAAQ;AACP,YAAIA,GAAK;AACP,cAAIL,IAAc,CAAA;AAClB,UAAAM;AAAA,YACE,OAAOD,KAAQ,YAAY,WAAWA;AAAA,YACtCrC;AAAA,UAAA,EACA,KAAK,CAACuC,MAAQ;AACd,YAAAP,IAAcO,KAAA,gBAAAA,EAAK,MAAM,QAEzBR,EAAgBC,CAAW;AAAA,UAAA,CAC5B;AAAA,QACH;AAAA,MACF;AAAA,MACA;AAAA,QACE,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACAI;AAAA,MACE,MAAMrC,EAAM;AAAA,MACZ,CAACsC,MAAQ;AAEP,eAAO,OAAOlC,EAAa,UAAUkC,KAAO,CAAE,CAAA;AAAA,MAChD;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACAD;AAAA,MACE,MAAMrC,EAAM;AAAA,MACZ,CAACsC,MAAQ;AACH,QAAAA,KAAOtC,EAAM,gBAAgB,OAI/BI,EAAa,YAAYkC,GAClB,OAAA,KAAK/C,CAAY,EAAE,QAAQ,CAAC2C,MAAM,OAAO3C,EAAa2C,CAAC,CAAC,GAElD9B,EAAA,UAAU,QAAQ,CAAC+B,MAAS;AACvC,UAAAZ,EAASY,CAAI,GAEEb,EAAAa,GAAM/B,EAAa,QAAQ;AAAA,QAAA,CAC3C;AAAA,MAEL;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAMF,QAAMqC,IAA2CC;AAAA,IAAS,MACxDtC,EAAa,UAAU;AAAA,MAAO,CAAC+B,MAC7B,OAAOA,EAAK,UAAY,OACnB,MAAM,QAAQA,EAAK,QAAQ,IACxBA,EAAK,SAAS,SAASnC,EAAM,YAAY,EAAE,IAC3CmC,EAAK,aAAanC,EAAM,aAC5B,CAACA,EAAM,YACP,CAACmC,EAAK,WACNA,EAAK,QAAQ/B,EAAa,UAAUJ,EAAM,QAAQ;AAAA,IACxD;AAAA,EAAA;AAGF,SAAA2C,EAAgB,MAAM;AAEpB,IAAAvC,EAAa,WAAW,QAAQ,CAAC+B,MAASA,EAAM,CAAA;AAAA,EAAA,CACjD,GAEM;AAAA,IACL,cAAA/B;AAAA,IACA,iBAAAqC;AAAA,IACA,WAAAnC;AAAA,IACA,iBAAA0B;AAAA,EAAA;AAEJ,GAEaY,IAAc,CACzB5C,GACA6B,GACAvB,GACA0B,MACG;AACH,QAAM,EAAE,OAAOa,EAAQ,IAAI1C,EAAmB;AAE9C,MAAI2C,IAAU;AA4GP,SAAA;AAAA,IACL,YAzGiB,CACjBC,IAAiB,CAAA,GACjBC,OAMA1C,EACG,MAAO,SACP,EAAA,KAAK,MAAM;;AACV,MAAIN,EAAM,SAINH,EAGEG,EAAM,MAAM,CAACiD,MAAS,CAAC,CAAC,OAAO,KAAKA,CAAK,EAAE,MAAM,IAG/CjD,EAAM,YACJE,IAAAF,EAAM,SAAN,QAAAE,EAAaF,EAAM,aACfoB,IAAApB,EAAA,SAAA,QAAAoB,EAAOpB,EAAM,UAAU;AAAA,QAC3B,GAAG+C;AAAA,QACH,GAAGlB,EAAS;AAAA,MAAA,GAEX,KAAK,CAACW,MAAQ;AACb,QAAIQ,KACQE,EAAA,QAAQF,EAAQ,kBAAkB,OAAO,GAE5CA,KAAA,QAAAA,EAAA,GAAG,WAAWR;AAAA,MAAG,GAE3B,MAAM,CAACW,MAAQ;AACd,QAAIH,KACQE,EAAA,MAAMF,EAAQ,gBAAgB,OAAO,GAExCA,KAAA,QAAAA,EAAA,GAAG,SAASG;AAAA,MAAG,KAEvB,QAAQ,MAAM,QAAQnD,EAAM,QAAQ,MAAM,IAEzC,QAAA;AAAA,QACN;AAAA,MAAA,KAIDqB,IAAArB,EAAA,SAAA,QAAAqB,EAAA,KAAArB,GAAO,EAAE,GAAG+C,GAAQ,GAAGlB,EAAS,SAChC,KAAK,CAACW,MAAQ;AACb,QAAIQ,KACQE,EAAA,QAAQF,EAAQ,kBAAkB,OAAO,GAE5CA,KAAA,QAAAA,EAAA,GAAG,WAAWR;AAAA,MAAG,GAE3B,MAAM,CAACW,MAAQ;AACd,QAAIH,KACQE,EAAA,MAAMF,EAAQ,gBAAgB,OAAO,GAExCA,KAAA,QAAAA,EAAA,GAAG,SAASG;AAAA,MAAG;AAAA,IAGhC,CACD,EACA,MAAM,MACE,EACR,GAEI7C,EAAU,MAAO;IAwCxB,WArCgB,MAAM;AACb,MAAAuB,EAAA,QAAQV,EAAU5B,CAAY;AAAA,IAAA;AAAA,IAqCvC,eA9BoB,CACpB6D,IAAkB,OAAOpD,EAAM,eAAgB,YAC3C,WACAA,EAAM,aACVC,MACG;;AAEG,YAAAoD,IAAWC,EAAgCF,GADlCnD,KAAgB4C,CACiC;AAE5D,OAAA3C,IAAAmD,EAAS,UAAT,QAAAnD,EAAgB,MAAM,UACR8B,GAAAZ,IAAAiC,EAAS,UAAT,gBAAAjC,EAAgB,MAAM,MAAiC;AAAA,IACzE;AAAA,IAoBA,oBAjByB,MAAM;;AACzB,YAAAT,KAAST,IAAAI,EAAU,UAAV,gBAAAJ,EAAiB,KAC1BU,IAAWD,KAAA,gBAAAA,EAAQ;AAEzB,UAAIC,KAAYD,GAAQ;AACtB,QAAAmC,IAAU,CAACA;AACX,cAAMS,IAAS5C,EAAO;AACtB,QAAAC,EAAS,MAAM,SAASkC,IAAU,GAAGS,CAAM,OAAO;AAAA,MACpD;AAEO,aAAAT;AAAA,IAAA;AAAA,IAQP,SACE5B,GACAW,GACA2B,GAMA;;AACO,aAAA;AAAA,QACL,UAAAtC;AAAA,QACA,UAAAW;AAAAA,QACA,OAAA2B;AAAA,QACA,UAAQtD,IAAAF,EAAM,aAAN,gBAAAE,EAAgB,WAAU;AAAA,MAAA;AAAA,IAEtC;AAAA,EAAA;AAEJ,GAMauD,IAAW,CAA0BzD,OAqBzC;AAAA,EACL,OAjBY,CACZ0D,MACGC,MACA;;AAED,IAAA9D;AAAA,MACEG,EAAM,SAAS;AAAA,MACf,CAAC4D,MAAS,QAAOA,KAAA,gBAAAA,EAAM,OAAM;AAAA,IAAA,OAG7BvC,KAAAD,KAAAlB,IAAAF,EAAM,SAAS,SAAf,gBAAAE,EAAqB,OAArB,gBAAAkB,EACAsC,OADA,QAAArC,EAAA,KAAAD,GAEE,EAAE,GAAGpB,EAAA,GAAS,GAAG2D;AAAA,EACvB;AAIA;"}