transone 0.1.0 → 0.1.2
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.
- package/README.md +2 -2
- package/dist/core/vnode.d.ts +17 -6
- package/dist/{index-mbmajrpr.js → index-2e39fr05.js} +3 -3
- package/dist/{index-mbmajrpr.js.map → index-2e39fr05.js.map} +1 -1
- package/dist/index-2h18qzcx.js +12 -0
- package/dist/{index-3t506ckz.js.map → index-2h18qzcx.js.map} +7 -7
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +3 -3
- package/dist/router/index.js +2 -2
- package/dist/router/index.js.map +1 -1
- package/dist/style/index.js +2 -2
- package/dist/style/index.js.map +1 -1
- package/package.json +2 -1
- package/dist/index-3t506ckz.js +0 -12
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# transone
|
|
2
2
|
|
|
3
3
|
TransOne 核心框架包:一份 TypeScript 源码,跨端框架的核心运行时模型。
|
|
4
4
|
|
|
@@ -9,7 +9,7 @@ TransOne 核心框架包:一份 TypeScript 源码,跨端框架的核心运
|
|
|
9
9
|
- 样式管理:`StyleManager`
|
|
10
10
|
|
|
11
11
|
与 TSone 同源:核心公开 API 复用 TSone,Web 产物可直接复用 TSone 渲染策略。
|
|
12
|
-
编译器见 [
|
|
12
|
+
编译器见 [transone-cli](../transone-cli)。
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
15
|
bun test # 测试
|
package/dist/core/vnode.d.ts
CHANGED
|
@@ -8,6 +8,9 @@ export interface ComponentType {
|
|
|
8
8
|
type VNodeComponentProps = ComponentProps;
|
|
9
9
|
export type VNodeComponentConstructor<P extends VNodeComponentProps = VNodeComponentProps> = ComponentConstructor<P> | AnyComponentConstructor;
|
|
10
10
|
export type HTMLPropValue = string | number | boolean | null | undefined | Record<string, string | number> | EventListener;
|
|
11
|
+
export type Children = VNode | string | Array<VNode | string>;
|
|
12
|
+
/** 归一化 children 为数组(运行时渲染使用;h() 允许直接传单个节点或数组)。 */
|
|
13
|
+
export declare function toChildren(children?: Children): Array<VNode | string>;
|
|
11
14
|
export interface HTMLProps {
|
|
12
15
|
[key: string]: HTMLPropValue;
|
|
13
16
|
class?: string;
|
|
@@ -30,13 +33,13 @@ export interface VNodeBase {
|
|
|
30
33
|
export interface HTMLNode extends VNodeBase {
|
|
31
34
|
tag: string;
|
|
32
35
|
props?: HTMLProps;
|
|
33
|
-
children?:
|
|
36
|
+
children?: Children;
|
|
34
37
|
listeners?: EventListeners;
|
|
35
38
|
}
|
|
36
39
|
export interface ComponentNode<P extends VNodeComponentProps = VNodeComponentProps> extends VNodeBase {
|
|
37
40
|
component: VNodeComponentConstructor<P>;
|
|
38
41
|
props?: P;
|
|
39
|
-
children?:
|
|
42
|
+
children?: Children;
|
|
40
43
|
emitters?: Record<string, ComponentEventListener>;
|
|
41
44
|
}
|
|
42
45
|
export interface SlotProvider extends VNodeBase {
|
|
@@ -50,13 +53,13 @@ export interface SlotInjector extends VNodeBase {
|
|
|
50
53
|
tag: string;
|
|
51
54
|
slot: string;
|
|
52
55
|
}
|
|
53
|
-
export type VNode = HTMLNode | ComponentNode | SlotProvider | SlotInjector;
|
|
56
|
+
export type VNode = HTMLNode | ComponentNode<any> | SlotProvider | SlotInjector;
|
|
54
57
|
export type ElementShortcutOptions = Omit<HTMLNode, 'tag'>;
|
|
55
58
|
export type ElementShortcut = (options?: ElementShortcutOptions) => HTMLNode;
|
|
56
59
|
export declare function isComponentNode(vnode: VNode): vnode is ComponentNode;
|
|
57
60
|
export declare function isHTMLNode(vnode: VNode): vnode is HTMLNode;
|
|
58
61
|
export declare function isSlotProvider(vnode: VNode): vnode is SlotProvider;
|
|
59
|
-
export declare function h(tag: string, props?: HTMLProps, children?:
|
|
62
|
+
export declare function h(tag: string, props?: HTMLProps, children?: Children, listeners?: EventListeners, key?: string | number, directions?: Directions): HTMLNode;
|
|
60
63
|
export declare function Tag(tag: string, options?: ElementShortcutOptions): HTMLNode;
|
|
61
64
|
export declare const Div: ElementShortcut;
|
|
62
65
|
export declare const Span: ElementShortcut;
|
|
@@ -98,7 +101,15 @@ export declare const Tbody: ElementShortcut;
|
|
|
98
101
|
export declare const Tr: ElementShortcut;
|
|
99
102
|
export declare const Th: ElementShortcut;
|
|
100
103
|
export declare const Td: ElementShortcut;
|
|
101
|
-
export
|
|
104
|
+
export interface ComponentDescriptor<P extends VNodeComponentProps> {
|
|
105
|
+
component: ComponentConstructor<P>;
|
|
106
|
+
props?: P;
|
|
107
|
+
children?: Children;
|
|
108
|
+
key?: string | number;
|
|
109
|
+
directions?: Directions;
|
|
110
|
+
}
|
|
111
|
+
export declare function createComponent<P extends VNodeComponentProps>(options: ComponentDescriptor<P>): ComponentNode<P>;
|
|
112
|
+
export declare function createComponent<P extends VNodeComponentProps>(componentClass: ComponentConstructor<P>, props?: P, children?: Children, key?: string | number, directions?: Directions): ComponentNode<P>;
|
|
102
113
|
export declare function slot(name: string, key?: string | number, directions?: Directions): SlotProvider;
|
|
103
|
-
export declare function each<T>(items: readonly T[], render: (item: T, index: number) => VNode | string, key
|
|
114
|
+
export declare function each<T>(items: readonly T[], render: (item: T, index: number) => VNode | string, key?: (item: T, index: number) => string | number): VNode[];
|
|
104
115
|
export {};
|
|
@@ -20,7 +20,7 @@ ${t}}`}let r=Object.entries(e.properties).map(([n,s])=>`${t} ${o(n)}: ${String(
|
|
|
20
20
|
`);return`${t}${e.selector} {
|
|
21
21
|
${r}
|
|
22
22
|
${t}}`}function o(e){if(e.startsWith("--")||e.includes("-"))return e;return e.replace(/[A-Z]/g,(t)=>`-${t.toLowerCase()}`)}
|
|
23
|
-
export{i as
|
|
23
|
+
export{i as Ca,u as Da};
|
|
24
24
|
|
|
25
|
-
//# debugId=
|
|
26
|
-
//# sourceMappingURL=index-
|
|
25
|
+
//# debugId=F58C708B069121FF64756E2164756E21
|
|
26
|
+
//# sourceMappingURL=index-2e39fr05.js.map
|
|
@@ -6,6 +6,6 @@
|
|
|
6
6
|
"export type StyleValue = string | number;\n\nexport type StyleProperties = Record<string, StyleValue>;\n\nexport interface StyleRule {\n selector: string;\n properties: StyleProperties;\n}\n\nexport interface StyleAtRule {\n atRule: string;\n rules: StyleRule[];\n}\n\nexport type StyleSheetEntry = StyleRule | StyleAtRule;\n\nexport type StyleSheet = StyleSheetEntry[];\n\nexport function renderStyleSheet(styles: StyleSheet): string {\n return styles.map((entry) => renderStyleEntry(entry)).join('\\n\\n');\n}\n\nfunction renderStyleEntry(entry: StyleSheetEntry, indent = ''): string {\n if ('atRule' in entry) {\n const rules = entry.rules\n .map((rule) => renderStyleEntry(rule, `${indent} `))\n .join('\\n\\n');\n\n return `${indent}${entry.atRule} {\\n${rules}\\n${indent}}`;\n }\n\n const declarations = Object.entries(entry.properties)\n .map(\n ([property, value]) =>\n `${indent} ${toCssProperty(property)}: ${String(value)};`\n )\n .join('\\n');\n\n return `${indent}${entry.selector} {\\n${declarations}\\n${indent}}`;\n}\n\nfunction toCssProperty(property: string): string {\n if (property.startsWith('--') || property.includes('-')) {\n return property;\n }\n\n return property.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);\n}\n"
|
|
7
7
|
],
|
|
8
8
|
"mappings": "AAOO,MAAM,CAAa,CACjB,aAAwC,KACxC,OAAoC,IAAI,IAE/C,WAAW,EAAG,EAIP,QAAQ,CAAC,EAAc,EAA6B,CACzD,KAAK,OAAO,IAAI,EAAM,CAAO,EAC7B,KAAK,aAAa,EAGb,WAAW,CAAC,EAAoB,CACrC,KAAK,OAAO,OAAO,CAAI,EACvB,KAAK,aAAa,EAGb,WAAW,EAAS,CAEzB,GADA,KAAK,OAAO,MAAM,EACd,KAAK,aACP,KAAK,aAAa,YAAc,GAI7B,OAAO,EAAS,CAErB,GADA,KAAK,YAAY,EACb,KAAK,aACP,KAAK,aAAa,OAAO,EACzB,KAAK,aAAe,KAIhB,kBAAkB,EAAqB,CAC7C,GAAI,CAAC,KAAK,aAAc,CACtB,IAAM,EAAU,SAAS,cAAc,OAAO,EAC9C,SAAS,KAAK,YAAY,CAAO,EACjC,KAAK,aAAe,EAEtB,OAAO,KAAK,aAGN,YAAY,CAAC,EAAqD,CACxE,OAAO,OAAO,QAAQ,CAAU,EAC7B,IAAI,EAAE,EAAK,KAEH,GADQ,EAAI,QAAQ,WAAY,KAAK,EAAE,YAAY,MACrC,IACtB,EACA,KAAK;AAAA,CAAI,EAGN,YAAY,EAAS,CAC3B,GAAI,KAAK,OAAO,OAAS,EAAG,CAC1B,GAAI,KAAK,aACP,KAAK,aAAa,YAAc,GAElC,OAGF,IAAM,EAAU,KAAK,mBAAmB,EACpC,EAAU,GAEd,KAAK,OAAO,QAAQ,CAAC,IAAU,CAK7B,GAHA,GAAW,GAAG,EAAM;AAAA,EAAe,KAAK,aAAa,EAAM,UAAU;AAAA;AAAA,EAGjE,EAAM,MACR,GAAW,GAAG,EAAM;AAAA,EAAqB,KAAK,aAAa,EAAM,KAAK;AAAA;AAAA,EAIxE,GAAI,EAAM,MACR,OAAO,QAAQ,EAAM,KAAK,EAAE,QAAQ,EAAE,EAAO,KAAgB,CAC3D,GAAW,UAAU;AAAA,EAAY,EAAM;AAAA,EAAe,KAAK,aAAa,CAAU;AAAA;AAAA;AAAA,EACnF,EAEJ,EAED,EAAQ,YAAc,EAE1B,CCtEO,SAAS,CAAgB,CAAC,EAA4B,CAC3D,OAAO,EAAO,IAAI,CAAC,IAAU,EAAiB,CAAK,CAAC,EAAE,KAAK;AAAA;AAAA,CAAM,EAGnE,SAAS,CAAgB,CAAC,EAAwB,EAAS,GAAY,CACrE,GAAI,WAAY,EAAO,CACrB,IAAM,EAAQ,EAAM,MACjB,IAAI,CAAC,IAAS,EAAiB,EAAM,GAAG,KAAU,CAAC,EACnD,KAAK;AAAA;AAAA,CAAM,EAEd,MAAO,GAAG,IAAS,EAAM;AAAA,EAAa;AAAA,EAAU,KAGlD,IAAM,EAAe,OAAO,QAAQ,EAAM,UAAU,EACjD,IACC,EAAE,EAAU,KACV,GAAG,MAAW,EAAc,CAAQ,MAAM,OAAO,CAAK,IAC1D,EACC,KAAK;AAAA,CAAI,EAEZ,MAAO,GAAG,IAAS,EAAM;AAAA,EAAe;AAAA,EAAiB,KAG3D,SAAS,CAAa,CAAC,EAA0B,CAC/C,GAAI,EAAS,WAAW,IAAI,GAAK,EAAS,SAAS,GAAG,EACpD,OAAO,EAGT,OAAO,EAAS,QAAQ,SAAU,CAAC,IAAU,IAAI,EAAM,YAAY,GAAG",
|
|
9
|
-
"debugId": "
|
|
9
|
+
"debugId": "F58C708B069121FF64756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import{Ca as pe,Da as W}from"./index-2e39fr05.js";var R=Symbol("is_reactive"),l=Symbol("is_readonly"),H=Symbol("is_ref"),G=["push","pop","shift","unshift","splice","sort","reverse"];function d(e,t){return Boolean(Reflect.get(e,t))}function h(e){return e!==null&&typeof e==="object"}class j{pending=new Set;flushing=!1;flushPromise=null;flushResolve=null;enqueue(e){if(this.pending.has(e))return;if(this.pending.add(e),!this.flushing)queueMicrotask(()=>this.flush())}flush(){if(this.flushing)return;this.flushing=!0;try{while(this.pending.size>0){let e=Array.from(this.pending);this.pending.clear();for(let t of e)if(t.active)t()}}finally{this.flushing=!1;let e=this.flushResolve;this.flushResolve=null,this.flushPromise=null,e?.()}}nextTick(){if(!this.flushing&&this.pending.size===0)return Promise.resolve();if(this.flushPromise)return this.flushPromise;return this.flushPromise=new Promise((e)=>{this.flushResolve=e}),this.flushPromise}}var me=0,E=new j;function Ke(){return E.nextTick()}function We(){E.flush()}class f{static instance;activeEffect=null;effectStack=[];targetMap=new WeakMap;reactiveMap=new WeakMap;readonlyMap=new WeakMap;proxyMap=new WeakMap;constructor(){}static getInstance(){if(!f.instance)f.instance=new f;return f.instance}reactive(e){if(!h(e))return console.warn("reactive: target must be an object"),e;if(ge(e))return e;if(this.reactiveMap.has(e))return this.reactiveMap.get(e);if(Array.isArray(e))return this.createReactiveArray(e);let t=new Proxy(e,{get:(n,r)=>{if(r===R)return!0;if(r===l)return!1;this.track(n,r);let o=Reflect.get(n,r);if(h(o)&&!d(o,l))return this.reactive(o);return o},set:(n,r,o)=>{if(d(n,l))return console.warn(`Cannot set property ${String(r)} on readonly object`),!1;let i=Reflect.get(n,r);if(h(o)&&!d(o,R)&&!d(o,l))o=this.reactive(o);let s=Reflect.set(n,r,o);if(i!==o)this.trigger(n,r);return s},deleteProperty:(n,r)=>{if(d(n,l))return console.warn(`Cannot delete property ${String(r)} on readonly object`),!1;let o=r in n,i=Reflect.deleteProperty(n,r);if(o)this.trigger(n,r);return i}});return this.reactiveMap.set(e,t),this.proxyMap.set(t,e),t}toRawValue(e){if(h(e)&&this.proxyMap.has(e))return this.proxyMap.get(e);return e}createReactiveArray(e){if(this.reactiveMap.has(e))return this.reactiveMap.get(e);let t=new Proxy(e,{get:(n,r)=>{if(r===R)return!0;if(r===l)return!1;this.track(n,r);let o=Reflect.get(n,r);if(typeof r==="string"&&(r==="includes"||r==="indexOf"||r==="lastIndexOf")){this.track(n,"length");for(let s=0;s<n.length;s++)this.track(n,String(s));let i=o;return(...s)=>{let a=i.apply(n,s);if(a===!1||a===-1){let c=n.map((u)=>this.toRawValue(u));return c[r].apply(c,s.map((u)=>this.toRawValue(u)))}return a}}if(typeof r==="string"&&G.includes(r))return(...i)=>{let a=o.apply(n,i);return this.trigger(n,"length"),this.trigger(n,r),a};if(h(o)&&!d(o,l))return this.reactive(o);return o},set:(n,r,o)=>{if(d(n,l))return console.warn(`Cannot set property ${String(r)} on readonly object`),!1;let i=Reflect.get(n,r);if(h(o)&&!d(o,R)&&!d(o,l))o=this.reactive(o);let s=Reflect.set(n,r,o);if(i!==o){if(this.trigger(n,r),typeof r==="string"&&!isNaN(Number(r)))this.trigger(n,"length")}return s},deleteProperty:(n,r)=>{if(d(n,l))return console.warn(`Cannot delete property ${String(r)} on readonly object`),!1;let o=r in n,i=Reflect.deleteProperty(n,r);if(o)this.trigger(n,r),this.trigger(n,"length");return i}});return this.reactiveMap.set(e,t),this.proxyMap.set(t,e),t}readonly(e){if(!h(e))return console.warn("readonly: target must be an object"),e;if(d(e,l))return e;if(this.readonlyMap.has(e))return this.readonlyMap.get(e);let t=new Proxy(e,{get:(n,r)=>{if(r===R)return!1;if(r===l)return!0;let o=Reflect.get(n,r);if(h(o))return this.readonly(o);return o},set:()=>(console.warn("Cannot set property on readonly object"),!1),deleteProperty:()=>(console.warn("Cannot delete property on readonly object"),!1)});return this.readonlyMap.set(e,t),t}effect(e,t){let{lazy:n=!1,scheduler:r,throwOnError:o=!1}=t||{},i=()=>{if(!i.active)return e();try{return this.cleanup(i),this.effectStack.push(i),this.activeEffect=i,e()}catch(s){if(o)throw s;console.error("Effect error:",s);return}finally{this.effectStack.pop(),this.activeEffect=this.effectStack[this.effectStack.length-1]??null}};if(i.id=me++,i.deps=[],i.active=!0,i.scheduler=r,!n)i();return i}runWithEffect(e,t){this.effectStack.push(e),this.activeEffect=e;try{return t()}finally{this.effectStack.pop(),this.activeEffect=this.effectStack[this.effectStack.length-1]??null}}computed(e){let t=!0,n,r={},o=()=>{this.track(r,"value")},i=this.effect(()=>{n=e(),t=!1},{lazy:!0,scheduler:()=>{if(!t)t=!0,this.trigger(r,"value")}});return{get value(){if(t)i();return o(),n}}}cleanup(e){e.deps.forEach((t)=>{t.delete(e)}),e.deps.length=0}track(e,t){if(!this.activeEffect||!this.activeEffect.active)return;let n=this.targetMap.get(e);if(!n)n=new Map,this.targetMap.set(e,n);let r=n.get(t);if(!r)r=new Set,n.set(t,r);if(!r.has(this.activeEffect))r.add(this.activeEffect),this.activeEffect.deps.push(r)}trigger(e,t){let n=this.targetMap.get(e);if(!n)return;let r=n.get(t);if(!r)return;new Set(r).forEach((i)=>{if(i.active)if(i.scheduler)i.scheduler(i);else i()})}stop(e){if(e.active)this.cleanup(e),e.active=!1}}function V(e){return f.getInstance().reactive(e)}function Fe(e){return f.getInstance().readonly(e)}function g(e,t){return f.getInstance().effect(e,t)}function Ge(e){return f.getInstance().computed(e)}function qe(e){let t={value:e};return Object.defineProperty(t,H,{configurable:!1,enumerable:!1,value:!0}),V(t)}function q(e){return h(e)&&Boolean(Reflect.get(e,H))}function ze(e){return q(e)?e.value:e}function y(e){f.getInstance().stop(e)}function O(e,t){if(!h(e)||t.has(e))return;if(t.add(e),Array.isArray(e)){e.forEach((n)=>O(n,t));return}Object.keys(e).forEach((n)=>{O(e[n],t)})}function Ye(e,t,n={}){let r=f.getInstance(),o=q(e)?()=>e.value:e,i,s=null,a=()=>{if(!m.active)return;s?.(),s=null;let u=c();t(u,i,(b)=>{s=b}),i=u},c=g(()=>{let u=o();if(n.deep&&h(u))O(u,new Set);return u},{lazy:!0,scheduler:()=>{if(n.sync)a();else E.enqueue(m)}}),m=g(()=>{a()},{lazy:!0});if(n.immediate)a();else i=c();return()=>{r.stop(c),r.stop(m)}}function ge(e){return h(e)&&d(e,R)}function Qe(e){return h(e)&&d(e,l)}function v(e){if(e===void 0||e===null)return[];return Array.isArray(e)?e:[e]}function z(e){return typeof e==="object"&&e!==null&&"component"in e}function Y(e){return typeof e==="object"&&e!==null&&"tag"in e&&e.tag!=="slot"}function Q(e){return typeof e==="object"&&e!==null&&"tag"in e&&e.tag==="slot"}function Je(e,t,n,r,o,i){return{tag:e,props:t,children:n,listeners:r,key:o,directions:i}}function ve(e,t={}){return{tag:e,...t}}function p(e){return(t={})=>ve(e,t)}var w=p("div"),Xe=p("span"),et=p("p"),tt=p("button"),nt=p("input"),rt=p("section"),ot=p("main"),it=p("header"),st=p("footer"),at=p("nav"),pt=p("article"),ct=p("aside"),ut=p("h1"),lt=p("h2"),dt=p("h3"),ht=p("h4"),ft=p("h5"),mt=p("h6"),gt=p("strong"),vt=p("em"),yt=p("small"),Rt=p("pre"),Ct=p("code"),bt=p("blockquote"),Et=p("ul"),xt=p("ol"),Tt=p("li"),wt=p("a"),St=p("img"),Mt=p("form"),Lt=p("label"),Pt=p("textarea"),Nt=p("select"),At=p("option"),It=p("table"),kt=p("thead"),Ht=p("tbody"),jt=p("tr"),Ot=p("th"),Vt=p("td");function Bt(e,t,n,r,o){if(typeof e==="function")return{component:e,props:t,children:n,key:r,directions:o};return{component:e.component,props:e.props,children:e.children,key:e.key,directions:e.directions}}function _t(e,t,n){return{tag:"slot",props:{name:e},key:t,directions:n}}function Dt(e,t,n){return e.map((r,o)=>{let i=t(r,o);if(typeof i==="string")throw Error("each render callback must return a VNode");if(!n)return i;return{...i,key:n(r,o)}})}function J(e){let t=e.split(".");if(e.length===0||t.some((n)=>n.length===0||n==="__proto__"||n==="prototype"||n==="constructor"))throw Error(`Invalid model path "${e}"`);return t}function _(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}function X(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function ye(e){return typeof e==="string"?e:e.path}function Z(e,t){let n=e;for(let r of J(t)){if(!_(n))throw Error(`Invalid model path "${t}"`);if(!X(n,r)){if(r in n)throw Error(`Invalid model path "${t}"`);return}n=n[r]}return n}function Re(e,t,n){let r=J(t),o=e;for(let s of r.slice(0,-1)){if(!X(o,s)){if(s in o)throw Error(`Invalid model path "${t}"`);o[s]={}}else if(!_(o[s]))throw Error(`Invalid model path "${t}"`);let a=o[s];if(!_(a))throw Error(`Invalid model path "${t}"`);o=a}let i=r[r.length-1];o[i]=n}function B(e,t){if(typeof e!=="string"&&e.format)return e.format(t);return t===void 0||t===null?"":String(t)}function Ce(e,t){if(typeof e!=="string"&&e.parse)return e.parse(t);return t}function be(e,t,n){if(e instanceof HTMLInputElement){if(e.type==="checkbox"){e.checked=Array.isArray(n)?n.some((r)=>String(r)===e.value):Boolean(n);return}if(e.type==="radio"){e.checked=n===e.value;return}e.value=B(t,n);return}if(e instanceof HTMLTextAreaElement){e.value=B(t,n);return}if(e instanceof HTMLSelectElement){if(e.multiple){let r=Array.isArray(n)?new Set(n.map(String)):new Set;for(let o=0;o<e.options.length;o+=1){let i=e.options.item(o);if(!i)continue;i.selected=r.has(i.value)}return}e.value=B(t,n)}}function Ee(e,t){if(e instanceof HTMLInputElement){if(e.type==="checkbox"){if(Array.isArray(t)){let n=t.filter((r)=>String(r)!==e.value);return e.checked?[...n,e.value]:n}return e.checked}if(e.type==="radio")return e.checked?e.value:t;return e.value}if(e instanceof HTMLTextAreaElement)return e.value;if(e instanceof HTMLSelectElement){if(!e.multiple)return e.value;let n=[];for(let r=0;r<e.selectedOptions.length;r+=1){let o=e.selectedOptions.item(r);if(o)n.push(o.value)}return n}return}class D{bindings=new WeakMap;bind(e,t,n){if(!this.isSupportedControl(e))return;let r=this.bindings.get(e);if(r&&this.sameBinding(r,t))return;this.cleanup(e);let o=ye(t),i=()=>be(e,t,Z(n,o)),s=e instanceof HTMLTextAreaElement||e instanceof HTMLInputElement&&!["checkbox","radio"].includes(e.type)?"input":"change",a=()=>{let m=Z(n,o);Re(n,o,Ce(t,Ee(e,m)))};e.addEventListener(s,a);let c=g(i);this.bindings.set(e,{binding:t,path:o,parse:typeof t==="string"?void 0:t.parse,format:typeof t==="string"?void 0:t.format,eventName:s,listener:a,effect:c})}cleanup(e){let t=this.bindings.get(e);if(!t)return;e.removeEventListener(t.eventName,t.listener),y(t.effect),this.bindings.delete(e)}isSupportedControl(e){return e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement}sameBinding(e,t){if(typeof e.binding==="string"||typeof t==="string")return e.binding===t;return e.path===t.path&&e.parse===t.parse&&e.format===t.format}}function L(e){return/^on[A-Z]/.test(e)||/^on[a-z]/.test(e)}function ee(e){return e.slice(2).toLowerCase()}function te(e){let[t,...n]=e.split(".");return{eventName:t,modifiers:new Set(n)}}function ne(e,t){let n=(r)=>{if(t.has("stop"))r.stopPropagation();if(t.has("prevent"))r.preventDefault();if(t.has("self")&&r.currentTarget!==r.target)return;if(t.has("once"))r.currentTarget.removeEventListener(r.type,n);e(r)};return n}function re(e,t,n){let r=t.includes("-")?t:t.replace(/[A-Z]/g,(o)=>`-${o.toLowerCase()}`);e.setProperty(r,String(n))}var oe="http://www.w3.org/2000/svg",xe=new Set(["svg","g","defs","rect","circle","ellipse","line","polyline","polygon","path","text","tspan","textPath","use","symbol","marker","linearGradient","radialGradient","stop","pattern","mask","clipPath","foreignObject"]);class N{listeners=new WeakMap;effects=new WeakMap;modelBindings=new D;matches(e){return typeof e==="object"&&e!==null&&Y(e)}mount(e,t){if(e.directions?.if===!1)return document.createComment("if");let n=xe.has(e.tag)?document.createElementNS(oe,e.tag):document.createElement(e.tag);return this.applyProps(n,{},e.props??{},t),this.updateListeners(n,{},this.collectListeners(e)),this.mountChildren(n,e,t),this.applyDirections(n,void 0,e.directions,t),n}patch(e,t,n,r){if(e.tag!==t.tag||n.nodeType===Node.COMMENT_NODE){let o=this.mount(t,r);return n.parentNode?.replaceChild(o,n),this.unmount(e,n,r),o}if(!(n instanceof Element))return n;if(t.directions?.if===!1){let o=document.createComment("if");return n.parentNode?.replaceChild(o,n),this.unmount(e,n,r),o}return this.applyProps(n,e.props??{},t.props??{},r),this.updateListeners(n,this.collectListeners(e),this.collectListeners(t)),this.updateChildren(n,e,t,r),this.applyDirections(n,e.directions,t.directions,r),n}unmount(e,t,n){if(!(t instanceof Element))return;this.effects.get(t)?.forEach((r)=>y(r)),this.effects.delete(t),this.listeners.get(t)?.forEach(({eventName:r,listener:o})=>{t.removeEventListener(r,o)}),this.listeners.delete(t),this.modelBindings.cleanup(t),this.unmountChildren(t,e,n)}mountChildren(e,t,n){v(t.children).forEach((r)=>{e.appendChild(n.renderer.mount(r,n))})}updateChildren(e,t,n,r){this.updateOrdinaryChildren(e,v(t.children),v(n.children),r)}unmountChildren(e,t,n){v(t.children).forEach((r,o)=>{let i=e.childNodes[o];if(i)n.renderer.unmount(r,i,n)})}applyProps(e,t,n,r){Object.keys(t).forEach((o)=>{if(L(o)||o in n)return;if(o==="className"||o==="class")e.removeAttribute("class");else if(o==="style")e.removeAttribute("style");else if(o==="value"&&typeof e==="object"&&e!==null&&"value"in e)e.value="";else e.removeAttribute(P(o))}),Object.entries(n).forEach(([o,i])=>{if(L(o))return;if(t[o]===i)return;if(o==="className"||o==="class"){if(e.namespaceURI===oe)e.setAttribute("class",String(i??""));else e.className=String(i??"");return}if(o==="value"&&typeof e==="object"&&e!==null&&"value"in e){e.value=String(i??"");return}if(o==="style"&&typeof i==="object"&&i!==null){e.removeAttribute("style");let s=e.style;Object.entries(i).forEach(([a,c])=>{re(s,a,c)});return}if(i===!1||i===void 0||i===null){e.removeAttribute(P(o));return}if(i===!0){e.setAttribute(P(o),"");return}if(typeof i==="string"&&r.templateEngine.hasExpressions(i)){this.setupReactiveAttribute(e,o,i,r);return}e.setAttribute(P(o),String(i))})}applyDirections(e,t,n,r){if(n&&"show"in n)e.style.display=n.show?"":"none";else if(t&&"show"in t)e.style.display="";if(!n?.model){this.modelBindings.cleanup(e);return}this.modelBindings.bind(e,n.model,r.templateEngine.state)}updateOrdinaryChildren(e,t,n,r){if(this.assertNoDuplicateKeys(t),this.assertNoDuplicateKeys(n),this.hasOnlyKeyedChildren(t,n)){this.updateKeyedChildren(e,t,n,r);return}let o=Math.min(t.length,n.length);for(let i=0;i<o;i+=1){let s=e.childNodes[i];if(!s){e.appendChild(r.renderer.mount(n[i],r));continue}r.renderer.patch(t[i],n[i],s,r)}for(let i=o;i<n.length;i+=1)e.appendChild(r.renderer.mount(n[i],r));for(let i=t.length-1;i>=n.length;i-=1){let s=e.childNodes[i];if(s){if(r.renderer.unmount(t[i],s,r),s.parentNode===e)e.removeChild(s)}}}updateKeyedChildren(e,t,n,r){let o=t.map((a,c)=>({vnode:a,node:e.childNodes[c],index:c})),i=new Map,s=new Set;o.forEach((a)=>{let c=this.getVNodeKey(a.vnode);if(c!==void 0&&a.node)i.set(c,{vnode:a.vnode,node:a.node,index:a.index})}),n.forEach((a,c)=>{let m=this.getVNodeKey(a),u=m===void 0?void 0:i.get(m),b;if(u)b=r.renderer.patch(u.vnode,a,u.node,r),s.add(u.index);else b=r.renderer.mount(a,r);let F=e.childNodes[c]??null;if(b!==F)e.insertBefore(b,F)}),o.forEach((a)=>{if(!a.node||s.has(a.index))return;if(r.renderer.unmount(a.vnode,a.node,r),a.node.parentNode===e)e.removeChild(a.node)})}hasOnlyKeyedChildren(e,t){return[...e,...t].every((n)=>this.getVNodeKey(n)!==void 0)}assertNoDuplicateKeys(e){let t=new Set;e.forEach((n)=>{let r=this.getVNodeKey(n);if(r===void 0)return;if(t.has(r))throw Error(`Duplicate key "${r}"`);t.add(r)})}getVNodeKey(e){if(typeof e==="string")return;return e.key}collectListeners(e){let t={};return Object.entries(e.props??{}).forEach(([n,r])=>{if(L(n)&&typeof r==="function")t[ee(n)]=r}),{...t,...e.listeners??{}}}updateListeners(e,t,n){let r=this.listeners.get(e)??new Map,o=new Set(Object.keys(t)),i=new Set(Object.keys(n));o.forEach((s)=>{if(!i.has(s)||t[s]!==n[s]){let a=r.get(s);if(a)e.removeEventListener(a.eventName,a.listener),r.delete(s)}}),i.forEach((s)=>{if(!o.has(s)||t[s]!==n[s]){let{eventName:a,modifiers:c}=te(s),m=ne(n[s],c);e.addEventListener(a,m),r.set(s,{eventName:a,listener:m})}}),this.listeners.set(e,r)}setupReactiveAttribute(e,t,n,r){let o=g(()=>{e.setAttribute(t,r.templateEngine.evaluateTemplateValue(n))});this.trackEffect(e,o)}trackEffect(e,t){let n=this.effects.get(e)??new Set;n.add(t),this.effects.set(e,n)}}function P(e){if(e.startsWith("data")&&e.length>4)return`data${e.slice(4).replace(/[A-Z]/g,(t)=>`-${t.toLowerCase()}`)}`;if(e==="tabIndex"||e==="colSpan"||e==="htmlFor")return e.toLowerCase();return e}class S{strategies;constructor(){this.strategies=[new ie,new se,new ae,new N]}mount(e,t){return this.findStrategy(e).mount(e,t)}patch(e,t,n,r){let o=this.findStrategy(e),i=this.findStrategy(t);if(o!==i){let s=i.mount(t,r);return n.parentNode?.replaceChild(s,n),o.unmount(e,n,r),s}return o.patch(e,t,n,r)}unmount(e,t,n){this.findStrategy(e).unmount(e,t,n)}findStrategy(e){let t=this.strategies.find((n)=>n.matches(e));if(!t)throw Error("No render strategy found for vnode");return t}}class ie{matches(e){return typeof e==="string"}mount(e,t){return t.templateEngine.parseTemplate(e)}patch(e,t,n,r){if(e===t)return n;let o=this.mount(t,r);return n.parentNode?.replaceChild(o,n),o}unmount(){}}class se{instances=new WeakMap;instanceNodes=new Map;emitterUnsubscribers=new WeakMap;matches(e){return typeof e==="object"&&e!==null&&z(e)}mount(e,t){if(e.directions?.if===!1)return document.createComment("if");let r=new e.component(this.createProps(e));if(t.appContext&&r.setAppContext)r.setAppContext(t.appContext);this.syncEmitters(r,e.emitters??{}),t.registerChild(r);let o=r.mountToNode();return this.trackInstanceNode(r,o),r.setElementChangeListener?.((i,s)=>{this.trackInstanceNode(r,i),this.trackInstanceNode(r,s)}),o}patch(e,t,n,r){if(n.nodeType===Node.COMMENT_NODE){let s=this.mount(t,r);return n.parentNode?.replaceChild(s,n),s}if(t.directions?.if===!1){let s=document.createComment("if");return n.parentNode?.replaceChild(s,n),this.unmount(e,n,r),s}let o=this.instances.get(n);if(o&&e.component===t.component){this.syncEmitters(o,t.emitters??{}),o.setProps(this.createProps(t));let s=o.getElement()??n;return this.trackInstanceNode(o,s),s}let i=this.mount(t,r);return n.parentNode?.replaceChild(i,n),this.unmount(e,n,r),i}unmount(e,t,n){let r=this.instances.get(t);if(r)this.clearEmitters(r),r.unmount(),this.clearInstanceNodes(r),n.unregisterChild(r)}createProps(e){return{...e.props??{},children:v(e.children)}}syncEmitters(e,t){let n=this.emitterUnsubscribers.get(e)??new Map;n.forEach(({listener:r,unsubscribe:o},i)=>{let s=t[i];if(!s||s!==r)o(),n.delete(i)}),Object.entries(t).forEach(([r,o])=>{if(n.get(r)?.listener===o)return;n.set(r,{listener:o,unsubscribe:e.on(r,o)})}),this.emitterUnsubscribers.set(e,n)}clearEmitters(e){this.emitterUnsubscribers.get(e)?.forEach(({unsubscribe:t})=>{t()}),this.emitterUnsubscribers.delete(e)}trackInstanceNode(e,t){this.instances.set(t,e);let n=this.instanceNodes.get(e)??new Set;n.add(t),this.instanceNodes.set(e,n)}clearInstanceNodes(e){this.instanceNodes.get(e)?.forEach((t)=>{this.instances.delete(t)}),this.instanceNodes.delete(e)}}class ae{renderedChildren=new WeakMap;matches(e){return typeof e==="object"&&e!==null&&Q(e)}mount(e,t){if(e.directions?.if===!1)return document.createComment("if");let n=document.createElement("div");return n.setAttribute("data-slot",e.props.name),this.mountSlotChildren(n,this.resolveChildren(e,t),t),n}patch(e,t,n,r){if(n.nodeType===Node.COMMENT_NODE){let o=this.mount(t,r);return n.parentNode?.replaceChild(o,n),o}if(t.directions?.if===!1){let o=document.createComment("if");return n.parentNode?.replaceChild(o,n),this.unmount(e,n,r),o}if(n instanceof HTMLElement)n.setAttribute("data-slot",t.props.name),this.replaceSlotChildren(n,e,t,r);return n}unmount(e,t,n){if(!(t instanceof HTMLElement))return;this.unmountSlotChildren(t,n),this.renderedChildren.delete(t)}resolveChildren(e,t){return t.slots[e.props.name]??v(e.children)}replaceSlotChildren(e,t,n,r){let o=this.renderedChildren.get(e)??[],i=this.resolveChildren(n,r),s=Math.min(o.length,i.length);for(let a=0;a<s;a+=1){let c=e.childNodes[a];if(!c){e.appendChild(r.renderer.mount(i[a],r));continue}r.renderer.patch(o[a],i[a],c,r)}for(let a=s;a<i.length;a+=1)e.appendChild(r.renderer.mount(i[a],r));for(let a=o.length-1;a>=i.length;a-=1){let c=e.childNodes[a];if(c){if(r.renderer.unmount(o[a],c,r),c.parentNode===e)e.removeChild(c)}}this.renderedChildren.set(e,i)}mountSlotChildren(e,t,n){t.forEach((r)=>{e.appendChild(n.renderer.mount(r,n))}),this.renderedChildren.set(e,t)}unmountSlotChildren(e,t){(this.renderedChildren.get(e)??[]).forEach((r,o)=>{let i=e.childNodes[o];if(i)t.renderer.unmount(r,i,t)})}}class C{state;bindings=[];templateRegex=/{{(.*?)}}/g;constructor(e){this.state=e;if(!e||typeof e!=="object")throw Error("TemplateEngine requires a valid state object")}parseTemplate(e){if(typeof e!=="string")e=String(e);let t=document.createTextNode("");this.templateRegex.lastIndex=0;let n=Array.from(e.matchAll(this.templateRegex));if(n&&n.length>0)this.setupReactiveBindings(t,e,n);else t.textContent=e;return t}setupReactiveBindings(e,t,n){let r=new Set,o=this.evaluateTemplate(t,n,r);e.textContent=o;let i=g(()=>{try{let s=this.evaluateTemplate(t,n,r);if(e.textContent!==s)e.textContent=s}catch(s){console.error("Template update error:",s),e.textContent=`Error: ${s instanceof Error?s.message:"Unknown error"}`}});this.bindings.push({node:e,originalText:t,effect:i})}evaluateTemplate(e,t,n){let r=e;return t.forEach((o)=>{let i=o[1]?.trim();if(i){n.add(i);let s=this.getValueFromState(i),a=s===void 0||s===null?"":String(s);r=r.replace(o[0],a)}}),r}getValueFromState(e){if(!e)return;let t=e.split("."),n=this.state;for(let r of t){if(!n||typeof n!=="object")return;n=n[r]}return n}clearBindings(){this.bindings.forEach((e)=>{y(e.effect)}),this.bindings=[]}getBindingCount(){return this.bindings.length}hasExpressions(e){return this.templateRegex.lastIndex=0,this.templateRegex.test(e)}extractKeys(e){let t=[],n,r=new RegExp(this.templateRegex,"g");while((n=r.exec(e))!==null){let o=n[1]?.trim();if(o)t.push(o)}return t}evaluateTemplateValue(e){this.templateRegex.lastIndex=0;let t=Array.from(e.matchAll(this.templateRegex));if(!t||t.length===0)return e;let n=new Set;return this.evaluateTemplate(e,t,n)}}class M{props;vnode=null;el=null;renderer=new S;templateEngine;childComponents=new Set;eventListeners={};providers=new Map;updateEffect;appContext=null;parentComponent=null;elementChangeListener=null;styleManager;state;mounted=!1;constructor(e={}){this.props=e;this.styleManager=new pe,this.state=V(this.initState()??{}),this.templateEngine=new C(this.state),this.initStyles(),this.updateEffect=g(()=>{if(this.mounted)try{this.update()}catch(t){if(!this.dispatchError(t))throw t}},{throwOnError:!0,scheduler:(t)=>{E.enqueue(t)}})}mount(e){if(!e||!(e instanceof HTMLElement))throw Error("Invalid container element");try{e.appendChild(this.mountToNode())}catch(t){throw console.error("组件渲染错误:",t),t}}mountToNode(){if(this.mounted&&this.el)return this.el;return this.beforeMount(),this.el=f.getInstance().runWithEffect(this.updateEffect,()=>{try{return this.vnode=this.render(),this.renderer.mount(this.vnode,this.createRenderContext())}catch(e){if(this.dispatchError(e))return document.createComment("error-boundary");throw e}}),this.mounted=!0,this.onMounted(),this.el}update(){if(!this.el||!this.vnode)return;this.beforeUpdate();let e=this.vnode,t=this.el;if(this.el=f.getInstance().runWithEffect(this.updateEffect,()=>{let n=this.render(),r=this.renderer.patch(e,n,t,this.createRenderContext());return this.vnode=n,r}),t!==this.el)this.elementChangeListener?.(t,this.el);this.onUpdated()}unmount(){if(!this.mounted)return;if(this.beforeUnmount(),this.vnode&&this.el)this.renderer.unmount(this.vnode,this.el,this.createRenderContext());if(this.childComponents.clear(),Object.keys(this.eventListeners).forEach((e)=>{this.eventListeners[e].clear(),delete this.eventListeners[e]}),this.providers.clear(),this.parentComponent=null,this.elementChangeListener=null,this.templateEngine.clearBindings(),this.styleManager.destroy(),y(this.updateEffect),this.el?.parentNode)this.el.parentNode.removeChild(this.el);this.el=null,this.vnode=null,this.mounted=!1,this.onUnmounted()}setProps(e){if(this.props={...this.props,...e},this.mounted)E.enqueue(this.updateEffect)}setState(e){Object.assign(this.state,e)}setAppContext(e){this.appContext=e,this.childComponents.forEach((t)=>{t.setAppContext?.(e)})}setParentComponent(e){this.parentComponent=e}getParentComponent(){return this.parentComponent}setElementChangeListener(e){this.elementChangeListener=e}provide(e,t){this.providers.set(e,t)}inject(e,t){let n=this.resolveInjection(e);return n.found?n.value:t}resolveInjection(e){if(this.providers.has(e))return{found:!0,value:this.providers.get(e)};if(this.parentComponent?.resolveInjection)return this.parentComponent.resolveInjection(e);return this.resolveAppInjection(e)}getElement(){return this.el}beforeMount(){}onMounted(){}beforeUpdate(){}onUpdated(){}beforeUnmount(){}onUnmounted(){}dispatchError(e){let t=this.getParentComponent();while(t){let n=t;if(typeof n.onErrorCaptured==="function"){if(n.onErrorCaptured(e,this)===!1)return!0}t=t.getParentComponent?.()??null}return!1}getContext(){return this.appContext}get router(){return this.getRouterFrom(this.appContext)??this.getRouterFromGlobalApp()}emit(e,...t){this.eventListeners[e]?.forEach((n)=>{n(...t)})}on(e,t){if(!this.eventListeners[e])this.eventListeners[e]=new Set;return this.eventListeners[e].add(t),()=>this.off(e,t)}off(e,t){this.eventListeners[e]?.delete(t)}createRenderContext(){return{appContext:this.appContext,templateEngine:this.templateEngine,renderer:this.renderer,slots:this.collectSlots(),registerChild:(e)=>{this.childComponents.add(e),e.setParentComponent?.(this),e.setAppContext?.(this.appContext)},unregisterChild:(e)=>{this.childComponents.delete(e),e.setParentComponent?.(null)}}}collectSlots(){let e={default:[]};return v(this.props.children).forEach((n)=>{let r=this.getSlotName(n);if(!e[r])e[r]=[];e[r].push(this.normalizeSlotChild(n))}),e}getSlotName(e){if(typeof e==="string")return"default";return"slot"in e&&typeof e.slot==="string"?e.slot:"default"}normalizeSlotChild(e){if(typeof e==="string"||!("slot"in e))return e;let t={...e};return delete t.slot,t}getRouterFrom(e){if(!e||typeof e!=="object"||!("router"in e))return;return e.router}getRouterFromGlobalApp(){let e=globalThis.__APP__;return this.getRouterFrom(e)}resolveAppInjection(e){if(!this.appContext||typeof this.appContext!=="object")return{found:!1,value:void 0};return this.appContext.app?.resolveInjection?.(e)??{found:!1,value:void 0}}}var U=null;function ce(e){if(!e||!(e instanceof A))throw Error("Invalid router instance");U=e}function Te(){if(!U)throw Error("Router is not initialized. Please make sure you have installed the router plugin.");return U}function x(e){if(!e.startsWith("/"))return`/${e}`;return e||"/"}function I(e,t){let n=x(t.split("?")[0]);for(let i of e){if(i.path==="*")continue;let s=we(i.path,n);if(s)return{route:i,params:s}}let r=e.find((i)=>i.path==="*");if(r)return{route:r,params:{pathMatch:n}};let o=e.find((i)=>i.path==="/");return o?{route:o,params:{}}:null}function we(e,t){let n=ue(e),r=ue(t);if(n.length!==r.length)return null;let o={};for(let i=0;i<n.length;i+=1){let s=n[i],a=r[i];if(s.startsWith(":")){let c=s.slice(1);if(!c)return null;o[decodeURIComponent(c)]=decodeURIComponent(a);continue}if(s!==a)return null}return o}function ue(e){let t=x(e);if(t==="/")return[];return t.split("/").filter(Boolean)}function le(e,t,n){let r=x(e),o=n==="/"?r:n+r;return t==="hash"?`#${o}`:o}function de(e,t){let n,r,o;if(e==="history")r=window.location.pathname+window.location.search,n=window.location.pathname,o=window.location.search;else{r=window.location.hash||"#/",n=r.startsWith("#")?r.slice(1):r;let s=n.indexOf("?");o=s>=0?n.slice(s+1):"",n=s>=0?n.slice(0,s):n}if(n.startsWith(t)&&t!=="/"&&n!=="/")n=n.slice(t.length);return n=x(n),{path:n,fullPath:r,query:Se(o),params:{}}}function K(e,t,n,r){let o=x(e),i=r==="/"?o:r+o;if(n==="history"){if(t)window.history.replaceState({},"",i);else window.history.pushState({},"",i);return}if(t){let s=window.location.href.split("#")[0];window.location.replace(`${s}#${i}`);return}window.location.hash=i}function Se(e){let t={},n=e.startsWith("?")?e.slice(1):e;if(!n)return t;return n.split("&").forEach((r)=>{let[o,i]=r.split("=");if(o)t[decodeURIComponent(o)]=i?decodeURIComponent(i):""}),t}function Me(e){let t=e.indexOf("?");if(t<0)return{};let n=e.slice(t+1),r={};if(!n)return r;return n.split("&").forEach((o)=>{let[i,s]=o.split("=");if(i)r[decodeURIComponent(i)]=s?decodeURIComponent(s):""}),r}class A{currentRoute=null;currentLocation=null;routes=[];app=null;mode;base;routeChangeListeners=[];beforeGuards=[];afterHooks=[];removeWindowListener;constructor(e){let t=Array.isArray(e)?{routes:e}:e;this.routes=t.routes||[],this.mode=t.mode||"history",this.base=t.base||"/",this.validateRoutes(),this.initEvents(),this.resolveCurrentRoute()}install(e){this.app=e,e.router=this,ce(this);let t=e.getContext();t.router=this,this.resolveCurrentRoute()}push(e){this.navigate(e,!1)}replace(e){this.navigate(e,!0)}forward(){window.history.forward()}back(){window.history.back()}go(e){window.history.go(e)}getCurrentRoute(){if(!this.currentLocation)this.resolveCurrentRoute();return this.currentLocation}getCurrentRouteRecord(){if(!this.currentRoute)this.resolveCurrentRoute();return this.currentRoute}onRouteChange(e){return this.routeChangeListeners.push(e),()=>{let t=this.routeChangeListeners.indexOf(e);if(t>-1)this.routeChangeListeners.splice(t,1)}}beforeEach(e){return this.beforeGuards.push(e),()=>{let t=this.beforeGuards.indexOf(e);if(t>-1)this.beforeGuards.splice(t,1)}}afterEach(e){return this.afterHooks.push(e),()=>{let t=this.afterHooks.indexOf(e);if(t>-1)this.afterHooks.splice(t,1)}}getRoutes(){return[...this.routes]}addRoute(e){if(this.routes.some((n)=>n.path===e.path))throw Error(`Route already exists: ${e.path}`);if(this.routes.push(e),this.getCurrentLocation().path===e.path)this.handleRouteChange()}createHref(e){return le(e,this.mode,this.base)}destroy(){if(this.removeWindowListener?.(),this.removeWindowListener=void 0,this.app?.router===this)this.app.router=void 0;this.app=null}navigate(e,t){if(!e||typeof e!=="string")throw Error("Path must be a non-empty string");let n=this.currentLocation,r=this.resolveTarget(e);if(!r)return;let o=r.location;for(let i of this.beforeGuards){let s=i(o,n);if(s===!1)return;if(typeof s==="string"&&s!==e){this.navigate(s,t);return}}if(n&&this.isSameLocation(n,o))return;K(r.path,t,this.mode,this.base),this.currentRoute=r.route,this.currentLocation=o,this.triggerRouteChangeListeners(o,n),this.afterHooks.forEach((i)=>{try{i(o,n)}catch(s){console.error("Route afterEach error:",s)}})}resolveTarget(e){let t=I(this.routes,e.split("?")[0]);if(!t)return null;let n=this.applyRedirect(t),r=n?.path??e,o=n?.route??t.route;return{path:r,route:o,location:{path:r.split("?")[0],query:Me(r),params:n?.params??t.params,fullPath:r,name:o?.name,meta:o?.meta}}}applyRedirect(e){let t=new Set,n=e,r="";while(n.route.redirect){if(t.has(n.route.path))throw Error(`Redirect loop detected for route: ${n.route.path}`);t.add(n.route.path),r=n.route.redirect;let o=I(this.routes,r.split("?")[0]);if(!o)return null;n=o}return r?{route:n.route,params:n.params,path:r}:null}validateRoutes(){if(!Array.isArray(this.routes))throw Error("Router routes must be an array");let e=new Set;this.routes.forEach((t)=>{if(!t.component&&!t.redirect)throw Error(`Route ${t.path} must define a component or redirect`);if(e.has(t.path))throw Error(`Duplicate route path: ${t.path}`);e.add(t.path)})}initEvents(){if(typeof window>"u")return;let e=this.mode==="history"?"popstate":"hashchange",t=()=>{this.handleRouteChange()};window.addEventListener(e,t),this.removeWindowListener=()=>{window.removeEventListener(e,t)}}handleRouteChange(){let e=this.currentLocation,t=this.resolveCurrentRoute();if(!this.isSameLocation(e,t))this.triggerRouteChangeListeners(t,e)}resolveCurrentRoute(){let e=this.getCurrentLocation(),t=I(this.routes,e.path),n=t?this.applyRedirect(t):null,r=n?.route??t?.route??null;if(n&&n.path!==e.path)K(n.path,!0,this.mode,this.base);return this.currentRoute=r,this.currentLocation={...e,params:n?.params??t?.params??{},name:r?.name,meta:r?.meta},this.currentLocation}getCurrentLocation(){return de(this.mode,this.base)}isSameLocation(e,t){return e?.fullPath===t?.fullPath&&e?.name===t?.name}triggerRouteChangeListeners(e,t){this.routeChangeListeners.forEach((n)=>{try{n(e,t)}catch(r){console.error("Route change listener error:",r)}})}}class Le extends M{unsubscribe;initState(){return{currentPath:this.router?.getCurrentRoute()?.path??window.location.pathname}}initStyles(){}onMounted(){let e=this.router;this.unsubscribe=e?.onRouteChange((t)=>{this.state.currentPath=t.path})}onUnmounted(){this.unsubscribe?.()}render(){let e=this.router,t=this.props.activeClass??"active",n=this.state.currentPath===this.props.to,r=[this.props.className,n?t:void 0].filter(Boolean).join(" ");return{tag:"a",props:{href:e?.createHref(this.props.to)??this.props.to,className:r},listeners:{click:(o)=>{if(o.preventDefault(),this.props.replace)e?.replace(this.props.to);else e?.push(this.props.to)}},children:this.props.children&&this.props.children.length>0?this.props.children:[this.props.to]}}}class Pe extends M{unsubscribe;initState(){let e=this.router;return{route:e?.getCurrentRoute()??null,record:e?.getCurrentRouteRecord()??null}}initStyles(){}onMounted(){let e=this.router;this.unsubscribe=e?.onRouteChange((t)=>{this.state.route=t,this.state.record=e.getCurrentRouteRecord()})}onUnmounted(){this.unsubscribe?.()}render(){let e=this.state.record??this.router?.getCurrentRouteRecord();return{tag:"div",props:{"data-router-view":""},children:e?.component?[{component:e.component}]:[]}}}function On(e){return new A(e)}var Ne=new Set(["base","link","meta"]);function he(e){let t=e.lang??"en",n=e.charset??"utf-8",r=e.viewport??"width=device-width, initial-scale=1",o=k({lang:t,...e.htmlAttributes??{}}),i=k(e.bodyAttributes),s=Ae(e.body);return["<!doctype html>",`<html${o}>`,"<head>",` <meta charset="${T(n)}">`,` <meta name="viewport" content="${T(r)}">`,` <title>${T(e.title)}</title>`,e.description?` <meta name="description" content="${T(e.description)}">`:"",...(e.head??[]).map((a)=>` ${Ie(a)}`),e.styles&&e.styles.length>0?` <style>${W(e.styles)}</style>`:"","</head>",`<body${i}>`,s,...(e.scripts??[]).map((a)=>` ${ke(a)}`),"</body>","</html>"].filter((a)=>a!=="").join(`
|
|
2
|
+
`)}function Ae(e){if(typeof document>"u")throw Error("renderHtmlDocument requires a DOM-like document");let t=document.createElement("div"),n=new S,r=new Set,o=Array.isArray(e)?e:[e],i={templateEngine:new C({}),renderer:n,slots:{default:[]},registerChild:(a)=>{r.add(a)},unregisterChild:(a)=>{r.delete(a)}};o.forEach((a)=>{t.appendChild(n.mount(a,i))});let s=t.innerHTML;return r.forEach((a)=>{a.unmount()}),s}function Ie(e){let t=k(e.attributes);if(Ne.has(e.tag)&&!e.text)return`<${e.tag}${t}>`;return`<${e.tag}${t}>${T(e.text??"")}</${e.tag}>`}function ke(e){return`<script${k({type:e.type,src:e.src,async:e.async,defer:e.defer,...e.attributes??{}})}></script>`}function k(e={}){let t=Object.entries(e).flatMap(([n,r])=>{if(r===!1||r===null||r===void 0)return[];return r===!0?[n]:[`${n}="${T(String(r))}"`]}).join(" ");return t?` ${t}`:""}function T(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}var fe="#app";class He{options;container=null;rootInstance=null;mounted=!1;templateEngine=null;appContext;providers=new Map;plugins=[];unmountedCallback;router;constructor(e={}){this.options=e;this.appContext={app:this,version:"0.1.2",config:e.config||{}}}handleError(e){console.error("应用错误:",e),this.renderErrorUI(e)}renderErrorUI(e){if(!this.container)return;this.container.innerHTML=`
|
|
3
|
+
<div style="padding: 20px; background-color: #ffebee; color: #c62828; font-family: Arial, sans-serif;">
|
|
4
|
+
<h3>应用错误</h3>
|
|
5
|
+
<p>${e.message}</p>
|
|
6
|
+
<pre style="background-color: #fff; padding: 10px; border-radius: 4px; overflow: auto;">${e.stack}</pre>
|
|
7
|
+
</div>
|
|
8
|
+
`}use(e,...t){if(typeof e.install!=="function")throw Error("插件必须提供 install 方法");return e.install(this,...t),this.plugins.push({plugin:e,args:t}),this}mount(){if(this.mounted){console.warn("应用已经处于运行状态");return}let e=this.resolveMountContainer();if(!e)return;try{if(this.container=e,globalThis.__APP__=this,this.options.root){if(this.rootInstance=new this.options.root(this.options.rootProps),"setAppContext"in this.rootInstance)this.rootInstance.setAppContext(this.appContext);if(this.options.state&&"setState"in this.rootInstance)this.rootInstance.setState(this.options.state);this.rootInstance.mount(this.container),this.templateEngine=new C(this.options.state||{})}this.mounted=!0,this.onMounted()}catch(t){this.handleError(t)}}unmount(){if(!this.mounted){console.warn("应用未处于运行状态");return}try{if(this.onBeforeUnmount(),this.rootInstance){if("unmount"in this.rootInstance)this.rootInstance.unmount();this.rootInstance=null,this.mounted=!1,delete globalThis.__APP__}if(this.templateEngine)this.templateEngine.clearBindings(),this.templateEngine=null;if(this.container)this.container.innerHTML="";if(this.unmountedCallback)this.unmountedCallback()}catch(e){console.error("Failed to unmount app:",e)}}isRunning(){return this.mounted}updateRootComponent(e){if(this.mounted)this.unmount();this.options.root=e,this.mount()}update(e){if(!this.mounted)return console.warn("Cannot update unmounted app"),this;try{if(e&&this.options.state){if(this.options.state={...this.options.state,...e},this.rootInstance&&"setState"in this.rootInstance)this.rootInstance.setState(e);if(this.templateEngine)this.templateEngine.state=this.options.state}this.onUpdated()}catch(t){console.error("Failed to update app:",t)}return this}getContext(){return this.appContext}provide(e,t){return this.providers.set(e,t),this}inject(e,t){let n=this.resolveInjection(e);return n.found?n.value:t}resolveInjection(e){if(!this.providers.has(e))return{found:!1,value:void 0};return{found:!0,value:this.providers.get(e)}}getState(){return this.options.state}setState(e){if(this.options.state=e,this.mounted)this.update();return this}onUnmounted(e){return this.unmountedCallback=e,this}renderHtmlDocument(e={}){let t=this.options.document??{},n=this.mergeDocumentScripts(t.scripts,e.scripts);return he({...t,...e,title:e.title??t.title??"TransOne App",body:e.body??t.body??this.createMountDocumentBody(),scripts:n})}resolveRootElement(e){if(!e)return null;if(typeof e==="string"){if(typeof document>"u")return null;return document.querySelector(e)}return typeof Element<"u"&&e instanceof Element?e:null}resolveMountContainer(){if(typeof document>"u")return null;let e=this.resolveRootElement(this.options.rootElement??fe);return e instanceof HTMLElement?e:null}createMountDocumentBody(){let e=this.options.rootElement??fe;if(typeof e==="string")return this.createMountElementFromSelector(e);if(typeof Element<"u"&&e instanceof Element){let t={};if(e.id)t.id=e.id;if(e.className)t.className=e.className;return{tag:e.tagName.toLowerCase(),props:t}}return w({props:{id:"app"}})}createMountElementFromSelector(e){if(e.startsWith("#")&&e.length>1)return w({props:{id:e.slice(1)}});if(e.startsWith(".")&&e.length>1)return w({props:{className:e.slice(1)}});return w({props:{"data-transone-root":e}})}mergeDocumentScripts(e,t){if(!e&&!t)return;return[...e??[],...t??[]]}onMounted(){this.plugins.forEach(({plugin:e})=>{if(e&&typeof e.onMounted==="function")e.onMounted(this)})}onUpdated(){this.plugins.forEach(({plugin:e})=>{if(e&&typeof e.onUpdated==="function")e.onUpdated(this)})}onBeforeUnmount(){this.plugins.forEach(({plugin:e})=>{if(e&&typeof e.onBeforeUnmount==="function")e.onBeforeUnmount(this)})}}
|
|
9
|
+
export{E as a,Ke as b,We as c,f as d,V as e,Fe as f,g,Ge as h,qe as i,q as j,ze as k,y as l,Ye as m,ge as n,Qe as o,v as p,z as q,Y as r,Q as s,Je as t,ve as u,w as v,Xe as w,et as x,tt as y,nt as z,rt as A,ot as B,it as C,st as D,at as E,pt as F,ct as G,ut as H,lt as I,dt as J,ht as K,ft as L,mt as M,gt as N,vt as O,yt as P,Rt as Q,Ct as R,bt as S,Et as T,xt as U,Tt as V,wt as W,St as X,Mt as Y,Lt as Z,Pt as _,Nt as $,At as aa,It as ba,kt as ca,Ht as da,jt as ea,Ot as fa,Vt as ga,Bt as ha,_t as ia,Dt as ja,ye as ka,Z as la,Re as ma,D as na,N as oa,S as pa,ie as qa,se as ra,ae as sa,C as ta,M as ua,he as va,He as wa,Te as xa,A as ya,Le as za,Pe as Aa,On as Ba};
|
|
10
|
+
|
|
11
|
+
//# debugId=844BDC187ADAE76D64756E2164756E21
|
|
12
|
+
//# sourceMappingURL=index-2h18qzcx.js.map
|
|
@@ -5,21 +5,21 @@
|
|
|
5
5
|
"export interface ReactiveEffect<T = unknown> {\n (): T | undefined;\n deps: Set<ReactiveEffect>[];\n id: number;\n active: boolean;\n scheduler?: (effect: ReactiveEffect) => void;\n}\n\nexport interface ReactiveEffectOptions {\n lazy?: boolean;\n scheduler?: (effect: ReactiveEffect) => void;\n throwOnError?: boolean;\n}\n\nexport interface ComputedRef<T> {\n readonly value: T;\n}\n\nexport const IS_REACTIVE = Symbol('is_reactive');\nexport const IS_READONLY = Symbol('is_readonly');\nexport const IS_REF = Symbol('is_ref');\n\nexport interface Ref<T = unknown> {\n value: T;\n}\n\nexport const MUTATING_ARRAY_METHODS = [\n 'push',\n 'pop',\n 'shift',\n 'unshift',\n 'splice',\n 'sort',\n 'reverse',\n] as const;\n\nexport function hasReactiveFlag(\n value: object,\n flag: typeof IS_REACTIVE | typeof IS_READONLY\n): boolean {\n return Boolean(Reflect.get(value, flag));\n}\n\nexport function isObject(value: unknown): value is object {\n return value !== null && typeof value === 'object';\n}\n",
|
|
6
6
|
"import type { ReactiveEffect } from './types';\n\n/**\n * 响应式 effect 批处理调度器。\n *\n * 同一批同步状态变更(同一个任务内的多次 mutation)只会触发一次 effect\n * 运行:effect 被 enqueue 后去重入队,并在微任务中统一冲刷(flush)。\n * 冲刷期间的重复入队会在同一轮循环中继续处理,直到队列清空。\n *\n * 组件渲染通过该调度器合并更新:连续修改 state 不会逐次重渲染,\n * 与 Vue 微任务调度 / React 自动批处理的语义一致。\n */\nexport class ReactiveScheduler {\n private readonly pending = new Set<ReactiveEffect>();\n private flushing = false;\n private flushPromise: Promise<void> | null = null;\n private flushResolve: (() => void) | null = null;\n\n /**\n * 将 effect 加入待冲刷队列(去重)。\n */\n public enqueue(effect: ReactiveEffect): void {\n if (this.pending.has(effect)) {\n return;\n }\n this.pending.add(effect);\n if (!this.flushing) {\n queueMicrotask(() => this.flush());\n }\n }\n\n /**\n * 同步冲刷队列:立即执行所有待运行的 effect。\n * 若当前正处于一次冲刷中(例如在 effect 内部调用),则直接返回,\n * 由正在进行的冲刷循环负责处理新增任务。\n */\n public flush(): void {\n if (this.flushing) {\n return;\n }\n this.flushing = true;\n try {\n while (this.pending.size > 0) {\n const batch = Array.from(this.pending);\n this.pending.clear();\n for (const effect of batch) {\n if (effect.active) {\n effect();\n }\n }\n }\n } finally {\n this.flushing = false;\n const resolve = this.flushResolve;\n this.flushResolve = null;\n this.flushPromise = null;\n resolve?.();\n }\n }\n\n /**\n * 返回一个在待冲刷的 effect 全部执行完成后 resolve 的 Promise。\n * 若当前没有待冲刷任务,立即 resolve。\n */\n public nextTick(): Promise<void> {\n if (!this.flushing && this.pending.size === 0) {\n return Promise.resolve();\n }\n if (this.flushPromise) {\n return this.flushPromise;\n }\n this.flushPromise = new Promise<void>((resolve) => {\n this.flushResolve = resolve;\n });\n return this.flushPromise;\n }\n}\n",
|
|
7
7
|
"import {\n ComputedRef,\n IS_REACTIVE,\n IS_REF,\n IS_READONLY,\n MUTATING_ARRAY_METHODS,\n Ref,\n ReactiveEffect,\n ReactiveEffectOptions,\n hasReactiveFlag,\n isObject,\n} from './reactive/types';\nimport { ReactiveScheduler } from './reactive/scheduler';\n\nexport type {\n ComputedRef,\n Ref,\n ReactiveEffect,\n ReactiveEffectOptions,\n} from './reactive/types';\n\nlet effectId = 0;\n\n// 全局批处理调度器:组件渲染等场景通过它合并同一批同步状态变更\nexport const reactiveScheduler = new ReactiveScheduler();\n\n/**\n * 等待当前批次的响应式 effect 全部执行完成(通常是组件重渲染)。\n * 修改 state 后需要立即读取 DOM 时使用:await nextTick()。\n */\nexport function nextTick(): Promise<void> {\n return reactiveScheduler.nextTick();\n}\n\n/**\n * 同步冲刷待执行的响应式 effect,立即完成组件重渲染。\n * 一般仅测试或需要同步读 DOM 的场景使用。\n */\nexport function flushSync(): void {\n reactiveScheduler.flush();\n}\n\n// 响应式系统\nexport class ReactiveSystem {\n private static instance: ReactiveSystem;\n private activeEffect: ReactiveEffect | null = null;\n private readonly effectStack: ReactiveEffect[] = [];\n private targetMap = new WeakMap<\n object,\n Map<string | symbol, Set<ReactiveEffect>>\n >();\n private reactiveMap = new WeakMap<object, object>();\n private readonlyMap = new WeakMap<object, object>();\n /** 反向映射:响应式代理 -> 原始对象,供 toRawValue 反查 */\n private proxyMap = new WeakMap<object, object>();\n\n private constructor() {}\n\n public static getInstance(): ReactiveSystem {\n if (!ReactiveSystem.instance) {\n ReactiveSystem.instance = new ReactiveSystem();\n }\n return ReactiveSystem.instance;\n }\n\n public reactive<T extends object>(target: T): T {\n // 检查输入参数\n if (!isObject(target)) {\n console.warn('reactive: target must be an object');\n return target;\n }\n\n // 如果传入的是已经是响应式对象,直接返回\n if (isReactive(target)) {\n return target;\n }\n\n // 如果目标已经有对应的响应式对象,返回已存在的代理\n if (this.reactiveMap.has(target)) {\n return this.reactiveMap.get(target) as T;\n }\n\n // 优化数组处理\n if (Array.isArray(target)) {\n return this.createReactiveArray(target);\n }\n\n // 普通对象处理\n const proxy = new Proxy(target, {\n get: (target, key: string | symbol) => {\n // 处理响应式标记的特殊属性\n if (key === IS_REACTIVE) {\n return true;\n }\n if (key === IS_READONLY) {\n return false;\n }\n\n // 收集依赖\n this.track(target, key);\n\n const value = Reflect.get(target, key);\n\n // 如果是对象,递归转换为响应式\n if (isObject(value) && !hasReactiveFlag(value, IS_READONLY)) {\n return this.reactive(value);\n }\n return value;\n },\n set: (target, key: string | symbol, value) => {\n // 检查是否是只读的\n if (hasReactiveFlag(target, IS_READONLY)) {\n console.warn(`Cannot set property ${String(key)} on readonly object`);\n return false;\n }\n\n const oldValue = Reflect.get(target, key);\n\n // 如果新值是对象,转换为响应式\n if (\n isObject(value) &&\n !hasReactiveFlag(value, IS_REACTIVE) &&\n !hasReactiveFlag(value, IS_READONLY)\n ) {\n value = this.reactive(value);\n }\n\n const result = Reflect.set(target, key, value);\n\n // 只有当值真正改变时才触发更新\n if (oldValue !== value) {\n this.trigger(target, key);\n }\n return result;\n },\n deleteProperty: (target, key: string | symbol) => {\n // 检查是否是只读的\n if (hasReactiveFlag(target, IS_READONLY)) {\n console.warn(\n `Cannot delete property ${String(key)} on readonly object`\n );\n return false;\n }\n\n const hadKey = key in target;\n const result = Reflect.deleteProperty(target, key);\n\n if (hadKey) {\n this.trigger(target, key);\n }\n return result;\n },\n });\n\n // 存储响应式对象的映射关系\n this.reactiveMap.set(target, proxy);\n this.proxyMap.set(proxy, target);\n return proxy;\n }\n\n /**\n * 将响应式代理反查为原始对象;非代理值原样返回。\n * 用于数组 includes/indexOf/lastIndexOf 的对比,让用户传入\n * 原始对象也能命中数组中的响应式元素。\n */\n private toRawValue(value: unknown): unknown {\n if (isObject(value) && this.proxyMap.has(value)) {\n return this.proxyMap.get(value);\n }\n return value;\n }\n\n /**\n * 创建响应式数组\n */\n private createReactiveArray<T extends unknown[]>(target: T): T {\n // 如果目标已经有对应的响应式对象,返回已存在的代理\n if (this.reactiveMap.has(target)) {\n return this.reactiveMap.get(target) as T;\n }\n\n const proxy = new Proxy(target, {\n get: (target, key: string | symbol) => {\n // 处理响应式标记的特殊属性\n if (key === IS_REACTIVE) {\n return true;\n }\n if (key === IS_READONLY) {\n return false;\n }\n\n // 收集依赖\n this.track(target, key);\n\n const value = Reflect.get(target, key);\n\n // 搜索类方法:数组元素是响应式代理,需把参数与元素都转回原始值\n // 后再对比,保证 includes(rawObject) / indexOf(rawObject) 能命中。\n if (\n typeof key === 'string' &&\n (key === 'includes' || key === 'indexOf' || key === 'lastIndexOf')\n ) {\n // 数组内容(长度与索引)变化会改变搜索方法的返回结果\n this.track(target, 'length');\n for (let i = 0; i < target.length; i++) {\n this.track(target, String(i));\n }\n const method = value as (...methodArgs: unknown[]) => unknown;\n return (...args: unknown[]) => {\n const result = method.apply(target, args);\n if (result === false || result === -1) {\n const rawElements = target.map((item) => this.toRawValue(item));\n const fallbackMethod = rawElements[key] as (\n ...methodArgs: unknown[]\n ) => unknown;\n return fallbackMethod.apply(\n rawElements,\n args.map((arg) => this.toRawValue(arg))\n );\n }\n return result;\n };\n }\n\n // 处理数组的变异方法\n if (\n typeof key === 'string' &&\n MUTATING_ARRAY_METHODS.includes(\n key as (typeof MUTATING_ARRAY_METHODS)[number]\n )\n ) {\n return (...args: unknown[]) => {\n // 执行原始方法\n const arrayMethod = value as (...methodArgs: unknown[]) => unknown;\n const result = arrayMethod.apply(target, args);\n // 触发数组更新\n this.trigger(target, 'length');\n this.trigger(target, key);\n return result;\n };\n }\n\n if (isObject(value) && !hasReactiveFlag(value, IS_READONLY)) {\n return this.reactive(value);\n }\n\n return value;\n },\n set: (target, key: string | symbol, value) => {\n // 检查是否是只读的\n if (hasReactiveFlag(target, IS_READONLY)) {\n console.warn(`Cannot set property ${String(key)} on readonly object`);\n return false;\n }\n\n const oldValue = Reflect.get(target, key);\n\n // 如果新值是对象,转换为响应式\n if (\n isObject(value) &&\n !hasReactiveFlag(value, IS_REACTIVE) &&\n !hasReactiveFlag(value, IS_READONLY)\n ) {\n value = this.reactive(value);\n }\n\n const result = Reflect.set(target, key, value);\n\n // 只有当值真正改变时才触发更新\n if (oldValue !== value) {\n this.trigger(target, key);\n // 对于数组索引的修改,同时触发length的更新\n if (typeof key === 'string' && !isNaN(Number(key))) {\n this.trigger(target, 'length');\n }\n }\n return result;\n },\n deleteProperty: (target, key: string | symbol) => {\n // 检查是否是只读的\n if (hasReactiveFlag(target, IS_READONLY)) {\n console.warn(\n `Cannot delete property ${String(key)} on readonly object`\n );\n return false;\n }\n\n const hadKey = key in target;\n const result = Reflect.deleteProperty(target, key);\n\n if (hadKey) {\n this.trigger(target, key);\n // 对于数组,同时触发length的更新\n this.trigger(target, 'length');\n }\n return result;\n },\n });\n\n // 存储响应式对象的映射关系\n this.reactiveMap.set(target, proxy);\n this.proxyMap.set(proxy, target);\n return proxy;\n }\n\n public readonly<T extends object>(target: T): Readonly<T> {\n // 检查输入参数\n if (!isObject(target)) {\n console.warn('readonly: target must be an object');\n return target;\n }\n\n // 如果传入的是已经是只读响应式对象,直接返回\n if (hasReactiveFlag(target, IS_READONLY)) {\n return target as Readonly<T>;\n }\n\n // 如果目标已经有对应的只读响应式对象,返回已存在的代理\n if (this.readonlyMap.has(target)) {\n return this.readonlyMap.get(target) as Readonly<T>;\n }\n\n const proxy = new Proxy(target, {\n get: (target, key: string | symbol) => {\n // 处理响应式标记的特殊属性\n if (key === IS_REACTIVE) {\n return false;\n }\n if (key === IS_READONLY) {\n return true;\n }\n\n const value = Reflect.get(target, key);\n // 如果是对象,递归转换为只读响应式\n if (isObject(value)) {\n return this.readonly(value);\n }\n return value;\n },\n set: () => {\n console.warn('Cannot set property on readonly object');\n return false;\n },\n deleteProperty: () => {\n console.warn('Cannot delete property on readonly object');\n return false;\n },\n });\n\n // 存储只读响应式对象的映射关系\n this.readonlyMap.set(target, proxy);\n return proxy as Readonly<T>;\n }\n\n public effect<T = unknown>(\n fn: () => T,\n options?: ReactiveEffectOptions\n ): ReactiveEffect<T> {\n const { lazy = false, scheduler, throwOnError = false } = options || {};\n\n const effectFn: ReactiveEffect<T> = () => {\n if (!effectFn.active) {\n return fn();\n }\n\n try {\n // 清除之前的依赖关系\n this.cleanup(effectFn);\n this.effectStack.push(effectFn);\n this.activeEffect = effectFn;\n return fn();\n } catch (error) {\n if (throwOnError) {\n throw error;\n }\n console.error('Effect error:', error);\n return undefined;\n } finally {\n this.effectStack.pop();\n this.activeEffect =\n this.effectStack[this.effectStack.length - 1] ?? null;\n }\n };\n\n effectFn.id = effectId++;\n effectFn.deps = [];\n effectFn.active = true;\n effectFn.scheduler = scheduler;\n\n // 如果不是懒加载,立即执行\n if (!lazy) {\n effectFn();\n }\n\n return effectFn;\n }\n\n /**\n * 在指定 effect 的上下文中运行 fn,使 fn 内的响应式访问被收集到该 effect,\n * 而不是当前外层 effect。组件渲染用它隔离依赖:子组件在父组件渲染期间\n * 执行自身 render 时,子 state 的访问不会污染父组件的 effect。\n */\n public runWithEffect<T>(effect: ReactiveEffect, fn: () => T): T {\n this.effectStack.push(effect);\n this.activeEffect = effect;\n try {\n return fn();\n } finally {\n this.effectStack.pop();\n this.activeEffect = this.effectStack[this.effectStack.length - 1] ?? null;\n }\n }\n\n public computed<T>(getter: () => T): ComputedRef<T> {\n let dirty = true;\n let value: T;\n const computedTarget = {};\n const trackComputedValue = (): void => {\n this.track(computedTarget, 'value');\n };\n\n const runner = this.effect(\n () => {\n value = getter();\n dirty = false;\n },\n {\n lazy: true,\n scheduler: () => {\n if (!dirty) {\n dirty = true;\n this.trigger(computedTarget, 'value');\n }\n },\n }\n );\n\n return {\n get value(): T {\n if (dirty) {\n runner();\n }\n trackComputedValue();\n return value as T;\n },\n };\n }\n\n private cleanup(effect: ReactiveEffect): void {\n // 清除effect的所有依赖\n effect.deps.forEach((dep) => {\n dep.delete(effect);\n });\n effect.deps.length = 0;\n }\n\n private track(target: object, key: string | symbol): void {\n if (!this.activeEffect || !this.activeEffect.active) return;\n\n let depsMap = this.targetMap.get(target);\n if (!depsMap) {\n depsMap = new Map();\n this.targetMap.set(target, depsMap);\n }\n\n let dep = depsMap.get(key);\n if (!dep) {\n dep = new Set();\n depsMap.set(key, dep);\n }\n\n if (!dep.has(this.activeEffect)) {\n dep.add(this.activeEffect);\n this.activeEffect.deps.push(dep);\n }\n }\n\n private trigger(target: object, key: string | symbol): void {\n const depsMap = this.targetMap.get(target);\n if (!depsMap) return;\n\n const dep = depsMap.get(key);\n if (!dep) return;\n\n // 创建依赖的副本进行遍历,避免在遍历过程中依赖发生变化\n const effects = new Set(dep);\n effects.forEach((effect) => {\n if (effect.active) {\n if (effect.scheduler) {\n effect.scheduler(effect);\n } else {\n effect();\n }\n }\n });\n }\n\n // 停止一个effect的执行\n public stop(effect: ReactiveEffect): void {\n if (effect.active) {\n this.cleanup(effect);\n effect.active = false;\n }\n }\n}\n\n// 导出响应式API\nexport function reactive<T extends object>(target: T): T {\n return ReactiveSystem.getInstance().reactive(target);\n}\n\nexport function readonly<T extends object>(target: T): Readonly<T> {\n return ReactiveSystem.getInstance().readonly(target);\n}\n\nexport function effect<T = unknown>(\n fn: () => T,\n options?: ReactiveEffectOptions\n): ReactiveEffect<T> {\n return ReactiveSystem.getInstance().effect(fn, options);\n}\n\nexport function computed<T>(getter: () => T): ComputedRef<T> {\n return ReactiveSystem.getInstance().computed(getter);\n}\n\nexport function ref<T>(value: T): Ref<T> {\n const wrapper = { value };\n Object.defineProperty(wrapper, IS_REF, {\n configurable: false,\n enumerable: false,\n value: true,\n });\n\n return reactive(wrapper) as Ref<T>;\n}\n\nexport function isRef(value: unknown): value is Ref<unknown> {\n return isObject(value) && Boolean(Reflect.get(value, IS_REF));\n}\n\nexport function unref<T>(value: T | Ref<T>): T {\n return isRef(value) ? value.value : value;\n}\n\nexport function stop(effect: ReactiveEffect): void {\n ReactiveSystem.getInstance().stop(effect);\n}\n\nexport interface WatchSource<T> {\n value: T;\n}\n\nexport type WatchCallback<T> = (\n value: T,\n oldValue: T | undefined,\n onCleanup: (cleanup: () => void) => void\n) => void;\n\nexport interface WatchOptions {\n /** 建立后立即执行一次回调(此时 oldValue 为 undefined) */\n immediate?: boolean;\n /** 深度追踪 getter 返回值的嵌套属性变化 */\n deep?: boolean;\n /** 变化发生时同步回调(默认随调度器批处理,同一批变化只回调一次) */\n sync?: boolean;\n}\n\n/**\n * 深度遍历响应式值,在 effect 上下文中访问全部 key 以收集嵌套依赖。\n */\nfunction traverseReactive(value: unknown, seen: Set<object>): void {\n if (!isObject(value) || seen.has(value)) {\n return;\n }\n\n seen.add(value);\n\n if (Array.isArray(value)) {\n value.forEach((item) => traverseReactive(item, seen));\n return;\n }\n\n Object.keys(value).forEach((key) => {\n traverseReactive((value as Record<string, unknown>)[key], seen);\n });\n}\n\n/**\n * 侦听响应式源(getter 或 ref)的变化并执行回调。\n * 返回一个用于停止侦听的函数。\n */\nexport function watch<T>(\n source: WatchSource<T> | (() => T),\n callback: WatchCallback<T>,\n options: WatchOptions = {}\n): () => void {\n const system = ReactiveSystem.getInstance();\n const getter = isRef(source)\n ? (): T => (source as Ref<T>).value\n : (source as () => T);\n\n let oldValue: T | undefined;\n let cleanup: (() => void) | null = null;\n\n const run = (): void => {\n if (!job.active) {\n return;\n }\n cleanup?.();\n cleanup = null;\n // runner 为 lazy effect,active 时调用必然返回 getter 值\n const newValue = runner() as T;\n callback(newValue, oldValue, (fn) => {\n cleanup = fn;\n });\n oldValue = newValue;\n };\n\n const runner = effect(\n (): T => {\n const value = getter();\n if (options.deep && isObject(value)) {\n traverseReactive(value, new Set<object>());\n }\n return value;\n },\n {\n lazy: true,\n scheduler: () => {\n if (options.sync) {\n run();\n } else {\n reactiveScheduler.enqueue(job);\n }\n },\n }\n );\n\n // 批处理队列中的执行单元:调度器 flush 时通过它完成求值与回调\n const job = effect(\n () => {\n run();\n },\n { lazy: true }\n );\n\n if (options.immediate) {\n run();\n } else {\n oldValue = runner();\n }\n\n return () => {\n system.stop(runner);\n system.stop(job);\n };\n}\n\n// 工具函数:判断是否是响应式对象\nexport function isReactive(value: unknown): boolean {\n return isObject(value) && hasReactiveFlag(value, IS_REACTIVE);\n}\n\n// 工具函数:判断是否是只读响应式对象\nexport function isReadonly(value: unknown): boolean {\n return isObject(value) && hasReactiveFlag(value, IS_READONLY);\n}\n",
|
|
8
|
-
"import type {\n AnyComponentConstructor,\n ComponentConstructor,\n ComponentEventListener,\n ComponentProps,\n} from './component';\nimport type { ModelBinding } from './model';\n\nexport interface ComponentType {\n mount(container: HTMLElement): void;\n unmount(): void;\n on(eventName: string, listener: ComponentEventListener): () => void;\n}\n\ntype VNodeComponentProps = ComponentProps;\n\nexport type VNodeComponentConstructor<\n P extends VNodeComponentProps = VNodeComponentProps,\n> = ComponentConstructor<P> | AnyComponentConstructor;\n\nexport type HTMLPropValue =\n | string\n | number\n | boolean\n | null\n | undefined\n | Record<string, string | number>\n | EventListener;\n\nexport interface HTMLProps {\n [key: string]: HTMLPropValue;\n class?: string;\n className?: string;\n style?: Record<string, string | number>;\n}\n\nexport interface EventListeners {\n [eventName: string]: (event: Event) => void;\n}\n\nexport interface Directions {\n model?: ModelBinding;\n if?: boolean;\n show?: boolean;\n}\n\nexport interface VNodeBase {\n key?: string | number;\n slot?: string;\n directions?: Directions;\n}\n\nexport interface HTMLNode extends VNodeBase {\n tag: string;\n props?: HTMLProps;\n children?:
|
|
8
|
+
"import type {\n AnyComponentConstructor,\n ComponentConstructor,\n ComponentEventListener,\n ComponentProps,\n} from './component';\nimport type { ModelBinding } from './model';\n\nexport interface ComponentType {\n mount(container: HTMLElement): void;\n unmount(): void;\n on(eventName: string, listener: ComponentEventListener): () => void;\n}\n\ntype VNodeComponentProps = ComponentProps;\n\nexport type VNodeComponentConstructor<\n P extends VNodeComponentProps = VNodeComponentProps,\n> = ComponentConstructor<P> | AnyComponentConstructor;\n\nexport type HTMLPropValue =\n | string\n | number\n | boolean\n | null\n | undefined\n | Record<string, string | number>\n | EventListener;\n\nexport type Children = VNode | string | Array<VNode | string>;\n\n/** 归一化 children 为数组(运行时渲染使用;h() 允许直接传单个节点或数组)。 */\nexport function toChildren(children?: Children): Array<VNode | string> {\n if (children === undefined || children === null) {\n return [];\n }\n return Array.isArray(children) ? children : [children];\n}\n\nexport interface HTMLProps {\n [key: string]: HTMLPropValue;\n class?: string;\n className?: string;\n style?: Record<string, string | number>;\n}\n\nexport interface EventListeners {\n [eventName: string]: (event: Event) => void;\n}\n\nexport interface Directions {\n model?: ModelBinding;\n if?: boolean;\n show?: boolean;\n}\n\nexport interface VNodeBase {\n key?: string | number;\n slot?: string;\n directions?: Directions;\n}\n\nexport interface HTMLNode extends VNodeBase {\n tag: string;\n props?: HTMLProps;\n children?: Children;\n listeners?: EventListeners;\n}\n\nexport interface ComponentNode<\n P extends VNodeComponentProps = VNodeComponentProps,\n> extends VNodeBase {\n component: VNodeComponentConstructor<P>;\n props?: P;\n children?: Children;\n emitters?: Record<string, ComponentEventListener>;\n}\n\nexport interface SlotProvider extends VNodeBase {\n tag: 'slot';\n props: { name: string };\n children?: Array<VNode | string>;\n}\n\nexport interface SlotInjector extends VNodeBase {\n tag: string;\n slot: string;\n}\n\n// 渲染树节点:组件节点 props 各异(如 CardProps),统一放宽为任意 props 形态\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type VNode = HTMLNode | ComponentNode<any> | SlotProvider | SlotInjector;\n\nexport type ElementShortcutOptions = Omit<HTMLNode, 'tag'>;\n\nexport type ElementShortcut = (options?: ElementShortcutOptions) => HTMLNode;\n\nexport function isComponentNode(vnode: VNode): vnode is ComponentNode {\n return typeof vnode === 'object' && vnode !== null && 'component' in vnode;\n}\n\nexport function isHTMLNode(vnode: VNode): vnode is HTMLNode {\n return (\n typeof vnode === 'object' &&\n vnode !== null &&\n 'tag' in vnode &&\n vnode.tag !== 'slot'\n );\n}\n\nexport function isSlotProvider(vnode: VNode): vnode is SlotProvider {\n return (\n typeof vnode === 'object' &&\n vnode !== null &&\n 'tag' in vnode &&\n vnode.tag === 'slot'\n );\n}\n\nexport function h(\n tag: string,\n props?: HTMLProps,\n children?: Children,\n listeners?: EventListeners,\n key?: string | number,\n directions?: Directions\n): HTMLNode {\n return {\n tag,\n props,\n children,\n listeners,\n key,\n directions,\n };\n}\n\nexport function Tag(\n tag: string,\n options: ElementShortcutOptions = {}\n): HTMLNode {\n return {\n tag,\n ...options,\n };\n}\n\nfunction createElementFactory(tag: string): ElementShortcut {\n return (options: ElementShortcutOptions = {}) => Tag(tag, options);\n}\n\nexport const Div = createElementFactory('div');\nexport const Span = createElementFactory('span');\nexport const P = createElementFactory('p');\nexport const Button = createElementFactory('button');\nexport const Input = createElementFactory('input');\nexport const Section = createElementFactory('section');\nexport const Main = createElementFactory('main');\nexport const Header = createElementFactory('header');\nexport const Footer = createElementFactory('footer');\nexport const Nav = createElementFactory('nav');\nexport const Article = createElementFactory('article');\nexport const Aside = createElementFactory('aside');\nexport const H1 = createElementFactory('h1');\nexport const H2 = createElementFactory('h2');\nexport const H3 = createElementFactory('h3');\nexport const H4 = createElementFactory('h4');\nexport const H5 = createElementFactory('h5');\nexport const H6 = createElementFactory('h6');\nexport const Strong = createElementFactory('strong');\nexport const Em = createElementFactory('em');\nexport const Small = createElementFactory('small');\nexport const Pre = createElementFactory('pre');\nexport const Code = createElementFactory('code');\nexport const Blockquote = createElementFactory('blockquote');\nexport const Ul = createElementFactory('ul');\nexport const Ol = createElementFactory('ol');\nexport const Li = createElementFactory('li');\nexport const A = createElementFactory('a');\nexport const Img = createElementFactory('img');\nexport const Form = createElementFactory('form');\nexport const Label = createElementFactory('label');\nexport const Textarea = createElementFactory('textarea');\nexport const Select = createElementFactory('select');\nexport const Option = createElementFactory('option');\nexport const Table = createElementFactory('table');\nexport const Thead = createElementFactory('thead');\nexport const Tbody = createElementFactory('tbody');\nexport const Tr = createElementFactory('tr');\nexport const Th = createElementFactory('th');\nexport const Td = createElementFactory('td');\n\nexport interface ComponentDescriptor<P extends VNodeComponentProps> {\n component: ComponentConstructor<P>;\n props?: P;\n children?: Children;\n key?: string | number;\n directions?: Directions;\n}\n\nexport function createComponent<P extends VNodeComponentProps>(\n options: ComponentDescriptor<P>\n): ComponentNode<P>;\nexport function createComponent<P extends VNodeComponentProps>(\n componentClass: ComponentConstructor<P>,\n props?: P,\n children?: Children,\n key?: string | number,\n directions?: Directions\n): ComponentNode<P>;\nexport function createComponent<P extends VNodeComponentProps>(\n componentOrOptions: ComponentConstructor<P> | ComponentDescriptor<P>,\n props?: P,\n children?: Children,\n key?: string | number,\n directions?: Directions\n): ComponentNode<P> {\n if (typeof componentOrOptions === 'function') {\n return {\n component: componentOrOptions,\n props,\n children,\n key,\n directions,\n };\n }\n return {\n component: componentOrOptions.component,\n props: componentOrOptions.props,\n children: componentOrOptions.children,\n key: componentOrOptions.key,\n directions: componentOrOptions.directions,\n };\n}\n\nexport function slot(\n name: string,\n key?: string | number,\n directions?: Directions\n): SlotProvider {\n return {\n tag: 'slot',\n props: { name },\n key,\n directions,\n };\n}\n\nexport function each<T>(\n items: readonly T[],\n render: (item: T, index: number) => VNode | string,\n key?: (item: T, index: number) => string | number\n): VNode[] {\n return items.map((item, index) => {\n const vnode = render(item, index);\n if (typeof vnode === 'string') {\n throw new Error('each render callback must return a VNode');\n }\n if (!key) {\n return vnode;\n }\n\n return { ...vnode, key: key(item, index) };\n });\n}\n",
|
|
9
9
|
"import { effect, stop, type ReactiveEffect } from './reactive';\n\nexport interface ModelBindingOptions {\n path: string;\n parse?: (value: unknown) => unknown;\n format?: (value: unknown) => string;\n}\n\nexport type ModelBinding = string | ModelBindingOptions;\n\ntype ModelState = Record<string, unknown>;\n\ninterface BindingRecord {\n binding: ModelBinding;\n path: string;\n parse?: (value: unknown) => unknown;\n format?: (value: unknown) => string;\n eventName: 'input' | 'change';\n listener: EventListener;\n effect: ReactiveEffect;\n}\n\nfunction pathSegments(path: string): string[] {\n const segments = path.split('.');\n if (\n path.length === 0 ||\n segments.some(\n (segment) =>\n segment.length === 0 ||\n segment === '__proto__' ||\n segment === 'prototype' ||\n segment === 'constructor'\n )\n ) {\n throw new Error(`Invalid model path \"${path}\"`);\n }\n return segments;\n}\n\nfunction isRecord(value: unknown): value is ModelState {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction hasOwn(value: object, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(value, key);\n}\n\nexport function modelPath(binding: ModelBinding): string {\n return typeof binding === 'string' ? binding : binding.path;\n}\n\nexport function getModelValue(state: ModelState, path: string): unknown {\n let value: unknown = state;\n\n for (const segment of pathSegments(path)) {\n if (!isRecord(value)) {\n throw new Error(`Invalid model path \"${path}\"`);\n }\n if (!hasOwn(value, segment)) {\n if (segment in value) {\n throw new Error(`Invalid model path \"${path}\"`);\n }\n return undefined;\n }\n value = value[segment];\n }\n\n return value;\n}\n\nexport function setModelValue(\n state: ModelState,\n path: string,\n value: unknown\n): void {\n const segments = pathSegments(path);\n let target: ModelState = state;\n\n for (const segment of segments.slice(0, -1)) {\n if (!hasOwn(target, segment)) {\n if (segment in target) {\n throw new Error(`Invalid model path \"${path}\"`);\n }\n target[segment] = {};\n } else if (!isRecord(target[segment])) {\n throw new Error(`Invalid model path \"${path}\"`);\n }\n const nextTarget = target[segment];\n if (!isRecord(nextTarget)) {\n throw new Error(`Invalid model path \"${path}\"`);\n }\n target = nextTarget;\n }\n\n const lastSegment = segments[segments.length - 1];\n target[lastSegment] = value;\n}\n\nfunction displayValue(binding: ModelBinding, value: unknown): string {\n if (typeof binding !== 'string' && binding.format) {\n return binding.format(value);\n }\n return value === undefined || value === null ? '' : String(value);\n}\n\nfunction toModelValue(binding: ModelBinding, value: unknown): unknown {\n if (typeof binding !== 'string' && binding.parse) {\n return binding.parse(value);\n }\n return value;\n}\n\nfunction syncControl(\n element: HTMLElement,\n binding: ModelBinding,\n value: unknown\n): void {\n if (element instanceof HTMLInputElement) {\n if (element.type === 'checkbox') {\n element.checked = Array.isArray(value)\n ? value.some((item) => String(item) === element.value)\n : Boolean(value);\n return;\n }\n if (element.type === 'radio') {\n element.checked = value === element.value;\n return;\n }\n element.value = displayValue(binding, value);\n return;\n }\n\n if (element instanceof HTMLTextAreaElement) {\n element.value = displayValue(binding, value);\n return;\n }\n\n if (element instanceof HTMLSelectElement) {\n if (element.multiple) {\n const selected = Array.isArray(value)\n ? new Set(value.map(String))\n : new Set<string>();\n for (let index = 0; index < element.options.length; index += 1) {\n const option = element.options.item(index);\n if (!option) {\n continue;\n }\n option.selected = selected.has(option.value);\n }\n return;\n }\n element.value = displayValue(binding, value);\n }\n}\n\nfunction controlValue(element: HTMLElement, currentValue: unknown): unknown {\n if (element instanceof HTMLInputElement) {\n if (element.type === 'checkbox') {\n if (Array.isArray(currentValue)) {\n const values = currentValue.filter(\n (value) => String(value) !== element.value\n );\n return element.checked ? [...values, element.value] : values;\n }\n return element.checked;\n }\n if (element.type === 'radio') {\n return element.checked ? element.value : currentValue;\n }\n return element.value;\n }\n if (element instanceof HTMLTextAreaElement) {\n return element.value;\n }\n if (element instanceof HTMLSelectElement) {\n if (!element.multiple) {\n return element.value;\n }\n const values: string[] = [];\n for (let index = 0; index < element.selectedOptions.length; index += 1) {\n const option = element.selectedOptions.item(index);\n if (option) {\n values.push(option.value);\n }\n }\n return values;\n }\n return undefined;\n}\n\nexport class ModelBindingController {\n private readonly bindings = new WeakMap<HTMLElement, BindingRecord>();\n\n public bind(\n element: HTMLElement,\n binding: ModelBinding,\n state: ModelState\n ): void {\n if (!this.isSupportedControl(element)) {\n return;\n }\n\n const existing = this.bindings.get(element);\n if (existing && this.sameBinding(existing, binding)) {\n return;\n }\n this.cleanup(element);\n\n const path = modelPath(binding);\n const sync = (): void =>\n syncControl(element, binding, getModelValue(state, path));\n const eventName =\n element instanceof HTMLTextAreaElement ||\n (element instanceof HTMLInputElement &&\n !['checkbox', 'radio'].includes(element.type))\n ? 'input'\n : 'change';\n const listener = (): void => {\n const currentValue = getModelValue(state, path);\n setModelValue(\n state,\n path,\n toModelValue(binding, controlValue(element, currentValue))\n );\n };\n\n element.addEventListener(eventName, listener);\n const effectRef = effect(sync);\n this.bindings.set(element, {\n binding,\n path,\n parse: typeof binding === 'string' ? undefined : binding.parse,\n format: typeof binding === 'string' ? undefined : binding.format,\n eventName,\n listener,\n effect: effectRef,\n });\n }\n\n public cleanup(element: HTMLElement): void {\n const existing = this.bindings.get(element);\n if (!existing) {\n return;\n }\n element.removeEventListener(existing.eventName, existing.listener);\n stop(existing.effect);\n this.bindings.delete(element);\n }\n\n private isSupportedControl(element: HTMLElement): boolean {\n return (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement\n );\n }\n\n private sameBinding(record: BindingRecord, binding: ModelBinding): boolean {\n if (typeof record.binding === 'string' || typeof binding === 'string') {\n return record.binding === binding;\n }\n return (\n record.path === binding.path &&\n record.parse === binding.parse &&\n record.format === binding.format\n );\n }\n}\n",
|
|
10
10
|
"export interface ParsedEventName {\n eventName: string;\n modifiers: Set<string>;\n}\n\nexport function isEventProp(key: string): boolean {\n return /^on[A-Z]/.test(key) || /^on[a-z]/.test(key);\n}\n\nexport function eventNameFromProp(key: string): string {\n return key.slice(2).toLowerCase();\n}\n\nexport function parseEventName(event: string): ParsedEventName {\n const [eventName, ...modifiers] = event.split('.');\n return { eventName, modifiers: new Set(modifiers) };\n}\n\nexport function wrapEventHandler(\n handler: (event: Event) => void,\n modifiers: Set<string>\n): EventListener {\n const eventHandler = (event: Event): void => {\n if (modifiers.has('stop')) {\n event.stopPropagation();\n }\n\n if (modifiers.has('prevent')) {\n event.preventDefault();\n }\n\n if (modifiers.has('self') && event.currentTarget !== event.target) {\n return;\n }\n\n if (modifiers.has('once')) {\n (event.currentTarget as EventTarget).removeEventListener(\n event.type,\n eventHandler\n );\n }\n\n handler(event);\n };\n\n return eventHandler;\n}\n\nexport function setStyleValue(\n style: CSSStyleDeclaration,\n property: string,\n value: string | number\n): void {\n const cssProperty = property.includes('-')\n ? property\n : property.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);\n\n style.setProperty(cssProperty, String(value));\n}\n",
|
|
11
|
-
"import { ModelBindingController } from '../model';\nimport { effect, ReactiveEffect, stop } from '../reactive';\nimport {\n EventListeners,\n HTMLNode,\n HTMLProps,\n VNode,\n isHTMLNode,\n} from '../vnode';\nimport {\n eventNameFromProp,\n isEventProp,\n parseEventName,\n setStyleValue,\n wrapEventHandler,\n} from './props';\nimport type { RenderRuntimeContext, RenderStrategy, Renderable } from './types';\n\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\n/**\n * 仅包含 HTML 中不存在的 SVG 专属标签:这些标签必须通过\n * createElementNS 创建,否则会落入 HTML 命名空间而无法渲染。\n * 与 HTML 重名的标签(title/desc/a/image 等)不在此列,避免误伤。\n */\nexport const SVG_TAGS: ReadonlySet<string> = new Set([\n 'svg',\n 'g',\n 'defs',\n 'rect',\n 'circle',\n 'ellipse',\n 'line',\n 'polyline',\n 'polygon',\n 'path',\n 'text',\n 'tspan',\n 'textPath',\n 'use',\n 'symbol',\n 'marker',\n 'linearGradient',\n 'radialGradient',\n 'stop',\n 'pattern',\n 'mask',\n 'clipPath',\n 'foreignObject',\n]);\n\nexport class ElementRenderStrategy<\n TNode extends HTMLNode = HTMLNode,\n> implements RenderStrategy<TNode> {\n private readonly listeners = new WeakMap<\n Element,\n Map<string, { eventName: string; listener: EventListener }>\n >();\n private readonly effects = new WeakMap<Element, Set<ReactiveEffect>>();\n private readonly modelBindings = new ModelBindingController();\n\n public matches(vnode: Renderable): vnode is TNode {\n return typeof vnode === 'object' && vnode !== null && isHTMLNode(vnode);\n }\n\n public mount(vnode: TNode, context: RenderRuntimeContext): Node {\n if (vnode.directions?.if === false) {\n return document.createComment('if');\n }\n\n const element = SVG_TAGS.has(vnode.tag)\n ? document.createElementNS(SVG_NAMESPACE, vnode.tag)\n : document.createElement(vnode.tag);\n this.applyProps(element, {}, vnode.props ?? {}, context);\n this.updateListeners(element, {}, this.collectListeners(vnode));\n this.mountChildren(element, vnode, context);\n this.applyDirections(element, undefined, vnode.directions, context);\n\n return element;\n }\n\n public patch(\n oldVNode: TNode,\n newVNode: TNode,\n currentNode: Node,\n context: RenderRuntimeContext\n ): Node {\n if (\n oldVNode.tag !== newVNode.tag ||\n currentNode.nodeType === Node.COMMENT_NODE\n ) {\n const nextNode = this.mount(newVNode, context);\n currentNode.parentNode?.replaceChild(nextNode, currentNode);\n this.unmount(oldVNode, currentNode, context);\n return nextNode;\n }\n\n // SVG 元素是 SVGElement 而非 HTMLElement,元素级补丁必须覆盖两者\n if (!(currentNode instanceof Element)) {\n return currentNode;\n }\n\n if (newVNode.directions?.if === false) {\n const nextNode = document.createComment('if');\n currentNode.parentNode?.replaceChild(nextNode, currentNode);\n this.unmount(oldVNode, currentNode, context);\n return nextNode;\n }\n\n this.applyProps(\n currentNode,\n oldVNode.props ?? {},\n newVNode.props ?? {},\n context\n );\n this.updateListeners(\n currentNode,\n this.collectListeners(oldVNode),\n this.collectListeners(newVNode)\n );\n this.updateChildren(currentNode, oldVNode, newVNode, context);\n this.applyDirections(\n currentNode,\n oldVNode.directions,\n newVNode.directions,\n context\n );\n\n return currentNode;\n }\n\n public unmount(\n vnode: TNode,\n currentNode: Node,\n context: RenderRuntimeContext\n ): void {\n if (!(currentNode instanceof Element)) {\n return;\n }\n\n this.effects.get(currentNode)?.forEach((item) => stop(item));\n this.effects.delete(currentNode);\n\n this.listeners.get(currentNode)?.forEach(({ eventName, listener }) => {\n currentNode.removeEventListener(eventName, listener);\n });\n this.listeners.delete(currentNode);\n this.modelBindings.cleanup(currentNode as HTMLElement);\n this.unmountChildren(currentNode, vnode, context);\n }\n\n protected mountChildren(\n element: Element,\n vnode: TNode,\n context: RenderRuntimeContext\n ): void {\n (vnode.children ?? []).forEach((child) => {\n element.appendChild(context.renderer.mount(child, context));\n });\n }\n\n protected updateChildren(\n element: Element,\n oldVNode: TNode,\n newVNode: TNode,\n context: RenderRuntimeContext\n ): void {\n this.updateOrdinaryChildren(\n element,\n oldVNode.children ?? [],\n newVNode.children ?? [],\n context\n );\n }\n\n protected unmountChildren(\n element: Element,\n vnode: TNode,\n context: RenderRuntimeContext\n ): void {\n (vnode.children ?? []).forEach((child, index) => {\n const childNode = element.childNodes[index];\n if (childNode) {\n context.renderer.unmount(child, childNode, context);\n }\n });\n }\n\n private applyProps(\n element: Element,\n oldProps: HTMLProps,\n newProps: HTMLProps,\n context: RenderRuntimeContext\n ): void {\n Object.keys(oldProps).forEach((key) => {\n if (isEventProp(key) || key in newProps) {\n return;\n }\n\n if (key === 'className' || key === 'class') {\n element.removeAttribute('class');\n } else if (key === 'style') {\n element.removeAttribute('style');\n } else if (\n key === 'value' &&\n typeof element === 'object' &&\n element !== null &&\n 'value' in element\n ) {\n (element as HTMLElement & { value: string }).value = '';\n } else {\n element.removeAttribute(attributeName(key));\n }\n });\n\n Object.entries(newProps).forEach(([key, value]) => {\n if (isEventProp(key)) {\n return;\n }\n\n // 值未变化时跳过 DOM 更新,避免每次 patch 全量重写属性\n if (oldProps[key] === value) {\n return;\n }\n\n if (key === 'className' || key === 'class') {\n // SVG 元素的 className 是 SVGAnimatedString,直接赋值在部分环境\n // 不可靠;统一走 class 属性。\n if (element.namespaceURI === SVG_NAMESPACE) {\n element.setAttribute('class', String(value ?? ''));\n } else {\n (element as HTMLElement).className = String(value ?? '');\n }\n return;\n }\n\n // 表单控件(input/textarea/select/option)的 value 必须写入 DOM\n // property 而不是 attribute:setAttribute('value') 只更新默认值,\n // 用户输入或程序修改后的当前值不会随之变化。\n if (\n key === 'value' &&\n typeof element === 'object' &&\n element !== null &&\n 'value' in element\n ) {\n (element as HTMLElement & { value: string }).value = String(\n value ?? ''\n );\n return;\n }\n\n if (key === 'style' && typeof value === 'object' && value !== null) {\n element.removeAttribute('style');\n const style = (element as HTMLElement).style;\n Object.entries(value).forEach(([cssKey, cssValue]) => {\n setStyleValue(style, cssKey, cssValue);\n });\n return;\n }\n\n if (value === false || value === undefined || value === null) {\n element.removeAttribute(attributeName(key));\n return;\n }\n\n if (value === true) {\n element.setAttribute(attributeName(key), '');\n return;\n }\n\n if (\n typeof value === 'string' &&\n context.templateEngine.hasExpressions(value)\n ) {\n this.setupReactiveAttribute(element, key, value, context);\n return;\n }\n\n element.setAttribute(attributeName(key), String(value));\n });\n }\n\n private applyDirections(\n element: Element,\n oldDirections: HTMLNode['directions'],\n newDirections: HTMLNode['directions'],\n context: RenderRuntimeContext\n ): void {\n if (newDirections && 'show' in newDirections) {\n (element as HTMLElement).style.display = newDirections.show ? '' : 'none';\n } else if (oldDirections && 'show' in oldDirections) {\n (element as HTMLElement).style.display = '';\n }\n\n if (!newDirections?.model) {\n this.modelBindings.cleanup(element as HTMLElement);\n return;\n }\n\n this.modelBindings.bind(\n element as HTMLElement,\n newDirections.model,\n context.templateEngine.state as Record<string, unknown>\n );\n }\n\n private updateOrdinaryChildren(\n element: Element,\n oldChildren: Array<VNode | string>,\n newChildren: Array<VNode | string>,\n context: RenderRuntimeContext\n ): void {\n this.assertNoDuplicateKeys(oldChildren);\n this.assertNoDuplicateKeys(newChildren);\n\n if (this.hasOnlyKeyedChildren(oldChildren, newChildren)) {\n this.updateKeyedChildren(element, oldChildren, newChildren, context);\n return;\n }\n\n const sharedLength = Math.min(oldChildren.length, newChildren.length);\n\n for (let index = 0; index < sharedLength; index += 1) {\n const childNode = element.childNodes[index];\n if (!childNode) {\n element.appendChild(\n context.renderer.mount(newChildren[index], context)\n );\n continue;\n }\n context.renderer.patch(\n oldChildren[index],\n newChildren[index],\n childNode,\n context\n );\n }\n\n for (let index = sharedLength; index < newChildren.length; index += 1) {\n element.appendChild(context.renderer.mount(newChildren[index], context));\n }\n\n for (\n let index = oldChildren.length - 1;\n index >= newChildren.length;\n index -= 1\n ) {\n const childNode = element.childNodes[index];\n if (childNode) {\n context.renderer.unmount(oldChildren[index], childNode, context);\n if (childNode.parentNode === element) {\n element.removeChild(childNode);\n }\n }\n }\n }\n\n private updateKeyedChildren(\n element: Element,\n oldChildren: Array<VNode | string>,\n newChildren: Array<VNode | string>,\n context: RenderRuntimeContext\n ): void {\n const oldEntries = oldChildren.map((vnode, index) => ({\n vnode,\n node: element.childNodes[index],\n index,\n }));\n const keyedOldEntries = new Map<\n string | number,\n { vnode: VNode | string; node: Node; index: number }\n >();\n const usedOldIndexes = new Set<number>();\n\n oldEntries.forEach((entry) => {\n const key = this.getVNodeKey(entry.vnode);\n if (key !== undefined && entry.node) {\n keyedOldEntries.set(key, {\n vnode: entry.vnode,\n node: entry.node,\n index: entry.index,\n });\n }\n });\n\n newChildren.forEach((newChild, newIndex) => {\n const key = this.getVNodeKey(newChild);\n const oldEntry = key === undefined ? undefined : keyedOldEntries.get(key);\n let nextNode: Node;\n\n if (oldEntry) {\n nextNode = context.renderer.patch(\n oldEntry.vnode,\n newChild,\n oldEntry.node,\n context\n );\n usedOldIndexes.add(oldEntry.index);\n } else {\n nextNode = context.renderer.mount(newChild, context);\n }\n\n const referenceNode = element.childNodes[newIndex] ?? null;\n if (nextNode !== referenceNode) {\n element.insertBefore(nextNode, referenceNode);\n }\n });\n\n oldEntries.forEach((entry) => {\n if (!entry.node || usedOldIndexes.has(entry.index)) {\n return;\n }\n\n context.renderer.unmount(entry.vnode, entry.node, context);\n if (entry.node.parentNode === element) {\n element.removeChild(entry.node);\n }\n });\n }\n\n private hasOnlyKeyedChildren(\n oldChildren: Array<VNode | string>,\n newChildren: Array<VNode | string>\n ): boolean {\n return [...oldChildren, ...newChildren].every(\n (child) => this.getVNodeKey(child) !== undefined\n );\n }\n\n private assertNoDuplicateKeys(children: Array<VNode | string>): void {\n const keys = new Set<string | number>();\n\n children.forEach((child) => {\n const key = this.getVNodeKey(child);\n if (key === undefined) {\n return;\n }\n\n if (keys.has(key)) {\n throw new Error(`Duplicate key \"${key}\"`);\n }\n\n keys.add(key);\n });\n }\n\n private getVNodeKey(vnode: VNode | string): string | number | undefined {\n if (typeof vnode === 'string') {\n return undefined;\n }\n\n return vnode.key;\n }\n\n private collectListeners(vnode: HTMLNode): EventListeners {\n const listeners: EventListeners = {};\n\n Object.entries(vnode.props ?? {}).forEach(([key, value]) => {\n if (isEventProp(key) && typeof value === 'function') {\n listeners[eventNameFromProp(key)] = value as (event: Event) => void;\n }\n });\n\n return {\n ...listeners,\n ...(vnode.listeners ?? {}),\n };\n }\n\n private updateListeners(\n element: Element,\n oldListeners: EventListeners,\n newListeners: EventListeners\n ): void {\n const store = this.listeners.get(element) ?? new Map();\n const oldKeys = new Set(Object.keys(oldListeners));\n const newKeys = new Set(Object.keys(newListeners));\n\n oldKeys.forEach((event) => {\n if (!newKeys.has(event) || oldListeners[event] !== newListeners[event]) {\n const stored = store.get(event);\n if (stored) {\n element.removeEventListener(stored.eventName, stored.listener);\n store.delete(event);\n }\n }\n });\n\n newKeys.forEach((event) => {\n if (!oldKeys.has(event) || oldListeners[event] !== newListeners[event]) {\n const { eventName, modifiers } = parseEventName(event);\n const listener = wrapEventHandler(newListeners[event], modifiers);\n element.addEventListener(eventName, listener);\n store.set(event, { eventName, listener });\n }\n });\n\n this.listeners.set(element, store);\n }\n\n private setupReactiveAttribute(\n element: Element,\n attrName: string,\n attrValue: string,\n context: RenderRuntimeContext\n ): void {\n const effectRef = effect(() => {\n element.setAttribute(\n attrName,\n context.templateEngine.evaluateTemplateValue(attrValue)\n );\n });\n\n this.trackEffect(element, effectRef);\n }\n\n private trackEffect(element: Element, effectRef: ReactiveEffect): void {\n const effects = this.effects.get(element) ?? new Set();\n effects.add(effectRef);\n this.effects.set(element, effects);\n }\n}\n\n/** dataId -> data-id:元素属性写入 data-id,事件回调可从 currentTarget.dataset 读取。 */\nfunction attributeName(key: string): string {\n if (key.startsWith('data') && key.length > 4) {\n return `data${key\n .slice(4)\n .replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`)}`;\n }\n // 标准 HTML 属性名不使用 camelCase\n if (key === 'tabIndex' || key === 'colSpan' || key === 'htmlFor') {\n return key.toLowerCase();\n }\n return key;\n}\n",
|
|
12
|
-
"import type { ComponentEventListener, ComponentProps } from './component/base';\nimport {\n ComponentNode,\n SlotProvider,\n VNode,\n isComponentNode,\n isSlotProvider,\n} from './vnode';\nimport { ElementRenderStrategy } from './renderer/element-strategy';\nexport { ElementRenderStrategy } from './renderer/element-strategy';\nexport type {\n ComponentInstance,\n RenderRuntimeContext,\n RenderStrategy,\n Renderable,\n RendererHost,\n} from './renderer/types';\nimport type {\n ComponentInstance,\n RenderRuntimeContext,\n RenderStrategy,\n Renderable,\n} from './renderer/types';\n\nexport class RendererContext {\n private readonly strategies: RenderStrategy[];\n\n constructor() {\n this.strategies = [\n new TextRenderStrategy(),\n new ComponentRenderStrategy(),\n new SlotRenderStrategy(),\n new ElementRenderStrategy(),\n ];\n }\n\n public mount(vnode: Renderable, context: RenderRuntimeContext): Node {\n return this.findStrategy(vnode).mount(vnode as never, context);\n }\n\n public patch(\n oldVNode: Renderable,\n newVNode: Renderable,\n currentNode: Node,\n context: RenderRuntimeContext\n ): Node {\n const oldStrategy = this.findStrategy(oldVNode);\n const newStrategy = this.findStrategy(newVNode);\n\n if (oldStrategy !== newStrategy) {\n const nextNode = newStrategy.mount(newVNode as never, context);\n currentNode.parentNode?.replaceChild(nextNode, currentNode);\n oldStrategy.unmount(oldVNode as never, currentNode, context);\n return nextNode;\n }\n\n return oldStrategy.patch(\n oldVNode as never,\n newVNode as never,\n currentNode,\n context\n );\n }\n\n public unmount(\n vnode: Renderable,\n currentNode: Node,\n context: RenderRuntimeContext\n ): void {\n this.findStrategy(vnode).unmount(vnode as never, currentNode, context);\n }\n\n private findStrategy(vnode: Renderable): RenderStrategy {\n const strategy = this.strategies.find((item) => item.matches(vnode));\n if (!strategy) {\n throw new Error('No render strategy found for vnode');\n }\n return strategy;\n }\n}\n\nexport class TextRenderStrategy implements RenderStrategy<string> {\n public matches(vnode: Renderable): vnode is string {\n return typeof vnode === 'string';\n }\n\n public mount(vnode: string, context: RenderRuntimeContext): Node {\n return context.templateEngine.parseTemplate(vnode);\n }\n\n public patch(\n oldVNode: string,\n newVNode: string,\n currentNode: Node,\n context: RenderRuntimeContext\n ): Node {\n if (oldVNode === newVNode) {\n return currentNode;\n }\n\n const nextNode = this.mount(newVNode, context);\n currentNode.parentNode?.replaceChild(nextNode, currentNode);\n return nextNode;\n }\n\n public unmount(): void {}\n}\n\nexport class ComponentRenderStrategy implements RenderStrategy<ComponentNode> {\n private readonly instances = new WeakMap<Node, ComponentInstance>();\n private readonly instanceNodes = new Map<ComponentInstance, Set<Node>>();\n private readonly emitterUnsubscribers = new WeakMap<\n ComponentInstance,\n Map<string, { listener: ComponentEventListener; unsubscribe: () => void }>\n >();\n\n public matches(vnode: Renderable): vnode is ComponentNode {\n return (\n typeof vnode === 'object' && vnode !== null && isComponentNode(vnode)\n );\n }\n\n public mount(vnode: ComponentNode, context: RenderRuntimeContext): Node {\n if (vnode.directions?.if === false) {\n return document.createComment('if');\n }\n\n const ComponentClass = vnode.component as new (\n props?: ComponentProps\n ) => ComponentInstance;\n const instance = new ComponentClass(this.createProps(vnode));\n\n if (context.appContext && instance.setAppContext) {\n instance.setAppContext(context.appContext);\n }\n\n this.syncEmitters(instance, vnode.emitters ?? {});\n\n context.registerChild(instance);\n\n const node = instance.mountToNode();\n this.trackInstanceNode(instance, node);\n instance.setElementChangeListener?.((previousNode, nextNode) => {\n this.trackInstanceNode(instance, previousNode);\n this.trackInstanceNode(instance, nextNode);\n });\n return node;\n }\n\n public patch(\n oldVNode: ComponentNode,\n newVNode: ComponentNode,\n currentNode: Node,\n context: RenderRuntimeContext\n ): Node {\n if (currentNode.nodeType === Node.COMMENT_NODE) {\n const nextNode = this.mount(newVNode, context);\n currentNode.parentNode?.replaceChild(nextNode, currentNode);\n return nextNode;\n }\n\n if (newVNode.directions?.if === false) {\n const nextNode = document.createComment('if');\n currentNode.parentNode?.replaceChild(nextNode, currentNode);\n this.unmount(oldVNode, currentNode, context);\n return nextNode;\n }\n\n const instance = this.instances.get(currentNode);\n\n if (instance && oldVNode.component === newVNode.component) {\n this.syncEmitters(instance, newVNode.emitters ?? {});\n instance.setProps(this.createProps(newVNode));\n const nextNode = instance.getElement() ?? currentNode;\n this.trackInstanceNode(instance, nextNode);\n return nextNode;\n }\n\n const nextNode = this.mount(newVNode, context);\n currentNode.parentNode?.replaceChild(nextNode, currentNode);\n this.unmount(oldVNode, currentNode, context);\n return nextNode;\n }\n\n public unmount(\n _vnode: ComponentNode,\n currentNode: Node,\n context: RenderRuntimeContext\n ): void {\n const instance = this.instances.get(currentNode);\n if (instance) {\n this.clearEmitters(instance);\n instance.unmount();\n this.clearInstanceNodes(instance);\n context.unregisterChild(instance);\n }\n }\n\n private createProps(vnode: ComponentNode): ComponentProps {\n return {\n ...(vnode.props ?? {}),\n children: vnode.children ?? [],\n };\n }\n\n private syncEmitters(\n instance: ComponentInstance,\n emitters: NonNullable<ComponentNode['emitters']>\n ): void {\n const current = this.emitterUnsubscribers.get(instance) ?? new Map();\n\n current.forEach(({ listener: currentListener, unsubscribe }, eventName) => {\n const listener = emitters[eventName];\n if (!listener || listener !== currentListener) {\n unsubscribe();\n current.delete(eventName);\n }\n });\n\n Object.entries(emitters).forEach(([eventName, listener]) => {\n if (current.get(eventName)?.listener === listener) {\n return;\n }\n\n current.set(eventName, {\n listener,\n unsubscribe: instance.on(eventName, listener),\n });\n });\n\n this.emitterUnsubscribers.set(instance, current);\n }\n\n private clearEmitters(instance: ComponentInstance): void {\n this.emitterUnsubscribers.get(instance)?.forEach(({ unsubscribe }) => {\n unsubscribe();\n });\n this.emitterUnsubscribers.delete(instance);\n }\n\n private trackInstanceNode(instance: ComponentInstance, node: Node): void {\n this.instances.set(node, instance);\n const nodes = this.instanceNodes.get(instance) ?? new Set<Node>();\n nodes.add(node);\n this.instanceNodes.set(instance, nodes);\n }\n\n private clearInstanceNodes(instance: ComponentInstance): void {\n this.instanceNodes.get(instance)?.forEach((node) => {\n this.instances.delete(node);\n });\n this.instanceNodes.delete(instance);\n }\n}\n\nexport class SlotRenderStrategy implements RenderStrategy<SlotProvider> {\n private readonly renderedChildren = new WeakMap<\n HTMLElement,\n Array<VNode | string>\n >();\n\n public matches(vnode: Renderable): vnode is SlotProvider {\n return typeof vnode === 'object' && vnode !== null && isSlotProvider(vnode);\n }\n\n public mount(vnode: SlotProvider, context: RenderRuntimeContext): Node {\n if (vnode.directions?.if === false) {\n return document.createComment('if');\n }\n\n const slotContainer = document.createElement('div');\n slotContainer.setAttribute('data-slot', vnode.props.name);\n this.mountSlotChildren(\n slotContainer,\n this.resolveChildren(vnode, context),\n context\n );\n return slotContainer;\n }\n\n public patch(\n oldVNode: SlotProvider,\n newVNode: SlotProvider,\n currentNode: Node,\n context: RenderRuntimeContext\n ): Node {\n if (currentNode.nodeType === Node.COMMENT_NODE) {\n const nextNode = this.mount(newVNode, context);\n currentNode.parentNode?.replaceChild(nextNode, currentNode);\n return nextNode;\n }\n\n if (newVNode.directions?.if === false) {\n const nextNode = document.createComment('if');\n currentNode.parentNode?.replaceChild(nextNode, currentNode);\n this.unmount(oldVNode, currentNode, context);\n return nextNode;\n }\n\n if (currentNode instanceof HTMLElement) {\n currentNode.setAttribute('data-slot', newVNode.props.name);\n this.replaceSlotChildren(currentNode, oldVNode, newVNode, context);\n }\n return currentNode;\n }\n\n public unmount(\n _vnode: SlotProvider,\n currentNode: Node,\n context: RenderRuntimeContext\n ): void {\n if (!(currentNode instanceof HTMLElement)) {\n return;\n }\n\n this.unmountSlotChildren(currentNode, context);\n this.renderedChildren.delete(currentNode);\n }\n\n private resolveChildren(\n vnode: SlotProvider,\n context: RenderRuntimeContext\n ): Array<VNode | string> {\n return context.slots[vnode.props.name] ?? vnode.children ?? [];\n }\n\n private replaceSlotChildren(\n element: HTMLElement,\n _oldVNode: SlotProvider,\n newVNode: SlotProvider,\n context: RenderRuntimeContext\n ): void {\n const oldChildren = this.renderedChildren.get(element) ?? [];\n const newChildren = this.resolveChildren(newVNode, context);\n const sharedLength = Math.min(oldChildren.length, newChildren.length);\n\n // 复用已有节点逐个 patch,避免 slot 内容整体重建导致\n // 组件实例与 DOM 元素(含焦点)丢失。\n for (let index = 0; index < sharedLength; index += 1) {\n const childNode = element.childNodes[index];\n if (!childNode) {\n element.appendChild(\n context.renderer.mount(newChildren[index], context)\n );\n continue;\n }\n context.renderer.patch(\n oldChildren[index],\n newChildren[index],\n childNode,\n context\n );\n }\n\n for (let index = sharedLength; index < newChildren.length; index += 1) {\n element.appendChild(context.renderer.mount(newChildren[index], context));\n }\n\n for (\n let index = oldChildren.length - 1;\n index >= newChildren.length;\n index -= 1\n ) {\n const childNode = element.childNodes[index];\n if (childNode) {\n context.renderer.unmount(oldChildren[index], childNode, context);\n if (childNode.parentNode === element) {\n element.removeChild(childNode);\n }\n }\n }\n\n this.renderedChildren.set(element, newChildren);\n }\n\n private mountSlotChildren(\n element: HTMLElement,\n children: Array<VNode | string>,\n context: RenderRuntimeContext\n ): void {\n children.forEach((child) => {\n element.appendChild(context.renderer.mount(child, context));\n });\n this.renderedChildren.set(element, children);\n }\n\n private unmountSlotChildren(\n element: HTMLElement,\n context: RenderRuntimeContext\n ): void {\n const children = this.renderedChildren.get(element) ?? [];\n children.forEach((child, index) => {\n const childNode = element.childNodes[index];\n if (childNode) {\n context.renderer.unmount(child, childNode, context);\n }\n });\n }\n}\n",
|
|
11
|
+
"import { ModelBindingController } from '../model';\nimport { effect, ReactiveEffect, stop } from '../reactive';\nimport {\n EventListeners,\n HTMLNode,\n HTMLProps,\n VNode,\n isHTMLNode,\n toChildren,\n} from '../vnode';\nimport {\n eventNameFromProp,\n isEventProp,\n parseEventName,\n setStyleValue,\n wrapEventHandler,\n} from './props';\nimport type { RenderRuntimeContext, RenderStrategy, Renderable } from './types';\n\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\n/**\n * 仅包含 HTML 中不存在的 SVG 专属标签:这些标签必须通过\n * createElementNS 创建,否则会落入 HTML 命名空间而无法渲染。\n * 与 HTML 重名的标签(title/desc/a/image 等)不在此列,避免误伤。\n */\nexport const SVG_TAGS: ReadonlySet<string> = new Set([\n 'svg',\n 'g',\n 'defs',\n 'rect',\n 'circle',\n 'ellipse',\n 'line',\n 'polyline',\n 'polygon',\n 'path',\n 'text',\n 'tspan',\n 'textPath',\n 'use',\n 'symbol',\n 'marker',\n 'linearGradient',\n 'radialGradient',\n 'stop',\n 'pattern',\n 'mask',\n 'clipPath',\n 'foreignObject',\n]);\n\nexport class ElementRenderStrategy<\n TNode extends HTMLNode = HTMLNode,\n> implements RenderStrategy<TNode> {\n private readonly listeners = new WeakMap<\n Element,\n Map<string, { eventName: string; listener: EventListener }>\n >();\n private readonly effects = new WeakMap<Element, Set<ReactiveEffect>>();\n private readonly modelBindings = new ModelBindingController();\n\n public matches(vnode: Renderable): vnode is TNode {\n return typeof vnode === 'object' && vnode !== null && isHTMLNode(vnode);\n }\n\n public mount(vnode: TNode, context: RenderRuntimeContext): Node {\n if (vnode.directions?.if === false) {\n return document.createComment('if');\n }\n\n const element = SVG_TAGS.has(vnode.tag)\n ? document.createElementNS(SVG_NAMESPACE, vnode.tag)\n : document.createElement(vnode.tag);\n this.applyProps(element, {}, vnode.props ?? {}, context);\n this.updateListeners(element, {}, this.collectListeners(vnode));\n this.mountChildren(element, vnode, context);\n this.applyDirections(element, undefined, vnode.directions, context);\n\n return element;\n }\n\n public patch(\n oldVNode: TNode,\n newVNode: TNode,\n currentNode: Node,\n context: RenderRuntimeContext\n ): Node {\n if (\n oldVNode.tag !== newVNode.tag ||\n currentNode.nodeType === Node.COMMENT_NODE\n ) {\n const nextNode = this.mount(newVNode, context);\n currentNode.parentNode?.replaceChild(nextNode, currentNode);\n this.unmount(oldVNode, currentNode, context);\n return nextNode;\n }\n\n // SVG 元素是 SVGElement 而非 HTMLElement,元素级补丁必须覆盖两者\n if (!(currentNode instanceof Element)) {\n return currentNode;\n }\n\n if (newVNode.directions?.if === false) {\n const nextNode = document.createComment('if');\n currentNode.parentNode?.replaceChild(nextNode, currentNode);\n this.unmount(oldVNode, currentNode, context);\n return nextNode;\n }\n\n this.applyProps(\n currentNode,\n oldVNode.props ?? {},\n newVNode.props ?? {},\n context\n );\n this.updateListeners(\n currentNode,\n this.collectListeners(oldVNode),\n this.collectListeners(newVNode)\n );\n this.updateChildren(currentNode, oldVNode, newVNode, context);\n this.applyDirections(\n currentNode,\n oldVNode.directions,\n newVNode.directions,\n context\n );\n\n return currentNode;\n }\n\n public unmount(\n vnode: TNode,\n currentNode: Node,\n context: RenderRuntimeContext\n ): void {\n if (!(currentNode instanceof Element)) {\n return;\n }\n\n this.effects.get(currentNode)?.forEach((item) => stop(item));\n this.effects.delete(currentNode);\n\n this.listeners.get(currentNode)?.forEach(({ eventName, listener }) => {\n currentNode.removeEventListener(eventName, listener);\n });\n this.listeners.delete(currentNode);\n this.modelBindings.cleanup(currentNode as HTMLElement);\n this.unmountChildren(currentNode, vnode, context);\n }\n\n protected mountChildren(\n element: Element,\n vnode: TNode,\n context: RenderRuntimeContext\n ): void {\n toChildren(vnode.children).forEach((child) => {\n element.appendChild(context.renderer.mount(child, context));\n });\n }\n\n protected updateChildren(\n element: Element,\n oldVNode: TNode,\n newVNode: TNode,\n context: RenderRuntimeContext\n ): void {\n this.updateOrdinaryChildren(\n element,\n toChildren(oldVNode.children),\n toChildren(newVNode.children),\n context\n );\n }\n\n protected unmountChildren(\n element: Element,\n vnode: TNode,\n context: RenderRuntimeContext\n ): void {\n toChildren(vnode.children).forEach((child, index) => {\n const childNode = element.childNodes[index];\n if (childNode) {\n context.renderer.unmount(child, childNode, context);\n }\n });\n }\n\n private applyProps(\n element: Element,\n oldProps: HTMLProps,\n newProps: HTMLProps,\n context: RenderRuntimeContext\n ): void {\n Object.keys(oldProps).forEach((key) => {\n if (isEventProp(key) || key in newProps) {\n return;\n }\n\n if (key === 'className' || key === 'class') {\n element.removeAttribute('class');\n } else if (key === 'style') {\n element.removeAttribute('style');\n } else if (\n key === 'value' &&\n typeof element === 'object' &&\n element !== null &&\n 'value' in element\n ) {\n (element as HTMLElement & { value: string }).value = '';\n } else {\n element.removeAttribute(attributeName(key));\n }\n });\n\n Object.entries(newProps).forEach(([key, value]) => {\n if (isEventProp(key)) {\n return;\n }\n\n // 值未变化时跳过 DOM 更新,避免每次 patch 全量重写属性\n if (oldProps[key] === value) {\n return;\n }\n\n if (key === 'className' || key === 'class') {\n // SVG 元素的 className 是 SVGAnimatedString,直接赋值在部分环境\n // 不可靠;统一走 class 属性。\n if (element.namespaceURI === SVG_NAMESPACE) {\n element.setAttribute('class', String(value ?? ''));\n } else {\n (element as HTMLElement).className = String(value ?? '');\n }\n return;\n }\n\n // 表单控件(input/textarea/select/option)的 value 必须写入 DOM\n // property 而不是 attribute:setAttribute('value') 只更新默认值,\n // 用户输入或程序修改后的当前值不会随之变化。\n if (\n key === 'value' &&\n typeof element === 'object' &&\n element !== null &&\n 'value' in element\n ) {\n (element as HTMLElement & { value: string }).value = String(\n value ?? ''\n );\n return;\n }\n\n if (key === 'style' && typeof value === 'object' && value !== null) {\n element.removeAttribute('style');\n const style = (element as HTMLElement).style;\n Object.entries(value).forEach(([cssKey, cssValue]) => {\n setStyleValue(style, cssKey, cssValue);\n });\n return;\n }\n\n if (value === false || value === undefined || value === null) {\n element.removeAttribute(attributeName(key));\n return;\n }\n\n if (value === true) {\n element.setAttribute(attributeName(key), '');\n return;\n }\n\n if (\n typeof value === 'string' &&\n context.templateEngine.hasExpressions(value)\n ) {\n this.setupReactiveAttribute(element, key, value, context);\n return;\n }\n\n element.setAttribute(attributeName(key), String(value));\n });\n }\n\n private applyDirections(\n element: Element,\n oldDirections: HTMLNode['directions'],\n newDirections: HTMLNode['directions'],\n context: RenderRuntimeContext\n ): void {\n if (newDirections && 'show' in newDirections) {\n (element as HTMLElement).style.display = newDirections.show ? '' : 'none';\n } else if (oldDirections && 'show' in oldDirections) {\n (element as HTMLElement).style.display = '';\n }\n\n if (!newDirections?.model) {\n this.modelBindings.cleanup(element as HTMLElement);\n return;\n }\n\n this.modelBindings.bind(\n element as HTMLElement,\n newDirections.model,\n context.templateEngine.state as Record<string, unknown>\n );\n }\n\n private updateOrdinaryChildren(\n element: Element,\n oldChildren: Array<VNode | string>,\n newChildren: Array<VNode | string>,\n context: RenderRuntimeContext\n ): void {\n this.assertNoDuplicateKeys(oldChildren);\n this.assertNoDuplicateKeys(newChildren);\n\n if (this.hasOnlyKeyedChildren(oldChildren, newChildren)) {\n this.updateKeyedChildren(element, oldChildren, newChildren, context);\n return;\n }\n\n const sharedLength = Math.min(oldChildren.length, newChildren.length);\n\n for (let index = 0; index < sharedLength; index += 1) {\n const childNode = element.childNodes[index];\n if (!childNode) {\n element.appendChild(\n context.renderer.mount(newChildren[index], context)\n );\n continue;\n }\n context.renderer.patch(\n oldChildren[index],\n newChildren[index],\n childNode,\n context\n );\n }\n\n for (let index = sharedLength; index < newChildren.length; index += 1) {\n element.appendChild(context.renderer.mount(newChildren[index], context));\n }\n\n for (\n let index = oldChildren.length - 1;\n index >= newChildren.length;\n index -= 1\n ) {\n const childNode = element.childNodes[index];\n if (childNode) {\n context.renderer.unmount(oldChildren[index], childNode, context);\n if (childNode.parentNode === element) {\n element.removeChild(childNode);\n }\n }\n }\n }\n\n private updateKeyedChildren(\n element: Element,\n oldChildren: Array<VNode | string>,\n newChildren: Array<VNode | string>,\n context: RenderRuntimeContext\n ): void {\n const oldEntries = oldChildren.map((vnode, index) => ({\n vnode,\n node: element.childNodes[index],\n index,\n }));\n const keyedOldEntries = new Map<\n string | number,\n { vnode: VNode | string; node: Node; index: number }\n >();\n const usedOldIndexes = new Set<number>();\n\n oldEntries.forEach((entry) => {\n const key = this.getVNodeKey(entry.vnode);\n if (key !== undefined && entry.node) {\n keyedOldEntries.set(key, {\n vnode: entry.vnode,\n node: entry.node,\n index: entry.index,\n });\n }\n });\n\n newChildren.forEach((newChild, newIndex) => {\n const key = this.getVNodeKey(newChild);\n const oldEntry = key === undefined ? undefined : keyedOldEntries.get(key);\n let nextNode: Node;\n\n if (oldEntry) {\n nextNode = context.renderer.patch(\n oldEntry.vnode,\n newChild,\n oldEntry.node,\n context\n );\n usedOldIndexes.add(oldEntry.index);\n } else {\n nextNode = context.renderer.mount(newChild, context);\n }\n\n const referenceNode = element.childNodes[newIndex] ?? null;\n if (nextNode !== referenceNode) {\n element.insertBefore(nextNode, referenceNode);\n }\n });\n\n oldEntries.forEach((entry) => {\n if (!entry.node || usedOldIndexes.has(entry.index)) {\n return;\n }\n\n context.renderer.unmount(entry.vnode, entry.node, context);\n if (entry.node.parentNode === element) {\n element.removeChild(entry.node);\n }\n });\n }\n\n private hasOnlyKeyedChildren(\n oldChildren: Array<VNode | string>,\n newChildren: Array<VNode | string>\n ): boolean {\n return [...oldChildren, ...newChildren].every(\n (child) => this.getVNodeKey(child) !== undefined\n );\n }\n\n private assertNoDuplicateKeys(children: Array<VNode | string>): void {\n const keys = new Set<string | number>();\n\n children.forEach((child) => {\n const key = this.getVNodeKey(child);\n if (key === undefined) {\n return;\n }\n\n if (keys.has(key)) {\n throw new Error(`Duplicate key \"${key}\"`);\n }\n\n keys.add(key);\n });\n }\n\n private getVNodeKey(vnode: VNode | string): string | number | undefined {\n if (typeof vnode === 'string') {\n return undefined;\n }\n\n return vnode.key;\n }\n\n private collectListeners(vnode: HTMLNode): EventListeners {\n const listeners: EventListeners = {};\n\n Object.entries(vnode.props ?? {}).forEach(([key, value]) => {\n if (isEventProp(key) && typeof value === 'function') {\n listeners[eventNameFromProp(key)] = value as (event: Event) => void;\n }\n });\n\n return {\n ...listeners,\n ...(vnode.listeners ?? {}),\n };\n }\n\n private updateListeners(\n element: Element,\n oldListeners: EventListeners,\n newListeners: EventListeners\n ): void {\n const store = this.listeners.get(element) ?? new Map();\n const oldKeys = new Set(Object.keys(oldListeners));\n const newKeys = new Set(Object.keys(newListeners));\n\n oldKeys.forEach((event) => {\n if (!newKeys.has(event) || oldListeners[event] !== newListeners[event]) {\n const stored = store.get(event);\n if (stored) {\n element.removeEventListener(stored.eventName, stored.listener);\n store.delete(event);\n }\n }\n });\n\n newKeys.forEach((event) => {\n if (!oldKeys.has(event) || oldListeners[event] !== newListeners[event]) {\n const { eventName, modifiers } = parseEventName(event);\n const listener = wrapEventHandler(newListeners[event], modifiers);\n element.addEventListener(eventName, listener);\n store.set(event, { eventName, listener });\n }\n });\n\n this.listeners.set(element, store);\n }\n\n private setupReactiveAttribute(\n element: Element,\n attrName: string,\n attrValue: string,\n context: RenderRuntimeContext\n ): void {\n const effectRef = effect(() => {\n element.setAttribute(\n attrName,\n context.templateEngine.evaluateTemplateValue(attrValue)\n );\n });\n\n this.trackEffect(element, effectRef);\n }\n\n private trackEffect(element: Element, effectRef: ReactiveEffect): void {\n const effects = this.effects.get(element) ?? new Set();\n effects.add(effectRef);\n this.effects.set(element, effects);\n }\n}\n\n/** dataId -> data-id:元素属性写入 data-id,事件回调可从 currentTarget.dataset 读取。 */\nfunction attributeName(key: string): string {\n if (key.startsWith('data') && key.length > 4) {\n return `data${key\n .slice(4)\n .replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`)}`;\n }\n // 标准 HTML 属性名不使用 camelCase\n if (key === 'tabIndex' || key === 'colSpan' || key === 'htmlFor') {\n return key.toLowerCase();\n }\n return key;\n}\n",
|
|
12
|
+
"import type { ComponentEventListener, ComponentProps } from './component/base';\nimport {\n ComponentNode,\n SlotProvider,\n VNode,\n isComponentNode,\n isSlotProvider,\n toChildren,\n} from './vnode';\nimport { ElementRenderStrategy } from './renderer/element-strategy';\nexport { ElementRenderStrategy } from './renderer/element-strategy';\nexport type {\n ComponentInstance,\n RenderRuntimeContext,\n RenderStrategy,\n Renderable,\n RendererHost,\n} from './renderer/types';\nimport type {\n ComponentInstance,\n RenderRuntimeContext,\n RenderStrategy,\n Renderable,\n} from './renderer/types';\n\nexport class RendererContext {\n private readonly strategies: RenderStrategy[];\n\n constructor() {\n this.strategies = [\n new TextRenderStrategy(),\n new ComponentRenderStrategy(),\n new SlotRenderStrategy(),\n new ElementRenderStrategy(),\n ];\n }\n\n public mount(vnode: Renderable, context: RenderRuntimeContext): Node {\n return this.findStrategy(vnode).mount(vnode as never, context);\n }\n\n public patch(\n oldVNode: Renderable,\n newVNode: Renderable,\n currentNode: Node,\n context: RenderRuntimeContext\n ): Node {\n const oldStrategy = this.findStrategy(oldVNode);\n const newStrategy = this.findStrategy(newVNode);\n\n if (oldStrategy !== newStrategy) {\n const nextNode = newStrategy.mount(newVNode as never, context);\n currentNode.parentNode?.replaceChild(nextNode, currentNode);\n oldStrategy.unmount(oldVNode as never, currentNode, context);\n return nextNode;\n }\n\n return oldStrategy.patch(\n oldVNode as never,\n newVNode as never,\n currentNode,\n context\n );\n }\n\n public unmount(\n vnode: Renderable,\n currentNode: Node,\n context: RenderRuntimeContext\n ): void {\n this.findStrategy(vnode).unmount(vnode as never, currentNode, context);\n }\n\n private findStrategy(vnode: Renderable): RenderStrategy {\n const strategy = this.strategies.find((item) => item.matches(vnode));\n if (!strategy) {\n throw new Error('No render strategy found for vnode');\n }\n return strategy;\n }\n}\n\nexport class TextRenderStrategy implements RenderStrategy<string> {\n public matches(vnode: Renderable): vnode is string {\n return typeof vnode === 'string';\n }\n\n public mount(vnode: string, context: RenderRuntimeContext): Node {\n return context.templateEngine.parseTemplate(vnode);\n }\n\n public patch(\n oldVNode: string,\n newVNode: string,\n currentNode: Node,\n context: RenderRuntimeContext\n ): Node {\n if (oldVNode === newVNode) {\n return currentNode;\n }\n\n const nextNode = this.mount(newVNode, context);\n currentNode.parentNode?.replaceChild(nextNode, currentNode);\n return nextNode;\n }\n\n public unmount(): void {}\n}\n\nexport class ComponentRenderStrategy implements RenderStrategy<ComponentNode> {\n private readonly instances = new WeakMap<Node, ComponentInstance>();\n private readonly instanceNodes = new Map<ComponentInstance, Set<Node>>();\n private readonly emitterUnsubscribers = new WeakMap<\n ComponentInstance,\n Map<string, { listener: ComponentEventListener; unsubscribe: () => void }>\n >();\n\n public matches(vnode: Renderable): vnode is ComponentNode {\n return (\n typeof vnode === 'object' && vnode !== null && isComponentNode(vnode)\n );\n }\n\n public mount(vnode: ComponentNode, context: RenderRuntimeContext): Node {\n if (vnode.directions?.if === false) {\n return document.createComment('if');\n }\n\n const ComponentClass = vnode.component as new (\n props?: ComponentProps\n ) => ComponentInstance;\n const instance = new ComponentClass(this.createProps(vnode));\n\n if (context.appContext && instance.setAppContext) {\n instance.setAppContext(context.appContext);\n }\n\n this.syncEmitters(instance, vnode.emitters ?? {});\n\n context.registerChild(instance);\n\n const node = instance.mountToNode();\n this.trackInstanceNode(instance, node);\n instance.setElementChangeListener?.((previousNode, nextNode) => {\n this.trackInstanceNode(instance, previousNode);\n this.trackInstanceNode(instance, nextNode);\n });\n return node;\n }\n\n public patch(\n oldVNode: ComponentNode,\n newVNode: ComponentNode,\n currentNode: Node,\n context: RenderRuntimeContext\n ): Node {\n if (currentNode.nodeType === Node.COMMENT_NODE) {\n const nextNode = this.mount(newVNode, context);\n currentNode.parentNode?.replaceChild(nextNode, currentNode);\n return nextNode;\n }\n\n if (newVNode.directions?.if === false) {\n const nextNode = document.createComment('if');\n currentNode.parentNode?.replaceChild(nextNode, currentNode);\n this.unmount(oldVNode, currentNode, context);\n return nextNode;\n }\n\n const instance = this.instances.get(currentNode);\n\n if (instance && oldVNode.component === newVNode.component) {\n this.syncEmitters(instance, newVNode.emitters ?? {});\n instance.setProps(this.createProps(newVNode));\n const nextNode = instance.getElement() ?? currentNode;\n this.trackInstanceNode(instance, nextNode);\n return nextNode;\n }\n\n const nextNode = this.mount(newVNode, context);\n currentNode.parentNode?.replaceChild(nextNode, currentNode);\n this.unmount(oldVNode, currentNode, context);\n return nextNode;\n }\n\n public unmount(\n _vnode: ComponentNode,\n currentNode: Node,\n context: RenderRuntimeContext\n ): void {\n const instance = this.instances.get(currentNode);\n if (instance) {\n this.clearEmitters(instance);\n instance.unmount();\n this.clearInstanceNodes(instance);\n context.unregisterChild(instance);\n }\n }\n\n private createProps(vnode: ComponentNode): ComponentProps {\n return {\n ...(vnode.props ?? {}),\n children: toChildren(vnode.children),\n };\n }\n\n private syncEmitters(\n instance: ComponentInstance,\n emitters: NonNullable<ComponentNode['emitters']>\n ): void {\n const current = this.emitterUnsubscribers.get(instance) ?? new Map();\n\n current.forEach(({ listener: currentListener, unsubscribe }, eventName) => {\n const listener = emitters[eventName];\n if (!listener || listener !== currentListener) {\n unsubscribe();\n current.delete(eventName);\n }\n });\n\n Object.entries(emitters).forEach(([eventName, listener]) => {\n if (current.get(eventName)?.listener === listener) {\n return;\n }\n\n current.set(eventName, {\n listener,\n unsubscribe: instance.on(eventName, listener),\n });\n });\n\n this.emitterUnsubscribers.set(instance, current);\n }\n\n private clearEmitters(instance: ComponentInstance): void {\n this.emitterUnsubscribers.get(instance)?.forEach(({ unsubscribe }) => {\n unsubscribe();\n });\n this.emitterUnsubscribers.delete(instance);\n }\n\n private trackInstanceNode(instance: ComponentInstance, node: Node): void {\n this.instances.set(node, instance);\n const nodes = this.instanceNodes.get(instance) ?? new Set<Node>();\n nodes.add(node);\n this.instanceNodes.set(instance, nodes);\n }\n\n private clearInstanceNodes(instance: ComponentInstance): void {\n this.instanceNodes.get(instance)?.forEach((node) => {\n this.instances.delete(node);\n });\n this.instanceNodes.delete(instance);\n }\n}\n\nexport class SlotRenderStrategy implements RenderStrategy<SlotProvider> {\n private readonly renderedChildren = new WeakMap<\n HTMLElement,\n Array<VNode | string>\n >();\n\n public matches(vnode: Renderable): vnode is SlotProvider {\n return typeof vnode === 'object' && vnode !== null && isSlotProvider(vnode);\n }\n\n public mount(vnode: SlotProvider, context: RenderRuntimeContext): Node {\n if (vnode.directions?.if === false) {\n return document.createComment('if');\n }\n\n const slotContainer = document.createElement('div');\n slotContainer.setAttribute('data-slot', vnode.props.name);\n this.mountSlotChildren(\n slotContainer,\n this.resolveChildren(vnode, context),\n context\n );\n return slotContainer;\n }\n\n public patch(\n oldVNode: SlotProvider,\n newVNode: SlotProvider,\n currentNode: Node,\n context: RenderRuntimeContext\n ): Node {\n if (currentNode.nodeType === Node.COMMENT_NODE) {\n const nextNode = this.mount(newVNode, context);\n currentNode.parentNode?.replaceChild(nextNode, currentNode);\n return nextNode;\n }\n\n if (newVNode.directions?.if === false) {\n const nextNode = document.createComment('if');\n currentNode.parentNode?.replaceChild(nextNode, currentNode);\n this.unmount(oldVNode, currentNode, context);\n return nextNode;\n }\n\n if (currentNode instanceof HTMLElement) {\n currentNode.setAttribute('data-slot', newVNode.props.name);\n this.replaceSlotChildren(currentNode, oldVNode, newVNode, context);\n }\n return currentNode;\n }\n\n public unmount(\n _vnode: SlotProvider,\n currentNode: Node,\n context: RenderRuntimeContext\n ): void {\n if (!(currentNode instanceof HTMLElement)) {\n return;\n }\n\n this.unmountSlotChildren(currentNode, context);\n this.renderedChildren.delete(currentNode);\n }\n\n private resolveChildren(\n vnode: SlotProvider,\n context: RenderRuntimeContext\n ): Array<VNode | string> {\n return context.slots[vnode.props.name] ?? toChildren(vnode.children);\n }\n\n private replaceSlotChildren(\n element: HTMLElement,\n _oldVNode: SlotProvider,\n newVNode: SlotProvider,\n context: RenderRuntimeContext\n ): void {\n const oldChildren = this.renderedChildren.get(element) ?? [];\n const newChildren = this.resolveChildren(newVNode, context);\n const sharedLength = Math.min(oldChildren.length, newChildren.length);\n\n // 复用已有节点逐个 patch,避免 slot 内容整体重建导致\n // 组件实例与 DOM 元素(含焦点)丢失。\n for (let index = 0; index < sharedLength; index += 1) {\n const childNode = element.childNodes[index];\n if (!childNode) {\n element.appendChild(\n context.renderer.mount(newChildren[index], context)\n );\n continue;\n }\n context.renderer.patch(\n oldChildren[index],\n newChildren[index],\n childNode,\n context\n );\n }\n\n for (let index = sharedLength; index < newChildren.length; index += 1) {\n element.appendChild(context.renderer.mount(newChildren[index], context));\n }\n\n for (\n let index = oldChildren.length - 1;\n index >= newChildren.length;\n index -= 1\n ) {\n const childNode = element.childNodes[index];\n if (childNode) {\n context.renderer.unmount(oldChildren[index], childNode, context);\n if (childNode.parentNode === element) {\n element.removeChild(childNode);\n }\n }\n }\n\n this.renderedChildren.set(element, newChildren);\n }\n\n private mountSlotChildren(\n element: HTMLElement,\n children: Array<VNode | string>,\n context: RenderRuntimeContext\n ): void {\n children.forEach((child) => {\n element.appendChild(context.renderer.mount(child, context));\n });\n this.renderedChildren.set(element, children);\n }\n\n private unmountSlotChildren(\n element: HTMLElement,\n context: RenderRuntimeContext\n ): void {\n const children = this.renderedChildren.get(element) ?? [];\n children.forEach((child, index) => {\n const childNode = element.childNodes[index];\n if (childNode) {\n context.renderer.unmount(child, childNode, context);\n }\n });\n }\n}\n",
|
|
13
13
|
"import { effect, ReactiveEffect, stop } from './reactive';\n\nexport interface TemplateBinding {\n node: Text;\n originalText: string;\n effect: ReactiveEffect;\n}\n\nexport class TemplateEngine {\n private bindings: TemplateBinding[] = [];\n private readonly templateRegex = /{{(.*?)}}/g;\n\n constructor(public state: object) {\n if (!state || typeof state !== 'object') {\n throw new Error('TemplateEngine requires a valid state object');\n }\n }\n\n /**\n * 解析模板字符串,创建响应式的文本节点\n * @param text 包含模板表达式的文本字符串\n * @returns 创建的文本节点\n */\n public parseTemplate(text: string): Text {\n if (typeof text !== 'string') {\n text = String(text);\n }\n\n const textNode = document.createTextNode('');\n this.templateRegex.lastIndex = 0;\n const matches = Array.from(text.matchAll(this.templateRegex));\n\n if (matches && matches.length > 0) {\n this.setupReactiveBindings(textNode, text, matches);\n } else {\n // 如果没有模板表达式,直接设置文本内容\n textNode.textContent = text;\n }\n\n return textNode;\n }\n\n /**\n * 设置响应式绑定\n */\n private setupReactiveBindings(\n node: Text,\n originalText: string,\n matches: RegExpExecArray[]\n ): void {\n // 存储所有需要监控的键\n const keys = new Set<string>();\n\n // 第一次计算并设置文本内容\n const initialText = this.evaluateTemplate(originalText, matches, keys);\n node.textContent = initialText;\n\n // 创建响应式effect,当任何相关的状态变化时更新文本\n const effectFn = effect(() => {\n try {\n const updatedText = this.evaluateTemplate(originalText, matches, keys);\n if (node.textContent !== updatedText) {\n node.textContent = updatedText;\n }\n } catch (error) {\n console.error('Template update error:', error);\n node.textContent = `Error: ${error instanceof Error ? error.message : 'Unknown error'}`;\n }\n });\n\n // 存储绑定关系,以便后续清理\n this.bindings.push({\n node,\n originalText,\n effect: effectFn,\n });\n }\n\n /**\n * 计算模板文本的值\n */\n private evaluateTemplate(\n text: string,\n matches: RegExpExecArray[],\n keys: Set<string>\n ): string {\n let result = text;\n\n matches.forEach((match) => {\n const key = match[1]?.trim();\n if (key) {\n keys.add(key);\n\n // 尝试获取状态值\n const value = this.getValueFromState(key);\n // 将undefined或null转换为空字符串\n const displayValue =\n value === undefined || value === null ? '' : String(value);\n result = result.replace(match[0], displayValue);\n }\n });\n\n return result;\n }\n\n /**\n * 从状态对象中获取值,支持嵌套属性访问\n */\n private getValueFromState(keyPath: string): unknown {\n if (!keyPath) return undefined;\n\n // 支持嵌套属性访问,如 'user.name'\n const keys = keyPath.split('.');\n let value: unknown = this.state;\n\n for (const key of keys) {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n value = (value as Record<string, unknown>)[key];\n }\n\n return value;\n }\n\n /**\n * 清除所有模板绑定\n */\n public clearBindings(): void {\n // 停止所有effect\n this.bindings.forEach((binding) => {\n stop(binding.effect);\n });\n this.bindings = [];\n }\n\n /**\n * 获取当前的绑定数量\n */\n public getBindingCount(): number {\n return this.bindings.length;\n }\n\n /**\n * 检查模板是否包含表达式\n */\n public hasExpressions(text: string): boolean {\n this.templateRegex.lastIndex = 0;\n return this.templateRegex.test(text);\n }\n\n /**\n * 获取模板中的所有表达式键\n */\n public extractKeys(text: string): string[] {\n const keys: string[] = [];\n let match;\n const regex = new RegExp(this.templateRegex, 'g');\n\n while ((match = regex.exec(text)) !== null) {\n const key = match[1]?.trim();\n if (key) {\n keys.push(key);\n }\n }\n\n return keys;\n }\n\n /**\n * 计算模板值\n */\n public evaluateTemplateValue(text: string): string {\n this.templateRegex.lastIndex = 0;\n const matches = Array.from(text.matchAll(this.templateRegex));\n if (!matches || matches.length === 0) {\n return text;\n }\n\n const keys = new Set<string>();\n return this.evaluateTemplate(text, matches, keys);\n }\n}\n",
|
|
14
|
-
"import { StyleManager } from '../../style/StyleManager';\nimport {\n ReactiveEffect,\n ReactiveSystem,\n effect,\n reactive,\n reactiveScheduler,\n stop,\n} from '../reactive';\nimport {\n ComponentInstance,\n RenderRuntimeContext,\n RendererContext,\n} from '../renderer';\nimport { TemplateEngine } from '../template';\nimport type { VNode } from '../vnode';\n\nexport type ComponentProps = object;\n\nexport type ComponentState = object;\n\nexport type ComponentEventListener = (...args: unknown[]) => void;\n\nexport type InjectionKey<T> = (string | symbol) & {\n readonly __injectionType?: T;\n};\n\nexport interface InjectionResult<T> {\n found: boolean;\n value: T | undefined;\n}\n\nexport type ComponentConstructor<\n TProps extends ComponentProps = ComponentProps,\n TState extends ComponentState = ComponentState,\n> = new (props?: TProps) => Component<TProps, TState>;\n\nexport type AnyComponentConstructor = new (\n props?: never\n) => Component<ComponentProps, ComponentState>;\n\nexport abstract class Component<\n TProps extends ComponentProps = ComponentProps,\n TState extends ComponentState = ComponentState,\n> implements ComponentInstance {\n private vnode: VNode | null = null;\n private el: Node | null = null;\n private readonly renderer = new RendererContext();\n private readonly templateEngine: TemplateEngine;\n private readonly childComponents = new Set<ComponentInstance>();\n private readonly eventListeners: Record<string, Set<ComponentEventListener>> =\n {};\n private readonly providers = new Map<string | symbol, unknown>();\n private readonly updateEffect: ReactiveEffect;\n private appContext: unknown = null;\n private parentComponent: ComponentInstance | null = null;\n private elementChangeListener:\n ((previousElement: Node, nextElement: Node) => void) | null = null;\n\n protected styleManager: StyleManager;\n public state: TState;\n public mounted = false;\n\n constructor(protected props: TProps = {} as TProps) {\n this.styleManager = new StyleManager();\n this.state = reactive(this.initState() ?? {});\n this.templateEngine = new TemplateEngine(this.state);\n this.initStyles();\n\n this.updateEffect = effect(\n () => {\n // 依赖在 render 期间按需收集(细粒度):只对 render 实际访问的\n // state 属性建立依赖,未访问的属性变化不会触发重渲染\n if (this.mounted) {\n try {\n this.update();\n } catch (error) {\n if (!this.dispatchError(error)) {\n throw error;\n }\n }\n }\n },\n {\n throwOnError: true,\n // 通过调度器合并同一批同步状态变更,避免逐次重渲染\n scheduler: (updateEffect) => {\n reactiveScheduler.enqueue(updateEffect);\n },\n }\n );\n }\n\n protected abstract initState(): TState;\n protected abstract initStyles(): void;\n protected abstract render(): VNode;\n\n public mount(container: HTMLElement): void {\n if (!container || !(container instanceof HTMLElement)) {\n throw new Error('Invalid container element');\n }\n\n try {\n container.appendChild(this.mountToNode());\n } catch (error) {\n console.error('组件渲染错误:', error);\n throw error;\n }\n }\n\n public mountToNode(): Node {\n if (this.mounted && this.el) {\n return this.el;\n }\n\n this.beforeMount();\n // 渲染与挂载在组件自身 effect 上下文中执行,避免子组件渲染\n // 把 state 依赖收集到父组件的 effect 上(跨组件依赖污染)。\n this.el = ReactiveSystem.getInstance().runWithEffect(\n this.updateEffect,\n () => {\n try {\n this.vnode = this.render();\n return this.renderer.mount(this.vnode, this.createRenderContext());\n } catch (error) {\n // 渲染或子组件挂载失败:先交给祖先错误边界,未处理才向外抛出\n if (this.dispatchError(error)) {\n return document.createComment('error-boundary');\n }\n throw error;\n }\n }\n );\n this.mounted = true;\n this.onMounted();\n return this.el;\n }\n\n public update(): void {\n if (!this.el || !this.vnode) {\n return;\n }\n\n this.beforeUpdate();\n const currentVNode = this.vnode;\n const currentElement = this.el;\n // 与 mountToNode 同理:render 期间的响应式访问只收集到自身 effect。\n this.el = ReactiveSystem.getInstance().runWithEffect(\n this.updateEffect,\n () => {\n const newVNode = this.render();\n const nextElement = this.renderer.patch(\n currentVNode,\n newVNode,\n currentElement,\n this.createRenderContext()\n );\n this.vnode = newVNode;\n return nextElement;\n }\n );\n if (currentElement !== this.el) {\n this.elementChangeListener?.(currentElement, this.el);\n }\n this.onUpdated();\n }\n\n public unmount(): void {\n if (!this.mounted) {\n return;\n }\n\n this.beforeUnmount();\n\n if (this.vnode && this.el) {\n this.renderer.unmount(this.vnode, this.el, this.createRenderContext());\n }\n\n this.childComponents.clear();\n Object.keys(this.eventListeners).forEach((eventName) => {\n this.eventListeners[eventName].clear();\n delete this.eventListeners[eventName];\n });\n this.providers.clear();\n this.parentComponent = null;\n this.elementChangeListener = null;\n this.templateEngine.clearBindings();\n this.styleManager.destroy();\n stop(this.updateEffect);\n\n if (this.el?.parentNode) {\n this.el.parentNode.removeChild(this.el);\n }\n\n this.el = null;\n this.vnode = null;\n this.mounted = false;\n this.onUnmounted();\n }\n\n public setProps(props: Partial<TProps>): void {\n this.props = {\n ...this.props,\n ...props,\n };\n\n if (this.mounted) {\n // 与 state 更新走同一调度器:同一批多次 setProps 合并为一次更新\n reactiveScheduler.enqueue(this.updateEffect);\n }\n }\n\n public setState(state: Partial<TState>): void {\n Object.assign(this.state, state);\n }\n\n public setAppContext(context: unknown): void {\n this.appContext = context;\n this.childComponents.forEach((child) => {\n child.setAppContext?.(context);\n });\n }\n\n public setParentComponent(parent: ComponentInstance | null): void {\n this.parentComponent = parent;\n }\n\n public getParentComponent(): ComponentInstance | null {\n return this.parentComponent;\n }\n\n public setElementChangeListener(\n listener: (previousElement: Node, nextElement: Node) => void\n ): void {\n this.elementChangeListener = listener;\n }\n\n public provide<T>(key: InjectionKey<T>, value: T): void {\n this.providers.set(key, value);\n }\n\n public inject<T>(key: InjectionKey<T>): T | undefined;\n public inject<T>(key: InjectionKey<T>, fallback: T): T;\n public inject<T>(key: InjectionKey<T>, fallback?: T): T | undefined {\n const result = this.resolveInjection(key);\n return result.found ? result.value : fallback;\n }\n\n public resolveInjection<T>(key: InjectionKey<T>): InjectionResult<T> {\n if (this.providers.has(key)) {\n return { found: true, value: this.providers.get(key) as T | undefined };\n }\n\n if (this.parentComponent?.resolveInjection) {\n return this.parentComponent.resolveInjection(key);\n }\n\n return this.resolveAppInjection(key);\n }\n\n public getElement(): Node | null {\n return this.el;\n }\n\n protected beforeMount(): void {}\n\n protected onMounted(): void {}\n\n protected beforeUpdate(): void {}\n\n protected onUpdated(): void {}\n\n protected beforeUnmount(): void {}\n\n protected onUnmounted(): void {}\n\n /**\n * 错误边界钩子:后代组件渲染或更新抛错时被调用。\n * 返回 false 表示错误已被处理并停止继续向上传播;\n * 返回 true 或 undefined 时错误继续冒泡到更外层边界。\n */\n protected onErrorCaptured?(\n error: unknown,\n instance: ComponentInstance\n ): boolean | void;\n\n /**\n * 沿组件父链寻找最近的错误边界。返回 true 表示错误已被边界处理。\n */\n private dispatchError(error: unknown): boolean {\n let current: ComponentInstance | null = this.getParentComponent();\n while (current) {\n // 同类实例可访问 protected 生命周期钩子\n const boundary = current as unknown as Component;\n if (typeof boundary.onErrorCaptured === 'function') {\n const handled = boundary.onErrorCaptured(error, this);\n if (handled === false) {\n return true;\n }\n }\n current = current.getParentComponent?.() ?? null;\n }\n return false;\n }\n\n protected getContext(): unknown {\n return this.appContext;\n }\n\n protected get router() {\n return this.getRouterFrom(this.appContext) ?? this.getRouterFromGlobalApp();\n }\n\n protected emit(eventName: string, ...args: unknown[]): void {\n this.eventListeners[eventName]?.forEach((listener) => {\n listener(...args);\n });\n }\n\n public on(eventName: string, listener: ComponentEventListener): () => void {\n if (!this.eventListeners[eventName]) {\n this.eventListeners[eventName] = new Set();\n }\n this.eventListeners[eventName].add(listener);\n\n return () => this.off(eventName, listener);\n }\n\n public off(eventName: string, listener: ComponentEventListener): void {\n this.eventListeners[eventName]?.delete(listener);\n }\n\n private createRenderContext(): RenderRuntimeContext {\n return {\n appContext: this.appContext,\n templateEngine: this.templateEngine,\n renderer: this.renderer,\n slots: this.collectSlots(),\n registerChild: (component) => {\n this.childComponents.add(component);\n component.setParentComponent?.(this);\n component.setAppContext?.(this.appContext);\n },\n unregisterChild: (component) => {\n this.childComponents.delete(component);\n component.setParentComponent?.(null);\n },\n };\n }\n\n private collectSlots(): Record<string, Array<VNode | string>> {\n const slots: Record<string, Array<VNode | string>> = { default: [] };\n const children =\n (this.props as { children?: Array<VNode | string> }).children ?? [];\n\n children.forEach((child) => {\n const slotName = this.getSlotName(child);\n if (!slots[slotName]) {\n slots[slotName] = [];\n }\n slots[slotName].push(this.normalizeSlotChild(child));\n });\n\n return slots;\n }\n\n private getSlotName(child: VNode | string): string {\n if (typeof child === 'string') {\n return 'default';\n }\n\n return 'slot' in child && typeof child.slot === 'string'\n ? child.slot\n : 'default';\n }\n\n private normalizeSlotChild(child: VNode | string): VNode | string {\n if (typeof child === 'string' || !('slot' in child)) {\n return child;\n }\n\n const clone = { ...child };\n delete clone.slot;\n return clone as VNode;\n }\n\n private getRouterFrom(value: unknown): unknown {\n if (!value || typeof value !== 'object' || !('router' in value)) {\n return undefined;\n }\n\n return (value as { router?: unknown }).router;\n }\n\n private getRouterFromGlobalApp(): unknown {\n const globalApp = (globalThis as { __APP__?: unknown }).__APP__;\n return this.getRouterFrom(globalApp);\n }\n\n private resolveAppInjection<T>(key: InjectionKey<T>): InjectionResult<T> {\n if (!this.appContext || typeof this.appContext !== 'object') {\n return { found: false, value: undefined };\n }\n\n const app = (\n this.appContext as {\n app?: {\n resolveInjection?: (\n injectionKey: InjectionKey<T>\n ) => InjectionResult<T>;\n };\n }\n ).app;\n\n return app?.resolveInjection?.(key) ?? { found: false, value: undefined };\n }\n}\n",
|
|
14
|
+
"import { StyleManager } from '../../style/StyleManager';\nimport {\n ReactiveEffect,\n ReactiveSystem,\n effect,\n reactive,\n reactiveScheduler,\n stop,\n} from '../reactive';\nimport {\n ComponentInstance,\n RenderRuntimeContext,\n RendererContext,\n} from '../renderer';\nimport { TemplateEngine } from '../template';\nimport { toChildren } from '../vnode';\nimport type { VNode } from '../vnode';\n\nexport type ComponentProps = object;\n\nexport type ComponentState = object;\n\nexport type ComponentEventListener = (...args: unknown[]) => void;\n\nexport type InjectionKey<T> = (string | symbol) & {\n readonly __injectionType?: T;\n};\n\nexport interface InjectionResult<T> {\n found: boolean;\n value: T | undefined;\n}\n\nexport type ComponentConstructor<\n TProps extends ComponentProps = ComponentProps,\n TState extends ComponentState = ComponentState,\n> = new (props?: TProps) => Component<TProps, TState>;\n\nexport type AnyComponentConstructor = new (\n props?: never\n) => Component<ComponentProps, ComponentState>;\n\nexport abstract class Component<\n TProps extends ComponentProps = ComponentProps,\n TState extends ComponentState = ComponentState,\n> implements ComponentInstance {\n private vnode: VNode | null = null;\n private el: Node | null = null;\n private readonly renderer = new RendererContext();\n private readonly templateEngine: TemplateEngine;\n private readonly childComponents = new Set<ComponentInstance>();\n private readonly eventListeners: Record<string, Set<ComponentEventListener>> =\n {};\n private readonly providers = new Map<string | symbol, unknown>();\n private readonly updateEffect: ReactiveEffect;\n private appContext: unknown = null;\n private parentComponent: ComponentInstance | null = null;\n private elementChangeListener:\n ((previousElement: Node, nextElement: Node) => void) | null = null;\n\n protected styleManager: StyleManager;\n public state: TState;\n public mounted = false;\n\n constructor(protected props: TProps = {} as TProps) {\n this.styleManager = new StyleManager();\n this.state = reactive(this.initState() ?? {});\n this.templateEngine = new TemplateEngine(this.state);\n this.initStyles();\n\n this.updateEffect = effect(\n () => {\n // 依赖在 render 期间按需收集(细粒度):只对 render 实际访问的\n // state 属性建立依赖,未访问的属性变化不会触发重渲染\n if (this.mounted) {\n try {\n this.update();\n } catch (error) {\n if (!this.dispatchError(error)) {\n throw error;\n }\n }\n }\n },\n {\n throwOnError: true,\n // 通过调度器合并同一批同步状态变更,避免逐次重渲染\n scheduler: (updateEffect) => {\n reactiveScheduler.enqueue(updateEffect);\n },\n }\n );\n }\n\n protected abstract initState(): TState;\n protected abstract initStyles(): void;\n protected abstract render(): VNode;\n\n public mount(container: HTMLElement): void {\n if (!container || !(container instanceof HTMLElement)) {\n throw new Error('Invalid container element');\n }\n\n try {\n container.appendChild(this.mountToNode());\n } catch (error) {\n console.error('组件渲染错误:', error);\n throw error;\n }\n }\n\n public mountToNode(): Node {\n if (this.mounted && this.el) {\n return this.el;\n }\n\n this.beforeMount();\n // 渲染与挂载在组件自身 effect 上下文中执行,避免子组件渲染\n // 把 state 依赖收集到父组件的 effect 上(跨组件依赖污染)。\n this.el = ReactiveSystem.getInstance().runWithEffect(\n this.updateEffect,\n () => {\n try {\n this.vnode = this.render();\n return this.renderer.mount(this.vnode, this.createRenderContext());\n } catch (error) {\n // 渲染或子组件挂载失败:先交给祖先错误边界,未处理才向外抛出\n if (this.dispatchError(error)) {\n return document.createComment('error-boundary');\n }\n throw error;\n }\n }\n );\n this.mounted = true;\n this.onMounted();\n return this.el;\n }\n\n public update(): void {\n if (!this.el || !this.vnode) {\n return;\n }\n\n this.beforeUpdate();\n const currentVNode = this.vnode;\n const currentElement = this.el;\n // 与 mountToNode 同理:render 期间的响应式访问只收集到自身 effect。\n this.el = ReactiveSystem.getInstance().runWithEffect(\n this.updateEffect,\n () => {\n const newVNode = this.render();\n const nextElement = this.renderer.patch(\n currentVNode,\n newVNode,\n currentElement,\n this.createRenderContext()\n );\n this.vnode = newVNode;\n return nextElement;\n }\n );\n if (currentElement !== this.el) {\n this.elementChangeListener?.(currentElement, this.el);\n }\n this.onUpdated();\n }\n\n public unmount(): void {\n if (!this.mounted) {\n return;\n }\n\n this.beforeUnmount();\n\n if (this.vnode && this.el) {\n this.renderer.unmount(this.vnode, this.el, this.createRenderContext());\n }\n\n this.childComponents.clear();\n Object.keys(this.eventListeners).forEach((eventName) => {\n this.eventListeners[eventName].clear();\n delete this.eventListeners[eventName];\n });\n this.providers.clear();\n this.parentComponent = null;\n this.elementChangeListener = null;\n this.templateEngine.clearBindings();\n this.styleManager.destroy();\n stop(this.updateEffect);\n\n if (this.el?.parentNode) {\n this.el.parentNode.removeChild(this.el);\n }\n\n this.el = null;\n this.vnode = null;\n this.mounted = false;\n this.onUnmounted();\n }\n\n public setProps(props: Partial<TProps>): void {\n this.props = {\n ...this.props,\n ...props,\n };\n\n if (this.mounted) {\n // 与 state 更新走同一调度器:同一批多次 setProps 合并为一次更新\n reactiveScheduler.enqueue(this.updateEffect);\n }\n }\n\n public setState(state: Partial<TState>): void {\n Object.assign(this.state, state);\n }\n\n public setAppContext(context: unknown): void {\n this.appContext = context;\n this.childComponents.forEach((child) => {\n child.setAppContext?.(context);\n });\n }\n\n public setParentComponent(parent: ComponentInstance | null): void {\n this.parentComponent = parent;\n }\n\n public getParentComponent(): ComponentInstance | null {\n return this.parentComponent;\n }\n\n public setElementChangeListener(\n listener: (previousElement: Node, nextElement: Node) => void\n ): void {\n this.elementChangeListener = listener;\n }\n\n public provide<T>(key: InjectionKey<T>, value: T): void {\n this.providers.set(key, value);\n }\n\n public inject<T>(key: InjectionKey<T>): T | undefined;\n public inject<T>(key: InjectionKey<T>, fallback: T): T;\n public inject<T>(key: InjectionKey<T>, fallback?: T): T | undefined {\n const result = this.resolveInjection(key);\n return result.found ? result.value : fallback;\n }\n\n public resolveInjection<T>(key: InjectionKey<T>): InjectionResult<T> {\n if (this.providers.has(key)) {\n return { found: true, value: this.providers.get(key) as T | undefined };\n }\n\n if (this.parentComponent?.resolveInjection) {\n return this.parentComponent.resolveInjection(key);\n }\n\n return this.resolveAppInjection(key);\n }\n\n public getElement(): Node | null {\n return this.el;\n }\n\n protected beforeMount(): void {}\n\n protected onMounted(): void {}\n\n protected beforeUpdate(): void {}\n\n protected onUpdated(): void {}\n\n protected beforeUnmount(): void {}\n\n protected onUnmounted(): void {}\n\n /**\n * 错误边界钩子:后代组件渲染或更新抛错时被调用。\n * 返回 false 表示错误已被处理并停止继续向上传播;\n * 返回 true 或 undefined 时错误继续冒泡到更外层边界。\n */\n protected onErrorCaptured?(\n error: unknown,\n instance: ComponentInstance\n ): boolean | void;\n\n /**\n * 沿组件父链寻找最近的错误边界。返回 true 表示错误已被边界处理。\n */\n private dispatchError(error: unknown): boolean {\n let current: ComponentInstance | null = this.getParentComponent();\n while (current) {\n // 同类实例可访问 protected 生命周期钩子\n const boundary = current as unknown as Component;\n if (typeof boundary.onErrorCaptured === 'function') {\n const handled = boundary.onErrorCaptured(error, this);\n if (handled === false) {\n return true;\n }\n }\n current = current.getParentComponent?.() ?? null;\n }\n return false;\n }\n\n protected getContext(): unknown {\n return this.appContext;\n }\n\n protected get router() {\n return this.getRouterFrom(this.appContext) ?? this.getRouterFromGlobalApp();\n }\n\n protected emit(eventName: string, ...args: unknown[]): void {\n this.eventListeners[eventName]?.forEach((listener) => {\n listener(...args);\n });\n }\n\n public on(eventName: string, listener: ComponentEventListener): () => void {\n if (!this.eventListeners[eventName]) {\n this.eventListeners[eventName] = new Set();\n }\n this.eventListeners[eventName].add(listener);\n\n return () => this.off(eventName, listener);\n }\n\n public off(eventName: string, listener: ComponentEventListener): void {\n this.eventListeners[eventName]?.delete(listener);\n }\n\n private createRenderContext(): RenderRuntimeContext {\n return {\n appContext: this.appContext,\n templateEngine: this.templateEngine,\n renderer: this.renderer,\n slots: this.collectSlots(),\n registerChild: (component) => {\n this.childComponents.add(component);\n component.setParentComponent?.(this);\n component.setAppContext?.(this.appContext);\n },\n unregisterChild: (component) => {\n this.childComponents.delete(component);\n component.setParentComponent?.(null);\n },\n };\n }\n\n private collectSlots(): Record<string, Array<VNode | string>> {\n const slots: Record<string, Array<VNode | string>> = { default: [] };\n const children = toChildren(\n (this.props as { children?: Array<VNode | string> }).children\n );\n\n children.forEach((child) => {\n const slotName = this.getSlotName(child);\n if (!slots[slotName]) {\n slots[slotName] = [];\n }\n slots[slotName].push(this.normalizeSlotChild(child));\n });\n\n return slots;\n }\n\n private getSlotName(child: VNode | string): string {\n if (typeof child === 'string') {\n return 'default';\n }\n\n return 'slot' in child && typeof child.slot === 'string'\n ? child.slot\n : 'default';\n }\n\n private normalizeSlotChild(child: VNode | string): VNode | string {\n if (typeof child === 'string' || !('slot' in child)) {\n return child;\n }\n\n const clone = { ...child };\n delete clone.slot;\n return clone as VNode;\n }\n\n private getRouterFrom(value: unknown): unknown {\n if (!value || typeof value !== 'object' || !('router' in value)) {\n return undefined;\n }\n\n return (value as { router?: unknown }).router;\n }\n\n private getRouterFromGlobalApp(): unknown {\n const globalApp = (globalThis as { __APP__?: unknown }).__APP__;\n return this.getRouterFrom(globalApp);\n }\n\n private resolveAppInjection<T>(key: InjectionKey<T>): InjectionResult<T> {\n if (!this.appContext || typeof this.appContext !== 'object') {\n return { found: false, value: undefined };\n }\n\n const app = (\n this.appContext as {\n app?: {\n resolveInjection?: (\n injectionKey: InjectionKey<T>\n ) => InjectionResult<T>;\n };\n }\n ).app;\n\n return app?.resolveInjection?.(key) ?? { found: false, value: undefined };\n }\n}\n",
|
|
15
15
|
"import { Router } from './index';\n\n// 创建一个全局路由实例\nlet router: Router | null = null;\n\n/**\n * 设置全局路由实例\n * @param r 路由实例\n */\nexport function setRouter(r: Router): void {\n if (!r || !(r instanceof Router)) {\n throw new Error('Invalid router instance');\n }\n router = r;\n}\n\n/**\n * 获取路由实例\n * @returns 路由实例\n * @throws 当路由未初始化时抛出错误\n */\nexport function useRouter(): Router {\n if (!router) {\n throw new Error(\n 'Router is not initialized. Please make sure you have installed the router plugin.'\n );\n }\n return router;\n}\n\n/**\n * 安全地获取路由实例,如果未初始化则返回null\n * @returns 路由实例或null\n */\nexport function getRouter(): Router | null {\n return router;\n}\n\n/**\n * 检查路由是否已初始化\n * @returns 是否已初始化\n */\nexport function hasRouter(): boolean {\n return router !== null;\n}\n\n/**\n * 重置路由实例(主要用于测试)\n */\nexport function resetRouter(): void {\n router = null;\n}\n",
|
|
16
16
|
"import type { RouteRecord } from './index';\n\nexport interface RouteMatch {\n route: RouteRecord;\n params: Record<string, string>;\n}\n\nexport function normalizePath(path: string): string {\n if (!path.startsWith('/')) {\n return `/${path}`;\n }\n return path || '/';\n}\n\nexport function matchRoute(\n routes: RouteRecord[],\n path: string\n): RouteMatch | null {\n const normalizedPath = normalizePath(path.split('?')[0]);\n\n for (const route of routes) {\n if (route.path === '*') {\n continue;\n }\n const params = matchRoutePath(route.path, normalizedPath);\n if (params) {\n return { route, params };\n }\n }\n\n // catch-all 通配路由:匹配任意未命中路径\n const wildcard = routes.find((route) => route.path === '*');\n if (wildcard) {\n return {\n route: wildcard,\n params: { pathMatch: normalizedPath },\n };\n }\n\n const fallback = routes.find((route) => route.path === '/');\n return fallback ? { route: fallback, params: {} } : null;\n}\n\nfunction matchRoutePath(\n routePath: string,\n currentPath: string\n): Record<string, string> | null {\n const routeSegments = getPathSegments(routePath);\n const currentSegments = getPathSegments(currentPath);\n\n if (routeSegments.length !== currentSegments.length) {\n return null;\n }\n\n const params: Record<string, string> = {};\n\n for (let index = 0; index < routeSegments.length; index += 1) {\n const routeSegment = routeSegments[index];\n const currentSegment = currentSegments[index];\n\n if (routeSegment.startsWith(':')) {\n const paramName = routeSegment.slice(1);\n if (!paramName) {\n return null;\n }\n params[decodeURIComponent(paramName)] =\n decodeURIComponent(currentSegment);\n continue;\n }\n\n if (routeSegment !== currentSegment) {\n return null;\n }\n }\n\n return params;\n}\n\nfunction getPathSegments(path: string): string[] {\n const normalizedPath = normalizePath(path);\n if (normalizedPath === '/') {\n return [];\n }\n\n return normalizedPath.split('/').filter(Boolean);\n}\n",
|
|
17
17
|
"import type { RouteLocation, RouterOptions } from './index';\nimport { normalizePath } from './matcher';\n\nexport type RouterMode = NonNullable<RouterOptions['mode']>;\n\nexport function createRouterHref(\n path: string,\n mode: RouterMode,\n base: string\n): string {\n const normalizedPath = normalizePath(path);\n const fullPath = base === '/' ? normalizedPath : base + normalizedPath;\n return mode === 'hash' ? `#${fullPath}` : fullPath;\n}\n\nexport function getBrowserLocation(\n mode: RouterMode,\n base: string\n): RouteLocation {\n let path: string;\n let fullPath: string;\n let queryString: string;\n\n if (mode === 'history') {\n fullPath = window.location.pathname + window.location.search;\n path = window.location.pathname;\n queryString = window.location.search;\n } else {\n const hash = window.location.hash;\n fullPath = hash || '#/';\n path = fullPath.startsWith('#') ? fullPath.slice(1) : fullPath;\n const queryStart = path.indexOf('?');\n queryString = queryStart >= 0 ? path.slice(queryStart + 1) : '';\n path = queryStart >= 0 ? path.slice(0, queryStart) : path;\n }\n\n if (path.startsWith(base) && base !== '/' && path !== '/') {\n path = path.slice(base.length);\n }\n\n path = normalizePath(path);\n\n return {\n path,\n fullPath,\n query: parseQuery(queryString),\n params: {},\n };\n}\n\nexport function navigateBrowser(\n path: string,\n replace: boolean,\n mode: RouterMode,\n base: string\n): void {\n const normalizedPath = normalizePath(path);\n const fullPath = base === '/' ? normalizedPath : base + normalizedPath;\n\n if (mode === 'history') {\n if (replace) {\n window.history.replaceState({}, '', fullPath);\n } else {\n window.history.pushState({}, '', fullPath);\n }\n return;\n }\n\n if (replace) {\n const href = window.location.href.split('#')[0];\n window.location.replace(`${href}#${fullPath}`);\n return;\n }\n\n window.location.hash = fullPath;\n}\n\nfunction parseQuery(queryString: string): Record<string, string> {\n const query: Record<string, string> = {};\n const normalizedQuery = queryString.startsWith('?')\n ? queryString.slice(1)\n : queryString;\n\n if (!normalizedQuery) {\n return query;\n }\n\n normalizedQuery.split('&').forEach((param) => {\n const [key, value] = param.split('=');\n if (key) {\n query[decodeURIComponent(key)] = value ? decodeURIComponent(value) : '';\n }\n });\n\n return query;\n}\n",
|
|
18
18
|
"import { AnyComponentConstructor, Component } from '../core/component';\nimport { OneApp } from '../core/app';\nimport type { VNode } from '../core/vnode';\nimport { setRouter } from './instance';\nimport {\n createRouterHref,\n getBrowserLocation,\n navigateBrowser,\n} from './history';\nimport { matchRoute, RouteMatch } from './matcher';\n\nexport { useRouter } from './instance';\n\nexport type RouteMeta = Record<string, unknown>;\n\nexport interface RouteRecord {\n path: string;\n component?: AnyComponentConstructor;\n redirect?: string;\n name?: string;\n meta?: RouteMeta;\n}\n\nexport interface RouterOptions {\n routes: RouteRecord[];\n mode?: 'history' | 'hash';\n base?: string;\n}\n\nexport interface RouteLocation {\n path: string;\n query: Record<string, string>;\n params: Record<string, string>;\n fullPath: string;\n name?: string;\n meta?: RouteMeta;\n}\n\nexport type RouteChangeListener = (\n to: RouteLocation,\n from: RouteLocation | null\n) => void;\n\ninterface RedirectResult {\n route: RouteRecord;\n params: Record<string, string>;\n path: string;\n}\n\nfunction parseQueryFromPath(fullPath: string): Record<string, string> {\n const queryStart = fullPath.indexOf('?');\n if (queryStart < 0) {\n return {};\n }\n\n const queryString = fullPath.slice(queryStart + 1);\n const query: Record<string, string> = {};\n if (!queryString) {\n return query;\n }\n\n queryString.split('&').forEach((param) => {\n const [key, value] = param.split('=');\n if (key) {\n query[decodeURIComponent(key)] = value ? decodeURIComponent(value) : '';\n }\n });\n\n return query;\n}\n\n/**\n * 导航守卫。返回 false 取消导航;返回字符串表示重定向到该路径;\n * 返回 true 或 undefined 放行。\n */\nexport type NavigationGuard = (\n to: RouteLocation,\n from: RouteLocation | null\n) => boolean | void | string;\n\nexport class Router {\n protected currentRoute: RouteRecord | null = null;\n protected currentLocation: RouteLocation | null = null;\n private readonly routes: RouteRecord[] = [];\n private app: OneApp | null = null;\n private readonly mode: 'history' | 'hash';\n private readonly base: string;\n private readonly routeChangeListeners: RouteChangeListener[] = [];\n private readonly beforeGuards: NavigationGuard[] = [];\n private readonly afterHooks: RouteChangeListener[] = [];\n private removeWindowListener?: () => void;\n\n constructor(options: RouterOptions | RouteRecord[]) {\n const resolvedOptions = Array.isArray(options)\n ? { routes: options }\n : options;\n\n this.routes = resolvedOptions.routes || [];\n this.mode = resolvedOptions.mode || 'history';\n this.base = resolvedOptions.base || '/';\n this.validateRoutes();\n this.initEvents();\n this.resolveCurrentRoute();\n }\n\n public install(app: OneApp): void {\n this.app = app;\n app.router = this;\n setRouter(this);\n\n const context = app.getContext() as { router?: Router };\n context.router = this;\n\n this.resolveCurrentRoute();\n }\n\n public push(path: string): void {\n this.navigate(path, false);\n }\n\n public replace(path: string): void {\n this.navigate(path, true);\n }\n\n public forward(): void {\n window.history.forward();\n }\n\n public back(): void {\n window.history.back();\n }\n\n public go(delta: number): void {\n window.history.go(delta);\n }\n\n public getCurrentRoute(): RouteLocation | null {\n if (!this.currentLocation) {\n this.resolveCurrentRoute();\n }\n return this.currentLocation;\n }\n\n public getCurrentRouteRecord(): RouteRecord | null {\n if (!this.currentRoute) {\n this.resolveCurrentRoute();\n }\n return this.currentRoute;\n }\n\n public onRouteChange(listener: RouteChangeListener): () => void {\n this.routeChangeListeners.push(listener);\n\n return () => {\n const index = this.routeChangeListeners.indexOf(listener);\n if (index > -1) {\n this.routeChangeListeners.splice(index, 1);\n }\n };\n }\n\n /**\n * 注册全局前置守卫;返回移除该守卫的函数。\n */\n public beforeEach(guard: NavigationGuard): () => void {\n this.beforeGuards.push(guard);\n\n return () => {\n const index = this.beforeGuards.indexOf(guard);\n if (index > -1) {\n this.beforeGuards.splice(index, 1);\n }\n };\n }\n\n /**\n * 注册导航完成后钩子;返回移除该钩子的函数。\n */\n public afterEach(hook: RouteChangeListener): () => void {\n this.afterHooks.push(hook);\n\n return () => {\n const index = this.afterHooks.indexOf(hook);\n if (index > -1) {\n this.afterHooks.splice(index, 1);\n }\n };\n }\n\n public getRoutes(): RouteRecord[] {\n return [...this.routes];\n }\n\n public addRoute(route: RouteRecord): void {\n if (this.routes.some((item) => item.path === route.path)) {\n throw new Error(`Route already exists: ${route.path}`);\n }\n\n this.routes.push(route);\n\n const location = this.getCurrentLocation();\n if (location.path === route.path) {\n this.handleRouteChange();\n }\n }\n\n public createHref(path: string): string {\n return createRouterHref(path, this.mode, this.base);\n }\n\n public destroy(): void {\n this.removeWindowListener?.();\n this.removeWindowListener = undefined;\n if (this.app?.router === this) {\n this.app.router = undefined;\n }\n this.app = null;\n }\n\n private navigate(path: string, replace: boolean): void {\n if (!path || typeof path !== 'string') {\n throw new Error('Path must be a non-empty string');\n }\n\n const from = this.currentLocation;\n const target = this.resolveTarget(path);\n if (!target) {\n return;\n }\n\n const to = target.location;\n\n // 前置守卫:返回 false 取消导航,返回字符串重定向\n for (const guard of this.beforeGuards) {\n const result = guard(to, from);\n if (result === false) {\n return;\n }\n if (typeof result === 'string' && result !== path) {\n this.navigate(result, replace);\n return;\n }\n }\n\n // 同路径导航不做重复入栈\n if (from && this.isSameLocation(from, to)) {\n return;\n }\n\n navigateBrowser(target.path, replace, this.mode, this.base);\n this.currentRoute = target.route;\n this.currentLocation = to;\n this.triggerRouteChangeListeners(to, from);\n this.afterHooks.forEach((hook) => {\n try {\n hook(to, from);\n } catch (error) {\n console.error('Route afterEach error:', error);\n }\n });\n }\n\n /**\n * 解析导航目标:应用 redirect 链后返回最终路径、路由与 location。\n */\n private resolveTarget(\n path: string\n ): { path: string; route: RouteRecord; location: RouteLocation } | null {\n const match = matchRoute(this.routes, path.split('?')[0]);\n if (!match) {\n return null;\n }\n\n const redirected = this.applyRedirect(match);\n const finalPath = redirected?.path ?? path;\n const route = redirected?.route ?? match.route;\n\n return {\n path: finalPath,\n route,\n location: {\n path: finalPath.split('?')[0],\n query: parseQueryFromPath(finalPath),\n params: redirected?.params ?? match.params,\n fullPath: finalPath,\n name: route?.name,\n meta: route?.meta,\n },\n };\n }\n\n /**\n * 沿 redirect 链解析到最终路由(防循环)。\n */\n private applyRedirect(match: RouteMatch): RedirectResult | null {\n const visited = new Set<string>();\n let current = match;\n let finalPath = '';\n\n while (current.route.redirect) {\n if (visited.has(current.route.path)) {\n throw new Error(\n `Redirect loop detected for route: ${current.route.path}`\n );\n }\n visited.add(current.route.path);\n finalPath = current.route.redirect;\n const next = matchRoute(this.routes, finalPath.split('?')[0]);\n if (!next) {\n return null;\n }\n current = next;\n }\n\n return finalPath\n ? { route: current.route, params: current.params, path: finalPath }\n : null;\n }\n\n private validateRoutes(): void {\n if (!Array.isArray(this.routes)) {\n throw new Error('Router routes must be an array');\n }\n\n const paths = new Set<string>();\n this.routes.forEach((route) => {\n if (!route.component && !route.redirect) {\n throw new Error(\n `Route ${route.path} must define a component or redirect`\n );\n }\n if (paths.has(route.path)) {\n throw new Error(`Duplicate route path: ${route.path}`);\n }\n paths.add(route.path);\n });\n }\n\n private initEvents(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n const eventName = this.mode === 'history' ? 'popstate' : 'hashchange';\n const listener = (): void => {\n this.handleRouteChange();\n };\n\n window.addEventListener(eventName, listener);\n this.removeWindowListener = () => {\n window.removeEventListener(eventName, listener);\n };\n }\n\n private handleRouteChange(): void {\n const fromLocation = this.currentLocation;\n const nextLocation = this.resolveCurrentRoute();\n\n if (!this.isSameLocation(fromLocation, nextLocation)) {\n this.triggerRouteChangeListeners(nextLocation, fromLocation);\n }\n }\n\n private resolveCurrentRoute(): RouteLocation {\n const location = this.getCurrentLocation();\n const match = matchRoute(this.routes, location.path);\n const redirected = match ? this.applyRedirect(match) : null;\n const route = redirected?.route ?? match?.route ?? null;\n\n // URL 与重定向目标不一致时修正历史记录(replaceState 不触发 popstate)\n if (redirected && redirected.path !== location.path) {\n navigateBrowser(redirected.path, true, this.mode, this.base);\n }\n\n this.currentRoute = route;\n this.currentLocation = {\n ...location,\n params: redirected?.params ?? match?.params ?? {},\n name: route?.name,\n meta: route?.meta,\n };\n\n return this.currentLocation;\n }\n\n private getCurrentLocation(): RouteLocation {\n return getBrowserLocation(this.mode, this.base);\n }\n\n private isSameLocation(\n from: RouteLocation | null,\n to: RouteLocation | null\n ): boolean {\n return from?.fullPath === to?.fullPath && from?.name === to?.name;\n }\n\n private triggerRouteChangeListeners(\n to: RouteLocation,\n from: RouteLocation | null\n ): void {\n this.routeChangeListeners.forEach((listener) => {\n try {\n listener(to, from);\n } catch (error) {\n console.error('Route change listener error:', error);\n }\n });\n }\n}\n\nexport interface RouterLinkProps {\n to: string;\n replace?: boolean;\n className?: string;\n activeClass?: string;\n children?: Array<VNode | string>;\n}\n\ninterface RouterLinkState {\n currentPath: string;\n}\n\nexport class RouterLink extends Component<RouterLinkProps, RouterLinkState> {\n private unsubscribe?: () => void;\n\n protected initState(): RouterLinkState {\n const router = this.router as Router | undefined;\n return {\n currentPath: router?.getCurrentRoute()?.path ?? window.location.pathname,\n };\n }\n\n protected initStyles(): void {}\n\n protected onMounted(): void {\n const router = this.router as Router | undefined;\n this.unsubscribe = router?.onRouteChange((to) => {\n this.state.currentPath = to.path;\n });\n }\n\n protected onUnmounted(): void {\n this.unsubscribe?.();\n }\n\n protected render(): VNode {\n const router = this.router as Router | undefined;\n const activeClass = this.props.activeClass ?? 'active';\n const isActive = this.state.currentPath === this.props.to;\n const className = [this.props.className, isActive ? activeClass : undefined]\n .filter(Boolean)\n .join(' ');\n\n return {\n tag: 'a',\n props: {\n href: router?.createHref(this.props.to) ?? this.props.to,\n className,\n },\n listeners: {\n click: (event: Event) => {\n event.preventDefault();\n if (this.props.replace) {\n router?.replace(this.props.to);\n } else {\n router?.push(this.props.to);\n }\n },\n },\n children:\n this.props.children && this.props.children.length > 0\n ? this.props.children\n : [this.props.to],\n };\n }\n}\n\ninterface RouterViewState {\n route: RouteLocation | null;\n record: RouteRecord | null;\n}\n\nexport class RouterView extends Component<object, RouterViewState> {\n private unsubscribe?: () => void;\n\n protected initState(): RouterViewState {\n const router = this.router as Router | undefined;\n return {\n route: router?.getCurrentRoute() ?? null,\n record: router?.getCurrentRouteRecord() ?? null,\n };\n }\n\n protected initStyles(): void {}\n\n protected onMounted(): void {\n const router = this.router as Router | undefined;\n this.unsubscribe = router?.onRouteChange((to) => {\n this.state.route = to;\n this.state.record = router.getCurrentRouteRecord();\n });\n }\n\n protected onUnmounted(): void {\n this.unsubscribe?.();\n }\n\n protected render(): VNode {\n const routeRecord =\n this.state.record ??\n (this.router as Router | undefined)?.getCurrentRouteRecord();\n\n return {\n tag: 'div',\n props: { 'data-router-view': '' },\n children: routeRecord?.component\n ? [{ component: routeRecord.component }]\n : [],\n };\n }\n}\n\nexport function createRouter(options: RouterOptions | RouteRecord[]): Router {\n return new Router(options);\n}\n",
|
|
19
19
|
"import { RendererContext } from './renderer';\nimport type { ComponentInstance, Renderable } from './renderer/types';\nimport { TemplateEngine } from './template';\nimport { renderStyleSheet, type StyleSheet } from '../style/sheet';\n\nexport {\n renderStyleSheet,\n type StyleAtRule,\n type StyleProperties,\n type StyleRule,\n type StyleSheet,\n type StyleSheetEntry,\n type StyleValue,\n} from '../style/sheet';\n\nexport type HtmlAttributeValue = string | number | boolean | null | undefined;\n\nexport type HtmlAttributes = Record<string, HtmlAttributeValue>;\n\nexport type HtmlDocumentBody = Renderable | Renderable[];\n\nexport interface HtmlHeadElement {\n tag: string;\n attributes?: HtmlAttributes;\n text?: string;\n}\n\nexport interface HtmlScript {\n src: string;\n type?: string;\n async?: boolean;\n defer?: boolean;\n attributes?: HtmlAttributes;\n}\n\nexport interface HtmlDocumentOptions {\n title: string;\n body: HtmlDocumentBody;\n lang?: string;\n charset?: string;\n viewport?: string;\n description?: string;\n htmlAttributes?: HtmlAttributes;\n bodyAttributes?: HtmlAttributes;\n head?: HtmlHeadElement[];\n styles?: StyleSheet;\n scripts?: HtmlScript[];\n}\n\nconst VOID_HEAD_TAGS = new Set(['base', 'link', 'meta']);\n\nexport function renderHtmlDocument(options: HtmlDocumentOptions): string {\n const lang = options.lang ?? 'en';\n const charset = options.charset ?? 'utf-8';\n const viewport = options.viewport ?? 'width=device-width, initial-scale=1';\n const htmlAttributes = renderAttributes({\n lang,\n ...(options.htmlAttributes ?? {}),\n });\n const bodyAttributes = renderAttributes(options.bodyAttributes);\n const bodyHtml = renderDocumentBody(options.body);\n\n return [\n '<!doctype html>',\n `<html${htmlAttributes}>`,\n '<head>',\n ` <meta charset=\"${escapeHtml(charset)}\">`,\n ` <meta name=\"viewport\" content=\"${escapeHtml(viewport)}\">`,\n ` <title>${escapeHtml(options.title)}</title>`,\n options.description\n ? ` <meta name=\"description\" content=\"${escapeHtml(\n options.description\n )}\">`\n : '',\n ...(options.head ?? []).map((element) => ` ${renderHeadElement(element)}`),\n options.styles && options.styles.length > 0\n ? ` <style>${renderStyleSheet(options.styles)}</style>`\n : '',\n '</head>',\n `<body${bodyAttributes}>`,\n bodyHtml,\n ...(options.scripts ?? []).map((script) => ` ${renderScript(script)}`),\n '</body>',\n '</html>',\n ]\n .filter((line) => line !== '')\n .join('\\n');\n}\n\nfunction renderDocumentBody(body: HtmlDocumentBody): string {\n if (typeof document === 'undefined') {\n throw new Error('renderHtmlDocument requires a DOM-like document');\n }\n\n const container = document.createElement('div');\n const renderer = new RendererContext();\n const mountedComponents = new Set<ComponentInstance>();\n const renderables = Array.isArray(body) ? body : [body];\n const context = {\n templateEngine: new TemplateEngine({}),\n renderer,\n slots: { default: [] },\n registerChild: (component: ComponentInstance) => {\n mountedComponents.add(component);\n },\n unregisterChild: (component: ComponentInstance) => {\n mountedComponents.delete(component);\n },\n };\n\n renderables.forEach((renderable) => {\n container.appendChild(renderer.mount(renderable, context));\n });\n\n const html = container.innerHTML;\n mountedComponents.forEach((component) => {\n component.unmount();\n });\n\n return html;\n}\n\nfunction renderHeadElement(element: HtmlHeadElement): string {\n const attributes = renderAttributes(element.attributes);\n if (VOID_HEAD_TAGS.has(element.tag) && !element.text) {\n return `<${element.tag}${attributes}>`;\n }\n\n return `<${element.tag}${attributes}>${escapeHtml(\n element.text ?? ''\n )}</${element.tag}>`;\n}\n\nfunction renderScript(script: HtmlScript): string {\n const attributes = renderAttributes({\n type: script.type,\n src: script.src,\n async: script.async,\n defer: script.defer,\n ...(script.attributes ?? {}),\n });\n\n return `<script${attributes}></script>`;\n}\n\nfunction renderAttributes(attributes: HtmlAttributes = {}): string {\n const rendered = Object.entries(attributes)\n .flatMap(([name, value]) => {\n if (value === false || value === null || value === undefined) {\n return [];\n }\n\n return value === true\n ? [name]\n : [`${name}=\"${escapeHtml(String(value))}\"`];\n })\n .join(' ');\n\n return rendered ? ` ${rendered}` : '';\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n",
|
|
20
|
-
"import {\n Component,\n ComponentConstructor,\n ComponentProps,\n InjectionKey,\n InjectionResult,\n} from './component';\nimport {\n renderHtmlDocument as renderDocumentShell,\n type HtmlDocumentBody,\n type HtmlDocumentOptions,\n type HtmlScript,\n} from './document';\nimport { Div } from './vnode';\nimport type { Router } from '../router';\n\nimport { TemplateEngine } from './template';\n\nconst DEFAULT_ROOT_ELEMENT = '#app';\n\n// 插件接口定义\nexport interface Plugin {\n install: (app: OneApp, ...args: unknown[]) => void;\n onMounted?: (app: OneApp) => void;\n onUpdated?: (app: OneApp) => void;\n onBeforeUnmount?: (app: OneApp) => void;\n}\n\nexport type AppDocumentOptions = Partial<Omit<HtmlDocumentOptions, 'body'>> & {\n body?: HtmlDocumentBody;\n};\n\nexport type AppDocumentRenderOptions = AppDocumentOptions;\n\n// 泛型化AppOptions接口\nexport interface AppOptions<\n TState = Record<string, unknown>,\n TConfig = Record<string, unknown>,\n TRootProps extends ComponentProps = ComponentProps,\n> {\n /** 根组件构造函数 */\n root?: ComponentConstructor<TRootProps>;\n /** 根组件 props */\n rootProps?: TRootProps;\n /** 应用挂载点,默认 #app */\n rootElement?: string | Element;\n /** 全局状态 */\n state?: TState;\n /** 全局配置 */\n config?: TConfig;\n /** HTML 文档壳配置,用于 dev/build 生成入口页面 */\n document?: AppDocumentOptions;\n}\n\n// 泛型化AppContext接口\nexport interface AppContext<TConfig = Record<string, unknown>> {\n app: OneApp;\n version: string;\n config: TConfig;\n router?: Router;\n}\n\n// 泛型化OneApp类\nexport class OneApp<\n TState extends object = Record<string, unknown>,\n TConfig extends object = Record<string, unknown>,\n TRootProps extends ComponentProps = ComponentProps,\n> {\n private container: HTMLElement | null = null;\n private rootInstance: Component | null = null;\n private mounted: boolean = false;\n private templateEngine: TemplateEngine | null = null;\n private readonly appContext: AppContext<TConfig>;\n private readonly providers = new Map<string | symbol, unknown>();\n private plugins: Array<{ plugin: Plugin; args: unknown[] }> = [];\n private unmountedCallback?: () => void;\n public router?: Router;\n\n constructor(private options: AppOptions<TState, TConfig, TRootProps> = {}) {\n this.appContext = {\n app: this as unknown as OneApp,\n version: '0.1.0',\n config: options.config || ({} as TConfig),\n };\n }\n\n private handleError(error: Error): void {\n console.error('应用错误:', error);\n // 渲染错误UI\n this.renderErrorUI(error);\n // 不立即卸载应用,而是显示错误信息\n }\n\n /**\n * 渲染错误UI\n */\n private renderErrorUI(error: Error): void {\n if (!this.container) {\n return;\n }\n\n this.container.innerHTML = `\n <div style=\"padding: 20px; background-color: #ffebee; color: #c62828; font-family: Arial, sans-serif;\">\n <h3>应用错误</h3>\n <p>${error.message}</p>\n <pre style=\"background-color: #fff; padding: 10px; border-radius: 4px; overflow: auto;\">${error.stack}</pre>\n </div>\n `;\n }\n\n /**\n * 使用插件\n */\n public use(plugin: Plugin, ...args: unknown[]): this {\n if (typeof plugin.install !== 'function') {\n throw new Error('插件必须提供 install 方法');\n }\n plugin.install(this as unknown as OneApp, ...args);\n this.plugins.push({ plugin, args });\n return this;\n }\n\n /**\n * 挂载应用\n */\n public mount(): void {\n if (this.mounted) {\n console.warn('应用已经处于运行状态');\n return;\n }\n\n const mountContainer = this.resolveMountContainer();\n if (!mountContainer) {\n return;\n }\n\n try {\n this.container = mountContainer;\n\n // 添加全局应用实例\n (globalThis as { __APP__?: unknown }).__APP__ = this;\n\n // 只有在有根组件时才创建实例\n if (this.options.root) {\n this.rootInstance = new this.options.root(this.options.rootProps);\n\n // 设置应用上下文\n if ('setAppContext' in this.rootInstance) {\n this.rootInstance.setAppContext(this.appContext);\n }\n\n // 如果有全局状态,传递给组件\n if (this.options.state && 'setState' in this.rootInstance) {\n this.rootInstance.setState(this.options.state);\n }\n\n this.rootInstance.mount(this.container);\n\n // 创建模板引擎实例\n this.templateEngine = new TemplateEngine(this.options.state || {});\n }\n\n this.mounted = true;\n\n // 触发生命周期钩子\n this.onMounted();\n } catch (error) {\n this.handleError(error as Error);\n }\n }\n\n /**\n * 卸载应用\n */\n public unmount(): void {\n if (!this.mounted) {\n console.warn('应用未处于运行状态');\n return;\n }\n\n try {\n // 触发卸载前钩子\n this.onBeforeUnmount();\n\n if (this.rootInstance) {\n // 调用组件卸载方法\n if ('unmount' in this.rootInstance) {\n this.rootInstance.unmount();\n }\n\n this.rootInstance = null;\n this.mounted = false;\n delete (globalThis as { __APP__?: unknown }).__APP__;\n }\n\n // 清除模板引擎\n if (this.templateEngine) {\n this.templateEngine.clearBindings();\n this.templateEngine = null;\n }\n\n // 清空容器\n if (this.container) {\n this.container.innerHTML = '';\n }\n\n // 触发卸载后钩子\n if (this.unmountedCallback) {\n this.unmountedCallback();\n }\n } catch (error) {\n console.error('Failed to unmount app:', error);\n }\n }\n\n /**\n * 应用是否正在运行\n */\n public isRunning(): boolean {\n return this.mounted;\n }\n\n /**\n * 更新根组件\n */\n public updateRootComponent(\n component: ComponentConstructor<TRootProps>\n ): void {\n if (this.mounted) {\n this.unmount();\n }\n this.options.root = component;\n this.mount();\n }\n\n /**\n * 更新应用状态\n */\n public update(state?: Partial<TState>): this {\n if (!this.mounted) {\n console.warn('Cannot update unmounted app');\n return this;\n }\n\n try {\n // 更新状态\n if (state && this.options.state) {\n this.options.state = { ...this.options.state, ...state };\n\n // 更新组件状态\n if (this.rootInstance && 'setState' in this.rootInstance) {\n this.rootInstance.setState(state);\n }\n\n // 更新模板引擎状态\n if (this.templateEngine) {\n // 如果存在templateEngine,更新其状态\n this.templateEngine.state = this.options.state;\n }\n }\n\n // 触发更新钩子\n this.onUpdated();\n } catch (error) {\n console.error('Failed to update app:', error);\n }\n\n return this;\n }\n\n /**\n * 获取应用上下文\n */\n public getContext(): AppContext<TConfig> {\n return this.appContext;\n }\n\n public provide<T>(key: InjectionKey<T>, value: T): this {\n this.providers.set(key, value);\n return this;\n }\n\n public inject<T>(key: InjectionKey<T>): T | undefined;\n public inject<T>(key: InjectionKey<T>, fallback: T): T;\n public inject<T>(key: InjectionKey<T>, fallback?: T): T | undefined {\n const result = this.resolveInjection(key);\n return result.found ? result.value : fallback;\n }\n\n public resolveInjection<T>(key: InjectionKey<T>): InjectionResult<T> {\n if (!this.providers.has(key)) {\n return { found: false, value: undefined };\n }\n\n return { found: true, value: this.providers.get(key) as T | undefined };\n }\n\n /**\n * 获取应用状态\n */\n public getState(): TState | undefined {\n return this.options.state;\n }\n\n /**\n * 设置应用状态\n */\n public setState(newState: TState): this {\n this.options.state = newState;\n if (this.mounted) {\n this.update();\n }\n return this;\n }\n\n /**\n * 监听应用卸载\n */\n public onUnmounted(callback: () => void): this {\n this.unmountedCallback = callback;\n return this;\n }\n\n /**\n * 生成应用入口 HTML 文档\n */\n public renderHtmlDocument(options: AppDocumentRenderOptions = {}): string {\n const appDocument = this.options.document ?? {};\n const scripts = this.mergeDocumentScripts(\n appDocument.scripts,\n options.scripts\n );\n\n return renderDocumentShell({\n ...appDocument,\n ...options,\n title: options.title ?? appDocument.title ?? 'TransOne App',\n body: options.body ?? appDocument.body ?? this.createMountDocumentBody(),\n scripts,\n });\n }\n\n /**\n * 解析根元素\n */\n private resolveRootElement(selector?: string | Element): Element | null {\n if (!selector) {\n return null;\n }\n\n if (typeof selector === 'string') {\n if (typeof document === 'undefined') {\n return null;\n }\n\n return document.querySelector(selector);\n }\n\n return typeof Element !== 'undefined' && selector instanceof Element\n ? selector\n : null;\n }\n\n private resolveMountContainer(): HTMLElement | null {\n if (typeof document === 'undefined') {\n return null;\n }\n\n const rootElement = this.resolveRootElement(\n this.options.rootElement ?? DEFAULT_ROOT_ELEMENT\n );\n return rootElement instanceof HTMLElement ? rootElement : null;\n }\n\n private createMountDocumentBody(): HtmlDocumentBody {\n const rootElement = this.options.rootElement ?? DEFAULT_ROOT_ELEMENT;\n\n if (typeof rootElement === 'string') {\n return this.createMountElementFromSelector(rootElement);\n }\n\n if (typeof Element !== 'undefined' && rootElement instanceof Element) {\n const props: Record<string, string> = {};\n if (rootElement.id) {\n props.id = rootElement.id;\n }\n if (rootElement.className) {\n props.className = rootElement.className;\n }\n\n return { tag: rootElement.tagName.toLowerCase(), props };\n }\n\n return Div({ props: { id: 'app' } });\n }\n\n private createMountElementFromSelector(selector: string): HtmlDocumentBody {\n if (selector.startsWith('#') && selector.length > 1) {\n return Div({ props: { id: selector.slice(1) } });\n }\n\n if (selector.startsWith('.') && selector.length > 1) {\n return Div({ props: { className: selector.slice(1) } });\n }\n\n return Div({ props: { 'data-transone-root': selector } });\n }\n\n private mergeDocumentScripts(\n baseScripts?: HtmlScript[],\n extraScripts?: HtmlScript[]\n ): HtmlScript[] | undefined {\n if (!baseScripts && !extraScripts) {\n return undefined;\n }\n\n return [...(baseScripts ?? []), ...(extraScripts ?? [])];\n }\n\n // 生命周期钩子\n private onMounted(): void {\n // 触发插件的mounted钩子\n this.plugins.forEach(({ plugin: pluginObj }) => {\n if (pluginObj && typeof pluginObj.onMounted === 'function') {\n pluginObj.onMounted(this as unknown as OneApp);\n }\n });\n }\n\n private onUpdated(): void {\n // 触发插件的updated钩子\n this.plugins.forEach(({ plugin: pluginObj }) => {\n if (pluginObj && typeof pluginObj.onUpdated === 'function') {\n pluginObj.onUpdated(this as unknown as OneApp);\n }\n });\n }\n\n private onBeforeUnmount(): void {\n // 触发插件的beforeUnmount钩子\n this.plugins.forEach(({ plugin: pluginObj }) => {\n if (pluginObj && typeof pluginObj.onBeforeUnmount === 'function') {\n pluginObj.onBeforeUnmount(this as unknown as OneApp);\n }\n });\n }\n}\n\n/**\n * 创建应用实例\n */\nexport function createApp<\n TState extends object = Record<string, unknown>,\n TConfig extends object = Record<string, unknown>,\n TRootProps extends ComponentProps = ComponentProps,\n>(\n options: AppOptions<TState, TConfig, TRootProps> = {}\n): OneApp<TState, TConfig, TRootProps> {\n return new OneApp<TState, TConfig, TRootProps>(options);\n}\n"
|
|
20
|
+
"import {\n Component,\n ComponentConstructor,\n ComponentProps,\n InjectionKey,\n InjectionResult,\n} from './component';\nimport {\n renderHtmlDocument as renderDocumentShell,\n type HtmlDocumentBody,\n type HtmlDocumentOptions,\n type HtmlScript,\n} from './document';\nimport { Div } from './vnode';\nimport type { Router } from '../router';\n\nimport { TemplateEngine } from './template';\n\nconst DEFAULT_ROOT_ELEMENT = '#app';\n\n// 插件接口定义\nexport interface Plugin {\n install: (app: OneApp, ...args: unknown[]) => void;\n onMounted?: (app: OneApp) => void;\n onUpdated?: (app: OneApp) => void;\n onBeforeUnmount?: (app: OneApp) => void;\n}\n\nexport type AppDocumentOptions = Partial<Omit<HtmlDocumentOptions, 'body'>> & {\n body?: HtmlDocumentBody;\n};\n\nexport type AppDocumentRenderOptions = AppDocumentOptions;\n\n// 泛型化AppOptions接口\nexport interface AppOptions<\n TState = Record<string, unknown>,\n TConfig = Record<string, unknown>,\n TRootProps extends ComponentProps = ComponentProps,\n> {\n /** 根组件构造函数 */\n root?: ComponentConstructor<TRootProps>;\n /** 根组件 props */\n rootProps?: TRootProps;\n /** 应用挂载点,默认 #app */\n rootElement?: string | Element;\n /** 全局状态 */\n state?: TState;\n /** 全局配置 */\n config?: TConfig;\n /** HTML 文档壳配置,用于 dev/build 生成入口页面 */\n document?: AppDocumentOptions;\n}\n\n// 泛型化AppContext接口\nexport interface AppContext<TConfig = Record<string, unknown>> {\n app: OneApp;\n version: string;\n config: TConfig;\n router?: Router;\n}\n\n// 泛型化OneApp类\nexport class OneApp<\n TState extends object = Record<string, unknown>,\n TConfig extends object = Record<string, unknown>,\n TRootProps extends ComponentProps = ComponentProps,\n> {\n private container: HTMLElement | null = null;\n private rootInstance: Component | null = null;\n private mounted: boolean = false;\n private templateEngine: TemplateEngine | null = null;\n private readonly appContext: AppContext<TConfig>;\n private readonly providers = new Map<string | symbol, unknown>();\n private plugins: Array<{ plugin: Plugin; args: unknown[] }> = [];\n private unmountedCallback?: () => void;\n public router?: Router;\n\n constructor(private options: AppOptions<TState, TConfig, TRootProps> = {}) {\n this.appContext = {\n app: this as unknown as OneApp,\n version: '0.1.2',\n config: options.config || ({} as TConfig),\n };\n }\n\n private handleError(error: Error): void {\n console.error('应用错误:', error);\n // 渲染错误UI\n this.renderErrorUI(error);\n // 不立即卸载应用,而是显示错误信息\n }\n\n /**\n * 渲染错误UI\n */\n private renderErrorUI(error: Error): void {\n if (!this.container) {\n return;\n }\n\n this.container.innerHTML = `\n <div style=\"padding: 20px; background-color: #ffebee; color: #c62828; font-family: Arial, sans-serif;\">\n <h3>应用错误</h3>\n <p>${error.message}</p>\n <pre style=\"background-color: #fff; padding: 10px; border-radius: 4px; overflow: auto;\">${error.stack}</pre>\n </div>\n `;\n }\n\n /**\n * 使用插件\n */\n public use(plugin: Plugin, ...args: unknown[]): this {\n if (typeof plugin.install !== 'function') {\n throw new Error('插件必须提供 install 方法');\n }\n plugin.install(this as unknown as OneApp, ...args);\n this.plugins.push({ plugin, args });\n return this;\n }\n\n /**\n * 挂载应用\n */\n public mount(): void {\n if (this.mounted) {\n console.warn('应用已经处于运行状态');\n return;\n }\n\n const mountContainer = this.resolveMountContainer();\n if (!mountContainer) {\n return;\n }\n\n try {\n this.container = mountContainer;\n\n // 添加全局应用实例\n (globalThis as { __APP__?: unknown }).__APP__ = this;\n\n // 只有在有根组件时才创建实例\n if (this.options.root) {\n this.rootInstance = new this.options.root(this.options.rootProps);\n\n // 设置应用上下文\n if ('setAppContext' in this.rootInstance) {\n this.rootInstance.setAppContext(this.appContext);\n }\n\n // 如果有全局状态,传递给组件\n if (this.options.state && 'setState' in this.rootInstance) {\n this.rootInstance.setState(this.options.state);\n }\n\n this.rootInstance.mount(this.container);\n\n // 创建模板引擎实例\n this.templateEngine = new TemplateEngine(this.options.state || {});\n }\n\n this.mounted = true;\n\n // 触发生命周期钩子\n this.onMounted();\n } catch (error) {\n this.handleError(error as Error);\n }\n }\n\n /**\n * 卸载应用\n */\n public unmount(): void {\n if (!this.mounted) {\n console.warn('应用未处于运行状态');\n return;\n }\n\n try {\n // 触发卸载前钩子\n this.onBeforeUnmount();\n\n if (this.rootInstance) {\n // 调用组件卸载方法\n if ('unmount' in this.rootInstance) {\n this.rootInstance.unmount();\n }\n\n this.rootInstance = null;\n this.mounted = false;\n delete (globalThis as { __APP__?: unknown }).__APP__;\n }\n\n // 清除模板引擎\n if (this.templateEngine) {\n this.templateEngine.clearBindings();\n this.templateEngine = null;\n }\n\n // 清空容器\n if (this.container) {\n this.container.innerHTML = '';\n }\n\n // 触发卸载后钩子\n if (this.unmountedCallback) {\n this.unmountedCallback();\n }\n } catch (error) {\n console.error('Failed to unmount app:', error);\n }\n }\n\n /**\n * 应用是否正在运行\n */\n public isRunning(): boolean {\n return this.mounted;\n }\n\n /**\n * 更新根组件\n */\n public updateRootComponent(\n component: ComponentConstructor<TRootProps>\n ): void {\n if (this.mounted) {\n this.unmount();\n }\n this.options.root = component;\n this.mount();\n }\n\n /**\n * 更新应用状态\n */\n public update(state?: Partial<TState>): this {\n if (!this.mounted) {\n console.warn('Cannot update unmounted app');\n return this;\n }\n\n try {\n // 更新状态\n if (state && this.options.state) {\n this.options.state = { ...this.options.state, ...state };\n\n // 更新组件状态\n if (this.rootInstance && 'setState' in this.rootInstance) {\n this.rootInstance.setState(state);\n }\n\n // 更新模板引擎状态\n if (this.templateEngine) {\n // 如果存在templateEngine,更新其状态\n this.templateEngine.state = this.options.state;\n }\n }\n\n // 触发更新钩子\n this.onUpdated();\n } catch (error) {\n console.error('Failed to update app:', error);\n }\n\n return this;\n }\n\n /**\n * 获取应用上下文\n */\n public getContext(): AppContext<TConfig> {\n return this.appContext;\n }\n\n public provide<T>(key: InjectionKey<T>, value: T): this {\n this.providers.set(key, value);\n return this;\n }\n\n public inject<T>(key: InjectionKey<T>): T | undefined;\n public inject<T>(key: InjectionKey<T>, fallback: T): T;\n public inject<T>(key: InjectionKey<T>, fallback?: T): T | undefined {\n const result = this.resolveInjection(key);\n return result.found ? result.value : fallback;\n }\n\n public resolveInjection<T>(key: InjectionKey<T>): InjectionResult<T> {\n if (!this.providers.has(key)) {\n return { found: false, value: undefined };\n }\n\n return { found: true, value: this.providers.get(key) as T | undefined };\n }\n\n /**\n * 获取应用状态\n */\n public getState(): TState | undefined {\n return this.options.state;\n }\n\n /**\n * 设置应用状态\n */\n public setState(newState: TState): this {\n this.options.state = newState;\n if (this.mounted) {\n this.update();\n }\n return this;\n }\n\n /**\n * 监听应用卸载\n */\n public onUnmounted(callback: () => void): this {\n this.unmountedCallback = callback;\n return this;\n }\n\n /**\n * 生成应用入口 HTML 文档\n */\n public renderHtmlDocument(options: AppDocumentRenderOptions = {}): string {\n const appDocument = this.options.document ?? {};\n const scripts = this.mergeDocumentScripts(\n appDocument.scripts,\n options.scripts\n );\n\n return renderDocumentShell({\n ...appDocument,\n ...options,\n title: options.title ?? appDocument.title ?? 'TransOne App',\n body: options.body ?? appDocument.body ?? this.createMountDocumentBody(),\n scripts,\n });\n }\n\n /**\n * 解析根元素\n */\n private resolveRootElement(selector?: string | Element): Element | null {\n if (!selector) {\n return null;\n }\n\n if (typeof selector === 'string') {\n if (typeof document === 'undefined') {\n return null;\n }\n\n return document.querySelector(selector);\n }\n\n return typeof Element !== 'undefined' && selector instanceof Element\n ? selector\n : null;\n }\n\n private resolveMountContainer(): HTMLElement | null {\n if (typeof document === 'undefined') {\n return null;\n }\n\n const rootElement = this.resolveRootElement(\n this.options.rootElement ?? DEFAULT_ROOT_ELEMENT\n );\n return rootElement instanceof HTMLElement ? rootElement : null;\n }\n\n private createMountDocumentBody(): HtmlDocumentBody {\n const rootElement = this.options.rootElement ?? DEFAULT_ROOT_ELEMENT;\n\n if (typeof rootElement === 'string') {\n return this.createMountElementFromSelector(rootElement);\n }\n\n if (typeof Element !== 'undefined' && rootElement instanceof Element) {\n const props: Record<string, string> = {};\n if (rootElement.id) {\n props.id = rootElement.id;\n }\n if (rootElement.className) {\n props.className = rootElement.className;\n }\n\n return { tag: rootElement.tagName.toLowerCase(), props };\n }\n\n return Div({ props: { id: 'app' } });\n }\n\n private createMountElementFromSelector(selector: string): HtmlDocumentBody {\n if (selector.startsWith('#') && selector.length > 1) {\n return Div({ props: { id: selector.slice(1) } });\n }\n\n if (selector.startsWith('.') && selector.length > 1) {\n return Div({ props: { className: selector.slice(1) } });\n }\n\n return Div({ props: { 'data-transone-root': selector } });\n }\n\n private mergeDocumentScripts(\n baseScripts?: HtmlScript[],\n extraScripts?: HtmlScript[]\n ): HtmlScript[] | undefined {\n if (!baseScripts && !extraScripts) {\n return undefined;\n }\n\n return [...(baseScripts ?? []), ...(extraScripts ?? [])];\n }\n\n // 生命周期钩子\n private onMounted(): void {\n // 触发插件的mounted钩子\n this.plugins.forEach(({ plugin: pluginObj }) => {\n if (pluginObj && typeof pluginObj.onMounted === 'function') {\n pluginObj.onMounted(this as unknown as OneApp);\n }\n });\n }\n\n private onUpdated(): void {\n // 触发插件的updated钩子\n this.plugins.forEach(({ plugin: pluginObj }) => {\n if (pluginObj && typeof pluginObj.onUpdated === 'function') {\n pluginObj.onUpdated(this as unknown as OneApp);\n }\n });\n }\n\n private onBeforeUnmount(): void {\n // 触发插件的beforeUnmount钩子\n this.plugins.forEach(({ plugin: pluginObj }) => {\n if (pluginObj && typeof pluginObj.onBeforeUnmount === 'function') {\n pluginObj.onBeforeUnmount(this as unknown as OneApp);\n }\n });\n }\n}\n\n/**\n * 创建应用实例\n */\nexport function createApp<\n TState extends object = Record<string, unknown>,\n TConfig extends object = Record<string, unknown>,\n TRootProps extends ComponentProps = ComponentProps,\n>(\n options: AppOptions<TState, TConfig, TRootProps> = {}\n): OneApp<TState, TConfig, TRootProps> {\n return new OneApp<TState, TConfig, TRootProps>(options);\n}\n"
|
|
21
21
|
],
|
|
22
|
-
"mappings": "kDAkBO,IAAM,EAAc,OAAO,aAAa,EAClC,EAAc,OAAO,aAAa,EAClC,EAAS,OAAO,QAAQ,EAMxB,EAAyB,CACpC,OACA,MACA,QACA,UACA,SACA,OACA,SACF,EAEO,SAAS,CAAe,CAC7B,EACA,EACS,CACT,OAAO,QAAQ,QAAQ,IAAI,EAAO,CAAI,CAAC,EAGlC,SAAS,CAAQ,CAAC,EAAiC,CACxD,OAAO,IAAU,MAAQ,OAAO,IAAU,SChCrC,MAAM,CAAkB,CACZ,QAAU,IAAI,IACvB,SAAW,GACX,aAAqC,KACrC,aAAoC,KAKrC,OAAO,CAAC,EAA8B,CAC3C,GAAI,KAAK,QAAQ,IAAI,CAAM,EACzB,OAGF,GADA,KAAK,QAAQ,IAAI,CAAM,EACnB,CAAC,KAAK,SACR,eAAe,IAAM,KAAK,MAAM,CAAC,EAS9B,KAAK,EAAS,CACnB,GAAI,KAAK,SACP,OAEF,KAAK,SAAW,GAChB,GAAI,CACF,MAAO,KAAK,QAAQ,KAAO,EAAG,CAC5B,IAAM,EAAQ,MAAM,KAAK,KAAK,OAAO,EACrC,KAAK,QAAQ,MAAM,EACnB,QAAW,KAAU,EACnB,GAAI,EAAO,OACT,EAAO,UAIb,CACA,KAAK,SAAW,GAChB,IAAM,EAAU,KAAK,aACrB,KAAK,aAAe,KACpB,KAAK,aAAe,KACpB,IAAU,GAQP,QAAQ,EAAkB,CAC/B,GAAI,CAAC,KAAK,UAAY,KAAK,QAAQ,OAAS,EAC1C,OAAO,QAAQ,QAAQ,EAEzB,GAAI,KAAK,aACP,OAAO,KAAK,aAKd,OAHA,KAAK,aAAe,IAAI,QAAc,CAAC,IAAY,CACjD,KAAK,aAAe,EACrB,EACM,KAAK,aAEhB,CCvDA,IAAI,GAAW,EAGF,EAAoB,IAAI,EAM9B,SAAS,EAAQ,EAAkB,CACxC,OAAO,EAAkB,SAAS,EAO7B,SAAS,EAAS,EAAS,CAChC,EAAkB,MAAM,EAInB,MAAM,CAAe,OACX,UACP,aAAsC,KAC7B,YAAgC,CAAC,EAC1C,UAAY,IAAI,QAIhB,YAAc,IAAI,QAClB,YAAc,IAAI,QAElB,SAAW,IAAI,QAEf,WAAW,EAAG,QAER,YAAW,EAAmB,CAC1C,GAAI,CAAC,EAAe,SAClB,EAAe,SAAW,IAAI,EAEhC,OAAO,EAAe,SAGjB,QAA0B,CAAC,EAAc,CAE9C,GAAI,CAAC,EAAS,CAAM,EAElB,OADA,QAAQ,KAAK,oCAAoC,EAC1C,EAIT,GAAI,GAAW,CAAM,EACnB,OAAO,EAIT,GAAI,KAAK,YAAY,IAAI,CAAM,EAC7B,OAAO,KAAK,YAAY,IAAI,CAAM,EAIpC,GAAI,MAAM,QAAQ,CAAM,EACtB,OAAO,KAAK,oBAAoB,CAAM,EAIxC,IAAM,EAAQ,IAAI,MAAM,EAAQ,CAC9B,IAAK,CAAC,EAAQ,IAAyB,CAErC,GAAI,IAAQ,EACV,MAAO,GAET,GAAI,IAAQ,EACV,MAAO,GAIT,KAAK,MAAM,EAAQ,CAAG,EAEtB,IAAM,EAAQ,QAAQ,IAAI,EAAQ,CAAG,EAGrC,GAAI,EAAS,CAAK,GAAK,CAAC,EAAgB,EAAO,CAAW,EACxD,OAAO,KAAK,SAAS,CAAK,EAE5B,OAAO,GAET,IAAK,CAAC,EAAQ,EAAsB,IAAU,CAE5C,GAAI,EAAgB,EAAQ,CAAW,EAErC,OADA,QAAQ,KAAK,uBAAuB,OAAO,CAAG,sBAAsB,EAC7D,GAGT,IAAM,EAAW,QAAQ,IAAI,EAAQ,CAAG,EAGxC,GACE,EAAS,CAAK,GACd,CAAC,EAAgB,EAAO,CAAW,GACnC,CAAC,EAAgB,EAAO,CAAW,EAEnC,EAAQ,KAAK,SAAS,CAAK,EAG7B,IAAM,EAAS,QAAQ,IAAI,EAAQ,EAAK,CAAK,EAG7C,GAAI,IAAa,EACf,KAAK,QAAQ,EAAQ,CAAG,EAE1B,OAAO,GAET,eAAgB,CAAC,EAAQ,IAAyB,CAEhD,GAAI,EAAgB,EAAQ,CAAW,EAIrC,OAHA,QAAQ,KACN,0BAA0B,OAAO,CAAG,sBACtC,EACO,GAGT,IAAM,EAAS,KAAO,EAChB,EAAS,QAAQ,eAAe,EAAQ,CAAG,EAEjD,GAAI,EACF,KAAK,QAAQ,EAAQ,CAAG,EAE1B,OAAO,EAEX,CAAC,EAKD,OAFA,KAAK,YAAY,IAAI,EAAQ,CAAK,EAClC,KAAK,SAAS,IAAI,EAAO,CAAM,EACxB,EAQD,UAAU,CAAC,EAAyB,CAC1C,GAAI,EAAS,CAAK,GAAK,KAAK,SAAS,IAAI,CAAK,EAC5C,OAAO,KAAK,SAAS,IAAI,CAAK,EAEhC,OAAO,EAMD,mBAAwC,CAAC,EAAc,CAE7D,GAAI,KAAK,YAAY,IAAI,CAAM,EAC7B,OAAO,KAAK,YAAY,IAAI,CAAM,EAGpC,IAAM,EAAQ,IAAI,MAAM,EAAQ,CAC9B,IAAK,CAAC,EAAQ,IAAyB,CAErC,GAAI,IAAQ,EACV,MAAO,GAET,GAAI,IAAQ,EACV,MAAO,GAIT,KAAK,MAAM,EAAQ,CAAG,EAEtB,IAAM,EAAQ,QAAQ,IAAI,EAAQ,CAAG,EAIrC,GACE,OAAO,IAAQ,WACd,IAAQ,YAAc,IAAQ,WAAa,IAAQ,eACpD,CAEA,KAAK,MAAM,EAAQ,QAAQ,EAC3B,QAAS,EAAI,EAAG,EAAI,EAAO,OAAQ,IACjC,KAAK,MAAM,EAAQ,OAAO,CAAC,CAAC,EAE9B,IAAM,EAAS,EACf,MAAO,IAAI,IAAoB,CAC7B,IAAM,EAAS,EAAO,MAAM,EAAQ,CAAI,EACxC,GAAI,IAAW,IAAS,IAAW,GAAI,CACrC,IAAM,EAAc,EAAO,IAAI,CAAC,IAAS,KAAK,WAAW,CAAI,CAAC,EAI9D,OAHuB,EAAY,GAGb,MACpB,EACA,EAAK,IAAI,CAAC,IAAQ,KAAK,WAAW,CAAG,CAAC,CACxC,EAEF,OAAO,GAKX,GACE,OAAO,IAAQ,UACf,EAAuB,SACrB,CACF,EAEA,MAAO,IAAI,IAAoB,CAG7B,IAAM,EADc,EACO,MAAM,EAAQ,CAAI,EAI7C,OAFA,KAAK,QAAQ,EAAQ,QAAQ,EAC7B,KAAK,QAAQ,EAAQ,CAAG,EACjB,GAIX,GAAI,EAAS,CAAK,GAAK,CAAC,EAAgB,EAAO,CAAW,EACxD,OAAO,KAAK,SAAS,CAAK,EAG5B,OAAO,GAET,IAAK,CAAC,EAAQ,EAAsB,IAAU,CAE5C,GAAI,EAAgB,EAAQ,CAAW,EAErC,OADA,QAAQ,KAAK,uBAAuB,OAAO,CAAG,sBAAsB,EAC7D,GAGT,IAAM,EAAW,QAAQ,IAAI,EAAQ,CAAG,EAGxC,GACE,EAAS,CAAK,GACd,CAAC,EAAgB,EAAO,CAAW,GACnC,CAAC,EAAgB,EAAO,CAAW,EAEnC,EAAQ,KAAK,SAAS,CAAK,EAG7B,IAAM,EAAS,QAAQ,IAAI,EAAQ,EAAK,CAAK,EAG7C,GAAI,IAAa,GAGf,GAFA,KAAK,QAAQ,EAAQ,CAAG,EAEpB,OAAO,IAAQ,UAAY,CAAC,MAAM,OAAO,CAAG,CAAC,EAC/C,KAAK,QAAQ,EAAQ,QAAQ,EAGjC,OAAO,GAET,eAAgB,CAAC,EAAQ,IAAyB,CAEhD,GAAI,EAAgB,EAAQ,CAAW,EAIrC,OAHA,QAAQ,KACN,0BAA0B,OAAO,CAAG,sBACtC,EACO,GAGT,IAAM,EAAS,KAAO,EAChB,EAAS,QAAQ,eAAe,EAAQ,CAAG,EAEjD,GAAI,EACF,KAAK,QAAQ,EAAQ,CAAG,EAExB,KAAK,QAAQ,EAAQ,QAAQ,EAE/B,OAAO,EAEX,CAAC,EAKD,OAFA,KAAK,YAAY,IAAI,EAAQ,CAAK,EAClC,KAAK,SAAS,IAAI,EAAO,CAAM,EACxB,EAGF,QAA0B,CAAC,EAAwB,CAExD,GAAI,CAAC,EAAS,CAAM,EAElB,OADA,QAAQ,KAAK,oCAAoC,EAC1C,EAIT,GAAI,EAAgB,EAAQ,CAAW,EACrC,OAAO,EAIT,GAAI,KAAK,YAAY,IAAI,CAAM,EAC7B,OAAO,KAAK,YAAY,IAAI,CAAM,EAGpC,IAAM,EAAQ,IAAI,MAAM,EAAQ,CAC9B,IAAK,CAAC,EAAQ,IAAyB,CAErC,GAAI,IAAQ,EACV,MAAO,GAET,GAAI,IAAQ,EACV,MAAO,GAGT,IAAM,EAAQ,QAAQ,IAAI,EAAQ,CAAG,EAErC,GAAI,EAAS,CAAK,EAChB,OAAO,KAAK,SAAS,CAAK,EAE5B,OAAO,GAET,IAAK,KACH,QAAQ,KAAK,wCAAwC,EAC9C,IAET,eAAgB,KACd,QAAQ,KAAK,2CAA2C,EACjD,GAEX,CAAC,EAID,OADA,KAAK,YAAY,IAAI,EAAQ,CAAK,EAC3B,EAGF,MAAmB,CACxB,EACA,EACmB,CACnB,IAAQ,OAAO,GAAO,YAAW,eAAe,IAAU,GAAW,CAAC,EAEhE,EAA8B,IAAM,CACxC,GAAI,CAAC,EAAS,OACZ,OAAO,EAAG,EAGZ,GAAI,CAKF,OAHA,KAAK,QAAQ,CAAQ,EACrB,KAAK,YAAY,KAAK,CAAQ,EAC9B,KAAK,aAAe,EACb,EAAG,EACV,MAAO,EAAO,CACd,GAAI,EACF,MAAM,EAER,QAAQ,MAAM,gBAAiB,CAAK,EACpC,cACA,CACA,KAAK,YAAY,IAAI,EACrB,KAAK,aACH,KAAK,YAAY,KAAK,YAAY,OAAS,IAAM,OAUvD,GANA,EAAS,GAAK,KACd,EAAS,KAAO,CAAC,EACjB,EAAS,OAAS,GAClB,EAAS,UAAY,EAGjB,CAAC,EACH,EAAS,EAGX,OAAO,EAQF,aAAgB,CAAC,EAAwB,EAAgB,CAC9D,KAAK,YAAY,KAAK,CAAM,EAC5B,KAAK,aAAe,EACpB,GAAI,CACF,OAAO,EAAG,SACV,CACA,KAAK,YAAY,IAAI,EACrB,KAAK,aAAe,KAAK,YAAY,KAAK,YAAY,OAAS,IAAM,MAIlE,QAAW,CAAC,EAAiC,CAClD,IAAI,EAAQ,GACR,EACE,EAAiB,CAAC,EAClB,EAAqB,IAAY,CACrC,KAAK,MAAM,EAAgB,OAAO,GAG9B,EAAS,KAAK,OAClB,IAAM,CACJ,EAAQ,EAAO,EACf,EAAQ,IAEV,CACE,KAAM,GACN,UAAW,IAAM,CACf,GAAI,CAAC,EACH,EAAQ,GACR,KAAK,QAAQ,EAAgB,OAAO,EAG1C,CACF,EAEA,MAAO,IACD,MAAK,EAAM,CACb,GAAI,EACF,EAAO,EAGT,OADA,EAAmB,EACZ,EAEX,EAGM,OAAO,CAAC,EAA8B,CAE5C,EAAO,KAAK,QAAQ,CAAC,IAAQ,CAC3B,EAAI,OAAO,CAAM,EAClB,EACD,EAAO,KAAK,OAAS,EAGf,KAAK,CAAC,EAAgB,EAA4B,CACxD,GAAI,CAAC,KAAK,cAAgB,CAAC,KAAK,aAAa,OAAQ,OAErD,IAAI,EAAU,KAAK,UAAU,IAAI,CAAM,EACvC,GAAI,CAAC,EACH,EAAU,IAAI,IACd,KAAK,UAAU,IAAI,EAAQ,CAAO,EAGpC,IAAI,EAAM,EAAQ,IAAI,CAAG,EACzB,GAAI,CAAC,EACH,EAAM,IAAI,IACV,EAAQ,IAAI,EAAK,CAAG,EAGtB,GAAI,CAAC,EAAI,IAAI,KAAK,YAAY,EAC5B,EAAI,IAAI,KAAK,YAAY,EACzB,KAAK,aAAa,KAAK,KAAK,CAAG,EAI3B,OAAO,CAAC,EAAgB,EAA4B,CAC1D,IAAM,EAAU,KAAK,UAAU,IAAI,CAAM,EACzC,GAAI,CAAC,EAAS,OAEd,IAAM,EAAM,EAAQ,IAAI,CAAG,EAC3B,GAAI,CAAC,EAAK,OAGM,IAAI,IAAI,CAAG,EACnB,QAAQ,CAAC,IAAW,CAC1B,GAAI,EAAO,OACT,GAAI,EAAO,UACT,EAAO,UAAU,CAAM,EAEvB,OAAO,EAGZ,EAII,IAAI,CAAC,EAA8B,CACxC,GAAI,EAAO,OACT,KAAK,QAAQ,CAAM,EACnB,EAAO,OAAS,GAGtB,CAGO,SAAS,CAA0B,CAAC,EAAc,CACvD,OAAO,EAAe,YAAY,EAAE,SAAS,CAAM,EAG9C,SAAS,EAA0B,CAAC,EAAwB,CACjE,OAAO,EAAe,YAAY,EAAE,SAAS,CAAM,EAG9C,SAAS,CAAmB,CACjC,EACA,EACmB,CACnB,OAAO,EAAe,YAAY,EAAE,OAAO,EAAI,CAAO,EAGjD,SAAS,EAAW,CAAC,EAAiC,CAC3D,OAAO,EAAe,YAAY,EAAE,SAAS,CAAM,EAG9C,SAAS,EAAM,CAAC,EAAkB,CACvC,IAAM,EAAU,CAAE,OAAM,EAOxB,OANA,OAAO,eAAe,EAAS,EAAQ,CACrC,aAAc,GACd,WAAY,GACZ,MAAO,EACT,CAAC,EAEM,EAAS,CAAO,EAGlB,SAAS,CAAK,CAAC,EAAuC,CAC3D,OAAO,EAAS,CAAK,GAAK,QAAQ,QAAQ,IAAI,EAAO,CAAM,CAAC,EAGvD,SAAS,EAAQ,CAAC,EAAsB,CAC7C,OAAO,EAAM,CAAK,EAAI,EAAM,MAAQ,EAG/B,SAAS,CAAI,CAAC,EAA8B,CACjD,EAAe,YAAY,EAAE,KAAK,CAAM,EAyB1C,SAAS,CAAgB,CAAC,EAAgB,EAAyB,CACjE,GAAI,CAAC,EAAS,CAAK,GAAK,EAAK,IAAI,CAAK,EACpC,OAKF,GAFA,EAAK,IAAI,CAAK,EAEV,MAAM,QAAQ,CAAK,EAAG,CACxB,EAAM,QAAQ,CAAC,IAAS,EAAiB,EAAM,CAAI,CAAC,EACpD,OAGF,OAAO,KAAK,CAAK,EAAE,QAAQ,CAAC,IAAQ,CAClC,EAAkB,EAAkC,GAAM,CAAI,EAC/D,EAOI,SAAS,EAAQ,CACtB,EACA,EACA,EAAwB,CAAC,EACb,CACZ,IAAM,EAAS,EAAe,YAAY,EACpC,EAAS,EAAM,CAAM,EACvB,IAAU,EAAkB,MAC3B,EAED,EACA,EAA+B,KAE7B,EAAM,IAAY,CACtB,GAAI,CAAC,EAAI,OACP,OAEF,IAAU,EACV,EAAU,KAEV,IAAM,EAAW,EAAO,EACxB,EAAS,EAAU,EAAU,CAAC,IAAO,CACnC,EAAU,EACX,EACD,EAAW,GAGP,EAAS,EACb,IAAS,CACP,IAAM,EAAQ,EAAO,EACrB,GAAI,EAAQ,MAAQ,EAAS,CAAK,EAChC,EAAiB,EAAO,IAAI,GAAa,EAE3C,OAAO,GAET,CACE,KAAM,GACN,UAAW,IAAM,CACf,GAAI,EAAQ,KACV,EAAI,EAEJ,OAAkB,QAAQ,CAAG,EAGnC,CACF,EAGM,EAAM,EACV,IAAM,CACJ,EAAI,GAEN,CAAE,KAAM,EAAK,CACf,EAEA,GAAI,EAAQ,UACV,EAAI,EAEJ,OAAW,EAAO,EAGpB,MAAO,IAAM,CACX,EAAO,KAAK,CAAM,EAClB,EAAO,KAAK,CAAG,GAKZ,SAAS,EAAU,CAAC,EAAyB,CAClD,OAAO,EAAS,CAAK,GAAK,EAAgB,EAAO,CAAW,EAIvD,SAAS,EAAU,CAAC,EAAyB,CAClD,OAAO,EAAS,CAAK,GAAK,EAAgB,EAAO,CAAW,ECrkBvD,SAAS,CAAe,CAAC,EAAsC,CACpE,OAAO,OAAO,IAAU,UAAY,IAAU,MAAQ,cAAe,EAGhE,SAAS,CAAU,CAAC,EAAiC,CAC1D,OACE,OAAO,IAAU,UACjB,IAAU,MACV,QAAS,GACT,EAAM,MAAQ,OAIX,SAAS,CAAc,CAAC,EAAqC,CAClE,OACE,OAAO,IAAU,UACjB,IAAU,MACV,QAAS,GACT,EAAM,MAAQ,OAIX,SAAS,EAAC,CACf,EACA,EACA,EACA,EACA,EACA,EACU,CACV,MAAO,CACL,MACA,QACA,WACA,YACA,MACA,YACF,EAGK,SAAS,EAAG,CACjB,EACA,EAAkC,CAAC,EACzB,CACV,MAAO,CACL,SACG,CACL,EAGF,SAAS,CAAoB,CAAC,EAA8B,CAC1D,MAAO,CAAC,EAAkC,CAAC,IAAM,GAAI,EAAK,CAAO,EAG5D,IAAM,EAAM,EAAqB,KAAK,EAChC,GAAO,EAAqB,MAAM,EAClC,GAAI,EAAqB,GAAG,EAC5B,GAAS,EAAqB,QAAQ,EACtC,GAAQ,EAAqB,OAAO,EACpC,GAAU,EAAqB,SAAS,EACxC,GAAO,EAAqB,MAAM,EAClC,GAAS,EAAqB,QAAQ,EACtC,GAAS,EAAqB,QAAQ,EACtC,GAAM,EAAqB,KAAK,EAChC,GAAU,EAAqB,SAAS,EACxC,GAAQ,EAAqB,OAAO,EACpC,GAAK,EAAqB,IAAI,EAC9B,GAAK,EAAqB,IAAI,EAC9B,GAAK,EAAqB,IAAI,EAC9B,GAAK,EAAqB,IAAI,EAC9B,GAAK,EAAqB,IAAI,EAC9B,GAAK,EAAqB,IAAI,EAC9B,GAAS,EAAqB,QAAQ,EACtC,GAAK,EAAqB,IAAI,EAC9B,GAAQ,EAAqB,OAAO,EACpC,GAAM,EAAqB,KAAK,EAChC,GAAO,EAAqB,MAAM,EAClC,GAAa,EAAqB,YAAY,EAC9C,GAAK,EAAqB,IAAI,EAC9B,GAAK,EAAqB,IAAI,EAC9B,GAAK,EAAqB,IAAI,EAC9B,GAAI,EAAqB,GAAG,EAC5B,GAAM,EAAqB,KAAK,EAChC,GAAO,EAAqB,MAAM,EAClC,GAAQ,EAAqB,OAAO,EACpC,GAAW,EAAqB,UAAU,EAC1C,GAAS,EAAqB,QAAQ,EACtC,GAAS,EAAqB,QAAQ,EACtC,GAAQ,EAAqB,OAAO,EACpC,GAAQ,EAAqB,OAAO,EACpC,GAAQ,EAAqB,OAAO,EACpC,GAAK,EAAqB,IAAI,EAC9B,GAAK,EAAqB,IAAI,EAC9B,GAAK,EAAqB,IAAI,EAEpC,SAAS,EAA8C,CAC5D,EACA,EACA,EACA,EACA,EACkB,CAClB,MAAO,CACL,UAAW,EACX,QACA,WACA,MACA,YACF,EAGK,SAAS,EAAI,CAClB,EACA,EACA,EACc,CACd,MAAO,CACL,IAAK,OACL,MAAO,CAAE,MAAK,EACd,MACA,YACF,EAGK,SAAS,EAAO,CACrB,EACA,EACA,EACS,CACT,OAAO,EAAM,IAAI,CAAC,EAAM,IAAU,CAChC,IAAM,EAAQ,EAAO,EAAM,CAAK,EAChC,GAAI,OAAO,IAAU,SACnB,MAAU,MAAM,0CAA0C,EAG5D,MAAO,IAAK,EAAO,IAAK,EAAI,EAAM,CAAK,CAAE,EAC1C,ECvMH,SAAS,CAAY,CAAC,EAAwB,CAC5C,IAAM,EAAW,EAAK,MAAM,GAAG,EAC/B,GACE,EAAK,SAAW,GAChB,EAAS,KACP,CAAC,IACC,EAAQ,SAAW,GACnB,IAAY,aACZ,IAAY,aACZ,IAAY,aAChB,EAEA,MAAU,MAAM,uBAAuB,IAAO,EAEhD,OAAO,EAGT,SAAS,CAAQ,CAAC,EAAqC,CACrD,OAAO,OAAO,IAAU,UAAY,IAAU,MAAQ,CAAC,MAAM,QAAQ,CAAK,EAG5E,SAAS,CAAM,CAAC,EAAe,EAAsB,CACnD,OAAO,OAAO,UAAU,eAAe,KAAK,EAAO,CAAG,EAGjD,SAAS,EAAS,CAAC,EAA+B,CACvD,OAAO,OAAO,IAAY,SAAW,EAAU,EAAQ,KAGlD,SAAS,CAAa,CAAC,EAAmB,EAAuB,CACtE,IAAI,EAAiB,EAErB,QAAW,KAAW,EAAa,CAAI,EAAG,CACxC,GAAI,CAAC,EAAS,CAAK,EACjB,MAAU,MAAM,uBAAuB,IAAO,EAEhD,GAAI,CAAC,EAAO,EAAO,CAAO,EAAG,CAC3B,GAAI,KAAW,EACb,MAAU,MAAM,uBAAuB,IAAO,EAEhD,OAEF,EAAQ,EAAM,GAGhB,OAAO,EAGF,SAAS,EAAa,CAC3B,EACA,EACA,EACM,CACN,IAAM,EAAW,EAAa,CAAI,EAC9B,EAAqB,EAEzB,QAAW,KAAW,EAAS,MAAM,EAAG,EAAE,EAAG,CAC3C,GAAI,CAAC,EAAO,EAAQ,CAAO,EAAG,CAC5B,GAAI,KAAW,EACb,MAAU,MAAM,uBAAuB,IAAO,EAEhD,EAAO,GAAW,CAAC,EACd,QAAI,CAAC,EAAS,EAAO,EAAQ,EAClC,MAAU,MAAM,uBAAuB,IAAO,EAEhD,IAAM,EAAa,EAAO,GAC1B,GAAI,CAAC,EAAS,CAAU,EACtB,MAAU,MAAM,uBAAuB,IAAO,EAEhD,EAAS,EAGX,IAAM,EAAc,EAAS,EAAS,OAAS,GAC/C,EAAO,GAAe,EAGxB,SAAS,CAAY,CAAC,EAAuB,EAAwB,CACnE,GAAI,OAAO,IAAY,UAAY,EAAQ,OACzC,OAAO,EAAQ,OAAO,CAAK,EAE7B,OAAO,IAAU,QAAa,IAAU,KAAO,GAAK,OAAO,CAAK,EAGlE,SAAS,EAAY,CAAC,EAAuB,EAAyB,CACpE,GAAI,OAAO,IAAY,UAAY,EAAQ,MACzC,OAAO,EAAQ,MAAM,CAAK,EAE5B,OAAO,EAGT,SAAS,EAAW,CAClB,EACA,EACA,EACM,CACN,GAAI,aAAmB,iBAAkB,CACvC,GAAI,EAAQ,OAAS,WAAY,CAC/B,EAAQ,QAAU,MAAM,QAAQ,CAAK,EACjC,EAAM,KAAK,CAAC,IAAS,OAAO,CAAI,IAAM,EAAQ,KAAK,EACnD,QAAQ,CAAK,EACjB,OAEF,GAAI,EAAQ,OAAS,QAAS,CAC5B,EAAQ,QAAU,IAAU,EAAQ,MACpC,OAEF,EAAQ,MAAQ,EAAa,EAAS,CAAK,EAC3C,OAGF,GAAI,aAAmB,oBAAqB,CAC1C,EAAQ,MAAQ,EAAa,EAAS,CAAK,EAC3C,OAGF,GAAI,aAAmB,kBAAmB,CACxC,GAAI,EAAQ,SAAU,CACpB,IAAM,EAAW,MAAM,QAAQ,CAAK,EAChC,IAAI,IAAI,EAAM,IAAI,MAAM,CAAC,EACzB,IAAI,IACR,QAAS,EAAQ,EAAG,EAAQ,EAAQ,QAAQ,OAAQ,GAAS,EAAG,CAC9D,IAAM,EAAS,EAAQ,QAAQ,KAAK,CAAK,EACzC,GAAI,CAAC,EACH,SAEF,EAAO,SAAW,EAAS,IAAI,EAAO,KAAK,EAE7C,OAEF,EAAQ,MAAQ,EAAa,EAAS,CAAK,GAI/C,SAAS,EAAY,CAAC,EAAsB,EAAgC,CAC1E,GAAI,aAAmB,iBAAkB,CACvC,GAAI,EAAQ,OAAS,WAAY,CAC/B,GAAI,MAAM,QAAQ,CAAY,EAAG,CAC/B,IAAM,EAAS,EAAa,OAC1B,CAAC,IAAU,OAAO,CAAK,IAAM,EAAQ,KACvC,EACA,OAAO,EAAQ,QAAU,CAAC,GAAG,EAAQ,EAAQ,KAAK,EAAI,EAExD,OAAO,EAAQ,QAEjB,GAAI,EAAQ,OAAS,QACnB,OAAO,EAAQ,QAAU,EAAQ,MAAQ,EAE3C,OAAO,EAAQ,MAEjB,GAAI,aAAmB,oBACrB,OAAO,EAAQ,MAEjB,GAAI,aAAmB,kBAAmB,CACxC,GAAI,CAAC,EAAQ,SACX,OAAO,EAAQ,MAEjB,IAAM,EAAmB,CAAC,EAC1B,QAAS,EAAQ,EAAG,EAAQ,EAAQ,gBAAgB,OAAQ,GAAS,EAAG,CACtE,IAAM,EAAS,EAAQ,gBAAgB,KAAK,CAAK,EACjD,GAAI,EACF,EAAO,KAAK,EAAO,KAAK,EAG5B,OAAO,EAET,OAGK,MAAM,CAAuB,CACjB,SAAW,IAAI,QAEzB,IAAI,CACT,EACA,EACA,EACM,CACN,GAAI,CAAC,KAAK,mBAAmB,CAAO,EAClC,OAGF,IAAM,EAAW,KAAK,SAAS,IAAI,CAAO,EAC1C,GAAI,GAAY,KAAK,YAAY,EAAU,CAAO,EAChD,OAEF,KAAK,QAAQ,CAAO,EAEpB,IAAM,EAAO,GAAU,CAAO,EACxB,EAAO,IACX,GAAY,EAAS,EAAS,EAAc,EAAO,CAAI,CAAC,EACpD,EACJ,aAAmB,qBAClB,aAAmB,kBAClB,CAAC,CAAC,WAAY,OAAO,EAAE,SAAS,EAAQ,IAAI,EAC1C,QACA,SACA,EAAW,IAAY,CAC3B,IAAM,EAAe,EAAc,EAAO,CAAI,EAC9C,GACE,EACA,EACA,GAAa,EAAS,GAAa,EAAS,CAAY,CAAC,CAC3D,GAGF,EAAQ,iBAAiB,EAAW,CAAQ,EAC5C,IAAM,EAAY,EAAO,CAAI,EAC7B,KAAK,SAAS,IAAI,EAAS,CACzB,UACA,OACA,MAAO,OAAO,IAAY,SAAW,OAAY,EAAQ,MACzD,OAAQ,OAAO,IAAY,SAAW,OAAY,EAAQ,OAC1D,YACA,WACA,OAAQ,CACV,CAAC,EAGI,OAAO,CAAC,EAA4B,CACzC,IAAM,EAAW,KAAK,SAAS,IAAI,CAAO,EAC1C,GAAI,CAAC,EACH,OAEF,EAAQ,oBAAoB,EAAS,UAAW,EAAS,QAAQ,EACjE,EAAK,EAAS,MAAM,EACpB,KAAK,SAAS,OAAO,CAAO,EAGtB,kBAAkB,CAAC,EAA+B,CACxD,OACE,aAAmB,kBACnB,aAAmB,qBACnB,aAAmB,kBAIf,WAAW,CAAC,EAAuB,EAAgC,CACzE,GAAI,OAAO,EAAO,UAAY,UAAY,OAAO,IAAY,SAC3D,OAAO,EAAO,UAAY,EAE5B,OACE,EAAO,OAAS,EAAQ,MACxB,EAAO,QAAU,EAAQ,OACzB,EAAO,SAAW,EAAQ,OAGhC,CCtQO,SAAS,CAAW,CAAC,EAAsB,CAChD,MAAO,WAAW,KAAK,CAAG,GAAK,WAAW,KAAK,CAAG,EAG7C,SAAS,CAAiB,CAAC,EAAqB,CACrD,OAAO,EAAI,MAAM,CAAC,EAAE,YAAY,EAG3B,SAAS,EAAc,CAAC,EAAgC,CAC7D,IAAO,KAAc,GAAa,EAAM,MAAM,GAAG,EACjD,MAAO,CAAE,YAAW,UAAW,IAAI,IAAI,CAAS,CAAE,EAG7C,SAAS,EAAgB,CAC9B,EACA,EACe,CACf,IAAM,EAAe,CAAC,IAAuB,CAC3C,GAAI,EAAU,IAAI,MAAM,EACtB,EAAM,gBAAgB,EAGxB,GAAI,EAAU,IAAI,SAAS,EACzB,EAAM,eAAe,EAGvB,GAAI,EAAU,IAAI,MAAM,GAAK,EAAM,gBAAkB,EAAM,OACzD,OAGF,GAAI,EAAU,IAAI,MAAM,EACrB,EAAM,cAA8B,oBACnC,EAAM,KACN,CACF,EAGF,EAAQ,CAAK,GAGf,OAAO,EAGF,SAAS,EAAa,CAC3B,EACA,EACA,EACM,CACN,IAAM,EAAc,EAAS,SAAS,GAAG,EACrC,EACA,EAAS,QAAQ,SAAU,CAAC,IAAU,IAAI,EAAM,YAAY,GAAG,EAEnE,EAAM,YAAY,EAAa,OAAO,CAAK,CAAC,ECvCvC,IAAM,GAAgB,6BAOhB,GAAgC,IAAI,IAAI,CACnD,MACA,IACA,OACA,OACA,SACA,UACA,OACA,WACA,UACA,OACA,OACA,QACA,WACA,MACA,SACA,SACA,iBACA,iBACA,OACA,UACA,OACA,WACA,eACF,CAAC,EAEM,MAAM,CAEsB,CAChB,UAAY,IAAI,QAIhB,QAAU,IAAI,QACd,cAAgB,IAAI,EAE9B,OAAO,CAAC,EAAmC,CAChD,OAAO,OAAO,IAAU,UAAY,IAAU,MAAQ,EAAW,CAAK,EAGjE,KAAK,CAAC,EAAc,EAAqC,CAC9D,GAAI,EAAM,YAAY,KAAO,GAC3B,OAAO,SAAS,cAAc,IAAI,EAGpC,IAAM,EAAU,GAAS,IAAI,EAAM,GAAG,EAClC,SAAS,gBAAgB,GAAe,EAAM,GAAG,EACjD,SAAS,cAAc,EAAM,GAAG,EAMpC,OALA,KAAK,WAAW,EAAS,CAAC,EAAG,EAAM,OAAS,CAAC,EAAG,CAAO,EACvD,KAAK,gBAAgB,EAAS,CAAC,EAAG,KAAK,iBAAiB,CAAK,CAAC,EAC9D,KAAK,cAAc,EAAS,EAAO,CAAO,EAC1C,KAAK,gBAAgB,EAAS,OAAW,EAAM,WAAY,CAAO,EAE3D,EAGF,KAAK,CACV,EACA,EACA,EACA,EACM,CACN,GACE,EAAS,MAAQ,EAAS,KAC1B,EAAY,WAAa,KAAK,aAC9B,CACA,IAAM,EAAW,KAAK,MAAM,EAAU,CAAO,EAG7C,OAFA,EAAY,YAAY,aAAa,EAAU,CAAW,EAC1D,KAAK,QAAQ,EAAU,EAAa,CAAO,EACpC,EAIT,GAAI,EAAE,aAAuB,SAC3B,OAAO,EAGT,GAAI,EAAS,YAAY,KAAO,GAAO,CACrC,IAAM,EAAW,SAAS,cAAc,IAAI,EAG5C,OAFA,EAAY,YAAY,aAAa,EAAU,CAAW,EAC1D,KAAK,QAAQ,EAAU,EAAa,CAAO,EACpC,EAsBT,OAnBA,KAAK,WACH,EACA,EAAS,OAAS,CAAC,EACnB,EAAS,OAAS,CAAC,EACnB,CACF,EACA,KAAK,gBACH,EACA,KAAK,iBAAiB,CAAQ,EAC9B,KAAK,iBAAiB,CAAQ,CAChC,EACA,KAAK,eAAe,EAAa,EAAU,EAAU,CAAO,EAC5D,KAAK,gBACH,EACA,EAAS,WACT,EAAS,WACT,CACF,EAEO,EAGF,OAAO,CACZ,EACA,EACA,EACM,CACN,GAAI,EAAE,aAAuB,SAC3B,OAGF,KAAK,QAAQ,IAAI,CAAW,GAAG,QAAQ,CAAC,IAAS,EAAK,CAAI,CAAC,EAC3D,KAAK,QAAQ,OAAO,CAAW,EAE/B,KAAK,UAAU,IAAI,CAAW,GAAG,QAAQ,EAAG,YAAW,cAAe,CACpE,EAAY,oBAAoB,EAAW,CAAQ,EACpD,EACD,KAAK,UAAU,OAAO,CAAW,EACjC,KAAK,cAAc,QAAQ,CAA0B,EACrD,KAAK,gBAAgB,EAAa,EAAO,CAAO,EAGxC,aAAa,CACrB,EACA,EACA,EACM,EACL,EAAM,UAAY,CAAC,GAAG,QAAQ,CAAC,IAAU,CACxC,EAAQ,YAAY,EAAQ,SAAS,MAAM,EAAO,CAAO,CAAC,EAC3D,EAGO,cAAc,CACtB,EACA,EACA,EACA,EACM,CACN,KAAK,uBACH,EACA,EAAS,UAAY,CAAC,EACtB,EAAS,UAAY,CAAC,EACtB,CACF,EAGQ,eAAe,CACvB,EACA,EACA,EACM,EACL,EAAM,UAAY,CAAC,GAAG,QAAQ,CAAC,EAAO,IAAU,CAC/C,IAAM,EAAY,EAAQ,WAAW,GACrC,GAAI,EACF,EAAQ,SAAS,QAAQ,EAAO,EAAW,CAAO,EAErD,EAGK,UAAU,CAChB,EACA,EACA,EACA,EACM,CACN,OAAO,KAAK,CAAQ,EAAE,QAAQ,CAAC,IAAQ,CACrC,GAAI,EAAY,CAAG,GAAK,KAAO,EAC7B,OAGF,GAAI,IAAQ,aAAe,IAAQ,QACjC,EAAQ,gBAAgB,OAAO,EAC1B,QAAI,IAAQ,QACjB,EAAQ,gBAAgB,OAAO,EAC1B,QACL,IAAQ,SACR,OAAO,IAAY,UACnB,IAAY,MACZ,UAAW,EAEV,EAA4C,MAAQ,GAErD,OAAQ,gBAAgB,EAAc,CAAG,CAAC,EAE7C,EAED,OAAO,QAAQ,CAAQ,EAAE,QAAQ,EAAE,EAAK,KAAW,CACjD,GAAI,EAAY,CAAG,EACjB,OAIF,GAAI,EAAS,KAAS,EACpB,OAGF,GAAI,IAAQ,aAAe,IAAQ,QAAS,CAG1C,GAAI,EAAQ,eAAiB,GAC3B,EAAQ,aAAa,QAAS,OAAO,GAAS,EAAE,CAAC,EAEjD,KAAC,EAAwB,UAAY,OAAO,GAAS,EAAE,EAEzD,OAMF,GACE,IAAQ,SACR,OAAO,IAAY,UACnB,IAAY,MACZ,UAAW,EACX,CACC,EAA4C,MAAQ,OACnD,GAAS,EACX,EACA,OAGF,GAAI,IAAQ,SAAW,OAAO,IAAU,UAAY,IAAU,KAAM,CAClE,EAAQ,gBAAgB,OAAO,EAC/B,IAAM,EAAS,EAAwB,MACvC,OAAO,QAAQ,CAAK,EAAE,QAAQ,EAAE,EAAQ,KAAc,CACpD,GAAc,EAAO,EAAQ,CAAQ,EACtC,EACD,OAGF,GAAI,IAAU,IAAS,IAAU,QAAa,IAAU,KAAM,CAC5D,EAAQ,gBAAgB,EAAc,CAAG,CAAC,EAC1C,OAGF,GAAI,IAAU,GAAM,CAClB,EAAQ,aAAa,EAAc,CAAG,EAAG,EAAE,EAC3C,OAGF,GACE,OAAO,IAAU,UACjB,EAAQ,eAAe,eAAe,CAAK,EAC3C,CACA,KAAK,uBAAuB,EAAS,EAAK,EAAO,CAAO,EACxD,OAGF,EAAQ,aAAa,EAAc,CAAG,EAAG,OAAO,CAAK,CAAC,EACvD,EAGK,eAAe,CACrB,EACA,EACA,EACA,EACM,CACN,GAAI,GAAiB,SAAU,EAC5B,EAAwB,MAAM,QAAU,EAAc,KAAO,GAAK,OAC9D,QAAI,GAAiB,SAAU,EACnC,EAAwB,MAAM,QAAU,GAG3C,GAAI,CAAC,GAAe,MAAO,CACzB,KAAK,cAAc,QAAQ,CAAsB,EACjD,OAGF,KAAK,cAAc,KACjB,EACA,EAAc,MACd,EAAQ,eAAe,KACzB,EAGM,sBAAsB,CAC5B,EACA,EACA,EACA,EACM,CAIN,GAHA,KAAK,sBAAsB,CAAW,EACtC,KAAK,sBAAsB,CAAW,EAElC,KAAK,qBAAqB,EAAa,CAAW,EAAG,CACvD,KAAK,oBAAoB,EAAS,EAAa,EAAa,CAAO,EACnE,OAGF,IAAM,EAAe,KAAK,IAAI,EAAY,OAAQ,EAAY,MAAM,EAEpE,QAAS,EAAQ,EAAG,EAAQ,EAAc,GAAS,EAAG,CACpD,IAAM,EAAY,EAAQ,WAAW,GACrC,GAAI,CAAC,EAAW,CACd,EAAQ,YACN,EAAQ,SAAS,MAAM,EAAY,GAAQ,CAAO,CACpD,EACA,SAEF,EAAQ,SAAS,MACf,EAAY,GACZ,EAAY,GACZ,EACA,CACF,EAGF,QAAS,EAAQ,EAAc,EAAQ,EAAY,OAAQ,GAAS,EAClE,EAAQ,YAAY,EAAQ,SAAS,MAAM,EAAY,GAAQ,CAAO,CAAC,EAGzE,QACM,EAAQ,EAAY,OAAS,EACjC,GAAS,EAAY,OACrB,GAAS,EACT,CACA,IAAM,EAAY,EAAQ,WAAW,GACrC,GAAI,GAEF,GADA,EAAQ,SAAS,QAAQ,EAAY,GAAQ,EAAW,CAAO,EAC3D,EAAU,aAAe,EAC3B,EAAQ,YAAY,CAAS,IAM7B,mBAAmB,CACzB,EACA,EACA,EACA,EACM,CACN,IAAM,EAAa,EAAY,IAAI,CAAC,EAAO,KAAW,CACpD,QACA,KAAM,EAAQ,WAAW,GACzB,OACF,EAAE,EACI,EAAkB,IAAI,IAItB,EAAiB,IAAI,IAE3B,EAAW,QAAQ,CAAC,IAAU,CAC5B,IAAM,EAAM,KAAK,YAAY,EAAM,KAAK,EACxC,GAAI,IAAQ,QAAa,EAAM,KAC7B,EAAgB,IAAI,EAAK,CACvB,MAAO,EAAM,MACb,KAAM,EAAM,KACZ,MAAO,EAAM,KACf,CAAC,EAEJ,EAED,EAAY,QAAQ,CAAC,EAAU,IAAa,CAC1C,IAAM,EAAM,KAAK,YAAY,CAAQ,EAC/B,EAAW,IAAQ,OAAY,OAAY,EAAgB,IAAI,CAAG,EACpE,EAEJ,GAAI,EACF,EAAW,EAAQ,SAAS,MAC1B,EAAS,MACT,EACA,EAAS,KACT,CACF,EACA,EAAe,IAAI,EAAS,KAAK,EAEjC,OAAW,EAAQ,SAAS,MAAM,EAAU,CAAO,EAGrD,IAAM,EAAgB,EAAQ,WAAW,IAAa,KACtD,GAAI,IAAa,EACf,EAAQ,aAAa,EAAU,CAAa,EAE/C,EAED,EAAW,QAAQ,CAAC,IAAU,CAC5B,GAAI,CAAC,EAAM,MAAQ,EAAe,IAAI,EAAM,KAAK,EAC/C,OAIF,GADA,EAAQ,SAAS,QAAQ,EAAM,MAAO,EAAM,KAAM,CAAO,EACrD,EAAM,KAAK,aAAe,EAC5B,EAAQ,YAAY,EAAM,IAAI,EAEjC,EAGK,oBAAoB,CAC1B,EACA,EACS,CACT,MAAO,CAAC,GAAG,EAAa,GAAG,CAAW,EAAE,MACtC,CAAC,IAAU,KAAK,YAAY,CAAK,IAAM,MACzC,EAGM,qBAAqB,CAAC,EAAuC,CACnE,IAAM,EAAO,IAAI,IAEjB,EAAS,QAAQ,CAAC,IAAU,CAC1B,IAAM,EAAM,KAAK,YAAY,CAAK,EAClC,GAAI,IAAQ,OACV,OAGF,GAAI,EAAK,IAAI,CAAG,EACd,MAAU,MAAM,kBAAkB,IAAM,EAG1C,EAAK,IAAI,CAAG,EACb,EAGK,WAAW,CAAC,EAAoD,CACtE,GAAI,OAAO,IAAU,SACnB,OAGF,OAAO,EAAM,IAGP,gBAAgB,CAAC,EAAiC,CACxD,IAAM,EAA4B,CAAC,EAQnC,OANA,OAAO,QAAQ,EAAM,OAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAK,KAAW,CAC1D,GAAI,EAAY,CAAG,GAAK,OAAO,IAAU,WACvC,EAAU,EAAkB,CAAG,GAAK,EAEvC,EAEM,IACF,KACC,EAAM,WAAa,CAAC,CAC1B,EAGM,eAAe,CACrB,EACA,EACA,EACM,CACN,IAAM,EAAQ,KAAK,UAAU,IAAI,CAAO,GAAK,IAAI,IAC3C,EAAU,IAAI,IAAI,OAAO,KAAK,CAAY,CAAC,EAC3C,EAAU,IAAI,IAAI,OAAO,KAAK,CAAY,CAAC,EAEjD,EAAQ,QAAQ,CAAC,IAAU,CACzB,GAAI,CAAC,EAAQ,IAAI,CAAK,GAAK,EAAa,KAAW,EAAa,GAAQ,CACtE,IAAM,EAAS,EAAM,IAAI,CAAK,EAC9B,GAAI,EACF,EAAQ,oBAAoB,EAAO,UAAW,EAAO,QAAQ,EAC7D,EAAM,OAAO,CAAK,GAGvB,EAED,EAAQ,QAAQ,CAAC,IAAU,CACzB,GAAI,CAAC,EAAQ,IAAI,CAAK,GAAK,EAAa,KAAW,EAAa,GAAQ,CACtE,IAAQ,YAAW,aAAc,GAAe,CAAK,EAC/C,EAAW,GAAiB,EAAa,GAAQ,CAAS,EAChE,EAAQ,iBAAiB,EAAW,CAAQ,EAC5C,EAAM,IAAI,EAAO,CAAE,YAAW,UAAS,CAAC,GAE3C,EAED,KAAK,UAAU,IAAI,EAAS,CAAK,EAG3B,sBAAsB,CAC5B,EACA,EACA,EACA,EACM,CACN,IAAM,EAAY,EAAO,IAAM,CAC7B,EAAQ,aACN,EACA,EAAQ,eAAe,sBAAsB,CAAS,CACxD,EACD,EAED,KAAK,YAAY,EAAS,CAAS,EAG7B,WAAW,CAAC,EAAkB,EAAiC,CACrE,IAAM,EAAU,KAAK,QAAQ,IAAI,CAAO,GAAK,IAAI,IACjD,EAAQ,IAAI,CAAS,EACrB,KAAK,QAAQ,IAAI,EAAS,CAAO,EAErC,CAGA,SAAS,CAAa,CAAC,EAAqB,CAC1C,GAAI,EAAI,WAAW,MAAM,GAAK,EAAI,OAAS,EACzC,MAAO,OAAO,EACX,MAAM,CAAC,EACP,QAAQ,SAAU,CAAC,IAAU,IAAI,EAAM,YAAY,GAAG,IAG3D,GAAI,IAAQ,YAAc,IAAQ,WAAa,IAAQ,UACrD,OAAO,EAAI,YAAY,EAEzB,OAAO,EC9fF,MAAM,CAAgB,CACV,WAEjB,WAAW,EAAG,CACZ,KAAK,WAAa,CAChB,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,CACN,EAGK,KAAK,CAAC,EAAmB,EAAqC,CACnE,OAAO,KAAK,aAAa,CAAK,EAAE,MAAM,EAAgB,CAAO,EAGxD,KAAK,CACV,EACA,EACA,EACA,EACM,CACN,IAAM,EAAc,KAAK,aAAa,CAAQ,EACxC,EAAc,KAAK,aAAa,CAAQ,EAE9C,GAAI,IAAgB,EAAa,CAC/B,IAAM,EAAW,EAAY,MAAM,EAAmB,CAAO,EAG7D,OAFA,EAAY,YAAY,aAAa,EAAU,CAAW,EAC1D,EAAY,QAAQ,EAAmB,EAAa,CAAO,EACpD,EAGT,OAAO,EAAY,MACjB,EACA,EACA,EACA,CACF,EAGK,OAAO,CACZ,EACA,EACA,EACM,CACN,KAAK,aAAa,CAAK,EAAE,QAAQ,EAAgB,EAAa,CAAO,EAG/D,YAAY,CAAC,EAAmC,CACtD,IAAM,EAAW,KAAK,WAAW,KAAK,CAAC,IAAS,EAAK,QAAQ,CAAK,CAAC,EACnE,GAAI,CAAC,EACH,MAAU,MAAM,oCAAoC,EAEtD,OAAO,EAEX,CAEO,MAAM,EAAqD,CACzD,OAAO,CAAC,EAAoC,CACjD,OAAO,OAAO,IAAU,SAGnB,KAAK,CAAC,EAAe,EAAqC,CAC/D,OAAO,EAAQ,eAAe,cAAc,CAAK,EAG5C,KAAK,CACV,EACA,EACA,EACA,EACM,CACN,GAAI,IAAa,EACf,OAAO,EAGT,IAAM,EAAW,KAAK,MAAM,EAAU,CAAO,EAE7C,OADA,EAAY,YAAY,aAAa,EAAU,CAAW,EACnD,EAGF,OAAO,EAAS,EACzB,CAEO,MAAM,EAAiE,CAC3D,UAAY,IAAI,QAChB,cAAgB,IAAI,IACpB,qBAAuB,IAAI,QAKrC,OAAO,CAAC,EAA2C,CACxD,OACE,OAAO,IAAU,UAAY,IAAU,MAAQ,EAAgB,CAAK,EAIjE,KAAK,CAAC,EAAsB,EAAqC,CACtE,GAAI,EAAM,YAAY,KAAO,GAC3B,OAAO,SAAS,cAAc,IAAI,EAMpC,IAAM,EAAW,IAHM,EAAM,UAGO,KAAK,YAAY,CAAK,CAAC,EAE3D,GAAI,EAAQ,YAAc,EAAS,cACjC,EAAS,cAAc,EAAQ,UAAU,EAG3C,KAAK,aAAa,EAAU,EAAM,UAAY,CAAC,CAAC,EAEhD,EAAQ,cAAc,CAAQ,EAE9B,IAAM,EAAO,EAAS,YAAY,EAMlC,OALA,KAAK,kBAAkB,EAAU,CAAI,EACrC,EAAS,2BAA2B,CAAC,EAAc,IAAa,CAC9D,KAAK,kBAAkB,EAAU,CAAY,EAC7C,KAAK,kBAAkB,EAAU,CAAQ,EAC1C,EACM,EAGF,KAAK,CACV,EACA,EACA,EACA,EACM,CACN,GAAI,EAAY,WAAa,KAAK,aAAc,CAC9C,IAAM,EAAW,KAAK,MAAM,EAAU,CAAO,EAE7C,OADA,EAAY,YAAY,aAAa,EAAU,CAAW,EACnD,EAGT,GAAI,EAAS,YAAY,KAAO,GAAO,CACrC,IAAM,EAAW,SAAS,cAAc,IAAI,EAG5C,OAFA,EAAY,YAAY,aAAa,EAAU,CAAW,EAC1D,KAAK,QAAQ,EAAU,EAAa,CAAO,EACpC,EAGT,IAAM,EAAW,KAAK,UAAU,IAAI,CAAW,EAE/C,GAAI,GAAY,EAAS,YAAc,EAAS,UAAW,CACzD,KAAK,aAAa,EAAU,EAAS,UAAY,CAAC,CAAC,EACnD,EAAS,SAAS,KAAK,YAAY,CAAQ,CAAC,EAC5C,IAAM,EAAW,EAAS,WAAW,GAAK,EAE1C,OADA,KAAK,kBAAkB,EAAU,CAAQ,EAClC,EAGT,IAAM,EAAW,KAAK,MAAM,EAAU,CAAO,EAG7C,OAFA,EAAY,YAAY,aAAa,EAAU,CAAW,EAC1D,KAAK,QAAQ,EAAU,EAAa,CAAO,EACpC,EAGF,OAAO,CACZ,EACA,EACA,EACM,CACN,IAAM,EAAW,KAAK,UAAU,IAAI,CAAW,EAC/C,GAAI,EACF,KAAK,cAAc,CAAQ,EAC3B,EAAS,QAAQ,EACjB,KAAK,mBAAmB,CAAQ,EAChC,EAAQ,gBAAgB,CAAQ,EAI5B,WAAW,CAAC,EAAsC,CACxD,MAAO,IACD,EAAM,OAAS,CAAC,EACpB,SAAU,EAAM,UAAY,CAAC,CAC/B,EAGM,YAAY,CAClB,EACA,EACM,CACN,IAAM,EAAU,KAAK,qBAAqB,IAAI,CAAQ,GAAK,IAAI,IAE/D,EAAQ,QAAQ,EAAG,SAAU,EAAiB,eAAe,IAAc,CACzE,IAAM,EAAW,EAAS,GAC1B,GAAI,CAAC,GAAY,IAAa,EAC5B,EAAY,EACZ,EAAQ,OAAO,CAAS,EAE3B,EAED,OAAO,QAAQ,CAAQ,EAAE,QAAQ,EAAE,EAAW,KAAc,CAC1D,GAAI,EAAQ,IAAI,CAAS,GAAG,WAAa,EACvC,OAGF,EAAQ,IAAI,EAAW,CACrB,WACA,YAAa,EAAS,GAAG,EAAW,CAAQ,CAC9C,CAAC,EACF,EAED,KAAK,qBAAqB,IAAI,EAAU,CAAO,EAGzC,aAAa,CAAC,EAAmC,CACvD,KAAK,qBAAqB,IAAI,CAAQ,GAAG,QAAQ,EAAG,iBAAkB,CACpE,EAAY,EACb,EACD,KAAK,qBAAqB,OAAO,CAAQ,EAGnC,iBAAiB,CAAC,EAA6B,EAAkB,CACvE,KAAK,UAAU,IAAI,EAAM,CAAQ,EACjC,IAAM,EAAQ,KAAK,cAAc,IAAI,CAAQ,GAAK,IAAI,IACtD,EAAM,IAAI,CAAI,EACd,KAAK,cAAc,IAAI,EAAU,CAAK,EAGhC,kBAAkB,CAAC,EAAmC,CAC5D,KAAK,cAAc,IAAI,CAAQ,GAAG,QAAQ,CAAC,IAAS,CAClD,KAAK,UAAU,OAAO,CAAI,EAC3B,EACD,KAAK,cAAc,OAAO,CAAQ,EAEtC,CAEO,MAAM,EAA2D,CACrD,iBAAmB,IAAI,QAKjC,OAAO,CAAC,EAA0C,CACvD,OAAO,OAAO,IAAU,UAAY,IAAU,MAAQ,EAAe,CAAK,EAGrE,KAAK,CAAC,EAAqB,EAAqC,CACrE,GAAI,EAAM,YAAY,KAAO,GAC3B,OAAO,SAAS,cAAc,IAAI,EAGpC,IAAM,EAAgB,SAAS,cAAc,KAAK,EAOlD,OANA,EAAc,aAAa,YAAa,EAAM,MAAM,IAAI,EACxD,KAAK,kBACH,EACA,KAAK,gBAAgB,EAAO,CAAO,EACnC,CACF,EACO,EAGF,KAAK,CACV,EACA,EACA,EACA,EACM,CACN,GAAI,EAAY,WAAa,KAAK,aAAc,CAC9C,IAAM,EAAW,KAAK,MAAM,EAAU,CAAO,EAE7C,OADA,EAAY,YAAY,aAAa,EAAU,CAAW,EACnD,EAGT,GAAI,EAAS,YAAY,KAAO,GAAO,CACrC,IAAM,EAAW,SAAS,cAAc,IAAI,EAG5C,OAFA,EAAY,YAAY,aAAa,EAAU,CAAW,EAC1D,KAAK,QAAQ,EAAU,EAAa,CAAO,EACpC,EAGT,GAAI,aAAuB,YACzB,EAAY,aAAa,YAAa,EAAS,MAAM,IAAI,EACzD,KAAK,oBAAoB,EAAa,EAAU,EAAU,CAAO,EAEnE,OAAO,EAGF,OAAO,CACZ,EACA,EACA,EACM,CACN,GAAI,EAAE,aAAuB,aAC3B,OAGF,KAAK,oBAAoB,EAAa,CAAO,EAC7C,KAAK,iBAAiB,OAAO,CAAW,EAGlC,eAAe,CACrB,EACA,EACuB,CACvB,OAAO,EAAQ,MAAM,EAAM,MAAM,OAAS,EAAM,UAAY,CAAC,EAGvD,mBAAmB,CACzB,EACA,EACA,EACA,EACM,CACN,IAAM,EAAc,KAAK,iBAAiB,IAAI,CAAO,GAAK,CAAC,EACrD,EAAc,KAAK,gBAAgB,EAAU,CAAO,EACpD,EAAe,KAAK,IAAI,EAAY,OAAQ,EAAY,MAAM,EAIpE,QAAS,EAAQ,EAAG,EAAQ,EAAc,GAAS,EAAG,CACpD,IAAM,EAAY,EAAQ,WAAW,GACrC,GAAI,CAAC,EAAW,CACd,EAAQ,YACN,EAAQ,SAAS,MAAM,EAAY,GAAQ,CAAO,CACpD,EACA,SAEF,EAAQ,SAAS,MACf,EAAY,GACZ,EAAY,GACZ,EACA,CACF,EAGF,QAAS,EAAQ,EAAc,EAAQ,EAAY,OAAQ,GAAS,EAClE,EAAQ,YAAY,EAAQ,SAAS,MAAM,EAAY,GAAQ,CAAO,CAAC,EAGzE,QACM,EAAQ,EAAY,OAAS,EACjC,GAAS,EAAY,OACrB,GAAS,EACT,CACA,IAAM,EAAY,EAAQ,WAAW,GACrC,GAAI,GAEF,GADA,EAAQ,SAAS,QAAQ,EAAY,GAAQ,EAAW,CAAO,EAC3D,EAAU,aAAe,EAC3B,EAAQ,YAAY,CAAS,GAKnC,KAAK,iBAAiB,IAAI,EAAS,CAAW,EAGxC,iBAAiB,CACvB,EACA,EACA,EACM,CACN,EAAS,QAAQ,CAAC,IAAU,CAC1B,EAAQ,YAAY,EAAQ,SAAS,MAAM,EAAO,CAAO,CAAC,EAC3D,EACD,KAAK,iBAAiB,IAAI,EAAS,CAAQ,EAGrC,mBAAmB,CACzB,EACA,EACM,EACW,KAAK,iBAAiB,IAAI,CAAO,GAAK,CAAC,GAC/C,QAAQ,CAAC,EAAO,IAAU,CACjC,IAAM,EAAY,EAAQ,WAAW,GACrC,GAAI,EACF,EAAQ,SAAS,QAAQ,EAAO,EAAW,CAAO,EAErD,EAEL,CCtYO,MAAM,CAAe,CAIP,MAHX,SAA8B,CAAC,EACtB,cAAgB,aAEjC,WAAW,CAAQ,EAAe,CAAf,aACjB,GAAI,CAAC,GAAS,OAAO,IAAU,SAC7B,MAAU,MAAM,8CAA8C,EAS3D,aAAa,CAAC,EAAoB,CACvC,GAAI,OAAO,IAAS,SAClB,EAAO,OAAO,CAAI,EAGpB,IAAM,EAAW,SAAS,eAAe,EAAE,EAC3C,KAAK,cAAc,UAAY,EAC/B,IAAM,EAAU,MAAM,KAAK,EAAK,SAAS,KAAK,aAAa,CAAC,EAE5D,GAAI,GAAW,EAAQ,OAAS,EAC9B,KAAK,sBAAsB,EAAU,EAAM,CAAO,EAGlD,OAAS,YAAc,EAGzB,OAAO,EAMD,qBAAqB,CAC3B,EACA,EACA,EACM,CAEN,IAAM,EAAO,IAAI,IAGX,EAAc,KAAK,iBAAiB,EAAc,EAAS,CAAI,EACrE,EAAK,YAAc,EAGnB,IAAM,EAAW,EAAO,IAAM,CAC5B,GAAI,CACF,IAAM,EAAc,KAAK,iBAAiB,EAAc,EAAS,CAAI,EACrE,GAAI,EAAK,cAAgB,EACvB,EAAK,YAAc,EAErB,MAAO,EAAO,CACd,QAAQ,MAAM,yBAA0B,CAAK,EAC7C,EAAK,YAAc,UAAU,aAAiB,MAAQ,EAAM,QAAU,mBAEzE,EAGD,KAAK,SAAS,KAAK,CACjB,OACA,eACA,OAAQ,CACV,CAAC,EAMK,gBAAgB,CACtB,EACA,EACA,EACQ,CACR,IAAI,EAAS,EAgBb,OAdA,EAAQ,QAAQ,CAAC,IAAU,CACzB,IAAM,EAAM,EAAM,IAAI,KAAK,EAC3B,GAAI,EAAK,CACP,EAAK,IAAI,CAAG,EAGZ,IAAM,EAAQ,KAAK,kBAAkB,CAAG,EAElC,EACJ,IAAU,QAAa,IAAU,KAAO,GAAK,OAAO,CAAK,EAC3D,EAAS,EAAO,QAAQ,EAAM,GAAI,CAAY,GAEjD,EAEM,EAMD,iBAAiB,CAAC,EAA0B,CAClD,GAAI,CAAC,EAAS,OAGd,IAAM,EAAO,EAAQ,MAAM,GAAG,EAC1B,EAAiB,KAAK,MAE1B,QAAW,KAAO,EAAM,CACtB,GAAI,CAAC,GAAS,OAAO,IAAU,SAC7B,OAEF,EAAS,EAAkC,GAG7C,OAAO,EAMF,aAAa,EAAS,CAE3B,KAAK,SAAS,QAAQ,CAAC,IAAY,CACjC,EAAK,EAAQ,MAAM,EACpB,EACD,KAAK,SAAW,CAAC,EAMZ,eAAe,EAAW,CAC/B,OAAO,KAAK,SAAS,OAMhB,cAAc,CAAC,EAAuB,CAE3C,OADA,KAAK,cAAc,UAAY,EACxB,KAAK,cAAc,KAAK,CAAI,EAM9B,WAAW,CAAC,EAAwB,CACzC,IAAM,EAAiB,CAAC,EACpB,EACE,EAAQ,IAAI,OAAO,KAAK,cAAe,GAAG,EAEhD,OAAQ,EAAQ,EAAM,KAAK,CAAI,KAAO,KAAM,CAC1C,IAAM,EAAM,EAAM,IAAI,KAAK,EAC3B,GAAI,EACF,EAAK,KAAK,CAAG,EAIjB,OAAO,EAMF,qBAAqB,CAAC,EAAsB,CACjD,KAAK,cAAc,UAAY,EAC/B,IAAM,EAAU,MAAM,KAAK,EAAK,SAAS,KAAK,aAAa,CAAC,EAC5D,GAAI,CAAC,GAAW,EAAQ,SAAW,EACjC,OAAO,EAGT,IAAM,EAAO,IAAI,IACjB,OAAO,KAAK,iBAAiB,EAAM,EAAS,CAAI,EAEpD,CC7IO,MAAe,CAGS,CAmBP,MAlBd,MAAsB,KACtB,GAAkB,KACT,SAAW,IAAI,EACf,eACA,gBAAkB,IAAI,IACtB,eACf,CAAC,EACc,UAAY,IAAI,IAChB,aACT,WAAsB,KACtB,gBAA4C,KAC5C,sBACwD,KAEtD,aACH,MACA,QAAU,GAEjB,WAAW,CAAW,EAAgB,CAAC,EAAa,CAA9B,aACpB,KAAK,aAAe,IAAI,GACxB,KAAK,MAAQ,EAAS,KAAK,UAAU,GAAK,CAAC,CAAC,EAC5C,KAAK,eAAiB,IAAI,EAAe,KAAK,KAAK,EACnD,KAAK,WAAW,EAEhB,KAAK,aAAe,EAClB,IAAM,CAGJ,GAAI,KAAK,QACP,GAAI,CACF,KAAK,OAAO,EACZ,MAAO,EAAO,CACd,GAAI,CAAC,KAAK,cAAc,CAAK,EAC3B,MAAM,IAKd,CACE,aAAc,GAEd,UAAW,CAAC,IAAiB,CAC3B,EAAkB,QAAQ,CAAY,EAE1C,CACF,EAOK,KAAK,CAAC,EAA8B,CACzC,GAAI,CAAC,GAAa,EAAE,aAAqB,aACvC,MAAU,MAAM,2BAA2B,EAG7C,GAAI,CACF,EAAU,YAAY,KAAK,YAAY,CAAC,EACxC,MAAO,EAAO,CAEd,MADA,QAAQ,MAAM,UAAW,CAAK,EACxB,GAIH,WAAW,EAAS,CACzB,GAAI,KAAK,SAAW,KAAK,GACvB,OAAO,KAAK,GAuBd,OApBA,KAAK,YAAY,EAGjB,KAAK,GAAK,EAAe,YAAY,EAAE,cACrC,KAAK,aACL,IAAM,CACJ,GAAI,CAEF,OADA,KAAK,MAAQ,KAAK,OAAO,EAClB,KAAK,SAAS,MAAM,KAAK,MAAO,KAAK,oBAAoB,CAAC,EACjE,MAAO,EAAO,CAEd,GAAI,KAAK,cAAc,CAAK,EAC1B,OAAO,SAAS,cAAc,gBAAgB,EAEhD,MAAM,GAGZ,EACA,KAAK,QAAU,GACf,KAAK,UAAU,EACR,KAAK,GAGP,MAAM,EAAS,CACpB,GAAI,CAAC,KAAK,IAAM,CAAC,KAAK,MACpB,OAGF,KAAK,aAAa,EAClB,IAAM,EAAe,KAAK,MACpB,EAAiB,KAAK,GAgB5B,GAdA,KAAK,GAAK,EAAe,YAAY,EAAE,cACrC,KAAK,aACL,IAAM,CACJ,IAAM,EAAW,KAAK,OAAO,EACvB,EAAc,KAAK,SAAS,MAChC,EACA,EACA,EACA,KAAK,oBAAoB,CAC3B,EAEA,OADA,KAAK,MAAQ,EACN,EAEX,EACI,IAAmB,KAAK,GAC1B,KAAK,wBAAwB,EAAgB,KAAK,EAAE,EAEtD,KAAK,UAAU,EAGV,OAAO,EAAS,CACrB,GAAI,CAAC,KAAK,QACR,OAKF,GAFA,KAAK,cAAc,EAEf,KAAK,OAAS,KAAK,GACrB,KAAK,SAAS,QAAQ,KAAK,MAAO,KAAK,GAAI,KAAK,oBAAoB,CAAC,EAevE,GAZA,KAAK,gBAAgB,MAAM,EAC3B,OAAO,KAAK,KAAK,cAAc,EAAE,QAAQ,CAAC,IAAc,CACtD,KAAK,eAAe,GAAW,MAAM,EACrC,OAAO,KAAK,eAAe,GAC5B,EACD,KAAK,UAAU,MAAM,EACrB,KAAK,gBAAkB,KACvB,KAAK,sBAAwB,KAC7B,KAAK,eAAe,cAAc,EAClC,KAAK,aAAa,QAAQ,EAC1B,EAAK,KAAK,YAAY,EAElB,KAAK,IAAI,WACX,KAAK,GAAG,WAAW,YAAY,KAAK,EAAE,EAGxC,KAAK,GAAK,KACV,KAAK,MAAQ,KACb,KAAK,QAAU,GACf,KAAK,YAAY,EAGZ,QAAQ,CAAC,EAA8B,CAM5C,GALA,KAAK,MAAQ,IACR,KAAK,SACL,CACL,EAEI,KAAK,QAEP,EAAkB,QAAQ,KAAK,YAAY,EAIxC,QAAQ,CAAC,EAA8B,CAC5C,OAAO,OAAO,KAAK,MAAO,CAAK,EAG1B,aAAa,CAAC,EAAwB,CAC3C,KAAK,WAAa,EAClB,KAAK,gBAAgB,QAAQ,CAAC,IAAU,CACtC,EAAM,gBAAgB,CAAO,EAC9B,EAGI,kBAAkB,CAAC,EAAwC,CAChE,KAAK,gBAAkB,EAGlB,kBAAkB,EAA6B,CACpD,OAAO,KAAK,gBAGP,wBAAwB,CAC7B,EACM,CACN,KAAK,sBAAwB,EAGxB,OAAU,CAAC,EAAsB,EAAgB,CACtD,KAAK,UAAU,IAAI,EAAK,CAAK,EAKxB,MAAS,CAAC,EAAsB,EAA6B,CAClE,IAAM,EAAS,KAAK,iBAAiB,CAAG,EACxC,OAAO,EAAO,MAAQ,EAAO,MAAQ,EAGhC,gBAAmB,CAAC,EAA0C,CACnE,GAAI,KAAK,UAAU,IAAI,CAAG,EACxB,MAAO,CAAE,MAAO,GAAM,MAAO,KAAK,UAAU,IAAI,CAAG,CAAmB,EAGxE,GAAI,KAAK,iBAAiB,iBACxB,OAAO,KAAK,gBAAgB,iBAAiB,CAAG,EAGlD,OAAO,KAAK,oBAAoB,CAAG,EAG9B,UAAU,EAAgB,CAC/B,OAAO,KAAK,GAGJ,WAAW,EAAS,EAEpB,SAAS,EAAS,EAElB,YAAY,EAAS,EAErB,SAAS,EAAS,EAElB,aAAa,EAAS,EAEtB,WAAW,EAAS,EAetB,aAAa,CAAC,EAAyB,CAC7C,IAAI,EAAoC,KAAK,mBAAmB,EAChE,MAAO,EAAS,CAEd,IAAM,EAAW,EACjB,GAAI,OAAO,EAAS,kBAAoB,YAEtC,GADgB,EAAS,gBAAgB,EAAO,IAAI,IACpC,GACd,MAAO,GAGX,EAAU,EAAQ,qBAAqB,GAAK,KAE9C,MAAO,GAGC,UAAU,EAAY,CAC9B,OAAO,KAAK,cAGA,OAAM,EAAG,CACrB,OAAO,KAAK,cAAc,KAAK,UAAU,GAAK,KAAK,uBAAuB,EAGlE,IAAI,CAAC,KAAsB,EAAuB,CAC1D,KAAK,eAAe,IAAY,QAAQ,CAAC,IAAa,CACpD,EAAS,GAAG,CAAI,EACjB,EAGI,EAAE,CAAC,EAAmB,EAA8C,CACzE,GAAI,CAAC,KAAK,eAAe,GACvB,KAAK,eAAe,GAAa,IAAI,IAIvC,OAFA,KAAK,eAAe,GAAW,IAAI,CAAQ,EAEpC,IAAM,KAAK,IAAI,EAAW,CAAQ,EAGpC,GAAG,CAAC,EAAmB,EAAwC,CACpE,KAAK,eAAe,IAAY,OAAO,CAAQ,EAGzC,mBAAmB,EAAyB,CAClD,MAAO,CACL,WAAY,KAAK,WACjB,eAAgB,KAAK,eACrB,SAAU,KAAK,SACf,MAAO,KAAK,aAAa,EACzB,cAAe,CAAC,IAAc,CAC5B,KAAK,gBAAgB,IAAI,CAAS,EAClC,EAAU,qBAAqB,IAAI,EACnC,EAAU,gBAAgB,KAAK,UAAU,GAE3C,gBAAiB,CAAC,IAAc,CAC9B,KAAK,gBAAgB,OAAO,CAAS,EACrC,EAAU,qBAAqB,IAAI,EAEvC,EAGM,YAAY,EAA0C,CAC5D,IAAM,EAA+C,CAAE,QAAS,CAAC,CAAE,EAYnE,OAVG,KAAK,MAA+C,UAAY,CAAC,GAE3D,QAAQ,CAAC,IAAU,CAC1B,IAAM,EAAW,KAAK,YAAY,CAAK,EACvC,GAAI,CAAC,EAAM,GACT,EAAM,GAAY,CAAC,EAErB,EAAM,GAAU,KAAK,KAAK,mBAAmB,CAAK,CAAC,EACpD,EAEM,EAGD,WAAW,CAAC,EAA+B,CACjD,GAAI,OAAO,IAAU,SACnB,MAAO,UAGT,MAAO,SAAU,GAAS,OAAO,EAAM,OAAS,SAC5C,EAAM,KACN,UAGE,kBAAkB,CAAC,EAAuC,CAChE,GAAI,OAAO,IAAU,UAAY,EAAE,SAAU,GAC3C,OAAO,EAGT,IAAM,EAAQ,IAAK,CAAM,EAEzB,OADA,OAAO,EAAM,KACN,EAGD,aAAa,CAAC,EAAyB,CAC7C,GAAI,CAAC,GAAS,OAAO,IAAU,UAAY,EAAE,WAAY,GACvD,OAGF,OAAQ,EAA+B,OAGjC,sBAAsB,EAAY,CACxC,IAAM,EAAa,WAAqC,QACxD,OAAO,KAAK,cAAc,CAAS,EAG7B,mBAAsB,CAAC,EAA0C,CACvE,GAAI,CAAC,KAAK,YAAc,OAAO,KAAK,aAAe,SACjD,MAAO,CAAE,MAAO,GAAO,MAAO,MAAU,EAa1C,OATE,KAAK,WAOL,KAEU,mBAAmB,CAAG,GAAK,CAAE,MAAO,GAAO,MAAO,MAAU,EAE5E,CC7ZA,IAAI,EAAwB,KAMrB,SAAS,EAAS,CAAC,EAAiB,CACzC,GAAI,CAAC,GAAK,EAAE,aAAa,GACvB,MAAU,MAAM,yBAAyB,EAE3C,EAAS,EAQJ,SAAS,EAAS,EAAW,CAClC,GAAI,CAAC,EACH,MAAU,MACR,mFACF,EAEF,OAAO,ECpBF,SAAS,CAAa,CAAC,EAAsB,CAClD,GAAI,CAAC,EAAK,WAAW,GAAG,EACtB,MAAO,IAAI,IAEb,OAAO,GAAQ,IAGV,SAAS,CAAU,CACxB,EACA,EACmB,CACnB,IAAM,EAAiB,EAAc,EAAK,MAAM,GAAG,EAAE,EAAE,EAEvD,QAAW,KAAS,EAAQ,CAC1B,GAAI,EAAM,OAAS,IACjB,SAEF,IAAM,EAAS,GAAe,EAAM,KAAM,CAAc,EACxD,GAAI,EACF,MAAO,CAAE,QAAO,QAAO,EAK3B,IAAM,EAAW,EAAO,KAAK,CAAC,IAAU,EAAM,OAAS,GAAG,EAC1D,GAAI,EACF,MAAO,CACL,MAAO,EACP,OAAQ,CAAE,UAAW,CAAe,CACtC,EAGF,IAAM,EAAW,EAAO,KAAK,CAAC,IAAU,EAAM,OAAS,GAAG,EAC1D,OAAO,EAAW,CAAE,MAAO,EAAU,OAAQ,CAAC,CAAE,EAAI,KAGtD,SAAS,EAAc,CACrB,EACA,EAC+B,CAC/B,IAAM,EAAgB,GAAgB,CAAS,EACzC,EAAkB,GAAgB,CAAW,EAEnD,GAAI,EAAc,SAAW,EAAgB,OAC3C,OAAO,KAGT,IAAM,EAAiC,CAAC,EAExC,QAAS,EAAQ,EAAG,EAAQ,EAAc,OAAQ,GAAS,EAAG,CAC5D,IAAM,EAAe,EAAc,GAC7B,EAAiB,EAAgB,GAEvC,GAAI,EAAa,WAAW,GAAG,EAAG,CAChC,IAAM,EAAY,EAAa,MAAM,CAAC,EACtC,GAAI,CAAC,EACH,OAAO,KAET,EAAO,mBAAmB,CAAS,GACjC,mBAAmB,CAAc,EACnC,SAGF,GAAI,IAAiB,EACnB,OAAO,KAIX,OAAO,EAGT,SAAS,EAAe,CAAC,EAAwB,CAC/C,IAAM,EAAiB,EAAc,CAAI,EACzC,GAAI,IAAmB,IACrB,MAAO,CAAC,EAGV,OAAO,EAAe,MAAM,GAAG,EAAE,OAAO,OAAO,EC/E1C,SAAS,EAAgB,CAC9B,EACA,EACA,EACQ,CACR,IAAM,EAAiB,EAAc,CAAI,EACnC,EAAW,IAAS,IAAM,EAAiB,EAAO,EACxD,OAAO,IAAS,OAAS,IAAI,IAAa,EAGrC,SAAS,EAAkB,CAChC,EACA,EACe,CACf,IAAI,EACA,EACA,EAEJ,GAAI,IAAS,UACX,EAAW,OAAO,SAAS,SAAW,OAAO,SAAS,OACtD,EAAO,OAAO,SAAS,SACvB,EAAc,OAAO,SAAS,OACzB,KAEL,EADa,OAAO,SAAS,MACV,KACnB,EAAO,EAAS,WAAW,GAAG,EAAI,EAAS,MAAM,CAAC,EAAI,EACtD,IAAM,EAAa,EAAK,QAAQ,GAAG,EACnC,EAAc,GAAc,EAAI,EAAK,MAAM,EAAa,CAAC,EAAI,GAC7D,EAAO,GAAc,EAAI,EAAK,MAAM,EAAG,CAAU,EAAI,EAGvD,GAAI,EAAK,WAAW,CAAI,GAAK,IAAS,KAAO,IAAS,IACpD,EAAO,EAAK,MAAM,EAAK,MAAM,EAK/B,OAFA,EAAO,EAAc,CAAI,EAElB,CACL,OACA,WACA,MAAO,GAAW,CAAW,EAC7B,OAAQ,CAAC,CACX,EAGK,SAAS,CAAe,CAC7B,EACA,EACA,EACA,EACM,CACN,IAAM,EAAiB,EAAc,CAAI,EACnC,EAAW,IAAS,IAAM,EAAiB,EAAO,EAExD,GAAI,IAAS,UAAW,CACtB,GAAI,EACF,OAAO,QAAQ,aAAa,CAAC,EAAG,GAAI,CAAQ,EAE5C,YAAO,QAAQ,UAAU,CAAC,EAAG,GAAI,CAAQ,EAE3C,OAGF,GAAI,EAAS,CACX,IAAM,EAAO,OAAO,SAAS,KAAK,MAAM,GAAG,EAAE,GAC7C,OAAO,SAAS,QAAQ,GAAG,KAAQ,GAAU,EAC7C,OAGF,OAAO,SAAS,KAAO,EAGzB,SAAS,EAAU,CAAC,EAA6C,CAC/D,IAAM,EAAgC,CAAC,EACjC,EAAkB,EAAY,WAAW,GAAG,EAC9C,EAAY,MAAM,CAAC,EACnB,EAEJ,GAAI,CAAC,EACH,OAAO,EAUT,OAPA,EAAgB,MAAM,GAAG,EAAE,QAAQ,CAAC,IAAU,CAC5C,IAAO,EAAK,GAAS,EAAM,MAAM,GAAG,EACpC,GAAI,EACF,EAAM,mBAAmB,CAAG,GAAK,EAAQ,mBAAmB,CAAK,EAAI,GAExE,EAEM,EC7CT,SAAS,EAAkB,CAAC,EAA0C,CACpE,IAAM,EAAa,EAAS,QAAQ,GAAG,EACvC,GAAI,EAAa,EACf,MAAO,CAAC,EAGV,IAAM,EAAc,EAAS,MAAM,EAAa,CAAC,EAC3C,EAAgC,CAAC,EACvC,GAAI,CAAC,EACH,OAAO,EAUT,OAPA,EAAY,MAAM,GAAG,EAAE,QAAQ,CAAC,IAAU,CACxC,IAAO,EAAK,GAAS,EAAM,MAAM,GAAG,EACpC,GAAI,EACF,EAAM,mBAAmB,CAAG,GAAK,EAAQ,mBAAmB,CAAK,EAAI,GAExE,EAEM,EAYF,MAAM,CAAO,CACR,aAAmC,KACnC,gBAAwC,KACjC,OAAwB,CAAC,EAClC,IAAqB,KACZ,KACA,KACA,qBAA8C,CAAC,EAC/C,aAAkC,CAAC,EACnC,WAAoC,CAAC,EAC9C,qBAER,WAAW,CAAC,EAAwC,CAClD,IAAM,EAAkB,MAAM,QAAQ,CAAO,EACzC,CAAE,OAAQ,CAAQ,EAClB,EAEJ,KAAK,OAAS,EAAgB,QAAU,CAAC,EACzC,KAAK,KAAO,EAAgB,MAAQ,UACpC,KAAK,KAAO,EAAgB,MAAQ,IACpC,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,oBAAoB,EAGpB,OAAO,CAAC,EAAmB,CAChC,KAAK,IAAM,EACX,EAAI,OAAS,KACb,GAAU,IAAI,EAEd,IAAM,EAAU,EAAI,WAAW,EAC/B,EAAQ,OAAS,KAEjB,KAAK,oBAAoB,EAGpB,IAAI,CAAC,EAAoB,CAC9B,KAAK,SAAS,EAAM,EAAK,EAGpB,OAAO,CAAC,EAAoB,CACjC,KAAK,SAAS,EAAM,EAAI,EAGnB,OAAO,EAAS,CACrB,OAAO,QAAQ,QAAQ,EAGlB,IAAI,EAAS,CAClB,OAAO,QAAQ,KAAK,EAGf,EAAE,CAAC,EAAqB,CAC7B,OAAO,QAAQ,GAAG,CAAK,EAGlB,eAAe,EAAyB,CAC7C,GAAI,CAAC,KAAK,gBACR,KAAK,oBAAoB,EAE3B,OAAO,KAAK,gBAGP,qBAAqB,EAAuB,CACjD,GAAI,CAAC,KAAK,aACR,KAAK,oBAAoB,EAE3B,OAAO,KAAK,aAGP,aAAa,CAAC,EAA2C,CAG9D,OAFA,KAAK,qBAAqB,KAAK,CAAQ,EAEhC,IAAM,CACX,IAAM,EAAQ,KAAK,qBAAqB,QAAQ,CAAQ,EACxD,GAAI,EAAQ,GACV,KAAK,qBAAqB,OAAO,EAAO,CAAC,GAQxC,UAAU,CAAC,EAAoC,CAGpD,OAFA,KAAK,aAAa,KAAK,CAAK,EAErB,IAAM,CACX,IAAM,EAAQ,KAAK,aAAa,QAAQ,CAAK,EAC7C,GAAI,EAAQ,GACV,KAAK,aAAa,OAAO,EAAO,CAAC,GAQhC,SAAS,CAAC,EAAuC,CAGtD,OAFA,KAAK,WAAW,KAAK,CAAI,EAElB,IAAM,CACX,IAAM,EAAQ,KAAK,WAAW,QAAQ,CAAI,EAC1C,GAAI,EAAQ,GACV,KAAK,WAAW,OAAO,EAAO,CAAC,GAK9B,SAAS,EAAkB,CAChC,MAAO,CAAC,GAAG,KAAK,MAAM,EAGjB,QAAQ,CAAC,EAA0B,CACxC,GAAI,KAAK,OAAO,KAAK,CAAC,IAAS,EAAK,OAAS,EAAM,IAAI,EACrD,MAAU,MAAM,yBAAyB,EAAM,MAAM,EAMvD,GAHA,KAAK,OAAO,KAAK,CAAK,EAEL,KAAK,mBAAmB,EAC5B,OAAS,EAAM,KAC1B,KAAK,kBAAkB,EAIpB,UAAU,CAAC,EAAsB,CACtC,OAAO,GAAiB,EAAM,KAAK,KAAM,KAAK,IAAI,EAG7C,OAAO,EAAS,CAGrB,GAFA,KAAK,uBAAuB,EAC5B,KAAK,qBAAuB,OACxB,KAAK,KAAK,SAAW,KACvB,KAAK,IAAI,OAAS,OAEpB,KAAK,IAAM,KAGL,QAAQ,CAAC,EAAc,EAAwB,CACrD,GAAI,CAAC,GAAQ,OAAO,IAAS,SAC3B,MAAU,MAAM,iCAAiC,EAGnD,IAAM,EAAO,KAAK,gBACZ,EAAS,KAAK,cAAc,CAAI,EACtC,GAAI,CAAC,EACH,OAGF,IAAM,EAAK,EAAO,SAGlB,QAAW,KAAS,KAAK,aAAc,CACrC,IAAM,EAAS,EAAM,EAAI,CAAI,EAC7B,GAAI,IAAW,GACb,OAEF,GAAI,OAAO,IAAW,UAAY,IAAW,EAAM,CACjD,KAAK,SAAS,EAAQ,CAAO,EAC7B,QAKJ,GAAI,GAAQ,KAAK,eAAe,EAAM,CAAE,EACtC,OAGF,EAAgB,EAAO,KAAM,EAAS,KAAK,KAAM,KAAK,IAAI,EAC1D,KAAK,aAAe,EAAO,MAC3B,KAAK,gBAAkB,EACvB,KAAK,4BAA4B,EAAI,CAAI,EACzC,KAAK,WAAW,QAAQ,CAAC,IAAS,CAChC,GAAI,CACF,EAAK,EAAI,CAAI,EACb,MAAO,EAAO,CACd,QAAQ,MAAM,yBAA0B,CAAK,GAEhD,EAMK,aAAa,CACnB,EACsE,CACtE,IAAM,EAAQ,EAAW,KAAK,OAAQ,EAAK,MAAM,GAAG,EAAE,EAAE,EACxD,GAAI,CAAC,EACH,OAAO,KAGT,IAAM,EAAa,KAAK,cAAc,CAAK,EACrC,EAAY,GAAY,MAAQ,EAChC,EAAQ,GAAY,OAAS,EAAM,MAEzC,MAAO,CACL,KAAM,EACN,QACA,SAAU,CACR,KAAM,EAAU,MAAM,GAAG,EAAE,GAC3B,MAAO,GAAmB,CAAS,EACnC,OAAQ,GAAY,QAAU,EAAM,OACpC,SAAU,EACV,KAAM,GAAO,KACb,KAAM,GAAO,IACf,CACF,EAMM,aAAa,CAAC,EAA0C,CAC9D,IAAM,EAAU,IAAI,IAChB,EAAU,EACV,EAAY,GAEhB,MAAO,EAAQ,MAAM,SAAU,CAC7B,GAAI,EAAQ,IAAI,EAAQ,MAAM,IAAI,EAChC,MAAU,MACR,qCAAqC,EAAQ,MAAM,MACrD,EAEF,EAAQ,IAAI,EAAQ,MAAM,IAAI,EAC9B,EAAY,EAAQ,MAAM,SAC1B,IAAM,EAAO,EAAW,KAAK,OAAQ,EAAU,MAAM,GAAG,EAAE,EAAE,EAC5D,GAAI,CAAC,EACH,OAAO,KAET,EAAU,EAGZ,OAAO,EACH,CAAE,MAAO,EAAQ,MAAO,OAAQ,EAAQ,OAAQ,KAAM,CAAU,EAChE,KAGE,cAAc,EAAS,CAC7B,GAAI,CAAC,MAAM,QAAQ,KAAK,MAAM,EAC5B,MAAU,MAAM,gCAAgC,EAGlD,IAAM,EAAQ,IAAI,IAClB,KAAK,OAAO,QAAQ,CAAC,IAAU,CAC7B,GAAI,CAAC,EAAM,WAAa,CAAC,EAAM,SAC7B,MAAU,MACR,SAAS,EAAM,0CACjB,EAEF,GAAI,EAAM,IAAI,EAAM,IAAI,EACtB,MAAU,MAAM,yBAAyB,EAAM,MAAM,EAEvD,EAAM,IAAI,EAAM,IAAI,EACrB,EAGK,UAAU,EAAS,CACzB,GAAI,OAAO,OAAW,IACpB,OAGF,IAAM,EAAY,KAAK,OAAS,UAAY,WAAa,aACnD,EAAW,IAAY,CAC3B,KAAK,kBAAkB,GAGzB,OAAO,iBAAiB,EAAW,CAAQ,EAC3C,KAAK,qBAAuB,IAAM,CAChC,OAAO,oBAAoB,EAAW,CAAQ,GAI1C,iBAAiB,EAAS,CAChC,IAAM,EAAe,KAAK,gBACpB,EAAe,KAAK,oBAAoB,EAE9C,GAAI,CAAC,KAAK,eAAe,EAAc,CAAY,EACjD,KAAK,4BAA4B,EAAc,CAAY,EAIvD,mBAAmB,EAAkB,CAC3C,IAAM,EAAW,KAAK,mBAAmB,EACnC,EAAQ,EAAW,KAAK,OAAQ,EAAS,IAAI,EAC7C,EAAa,EAAQ,KAAK,cAAc,CAAK,EAAI,KACjD,EAAQ,GAAY,OAAS,GAAO,OAAS,KAGnD,GAAI,GAAc,EAAW,OAAS,EAAS,KAC7C,EAAgB,EAAW,KAAM,GAAM,KAAK,KAAM,KAAK,IAAI,EAW7D,OARA,KAAK,aAAe,EACpB,KAAK,gBAAkB,IAClB,EACH,OAAQ,GAAY,QAAU,GAAO,QAAU,CAAC,EAChD,KAAM,GAAO,KACb,KAAM,GAAO,IACf,EAEO,KAAK,gBAGN,kBAAkB,EAAkB,CAC1C,OAAO,GAAmB,KAAK,KAAM,KAAK,IAAI,EAGxC,cAAc,CACpB,EACA,EACS,CACT,OAAO,GAAM,WAAa,GAAI,UAAY,GAAM,OAAS,GAAI,KAGvD,2BAA2B,CACjC,EACA,EACM,CACN,KAAK,qBAAqB,QAAQ,CAAC,IAAa,CAC9C,GAAI,CACF,EAAS,EAAI,CAAI,EACjB,MAAO,EAAO,CACd,QAAQ,MAAM,+BAAgC,CAAK,GAEtD,EAEL,CAcO,MAAM,WAAmB,CAA4C,CAClE,YAEE,SAAS,EAAoB,CAErC,MAAO,CACL,YAFa,KAAK,QAEG,gBAAgB,GAAG,MAAQ,OAAO,SAAS,QAClE,EAGQ,UAAU,EAAS,EAEnB,SAAS,EAAS,CAC1B,IAAM,EAAS,KAAK,OACpB,KAAK,YAAc,GAAQ,cAAc,CAAC,IAAO,CAC/C,KAAK,MAAM,YAAc,EAAG,KAC7B,EAGO,WAAW,EAAS,CAC5B,KAAK,cAAc,EAGX,MAAM,EAAU,CACxB,IAAM,EAAS,KAAK,OACd,EAAc,KAAK,MAAM,aAAe,SACxC,EAAW,KAAK,MAAM,cAAgB,KAAK,MAAM,GACjD,EAAY,CAAC,KAAK,MAAM,UAAW,EAAW,EAAc,MAAS,EACxE,OAAO,OAAO,EACd,KAAK,GAAG,EAEX,MAAO,CACL,IAAK,IACL,MAAO,CACL,KAAM,GAAQ,WAAW,KAAK,MAAM,EAAE,GAAK,KAAK,MAAM,GACtD,WACF,EACA,UAAW,CACT,MAAO,CAAC,IAAiB,CAEvB,GADA,EAAM,eAAe,EACjB,KAAK,MAAM,QACb,GAAQ,QAAQ,KAAK,MAAM,EAAE,EAE7B,QAAQ,KAAK,KAAK,MAAM,EAAE,EAGhC,EACA,SACE,KAAK,MAAM,UAAY,KAAK,MAAM,SAAS,OAAS,EAChD,KAAK,MAAM,SACX,CAAC,KAAK,MAAM,EAAE,CACtB,EAEJ,CAOO,MAAM,WAAmB,CAAmC,CACzD,YAEE,SAAS,EAAoB,CACrC,IAAM,EAAS,KAAK,OACpB,MAAO,CACL,MAAO,GAAQ,gBAAgB,GAAK,KACpC,OAAQ,GAAQ,sBAAsB,GAAK,IAC7C,EAGQ,UAAU,EAAS,EAEnB,SAAS,EAAS,CAC1B,IAAM,EAAS,KAAK,OACpB,KAAK,YAAc,GAAQ,cAAc,CAAC,IAAO,CAC/C,KAAK,MAAM,MAAQ,EACnB,KAAK,MAAM,OAAS,EAAO,sBAAsB,EAClD,EAGO,WAAW,EAAS,CAC5B,KAAK,cAAc,EAGX,MAAM,EAAU,CACxB,IAAM,EACJ,KAAK,MAAM,QACV,KAAK,QAA+B,sBAAsB,EAE7D,MAAO,CACL,IAAK,MACL,MAAO,CAAE,mBAAoB,EAAG,EAChC,SAAU,GAAa,UACnB,CAAC,CAAE,UAAW,EAAY,SAAU,CAAC,EACrC,CAAC,CACP,EAEJ,CAEO,SAAS,EAAY,CAAC,EAAgD,CAC3E,OAAO,IAAI,EAAO,CAAO,EC1d3B,IAAM,GAAiB,IAAI,IAAI,CAAC,OAAQ,OAAQ,MAAM,CAAC,EAEhD,SAAS,EAAkB,CAAC,EAAsC,CACvE,IAAM,EAAO,EAAQ,MAAQ,KACvB,EAAU,EAAQ,SAAW,QAC7B,EAAW,EAAQ,UAAY,sCAC/B,EAAiB,EAAiB,CACtC,UACI,EAAQ,gBAAkB,CAAC,CACjC,CAAC,EACK,EAAiB,EAAiB,EAAQ,cAAc,EACxD,EAAW,GAAmB,EAAQ,IAAI,EAEhD,MAAO,CACL,kBACA,QAAQ,KACR,SACA,oBAAoB,EAAW,CAAO,MACtC,oCAAoC,EAAW,CAAQ,MACvD,YAAY,EAAW,EAAQ,KAAK,YACpC,EAAQ,YACJ,uCAAuC,EACrC,EAAQ,WACV,MACA,GACJ,IAAI,EAAQ,MAAQ,CAAC,GAAG,IAAI,CAAC,IAAY,KAAK,GAAkB,CAAO,GAAG,EAC1E,EAAQ,QAAU,EAAQ,OAAO,OAAS,EACtC,YAAY,EAAiB,EAAQ,MAAM,YAC3C,GACJ,UACA,QAAQ,KACR,EACA,IAAI,EAAQ,SAAW,CAAC,GAAG,IAAI,CAAC,IAAW,KAAK,GAAa,CAAM,GAAG,EACtE,UACA,SACF,EACG,OAAO,CAAC,IAAS,IAAS,EAAE,EAC5B,KAAK;AAAA,CAAI,EAGd,SAAS,EAAkB,CAAC,EAAgC,CAC1D,GAAI,OAAO,SAAa,IACtB,MAAU,MAAM,iDAAiD,EAGnE,IAAM,EAAY,SAAS,cAAc,KAAK,EACxC,EAAW,IAAI,EACf,EAAoB,IAAI,IACxB,EAAc,MAAM,QAAQ,CAAI,EAAI,EAAO,CAAC,CAAI,EAChD,EAAU,CACd,eAAgB,IAAI,EAAe,CAAC,CAAC,EACrC,WACA,MAAO,CAAE,QAAS,CAAC,CAAE,EACrB,cAAe,CAAC,IAAiC,CAC/C,EAAkB,IAAI,CAAS,GAEjC,gBAAiB,CAAC,IAAiC,CACjD,EAAkB,OAAO,CAAS,EAEtC,EAEA,EAAY,QAAQ,CAAC,IAAe,CAClC,EAAU,YAAY,EAAS,MAAM,EAAY,CAAO,CAAC,EAC1D,EAED,IAAM,EAAO,EAAU,UAKvB,OAJA,EAAkB,QAAQ,CAAC,IAAc,CACvC,EAAU,QAAQ,EACnB,EAEM,EAGT,SAAS,EAAiB,CAAC,EAAkC,CAC3D,IAAM,EAAa,EAAiB,EAAQ,UAAU,EACtD,GAAI,GAAe,IAAI,EAAQ,GAAG,GAAK,CAAC,EAAQ,KAC9C,MAAO,IAAI,EAAQ,MAAM,KAG3B,MAAO,IAAI,EAAQ,MAAM,KAAc,EACrC,EAAQ,MAAQ,EAClB,MAAM,EAAQ,OAGhB,SAAS,EAAY,CAAC,EAA4B,CAShD,MAAO,UARY,EAAiB,CAClC,KAAM,EAAO,KACb,IAAK,EAAO,IACZ,MAAO,EAAO,MACd,MAAO,EAAO,SACV,EAAO,YAAc,CAAC,CAC5B,CAAC,cAKH,SAAS,CAAgB,CAAC,EAA6B,CAAC,EAAW,CACjE,IAAM,EAAW,OAAO,QAAQ,CAAU,EACvC,QAAQ,EAAE,EAAM,KAAW,CAC1B,GAAI,IAAU,IAAS,IAAU,MAAQ,IAAU,OACjD,MAAO,CAAC,EAGV,OAAO,IAAU,GACb,CAAC,CAAI,EACL,CAAC,GAAG,MAAS,EAAW,OAAO,CAAK,CAAC,IAAI,EAC9C,EACA,KAAK,GAAG,EAEX,OAAO,EAAW,IAAI,IAAa,GAGrC,SAAS,CAAU,CAAC,EAAuB,CACzC,OAAO,EACJ,QAAQ,KAAM,OAAO,EACrB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,QAAQ,ECpJ3B,IAAM,GAAuB,OA6CtB,MAAM,EAIX,CAWoB,QAVZ,UAAgC,KAChC,aAAiC,KACjC,QAAmB,GACnB,eAAwC,KAC/B,WACA,UAAY,IAAI,IACzB,QAAsD,CAAC,EACvD,kBACD,OAEP,WAAW,CAAS,EAAmD,CAAC,EAAG,CAAvD,eAClB,KAAK,WAAa,CAChB,IAAK,KACL,QAAS,QACT,OAAQ,EAAQ,QAAW,CAAC,CAC9B,EAGM,WAAW,CAAC,EAAoB,CACtC,QAAQ,MAAM,QAAS,CAAK,EAE5B,KAAK,cAAc,CAAK,EAOlB,aAAa,CAAC,EAAoB,CACxC,GAAI,CAAC,KAAK,UACR,OAGF,KAAK,UAAU,UAAY;AAAA;AAAA;AAAA,aAGlB,EAAM;AAAA,kGAC+E,EAAM;AAAA;AAAA,MAQ/F,GAAG,CAAC,KAAmB,EAAuB,CACnD,GAAI,OAAO,EAAO,UAAY,WAC5B,MAAU,MAAM,mBAAmB,EAIrC,OAFA,EAAO,QAAQ,KAA2B,GAAG,CAAI,EACjD,KAAK,QAAQ,KAAK,CAAE,SAAQ,MAAK,CAAC,EAC3B,KAMF,KAAK,EAAS,CACnB,GAAI,KAAK,QAAS,CAChB,QAAQ,KAAK,YAAY,EACzB,OAGF,IAAM,EAAiB,KAAK,sBAAsB,EAClD,GAAI,CAAC,EACH,OAGF,GAAI,CAOF,GANA,KAAK,UAAY,EAGhB,WAAqC,QAAU,KAG5C,KAAK,QAAQ,KAAM,CAIrB,GAHA,KAAK,aAAe,IAAI,KAAK,QAAQ,KAAK,KAAK,QAAQ,SAAS,EAG5D,kBAAmB,KAAK,aAC1B,KAAK,aAAa,cAAc,KAAK,UAAU,EAIjD,GAAI,KAAK,QAAQ,OAAS,aAAc,KAAK,aAC3C,KAAK,aAAa,SAAS,KAAK,QAAQ,KAAK,EAG/C,KAAK,aAAa,MAAM,KAAK,SAAS,EAGtC,KAAK,eAAiB,IAAI,EAAe,KAAK,QAAQ,OAAS,CAAC,CAAC,EAGnE,KAAK,QAAU,GAGf,KAAK,UAAU,EACf,MAAO,EAAO,CACd,KAAK,YAAY,CAAc,GAO5B,OAAO,EAAS,CACrB,GAAI,CAAC,KAAK,QAAS,CACjB,QAAQ,KAAK,WAAW,EACxB,OAGF,GAAI,CAIF,GAFA,KAAK,gBAAgB,EAEjB,KAAK,aAAc,CAErB,GAAI,YAAa,KAAK,aACpB,KAAK,aAAa,QAAQ,EAG5B,KAAK,aAAe,KACpB,KAAK,QAAU,GACf,OAAQ,WAAqC,QAI/C,GAAI,KAAK,eACP,KAAK,eAAe,cAAc,EAClC,KAAK,eAAiB,KAIxB,GAAI,KAAK,UACP,KAAK,UAAU,UAAY,GAI7B,GAAI,KAAK,kBACP,KAAK,kBAAkB,EAEzB,MAAO,EAAO,CACd,QAAQ,MAAM,yBAA0B,CAAK,GAO1C,SAAS,EAAY,CAC1B,OAAO,KAAK,QAMP,mBAAmB,CACxB,EACM,CACN,GAAI,KAAK,QACP,KAAK,QAAQ,EAEf,KAAK,QAAQ,KAAO,EACpB,KAAK,MAAM,EAMN,MAAM,CAAC,EAA+B,CAC3C,GAAI,CAAC,KAAK,QAER,OADA,QAAQ,KAAK,6BAA6B,EACnC,KAGT,GAAI,CAEF,GAAI,GAAS,KAAK,QAAQ,MAAO,CAI/B,GAHA,KAAK,QAAQ,MAAQ,IAAK,KAAK,QAAQ,SAAU,CAAM,EAGnD,KAAK,cAAgB,aAAc,KAAK,aAC1C,KAAK,aAAa,SAAS,CAAK,EAIlC,GAAI,KAAK,eAEP,KAAK,eAAe,MAAQ,KAAK,QAAQ,MAK7C,KAAK,UAAU,EACf,MAAO,EAAO,CACd,QAAQ,MAAM,wBAAyB,CAAK,EAG9C,OAAO,KAMF,UAAU,EAAwB,CACvC,OAAO,KAAK,WAGP,OAAU,CAAC,EAAsB,EAAgB,CAEtD,OADA,KAAK,UAAU,IAAI,EAAK,CAAK,EACtB,KAKF,MAAS,CAAC,EAAsB,EAA6B,CAClE,IAAM,EAAS,KAAK,iBAAiB,CAAG,EACxC,OAAO,EAAO,MAAQ,EAAO,MAAQ,EAGhC,gBAAmB,CAAC,EAA0C,CACnE,GAAI,CAAC,KAAK,UAAU,IAAI,CAAG,EACzB,MAAO,CAAE,MAAO,GAAO,MAAO,MAAU,EAG1C,MAAO,CAAE,MAAO,GAAM,MAAO,KAAK,UAAU,IAAI,CAAG,CAAmB,EAMjE,QAAQ,EAAuB,CACpC,OAAO,KAAK,QAAQ,MAMf,QAAQ,CAAC,EAAwB,CAEtC,GADA,KAAK,QAAQ,MAAQ,EACjB,KAAK,QACP,KAAK,OAAO,EAEd,OAAO,KAMF,WAAW,CAAC,EAA4B,CAE7C,OADA,KAAK,kBAAoB,EAClB,KAMF,kBAAkB,CAAC,EAAoC,CAAC,EAAW,CACxE,IAAM,EAAc,KAAK,QAAQ,UAAY,CAAC,EACxC,EAAU,KAAK,qBACnB,EAAY,QACZ,EAAQ,OACV,EAEA,OAAO,GAAoB,IACtB,KACA,EACH,MAAO,EAAQ,OAAS,EAAY,OAAS,eAC7C,KAAM,EAAQ,MAAQ,EAAY,MAAQ,KAAK,wBAAwB,EACvE,SACF,CAAC,EAMK,kBAAkB,CAAC,EAA6C,CACtE,GAAI,CAAC,EACH,OAAO,KAGT,GAAI,OAAO,IAAa,SAAU,CAChC,GAAI,OAAO,SAAa,IACtB,OAAO,KAGT,OAAO,SAAS,cAAc,CAAQ,EAGxC,OAAO,OAAO,QAAY,KAAe,aAAoB,QACzD,EACA,KAGE,qBAAqB,EAAuB,CAClD,GAAI,OAAO,SAAa,IACtB,OAAO,KAGT,IAAM,EAAc,KAAK,mBACvB,KAAK,QAAQ,aAAe,EAC9B,EACA,OAAO,aAAuB,YAAc,EAAc,KAGpD,uBAAuB,EAAqB,CAClD,IAAM,EAAc,KAAK,QAAQ,aAAe,GAEhD,GAAI,OAAO,IAAgB,SACzB,OAAO,KAAK,+BAA+B,CAAW,EAGxD,GAAI,OAAO,QAAY,KAAe,aAAuB,QAAS,CACpE,IAAM,EAAgC,CAAC,EACvC,GAAI,EAAY,GACd,EAAM,GAAK,EAAY,GAEzB,GAAI,EAAY,UACd,EAAM,UAAY,EAAY,UAGhC,MAAO,CAAE,IAAK,EAAY,QAAQ,YAAY,EAAG,OAAM,EAGzD,OAAO,EAAI,CAAE,MAAO,CAAE,GAAI,KAAM,CAAE,CAAC,EAG7B,8BAA8B,CAAC,EAAoC,CACzE,GAAI,EAAS,WAAW,GAAG,GAAK,EAAS,OAAS,EAChD,OAAO,EAAI,CAAE,MAAO,CAAE,GAAI,EAAS,MAAM,CAAC,CAAE,CAAE,CAAC,EAGjD,GAAI,EAAS,WAAW,GAAG,GAAK,EAAS,OAAS,EAChD,OAAO,EAAI,CAAE,MAAO,CAAE,UAAW,EAAS,MAAM,CAAC,CAAE,CAAE,CAAC,EAGxD,OAAO,EAAI,CAAE,MAAO,CAAE,qBAAsB,CAAS,CAAE,CAAC,EAGlD,oBAAoB,CAC1B,EACA,EAC0B,CAC1B,GAAI,CAAC,GAAe,CAAC,EACnB,OAGF,MAAO,CAAC,GAAI,GAAe,CAAC,EAAI,GAAI,GAAgB,CAAC,CAAE,EAIjD,SAAS,EAAS,CAExB,KAAK,QAAQ,QAAQ,EAAG,OAAQ,KAAgB,CAC9C,GAAI,GAAa,OAAO,EAAU,YAAc,WAC9C,EAAU,UAAU,IAAyB,EAEhD,EAGK,SAAS,EAAS,CAExB,KAAK,QAAQ,QAAQ,EAAG,OAAQ,KAAgB,CAC9C,GAAI,GAAa,OAAO,EAAU,YAAc,WAC9C,EAAU,UAAU,IAAyB,EAEhD,EAGK,eAAe,EAAS,CAE9B,KAAK,QAAQ,QAAQ,EAAG,OAAQ,KAAgB,CAC9C,GAAI,GAAa,OAAO,EAAU,kBAAoB,WACpD,EAAU,gBAAgB,IAAyB,EAEtD,EAEL",
|
|
23
|
-
"debugId": "
|
|
22
|
+
"mappings": "kDAkBO,IAAM,EAAc,OAAO,aAAa,EAClC,EAAc,OAAO,aAAa,EAClC,EAAS,OAAO,QAAQ,EAMxB,EAAyB,CACpC,OACA,MACA,QACA,UACA,SACA,OACA,SACF,EAEO,SAAS,CAAe,CAC7B,EACA,EACS,CACT,OAAO,QAAQ,QAAQ,IAAI,EAAO,CAAI,CAAC,EAGlC,SAAS,CAAQ,CAAC,EAAiC,CACxD,OAAO,IAAU,MAAQ,OAAO,IAAU,SChCrC,MAAM,CAAkB,CACZ,QAAU,IAAI,IACvB,SAAW,GACX,aAAqC,KACrC,aAAoC,KAKrC,OAAO,CAAC,EAA8B,CAC3C,GAAI,KAAK,QAAQ,IAAI,CAAM,EACzB,OAGF,GADA,KAAK,QAAQ,IAAI,CAAM,EACnB,CAAC,KAAK,SACR,eAAe,IAAM,KAAK,MAAM,CAAC,EAS9B,KAAK,EAAS,CACnB,GAAI,KAAK,SACP,OAEF,KAAK,SAAW,GAChB,GAAI,CACF,MAAO,KAAK,QAAQ,KAAO,EAAG,CAC5B,IAAM,EAAQ,MAAM,KAAK,KAAK,OAAO,EACrC,KAAK,QAAQ,MAAM,EACnB,QAAW,KAAU,EACnB,GAAI,EAAO,OACT,EAAO,UAIb,CACA,KAAK,SAAW,GAChB,IAAM,EAAU,KAAK,aACrB,KAAK,aAAe,KACpB,KAAK,aAAe,KACpB,IAAU,GAQP,QAAQ,EAAkB,CAC/B,GAAI,CAAC,KAAK,UAAY,KAAK,QAAQ,OAAS,EAC1C,OAAO,QAAQ,QAAQ,EAEzB,GAAI,KAAK,aACP,OAAO,KAAK,aAKd,OAHA,KAAK,aAAe,IAAI,QAAc,CAAC,IAAY,CACjD,KAAK,aAAe,EACrB,EACM,KAAK,aAEhB,CCvDA,IAAI,GAAW,EAGF,EAAoB,IAAI,EAM9B,SAAS,EAAQ,EAAkB,CACxC,OAAO,EAAkB,SAAS,EAO7B,SAAS,EAAS,EAAS,CAChC,EAAkB,MAAM,EAInB,MAAM,CAAe,OACX,UACP,aAAsC,KAC7B,YAAgC,CAAC,EAC1C,UAAY,IAAI,QAIhB,YAAc,IAAI,QAClB,YAAc,IAAI,QAElB,SAAW,IAAI,QAEf,WAAW,EAAG,QAER,YAAW,EAAmB,CAC1C,GAAI,CAAC,EAAe,SAClB,EAAe,SAAW,IAAI,EAEhC,OAAO,EAAe,SAGjB,QAA0B,CAAC,EAAc,CAE9C,GAAI,CAAC,EAAS,CAAM,EAElB,OADA,QAAQ,KAAK,oCAAoC,EAC1C,EAIT,GAAI,GAAW,CAAM,EACnB,OAAO,EAIT,GAAI,KAAK,YAAY,IAAI,CAAM,EAC7B,OAAO,KAAK,YAAY,IAAI,CAAM,EAIpC,GAAI,MAAM,QAAQ,CAAM,EACtB,OAAO,KAAK,oBAAoB,CAAM,EAIxC,IAAM,EAAQ,IAAI,MAAM,EAAQ,CAC9B,IAAK,CAAC,EAAQ,IAAyB,CAErC,GAAI,IAAQ,EACV,MAAO,GAET,GAAI,IAAQ,EACV,MAAO,GAIT,KAAK,MAAM,EAAQ,CAAG,EAEtB,IAAM,EAAQ,QAAQ,IAAI,EAAQ,CAAG,EAGrC,GAAI,EAAS,CAAK,GAAK,CAAC,EAAgB,EAAO,CAAW,EACxD,OAAO,KAAK,SAAS,CAAK,EAE5B,OAAO,GAET,IAAK,CAAC,EAAQ,EAAsB,IAAU,CAE5C,GAAI,EAAgB,EAAQ,CAAW,EAErC,OADA,QAAQ,KAAK,uBAAuB,OAAO,CAAG,sBAAsB,EAC7D,GAGT,IAAM,EAAW,QAAQ,IAAI,EAAQ,CAAG,EAGxC,GACE,EAAS,CAAK,GACd,CAAC,EAAgB,EAAO,CAAW,GACnC,CAAC,EAAgB,EAAO,CAAW,EAEnC,EAAQ,KAAK,SAAS,CAAK,EAG7B,IAAM,EAAS,QAAQ,IAAI,EAAQ,EAAK,CAAK,EAG7C,GAAI,IAAa,EACf,KAAK,QAAQ,EAAQ,CAAG,EAE1B,OAAO,GAET,eAAgB,CAAC,EAAQ,IAAyB,CAEhD,GAAI,EAAgB,EAAQ,CAAW,EAIrC,OAHA,QAAQ,KACN,0BAA0B,OAAO,CAAG,sBACtC,EACO,GAGT,IAAM,EAAS,KAAO,EAChB,EAAS,QAAQ,eAAe,EAAQ,CAAG,EAEjD,GAAI,EACF,KAAK,QAAQ,EAAQ,CAAG,EAE1B,OAAO,EAEX,CAAC,EAKD,OAFA,KAAK,YAAY,IAAI,EAAQ,CAAK,EAClC,KAAK,SAAS,IAAI,EAAO,CAAM,EACxB,EAQD,UAAU,CAAC,EAAyB,CAC1C,GAAI,EAAS,CAAK,GAAK,KAAK,SAAS,IAAI,CAAK,EAC5C,OAAO,KAAK,SAAS,IAAI,CAAK,EAEhC,OAAO,EAMD,mBAAwC,CAAC,EAAc,CAE7D,GAAI,KAAK,YAAY,IAAI,CAAM,EAC7B,OAAO,KAAK,YAAY,IAAI,CAAM,EAGpC,IAAM,EAAQ,IAAI,MAAM,EAAQ,CAC9B,IAAK,CAAC,EAAQ,IAAyB,CAErC,GAAI,IAAQ,EACV,MAAO,GAET,GAAI,IAAQ,EACV,MAAO,GAIT,KAAK,MAAM,EAAQ,CAAG,EAEtB,IAAM,EAAQ,QAAQ,IAAI,EAAQ,CAAG,EAIrC,GACE,OAAO,IAAQ,WACd,IAAQ,YAAc,IAAQ,WAAa,IAAQ,eACpD,CAEA,KAAK,MAAM,EAAQ,QAAQ,EAC3B,QAAS,EAAI,EAAG,EAAI,EAAO,OAAQ,IACjC,KAAK,MAAM,EAAQ,OAAO,CAAC,CAAC,EAE9B,IAAM,EAAS,EACf,MAAO,IAAI,IAAoB,CAC7B,IAAM,EAAS,EAAO,MAAM,EAAQ,CAAI,EACxC,GAAI,IAAW,IAAS,IAAW,GAAI,CACrC,IAAM,EAAc,EAAO,IAAI,CAAC,IAAS,KAAK,WAAW,CAAI,CAAC,EAI9D,OAHuB,EAAY,GAGb,MACpB,EACA,EAAK,IAAI,CAAC,IAAQ,KAAK,WAAW,CAAG,CAAC,CACxC,EAEF,OAAO,GAKX,GACE,OAAO,IAAQ,UACf,EAAuB,SACrB,CACF,EAEA,MAAO,IAAI,IAAoB,CAG7B,IAAM,EADc,EACO,MAAM,EAAQ,CAAI,EAI7C,OAFA,KAAK,QAAQ,EAAQ,QAAQ,EAC7B,KAAK,QAAQ,EAAQ,CAAG,EACjB,GAIX,GAAI,EAAS,CAAK,GAAK,CAAC,EAAgB,EAAO,CAAW,EACxD,OAAO,KAAK,SAAS,CAAK,EAG5B,OAAO,GAET,IAAK,CAAC,EAAQ,EAAsB,IAAU,CAE5C,GAAI,EAAgB,EAAQ,CAAW,EAErC,OADA,QAAQ,KAAK,uBAAuB,OAAO,CAAG,sBAAsB,EAC7D,GAGT,IAAM,EAAW,QAAQ,IAAI,EAAQ,CAAG,EAGxC,GACE,EAAS,CAAK,GACd,CAAC,EAAgB,EAAO,CAAW,GACnC,CAAC,EAAgB,EAAO,CAAW,EAEnC,EAAQ,KAAK,SAAS,CAAK,EAG7B,IAAM,EAAS,QAAQ,IAAI,EAAQ,EAAK,CAAK,EAG7C,GAAI,IAAa,GAGf,GAFA,KAAK,QAAQ,EAAQ,CAAG,EAEpB,OAAO,IAAQ,UAAY,CAAC,MAAM,OAAO,CAAG,CAAC,EAC/C,KAAK,QAAQ,EAAQ,QAAQ,EAGjC,OAAO,GAET,eAAgB,CAAC,EAAQ,IAAyB,CAEhD,GAAI,EAAgB,EAAQ,CAAW,EAIrC,OAHA,QAAQ,KACN,0BAA0B,OAAO,CAAG,sBACtC,EACO,GAGT,IAAM,EAAS,KAAO,EAChB,EAAS,QAAQ,eAAe,EAAQ,CAAG,EAEjD,GAAI,EACF,KAAK,QAAQ,EAAQ,CAAG,EAExB,KAAK,QAAQ,EAAQ,QAAQ,EAE/B,OAAO,EAEX,CAAC,EAKD,OAFA,KAAK,YAAY,IAAI,EAAQ,CAAK,EAClC,KAAK,SAAS,IAAI,EAAO,CAAM,EACxB,EAGF,QAA0B,CAAC,EAAwB,CAExD,GAAI,CAAC,EAAS,CAAM,EAElB,OADA,QAAQ,KAAK,oCAAoC,EAC1C,EAIT,GAAI,EAAgB,EAAQ,CAAW,EACrC,OAAO,EAIT,GAAI,KAAK,YAAY,IAAI,CAAM,EAC7B,OAAO,KAAK,YAAY,IAAI,CAAM,EAGpC,IAAM,EAAQ,IAAI,MAAM,EAAQ,CAC9B,IAAK,CAAC,EAAQ,IAAyB,CAErC,GAAI,IAAQ,EACV,MAAO,GAET,GAAI,IAAQ,EACV,MAAO,GAGT,IAAM,EAAQ,QAAQ,IAAI,EAAQ,CAAG,EAErC,GAAI,EAAS,CAAK,EAChB,OAAO,KAAK,SAAS,CAAK,EAE5B,OAAO,GAET,IAAK,KACH,QAAQ,KAAK,wCAAwC,EAC9C,IAET,eAAgB,KACd,QAAQ,KAAK,2CAA2C,EACjD,GAEX,CAAC,EAID,OADA,KAAK,YAAY,IAAI,EAAQ,CAAK,EAC3B,EAGF,MAAmB,CACxB,EACA,EACmB,CACnB,IAAQ,OAAO,GAAO,YAAW,eAAe,IAAU,GAAW,CAAC,EAEhE,EAA8B,IAAM,CACxC,GAAI,CAAC,EAAS,OACZ,OAAO,EAAG,EAGZ,GAAI,CAKF,OAHA,KAAK,QAAQ,CAAQ,EACrB,KAAK,YAAY,KAAK,CAAQ,EAC9B,KAAK,aAAe,EACb,EAAG,EACV,MAAO,EAAO,CACd,GAAI,EACF,MAAM,EAER,QAAQ,MAAM,gBAAiB,CAAK,EACpC,cACA,CACA,KAAK,YAAY,IAAI,EACrB,KAAK,aACH,KAAK,YAAY,KAAK,YAAY,OAAS,IAAM,OAUvD,GANA,EAAS,GAAK,KACd,EAAS,KAAO,CAAC,EACjB,EAAS,OAAS,GAClB,EAAS,UAAY,EAGjB,CAAC,EACH,EAAS,EAGX,OAAO,EAQF,aAAgB,CAAC,EAAwB,EAAgB,CAC9D,KAAK,YAAY,KAAK,CAAM,EAC5B,KAAK,aAAe,EACpB,GAAI,CACF,OAAO,EAAG,SACV,CACA,KAAK,YAAY,IAAI,EACrB,KAAK,aAAe,KAAK,YAAY,KAAK,YAAY,OAAS,IAAM,MAIlE,QAAW,CAAC,EAAiC,CAClD,IAAI,EAAQ,GACR,EACE,EAAiB,CAAC,EAClB,EAAqB,IAAY,CACrC,KAAK,MAAM,EAAgB,OAAO,GAG9B,EAAS,KAAK,OAClB,IAAM,CACJ,EAAQ,EAAO,EACf,EAAQ,IAEV,CACE,KAAM,GACN,UAAW,IAAM,CACf,GAAI,CAAC,EACH,EAAQ,GACR,KAAK,QAAQ,EAAgB,OAAO,EAG1C,CACF,EAEA,MAAO,IACD,MAAK,EAAM,CACb,GAAI,EACF,EAAO,EAGT,OADA,EAAmB,EACZ,EAEX,EAGM,OAAO,CAAC,EAA8B,CAE5C,EAAO,KAAK,QAAQ,CAAC,IAAQ,CAC3B,EAAI,OAAO,CAAM,EAClB,EACD,EAAO,KAAK,OAAS,EAGf,KAAK,CAAC,EAAgB,EAA4B,CACxD,GAAI,CAAC,KAAK,cAAgB,CAAC,KAAK,aAAa,OAAQ,OAErD,IAAI,EAAU,KAAK,UAAU,IAAI,CAAM,EACvC,GAAI,CAAC,EACH,EAAU,IAAI,IACd,KAAK,UAAU,IAAI,EAAQ,CAAO,EAGpC,IAAI,EAAM,EAAQ,IAAI,CAAG,EACzB,GAAI,CAAC,EACH,EAAM,IAAI,IACV,EAAQ,IAAI,EAAK,CAAG,EAGtB,GAAI,CAAC,EAAI,IAAI,KAAK,YAAY,EAC5B,EAAI,IAAI,KAAK,YAAY,EACzB,KAAK,aAAa,KAAK,KAAK,CAAG,EAI3B,OAAO,CAAC,EAAgB,EAA4B,CAC1D,IAAM,EAAU,KAAK,UAAU,IAAI,CAAM,EACzC,GAAI,CAAC,EAAS,OAEd,IAAM,EAAM,EAAQ,IAAI,CAAG,EAC3B,GAAI,CAAC,EAAK,OAGM,IAAI,IAAI,CAAG,EACnB,QAAQ,CAAC,IAAW,CAC1B,GAAI,EAAO,OACT,GAAI,EAAO,UACT,EAAO,UAAU,CAAM,EAEvB,OAAO,EAGZ,EAII,IAAI,CAAC,EAA8B,CACxC,GAAI,EAAO,OACT,KAAK,QAAQ,CAAM,EACnB,EAAO,OAAS,GAGtB,CAGO,SAAS,CAA0B,CAAC,EAAc,CACvD,OAAO,EAAe,YAAY,EAAE,SAAS,CAAM,EAG9C,SAAS,EAA0B,CAAC,EAAwB,CACjE,OAAO,EAAe,YAAY,EAAE,SAAS,CAAM,EAG9C,SAAS,CAAmB,CACjC,EACA,EACmB,CACnB,OAAO,EAAe,YAAY,EAAE,OAAO,EAAI,CAAO,EAGjD,SAAS,EAAW,CAAC,EAAiC,CAC3D,OAAO,EAAe,YAAY,EAAE,SAAS,CAAM,EAG9C,SAAS,EAAM,CAAC,EAAkB,CACvC,IAAM,EAAU,CAAE,OAAM,EAOxB,OANA,OAAO,eAAe,EAAS,EAAQ,CACrC,aAAc,GACd,WAAY,GACZ,MAAO,EACT,CAAC,EAEM,EAAS,CAAO,EAGlB,SAAS,CAAK,CAAC,EAAuC,CAC3D,OAAO,EAAS,CAAK,GAAK,QAAQ,QAAQ,IAAI,EAAO,CAAM,CAAC,EAGvD,SAAS,EAAQ,CAAC,EAAsB,CAC7C,OAAO,EAAM,CAAK,EAAI,EAAM,MAAQ,EAG/B,SAAS,CAAI,CAAC,EAA8B,CACjD,EAAe,YAAY,EAAE,KAAK,CAAM,EAyB1C,SAAS,CAAgB,CAAC,EAAgB,EAAyB,CACjE,GAAI,CAAC,EAAS,CAAK,GAAK,EAAK,IAAI,CAAK,EACpC,OAKF,GAFA,EAAK,IAAI,CAAK,EAEV,MAAM,QAAQ,CAAK,EAAG,CACxB,EAAM,QAAQ,CAAC,IAAS,EAAiB,EAAM,CAAI,CAAC,EACpD,OAGF,OAAO,KAAK,CAAK,EAAE,QAAQ,CAAC,IAAQ,CAClC,EAAkB,EAAkC,GAAM,CAAI,EAC/D,EAOI,SAAS,EAAQ,CACtB,EACA,EACA,EAAwB,CAAC,EACb,CACZ,IAAM,EAAS,EAAe,YAAY,EACpC,EAAS,EAAM,CAAM,EACvB,IAAU,EAAkB,MAC3B,EAED,EACA,EAA+B,KAE7B,EAAM,IAAY,CACtB,GAAI,CAAC,EAAI,OACP,OAEF,IAAU,EACV,EAAU,KAEV,IAAM,EAAW,EAAO,EACxB,EAAS,EAAU,EAAU,CAAC,IAAO,CACnC,EAAU,EACX,EACD,EAAW,GAGP,EAAS,EACb,IAAS,CACP,IAAM,EAAQ,EAAO,EACrB,GAAI,EAAQ,MAAQ,EAAS,CAAK,EAChC,EAAiB,EAAO,IAAI,GAAa,EAE3C,OAAO,GAET,CACE,KAAM,GACN,UAAW,IAAM,CACf,GAAI,EAAQ,KACV,EAAI,EAEJ,OAAkB,QAAQ,CAAG,EAGnC,CACF,EAGM,EAAM,EACV,IAAM,CACJ,EAAI,GAEN,CAAE,KAAM,EAAK,CACf,EAEA,GAAI,EAAQ,UACV,EAAI,EAEJ,OAAW,EAAO,EAGpB,MAAO,IAAM,CACX,EAAO,KAAK,CAAM,EAClB,EAAO,KAAK,CAAG,GAKZ,SAAS,EAAU,CAAC,EAAyB,CAClD,OAAO,EAAS,CAAK,GAAK,EAAgB,EAAO,CAAW,EAIvD,SAAS,EAAU,CAAC,EAAyB,CAClD,OAAO,EAAS,CAAK,GAAK,EAAgB,EAAO,CAAW,EC1nBvD,SAAS,CAAU,CAAC,EAA4C,CACrE,GAAI,IAAa,QAAa,IAAa,KACzC,MAAO,CAAC,EAEV,OAAO,MAAM,QAAQ,CAAQ,EAAI,EAAW,CAAC,CAAQ,EA6DhD,SAAS,CAAe,CAAC,EAAsC,CACpE,OAAO,OAAO,IAAU,UAAY,IAAU,MAAQ,cAAe,EAGhE,SAAS,CAAU,CAAC,EAAiC,CAC1D,OACE,OAAO,IAAU,UACjB,IAAU,MACV,QAAS,GACT,EAAM,MAAQ,OAIX,SAAS,CAAc,CAAC,EAAqC,CAClE,OACE,OAAO,IAAU,UACjB,IAAU,MACV,QAAS,GACT,EAAM,MAAQ,OAIX,SAAS,EAAC,CACf,EACA,EACA,EACA,EACA,EACA,EACU,CACV,MAAO,CACL,MACA,QACA,WACA,YACA,MACA,YACF,EAGK,SAAS,EAAG,CACjB,EACA,EAAkC,CAAC,EACzB,CACV,MAAO,CACL,SACG,CACL,EAGF,SAAS,CAAoB,CAAC,EAA8B,CAC1D,MAAO,CAAC,EAAkC,CAAC,IAAM,GAAI,EAAK,CAAO,EAG5D,IAAM,EAAM,EAAqB,KAAK,EAChC,GAAO,EAAqB,MAAM,EAClC,GAAI,EAAqB,GAAG,EAC5B,GAAS,EAAqB,QAAQ,EACtC,GAAQ,EAAqB,OAAO,EACpC,GAAU,EAAqB,SAAS,EACxC,GAAO,EAAqB,MAAM,EAClC,GAAS,EAAqB,QAAQ,EACtC,GAAS,EAAqB,QAAQ,EACtC,GAAM,EAAqB,KAAK,EAChC,GAAU,EAAqB,SAAS,EACxC,GAAQ,EAAqB,OAAO,EACpC,GAAK,EAAqB,IAAI,EAC9B,GAAK,EAAqB,IAAI,EAC9B,GAAK,EAAqB,IAAI,EAC9B,GAAK,EAAqB,IAAI,EAC9B,GAAK,EAAqB,IAAI,EAC9B,GAAK,EAAqB,IAAI,EAC9B,GAAS,EAAqB,QAAQ,EACtC,GAAK,EAAqB,IAAI,EAC9B,GAAQ,EAAqB,OAAO,EACpC,GAAM,EAAqB,KAAK,EAChC,GAAO,EAAqB,MAAM,EAClC,GAAa,EAAqB,YAAY,EAC9C,GAAK,EAAqB,IAAI,EAC9B,GAAK,EAAqB,IAAI,EAC9B,GAAK,EAAqB,IAAI,EAC9B,GAAI,EAAqB,GAAG,EAC5B,GAAM,EAAqB,KAAK,EAChC,GAAO,EAAqB,MAAM,EAClC,GAAQ,EAAqB,OAAO,EACpC,GAAW,EAAqB,UAAU,EAC1C,GAAS,EAAqB,QAAQ,EACtC,GAAS,EAAqB,QAAQ,EACtC,GAAQ,EAAqB,OAAO,EACpC,GAAQ,EAAqB,OAAO,EACpC,GAAQ,EAAqB,OAAO,EACpC,GAAK,EAAqB,IAAI,EAC9B,GAAK,EAAqB,IAAI,EAC9B,GAAK,EAAqB,IAAI,EAoBpC,SAAS,EAA8C,CAC5D,EACA,EACA,EACA,EACA,EACkB,CAClB,GAAI,OAAO,IAAuB,WAChC,MAAO,CACL,UAAW,EACX,QACA,WACA,MACA,YACF,EAEF,MAAO,CACL,UAAW,EAAmB,UAC9B,MAAO,EAAmB,MAC1B,SAAU,EAAmB,SAC7B,IAAK,EAAmB,IACxB,WAAY,EAAmB,UACjC,EAGK,SAAS,EAAI,CAClB,EACA,EACA,EACc,CACd,MAAO,CACL,IAAK,OACL,MAAO,CAAE,MAAK,EACd,MACA,YACF,EAGK,SAAS,EAAO,CACrB,EACA,EACA,EACS,CACT,OAAO,EAAM,IAAI,CAAC,EAAM,IAAU,CAChC,IAAM,EAAQ,EAAO,EAAM,CAAK,EAChC,GAAI,OAAO,IAAU,SACnB,MAAU,MAAM,0CAA0C,EAE5D,GAAI,CAAC,EACH,OAAO,EAGT,MAAO,IAAK,EAAO,IAAK,EAAI,EAAM,CAAK,CAAE,EAC1C,ECjPH,SAAS,CAAY,CAAC,EAAwB,CAC5C,IAAM,EAAW,EAAK,MAAM,GAAG,EAC/B,GACE,EAAK,SAAW,GAChB,EAAS,KACP,CAAC,IACC,EAAQ,SAAW,GACnB,IAAY,aACZ,IAAY,aACZ,IAAY,aAChB,EAEA,MAAU,MAAM,uBAAuB,IAAO,EAEhD,OAAO,EAGT,SAAS,CAAQ,CAAC,EAAqC,CACrD,OAAO,OAAO,IAAU,UAAY,IAAU,MAAQ,CAAC,MAAM,QAAQ,CAAK,EAG5E,SAAS,CAAM,CAAC,EAAe,EAAsB,CACnD,OAAO,OAAO,UAAU,eAAe,KAAK,EAAO,CAAG,EAGjD,SAAS,EAAS,CAAC,EAA+B,CACvD,OAAO,OAAO,IAAY,SAAW,EAAU,EAAQ,KAGlD,SAAS,CAAa,CAAC,EAAmB,EAAuB,CACtE,IAAI,EAAiB,EAErB,QAAW,KAAW,EAAa,CAAI,EAAG,CACxC,GAAI,CAAC,EAAS,CAAK,EACjB,MAAU,MAAM,uBAAuB,IAAO,EAEhD,GAAI,CAAC,EAAO,EAAO,CAAO,EAAG,CAC3B,GAAI,KAAW,EACb,MAAU,MAAM,uBAAuB,IAAO,EAEhD,OAEF,EAAQ,EAAM,GAGhB,OAAO,EAGF,SAAS,EAAa,CAC3B,EACA,EACA,EACM,CACN,IAAM,EAAW,EAAa,CAAI,EAC9B,EAAqB,EAEzB,QAAW,KAAW,EAAS,MAAM,EAAG,EAAE,EAAG,CAC3C,GAAI,CAAC,EAAO,EAAQ,CAAO,EAAG,CAC5B,GAAI,KAAW,EACb,MAAU,MAAM,uBAAuB,IAAO,EAEhD,EAAO,GAAW,CAAC,EACd,QAAI,CAAC,EAAS,EAAO,EAAQ,EAClC,MAAU,MAAM,uBAAuB,IAAO,EAEhD,IAAM,EAAa,EAAO,GAC1B,GAAI,CAAC,EAAS,CAAU,EACtB,MAAU,MAAM,uBAAuB,IAAO,EAEhD,EAAS,EAGX,IAAM,EAAc,EAAS,EAAS,OAAS,GAC/C,EAAO,GAAe,EAGxB,SAAS,CAAY,CAAC,EAAuB,EAAwB,CACnE,GAAI,OAAO,IAAY,UAAY,EAAQ,OACzC,OAAO,EAAQ,OAAO,CAAK,EAE7B,OAAO,IAAU,QAAa,IAAU,KAAO,GAAK,OAAO,CAAK,EAGlE,SAAS,EAAY,CAAC,EAAuB,EAAyB,CACpE,GAAI,OAAO,IAAY,UAAY,EAAQ,MACzC,OAAO,EAAQ,MAAM,CAAK,EAE5B,OAAO,EAGT,SAAS,EAAW,CAClB,EACA,EACA,EACM,CACN,GAAI,aAAmB,iBAAkB,CACvC,GAAI,EAAQ,OAAS,WAAY,CAC/B,EAAQ,QAAU,MAAM,QAAQ,CAAK,EACjC,EAAM,KAAK,CAAC,IAAS,OAAO,CAAI,IAAM,EAAQ,KAAK,EACnD,QAAQ,CAAK,EACjB,OAEF,GAAI,EAAQ,OAAS,QAAS,CAC5B,EAAQ,QAAU,IAAU,EAAQ,MACpC,OAEF,EAAQ,MAAQ,EAAa,EAAS,CAAK,EAC3C,OAGF,GAAI,aAAmB,oBAAqB,CAC1C,EAAQ,MAAQ,EAAa,EAAS,CAAK,EAC3C,OAGF,GAAI,aAAmB,kBAAmB,CACxC,GAAI,EAAQ,SAAU,CACpB,IAAM,EAAW,MAAM,QAAQ,CAAK,EAChC,IAAI,IAAI,EAAM,IAAI,MAAM,CAAC,EACzB,IAAI,IACR,QAAS,EAAQ,EAAG,EAAQ,EAAQ,QAAQ,OAAQ,GAAS,EAAG,CAC9D,IAAM,EAAS,EAAQ,QAAQ,KAAK,CAAK,EACzC,GAAI,CAAC,EACH,SAEF,EAAO,SAAW,EAAS,IAAI,EAAO,KAAK,EAE7C,OAEF,EAAQ,MAAQ,EAAa,EAAS,CAAK,GAI/C,SAAS,EAAY,CAAC,EAAsB,EAAgC,CAC1E,GAAI,aAAmB,iBAAkB,CACvC,GAAI,EAAQ,OAAS,WAAY,CAC/B,GAAI,MAAM,QAAQ,CAAY,EAAG,CAC/B,IAAM,EAAS,EAAa,OAC1B,CAAC,IAAU,OAAO,CAAK,IAAM,EAAQ,KACvC,EACA,OAAO,EAAQ,QAAU,CAAC,GAAG,EAAQ,EAAQ,KAAK,EAAI,EAExD,OAAO,EAAQ,QAEjB,GAAI,EAAQ,OAAS,QACnB,OAAO,EAAQ,QAAU,EAAQ,MAAQ,EAE3C,OAAO,EAAQ,MAEjB,GAAI,aAAmB,oBACrB,OAAO,EAAQ,MAEjB,GAAI,aAAmB,kBAAmB,CACxC,GAAI,CAAC,EAAQ,SACX,OAAO,EAAQ,MAEjB,IAAM,EAAmB,CAAC,EAC1B,QAAS,EAAQ,EAAG,EAAQ,EAAQ,gBAAgB,OAAQ,GAAS,EAAG,CACtE,IAAM,EAAS,EAAQ,gBAAgB,KAAK,CAAK,EACjD,GAAI,EACF,EAAO,KAAK,EAAO,KAAK,EAG5B,OAAO,EAET,OAGK,MAAM,CAAuB,CACjB,SAAW,IAAI,QAEzB,IAAI,CACT,EACA,EACA,EACM,CACN,GAAI,CAAC,KAAK,mBAAmB,CAAO,EAClC,OAGF,IAAM,EAAW,KAAK,SAAS,IAAI,CAAO,EAC1C,GAAI,GAAY,KAAK,YAAY,EAAU,CAAO,EAChD,OAEF,KAAK,QAAQ,CAAO,EAEpB,IAAM,EAAO,GAAU,CAAO,EACxB,EAAO,IACX,GAAY,EAAS,EAAS,EAAc,EAAO,CAAI,CAAC,EACpD,EACJ,aAAmB,qBAClB,aAAmB,kBAClB,CAAC,CAAC,WAAY,OAAO,EAAE,SAAS,EAAQ,IAAI,EAC1C,QACA,SACA,EAAW,IAAY,CAC3B,IAAM,EAAe,EAAc,EAAO,CAAI,EAC9C,GACE,EACA,EACA,GAAa,EAAS,GAAa,EAAS,CAAY,CAAC,CAC3D,GAGF,EAAQ,iBAAiB,EAAW,CAAQ,EAC5C,IAAM,EAAY,EAAO,CAAI,EAC7B,KAAK,SAAS,IAAI,EAAS,CACzB,UACA,OACA,MAAO,OAAO,IAAY,SAAW,OAAY,EAAQ,MACzD,OAAQ,OAAO,IAAY,SAAW,OAAY,EAAQ,OAC1D,YACA,WACA,OAAQ,CACV,CAAC,EAGI,OAAO,CAAC,EAA4B,CACzC,IAAM,EAAW,KAAK,SAAS,IAAI,CAAO,EAC1C,GAAI,CAAC,EACH,OAEF,EAAQ,oBAAoB,EAAS,UAAW,EAAS,QAAQ,EACjE,EAAK,EAAS,MAAM,EACpB,KAAK,SAAS,OAAO,CAAO,EAGtB,kBAAkB,CAAC,EAA+B,CACxD,OACE,aAAmB,kBACnB,aAAmB,qBACnB,aAAmB,kBAIf,WAAW,CAAC,EAAuB,EAAgC,CACzE,GAAI,OAAO,EAAO,UAAY,UAAY,OAAO,IAAY,SAC3D,OAAO,EAAO,UAAY,EAE5B,OACE,EAAO,OAAS,EAAQ,MACxB,EAAO,QAAU,EAAQ,OACzB,EAAO,SAAW,EAAQ,OAGhC,CCtQO,SAAS,CAAW,CAAC,EAAsB,CAChD,MAAO,WAAW,KAAK,CAAG,GAAK,WAAW,KAAK,CAAG,EAG7C,SAAS,EAAiB,CAAC,EAAqB,CACrD,OAAO,EAAI,MAAM,CAAC,EAAE,YAAY,EAG3B,SAAS,EAAc,CAAC,EAAgC,CAC7D,IAAO,KAAc,GAAa,EAAM,MAAM,GAAG,EACjD,MAAO,CAAE,YAAW,UAAW,IAAI,IAAI,CAAS,CAAE,EAG7C,SAAS,EAAgB,CAC9B,EACA,EACe,CACf,IAAM,EAAe,CAAC,IAAuB,CAC3C,GAAI,EAAU,IAAI,MAAM,EACtB,EAAM,gBAAgB,EAGxB,GAAI,EAAU,IAAI,SAAS,EACzB,EAAM,eAAe,EAGvB,GAAI,EAAU,IAAI,MAAM,GAAK,EAAM,gBAAkB,EAAM,OACzD,OAGF,GAAI,EAAU,IAAI,MAAM,EACrB,EAAM,cAA8B,oBACnC,EAAM,KACN,CACF,EAGF,EAAQ,CAAK,GAGf,OAAO,EAGF,SAAS,EAAa,CAC3B,EACA,EACA,EACM,CACN,IAAM,EAAc,EAAS,SAAS,GAAG,EACrC,EACA,EAAS,QAAQ,SAAU,CAAC,IAAU,IAAI,EAAM,YAAY,GAAG,EAEnE,EAAM,YAAY,EAAa,OAAO,CAAK,CAAC,ECtCvC,IAAM,GAAgB,6BAOhB,GAAgC,IAAI,IAAI,CACnD,MACA,IACA,OACA,OACA,SACA,UACA,OACA,WACA,UACA,OACA,OACA,QACA,WACA,MACA,SACA,SACA,iBACA,iBACA,OACA,UACA,OACA,WACA,eACF,CAAC,EAEM,MAAM,CAEsB,CAChB,UAAY,IAAI,QAIhB,QAAU,IAAI,QACd,cAAgB,IAAI,EAE9B,OAAO,CAAC,EAAmC,CAChD,OAAO,OAAO,IAAU,UAAY,IAAU,MAAQ,EAAW,CAAK,EAGjE,KAAK,CAAC,EAAc,EAAqC,CAC9D,GAAI,EAAM,YAAY,KAAO,GAC3B,OAAO,SAAS,cAAc,IAAI,EAGpC,IAAM,EAAU,GAAS,IAAI,EAAM,GAAG,EAClC,SAAS,gBAAgB,GAAe,EAAM,GAAG,EACjD,SAAS,cAAc,EAAM,GAAG,EAMpC,OALA,KAAK,WAAW,EAAS,CAAC,EAAG,EAAM,OAAS,CAAC,EAAG,CAAO,EACvD,KAAK,gBAAgB,EAAS,CAAC,EAAG,KAAK,iBAAiB,CAAK,CAAC,EAC9D,KAAK,cAAc,EAAS,EAAO,CAAO,EAC1C,KAAK,gBAAgB,EAAS,OAAW,EAAM,WAAY,CAAO,EAE3D,EAGF,KAAK,CACV,EACA,EACA,EACA,EACM,CACN,GACE,EAAS,MAAQ,EAAS,KAC1B,EAAY,WAAa,KAAK,aAC9B,CACA,IAAM,EAAW,KAAK,MAAM,EAAU,CAAO,EAG7C,OAFA,EAAY,YAAY,aAAa,EAAU,CAAW,EAC1D,KAAK,QAAQ,EAAU,EAAa,CAAO,EACpC,EAIT,GAAI,EAAE,aAAuB,SAC3B,OAAO,EAGT,GAAI,EAAS,YAAY,KAAO,GAAO,CACrC,IAAM,EAAW,SAAS,cAAc,IAAI,EAG5C,OAFA,EAAY,YAAY,aAAa,EAAU,CAAW,EAC1D,KAAK,QAAQ,EAAU,EAAa,CAAO,EACpC,EAsBT,OAnBA,KAAK,WACH,EACA,EAAS,OAAS,CAAC,EACnB,EAAS,OAAS,CAAC,EACnB,CACF,EACA,KAAK,gBACH,EACA,KAAK,iBAAiB,CAAQ,EAC9B,KAAK,iBAAiB,CAAQ,CAChC,EACA,KAAK,eAAe,EAAa,EAAU,EAAU,CAAO,EAC5D,KAAK,gBACH,EACA,EAAS,WACT,EAAS,WACT,CACF,EAEO,EAGF,OAAO,CACZ,EACA,EACA,EACM,CACN,GAAI,EAAE,aAAuB,SAC3B,OAGF,KAAK,QAAQ,IAAI,CAAW,GAAG,QAAQ,CAAC,IAAS,EAAK,CAAI,CAAC,EAC3D,KAAK,QAAQ,OAAO,CAAW,EAE/B,KAAK,UAAU,IAAI,CAAW,GAAG,QAAQ,EAAG,YAAW,cAAe,CACpE,EAAY,oBAAoB,EAAW,CAAQ,EACpD,EACD,KAAK,UAAU,OAAO,CAAW,EACjC,KAAK,cAAc,QAAQ,CAA0B,EACrD,KAAK,gBAAgB,EAAa,EAAO,CAAO,EAGxC,aAAa,CACrB,EACA,EACA,EACM,CACN,EAAW,EAAM,QAAQ,EAAE,QAAQ,CAAC,IAAU,CAC5C,EAAQ,YAAY,EAAQ,SAAS,MAAM,EAAO,CAAO,CAAC,EAC3D,EAGO,cAAc,CACtB,EACA,EACA,EACA,EACM,CACN,KAAK,uBACH,EACA,EAAW,EAAS,QAAQ,EAC5B,EAAW,EAAS,QAAQ,EAC5B,CACF,EAGQ,eAAe,CACvB,EACA,EACA,EACM,CACN,EAAW,EAAM,QAAQ,EAAE,QAAQ,CAAC,EAAO,IAAU,CACnD,IAAM,EAAY,EAAQ,WAAW,GACrC,GAAI,EACF,EAAQ,SAAS,QAAQ,EAAO,EAAW,CAAO,EAErD,EAGK,UAAU,CAChB,EACA,EACA,EACA,EACM,CACN,OAAO,KAAK,CAAQ,EAAE,QAAQ,CAAC,IAAQ,CACrC,GAAI,EAAY,CAAG,GAAK,KAAO,EAC7B,OAGF,GAAI,IAAQ,aAAe,IAAQ,QACjC,EAAQ,gBAAgB,OAAO,EAC1B,QAAI,IAAQ,QACjB,EAAQ,gBAAgB,OAAO,EAC1B,QACL,IAAQ,SACR,OAAO,IAAY,UACnB,IAAY,MACZ,UAAW,EAEV,EAA4C,MAAQ,GAErD,OAAQ,gBAAgB,EAAc,CAAG,CAAC,EAE7C,EAED,OAAO,QAAQ,CAAQ,EAAE,QAAQ,EAAE,EAAK,KAAW,CACjD,GAAI,EAAY,CAAG,EACjB,OAIF,GAAI,EAAS,KAAS,EACpB,OAGF,GAAI,IAAQ,aAAe,IAAQ,QAAS,CAG1C,GAAI,EAAQ,eAAiB,GAC3B,EAAQ,aAAa,QAAS,OAAO,GAAS,EAAE,CAAC,EAEjD,KAAC,EAAwB,UAAY,OAAO,GAAS,EAAE,EAEzD,OAMF,GACE,IAAQ,SACR,OAAO,IAAY,UACnB,IAAY,MACZ,UAAW,EACX,CACC,EAA4C,MAAQ,OACnD,GAAS,EACX,EACA,OAGF,GAAI,IAAQ,SAAW,OAAO,IAAU,UAAY,IAAU,KAAM,CAClE,EAAQ,gBAAgB,OAAO,EAC/B,IAAM,EAAS,EAAwB,MACvC,OAAO,QAAQ,CAAK,EAAE,QAAQ,EAAE,EAAQ,KAAc,CACpD,GAAc,EAAO,EAAQ,CAAQ,EACtC,EACD,OAGF,GAAI,IAAU,IAAS,IAAU,QAAa,IAAU,KAAM,CAC5D,EAAQ,gBAAgB,EAAc,CAAG,CAAC,EAC1C,OAGF,GAAI,IAAU,GAAM,CAClB,EAAQ,aAAa,EAAc,CAAG,EAAG,EAAE,EAC3C,OAGF,GACE,OAAO,IAAU,UACjB,EAAQ,eAAe,eAAe,CAAK,EAC3C,CACA,KAAK,uBAAuB,EAAS,EAAK,EAAO,CAAO,EACxD,OAGF,EAAQ,aAAa,EAAc,CAAG,EAAG,OAAO,CAAK,CAAC,EACvD,EAGK,eAAe,CACrB,EACA,EACA,EACA,EACM,CACN,GAAI,GAAiB,SAAU,EAC5B,EAAwB,MAAM,QAAU,EAAc,KAAO,GAAK,OAC9D,QAAI,GAAiB,SAAU,EACnC,EAAwB,MAAM,QAAU,GAG3C,GAAI,CAAC,GAAe,MAAO,CACzB,KAAK,cAAc,QAAQ,CAAsB,EACjD,OAGF,KAAK,cAAc,KACjB,EACA,EAAc,MACd,EAAQ,eAAe,KACzB,EAGM,sBAAsB,CAC5B,EACA,EACA,EACA,EACM,CAIN,GAHA,KAAK,sBAAsB,CAAW,EACtC,KAAK,sBAAsB,CAAW,EAElC,KAAK,qBAAqB,EAAa,CAAW,EAAG,CACvD,KAAK,oBAAoB,EAAS,EAAa,EAAa,CAAO,EACnE,OAGF,IAAM,EAAe,KAAK,IAAI,EAAY,OAAQ,EAAY,MAAM,EAEpE,QAAS,EAAQ,EAAG,EAAQ,EAAc,GAAS,EAAG,CACpD,IAAM,EAAY,EAAQ,WAAW,GACrC,GAAI,CAAC,EAAW,CACd,EAAQ,YACN,EAAQ,SAAS,MAAM,EAAY,GAAQ,CAAO,CACpD,EACA,SAEF,EAAQ,SAAS,MACf,EAAY,GACZ,EAAY,GACZ,EACA,CACF,EAGF,QAAS,EAAQ,EAAc,EAAQ,EAAY,OAAQ,GAAS,EAClE,EAAQ,YAAY,EAAQ,SAAS,MAAM,EAAY,GAAQ,CAAO,CAAC,EAGzE,QACM,EAAQ,EAAY,OAAS,EACjC,GAAS,EAAY,OACrB,GAAS,EACT,CACA,IAAM,EAAY,EAAQ,WAAW,GACrC,GAAI,GAEF,GADA,EAAQ,SAAS,QAAQ,EAAY,GAAQ,EAAW,CAAO,EAC3D,EAAU,aAAe,EAC3B,EAAQ,YAAY,CAAS,IAM7B,mBAAmB,CACzB,EACA,EACA,EACA,EACM,CACN,IAAM,EAAa,EAAY,IAAI,CAAC,EAAO,KAAW,CACpD,QACA,KAAM,EAAQ,WAAW,GACzB,OACF,EAAE,EACI,EAAkB,IAAI,IAItB,EAAiB,IAAI,IAE3B,EAAW,QAAQ,CAAC,IAAU,CAC5B,IAAM,EAAM,KAAK,YAAY,EAAM,KAAK,EACxC,GAAI,IAAQ,QAAa,EAAM,KAC7B,EAAgB,IAAI,EAAK,CACvB,MAAO,EAAM,MACb,KAAM,EAAM,KACZ,MAAO,EAAM,KACf,CAAC,EAEJ,EAED,EAAY,QAAQ,CAAC,EAAU,IAAa,CAC1C,IAAM,EAAM,KAAK,YAAY,CAAQ,EAC/B,EAAW,IAAQ,OAAY,OAAY,EAAgB,IAAI,CAAG,EACpE,EAEJ,GAAI,EACF,EAAW,EAAQ,SAAS,MAC1B,EAAS,MACT,EACA,EAAS,KACT,CACF,EACA,EAAe,IAAI,EAAS,KAAK,EAEjC,OAAW,EAAQ,SAAS,MAAM,EAAU,CAAO,EAGrD,IAAM,EAAgB,EAAQ,WAAW,IAAa,KACtD,GAAI,IAAa,EACf,EAAQ,aAAa,EAAU,CAAa,EAE/C,EAED,EAAW,QAAQ,CAAC,IAAU,CAC5B,GAAI,CAAC,EAAM,MAAQ,EAAe,IAAI,EAAM,KAAK,EAC/C,OAIF,GADA,EAAQ,SAAS,QAAQ,EAAM,MAAO,EAAM,KAAM,CAAO,EACrD,EAAM,KAAK,aAAe,EAC5B,EAAQ,YAAY,EAAM,IAAI,EAEjC,EAGK,oBAAoB,CAC1B,EACA,EACS,CACT,MAAO,CAAC,GAAG,EAAa,GAAG,CAAW,EAAE,MACtC,CAAC,IAAU,KAAK,YAAY,CAAK,IAAM,MACzC,EAGM,qBAAqB,CAAC,EAAuC,CACnE,IAAM,EAAO,IAAI,IAEjB,EAAS,QAAQ,CAAC,IAAU,CAC1B,IAAM,EAAM,KAAK,YAAY,CAAK,EAClC,GAAI,IAAQ,OACV,OAGF,GAAI,EAAK,IAAI,CAAG,EACd,MAAU,MAAM,kBAAkB,IAAM,EAG1C,EAAK,IAAI,CAAG,EACb,EAGK,WAAW,CAAC,EAAoD,CACtE,GAAI,OAAO,IAAU,SACnB,OAGF,OAAO,EAAM,IAGP,gBAAgB,CAAC,EAAiC,CACxD,IAAM,EAA4B,CAAC,EAQnC,OANA,OAAO,QAAQ,EAAM,OAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAK,KAAW,CAC1D,GAAI,EAAY,CAAG,GAAK,OAAO,IAAU,WACvC,EAAU,GAAkB,CAAG,GAAK,EAEvC,EAEM,IACF,KACC,EAAM,WAAa,CAAC,CAC1B,EAGM,eAAe,CACrB,EACA,EACA,EACM,CACN,IAAM,EAAQ,KAAK,UAAU,IAAI,CAAO,GAAK,IAAI,IAC3C,EAAU,IAAI,IAAI,OAAO,KAAK,CAAY,CAAC,EAC3C,EAAU,IAAI,IAAI,OAAO,KAAK,CAAY,CAAC,EAEjD,EAAQ,QAAQ,CAAC,IAAU,CACzB,GAAI,CAAC,EAAQ,IAAI,CAAK,GAAK,EAAa,KAAW,EAAa,GAAQ,CACtE,IAAM,EAAS,EAAM,IAAI,CAAK,EAC9B,GAAI,EACF,EAAQ,oBAAoB,EAAO,UAAW,EAAO,QAAQ,EAC7D,EAAM,OAAO,CAAK,GAGvB,EAED,EAAQ,QAAQ,CAAC,IAAU,CACzB,GAAI,CAAC,EAAQ,IAAI,CAAK,GAAK,EAAa,KAAW,EAAa,GAAQ,CACtE,IAAQ,YAAW,aAAc,GAAe,CAAK,EAC/C,EAAW,GAAiB,EAAa,GAAQ,CAAS,EAChE,EAAQ,iBAAiB,EAAW,CAAQ,EAC5C,EAAM,IAAI,EAAO,CAAE,YAAW,UAAS,CAAC,GAE3C,EAED,KAAK,UAAU,IAAI,EAAS,CAAK,EAG3B,sBAAsB,CAC5B,EACA,EACA,EACA,EACM,CACN,IAAM,EAAY,EAAO,IAAM,CAC7B,EAAQ,aACN,EACA,EAAQ,eAAe,sBAAsB,CAAS,CACxD,EACD,EAED,KAAK,YAAY,EAAS,CAAS,EAG7B,WAAW,CAAC,EAAkB,EAAiC,CACrE,IAAM,EAAU,KAAK,QAAQ,IAAI,CAAO,GAAK,IAAI,IACjD,EAAQ,IAAI,CAAS,EACrB,KAAK,QAAQ,IAAI,EAAS,CAAO,EAErC,CAGA,SAAS,CAAa,CAAC,EAAqB,CAC1C,GAAI,EAAI,WAAW,MAAM,GAAK,EAAI,OAAS,EACzC,MAAO,OAAO,EACX,MAAM,CAAC,EACP,QAAQ,SAAU,CAAC,IAAU,IAAI,EAAM,YAAY,GAAG,IAG3D,GAAI,IAAQ,YAAc,IAAQ,WAAa,IAAQ,UACrD,OAAO,EAAI,YAAY,EAEzB,OAAO,EC9fF,MAAM,CAAgB,CACV,WAEjB,WAAW,EAAG,CACZ,KAAK,WAAa,CAChB,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,CACN,EAGK,KAAK,CAAC,EAAmB,EAAqC,CACnE,OAAO,KAAK,aAAa,CAAK,EAAE,MAAM,EAAgB,CAAO,EAGxD,KAAK,CACV,EACA,EACA,EACA,EACM,CACN,IAAM,EAAc,KAAK,aAAa,CAAQ,EACxC,EAAc,KAAK,aAAa,CAAQ,EAE9C,GAAI,IAAgB,EAAa,CAC/B,IAAM,EAAW,EAAY,MAAM,EAAmB,CAAO,EAG7D,OAFA,EAAY,YAAY,aAAa,EAAU,CAAW,EAC1D,EAAY,QAAQ,EAAmB,EAAa,CAAO,EACpD,EAGT,OAAO,EAAY,MACjB,EACA,EACA,EACA,CACF,EAGK,OAAO,CACZ,EACA,EACA,EACM,CACN,KAAK,aAAa,CAAK,EAAE,QAAQ,EAAgB,EAAa,CAAO,EAG/D,YAAY,CAAC,EAAmC,CACtD,IAAM,EAAW,KAAK,WAAW,KAAK,CAAC,IAAS,EAAK,QAAQ,CAAK,CAAC,EACnE,GAAI,CAAC,EACH,MAAU,MAAM,oCAAoC,EAEtD,OAAO,EAEX,CAEO,MAAM,EAAqD,CACzD,OAAO,CAAC,EAAoC,CACjD,OAAO,OAAO,IAAU,SAGnB,KAAK,CAAC,EAAe,EAAqC,CAC/D,OAAO,EAAQ,eAAe,cAAc,CAAK,EAG5C,KAAK,CACV,EACA,EACA,EACA,EACM,CACN,GAAI,IAAa,EACf,OAAO,EAGT,IAAM,EAAW,KAAK,MAAM,EAAU,CAAO,EAE7C,OADA,EAAY,YAAY,aAAa,EAAU,CAAW,EACnD,EAGF,OAAO,EAAS,EACzB,CAEO,MAAM,EAAiE,CAC3D,UAAY,IAAI,QAChB,cAAgB,IAAI,IACpB,qBAAuB,IAAI,QAKrC,OAAO,CAAC,EAA2C,CACxD,OACE,OAAO,IAAU,UAAY,IAAU,MAAQ,EAAgB,CAAK,EAIjE,KAAK,CAAC,EAAsB,EAAqC,CACtE,GAAI,EAAM,YAAY,KAAO,GAC3B,OAAO,SAAS,cAAc,IAAI,EAMpC,IAAM,EAAW,IAHM,EAAM,UAGO,KAAK,YAAY,CAAK,CAAC,EAE3D,GAAI,EAAQ,YAAc,EAAS,cACjC,EAAS,cAAc,EAAQ,UAAU,EAG3C,KAAK,aAAa,EAAU,EAAM,UAAY,CAAC,CAAC,EAEhD,EAAQ,cAAc,CAAQ,EAE9B,IAAM,EAAO,EAAS,YAAY,EAMlC,OALA,KAAK,kBAAkB,EAAU,CAAI,EACrC,EAAS,2BAA2B,CAAC,EAAc,IAAa,CAC9D,KAAK,kBAAkB,EAAU,CAAY,EAC7C,KAAK,kBAAkB,EAAU,CAAQ,EAC1C,EACM,EAGF,KAAK,CACV,EACA,EACA,EACA,EACM,CACN,GAAI,EAAY,WAAa,KAAK,aAAc,CAC9C,IAAM,EAAW,KAAK,MAAM,EAAU,CAAO,EAE7C,OADA,EAAY,YAAY,aAAa,EAAU,CAAW,EACnD,EAGT,GAAI,EAAS,YAAY,KAAO,GAAO,CACrC,IAAM,EAAW,SAAS,cAAc,IAAI,EAG5C,OAFA,EAAY,YAAY,aAAa,EAAU,CAAW,EAC1D,KAAK,QAAQ,EAAU,EAAa,CAAO,EACpC,EAGT,IAAM,EAAW,KAAK,UAAU,IAAI,CAAW,EAE/C,GAAI,GAAY,EAAS,YAAc,EAAS,UAAW,CACzD,KAAK,aAAa,EAAU,EAAS,UAAY,CAAC,CAAC,EACnD,EAAS,SAAS,KAAK,YAAY,CAAQ,CAAC,EAC5C,IAAM,EAAW,EAAS,WAAW,GAAK,EAE1C,OADA,KAAK,kBAAkB,EAAU,CAAQ,EAClC,EAGT,IAAM,EAAW,KAAK,MAAM,EAAU,CAAO,EAG7C,OAFA,EAAY,YAAY,aAAa,EAAU,CAAW,EAC1D,KAAK,QAAQ,EAAU,EAAa,CAAO,EACpC,EAGF,OAAO,CACZ,EACA,EACA,EACM,CACN,IAAM,EAAW,KAAK,UAAU,IAAI,CAAW,EAC/C,GAAI,EACF,KAAK,cAAc,CAAQ,EAC3B,EAAS,QAAQ,EACjB,KAAK,mBAAmB,CAAQ,EAChC,EAAQ,gBAAgB,CAAQ,EAI5B,WAAW,CAAC,EAAsC,CACxD,MAAO,IACD,EAAM,OAAS,CAAC,EACpB,SAAU,EAAW,EAAM,QAAQ,CACrC,EAGM,YAAY,CAClB,EACA,EACM,CACN,IAAM,EAAU,KAAK,qBAAqB,IAAI,CAAQ,GAAK,IAAI,IAE/D,EAAQ,QAAQ,EAAG,SAAU,EAAiB,eAAe,IAAc,CACzE,IAAM,EAAW,EAAS,GAC1B,GAAI,CAAC,GAAY,IAAa,EAC5B,EAAY,EACZ,EAAQ,OAAO,CAAS,EAE3B,EAED,OAAO,QAAQ,CAAQ,EAAE,QAAQ,EAAE,EAAW,KAAc,CAC1D,GAAI,EAAQ,IAAI,CAAS,GAAG,WAAa,EACvC,OAGF,EAAQ,IAAI,EAAW,CACrB,WACA,YAAa,EAAS,GAAG,EAAW,CAAQ,CAC9C,CAAC,EACF,EAED,KAAK,qBAAqB,IAAI,EAAU,CAAO,EAGzC,aAAa,CAAC,EAAmC,CACvD,KAAK,qBAAqB,IAAI,CAAQ,GAAG,QAAQ,EAAG,iBAAkB,CACpE,EAAY,EACb,EACD,KAAK,qBAAqB,OAAO,CAAQ,EAGnC,iBAAiB,CAAC,EAA6B,EAAkB,CACvE,KAAK,UAAU,IAAI,EAAM,CAAQ,EACjC,IAAM,EAAQ,KAAK,cAAc,IAAI,CAAQ,GAAK,IAAI,IACtD,EAAM,IAAI,CAAI,EACd,KAAK,cAAc,IAAI,EAAU,CAAK,EAGhC,kBAAkB,CAAC,EAAmC,CAC5D,KAAK,cAAc,IAAI,CAAQ,GAAG,QAAQ,CAAC,IAAS,CAClD,KAAK,UAAU,OAAO,CAAI,EAC3B,EACD,KAAK,cAAc,OAAO,CAAQ,EAEtC,CAEO,MAAM,EAA2D,CACrD,iBAAmB,IAAI,QAKjC,OAAO,CAAC,EAA0C,CACvD,OAAO,OAAO,IAAU,UAAY,IAAU,MAAQ,EAAe,CAAK,EAGrE,KAAK,CAAC,EAAqB,EAAqC,CACrE,GAAI,EAAM,YAAY,KAAO,GAC3B,OAAO,SAAS,cAAc,IAAI,EAGpC,IAAM,EAAgB,SAAS,cAAc,KAAK,EAOlD,OANA,EAAc,aAAa,YAAa,EAAM,MAAM,IAAI,EACxD,KAAK,kBACH,EACA,KAAK,gBAAgB,EAAO,CAAO,EACnC,CACF,EACO,EAGF,KAAK,CACV,EACA,EACA,EACA,EACM,CACN,GAAI,EAAY,WAAa,KAAK,aAAc,CAC9C,IAAM,EAAW,KAAK,MAAM,EAAU,CAAO,EAE7C,OADA,EAAY,YAAY,aAAa,EAAU,CAAW,EACnD,EAGT,GAAI,EAAS,YAAY,KAAO,GAAO,CACrC,IAAM,EAAW,SAAS,cAAc,IAAI,EAG5C,OAFA,EAAY,YAAY,aAAa,EAAU,CAAW,EAC1D,KAAK,QAAQ,EAAU,EAAa,CAAO,EACpC,EAGT,GAAI,aAAuB,YACzB,EAAY,aAAa,YAAa,EAAS,MAAM,IAAI,EACzD,KAAK,oBAAoB,EAAa,EAAU,EAAU,CAAO,EAEnE,OAAO,EAGF,OAAO,CACZ,EACA,EACA,EACM,CACN,GAAI,EAAE,aAAuB,aAC3B,OAGF,KAAK,oBAAoB,EAAa,CAAO,EAC7C,KAAK,iBAAiB,OAAO,CAAW,EAGlC,eAAe,CACrB,EACA,EACuB,CACvB,OAAO,EAAQ,MAAM,EAAM,MAAM,OAAS,EAAW,EAAM,QAAQ,EAG7D,mBAAmB,CACzB,EACA,EACA,EACA,EACM,CACN,IAAM,EAAc,KAAK,iBAAiB,IAAI,CAAO,GAAK,CAAC,EACrD,EAAc,KAAK,gBAAgB,EAAU,CAAO,EACpD,EAAe,KAAK,IAAI,EAAY,OAAQ,EAAY,MAAM,EAIpE,QAAS,EAAQ,EAAG,EAAQ,EAAc,GAAS,EAAG,CACpD,IAAM,EAAY,EAAQ,WAAW,GACrC,GAAI,CAAC,EAAW,CACd,EAAQ,YACN,EAAQ,SAAS,MAAM,EAAY,GAAQ,CAAO,CACpD,EACA,SAEF,EAAQ,SAAS,MACf,EAAY,GACZ,EAAY,GACZ,EACA,CACF,EAGF,QAAS,EAAQ,EAAc,EAAQ,EAAY,OAAQ,GAAS,EAClE,EAAQ,YAAY,EAAQ,SAAS,MAAM,EAAY,GAAQ,CAAO,CAAC,EAGzE,QACM,EAAQ,EAAY,OAAS,EACjC,GAAS,EAAY,OACrB,GAAS,EACT,CACA,IAAM,EAAY,EAAQ,WAAW,GACrC,GAAI,GAEF,GADA,EAAQ,SAAS,QAAQ,EAAY,GAAQ,EAAW,CAAO,EAC3D,EAAU,aAAe,EAC3B,EAAQ,YAAY,CAAS,GAKnC,KAAK,iBAAiB,IAAI,EAAS,CAAW,EAGxC,iBAAiB,CACvB,EACA,EACA,EACM,CACN,EAAS,QAAQ,CAAC,IAAU,CAC1B,EAAQ,YAAY,EAAQ,SAAS,MAAM,EAAO,CAAO,CAAC,EAC3D,EACD,KAAK,iBAAiB,IAAI,EAAS,CAAQ,EAGrC,mBAAmB,CACzB,EACA,EACM,EACW,KAAK,iBAAiB,IAAI,CAAO,GAAK,CAAC,GAC/C,QAAQ,CAAC,EAAO,IAAU,CACjC,IAAM,EAAY,EAAQ,WAAW,GACrC,GAAI,EACF,EAAQ,SAAS,QAAQ,EAAO,EAAW,CAAO,EAErD,EAEL,CCvYO,MAAM,CAAe,CAIP,MAHX,SAA8B,CAAC,EACtB,cAAgB,aAEjC,WAAW,CAAQ,EAAe,CAAf,aACjB,GAAI,CAAC,GAAS,OAAO,IAAU,SAC7B,MAAU,MAAM,8CAA8C,EAS3D,aAAa,CAAC,EAAoB,CACvC,GAAI,OAAO,IAAS,SAClB,EAAO,OAAO,CAAI,EAGpB,IAAM,EAAW,SAAS,eAAe,EAAE,EAC3C,KAAK,cAAc,UAAY,EAC/B,IAAM,EAAU,MAAM,KAAK,EAAK,SAAS,KAAK,aAAa,CAAC,EAE5D,GAAI,GAAW,EAAQ,OAAS,EAC9B,KAAK,sBAAsB,EAAU,EAAM,CAAO,EAGlD,OAAS,YAAc,EAGzB,OAAO,EAMD,qBAAqB,CAC3B,EACA,EACA,EACM,CAEN,IAAM,EAAO,IAAI,IAGX,EAAc,KAAK,iBAAiB,EAAc,EAAS,CAAI,EACrE,EAAK,YAAc,EAGnB,IAAM,EAAW,EAAO,IAAM,CAC5B,GAAI,CACF,IAAM,EAAc,KAAK,iBAAiB,EAAc,EAAS,CAAI,EACrE,GAAI,EAAK,cAAgB,EACvB,EAAK,YAAc,EAErB,MAAO,EAAO,CACd,QAAQ,MAAM,yBAA0B,CAAK,EAC7C,EAAK,YAAc,UAAU,aAAiB,MAAQ,EAAM,QAAU,mBAEzE,EAGD,KAAK,SAAS,KAAK,CACjB,OACA,eACA,OAAQ,CACV,CAAC,EAMK,gBAAgB,CACtB,EACA,EACA,EACQ,CACR,IAAI,EAAS,EAgBb,OAdA,EAAQ,QAAQ,CAAC,IAAU,CACzB,IAAM,EAAM,EAAM,IAAI,KAAK,EAC3B,GAAI,EAAK,CACP,EAAK,IAAI,CAAG,EAGZ,IAAM,EAAQ,KAAK,kBAAkB,CAAG,EAElC,EACJ,IAAU,QAAa,IAAU,KAAO,GAAK,OAAO,CAAK,EAC3D,EAAS,EAAO,QAAQ,EAAM,GAAI,CAAY,GAEjD,EAEM,EAMD,iBAAiB,CAAC,EAA0B,CAClD,GAAI,CAAC,EAAS,OAGd,IAAM,EAAO,EAAQ,MAAM,GAAG,EAC1B,EAAiB,KAAK,MAE1B,QAAW,KAAO,EAAM,CACtB,GAAI,CAAC,GAAS,OAAO,IAAU,SAC7B,OAEF,EAAS,EAAkC,GAG7C,OAAO,EAMF,aAAa,EAAS,CAE3B,KAAK,SAAS,QAAQ,CAAC,IAAY,CACjC,EAAK,EAAQ,MAAM,EACpB,EACD,KAAK,SAAW,CAAC,EAMZ,eAAe,EAAW,CAC/B,OAAO,KAAK,SAAS,OAMhB,cAAc,CAAC,EAAuB,CAE3C,OADA,KAAK,cAAc,UAAY,EACxB,KAAK,cAAc,KAAK,CAAI,EAM9B,WAAW,CAAC,EAAwB,CACzC,IAAM,EAAiB,CAAC,EACpB,EACE,EAAQ,IAAI,OAAO,KAAK,cAAe,GAAG,EAEhD,OAAQ,EAAQ,EAAM,KAAK,CAAI,KAAO,KAAM,CAC1C,IAAM,EAAM,EAAM,IAAI,KAAK,EAC3B,GAAI,EACF,EAAK,KAAK,CAAG,EAIjB,OAAO,EAMF,qBAAqB,CAAC,EAAsB,CACjD,KAAK,cAAc,UAAY,EAC/B,IAAM,EAAU,MAAM,KAAK,EAAK,SAAS,KAAK,aAAa,CAAC,EAC5D,GAAI,CAAC,GAAW,EAAQ,SAAW,EACjC,OAAO,EAGT,IAAM,EAAO,IAAI,IACjB,OAAO,KAAK,iBAAiB,EAAM,EAAS,CAAI,EAEpD,CC5IO,MAAe,CAGS,CAmBP,MAlBd,MAAsB,KACtB,GAAkB,KACT,SAAW,IAAI,EACf,eACA,gBAAkB,IAAI,IACtB,eACf,CAAC,EACc,UAAY,IAAI,IAChB,aACT,WAAsB,KACtB,gBAA4C,KAC5C,sBACwD,KAEtD,aACH,MACA,QAAU,GAEjB,WAAW,CAAW,EAAgB,CAAC,EAAa,CAA9B,aACpB,KAAK,aAAe,IAAI,GACxB,KAAK,MAAQ,EAAS,KAAK,UAAU,GAAK,CAAC,CAAC,EAC5C,KAAK,eAAiB,IAAI,EAAe,KAAK,KAAK,EACnD,KAAK,WAAW,EAEhB,KAAK,aAAe,EAClB,IAAM,CAGJ,GAAI,KAAK,QACP,GAAI,CACF,KAAK,OAAO,EACZ,MAAO,EAAO,CACd,GAAI,CAAC,KAAK,cAAc,CAAK,EAC3B,MAAM,IAKd,CACE,aAAc,GAEd,UAAW,CAAC,IAAiB,CAC3B,EAAkB,QAAQ,CAAY,EAE1C,CACF,EAOK,KAAK,CAAC,EAA8B,CACzC,GAAI,CAAC,GAAa,EAAE,aAAqB,aACvC,MAAU,MAAM,2BAA2B,EAG7C,GAAI,CACF,EAAU,YAAY,KAAK,YAAY,CAAC,EACxC,MAAO,EAAO,CAEd,MADA,QAAQ,MAAM,UAAW,CAAK,EACxB,GAIH,WAAW,EAAS,CACzB,GAAI,KAAK,SAAW,KAAK,GACvB,OAAO,KAAK,GAuBd,OApBA,KAAK,YAAY,EAGjB,KAAK,GAAK,EAAe,YAAY,EAAE,cACrC,KAAK,aACL,IAAM,CACJ,GAAI,CAEF,OADA,KAAK,MAAQ,KAAK,OAAO,EAClB,KAAK,SAAS,MAAM,KAAK,MAAO,KAAK,oBAAoB,CAAC,EACjE,MAAO,EAAO,CAEd,GAAI,KAAK,cAAc,CAAK,EAC1B,OAAO,SAAS,cAAc,gBAAgB,EAEhD,MAAM,GAGZ,EACA,KAAK,QAAU,GACf,KAAK,UAAU,EACR,KAAK,GAGP,MAAM,EAAS,CACpB,GAAI,CAAC,KAAK,IAAM,CAAC,KAAK,MACpB,OAGF,KAAK,aAAa,EAClB,IAAM,EAAe,KAAK,MACpB,EAAiB,KAAK,GAgB5B,GAdA,KAAK,GAAK,EAAe,YAAY,EAAE,cACrC,KAAK,aACL,IAAM,CACJ,IAAM,EAAW,KAAK,OAAO,EACvB,EAAc,KAAK,SAAS,MAChC,EACA,EACA,EACA,KAAK,oBAAoB,CAC3B,EAEA,OADA,KAAK,MAAQ,EACN,EAEX,EACI,IAAmB,KAAK,GAC1B,KAAK,wBAAwB,EAAgB,KAAK,EAAE,EAEtD,KAAK,UAAU,EAGV,OAAO,EAAS,CACrB,GAAI,CAAC,KAAK,QACR,OAKF,GAFA,KAAK,cAAc,EAEf,KAAK,OAAS,KAAK,GACrB,KAAK,SAAS,QAAQ,KAAK,MAAO,KAAK,GAAI,KAAK,oBAAoB,CAAC,EAevE,GAZA,KAAK,gBAAgB,MAAM,EAC3B,OAAO,KAAK,KAAK,cAAc,EAAE,QAAQ,CAAC,IAAc,CACtD,KAAK,eAAe,GAAW,MAAM,EACrC,OAAO,KAAK,eAAe,GAC5B,EACD,KAAK,UAAU,MAAM,EACrB,KAAK,gBAAkB,KACvB,KAAK,sBAAwB,KAC7B,KAAK,eAAe,cAAc,EAClC,KAAK,aAAa,QAAQ,EAC1B,EAAK,KAAK,YAAY,EAElB,KAAK,IAAI,WACX,KAAK,GAAG,WAAW,YAAY,KAAK,EAAE,EAGxC,KAAK,GAAK,KACV,KAAK,MAAQ,KACb,KAAK,QAAU,GACf,KAAK,YAAY,EAGZ,QAAQ,CAAC,EAA8B,CAM5C,GALA,KAAK,MAAQ,IACR,KAAK,SACL,CACL,EAEI,KAAK,QAEP,EAAkB,QAAQ,KAAK,YAAY,EAIxC,QAAQ,CAAC,EAA8B,CAC5C,OAAO,OAAO,KAAK,MAAO,CAAK,EAG1B,aAAa,CAAC,EAAwB,CAC3C,KAAK,WAAa,EAClB,KAAK,gBAAgB,QAAQ,CAAC,IAAU,CACtC,EAAM,gBAAgB,CAAO,EAC9B,EAGI,kBAAkB,CAAC,EAAwC,CAChE,KAAK,gBAAkB,EAGlB,kBAAkB,EAA6B,CACpD,OAAO,KAAK,gBAGP,wBAAwB,CAC7B,EACM,CACN,KAAK,sBAAwB,EAGxB,OAAU,CAAC,EAAsB,EAAgB,CACtD,KAAK,UAAU,IAAI,EAAK,CAAK,EAKxB,MAAS,CAAC,EAAsB,EAA6B,CAClE,IAAM,EAAS,KAAK,iBAAiB,CAAG,EACxC,OAAO,EAAO,MAAQ,EAAO,MAAQ,EAGhC,gBAAmB,CAAC,EAA0C,CACnE,GAAI,KAAK,UAAU,IAAI,CAAG,EACxB,MAAO,CAAE,MAAO,GAAM,MAAO,KAAK,UAAU,IAAI,CAAG,CAAmB,EAGxE,GAAI,KAAK,iBAAiB,iBACxB,OAAO,KAAK,gBAAgB,iBAAiB,CAAG,EAGlD,OAAO,KAAK,oBAAoB,CAAG,EAG9B,UAAU,EAAgB,CAC/B,OAAO,KAAK,GAGJ,WAAW,EAAS,EAEpB,SAAS,EAAS,EAElB,YAAY,EAAS,EAErB,SAAS,EAAS,EAElB,aAAa,EAAS,EAEtB,WAAW,EAAS,EAetB,aAAa,CAAC,EAAyB,CAC7C,IAAI,EAAoC,KAAK,mBAAmB,EAChE,MAAO,EAAS,CAEd,IAAM,EAAW,EACjB,GAAI,OAAO,EAAS,kBAAoB,YAEtC,GADgB,EAAS,gBAAgB,EAAO,IAAI,IACpC,GACd,MAAO,GAGX,EAAU,EAAQ,qBAAqB,GAAK,KAE9C,MAAO,GAGC,UAAU,EAAY,CAC9B,OAAO,KAAK,cAGA,OAAM,EAAG,CACrB,OAAO,KAAK,cAAc,KAAK,UAAU,GAAK,KAAK,uBAAuB,EAGlE,IAAI,CAAC,KAAsB,EAAuB,CAC1D,KAAK,eAAe,IAAY,QAAQ,CAAC,IAAa,CACpD,EAAS,GAAG,CAAI,EACjB,EAGI,EAAE,CAAC,EAAmB,EAA8C,CACzE,GAAI,CAAC,KAAK,eAAe,GACvB,KAAK,eAAe,GAAa,IAAI,IAIvC,OAFA,KAAK,eAAe,GAAW,IAAI,CAAQ,EAEpC,IAAM,KAAK,IAAI,EAAW,CAAQ,EAGpC,GAAG,CAAC,EAAmB,EAAwC,CACpE,KAAK,eAAe,IAAY,OAAO,CAAQ,EAGzC,mBAAmB,EAAyB,CAClD,MAAO,CACL,WAAY,KAAK,WACjB,eAAgB,KAAK,eACrB,SAAU,KAAK,SACf,MAAO,KAAK,aAAa,EACzB,cAAe,CAAC,IAAc,CAC5B,KAAK,gBAAgB,IAAI,CAAS,EAClC,EAAU,qBAAqB,IAAI,EACnC,EAAU,gBAAgB,KAAK,UAAU,GAE3C,gBAAiB,CAAC,IAAc,CAC9B,KAAK,gBAAgB,OAAO,CAAS,EACrC,EAAU,qBAAqB,IAAI,EAEvC,EAGM,YAAY,EAA0C,CAC5D,IAAM,EAA+C,CAAE,QAAS,CAAC,CAAE,EAanE,OAZiB,EACd,KAAK,MAA+C,QACvD,EAES,QAAQ,CAAC,IAAU,CAC1B,IAAM,EAAW,KAAK,YAAY,CAAK,EACvC,GAAI,CAAC,EAAM,GACT,EAAM,GAAY,CAAC,EAErB,EAAM,GAAU,KAAK,KAAK,mBAAmB,CAAK,CAAC,EACpD,EAEM,EAGD,WAAW,CAAC,EAA+B,CACjD,GAAI,OAAO,IAAU,SACnB,MAAO,UAGT,MAAO,SAAU,GAAS,OAAO,EAAM,OAAS,SAC5C,EAAM,KACN,UAGE,kBAAkB,CAAC,EAAuC,CAChE,GAAI,OAAO,IAAU,UAAY,EAAE,SAAU,GAC3C,OAAO,EAGT,IAAM,EAAQ,IAAK,CAAM,EAEzB,OADA,OAAO,EAAM,KACN,EAGD,aAAa,CAAC,EAAyB,CAC7C,GAAI,CAAC,GAAS,OAAO,IAAU,UAAY,EAAE,WAAY,GACvD,OAGF,OAAQ,EAA+B,OAGjC,sBAAsB,EAAY,CACxC,IAAM,EAAa,WAAqC,QACxD,OAAO,KAAK,cAAc,CAAS,EAG7B,mBAAsB,CAAC,EAA0C,CACvE,GAAI,CAAC,KAAK,YAAc,OAAO,KAAK,aAAe,SACjD,MAAO,CAAE,MAAO,GAAO,MAAO,MAAU,EAa1C,OATE,KAAK,WAOL,KAEU,mBAAmB,CAAG,GAAK,CAAE,MAAO,GAAO,MAAO,MAAU,EAE5E,CC/ZA,IAAI,EAAwB,KAMrB,SAAS,EAAS,CAAC,EAAiB,CACzC,GAAI,CAAC,GAAK,EAAE,aAAa,GACvB,MAAU,MAAM,yBAAyB,EAE3C,EAAS,EAQJ,SAAS,EAAS,EAAW,CAClC,GAAI,CAAC,EACH,MAAU,MACR,mFACF,EAEF,OAAO,ECpBF,SAAS,CAAa,CAAC,EAAsB,CAClD,GAAI,CAAC,EAAK,WAAW,GAAG,EACtB,MAAO,IAAI,IAEb,OAAO,GAAQ,IAGV,SAAS,CAAU,CACxB,EACA,EACmB,CACnB,IAAM,EAAiB,EAAc,EAAK,MAAM,GAAG,EAAE,EAAE,EAEvD,QAAW,KAAS,EAAQ,CAC1B,GAAI,EAAM,OAAS,IACjB,SAEF,IAAM,EAAS,GAAe,EAAM,KAAM,CAAc,EACxD,GAAI,EACF,MAAO,CAAE,QAAO,QAAO,EAK3B,IAAM,EAAW,EAAO,KAAK,CAAC,IAAU,EAAM,OAAS,GAAG,EAC1D,GAAI,EACF,MAAO,CACL,MAAO,EACP,OAAQ,CAAE,UAAW,CAAe,CACtC,EAGF,IAAM,EAAW,EAAO,KAAK,CAAC,IAAU,EAAM,OAAS,GAAG,EAC1D,OAAO,EAAW,CAAE,MAAO,EAAU,OAAQ,CAAC,CAAE,EAAI,KAGtD,SAAS,EAAc,CACrB,EACA,EAC+B,CAC/B,IAAM,EAAgB,GAAgB,CAAS,EACzC,EAAkB,GAAgB,CAAW,EAEnD,GAAI,EAAc,SAAW,EAAgB,OAC3C,OAAO,KAGT,IAAM,EAAiC,CAAC,EAExC,QAAS,EAAQ,EAAG,EAAQ,EAAc,OAAQ,GAAS,EAAG,CAC5D,IAAM,EAAe,EAAc,GAC7B,EAAiB,EAAgB,GAEvC,GAAI,EAAa,WAAW,GAAG,EAAG,CAChC,IAAM,EAAY,EAAa,MAAM,CAAC,EACtC,GAAI,CAAC,EACH,OAAO,KAET,EAAO,mBAAmB,CAAS,GACjC,mBAAmB,CAAc,EACnC,SAGF,GAAI,IAAiB,EACnB,OAAO,KAIX,OAAO,EAGT,SAAS,EAAe,CAAC,EAAwB,CAC/C,IAAM,EAAiB,EAAc,CAAI,EACzC,GAAI,IAAmB,IACrB,MAAO,CAAC,EAGV,OAAO,EAAe,MAAM,GAAG,EAAE,OAAO,OAAO,EC/E1C,SAAS,EAAgB,CAC9B,EACA,EACA,EACQ,CACR,IAAM,EAAiB,EAAc,CAAI,EACnC,EAAW,IAAS,IAAM,EAAiB,EAAO,EACxD,OAAO,IAAS,OAAS,IAAI,IAAa,EAGrC,SAAS,EAAkB,CAChC,EACA,EACe,CACf,IAAI,EACA,EACA,EAEJ,GAAI,IAAS,UACX,EAAW,OAAO,SAAS,SAAW,OAAO,SAAS,OACtD,EAAO,OAAO,SAAS,SACvB,EAAc,OAAO,SAAS,OACzB,KAEL,EADa,OAAO,SAAS,MACV,KACnB,EAAO,EAAS,WAAW,GAAG,EAAI,EAAS,MAAM,CAAC,EAAI,EACtD,IAAM,EAAa,EAAK,QAAQ,GAAG,EACnC,EAAc,GAAc,EAAI,EAAK,MAAM,EAAa,CAAC,EAAI,GAC7D,EAAO,GAAc,EAAI,EAAK,MAAM,EAAG,CAAU,EAAI,EAGvD,GAAI,EAAK,WAAW,CAAI,GAAK,IAAS,KAAO,IAAS,IACpD,EAAO,EAAK,MAAM,EAAK,MAAM,EAK/B,OAFA,EAAO,EAAc,CAAI,EAElB,CACL,OACA,WACA,MAAO,GAAW,CAAW,EAC7B,OAAQ,CAAC,CACX,EAGK,SAAS,CAAe,CAC7B,EACA,EACA,EACA,EACM,CACN,IAAM,EAAiB,EAAc,CAAI,EACnC,EAAW,IAAS,IAAM,EAAiB,EAAO,EAExD,GAAI,IAAS,UAAW,CACtB,GAAI,EACF,OAAO,QAAQ,aAAa,CAAC,EAAG,GAAI,CAAQ,EAE5C,YAAO,QAAQ,UAAU,CAAC,EAAG,GAAI,CAAQ,EAE3C,OAGF,GAAI,EAAS,CACX,IAAM,EAAO,OAAO,SAAS,KAAK,MAAM,GAAG,EAAE,GAC7C,OAAO,SAAS,QAAQ,GAAG,KAAQ,GAAU,EAC7C,OAGF,OAAO,SAAS,KAAO,EAGzB,SAAS,EAAU,CAAC,EAA6C,CAC/D,IAAM,EAAgC,CAAC,EACjC,EAAkB,EAAY,WAAW,GAAG,EAC9C,EAAY,MAAM,CAAC,EACnB,EAEJ,GAAI,CAAC,EACH,OAAO,EAUT,OAPA,EAAgB,MAAM,GAAG,EAAE,QAAQ,CAAC,IAAU,CAC5C,IAAO,EAAK,GAAS,EAAM,MAAM,GAAG,EACpC,GAAI,EACF,EAAM,mBAAmB,CAAG,GAAK,EAAQ,mBAAmB,CAAK,EAAI,GAExE,EAEM,EC7CT,SAAS,EAAkB,CAAC,EAA0C,CACpE,IAAM,EAAa,EAAS,QAAQ,GAAG,EACvC,GAAI,EAAa,EACf,MAAO,CAAC,EAGV,IAAM,EAAc,EAAS,MAAM,EAAa,CAAC,EAC3C,EAAgC,CAAC,EACvC,GAAI,CAAC,EACH,OAAO,EAUT,OAPA,EAAY,MAAM,GAAG,EAAE,QAAQ,CAAC,IAAU,CACxC,IAAO,EAAK,GAAS,EAAM,MAAM,GAAG,EACpC,GAAI,EACF,EAAM,mBAAmB,CAAG,GAAK,EAAQ,mBAAmB,CAAK,EAAI,GAExE,EAEM,EAYF,MAAM,CAAO,CACR,aAAmC,KACnC,gBAAwC,KACjC,OAAwB,CAAC,EAClC,IAAqB,KACZ,KACA,KACA,qBAA8C,CAAC,EAC/C,aAAkC,CAAC,EACnC,WAAoC,CAAC,EAC9C,qBAER,WAAW,CAAC,EAAwC,CAClD,IAAM,EAAkB,MAAM,QAAQ,CAAO,EACzC,CAAE,OAAQ,CAAQ,EAClB,EAEJ,KAAK,OAAS,EAAgB,QAAU,CAAC,EACzC,KAAK,KAAO,EAAgB,MAAQ,UACpC,KAAK,KAAO,EAAgB,MAAQ,IACpC,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,oBAAoB,EAGpB,OAAO,CAAC,EAAmB,CAChC,KAAK,IAAM,EACX,EAAI,OAAS,KACb,GAAU,IAAI,EAEd,IAAM,EAAU,EAAI,WAAW,EAC/B,EAAQ,OAAS,KAEjB,KAAK,oBAAoB,EAGpB,IAAI,CAAC,EAAoB,CAC9B,KAAK,SAAS,EAAM,EAAK,EAGpB,OAAO,CAAC,EAAoB,CACjC,KAAK,SAAS,EAAM,EAAI,EAGnB,OAAO,EAAS,CACrB,OAAO,QAAQ,QAAQ,EAGlB,IAAI,EAAS,CAClB,OAAO,QAAQ,KAAK,EAGf,EAAE,CAAC,EAAqB,CAC7B,OAAO,QAAQ,GAAG,CAAK,EAGlB,eAAe,EAAyB,CAC7C,GAAI,CAAC,KAAK,gBACR,KAAK,oBAAoB,EAE3B,OAAO,KAAK,gBAGP,qBAAqB,EAAuB,CACjD,GAAI,CAAC,KAAK,aACR,KAAK,oBAAoB,EAE3B,OAAO,KAAK,aAGP,aAAa,CAAC,EAA2C,CAG9D,OAFA,KAAK,qBAAqB,KAAK,CAAQ,EAEhC,IAAM,CACX,IAAM,EAAQ,KAAK,qBAAqB,QAAQ,CAAQ,EACxD,GAAI,EAAQ,GACV,KAAK,qBAAqB,OAAO,EAAO,CAAC,GAQxC,UAAU,CAAC,EAAoC,CAGpD,OAFA,KAAK,aAAa,KAAK,CAAK,EAErB,IAAM,CACX,IAAM,EAAQ,KAAK,aAAa,QAAQ,CAAK,EAC7C,GAAI,EAAQ,GACV,KAAK,aAAa,OAAO,EAAO,CAAC,GAQhC,SAAS,CAAC,EAAuC,CAGtD,OAFA,KAAK,WAAW,KAAK,CAAI,EAElB,IAAM,CACX,IAAM,EAAQ,KAAK,WAAW,QAAQ,CAAI,EAC1C,GAAI,EAAQ,GACV,KAAK,WAAW,OAAO,EAAO,CAAC,GAK9B,SAAS,EAAkB,CAChC,MAAO,CAAC,GAAG,KAAK,MAAM,EAGjB,QAAQ,CAAC,EAA0B,CACxC,GAAI,KAAK,OAAO,KAAK,CAAC,IAAS,EAAK,OAAS,EAAM,IAAI,EACrD,MAAU,MAAM,yBAAyB,EAAM,MAAM,EAMvD,GAHA,KAAK,OAAO,KAAK,CAAK,EAEL,KAAK,mBAAmB,EAC5B,OAAS,EAAM,KAC1B,KAAK,kBAAkB,EAIpB,UAAU,CAAC,EAAsB,CACtC,OAAO,GAAiB,EAAM,KAAK,KAAM,KAAK,IAAI,EAG7C,OAAO,EAAS,CAGrB,GAFA,KAAK,uBAAuB,EAC5B,KAAK,qBAAuB,OACxB,KAAK,KAAK,SAAW,KACvB,KAAK,IAAI,OAAS,OAEpB,KAAK,IAAM,KAGL,QAAQ,CAAC,EAAc,EAAwB,CACrD,GAAI,CAAC,GAAQ,OAAO,IAAS,SAC3B,MAAU,MAAM,iCAAiC,EAGnD,IAAM,EAAO,KAAK,gBACZ,EAAS,KAAK,cAAc,CAAI,EACtC,GAAI,CAAC,EACH,OAGF,IAAM,EAAK,EAAO,SAGlB,QAAW,KAAS,KAAK,aAAc,CACrC,IAAM,EAAS,EAAM,EAAI,CAAI,EAC7B,GAAI,IAAW,GACb,OAEF,GAAI,OAAO,IAAW,UAAY,IAAW,EAAM,CACjD,KAAK,SAAS,EAAQ,CAAO,EAC7B,QAKJ,GAAI,GAAQ,KAAK,eAAe,EAAM,CAAE,EACtC,OAGF,EAAgB,EAAO,KAAM,EAAS,KAAK,KAAM,KAAK,IAAI,EAC1D,KAAK,aAAe,EAAO,MAC3B,KAAK,gBAAkB,EACvB,KAAK,4BAA4B,EAAI,CAAI,EACzC,KAAK,WAAW,QAAQ,CAAC,IAAS,CAChC,GAAI,CACF,EAAK,EAAI,CAAI,EACb,MAAO,EAAO,CACd,QAAQ,MAAM,yBAA0B,CAAK,GAEhD,EAMK,aAAa,CACnB,EACsE,CACtE,IAAM,EAAQ,EAAW,KAAK,OAAQ,EAAK,MAAM,GAAG,EAAE,EAAE,EACxD,GAAI,CAAC,EACH,OAAO,KAGT,IAAM,EAAa,KAAK,cAAc,CAAK,EACrC,EAAY,GAAY,MAAQ,EAChC,EAAQ,GAAY,OAAS,EAAM,MAEzC,MAAO,CACL,KAAM,EACN,QACA,SAAU,CACR,KAAM,EAAU,MAAM,GAAG,EAAE,GAC3B,MAAO,GAAmB,CAAS,EACnC,OAAQ,GAAY,QAAU,EAAM,OACpC,SAAU,EACV,KAAM,GAAO,KACb,KAAM,GAAO,IACf,CACF,EAMM,aAAa,CAAC,EAA0C,CAC9D,IAAM,EAAU,IAAI,IAChB,EAAU,EACV,EAAY,GAEhB,MAAO,EAAQ,MAAM,SAAU,CAC7B,GAAI,EAAQ,IAAI,EAAQ,MAAM,IAAI,EAChC,MAAU,MACR,qCAAqC,EAAQ,MAAM,MACrD,EAEF,EAAQ,IAAI,EAAQ,MAAM,IAAI,EAC9B,EAAY,EAAQ,MAAM,SAC1B,IAAM,EAAO,EAAW,KAAK,OAAQ,EAAU,MAAM,GAAG,EAAE,EAAE,EAC5D,GAAI,CAAC,EACH,OAAO,KAET,EAAU,EAGZ,OAAO,EACH,CAAE,MAAO,EAAQ,MAAO,OAAQ,EAAQ,OAAQ,KAAM,CAAU,EAChE,KAGE,cAAc,EAAS,CAC7B,GAAI,CAAC,MAAM,QAAQ,KAAK,MAAM,EAC5B,MAAU,MAAM,gCAAgC,EAGlD,IAAM,EAAQ,IAAI,IAClB,KAAK,OAAO,QAAQ,CAAC,IAAU,CAC7B,GAAI,CAAC,EAAM,WAAa,CAAC,EAAM,SAC7B,MAAU,MACR,SAAS,EAAM,0CACjB,EAEF,GAAI,EAAM,IAAI,EAAM,IAAI,EACtB,MAAU,MAAM,yBAAyB,EAAM,MAAM,EAEvD,EAAM,IAAI,EAAM,IAAI,EACrB,EAGK,UAAU,EAAS,CACzB,GAAI,OAAO,OAAW,IACpB,OAGF,IAAM,EAAY,KAAK,OAAS,UAAY,WAAa,aACnD,EAAW,IAAY,CAC3B,KAAK,kBAAkB,GAGzB,OAAO,iBAAiB,EAAW,CAAQ,EAC3C,KAAK,qBAAuB,IAAM,CAChC,OAAO,oBAAoB,EAAW,CAAQ,GAI1C,iBAAiB,EAAS,CAChC,IAAM,EAAe,KAAK,gBACpB,EAAe,KAAK,oBAAoB,EAE9C,GAAI,CAAC,KAAK,eAAe,EAAc,CAAY,EACjD,KAAK,4BAA4B,EAAc,CAAY,EAIvD,mBAAmB,EAAkB,CAC3C,IAAM,EAAW,KAAK,mBAAmB,EACnC,EAAQ,EAAW,KAAK,OAAQ,EAAS,IAAI,EAC7C,EAAa,EAAQ,KAAK,cAAc,CAAK,EAAI,KACjD,EAAQ,GAAY,OAAS,GAAO,OAAS,KAGnD,GAAI,GAAc,EAAW,OAAS,EAAS,KAC7C,EAAgB,EAAW,KAAM,GAAM,KAAK,KAAM,KAAK,IAAI,EAW7D,OARA,KAAK,aAAe,EACpB,KAAK,gBAAkB,IAClB,EACH,OAAQ,GAAY,QAAU,GAAO,QAAU,CAAC,EAChD,KAAM,GAAO,KACb,KAAM,GAAO,IACf,EAEO,KAAK,gBAGN,kBAAkB,EAAkB,CAC1C,OAAO,GAAmB,KAAK,KAAM,KAAK,IAAI,EAGxC,cAAc,CACpB,EACA,EACS,CACT,OAAO,GAAM,WAAa,GAAI,UAAY,GAAM,OAAS,GAAI,KAGvD,2BAA2B,CACjC,EACA,EACM,CACN,KAAK,qBAAqB,QAAQ,CAAC,IAAa,CAC9C,GAAI,CACF,EAAS,EAAI,CAAI,EACjB,MAAO,EAAO,CACd,QAAQ,MAAM,+BAAgC,CAAK,GAEtD,EAEL,CAcO,MAAM,WAAmB,CAA4C,CAClE,YAEE,SAAS,EAAoB,CAErC,MAAO,CACL,YAFa,KAAK,QAEG,gBAAgB,GAAG,MAAQ,OAAO,SAAS,QAClE,EAGQ,UAAU,EAAS,EAEnB,SAAS,EAAS,CAC1B,IAAM,EAAS,KAAK,OACpB,KAAK,YAAc,GAAQ,cAAc,CAAC,IAAO,CAC/C,KAAK,MAAM,YAAc,EAAG,KAC7B,EAGO,WAAW,EAAS,CAC5B,KAAK,cAAc,EAGX,MAAM,EAAU,CACxB,IAAM,EAAS,KAAK,OACd,EAAc,KAAK,MAAM,aAAe,SACxC,EAAW,KAAK,MAAM,cAAgB,KAAK,MAAM,GACjD,EAAY,CAAC,KAAK,MAAM,UAAW,EAAW,EAAc,MAAS,EACxE,OAAO,OAAO,EACd,KAAK,GAAG,EAEX,MAAO,CACL,IAAK,IACL,MAAO,CACL,KAAM,GAAQ,WAAW,KAAK,MAAM,EAAE,GAAK,KAAK,MAAM,GACtD,WACF,EACA,UAAW,CACT,MAAO,CAAC,IAAiB,CAEvB,GADA,EAAM,eAAe,EACjB,KAAK,MAAM,QACb,GAAQ,QAAQ,KAAK,MAAM,EAAE,EAE7B,QAAQ,KAAK,KAAK,MAAM,EAAE,EAGhC,EACA,SACE,KAAK,MAAM,UAAY,KAAK,MAAM,SAAS,OAAS,EAChD,KAAK,MAAM,SACX,CAAC,KAAK,MAAM,EAAE,CACtB,EAEJ,CAOO,MAAM,WAAmB,CAAmC,CACzD,YAEE,SAAS,EAAoB,CACrC,IAAM,EAAS,KAAK,OACpB,MAAO,CACL,MAAO,GAAQ,gBAAgB,GAAK,KACpC,OAAQ,GAAQ,sBAAsB,GAAK,IAC7C,EAGQ,UAAU,EAAS,EAEnB,SAAS,EAAS,CAC1B,IAAM,EAAS,KAAK,OACpB,KAAK,YAAc,GAAQ,cAAc,CAAC,IAAO,CAC/C,KAAK,MAAM,MAAQ,EACnB,KAAK,MAAM,OAAS,EAAO,sBAAsB,EAClD,EAGO,WAAW,EAAS,CAC5B,KAAK,cAAc,EAGX,MAAM,EAAU,CACxB,IAAM,EACJ,KAAK,MAAM,QACV,KAAK,QAA+B,sBAAsB,EAE7D,MAAO,CACL,IAAK,MACL,MAAO,CAAE,mBAAoB,EAAG,EAChC,SAAU,GAAa,UACnB,CAAC,CAAE,UAAW,EAAY,SAAU,CAAC,EACrC,CAAC,CACP,EAEJ,CAEO,SAAS,EAAY,CAAC,EAAgD,CAC3E,OAAO,IAAI,EAAO,CAAO,EC1d3B,IAAM,GAAiB,IAAI,IAAI,CAAC,OAAQ,OAAQ,MAAM,CAAC,EAEhD,SAAS,EAAkB,CAAC,EAAsC,CACvE,IAAM,EAAO,EAAQ,MAAQ,KACvB,EAAU,EAAQ,SAAW,QAC7B,EAAW,EAAQ,UAAY,sCAC/B,EAAiB,EAAiB,CACtC,UACI,EAAQ,gBAAkB,CAAC,CACjC,CAAC,EACK,EAAiB,EAAiB,EAAQ,cAAc,EACxD,EAAW,GAAmB,EAAQ,IAAI,EAEhD,MAAO,CACL,kBACA,QAAQ,KACR,SACA,oBAAoB,EAAW,CAAO,MACtC,oCAAoC,EAAW,CAAQ,MACvD,YAAY,EAAW,EAAQ,KAAK,YACpC,EAAQ,YACJ,uCAAuC,EACrC,EAAQ,WACV,MACA,GACJ,IAAI,EAAQ,MAAQ,CAAC,GAAG,IAAI,CAAC,IAAY,KAAK,GAAkB,CAAO,GAAG,EAC1E,EAAQ,QAAU,EAAQ,OAAO,OAAS,EACtC,YAAY,EAAiB,EAAQ,MAAM,YAC3C,GACJ,UACA,QAAQ,KACR,EACA,IAAI,EAAQ,SAAW,CAAC,GAAG,IAAI,CAAC,IAAW,KAAK,GAAa,CAAM,GAAG,EACtE,UACA,SACF,EACG,OAAO,CAAC,IAAS,IAAS,EAAE,EAC5B,KAAK;AAAA,CAAI,EAGd,SAAS,EAAkB,CAAC,EAAgC,CAC1D,GAAI,OAAO,SAAa,IACtB,MAAU,MAAM,iDAAiD,EAGnE,IAAM,EAAY,SAAS,cAAc,KAAK,EACxC,EAAW,IAAI,EACf,EAAoB,IAAI,IACxB,EAAc,MAAM,QAAQ,CAAI,EAAI,EAAO,CAAC,CAAI,EAChD,EAAU,CACd,eAAgB,IAAI,EAAe,CAAC,CAAC,EACrC,WACA,MAAO,CAAE,QAAS,CAAC,CAAE,EACrB,cAAe,CAAC,IAAiC,CAC/C,EAAkB,IAAI,CAAS,GAEjC,gBAAiB,CAAC,IAAiC,CACjD,EAAkB,OAAO,CAAS,EAEtC,EAEA,EAAY,QAAQ,CAAC,IAAe,CAClC,EAAU,YAAY,EAAS,MAAM,EAAY,CAAO,CAAC,EAC1D,EAED,IAAM,EAAO,EAAU,UAKvB,OAJA,EAAkB,QAAQ,CAAC,IAAc,CACvC,EAAU,QAAQ,EACnB,EAEM,EAGT,SAAS,EAAiB,CAAC,EAAkC,CAC3D,IAAM,EAAa,EAAiB,EAAQ,UAAU,EACtD,GAAI,GAAe,IAAI,EAAQ,GAAG,GAAK,CAAC,EAAQ,KAC9C,MAAO,IAAI,EAAQ,MAAM,KAG3B,MAAO,IAAI,EAAQ,MAAM,KAAc,EACrC,EAAQ,MAAQ,EAClB,MAAM,EAAQ,OAGhB,SAAS,EAAY,CAAC,EAA4B,CAShD,MAAO,UARY,EAAiB,CAClC,KAAM,EAAO,KACb,IAAK,EAAO,IACZ,MAAO,EAAO,MACd,MAAO,EAAO,SACV,EAAO,YAAc,CAAC,CAC5B,CAAC,cAKH,SAAS,CAAgB,CAAC,EAA6B,CAAC,EAAW,CACjE,IAAM,EAAW,OAAO,QAAQ,CAAU,EACvC,QAAQ,EAAE,EAAM,KAAW,CAC1B,GAAI,IAAU,IAAS,IAAU,MAAQ,IAAU,OACjD,MAAO,CAAC,EAGV,OAAO,IAAU,GACb,CAAC,CAAI,EACL,CAAC,GAAG,MAAS,EAAW,OAAO,CAAK,CAAC,IAAI,EAC9C,EACA,KAAK,GAAG,EAEX,OAAO,EAAW,IAAI,IAAa,GAGrC,SAAS,CAAU,CAAC,EAAuB,CACzC,OAAO,EACJ,QAAQ,KAAM,OAAO,EACrB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,QAAQ,ECpJ3B,IAAM,GAAuB,OA6CtB,MAAM,EAIX,CAWoB,QAVZ,UAAgC,KAChC,aAAiC,KACjC,QAAmB,GACnB,eAAwC,KAC/B,WACA,UAAY,IAAI,IACzB,QAAsD,CAAC,EACvD,kBACD,OAEP,WAAW,CAAS,EAAmD,CAAC,EAAG,CAAvD,eAClB,KAAK,WAAa,CAChB,IAAK,KACL,QAAS,QACT,OAAQ,EAAQ,QAAW,CAAC,CAC9B,EAGM,WAAW,CAAC,EAAoB,CACtC,QAAQ,MAAM,QAAS,CAAK,EAE5B,KAAK,cAAc,CAAK,EAOlB,aAAa,CAAC,EAAoB,CACxC,GAAI,CAAC,KAAK,UACR,OAGF,KAAK,UAAU,UAAY;AAAA;AAAA;AAAA,aAGlB,EAAM;AAAA,kGAC+E,EAAM;AAAA;AAAA,MAQ/F,GAAG,CAAC,KAAmB,EAAuB,CACnD,GAAI,OAAO,EAAO,UAAY,WAC5B,MAAU,MAAM,mBAAmB,EAIrC,OAFA,EAAO,QAAQ,KAA2B,GAAG,CAAI,EACjD,KAAK,QAAQ,KAAK,CAAE,SAAQ,MAAK,CAAC,EAC3B,KAMF,KAAK,EAAS,CACnB,GAAI,KAAK,QAAS,CAChB,QAAQ,KAAK,YAAY,EACzB,OAGF,IAAM,EAAiB,KAAK,sBAAsB,EAClD,GAAI,CAAC,EACH,OAGF,GAAI,CAOF,GANA,KAAK,UAAY,EAGhB,WAAqC,QAAU,KAG5C,KAAK,QAAQ,KAAM,CAIrB,GAHA,KAAK,aAAe,IAAI,KAAK,QAAQ,KAAK,KAAK,QAAQ,SAAS,EAG5D,kBAAmB,KAAK,aAC1B,KAAK,aAAa,cAAc,KAAK,UAAU,EAIjD,GAAI,KAAK,QAAQ,OAAS,aAAc,KAAK,aAC3C,KAAK,aAAa,SAAS,KAAK,QAAQ,KAAK,EAG/C,KAAK,aAAa,MAAM,KAAK,SAAS,EAGtC,KAAK,eAAiB,IAAI,EAAe,KAAK,QAAQ,OAAS,CAAC,CAAC,EAGnE,KAAK,QAAU,GAGf,KAAK,UAAU,EACf,MAAO,EAAO,CACd,KAAK,YAAY,CAAc,GAO5B,OAAO,EAAS,CACrB,GAAI,CAAC,KAAK,QAAS,CACjB,QAAQ,KAAK,WAAW,EACxB,OAGF,GAAI,CAIF,GAFA,KAAK,gBAAgB,EAEjB,KAAK,aAAc,CAErB,GAAI,YAAa,KAAK,aACpB,KAAK,aAAa,QAAQ,EAG5B,KAAK,aAAe,KACpB,KAAK,QAAU,GACf,OAAQ,WAAqC,QAI/C,GAAI,KAAK,eACP,KAAK,eAAe,cAAc,EAClC,KAAK,eAAiB,KAIxB,GAAI,KAAK,UACP,KAAK,UAAU,UAAY,GAI7B,GAAI,KAAK,kBACP,KAAK,kBAAkB,EAEzB,MAAO,EAAO,CACd,QAAQ,MAAM,yBAA0B,CAAK,GAO1C,SAAS,EAAY,CAC1B,OAAO,KAAK,QAMP,mBAAmB,CACxB,EACM,CACN,GAAI,KAAK,QACP,KAAK,QAAQ,EAEf,KAAK,QAAQ,KAAO,EACpB,KAAK,MAAM,EAMN,MAAM,CAAC,EAA+B,CAC3C,GAAI,CAAC,KAAK,QAER,OADA,QAAQ,KAAK,6BAA6B,EACnC,KAGT,GAAI,CAEF,GAAI,GAAS,KAAK,QAAQ,MAAO,CAI/B,GAHA,KAAK,QAAQ,MAAQ,IAAK,KAAK,QAAQ,SAAU,CAAM,EAGnD,KAAK,cAAgB,aAAc,KAAK,aAC1C,KAAK,aAAa,SAAS,CAAK,EAIlC,GAAI,KAAK,eAEP,KAAK,eAAe,MAAQ,KAAK,QAAQ,MAK7C,KAAK,UAAU,EACf,MAAO,EAAO,CACd,QAAQ,MAAM,wBAAyB,CAAK,EAG9C,OAAO,KAMF,UAAU,EAAwB,CACvC,OAAO,KAAK,WAGP,OAAU,CAAC,EAAsB,EAAgB,CAEtD,OADA,KAAK,UAAU,IAAI,EAAK,CAAK,EACtB,KAKF,MAAS,CAAC,EAAsB,EAA6B,CAClE,IAAM,EAAS,KAAK,iBAAiB,CAAG,EACxC,OAAO,EAAO,MAAQ,EAAO,MAAQ,EAGhC,gBAAmB,CAAC,EAA0C,CACnE,GAAI,CAAC,KAAK,UAAU,IAAI,CAAG,EACzB,MAAO,CAAE,MAAO,GAAO,MAAO,MAAU,EAG1C,MAAO,CAAE,MAAO,GAAM,MAAO,KAAK,UAAU,IAAI,CAAG,CAAmB,EAMjE,QAAQ,EAAuB,CACpC,OAAO,KAAK,QAAQ,MAMf,QAAQ,CAAC,EAAwB,CAEtC,GADA,KAAK,QAAQ,MAAQ,EACjB,KAAK,QACP,KAAK,OAAO,EAEd,OAAO,KAMF,WAAW,CAAC,EAA4B,CAE7C,OADA,KAAK,kBAAoB,EAClB,KAMF,kBAAkB,CAAC,EAAoC,CAAC,EAAW,CACxE,IAAM,EAAc,KAAK,QAAQ,UAAY,CAAC,EACxC,EAAU,KAAK,qBACnB,EAAY,QACZ,EAAQ,OACV,EAEA,OAAO,GAAoB,IACtB,KACA,EACH,MAAO,EAAQ,OAAS,EAAY,OAAS,eAC7C,KAAM,EAAQ,MAAQ,EAAY,MAAQ,KAAK,wBAAwB,EACvE,SACF,CAAC,EAMK,kBAAkB,CAAC,EAA6C,CACtE,GAAI,CAAC,EACH,OAAO,KAGT,GAAI,OAAO,IAAa,SAAU,CAChC,GAAI,OAAO,SAAa,IACtB,OAAO,KAGT,OAAO,SAAS,cAAc,CAAQ,EAGxC,OAAO,OAAO,QAAY,KAAe,aAAoB,QACzD,EACA,KAGE,qBAAqB,EAAuB,CAClD,GAAI,OAAO,SAAa,IACtB,OAAO,KAGT,IAAM,EAAc,KAAK,mBACvB,KAAK,QAAQ,aAAe,EAC9B,EACA,OAAO,aAAuB,YAAc,EAAc,KAGpD,uBAAuB,EAAqB,CAClD,IAAM,EAAc,KAAK,QAAQ,aAAe,GAEhD,GAAI,OAAO,IAAgB,SACzB,OAAO,KAAK,+BAA+B,CAAW,EAGxD,GAAI,OAAO,QAAY,KAAe,aAAuB,QAAS,CACpE,IAAM,EAAgC,CAAC,EACvC,GAAI,EAAY,GACd,EAAM,GAAK,EAAY,GAEzB,GAAI,EAAY,UACd,EAAM,UAAY,EAAY,UAGhC,MAAO,CAAE,IAAK,EAAY,QAAQ,YAAY,EAAG,OAAM,EAGzD,OAAO,EAAI,CAAE,MAAO,CAAE,GAAI,KAAM,CAAE,CAAC,EAG7B,8BAA8B,CAAC,EAAoC,CACzE,GAAI,EAAS,WAAW,GAAG,GAAK,EAAS,OAAS,EAChD,OAAO,EAAI,CAAE,MAAO,CAAE,GAAI,EAAS,MAAM,CAAC,CAAE,CAAE,CAAC,EAGjD,GAAI,EAAS,WAAW,GAAG,GAAK,EAAS,OAAS,EAChD,OAAO,EAAI,CAAE,MAAO,CAAE,UAAW,EAAS,MAAM,CAAC,CAAE,CAAE,CAAC,EAGxD,OAAO,EAAI,CAAE,MAAO,CAAE,qBAAsB,CAAS,CAAE,CAAC,EAGlD,oBAAoB,CAC1B,EACA,EAC0B,CAC1B,GAAI,CAAC,GAAe,CAAC,EACnB,OAGF,MAAO,CAAC,GAAI,GAAe,CAAC,EAAI,GAAI,GAAgB,CAAC,CAAE,EAIjD,SAAS,EAAS,CAExB,KAAK,QAAQ,QAAQ,EAAG,OAAQ,KAAgB,CAC9C,GAAI,GAAa,OAAO,EAAU,YAAc,WAC9C,EAAU,UAAU,IAAyB,EAEhD,EAGK,SAAS,EAAS,CAExB,KAAK,QAAQ,QAAQ,EAAG,OAAQ,KAAgB,CAC9C,GAAI,GAAa,OAAO,EAAU,YAAc,WAC9C,EAAU,UAAU,IAAyB,EAEhD,EAGK,eAAe,EAAS,CAE9B,KAAK,QAAQ,QAAQ,EAAG,OAAQ,KAAgB,CAC9C,GAAI,GAAa,OAAO,EAAU,kBAAoB,WACpD,EAAU,gBAAgB,IAAyB,EAEtD,EAEL",
|
|
23
|
+
"debugId": "844BDC187ADAE76D64756E2164756E21",
|
|
24
24
|
"names": []
|
|
25
25
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,5 +3,5 @@ import type { ComponentProps } from './core/component';
|
|
|
3
3
|
export * from './core';
|
|
4
4
|
export * from './router';
|
|
5
5
|
export declare function createApp<TState extends object = Record<string, unknown>, TConfig extends object = Record<string, unknown>, TRootProps extends ComponentProps = ComponentProps>(options?: AppOptions<TState, TConfig, TRootProps>): OneApp<TState, TConfig, TRootProps>;
|
|
6
|
-
export declare const version = "0.1.
|
|
7
|
-
export declare const name = "
|
|
6
|
+
export declare const version = "0.1.2";
|
|
7
|
+
export declare const name = "transone";
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{$ as $e,A as ue,Aa as dr,B as pe,C as
|
|
1
|
+
import{$ as $e,A as ue,Aa as dr,B as pe,Ba as ur,C as fe,D as ce,E as ge,F as me,G as Re,H as xe,I as Te,J as Ve,K as ye,L as be,M as Fe,N as Me,O as je,P as ke,Q as he,R as ve,S as Ce,T as we,U as Ae,V as Ee,W as Oe,X as Pe,Y as Se,Z as qe,_ as Le,a as z,aa as ze,b as B,ba as Be,c as D,ca as De,d as G,da as Ge,e as H,ea as He,f as I,fa as Ie,g as J,ga as Je,h as K,ha as Ke,i as N,ia as Ne,j as Q,ja as Qe,k as U,ka as Ue,l as W,la as d,m as X,ma as We,n as Y,na as Xe,o as Z,oa as Ye,p as _,pa as Ze,q as ee,qa as _e,r as re,ra as er,s as te,sa as rr,t as oe,ta as tr,u as ne,ua as or,v as ie,va as ir,w as le,wa as u,x as se,xa as lr,y as ae,ya as sr,z as de,za as ar}from"./index-2h18qzcx.js";import{Da as nr}from"./index-2e39fr05.js";function p(e){return e instanceof Error?e.message:String(e)}function f(e,r,t){try{let n=e(r,t);if(n===!0)return;return n===!1?"Validation failed":n}catch(n){return p(n)}}function g(e="This field is required"){return(r)=>{if(r===null||r===void 0)return e;if(typeof r==="string"&&r.trim().length===0)return e;if(Array.isArray(r)&&r.length===0)return e;return!0}}function m(e,r=`Must be at least ${e} characters`){return(t)=>typeof t==="string"&&t.length>=e?!0:r}function R(e){return e}function x(e,r){let t={},n=(o)=>{let i=r[o]??[],l=d(e,o),s=i.map((a)=>f(a,l,e)).filter((a)=>a!==void 0);if(s.length===0)delete t[o];else t[o]=s;return{valid:s.length===0,errors:s}};return{model:e,errors:t,validate(){let o={};return Object.keys(r).forEach((i)=>{let l=n(i);if(!l.valid)o[i]=l.errors}),{valid:Object.keys(o).length===0,errors:o}},validateField:n,resetErrors(){Object.keys(t).forEach((o)=>delete t[o])}}}function E(e={}){return new u(e)}var O="0.1.2",P="transone";export{Oe as A,me as Article,Re as Aside,Ce as Blockquote,ae as Button,ve as Code,or as Component,er as ComponentRenderStrategy,ie as Div,Ye as ElementRenderStrategy,je as Em,ce as Footer,Se as Form,xe as H1,Te as H2,Ve as H3,ye as H4,be as H5,Fe as H6,fe as Header,Pe as Img,de as Input,qe as Label,Ee as Li,pe as Main,Xe as ModelBindingController,ge as Nav,Ae as Ol,u as OneApp,ze as Option,se as P,he as Pre,G as ReactiveSystem,Ze as RendererContext,sr as Router,ar as RouterLink,dr as RouterView,ue as Section,$e as Select,rr as SlotRenderStrategy,ke as Small,le as Span,Me as Strong,Be as Table,ne as Tag,Ge as Tbody,Je as Td,tr as TemplateEngine,_e as TextRenderStrategy,Le as Textarea,Ie as Th,De as Thead,He as Tr,we as Ul,K as computed,E as createApp,Ke as createComponent,x as createForm,ur as createRouter,Qe as each,J as effect,D as flushSync,d as getModelValue,oe as h,ee as isComponentNode,re as isHTMLNode,Y as isReactive,Z as isReadonly,Q as isRef,te as isSlotProvider,m as minLength,Ue as modelPath,P as name,B as nextTick,H as reactive,z as reactiveScheduler,I as readonly,N as ref,ir as renderHtmlDocument,nr as renderStyleSheet,g as required,We as setModelValue,Ne as slot,W as stop,_ as toChildren,U as unref,lr as useRouter,R as validate,O as version,X as watch};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=68CCAB24B589585764756E2164756E21
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
"sources": ["../lib/core/form.ts", "../lib/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import { getModelValue } from './model';\n\nexport type ValidationResult = boolean | string;\n\nexport type ValidationRule<T = unknown> = (\n value: T,\n model: object\n) => ValidationResult;\n\nexport type ValidationRules<TModel extends object> = {\n [TPath in keyof TModel & string]?: readonly ValidationRule[];\n} & Record<string, readonly ValidationRule[] | undefined>;\n\nexport interface FieldValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nexport interface FormValidationResult {\n valid: boolean;\n errors: Record<string, string[]>;\n}\n\nexport interface FormController<TModel extends object> {\n readonly model: TModel;\n readonly errors: Record<string, string[]>;\n validate(): FormValidationResult;\n validateField(path: string): FieldValidationResult;\n resetErrors(): void;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction runRule(\n rule: ValidationRule,\n value: unknown,\n model: object\n): string | undefined {\n try {\n const result = rule(value, model);\n if (result === true) {\n return undefined;\n }\n return result === false ? 'Validation failed' : result;\n } catch (error) {\n return errorMessage(error);\n }\n}\n\nexport function required(message = 'This field is required'): ValidationRule {\n return (value) => {\n if (value === null || value === undefined) {\n return message;\n }\n if (typeof value === 'string' && value.trim().length === 0) {\n return message;\n }\n if (Array.isArray(value) && value.length === 0) {\n return message;\n }\n return true;\n };\n}\n\nexport function minLength(\n length: number,\n message = `Must be at least ${length} characters`\n): ValidationRule {\n return (value) =>\n typeof value === 'string' && value.length >= length ? true : message;\n}\n\nexport function validate(rule: ValidationRule): ValidationRule {\n return rule;\n}\n\nexport function createForm<TModel extends object>(\n model: TModel,\n rules: ValidationRules<TModel>\n): FormController<TModel> {\n const errors: Record<string, string[]> = {};\n\n const validateField = (path: string): FieldValidationResult => {\n const fieldRules = rules[path] ?? [];\n const value = getModelValue(model as Record<string, unknown>, path);\n const fieldErrors = fieldRules\n .map((rule) => runRule(rule, value, model))\n .filter((message): message is string => message !== undefined);\n\n if (fieldErrors.length === 0) {\n delete errors[path];\n } else {\n errors[path] = fieldErrors;\n }\n\n return { valid: fieldErrors.length === 0, errors: fieldErrors };\n };\n\n return {\n model,\n errors,\n validate(): FormValidationResult {\n const allErrors: Record<string, string[]> = {};\n Object.keys(rules).forEach((path) => {\n const result = validateField(path);\n if (!result.valid) {\n allErrors[path] = result.errors;\n }\n });\n return { valid: Object.keys(allErrors).length === 0, errors: allErrors };\n },\n validateField,\n resetErrors(): void {\n Object.keys(errors).forEach((path) => delete errors[path]);\n },\n };\n}\n",
|
|
6
|
-
"import { OneApp, AppOptions } from './core/app';\nimport type { ComponentProps } from './core/component';\n\n// 导出核心功能\nexport * from './core';\n\n// 导出路由功能\nexport * from './router';\n\n// 创建应用实例的主函数\nexport function createApp<\n TState extends object = Record<string, unknown>,\n TConfig extends object = Record<string, unknown>,\n TRootProps extends ComponentProps = ComponentProps,\n>(\n options: AppOptions<TState, TConfig, TRootProps> = {}\n): OneApp<TState, TConfig, TRootProps> {\n return new OneApp(options);\n}\n\n// 导出框架名称和版本\nexport const version = '0.1.
|
|
6
|
+
"import { OneApp, AppOptions } from './core/app';\nimport type { ComponentProps } from './core/component';\n\n// 导出核心功能\nexport * from './core';\n\n// 导出路由功能\nexport * from './router';\n\n// 创建应用实例的主函数\nexport function createApp<\n TState extends object = Record<string, unknown>,\n TConfig extends object = Record<string, unknown>,\n TRootProps extends ComponentProps = ComponentProps,\n>(\n options: AppOptions<TState, TConfig, TRootProps> = {}\n): OneApp<TState, TConfig, TRootProps> {\n return new OneApp(options);\n}\n\n// 导出框架名称和版本\nexport const version = '0.1.2';\nexport const name = 'transone';\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": "
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": "quBA+BA,SAAS,CAAY,CAAC,EAAwB,CAC5C,OAAO,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAG9D,SAAS,CAAO,CACd,EACA,EACA,EACoB,CACpB,GAAI,CACF,IAAM,EAAS,EAAK,EAAO,CAAK,EAChC,GAAI,IAAW,GACb,OAEF,OAAO,IAAW,GAAQ,oBAAsB,EAChD,MAAO,EAAO,CACd,OAAO,EAAa,CAAK,GAItB,SAAS,CAAQ,CAAC,EAAU,yBAA0C,CAC3E,MAAO,CAAC,IAAU,CAChB,GAAI,IAAU,MAAQ,IAAU,OAC9B,OAAO,EAET,GAAI,OAAO,IAAU,UAAY,EAAM,KAAK,EAAE,SAAW,EACvD,OAAO,EAET,GAAI,MAAM,QAAQ,CAAK,GAAK,EAAM,SAAW,EAC3C,OAAO,EAET,MAAO,IAIJ,SAAS,CAAS,CACvB,EACA,EAAU,oBAAoB,eACd,CAChB,MAAO,CAAC,IACN,OAAO,IAAU,UAAY,EAAM,QAAU,EAAS,GAAO,EAG1D,SAAS,CAAQ,CAAC,EAAsC,CAC7D,OAAO,EAGF,SAAS,CAAiC,CAC/C,EACA,EACwB,CACxB,IAAM,EAAmC,CAAC,EAEpC,EAAgB,CAAC,IAAwC,CAC7D,IAAM,EAAa,EAAM,IAAS,CAAC,EAC7B,EAAQ,EAAc,EAAkC,CAAI,EAC5D,EAAc,EACjB,IAAI,CAAC,IAAS,EAAQ,EAAM,EAAO,CAAK,CAAC,EACzC,OAAO,CAAC,IAA+B,IAAY,MAAS,EAE/D,GAAI,EAAY,SAAW,EACzB,OAAO,EAAO,GAEd,OAAO,GAAQ,EAGjB,MAAO,CAAE,MAAO,EAAY,SAAW,EAAG,OAAQ,CAAY,GAGhE,MAAO,CACL,QACA,SACA,QAAQ,EAAyB,CAC/B,IAAM,EAAsC,CAAC,EAO7C,OANA,OAAO,KAAK,CAAK,EAAE,QAAQ,CAAC,IAAS,CACnC,IAAM,EAAS,EAAc,CAAI,EACjC,GAAI,CAAC,EAAO,MACV,EAAU,GAAQ,EAAO,OAE5B,EACM,CAAE,MAAO,OAAO,KAAK,CAAS,EAAE,SAAW,EAAG,OAAQ,CAAU,GAEzE,gBACA,WAAW,EAAS,CAClB,OAAO,KAAK,CAAM,EAAE,QAAQ,CAAC,IAAS,OAAO,EAAO,EAAK,EAE7D,EC3GK,SAAS,CAIf,CACC,EAAmD,CAAC,EACf,CACrC,OAAO,IAAI,EAAO,CAAO,EAIpB,IAAM,EAAU,QACV,EAAO",
|
|
9
|
+
"debugId": "68CCAB24B589585764756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
package/dist/router/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{Aa as
|
|
1
|
+
import{Aa as d,Ba as e,xa as a,ya as b,za as c}from"../index-2h18qzcx.js";import"../index-2e39fr05.js";export{b as Router,c as RouterLink,d as RouterView,e as createRouter,a as useRouter};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=1CE84942670B29C264756E2164756E21
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/router/index.js.map
CHANGED
package/dist/style/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Ca as f,Da as m}from"../index-2e39fr05.js";export{f as StyleManager,m as renderStyleSheet};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=B39E2B65F74EF00464756E2164756E21
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/style/index.js.map
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "transone",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "TransOne 是跨端前端框架:一份 TypeScript 源码,编译期静态转换为 Web 与多端小程序原生产物,产物不携带框架运行时",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
"miniprogram",
|
|
43
43
|
"transpile"
|
|
44
44
|
],
|
|
45
|
+
"homepage": "https://github.com/geektech-team/transone/tree/main/packages/transone",
|
|
45
46
|
"author": "Jimmie Max(Qianyu)",
|
|
46
47
|
"license": "MIT",
|
|
47
48
|
"engines": {
|
package/dist/index-3t506ckz.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import{Ba as ae,Ca as K}from"./index-mbmajrpr.js";var y=Symbol("is_reactive"),l=Symbol("is_readonly"),H=Symbol("is_ref"),F=["push","pop","shift","unshift","splice","sort","reverse"];function d(e,t){return Boolean(Reflect.get(e,t))}function h(e){return e!==null&&typeof e==="object"}class k{pending=new Set;flushing=!1;flushPromise=null;flushResolve=null;enqueue(e){if(this.pending.has(e))return;if(this.pending.add(e),!this.flushing)queueMicrotask(()=>this.flush())}flush(){if(this.flushing)return;this.flushing=!0;try{while(this.pending.size>0){let e=Array.from(this.pending);this.pending.clear();for(let t of e)if(t.active)t()}}finally{this.flushing=!1;let e=this.flushResolve;this.flushResolve=null,this.flushPromise=null,e?.()}}nextTick(){if(!this.flushing&&this.pending.size===0)return Promise.resolve();if(this.flushPromise)return this.flushPromise;return this.flushPromise=new Promise((e)=>{this.flushResolve=e}),this.flushPromise}}var fe=0,b=new k;function Ue(){return b.nextTick()}function Ke(){b.flush()}class f{static instance;activeEffect=null;effectStack=[];targetMap=new WeakMap;reactiveMap=new WeakMap;readonlyMap=new WeakMap;proxyMap=new WeakMap;constructor(){}static getInstance(){if(!f.instance)f.instance=new f;return f.instance}reactive(e){if(!h(e))return console.warn("reactive: target must be an object"),e;if(me(e))return e;if(this.reactiveMap.has(e))return this.reactiveMap.get(e);if(Array.isArray(e))return this.createReactiveArray(e);let t=new Proxy(e,{get:(n,r)=>{if(r===y)return!0;if(r===l)return!1;this.track(n,r);let o=Reflect.get(n,r);if(h(o)&&!d(o,l))return this.reactive(o);return o},set:(n,r,o)=>{if(d(n,l))return console.warn(`Cannot set property ${String(r)} on readonly object`),!1;let i=Reflect.get(n,r);if(h(o)&&!d(o,y)&&!d(o,l))o=this.reactive(o);let s=Reflect.set(n,r,o);if(i!==o)this.trigger(n,r);return s},deleteProperty:(n,r)=>{if(d(n,l))return console.warn(`Cannot delete property ${String(r)} on readonly object`),!1;let o=r in n,i=Reflect.deleteProperty(n,r);if(o)this.trigger(n,r);return i}});return this.reactiveMap.set(e,t),this.proxyMap.set(t,e),t}toRawValue(e){if(h(e)&&this.proxyMap.has(e))return this.proxyMap.get(e);return e}createReactiveArray(e){if(this.reactiveMap.has(e))return this.reactiveMap.get(e);let t=new Proxy(e,{get:(n,r)=>{if(r===y)return!0;if(r===l)return!1;this.track(n,r);let o=Reflect.get(n,r);if(typeof r==="string"&&(r==="includes"||r==="indexOf"||r==="lastIndexOf")){this.track(n,"length");for(let s=0;s<n.length;s++)this.track(n,String(s));let i=o;return(...s)=>{let a=i.apply(n,s);if(a===!1||a===-1){let c=n.map((u)=>this.toRawValue(u));return c[r].apply(c,s.map((u)=>this.toRawValue(u)))}return a}}if(typeof r==="string"&&F.includes(r))return(...i)=>{let a=o.apply(n,i);return this.trigger(n,"length"),this.trigger(n,r),a};if(h(o)&&!d(o,l))return this.reactive(o);return o},set:(n,r,o)=>{if(d(n,l))return console.warn(`Cannot set property ${String(r)} on readonly object`),!1;let i=Reflect.get(n,r);if(h(o)&&!d(o,y)&&!d(o,l))o=this.reactive(o);let s=Reflect.set(n,r,o);if(i!==o){if(this.trigger(n,r),typeof r==="string"&&!isNaN(Number(r)))this.trigger(n,"length")}return s},deleteProperty:(n,r)=>{if(d(n,l))return console.warn(`Cannot delete property ${String(r)} on readonly object`),!1;let o=r in n,i=Reflect.deleteProperty(n,r);if(o)this.trigger(n,r),this.trigger(n,"length");return i}});return this.reactiveMap.set(e,t),this.proxyMap.set(t,e),t}readonly(e){if(!h(e))return console.warn("readonly: target must be an object"),e;if(d(e,l))return e;if(this.readonlyMap.has(e))return this.readonlyMap.get(e);let t=new Proxy(e,{get:(n,r)=>{if(r===y)return!1;if(r===l)return!0;let o=Reflect.get(n,r);if(h(o))return this.readonly(o);return o},set:()=>(console.warn("Cannot set property on readonly object"),!1),deleteProperty:()=>(console.warn("Cannot delete property on readonly object"),!1)});return this.readonlyMap.set(e,t),t}effect(e,t){let{lazy:n=!1,scheduler:r,throwOnError:o=!1}=t||{},i=()=>{if(!i.active)return e();try{return this.cleanup(i),this.effectStack.push(i),this.activeEffect=i,e()}catch(s){if(o)throw s;console.error("Effect error:",s);return}finally{this.effectStack.pop(),this.activeEffect=this.effectStack[this.effectStack.length-1]??null}};if(i.id=fe++,i.deps=[],i.active=!0,i.scheduler=r,!n)i();return i}runWithEffect(e,t){this.effectStack.push(e),this.activeEffect=e;try{return t()}finally{this.effectStack.pop(),this.activeEffect=this.effectStack[this.effectStack.length-1]??null}}computed(e){let t=!0,n,r={},o=()=>{this.track(r,"value")},i=this.effect(()=>{n=e(),t=!1},{lazy:!0,scheduler:()=>{if(!t)t=!0,this.trigger(r,"value")}});return{get value(){if(t)i();return o(),n}}}cleanup(e){e.deps.forEach((t)=>{t.delete(e)}),e.deps.length=0}track(e,t){if(!this.activeEffect||!this.activeEffect.active)return;let n=this.targetMap.get(e);if(!n)n=new Map,this.targetMap.set(e,n);let r=n.get(t);if(!r)r=new Set,n.set(t,r);if(!r.has(this.activeEffect))r.add(this.activeEffect),this.activeEffect.deps.push(r)}trigger(e,t){let n=this.targetMap.get(e);if(!n)return;let r=n.get(t);if(!r)return;new Set(r).forEach((i)=>{if(i.active)if(i.scheduler)i.scheduler(i);else i()})}stop(e){if(e.active)this.cleanup(e),e.active=!1}}function O(e){return f.getInstance().reactive(e)}function We(e){return f.getInstance().readonly(e)}function g(e,t){return f.getInstance().effect(e,t)}function Fe(e){return f.getInstance().computed(e)}function Ge(e){let t={value:e};return Object.defineProperty(t,H,{configurable:!1,enumerable:!1,value:!0}),O(t)}function G(e){return h(e)&&Boolean(Reflect.get(e,H))}function qe(e){return G(e)?e.value:e}function v(e){f.getInstance().stop(e)}function j(e,t){if(!h(e)||t.has(e))return;if(t.add(e),Array.isArray(e)){e.forEach((n)=>j(n,t));return}Object.keys(e).forEach((n)=>{j(e[n],t)})}function ze(e,t,n={}){let r=f.getInstance(),o=G(e)?()=>e.value:e,i,s=null,a=()=>{if(!m.active)return;s?.(),s=null;let u=c();t(u,i,(C)=>{s=C}),i=u},c=g(()=>{let u=o();if(n.deep&&h(u))j(u,new Set);return u},{lazy:!0,scheduler:()=>{if(n.sync)a();else b.enqueue(m)}}),m=g(()=>{a()},{lazy:!0});if(n.immediate)a();else i=c();return()=>{r.stop(c),r.stop(m)}}function me(e){return h(e)&&d(e,y)}function Ye(e){return h(e)&&d(e,l)}function q(e){return typeof e==="object"&&e!==null&&"component"in e}function z(e){return typeof e==="object"&&e!==null&&"tag"in e&&e.tag!=="slot"}function Y(e){return typeof e==="object"&&e!==null&&"tag"in e&&e.tag==="slot"}function Ze(e,t,n,r,o,i){return{tag:e,props:t,children:n,listeners:r,key:o,directions:i}}function ge(e,t={}){return{tag:e,...t}}function p(e){return(t={})=>ge(e,t)}var T=p("div"),Je=p("span"),Xe=p("p"),et=p("button"),tt=p("input"),nt=p("section"),rt=p("main"),ot=p("header"),it=p("footer"),st=p("nav"),at=p("article"),pt=p("aside"),ct=p("h1"),ut=p("h2"),lt=p("h3"),dt=p("h4"),ht=p("h5"),ft=p("h6"),mt=p("strong"),gt=p("em"),vt=p("small"),yt=p("pre"),Rt=p("code"),Ct=p("blockquote"),bt=p("ul"),Et=p("ol"),xt=p("li"),Tt=p("a"),wt=p("img"),St=p("form"),Mt=p("label"),Lt=p("textarea"),Nt=p("select"),Pt=p("option"),At=p("table"),It=p("thead"),Ht=p("tbody"),kt=p("tr"),jt=p("th"),Ot=p("td");function Vt(e,t,n,r,o){return{component:e,props:t,children:n,key:r,directions:o}}function Bt(e,t,n){return{tag:"slot",props:{name:e},key:t,directions:n}}function _t(e,t,n){return e.map((r,o)=>{let i=t(r,o);if(typeof i==="string")throw Error("each render callback must return a VNode");return{...i,key:n(r,o)}})}function Z(e){let t=e.split(".");if(e.length===0||t.some((n)=>n.length===0||n==="__proto__"||n==="prototype"||n==="constructor"))throw Error(`Invalid model path "${e}"`);return t}function B(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}function J(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function ve(e){return typeof e==="string"?e:e.path}function Q(e,t){let n=e;for(let r of Z(t)){if(!B(n))throw Error(`Invalid model path "${t}"`);if(!J(n,r)){if(r in n)throw Error(`Invalid model path "${t}"`);return}n=n[r]}return n}function ye(e,t,n){let r=Z(t),o=e;for(let s of r.slice(0,-1)){if(!J(o,s)){if(s in o)throw Error(`Invalid model path "${t}"`);o[s]={}}else if(!B(o[s]))throw Error(`Invalid model path "${t}"`);let a=o[s];if(!B(a))throw Error(`Invalid model path "${t}"`);o=a}let i=r[r.length-1];o[i]=n}function V(e,t){if(typeof e!=="string"&&e.format)return e.format(t);return t===void 0||t===null?"":String(t)}function Re(e,t){if(typeof e!=="string"&&e.parse)return e.parse(t);return t}function Ce(e,t,n){if(e instanceof HTMLInputElement){if(e.type==="checkbox"){e.checked=Array.isArray(n)?n.some((r)=>String(r)===e.value):Boolean(n);return}if(e.type==="radio"){e.checked=n===e.value;return}e.value=V(t,n);return}if(e instanceof HTMLTextAreaElement){e.value=V(t,n);return}if(e instanceof HTMLSelectElement){if(e.multiple){let r=Array.isArray(n)?new Set(n.map(String)):new Set;for(let o=0;o<e.options.length;o+=1){let i=e.options.item(o);if(!i)continue;i.selected=r.has(i.value)}return}e.value=V(t,n)}}function be(e,t){if(e instanceof HTMLInputElement){if(e.type==="checkbox"){if(Array.isArray(t)){let n=t.filter((r)=>String(r)!==e.value);return e.checked?[...n,e.value]:n}return e.checked}if(e.type==="radio")return e.checked?e.value:t;return e.value}if(e instanceof HTMLTextAreaElement)return e.value;if(e instanceof HTMLSelectElement){if(!e.multiple)return e.value;let n=[];for(let r=0;r<e.selectedOptions.length;r+=1){let o=e.selectedOptions.item(r);if(o)n.push(o.value)}return n}return}class _{bindings=new WeakMap;bind(e,t,n){if(!this.isSupportedControl(e))return;let r=this.bindings.get(e);if(r&&this.sameBinding(r,t))return;this.cleanup(e);let o=ve(t),i=()=>Ce(e,t,Q(n,o)),s=e instanceof HTMLTextAreaElement||e instanceof HTMLInputElement&&!["checkbox","radio"].includes(e.type)?"input":"change",a=()=>{let m=Q(n,o);ye(n,o,Re(t,be(e,m)))};e.addEventListener(s,a);let c=g(i);this.bindings.set(e,{binding:t,path:o,parse:typeof t==="string"?void 0:t.parse,format:typeof t==="string"?void 0:t.format,eventName:s,listener:a,effect:c})}cleanup(e){let t=this.bindings.get(e);if(!t)return;e.removeEventListener(t.eventName,t.listener),v(t.effect),this.bindings.delete(e)}isSupportedControl(e){return e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement}sameBinding(e,t){if(typeof e.binding==="string"||typeof t==="string")return e.binding===t;return e.path===t.path&&e.parse===t.parse&&e.format===t.format}}function M(e){return/^on[A-Z]/.test(e)||/^on[a-z]/.test(e)}function X(e){return e.slice(2).toLowerCase()}function ee(e){let[t,...n]=e.split(".");return{eventName:t,modifiers:new Set(n)}}function te(e,t){let n=(r)=>{if(t.has("stop"))r.stopPropagation();if(t.has("prevent"))r.preventDefault();if(t.has("self")&&r.currentTarget!==r.target)return;if(t.has("once"))r.currentTarget.removeEventListener(r.type,n);e(r)};return n}function ne(e,t,n){let r=t.includes("-")?t:t.replace(/[A-Z]/g,(o)=>`-${o.toLowerCase()}`);e.setProperty(r,String(n))}var re="http://www.w3.org/2000/svg",Ee=new Set(["svg","g","defs","rect","circle","ellipse","line","polyline","polygon","path","text","tspan","textPath","use","symbol","marker","linearGradient","radialGradient","stop","pattern","mask","clipPath","foreignObject"]);class N{listeners=new WeakMap;effects=new WeakMap;modelBindings=new _;matches(e){return typeof e==="object"&&e!==null&&z(e)}mount(e,t){if(e.directions?.if===!1)return document.createComment("if");let n=Ee.has(e.tag)?document.createElementNS(re,e.tag):document.createElement(e.tag);return this.applyProps(n,{},e.props??{},t),this.updateListeners(n,{},this.collectListeners(e)),this.mountChildren(n,e,t),this.applyDirections(n,void 0,e.directions,t),n}patch(e,t,n,r){if(e.tag!==t.tag||n.nodeType===Node.COMMENT_NODE){let o=this.mount(t,r);return n.parentNode?.replaceChild(o,n),this.unmount(e,n,r),o}if(!(n instanceof Element))return n;if(t.directions?.if===!1){let o=document.createComment("if");return n.parentNode?.replaceChild(o,n),this.unmount(e,n,r),o}return this.applyProps(n,e.props??{},t.props??{},r),this.updateListeners(n,this.collectListeners(e),this.collectListeners(t)),this.updateChildren(n,e,t,r),this.applyDirections(n,e.directions,t.directions,r),n}unmount(e,t,n){if(!(t instanceof Element))return;this.effects.get(t)?.forEach((r)=>v(r)),this.effects.delete(t),this.listeners.get(t)?.forEach(({eventName:r,listener:o})=>{t.removeEventListener(r,o)}),this.listeners.delete(t),this.modelBindings.cleanup(t),this.unmountChildren(t,e,n)}mountChildren(e,t,n){(t.children??[]).forEach((r)=>{e.appendChild(n.renderer.mount(r,n))})}updateChildren(e,t,n,r){this.updateOrdinaryChildren(e,t.children??[],n.children??[],r)}unmountChildren(e,t,n){(t.children??[]).forEach((r,o)=>{let i=e.childNodes[o];if(i)n.renderer.unmount(r,i,n)})}applyProps(e,t,n,r){Object.keys(t).forEach((o)=>{if(M(o)||o in n)return;if(o==="className"||o==="class")e.removeAttribute("class");else if(o==="style")e.removeAttribute("style");else if(o==="value"&&typeof e==="object"&&e!==null&&"value"in e)e.value="";else e.removeAttribute(L(o))}),Object.entries(n).forEach(([o,i])=>{if(M(o))return;if(t[o]===i)return;if(o==="className"||o==="class"){if(e.namespaceURI===re)e.setAttribute("class",String(i??""));else e.className=String(i??"");return}if(o==="value"&&typeof e==="object"&&e!==null&&"value"in e){e.value=String(i??"");return}if(o==="style"&&typeof i==="object"&&i!==null){e.removeAttribute("style");let s=e.style;Object.entries(i).forEach(([a,c])=>{ne(s,a,c)});return}if(i===!1||i===void 0||i===null){e.removeAttribute(L(o));return}if(i===!0){e.setAttribute(L(o),"");return}if(typeof i==="string"&&r.templateEngine.hasExpressions(i)){this.setupReactiveAttribute(e,o,i,r);return}e.setAttribute(L(o),String(i))})}applyDirections(e,t,n,r){if(n&&"show"in n)e.style.display=n.show?"":"none";else if(t&&"show"in t)e.style.display="";if(!n?.model){this.modelBindings.cleanup(e);return}this.modelBindings.bind(e,n.model,r.templateEngine.state)}updateOrdinaryChildren(e,t,n,r){if(this.assertNoDuplicateKeys(t),this.assertNoDuplicateKeys(n),this.hasOnlyKeyedChildren(t,n)){this.updateKeyedChildren(e,t,n,r);return}let o=Math.min(t.length,n.length);for(let i=0;i<o;i+=1){let s=e.childNodes[i];if(!s){e.appendChild(r.renderer.mount(n[i],r));continue}r.renderer.patch(t[i],n[i],s,r)}for(let i=o;i<n.length;i+=1)e.appendChild(r.renderer.mount(n[i],r));for(let i=t.length-1;i>=n.length;i-=1){let s=e.childNodes[i];if(s){if(r.renderer.unmount(t[i],s,r),s.parentNode===e)e.removeChild(s)}}}updateKeyedChildren(e,t,n,r){let o=t.map((a,c)=>({vnode:a,node:e.childNodes[c],index:c})),i=new Map,s=new Set;o.forEach((a)=>{let c=this.getVNodeKey(a.vnode);if(c!==void 0&&a.node)i.set(c,{vnode:a.vnode,node:a.node,index:a.index})}),n.forEach((a,c)=>{let m=this.getVNodeKey(a),u=m===void 0?void 0:i.get(m),C;if(u)C=r.renderer.patch(u.vnode,a,u.node,r),s.add(u.index);else C=r.renderer.mount(a,r);let W=e.childNodes[c]??null;if(C!==W)e.insertBefore(C,W)}),o.forEach((a)=>{if(!a.node||s.has(a.index))return;if(r.renderer.unmount(a.vnode,a.node,r),a.node.parentNode===e)e.removeChild(a.node)})}hasOnlyKeyedChildren(e,t){return[...e,...t].every((n)=>this.getVNodeKey(n)!==void 0)}assertNoDuplicateKeys(e){let t=new Set;e.forEach((n)=>{let r=this.getVNodeKey(n);if(r===void 0)return;if(t.has(r))throw Error(`Duplicate key "${r}"`);t.add(r)})}getVNodeKey(e){if(typeof e==="string")return;return e.key}collectListeners(e){let t={};return Object.entries(e.props??{}).forEach(([n,r])=>{if(M(n)&&typeof r==="function")t[X(n)]=r}),{...t,...e.listeners??{}}}updateListeners(e,t,n){let r=this.listeners.get(e)??new Map,o=new Set(Object.keys(t)),i=new Set(Object.keys(n));o.forEach((s)=>{if(!i.has(s)||t[s]!==n[s]){let a=r.get(s);if(a)e.removeEventListener(a.eventName,a.listener),r.delete(s)}}),i.forEach((s)=>{if(!o.has(s)||t[s]!==n[s]){let{eventName:a,modifiers:c}=ee(s),m=te(n[s],c);e.addEventListener(a,m),r.set(s,{eventName:a,listener:m})}}),this.listeners.set(e,r)}setupReactiveAttribute(e,t,n,r){let o=g(()=>{e.setAttribute(t,r.templateEngine.evaluateTemplateValue(n))});this.trackEffect(e,o)}trackEffect(e,t){let n=this.effects.get(e)??new Set;n.add(t),this.effects.set(e,n)}}function L(e){if(e.startsWith("data")&&e.length>4)return`data${e.slice(4).replace(/[A-Z]/g,(t)=>`-${t.toLowerCase()}`)}`;if(e==="tabIndex"||e==="colSpan"||e==="htmlFor")return e.toLowerCase();return e}class w{strategies;constructor(){this.strategies=[new oe,new ie,new se,new N]}mount(e,t){return this.findStrategy(e).mount(e,t)}patch(e,t,n,r){let o=this.findStrategy(e),i=this.findStrategy(t);if(o!==i){let s=i.mount(t,r);return n.parentNode?.replaceChild(s,n),o.unmount(e,n,r),s}return o.patch(e,t,n,r)}unmount(e,t,n){this.findStrategy(e).unmount(e,t,n)}findStrategy(e){let t=this.strategies.find((n)=>n.matches(e));if(!t)throw Error("No render strategy found for vnode");return t}}class oe{matches(e){return typeof e==="string"}mount(e,t){return t.templateEngine.parseTemplate(e)}patch(e,t,n,r){if(e===t)return n;let o=this.mount(t,r);return n.parentNode?.replaceChild(o,n),o}unmount(){}}class ie{instances=new WeakMap;instanceNodes=new Map;emitterUnsubscribers=new WeakMap;matches(e){return typeof e==="object"&&e!==null&&q(e)}mount(e,t){if(e.directions?.if===!1)return document.createComment("if");let r=new e.component(this.createProps(e));if(t.appContext&&r.setAppContext)r.setAppContext(t.appContext);this.syncEmitters(r,e.emitters??{}),t.registerChild(r);let o=r.mountToNode();return this.trackInstanceNode(r,o),r.setElementChangeListener?.((i,s)=>{this.trackInstanceNode(r,i),this.trackInstanceNode(r,s)}),o}patch(e,t,n,r){if(n.nodeType===Node.COMMENT_NODE){let s=this.mount(t,r);return n.parentNode?.replaceChild(s,n),s}if(t.directions?.if===!1){let s=document.createComment("if");return n.parentNode?.replaceChild(s,n),this.unmount(e,n,r),s}let o=this.instances.get(n);if(o&&e.component===t.component){this.syncEmitters(o,t.emitters??{}),o.setProps(this.createProps(t));let s=o.getElement()??n;return this.trackInstanceNode(o,s),s}let i=this.mount(t,r);return n.parentNode?.replaceChild(i,n),this.unmount(e,n,r),i}unmount(e,t,n){let r=this.instances.get(t);if(r)this.clearEmitters(r),r.unmount(),this.clearInstanceNodes(r),n.unregisterChild(r)}createProps(e){return{...e.props??{},children:e.children??[]}}syncEmitters(e,t){let n=this.emitterUnsubscribers.get(e)??new Map;n.forEach(({listener:r,unsubscribe:o},i)=>{let s=t[i];if(!s||s!==r)o(),n.delete(i)}),Object.entries(t).forEach(([r,o])=>{if(n.get(r)?.listener===o)return;n.set(r,{listener:o,unsubscribe:e.on(r,o)})}),this.emitterUnsubscribers.set(e,n)}clearEmitters(e){this.emitterUnsubscribers.get(e)?.forEach(({unsubscribe:t})=>{t()}),this.emitterUnsubscribers.delete(e)}trackInstanceNode(e,t){this.instances.set(t,e);let n=this.instanceNodes.get(e)??new Set;n.add(t),this.instanceNodes.set(e,n)}clearInstanceNodes(e){this.instanceNodes.get(e)?.forEach((t)=>{this.instances.delete(t)}),this.instanceNodes.delete(e)}}class se{renderedChildren=new WeakMap;matches(e){return typeof e==="object"&&e!==null&&Y(e)}mount(e,t){if(e.directions?.if===!1)return document.createComment("if");let n=document.createElement("div");return n.setAttribute("data-slot",e.props.name),this.mountSlotChildren(n,this.resolveChildren(e,t),t),n}patch(e,t,n,r){if(n.nodeType===Node.COMMENT_NODE){let o=this.mount(t,r);return n.parentNode?.replaceChild(o,n),o}if(t.directions?.if===!1){let o=document.createComment("if");return n.parentNode?.replaceChild(o,n),this.unmount(e,n,r),o}if(n instanceof HTMLElement)n.setAttribute("data-slot",t.props.name),this.replaceSlotChildren(n,e,t,r);return n}unmount(e,t,n){if(!(t instanceof HTMLElement))return;this.unmountSlotChildren(t,n),this.renderedChildren.delete(t)}resolveChildren(e,t){return t.slots[e.props.name]??e.children??[]}replaceSlotChildren(e,t,n,r){let o=this.renderedChildren.get(e)??[],i=this.resolveChildren(n,r),s=Math.min(o.length,i.length);for(let a=0;a<s;a+=1){let c=e.childNodes[a];if(!c){e.appendChild(r.renderer.mount(i[a],r));continue}r.renderer.patch(o[a],i[a],c,r)}for(let a=s;a<i.length;a+=1)e.appendChild(r.renderer.mount(i[a],r));for(let a=o.length-1;a>=i.length;a-=1){let c=e.childNodes[a];if(c){if(r.renderer.unmount(o[a],c,r),c.parentNode===e)e.removeChild(c)}}this.renderedChildren.set(e,i)}mountSlotChildren(e,t,n){t.forEach((r)=>{e.appendChild(n.renderer.mount(r,n))}),this.renderedChildren.set(e,t)}unmountSlotChildren(e,t){(this.renderedChildren.get(e)??[]).forEach((r,o)=>{let i=e.childNodes[o];if(i)t.renderer.unmount(r,i,t)})}}class R{state;bindings=[];templateRegex=/{{(.*?)}}/g;constructor(e){this.state=e;if(!e||typeof e!=="object")throw Error("TemplateEngine requires a valid state object")}parseTemplate(e){if(typeof e!=="string")e=String(e);let t=document.createTextNode("");this.templateRegex.lastIndex=0;let n=Array.from(e.matchAll(this.templateRegex));if(n&&n.length>0)this.setupReactiveBindings(t,e,n);else t.textContent=e;return t}setupReactiveBindings(e,t,n){let r=new Set,o=this.evaluateTemplate(t,n,r);e.textContent=o;let i=g(()=>{try{let s=this.evaluateTemplate(t,n,r);if(e.textContent!==s)e.textContent=s}catch(s){console.error("Template update error:",s),e.textContent=`Error: ${s instanceof Error?s.message:"Unknown error"}`}});this.bindings.push({node:e,originalText:t,effect:i})}evaluateTemplate(e,t,n){let r=e;return t.forEach((o)=>{let i=o[1]?.trim();if(i){n.add(i);let s=this.getValueFromState(i),a=s===void 0||s===null?"":String(s);r=r.replace(o[0],a)}}),r}getValueFromState(e){if(!e)return;let t=e.split("."),n=this.state;for(let r of t){if(!n||typeof n!=="object")return;n=n[r]}return n}clearBindings(){this.bindings.forEach((e)=>{v(e.effect)}),this.bindings=[]}getBindingCount(){return this.bindings.length}hasExpressions(e){return this.templateRegex.lastIndex=0,this.templateRegex.test(e)}extractKeys(e){let t=[],n,r=new RegExp(this.templateRegex,"g");while((n=r.exec(e))!==null){let o=n[1]?.trim();if(o)t.push(o)}return t}evaluateTemplateValue(e){this.templateRegex.lastIndex=0;let t=Array.from(e.matchAll(this.templateRegex));if(!t||t.length===0)return e;let n=new Set;return this.evaluateTemplate(e,t,n)}}class S{props;vnode=null;el=null;renderer=new w;templateEngine;childComponents=new Set;eventListeners={};providers=new Map;updateEffect;appContext=null;parentComponent=null;elementChangeListener=null;styleManager;state;mounted=!1;constructor(e={}){this.props=e;this.styleManager=new ae,this.state=O(this.initState()??{}),this.templateEngine=new R(this.state),this.initStyles(),this.updateEffect=g(()=>{if(this.mounted)try{this.update()}catch(t){if(!this.dispatchError(t))throw t}},{throwOnError:!0,scheduler:(t)=>{b.enqueue(t)}})}mount(e){if(!e||!(e instanceof HTMLElement))throw Error("Invalid container element");try{e.appendChild(this.mountToNode())}catch(t){throw console.error("组件渲染错误:",t),t}}mountToNode(){if(this.mounted&&this.el)return this.el;return this.beforeMount(),this.el=f.getInstance().runWithEffect(this.updateEffect,()=>{try{return this.vnode=this.render(),this.renderer.mount(this.vnode,this.createRenderContext())}catch(e){if(this.dispatchError(e))return document.createComment("error-boundary");throw e}}),this.mounted=!0,this.onMounted(),this.el}update(){if(!this.el||!this.vnode)return;this.beforeUpdate();let e=this.vnode,t=this.el;if(this.el=f.getInstance().runWithEffect(this.updateEffect,()=>{let n=this.render(),r=this.renderer.patch(e,n,t,this.createRenderContext());return this.vnode=n,r}),t!==this.el)this.elementChangeListener?.(t,this.el);this.onUpdated()}unmount(){if(!this.mounted)return;if(this.beforeUnmount(),this.vnode&&this.el)this.renderer.unmount(this.vnode,this.el,this.createRenderContext());if(this.childComponents.clear(),Object.keys(this.eventListeners).forEach((e)=>{this.eventListeners[e].clear(),delete this.eventListeners[e]}),this.providers.clear(),this.parentComponent=null,this.elementChangeListener=null,this.templateEngine.clearBindings(),this.styleManager.destroy(),v(this.updateEffect),this.el?.parentNode)this.el.parentNode.removeChild(this.el);this.el=null,this.vnode=null,this.mounted=!1,this.onUnmounted()}setProps(e){if(this.props={...this.props,...e},this.mounted)b.enqueue(this.updateEffect)}setState(e){Object.assign(this.state,e)}setAppContext(e){this.appContext=e,this.childComponents.forEach((t)=>{t.setAppContext?.(e)})}setParentComponent(e){this.parentComponent=e}getParentComponent(){return this.parentComponent}setElementChangeListener(e){this.elementChangeListener=e}provide(e,t){this.providers.set(e,t)}inject(e,t){let n=this.resolveInjection(e);return n.found?n.value:t}resolveInjection(e){if(this.providers.has(e))return{found:!0,value:this.providers.get(e)};if(this.parentComponent?.resolveInjection)return this.parentComponent.resolveInjection(e);return this.resolveAppInjection(e)}getElement(){return this.el}beforeMount(){}onMounted(){}beforeUpdate(){}onUpdated(){}beforeUnmount(){}onUnmounted(){}dispatchError(e){let t=this.getParentComponent();while(t){let n=t;if(typeof n.onErrorCaptured==="function"){if(n.onErrorCaptured(e,this)===!1)return!0}t=t.getParentComponent?.()??null}return!1}getContext(){return this.appContext}get router(){return this.getRouterFrom(this.appContext)??this.getRouterFromGlobalApp()}emit(e,...t){this.eventListeners[e]?.forEach((n)=>{n(...t)})}on(e,t){if(!this.eventListeners[e])this.eventListeners[e]=new Set;return this.eventListeners[e].add(t),()=>this.off(e,t)}off(e,t){this.eventListeners[e]?.delete(t)}createRenderContext(){return{appContext:this.appContext,templateEngine:this.templateEngine,renderer:this.renderer,slots:this.collectSlots(),registerChild:(e)=>{this.childComponents.add(e),e.setParentComponent?.(this),e.setAppContext?.(this.appContext)},unregisterChild:(e)=>{this.childComponents.delete(e),e.setParentComponent?.(null)}}}collectSlots(){let e={default:[]};return(this.props.children??[]).forEach((n)=>{let r=this.getSlotName(n);if(!e[r])e[r]=[];e[r].push(this.normalizeSlotChild(n))}),e}getSlotName(e){if(typeof e==="string")return"default";return"slot"in e&&typeof e.slot==="string"?e.slot:"default"}normalizeSlotChild(e){if(typeof e==="string"||!("slot"in e))return e;let t={...e};return delete t.slot,t}getRouterFrom(e){if(!e||typeof e!=="object"||!("router"in e))return;return e.router}getRouterFromGlobalApp(){let e=globalThis.__APP__;return this.getRouterFrom(e)}resolveAppInjection(e){if(!this.appContext||typeof this.appContext!=="object")return{found:!1,value:void 0};return this.appContext.app?.resolveInjection?.(e)??{found:!1,value:void 0}}}var D=null;function pe(e){if(!e||!(e instanceof P))throw Error("Invalid router instance");D=e}function xe(){if(!D)throw Error("Router is not initialized. Please make sure you have installed the router plugin.");return D}function E(e){if(!e.startsWith("/"))return`/${e}`;return e||"/"}function A(e,t){let n=E(t.split("?")[0]);for(let i of e){if(i.path==="*")continue;let s=Te(i.path,n);if(s)return{route:i,params:s}}let r=e.find((i)=>i.path==="*");if(r)return{route:r,params:{pathMatch:n}};let o=e.find((i)=>i.path==="/");return o?{route:o,params:{}}:null}function Te(e,t){let n=ce(e),r=ce(t);if(n.length!==r.length)return null;let o={};for(let i=0;i<n.length;i+=1){let s=n[i],a=r[i];if(s.startsWith(":")){let c=s.slice(1);if(!c)return null;o[decodeURIComponent(c)]=decodeURIComponent(a);continue}if(s!==a)return null}return o}function ce(e){let t=E(e);if(t==="/")return[];return t.split("/").filter(Boolean)}function ue(e,t,n){let r=E(e),o=n==="/"?r:n+r;return t==="hash"?`#${o}`:o}function le(e,t){let n,r,o;if(e==="history")r=window.location.pathname+window.location.search,n=window.location.pathname,o=window.location.search;else{r=window.location.hash||"#/",n=r.startsWith("#")?r.slice(1):r;let s=n.indexOf("?");o=s>=0?n.slice(s+1):"",n=s>=0?n.slice(0,s):n}if(n.startsWith(t)&&t!=="/"&&n!=="/")n=n.slice(t.length);return n=E(n),{path:n,fullPath:r,query:we(o),params:{}}}function U(e,t,n,r){let o=E(e),i=r==="/"?o:r+o;if(n==="history"){if(t)window.history.replaceState({},"",i);else window.history.pushState({},"",i);return}if(t){let s=window.location.href.split("#")[0];window.location.replace(`${s}#${i}`);return}window.location.hash=i}function we(e){let t={},n=e.startsWith("?")?e.slice(1):e;if(!n)return t;return n.split("&").forEach((r)=>{let[o,i]=r.split("=");if(o)t[decodeURIComponent(o)]=i?decodeURIComponent(i):""}),t}function Se(e){let t=e.indexOf("?");if(t<0)return{};let n=e.slice(t+1),r={};if(!n)return r;return n.split("&").forEach((o)=>{let[i,s]=o.split("=");if(i)r[decodeURIComponent(i)]=s?decodeURIComponent(s):""}),r}class P{currentRoute=null;currentLocation=null;routes=[];app=null;mode;base;routeChangeListeners=[];beforeGuards=[];afterHooks=[];removeWindowListener;constructor(e){let t=Array.isArray(e)?{routes:e}:e;this.routes=t.routes||[],this.mode=t.mode||"history",this.base=t.base||"/",this.validateRoutes(),this.initEvents(),this.resolveCurrentRoute()}install(e){this.app=e,e.router=this,pe(this);let t=e.getContext();t.router=this,this.resolveCurrentRoute()}push(e){this.navigate(e,!1)}replace(e){this.navigate(e,!0)}forward(){window.history.forward()}back(){window.history.back()}go(e){window.history.go(e)}getCurrentRoute(){if(!this.currentLocation)this.resolveCurrentRoute();return this.currentLocation}getCurrentRouteRecord(){if(!this.currentRoute)this.resolveCurrentRoute();return this.currentRoute}onRouteChange(e){return this.routeChangeListeners.push(e),()=>{let t=this.routeChangeListeners.indexOf(e);if(t>-1)this.routeChangeListeners.splice(t,1)}}beforeEach(e){return this.beforeGuards.push(e),()=>{let t=this.beforeGuards.indexOf(e);if(t>-1)this.beforeGuards.splice(t,1)}}afterEach(e){return this.afterHooks.push(e),()=>{let t=this.afterHooks.indexOf(e);if(t>-1)this.afterHooks.splice(t,1)}}getRoutes(){return[...this.routes]}addRoute(e){if(this.routes.some((n)=>n.path===e.path))throw Error(`Route already exists: ${e.path}`);if(this.routes.push(e),this.getCurrentLocation().path===e.path)this.handleRouteChange()}createHref(e){return ue(e,this.mode,this.base)}destroy(){if(this.removeWindowListener?.(),this.removeWindowListener=void 0,this.app?.router===this)this.app.router=void 0;this.app=null}navigate(e,t){if(!e||typeof e!=="string")throw Error("Path must be a non-empty string");let n=this.currentLocation,r=this.resolveTarget(e);if(!r)return;let o=r.location;for(let i of this.beforeGuards){let s=i(o,n);if(s===!1)return;if(typeof s==="string"&&s!==e){this.navigate(s,t);return}}if(n&&this.isSameLocation(n,o))return;U(r.path,t,this.mode,this.base),this.currentRoute=r.route,this.currentLocation=o,this.triggerRouteChangeListeners(o,n),this.afterHooks.forEach((i)=>{try{i(o,n)}catch(s){console.error("Route afterEach error:",s)}})}resolveTarget(e){let t=A(this.routes,e.split("?")[0]);if(!t)return null;let n=this.applyRedirect(t),r=n?.path??e,o=n?.route??t.route;return{path:r,route:o,location:{path:r.split("?")[0],query:Se(r),params:n?.params??t.params,fullPath:r,name:o?.name,meta:o?.meta}}}applyRedirect(e){let t=new Set,n=e,r="";while(n.route.redirect){if(t.has(n.route.path))throw Error(`Redirect loop detected for route: ${n.route.path}`);t.add(n.route.path),r=n.route.redirect;let o=A(this.routes,r.split("?")[0]);if(!o)return null;n=o}return r?{route:n.route,params:n.params,path:r}:null}validateRoutes(){if(!Array.isArray(this.routes))throw Error("Router routes must be an array");let e=new Set;this.routes.forEach((t)=>{if(!t.component&&!t.redirect)throw Error(`Route ${t.path} must define a component or redirect`);if(e.has(t.path))throw Error(`Duplicate route path: ${t.path}`);e.add(t.path)})}initEvents(){if(typeof window>"u")return;let e=this.mode==="history"?"popstate":"hashchange",t=()=>{this.handleRouteChange()};window.addEventListener(e,t),this.removeWindowListener=()=>{window.removeEventListener(e,t)}}handleRouteChange(){let e=this.currentLocation,t=this.resolveCurrentRoute();if(!this.isSameLocation(e,t))this.triggerRouteChangeListeners(t,e)}resolveCurrentRoute(){let e=this.getCurrentLocation(),t=A(this.routes,e.path),n=t?this.applyRedirect(t):null,r=n?.route??t?.route??null;if(n&&n.path!==e.path)U(n.path,!0,this.mode,this.base);return this.currentRoute=r,this.currentLocation={...e,params:n?.params??t?.params??{},name:r?.name,meta:r?.meta},this.currentLocation}getCurrentLocation(){return le(this.mode,this.base)}isSameLocation(e,t){return e?.fullPath===t?.fullPath&&e?.name===t?.name}triggerRouteChangeListeners(e,t){this.routeChangeListeners.forEach((n)=>{try{n(e,t)}catch(r){console.error("Route change listener error:",r)}})}}class Me extends S{unsubscribe;initState(){return{currentPath:this.router?.getCurrentRoute()?.path??window.location.pathname}}initStyles(){}onMounted(){let e=this.router;this.unsubscribe=e?.onRouteChange((t)=>{this.state.currentPath=t.path})}onUnmounted(){this.unsubscribe?.()}render(){let e=this.router,t=this.props.activeClass??"active",n=this.state.currentPath===this.props.to,r=[this.props.className,n?t:void 0].filter(Boolean).join(" ");return{tag:"a",props:{href:e?.createHref(this.props.to)??this.props.to,className:r},listeners:{click:(o)=>{if(o.preventDefault(),this.props.replace)e?.replace(this.props.to);else e?.push(this.props.to)}},children:this.props.children&&this.props.children.length>0?this.props.children:[this.props.to]}}}class Le extends S{unsubscribe;initState(){let e=this.router;return{route:e?.getCurrentRoute()??null,record:e?.getCurrentRouteRecord()??null}}initStyles(){}onMounted(){let e=this.router;this.unsubscribe=e?.onRouteChange((t)=>{this.state.route=t,this.state.record=e.getCurrentRouteRecord()})}onUnmounted(){this.unsubscribe?.()}render(){let e=this.state.record??this.router?.getCurrentRouteRecord();return{tag:"div",props:{"data-router-view":""},children:e?.component?[{component:e.component}]:[]}}}function kn(e){return new P(e)}var Ne=new Set(["base","link","meta"]);function de(e){let t=e.lang??"en",n=e.charset??"utf-8",r=e.viewport??"width=device-width, initial-scale=1",o=I({lang:t,...e.htmlAttributes??{}}),i=I(e.bodyAttributes),s=Pe(e.body);return["<!doctype html>",`<html${o}>`,"<head>",` <meta charset="${x(n)}">`,` <meta name="viewport" content="${x(r)}">`,` <title>${x(e.title)}</title>`,e.description?` <meta name="description" content="${x(e.description)}">`:"",...(e.head??[]).map((a)=>` ${Ae(a)}`),e.styles&&e.styles.length>0?` <style>${K(e.styles)}</style>`:"","</head>",`<body${i}>`,s,...(e.scripts??[]).map((a)=>` ${Ie(a)}`),"</body>","</html>"].filter((a)=>a!=="").join(`
|
|
2
|
-
`)}function Pe(e){if(typeof document>"u")throw Error("renderHtmlDocument requires a DOM-like document");let t=document.createElement("div"),n=new w,r=new Set,o=Array.isArray(e)?e:[e],i={templateEngine:new R({}),renderer:n,slots:{default:[]},registerChild:(a)=>{r.add(a)},unregisterChild:(a)=>{r.delete(a)}};o.forEach((a)=>{t.appendChild(n.mount(a,i))});let s=t.innerHTML;return r.forEach((a)=>{a.unmount()}),s}function Ae(e){let t=I(e.attributes);if(Ne.has(e.tag)&&!e.text)return`<${e.tag}${t}>`;return`<${e.tag}${t}>${x(e.text??"")}</${e.tag}>`}function Ie(e){return`<script${I({type:e.type,src:e.src,async:e.async,defer:e.defer,...e.attributes??{}})}></script>`}function I(e={}){let t=Object.entries(e).flatMap(([n,r])=>{if(r===!1||r===null||r===void 0)return[];return r===!0?[n]:[`${n}="${x(String(r))}"`]}).join(" ");return t?` ${t}`:""}function x(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}var he="#app";class He{options;container=null;rootInstance=null;mounted=!1;templateEngine=null;appContext;providers=new Map;plugins=[];unmountedCallback;router;constructor(e={}){this.options=e;this.appContext={app:this,version:"0.1.0",config:e.config||{}}}handleError(e){console.error("应用错误:",e),this.renderErrorUI(e)}renderErrorUI(e){if(!this.container)return;this.container.innerHTML=`
|
|
3
|
-
<div style="padding: 20px; background-color: #ffebee; color: #c62828; font-family: Arial, sans-serif;">
|
|
4
|
-
<h3>应用错误</h3>
|
|
5
|
-
<p>${e.message}</p>
|
|
6
|
-
<pre style="background-color: #fff; padding: 10px; border-radius: 4px; overflow: auto;">${e.stack}</pre>
|
|
7
|
-
</div>
|
|
8
|
-
`}use(e,...t){if(typeof e.install!=="function")throw Error("插件必须提供 install 方法");return e.install(this,...t),this.plugins.push({plugin:e,args:t}),this}mount(){if(this.mounted){console.warn("应用已经处于运行状态");return}let e=this.resolveMountContainer();if(!e)return;try{if(this.container=e,globalThis.__APP__=this,this.options.root){if(this.rootInstance=new this.options.root(this.options.rootProps),"setAppContext"in this.rootInstance)this.rootInstance.setAppContext(this.appContext);if(this.options.state&&"setState"in this.rootInstance)this.rootInstance.setState(this.options.state);this.rootInstance.mount(this.container),this.templateEngine=new R(this.options.state||{})}this.mounted=!0,this.onMounted()}catch(t){this.handleError(t)}}unmount(){if(!this.mounted){console.warn("应用未处于运行状态");return}try{if(this.onBeforeUnmount(),this.rootInstance){if("unmount"in this.rootInstance)this.rootInstance.unmount();this.rootInstance=null,this.mounted=!1,delete globalThis.__APP__}if(this.templateEngine)this.templateEngine.clearBindings(),this.templateEngine=null;if(this.container)this.container.innerHTML="";if(this.unmountedCallback)this.unmountedCallback()}catch(e){console.error("Failed to unmount app:",e)}}isRunning(){return this.mounted}updateRootComponent(e){if(this.mounted)this.unmount();this.options.root=e,this.mount()}update(e){if(!this.mounted)return console.warn("Cannot update unmounted app"),this;try{if(e&&this.options.state){if(this.options.state={...this.options.state,...e},this.rootInstance&&"setState"in this.rootInstance)this.rootInstance.setState(e);if(this.templateEngine)this.templateEngine.state=this.options.state}this.onUpdated()}catch(t){console.error("Failed to update app:",t)}return this}getContext(){return this.appContext}provide(e,t){return this.providers.set(e,t),this}inject(e,t){let n=this.resolveInjection(e);return n.found?n.value:t}resolveInjection(e){if(!this.providers.has(e))return{found:!1,value:void 0};return{found:!0,value:this.providers.get(e)}}getState(){return this.options.state}setState(e){if(this.options.state=e,this.mounted)this.update();return this}onUnmounted(e){return this.unmountedCallback=e,this}renderHtmlDocument(e={}){let t=this.options.document??{},n=this.mergeDocumentScripts(t.scripts,e.scripts);return de({...t,...e,title:e.title??t.title??"TransOne App",body:e.body??t.body??this.createMountDocumentBody(),scripts:n})}resolveRootElement(e){if(!e)return null;if(typeof e==="string"){if(typeof document>"u")return null;return document.querySelector(e)}return typeof Element<"u"&&e instanceof Element?e:null}resolveMountContainer(){if(typeof document>"u")return null;let e=this.resolveRootElement(this.options.rootElement??he);return e instanceof HTMLElement?e:null}createMountDocumentBody(){let e=this.options.rootElement??he;if(typeof e==="string")return this.createMountElementFromSelector(e);if(typeof Element<"u"&&e instanceof Element){let t={};if(e.id)t.id=e.id;if(e.className)t.className=e.className;return{tag:e.tagName.toLowerCase(),props:t}}return T({props:{id:"app"}})}createMountElementFromSelector(e){if(e.startsWith("#")&&e.length>1)return T({props:{id:e.slice(1)}});if(e.startsWith(".")&&e.length>1)return T({props:{className:e.slice(1)}});return T({props:{"data-transone-root":e}})}mergeDocumentScripts(e,t){if(!e&&!t)return;return[...e??[],...t??[]]}onMounted(){this.plugins.forEach(({plugin:e})=>{if(e&&typeof e.onMounted==="function")e.onMounted(this)})}onUpdated(){this.plugins.forEach(({plugin:e})=>{if(e&&typeof e.onUpdated==="function")e.onUpdated(this)})}onBeforeUnmount(){this.plugins.forEach(({plugin:e})=>{if(e&&typeof e.onBeforeUnmount==="function")e.onBeforeUnmount(this)})}}
|
|
9
|
-
export{b as a,Ue as b,Ke as c,f as d,O as e,We as f,g,Fe as h,Ge as i,G as j,qe as k,v as l,ze as m,me as n,Ye as o,q as p,z as q,Y as r,Ze as s,ge as t,T as u,Je as v,Xe as w,et as x,tt as y,nt as z,rt as A,ot as B,it as C,st as D,at as E,pt as F,ct as G,ut as H,lt as I,dt as J,ht as K,ft as L,mt as M,gt as N,vt as O,yt as P,Rt as Q,Ct as R,bt as S,Et as T,xt as U,Tt as V,wt as W,St as X,Mt as Y,Lt as Z,Nt as _,Pt as $,At as aa,It as ba,Ht as ca,kt as da,jt as ea,Ot as fa,Vt as ga,Bt as ha,_t as ia,ve as ja,Q as ka,ye as la,_ as ma,N as na,w as oa,oe as pa,ie as qa,se as ra,R as sa,S as ta,de as ua,He as va,xe as wa,P as xa,Me as ya,Le as za,kn as Aa};
|
|
10
|
-
|
|
11
|
-
//# debugId=8A550B29FEBC7E8B64756E2164756E21
|
|
12
|
-
//# sourceMappingURL=index-3t506ckz.js.map
|