"use strict";var zo=Object.create;var Cr=Object.defineProperty;var $o=Object.getOwnPropertyDescriptor;var Uo=Object.getOwnPropertyNames;var Go=Object.getPrototypeOf,Jo=Object.prototype.hasOwnProperty;var qo=(x,v)=>{for(var E in v)Cr(x,E,{get:v[E],enumerable:!0})},ao=(x,v,E,H)=>{if(v&&typeof v=="object"||typeof v=="function")for(let N of Uo(v))!Jo.call(x,N)&&N!==E&&Cr(x,N,{get:()=>v[N],enumerable:!(H=$o(v,N))||H.enumerable});return x};var Xo=(x,v,E)=>(E=x!=null?zo(Go(x)):{},ao(v||!x||!x.__esModule?Cr(E,"default",{value:x,enumerable:!0}):E,x)),Ko=x=>ao(Cr({},"__esModule",{value:!0}),x);var ns={};qo(ns,{default:()=>es});module.exports=Ko(ns);var I=require("react/jsx-runtime"),e=require("react"),Je=require("react-native"),ve=require("react-native-gesture-handler"),fe=require("react-native-reanimated"),uo=Xo(require("../utils/opencvAdapter")),de=require("../utils/maskSegmentation"),J=require("../utils/wallTextureSplit"),$=require("../utils/magneticLasso"),fo=require("../utils/activeContour"),_e=require("../utils/pngImage"),In=require("../utils/resolveImageUrl"),mo=require("../utils/compositePaintedImage"),Zn=require("../utils/exportUtils"),Lr=require("../utils/freqLayerPrep"),Ln=require("../utils/paintShaderRuntime"),F=require("../utils/maskSegmentRuntime"),S=require("@shopify/react-native-skia"),f=require("../utils/canvasGeometry");function at(x,v,E,H,N,T,X,K){const Q=(0,f.getContainRect)(N,T,X,K),cn=Q.x+E*Q.w,Pe=Q.y+H*Q.h;return Math.hypot(x-cn,v-Pe)}function Zo(x,v,E,H,N,T,X,K){if(!X||X.length<3)return!1;const Q=X[0];return at(x,v,Q.x,Q.y,E,H,N,T){const Wn=Pe.x+re*Pe.w,En=Pe.y+qe*Pe.h,Ke=Math.hypot(x-Wn,v-En);Ke<=X&&KeH.name==="wall");return E<0?null:{labels:x.labels,baseboardBinary:x.baseboardBinary,cols:x.cols,rows:x.rows,wallSemanticIdx:E}}function vr(x,v,E){if(!E?.wallSubLabels||E.cols<=0||E.rows<=0)return!1;const{wallSubLabels:H,cols:N,rows:T}=E,X=Math.min(N-1,Math.max(0,Math.floor(x*N))),K=Math.min(T-1,Math.max(0,Math.floor(v*T)));return H[K*N+X]!==J.WALL_SUB_LABEL_NONE}function Ir(x,v,E,H,N){for(const T of E)if(T.vertices.length>=3&&(0,f.pointInPolygon)(x,v,T.vertices))return!0;for(const[T,X]of H)if(!(T===N||!X.isClosed||X.vertices.length<3)&&(0,f.pointInPolygon)(x,v,X.vertices))return!0;return!1}function co(x,v,E,H,N,T){return!H||!(0,$.isNormPointOnWallMask)(x,v,H)||vr(x,v,E)?!1:!Ir(x,v,N,T)}function jo(x,v,E,H,N){for(const T of x)if(vr(T.x,T.y,v)||Ir(T.x,T.y,E,H,N))return!0;if(x.length>=3){const T=x.reduce((K,Q)=>K+Q.x,0)/x.length,X=x.reduce((K,Q)=>K+Q.y,0)/x.length;if(vr(T,X,v)||Ir(T,X,E,H,N))return!0}return!1}const Qo=(0,e.forwardRef)(function(v,E){const{originUrl:H,maskUrl:N,originImgPath:T,maskImgPath:X,maskConfig:K,pipelinePreset:Q,pipelineConfig:cn,paintConfig:Pe,interactionConfig:un,semanticColors:fn,regionOutlineColor:mn,initialSession:re,initialPaintColor:qe,initialPaintConfigJson:Ie,disabled:Xe=!1,style:Wr,onWatch:Wn,onPaintCallback:En,onError:Ke,autoExportOnReady:lt,onExported:Er}=v,Ze=H??T??"",Ye=N??X??"",Ar=(0,e.useMemo)(()=>fn?{...K,semanticColors:fn}:K,[K,fn]),Yn=(0,e.useMemo)(()=>mn?{...Pe,regionOverlayFill:mn}:Pe,[Pe,mn]),[An,ct]=(0,e.useState)(""),[Bn,it]=(0,e.useState)(""),[xe,go]=(0,e.useState)(An),[Re,po]=(0,e.useState)(Bn),ut=(0,e.useRef)(""),ft=(0,e.useRef)(""),jn=(0,e.useMemo)(()=>(0,F.resolvePipelineConfig)(Q,cn),[Q,cn]),Br=(0,e.useRef)((0,F.createRuntimeConfig)({maskConfig:Ar,pipelineConfig:jn,paintConfig:Yn,interactionConfig:un})),mt=(0,e.useRef)(null),gt=(0,e.useRef)(null);(0,e.useEffect)(()=>{const n=mt.current,t=Yn||{},r=!n||["colorBaseOpacity","lLightOpacity","textureOpacity","lLowBlurKernel","lLowContrast","lLowBrightness","lHighGain","maskFeatherColor","maskFeatherTexture","regionOverlayFill"].some(l=>t[l]!==n[l]),i=JSON.stringify(jn),a=gt.current!==i;(r||a)&&(r&&(mt.current={...t}),a&&(gt.current=i),Br.current=(0,F.setMaskSegmentRuntimeConfig)({maskConfig:Ar,pipelineConfig:jn,paintConfig:Yn,interactionConfig:un}))},[Ar,jn,Yn,un]);const dt=Br.current.paint.palette,pt=(0,F.getMaskSegmentRuntimeConfig)().paint,rs=(0,F.getMaskSegmentRuntimeConfig)().interaction,yt=(0,e.useRef)(Wn),Fr=(0,e.useRef)(En),Or=(0,e.useRef)(Ke),ht=(0,e.useRef)(Er);(0,e.useEffect)(()=>{yt.current=Wn,Fr.current=En,Or.current=Ke,ht.current=Er},[Wn,En,Ke,Er]);const Tr=(0,e.useRef)(0),bt=(0,e.useRef)(null),_r=(0,e.useRef)(null),ae=(0,e.useCallback)((n,t)=>{const o=[n,t?.regionCount??"",t?.maskPathsReady??"",t?.freqLayersReady??"",t?.errorMessage??""].join("|");if(_r.current===o)return;_r.current=o,bt.current=n;const r=Tr.current?performance.now()-Tr.current:0;yt.current?.(n,r,t)},[]),gn=(0,e.useCallback)((n,t)=>{ae("error",{errorMessage:n}),Or.current?Or.current(n,t):__DEV__&&console.error("[MaskSegment]",n,t)},[ae]),[dn,wt]=(0,e.useState)(qe??null),pn=(0,e.useRef)(Ie),xt=(0,e.useRef)(Ze),Rt=(0,e.useRef)(Ye);(0,e.useEffect)(()=>{xt.current=Ze,Rt.current=Ye},[Ze,Ye]),(0,e.useEffect)(()=>{let n=!1;if(!Ze||!Ye){ct(""),it("");return}return(async()=>{try{const[t,o]=await Promise.all([(0,In.resolveImageUrl)(Ze,`origin_${(0,In.hashUrl)(Ze)}.png`),(0,In.resolveImageUrl)(Ye,`mask_${(0,In.hashUrl)(Ye)}.png`)]);n||(ct(t),it(o))}catch(t){if(!n){const o=t instanceof Error?t.message:String(t);gn(o,t)}}})(),()=>{n=!0}},[Ze,Ye,gn]),(0,e.useEffect)(()=>{go(An),po(Bn),An&&Bn&&(0,_e.prewarmPngBgrCache)([An,Bn])},[An,Bn]),(0,e.useEffect)(()=>{ut.current=xe||"",ft.current=Re||""},[xe,Re]);const[Qn,er]=(0,e.useState)(null),le=(0,e.useRef)(null),Ne=(0,e.useRef)(null),[nr,Nr]=(0,e.useState)(null),[ee,je]=(0,e.useState)(()=>new Map),V=(0,e.useRef)(new Map),[rr,Qe]=(0,e.useState)([]),tr=(0,e.useRef)([]);V.current=ee;const[yn,hn]=(0,e.useState)(null),[Dr,bn]=(0,e.useState)(null),[kt,or]=(0,e.useState)(null),pe=(0,e.useRef)(null),Fn=(0,e.useRef)(0),De=(0,e.useRef)(!1),On=(0,e.useRef)([]),sr=(0,e.useRef)(!1);(0,e.useEffect)(()=>{V.current=ee},[ee]),(0,e.useEffect)(()=>{tr.current=rr},[rr]);const Tn=(0,e.useRef)(null),Me=(0,e.useRef)(null),ar=(0,e.useRef)(!1),U=(0,e.useRef)([]),Hr=(0,e.useRef)(null),Le=(0,e.useRef)(null),te=(0,e.useRef)(null),_n=(0,e.useRef)(null),He=(0,e.useRef)(null),St=(0,e.useRef)(()=>Promise.resolve()),[Ce,Vr]=(0,e.useState)(!1),[lr,wn]=(0,e.useState)(!1),cr=(0,e.useRef)(null),ir=(0,e.useRef)(null),[en,ur]=(0,e.useState)([]),[Pt,fr]=(0,e.useState)(0),[ne,yo]=(0,e.useState)(null),Mt=(0,S.useCanvasRef)(),[We,Ct]=(0,e.useState)(null),[ho,vt]=(0,e.useState)(!1),[Nn,bo]=(0,e.useState)(null),[G,It]=(0,e.useState)(!1),xn=(0,e.useRef)(!1),Rn=(0,e.useRef)(!1),[Lt,Wt]=(0,e.useState)(!1),[Et,At]=(0,e.useState)(!1),zr=(0,e.useRef)(!1),[mr,Bt]=(0,e.useState)(null),Dn=(0,e.useRef)(null),Ve=Qn?.lowFreqImage??null,gr=Qn?.highFreqImage??null,me=Nn?.w??1,ge=Nn?.h??1,wo=Nn!=null&&Nn.w>0&&Nn.h>0,ye=(0,e.useRef)(me),he=(0,e.useRef)(ge),[Hn,Ft]=(0,e.useState)(1),[Vn,$r]=(0,e.useState)({x:0,y:0}),ce=(0,e.useRef)(1),be=(0,e.useRef)({x:0,y:0}),Ot=(0,e.useRef)(1),Tt=(0,e.useRef)({x:0,y:0}),_t=(0,e.useRef)({x:0,y:0}),Ur=(0,e.useRef)({x:0,y:0}),Gr=(0,e.useRef)(null),[kn,dr]=(0,e.useState)(!1),Sn=(0,e.useRef)(!1),[Jr,ze]=(0,e.useState)(new Map),Y=(0,e.useRef)(new Map),[zn,Ee]=(0,e.useState)(null),Z=(0,e.useRef)(null),[Nt,qr]=(0,e.useState)([]),j=(0,e.useRef)([]),Dt=(0,e.useRef)(0),xo="#FF6B35",Ro="#00C853",ko=32,Ht=20,So=10,Po=14,Mo=12,Co=20,vo=8,nn=(0,e.useRef)(null),$e=(0,e.useRef)(null),pr=(0,e.useRef)(!1),rn=(0,e.useRef)(null),[$n,Xr]=(0,e.useState)(null),[Vt,yr]=(0,e.useState)(null),tn=(0,e.useRef)(null);(0,e.useEffect)(()=>{ce.current=Hn},[Hn]),(0,e.useEffect)(()=>{be.current=Vn},[Vn]),(0,e.useEffect)(()=>{Sn.current=kn},[kn]),(0,e.useEffect)(()=>{Y.current=Jr},[Jr]),(0,e.useEffect)(()=>{Z.current=zn},[zn]),(0,e.useEffect)(()=>{j.current=Nt},[Nt]),(0,e.useEffect)(()=>{tn.current=Vt},[Vt]);const Io=(0,e.useCallback)((n,t)=>{n<=0||t<=0||(ye.current=n,he.current=t,bo(o=>o?.w===n&&o?.h===t?o:{w:n,h:t}))},[]),Ae=(0,e.useCallback)(()=>{Ft(1),$r({x:0,y:0}),ce.current=1,be.current={x:0,y:0}},[]),_=(0,e.useMemo)(()=>ne?(0,f.getContainRect)(me,ge,ne.w,ne.h):null,[ne,me,ge]);(0,e.useEffect)(()=>{Gr.current=_},[_]);const ke=(0,e.useRef)(0),hr=(0,e.useRef)(""),Pn=(0,e.useRef)(""),Ue=(0,e.useRef)(null),br=(0,e.useRef)(""),[Lo,zt]=(0,e.useState)(0);(0,e.useEffect)(()=>{le.current=Qn},[Qn]),(0,e.useEffect)(()=>{xn.current=G},[G]),(0,e.useEffect)(()=>{Rn.current=lr},[lr]);const $t=(0,e.useCallback)(()=>{!xn.current||!le.current||ae("layers_ready",{regionCount:U.current.length,maskPathsReady:Rn.current,freqLayersReady:!0})},[ae]),wr=(0,e.useCallback)(()=>{!xn.current||!Rn.current||ae("mask_paths_ready",{regionCount:U.current.length,maskPathsReady:!0,freqLayersReady:!0})},[ae]),Un=(0,e.useCallback)(()=>{!xn.current||!le.current||($t(),ae("interactive",{regionCount:U.current.length,maskPathsReady:Rn.current,freqLayersReady:!0}),Wt(!0))},[ae,$t]),xr=(0,e.useMemo)(()=>{const n=Le.current;if(Ne.current?.dispose(),!n||ee.size===0)return Ne.current=null,null;const t=(0,Ln.createPaintColorMapForPaint)(n.buffer,n.cols,n.rows,ee);return Ne.current=t,t},[ee,Ce,G,Lo,(0,F.getMaskRuntimeRevision)()]),Be=(0,e.useRef)(new Map),Rr=(0,e.useCallback)(async(n,t)=>{const o=++ke.current,r=()=>{if(o===ke.current)return!1;const c=ut.current||n,m=ft.current||t;return!(c===n&&m===t)},i=(0,F.getMaskSegmentRuntimeConfig)().pipeline;Tr.current=performance.now(),bt.current=null,_r.current=null,ae("init"),(0,f.timeLog)("\u25B6 start segmentation"),xn.current=!1,It(!1),Nr(null);const a=new Map;V.current=a,je(a),Qe([]),hn(null),bn(null),or(null),De.current=!1,Fn.current=0,On.current=[],pe.current&&(clearTimeout(pe.current),pe.current=null),sr.current=!1,dr(!1),Sn.current=!1,ze(new Map),Y.current=new Map,Ee(null),Z.current=null,qr([]),j.current=[],yr(null),tn.current=null,Tn.current=null,Me.current&&(clearTimeout(Me.current),Me.current=null),ar.current=!1,U.current=[],Hr.current=null,Le.current=null,te.current=null,_n.current=null,He.current=null,Mn(new Map),wn(!1),Vr(!1),cr.current=null,ir.current=null,Ue.current=null,ur([]),fr(0),Ct(null),vt(!1);const l=le.current;l&&((0,f.releasePaintResourceLayers)(l),le.current=null,er(null)),(0,f.releaseOriginSkImage)(Dn.current),Dn.current=null,Bt(null);try{(0,f.timeLog)("\u25B6 reading origin PNG");const c=(0,_e.readPngBgrBuffer)(n);(0,f.timeLog)("\u25B6 reading mask PNG");const m=(0,_e.readPngBgrBuffer)(t),u=await c;if(r())return;const g=u.cols,d=u.rows;yo({w:g,h:d});let R=1;Math.max(g,d)>i.maxImageLongSide&&(R=i.maxImageLongSide/Math.max(g,d));const y=Math.floor(g*R),k=Math.floor(d*R),h=i.minContourArea*R*R,O=(0,f.prepareWorkScaledBgrBuffer)(u.buffer,g,d,R).then(z=>(r()||(_n.current=z,Ct({w:z.cols,h:z.rows}),vt(!0),St.current()),z)),P=m.then(async z=>{if(r())throw new Error("cancelled");(0,f.timeLog)("\u25B6 PNG read completed"),ae("images_loaded"),(0,f.timeLog)(`\u25B6 image size: ${g}x${d}`);const{buffer:Se,cols:an,rows:Cn}=z,ln=(0,_e.resizeBgrBuffer)(Se,an,Cn,y,k);return(0,f.timeLog)(`\u25B6 mask scale: ${R.toFixed(3)}`),ae("mask_aligned"),(0,de.extractRegionsFromMaskBufferSync)(ln,y,k,{minArea:h,approxEpsilon:i.contourApproxEpsilon})});m.then(async z=>{const{buffer:Se,cols:an,rows:Cn}=z;let ln;an!==g||Cn!==d?ln=await uo.default.resizeBgrBuffer(Se,an,Cn,g,d):ln=new Uint8Array(Se),o===ke.current&&(Hr.current={buffer:ln,cols:g,rows:d})});const[w,L]=await Promise.all([P,O]);if(r())return;let M=w;const b=(0,F.getMaskSegmentRuntimeConfig)().mask;b.splitWalls&&!b.manualSplitWalls&&(M=(0,J.splitWallRegionsByTexture)(M,L.buffer,y,k,h));const A=He.current??Promise.resolve();ae("mask_sampled",{regionCount:M.regions.length}),(0,f.timeLog)(`\u25B6 segmentation completed, valid regions: ${M.regions.length}`);const oe=M.regions;__DEV__&&oe.length===0&&console.warn("[MaskSegment] not recognized any valid regions, please check if the mask is a pure color region image");let C=oe;C.length>i.maxRegions&&(C=C.slice(0,i.maxRegions)),U.current=C,Le.current=M.pickMap;const ie=(0,F.getMaskSegmentRuntimeConfig)().mask.semanticColors.map(z=>z.name),sn=ie.indexOf("wall");te.current={labels:M.labels,baseboardBinary:M.baseboardBinary,cols:M.segCols,rows:M.segRows,wallSubLabels:M.wallSubLabels,indexToName:ie,wallSemanticIdx:sn>=0?sn:void 0},cr.current=null,ir.current=C.find(z=>z.thinStrip)?.id??null;const Ge=(0,f.getContainRect)(ye.current,he.current,g,d);Ue.current=Ge,Mn(new Map),wn(!1),ur(C),fr(C.length),hr.current=`${n}|${t}`,xn.current=!0,It(!0),ae("regions_ready",{regionCount:C.length}),Un(),(async()=>{if(o!==ke.current)return;const z=(0,de.downsampleMaskDataForPaths)(te.current,i.maskPathMaxLongSide),Se=(0,de.buildAllRegionOutlinePaths)(C,z,Ge);o===ke.current&&(Mn(Se),wn(!0),Rn.current=!0,wr())})(),(async()=>o===ke.current&&(await A,o===ke.current&&(cr.current=(0,de.upscaleBinaryMask)(M.baseboardBinary,y,k,g,d))))()}catch(c){const m=c instanceof Error?c.message:String(c);r()||(console.error("[SDK-SEGMENT] segmentation failed",c),gn(m,c))}},[ae,Un,wr,gn]),Kr=(0,e.useCallback)(()=>{if(le.current)return Promise.resolve();if(He.current)return He.current;const n=_n.current;if(!n)return Promise.resolve();const t=ke.current;let o;return o=(async()=>{(0,f.timeLog)("\u25B6 start loading paint shader textures");try{const r=await(0,Lr.preparePaintResourcesFromWorkBuffer)(n.buffer,n.cols,n.rows,i=>{if(t!==ke.current){(0,Lr.releaseFreqLayerImages)(i);return}er(i),le.current=i,Vr(!0),(0,f.timeLog)("\u25B6 paint shader textures ready"),Un()});if(t!==ke.current){r&&(r.originImage.dispose(),(0,f.releasePaintResourceLayers)(r.layers));return}if(!r)return;(0,f.releaseOriginSkImage)(Dn.current),Dn.current=r.originImage,Bt(r.originImage),(0,f.timeLog)("\u25B6 origin Skia work resolution"),le.current||(er(r.layers),le.current=r.layers,Vr(!0)),Un()}catch(r){__DEV__&&console.warn("[MaskSegment] failed to prepare paint shader textures",r)}finally{He.current===o&&(He.current=null)}})(),He.current=o,o},[Un]);St.current=Kr;const Ut=(0,e.useCallback)(async()=>{if(!(zr.current||!xe||!Re)){zr.current=!0;try{Ae();const n=le.current;n&&((0,f.releasePaintResourceLayers)(n),le.current=null,er(null)),await(0,_e.clearDerivedImageCache)(),hr.current="",await Rr(xe,Re)}catch(n){const t=n instanceof Error?n.message:String(n);gn(t,n)}finally{zr.current=!1}}},[xe,Re,Rr,gn,Ae]);(0,e.useEffect)(()=>{if(!xe||!Re)return;const n=`${xe}|${Re}`;if(!(hr.current===n||Pn.current===n))return Ae(),Pn.current=n,Rr(xe,Re).finally(()=>{Pn.current===n&&(Pn.current="")}),()=>{ke.current+=1,Pn.current===n&&(Pn.current="");const t=le.current;t&&((0,f.releasePaintResourceLayers)(t),le.current=null),Ne.current?.dispose(),Ne.current=null,U.current=[],On.current=[],De.current=!1,Fn.current=0,pe.current&&(clearTimeout(pe.current),pe.current=null),or(null)}},[xe,Re,Ae]);const Zr=(0,e.useCallback)(()=>{const n=[],t=V.current&&V.current.size>0?V.current:ee;for(const[o,r]of t){const i=U.current.find(a=>a.id===o);n.push({regionId:o,regionName:i?.name??String(o),color:r,configJson:Be.current.get(o)})}return n},[ee]),kr=(0,e.useCallback)(n=>{const t=new Map;Be.current=new Map;const o=U.current||[],r=new Map;for(const l of o)if(l&&l.name){const c=String(l.name).trim().toLowerCase();c&&!r.has(c)&&r.set(c,l.id)}const i=new Map;for(const l of n.painted||[])l&&typeof l.regionId=="number"&&l.regionName&&i.set(l.regionId,String(l.regionName));for(const l of n.painted||[]){if(!l)continue;let c=l.regionId;if(l.regionName){const m=String(l.regionName).trim().toLowerCase(),u=r.get(m);typeof u=="number"&&(c=u)}t.set(c,l.color),l.configJson&&Be.current.set(c,l.configJson)}const a=[];for(const l of n.paintHistory||[]){if(typeof l!="number")continue;const c=i.get(l);if(c){const m=r.get(String(c).trim().toLowerCase());if(typeof m=="number"){a.push(m);continue}}o.some(m=>m&&m.id===l)&&a.push(l)}V.current=t,je(t),Qe(a.length?a:[...n.paintHistory||[]]),n.currentColor&&(wt(n.currentColor),pn.current=n.currentColorConfigJson,Nr(null))},[]);(0,e.useEffect)(()=>{!re||!G||sr.current||(sr.current=!0,kr(re))},[re,G,kr]),(0,e.useEffect)(()=>()=>{pe.current&&clearTimeout(pe.current)},[]);const on=(0,e.useCallback)(()=>{De.current=!1,pe.current&&(clearTimeout(pe.current),pe.current=null),or(null)},[]),Gt=(0,e.useCallback)(()=>{const n=(0,F.getMaskSegmentRuntimeConfig)().interaction;if(!n.enableInitRegionFlash||De.current)return;const t=U.current;if(t.length===0)return;const o=Fe.current,r=o?Math.max(500,o.w*o.h*.002):500;On.current=t.filter(a=>!V.current.has(a.id)&&a.area>=r),De.current=!0,Fn.current=0;const i=()=>{if(!De.current||On.current.length===0)return;const a=On.current,l=Fn.current;if(l>=a.length){on();return}or(a[l].id),Fn.current+=1,pe.current=setTimeout(i,n.initRegionFlashMs)};i()},[]),we=(0,e.useCallback)(()=>{on()},[on]);(0,e.useEffect)(()=>{De.current&&V.current.size>0&&on()},[ee,on]),(0,e.useEffect)(()=>{if(G&&lr&&_&&Pt>0&&Lt){De.current||Gt();return}G||(on(),Wt(!1))},[G,lr,_,Pt,Lt,Gt,on]);const Jt=(0,e.useCallback)(()=>dn||(nr==null?null:dt[nr]??null),[dn,nr,dt]),Gn=dn!=null||nr!=null,qt=(0,e.useCallback)((n,t)=>{let o=!1;if(je(r=>{const i=r.get(n);if(i&&(0,f.bgrColorEquals)(i,t))return r;o=!0,Qe(l=>l[l.length-1]===n?l:[...l.filter(m=>m!==n),n]);const a=new Map(r);return a.set(n,t),V.current=a,a}),o){const r=pn.current??Be.current.get(n);pn.current&&Be.current.set(n,pn.current);const i=U.current.find(a=>a.id===n);Fr.current?.({kind:"painted",regionId:n,regionName:i?.name??String(n),color:t,configJson:r})}},[]),Jn=(0,e.useCallback)((n,t,o=!1)=>{if(!G||!ne||U.current.length===0)return null;const r=(0,f.canvasToNormalized)(n,t,me,ge,ne.w,ne.h);if(!r)return null;const i=u=>u!=null&&U.current.some(p=>p.id===u),a=Le.current,l=o?0:(0,F.getMaskSegmentRuntimeConfig)().interaction.pickMapSearchRadiusPx;if(a){const u=(0,f.lookupRegionFromPickMap)(r.x,r.y,a,0);if(i(u))return u;if(o)return null}if(!o){const u=(0,f.resolveRegionHit)(U.current,r.x,r.y);if(u!=null)return u}if(a&&!o&&l>0){const u=(0,f.lookupRegionFromPickMap)(r.x,r.y,a,l);if(i(u))return u}const c=Hr.current,m=ir.current;if(c&&m!=null){const u=cr.current,p=(0,f.pickKickRegionFromMask)(r.x,r.y,c,m,u,o);if(p!=null)return p;if(!o){const g=U.current.find(d=>d.id===m);if(g&&(0,f.pickKickNearStrip)(r.x,r.y,g))return m}}return null},[G,ne,me,ge]),Yr=(0,e.useCallback)((n,t)=>{if(we(),!G||!ne||U.current.length===0||!Gn||!Ce||Xe)return;const o=Jn(n,t);if(o==null)return;const r=Jt();r&&(qt(o,r),!Ce&&!He.current&&Kr())},[G,ne,Gn,Ce,Xe,Jn,Jt,qt,we,Kr]),jr=(0,e.useRef)(Gn),Xt=(0,e.useRef)(Xe),Kt=(0,e.useRef)(G),Fe=(0,e.useRef)(ne);(0,e.useEffect)(()=>{ye.current=me},[me]),(0,e.useEffect)(()=>{he.current=ge},[ge]),(0,e.useEffect)(()=>{jr.current=Gn},[Gn]),(0,e.useEffect)(()=>{Xt.current=Xe},[Xe]),(0,e.useEffect)(()=>{Kt.current=G},[G]),(0,e.useEffect)(()=>{Fe.current=ne},[ne]);const Qr=(0,e.useRef)(Jn),et=(0,e.useRef)(Yr),Zt=(0,e.useRef)(we),nt=(0,e.useRef)(Ae);(0,e.useEffect)(()=>{Qr.current=Jn},[Jn]),(0,e.useEffect)(()=>{et.current=Yr},[Yr]),(0,e.useEffect)(()=>{Zt.current=we},[we]),(0,e.useEffect)(()=>{nt.current=Ae},[Ae]);const rt=(0,e.useCallback)(()=>{we(),Qe(n=>{if(n.length===0)return n;const t=n[n.length-1];return je(o=>{const r=new Map(o);return r.delete(t),V.current=r,r}),Be.current.delete(t),n.slice(0,-1)})},[we]),Yt=(0,e.useCallback)(()=>{we();const n=new Map;V.current=n,je(n),Qe([]),Be.current=new Map,Tn.current=null,Ae()},[we,Ae]),jt=(0,e.useCallback)(async()=>{try{const n=Mt.current;if(!n||!We)return;let o=n.makeImageSnapshot?.();if(o||(await new Promise(a=>requestAnimationFrame(()=>a())),o=n.makeImageSnapshot?.()),!o)return;const r=o.encodeToBase64;if(typeof r!="function")return;const i=r.call(o)||"";return i.length>0?i:void 0}catch(n){console.warn("[VIZ-SAVE] highResExportCanvas makeImageSnapshot failed:",n);return}},[We]),Sr=(0,e.useCallback)(async(n,t)=>{const o=_n.current,r=Le.current;if(!o||!r)throw new Error("image not ready, cannot save");let i;n.size>0&&(i=await jt());const a=le.current,l=Ne.current,c=Dn.current??a?.lowFreqImage??null,m=!i&&c&&a&&l&&Ce?{originImage:c,paintColorMap:l,lowFreqImage:a.lowFreqImage,highFreqImage:a.highFreqImage}:void 0,u=await(0,mo.compositePaintedImage)({originBuffer:o.buffer,cols:o.cols,rows:o.rows,pickBuffer:r.buffer,paintedRegions:n,destDir:t,...i?{exportPngBase64:i}:{},shaderTextures:m,renderWidth:o.cols,renderHeight:o.rows});return Tn.current={fingerprint:(0,Zn.paintedRegionsFingerprint)(n),result:u},u},[jt,Ce]);(0,e.useEffect)(()=>{if(lt&&!(!G||!Ce)&&!(re&&!sr.current)&&ee.size!==0)return Me.current&&clearTimeout(Me.current),Me.current=setTimeout(()=>{if(Me.current=null,ar.current)return;const n=V.current;!n||n.size===0||(ar.current=!0,(async()=>{try{const t=await Sr(n);ht.current?.(t)}catch(t){console.log("[VIZ-SAVE] debounced autoExport threw (non-fatal):",t)}finally{ar.current=!1}})())},400),()=>{Me.current&&(clearTimeout(Me.current),Me.current=null)}},[lt,G,Ce,re,ee,Sr]),(0,e.useImperativeHandle)(E,()=>({reset:rt,swap:n=>{we(),At(n===void 0?t=>!t:n)},save:async n=>{const t=V.current&&V.current.size>0?V.current:ee,o=(0,Zn.paintedRegionsFingerprint)(t),r=Tn.current;if(r?.fingerprint===o&&r.result)return(0,Zn.resolveExportResultForDestDir)(r.result,n?.destDir);try{return await Sr(t,n?.destDir)}catch(i){throw console.error("[VIZ-SAVE] SDK save() composite threw:",i),i}},getLastExport:()=>Tn.current?.result??null,session:()=>({version:1,originUrl:xt.current,maskUrl:Rt.current,painted:Zr(),paintHistory:[...rr],currentColor:dn??void 0,currentColorConfigJson:pn.current,savedAt:Date.now()}),loadSession:kr,setPaintColor:(n,t)=>{wt(n),pn.current=t,Nr(null)},setMaskConfig:n=>{(0,F.setMaskSegmentRuntimeConfig)({maskConfig:n}),Br.current=(0,F.getMaskSegmentRuntimeConfig)(),xe&&Re&&(hr.current="",Rr(xe,Re))},clearAllPaint:Yt,undoSelection:rt,resegment:Ut,getRegions:()=>[...U.current],getPaintedRegions:()=>Zr(),startLasso:()=>{if(ze(new Map),Y.current=new Map,Ee(null),Z.current=null,dr(!0),Sn.current=!0,(0,F.getMaskSegmentRuntimeConfig)().mask.magneticLasso&&(0,F.getMaskSegmentRuntimeConfig)().mask.manualSplitWalls){const t=_n.current;if(t&&t.cols>0&&t.rows>0){const o=te.current,r=(0,F.getMaskSegmentRuntimeConfig)().mask.semanticColors,i=o?.wallSemanticIdx??r.findIndex(c=>c.name==="wall");let a=null;o&&i>=0&&o.cols===t.cols&&o.rows===t.rows&&(a=(0,$.buildWallAllowedMask)(o.labels,o.baseboardBinary,i));const l=(0,$.buildEnergyMap)(t.buffer,t.cols,t.rows,256,a);yr(l),tn.current=l}}},cancelLasso:()=>{dr(!1),Sn.current=!1,Ee(null),Z.current=null,ze(new Map),Y.current=new Map,yr(null),tn.current=null,nn.current=null,rn.current=null,$e.current=null,pr.current=!1,Xr(null)},endLasso:()=>{const n=te.current,t=(0,F.getMaskSegmentRuntimeConfig)().mask.semanticColors,o=n?.wallSemanticIdx??t.findIndex(s=>s.name==="wall"),r=n&&o>=0?{labels:n.labels,baseboardBinary:n.baseboardBinary,cols:n.cols,rows:n.rows,wallSemanticIdx:o}:null,i=s=>s.length<3?!1:r?(0,$.filterVerticesToWallMask)(s,r).length>=3:!0,a=Z.current;if(a&&i(a)){const s=`lasso_${++Dt.current}`,B={id:s,vertices:[...a],isClosed:!0},W=new Map(Y.current);W.set(s,B),Y.current=W,ze(W),Ee(null),Z.current=null}const l=new Map([...Y.current.entries()].filter(([,s])=>i(s.vertices)));if(l.size===0)return[...j.current];const c=U.current,m=c.find(s=>s.name==="wall")??c.find(s=>/^wall-\d+$/.test(s.name));if(!m)return[...j.current];const u=m.hex,p={...m.color},g=te.current;if(!g)return[...j.current];const{labels:d,baseboardBinary:R,cols:y,rows:k}=g,h=y*k;if((0,F.getMaskSegmentRuntimeConfig)().mask.activeContourRefine&&r)for(const[,s]of l)s.vertices=(0,fo.refinePolygonToWallEdges)(s.vertices,r);const P=(0,F.getMaskSegmentRuntimeConfig)().mask.semanticColors,w=[...l.entries()],L=w.map(([,s])=>s.vertices),M=()=>{const s=new Map;for(let D=0;DW&&(B=D,W=q);return B},b=g.indexToName??P.map(s=>s.name);let A=g.wallSemanticIdx??P.findIndex(s=>s.name==="wall");if(A<0){const s=M();s>=0&&b[s]==="wall"&&(A=s)}if(A<0)return[...j.current];const oe=(s,B)=>{z.fill(0);for(const W of Se)W.x=y,W.y=k,W.w=0,W.h=0;for(let W=0;Wue.x+ue.w&&(ue.w=oo-ue.x),so>ue.y+ue.h&&(ue.h=so-ue.y);break}}}},C=new Uint8Array(h);g.wallSubLabels&&g.wallSubLabels.length===h?C.set(g.wallSubLabels):C.fill(J.WALL_SUB_LABEL_NONE);let se=-1;for(let s=0;s/^wall-\d+$/.test(s.name));let sn=0;for(const s of ie){const B=/^wall-(\d+)$/.exec(s.name);B&&(sn=Math.max(sn,Number(B[1])))}const Ge=new Uint8Array(h);Ge.fill(J.WALL_SUB_LABEL_NONE);const z=new Array(w.length).fill(0),Se=w.map(()=>({x:y,y:k,w:0,h:0}));if(oe(A,C),z.every(s=>s===0)){const s=M();s>=0&&b[s]==="wall"&&s!==A&&(A=s,Ge.fill(J.WALL_SUB_LABEL_NONE),oe(A,C))}const an=(0,F.getMaskSegmentRuntimeConfig)().mask.manualSplitWallsGapAbsorbDilatePx??5;an>0&&w.length>0&&(0,J.absorbSmallWallGapsForLassoPolygons)(Ge,w.length,z,Se,d,R,A,C,y,k,an);const Cn=(0,F.getMaskSegmentRuntimeConfig)().mask.manualSplitWallsMaxCount??8,ln=Math.max(0,Cn-ie.length),Pr=z.map((s,B)=>({area:s,idx:B})).filter(s=>s.area>0).sort((s,B)=>B.area-s.area).slice(0,ln).map(s=>s.idx);if(Pr.length===0)return[...j.current];for(let s=0;s=0&&(C[s]=se+1+W)}const To=c.filter(s=>s.name!=="wall"&&!/^wall-\d+$/.test(s.name)),_o=c.reduce((s,B)=>Math.max(s,B.id),-1),No=Pr.map((s,B)=>{const[,W]=w[s],D=Se[s];return{id:_o+1+B,name:`wall-${sn+B+1}`,hex:u,color:p,polygons:[W.vertices.map(q=>({x:q.x,y:q.y}))],outlinePolygons:[W.vertices.map(q=>({x:q.x,y:q.y}))],bbox:{x:D.x/y,y:D.y/k,w:D.w/y,h:D.h/k},area:z[s]}}),vn=[...To,...ie,...No],to=new Map(vn.map(s=>[s.name,s.id])),qn=Le.current;let Mr;if(qn&&qn.cols===y&&qn.rows===k&&qn.buffer.length===h)Mr=(0,J.patchPickMapForManualWallSplit)(qn.buffer,d,R,A,C,to,y,k);else{const s=(0,J.buildPickMapAfterWallSplit)(d,R,A,C,b,to,y,k);Mr=(0,J.dilatePickBuffer1px)(s,y,k)}const Xn=new Map;for(const[s,B]of V.current){const W=c.find(D=>D.id===s);if(W){if(W.name==="wall"){Be.current.delete(s);continue}Xn.set(s,B)}}V.current=Xn;const Do=tr.current.filter(s=>{const B=c.find(W=>W.id===s);return B!=null&&B.name!=="wall"});U.current=vn,Le.current={buffer:Mr,cols:y,rows:k},ir.current=vn.find(s=>s.thinStrip)?.id??null,te.current={labels:g.labels,baseboardBinary:g.baseboardBinary,cols:y,rows:k,wallSubLabels:C,indexToName:b,wallSemanticIdx:A},Xn.size>0&&(Ne.current?.dispose(),Ne.current=(0,Ln.createPaintColorMapForPaint)(Mr,y,k,Xn));const Ho=new Map(vn.filter(s=>/^wall-\d+$/.test(s.name)).map(s=>[s.name,s])),Vo=Pr.map((s,B)=>{const[W,D]=w[s],q=`wall-${sn+B+1}`,Oe=Ho.get(q);return Oe?{id:W,regionId:Oe.id,regionName:Oe.name,vertices:D.vertices,bbox:Oe.bbox,area:Oe.area}:null}).filter(s=>s!=null),ot=[...j.current,...Vo];return qr(ot),j.current=ot,ur(vn),fr(vn.length),je(Xn),Qe(Do),zt(s=>s+1),Ue.current=null,br.current="",dr(!1),Sn.current=!1,Ee(null),Z.current=null,yr(null),tn.current=null,ze(new Map),Y.current=new Map,ot},getManualRegions:()=>[...j.current],deleteLasso:n=>{if(Y.current.has(n)){ze(b=>{const A=new Map(b);return A.delete(n),Y.current=A,A});return}const t=j.current.find(b=>b.id===n);if(!t)return;const o=U.current,r=te.current,i=Le.current;if(!r||!i)return;const a=/^wall-(\d+)$/.exec(t.regionName);if(!a)return;const l=Number(a[1])-1,{labels:c,baseboardBinary:m,cols:u,rows:p}=r,g=u*p,d=(0,F.getMaskSegmentRuntimeConfig)().mask.semanticColors,R=r.indexToName??d.map(b=>b.name);let y=r.wallSemanticIdx??d.findIndex(b=>b.name==="wall");if(y<0)return;const k=new Uint8Array(r.wallSubLabels?.length===g?r.wallSubLabels:new Uint8Array(g).fill(J.WALL_SUB_LABEL_NONE));for(let b=0;bb.id!==t.regionId),O=new Map(h.map(b=>[b.name,b.id])),P=(0,J.patchPickMapForManualWallSplit)(i.buffer,c,m,y,k,O,u,p),w=new Map(V.current);w.delete(t.regionId),Be.current.delete(t.regionId),V.current=w;const L=tr.current.filter(b=>b!==t.regionId);tr.current=L,U.current=h,Le.current={buffer:P,cols:u,rows:p},te.current={labels:r.labels,baseboardBinary:r.baseboardBinary,cols:u,rows:p,wallSubLabels:k,indexToName:R,wallSemanticIdx:y};const M=j.current.filter(b=>b.id!==n);j.current=M,qr(M),ur(h),fr(h.length),je(w),Qe(L),zt(b=>b+1),Ue.current=null,br.current=""}}),[rt,we,ee,rr,dn,Zr,kr,Yt,Ut,Sr]);const[Wo,Mn]=(0,e.useState)(new Map);(0,e.useEffect)(()=>{if(!G||!_||en.length===0){G||(Mn(new Map),wn(!1),Ue.current=null);return}const n=te.current;if(!n){Mn(new Map),wn(!1);return}const t=en.map(a=>`${a.id}:${a.name}`).join("|");if(br.current===t&&Ue.current&&(0,f.rectsEqual)(Ue.current,_))return;const o=__DEV__?performance.now():0,r=(0,de.downsampleMaskDataForPaths)(n,(0,F.getMaskSegmentRuntimeConfig)().pipeline.maskPathMaxLongSide),i=(0,de.buildAllRegionOutlinePaths)(en,r,_);Ue.current=_,br.current=t,Mn(i),wn(!0),Rn.current=!0,wr()},[G,_,en,wr]);const ts=(0,e.useMemo)(()=>{if(yn==null||Dr==null||!_||en.length===0)return null;const n=te.current;if(!n)return null;const t=(0,de.downsampleMaskDataForPaths)(n,(0,F.getMaskSegmentRuntimeConfig)().pipeline.maskPathMaxLongSide);return(0,de.buildRegionOutlinePathForRegion)(yn,en,t,_,Dr)},[yn,Dr,_,en]),Eo=(n,t=1)=>!n||!_?null:(0,I.jsx)(S.Image,{image:n,x:_.x,y:_.y,width:_.w,height:_.h,opacity:t}),Qt=(n,t)=>{const o=Wo.get(n);return!o||!_?null:(0,I.jsxs)(I.Fragment,{children:[(0,I.jsx)(S.Path,{path:o,color:pt.regionOverlayFill,style:"fill",opacity:.05},`${t}-fill-${n}`),(0,I.jsx)(S.Path,{path:o,color:pt.regionOverlayFill,style:"stroke",strokeWidth:3,strokeJoin:"round",antiAlias:!0,children:(0,I.jsx)(S.DashPathEffect,{intervals:[8,6]})},`${t}-stroke-${n}`)]})},Ao=(0,e.useMemo)(()=>{if(!(Hn<=1))return(0,f.buildZoomPanMatrix)(Vn.x,Vn.y,Hn,me,ge)},[Hn,Vn,me,ge]),Bo=()=>{const n=mr??Ve;if(!n||!_)return null;const t=!Et&&G,o=xr&&Ve&&gr&&Ce,r=!Et&&ee.size>0&&o,i=mr??Ve;return(0,I.jsxs)(I.Fragment,{children:[(0,I.jsx)(S.Rect,{x:0,y:0,width:me,height:ge,color:"#F0F1F3"}),(0,I.jsx)(S.Group,{clip:S.Skia.XYWHRect(0,0,me,ge),children:(0,I.jsxs)(S.Group,{matrix:Ao,children:[r&&i?(0,I.jsx)(Ln.PaintShaderLayer,{originImage:i,paintColorMap:xr,lowFreqImage:Ve,highFreqImage:gr,x:_.x,y:_.y,width:_.w,height:_.h,showOrigin:!1}):Eo(n),t&&kt!=null&&Qt(kt,"init-overlay"),t&&yn!=null&&!ee.has(yn)&&Qt(yn,"hold-overlay"),kn&&ne&&_&&(()=>{const l=[],c=ne.w,m=ne.h,u=_,p=(h,O)=>({x:u.x+h*u.w,y:u.y+O*u.h}),g=tn.current?Ro:xo,d=te.current,R=d?.wallSemanticIdx??(0,F.getMaskSegmentRuntimeConfig)().mask.semanticColors.findIndex(h=>h.name==="wall"),y=d&&R>=0?{labels:d.labels,baseboardBinary:d.baseboardBinary,cols:d.cols,rows:d.rows,wallSemanticIdx:R}:null,k=h=>y?(0,$.filterVerticesToWallMask)(h,y):h;for(const[,h]of Jr){const O=k(h.vertices);if(!h.isClosed||O.length<3)continue;const P=S.Skia.Path.Make(),w=p(O[0].x,O[0].y);P.moveTo(w.x,w.y);for(let L=1;L0){const h=k(zn);if(h.length>0){const O=S.Skia.Path.Make(),P=p(h[0].x,h[0].y);O.moveTo(P.x,P.y);for(let w=1;w=3&&O.lineTo(P.x,P.y),l.push((0,I.jsx)(S.Path,{path:O,color:g,style:"stroke",strokeWidth:2.5,strokeJoin:"round",antiAlias:!0,children:(0,I.jsx)(S.DashPathEffect,{intervals:[10,6]})},"lasso-current"));for(let w=0;w=3&&!M,A=M?7:b?6:4,oe=S.Skia.Path.Make(),C=S.Skia.XYWHRect(L.x-A,L.y-A,A*2,A*2);if(oe.addOval(C),l.push((0,I.jsx)(S.Path,{path:oe,color:M?"#FFFFFF":g,style:"fill",antiAlias:!0},`lasso-dot-cur-${w}`)),M||b){const se=S.Skia.Path.Make(),ie=b?A+5:A;se.addOval(S.Skia.XYWHRect(L.x-ie,L.y-ie,ie*2,ie*2)),l.push((0,I.jsx)(S.Path,{path:se,color:g,style:"stroke",strokeWidth:b?1.5:2,opacity:b?.65:1,antiAlias:!0},`lasso-dot-cur-ring-${w}`))}}}}return l})()]})})]})},Fo=()=>{const n=We;if(!n)return null;const t=n.w,o=n.h,r=xr&&Ve&&gr&&Ce,i=ee.size>0&&r,a=mr??Ve;if(i&&a)return(0,I.jsx)(Ln.PaintShaderLayer,{originImage:a,paintColorMap:xr,lowFreqImage:Ve,highFreqImage:gr,x:0,y:0,width:t,height:o,showOrigin:!1});const l=mr??Ve;return l?(0,I.jsx)(S.Image,{image:l,x:0,y:0,width:t,height:o}):null},eo=(0,e.useMemo)(()=>{const n=(r,i)=>{Zt.current?.();const a=(0,f.screenToCanvasCoords)(r,i,ye.current,he.current,ce.current,be.current),l=Qr.current(a.x,a.y,!0);if(l==null||!Fe.current){hn(null),bn(null);return}if(V.current&&V.current.has(l)){hn(null),bn(null);return}const c=(0,f.canvasToNormalized)(a.x,a.y,ye.current,he.current,Fe.current.w,Fe.current.h);hn(l),bn(c)},t=(r,i,a)=>{if(!a)return;const l=(0,f.screenToCanvasCoords)(r,i,ye.current,he.current,ce.current,be.current);if(jr.current)et.current(l.x,l.y);else{if(we(),Xt.current||!Kt.current||!Fe.current)return;const c=Qr.current(l.x,l.y);if(c==null)return;const m=U.current.find(u=>u.id===c);Fr.current?.({kind:"brush_required",hint:"please select a brush color first",regionId:c,regionName:m?.name??String(c)})}},o=(r,i)=>{if(jr.current){hn(null),bn(null);return}const a=(0,f.screenToCanvasCoords)(r,i,ye.current,he.current,ce.current,be.current);et.current(a.x,a.y),hn(null),bn(null)};return ve.Gesture.Tap().onBegin(r=>{"worklet";(0,fe.runOnJS)(n)(r.x,r.y)}).onEnd((r,i)=>{"worklet";(0,fe.runOnJS)(t)(r.x,r.y,i)}).onFinalize(r=>{"worklet";(0,fe.runOnJS)(o)(r.x,r.y)})},[]),tt=(0,e.useMemo)(()=>{const n=(r,i)=>{Ot.current=ce.current,Tt.current={...be.current},_t.current={x:r,y:i}},t=(r,i,a)=>{const l=ye.current,c=he.current;if(l<=0||c<=0)return;const m=l/2,u=c/2,p=Ot.current,g=Tt.current,d=_t.current;let R=Math.max(1,Math.min(p*r,5));const y=(d.x-g.x-m)/p+m,k=(d.y-g.y-u)/p+u;let h={x:i-m-R*(y-m),y:a-u-R*(k-u)};R<=1?(R=1,h={x:0,y:0}):h=(0,f.clampPanOffset)(h,R,l,c,Gr.current),Ft(R),$r(h),ce.current=R,be.current=h},o=()=>{ce.current<=1.01&&nt.current?.()};return ve.Gesture.Pinch().onStart(r=>{"worklet";(0,fe.runOnJS)(n)(r.focalX,r.focalY)}).onUpdate(r=>{"worklet";(0,fe.runOnJS)(t)(r.scale,r.focalX,r.focalY)}).onEnd(()=>{"worklet";(0,fe.runOnJS)(o)()})},[]),no=(0,e.useMemo)(()=>{const n=()=>{Sn.current&&nn.current||(Ur.current={...be.current})},t=(r,i)=>{if(ce.current<=1)return;const a=(0,f.clampPanOffset)({x:Ur.current.x+r,y:Ur.current.y+i},ce.current,ye.current,he.current,Gr.current);$r(a),be.current=a},o=()=>{ce.current<=1.01&&nt.current?.()};return ve.Gesture.Pan().minPointers(1).maxPointers(1).minDistance(10).onStart(()=>{"worklet";(0,fe.runOnJS)(n)()}).onUpdate(r=>{"worklet";(0,fe.runOnJS)(t)(r.translationX,r.translationY)}).onEnd(()=>{"worklet";(0,fe.runOnJS)(o)()})},[]),ro=(0,e.useMemo)(()=>{const n=(a,l)=>{const c=nn.current;if(!c)return;const m=te.current,u=lo(m),p=u?(0,$.resolveLassoWallDragPoint)(a,l,u,Mo):{x:a,y:l};if(!p)return;const g=c.kind==="closed"?c.polyId:void 0;if(!vr(p.x,p.y,m)&&!Ir(p.x,p.y,j.current,Y.current,g)){if(pr.current=!0,c.kind==="open"){Ee(d=>{if(!d||c.vertexIndex>=d.length)return d;const R=[...d];return R[c.vertexIndex]=p,Z.current=R,R});return}c.kind==="closed"&&c.polyId&&ze(d=>{const R=d.get(c.polyId);if(!R||c.vertexIndex>=R.vertices.length)return d;const y=new Map(d),k=[...R.vertices];return k[c.vertexIndex]=p,y.set(c.polyId,{...R,vertices:k}),Y.current=y,y})}},t=(a,l)=>{const c=ye.current,m=he.current;if(c<=0||m<=0)return;const u=(0,f.screenToCanvasCoords)(a,l,c,m,ce.current,be.current),p=Fe.current;if(!p)return;const g=(0,f.canvasToNormalized)(u.x,u.y,c,m,p.w,p.h);if(!g)return;const d=lo(te.current),R=te.current,y=d?(0,$.snapNormPointToWallCornerOrEdge)(g.x,g.y,d,Co):g,k=tn.current,h=k!=null;if(Z.current&&Z.current.length>=3&&Zo(u.x,u.y,c,m,p.w,p.h,Z.current,ko)){const P=Z.current;if(!P||P.length<3||jo(P,R,j.current,Y.current))return;const w=`lasso_${++Dt.current}`,L={id:w,vertices:[...P],isClosed:!0};ze(M=>{const b=new Map(M);return b.set(w,L),Y.current=b,b}),Ee(null),Z.current=null;return}if(!co(y.x,y.y,R,d,j.current,Y.current))return;const O=Z.current;if(O&&O.length>0){for(let w=0;w0){const w=P[P.length-1],L=(0,$.normToEnergyPoint)(w.x,w.y,k),M=(0,$.normToEnergyPoint)(y.x,y.y,k),b=(0,$.findShortestPath)(k.map,k.w,k.h,L.x,L.y,M.x,M.y,k.traversable),A=(0,$.extractCornerPoints)(b,4,1),oe=(0,$.energyPointsToNorm)(A,k).filter(C=>co(C.x,C.y,R,d,j.current,Y.current)).filter((C,se)=>{if(se>0)return!0;const ie=P[P.length-1];return Math.hypot(C.x-ie.x,C.y-ie.y)>5e-4});if(oe.length===0)return;Ee(C=>{if(!C)return oe;const se=[...C,...oe];return Z.current=se,se});return}}Ee(P=>{const w=P?[...P,y]:[y];return Z.current=w,w})},o=(a,l)=>{rn.current={x:a,y:l},pr.current=!1,$e.current=null;const c=ye.current,m=he.current,u=Fe.current;if(!u||c<=0||m<=0)return;const p=(0,f.screenToCanvasCoords)(a,l,c,m,ce.current,be.current),g=Z.current,d=g!=null&&g.length>0,R=Yo(p.x,p.y,c,m,u.w,u.h,Ht,g,Y.current,{openOnly:d});R&&($e.current=R)},r=(a,l)=>{if(nn.current){const p=ye.current,g=he.current,d=Fe.current;if(!d||p<=0||g<=0)return;const R=(0,f.screenToCanvasCoords)(a,l,p,g,ce.current,be.current),y=(0,f.canvasToNormalized)(R.x,R.y,p,g,d.w,d.h);if(!y)return;n(y.x,y.y);return}const c=rn.current;if(!c)return;const m=Math.hypot(a-c.x,l-c.y);if(m>vo&&!$e.current){rn.current=null;return}const u=$e.current;!u||m{if(nn.current){nn.current=null,pr.current=!1,$e.current=null,Xr(null);return}$e.current=null;const c=rn.current;rn.current=null,c&&t(c.x,c.y)};return ve.Gesture.Pan().minPointers(1).maxPointers(1).minDistance(0).onBegin(a=>{"worklet";(0,fe.runOnJS)(o)(a.x,a.y)}).onUpdate(a=>{"worklet";(0,fe.runOnJS)(r)(a.x,a.y)}).onEnd(a=>{"worklet";(0,fe.runOnJS)(i)(a.x,a.y)}).onFinalize(a=>{"worklet";(0,fe.runOnJS)(i)(a.x,a.y)})},[]),Oo=(0,e.useMemo)(()=>kn?ve.Gesture.Simultaneous(tt,ro):ve.Gesture.Exclusive(ve.Gesture.Simultaneous(tt,no),eo),[kn,eo,ro,tt,no]);return(0,I.jsxs)(Je.View,{style:[io.container,Wr],children:[(0,I.jsx)(Je.View,{style:io.canvasWrap,onLayout:n=>{const{width:t,height:o}=n.nativeEvent.layout;Io(t,o)},children:wo?(0,I.jsx)(ve.GestureDetector,{gesture:Oo,children:(0,I.jsx)(Je.View,{style:{width:me,height:ge},children:(0,I.jsx)(S.Canvas,{style:{width:me,height:ge},pointerEvents:"none",children:Bo()})})},kn?"lasso":"paint"):null}),ho&&We?(0,I.jsx)(Je.View,{style:{position:"absolute",left:-We.w-200,top:0,width:We.w,height:We.h,opacity:0,overflow:"hidden"},pointerEvents:"none",children:(0,I.jsx)(S.Canvas,{ref:Mt,style:{width:We.w,height:We.h},pointerEvents:"none",children:(0,I.jsx)(S.Group,{children:Fo()})})}):null]})}),io=Je.StyleSheet.create({container:{flex:1,backgroundColor:"#fff"},canvasWrap:{flex:1,width:"100%",alignSelf:"stretch",position:"relative",backgroundColor:"#f5f5f5",borderWidth:Je.StyleSheet.hairlineWidth,borderColor:"#ddd",overflow:"hidden"}});var es=Qo;