{"version":3,"file":"form-control.umd.cjs","sources":["../src/config.ts","../src/FormControlErrors.vue","../src/FormControl.vue","../src/FormControlLegacy.ts"],"sourcesContent":["const global = {};\n\nexport default function config(...args: any[]) {\n    // config() returns the global object.\n    if(!args.length) {\n        return global;\n    }\n    \n    // Destruct the key/value from the args.\n    const [ key, value ] = args;\n    \n    // config('key') returns value assigned to the key\n    if(typeof key === 'string') {\n        //@ts-ignore\n        return typeof global[key] !== 'undefined' ? global[key] : value;\n    }\n\n    // config(['a', 'b']) returns an object of key/value pairs\n    if(Array.isArray(key)) {\n        return key.reduce((carry, key) => {\n            return Object.assign(carry, {\n                //@ts-ignore\n                [key]: global[key]\n            });\n        }, {});\n    }\n\n    // config({a: 1}, {b: 2}) assigns the args and returns the global object.\n    return Object.assign(global, ...args);\n}","<script lang=\"ts\" setup>\nimport { isPlainObject } from 'lodash-es';\nimport { computed } from 'vue';\n\nconst props = defineProps<{\n    error?: Error|string,\n    errors: (Error|string)[]|Record<string,Error|string[]>,\n    name?: string,\n    id?: string\n}>();\n\nconst key = String(props?.id || props?.name);\n\nconst map = computed(() => {\n    // First check if an `error` prop was passed. This is a single error.\n    if(props.error) {\n        return new Map<string, (string|Error)[]>(\n            [[key, [props.error]]]\n        );\n    }\n\n    // Next check if props.errors is a plain object. \n    if(isPlainObject(props.errors)) {\n        return new Map<string, (string | Error)[]>(\n            Object.entries(props.errors)\n        );\n    }\n\n    // Finally check to see if an error of errors was passed.\n    if(Array.isArray(props.errors)) {\n        return new Map<string, (string | Error)[]>(\n            [[key, props.errors]]\n        );\n    }\n\n    return new Map();\n});\n</script>\n\n<template>\n    <slot\n        v-for=\"item of map.get(key)\"\n        v-bind=\"{ key, error: item }\" />\n</template>","<script lang=\"ts\">\nimport { Shadowable } from '@vue-interface/shadowable';\nimport { isNil, isObject, kebabCase } from 'lodash-es';\nimport { defineComponent, DirectiveBinding } from 'vue';\nimport config from './config';\nimport FormControlErrors from './FormControlErrors.vue';\nimport FormControlFeedback from './FormControlFeedback.vue';\n\nfunction prefix(key: string, value: any, delimeter = '-') {\n    const string = String(value).replace(new RegExp(`^${key}${delimeter}?`), '');\n\n    return [\n        kebabCase(string), key\n    ].filter(value => !!value).join(delimeter);\n}\n\nexport default defineComponent({\n    components: {\n        FormControlErrors,\n        FormControlFeedback\n    },\n    directives: {\n        bindEvents: {\n            created(el: HTMLElement, binding: DirectiveBinding) {\n                // @ts-ignore\n                binding.instance?.bindEvents?.(el);\n            }\n        }\n    },\n    mixins: [\n        Shadowable\n    ],\n    inheritAttrs: false,\n    props: {\n        /**\n         * Show type activity indicator.\n         */\n        activity: {\n            type: Boolean,\n            default: false\n        },\n        \n        /**\n         * Animate floating labels inside the input.\n         */\n        animated: {\n            type: Boolean,\n            default: () => config('animated', false)\n        },\n\n\n        /**\n         * An inline field validation error.\n         */\n        error: {\n            type: [String, Array, Boolean],\n            default: undefined\n        },\n\n        /**\n         * An inline field validation errors passed as object with key/value\n         * pairs. If errors passed as an object, the form name will be used for\n         * the key.\n         */\n        errors: {\n            type: [Array, Object, Boolean],\n            default: undefined\n        },\n\n        /**\n         * Some feedback to add to the field once the field is successfully\n         * valid.\n         */\n        feedback: {\n            type: [String, Array],\n            default: undefined\n        },\n\n        /**\n         * The primary class assigned to the form control.\n         */\n        formControlClass: {\n            type: [Array, Object, String],\n            default: () => config('controlClass', 'form-control')\n        },\n        \n        /**\n         * Add form-group wrapper to input.\n         */\n        group: {\n            type: Boolean,\n            default: () => config('group', true)\n        },\n        \n        /**\n         * Some instructions to appear under the field label.\n         */\n        helpText: {\n            type: [Number, String],\n            default: undefined\n        },\n        \n        /**\n         * The activity indicator type.\n         */\n        indicator: {\n            type: [Object, String, Boolean],\n            default: () => config('indicator', 'spinner')\n        },\n\n        /**\n         * The activity indicator size.\n         */\n        indicatorSize: {\n            type: String,\n            default: undefined\n        },\n\n        /**\n         * Force the input to be invalid.\n         */\n        invalid: Boolean,\n        \n        /**\n         * The value of label element. If no value, no label will appear.\n         */\n        label: {\n            type: [Number, String],\n            default: undefined\n        },\n        \n        /**\n         * The default label class assigned to the label element.\n         */\n        labelClass: {\n            type: [Object, String],\n            default: () => config('labelClass', 'form-label')\n        },\n\n        /**\n         * The model default value.\n         */\n        modelValue: {\n            type: [String, Number, Boolean, Array, Object],\n            default: () => undefined\n        },\n\n        /**\n         * Should the control look like plaintext.\n         */\n        plaintext: Boolean,\n\n        /**\n         * The size of the form control.\n         */\n        size: {\n            type: String,\n            default: undefined\n        },\n\n        /**\n         * Force the input to be valid.\n         */\n        valid: Boolean\n    },\n    emits: [\n        'focus',\n        'blur',\n        'change',\n        'click',\n        'keypress',\n        'keyup',\n        'keydown',\n        'progress',\n        'paste',\n        'update:modelValue'\n    ],\n    data() {\n        return {\n            currentValue: undefined,\n            hasChanged: false,\n            hasFocus: false,\n            isDirty: this,\n        };\n    },\n    computed: {\n        model: {\n            get() {\n                return this.getModelValue();\n            },\n            set(value: any) {\n                this.setModelValue(value);\n            }\n        },\n        id(): string|undefined {\n            return this.$attrs.id\n                || Math.random().toString(36).slice(2);\n        },\n        isEmpty() {\n            return isNil(this.model);\n        },\n        isInvalid() {\n            return !!(this.invalid || this.error || this.errors && (\n                Array.isArray(this.errors)\n                    ? this.errors.length\n                    : this.errors[this.$attrs.id || this.$attrs.name]\n            ));\n        },\n        isValid() {\n            return !!(this.valid || this.feedback);\n        },\n        componentName() {\n            return this.$options.name;\n        },\n        controlClass() {\n            return this.formControlClass;\n        },\n        controlAttributes() {\n            const attrs = Object.assign({}, this.$attrs, {\n                id: this.id,\n                class: this.controlClasses\n            });\n            \n            // Delete value from attrs because we dont want it to rebind\n            // the static attribute every time the computed re-renders.\n            // The currentValue is set from $attrs.value in created().\n            delete attrs.value;\n\n            return attrs;\n        },\n        controlClasses() {\n            return Object.assign({\n                [this.controlClass]: !!this.controlClass,\n                [this.controlSizeClass]: !!this.controlSizeClass,\n                [this.plaintextClass]: this.plaintext,\n                'form-control-icon': !!this.$slots.icon,\n                'is-valid': this.isValid,\n                'is-invalid': this.isInvalid,\n            }, this.shadowableClass);\n        },\n        controlSizeClass() {\n            return prefix(this.size, this.controlClass);\n        },\n        formGroupClasses() {\n            return Object.assign({\n                'animated': this.animated,\n                'form-group': this.group,\n                'has-activity': this.activity,\n                'has-changed': this.hasChanged,\n                'has-focus': this.hasFocus,\n                'has-icon': !!this.$slots.icon,\n                'is-dirty': this.isDirty,\n                'is-empty': this.isEmpty,\n                'is-invalid': this.isInvalid,\n                'is-valid': this.isValid,\n                [this.$attrs.class]: !!this.$attrs.class,\n                [this.size && prefix(this.size, 'form-group')]: !!this.size,\n                [this.size && prefix(this.size, this.componentName)]: !!this.size,\n            }, !!this.componentName && {\n                [kebabCase(this.componentName)]: true\n            });\n        },\n        plaintextClass() {\n            return 'form-control-plaintext';\n        }\n    },\n    created() {\n        // Set the current value before checking the dirty status.\n        this.currentValue = this.$attrs.value;\n        this.isDirty = !isNil(this.model);\n    },\n    methods: {\n        bindEvents(el: HTMLElement) {\n            for(const event of this.$options.emits) {\n                el.addEventListener(event, (e: Event) => {\n                    this.$emit(event, e);\n                });\n            }\n\n            el.addEventListener('focus', () => {\n                this.isDirty = true;\n                this.hasFocus = true;\n            });\n\n            el.addEventListener('blur', () => {\n                this.hasFocus = false;\n            });\n        },\n        blur() {\n            this.$refs.field?.blur();\n        },\n        focus() {\n            this.$refs.field?.focus();\n        },\n        getFieldErrors() {\n            let errors = this.error || this.errors;\n\n            if(this.errors && !Array.isArray(this.errors)) {\n                errors = this.errors[this.$attrs.name || this.$attrs.id];\n            }\n\n            return !errors || Array.isArray(errors) || isObject(errors) ? errors : [errors];\n        },\n        getModelValue(): any {\n            if(this.modelValue === undefined) {\n                return this.currentValue;\n            }\n\n            return this.modelValue;\n        },\n        setModelValue(value: any): void {\n            this.hasChanged = true;\n            this.currentValue = value;\n            this.$emit('update:modelValue', value);\n        }\n    }\n});\n</script>","import { Shadowable } from '@vue-interface/shadowable';\nimport { kebabCase } from 'lodash-es';\nimport { defineComponent, DirectiveBinding } from 'vue';\nimport config from './config';\n\nfunction prefix(key: string, value: any, delimeter = '-') {\n    const string = String(value).replace(new RegExp(`^${key}${delimeter}?`), '');\n\n    return [\n        kebabCase(string), key\n    ].filter(value => !!value).join(delimeter);\n}\n\nfunction isObject(subject: any) {\n    return !Array.isArray(subject) && typeof subject === 'object';\n}\n\n// function isUndefined(value: any) {\n//     return value === undefined;\n// }\n\n\nexport default defineComponent({\n\n    directives: {\n        bindEvents: {\n            beforeMount(el: HTMLElement, binding: DirectiveBinding) {\n                // @ts-ignore\n                binding.instance?.bindEvents?.(el);\n            }\n        }\n    },\n\n    mixins: [\n        Shadowable\n    ],\n\n    inheritAttrs: false,\n\n    props: {\n\n        modelValue: {\n            default: undefined\n        },\n\n        /**\n         * Show type activity indicator.\n         */\n        activity: {\n            type: Boolean,\n            default: false\n        },\n\n        /**\n         * Animate floating labels inside the input.\n         */\n        animated: {\n            type: Boolean,\n            default: () => config('animated', false)\n        },\n\n        /**\n         * An array of event names that correlate with callback functions.\n         */\n        nativeEvents: {\n            type: Array,\n            default() {\n                return ['focus', 'blur', 'change', 'click', 'keypress', 'keyup', 'keydown', 'progress', 'paste'];\n            }\n        },\n\n        /**\n         * The default class name assigned to the control element.\n         */\n        defaultControlClass: {\n            type: String,\n            default: () => config('defaultControlClass', 'form-control')\n        },\n\n        /**\n         * An inline field validation error.\n         */\n        error: {\n            type: [String, Array, Boolean],\n            default: undefined\n        },\n\n        /**\n         * An inline field validation errors passed as object with key/value\n         * pairs. If errors passed as an object, the form name will be used for\n         * the key.\n         */\n        errors: {\n            type: [Array, Object, Boolean],\n            default() {\n                return {};\n            }\n        },\n\n        /**\n         * Some feedback to add to the field once the field is successfully\n         * valid.\n         */\n        feedback: {\n            type: [String, Array],\n            default: undefined\n        },\n\n        /**\n         * Add form-group wrapper to input.\n         */\n        group: {\n            type: Boolean,\n            default: () => config('group', true)\n        },\n\n        /**\n         * Some instructions to appear under the field label.\n         */\n        helpText: {\n            type: [Number, String],\n            default: undefined\n        },\n\n        /**\n         * Hide the label for browsers, but leave it for screen readers.\n         */\n        hideLabel: Boolean,\n\n        /**\n         * The activity indicator type.\n         */\n        indicator: {\n            type: [String, Boolean],\n            default: () => config('indicator', 'spinner')\n        },\n\n        /**\n         * The activity indicator size.\n         */\n        indicatorSize: {\n            type: String,\n            default: undefined\n        },\n\n        /**\n         * Display the form field inline.\n         */\n        inline: Boolean,\n\n        /**\n         * The invalid property.\n         */\n        invalid: Boolean,\n\n        /**\n         * The value of label element. If no value, no label will appear.\n         */\n        label: {\n            type: [Number, String],\n            default: undefined\n        },\n\n        /**\n         * The default label class assigned to the label element.\n         */\n        labelClass: {\n            type: [Object, String],\n            default: () => config('labelClass', 'form-label')\n        },\n\n        /**\n         * Should the control look like a pill.\n         */\n        pill: Boolean,\n\n        /**\n         * Should the control look like plaintext.\n         */\n        plaintext: Boolean,\n\n        /**\n         * The size of the form control.\n         */\n        size: {\n            type: String,\n            default: undefined\n        },\n\n        /**\n         * Additional margin/padding classes for fine control of spacing.\n         */\n        spacing: {\n            type: String,\n            default: undefined\n        },\n\n        /**\n         * The valid property.\n         */\n        valid: Boolean\n\n    },\n\n    emits: [\n        'blur',\n        'change',\n        'click',\n        'focus',\n        'keydown',\n        'keypress',\n        'keyup',\n        'update:modelValue'\n    ],\n\n    data() {\n        return {\n            defaultEmpty: false,\n            hasChanged: false,\n            hasFocus: false,\n            isEmpty: true,\n        };\n    },\n\n    computed: {\n\n        id() {\n            return this.$attrs.id || this.$attrs.name || (Math.random() + 1).toString(36).substring(7);\n        },\n\n        componentName() {\n            return this.$options.name;\n        },\n\n        controlAttributes() {\n            return Object.fromEntries(\n                Object.entries(this.$attrs).concat([\n                    ['id', this.id],\n                    ['class', this.controlClasses],\n                    ['value', this.modelValue]\n                ])\n            );\n        },\n\n        controlClass() {\n            return this.defaultControlClass;\n        },\n\n        controlSizeClass() {\n            return prefix(this.size, this.controlClass);\n        },\n\n        formGroupClasses() {\n            return Object.assign({\n                [this.size && prefix(this.size, this.componentName)]: !!this.size,\n                'animated': this.animated,\n                'default-empty': this.defaultEmpty,\n                'form-group': this.group,\n                [this.size && prefix(this.size, 'form-group')]: !!this.size,\n                'has-activity': this.activity,\n                'has-changed': this.hasChanged,\n                'has-focus': this.hasFocus,\n                'has-icon': !!this.$slots.icon,\n                'is-empty': this.isEmpty,\n                'is-invalid': !!(this.invalid || this.invalidFeedback),\n                'is-valid': !!(this.valid || this.validFeedback),\n                [this.$attrs.class]: !!this.$attrs.class,\n                [this.$attrs.id]: !!this.$attrs.id\n            }, !!this.componentName && {\n                [kebabCase(this.componentName)]: true\n            });\n        },\n\n        controlClasses() {\n            return Object.assign({\n                [this.controlClass]: !!this.controlClass,\n                [this.controlSizeClass]: !!this.controlSizeClass,\n                'form-control-icon': !!this.$slots.icon,\n                'is-valid': !!(this.valid || this.validFeedback),\n                'is-invalid': !!(this.invalid || this.invalidFeedback),\n                [this.pillClasses]: this.pill,\n                [this.plaintextClass]: this.plaintext,\n                [this.spacing]: !!this.spacing,\n            }, this.shadowableClass);\n        },\n\n        hasDefaultSlot() {\n            return !!this.$slots.default;\n        },\n\n        invalidFeedback() {\n            if(this.error === '') {\n                return null;\n            }\n\n            if(this.error) {\n                return this.error;\n            }\n\n            const errors = this.getFieldErrors();\n\n            return Array.isArray(errors) ? errors.filter(error => {\n                return error && typeof error === 'string';\n            }).join('<br>') : errors;\n        },\n\n        pillClasses() {\n            return 'rounded rounded-pill';\n        },\n\n        plaintextClass() {\n            return 'form-control-plaintext';\n        },\n\n        validFeedback() {\n            return Array.isArray(this.feedback) ? this.feedback.join('<br>') : this.feedback;\n        }\n\n    },\n\n    watch: {\n        hasFocus() {\n            if(this.shouldChangeOnFocus()) {\n                this.hasChanged = true;\n            }\n        },\n        defaultEmpty() {\n            this.hasChanged = true;\n        }\n    },\n\n    methods: {\n\n        bindEvents(el: HTMLOptionElement | HTMLSelectElement, fn: Function) {\n            // If no function is defined, the use the default onInput callback.\n            if(!fn) {\n                fn = this.onInput;\n            }\n\n            // Get the option from the selected index.\n            const selected = el instanceof HTMLSelectElement\n                ? el.querySelectorAll('option')?.[el.selectedIndex]\n                : null;\n\n            // // Set the element value is the modelValue is not undefined.\n            // if(!isUndefined(this.modelValue)) {\n            //     el.value = this.modelValue;\n            // }\n\n            // If an option is selected, force the default value.\n            if(selected) {\n                el.value = selected?.value;\n            }\n\n            // If the el has a value, trigger the model update.\n            if(el.value) {\n                fn(el.value);\n            }\n\n            // Set the default has changed value\n            this.hasChanged = !!el.value;\n\n            // Set the default has changed value\n            this.isEmpty = !el.value;\n\n            // Add the has-focus class from the form control\n            el.addEventListener('focus', () => {\n                this.hasFocus = true;\n            });\n\n            // Remove the has-focus class from the form control\n            el.addEventListener('blur', () => {\n                this.hasFocus = false;\n            });\n\n            // Watch for input changes.\n            el.addEventListener('input', () => {\n                this.isEmpty = false;\n                this.hasChanged = true;\n            });\n\n            // Trigger the onInput method.\n            el.addEventListener(\n                el.tagName === 'SELECT' ? 'change' : 'input', () => fn(el.value)\n            );\n\n            // Bubble the native events up to the vue component.\n            this.nativeEvents.forEach((name: string) => {\n                el.addEventListener(name, event => {\n                    this.$emit(name, event);\n                });\n            });\n        },\n\n        blur() {\n            if(this.getInputField()) {\n                this.getInputField().blur();\n            }\n        },\n\n        focus() {\n            if(this.getInputField()) {\n                this.getInputField().focus();\n            }\n        },\n\n        getInputField() {\n            return this.$el.querySelector(\n                '.form-control, input, select, textarea'\n            );\n        },\n\n        getFieldErrors() {\n            let errors = this.error || this.errors;\n\n            if(this.errors && isObject(this.errors)) {\n                errors = this.errors[this.$attrs.name || this.$attrs.id];\n            }\n\n            return !errors || Array.isArray(errors) || isObject(errors) ? errors : [errors];\n        },\n\n        shouldChangeOnFocus() {\n            return !this.getInputField().readOnly;\n        },\n\n        onInput(value: any) {\n            this.$emit('update:modelValue', value);\n        }\n\n    }\n\n});"],"names":["global","config","args","key","value","carry","props","map","computed","isPlainObject","prefix","delimeter","string","kebabCase","_sfc_main","defineComponent","FormControlErrors","FormControlFeedback","el","binding","_b","_a","Shadowable","isNil","attrs","event","e","errors","isObject","subject","FormControlLegacy","error","fn","selected","name"],"mappings":"0YAAA,MAAMA,EAAS,CAAA,EAEf,SAAwBC,KAAUC,EAAa,CAExC,GAAA,CAACA,EAAK,OACE,OAAAF,EAIL,KAAA,CAAEG,EAAKC,CAAM,EAAIF,EAGpB,OAAA,OAAOC,GAAQ,SAEP,OAAOH,EAAOG,CAAG,EAAM,IAAcH,EAAOG,CAAG,EAAIC,EAI3D,MAAM,QAAQD,CAAG,EACTA,EAAI,OAAO,CAACE,EAAOF,IACf,OAAO,OAAOE,EAAO,CAExB,CAACF,CAAG,EAAGH,EAAOG,CAAG,CAAA,CACpB,EACF,CAAE,CAAA,EAIF,OAAO,OAAOH,EAAQ,GAAGE,CAAI,CACxC,2HClBMC,EAAM,QAAOG,GAAA,YAAAA,EAAO,MAAMA,GAAA,YAAAA,EAAO,KAAI,EAErCC,EAAMC,EAAAA,SAAS,IAEdF,EAAM,MACM,IAAA,IACP,CAAC,CAACH,EAAK,CAACG,EAAM,KAAK,CAAC,CAAC,CAAA,EAK1BG,EAAA,cAAcH,EAAM,MAAM,EAClB,IAAI,IACP,OAAO,QAAQA,EAAM,MAAM,CAAA,EAKhC,MAAM,QAAQA,EAAM,MAAM,EACd,IAAA,IACP,CAAC,CAACH,EAAKG,EAAM,MAAM,CAAC,CAAA,MAIjB,GACd,sfC5BD,SAASI,EAAOP,EAAaC,EAAYO,EAAY,IAAK,CAChD,MAAAC,EAAS,OAAOR,CAAK,EAAE,QAAQ,IAAI,OAAO,IAAID,IAAMQ,IAAY,EAAG,EAAE,EAEpE,MAAA,CACHE,EAAAA,UAAUD,CAAM,EAAGT,CAAA,EACrB,OAAOC,GAAS,CAAC,CAACA,CAAK,EAAE,KAAKO,CAAS,CAC7C,CAEA,MAAAG,EAAeC,kBAAgB,CAC3B,WAAY,CAAA,kBACRC,EAAA,oBACAC,CACJ,EACA,WAAY,CACR,WAAY,CACR,QAAQC,EAAiBC,EAA2B,UAExCC,GAAAC,EAAAF,EAAA,WAAA,YAAAE,EAAU,aAAV,MAAAD,EAAA,KAAAC,EAAuBH,EACnC,CACJ,CACJ,EACA,OAAQ,CACJI,EAAA,UACJ,EACA,aAAc,GACd,MAAO,CAIH,SAAU,CACN,KAAM,QACN,QAAS,EACb,EAKA,SAAU,CACN,KAAM,QACN,QAAS,IAAMrB,EAAO,WAAY,EAAK,CAC3C,EAMA,MAAO,CACH,KAAM,CAAC,OAAQ,MAAO,OAAO,EAC7B,QAAS,MACb,EAOA,OAAQ,CACJ,KAAM,CAAC,MAAO,OAAQ,OAAO,EAC7B,QAAS,MACb,EAMA,SAAU,CACN,KAAM,CAAC,OAAQ,KAAK,EACpB,QAAS,MACb,EAKA,iBAAkB,CACd,KAAM,CAAC,MAAO,OAAQ,MAAM,EAC5B,QAAS,IAAMA,EAAO,eAAgB,cAAc,CACxD,EAKA,MAAO,CACH,KAAM,QACN,QAAS,IAAMA,EAAO,QAAS,EAAI,CACvC,EAKA,SAAU,CACN,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,MACb,EAKA,UAAW,CACP,KAAM,CAAC,OAAQ,OAAQ,OAAO,EAC9B,QAAS,IAAMA,EAAO,YAAa,SAAS,CAChD,EAKA,cAAe,CACX,KAAM,OACN,QAAS,MACb,EAKA,QAAS,QAKT,MAAO,CACH,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,MACb,EAKA,WAAY,CACR,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,IAAMA,EAAO,aAAc,YAAY,CACpD,EAKA,WAAY,CACR,KAAM,CAAC,OAAQ,OAAQ,QAAS,MAAO,MAAM,EAC7C,QAAS,IAAM,EACnB,EAKA,UAAW,QAKX,KAAM,CACF,KAAM,OACN,QAAS,MACb,EAKA,MAAO,OACX,EACA,MAAO,CACH,QACA,OACA,SACA,QACA,WACA,QACA,UACA,WACA,QACA,mBACJ,EACA,MAAO,CACI,MAAA,CACH,aAAc,OACd,WAAY,GACZ,SAAU,GACV,QAAS,IAAA,CAEjB,EACA,SAAU,CACN,MAAO,CACH,KAAM,CACF,OAAO,KAAK,eAChB,EACA,IAAIG,EAAY,CACZ,KAAK,cAAcA,CAAK,CAC5B,CACJ,EACA,IAAuB,CACZ,OAAA,KAAK,OAAO,IACZ,KAAK,SAAS,SAAS,EAAE,EAAE,MAAM,CAAC,CAC7C,EACA,SAAU,CACC,OAAAmB,EAAA,MAAM,KAAK,KAAK,CAC3B,EACA,WAAY,CACD,MAAA,CAAC,EAAE,KAAK,SAAW,KAAK,OAAS,KAAK,SACzC,MAAM,QAAQ,KAAK,MAAM,EACnB,KAAK,OAAO,OACZ,KAAK,OAAO,KAAK,OAAO,IAAM,KAAK,OAAO,IAAI,GAE5D,EACA,SAAU,CACN,MAAO,CAAC,EAAE,KAAK,OAAS,KAAK,SACjC,EACA,eAAgB,CACZ,OAAO,KAAK,SAAS,IACzB,EACA,cAAe,CACX,OAAO,KAAK,gBAChB,EACA,mBAAoB,CAChB,MAAMC,EAAQ,OAAO,OAAO,CAAA,EAAI,KAAK,OAAQ,CACzC,GAAI,KAAK,GACT,MAAO,KAAK,cAAA,CACf,EAKD,cAAOA,EAAM,MAENA,CACX,EACA,gBAAiB,CACb,OAAO,OAAO,OAAO,CACjB,CAAC,KAAK,YAAY,EAAG,CAAC,CAAC,KAAK,aAC5B,CAAC,KAAK,gBAAgB,EAAG,CAAC,CAAC,KAAK,iBAChC,CAAC,KAAK,cAAc,EAAG,KAAK,UAC5B,oBAAqB,CAAC,CAAC,KAAK,OAAO,KACnC,WAAY,KAAK,QACjB,aAAc,KAAK,SAAA,EACpB,KAAK,eAAe,CAC3B,EACA,kBAAmB,CACf,OAAOd,EAAO,KAAK,KAAM,KAAK,YAAY,CAC9C,EACA,kBAAmB,CACf,OAAO,OAAO,OAAO,CACjB,SAAY,KAAK,SACjB,aAAc,KAAK,MACnB,eAAgB,KAAK,SACrB,cAAe,KAAK,WACpB,YAAa,KAAK,SAClB,WAAY,CAAC,CAAC,KAAK,OAAO,KAC1B,WAAY,KAAK,QACjB,WAAY,KAAK,QACjB,aAAc,KAAK,UACnB,WAAY,KAAK,QACjB,CAAC,KAAK,OAAO,KAAK,EAAG,CAAC,CAAC,KAAK,OAAO,MACnC,CAAC,KAAK,MAAQA,EAAO,KAAK,KAAM,YAAY,CAAC,EAAG,CAAC,CAAC,KAAK,KACvD,CAAC,KAAK,MAAQA,EAAO,KAAK,KAAM,KAAK,aAAa,CAAC,EAAG,CAAC,CAAC,KAAK,IAAA,EAC9D,CAAC,CAAC,KAAK,eAAiB,CACvB,CAACG,YAAU,KAAK,aAAa,CAAC,EAAG,EAAA,CACpC,CACL,EACA,gBAAiB,CACN,MAAA,wBACX,CACJ,EACA,SAAU,CAED,KAAA,aAAe,KAAK,OAAO,MAChC,KAAK,QAAU,CAACU,EAAM,MAAA,KAAK,KAAK,CACpC,EACA,QAAS,CACL,WAAWL,EAAiB,CACd,UAAAO,KAAS,KAAK,SAAS,MAC1BP,EAAA,iBAAiBO,EAAQC,GAAa,CAChC,KAAA,MAAMD,EAAOC,CAAC,CAAA,CACtB,EAGFR,EAAA,iBAAiB,QAAS,IAAM,CAC/B,KAAK,QAAU,GACf,KAAK,SAAW,EAAA,CACnB,EAEEA,EAAA,iBAAiB,OAAQ,IAAM,CAC9B,KAAK,SAAW,EAAA,CACnB,CACL,EACA,MAAO,QACEG,EAAA,KAAA,MAAM,QAAN,MAAAA,EAAa,MACtB,EACA,OAAQ,QACCA,EAAA,KAAA,MAAM,QAAN,MAAAA,EAAa,OACtB,EACA,gBAAiB,CACT,IAAAM,EAAS,KAAK,OAAS,KAAK,OAEhC,OAAG,KAAK,QAAU,CAAC,MAAM,QAAQ,KAAK,MAAM,IACxCA,EAAS,KAAK,OAAO,KAAK,OAAO,MAAQ,KAAK,OAAO,EAAE,GAGpD,CAACA,GAAU,MAAM,QAAQA,CAAM,GAAKC,EAAA,SAASD,CAAM,EAAIA,EAAS,CAACA,CAAM,CAClF,EACA,eAAqB,CACd,OAAA,KAAK,aAAe,OACZ,KAAK,aAGT,KAAK,UAChB,EACA,cAAcvB,EAAkB,CAC5B,KAAK,WAAa,GAClB,KAAK,aAAeA,EACf,KAAA,MAAM,oBAAqBA,CAAK,CACzC,CACJ,CACJ,CAAC,ECvTD,SAASM,EAAOP,EAAaC,EAAYO,EAAY,IAAK,CAChD,MAAAC,EAAS,OAAOR,CAAK,EAAE,QAAQ,IAAI,OAAO,IAAID,IAAMQ,IAAY,EAAG,EAAE,EAEpE,MAAA,CACHE,EAAAA,UAAUD,CAAM,EAAGT,CAAA,EACrB,OAAOC,GAAS,CAAC,CAACA,CAAK,EAAE,KAAKO,CAAS,CAC7C,CAEA,SAASiB,EAASC,EAAc,CAC5B,MAAO,CAAC,MAAM,QAAQA,CAAO,GAAK,OAAOA,GAAY,QACzD,CAOA,MAAAC,EAAef,kBAAgB,CAE3B,WAAY,CACR,WAAY,CACR,YAAYG,EAAiBC,EAA2B,UAE5CC,GAAAC,EAAAF,EAAA,WAAA,YAAAE,EAAU,aAAV,MAAAD,EAAA,KAAAC,EAAuBH,EACnC,CACJ,CACJ,EAEA,OAAQ,CACJI,EAAA,UACJ,EAEA,aAAc,GAEd,MAAO,CAEH,WAAY,CACR,QAAS,MACb,EAKA,SAAU,CACN,KAAM,QACN,QAAS,EACb,EAKA,SAAU,CACN,KAAM,QACN,QAAS,IAAMrB,EAAO,WAAY,EAAK,CAC3C,EAKA,aAAc,CACV,KAAM,MACN,SAAU,CACC,MAAA,CAAC,QAAS,OAAQ,SAAU,QAAS,WAAY,QAAS,UAAW,WAAY,OAAO,CACnG,CACJ,EAKA,oBAAqB,CACjB,KAAM,OACN,QAAS,IAAMA,EAAO,sBAAuB,cAAc,CAC/D,EAKA,MAAO,CACH,KAAM,CAAC,OAAQ,MAAO,OAAO,EAC7B,QAAS,MACb,EAOA,OAAQ,CACJ,KAAM,CAAC,MAAO,OAAQ,OAAO,EAC7B,SAAU,CACN,MAAO,EACX,CACJ,EAMA,SAAU,CACN,KAAM,CAAC,OAAQ,KAAK,EACpB,QAAS,MACb,EAKA,MAAO,CACH,KAAM,QACN,QAAS,IAAMA,EAAO,QAAS,EAAI,CACvC,EAKA,SAAU,CACN,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,MACb,EAKA,UAAW,QAKX,UAAW,CACP,KAAM,CAAC,OAAQ,OAAO,EACtB,QAAS,IAAMA,EAAO,YAAa,SAAS,CAChD,EAKA,cAAe,CACX,KAAM,OACN,QAAS,MACb,EAKA,OAAQ,QAKR,QAAS,QAKT,MAAO,CACH,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,MACb,EAKA,WAAY,CACR,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,IAAMA,EAAO,aAAc,YAAY,CACpD,EAKA,KAAM,QAKN,UAAW,QAKX,KAAM,CACF,KAAM,OACN,QAAS,MACb,EAKA,QAAS,CACL,KAAM,OACN,QAAS,MACb,EAKA,MAAO,OAEX,EAEA,MAAO,CACH,OACA,SACA,QACA,QACA,UACA,WACA,QACA,mBACJ,EAEA,MAAO,CACI,MAAA,CACH,aAAc,GACd,WAAY,GACZ,SAAU,GACV,QAAS,EAAA,CAEjB,EAEA,SAAU,CAEN,IAAK,CACD,OAAO,KAAK,OAAO,IAAM,KAAK,OAAO,OAAS,KAAK,OAAO,EAAI,GAAG,SAAS,EAAE,EAAE,UAAU,CAAC,CAC7F,EAEA,eAAgB,CACZ,OAAO,KAAK,SAAS,IACzB,EAEA,mBAAoB,CAChB,OAAO,OAAO,YACV,OAAO,QAAQ,KAAK,MAAM,EAAE,OAAO,CAC/B,CAAC,KAAM,KAAK,EAAE,EACd,CAAC,QAAS,KAAK,cAAc,EAC7B,CAAC,QAAS,KAAK,UAAU,CAAA,CAC5B,CAAA,CAET,EAEA,cAAe,CACX,OAAO,KAAK,mBAChB,EAEA,kBAAmB,CACf,OAAOS,EAAO,KAAK,KAAM,KAAK,YAAY,CAC9C,EAEA,kBAAmB,CACf,OAAO,OAAO,OAAO,CACjB,CAAC,KAAK,MAAQA,EAAO,KAAK,KAAM,KAAK,aAAa,CAAC,EAAG,CAAC,CAAC,KAAK,KAC7D,SAAY,KAAK,SACjB,gBAAiB,KAAK,aACtB,aAAc,KAAK,MACnB,CAAC,KAAK,MAAQA,EAAO,KAAK,KAAM,YAAY,CAAC,EAAG,CAAC,CAAC,KAAK,KACvD,eAAgB,KAAK,SACrB,cAAe,KAAK,WACpB,YAAa,KAAK,SAClB,WAAY,CAAC,CAAC,KAAK,OAAO,KAC1B,WAAY,KAAK,QACjB,aAAc,CAAC,EAAE,KAAK,SAAW,KAAK,iBACtC,WAAY,CAAC,EAAE,KAAK,OAAS,KAAK,eAClC,CAAC,KAAK,OAAO,KAAK,EAAG,CAAC,CAAC,KAAK,OAAO,MACnC,CAAC,KAAK,OAAO,EAAE,EAAG,CAAC,CAAC,KAAK,OAAO,EAAA,EACjC,CAAC,CAAC,KAAK,eAAiB,CACvB,CAACG,YAAU,KAAK,aAAa,CAAC,EAAG,EAAA,CACpC,CACL,EAEA,gBAAiB,CACb,OAAO,OAAO,OAAO,CACjB,CAAC,KAAK,YAAY,EAAG,CAAC,CAAC,KAAK,aAC5B,CAAC,KAAK,gBAAgB,EAAG,CAAC,CAAC,KAAK,iBAChC,oBAAqB,CAAC,CAAC,KAAK,OAAO,KACnC,WAAY,CAAC,EAAE,KAAK,OAAS,KAAK,eAClC,aAAc,CAAC,EAAE,KAAK,SAAW,KAAK,iBACtC,CAAC,KAAK,WAAW,EAAG,KAAK,KACzB,CAAC,KAAK,cAAc,EAAG,KAAK,UAC5B,CAAC,KAAK,OAAO,EAAG,CAAC,CAAC,KAAK,OAAA,EACxB,KAAK,eAAe,CAC3B,EAEA,gBAAiB,CACN,MAAA,CAAC,CAAC,KAAK,OAAO,OACzB,EAEA,iBAAkB,CACX,GAAA,KAAK,QAAU,GACP,OAAA,KAGX,GAAG,KAAK,MACJ,OAAO,KAAK,MAGV,MAAAc,EAAS,KAAK,iBAEpB,OAAO,MAAM,QAAQA,CAAM,EAAIA,EAAO,OAAgBI,GAC3CA,GAAS,OAAOA,GAAU,QACpC,EAAE,KAAK,MAAM,EAAIJ,CACtB,EAEA,aAAc,CACH,MAAA,sBACX,EAEA,gBAAiB,CACN,MAAA,wBACX,EAEA,eAAgB,CACL,OAAA,MAAM,QAAQ,KAAK,QAAQ,EAAI,KAAK,SAAS,KAAK,MAAM,EAAI,KAAK,QAC5E,CAEJ,EAEA,MAAO,CACH,UAAW,CACJ,KAAK,wBACJ,KAAK,WAAa,GAE1B,EACA,cAAe,CACX,KAAK,WAAa,EACtB,CACJ,EAEA,QAAS,CAEL,WAAWT,EAA2Cc,EAAc,OAE5DA,IACAA,EAAK,KAAK,SAIR,MAAAC,EAAWf,aAAc,mBACzBG,EAAAH,EAAG,iBAAiB,QAAQ,IAA5B,YAAAG,EAAgCH,EAAG,eACnC,KAQHe,IACCf,EAAG,MAAQe,GAAA,YAAAA,EAAU,OAItBf,EAAG,OACFc,EAAGd,EAAG,KAAK,EAIV,KAAA,WAAa,CAAC,CAACA,EAAG,MAGlB,KAAA,QAAU,CAACA,EAAG,MAGhBA,EAAA,iBAAiB,QAAS,IAAM,CAC/B,KAAK,SAAW,EAAA,CACnB,EAGEA,EAAA,iBAAiB,OAAQ,IAAM,CAC9B,KAAK,SAAW,EAAA,CACnB,EAGEA,EAAA,iBAAiB,QAAS,IAAM,CAC/B,KAAK,QAAU,GACf,KAAK,WAAa,EAAA,CACrB,EAGEA,EAAA,iBACCA,EAAG,UAAY,SAAW,SAAW,QAAS,IAAMc,EAAGd,EAAG,KAAK,CAAA,EAI9D,KAAA,aAAa,QAASgB,GAAiB,CACrChB,EAAA,iBAAiBgB,EAAeT,GAAA,CAC1B,KAAA,MAAMS,EAAMT,CAAK,CAAA,CACzB,CAAA,CACJ,CACL,EAEA,MAAO,CACA,KAAK,iBACC,KAAA,gBAAgB,MAE7B,EAEA,OAAQ,CACD,KAAK,iBACC,KAAA,gBAAgB,OAE7B,EAEA,eAAgB,CACZ,OAAO,KAAK,IAAI,cACZ,wCAAA,CAER,EAEA,gBAAiB,CACT,IAAAE,EAAS,KAAK,OAAS,KAAK,OAEhC,OAAG,KAAK,QAAUC,EAAS,KAAK,MAAM,IAClCD,EAAS,KAAK,OAAO,KAAK,OAAO,MAAQ,KAAK,OAAO,EAAE,GAGpD,CAACA,GAAU,MAAM,QAAQA,CAAM,GAAKC,EAASD,CAAM,EAAIA,EAAS,CAACA,CAAM,CAClF,EAEA,qBAAsB,CACX,MAAA,CAAC,KAAK,cAAgB,EAAA,QACjC,EAEA,QAAQvB,EAAY,CACX,KAAA,MAAM,oBAAqBA,CAAK,CACzC,CAEJ,CAEJ,CAAC"}