From 80018d4be110080cf5f5904a483d33d29fea27e7 Mon Sep 17 00:00:00 2001 From: matei jordache Date: Sun, 29 Mar 2026 23:56:02 -0700 Subject: [PATCH] remove coverage test cruft, fix submodule link --- .coverage | Bin 69632 -> 0 bytes .gitignore | 3 +- README.md | 4 +- .../lcov-report/angleMeasureGeometry.js.html | 316 -- frontend/coverage/lcov-report/base.css | 224 -- .../coverage/lcov-report/block-navigation.js | 87 - .../canvasInteractionTargets.js.html | 232 -- .../lcov-report/connectionUtils.js.html | 451 --- .../coverage/lcov-report/constants.js.html | 391 --- .../lcov-report/defaultWorkflow.js.html | 253 -- .../lcov-report/executionGraph.js.html | 559 ---- frontend/coverage/lcov-report/favicon.png | Bin 445 -> 0 bytes .../coverage/lcov-report/groupDrag.js.html | 139 - .../coverage/lcov-report/groupSizing.js.html | 190 -- frontend/coverage/lcov-report/index.html | 401 --- .../lcov-report/loadNodeOutputs.js.html | 175 - .../lcov-report/markupShapeGeometry.js.html | 379 --- .../lcov-report/nodeClipboard.js.html | 1045 ------ .../lcov-report/nodeHierarchy.js.html | 169 - .../lcov-report/nodeWidgetDefaults.js.html | 163 - .../lcov-report/nodeWidgetLayout.js.html | 232 -- .../coverage/lcov-report/pngMetadata.js.html | 577 ---- frontend/coverage/lcov-report/prettify.css | 1 - frontend/coverage/lcov-report/prettify.js | 2 - .../runtimeValuePersistence.js.html | 115 - .../lcov-report/sort-arrow-sprite.png | Bin 138 -> 0 bytes frontend/coverage/lcov-report/sorter.js | 210 -- .../lcov-report/valueFormatting.js.html | 757 ----- .../lcov-report/workflowCapture.js.html | 664 ---- .../lcov-report/workflowHydration.js.html | 331 -- .../lcov-report/workflowSerialization.js.html | 280 -- frontend/coverage/lcov.info | 2979 ----------------- requirements.txt | 4 - 33 files changed, 4 insertions(+), 11329 deletions(-) delete mode 100644 .coverage delete mode 100644 frontend/coverage/lcov-report/angleMeasureGeometry.js.html delete mode 100644 frontend/coverage/lcov-report/base.css delete mode 100644 frontend/coverage/lcov-report/block-navigation.js delete mode 100644 frontend/coverage/lcov-report/canvasInteractionTargets.js.html delete mode 100644 frontend/coverage/lcov-report/connectionUtils.js.html delete mode 100644 frontend/coverage/lcov-report/constants.js.html delete mode 100644 frontend/coverage/lcov-report/defaultWorkflow.js.html delete mode 100644 frontend/coverage/lcov-report/executionGraph.js.html delete mode 100644 frontend/coverage/lcov-report/favicon.png delete mode 100644 frontend/coverage/lcov-report/groupDrag.js.html delete mode 100644 frontend/coverage/lcov-report/groupSizing.js.html delete mode 100644 frontend/coverage/lcov-report/index.html delete mode 100644 frontend/coverage/lcov-report/loadNodeOutputs.js.html delete mode 100644 frontend/coverage/lcov-report/markupShapeGeometry.js.html delete mode 100644 frontend/coverage/lcov-report/nodeClipboard.js.html delete mode 100644 frontend/coverage/lcov-report/nodeHierarchy.js.html delete mode 100644 frontend/coverage/lcov-report/nodeWidgetDefaults.js.html delete mode 100644 frontend/coverage/lcov-report/nodeWidgetLayout.js.html delete mode 100644 frontend/coverage/lcov-report/pngMetadata.js.html delete mode 100644 frontend/coverage/lcov-report/prettify.css delete mode 100644 frontend/coverage/lcov-report/prettify.js delete mode 100644 frontend/coverage/lcov-report/runtimeValuePersistence.js.html delete mode 100644 frontend/coverage/lcov-report/sort-arrow-sprite.png delete mode 100644 frontend/coverage/lcov-report/sorter.js delete mode 100644 frontend/coverage/lcov-report/valueFormatting.js.html delete mode 100644 frontend/coverage/lcov-report/workflowCapture.js.html delete mode 100644 frontend/coverage/lcov-report/workflowHydration.js.html delete mode 100644 frontend/coverage/lcov-report/workflowSerialization.js.html delete mode 100644 frontend/coverage/lcov.info delete mode 100644 requirements.txt diff --git a/.coverage b/.coverage deleted file mode 100644 index a53ebb9494c0e6fcd8e3e70848145d8677efb7d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69632 zcmeHQ3ve98ncms=V|GTethXhtC0nwr$Le8QGCm|^JuC~Sh{2FcNM#xAj-<8s#mq{w zY>?PIfLt&RM=rnx>|7m?O0IyA9C2&|;)*ImLSh%(1upoZOMH$gFqXjv;n>pL-@Ut% zRluQ>C>D!!Nh!0{;GXuH|rw^Z7y;R4$j z1B?O20At{)VIa1Vw`Aw$a$mhODs>0ss3Lh~CI0Dby|KMzQ@d+Z%i0a?uJ}3EGP?`5 zsw!8DO9>CUBC_J@@dsp=Kjia!rKmsD>x%Zt$-Dbi*+=RuI0v;Bxv`o)Pxd^1A3PP6 zdjTS%_=A!%y&IaV?hledYG@ zuZ`F(*%=w!Ju*#`qukNU$Qm%LT>_D5ykB@)@>v~x5b}KeAg^?W*)x8 zlZo3C5BGp_p>UGcnFq;N!^2ePP=Bx+DBs*4jF8NMC*ofm4PWlb%RL(nCldQ7=glSZ zawfeg*_ouANx zivj^xxQDt7dD<1v9I)ouKI2Z3At}VsT;arxpy^-K+K95CgR46b?oPEeYB8z|4gzIC z^0uD-ke9fMO48sB56FttD_1A3#*2l&v>}1%)Y{D1?M0U}ooN&B)K2f(W4UHac78th zRU0*;7?aSB1QXL^K~buLGdz^IeSg! zcxuU~`Ri$Vs`9-C%6>Dz(sEKNpQ2& z9qx}(`z43eJW1U%qi-Bw<~Yec+*M9*2lxJbSXKQ{t&(a>y(W3qRn{k|q!d!iT;1Vt zK$b%Bx&fY8ufliwRTtG^ey!9zgP{%)jNXAVs#CIZA;tVAaJr;_!A>wJg?x$nid4gK zR4Dt2bCU0g7b5VWs|=h{1s9!znFLK-B_&o8zd8b(5Y(XLi@Q6?lv#*_eeyiGcx}`s zMdheJD7(llR2gbmgOcjWDdD=N5Hf5L;~g_B2xmOxNSrZsV>PqC~y7iWy@1}LSWi8R}|2;s9hB!}^D zASGfv+q>h`CGSc!knH77(2^4`=-`iSi~+^~V}LQh7+?%A1{ed30mcAhfHA-rU<_P+ z3>Y{)XCd*wUi=@Ocp5&~#u#7>Fa{U{i~+^~V}LQh7+?%A1{ed30mi`JBm=zOP#`9M z7E+VO8S--zzX52duC1?LX@^wl#dmb#JK{%wlL=%>GX@v~i~+^~V}LQh7+?%A1{ed3 z0mcAhfH5%50BCw>@d|+KR1jTkp57w@g}|wfHRs=2y*knHx;wrYB6@rX1tz z#`}z&Mx9}wAz&!gAJ;#m-=t6De$Cy-t%cVHJT|8HkwgHabNbKk7OY!WxTuR!*1 zhS`-8Or~(R$?BG9IO2wxD=<~hC%d~P?-n`abCUzrJqR}|YM<=$sB&*m4n<)~X*dLv zOs-o6kR}YI3K%LNbgl%1ObmiofoVLT5S_gSNX;t%$$&wMsJZkye zbc{|gw>lK{(0NUOvvxV)pzLPAFAsX^Nv5}!1BL^m3!O9P@rMDVeHnm=7!cynkXwE) z_3AQ!L3wpVk!g}(<~dA51#c(?B$QLa)b%a>5rF7iid9Am^}>Y4#N0_h>R19usO*+P zp>Vv^B=oE+0h|mJ%P?u)qsYN9L@`s?pjuM>;uSln0Sc&w7 z1L58wf>nUUqLY;2)dn!6IOkMW%${wE_g|q=qb1vYZYGq=f0ML>H0H^{$As$B{)@1_(%H6=4Au;gg0iUc8 zU9zyc#NQx5_{hZa0R;$2%=(1@kd1Lw>Iu<4MOMLtNsZB#0Z^!VnL_y#X%JA_7XS*X z$_U5F@>4)MxVB51VG5da5O5PHM( z{U>0?9x^AMuuJv^%hx(7GLph#)DnuCoISDuhTj5t?m) zfGT2o;0-dMLbDYO5b)C$h6Mmn%^jFq51|z_F?@cB1XNvSKth>H0;yN(hnE{rthFY< zLNzM;5TZibtkX#Wnz?T)u$WwTMu&w#d6{I!i|E} z+U0zO-{-vB5H$Zn*kvelw(*mWF~hsQeqi(2 zO3X2HqyAyz8yx5Oj&X-^z3yr9b(rl&W2}tB)Et+M{~KD2F%t?h8UL?ZZ;WN45a!1J zE3Y%g3@D^T{J&zYF=jylOvnHAt;U!Q1u+x<*P+#zj{j?~H^y>NYRr%SYpzHg8vnc7 zjWH)mo!Rk!_2-PS0u;)n;{PhNPP60x%5}zAI!dS1_`d>eH#717@-}14fzoAG{9oQ- zjEN|al=y!c+N68-x7oxG|$NvRr=baV*FG4FcKmN~06P_CX=b>xm zMEswNE&!(E{~WZt&58fB(Yj2>|5<2067hd#mob)&a@Be9|3Y*fI6MB&Kvx+l@&5v} z!KKFk>1clD#s6tns8TZi7q7rC=f?j6n(dVM--)*5>G+>VYmyTGJJ2CSGXA%tT`Cd( z+wcJK_}_|dVa$#HEof7jAOD-tjmnw$--OQOl=$C>cFKA2zX9!($@m{aXS^4s+Ae$l zAEqCIJ;NAa3@`>51B?O20AqkLz!+c*Fa{U{jDf!y1`M1*=Opw0Iq{+n{@BJCU<@z@ z7z2y}#sFi0F~AsL3@`>51B?O2z*WeA!Qix!@&DEK<2vyJ@r3vv;t$0~#czw>5Vwi9 zi5o<>@QLuQ@V4+P;pf5=!aoZ;g|7(_K^DF!6btFj3Fmfaud~hB=qz;d{1ktH|9AdL z{t^D0{1D&E-@;$dH}X~dVtyg7bG+r)>-er?z~OgnbgXkUI(Ya>wlM}61B?O20AqkL zz!+c*Fa|yg2Fg|&IoszOHXqtMq74rWPCb9}>GUV{jra-9V_5`&az$2Z+tSD zU04qXO*PB+T)1|_uT*xBu)W6zx8-aNbK&4JPPMke0e|JrX){;Pvib4zoV^MTvQ}K9J#e?dRtftHD-JdX)}&X!?vk=5-H7{VA8F4X z8hgraTTZTK{h{fN8nGO9U77FRp?zVhBTqYON?QgeiWd%_E_(gPcWQ5IU;La<24@Og z2epwSMgDW!O+qO-E*!ppYR8HnA0FN3SPI8EMZ>4_fB3$hUjhet8N;WW-}v$P4QVBC zR9sr^Bg)5x+HZ#%POct*%&m3g{n27CgezH&U0TQHk;MhD-)0{^G+L5(YIO8xACKo5 zbhqhrFL|E&?e{Hf8YeH@vS1P1Qd-@l6}^7jWb@&-$F#HA+wx7EEfzKX{tIVpCAylQ za%W-_&)?H*`0A+>+WDQ}33Lhh-&mh7+xh7ET5SpO4KiK(rIVBAuPs}1yZYFD4<0@E zL1uO2#E|Y8oiR1%&V0J))uz(jk9_ZuM}}UmsXy>Zv$nHY8#+94 za{N$!P990v;?3&N$kZL;C!S+}_uc>U4Llo(N109n&5<`BTk(=elvHmVK&)A;tY+9B=1y<^tAKVG;ndhXQj$?f0Gcfezfbxji!9V<@#=P$MW zPX)C@BOi^w@Pc;Uv%n4)OIHF7aMAtVsi&JK962^PSEp~%MoXOUY2%Y8Cyq7W>fWO% z4x1IOEEN7Q{J7p`A-hi4HQUXwo0Y#yd*Fb@VKUlmpzyVi-#%u@GQx%GB~7|xW6kUG z&TAK&UU+dL^BJz#0OvcFF2C!wM?XAqUek&uCML%3HN)Pa5p8lrJA3@TW)_uTQ(d+&a$nvDOi7F3-$CcZ5GqxdbcUHrOurx+F`u|cd6`^4A9U&8$V zd&OcgUo=B+z;WS-@RG1s_=)%f@xR3ZaUt{(Xu=2L2I1d?$Dt45l;{+GBYang3EPB& z;?v@n#3u2q@R;~V@j3Ak;T7?D=tWS)o5b(K7qg8qz!+c*Fa{U{i~+^~V}LQh7+?%A z2CilXNQBEZtfpdlBNgQhRHUtU0l0k)e0Tsq{Dhz2<)QeQC7O2Q`Qc=lM zQRkpyCG9cb^fr1VSgCMYsK_^y9t6%r50)6ISZbictv5k7*lNl6zYcni*v1%O3@`>5 z1B?O20AqkLz!+c*Fa{U{i~+{L)yn`G|7Y?4)tkR8WsCvF0AqkLz!+c*Fa{U{i~+^~ zV}LQh7$6L=@qcCqi~+^~V}LQh7+?%A1{ed30mcAhfHA-rxcV8eb31eeTq~!)S^vML zCrxL>=dC+=l`j*cT&q6au-|&v+8vuSU+$dPBUCvkdea^cLLH)z#UkJMlWzIIo z28YQqW%AlbEt@Sru@u^)_IleH6TC)(+hO~G&1Wky$IOlThmCJ=oZ~yj9me&#r?I@= zXpEJiR*oH%qOzj)$v%%N_Xg!qREqk;q3Xy`1A6gJvRt?d2&>RbXToxhstO8u6S}~g zV{|R3(^zvw>QGkP=yits{Ax4|It4+K>dzTt1*rV(Q6z6v3V3{euw6B7xm9SLAg2bT zXul$ZPL<|Ht{bIOMDd5Bo~YCvAUG9hyBYAygPwYl>C4eeh!04Ce%a#>14y~KQTJb{ z1QCaZ-12*g)ht7MbwrVAl9G%2mZ8m$tQCrI1(l zL}A5rwI{3)hh1zd;VMy}bb0Y`L{_F5bDOg z0ahV;t>%C~BzwGJMVYR=3ee8m(Z< z2dbM`C;;T53jl?99D&H`G{!PeI)F7pV$^`&Co2Gyjn*a9AMBe93uH+!vh5T5dg5FTNpk50EAZ1#PIng5>Q#trjkJF zmHJgRj%7wSD*NOBRKBEPU_v{0LLX>_0gMstl%y3`=kw4CTqXW(K$jB`Fh-#5r24lJ z96hk(uwg2uWMv5;51B?O2z@N;(XV8<6ZY=(}dmzzG#rg3Y zI<%M`oj^B#Q@caat$H;A-6#t5T~7z4HR#R^^)u=_L`P45jXgZ*#3Toi(Ba9P5dm~a z`RD6F|Lg3uLi^GsdX=vXE44Qmo$+&esQ)~ja_Ih@prmZ+C!HFlXmT#my^StMKbt;6 zbY9Kr*dxFHZ_quZ6Zea%xJ>w+@R+bsus9Dmzu|1w3$iCJbbj!x#R!MD*(xW zK}r0$IFbaLj_Y#n)AU#hTwhYFz|a zDCeCu{@<04RVX>6F*E+(kq1~PQ%@cLZ_WiARIQwd4qI{n0961?kN>aB1_+e9%^Cl1 z$-?R~9ZEH4V);mn|F2&N0NEH7?i;! zU=rj1>(j9O%rnOn;E|9S(!pbD*d -tono is a node-based image processing and analysis application. +tono is a node-based SPM image processing and analysis tool. The main focus is on topographical measurements. -It is heavily inspired by [Gwyddion](https://gwyddion.net/), one of the best scientific FOSS programs on the web. +It is heavily inspired by [Gwyddion](https://gwyddion.net/), one of the my favorite scientific FOSS programs on the web. ## Project layout diff --git a/frontend/coverage/lcov-report/angleMeasureGeometry.js.html b/frontend/coverage/lcov-report/angleMeasureGeometry.js.html deleted file mode 100644 index b3d1cd4..0000000 --- a/frontend/coverage/lcov-report/angleMeasureGeometry.js.html +++ /dev/null @@ -1,316 +0,0 @@ - - - - - - Code coverage report for angleMeasureGeometry.js - - - - - - - - - -
-
-

All files angleMeasureGeometry.js

-
- -
- 97.4% - Statements - 75/77 -
- - -
- 53.33% - Branches - 8/15 -
- - -
- 100% - Functions - 6/6 -
- - -
- 97.4% - Lines - 75/77 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -7818x -18x -18x -1x -1x -12x -12x -1x -1x -2x -2x -2x -2x -2x -2x -  -  -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -1x -1x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x - 
function clamp01(value) {
-  return Math.max(0, Math.min(1, Number(value) || 0));
-}
- 
-export function round3(value) {
-  return Number.parseFloat(Number(value).toFixed(3));
-}
- 
-export function getAngleLabelBasePosition(x1, y1, xm, ym, x2, y2) {
-  const va = { x: Number(x1) - Number(xm), y: Number(y1) - Number(ym) };
-  const vb = { x: Number(x2) - Number(xm), y: Number(y2) - Number(ym) };
-  const lenA = Math.hypot(va.x, va.y);
-  const lenB = Math.hypot(vb.x, vb.y);
- 
-  if (lenA <= 1e-6 || lenB <= 1e-6) {
-    return { x: clamp01(xm), y: clamp01(Number(ym) - 0.14) };
-  }
- 
-  const unit = {
-    x: (va.x / lenA) + (vb.x / lenB),
-    y: (va.y / lenA) + (vb.y / lenB),
-  };
-  const unitLength = Math.hypot(unit.x, unit.y);
-  const bisector = unitLength <= 1e-6
-    ? { x: 0, y: -1 }
-    : { x: unit.x / unitLength, y: unit.y / unitLength };
- 
-  return {
-    x: clamp01(Number(xm) + bisector.x * 0.14),
-    y: clamp01(Number(ym) + bisector.y * 0.14),
-  };
-}
- 
-export function getAngleLabelPosition(points, labelDx = 0, labelDy = 0) {
-  const base = getAngleLabelBasePosition(points.x1, points.y1, points.xm, points.ym, points.x2, points.y2);
-  return {
-    x: clamp01(base.x + (Number(labelDx) || 0)),
-    y: clamp01(base.y + (Number(labelDy) || 0)),
-  };
-}
- 
-export function moveAngleWidget(points, dx, dy) {
-  const nextDx = Number(dx) || 0;
-  const nextDy = Number(dy) || 0;
-  const xs = [points.x1, points.xm, points.x2];
-  const ys = [points.y1, points.ym, points.y2];
-  const minX = Math.min(...xs);
-  const maxX = Math.max(...xs);
-  const minY = Math.min(...ys);
-  const maxY = Math.max(...ys);
-  const clampedDx = Math.max(-minX, Math.min(1 - maxX, nextDx));
-  const clampedDy = Math.max(-minY, Math.min(1 - maxY, nextDy));
- 
-  return {
-    x1: round3(clamp01(points.x1 + clampedDx)),
-    y1: round3(clamp01(points.y1 + clampedDy)),
-    xm: round3(clamp01(points.xm + clampedDx)),
-    ym: round3(clamp01(points.ym + clampedDy)),
-    x2: round3(clamp01(points.x2 + clampedDx)),
-    y2: round3(clamp01(points.y2 + clampedDy)),
-  };
-}
- 
-export function measureAngleDegrees(x1, y1, xm, ym, x2, y2) {
-  const ax = Number(x1) - Number(xm);
-  const ay = Number(y1) - Number(ym);
-  const bx = Number(x2) - Number(xm);
-  const by = Number(y2) - Number(ym);
-  const lenA = Math.hypot(ax, ay);
-  const lenB = Math.hypot(bx, by);
- 
-  if (lenA <= 1e-12 || lenB <= 1e-12) return 0;
- 
-  const cosTheta = ((ax * bx) + (ay * by)) / (lenA * lenB);
-  const clamped = Math.max(-1, Math.min(1, cosTheta));
-  return Math.acos(clamped) * (180 / Math.PI);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov-report/base.css b/frontend/coverage/lcov-report/base.css deleted file mode 100644 index f418035..0000000 --- a/frontend/coverage/lcov-report/base.css +++ /dev/null @@ -1,224 +0,0 @@ -body, html { - margin:0; padding: 0; - height: 100%; -} -body { - font-family: Helvetica Neue, Helvetica, Arial; - font-size: 14px; - color:#333; -} -.small { font-size: 12px; } -*, *:after, *:before { - -webkit-box-sizing:border-box; - -moz-box-sizing:border-box; - box-sizing:border-box; - } -h1 { font-size: 20px; margin: 0;} -h2 { font-size: 14px; } -pre { - font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; - margin: 0; - padding: 0; - -moz-tab-size: 2; - -o-tab-size: 2; - tab-size: 2; -} -a { color:#0074D9; text-decoration:none; } -a:hover { text-decoration:underline; } -.strong { font-weight: bold; } -.space-top1 { padding: 10px 0 0 0; } -.pad2y { padding: 20px 0; } -.pad1y { padding: 10px 0; } -.pad2x { padding: 0 20px; } -.pad2 { padding: 20px; } -.pad1 { padding: 10px; } -.space-left2 { padding-left:55px; } -.space-right2 { padding-right:20px; } -.center { text-align:center; } -.clearfix { display:block; } -.clearfix:after { - content:''; - display:block; - height:0; - clear:both; - visibility:hidden; - } -.fl { float: left; } -@media only screen and (max-width:640px) { - .col3 { width:100%; max-width:100%; } - .hide-mobile { display:none!important; } -} - -.quiet { - color: #7f7f7f; - color: rgba(0,0,0,0.5); -} -.quiet a { opacity: 0.7; } - -.fraction { - font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; - font-size: 10px; - color: #555; - background: #E8E8E8; - padding: 4px 5px; - border-radius: 3px; - vertical-align: middle; -} - -div.path a:link, div.path a:visited { color: #333; } -table.coverage { - border-collapse: collapse; - margin: 10px 0 0 0; - padding: 0; -} - -table.coverage td { - margin: 0; - padding: 0; - vertical-align: top; -} -table.coverage td.line-count { - text-align: right; - padding: 0 5px 0 20px; -} -table.coverage td.line-coverage { - text-align: right; - padding-right: 10px; - min-width:20px; -} - -table.coverage td span.cline-any { - display: inline-block; - padding: 0 5px; - width: 100%; -} -.missing-if-branch { - display: inline-block; - margin-right: 5px; - border-radius: 3px; - position: relative; - padding: 0 4px; - background: #333; - color: yellow; -} - -.skip-if-branch { - display: none; - margin-right: 10px; - position: relative; - padding: 0 4px; - background: #ccc; - color: white; -} -.missing-if-branch .typ, .skip-if-branch .typ { - color: inherit !important; -} -.coverage-summary { - border-collapse: collapse; - width: 100%; -} -.coverage-summary tr { border-bottom: 1px solid #bbb; } -.keyline-all { border: 1px solid #ddd; } -.coverage-summary td, .coverage-summary th { padding: 10px; } -.coverage-summary tbody { border: 1px solid #bbb; } -.coverage-summary td { border-right: 1px solid #bbb; } -.coverage-summary td:last-child { border-right: none; } -.coverage-summary th { - text-align: left; - font-weight: normal; - white-space: nowrap; -} -.coverage-summary th.file { border-right: none !important; } -.coverage-summary th.pct { } -.coverage-summary th.pic, -.coverage-summary th.abs, -.coverage-summary td.pct, -.coverage-summary td.abs { text-align: right; } -.coverage-summary td.file { white-space: nowrap; } -.coverage-summary td.pic { min-width: 120px !important; } -.coverage-summary tfoot td { } - -.coverage-summary .sorter { - height: 10px; - width: 7px; - display: inline-block; - margin-left: 0.5em; - background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; -} -.coverage-summary .sorted .sorter { - background-position: 0 -20px; -} -.coverage-summary .sorted-desc .sorter { - background-position: 0 -10px; -} -.status-line { height: 10px; } -/* yellow */ -.cbranch-no { background: yellow !important; color: #111; } -/* dark red */ -.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } -.low .chart { border:1px solid #C21F39 } -.highlighted, -.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ - background: #C21F39 !important; -} -/* medium red */ -.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } -/* light red */ -.low, .cline-no { background:#FCE1E5 } -/* light green */ -.high, .cline-yes { background:rgb(230,245,208) } -/* medium green */ -.cstat-yes { background:rgb(161,215,106) } -/* dark green */ -.status-line.high, .high .cover-fill { background:rgb(77,146,33) } -.high .chart { border:1px solid rgb(77,146,33) } -/* dark yellow (gold) */ -.status-line.medium, .medium .cover-fill { background: #f9cd0b; } -.medium .chart { border:1px solid #f9cd0b; } -/* light yellow */ -.medium { background: #fff4c2; } - -.cstat-skip { background: #ddd; color: #111; } -.fstat-skip { background: #ddd; color: #111 !important; } -.cbranch-skip { background: #ddd !important; color: #111; } - -span.cline-neutral { background: #eaeaea; } - -.coverage-summary td.empty { - opacity: .5; - padding-top: 4px; - padding-bottom: 4px; - line-height: 1; - color: #888; -} - -.cover-fill, .cover-empty { - display:inline-block; - height: 12px; -} -.chart { - line-height: 0; -} -.cover-empty { - background: white; -} -.cover-full { - border-right: none !important; -} -pre.prettyprint { - border: none !important; - padding: 0 !important; - margin: 0 !important; -} -.com { color: #999 !important; } -.ignore-none { color: #999; font-weight: normal; } - -.wrapper { - min-height: 100%; - height: auto !important; - height: 100%; - margin: 0 auto -48px; -} -.footer, .push { - height: 48px; -} diff --git a/frontend/coverage/lcov-report/block-navigation.js b/frontend/coverage/lcov-report/block-navigation.js deleted file mode 100644 index 530d1ed..0000000 --- a/frontend/coverage/lcov-report/block-navigation.js +++ /dev/null @@ -1,87 +0,0 @@ -/* eslint-disable */ -var jumpToCode = (function init() { - // Classes of code we would like to highlight in the file view - var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; - - // Elements to highlight in the file listing view - var fileListingElements = ['td.pct.low']; - - // We don't want to select elements that are direct descendants of another match - var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` - - // Selector that finds elements on the page to which we can jump - var selector = - fileListingElements.join(', ') + - ', ' + - notSelector + - missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` - - // The NodeList of matching elements - var missingCoverageElements = document.querySelectorAll(selector); - - var currentIndex; - - function toggleClass(index) { - missingCoverageElements - .item(currentIndex) - .classList.remove('highlighted'); - missingCoverageElements.item(index).classList.add('highlighted'); - } - - function makeCurrent(index) { - toggleClass(index); - currentIndex = index; - missingCoverageElements.item(index).scrollIntoView({ - behavior: 'smooth', - block: 'center', - inline: 'center' - }); - } - - function goToPrevious() { - var nextIndex = 0; - if (typeof currentIndex !== 'number' || currentIndex === 0) { - nextIndex = missingCoverageElements.length - 1; - } else if (missingCoverageElements.length > 1) { - nextIndex = currentIndex - 1; - } - - makeCurrent(nextIndex); - } - - function goToNext() { - var nextIndex = 0; - - if ( - typeof currentIndex === 'number' && - currentIndex < missingCoverageElements.length - 1 - ) { - nextIndex = currentIndex + 1; - } - - makeCurrent(nextIndex); - } - - return function jump(event) { - if ( - document.getElementById('fileSearch') === document.activeElement && - document.activeElement != null - ) { - // if we're currently focused on the search input, we don't want to navigate - return; - } - - switch (event.which) { - case 78: // n - case 74: // j - goToNext(); - break; - case 66: // b - case 75: // k - case 80: // p - goToPrevious(); - break; - } - }; -})(); -window.addEventListener('keydown', jumpToCode); diff --git a/frontend/coverage/lcov-report/canvasInteractionTargets.js.html b/frontend/coverage/lcov-report/canvasInteractionTargets.js.html deleted file mode 100644 index 908de3b..0000000 --- a/frontend/coverage/lcov-report/canvasInteractionTargets.js.html +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - Code coverage report for canvasInteractionTargets.js - - - - - - - - - -
-
-

All files canvasInteractionTargets.js

-
- -
- 89.79% - Statements - 44/49 -
- - -
- 68% - Branches - 17/25 -
- - -
- 100% - Functions - 7/7 -
- - -
- 89.79% - Lines - 44/49 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -501x -1x -1x -42x -42x -42x -42x -  -  -  -42x -1x -17x -17x -17x -1x -25x -25x -25x -25x -1x -1x -9x -9x -6x -9x -1x -1x -3x -3x -3x -  -  -2x -3x -1x -1x -5x -5x -5x -2x -2x -2x -5x -1x -1x -3x -3x -3x - 
const EXCLUDED_CANVAS_TARGETS = '.context-menu, .react-flow__node, .react-flow__edge, .react-flow__controls, .react-flow__minimap, .surface-view-container';
-const CANVAS_AREA_TARGETS = '.react-flow, .react-flow__renderer, .react-flow__viewport, .react-flow__pane, .react-flow__background, .react-flow__selectionpane';
- 
-function getTargetElement(target) {
-  if (!target) return null;
-  if (typeof target.closest === 'function') return target;
-  if (target.parentElement && typeof target.parentElement.closest === 'function') {
-    return target.parentElement;
-  }
-  return null;
-}
- 
-function supportsClosest(target) {
-  return !!getTargetElement(target);
-}
- 
-function matchesClosest(target, selector) {
-  const element = getTargetElement(target);
-  return !!element && element.closest(selector) !== null;
-}
- 
-export function isEditableInteractionTarget(target) {
-  if (!supportsClosest(target)) return false;
-  if (matchesClosest(target, 'input, textarea, select')) return true;
-  return matchesClosest(target, '[contenteditable="true"]');
-}
- 
-export function canStartCanvasRightDragZoomTarget(target) {
-  if (!supportsClosest(target)) return false;
-  if (isEditableInteractionTarget(target)) return false;
-  if (matchesClosest(target, EXCLUDED_CANVAS_TARGETS)) {
-    return false;
-  }
-  return matchesClosest(target, CANVAS_AREA_TARGETS);
-}
- 
-export function canOpenCanvasContextMenuTarget(target) {
-  if (!supportsClosest(target)) return false;
-  if (isEditableInteractionTarget(target)) return false;
-  if (matchesClosest(target, EXCLUDED_CANVAS_TARGETS)) {
-    return false;
-  }
-  return matchesClosest(target, CANVAS_AREA_TARGETS);
-}
- 
-export function isSecondaryCanvasContextEvent(event) {
-  if (!event || typeof event.button !== 'number') return false;
-  return event.button === 2 || (event.button === 0 && !!event.ctrlKey);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov-report/connectionUtils.js.html b/frontend/coverage/lcov-report/connectionUtils.js.html deleted file mode 100644 index 6cbd31b..0000000 --- a/frontend/coverage/lcov-report/connectionUtils.js.html +++ /dev/null @@ -1,451 +0,0 @@ - - - - - - Code coverage report for connectionUtils.js - - - - - - - - - -
-
-

All files connectionUtils.js

-
- -
- 100% - Statements - 122/122 -
- - -
- 93.93% - Branches - 62/66 -
- - -
- 100% - Functions - 12/12 -
- - -
- 100% - Lines - 122/122 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -1231x -1x -1x -1x -1x -1x -1x -1x -20x -20x -1x -1x -12x -12x -1x -1x -5x -5x -1x -1x -11x -11x -1x -1x -12x -12x -12x -1x -1x -12x -1x -1x -33x -33x -9x -33x -7x -7x -7x -7x -7x -7x -33x -1x -1x -11x -11x -11x -1x -1x -10x -10x -10x -10x -10x -10x -10x -1x -1x -14x -14x -10x -10x -14x -14x -14x -1x -1x -1x -1x -17x -7x -7x -10x -17x -3x -3x -3x -8x -17x -17x -3x -3x -17x -17x -1x -1x -8x -3x -3x -8x -1x -1x -8x -1x -1x -8x -1x -1x -2x -8x -1x -1x -1x -1x -1x -1x -8x -8x -8x -8x -8x -3x -3x -8x -8x -8x -8x -8x -8x -8x -8x - 
// ── Connection utility functions ───────────────────────────────────────
-// Pure functions extracted from App.jsx so they can be independently tested.
- 
-import { socketSpecAcceptsType } from './constants.js';
- 
-// ── Handle ID helpers ─────────────────────────────────────────────────
- 
-export function getHandleType(handleId) {
-  return handleId.split('::')[2];
-}
- 
-export function getInputName(handleId) {
-  return handleId.split('::')[1];
-}
- 
-export function getOutputSlot(handleId) {
-  return parseInt(handleId.split('::')[1], 10);
-}
- 
-export function encodeProxyHandleRef(handleId) {
-  return encodeURIComponent(String(handleId || ''));
-}
- 
-export function decodeProxyHandleRef(encoded) {
-  try {
-    return decodeURIComponent(String(encoded || ''));
-  } catch {
-    return String(encoded || '');
-  }
-}
- 
-export function parseGroupProxyHandle(handleId) {
-  const text = String(handleId || '');
-  if (!text.startsWith('group-proxy::')) return null;
-  const parts = text.split('::');
-  if (parts.length < 5) return null;
-  return {
-    direction: parts[1],
-    nodeId: parts[2],
-    type: parts[3],
-    realHandle: decodeProxyHandleRef(parts.slice(4).join('::')),
-  };
-}
- 
-export function getConnectionHandleType(handleId) {
-  const proxy = parseGroupProxyHandle(handleId);
-  return proxy?.type || getHandleType(handleId);
-}
- 
-export function getResolvedHandleRef(nodeId, handleId) {
-  const proxy = parseGroupProxyHandle(handleId);
-  return {
-    nodeId: proxy?.nodeId || nodeId,
-    handleId: proxy?.realHandle || handleId,
-    type: proxy?.type || getHandleType(handleId),
-  };
-}
- 
-export function getNodeInputSpecForHandle(node, handleId) {
-  const definition = node?.data?.definition;
-  if (!definition?.input) return null;
-  const inputName = getInputName(handleId);
-  return definition.input.required?.[inputName]
-    || definition.input.optional?.[inputName]
-    || null;
-}
- 
-// ── Type compatibility ────────────────────────────────────────────────
- 
-export function outputTypeCanConnectToTarget(outputType, targetSpecOrType, outputAcceptedTypes = []) {
-  if (socketSpecAcceptsType(outputType, targetSpecOrType)) {
-    return true;
-  }
-  // Polymorphic output: the output socket declares it can also produce the target type
-  if (outputAcceptedTypes.length > 0) {
-    const targetType = Array.isArray(targetSpecOrType) ? targetSpecOrType[0] : targetSpecOrType;
-    if (outputAcceptedTypes.includes(targetType)) return true;
-  }
-  return outputType === 'ANNOTATION_SOURCE'
-    && !socketSpecAcceptsType('ANNOTATION_SOURCE', targetSpecOrType)
-    && (
-      socketSpecAcceptsType('DATA_FIELD', targetSpecOrType)
-      || socketSpecAcceptsType('IMAGE', targetSpecOrType)
-    );
-}
- 
-export function resolveOutputTypeForTarget(outputType, targetSpecOrType) {
-  if (outputType !== 'ANNOTATION_SOURCE') {
-    return outputType;
-  }
-  if (socketSpecAcceptsType('ANNOTATION_SOURCE', targetSpecOrType)) {
-    return 'ANNOTATION_SOURCE';
-  }
-  if (socketSpecAcceptsType('DATA_FIELD', targetSpecOrType)) {
-    return 'DATA_FIELD';
-  }
-  if (socketSpecAcceptsType('IMAGE', targetSpecOrType)) {
-    return 'IMAGE';
-  }
-  return 'ANNOTATION_SOURCE';
-}
- 
-// ── Pure connection validation ────────────────────────────────────────
-// Extracted from the isValidConnection useCallback so it can be unit-tested
-// without a ReactFlow context. Pass a `getNodeFn` that mirrors reactFlow.getNode.
- 
-export function checkConnectionValid(connection, getNodeFn) {
-  const srcType = getConnectionHandleType(connection.sourceHandle);
-  const resolvedTarget = getResolvedHandleRef(connection.target, connection.targetHandle);
-  const targetNode = getNodeFn(resolvedTarget.nodeId);
-  const targetSpec = getNodeInputSpecForHandle(targetNode, resolvedTarget.handleId) || resolvedTarget.type;
-  if (socketSpecAcceptsType(srcType, targetSpec)) return true;
-  // Polymorphic output: check if the source output declares it can produce the target type
-  const srcProxy = parseGroupProxyHandle(connection.sourceHandle);
-  const srcNodeId = srcProxy ? srcProxy.nodeId : connection.source;
-  const srcHandleId = srcProxy ? srcProxy.realHandle : connection.sourceHandle;
-  const srcNode = getNodeFn(srcNodeId);
-  const srcSlot = getOutputSlot(srcHandleId);
-  const srcAcceptedTypes = srcNode?.data?.definition?.output_accepted_types?.[srcSlot] || [];
-  const targetType = Array.isArray(targetSpec) ? targetSpec[0] : targetSpec;
-  return Array.isArray(srcAcceptedTypes) && srcAcceptedTypes.includes(targetType);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov-report/constants.js.html b/frontend/coverage/lcov-report/constants.js.html deleted file mode 100644 index 7335c98..0000000 --- a/frontend/coverage/lcov-report/constants.js.html +++ /dev/null @@ -1,391 +0,0 @@ - - - - - - Code coverage report for constants.js - - - - - - - - - -
-
-

All files constants.js

-
- -
- 97.05% - Statements - 99/102 -
- - -
- 76.47% - Branches - 13/17 -
- - -
- 100% - Functions - 5/5 -
- - -
- 97.05% - Lines - 99/102 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -1035x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -60x -60x -60x -  -60x -5x -5x -23x -23x -5x -5x -23x -23x -23x -5x -5x -50x -50x -50x -50x -  -  -50x -50x -50x -50x -3x -3x -3x -3x -50x -50x -50x -17x -17x -17x -17x -50x -50x -50x -5x -5x -49x -49x -49x -5x -5x -5x -5x -5x -5x -5x - 
// ── Shared type & color constants ─────────────────────────────────────
- 
-export const DATA_TYPES = new Set([
-  'DATA_FIELD', 'IMAGE', 'LINE', 'RECORD_TABLE', 'DATA_TABLE',
-  'COORD', 'ANNOTATION_SOURCE', 'COLORMAP',
-  'MESH_MODEL', 'FONT', 'FILE_PATH', 'DIRECTORY', 'COORDPAIR',
-]);
- 
-export const SOCKET_WIDGET_TYPES = new Set(['FLOAT', 'INT']);
- 
-export const TYPE_COLORS = {
-  DATA_FIELD:    '#3a7abf',
-  IMAGE:         '#00ff08a0',
-  LINE:          '#ffbe5c',
-  RECORD_TABLE: '#35e2fd',
-  DATA_TABLE:  '#ff7474',
-  COORD:         '#e91ed1',
-  COORDPAIR:     '#5cb861',
-  FLOAT:         '#ab3197',
-  INT:           '#ffffff',
-  ANNOTATION_SOURCE: '#06b6d4',
-  COLORMAP:      '#f472b6',
-  MESH_MODEL:    '#14b8a6',
-  FONT:          '#fb7185',
-  FILE_PATH:     '#f59e0b',
-  DIRECTORY:     '#f97316',
-};
- 
-export const CAT_COLORS = {
-  Input:           '#37474f',
-  Display:         '#212121',
-  Overlay:         '#0f766e',
-  Geometry:        '#0d9488',
-  Filter:          '#1a237e',
-  Spectral:        '#4c1d95',
-  'Level & Correct': '#1b5e20',
-  Measure:         '#4a148c',
-  Mask:            '#7c2d12',
-  Grains:    '#bf360c',
-};
- 
-export const SOCKET_COMPATIBILITY = {
-  FLOAT:         new Set(['INT']),
-  INT:           new Set(['FLOAT']),
-  LINE:          new Set(['COORDPAIR']),
-};
- 
-const EMPTY_SOCKET_TYPE_SET = new Set();
- 
-export function getSpecTypeAndOptions(spec) {
-  if (Array.isArray(spec)) {
-    return [spec[0], spec[1] || {}];
-  }
-  return [spec, {}];
-}
- 
-export function isDataSocketType(type) {
-  return typeof type === 'string' && DATA_TYPES.has(type);
-}
- 
-export function isDataSocketSpec(spec) {
-  const [type] = getSpecTypeAndOptions(spec);
-  return isDataSocketType(type);
-}
- 
-export function getAcceptedSocketTypes(specOrType) {
-  const [type, opts] = Array.isArray(specOrType)
-    ? getSpecTypeAndOptions(specOrType)
-    : [specOrType, {}];
-  if (typeof type !== 'string') {
-    return EMPTY_SOCKET_TYPE_SET;
-  }
- 
-  const accepted = new Set([type]);
-  const explicitAccepted = Array.isArray(opts?.accepted_types) ? opts.accepted_types : [];
-  for (const acceptedType of explicitAccepted) {
-    if (typeof acceptedType === 'string' && acceptedType) {
-      accepted.add(acceptedType);
-    }
-  }
- 
-  const fallbackAccepted = SOCKET_COMPATIBILITY[type];
-  if (fallbackAccepted) {
-    for (const acceptedType of fallbackAccepted) {
-      accepted.add(acceptedType);
-    }
-  }
- 
-  return accepted;
-}
- 
-export function socketSpecAcceptsType(sourceType, targetSpecOrType) {
-  if (typeof sourceType !== 'string' || !sourceType) return false;
-  return getAcceptedSocketTypes(targetSpecOrType).has(sourceType);
-}
- 
-// Colors used in Canvas 2D / toBlob contexts where CSS var() is unavailable.
-export const CANVAS_COLORS = {
-  bgDeep:      '#0f172a',
-  maskStroke:  '#ffffff',
-  maskOverlay: 'rgba(255, 59, 59, 0.16)',
-};
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov-report/defaultWorkflow.js.html b/frontend/coverage/lcov-report/defaultWorkflow.js.html deleted file mode 100644 index 0381896..0000000 --- a/frontend/coverage/lcov-report/defaultWorkflow.js.html +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - Code coverage report for defaultWorkflow.js - - - - - - - - - -
-
-

All files defaultWorkflow.js

-
- -
- 89.28% - Statements - 50/56 -
- - -
- 86.36% - Branches - 19/22 -
- - -
- 100% - Functions - 2/2 -
- - -
- 89.28% - Lines - 50/56 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -571x -1x -1x -1x -1x -1x -1x -11x -11x -11x -11x -11x -2x -2x -9x -11x -11x -11x -11x -5x -  -  -4x -11x -2x -1x -1x -2x -  -  -2x -2x -11x -1x -11x -  -  -1x -11x -1x -1x -6x -6x -6x -6x -11x -11x -2x -2x -2x -2x -2x -2x -11x -4x -6x - 
import { extractWorkflow } from './pngMetadata.js';
- 
-const DEFAULT_WORKFLOW_CANDIDATES = [
-  { path: '/default-workflow.json', type: 'json' },
-  { path: '/default-workflow.png', type: 'png' },
-];
- 
-async function loadCandidate(candidate, fetchImpl, extractWorkflowFn) {
-  let response;
-  try {
-    response = await fetchImpl(candidate.path, { cache: 'no-store' });
-  } catch {
-    return null;
-  }
- 
-  const contentType = response.headers?.get?.('content-type') || '';
-  const isHtmlFallback = typeof contentType === 'string' && contentType.toLowerCase().includes('text/html');
- 
-  if (!response.ok) {
-    if (response.status === 404 || response.status === 0) return null;
-    throw new Error(`Failed to load ${candidate.path} (${response.status})`);
-  }
- 
-  if (candidate.type === 'json') {
-    if (isHtmlFallback) return null;
-    try {
-      return await response.json();
-    } catch {
-      throw new Error(`${candidate.path} is not valid JSON`);
-    }
-  }
- 
-  if (isHtmlFallback) return null;
-  const workflow = await extractWorkflowFn(await response.blob());
-  if (!workflow) {
-    throw new Error(`${candidate.path} does not contain embedded workflow metadata`);
-  }
-  return workflow;
-}
- 
-export async function loadDefaultWorkflowAsset({
-  fetchImpl = fetch,
-  extractWorkflowFn = extractWorkflow,
-} = {}) {
-  for (const candidate of DEFAULT_WORKFLOW_CANDIDATES) {
-    const workflow = await loadCandidate(candidate, fetchImpl, extractWorkflowFn);
-    if (workflow) {
-      return {
-        source: candidate.path,
-        format: candidate.type,
-        workflow,
-      };
-    }
-  }
-  return null;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov-report/executionGraph.js.html b/frontend/coverage/lcov-report/executionGraph.js.html deleted file mode 100644 index a9cafad..0000000 --- a/frontend/coverage/lcov-report/executionGraph.js.html +++ /dev/null @@ -1,559 +0,0 @@ - - - - - - Code coverage report for executionGraph.js - - - - - - - - - -
-
-

All files executionGraph.js

-
- -
- 99.36% - Statements - 157/158 -
- - -
- 79.48% - Branches - 62/78 -
- - -
- 100% - Functions - 10/10 -
- - -
- 99.36% - Lines - 157/158 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -1591x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -9x -9x -9x -1x -5x -5x -5x -1x -22x -22x -22x -3x -3x -22x -22x -22x -22x -22x -22x -1x -1x -11x -11x -7x -7x -7x -7x -11x -11x -1x -11x -11x -11x -1x -9x -9x -5x -5x -9x -4x -4x -  -9x -1x -11x -11x -11x -11x -11x -25x -25x -6x -6x -25x -11x -11x -11x -1x -1x -7x -7x -7x -7x -16x -13x -13x -16x -16x -16x -13x -13x -16x -16x -16x -16x -16x -16x -16x -16x -18x -12x -18x -18x -7x -7x -7x -18x -13x -13x -13x -13x -16x -5x -5x -5x -5x -13x -13x -13x -7x -7x -7x -1x -1x -4x -4x -4x -1x -1x -5x -5x -5x -5x -5x -7x -7x -7x -7x -7x -7x -1x -1x -1x -1x -7x -7x -7x -7x -6x -7x -2x -1x -1x -7x -4x -4x -3x -3x -3x -4x -7x -7x -3x -3x -5x - 
import { getSpecTypeAndOptions, isDataSocketSpec } from './constants.js';
- 
-const OMITTED_WIDGET_INPUTS_BY_CLASS = {
-  View3D: new Set([
-    'camera_azimuth',
-    'camera_polar',
-    'camera_distance',
-    'camera_target_x',
-    'camera_target_y',
-    'camera_target_z',
-  ]),
-};
- 
-function getInputName(handleId) {
-  return handleId.split('::')[1];
-}
- 
-function getOutputSlot(handleId) {
-  return parseInt(handleId.split('::')[1], 10);
-}
- 
-function resolveExecutionEdge(edge) {
-  const original = edge?.data?.groupProxyOriginal;
-  if (!original) return edge;
-  return {
-    ...edge,
-    source: original.source || edge.source,
-    sourceHandle: original.sourceHandle || edge.sourceHandle,
-    target: original.target || edge.target,
-    targetHandle: original.targetHandle || edge.targetHandle,
-  };
-}
- 
-export function getConnectedNodeIds(edges) {
-  const connectedNodeIds = new Set();
-  for (const edge of edges) {
-    const resolved = resolveExecutionEdge(edge);
-    connectedNodeIds.add(resolved.source);
-    connectedNodeIds.add(resolved.target);
-  }
-  return connectedNodeIds;
-}
- 
-function isPreviewLoadNode(node) {
-  return ['Image', 'ImageDemo'].includes(node?.data?.className);
-}
- 
-function hasPreviewLoadSelection(node) {
-  if (node?.data?.className === 'Image') {
-    return !!String(node.data?.widgetValues?.filename || '').trim();
-  }
-  if (node?.data?.className === 'ImageDemo') {
-    return !!String(node.data?.widgetValues?.name || '').trim();
-  }
-  return false;
-}
- 
-function getRunnableNodeIds(nodes, edges) {
-  const connectedNodeIds = getConnectedNodeIds(edges);
- 
-  const runnableNodeIds = new Set(connectedNodeIds);
-  for (const node of nodes) {
-    if (connectedNodeIds.has(node.id)) continue;
-    if (isPreviewLoadNode(node) && hasPreviewLoadSelection(node)) {
-      runnableNodeIds.add(node.id);
-    }
-  }
- 
-  return runnableNodeIds;
-}
- 
-export function serializeExecutionGraph(nodes, edges, { excludeManualTrigger = false } = {}) {
-  const runnableNodeIds = getRunnableNodeIds(nodes, edges);
-  const prompt = {};
- 
-  for (const node of nodes) {
-    if (!runnableNodeIds.has(node.id)) continue;
- 
-    const { className, definition, widgetValues, runtimeValues } = node.data;
-    if (className === 'Group') continue;
-    if (!definition) continue;
-    if (excludeManualTrigger && definition.manual_trigger) continue;
- 
-    const inputs = {};
-    const valueBag = { ...(widgetValues || {}), ...(runtimeValues || {}) };
-    const omittedInputs = OMITTED_WIDGET_INPUTS_BY_CLASS[className] || null;
- 
-    const allWidgets = {
-      ...(definition.input.required || {}),
-      ...(definition.input.optional || {}),
-    };
-    for (const [name, spec] of Object.entries(allWidgets)) {
-      if (omittedInputs?.has(name)) continue;
-      const [type] = getSpecTypeAndOptions(spec);
-      if (isDataSocketSpec(spec)) continue;
-      if (type === 'BUTTON') continue;
-      if (valueBag[name] !== undefined) {
-        inputs[name] = valueBag[name];
-      }
-    }
- 
-    const incoming = edges
-      .map(resolveExecutionEdge)
-      .filter((edge) => edge.target === node.id);
-    for (const edge of incoming) {
-      const inputName = getInputName(edge.targetHandle);
-      const outputSlot = getOutputSlot(edge.sourceHandle);
-      inputs[inputName] = [edge.source, outputSlot];
-    }
- 
-    prompt[node.id] = { class_type: className, inputs };
-  }
- 
-  return prompt;
-}
- 
-export function getAutoRunnableNodes(nodes, edges) {
-  const runnableNodeIds = getRunnableNodeIds(nodes, edges);
-  return nodes.filter((node) => runnableNodeIds.has(node.id));
-}
- 
-export function hasBlockingAutoRunInput(node, edges) {
-  const def = node.data?.definition;
-  if (!def || def.manual_trigger) return false;
- 
-  const required = def.input.required || {};
-  for (const [name, spec] of Object.entries(required)) {
-    const [type, opts] = getSpecTypeAndOptions(spec);
-    const hiddenByConnectedInput = (() => {
-      const raw = opts?.hide_when_input_connected;
-      if (!raw) return false;
-      const inputs = Array.isArray(raw) ? raw : [raw];
-      return inputs.some((inputName) => edges.some(
-        (edge) => {
-          const resolved = resolveExecutionEdge(edge);
-          return resolved.target === node.id && getInputName(resolved.targetHandle) === String(inputName);
-        }
-      ));
-    })();
- 
-    if (hiddenByConnectedInput) continue;
- 
-    if (type === 'FILE_PICKER' || type === 'FOLDER_PICKER') {
-      if (!node.data.widgetValues?.[name]) return true;
-      continue;
-    }
-    if (!isDataSocketSpec(spec)) continue;
-    const hasEdge = edges.some(
-      (edge) => {
-        const resolved = resolveExecutionEdge(edge);
-        return resolved.target === node.id && getInputName(resolved.targetHandle) === name;
-      }
-    );
-    if (!hasEdge) return true;
-  }
- 
-  return false;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov-report/favicon.png b/frontend/coverage/lcov-report/favicon.png deleted file mode 100644 index c1525b811a167671e9de1fa78aab9f5c0b61cef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> - - - - Code coverage report for groupDrag.js - - - - - - - - - -
-
-

All files groupDrag.js

-
- -
- 100% - Statements - 18/18 -
- - -
- 55.55% - Branches - 5/9 -
- - -
- 100% - Functions - 2/2 -
- - -
- 100% - Lines - 18/18 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -191x -1x -1x -3x -3x -3x -3x -3x -3x -3x -3x -3x -3x -3x -1x -1x -2x -2x - 
export const GROUP_DRAG_RELEASE_DISTANCE = 18;
- 
-export function getPointDistanceOutsideRect(rect, point) {
-  if (!rect || !point) return Infinity;
- 
-  const dx = point.x < rect.left
-    ? rect.left - point.x
-    : (point.x > rect.right ? point.x - rect.right : 0);
-  const dy = point.y < rect.top
-    ? rect.top - point.y
-    : (point.y > rect.bottom ? point.y - rect.bottom : 0);
- 
-  return Math.hypot(dx, dy);
-}
- 
-export function shouldReleaseFromGroup(rect, point, threshold = GROUP_DRAG_RELEASE_DISTANCE) {
-  return getPointDistanceOutsideRect(rect, point) >= threshold;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov-report/groupSizing.js.html b/frontend/coverage/lcov-report/groupSizing.js.html deleted file mode 100644 index 101a3d6..0000000 --- a/frontend/coverage/lcov-report/groupSizing.js.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - Code coverage report for groupSizing.js - - - - - - - - - -
-
-

All files groupSizing.js

-
- -
- 97.14% - Statements - 34/35 -
- - -
- 35.71% - Branches - 5/14 -
- - -
- 100% - Functions - 2/2 -
- - -
- 97.14% - Lines - 34/35 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -361x -1x -1x -4x -4x -4x -4x -4x -4x -4x -4x -  -4x -1x -1x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x - 
const DEFAULT_CHILD_WIDTH = 200;
-const DEFAULT_CHILD_HEIGHT = 120;
- 
-function getNodeSize(node, axis) {
-  const fallback = axis === 'width' ? DEFAULT_CHILD_WIDTH : DEFAULT_CHILD_HEIGHT;
-  const measured = Number(node?.measured?.[axis]);
-  if (Number.isFinite(measured) && measured > 0) return measured;
-  const direct = Number(node?.[axis]);
-  if (Number.isFinite(direct) && direct > 0) return direct;
-  const styled = Number(node?.style?.[axis]);
-  if (Number.isFinite(styled) && styled > 0) return styled;
-  return fallback;
-}
- 
-export function getGroupMinimumSize(memberNodes, {
-  minWidth = 260,
-  minHeight = 180,
-  paddingX = 24,
-  paddingY = 24,
-} = {}) {
-  let maxRight = 0;
-  let maxBottom = 0;
- 
-  for (const node of memberNodes || []) {
-    const x = Number(node?.position?.x) || 0;
-    const y = Number(node?.position?.y) || 0;
-    maxRight = Math.max(maxRight, x + getNodeSize(node, 'width'));
-    maxBottom = Math.max(maxBottom, y + getNodeSize(node, 'height'));
-  }
- 
-  return {
-    width: Math.max(minWidth, Math.ceil(maxRight + paddingX)),
-    height: Math.max(minHeight, Math.ceil(maxBottom + paddingY)),
-  };
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov-report/index.html b/frontend/coverage/lcov-report/index.html deleted file mode 100644 index b445b68..0000000 --- a/frontend/coverage/lcov-report/index.html +++ /dev/null @@ -1,401 +0,0 @@ - - - - - - Code coverage report for All files - - - - - - - - - -
-
-

All files

-
- -
- 88.19% - Statements - 1681/1906 -
- - -
- 68.87% - Branches - 447/649 -
- - -
- 89.34% - Functions - 109/122 -
- - -
- 88.19% - Lines - 1681/1906 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
angleMeasureGeometry.js -
-
97.4%75/7753.33%8/15100%6/697.4%75/77
canvasInteractionTargets.js -
-
89.79%44/4968%17/25100%7/789.79%44/49
connectionUtils.js -
-
100%122/12293.93%62/66100%12/12100%122/122
constants.js -
-
97.05%99/10276.47%13/17100%5/597.05%99/102
defaultWorkflow.js -
-
89.28%50/5686.36%19/22100%2/289.28%50/56
executionGraph.js -
-
99.36%157/15879.48%62/78100%10/1099.36%157/158
groupDrag.js -
-
100%18/1855.55%5/9100%2/2100%18/18
groupSizing.js -
-
97.14%34/3535.71%5/14100%2/297.14%34/35
loadNodeOutputs.js -
-
90%27/3066.66%10/15100%3/390%27/30
markupShapeGeometry.js -
-
76.53%75/9844.44%8/1883.33%5/676.53%75/98
nodeClipboard.js -
-
94.37%302/32059.67%74/124100%17/1794.37%302/320
nodeHierarchy.js -
-
100%28/2886.66%13/15100%2/2100%28/28
nodeWidgetDefaults.js -
-
92.3%24/2669.23%9/13100%2/292.3%24/26
nodeWidgetLayout.js -
-
100%49/4973.07%19/26100%4/4100%49/49
pngMetadata.js -
-
98.78%162/16461.11%22/36100%8/898.78%162/164
runtimeValuePersistence.js -
-
90%9/1087.5%7/8100%1/190%9/10
valueFormatting.js -
-
80.35%180/22465.57%40/6183.33%10/1280.35%180/224
workflowCapture.js -
-
40.93%79/19336.84%7/1916.66%2/1240.93%79/193
workflowHydration.js -
-
100%82/8273.52%25/34100%5/5100%82/82
workflowSerialization.js -
-
100%65/6564.7%22/34100%4/4100%65/65
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov-report/loadNodeOutputs.js.html b/frontend/coverage/lcov-report/loadNodeOutputs.js.html deleted file mode 100644 index 9286bad..0000000 --- a/frontend/coverage/lcov-report/loadNodeOutputs.js.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - Code coverage report for loadNodeOutputs.js - - - - - - - - - -
-
-

All files loadNodeOutputs.js

-
- -
- 90% - Statements - 27/30 -
- - -
- 66.66% - Branches - 10/15 -
- - -
- 100% - Functions - 3/3 -
- - -
- 90% - Lines - 27/30 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -311x -3x -3x -3x -3x -3x -3x -1x -1x -3x -  -  -3x -1x -1x -1x -1x -1x -  -3x -1x -1x -2x -2x -2x -2x -1x -1x -2x -2x - 
export function resolveLoadNodeChannelPath({
-  explicitPath = null,
-  resolvedPathInput = null,
-  className = '',
-  widgetValues = {},
-} = {}) {
-  if (typeof explicitPath === 'string' && explicitPath) {
-    return explicitPath;
-  }
-  if (typeof resolvedPathInput === 'string' && resolvedPathInput) {
-    return resolvedPathInput;
-  }
-  if (className === 'Image') {
-    return String(widgetValues?.filename || '');
-  }
-  if (className === 'ImageDemo') {
-    return String(widgetValues?.name || '');
-  }
-  return '';
-}
- 
-export function beginTrackedNodeRequest(requestVersions, nodeId) {
-  const nextVersion = (requestVersions.get(nodeId) || 0) + 1;
-  requestVersions.set(nodeId, nextVersion);
-  return nextVersion;
-}
- 
-export function isTrackedNodeRequestCurrent(requestVersions, nodeId, version) {
-  return requestVersions.get(nodeId) === version;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov-report/markupShapeGeometry.js.html b/frontend/coverage/lcov-report/markupShapeGeometry.js.html deleted file mode 100644 index 0ab0198..0000000 --- a/frontend/coverage/lcov-report/markupShapeGeometry.js.html +++ /dev/null @@ -1,379 +0,0 @@ - - - - - - Code coverage report for markupShapeGeometry.js - - - - - - - - - -
-
-

All files markupShapeGeometry.js

-
- -
- 76.53% - Statements - 75/98 -
- - -
- 44.44% - Branches - 8/18 -
- - -
- 83.33% - Functions - 5/6 -
- - -
- 76.53% - Lines - 75/98 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -991x -1x -1x -1x -4x -4x -4x -4x -4x -1x -1x -2x -1x -2x -2x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -2x -2x -2x -2x -2x - 
export const MARKUP_DEFAULT_SHAPE = 'arrow';
-export const MARKUP_DEFAULT_COLOR = '#ff0000';
-export const MARKUP_PREVIEW_REFERENCE_DIM = 512;
- 
-function clampFraction(value) {
-  const numeric = Number(value);
-  if (!Number.isFinite(numeric)) return 0;
-  return Math.max(0, Math.min(1, numeric));
-}
- 
-export function sanitizeMarkupColor(color, fallback = MARKUP_DEFAULT_COLOR) {
-  if (typeof color !== 'string') return fallback;
-  const value = color.trim();
-  return /^#[0-9a-fA-F]{6}$/.test(value) ? value.toLowerCase() : fallback;
-}
- 
-export function sanitizeMarkupShape(
-  shape,
-  fallbackShape = MARKUP_DEFAULT_SHAPE,
-  fallbackColor = MARKUP_DEFAULT_COLOR,
-  fallbackWidth = 3,
-) {
-  if (!shape || typeof shape !== 'object') return null;
-  const kind = ['line', 'rectangle', 'circle', 'arrow'].includes(shape.kind) ? shape.kind : fallbackShape;
-  const x1 = clampFraction(shape.x1);
-  const y1 = clampFraction(shape.y1);
-  const x2 = clampFraction(shape.x2);
-  const y2 = clampFraction(shape.y2);
-  const width = Math.max(1, Math.min(64, Math.round(Number(shape.width) || fallbackWidth || 1)));
-  return {
-    kind,
-    x1: Number(x1.toFixed(4)),
-    y1: Number(y1.toFixed(4)),
-    x2: Number(x2.toFixed(4)),
-    y2: Number(y2.toFixed(4)),
-    width,
-    color: sanitizeMarkupColor(shape.color, fallbackColor),
-  };
-}
- 
-export function parseMarkupShapes(
-  markupShapes,
-  fallbackShape = MARKUP_DEFAULT_SHAPE,
-  fallbackColor = MARKUP_DEFAULT_COLOR,
-  fallbackWidth = 3,
-) {
-  if (Array.isArray(markupShapes)) {
-    return markupShapes
-      .map((shape) => sanitizeMarkupShape(shape, fallbackShape, fallbackColor, fallbackWidth))
-      .filter(Boolean);
-  }
-
-  if (typeof markupShapes !== 'string' || !markupShapes.trim()) return [];
-
-  try {
-    const parsed = JSON.parse(markupShapes);
-    if (!Array.isArray(parsed)) return [];
-    return parsed
-      .map((shape) => sanitizeMarkupShape(shape, fallbackShape, fallbackColor, fallbackWidth))
-      .filter(Boolean);
-  } catch {
-    return [];
-  }
-}
- 
-export function getArrowGeometry(shape, imageWidth, imageHeight) {
-  const x1 = shape.x1 * imageWidth;
-  const y1 = shape.y1 * imageHeight;
-  const x2 = shape.x2 * imageWidth;
-  const y2 = shape.y2 * imageHeight;
-  const dx = x2 - x1;
-  const dy = y2 - y1;
-  const length = Math.hypot(dx, dy) || 1;
-  const ux = dx / length;
-  const uy = dy / length;
-  const strokeWidth = Math.max(1, shape.width);
-  const headLength = Math.max(10, strokeWidth * 4);
-  const headWidth = Math.max(8, strokeWidth * 3);
-  const shaftX = x2 - ux * headLength;
-  const shaftY = y2 - uy * headLength;
-  const px = -uy;
-  const py = ux;
-  const leftX = shaftX + px * headWidth * 0.5;
-  const leftY = shaftY + py * headWidth * 0.5;
-  const rightX = shaftX - px * headWidth * 0.5;
-  const rightY = shaftY - py * headWidth * 0.5;
-  return {
-    line: `${x1},${y1} ${shaftX},${shaftY}`,
-    head: `${x2},${y2} ${leftX},${leftY} ${rightX},${rightY}`,
-  };
-}
- 
-export function getMarkupPreviewStrokeWidth(width, imageWidth, imageHeight) {
-  const normalizedWidth = Math.max(1, Math.round(Number(width) || 1));
-  const longestDim = Math.max(1, Number(imageWidth) || 0, Number(imageHeight) || 0);
-  const scale = Math.max(1, longestDim / MARKUP_PREVIEW_REFERENCE_DIM);
-  return Math.max(1, Math.round(normalizedWidth * scale));
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov-report/nodeClipboard.js.html b/frontend/coverage/lcov-report/nodeClipboard.js.html deleted file mode 100644 index aed2b08..0000000 --- a/frontend/coverage/lcov-report/nodeClipboard.js.html +++ /dev/null @@ -1,1045 +0,0 @@ - - - - - - Code coverage report for nodeClipboard.js - - - - - - - - - -
-
-

All files nodeClipboard.js

-
- -
- 94.37% - Statements - 302/320 -
- - -
- 59.67% - Branches - 74/124 -
- - -
- 100% - Functions - 17/17 -
- - -
- 94.37% - Lines - 302/320 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -3212x -2x -2x -2x -2x -26x -26x -26x -26x -26x -26x -  -  -26x -  -26x -2x -39x -39x -39x -39x -2x -2x -2x -2x -2x -2x -2x -2x -2x -  -  -2x -2x -9x -9x -9x -2x -9x -2x -2x -2x -2x -2x -2x -9x -2x -6x -6x -6x -2x -5x -5x -5x -5x -2x -9x -9x -9x -2x -9x -2x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -2x -8x -8x -8x -1x -1x -8x -  -  -8x -8x -2x -1x -1x -1x -1x -1x -  -  -1x -1x -1x -1x -1x -1x -1x -1x -1x -  -  -1x -1x -1x -1x -1x -1x -1x -2x -4x -4x -4x -4x -4x -4x -4x -4x -8x -8x -8x -  -  -  -8x -4x -4x -4x -2x -5x -5x -5x -5x -15x -15x -15x -15x -15x -15x -15x -15x -15x -15x -15x -15x -5x -5x -5x -2x -2x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -2x -2x -2x -4x -4x -4x -4x -4x -4x -4x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -4x -4x -2x -2x -2x -2x -2x -2x -2x -4x -4x -4x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -1x -1x -1x -1x -1x -1x -1x -1x -  -  -1x -2x -2x -5x -5x -5x -5x -5x -5x -5x -  -  -5x -5x -5x -5x -5x -8x -5x -5x -5x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -8x -5x -5x -5x -5x -3x -3x -5x -5x -3x -3x -3x -3x -3x -3x -3x -3x -3x -3x -3x -3x -3x -5x -5x -5x -5x -5x -5x -5x -5x - 
import { sortNodesForParentOrder } from './nodeHierarchy.js';
- 
-export const NODE_CLIPBOARD_KIND = 'tono/node-selection';
-export const NODE_CLIPBOARD_MIME = 'application/x-tono-node-selection';
- 
-function cloneValue(value) {
-  if (value == null) return value;
-  if (typeof structuredClone === 'function') {
-    try {
-      return structuredClone(value);
-    } catch {
-      // Fall through to JSON clone for simple plain data.
-    }
-  }
-  return JSON.parse(JSON.stringify(value));
-}
- 
-function clonePlainObject(value) {
-  if (!value || typeof value !== 'object' || Array.isArray(value)) return {};
-  return cloneValue(value) || {};
-}
- 
-function encodeProxyHandleRef(handleId) {
-  return encodeURIComponent(String(handleId || ''));
-}
- 
-function decodeProxyHandleRef(encoded) {
-  try {
-    return decodeURIComponent(String(encoded || ''));
-  } catch {
-    return String(encoded || '');
-  }
-}
- 
-function parseGroupProxyHandle(handleId) {
-  const text = String(handleId || '');
-  if (!text.startsWith('group-proxy::')) return null;
-  const parts = text.split('::');
-  if (parts.length < 5) return null;
-  return {
-    direction: parts[1],
-    nodeId: parts[2],
-    type: parts[3],
-    realHandle: decodeProxyHandleRef(parts.slice(4).join('::')),
-  };
-}
- 
-function hasOwn(obj, key) {
-  return Object.prototype.hasOwnProperty.call(obj, key);
-}
- 
-function remapNodeId(value, idMap) {
-  if (value == null) return value;
-  return idMap.get(String(value)) || String(value);
-}
- 
-function remapGroupProxyHandle(handleId, idMap) {
-  const proxy = parseGroupProxyHandle(handleId);
-  if (!proxy) return handleId;
-  return `group-proxy::${proxy.direction}::${remapNodeId(proxy.nodeId, idMap)}::${proxy.type}::${encodeProxyHandleRef(proxy.realHandle)}`;
-}
- 
-function remapGroupProxyDescriptors(items, idMap) {
-  if (!Array.isArray(items)) return items;
-  return items.map((item) => {
-    if (!item || typeof item !== 'object') return item;
-    const nextItem = { ...item };
-    if (typeof nextItem.key === 'string') {
-      const separator = nextItem.key.indexOf('::');
-      if (separator !== -1) {
-        const handleId = nextItem.key.slice(separator + 2);
-        nextItem.key = `${remapNodeId(nextItem.key.slice(0, separator), idMap)}::${remapGroupProxyHandle(handleId, idMap)}`;
-      }
-    }
-    if (typeof nextItem.handleId === 'string') {
-      nextItem.handleId = remapGroupProxyHandle(nextItem.handleId, idMap);
-    }
-    return nextItem;
-  });
-}
- 
-function remapClipboardExtraData(extraData, idMap) {
-  const nextExtraData = clonePlainObject(extraData);
-  if (Array.isArray(nextExtraData.proxyInputs)) {
-    nextExtraData.proxyInputs = remapGroupProxyDescriptors(nextExtraData.proxyInputs, idMap);
-  }
-  if (Array.isArray(nextExtraData.proxyOutputs)) {
-    nextExtraData.proxyOutputs = remapGroupProxyDescriptors(nextExtraData.proxyOutputs, idMap);
-  }
-  return nextExtraData;
-}
- 
-function remapClipboardEdgeData(data, idMap) {
-  if (!data || typeof data !== 'object' || Array.isArray(data)) return cloneValue(data);
- 
-  const nextData = cloneValue(data);
-  if (hasOwn(nextData, 'groupInternalHiddenBy')) {
-    nextData.groupInternalHiddenBy = remapNodeId(nextData.groupInternalHiddenBy, idMap);
-  }
-  if (hasOwn(nextData, 'groupProxyOwner')) {
-    nextData.groupProxyOwner = remapNodeId(nextData.groupProxyOwner, idMap);
-  }
- 
-  const original = nextData.groupProxyOriginal;
-  if (original && typeof original === 'object' && !Array.isArray(original)) {
-    if (hasOwn(original, 'source')) original.source = remapNodeId(original.source, idMap);
-    if (hasOwn(original, 'target')) original.target = remapNodeId(original.target, idMap);
-    if (hasOwn(original, 'sourceHandle')) {
-      original.sourceHandle = remapGroupProxyHandle(original.sourceHandle, idMap);
-    }
-    if (hasOwn(original, 'targetHandle')) {
-      original.targetHandle = remapGroupProxyHandle(original.targetHandle, idMap);
-    }
-  }
- 
-  return nextData;
-}
- 
-function collectSelectedNodeIds(nodes, nodeIds) {
-  const selectedIdSet = new Set((Array.isArray(nodeIds) ? nodeIds : []).map((id) => String(id)));
-  if (selectedIdSet.size === 0) return selectedIdSet;
- 
-  let changed = true;
-  while (changed) {
-    changed = false;
-    for (const node of Array.isArray(nodes) ? nodes : []) {
-      const parentId = node?.parentId ? String(node.parentId) : null;
-      const nodeId = String(node?.id);
-      if (parentId && selectedIdSet.has(parentId) && !selectedIdSet.has(nodeId)) {
-        selectedIdSet.add(nodeId);
-        changed = true;
-      }
-    }
-  }
-  return selectedIdSet;
-}
- 
-function extractExtraData(data) {
-  const source = data || {};
-  return Object.fromEntries(
-    Object.entries(source).filter(([key]) => ![
-      'label',
-      'className',
-      'widgetValues',
-      'runtimeValues',
-      'definition',
-      'previewImage',
-      'tableRows',
-      'meshData',
-      'overlay',
-      'scalarValue',
-      'processingTimeMs',
-      'warning',
-    ].includes(key)),
-  );
-}
- 
-export function buildNodeClipboardPayloadForIds(
-  nodes,
-  edges,
-  nodeIds,
-  { includeIncomingExternalEdges = false } = {},
-) {
-  const selectedIdSet = collectSelectedNodeIds(nodes, nodeIds);
-  const selectedNodes = Array.isArray(nodes)
-    ? nodes.filter((node) => selectedIdSet.has(String(node.id)))
-    : [];
-  if (selectedNodes.length === 0) return null;
- 
-  const capturedEdges = Array.isArray(edges)
-    ? edges.filter((edge) => (
-      selectedIdSet.has(String(edge.target))
-      && (
-        selectedIdSet.has(String(edge.source))
-        || (includeIncomingExternalEdges && !selectedIdSet.has(String(edge.source)))
-      )
-    ))
-    : [];
- 
-  return {
-    kind: NODE_CLIPBOARD_KIND,
-    version: 1,
-    nodes: selectedNodes.map((node) => ({
-      id: String(node.id),
-      type: node.type || 'custom',
-      position: {
-        x: Number(node.position?.x) || 0,
-        y: Number(node.position?.y) || 0,
-      },
-      ...(node.className ? { className: node.className } : {}),
-      ...(node.parentId ? { parentId: String(node.parentId) } : {}),
-      ...(node.extent ? { extent: node.extent } : {}),
-      ...(node.hidden ? { hidden: true } : {}),
-      ...(node.style ? { style: cloneValue(node.style) } : {}),
-      dragHandle: node.dragHandle || '.drag-handle',
-      data: {
-        label: node.data?.label || node.data?.className || 'Node',
-        className: node.data?.className || '',
-        widgetValues: clonePlainObject(node.data?.widgetValues),
-        runtimeValues: clonePlainObject(node.data?.runtimeValues),
-        extraData: clonePlainObject(extractExtraData(node.data)),
-      },
-    })),
-    edges: capturedEdges.map((edge) => ({
-      source: String(edge.source),
-      sourceHandle: edge.sourceHandle,
-      target: String(edge.target),
-      targetHandle: edge.targetHandle,
-      ...(edge.style ? { style: { ...edge.style } } : {}),
-      ...(edge.hidden ? { hidden: true } : {}),
-      ...(edge.data ? { data: cloneValue(edge.data) } : {}),
-    })),
-  };
-}
- 
-export function buildNodeClipboardPayload(nodes, edges) {
-  const selectedNodes = Array.isArray(nodes)
-    ? nodes.filter((node) => node?.selected)
-    : [];
-  const selectedIds = selectedNodes.map((node) => String(node.id));
-  const includeIncomingExternalEdges = selectedNodes.some((node) => node?.data?.className === 'Group');
-  return buildNodeClipboardPayloadForIds(nodes, edges, selectedIds, { includeIncomingExternalEdges });
-}
- 
-export function parseNodeClipboardPayload(text) {
-  if (typeof text !== 'string' || !text.trim()) return null;
- 
-  try {
-    const parsed = JSON.parse(text);
-    if (parsed?.kind !== NODE_CLIPBOARD_KIND) return null;
-    if (!Array.isArray(parsed.nodes) || !Array.isArray(parsed.edges)) return null;
-    return parsed;
-  } catch {
-    return null;
-  }
-}
- 
-export function instantiateNodeClipboardPayload(
-  payload,
-  defs = {},
-  nextNodeId = 1,
-  offset = { x: 40, y: 40 },
-  { keepExternalSources = false } = {},
-) {
-  if (!payload || !Array.isArray(payload.nodes) || payload.nodes.length === 0) {
-    return { nodes: [], edges: [], nextNodeId };
-  }
- 
-  const idMap = new Map();
-  let currentId = Number(nextNodeId) || 1;
- 
-  payload.nodes.forEach((node) => {
-    idMap.set(String(node.id), String(currentId++));
-  });
- 
-  const nodes = sortNodesForParentOrder(payload.nodes.map((node) => {
-    const newId = idMap.get(String(node.id));
-    const className = node.data?.className || '';
-    const definition = className ? defs[className] || null : null;
-    const extraData = remapClipboardExtraData(node.data?.extraData, idMap);
- 
-    return {
-      id: newId,
-      type: node.type || 'custom',
-      className: node.className,
-      position: {
-        x: (Number(node.position?.x) || 0) + (Number(offset?.x) || 0),
-        y: (Number(node.position?.y) || 0) + (Number(offset?.y) || 0),
-      },
-      ...(node.parentId ? { parentId: idMap.get(String(node.parentId)) || String(node.parentId) } : {}),
-      ...(node.extent ? { extent: node.extent } : {}),
-      ...(node.hidden ? { hidden: true } : {}),
-      ...(node.style ? { style: cloneValue(node.style) } : {}),
-      dragHandle: node.dragHandle || '.drag-handle',
-      selected: true,
-      data: {
-        label: node.data?.label || className || 'Node',
-        className,
-        widgetValues: clonePlainObject(node.data?.widgetValues),
-        runtimeValues: clonePlainObject(node.data?.runtimeValues),
-        ...extraData,
-        definition,
-        previewImage: null,
-        tableRows: null,
-        meshData: null,
-        overlay: null,
-        scalarValue: null,
-        processingTimeMs: null,
-        warning: null,
-      },
-    };
-  }));
- 
-  const edges = payload.edges
-    .filter((edge) => (
-      idMap.has(String(edge.target))
-      && (idMap.has(String(edge.source)) || keepExternalSources)
-    ))
-    .map((edge, index) => {
-      const source = idMap.get(String(edge.source)) || String(edge.source);
-      const target = idMap.get(String(edge.target));
-      return {
-        id: `e${source}-${target}-${index}`,
-        source,
-        sourceHandle: remapGroupProxyHandle(edge.sourceHandle, idMap),
-        target,
-        targetHandle: remapGroupProxyHandle(edge.targetHandle, idMap),
-        selected: false,
-        ...(edge.style ? { style: { ...edge.style } } : {}),
-        ...(edge.hidden ? { hidden: true } : {}),
-        ...(edge.data ? { data: remapClipboardEdgeData(edge.data, idMap) } : {}),
-      };
-    });
- 
-  return {
-    nodes,
-    edges,
-    nextNodeId: currentId,
-  };
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov-report/nodeHierarchy.js.html b/frontend/coverage/lcov-report/nodeHierarchy.js.html deleted file mode 100644 index b1d2c17..0000000 --- a/frontend/coverage/lcov-report/nodeHierarchy.js.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - Code coverage report for nodeHierarchy.js - - - - - - - - - -
-
-

All files nodeHierarchy.js

-
- -
- 100% - Statements - 28/28 -
- - -
- 86.66% - Branches - 13/15 -
- - -
- 100% - Functions - 2/2 -
- - -
- 100% - Lines - 28/28 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -293x -12x -12x -12x -12x -12x -12x -12x -12x -24x -24x -24x -19x -19x -19x -24x -24x -5x -5x -19x -19x -19x -19x -24x -12x -12x -12x -12x - 
export function sortNodesForParentOrder(nodes) {
-  const list = Array.isArray(nodes) ? nodes.filter(Boolean) : [];
-  const entries = list.map((node) => ({ id: String(node.id), node }));
-  const byId = new Map(entries.map((entry) => [entry.id, entry]));
-  const visiting = new Set();
-  const visited = new Set();
-  const ordered = [];
- 
-  function visit(entry) {
-    if (!entry) return;
-    const { id, node } = entry;
-    if (visited.has(id) || visiting.has(id)) return;
- 
-    visiting.add(id);
- 
-    const parentId = node?.parentId ? String(node.parentId) : null;
-    if (parentId) {
-      visit(byId.get(parentId));
-    }
- 
-    visiting.delete(id);
-    visited.add(id);
-    ordered.push(node);
-  }
- 
-  entries.forEach((entry) => visit(entry));
-  return ordered;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov-report/nodeWidgetDefaults.js.html b/frontend/coverage/lcov-report/nodeWidgetDefaults.js.html deleted file mode 100644 index a133575..0000000 --- a/frontend/coverage/lcov-report/nodeWidgetDefaults.js.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - Code coverage report for nodeWidgetDefaults.js - - - - - - - - - -
-
-

All files nodeWidgetDefaults.js

-
- -
- 92.3% - Statements - 24/26 -
- - -
- 69.23% - Branches - 9/13 -
- - -
- 100% - Functions - 2/2 -
- - -
- 92.3% - Lines - 24/26 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -271x -1x -1x -6x -6x -6x -6x -2x -2x -2x -  -  -6x -6x -1x -1x -1x -1x -1x -5x -5x -3x -3x -5x -1x -1x - 
import { getSpecTypeAndOptions, isDataSocketSpec } from './constants.js';
- 
-export function getDefaultWidgetValue(spec) {
-  const [type, opts] = getSpecTypeAndOptions(spec);
-  if (isDataSocketSpec(spec)) return undefined;
-  if (type === 'BUTTON') return undefined;
-  if (Array.isArray(type)) {
-    if (typeof opts?.default === 'string' && type.includes(opts.default)) {
-      return opts.default;
-    }
-    return type[0];
-  }
-  return opts?.default ?? '';
-}
- 
-export function buildDefaultWidgetValues(definition) {
-  const widgetValues = {};
-  const required = definition?.input?.required || {};
-  for (const [name, spec] of Object.entries(required)) {
-    const value = getDefaultWidgetValue(spec);
-    if (value !== undefined) {
-      widgetValues[name] = value;
-    }
-  }
-  return widgetValues;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov-report/nodeWidgetLayout.js.html b/frontend/coverage/lcov-report/nodeWidgetLayout.js.html deleted file mode 100644 index 25aa04d..0000000 --- a/frontend/coverage/lcov-report/nodeWidgetLayout.js.html +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - Code coverage report for nodeWidgetLayout.js - - - - - - - - - -
-
-

All files nodeWidgetLayout.js

-
- -
- 100% - Statements - 49/49 -
- - -
- 73.07% - Branches - 19/26 -
- - -
- 100% - Functions - 4/4 -
- - -
- 100% - Lines - 49/49 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -501x -4x -4x -4x -4x -4x -4x -1x -5x -5x -5x -5x -5x -5x -1x -1x -3x -3x -1x -1x -2x -3x -3x -2x -3x -2x -2x -2x -2x -1x -1x -2x -1x -1x -3x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x - 
export function formatUiLabel(text) {
-  return String(text ?? '')
-    .replace(/_/g, ' ')
-    .replace(/\s+/g, ' ')
-    .trim()
-    .toLowerCase();
-}
- 
-function normalizeInputNames(raw) {
-  if (!raw) return [];
-  return (Array.isArray(raw) ? raw : [raw])
-    .map((value) => String(value))
-    .filter((value) => value.length > 0);
-}
- 
-export function getWidgetCombinedInputName(widget, dataInputByName) {
-  const explicitInputName = normalizeInputNames(widget?.opts?.top_socket_input)[0];
-  if (explicitInputName && dataInputByName?.has(explicitInputName)) {
-    return explicitInputName;
-  }
- 
-  const widgetLabel = formatUiLabel(widget?.opts?.label || widget?.name);
-  if (!widgetLabel) return null;
- 
-  for (const inputName of normalizeInputNames(widget?.opts?.hide_when_input_connected)) {
-    const input = dataInputByName?.get(inputName);
-    if (!input) continue;
-    const inputLabel = formatUiLabel(input.label || input.name);
-    if (inputLabel === widgetLabel) {
-      return input.name;
-    }
-  }
- 
-  return null;
-}
- 
-export function buildCombinedInputNameByWidgetName(widgets, dataInputs) {
-  const dataInputByName = new Map((dataInputs || []).map((input) => [input.name, input]));
-  const combinedInputNameByWidgetName = new Map();
- 
-  for (const widget of widgets || []) {
-    const combinedInputName = getWidgetCombinedInputName(widget, dataInputByName);
-    if (combinedInputName) {
-      combinedInputNameByWidgetName.set(widget.name, combinedInputName);
-    }
-  }
- 
-  return combinedInputNameByWidgetName;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov-report/pngMetadata.js.html b/frontend/coverage/lcov-report/pngMetadata.js.html deleted file mode 100644 index dea7774..0000000 --- a/frontend/coverage/lcov-report/pngMetadata.js.html +++ /dev/null @@ -1,577 +0,0 @@ - - - - - - Code coverage report for pngMetadata.js - - - - - - - - - -
-
-

All files pngMetadata.js

-
- -
- 98.78% - Statements - 162/164 -
- - -
- 61.11% - Branches - 22/36 -
- - -
- 100% - Functions - 8/8 -
- - -
- 98.78% - Lines - 162/164 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -1652x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -512x -512x -4096x -4096x -512x -512x -2x -4x -4x -4x -382x -382x -4x -4x -2x -2x -2x -2x -2x -7x -7x -7x -56x -56x -7x -7x -2x -26x -26x -26x -26x -26x -2x -26x -26x -26x -2x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -2x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -  -  -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -2x -2x -2x -2x -2x -2x -2x -2x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -13x -13x -13x -13x -9x -9x -4x -4x -4x -4x -4x -4x -4x -4x -4x -2x -2x -2x -2x -2x -2x -3x -3x -3x -3x -3x -3x -3x -13x -13x -13x -13x -13x -4x -4x -4x -4x -13x -13x -10x -10x -3x -3x -3x - 
/**
- * PNG text chunk utilities for embedding/extracting workflow metadata.
- *
- * PNG files are composed of chunks: [4-byte length][4-byte type][data][4-byte CRC].
- * We add an iTXt chunk with key "workflow" containing the JSON-serialised graph,
- * inserted just before the IEND chunk.
- */
- 
-// ── CRC32 (PNG uses CRC-32/ISO 3309) ────────────────────────────────
- 
-const crcTable = new Uint32Array(256);
-for (let i = 0; i < 256; i++) {
-  let c = i;
-  for (let j = 0; j < 8; j++) {
-    c = (c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1);
-  }
-  crcTable[i] = c;
-}
- 
-function crc32(bytes) {
-  let crc = 0xFFFFFFFF;
-  for (let i = 0; i < bytes.length; i++) {
-    crc = crcTable[(crc ^ bytes[i]) & 0xFF] ^ (crc >>> 8);
-  }
-  return (crc ^ 0xFFFFFFFF) >>> 0;
-}
- 
-// ── Helpers ──────────────────────────────────────────────────────────
- 
-const PNG_SIG = [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A];
- 
-function isPng(data) {
-  if (data.length < 8) return false;
-  for (let i = 0; i < 8; i++) {
-    if (data[i] !== PNG_SIG[i]) return false;
-  }
-  return true;
-}
- 
-function chunkType(data, offset) {
-  return String.fromCharCode(
-    data[offset + 4], data[offset + 5], data[offset + 6], data[offset + 7],
-  );
-}
- 
-function readUint32(data, offset) {
-  return new DataView(data.buffer, data.byteOffset + offset, 4).getUint32(0);
-}
- 
-function buildChunk(type, payload) {
-  const encoder = new TextEncoder();
-  const typeBytes = encoder.encode(type);
-  const forCrc = new Uint8Array(4 + payload.length);
-  forCrc.set(typeBytes, 0);
-  forCrc.set(payload, 4);
- 
-  const chunk = new Uint8Array(12 + payload.length);
-  const view = new DataView(chunk.buffer);
-  view.setUint32(0, payload.length);
-  chunk.set(typeBytes, 4);
-  chunk.set(payload, 8);
-  view.setUint32(8 + payload.length, crc32(forCrc));
-  return chunk;
-}
- 
-function parseTextChunk(type, chunkData) {
-  const decoder = new TextDecoder();
-  const keywordEnd = chunkData.indexOf(0);
-  if (keywordEnd === -1) return null;
- 
-  const keyword = decoder.decode(chunkData.subarray(0, keywordEnd));
-  if (keyword !== 'workflow') return null;
- 
-  if (type !== 'iTXt') return null;
- 
-  const compressionFlagIdx = keywordEnd + 1;
-  const compressionMethodIdx = keywordEnd + 2;
-  if (compressionMethodIdx >= chunkData.length) return null;
- 
-  const compressionFlag = chunkData[compressionFlagIdx];
-  if (compressionFlag !== 0) {
-    throw new Error('Compressed PNG workflow metadata is not supported');
-  }
- 
-  let offset = compressionMethodIdx + 1;
-  const languageEnd = chunkData.indexOf(0, offset);
-  if (languageEnd === -1) return null;
- 
-  offset = languageEnd + 1;
-  const translatedEnd = chunkData.indexOf(0, offset);
-  if (translatedEnd === -1) return null;
- 
-  return JSON.parse(decoder.decode(chunkData.subarray(translatedEnd + 1)));
-}
- 
-// ── Public API ───────────────────────────────────────────────────────
- 
-/**
- * Embed a workflow object into a PNG blob as an iTXt chunk.
- * Returns a new Blob with the metadata inserted before IEND.
- */
-export async function embedWorkflow(pngBlob, workflow) {
-  const data = new Uint8Array(await pngBlob.arrayBuffer());
-  if (!isPng(data)) throw new Error('Not a valid PNG file');
- 
-  const encoder = new TextEncoder();
- 
-  // Build iTXt payload:
-  // keyword \0 compression-flag compression-method language-tag \0 translated-keyword \0 text
-  const key = encoder.encode('workflow');
-  const val = encoder.encode(JSON.stringify(workflow));
-  const payload = new Uint8Array(key.length + 5 + val.length);
-  payload.set(key, 0);
-  payload.set(val, key.length + 5);
-  const chunk = buildChunk('iTXt', payload);
- 
-  // Locate IEND
-  let pos = 8;
-  let iendPos = data.length;
-  while (pos < data.length) {
-    if (pos + 8 > data.length) break;
-    const len = readUint32(data, pos);
-    if (pos + 12 + len > data.length) break;
-    if (chunkType(data, pos) === 'IEND') { iendPos = pos; break; }
-    pos += 12 + len;
-  }
- 
-  // Splice: [before IEND] + [tEXt chunk] + [IEND]
-  const result = new Uint8Array(data.length + chunk.length);
-  result.set(data.subarray(0, iendPos), 0);
-  result.set(chunk, iendPos);
-  result.set(data.subarray(iendPos), iendPos + chunk.length);
- 
-  return new Blob([result], { type: 'image/png' });
-}
- 
-/**
- * Extract the workflow object from a PNG blob's iTXt chunks.
- * Returns the parsed object, or null if no "workflow" key is found.
- */
-export async function extractWorkflow(pngBlob) {
-  const data = new Uint8Array(await pngBlob.arrayBuffer());
-  if (!isPng(data)) return null;
- 
-  let pos = 8;
-  let found = null;
- 
-  while (pos + 8 <= data.length) {
-    const len = readUint32(data, pos);
-    if (pos + 12 + len > data.length) break;
-    const type = chunkType(data, pos);
- 
-    if (type === 'iTXt') {
-      const chunkData = data.subarray(pos + 8, pos + 8 + len);
-      const parsed = parseTextChunk(type, chunkData);
-      if (parsed) found = parsed;
-    }
- 
-    if (type === 'IEND') break;
-    pos += 12 + len;
-  }
- 
-  return found;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov-report/prettify.css b/frontend/coverage/lcov-report/prettify.css deleted file mode 100644 index b317a7c..0000000 --- a/frontend/coverage/lcov-report/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/frontend/coverage/lcov-report/prettify.js b/frontend/coverage/lcov-report/prettify.js deleted file mode 100644 index b322523..0000000 --- a/frontend/coverage/lcov-report/prettify.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/frontend/coverage/lcov-report/runtimeValuePersistence.js.html b/frontend/coverage/lcov-report/runtimeValuePersistence.js.html deleted file mode 100644 index 575eb01..0000000 --- a/frontend/coverage/lcov-report/runtimeValuePersistence.js.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - Code coverage report for runtimeValuePersistence.js - - - - - - - - - -
-
-

All files runtimeValuePersistence.js

-
- -
- 90% - Statements - 9/10 -
- - -
- 87.5% - Branches - 7/8 -
- - -
- 100% - Functions - 1/1 -
- - -
- 90% - Lines - 9/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -112x -12x -11x -11x -1x -1x -1x -1x -  -12x - 
export function sanitizeRuntimeValuesForPersistence(className, runtimeValues) {
-  if (!runtimeValues || typeof runtimeValues !== 'object' || Array.isArray(runtimeValues)) {
-    return {};
-  }
- 
-  if (className === 'View3D') {
-    return {};
-  }
-  return { ...runtimeValues };
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov-report/sort-arrow-sprite.png b/frontend/coverage/lcov-report/sort-arrow-sprite.png deleted file mode 100644 index 6ed68316eb3f65dec9063332d2f69bf3093bbfab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc diff --git a/frontend/coverage/lcov-report/sorter.js b/frontend/coverage/lcov-report/sorter.js deleted file mode 100644 index 4ed70ae..0000000 --- a/frontend/coverage/lcov-report/sorter.js +++ /dev/null @@ -1,210 +0,0 @@ -/* eslint-disable */ -var addSorting = (function() { - 'use strict'; - var cols, - currentSort = { - index: 0, - desc: false - }; - - // returns the summary table element - function getTable() { - return document.querySelector('.coverage-summary'); - } - // returns the thead element of the summary table - function getTableHeader() { - return getTable().querySelector('thead tr'); - } - // returns the tbody element of the summary table - function getTableBody() { - return getTable().querySelector('tbody'); - } - // returns the th element for nth column - function getNthColumn(n) { - return getTableHeader().querySelectorAll('th')[n]; - } - - function onFilterInput() { - const searchValue = document.getElementById('fileSearch').value; - const rows = document.getElementsByTagName('tbody')[0].children; - - // Try to create a RegExp from the searchValue. If it fails (invalid regex), - // it will be treated as a plain text search - let searchRegex; - try { - searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive - } catch (error) { - searchRegex = null; - } - - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - let isMatch = false; - - if (searchRegex) { - // If a valid regex was created, use it for matching - isMatch = searchRegex.test(row.textContent); - } else { - // Otherwise, fall back to the original plain text search - isMatch = row.textContent - .toLowerCase() - .includes(searchValue.toLowerCase()); - } - - row.style.display = isMatch ? '' : 'none'; - } - } - - // loads the search box - function addSearchBox() { - var template = document.getElementById('filterTemplate'); - var templateClone = template.content.cloneNode(true); - templateClone.getElementById('fileSearch').oninput = onFilterInput; - template.parentElement.appendChild(templateClone); - } - - // loads all columns - function loadColumns() { - var colNodes = getTableHeader().querySelectorAll('th'), - colNode, - cols = [], - col, - i; - - for (i = 0; i < colNodes.length; i += 1) { - colNode = colNodes[i]; - col = { - key: colNode.getAttribute('data-col'), - sortable: !colNode.getAttribute('data-nosort'), - type: colNode.getAttribute('data-type') || 'string' - }; - cols.push(col); - if (col.sortable) { - col.defaultDescSort = col.type === 'number'; - colNode.innerHTML = - colNode.innerHTML + ''; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll('td'), - colNode, - col, - data = {}, - i, - val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute('data-value'); - if (col.type === 'number') { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll('tr'), - i; - - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, - sorter = function(a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, - finalSorter = sorter, - tableBody = document.querySelector('.coverage-summary tbody'), - rowNodes = tableBody.querySelectorAll('tr'), - rows = [], - i; - - if (desc) { - finalSorter = function(a, b) { - return -1 * sorter(a, b); - }; - } - - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - - rows.sort(finalSorter); - - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), - cls = col.className; - - cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc - ? ' sorted-desc' - : ' sorted'; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, - el, - ithSorter = function ithSorter(i) { - var col = cols[i]; - - return function() { - var desc = col.defaultDescSort; - - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i = 0; i < cols.length; i += 1) { - if (cols[i].sortable) { - // add the click event handler on the th so users - // dont have to click on those tiny arrows - el = getNthColumn(i).querySelector('.sorter').parentElement; - if (el.addEventListener) { - el.addEventListener('click', ithSorter(i)); - } else { - el.attachEvent('onclick', ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function() { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(); - addSearchBox(); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener('load', addSorting); diff --git a/frontend/coverage/lcov-report/valueFormatting.js.html b/frontend/coverage/lcov-report/valueFormatting.js.html deleted file mode 100644 index f337c89..0000000 --- a/frontend/coverage/lcov-report/valueFormatting.js.html +++ /dev/null @@ -1,757 +0,0 @@ - - - - - - Code coverage report for valueFormatting.js - - - - - - - - - -
-
-

All files valueFormatting.js

-
- -
- 80.35% - Statements - 180/224 -
- - -
- 65.57% - Branches - 40/61 -
- - -
- 83.33% - Functions - 10/12 -
- - -
- 80.35% - Lines - 180/224 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -2251x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -5x -5x -5x -5x -5x -5x -3x -3x -  -  -5x -1x -10x -10x -10x -10x -10x -10x -1x -1x -7x -7x -1x -5x -5x -5x -5x -5x -5x -4x -4x -3x -3x -1x -5x -1x -5x -1x -4x -4x -4x -1x -4x -4x -4x -68x -68x -68x -68x -68x -68x -68x -4x -4x -4x -4x -3x -3x -1x -1x -1x -1x -1x -  -  -4x -1x -1x -1x -1x -1x -1x -1x -  -  -  -  -  -  -  -  -1x -1x -5x -5x -  -  -5x -  -  -5x -5x -5x -1x -1x -4x -4x -4x -4x -4x -4x -5x -1x -2x -2x -  -  -2x -2x -2x -1x -1x -1x -1x -1x -1x -1x -1x -6x -6x -6x -6x -6x -2x -2x -2x -4x -6x -1x -1x -1x -1x -1x -1x -2x -2x -2x -2x -2x -2x -  -  -2x -  -  -2x -2x - 
const SI_PREFIX_MULTIPLIERS = {
-  Y: 1e24, Z: 1e21, E: 1e18, P: 1e15, T: 1e12,
-  G: 1e9, M: 1e6, k: 1e3,
-  m: 1e-3, u: 1e-6, µ: 1e-6, n: 1e-9, p: 1e-12,
-  f: 1e-15, a: 1e-18, z: 1e-21, y: 1e-24,
-};
- 
-const NUMBER_WITH_UNIT_RE = /^([+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?)\s*(.*)?$/;
- 
-/**
- * Parse a string like "1.5 nm" into { numeric: 1.5e-9, unit: "m" }.
- * Returns null if the string does not start with a valid number.
- * The numeric value is scaled to the base SI unit via the prefix.
- */
-export function parseNumberWithUnit(text) {
-  const s = String(text ?? '').trim();
-  if (!s) return { numeric: 0, unit: '' };
-
-  const m = s.match(NUMBER_WITH_UNIT_RE);
-  if (!m) return null;
-
-  const numeric = parseFloat(m[1]);
-  const unitStr = (m[2] ?? '').trim();
-
-  if (!unitStr) return { numeric, unit: '' };
-
-  if (unitStr.length >= 2) {
-    const prefix = unitStr[0];
-    const rest = unitStr.slice(1);
-    const multiplier = SI_PREFIX_MULTIPLIERS[prefix];
-    if (multiplier !== undefined && PREFIXABLE_UNITS.has(rest)) {
-      return { numeric: numeric * multiplier, unit: rest };
-    }
-  }
-
-  return { numeric, unit: unitStr };
-}
- 
-const SI_PREFIXES = [
-  { exp: -24, prefix: 'y' },
-  { exp: -21, prefix: 'z' },
-  { exp: -18, prefix: 'a' },
-  { exp: -15, prefix: 'f' },
-  { exp: -12, prefix: 'p' },
-  { exp: -9, prefix: 'n' },
-  { exp: -6, prefix: 'u' },
-  { exp: -3, prefix: 'm' },
-  { exp: 0, prefix: '' },
-  { exp: 3, prefix: 'k' },
-  { exp: 6, prefix: 'M' },
-  { exp: 9, prefix: 'G' },
-  { exp: 12, prefix: 'T' },
-  { exp: 15, prefix: 'P' },
-  { exp: 18, prefix: 'E' },
-  { exp: 21, prefix: 'Z' },
-  { exp: 24, prefix: 'Y' },
-];
- 
-const PREFIXABLE_UNITS = new Set([
-  'm', 's', 'A', 'V', 'W', 'Hz', 'F', 'C', 'J', 'N', 'Pa', 'T', 'H', 'S', 'g', 'K', 'Ohm', 'ohm', 'Ω',
-]);
- 
-const SUPERSCRIPT_DIGITS = {
-  '-': '⁻',
-  '0': '⁰',
-  '1': '¹',
-  '2': '²',
-  '3': '³',
-  '4': '⁴',
-  '5': '⁵',
-  '6': '⁶',
-  '7': '⁷',
-  '8': '⁸',
-  '9': '⁹',
-};
- 
-export function formatNumericCell(value) {
-  if (value == null) return '';
-  if (typeof value === 'number') {
-    if (!Number.isFinite(value)) return String(value);
-    const abs = Math.abs(value);
-    if (Number.isInteger(value) && abs < 1e6) return String(value);
-    if ((abs > 0 && abs < 1e-3) || abs >= 1e4) return value.toExponential(3);
-    return value.toFixed(4).replace(/\.?0+$/, '');
-  }
-  if (Array.isArray(value)) return value.join(', ');
-  return String(value);
-}
- 
-function toSuperscript(text) {
-  return String(text)
-    .split('')
-    .map((char) => SUPERSCRIPT_DIGITS[char] || char)
-    .join('');
-}
- 
-export function formatDisplayUnit(unit) {
-  return String(unit ?? '').replace(/\^(-?\d+)/g, (_, exponent) => toSuperscript(exponent));
-}
- 
-function parsePrefixableUnit(unit) {
-  const text = String(unit ?? '').trim();
-  if (!text) return null;
- 
-  const poweredMatch = text.match(/^([A-Za-zΩ]+)\^([1-9]\d*)$/);
-  if (poweredMatch) {
-    const [, baseUnit, powerText] = poweredMatch;
-    if (!PREFIXABLE_UNITS.has(baseUnit)) return null;
-    return { baseUnit, power: Number.parseInt(powerText, 10) };
-  }
- 
-  if (!PREFIXABLE_UNITS.has(text)) return null;
-  return { baseUnit: text, power: 1 };
-}
- 
-function formatPrefixedUnit(baseUnit, prefix, power) {
-  return power === 1 ? `${prefix}${baseUnit}` : `${prefix}${baseUnit}${toSuperscript(power)}`;
-}
- 
-function choosePrefixExponent(value, power) {
-  const abs = Math.abs(value);
-  const candidates = SI_PREFIXES.map(({ exp, prefix }) => {
-    const scaled = value / (10 ** (exp * power));
-    return {
-      exp,
-      prefix,
-      scaled,
-      absScaled: Math.abs(scaled),
-    };
-  });
- 
-  const inRange = candidates.filter(({ absScaled }) => absScaled >= 1 && absScaled < 999.5);
-  if (inRange.length > 0) {
-    return inRange.reduce((best, candidate) => (candidate.absScaled < best.absScaled ? candidate : best));
-  }
- 
-  const aboveOne = candidates.filter(({ absScaled }) => absScaled >= 1);
-  if (aboveOne.length > 0) {
-    return aboveOne.reduce((best, candidate) => (candidate.absScaled < best.absScaled ? candidate : best));
-  }
-
-  return candidates.reduce((best, candidate) => (candidate.absScaled > best.absScaled ? candidate : best));
-}
- 
-/**
- * Given a representative axis value and a unit string, returns the scale factor
- * and prefixed unit label to use for a whole axis.
- * All tick values should be divided by `scale` before display, and `unitLabel` shown once.
- */
-export function getAxisScale(representativeValue, unit) {
-  if (!unit || typeof representativeValue !== 'number' || !Number.isFinite(representativeValue) || representativeValue === 0) {
-    return { scale: 1, unitLabel: unit || '' };
-  }
-  const { valueText, unitText } = applySIPrefix(representativeValue, unit);
-  const scaled = parseFloat(valueText);
-  if (!Number.isFinite(scaled) || scaled === 0) return { scale: 1, unitLabel: unit };
-  return { scale: representativeValue / scaled, unitLabel: unitText };
-}
- 
-export function applySIPrefix(value, unit) {
-  const formattedUnit = formatDisplayUnit(unit);
-  if (typeof value !== 'number' || !Number.isFinite(value)) {
-    return { valueText: formatNumericCell(value), unitText: formattedUnit };
-  }
-  if (value === 0) {
-    return { valueText: '0', unitText: formattedUnit };
-  }
- 
-  const parsedUnit = parsePrefixableUnit(unit);
-  if (!parsedUnit) {
-    return { valueText: formatNumericCell(value), unitText: formattedUnit };
-  }
- 
-  const chosenPrefix = choosePrefixExponent(value, parsedUnit.power);
-  return {
-    valueText: formatNumericCell(chosenPrefix.scaled),
-    unitText: formatPrefixedUnit(parsedUnit.baseUnit, chosenPrefix.prefix, parsedUnit.power),
-  };
-}
- 
-function getCompanionUnitColumn(column, row) {
-  if (!row || typeof row !== 'object' || typeof column !== 'string' || column === 'unit') {
-    return null;
-  }
-  const unitColumn = `${column}_unit`;
-  return typeof row?.[unitColumn] === 'string' ? unitColumn : null;
-}
- 
-export function getTableColumns(rows) {
-  const columns = [];
-  const hiddenColumns = new Set();
- 
-  for (const row of rows || []) {
-    if (!row || typeof row !== 'object') continue;
-    for (const key of Object.keys(row)) {
-      if (
-        key.endsWith('_unit')
-        && key.length > 5
-        && Object.prototype.hasOwnProperty.call(row, key.slice(0, -5))
-      ) {
-        hiddenColumns.add(key);
-        continue;
-      }
-      if (!columns.includes(key)) columns.push(key);
-    }
-  }
- 
-  return columns.filter((column) => !hiddenColumns.has(column));
-}
- 
-export function formatTableRowCell(row, column) {
-  const companionUnitColumn = getCompanionUnitColumn(column, row);
-  if (companionUnitColumn) {
-    const formatted = applySIPrefix(row?.[column], row?.[companionUnitColumn]);
-    return formatted.unitText ? `${formatted.valueText} ${formatted.unitText}` : formatted.valueText;
-  }
-  if (column === 'value' && typeof row?.unit === 'string') {
-    return applySIPrefix(row?.value, row.unit).valueText;
-  }
-  if (column === 'unit' && typeof row?.unit === 'string') {
-    return applySIPrefix(row?.value, row.unit).unitText;
-  }
-  return formatNumericCell(row?.[column]);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov-report/workflowCapture.js.html b/frontend/coverage/lcov-report/workflowCapture.js.html deleted file mode 100644 index 784afce..0000000 --- a/frontend/coverage/lcov-report/workflowCapture.js.html +++ /dev/null @@ -1,664 +0,0 @@ - - - - - - Code coverage report for workflowCapture.js - - - - - - - - - -
-
-

All files workflowCapture.js

-
- -
- 40.93% - Statements - 79/193 -
- - -
- 36.84% - Branches - 7/19 -
- - -
- 16.66% - Functions - 2/12 -
- - -
- 40.93% - Lines - 79/193 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -1941x -1x -1x -1x -1x -1x -1x -1x -1x -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -  -  -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -1x -  -  -  -1x -  -  -  -1x -1x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -6x -2x -2x -2x -2x -6x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x -2x - 
import { toBlob } from 'html-to-image';
-import { CANVAS_COLORS } from './constants.js';
- 
-export const OVERLAY_CAPTURE_SELECTORS = [
-  '.lineplot-overlay',
-  '.cs-overlay',
-  '.crop-overlay',
-];
- 
-function encodeBase64(bytes) {
-  if (typeof Buffer !== 'undefined') {
-    return Buffer.from(bytes).toString('base64');
-  }
-
-  let binary = '';
-  for (let i = 0; i < bytes.length; i += 1) {
-    binary += String.fromCharCode(bytes[i]);
-  }
-  return btoa(binary);
-}
- 
-async function blobToDataUrl(blob) {
-  if (!blob) return null;
-  const bytes = new Uint8Array(await blob.arrayBuffer());
-  return `data:${blob.type || 'image/png'};base64,${encodeBase64(bytes)}`;
-}
- 
-function getElementSize(el) {
-  const rect = el.getBoundingClientRect?.() ?? { width: 0, height: 0 };
-  return {
-    width: Math.max(1, Math.round(el.clientWidth || rect.width || 0)),
-    height: Math.max(1, Math.round(el.clientHeight || rect.height || 0)),
-  };
-}
- 
-export async function waitForImageElement(img) {
-  if (img.complete && img.naturalWidth > 0) return;
-  if (typeof img.decode === 'function') {
-    try {
-      await img.decode();
-      return;
-    } catch {
-      // Fall back to load/error listeners below.
-    }
-  }
-  await new Promise((resolve) => {
-    const done = () => {
-      img.removeEventListener('load', done);
-      img.removeEventListener('error', done);
-      resolve();
-    };
-    img.addEventListener('load', done, { once: true });
-    img.addEventListener('error', done, { once: true });
-  });
-}
- 
-export async function getCaptureImageDataUrl(img) {
-  const src = img.currentSrc || img.src;
-  if (!src) return null;
-  if (!src.startsWith('data:')) return src;
-
-  const { width, height } = getElementSize(img);
-  const scale = Math.min(2, globalThis.window?.devicePixelRatio || 1);
-
-  const canvas = globalThis.document.createElement('canvas');
-  canvas.width = Math.max(1, Math.round(width * scale));
-  canvas.height = Math.max(1, Math.round(height * scale));
-
-  const ctx = canvas.getContext('2d');
-  if (!ctx) return src;
-
-  try {
-    ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
-    return canvas.toDataURL('image/png');
-  } catch {
-    return src;
-  }
-}
- 
-export function createCapturePlaceholder(
-  el,
-  dataUrl,
-  { stretch = false, documentRef = globalThis.document, getComputedStyleFn = globalThis.window?.getComputedStyle?.bind(globalThis.window) } = {},
-) {
-  const rect = el.getBoundingClientRect();
-  const style = getComputedStyleFn(el);
-  const placeholder = documentRef.createElement('div');
-
-  placeholder.style.display = style.display === 'inline' ? 'inline-block' : style.display;
-  placeholder.style.width = `${el.clientWidth || rect.width}px`;
-  placeholder.style.height = `${el.clientHeight || rect.height}px`;
-  placeholder.style.maxWidth = style.maxWidth;
-  placeholder.style.maxHeight = style.maxHeight;
-  placeholder.style.minWidth = style.minWidth;
-  placeholder.style.minHeight = style.minHeight;
-  placeholder.style.borderRadius = style.borderRadius;
-  placeholder.style.backgroundImage = `url("${dataUrl}")`;
-  placeholder.style.backgroundRepeat = 'no-repeat';
-  placeholder.style.backgroundPosition = 'center';
-  placeholder.style.backgroundSize = stretch ? '100% 100%' : 'contain';
-  placeholder.style.flexShrink = style.flexShrink;
-
-  return placeholder;
-}
- 
-async function renderCanvasToDataUrl(canvas) {
-  try {
-    return canvas.toDataURL('image/png');
-  } catch {
-    return null;
-  }
-}
- 
-async function renderElementToDataUrl(el, toBlobImpl) {
-  const { width, height } = getElementSize(el);
-  const blob = await toBlobImpl(el, {
-    width,
-    height,
-    backgroundColor: CANVAS_COLORS.bgDeep,
-    style: {
-      width: `${width}px`,
-      height: `${height}px`,
-      transform: 'none',
-    },
-  });
-  return blobToDataUrl(blob);
-}
- 
-async function replaceElementsWithPlaceholders(elements, renderDataUrl, createPlaceholderFn, stretch) {
-  const restorers = [];
- 
-  for (const el of elements) {
-    if (!el?.parentNode) continue;
-    const dataUrl = await renderDataUrl(el);
-    if (!dataUrl) continue;
- 
-    const placeholder = createPlaceholderFn(el, dataUrl, { stretch });
-    el.parentNode.replaceChild(placeholder, el);
-    restorers.push(() => {
-      if (placeholder.parentNode) {
-        placeholder.parentNode.replaceChild(el, placeholder);
-      }
-    });
-  }
- 
-  return restorers;
-}
- 
-function defaultQueryAll(root, selector) {
-  return Array.from(root.querySelectorAll(selector));
-}
- 
-function defaultNextFrame() {
-  return new Promise((resolve) => requestAnimationFrame(() => resolve()));
-}
- 
-export async function captureViewportBlob(viewportEl, options, deps = {}) {
-  const queryAll = deps.queryAll ?? defaultQueryAll;
-  const toBlobImpl = deps.toBlobImpl ?? toBlob;
-  const waitForImage = deps.waitForImageElement ?? waitForImageElement;
-  const renderImage = deps.renderImageToDataUrl ?? getCaptureImageDataUrl;
-  const renderCanvas = deps.renderCanvasToDataUrl ?? renderCanvasToDataUrl;
-  const renderOverlay = deps.renderOverlayToDataUrl ?? ((el) => renderElementToDataUrl(el, toBlobImpl));
-  const createPlaceholderFn = deps.createPlaceholder ?? createCapturePlaceholder;
-  const nextFrame = deps.nextFrame ?? defaultNextFrame;
-  const overlaySelectors = deps.overlaySelectors ?? OVERLAY_CAPTURE_SELECTORS;
-  const restorers = [];
- 
-  const overlays = [];
-  const seen = new Set();
-  for (const selector of overlaySelectors) {
-    for (const el of queryAll(viewportEl, selector)) {
-      if (seen.has(el)) continue;
-      seen.add(el);
-      overlays.push(el);
-    }
-  }
- 
-  const images = queryAll(viewportEl, 'img');
-  await Promise.all(images.map(waitForImage));
- 
-  try {
-    restorers.push(...await replaceElementsWithPlaceholders(overlays, renderOverlay, createPlaceholderFn, true));
-    restorers.push(...await replaceElementsWithPlaceholders(queryAll(viewportEl, 'img'), renderImage, createPlaceholderFn, false));
-    restorers.push(...await replaceElementsWithPlaceholders(queryAll(viewportEl, 'canvas'), renderCanvas, createPlaceholderFn, true));
- 
-    await nextFrame();
-    await nextFrame();
-    return await toBlobImpl(viewportEl, options);
-  } finally {
-    restorers.reverse().forEach((restore) => restore());
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov-report/workflowHydration.js.html b/frontend/coverage/lcov-report/workflowHydration.js.html deleted file mode 100644 index ca03227..0000000 --- a/frontend/coverage/lcov-report/workflowHydration.js.html +++ /dev/null @@ -1,331 +0,0 @@ - - - - - - Code coverage report for workflowHydration.js - - - - - - - - - -
-
-

All files workflowHydration.js

-
- -
- 100% - Statements - 82/82 -
- - -
- 73.52% - Branches - 25/34 -
- - -
- 100% - Functions - 5/5 -
- - -
- 100% - Lines - 82/82 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -832x -2x -2x -7x -7x -7x -7x -7x -2x -5x -5x -5x -5x -5x -2x -7x -7x -7x -7x -7x -7x -2x -7x -7x -7x -7x -5x -5x -3x -3x -7x -7x -7x -7x -2x -2x -6x -6x -6x -6x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -7x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x - 
import { sortNodesForParentOrder } from './nodeHierarchy.js';
-import { sanitizeRuntimeValuesForPersistence } from './runtimeValuePersistence.js';
- 
-function mergeDefinition(nodeData, defs) {
-  const savedData = nodeData || {};
-  const registryDefinition = savedData.className ? defs[savedData.className] : null;
-  return registryDefinition || null;
-}
- 
-function getSocketType(inputDef) {
-  if (!inputDef) return null;
-  const [type] = Array.isArray(inputDef) ? inputDef : [inputDef];
-  return Array.isArray(type) ? type[0] : type;
-}
- 
-function getInputEntries(definition) {
-  return [
-    ...Object.entries(definition?.input?.required || {}),
-    ...Object.entries(definition?.input?.optional || {}),
-  ];
-}
- 
-function sanitizeWidgetValues(widgetValues, definition) {
-  const nextValues = { ...(widgetValues || {}) };
- 
-  getInputEntries(definition).forEach(([inputName, inputDef]) => {
-    const type = getSocketType(inputDef);
-    if (type === 'FILE_PICKER' || type === 'FOLDER_PICKER') {
-      nextValues[inputName] = '';
-    }
-  });
- 
-  return nextValues;
-}
- 
-export function hydrateWorkflowState(data, defs = {}) {
-  const loadedNodes = Array.isArray(data?.nodes) ? data.nodes : [];
-  const loadedEdges = Array.isArray(data?.edges) ? data.edges : [];
- 
-  const nodes = sortNodesForParentOrder(loadedNodes.map((node) => {
-    const definition = mergeDefinition(node.data, defs);
- 
-    return {
-      ...node,
-      type: node.type || 'custom',
-      className: node.className,
-      parentId: node.parentId,
-      extent: node.extent,
-      hidden: !!node.hidden,
-      style: node.style,
-      dragHandle: node.dragHandle || '.drag-handle',
-      data: {
-        ...node.data,
-        label: node.data?.label || node.data?.className || 'Node',
-        widgetValues: sanitizeWidgetValues(node.data?.widgetValues, definition),
-        runtimeValues: sanitizeRuntimeValuesForPersistence(
-          node.data?.className,
-          node.data?.runtimeValues,
-        ),
-        ...(node.data?.extraData || {}),
-        definition,
-        previewImage: null,
-        tableRows: null,
-        meshData: null,
-        overlay: null,
-        scalarValue: null,
-        processingTimeMs: null,
-        warning: null,
-      },
-    };
-  }));
- 
-  const edges = loadedEdges.map((edge) => ({ ...edge }));
- 
-  const nextNodeId = Math.max(0, ...loadedNodes.map((node) => parseInt(node.id, 10) || 0)) + 1;
- 
-  return {
-    nodes,
-    edges,
-    nextNodeId,
-  };
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov-report/workflowSerialization.js.html b/frontend/coverage/lcov-report/workflowSerialization.js.html deleted file mode 100644 index b44224f..0000000 --- a/frontend/coverage/lcov-report/workflowSerialization.js.html +++ /dev/null @@ -1,280 +0,0 @@ - - - - - - Code coverage report for workflowSerialization.js - - - - - - - - - -
-
-

All files workflowSerialization.js

-
- -
- 100% - Statements - 65/65 -
- - -
- 64.7% - Branches - 22/34 -
- - -
- 100% - Functions - 4/4 -
- - -
- 100% - Lines - 65/65 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -661x -1x -1x -4x -10x -10x -10x -4x -4x -5x -21x -21x -21x -21x -21x -21x -21x -21x -21x -21x -21x -21x -5x -4x -4x -5x -4x -4x -4x -4x -4x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -4x -4x -2x -2x -2x -2x -2x -2x -2x -2x -4x -4x -4x - 
import { sanitizeRuntimeValuesForPersistence } from './runtimeValuePersistence.js';
- 
-export function serializeWorkflowState(nodes, edges) {
-  const compactObject = (value) => {
-    if (!value || typeof value !== 'object') return null;
-    const entries = Object.entries(value);
-    return entries.length > 0 ? Object.fromEntries(entries) : null;
-  };
-  const getExtraData = (data) => compactObject(Object.fromEntries(
-    Object.entries(data || {}).filter(([key]) => ![
-      'label',
-      'className',
-      'widgetValues',
-      'runtimeValues',
-      'definition',
-      'previewImage',
-      'tableRows',
-      'meshData',
-      'overlay',
-      'scalarValue',
-      'processingTimeMs',
-      'warning',
-    ].includes(key))
-  ));
-  const getRuntimeValues = (node) => compactObject(
-    sanitizeRuntimeValuesForPersistence(node.data?.className, node.data?.runtimeValues),
-  );
- 
-  return {
-    version: 1,
-    nodes: nodes.map((node) => {
-      const runtimeValues = getRuntimeValues(node);
-      return {
-        id: node.id,
-        type: node.type || 'custom',
-        position: node.position,
-        ...(node.className ? { className: node.className } : {}),
-        ...(node.parentId ? { parentId: node.parentId } : {}),
-        ...(node.extent ? { extent: node.extent } : {}),
-        ...(node.hidden ? { hidden: true } : {}),
-        ...(node.style ? { style: node.style } : {}),
-        dragHandle: node.dragHandle || '.drag-handle',
-        data: {
-          label: node.data?.label || node.data?.className || 'Node',
-          className: node.data?.className || '',
-          widgetValues: node.data?.widgetValues || {},
-          ...(runtimeValues ? { runtimeValues } : {}),
-          ...(getExtraData(node.data) ? { extraData: getExtraData(node.data) } : {}),
-          output: node.data?.definition?.output || [],
-          output_name: node.data?.definition?.output_name || [],
-        },
-      };
-    }),
-    edges: edges.map((edge) => ({
-      id: edge.id,
-      source: edge.source,
-      sourceHandle: edge.sourceHandle,
-      target: edge.target,
-      targetHandle: edge.targetHandle,
-      ...(edge.style ? { style: edge.style } : {}),
-      ...(edge.hidden ? { hidden: true } : {}),
-      ...(edge.data ? { data: edge.data } : {}),
-    })),
-  };
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/lcov.info b/frontend/coverage/lcov.info deleted file mode 100644 index 4d40c16..0000000 --- a/frontend/coverage/lcov.info +++ /dev/null @@ -1,2979 +0,0 @@ -TN: -SF:src/angleMeasureGeometry.js -FN:1,clamp01 -FN:5,round3 -FN:9,getAngleLabelBasePosition -FN:34,getAngleLabelPosition -FN:42,moveAngleWidget -FN:64,measureAngleDegrees -FNF:6 -FNH:6 -FNDA:18,clamp01 -FNDA:12,round3 -FNDA:2,getAngleLabelBasePosition -FNDA:1,getAngleLabelPosition -FNDA:2,moveAngleWidget -FNDA:2,measureAngleDegrees -DA:1,18 -DA:2,18 -DA:3,18 -DA:4,1 -DA:5,1 -DA:6,12 -DA:7,12 -DA:8,1 -DA:9,1 -DA:10,2 -DA:11,2 -DA:12,2 -DA:13,2 -DA:14,2 -DA:15,2 -DA:16,0 -DA:17,0 -DA:18,2 -DA:19,2 -DA:20,2 -DA:21,2 -DA:22,2 -DA:23,2 -DA:24,2 -DA:25,2 -DA:26,2 -DA:27,2 -DA:28,2 -DA:29,2 -DA:30,2 -DA:31,2 -DA:32,2 -DA:33,1 -DA:34,1 -DA:35,1 -DA:36,1 -DA:37,1 -DA:38,1 -DA:39,1 -DA:40,1 -DA:41,1 -DA:42,1 -DA:43,2 -DA:44,2 -DA:45,2 -DA:46,2 -DA:47,2 -DA:48,2 -DA:49,2 -DA:50,2 -DA:51,2 -DA:52,2 -DA:53,2 -DA:54,2 -DA:55,2 -DA:56,2 -DA:57,2 -DA:58,2 -DA:59,2 -DA:60,2 -DA:61,2 -DA:62,2 -DA:63,1 -DA:64,1 -DA:65,2 -DA:66,2 -DA:67,2 -DA:68,2 -DA:69,2 -DA:70,2 -DA:71,2 -DA:72,2 -DA:73,2 -DA:74,2 -DA:75,2 -DA:76,2 -DA:77,2 -LF:77 -LH:75 -BRDA:1,0,0,1 -BRDA:1,1,0,18 -BRDA:2,2,0,1 -BRDA:5,3,0,12 -BRDA:9,4,0,2 -BRDA:15,5,0,0 -BRDA:25,6,0,0 -BRDA:34,7,0,1 -BRDA:37,8,0,0 -BRDA:38,9,0,0 -BRDA:42,10,0,2 -BRDA:43,11,0,0 -BRDA:44,12,0,0 -BRDA:64,13,0,2 -BRDA:72,14,0,0 -BRF:15 -BRH:8 -end_of_record -TN: -SF:src/canvasInteractionTargets.js -FN:4,getTargetElement -FN:13,supportsClosest -FN:17,matchesClosest -FN:22,isEditableInteractionTarget -FN:28,canStartCanvasRightDragZoomTarget -FN:37,canOpenCanvasContextMenuTarget -FN:46,isSecondaryCanvasContextEvent -FNF:7 -FNH:7 -FNDA:42,getTargetElement -FNDA:17,supportsClosest -FNDA:25,matchesClosest -FNDA:9,isEditableInteractionTarget -FNDA:3,canStartCanvasRightDragZoomTarget -FNDA:5,canOpenCanvasContextMenuTarget -FNDA:3,isSecondaryCanvasContextEvent -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,42 -DA:5,42 -DA:6,42 -DA:7,42 -DA:8,0 -DA:9,0 -DA:10,0 -DA:11,42 -DA:12,1 -DA:13,17 -DA:14,17 -DA:15,17 -DA:16,1 -DA:17,25 -DA:18,25 -DA:19,25 -DA:20,25 -DA:21,1 -DA:22,1 -DA:23,9 -DA:24,9 -DA:25,6 -DA:26,9 -DA:27,1 -DA:28,1 -DA:29,3 -DA:30,3 -DA:31,3 -DA:32,0 -DA:33,0 -DA:34,2 -DA:35,3 -DA:36,1 -DA:37,1 -DA:38,5 -DA:39,5 -DA:40,5 -DA:41,2 -DA:42,2 -DA:43,2 -DA:44,5 -DA:45,1 -DA:46,1 -DA:47,3 -DA:48,3 -DA:49,3 -LF:49 -LH:44 -BRDA:1,0,0,1 -BRDA:4,1,0,42 -BRDA:5,2,0,0 -BRDA:7,3,0,0 -BRDA:7,4,0,0 -BRDA:13,5,0,17 -BRDA:17,6,0,25 -BRDA:22,7,0,9 -BRDA:23,8,0,0 -BRDA:24,9,0,3 -BRDA:25,10,0,6 -BRDA:28,11,0,3 -BRDA:29,12,0,0 -BRDA:30,13,0,1 -BRDA:31,14,0,2 -BRDA:31,15,0,0 -BRDA:34,16,0,2 -BRDA:37,17,0,5 -BRDA:38,18,0,0 -BRDA:39,19,0,1 -BRDA:40,20,0,4 -BRDA:40,21,0,2 -BRDA:46,22,0,3 -BRDA:47,23,0,0 -BRDA:48,24,0,2 -BRF:25 -BRH:17 -end_of_record -TN: -SF:src/connectionUtils.js -FN:8,getHandleType -FN:12,getInputName -FN:16,getOutputSlot -FN:20,encodeProxyHandleRef -FN:24,decodeProxyHandleRef -FN:32,parseGroupProxyHandle -FN:45,getConnectionHandleType -FN:50,getResolvedHandleRef -FN:59,getNodeInputSpecForHandle -FN:70,outputTypeCanConnectToTarget -FN:87,resolveOutputTypeForTarget -FN:107,checkConnectionValid -FNF:12 -FNH:12 -FNDA:20,getHandleType -FNDA:12,getInputName -FNDA:5,getOutputSlot -FNDA:11,encodeProxyHandleRef -FNDA:12,decodeProxyHandleRef -FNDA:33,parseGroupProxyHandle -FNDA:11,getConnectionHandleType -FNDA:10,getResolvedHandleRef -FNDA:14,getNodeInputSpecForHandle -FNDA:17,outputTypeCanConnectToTarget -FNDA:8,resolveOutputTypeForTarget -FNDA:8,checkConnectionValid -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,1 -DA:5,1 -DA:6,1 -DA:7,1 -DA:8,1 -DA:9,20 -DA:10,20 -DA:11,1 -DA:12,1 -DA:13,12 -DA:14,12 -DA:15,1 -DA:16,1 -DA:17,5 -DA:18,5 -DA:19,1 -DA:20,1 -DA:21,11 -DA:22,11 -DA:23,1 -DA:24,1 -DA:25,12 -DA:26,12 -DA:27,12 -DA:28,1 -DA:29,1 -DA:30,12 -DA:31,1 -DA:32,1 -DA:33,33 -DA:34,33 -DA:35,9 -DA:36,33 -DA:37,7 -DA:38,7 -DA:39,7 -DA:40,7 -DA:41,7 -DA:42,7 -DA:43,33 -DA:44,1 -DA:45,1 -DA:46,11 -DA:47,11 -DA:48,11 -DA:49,1 -DA:50,1 -DA:51,10 -DA:52,10 -DA:53,10 -DA:54,10 -DA:55,10 -DA:56,10 -DA:57,10 -DA:58,1 -DA:59,1 -DA:60,14 -DA:61,14 -DA:62,10 -DA:63,10 -DA:64,14 -DA:65,14 -DA:66,14 -DA:67,1 -DA:68,1 -DA:69,1 -DA:70,1 -DA:71,17 -DA:72,7 -DA:73,7 -DA:74,10 -DA:75,17 -DA:76,3 -DA:77,3 -DA:78,3 -DA:79,8 -DA:80,17 -DA:81,17 -DA:82,3 -DA:83,3 -DA:84,17 -DA:85,17 -DA:86,1 -DA:87,1 -DA:88,8 -DA:89,3 -DA:90,3 -DA:91,8 -DA:92,1 -DA:93,1 -DA:94,8 -DA:95,1 -DA:96,1 -DA:97,8 -DA:98,1 -DA:99,1 -DA:100,2 -DA:101,8 -DA:102,1 -DA:103,1 -DA:104,1 -DA:105,1 -DA:106,1 -DA:107,1 -DA:108,8 -DA:109,8 -DA:110,8 -DA:111,8 -DA:112,8 -DA:113,3 -DA:114,3 -DA:115,8 -DA:116,8 -DA:117,8 -DA:118,8 -DA:119,8 -DA:120,8 -DA:121,8 -DA:122,8 -LF:122 -LH:122 -BRDA:1,0,0,1 -BRDA:8,1,0,20 -BRDA:12,2,0,12 -BRDA:16,3,0,5 -BRDA:20,4,0,11 -BRDA:21,5,0,2 -BRDA:24,6,0,12 -BRDA:26,7,0,2 -BRDA:27,8,0,1 -BRDA:28,9,0,0 -BRDA:32,10,0,33 -BRDA:33,11,0,2 -BRDA:34,12,0,24 -BRDA:35,13,0,9 -BRDA:36,14,0,2 -BRDA:37,15,0,7 -BRDA:45,16,0,11 -BRDA:47,17,0,2 -BRDA:47,18,0,9 -BRDA:50,19,0,10 -BRDA:53,20,0,2 -BRDA:53,21,0,8 -BRDA:54,22,0,2 -BRDA:54,23,0,8 -BRDA:55,24,0,2 -BRDA:55,25,0,8 -BRDA:59,26,0,14 -BRDA:60,27,0,11 -BRDA:61,28,0,11 -BRDA:61,29,0,4 -BRDA:62,30,0,10 -BRDA:64,31,0,2 -BRDA:65,32,0,1 -BRDA:70,33,0,17 -BRDA:71,34,0,7 -BRDA:74,35,0,10 -BRDA:75,36,0,3 -BRDA:76,37,0,1 -BRDA:76,38,0,2 -BRDA:77,39,0,2 -BRDA:79,40,0,8 -BRDA:80,41,0,3 -BRDA:81,42,0,3 -BRDA:83,43,0,2 -BRDA:87,44,0,8 -BRDA:88,45,0,3 -BRDA:91,46,0,5 -BRDA:91,47,0,1 -BRDA:94,48,0,4 -BRDA:94,49,0,1 -BRDA:97,50,0,3 -BRDA:97,51,0,1 -BRDA:100,52,0,2 -BRDA:107,53,0,8 -BRDA:111,54,0,1 -BRDA:112,55,0,5 -BRDA:113,56,0,3 -BRDA:115,57,0,0 -BRDA:115,58,0,3 -BRDA:116,59,0,0 -BRDA:116,60,0,3 -BRDA:119,61,0,3 -BRDA:119,62,0,1 -BRDA:120,63,0,3 -BRDA:120,64,0,0 -BRDA:121,65,0,3 -BRF:66 -BRH:62 -end_of_record -TN: -SF:src/constants.js -FN:50,getSpecTypeAndOptions -FN:57,isDataSocketType -FN:61,isDataSocketSpec -FN:66,getAcceptedSocketTypes -FN:92,socketSpecAcceptsType -FNF:5 -FNH:5 -FNDA:60,getSpecTypeAndOptions -FNDA:23,isDataSocketType -FNDA:23,isDataSocketSpec -FNDA:50,getAcceptedSocketTypes -FNDA:49,socketSpecAcceptsType -DA:1,5 -DA:2,5 -DA:3,5 -DA:4,5 -DA:5,5 -DA:6,5 -DA:7,5 -DA:8,5 -DA:9,5 -DA:10,5 -DA:11,5 -DA:12,5 -DA:13,5 -DA:14,5 -DA:15,5 -DA:16,5 -DA:17,5 -DA:18,5 -DA:19,5 -DA:20,5 -DA:21,5 -DA:22,5 -DA:23,5 -DA:24,5 -DA:25,5 -DA:26,5 -DA:27,5 -DA:28,5 -DA:29,5 -DA:30,5 -DA:31,5 -DA:32,5 -DA:33,5 -DA:34,5 -DA:35,5 -DA:36,5 -DA:37,5 -DA:38,5 -DA:39,5 -DA:40,5 -DA:41,5 -DA:42,5 -DA:43,5 -DA:44,5 -DA:45,5 -DA:46,5 -DA:47,5 -DA:48,5 -DA:49,5 -DA:50,5 -DA:51,60 -DA:52,60 -DA:53,60 -DA:54,0 -DA:55,60 -DA:56,5 -DA:57,5 -DA:58,23 -DA:59,23 -DA:60,5 -DA:61,5 -DA:62,23 -DA:63,23 -DA:64,23 -DA:65,5 -DA:66,5 -DA:67,50 -DA:68,50 -DA:69,50 -DA:70,50 -DA:71,0 -DA:72,0 -DA:73,50 -DA:74,50 -DA:75,50 -DA:76,50 -DA:77,3 -DA:78,3 -DA:79,3 -DA:80,3 -DA:81,50 -DA:82,50 -DA:83,50 -DA:84,17 -DA:85,17 -DA:86,17 -DA:87,17 -DA:88,50 -DA:89,50 -DA:90,50 -DA:91,5 -DA:92,5 -DA:93,49 -DA:94,49 -DA:95,49 -DA:96,5 -DA:97,5 -DA:98,5 -DA:99,5 -DA:100,5 -DA:101,5 -DA:102,5 -LF:102 -LH:99 -BRDA:1,0,0,5 -BRDA:50,1,0,60 -BRDA:52,2,0,0 -BRDA:54,3,0,0 -BRDA:57,4,0,23 -BRDA:58,5,0,19 -BRDA:61,6,0,23 -BRDA:66,7,0,50 -BRDA:68,8,0,12 -BRDA:69,9,0,38 -BRDA:70,10,0,0 -BRDA:75,11,0,3 -BRDA:75,12,0,47 -BRDA:76,13,0,3 -BRDA:83,14,0,17 -BRDA:92,15,0,49 -BRDA:93,16,0,0 -BRF:17 -BRH:13 -end_of_record -TN: -SF:src/defaultWorkflow.js -FN:8,loadCandidate -FN:41,loadDefaultWorkflowAsset -FNF:2 -FNH:2 -FNDA:11,loadCandidate -FNDA:6,loadDefaultWorkflowAsset -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,1 -DA:5,1 -DA:6,1 -DA:7,1 -DA:8,11 -DA:9,11 -DA:10,11 -DA:11,11 -DA:12,11 -DA:13,2 -DA:14,2 -DA:15,9 -DA:16,11 -DA:17,11 -DA:18,11 -DA:19,11 -DA:20,5 -DA:21,0 -DA:22,0 -DA:23,4 -DA:24,11 -DA:25,2 -DA:26,1 -DA:27,1 -DA:28,2 -DA:29,0 -DA:30,0 -DA:31,2 -DA:32,2 -DA:33,11 -DA:34,1 -DA:35,11 -DA:36,0 -DA:37,0 -DA:38,1 -DA:39,11 -DA:40,1 -DA:41,1 -DA:42,6 -DA:43,6 -DA:44,6 -DA:45,6 -DA:46,11 -DA:47,11 -DA:48,2 -DA:49,2 -DA:50,2 -DA:51,2 -DA:52,2 -DA:53,2 -DA:54,11 -DA:55,4 -DA:56,6 -LF:56 -LH:50 -BRDA:1,0,0,1 -BRDA:8,1,0,11 -BRDA:12,2,0,9 -BRDA:12,3,0,2 -BRDA:15,4,0,9 -BRDA:16,5,0,2 -BRDA:16,6,0,7 -BRDA:17,7,0,9 -BRDA:19,8,0,5 -BRDA:20,9,0,2 -BRDA:21,10,0,0 -BRDA:23,11,0,4 -BRDA:24,12,0,2 -BRDA:25,13,0,1 -BRDA:28,14,0,0 -BRDA:33,15,0,1 -BRDA:35,16,0,0 -BRDA:38,17,0,1 -BRDA:41,18,0,6 -BRDA:45,19,0,11 -BRDA:47,20,0,2 -BRDA:55,21,0,4 -BRF:22 -BRH:19 -end_of_record -TN: -SF:src/executionGraph.js -FN:14,getInputName -FN:18,getOutputSlot -FN:22,resolveExecutionEdge -FN:34,getConnectedNodeIds -FN:44,isPreviewLoadNode -FN:48,hasPreviewLoadSelection -FN:58,getRunnableNodeIds -FN:72,serializeExecutionGraph -FN:117,getAutoRunnableNodes -FN:122,hasBlockingAutoRunInput -FNF:10 -FNH:10 -FNDA:9,getInputName -FNDA:5,getOutputSlot -FNDA:22,resolveExecutionEdge -FNDA:11,getConnectedNodeIds -FNDA:11,isPreviewLoadNode -FNDA:9,hasPreviewLoadSelection -FNDA:11,getRunnableNodeIds -FNDA:7,serializeExecutionGraph -FNDA:4,getAutoRunnableNodes -FNDA:5,hasBlockingAutoRunInput -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,1 -DA:5,1 -DA:6,1 -DA:7,1 -DA:8,1 -DA:9,1 -DA:10,1 -DA:11,1 -DA:12,1 -DA:13,1 -DA:14,9 -DA:15,9 -DA:16,9 -DA:17,1 -DA:18,5 -DA:19,5 -DA:20,5 -DA:21,1 -DA:22,22 -DA:23,22 -DA:24,22 -DA:25,3 -DA:26,3 -DA:27,22 -DA:28,22 -DA:29,22 -DA:30,22 -DA:31,22 -DA:32,22 -DA:33,1 -DA:34,1 -DA:35,11 -DA:36,11 -DA:37,7 -DA:38,7 -DA:39,7 -DA:40,7 -DA:41,11 -DA:42,11 -DA:43,1 -DA:44,11 -DA:45,11 -DA:46,11 -DA:47,1 -DA:48,9 -DA:49,9 -DA:50,5 -DA:51,5 -DA:52,9 -DA:53,4 -DA:54,4 -DA:55,0 -DA:56,9 -DA:57,1 -DA:58,11 -DA:59,11 -DA:60,11 -DA:61,11 -DA:62,11 -DA:63,25 -DA:64,25 -DA:65,6 -DA:66,6 -DA:67,25 -DA:68,11 -DA:69,11 -DA:70,11 -DA:71,1 -DA:72,1 -DA:73,7 -DA:74,7 -DA:75,7 -DA:76,7 -DA:77,16 -DA:78,13 -DA:79,13 -DA:80,16 -DA:81,16 -DA:82,16 -DA:83,13 -DA:84,13 -DA:85,16 -DA:86,16 -DA:87,16 -DA:88,16 -DA:89,16 -DA:90,16 -DA:91,16 -DA:92,16 -DA:93,18 -DA:94,12 -DA:95,18 -DA:96,18 -DA:97,7 -DA:98,7 -DA:99,7 -DA:100,18 -DA:101,13 -DA:102,13 -DA:103,13 -DA:104,13 -DA:105,16 -DA:106,5 -DA:107,5 -DA:108,5 -DA:109,5 -DA:110,13 -DA:111,13 -DA:112,13 -DA:113,7 -DA:114,7 -DA:115,7 -DA:116,1 -DA:117,1 -DA:118,4 -DA:119,4 -DA:120,4 -DA:121,1 -DA:122,1 -DA:123,5 -DA:124,5 -DA:125,5 -DA:126,5 -DA:127,5 -DA:128,7 -DA:129,7 -DA:130,7 -DA:131,7 -DA:132,7 -DA:133,7 -DA:134,1 -DA:135,1 -DA:136,1 -DA:137,1 -DA:138,7 -DA:139,7 -DA:140,7 -DA:141,7 -DA:142,6 -DA:143,7 -DA:144,2 -DA:145,1 -DA:146,1 -DA:147,7 -DA:148,4 -DA:149,4 -DA:150,3 -DA:151,3 -DA:152,3 -DA:153,4 -DA:154,7 -DA:155,7 -DA:156,3 -DA:157,3 -DA:158,5 -LF:158 -LH:157 -BRDA:1,0,0,1 -BRDA:14,1,0,9 -BRDA:18,2,0,5 -BRDA:22,3,0,22 -BRDA:23,4,0,3 -BRDA:24,5,0,19 -BRDA:25,6,0,3 -BRDA:28,7,0,3 -BRDA:29,8,0,0 -BRDA:30,9,0,0 -BRDA:34,10,0,11 -BRDA:36,11,0,7 -BRDA:44,12,0,11 -BRDA:48,13,0,9 -BRDA:49,14,0,5 -BRDA:50,15,0,3 -BRDA:52,16,0,4 -BRDA:52,17,0,4 -BRDA:53,18,0,0 -BRDA:55,19,0,0 -BRDA:58,20,0,11 -BRDA:62,21,0,25 -BRDA:63,22,0,14 -BRDA:64,23,0,11 -BRDA:64,24,0,9 -BRDA:64,25,0,6 -BRDA:72,26,0,7 -BRDA:76,27,0,16 -BRDA:77,28,0,3 -BRDA:78,29,0,13 -BRDA:80,30,0,0 -BRDA:81,31,0,13 -BRDA:81,32,0,0 -BRDA:82,33,0,13 -BRDA:82,34,0,0 -BRDA:82,35,0,0 -BRDA:83,36,0,13 -BRDA:85,37,0,0 -BRDA:85,38,0,12 -BRDA:86,39,0,12 -BRDA:89,40,0,0 -BRDA:90,41,0,0 -BRDA:92,42,0,18 -BRDA:93,43,0,8 -BRDA:93,44,0,6 -BRDA:94,45,0,12 -BRDA:95,46,0,5 -BRDA:96,47,0,7 -BRDA:96,48,0,0 -BRDA:97,49,0,7 -BRDA:101,50,0,13 -BRDA:105,51,0,5 -BRDA:110,52,0,13 -BRDA:104,53,0,11 -BRDA:117,54,0,4 -BRDA:119,55,0,9 -BRDA:122,56,0,5 -BRDA:124,57,0,0 -BRDA:126,58,0,0 -BRDA:127,59,0,7 -BRDA:141,60,0,1 -BRDA:142,61,0,6 -BRDA:143,62,0,4 -BRDA:143,63,0,2 -BRDA:144,64,0,1 -BRDA:147,65,0,4 -BRDA:147,66,0,0 -BRDA:148,67,0,4 -BRDA:154,68,0,1 -BRDA:156,69,0,3 -BRDA:129,70,0,7 -BRDA:131,71,0,6 -BRDA:132,72,0,1 -BRDA:132,73,0,0 -BRDA:132,74,0,1 -BRDA:133,75,0,1 -BRDA:134,76,0,1 -BRDA:149,77,0,3 -BRF:78 -BRH:62 -end_of_record -TN: -SF:src/groupDrag.js -FN:3,getPointDistanceOutsideRect -FN:16,shouldReleaseFromGroup -FNF:2 -FNH:2 -FNDA:3,getPointDistanceOutsideRect -FNDA:2,shouldReleaseFromGroup -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,3 -DA:5,3 -DA:6,3 -DA:7,3 -DA:8,3 -DA:9,3 -DA:10,3 -DA:11,3 -DA:12,3 -DA:13,3 -DA:14,3 -DA:15,1 -DA:16,1 -DA:17,2 -DA:18,2 -LF:18 -LH:18 -BRDA:1,0,0,1 -BRDA:3,1,0,3 -BRDA:4,2,0,0 -BRDA:7,3,0,0 -BRDA:8,4,0,2 -BRDA:8,5,0,1 -BRDA:10,6,0,0 -BRDA:11,7,0,0 -BRDA:16,8,0,2 -BRF:9 -BRH:5 -end_of_record -TN: -SF:src/groupSizing.js -FN:4,getNodeSize -FN:15,getGroupMinimumSize -FNF:2 -FNH:2 -FNDA:4,getNodeSize -FNDA:2,getGroupMinimumSize -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,4 -DA:5,4 -DA:6,4 -DA:7,4 -DA:8,4 -DA:9,4 -DA:10,4 -DA:11,4 -DA:12,0 -DA:13,4 -DA:14,1 -DA:15,1 -DA:16,2 -DA:17,2 -DA:18,2 -DA:19,2 -DA:20,2 -DA:21,2 -DA:22,2 -DA:23,2 -DA:24,2 -DA:25,2 -DA:26,2 -DA:27,2 -DA:28,2 -DA:29,2 -DA:30,2 -DA:31,2 -DA:32,2 -DA:33,2 -DA:34,2 -DA:35,2 -LF:35 -LH:34 -BRDA:1,0,0,1 -BRDA:4,1,0,4 -BRDA:5,2,0,2 -BRDA:5,3,0,2 -BRDA:6,4,0,0 -BRDA:7,5,0,0 -BRDA:7,6,0,0 -BRDA:9,7,0,0 -BRDA:9,8,0,0 -BRDA:12,9,0,0 -BRDA:15,10,0,2 -BRDA:24,11,0,0 -BRDA:25,12,0,0 -BRDA:26,13,0,0 -BRF:14 -BRH:5 -end_of_record -TN: -SF:src/loadNodeOutputs.js -FN:1,resolveLoadNodeChannelPath -FN:22,beginTrackedNodeRequest -FN:28,isTrackedNodeRequestCurrent -FNF:3 -FNH:3 -FNDA:3,resolveLoadNodeChannelPath -FNDA:2,beginTrackedNodeRequest -FNDA:2,isTrackedNodeRequestCurrent -DA:1,1 -DA:2,3 -DA:3,3 -DA:4,3 -DA:5,3 -DA:6,3 -DA:7,3 -DA:8,1 -DA:9,1 -DA:10,3 -DA:11,0 -DA:12,0 -DA:13,3 -DA:14,1 -DA:15,1 -DA:16,1 -DA:17,1 -DA:18,1 -DA:19,0 -DA:20,3 -DA:21,1 -DA:22,1 -DA:23,2 -DA:24,2 -DA:25,2 -DA:26,2 -DA:27,1 -DA:28,1 -DA:29,2 -DA:30,2 -LF:30 -LH:27 -BRDA:1,0,0,1 -BRDA:1,1,0,3 -BRDA:7,2,0,1 -BRDA:7,3,0,1 -BRDA:10,4,0,2 -BRDA:10,5,0,0 -BRDA:10,6,0,0 -BRDA:13,7,0,2 -BRDA:13,8,0,1 -BRDA:14,9,0,0 -BRDA:17,10,0,0 -BRDA:19,11,0,0 -BRDA:22,12,0,2 -BRDA:23,13,0,1 -BRDA:28,14,0,2 -BRF:15 -BRH:10 -end_of_record -TN: -SF:src/markupShapeGeometry.js -FN:5,clampFraction -FN:11,sanitizeMarkupColor -FN:17,sanitizeMarkupShape -FN:41,parseMarkupShapes -FN:66,getArrowGeometry -FN:93,getMarkupPreviewStrokeWidth -FNF:6 -FNH:5 -FNDA:4,clampFraction -FNDA:2,sanitizeMarkupColor -FNDA:1,sanitizeMarkupShape -FNDA:0,parseMarkupShapes -FNDA:1,getArrowGeometry -FNDA:2,getMarkupPreviewStrokeWidth -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,1 -DA:5,4 -DA:6,4 -DA:7,4 -DA:8,4 -DA:9,4 -DA:10,1 -DA:11,1 -DA:12,2 -DA:13,1 -DA:14,2 -DA:15,2 -DA:16,1 -DA:17,1 -DA:18,1 -DA:19,1 -DA:20,1 -DA:21,1 -DA:22,1 -DA:23,1 -DA:24,1 -DA:25,1 -DA:26,1 -DA:27,1 -DA:28,1 -DA:29,1 -DA:30,1 -DA:31,1 -DA:32,1 -DA:33,1 -DA:34,1 -DA:35,1 -DA:36,1 -DA:37,1 -DA:38,1 -DA:39,1 -DA:40,1 -DA:41,1 -DA:42,0 -DA:43,0 -DA:44,0 -DA:45,0 -DA:46,0 -DA:47,0 -DA:48,0 -DA:49,0 -DA:50,0 -DA:51,0 -DA:52,0 -DA:53,0 -DA:54,0 -DA:55,0 -DA:56,0 -DA:57,0 -DA:58,0 -DA:59,0 -DA:60,0 -DA:61,0 -DA:62,0 -DA:63,0 -DA:64,0 -DA:65,1 -DA:66,1 -DA:67,1 -DA:68,1 -DA:69,1 -DA:70,1 -DA:71,1 -DA:72,1 -DA:73,1 -DA:74,1 -DA:75,1 -DA:76,1 -DA:77,1 -DA:78,1 -DA:79,1 -DA:80,1 -DA:81,1 -DA:82,1 -DA:83,1 -DA:84,1 -DA:85,1 -DA:86,1 -DA:87,1 -DA:88,1 -DA:89,1 -DA:90,1 -DA:91,1 -DA:92,1 -DA:93,1 -DA:94,2 -DA:95,2 -DA:96,2 -DA:97,2 -DA:98,2 -LF:98 -LH:75 -BRDA:1,0,0,1 -BRDA:5,1,0,4 -BRDA:7,2,0,0 -BRDA:11,3,0,2 -BRDA:12,4,0,1 -BRDA:14,5,0,0 -BRDA:14,6,0,1 -BRDA:17,7,0,1 -BRDA:23,8,0,0 -BRDA:24,9,0,0 -BRDA:29,10,0,0 -BRDA:29,11,0,0 -BRDA:66,12,0,1 -BRDA:73,13,0,0 -BRDA:93,14,0,2 -BRDA:94,15,0,0 -BRDA:95,16,0,0 -BRDA:95,17,0,0 -BRF:18 -BRH:8 -end_of_record -TN: -SF:src/nodeClipboard.js -FN:6,cloneValue -FN:18,clonePlainObject -FN:23,encodeProxyHandleRef -FN:27,decodeProxyHandleRef -FN:35,parseGroupProxyHandle -FN:48,hasOwn -FN:52,remapNodeId -FN:57,remapGroupProxyHandle -FN:63,remapGroupProxyDescriptors -FN:82,remapClipboardExtraData -FN:93,remapClipboardEdgeData -FN:119,collectSelectedNodeIds -FN:138,extractExtraData -FN:158,buildNodeClipboardPayloadForIds -FN:216,buildNodeClipboardPayload -FN:225,parseNodeClipboardPayload -FN:238,instantiateNodeClipboardPayload -FNF:17 -FNH:17 -FNDA:26,cloneValue -FNDA:39,clonePlainObject -FNDA:2,encodeProxyHandleRef -FNDA:2,decodeProxyHandleRef -FNDA:9,parseGroupProxyHandle -FNDA:6,hasOwn -FNDA:5,remapNodeId -FNDA:9,remapGroupProxyHandle -FNDA:1,remapGroupProxyDescriptors -FNDA:8,remapClipboardExtraData -FNDA:1,remapClipboardEdgeData -FNDA:4,collectSelectedNodeIds -FNDA:5,extractExtraData -FNDA:4,buildNodeClipboardPayloadForIds -FNDA:2,buildNodeClipboardPayload -FNDA:1,parseNodeClipboardPayload -FNDA:5,instantiateNodeClipboardPayload -DA:1,2 -DA:2,2 -DA:3,2 -DA:4,2 -DA:5,2 -DA:6,26 -DA:7,26 -DA:8,26 -DA:9,26 -DA:10,26 -DA:11,26 -DA:12,0 -DA:13,0 -DA:14,26 -DA:15,0 -DA:16,26 -DA:17,2 -DA:18,39 -DA:19,39 -DA:20,39 -DA:21,39 -DA:22,2 -DA:23,2 -DA:24,2 -DA:25,2 -DA:26,2 -DA:27,2 -DA:28,2 -DA:29,2 -DA:30,2 -DA:31,0 -DA:32,0 -DA:33,2 -DA:34,2 -DA:35,9 -DA:36,9 -DA:37,9 -DA:38,2 -DA:39,9 -DA:40,2 -DA:41,2 -DA:42,2 -DA:43,2 -DA:44,2 -DA:45,2 -DA:46,9 -DA:47,2 -DA:48,6 -DA:49,6 -DA:50,6 -DA:51,2 -DA:52,5 -DA:53,5 -DA:54,5 -DA:55,5 -DA:56,2 -DA:57,9 -DA:58,9 -DA:59,9 -DA:60,2 -DA:61,9 -DA:62,2 -DA:63,1 -DA:64,1 -DA:65,1 -DA:66,1 -DA:67,1 -DA:68,1 -DA:69,1 -DA:70,1 -DA:71,1 -DA:72,1 -DA:73,1 -DA:74,1 -DA:75,1 -DA:76,1 -DA:77,1 -DA:78,1 -DA:79,1 -DA:80,1 -DA:81,2 -DA:82,8 -DA:83,8 -DA:84,8 -DA:85,1 -DA:86,1 -DA:87,8 -DA:88,0 -DA:89,0 -DA:90,8 -DA:91,8 -DA:92,2 -DA:93,1 -DA:94,1 -DA:95,1 -DA:96,1 -DA:97,1 -DA:98,0 -DA:99,0 -DA:100,1 -DA:101,1 -DA:102,1 -DA:103,1 -DA:104,1 -DA:105,1 -DA:106,1 -DA:107,1 -DA:108,1 -DA:109,0 -DA:110,0 -DA:111,1 -DA:112,1 -DA:113,1 -DA:114,1 -DA:115,1 -DA:116,1 -DA:117,1 -DA:118,2 -DA:119,4 -DA:120,4 -DA:121,4 -DA:122,4 -DA:123,4 -DA:124,4 -DA:125,4 -DA:126,4 -DA:127,8 -DA:128,8 -DA:129,8 -DA:130,0 -DA:131,0 -DA:132,0 -DA:133,8 -DA:134,4 -DA:135,4 -DA:136,4 -DA:137,2 -DA:138,5 -DA:139,5 -DA:140,5 -DA:141,5 -DA:142,15 -DA:143,15 -DA:144,15 -DA:145,15 -DA:146,15 -DA:147,15 -DA:148,15 -DA:149,15 -DA:150,15 -DA:151,15 -DA:152,15 -DA:153,15 -DA:154,5 -DA:155,5 -DA:156,5 -DA:157,2 -DA:158,2 -DA:159,4 -DA:160,4 -DA:161,4 -DA:162,4 -DA:163,4 -DA:164,4 -DA:165,4 -DA:166,4 -DA:167,4 -DA:168,4 -DA:169,4 -DA:170,4 -DA:171,4 -DA:172,4 -DA:173,4 -DA:174,2 -DA:175,2 -DA:176,2 -DA:177,4 -DA:178,4 -DA:179,4 -DA:180,4 -DA:181,4 -DA:182,4 -DA:183,4 -DA:184,5 -DA:185,5 -DA:186,5 -DA:187,5 -DA:188,5 -DA:189,5 -DA:190,5 -DA:191,5 -DA:192,5 -DA:193,5 -DA:194,5 -DA:195,5 -DA:196,5 -DA:197,5 -DA:198,5 -DA:199,5 -DA:200,5 -DA:201,5 -DA:202,5 -DA:203,4 -DA:204,4 -DA:205,2 -DA:206,2 -DA:207,2 -DA:208,2 -DA:209,2 -DA:210,2 -DA:211,2 -DA:212,4 -DA:213,4 -DA:214,4 -DA:215,2 -DA:216,2 -DA:217,2 -DA:218,2 -DA:219,2 -DA:220,2 -DA:221,2 -DA:222,2 -DA:223,2 -DA:224,2 -DA:225,2 -DA:226,1 -DA:227,1 -DA:228,1 -DA:229,1 -DA:230,1 -DA:231,1 -DA:232,1 -DA:233,1 -DA:234,0 -DA:235,0 -DA:236,1 -DA:237,2 -DA:238,2 -DA:239,5 -DA:240,5 -DA:241,5 -DA:242,5 -DA:243,5 -DA:244,5 -DA:245,5 -DA:246,0 -DA:247,0 -DA:248,5 -DA:249,5 -DA:250,5 -DA:251,5 -DA:252,5 -DA:253,8 -DA:254,5 -DA:255,5 -DA:256,5 -DA:257,8 -DA:258,8 -DA:259,8 -DA:260,8 -DA:261,8 -DA:262,8 -DA:263,8 -DA:264,8 -DA:265,8 -DA:266,8 -DA:267,8 -DA:268,8 -DA:269,8 -DA:270,8 -DA:271,8 -DA:272,8 -DA:273,8 -DA:274,8 -DA:275,8 -DA:276,8 -DA:277,8 -DA:278,8 -DA:279,8 -DA:280,8 -DA:281,8 -DA:282,8 -DA:283,8 -DA:284,8 -DA:285,8 -DA:286,8 -DA:287,8 -DA:288,8 -DA:289,8 -DA:290,8 -DA:291,8 -DA:292,5 -DA:293,5 -DA:294,5 -DA:295,5 -DA:296,3 -DA:297,3 -DA:298,5 -DA:299,5 -DA:300,3 -DA:301,3 -DA:302,3 -DA:303,3 -DA:304,3 -DA:305,3 -DA:306,3 -DA:307,3 -DA:308,3 -DA:309,3 -DA:310,3 -DA:311,3 -DA:312,3 -DA:313,5 -DA:314,5 -DA:315,5 -DA:316,5 -DA:317,5 -DA:318,5 -DA:319,5 -DA:320,5 -LF:320 -LH:302 -BRDA:1,0,0,2 -BRDA:6,1,0,26 -BRDA:7,2,0,0 -BRDA:11,3,0,0 -BRDA:15,4,0,0 -BRDA:18,5,0,39 -BRDA:19,6,0,23 -BRDA:19,7,0,23 -BRDA:19,8,0,16 -BRDA:20,9,0,23 -BRDA:20,10,0,0 -BRDA:23,11,0,2 -BRDA:24,12,0,0 -BRDA:27,13,0,2 -BRDA:29,14,0,0 -BRDA:30,15,0,0 -BRDA:35,16,0,9 -BRDA:36,17,0,0 -BRDA:37,18,0,7 -BRDA:38,19,0,2 -BRDA:39,20,0,0 -BRDA:40,21,0,2 -BRDA:48,22,0,6 -BRDA:52,23,0,5 -BRDA:53,24,0,0 -BRDA:54,25,0,0 -BRDA:57,26,0,9 -BRDA:59,27,0,7 -BRDA:60,28,0,2 -BRDA:63,29,0,1 -BRDA:64,30,0,0 -BRDA:65,31,0,1 -BRDA:66,32,0,0 -BRDA:82,33,0,8 -BRDA:84,34,0,1 -BRDA:87,35,0,0 -BRDA:93,36,0,1 -BRDA:94,37,0,0 -BRDA:97,38,0,0 -BRDA:106,39,0,0 -BRDA:108,40,0,0 -BRDA:119,41,0,4 -BRDA:120,42,0,0 -BRDA:121,43,0,0 -BRDA:126,44,0,0 -BRDA:126,45,0,8 -BRDA:127,46,0,0 -BRDA:129,47,0,0 -BRDA:129,48,0,0 -BRDA:129,49,0,0 -BRDA:120,50,0,5 -BRDA:138,51,0,5 -BRDA:139,52,0,0 -BRDA:141,53,0,15 -BRDA:158,54,0,4 -BRDA:167,55,0,0 -BRDA:168,56,0,0 -BRDA:178,57,0,0 -BRDA:166,58,0,8 -BRDA:171,59,0,4 -BRDA:173,60,0,2 -BRDA:175,61,0,1 -BRDA:183,62,0,5 -BRDA:185,63,0,3 -BRDA:187,64,0,2 -BRDA:188,65,0,3 -BRDA:190,66,0,1 -BRDA:190,67,0,4 -BRDA:191,68,0,0 -BRDA:192,69,0,0 -BRDA:193,70,0,0 -BRDA:194,71,0,0 -BRDA:197,72,0,1 -BRDA:197,73,0,0 -BRDA:198,74,0,0 -BRDA:204,75,0,2 -BRDA:209,76,0,1 -BRDA:209,77,0,1 -BRDA:210,78,0,0 -BRDA:211,79,0,0 -BRDA:216,80,0,2 -BRDA:219,81,0,0 -BRDA:218,82,0,4 -BRDA:220,83,0,3 -BRDA:221,84,0,3 -BRDA:225,85,0,1 -BRDA:226,86,0,0 -BRDA:230,87,0,0 -BRDA:231,88,0,0 -BRDA:233,89,0,0 -BRDA:238,90,0,5 -BRDA:245,91,0,0 -BRDA:250,92,0,0 -BRDA:252,93,0,8 -BRDA:256,94,0,8 -BRDA:258,95,0,0 -BRDA:259,96,0,5 -BRDA:259,97,0,0 -BRDA:264,98,0,3 -BRDA:267,99,0,1 -BRDA:267,100,0,2 -BRDA:268,101,0,2 -BRDA:268,102,0,2 -BRDA:270,103,0,2 -BRDA:270,104,0,0 -BRDA:270,105,0,6 -BRDA:271,106,0,2 -BRDA:271,107,0,6 -BRDA:272,108,0,1 -BRDA:272,109,0,7 -BRDA:273,110,0,2 -BRDA:273,111,0,6 -BRDA:274,112,0,7 -BRDA:277,113,0,0 -BRDA:277,114,0,0 -BRDA:295,115,0,3 -BRDA:297,116,0,2 -BRDA:299,117,0,3 -BRDA:300,118,0,2 -BRDA:309,119,0,1 -BRDA:309,120,0,2 -BRDA:310,121,0,0 -BRDA:311,122,0,1 -BRDA:311,123,0,2 -BRF:124 -BRH:74 -end_of_record -TN: -SF:src/nodeHierarchy.js -FN:1,sortNodesForParentOrder -FN:9,visit -FNF:2 -FNH:2 -FNDA:12,sortNodesForParentOrder -FNDA:24,visit -DA:1,3 -DA:2,12 -DA:3,12 -DA:4,12 -DA:5,12 -DA:6,12 -DA:7,12 -DA:8,12 -DA:9,12 -DA:10,24 -DA:11,24 -DA:12,24 -DA:13,19 -DA:14,19 -DA:15,19 -DA:16,24 -DA:17,24 -DA:18,5 -DA:19,5 -DA:20,19 -DA:21,19 -DA:22,19 -DA:23,19 -DA:24,24 -DA:25,12 -DA:26,12 -DA:27,12 -DA:28,12 -LF:28 -LH:28 -BRDA:1,0,0,3 -BRDA:1,1,0,12 -BRDA:2,2,0,0 -BRDA:3,3,0,19 -BRDA:4,4,0,19 -BRDA:9,5,0,24 -BRDA:10,6,0,0 -BRDA:12,7,0,19 -BRDA:12,8,0,5 -BRDA:13,9,0,19 -BRDA:16,10,0,5 -BRDA:16,11,0,14 -BRDA:17,12,0,5 -BRDA:20,13,0,19 -BRDA:26,14,0,19 -BRF:15 -BRH:13 -end_of_record -TN: -SF:src/nodeWidgetDefaults.js -FN:3,getDefaultWidgetValue -FN:16,buildDefaultWidgetValues -FNF:2 -FNH:2 -FNDA:6,getDefaultWidgetValue -FNDA:1,buildDefaultWidgetValues -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,6 -DA:5,6 -DA:6,6 -DA:7,6 -DA:8,2 -DA:9,2 -DA:10,2 -DA:11,0 -DA:12,0 -DA:13,6 -DA:14,6 -DA:15,1 -DA:16,1 -DA:17,1 -DA:18,1 -DA:19,1 -DA:20,5 -DA:21,5 -DA:22,3 -DA:23,3 -DA:24,5 -DA:25,1 -DA:26,1 -LF:26 -LH:24 -BRDA:1,0,0,1 -BRDA:3,1,0,6 -BRDA:5,2,0,2 -BRDA:6,3,0,4 -BRDA:6,4,0,0 -BRDA:7,5,0,4 -BRDA:7,6,0,2 -BRDA:11,7,0,0 -BRDA:13,8,0,0 -BRDA:16,9,0,1 -BRDA:18,10,0,0 -BRDA:19,11,0,5 -BRDA:21,12,0,3 -BRF:13 -BRH:9 -end_of_record -TN: -SF:src/nodeWidgetLayout.js -FN:1,formatUiLabel -FN:9,normalizeInputNames -FN:16,getWidgetCombinedInputName -FN:37,buildCombinedInputNameByWidgetName -FNF:4 -FNH:4 -FNDA:4,formatUiLabel -FNDA:5,normalizeInputNames -FNDA:3,getWidgetCombinedInputName -FNDA:1,buildCombinedInputNameByWidgetName -DA:1,1 -DA:2,4 -DA:3,4 -DA:4,4 -DA:5,4 -DA:6,4 -DA:7,4 -DA:8,1 -DA:9,5 -DA:10,5 -DA:11,5 -DA:12,5 -DA:13,5 -DA:14,5 -DA:15,1 -DA:16,1 -DA:17,3 -DA:18,3 -DA:19,1 -DA:20,1 -DA:21,2 -DA:22,3 -DA:23,3 -DA:24,2 -DA:25,3 -DA:26,2 -DA:27,2 -DA:28,2 -DA:29,2 -DA:30,1 -DA:31,1 -DA:32,2 -DA:33,1 -DA:34,1 -DA:35,3 -DA:36,1 -DA:37,1 -DA:38,1 -DA:39,1 -DA:40,1 -DA:41,1 -DA:42,1 -DA:43,1 -DA:44,1 -DA:45,1 -DA:46,1 -DA:47,1 -DA:48,1 -DA:49,1 -LF:49 -LH:49 -BRDA:1,0,0,1 -BRDA:1,1,0,4 -BRDA:2,2,0,0 -BRDA:9,3,0,5 -BRDA:10,4,0,2 -BRDA:11,5,0,3 -BRDA:11,6,0,0 -BRDA:11,7,0,3 -BRDA:12,8,0,3 -BRDA:13,9,0,3 -BRDA:16,10,0,3 -BRDA:18,11,0,1 -BRDA:18,12,0,1 -BRDA:21,13,0,2 -BRDA:22,14,0,2 -BRDA:23,15,0,0 -BRDA:24,16,0,2 -BRDA:25,17,0,2 -BRDA:27,18,0,0 -BRDA:28,19,0,0 -BRDA:29,20,0,1 -BRDA:33,21,0,1 -BRDA:37,22,0,1 -BRDA:38,23,0,0 -BRDA:41,24,0,0 -BRDA:38,25,0,1 -BRF:26 -BRH:19 -end_of_record -TN: -SF:src/pngMetadata.js -FN:20,crc32 -FN:32,isPng -FN:40,chunkType -FN:46,readUint32 -FN:50,buildChunk -FN:66,parseTextChunk -FN:102,embedWorkflow -FN:141,extractWorkflow -FNF:8 -FNH:8 -FNDA:4,crc32 -FNDA:7,isPng -FNDA:26,chunkType -FNDA:26,readUint32 -FNDA:4,buildChunk -FNDA:4,parseTextChunk -FNDA:4,embedWorkflow -FNDA:3,extractWorkflow -DA:1,2 -DA:2,2 -DA:3,2 -DA:4,2 -DA:5,2 -DA:6,2 -DA:7,2 -DA:8,2 -DA:9,2 -DA:10,2 -DA:11,2 -DA:12,2 -DA:13,512 -DA:14,512 -DA:15,4096 -DA:16,4096 -DA:17,512 -DA:18,512 -DA:19,2 -DA:20,4 -DA:21,4 -DA:22,4 -DA:23,382 -DA:24,382 -DA:25,4 -DA:26,4 -DA:27,2 -DA:28,2 -DA:29,2 -DA:30,2 -DA:31,2 -DA:32,7 -DA:33,7 -DA:34,7 -DA:35,56 -DA:36,56 -DA:37,7 -DA:38,7 -DA:39,2 -DA:40,26 -DA:41,26 -DA:42,26 -DA:43,26 -DA:44,26 -DA:45,2 -DA:46,26 -DA:47,26 -DA:48,26 -DA:49,2 -DA:50,4 -DA:51,4 -DA:52,4 -DA:53,4 -DA:54,4 -DA:55,4 -DA:56,4 -DA:57,4 -DA:58,4 -DA:59,4 -DA:60,4 -DA:61,4 -DA:62,4 -DA:63,4 -DA:64,4 -DA:65,2 -DA:66,4 -DA:67,4 -DA:68,4 -DA:69,4 -DA:70,4 -DA:71,4 -DA:72,4 -DA:73,4 -DA:74,4 -DA:75,4 -DA:76,4 -DA:77,4 -DA:78,4 -DA:79,4 -DA:80,4 -DA:81,4 -DA:82,0 -DA:83,0 -DA:84,4 -DA:85,4 -DA:86,4 -DA:87,4 -DA:88,4 -DA:89,4 -DA:90,4 -DA:91,4 -DA:92,4 -DA:93,4 -DA:94,4 -DA:95,2 -DA:96,2 -DA:97,2 -DA:98,2 -DA:99,2 -DA:100,2 -DA:101,2 -DA:102,2 -DA:103,4 -DA:104,4 -DA:105,4 -DA:106,4 -DA:107,4 -DA:108,4 -DA:109,4 -DA:110,4 -DA:111,4 -DA:112,4 -DA:113,4 -DA:114,4 -DA:115,4 -DA:116,4 -DA:117,4 -DA:118,4 -DA:119,4 -DA:120,4 -DA:121,13 -DA:122,13 -DA:123,13 -DA:124,13 -DA:125,9 -DA:126,9 -DA:127,4 -DA:128,4 -DA:129,4 -DA:130,4 -DA:131,4 -DA:132,4 -DA:133,4 -DA:134,4 -DA:135,4 -DA:136,2 -DA:137,2 -DA:138,2 -DA:139,2 -DA:140,2 -DA:141,2 -DA:142,3 -DA:143,3 -DA:144,3 -DA:145,3 -DA:146,3 -DA:147,3 -DA:148,3 -DA:149,13 -DA:150,13 -DA:151,13 -DA:152,13 -DA:153,13 -DA:154,4 -DA:155,4 -DA:156,4 -DA:157,4 -DA:158,13 -DA:159,13 -DA:160,10 -DA:161,10 -DA:162,3 -DA:163,3 -DA:164,3 -LF:164 -LH:162 -BRDA:1,0,0,2 -BRDA:12,1,0,512 -BRDA:14,2,0,4096 -BRDA:15,3,0,2048 -BRDA:15,4,0,2048 -BRDA:20,5,0,4 -BRDA:22,6,0,382 -BRDA:32,7,0,7 -BRDA:33,8,0,0 -BRDA:34,9,0,56 -BRDA:35,10,0,0 -BRDA:40,11,0,26 -BRDA:46,12,0,26 -BRDA:50,13,0,4 -BRDA:66,14,0,4 -BRDA:69,15,0,0 -BRDA:72,16,0,0 -BRDA:74,17,0,0 -BRDA:78,18,0,0 -BRDA:81,19,0,0 -BRDA:87,20,0,0 -BRDA:91,21,0,0 -BRDA:102,22,0,4 -BRDA:104,23,0,0 -BRDA:120,24,0,13 -BRDA:121,25,0,0 -BRDA:123,26,0,0 -BRDA:124,27,0,4 -BRDA:125,28,0,9 -BRDA:141,29,0,3 -BRDA:143,30,0,0 -BRDA:148,31,0,13 -BRDA:150,32,0,0 -BRDA:153,33,0,4 -BRDA:159,34,0,3 -BRDA:160,35,0,10 -BRF:36 -BRH:22 -end_of_record -TN: -SF:src/runtimeValuePersistence.js -FN:1,sanitizeRuntimeValuesForPersistence -FNF:1 -FNH:1 -FNDA:12,sanitizeRuntimeValuesForPersistence -DA:1,2 -DA:2,12 -DA:3,11 -DA:4,11 -DA:5,1 -DA:6,1 -DA:7,1 -DA:8,1 -DA:9,0 -DA:10,12 -LF:10 -LH:9 -BRDA:1,0,0,2 -BRDA:1,1,0,12 -BRDA:2,2,0,1 -BRDA:2,3,0,1 -BRDA:2,4,0,11 -BRDA:5,5,0,10 -BRDA:5,6,0,1 -BRDA:9,7,0,0 -BRF:8 -BRH:7 -end_of_record -TN: -SF:src/valueFormatting.js -FN:15,parseNumberWithUnit -FN:77,formatNumericCell -FN:90,toSuperscript -FN:97,formatDisplayUnit -FN:101,parsePrefixableUnit -FN:116,formatPrefixedUnit -FN:120,choosePrefixExponent -FN:150,getAxisScale -FN:160,applySIPrefix -FN:181,getCompanionUnitColumn -FN:189,getTableColumns -FN:211,formatTableRowCell -FNF:12 -FNH:10 -FNDA:0,parseNumberWithUnit -FNDA:5,formatNumericCell -FNDA:10,toSuperscript -FNDA:7,formatDisplayUnit -FNDA:5,parsePrefixableUnit -FNDA:4,formatPrefixedUnit -FNDA:4,choosePrefixExponent -FNDA:0,getAxisScale -FNDA:5,applySIPrefix -FNDA:2,getCompanionUnitColumn -FNDA:1,getTableColumns -FNDA:2,formatTableRowCell -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,1 -DA:5,1 -DA:6,1 -DA:7,1 -DA:8,1 -DA:9,1 -DA:10,1 -DA:11,1 -DA:12,1 -DA:13,1 -DA:14,1 -DA:15,1 -DA:16,0 -DA:17,0 -DA:18,0 -DA:19,0 -DA:20,0 -DA:21,0 -DA:22,0 -DA:23,0 -DA:24,0 -DA:25,0 -DA:26,0 -DA:27,0 -DA:28,0 -DA:29,0 -DA:30,0 -DA:31,0 -DA:32,0 -DA:33,0 -DA:34,0 -DA:35,0 -DA:36,0 -DA:37,0 -DA:38,1 -DA:39,1 -DA:40,1 -DA:41,1 -DA:42,1 -DA:43,1 -DA:44,1 -DA:45,1 -DA:46,1 -DA:47,1 -DA:48,1 -DA:49,1 -DA:50,1 -DA:51,1 -DA:52,1 -DA:53,1 -DA:54,1 -DA:55,1 -DA:56,1 -DA:57,1 -DA:58,1 -DA:59,1 -DA:60,1 -DA:61,1 -DA:62,1 -DA:63,1 -DA:64,1 -DA:65,1 -DA:66,1 -DA:67,1 -DA:68,1 -DA:69,1 -DA:70,1 -DA:71,1 -DA:72,1 -DA:73,1 -DA:74,1 -DA:75,1 -DA:76,1 -DA:77,1 -DA:78,5 -DA:79,5 -DA:80,5 -DA:81,5 -DA:82,5 -DA:83,5 -DA:84,3 -DA:85,3 -DA:86,0 -DA:87,0 -DA:88,5 -DA:89,1 -DA:90,10 -DA:91,10 -DA:92,10 -DA:93,10 -DA:94,10 -DA:95,10 -DA:96,1 -DA:97,1 -DA:98,7 -DA:99,7 -DA:100,1 -DA:101,5 -DA:102,5 -DA:103,5 -DA:104,5 -DA:105,5 -DA:106,5 -DA:107,4 -DA:108,4 -DA:109,3 -DA:110,3 -DA:111,1 -DA:112,5 -DA:113,1 -DA:114,5 -DA:115,1 -DA:116,4 -DA:117,4 -DA:118,4 -DA:119,1 -DA:120,4 -DA:121,4 -DA:122,4 -DA:123,68 -DA:124,68 -DA:125,68 -DA:126,68 -DA:127,68 -DA:128,68 -DA:129,68 -DA:130,4 -DA:131,4 -DA:132,4 -DA:133,4 -DA:134,3 -DA:135,3 -DA:136,1 -DA:137,1 -DA:138,1 -DA:139,1 -DA:140,1 -DA:141,0 -DA:142,0 -DA:143,4 -DA:144,1 -DA:145,1 -DA:146,1 -DA:147,1 -DA:148,1 -DA:149,1 -DA:150,1 -DA:151,0 -DA:152,0 -DA:153,0 -DA:154,0 -DA:155,0 -DA:156,0 -DA:157,0 -DA:158,0 -DA:159,1 -DA:160,1 -DA:161,5 -DA:162,5 -DA:163,0 -DA:164,0 -DA:165,5 -DA:166,0 -DA:167,0 -DA:168,5 -DA:169,5 -DA:170,5 -DA:171,1 -DA:172,1 -DA:173,4 -DA:174,4 -DA:175,4 -DA:176,4 -DA:177,4 -DA:178,4 -DA:179,5 -DA:180,1 -DA:181,2 -DA:182,2 -DA:183,0 -DA:184,0 -DA:185,2 -DA:186,2 -DA:187,2 -DA:188,1 -DA:189,1 -DA:190,1 -DA:191,1 -DA:192,1 -DA:193,1 -DA:194,1 -DA:195,1 -DA:196,6 -DA:197,6 -DA:198,6 -DA:199,6 -DA:200,6 -DA:201,2 -DA:202,2 -DA:203,2 -DA:204,4 -DA:205,6 -DA:206,1 -DA:207,1 -DA:208,1 -DA:209,1 -DA:210,1 -DA:211,1 -DA:212,2 -DA:213,2 -DA:214,2 -DA:215,2 -DA:216,2 -DA:217,2 -DA:218,0 -DA:219,0 -DA:220,2 -DA:221,0 -DA:222,0 -DA:223,2 -DA:224,2 -LF:224 -LH:180 -BRDA:1,0,0,1 -BRDA:77,1,0,5 -BRDA:78,2,0,0 -BRDA:80,3,0,0 -BRDA:82,4,0,2 -BRDA:82,5,0,2 -BRDA:83,6,0,3 -BRDA:83,7,0,3 -BRDA:83,8,0,0 -BRDA:84,9,0,3 -BRDA:86,10,0,0 -BRDA:90,11,0,10 -BRDA:93,12,0,10 -BRDA:93,13,0,0 -BRDA:97,14,0,7 -BRDA:98,15,0,0 -BRDA:98,16,0,7 -BRDA:101,17,0,5 -BRDA:102,18,0,0 -BRDA:103,19,0,0 -BRDA:106,20,0,4 -BRDA:108,21,0,1 -BRDA:109,22,0,3 -BRDA:111,23,0,1 -BRDA:112,24,0,0 -BRDA:113,25,0,1 -BRDA:116,26,0,4 -BRDA:117,27,0,1 -BRDA:117,28,0,3 -BRDA:120,29,0,4 -BRDA:133,30,0,3 -BRDA:136,31,0,1 -BRDA:141,32,0,0 -BRDA:122,33,0,68 -BRDA:132,34,0,68 -BRDA:132,35,0,26 -BRDA:137,36,0,17 -BRDA:139,37,0,6 -BRDA:139,38,0,0 -BRDA:160,39,0,5 -BRDA:162,40,0,0 -BRDA:165,41,0,0 -BRDA:170,42,0,1 -BRDA:173,43,0,4 -BRDA:181,44,0,2 -BRDA:182,45,0,0 -BRDA:186,46,0,0 -BRDA:189,47,0,1 -BRDA:193,48,0,0 -BRDA:194,49,0,0 -BRDA:195,50,0,6 -BRDA:198,51,0,2 -BRDA:199,52,0,2 -BRDA:200,53,0,2 -BRDA:204,54,0,4 -BRDA:208,55,0,4 -BRDA:211,56,0,2 -BRDA:215,57,0,0 -BRDA:217,58,0,0 -BRDA:217,59,0,0 -BRDA:220,60,0,0 -BRF:61 -BRH:40 -end_of_record -TN: -SF:src/workflowCapture.js -FN:10,encodeBase64 -FN:22,blobToDataUrl -FN:28,getElementSize -FN:36,waitForImageElement -FN:57,getCaptureImageDataUrl -FN:80,createCapturePlaceholder -FN:106,renderCanvasToDataUrl -FN:114,renderElementToDataUrl -FN:129,replaceElementsWithPlaceholders -FN:149,defaultQueryAll -FN:153,defaultNextFrame -FN:157,captureViewportBlob -FNF:12 -FNH:2 -FNDA:0,encodeBase64 -FNDA:0,blobToDataUrl -FNDA:0,getElementSize -FNDA:0,waitForImageElement -FNDA:0,getCaptureImageDataUrl -FNDA:0,createCapturePlaceholder -FNDA:0,renderCanvasToDataUrl -FNDA:0,renderElementToDataUrl -FNDA:6,replaceElementsWithPlaceholders -FNDA:0,defaultQueryAll -FNDA:0,defaultNextFrame -FNDA:2,captureViewportBlob -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,1 -DA:5,1 -DA:6,1 -DA:7,1 -DA:8,1 -DA:9,1 -DA:10,0 -DA:11,0 -DA:12,0 -DA:13,0 -DA:14,0 -DA:15,0 -DA:16,0 -DA:17,0 -DA:18,0 -DA:19,0 -DA:20,0 -DA:21,1 -DA:22,0 -DA:23,0 -DA:24,0 -DA:25,0 -DA:26,0 -DA:27,1 -DA:28,0 -DA:29,0 -DA:30,0 -DA:31,0 -DA:32,0 -DA:33,0 -DA:34,0 -DA:35,1 -DA:36,1 -DA:37,0 -DA:38,0 -DA:39,0 -DA:40,0 -DA:41,0 -DA:42,0 -DA:43,0 -DA:44,0 -DA:45,0 -DA:46,0 -DA:47,0 -DA:48,0 -DA:49,0 -DA:50,0 -DA:51,0 -DA:52,0 -DA:53,0 -DA:54,0 -DA:55,0 -DA:56,1 -DA:57,1 -DA:58,0 -DA:59,0 -DA:60,0 -DA:61,0 -DA:62,0 -DA:63,0 -DA:64,0 -DA:65,0 -DA:66,0 -DA:67,0 -DA:68,0 -DA:69,0 -DA:70,0 -DA:71,0 -DA:72,0 -DA:73,0 -DA:74,0 -DA:75,0 -DA:76,0 -DA:77,0 -DA:78,0 -DA:79,1 -DA:80,1 -DA:81,0 -DA:82,0 -DA:83,0 -DA:84,0 -DA:85,0 -DA:86,0 -DA:87,0 -DA:88,0 -DA:89,0 -DA:90,0 -DA:91,0 -DA:92,0 -DA:93,0 -DA:94,0 -DA:95,0 -DA:96,0 -DA:97,0 -DA:98,0 -DA:99,0 -DA:100,0 -DA:101,0 -DA:102,0 -DA:103,0 -DA:104,0 -DA:105,1 -DA:106,0 -DA:107,0 -DA:108,0 -DA:109,0 -DA:110,0 -DA:111,0 -DA:112,0 -DA:113,1 -DA:114,0 -DA:115,0 -DA:116,0 -DA:117,0 -DA:118,0 -DA:119,0 -DA:120,0 -DA:121,0 -DA:122,0 -DA:123,0 -DA:124,0 -DA:125,0 -DA:126,0 -DA:127,0 -DA:128,1 -DA:129,6 -DA:130,6 -DA:131,6 -DA:132,6 -DA:133,6 -DA:134,6 -DA:135,6 -DA:136,6 -DA:137,6 -DA:138,6 -DA:139,6 -DA:140,6 -DA:141,6 -DA:142,6 -DA:143,6 -DA:144,6 -DA:145,6 -DA:146,6 -DA:147,6 -DA:148,1 -DA:149,0 -DA:150,0 -DA:151,0 -DA:152,1 -DA:153,0 -DA:154,0 -DA:155,0 -DA:156,1 -DA:157,1 -DA:158,2 -DA:159,2 -DA:160,2 -DA:161,2 -DA:162,2 -DA:163,2 -DA:164,2 -DA:165,2 -DA:166,2 -DA:167,2 -DA:168,2 -DA:169,2 -DA:170,2 -DA:171,2 -DA:172,6 -DA:173,2 -DA:174,2 -DA:175,2 -DA:176,2 -DA:177,6 -DA:178,2 -DA:179,2 -DA:180,2 -DA:181,2 -DA:182,2 -DA:183,2 -DA:184,2 -DA:185,2 -DA:186,2 -DA:187,2 -DA:188,2 -DA:189,2 -DA:190,2 -DA:191,2 -DA:192,2 -DA:193,2 -LF:193 -LH:79 -BRDA:1,0,0,1 -BRDA:129,1,0,6 -BRDA:133,2,0,0 -BRDA:135,3,0,0 -BRDA:139,4,0,6 -BRDA:157,5,0,2 -BRDA:158,6,0,0 -BRDA:159,7,0,0 -BRDA:160,8,0,0 -BRDA:161,9,0,0 -BRDA:162,10,0,0 -BRDA:163,11,0,0 -BRDA:164,12,0,0 -BRDA:165,13,0,0 -BRDA:171,14,0,6 -BRDA:172,15,0,2 -BRDA:173,16,0,0 -BRDA:163,17,0,0 -BRDA:191,18,0,6 -BRF:19 -BRH:7 -end_of_record -TN: -SF:src/workflowHydration.js -FN:4,mergeDefinition -FN:10,getSocketType -FN:16,getInputEntries -FN:23,sanitizeWidgetValues -FN:36,hydrateWorkflowState -FNF:5 -FNH:5 -FNDA:7,mergeDefinition -FNDA:5,getSocketType -FNDA:7,getInputEntries -FNDA:7,sanitizeWidgetValues -FNDA:6,hydrateWorkflowState -DA:1,2 -DA:2,2 -DA:3,2 -DA:4,7 -DA:5,7 -DA:6,7 -DA:7,7 -DA:8,7 -DA:9,2 -DA:10,5 -DA:11,5 -DA:12,5 -DA:13,5 -DA:14,5 -DA:15,2 -DA:16,7 -DA:17,7 -DA:18,7 -DA:19,7 -DA:20,7 -DA:21,7 -DA:22,2 -DA:23,7 -DA:24,7 -DA:25,7 -DA:26,7 -DA:27,5 -DA:28,5 -DA:29,3 -DA:30,3 -DA:31,7 -DA:32,7 -DA:33,7 -DA:34,7 -DA:35,2 -DA:36,2 -DA:37,6 -DA:38,6 -DA:39,6 -DA:40,6 -DA:41,7 -DA:42,7 -DA:43,7 -DA:44,7 -DA:45,7 -DA:46,7 -DA:47,7 -DA:48,7 -DA:49,7 -DA:50,7 -DA:51,7 -DA:52,7 -DA:53,7 -DA:54,7 -DA:55,7 -DA:56,7 -DA:57,7 -DA:58,7 -DA:59,7 -DA:60,7 -DA:61,7 -DA:62,7 -DA:63,7 -DA:64,7 -DA:65,7 -DA:66,7 -DA:67,7 -DA:68,7 -DA:69,7 -DA:70,7 -DA:71,6 -DA:72,6 -DA:73,6 -DA:74,6 -DA:75,6 -DA:76,6 -DA:77,6 -DA:78,6 -DA:79,6 -DA:80,6 -DA:81,6 -DA:82,6 -LF:82 -LH:82 -BRDA:1,0,0,2 -BRDA:4,1,0,7 -BRDA:5,2,0,0 -BRDA:6,3,0,0 -BRDA:7,4,0,3 -BRDA:10,5,0,5 -BRDA:11,6,0,0 -BRDA:12,7,0,0 -BRDA:13,8,0,2 -BRDA:13,9,0,3 -BRDA:16,10,0,7 -BRDA:18,11,0,5 -BRDA:18,12,0,4 -BRDA:18,13,0,3 -BRDA:18,14,0,4 -BRDA:19,15,0,5 -BRDA:19,16,0,4 -BRDA:19,17,0,3 -BRDA:23,18,0,7 -BRDA:24,19,0,0 -BRDA:26,20,0,5 -BRDA:28,21,0,3 -BRDA:28,22,0,3 -BRDA:36,23,0,6 -BRDA:37,24,0,0 -BRDA:38,25,0,0 -BRDA:40,26,0,7 -BRDA:45,27,0,2 -BRDA:51,28,0,4 -BRDA:54,29,0,2 -BRDA:54,30,0,0 -BRDA:73,31,0,2 -BRDA:75,32,0,7 -BRDA:75,33,0,0 -BRF:34 -BRH:25 -end_of_record -TN: -SF:src/workflowSerialization.js -FN:3,serializeWorkflowState -FN:4,compactObject -FN:9,getExtraData -FN:25,getRuntimeValues -FNF:4 -FNH:4 -FNDA:4,serializeWorkflowState -FNDA:10,compactObject -FNDA:5,getExtraData -FNDA:5,getRuntimeValues -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,4 -DA:5,10 -DA:6,10 -DA:7,10 -DA:8,4 -DA:9,4 -DA:10,5 -DA:11,21 -DA:12,21 -DA:13,21 -DA:14,21 -DA:15,21 -DA:16,21 -DA:17,21 -DA:18,21 -DA:19,21 -DA:20,21 -DA:21,21 -DA:22,21 -DA:23,5 -DA:24,4 -DA:25,4 -DA:26,5 -DA:27,4 -DA:28,4 -DA:29,4 -DA:30,4 -DA:31,4 -DA:32,5 -DA:33,5 -DA:34,5 -DA:35,5 -DA:36,5 -DA:37,5 -DA:38,5 -DA:39,5 -DA:40,5 -DA:41,5 -DA:42,5 -DA:43,5 -DA:44,5 -DA:45,5 -DA:46,5 -DA:47,5 -DA:48,5 -DA:49,5 -DA:50,5 -DA:51,5 -DA:52,5 -DA:53,4 -DA:54,4 -DA:55,2 -DA:56,2 -DA:57,2 -DA:58,2 -DA:59,2 -DA:60,2 -DA:61,2 -DA:62,2 -DA:63,4 -DA:64,4 -DA:65,4 -LF:65 -LH:65 -BRDA:1,0,0,1 -BRDA:3,1,0,4 -BRDA:4,2,0,10 -BRDA:5,3,0,0 -BRDA:7,4,0,0 -BRDA:9,5,0,5 -BRDA:10,6,0,0 -BRDA:10,7,0,21 -BRDA:25,8,0,5 -BRDA:31,9,0,5 -BRDA:35,10,0,2 -BRDA:37,11,0,1 -BRDA:37,12,0,4 -BRDA:38,13,0,0 -BRDA:39,14,0,0 -BRDA:40,15,0,0 -BRDA:41,16,0,1 -BRDA:41,17,0,4 -BRDA:42,18,0,4 -BRDA:44,19,0,1 -BRDA:44,20,0,0 -BRDA:45,21,0,0 -BRDA:46,22,0,1 -BRDA:47,23,0,0 -BRDA:48,24,0,0 -BRDA:49,25,0,2 -BRDA:49,26,0,4 -BRDA:50,27,0,2 -BRDA:50,28,0,4 -BRDA:54,29,0,2 -BRDA:60,30,0,1 -BRDA:60,31,0,1 -BRDA:61,32,0,0 -BRDA:62,33,0,0 -BRF:34 -BRH:22 -end_of_record diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 74877e1..0000000 --- a/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Core runtime dependencies are defined in pyproject.toml. -# Install them from the repo root with: -# python -m pip install -r requirements.txt --e .