From c8ea3d79deaaf85c9985e37c51670ba972a03305 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 14 Sep 2026 03:12:56 +0900 Subject: [PATCH 1/3] docs: quantify landing LCD rasterization divergence --- docs/landing-rasterization-crop.png | Bin 0 -> 67336 bytes docs/landing-rasterization-evidence.json | 15575 +++++++++++++++++++++ docs/landing-rasterization.md | 150 + 3 files changed, 15725 insertions(+) create mode 100644 docs/landing-rasterization-crop.png create mode 100644 docs/landing-rasterization-evidence.json create mode 100644 docs/landing-rasterization.md diff --git a/docs/landing-rasterization-crop.png b/docs/landing-rasterization-crop.png new file mode 100644 index 0000000000000000000000000000000000000000..838f9ee1f1a1d67de63b6199a05a626877ca4b36 GIT binary patch literal 67336 zcmeFZcRZK>`##*1gzO{|+1V7zN=RmAlq7p4D@jU;Y-P_VGbBke3fb97l2F-XWR;Qh zJ1+0f=lA`5f8+k^{^x!??myJ)dcCgkoacF*$9bGr;Azd16l6?fn>KBtIHjVfvuV>d z6?}d{N`im=E%s(@+Dy`ZO7Xa!$L6Uj3Xe#?{@LjZY9jP1KEF=vqv4_reM!f)?c}c1 zc-7pHxGQr3$5Cd zHFR}pxrc7=*#E{xoZXjdu$R{B_5DW6o0`fWldPTl9njs{;<32~*0D$a`v)!7R=X=l zM-wkAlRB?*vaLR8O_ZP|Ct0~lP3GtHs=s!^?dbf%0<}VbEH_hnMuuM`b;x|4-LGyP z)?wYUfiw4yN$+Lz9am!yC(X%m5ygLBGgntV_4GO09FDkFZQpaC);pEMcUgj((w|pQ zkgLr`JR&9K9+g7C581ypVsVdVvlsSU9?clw!aR5t{}~bTew3Mcx5RJP9+&@lwIrXA z(C!DC4T0lsM~TxK7+rbZiny@X_}gRB=K9UVnc^j#*|}Zj>h>J;UH%&GOLbC;nbO78 zmAZj}(!XQE4PCz4Hf|(6dy5_u{@0{Fbl*u^TVAx{E*h6mJs_NGkXJqJKD6{Zu(`3Z z%CXqIxK}EGq>lds*Bb3T0du&)9e zgTPte?n%zkt}_?vY{Y43DgBL#?C2ef_f>w?GS<|jbbrP2s=sYcPhVeKU%xJlH_pK39*4e-Vpk)te3HAC;aQw9;h>zUg$#J}|L5 zNFwHb^VoJ)Aq$uIl#(Y>?So}K+pYvJS54aoHYY6b3to@P8SFKDICX$5snSDCs8yW0 z`bCux{z36vweO>NlDx; zq1X4#ul@bAJL?gfc!^KpHlkQ9Ot1+ zmB{Z7?w-te@+2f7fhk1!piIB_-#<~&(a!uP`FrqNqeW_FCP`X{in=i4u%S=Y0g*?i z1L98eC<-%j2-1-`^AoEQBRHt=h>G}Fetl`sNfOIsadhc7FAvWFI&RwOOj=h*O2=>8xb6}V@X~(a z7sDV+!=b7kH5$WkHo%^%Nks9^ix)4b_Jqs_+K34V2-I#*JDzjXK)xW>oK(BmlxDkq z!g8uGZf9CwLe_RwZ(%CJc+rbX?^t59wO(hni0{5RgRiHKU)g)@(8oeg)uRfe&N*&w zZcdn>XD%bEo|98kirRE^N&~-oFOL;h{t@`|dx?7{ulS2ueaK$%BS+r%h95k6nr^$2 zcFE6==Smmaj!k^6l-ohcEU&NcdCX;)^kf+Gz@6Q)57W}_Jbfy-{xjeEQ4XK;`Sa%& z83Gkg>qnQUa4578_rS-P7zUWwR!p}1Wfm5eJ}i?b#-$Nouo$#A9`WZ_@5=OLZ?(Vc ze*!0FW=2cLl84SzuF_*^FMj;|x#`0C{2pV$J>F|Wtno*$@a^2WGoXT-noUzjn6Y-i ziHgimGTc=7?T2jLo&Gho`q=xJIW5of{pBWFTA1T(-7FeP|CJ-r(a|u_;{uH2I;T&| z^Uw_{VtMFhX>u}C(w;FesQ)$HJJDz%dQmifoR^VY^!hIcSPMPROI4C&AI0Y^nGWrW zEBk&)cF4MCxYxOOHY4F9o$wX?`Qpirlw(VGwYmlv|X@o}|3 z&h$$bhYxs^mc`IltYsC?%H}J{S@!Bx>F=3WMx`#C7p&@n=%1V|3c{K+qhywR!*aFn zxVibk3sxgd(bB8qX#J9qV}#MQ4iBo3Wv^FX>wzG4vE*LwVO9Z3o zRrmy>4cne5ahdC%5l!l_NrxX|EH`PN`1aGYWAY~*9o@su2~z(WIHCFZdBPaO$1qdw z;ED{K?k(0eFu2=0&4tUK+ja4cwmne82G7X}O3um6ZES7j{MUW4bL%I6zW?ySx5Gw} zlr1c`!l$RO+r_w4?An{;?dz6(6k+t1gR_|qw1@vkcko;}&8|L?Z&>eg0Y87YS%&6{I zyUt_hxJ?vgZkna_tDa`>mG=lYhiiEj#(s06SdMl6ogkbdqBHwAcx0vKRA%UC+2KA} zbCEB?ti1&uoAq_=o@L$f*4Q5Er5t;vZI#|#z0oT@w3s!yWn^jU8?A<(^wh(Gxx28k+wGKxX-m3`}T$wZ&6f9rV;p5{IW+cZJpM87qp3{%=C7NRQ>9dX{10*qm z=bK=RSAP6mzr4P_R7rcaf#vEf)UmYTwInXw7i>cZ{1Nc zo*KM7Cik~-=$@RWv5Sl7QvX%fBZ;B7=E$YbwSA?o+WOIP^oI|5JFH|t+8K|8(vj>eeU6~)LCEE2tSIc=KBR1mx{afSbBB%x*11MbF5gg0=8tmxy&X~bC=>EQ)om|Qpm=V z;rQ_J<9prX$2T`b#KxWkED;%SVg&LtFko;UYa3B?JIW&Cr@&UBfyDtJ|6cdfB>@?F zIyxtQDJiLCEEL@LW+f}YftH4bMoY3xqHSkpcx2=Wbw@`*U{oO9?4L}I5-Fz=+ZIK< zI^rhOwa%ST+Qn+0lb;no5H}w?D=*6}ob+VjQCWCe!cL`?Um+EdoGYHPKMwaf%0?b} zFk!x&D$*IB{PJ!PgX~AW3tD0|9TSJ;qa-st__$hKtVYOBrnH=V{!DIm69Gj(5Oa`U zxqj5Sr>7@`St{a-av1X|clRT`FE1S&4VC!vFfT6@z)I}eyhWJxn_HV1$w_|A^sA|# zJGYPUz`dfFQW#bO(9OKLz4i6_>SV2@wY8Ybu!`qCDHjgh)}i-hXdEW<&dZlaUYr$> z5jguIAg)=cG6}mpwR>`<|Hn;#D#AHn6pua#8-m%!Ppt@Mr$JS-GU7;^VL|PoFy%+&*TGAH9|b{A-zyx&@r(slBRn_AFClW8>nB|Kr70 z^TUnObG5XvbW~|Md}7vZ9HT8_?G`O@BE~R@##g%Zfdbf8pK|z0+QDuOkB+*C!m0tB z<~RLV8gi2Sgnjmx_g`P-yndbZkE1QWR&D}g2J8~2&V}%&_HeiH9V&&S`<+{%ZSNng#fcOYU#pN^)Q|8DSy`R_D73 zH?O_ebQ@^x+0`E=gNvRr%4yUOH2r}Xva@&QcQ;o?zJ4u@{d=JvVVya!2;xUAxj*8L z#fdD(+^NV(CIH(+t=pLIQnILGr2^2Z+KM(7T0Rw(Sf?OCs1Ge6Kg+1IHh7ur2JqPG*F z3K2m|0H^-fB~nJ6nHuJwU)a`SQ@*_XRTH}oP_Ndn<|3kT!{-(|5%h<~satFgWzHxR zUApaOF{l5!-lvI6*4$#1cGAePYa#wX?)QFv$Kj~Jd8Nz0_pN+Z=X!oiIqbbr{O>mk z&m~Va))cgPZJJb<{m4M}emrkvz%p2yX+^K3Y>VY1`s;`>=87^hGetdSO}||KAwziO zU6=|@w;W0Z(W)ENZnoO?QQVXxH0`yBw@2gv81N@U&Vqyapha9{JZpb{QLLR z;;Ub-`R5-xd^o!5&W;7#iy8~U@P!TaogKSJEt0N$G@_%Y*VfZh1RT!G%R?}>-*cRe zAPL%KfAhokfAiTTD8DEWNa{>OkQQ1+MMccPUw<@A{v7=2IpGr6U7N^0m+AiIi8SrGWh(<`erKjanrnCfYhWW=ee^sq!=lo{wK(X?gyACF!N7 ziNi3ROX15SwPU^?b&OgigqiFqQ*4cz&&oBtQ+`|;Kl;zLltstS-7oum7VXK-%gcEA zQA;dENR_e*yF@ul@H#lGdTHrd|};7kI0OI^8d z%isD^R#x_@(p&CF}_ND+TW96rgzDPhqg1Q3P0T3;KJbDb$2 zqv`(mu^xdS)eS8gg(Tm#H7|na;h|&CEGtW(KB)Z7NirZeH@9XZjtd~3M_4@2P=O1- z{~#2p$iXaNZj6kKY60xfsENkOpG0t$sgbA*tTyeg3#vyVJSC+)f>VtMG4#%y5d(@u znBjco$`wgwN*Gn=V^?P^5Wo{;Q^}Jj{C0MBFiXVt@O(e{6YfYNHtdq;{yGzh6r0pk zrz2?+vho$lX$r4jI`F*=VyU&wJhRZoEaT~EW5+=n7qDx9*W^tw^Mx{A3LCbk9n%BT z6B1(5rJ*lhT0}(pi>-Q{W|HCy5;dnuxZbp)UlC~Yhbczj@i(Q4KsSfZ1)g7JD~h!A zeuaC>=Qhv(WTqc1veYfmpE{r^R-SM*#{RTpN>u{SN!w>Kt4Hq*Pp*9Ey*!k~O*>&r zv=eBk1)*-wvx{3r5KZ$NKD*VGdq&LRld#$6&!0WuvUr7rxM%iME^n9nyV6cTIcG2k z%(7l_@c1;H9UWCQyXDl?)OIyQhKC>5Li{!gRHlH9@a0R}!{c`d)+Hy0MgqoGcKO@Z zCkBVk6+4b#8)kqi%0C1ziGcd~#TpW`qeqV#J~Q2%dnVuN)3b}U1nV?gvs>51M6*xm z=G?B)miU_ImdzfMdBp*_j~|;hMe%ZQa8MCDdJZ%bO;(p3zy?D3oot#uCiz()gzAF# z&=%Wtu=5={B*GMmeTrQz(;6?f0~XNAic1D=a9{(CRKsVwzmlSkZ1gqB=cXg0UTVIu z9>JK_@isTVBBMg#fC-{GC%Kv1tWqu;Z!77czk@I zW|sM%)t_J=JrfWE!}IWQXc<)x`uFpHsp3AH6CZ9ADkwlfL3PQNO-dUC@RlNN1w@U-QZS71HB`Z-&nu2nFHO<;CypE5xN{Aa|Y#lr{ zxuQ`v$_|0>`1Z6woeFdpRkOj%h(fR zGpqhG!RO6_LnE;lxU9OL zo>z|(zKs|J9DxmN6IcUD5XC^7Z$Z2?Kf74t@#klEpsj<$FlaixDnAk5jmdM@rB8>fI#vo|?_K8tp$xPWK;jW#58TzhtpI?lMjJyL+HCgsOC%0tkd9%mL zNNiwFk^LT8F7*R4G7r+zIbaqirlvSFvpSs-^`apPK=sWr0tX#GJ~0BDC*nS32%t+a zeQ=p2uo@sDea5fTP!DpnCP_ttb$q7_JOPWo^n0Swu~-a2q8Zo-5DUq$7XP9#U;?-a zQZx`0a8Pit6u}6A();=WAxgZMH6_6{!@^^#li_xa;3Y*o%afl!7X?6Zt}>+p+=U+n zMoR|WC(IN|1PB++tTYaHhI(n1WcY#Es$PszuA)8MB0d*B&~n!C#L3+PKY6;k^v)de zICrb1uFrO;BqEF7!kLRZ>ZYqyu$YwKgXx|7A6O12iii|uCQK;Ha`(Mgz;3+gshajJ zkjW}xInH*}uF2JHk?zubs@|D2kHmoYCq~VZZ@f_zg^z8eV3xd(CK8c?R%>hP;~Z6M zYi?)2l|C?`A&eqhFqxN%`-y1GIVWcxarYeY2R1?UV)eGCujf_68tjUQ&zi$oa({R+ zE8jeb@XxVygrOo3Mgq)dJy6|5c4_HeeSKo01bKM_fB&dVfx)H{yRqta6I5KME@&z( znV)npvTj$e(n{ctSQ07(rui{ZynHY~Hv9SW2q#JPq<+T+3(+}!fL^2>5IBe*KHPB* zC=QOE8<88QAdCv|-$r!>=x zRsx_|G=#ChRt$o_Ff1_JUgN(z3;Zy#s4>rh**Q6>+1Y`TulmCpEd~wYTK+LD2?+_~ z0*4L-AN%n-5~-8-owEZq1w9V`7@hKopPtJ1_G^GK>o#_!P$2C%SF$d`cR~71R?A=i z(r${OL#K{7cd73ODse7OD2lAA2a&> z-RXzTqu>&87pp(s(%19p|0GxH{*v1~*j7zxupugN2 zoAVxHr_Hg(E<5upR{6qJe3OZ_L-1ADO~>4)4sc<;>~k!+?b;^gk6Al$^QNpnC5zeQ z$GkqWZrXo6>%o}RAd;Nl{X`|8q<_E;&majG4=_j6!d?kzXDN42w` z_4vP%zP?ncyVXF#Ze)OQaPR*=_wF~tz#sM$TJL5E_RAk4n8T_athIJU*p-qj$QjlF zU4u}z5oZc(7+V;a^LU(_d$8VA*oj{@W%s>?6UaDV)qsxj3|3?ZOh;4D0+80AnEr!0w1>mS_3w~8l;$e*D3OS18c{400H?5*RLa+}+8#b4O(jX8R2+>uqN z@{v!~8>3TR0>5P{$37Z0XS-b*B%i$3_`dpP`;XEqA6@v)CrZ|=nm>QBC=hs!|uTbsU`{Y5O(QrYAx zgK|2qu435duaOTU{=_9D(mHJ3*@$EF%%AV>>r+2}p5<&_3|#1YT|`4fY6L0AHmR}M zwqrkL>-SxD`qg6{2>{>teP+fApt2=JE~WC%^yLty!$F1ZvWY(@yTvd~>%WRCMeIKC z=;-K-tNr@%wY~r9SHcy6*WZtjGoUjUmf-t$JLF0Bidm5}h2D+)iKM`3_-)Qu<7$9- zNtT4f#O&PM6S-ZYPT%CivWkkL2|NGs+~p3mQ&p7=mLse9<41#+4n5W9E|=FK4Iq!@ z1{|?S7pV9+KYy%M;%hn}KZ0=da`|gSE$<7Uek`GKioK$~xQ0Hlwf<_)=OTM;IzL4B za2peiV+-0kI@Rwp)Zj|NAkml?on1Mqs-}iaAC_H}=>cVJI^2RGc>A3y`3vHR^tJ{W^BQE_SbPZG`@X%U?ZnC|MuX< zcaG&h4Uk^>>%1kGSI~VyiFdf|(AbyiaGMp%T~9JgK53ZL?dwZa720gDXU|Yu?zhnE zy0&?TGD_%1^R6dcB+>lxQYVwX`(1(=+vV5WYxchR?}v*bzqLods@wMOO|ovaPB#jc zWZA;QDd-iW5c9d^%}pjd8SxLO)cJG!8{AUON=Q2-wr)!n|>lI$_B+~BJ7DhXIZ*AU6WN~@<`8nX0f8>B75WW0Gn&AE3cXm$j(gZ&9 zT5%C99j19+SV%|;h=2~+NB9%X7>sIqy6=k@;`L!H%^2ZJ^@Yw{O4oLQR0AcXhP_*{)rIitMoFSpCkD%+REShlk(p zoTwdJ5W(4^lTo(7ZZ{ddV**T^U^l}8$D^OM67NFQK(m%U`Mf_Vf4>R^_;>{hfa z&aZE&ESxR)_3@~2r8m`?iB@CQ$EN-7=WM9#?%XqYp)Qa={50H4{mO3}rRERwsxwTd zSn1xJ*Z*cKbJC{-wORITyD|x!vA@BIUUt%g<^F<*^#bL3*^0_1D3a6L4 z#d0&Fqx!D(T|cvb?7`;gyepDpu@9ppc}^KMyq{xAO{QUfDwA#)t5e!nFHE6$^$@>P z)HjzX(`!Y{lgT^c^>t3>t}yT&3VN1q7cjFlkTmkGAi_x6#-xG8YW-mUjir8qUW-Gz zzA5?;h>9#A^Oc1$f}Ovx1Vz>RuCBWCSNrP-eb7pS-1>1a&sY1e>=~*LP0N?^m^~00 z8XCeXmyGQB?oj1Bl0ON~V|`_ekhLshrTGB)fscArUe1zd(A@2eTqhVNf`Q(Ll-ITK zNB+xDuMpFTKofHaR)CNd@E$reL?p9<4n6$_1T-JX^1i0yLWFbj1-*`F$w?sR}Z`F3eM&k@-tKfsc`sgOcfPeS%D#ct<(d} z7ArBU!o5n`0gCK+=07|6+rmnKbEz>V8yg?q?oQRMR;v@*bg(T)5-F6lVO$D(LhzNo zKC~<%xE>kPkoK{IRHUc%^n5p5pEEzq5LP9w2};GlW2G488KAQ=D_*kbhKStno_0xU z;%3q459~yMSYj(438DibQ^w=Rq)OV)4EZs}G-nJARXAwaXab3G4}kH<3ZODCFf=T4 zjM?&x*p`nT7{{59;`q$wWXb$D{u zAgW8yE05Qrm+YAlxs7Ch>SI|yyNufgd3$pO?isuCF{MuZ>Kf=}*!)6q%YNy+?D3-C zwtfFTB6*%?rL&^KaqFb^>^Amvi(Z~*M#47BpVn{rlXS_uKaG(O-E~zw_V4P5hfW%w zYz9-tBYK_Z1@xbuF^V&vi~4i>XkU=Oykc;V-9e#l^_;sxpIB$#J!E?OlF3HjU}(N5 zBH~io8>^~^kNkOZv>u(ceW-6=Z&!Hnu>Fdmn?yyKj8pP<*H`{sf~+++jRSr;vAkMQ z5tqNyaOW4%MR9q$uB_8};_q?}n-`6Q+iNPFXt}v1nMCizk(o4IkU(%ZvGQOMb z!bsB9oj4Go@Ur!8t0*}|%KxR?n*oc(KRlYJE~31b#d6|hbd&)rMb2%9+`ZF|ti(k2 zIfz#<8P9C8HY8igXbm}%GpL)R&GcF1+@()XtX{~wUENwC<7D#G@8VSbnPPv^3l?u* znrV)hhu_+vG)EPXe*e;;H&!AK2gEx5Z0-}>Q}L0G-> zrdm|s78)~NRLA3;^T@`F?UlXEt>|mbm$0BjT7~yDHy>Pk#3gUB`*FolJ@UTiiv4kqA8M+<&E;K+$HD`=#G5 zw9B<4(3kr0dV!#m1O!3>fD55|LBQU$eUGtxA5c3%d;%xRr*+H{beZR(4TwNOKnQtm z#ZvhX*bbOw;37g|MSyf?{Le>Be*bO;7Y7_i9jaV|3|-0cU@*iTc&_$^3+=?M zy_SW6c!ogCn18Lf0j3Q1Z&4E}uSF)beW~*AjsIi!F)%jv_CQXLx+gpAili4>#9&x4 zvKZK@DF;GNwD0okDrBV?PsN!i&X`=|jE|3Bob0|A_b(Cc>d(nQ z4PUt}zYO*_@n<qR^)5ZTRr^|#Bd`!ft zKS%a0wSxy5Tq*O0u#5|pH*3q0$KwgA#zHRn_1T_KQhL0+)LV~1sUg-8>-y{tLKlc# zGIY;-?O<`g`#yM4%wLp7;*oGbdeFx8NO=dALjA?V%X_iE?1~~g_4mn1U~Dr0CUV4m zafq>=ISnWzdw%DIpZdEmV)+8Rh@f)z|b;Fdr-wTD`{&} zBN9v!1WQtlWFc}_Rl!0P0i6>T0OkNI8#gk8iwArn-6jdB2zU+84(OEr;sqU0PnD^B zZr7kosZ*)3^q<8}f+4}>f#U?PM> zSn5*B!^fBU_;J9OWRJm}NE#uCh(m7rKW>fHOCixGuMSuzRI$vC6A(=R0|Mh^bv8ad z{|cPV)}s$7fe3&ttgx8?b9x-0f!YWk2&4c&FyW?yEH^q1&d2R2A}=%xfeR=bA|^sK zgHaU0ZyOCFU=K)v=pn{$ORsDMc3221m zBP2Bcf|Ux$Sp#70zqdn48^d0`5r0X={NEd7M(7I;-jnu0+78390Ut*^usU+Ph|#=^ z(aTVaML-n@TZHHg+w~--$r+2Q*0$)Z8R#=~Q4*t9XZGlFhuNPIJ@T0br*4vx8i%|6 zf|*)}G9H~*3p%cLJ=eIaYPm{cO%+q8pxxnW!`en{W>b(0< zf^6vfyY4S|NnT7B@jTVhnJ0d_xNHzR=x{nP+coC>!@bS-+Ip-1Ui#Nz!SfGCceiHJ zJWa`X=Xsam#P_|5bbbx0h4D*^Ol1DYO|OX5%{cJKka)?yad^mc!E*Jd_ruKscl881 z0(|Dj|6LwO~SA(-#OwD$LJn!}gF?LK+lvVrC#9=@3Aw_lvzS3kP z)kD@c6zR#-$F=tl?H;|hHvQLnx8s{MzTLH#|8g~2DKyc_ic*g%ip))>pJo4EWv27a zw(Gzp67~a8od%7X-QhfO=NsPo6z-v=8XUiCdi(f6ZBsqrprnuTXPt85^qkAe76&B|ZI(hW4^20|;f4jQ?M+~_41my8&y)Hm(!x$Q## zvs4Ypeti0|al1ui%1%p?ymWTDPeE}K|y37neTo5F_s!E zXa<2m?T|AG1ye0hj24(XA};~SVxN02A(s@v0D)TuqXkSdUrVbc42XpKj?kzGrC^4O z#l5zdFOQ|&lQn}}l@JyYnpAR@qfta{&k27@0!r@oUOqu|9a?3aY(4$Ch|uCf=W3q7 zMWlp(Fa6+#mI;Z+XQ&I)2XAaeLDjs1!KwA!+?tbe+YU5bv~vTNm4e+Xz+*-$az4i#0WBzmzS3y zRB)37)cjESAc~kQICtM)dDahA8=3i)sl$@Y7s|iF!$obF_Lf;U)M`)A~Ib-~X z3G)2u(=eh$D*Diwc@)SzFyyZ%2qMhVNoQxmDGpz){LKO#FM+eh%Mera)j*ir0%ptz zX>10lXrm&M(PTot2YiwFfA0qob6|kw<~*1IRRC)D%6ds=&CC5=kR#SM1UtBmf);QH z!3cMB5UXb_$(0fu>(r-$J3!&^u`#(%%YyJn){FqE8JaB*Xfudl32DG)gh+3^*T=l) z^-m2Pa)GMxqKF1f|P*Y6Z3LZ7N1 zOXiFuK+cBbH3yg}hc;w<`26O_5~Ro-S6I}k|lj%`Dh44E|{zU)0mkkzGvS+IY@gPDXM(_nkO} zMyF&n^icc^X^>vEP}D>9a)1g^ABv?O=jADB z(`nX=YXBCNJ;nai%~WTD^bf|1NEoPhTJ)7Tqcy$LncN$dd7J~;S;>P$GI8=JyYB%; za^uv zsdJ-)f;1nx_bHy`66>jQ=Au4G(&WZvFCS828>aBn;AQEy1GYJF@r=Kra z26RPH_p$Nh+`P>fyJ>LBXyu@4Ow_>DOBtRuV56zS}gQD@wJR;g7n+iLR2o-Ow^ z=+$}b(_7?Xx^vG@@b#J11-j{5_F=6IKqRR zqq@60#sz9ycV16BU4CVs;N}<7!DFl2#RWy;^dBFzZz7$cqSLRGk5=2{{OidYHK*E4 zn$>#)ue_U0AqFp`60;vny;tA=aXUHf^CzU_YG?ew3ds$|`{D#}Q!I5|U}?$aFLkcg}= zd#AUR~(0as&u<7XF9{dME_FXs-W zJE+phsW0V;6&}B*ixGYG!B`Wf9!e&H8Ni-t1b4C`3W45TqWXg<4u?4> z@+*;AvW?JXmH=HDAxK9;n<&R5U@C^h+0yykZj)jfgS$p^ryL9zw3L{v6jyLJtVP{=ir1@oFb_mv&L`V!La ze=7f!QA-X&zrJ3X(22qh62)2NEYcqL5!;z~PH=+IBV>iHqb&pBC-*;s-8yXlaTZ?q zxyKwK{36sVM34wmd)fPUF9@zp%_muJ)S`Q*P)8nvyk4eON*nzd(4ogqp484m-}yc=DgxSudzQ^H&dakGQ5sJ007UgC1{z+D_~K{R z8Nld_EMkEWj`5l6m?l)9f=??}?TFkL!hZsI($muu1tEZHM4cmQ1_|O!qR(mTJ(*vO zz=D=QmE`-5gg{2QJ|wq(NB0^84vbJW1*N`AL|=jKIS72J!cmh)0PA9i<2qTjFE(a7>q5!IXReEO(oS+7beOy0sT<;gJvKkfi@jtZ=!&K zAL()cNaFdZ!uOE&T6*;ri9u8BLqHpp6l_2iVe&iPHrF*;K5;Q=IJGW5+PTiZr~llx zyjDfC`*PQ4$c_oK3wY&Z1Zs$!4ysReA^D(VRl1Fvlx(Z4u{;OONHev$ZrV;e-a=y^ z+Nt4~)i{m=I;@ZUDgsZEv-7AgY1CJx1S-7tq*OepIJ6cYJR!C~on*Rai*TUw5>-R0 zPFdOQyLJ+kp4wcxz3<+9*NNWtXf$n;&i;{MJyq*cs-y#CTbJ=1g(${EqItDhJ84|5 z2r0dI&m0*3PI5W*CRAu?9R#ac$iL|%1G1SOzO4<3rYy17TX={Fif_0pdRRdNLy81c9KqWD1o^=8YX6^)cMijVfl>_`pgaW-STDTfM4L>?%Y`5_TN z&26T5i`^<_)NE|q!2AFUrPZH82kzq;ZZW&6cBTs7YTvHNt~im)>~@)Li<+Q$Ki|Va z_YoHbK|9KZI;nD*C$EK6_zMFvZWoXaDu$5qbk1qG-#i$&**_PuLt?^8>6 z+-#})bS&|Vmg&uOKidDb)pPf9A$KBJ#^Ac;s@*r=+-Ez1tsN(QP1Jk2hIJVdm3Bhz zPRK))(-5N!Ke+nk5i;V)aIf;o$)%tg8!2&>Q>QMjE=~|7f`|bZEa9jLxdO!KPzHy# zS{;OH8HU6a@`KJ#pH!sxX9<1roD`5fTCmm5Ih9RuoI7%FLa zwr5C)JHeUXTuA)-uBWFF${Ip`zKemMaH7emn)85EY^B@#&lw^zBMdT<6Kom77QR&K z$}Ghs=N)38&n1% z>qXL`1Mv`%^&tv?kV(1?ZLJ?(_%b*riJ+FPYQ#kZRVn;L4uHr~K!`hpZbJJ_)as0P zq#7tAeTb>gzcFo3fGv!RFBL*s)P^fVdy>VTVL^B)Ch-8HLaU3= zIqibo?Q`qYz=`~XL?rgS`(Ctg2utYVk1yqPd-f2uIQ*3Ucg{JM`gNitkR7V4O32=b zqCN=Hi7eVZ>3LF#uU=vRPKf=?s1=?8(?Fy~WV8rOQ})!ghC<>URuw>wjw-5^;GWX~ zf#9=oa9_veW%?{V44*HIB-nf>Q5{vV@J5KM;M6oaVFVG=!=hV*Kljw3+ul6W|7t}v zE;A7Rf=FltM@3YKY9MMPa#-rH%y2dTZ2U}H$T^8(xKq3vf#z{kgF@=Lb{OPAvM&`W zTL9rg0*T0ysLEsr?l_~P%Ab(g5s5lO6p#S{CaHpXn%Kq5$pC`DPeCzF8#Dl<9iB7_ zL_;@DPUV4fvQ2pJGM`)^&>2@sMYS zUoxEwy}WAJdlV~jnd(SbZo9H*l~qK)Ek@7xLFH++t>fW)egANJb*2QJ)+2KhD&(S1 z{j}l}V-siEs+w^11^Y@!Q}*!vw0CzN^f7M_DCl;m65qTaTOlb?q%%UkVnxQ?(b zwV&)29x1SXD(GD~b}E5Snm;gm`QsUF9?7TC|9PX&W@cy+9?>;0Of`@`#e9`+?~bXp zEAD;@#C^Lb{q7mV`2oq>-+yUO{yJ{_oZF6yj3iqqrMe@7VjI~x z8&Ptm30_U@H=#{(L}nYf{Vj^o_uq3JeoIY64nT(Ec_4-l<-exU*C&cCp;xpKZ-Na6 z&G${6;2u%zL<2PxE;K``ji~6xH*J|7(wb1|LQtEYl@<98?;apthXJP`;z#-Ab8Y< zgc6krsH|MwFn1?WlSI&=MA9448#X^tSdP&q>M&8tvv>pnCE+QFAtvM(T7(-?Al2kT zs|j@-+|epAngr`i{HgE~5sV?iH6#!b%SGZ15NH$LCkBg4d#?c#Z-rNlpe`3xV1!Nn zZ=Hem?gVL7&;9B%wZi1EKLtn)@I!+J+n}LMhc7NNk^pf6^Y>1Vs-NPWIHekxfu|=0 zBI4m!AYH8%*YJ$cnJ=bNIE_l~%V;PJDdZHu|1fU=$1t8SNuK44bmSx=vw4a}^1E4KV%%uODEh?A)V3%CDp92}4Z0`$#GgR3o%v=esvvi!}TD zj|#68t&XauGU@HQ5tm1kN6UGGd{TMD#l>OeB6P!bAYjcpm@%A-S69Iogzl3-GIgTy z->0I=cF+P*M^H`<;C*@&DI4*k2BcOIx$tr-kor;?q8U`A2QrYA2YbuFwhiqGO8rLA zwWm!?+7RCPKAptlX0_NpD~dg&&*3OxxMUSpzvt8ThU^dloyWOiHjcap9H(v#xW3bG zd#5d%zrAytalD0#OJ1J9tvl@^OV4A6rWQN2WrZ}QDL+Y_kW#;(AN=%PFw4L#9&R>q zFChnWE42_C3tDCKgW;xoL&G;E+V@M2vmH&L(UQsD-Wgx$#=m06m2Jh?e($^FgETLb zVB0N%qGD22MFFj@;uUWMP;rIRbK8PISGtNG|2+Fz$XehT`2 zE;PA$Y((8!KQBx{$o;nYZ+HHamdwu<_PkGzj?_I&5keZ;>RewolgZQF6 zwQ4Yj;~q)h2U$a=4AJk z3Y0>KL9P!rsDU6_;)&M*yn3|{v`QlZ666oaLrgTz3mbuC&U|6YpO7!GE4~^33ytGBR=zm~HVTctn1{ z)TFTHk!l*8G!a|5#>s$E&O;iV_jMv3JP6IS-C!+%e^Pmpf-W+`h>2^|O#Xb1w?;uj zBTViYtel2ZfR12J2>L?P8YW7G_mnV!wTK8GMiUmumMI|G^mQ0qJoLnnzgxT#yUlN*&ez?Cx=}AEa#1xW<}z z?&Rg%Szt)c%NdkPIH93hCJ=-=UPjJANkic7anWH`<9=h*Fg%(o>~qjp(Z?B&)# z)rmf%5CJ`HobE2!G$CG?&D&<3s+h2u^MA1R-SJrV@85SqNJ5g3Jxdu`Ek$I6%t8wx z6d@JTvPbsFs*q8XGP06v(LgGd25Cv%k-DShc^{YietzHk_dLJX>-ppP;~u!id7amJ zem=+XUPt)0YeqS&EeGva3jgzB4P1{bKYlrlU#srR#pCR9b^i(yD9QDzOlvu4V74)R z)gFb=q9A<4yXN0b^UY>vXz(Nix^&3|9bMby+2u6hHRJHE4_8-tX->c7iPJYWIM6SJ z+|-A~jVzZdZCfv$lWt<-tu;^j9;e)jS5GF5S~7q71u3gUr&<&*37mfTzh7gmCC-e& zF6NHijtMSOvTxV4C#0mb z_SOHT1{Re1L?1L)ULPJQpE>s1pUiG(Mj?u8CUzLNr#|$e22HR#ccB&>c0+qjK|oT3 zwo{IYLvt9T0s{yxf-Vn8EUrmfUJ%&o1=RjiMY&p!kvK(Mf?;A{929PZ^A5+qC-MIh+2e3iMml7g(wO&F#Nh$ zf+^F;8UiSC^ip$-a0sbE^y$RilN1ieh@?xS*1GO}5LG|yEFF{X5 zUH1ylVw|N}B7Vm~>*+1n9^#gP#Xf2J1LCkKV+kcN7ERftGiUDN5iQi1QWQ=TV()H~ z5CU4#IBup}*bPaB$xamYldE*VsNg3S)6$86xhw!L<9OQH5LEJHxiId{!&iVu0jD6~ z10M^$y%Jh++)kJ4K66mjiv3{{C*B0bsqB7SCrYSpMUH$ydzx2>n4v2Gk}2{6hlibu zAa&?;1JEa)!zab@Q2Hs^l}IwS2|Y3LK$7X#)&_$cxw*o@3jtd~60n3`KsCmv zSEfKbfNLF`Zp~2aDsCOrvY?CUz2?YEgP6rOja_^FPIhqy>IRL@7$d_4*aDIO#c(8` zmT^Vz<<=1knO0JA>)=SRN1zY~AcObD#{%^D@!-6e4gScm1BNWlTw8*W!0DIDO9n2D z*CT;7b_t-!1XO-IH?q>g2<$an9Z%u;kpeh_R0uo0uahRgvE(*wC4=74S5``R-$@$Lhsr(;Uf)jb4t*Z@0% zD#!Pe38}^BICuTiqQ@j)IoT>;kBrTZnOcil zIp=-plkCAO>>Th~zTaZb+M=CJ$?VE5{_VMshSD;1n1#Ltz26nv-#ENNF5}OFg4+!{ zOSngeUx|3gSd|`Mbbi7}?YqJazRPx-x~JCvv>IG`Q>uO!`|H=Nhp$q(9++_Yp~=zC z5le3t_jF4!&DuV(r<`&eTw02j=EvFE%FVY0a9!}3wQ=!#r5P!fd$>|9gXeBnW}o%z z{>JXWm5aH23a){^x73nMIlf8%>Zg3~qb!XsX%+6X_b>XA5S%;g>E6lt^EJnev!;Lc zxaiEE{pdv0WviJPnyXaI`NSMY_udaZlN9x|G$d-}JhNe;S%0P{ou4#c^LlN?yz`%P zdvx!dWKpfGJ%47G?2Y@;cA_m)>(^TO%ila%zRPgM>$V*g4KD7_4w_0c{wSr{9C!Y+ zMSN|zSNEptw_83Q82ZC8t6Ny1kX5wSk(cZHg;Uv+zE-AJ_HU~=mQ01Ai&trKjnS{qSamRwf)3)gE|6{4iedZBm^D&dnllotg zP&Nv&l>H=fo6#N9(hKwuYZC%JAjcg;C5MTbWClFDcQ180i1PAY32!FlNkfMw;x{nE<#t*l&}ToG^{ybQW(Isx zJ72whOB6H(eNlEAZF#7%{Xi_$AZ3QM=GUcVWy=8vL!TAb^>zsH57PY6V-!^l)E$1+ z4Wxd;j!Qnx+qd&T5a4FSou_#kXu__JyLVjx?$W7%D;^tGD+FA|dU`BVUw2Nmf@m}_ zF(Du$2dxp9^5rlgd~fos+7Bd%$k~~5S2y56nm8+S*L>klg%Q@i{IRBxg{38ga&=JS zV_T?4O!7F6i^MbEJ3Xry`xkjt4*yvbPX7Q>CrX`66^LT)oERG-!W7BAZ-B5nyz9=P zghBEOSXo&qG1y;p9Hb6_gOakh}w6RykBnkPecnMRG=fF}!D4ZL+ELlZJSV!tKctA)8NruY{=g(&Y zXd|XXfE8#G#d#yftsLDF5MV zvK1qq76!~+KV*;?E{SL8DWF1C0>-IjJ%RqePBv(MMOX;@t9P)we z$c;hykGDZon>aH&S~>=jE34hB3W&}S8&%O_Y@!JJ?CJej_2MqdAmFJdJihklcyEq7EX=tegSg|kC*1?F68=eiR6n78^$Djf?F#J9;e0n*x zwSu6`(8?sDW$zn7r(p_Q1rQ2$CpwBhk!%t$4(Bwo;>P^0ps(ux*rvp3`Z{srGKW_; z6RqcA{9*xpB1W;81i=>!S|VyaiZs4LLv+rvpuZ(dYHq6%uG z(52$^&{5*SWYxegsa$#PH#7$@7x>$%{yUHPVm6eL4;H6k6Z*gZ>wC0V04akM4#*gG zLqh2g)SZGB9+x969XPeqXBCI|_jl$XfK5|cQgY_@K0s+UzS|4YjU#Rf`H$e6V-A11 zz5w=#wTqX#+mG&+NE+1BswgyDX_Sx zd;ZNR~UFFx_ zTsiN$>e~Z7OI)dyVtag__59iul-8_2zpU&M~ z9=lRZO~1XcSb?qg(ByvGt#h1z2mG|;oPO*drxuy{x^Fo#RWFF&ncmE6sES%#72Ioq zUux_5b5HRFZ_0n8bfGr2CiI||)zMZi$Xpvk-fd!YUj*72Tnh+9=LIt6|XfBZs*4a3jv!};b8~u z>MVH&vEDoP-s`0Pl)HH$qG|CCo0K>ljl_Z35%z|9Jq6|G1NcLOHm!KN(N^?ET$#OO z;}1bY?)Oqfr|#x=bG_<%9h!e|^|w%V#R%RvAy%!S`^^8?J}CO|^3ktLcqu3V+NX4_ zBP)^nYlG!T4vBb(lSJY)?w3?_briCJeeR?*MjfC!M&i(xZQd*tH!KeN7tvr?xSJ^^ z4{^1We2u-#%N+82?H6z2@t7hWoa`-`f}ZGrk9&pv&ou?!Gnku92}Mx-<{b;f1^?Me(bhH=oO z@i3HOM=>%qWKRY4kh)H+0UwTH1WRe3#*eU;F<9!I+y94S9l}R@xfh7yAYA#%*A9Jh z0r_H6QvH&HqQjtZHP{)05R>UwHiot<6-+R^+$gU}RyupZGIC*U#O6<16Uc=u+Gn6b z#UX+Mj&g?J9UrXZ`d@aubSBXUk>{S&WoYG|28>)n?1X*C?c1*~vS2sF+oaDTII?`0 zRMhCLMN(O2^LO{6H%h}dk5`7|4MDY0(ukb9_GfK0^kBFYssW=?z7dJyab^%3uneX` z9yrEQJ_WvAMJpsiK9S>+3e*lf{~eg>qI2bJD3%(Wa2t|M(lz#pqyj}nWE}nP`Y_Hx z^yuQqr^QtTF}VSC`D7kIR~I;c@3Z!?srY2jD}=ab$usb!HR%N%5C%X!gT+2C*+3o% zD)sRe68S9v!;XPDwJ;*8b>c8FwrnT3gBX9*rT^>2PK5)?x{K$7nTJZ5p3j4hDqDk| z2LONc8@&|c(TYiK8EoRX2&)qR`Bl>2FChOnO$r8>kW1LS=F;;q6au6H9$6w2u7!V z-fS)2BE6J1WW9aizL#Yz3#%lBnN}Uktlq0F0Wj^@sp>qvw$j#ptSx)lKI>cAy&adAIdO6$_l}SzacL*v$c80+T9-pkO7i%HHZ71B zA2MLxku&NqHT@SZY4M?(Awi=Ye6c1vZ3*lwgY)GA9e>@Powj*r(@T?oy%dw4T%a|t zO02OQ+vRnG+`Ng^%y_hLaER10Z9f){@Kf>LPE34*dUC=R^ipOa3vveD5f}p|t_S=i zu$OjZ{!p@OZ`Hn?0Z*18@jAKZoLJ#O~yX3zf z{Y56<379g$b0}O(<1NaLO&tY%Lmto);rSuDXb{YtiPV_vvbmPfxi`}e@CK#Y&T;37GqAP|F4;DxdB~*G6rtp?`KbO z1Kl|bS}^uhQIT*Y{S+=q&)#BaZLI}5P#r4N!wggMQ^}b zQzmLOmrZMdo}anq489Xvc!cNSx6Jx_Jbv?I6M{w;2lCUOlyP+oMi;Uva-2OYQ70#S z2LB2g%4JiG8eroK*)muzr!!cbM?a3@MFthIXlTscZASH(ksknb9tezF(7ORVczWcEaz zU++5oUoAy!r6}&s>ajJBLFyp|I0u^mSNm(99xy`nMmlU-(I}E3SGhR-f?bea(%Ts@ z7Q4lHz-)yv=jZSLjH$gf5@}g0-(N|my20D=QKbpEOifcQq~qhno@gG6TY~$PHwrhX zu07TQWM#uW!2`u?fRM#No>D!=zU>Gc(}Q{jUYgjw{g{~o#!UyNVXp8Yvr32LO|nl{ zoGi6dm)$J9r1nG`zuAMmPXiTr+MirG(RM?<$LWv+Yrt5w_m|{HVUMq{3(Z&Szth*H ze)98h$f|JV&9~ZcNEykA)TRR8CUyF)*DrM`fdCi*L-aJzaDqe$68Wz%ykt2ALV_qH zHMX9)S0J5vG8yBp#g(xWTBbkie|SQ|z7X^nG`H<*Sv6wkwN-k+$_`RpwZ9UMA_Txv zXqs4l9;yA@R4ItZc+I-}okQ!FD(k!!KYxCge@=J^kl*AH!c@YpKO z;rQl*Gg||#UtZMUd_Pax>bu(S9$)nby9BaRo~=`sjp*wN3QO>H@#E1Hj$OY{)s>qN zV|0Rg<`WVg&+F3REmQ_G3?#zj=us_V8{n~Y>dDp10&!3-`?8{7vp4-@SPzsG~UvbdqP+k-$m z7Hezr2Eb4UOc3d0ZLeAb_(}GNOP{8sr}=E=E-Z)g8*YJp3V7?u$!? z3?LL6g$+=BLR4J_VgV9(W89T%Z~^b_-_Wa?mwdmk4}E&6%}Kll6#AtenK0J7Wk3g= zmz;;xCg{(>0|4yC<%Em8iV*)qZ2jfF!xs20zJ3Tp{&@`Jr^el=?a=2dL?=THs%j$1 zAMIevk1$<;{8GG)WeO-+;lwjBGK5DD4l$clJ)BG(HVcJYxs{cvfcS75qQ#e&E-JeB z`0?M5GLXkba0U`S&<4@1u5NBXG`I+4$dIux0veZK@fqp!WOaZ7|6PX?Ctd_vaZAhf zIAmj3&dSS^;B>ISCw}-4+a8Jv7UcP`eEtlkk1XuBda;!S36fJRJZ|rQ2yPJ7DV|%zBhK@`WSEV)N zNjUvtYEllBpZimzkFVO$`>@ppzPUP`%UI8^U$}W-&@xZ2qB1PwNr16XU1+FZ3UlS- z<8Fq!gX>lYO4P6D3|qQXt|-bYxFYxd!~14i_c;#bU+Iq43G#56DU@q2`1?tuK;Fye zvx+ieGK2qlCG~a|mfgi{8lq8K&DB*8N^s0SDB!@aCwOH!M-K|;aF6_YS?Jo?tGAh4k~hC`Y0#SY(Ho=Guv5ME!Btnd zFE`2Zs=w*X4>{H6@MK`ALQ8S?#{YiwI-U;ehqy-h<1dYB`1A)jW*+Pw{@TskziwAy zw%OwoJUevrJePZ$H#{zCFfq!y(I!}0%N)96uJ@A8ur^cOoF*>G+qnjdGKYeK%B@2( zZy2^LeJ^51&$0NWo^eH4NL^e{e8*g__O&U~w#b`ArlO2RrnnOVWKi)D`aJgTTpZ=x z++96x3~o=8A2lZ-oNVGGG^UACiglw*1b7|FG0c8cxh3*!wA#4gIAbhLj(Ln`5BEt}Fm^8+JyqG#eOfseqN%4|rQUYabujwj+ zBa9$C?piyw8h2u^Dq3EOIrphShRzU_e)vT9pxnEB?AIPzQjnVtZ`f;)rn1O!gecL< znuKeY4%?H9^Hc0W3PZ`V^PCuMP=K#$?arPO8=jBKk6%-PBTzg;%>Z;XW z?^_aCO;|eUz$DFwX^r2Z~_br|KK432WP1#$qs5iBph_A}_A8Os6U^Cc5858B)gZ8c z+Gr#a>;b{kJSOD)KyjSv3_X9}jo)e*Mn%^L>5rPhWy*0>dhACMmF3Qzn@AdueOR2C z;z=Bp3BGbJg()6Few%WaIneFn93VN$54v~yMS&Xv@eRpvgF0&Oi~7^aFi&AqBK=d~pupyew)2!tsrqRA?l-_SYzDTr*x))7@QLLVG(c2N;1 zW3-xX?(Py$;n?yk-uS7q=ixY@H%Y2ll}uMrzda^!^6!(^0>l-}Vg zPAqz|=!5Iibrs8+3Qh_?e4&0iT;qwVM^x$Eh%1JtBX*8^*=%)BQ}446|BzRFHL}e_ z=5#X?U-SldNo8&<9M%{2JU`*=X}{fLj``qji-bQac_yp8jf;P;{VjN^VsE5{(1kb3 zhvoVvILtCeu{t50_& z+myPe;Df1eTV9rhF72_Cco63>_d4s&6HT%iwukx@niQXW7)e&$=hpI6IetmKhlwD$1aJ-{DnNQ08&~9#iq@wNA59kLY7x)my59Tij(CKm^oRM}$!C%KfBXi; z`erRW_Ho;Lb&uv$lNNXW-s-Lx9*)wXT$N=@8wMu|KO@Wo$qclt(uGOM1w>FmrAyQf z*;Ns^M#02@_O=6%a=nTb6HyarwGpzl``e$-C?i7(t2ZXn9S2fs0a|mRnmZp03(J?k zFw`ItwIsIjGm#S>L6xo`CZN6WZFQ^PEDSzLp<)bfZ==^rh*Ij zGg6YrU^IoYg5pLYJVas;@|1{J+gCTn3P}nDHWNujYCah3R*O)I1vxiKGLv=ii5tO_ zwBm(@u`<+2IBv@=Tl7(r&RsqF2d(az>K=|LM*#qm>~X&)-s&kdHl*`p{PX4BM%;}# zavV3NetjD5Eu70>7MJDOvkx7lpm);YFDlun3wbvpq@)4G0 zN-IHCh=U=o4h>O&-xSLZt<~U$PJBA@=`ab+iI}A{1KG2IiFlPW{%;nNK8C_TAnhDZ zHISk#3Y4tabH?DN?FROPjjrmc&unClQwT{iKq#WSCiU4ehC@uj!C5_5y>38t@%9)4mHiIfj$r zBoX#4ymPfitYWfT2FCwD4uS;@>lj3aAP&Wu+lvtkh-(7;GddygX0TYIh=tt{W$~wP zNZ&OyVuWR4Nkh4eQXk(v8Xmr8B?IgkSin&sW2OWSzyfP9G#zZrNJJmPps4{ACm;Yb z@K7ja@BoYoF@UKBOgbZd#P3GfDX}wP{Go<8^YrWC*}w*HWF;js`9RwN z@Ooq>gVi1Q_Je2!Q06!Rw)^z%!MQWXqVLg<&M*P{5u@DbIdB@!GlV$EcR6P; zxKQ8iviTUMgXW`T1XaYo0ypq_F(o6|NAP~=a`2HAZsCJ~>;T~i)Y;h<4z-2hLnG1~ zk}4DDjL$ZYPdj8%P@%4S=ldTit->14AAA?P=Z5f`*jwE(i<14GuK6&$#NS*qS@Wyf z)e5$?(S6ny7ynS{yxk!#Qmn>qoF1a3VQ{@Py+1l?B7UJX>jcx$y0HM42bE$!qiwg? zo@BcD&R8Z~&ends@6$ z1t+?%6^(QlS>k_GTl}Wn^7a(V8*;`SFIfenSf+mzz0m&GEVC7y*Mn+n6K>bp3x2Kl zzkf&Z&3bjwvfIqF1<$n0{;|;cO|{Q^$v6iVmvs+Rbz*kNY*u`GaC>~&Qk8V}95L&8 zXI~vu6m@@+)%Y@uHHu~L)|Kh((eCM6cQ$suoyo`4pK9vTlxyeS_rlb?RPR9rcg*uh zE5#d&wtID}OC-s1b8J=~>*$xy&FsvZ^J8*IMUXYWP4QI5mrxf3=qA**|#uZ32EV=N=Dh9{b82*Iom`0!0IKI3=QP!u6+k z{R{7l$-9R%cbwCYbAc~=^=QLPTJAu~cy&mhLi&;Lyj;xeN@Zk8QL4pMXDME;#G3N3x zln45V^&xd5lzEjNSS^!eH@!iywmpQj!m-Y_03D1l3K7#pO?sgm6lVss;)#ENKA_=e z)5d~Cg3n~Aff!hmmt2@b{MoacfLA>Op$JzW6zvCr57H`#(v%<^tj?U#!x_uZEq8~i3O#>^C- zYPf5)cGT#d!jeC|7yEL_^QcASs^mNJ?$DBnlAq1Vv^*+(V3%|<3&&*q=%8qa_R8Om zjo~315<1@&eBaj~I}w53vOiMyR(N>7e<0H|blJPj0&?d<_#MroJ%gE?`DSZbX+Df& zbv-H?8klD$q-zuud{K=ay5q#M2^;YfWxTGDJXbY2^o%pk2f1-akLUQ^&*n)r~x+T>pJO!tU%je=7T#(o8(YNc@DnmT>IlBoGeEu6 zWjmmAL??=G6^qc{R=+e%?ZWs)7^6U>fK+z6o3(-p7rOaCA5-QU$_7whUy`9@Ld#1t zPAIDtw?LM6+d@j%N3{_Q6AOHJh&iBA3pW6)T$&#%daE%y64VFY7!4LBs~E!I=71`V z%E$Gj#zMI=NU5#BZ27FM7ixG4lel=yFDn@XI!`0MOBneEj6NzMGxHYO@=e5z(QCuY zB9U(FQ->xMWolmFkkE^4WN5;w11Jpsm)#Ho(F|Zjm9|p!EpB2UfWA<=3Ntc3DOE&= zjkL}o+!TVbazuf|$`oXRX0cQudZgqUBjXIFXS7_@_0#exNzyhLzG=WCVq+7r(L)M- zQe;hrCwfZMu^c$y{*NxmqXN}KbN#raH8f7$T6XOuSTvA-u$YTWN(KY-C_`K_W{chh zvJ7jbm^2WJJtZ})?WbdFMMG-{SP>{5LNh8Vl99~9C(ir~ z?sY7^*d0i}1~hU7Qpn_%EWwHaIn%GB*lH|{_V$AhAmJ8j5!}_N(3Cjw&>CXZF_sFf zx-ixVEO+D^#PE-MO92fjBC%^dPC_zcAu0eB4w@~+qd$)V1Or93Y(Fr6W2yogbqjFX zG_JV7?Moh3F%k~68yOiQc#D2U|Lhfb#7T@#OT3P)w$*l@!2Mp!phTm!g8J*TCzqW6 zYs)&FvOB75;X3zIHx=ynUX;?xan@|qiVJV;BTV<*N7T(=k2*26h!uSoBt8jvPCG*t+R!RQ$ zPvPf#*xvKCxd%FSi&+JjaV*SZ+B{D^c%p(cq)9epL1TNKE>ke;g)e!o>yZ$O3N3fj zSuFq}c-ePoFyx^Wqxie3=K;~4yR*Dm*Fwk54I&TKzB42OGZUl{IzVi^%f$VuP?g0RA`TJhf2Yx#IVhCt`OPNAF{IH)fmCFkXLPCvj zuTRpzE_5R#zyW%+&8v|G<+l$xIDBf}U4q^c7$U`>!E{NpuW9ZVfVIFL+DW z+HrK!8R>2t_hHxdC1%d`Be-llk%AcLpMZWa-TJ$59}qP4bF%9g1`p6p4>uRh(ZVOs z%R2gf7_~&Lvx^Hx!ry|ys}+FayG#E*N0GWgFnm$qW5D+|jrtSZOzo%Ias8ij6GW1d z@Z4#(QjAo3ix)#_>V$J;lNwqw^2HbVODacy`k`8e-77-|`yz&*3PS5P8HiE=`%0>F zf=b|oSFN>`6^&h>fISEmq2q@hMTd<`8VxVjv))YZprlalAU;M+M?>cS@?VXYc?iJ(CXb7zY9!mzkLL8L%JFFjuTDV zQQ22C8v>Wk{E=8A@Kq+Iwe{y|owajU+Xg*-c=NkWazL{fZ`SRMJ9Echebkea{5285 z8*SHJ6BZz!CNP>anxHc^bG5C+E}Y$`;WBe=8b!tTsn+woCPxJ|48K=r!(1uTOs zNl6j=L`FP&C;9Y_?|tbv`R3A)`sq#P%=-F58zb%3o7|UDws2H!>h5Q9{c^wKMf9%z zZm*sUI))Urg+f`c(g88EP-c6mThlwLx$e*t3pf zKiiLu5)Ocf=(IDG)(!x!5d|CtMotciPTfRYLkB9PPRM+3L)J>1IJ8{Z5LcjJBtnc2 z7;fjQj-(pQb*7;>6!Zz~8e~N>ghihfr#>qRM{x&{!s^bxqe*ALxA%UfNnE|&TUUKCWS)E3co}g+Zmr^Md%M?cy!i}`gc!pTRSOx}#JSkpw zXf;SAhRaWw1Px@Q#A@~K0;J18OhnsH$58CtE3Cp| z?;}^~0g4Gc>)9@S)Pe|P$^%+~q6zjl&Y8WcSYbg)S`dTG*$hVg#iv4qOdz-dq$6^^ zFM4%zXzKGlWg~VdD#Fz`$_&6{C|TM_=QZCMwzC0xFGAA2P=4=x=00 zP$5J@4gyec;}%)728hEK$VUxnIbX4voaXWXPC-c_iD}SFIMUGdsb(9?IjIR7oqHYH z!B$pc2m7SA`E(e+mp*p6wSdKJf8EdPnwwRP?k7g*oGv}V!LM*EZ8$hPzmz94m``-x z#)gue>zz#2SR^ZLekFo&ctq&WXHi_D3jZ=(#*)`E2cqGf%z; z2ri6z@%HtnmWNlg8f9lB+Vn)#E+lpS(a|myL3c#Lpf&@iuVzUwq0ws;y8%G<-a`Ujf|b z3P2sU*A6bFWte6cV%{U&3j-6MtG%;)as3$?%JJzKMREsWd+$tB-UZ(f8#7uK>_Px2 zV3!4vy>_iA-ln6{1N?Yxi6!QMF+#Smv-?8-H$upjJfdTKX~;C(NJws+1xxp<7o%t0Hay^xdK#NWvts3`) z0mD>;o`ZGmlOVtJEC#eSX*HvWI z#0XjzE#MYNKCze6vY&av%4fo0EH5(RyP(chF`4f@!!*W+`v<|t;T8auhVF3aK0-tuz% z-o}$={`0Mv%|5c_*e~Th9d(?wWra*s-0*zC9Wg7fp;&#|WZ*9)srzdmZ)^_AyV^LZUil4YNec8)7N}}&DPmqWRrJ3{Zv2i$)xl8p zf?A`P3(BPU_3g!Ov?0W)0RmA%k?`mBZ##&)J5)cuhH%ig_?PGt7`4E;3 z$y^}-a_o+e5vEAsxj^Y)?L&JdZ^V_j04WPT&;E3NWU5q>Q?KtJ@ z!4v-J8)cpx9gE&cDJ5WzU`kxPrskO^DUK=I2xvYmZa8=q3|*m!fTKV9U(gU0B6tG= z;FqOKdjiP)ZRC#BVC#nV%LS2s!b_~JCx3st(Uq$gO$mMrF@YT5Gz5D6Rf_W1-cjLM zK-GO5c6RTVHCPcsxPkH#zzYbKh+!yy8JH+wO?iAqbRD(BwP+3ZzccAOK(ZrtM6nzwR_lW&Loupt}#tgt0j4QR3uU@}SumCWOo*k1{ka$eV*Zc}L z>tGl`5s-|NiwX}Z9m1EP{wAj{Vxfn@LSpe?K&i;#d*e#EoOyr0Fk}>TW>1}JADhk* zVZZ_R?qKF2$dDY!p1@OMW!T<_r^-;pO;41UMhBLofyzd{FiVF%1fX_eDzI|{_p)IV zC%hNPi!DC`{Y4BR;`z`DAy6BO;0E9(T;b<37fc1YU%cldp;jJ|kl1`PD*VD1`M~q< z4vOr&Xtr{Rj#G(YNSxDot;KJwdCi7fZ{@MfzG4I!{K{BCt;FSJLE%e|$ORgIvy^bZ zkg|B5?EEo}=Y|S4_U0?g!|r*j1xke{%%5vHY-wOFyIEz8U1#o1g-%Inh3Beg*L`i~ z&eF5?QehSCSZLeWJpRjXM)a<#rJwg1+vJ&ybOOypRO?gh0W{CkbNA^3{Ai(;P;Im3D?JxMU{GY828ojdS|tqj zwB2ieECgbjjGGzFQiMl85z35bmb=^`409X&$$9_zCJ2A-0AxXyRp<$jf2Oqit}xIw z%DEwE0Zs;7A_Siz;%J2kO%+A6b+no0Ad)*=9@0TL$`eS*N3o?)oOw~AtQ7GpU7!Zck;KrVCrryjzqs_PV_G1H zbg()dIn%!+z<^}%-FE;0gpjg+HF8QraqFYpZ6-ZC6uAtzfRthQ38e<~yZXR3NfqoX zgdKnpSZ$)wUrC@3;R#TtY?v+vR_vg7Pp~7Kz<^_HFY+q^2?FoK^!VBmgza;Qi$_9F zexfOdTCP9z{CGI@Q{!8lndtwn+gQb98qcw`*`YBrX4A%-nkqSBbxfh_4Gg51az-N| z4xcC26m2#k%zIJ(MuhD{zSO=u>xM>oRZd9o#acu4%2uZ{*kUL)#0$N+mlJ!WF5rt) zF}tHYugyhgt1C1Vj)Dm%5<@!rvFZ(he`M#EnN^k<$}wFwo5;L#NcsJDyA8{pw*>B+ zKP1zaz4TE7(^=XPEB+-aU!P!c59#r!^N_wKOhW8WH>R{0f@+;j7Di+RvH0`G)KU0T zl8t5DJUpOQ!A_zFME|-pFS`YHqpgrZASVyg6R`)ik3f(@<_^px*pHML$&djvbafB{ z;nIi7SbxdC6ysTJluiRlDJ36_`DrEsjX=%^qhzFO8hIg+;UWPMfRZf`MRy0m;sWY> z1rQ;Ofsm&G2TZHW-}+IF2~9bwVO$d*Ny$p|0o?)kER^m?E^^$G{Ot>xV}|kyiWchw z>}{toy(9}qTYlie&{?by#=Zsb+`UX>-m#IKL$~jM7Sc>XI3l;jRF$FiPAw|(U2c+u zJ|vkJ*w}7{ZhRbUEci$il$M32(u#_6dsUGgfF4OQq=6yRLkfL(v$sH0L-A-jG~YbJ zYe)`$Oc8qLm!(Qq)j6*(J>Hf>%5KfodSdTLCf@kAFU0wToeFk-P!2@mvKdg0 z3#;jgO&I93xs|%J>1!Kv4p`zT1J)B+f)_H(j6625&rU_fv^f4zn7L(~lUyw;dpWz1 zXs`Zal46egt;Sa|{h{=44UJ(0rEUp0p2PEkID- zK6w88E`}XdW1JLVBuz+apw{1i5nn9H$6crO;jyXs2B+2e6!GPUwWAt&#DEZ+agouR z$KlP6VoGO{u?$rW0#Jv7f(M%c3>bT%O=>H4#wP!_r^AP$huQ`;Z;Uc7irIJEmNQx3YztfhF2vU3(V)fI(aeA zC-GF0#nap#{*zza0@pmcpBgLaq}`VN$K2c9lP`yF+i*AhGz|H?@%^MOm-INlQpfB} zlX+h_d|A-;&F=^POb*RT55l&|FJ-y`XtCewyR@FIBuN3W=cIIl{fwpp0NbrMfLaY^ zQL9T*o2`eH6=?slDVUyNP2m1R!ikDmJ}ng zDm6!SLlvu-T)OS(I_ znC5IY%~ub~k~q@n9g;YDuh-mS_ODF0-Og8XUS41MWAaPRmdiV?2Yf}b_Rs%}tSXuN z@88g$UU(mQ_g|0s`@!F1N7n!Mrx*7f+V*0F=+LT8B~B}AXXxRvzZ5LzoQXN<2(Luz zd>QT!@>gLvr`;tGfumg)Q9&XYCJp#D$SEk_XIWd5nG7S#uG$e8bq#3xKQE^F44g)~ z+8%z44+E!RW|8m^YCez;EEFR}D)wu5?NIc<+(Bqn zOslZr6X%M7VHCj&viN8DaPy%wMt%t;iC01OjDV-2qQLDS7r>!FE#zdofvs^En^@So7{Yc)fpMwmKp|LAaF4uFxYORP! ztMbS3Qjt4eC<@~sX8J`&MDFNql@%+&gz2c}bzo-jQpFd_Vu*3wi(z|`x zT>G?nP8bNgCC|xB*17yC6>mNlCM94%?NyC59u7y`X-&OWZml3Ao08pNF7{Vcs*Ba){lLOiXmyX(U?Q=$KO4F4h%@gVK^?S~TE4`uOa zN1sTm~(9XBC4VywuT zPV~+-l+CoAD6F1y`sC0ga=fq^zD_@k>SWAckunTC^$}h6n!|sMQobBgf5*CtK4ry? zErrMdV&}A05VMoRL z@JHjDc?R~75xDmEzc3bNojD)5{yI8xu%;lkPs&h&n{AptuuUB{>{UgYk1!XdR0Ea8 z!Pur^-kz_eHRiz}-4U}XDHIxT2OAtT_zI_?FN9A^hGb{DWq?%0Z}3Hn8S+BX2;js~{p%XSevAh|1y*We`$${J+4)# zNBzE|m~!>?43)EIkGn|3#FyH=6tH7ytyfVOu)ovM=ssxao%@}2v5^s5h$`nrgT$2I z9f1l_C7b8Dx#vQ(4etrADOYHO!$R&)&2%rW>In)_eJ56HXOg!*e%Ivj?0q~&&Wp?w zT0;}X(z{xOisiv4XAwZ@h5_3=xk zdt>P!D&|}jFfhPL(#_i7G4m>`!96jq_lqASaE07&OjQv*I%h*nNA6m0&Pzd#I~S&8 z%y=m5bCF+bUVHaqxxZ4(FFfR#Z@W#7JrPmF=PFOQTRS(K&Td|oYT!wyd$_CJc#)c! zj-i=@12IVX;;xu}*ydYLkE=P)6XL&CKLTTaL50jYs53#nr~=HvF@d4iLzz7 zyd6KS>v%3XF03yzx?d~j_%0NuHB!TU@A=K<8XsCzJ~-yR;%8JQ>z=MFmTTLxInw30 zn(VCN&>Io-D7A*guI!UGc@<)hoiBd*z7niyDI}7p*lB7E&3=R00P!xo5Cg0__(2S8 z1JMCsjjzBTOaoMq)%gr-{d!>!Zj0J4Brq1pZF zJrt#g3T=U{0cgofP<|BTNy5R?Z<%raVC z0Hh=}!B{$)LIVj9a2U$s?e1QOh9ALtgcDJE4JE8<4skvY95VOPlJ=P662ttqGdX|EHfkG$%pMc4E1L9Mb zpqQs#iXD0o;7MqMXeJ9dP8tb^LX6l8z*cvV(nmpo(`N{qAmyF9UrkI-)@{Nz>W{tz z9}i0_<_Q4h&PH$GJM!T}9-tujL+(9&dK;ZtJ7Rx!(-C39HF|;}2wYI3k>MLXII@+b z5$btmS34I<7DBl8-T0-xV7o65D&ha}Jmf%HKteI}bTs9WeBiL>Am+pKKi&Wr7Gs4r zgSA6bm|%1WPVVMFHGqUEx+cJ%wL`UI44pDi4a%}cKH)!?9!4?H*dQcM><3havCPI* zC}08g>fzFZ3Y%eHcXEo)$S~4@(E)5POvUAhP^ED+m{-_^xLFF}?FTe2w{)p9nhrdG zqP*#dQ6F!DDYktNj6IM(A~A^ZwQ(&X0pv3pT8^xa4PxB(_)19e2M(BAHsGS6+y#E( zgS-$%Sx!mbr1rx@fnsBurLBT>;7lkI2>v6Z32sXq0>%+1!siY(w4GfP4Oq3y=a#i!z1A5{fVEv^XQ-cU-V= zKnPC3?zoz9o*0hA5N=dveItk$OTaw)3|l6ICb#CiVxKc!ZI-un!e^iFVG{d2#gbnLlK7Z3A!?9?nwHIL8JfsaYIGL zB|2;<9T2^R`i``5n50UxNzVLz=J5gk`=vE~My4fN_%kMBf~x?pDGNUWR^|;b%Q2+x zkiNji+W!&7*rqTCCAWK0w2&JbqB=wYT&9o&+Z=8|VC657FptVG6dxGViB6(|E&SjS7&YmC%RtBh@uupE(KQ-{Z>p?|e_PotY*qP6rygnq$*_!A6 zFy^Vsji3kz-aV1otb9g`b5GX3mUWWe*SN}?byKJg3SdwI0HIOapHYkanIj}u`)s}D z9^T2CPeZ3Qg9}eySJhHGtFp$((j)DGcIX^O;mMj{16M20T|ZCqs_Sy*D#v7B4hq)K z91VboqEmLu=mq}GYk&SxFBtq6S5m46PsMw#HqCKvYmv51XY@lKhWK}9SC*YjbheHt zmQ7g2=4vHZ9l$F6V3qRRHrI=n@<1IHvA$@K+M_mi?ZCM<*TUw#4qJ7Hf^+)3f)C8p zt2)fK+eBjRmeEN5#nGPa^X@uY99{P5u&m0E{ArJ?v&Uvhyql%(wXt5zuivj=vafWx zJ8yphui4LJp>t_YT}?sSlO97}lg%Gg=ko5km|u1=B&yBaxK?KN>}Pg1zeZgK{kHAgbLvw5Op{CszY(pH(mHHo!Vl;ij|MZUb(T60KpHX?#KfyPC%Qx5LYRHyZ=IU&1uivV$DHX4N>UV4P z;ypsjw`H27H}QB5$2nAZ4bE9s((!Wqq>rc2+a}THk^V{>c6mrc7o-}S(V}L{|9}7X z)}0w+o;%^L^kkLN)=Hk9qG5p{Da8`6{t35GwZI23A&3?WXI49%KRn~1`+wxH) z<#d9xf<@E20FHxwYEC^PBQ$mp0)9eoUE#-q4U*>bB7l)b0bks_WD{oIU`N1)1zVUl zswrH;a9?`2&fkL0h>VTEj$uY20U-9N!{7dFRpR`++M}HZ5)vAj3(^HLRffP2vy}*N z#rBnk(RHXJ2k=%ip=W}?l?pSG&Ytmm$xizlgeTZhe}Z~n^6UH8A;dh=#6btx%&5M= zQKAT=Wd2D&N?zBVkxZTr-@14+Suu(Fro2o*V)Ry2zX9C_%mTlu|K#gaB=aX1F3ee^ zK!%h_T8i+L+gU4;@EONQrbZrQfZS&w<|l~wuGWveyif&Wf(D4)-sjJ0A{sVyY-`}% zDL^Zu0P(!!B)WA<@hxxMH!>7k#s;#FcR;f)Fk2! zUy!6oTshJTaVEeMO&8z|#EwGicM~oLeVi*Yl|e3nZvE&)v#8@$JJKo1DJU=oec|Y! zl`_MHhP{EDE!d>Na*-O;Z&Zv%RY8sY79$!l8yC_a=m{J#S%mz7RE3dkzVP0YW?+IM9hll^#N*e8m=p=>!8l zHQ@4HK#u|ZC*>Vy^8iMV$AytLm5pN{RxBv zgR};5N$$d22N-v+;4A_b!K;#Bh4OrGa}cANp|lYeyj1VNf|ogi%g9MVnI6l+| z_^f*7G(nz*$H5aXhEZ|c$l2^2riomLNR>3?1*3$#PR;o!^L%QMgheO8cRLwqs1(JE z0J=wxZBWSw=pFE1?6^%FTBGLUtVtRAj{o=t9T`pq-pVi$Z;Xi9T~+<$cVdT<4c?=D zN5_S58lU0Bz}gNVspI28d=04J5v?E^-V8*XJeG(jgjf&f9t)yBt_v6`=-0NX;KB%6 zL#>B1_w5I2a-3znAWByOR(wlf_wf_u!DJ(7hTIf5QMHfvs^eH8q^|-*?qu8c2?Q;W zUGf|K=eG`FQv!HFT>{9o^l)F2yt>@tPr(C6UqaOX}L>fqZ#e+_{Qo~}(D0g_&?Ju{^Q2wKp= zK7P+=EjH^k$@88qztvuUw6x8ULuQ$yx%Z;U^8J&#X)-lI?^#yZDD{Xe%T^l5&+F`X zTDLOrj96*okWF>qjDs`M4*1R9r$5wkGDTWf;ar;eU&4nv18?h|Ry&isj$M3<2$xom z)u|>+A@z9K?9%Gvk~y>w|+~fa=y2M!q(&4M@u(E&6X*1HCH|`Sw4BhS;VN(uddp! z?a7Y{x!@=Ai5f{syabwH&rj z6|z^XpEt`&qY+pQ&?Ogd8|_Rywo~l zO+WXq+deBCzo1gwu+hK4e)7|j4oeP!Pb_`=oi(M!N-R{D8r=R%toYZY&19Nw>qYk7 z(Yv!%?tU7W$7AfjQ0Qk3TkO2cI`SF`ZAGyiHl|TkG~)F4{BkJ+co%^i(=*#FF_j0F1|lI-+CDZ z8W&DfN-)hxaec1on=foB*xpozhl=jWtG1Vj=AS?B+34ZL<9r1E?nxspCLjWMCZh`lLCJw?gv>L%Az%*8n9n;C#8Fc{->y@Qp$MMO@Em$xG zU{IvVHD9{dlNgtxwmre>p>YHnh31J~7IO>;L8G}|Xz8dP!%#!CzZP4zv?GhN8p2%~ zWr(mS)DYwnA}8_G&#tL%*ypHo2IfHOR>)@Spr9|sm}N@Oe183K4M-=*SqE@DG$8`c zZ_EJl1BGCSoIlt*NQhKNc6>?#wXo1ZkOYlRqk)i!8GTdQE;2N0?Zga{(4t#!XS~~8 znhr!!o&9)XA@ltjCsog;kjDWpVFlqo~O(o|3`Cds6U#xwDg9s0 ze0$)nvY2&%OS0+;63fYhhFoyKfHdEm#u*@$%nKIHQM^A*|4i*E|f0O*dyl8FAbdZp_&-{WFx|ACtDSdHbT>beHv1_ zU8w4?#gSMPuC0UDXnrbr)f!bzX#1HAq|rWKDXpm|E#U*3BgC9=QTU_>1&=hwa{cAaSkQsIfUfAluYyp|{tU^7s zVm@O49iygV$BtYDkO-rbv3aA52uPG-M`f`H8!?ElR?P7NKm@G~CSxF@P*Ye6i7Yf? z2DdT})A{}V3t1d`<_4%ie3P6Pf_Y?2fUct0bvAL$`8sTH)(v;Klqb-UB5n-ki~={z z%RsdTaeNkZ=%`6veA36~l`;f~1?8`*No~!xWsr14z#k%Om>4g`PG=Iaj&~Tx504U< zOms%L9OJSC`87+{t!mGn zimngkw$t(t^b4)u9;+kOk}!FUCiu^TQ}uHnuqr;@X-9AU=y&ogDspdwEu@m zXZ^X2HQ~!_t&jKaY%*Bj=KZ)lujXt)`K-C?l|2|+Yi1m4^U!-1episx|$R6JPzRijg^XS-9U*~ly_QLk8L0yDK@iuo)aw$kbcVZyWGxsQL1mF1CX zz4EMKnGEmtx7c{DloxkYN!-`k9Jv00u1S)iPf{1bDbey z5*Hl4&0p1`=8$Hf$^8e@G`!=a6j{_#`k z#zs!}Ft#1@*UZQoU((~f&CkMKFEdFs!G$3pGG&^+gKd`R%vlO2)OS|Ic|27)r5rwZ zXw(Y+ORtHx8RZvCHFxoOuJMNN3T((O`(0Uur~)^K$!_Up%Ua@ zK}zVr@&q2krG42=g32ypoD}y!(1Vn*NCTHP3b;s)kG^AW*K1RK&j)Z$+^~=;&xb2d z%J-Hi+DV%VyY^*4BzU0o8dmiw7|`1^Ip9IO0_}?`4#^4>-a({60ac$7%>f}Y`PQuf zG*jVtj~Oq-zKQNm*G1So9vcvjr=SzgAi1&8j+I^&E4@Z_4K~APq|D=;kH_XyQBd@i zGbGOjz~ztl@+LQo3K>c0MQy~6mTC#_w%K`1ecMT}BTSbpSTcu%_SV#M?%(aEb!da zim<~=qzng0yj>bb@&ot^R6tb_D?Fzr2Pk@^Yel6@L=fd6QZ?JO8NG)?s&Y5tsj!oy z#vJ^Y7%}ZZF>n_^!~jhb3?Ma6WD9oLLL$|OAE`m;5BMT3DsX`C8yrviO#%KG{3EQ( zXhUoju$=A#@SaHn1#h@p`?8opc=~5@NL?6E7$wpL7UNa33k`tS3(kNlM(0UfxI8PU z{v&P!h61t@P(SkuxzZHS^a3@M*Va5m(mcY*bbj%wZd7+HT7aTUa12?>G405tfCmU~ zX|}LZ$TzQF<5+ybr;()c2;@WgAsL(x1(eZZ**yhF62P+Scv;LD45xgd3mV?Cm4jDs z%?cE+M$=fuDnJ#3`^h5ZfI(&szZoTwz;+bVZet>0s)%)v@-@tlvBy?xXY^GsmoRJe zX)4mbu}s!uiy4oH%)z}=+Ox#nv&xgow{$$azCR#RGN71gEfF93u>!%Q&CE5^zwwp$ zh|24!iw?M5)DhX7$X}|~Q5IcXk<3BYnBJ_S#}`sj-Fo!HTceG9sSE+dDd#SG|8>Pl zbylX}vW1*uokqfUk}7)M59(-`jhOHkPYIei@>loFkwshhKdg`bY?Aj!->SZ?ON@Pd zRA2gkzE<%;Ti|D?S=AIbHry=**50oAQHzDkygf@TN?*E3 zNf%t@Wj~i~m;SK+Vx@@a$RC+eY=T$#gHn9j&HYL?hJ<)$I2r%PnXyc+r%(6!%r8p4 zK4Zozxj(K;2C4=eGBIEl9+flr?#N%uJpDmiLrcLXPVQ@TtgkIw)fVqUH~yKQ_baR) z@x?iNReMFZYbi%{-uZ)LmiG~hB_oEIYZ&?;*Fv~I|NH00d5CST!ym}QY7r=h zVl<@aGS83vDGwK;kVx^+qb?7&QIJ*mloOj8oZ zMpy&^1bo$f9N9$uroS7h38@gMKM}l0uxESD{ri;9O0-{!UsHmU`Mx-oW&w;d(sN!4 z+f@X?Q|tqE+p)uAC4?jkFX{*RmRPq2k|GtQ)1t0RC%l_ui=Y99HJ-3bVyNlGt1m{s zp!5QeAqWgyfQ@{q@$bJ`_@sgzR~ers=}u9{WthpvRv}bJX}y%+^@=H_g8uZ8nmQqWK<|zO+7`9~t^>DDTw0nFK#Xi9hlmu!n*$Y4 zOB}_%Y=HuSeuex>`o_?7KBR54umVBK9EH;mnGP1yhUtZnWhx-&wvs?+l{n1hLRk@Z z%LX`3+EMFI$YH*#YF{QK6NwTZT2OK+#7;#xk_Af)1k9D7z8Zv!X~P<30d|lS1VRG|T|hZ_ zqbmX4;8BR9sR0K~Qq*Tz(Z^%pNGV^Ftptni-Y>hqT)tjY3fB7b+{^`4rE6stoh>c6 zy>w$o;Kx<%XU;!Xm}4CqHPp-GnkF3-*S~Dr?#Mt@rRkfbKMe5}s(!JO5SXDQwEq0e z`20&2ZmXm(XtsV4AGF<3eZB6s;;TOXqXX=g7qwq}I66DYf2Bl>bmfGS_$3<+v!p96 zYeU^a4++nc+xzEX{-&w--F6O~dEQv89^WwU^~fRtHnWVp$bpwZQu!%a3WAIq?$H9q z(GOn-7eANw;|m^eTkNsse`xo1<+-OH+Y8&<_}t3SkrHI~@n>W?3OU$!xmY*pnRk{+ zI}6Wx%C+#<#{01kC2K@4e|cXtJv;N_^DPPT-#*PW9JN-dQrg>kPw$+dq{yKMk&jD) zZeB`B7Zc=4bWi0m?#g<-LE!sW|EfUS_LEL**@u(L1rn+sUY%+3Q*L~sL3Mxo5i|BE zeJnmhB+uzNb_^y7NvB{AP~|H^s8`-X9tET?U++J1r0XO>*FXWFxr4V#$t^I6I!YE; zen3+E`${g~V)CRZN2zSdsUT8|>v@|O25#hE^#G9xkVOce#FSPp2fZX%easJ`Yea5) zH*<)XW$a~Z8GnbwbudF<;1Ks0dIl85AOssIKpE=JBDJt^E~OtKDWE+$CFL?omQcwl z%F`zj3f%^A8f3>I%ZY5gG$mANS93jnyx+6{VoF#vsOToi#9$$Xq1911{x#_hmKRDY zKsehT>i{uECm#PA{`CrsQ3_T_LMx@ndpappB&C8CLlv|(up~|Y?|sHZnGzjXL`zSP zh+s7~lzR5<^zeGvQz#!Z7r8+x>FJj!O^PG}VKB9ScW(mN?^U~Lp4v0J$laxVu!Xb` zt7utU;ZZDf0qo1Fxb+Ksi#4!VE1M$5jVX;@bwrMn0*jbTF5Rpd=RDvohCQq;~S|3IbW#q#uAb%1d z5?L+6waAx53$T2su_zlvF$euulLJ-*k!x{TK+MIh%i#X@oy20|TU^wlh$K`jU$7{$ zo4N&1&;}gR2)n}B`t@3H1>sTRt_gtWQPLQ10YLlYO)0)|HKp~Kit;u1(~x$7dD09` zmeu+OU`>!MHVMXeLqj`NC&G>w9Bs5+ANe$p?BE3?j3%bmYXcGnE#$Kb%Y(;Ki5wd~ z5q3!iEo8WyefD3!A6MhvuW9*P*aeZ{eR@f}-#|&Z+bfR53no>c(>L{U?w(`g0tNhM z>`m1@r_wjI@yV-9nPnM~xOG*ib8VsTXEAl2b90|OO`U!I=>ZYzteAj2H?xs`u{UO7 zIvf#=&R{I7|5g4xVQzUW*MS#O>}-P)vtC+g5DYQDgI$071b4^RisPIt!k4LKC#J~IEUah2z%C+g0na*)X6-xLd zvZQ#6mPNL+&P`Znp3%vbUs5e)AGY+T+x1>y|FQQqi!CInilacD^Z^%@)>&~D=ka( zuS?u8>;CSw7Xee+HKBLmgurbG)ia`~VcJ6EVC}da4s$}$@vRbQVpOCXgc`E*8<8S} zY~YIO>SV-fK;jCc(+UGXcXR<)h{fREU^RjRfO^lDXd=e{-04b`+g%sYj4< zZ0HM-l&~1$GR}afU<*+lZ%GAc)lhH@;GRBgDx%R5hYXA4UoglJIm80fY5B9mk}{X* z4~48Lxf;4@d;}JH)e?&i3_RF8_5f|gV6bH(s6s_}QQ^+A6lvyUf+1C{6n)T=Oe|@f!Yo6$ZbR7sRleAL_dYU{rArZy56ty|KXC`*FZV~F?W)jLh?0m zMJmP)iW00e;d^*0(!E;+Bb5+df=c0%kwZ={?SIp872wRxzTKdMm5dc91W4S9`3{Y1 zDp6B-@$%?}FuQ2>%|Q}RXEn3~MXkZ<=*BIFBxYg7Y$x60j+L|nZkqA4iDn)xk z?paf`+dNxj1iY&B-->R!K99RA=W^h%39UQvD<~Lw$90k^JInv*o3F-3pHN z0>M4{<=j9ei`OeDlETa$G*!9gTaw(qRc_^l?_v%DosuV~-c@;CRf%-+l5BO7Du+_@Gj z%d8I5%0DC({_2V40~;-~A%lrSa`7g%FZ);a{W=`=jJ;9B?2o4>+6Lde%03XhQZiCG zZ1&E2^}^_bjhZSd0f&0C-nIypxt{HJ3HaO|l>4SBkiKLe^7RE zfy`}{ks$q}XLIAiM`NVc_0F)?yBca+bZ6?~t~DY0sebDhnYng|e|Y)ie)7Ckr^a;@ z7FQn7vi(@#p?Z9LM!@+sX95@5)Rtb;KjopE_twp}r{R9^k-eTGTkYL89?gogo&CJ$ zTvXt!E0GJ#mo5!%E<9_xvs0=sKWClms@&x@K{cZ{wyfno)?r@AruAU;v=|OkDS;hr z?n#1SN-;wtE-ulE6;5luw8x|!UvVQTseH!D${%ssLsFe>Q#(2~zbq@W$vv{SAzWFf z=lm-%d%fpId%{}_VvBoTXyto_h;F}Q-8A1b zwh-|ZehMB*rP0>KRMC}%hrvtxcn|(fY?y(HzjbE0mG9zGc$TD@nTI$ONF{>}AYID} zw72>$O|g(WS|wk`D*p~Da=$$o551(eEE7&vAL2J3T$FL;Em9m)!Rb&T=?(CC%5Z(X zX1X%4o>z;&oe(AfjwM3@iUq-fB!*1)YQ$Ph)DsfSAR>{?(s4nGMp2Ypxz&e{sulcJ z+rg^tjIy;f?@#xK#gk5lW~m@~;K{~`X0k4Daph6Q_L5Q?2Zi_W#S>C|`SRzRlLRgz zK-Vq>}qeS^)^tk>f1vQZ7RD z6g8ps$7PZGLq0ioZH2GeaWm->UBbfa$9Ezn zypA)U>`bE0YNyu6x;&RQk(p1itarnO!+*Va!9+L?B!Xl_?qFG8 znZJBTZ&>_<50IAZ<%o+YL9dPc6{Sm?6rye60}%F1o%LbB?cK%e1;yqL%JA(;?UtDG zST)m3WO^GYq%g7ahl;e(_4mV*>jJ9Xd%}2M{7_X&?QeeT<5$?o}NrNgJWv{sOpdKYI|%g zwhBU@RBLS@JK~eoBnufNVCFpis=<5)N@tDJn7dWtQm`FZ$dw@s)~6bLOhsQkKGjSX zNl;9cID3e=7KCDBSQ~?#gpgTi&idmRg=n#3KytDWqQmN(n35v#_s7+MGkW}UB4B(` z+L*0^4=8Y2sr5IErH8`1-0%+;<@1_naj<<&thQXFsO??xnCi=w9Z38YMVxY* zu2o?x#m~jhHJ$PfRpKPVDl(Qg9g5JC*d!5_STmrC9z2&50f#dZRe$~h)N}LEqs6rY zy`J&S7y`6cp?!u(dPH|&wkQ0Y_pH|bU68_IU4_^^ZS$*xYEz=_+l$=pUg^u(lx(r& zzI<+-h6CGv1DE0nPT2|LOOLxk9(XJXd%5TNdlX=6-~3 zL9h_WQl}M-dvqQg^x3?Jvj5oHrnaCf=Y9qMc%Eztd@*FU3n7`qWp+?)6FB|#f>$x z7A2Ms^eV4yOFJxbUU$8eUjA9h^lMM1ud_|NZ)cY6A-A|PMkxM^?a-(CkFTCMD)VK@ z#~#c;{Iry1$XLF3*$K5*2{BU zqIU%NEEH5etR9yw`934KZJ*+iEzy693mL5J3$QQUw_R^nc8IBuwa4k79x{g`Gj1GK z&^@U?FtS=Vn^X8nTtvr&@uFF?BL6mudNya9h5oIh(zbGT8Y$t7dk2=p+kb4(w%&MN z%`d*XK*;WOgssw}XUne&#p}x-sMg%^m*rf(EZscS{Wgw?=Uz^&i~Vq6l+SD=S@>bw zZl`Gn9-p)5Jf>5SV)bEl=ZQTVg`K*p6W;#mQ}t0?v${R|hQwW~R+;0)R+`6!1{T?e znkxj>NA}*j5LzGAq8yWXCfNNUsBq4)t}o32g-2n|BXOsE@MAsZ?%>YV3p6&1);et?Kx4#AW14i{Q}2s?pF2qW}8DsO|YP72v_k0)G6CkfdQe3AwqQ0(9X z=}{*FXN>Y1jr6htosia2>Fp^b{6gGT(wzEZ9f2hj&T zT4!0lUv4?dg=OE<85@l=Nf3Z?Km|>Z`T(yf)i{lNAyPHTPorWzfT1P%{h5%UvN-nF zW=QA%{22e!KmJG0KB`SX@*E`pif6!DNJtZEc_AevL`&=evU4ft^Av59|LuM1EYS?A z-asth=5MDXiOK?EXqZ7NBHDv?L5aY$2vnk8CJ)btc&%$=N?dmXbz&jZP=}}>KpzpVFAB#piFWA=0I5J*Z-|e`|%g#o|ZOJa(-Rkj@@wHgOhTrGQ{h0sn=az-v z_*`~JHurfhrK^4NXeo2uJrpr{shu7zk{|Nr#<4SaFMF~pFel=N$iF}C?(>Wf$$<~x zIbCBTH#-dU-K>_-N2iwmdzdHdUUXBQe{Xt3gBz~O%UySJdgfqH%1aM)pLuh}v6-gA zi;7ix9v<9yV#->3=U3SW>-5iv+bgYzRhVf*vtZpKi_JQxzwJKdrM;-TSS!W$f-D?uo-)ws&_|odzzjq&^52q~3 zRvO&&&$o%eG8!i~He^1#v+0*9Xa2Md`8((ER6A}D4i45KHMm`==Qc(O;fg5qOaZ-< zqKv1A$T9aL3LvVFXF zFh^(Gws}agfhBPSW7ZbZhQi0{G|U{D;>aMPs2$>whQqKuN!m6@elXIn7u0N?g|L1~ z1>H$@5Z-^OU@_#FR+XZQST{r#RIAe5@l83qP?FOZyRLAV)lO;~5qhvSI|=(1;z*G) z=bN|x^XcyXM}vwBUn8UftI7uA3q*TSOJg1CR4(F+l~L=zw)f*b7-}SXFjswKFEYy9 z)+zRLy*Oo@XF-KsnT#UfzIrHJ2NzXO;+*^iEUyVyj6W^DIX*LXv@h>iN$tL-zq9?< z8-9_?cG|IMy4S+EdDW$xq?2E)uZ9SAHR8_2kSiF4I&KkSDzA{R_G{?KFCwImV7?K5 zN+<1vgy_AEkM^y=@=crk8)#?|Z3%(YEp(y!u{O8+b}uvh_be=3l{By+Z||MW^m(u! z>7ZooEt-lh(rE_J5RItF($Vs*hB}Xq3b{@Hq*gub2|GiB8*>0Is>2E$>Ew5P>H(!bolDB`+0PiZ0K1wsK$GVx;pZd$Z9uxAf2OdFfm` z;lM@lXBKV6?H~HJD+zl|^wA%wC z&BQpSQj3I|P2fg{JH8WW_T(DcS3s#*O5SdhjQ0rA%A515BunZ z!rIF8#!c^fFWU>fF%n_I)sZGD5!MRn%@2?EqS_Z#6-H)NqKOw1{ksAt`l!beJnlDz z=G)Q&fp@;r%X(N&yUyX<=2H9{Z2W^~b6PV{06+qo*Sa#71FDb}z{dO_y%NSNB7=#> zX@)Z4y{hwS2W}2{#sl-{ayxl#D+}nrn@j(!08I%XZ?6`&3`>XWz}yF#kQ#Sz_ zq|NXi)ChfJgeI_%oXL-+SV&BwhkEeme4K+}zryHCO4hB7i3R@lD@&TRk0%CL%JrYK zUJ!FAmZ_l4a7_HPeb080{Yy4k9|~%8&HnR6iNvCP1zl~1B`X(}W`}m|!bO*MD`=`@@aCXEt;1-AYd_u%8wrTq~Gb)&EpR=9#uwm{?oHPSeKid$QTK zT-q13-QLY=e)x>w7fsr2fBwGnn|99273|KHpS`(~twW8)6WsJJ*Gj5c`0jMwsdH>p z&W2YmCSaYB)RF7IznGc7Ts;5fh|k0tah*52OU2rr8S13{I06F+?}&Jd21>2$rI!}# zT2ft2;H(`O0MDF-B@ANA<;#SNDU$@GMAFG#I`U-Zs#0!RZtxm3&dumMJI~`x9o4;u zrGn|97poL%b4huI&FqI+&^AV1f;tudKs}-gN%cO?x$ApYX;R#`uWV_TpXen>A2`AH z=Dw=r%qSB+I=fVm!sPA28)|sA3ZrIa>!tNy6HsxF#Pv}RgGvVWgMfvFPVHS_{Kfb;We^K(P93mQ<{cz((s3i4OLfuz{ffrv+XY93Tt1del0@ zrVpPi3psDBgR$58m$hR~;z&4<7_*iX^!oMl+b;uva9HY6%w#Xuc75#W5nB?xT`m%S zAiKts-6xt$5;V@i+woA}hEi?Ux{O#~QLQFiOp`UFHPcKO_tC$Yk(lmq_4Wg+Lj;eb z(G|cRP&j@r0Nb!hBK~kJ65Ir9gpS6eOdg$S_H5Xbu7oh1LNrr4dFbKZHPN+I*B@{$ zyc4)$zPa(B;HD#=rDL0P(jC_S*;L|asht^;r0h2Bgl+qs$7$#C7Nz_(T6akGr?u;) zm9BTJt2&0mdS7l=$_}?^JboxUu(|NEwaC_^{WHFn8$9{DY;5YjKRdf$J03W`;>}J0 z=?_<4J9T#AYar0{lZSbD{V0HZ4keN#T!!_Dpk_G1Q5gWb6HocU!tkeP510V< z)K0C2CnR?4&EZ^1af78!&<)l0Ifh6;7BTVEhRjIr#`q!M=Cs{#Y^Y2cFa`7(MlQkT zNNX<^EXE=LF9>EVfD;@AS#vDrSUSjL=9P)8q|-165tJzvq+Bfs0BGI>)Pb?D5Pf4^ z%P?rBbj+`@d%vFU3j8)sc_a<@PKU!PF&rl1Fn)l^J?sfGMjl0809U(W{1QVrgDS1x@j?~TjyGP4Sq>B~#+*Vt7J$tHe3 zzr&!`&TQ2eHv6*f{oEx&#akHQmU)oyy`&({Pa7fifPu%2&x z#oE)_wc(dC6wenUZBBvl6l(i=>hYv`E*h$}>c~4)0v3HZ`M7zo`5lx2q26R`B&-+(i`&Qsyt3 zcRFMl2hc5&;q~a=w6rbZ++4;W-~j-87?)Nch00ny2!Y}lDKcQ$C6(}&v6s0c7-J>i z@IOE)ECPR9MoQQ1KXeGoCQG-OlvGieis#eUul8Wk;~LyNR$vkU)FOpsQdUJgh$4R! zmPw6u;nMk{4QmZ{(MVw}NU0hyutgeON81)W*4mwHTr})S;ZDpR4s!?XWMg&>LX0tL z4PhN(bi(G`hLL&_@I8SJ9>ILNc5O-FP|iK8yW;R5iJVG05%@eG zYy@l8hrlbbTo|XB+(c-{=S~hxE-BbZSuZir;ULOTBnNXL6#yKjD0$Io17xFd^;(C5t30*sxUMmBzE(5hD-Q7{{ih&5&1@G$0aiT*CcagYS(LV zXB@PPZoDFWmyK7O*Wi5kZ4a&3ZLhOmT-3=?^w+;5Z8`$N`JH}|(?iq6WbZj|aX#+8 zFoL&Iw|S!B#(?svE5#0|R8;e%WS@Rhs-x|#IL?Tj7sqTbD{*g=5G--nQnHoz*3<^$ zP+mF3zvCrKEnjioPu-%K$IN?fDHavF@cgFoHqX<%a)wRsldc#a@kRff{y7k@h(Iub z%|Y@2CP)|>#1wT+_P zL(qeYqTob6h0@-%ZJq%zQm|cr{DM-#DaL85?4I)zzO6}|TV2aB-sa|JDnaxj&ZED= z+8dB1w+y*Rjr;2W}6Xi z?Wzi}fDRXBEbgA8h1(dRPj>0TstDIHLR>HoB`je^YXWFRn9`C^jpQ1b4C$Z$egof* z6DPz00}()E&s1jqr#m@=k>AE)ydYCYW6Wjug5)diUEQU_XSGG0KbH6_+KXM`aBUwy z<0ZZH$NS`o#g7-ovRANQ*>TtQ%c0;*$f|QK3l$FDB-AoR9hWYR zTK#v&kq1dmXP3P)*zM6H^|Q2G$vNTvaW%1%;q6L;jVb!-@3U`wKPQ{G(pNv`3Gcxt zDg`yA8B)nF-lXojOQoOXAx4gVN?QaLF|len;r3B!P_jzNIvsPzuCLUSQ9Oby-73o5 z0Z8x+A)t{T-@Izcmjyk6B~031AxR1B-JhvYNG=8xV8Bu&ifbPsvJ|XR3680sVCeeG zU&yD|0Kr3o8OgZToHk>2!edf}p>t5%s=IO*%GAtDJU3T`1D^d+VPEw^z5sS7O{lVN{a0!_mHmJ17&8!w<` zxakif4@JzO%(1(eO`Z2w1jThM#y;>(4oq0d(itf_6 zYiHQOO^UODn@Yk#s8+KdEDgXgaKK%GWs1ca)Hi~^2#|$G6Ml0*HQ11w{p2-YmT#%L1Tfp39G`ze%`j2m1D4ZgBZa|q2#y0q z6?1Qw?vZOn2m zdLuN%fsO;Proo*HR^88~Xggr5R2m2Qlqe6f7vZzphe=8iaGY^2Oh@l!?~#ILYblJl zEmfGNTE0}v@t=#bz%w9pI|*gOD3HooKKXLn-IibyfWnYxArV<=gtwgi5?l#*{0O*V zsZKWb2Sb+y@1x2sz=zg+Ih=qdVwvp-w47jILj>*tsK7)9ai!;o7?3){BR6{e2wuTI z!V$OuHeCo$!xUw~1o#-2#>ZG5SsyXHly~wX-b~+6$)N+0&w* zYnkHo&emY;YV8+ivoPf_y-e?x=ISxy3opaeYsyxx;Hk5mo7mrvhmQW#vbzEGlIxri)FG>*% zp#Qz=fCmb~nj-Gyr_04#^*fG?oBV$ zP(y}vD=4Fp1~2PNY;#l#%GQ#&tIqAE&edxgo#53FS)MBK$YaArSjY>e!N*|0x7?E{ zmVlimP>^CDwq{Z^f?Py`iKWq%*XRGcxbP-KXC+KnKDUo*Elai@fK)!xUnua3MH(wJ zg;Mt;ObafLCeQ>b)rb1ZW6xPJQ|!R5X(j=1P~68~Hx_PDk1xYk3qFoPDp7d;2DAWu zC?FE7P;Ig?ajPtG0!%*~>be{F40*6eYJ6mMSI*lX^G8Bb&Xm<*1y<^O0;m0j?>S4@ zny-C));wCgO2w1&-a%HFuxd%ArCWvetBy*}w+B2<%X)R_m1i9~JuO>7H_CO4cTdBr z%LfM5N2>|+ek_@c!@YiBTOn&;`SkW=P?IaNF;CGxOvY0C^9TKcTW+dNHBCWwmU%Z+ zA~idW1#EXo_h0SoI}ouaPHcurw=ZXxqL*>B?v9RbsS@p$Frc|Zxl}GM%gZTbL*vFAI&t9htp+1m)|D)5 zpfQw;gw#;Jh1l%zD{Q4uOYj(8AnJ!;H)T=755PpnqJ^!MY8)c!^+|mox|UF2`NOYQ zAIw<@%AHtDH3fgD)^bKJtOug>=2?*DRshOs@lHm!00|K2{}a$rtw*QgTQD_LCwhx9 z+$Lt~JmLYqoz~1j!67FEd{|K;n9`Mn*n2`g=l5v;8@+KI^|_Y!o2*C&=<@K|?~!6x}M79`kUDlN7@ST3M%}JoDozvj~^8 z8O`iw)-SCdr~Mo9Ns`fMC{ii7u9NfWy%J1=(>ch*Bj61V5aJEHd3eY|(gaVWNU-=F z_kaGjs43HCCb?U%cTxb%$n5n|3u!ebiZguhlehc~p4Pi!j2?f#jO7eXE#@me9xF>Bn{IvPO+Fq?#?zk?blgvF z9{0TN#;@j$=27#v?JIHpU74PEeCM%SObrF4TO&yXTdq5<=!VrhmX!(0A>ip}gF z;tWBXRi&)sTp3R>JBA|s3?*^3hu8vbgES_arov;jjp?&nzLcAnXDHkce=~hlc!~ti z`SorIlJ5zSzYv1|aXTL-J5OSb;HEe_=J-~et;x_tl#uB|2jG@GB4X6k=X6NMdWL2> zu2C0>$E6#*WBL>Z$qU-B&eEc17{gUc1UG3hIfN!ZJ;Kn$iOc`T=Kmh;GcR$BN3))g z;XT<4lmF6H(A6qDiR-8fU8& zy$Fv6wdZ%Yv6?dZSR&{Wv=wiO?!u14a4nw@>I>F;qCRK!8ZLy-G|{HtU5N|&Bdi)E z?-L}C+qu#^$0z?B@D5+lg{YaV=Al*SY8ylt=wa~NAPpS4BN{e&BHrSlJ?nVZ$tshr zVW)#xZ)x2>A51Bn4L-=|F8 zdKulBbsw}D(N-FP?%({gmeR4*Y**?u45xpug!{4HY+WSl>f-b~G!D>hte&H9E&n+t zhSd+~W!#O`P{eR}dBzkljM06pjzS05#b8vi`jz!ythY<^iuIydy)44R8sWGKy}079 zf;QciG#pvyvWD~IWB$GeYmz+j=Xl7V$L|U7bRGa8(650jXO=H;vTJXR+# z+n7GhJhYy~h%gFFX((CkWcoZ}b$`!fm$PQ_J4e=4SzSz5v;IA<@S0njHJRNjZDwP8 zFkmnWcxd_;pYr#svn&-PPnyXDRY5aO{z9(im36G?L2DWAg4Liot>GY^7PC;2^|rB; z7~I_fK~}@t4U=<{n+L{C&aOF_j2L?uG-@~naxz#|XysVOz|X817Qn=)Wk9z!amQ^Q z11drlrZ8*#l?rO+ z?79d~H64%vuK)XZn)Lq6n+*qjet)J3G1$q|S!d%Ldg_0sQQ>66X<^y4`|gfn!A)o- z>%o?xQzs8*tu+43-_POsyIrh)EfqYTy5qLdJ`ASc&jvQfdRDtM>1yX#QwGH;(MCMi zWCvmiUB|%HS)-0x@=bv8G@T|a#uf(YiCMo_ihUR#*uCcC*Qa0ouoZoGw8GfIWW>tR zv(o6@@As3j9CtKCwMwkT^gdYg7;6=4C}6N^Feh7pv(OIKIGo%jy!{M!j{kad?oGs> zf3BF4RBO@X7$$I-JLdJgwqL)jG}*()c*QDeJmfwXU*J}CdVMsp@Q%EKP#OYENq!sc z_<4d9!aQY?s%-grZrVziN}sQ?y>Z<|ig8mROb6eZL{}vGEmKT0(UG>52!Af6C}bxQ zt`i>3WS23Oo<2WZhGCdyvPCAD-$W)nG(aa=A%H_6%!rv_Y$q{pGS^N*G~AerN5fvh zSoun{36Dm2bWf$;5afe;w&OxPXP+ll*;>*)uSBCAjc9;<)=J#%mNA!%j43XollWZk zmfyzBcJVsQkZ6-=VClHBLYNGroIV$)cH%MO19Whe4{K!561sm#v~U222?OEL&33r7 z30k*_r>M|x?+xS4*dvm8c?w)*#_9Wx5S{wf)u*_5(4x)kGNR#r@70W&7Vw~dd`+&V z9C(KXCjPk;!%!%V$^L8JVy}&MH+Xq&;xSCFUAty>uMrt+Bt3JrQ*C*2-LP7AQ_xDw zLPH%9hF}^Vn3;fEZI-!bgnYd3?og_+df1%Rbf{d9E}dk|<=Jxd*fD0yu<+8Q^(YZ# za?9`iitTO}k$-!q(E*upZ@xr8%-H_#)%pWV!i~GfuO%gkjum!|j6|h>R-%XbwYlsu z8f1dL)WW0MN(>JV<5U9!10^-J3A!NI{emEm3ZExOu%(6iQ7A(75~{pC2+WYCzED_0`XX!86Z>O67A$v~4W zxOI15U+8ytedc5b;Cwxa)%x`XTcKA2)n)ta){c(z4F^k(sdNkuUZLTE&h)y~ZW+KK zLqmxA_I5)+YN}-6=^xLBzqLpw*WrmtU8m7iFLnDZ%g3jkj~*?qsNh63JW)mIDZsJ8|L!8f%?NFCi&PPom0R(LP%!X?*;YqobqJh7J1^q7$;Vp{=?mLun>Z zwmETPYs)ZF$?*=<11fBv9$IU&Hby@G@#C(}&I$X?3)= zo-HfedU|4{$U{B#3WOx9x2}z^9UUEztgWq8RaG@i6E=36WwIx`+0k4sva0K7O-;@I zt0|-1_&2Jy%fiwU-{7_Wk=TFr%kfH=JX`hnqsNbLp$nZje!SE}y=!cYzHu=5$!wi> z6QeJ>;$TkO=xB6c;H=4anBAR!3BO#6k9RwLI>mTYQpW4tbCGboR=G%vJ$n@53=ZIq zvUoi^ckaY{MwTar@Xxj3n`9uqY$2CdP++SPM3>c|1S+?_`(1H literal 0 HcmV?d00001 diff --git a/docs/landing-rasterization-evidence.json b/docs/landing-rasterization-evidence.json new file mode 100644 index 0000000..f32df45 --- /dev/null +++ b/docs/landing-rasterization-evidence.json @@ -0,0 +1,15575 @@ +{ + "base": "4a0e434b4448f4c6c28105e609c34cd3fb06e258", + "binarySha256": "12789c3b262d7034c5d730699be066cf70db3846beefc5e84cd423b949236ce2", + "baselineRuns": [ + [ + { + "name": "landing-833-3640", + "frame": "833:3640", + "viewport": { + "width": 360, + "height": 2955 + }, + "reference": "out/landing-833-3640.reference.png", + "actual": "out/landing-833-3640.actual.png", + "acquisition": { + "binarySha256": "12789c3b262d7034c5d730699be066cf70db3846beefc5e84cd423b949236ce2", + "server": { + "version": "0.4.6", + "buildId": "4a0e434b4448", + "commit": "4a0e434b4448", + "displayVersion": "0.4.6+4a0e434b4448", + "identityGuidance": "Identify deployments by commit/buildId, not version alone. If the expected commit/buildId differs, reconnect or restart the client MCP server connection after updating the binary.", + "updateAvailable": { + "current": "0.4.6", + "latest": "0.4.5", + "isStale": false, + "state": "known", + "checkedAtEpochSeconds": 1789322605, + "note": "A difference between the running build and the newest release. devup-mcp never replaces its own binary: the MCP host owns this process, so update it and reconnect the client." + } + }, + "responsePath": "out/landing-833-3640-833-3640.response.json", + "files": { + "src/screens/landing-833-3640.tsx": "e8edc832e79631eb6351befbc00a719640266144ac568426c2a3a7b5402c7ae3", + "themes/landing-833-3640.json": "e18d9d7e25b4e288f369d28230c89f2e6a6da90e9275134b667bf79be7844134", + "out/landing-833-3640.reference.png": "d66ec480cec7ae66c6e2ffe03161b763dc7d446c064fd82318a4d0f3d3e9bb92", + "out/landing-833-3640-833-3640.snapshot.json": "27839ecaebd603beb7a982882e9f668e9af50f08b44c3391386ee8dcb7f1a554", + "public/images/418625428_72f26dbd-47e8-4138-9fb0-a2e7a8fa07ff-1-833-3644-08dee1e45f39.png": "0f4f9d466ac14c31b0fb09df34285ecbddb015131cf582e9ad8dff0532e9aaf9", + "public/icons/solar-star-bold-833-3652-5cc5453b009b.svg": "fde07d775f5bff6bcbcac56ba578ff7e955294147ab022ac89743b5d304355ed", + "public/icons/solar-heart-bold-833-3658-1bde6dbfd06d.svg": "0989ab82a6d17f71133541ab47e581cfae9d69082edb468f40beffcf28530998", + "public/icons/Group-1-833-3668-a7c431f3db94.svg": "42b576579bc76fc2995105d41d54c2c2b54a32d8030bb3eec0ba426b348e6570", + "public/icons/crown_17099645-1-833-3679-197dbb0a06fc.svg": "33327ac76f21c12dc8d8923084b5657e2686a929d38dd14139c1eb40fe36b295", + "public/icons/crown_17099645-1-833-3685-2a58803b3472.svg": "33327ac76f21c12dc8d8923084b5657e2686a929d38dd14139c1eb40fe36b295", + "public/icons/010-idea-flat-667ce93d8514.svg": "fcd7da026ef84674fc32c6255b409d34c66c4963f4b88adb4555cbcfba8b12c9", + "public/icons/019-trophy-flat-6a363e0e28ee.svg": "13b6f673f75235fbef456af1a773b12036467e2c091a9ae23f1207368e387c09", + "public/icons/021-heart-flat-8a173fb684bc.svg": "e87eba39bcd03793587b2f8b9c33367b808d57180d3fe6923cd37fc1a1c77690", + "public/icons/016-notice-flat-24194195fe96.svg": "9146a549576b477d064fb32807aa9456cdef3f48fb8768b1615f2d98867eff91", + "public/icons/gnb-icon-833-3764-5de973b534cb.svg": "cd7dd9bec8760c18eccb42b348d6d5a926cc30f82f140d2cbea2e177f2eb4987", + "public/icons/gnb-icon-833-3766-a48fab4a944c.svg": "ac9ad8343645776ea6aa7006710aa715e2f70330c3e1242b0e42ff7a8f50ff07", + "public/images/Frame-1321314530-833-3810-7014d196c3a6.png": "1bf19dfc8a7880fc3551523eb2a4457d1ef488d30cabdfa685e188de730556a8", + "public/icons/Group-6-I833-3641-1301-3815-4ba8a24434ef.svg": "1b19ef43a9de9b79a63a1c11b6309ea8a6976fc0a62e2f633b4de6f22b283dc4", + "public/icons/icons-hamburger-16b0ce1b4710.svg": "26fecdf67beac21dd5b9efb5bbb927599aba4fec178b5becb232b35a1fa250a4", + "public/icons/icons-right-d6837ecd8440.svg": "644288d1ae14222133581cf93f621b0ec6cdf02b76da4266aa0ab9d8f8ad9f9d", + "public/icons/icons-export-db31326b74c1.svg": "df430122b09a14e5d18ad544352ed420df470d04082448aefbe622893a176bff" + } + }, + "themeHash": "e18d9d7e25b4e288f369d28230c89f2e6a6da90e9275134b667bf79be7844134", + "rendered": { + "width": 360, + "height": 2955 + }, + "flattened": null, + "environmentStatus": "valid", + "compare": { + "exit": 1, + "stdout": "{\"status\":\"mismatch\",\"referenceDimensions\":[360,2955],\"actualDimensions\":[360,2955],\"changedPixels\":50881,\"totalPixels\":1063800,\"changedRatio\":0.04782947922541831,\"maxChangedRatio\":0.005,\"channelTolerance\":24,\"maxChannelDelta\":255,\"diffPath\":\"C:\\\\Users\\\\owjs3\\\\orca\\\\workspaces\\\\devup-mcp\\\\W25-B-landing\\\\harness\\\\render\\\\out\\\\landing-833-3640.diff.png\"}", + "stderr": "" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 360, + 2955 + ], + "actualDimensions": [ + 360, + 2955 + ], + "changedPixels": 50881, + "totalPixels": 1063800, + "changedRatio": 0.04782947922541831, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 255, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W25-B-landing\\harness\\render\\out\\landing-833-3640.diff.png" + } + }, + { + "name": "landing-833-3322", + "frame": "833:3322", + "viewport": { + "width": 992, + "height": 2964 + }, + "reference": "out/landing-833-3322.reference.png", + "actual": "out/landing-833-3322.actual.png", + "acquisition": { + "binarySha256": "12789c3b262d7034c5d730699be066cf70db3846beefc5e84cd423b949236ce2", + "server": { + "version": "0.4.6", + "buildId": "4a0e434b4448", + "commit": "4a0e434b4448", + "displayVersion": "0.4.6+4a0e434b4448", + "identityGuidance": "Identify deployments by commit/buildId, not version alone. If the expected commit/buildId differs, reconnect or restart the client MCP server connection after updating the binary.", + "updateAvailable": { + "current": "0.4.6", + "latest": "0.4.5", + "isStale": false, + "state": "known", + "checkedAtEpochSeconds": 1789322605, + "note": "A difference between the running build and the newest release. devup-mcp never replaces its own binary: the MCP host owns this process, so update it and reconnect the client." + } + }, + "responsePath": "out/landing-833-3322-833-3322.response.json", + "files": { + "src/screens/landing-833-3322.tsx": "f6f4e52ec734fab91ad859de0d755a10a5e2633743956d407f45dc9d458684f8", + "themes/landing-833-3322.json": "87ef9f58fdb853cb6603a7704dc4b685e4af4242eb3e0b2058e3fbbd968c011d", + "out/landing-833-3322.reference.png": "f3eebec1a9e5f574922b4f616d08abae92f9cada366213d4ac4d748553bd96a9", + "out/landing-833-3322-833-3322.snapshot.json": "7da5f5ca3013fcd15b96fb0f45e08ada77b4b8959cfb8bd8aaa1f7ca65a23e3c", + "public/images/418625428_72f26dbd-47e8-4138-9fb0-a2e7a8fa07ff-1-833-3326-7243e0115236.png": "8799ce4ee9de8f943c887273ecc2591050929b8d4d4b7a9044d30e5519f959d6", + "public/icons/solar-star-bold-833-3334-6755d65e76bb.svg": "1bcf4d7c289428dc0b72b0a821ff10995f6d2b14dc5f9f61dec1cc31aec21e4e", + "public/icons/solar-heart-bold-833-3340-540d11bad4d5.svg": "c267bbba89341927c6cfd4a2b1c94d69e733461af1212fe8d5d0abde2db761e0", + "public/icons/Group-1-833-3350-47a3055ea985.svg": "37e578e014a174ddc96170e64760ba80233d4d34fceb93625be537cb975b2811", + "public/icons/crown_17099645-1-833-3361-139fa64ae5fc.svg": "33327ac76f21c12dc8d8923084b5657e2686a929d38dd14139c1eb40fe36b295", + "public/icons/crown_17099645-1-833-3367-1429719bb386.svg": "33327ac76f21c12dc8d8923084b5657e2686a929d38dd14139c1eb40fe36b295", + "public/icons/010-idea-flat-667ce93d8514.svg": "fcd7da026ef84674fc32c6255b409d34c66c4963f4b88adb4555cbcfba8b12c9", + "public/icons/019-trophy-flat-6a363e0e28ee.svg": "13b6f673f75235fbef456af1a773b12036467e2c091a9ae23f1207368e387c09", + "public/icons/021-heart-flat-8a173fb684bc.svg": "e87eba39bcd03793587b2f8b9c33367b808d57180d3fe6923cd37fc1a1c77690", + "public/icons/016-notice-flat-24194195fe96.svg": "9146a549576b477d064fb32807aa9456cdef3f48fb8768b1615f2d98867eff91", + "public/icons/5191-833-3446-4d3d5dfc424c.svg": "71968c68452d53fce1224f15070698e2963944e39834f2fdec3d8fb5845fa098", + "public/icons/gnb-icon-833-3451-c2c37c1f1e10.svg": "2298b1e5855713c2c201be8a1dac8fe1f9cc3de9705cb6ec9d7a6abf0c5a34ed", + "public/icons/Group-6-I833-3323-1301-3815-0b44bc4425f2.svg": "8cf0c38b2b94cf332076dc046ceedee088179d531d36c4f6adc2442e02e8d719", + "public/icons/icons-hamburger-16b0ce1b4710.svg": "26fecdf67beac21dd5b9efb5bbb927599aba4fec178b5becb232b35a1fa250a4", + "public/icons/icons-right-d6837ecd8440.svg": "644288d1ae14222133581cf93f621b0ec6cdf02b76da4266aa0ab9d8f8ad9f9d", + "public/icons/icons-export-db31326b74c1.svg": "df430122b09a14e5d18ad544352ed420df470d04082448aefbe622893a176bff", + "public/images/Frame-1000014051-I833-3460-22-4263-2c2cfa53c0a1.png": "17a41dcdcdc8347ff92aa7e155cc2b7b81b5156b5a220d6dc6bc3b87299c2e28" + } + }, + "themeHash": "87ef9f58fdb853cb6603a7704dc4b685e4af4242eb3e0b2058e3fbbd968c011d", + "rendered": { + "width": 992, + "height": 2964 + }, + "flattened": null, + "environmentStatus": "valid", + "compare": { + "exit": 1, + "stdout": "{\"status\":\"mismatch\",\"referenceDimensions\":[992,2964],\"actualDimensions\":[992,2964],\"changedPixels\":72515,\"totalPixels\":2940288,\"changedRatio\":0.024662550063123068,\"maxChangedRatio\":0.005,\"channelTolerance\":24,\"maxChannelDelta\":255,\"diffPath\":\"C:\\\\Users\\\\owjs3\\\\orca\\\\workspaces\\\\devup-mcp\\\\W25-B-landing\\\\harness\\\\render\\\\out\\\\landing-833-3322.diff.png\"}", + "stderr": "" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 992, + 2964 + ], + "actualDimensions": [ + 992, + 2964 + ], + "changedPixels": 72515, + "totalPixels": 2940288, + "changedRatio": 0.024662550063123068, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 255, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W25-B-landing\\harness\\render\\out\\landing-833-3322.diff.png" + } + }, + { + "name": "landing-832-2975", + "frame": "832:2975", + "viewport": { + "width": 1920, + "height": 3084 + }, + "reference": "out/landing-832-2975.reference.png", + "actual": "out/landing-832-2975.actual.png", + "acquisition": { + "binarySha256": "12789c3b262d7034c5d730699be066cf70db3846beefc5e84cd423b949236ce2", + "server": { + "version": "0.4.6", + "buildId": "4a0e434b4448", + "commit": "4a0e434b4448", + "displayVersion": "0.4.6+4a0e434b4448", + "identityGuidance": "Identify deployments by commit/buildId, not version alone. If the expected commit/buildId differs, reconnect or restart the client MCP server connection after updating the binary.", + "updateAvailable": { + "current": "0.4.6", + "latest": "0.4.5", + "isStale": false, + "state": "known", + "checkedAtEpochSeconds": 1789322605, + "note": "A difference between the running build and the newest release. devup-mcp never replaces its own binary: the MCP host owns this process, so update it and reconnect the client." + } + }, + "responsePath": "out/landing-832-2975-832-2975.response.json", + "files": { + "src/screens/landing-832-2975.tsx": "8cc5656a6e2b9c238e7beee366f25ed2cd1a9c2957375483d090fed05cad7144", + "themes/landing-832-2975.json": "3ae50e9a165f5060e6c977a6c6b610a4238192437492acd7de908a65c2274018", + "out/landing-832-2975.reference.png": "68b0743556479681e642b389f89fd2a082d86c6d634884739bd8725522cf8c6b", + "out/landing-832-2975-832-2975.snapshot.json": "9a62aa1b9b7a7a80e3a546574a36d7bbe57bd184fa5031ccb33be9d73e8fef8e", + "public/images/418625428_72f26dbd-47e8-4138-9fb0-a2e7a8fa07ff-1-832-2978-4de7b61e6c3c.png": "cdf3bb1f72944e96a49f3d631e80ff3e5960e7af4eeb6de5f3246e0c67ee9b4f", + "public/icons/solar-star-bold-832-2986-9f11d7e01c56.svg": "f582be85a51eee841cdf662435c3d0e6a508e2c8fb15828108296005af5d4500", + "public/icons/solar-heart-bold-832-2992-cacd42da2c50.svg": "11c3fc4eeba5e51fdd7239dc010378eb4b8f13831a64ff0752d6f6ed9c2c9172", + "public/icons/Group-2-832-3006-2032fbefcfa1.svg": "d31bcc8e3ebcdc58595fc46de9b01846bd54d9439bed31e60dc03e574250b78f", + "public/icons/crown_17099645-1-832-3017-d73e50b3382b.svg": "33327ac76f21c12dc8d8923084b5657e2686a929d38dd14139c1eb40fe36b295", + "public/icons/crown_17099645-1-832-3023-7bcaafe00e55.svg": "33327ac76f21c12dc8d8923084b5657e2686a929d38dd14139c1eb40fe36b295", + "public/icons/010-idea-flat-667ce93d8514.svg": "fcd7da026ef84674fc32c6255b409d34c66c4963f4b88adb4555cbcfba8b12c9", + "public/icons/019-trophy-flat-6a363e0e28ee.svg": "13b6f673f75235fbef456af1a773b12036467e2c091a9ae23f1207368e387c09", + "public/icons/021-heart-flat-8a173fb684bc.svg": "e87eba39bcd03793587b2f8b9c33367b808d57180d3fe6923cd37fc1a1c77690", + "public/icons/016-notice-flat-24194195fe96.svg": "9146a549576b477d064fb32807aa9456cdef3f48fb8768b1615f2d98867eff91", + "public/icons/5191-832-3100-bf641e9b7756.svg": "71968c68452d53fce1224f15070698e2963944e39834f2fdec3d8fb5845fa098", + "public/icons/gnb-icon-832-3103-a91d9f55ac44.svg": "ca7ee51c17e7eb46ad2caa4fb46813e931d97a3d4116d4e9030b3bdc7eb6b0b2", + "public/icons/gnb-icon-832-3105-370cb19c018e.svg": "2298b1e5855713c2c201be8a1dac8fe1f9cc3de9705cb6ec9d7a6abf0c5a34ed", + "public/icons/icons-right-d6837ecd8440.svg": "644288d1ae14222133581cf93f621b0ec6cdf02b76da4266aa0ab9d8f8ad9f9d", + "public/icons/icons-export-db31326b74c1.svg": "df430122b09a14e5d18ad544352ed420df470d04082448aefbe622893a176bff", + "public/images/Frame-1000014051-I832-3114-793-7937-a2405a4c664f.png": "17a41dcdcdc8347ff92aa7e155cc2b7b81b5156b5a220d6dc6bc3b87299c2e28", + "public/icons/Group-6-I832-3115-1301-3742-c2f11edfdf3b.svg": "3ea594269b28ff969f2fde3d83c56a7765efe855a3ee069e584b53b283b9fc69", + "public/icons/gnb-icon-github-eddad4bf4c58.svg": "9563db95991c3e365a9d99ace8202c057a1c1e718cb6a7f0f6ee7aff1edd6f2a", + "public/icons/gnb-icon-discord-57dd3850a957.svg": "bb330df8f65247409be005eb88797c538d781bb07f87d00108912356d8486967", + "public/icons/gnb-icon-light-c4e2e98c3a38.svg": "c71793bedfe013491a30977255e1a381692ce8d6e3468819b6ed6777916dfc88", + "public/icons/gnb-icon-kakao-76d978d7f2f3.svg": "2fe1ec49fb625208ba92946b89c5bbe9c982e4039cd71cc1f71f0d9ee6b837c0" + } + }, + "themeHash": "3ae50e9a165f5060e6c977a6c6b610a4238192437492acd7de908a65c2274018", + "rendered": { + "width": 1920, + "height": 3084 + }, + "flattened": null, + "environmentStatus": "valid", + "compare": { + "exit": 1, + "stdout": "{\"status\":\"mismatch\",\"referenceDimensions\":[1920,3084],\"actualDimensions\":[1920,3084],\"changedPixels\":89041,\"totalPixels\":5921280,\"changedRatio\":0.015037458117163857,\"maxChangedRatio\":0.005,\"channelTolerance\":24,\"maxChannelDelta\":255,\"diffPath\":\"C:\\\\Users\\\\owjs3\\\\orca\\\\workspaces\\\\devup-mcp\\\\W25-B-landing\\\\harness\\\\render\\\\out\\\\landing-832-2975.diff.png\"}", + "stderr": "" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 1920, + 3084 + ], + "actualDimensions": [ + 1920, + 3084 + ], + "changedPixels": 89041, + "totalPixels": 5921280, + "changedRatio": 0.015037458117163857, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 255, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W25-B-landing\\harness\\render\\out\\landing-832-2975.diff.png" + } + } + ], + [ + { + "name": "landing-833-3640", + "frame": "833:3640", + "viewport": { + "width": 360, + "height": 2955 + }, + "reference": "out/landing-833-3640.reference.png", + "actual": "out/landing-833-3640.actual.png", + "acquisition": { + "binarySha256": "12789c3b262d7034c5d730699be066cf70db3846beefc5e84cd423b949236ce2", + "server": { + "version": "0.4.6", + "buildId": "4a0e434b4448", + "commit": "4a0e434b4448", + "displayVersion": "0.4.6+4a0e434b4448", + "identityGuidance": "Identify deployments by commit/buildId, not version alone. If the expected commit/buildId differs, reconnect or restart the client MCP server connection after updating the binary.", + "updateAvailable": { + "current": "0.4.6", + "latest": "0.4.5", + "isStale": false, + "state": "known", + "checkedAtEpochSeconds": 1789322605, + "note": "A difference between the running build and the newest release. devup-mcp never replaces its own binary: the MCP host owns this process, so update it and reconnect the client." + } + }, + "responsePath": "out/landing-833-3640-833-3640.response.json", + "files": { + "src/screens/landing-833-3640.tsx": "e8edc832e79631eb6351befbc00a719640266144ac568426c2a3a7b5402c7ae3", + "themes/landing-833-3640.json": "e18d9d7e25b4e288f369d28230c89f2e6a6da90e9275134b667bf79be7844134", + "out/landing-833-3640.reference.png": "d66ec480cec7ae66c6e2ffe03161b763dc7d446c064fd82318a4d0f3d3e9bb92", + "out/landing-833-3640-833-3640.snapshot.json": "27839ecaebd603beb7a982882e9f668e9af50f08b44c3391386ee8dcb7f1a554", + "public/images/418625428_72f26dbd-47e8-4138-9fb0-a2e7a8fa07ff-1-833-3644-08dee1e45f39.png": "0f4f9d466ac14c31b0fb09df34285ecbddb015131cf582e9ad8dff0532e9aaf9", + "public/icons/solar-star-bold-833-3652-5cc5453b009b.svg": "fde07d775f5bff6bcbcac56ba578ff7e955294147ab022ac89743b5d304355ed", + "public/icons/solar-heart-bold-833-3658-1bde6dbfd06d.svg": "0989ab82a6d17f71133541ab47e581cfae9d69082edb468f40beffcf28530998", + "public/icons/Group-1-833-3668-a7c431f3db94.svg": "42b576579bc76fc2995105d41d54c2c2b54a32d8030bb3eec0ba426b348e6570", + "public/icons/crown_17099645-1-833-3679-197dbb0a06fc.svg": "33327ac76f21c12dc8d8923084b5657e2686a929d38dd14139c1eb40fe36b295", + "public/icons/crown_17099645-1-833-3685-2a58803b3472.svg": "33327ac76f21c12dc8d8923084b5657e2686a929d38dd14139c1eb40fe36b295", + "public/icons/010-idea-flat-667ce93d8514.svg": "fcd7da026ef84674fc32c6255b409d34c66c4963f4b88adb4555cbcfba8b12c9", + "public/icons/019-trophy-flat-6a363e0e28ee.svg": "13b6f673f75235fbef456af1a773b12036467e2c091a9ae23f1207368e387c09", + "public/icons/021-heart-flat-8a173fb684bc.svg": "e87eba39bcd03793587b2f8b9c33367b808d57180d3fe6923cd37fc1a1c77690", + "public/icons/016-notice-flat-24194195fe96.svg": "9146a549576b477d064fb32807aa9456cdef3f48fb8768b1615f2d98867eff91", + "public/icons/gnb-icon-833-3764-5de973b534cb.svg": "cd7dd9bec8760c18eccb42b348d6d5a926cc30f82f140d2cbea2e177f2eb4987", + "public/icons/gnb-icon-833-3766-a48fab4a944c.svg": "ac9ad8343645776ea6aa7006710aa715e2f70330c3e1242b0e42ff7a8f50ff07", + "public/images/Frame-1321314530-833-3810-7014d196c3a6.png": "1bf19dfc8a7880fc3551523eb2a4457d1ef488d30cabdfa685e188de730556a8", + "public/icons/Group-6-I833-3641-1301-3815-4ba8a24434ef.svg": "1b19ef43a9de9b79a63a1c11b6309ea8a6976fc0a62e2f633b4de6f22b283dc4", + "public/icons/icons-hamburger-16b0ce1b4710.svg": "26fecdf67beac21dd5b9efb5bbb927599aba4fec178b5becb232b35a1fa250a4", + "public/icons/icons-right-d6837ecd8440.svg": "644288d1ae14222133581cf93f621b0ec6cdf02b76da4266aa0ab9d8f8ad9f9d", + "public/icons/icons-export-db31326b74c1.svg": "df430122b09a14e5d18ad544352ed420df470d04082448aefbe622893a176bff" + } + }, + "themeHash": "e18d9d7e25b4e288f369d28230c89f2e6a6da90e9275134b667bf79be7844134", + "rendered": { + "width": 360, + "height": 2955 + }, + "flattened": null, + "environmentStatus": "valid", + "compare": { + "exit": 1, + "stdout": "{\"status\":\"mismatch\",\"referenceDimensions\":[360,2955],\"actualDimensions\":[360,2955],\"changedPixels\":50881,\"totalPixels\":1063800,\"changedRatio\":0.04782947922541831,\"maxChangedRatio\":0.005,\"channelTolerance\":24,\"maxChannelDelta\":255,\"diffPath\":\"C:\\\\Users\\\\owjs3\\\\orca\\\\workspaces\\\\devup-mcp\\\\W25-B-landing\\\\harness\\\\render\\\\out\\\\landing-833-3640.diff.png\"}", + "stderr": "" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 360, + 2955 + ], + "actualDimensions": [ + 360, + 2955 + ], + "changedPixels": 50881, + "totalPixels": 1063800, + "changedRatio": 0.04782947922541831, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 255, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W25-B-landing\\harness\\render\\out\\landing-833-3640.diff.png" + } + }, + { + "name": "landing-833-3322", + "frame": "833:3322", + "viewport": { + "width": 992, + "height": 2964 + }, + "reference": "out/landing-833-3322.reference.png", + "actual": "out/landing-833-3322.actual.png", + "acquisition": { + "binarySha256": "12789c3b262d7034c5d730699be066cf70db3846beefc5e84cd423b949236ce2", + "server": { + "version": "0.4.6", + "buildId": "4a0e434b4448", + "commit": "4a0e434b4448", + "displayVersion": "0.4.6+4a0e434b4448", + "identityGuidance": "Identify deployments by commit/buildId, not version alone. If the expected commit/buildId differs, reconnect or restart the client MCP server connection after updating the binary.", + "updateAvailable": { + "current": "0.4.6", + "latest": "0.4.5", + "isStale": false, + "state": "known", + "checkedAtEpochSeconds": 1789322605, + "note": "A difference between the running build and the newest release. devup-mcp never replaces its own binary: the MCP host owns this process, so update it and reconnect the client." + } + }, + "responsePath": "out/landing-833-3322-833-3322.response.json", + "files": { + "src/screens/landing-833-3322.tsx": "f6f4e52ec734fab91ad859de0d755a10a5e2633743956d407f45dc9d458684f8", + "themes/landing-833-3322.json": "87ef9f58fdb853cb6603a7704dc4b685e4af4242eb3e0b2058e3fbbd968c011d", + "out/landing-833-3322.reference.png": "f3eebec1a9e5f574922b4f616d08abae92f9cada366213d4ac4d748553bd96a9", + "out/landing-833-3322-833-3322.snapshot.json": "7da5f5ca3013fcd15b96fb0f45e08ada77b4b8959cfb8bd8aaa1f7ca65a23e3c", + "public/images/418625428_72f26dbd-47e8-4138-9fb0-a2e7a8fa07ff-1-833-3326-7243e0115236.png": "8799ce4ee9de8f943c887273ecc2591050929b8d4d4b7a9044d30e5519f959d6", + "public/icons/solar-star-bold-833-3334-6755d65e76bb.svg": "1bcf4d7c289428dc0b72b0a821ff10995f6d2b14dc5f9f61dec1cc31aec21e4e", + "public/icons/solar-heart-bold-833-3340-540d11bad4d5.svg": "c267bbba89341927c6cfd4a2b1c94d69e733461af1212fe8d5d0abde2db761e0", + "public/icons/Group-1-833-3350-47a3055ea985.svg": "37e578e014a174ddc96170e64760ba80233d4d34fceb93625be537cb975b2811", + "public/icons/crown_17099645-1-833-3361-139fa64ae5fc.svg": "33327ac76f21c12dc8d8923084b5657e2686a929d38dd14139c1eb40fe36b295", + "public/icons/crown_17099645-1-833-3367-1429719bb386.svg": "33327ac76f21c12dc8d8923084b5657e2686a929d38dd14139c1eb40fe36b295", + "public/icons/010-idea-flat-667ce93d8514.svg": "fcd7da026ef84674fc32c6255b409d34c66c4963f4b88adb4555cbcfba8b12c9", + "public/icons/019-trophy-flat-6a363e0e28ee.svg": "13b6f673f75235fbef456af1a773b12036467e2c091a9ae23f1207368e387c09", + "public/icons/021-heart-flat-8a173fb684bc.svg": "e87eba39bcd03793587b2f8b9c33367b808d57180d3fe6923cd37fc1a1c77690", + "public/icons/016-notice-flat-24194195fe96.svg": "9146a549576b477d064fb32807aa9456cdef3f48fb8768b1615f2d98867eff91", + "public/icons/5191-833-3446-4d3d5dfc424c.svg": "71968c68452d53fce1224f15070698e2963944e39834f2fdec3d8fb5845fa098", + "public/icons/gnb-icon-833-3451-c2c37c1f1e10.svg": "2298b1e5855713c2c201be8a1dac8fe1f9cc3de9705cb6ec9d7a6abf0c5a34ed", + "public/icons/Group-6-I833-3323-1301-3815-0b44bc4425f2.svg": "8cf0c38b2b94cf332076dc046ceedee088179d531d36c4f6adc2442e02e8d719", + "public/icons/icons-hamburger-16b0ce1b4710.svg": "26fecdf67beac21dd5b9efb5bbb927599aba4fec178b5becb232b35a1fa250a4", + "public/icons/icons-right-d6837ecd8440.svg": "644288d1ae14222133581cf93f621b0ec6cdf02b76da4266aa0ab9d8f8ad9f9d", + "public/icons/icons-export-db31326b74c1.svg": "df430122b09a14e5d18ad544352ed420df470d04082448aefbe622893a176bff", + "public/images/Frame-1000014051-I833-3460-22-4263-2c2cfa53c0a1.png": "17a41dcdcdc8347ff92aa7e155cc2b7b81b5156b5a220d6dc6bc3b87299c2e28" + } + }, + "themeHash": "87ef9f58fdb853cb6603a7704dc4b685e4af4242eb3e0b2058e3fbbd968c011d", + "rendered": { + "width": 992, + "height": 2964 + }, + "flattened": null, + "environmentStatus": "valid", + "compare": { + "exit": 1, + "stdout": "{\"status\":\"mismatch\",\"referenceDimensions\":[992,2964],\"actualDimensions\":[992,2964],\"changedPixels\":72515,\"totalPixels\":2940288,\"changedRatio\":0.024662550063123068,\"maxChangedRatio\":0.005,\"channelTolerance\":24,\"maxChannelDelta\":255,\"diffPath\":\"C:\\\\Users\\\\owjs3\\\\orca\\\\workspaces\\\\devup-mcp\\\\W25-B-landing\\\\harness\\\\render\\\\out\\\\landing-833-3322.diff.png\"}", + "stderr": "" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 992, + 2964 + ], + "actualDimensions": [ + 992, + 2964 + ], + "changedPixels": 72515, + "totalPixels": 2940288, + "changedRatio": 0.024662550063123068, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 255, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W25-B-landing\\harness\\render\\out\\landing-833-3322.diff.png" + } + }, + { + "name": "landing-832-2975", + "frame": "832:2975", + "viewport": { + "width": 1920, + "height": 3084 + }, + "reference": "out/landing-832-2975.reference.png", + "actual": "out/landing-832-2975.actual.png", + "acquisition": { + "binarySha256": "12789c3b262d7034c5d730699be066cf70db3846beefc5e84cd423b949236ce2", + "server": { + "version": "0.4.6", + "buildId": "4a0e434b4448", + "commit": "4a0e434b4448", + "displayVersion": "0.4.6+4a0e434b4448", + "identityGuidance": "Identify deployments by commit/buildId, not version alone. If the expected commit/buildId differs, reconnect or restart the client MCP server connection after updating the binary.", + "updateAvailable": { + "current": "0.4.6", + "latest": "0.4.5", + "isStale": false, + "state": "known", + "checkedAtEpochSeconds": 1789322605, + "note": "A difference between the running build and the newest release. devup-mcp never replaces its own binary: the MCP host owns this process, so update it and reconnect the client." + } + }, + "responsePath": "out/landing-832-2975-832-2975.response.json", + "files": { + "src/screens/landing-832-2975.tsx": "8cc5656a6e2b9c238e7beee366f25ed2cd1a9c2957375483d090fed05cad7144", + "themes/landing-832-2975.json": "3ae50e9a165f5060e6c977a6c6b610a4238192437492acd7de908a65c2274018", + "out/landing-832-2975.reference.png": "68b0743556479681e642b389f89fd2a082d86c6d634884739bd8725522cf8c6b", + "out/landing-832-2975-832-2975.snapshot.json": "9a62aa1b9b7a7a80e3a546574a36d7bbe57bd184fa5031ccb33be9d73e8fef8e", + "public/images/418625428_72f26dbd-47e8-4138-9fb0-a2e7a8fa07ff-1-832-2978-4de7b61e6c3c.png": "cdf3bb1f72944e96a49f3d631e80ff3e5960e7af4eeb6de5f3246e0c67ee9b4f", + "public/icons/solar-star-bold-832-2986-9f11d7e01c56.svg": "f582be85a51eee841cdf662435c3d0e6a508e2c8fb15828108296005af5d4500", + "public/icons/solar-heart-bold-832-2992-cacd42da2c50.svg": "11c3fc4eeba5e51fdd7239dc010378eb4b8f13831a64ff0752d6f6ed9c2c9172", + "public/icons/Group-2-832-3006-2032fbefcfa1.svg": "d31bcc8e3ebcdc58595fc46de9b01846bd54d9439bed31e60dc03e574250b78f", + "public/icons/crown_17099645-1-832-3017-d73e50b3382b.svg": "33327ac76f21c12dc8d8923084b5657e2686a929d38dd14139c1eb40fe36b295", + "public/icons/crown_17099645-1-832-3023-7bcaafe00e55.svg": "33327ac76f21c12dc8d8923084b5657e2686a929d38dd14139c1eb40fe36b295", + "public/icons/010-idea-flat-667ce93d8514.svg": "fcd7da026ef84674fc32c6255b409d34c66c4963f4b88adb4555cbcfba8b12c9", + "public/icons/019-trophy-flat-6a363e0e28ee.svg": "13b6f673f75235fbef456af1a773b12036467e2c091a9ae23f1207368e387c09", + "public/icons/021-heart-flat-8a173fb684bc.svg": "e87eba39bcd03793587b2f8b9c33367b808d57180d3fe6923cd37fc1a1c77690", + "public/icons/016-notice-flat-24194195fe96.svg": "9146a549576b477d064fb32807aa9456cdef3f48fb8768b1615f2d98867eff91", + "public/icons/5191-832-3100-bf641e9b7756.svg": "71968c68452d53fce1224f15070698e2963944e39834f2fdec3d8fb5845fa098", + "public/icons/gnb-icon-832-3103-a91d9f55ac44.svg": "ca7ee51c17e7eb46ad2caa4fb46813e931d97a3d4116d4e9030b3bdc7eb6b0b2", + "public/icons/gnb-icon-832-3105-370cb19c018e.svg": "2298b1e5855713c2c201be8a1dac8fe1f9cc3de9705cb6ec9d7a6abf0c5a34ed", + "public/icons/icons-right-d6837ecd8440.svg": "644288d1ae14222133581cf93f621b0ec6cdf02b76da4266aa0ab9d8f8ad9f9d", + "public/icons/icons-export-db31326b74c1.svg": "df430122b09a14e5d18ad544352ed420df470d04082448aefbe622893a176bff", + "public/images/Frame-1000014051-I832-3114-793-7937-a2405a4c664f.png": "17a41dcdcdc8347ff92aa7e155cc2b7b81b5156b5a220d6dc6bc3b87299c2e28", + "public/icons/Group-6-I832-3115-1301-3742-c2f11edfdf3b.svg": "3ea594269b28ff969f2fde3d83c56a7765efe855a3ee069e584b53b283b9fc69", + "public/icons/gnb-icon-github-eddad4bf4c58.svg": "9563db95991c3e365a9d99ace8202c057a1c1e718cb6a7f0f6ee7aff1edd6f2a", + "public/icons/gnb-icon-discord-57dd3850a957.svg": "bb330df8f65247409be005eb88797c538d781bb07f87d00108912356d8486967", + "public/icons/gnb-icon-light-c4e2e98c3a38.svg": "c71793bedfe013491a30977255e1a381692ce8d6e3468819b6ed6777916dfc88", + "public/icons/gnb-icon-kakao-76d978d7f2f3.svg": "2fe1ec49fb625208ba92946b89c5bbe9c982e4039cd71cc1f71f0d9ee6b837c0" + } + }, + "themeHash": "3ae50e9a165f5060e6c977a6c6b610a4238192437492acd7de908a65c2274018", + "rendered": { + "width": 1920, + "height": 3084 + }, + "flattened": null, + "environmentStatus": "valid", + "compare": { + "exit": 1, + "stdout": "{\"status\":\"mismatch\",\"referenceDimensions\":[1920,3084],\"actualDimensions\":[1920,3084],\"changedPixels\":89041,\"totalPixels\":5921280,\"changedRatio\":0.015037458117163857,\"maxChangedRatio\":0.005,\"channelTolerance\":24,\"maxChannelDelta\":255,\"diffPath\":\"C:\\\\Users\\\\owjs3\\\\orca\\\\workspaces\\\\devup-mcp\\\\W25-B-landing\\\\harness\\\\render\\\\out\\\\landing-832-2975.diff.png\"}", + "stderr": "" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 1920, + 3084 + ], + "actualDimensions": [ + 1920, + 3084 + ], + "changedPixels": 89041, + "totalPixels": 5921280, + "changedRatio": 0.015037458117163857, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 255, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W25-B-landing\\harness\\render\\out\\landing-832-2975.diff.png" + } + } + ] + ], + "screens": { + "landing-833-3640": { + "referenceSha256": "d66ec480cec7ae66c6e2ffe03161b763dc7d446c064fd82318a4d0f3d3e9bb92", + "actualSha256": "7896d781f7c5cacda0ec3b59689ceedf3926f92191cbd166a8686ffdfb43c727", + "probes": [ + { + "label": "default", + "args": [], + "changed": 50881, + "percent": 4.782947922541831, + "geometrySha256": "7452fa48ad878ba67b85bcacc52a93cd5b6036616f3734f6615d787d815c36c3", + "pngSha256": "7896d781f7c5cacda0ec3b59689ceedf3926f92191cbd166a8686ffdfb43c727" + }, + { + "label": "no-lcd", + "args": [ + "--disable-lcd-text" + ], + "changed": 30977, + "percent": 2.911919533746945, + "geometrySha256": "7452fa48ad878ba67b85bcacc52a93cd5b6036616f3734f6615d787d815c36c3", + "pngSha256": "c34d66a2927e8110a3f2add7096db89db1d2f4d6cb6211318d32134508f36cdc" + }, + { + "label": "no-hint", + "args": [ + "--font-render-hinting=none" + ], + "changed": 50881, + "percent": 4.782947922541831, + "geometrySha256": "7452fa48ad878ba67b85bcacc52a93cd5b6036616f3734f6615d787d815c36c3", + "pngSha256": "7896d781f7c5cacda0ec3b59689ceedf3926f92191cbd166a8686ffdfb43c727" + }, + { + "label": "no-lcd-no-hint", + "args": [ + "--disable-lcd-text", + "--font-render-hinting=none" + ], + "changed": 30977, + "percent": 2.911919533746945, + "geometrySha256": "7452fa48ad878ba67b85bcacc52a93cd5b6036616f3734f6615d787d815c36c3", + "pngSha256": "c34d66a2927e8110a3f2add7096db89db1d2f4d6cb6211318d32134508f36cdc" + } + ], + "repeatedProbes": [ + { + "label": "default", + "args": [], + "changed": 50881, + "percent": 4.782947922541831, + "geometrySha256": "7452fa48ad878ba67b85bcacc52a93cd5b6036616f3734f6615d787d815c36c3", + "pngSha256": "7896d781f7c5cacda0ec3b59689ceedf3926f92191cbd166a8686ffdfb43c727" + }, + { + "label": "no-lcd", + "args": [ + "--disable-lcd-text" + ], + "changed": 30977, + "percent": 2.911919533746945, + "geometrySha256": "7452fa48ad878ba67b85bcacc52a93cd5b6036616f3734f6615d787d815c36c3", + "pngSha256": "c34d66a2927e8110a3f2add7096db89db1d2f4d6cb6211318d32134508f36cdc" + }, + { + "label": "no-hint", + "args": [ + "--font-render-hinting=none" + ], + "changed": 50881, + "percent": 4.782947922541831, + "geometrySha256": "7452fa48ad878ba67b85bcacc52a93cd5b6036616f3734f6615d787d815c36c3", + "pngSha256": "7896d781f7c5cacda0ec3b59689ceedf3926f92191cbd166a8686ffdfb43c727" + }, + { + "label": "no-lcd-no-hint", + "args": [ + "--disable-lcd-text", + "--font-render-hinting=none" + ], + "changed": 30977, + "percent": 2.911919533746945, + "geometrySha256": "7452fa48ad878ba67b85bcacc52a93cd5b6036616f3734f6615d787d815c36c3", + "pngSha256": "c34d66a2927e8110a3f2add7096db89db1d2f4d6cb6211318d32134508f36cdc" + } + ], + "repeatIdentical": true, + "defaultProbeMatchesHarness": true, + "geometryIdentical": true, + "textBoxes": [ + { + "id": "833:3646", + "text": "Zero Config\nZero FOUC\nZero Runtime\nCSS in JS Preprocessor", + "source": { + "x": 16, + "y": 90, + "width": 328, + "height": 245, + "font": { + "family": "Pretendard", + "style": "ExtraBold" + }, + "fontSize": 38, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "Zero Config\nZero FOUC\nZero Runtime\nCSS in JS Preprocessor", + "x": 16, + "y": 90, + "width": 328, + "height": 245, + "font": "800 38px / 49px Pretendard", + "spacing": "-1.14px", + "align": "center", + "lines": [ + { + "y": 92, + "x": 78.828125, + "right": 281.171875, + "text": "Zero Config" + }, + { + "y": 141, + "x": 86.125, + "right": 273.859375, + "text": "Zero FOUC" + }, + { + "y": 190, + "x": 64.546875, + "right": 295.4375, + "text": "Zero Runtime" + }, + { + "y": 239, + "x": 98.984375, + "right": 261, + "text": "CSS in JS " + }, + { + "y": 288, + "x": 64.015625, + "right": 295.96875, + "text": "Preprocessor" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 5749 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 5512 + } + }, + { + "id": "833:3647", + "text": "Building the Future of CSS-in-JS
Analyze all possible scenarios at the fastest speed and style with optimal performance.", + "source": { + "x": 16, + "y": 359, + "width": 328, + "height": 69, + "font": { + "family": "Pretendard", + "style": "Regular" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "Building the Future of CSS-in-JS\nAnalyze all possible scenarios at the fastest speed and style with optimal performance.", + "x": 16, + "y": 359, + "width": 328, + "height": 69, + "font": "18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "center", + "lines": [ + { + "y": 360, + "x": 58.578125, + "right": 301.421875, + "text": "Building the Future of CSS-in-JS" + }, + { + "y": 383, + "x": 17.109375, + "right": 342.875, + "text": "Analyze all possible scenarios at the fastest " + }, + { + "y": 406, + "x": 19.59375, + "right": 340.40625, + "text": "speed and style with optimal performance." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 4986 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 4986 + } + }, + { + "id": "833:3654", + "text": "Star", + "source": { + "x": 80.5, + "y": 575, + "width": 31, + "height": 22, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 17, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Star", + "x": 81.421875, + "y": 575, + "width": 30.421875, + "height": 22, + "font": "600 17px / 22px Pretendard", + "spacing": "-0.51px", + "align": "start", + "lines": [ + { + "y": 576, + "x": 81.421875, + "right": 111.84375, + "text": "Star" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 238 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 179 + } + }, + { + "id": "833:3656", + "text": "36", + "source": { + "x": 147.5, + "y": 575, + "width": 21, + "height": 22, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 17, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "36", + "x": 147.84375, + "y": 575, + "width": 20.484375, + "height": 22, + "font": "600 17px / 22px Pretendard", + "spacing": "-0.51px", + "align": "center", + "lines": [ + { + "y": 576, + "x": 147.84375, + "right": 168.328125, + "text": "36" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 102 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 102 + } + }, + { + "id": "833:3660", + "text": "Sponsor", + "source": { + "x": 246.5, + "y": 575, + "width": 63, + "height": 22, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 17, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Sponsor", + "x": 246.328125, + "y": 575, + "width": 62.234375, + "height": 22, + "font": "600 17px / 22px Pretendard", + "spacing": "-0.51px", + "align": "start", + "lines": [ + { + "y": 576, + "x": 246.328125, + "right": 308.5625, + "text": "Sponsor" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 333 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 333 + } + }, + { + "id": "833:3664", + "text": "Comparison Bechmarks", + "source": { + "x": 30, + "y": 888, + "width": 300, + "height": 36, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 28, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Comparison Bechmarks", + "x": 30.765625, + "y": 888, + "width": 298.453125, + "height": 36, + "font": "700 28px / 36px Pretendard", + "spacing": "-0.84px", + "align": "start", + "lines": [ + { + "y": 889, + "x": 30.765625, + "right": 329.21875, + "text": "Comparison Bechmarks" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1837 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 1837 + } + }, + { + "id": "833:3665", + "text": "Next.js Build Time and Build Size \n(github action - ubuntu-latest)", + "source": { + "x": 16, + "y": 940, + "width": 328, + "height": 42, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "Next.js Build Time and Build Size \n(github action - ubuntu-latest)", + "x": 16, + "y": 940, + "width": 328, + "height": 42, + "font": "500 16px / 21px Pretendard", + "spacing": "-0.48px", + "align": "center", + "lines": [ + { + "y": 941, + "x": 68.125, + "right": 291.859375, + "text": "Next.js Build Time and Build Size " + }, + { + "y": 962, + "x": 77, + "right": 282.984375, + "text": "(github action - ubuntu-latest)" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 2503 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 2503 + } + }, + { + "id": "833:3673", + "text": "Devup-ui", + "source": { + "x": 40, + "y": 1036, + "width": 97, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Devup-ui", + "x": 40, + "y": 1036, + "width": 96.21875, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1037, + "x": 40, + "right": 136.21875, + "text": "Devup-ui" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 470 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 470 + } + }, + { + "id": "833:3674", + "text": "1.0.18", + "source": { + "x": 40, + "y": 1075, + "width": 38, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "1.0.18", + "x": 40, + "y": 1075, + "width": 96.21875, + "height": 21, + "font": "500 16px / 21px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 1076, + "x": 40, + "right": 76.828125, + "text": "1.0.18" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 203 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 203 + } + }, + { + "id": "833:3677", + "text": "Next.js Build TIme ", + "source": { + "x": 217, + "y": 1036, + "width": 103, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Next.js Build TIme", + "x": 217.109375, + "y": 1036, + "width": 102.890625, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1037, + "x": 217.109375, + "right": 320, + "text": "Next.js Build TIme" + }, + { + "y": 0, + "x": 0, + "right": 0, + "text": " " + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 738 + }, + "best": { + "dx": 0, + "dy": -1, + "changed": 554 + } + }, + { + "id": "833:3681", + "text": "18.2s", + "source": { + "x": 252, + "y": 1060, + "width": 68, + "height": 36, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 28, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "18.2s", + "x": 253.53125, + "y": 1060, + "width": 66.46875, + "height": 36, + "font": "700 28px / 36px Pretendard", + "spacing": "-0.84px", + "align": "start", + "lines": [ + { + "y": 1061, + "x": 253.53125, + "right": 320, + "text": "18.2s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 485 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 237 + } + }, + { + "id": "833:3683", + "text": "Bulid Size", + "source": { + "x": 263, + "y": 1116, + "width": 57, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 264.3125, + "y": 1116, + "width": 55.6875, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1117, + "x": 264.3125, + "right": 320, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 487 + }, + "best": { + "dx": 2, + "dy": -1, + "changed": 350 + } + }, + { + "id": "833:3687", + "text": "54.7MB", + "source": { + "x": 222, + "y": 1140, + "width": 98, + "height": 36, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 28, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "54.7MB", + "x": 223.625, + "y": 1140, + "width": 96.375, + "height": 36, + "font": "700 28px / 36px Pretendard", + "spacing": "-0.84px", + "align": "start", + "lines": [ + { + "y": 1141, + "x": 223.625, + "right": 320, + "text": "54.7MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 790 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 328 + } + }, + { + "id": "833:3690", + "text": "Chakra UI", + "source": { + "x": 40, + "y": 1244, + "width": 77, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Chakra UI", + "x": 40, + "y": 1244, + "width": 76.375, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 40, + "right": 116.375, + "text": "Chakra UI" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 286 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 286 + } + }, + { + "id": "833:3691", + "text": "3.27.0", + "source": { + "x": 40, + "y": 1275, + "width": 42, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "3.27.0", + "x": 40, + "y": 1275, + "width": 76.375, + "height": 21, + "font": "500 16px / 21px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 1276, + "x": 40, + "right": 81.1875, + "text": "3.27.0" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 133 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 133 + } + }, + { + "id": "833:3694", + "text": "Bulid Time", + "source": { + "x": 171, + "y": 1244, + "width": 61, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 171.65625, + "y": 1244, + "width": 60.34375, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 171.65625, + "right": 232, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 408 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 229 + } + }, + { + "id": "833:3695", + "text": "29.9s", + "source": { + "x": 171, + "y": 1268, + "width": 61, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "29.9s", + "x": 172.5625, + "y": 1268, + "width": 59.4375, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1269, + "x": 172.5625, + "right": 232, + "text": "29.9s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 445 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 182 + } + }, + { + "id": "833:3697", + "text": "Bulid Size", + "source": { + "x": 175, + "y": 1319, + "width": 57, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 176.3125, + "y": 1319, + "width": 55.6875, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1320, + "x": 176.3125, + "right": 232, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 451 + }, + "best": { + "dx": 2, + "dy": -1, + "changed": 254 + } + }, + { + "id": "833:3698", + "text": "200.4MB", + "source": { + "x": 133, + "y": 1343, + "width": 99, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "200.4MB", + "x": 134.484375, + "y": 1343, + "width": 97.515625, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1344, + "x": 134.484375, + "right": 232, + "text": "200.4MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 787 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 431 + } + }, + { + "id": "833:3701", + "text": "Mui", + "source": { + "x": 292, + "y": 1244, + "width": 30, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Mui", + "x": 292, + "y": 1244, + "width": 31.8125, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 292, + "right": 320.953125, + "text": "Mui" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 148 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 148 + } + }, + { + "id": "833:3702", + "text": "7.3.2", + "source": { + "x": 292, + "y": 1275, + "width": 33, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "7.3.2", + "x": 292, + "y": 1275, + "width": 31.8125, + "height": 21, + "font": "500 16px / 21px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 1276, + "x": 292, + "right": 323.8125, + "text": "7.3.2" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 89 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 89 + } + }, + { + "id": "833:3705", + "text": "Bulid Time", + "source": { + "x": 423, + "y": 1244, + "width": 61, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 171.65625, + "y": 1244, + "width": 60.34375, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 171.65625, + "right": 232, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3706", + "text": "21.6s", + "source": { + "x": 428, + "y": 1268, + "width": 56, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "21.6s", + "x": 429.390625, + "y": 1268, + "width": 54.609375, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1269, + "x": 429.390625, + "right": 484, + "text": "21.6s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3708", + "text": "Bulid Size", + "source": { + "x": 427, + "y": 1319, + "width": 57, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 176.3125, + "y": 1319, + "width": 55.6875, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1320, + "x": 176.3125, + "right": 232, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3709", + "text": "84.3MB", + "source": { + "x": 400, + "y": 1343, + "width": 84, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "84.3MB", + "x": 400.953125, + "y": 1343, + "width": 83.046875, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1344, + "x": 400.953125, + "right": 484, + "text": "84.3MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3712", + "text": "Kuma UI", + "source": { + "x": 544, + "y": 1244, + "width": 66, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Kuma UI", + "x": 544, + "y": 1244, + "width": 64.875, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 544, + "right": 608.875, + "text": "Kuma UI" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3713", + "text": "1.5.9", + "source": { + "x": 544, + "y": 1275, + "width": 32, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "1.5.9", + "x": 544, + "y": 1275, + "width": 64.875, + "height": 21, + "font": "500 16px / 21px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 1276, + "x": 544, + "right": 575.53125, + "text": "1.5.9" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3716", + "text": "Bulid Time", + "source": { + "x": 675, + "y": 1244, + "width": 61, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 171.65625, + "y": 1244, + "width": 60.34375, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 171.65625, + "right": 232, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3717", + "text": "20.6s", + "source": { + "x": 676, + "y": 1268, + "width": 60, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "20.6s", + "x": 676.828125, + "y": 1268, + "width": 59.171875, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1269, + "x": 676.828125, + "right": 736, + "text": "20.6s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3719", + "text": "Bulid Size", + "source": { + "x": 679, + "y": 1319, + "width": 57, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 176.3125, + "y": 1319, + "width": 55.6875, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1320, + "x": 176.3125, + "right": 232, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3720", + "text": "60.3B", + "source": { + "x": 672, + "y": 1343, + "width": 64, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "60.3B", + "x": 673.46875, + "y": 1343, + "width": 62.53125, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1344, + "x": 673.46875, + "right": 736, + "text": "60.3B" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3724", + "text": "Features", + "source": { + "x": 125, + "y": 1468, + "width": 110, + "height": 36, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 28, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Features", + "x": 125.828125, + "y": 1468, + "width": 108.34375, + "height": 36, + "font": "700 28px / 36px Pretendard", + "spacing": "-0.84px", + "align": "start", + "lines": [ + { + "y": 1469, + "x": 125.828125, + "right": 234.171875, + "text": "Features" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 656 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 650 + } + }, + { + "id": "833:3725", + "text": "Devup UI offers a performance-optimized CSS-in-JS system, theme typing, \nand amazing features for faster and safer development.", + "source": { + "x": 16, + "y": 1520, + "width": 328, + "height": 84, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "Devup UI offers a performance-optimized CSS-in-JS system, theme typing, \nand amazing features for faster and safer development.", + "x": 16, + "y": 1520, + "width": 328, + "height": 84, + "font": "500 16px / 21px Pretendard", + "spacing": "-0.48px", + "align": "center", + "lines": [ + { + "y": 1521, + "x": 18.515625, + "right": 341.484375, + "text": "Devup UI offers a performance-optimized CSS-" + }, + { + "y": 1542, + "x": 83.0625, + "right": 276.921875, + "text": "in-JS system, theme typing, " + }, + { + "y": 1563, + "x": 40.078125, + "right": 323.34375, + "text": "and amazing features for faster and safer " + }, + { + "y": 1584, + "x": 133.1875, + "right": 226.8125, + "text": "development." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 4939 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 4939 + } + }, + { + "id": "833:3730", + "text": "Zero Runtime", + "source": { + "x": 88, + "y": 1654, + "width": 106, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Zero Runtime", + "x": 88, + "y": 1654, + "width": 236, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1655, + "x": 88, + "right": 193.09375, + "text": "Zero Runtime" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 605 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 605 + } + }, + { + "id": "833:3731", + "text": "A futuristic design that eliminates the root causes of performance degradation.", + "source": { + "x": 88, + "y": 1687, + "width": 236, + "height": 54, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 14, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "A futuristic design that eliminates the root causes of performance degradation.", + "x": 88, + "y": 1687, + "width": 236, + "height": 54, + "font": "500 14px / 18px Pretendard", + "spacing": "-0.42px", + "align": "start", + "lines": [ + { + "y": 1688, + "x": 88, + "right": 309.09375, + "text": "A futuristic design that eliminates the " + }, + { + "y": 1706, + "x": 88, + "right": 253.5, + "text": "root causes of performance " + }, + { + "y": 1724, + "x": 88, + "right": 163.859375, + "text": "degradation." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 2602 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 2602 + } + }, + { + "id": "833:3735", + "text": "Top Performance", + "source": { + "x": 88, + "y": 1797, + "width": 136, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Top Performance", + "x": 88, + "y": 1797, + "width": 236, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1798, + "x": 88, + "right": 223.359375, + "text": "Top Performance" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 719 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 719 + } + }, + { + "id": "833:3736", + "text": "The fastest build speed and the smallest bundle size among CSS-in-JS solutions.", + "source": { + "x": 88, + "y": 1830, + "width": 236, + "height": 54, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 14, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "The fastest build speed and the smallest bundle size among CSS-in-JS solutions.", + "x": 88, + "y": 1830, + "width": 236, + "height": 54, + "font": "500 14px / 18px Pretendard", + "spacing": "-0.42px", + "align": "start", + "lines": [ + { + "y": 1831, + "x": 88, + "right": 276.234375, + "text": "The fastest build speed and the " + }, + { + "y": 1849, + "x": 88, + "right": 318.890625, + "text": "smallest bundle size among CSS-in-JS " + }, + { + "y": 1867, + "x": 88, + "right": 145.15625, + "text": "solutions." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 2628 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 2628 + } + }, + { + "id": "833:3740", + "text": "Type Safety", + "source": { + "x": 88, + "y": 1940, + "width": 94, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Type Safety", + "x": 88, + "y": 1940, + "width": 236, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1941, + "x": 88, + "right": 181.34375, + "text": "Type Safety" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 512 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 512 + } + }, + { + "id": "833:3741", + "text": "Enhanced DX with typing-based support.", + "source": { + "x": 88, + "y": 1973, + "width": 236, + "height": 36, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 14, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "Enhanced DX with typing-based support.", + "x": 88, + "y": 1973, + "width": 236, + "height": 36, + "font": "500 14px / 18px Pretendard", + "spacing": "-0.42px", + "align": "start", + "lines": [ + { + "y": 1974, + "x": 88, + "right": 280.890625, + "text": "Enhanced DX with typing-based " + }, + { + "y": 1992, + "x": 88, + "right": 138.359375, + "text": "support." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1399 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 1399 + } + }, + { + "id": "833:3745", + "text": "Figma Plugin", + "source": { + "x": 88, + "y": 2065, + "width": 101, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Figma Plugin", + "x": 88, + "y": 2065, + "width": 236, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 2066, + "x": 88, + "right": 188.171875, + "text": "Figma Plugin" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 590 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 590 + } + }, + { + "id": "833:3746", + "text": "A Figma plugin enabling safer and faster development.\r", + "source": { + "x": 88, + "y": 2098, + "width": 236, + "height": 36, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 14, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "A Figma plugin enabling safer and faster development.\n", + "x": 88, + "y": 2098, + "width": 236, + "height": 36, + "font": "500 14px / 18px Pretendard", + "spacing": "-0.42px", + "align": "start", + "lines": [ + { + "y": 2099, + "x": 88, + "right": 289, + "text": "A Figma plugin enabling safer and " + }, + { + "y": 2117, + "x": 88, + "right": 207.53125, + "text": "faster development." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1842 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 1842 + } + }, + { + "id": "833:3770", + "text": "Join our community", + "source": { + "x": 56, + "y": 2274, + "width": 248, + "height": 36, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 28, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "Join our community", + "x": 56, + "y": 2274, + "width": 248, + "height": 36, + "font": "700 28px / 36px Pretendard", + "spacing": "-0.84px", + "align": "center", + "lines": [ + { + "y": 2275, + "x": 57.03125, + "right": 302.96875, + "text": "Join our community" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1442 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 1442 + } + }, + { + "id": "833:3771", + "text": "Join our Discord and help build the future of frontend with \nCSS-in-JS!\r", + "source": { + "x": 56, + "y": 2326, + "width": 248, + "height": 81, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "Join our Discord and help build the future of frontend with \nCSS-in-JS!\n", + "x": 56, + "y": 2326, + "width": 248, + "height": 81, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "center", + "lines": [ + { + "y": 2329, + "x": 62.28125, + "right": 301.578125, + "text": "Join our Discord and help build " + }, + { + "y": 2356, + "x": 77.34375, + "right": 282.65625, + "text": "the future of frontend with " + }, + { + "y": 2383, + "x": 137.484375, + "right": 222.515625, + "text": "CSS-in-JS!" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 3084 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 3084 + } + }, + { + "id": "833:3782", + "text": "Features", + "source": { + "x": 200, + "y": 2926, + "width": 65, + "height": 20, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 14, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "Features", + "x": 125.828125, + "y": 1468, + "width": 108.34375, + "height": 36, + "font": "700 28px / 36px Pretendard", + "spacing": "-0.84px", + "align": "start", + "lines": [ + { + "y": 1469, + "x": 125.828125, + "right": 234.171875, + "text": "Features" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3817", + "text": "상호: (주)데브파이브 | 대표자명: 오정민 | \n사업자등록번호: 868-86-03159\n주소: 경기 고양시 덕양구 마상로140번길 81 4층", + "source": { + "x": 30, + "y": 2849, + "width": 300, + "height": 42, + "font": { + "family": "Pretendard", + "style": "Light" + }, + "fontSize": 11, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "상호: (주)데브파이브 | 대표자명: 오정민 | \n사업자등록번호: 868-86-03159\n주소: 경기 고양시 덕양구 마상로140번길 81 4층", + "x": 30, + "y": 2849, + "width": 300, + "height": 42, + "font": "300 11px / 14px Pretendard", + "spacing": "-0.33px", + "align": "right", + "lines": [ + { + "y": 2849, + "x": 161.5, + "right": 330, + "text": "상호: (주)데브파이브 | 대표자명: 오정민 | " + }, + { + "y": 2863, + "x": 191.90625, + "right": 330, + "text": "사업자등록번호: 868-86-03159" + }, + { + "y": 2877, + "x": 133.15625, + "right": 330, + "text": "주소: 경기 고양시 덕양구 마상로140번길 81 4층" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 3012 + }, + "best": { + "dx": 0, + "dy": -1, + "changed": 2040 + } + }, + { + "id": "833:3818", + "text": "Copyright © 2021-2024 데브파이브. All Rights Reserved.\r", + "source": { + "x": 30, + "y": 2901, + "width": 300, + "height": 14, + "font": { + "family": "Pretendard", + "style": "Light" + }, + "fontSize": 11, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "Copyright © 2021-2024 데브파이브. All Rights Reserved.\n", + "x": 30, + "y": 2901, + "width": 300, + "height": 14, + "font": "300 11px / 14px Pretendard", + "spacing": "-0.33px", + "align": "right", + "lines": [ + { + "y": 2901, + "x": 79.0625, + "right": 330, + "text": "Copyright © 2021-2024 데브파이브. All Rights Reserved." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1377 + }, + "best": { + "dx": 3, + "dy": -1, + "changed": 485 + } + }, + { + "id": "833:3958", + "text": "Kuma UI", + "source": { + "x": 796, + "y": 1244, + "width": 66, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Kuma UI", + "x": 544, + "y": 1244, + "width": 64.875, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 544, + "right": 608.875, + "text": "Kuma UI" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3959", + "text": "1.5.9", + "source": { + "x": 796, + "y": 1275, + "width": 32, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "1.5.9", + "x": 544, + "y": 1275, + "width": 64.875, + "height": 21, + "font": "500 16px / 21px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 1276, + "x": 544, + "right": 575.53125, + "text": "1.5.9" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3962", + "text": "Bulid Time", + "source": { + "x": 927, + "y": 1244, + "width": 61, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 171.65625, + "y": 1244, + "width": 60.34375, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 171.65625, + "right": 232, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3963", + "text": "20.6s", + "source": { + "x": 928, + "y": 1268, + "width": 60, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "20.6s", + "x": 676.828125, + "y": 1268, + "width": 59.171875, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1269, + "x": 676.828125, + "right": 736, + "text": "20.6s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3965", + "text": "Bulid Size", + "source": { + "x": 931, + "y": 1319, + "width": 57, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 176.3125, + "y": 1319, + "width": 55.6875, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1320, + "x": 176.3125, + "right": 232, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3966", + "text": "60.3B", + "source": { + "x": 924, + "y": 1343, + "width": 64, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "60.3B", + "x": 673.46875, + "y": 1343, + "width": 62.53125, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1344, + "x": 673.46875, + "right": 736, + "text": "60.3B" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3969", + "text": "Kuma UI", + "source": { + "x": 1048, + "y": 1244, + "width": 66, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Kuma UI", + "x": 544, + "y": 1244, + "width": 64.875, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 544, + "right": 608.875, + "text": "Kuma UI" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3970", + "text": "1.5.9", + "source": { + "x": 1048, + "y": 1275, + "width": 32, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "1.5.9", + "x": 544, + "y": 1275, + "width": 64.875, + "height": 21, + "font": "500 16px / 21px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 1276, + "x": 544, + "right": 575.53125, + "text": "1.5.9" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3973", + "text": "Bulid Time", + "source": { + "x": 1179, + "y": 1244, + "width": 61, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 171.65625, + "y": 1244, + "width": 60.34375, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 171.65625, + "right": 232, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3974", + "text": "20.6s", + "source": { + "x": 1180, + "y": 1268, + "width": 60, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "20.6s", + "x": 676.828125, + "y": 1268, + "width": 59.171875, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1269, + "x": 676.828125, + "right": 736, + "text": "20.6s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3976", + "text": "Bulid Size", + "source": { + "x": 1183, + "y": 1319, + "width": 57, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 176.3125, + "y": 1319, + "width": 55.6875, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1320, + "x": 176.3125, + "right": 232, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3977", + "text": "60.3B", + "source": { + "x": 1176, + "y": 1343, + "width": 64, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "60.3B", + "x": 673.46875, + "y": 1343, + "width": 62.53125, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1344, + "x": 673.46875, + "right": 736, + "text": "60.3B" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3980", + "text": "Kuma UI", + "source": { + "x": 1300, + "y": 1244, + "width": 66, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Kuma UI", + "x": 544, + "y": 1244, + "width": 64.875, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 544, + "right": 608.875, + "text": "Kuma UI" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3981", + "text": "1.5.9", + "source": { + "x": 1300, + "y": 1275, + "width": 32, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "1.5.9", + "x": 544, + "y": 1275, + "width": 64.875, + "height": 21, + "font": "500 16px / 21px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 1276, + "x": 544, + "right": 575.53125, + "text": "1.5.9" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3984", + "text": "Bulid Time", + "source": { + "x": 1431, + "y": 1244, + "width": 61, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 171.65625, + "y": 1244, + "width": 60.34375, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 171.65625, + "right": 232, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3985", + "text": "20.6s", + "source": { + "x": 1432, + "y": 1268, + "width": 60, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "20.6s", + "x": 676.828125, + "y": 1268, + "width": 59.171875, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1269, + "x": 676.828125, + "right": 736, + "text": "20.6s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3987", + "text": "Bulid Size", + "source": { + "x": 1435, + "y": 1319, + "width": 57, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 176.3125, + "y": 1319, + "width": 55.6875, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1320, + "x": 176.3125, + "right": 232, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3988", + "text": "60.3B", + "source": { + "x": 1428, + "y": 1343, + "width": 64, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "60.3B", + "x": 673.46875, + "y": 1343, + "width": 62.53125, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1344, + "x": 673.46875, + "right": 736, + "text": "60.3B" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3991", + "text": "Kuma UI", + "source": { + "x": 1552, + "y": 1244, + "width": 66, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Kuma UI", + "x": 544, + "y": 1244, + "width": 64.875, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 544, + "right": 608.875, + "text": "Kuma UI" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3992", + "text": "1.5.9", + "source": { + "x": 1552, + "y": 1275, + "width": 32, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "1.5.9", + "x": 544, + "y": 1275, + "width": 64.875, + "height": 21, + "font": "500 16px / 21px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 1276, + "x": 544, + "right": 575.53125, + "text": "1.5.9" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3995", + "text": "Bulid Time", + "source": { + "x": 1683, + "y": 1244, + "width": 61, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 171.65625, + "y": 1244, + "width": 60.34375, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 171.65625, + "right": 232, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3996", + "text": "20.6s", + "source": { + "x": 1684, + "y": 1268, + "width": 60, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "20.6s", + "x": 676.828125, + "y": 1268, + "width": 59.171875, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1269, + "x": 676.828125, + "right": 736, + "text": "20.6s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3998", + "text": "Bulid Size", + "source": { + "x": 1687, + "y": 1319, + "width": 57, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 176.3125, + "y": 1319, + "width": 55.6875, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1320, + "x": 176.3125, + "right": 232, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3999", + "text": "60.3B", + "source": { + "x": 1680, + "y": 1343, + "width": 64, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "60.3B", + "x": 673.46875, + "y": 1343, + "width": 62.53125, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1344, + "x": 673.46875, + "right": 736, + "text": "60.3B" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "I833:3648;41:483", + "text": "Get started", + "source": { + "x": 134, + "y": 485, + "width": 88, + "height": 22, + "font": { + "family": "Pretendard", + "style": "ExtraBold" + }, + "fontSize": 17, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Get started", + "x": 134.640625, + "y": 485, + "width": 86.703125, + "height": 22, + "font": "800 17px / 22px Pretendard", + "spacing": "-0.51px", + "align": "start", + "lines": [ + { + "y": 486, + "x": 134.640625, + "right": 221.34375, + "text": "Get started" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 562 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 507 + } + }, + { + "id": "I833:3747;793:6647", + "text": "Go Figma Community", + "source": { + "x": 491, + "y": 2073, + "width": 149, + "height": 24, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Go Figma Community", + "x": 492, + "y": 2074, + "width": 79.421875, + "height": 48, + "font": "500 16px / 24px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 2076, + "x": 492, + "right": 557.0625, + "text": "Go Figma " + }, + { + "y": 2100, + "x": 492, + "right": 571.421875, + "text": "Community" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "I833:3773;51:267", + "text": "Open KakaoTalk", + "source": { + "x": 107, + "y": 2504, + "width": 123, + "height": 22, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 17, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Open KakaoTalk", + "x": 108.03125, + "y": 2504, + "width": 121.96875, + "height": 22, + "font": "700 17px / 22px Pretendard", + "spacing": "-0.51px", + "align": "start", + "lines": [ + { + "y": 2505, + "x": 108.03125, + "right": 230, + "text": "Open KakaoTalk" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 768 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 473 + } + }, + { + "id": "I833:3774;51:267", + "text": "Join our Discord", + "source": { + "x": 107, + "y": 2570, + "width": 123, + "height": 22, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 17, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Join our Discord", + "x": 107.875, + "y": 2570, + "width": 122.125, + "height": 22, + "font": "700 17px / 22px Pretendard", + "spacing": "-0.51px", + "align": "start", + "lines": [ + { + "y": 2571, + "x": 107.875, + "right": 230, + "text": "Join our Discord" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 871 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 523 + } + } + ] + }, + "landing-833-3322": { + "referenceSha256": "f3eebec1a9e5f574922b4f616d08abae92f9cada366213d4ac4d748553bd96a9", + "actualSha256": "619165013992405a3bf47132235f2e735ff2a1ec39686b79d4c61bfa1d0bf279", + "probes": [ + { + "label": "default", + "args": [], + "changed": 72515, + "percent": 2.466255006312307, + "geometrySha256": "9bb35fa8b23b7e1fde546c092f707b8e59095e7506403b6fccc95f90eef0e9c4", + "pngSha256": "619165013992405a3bf47132235f2e735ff2a1ec39686b79d4c61bfa1d0bf279" + }, + { + "label": "no-lcd", + "args": [ + "--disable-lcd-text" + ], + "changed": 47333, + "percent": 1.6098082908885116, + "geometrySha256": "9bb35fa8b23b7e1fde546c092f707b8e59095e7506403b6fccc95f90eef0e9c4", + "pngSha256": "1c707d32bcd28fdc9f5428ab60b08fb6c76698970bc5c6dd8130973f9a73ebb4" + }, + { + "label": "no-hint", + "args": [ + "--font-render-hinting=none" + ], + "changed": 72515, + "percent": 2.466255006312307, + "geometrySha256": "9bb35fa8b23b7e1fde546c092f707b8e59095e7506403b6fccc95f90eef0e9c4", + "pngSha256": "619165013992405a3bf47132235f2e735ff2a1ec39686b79d4c61bfa1d0bf279" + }, + { + "label": "no-lcd-no-hint", + "args": [ + "--disable-lcd-text", + "--font-render-hinting=none" + ], + "changed": 47333, + "percent": 1.6098082908885116, + "geometrySha256": "9bb35fa8b23b7e1fde546c092f707b8e59095e7506403b6fccc95f90eef0e9c4", + "pngSha256": "1c707d32bcd28fdc9f5428ab60b08fb6c76698970bc5c6dd8130973f9a73ebb4" + } + ], + "repeatedProbes": [ + { + "label": "default", + "args": [], + "changed": 72515, + "percent": 2.466255006312307, + "geometrySha256": "9bb35fa8b23b7e1fde546c092f707b8e59095e7506403b6fccc95f90eef0e9c4", + "pngSha256": "619165013992405a3bf47132235f2e735ff2a1ec39686b79d4c61bfa1d0bf279" + }, + { + "label": "no-lcd", + "args": [ + "--disable-lcd-text" + ], + "changed": 47333, + "percent": 1.6098082908885116, + "geometrySha256": "9bb35fa8b23b7e1fde546c092f707b8e59095e7506403b6fccc95f90eef0e9c4", + "pngSha256": "1c707d32bcd28fdc9f5428ab60b08fb6c76698970bc5c6dd8130973f9a73ebb4" + }, + { + "label": "no-hint", + "args": [ + "--font-render-hinting=none" + ], + "changed": 72515, + "percent": 2.466255006312307, + "geometrySha256": "9bb35fa8b23b7e1fde546c092f707b8e59095e7506403b6fccc95f90eef0e9c4", + "pngSha256": "619165013992405a3bf47132235f2e735ff2a1ec39686b79d4c61bfa1d0bf279" + }, + { + "label": "no-lcd-no-hint", + "args": [ + "--disable-lcd-text", + "--font-render-hinting=none" + ], + "changed": 47333, + "percent": 1.6098082908885116, + "geometrySha256": "9bb35fa8b23b7e1fde546c092f707b8e59095e7506403b6fccc95f90eef0e9c4", + "pngSha256": "1c707d32bcd28fdc9f5428ab60b08fb6c76698970bc5c6dd8130973f9a73ebb4" + } + ], + "repeatIdentical": true, + "defaultProbeMatchesHarness": true, + "geometryIdentical": true, + "textBoxes": [ + { + "id": "833:3328", + "text": "Zero Config\nZero FOUC\nZero Runtime\nCSS in JS Preprocessor", + "source": { + "x": 40, + "y": 250, + "width": 551, + "height": 272, + "font": { + "family": "Pretendard", + "style": "ExtraBold" + }, + "fontSize": 52, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Zero Config\nZero FOUC\nZero Runtime\nCSS in JS Preprocessor", + "x": 40, + "y": 250, + "width": 912, + "height": 272, + "font": "800 52px / 68px Pretendard", + "spacing": "-1.56px", + "align": "start", + "lines": [ + { + "y": 253, + "x": 40, + "right": 316.890625, + "text": "Zero Config" + }, + { + "y": 321, + "x": 40, + "right": 296.90625, + "text": "Zero FOUC" + }, + { + "y": 389, + "x": 40, + "right": 355.953125, + "text": "Zero Runtime" + }, + { + "y": 457, + "x": 40, + "right": 589.171875, + "text": "CSS in JS Preprocessor" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1775 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 1775 + } + }, + { + "id": "833:3329", + "text": "Building the Future of CSS-in-JS
Analyze all possible scenarios at the fastest speed and style with optimal performance.", + "source": { + "x": 40, + "y": 546, + "width": 869, + "height": 62, + "font": { + "family": "Pretendard", + "style": "Regular" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Building the Future of CSS-in-JS\nAnalyze all possible scenarios at the fastest speed and style with optimal performance.", + "x": 40, + "y": 546, + "width": 912, + "height": 62, + "font": "24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 547, + "x": 40, + "right": 363.796875, + "text": "Building the Future of CSS-in-JS" + }, + { + "y": 578, + "x": 40, + "right": 907.375, + "text": "Analyze all possible scenarios at the fastest speed and style with optimal performance." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 6488 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 6488 + } + }, + { + "id": "833:3336", + "text": "Star", + "source": { + "x": 90, + "y": 756.5, + "width": 33, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Star", + "x": 90, + "y": 756.5, + "width": 32.21875, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 757.5, + "x": 90, + "right": 122.21875, + "text": "Star" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 245 + }, + "best": { + "dx": 0, + "dy": 1, + "changed": 236 + } + }, + { + "id": "833:3338", + "text": "36", + "source": { + "x": 159, + "y": 756.5, + "width": 23, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "36", + "x": 158.21875, + "y": 756.5, + "width": 21.6875, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "center", + "lines": [ + { + "y": 757.5, + "x": 158.21875, + "right": 179.90625, + "text": "36" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 164 + }, + "best": { + "dx": -1, + "dy": 0, + "changed": 127 + } + }, + { + "id": "833:3342", + "text": "Sponsor", + "source": { + "x": 260, + "y": 756.5, + "width": 67, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Sponsor", + "x": 257.90625, + "y": 756.5, + "width": 65.890625, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 757.5, + "x": 257.90625, + "right": 323.796875, + "text": "Sponsor" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 655 + }, + "best": { + "dx": -2, + "dy": 1, + "changed": 473 + } + }, + { + "id": "833:3346", + "text": "Comparison Bechmarks", + "source": { + "x": 40, + "y": 940, + "width": 385, + "height": 47, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 36, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Comparison Bechmarks", + "x": 40, + "y": 940, + "width": 805, + "height": 47, + "font": "700 36px / 47px Pretendard", + "spacing": "-1.08px", + "align": "start", + "lines": [ + { + "y": 942, + "x": 40, + "right": 423.71875, + "text": "Comparison Bechmarks" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 2059 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 2059 + } + }, + { + "id": "833:3347", + "text": "Next.js Build Time and Build Size (github action - ubuntu-latest)", + "source": { + "x": 40, + "y": 1003, + "width": 484, + "height": 27, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Next.js Build Time and Build Size (github action - ubuntu-latest)", + "x": 40, + "y": 1003, + "width": 805, + "height": 27, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1006, + "x": 40, + "right": 523.421875, + "text": "Next.js Build Time and Build Size (github action - ubuntu-latest)" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 2912 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 2912 + } + }, + { + "id": "833:3355", + "text": "Devup-ui", + "source": { + "x": 70, + "y": 1090, + "width": 124, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Devup-ui", + "x": 70, + "y": 1090, + "width": 122.734375, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1091, + "x": 70, + "right": 192.734375, + "text": "Devup-ui" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 722 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 722 + } + }, + { + "id": "833:3356", + "text": "1.0.18", + "source": { + "x": 70, + "y": 1137, + "width": 42, + "height": 27, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "1.0.18", + "x": 70, + "y": 1137, + "width": 122.734375, + "height": 27, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1140, + "x": 70, + "right": 111.421875, + "text": "1.0.18" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 237 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 237 + } + }, + { + "id": "833:3359", + "text": "Next.js Build TIme ", + "source": { + "x": 803, + "y": 1090, + "width": 119, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Next.js Build TIme", + "x": 803.28125, + "y": 1090, + "width": 118.71875, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1091, + "x": 803.28125, + "right": 922, + "text": "Next.js Build TIme" + }, + { + "y": 0, + "x": 0, + "right": 0, + "text": " " + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 911 + }, + "best": { + "dx": 0, + "dy": -1, + "changed": 659 + } + }, + { + "id": "833:3363", + "text": "18.2s", + "source": { + "x": 835, + "y": 1117, + "width": 87, + "height": 47, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 36, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "18.2s", + "x": 836.546875, + "y": 1117, + "width": 85.453125, + "height": 47, + "font": "700 36px / 47px Pretendard", + "spacing": "-1.08px", + "align": "start", + "lines": [ + { + "y": 1119, + "x": 836.546875, + "right": 922, + "text": "18.2s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 667 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 286 + } + }, + { + "id": "833:3365", + "text": "Bulid Size", + "source": { + "x": 857, + "y": 1184, + "width": 65, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 857.734375, + "y": 1184, + "width": 64.265625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1185, + "x": 857.734375, + "right": 922, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 554 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 342 + } + }, + { + "id": "833:3369", + "text": "54.7MB", + "source": { + "x": 797, + "y": 1211, + "width": 125, + "height": 47, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 36, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "54.7MB", + "x": 798.09375, + "y": 1211, + "width": 123.90625, + "height": 47, + "font": "700 36px / 47px Pretendard", + "spacing": "-1.08px", + "align": "start", + "lines": [ + { + "y": 1213, + "x": 798.09375, + "right": 922, + "text": "54.7MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 866 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 208 + } + }, + { + "id": "833:3407", + "text": "Features", + "source": { + "x": 40, + "y": 1706, + "width": 141, + "height": 47, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 36, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Features", + "x": 40, + "y": 1706, + "width": 912, + "height": 47, + "font": "700 36px / 47px Pretendard", + "spacing": "-1.08px", + "align": "start", + "lines": [ + { + "y": 1708, + "x": 40, + "right": 179.28125, + "text": "Features" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 804 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 804 + } + }, + { + "id": "833:3408", + "text": "Devup UI offers a performance-optimized CSS-in-JS system, theme typing, \nand amazing features for faster and safer development.", + "source": { + "x": 40, + "y": 1769, + "width": 582, + "height": 54, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Devup UI offers a performance-optimized CSS-in-JS system, theme typing,\nand amazing features for faster and safer development.", + "x": 40, + "y": 1769, + "width": 912, + "height": 54, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1772, + "x": 40, + "right": 617.78125, + "text": "Devup UI offers a performance-optimized CSS-in-JS system, theme typing, " + }, + { + "y": 1799, + "x": 40, + "right": 464, + "text": "and amazing features for faster and safer development." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 5291 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 5291 + } + }, + { + "id": "833:3414", + "text": "Zero Runtime", + "source": { + "x": 70, + "y": 1945, + "width": 141, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Zero Runtime", + "x": 70, + "y": 1945, + "width": 388, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1946, + "x": 70, + "right": 210.109375, + "text": "Zero Runtime" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 787 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 787 + } + }, + { + "id": "833:3415", + "text": "A futuristic design that eliminates the root causes of performance degradation.", + "source": { + "x": 70, + "y": 1986, + "width": 388, + "height": 48, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "A futuristic design that eliminates the root causes of performance degradation.", + "x": 70, + "y": 1986, + "width": 388, + "height": 48, + "font": "500 16px / 24px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 1988, + "x": 70, + "right": 423.15625, + "text": "A futuristic design that eliminates the root causes of " + }, + { + "y": 2012, + "x": 70, + "right": 248.78125, + "text": "performance degradation." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 4253 + }, + "best": { + "dx": 0, + "dy": -1, + "changed": 2978 + } + }, + { + "id": "833:3419", + "text": "Top Performance", + "source": { + "x": 534, + "y": 1945, + "width": 182, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Top Performance", + "x": 534, + "y": 1945, + "width": 388, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1946, + "x": 534, + "right": 714.484375, + "text": "Top Performance" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 966 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 966 + } + }, + { + "id": "833:3420", + "text": "The fastest build speed and the smallest bundle size among CSS-in-JS solutions.", + "source": { + "x": 534, + "y": 1986, + "width": 388, + "height": 48, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "The fastest build speed and the smallest bundle size among CSS-in-JS solutions.", + "x": 534, + "y": 1986, + "width": 388, + "height": 48, + "font": "500 16px / 24px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 1988, + "x": 534, + "right": 890.296875, + "text": "The fastest build speed and the smallest bundle size " + }, + { + "y": 2012, + "x": 534, + "right": 725.453125, + "text": "among CSS-in-JS solutions." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 4352 + }, + "best": { + "dx": 0, + "dy": -1, + "changed": 3021 + } + }, + { + "id": "833:3425", + "text": "Type Safety", + "source": { + "x": 70, + "y": 2162, + "width": 126, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Type Safety", + "x": 70, + "y": 2162, + "width": 388, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 2163, + "x": 70, + "right": 194.453125, + "text": "Type Safety" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 753 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 753 + } + }, + { + "id": "833:3426", + "text": "Enhanced DX with typing-based support.", + "source": { + "x": 70, + "y": 2203, + "width": 282, + "height": 24, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Enhanced DX with typing-based support.", + "x": 70, + "y": 2203, + "width": 388, + "height": 24, + "font": "500 16px / 24px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 2205, + "x": 70, + "right": 351.40625, + "text": "Enhanced DX with typing-based support." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 2241 + }, + "best": { + "dx": 0, + "dy": -1, + "changed": 1623 + } + }, + { + "id": "833:3430", + "text": "Figma Plugin", + "source": { + "x": 534, + "y": 2162, + "width": 135, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Figma Plugin", + "x": 534, + "y": 2162, + "width": 388, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 2163, + "x": 534, + "right": 667.5625, + "text": "Figma Plugin" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 819 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 819 + } + }, + { + "id": "833:3431", + "text": "A Figma plugin enabling safer and faster development.\r", + "source": { + "x": 534, + "y": 2203, + "width": 374, + "height": 24, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "A Figma plugin enabling safer and faster development.\n", + "x": 534, + "y": 2203, + "width": 388, + "height": 24, + "font": "500 16px / 24px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 2205, + "x": 534, + "right": 903.734375, + "text": "A Figma plugin enabling safer and faster development." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 2976 + }, + "best": { + "dx": 0, + "dy": -1, + "changed": 2123 + } + }, + { + "id": "833:3455", + "text": "Join our community", + "source": { + "x": 564, + "y": 2407, + "width": 318, + "height": 47, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 36, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Join our community", + "x": 565.796875, + "y": 2407, + "width": 316.203125, + "height": 47, + "font": "700 36px / 47px Pretendard", + "spacing": "-1.08px", + "align": "start", + "lines": [ + { + "y": 2409, + "x": 565.796875, + "right": 882, + "text": "Join our community" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 3310 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 1714 + } + }, + { + "id": "833:3456", + "text": "Join our Discord and help build the future of frontend with CSS-in-JS!\r", + "source": { + "x": 347, + "y": 2470, + "width": 535, + "height": 27, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Join our Discord and help build the future of frontend with CSS-in-JS!\n", + "x": 352.390625, + "y": 2470, + "width": 529.609375, + "height": 27, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 2473, + "x": 352.390625, + "right": 882, + "text": "Join our Discord and help build the future of frontend with CSS-in-JS!" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 4925 + }, + "best": { + "dx": -3, + "dy": 0, + "changed": 4912 + } + }, + { + "id": "833:3563", + "text": "Tailwind CSS", + "source": { + "x": 850, + "y": 1338, + "width": 137, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Tailwind CSS", + "x": 850, + "y": 1338, + "width": 180, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1339, + "x": 850, + "right": 986.125, + "text": "Tailwind CSS" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 522 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 522 + } + }, + { + "id": "833:3564", + "text": "0.0.0", + "source": { + "x": 850, + "y": 1377, + "width": 39, + "height": 27, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "0.0.0", + "x": 850, + "y": 1377, + "width": 180, + "height": 27, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1380, + "x": 850, + "right": 888.234375, + "text": "0.0.0" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 158 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 158 + } + }, + { + "id": "833:3567", + "text": "Bulid Time", + "source": { + "x": 959, + "y": 1444, + "width": 71, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 180.375, + "y": 1444, + "width": 69.625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1445, + "x": 180.375, + "right": 250, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 304 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 161 + } + }, + { + "id": "833:3568", + "text": "0s", + "source": { + "x": 994, + "y": 1471, + "width": 36, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "0s", + "x": 995.8125, + "y": 1471, + "width": 34.1875, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1472, + "x": 995.8125, + "right": 1030, + "text": "0s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3570", + "text": "Bulid Size", + "source": { + "x": 965, + "y": 1530, + "width": 65, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 185.734375, + "y": 1530, + "width": 64.265625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1531, + "x": 185.734375, + "right": 250, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 207 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 120 + } + }, + { + "id": "833:3571", + "text": "0MB", + "source": { + "x": 966, + "y": 1557, + "width": 64, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "0MB", + "x": 967.296875, + "y": 1557, + "width": 62.703125, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1558, + "x": 967.296875, + "right": 1030, + "text": "0MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 204 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 91 + } + }, + { + "id": "833:3574", + "text": "panda CSS", + "source": { + "x": 1110, + "y": 1338, + "width": 117, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "panda CSS", + "x": 1110, + "y": 1338, + "width": 180, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1339, + "x": 1110, + "right": 1225.5, + "text": "panda CSS" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3575", + "text": "0.0.0", + "source": { + "x": 1110, + "y": 1377, + "width": 39, + "height": 27, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "0.0.0", + "x": 850, + "y": 1377, + "width": 180, + "height": 27, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1380, + "x": 850, + "right": 888.234375, + "text": "0.0.0" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3578", + "text": "Bulid Time", + "source": { + "x": 1219, + "y": 1444, + "width": 71, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 180.375, + "y": 1444, + "width": 69.625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1445, + "x": 180.375, + "right": 250, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3579", + "text": "0s", + "source": { + "x": 1254, + "y": 1471, + "width": 36, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "0s", + "x": 995.8125, + "y": 1471, + "width": 34.1875, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1472, + "x": 995.8125, + "right": 1030, + "text": "0s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3581", + "text": "Bulid Size", + "source": { + "x": 1225, + "y": 1530, + "width": 65, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 185.734375, + "y": 1530, + "width": 64.265625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1531, + "x": 185.734375, + "right": 250, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3582", + "text": "0MB", + "source": { + "x": 1226, + "y": 1557, + "width": 64, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "0MB", + "x": 967.296875, + "y": 1557, + "width": 62.703125, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1558, + "x": 967.296875, + "right": 1030, + "text": "0MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3585", + "text": "styleX", + "source": { + "x": 1370, + "y": 1338, + "width": 67, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "styleX", + "x": 1370, + "y": 1338, + "width": 180, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1339, + "x": 1370, + "right": 1435.515625, + "text": "styleX" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3586", + "text": "0.0.0", + "source": { + "x": 1370, + "y": 1377, + "width": 39, + "height": 27, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "0.0.0", + "x": 850, + "y": 1377, + "width": 180, + "height": 27, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1380, + "x": 850, + "right": 888.234375, + "text": "0.0.0" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3589", + "text": "Bulid Time", + "source": { + "x": 1479, + "y": 1444, + "width": 71, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 180.375, + "y": 1444, + "width": 69.625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1445, + "x": 180.375, + "right": 250, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3590", + "text": "0s", + "source": { + "x": 1514, + "y": 1471, + "width": 36, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "0s", + "x": 995.8125, + "y": 1471, + "width": 34.1875, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1472, + "x": 995.8125, + "right": 1030, + "text": "0s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3592", + "text": "Bulid Size", + "source": { + "x": 1485, + "y": 1530, + "width": 65, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 185.734375, + "y": 1530, + "width": 64.265625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1531, + "x": 185.734375, + "right": 250, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3593", + "text": "0MB", + "source": { + "x": 1486, + "y": 1557, + "width": 64, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "0MB", + "x": 967.296875, + "y": 1557, + "width": 62.703125, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1558, + "x": 967.296875, + "right": 1030, + "text": "0MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3596", + "text": "vanilla extract", + "source": { + "x": 1630, + "y": 1338, + "width": 146, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "vanilla extract", + "x": 1630, + "y": 1338, + "width": 180, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1339, + "x": 1630, + "right": 1774.609375, + "text": "vanilla extract" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3597", + "text": "0.0.0", + "source": { + "x": 1630, + "y": 1377, + "width": 39, + "height": 27, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "0.0.0", + "x": 850, + "y": 1377, + "width": 180, + "height": 27, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1380, + "x": 850, + "right": 888.234375, + "text": "0.0.0" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3600", + "text": "Bulid Time", + "source": { + "x": 1739, + "y": 1444, + "width": 71, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 180.375, + "y": 1444, + "width": 69.625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1445, + "x": 180.375, + "right": 250, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3601", + "text": "0s", + "source": { + "x": 1774, + "y": 1471, + "width": 36, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "0s", + "x": 995.8125, + "y": 1471, + "width": 34.1875, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1472, + "x": 995.8125, + "right": 1030, + "text": "0s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3603", + "text": "Bulid Size", + "source": { + "x": 1745, + "y": 1530, + "width": 65, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 185.734375, + "y": 1530, + "width": 64.265625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1531, + "x": 185.734375, + "right": 250, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3604", + "text": "0MB", + "source": { + "x": 1746, + "y": 1557, + "width": 64, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "0MB", + "x": 967.296875, + "y": 1557, + "width": 62.703125, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1558, + "x": 967.296875, + "right": 1030, + "text": "0MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3608", + "text": "Chakra UI", + "source": { + "x": 70, + "y": 1338, + "width": 103, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Chakra UI", + "x": 70, + "y": 1338, + "width": 180, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1339, + "x": 70, + "right": 171.828125, + "text": "Chakra UI" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 426 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 426 + } + }, + { + "id": "833:3609", + "text": "3.27.0", + "source": { + "x": 70, + "y": 1377, + "width": 47, + "height": 27, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "3.27.0", + "x": 70, + "y": 1377, + "width": 180, + "height": 27, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1380, + "x": 70, + "right": 116.328125, + "text": "3.27.0" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 154 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 154 + } + }, + { + "id": "833:3612", + "text": "Bulid Time", + "source": { + "x": 179, + "y": 1444, + "width": 71, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 180.375, + "y": 1444, + "width": 69.625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1445, + "x": 180.375, + "right": 250, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 590 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 305 + } + }, + { + "id": "833:3613", + "text": "29.9s", + "source": { + "x": 173, + "y": 1471, + "width": 77, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "29.9s", + "x": 174.234375, + "y": 1471, + "width": 75.765625, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1472, + "x": 174.234375, + "right": 250, + "text": "29.9s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 499 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 240 + } + }, + { + "id": "833:3615", + "text": "Bulid Size", + "source": { + "x": 185, + "y": 1530, + "width": 65, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 185.734375, + "y": 1530, + "width": 64.265625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1531, + "x": 185.734375, + "right": 250, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 469 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 239 + } + }, + { + "id": "833:3616", + "text": "200.4MB", + "source": { + "x": 124, + "y": 1557, + "width": 126, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "200.4MB", + "x": 125.46875, + "y": 1557, + "width": 124.53125, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1558, + "x": 125.46875, + "right": 250, + "text": "200.4MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1042 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 454 + } + }, + { + "id": "833:3619", + "text": "Mui", + "source": { + "x": 330, + "y": 1338, + "width": 40, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Mui", + "x": 330, + "y": 1338, + "width": 180, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1339, + "x": 330, + "right": 368.609375, + "text": "Mui" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 203 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 203 + } + }, + { + "id": "833:3620", + "text": "7.3.2", + "source": { + "x": 330, + "y": 1377, + "width": 37, + "height": 27, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "7.3.2", + "x": 330, + "y": 1377, + "width": 180, + "height": 27, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1380, + "x": 330, + "right": 365.78125, + "text": "7.3.2" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 100 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 100 + } + }, + { + "id": "833:3623", + "text": "Bulid Time", + "source": { + "x": 439, + "y": 1444, + "width": 71, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 180.375, + "y": 1444, + "width": 69.625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1445, + "x": 180.375, + "right": 250, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 590 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 305 + } + }, + { + "id": "833:3624", + "text": "22.2s", + "source": { + "x": 434, + "y": 1471, + "width": 76, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "22.2s", + "x": 434.921875, + "y": 1471, + "width": 75.078125, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1472, + "x": 434.921875, + "right": 510, + "text": "22.2s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 340 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 132 + } + }, + { + "id": "833:3626", + "text": "Bulid Size", + "source": { + "x": 445, + "y": 1530, + "width": 65, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 185.734375, + "y": 1530, + "width": 64.265625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1531, + "x": 185.734375, + "right": 250, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 469 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 239 + } + }, + { + "id": "833:3627", + "text": "84.3MB", + "source": { + "x": 403, + "y": 1557, + "width": 107, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "84.3MB", + "x": 404.25, + "y": 1557, + "width": 105.75, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1558, + "x": 404.25, + "right": 510, + "text": "84.3MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 785 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 401 + } + }, + { + "id": "833:3630", + "text": "Kuma UI", + "source": { + "x": 590, + "y": 1338, + "width": 88, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Kuma UI", + "x": 590, + "y": 1338, + "width": 180, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1339, + "x": 590, + "right": 676.484375, + "text": "Kuma UI" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 325 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 325 + } + }, + { + "id": "833:3631", + "text": "1.5.9", + "source": { + "x": 590, + "y": 1377, + "width": 36, + "height": 27, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "1.5.9", + "x": 590, + "y": 1377, + "width": 180, + "height": 27, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1380, + "x": 590, + "right": 625.46875, + "text": "1.5.9" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 134 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 134 + } + }, + { + "id": "833:3634", + "text": "Bulid Time", + "source": { + "x": 699, + "y": 1444, + "width": 71, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 180.375, + "y": 1444, + "width": 69.625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1445, + "x": 180.375, + "right": 250, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 590 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 305 + } + }, + { + "id": "833:3635", + "text": "20.6s", + "source": { + "x": 693, + "y": 1471, + "width": 77, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "20.6s", + "x": 694.1875, + "y": 1471, + "width": 75.8125, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1472, + "x": 694.1875, + "right": 770, + "text": "20.6s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 478 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 208 + } + }, + { + "id": "833:3637", + "text": "Bulid Size", + "source": { + "x": 705, + "y": 1530, + "width": 65, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 185.734375, + "y": 1530, + "width": 64.265625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1531, + "x": 185.734375, + "right": 250, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 469 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 239 + } + }, + { + "id": "833:3638", + "text": "60.3B", + "source": { + "x": 689, + "y": 1557, + "width": 81, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "60.3B", + "x": 690.21875, + "y": 1557, + "width": 79.78125, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1558, + "x": 690.21875, + "right": 770, + "text": "60.3B" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 537 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 236 + } + }, + { + "id": "I833:3330;41:483", + "text": "Get started", + "source": { + "x": 110, + "y": 664, + "width": 103, + "height": 26, + "font": { + "family": "Pretendard", + "style": "ExtraBold" + }, + "fontSize": 20, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Get started", + "x": 110, + "y": 664, + "width": 102, + "height": 26, + "font": "800 20px / 26px Pretendard", + "spacing": "-0.6px", + "align": "start", + "lines": [ + { + "y": 665, + "x": 110, + "right": 212, + "text": "Get started" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 578 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 578 + } + }, + { + "id": "I833:3432;793:6647", + "text": "Go Figma Community", + "source": { + "x": 979, + "y": 2108, + "width": 149, + "height": 24, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Go Figma Community", + "x": 980, + "y": 2109, + "width": 79.421875, + "height": 48, + "font": "500 16px / 24px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 2111, + "x": 980, + "right": 1045.0625, + "text": "Go Figma " + }, + { + "y": 2135, + "x": 980, + "right": 1059.421875, + "text": "Community" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "I833:3433;793:6647", + "text": "Go Figma Community", + "source": { + "x": 765, + "y": 2098, + "width": 149, + "height": 24, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Go Figma Community", + "x": 766, + "y": 2099, + "width": 147.90625, + "height": 24, + "font": "500 16px / 24px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 2101, + "x": 766, + "right": 913.90625, + "text": "Go Figma Community" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 802 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 756 + } + }, + { + "id": "I833:3458;51:267", + "text": "Open KakaoTalk", + "source": { + "x": 424, + "y": 2563.5, + "width": 130, + "height": 23, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Open KakaoTalk", + "x": 425.5625, + "y": 2563.5, + "width": 129.140625, + "height": 23, + "font": "700 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 2564.5, + "x": 425.5625, + "right": 554.703125, + "text": "Open KakaoTalk" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1113 + }, + "best": { + "dx": 1, + "dy": 1, + "changed": 774 + } + }, + { + "id": "I833:3459;51:267", + "text": "Join our Discord", + "source": { + "x": 678, + "y": 2563.5, + "width": 130, + "height": 23, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Join our Discord", + "x": 678.703125, + "y": 2563.5, + "width": 129.296875, + "height": 23, + "font": "700 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 2564.5, + "x": 678.703125, + "right": 808, + "text": "Join our Discord" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 932 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 685 + } + }, + { + "id": "I833:3460;22:4283", + "text": "상호: (주)데브파이브 | 대표자명: 오정민 | 사업자등록번호: 868-86-03159\n주소: 경기 고양시 덕양구 마상로140번길 81 4층", + "source": { + "x": 623, + "y": 2843, + "width": 339, + "height": 34, + "font": { + "family": "Pretendard", + "style": "Regular" + }, + "fontSize": 12, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "상호: (주)데브파이브 | 대표자명: 오정민 | 사업자등록번호: 868-86-03159\n주소: 경기 고양시 덕양구 마상로140번길 81 4층", + "x": 624.09375, + "y": 2843, + "width": 337.90625, + "height": 34, + "font": "12px / 17px Pretendard", + "spacing": "-0.36px", + "align": "right", + "lines": [ + { + "y": 2844, + "x": 624.09375, + "right": 962, + "text": "상호: (주)데브파이브 | 대표자명: 오정민 | 사업자등록번호: 868-86-03159" + }, + { + "y": 2861, + "x": 745.453125, + "right": 962, + "text": "주소: 경기 고양시 덕양구 마상로140번길 81 4층" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 3744 + }, + "best": { + "dx": 0, + "dy": -1, + "changed": 2760 + } + }, + { + "id": "I833:3460;22:4284", + "text": "Copyright © 2021-2024 데브파이브. All Rights Reserved.\r", + "source": { + "x": 671, + "y": 2887, + "width": 291, + "height": 17, + "font": { + "family": "Pretendard", + "style": "Regular" + }, + "fontSize": 12, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Copyright © 2021-2024 데브파이브. All Rights Reserved.\n", + "x": 683.859375, + "y": 2887, + "width": 278.140625, + "height": 17, + "font": "12px / 17px Pretendard", + "spacing": "-0.36px", + "align": "start", + "lines": [ + { + "y": 2888, + "x": 683.859375, + "right": 962, + "text": "Copyright © 2021-2024 데브파이브. All Rights Reserved." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1812 + }, + "best": { + "dx": -1, + "dy": -1, + "changed": 1652 + } + } + ] + }, + "landing-832-2975": { + "referenceSha256": "68b0743556479681e642b389f89fd2a082d86c6d634884739bd8725522cf8c6b", + "actualSha256": "1bf31cea5d1dbf5d6a5c2b4eb35fab39b6800f56bf1905a9278621e08c2787d3", + "probes": [ + { + "label": "default", + "args": [], + "changed": 89041, + "percent": 1.5037458117163855, + "geometrySha256": "db0021832b7bdc30e282d6dd4cb4b0f506dfb669ea74f212a0c2ca23a6c50911", + "pngSha256": "1bf31cea5d1dbf5d6a5c2b4eb35fab39b6800f56bf1905a9278621e08c2787d3" + }, + { + "label": "no-lcd", + "args": [ + "--disable-lcd-text" + ], + "changed": 61235, + "percent": 1.0341513996973628, + "geometrySha256": "db0021832b7bdc30e282d6dd4cb4b0f506dfb669ea74f212a0c2ca23a6c50911", + "pngSha256": "adf507d58724e4c1810586178445d078e98c76293adcaeea5e59744026809fda" + }, + { + "label": "no-hint", + "args": [ + "--font-render-hinting=none" + ], + "changed": 89041, + "percent": 1.5037458117163855, + "geometrySha256": "db0021832b7bdc30e282d6dd4cb4b0f506dfb669ea74f212a0c2ca23a6c50911", + "pngSha256": "1bf31cea5d1dbf5d6a5c2b4eb35fab39b6800f56bf1905a9278621e08c2787d3" + }, + { + "label": "no-lcd-no-hint", + "args": [ + "--disable-lcd-text", + "--font-render-hinting=none" + ], + "changed": 61235, + "percent": 1.0341513996973628, + "geometrySha256": "db0021832b7bdc30e282d6dd4cb4b0f506dfb669ea74f212a0c2ca23a6c50911", + "pngSha256": "adf507d58724e4c1810586178445d078e98c76293adcaeea5e59744026809fda" + } + ], + "repeatedProbes": [ + { + "label": "default", + "args": [], + "changed": 89041, + "percent": 1.5037458117163855, + "geometrySha256": "db0021832b7bdc30e282d6dd4cb4b0f506dfb669ea74f212a0c2ca23a6c50911", + "pngSha256": "1bf31cea5d1dbf5d6a5c2b4eb35fab39b6800f56bf1905a9278621e08c2787d3" + }, + { + "label": "no-lcd", + "args": [ + "--disable-lcd-text" + ], + "changed": 61235, + "percent": 1.0341513996973628, + "geometrySha256": "db0021832b7bdc30e282d6dd4cb4b0f506dfb669ea74f212a0c2ca23a6c50911", + "pngSha256": "adf507d58724e4c1810586178445d078e98c76293adcaeea5e59744026809fda" + }, + { + "label": "no-hint", + "args": [ + "--font-render-hinting=none" + ], + "changed": 89041, + "percent": 1.5037458117163855, + "geometrySha256": "db0021832b7bdc30e282d6dd4cb4b0f506dfb669ea74f212a0c2ca23a6c50911", + "pngSha256": "1bf31cea5d1dbf5d6a5c2b4eb35fab39b6800f56bf1905a9278621e08c2787d3" + }, + { + "label": "no-lcd-no-hint", + "args": [ + "--disable-lcd-text", + "--font-render-hinting=none" + ], + "changed": 61235, + "percent": 1.0341513996973628, + "geometrySha256": "db0021832b7bdc30e282d6dd4cb4b0f506dfb669ea74f212a0c2ca23a6c50911", + "pngSha256": "adf507d58724e4c1810586178445d078e98c76293adcaeea5e59744026809fda" + } + ], + "repeatIdentical": true, + "defaultProbeMatchesHarness": true, + "geometryIdentical": true, + "textBoxes": [ + { + "id": "832:2980", + "text": "Zero Config\nZero FOUC\nZero Runtime\nCSS in JS Preprocessor", + "source": { + "x": 280, + "y": 200, + "width": 551, + "height": 272, + "font": { + "family": "Pretendard", + "style": "ExtraBold" + }, + "fontSize": 52, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Zero Config\nZero FOUC\nZero Runtime\nCSS in JS Preprocessor", + "x": 280, + "y": 200, + "width": 1360, + "height": 272, + "font": "800 52px / 68px Pretendard", + "spacing": "-1.56px", + "align": "start", + "lines": [ + { + "y": 203, + "x": 280, + "right": 556.890625, + "text": "Zero Config" + }, + { + "y": 271, + "x": 280, + "right": 536.90625, + "text": "Zero FOUC" + }, + { + "y": 339, + "x": 280, + "right": 595.953125, + "text": "Zero Runtime" + }, + { + "y": 407, + "x": 280, + "right": 829.171875, + "text": "CSS in JS Preprocessor" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1765 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 1765 + } + }, + { + "id": "832:2981", + "text": "Building the Future of CSS-in-JS
Analyze all possible scenarios at the fastest speed and style with optimal performance.", + "source": { + "x": 280, + "y": 496, + "width": 869, + "height": 62, + "font": { + "family": "Pretendard", + "style": "Regular" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Building the Future of CSS-in-JS\nAnalyze all possible scenarios at the fastest speed and style with optimal performance.", + "x": 280, + "y": 496, + "width": 1360, + "height": 62, + "font": "24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 497, + "x": 280, + "right": 603.796875, + "text": "Building the Future of CSS-in-JS" + }, + { + "y": 528, + "x": 280, + "right": 1147.375, + "text": "Analyze all possible scenarios at the fastest speed and style with optimal performance." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 6574 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 6574 + } + }, + { + "id": "832:2988", + "text": "Star", + "source": { + "x": 330, + "y": 706.5, + "width": 33, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Star", + "x": 330, + "y": 706.5, + "width": 32.21875, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 707.5, + "x": 330, + "right": 362.21875, + "text": "Star" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 245 + }, + "best": { + "dx": 0, + "dy": 1, + "changed": 237 + } + }, + { + "id": "832:2990", + "text": "36", + "source": { + "x": 399, + "y": 706.5, + "width": 23, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "36", + "x": 398.21875, + "y": 706.5, + "width": 21.6875, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "center", + "lines": [ + { + "y": 707.5, + "x": 398.21875, + "right": 419.90625, + "text": "36" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 164 + }, + "best": { + "dx": -1, + "dy": 0, + "changed": 127 + } + }, + { + "id": "832:2994", + "text": "Sponsor", + "source": { + "x": 500, + "y": 706.5, + "width": 67, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Sponsor", + "x": 497.90625, + "y": 706.5, + "width": 65.890625, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 707.5, + "x": 497.90625, + "right": 563.796875, + "text": "Sponsor" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 655 + }, + "best": { + "dx": -2, + "dy": 1, + "changed": 473 + } + }, + { + "id": "832:2998", + "text": "Comparison Bechmarks", + "source": { + "x": 280, + "y": 900, + "width": 385, + "height": 47, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 36, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Comparison Bechmarks", + "x": 280, + "y": 900, + "width": 805, + "height": 47, + "font": "700 36px / 47px Pretendard", + "spacing": "-1.08px", + "align": "start", + "lines": [ + { + "y": 902, + "x": 280, + "right": 663.71875, + "text": "Comparison Bechmarks" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 2060 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 2060 + } + }, + { + "id": "832:2999", + "text": "Next.js Build Time and Build Size (github action - ubuntu-latest)", + "source": { + "x": 280, + "y": 963, + "width": 484, + "height": 27, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Next.js Build Time and Build Size (github action - ubuntu-latest)", + "x": 280, + "y": 963, + "width": 805, + "height": 27, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 966, + "x": 280, + "right": 763.421875, + "text": "Next.js Build Time and Build Size (github action - ubuntu-latest)" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 2912 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 2912 + } + }, + { + "id": "832:3011", + "text": "Devup-ui", + "source": { + "x": 310, + "y": 1050, + "width": 124, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Devup-ui", + "x": 310, + "y": 1050, + "width": 340, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1051, + "x": 310, + "right": 432.734375, + "text": "Devup-ui" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 722 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 722 + } + }, + { + "id": "832:3012", + "text": "1.0.18", + "source": { + "x": 310, + "y": 1097, + "width": 42, + "height": 27, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "1.0.18", + "x": 310, + "y": 1097, + "width": 340, + "height": 27, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1100, + "x": 310, + "right": 351.421875, + "text": "1.0.18" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 237 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 237 + } + }, + { + "id": "832:3015", + "text": "Next.js Build TIme ", + "source": { + "x": 531, + "y": 1184, + "width": 119, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Next.js Build TIme", + "x": 531.28125, + "y": 1184, + "width": 118.71875, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1185, + "x": 531.28125, + "right": 650, + "text": "Next.js Build TIme" + }, + { + "y": 0, + "x": 0, + "right": 0, + "text": " " + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 911 + }, + "best": { + "dx": 0, + "dy": -1, + "changed": 659 + } + }, + { + "id": "832:3019", + "text": "18.23s", + "source": { + "x": 541, + "y": 1211, + "width": 109, + "height": 47, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 36, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "18.23s", + "x": 542.640625, + "y": 1211, + "width": 107.359375, + "height": 47, + "font": "700 36px / 47px Pretendard", + "spacing": "-1.08px", + "align": "start", + "lines": [ + { + "y": 1213, + "x": 542.640625, + "right": 650, + "text": "18.23s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 863 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 248 + } + }, + { + "id": "832:3021", + "text": "Bulid Size", + "source": { + "x": 585, + "y": 1278, + "width": 65, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 585.734375, + "y": 1278, + "width": 64.265625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1279, + "x": 585.734375, + "right": 650, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 554 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 342 + } + }, + { + "id": "832:3025", + "text": "54.75MB", + "source": { + "x": 503, + "y": 1305, + "width": 147, + "height": 47, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 36, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "54.75MB", + "x": 504.953125, + "y": 1305, + "width": 145.046875, + "height": 47, + "font": "700 36px / 47px Pretendard", + "spacing": "-1.08px", + "align": "start", + "lines": [ + { + "y": 1307, + "x": 504.953125, + "right": 650, + "text": "54.75MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1485 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 92 + } + }, + { + "id": "832:3028", + "text": "Chakra UI", + "source": { + "x": 730, + "y": 1094, + "width": 103, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Chakra UI", + "x": 730, + "y": 1094, + "width": 240, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1095, + "x": 730, + "right": 831.828125, + "text": "Chakra UI" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 426 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 426 + } + }, + { + "id": "832:3029", + "text": "3.27.0", + "source": { + "x": 730, + "y": 1133, + "width": 47, + "height": 27, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "3.27.0", + "x": 730, + "y": 1133, + "width": 240, + "height": 27, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1136, + "x": 730, + "right": 776.328125, + "text": "3.27.0" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 154 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 154 + } + }, + { + "id": "832:3032", + "text": "Bulid Time", + "source": { + "x": 899, + "y": 1200, + "width": 71, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 900.375, + "y": 1200, + "width": 69.625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1201, + "x": 900.375, + "right": 970, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 590 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 305 + } + }, + { + "id": "832:3033", + "text": "29.99s", + "source": { + "x": 874, + "y": 1227, + "width": 96, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "29.99s", + "x": 875.859375, + "y": 1227, + "width": 94.140625, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1228, + "x": 875.859375, + "right": 970, + "text": "29.99s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 810 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 205 + } + }, + { + "id": "832:3035", + "text": "Bulid Size", + "source": { + "x": 905, + "y": 1286, + "width": 65, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 905.734375, + "y": 1286, + "width": 64.265625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1287, + "x": 905.734375, + "right": 970, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 469 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 239 + } + }, + { + "id": "832:3036", + "text": "200.39MB", + "source": { + "x": 827, + "y": 1313, + "width": 143, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "200.39MB", + "x": 828.3125, + "y": 1313, + "width": 141.6875, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1314, + "x": 828.3125, + "right": 970, + "text": "200.39MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1136 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 582 + } + }, + { + "id": "832:3039", + "text": "Mui", + "source": { + "x": 1050, + "y": 1094, + "width": 40, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Mui", + "x": 1050, + "y": 1094, + "width": 240, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1095, + "x": 1050, + "right": 1088.609375, + "text": "Mui" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 203 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 203 + } + }, + { + "id": "832:3040", + "text": "7.3.2", + "source": { + "x": 1050, + "y": 1133, + "width": 37, + "height": 27, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "7.3.2", + "x": 1050, + "y": 1133, + "width": 240, + "height": 27, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1136, + "x": 1050, + "right": 1085.78125, + "text": "7.3.2" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 100 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 100 + } + }, + { + "id": "832:3043", + "text": "Bulid Time", + "source": { + "x": 1219, + "y": 1200, + "width": 71, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 900.375, + "y": 1200, + "width": 69.625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1201, + "x": 900.375, + "right": 970, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 590 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 305 + } + }, + { + "id": "832:3044", + "text": "22.21s", + "source": { + "x": 1200, + "y": 1227, + "width": 90, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "22.21s", + "x": 1201.765625, + "y": 1227, + "width": 88.234375, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1228, + "x": 1201.765625, + "right": 1290, + "text": "22.21s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 653 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 183 + } + }, + { + "id": "832:3046", + "text": "Bulid Size", + "source": { + "x": 1225, + "y": 1286, + "width": 65, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 905.734375, + "y": 1286, + "width": 64.265625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1287, + "x": 905.734375, + "right": 970, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 469 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 239 + } + }, + { + "id": "832:3047", + "text": "89.87MB", + "source": { + "x": 1167, + "y": 1313, + "width": 123, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "89.87MB", + "x": 1168.828125, + "y": 1313, + "width": 121.171875, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1314, + "x": 1168.828125, + "right": 1290, + "text": "89.87MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1119 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 295 + } + }, + { + "id": "832:3050", + "text": "Kuma UI", + "source": { + "x": 1370, + "y": 1094, + "width": 88, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Kuma UI", + "x": 1370, + "y": 1094, + "width": 240, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1095, + "x": 1370, + "right": 1456.484375, + "text": "Kuma UI" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 325 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 325 + } + }, + { + "id": "832:3051", + "text": "1.5.9", + "source": { + "x": 1370, + "y": 1133, + "width": 36, + "height": 27, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "1.5.9", + "x": 1370, + "y": 1133, + "width": 240, + "height": 27, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1136, + "x": 1370, + "right": 1405.46875, + "text": "1.5.9" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 134 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 134 + } + }, + { + "id": "832:3054", + "text": "Bulid Time", + "source": { + "x": 1539, + "y": 1200, + "width": 71, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 900.375, + "y": 1200, + "width": 69.625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1201, + "x": 900.375, + "right": 970, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 590 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 305 + } + }, + { + "id": "832:3055", + "text": "21.61s", + "source": { + "x": 1526, + "y": 1227, + "width": 84, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "21.61s", + "x": 1527.03125, + "y": 1227, + "width": 82.96875, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1228, + "x": 1527.03125, + "right": 1610, + "text": "21.61s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 466 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 209 + } + }, + { + "id": "832:3057", + "text": "Bulid Size", + "source": { + "x": 1545, + "y": 1286, + "width": 65, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 905.734375, + "y": 1286, + "width": 64.265625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1287, + "x": 905.734375, + "right": 970, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 469 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 239 + } + }, + { + "id": "832:3058", + "text": "64.30MB", + "source": { + "x": 1484, + "y": 1313, + "width": 126, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "64.30MB", + "x": 1485.375, + "y": 1313, + "width": 124.625, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1314, + "x": 1485.375, + "right": 1610, + "text": "64.30MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1005 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 508 + } + }, + { + "id": "832:3062", + "text": "Features", + "source": { + "x": 280, + "y": 1830, + "width": 141, + "height": 47, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 36, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Features", + "x": 280, + "y": 1830, + "width": 1360, + "height": 47, + "font": "700 36px / 47px Pretendard", + "spacing": "-1.08px", + "align": "start", + "lines": [ + { + "y": 1832, + "x": 280, + "right": 419.28125, + "text": "Features" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 804 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 804 + } + }, + { + "id": "832:3063", + "text": "Devup UI offers a performance-optimized CSS-in-JS system, theme typing, \nand amazing features for faster and safer development.", + "source": { + "x": 280, + "y": 1893, + "width": 582, + "height": 54, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Devup UI offers a performance-optimized CSS-in-JS system, theme typing,\nand amazing features for faster and safer development.", + "x": 280, + "y": 1893, + "width": 1360, + "height": 54, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1896, + "x": 280, + "right": 857.78125, + "text": "Devup UI offers a performance-optimized CSS-in-JS system, theme typing, " + }, + { + "y": 1923, + "x": 280, + "right": 704, + "text": "and amazing features for faster and safer development." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 5291 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 5291 + } + }, + { + "id": "832:3069", + "text": "Zero Runtime", + "source": { + "x": 310, + "y": 2069, + "width": 141, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Zero Runtime", + "x": 310, + "y": 2069, + "width": 612, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 2070, + "x": 310, + "right": 450.109375, + "text": "Zero Runtime" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 787 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 787 + } + }, + { + "id": "832:3070", + "text": "A futuristic design that eliminates the root causes of performance degradation.", + "source": { + "x": 310, + "y": 2110, + "width": 612, + "height": 24, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "A futuristic design that eliminates the root causes of performance degradation.", + "x": 310, + "y": 2110, + "width": 612, + "height": 24, + "font": "500 16px / 24px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 2112, + "x": 310, + "right": 845.34375, + "text": "A futuristic design that eliminates the root causes of performance degradation." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 4237 + }, + "best": { + "dx": 0, + "dy": -1, + "changed": 2981 + } + }, + { + "id": "832:3074", + "text": "Top Performance", + "source": { + "x": 998, + "y": 2069, + "width": 182, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Top Performance", + "x": 998, + "y": 2069, + "width": 612, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 2070, + "x": 998, + "right": 1178.484375, + "text": "Top Performance" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 966 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 966 + } + }, + { + "id": "832:3075", + "text": "The fastest build speed and the smallest bundle size among CSS-in-JS solutions.", + "source": { + "x": 998, + "y": 2110, + "width": 612, + "height": 24, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "The fastest build speed and the smallest bundle size among CSS-in-JS solutions.", + "x": 998, + "y": 2110, + "width": 612, + "height": 24, + "font": "500 16px / 24px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 2112, + "x": 998, + "right": 1549.15625, + "text": "The fastest build speed and the smallest bundle size among CSS-in-JS solutions." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 4328 + }, + "best": { + "dx": 0, + "dy": -1, + "changed": 2981 + } + }, + { + "id": "832:3080", + "text": "Type Safety", + "source": { + "x": 310, + "y": 2262, + "width": 126, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Type Safety", + "x": 310, + "y": 2262, + "width": 612, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 2263, + "x": 310, + "right": 434.453125, + "text": "Type Safety" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 753 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 753 + } + }, + { + "id": "832:3081", + "text": "Enhanced DX with typing-based support.", + "source": { + "x": 310, + "y": 2303, + "width": 282, + "height": 24, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Enhanced DX with typing-based support.", + "x": 310, + "y": 2303, + "width": 612, + "height": 24, + "font": "500 16px / 24px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 2305, + "x": 310, + "right": 591.40625, + "text": "Enhanced DX with typing-based support." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 2241 + }, + "best": { + "dx": 0, + "dy": -1, + "changed": 1623 + } + }, + { + "id": "832:3085", + "text": "Figma Plugin", + "source": { + "x": 998, + "y": 2262, + "width": 135, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Figma Plugin", + "x": 998, + "y": 2262, + "width": 612, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 2263, + "x": 998, + "right": 1131.5625, + "text": "Figma Plugin" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 819 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 819 + } + }, + { + "id": "832:3086", + "text": "A Figma plugin enabling safer and faster development.\r", + "source": { + "x": 998, + "y": 2303, + "width": 374, + "height": 24, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "A Figma plugin enabling safer and faster development.\n", + "x": 998, + "y": 2303, + "width": 612, + "height": 24, + "font": "500 16px / 24px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 2305, + "x": 998, + "right": 1367.734375, + "text": "A Figma plugin enabling safer and faster development." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 2976 + }, + "best": { + "dx": 0, + "dy": -1, + "changed": 2122 + } + }, + { + "id": "832:3109", + "text": "Join our community", + "source": { + "x": 1282, + "y": 2527, + "width": 318, + "height": 47, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 36, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Join our community", + "x": 1283.796875, + "y": 2527, + "width": 316.203125, + "height": 47, + "font": "700 36px / 47px Pretendard", + "spacing": "-1.08px", + "align": "start", + "lines": [ + { + "y": 2529, + "x": 1283.796875, + "right": 1600, + "text": "Join our community" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 3310 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 1714 + } + }, + { + "id": "832:3110", + "text": "Join our Discord and help build the future of frontend with CSS-in-JS!\r", + "source": { + "x": 1065, + "y": 2590, + "width": 535, + "height": 27, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Join our Discord and help build the future of frontend with CSS-in-JS!\n", + "x": 1070.390625, + "y": 2590, + "width": 529.609375, + "height": 27, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 2593, + "x": 1070.390625, + "right": 1600, + "text": "Join our Discord and help build the future of frontend with CSS-in-JS!" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 4925 + }, + "best": { + "dx": -3, + "dy": 0, + "changed": 4919 + } + }, + { + "id": "832:3247", + "text": "Tailwind CSS", + "source": { + "x": 350, + "y": 1432, + "width": 137, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Tailwind CSS", + "x": 350, + "y": 1432, + "width": 245, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1433, + "x": 350, + "right": 486.125, + "text": "Tailwind CSS" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 522 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 522 + } + }, + { + "id": "832:3248", + "text": "4.1.13", + "source": { + "x": 350, + "y": 1471, + "width": 42, + "height": 27, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "4.1.13", + "x": 350, + "y": 1471, + "width": 245, + "height": 27, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1474, + "x": 350, + "right": 390.78125, + "text": "4.1.13" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 159 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 159 + } + }, + { + "id": "832:3251", + "text": "Bulid Time", + "source": { + "x": 524, + "y": 1538, + "width": 71, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 525.375, + "y": 1538, + "width": 69.625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1539, + "x": 525.375, + "right": 595, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 590 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 305 + } + }, + { + "id": "832:3252", + "text": "20.22s", + "source": { + "x": 501, + "y": 1565, + "width": 94, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "20.22s", + "x": 501.875, + "y": 1565, + "width": 93.125, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1566, + "x": 501.875, + "right": 595, + "text": "20.22s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 459 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 173 + } + }, + { + "id": "832:3254", + "text": "Bulid Size", + "source": { + "x": 530, + "y": 1624, + "width": 65, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 530.734375, + "y": 1624, + "width": 64.265625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1625, + "x": 530.734375, + "right": 595, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 469 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 239 + } + }, + { + "id": "832:3255", + "text": "54.76MB", + "source": { + "x": 472, + "y": 1651, + "width": 123, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "54.76MB", + "x": 473.828125, + "y": 1651, + "width": 121.171875, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1652, + "x": 473.828125, + "right": 595, + "text": "54.76MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1071 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 279 + } + }, + { + "id": "832:3291", + "text": "panda CSS", + "source": { + "x": 675, + "y": 1432, + "width": 117, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "panda CSS", + "x": 675, + "y": 1432, + "width": 245, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1433, + "x": 675, + "right": 790.5, + "text": "panda CSS" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 380 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 380 + } + }, + { + "id": "832:3292", + "text": "1.3.1", + "source": { + "x": 675, + "y": 1471, + "width": 32, + "height": 27, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "1.3.1", + "x": 675, + "y": 1471, + "width": 245, + "height": 27, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1474, + "x": 675, + "right": 706.078125, + "text": "1.3.1" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 123 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 123 + } + }, + { + "id": "832:3295", + "text": "Bulid Time", + "source": { + "x": 849, + "y": 1538, + "width": 71, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 525.375, + "y": 1538, + "width": 69.625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1539, + "x": 525.375, + "right": 595, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 590 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 305 + } + }, + { + "id": "832:3296", + "text": "22.01s", + "source": { + "x": 830, + "y": 1565, + "width": 90, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "22.01s", + "x": 831.125, + "y": 1565, + "width": 88.875, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1566, + "x": 831.125, + "right": 920, + "text": "22.01s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 526 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 255 + } + }, + { + "id": "832:3298", + "text": "Bulid Size", + "source": { + "x": 855, + "y": 1624, + "width": 65, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 530.734375, + "y": 1624, + "width": 64.265625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1625, + "x": 530.734375, + "right": 595, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 469 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 239 + } + }, + { + "id": "832:3299", + "text": "59.53MB", + "source": { + "x": 796, + "y": 1651, + "width": 124, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "59.53MB", + "x": 797.21875, + "y": 1651, + "width": 122.78125, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1652, + "x": 797.21875, + "right": 920, + "text": "59.53MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 887 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 441 + } + }, + { + "id": "832:3302", + "text": "styleX", + "source": { + "x": 1000, + "y": 1432, + "width": 67, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "styleX", + "x": 1000, + "y": 1432, + "width": 245, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1433, + "x": 1000, + "right": 1065.515625, + "text": "styleX" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 252 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 252 + } + }, + { + "id": "832:3303", + "text": "0.15.4", + "source": { + "x": 1000, + "y": 1471, + "width": 46, + "height": 27, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "0.15.4", + "x": 1000, + "y": 1471, + "width": 245, + "height": 27, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1474, + "x": 1000, + "right": 1045.3125, + "text": "0.15.4" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 155 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 155 + } + }, + { + "id": "832:3306", + "text": "Bulid Time", + "source": { + "x": 1174, + "y": 1538, + "width": 71, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 525.375, + "y": 1538, + "width": 69.625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1539, + "x": 525.375, + "right": 595, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 590 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 305 + } + }, + { + "id": "832:3307", + "text": "38.97s", + "source": { + "x": 1152, + "y": 1565, + "width": 93, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "38.97s", + "x": 1153.5, + "y": 1565, + "width": 91.5, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1566, + "x": 1153.5, + "right": 1245, + "text": "38.97s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 663 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 275 + } + }, + { + "id": "832:3309", + "text": "Bulid Size", + "source": { + "x": 1180, + "y": 1624, + "width": 65, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 530.734375, + "y": 1624, + "width": 64.265625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1625, + "x": 530.734375, + "right": 595, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 469 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 239 + } + }, + { + "id": "832:3310", + "text": "72.72MB", + "source": { + "x": 1125, + "y": 1651, + "width": 120, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "72.72MB", + "x": 1126.875, + "y": 1651, + "width": 118.125, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1652, + "x": 1126.875, + "right": 1245, + "text": "72.72MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 986 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 265 + } + }, + { + "id": "832:3313", + "text": "vanilla extract", + "source": { + "x": 1325, + "y": 1432, + "width": 146, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "vanilla extract", + "x": 1325, + "y": 1432, + "width": 245, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1433, + "x": 1325, + "right": 1469.609375, + "text": "vanilla extract" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 580 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 580 + } + }, + { + "id": "832:3314", + "text": "1.17.4", + "source": { + "x": 1325, + "y": 1471, + "width": 40, + "height": 27, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "1.17.4", + "x": 1325, + "y": 1471, + "width": 245, + "height": 27, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1474, + "x": 1325, + "right": 1364.453125, + "text": "1.17.4" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 158 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 158 + } + }, + { + "id": "832:3317", + "text": "Bulid Time", + "source": { + "x": 1499, + "y": 1538, + "width": 71, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 525.375, + "y": 1538, + "width": 69.625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1539, + "x": 525.375, + "right": 595, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 590 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 305 + } + }, + { + "id": "832:3318", + "text": "20.09s", + "source": { + "x": 1474, + "y": 1565, + "width": 96, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "20.09s", + "x": 1475.28125, + "y": 1565, + "width": 94.71875, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1566, + "x": 1475.28125, + "right": 1570, + "text": "20.09s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 666 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 327 + } + }, + { + "id": "832:3320", + "text": "Bulid Size", + "source": { + "x": 1505, + "y": 1624, + "width": 65, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 15, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 530.734375, + "y": 1624, + "width": 64.265625, + "height": 21, + "font": "700 15px / 21px Pretendard", + "spacing": "-0.45px", + "align": "start", + "lines": [ + { + "y": 1625, + "x": 530.734375, + "right": 595, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 469 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 239 + } + }, + { + "id": "832:3321", + "text": "56.61MB", + "source": { + "x": 1451, + "y": 1651, + "width": 119, + "height": 39, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 30, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "56.61MB", + "x": 1452.5625, + "y": 1651, + "width": 117.4375, + "height": 39, + "font": "700 30px / 39px Pretendard", + "spacing": "-0.9px", + "align": "start", + "lines": [ + { + "y": 1652, + "x": 1452.5625, + "right": 1570, + "text": "56.61MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1028 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 376 + } + }, + { + "id": "I832:2982;41:483", + "text": "Get started", + "source": { + "x": 350, + "y": 614, + "width": 103, + "height": 26, + "font": { + "family": "Pretendard", + "style": "ExtraBold" + }, + "fontSize": 20, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Get started", + "x": 350, + "y": 614, + "width": 102, + "height": 26, + "font": "800 20px / 26px Pretendard", + "spacing": "-0.6px", + "align": "start", + "lines": [ + { + "y": 615, + "x": 350, + "right": 452, + "text": "Get started" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 578 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 578 + } + }, + { + "id": "I832:3087;793:6647", + "text": "Go Figma Community", + "source": { + "x": 1443, + "y": 2208, + "width": 149, + "height": 24, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Go Figma Community", + "x": 1443.09375, + "y": 2209, + "width": 147.90625, + "height": 24, + "font": "500 16px / 24px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 2211, + "x": 1443.09375, + "right": 1591, + "text": "Go Figma Community" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 690 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 690 + } + }, + { + "id": "I832:3112;51:267", + "text": "Open KakaoTalk", + "source": { + "x": 1142, + "y": 2683.5, + "width": 130, + "height": 23, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Open KakaoTalk", + "x": 1143.5625, + "y": 2683.5, + "width": 129.140625, + "height": 23, + "font": "700 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 2684.5, + "x": 1143.5625, + "right": 1272.703125, + "text": "Open KakaoTalk" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1113 + }, + "best": { + "dx": 1, + "dy": 1, + "changed": 774 + } + }, + { + "id": "I832:3113;51:267", + "text": "Join our Discord", + "source": { + "x": 1396, + "y": 2683.5, + "width": 130, + "height": 23, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Join our Discord", + "x": 1396.703125, + "y": 2683.5, + "width": 129.296875, + "height": 23, + "font": "700 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 2684.5, + "x": 1396.703125, + "right": 1526, + "text": "Join our Discord" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 932 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 685 + } + }, + { + "id": "I832:3114;793:7945", + "text": "상호: (주)데브파이브 | 대표자명: 오정민 | 사업자등록번호: 868-86-03159\n주소: 경기 고양시 덕양구 마상로140번길 81 4층", + "source": { + "x": 1341, + "y": 2963, + "width": 339, + "height": 34, + "font": { + "family": "Pretendard", + "style": "Regular" + }, + "fontSize": 12, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "상호: (주)데브파이브 | 대표자명: 오정민 | 사업자등록번호: 868-86-03159\n주소: 경기 고양시 덕양구 마상로140번길 81 4층", + "x": 1342.09375, + "y": 2963, + "width": 337.90625, + "height": 34, + "font": "12px / 17px Pretendard", + "spacing": "-0.36px", + "align": "right", + "lines": [ + { + "y": 2964, + "x": 1342.09375, + "right": 1680, + "text": "상호: (주)데브파이브 | 대표자명: 오정민 | 사업자등록번호: 868-86-03159" + }, + { + "y": 2981, + "x": 1463.453125, + "right": 1680, + "text": "주소: 경기 고양시 덕양구 마상로140번길 81 4층" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 3744 + }, + "best": { + "dx": 0, + "dy": -1, + "changed": 2760 + } + }, + { + "id": "I832:3114;793:7946", + "text": "Copyright © 2021-2024 데브파이브. All Rights Reserved.\r", + "source": { + "x": 1398, + "y": 3007, + "width": 282, + "height": 17, + "font": { + "family": "Pretendard", + "style": "Regular" + }, + "fontSize": 12, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Copyright © 2021-2024 데브파이브. All Rights Reserved.\n", + "x": 1401.859375, + "y": 3007, + "width": 278.140625, + "height": 17, + "font": "12px / 17px Pretendard", + "spacing": "-0.36px", + "align": "start", + "lines": [ + { + "y": 3008, + "x": 1401.859375, + "right": 1680, + "text": "Copyright © 2021-2024 데브파이브. All Rights Reserved." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1776 + }, + "best": { + "dx": 3, + "dy": -1, + "changed": 726 + } + }, + { + "id": "I832:3115;1098:4608;15:22", + "text": "Showcase", + "source": { + "x": 1101, + "y": 43.5, + "width": 82, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Showcase", + "x": 1104.078125, + "y": 43.5, + "width": 81.40625, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 44.5, + "x": 1104.078125, + "right": 1185.484375, + "text": "Showcase" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 654 + }, + "best": { + "dx": 3, + "dy": 0, + "changed": 312 + } + }, + { + "id": "I832:3115;41:349;15:22", + "text": "Docs", + "source": { + "x": 841, + "y": 43.5, + "width": 41, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Docs", + "x": 846.078125, + "y": 43.5, + "width": 40.234375, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 44.5, + "x": 846.078125, + "right": 886.3125, + "text": "Docs" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 350 + }, + "best": { + "dx": 3, + "dy": 0, + "changed": 305 + } + }, + { + "id": "I832:3115;41:351;15:22", + "text": "Team", + "source": { + "x": 1241, + "y": 43.5, + "width": 45, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Team", + "x": 1243.484375, + "y": 43.5, + "width": 43.5, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 44.5, + "x": 1243.484375, + "right": 1286.984375, + "text": "Team" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 382 + }, + "best": { + "dx": 3, + "dy": 0, + "changed": 212 + } + }, + { + "id": "I832:3115;792:2665;15:22", + "text": "Components", + "source": { + "x": 940, + "y": 43.5, + "width": 103, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Components", + "x": 944.3125, + "y": 43.5, + "width": 101.765625, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 44.5, + "x": 944.3125, + "right": 1046.078125, + "text": "Components" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 785 + }, + "best": { + "dx": 3, + "dy": 0, + "changed": 720 + } + }, + { + "id": "I832:3115;792:4018", + "text": "Stroybook", + "source": { + "x": 1344, + "y": 43.5, + "width": 82, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Stroybook", + "x": 1344.984375, + "y": 43.5, + "width": 81.015625, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 44.5, + "x": 1344.984375, + "right": 1426, + "text": "Stroybook" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 526 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 254 + } + } + ] + } + }, + "featuresParagraph": { + "region": { + "x": 16, + "y": 1520, + "width": 328, + "height": 84 + }, + "samples": { + "reference": { + "ink": 5466, + "chromatic": 0 + }, + "default": { + "ink": 5817, + "chromatic": 4651 + }, + "noLcd": { + "ink": 5146, + "chromatic": 0 + } + } + }, + "mobileNoLcdTextBoxes": [ + { + "id": "833:3646", + "text": "Zero Config\nZero FOUC\nZero Runtime\nCSS in JS Preprocessor", + "source": { + "x": 16, + "y": 90, + "width": 328, + "height": 245, + "font": { + "family": "Pretendard", + "style": "ExtraBold" + }, + "fontSize": 38, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "Zero Config\nZero FOUC\nZero Runtime\nCSS in JS Preprocessor", + "x": 16, + "y": 90, + "width": 328, + "height": 245, + "font": "800 38px / 49px Pretendard", + "spacing": "-1.14px", + "align": "center", + "lines": [ + { + "y": 92, + "x": 78.828125, + "right": 281.171875, + "text": "Zero Config" + }, + { + "y": 141, + "x": 86.125, + "right": 273.859375, + "text": "Zero FOUC" + }, + { + "y": 190, + "x": 64.546875, + "right": 295.4375, + "text": "Zero Runtime" + }, + { + "y": 239, + "x": 98.984375, + "right": 261, + "text": "CSS in JS " + }, + { + "y": 288, + "x": 64.015625, + "right": 295.96875, + "text": "Preprocessor" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 4350 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 4350 + } + }, + { + "id": "833:3647", + "text": "Building the Future of CSS-in-JS
Analyze all possible scenarios at the fastest speed and style with optimal performance.", + "source": { + "x": 16, + "y": 359, + "width": 328, + "height": 69, + "font": { + "family": "Pretendard", + "style": "Regular" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "Building the Future of CSS-in-JS\nAnalyze all possible scenarios at the fastest speed and style with optimal performance.", + "x": 16, + "y": 359, + "width": 328, + "height": 69, + "font": "18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "center", + "lines": [ + { + "y": 360, + "x": 58.578125, + "right": 301.421875, + "text": "Building the Future of CSS-in-JS" + }, + { + "y": 383, + "x": 17.109375, + "right": 342.875, + "text": "Analyze all possible scenarios at the fastest " + }, + { + "y": 406, + "x": 19.59375, + "right": 340.40625, + "text": "speed and style with optimal performance." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 2542 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 2542 + } + }, + { + "id": "833:3654", + "text": "Star", + "source": { + "x": 80.5, + "y": 575, + "width": 31, + "height": 22, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 17, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Star", + "x": 81.421875, + "y": 575, + "width": 30.421875, + "height": 22, + "font": "600 17px / 22px Pretendard", + "spacing": "-0.51px", + "align": "start", + "lines": [ + { + "y": 576, + "x": 81.421875, + "right": 111.84375, + "text": "Star" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 211 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 41 + } + }, + { + "id": "833:3656", + "text": "36", + "source": { + "x": 147.5, + "y": 575, + "width": 21, + "height": 22, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 17, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "36", + "x": 147.84375, + "y": 575, + "width": 20.484375, + "height": 22, + "font": "600 17px / 22px Pretendard", + "spacing": "-0.51px", + "align": "center", + "lines": [ + { + "y": 576, + "x": 147.84375, + "right": 168.328125, + "text": "36" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 65 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 65 + } + }, + { + "id": "833:3660", + "text": "Sponsor", + "source": { + "x": 246.5, + "y": 575, + "width": 63, + "height": 22, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 17, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Sponsor", + "x": 246.328125, + "y": 575, + "width": 62.234375, + "height": 22, + "font": "600 17px / 22px Pretendard", + "spacing": "-0.51px", + "align": "start", + "lines": [ + { + "y": 576, + "x": 246.328125, + "right": 308.5625, + "text": "Sponsor" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 214 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 214 + } + }, + { + "id": "833:3664", + "text": "Comparison Bechmarks", + "source": { + "x": 30, + "y": 888, + "width": 300, + "height": 36, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 28, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Comparison Bechmarks", + "x": 30.765625, + "y": 888, + "width": 298.453125, + "height": 36, + "font": "700 28px / 36px Pretendard", + "spacing": "-0.84px", + "align": "start", + "lines": [ + { + "y": 889, + "x": 30.765625, + "right": 329.21875, + "text": "Comparison Bechmarks" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1535 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 1535 + } + }, + { + "id": "833:3665", + "text": "Next.js Build Time and Build Size \n(github action - ubuntu-latest)", + "source": { + "x": 16, + "y": 940, + "width": 328, + "height": 42, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "Next.js Build Time and Build Size \n(github action - ubuntu-latest)", + "x": 16, + "y": 940, + "width": 328, + "height": 42, + "font": "500 16px / 21px Pretendard", + "spacing": "-0.48px", + "align": "center", + "lines": [ + { + "y": 941, + "x": 68.125, + "right": 291.859375, + "text": "Next.js Build Time and Build Size " + }, + { + "y": 962, + "x": 77, + "right": 282.984375, + "text": "(github action - ubuntu-latest)" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1507 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 1507 + } + }, + { + "id": "833:3673", + "text": "Devup-ui", + "source": { + "x": 40, + "y": 1036, + "width": 97, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Devup-ui", + "x": 40, + "y": 1036, + "width": 96.21875, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1037, + "x": 40, + "right": 136.21875, + "text": "Devup-ui" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 62 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 62 + } + }, + { + "id": "833:3674", + "text": "1.0.18", + "source": { + "x": 40, + "y": 1075, + "width": 38, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "1.0.18", + "x": 40, + "y": 1075, + "width": 96.21875, + "height": 21, + "font": "500 16px / 21px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 1076, + "x": 40, + "right": 76.828125, + "text": "1.0.18" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 41 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 41 + } + }, + { + "id": "833:3677", + "text": "Next.js Build TIme ", + "source": { + "x": 217, + "y": 1036, + "width": 103, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Next.js Build TIme", + "x": 217.109375, + "y": 1036, + "width": 102.890625, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1037, + "x": 217.109375, + "right": 320, + "text": "Next.js Build TIme" + }, + { + "y": 0, + "x": 0, + "right": 0, + "text": " " + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 559 + }, + "best": { + "dx": 0, + "dy": -1, + "changed": 230 + } + }, + { + "id": "833:3681", + "text": "18.2s", + "source": { + "x": 252, + "y": 1060, + "width": 68, + "height": 36, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 28, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "18.2s", + "x": 253.53125, + "y": 1060, + "width": 66.46875, + "height": 36, + "font": "700 28px / 36px Pretendard", + "spacing": "-0.84px", + "align": "start", + "lines": [ + { + "y": 1061, + "x": 253.53125, + "right": 320, + "text": "18.2s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 485 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 237 + } + }, + { + "id": "833:3683", + "text": "Bulid Size", + "source": { + "x": 263, + "y": 1116, + "width": 57, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 264.3125, + "y": 1116, + "width": 55.6875, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1117, + "x": 264.3125, + "right": 320, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 446 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 257 + } + }, + { + "id": "833:3687", + "text": "54.7MB", + "source": { + "x": 222, + "y": 1140, + "width": 98, + "height": 36, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 28, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "54.7MB", + "x": 223.625, + "y": 1140, + "width": 96.375, + "height": 36, + "font": "700 28px / 36px Pretendard", + "spacing": "-0.84px", + "align": "start", + "lines": [ + { + "y": 1141, + "x": 223.625, + "right": 320, + "text": "54.7MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 790 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 328 + } + }, + { + "id": "833:3690", + "text": "Chakra UI", + "source": { + "x": 40, + "y": 1244, + "width": 77, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Chakra UI", + "x": 40, + "y": 1244, + "width": 76.375, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 40, + "right": 116.375, + "text": "Chakra UI" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 14 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 14 + } + }, + { + "id": "833:3691", + "text": "3.27.0", + "source": { + "x": 40, + "y": 1275, + "width": 42, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "3.27.0", + "x": 40, + "y": 1275, + "width": 76.375, + "height": 21, + "font": "500 16px / 21px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 1276, + "x": 40, + "right": 81.1875, + "text": "3.27.0" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 2 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 2 + } + }, + { + "id": "833:3694", + "text": "Bulid Time", + "source": { + "x": 171, + "y": 1244, + "width": 61, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 171.65625, + "y": 1244, + "width": 60.34375, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 171.65625, + "right": 232, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 363 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 136 + } + }, + { + "id": "833:3695", + "text": "29.9s", + "source": { + "x": 171, + "y": 1268, + "width": 61, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "29.9s", + "x": 172.5625, + "y": 1268, + "width": 59.4375, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1269, + "x": 172.5625, + "right": 232, + "text": "29.9s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 388 + }, + "best": { + "dx": 2, + "dy": 0, + "changed": 97 + } + }, + { + "id": "833:3697", + "text": "Bulid Size", + "source": { + "x": 175, + "y": 1319, + "width": 57, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 176.3125, + "y": 1319, + "width": 55.6875, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1320, + "x": 176.3125, + "right": 232, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 389 + }, + "best": { + "dx": 1, + "dy": -1, + "changed": 172 + } + }, + { + "id": "833:3698", + "text": "200.4MB", + "source": { + "x": 133, + "y": 1343, + "width": 99, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "200.4MB", + "x": 134.484375, + "y": 1343, + "width": 97.515625, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1344, + "x": 134.484375, + "right": 232, + "text": "200.4MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 698 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 244 + } + }, + { + "id": "833:3701", + "text": "Mui", + "source": { + "x": 292, + "y": 1244, + "width": 30, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Mui", + "x": 292, + "y": 1244, + "width": 31.8125, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 292, + "right": 320.953125, + "text": "Mui" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 3 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 3 + } + }, + { + "id": "833:3702", + "text": "7.3.2", + "source": { + "x": 292, + "y": 1275, + "width": 33, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "7.3.2", + "x": 292, + "y": 1275, + "width": 31.8125, + "height": 21, + "font": "500 16px / 21px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 1276, + "x": 292, + "right": 323.8125, + "text": "7.3.2" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 0 + } + }, + { + "id": "833:3705", + "text": "Bulid Time", + "source": { + "x": 423, + "y": 1244, + "width": 61, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 171.65625, + "y": 1244, + "width": 60.34375, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 171.65625, + "right": 232, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3706", + "text": "21.6s", + "source": { + "x": 428, + "y": 1268, + "width": 56, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "21.6s", + "x": 429.390625, + "y": 1268, + "width": 54.609375, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1269, + "x": 429.390625, + "right": 484, + "text": "21.6s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3708", + "text": "Bulid Size", + "source": { + "x": 427, + "y": 1319, + "width": 57, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 176.3125, + "y": 1319, + "width": 55.6875, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1320, + "x": 176.3125, + "right": 232, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3709", + "text": "84.3MB", + "source": { + "x": 400, + "y": 1343, + "width": 84, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "84.3MB", + "x": 400.953125, + "y": 1343, + "width": 83.046875, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1344, + "x": 400.953125, + "right": 484, + "text": "84.3MB" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3712", + "text": "Kuma UI", + "source": { + "x": 544, + "y": 1244, + "width": 66, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Kuma UI", + "x": 544, + "y": 1244, + "width": 64.875, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 544, + "right": 608.875, + "text": "Kuma UI" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3713", + "text": "1.5.9", + "source": { + "x": 544, + "y": 1275, + "width": 32, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "1.5.9", + "x": 544, + "y": 1275, + "width": 64.875, + "height": 21, + "font": "500 16px / 21px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 1276, + "x": 544, + "right": 575.53125, + "text": "1.5.9" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3716", + "text": "Bulid Time", + "source": { + "x": 675, + "y": 1244, + "width": 61, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 171.65625, + "y": 1244, + "width": 60.34375, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 171.65625, + "right": 232, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3717", + "text": "20.6s", + "source": { + "x": 676, + "y": 1268, + "width": 60, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "20.6s", + "x": 676.828125, + "y": 1268, + "width": 59.171875, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1269, + "x": 676.828125, + "right": 736, + "text": "20.6s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3719", + "text": "Bulid Size", + "source": { + "x": 679, + "y": 1319, + "width": 57, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 176.3125, + "y": 1319, + "width": 55.6875, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1320, + "x": 176.3125, + "right": 232, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3720", + "text": "60.3B", + "source": { + "x": 672, + "y": 1343, + "width": 64, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "60.3B", + "x": 673.46875, + "y": 1343, + "width": 62.53125, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1344, + "x": 673.46875, + "right": 736, + "text": "60.3B" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3724", + "text": "Features", + "source": { + "x": 125, + "y": 1468, + "width": 110, + "height": 36, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 28, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Features", + "x": 125.828125, + "y": 1468, + "width": 108.34375, + "height": 36, + "font": "700 28px / 36px Pretendard", + "spacing": "-0.84px", + "align": "start", + "lines": [ + { + "y": 1469, + "x": 125.828125, + "right": 234.171875, + "text": "Features" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 585 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 545 + } + }, + { + "id": "833:3725", + "text": "Devup UI offers a performance-optimized CSS-in-JS system, theme typing, \nand amazing features for faster and safer development.", + "source": { + "x": 16, + "y": 1520, + "width": 328, + "height": 84, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "Devup UI offers a performance-optimized CSS-in-JS system, theme typing, \nand amazing features for faster and safer development.", + "x": 16, + "y": 1520, + "width": 328, + "height": 84, + "font": "500 16px / 21px Pretendard", + "spacing": "-0.48px", + "align": "center", + "lines": [ + { + "y": 1521, + "x": 18.515625, + "right": 341.484375, + "text": "Devup UI offers a performance-optimized CSS-" + }, + { + "y": 1542, + "x": 83.0625, + "right": 276.921875, + "text": "in-JS system, theme typing, " + }, + { + "y": 1563, + "x": 40.078125, + "right": 323.34375, + "text": "and amazing features for faster and safer " + }, + { + "y": 1584, + "x": 133.1875, + "right": 226.8125, + "text": "development." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 2452 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 2452 + } + }, + { + "id": "833:3730", + "text": "Zero Runtime", + "source": { + "x": 88, + "y": 1654, + "width": 106, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Zero Runtime", + "x": 88, + "y": 1654, + "width": 236, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1655, + "x": 88, + "right": 193.09375, + "text": "Zero Runtime" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 147 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 147 + } + }, + { + "id": "833:3731", + "text": "A futuristic design that eliminates the root causes of performance degradation.", + "source": { + "x": 88, + "y": 1687, + "width": 236, + "height": 54, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 14, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "A futuristic design that eliminates the root causes of performance degradation.", + "x": 88, + "y": 1687, + "width": 236, + "height": 54, + "font": "500 14px / 18px Pretendard", + "spacing": "-0.42px", + "align": "start", + "lines": [ + { + "y": 1688, + "x": 88, + "right": 309.09375, + "text": "A futuristic design that eliminates the " + }, + { + "y": 1706, + "x": 88, + "right": 253.5, + "text": "root causes of performance " + }, + { + "y": 1724, + "x": 88, + "right": 163.859375, + "text": "degradation." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 648 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 648 + } + }, + { + "id": "833:3735", + "text": "Top Performance", + "source": { + "x": 88, + "y": 1797, + "width": 136, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Top Performance", + "x": 88, + "y": 1797, + "width": 236, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1798, + "x": 88, + "right": 223.359375, + "text": "Top Performance" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 155 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 155 + } + }, + { + "id": "833:3736", + "text": "The fastest build speed and the smallest bundle size among CSS-in-JS solutions.", + "source": { + "x": 88, + "y": 1830, + "width": 236, + "height": 54, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 14, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "The fastest build speed and the smallest bundle size among CSS-in-JS solutions.", + "x": 88, + "y": 1830, + "width": 236, + "height": 54, + "font": "500 14px / 18px Pretendard", + "spacing": "-0.42px", + "align": "start", + "lines": [ + { + "y": 1831, + "x": 88, + "right": 276.234375, + "text": "The fastest build speed and the " + }, + { + "y": 1849, + "x": 88, + "right": 318.890625, + "text": "smallest bundle size among CSS-in-JS " + }, + { + "y": 1867, + "x": 88, + "right": 145.15625, + "text": "solutions." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 671 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 671 + } + }, + { + "id": "833:3740", + "text": "Type Safety", + "source": { + "x": 88, + "y": 1940, + "width": 94, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Type Safety", + "x": 88, + "y": 1940, + "width": 236, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1941, + "x": 88, + "right": 181.34375, + "text": "Type Safety" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 142 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 142 + } + }, + { + "id": "833:3741", + "text": "Enhanced DX with typing-based support.", + "source": { + "x": 88, + "y": 1973, + "width": 236, + "height": 36, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 14, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "Enhanced DX with typing-based support.", + "x": 88, + "y": 1973, + "width": 236, + "height": 36, + "font": "500 14px / 18px Pretendard", + "spacing": "-0.42px", + "align": "start", + "lines": [ + { + "y": 1974, + "x": 88, + "right": 280.890625, + "text": "Enhanced DX with typing-based " + }, + { + "y": 1992, + "x": 88, + "right": 138.359375, + "text": "support." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 355 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 355 + } + }, + { + "id": "833:3745", + "text": "Figma Plugin", + "source": { + "x": 88, + "y": 2065, + "width": 101, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Figma Plugin", + "x": 88, + "y": 2065, + "width": 236, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 2066, + "x": 88, + "right": 188.171875, + "text": "Figma Plugin" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 229 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 229 + } + }, + { + "id": "833:3746", + "text": "A Figma plugin enabling safer and faster development.\r", + "source": { + "x": 88, + "y": 2098, + "width": 236, + "height": 36, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 14, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "A Figma plugin enabling safer and faster development.\n", + "x": 88, + "y": 2098, + "width": 236, + "height": 36, + "font": "500 14px / 18px Pretendard", + "spacing": "-0.42px", + "align": "start", + "lines": [ + { + "y": 2099, + "x": 88, + "right": 289, + "text": "A Figma plugin enabling safer and " + }, + { + "y": 2117, + "x": 88, + "right": 207.53125, + "text": "faster development." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 481 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 481 + } + }, + { + "id": "833:3770", + "text": "Join our community", + "source": { + "x": 56, + "y": 2274, + "width": 248, + "height": 36, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 28, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "Join our community", + "x": 56, + "y": 2274, + "width": 248, + "height": 36, + "font": "700 28px / 36px Pretendard", + "spacing": "-0.84px", + "align": "center", + "lines": [ + { + "y": 2275, + "x": 57.03125, + "right": 302.96875, + "text": "Join our community" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1251 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 1234 + } + }, + { + "id": "833:3771", + "text": "Join our Discord and help build the future of frontend with \nCSS-in-JS!\r", + "source": { + "x": 56, + "y": 2326, + "width": 248, + "height": 81, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "Join our Discord and help build the future of frontend with \nCSS-in-JS!\n", + "x": 56, + "y": 2326, + "width": 248, + "height": 81, + "font": "500 18px / 27px Pretendard", + "spacing": "-0.54px", + "align": "center", + "lines": [ + { + "y": 2329, + "x": 62.28125, + "right": 301.578125, + "text": "Join our Discord and help build " + }, + { + "y": 2356, + "x": 77.34375, + "right": 282.65625, + "text": "the future of frontend with " + }, + { + "y": 2383, + "x": 137.484375, + "right": 222.515625, + "text": "CSS-in-JS!" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1854 + }, + "best": { + "dx": 0, + "dy": 0, + "changed": 1854 + } + }, + { + "id": "833:3782", + "text": "Features", + "source": { + "x": 200, + "y": 2926, + "width": 65, + "height": 20, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 14, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "Features", + "x": 125.828125, + "y": 1468, + "width": 108.34375, + "height": 36, + "font": "700 28px / 36px Pretendard", + "spacing": "-0.84px", + "align": "start", + "lines": [ + { + "y": 1469, + "x": 125.828125, + "right": 234.171875, + "text": "Features" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3817", + "text": "상호: (주)데브파이브 | 대표자명: 오정민 | \n사업자등록번호: 868-86-03159\n주소: 경기 고양시 덕양구 마상로140번길 81 4층", + "source": { + "x": 30, + "y": 2849, + "width": 300, + "height": 42, + "font": { + "family": "Pretendard", + "style": "Light" + }, + "fontSize": 11, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "상호: (주)데브파이브 | 대표자명: 오정민 | \n사업자등록번호: 868-86-03159\n주소: 경기 고양시 덕양구 마상로140번길 81 4층", + "x": 30, + "y": 2849, + "width": 300, + "height": 42, + "font": "300 11px / 14px Pretendard", + "spacing": "-0.33px", + "align": "right", + "lines": [ + { + "y": 2849, + "x": 161.5, + "right": 330, + "text": "상호: (주)데브파이브 | 대표자명: 오정민 | " + }, + { + "y": 2863, + "x": 191.90625, + "right": 330, + "text": "사업자등록번호: 868-86-03159" + }, + { + "y": 2877, + "x": 133.15625, + "right": 330, + "text": "주소: 경기 고양시 덕양구 마상로140번길 81 4층" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 2477 + }, + "best": { + "dx": 0, + "dy": -1, + "changed": 1260 + } + }, + { + "id": "833:3818", + "text": "Copyright © 2021-2024 데브파이브. All Rights Reserved.\r", + "source": { + "x": 30, + "y": 2901, + "width": 300, + "height": 14, + "font": { + "family": "Pretendard", + "style": "Light" + }, + "fontSize": 11, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "HEIGHT" + }, + "dom": { + "text": "Copyright © 2021-2024 데브파이브. All Rights Reserved.\n", + "x": 30, + "y": 2901, + "width": 300, + "height": 14, + "font": "300 11px / 14px Pretendard", + "spacing": "-0.33px", + "align": "right", + "lines": [ + { + "y": 2901, + "x": 79.0625, + "right": 330, + "text": "Copyright © 2021-2024 데브파이브. All Rights Reserved." + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 1097 + }, + "best": { + "dx": 3, + "dy": -1, + "changed": 46 + } + }, + { + "id": "833:3958", + "text": "Kuma UI", + "source": { + "x": 796, + "y": 1244, + "width": 66, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Kuma UI", + "x": 544, + "y": 1244, + "width": 64.875, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 544, + "right": 608.875, + "text": "Kuma UI" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3959", + "text": "1.5.9", + "source": { + "x": 796, + "y": 1275, + "width": 32, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "1.5.9", + "x": 544, + "y": 1275, + "width": 64.875, + "height": 21, + "font": "500 16px / 21px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 1276, + "x": 544, + "right": 575.53125, + "text": "1.5.9" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3962", + "text": "Bulid Time", + "source": { + "x": 927, + "y": 1244, + "width": 61, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 171.65625, + "y": 1244, + "width": 60.34375, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 171.65625, + "right": 232, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3963", + "text": "20.6s", + "source": { + "x": 928, + "y": 1268, + "width": 60, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "20.6s", + "x": 676.828125, + "y": 1268, + "width": 59.171875, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1269, + "x": 676.828125, + "right": 736, + "text": "20.6s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3965", + "text": "Bulid Size", + "source": { + "x": 931, + "y": 1319, + "width": 57, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 176.3125, + "y": 1319, + "width": 55.6875, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1320, + "x": 176.3125, + "right": 232, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3966", + "text": "60.3B", + "source": { + "x": 924, + "y": 1343, + "width": 64, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "60.3B", + "x": 673.46875, + "y": 1343, + "width": 62.53125, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1344, + "x": 673.46875, + "right": 736, + "text": "60.3B" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3969", + "text": "Kuma UI", + "source": { + "x": 1048, + "y": 1244, + "width": 66, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Kuma UI", + "x": 544, + "y": 1244, + "width": 64.875, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 544, + "right": 608.875, + "text": "Kuma UI" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3970", + "text": "1.5.9", + "source": { + "x": 1048, + "y": 1275, + "width": 32, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "1.5.9", + "x": 544, + "y": 1275, + "width": 64.875, + "height": 21, + "font": "500 16px / 21px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 1276, + "x": 544, + "right": 575.53125, + "text": "1.5.9" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3973", + "text": "Bulid Time", + "source": { + "x": 1179, + "y": 1244, + "width": 61, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 171.65625, + "y": 1244, + "width": 60.34375, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 171.65625, + "right": 232, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3974", + "text": "20.6s", + "source": { + "x": 1180, + "y": 1268, + "width": 60, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "20.6s", + "x": 676.828125, + "y": 1268, + "width": 59.171875, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1269, + "x": 676.828125, + "right": 736, + "text": "20.6s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3976", + "text": "Bulid Size", + "source": { + "x": 1183, + "y": 1319, + "width": 57, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 176.3125, + "y": 1319, + "width": 55.6875, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1320, + "x": 176.3125, + "right": 232, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3977", + "text": "60.3B", + "source": { + "x": 1176, + "y": 1343, + "width": 64, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "60.3B", + "x": 673.46875, + "y": 1343, + "width": 62.53125, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1344, + "x": 673.46875, + "right": 736, + "text": "60.3B" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3980", + "text": "Kuma UI", + "source": { + "x": 1300, + "y": 1244, + "width": 66, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Kuma UI", + "x": 544, + "y": 1244, + "width": 64.875, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 544, + "right": 608.875, + "text": "Kuma UI" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3981", + "text": "1.5.9", + "source": { + "x": 1300, + "y": 1275, + "width": 32, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "1.5.9", + "x": 544, + "y": 1275, + "width": 64.875, + "height": 21, + "font": "500 16px / 21px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 1276, + "x": 544, + "right": 575.53125, + "text": "1.5.9" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3984", + "text": "Bulid Time", + "source": { + "x": 1431, + "y": 1244, + "width": 61, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 171.65625, + "y": 1244, + "width": 60.34375, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 171.65625, + "right": 232, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3985", + "text": "20.6s", + "source": { + "x": 1432, + "y": 1268, + "width": 60, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "20.6s", + "x": 676.828125, + "y": 1268, + "width": 59.171875, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1269, + "x": 676.828125, + "right": 736, + "text": "20.6s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3987", + "text": "Bulid Size", + "source": { + "x": 1435, + "y": 1319, + "width": 57, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 176.3125, + "y": 1319, + "width": 55.6875, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1320, + "x": 176.3125, + "right": 232, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3988", + "text": "60.3B", + "source": { + "x": 1428, + "y": 1343, + "width": 64, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "60.3B", + "x": 673.46875, + "y": 1343, + "width": 62.53125, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1344, + "x": 673.46875, + "right": 736, + "text": "60.3B" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3991", + "text": "Kuma UI", + "source": { + "x": 1552, + "y": 1244, + "width": 66, + "height": 23, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 18, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Kuma UI", + "x": 544, + "y": 1244, + "width": 64.875, + "height": 23, + "font": "600 18px / 23px Pretendard", + "spacing": "-0.54px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 544, + "right": 608.875, + "text": "Kuma UI" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3992", + "text": "1.5.9", + "source": { + "x": 1552, + "y": 1275, + "width": 32, + "height": 21, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "1.5.9", + "x": 544, + "y": 1275, + "width": 64.875, + "height": 21, + "font": "500 16px / 21px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 1276, + "x": 544, + "right": 575.53125, + "text": "1.5.9" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3995", + "text": "Bulid Time", + "source": { + "x": 1683, + "y": 1244, + "width": 61, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Time", + "x": 171.65625, + "y": 1244, + "width": 60.34375, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1245, + "x": 171.65625, + "right": 232, + "text": "Bulid Time" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3996", + "text": "20.6s", + "source": { + "x": 1684, + "y": 1268, + "width": 60, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "20.6s", + "x": 676.828125, + "y": 1268, + "width": 59.171875, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1269, + "x": 676.828125, + "right": 736, + "text": "20.6s" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3998", + "text": "Bulid Size", + "source": { + "x": 1687, + "y": 1319, + "width": 57, + "height": 18, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 13, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Bulid Size", + "x": 176.3125, + "y": 1319, + "width": 55.6875, + "height": 18, + "font": "700 13px / 18px Pretendard", + "spacing": "-0.39px", + "align": "start", + "lines": [ + { + "y": 1320, + "x": 176.3125, + "right": 232, + "text": "Bulid Size" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "833:3999", + "text": "60.3B", + "source": { + "x": 1680, + "y": 1343, + "width": 64, + "height": 31, + "font": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 24, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "60.3B", + "x": 673.46875, + "y": 1343, + "width": 62.53125, + "height": 31, + "font": "600 24px / 31px Pretendard", + "spacing": "-0.72px", + "align": "start", + "lines": [ + { + "y": 1344, + "x": 673.46875, + "right": 736, + "text": "60.3B" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "I833:3648;41:483", + "text": "Get started", + "source": { + "x": 134, + "y": 485, + "width": 88, + "height": 22, + "font": { + "family": "Pretendard", + "style": "ExtraBold" + }, + "fontSize": 17, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Get started", + "x": 134.640625, + "y": 485, + "width": 86.703125, + "height": 22, + "font": "800 17px / 22px Pretendard", + "spacing": "-0.51px", + "align": "start", + "lines": [ + { + "y": 486, + "x": 134.640625, + "right": 221.34375, + "text": "Get started" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 469 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 315 + } + }, + { + "id": "I833:3747;793:6647", + "text": "Go Figma Community", + "source": { + "x": 491, + "y": 2073, + "width": 149, + "height": 24, + "font": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Go Figma Community", + "x": 492, + "y": 2074, + "width": 79.421875, + "height": 48, + "font": "500 16px / 24px Pretendard", + "spacing": "-0.48px", + "align": "start", + "lines": [ + { + "y": 2076, + "x": 492, + "right": 557.0625, + "text": "Go Figma " + }, + { + "y": 2100, + "x": 492, + "right": 571.421875, + "text": "Community" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 0 + }, + "best": { + "dx": -3, + "dy": -2, + "changed": 0 + } + }, + { + "id": "I833:3773;51:267", + "text": "Open KakaoTalk", + "source": { + "x": 107, + "y": 2504, + "width": 123, + "height": 22, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 17, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Open KakaoTalk", + "x": 108.03125, + "y": 2504, + "width": 121.96875, + "height": 22, + "font": "700 17px / 22px Pretendard", + "spacing": "-0.51px", + "align": "start", + "lines": [ + { + "y": 2505, + "x": 108.03125, + "right": 230, + "text": "Open KakaoTalk" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 910 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 521 + } + }, + { + "id": "I833:3774;51:267", + "text": "Join our Discord", + "source": { + "x": 107, + "y": 2570, + "width": 123, + "height": 22, + "font": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 17, + "spacing": { + "unit": "PERCENT", + "value": -3 + }, + "resize": "WIDTH_AND_HEIGHT" + }, + "dom": { + "text": "Join our Discord", + "x": 107.875, + "y": 2570, + "width": 122.125, + "height": 22, + "font": "700 17px / 22px Pretendard", + "spacing": "-0.51px", + "align": "start", + "lines": [ + { + "y": 2571, + "x": 107.875, + "right": 230, + "text": "Join our Discord" + } + ] + }, + "zero": { + "dx": 0, + "dy": 0, + "changed": 794 + }, + "best": { + "dx": 1, + "dy": 0, + "changed": 439 + } + } + ] +} diff --git a/docs/landing-rasterization.md b/docs/landing-rasterization.md new file mode 100644 index 0000000..9542b3f --- /dev/null +++ b/docs/landing-rasterization.md @@ -0,0 +1,150 @@ +# Landing mobile: LCD glyph edges account for 1.87103 percentage points + +Investigated from unmodified `4a0e434b4448f4c6c28105e609c34cd3fb06e258` +in W25-B-landing. This is a **quantified negative**, not a generator fix. +The standard mobile capture remains 4.7829479225%; the requested production +improvement is not claimed. No Rust, plugin golden, threshold, or harness +script changed. No shared codegen file needs merging. + +## Fresh baseline and localisation + +The own-target baseline executable was preserved before test builds, SHA-256 +`12789c3b262d7034c5d730699be066cf70db3846beefc5e84cd423b949236ce2`. +Fresh acquisition used that executable, copied call-bank/exported-asset caches, +and unchanged scripts in an isolated local harness. Two standard render runs +reproduced each exact result below. The comparator is the unchanged executable +copied from main; all generator builds and gates use this worktree's target. +No acquisition identity check was bypassed. An initial acquisition with an +unindexed asset cache was stopped, its processes terminated, and acquisition +restarted with the cache indexed; only the completed acquisition is measured. + +| Width | Both standard baseline runs: changed pixels | Percent | Rendered dimensions | +| ---: | ---: | ---: | --- | +| 360 | 50,881 | 4.7829479225 | 360x2955 | +| 992 | 72,515 | 2.4662550063 | 992x2964 | +| 1920 | 89,041 | 1.5037458117 | 1920x3084 | + +These are own measurements, not threshold values. The one-pixel differences +from some earlier reports are retained, not rounded away. + +All seven preceding reports were read. `bands.mjs` finds mobile's worst bands +at y=1500–1600 (13.70%), 300–400 (12.62%), and 900–1000 (11.78%). +`drift.mjs` prefers zero vertical offset throughout the populated main content; +the footer prefers -1px. The empty y=2700 band has tied zero-error offsets, +so its first returned offset is not displacement evidence. +`boxes.mjs`, `elements.mjs`, and `crop.mjs` were run before any proposed fix. +The full-height capture remains the height authority, not the diagnostic +boxes script's capped viewport. + +The named element is **Features paragraph `833:3725`**, with source and browser +box **(16,1520), 328x84**. Its line composition agrees. The difference is inside +the glyphs, particularly **colored horizontal edge coverage**, not movement of +the paragraph. Its resolved 16px medium Pretendard, -0.48px spacing and 21px +line advance agree with the collected fields. The hero heading `833:3646`, +hero subtitle `833:3647`, benchmark caption `833:3665`, and Features paragraph +all have exact source/browser x, y, width and height. No missing letter-spacing +override was found in these visible regions. + +Landing's two IMAGE-fill nodes have no live children, excluding the documented +about hero's duplicated child-composition mechanism. `elements.mjs` measures +the hero export at its intrinsic 360x363 and the footer image at 143x30. The +collected 511x511 hero layer and clipped export are different bounds; that +alone is not evidence to rescale the export. + +## Controlled rasterization probe + +An isolated Playwright script launches Chromium with exactly one changed +startup argument, `--disable-lcd-text`. It uses the same generated module, +screen-specific compiled theme, viewport, locale, loaded fonts, decoded images, +animation-disabled page, transparent screenshot and 24-channel tolerance. +It does not rewrite TSX, CSS, source node data or the reference. + +The probe's default-argument PNG is **byte-identical to the standard harness +capture at every width**. All four variants have identical hashes of every +DOM element's x/y/width/height, font, letter spacing, whitespace and word-break +properties. Thus the intervention changes rasterization without a layout +change. It is not a replacement measurement configuration or a shipped fix. + +| Width | Standard baseline | LCD-disabled probe | Pixels removed | Reduction, pp | +| ---: | ---: | ---: | ---: | ---: | +| 360 | 4.7829479225% | 2.9119195337% | 19,904 | 1.8710283888 | +| 992 | 2.4662550063% | 1.6098082909% | 25,182 | 0.8564467154 | +| 1920 | 1.5037458117% | 1.0341513997% | 27,806 | 0.4695944120 | + +The probe was repeated at every width and reproduced the exact counts. +`--font-render-hinting=none` alone changes zero pixels; combining it with +`--disable-lcd-text` reproduces the LCD-disabled result exactly. Font hinting +is therefore ruled out as the explanation for this measured improvement. + +The neutral Features paragraph has **zero** pixels whose RGB channel spread +exceeds 24 in the reference, **4,651** in the default capture, and **zero** in +the LCD-disabled capture. The same region has 4,939 mismatching pixels by +default and 2,452 with LCD disabled. This distinguishes a demonstrated +chromatic rasterization contribution from a generic assertion that fonts differ. + +![Features paragraph: Figma, standard capture, LCD-disabled probe](landing-rasterization-crop.png) + +## What remains and why no Rust correction is shipped + +LCD rasterization accounts for a measured net 39.12% of mobile's changed pixels, +but does not explain all remaining pixels. A search of integer offsets +dx=-3..3 and dy=-2..2 within named text boxes still prefers (0,0) for the +hero heading, hero subtitle, Features paragraph, benchmark caption, and all +four feature descriptions after LCD is disabled. A global text shift would +therefore move these correctly placed regions away from their best alignment. + +Residual exceptions are retained as leads rather than generalized: footer +address `833:3817` prefers dy=-1; copyright `833:3818` prefers dx=3,dy=-1; +right-aligned benchmark values have roughly 1–2px horizontal preferences and +slightly different HUG widths. Those preferences are not uniform across text +of the same screen and are not proof of a safe generator rule. They require +separate glyph-advance, font-file, and baseline evidence. Figma's exact font +binary is not established by a matching family name. + +The harness already requests `-webkit-font-smoothing: antialiased`, but that +declaration did not prevent the observed LCD edges in this Windows capture. +There is no collected node field here that justifies a Rust glyph-position +correction or a synthetic compositing workaround. The causal intervention is +a browser startup configuration, and the rendering harness is explicitly +off-limits. No permission request or edit is needed to deliver this negative. +The next cycle can separate the demonstrated rasterization contribution from +layout defects before investigating the remaining per-run advances; changing +the official capture contract would be a distinct owner decision with corpus +remeasurement, not this task's generator improvement. + +Korean `keep-all` is unchanged. The owner's approximately 0.21pp allowance is +specific to about mobile and is excluded from defect accounting; it is not +transferred numerically to this predominantly English landing screen. No +Korean-breaking experiment was run. + +No production candidate exists, so the normal-render before/after delta is +**zero**, and no all-screen no-regression measurement is claimed. Production +source, all 268 plugin goldens, the corpus consistency test, provenance and +source maps are unchanged. No new failing regression test is presented because +no implementation was attempted; the paired browser probes are the experiment. + +## Evidence and verification + +[landing-rasterization-evidence.json](landing-rasterization-evidence.json) +retains both full baseline reports, binary/reference/actual hashes, controlled +probe results, geometry hashes, source/browser text boxes, line ranges and +local offset scores. Raw logs and diagnostic scripts are under this worktree's +ignored `harness/render/out/w25-*`; the durable JSON and crop preserve the +finding independently of those scratch files. + +All Cargo commands use `CARGO_PROFILE_DEV_DEBUG=0`, +`CARGO_PROFILE_TEST_DEBUG=0`, `CARGO_INCREMENTAL=0`, and two jobs, including +`CARGO_BUILD_JOBS=2`. `CARGO_TARGET_DIR` is never set. + +| Required gate | Result | +| --- | --- | +| `cargo fmt --all -- --check` | Pass | +| `cargo clippy --locked --workspace --all-targets --all-features -j 2 -- -D warnings` | Pass, zero warnings | +| `cargo test --workspace -j 2 --no-fail-fast` | 1,118 passed / 0 failed / 2 ignored | +| `cargo insta test --workspace --all-features --check` | 1,118 passed / 0 failed / 2 ignored; no snapshots to review | +| `cargo test --locked -p devup-mcp --test stdio_smoke -j 2` | 2 passed / 0 failed | + +Ordinary MSVC test links emit the pre-existing localized library-creation +message; Clippy's warnings-as-errors gate is clean. The documentation is +committed locally without pushing, followed by own-target `cargo clean` and +cleanup of task-started acquisition and preview processes. From e0701f6898bd092621d6aeb7363fbaa6330dc13a Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 14 Sep 2026 03:18:54 +0900 Subject: [PATCH 2/3] feat(figma): retrieve original image bytes through the bridge --- .../examples/original_image_probe.rs | 57 ++ crates/devup-mcp-figma/src/lib.rs | 2 + crates/devup-mcp-figma/src/original_image.rs | 175 ++++++ crates/devup-mcp-figma/src/scripts/assets.js | 39 +- crates/devup-mcp-figma/src/upstream.rs | 1 + .../devup-mcp-figma/tests/bridge_transport.rs | 42 ++ .../devup-mcp-figma/tests/original_image.rs | 90 +++ .../tests/original_image_script.mjs | 50 ++ docs/bridge-original-image-bytes.md | 182 ++++++ docs/bridge-original-image-evidence.json | 562 ++++++++++++++++++ docs/isolated-fill-export-contract.md | 6 + plugin/dist/code.js | 2 +- 12 files changed, 1203 insertions(+), 5 deletions(-) create mode 100644 crates/devup-mcp-figma/examples/original_image_probe.rs create mode 100644 crates/devup-mcp-figma/src/original_image.rs create mode 100644 crates/devup-mcp-figma/tests/original_image.rs create mode 100644 crates/devup-mcp-figma/tests/original_image_script.mjs create mode 100644 docs/bridge-original-image-bytes.md create mode 100644 docs/bridge-original-image-evidence.json diff --git a/crates/devup-mcp-figma/examples/original_image_probe.rs b/crates/devup-mcp-figma/examples/original_image_probe.rs new file mode 100644 index 0000000..b1824e3 --- /dev/null +++ b/crates/devup-mcp-figma/examples/original_image_probe.rs @@ -0,0 +1,57 @@ +//! Capture an original upload through the updated, read-only bridge plugin. +//! Run with: FILE_KEY NODE_ID FILL_INDEX IMAGE_HASH OUTPUT_PATH. +//! The selected bridge port must be free and match the plugin configuration. + +use std::{io::Write, time::Duration}; + +use devup_mcp_figma::{ + AssetRequest, BridgeFigmaClient, BridgeServer, FigmaUpstream, ReadToolCall, + original_image_from_result, +}; + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + let args: Vec = std::env::args().skip(1).collect(); + anyhow::ensure!( + args.len() == 5, + "usage: original_image_probe FILE_KEY NODE_ID FILL_INDEX IMAGE_HASH OUTPUT_PATH" + ); + let fill_index = args[2].parse::()?; + let server = BridgeServer::from_env().ok_or_else(|| anyhow::anyhow!( + "bridge port unavailable or disabled; stop its current owner or configure the same free port in both plugin and DEVUP_FIGMA_BRIDGE_PORT" + ))?; + eprintln!( + "Waiting up to 60 seconds for the updated plugin on port {}", + server.port() + ); + let state = server.state(); + tokio::time::timeout(Duration::from_secs(60), async { + while !state.has_plugin(&args[0]).await { + tokio::time::sleep(Duration::from_millis(100)).await; + } + }) + .await + .map_err(|_| anyhow::anyhow!("updated bridge plugin did not connect"))?; + let request = AssetRequest::original_image(&args[1], fill_index, &args[3]); + let response = BridgeFigmaClient::new(state) + .call_read_tool(ReadToolCall::asset_export(&args[0], None, request.clone())) + .await?; + let original = original_image_from_result(&response, &args[0], None, &request)?; + // Refuse to overwrite an earlier capture; its byte identity is evidence. + let mut file = std::fs::OpenOptions::new() + .write(true) + .create_new(true) + .open(&args[4])?; + file.write_all(&original.bytes)?; + println!( + "{}", + serde_json::json!({ + "representation":"original-image-v1", "fileKey":args[0], "nodeId":args[1], + "fillIndex":fill_index, "imageHash":args[3], "version":null, + "mimeType":original.mime_type, "width":original.width, "height":original.height, + "byteLength":original.bytes.len(), "sha256":original.sha256, "outputPath":args[4], + "note":"Original upload only; no isolated-fill or document-version parity is claimed." + }) + ); + Ok(()) +} diff --git a/crates/devup-mcp-figma/src/lib.rs b/crates/devup-mcp-figma/src/lib.rs index f18a845..2c8b321 100644 --- a/crates/devup-mcp-figma/src/lib.rs +++ b/crates/devup-mcp-figma/src/lib.rs @@ -78,9 +78,11 @@ pub use upstream::{ pub use url::FigmaTarget; pub use variables::{ResourceBatch, ResourceStyleRef, UnresolvedResource}; mod metadata; +mod original_image; pub use assets::{ AssetExportOutcome, AssetFormat, AssetManifest, AssetManifestEntry, AssetRequest, AssetSelection, AssetStatus, MAX_ASSET_BYTES, PNG_EXPORT_FIELD, SVG_EXPORT_FIELD, asset_exclusion_reason, asset_export_from_result, discover_asset_manifest, exported_asset_from_bytes, resolve_asset_selections, source_kind_of, validate_asset_requests, }; +pub use original_image::{OriginalImage, original_image_from_result}; diff --git a/crates/devup-mcp-figma/src/original_image.rs b/crates/devup-mcp-figma/src/original_image.rs new file mode 100644 index 0000000..13aa7c0 --- /dev/null +++ b/crates/devup-mcp-figma/src/original_image.rs @@ -0,0 +1,175 @@ +//! Original uploads, carried only by the local bridge. These bytes have no +//! paint transforms, filters, opacity, clipping or child composition applied. +//! They must never be decoded as an AssetManifestEntry's node rendition. + +use base64::{Engine as _, engine::general_purpose::STANDARD}; +use serde::Deserialize; +use serde_json::{Value, json}; +use sha2::{Digest, Sha256}; + +use crate::{AssetFormat, AssetRequest, DevupError, ErrorCode, MAX_ASSET_BYTES, UpstreamResult}; + +const FIELD: &str = "$original-image/fills/"; + +impl AssetRequest { + /// A distinct bridge-only read of the upload used by this exact paint. + /// Format/scale are placeholders required by the shared request envelope; + /// the original response explicitly has neither a requested codec nor scale. + /// Use `original_image_from_result`, never `asset_export_from_result`. + pub fn original_image(node_id: &str, fill_index: usize, image_hash: &str) -> Self { + Self { + asset_id: format!("{node_id}:original-image-v1:{fill_index}:{image_hash}"), + node_id: node_id.to_owned(), + field: format!("{FIELD}{fill_index}"), + image_hash: Some(image_hash.to_owned()), + format: AssetFormat::Png, + scale: 1, + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct OriginalImage { + pub bytes: Vec, + pub mime_type: String, + /// Intrinsic dimensions reported by Image.getSizeAsync, not a node box. + pub width: u32, + pub height: u32, + pub sha256: String, +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +struct Descriptor { + representation: String, + file_key: String, + version: Option, + asset_id: String, + node_id: String, + field: String, + image_hash: String, + status: String, + mime_type: String, + width: u32, + height: u32, + byte_length: usize, + sha256: String, + data: String, +} + +fn find(value: &Value) -> Option { + if matches!( + value["kind"].as_str(), + Some("devupOriginalImage" | "devupAssetExport") + ) { + return Some(value.clone()); + } + match value { + Value::Object(object) => object.values().find_map(find), + Value::Array(values) => values.iter().find_map(find), + Value::String(text) => serde_json::from_str::(text) + .ok() + .and_then(|v| find(&v)), + _ => None, + } +} + +fn invalid(message: &str) -> DevupError { + DevupError::new(ErrorCode::DevupSnapshotUnsupported, message, false) +} + +/// Validate identity, byte count, SHA-256 and codec before returning original +/// bytes. A remote refusal and an old plugin's unsupported-field response stay +/// named diagnostics, rather than being mistaken for successful PNG exports. +pub fn original_image_from_result( + result: &UpstreamResult, + file_key: &str, + version: Option<&str>, + request: &AssetRequest, +) -> Result { + if request + .field + .strip_prefix(FIELD) + .and_then(|s| s.parse::().ok()) + .is_none() + { + return Err(invalid( + "original image read requires an explicit original-image field", + )); + } + let value = find(&result.raw).ok_or_else(|| invalid("original image descriptor missing"))?; + if value["status"] == "failed" { + let code = value["errorCode"] + .as_str() + .unwrap_or("DEVUP_ORIGINAL_IMAGE_READ_FAILED"); + return Err(DevupError::with_details( + ErrorCode::DevupSnapshotUnsupported, + format!( + "{code}: original image bytes were not delivered; the bridge requires the updated plugin bundle" + ), + false, + json!({"errorCode":code}), + )); + } + if value["kind"] != "devupOriginalImage" + || !value["format"].is_null() + || !value["scale"].is_null() + { + return Err(invalid( + "a node rendition cannot substitute for original image bytes", + )); + } + let descriptor: Descriptor = + serde_json::from_value(value).map_err(|_| invalid("invalid original image descriptor"))?; + if descriptor.representation != "original-image-v1" + || descriptor.status != "exported" + || descriptor.file_key != file_key + || descriptor.version.as_deref() != version + || descriptor.node_id != request.node_id + || descriptor.asset_id != request.asset_id + || descriptor.field != request.field + || Some(&descriptor.image_hash) != request.image_hash.as_ref() + || descriptor.width == 0 + || descriptor.height == 0 + || descriptor.byte_length == 0 + || descriptor.byte_length > MAX_ASSET_BYTES + || descriptor.data.len() > MAX_ASSET_BYTES.div_ceil(3) * 4 + { + return Err(invalid( + "original image identity, dimensions or byte count does not match", + )); + } + let bytes = STANDARD + .decode(descriptor.data) + .map_err(|_| invalid("invalid original image base64"))?; + let sha256: String = Sha256::digest(&bytes) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect(); + let mime = if bytes.starts_with(b"\x89PNG\r\n\x1a\n") { + "image/png" + } else if bytes.starts_with(&[255, 216, 255]) { + "image/jpeg" + } else if bytes.starts_with(b"GIF8") { + "image/gif" + } else if bytes.starts_with(b"RIFF") && bytes.get(8..12) == Some(b"WEBP") { + "image/webp" + } else { + return Err(invalid("unsupported original image codec")); + }; + if bytes.len() != descriptor.byte_length + || sha256 != descriptor.sha256 + || mime != descriptor.mime_type + { + return Err(invalid( + "original image bytes fail length, SHA-256 or MIME validation", + )); + } + Ok(OriginalImage { + bytes, + mime_type: descriptor.mime_type, + width: descriptor.width, + height: descriptor.height, + sha256, + }) +} diff --git a/crates/devup-mcp-figma/src/scripts/assets.js b/crates/devup-mcp-figma/src/scripts/assets.js index b879bf8..867a6ee 100644 --- a/crates/devup-mcp-figma/src/scripts/assets.js +++ b/crates/devup-mcp-figma/src/scripts/assets.js @@ -19,13 +19,21 @@ function failed(errorCode) { }; } +const original = typeof options.field === "string" && options.field.startsWith("$original-image/fills/"); try { + // Original uploads are a different representation from node renditions. + // Only the local bridge opts in: the remote MCP's bounded text envelope + // cannot carry arbitrary original bytes, and its file writer is not a + // general binary transport. Never silently return a node PNG instead. + if (original && options.transport !== "bridge") { + return failed("DEVUP_ORIGINAL_IMAGE_REQUIRES_BRIDGE"); + } const node = await figma.getNodeByIdAsync(options.nodeId); - if (!node || typeof node.exportAsync !== "function") { + if (!node || (!original && typeof node.exportAsync !== "function")) { return failed("DEVUP_ASSET_UNSUPPORTED_BY_UPSTREAM"); } - if (typeof options.field === "string" && options.field.startsWith("fills/")) { - const index = Number(options.field.slice("fills/".length)); + if (original || (typeof options.field === "string" && options.field.startsWith("fills/"))) { + const index = Number(options.field.slice(original ? "$original-image/fills/".length : "fills/".length)); const fills = "fills" in node && Array.isArray(node.fills) ? node.fills : []; const paint = Number.isInteger(index) ? fills[index] : null; const imageHash = paint && paint.type === "IMAGE" ? paint.imageHash || paint.imageRef : null; @@ -36,6 +44,29 @@ try { return failed("DEVUP_ASSET_FIELD_UNSUPPORTED"); } + if (original) { + const image = figma.getImageByHash(options.imageHash); + if (!image) return failed("DEVUP_ORIGINAL_IMAGE_NOT_FOUND"); + const bytes = await image.getBytesAsync(); + if (bytes.length === 0 || bytes.length > 8 * 1024 * 1024) { + return failed("DEVUP_ASSET_RESPONSE_TOO_LARGE"); + } + const starts = values => values.every((value, index) => bytes[index] === value); + const mimeType = starts([137,80,78,71,13,10,26,10]) ? "image/png" + : starts([255,216,255]) ? "image/jpeg" + : starts([71,73,70,56]) ? "image/gif" + : starts([82,73,70,70]) && bytes[8] === 87 && bytes[9] === 69 && bytes[10] === 66 && bytes[11] === 80 ? "image/webp" + : null; + if (!mimeType) return failed("DEVUP_ORIGINAL_IMAGE_CODEC_UNSUPPORTED"); + const size = await image.getSizeAsync(); + return { + ...failed(null), status: "exported", kind: "devupOriginalImage", + representation: "original-image-v1", format: null, scale: null, + mimeType, width: size.width, height: size.height, + byteLength: bytes.length, sha256: devupSha256(bytes), data: figma.base64Encode(bytes), + }; + } + const format = String(options.format || "").toUpperCase(); if (!["PNG", "JPG", "SVG", "PDF"].includes(format)) { return failed("DEVUP_ASSET_FORMAT_UNSUPPORTED"); @@ -124,5 +155,5 @@ try { errorCode: null, }; } catch (_) { - return failed("DEVUP_ASSET_EXPORT_FAILED"); + return failed(original ? "DEVUP_ORIGINAL_IMAGE_READ_FAILED" : "DEVUP_ASSET_EXPORT_FAILED"); } diff --git a/crates/devup-mcp-figma/src/upstream.rs b/crates/devup-mcp-figma/src/upstream.rs index 1e35c75..596997e 100644 --- a/crates/devup-mcp-figma/src/upstream.rs +++ b/crates/devup-mcp-figma/src/upstream.rs @@ -1046,6 +1046,7 @@ impl ReadToolCall { params: json!({ "nodeId": request.node_id, "asset": { + "transport": "bridge", "assetId": request.asset_id, "nodeId": request.node_id, "field": request.field, diff --git a/crates/devup-mcp-figma/tests/bridge_transport.rs b/crates/devup-mcp-figma/tests/bridge_transport.rs index 88a3588..5a5b05d 100644 --- a/crates/devup-mcp-figma/tests/bridge_transport.rs +++ b/crates/devup-mcp-figma/tests/bridge_transport.rs @@ -276,3 +276,45 @@ async fn two_keyless_plugins_are_ambiguous_and_neither_serves() { .await ); } + +#[tokio::test] +async fn original_upload_crosses_the_socket_without_remote_text_truncation() { + use base64::{Engine as _, engine::general_purpose::STANDARD}; + use devup_mcp_figma::{AssetRequest, original_image_from_result}; + use sha2::{Digest, Sha256}; + + let server = BridgeServer::start(0).unwrap(); + let mut plugin = connect_plugin(&server).await; + let client = BridgeFigmaClient::new(server.state()); + let request = AssetRequest::original_image("n", 2, "hash"); + let call = ReadToolCall::asset_export(FILE_KEY, Some("v1".into()), request.clone()); + let reading = tokio::spawn(async move { client.call_read_tool(call).await }); + let job = next_job(&mut plugin).await; + assert_eq!(job["script"], "assets"); + assert_eq!(job["params"]["asset"]["transport"], "bridge"); + assert_eq!(job["params"]["asset"]["field"], "$original-image/fills/2"); + let mut bytes = vec![31u8; 1_100_000]; + bytes[..3].copy_from_slice(&[255, 216, 255]); + let hash: String = Sha256::digest(&bytes) + .iter() + .map(|b| format!("{b:02x}")) + .collect(); + plugin + .send(Message::Text( + json!({ + "kind":"devup-result", "requestId":job["requestId"], + "data":{"kind":"devupOriginalImage", "representation":"original-image-v1", + "fileKey":FILE_KEY, "version":"v1", "nodeId":"n", "assetId":request.asset_id, + "field":request.field, "imageHash":"hash", "status":"exported", + "format":null, "scale":null, "mimeType":"image/jpeg", "width":100, "height":100, + "byteLength":bytes.len(), "sha256":hash, "data":STANDARD.encode(&bytes)} + }) + .to_string() + .into(), + )) + .await + .unwrap(); + let result = reading.await.unwrap().unwrap(); + let original = original_image_from_result(&result, FILE_KEY, Some("v1"), &request).unwrap(); + assert_eq!(original.bytes, bytes); +} diff --git a/crates/devup-mcp-figma/tests/original_image.rs b/crates/devup-mcp-figma/tests/original_image.rs new file mode 100644 index 0000000..dca7625 --- /dev/null +++ b/crates/devup-mcp-figma/tests/original_image.rs @@ -0,0 +1,90 @@ +use base64::{Engine as _, engine::general_purpose::STANDARD}; +use devup_mcp_figma::{AssetFormat, AssetRequest, ReadToolCall}; +use serde_json::json; +use sha2::{Digest, Sha256}; + +#[test] +fn original_descriptor_is_verified_without_claiming_a_png_rendition() { + let request = AssetRequest::original_image("n", 2, "hash"); + let bytes = [255u8, 216, 255, 224, 1, 2]; + let hash: String = Sha256::digest(bytes) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect(); + let descriptor = json!({"kind":"devupOriginalImage", "representation":"original-image-v1", + "fileKey":"file", "version":"v1", "nodeId":"n", "assetId":request.asset_id, + "field":request.field, "imageHash":"hash", "status":"exported", + "format":null, "scale":null, "mimeType":"image/jpeg", "width":13, "height":17, + "byteLength":bytes.len(), "sha256":hash, "data":STANDARD.encode(bytes)}); + let decode = |value: serde_json::Value| { + devup_mcp_figma::original_image_from_result( + &devup_mcp_figma::UpstreamResult { + raw: json!({"content":[{"type":"text","text":value.to_string()}]}), + }, + "file", + Some("v1"), + &request, + ) + }; + let original = decode(descriptor.clone()).unwrap(); + assert_eq!(original.bytes, bytes); + assert_eq!(original.mime_type, "image/jpeg"); + assert_eq!((original.width, original.height), (13, 17)); + for (field, bad) in [ + ("imageHash", json!("other")), + ("version", json!("v2")), + ("sha256", json!("bad")), + ("byteLength", json!(2)), + ("mimeType", json!("image/png")), + ("width", json!(0)), + ("representation", json!("node-render")), + ] { + let mut altered = descriptor.clone(); + altered[field] = bad; + assert!(decode(altered).is_err(), "must reject {field}"); + } +} + +#[test] +fn original_image_script_contract() { + let output = std::process::Command::new("node") + .arg("--test") + .arg(concat!( + env!("CARGO_MANIFEST_DIR"), + "/tests/original_image_script.mjs" + )) + .output() + .expect("Node is required for the Plugin API contract"); + assert!( + output.status.success(), + "{}\n{}", + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr) + ); +} + +#[test] +fn original_bytes_are_opted_in_only_by_the_bridge_transport() { + let call = ReadToolCall::asset_export( + "file", + Some("v1".into()), + AssetRequest { + asset_id: "n:original:2".into(), + node_id: "n".into(), + field: "$original-image/fills/2".into(), + image_hash: Some("active".into()), + format: AssetFormat::Png, + scale: 1, + }, + ); + assert_eq!( + call.bridge_job().unwrap().params["asset"]["transport"], + "bridge" + ); + assert!( + !call.arguments()["code"] + .as_str() + .unwrap() + .contains("\"transport\":\"bridge\"") + ); +} diff --git a/crates/devup-mcp-figma/tests/original_image_script.mjs b/crates/devup-mcp-figma/tests/original_image_script.mjs new file mode 100644 index 0000000..a2bea11 --- /dev/null +++ b/crates/devup-mcp-figma/tests/original_image_script.mjs @@ -0,0 +1,50 @@ +import assert from 'node:assert/strict'; +import { readFileSync } from 'node:fs'; +import { test } from 'node:test'; +import { createHash } from 'node:crypto'; + +const source = readFileSync(new URL('../src/scripts/assets.js', import.meta.url), 'utf8') + .replace('"__DEVUP_LARGE_VALUE_HELPERS__"', readFileSync(new URL('../src/scripts/large_value_helpers.js', import.meta.url), 'utf8')); +const bytes = Uint8Array.from([255, 216, 255, 224, 1, 2, 3]); +async function read(overrides = {}, api = {}) { + const options = { assetId: 'n:original:2', nodeId: 'n', field: '$original-image/fills/2', imageHash: 'active', format: 'png', scale: 1, version: 'v1', transport: 'bridge', ...overrides }; + const figma = { + fileKey: 'file', base64Encode: b => Buffer.from(b).toString('base64'), + getNodeByIdAsync: async () => ({ fills: [{type:'IMAGE', imageHash:'hidden', visible:false}, {type:'SOLID'}, {type:'IMAGE', imageHash:'active'}], exportAsync: async () => { throw Error('must not render the node'); } }), + getImageByHash: hash => { assert.equal(hash, 'active'); return { getBytesAsync: async () => bytes, getSizeAsync: async () => ({width:13, height:17}) }; }, + ...api, + }; + return new (Object.getPrototypeOf(async function(){}).constructor)('figma', source.replace('"__DEVUP_ASSET__"', JSON.stringify(options)))(figma); +} +test('bridge returns selected original bytes and intrinsic codec, never a node PNG', async () => { + const result = await read(); + assert.equal(result.status, 'exported'); + assert.equal(result.representation, 'original-image-v1'); + assert.equal(result.mimeType, 'image/jpeg'); + assert.equal(result.width, 13); + assert.equal(result.height, 17); + assert.equal(result.data, Buffer.from(bytes).toString('base64')); + assert.equal(result.sha256, createHash('sha256').update(bytes).digest('hex')); +}); +test('remote refuses original bytes before reading them', async () => { + const result = await read({transport:undefined}, {getImageByHash: () => { throw Error('remote must refuse first'); }}); + assert.equal(result.errorCode, 'DEVUP_ORIGINAL_IMAGE_REQUIRES_BRIDGE'); +}); +test('stale selected paint is refused', async () => { + assert.equal((await read({imageHash:'stale'})).errorCode, 'DEVUP_ASSET_SOURCE_CHANGED'); +}); +test('missing source image is diagnosed distinctly', async () => { + assert.equal((await read({}, {getImageByHash: () => null})).errorCode, 'DEVUP_ORIGINAL_IMAGE_NOT_FOUND'); +}); +test('source reads obey the byte cap and do not reinterpret unknown codecs', async () => { + for (const [data, expected] of [[new Uint8Array(), 'DEVUP_ASSET_RESPONSE_TOO_LARGE'], + [new Uint8Array(8 * 1024 * 1024 + 1), 'DEVUP_ASSET_RESPONSE_TOO_LARGE'], + [new Uint8Array([1,2,3,4]), 'DEVUP_ORIGINAL_IMAGE_CODEC_UNSUPPORTED']]) { + const result = await read({}, {getImageByHash: () => ({getBytesAsync:async()=>data})}); + assert.equal(result.errorCode, expected); + } +}); +test('source API rejection is named as a read failure, not a node export failure', async () => { + const result = await read({}, {getImageByHash: () => ({getBytesAsync:async()=>{throw Error('read failed');}})}); + assert.equal(result.errorCode, 'DEVUP_ORIGINAL_IMAGE_READ_FAILED'); +}); diff --git a/docs/bridge-original-image-bytes.md b/docs/bridge-original-image-bytes.md new file mode 100644 index 0000000..27ac0de --- /dev/null +++ b/docs/bridge-original-image-bytes.md @@ -0,0 +1,182 @@ +# Original image bytes over the bridge; isolated-fill correction remains unmeasured + +Base: `4a0e434b4448f4c6c28105e609c34cd3fb06e258`. This change implements the +read-only original-upload transport and a runnable capture entry point. It does +not implement or claim a pixel correction to `about-422-3376`. + +## Implemented representation and transport + +`AssetRequest::original_image(node_id, fill_index, image_hash)` creates a distinct +`$original-image/fills/N` request with an `original-image-v1` asset identity. +Pass it to `ReadToolCall::asset_export`, then decode the response with +`original_image_from_result`. The bridge sends the existing statically bundled +`assets` script with an explicit `transport: "bridge"` parameter. It never sends +caller-supplied JavaScript. + +The script validates the selected IMAGE paint's hash before calling +`figma.getImageByHash(hash).getBytesAsync()` and `getSizeAsync()`. It creates no +nodes, removes no nodes, and never calls `node.exportAsync` on this route. A +hidden image before the selected image does not change the selection. + +The response has kind `devupOriginalImage`, representation `original-image-v1`, +original MIME, intrinsic dimensions, byte count, SHA-256 and base64 bytes. Its +format and scale are null: the shared request envelope's PNG/scale placeholders +do **not** convert an original JPEG into a node-sized PNG. The separate Rust +decoder checks representation, file/request/version identity, positive intrinsic +dimensions, byte length, SHA-256 and the PNG/JPEG/GIF/WebP signature. Signature +checking is not a full image decode; dimensions are those reported by the Plugin +API. The original bytes are not re-encoded. The existing 8 MiB byte cap applies. + +The remote request has no bridge opt-in and returns the named diagnostic +`DEVUP_ORIGINAL_IMAGE_REQUIRES_BRIDGE` before reading image bytes. The remote MCP +has a truncated text envelope and no general original-byte attachment transport; +this route does not attempt to hide base64 in that envelope or substitute a +whole-node export. An older plugin returns `DEVUP_ASSET_FIELD_UNSUPPORTED`, which +the decoder retains as a named failure. Missing image, unsupported codec, source +hash change, size limit and Plugin API read failure also retain distinct codes. + +The ordinary node-export path is unchanged. No generated image URL, manifest +discovery policy, crop rule, codegen mapping, sourceMap resolution, Korean +`keep-all`, threshold or plugin golden changes. No new derived CSS mapping is +claimed. The raw response is deliberately separate from `AssetManifestEntry`. +The MCP `devup_figma_export` asset-selection surface still requests renditions; +the additive raw API and capture example are the entry points in this change. + +## Tests first and verified boundary + +Logs live under this worktree's ignored `harness/render/out/`. + +* `w25-source-red.log`: four script tests failed before implementation, including + wrong `failed` status and `DEVUP_ASSET_FIELD_UNSUPPORTED` in place of the + required original-byte and remote-refusal responses. +* `w25-rust-red.log`: the bridge marker test failed with null instead of `bridge`. +* `w25-decoder-red.log`: the new decoder/constructor API was absent. This is a + missing-API compile failure, separately recorded from the behavioral RED tests. +* `w25-source-read-error-red.log`: a source read failure incorrectly returned the + generic node-export failure before its diagnostic was corrected. +* The final script contract covers source selection, unchanged original bytes, + intrinsic codec/dimensions, remote refusal, stale hash, missing image, empty and + oversized results, unsupported codec and read exceptions. +* The Rust decoder tests reject altered image hash, version, SHA-256, byte count, + MIME, zero dimensions and representation. A real local WebSocket integration + test round-trips **1,100,000 bytes** and compares every reconstructed byte. + The fake plugin in that test does not establish live Figma execution. + +## Own baseline, repeated + +Production was built from the unmodified base before changing any production +source. The build label includes `-dirty` because the first untracked regression +test was present during compilation. The preserved own executable is +`harness/render/out/w25-baseline.exe`, SHA-256 +`1c52c63d38bbb5c3dc99b33950a40dc23daddbf20620907d2c07a44f5f41b510`. + +The unchanged harness ran in this worktree with a copied existing call bank and +asset inventory, avoiding shared generated inputs. `DEVUP_MCP_BIN` selected the +preserved executable. Acquisition completed for all three about screens and two +render runs reproduced the exact metrics, using theme `67d6de70e679`. + +| Screen | Own baseline, both runs | Changed pixels | +| --- | ---: | ---: | +| about-422-3376 | 5.431783302639656% | 141,574 | +| about-422-3180 | 2.9337565804958983% | 163,529 | +| about-422-2987 | 1.768271319459043% | 161,504 | + +The deliberate Korean allowance remains excluded from defect accounting: +5.4317833026 - approximately 0.21 = **5.2217833026pp**. No wrap experiment was +performed. The existing one-pixel excess page heights on the wider screens +remain 5,620 versus 5,619 and 4,758 versus 4,757. + +The own candidate was rebuilt, preserved as `harness/render/out/w25-candidate.exe` +and freshly reacquired before measurement. Its SHA-256 is +`9d36bb8cc8608f7d2ed041fe34e293868c780f9702ce14358aaddb0aa362b14c`. +Both candidate render runs are environment-valid and reproduce every exact +baseline metric above: **zero improvement and zero regression on about**. +The final actual PNGs are byte-identical to the final baseline PNGs, and all +acquisition input hashes agree. Exact run metrics and hashes are retained in +[bridge-original-image-evidence.json](bridge-original-image-evidence.json). +The other eleven screens were not measured by this bounded transport task; +no corpus-wide visual improvement or regression result is claimed. + +## What specifically remains unobserved + +No live original bytes were obtained. The process on port 1993 is an older +connected server; another server cannot share its in-memory bridge. A plugin is +attached, but it executes the old static bundle. Rebuilding a server or setting +`DEVUP_MCP_BIN` alone cannot update that running plugin. There is no arbitrary +script tool on the connected server. The coordinator confirmed these facts and +directed delivery of this tested route and bounded negative, with live capture +and pixel correction following a human plugin reload. + +This is a deployment/reload boundary, **not authentication**. The token diagnosis +from the previous report is not reused. Searching the copied call bank found no +`getImageByHash`, `devupOriginalImage` or `original-image-v1` response to reuse. +The previously established whole-node PNGs remain unsuitable source bytes. + +Even after capture, original uploads alone do not satisfy +[the isolated-fill contract](isolated-fill-export-contract.md). A host renderer +must still apply the selected paint's local box, FILL/FIT/CROP/TILE transform, +rotation, visibility, opacity and supported filters exactly once, retaining +transparent margins and excluding other paints, strokes, effects and children. +It must carry a new isolated-rendition identity through discovery, delivery, +cache URLs and provenance, retain folded-node asset semantics, refuse unsupported +composition explicitly, and validate the heroes and eleven existing CROP assets. +None of that missing renderer is disguised as source retrieval here. + +## Exact next capture + +1. Build the plugin: `cd plugin`, `npm install`, `npm run build`. The committed + `plugin/dist/code.js` already contains this source route. +2. In Figma Desktop choose **Plugins → Development → Import plugin from + manifest**, select this checkout's `plugin/manifest.json`, close the old + running Devup Bridge plugin, and run the newly imported **Devup Bridge** on + file `f1AJyo27afkkr6U9PhnWSu`. Keep its window open. The menu path is the + repository's installation instruction; it was not exercised during this run. +3. Free port 1993 by stopping its current server through its owning client, then + run the capture below. Alternatively a different port must match all three + settings in `plugin/manifest.json`, `plugin/src/code.ts` and + `DEVUP_FIGMA_BRIDGE_PORT`, followed by rebuilding and reloading the plugin. + +From the repository root, with the required build environment: + +```powershell +$env:CARGO_PROFILE_DEV_DEBUG='0' +$env:CARGO_PROFILE_TEST_DEBUG='0' +$env:CARGO_INCREMENTAL='0' +cargo run --locked -p devup-mcp-figma --example original_image_probe -j 2 -- f1AJyo27afkkr6U9PhnWSu 422:3378 0 09939a0d306a1dc967f5f04afa6756203ca92dec about-hero.original +``` + +The probe waits at most 60 seconds for the plugin, validates the response, writes +the exact bytes to a new file (refusing overwrite), and prints capture metadata. +It does not fall back to remote. The selected source is fill 0 of `422:3378`; +`422:3183` and `422:2989` share that hash. Its output explicitly records version +null: the Plugin API read does not establish a file-version assertion. Recollect +paint metadata before implementing the renderer if the design has changed. + +## Final gate + +All Cargo work used this worktree's own target, `CARGO_PROFILE_DEV_DEBUG=0`, +`CARGO_PROFILE_TEST_DEBUG=0`, `CARGO_INCREMENTAL=0` and two jobs (including +`CARGO_BUILD_JOBS=2` for Insta). `CARGO_TARGET_DIR` was never set. + +| Gate | Observed result | +| --- | --- | +| `cargo fmt --all -- --check` | Pass | +| `cargo clippy --locked --workspace --all-targets --all-features -j 2 -- -D warnings` | Pass, zero warnings | +| `cargo test --workspace -j 2 --no-fail-fast` | 1,122 passed, 0 failed, 2 ignored | +| `cargo insta test --workspace --all-features --check` | 1,122 passed, 0 failed, 2 ignored; no snapshots to review | +| `cargo test --locked -p devup-mcp --test stdio_smoke -j 2` | 2 passed, 0 failed | +| `npm install` and `npm run build` in `plugin/` | Pass; committed dist rebuilt | +| Repeated plugin build | Identical SHA-256 `dc7f8717807e0b095ded30073226257448d33b88fd8ffd435751a8561f7b5a31` | + +Gate logs are `w25-fmt.log`, `w25-clippy-final.log`, `w25-workspace.log`, +`w25-insta.log`, `w25-smoke.log` and `w25-plugin-build.log` under the local +harness `out/`. Ordinary MSVC linking emits its existing localized +library-creation warning; Clippy itself has zero warnings. All 268 plugin +goldens and their manifest are unchanged, and the corpus consistency test +passes. No off-limits source file, harness script, shared codegen file or +provenance file was edited. + +The change is one local commit without a push, followed by `cargo clean`. +Acquisition and rendering children exited; the pre-existing server on port +1993 was not stopped. The remaining deliverable is live original capture after +plugin reload, followed by an independently validated isolated-fill correction. diff --git a/docs/bridge-original-image-evidence.json b/docs/bridge-original-image-evidence.json new file mode 100644 index 0000000..d73e8ca --- /dev/null +++ b/docs/bridge-original-image-evidence.json @@ -0,0 +1,562 @@ +{ + "base": "4a0e434b4448f4c6c28105e609c34cd3fb06e258", + "baselineBinarySha256": "1c52c63d38bbb5c3dc99b33950a40dc23daddbf20620907d2c07a44f5f41b510", + "candidateBinarySha256": "9d36bb8cc8608f7d2ed041fe34e293868c780f9702ce14358aaddb0aa362b14c", + "baselineRuns": [ + [ + { + "name": "about-422-3376", + "environmentStatus": "valid", + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 360, + 7240 + ], + "actualDimensions": [ + 360, + 7240 + ], + "changedPixels": 141574, + "totalPixels": 2606400, + "changedRatio": 0.05431783302639656, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W25-A-source-pixels\\harness\\render\\out\\about-422-3376.diff.png" + }, + "inputInventorySha256": "59a8f2d1884b725236c8b6d792c35ad249b862e3183cbabce4c89fabc0231e44" + }, + { + "name": "about-422-3180", + "environmentStatus": "valid", + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 992, + 5619 + ], + "actualDimensions": [ + 992, + 5619 + ], + "changedPixels": 163529, + "totalPixels": 5574048, + "changedRatio": 0.02933756580495898, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W25-A-source-pixels\\harness\\render\\out\\about-422-3180.diff.png" + }, + "inputInventorySha256": "6bd5ef04063fbc6d2567aea9a3eef944028aba6cdcce8d32639b42733c2e6111" + }, + { + "name": "about-422-2987", + "environmentStatus": "valid", + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 1920, + 4757 + ], + "actualDimensions": [ + 1920, + 4757 + ], + "changedPixels": 161504, + "totalPixels": 9133440, + "changedRatio": 0.01768271319459043, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W25-A-source-pixels\\harness\\render\\out\\about-422-2987.diff.png" + }, + "inputInventorySha256": "c19a78fdadea7bb46db9280bbe5c367de6320671856d8046679d438ed6d0870d" + } + ], + [ + { + "name": "about-422-3376", + "environmentStatus": "valid", + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 360, + 7240 + ], + "actualDimensions": [ + 360, + 7240 + ], + "changedPixels": 141574, + "totalPixels": 2606400, + "changedRatio": 0.05431783302639656, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W25-A-source-pixels\\harness\\render\\out\\about-422-3376.diff.png" + }, + "actualSha256": "b5b4811070234e052c2f0ecbf2405ecced400aa14a0813661c2331a70899505b", + "inputInventorySha256": "59a8f2d1884b725236c8b6d792c35ad249b862e3183cbabce4c89fabc0231e44" + }, + { + "name": "about-422-3180", + "environmentStatus": "valid", + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 992, + 5619 + ], + "actualDimensions": [ + 992, + 5619 + ], + "changedPixels": 163529, + "totalPixels": 5574048, + "changedRatio": 0.02933756580495898, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W25-A-source-pixels\\harness\\render\\out\\about-422-3180.diff.png" + }, + "actualSha256": "ea08e788ce5c65d1d2c6377a022a3934c6d0707ec1a4c73eedb690c6161627a2", + "inputInventorySha256": "6bd5ef04063fbc6d2567aea9a3eef944028aba6cdcce8d32639b42733c2e6111" + }, + { + "name": "about-422-2987", + "environmentStatus": "valid", + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 1920, + 4757 + ], + "actualDimensions": [ + 1920, + 4757 + ], + "changedPixels": 161504, + "totalPixels": 9133440, + "changedRatio": 0.01768271319459043, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W25-A-source-pixels\\harness\\render\\out\\about-422-2987.diff.png" + }, + "actualSha256": "1ff44ea5a12777ee3c5f13e8bc0edc5a1aca42c5d6cea8ae2f426438c91a9145", + "inputInventorySha256": "c19a78fdadea7bb46db9280bbe5c367de6320671856d8046679d438ed6d0870d" + } + ] + ], + "candidateRuns": [ + [ + { + "name": "about-422-3376", + "environmentStatus": "valid", + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 360, + 7240 + ], + "actualDimensions": [ + 360, + 7240 + ], + "changedPixels": 141574, + "totalPixels": 2606400, + "changedRatio": 0.05431783302639656, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W25-A-source-pixels\\harness\\render\\out\\about-422-3376.diff.png" + }, + "inputInventorySha256": "59a8f2d1884b725236c8b6d792c35ad249b862e3183cbabce4c89fabc0231e44" + }, + { + "name": "about-422-3180", + "environmentStatus": "valid", + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 992, + 5619 + ], + "actualDimensions": [ + 992, + 5619 + ], + "changedPixels": 163529, + "totalPixels": 5574048, + "changedRatio": 0.02933756580495898, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W25-A-source-pixels\\harness\\render\\out\\about-422-3180.diff.png" + }, + "inputInventorySha256": "6bd5ef04063fbc6d2567aea9a3eef944028aba6cdcce8d32639b42733c2e6111" + }, + { + "name": "about-422-2987", + "environmentStatus": "valid", + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 1920, + 4757 + ], + "actualDimensions": [ + 1920, + 4757 + ], + "changedPixels": 161504, + "totalPixels": 9133440, + "changedRatio": 0.01768271319459043, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W25-A-source-pixels\\harness\\render\\out\\about-422-2987.diff.png" + }, + "inputInventorySha256": "c19a78fdadea7bb46db9280bbe5c367de6320671856d8046679d438ed6d0870d" + } + ], + [ + { + "name": "about-422-3376", + "environmentStatus": "valid", + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 360, + 7240 + ], + "actualDimensions": [ + 360, + 7240 + ], + "changedPixels": 141574, + "totalPixels": 2606400, + "changedRatio": 0.05431783302639656, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W25-A-source-pixels\\harness\\render\\out\\about-422-3376.diff.png" + }, + "actualSha256": "b5b4811070234e052c2f0ecbf2405ecced400aa14a0813661c2331a70899505b", + "inputInventorySha256": "59a8f2d1884b725236c8b6d792c35ad249b862e3183cbabce4c89fabc0231e44" + }, + { + "name": "about-422-3180", + "environmentStatus": "valid", + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 992, + 5619 + ], + "actualDimensions": [ + 992, + 5619 + ], + "changedPixels": 163529, + "totalPixels": 5574048, + "changedRatio": 0.02933756580495898, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W25-A-source-pixels\\harness\\render\\out\\about-422-3180.diff.png" + }, + "actualSha256": "ea08e788ce5c65d1d2c6377a022a3934c6d0707ec1a4c73eedb690c6161627a2", + "inputInventorySha256": "6bd5ef04063fbc6d2567aea9a3eef944028aba6cdcce8d32639b42733c2e6111" + }, + { + "name": "about-422-2987", + "environmentStatus": "valid", + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 1920, + 4757 + ], + "actualDimensions": [ + 1920, + 4757 + ], + "changedPixels": 161504, + "totalPixels": 9133440, + "changedRatio": 0.01768271319459043, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W25-A-source-pixels\\harness\\render\\out\\about-422-2987.diff.png" + }, + "actualSha256": "1ff44ea5a12777ee3c5f13e8bc0edc5a1aca42c5d6cea8ae2f426438c91a9145", + "inputInventorySha256": "c19a78fdadea7bb46db9280bbe5c367de6320671856d8046679d438ed6d0870d" + } + ] + ], + "liveOriginalBytesObtained": false, + "aboutLastActualPngsByteIdentical": true, + "aboutInputHashesIdentical": true, + "sharedInputHashes": { + "about-422-3376": { + "src/screens/about-422-3376.tsx": "72d92ac544a77e758fb6547b2085b984d82728cb814bcc2a0a25a7bc2b73827c", + "themes/about-422-3376.json": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7", + "out/about-422-3376.reference.png": "183b29572ab786dbe588e0bfed57db8210920e4f070dfb22226065a6545c17f8", + "out/about-422-3376-422-3376.snapshot.json": "6e68ee5121616f01497345619f8185f6c37fdab363d9132c388738fdd599ebdd", + "public/images/Section1-422-2989.png": "40b072777cb9dde85763e63e029239cb1d7e14409f8b316d7283697abcc53868", + "public/images/2-1-422-2991-04c06818b22f.png": "e6015ba1c9fb9303d471cf0eb7405afa8e255825684f506b7a0a53ff93fe9c8e", + "public/images/Frame-269-422-2996-e302b6b111d4.png": "6a0ae8afa45e6b73a2620d0545a7fed0445ff52515377d8b85db4889db2906ce", + "public/icons/file-analytic_14427169-1-422-3010-c18bf91459ac.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3028-21f19fe34057.svg": "e94970ba54e1861da6777e7f8c1094161e9958c3cd7b43fb3ea73cd771cc6a12", + "public/icons/meeting_1621655-1-422-3059-fbf10cffffdc.svg": "3380c956ec0a7935618109ea320b56b56c8821f0e3d34023fa8a982998df1133", + "public/icons/422-3095-55250514fb17.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3097-0d37556a31a6.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3100-68fcd7ce5191.svg": "f853f0aa03903d26ff4ac0658f81eaa357b78b9881b2e8d2c47ac345e879e38e", + "public/images/Frame-1000014115-422-3106-47c4161cbfdc.png": "dd6cb90a65d7ed388b93a7e3ce60b6c4138c54d23a5e24867ce02720b56202a1", + "public/images/Frame-256-422-3125-2-176f1c6fe3ab.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3133-3ccb13ba51fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3137-5e3d7d6e17fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3141-107eb1e2beea.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3145-2-357f7710ea85.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3150-12eb2516b4d2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3154-a2eb9f1af7d7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3158-4f13a54de65b.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3162-2-e27c69996ca2.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3167-54ec1d92f274.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3171-2-a35dcd9fae03.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3176-97916df902d3.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3183.png": "7720dc3e1f4c9659ffe9fe55604e4bdac5db1e04a7dad88d70890e3c9e7a9fe8", + "public/images/2-1-422-3185-c2c2bb9fd4ca.png": "1c38f71561ca2fd4aefa625958d9101e178e1540887049db544c37884f22dc79", + "public/images/Frame-269-422-3190-fd04b8b6b1f3.png": "47be398c71c507eede8a2545697ea8db2fe60a9cd2dbfe4d4ef777e7852454b3", + "public/icons/file-analytic_14427169-1-422-3204-432c13ca99bd.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3222-b3e9e8487485.svg": "c7a372e75e151f942986fbe8a32a4b1a002ed0f105462a2284b3304d50af77ba", + "public/icons/meeting_1621655-1-422-3253-298cce04954e.svg": "39c1f190f5337a2ef2131d345ecb1cc385d7360861d517111901def4511fe106", + "public/icons/422-3289-1341670f1470.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3291-f455a67c7691.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3294-2f23118b8931.svg": "b30a7b5201b6438bbe3fa0eede1f571bc14f7ca53cbb3e7cd6f073a1c7dea28a", + "public/images/Frame-1000014115-422-3300-897dd4548a76.png": "0f14e1f6ba38c889b2a79213a07671cbc7ff77bc64bf0b684ab5d828b0e47ff0", + "public/images/Frame-256-422-3320-2-2f4ae32bf58f.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3328-3a4711366ec2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3332-afb9a56cd5bf.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3336-2f9cf19d6dce.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3340-2-a9b56c699b23.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3345-d5b693523dde.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3349-0d8a14703259.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3353-eaa50e1d86e7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3358-2-0adcc70fa0d7.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3363-2b09fc7a41f0.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3367-2-4d462c68adbb.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3372-240bfbcd93a8.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3378.png": "ba4cd45f211bb5e4e73d4bf75981f6f2aed04575e1b82fbb4afbb09c80a92c1c", + "public/images/2-1-422-3380-cb2a0042a641.png": "a6604f6a23668a36fe7669bb7dae27e1303241e319ec3c5fc004cef912a4df27", + "public/images/Frame-269-422-3392-5be2d3573dd4.png": "856609c2b24d369580edb5cb87430ad33ea8fbc3f5a559fe8e9969c70b781931", + "public/icons/file-analytic_14427169-1-422-3399-139dd88e7135.svg": "0071bed431ba0fd316d73e20f975881603c259cbcd21ed7c1c6c327cd5a115b9", + "public/icons/shopping-list_1288709-1-422-3417-791e321745e1.svg": "03466401cfb2bdba43054fab1e191393bcf405cb23987e40ff32f20ebd264ab8", + "public/icons/meeting_1621655-1-422-3448-05d5b482e0b5.svg": "cbe97ff3f21e401fdea44bd56b50deb907688d9fe70a6ac359c43f72c8b0cb72", + "public/icons/puzzle_17833563-1-422-3481-a67ca4e245af.svg": "9e48c170db858584703aa6a6ad8ef1d87497787be9d78ae7e0b97ac707436b7d", + "public/icons/422-3486-2489fb200011.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3488-1c4e20055c2e.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/images/Frame-1000014115-422-3495-753f13b2e0dd.png": "8dbde872e57446334285215e31b7ce62888ecc6f734ef80d0b0cbf043fa71ab8", + "public/images/Frame-256-422-3514-2-ef1ce40418b8.png": "85a1ac763f2ba75cf4439afe43c79e93d3b9223698e5ddd6f27f7abfc44f5ff6", + "public/icons/Frame-287-422-3522-69bff93d7324.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3526-6b5842e92a01.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3530-14f6769de568.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-257-422-3534-2-48ea6bc9848a.png": "1ea58b9e09a248bcfa987612c7c9525cd5ac91c162d284c4ecfb163c135e3e7b", + "public/icons/Frame-287-422-3539-b40757ac8c31.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3543-518a0dce63b4.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3547-71792e0420f0.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-258-422-3551-2-212ce23b8c62.png": "bb6358a55187f71806b213afa22a8a631290f7643caa60099d70316682a4e42b", + "public/icons/Frame-287-422-3556-ef8452af3a3e.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-259-422-3560-2-502893d58465.png": "fbe4631ff8bd6375993763bb6c0e8cbd5c4cfe8bd27ec9e3765a2add021d43b9", + "public/icons/Frame-287-422-3565-d40d8a2c65bb.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-1000014286-I422-2988-935-102168-8297aaad000c.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3179-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-location-60eb5ab59e5e.svg": "d3941032c41126ef38a5c1e529a4300029c2514f827b84319c54f87def94b031", + "public/icons/Icons-tel-b5d1fc7747cd.svg": "89a41a35802eb8d04d6716354e1d7058105fc13b8743210a0a7a4fbb18882493", + "public/icons/Icons-email-c8a6dae31bb4.svg": "1dcb7f565b0412e496f625d248ce973abc44b545b9ed7015644deaf0d6fac8ca", + "public/icons/Icons-insta-8f3f8e048fd3.svg": "5ccbd4b5ddacef31234d53d90993935ea6e65f138f31c607ee77b1c0c17954ed", + "public/icons/Icons-mention-a09d585d05ef.svg": "6a55243c947343a2d9d67a42382017a1fdf91ec52756833bdb8b9c583bb6eb53", + "public/icons/Icons-docs-7356013800c3.svg": "acad8716a68f6071b024beccd78080560cff32b1c3ee1a84082d75a360b7ec5e", + "public/icons/Frame-1000014286-I422-3182-935-102168-a94614c9360a.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3375-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-hamburger-cf989eed2cd8.svg": "ac9e2bfeabbaa0102254d8f53bc597888c73af1e226ae0c4bc381ce90f1132d3", + "public/icons/Frame-1000014285-I422-3377-935-101749-cfb195196c6c.svg": "8a0565afa4709169455563a507331af0f1994406746f2f27b3c56f60dc265c77", + "public/icons/P-I422-3568-277-7767.svg": "682a7fb16df448d4c9435bcaf6306e79761e737490e852190478246303414c37", + "public/icons/Icons-arrow-abf22ae153b4.svg": "830d5a696d483574fe3c11135427ff47c9cb86f85984de47b694e64deef7c05c" + }, + "about-422-3180": { + "src/screens/about-422-3180.tsx": "c9f36e5ee08596368962f0872314b74fd7d83ce2f9e32c230400b3e1477ccb92", + "themes/about-422-3180.json": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7", + "out/about-422-3180.reference.png": "9487389f99ba9d199262ddf0c0e8acaed0679b0aadceeb535cecb99f6b3e1faa", + "out/about-422-3180-422-3180.snapshot.json": "6e68ee5121616f01497345619f8185f6c37fdab363d9132c388738fdd599ebdd", + "public/images/Section1-422-2989.png": "40b072777cb9dde85763e63e029239cb1d7e14409f8b316d7283697abcc53868", + "public/images/2-1-422-2991-04c06818b22f.png": "e6015ba1c9fb9303d471cf0eb7405afa8e255825684f506b7a0a53ff93fe9c8e", + "public/images/Frame-269-422-2996-e302b6b111d4.png": "6a0ae8afa45e6b73a2620d0545a7fed0445ff52515377d8b85db4889db2906ce", + "public/icons/file-analytic_14427169-1-422-3010-c18bf91459ac.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3028-21f19fe34057.svg": "e94970ba54e1861da6777e7f8c1094161e9958c3cd7b43fb3ea73cd771cc6a12", + "public/icons/meeting_1621655-1-422-3059-fbf10cffffdc.svg": "3380c956ec0a7935618109ea320b56b56c8821f0e3d34023fa8a982998df1133", + "public/icons/422-3095-55250514fb17.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3097-0d37556a31a6.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3100-68fcd7ce5191.svg": "f853f0aa03903d26ff4ac0658f81eaa357b78b9881b2e8d2c47ac345e879e38e", + "public/images/Frame-1000014115-422-3106-47c4161cbfdc.png": "dd6cb90a65d7ed388b93a7e3ce60b6c4138c54d23a5e24867ce02720b56202a1", + "public/images/Frame-256-422-3125-2-176f1c6fe3ab.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3133-3ccb13ba51fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3137-5e3d7d6e17fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3141-107eb1e2beea.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3145-2-357f7710ea85.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3150-12eb2516b4d2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3154-a2eb9f1af7d7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3158-4f13a54de65b.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3162-2-e27c69996ca2.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3167-54ec1d92f274.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3171-2-a35dcd9fae03.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3176-97916df902d3.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3183.png": "7720dc3e1f4c9659ffe9fe55604e4bdac5db1e04a7dad88d70890e3c9e7a9fe8", + "public/images/2-1-422-3185-c2c2bb9fd4ca.png": "1c38f71561ca2fd4aefa625958d9101e178e1540887049db544c37884f22dc79", + "public/images/Frame-269-422-3190-fd04b8b6b1f3.png": "47be398c71c507eede8a2545697ea8db2fe60a9cd2dbfe4d4ef777e7852454b3", + "public/icons/file-analytic_14427169-1-422-3204-432c13ca99bd.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3222-b3e9e8487485.svg": "c7a372e75e151f942986fbe8a32a4b1a002ed0f105462a2284b3304d50af77ba", + "public/icons/meeting_1621655-1-422-3253-298cce04954e.svg": "39c1f190f5337a2ef2131d345ecb1cc385d7360861d517111901def4511fe106", + "public/icons/422-3289-1341670f1470.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3291-f455a67c7691.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3294-2f23118b8931.svg": "b30a7b5201b6438bbe3fa0eede1f571bc14f7ca53cbb3e7cd6f073a1c7dea28a", + "public/images/Frame-1000014115-422-3300-897dd4548a76.png": "0f14e1f6ba38c889b2a79213a07671cbc7ff77bc64bf0b684ab5d828b0e47ff0", + "public/images/Frame-256-422-3320-2-2f4ae32bf58f.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3328-3a4711366ec2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3332-afb9a56cd5bf.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3336-2f9cf19d6dce.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3340-2-a9b56c699b23.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3345-d5b693523dde.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3349-0d8a14703259.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3353-eaa50e1d86e7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3358-2-0adcc70fa0d7.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3363-2b09fc7a41f0.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3367-2-4d462c68adbb.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3372-240bfbcd93a8.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3378.png": "ba4cd45f211bb5e4e73d4bf75981f6f2aed04575e1b82fbb4afbb09c80a92c1c", + "public/images/2-1-422-3380-cb2a0042a641.png": "a6604f6a23668a36fe7669bb7dae27e1303241e319ec3c5fc004cef912a4df27", + "public/images/Frame-269-422-3392-5be2d3573dd4.png": "856609c2b24d369580edb5cb87430ad33ea8fbc3f5a559fe8e9969c70b781931", + "public/icons/file-analytic_14427169-1-422-3399-139dd88e7135.svg": "0071bed431ba0fd316d73e20f975881603c259cbcd21ed7c1c6c327cd5a115b9", + "public/icons/shopping-list_1288709-1-422-3417-791e321745e1.svg": "03466401cfb2bdba43054fab1e191393bcf405cb23987e40ff32f20ebd264ab8", + "public/icons/meeting_1621655-1-422-3448-05d5b482e0b5.svg": "cbe97ff3f21e401fdea44bd56b50deb907688d9fe70a6ac359c43f72c8b0cb72", + "public/icons/puzzle_17833563-1-422-3481-a67ca4e245af.svg": "9e48c170db858584703aa6a6ad8ef1d87497787be9d78ae7e0b97ac707436b7d", + "public/icons/422-3486-2489fb200011.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3488-1c4e20055c2e.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/images/Frame-1000014115-422-3495-753f13b2e0dd.png": "8dbde872e57446334285215e31b7ce62888ecc6f734ef80d0b0cbf043fa71ab8", + "public/images/Frame-256-422-3514-2-ef1ce40418b8.png": "85a1ac763f2ba75cf4439afe43c79e93d3b9223698e5ddd6f27f7abfc44f5ff6", + "public/icons/Frame-287-422-3522-69bff93d7324.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3526-6b5842e92a01.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3530-14f6769de568.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-257-422-3534-2-48ea6bc9848a.png": "1ea58b9e09a248bcfa987612c7c9525cd5ac91c162d284c4ecfb163c135e3e7b", + "public/icons/Frame-287-422-3539-b40757ac8c31.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3543-518a0dce63b4.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3547-71792e0420f0.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-258-422-3551-2-212ce23b8c62.png": "bb6358a55187f71806b213afa22a8a631290f7643caa60099d70316682a4e42b", + "public/icons/Frame-287-422-3556-ef8452af3a3e.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-259-422-3560-2-502893d58465.png": "fbe4631ff8bd6375993763bb6c0e8cbd5c4cfe8bd27ec9e3765a2add021d43b9", + "public/icons/Frame-287-422-3565-d40d8a2c65bb.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-1000014286-I422-2988-935-102168-8297aaad000c.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3179-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-location-60eb5ab59e5e.svg": "d3941032c41126ef38a5c1e529a4300029c2514f827b84319c54f87def94b031", + "public/icons/Icons-tel-b5d1fc7747cd.svg": "89a41a35802eb8d04d6716354e1d7058105fc13b8743210a0a7a4fbb18882493", + "public/icons/Icons-email-c8a6dae31bb4.svg": "1dcb7f565b0412e496f625d248ce973abc44b545b9ed7015644deaf0d6fac8ca", + "public/icons/Icons-insta-8f3f8e048fd3.svg": "5ccbd4b5ddacef31234d53d90993935ea6e65f138f31c607ee77b1c0c17954ed", + "public/icons/Icons-mention-a09d585d05ef.svg": "6a55243c947343a2d9d67a42382017a1fdf91ec52756833bdb8b9c583bb6eb53", + "public/icons/Icons-docs-7356013800c3.svg": "acad8716a68f6071b024beccd78080560cff32b1c3ee1a84082d75a360b7ec5e", + "public/icons/Frame-1000014286-I422-3182-935-102168-a94614c9360a.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3375-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-hamburger-cf989eed2cd8.svg": "ac9e2bfeabbaa0102254d8f53bc597888c73af1e226ae0c4bc381ce90f1132d3", + "public/icons/Frame-1000014285-I422-3377-935-101749-cfb195196c6c.svg": "8a0565afa4709169455563a507331af0f1994406746f2f27b3c56f60dc265c77", + "public/icons/P-I422-3568-277-7767.svg": "682a7fb16df448d4c9435bcaf6306e79761e737490e852190478246303414c37", + "public/icons/Icons-arrow-abf22ae153b4.svg": "830d5a696d483574fe3c11135427ff47c9cb86f85984de47b694e64deef7c05c" + }, + "about-422-2987": { + "src/screens/about-422-2987.tsx": "e0c1ba3c07a85b4a785906a74383ec9c35480a7e95a8d81ecd3df2506fd5f7e6", + "themes/about-422-2987.json": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7", + "out/about-422-2987.reference.png": "6dc173242afb2bc5ad5d7262d4d23acd1ec7fcc468db32c413cc5356b3dd9120", + "out/about-422-2987-422-2987.snapshot.json": "6e68ee5121616f01497345619f8185f6c37fdab363d9132c388738fdd599ebdd", + "public/images/Section1-422-2989.png": "40b072777cb9dde85763e63e029239cb1d7e14409f8b316d7283697abcc53868", + "public/images/2-1-422-2991-04c06818b22f.png": "e6015ba1c9fb9303d471cf0eb7405afa8e255825684f506b7a0a53ff93fe9c8e", + "public/images/Frame-269-422-2996-e302b6b111d4.png": "6a0ae8afa45e6b73a2620d0545a7fed0445ff52515377d8b85db4889db2906ce", + "public/icons/file-analytic_14427169-1-422-3010-c18bf91459ac.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3028-21f19fe34057.svg": "e94970ba54e1861da6777e7f8c1094161e9958c3cd7b43fb3ea73cd771cc6a12", + "public/icons/meeting_1621655-1-422-3059-fbf10cffffdc.svg": "3380c956ec0a7935618109ea320b56b56c8821f0e3d34023fa8a982998df1133", + "public/icons/422-3095-55250514fb17.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3097-0d37556a31a6.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3100-68fcd7ce5191.svg": "f853f0aa03903d26ff4ac0658f81eaa357b78b9881b2e8d2c47ac345e879e38e", + "public/images/Frame-1000014115-422-3106-47c4161cbfdc.png": "dd6cb90a65d7ed388b93a7e3ce60b6c4138c54d23a5e24867ce02720b56202a1", + "public/images/Frame-256-422-3125-2-176f1c6fe3ab.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3133-3ccb13ba51fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3137-5e3d7d6e17fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3141-107eb1e2beea.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3145-2-357f7710ea85.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3150-12eb2516b4d2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3154-a2eb9f1af7d7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3158-4f13a54de65b.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3162-2-e27c69996ca2.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3167-54ec1d92f274.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3171-2-a35dcd9fae03.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3176-97916df902d3.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3183.png": "7720dc3e1f4c9659ffe9fe55604e4bdac5db1e04a7dad88d70890e3c9e7a9fe8", + "public/images/2-1-422-3185-c2c2bb9fd4ca.png": "1c38f71561ca2fd4aefa625958d9101e178e1540887049db544c37884f22dc79", + "public/images/Frame-269-422-3190-fd04b8b6b1f3.png": "47be398c71c507eede8a2545697ea8db2fe60a9cd2dbfe4d4ef777e7852454b3", + "public/icons/file-analytic_14427169-1-422-3204-432c13ca99bd.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3222-b3e9e8487485.svg": "c7a372e75e151f942986fbe8a32a4b1a002ed0f105462a2284b3304d50af77ba", + "public/icons/meeting_1621655-1-422-3253-298cce04954e.svg": "39c1f190f5337a2ef2131d345ecb1cc385d7360861d517111901def4511fe106", + "public/icons/422-3289-1341670f1470.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3291-f455a67c7691.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3294-2f23118b8931.svg": "b30a7b5201b6438bbe3fa0eede1f571bc14f7ca53cbb3e7cd6f073a1c7dea28a", + "public/images/Frame-1000014115-422-3300-897dd4548a76.png": "0f14e1f6ba38c889b2a79213a07671cbc7ff77bc64bf0b684ab5d828b0e47ff0", + "public/images/Frame-256-422-3320-2-2f4ae32bf58f.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3328-3a4711366ec2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3332-afb9a56cd5bf.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3336-2f9cf19d6dce.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3340-2-a9b56c699b23.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3345-d5b693523dde.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3349-0d8a14703259.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3353-eaa50e1d86e7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3358-2-0adcc70fa0d7.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3363-2b09fc7a41f0.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3367-2-4d462c68adbb.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3372-240bfbcd93a8.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3378.png": "ba4cd45f211bb5e4e73d4bf75981f6f2aed04575e1b82fbb4afbb09c80a92c1c", + "public/images/2-1-422-3380-cb2a0042a641.png": "a6604f6a23668a36fe7669bb7dae27e1303241e319ec3c5fc004cef912a4df27", + "public/images/Frame-269-422-3392-5be2d3573dd4.png": "856609c2b24d369580edb5cb87430ad33ea8fbc3f5a559fe8e9969c70b781931", + "public/icons/file-analytic_14427169-1-422-3399-139dd88e7135.svg": "0071bed431ba0fd316d73e20f975881603c259cbcd21ed7c1c6c327cd5a115b9", + "public/icons/shopping-list_1288709-1-422-3417-791e321745e1.svg": "03466401cfb2bdba43054fab1e191393bcf405cb23987e40ff32f20ebd264ab8", + "public/icons/meeting_1621655-1-422-3448-05d5b482e0b5.svg": "cbe97ff3f21e401fdea44bd56b50deb907688d9fe70a6ac359c43f72c8b0cb72", + "public/icons/puzzle_17833563-1-422-3481-a67ca4e245af.svg": "9e48c170db858584703aa6a6ad8ef1d87497787be9d78ae7e0b97ac707436b7d", + "public/icons/422-3486-2489fb200011.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3488-1c4e20055c2e.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/images/Frame-1000014115-422-3495-753f13b2e0dd.png": "8dbde872e57446334285215e31b7ce62888ecc6f734ef80d0b0cbf043fa71ab8", + "public/images/Frame-256-422-3514-2-ef1ce40418b8.png": "85a1ac763f2ba75cf4439afe43c79e93d3b9223698e5ddd6f27f7abfc44f5ff6", + "public/icons/Frame-287-422-3522-69bff93d7324.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3526-6b5842e92a01.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3530-14f6769de568.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-257-422-3534-2-48ea6bc9848a.png": "1ea58b9e09a248bcfa987612c7c9525cd5ac91c162d284c4ecfb163c135e3e7b", + "public/icons/Frame-287-422-3539-b40757ac8c31.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3543-518a0dce63b4.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3547-71792e0420f0.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-258-422-3551-2-212ce23b8c62.png": "bb6358a55187f71806b213afa22a8a631290f7643caa60099d70316682a4e42b", + "public/icons/Frame-287-422-3556-ef8452af3a3e.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-259-422-3560-2-502893d58465.png": "fbe4631ff8bd6375993763bb6c0e8cbd5c4cfe8bd27ec9e3765a2add021d43b9", + "public/icons/Frame-287-422-3565-d40d8a2c65bb.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-1000014286-I422-2988-935-102168-8297aaad000c.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3179-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-location-60eb5ab59e5e.svg": "d3941032c41126ef38a5c1e529a4300029c2514f827b84319c54f87def94b031", + "public/icons/Icons-tel-b5d1fc7747cd.svg": "89a41a35802eb8d04d6716354e1d7058105fc13b8743210a0a7a4fbb18882493", + "public/icons/Icons-email-c8a6dae31bb4.svg": "1dcb7f565b0412e496f625d248ce973abc44b545b9ed7015644deaf0d6fac8ca", + "public/icons/Icons-insta-8f3f8e048fd3.svg": "5ccbd4b5ddacef31234d53d90993935ea6e65f138f31c607ee77b1c0c17954ed", + "public/icons/Icons-mention-a09d585d05ef.svg": "6a55243c947343a2d9d67a42382017a1fdf91ec52756833bdb8b9c583bb6eb53", + "public/icons/Icons-docs-7356013800c3.svg": "acad8716a68f6071b024beccd78080560cff32b1c3ee1a84082d75a360b7ec5e", + "public/icons/Frame-1000014286-I422-3182-935-102168-a94614c9360a.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3375-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-hamburger-cf989eed2cd8.svg": "ac9e2bfeabbaa0102254d8f53bc597888c73af1e226ae0c4bc381ce90f1132d3", + "public/icons/Frame-1000014285-I422-3377-935-101749-cfb195196c6c.svg": "8a0565afa4709169455563a507331af0f1994406746f2f27b3c56f60dc265c77", + "public/icons/P-I422-3568-277-7767.svg": "682a7fb16df448d4c9435bcaf6306e79761e737490e852190478246303414c37", + "public/icons/Icons-arrow-abf22ae153b4.svg": "830d5a696d483574fe3c11135427ff47c9cb86f85984de47b694e64deef7c05c" + } + } +} diff --git a/docs/isolated-fill-export-contract.md b/docs/isolated-fill-export-contract.md index 4393c00..1e11a32 100644 --- a/docs/isolated-fill-export-contract.md +++ b/docs/isolated-fill-export-contract.md @@ -1,5 +1,11 @@ # Isolated image fills: contract and the remaining validation boundary +Follow-up: [original-image bridge retrieval](bridge-original-image-bytes.md) +implements the read-only source-byte route and capture probe. Live source capture +still requires reloading the updated plugin; isolated-fill rendering is not yet +implemented. The authentication diagnosis below is historical, not the current +validation boundary. + Investigated on `937313e39448db7f7c05dbb0ab206432261b2203`. The independent native-bridge delivery correction is described in [bridge-asset-delivery.md](bridge-asset-delivery.md). It changes transport only; diff --git a/plugin/dist/code.js b/plugin/dist/code.js index ec975ab..bd6c753 100644 --- a/plugin/dist/code.js +++ b/plugin/dist/code.js @@ -1 +1 @@ -(()=>{"use strict";let e={assets:async function(e){let t=e.asset;function r(e){return{kind:"devupAssetExport",fileKey:figma.fileKey||"",version:t.version,assetId:t.assetId,nodeId:t.nodeId,field:t.field,imageHash:t.imageHash,format:t.format,scale:t.scale,status:"failed",byteLength:null,sha256:null,errorCode:e}}try{let e=await figma.getNodeByIdAsync(t.nodeId);if(!e||"function"!=typeof e.exportAsync)return r("DEVUP_ASSET_UNSUPPORTED_BY_UPSTREAM");if("string"==typeof t.field&&t.field.startsWith("fills/")){let n=Number(t.field.slice(6)),i="fills"in e&&Array.isArray(e.fills)?e.fills:[],a=Number.isInteger(n)?i[n]:null,l=a&&"IMAGE"===a.type?a.imageHash||a.imageRef:null;if(!a||l!==t.imageHash)return r("DEVUP_ASSET_SOURCE_CHANGED")}else if("node"!==t.field)return r("DEVUP_ASSET_FIELD_UNSUPPORTED");let n=String(t.format||"").toUpperCase();if(!["PNG","JPG","SVG","PDF"].includes(n))return r("DEVUP_ASSET_FORMAT_UNSUPPORTED");let i=Math.min(4,Math.max(1,Math.floor(Number(t.scale)||1))),a="SVG"===n,l={format:a?"SVG_STRING":n};("PNG"===n||"JPG"===n)&&(l.constraint={type:"SCALE",value:i});let o=await e.exportAsync(l),s=a&&"string"==typeof o?o:null,d=null===s?o instanceof Uint8Array?o:new Uint8Array(o):function(e){let t=[];for(let r=0;r=55296&&n<=56319){let t=r+1=56320&&t<=57343?(n=65536+(n-55296<<10)+(t-56320),r+=1):n=65533}else n>=56320&&n<=57343&&(n=65533);n<128?t.push(n):n<2048?t.push(192|n>>6,128|63&n):n<65536?t.push(224|n>>12,128|n>>6&63,128|63&n):t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n)}return new Uint8Array(t)}(s);if(0===d.length||d.length>8388608)return r("DEVUP_ASSET_RESPONSE_TOO_LARGE");let f=function(e){let t=[0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0xfc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x6ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2],r=64*Math.ceil((e.length+9)/64),n=new Uint8Array(r);n.set(e),n[e.length]=128;let i=8*e.length;for(let e=0;e<8;e+=1)n[r-1-e]=255&Math.floor(i/2**(8*e));let a=[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19],l=(e,t)=>e>>>t|e<<32-t;for(let e=0;e>>3,n=l(r[e-2],17)^l(r[e-2],19)^r[e-2]>>>10;r[e]=r[e-16]+t+r[e-7]+n>>>0}let[i,o,s,d,f,u,c,y]=a;for(let e=0;e<64;e+=1){let n=l(f,6)^l(f,11)^l(f,25),a=y+n+(f&u^~f&c)+t[e]+r[e]>>>0,h=(l(i,2)^l(i,13)^l(i,22))+(i&o^i&s^o&s)>>>0;y=c,c=u,u=f,f=d+a>>>0,d=s,s=o,o=i,i=a+h>>>0}for(let[e,t]of[i,o,s,d,f,u,c,y].entries())a[e]=a[e]+t>>>0}return a.map(e=>e.toString(16).padStart(8,"0")).join("")}(d),u=figma.io&&"function"==typeof figma.io.write,c="PNG"===n&&d.length>786432;if(u&&(null!==s&&d.length>12288||c))return{kind:"devupAssetExport",fileKey:figma.fileKey||"",version:t.version,assetId:t.assetId,nodeId:t.nodeId,field:t.field,imageHash:t.imageHash,format:t.format,scale:i,status:"chunked",byteLength:d.length,sha256:f,cursor:{nextOffset:0,maxChunkBytes:12288},errorCode:null};return u&&figma.io.write(`devup-asset-${t.assetId.replace(/[^A-Za-z0-9_-]/g,"_")}.${String(t.format).toLowerCase()}`,d),{kind:"devupAssetExport",fileKey:figma.fileKey||"",version:t.version,assetId:t.assetId,nodeId:t.nodeId,field:t.field,imageHash:t.imageHash,format:t.format,scale:i,status:"exported",byteLength:d.length,sha256:f,mimeType:u?null===s?null:"image/svg+xml":({PNG:"image/png",JPG:"image/jpeg",SVG:"image/svg+xml",PDF:"application/pdf"})[n],...!u&&null===s?{data:figma.base64Encode(d)}:{},text:s,errorCode:null}}catch(e){return r("DEVUP_ASSET_EXPORT_FAILED")}},explore:async function(e){let t=await figma.getNodeByIdAsync(e.nodeId);if(!t)throw Error("DEVUP_NODE_NOT_FOUND");let r=e.explore,n=Math.max(20,Math.min(400,Number.isInteger(r.projectionLimit)?r.projectionLimit:200)),i=Math.max(0,Math.min(500,Number.isInteger(r.textPreviewLimit)?r.textPreviewLimit:160));function a(e){return"string"==typeof e?e.slice(0,240):""}let l=t,o="SECTION"===t.type?t:null;for(;l.parent&&"PAGE"!==l.parent.type;)l=l.parent,o||"SECTION"!==l.type||(o=l);let s="PAGE"===t.type?t:l.parent;if(!s||"PAGE"!==s.type)throw Error("DEVUP_PAGE_NOT_FOUND");function d(e){let t=e.absoluteBoundingBox||{x:"number"==typeof e.x?e.x:0,y:"number"==typeof e.y?e.y:0,width:"number"==typeof e.width?e.width:0,height:"number"==typeof e.height?e.height:0};return[t.x,t.y,t.width,t.height].every(Number.isFinite)?{x:t.x,y:t.y,width:t.width,height:t.height}:null}function f(e){let t=d(e);return t&&["FRAME","COMPONENT","INSTANCE","COMPONENT_SET"].includes(e.type)&&t.width>=240&&t.width<=1800&&t.height>=300&&t.height<=2e3&&t.width/Math.max(1,t.height)>=.25&&t.width/Math.max(1,t.height)<=2.5}function u(e){let t=[],r=e;for(;r&&"DOCUMENT"!==r.type&&t.length<12;){let e=a(r.name);e&&t.push(e),r=r.parent}return t.reverse()}await figma.setCurrentPageAsync(s);let c=!f(t)&&o?o:l,y=d(c)||d(t);if(!y)throw Error("DEVUP_NODE_BOUNDS_UNAVAILABLE");let h="children"in s?s.children:[],p=h.map((e,t)=>({node:e,pageChildIndex:t,bounds:d(e)})).filter(e=>e.bounds).filter(e=>{var t;return e.node.id===c.id||e.bounds.y>=y.y-240&&e.bounds.y<=y.y+12e3&&(t=e.bounds,Math.min(t.x+t.width,y.x+y.width)-Math.max(t.x,y.x)>0)}).sort((e,t)=>e.bounds.y-t.bounds.y||e.bounds.x-t.bounds.x||e.node.id.localeCompare(t.node.id)),g="SECTION"===c.type?p.filter(e=>e.node.id===c.id):p.slice(0,n),m=new Map(g.map(e=>[e.node.id,e]));m.has(l.id)||m.set(l.id,{node:l,pageChildIndex:-1,bounds:d(l)}),m.has(c.id)||m.set(c.id,{node:c,pageChildIndex:-1,bounds:d(c)}),m.has(t.id)||m.set(t.id,{node:t,pageChildIndex:-1,bounds:d(t)});let b=t.parent;for(;b&&"PAGE"!==b.type&&(m.has(b.id)||m.set(b.id,{node:b,pageChildIndex:-1,bounds:d(b)}),b.id!==c.id);)b=b.parent;if("children"in c)for(let e of c.children.slice(0,n))m.has(e.id)||m.set(e.id,{node:e,pageChildIndex:-1,bounds:d(e)});let x="SECTION"===c.type&&"children"in c&&c.children.length>n;if("SECTION"===c.type&&"children"in c){let e=8*n,t=c.children.filter(e=>!f(e)).map(e=>({node:e,ancestors:[]})),r=0;for(;t.length&&r!m.has(e.id));if(m.size+t.length>n+2){x=!0;continue}for(let e of t)m.set(e.id,{node:e,pageChildIndex:-1,bounds:d(e)});continue}if("children"in e)for(let r of e.children)t.push({node:r,ancestors:[...i,e]})}x||=t.length>0}let E=[...m.values()].filter(e=>e.bounds).slice(0,n+2).map(({node:e,pageChildIndex:t,bounds:r})=>({id:e.id,type:e.type,fields:{name:a(e.name),parentId:e.parent&&"DOCUMENT"!==e.parent.type?e.parent.id:null,childrenIds:[],x:r.x,y:r.y,width:r.width,height:r.height,childCount:"children"in e?e.children.length:0,textPreview:"",pageChildIndex:t>=0?t:null,visible:!("visible"in e)||!1!==e.visible,breadcrumb:u(e)},extra:{},fieldErrors:{}})),S=E.reduce((e,t)=>{let r=t.fields;return e?{x:Math.min(e.x,r.x),y:Math.min(e.y,r.y),right:Math.max(e.right,r.x+r.width),bottom:Math.max(e.bottom,r.y+r.height)}:{x:r.x,y:r.y,right:r.x+r.width,bottom:r.y+r.height}},null)||{x:0,y:0,right:0,bottom:0},I="SECTION"!==c.type&&p.length>g.length||m.size>n+2||x,A={id:s.id,type:s.type,fields:{name:a(s.name),parentId:null,childrenIds:[],x:S.x,y:S.y,width:S.right-S.x,height:S.bottom-S.y,childCount:h.length,textPreview:"",projectionTruncated:I,visible:!0,breadcrumb:u(s),pageChildIndex:null},extra:{},fieldErrors:{}},N={fileKey:figma.fileKey||"",version:null,rootIds:[s.id],nodes:[A,...E.filter(e=>e.id!==s.id)],diagnostics:[]},w=new Set([s.id,l.id,c.id,t.id]);for(;JSON.stringify(N).length>14e3;){let e=N.nodes.length-1;for(;e>=0&&w.has(N.nodes[e].id);)e-=1;if(e<0)break;N.nodes.splice(e,1),A.fields.projectionTruncated=!0}if(JSON.stringify(N).length>14e3&&(N.nodes=N.nodes.filter(e=>w.has(e.id)).map(e=>({...e,fields:{...e.fields,name:a(e.fields.name).slice(0,80),textPreview:"",breadcrumb:e.fields.breadcrumb.slice(-4).map(e=>e.slice(0,80)),projectionTruncated:e.id===s.id||e.fields.projectionTruncated}}))),JSON.stringify(N).length>14e3)throw Error("DEVUP_EXPLORE_PROJECTION_TOO_LARGE");let O=14e3-JSON.stringify(N).length;if(i>0&&O>0){let e=N.nodes.filter(e=>m.get(e.id)&&e.id!==s.id),t=e.length;for(let r of e){let e=Math.floor(O/t);if(t-=1,e<=0)continue;let n="",a=0;for(let t of function(e){if(0===i)return"";let t=[],r=[e],n=0;for(;r.length&&n<80&&t.join(" ").lengthe)break;n+=t,a+=r}r.fields.textPreview=n,O-=a}}return N},fastSnapshot:async function(e){let t=e.rootIds;if(!Array.isArray(t)||0===t.length)throw Error("DEVUP_ROOTS_INVALID");let r=await Promise.all(t.map(e=>figma.getNodeByIdAsync(e)));if(r.some(e=>!e))throw Error("DEVUP_NODE_NOT_FOUND");if(1===r.length&&"SECTION"===r[0].type)throw Error("DEVUP_TARGET_IS_SECTION");let n=["mobile","tablet","desktop"],i=e=>n.indexOf(String(e.name||"").trim().toLowerCase());if(1===r.length&&i(r[0])>=0){let e=r[0].parent;if(e&&"SECTION"===e.type&&"children"in e){let t=e.children.filter(e=>e.id===r[0].id||i(e)>=0).filter(e=>!1!==e.visible);t.length>1&&(r.length=0,r.push(...t))}}if(1===t.length){let e=[],t=new Set(r.map(e=>e.id)),n=[],i=e=>{if("reactions"in e&&Array.isArray(e.reactions)){for(let r of e.reactions)if(r&&r.trigger&&"AFTER_TIMEOUT"===r.trigger.type)for(let e of r.actions||[])e&&"NODE"===e.type&&e.transition&&"SMART_ANIMATE"===e.transition.type&&"string"==typeof e.destinationId&&!t.has(e.destinationId)&&(t.add(e.destinationId),n.push(e.destinationId));if("children"in e)for(let t of e.children)i(t)}};for(let e of r)i(e);for(;n.length>0;){let t=n.shift(),r=await figma.getNodeByIdAsync(t);r&&"DOCUMENT"!==r.type&&"PAGE"!==r.type&&(e.push(r),i(r))}r.push(...e)}let a=e.nodeId,l=["absoluteBoundingBox","absoluteRenderBounds","arcData","backgroundStyleId","blendMode","bottomLeftRadius","bottomRightRadius","boundVariables","characters","clipsContent","componentProperties","componentPropertyDefinitions","componentPropertyReferences","constraints","cornerRadius","counterAxisAlignItems","dashPattern","defaultVariant","effectStyleId","effects","fillStyleId","fills","fontName","fontSize","gridColumnAnchorIndex","gridColumnCount","gridColumnGap","gridColumnSizes","gridColumnSpan","gridRowAnchorIndex","gridRowCount","gridRowGap","gridRowSizes","gridRowSpan","gridStyleId","height","inferredAutoLayout","isAsset","isMask","itemSpacing","layoutGrow","layoutMode","layoutWrap","layoutPositioning","layoutSizingHorizontal","layoutSizingVertical","letterSpacing","lineHeight","maxHeight","maxLines","maxWidth","minHeight","minWidth","name","opacity","overflowDirection","paddingBottom","paddingLeft","paddingRight","paddingTop","primaryAxisAlignItems","reactions","rotation","strokeAlign","strokeBottomWeight","strokeLeftWeight","strokeRightWeight","strokeStyleId","strokeTopWeight","strokeWeight","strokes","targetAspectRatio","textAlignHorizontal","textAlignVertical","textAutoResize","textCase","textDecoration","textStyleId","textTruncation","topLeftRadius","topRightRadius","variantProperties","visible","width","x","y"],o=["fontName","fontWeight","fontSize","textDecoration","textCase","lineHeight","letterSpacing","fills","textStyleId","fillStyleId","listOptions","indentation","hyperlink"],s=e.snapshot,d=Math.max(0,Math.floor(Number(s.offset)||0)),f=Math.max(8192,Math.floor(Number(s.maxEnvelopeBytes)||19456)),u=Math.min(s.maxEnvelopeBytes?f-1024:18e3,Math.max(4096,Math.floor(Number(s.maxPayloadBytes)||15e3))),c=new Set(["backgroundStyleId","effectStyleId","fillStyleId","gridStyleId","strokeStyleId","textStyleId"]),y=new Set(["maxWidth","maxHeight","absoluteRenderBounds"]),h=new Map([["rotation",0],["cornerRadius",0],["isAsset",!1],["isMask",!1],["clipsContent",!1],["blendMode","PASS_THROUGH"],["strokeAlign","INSIDE"],["textCase","ORIGINAL"],["textDecoration","NONE"],["textAlignHorizontal","LEFT"],["textAlignVertical","TOP"],["counterAxisAlignItems","MIN"],["primaryAxisAlignItems","MIN"],["gridColumnCount",0],["gridRowCount",0],["gridColumnGap",0],["gridRowGap",0],["gridColumnAnchorIndex",-1],["gridRowAnchorIndex",-1],["gridColumnSpan",1],["gridRowSpan",1]]),p=new Set(["start","end","characters","fontWeight","textStyleId","fillStyleId","listOptions","indentation","hyperlink"]),g=new Set(["parent","children","consumers"]);function m(e,t=!1,r=new WeakSet,n=0){let i;if(null===e||["string","number","boolean"].includes(typeof e))return e;if(void 0===e)return{$undefined:!0};if("bigint"==typeof e)return{$bigint:e.toString()};if(["function","symbol"].includes(typeof e))return{$unsupported:typeof e};if(n>12)return{$truncated:"max-depth"};if("object"==typeof e&&"parent"in e&&"string"==typeof e.id&&"string"==typeof e.type)return{$nodeId:e.id,$nodeType:e.type};if(Array.isArray(e))return e.map(e=>m(e,t,r,n+1));if(ArrayBuffer.isView(e))return{$binary:e.constructor.name,byteLength:e.byteLength};if(e instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:e.byteLength};if(r.has(e))return{$circular:!0};if(r.add(e),t){let t=new Set(Object.keys(e)),r=e;for(;r&&r!==Object.prototype;){for(let e of Object.getOwnPropertyNames(r))t.add(e);r=Object.getPrototypeOf(r)}i=[...t].sort().filter(e=>!e.startsWith("_")&&!g.has(e))}else i=Object.keys(e).sort();let a={};for(let l of i)try{let i=m(e[l],t,r,n+1);i&&"function"===i.$unsupported||(a[l]=i)}catch(e){a[l]=t?{$error:"unavailable"}:{$error:String(e&&e.message?e.message:e)}}return r.delete(e),a}let b=[],x=[...r],E=new Set;for(let e=0;e=b.length&&b.length>0)throw Error("DEVUP_SNAPSHOT_RANGE_INVALID");function S(e){let t=0;for(let r=0;r=55296&&n<=56319&&r+1({id:e,styleType:t})).sort((e,t)=>e.id.localeCompare(t.id)),a=await Promise.all([...n.map(async e=>{try{let t=await figma.variables.getVariableByIdAsync(e);return t?{kind:"variable",value:m(t,!0),collectionId:t.variableCollectionId}:{kind:"unresolved",value:{id:e,kind:"variable",reason:"notFoundOrUnavailable"}}}catch(t){return{kind:"unresolved",value:{id:e,kind:"variable",reason:"notFoundOrUnavailable"}}}}),...i.map(async({id:e,styleType:t})=>{try{let r=await figma.getStyleByIdAsync(e);if(!r)return{kind:"unresolved",value:{id:e,kind:"style",reason:"notFoundOrUnavailable"}};return{kind:"style",value:{...m(r,!0),styleType:t,value:m("PAINT"===t?r.paints:"EFFECT"===t?r.effects:"GRID"===t?r.layoutGrids:r,!0)}}}catch(t){return{kind:"unresolved",value:{id:e,kind:"style",reason:"notFoundOrUnavailable"}}}})]),l=[...new Set(a.filter(e=>"variable"===e.kind&&e.collectionId).map(e=>e.collectionId))].sort(),o=(await Promise.all(l.map(async e=>{try{let t=await figma.variables.getVariableCollectionByIdAsync(e);return t?m(t,!0):null}catch(e){return null}}))).filter(e=>null!==e),s=a.filter(e=>"variable"===e.kind).map(e=>e.value),d=a.filter(e=>"style"===e.kind).map(e=>e.value),f=a.filter(e=>"unresolved"===e.kind).map(e=>e.value);return{collections:o,variables:s,styles:d,usedRemoteVariables:s.filter(e=>!0===e.remote),usedVariableIds:n,usedStyleIds:i.map(e=>e.id),localComplete:!1,usedRemoteComplete:0===f.length,unresolved:f,$variableRefCount:n.length,$styleRefCount:i.length}}let A=u-1024,N=null;for(let e=0;e<5;e+=1){let{pageNodes:e,packedBytes:t}=function(e){let t=[],r=2;for(let n=d;ne.id):[];for(let i of(n.length>0&&(t.childrenIds=n),l)){let n;try{if(!(i in e)){"overflowDirection"===i&&["FRAME","COMPONENT","INSTANCE","COMPONENT_SET"].includes(e.type)&&(t[i]=null);continue}if(n=e[i],"function"==typeof n)continue;let r=m(n);if("overflowDirection"===i&&null==n){t[i]=null;continue}(null===r?!y.has(i):Array.isArray(r)?0===r.length:"object"==typeof r?0===Object.keys(r).length:!!(""===r&&c.has(i))||h.has(i)&&h.get(i)===r)||(t[i]=r)}catch(e){r[i]=String(e&&e.message?e.message:e)}}if("TEXT"===e.type&&"function"==typeof e.getStyledTextSegments)try{let r=m(e.getStyledTextSegments(o));if(1===r.length){let e=r[0];for(let t of Object.keys(e))p.has(t)||delete e[t]}r.length>0&&(t.styledTextSegments=r)}catch(e){r.styledTextSegments=String(e&&e.message?e.message:e)}let i={id:e.id,type:e.type,fields:t};return Object.keys(r).length>0&&(i.fieldErrors=r),i}(b[n]),a=S(JSON.stringify(i))+ +!!t.length;if(t.length&&r+a>e)break;t.push(i),r+=a}return{pageNodes:t,packedBytes:r}}(A);if(0===e.length)throw Error("DEVUP_SNAPSHOT_RANGE_INVALID");let n=function(e,t){let n=Math.min(b.length,d+e.length),{$variableRefCount:i,$styleRefCount:l,...o}=t,s=[...e,{id:"__DEVUP_SNAPSHOT_CURSOR__",type:"DEVUP_INTERNAL",fields:{offset:d,nextOffset:n,complete:n>=b.length,totalNodes:b.length},extra:{},fieldErrors:{}}],f={kind:"devupFastSnapshotEnvelope",schemaVersion:1,source:{fileKey:figma.fileKey||"",rootId:a},snapshot:{fileKey:figma.fileKey||"",version:null,rootIds:r.map(e=>e.id),nodes:s,diagnostics:[]},resources:o,integrity:{nodeCount:s.length,variableRefCount:i,styleRefCount:l,utf8Bytes:0}},u=0;for(let e=0;e<8&&(u=S(JSON.stringify(f)),f.integrity.utf8Bytes!==u);e+=1)f.integrity.utf8Bytes=u;if(f.integrity.utf8Bytes!==S(JSON.stringify(f)))throw Error("DEVUP_ENVELOPE_LENGTH_UNSTABLE");return{envelope:f,bytes:u}}(e,await I(e));if(n.bytes<=f){N=n;break}if(1===e.length)throw Error("DEVUP_ENVELOPE_TOO_LARGE");A=Math.max(1,Math.min(A-1,t-(n.bytes-f)-256))}if(!N)throw Error("DEVUP_ENVELOPE_TOO_LARGE");return N.envelope},fastTheme:async function(e){let t=Math.max(0,Math.floor(Number(e.theme.offset)||0));function r(e,t=new WeakSet,n=0){if(null===e||["string","number","boolean"].includes(typeof e))return e;if(void 0===e)return{$undefined:!0};if("bigint"==typeof e)return{$bigint:e.toString()};if(["function","symbol"].includes(typeof e))return{$unsupported:typeof e};if(n>12)return{$truncated:"max-depth"};if("object"==typeof e&&"parent"in e&&"string"==typeof e.id&&"string"==typeof e.type)return{$nodeId:e.id,$nodeType:e.type};if(Array.isArray(e))return e.map(e=>r(e,t,n+1));if(ArrayBuffer.isView(e))return{$binary:e.constructor.name,byteLength:e.byteLength};if(e instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:e.byteLength};if(t.has(e))return{$circular:!0};t.add(e);let i={};for(let a of function(e){let t=new Set(Object.keys(e)),r=e;for(;r&&r!==Object.prototype;){for(let e of Object.getOwnPropertyNames(r))t.add(e);r=Object.getPrototypeOf(r)}return[...t].sort()}(e))if(!(a.startsWith("_")||["parent","children","consumers"].includes(a)))try{let l=r(e[a],t,n+1);l&&"function"===l.$unsupported||(i[a]=l)}catch(e){i[a]={$error:"unavailable"}}return t.delete(e),i}let n=new Set,i=new Map;for(let e of[figma.root,...figma.root.findAll(()=>!0)])for(let t of["boundVariables","fills","strokes","effects","layoutGrids","textStyleId","fillStyleId","strokeStyleId","backgroundStyleId","effectStyleId","gridStyleId"])try{!function e(t,r="",a=new WeakSet,l=0){if(!(l>16)&&null!==t&&"object"==typeof t&&!a.has(t)){if(a.add(t),Array.isArray(t)){for(let n of t)e(n,r,a,l+1);return}for(let[o,s]of("VARIABLE_ALIAS"===t.type&&"string"==typeof t.id&&t.id&&"figma.mixed"!==t.id&&"MIXED"!==t.id&&n.add(t.id),Object.entries(t))){let t="textStyleId"===o?"TEXT":["fillStyleId","strokeStyleId","backgroundStyleId"].includes(o)?"PAINT":"effectStyleId"===o?"EFFECT":"gridStyleId"===o?"GRID":null;t&&"string"==typeof s&&s&&"figma.mixed"!==s&&"MIXED"!==s&&!i.has(s)&&i.set(s,t),e(s,o||r,a,l+1)}}}({[t]:e[t]})}catch(e){}let[a,l,o,s,d,f]=await Promise.all([figma.variables.getLocalVariableCollectionsAsync(),figma.variables.getLocalVariablesAsync(),figma.getLocalPaintStylesAsync(),figma.getLocalTextStylesAsync(),figma.getLocalEffectStylesAsync(),figma.getLocalGridStylesAsync()]),u=new Set(l.map(e=>e.id)),c=new Set([...o,...s,...d,...f].map(e=>e.id)),y=[],h=[...n].filter(e=>!u.has(e)).sort().map(async e=>{try{return await figma.variables.getVariableByIdAsync(e)||null}catch(t){return y.push({id:e,kind:"variable",reason:"notFoundOrUnavailable"}),null}}),p=[...i.entries()].filter(([e])=>!c.has(e)).sort(([e],[t])=>e.localeCompare(t)).map(async([e,t])=>{try{let r=await figma.getStyleByIdAsync(e);return r?{style:r,styleType:t}:null}catch(t){return y.push({id:e,kind:"style",reason:"notFoundOrUnavailable"}),null}}),g=(await Promise.all(h)).filter(Boolean),m=(await Promise.all(p)).filter(Boolean);for(let e of[...n].filter(e=>!u.has(e)))g.some(t=>t.id===e)||y.some(t=>t.id===e)||y.push({id:e,kind:"variable",reason:"notFoundOrUnavailable"});for(let[e]of[...i.entries()].filter(([e])=>!c.has(e)))m.some(t=>t.style.id===e)||y.some(t=>t.id===e)||y.push({id:e,kind:"style",reason:"notFoundOrUnavailable"});let b=[...new Set(g.map(e=>e.variableCollectionId))].filter(e=>!a.some(t=>t.id===e)).sort(),x=(await Promise.all(b.map(async e=>{try{return await figma.variables.getVariableCollectionByIdAsync(e)}catch(e){return null}}))).filter(Boolean);function E(e,t){return{...r(e),styleType:t,value:r("PAINT"===t?e.paints:"EFFECT"===t?e.effects:"GRID"===t?e.layoutGrids:e)}}let S=[...o.map(e=>E(e,"PAINT")),...s.map(e=>E(e,"TEXT")),...d.map(e=>E(e,"EFFECT")),...f.map(e=>E(e,"GRID")),...m.map(({style:e,styleType:t})=>E(e,t))].sort((e,t)=>e.id.localeCompare(t.id)),I=[...l,...g].map(e=>r(e)).sort((e,t)=>e.id.localeCompare(t.id)),A=[...a,...x].map(e=>r(e)).sort((e,t)=>e.id.localeCompare(t.id));function N(e){let t=[];for(let r=0;r=55296&&n<=56319){let t=r+1=56320&&t<=57343?(n=65536+(n-55296<<10)+(t-56320),r+=1):n=65533}else n>=56320&&n<=57343&&(n=65533);n<128?t.push(n):n<2048?t.push(192|n>>6,128|63&n):n<65536?t.push(224|n>>12,128|n>>6&63,128|63&n):t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n)}return new Uint8Array(t)}y.sort((e,t)=>e.kind.localeCompare(t.kind)||e.id.localeCompare(t.id));let w=[...A.map(e=>({kind:"collection",value:e})),...I.map(e=>({kind:"variable",value:e})),...S.map(e=>({kind:"style",value:e})),...[...n].sort().map(e=>({kind:"usedVariableId",value:e})),...[...i.keys()].sort().map(e=>({kind:"usedStyleId",value:e})),...y.map(e=>({kind:"unresolved",value:e}))];if(t>w.length)throw Error("DEVUP_SNAPSHOT_RANGE_INVALID");let O=w.map(e=>N(JSON.stringify(e.value)).length+1),T=18432,v=null;for(let e=0;e<6;e+=1){let{pageItems:e,packed:r}=function(e){let r=[],n=0;for(let i=t;i0)||!(n+O[i]>e));i+=1)r.push(w[i]),n+=O[i];return{pageItems:r,packed:n}}(T),n=function(e,r){let n=t=>e.filter(e=>e.kind===t).map(e=>e.value),i=n("collection"),a=n("variable"),l=n("style"),o=n("unresolved"),s={kind:"devupFastThemeEnvelope",schemaVersion:1,source:{fileKey:figma.fileKey||"",version:null},resources:{collections:i,variables:a,styles:l,usedRemoteVariables:[],usedVariableIds:n("usedVariableId"),usedStyleIds:n("usedStyleId"),localComplete:!0,usedRemoteComplete:0===y.length,unresolved:o},page:{offset:t,nextOffset:r,complete:r>=w.length,totalItems:w.length},integrity:{collectionCount:i.length,variableCount:a.length,styleCount:l.length,unresolvedCount:o.length,utf8Bytes:0}},d=new Uint8Array;for(let e=0;e<8&&(d=N(JSON.stringify(s)),s.integrity.utf8Bytes!==d.length);e+=1)s.integrity.utf8Bytes=d.length;if(d=N(JSON.stringify(s)),s.integrity.utf8Bytes!==d.length)throw Error("DEVUP_ENVELOPE_LENGTH_UNSTABLE");return{envelope:s,bytes:d.length}}(e,t+e.length);if(n.bytes<=19456){v=n;break}if(e.length<=1)break;T=Math.max(1,Math.min(T-1,r-(n.bytes-19456)-256))}if(null===v||v.bytes>8388608)throw Error("DEVUP_ENVELOPE_TOO_LARGE");return v.envelope},largeValue:async function(e){let t,r=e.largeValue,n=await figma.getNodeByIdAsync(r.nodeId);if(!n)throw Error("DEVUP_NODE_NOT_FOUND");function i(e){let t=[];for(let r=0;r=55296&&n<=56319){let t=r+1=56320&&t<=57343?(n=65536+(n-55296<<10)+(t-56320),r+=1):n=65533}else n>=56320&&n<=57343&&(n=65533);n<128?t.push(n):n<2048?t.push(192|n>>6,128|63&n):n<65536?t.push(224|n>>12,128|n>>6&63,128|63&n):t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n)}return new Uint8Array(t)}let a=null;try{if("$export:svg"===r.field){if("function"!=typeof n.exportAsync)throw Error("unsupported");let e=await n.exportAsync({format:"SVG_STRING"});if("string"!=typeof e)throw Error("unsupported");a=i(e)}else if("string"==typeof r.field&&r.field.startsWith("$export:png")){if("function"!=typeof n.exportAsync)throw Error("unsupported");let e=Math.min(4,Math.max(1,Math.floor(Number(r.field.split("@")[1])||1))),t=await n.exportAsync({format:"PNG",constraint:{type:"SCALE",value:e}});a=t instanceof Uint8Array?t:new Uint8Array(t)}else if("styledTextSegments"===r.field&&"TEXT"===n.type&&"function"==typeof n.getStyledTextSegments)t=n.getStyledTextSegments(["fontName","fontWeight","fontSize","textDecoration","textCase","lineHeight","letterSpacing","fills","textStyleId","fillStyleId","listOptions","indentation","hyperlink"]);else if(r.field in n)t=n[r.field];else throw Error("unsupported")}catch(e){return{kind:"devupLargeValueUnsupported",fileKey:figma.fileKey||"",version:r.version,nodeId:r.nodeId,field:r.field,byteLength:r.byteLength,sha256:r.sha256,errorCode:"DEVUP_FIELD_UNSUPPORTED_BY_UPSTREAM"}}let l=null===a?i(JSON.stringify(function e(t,r=new WeakSet,n=0){if(null===t||["string","number","boolean"].includes(typeof t))return t;if(void 0===t)return{$undefined:!0};if("bigint"==typeof t)return{$bigint:t.toString()};if(["function","symbol"].includes(typeof t))return{$unsupported:typeof t};if(n>12)return{$truncated:"max-depth"};if("object"==typeof t&&"parent"in t&&"string"==typeof t.id&&"string"==typeof t.type)return{$nodeId:t.id,$nodeType:t.type};if(Array.isArray(t))return t.map(t=>e(t,r,n+1));if(ArrayBuffer.isView(t))return{$binary:t.constructor.name,byteLength:t.byteLength};if(t instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:t.byteLength};if(r.has(t))return{$circular:!0};r.add(t);let i={};for(let a of Object.keys(t).sort())try{let l=e(t[a],r,n+1);l&&"function"===l.$unsupported||(i[a]=l)}catch(e){i[a]={$error:String(e&&e.message?e.message:e)}}return r.delete(t),i}(t))):a,o=function(e){let t=[0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0xfc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x6ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2],r=e.length,n=64*Math.ceil((r+9)/64),i=new Uint8Array(n);i.set(e),i[r]=128;let a=8*r;for(let e=0;e<8;e+=1)i[n-1-e]=255&Math.floor(a/2**(8*e));let l=[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19],o=(e,t)=>e>>>t|e<<32-t;for(let e=0;e>>3,n=o(r[e-2],17)^o(r[e-2],19)^r[e-2]>>>10;r[e]=r[e-16]+t+r[e-7]+n>>>0}let[n,a,s,d,f,u,c,y]=l;for(let e=0;e<64;e+=1){let i=y+(o(f,6)^o(f,11)^o(f,25))+(f&u^~f&c)+t[e]+r[e]>>>0,l=(o(n,2)^o(n,13)^o(n,22))+(n&a^n&s^a&s)>>>0;y=c,c=u,u=f,f=d+i>>>0,d=s,s=a,a=n,n=i+l>>>0}for(let[e,t]of[n,a,s,d,f,u,c,y].entries())l[e]=l[e]+t>>>0}return l.map(e=>e.toString(16).padStart(8,"0")).join("")}(l);if(l.length!==r.byteLength||o!==r.sha256)throw Error("DEVUP_LARGE_VALUE_CHANGED");let s=Math.max(0,Math.floor(Number(r.offset)||0)),d=Math.min(65536,Math.max(1,Math.floor(Number(r.maxChunkBytes)||8192)));if(s>=l.length)throw Error("DEVUP_LARGE_VALUE_RANGE_INVALID");let f=Math.min(l.length,s+d);return{kind:"devupLargeValueFragment",fileKey:figma.fileKey||"",version:r.version,nodeId:r.nodeId,field:r.field,offset:s,nextOffset:f,byteLength:l.length,sha256:o,dataBase64:function(e){let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",r="";for(let n=0;n>2],r+=t[(3&i)<<4|a>>4],r+=n+1>6]:"=",r+=n+2e.id),nodes:t.map(e=>({id:e.id,type:e.type,fields:{name:e.name,parentId:null,childrenIds:[]},extra:{},fieldErrors:{}})),diagnostics:[]}},search:async function(e){let t=await figma.getNodeByIdAsync(e.nodeId);if(!t)throw Error("DEVUP_NODE_NOT_FOUND");let r=t;for(;r&&"PAGE"!==r.type;)r=r.parent;if(!r||"PAGE"!==r.type)throw Error("DEVUP_PAGE_NOT_FOUND");await figma.setCurrentPageAsync(r);let n=e.search,i=new Set((n.nodeTypes.length?n.nodeTypes:["PAGE","SECTION","FRAME","COMPONENT_SET","COMPONENT"]).map(e=>e.toUpperCase()));function a(e){return e.normalize("NFC").toLocaleLowerCase().replace(/\s/gu,"")}let l=t===r?r.findAll(()=>!0):"findAll"in t?t.findAll(()=>!0):[],o=[t,...l].filter(e=>i.has(e.type)&&"string"==typeof e.name).map(e=>({node:e,score:function(e){if(e===n.query)return 400;if("exact"===n.matchKind)return null;let t=a(e),r=a(n.query);if(t===r)return 300;if(t.startsWith(r))return 200;if(t.includes(r))return 100;if("fuzzy"!==n.matchKind)return null;let i=function(e,t){let r=Array.from({length:t.length+1},(e,t)=>t);for(let n=0;nnull!==e.score).sort((e,t)=>t.score-e.score||e.node.name.localeCompare(t.node.name)||e.node.id.localeCompare(t.node.id)).slice(0,n.limit),s=new Map([[r.id,r]]);for(let e of[t,...o.map(e=>e.node)]){let t=e;for(;t&&"DOCUMENT"!==t.type;)s.set(t.id,t),t=t.parent}return{fileKey:figma.fileKey||"",version:null,rootIds:[r.id],nodes:[...s.values()].map(e=>({id:e.id,type:e.type,fields:{name:e.name,parentId:e.parent&&"DOCUMENT"!==e.parent.type?e.parent.id:null,childrenIds:"children"in e?e.children.map(e=>e.id):[]},extra:{},fieldErrors:{}})),diagnostics:[]}},sectionIndex:async function(e){let t=await figma.getNodeByIdAsync(e.nodeId);if(!t)throw Error("DEVUP_NODE_NOT_FOUND");if("SECTION"!==t.type){let e=t.parent,r=new Set;for(;e&&"SECTION"!==e.type&&!r.has(e.id);)r.add(e.id),e=e.parent;let n=e&&"SECTION"===e.type?e.id:null,i=n&&figma.fileKey?`https://www.figma.com/design/${figma.fileKey}?node-id=${n.replace(/:/g,"-")}`:null;throw Error("DEVUP_SECTION_REQUIRED "+JSON.stringify({pluginCode:"DEVUP_SECTION_REQUIRED",stage:"section-index",nodeId:t.id,nodeType:t.type,sectionId:n,nextAction:{tool:"devup_figma_export",how:n?`The url must point to a SECTION. This capture's SECTION is ${n}; select frames with frameIds.`:"The url must point to a SECTION. This node has no ancestor SECTION; choose the intended SECTION in Figma and copy its link.",arguments:i?"FRAME"===t.type&&t.parent===e?{url:i,frameIds:[t.id]}:{url:i}:null,requiredArguments:i?[]:["url"]}}))}let r=2048;function n(e){let t=e.absoluteBoundingBox||{x:"number"==typeof e.x?e.x:0,y:"number"==typeof e.y?e.y:0,width:"number"==typeof e.width?e.width:0,height:"number"==typeof e.height?e.height:0};return[t.x,t.y,t.width,t.height].every(Number.isFinite)?{x:t.x,y:t.y,width:t.width,height:t.height}:null}function i(e,t){if("FRAME"!==e.type||!1===e.visible||!t)return!1;let r=t.width/Math.max(1,t.height);return t.width>=240&&t.width<=1800&&t.height>=300&&t.height<=2e3&&r>=.25&&r<=2.5}function a(e){let t=0;for(let r=0;r=55296&&n<=56319&&r+1[e.id,t.id])),s=[],d=0;for(let e=0;ee.id));for(let r of t.children){if(e.has(r.id))continue;let t=n(r);t&&!1!==r.visible&&s.push({node:r,box:t})}}s.sort((e,t)=>e.box.y-t.box.y||e.box.x-t.box.x||e.node.id.localeCompare(t.node.id));let f=l.length>d||s.length>100,u=s.slice(0,100),c=new Set(u.map(({node:e})=>e.id)),y=new Set(e.rootIds),h={},p=new Map([[t.id,null]]);for(let e=0;e{let r=e.parent;for(;r&&r.id!==t.id&&!c.has(r.id);)r=r.parent;return[e.id,r&&c.has(r.id)?r.id:t.id]})),m=e=>u.filter(({node:t})=>g.get(t.id)===e).map(({node:e})=>e.id),b=n(t);if(!b)throw Error("DEVUP_NODE_BOUNDS_UNAVAILABLE");let x={id:t.id,type:t.type,fields:{name:t.name,parentId:t.parent&&"DOCUMENT"!==t.parent.type?t.parent.id:null,childrenIds:m(t.id),absoluteBoundingBox:b,visible:!1!==t.visible,projectionTruncated:f,nodeScreenIds:h},extra:{},fieldErrors:{}},E=u.length,S=u.map(({node:e,box:t})=>{let n=function(e){let t=[e],r=0,n=0;for(let e=0;er}}(e),l=Math.floor(r/E);E-=1;let o=function(e,t){let r=[e],n="",i=0,l=0,o=!1;if(t<=0)return{text:"",state:"budget-exhausted",spent:0};for(let e=0;e=120||l+e>t)return{text:n.trimEnd(),state:l+e>t?"budget-exhausted":"truncated",spent:l};n+=r,i+=1,l+=e}}if("children"in s){let e=Math.max(0,64-r.length);s.children.length>e&&(o=!0),r.push(...s.children.slice(0,e))}}}return{text:n,state:o?"truncated":n?"available":"no-text",spent:l}}(e,l);return r-=o.spent,{id:e.id,type:e.type,fields:{name:"string"==typeof e.name?e.name:"",parentId:g.get(e.id),childrenIds:m(e.id),absoluteBoundingBox:t,visible:!1!==e.visible,breadcrumb:function(e){let t=[],r=e;for(;r&&"DOCUMENT"!==r.type;)"string"==typeof r.name&&r.name&&t.push(r.name),r=r.parent;return t.reverse()}(e),directChildCount:"children"in e?e.children.length:0,textPreview:o.text,textPreviewState:o.state,subtreeNodeCount:n.subtreeNodeCount,estimatedSerializedBytes:n.estimatedSerializedBytes,selectionReasons:[i(e,t)?"screen-like":"explicit-selection-only","inside-section"],estimateTruncated:n.truncated},extra:{},fieldErrors:{}}}),I={fileKey:figma.fileKey||"",version:null,rootIds:[t.id],nodes:[x,...S],diagnostics:[]},A=a(JSON.stringify(I));for(let e=S.length-1;e>=0&&A>19456;e-=1)S[e].fields.textPreview="",S[e].fields.textPreviewState="budget-exhausted",A=a(JSON.stringify(I));if(A>19456)throw Error("DEVUP_SECTION_INDEX_TOO_LARGE "+JSON.stringify({pluginCode:"DEVUP_SECTION_INDEX_TOO_LARGE",stage:"section-index",responseBytes:A,maxResponseBytes:19456}));return I},snapshot:async function(e){let t=await figma.getNodeByIdAsync(e.nodeId);if(!t)throw Error("DEVUP_NODE_NOT_FOUND");let r=["absoluteBoundingBox","absoluteRenderBounds","arcData","backgroundStyleId","blendMode","bottomLeftRadius","bottomRightRadius","boundVariables","characters","clipsContent","componentProperties","componentPropertyDefinitions","componentPropertyReferences","constraints","cornerRadius","counterAxisAlignItems","dashPattern","defaultVariant","effectStyleId","effects","fillStyleId","fills","fontName","fontSize","gridColumnAnchorIndex","gridColumnCount","gridColumnGap","gridColumnSizes","gridColumnSpan","gridRowAnchorIndex","gridRowCount","gridRowGap","gridRowSizes","gridRowSpan","gridStyleId","height","inferredAutoLayout","isAsset","isMask","itemSpacing","layoutGrow","layoutMode","layoutWrap","layoutPositioning","layoutSizingHorizontal","layoutSizingVertical","letterSpacing","lineHeight","maxHeight","maxLines","maxWidth","minHeight","minWidth","name","opacity","overflowDirection","paddingBottom","paddingLeft","paddingRight","paddingTop","primaryAxisAlignItems","reactions","rotation","strokeAlign","strokeBottomWeight","strokeLeftWeight","strokeRightWeight","strokeStyleId","strokeTopWeight","strokeWeight","strokes","targetAspectRatio","textAlignHorizontal","textAlignVertical","textAutoResize","textCase","textDecoration","textStyleId","textTruncation","topLeftRadius","topRightRadius","variantProperties","visible","width","x","y"],n=new Set(r),i=["fontName","fontWeight","fontSize","textDecoration","textCase","lineHeight","letterSpacing","fills","textStyleId","fillStyleId","listOptions","indentation","hyperlink"],a=e.snapshot,l=Math.max(0,Math.floor(Number(a.offset)||0)),o=Math.min(a.maxEnvelopeBytes?Math.max(8192,Math.floor(Number(a.maxEnvelopeBytes))):16e3,Math.max(4096,Math.floor(Number(a.maxPayloadBytes)||15e3))),s=Math.min(o-1024,Math.max(512,Math.floor(Number(a.maxFieldBytes)||4096))),d=new Set(["id","type","parent","children"]),f=new Set(["parentId","childrenIds","name","characters","styledTextSegments","boundVariables"]);function u(e,t,r){let n=function(e){let t=[];for(let r=0;r=55296&&n<=56319){let t=r+1=56320&&t<=57343?(n=65536+(n-55296<<10)+(t-56320),r+=1):n=65533}else n>=56320&&n<=57343&&(n=65533);n<128?t.push(n):n<2048?t.push(192|n>>6,128|63&n):n<65536?t.push(224|n>>12,128|n>>6&63,128|63&n):t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n)}return new Uint8Array(t)}(JSON.stringify(r));return n.length>0x1000000?{$truncated:"max-large-value-bytes",byteLength:n.length}:{$largeValue:{nodeId:e,field:t,byteLength:n.length,sha256:function(e){let t=[0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0xfc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x6ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2],r=64*Math.ceil((e.length+9)/64),n=new Uint8Array(r);n.set(e),n[e.length]=128;let i=8*e.length;for(let e=0;e<8;e+=1)n[r-1-e]=255&Math.floor(i/2**(8*e));let a=[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19],l=(e,t)=>e>>>t|e<<32-t;for(let e=0;e>>3,n=l(r[e-2],17)^l(r[e-2],19)^r[e-2]>>>10;r[e]=r[e-16]+t+r[e-7]+n>>>0}let[i,o,s,d,f,u,c,y]=a;for(let e=0;e<64;e+=1){let n=y+(l(f,6)^l(f,11)^l(f,25))+(f&u^~f&c)+t[e]+r[e]>>>0,a=(l(i,2)^l(i,13)^l(i,22))+(i&o^i&s^o&s)>>>0;y=c,c=u,u=f,f=d+n>>>0,d=s,s=o,o=i,i=n+a>>>0}for(let[e,t]of[i,o,s,d,f,u,c,y].entries())a[e]=a[e]+t>>>0}return a.map(e=>e.toString(16).padStart(8,"0")).join("")}(n),cursor:{nextOffset:0,maxChunkBytes:12288}}}}function c(e){return function(e){let t=0;for(let r=0;r=55296&&n<=56319&&r+112)return{$truncated:"max-depth"};if("object"==typeof t&&"parent"in t&&"string"==typeof t.id&&"string"==typeof t.type)return{$nodeId:t.id,$nodeType:t.type};if(Array.isArray(t))return t.map(t=>e(t,r,n+1));if(ArrayBuffer.isView(t))return{$binary:t.constructor.name,byteLength:t.byteLength};if(t instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:t.byteLength};if(r.has(t))return{$circular:!0};r.add(t);let i={};for(let a of Object.keys(t).sort())try{let l=e(t[a],r,n+1);l&&"function"===l.$unsupported||(i[a]=l)}catch(e){i[a]={$error:String(e&&e.message?e.message:e)}}return r.delete(t),i}(r),a=c(i);if(a<=s)return i;let l=u(e,t,i);return l.$truncated&&(n[t]=`DEVUP_FIELD_VALUE_UNSUPPORTED:${a}>16777216`),l}let h=[],p=[t];for(;p.length;){let e=p.shift();h.push(e),"children"in e&&p.push(...e.children)}let g=[],m=o-1024,b=2;for(let e=l;eNumber(e.protected)-Number(t.protected)||t.byteLength-e.byteLength),n)){if(r<=t)break;let n=u(e.id,i.name,e[i.sectionName][i.name]);e[i.sectionName][i.name]=n,n.$truncated&&(e.fieldErrors[i.name]=`DEVUP_FIELD_VALUE_UNSUPPORTED:${i.byteLength}>16777216`),r=c(e)}return e}(function(e){let t={},a={},l={};for(let i of(t.parentId=e.parent?e.parent.id:null,e.parent&&("PAGE"===e.parent.type||"SECTION"===e.parent.type||"COMPONENT_SET"===e.parent.type)&&(t.parentType=e.parent.type,"SECTION"===e.parent.type&&(t.parentName=e.parent.name)),t.childrenIds="children"in e?e.children.map(e=>e.id):[],!("overflowDirection"in e)&&["FRAME","COMPONENT","INSTANCE","COMPONENT_SET"].includes(e.type)&&(t.overflowDirection=null),function(e){let t=new Set,n=e;for(;n&&n!==Object.prototype;){for(let e of Object.getOwnPropertyNames(n))t.add(e);n=Object.getPrototypeOf(n)}for(let n of r)try{n in e&&t.add(n)}catch(e){}return[...t].sort()}(e)))if(!(d.has(i)||i.startsWith("_")))try{let r=e[i];if("function"==typeof r)continue;let o=y(e.id,i,r,l);(n.has(i)?t:a)[i]=o}catch(e){l[i]=String(e&&e.message?e.message:e)}if("TEXT"===e.type&&"function"==typeof e.getStyledTextSegments)try{t.styledTextSegments=y(e.id,"styledTextSegments",e.getStyledTextSegments(i),l)}catch(e){l.styledTextSegments=String(e&&e.message?e.message:e)}return{id:e.id,type:e.type,fields:t,extra:a,fieldErrors:l}}(h[e]),m),a=c(t)+ +!!g.length;if(g.length&&b+a>m)break;g.push(t),b+=a}let x=Math.min(h.length,l+g.length);return g.push({id:"__DEVUP_SNAPSHOT_CURSOR__",type:"DEVUP_INTERNAL",fields:{offset:l,nextOffset:x,complete:x>=h.length,totalNodes:h.length},extra:{},fieldErrors:{}}),{fileKey:figma.fileKey||"",version:null,rootIds:[t.id],nodes:g,diagnostics:[]}},usedResources:async function(e){let t=e.resources;function r(e,t=new WeakSet,n=0){if(null===e||["string","number","boolean"].includes(typeof e))return e;if(void 0===e)return{$undefined:!0};if("bigint"==typeof e)return{$bigint:e.toString()};if(["function","symbol"].includes(typeof e))return{$unsupported:typeof e};if(n>12)return{$truncated:"max-depth"};if("object"==typeof e&&"parent"in e&&"string"==typeof e.id&&"string"==typeof e.type)return{$nodeId:e.id,$nodeType:e.type};if(Array.isArray(e))return e.map(e=>r(e,t,n+1));if(ArrayBuffer.isView(e))return{$binary:e.constructor.name,byteLength:e.byteLength};if(e instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:e.byteLength};if(t.has(e))return{$circular:!0};t.add(e);let i={},a=new Set(Object.keys(e)),l=e;for(;l&&l!==Object.prototype;){for(let e of Object.getOwnPropertyNames(l))a.add(e);l=Object.getPrototypeOf(l)}for(let l of[...a].sort())if(!(l.startsWith("_")||["parent","children","consumers"].includes(l)))try{let a=r(e[l],t,n+1);a&&"function"===a.$unsupported||(i[l]=a)}catch(e){i[l]={$error:"unavailable"}}return t.delete(e),i}let n=new Map,i="ok";try{for(let e of(await figma.variables.getLocalVariablesAsync()))n.set(e.id,e)}catch(e){i="unavailable"}let a=await Promise.all(t.variableIds.map(async e=>{let t=n.get(e);if(t)return{value:r(t),collectionId:t.variableCollectionId};try{let t=await figma.variables.getVariableByIdAsync(e);return t?{value:r(t),collectionId:t.variableCollectionId}:{unresolved:{id:e,kind:"variable",reason:"notInFileAndLookupEmpty"}}}catch(t){return{unresolved:{id:e,kind:"variable",reason:"notInFileAndLookupThrew"}}}})),l=[...new Set(a.flatMap(e=>e.collectionId?[e.collectionId]:[]))].sort(),o=await Promise.all(l.map(async e=>{try{let t=await figma.variables.getVariableCollectionByIdAsync(e);return t?[r(t)]:[]}catch(e){return[]}})),s=await Promise.all(t.styles.map(async e=>{try{let t=await figma.getStyleByIdAsync(e.id);if(!t)return{unresolved:{id:e.id,kind:"style",reason:"notFoundOrUnavailable"}};return{value:{...r(t),styleType:e.styleType,value:r("PAINT"===e.styleType?t.paints:"EFFECT"===e.styleType?t.effects:"GRID"===e.styleType?t.layoutGrids:t)}}}catch(t){return{unresolved:{id:e.id,kind:"style",reason:"notFoundOrUnavailable"}}}}));return{collections:o.flat(),variables:a.flatMap(e=>e.value?[e.value]:[]),styles:s.flatMap(e=>e.value?[e.value]:[]),usedVariableIds:t.variableIds,usedStyleIds:t.styles.map(e=>e.id),localVariableListing:i,localVariableCount:n.size,unresolved:[...a,...s].flatMap(e=>e.unresolved?[e.unresolved]:[])}},variableCatalog:async function(e){let[t,r,n,i,a]=await Promise.all([figma.variables.getLocalVariableCollectionsAsync(),figma.getLocalPaintStylesAsync(),figma.getLocalTextStylesAsync(),figma.getLocalEffectStylesAsync(),figma.getLocalGridStylesAsync()]),l=["PAINT","TEXT","EFFECT","GRID"];return{collections:t.map(e=>(function e(t,r=new WeakSet,n=0){if(null===t||["string","number","boolean"].includes(typeof t))return t;if(void 0===t)return{$undefined:!0};if("bigint"==typeof t)return{$bigint:t.toString()};if(["function","symbol"].includes(typeof t))return{$unsupported:typeof t};if(n>12)return{$truncated:"max-depth"};if(Array.isArray(t))return t.map(t=>e(t,r,n+1));if(r.has(t))return{$circular:!0};r.add(t);let i={},a=new Set(Object.keys(t)),l=t;for(;l&&l!==Object.prototype;){for(let e of Object.getOwnPropertyNames(l))a.add(e);l=Object.getPrototypeOf(l)}for(let l of[...a].sort())if(!l.startsWith("_"))try{let a=e(t[l],r,n+1);a&&"function"===a.$unsupported||(i[l]=a)}catch(e){i[l]={$error:String(e&&e.message?e.message:e)}}return r.delete(t),i})(e)),variableIds:[...new Set(t.flatMap(e=>e.variableIds))].sort(),styles:[r,n,i,a].flatMap((e,t)=>e.map(e=>({id:e.id,styleType:l[t]}))).sort((e,t)=>e.id.localeCompare(t.id)),localComplete:!0,usedRemoteComplete:!1}},variables:async function(e){let t=e.resources;function r(e,t=new WeakSet,n=0){if(null===e||["string","number","boolean"].includes(typeof e))return e;if(void 0===e)return{$undefined:!0};if("bigint"==typeof e)return{$bigint:e.toString()};if(["function","symbol"].includes(typeof e))return{$unsupported:typeof e};if(n>12)return{$truncated:"max-depth"};if("object"==typeof e&&"parent"in e&&"string"==typeof e.id&&"string"==typeof e.type)return{$nodeId:e.id,$nodeType:e.type};if(Array.isArray(e))return e.map(e=>r(e,t,n+1));if(ArrayBuffer.isView(e))return{$binary:e.constructor.name,byteLength:e.byteLength};if(e instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:e.byteLength};if(t.has(e))return{$circular:!0};t.add(e);let i={},a=new Set(Object.keys(e)),l=e;for(;l&&l!==Object.prototype;){for(let e of Object.getOwnPropertyNames(l))a.add(e);l=Object.getPrototypeOf(l)}for(let l of[...a].sort())if(!(l.startsWith("_")||["parent","children","consumers"].includes(l)))try{let a=r(e[l],t,n+1);a&&"function"===a.$unsupported||(i[l]=a)}catch(e){i[l]={$error:String(e&&e.message?e.message:e)}}return t.delete(e),i}let[n,i]=await Promise.all([Promise.all(t.variableIds.map(e=>figma.variables.getVariableByIdAsync(e))),Promise.all(t.styles.map(e=>figma.getStyleByIdAsync(e.id)))]),a=new Map(t.styles.map(e=>[e.id,e])),l=await Promise.all(i.filter(Boolean).map(async e=>{let t=a.get(e.id),n=t.styleType;if(Number.isInteger(t.consumerStart)&&Number.isInteger(t.consumerEnd)){let i=await e.getStyleConsumersAsync();return{id:e.id,styleType:n,$consumerStart:t.consumerStart,$consumerEntries:i.slice(t.consumerStart,t.consumerEnd).map(e=>[e.node.id,e.node.type,r(e.fields)])}}let i=await e.getStyleConsumersAsync();return{...r(e),styleType:n,$consumerCount:i.length,value:r("PAINT"===n?e.paints:"EFFECT"===n?e.effects:"GRID"===n?e.layoutGrids:e)}}));return{variables:n.filter(Boolean).map(e=>r(e)),styles:l}}};async function t(t){let r=e[t.script];if(!r)return{kind:"devup-result",requestId:t.requestId,error:`DEVUP_BRIDGE_UNKNOWN_SCRIPT: ${t.script} (아는 스크립트: ${Object.keys(e).join(", ")})`};try{var n;let e=await r({nodeId:(n=t.params).nodeId??"",rootIds:n.rootIds??[],snapshot:n.snapshot??{},search:n.search??{},explore:n.explore??{},resources:n.resources??{variableIds:[],styles:[]},largeValue:n.largeValue??{},asset:n.asset??{},theme:n.theme??{offset:0}});return{kind:"devup-result",requestId:t.requestId,data:e}}catch(e){return{kind:"devup-result",requestId:t.requestId,error:e instanceof Error?e.message:String(e)}}}let r=[],n=!1;async function i(){if(!n){n=!0;try{for(;r.length>0;){let e=r.shift(),n=await t(e).catch(t=>({kind:"devup-result",requestId:e.requestId,error:t instanceof Error?t.message:String(t)}));figma.ui.postMessage(n)}}finally{n=!1}}}figma.showUI(__html__,{width:320,height:220}),figma.ui.onmessage=e=>{if("object"==typeof e&&null!==e){if("devup-ready"===e.kind){let e={kind:"devup-status",fileKey:figma.fileKey??null,fileName:figma.root.name,port:1993};figma.ui.postMessage(e);return}"devup-job"===e.kind&&(r.push(e),i())}}})(); \ No newline at end of file +(()=>{"use strict";let e={assets:async function(e){let t=e.asset;function r(e){let t=[0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0xfc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x6ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2],r=64*Math.ceil((e.length+9)/64),n=new Uint8Array(r);n.set(e),n[e.length]=128;let i=8*e.length;for(let e=0;e<8;e+=1)n[r-1-e]=255&Math.floor(i/2**(8*e));let a=[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19],l=(e,t)=>e>>>t|e<<32-t;for(let e=0;e>>3,n=l(r[e-2],17)^l(r[e-2],19)^r[e-2]>>>10;r[e]=r[e-16]+t+r[e-7]+n>>>0}let[i,o,s,d,f,u,c,y]=a;for(let e=0;e<64;e+=1){let n=y+(l(f,6)^l(f,11)^l(f,25))+(f&u^~f&c)+t[e]+r[e]>>>0,a=(l(i,2)^l(i,13)^l(i,22))+(i&o^i&s^o&s)>>>0;y=c,c=u,u=f,f=d+n>>>0,d=s,s=o,o=i,i=n+a>>>0}for(let[e,t]of[i,o,s,d,f,u,c,y].entries())a[e]=a[e]+t>>>0}return a.map(e=>e.toString(16).padStart(8,"0")).join("")}function n(e){return{kind:"devupAssetExport",fileKey:figma.fileKey||"",version:t.version,assetId:t.assetId,nodeId:t.nodeId,field:t.field,imageHash:t.imageHash,format:t.format,scale:t.scale,status:"failed",byteLength:null,sha256:null,errorCode:e}}let i="string"==typeof t.field&&t.field.startsWith("$original-image/fills/");try{if(i&&"bridge"!==t.transport)return n("DEVUP_ORIGINAL_IMAGE_REQUIRES_BRIDGE");let e=await figma.getNodeByIdAsync(t.nodeId);if(!e||!i&&"function"!=typeof e.exportAsync)return n("DEVUP_ASSET_UNSUPPORTED_BY_UPSTREAM");if(i||"string"==typeof t.field&&t.field.startsWith("fills/")){let r=Number(t.field.slice(i?22:6)),a="fills"in e&&Array.isArray(e.fills)?e.fills:[],l=Number.isInteger(r)?a[r]:null,o=l&&"IMAGE"===l.type?l.imageHash||l.imageRef:null;if(!l||o!==t.imageHash)return n("DEVUP_ASSET_SOURCE_CHANGED")}else if("node"!==t.field)return n("DEVUP_ASSET_FIELD_UNSUPPORTED");if(i){let e=figma.getImageByHash(t.imageHash);if(!e)return n("DEVUP_ORIGINAL_IMAGE_NOT_FOUND");let i=await e.getBytesAsync();if(0===i.length||i.length>8388608)return n("DEVUP_ASSET_RESPONSE_TOO_LARGE");let a=e=>e.every((e,t)=>i[t]===e),l=a([137,80,78,71,13,10,26,10])?"image/png":a([255,216,255])?"image/jpeg":a([71,73,70,56])?"image/gif":a([82,73,70,70])&&87===i[8]&&69===i[9]&&66===i[10]&&80===i[11]?"image/webp":null;if(!l)return n("DEVUP_ORIGINAL_IMAGE_CODEC_UNSUPPORTED");let o=await e.getSizeAsync();return{...n(null),status:"exported",kind:"devupOriginalImage",representation:"original-image-v1",format:null,scale:null,mimeType:l,width:o.width,height:o.height,byteLength:i.length,sha256:r(i),data:figma.base64Encode(i)}}let a=String(t.format||"").toUpperCase();if(!["PNG","JPG","SVG","PDF"].includes(a))return n("DEVUP_ASSET_FORMAT_UNSUPPORTED");let l=Math.min(4,Math.max(1,Math.floor(Number(t.scale)||1))),o="SVG"===a,s={format:o?"SVG_STRING":a};("PNG"===a||"JPG"===a)&&(s.constraint={type:"SCALE",value:l});let d=await e.exportAsync(s),f=o&&"string"==typeof d?d:null,u=null===f?d instanceof Uint8Array?d:new Uint8Array(d):function(e){let t=[];for(let r=0;r=55296&&n<=56319){let t=r+1=56320&&t<=57343?(n=65536+(n-55296<<10)+(t-56320),r+=1):n=65533}else n>=56320&&n<=57343&&(n=65533);n<128?t.push(n):n<2048?t.push(192|n>>6,128|63&n):n<65536?t.push(224|n>>12,128|n>>6&63,128|63&n):t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n)}return new Uint8Array(t)}(f);if(0===u.length||u.length>8388608)return n("DEVUP_ASSET_RESPONSE_TOO_LARGE");let c=r(u),y=figma.io&&"function"==typeof figma.io.write,h="PNG"===a&&u.length>786432;if(y&&(null!==f&&u.length>12288||h))return{kind:"devupAssetExport",fileKey:figma.fileKey||"",version:t.version,assetId:t.assetId,nodeId:t.nodeId,field:t.field,imageHash:t.imageHash,format:t.format,scale:l,status:"chunked",byteLength:u.length,sha256:c,cursor:{nextOffset:0,maxChunkBytes:12288},errorCode:null};return y&&figma.io.write(`devup-asset-${t.assetId.replace(/[^A-Za-z0-9_-]/g,"_")}.${String(t.format).toLowerCase()}`,u),{kind:"devupAssetExport",fileKey:figma.fileKey||"",version:t.version,assetId:t.assetId,nodeId:t.nodeId,field:t.field,imageHash:t.imageHash,format:t.format,scale:l,status:"exported",byteLength:u.length,sha256:c,mimeType:y?null===f?null:"image/svg+xml":({PNG:"image/png",JPG:"image/jpeg",SVG:"image/svg+xml",PDF:"application/pdf"})[a],...!y&&null===f?{data:figma.base64Encode(u)}:{},text:f,errorCode:null}}catch(e){return n(i?"DEVUP_ORIGINAL_IMAGE_READ_FAILED":"DEVUP_ASSET_EXPORT_FAILED")}},explore:async function(e){let t=await figma.getNodeByIdAsync(e.nodeId);if(!t)throw Error("DEVUP_NODE_NOT_FOUND");let r=e.explore,n=Math.max(20,Math.min(400,Number.isInteger(r.projectionLimit)?r.projectionLimit:200)),i=Math.max(0,Math.min(500,Number.isInteger(r.textPreviewLimit)?r.textPreviewLimit:160));function a(e){return"string"==typeof e?e.slice(0,240):""}let l=t,o="SECTION"===t.type?t:null;for(;l.parent&&"PAGE"!==l.parent.type;)l=l.parent,o||"SECTION"!==l.type||(o=l);let s="PAGE"===t.type?t:l.parent;if(!s||"PAGE"!==s.type)throw Error("DEVUP_PAGE_NOT_FOUND");function d(e){let t=e.absoluteBoundingBox||{x:"number"==typeof e.x?e.x:0,y:"number"==typeof e.y?e.y:0,width:"number"==typeof e.width?e.width:0,height:"number"==typeof e.height?e.height:0};return[t.x,t.y,t.width,t.height].every(Number.isFinite)?{x:t.x,y:t.y,width:t.width,height:t.height}:null}function f(e){let t=d(e);return t&&["FRAME","COMPONENT","INSTANCE","COMPONENT_SET"].includes(e.type)&&t.width>=240&&t.width<=1800&&t.height>=300&&t.height<=2e3&&t.width/Math.max(1,t.height)>=.25&&t.width/Math.max(1,t.height)<=2.5}function u(e){let t=[],r=e;for(;r&&"DOCUMENT"!==r.type&&t.length<12;){let e=a(r.name);e&&t.push(e),r=r.parent}return t.reverse()}await figma.setCurrentPageAsync(s);let c=!f(t)&&o?o:l,y=d(c)||d(t);if(!y)throw Error("DEVUP_NODE_BOUNDS_UNAVAILABLE");let h="children"in s?s.children:[],g=h.map((e,t)=>({node:e,pageChildIndex:t,bounds:d(e)})).filter(e=>e.bounds).filter(e=>{var t;return e.node.id===c.id||e.bounds.y>=y.y-240&&e.bounds.y<=y.y+12e3&&(t=e.bounds,Math.min(t.x+t.width,y.x+y.width)-Math.max(t.x,y.x)>0)}).sort((e,t)=>e.bounds.y-t.bounds.y||e.bounds.x-t.bounds.x||e.node.id.localeCompare(t.node.id)),p="SECTION"===c.type?g.filter(e=>e.node.id===c.id):g.slice(0,n),m=new Map(p.map(e=>[e.node.id,e]));m.has(l.id)||m.set(l.id,{node:l,pageChildIndex:-1,bounds:d(l)}),m.has(c.id)||m.set(c.id,{node:c,pageChildIndex:-1,bounds:d(c)}),m.has(t.id)||m.set(t.id,{node:t,pageChildIndex:-1,bounds:d(t)});let b=t.parent;for(;b&&"PAGE"!==b.type&&(m.has(b.id)||m.set(b.id,{node:b,pageChildIndex:-1,bounds:d(b)}),b.id!==c.id);)b=b.parent;if("children"in c)for(let e of c.children.slice(0,n))m.has(e.id)||m.set(e.id,{node:e,pageChildIndex:-1,bounds:d(e)});let x="SECTION"===c.type&&"children"in c&&c.children.length>n;if("SECTION"===c.type&&"children"in c){let e=8*n,t=c.children.filter(e=>!f(e)).map(e=>({node:e,ancestors:[]})),r=0;for(;t.length&&r!m.has(e.id));if(m.size+t.length>n+2){x=!0;continue}for(let e of t)m.set(e.id,{node:e,pageChildIndex:-1,bounds:d(e)});continue}if("children"in e)for(let r of e.children)t.push({node:r,ancestors:[...i,e]})}x||=t.length>0}let E=[...m.values()].filter(e=>e.bounds).slice(0,n+2).map(({node:e,pageChildIndex:t,bounds:r})=>({id:e.id,type:e.type,fields:{name:a(e.name),parentId:e.parent&&"DOCUMENT"!==e.parent.type?e.parent.id:null,childrenIds:[],x:r.x,y:r.y,width:r.width,height:r.height,childCount:"children"in e?e.children.length:0,textPreview:"",pageChildIndex:t>=0?t:null,visible:!("visible"in e)||!1!==e.visible,breadcrumb:u(e)},extra:{},fieldErrors:{}})),I=E.reduce((e,t)=>{let r=t.fields;return e?{x:Math.min(e.x,r.x),y:Math.min(e.y,r.y),right:Math.max(e.right,r.x+r.width),bottom:Math.max(e.bottom,r.y+r.height)}:{x:r.x,y:r.y,right:r.x+r.width,bottom:r.y+r.height}},null)||{x:0,y:0,right:0,bottom:0},S="SECTION"!==c.type&&g.length>p.length||m.size>n+2||x,A={id:s.id,type:s.type,fields:{name:a(s.name),parentId:null,childrenIds:[],x:I.x,y:I.y,width:I.right-I.x,height:I.bottom-I.y,childCount:h.length,textPreview:"",projectionTruncated:S,visible:!0,breadcrumb:u(s),pageChildIndex:null},extra:{},fieldErrors:{}},N={fileKey:figma.fileKey||"",version:null,rootIds:[s.id],nodes:[A,...E.filter(e=>e.id!==s.id)],diagnostics:[]},w=new Set([s.id,l.id,c.id,t.id]);for(;JSON.stringify(N).length>14e3;){let e=N.nodes.length-1;for(;e>=0&&w.has(N.nodes[e].id);)e-=1;if(e<0)break;N.nodes.splice(e,1),A.fields.projectionTruncated=!0}if(JSON.stringify(N).length>14e3&&(N.nodes=N.nodes.filter(e=>w.has(e.id)).map(e=>({...e,fields:{...e.fields,name:a(e.fields.name).slice(0,80),textPreview:"",breadcrumb:e.fields.breadcrumb.slice(-4).map(e=>e.slice(0,80)),projectionTruncated:e.id===s.id||e.fields.projectionTruncated}}))),JSON.stringify(N).length>14e3)throw Error("DEVUP_EXPLORE_PROJECTION_TOO_LARGE");let O=14e3-JSON.stringify(N).length;if(i>0&&O>0){let e=N.nodes.filter(e=>m.get(e.id)&&e.id!==s.id),t=e.length;for(let r of e){let e=Math.floor(O/t);if(t-=1,e<=0)continue;let n="",a=0;for(let t of function(e){if(0===i)return"";let t=[],r=[e],n=0;for(;r.length&&n<80&&t.join(" ").lengthe)break;n+=t,a+=r}r.fields.textPreview=n,O-=a}}return N},fastSnapshot:async function(e){let t=e.rootIds;if(!Array.isArray(t)||0===t.length)throw Error("DEVUP_ROOTS_INVALID");let r=await Promise.all(t.map(e=>figma.getNodeByIdAsync(e)));if(r.some(e=>!e))throw Error("DEVUP_NODE_NOT_FOUND");if(1===r.length&&"SECTION"===r[0].type)throw Error("DEVUP_TARGET_IS_SECTION");let n=["mobile","tablet","desktop"],i=e=>n.indexOf(String(e.name||"").trim().toLowerCase());if(1===r.length&&i(r[0])>=0){let e=r[0].parent;if(e&&"SECTION"===e.type&&"children"in e){let t=e.children.filter(e=>e.id===r[0].id||i(e)>=0).filter(e=>!1!==e.visible);t.length>1&&(r.length=0,r.push(...t))}}if(1===t.length){let e=[],t=new Set(r.map(e=>e.id)),n=[],i=e=>{if("reactions"in e&&Array.isArray(e.reactions)){for(let r of e.reactions)if(r&&r.trigger&&"AFTER_TIMEOUT"===r.trigger.type)for(let e of r.actions||[])e&&"NODE"===e.type&&e.transition&&"SMART_ANIMATE"===e.transition.type&&"string"==typeof e.destinationId&&!t.has(e.destinationId)&&(t.add(e.destinationId),n.push(e.destinationId));if("children"in e)for(let t of e.children)i(t)}};for(let e of r)i(e);for(;n.length>0;){let t=n.shift(),r=await figma.getNodeByIdAsync(t);r&&"DOCUMENT"!==r.type&&"PAGE"!==r.type&&(e.push(r),i(r))}r.push(...e)}let a=e.nodeId,l=["absoluteBoundingBox","absoluteRenderBounds","arcData","backgroundStyleId","blendMode","bottomLeftRadius","bottomRightRadius","boundVariables","characters","clipsContent","componentProperties","componentPropertyDefinitions","componentPropertyReferences","constraints","cornerRadius","counterAxisAlignItems","dashPattern","defaultVariant","effectStyleId","effects","fillStyleId","fills","fontName","fontSize","gridColumnAnchorIndex","gridColumnCount","gridColumnGap","gridColumnSizes","gridColumnSpan","gridRowAnchorIndex","gridRowCount","gridRowGap","gridRowSizes","gridRowSpan","gridStyleId","height","inferredAutoLayout","isAsset","isMask","itemSpacing","layoutGrow","layoutMode","layoutWrap","layoutPositioning","layoutSizingHorizontal","layoutSizingVertical","letterSpacing","lineHeight","maxHeight","maxLines","maxWidth","minHeight","minWidth","name","opacity","overflowDirection","paddingBottom","paddingLeft","paddingRight","paddingTop","primaryAxisAlignItems","reactions","rotation","strokeAlign","strokeBottomWeight","strokeLeftWeight","strokeRightWeight","strokeStyleId","strokeTopWeight","strokeWeight","strokes","targetAspectRatio","textAlignHorizontal","textAlignVertical","textAutoResize","textCase","textDecoration","textStyleId","textTruncation","topLeftRadius","topRightRadius","variantProperties","visible","width","x","y"],o=["fontName","fontWeight","fontSize","textDecoration","textCase","lineHeight","letterSpacing","fills","textStyleId","fillStyleId","listOptions","indentation","hyperlink"],s=e.snapshot,d=Math.max(0,Math.floor(Number(s.offset)||0)),f=Math.max(8192,Math.floor(Number(s.maxEnvelopeBytes)||19456)),u=Math.min(s.maxEnvelopeBytes?f-1024:18e3,Math.max(4096,Math.floor(Number(s.maxPayloadBytes)||15e3))),c=new Set(["backgroundStyleId","effectStyleId","fillStyleId","gridStyleId","strokeStyleId","textStyleId"]),y=new Set(["maxWidth","maxHeight","absoluteRenderBounds"]),h=new Map([["rotation",0],["cornerRadius",0],["isAsset",!1],["isMask",!1],["clipsContent",!1],["blendMode","PASS_THROUGH"],["strokeAlign","INSIDE"],["textCase","ORIGINAL"],["textDecoration","NONE"],["textAlignHorizontal","LEFT"],["textAlignVertical","TOP"],["counterAxisAlignItems","MIN"],["primaryAxisAlignItems","MIN"],["gridColumnCount",0],["gridRowCount",0],["gridColumnGap",0],["gridRowGap",0],["gridColumnAnchorIndex",-1],["gridRowAnchorIndex",-1],["gridColumnSpan",1],["gridRowSpan",1]]),g=new Set(["start","end","characters","fontWeight","textStyleId","fillStyleId","listOptions","indentation","hyperlink"]),p=new Set(["parent","children","consumers"]);function m(e,t=!1,r=new WeakSet,n=0){let i;if(null===e||["string","number","boolean"].includes(typeof e))return e;if(void 0===e)return{$undefined:!0};if("bigint"==typeof e)return{$bigint:e.toString()};if(["function","symbol"].includes(typeof e))return{$unsupported:typeof e};if(n>12)return{$truncated:"max-depth"};if("object"==typeof e&&"parent"in e&&"string"==typeof e.id&&"string"==typeof e.type)return{$nodeId:e.id,$nodeType:e.type};if(Array.isArray(e))return e.map(e=>m(e,t,r,n+1));if(ArrayBuffer.isView(e))return{$binary:e.constructor.name,byteLength:e.byteLength};if(e instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:e.byteLength};if(r.has(e))return{$circular:!0};if(r.add(e),t){let t=new Set(Object.keys(e)),r=e;for(;r&&r!==Object.prototype;){for(let e of Object.getOwnPropertyNames(r))t.add(e);r=Object.getPrototypeOf(r)}i=[...t].sort().filter(e=>!e.startsWith("_")&&!p.has(e))}else i=Object.keys(e).sort();let a={};for(let l of i)try{let i=m(e[l],t,r,n+1);i&&"function"===i.$unsupported||(a[l]=i)}catch(e){a[l]=t?{$error:"unavailable"}:{$error:String(e&&e.message?e.message:e)}}return r.delete(e),a}let b=[],x=[...r],E=new Set;for(let e=0;e=b.length&&b.length>0)throw Error("DEVUP_SNAPSHOT_RANGE_INVALID");function I(e){let t=0;for(let r=0;r=55296&&n<=56319&&r+1({id:e,styleType:t})).sort((e,t)=>e.id.localeCompare(t.id)),a=await Promise.all([...n.map(async e=>{try{let t=await figma.variables.getVariableByIdAsync(e);return t?{kind:"variable",value:m(t,!0),collectionId:t.variableCollectionId}:{kind:"unresolved",value:{id:e,kind:"variable",reason:"notFoundOrUnavailable"}}}catch(t){return{kind:"unresolved",value:{id:e,kind:"variable",reason:"notFoundOrUnavailable"}}}}),...i.map(async({id:e,styleType:t})=>{try{let r=await figma.getStyleByIdAsync(e);if(!r)return{kind:"unresolved",value:{id:e,kind:"style",reason:"notFoundOrUnavailable"}};return{kind:"style",value:{...m(r,!0),styleType:t,value:m("PAINT"===t?r.paints:"EFFECT"===t?r.effects:"GRID"===t?r.layoutGrids:r,!0)}}}catch(t){return{kind:"unresolved",value:{id:e,kind:"style",reason:"notFoundOrUnavailable"}}}})]),l=[...new Set(a.filter(e=>"variable"===e.kind&&e.collectionId).map(e=>e.collectionId))].sort(),o=(await Promise.all(l.map(async e=>{try{let t=await figma.variables.getVariableCollectionByIdAsync(e);return t?m(t,!0):null}catch(e){return null}}))).filter(e=>null!==e),s=a.filter(e=>"variable"===e.kind).map(e=>e.value),d=a.filter(e=>"style"===e.kind).map(e=>e.value),f=a.filter(e=>"unresolved"===e.kind).map(e=>e.value);return{collections:o,variables:s,styles:d,usedRemoteVariables:s.filter(e=>!0===e.remote),usedVariableIds:n,usedStyleIds:i.map(e=>e.id),localComplete:!1,usedRemoteComplete:0===f.length,unresolved:f,$variableRefCount:n.length,$styleRefCount:i.length}}let A=u-1024,N=null;for(let e=0;e<5;e+=1){let{pageNodes:e,packedBytes:t}=function(e){let t=[],r=2;for(let n=d;ne.id):[];for(let i of(n.length>0&&(t.childrenIds=n),l)){let n;try{if(!(i in e)){"overflowDirection"===i&&["FRAME","COMPONENT","INSTANCE","COMPONENT_SET"].includes(e.type)&&(t[i]=null);continue}if(n=e[i],"function"==typeof n)continue;let r=m(n);if("overflowDirection"===i&&null==n){t[i]=null;continue}(null===r?!y.has(i):Array.isArray(r)?0===r.length:"object"==typeof r?0===Object.keys(r).length:!!(""===r&&c.has(i))||h.has(i)&&h.get(i)===r)||(t[i]=r)}catch(e){r[i]=String(e&&e.message?e.message:e)}}if("TEXT"===e.type&&"function"==typeof e.getStyledTextSegments)try{let r=m(e.getStyledTextSegments(o));if(1===r.length){let e=r[0];for(let t of Object.keys(e))g.has(t)||delete e[t]}r.length>0&&(t.styledTextSegments=r)}catch(e){r.styledTextSegments=String(e&&e.message?e.message:e)}let i={id:e.id,type:e.type,fields:t};return Object.keys(r).length>0&&(i.fieldErrors=r),i}(b[n]),a=I(JSON.stringify(i))+ +!!t.length;if(t.length&&r+a>e)break;t.push(i),r+=a}return{pageNodes:t,packedBytes:r}}(A);if(0===e.length)throw Error("DEVUP_SNAPSHOT_RANGE_INVALID");let n=function(e,t){let n=Math.min(b.length,d+e.length),{$variableRefCount:i,$styleRefCount:l,...o}=t,s=[...e,{id:"__DEVUP_SNAPSHOT_CURSOR__",type:"DEVUP_INTERNAL",fields:{offset:d,nextOffset:n,complete:n>=b.length,totalNodes:b.length},extra:{},fieldErrors:{}}],f={kind:"devupFastSnapshotEnvelope",schemaVersion:1,source:{fileKey:figma.fileKey||"",rootId:a},snapshot:{fileKey:figma.fileKey||"",version:null,rootIds:r.map(e=>e.id),nodes:s,diagnostics:[]},resources:o,integrity:{nodeCount:s.length,variableRefCount:i,styleRefCount:l,utf8Bytes:0}},u=0;for(let e=0;e<8&&(u=I(JSON.stringify(f)),f.integrity.utf8Bytes!==u);e+=1)f.integrity.utf8Bytes=u;if(f.integrity.utf8Bytes!==I(JSON.stringify(f)))throw Error("DEVUP_ENVELOPE_LENGTH_UNSTABLE");return{envelope:f,bytes:u}}(e,await S(e));if(n.bytes<=f){N=n;break}if(1===e.length)throw Error("DEVUP_ENVELOPE_TOO_LARGE");A=Math.max(1,Math.min(A-1,t-(n.bytes-f)-256))}if(!N)throw Error("DEVUP_ENVELOPE_TOO_LARGE");return N.envelope},fastTheme:async function(e){let t=Math.max(0,Math.floor(Number(e.theme.offset)||0));function r(e,t=new WeakSet,n=0){if(null===e||["string","number","boolean"].includes(typeof e))return e;if(void 0===e)return{$undefined:!0};if("bigint"==typeof e)return{$bigint:e.toString()};if(["function","symbol"].includes(typeof e))return{$unsupported:typeof e};if(n>12)return{$truncated:"max-depth"};if("object"==typeof e&&"parent"in e&&"string"==typeof e.id&&"string"==typeof e.type)return{$nodeId:e.id,$nodeType:e.type};if(Array.isArray(e))return e.map(e=>r(e,t,n+1));if(ArrayBuffer.isView(e))return{$binary:e.constructor.name,byteLength:e.byteLength};if(e instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:e.byteLength};if(t.has(e))return{$circular:!0};t.add(e);let i={};for(let a of function(e){let t=new Set(Object.keys(e)),r=e;for(;r&&r!==Object.prototype;){for(let e of Object.getOwnPropertyNames(r))t.add(e);r=Object.getPrototypeOf(r)}return[...t].sort()}(e))if(!(a.startsWith("_")||["parent","children","consumers"].includes(a)))try{let l=r(e[a],t,n+1);l&&"function"===l.$unsupported||(i[a]=l)}catch(e){i[a]={$error:"unavailable"}}return t.delete(e),i}let n=new Set,i=new Map;for(let e of[figma.root,...figma.root.findAll(()=>!0)])for(let t of["boundVariables","fills","strokes","effects","layoutGrids","textStyleId","fillStyleId","strokeStyleId","backgroundStyleId","effectStyleId","gridStyleId"])try{!function e(t,r="",a=new WeakSet,l=0){if(!(l>16)&&null!==t&&"object"==typeof t&&!a.has(t)){if(a.add(t),Array.isArray(t)){for(let n of t)e(n,r,a,l+1);return}for(let[o,s]of("VARIABLE_ALIAS"===t.type&&"string"==typeof t.id&&t.id&&"figma.mixed"!==t.id&&"MIXED"!==t.id&&n.add(t.id),Object.entries(t))){let t="textStyleId"===o?"TEXT":["fillStyleId","strokeStyleId","backgroundStyleId"].includes(o)?"PAINT":"effectStyleId"===o?"EFFECT":"gridStyleId"===o?"GRID":null;t&&"string"==typeof s&&s&&"figma.mixed"!==s&&"MIXED"!==s&&!i.has(s)&&i.set(s,t),e(s,o||r,a,l+1)}}}({[t]:e[t]})}catch(e){}let[a,l,o,s,d,f]=await Promise.all([figma.variables.getLocalVariableCollectionsAsync(),figma.variables.getLocalVariablesAsync(),figma.getLocalPaintStylesAsync(),figma.getLocalTextStylesAsync(),figma.getLocalEffectStylesAsync(),figma.getLocalGridStylesAsync()]),u=new Set(l.map(e=>e.id)),c=new Set([...o,...s,...d,...f].map(e=>e.id)),y=[],h=[...n].filter(e=>!u.has(e)).sort().map(async e=>{try{return await figma.variables.getVariableByIdAsync(e)||null}catch(t){return y.push({id:e,kind:"variable",reason:"notFoundOrUnavailable"}),null}}),g=[...i.entries()].filter(([e])=>!c.has(e)).sort(([e],[t])=>e.localeCompare(t)).map(async([e,t])=>{try{let r=await figma.getStyleByIdAsync(e);return r?{style:r,styleType:t}:null}catch(t){return y.push({id:e,kind:"style",reason:"notFoundOrUnavailable"}),null}}),p=(await Promise.all(h)).filter(Boolean),m=(await Promise.all(g)).filter(Boolean);for(let e of[...n].filter(e=>!u.has(e)))p.some(t=>t.id===e)||y.some(t=>t.id===e)||y.push({id:e,kind:"variable",reason:"notFoundOrUnavailable"});for(let[e]of[...i.entries()].filter(([e])=>!c.has(e)))m.some(t=>t.style.id===e)||y.some(t=>t.id===e)||y.push({id:e,kind:"style",reason:"notFoundOrUnavailable"});let b=[...new Set(p.map(e=>e.variableCollectionId))].filter(e=>!a.some(t=>t.id===e)).sort(),x=(await Promise.all(b.map(async e=>{try{return await figma.variables.getVariableCollectionByIdAsync(e)}catch(e){return null}}))).filter(Boolean);function E(e,t){return{...r(e),styleType:t,value:r("PAINT"===t?e.paints:"EFFECT"===t?e.effects:"GRID"===t?e.layoutGrids:e)}}let I=[...o.map(e=>E(e,"PAINT")),...s.map(e=>E(e,"TEXT")),...d.map(e=>E(e,"EFFECT")),...f.map(e=>E(e,"GRID")),...m.map(({style:e,styleType:t})=>E(e,t))].sort((e,t)=>e.id.localeCompare(t.id)),S=[...l,...p].map(e=>r(e)).sort((e,t)=>e.id.localeCompare(t.id)),A=[...a,...x].map(e=>r(e)).sort((e,t)=>e.id.localeCompare(t.id));function N(e){let t=[];for(let r=0;r=55296&&n<=56319){let t=r+1=56320&&t<=57343?(n=65536+(n-55296<<10)+(t-56320),r+=1):n=65533}else n>=56320&&n<=57343&&(n=65533);n<128?t.push(n):n<2048?t.push(192|n>>6,128|63&n):n<65536?t.push(224|n>>12,128|n>>6&63,128|63&n):t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n)}return new Uint8Array(t)}y.sort((e,t)=>e.kind.localeCompare(t.kind)||e.id.localeCompare(t.id));let w=[...A.map(e=>({kind:"collection",value:e})),...S.map(e=>({kind:"variable",value:e})),...I.map(e=>({kind:"style",value:e})),...[...n].sort().map(e=>({kind:"usedVariableId",value:e})),...[...i.keys()].sort().map(e=>({kind:"usedStyleId",value:e})),...y.map(e=>({kind:"unresolved",value:e}))];if(t>w.length)throw Error("DEVUP_SNAPSHOT_RANGE_INVALID");let O=w.map(e=>N(JSON.stringify(e.value)).length+1),T=18432,_=null;for(let e=0;e<6;e+=1){let{pageItems:e,packed:r}=function(e){let r=[],n=0;for(let i=t;i0)||!(n+O[i]>e));i+=1)r.push(w[i]),n+=O[i];return{pageItems:r,packed:n}}(T),n=function(e,r){let n=t=>e.filter(e=>e.kind===t).map(e=>e.value),i=n("collection"),a=n("variable"),l=n("style"),o=n("unresolved"),s={kind:"devupFastThemeEnvelope",schemaVersion:1,source:{fileKey:figma.fileKey||"",version:null},resources:{collections:i,variables:a,styles:l,usedRemoteVariables:[],usedVariableIds:n("usedVariableId"),usedStyleIds:n("usedStyleId"),localComplete:!0,usedRemoteComplete:0===y.length,unresolved:o},page:{offset:t,nextOffset:r,complete:r>=w.length,totalItems:w.length},integrity:{collectionCount:i.length,variableCount:a.length,styleCount:l.length,unresolvedCount:o.length,utf8Bytes:0}},d=new Uint8Array;for(let e=0;e<8&&(d=N(JSON.stringify(s)),s.integrity.utf8Bytes!==d.length);e+=1)s.integrity.utf8Bytes=d.length;if(d=N(JSON.stringify(s)),s.integrity.utf8Bytes!==d.length)throw Error("DEVUP_ENVELOPE_LENGTH_UNSTABLE");return{envelope:s,bytes:d.length}}(e,t+e.length);if(n.bytes<=19456){_=n;break}if(e.length<=1)break;T=Math.max(1,Math.min(T-1,r-(n.bytes-19456)-256))}if(null===_||_.bytes>8388608)throw Error("DEVUP_ENVELOPE_TOO_LARGE");return _.envelope},largeValue:async function(e){let t,r=e.largeValue,n=await figma.getNodeByIdAsync(r.nodeId);if(!n)throw Error("DEVUP_NODE_NOT_FOUND");function i(e){let t=[];for(let r=0;r=55296&&n<=56319){let t=r+1=56320&&t<=57343?(n=65536+(n-55296<<10)+(t-56320),r+=1):n=65533}else n>=56320&&n<=57343&&(n=65533);n<128?t.push(n):n<2048?t.push(192|n>>6,128|63&n):n<65536?t.push(224|n>>12,128|n>>6&63,128|63&n):t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n)}return new Uint8Array(t)}let a=null;try{if("$export:svg"===r.field){if("function"!=typeof n.exportAsync)throw Error("unsupported");let e=await n.exportAsync({format:"SVG_STRING"});if("string"!=typeof e)throw Error("unsupported");a=i(e)}else if("string"==typeof r.field&&r.field.startsWith("$export:png")){if("function"!=typeof n.exportAsync)throw Error("unsupported");let e=Math.min(4,Math.max(1,Math.floor(Number(r.field.split("@")[1])||1))),t=await n.exportAsync({format:"PNG",constraint:{type:"SCALE",value:e}});a=t instanceof Uint8Array?t:new Uint8Array(t)}else if("styledTextSegments"===r.field&&"TEXT"===n.type&&"function"==typeof n.getStyledTextSegments)t=n.getStyledTextSegments(["fontName","fontWeight","fontSize","textDecoration","textCase","lineHeight","letterSpacing","fills","textStyleId","fillStyleId","listOptions","indentation","hyperlink"]);else if(r.field in n)t=n[r.field];else throw Error("unsupported")}catch(e){return{kind:"devupLargeValueUnsupported",fileKey:figma.fileKey||"",version:r.version,nodeId:r.nodeId,field:r.field,byteLength:r.byteLength,sha256:r.sha256,errorCode:"DEVUP_FIELD_UNSUPPORTED_BY_UPSTREAM"}}let l=null===a?i(JSON.stringify(function e(t,r=new WeakSet,n=0){if(null===t||["string","number","boolean"].includes(typeof t))return t;if(void 0===t)return{$undefined:!0};if("bigint"==typeof t)return{$bigint:t.toString()};if(["function","symbol"].includes(typeof t))return{$unsupported:typeof t};if(n>12)return{$truncated:"max-depth"};if("object"==typeof t&&"parent"in t&&"string"==typeof t.id&&"string"==typeof t.type)return{$nodeId:t.id,$nodeType:t.type};if(Array.isArray(t))return t.map(t=>e(t,r,n+1));if(ArrayBuffer.isView(t))return{$binary:t.constructor.name,byteLength:t.byteLength};if(t instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:t.byteLength};if(r.has(t))return{$circular:!0};r.add(t);let i={};for(let a of Object.keys(t).sort())try{let l=e(t[a],r,n+1);l&&"function"===l.$unsupported||(i[a]=l)}catch(e){i[a]={$error:String(e&&e.message?e.message:e)}}return r.delete(t),i}(t))):a,o=function(e){let t=[0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0xfc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x6ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2],r=e.length,n=64*Math.ceil((r+9)/64),i=new Uint8Array(n);i.set(e),i[r]=128;let a=8*r;for(let e=0;e<8;e+=1)i[n-1-e]=255&Math.floor(a/2**(8*e));let l=[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19],o=(e,t)=>e>>>t|e<<32-t;for(let e=0;e>>3,n=o(r[e-2],17)^o(r[e-2],19)^r[e-2]>>>10;r[e]=r[e-16]+t+r[e-7]+n>>>0}let[n,a,s,d,f,u,c,y]=l;for(let e=0;e<64;e+=1){let i=y+(o(f,6)^o(f,11)^o(f,25))+(f&u^~f&c)+t[e]+r[e]>>>0,l=(o(n,2)^o(n,13)^o(n,22))+(n&a^n&s^a&s)>>>0;y=c,c=u,u=f,f=d+i>>>0,d=s,s=a,a=n,n=i+l>>>0}for(let[e,t]of[n,a,s,d,f,u,c,y].entries())l[e]=l[e]+t>>>0}return l.map(e=>e.toString(16).padStart(8,"0")).join("")}(l);if(l.length!==r.byteLength||o!==r.sha256)throw Error("DEVUP_LARGE_VALUE_CHANGED");let s=Math.max(0,Math.floor(Number(r.offset)||0)),d=Math.min(65536,Math.max(1,Math.floor(Number(r.maxChunkBytes)||8192)));if(s>=l.length)throw Error("DEVUP_LARGE_VALUE_RANGE_INVALID");let f=Math.min(l.length,s+d);return{kind:"devupLargeValueFragment",fileKey:figma.fileKey||"",version:r.version,nodeId:r.nodeId,field:r.field,offset:s,nextOffset:f,byteLength:l.length,sha256:o,dataBase64:function(e){let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",r="";for(let n=0;n>2],r+=t[(3&i)<<4|a>>4],r+=n+1>6]:"=",r+=n+2e.id),nodes:t.map(e=>({id:e.id,type:e.type,fields:{name:e.name,parentId:null,childrenIds:[]},extra:{},fieldErrors:{}})),diagnostics:[]}},search:async function(e){let t=await figma.getNodeByIdAsync(e.nodeId);if(!t)throw Error("DEVUP_NODE_NOT_FOUND");let r=t;for(;r&&"PAGE"!==r.type;)r=r.parent;if(!r||"PAGE"!==r.type)throw Error("DEVUP_PAGE_NOT_FOUND");await figma.setCurrentPageAsync(r);let n=e.search,i=new Set((n.nodeTypes.length?n.nodeTypes:["PAGE","SECTION","FRAME","COMPONENT_SET","COMPONENT"]).map(e=>e.toUpperCase()));function a(e){return e.normalize("NFC").toLocaleLowerCase().replace(/\s/gu,"")}let l=t===r?r.findAll(()=>!0):"findAll"in t?t.findAll(()=>!0):[],o=[t,...l].filter(e=>i.has(e.type)&&"string"==typeof e.name).map(e=>({node:e,score:function(e){if(e===n.query)return 400;if("exact"===n.matchKind)return null;let t=a(e),r=a(n.query);if(t===r)return 300;if(t.startsWith(r))return 200;if(t.includes(r))return 100;if("fuzzy"!==n.matchKind)return null;let i=function(e,t){let r=Array.from({length:t.length+1},(e,t)=>t);for(let n=0;nnull!==e.score).sort((e,t)=>t.score-e.score||e.node.name.localeCompare(t.node.name)||e.node.id.localeCompare(t.node.id)).slice(0,n.limit),s=new Map([[r.id,r]]);for(let e of[t,...o.map(e=>e.node)]){let t=e;for(;t&&"DOCUMENT"!==t.type;)s.set(t.id,t),t=t.parent}return{fileKey:figma.fileKey||"",version:null,rootIds:[r.id],nodes:[...s.values()].map(e=>({id:e.id,type:e.type,fields:{name:e.name,parentId:e.parent&&"DOCUMENT"!==e.parent.type?e.parent.id:null,childrenIds:"children"in e?e.children.map(e=>e.id):[]},extra:{},fieldErrors:{}})),diagnostics:[]}},sectionIndex:async function(e){let t=await figma.getNodeByIdAsync(e.nodeId);if(!t)throw Error("DEVUP_NODE_NOT_FOUND");if("SECTION"!==t.type){let e=t.parent,r=new Set;for(;e&&"SECTION"!==e.type&&!r.has(e.id);)r.add(e.id),e=e.parent;let n=e&&"SECTION"===e.type?e.id:null,i=n&&figma.fileKey?`https://www.figma.com/design/${figma.fileKey}?node-id=${n.replace(/:/g,"-")}`:null;throw Error("DEVUP_SECTION_REQUIRED "+JSON.stringify({pluginCode:"DEVUP_SECTION_REQUIRED",stage:"section-index",nodeId:t.id,nodeType:t.type,sectionId:n,nextAction:{tool:"devup_figma_export",how:n?`The url must point to a SECTION. This capture's SECTION is ${n}; select frames with frameIds.`:"The url must point to a SECTION. This node has no ancestor SECTION; choose the intended SECTION in Figma and copy its link.",arguments:i?"FRAME"===t.type&&t.parent===e?{url:i,frameIds:[t.id]}:{url:i}:null,requiredArguments:i?[]:["url"]}}))}let r=2048;function n(e){let t=e.absoluteBoundingBox||{x:"number"==typeof e.x?e.x:0,y:"number"==typeof e.y?e.y:0,width:"number"==typeof e.width?e.width:0,height:"number"==typeof e.height?e.height:0};return[t.x,t.y,t.width,t.height].every(Number.isFinite)?{x:t.x,y:t.y,width:t.width,height:t.height}:null}function i(e,t){if("FRAME"!==e.type||!1===e.visible||!t)return!1;let r=t.width/Math.max(1,t.height);return t.width>=240&&t.width<=1800&&t.height>=300&&t.height<=2e3&&r>=.25&&r<=2.5}function a(e){let t=0;for(let r=0;r=55296&&n<=56319&&r+1[e.id,t.id])),s=[],d=0;for(let e=0;ee.id));for(let r of t.children){if(e.has(r.id))continue;let t=n(r);t&&!1!==r.visible&&s.push({node:r,box:t})}}s.sort((e,t)=>e.box.y-t.box.y||e.box.x-t.box.x||e.node.id.localeCompare(t.node.id));let f=l.length>d||s.length>100,u=s.slice(0,100),c=new Set(u.map(({node:e})=>e.id)),y=new Set(e.rootIds),h={},g=new Map([[t.id,null]]);for(let e=0;e{let r=e.parent;for(;r&&r.id!==t.id&&!c.has(r.id);)r=r.parent;return[e.id,r&&c.has(r.id)?r.id:t.id]})),m=e=>u.filter(({node:t})=>p.get(t.id)===e).map(({node:e})=>e.id),b=n(t);if(!b)throw Error("DEVUP_NODE_BOUNDS_UNAVAILABLE");let x={id:t.id,type:t.type,fields:{name:t.name,parentId:t.parent&&"DOCUMENT"!==t.parent.type?t.parent.id:null,childrenIds:m(t.id),absoluteBoundingBox:b,visible:!1!==t.visible,projectionTruncated:f,nodeScreenIds:h},extra:{},fieldErrors:{}},E=u.length,I=u.map(({node:e,box:t})=>{let n=function(e){let t=[e],r=0,n=0;for(let e=0;er}}(e),l=Math.floor(r/E);E-=1;let o=function(e,t){let r=[e],n="",i=0,l=0,o=!1;if(t<=0)return{text:"",state:"budget-exhausted",spent:0};for(let e=0;e=120||l+e>t)return{text:n.trimEnd(),state:l+e>t?"budget-exhausted":"truncated",spent:l};n+=r,i+=1,l+=e}}if("children"in s){let e=Math.max(0,64-r.length);s.children.length>e&&(o=!0),r.push(...s.children.slice(0,e))}}}return{text:n,state:o?"truncated":n?"available":"no-text",spent:l}}(e,l);return r-=o.spent,{id:e.id,type:e.type,fields:{name:"string"==typeof e.name?e.name:"",parentId:p.get(e.id),childrenIds:m(e.id),absoluteBoundingBox:t,visible:!1!==e.visible,breadcrumb:function(e){let t=[],r=e;for(;r&&"DOCUMENT"!==r.type;)"string"==typeof r.name&&r.name&&t.push(r.name),r=r.parent;return t.reverse()}(e),directChildCount:"children"in e?e.children.length:0,textPreview:o.text,textPreviewState:o.state,subtreeNodeCount:n.subtreeNodeCount,estimatedSerializedBytes:n.estimatedSerializedBytes,selectionReasons:[i(e,t)?"screen-like":"explicit-selection-only","inside-section"],estimateTruncated:n.truncated},extra:{},fieldErrors:{}}}),S={fileKey:figma.fileKey||"",version:null,rootIds:[t.id],nodes:[x,...I],diagnostics:[]},A=a(JSON.stringify(S));for(let e=I.length-1;e>=0&&A>19456;e-=1)I[e].fields.textPreview="",I[e].fields.textPreviewState="budget-exhausted",A=a(JSON.stringify(S));if(A>19456)throw Error("DEVUP_SECTION_INDEX_TOO_LARGE "+JSON.stringify({pluginCode:"DEVUP_SECTION_INDEX_TOO_LARGE",stage:"section-index",responseBytes:A,maxResponseBytes:19456}));return S},snapshot:async function(e){let t=await figma.getNodeByIdAsync(e.nodeId);if(!t)throw Error("DEVUP_NODE_NOT_FOUND");let r=["absoluteBoundingBox","absoluteRenderBounds","arcData","backgroundStyleId","blendMode","bottomLeftRadius","bottomRightRadius","boundVariables","characters","clipsContent","componentProperties","componentPropertyDefinitions","componentPropertyReferences","constraints","cornerRadius","counterAxisAlignItems","dashPattern","defaultVariant","effectStyleId","effects","fillStyleId","fills","fontName","fontSize","gridColumnAnchorIndex","gridColumnCount","gridColumnGap","gridColumnSizes","gridColumnSpan","gridRowAnchorIndex","gridRowCount","gridRowGap","gridRowSizes","gridRowSpan","gridStyleId","height","inferredAutoLayout","isAsset","isMask","itemSpacing","layoutGrow","layoutMode","layoutWrap","layoutPositioning","layoutSizingHorizontal","layoutSizingVertical","letterSpacing","lineHeight","maxHeight","maxLines","maxWidth","minHeight","minWidth","name","opacity","overflowDirection","paddingBottom","paddingLeft","paddingRight","paddingTop","primaryAxisAlignItems","reactions","rotation","strokeAlign","strokeBottomWeight","strokeLeftWeight","strokeRightWeight","strokeStyleId","strokeTopWeight","strokeWeight","strokes","targetAspectRatio","textAlignHorizontal","textAlignVertical","textAutoResize","textCase","textDecoration","textStyleId","textTruncation","topLeftRadius","topRightRadius","variantProperties","visible","width","x","y"],n=new Set(r),i=["fontName","fontWeight","fontSize","textDecoration","textCase","lineHeight","letterSpacing","fills","textStyleId","fillStyleId","listOptions","indentation","hyperlink"],a=e.snapshot,l=Math.max(0,Math.floor(Number(a.offset)||0)),o=Math.min(a.maxEnvelopeBytes?Math.max(8192,Math.floor(Number(a.maxEnvelopeBytes))):16e3,Math.max(4096,Math.floor(Number(a.maxPayloadBytes)||15e3))),s=Math.min(o-1024,Math.max(512,Math.floor(Number(a.maxFieldBytes)||4096))),d=new Set(["id","type","parent","children"]),f=new Set(["parentId","childrenIds","name","characters","styledTextSegments","boundVariables"]);function u(e,t,r){let n=function(e){let t=[];for(let r=0;r=55296&&n<=56319){let t=r+1=56320&&t<=57343?(n=65536+(n-55296<<10)+(t-56320),r+=1):n=65533}else n>=56320&&n<=57343&&(n=65533);n<128?t.push(n):n<2048?t.push(192|n>>6,128|63&n):n<65536?t.push(224|n>>12,128|n>>6&63,128|63&n):t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n)}return new Uint8Array(t)}(JSON.stringify(r));return n.length>0x1000000?{$truncated:"max-large-value-bytes",byteLength:n.length}:{$largeValue:{nodeId:e,field:t,byteLength:n.length,sha256:function(e){let t=[0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0xfc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x6ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2],r=64*Math.ceil((e.length+9)/64),n=new Uint8Array(r);n.set(e),n[e.length]=128;let i=8*e.length;for(let e=0;e<8;e+=1)n[r-1-e]=255&Math.floor(i/2**(8*e));let a=[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19],l=(e,t)=>e>>>t|e<<32-t;for(let e=0;e>>3,n=l(r[e-2],17)^l(r[e-2],19)^r[e-2]>>>10;r[e]=r[e-16]+t+r[e-7]+n>>>0}let[i,o,s,d,f,u,c,y]=a;for(let e=0;e<64;e+=1){let n=y+(l(f,6)^l(f,11)^l(f,25))+(f&u^~f&c)+t[e]+r[e]>>>0,a=(l(i,2)^l(i,13)^l(i,22))+(i&o^i&s^o&s)>>>0;y=c,c=u,u=f,f=d+n>>>0,d=s,s=o,o=i,i=n+a>>>0}for(let[e,t]of[i,o,s,d,f,u,c,y].entries())a[e]=a[e]+t>>>0}return a.map(e=>e.toString(16).padStart(8,"0")).join("")}(n),cursor:{nextOffset:0,maxChunkBytes:12288}}}}function c(e){return function(e){let t=0;for(let r=0;r=55296&&n<=56319&&r+112)return{$truncated:"max-depth"};if("object"==typeof t&&"parent"in t&&"string"==typeof t.id&&"string"==typeof t.type)return{$nodeId:t.id,$nodeType:t.type};if(Array.isArray(t))return t.map(t=>e(t,r,n+1));if(ArrayBuffer.isView(t))return{$binary:t.constructor.name,byteLength:t.byteLength};if(t instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:t.byteLength};if(r.has(t))return{$circular:!0};r.add(t);let i={};for(let a of Object.keys(t).sort())try{let l=e(t[a],r,n+1);l&&"function"===l.$unsupported||(i[a]=l)}catch(e){i[a]={$error:String(e&&e.message?e.message:e)}}return r.delete(t),i}(r),a=c(i);if(a<=s)return i;let l=u(e,t,i);return l.$truncated&&(n[t]=`DEVUP_FIELD_VALUE_UNSUPPORTED:${a}>16777216`),l}let h=[],g=[t];for(;g.length;){let e=g.shift();h.push(e),"children"in e&&g.push(...e.children)}let p=[],m=o-1024,b=2;for(let e=l;eNumber(e.protected)-Number(t.protected)||t.byteLength-e.byteLength),n)){if(r<=t)break;let n=u(e.id,i.name,e[i.sectionName][i.name]);e[i.sectionName][i.name]=n,n.$truncated&&(e.fieldErrors[i.name]=`DEVUP_FIELD_VALUE_UNSUPPORTED:${i.byteLength}>16777216`),r=c(e)}return e}(function(e){let t={},a={},l={};for(let i of(t.parentId=e.parent?e.parent.id:null,e.parent&&("PAGE"===e.parent.type||"SECTION"===e.parent.type||"COMPONENT_SET"===e.parent.type)&&(t.parentType=e.parent.type,"SECTION"===e.parent.type&&(t.parentName=e.parent.name)),t.childrenIds="children"in e?e.children.map(e=>e.id):[],!("overflowDirection"in e)&&["FRAME","COMPONENT","INSTANCE","COMPONENT_SET"].includes(e.type)&&(t.overflowDirection=null),function(e){let t=new Set,n=e;for(;n&&n!==Object.prototype;){for(let e of Object.getOwnPropertyNames(n))t.add(e);n=Object.getPrototypeOf(n)}for(let n of r)try{n in e&&t.add(n)}catch(e){}return[...t].sort()}(e)))if(!(d.has(i)||i.startsWith("_")))try{let r=e[i];if("function"==typeof r)continue;let o=y(e.id,i,r,l);(n.has(i)?t:a)[i]=o}catch(e){l[i]=String(e&&e.message?e.message:e)}if("TEXT"===e.type&&"function"==typeof e.getStyledTextSegments)try{t.styledTextSegments=y(e.id,"styledTextSegments",e.getStyledTextSegments(i),l)}catch(e){l.styledTextSegments=String(e&&e.message?e.message:e)}return{id:e.id,type:e.type,fields:t,extra:a,fieldErrors:l}}(h[e]),m),a=c(t)+ +!!p.length;if(p.length&&b+a>m)break;p.push(t),b+=a}let x=Math.min(h.length,l+p.length);return p.push({id:"__DEVUP_SNAPSHOT_CURSOR__",type:"DEVUP_INTERNAL",fields:{offset:l,nextOffset:x,complete:x>=h.length,totalNodes:h.length},extra:{},fieldErrors:{}}),{fileKey:figma.fileKey||"",version:null,rootIds:[t.id],nodes:p,diagnostics:[]}},usedResources:async function(e){let t=e.resources;function r(e,t=new WeakSet,n=0){if(null===e||["string","number","boolean"].includes(typeof e))return e;if(void 0===e)return{$undefined:!0};if("bigint"==typeof e)return{$bigint:e.toString()};if(["function","symbol"].includes(typeof e))return{$unsupported:typeof e};if(n>12)return{$truncated:"max-depth"};if("object"==typeof e&&"parent"in e&&"string"==typeof e.id&&"string"==typeof e.type)return{$nodeId:e.id,$nodeType:e.type};if(Array.isArray(e))return e.map(e=>r(e,t,n+1));if(ArrayBuffer.isView(e))return{$binary:e.constructor.name,byteLength:e.byteLength};if(e instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:e.byteLength};if(t.has(e))return{$circular:!0};t.add(e);let i={},a=new Set(Object.keys(e)),l=e;for(;l&&l!==Object.prototype;){for(let e of Object.getOwnPropertyNames(l))a.add(e);l=Object.getPrototypeOf(l)}for(let l of[...a].sort())if(!(l.startsWith("_")||["parent","children","consumers"].includes(l)))try{let a=r(e[l],t,n+1);a&&"function"===a.$unsupported||(i[l]=a)}catch(e){i[l]={$error:"unavailable"}}return t.delete(e),i}let n=new Map,i="ok";try{for(let e of(await figma.variables.getLocalVariablesAsync()))n.set(e.id,e)}catch(e){i="unavailable"}let a=await Promise.all(t.variableIds.map(async e=>{let t=n.get(e);if(t)return{value:r(t),collectionId:t.variableCollectionId};try{let t=await figma.variables.getVariableByIdAsync(e);return t?{value:r(t),collectionId:t.variableCollectionId}:{unresolved:{id:e,kind:"variable",reason:"notInFileAndLookupEmpty"}}}catch(t){return{unresolved:{id:e,kind:"variable",reason:"notInFileAndLookupThrew"}}}})),l=[...new Set(a.flatMap(e=>e.collectionId?[e.collectionId]:[]))].sort(),o=await Promise.all(l.map(async e=>{try{let t=await figma.variables.getVariableCollectionByIdAsync(e);return t?[r(t)]:[]}catch(e){return[]}})),s=await Promise.all(t.styles.map(async e=>{try{let t=await figma.getStyleByIdAsync(e.id);if(!t)return{unresolved:{id:e.id,kind:"style",reason:"notFoundOrUnavailable"}};return{value:{...r(t),styleType:e.styleType,value:r("PAINT"===e.styleType?t.paints:"EFFECT"===e.styleType?t.effects:"GRID"===e.styleType?t.layoutGrids:t)}}}catch(t){return{unresolved:{id:e.id,kind:"style",reason:"notFoundOrUnavailable"}}}}));return{collections:o.flat(),variables:a.flatMap(e=>e.value?[e.value]:[]),styles:s.flatMap(e=>e.value?[e.value]:[]),usedVariableIds:t.variableIds,usedStyleIds:t.styles.map(e=>e.id),localVariableListing:i,localVariableCount:n.size,unresolved:[...a,...s].flatMap(e=>e.unresolved?[e.unresolved]:[])}},variableCatalog:async function(e){let[t,r,n,i,a]=await Promise.all([figma.variables.getLocalVariableCollectionsAsync(),figma.getLocalPaintStylesAsync(),figma.getLocalTextStylesAsync(),figma.getLocalEffectStylesAsync(),figma.getLocalGridStylesAsync()]),l=["PAINT","TEXT","EFFECT","GRID"];return{collections:t.map(e=>(function e(t,r=new WeakSet,n=0){if(null===t||["string","number","boolean"].includes(typeof t))return t;if(void 0===t)return{$undefined:!0};if("bigint"==typeof t)return{$bigint:t.toString()};if(["function","symbol"].includes(typeof t))return{$unsupported:typeof t};if(n>12)return{$truncated:"max-depth"};if(Array.isArray(t))return t.map(t=>e(t,r,n+1));if(r.has(t))return{$circular:!0};r.add(t);let i={},a=new Set(Object.keys(t)),l=t;for(;l&&l!==Object.prototype;){for(let e of Object.getOwnPropertyNames(l))a.add(e);l=Object.getPrototypeOf(l)}for(let l of[...a].sort())if(!l.startsWith("_"))try{let a=e(t[l],r,n+1);a&&"function"===a.$unsupported||(i[l]=a)}catch(e){i[l]={$error:String(e&&e.message?e.message:e)}}return r.delete(t),i})(e)),variableIds:[...new Set(t.flatMap(e=>e.variableIds))].sort(),styles:[r,n,i,a].flatMap((e,t)=>e.map(e=>({id:e.id,styleType:l[t]}))).sort((e,t)=>e.id.localeCompare(t.id)),localComplete:!0,usedRemoteComplete:!1}},variables:async function(e){let t=e.resources;function r(e,t=new WeakSet,n=0){if(null===e||["string","number","boolean"].includes(typeof e))return e;if(void 0===e)return{$undefined:!0};if("bigint"==typeof e)return{$bigint:e.toString()};if(["function","symbol"].includes(typeof e))return{$unsupported:typeof e};if(n>12)return{$truncated:"max-depth"};if("object"==typeof e&&"parent"in e&&"string"==typeof e.id&&"string"==typeof e.type)return{$nodeId:e.id,$nodeType:e.type};if(Array.isArray(e))return e.map(e=>r(e,t,n+1));if(ArrayBuffer.isView(e))return{$binary:e.constructor.name,byteLength:e.byteLength};if(e instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:e.byteLength};if(t.has(e))return{$circular:!0};t.add(e);let i={},a=new Set(Object.keys(e)),l=e;for(;l&&l!==Object.prototype;){for(let e of Object.getOwnPropertyNames(l))a.add(e);l=Object.getPrototypeOf(l)}for(let l of[...a].sort())if(!(l.startsWith("_")||["parent","children","consumers"].includes(l)))try{let a=r(e[l],t,n+1);a&&"function"===a.$unsupported||(i[l]=a)}catch(e){i[l]={$error:String(e&&e.message?e.message:e)}}return t.delete(e),i}let[n,i]=await Promise.all([Promise.all(t.variableIds.map(e=>figma.variables.getVariableByIdAsync(e))),Promise.all(t.styles.map(e=>figma.getStyleByIdAsync(e.id)))]),a=new Map(t.styles.map(e=>[e.id,e])),l=await Promise.all(i.filter(Boolean).map(async e=>{let t=a.get(e.id),n=t.styleType;if(Number.isInteger(t.consumerStart)&&Number.isInteger(t.consumerEnd)){let i=await e.getStyleConsumersAsync();return{id:e.id,styleType:n,$consumerStart:t.consumerStart,$consumerEntries:i.slice(t.consumerStart,t.consumerEnd).map(e=>[e.node.id,e.node.type,r(e.fields)])}}let i=await e.getStyleConsumersAsync();return{...r(e),styleType:n,$consumerCount:i.length,value:r("PAINT"===n?e.paints:"EFFECT"===n?e.effects:"GRID"===n?e.layoutGrids:e)}}));return{variables:n.filter(Boolean).map(e=>r(e)),styles:l}}};async function t(t){let r=e[t.script];if(!r)return{kind:"devup-result",requestId:t.requestId,error:`DEVUP_BRIDGE_UNKNOWN_SCRIPT: ${t.script} (아는 스크립트: ${Object.keys(e).join(", ")})`};try{var n;let e=await r({nodeId:(n=t.params).nodeId??"",rootIds:n.rootIds??[],snapshot:n.snapshot??{},search:n.search??{},explore:n.explore??{},resources:n.resources??{variableIds:[],styles:[]},largeValue:n.largeValue??{},asset:n.asset??{},theme:n.theme??{offset:0}});return{kind:"devup-result",requestId:t.requestId,data:e}}catch(e){return{kind:"devup-result",requestId:t.requestId,error:e instanceof Error?e.message:String(e)}}}let r=[],n=!1;async function i(){if(!n){n=!0;try{for(;r.length>0;){let e=r.shift(),n=await t(e).catch(t=>({kind:"devup-result",requestId:e.requestId,error:t instanceof Error?t.message:String(t)}));figma.ui.postMessage(n)}}finally{n=!1}}}figma.showUI(__html__,{width:320,height:220}),figma.ui.onmessage=e=>{if("object"==typeof e&&null!==e){if("devup-ready"===e.kind){let e={kind:"devup-status",fileKey:figma.fileKey??null,fileName:figma.root.name,port:1993};figma.ui.postMessage(e);return}"devup-job"===e.kind&&(r.push(e),i())}}})(); \ No newline at end of file From 1974e5ede83f15e332485db9c0a5dacdd857a782 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 14 Sep 2026 03:47:24 +0900 Subject: [PATCH 3/3] chore: record the original-image bridge route as a minor changepack --- .changepacks/changepack_log_original_image_bytes.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changepacks/changepack_log_original_image_bytes.json diff --git a/.changepacks/changepack_log_original_image_bytes.json b/.changepacks/changepack_log_original_image_bytes.json new file mode 100644 index 0000000..922cec9 --- /dev/null +++ b/.changepacks/changepack_log_original_image_bytes.json @@ -0,0 +1,5 @@ +{ + "changes": { "crates/devup-mcp-figma/Cargo.toml": "Minor" }, + "note": "Original image bytes can now be read, and two screens are explained rather than improved. A CROP fill names its source by hash, but nothing could fetch the pixels behind that name: the official MCP returns text only, so the bytes had no transport, and the connector tool that would supply them answers UNAUTHORIZED and belongs to the metered path in any case. The bridge has no such limit - it is a local socket where nothing is truncated - so a read-only getImageByHash route now retrieves the selected fill's original bytes with their intrinsic codec, never a whole-node rendition, and decodes and verifies them against the declared hash. The remote path refuses the request outright with a named reason rather than returning a node PNG that looks like an answer; that refusal is the more valuable half, because a silently wrong image is worse than a missing one. No document is mutated: the temporary-rectangle technique that would have produced an isolated rendition creates and removes nodes and was rejected for that reason. The isolated-fill renderer that would consume these bytes is not implemented and no pixel improvement is claimed, because capturing live source bytes requires re-importing the rebuilt plugin in Figma, which is a desktop menu action; the report names the exact capture - file, node, fill index, hash and call - so it needs no rederiving. Separately, the landing mobile residual is quantified rather than fixed: with identical DOM geometry, a Chromium probe with LCD subpixel antialiasing disabled measures 2.91 percent where the harness measures 4.78, which attributes a large part of that screen's divergence to font rasterization rather than to generated layout, and leaves residual glyph advances needing separate evidence.", + "date": "2026-09-14T06:00:00+09:00" +}