UNPKG

@extclp/vexip-ui

Version:

A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good

1 lines 30.4 kB
{"version":3,"file":"carousel.vue2.mjs","sources":["../../../components/carousel/carousel.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { Icon } from '@/components/icon'\r\nimport { Renderer } from '@/components/renderer'\r\nimport { ResizeObserver } from '@/components/resize-observer'\r\n\r\nimport { computed, onMounted, provide, reactive, ref, toRef, watch } from 'vue'\r\n\r\nimport { emitEvent, useHoverDelay, useIcons, useNameHelper, useProps } from '@vexip-ui/config'\r\nimport { useHover, useRtl, useSetTimeout } from '@vexip-ui/hooks'\r\nimport { debounceMinor } from '@vexip-ui/utils'\r\nimport { carouselProps } from './props'\r\nimport { CAROUSEL_STATE } from './symbol'\r\n\r\nimport type { CarouselSlots, CarouselState, ItemState } from './symbol'\r\n\r\ndefineOptions({ name: 'Carousel' })\r\n\r\nconst _props = defineProps(carouselProps)\r\nconst props = useProps('carousel', _props, {\r\n active: {\r\n default: 0,\r\n static: true,\r\n },\r\n viewSize: {\r\n default: 3,\r\n validator: value => value > 0,\r\n },\r\n vertical: false,\r\n disabled: false,\r\n loop: false,\r\n arrow: {\r\n default: 'outside',\r\n validator: value => ['outside', 'inside', 'none'].includes(value),\r\n },\r\n arrowTrigger: {\r\n default: 'hover',\r\n validator: value => ['hover', 'always'].includes(value),\r\n },\r\n autoplay: {\r\n default: false,\r\n validator: value => (typeof value === 'number' ? value > 500 : true),\r\n },\r\n pointer: {\r\n default: 'none',\r\n validator: value => ['outside', 'inside', 'none'].includes(value),\r\n },\r\n speed: 300,\r\n activeOffset: 0,\r\n height: null,\r\n ignoreHover: false,\r\n slots: () => ({}),\r\n})\r\n\r\nconst emit = defineEmits(['update:active'])\r\n\r\ndefineSlots<CarouselSlots>()\r\n\r\nconst nh = useNameHelper('carousel')\r\nconst icons = useIcons()\r\nconst hoverDelay = useHoverDelay()\r\nconst { isRtl } = useRtl()\r\nconst itemStates = ref(new Set<ItemState>())\r\nconst currentActive = ref(0)\r\nconst isLocked = ref(false) // 用于控制阻断快速连点\r\nconst arrowActive = ref(props.arrowTrigger === 'always')\r\n\r\nconst listRect = reactive({\r\n width: 0,\r\n height: 0,\r\n})\r\nconst trackRect = reactive({\r\n width: 0,\r\n height: 0,\r\n offset: 0,\r\n})\r\nconst itemRect = reactive({\r\n width: 0,\r\n height: 0,\r\n})\r\n\r\nconst { wrapper, isHover } = useHover()\r\n\r\nconst prev = ref<HTMLElement>()\r\nconst next = ref<HTMLElement>()\r\n\r\nconst isDisabled = computed(() => {\r\n return props.disabled || itemStates.value.size <= props.viewSize\r\n})\r\nconst className = computed(() => {\r\n return {\r\n [nh.b()]: true,\r\n [nh.bs('vars')]: true,\r\n [nh.bm('inherit')]: props.inherit,\r\n [nh.bm('vertical')]: props.vertical,\r\n [nh.bm('disabled')]: isDisabled.value,\r\n }\r\n})\r\nconst style = computed(() => {\r\n return {\r\n height:\r\n props.vertical && props.height\r\n ? `${props.height}${typeof props.height === 'number' ? 'px' : ''}`\r\n : undefined,\r\n }\r\n})\r\nconst listStyle = computed(() => {\r\n return {\r\n width: listRect.width ? `${listRect.width}px` : undefined,\r\n height: listRect.height ? `${listRect.height}px` : undefined,\r\n }\r\n})\r\nconst trackStyle = computed(() => {\r\n return {\r\n width: trackRect.width ? `${trackRect.width}px` : undefined,\r\n height: trackRect.height ? `${trackRect.height}px` : undefined,\r\n transform: trackRect.offset\r\n ? `translate${props.vertical ? 'Y' : 'X'}(${\r\n isRtl.value && !props.vertical ? `${-trackRect.offset}` : trackRect.offset\r\n }px) translateZ(0)`\r\n : undefined,\r\n transitionDuration: isLocked.value ? '0ms' : `${props.speed}ms`,\r\n }\r\n})\r\nconst disabledPrev = computed(() => {\r\n return isDisabled.value || (!props.loop && currentActive.value <= 0)\r\n})\r\nconst disabledNext = computed(() => {\r\n return (\r\n isDisabled.value ||\r\n (!props.loop && currentActive.value >= itemStates.value.size - props.viewSize)\r\n )\r\n})\r\nconst arrowIcons = computed(() => {\r\n return props.vertical\r\n ? [icons.value.angleUp, icons.value.angleDown]\r\n : isRtl.value\r\n ? [icons.value.angleRight, icons.value.angleLeft]\r\n : [icons.value.angleLeft, icons.value.angleRight]\r\n})\r\n\r\nwatch(\r\n () => props.active,\r\n value => {\r\n handleWheel(value - props.activeOffset)\r\n },\r\n)\r\nwatch(isHover, value => {\r\n if (props.ignoreHover) return\r\n\r\n if (value) {\r\n handleMouseEnter()\r\n } else {\r\n handleMouseLeave()\r\n }\r\n})\r\nwatch(() => props.viewSize, refresh)\r\nwatch(() => props.autoplay, setAutoplay)\r\n\r\nconst refreshLabels = debounceMinor(() => {\r\n Array.from(itemStates.value).forEach((item, index) => {\r\n item.label = index\r\n })\r\n})\r\nconst updateItemRect = debounceMinor(() => {\r\n itemStates.value.forEach(state => {\r\n state.width = itemRect.width\r\n state.height = itemRect.height\r\n })\r\n})\r\nconst updateListRect = debounceMinor(() => {\r\n trackRect.width = itemRect.width * itemStates.value.size\r\n trackRect.height = itemRect.height * itemStates.value.size\r\n})\r\n\r\nprovide<CarouselState>(\r\n CAROUSEL_STATE,\r\n reactive({\r\n vertical: toRef(props, 'vertical'),\r\n increaseItem,\r\n decreaseItem,\r\n isItemActive,\r\n handleSelect,\r\n }),\r\n)\r\n\r\n// 初始化时不使用过渡效果\r\nlet inTransition = false\r\nlet shouldReset = false\r\n\r\nisLocked.value = true\r\n\r\nonMounted(() => {\r\n computeItemRect()\r\n handleWheel(props.active - props.activeOffset)\r\n handleAfterMove()\r\n\r\n setTimeout(() => {\r\n isLocked.value = false\r\n inTransition = false\r\n\r\n setAutoplay()\r\n }, 0)\r\n})\r\n\r\ndefineExpose({\r\n itemStates,\r\n currentActive,\r\n arrowActive,\r\n wrapper,\r\n prev,\r\n next,\r\n refresh,\r\n})\r\n\r\nfunction increaseItem(item: ItemState) {\r\n itemStates.value.add(item)\r\n refreshLabels()\r\n updateItemRect()\r\n updateListRect()\r\n}\r\n\r\nfunction decreaseItem(item: ItemState) {\r\n itemStates.value.delete(item)\r\n refreshLabels()\r\n updateListRect()\r\n}\r\n\r\nfunction isItemActive(label: number) {\r\n return (currentActive.value + props.activeOffset) % itemStates.value.size === label\r\n}\r\n\r\nfunction computeItemRect() {\r\n if (!wrapper.value) return\r\n\r\n let prevFix = 0\r\n let nextFix = 0\r\n\r\n if (props.arrow === 'outside') {\r\n if (props.vertical) {\r\n prevFix = prev.value ? prev.value.offsetHeight : 0\r\n nextFix = next.value ? next.value.offsetHeight : 0\r\n } else {\r\n prevFix = prev.value ? prev.value.offsetWidth : 0\r\n nextFix = next.value ? next.value.offsetWidth : 0\r\n }\r\n }\r\n\r\n if (props.vertical) {\r\n listRect.width = 0\r\n listRect.height = wrapper.value.offsetHeight - prevFix - nextFix\r\n\r\n itemRect.width = 0\r\n itemRect.height = listRect.height / props.viewSize\r\n } else {\r\n listRect.width = wrapper.value.offsetWidth - prevFix - nextFix\r\n listRect.height = 0\r\n\r\n itemRect.width = listRect.width / props.viewSize\r\n itemRect.height = 0\r\n }\r\n}\r\n\r\nfunction refresh() {\r\n computeItemRect()\r\n updateItemRect()\r\n updateListRect()\r\n\r\n if (trackRect.offset > 0) {\r\n handlePrev(0)\r\n } else {\r\n handleNext(0)\r\n }\r\n\r\n setTimeout(() => {\r\n isLocked.value = false\r\n inTransition = false\r\n }, 0)\r\n}\r\n\r\nfunction emitChangeEvent() {\r\n const active = (currentActive.value + props.activeOffset) % itemStates.value.size\r\n\r\n emit('update:active', active)\r\n emitEvent(props.onChange, active)\r\n}\r\n\r\nfunction handlePrev(amount = 1) {\r\n if (isDisabled.value || inTransition) return\r\n\r\n const itemLength = props.vertical ? itemRect.height : itemRect.width\r\n const itemList = Array.from(itemStates.value)\r\n const itemCount = itemList.length\r\n const targetIndex = (currentActive.value - amount + itemCount) % itemCount\r\n const prevActive = currentActive.value\r\n\r\n if (targetIndex >= itemCount - props.viewSize) {\r\n if (!props.loop) return\r\n\r\n if (trackRect.offset < 0) {\r\n if (amount < currentActive.value) {\r\n trackRect.offset = -targetIndex * itemLength\r\n } else {\r\n trackRect.offset = itemLength * (itemCount - targetIndex)\r\n\r\n for (let i = targetIndex; i < itemCount; ++i) {\r\n itemList[i].offset = -itemCount * itemLength\r\n }\r\n }\r\n } else {\r\n for (let i = 0; i < itemCount; ++i) {\r\n itemList[i].offset =\r\n i < targetIndex\r\n ? 0\r\n : (isRtl.value && !props.vertical ? itemCount : -itemCount) * itemLength\r\n }\r\n\r\n trackRect.offset = itemLength * (itemCount - targetIndex)\r\n }\r\n\r\n currentActive.value = targetIndex\r\n } else {\r\n currentActive.value = targetIndex\r\n trackRect.offset = -currentActive.value * itemLength\r\n }\r\n\r\n shouldReset = currentActive.value <= itemCount - props.viewSize\r\n inTransition = true\r\n\r\n currentActive.value !== prevActive && emitChangeEvent()\r\n}\r\n\r\nfunction handleNext(amount = 1) {\r\n if (isDisabled.value || inTransition) return\r\n\r\n const itemLength = props.vertical ? itemRect.height : itemRect.width\r\n const itemList = Array.from(itemStates.value)\r\n const itemCount = itemList.length\r\n const targetIndex = currentActive.value + amount\r\n const prevActive = currentActive.value\r\n\r\n if (targetIndex > itemStates.value.size - props.viewSize) {\r\n if (!props.loop) return\r\n\r\n if (trackRect.offset > 0) {\r\n trackRect.offset = itemLength * (itemCount - targetIndex)\r\n } else {\r\n const anchorIndex = targetIndex + props.viewSize - itemCount\r\n\r\n for (let i = 0, len = itemList.length; i < len; ++i) {\r\n itemList[i].offset =\r\n i < anchorIndex\r\n ? (isRtl.value && !props.vertical ? -itemCount : itemCount) * itemLength\r\n : 0\r\n }\r\n\r\n trackRect.offset = -targetIndex * itemLength\r\n }\r\n\r\n currentActive.value = targetIndex % itemCount\r\n } else {\r\n currentActive.value = targetIndex\r\n trackRect.offset = -currentActive.value * itemLength\r\n }\r\n\r\n shouldReset = currentActive.value <= itemCount - props.viewSize\r\n inTransition = true\r\n\r\n currentActive.value !== prevActive && emitChangeEvent()\r\n}\r\n\r\nfunction handleWheel(active: number) {\r\n if (isDisabled.value || inTransition || active === currentActive.value) return\r\n\r\n const itemCount = itemStates.value.size\r\n\r\n active = (active % itemCount) + (active < 0 ? itemCount : 0)\r\n\r\n if (props.loop) {\r\n let forward: number\r\n let back: number\r\n\r\n if (active > currentActive.value) {\r\n forward = active - currentActive.value\r\n back = itemCount - active + currentActive.value\r\n } else {\r\n forward = itemCount - currentActive.value + active\r\n back = currentActive.value - active\r\n }\r\n\r\n if (forward < back) {\r\n handleNext(forward)\r\n } else if (forward > back) {\r\n handlePrev(back)\r\n } else {\r\n if (trackRect.offset > 0) {\r\n handlePrev(forward)\r\n } else {\r\n handleNext(forward)\r\n }\r\n }\r\n } else {\r\n if (active < currentActive.value) {\r\n handlePrev(currentActive.value - active)\r\n } else {\r\n handleNext(active - currentActive.value)\r\n }\r\n }\r\n}\r\n\r\nfunction handleAfterMove() {\r\n if (!shouldReset) {\r\n inTransition = false\r\n } else {\r\n itemStates.value.forEach(state => {\r\n state.offset = 0\r\n })\r\n\r\n shouldReset = false\r\n isLocked.value = true\r\n\r\n requestAnimationFrame(() => {\r\n trackRect.offset = -currentActive.value * (props.vertical ? itemRect.height : itemRect.width)\r\n\r\n requestAnimationFrame(() => {\r\n isLocked.value = false\r\n inTransition = false\r\n })\r\n })\r\n }\r\n}\r\n\r\nfunction handlePrevClick() {\r\n handlePrev(1)\r\n emitEvent(props.onPrev, (currentActive.value + props.activeOffset) % itemStates.value.size)\r\n}\r\n\r\nfunction handleNextClick() {\r\n handleNext(1)\r\n emitEvent(props.onNext, (currentActive.value + props.activeOffset) % itemStates.value.size)\r\n}\r\n\r\nfunction handleSelect(label: number) {\r\n emitEvent(props.onSelect, label)\r\n}\r\n\r\nconst { timer } = useSetTimeout()\r\n\r\nfunction setAutoplay() {\r\n clearInterval(timer.play)\r\n\r\n if (!props.autoplay) return\r\n\r\n let waiting = 4000\r\n\r\n if (typeof props.autoplay === 'number') {\r\n waiting = props.autoplay\r\n }\r\n\r\n timer.play = window.setInterval(() => {\r\n if (!props.loop && disabledNext.value) {\r\n handleWheel(0)\r\n } else {\r\n handleNext()\r\n }\r\n }, waiting)\r\n}\r\n\r\nfunction handleMouseEnter() {\r\n if (props.autoplay) {\r\n clearTimeout(timer.hover)\r\n\r\n timer.hover = setTimeout(() => {\r\n clearInterval(timer.play)\r\n }, hoverDelay.value)\r\n }\r\n\r\n if (props.arrowTrigger === 'hover' && props.arrow === 'inside') {\r\n arrowActive.value = true\r\n }\r\n}\r\n\r\nfunction handleMouseLeave() {\r\n if (props.autoplay) {\r\n clearTimeout(timer.hover)\r\n\r\n timer.hover = setTimeout(() => {\r\n setAutoplay()\r\n }, hoverDelay.value)\r\n }\r\n\r\n if (props.arrowTrigger === 'hover') {\r\n arrowActive.value = false\r\n }\r\n}\r\n\r\nfunction isPointerDisabled(index: number) {\r\n if (props.loop) return false\r\n\r\n return !(\r\n index >= props.activeOffset - 1 && index < itemStates.value.size - props.activeOffset - 1\r\n )\r\n}\r\n</script>\r\n\r\n<template>\r\n <div\r\n ref=\"wrapper\"\r\n :class=\"className\"\r\n role=\"list\"\r\n :style=\"style\"\r\n >\r\n <ResizeObserver @resize=\"refresh\">\r\n <div\r\n :style=\"{\r\n position: 'relative',\r\n display: 'flex',\r\n flexDirection: props.vertical ? 'column' : 'row',\r\n width: '100%'\r\n }\"\r\n >\r\n <div\r\n v-if=\"props.arrow !== 'none'\"\r\n ref=\"prev\"\r\n :class=\"[\r\n nh.bem('arrow', props.arrow),\r\n nh.bem('arrow', 'prev'),\r\n arrowActive ? nh.bem('arrow', 'show') : ''\r\n ]\"\r\n >\r\n <div\r\n :class=\"{\r\n [nh.be('handler')]: true,\r\n [nh.bem('handler', 'disabled')]: disabledPrev\r\n }\"\r\n @click=\"handlePrevClick\"\r\n >\r\n <slot name=\"prevArrow\" :disabled=\"disabledPrev\">\r\n <Renderer :renderer=\"props.slots.prevArrow\" :data=\"{ disabled: disabledPrev }\">\r\n <Icon v-bind=\"arrowIcons[0]\" :scale=\"+(arrowIcons[0].scale || 1) * 1.5\"></Icon>\r\n </Renderer>\r\n </slot>\r\n </div>\r\n </div>\r\n <div :class=\"nh.be('list')\" :style=\"listStyle\">\r\n <div :class=\"nh.be('track')\" :style=\"trackStyle\" @transitionend.self=\"handleAfterMove\">\r\n <slot> <Renderer :renderer=\"props.slots.default\"></Renderer>> </slot>\r\n </div>\r\n </div>\r\n <div\r\n v-if=\"props.arrow !== 'none'\"\r\n ref=\"next\"\r\n :class=\"[\r\n nh.bem('arrow', props.arrow),\r\n nh.bem('arrow', 'next'),\r\n arrowActive ? nh.bem('arrow', 'show') : ''\r\n ]\"\r\n >\r\n <div\r\n :class=\"{\r\n [nh.be('handler')]: true,\r\n [nh.bem('handler', 'disabled')]: disabledNext\r\n }\"\r\n @click=\"handleNextClick\"\r\n >\r\n <slot name=\"nextArrow\" :disabled=\"disabledNext\">\r\n <Renderer :renderer=\"props.slots.nextArrow\" :data=\"{ disabled: disabledNext }\">\r\n <Icon v-bind=\"arrowIcons[1]\" :scale=\"+(arrowIcons[1].scale || 1) * 1.5\"></Icon>\r\n </Renderer>\r\n </slot>\r\n </div>\r\n </div>\r\n </div>\r\n </ResizeObserver>\r\n <div v-if=\"props.pointer !== 'none'\" :class=\"nh.bem('pointers', props.pointer)\">\r\n <div\r\n v-for=\"index in itemStates.size\"\r\n :key=\"index\"\r\n :class=\"{\r\n [nh.be('pointer')]: true,\r\n [nh.bem('pointer', 'active')]:\r\n index - 1 === (currentActive + props.activeOffset) % itemStates.size,\r\n [nh.bem('pointer', 'disabled')]: isPointerDisabled(index - props.activeOffset - 1)\r\n }\"\r\n @click=\"handleWheel(index - props.activeOffset - 1)\"\r\n >\r\n <slot\r\n name=\"pointer\"\r\n :active=\"index - 1 === (currentActive + props.activeOffset) % itemStates.size\"\r\n >\r\n <Renderer\r\n :renderer=\"props.slots.pointer\"\r\n :data=\"{ active: index - 1 === (currentActive + props.activeOffset) % itemStates.size }\"\r\n >\r\n <span :class=\"nh.be('pointer-inner')\"></span>\r\n </Renderer>\r\n </slot>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n"],"names":["props","useProps","__props","value","emit","__emit","nh","useNameHelper","icons","useIcons","hoverDelay","useHoverDelay","isRtl","useRtl","itemStates","ref","currentActive","isLocked","arrowActive","listRect","reactive","trackRect","itemRect","wrapper","isHover","useHover","prev","next","isDisabled","computed","className","style","listStyle","trackStyle","disabledPrev","disabledNext","arrowIcons","watch","handleWheel","handleMouseEnter","handleMouseLeave","refresh","setAutoplay","refreshLabels","debounceMinor","item","index","updateItemRect","state","updateListRect","provide","CAROUSEL_STATE","toRef","increaseItem","decreaseItem","isItemActive","handleSelect","inTransition","shouldReset","onMounted","computeItemRect","handleAfterMove","__expose","label","prevFix","nextFix","handlePrev","handleNext","emitChangeEvent","active","emitEvent","amount","itemLength","itemList","itemCount","targetIndex","prevActive","i","anchorIndex","len","forward","back","handlePrevClick","handleNextClick","timer","useSetTimeout","waiting","isPointerDisabled","_createElementBlock","_createVNode","_unref","ResizeObserver","_createElementVNode","_normalizeStyle","_normalizeClass","_renderSlot","_ctx","Renderer","Icon","_mergeProps","_openBlock","_Fragment","_renderList"],"mappings":";;;;;;;;;;;;;;;;;;AAkBM,UAAAA,IAAQC,GAAS,YADRC,IAC4B;AAAA,MACzC,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,MACA,UAAU;AAAA,QACR,SAAS;AAAA,QACT,WAAW,OAASC,IAAQ;AAAA,MAC9B;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,OAAS,CAAC,WAAW,UAAU,MAAM,EAAE,SAASA,CAAK;AAAA,MAClE;AAAA,MACA,cAAc;AAAA,QACZ,SAAS;AAAA,QACT,WAAW,CAASA,MAAA,CAAC,SAAS,QAAQ,EAAE,SAASA,CAAK;AAAA,MACxD;AAAA,MACA,UAAU;AAAA,QACR,SAAS;AAAA,QACT,WAAW,CAAUA,MAAA,OAAOA,KAAU,WAAWA,IAAQ,MAAM;AAAA,MACjE;AAAA,MACA,SAAS;AAAA,QACP,SAAS;AAAA,QACT,WAAW,OAAS,CAAC,WAAW,UAAU,MAAM,EAAE,SAASA,CAAK;AAAA,MAClE;AAAA,MACA,OAAO;AAAA,MACP,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,OAAO,OAAO,CAAC;AAAA,IAAA,CAChB,GAEKC,KAAOC,IAIPC,IAAKC,GAAc,UAAU,GAC7BC,IAAQC,GAAS,GACjBC,IAAaC,GAAc,GAC3B,EAAE,OAAAC,EAAM,IAAIC,GAAO,GACnBC,IAAaC,EAAQ,oBAAA,KAAgB,GACrCC,IAAgBD,EAAI,CAAC,GACrBE,IAAWF,EAAI,EAAK,GACpBG,IAAcH,EAAIf,EAAM,iBAAiB,QAAQ,GAEjDmB,IAAWC,EAAS;AAAA,MACxB,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA,CACT,GACKC,IAAYD,EAAS;AAAA,MACzB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,IAAA,CACT,GACKE,IAAWF,EAAS;AAAA,MACxB,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA,CACT,GAEK,EAAE,SAAAG,GAAS,SAAAC,GAAQ,IAAIC,GAAS,GAEhCC,IAAOX,EAAiB,GACxBY,IAAOZ,EAAiB,GAExBa,IAAaC,EAAS,MACnB7B,EAAM,YAAYc,EAAW,MAAM,QAAQd,EAAM,QACzD,GACK8B,KAAYD,EAAS,OAClB;AAAA,MACL,CAACvB,EAAG,EAAE,CAAC,GAAG;AAAA,MACV,CAACA,EAAG,GAAG,MAAM,CAAC,GAAG;AAAA,MACjB,CAACA,EAAG,GAAG,SAAS,CAAC,GAAGN,EAAM;AAAA,MAC1B,CAACM,EAAG,GAAG,UAAU,CAAC,GAAGN,EAAM;AAAA,MAC3B,CAACM,EAAG,GAAG,UAAU,CAAC,GAAGsB,EAAW;AAAA,IAClC,EACD,GACKG,KAAQF,EAAS,OACd;AAAA,MACL,QACE7B,EAAM,YAAYA,EAAM,SACpB,GAAGA,EAAM,MAAM,GAAG,OAAOA,EAAM,UAAW,WAAW,OAAO,EAAE,KAC9D;AAAA,IACR,EACD,GACKgC,KAAYH,EAAS,OAClB;AAAA,MACL,OAAOV,EAAS,QAAQ,GAAGA,EAAS,KAAK,OAAO;AAAA,MAChD,QAAQA,EAAS,SAAS,GAAGA,EAAS,MAAM,OAAO;AAAA,IACrD,EACD,GACKc,KAAaJ,EAAS,OACnB;AAAA,MACL,OAAOR,EAAU,QAAQ,GAAGA,EAAU,KAAK,OAAO;AAAA,MAClD,QAAQA,EAAU,SAAS,GAAGA,EAAU,MAAM,OAAO;AAAA,MACrD,WAAWA,EAAU,SACjB,YAAYrB,EAAM,WAAW,MAAM,GAAG,IACtCY,EAAM,SAAS,CAACZ,EAAM,WAAW,GAAG,CAACqB,EAAU,MAAM,KAAKA,EAAU,MACtE,sBACE;AAAA,MACJ,oBAAoBJ,EAAS,QAAQ,QAAQ,GAAGjB,EAAM,KAAK;AAAA,IAC7D,EACD,GACKkC,IAAeL,EAAS,MACrBD,EAAW,SAAU,CAAC5B,EAAM,QAAQgB,EAAc,SAAS,CACnE,GACKmB,IAAeN,EAAS,MAE1BD,EAAW,SACV,CAAC5B,EAAM,QAAQgB,EAAc,SAASF,EAAW,MAAM,OAAOd,EAAM,QAExE,GACKoC,IAAaP,EAAS,MACnB7B,EAAM,WACT,CAACQ,EAAM,MAAM,SAASA,EAAM,MAAM,SAAS,IAC3CI,EAAM,QACJ,CAACJ,EAAM,MAAM,YAAYA,EAAM,MAAM,SAAS,IAC9C,CAACA,EAAM,MAAM,WAAWA,EAAM,MAAM,UAAU,CACrD;AAED,IAAA6B;AAAA,MACE,MAAMrC,EAAM;AAAA,MACZ,CAASG,MAAA;AACK,QAAAmC,EAAAnC,IAAQH,EAAM,YAAY;AAAA,MAAA;AAAA,IAE1C,GACAqC,EAAMb,IAAS,CAASrB,MAAA;AACtB,MAAIH,EAAM,gBAENG,IACeoC,GAAA,IAEAC,GAAA;AAAA,IACnB,CACD,GACKH,EAAA,MAAMrC,EAAM,UAAUyC,CAAO,GAC7BJ,EAAA,MAAMrC,EAAM,UAAU0C,CAAW;AAEjC,UAAAC,IAAgBC,EAAc,MAAM;AACxC,YAAM,KAAK9B,EAAW,KAAK,EAAE,QAAQ,CAAC+B,GAAMC,MAAU;AACpD,QAAAD,EAAK,QAAQC;AAAA,MAAA,CACd;AAAA,IAAA,CACF,GACKC,KAAiBH,EAAc,MAAM;AAC9B,MAAA9B,EAAA,MAAM,QAAQ,CAASkC,MAAA;AAChC,QAAAA,EAAM,QAAQ1B,EAAS,OACvB0B,EAAM,SAAS1B,EAAS;AAAA,MAAA,CACzB;AAAA,IAAA,CACF,GACK2B,IAAiBL,EAAc,MAAM;AACzC,MAAAvB,EAAU,QAAQC,EAAS,QAAQR,EAAW,MAAM,MACpDO,EAAU,SAASC,EAAS,SAASR,EAAW,MAAM;AAAA,IAAA,CACvD;AAED,IAAAoC;AAAA,MACEC;AAAA,MACA/B,EAAS;AAAA,QACP,UAAUgC,GAAMpD,GAAO,UAAU;AAAA,QACjC,cAAAqD;AAAA,QACA,cAAAC;AAAA,QACA,cAAAC;AAAA,QACA,cAAAC;AAAA,MACD,CAAA;AAAA,IACH;AAGA,QAAIC,IAAe,IACfC,IAAc;AAElB,IAAAzC,EAAS,QAAQ,IAEjB0C,GAAU,MAAM;AACE,MAAAC,GAAA,GACJtB,EAAAtC,EAAM,SAASA,EAAM,YAAY,GAC7B6D,GAAA,GAEhB,WAAW,MAAM;AACf,QAAA5C,EAAS,QAAQ,IACFwC,IAAA,IAEHf,EAAA;AAAA,SACX,CAAC;AAAA,IAAA,CACL,GAEYoB,GAAA;AAAA,MACX,YAAAhD;AAAA,MACA,eAAAE;AAAA,MACA,aAAAE;AAAA,MACA,SAAAK;AAAA,MACA,MAAAG;AAAA,MACA,MAAAC;AAAA,MACA,SAAAc;AAAA,IAAA,CACD;AAED,aAASY,GAAaR,GAAiB;AAC1B,MAAA/B,EAAA,MAAM,IAAI+B,CAAI,GACXF,EAAA,GACCI,GAAA,GACAE,EAAA;AAAA,IAAA;AAGjB,aAASK,GAAaT,GAAiB;AAC1B,MAAA/B,EAAA,MAAM,OAAO+B,CAAI,GACdF,EAAA,GACCM,EAAA;AAAA,IAAA;AAGjB,aAASM,GAAaQ,GAAe;AACnC,cAAQ/C,EAAc,QAAQhB,EAAM,gBAAgBc,EAAW,MAAM,SAASiD;AAAA,IAAA;AAGhF,aAASH,KAAkB;AACrB,UAAA,CAACrC,EAAQ,MAAO;AAEpB,UAAIyC,IAAU,GACVC,IAAU;AAEV,MAAAjE,EAAM,UAAU,cACdA,EAAM,YACRgE,IAAUtC,EAAK,QAAQA,EAAK,MAAM,eAAe,GACjDuC,IAAUtC,EAAK,QAAQA,EAAK,MAAM,eAAe,MAEjDqC,IAAUtC,EAAK,QAAQA,EAAK,MAAM,cAAc,GAChDuC,IAAUtC,EAAK,QAAQA,EAAK,MAAM,cAAc,KAIhD3B,EAAM,YACRmB,EAAS,QAAQ,GACjBA,EAAS,SAASI,EAAQ,MAAM,eAAeyC,IAAUC,GAEzD3C,EAAS,QAAQ,GACRA,EAAA,SAASH,EAAS,SAASnB,EAAM,aAE1CmB,EAAS,QAAQI,EAAQ,MAAM,cAAcyC,IAAUC,GACvD9C,EAAS,SAAS,GAETG,EAAA,QAAQH,EAAS,QAAQnB,EAAM,UACxCsB,EAAS,SAAS;AAAA,IACpB;AAGF,aAASmB,IAAU;AACD,MAAAmB,GAAA,GACDb,GAAA,GACAE,EAAA,GAEX5B,EAAU,SAAS,IACrB6C,EAAW,CAAC,IAEZC,EAAW,CAAC,GAGd,WAAW,MAAM;AACf,QAAAlD,EAAS,QAAQ,IACFwC,IAAA;AAAA,SACd,CAAC;AAAA,IAAA;AAGN,aAASW,KAAkB;AACzB,YAAMC,KAAUrD,EAAc,QAAQhB,EAAM,gBAAgBc,EAAW,MAAM;AAE7E,MAAAV,GAAK,iBAAiBiE,CAAM,GAClBC,EAAAtE,EAAM,UAAUqE,CAAM;AAAA,IAAA;AAGzB,aAAAH,EAAWK,IAAS,GAAG;AAC1B,UAAA3C,EAAW,SAAS6B,EAAc;AAEtC,YAAMe,IAAaxE,EAAM,WAAWsB,EAAS,SAASA,EAAS,OACzDmD,IAAW,MAAM,KAAK3D,EAAW,KAAK,GACtC4D,IAAYD,EAAS,QACrBE,KAAe3D,EAAc,QAAQuD,IAASG,KAAaA,GAC3DE,IAAa5D,EAAc;AAE7B,UAAA2D,KAAeD,IAAY1E,EAAM,UAAU;AACzC,YAAA,CAACA,EAAM,KAAM;AAEb,YAAAqB,EAAU,SAAS;AACjB,cAAAkD,IAASvD,EAAc;AACf,YAAAK,EAAA,SAAS,CAACsD,IAAcH;AAAA,eAC7B;AACK,YAAAnD,EAAA,SAASmD,KAAcE,IAAYC;AAE7C,qBAASE,IAAIF,GAAaE,IAAIH,GAAW,EAAEG;AACzC,cAAAJ,EAASI,CAAC,EAAE,SAAS,CAACH,IAAYF;AAAA,UACpC;AAAA,aAEG;AACL,mBAASK,IAAI,GAAGA,IAAIH,GAAW,EAAEG;AAC/B,YAAAJ,EAASI,CAAC,EAAE,SACVA,IAAIF,IACA,KACC/D,EAAM,SAAS,CAACZ,EAAM,WAAW0E,IAAY,CAACA,KAAaF;AAG1D,UAAAnD,EAAA,SAASmD,KAAcE,IAAYC;AAAA,QAAA;AAG/C,QAAA3D,EAAc,QAAQ2D;AAAA,MAAA;AAEtB,QAAA3D,EAAc,QAAQ2D,GACZtD,EAAA,SAAS,CAACL,EAAc,QAAQwD;AAG9B,MAAAd,IAAA1C,EAAc,SAAS0D,IAAY1E,EAAM,UACxCyD,IAAA,IAEDzC,EAAA,UAAU4D,KAAcR,GAAgB;AAAA,IAAA;AAG/C,aAAAD,EAAWI,IAAS,GAAG;AAC1B,UAAA3C,EAAW,SAAS6B,EAAc;AAEtC,YAAMe,IAAaxE,EAAM,WAAWsB,EAAS,SAASA,EAAS,OACzDmD,IAAW,MAAM,KAAK3D,EAAW,KAAK,GACtC4D,IAAYD,EAAS,QACrBE,IAAc3D,EAAc,QAAQuD,GACpCK,IAAa5D,EAAc;AAEjC,UAAI2D,IAAc7D,EAAW,MAAM,OAAOd,EAAM,UAAU;AACpD,YAAA,CAACA,EAAM,KAAM;AAEb,YAAAqB,EAAU,SAAS;AACX,UAAAA,EAAA,SAASmD,KAAcE,IAAYC;AAAA,aACxC;AACC,gBAAAG,IAAcH,IAAc3E,EAAM,WAAW0E;AAE1C,mBAAAG,IAAI,GAAGE,KAAMN,EAAS,QAAQI,IAAIE,IAAK,EAAEF;AAChD,YAAAJ,EAASI,CAAC,EAAE,SACVA,IAAIC,KACClE,EAAM,SAAS,CAACZ,EAAM,WAAW,CAAC0E,IAAYA,KAAaF,IAC5D;AAGE,UAAAnD,EAAA,SAAS,CAACsD,IAAcH;AAAA,QAAA;AAGpC,QAAAxD,EAAc,QAAQ2D,IAAcD;AAAA,MAAA;AAEpC,QAAA1D,EAAc,QAAQ2D,GACZtD,EAAA,SAAS,CAACL,EAAc,QAAQwD;AAG9B,MAAAd,IAAA1C,EAAc,SAAS0D,IAAY1E,EAAM,UACxCyD,IAAA,IAEDzC,EAAA,UAAU4D,KAAcR,GAAgB;AAAA,IAAA;AAGxD,aAAS9B,EAAY+B,GAAgB;AACnC,UAAIzC,EAAW,SAAS6B,KAAgBY,MAAWrD,EAAc,MAAO;AAElE,YAAA0D,IAAY5D,EAAW,MAAM;AAInC,UAFAuD,IAAUA,IAASK,KAAcL,IAAS,IAAIK,IAAY,IAEtD1E,EAAM,MAAM;AACV,YAAAgF,GACAC;AAEA,QAAAZ,IAASrD,EAAc,SACzBgE,IAAUX,IAASrD,EAAc,OAC1BiE,IAAAP,IAAYL,IAASrD,EAAc,UAEhCgE,IAAAN,IAAY1D,EAAc,QAAQqD,GAC5CY,IAAOjE,EAAc,QAAQqD,IAG3BW,IAAUC,IACZd,EAAWa,CAAO,IACTA,IAAUC,IACnBf,EAAWe,CAAI,IAEX5D,EAAU,SAAS,IACrB6C,EAAWc,CAAO,IAElBb,EAAWa,CAAO;AAAA,MAEtB;AAEI,QAAAX,IAASrD,EAAc,QACdkD,EAAAlD,EAAc,QAAQqD,CAAM,IAE5BF,EAAAE,IAASrD,EAAc,KAAK;AAAA,IAE3C;AAGF,aAAS6C,KAAkB;AACzB,MAAKH,KAGQ5C,EAAA,MAAM,QAAQ,CAASkC,MAAA;AAChC,QAAAA,EAAM,SAAS;AAAA,MAAA,CAChB,GAEaU,IAAA,IACdzC,EAAS,QAAQ,IAEjB,sBAAsB,MAAM;AAChB,QAAAI,EAAA,SAAS,CAACL,EAAc,SAAShB,EAAM,WAAWsB,EAAS,SAASA,EAAS,QAEvF,sBAAsB,MAAM;AAC1B,UAAAL,EAAS,QAAQ,IACFwC,IAAA;AAAA,QAAA,CAChB;AAAA,MAAA,CACF,KAhBcA,IAAA;AAAA,IAiBjB;AAGF,aAASyB,KAAkB;AACzB,MAAAhB,EAAW,CAAC,GACFI,EAAAtE,EAAM,SAASgB,EAAc,QAAQhB,EAAM,gBAAgBc,EAAW,MAAM,IAAI;AAAA,IAAA;AAG5F,aAASqE,KAAkB;AACzB,MAAAhB,EAAW,CAAC,GACFG,EAAAtE,EAAM,SAASgB,EAAc,QAAQhB,EAAM,gBAAgBc,EAAW,MAAM,IAAI;AAAA,IAAA;AAG5F,aAAS0C,GAAaO,GAAe;AACzB,MAAAO,EAAAtE,EAAM,UAAU+D,CAAK;AAAA,IAAA;AAG3B,UAAA,EAAE,OAAAqB,EAAM,IAAIC,GAAc;AAEhC,aAAS3C,IAAc;AAGjB,UAFJ,cAAc0C,EAAM,IAAI,GAEpB,CAACpF,EAAM,SAAU;AAErB,UAAIsF,IAAU;AAEV,MAAA,OAAOtF,EAAM,YAAa,aAC5BsF,IAAUtF,EAAM,WAGZoF,EAAA,OAAO,OAAO,YAAY,MAAM;AACpC,QAAI,CAACpF,EAAM,QAAQmC,EAAa,QAC9BG,EAAY,CAAC,IAEF6B,EAAA;AAAA,SAEZmB,CAAO;AAAA,IAAA;AAGZ,aAAS/C,KAAmB;AAC1B,MAAIvC,EAAM,aACR,aAAaoF,EAAM,KAAK,GAElBA,EAAA,QAAQ,WAAW,MAAM;AAC7B,sBAAcA,EAAM,IAAI;AAAA,MAAA,GACvB1E,EAAW,KAAK,IAGjBV,EAAM,iBAAiB,WAAWA,EAAM,UAAU,aACpDkB,EAAY,QAAQ;AAAA,IACtB;AAGF,aAASsB,KAAmB;AAC1B,MAAIxC,EAAM,aACR,aAAaoF,EAAM,KAAK,GAElBA,EAAA,QAAQ,WAAW,MAAM;AACjB,QAAA1C,EAAA;AAAA,MAAA,GACXhC,EAAW,KAAK,IAGjBV,EAAM,iBAAiB,YACzBkB,EAAY,QAAQ;AAAA,IACtB;AAGF,aAASqE,GAAkBzC,GAAe;AACpC,aAAA9C,EAAM,OAAa,KAEhB,EACL8C,KAAS9C,EAAM,eAAe,KAAK8C,IAAQhC,EAAW,MAAM,OAAOd,EAAM,eAAe;AAAA,IAAA;2BAM1FwF,EA6FM,OAAA;AAAA,eA5FA;AAAA,MAAJ,KAAIjE;AAAA,MACH,SAAOO,GAAS,KAAA;AAAA,MACjB,MAAK;AAAA,MACJ,SAAOC,GAAK,KAAA;AAAA,IAAA;MAEb0D,EA6DiBC,EAAAC,EAAA,GAAA,EA7DA,UAAQlD,KAAO;AAAA,mBAC9B,MA2DM;AAAA,UA3DNmD,EA2DM,OAAA;AAAA,YA1DH,OAAKC,EAAA;AAAA;;cAA2F,eAAAH,EAAA1F,CAAA,EAAM,WAAQ,WAAA;AAAA;;;YAQvG0F,EAAA1F,CAAA,EAAM,UAAK,eADnBwF,EAsBM,OAAA;AAAA;uBApBA;AAAA,cAAJ,KAAI9D;AAAA,cACH,OAAKoE,EAAA;AAAA,gBAAiBJ,EAAApF,CAAA,EAAG,IAAa,SAAAoF,EAAA1F,CAAA,EAAM,KAAK;AAAA,gBAAgB0F,EAAApF,CAAA,EAAG,IAAG,SAAA,MAAA;AAAA,gBAAgCY,EAAW,QAAGwE,EAAEpF,CAAA,EAAC,IAAG,SAAA,MAAA,IAAA;AAAA;;cAM5HsF,EAYM,OAAA;AAAA,gBAXH,OAAKE,EAAA;AAAA,kBAAoB,CAAAJ,EAAApF,CAAA,EAAG,GAAE,SAAA,CAAA,GAAA;AAAA,mBAAoCoF,EAAEpF,CAAA,EAAC,IAAG,WAAA,UAAA,CAAA,GAA0B4B,EAAY;AAAA,gBAAA;gBAI9G,SAAOgD;AAAA,cAAA;gBAERa,EAIOC,EAJiB,QAAA,aAAA,EAAA,UAAU9D,EAAA,SAAlC,MAIO;AAAA,kBAHLuD,EAEWC,EAAAO,CAAA,GAAA;AAAA,oBAFA,UAAUP,EAAA1F,CAAA,EAAM,MAAM;AAAA,oBAAY,kBAAkBkC,EAAY,MAAA;AAAA,kBAAA;+BACzE,MAA+E;AAAA,sBAA/EuD,EAA+EC,EAAAQ,EAAA,GAA/EC,GAA+E/D,EAAvD,MAAA,CAAA,GAAA;AAAA,wBAAM,OAAK,EAAIA,EAAU,MAAA,CAAA,EAAI,SAAK,KAAA;AAAA;;;;;;;YAKlEwD,EAIM,OAAA;AAAA,cAJA,OAAKE,EAAEJ,EAAEpF,CAAA,EAAC,GAAE,MAAA,CAAA;AAAA,cAAW,SAAO0B,GAAS,KAAA;AAAA,YAAA;cAC3C4D,EAEM,OAAA;AAAA,gBAFA,OAAKE,EAAEJ,EAAEpF,CAAA,EAAC,GAAE,OAAA,CAAA;AAAA,gBAAY,SAAO2B,GAAU,KAAA;AAAA,gBAAG,oBAAoB4B,IAAe,CAAA,MAAA,CAAA;AAAA,cAAA;gBACnFkC,EAAqEC,yBAArE,MAAqE;AAAA,kBAA9DP,EAAqDC,EAAAO,CAAA,GAAA;AAAA,oBAA1C,UAAUP,EAAA1F,CAAA,EAAM,MAAM;AAAA;qCAAoB,IAAE;AAAA;;;YAI1D0F,EAAA1F,CAAA,EAAM,UAAK,eADnBwF,EAsBM,OAAA;AAAA;uBApBA;AAAA,cAAJ,KAAI7D;AAAA,cACH,OAAKmE,EAAA;AAAA,gBAAiBJ,EAAApF,CAAA,EAAG,IAAa,SAAAoF,EAAA1F,CAAA,EAAM,KAAK;AAAA,gBAAgB0F,EAAApF,CAAA,EAAG,IAAG,SAAA,MAAA;AAAA,gBAAgCY,EAAW,QAAGwE,EAAEpF,CAAA,EAAC,IAAG,SAAA,MAAA,IAAA;AAAA;;cAM5HsF,EAYM,OAAA;AAAA,gBAXH,OAAKE,EAAA;AAAA,kBAAoB,CAAAJ,EAAApF,CAAA,EAAG,GAAE,SAAA,CAAA,GAAA;AAAA,mBAAoCoF,EAAEpF,CAAA,EAAC,IAAG,WAAA,UAAA,CAAA,GAA0B6B,EAAY;AAAA,gBAAA;gBAI9G,SAAOgD;AAAA,cAAA;gBAERY,EAIOC,EAJiB,QAAA,aAAA,EAAA,UAAU7D,EAAA,SAAlC,MAIO;AAAA,kBAHLsD,EAEWC,EAAAO,CAAA,GAAA;AAAA,oBAFA,UAAUP,EAAA1F,CAAA,EAAM,MAAM;AAAA,oBAAY,kBAAkBmC,EAAY,MAAA;AAAA,kBAAA;+BACzE,MAA+E;AAAA,sBAA/EsD,EAA+EC,EAAAQ,EAAA,GAA/EC,GAA+E/D,EAAvD,MAAA,CAAA,GAAA;AAAA,wBAAM,OAAK,EAAIA,EAAU,MAAA,CAAA,EAAI,SAAK,KAAA;AAAA;;;;;;;;;;;MAO3DsD,EAAA1F,CAAA,EAAM,YAAO,eAAxBwF,EAwBM,OAAA;AAAA;QAxBgC,SAAOE,EAAEpF,CAAA,EAAC,IAAgB,YAAAoF,EAAA1F,CAAA,EAAM,OAAO,CAAA;AAAA,MAAA;SAC3EoG,EAAA,EAAA,GAAAZ,EAsBMa,IArBY,MAAAC,GAAAxF,EAAA,MAAW,OAApBgC,YADT0C,EAsBM,OAAA;AAAA,UApBH,KAAK1C;AAAA,UACL,OAAKgD,EAAA;AAAA,YAAgB,CAAAJ,EAAApF,CAAA,EAAG,GAAE,SAAA,CAAA,GAAA;AAAA,YAAgC,CAAAoF,EAAApF,CAAA,EAAG,IAAG,WAAA,QAAA,CAAA,GAAqCwC,IAAK,OAAU9B,UAAgB0E,EAAA1F,CAAA,EAAM,gBAAgBc,EAAU,MAAC;AAAA,aAAkB4E,EAAEpF,CAAA,EAAC,IAA6B,WAAA,UAAA,CAAA,GAAAiF,GAAkBzC,IAAQ4C,EAAK1F,CAAA,EAAC,eAAY,CAAA;AAAA,UAAA;UAMnQ,gBAAOsC,EAAYQ,IAAQ4C,EAAA1F,CAAA,EAAM,eAAY,CAAA;AAAA,QAAA;UAE9C+F,EAUOC,EAAA,QAAA,WAAA;AAAA,YARJ,QAAQlD,IAAK,OAAU9B,EAAa,QAAG0E,EAAK1F,CAAA,EAAC,gBAAgBc,EAAU,MAAC;AAAA,UAAA,GAF3E,MAUO;AAAA,YANL2E,EAKWC,EAAAO,CAAA,GAAA;AAAA,cAJR,UAAUP,EAAA1F,CAAA,EAAM,MAAM;AAAA,cACtB,MAAI,EAAA,QAAY8C,IAAK,OAAU9B,EAAa,QAAG0E,EAAK1F,CAAA,EAAC,gBAAgBc,EAAU,MAAC,KAAI;AAAA,YAAA;yBAErF,MAA6C;AAAA,gBAA7C8E,EAA6C,QAAA;AAAA,kBAAtC,OAAKE,EAAEJ,EAAEpF,CAAA,EAAC,GAAE,eAAA,CAAA;AAAA;;;;;;;;;;"}