From 521ea5e85ba12dc4913a1b69753556de2dd06d7c Mon Sep 17 00:00:00 2001 From: "alexei.dolgolyov" Date: Sun, 12 Apr 2026 20:52:49 +0300 Subject: [PATCH] feat: add outlet direction (horizontal/vertical), wall light styles, floor textures, and stretch ceiling - Add configurable outlet direction (horizontal/vertical) stored in metadata - Add wall light style variants (classic, pendant-globe, sconce-up, sconce-down) - Add PBR floor textures including natural oak - Add stretch ceiling offset support with DB migration - Add furniture surface texture selection - Add canvas theme colors utility for dark mode support - Update projection views with improved rendering - Add EN and RU translations for all new properties --- .../client/public/locales/en/translation.json | 25 ++ .../client/public/locales/ru/translation.json | 25 ++ .../textures/floors/oak_natural/color.jpg | Bin 0 -> 50460 bytes .../textures/floors/oak_natural/normal.jpg | Bin 0 -> 11366 bytes .../textures/floors/oak_natural/roughness.jpg | Bin 0 -> 18935 bytes .../src/components/editor/EditorCanvas.tsx | 14 +- .../src/components/editor/EditorToolbar.tsx | 10 + .../src/components/editor/PropertiesPanel.tsx | 200 +++++++++++++- .../components/editor/RoomEditorLayout.tsx | 3 + .../editor/context/EditorContext.tsx | 2 +- .../components/editor/layers/GridLayer.tsx | 29 +-- .../editor/projection/ProjectionDoor.tsx | 14 +- .../projection/ProjectionElectrical.tsx | 165 +++++++++--- .../editor/projection/ProjectionFurniture.tsx | 14 +- .../projection/ProjectionMeasurements.tsx | 72 ++++-- .../editor/projection/ProjectionPanel.tsx | 1 + .../editor/projection/ProjectionWindow.tsx | 6 +- .../editor/projection/WallProjectionView.tsx | 98 +++++-- .../editor/symbols/electrical/index.ts | 50 ++++ .../editor/three/ElectricalMesh.tsx | 243 ++++++++++++++++-- .../components/editor/three/FloorCeiling.tsx | 122 ++++++++- .../components/editor/three/FurnitureMesh.tsx | 57 +++- .../components/editor/three/Room3DView.tsx | 11 +- .../editor/three/utils/pbrTextures.ts | 39 ++- apps/client/src/components/editor/types.ts | 9 +- .../editor/utils/canvasThemeColors.ts | 125 +++++++++ .../editor/utils/furnitureTextureMetadata.ts | 23 ++ .../migration.sql | 3 + apps/server/prisma/schema.prisma | 5 + apps/server/src/routes/rooms.ts | 10 + packages/shared/src/index.ts | 7 + packages/shared/src/schemas/room.schema.ts | 8 + packages/shared/src/types/elements.ts | 40 +++ packages/shared/src/types/room.ts | 10 + 34 files changed, 1278 insertions(+), 162 deletions(-) create mode 100644 apps/client/public/textures/floors/oak_natural/color.jpg create mode 100644 apps/client/public/textures/floors/oak_natural/normal.jpg create mode 100644 apps/client/public/textures/floors/oak_natural/roughness.jpg create mode 100644 apps/client/src/components/editor/utils/canvasThemeColors.ts create mode 100644 apps/client/src/components/editor/utils/furnitureTextureMetadata.ts create mode 100644 apps/server/prisma/migrations/20260408040000_add_room_stretch_ceiling_offset/migration.sql diff --git a/apps/client/public/locales/en/translation.json b/apps/client/public/locales/en/translation.json index ec8bd5e..baa4ebf 100644 --- a/apps/client/public/locales/en/translation.json +++ b/apps/client/public/locales/en/translation.json @@ -149,6 +149,8 @@ "toolbar.elec": "Elec", "toolbar.furn": "Furn", "toolbar.meas": "Meas", + "toolbar.stretchCeiling": "Ceiling", + "toolbar.toggleStretchCeiling": "Toggle stretch ceiling overlay", "toolbar.toggleGrid": "Toggle grid", "toolbar.toggleSnap": "Toggle snap", "toolbar.toggleWalls": "Toggle walls layer", @@ -222,6 +224,7 @@ "floor.WOOD_MEDIUM": "Medium Wood", "floor.WOOD_DARK": "Dark Wood", "floor.WOOD_HERRINGBONE": "Herringbone", + "floor.OAK_NATURAL": "Natural Oak", "floor.TILE_WHITE": "White Tile", "floor.TILE_GRAY": "Gray Tile", "floor.LAMINATE": "Laminate", @@ -242,6 +245,28 @@ "properties.outletWidth": "Outlet width", "properties.outletHeight": "Outlet height", "properties.outletCount": "Count", + "properties.outletDirectionLabel": "Direction", + "properties.outletDirection.horizontal": "Horizontal", + "properties.outletDirection.vertical": "Vertical", + "properties.stretchCeilingOffset": "Stretch ceiling drop", + "properties.wallLightStyleLabel": "Style", + "properties.wallLightStyle.classic": "Classic", + "properties.wallLightStyle.pendant-globe": "Pendant Globe", + "properties.wallLightStyle.sconce-up": "Sconce Up", + "properties.wallLightStyle.sconce-down": "Sconce Down", + "properties.cordLength": "Cord length", + "properties.lampSize": "Lamp size", + "properties.surfaceTexture": "Surface", + "furnitureTexture.NONE": "None (solid color)", + "furnitureTexture.WOOD_LIGHT": "Light Wood", + "furnitureTexture.WOOD_MEDIUM": "Medium Wood", + "furnitureTexture.WOOD_DARK": "Dark Wood", + "furnitureTexture.WOOD_HERRINGBONE": "Herringbone", + "furnitureTexture.OAK_NATURAL": "Natural Oak", + "furnitureTexture.LAMINATE": "Laminate", + "furnitureTexture.CONCRETE": "Concrete", + "properties.invertCoordX": "Invert X display", + "properties.invertCoordY": "Invert Y display", "properties.anchor": "Anchor", "anchor.left": "Left", "anchor.middle": "Middle", diff --git a/apps/client/public/locales/ru/translation.json b/apps/client/public/locales/ru/translation.json index c0ebbc2..071a5e6 100644 --- a/apps/client/public/locales/ru/translation.json +++ b/apps/client/public/locales/ru/translation.json @@ -152,6 +152,8 @@ "toolbar.elec": "Элек", "toolbar.furn": "Мебель", "toolbar.meas": "Разм", + "toolbar.stretchCeiling": "Потолок", + "toolbar.toggleStretchCeiling": "Показать/скрыть натяжной потолок", "toolbar.toggleGrid": "Переключить сетку", "toolbar.toggleSnap": "Переключить привязку", "toolbar.toggleWalls": "Переключить слой стен", @@ -225,6 +227,7 @@ "floor.WOOD_MEDIUM": "Среднее дерево", "floor.WOOD_DARK": "Тёмное дерево", "floor.WOOD_HERRINGBONE": "Ёлочка", + "floor.OAK_NATURAL": "Натуральный дуб", "floor.TILE_WHITE": "Белая плитка", "floor.TILE_GRAY": "Серая плитка", "floor.LAMINATE": "Ламинат", @@ -245,6 +248,28 @@ "properties.outletWidth": "Ширина розетки", "properties.outletHeight": "Высота розетки", "properties.outletCount": "Количество", + "properties.outletDirectionLabel": "Направление", + "properties.outletDirection.horizontal": "Горизонтально", + "properties.outletDirection.vertical": "Вертикально", + "properties.stretchCeilingOffset": "Натяжной потолок (отступ)", + "properties.wallLightStyleLabel": "Стиль", + "properties.wallLightStyle.classic": "Классический", + "properties.wallLightStyle.pendant-globe": "Подвесной шар", + "properties.wallLightStyle.sconce-up": "Бра вверх", + "properties.wallLightStyle.sconce-down": "Бра вниз", + "properties.cordLength": "Длина шнура", + "properties.lampSize": "Размер светильника", + "properties.surfaceTexture": "Поверхность", + "furnitureTexture.NONE": "Нет (сплошной цвет)", + "furnitureTexture.WOOD_LIGHT": "Светлое дерево", + "furnitureTexture.WOOD_MEDIUM": "Среднее дерево", + "furnitureTexture.WOOD_DARK": "Тёмное дерево", + "furnitureTexture.WOOD_HERRINGBONE": "Ёлочка", + "furnitureTexture.OAK_NATURAL": "Натуральный дуб", + "furnitureTexture.LAMINATE": "Ламинат", + "furnitureTexture.CONCRETE": "Бетон", + "properties.invertCoordX": "Инвертировать X", + "properties.invertCoordY": "Инвертировать Y", "properties.anchor": "Привязка", "anchor.left": "Слева", "anchor.middle": "По центру", diff --git a/apps/client/public/textures/floors/oak_natural/color.jpg b/apps/client/public/textures/floors/oak_natural/color.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5a7f7b46349bc65c81aeb98bf442637b925d57c8 GIT binary patch literal 50460 zcmb5VWl$V#6E3{CySpv!uEAw-cXwS}g9LYXm*DR1?BXuLU4sP;0m74oLy008sv0{qw|1Ez<0656709XJV3@rc_2L=uY<}VaL2KaaWp8)=!z`-NH!XN^W z{wdY40kANzaIk0y|9b;i1bDcACjbsSE)BO70v@fVrAJs=S?ef19nbQSw3e0U*EZhp z^n0Mp*aIQ~pY{s97on_<^)Y`$`J-G$`#*am|JT$1$JameZ~%COe=2I6|EK$3IR7^m z7+4%`8Yx^&OFTG_zuN$GIGBH7!{GoV03Q#30kd?)e;6txr`(%Na4Y8B1@7K-g^hM~ zlON8V^a$e7-~z3T)e@ol3F4nVds@>SL*0B$!bm2@)_eG$a}_k~Vv*8RzwuKHAMjfe zH!LEW(mA)oRW_G)i+9~s3*E%B`G~BPBeLNr8(U?(t8H^1r|YLr?(^*K7M0$dH=*M% zM7iY5g3SwY=G81;8F7-(>5kXmBc^tBFlWArX4W24hU{jANCvfq!|VL6bU5Bl;C&9DpL2w4b| zDqso`wX;&(1Xto)(UkbQqW`lxU@>KQaRG0IE5w?|-sqD$FUgtP<1LoC%S%L6X3Gem zBToW_ET=BW0`!r_B9i`)hY_({slGhr2V#wFs)$a*`ysx!DFjV6J+pbSh28W@>fNkf z>je$bKM>IOANg!ctg551vtUh#$!MXVXh#a1@3m*BBOu&0K2Z-llYS=lRrbhr^`fRk z>?KVj?d(d)B8XZbzcbW7yEa5~0GyjEEmrO3w!<&i6*Npe6u8bI|E&DVfDmUGk(tD? zzT*sc>f~_bI6Wq+K#^PE;AdQwLdjiCqb8|j9Fnt9(%hH1i1$VuTcJQ+%FMl|C@QxQ zG1hg1uiVrvj^A(n`kV%a6`SNWc4X;u``!@uWN)9&55NEMt6N>wj8TWASCIUG<(O;+ z%RI~KBf^)kWyy7YNWP;;zzMki38`IXStR60P0TQkkP0tA%l{Gv0)<&yr22t>Evz+P z*)$RLV1=5E$%8!IvpfyEzF{xN;vtyTGNVYGoy04!TkxTb8P78q@8Dx0dc!K@e?o8P zb2d7w{iRLbjmOzxAyF-WW>r47vo{oRAD}D7O>RKcy7*L+YlxmD1|LXJ*X{;eP(TrB;1g$93NlmMIYQsaw6=Uonj2_`cK{N9T6kN0@1HFHt zX<34hW}DPi7RhazB>d7zRO7^pOTO_D7J%ty8cuEI@T$KKY*@rEpo)fAep3l~pg`Vg z3`N`BLJjSQLdm#(k-_~fn(zIxLhMPtQb(-c`H4ry>AFeQ3R zE@xdoW){?A+%~v5%4moH7jvBbj+LrUy|g14&fvj6nRmEP48+|~)TRhG>Y(d%i#Z$a zrMz78_t@vk<&#OF6RuVzh$XtZoc0(Tel4H!9g*(k_aDPPY*uin%jW_!2R2@KD(BqH zs2eP}(3;n{cfDWNOy2Hl@cs9Z1~hOPK~3kQ$@hY8r9!=ah`$h_Xy&e6=Yzj%gA|ah zB9;6{>vn5YUn&}Gh@KYd39^|PFj?&lViZKN-ERs{g-_{Nn*Z39c z6Y9M6-S{cf#+SKwPgRCf8UhYMwVE*%^1qDmW>$wPJXeIt9ds)^Hfkt+z9aWReg6V_ zYq=&TEGqz^2D4V5G5%w*`!JQHLU+GLCS1^G4V&|&d@vWrqHnIel^Z`6dg~eJH9aw8 zU*Yd$c`FrjhNac6?b`Du{qlL`FW~zi9y4|}(1d*e!--&^r$|824aUfZ0q;u(t7c(U zNS^W8rNPf;lnVxV@*n#!a;nAJB?QZV0ZE#}tVbK734Z~K6=tyWaXmZjrUUsa2a;s_&aE)mpG3MJOb{aw>Uiy1ep%d*${%mlWGX#E&lT|B|DPphofPr z8NuPL09#3iF0&*v!P~rYkl`mj&G1jX(cPspLWPf92$H=Ngc7_e=jdcrYhuz5q1F2U zzfC>ON;Qa;Wdd9bWNbhdy-tbYjP|7)tUPg_f^5OfAjCcNExNaZm!nRESX&#GzUvU7 z76nh#WsReA$i^1z7;BddvHZzTg+W6I?zQpzf$nr-Q4vo=oh>j`IWptZ`Md+N>|rZp zQN2Zmk2l-G%*(Oc&ktx1vsD>sW#;H>XQd)_(ua}SYpx_h8F`dP!DB{{dR05wkS_@< zp<{+JtiE6^e$9C-Qqz4c6K+EIX;dB-muA3`4Be7y75P!7fHNmaHkno@Mnz~i`e7XC zJlz=dnHS&26LvkpPPcoHZ=kWJl@_W`@W$E%6?LZMzn-%!MZ@Jdl)SI-=it2e?Cs_V z!1xQu{iy5kW&65)Ui(3w=Pw`{>Lp6%6@F`08zS}+?1vtTKpk8~H9n&2@ zotYrZ#$pOZ5w`6o*L(cULDLY>A~VqHh8p+$KLTkjBVpnz|NfUEM>cXcAXM0tfcQ)B z^G?gG1UF@L=eO@Rnd1;kEq3DV(}q9DYX-1*gfy_kIp(#JaJ4Hn+v^y*)p`7 zjbZ!|cI3o?g%89f)X+bIPr0k=zpEkSX2*wf8&(%_qsicc4|P*^56cYXMJ}IW)NTk< zHaZ{s{oJ$&;W{KnHzUHqbXi~G5*!TeR5KRmgoZ{H^O5;O#c5Nav$V}blzC-xpH6lC zu?uC*^MaX4PRxX*I(s@9-|HO~x?@rpkd;D|ervZLS;$|& zDZe~Cz158RL{OA{ond@z?ajTpdL(69et3N1QVSiEamjZH7N$g?hGQVY-s`1F*V^Te z4gmPH2r0>ybe%hZPzbPHhd8emp#-32FfMqAyzT&3wX&sqSQIAYrc16KnUkuP<_ptl z4c!d%rU(Pl)clDy8be@I$UUt*gwiq@JX;eE*i+K@=Zx-MV09C-Z4@LWMZKPWeqt5G zJYJwAw&K8MNoa=!!N+Hbv*N`i+NY*VyB%Z(MOhYJy{})X6Oct7{YzOq=vUwMGllg4 zR5V%-VuEbTxz?bZ{fPjhROy79D}HX;5+KZO)NBFs1yFyPmBab`421A&lO4=WC)%$} zCPIMZl-7P<)S*2-&`iaeI$H*BF4JDzLq~&gS3{u_6fLJ?rIZc0lIl$H5tW7qfv}l0 zq|pjOaFmpN=Yze6W*m=YRbsm|y5RiAn7u5>i;nkot!qkixG8)O7AlU~ZGdK1E0jC@ zTFC^zOp>k#{sIE8TPEQ{pv9AT9zQ1J&*2UH3tn_{BJ8#Ng%$M)B`n@jjGR36#MT9g zo~!R)*+dG|JS+>kC+WFjDo95lg2Y!#uRU$z_9{2m(jXOZa&=GJmO9~c;rn2Sz6 z$);WF6oqj!39bd?r^N(jvA4|41)@&s14- zJm;HSPP%-5y(;})K*!CWTg4dR*eh{9xvXqkt$q+q*syqZ+1O>kSJZ_YNnK4(KU5V3 zKM@n#w{M1FOtVlFov>U&v_R)eMWw9@-|6%dxxw3N@prAHM4Wss&NBJhSEOOMqvqOU zIRk?RHo2c7YsFZ}9~c0-8=PauMZ|YL!s9S1-~Kos&5-5HS<4`C_Q^1w zen=Wtoq$fDY-MiPc#!TE5t+l8jAb2X4l^NaNkZF4^KkM(Zqr!xOdBdY>R^swDu_@_ zS~Y~nL7l!&#z7&8<z99>qIr(|+hFYed&-UukWII-thL*LZaqDmyg3TqBnlqutd11DA}O(( z!eyA{`7)B19J?WuuE`-MAuS;F?nZ#`N-j@_P~(T9B#0z-Eo@O+p2F&g5!%10>|Sba zXQufnG;Bl06>;=F233F&Cq7>&d);9D21FLO)zqh_TY*Y_f(J|laA4o8ZKf3AP^a0= zQ)3nu2{+~#E%34#EXJQ5TX*|}Jy$JTXUh}P#0prhAF%i)CXZ2%pDz;ICq`1={FbhP z@W@iqOTspe_r}M|AQEunJxU^K@Z)pcaMQ@e(C`wH$)Sm8-J^^1P~t~}j!y8I*3!Cb z^p54@`IEdiz=T3HWAvqRvZTdVH>%{1$m?=EI6>X(>y^v)L~)jJho_c4co(f7EZ_@W z;1T|W6dQ4FdAi^rgo&Sy427H~RJAKD=6h8!FK&G#f-?F0j_Uetxy`HA+FA~9x!BHJ z37?yT)?PuxL)o=Ie-S!q43NV^s#p~!g_jB$3wD;|j-CbHcSPFyILzXeS~eY=IR%v= zay6hRkYVPhR0h;k2<3f^3-7=cRhk;X*1J&K6TMpF6)^buTfb!q({fM2(B#`|@CP>t zdA5M*8W-(axq`c0p%89LKx{WdT@JT_+xSR81Z#px`ZR9WOqprft|gr$(+j>fUg)>iKC2%V=z#r(AE9&&n2IR5zxyRRWigEAGh@J{K2(b`DdedLz|)@Bv3(n0c}L2UlKb*pNB6l1J(OYb?- zOzk3>6IyUadyQ5Kii>E(0L7rLtulq&>4?ZD1SGszM%kDWV$!n{^`&B4VQ;HOwIh_x-T^EgZCs&xq z>XLLDx**9{)R~UhdLfo{T+f7b&jK_&#iN$?*zNmi>%xf48|tug*1E~fuSp&3w&I;y zv;i!kyuqn{MH^RZFM4|?oLXExVk#t&si1DaRkg>)LYx2|?n7$JbTHWVqVuzYZIU?# z>nI0}3snA);5(f$g(Ix2WvbZ>MiW1o_a{2dEqT}Gdp>RIC%-IfhhmddHIceyA?feVC z?kbWs+smX`sX?tvwm@?4es^+7$Mz`ta#V_phK2YPHM3Wp6V6lfS`sy$r>R zlaAnGNHGee zAaS8fn)Q-7A`TlFrh{zN`A)8E!N# z@X_WAk`vz8P)m)h^PJAQ31R220)J9FSafGQ%`$j`!HIt1&a#KkoCcL^f>B3=vE4+N z&IV|$q}#b8?jf`u9D+p2c^+D@b%a~AWE?Pqi>A(4_zsa_FOyj!E3t>^GVTPfsz#cheh(S@HH1qV6WV0Z7lw$3GF8((HC|;wpuN zJ@3Vd$qwQub>`ChNA&qerMqT0T*Yntmo3M-s1OTnVq0pEd6~!%>X%PwAG-Tt*H1S# zLy3)czH4P5yEJ!=e=&Ua1G9(?98oGL&Lbq0L33lL7i5@rL zV%Q)P*jZYa?K7Zi9qx)jYhFC@xHa%th~5j&%^Is8Y|i5K<5_z}6Box-3m0gqx@R>TCHVffp6o#8QYTvux88PX*Kz$oM4JM&ON3EP&%gvPd;41TSXuHudp>h8 zDY`l{M5p<1ap`yhCZQ0C@Z^TGX;y!E%9y+qd`!3UpZ!Wq@{*Fz4fw7uCFy9VdH zqvqt#j9ELoz z?LBJu*dnx?epmjCDpH?YH#Lh+pRWw4KH2obQs87SkJV84lQWWnR z7umMQnV`8uU?9Z=)O;-4adsLPBZaTIS#GkC8TVVE#Bew>8i3apt^&j<2`Xm`3w4$8 z^;FeJrf!v$6j+sd8;2#7mIP)~V_?qiYGgJr^GUVU%my8r{RKohxt!2WTF)rXzs0eH z_?WcKl7sKlXUkUql{b;ZpgFf&WaOb8`b)c{#95qUPFFW2N^Vr;NcQ&aoENV0nUk#s ziNUO7Z1baVDcw8+uLL+fY91>cF5rJ9N{SCeNqs4HnJDyZvrT(qOuVAVMmsJ+^@iEO zS`g;U3EYX9uA$#(*GJMBp%fR26$N~Lb1z9@H$zwF2o*jmRXZ?@mfs)C-6uFB+ab7z zLQ_wsh6ay~?rzr8gmexUwL6^Sr|s8@Fk@DfFuCK@C$#Kk@L;5BTk#dx+HPIjVcW?f z_Oa#Tmf~5yDOg0~HqX$Wi;IoP;^-%%v3FMEg_L3C#W> z*M>Uw(JHB~U|!~(4|C_gIwRlSrkdaL2a`o5@Du1i0ZJ1EPO)!nSsTHpGo^3R0+ zyi|ze8I95WayY?xpma>Q`DTEN5~pA)#1F=zj%RDk7ie!K#ISbem@oE5mh$Nt8m2K9 z{ry$yH-8CMm5?0gs2BGVUAVywd1ZB#1xfVBeil{ag`p6oyoH{@ly{mzv~gOXPkb#M z;$R=s0paHr5KxZjoG%C28gHAFxX5Ojh^?v272M2^Xog%8S!7NS7bJiU7?1_$)ubtxbW+x21>oR%XZv*vK@;S`t-j^%Hsu@Ggu-5^cx+-1aHx z>yXwJu09MwFK}~SUa>U9)N%AvbS`mP@02)x3ZgKv;|Ze<6om8>@7n0_Q4O2o@C}#A zgaUs)VH|=FrXjALgMl3hb*pWX2=_(;Cen~ER zKw)c&2(Uqr!7(>-4T)#A4%io?=-HL6Qt*CP*(b`_F?oKs!$*oVBNzAj7@?jEQw$hs zbVa(pRkg@*bwKFZIJN1Zl_D?@t=t(3r`h3zFsard?C-bbujw!Digkj`B~6hG4q4h8 z4%vRIfHBN5mWB$drq>)-rrR1Ks`0_ha)--x8RvI3d=(ckI2@miR!*Y~-Ld`UpI?B7 zVqMJRjUHG#Mx1T`ZT8cm@chqG3)FFO`l$8JD*l;Bm8}(rOaC-*BmH9N6R*in z-MxHIVh2>)Pe^{YD8#%i8?PaReEJqE3>xxvF1|N|h%~-KW18}V@+n6l18g`YZ=tAF zW4!0gTPMGGw&dn)FxxH7#)Z&e^$d}aWXL>LXjAjg)^}dKv=&GGsa@S$4Y+{VzIJNG z8OC3>^~@hzFIrmR^G%V5i4IjsAjk;_!_>)*EQ=rI7$ht-y0qI*p~ltqW7+;(UrA6x zzaS)a_6U-`>wgh8{qWC-m)tB>Iup~4ijfN*OaCpP?yJsb@?@Idx0r)_SUMzk2Dc#j zRjHoF*U}|a7|D3ENX!w<06{x?PCxUC1N^G6P&_hD13ivoqVs9b%{|!d;Bft1iW~rP@qO2**uaaTv&V;eI~y7Dk*_x~V=#~> zAu3SPW|BfLUGWdEla!`^%SrJ0$r27;s%ZTMT*(0WZ;88Z>uwOkEl^=OEV%E0*EuVfdplH{A5oqAa$StzKRey}Qj#|XEQC#i(v zJ=*c(%c-WZfEW3%abR1+Q1<{+*N}&;Mz<>>Fl^V^i9Pj6s1pO;OiuY*~U{x6^W1Fx0w{=%;b4oPBTSArfdRcNNo}W$e`FV zjJl%XS$n!EL-0S3XGZI2cO-;n@0d;;NBYaP3o-C*`<;pYc4V?McPYq(*0g*_Qdj!l zie=S~5M-rMQRS*SG@llt!`N2ZLXvI08X`rR6?gW@x%ztfF69f5Q;#;6 zru?V#Rf{;0SAN8x0GD%7St(N1RnU3QEZJWdwcVlghJX&cPNe|U6)$jCUF7X5KL+un zZI$rLrTChk5jmqwoca)&+GOAvy0y=20JNm;iX?l5yOb{Bv&SQCaIL$McRr}V?8m$+ zyfu4pj^s{A;g+9EjF)WV&^^6!5$&I6W}p-%7T4ev+LAfRmLDS?tIMr$=2X^PxgFpB zsKyT%|A~i(DFx?+-|bLs8J7>5hIbmW%7G?~NAF@0I&MxQsJ;!1JGzZzT#^&@Pg*m= z=_!2btsP>EVs#6JzePpxaTi~BBH!wH18Dw|5)|*)rxbg%6KM4We;g=@4A;|r-;c`o%`J4ixJ7Zm$RF^C#pojU~2 zDv zcUIiTEYasvI{Sz}<2O2u(iCo42|#BTjxq{rzj?KcIm$C!Q|pP^!0y<6-x(Fevij^@ zqg9MXoGQ|N36>H?*Uh75E#XbOO)l#j=EcnCq{&9*33=HbUMs^aYYL~aLA-0Shi;@q zkGaK*=Zdl}7Y*vIynb&2Er+%KE8pUIRmK>(<5u{_DIP~X^9cKmGRPr%j{W+LSlvDW zA{oZGLWOe;SuHwWX_Gm$dSumq@>oa$hgsMq2XUb9_VwBR5FBgC(>dRu?v4*S0}6D{ zM9gHG`=@37)-3Q1d-^(tQF*EP+qtJ+HDMNons9E)i|K=((8Y23p2Ee|&yn)(&Q^j4 zB(Kb+$Lx-IT-{eWkH!X{8iE}tnfR^)O{iB@jz?cfzNRxBMW%h})a4 z!?Q$Fq>qZ)aa~Ng*4}5}LW>f=l50JvmarAO=U?vO)qPNOn z5GQhBdq<_T%aw-A(KU3;>0~5D&78xYEhkdowq6M1q52n4dmp^GllDcjjyO@SB`u;x zkI}TR$Vpz@Cj@(Rrj=ONL(0XR|3`(n#d*1VLdz&_ML1`BQ)SWd>_QfVTdWe$PCiI` z;pX!xRt1PFX`hD%PIM@X-E)m-OB*|yi;^azSl^>f3+olZSU@+_97Q?SK!;N5(o z%kmrXe^tX#|2ZiFjbCc4D>IKf9APw%4XR~BA8mas2W(kNbAUEvl#8zX#)}E8^!R}-oTScG zXU$eu^`ZYfLPtPbNXvY1A(@kJ;!1&0xu1hSbcAaN4Z7 z)Q(gM5&o`c{W*`#AnihvRx7x+2x@qtrOh4Nu5V@>BYy$xh%TH|%*F|YU8{E6m(8~u zG$;OVzzp6d4HpYx!=$TJr{gjEkLBG@_H!1Y$V6Z z62$i#7P`P95Zt)Kqa4{WH;h~a_iE|C&%%-4m-M1}=qxl~Fm_DQU@%bO_@e8=sb8X9 z6_n?a?!A?+Fj zgO1=(TI#&l8izBNzqVQGJTWdr#jw~oPqQzH)tX3Gtd7Po?0z+PGPn2vH&ht!P#vmB zf`FMVDn%AsIf|?1KAxxglr4e0DWjKG34zqDJ3Acz$l0g;OpT`jJFC zRp(a2@bXkmhS@S@8bU*ECG{Gf@VeAdK_x@5(9gNc>cus6?QG2afL{j1WbX@mY|1mp zi^}~jfGWmOZKV@uyK$@4&cya>ukF0v3ZHidC{6BQ=%c;DEEq{*L#H9&ub1B5>dP?K zW*$(xj6J|SCVyZhvF%u6v<%w#E$hF6^XXMTl7Ew=B~*Ge`|&qmi>+IwKZ+AkGyKLJ^)-rK{mBaK`YJ>J8}MbD#AC_^HvQvCe@x4NDFaEF4U`H7CmY%fNipOf|?dM#o*Ju(u z;vgiXAqF)NuOI{8-HtAI&z6S?1s_o~bE>VK?cBg`kv`{{Lz$x~TcDw@uP*<#ipTd zrnz0bW4tE;a)3UqJARU@Cx*y#qn&NM{@PZuWykj<I(W9$sbt@N z%tj0mY?3^0t7M?AI|n~C!@`qFv`@4JT{c8;3wDx=;JKl&6o4)T+;syi)8}cCD0UgA zbr&sUf|;`L(!(#Ll&mz)sDqDO-#0@PZ<~%`JHU4RupDgOn{tlgdfv?_jb9;(^Kr3% z>OZe;_Mll-5^iK7`M^bH7Gv~wuIq?+#TZqyc#@NW|2Owtp`)g*1%~S2xt=HQ!XE=kTW!Nvsf3Ps|@jBjhGf=IMExT z@Yd|MuhdUlQN&LjjU|G2>jC? zD?5imVg3OcPURs8zh^^IB0nyJ^pX4BBXL5@Xca7AIvc+3dlz$(6w091MHFfLX!)0# zNG78incQs@k%)2P&N3`pOtXhZr(%dXJd@eTeh6+|NJq(HacI<4HsSxVe5`mC54?}8 zlXRAjG%h-l57PyFUmx%x2B>I zcDvWEOy*UtZ0iP80B2DC+-jd|`0qC>8P;mA|C-~h97sY{VID7(0-9QrxGlKucW4HU zxCuMta=zyQ;Ll~ntyenkNHRxfsPL23no&M=6aB1nm}IlTkoa&4@)w40RV5W|$qSb* zwe#@pArc$;W((nAq3LPAv9y92PEs}KO%a$Q6k}$Tl#*E0;Wnrc(mjS0PTSEV!`^gv zz9hI2@CV4C3gWq;R>snoqN+hzMA|tQvWP`n@Q#R0aF}j)jL?lygnTH>Bh zL6N`WS0;=|bf`K;zG!RkVe@>N9OHxC0aV?40NVmbo8*&*+5hO3PV`ogntXQ_3xKf2 za|Xl!QwH1ib<4TU%y=;fHrpwgGS>cqJs>73FbBg8I?VdWUvQn;&O1tj zfBffgMd*<8%Y))7=e~9m;$mQ2;#(#fr3EPmS)=ljaXz`dX|1}mJzD80WYZ>Y71jci zlQO+*hV^EHG$3>I$wZ>6&8}A-(-<_Q`_w@QD&cg|Mfc+gG~_O7a?L#vD=c{y{(~X( zwv5n#rRA~K6kp#P{4rdhyU&t=UQc0MDH}#ur!QX@^&P$ZOp#udv`W>aTO}QRgrb_Y z{S0a}Z8dM;G>4l$H@hZI4@5BwlFYSwTjIjQ854T+^_ZG`M=*TPd6?qrsd(u{^|Z-`I8Zw_>#K4D-|!pPxR$Ox`h!^o zNYqi3Q{o+Q4e?k30qh>bV~MpzF7oA$U3*yzk=BDJnjZK0Zx9arus+`34$HDepphjq zXEp1?7>tpXg&(yJQ-J@z%7s4EJGloj!J8Km&3tRiNt*uG9?%>yxoc1KY{}xx6ZQLT zx_DppRPA6Vq49CF(e(BeL{!?^ILQ>y`1eM$7%)L#1LHV@gS2U#;dp~ z4WDgt_HmpyFxr+$pkCPP^DQazROFTYlAjZRW5b#Yt9Y8u;Z4LJo#C;`X?XwsQ#HmiznKpM`=x|C7r>B&7(4K*Qq%|XB+Vm*wK6CU1^Tuhq7*rR=F0cy;$+bXhup{)0* zGENI#%48o>88v{twjk8EAqzQPBz^O2Z{LNL_#M6Rqaje4i^xty7=Tvr#jfY|flY4N zddj=+zfyvNHJzOCSX%24P*j}Y+WxnSMd^LgP$67EWSYokawa9|>isbX8X@rF`Zv2) zx}%mt(1yH2TXHE(_5Fk}Z(*5EUszKKnxh^x(^^Cnq;VtV0WM5aQ4c7~=5^_2QxHDE zyaEkr{*p`p{{;Zna~=QX57K1az5s7FW-a_($^#nNfCPCNsy0C7kw=!Mj50473)4=! zqX;Skjfy50xXe$l5T-{lG6)ZtN0QouFw&zc7e}Tp5MDC{&0ZPVQJaZLNo|H(bS?&o z(>9RE|Cd9+_S*KJvivF3@3Ol>qsrh+=o7NN28<}?Ei1{kILl=qPHWfpe-s3xeB2C_ ziWZ)mz8n=?Ydqh@lAPw&R@za7ih$EJ%0-+tl$lH8iL#Bvo#n}VUJIj=;)1nE#4Wpg zHd)FPf$CZ4?i~)V)dp1Z8<~RpYp$QQ)urM=htsT61Ud!>{w%&a7wPC02vpq3Kd9W7 z)wcD~MmOJLb0R&^4G>t$WC&VBccg|TF(LAk4No=@Bbzu5Oxp!yxB^M`#U2RqV*##IBnCvE7AVRd=a}{!;A=CF9 zcsv;kljgj728BV^)=B^7SMcG#1BP@I#&!tc3~(k7R0YfuA9#+H1sXITFTnyEo0kM0 z#9jq16)zh;{^YT>yf8k98-$nUMXHB8#kj#F!;qR)seZ7oRU0U>Y~C`ML!fykYm7UB zkgYn4G&~TwJIe6bTsN6&kDJs1AqWSeYV8cu_q_Nf>l1*wHf`g3F~iEyaU`6;I<6o)Pi02_x0jEuFw|9tl7%7>0t)(Zqxrg

x#A{&$Z7B<~`?3DiAJG6~eGMt8Uv%NH$rr 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%0DW(0x1$PTabsdLsBs@j5Z0O8&)8v^Amqsv4=TU zQTPa{uNOY2&V_L}VD4CiDhW5xSdS_@laZTvLfyqpCLN^2KrQg88t=HL)LqaKqh>;R zuC>m02|CZmOuVJz5dr8L(`g|QxEsM0H-lo63Bko=1zgNd&C0e1!l?@gk0VgF@FIr2 zD4iI&1FOhTqfpaE2)=Y-ZlVvVrWB$z-PIQ0W^IDtTgHTPCmv1KP@*W*?aapht4>j| zn4@oI!?7FV9cMMYD#}He5O=*G!Bt_2PKh$2{{SdHpw&Dx450oypBg&97cneEGXQrr z>1c5&9MNIOB+hj=*ggucKA-%Gw737T$7$qq@BF2V+cexDjqC~!v6 zONQqvR{sFY^s1OaXx9ApG@GKULdtm}VV9|aBhIK{mgqV2+s=;ZW)k*!O0;}Lg~}Z) zIf&1wB`6VAB;C2iYM=zbyyl*N~Z~96v&8JMU*kM z&4~1;vW)XE->-nBGLQM($9co1zszVtpia#axnY!v$rtRbES~7}7NX(+Wt45RgW>d` zMyH989k(aKk|)B%L@alDQ&@T0H!X5(M{NNRh?l5r>Y~RPW^Fd>;Yy5F!p0h2GW!{Y zy1@BY(L_caP0opz!|6rf=O>LSpsLKudBuROMz+Ii{q3x6Yaw?$lq2qn0h5ZEFR_)A zwMq0eMph^dv;zH>zpYK-d72y~Q^t8qGirY=>E?7T8D$J}9r=&yBhr*YrxiJuHI^^3 zE?ZWxqoR~mL$pSnZko zoooO;0;pklsU(W>2D@Is^9}wKG*H%LY(`}w#5Tj#MC7Vy0KRV8n}x(d79>M7$sB;N z2*$?50uNO@#AO*x_Uxfy%6%m~Oe>c9sTchArPfdi7El>d_T7AkN@lIrc8Sx1@xmEr$1d4d&OU=4nPo$_`dKFwl~#N=+0T zWKt_OZZcE@tx2Z_lHlyoVWC2wy5qQLg?%>Em2@CRk?Uqg9t7(gNYiVdN~V|`T#E94g2S7s3?kzla;=548x5y++810Yp1icr{A0g2 z`b|xeQoJCd`WV*#0M<=CHS$X2>wSB^wI3Gj*s0Y3EU2*$%zysg6~1E~QFuEN%`)+% zkYrhuk+YR!*<(#P9BJm)$WZ5nAZ#)yu~c!lXanbJ>F75)-j}~o>z;LZVZ4iW3vJ5rh;>83vxyF1){+vrj>291L8#nTNKc4vF@TG z6~@eI5(4zsq;%dftX6}|0yXY6o@e%YztHK4ixw>wcDS|jkwf78E8(%Y>^#XZ%gb2`Sx7xU-pZ#gFvvM7 zpaYjd(Mu%HK5jM300M$(ci{2Zv03DqM(cQiLN9I_JveduzO*O_IH{J~6%Xm5yoGpK zO^&!?e^9RDhMSUS*Je}aSPBBj1+A1Dc2{R%#?N3+B~P7iD9YN8fY&&v!(KJ)*Rq_C z3LLk4h{_wMzdkDvd5SM#YxItob*_uFN{_o+uje_Yq6ZzWLs&)k0DdFc)5pD?D3ah zcw1d}ae~w+qdCxv3n9M0gwqR&j6(;-bC+Th_WZP5OjsnmAT&Y7YMlU+F zej>rivTx`gI$}&RG|?yuh-BI?Z{lg?S{YV6L)}hD*FZqjfCr5hISjJI9WpAi5H^pA zsC4+$5oST9z)(s4R{7OOk~0jU7VK72m=0m|sZe4H#Hys_DXqEk3Z)Ac5)0fBF4oz$ zhR-h)B92VgAx3+aBQ>^I*z;7mut@{Tg}BL4)?PHA1;)}y8g6Q}N)Wn7u%B=a1k z3Q`TL4KQe74A!_?lB8VRi%=qxJ!H*xWKcJN3SVbsP>sQcD-&%sADmDjR1Bno7zH{F zwz;h3I|`YaNMc~eCT%VDu8Z@bx`Kd$Gc?DukWZ~Okz$TD_=sfG>$p-A$^;B@>&Kxc z+b)!%P{z4MhPrrAB;;Z+%0KNj{{X6)Rk2I|0D4lmjVHn%&Ze9S`g5Cwcr@GWNq^}T zN>%|Qw&PMKa5z_kzbu3FigtMkg&O|=Xb&2ec(VGtDuPYL`6kxirEM_l#T zvmy~9*lER|5Gc{hmU6m`<*a(E55}o@?0zP39t#VAl`&2OyD=Fe8*E6u&8Qf@4ly$E zlV-KaHHBYrwf@LUgtepQ!RBfy^iA#b#vl#I|`MIV7Q z{$um1umCX;b+4r;(7dvofaX|~_?p&Mb{I%P<8D9gIX~8FmK}1eT3?h$fTd#sOi(HI zqBiO*53N3oBM{tN7u22F3L2-F^N~hC2Y3dV!6O*ljZ4YDpaEG71Ftpgd#hX@I)+~{&k#L_UlCMY?vra$tZFEPoF$8J zc4Qx>xjaB{kStBt3P|l>DEL+j!ZX`mL`U>cadQv(w0c~7E05GDPfPH}7z;?Bb=S(Z zhxcK>6JC~9wDYk)_RZ<2^#B3|uYD`4n8U^o2x2X-B0t+o;^Ha7(S`p2>74$dOhGEg z!Z@*gc>sS+3lkuI6TWK^g&==Wy?5&VGi>tW0XEVxOn@>q#?@`z6d;64E0dvh1E>ll zOj#PoVI#u2q$7uNks#&+%A1B)0dKeuBT5TdK;8-SrX!UWJkk;rE~oiTTIet#491uq6}Ch}!66#E>>xr}Sqg{xtbpNKO9J>C<)e zsj|jdv4nrOCbY;=AX`A6lzCB*HP{RF_E%$wh!;)6%AAJ?a~qA`mDajL_$16&78lNR z-gFhnqyGR7H2(FkxIBPyD*ENbwU0L?XsGHi_8mU8jcXKSD7bjYli^i2zR{_rVV!vA zhc(7PZ@dtoZLIK?D5ez@uqPr7HvA+104fAb;%Vg2CqDD39+YN&6~9b5gd$o{7%|KS z-4uMNGDx{H>V5kG(PeFDPU(mc$bqzt*y*zQsa)*%h(W!tG=%irfl6d;Sc-6v$jEt4 zk$_sqOKkepHJNin3D)b|$|KgGrPm9YkbeR_hkcLAsKl*XBqA-wB-~x4>jbb za1ufVfgt!Aog~FE_P62YD?YEC#GX_`TEmLcDin)PBl+AW2dq-J5L z;@sb(F!|LtaMMV`W_KPYmUtEjVhRZNZ5it;apEX|5bbbmWMke*r$#+;2>qS{ZLVJI z)D+^wM4DKpU(kMZ?7R_+Ogs`srQ>B%2}>JXos~LRXT!!b#z6r!Bb`UmyxFq77qOgR z1~^$sA;xVsUc%;+0a`M{W^xUOJ?JA5D=Zn%mC6@4NFz%6H)p->GRd;r0bXj;oM+Ye zJzEI=6>w~}a~gU1OP5*KIZ*-8)?*@eiA*o$a#ot`z6jVQ9p z23B0R&NKt?txlZhRIueV=KR2fKPqz)i5NiFDp=eP%Cwu}WtK?xae3v;PUB()Ji)c3 zn=*vDmO2aG+YJI-9x45i!f70~BE*t4*Q=(C(dAGE)3DoS+6*{U93vM9OC*mhX_Y}b zEr#zJP(j27JR!lx#^P5){Ribv%L_IcGdMsb7YBbR3Kl;QPYB=`8;&{He?g;8=5&rM zjM=2zZEG9c_f)@&KVFsNC9iFWeJfF;79~|~7~3(h8ruEWrWpwhrp4XaU5zb!f-QRU zb?E2UBr6+bR^rFuUG#=67cv7QNh%kL18?EIiW`$u0ZS4lj3F1NYX)b;?TZdnQ(Gcf4ce&JsCjGTl?mB6rRQO9Wq z&h=Op3o!?2^`s0zFwl|@`C1;m4|P`J##yW{{^E|QW+uvk+X$?ABHKSGK4Pfl1%M;% zudPolnBe-?_SFpGNM_ilG3o)0O+}Q;iy-J_^At$*MjYxzPr*JQtdZhP*~c9pKo%u? zG^zkws^oXxv$KaP9mr*2v=ueH5kA!+U$Ytm+jCe@Ls)ONyxJPb#0)9K<{YjqO7z$f z<||$^W;}bOu}2Y6IGL6=WV+ar4Zu4-Rb4S$W=115+-q#3OWfP0pEA~}E_FLQ z^`TE<(~-=+waCqxw(MHx0PpPFEh}SEOdN8ARcV(fEEipSX!7A>#c-q^&5MRWxMwWU zusguDUYmptB34P#DWWNIj(~!7+7*K3*YRTZ~p*+_*|j)_)Q1>!@v1xu>SzTTqcpa@t8~HBK&FQ{I%D4 z{@pRJ={qz}B1i$`Gg#b>Y&P@K;e)7RHmE>{bLiUnQ~v;Mx*Ymc^nZDaZfxJSw1H2?s4(c?gn3hO6=v4jsPd`U zX+vS62Tn-+wC)|_A$A+68uc1BEU%y-O^X2E{7wG={xz;f*M#4v%-2vJI}+B=x*orF zC=j<8oMJFBvfX-aTUtCWoZ%E=W3aYaQFPNl7P>I((N5*bHY_i@lxf}&K+?o+FUEtj zpi+3*8ay#KVWGa7of_0-?1g90-~}VYtCB#7UtYRdW4rJxBJKCMBwa4wH7}O znSlgs)K;Tx_<*DU6$#X8Mzs7DC5QYv=oA=G>NXvIbyg_CG-}4yu-VK<&b-uoHHr61 zQZIxi!+QdHX=wid;=E*t$BTqmy}lxJ7aRWo4~-A`>Xh7%Qyc*l0sz$P=e&Zd6B5H7 zYuL&VXl_dZZ#wWWf5v#p*^jf~#-Xe;TUIBZq|wj(ZHys@tZHzwy;6 z{{XIIxRtz22?pk+$r8Mnn~U;-0oVtvRm3nLfxYfLDq_u&Ddp1XEQ|*^00HA_-z;=Q zEb`;A01{G33ZN%IS5SNissk&Vqh?!?eVT!NKdwyOW3E#zgp8qIj;EGsM=l><5MGnAE^dva(9UGP9^GPPxDub6F}jE(y>vKuA{w ztSxbMI``MyOu0(Oqu8#8UyX*H_2ih7?0Rmm>8Id$@fdY*%b21hFV??D@w@yvB>2N%SDQp|c%9zF;8=bj( zvr_2Mt3;L=O55}wom0ecCM{rwSc8-*rp&e=5>2X1_*_mJF`hCA39Yx~A2D5Qh95eZu<>;X=MSUEw9GF>CbvyC7i4U(3Q)VG3Nw&R^lw-t{amj?Y_lpUU8p5 z;LJSy9}A33%IGyh4edQ{uF)ZoCw%b9TsP^nNeYir+jv`loIJ;G6#Vv;N*Y)EAd zc49T$G}+Ha^rPFVW)1m8e6iVDyo5jTjy&QxhFm^UfZvMOOLWr@{{R)^qep9D&4y#{ z_g=?;F|0r3rr-6+jBKqMu488;U5K$d@1$jvmbLevO3b+FxI#u(C<2r`l(wYMaSdpT zXR*q}az{05GsbrH4lEpSLaFhPelxW5bq$mSRZKyd$tXrc7$0XqJZSMrbt7(rPRazV z5@=nWxTk(n-%P`Qm3kuzJ}KLX3gt_QBSUU+YN{+!Vb|s=Mkgwg4z|PwJ>%z95xFyq zYpx);%8u%1!XGN8&vX#of;gj`dAVN zfTPOE9x8GOIa=51r``t%hzQ{pKYBMmuBl<;zY;B>YkrYSVe-!`Gb?D=b8r6u*-v3~ z;t1T{lyyrn=R#*jr#WAoJ2KT&eoXq>z}vi0*NdM|1sUbG+j0N?r|LJW_KV>mEvZ@va5}Ei~PrBFB;1e z$^0^NH$V5jobYe2(!-Fg`9*OgxNFko?5(fZ8#^npHm2tHCcHd)`j3us)182D#&!u0-!id%K>H@f_v_I1 z*12UtSr~v$)&QQoqW)Dqp5EKr`)ZL2GZ1b8Aa}J(nmut~Y$G@6t#ZzsjdDhU_S4YQ zur7ky@<;77oNb&ZSEV$H!V*==ke9zVB+;u4K7qhCvs=JY%EB}Yv33q&x93Dwd!%Jd znV8+n>NFaiHKkpy1&B5mz4SU>q>8bO;=QK@BdA%0?R|3GT#8Q{h;L_0sZ}ej_S~rX z(v!&V!a;+45lF(v@QPk>E6oHgdkK|Bw%_!w&Q|G913I2C1Sw~>%}*(4SUg4XWCbs1 zhMR4A&S0`iY}tvqzMIF=lHmDI{KipxUInlRZi2g>r+hggg=mO65sL2Vo(vd0c&+t^&g>PBDNk& zzG6W)=;FcjrBY0e=ECL8t@+g7#5NHm*ql9-u0qk9TQ!G}HOyJy*~F$ht2#S?3EQ8Wn#obIxNJg(%W@U-9ok(_ zZrb=^q+n4GFICX(<+skVn4ZR$SM>96TsW8&^Nj516lENnfKR1P#BeOpA(l3YhZ`8z zLP<~$nWJ&<3Son2#H(p-IRoWiJ~YTe9inD7-}Zp?r8@@lrX`*sVlAecq~3q8->YS)b0#y(`jw%bmJ#+whtlXK1uCyPR` zLT|Eo{KYvUd_WDiseD-Ta62|OGIp5F{3)5FV+{ATgfH7`QmCL~aL%H{#=*O(j6w#( z%({TlIJZ5@iq^A-I6gx1On>%Ied&j6@f|+H4+>ig7qibO2S!NB-+orH@FJN5lVQw! zt2^n(ox`&j!Pe&9v>bK9BG~=2OjPrmjd`0_fl0u&JH_7!zuRIjkOUQ({iEWXHurd835_oU0n_% ztns3+6c(R>{TfovYI8HiNH?_&Pcdbck(lI=8 zoN)vOkP=0<>wgQ@h$oHG#^=V7!7(_Q7fZS@?X^)Ftc}hA@TYzR`t~g$HrH%^g0~rE zVgslpjk61bzsmHhu`HH4aYw;LF&ug4Evd*_!>+uak5QQbklj~|8#HSYZ>>+omCS_1 z(Gz>4Fl?sW<3mlHSZV#4L1_ZBSPo)6Dpv^NAB?dCHFjgQQsn@PfvB;eMsi6YBjQCM z^V?5KF+7k*F!H5w%+SpXC9W1>uR{VW(?6%4hK{5u8wf4eb~LkPIE+C28up4L8NHqi z!&3@r)>zW=lO8(|EpYKI`Sx0z3i>Qc#;S7WAahf3;+j|_8A1$)VAo}3aPhAc3~9~q zj+&JK85=MJlO?qLElZNS#mMuJq~;~K#rJrS_LN(dI?5w3OGMd*0vZZ{6$ zMTCarZW?^+KJ?j`5k7-8z}?c7KZCIE?eaEdLG0=cy07U}c+Og>kw{$)#=0N>02)nS zh{P*rA#z&7eX|2fc$d?Rbcl4@#MGDyE*4DdbyF?C-?UrCo|0mCt8?40T9hR`M9Mba zL1Db!{*`kFP2yvcJYOF!(15VMh0cP7Jn~4bhgQg3*gB1Ry1uk*W*|%=adXC4u;u_> z{r08uWs=0`4%%X_mI(mqy&((bibu8b$s={yujx*yC1J3+=I^P{a*>7fc^~yPzI0(z z*ws{qI}yu}6&L6x^e2s4>Cge7<8d5pu`-ZRL+t0Zy=$S#VoBP@{Z^|H?eWa9Lf5z| zxdyxP0qaxd#+)?SN5ah8PTM;Cs^#GtTg1%}UvSC<-} zuTG&8IWR!ME=ezQ&$rg3VkZ9p)FDM}uI+AO7QH4v3Xvup1i?J&jKzgHraB= zw7*VFE7tg{+g)+qxlCq_B)i}s3LLm62~xDDHT{cEy=#Xwn?_{0O&O(@ugjzFMi zCPJfk*#@+bEqwfxxA(ffjjbr^HK`X%-s0OmXjy{d2U8kQM#sJI(GmXueLrxgC6F#| zlHOG-6DW8f0G%-^JDcfDVsRGC0q57UrHd*wasw_IxzK*mPLfEyw&h>cDntd8;LkrK z_f>8)AO`jet-Ft*t#uj0Y%@z5rmVS@x(OEm_1c=kLoCkGq-^Y$xLr-UsTi=bF9^?y zFJyj7uiqxt?mE}ga6Tgwk4$ttB+y&pBH*Y4b+k7e^_6KABY_#iH^$LAq2?t>9ww*9 z2M`h?X5y6)o_wHR%AZ4aLUgo5+py9Ysf001!$YVYx>rY3{5~U$Y*I3*EUa#J-k8gz z!0g-MQ?N{@8JB2qQ@m9WF0MDS0&7it33?1LKenT?uu~WU>UAd6%*v)WT}EWFxH~VY z+0jLo1~b4TIz|h*JA&$bs8{xcjgsYFHMPaQB0h9`)!^a84^x}W(2kOHOBxo=|56y!hN`tP>* zouvfI{p~cn!fRpgif~ zfGm3~10LaTLsQR%>(54g;2(rhaDef$k?goySP@| zWzn1fFtT6ZnQ#3@s=x_(Q~|3S)M;2gR#I}bs=#y-52>o?<#^j0U9ID4I-eIcMI0Ee z2s({LPr{$^IHo)2Vf%hmUJSwE(+UvcabiXS_hrftK(#CqKyd|J4D-mNppk3%R&siF zyO^03PdUGBZ)8KO=R%4L;s}yQcCy)vXrq`8Z7H{A5ag4KV7dtrZJ2Jj=jXLrkm8$W z*>sF8uh0FOnTz8mG2x;arI_B_$~pQek7&7(M%HT%jVQ<{@i>6xjjhf$U;Dj2+eS$v)=0pOO}Pfv-Jq=`$|hwDS5vP2L7+VM}dZ;*_5osBC$a3ul%ucqd>mZT{ zoN5?c8b=chZlI7anE6td`%6Eh#Iwc@?1KGvp<^P?EH^q1H^$UuR#xJ}-9lgC7obYc zanVPgPAQxmqiw})J!L?GAYp{-q)IxidQx-^j&;4S81<*D$z@m5U$Q#sc)^}$k&h`s zT@+f{(v)l(KtYJxc=I(Y4;WGj*e7M{)Q?)U=nBMokBO-`WeWk2sWzG9u-|K+O1Zxs zuS#L!5X(Lu;E=$n=L2Z$zlAd*8v=WKzLk@fIk7wYyaw3lV;gUV6q{{x!0ZFt#p1HPX$SDN}Gk zxCh37>LuYgpbLL@Bezw}tI*1j!zjCxWm^(;z0~>Cj3Z%Fg$$XlP7njkElOUEjbb5G zFo14zdDzr=QII>Gi#rl6_^f>D#OyuIhSsSH#iYidy}0rRYY&w?_&Q~RuF9V9*lA-&#PX(!+~igtSL{BOdWW4_GKr`GHuLHAsTfyPjuvCdva59+D()uX zBG&woxOO1i+n4Fie|I;$g3aOUBA$mOqNdR8zZZThf`7A7?v3E4XQJ z=U*C|!!AO*f>b1tvFPOy=}R-{>b({|(8l146&V1(-~-mD&5CR^;0tATZ3)|FUzK_e z5_qI(Y@p^O+xbT7nTm!pjl&X)qeu<5d_uFu{?AZ|o%oD91s5c>$=|l7%P0P$0x3MF za(WJ0^f>G?Mwojj0_(F)PL(=XQE^c=qU?4Z`Bc`K)Muy?60rwlk>ej5Ah}V_M>jnJ zd7?~0vpC8_D7hCm-EPX#yCgPNBSGmwK&v}CsJ*h@+SuNl8q>;zLNc(=h({OZI?=dJ zOdMEtm}79@l_V*9Gj$5iCrPl%2l?sT1AM8hP8vC|zs3({cS=-Z)Rgexc*U?o$?78x!C5Ynj35PkjsK*&8QF2Mx z2Tt1LQ|1=FjMme#i@{Oiv4<5jC<+#9Gw2P6KV@0->%I6^E&_F(%~e93s&p4)Ds z&W#hcYYh$Uy87wkS>SA63748C!0~bByE8H5-oRStlq@$2#w^Hzvm4lu2-rG2>h|08 zeo66W7Rpc^L&U+lK?E98A|p0Yl@I{E0Z02&C~cJ9`C$N)&PBayWR3{?39mqlK(zVq38EB7p8x5vC zI>5b2$HWdXj?mU|+f_pXAUmz-DQs35i(#BDjEVg?aH)Hi~Ii-sU{EOQWgew9JR z*~Z&M2Y4SdN=qn!w2m&Z24mEt=}t;evB*W_i5lN`GJ|g#%KFkgd4GJ$rsOdc_Xnym zA&5~XVnOB_U&64MArxvInn?lG$=l2aMF|3~B*^XrML4pf;tOHsYkyey(TEHzCwIHu z__p^|g+RP+m)Cb#skoMJXBm_S4-$|!5p62411!A%08vL?7F~h^$!(iFsaRt#4CebW zEPq$~)rF5K+4h&pkie)oX}V{B+-o^bz)><{4&h}KWFf2@ZM45NVf2`uf#qFBum@oJ znzbV_VV{h%wUuAisc-~vV3K&`Qe2n!in*I_HvOZ{fchCaBtCQ{YsodGXqg0V7#h0s}^IJ5x5hlg=PW?j7KLJ@~{jD zAX|Cqy~lMkIaiprTV1?0`cmgAcdtaiNT7xTD*202^5`a2+9R^}H_DhX9F74S1qyIr z4$(`eb>QgO0Lg~hYrF;k*7%S7iiXRz$2F?ttY6vtv z>947&NhcMDl!gI;l#BG6U&fziHjDFa-K|GZWmkwFiR3}sdw7a@p9fTYY)K5ajNO$M zG1N}qI#doaQJ4aR>IlE~YfU?1Rw2GIcQ)U!4-;K)cP;I{_M|JbaNh{BfFp)6n?N<$ zeJMxbJ`{{dGsehNYDS{yHKjAFU{%PxjJgs{?oB@&Sbi)AjdFo3dsy2EX!UcF63iAf=VB((mf zu2V-?m&HL4v16HsV6JD(E;+p`E|$ec!$J^&+CcTMqXkp>b?&7StxCa`5xXcIn$(O9 zo)nFR)q_NQepN+@$%iED7V$L}2?~`9YpnM1YB`@4`aD==!GuL6i@nJ`15Y~Z8>3(D z*VDQ7h{rOP{X(*m5}@;o(ifyhkudQ{sPbJEte3eOsnerFS^`CmGBaI~E)MgR*U(ju zW_U76{2uB-VoVd}PEy}MKqFCmYqqDc!)Lf@1(?`2{!*Xy9{Tdlb?N5{mgBIc?8+IO zm2KAw);-3h@S7{(=23DCVS%>WHT$)zG7!W7ZZ0?4>J1q4l)ospyyZ~Q zlZD=iG{f1^!-5ka7dtsjDsDPvj#$pNu*YCP<@?=xFt4?)_<){;g&fhkP-sC zY;C)gMJ&P9YQ!O3#=^B4g3Nys*IK}6D*z=u~h9X?p+ya5JMm@@Ybj-7kK(&h>og4VE37$DUm0V`#=r#w;Q+cl6&cEuZ zF&5)6m+kJVfSxc5=vf87sMgjql=FX-4#Ogk8r*Mat@nqWsB<^G!i#Cfi}xDjOri+x zcMl<1ai?614v{%*x61louAbohV&DvssYOO4S=TahwHF=z!ht2!Nw-Hnl(Cpb*uF7U zltmj^x*EHkcX&KpDV|vbWS|796&#{Acb#c$Qd#(*4(!~-?WN!iC$h%N8Y?=JmiOof zpj`LSrFJr#o08Y?C)Sra;PUoso(pz@`pY?DKs?F^5~9Lx`q(Ds_#5*9%F&5xZc!UK?ln7Q)# zR-6u<#8_N5w#0&esC??AX8drr^X4ipA)6>;_L?)>Wvb=!G=}!q)KS#1HC+;-cCQEG~5lP`AEfydhJ^POu%6QU-?Rh$Kt#FkJJ>ss>W;VXGLG0-= z!qVDjk2NU1&I}@ReF#I!!XwVF)7#(?N_`VRtzY4&? z?!ye>ue@9zI^G>K@P;T5E<|K@r_zOq1vpbEw<`!p>|s~*e+;{p1hM;Icu=tSD=8NH zwl$FKW|?oGbUS&)7B$Nm*e`S8T&_+*F<4jz8@dHXMF_L~_~vbTm|M=QN^UUsJI9?! zMdKyK8|e6p59+6o(6h%Ja`G218u_2FeP|QwD|Hh_#I|W-C+`|wRt3M5`3kWsxTY`+ zG+7GfAc1RXZ7PNb5KcM-l|9imCid3$6+0Iv9Qaq~D`VO8rgG-8-p1%ZSJI{NXQ!Z_ zhw;2L(90S2e9XM4@}i*T?(MC!hAb_V5On4jYj_H33&jag&1-LCr&Uf@JX$fk4kdPN zy`Nti&K+t*w-P?;f#*{AJqAda>;<0Zn_rz*#1P3AU$_T_{c0+bI5|}a4AF$|U@7Oo z*Q0UCIfh8cU>K?B-|1W?>c@UsJ)Oic1XhF;E=7r4z}mh>p&_|2;XDn zPvSy}VjFox&?HbB`A?-Juhio)JP}>FL1H9a+fh+*5U5fz-$HkN)%jI3deA5vyf}&r?1)4FrP^6UQ4$#TBxx!8W>{?G0&B);R14ET|36 z(`R3mTR2QaStgSK3y{oN@ba)znSSd7ZAJ7oHI5iP@<_I0V0L^+eNTNUu8q$M>n<3( zDEGOD$>tizv1zpY;_hLwsWZj5d5Y$oirJYmBjE>sf}jN6XQ zwDU($o42|hC2Npol~X39&JUetU_?j;+m8W8!+@(7OB3Psr}zxER^dDt5+juo=E`ql zU?|h(<1pl3;@7Ig)>%jV?gPAG-&6U88Ppbx^8@5+QizEirNb??{{Zo-3Y@e*iv9+Z zAI8I-qhAH5k*?|1e5ufaxF%RN*yG68LUK9+*JL0xOm{K;rnC>cVbMT_#8`Vk*h6dG zNaDiJB=G`4Y%m7h5>t4G%x5QIZ$nd>dt<=+(J1|T*Je9Z#8F0*;lm9Thj9M@Y7CZn zK^hb2C^%eT#bObxRHVai+D5p&b)R*U78d=wai}!aHJeExR`Oj z;nCHDi9+R5v=M!G_0}ISiP(#Kh87)5@~7O#Dk>7JK)4*$6+am>O^uo3Dk3J!VPT=M zJ`|P+Jg&vV~HbZHUeV{v-MD;F09MH;$EBDU~#Udmklho)wh=52Mk zKcv*j<>K+-iP0hi^#V_&Jv?l9)m0_4+8Ob&cI z#O<Ku#D;?a*d~0hXtm?N? z2?P;v!0SSbm2K7vJgehm#inflHz%kuuRCK>2|}ELD*!);2?oOZyDD}en7ft=7>$dv z*3#5d!a__ikXUA0+Wi$id_fG_Hp_TYku7HrCHO*f_#@Z(X>3b0oGhDJS{Dno;9vE&#k)6S8#H`3EU4>rljFxG6c4nrY830%}*ntB_rD) zRs=3rEP1JW7fbYdQ&@!e@%|+%;wTv`w&qbu9h4vN#=r$BFJgJY)67@XH@rPWQ02pWID{w}%H?o5j>Fz7jKQBxpGrdg zPI*fR!3b=z4LZJ+CV3P8C9OL>z?@QIuSb`i`3HuOXH~gY7l)pT|?=YvG9n$l@g?-9zV3 zIU8Qh8Ww^a*3PRD*89aso*)qEv=R;f01Eu7q?#;1u7P3N2D>V5CVbH_BywZ8Jlum= z;iij4g;6xIy~q-62HRx%(9RmcN|J6K;@dPoDsZ~NG^$jxv$^E$_>}tAvSyDC;`Vf7 zu7r>XJ;YX>4m_JEIRjfzPlaw31i~-(kCkB!qK@@KZ~qg}7Objm8@P0I1gSH(X3B&W?XgcOBHo^DZJ1bp=Ts8f#B05hQxp z0?bcFT2g06#9^{%0=2qDfTFo3Hns1OfbGgYbm+H(#y&R#$2N?zmD6x4ZQw;wH!%_j z)L+1wLxZrs%^c7vHWHx(^IFvE#&S16zhw=2QHf+Wl-ojo(^BzM2=R{K>l`5V-M*D+ z@T}q0ZgV}XqUOThH6ieFG_ubkIx(3;!oX%hb+9%(#8u6SsN!Kx4B^;YGe&b;oLRjq zZpSsw`}qoE8ZU^5Sd6IW$a>HUoaXwFO)pVr6m`UJ0krNkl#j+@q>Z&!!+~ypc}JE@ z@yDkB0HoCECASD5++$nzIW#j5RQkvx#K0GBZ4XEn^q@J+;2lkmfTVao6vk!aNg%q+ zq>Y@b9?KeSp7NU=HS!d>!RVoLMVId*DC^38RHidt6v5&U=VI-OG#y^D^q@4gY{VHayj!L0qbGtKn{V6;;zxak}@WAmn zk+WG%>dWygQ7HtNtS&1O^9~|2l@#(x=d~1IT6>7`tqI+w^`K%Dff>EXIdl|w$*{G@ zEcsFY0O1pYUKQZ}5pj}>c$y{}=@R&abJ!8pu8&osCx04c=c7a_jgImVSI z4J_%xa~5_b@abc-dG)MFhE5p6JE&``skr<#HJ-X&9Ykq^$UlN;@8{hL2>r?R4$T&xYa+?t{x9A@#>H6x_vcm-D4rE?5E^M1k zfYjE?$2wYMS4KCp4ywd*!q}`{Bw*0ugq&N-MXs7?HQT!OqcleOfM5v(E|(iCoGTS( zmpTT@u)`c{5ep(Bt%8xbe@O4DGs&4|zMQ?AHyWNE*w8k6r9b}w zAg;@_1oEWQqerufZu^QO$C7s(%-*z|1aYlxf;JZIr*RGM<+t8%TGN~f_2`P(5RQLJ z9w|T<(%~D*)xn5FgfylO29$*SCk{6eD&S=kM+{!^(_p#RuEMh^SaOz4QUiKI1T758zY{#5b(3#e zbwLRT8;Gg!NXU{OyCa=>vy0Z53ZcR|OmQ&yqkOw|f(W3yg(U7^4R;s~p+Tl+B#xo; zG`oV=17(2Ms;rKyZL%YK>*{J$5%HL503a4J*q*!kRX1x0MY)HGsaRsB0~>>s&hedh z5=X5Z__}i!i1vy2yt!SYSuN5vwJz$=HyFT(l-l;&u7gkSS|N~0HQynhJ&Cs};`;Mi z)YxUo%NJ9%PQod8KEF&c$0STk2DE`g6LD~+{Z$@p5*0jwacxKc0JbetqyGSnu!bk% z@K}Z8C3!w2Hp~qzH~edcftNNCdloHV>##DP^w*O=`R;x_TK@pkHGXU|hmycwm0~v= zpOs0H6I>WxE9(}c;C{M4j&mC3+!)7X&ecZbd7sy(1uw;PHnzBp27(8G}LSHFX3uk zoGhTa<_xU8Lf7=7iBdIb2_;!ih^*ws1>S}f> zvg@W`bm}!U%oiPEf677E?*(>av=d?uB2_J;2$&JtDDwa@65H=LtxkquWn;f1kJV33 zef+V^Ze9 zEDtJ|<0VH~c+!9w2GU3xZfZHDs2(B&fw0J+f~f1aXanbJ*tPcD>w5bdZHbP?Bttn2?3C54#VL?&1^(E=v~in zwQG&gZse&ny198EzS}wSp$dNaLRbc7L;!rUR%8-9~j;Y%y&YDN_e!ki)i7YQHj zG-dRx@F+mzv4DZKNgVg4uVx@@2HpaImKdB<5vLTry3q-{v9{7XtE-?GmSVCKw43-E znJk7r5VmauYkr__=~XeHlylQ>15z<7o_W}95rzFH<|*Jb1{Gf~7~GuEI}Y$^*<>v8 zKK?PsiL7E|LGF=(czxS}xDjtVSI(qn*J~5sb57BbS@<3dT&aoS2{VNOL=h4cZ2tM^ z@L{mHbZFp(5;DM$I!$8dC>wNNN+J)4=xpjdMPYi{aFqB7aLqg6rFB;}Dh`KFt$oYQ zCVje{da8ydMMz&&)sDC7snX(O4Jo)6t1YQygTjPOiN3=3?64Fl-Is)M#R**_TlOEF zP)LSnBz#BClZG`oz7S*o0Ch)lkDYX`u%v*puqRfW*w&+u-FCGRvgVIA&M}(0nX=sE zz0JxC1Jo&WcuCfc)AK_Z!zcl-kdjLicDS+V-Cchj4S~esaD{9^lma=0 zjS*OTAhxzrJXlsIT&;&~bd`MVTSX!V0e%uk>S`3@99~3G%+~U$MQsKr{{Y=SHm^f8 zU;u5g{#7&C)v)-41C^ddQQW{)%}qkbKN_K}?&G-aKOktvJ6H|gg5H($M$FZ6qz`tRgw^*B71V-N=Vk26v*@@l!Z8JUk^W9d}`W#Y4j8#bxwsnFoD2&|?V zHodgx2Hthi)C?q?b5A=CTe6GuE~n5_GcXHl?mko;4g(gB@w5^K%B^c|x!2B*HUkz^ z#xU~cv9Qa#N?#M`a7Sbdy2I9$;RPilHq^5y@TzMTRMcv0JSk^e&m5$wNSeWIv=gg$ zp5QB-7A7JAQ}$gGPJp7Uq((z1({IX>#4bU07ykefJF^O@5|4YK+v+Il{9O9?ijh1F zbE{fFnTfrMgMO`*B77n;k`xjxsN4QnwNYarj(#j9`1x;@iPpzu$2BBOxt8KQxyRZz z_|u}iIePTu(5`6!%5RtpZq)pZN_fKI+UhK@xzOqMY5dr$T!jsBe5CWe_fQ;2B9H}- zNE*WS-a0Eu@G1nuGDWE%4BFFC;hsTd8yKBBsVqi0_&XVaC}KEi7mJZfU9ZpOM0qii z1I1$uAdj-Q(zp7_l!hE13CuA#$YKqLOsyjUyo*pHkmC4OIWRHFjEW_7XN5~BV!CVD zUBPfh5Y}wXhCKGJa@L4k8+yA1`7F2tS#Iv=|!Aft@sa# z0*Mr1iC%KR_mf0|#d1;gwe|2d9~esGovoro4|UI_Tg8CUHMzyRs!Z@1WW?;y1;6tB zYT$HI94W&@g^k(ad))7^K8BkllOa2J$MZBCMkhS;VaixS+=I_;7bzQ7%s{zPMTb6u zkPUe8R@7!D{gn0|DE*wPMvO`TE;R=+)O6@-Zjr7jMwaW;+#CVjX45LLEFedZqr>2zoN3mZ7~S5Ej*5Z7*c2Um%dC(IRSMgH+bc>I#syK zI7K%i%GVaQn)Ood3Ca(MB!rIj({c%QT}cXT4w_z=cp5x9y}?&q2sggkv_n!jxHfIIO@&pXkx9{{ zaBa+9-bSA{DIYLuk_iz^e(SpnZP4G))5z5vbfKU?cSthdc8AiFo_hkr?usTY#Epjl z+;W)TZp(Vo(k69gYw9ohZ&oD+4Mr665#?0oxn7LF>Pl3^0KzES$Uml^Xzy$Df%=Ea zy48?;PyI0<>}5V8j|c&zL9e`T+|)TjyfUC8Fk6r}QShn`A)}6-RBPiE@g-6Alv(AHQj5p~&N?3`i$i%S3z8#k|cz1FJ%PG(f z@;j;KW1N|Ei861t_R{nObvlE|Yj7N3FDlo<&tnl1(c?xnd za%nyhh|7%N{4_=L$!8=X$`lTM`Z2}9h8C7gnp>18`wPl$Gy{YsZ9jkqiKG7jouC5A zYF`5^c>HAN4I<0#)Ev9E)8+bG6L2%b zkjM~?3AKozG8UNIX(w7|1v10NJ-}Ft9e3Yfoo>mjMpK1A7_cTH8=q#iRSkr^{XJr! z@z=w`4$H@&8}E9qCAgPOr%t=j)c9F`hK3b^?4SmhIUC7fZ+`lfHYHI_h*NRbwln8N znqPI2#n@!ZN&F_F%D0a8*r4B{(O>)MuO>3|>Z?sMtH?kC*FD7i%}aT2hGBJ3VR5GI zpE}gp(pfA3&Zz*nFwx1*sUd;~Ni{0tQk$g*_dG#kW;SKjAYf z7F=D-QZi{4+@r6exV!}-H~m7`wp-*p>N)=a7lmp608HP|{uMoJano!5NIoWwdra5b zQkY%_opB8@kxLX2l?$_0*KbFSeApQ|Qmm<@EI`X}Y)4HSsJyQ*vX5zk&8bu6O)exy zort}Vj}`gU)hb^JAoz$k?xto^(YONqpH#0!jHNp?>|`Jv0t5QRIfszvHrz<_sjQ?< zLXm?6ibovbr+exFIuG1?sJT^M%3O<+%529_PTE#h26iPSR2_h>p!g9^@+51k zW?PYcnt`nXbHl!p zhehnS>UxWXz-?;qgB}M-L7M9fJ{k5c_Va6AQH)^zeD`!}(v`9v} zbJxZ{atGzCtX2v)Ea1`nAu}=Is0l|@P-Flk9fbN ze5mrKY4F5uaD3?1jNlo)k5X<;_3I{=z)n*ijFdu>hQ$y=F#rIdUrxHAg@Y^+t+g3P zg(bnU=8F?A-o(m(RlO^}w|`HfM`GofNNE`Idi19r7HF=cX6=*=JVXFL5x;#kBUyPT zLTX#}VpBO_r0va8NxT@IxqRxVQppkLYMlfnmB!4{u>E4S%R2ed)O3hdG-2@ghPVF!Fvq#Rm1T)vLgSA* zSwgOdwzgvyV+tw3~Zax!wT}~HmUkUu5wx}m5&~GGq{HjvPnXso_EI&<9 zNeW7&-oW3vSl3wTUBbv(TzgwWIXxf}JjGJNGOW#;T}8Y8l{*Uw4GJyGOCJ|*bD{au zQJk|#FR_oE{b*>TxTHB`7uZ0!>NPHCjGQ5Rf0m^G09Cze+|i7(+Q*hQbsC-{2O1Cm z0BJ|-A1dtEY9wI;s4qHg+V7!#M2FS?SPXGFG{SQ;Wo0Yo~Mk+$_#Tt1gh4&eMp z3P@nYVlaX@R!q<^_=!Fi6!ss6_)mlJtA#Ts2rH|yyyDIPTiWAo`gy55Ja*wDkos8#I&akc%}IGfVP7*Xj1mn7o4#~;Rn}QD*m9cWetMlK z%Y!PVlzTj*pc{QFOu*H7c!&Kj_x5Uqvl5?qSbm?SFU47~olE;_j4^>C8)WIcW@wGW5nSz_`Yt)8faQK0L`skgj zDOcL~J%G2pBfVSYPMF4I&L%yFR*@{{O$+q`9>Evx)TLK3;Un-x0H^a^U0KWeKxYG$BIy<*Jo(Ue!xvm{{TR|MFb+S<}VacovLB>-jTEtCF%tYK#uFJE*|+u!({9S7 zkfBDpD6qYa>0fGGOfi+$EKcNe9JU^GM%f|!Zaaw-sKUw!I88Sb`f1lTM>qQi$0+rs z5;x=Uz}qNOVcAW{q{jB!m;Fmtq%zq|;4sXJmn+T-0DKRP5;Oov5GsJ|0KR}+((-a< zesd80;+l;?5(c@uG5ypj!+;`}&ejaaGYxHF(brR^#KSR@5etTivc($!c~{zP{N5B< zT;-60LuSkf(_OxmBNN6)jGj(YY9|1j@450d*^bpWi$qL9DhmM<4-sEHnWlEn@<5B{lno$ItABaj>;S`mXZxD0=K0Y zRh$&V{%rbKdn$qbMvaSL+#v?*B&YOJ$c1=SwEqC*hR@7vSf)PN3juyZ{@U(+cYY=# z*j)2^QxV)vGVkQKeJ1AVpxC~YXqlfGE3r3ZTlIoRrD_q$$TG#S6vP4#H!7(DRN{H> z>rrNVHf^9!>MFi$%Qrpm*QleV%k)^|i-?4|8QCHhCzw=>OXfm!&=3dmugwvndFnTdcTPFmW>py%Wo%N3@hPK%mdm$|XO z;#2EV<%=v4u8dtJB&%3#J~cs+Cz@6*l~vqbcKk{`D zek>z>o=5GfHwsqV=i}ajr#yUseX0qvF4Q8LB&2UQ*5%W`fp6( za|xd>IKOzHVj9?IJ1?agHY+=^+~;Rm`BrzsiQw5`H?>ZOl?=)Eo=`hYyv&}FpHh}TJK^>7wxSeQ`{jxE(k%mT+DiGq*gQC*zUcDbta7~q-Jwxyo09N zeQAr8&TqZGUX^&APzRA0F+bmxN>I%l%WT=5*2AT(>s6y5M*tl6sqruoO7^~4ByPJk z{VHW>xTXkjDD65}4t;5NkjFM@ zBaI}?cJBkGoQZg#j%-~;)SYdzgD$wB)&!MpJF7T#$!AGl3fJ2-ZPW-qI%^q= znhY?NaCny*wr(ipUXw|=3XwKZ{{U3B(`AjlDXeB9NkbtgF1lA&MKqG)<7LfAz(`L7 zLQmZ%#M6RYs0k8CNvC0YB*^iBKEJEUVwio1ptWVx1 z=fGFYwg%dZ5;`iPq?|DvZN*{ITtnMpEykTS!kGE-PBD?i07g^At;-z^wb^a7>qtfp zL_nyy3Cg11XX#jXZ*O9Ei2nf9SxV9NIAS7sZi-Z!f<^qkRVh8SV=@SXixP61+e5T% ztGJ1k%B!2L>OLiuahq*z7;WEIHQI~PLco9pk0;WTz{hckTVF0A!SAl%I2Ro@9VFpC z6E}NWBx_rm_8QPQJ_uuMYLFI4u?0yC#I}oLsozE|Gb+slk?V)zOk^^UOP1V0-9Tq8 z87J{j@v@hQNQ`cW{l}eh3(JL4FMDhK_SNUa>5NLLS!^xJ1Hja_fIdFw{?ZZsV0zVw z2z8hNYdGpU8bOna#g=jK#4pqspY+wucA`8GWs!!?LuvfOSPd9?8c4OeS2Z;gcs(9z5np6hhi3A^{sNnkEg|jl z6xe_aL^%bA7++21#?&WEz0UC7RKJ%~jj_2)6R_6cU>X8>o6>hb5Y*;h}qvW);x z^E+4oLhIUnXi7zwHq4+`XMkc>M7s=ty@vMKJdJG4&Jl|$%0}l_^7&O1Lza6DN}n-P zWs#-e_Gbhziz&X_f=8uT!+=s!-*eLblr`e#(@66OArQ&M$&p5Lsn+F>U4?CBW{x{p zuvKHG{#$F|T0CNg3INJ2*JT2?W3u2_<>}(TUS=&3`rY_@oEOt z=(%HSSd<;Q3WW+3!baBsat-gZlsj3EI&WADCfz%0WdBvvIY(YdMK5N!rH! zR-v3J!K87UHnJP`50z-_ECJ;fw|%Oj?5r7q>0e3&Dg$Uf#rxQr`#H-Vyw~tPm8cF@ zaCZe?3;Nbg0xDUCYiJ7h6H2mM82SqkzO=^~%VGG>r6|&WjsB71X~C+@ZUxSnc6U}l z4LB#JzRh^~$OF>4hu#CwXcIWd^5Nh*Tw)OZudO*O0f`&QBf^)*AMo*C{`!95REARa zKX}o%;>h{<7aVZJE)q=KSsPbr8gHTDf8pGEU?PO!Trx%!i>`zYy7l4gt#S56aV5BG z+OhutuA6_(JVRkI7)7+$cTtoLfa~91OKX10zLIGD;M46N zO4@6zu6T_spTRupJk3ks`G8n~)0D~Q@~RBHm_XVMyiG)ikim7*ecfiZ%=pV*o{ zPfeJKSEpX;kBo@>RJl(nqYO0rLjM5xidl)OdmK--MoqPi!0fTCXUy!}<&9!YO5#o# zloG}^W6^L2nHBRBn%l+i-AF);pK47AxNSOgG~mo+QTUYj(#KqMcGy*ql{+4iAl;Z( zS3%s6@$=lD(rAJLv65FgBjEkva*dz#Epxt3uZLPwBBpdFfWk7cdjQhZuh3p1H;jI0S}Ufo4@ zbz>#3rp-F5FhogEu`F*3U71HV+xH7oIE6%*fpe|LR=+xbqFPiuSmq41m>-Ks^8()b z-gMl`f-+sz6j+vRf`P>l%np{A5mC+%2Mb|j5;JE>7Q_LRXlj$;* zkmj-XZRhi?SvQCbkW7c-T=&Bk{Db1nU9w+K$Gm~p0FPR({}x~5Gk zHYOy^v5oEd6jR9PRB1Sfk~tbC2%|FUMefJEXK^ z;w=k-y-4rV*0r^qYY6%0!m|sU*}Ig{<6QVaFSQS?bs<<}g4+QqKcvwxsqRuU&6mZ6 z3ra$a*GLY(2)}(v!Oz7A?sO8B+0UA*Ft~v_Y%SJmEGWiOEpLD7Y3IS$rzd;O5atB< zfk5Lfx@;>&c*|oU1c0oJ3FfxGf`FqcYBmi!sUprG@*=tWBgj-mj4lBru{K3w0o|BY zsTdIs@sta9)b0&79!J|GuDmn3W>*pe7g|D?UZTrLl;0_t zEM4wN=o)#~#NAr|0CtiqoI4oTI12f6u+ZFnXhB^a!vdt(i|^!t<_$S17emaeKtft! znBLJY-g}zHR-8}B!dB+YP5WtfR%~Ns8i2Ozr-;0*`Hd_&IO!W`3a7gFtsqr6M2`_I zlxtyNZ)?{X85;J}DXxdh6~Wn;(v1#zWncKJ3-Z~Z=oWM@n^3}&TQI&$R3sSMC)_5^s$iU zu-=E#i5ohWuvRxV1lxZwcFqsU6RTMuEbZJo6y7=e~T1&ZPbw>K)R%r%5-aKq1ovy7g-l-%t1B!Tdq zokEsrO2WkM9)gtWQ<1!qVOui`XCwi%Yg6#c{{X3QivBcl+Mi0P1ZRn1(|;OD2<^hW zB1ro&{?k%lR?irLB`=IZ?UYTO0I<~CTl3TH4Z%5^Hqysw&~2b$*4Ug-=LqAznv+8( zU!`?)0(h(@7W-f6H7()42&wzAp+DDZv5Ft{1ne#8NMZns5iG1lmktkCysMg;gfJL3 zf@R|XyGpU3{2=Bh!iyr_Mj&o)Ax@&KxR?#VyI6MV>r2X+8(q0iiqh|B@SMS)6$1px zcg7=NdRolGxcv4Zq7d^fpZacn}%qWR*ScsW#oN=lxdxN*Q z_!>8sEbOCT_)~+ivq-BUSJP2-G97@8$9G*Vi<2slSQcFX9M{vro8bHo76p|1GBkvf zb%+9>+fIRTeblZd6;f3WV0F`fSA|*5y7=2kU>Q!r4f(4oOEcZBOD~;p3&KAr^sE9_ zMqBM7-IaKQV%pfO0NO;??6V4SwXyt1Z6S>R0I9<@woaq>eCerP>CXT&Qk-n7)?5~7ScAW>(?MaJG! z8l8+rl4ypu%YRy_kHjpAhtv^u*{-8nn=GjKn3r7`>>q_iJoGe|iDAWIg|zo{ zZYB^u$y^uMi5hygAjHn}kuzdtIf z;sFg1Hu#0SDoWU{7 z1w=hzO(-NWPl&a{GK+MZQx!?0WWu$BF(XYc{p_q^8;OfE6P?Zb=zJG~n*|$tOxfN` zUt8NwdTWc+5H1DH5AdAEq!Km?ERmL%5CJZL*=*PC>85et@b(&LnfN;yCK^=xD}1ld zeQ6A4n9dItvEv_3oTi?Momc|k7h)G(y!9_u_r8c*PLrq3 zg&_j_7RqhaVMR%Rm4dJYld0LLHRk+mF~vrY#VG;6X0Y3|RGfY;@`JwnD0tYoO9Jum zj97?ekSIx^31H^dB~GMuQ1LkUXORhw)Unq!v^2Ay(Yi&NVIhdvUpC&W3Xd5lG7>Vh z&2o9OT=`XJh>kADLf8FO7{twon2YU`UYpz2y?OEH(}NQxB1UNz!u(`feVv}7w<~+X zM$Kz@*aRXZ0>UBzJonPxR0U%4f_IUnAzPm@fEee^D#IV|9P(P^ASmwUEn;mN`4d)|Egj@I4Z*5H^a$C0@vgOaEDDb{1v2oa& z!x{^8y~R13j4Tw~=RS3~Fh>&ds4`_X3?mm}7jU;pJ=N0j-0D;rgW(L3x-MV|J1z*g z6}iPk9avW&O}iJc@oh}dK;s+)X12EN8OEVhjW4rlrKO3J5Cn3%u?z{gD#M!Hw9bmQU8QzVwPL}u4B^T8Z(END%cC9x}&$5q?RUU zU^FVm*XGQl(z%YtN^^x>9r9{FD6D%!MjBO7eOsV%+vQ$qJ~y}Mc#@$Z&;y>}9@9%H zB1d8@woQ=9U53%Y3g7HB}Y}v1`+}Tq<;^?Om z{6-x^3xZa}Z`o5Oj@bBFL9lrN*J;aD=3~V}nMd)71E`uxOglSf2O|j?mw(v;w9N|< zr@#11fTruGeKw6}Q_RWxsXh^vc-%2Sa+0?sY&O(Uq5~5=cy%^sBE;^q3!ggH_|7TC z!Ra0a!kW#I}eo{_*xSZGR+XT+9rnL z%sP*yYFtEkiCD*fa`q>j5pOYBn@LYm6;W_lB6WPLki;zNK(Jw_@{0JIMhD@p!rt;> z%=Y~vvW)ZqAko>91;|C6`iX=Q>0^?=a18(zE@k^V8xH*3lw_TI#PRbo{$(6|E zf>)nf>-e+vYY_Hi8;BzPlq8ggWbRGUa7U5qeV>9I=};YzAU>RGzx{|JiZibIau^0HJC$Rr(rI!i4N=KdyM=_t z=JZyJZ57rr{fe^D)?1=by}h=uw3YYzK9BbOy??%YsE@}p^L(HCd*9b}-Piq{>X~}N z&{@O%n#)j7U@#Q$FJtNth6h7cSy@F{Sye?vMO9UGhMJa|8k4CuYvxRKE!Hdp1J*2k zeZ$WzO%07KjP>=+J~y+lV$YpB*TB?f{=7MMmUHILAzz|^kE$`%bk)>!=NRc5&G~=- zGj)TZ%T#12GL#go7>c?IO1cVDzcCE4RI=Fr{YOEOp@LsH>M#@)lob@Qbd~8l6cimC zSH|dCde1tL-D$NUq*BQ#w!Y6j^jLnuh@J$WF(Tjff4)tDp{P6qzcJUPfAw#_S8!0& zT{+9rJEU*w0Yg&>cj_wXGL|!j8sGF6`hK1EtYvla@osji(7kqwVcnMF@sktZ#5b*# z{dA;s%cH-wn?9T^@9B7v$Yv%5_rCZbJyG-VsNbu=1UILzw))%6Y3|Pd?(EKhGcqFq zFMPvG&3m|T`;KK)mqiIrw|YyrdP!WRz%Df^B(zH>VO^0a>;VNW}QDj-0n2a{it+&_7r3MZ*Swh#Y3roJU1>dxTMds_n&vK-bAy#gwy2X z+PKK!N2B8-tbcKI+(P@WwI6mHpPbzP_Ew@}N#efReJ^|3mu|~_H*U92 z7IEmoWnXvaOB!u;(GIyWg+@*}Cf+YK4hOcjs_*VuF=z-sF$845Uruohw)N3u^v){PTK? zV-`=->dnPRC-PoC*6c*YZz80ulTpH`c*mjp3|lJn^j_TQ&`}>=@MA}KtQHjzvK`40 z%$~RUM#GJHDUFM;8f>H*PdC+NRb+F<&B!wI9iNZ9O3m%@+H02G^*8IW$as(;YrpXO zqUn2QDhj2xB`Sg$8}A{X3zvjwhzhNXoYb<^-|Zr=Zl4%B8MwIh%`bWBL99-GmAPT$ zJGRr~5f{7D=VNQ+E*h8j=oHojvV&S{e@!GwXLT64zmBJK=EUiBWxr}}`|(^&0?CUz z1K5YT9CMyr8j2trl=1UdVvB2hj3v%0&Ofd@7)G+aGO|Dv+Udbr>FIA2*LIL9&~zq= z=L)+X6(1_my&bMZ7NEGiSQ$B_K=6^MJJ%oS*Q@1Br@&@2%Ny?9`Nk5K;Fh9Ya&C4C z-Y=raZNjh7c87Ve^UXW#s5{Aj-J11t@UfuOfcI6SF1A19_g~Vum~?j$=ex$wIz!L5 z6--Koj`w**J1L87&l?L2@dczlxBAbEVE#+mUewr`d~v zf55BteIEnj>zcm*d}NBTz%@AJ_58Tx)@F^2b@;UTxnM8czeXrs;*jH=kQ$j%`Nol1 zo|5q6m*pY2KmLPX#oDBLBdO$*RBHIFl8M%DsnfD$GeQSeDmc|GBcc;75NU-V$ml4G+ z`fg89O2$-hoXcb+oshV!SBlqTYk1^MQB2-Q`VV*1%ku+@tex$(mM-f16sLEf+{-S>zlh*(5PZ}NzpCQZ|N?pYw5xR37*_%msu~5+nwwTaC^mD zzQEPvq)wHqN4B)XnoCeT3hC8lzTriKTcYT$argrMvv{(=6;$bDl)B%`^~tq}&L|D8 z+}M8-Sk;C+@uKk?spaM(k+Id~3hh+2HkxN1ykF^%oMiVT#c=d|qUepsd#|00GMix!gjBW1ZoPK;*>3Ie+mzXAUar<4Ld7Qc0Lsma1i zBVwp&t5o5B!3v6W4ANV%2oYGQ~yo+O|7{l6U zmz_6W+fZBkz1?pgzkQ)M_T&(KwFrM{`L$SVxVGWx;5Sb%EZDX;|NhHH-RV_k0A%X3 z=A&T13qWDA*+3Fi7yBIGcth(j>zvg-t=5k@;}#)Oo;8<~K;^YgM&%uX!oD|}eg~7a zcqHEfw<>XXB3oH|KDGMQvAW1PK6YLzl^;R!X!vF&+h=AyDPqQk`ygS-o-`Fy;Vw0v zjxg@I$d)SbEljGIo!y$0iX2u7D4Mx*H7B@)+g(u8!YpF;aD)OX8QB*OF#j;Ktmo;b z&FfY1@dKV3WN$*kS%SvWmI;@0Q0l%-C~Gu1*%A5hs+ow-pV+Z# zw7hZ?usSnquyvzsT^7r$8i?F8Of3q5ZEcVfb|ZyL*2FgUQ6c((GuUYUK zxI$@|qMRzv%rpfP(RuwFvEuV4^U9Eg*)NkVO+*7g3e!ACxg7x}caZ5CVRC!Xbm>C` zU>`}1e>+;R5bI8^sW(x|x`B))7|X=AULRA% z%DqoJ%4w#91VYdo5Uu^9*avnQaU_g}!L#wF>7-_8$dgvrWfmGa*#a75-F2u$GfNSu z%-SZYy;IvrNf{D30E6a$zzYZ!B96y<6cWVqQN?QT8Ky^}U{;?nsa+`J$xYu-f`T2@ zrBCwKYlUr|?S*KRcOhXQY{B=Aa)%r*s=l+Huy3a%WGt&|y#M#o;EHdG_m2)T*&4)-jK^~rgjE6P&|G+CCRZk2cRml8EYR0bT?cM<94v19 z!u@4g(%sJpz%vsA52r`jo&A-yG%aIt)L5ctn>Y5^q8_B?!3p22x1%BENp?>&IW6Ue zt2&ckBpS7sJlY%i&S}nMplGOJ%q=Q1qq57CpSN-@%dc~f`nwMqyaGRp(w1;UCvkDw()t5LR)~-SB4Jh@7N1Uv(i?#w5}0uGqe()q6LnpDB13UtMb;& zG!>4E(rZOIlF>41IC<%pdiwYL+?Jg-ca8gNh_CEsEMRn&HAVl{(0!M=Yn)l!7i?fS zI>lf&PEIkP>+io+4p}Ro7WT)sr#+owoE!KexP!AQNBKpy`|0?FuAVWy+HRNML>H-BxF<2?v zVMWX(rg^4Nw}<{P+uK~9AC`n0fs!i5I(i&SHaBuurz8im!x!G=R%=$XtT zpm^1l2s|(}>0}7D*1uKBJoubmzGL85?G*i77}v=tSwmuu@?IUyPl1>f=_IPZEB5Yt zbIx=pU2Xb!YqUJrP@0Svdu38;mPiZlD!S)JTMiCbT`<6X9qwgHP{{vs#tK}KA6?8g zv3^G>fTPP;BmK{V`aA0UKCXR;ZqQHU7`$+0M_ur{pyx-A{8nced}{aM^RW+1zBql~ zRkq2ZtFB>+Axz2sVE4*T!3pytnN}y$h0AywqGFQblcFb;JY(ioRp0+okCK!X z4fY6AqTMA|b&shS?N+ga?{|e86x04a1`N`WMg|tSPb~5Ac z>1dG^RVD}`vH?Nd&5-91Q3ayw8CF}#IVBLQ2*jkC;Z+p}yB;?j0o@-+vv#Jt#A$a* z0Y=MayHtR@K5stxqA%6Q9dh=lKO;byJ-q~J#!)AgPoc;}2zPy03PDVX4fIw(#V`m) zRX-|--LTL659SpTaVjFLKbe@ z3}Sv@f=&h%?78EuwSmWI{wwdpK#^v_g362Jwbq&VO7)aO=(dt1N=hX_7TY$>L6ojv zy@uJCb@R>i#^p0NUY?8m8g6KBN|XH9a~ zgUfzG$%Joe3TH(L2;YZ_sz+AF5t7eAH|+kR0toq6x;inyJMLiw=%@a`O27}K2qlz5 zHkPPUO?XsiKwRf>*2pETRX^xfEOBb9GQ$HlQWlvdkxr9oR8A4MFANX%7% z4df~Ug(;&hz~tCo2vD+axLv?4*q-0s5v+S9r9?v$oLx9h!1o)^#50yrAe@oJIrby%o}~B zTlw8M^77%CTM95ZINYWJiN+IHt)LHm;_!u5r}tM*Cu&7FKjiMcwuBcS6#J;wOgC6_ zuML0rm7m3ZK@1cEZ*~#QCYjq*ASYNB!Bi2FCU7B0WH%v>>pew^ zXptxviqF@+nVEH5d5SUF^0eXOxuW*I_b=b?%lhENIb+#4nL7asyzlMz#BtsA(a16^ z-kWpPRgZFT=q4@-9pr_+BO3+_%r$<1!`5zt|V?L-Af+=4w(Nvcc2S6O}?NGIh5<+e`QKf5s0{mOY~vI|#Npl; zQ1KykNc>!A15;A(^WzDcR_$XYOWK^kpVGUQui>+axz2qw!x<+v*w|3c~{` zVadGPixU$eQ}+F(l=bp6g111)N@T0$(C<4N2X3BF!j?j|7938W@Y}?%#bo67y`?>$ z`*rA?nYZ}e?e5(snLn@X-mUU;2L~>M#QBoerkVpk?g-odux*4O(3QT-th-Z;=*a6S zF?S2{%1%6k5`QLc{w4*+KvN;V4HiS-#txnT2xpLp!$~QC3P?AycFxEe%%f4&o(ed) zarV4g)NWIu5ahB(C~K%3*v6|I@I%f8EZF6>^IbAOEi?PICaL{-^m;){WWPYpt6zMvi4_{FFzaPYp{W`=zRZH<60a1F~#WS zsFwsp5eJ3J6~3}Yri#+mu>^CyEq^w?K9!Ja?cCz2H)Eu1$sUg1toE2*o~HQB?c?!V z7u{a+iUu{`P0(?yV=}g|J%5x15#Fi)-mYA1lJ@AhQA_fBo#OU1YBnMXx~Bf5EkU5I z83)VNF?nZ|#Z$@0YffLy&&=k*qT{#KVCMD7#J)7sLI%h_3wym|x`#I?`%>-v?G*1( zpP}v0w>uM9{GHL^f(i;q3oSA4U~{-SvnbIF-awZQx;j* z_xa0u-6=+wMtSD4B7T}(|Iv$kZIW)^YhQnM31!4Cg5D2Y0#DrgqGU#PtEiQt2c$9) zuy%7fP%6FG&Q2J0i_6RtEYiaEt@&G@OdRkxvw3H;De)W@pl5CFMW{(Tj7%w*u(!-ZR(h}e^9TQ=iCP$q1Q-G8n4%3+ z-7h2&S_W}u_WC*Cq90*ON#$Y_Ql=<2o8!n9l2DWTe-fjhIaO{u^gPa~zc}ZasX6Q} zWAAD5`A@E3Gm&MOvgtzbMhOo-6eQj1fn5XK8q1)LahFTA(oP z9Fm5gw843_4|^ptAoRZ57_dy6d@@EVC-quVUEKWT^_ZtiumABE(THjtBWv6o{_Er8 zniHbC#F}-~=oq=hTM`q<@!NZSNcOfb;2P_AoU#f=4ys4p$_$sT=?{28+ubl!(ULTF zmif)p7yS^igbTL|_zr6Ysvi2|?WYFw4>N5cs0A9yf_P%&Md$l_x*Z3yzIK{%!4PrD0s)%`Xat^{Q-d!O~PUE=>$>=Bnl2EHHZblrZRT1jYLQA*7TIn z6(8HD9G{XrpE%cQIY}Mi8K2rVlFHhm`Qk6tu`R~ANL@BY^^G&R&D5B8O@O%9A zc&@UMsf_j}N>{r(gTjadDmh5tvY}^qruTW0N`I2U?*>$gTO#{zIm@p29`J(A@o4;b z@@!9B$6HM!)C&4HSLKaW9LYXzz<+UyxqMiLgIvACOqHJqyD7no>F z!kPtIw8Adr?edJ|4`!-kCYkq%juFe!)n$zwo}ye71`H&o2yy`fBQd&nqU0Nz^2y$M zaJbGZV#%)eTn4&SMivuv>E%w#nNG|BE&*^DAJ%=78u-~067hZN5IGaozMbKJYtNci zq~`DwC#nbg#`ZP`EfCa|_td^fj5q`@oiK^%XW+o{Q&s9E1iGm~577qw9XCz18Y(L& zGA7L^WE?!iFgyb&M^MF`ucWmyoz~=dCSZ2#UEBtliK^hOf&fzqDrV4d*F&i(5%n7W zpQh^;t>e9C-ERGX&>}%@kHd8F=ILgboa`k31BmGaHLurTUl^Y!GVM39c0@=EmRkKX zV*hqS2+?bndv=8TC>|lsmT%VI*mVN&%>rTv5@Q#>XZlSWi6~);5z$72UC-szL+sEl z^CQe6X0&+njOr)L9`0MA?;7EL->KD8sQSE%M z)_>mxme~fL>KAJwh`Ix#Sz;q*jewbn*ILSq-^n90u zI|OA(Mm5=+j5=C7+KZmtRG5}1`0R;#&MBW}%$Yz8K>N?(5LkjuC2TzfH_TJfFJHWPY%e?G2E6-wA?(!*n1hq{%`kl;>!ysR1Ix@!xN+6ynbxOD&@zhg(Z%0~zfkgVGh3iK$ z`(I4`VEy%*x-TX_x{tj_#EJQ3Z@CEFi`Tz(-K)!JJ5>(zEK{vLq;?28s(VM zt~dK%B=v3cD4_*=gBq3W;Oss`5)J1`@bW)Z%FsM+B@HCp?qU+juRaptT-I+iXw=$6 z11n`o5o@GXos1QTeu2b7;>l*rUSdvH4Arx`L(v@E`$$t>P3lOTnMI?a){1pmls)h1 zg&EE)nMvl%vip2NwW9&F#B5XkN6`g=v_2!|Ww%B=cBm>~;{7eA6@5bYYWv=eKs~R)}HmQ;?tq zcTqb=X6f*Y;*EsV@7%i!#mZuTn}ip&WV9y$t5MitVvJp({EzF$^IUb z0q(O3BxGto)#v5*{B(R`U#^*z+&eQy3V)JJYpCtO5P>t$OdU&tSVQoM=CW3Bpn(9c zOqY$YhUc(-JFtErPWo_O~>+w;V1y2ReOe4#F!DnIjlG#Dk*qgG#h_KuW5pRe<_ z|BTp3g^r!i++?O5B4fKc_@QB-@7-Us{q##kCe7? zrq7PRx^3oAvFzLw1|Jq>p}%eMw2cID3JW+KLs}3kH50tRyg2L5@{Y@rDmn|^_p3g-Z}4NJO)uq2;Dwlhg}DD zY%a&6{@Ba?#LgtswkqBR?~LG;w+!<-bS5XGp-l|QFD_Z3OJFP4Yqb3b=G6ss)>DAN zY(%>4qPCmWgYSb+9w~-t4>%&Z$EEDHUyOaw4x^B1FC7NluNlYr=N*w1QK5AznGzkS z0%BvXnCIH4N7H|I-4Ue$CtQ2WArHii8yWBK@q*k&_u44_r40Z#%zQ+)DUQ>|I|&pK zQ5^ZH57R~yeN;*)C9_>RGpGG~b5A58P82z8Z?s7JdF+dr31ZXsp@7xCI6eD$@E3mv zJwK9rI7zG2?jhI39%q*pl_luBuO4RQR)vs(mUdjs;S>PjG`AC-;eg4Ba9TV1dz_mM zUXMk2_qmO1b87F8ptsJW?s||SqKc(AM+ngDBVDkg+n9_)yqc9`m-3WbzOVDyMO(?W0#AgqnvyTUf_ z@x8d`_uGSXe7!OQRrSf%nkBIGPfPCI+M{v&zQF9l5eC&CpwBT2v$Be0T7b zO~+oy1|D90JVHr1%-iYH6)GmGt$=6^%7)E1kLJdQ%C)U16-|T)s&$QUf>(K2@z-f6 zvUXmz_7!?3J!9ffrhs3Nh^Wk1@hQqs!{MJ7Z5cR-P^2amPfvX#i+y2;WUptFctTOU zC2wHwZ&3my)h{8QgVG72;NbLG9fQ$^svgYGO{purMX%08L?%vi!A!Be)x&`$wt5*i*DKFvDGXS|zK zum6>pQBb;t{8CIMp(w1KIND^u2G^cAcVzZSyy~Ep^jj`EF6&*%3&zW;uEkK=V5%*^vV_kG>hbzbLrUbEW2I)akk?X=4Y zg+`-LX!sAcI*8hd5)u#)6c7*+6ciK^5)u}b6crT_5tWsYSR*MftDqn+yLPRj$~sj= zB@N}ZYt{7BG_|P_=Uiw+wVqqdabRPUOxlxT>F22-v4|s@>`kz>ni{I+X0j~ z77cfUl|k8|78SNl7^5t3%RwL3wn%ae#)@4jvsn0Z3o2)jamG2B8h=I{ z>*#;u*rR-%^4NtezT>~Y2b{LOCfn0%G-Mi;NoII&KF;%8*0hO&S=rfMMGyA&^N+7e zSw-NelQ)8;PB`RjM)8j5=Ko4t_x1VawDbp_n>_Shr}I`(7uRHLRVk)F&6F&%GK9_9Y7*{(`IE@>e zE3t#uPy3Fn9EnxH{>~SBIw>u;5?5Bmyz`rbqaNp)Rc=t@6L@skp?kgyRF*O}LD3`A zqD*3P%WcfF1e_-u)1UhWUPcl4o$-)ihp#R$mEcC;8;}&z2iUJ-OJJ>id zVx)a-d(-1A9k-aaKg>Cuqq-6tVa+_>Q)^pE`C=%Oi`q;o7~!emnJqa2g{N3Yx5q6Q zwM?2-uK6u(f_b;G)sbbMVN#O^x3Xs5JBl&V??$#9{?GNLdf)66Huk6gb$>cv-iDhy zc4!BxF8xB^GOYT5{*6G^QHmsfpKw8f#E8&b>Aoh~-knM4kF~>lc>2}%eee&)KB$cb z35TsEcZk%G$NX&rDVuUysBZguJd^Ba#8arI!k)8gBh3PNd4!x2A7q!Yau_@{R38=? zN89(?Orec3dW?KsARac`8(GGqyQY4Xviy2s-${Fvq>p^?J#50#Y%H+~EjJYrePa!e z&1tPhLZ2<>r*TIxOXfCr@6P0#4c;%t_Ilvz%3s-5C%H>7CJU4LrQ#`yEj;w8vO4B1 zKiaw{m;^lYX{O`}?DLS2o>MP7Jv4G4#-)$=jq2mze%d!1mSvM6hH-wJCw6$YeL8V) z@j{zSOLopuB|CPdg8W2VqrrZ|))n1a)JZ!}O5XBb&q=$6y)~;SkMAS?N!i^tBcai^ zS&8TC2ET>-F#_k*Mz9(TkvOKeLITUYtYR*VFaay5=3Qu}5yuWq_Mg>&z&Rdif8au~ z)-AP#tZB)a4=-55TxrXt<7A#_xz7Tm4fV|e0un?AiO&#G4*V@~)yQ_}ZJQ$VbjIUZ zkSn?xMBZ2DhphiaJA9(FnPFddPL;9dqvw^krS%L(Z?c1sNW(4ugWHsAkIIOweX(4n zv?IETiDnD=>h(fYF) zoylo7fvc#i@SCrzC{MqFtv-K>0`7|sC5ZmX7fP|sO8%?_oS8xrlL?X}1T zo^^0KeKDJzMHah@PG1mFXlCOMUAH*<>HRR-{;EnZ5?y;aH3iPBL=tQ}{bR1Mr@>+t zAKyc$7j7Bh)J+ ztY1ppTKCm57B;q+C@RzPVeod{KU4r7$GuN{17SBOpm*dbK$g;-Vbu_RW&E z|2BL25HXg8itT$aF__(TtV26wqeAtFEjbF+1&wMWt(B>V_|{Yhu`K1>+O1Yx^NcMT z#U=sx1QEfh8CWaNNP>hHECbb7s4i%WW`H!qr7mGn{wY)cG(3u2U-c^LZhG^}tCw?6ZyHMNVhj9@ z_1F0m^vX%=?h0Y0n!*G|jMe&W--v|HY+Oi4OqQL?!J8L8k?7;NKlWp}*Gl3cVzpbA zoL%@2f&_vi3ew{#nM1D+O6By;S-%Prp-2kLmAx-C^}J%vhvf*fk%!h4X$vcB(B~SJ)QMq)8BIea4 zI)f*{L)BBRys?Uqt1~d2*c&A5J@cfJqW5%o*6{%SQ~9XwZzk4gT_cjlN&A)%xX{w- z1c9n+L2`#ndHNR zYehA8OK{Ttt>GIBD?&7V&;Ed@#s-_D;{t}L9Wo0UO2faeT{Au4aWP+L-+MJ5Mhx0k z9x|2NjJKMzT^w6-gNolprdRKw9U*TLY{&X^%*n9rRu8toa?CYEm-(o0J90)Bu7=l+ z2w?I~3V)T|YRJ^I*xnQq-a#|Y_-;{nVgr?Xw55f)Ua4#Z=a2=!;pf1N*B+?4VrQ8H z`J0~zToO_nJ33jvzBoP`^7(y{{UeU9|9r$-eYnieRd{O$HmWlj66`YMXdlP%prONBFkIbYUAs9mUaLJA)*eb0f&a;1q6 z&H5QruJddp_TM7U7s)I*WHq|SEmsIB9kx1X#nnAqw;l4k!%dd=n7?z}&!Qw{A3s(U zbNX_mqvzA2>>9TEw1u>yzlZOd_Z!-KIY_s{Ode}?W~w+ zZHgWmeOu_=x=G!1MyG2pjtsTlx3auZZCvd9UGfsdmYs>f0nwM6zmoTKrii_)nw2}i z$67r%XYkhh2wQWHJ~7mk`Ed9oOD~q`s*i*Pxz!o!kA0uk0X@$1O1tc(vXoF zGS6E6*XY3(*i8e!H3j5XQ4Uw7EE&8Fh8C*3t_pj`%f=2&u=RtHA}RMi&1^hv;)|h? z&63n|m2cs&Ov_-)>>{IlxD9uDkvis9{a^YN{@qoF|$jmJmH?G^l{ zoYTukR4U7}t7SU)Mq2y>@Vtf7GWjAN)2bCdNa%8>Rqs}9^^C_+i^c#8yv9{qYc%tu zByQmcwvQ?2#B604ODn1NWY=6hAbaeIL0LvWam{D$mFwm3j^-YZPap9VtWWZwF}^Xs zuf|U1u{9&_FdcHnx=?^RM*UrmQ=R}Y*KnBgr%A<;hQEzZ)8Q2GnPW1TxL|$tib?4~ zIeCB!S<{w%P^HWJ{ob3YPLY|Ks3X!*Aq_=vXN;*#?<-4=4Ey)DC(byb2M!2xY%8t$ z4$9}CI$S?r##1<3j#XL0ji5Na8g|^o$S=6U%E^@@`cAeNH<~vzI3mxfUMYHavs%3L zCNb7=Crv#Kxd1506amKz%$-Ost>+3qF?xs;e3f(MMMH_1gJQ+M3U57YZ1ZFb-MPOt zhL0us(jC=&AbPUH6&cW>$kui4pNiHtHpukxt97n7ObNsi>MxWYuH~9%*5zMW>V@OH zA3+ZydP=nb76a98ow%HN@{Ol4?xi5@UMC$_gA03DpL)X#3V;><|5K(}A|w zD?0?)4((mLvq{HJWRgqL=K_4(`?#n<%NOO1ZTrYHAh2pj`T#6 zK+xIUeWmi5=mwiHEL1|7i9Dg2!&E=5Kx1oY(UBsy4MEs zFp1PFWz9`2=b_YR_RT!FP02iU?PhL*h1!q2T?B6DSx<;E*VC34HMew6$Ltd*h`N~Ma&L!A7m zX1Rt5JPwYz48vCr0XFFJ1VD*)Vf(MK}6;woGyNj zc3+s|q*;g);qvL1XJ_T`6jxN)IdV&mvX9yU22ayZon7yv=FH%UTI8sHuu40@H803F zq4YBB8@EKHnC!9iKtvR{fH=t*E@hwwwhe7(C(XqWdTvG<-f6wJQTTSAq@`~i> zv|w#%YljtMGPOTPE!FA7LujE!%{3_AGf2MCJ^~>t@vy-?Cg)T6cr(^Q_-&e&N1E0o z?qzK5uK9aV6QO8^Cb`t-c21hY@sQ1CV_G?TmK^OoQA&fqOFk%^gupHaz?@XFUlkTh zmTZWopBU-D8@TxkG`xo<%!ItlASRx|2*`b$Uv}`!F@Ld8jDFeP)*!D?SZNp4V+8ZY zitVSMNkYPpXOuEHV@7V>&q};noFr-yi0!d-_DqoAL~i7o{ift{4ca`|0!J){jVU*( z!d{<(inW6ipJB7!U1d_v{-&QBKq9ieq*Wb>?U~sq<@4AG8#kn+cwxpX61ovazDv|s zatzit3l{ZFjE^Iq?LW}gsS z@W(MMEZNUEzu#AVXQ7@5C2Z>gv;ZZC&aTekN!-^o9<|t816dBo*m}&^*SQu_jahI= z6hq)#c%_c))ag2oo!&X2KdHwnROanwGhT4G%+nm(TW)p&8m4WJS6=Vku(Z85 zN-6cG|A$^SC8PDU+V948306Lb*_9?ZL}#hC>haE#lsz$9{KhkTC^5%Gu>Y(>SoEarD1|Z9f86AbRSp6%I^aGzN@C2EH3jjLiI?V{ zD`XsG>pL-xi~lX&q9iMoq+%u>UxriAIJhg8{@a4|GG!!%>bYUtu6BD`z}%&GwHOAzLVj-&(5QRzYf38#!(}djfrDI?;ycBVyhit z{VI~0t-3xyiKVqBFhHqoQd;|==d9B1*Pc%yGIf4v%CL33=q&|b9`W>%)x+waD}QW+ z{;KB5I^z^8EpcDVRV^OJ)E4bv9NI$>^X3EIROG3-MwnHi4^K;neMNYf&`8oWR&5^@wE=c2xWMCFD0PsEUZB+WG8m zyCLz2JZsz%UF@tK>5!6lnl=)EB6{LS{CBmlS98!v=R8sP-v~H0a}fYaD+E1u`46+c?YGEP$zEEE_4-`iqs9b zsVA^BL%6e&l^ZNx!K&n6lxNxHN%$&)}6w3ej+*(S0S_ zpFZFzwC-&3_2r#OD)rA`Z@Vj)AzDbkF=NkgbVUxtK7#@8ZIFQKp!yX4l;p(!g{|je zXp*}0cGOmn2pRJvZ^#~ma(6snO$+RmcU_*)H%2*&%+3;CG#6AZV@`Tr5}*u+UdyX zLxBFYL6C$K>nK)yZ&&@Lhr~}ri)Z$(_;v?1Z@U1l`sS2Q7dBv?j3E>h4xKCu;-OdM z7X;y)-^{q?dK$HA?%K_gwteR1lR8zW|C5R`&xm+B)ASI}mdY{sW+QJag*(BT(ePZU zI;8R8z@O~JjHJ7FVtitLnCFz3>192PiCd|tp5AjVf>_L#nnn3&dLK#m?BZ)S-EI$K zo3~9`Q#~+Ajt{3Wc{koy%&uMTNS0~#M*roRs98(Lix`Rd<|z}#HRoV&E<`&>ycU=0 zi|vF2b##k;i5>#@g1s2Wono(51AocSXq!TB;4baGf>hL(i6wf-;~UquIx%>HIp4RM z#h*%9l!I26P%0+2yw!?0xg|K65v!#imZrtkRJ4KeF3MXdSqnJWP=5Vo^cJB=SHNJz zdqGAex?4&z;rN?{CX>vT$H-E^GEn=k_F|t6m{9X+*RICUjHT68LoGW#T3SC2wNRIi zC-`r7M}TG?X5Ds#bwC>eA+7dB;de2RC&w@X>jT%^ILR`<$T{Y&0&H|$9z5c=vFM-P zW~W$*8D@4ls=f(!DwERP*X4z7Qv_CmHEJ?{mvte0^EJZzO6hOp7@g^|bLFrG`UQ!p z42D=KjU5~knwVifl~gn8xpgs9_`UuP2+fSzWJq=>n=fP+a>ozDK`iES&IKYIW)bxn z%|-`?{Z$0NWt56m7AD%oWz7Fecsbuw(}=82w!};WU|v&+k>g$}MWr$Lz#^`GHhFko zNTMBA5UU(639)l&zROu9FFg*!;*vj+P@@XJe&5-0md@@-$12zD@J<-O!ASgNAXhH&%LahOfCKH; zF{7r9;5e5@<;bxlLi1;KRQJ^VUGJw+CiH%1xWX+1#Aiu6r0c^=b_9ZcgxF-#j8)(E?+8 z`Dzj1&kW)$Ku3iJt_?sKLdjdb=t%YD3|h~|VGiWO*F`dLsT!8H z1ci#FIGkl>|B%)Rz|ShhbRQ$1en@7jKN5)!`&#-mLRxC=`(lU}4D{-rYlEpzdKVgZr~Cww_5HO9%~GXSN{8oaZ8 z0ExMsen?^~L>8A#K9AHm5%^2(8MTS-Yi;*VzLQXCDaile{XNK^W{ z0LMQhRsrr6VVN-Z&hG?9bTlXHcI*B{IsH<5Ui?>iBpD@N4DMJcES~VEN$iP-?I#qB z1YsL{TJpcmEoVwx9MQd(_u%%n(YnCd60fubq)!&MjxbiINhROIJsXP-Ugs~mMC~5; zJrN8E_RBGLf+-@Msx(TgbEh0beX39~ zP^@j=ZO0_>KA;R`P0K#OdmV;$Ppfp;qUMq^oCV*ry})2fZc?f>h2v!$f4++%fpzm! zxtAVCK@E!3h_U=>B8aN?Dy%jT4)+%y0qUDR6GXkEV1Daqgng|>GSoo?Cuio={!P4B zL^!)cp-g?z^}%x1{mI0zgQaTN+8G^`qOmCE3_9IKd0-B1B%yg0N8isb{-FA;KVHg3 z*#dS=RH-K-Y1or=`NZ)nlH218<9A0!tMdxctA~w55f|+-^&+q zlDi1(p|pb1%j)uk9NC%)*jK6h38}|P8AwFr2~rnQkOB#*+Lsm4DE!G1HTIq%feLZXs4SE6i-Z*L1H$7tpJJqP7` zu0wNnEp;_+Y>;aFTiEhDm;AQ!p_tV(Tf7aw|w0o%snKPk*5D`)O?h+BgcBkZxZ`8%GcadcGfORO6A*3=DfuQV)~y( z$~h}y91frC#ai7kgE}HD@V;UI5+|wu9EQy~Aqi}-xZcKzL;ou^yn2><7ht}U$P{W$ zE9@LX;C*-IBK<)Ow$>k7#zeu&KvpW_I{mH4Z?VGn1kf20>M38^XmGFv-$0N}Y@qK~ z1Dd_8Qc0md|BJh6g2cFOc7OL@A`jD|8tO^Nce5Py%*c^B|B~s@rZS163%<-%L}1?0 zx%oQaBY9>CNU>o&u**?Frw`~KhISrKE^zQMV@lABo8+Gf=FTpRoe61f@8u}j^^ zyGJ>XG;(*cfy1%Pw0{jLMU1ho(YgLII1Lwa+%$K)4*5Mx!hd*$+nb&@zLi-)kG*S2N2cS zM~T#fFw*w435>7rK}fra_s1cfLJst7R63qC1POD)LE+3?R_ABnf&xlb3iJnaO(jMY z6;CmER_tQ$7lXzk7DU;1T7@Poy@R-8R##W_BUX;=pLr6pWwU)5hxu_1FDPxSd*VjL zWLbNE`ky{;HCO>*kk56#2P2^%tj>O`X}(;=`djeDQOi{gxrj*vdtj#AIax>{_r+N7 z*LX^XeSV4yBnyf0;DOyC5WxihS$KjFH{;#skV1W`g)sb&9Aobe?F`uu^oo=?`z>3b zS6b(lrIz1!>oIJ_y6v&tIVF2W&C?0X?Fj984=2wQR7_B4Gh_<}GCvVr8s2qTha_IS zFM`V5SZG3D>PSjau0Y^Fp>!*R_KS{mn$s#u9%vGO=Y@=X&A7NHE>dRFd)OQABvoNfd~;9jC<84l+V-cQgS54tXYQ|YK#0@A+}M^dSePpR?F zbFaMd1jXWVR@V#=^#B1knIi{4j-dTjEV+ox+dw6XED|gakYVQp#uiFyCbtBk5++*~ zi7Dosu!-_nC8?qrY*D;QQdSTqrTaQZIY;_NW!#aiL$5kcQO{-Hah(H?PCx_N@du^F zK4|23fdp(QH`O(z^!47{TI<-e20XUFUxiI`V6K#P*S%n|t7ReWQOVjV?#(Ge`3p-o z*9hI9b-OR}yjM}7%NI)a&FA&nbiG<9tB`-Cdmcb-vbFtw%1OlwD|dqud* zK<&+D`$p+Fvq}+}XN9_~Kp~Wd*+Y)^VJLUye2uy%SMet`N8>11ZwNJts-B!_trS8a zxoHU;ZlBSdtV(C($#0GTg-^2LGmwwOoKH2W`@gou^OsMQspl%rAOFT*MZHwo){shT zS;#!TFE5=F1HPckm+q>YHtNkt-CVIRiq_TeqV!~^YLk-@!;-|bu2A5v;O`;7K9-9t z?+9t7{+0ugin!D+nAqy9R&Vq8x_I2Bidj{Vy=f`-kVU0007EAKU10b2lPt|p4AbIN>dh7U zx_#GGew}e<90~Fe3LGYmEoAlC(T)yOazhWw+T;>M+u8NEoXWvG_KgEd1DbIG%K=&n~y#5P*`_?J1 zrsfQ5=3nZi1d#_QSo2EG0?L9ZSly+-|Gug)L^Ns5aa z<^5{cw@36Oi@dSPqkEP>judOMeuCaZ9AD+wJ)ersy#OUWS7;c z8PW2oFr>e~O%a+vmYvhsGu;&C2TULTR-Ed7rjH+#Sf&NKY{VTYTuQ9APQW;SzNopI z+^ivF37pY1jp3}1e9F~yq_0;XL!G6L6(ExLz9_ro%5+Z;>!5AUU)1?Uv+@Q*>0yLY z^BLL3TDTl{rMAi<-}asUD$2`){^g4gyu9{R7&MA#WSFO z#dR#XLE!9J_iI#m3YMz9Bt$2OCDqDD7gp@g<^M9 z<`y+FUNf@9Fo=NnR zp^UQMZ9tqcsw-wqlh(|+tJ5GE+H`RRg{=0QD&mc>=qr8Kps%H@S$Y85E*EEddNygW zc18Q!EJEWL)_r;Q78RyQlv5(&{-fH`SpHj*n zs{uz5aVw|+xz{d%yrh6}umSG@rU|j;VF^pGJ!btp*|FN0D@S&w487b+ulUVXS~+$? zu!v$ZLvDuBBbp5rU|fj05)_P(1@;}rXoW}0J>ie$bBXNa{@)F?Q01jkCVKm409`E;Rh%N03H+5d70YFQ^fL_)zA ztnE7m`nh9jsE;Dl(QzL-Hncr9a0YrRAtiC}7bJ+t-kvlIkxTAL&q+{@3B+X8%kB2> zRg@ye;MKK)tD5c?(3}mI?E5OtPLW9S_G;fzg~%I1VlzZr@b7`-6oK6XcMCRjrMzJO zMD@_p7&~zlwKhKqykK`};FaDR@?vP#xNKE7s?81hB#1PZM z`P}a*_61+d#t~iQ@ceSHhpiT%qwZTe(66F4yTyliK+0$GjjV6RW3ZX`IR4{L%yO;s z2HTQUCrFR8#z%SD>LH9SS8U1`6uKz-|A(sIYG%8AlMuE`_ExJiEAWXibnHOT*_Y{I zl!lWl%sov-si(U$Q~+i_K%Zi~v}Z@mN?V^i&;n^*s8(+LVGQdCI#T?uyJTeLvqvbc-YOWP(`+C2v2eyKi|&{rxTd1{LW#m5&2 z2zF>^E>rMW*YkZ~unA5|dJyayVbDsSwyKg3Fcy~2D7?F(9TK9~IHGA0%QVFnxDT0= z08rmBftt{p+QkZdZhj4E+R;?1YqX{ito+5xT4P8pFt>4Lg&w9SxPv9OKTbqM76pxx zUhkcz@bE#P<1pTV^v`d=lt@+Q*Uk^HCz8B$M#*VcMOnvK<2EcjK6QU#9)MCgYmI%nS7PsrM2RY;1fwseX+ziQEMiBx zhlBo=QE0AAH6W~_WUC9#G-v%ZGqZia5gb{XVc$C;nt1CBVs=#`+21%`a^j2nPmRgi zwA)}Ma^3p}5_+XNEyiROHEyZM(HPJPn2ZqiE9Piym?IR#m`qwT9u{%KeI7#c;_jba zq}qSZ94JkILm5;_)VR}k5mBcE_t7i;hImFzizO|M&|4BOov|5-RlxuChFB=os3WLD zwb=7nncH-|u`kg&kgrZZ>Y^*~Lr)JJk1-pxPJq|ToDd!_2Ol_){5b44{lC}nKRcBUG=9N^<)oU^ zx-wL()_Q~_xxdBf#D_;mS(+FFc#JWxj!lK9pl)K~43$!2%j#H&2AtHt$BhdmTy1CK z87Hy$fPwu8e_1BT<6%s5nx$_e{a6cWt#Z>4v<$8z49eZerpaB0pj;deoL9R^N>|#k37}GBdEF;GG zeWdg%jE89M+tNcS>yGP=gT`%RhCb-Xe`nq3;-@bo<*+iCrdDquy}nA)xakfX~xbEH{+*G}q=B&YT; z?ZohsQvtK3V7z#Xnz8hz1?Z+x1@)&G9Ua|91aCGdf(ZAs=9aWpRTI)w8SF$1)*Ca@ zlOwkJK*{tMWeOYhpVQii^mz5C_FHQJrV7NdqSAsXjNHZm{G)|7QZd0Gzn1cq?Dj+# zwme8Edh^uz8S7V5rXXTrX(`G#6bV%S-9)Rr(*+ZUyBbbXH$&&8h}c%!CFtrudtVHC zoAzNKy@d<6kkGYxcm-OzZ~BtZV|GS=s41)% zo)u9A^(gT=Vg3gWb&UKZknuGS)E>NXTf@nv zPL?K|R}eLlYHtAeei17!B$!>zmHzBA*L=R#-=!MpWy#ct=OJQ;;M7_G=2h;tY?C%9 zG~R6ioMdJmTR+JgBo=umByboS=}E&X*`92fK|acYtNwNavexhJAWZnQaXP+H`FOn5 zU!&3X2Fb(Y#Nz0$MAD43>&csc;qKn^kR(Ou?<|qe+SDM@Rj+aI>t*^)Cmi#U0>&yr z?7?kpt;~!s^n@t-LN})ufn;U@Y+<1;DVHnk3b>yPgTIyod!JN#?-Juxd-wtHJ9hVJ ztSs7BV)Z%S?k!{v=ZRd5H&~`g-a`zksJ$AD;{gmk5w(tZ6)~#_S=aP5vSF}7Ma)}xK35dnBBkI^aE?9q@3@vbVV<0!tE?jH3 zibQaRe3A8};jjkH?a3)XukE+W_R?*N?npM)>EEc}YH7(MTm*HJ2n3gSOw665392_) zp}51si487yfZ-A}V;^@ffg`?S3qz_UYiK0*uH(8vu#v~aq2+R~6+@#T_@~pE4(v_@ zO{Fu}LN2>Hd3!T2?4RWR#DK(rWX zlOC5o5eIfdHo4S77=3=GK+2Hmy2V|DGnEYNRgUWX@W0yc zhOQZvzo$gD1~y6*)#(vm|EG{|NWI)16B8z#Zzua98lhQq{}Z`%2}yI~PZuGa3U6hGBGlk7<`8|78qIRQAbJp~=mPHWW!0-abGTTZN zJ%Uq&o5d;U0dp7lUk%^ykKK34QN^+wCK{fU0~M%Nrg1~+iMm_gLk7+OVb*Wg`w@NPj(Yx>ouS zF!Y-%aW0Ico5qw(&Joc%EaPb=Mqd|(RiyU#6*MZNxun)Th>nw{GlkvftjLKqt1ZcV zwRd<%TFtwQWj_%e3jIjX_RYh&_drx&C%iDgYM&qX_YcvD^l!g`CuR`Ub(uads%>>1 zUuIDwdB3ixBZ1G0629}rJfVvV9c0v@yx?3g;|hI#BA5LvwSutRY{tRSg=<8ve_9|#$Vz_?41YjPH8X`SVqCGoN1+!! zNZ#yutVLel&HD}D^YdWu|5Y4|6d@hg2$?x0|G=`ws6&lPu^55I9HxotD{{;_o5vS! zY=KvZi9uR?^Agjci?O`#&x%Su#46|({`}%<}arHR#V%t3H52CI0Q77=G)Oe zBZBVesKB`?tWg`SuLL- zz);|{gL_d_8nuyk{0vio`(m)`VuieXkqHx0+Xs^qt4+6Bp*L0cB#&HwE+G+*4> z6Fi?Q4BD;rja)!wiqYAq!*hDursKC0()gxC*URJ2q7A);2?F5m3A$(zf`y52;@HY z!0kkDd*!6zO^$F}a7@?-hHDJN{QP-(Ql~2dn8u2n0^S^pB16MNy;T=?auWDVSYK?hrq7Yu`tWh6X6}=A>ctUn?Wl zS-SxEzO{`KwYHVUzuHz&t(sbKg`{V?!O3|?=vI4~pd|0EhM51xw#q7^rTG%^vl^4q zthT)YL+NDHoTXbe7w+u+FZYCdQyh&+-*jQlIx(;2h3w}ZSVX=Y9~&(j7uNe>sOlgg zv4;q=Qs5x5Hs@F!|7%bSLHyrVV<0nu>wM>^q0SD8)<3TRk+kKw1?FBuEHo5JWH@tp zGQlqu_Mkj%dJ`Et6VA#;dN;)oixJm%2J|P(JFqolFy_YHDMDm}FXPn|mT*ySM(DQH zZ=*`79N{5NCq)pkuQ)-zt)!e!%y4`y#dv23fus0Xic!z znsiqiF+dr&bbM3Wl#0k1y>Vm!sR||DSeONnk~Gwuin$Ypf^5gP9`H7=g@cEym+Z5x zPR1T~Mjo~{kw6uS9uNF#vg5Un;QRw8-H8-T|e$p4~5EuXnSM1S;P+k-`$ zYz2>oF$ePPXU)@_4CDk+@|LJ|Lwoi>CFN`}!h5NHC9=^Vbwcq$iL{ikkVfcipVtC` z>L(Q_dl?9^vi;x}*^Np-{Hcg2gH?5iwnqq+OA=F<0OeQUAk-F1J&N#4(i?4@=rD7z zi>Ez5h)g{m0dBo>H$Yy%AQl(X>b=07!N$ag9(R)8R&R(BL-^;R z77pn++;nvif1yARQWb8dOc?yN9G&44KGqi^Ac=1sY;x!LUnE3Ca{Cti1(=^yE}v<7 zkD&!D?EzQZ4%|?hRy86*ta+F}Y2?e<&zFFyM|Pan+jV}Wr=4MUV8U_RaLz?Oa-}iE z^frUpBJpBs(>xSzT#%dXw02^Q@KMeOo_5h0z;!J_Oz4}`{fzuWpKza3mYVBhz zci~f;+;zszS?P^PEN$OT>3IWU+|`3KhcU<4@(Q)45);OQb7iW)r^R4kr_+sf73uo< zdz}=q#FxT-=;wC3!t(&D9Yiam9ym*o0+5ppO z(%RS=$x4|=#Y>@{<=-$@f1H`nM4I;e;_&XRKEQPmO2?p`9PuP5_xSrFYV*T8LT6ws zk_MJ}H-S02i4D9u0|psjx_7<*UL^!(NW#$dVcSnkrKgj!hX1Y{tvU^4tsohZw362z zWcwB%C2?o)d`5Gt&dx-Y%`5HH;>2TiOeT`VJ&vIl#dZ@d+EQK`%4|^GiO1GT2BlR6 zM$@CX-{Uh11L|&t^ovQ|&vB>ioRj#%5ny5w1DcNWq@facG9Cxur0%$nr84s42zzN) z<_jFn7Qkz-@lW^P)C$rngg2R2R*2)6%cX)1aQunw9Kpr>S7Vzo%CsXHsR0XfM_q_l!MWkD!2(+g zCyJ>y0YiDLqyD%VbX`vy6fb|;wW%_wtwHD-E<{Dy{&K|Jjiw74^vqus{A?;pnnC}9 zcqZk@0JOEHRZ_B5kjY2~Y#hphr-eAtWTGVZ=dMMZk68VTC8sA!<>Mv$XIfhsDC!O3 znASXN+36>aRtaK_dB#l!?9*1cEK{5e$L7{3A*M$Kcp}Y?x3AslH|C&(k6Gn&4CK)C z1ZDLxRJ5j7ilZwM`}QaDN0B*^k@&o4At8aWatDB3p`fFmEZQ67%6?G&N{-R=`lf<~ z?R7*WzWdE?VHZ~$5mg5aE-yeAVTDhWzu#t45X;ts3&*HtO>D|xWSy#=uyotIvl zu<_I!d{u(aHXbPxPiSh___Hx>74_4n$|8H;&Gh({s@)-Z(d){jtj#T%_8*Ax#j}P| zT#R-D8Ie-dHy_t;LUzhD7MY!rOOD_`y%kk>5^Lp)jL7nz$;can2X0y?@&dHBD2pd? zteKWSh0}K*e4_5&Y7xKzp#;ZVKO-%qz_ThwsC<~&gKs#=>%=Ht~S%Ab{uV52o-c;Kou z6&0cF&O$^3)Cot#@zJ;*8IA%zU~GemY*a|jX&^^}0+#o#WmgOi#h`sOp}juV-|4re zh}@CVu*P76jRR}F?d6NJFe3Y@We^vXcyTOTgOSRp5RUCndF}cS5?|`?A4tL@89=XT zNSuTjvaEh3m36I^RhHmw?{QHmBypkiTXtD%)UZP&+LG&b{vFA|CaH#QQU^4A<$;#t zVT2TA#y|s?*-Y7sPz}2Vm+ZHhKiOA{g7~uP)bUD$wUw>lKT)qb>iE!%i~zzBD)ps! z$dxX@%j2FsCY}*MzzL=zU0SHA<{GxTwxAa zU8$52#c&A3+R`=MrI|bQ0u$c!2}N73qIA{OI7gD0v418|12p9W44|;PC|{8AT9{mV zUP;N1I&fe{9zLUzvSrHwJC1OG(pS`>1kv*P!W)u60o_CPjyPkMSXgBWUN&jV5@B@8 zgc{PtQ^u7@wTMheWp2OB_`uf5&&*cI5|D?419tfS6 zZunk!&5=Z124TnamgVY;j-GTi}lCg+YIDx z05WANbXhX3>Ofdl9r616^%LzdE;<7m8_Ei)LMU1qKcX3_>Jx#%3mJJs-Brjz)jo%n zMQHDgAvV&d9FN;{qcS8=_Z#+MRFKmodKTCIp=Kd(R!gv!f^=Lk=tGp|#mB?^xbVTi z44w*k3uXN|nt8^YKk!lzYNF>s<_q{otvSLhWXG9XemN=4j2)fVdg9VOH$(@Pt%>rV zK*Pb$wj?T*YA_^Q^pEirr8RXs24(aCX^E^7 z@JLk@hZ$3ArdXa^3~ti;wJTpq-aC)p{IsaqF)++K0kVaVkFzyM4&S3slzJoH!k4mK z)NlAIgapwftt!O)ODN6rj=87Y@!sk+3(OiK?E>lHtWG4#T$>sucl5$%V2?e19-6#4 zrO0KN5jbmj?kjqWZdf)rZMeJt$L_tUek?E>z9j~mG6%jiaEJL$iw3V8X|m$0kA3*I zsnpLB1s{mD%GvY0617isv8NOoxM{f}4%#18vJr7*ppMwd?Y0L{t?7FWs$^)CYafyV zN1EbMH`?`gB9QvR?_9xJxUDrKanCEQ+WEC&@ZBcg&uGReVtj+4$FLaH4=6ZenJI=; z1XQF3WAaTX;y%&F!C+PZE|*ng6)u%MtVJfr!nTHYI = { export function EditorCanvas({ width, height, onStageRef }: EditorCanvasProps) { const { t } = useTranslation(); + const canvasColors = useCanvasColors(); const { zoom, panOffset, setZoom, setPanOffset } = useZoomPan(); const { selectedIds, @@ -169,7 +171,11 @@ export function EditorCanvas({ width, height, onStageRef }: EditorCanvasProps) { const worldPoint = getWorldPoint(e); if (activeTool === 'select') { - const hit = hitTest(worldPoint, openings, walls, electricalItems, furnitureItems); + // When furniture is (nearly) fully transparent it's effectively + // invisible — skip it in hit-testing so clicks fall through to + // elements underneath instead of selecting a ghost. + const hittableFurniture = globalFurnitureOpacity < 0.05 ? [] : furnitureItems; + const hit = hitTest(worldPoint, openings, walls, electricalItems, hittableFurniture); if (hit) { if (e.evt.shiftKey) { @@ -464,7 +470,9 @@ export function EditorCanvas({ width, height, onStageRef }: EditorCanvasProps) { // Only if the rectangle is non-trivial if (rect.width > 0.01 || rect.height > 0.01) { - const ids = elementsInRect(rect, openings, walls, electricalItems, furnitureItems); + // Skip furniture when globally transparent — see hit-test above. + const selectableFurniture = globalFurnitureOpacity < 0.05 ? [] : furnitureItems; + const ids = elementsInRect(rect, openings, walls, electricalItems, selectableFurniture); if (ids.size > 0) { selectionDispatch({ type: 'SET_SELECTED', ids }); } @@ -509,7 +517,7 @@ export function EditorCanvas({ width, height, onStageRef }: EditorCanvasProps) { onMouseDown={handleMouseDown} onMouseMove={handleMouseMove} onMouseUp={handleMouseUp} - style={{ cursor, background: '#ffffff' }} + style={{ cursor, background: canvasColors.canvasBg }} > {/* Konva renders one HTML per ; performance recommends 3-5 diff --git a/apps/client/src/components/editor/EditorToolbar.tsx b/apps/client/src/components/editor/EditorToolbar.tsx index 0f3814d..c093d20 100644 --- a/apps/client/src/components/editor/EditorToolbar.tsx +++ b/apps/client/src/components/editor/EditorToolbar.tsx @@ -193,6 +193,16 @@ export function EditorToolbar({ onSave, isSaving, onExport, onImport }: EditorTo > {t('toolbar.meas')} +

+
{/* Floor */} - + {/* Walls (hide the one facing the camera) */} {layerVisibility.walls && walls.map((wall) => ( diff --git a/apps/client/src/components/editor/three/utils/pbrTextures.ts b/apps/client/src/components/editor/three/utils/pbrTextures.ts index 1f459de..197b031 100644 --- a/apps/client/src/components/editor/three/utils/pbrTextures.ts +++ b/apps/client/src/components/editor/three/utils/pbrTextures.ts @@ -1,5 +1,5 @@ import * as THREE from 'three'; -import type { FloorType, WallFinish } from '@house-plan-maker/shared'; +import type { FloorType, WallFinish, FurnitureTexture } from '@house-plan-maker/shared'; /** * Loads and caches PBR texture sets (albedo + normal + roughness) for floor @@ -28,6 +28,7 @@ const FLOOR_TILE_METERS: Record = { WOOD_MEDIUM: 1.4, WOOD_DARK: 1.4, WOOD_HERRINGBONE: 1.0, + OAK_NATURAL: 1.4, TILE_WHITE: 1.0, TILE_GRAY: 1.0, LAMINATE: 1.4, @@ -107,6 +108,42 @@ export function getWallPbr(finish: Exclude): PbrSet { return entry; } +// ── Furniture surface textures ── +// +// Reuses the floor texture assets. The tiling is tighter (0.4m default) so +// the wood grain looks appropriately scaled on desk/shelf/table surfaces +// rather than stretched. + +const FURNITURE_TEXTURE_TILE: Record, number> = { + WOOD_LIGHT: 0.4, + WOOD_MEDIUM: 0.4, + WOOD_DARK: 0.4, + WOOD_HERRINGBONE: 0.3, + OAK_NATURAL: 0.4, + LAMINATE: 0.4, + CONCRETE: 0.6, +}; + +const furnitureCache = new Map, PbrSet>(); + +/** + * Get a PBR material for furniture surface textures. Reuses floor texture + * images but with tighter tiling appropriate for furniture-scale surfaces. + * Returns `null` for 'NONE' — the caller should fall back to the solid color. + */ +export function getFurnitureSurfacePbr(texture: FurnitureTexture): PbrSet | null { + if (texture === 'NONE') return null; + let entry = furnitureCache.get(texture); + if (!entry) { + entry = buildPbrSet( + `/textures/floors/${texture.toLowerCase()}`, + FURNITURE_TEXTURE_TILE[texture], + ); + furnitureCache.set(texture, entry); + } + return entry; +} + /** * Compute UV repeat counts for a given physical surface so the texture tiles * once per `tileMeters`. Apply this on the geometry side rather than the diff --git a/apps/client/src/components/editor/types.ts b/apps/client/src/components/editor/types.ts index d77a09c..bfe23af 100644 --- a/apps/client/src/components/editor/types.ts +++ b/apps/client/src/components/editor/types.ts @@ -35,6 +35,13 @@ export interface LayerVisibility { readonly furniture: boolean; readonly measurements: boolean; readonly annotations: boolean; + /** + * Whether the stretch-ceiling visualization (tinted plane + outline in 3D, + * tinted band + dashed line in projection) is rendered. The underlying + * `stretchCeilingOffset` value on the room is untouched when toggled — + * this flag is a view-only layer switch. + */ + readonly stretchCeiling: boolean; } export interface EditorState { @@ -75,7 +82,7 @@ export interface EditorCommand { export type EditorAction = | { readonly type: 'SET_ROOM'; readonly room: RoomFull } - | { readonly type: 'UPDATE_ROOM_PROPS'; readonly props: Partial> } + | { readonly type: 'UPDATE_ROOM_PROPS'; readonly props: Partial> } | { readonly type: 'SET_WALLS'; readonly walls: readonly Wall[] } | { readonly type: 'UPDATE_WALL'; readonly wall: Wall } | { readonly type: 'ADD_OPENING'; readonly opening: WallOpening } diff --git a/apps/client/src/components/editor/utils/canvasThemeColors.ts b/apps/client/src/components/editor/utils/canvasThemeColors.ts new file mode 100644 index 0000000..c12860e --- /dev/null +++ b/apps/client/src/components/editor/utils/canvasThemeColors.ts @@ -0,0 +1,125 @@ +import { useTheme } from '../../../contexts/ThemeContext'; +import { useMemo } from 'react'; + +interface CanvasColors { + /** Stage / canvas background */ + readonly canvasBg: string; + /** Highlighted canvas background (e.g. drag-over) */ + readonly canvasBgHighlight: string; + + /** Thin grid lines */ + readonly gridLine: string; + /** Major (1 m) grid lines */ + readonly gridLineMajor: string; + + /** Ruler background strip */ + readonly rulerBg: string; + /** Ruler text & ticks */ + readonly rulerText: string; + + /** Wall projection fill */ + readonly wallFill: string; + /** Wall projection stroke */ + readonly wallStroke: string; + + /** Dimension / measurement lines */ + readonly dimensionLine: string; + /** Dimension label text */ + readonly dimensionText: string; + /** Coordinate-label pill background */ + readonly coordLabelBg: string; + /** Coordinate-label pill text */ + readonly coordLabelText: string; + + /** Electrical symbol stroke (unselected) */ + readonly electricalStroke: string; + /** Electrical symbol fill (unselected) */ + readonly electricalFill: string; + /** Electrical type label text */ + readonly electricalLabel: string; + + /** Selected element stroke (shared) */ + readonly selectedStroke: string; + /** Selected element fill (shared) */ + readonly selectedFill: string; + /** Selected element text */ + readonly selectedText: string; + + /** Furniture default stroke */ + readonly furnitureStroke: string; + /** Furniture default label text */ + readonly furnitureText: string; + + /** Opening position label text */ + readonly openingLabel: string; +} + +const LIGHT: CanvasColors = { + canvasBg: '#ffffff', + canvasBgHighlight: '#eff6ff', + + gridLine: '#e2e8f0', + gridLineMajor: '#cbd5e1', + + rulerBg: '#f5f5f5', + rulerText: '#666666', + + wallFill: '#f8fafc', + wallStroke: '#334155', + + dimensionLine: '#94a3b8', + dimensionText: '#64748b', + coordLabelBg: 'rgba(255, 255, 255, 0.85)', + coordLabelText: '#475569', + + electricalStroke: '#64748b', + electricalFill: '#f1f5f9', + electricalLabel: '#94a3b8', + + selectedStroke: '#2563eb', + selectedFill: '#dbeafe', + selectedText: '#1e40af', + + furnitureStroke: '#6b5b3a', + furnitureText: '#3b2f1e', + + openingLabel: '#94a3b8', +}; + +const DARK: CanvasColors = { + canvasBg: '#1a1b1e', + canvasBgHighlight: '#1e2a3a', + + gridLine: '#2e3038', + gridLineMajor: '#3a3d46', + + rulerBg: '#25262b', + rulerText: '#909296', + + wallFill: '#2c2e33', + wallStroke: '#a0aec0', + + dimensionLine: '#64748b', + dimensionText: '#94a3b8', + coordLabelBg: 'rgba(30, 31, 34, 0.9)', + coordLabelText: '#c1c2c5', + + electricalStroke: '#94a3b8', + electricalFill: '#2c2e33', + electricalLabel: '#909296', + + selectedStroke: '#3b82f6', + selectedFill: '#1e3a5f', + selectedText: '#93c5fd', + + furnitureStroke: '#a0845c', + furnitureText: '#d4a574', + + openingLabel: '#64748b', +}; + +/** Returns the canvas color palette for the current theme. */ +export function useCanvasColors(): CanvasColors { + const { theme } = useTheme(); + return useMemo(() => (theme === 'dark' ? DARK : LIGHT), [theme]); +} diff --git a/apps/client/src/components/editor/utils/furnitureTextureMetadata.ts b/apps/client/src/components/editor/utils/furnitureTextureMetadata.ts new file mode 100644 index 0000000..83c311f --- /dev/null +++ b/apps/client/src/components/editor/utils/furnitureTextureMetadata.ts @@ -0,0 +1,23 @@ +/** + * Helpers for reading the surface texture selection out of a FurnitureItem's + * metadata bag. Kept standalone so both the 3D mesh and the properties panel + * can read/write the same shape without importing each other. + * + * Metadata key: + * - `surfaceTexture`: A FurnitureTexture value ('NONE' | 'WOOD_LIGHT' | …). + * When absent or 'NONE', the furniture uses its default solid-color material. + */ + +import type { FurnitureTexture } from '@house-plan-maker/shared'; + +type MetadataBag = Record | null | undefined; + +/** Read the surface texture from furniture metadata. Returns 'NONE' by default. */ +export function getFurnitureTexture(metadata: MetadataBag): FurnitureTexture { + if (!metadata) return 'NONE'; + const raw = metadata['surfaceTexture']; + if (typeof raw === 'string') { + return raw as FurnitureTexture; + } + return 'NONE'; +} diff --git a/apps/server/prisma/migrations/20260408040000_add_room_stretch_ceiling_offset/migration.sql b/apps/server/prisma/migrations/20260408040000_add_room_stretch_ceiling_offset/migration.sql new file mode 100644 index 0000000..14a03aa --- /dev/null +++ b/apps/server/prisma/migrations/20260408040000_add_room_stretch_ceiling_offset/migration.sql @@ -0,0 +1,3 @@ +-- Distance (meters) the stretch ceiling hangs below the structural ceiling. +-- 0 = no stretch ceiling. Applied per room and used purely for visualization. +ALTER TABLE "Room" ADD COLUMN "stretchCeilingOffset" REAL NOT NULL DEFAULT 0; diff --git a/apps/server/prisma/schema.prisma b/apps/server/prisma/schema.prisma index 64204b4..4dce7e5 100644 --- a/apps/server/prisma/schema.prisma +++ b/apps/server/prisma/schema.prisma @@ -27,6 +27,11 @@ model Room { wallHeight Float @default(2.7) plinthHeight Float @default(0.06) plinthThickness Float @default(0.01) + /// Distance (meters) the stretch ceiling hangs *below* the structural + /// ceiling. 0 = no stretch ceiling. The ceiling plane is therefore at + /// `wallHeight - stretchCeilingOffset`. Display-only: does not affect + /// wall geometry, opening positions, or electrical elevations. + stretchCeilingOffset Float @default(0) order Int @default(0) posX Float @default(0) posY Float @default(0) diff --git a/apps/server/src/routes/rooms.ts b/apps/server/src/routes/rooms.ts index 1231d48..2697401 100644 --- a/apps/server/src/routes/rooms.ts +++ b/apps/server/src/routes/rooms.ts @@ -67,6 +67,9 @@ const roomRoutes: FastifyPluginAsync = async (fastify: FastifyInstance) => { wallHeight: input.wallHeight ?? 2.7, plinthHeight: input.plinthHeight ?? 0.06, plinthThickness: input.plinthThickness ?? 0.01, + ...(input.stretchCeilingOffset !== undefined && { + stretchCeilingOffset: input.stretchCeilingOffset, + }), order: input.order ?? 0, // posX/posY added in schema migration; client regeneration required ...(input.posX !== undefined && { posX: input.posX }), @@ -156,6 +159,9 @@ const roomRoutes: FastifyPluginAsync = async (fastify: FastifyInstance) => { ...(input.wallHeight !== undefined && { wallHeight: input.wallHeight }), ...(input.plinthHeight !== undefined && { plinthHeight: input.plinthHeight }), ...(input.plinthThickness !== undefined && { plinthThickness: input.plinthThickness }), + ...(input.stretchCeilingOffset !== undefined && { + stretchCeilingOffset: input.stretchCeilingOffset, + }), ...(input.order !== undefined && { order: input.order }), ...(input.posX !== undefined && { posX: input.posX }), ...(input.posY !== undefined && { posY: input.posY }), @@ -237,6 +243,8 @@ const roomRoutes: FastifyPluginAsync = async (fastify: FastifyInstance) => { wallHeight: source.wallHeight, plinthHeight: source.plinthHeight, plinthThickness: source.plinthThickness, + stretchCeilingOffset: + (((source as Record).stretchCeilingOffset as number | undefined) ?? 0), order: nextOrder, posX: source.posX, posY: source.posY, @@ -376,6 +384,7 @@ function toRoomResponse(room: { wallHeight: number; plinthHeight: number; plinthThickness: number; + stretchCeilingOffset?: number | null; order: number; posX?: number | null; posY?: number | null; @@ -394,6 +403,7 @@ function toRoomResponse(room: { wallHeight: room.wallHeight, plinthHeight: room.plinthHeight, plinthThickness: room.plinthThickness, + stretchCeilingOffset: room.stretchCeilingOffset ?? 0, order: room.order, posX: room.posX ?? 0, posY: room.posY ?? 0, diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index faafa02..31ef3cd 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -41,6 +41,9 @@ export type { VerticalAnchor, PositionAnchor, ElectricalType, + OutletDirection, + WallLightStyle, + FurnitureTexture, ElectricalItem, CreateElectricalItemDto, UpdateElectricalItemDto, @@ -62,6 +65,10 @@ export { OPENING_TYPES, DOOR_OPEN_DIRECTIONS, ELECTRICAL_TYPES, + OUTLET_DIRECTIONS, + WALL_LIGHT_STYLES, + FURNITURE_TEXTURES, + TEXTURABLE_FURNITURE, FURNITURE_TYPES, HORIZONTAL_ANCHORS, VERTICAL_ANCHORS, diff --git a/packages/shared/src/schemas/room.schema.ts b/packages/shared/src/schemas/room.schema.ts index 7bd1ba0..39921c2 100644 --- a/packages/shared/src/schemas/room.schema.ts +++ b/packages/shared/src/schemas/room.schema.ts @@ -17,6 +17,10 @@ export const createRoomSchema = z.object({ wallHeight: z.number().positive('Wall height must be positive').optional(), plinthHeight: z.number().min(0, 'Plinth height must be non-negative').optional(), plinthThickness: z.number().min(0, 'Plinth thickness must be non-negative').optional(), + stretchCeilingOffset: z + .number() + .min(0, 'Stretch ceiling offset must be non-negative') + .optional(), order: z.number().int().min(0).optional(), posX: z.number().optional(), posY: z.number().optional(), @@ -35,6 +39,10 @@ export const updateRoomSchema = z.object({ wallHeight: z.number().positive('Wall height must be positive').optional(), plinthHeight: z.number().min(0, 'Plinth height must be non-negative').optional(), plinthThickness: z.number().min(0, 'Plinth thickness must be non-negative').optional(), + stretchCeilingOffset: z + .number() + .min(0, 'Stretch ceiling offset must be non-negative') + .optional(), order: z.number().int().min(0).optional(), posX: z.number().optional(), posY: z.number().optional(), diff --git a/packages/shared/src/types/elements.ts b/packages/shared/src/types/elements.ts index 08198f5..3f9ff7d 100644 --- a/packages/shared/src/types/elements.ts +++ b/packages/shared/src/types/elements.ts @@ -224,6 +224,17 @@ export const ELECTRICAL_TYPES = [ ] as const; export type ElectricalType = (typeof ELECTRICAL_TYPES)[number]; +export const OUTLET_DIRECTIONS = ['horizontal', 'vertical'] as const; +export type OutletDirection = (typeof OUTLET_DIRECTIONS)[number]; + +export const WALL_LIGHT_STYLES = [ + 'classic', + 'pendant-globe', + 'sconce-up', + 'sconce-down', +] as const; +export type WallLightStyle = (typeof WALL_LIGHT_STYLES)[number]; + export interface ElectricalItem { readonly id: string; readonly roomId: string; @@ -277,6 +288,35 @@ export interface UpdateElectricalItemDto { readonly metadata?: Record | null; } +// ── FurnitureTexture ── + +export const FURNITURE_TEXTURES = [ + 'NONE', + 'WOOD_LIGHT', + 'WOOD_MEDIUM', + 'WOOD_DARK', + 'WOOD_HERRINGBONE', + 'OAK_NATURAL', + 'LAMINATE', + 'CONCRETE', +] as const; +export type FurnitureTexture = (typeof FURNITURE_TEXTURES)[number]; + +/** Furniture types that support surface texture selection. */ +export const TEXTURABLE_FURNITURE: readonly FurnitureType[] = [ + 'DESK', + 'TABLE', + 'SHELF', + 'NIGHTSTAND', + 'DRESSER', + 'DRESSING_TABLE', + 'BOOKCASE', + 'WARDROBE', + 'CHAIR', + 'BED', + 'CRIB', +]; + // ── FurnitureItem ── export const FURNITURE_TYPES = [ diff --git a/packages/shared/src/types/room.ts b/packages/shared/src/types/room.ts index 987aa60..e2359e3 100644 --- a/packages/shared/src/types/room.ts +++ b/packages/shared/src/types/room.ts @@ -11,6 +11,7 @@ export const FLOOR_TYPES = [ 'WOOD_MEDIUM', 'WOOD_DARK', 'WOOD_HERRINGBONE', + 'OAK_NATURAL', 'TILE_WHITE', 'TILE_GRAY', 'LAMINATE', @@ -50,6 +51,13 @@ export interface Room { readonly wallHeight: number; readonly plinthHeight: number; readonly plinthThickness: number; + /** + * Distance (meters) the stretch ceiling hangs below the structural ceiling. + * 0 means no stretch ceiling. The effective ceiling plane is at + * `wallHeight - stretchCeilingOffset`. Visualization only — does not + * affect wall geometry, opening positions, or electrical elevations. + */ + readonly stretchCeilingOffset: number; readonly order: number; readonly posX: number; readonly posY: number; @@ -80,6 +88,7 @@ export interface CreateRoomDto { readonly wallHeight?: number; readonly plinthHeight?: number; readonly plinthThickness?: number; + readonly stretchCeilingOffset?: number; readonly order?: number; readonly posX?: number; readonly posY?: number; @@ -98,6 +107,7 @@ export interface UpdateRoomDto { readonly wallHeight?: number; readonly plinthHeight?: number; readonly plinthThickness?: number; + readonly stretchCeilingOffset?: number; readonly order?: number; readonly posX?: number; readonly posY?: number;