From 69c97c7a628587967db7c53e36af1ca1ae041e43 Mon Sep 17 00:00:00 2001 From: falconlee236 Date: Thu, 12 Sep 2024 17:38:04 +0900 Subject: [PATCH 01/12] Add error-puang.png : add error puang image --- public/error-puang.png | Bin 0 -> 30209 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/error-puang.png diff --git a/public/error-puang.png b/public/error-puang.png new file mode 100644 index 0000000000000000000000000000000000000000..6450ae1992da5dde4695f64e916499880a7e6899 GIT binary patch literal 30209 zcmV)}KzqN5P)x^FII5C?OA&q_)wu6I05V>bH zS|PV+OHL6C68K3rz(9g6=RjOBDb*lmjEWMDme%tdcUEv52X7YVt+^2fF^DX-MokJh z9BCrQ8F^gP!S+IYco@B%lbCtSJs=7z=rxjSE&eU!cql@$83cj58e8lF+*KrU;A_go3=1Tt>T{+@!EKug(Z1w z)`E|Nhe3$ZqZfz382}{MUxM`-;pR(*x7vQwMZ@5n6a#RAxBvzj7{RREdJx5I5yX`m ztvIYCe+{P*#BflF=}4eO&L_LLCLv?daU|A4dM6VM-R4Cl`8oG`A{e2(FsGN(aq@&}QR4qP4>z&TWri1hPma1#1?f(6f>VhMSBkEt0L1 za9*E#md+)@fe&L)kc^&?oG7f!8XY12^Nvio5lOak@g(l~`*Pe4LBFyJifjZZ2FlC7vU~;jRmYW-guqg9_p}B$(RUUSore{x^GJ5P*mw ziUJcXyb&xhYe_bGBUdX)#9oWyLOgFJk(1m^Z$wL(dV306vYl3o)^@czjb0;BucGVA z`+N;*@No>CaYwkL$$ZmAS#b~(u5Yvd%JUM%H&KamfOt8+-2{UK_^^l%577$XG_Bxf`rUPh4>2;+U$TXpJ*(R;xLTU=BjvZ zJtJD$!gSIlDPM-M+PyZb#YrGKKVwmmy&eqsiEJBF8b!y|wt9ALrd;|`F3tBXSyMB! zP#0##dE6Zqq~W5&^|%Pe_`+I6g6B(euy) zU~<)KHAi*5S&$AY1|Nqk;Gh-DRcp4I=k6k599$?Sqiswt-i-ls{%a#d(qI8Izd zgorjI&e;So)7O9|1 zuN(Nz zKSKm%iD_V7OHuKToLoi@PLB03@hk!3*%XOXD=AjPGI@Q44nNVw_hS@6a2 zdQfRJkbdnI)F7tf6Z)T?&gDg?Wz85B*@}em=-$5kz*O!^FV!CCMS8W`z5-St;It~3 z6c*DdCbL_)d+DEKcd+`y986F=!(2cSHWcTrnIn;4rAz`QWH@0&_wpGQg8_+MLZSRQ z=!&kC2z8J1J><3&9dpasbvSW0ZZBeWjp!aqqQ^q_I1EWl#l-zy59;$Ivx%yM`19C~ zmYP)U9XG_F!|x*YswEqmwP?860UMD>$$wpb3;gcdnf!+02B8r~ymu9}hPkz@fnwNJ;&t{O!*pgo^Ngp#Fv5+FzvA%al+=1u}6 z+tW<&kg7c}G+>sIbF{?O>R>2D0u@TcqU)v5r8%dSbfyn5E<{Drb&l*FQi>okYhkwQ z26-VD{~GXKQlKB<^CTaQkb_@Xd+(R>zIGa26z=n@;h?lkWb$TCHYzuH)s6D(C_Nb!z4>3ZfpT7T?S9tZXWUih0Sh(017kB;ugeW^z29OD>=DI_M=( z{N@xmxLT1}G6n-X2IYSuEB@xpg=9*ko8@BeA$^9(x#Bas-AP`%TKb%R!XPOS77I>Q zG^!h$z4I(3mbFKN6bJPP@maS_7ew1;L!=>P?F;vFSI-#F*I`Wf_Q6_@$4|QEN-!kF z2cnwxL-M&xhRNGcZco^ctBQ5oOQ9=>i_|kxiYiC1yT3gJ>zYDVh!+>JcnBLf*HSx} zLM|VXgCu;XJIOk0=1_u}EDLRCs-k3>$hy&@(TOWuAA&hEir<_T%1tdM!2_=&U4yxP zPAT7Mx#E!6u46^+6JIDG9vmcd2FS2=f0fr*Wz5hpwvV%8VzUQG$h>79FNj~n#YRTI zv+5z3I^M|{BADzZxg%E9xZL)p8eopr{gR`u#O#z zPvIEwIXH7wBuq#f)}p|%fO2Hc_=`#LK>EX!q5$pyq#6|3?Gy#@w^Y=eSiT2Wg- zKl%^(r@c1R%NFy{q|AHLpN!Y_PcGZa@ei5=Ys#g}10RM#l`v$Ud9U~vd4wpQDr5c&~=f@H_?R@EVS-aBxr z&a2B96rhHYiJ|nPUkTj+{-ggUijHT;jUO(2{MuvOh@@z?eN#yTe0jXCQ`gXi1jBht zZib+!$VhBd>k~2;&ZF%VKOkdnK3!|6yzf6dU~f@fheV4C)AFKJQsyhbMt>ENNLi!E zgb6u`%(1GCG$M>tL%4`6n!J#tuON;SWSN}($y$L2ZV{=J(%TgF`7O1IYoxJ0T!aKx zJwi2q{vwHNBgbm| z4&Zw`5p2WG3i0x(@g7yVwA65M_p#dHRBT$Z{pC(Qt>QD626A9~3P1CX3of22KD&G| zZ_qn`mgDtSc<*r6{vUzi2AFg2ZIJiQM~1T9``^WX_M;_vYyMJ}zvlJWw1u1Mo5l4j z*6d9F_dSy#CL+M=b%w`>0J@nzMKY?mkOT@BY$l$D4PeE(G^U5N`Pt&U)%SY1KrSxN zwCWWtfvJT&3Kas8lv^%fOvdvqiXliu22UXOQgjs!r#NpF(wrq)t&W?Gaau0)GknI9 zkzmkhvgK3oie!oZ<@7{x{+wjEWOBTA;_&b^ysuN%8 zc{fM%qWw!E*l%vW3|@SE2`3Y*w8085?yLl7g;Up{(d%I9g6m=I#Zu8cvn3rQypW2rxOlC0UGE(4N@9EFsUe`tm5j zFTlh_5vhVAi5So(9`hbgN!G08f_T2uois?>jm|!AR7WX%0{sl1v1E3;@Jygyo$$=> zGQ}h+_-%pwT7|hX*m1B14xFraj2Rl*Mi!68r1bdV;jrgeEj=MuwD)=Rqnpi?>k*Uh zzw;X5-dnD4eI^MUFYT^|W_!1SwoO87e8|j)zu|rExNV5#{Ayf z-xqS{3FfsDI2B!} z>*geLo(Lvm>R1|M2U1!kA>ELWxp3$RT8_3lyfuS z;y>I2fe{93M0@b*|HqOYYu?9Q>p$3d5>D587F0$hhOjCYY`AS?{KT|{ms=cwGB^Kl zbZSaU{DiTQ0TG6oBzyN|w+@k#!kjpp-2>|LNW;OQTu&AG z6d%#zs?KjqFc~z=#79(m<&9v_l9(nGwZv)ie!*o?@yEN0-5W?9JE8wwMS@QWAAvem zkMHNwa}#KV4@>Shp7zsN6!?R$Lj^JXqntm9*UXyeA~g~0xq?bC*&NWDpg1l2p4%XG z=2SFK;$IUp7UzmQ_YBo2zQ5swM{}vus`%vCAQb7uRwPSEUpx)ZeGf?$nSIYvm~qD< zn6ltH?&3e(3&YNvERg7sn7;U7=nIG<4a1gA4=`qpu#uCL@9r9s%O_Q2fZUx$ikUpQ zd_~~QbCJmLEOgY1f?}!`@ubZ)MbViGXz5H!*W+^7P7Y(r0f6t241c)qc9aV>^_H#& zK?;z{IDPyOdO275&mT8$o;D$U(Nk26I(qyF{)5$j6vhvaa}jKNc_TcXSJ7h^(HnF@ zfiUr^%V6@&^C2K2Y&Iu|Yf)*dUte&V_okRm9Bv?sJ$88J(lC0@8V)CZhE_3fCXy>G zA=dT(qpm<{bAQ1P897|QWB!Z@^>pZENW%maQB^(bXen6+St=J5F_g%ujw?d*z z{%mTtiI1(`$$4|3I*VUUr`{x(FX4HnaHULM7+ZTZgt}GSchQxz;FJH}2k}D;uJ69? zL_NH=zXq&AkNDjwBu*L!M3Ceu83uH*LWy7>Z93)g*wh3zhO5Es5XaFAtCjmg7ZMaf z=aY4810-7Jujg{=0KEoD{0Ha@sKmLPvwo14or({CmU2~;A9Pv~Oa!ClqoQEv81_yV zk@GmBFqeZ#iQC=(EBO1ed7Mt8X4f=31bFj64XiJ2fc}IgKo4=_#z54_;ZSw-IOOjw zhYEbKkZd0u(4s{}1Z#y4Hl9KwC6tH8W~3p9ZW{lKiy(T`2(Q11MyKQI%PJi8<)=r* z3?27eP04Nx^dd~9h2^0MXw`%JGR8i?6fgm5G>qti%~VWUqu9Nfd$$WsKh`e4b9S67C{rD5ityV_}O z#DxliQRV!z=te%vaUzi?R=OOGf;5I}A&5)G2D(D-z! z!oSqHO}Zw}Q33Ko{GqZ1PFz%0kh6t0ySy?nCR}gF2H2^4&MmCq$eJa^M`=HJ^$*;PNiChGi|Vb6 zV5gf0e%w%MsF5j2kbrKa#cY8sn-2mK3+j<F$L^hq7O#~HJM zvYU|XTC(~@k%=sd#5BqHRER7vvBi0L;Fh5lA0(|)ktzLiFlhY;lHf&j zM!tu@Ce*mOES}R`h_1)KQ1a&PettV&VQi~H9xXA!JJcxS|Pzs<*i<%sNRQSrY17+BCYMGaIES>q_hDzdqhhzKON89PukA9 z(QvJ=L4&ON3c(0{`p@Vr5;GQFBLeq9RBDPi_To8Qcw&OkTwfdD(PT%!t8{Pw~}haos33|{)bJ7M~y)??~?eypxdhs(hLA{JS; z;$8bdt<}Qt^Ri&{oSDG2(|Ow3*l7P^`Twb@>jzqz70?Hu%6VFQno-4lUqZ&hg?KMd zv)V#7-XhORo7k9)ltW|Is7_e^?E>}p%9?qgNH<^V#bc*>8XC+lA8pon81Hf z0UjHQ%GOL&7=0!A+;ky+ z{8*2q4~~lD;wPMgmaR%`sI0yaf7}psMILKxc3iq{M|oiW;To86!MU*ZpTC3Hh?e;Q zDY5)qK?Urq9{f`;%d&rRRyvgK*$>Bl+6K+Fb(D~1`;;)AEEZ1X@8Wn~{6~FhVG;BJ zB4Z{UK&5U4#?7ZO{jx>5&s0`eh$2Wf$^5d!Pl6W7?YQsRFsJ0M2WKHLS+!5lx>3$8 zn{y_u$4Hkdl3Xplm)mf5+7x-Z*6mbff>mMj_=&9P-T1ObytykMkPk){{FVBD8bC6G#Qiwdpf@oiW>&S)Lz}f zsM+Vi`O9vHkhoaby5?=z{nQ0awRa>)O?#N3b|Vk4Z)2M z#Pu|E8!LBm8#|v3?Ty>f8r{?C0wTwzVWKha*>%wB@vJ|a)G<>cqX^` ze_HkG?k5bm@G)Y?!g# z8X$+4`g=*6itrjnDNZY5$D-B3Y{W|Cu-i#UNN4vIZV@TbG`U1aN+R`4pm>g4%d@hp z%aJ3`Q`yfcV`;~Q2@abLHvKn;5$u6w*S8_q&dO$Z23^FniC_e>?sL$p;nSVDkM-rJ zDNT_J{Qzm`H4-{{ZLns@GIGrKrvWg#ml zb*%wuY(^vN<%}+6djw;{(z(VD5tj`F!3aJf;iIhjX+T)$m6twxU%SWsy!s6&-**V^ zyYm`YcFPs5_H8b0fVU3zSqL&H&|GJNt^a!mYKy4gnEM;b)Q>R{p7qTC!Kn`P6i zH&|`9G$!?P7=N+JFwiaK#FfhYTz|tyNJeAjiBD5?IZ61Qu;=q{;Bf9{xOeGQaQ|&r zwc7VJCYitJBt#Jr#9J?I)*lVyG$JIu zm!$b3dA@14F+hq)p68gA6SGC=cvv?%`Ar=-2a;USaz6tP_9W!F+!`tORfLKl4RW&q z*F`){kt7Hy9P4Z;5`j{jXJPCm2+Q1EKSnm5yO*Oe@>@ow0_Jk6fDw-tL6j{U6wx># zzA}xi44)twAu(g|3Yr#Y#%&8>$jD)??WMc-!`8KL!9L7=)NjPw(%eaJ-X zj0@M>kX*opNRZj0TiKM;(onr3x4}g=4WPlppTlEkm#znf0_YB9vuj&VLH&` z>uU4BrW7KF4P_c#_0i)Ogv4c3;qSa1d=ONQMSTfF6VpC%PIJrCK$=uC^@&D+Ma6|V zK0WiOH~5q#lY#ET>*zAvICaisc>k$8T-y&DEv!_^S3%_ZWvT(D#|O9CUe#=ee-~B^ zDA^on9=3e&8B}b^Gl@JuyL88^1>i@&z~{!oA92}TIwaV1!;o-z?%^9<+o@D)&7NxT zRRn2xcpxjb4Z#Re7*k%E+M)8?r%;hZH}`VTCntt*g7{JF%tb@MkA8vAk*v9*;ZL|q z!F-q)9~H{B(SSG46;}FmCCA(m21X`t2v7~Y(-5pu!?0gn32H-VvZ{%D2mI(4_*6_r zDw5#fKAbQk1OD~tMT3LDx`kiG$z99e(Hz)GFssVTldFwj0#Y}P3J_y z#mS+Nf$^RONn74%LpQKXmjQjC9-8B#p`l>Uu+W%E=KAu&pTLhkg-?+zI41o+oLV#P zfB(FT8zK!Gu%)aKK0W5!LdTrMU>F(hxy#eBIxD=qyAnzpd)6ahS!OH~QbM#Uh}5fL zd}IJjjtzv}Rn5?B?>y7AJP*xCG>gLl<`cy;BjVG)tSc)l13&ri1=r}IzuN|zh0hv6q9@N@4x*#UCEk3NOZkj%jg52}NM#QSdhrEA+4$Lf1+;)lLOowaSO_~GGN_~=OQ&QM{K{tN3s_L) z_z*>)uiTRH`ff~yW6)^WI&8)i;Prafya9gnJ_ej*(%1|0ug*@V+C)aO?d45SH3-~9 zB`8t;`hgla)DOdce~EFbl4wVbT_5gVj{-;#x{Q2)9>S*3KvM8XQu^X}@T1o;;3Ejz ztlZtSzTu`zT~=&Eu?hTWA4IeQw3y*K6&$PY-kcIayb2moWelB~33Xcw)Izg`hR`0c zBH}X@zThs-9X4)+IAx^sA$qLN0w+vo)(BI5g))rOD1T_ScQIKeAyngh#`1a{vt}5a z-Q|zXdLIKyvc#;#m*Fbq+RLZ8tk~w#!69~>2?#(-rjkbaB5TI$v>2PgJ>W;LVn9hI z3T#FWxMEH^dlZvGw{?&xif00dU^>p(1jw2Njv0Zm8GjY{(W@9(caek3hff$OjEFI? z$LX#%hUG*^OY+vz44EI7Gy z9~}O92h>+Mhno+Ni-8FjXG3Ii0t_bTiDXhiiasTY)d**zSsvx41+=M9sw>GcoV5KM_Z-)@BJ6U8uC z5a2dEdf>?6v>KT>W#LHhqgODHd9vg&=L`pf&KVON>Zh(OIwbNqOCv-(tdL;0vaaFH z*wD&V8aS@e!!eEbxv7uu*a_tak9PPOyT9E4*|**Z{fUx&hv2}*EznR^3u>JfqR?#} zj}|p3JgiIC(GMF6JXM3(9T(x-!{A4cF(4#MoHj2&uyEr?4v%NkuF|%W#=f5%VzSu; z=bGyo(Ub_qyNE%;O+xb3qpba1U^oUDJFU5O7n{2BN@%QUT~9eQJ`y&+ zyAlq5_bP%+@t`bQ)T`EOQG{8a>R{{PzcLfKkKa*lQx( zT?;O8?c?~q?+@ElR}cGsXkP>r@d38;>s+t<9UdM!TKd0;V$$f*i$lPV9%EpH55bX0 ztB4`a3ZBa5zAFZvWNCmAw(jNM&NJ7c8|i!iSQ=ZW7j#+;Ts(6^t8Jr)IZMNIL4gn$ z*7xnR^7twIDLWqbqzZ)?Z(@z7N$R!H?BN&K7{SGWA3er^kWAnpmez(K9sB&sroJJW z3Pcu%br))EfHTZa3lk+dslw#nBcwkSys7e_jl4KK(lw zKPs`!vDGI%E1nK$OEOi6vlA$15mLdA9%EqKMZq}-usnd1vcqFYJEssI7Zq3a`^Z*vL2t9UcpH z2TC9b$$D5D0ApuQg=Mbw7dO?9jp~Dmf93Y{>_ssgb1+D3u^1ETr}E z@djs%sK@J$vNp42db1jy(*%3GFAj5UoXtMq{SD6q3{XtQGuh5+v-ORiD8XHv-cwoy zcfb7&Y&dk%wM`cp0&%m(!O$zRU`TpuD}q^S8^BiI1R6;kP^r~$!P1){Mq>gg zvpCVihr+By*LRs<>>g1<*XZiw*dL))Bh5bW@vr4Gi4gR2+%V8ehssd(VZso9!JDge@lLl;Lh z>ogh^Zq`?Oj>7WKeuRvnF)%N44BJLASN!bpUeB*T=A7T4QR%KBDMrtj!WObP9M^j{ ze{ADsh!~avhNPBJ0C@atBAeCH+~)JNNU(_)&4Rp7zlBwA{{SaTtKq`w>`@Eewo1Ac#!rDz7!M789iDo19XW zN&|L$%Kv-)4tQhh9>^RT3;($G0#`%TM|&?hvNu_v;Y1~SU9Qr4Jf=4Z#y)570Y)Sx z$(pKbKpPaqTuIS`+&*gN6gYkSBoyyH0AFw1$rdHz(1rYMc4oVu8;C@^U1)}tsumX- z<1u=k)PNs7#(?Y{LMV5`1S|bwWRA~R* zsiFfWp!>L+SA%GGx{v5#>;pe~i~%88<=z(>5;7JQZ$DI=jBoi+UGI^Mx}qH0RtQCf zyP@V(8H`Vfhviq!L^rXmP-dxVfZF}1Abf0VrMh}o5j0miM}zvZ(geGHKEV2qnW}1F zdgds2{H6O_9e?ldK1Nrq%JrUV79$ekAbLa!#EuvS(W%MM84RB}6~a?m?xm*a6j)3R z5EK#K;kge?9S6badhaQ5-bWIOJJC|Ui{i{E+*g{r2LxN&_-n&~BFMzwX=;E5c4L#U z)yUN?yuTN1FJQpbBYY@tJAR;OIQ1io(s%zhnv5o>JAE3;4;_c9lO<4v4U<=^Uc@}@#ux1M)ybN*qd z!q1G7)VjAn-`t8|1S$@$#QUIS?{_~kNq^|XF_4lu5v`o}B8vF5*6|^UDkCqP4Z6_w zt49J+F=R?A3MQG!&WDLZk^fTZHJ}LzU;@u+d|)Uo+UfcR_|pgL;Lq2b4-=#$x?L(E zbMX2D;75-!a1yNun+3Dw*FWt#CQh3$ypOe+UeR3!7?PDxo{bZ8S=*V-v`)(!I2S+a8wl%HEd|R=NV{( z-=Q7%v<_FKDokc8Jom$PxN6cU7@y#*4JB8RpbZOTL@VFCAHTEHNX3MrdmE^Se9ZUF z8S59z*%Z_@%Rz&<*q~UyNjl>7SVkC6h6{8e_yg*LcftL zaoVx~v$c`Ny#F=YldCW?U{kjg<{bcS+DI5XCIw8W;)O&-pu4Ar02B~tt;eLXJ}A&- znYxQowGQ44jb@egqpVGB$VLRa?TxRXtghoODrJ>M_|5$N{UI#>r|!u3#6avGld!&cWZbh(eARXWY&L<~tAB^a`iVsobA~J8i$7E_ajv~kXC_jJAi{h;6 zyq6QIx4(36)sB}x$#K=Ed;3hZ_3xxYAu{l>zOP0>GwZFO|9?GgQf%} zpD89JP@K4Fhj&)m8ofyO_>YlY$-6I}28|f|R(|v)y)7y&T(cSc=oRz{$zrG8o)Ve0 z^n0YtGaT^iI6*raN%iZ>{8w7_-!IO8Z5M_UxnF(uBUmj~Av-A)`Wq(-_Q3JH-7wfd z-E3ZzdI5a+&2~6d=3S#OSJiox?yV^HI4n-lBrJLegkWOZ(ZmFit>8zmq1QA^YtL9e~{JYfK@f;_vG&ePKufCtl(PVZ!*MHWGu=A_+Fj(>WC!3fR z`|#UsZT9IEF&w2Psta2WLEtdk;PmDeh5jiO#(vRJ^4qxylNWj)7{re*p;t*3ecsYk zydbq&huxu?T(jeqbse2kydx(UnYQhv)t^x*NS9}g>Hw=nn}NS7{1xK ztIfXfz}BN~HJqw~Q(xyp<+j5p;U9ogU*);-Wv}o7P{#4lwEqx2^>*Q7ZYManjd2-^ z{d1P}0(y;PQ8SmuIV|FL_|hcunmNY8{}y%jTu~4osW&xoPptV$ykdA*zr|+cDh_s( zR(S4=NeOv(uzJkmDrhdRWfrg!|NVbQ3$~HhfW4*;8unmZCkRieL&aJ6A9#-k@#%!j z#cS9ca(;9hy;jc@5S8&PJ_RQ`9Q>5p{1;DlpD=d*z1=SS0WI4$P82r^9RCw4llw}xy?hA#XcxWWmqljYx&|+mU7h#R zaGFWZeSgBazl}6Itl!{E>T_`dwT)W*{}030VW{-4sL5Z&{<#V1i~fXn^!THHTI`rQ zBUAOtp1vbN^~n}yllRIAZPgLQC-ipbtM#to9PXr@a1RIes8VPg} z=E+h}&QBNB`k{EvpYaK~A|m6~Tj{s}Q}91ce!$h?ab{BtQs2M zX@VIyZ6ksKr{k|_@3^Ae95cF-|0~YVxe3WQ!p1|Y$iqdL|9ldOhfhP{7EFL|O2}Ar zG(PK=#o5^_{6iN==&>amlDTw-0OF6B);u5O`ZjuaWX6)Q=nL+{k6Kurw`y&h{h3SA z!ike(hZ|$}zW1IrF>T>U)bY0^B*%q5{>=T{s(sa5tWF2Ljk@v*`0}4G!I_8=cP|2s zq2rvR-B<_3WX&CpCyNVm9)=zwF`Z^k6>r8s?$`LXh)U>6@^iMpS&klCGR%ds%3QmH z_c#_bD#Omc9in=h$NgacJFdb@kB41I?~4m_4x_*SNb!j>{@>5OjZ!oZ$D5maea08% z@NQ=k0+SOuMKICsfU>pkqOvO#^#;KR#RaRsDlS-agF_I9;nQ2d|L)K6nTyW)iQaom zGL(7Q_-E=MtH+W9yWLJjevKS&|5rrjt&c@!+&Wje-%uCC%6HTp7cFlq&3p9)bUgo@ zm%E*7-n0ek>~=WR)Ci4^?vJ79j=-=`ww!4Q&lumS(;7uNm_(zwmZQ&5oBpAmx!WIihRw zRz0rVXK~o3N_Wzx-$-fRS`tJ)q())fu!S+J+-hM~t=87_0a24Co&#qRhRmAM;W5tN z@@L>h@v*WUt3QA~hRAClMR8;o=Gt;##fpKQqkMqS<1bC)b)ZY|8NR$TC2e6lL+5g0 z)xp)CdPDvd_wB3P@!tYZXQ7hyDM zUd;LE=UCS+xX4W0aRL-7u;6PS=T1VyAj6Bd{LKhYsR$XSF3Lt@hwge7J))Rz_% zw0CY;d>VQ=+>*$cw6(_a!n3M0t5+*=4OvUFRU(gxXE6oee!_G7XCiP%(OqcZ9HJio z;UiF<#{gKEkNate+D9-s{X$nhL#hf{p*Do7qJMRzpi78tV~s_8}#v z*Zq4n)Rvxx!G@&ku7Kdto@Y36;KQThz0bgWq8Q02+*6#l_BrS#s7Tmm<){l2l0|$L zfAl;Qv{Zt~Ux)9n$2{rF#rdn3dOJTUb3rN|djx%_c_lm6ybos)dcE8|V#JN1UN!&jChrg%Ns$V$0`M=#7Zy+IkF}avDPf>~?`#cDrJi5tCBxEki z0THs%Q_pr+Boi_g($Er5iz0VbX~F7GJ)Iw$zG#Swg9>bLccJR|Z#aw4r+rGO-mT80 z%~ElKT2O&mumm447CzG}u0mA$;&>g1f5UIE0IeFtEtn5#gZE*#bx5)>v~ZysEd;AP zd&xBQYvC8)!-0)IgD*oH5eA9#uJGt03T6u!f7%Xpo3>JS7g2Bs+e`9RcPu-$1IdaV z$6shsNq$a_r(+T_79GLn^kYf>>O~%}F?nIE&B2w40)Jy^;j3@LS%f~VFQa-lTy26r zKvltN3ZfRqr!U-yN!7TNaGlDriCJUxjf@AdiGot04%N zK#JjLybGQ~A>=}c8IcS-KK>dSYkVto;P62aaqdKjnl+VKGIucR^~u*@udRa-_&Wqe zgmXJT`r_Qgtc8~s@5uQQx(UJR%xwyy)nhmE_^ey5=LBI0KJd!DUBfPLY#3!;?HHWF zZx1l&i#SUQa#qKtE&KtAv%<7v=K>T(Abiew5Ikv|*K=qxa+AZ(7LdBF1)+5#_fp64 z5He~wT=?Lfm`vRT2fq6W$yN&kjgXNk5QX1MA3LPYKD(&_YQD{d#ytnYkQfK)3x3Vk zHj72v_x1Oj&1`-E59>C`>^vWgBm$kNt#jXp7Ano=5Z)3w@h68v^j-`q^49<-)Ci(> z8=Ph6-vKrH80fNGfvbPvGLl@#@a*=<))~;4BMrw-LEX-M(0HN*Y{vc@)rzcDc-lBH zWQ+rCRNKK@$u+Fok_Yu$^O3d$yZ!WKZCL~)EBU~L=t7<{8_fAbExr4e$0|ccGh2T-Ctk@Skq$7l; zW-y{8Zz|jayhDK0S<`Tt3c8@Sf zMzbYiO1f*Cy}kjg7{58tvN%wswAY)!igA(M)JSRy8;(t+1zj#qtpXm^P8yC|9UKIz z;6TvPNWrwAkin_F|4Yn8r=WJ@7BC+_$<7}=XC@3gZ!+kDy$?QQNQ@=&;!TL>;@fVM zj1&1=MNZgl0sC{XV#Oj{I+gv8&sg+3A{ag_9xE?gQv_!r&PbBk%)*r_wVEG$$s7m_ zH$X|@UMStY4~p^0-+-^RanTT#H3{^?liO7!I}3GaFkAWpmXdO4I(P&c&|M|+sP#LR`aU^x3m!e>Q8HB%QZD%#@RDvch! zIK&hvK7w}mAzc2iIB#{olyUhY&QN!8(ea^^(^4|8Yt^d;nre-3a>q_6*|`Vm%bh7Y zeM%Apjv5B~q(so6STN9_ILm@badXj07qO_aMVAl*%|}l_LfUvZ_ojJWy5^5BtcI#% zCk~Y4uNezHL_+$43(z#af-h-S!q+&CU&}d!L#I&fjh?b3M(Yrh1wp)w2k|ZuxL^*1 zCyMiPR>E0~GtQF5XD*%rqL?ylYF3+lWYxx8G@C88r%KSW?S|6_4x=)+k?mIn=+Mf= zLcoX=(8a}o4&B1uh~wIWqoI*W?=)ReGrEDc${G+X7Dg;RlHP!c_Mme{p^JFJNwV=> z=ZQ8bkX*Z7>7`myu=aZtI%aVi?pE}L7l@)`Aq{DT4>oim96&{-^yJ2E>(EVnv^X#4 ztRIc|j3XKTgKr6pFhE3dQoF~6Cnd0D!j+dY3s-UI7>Wc(!B|p;q}$*+P7@gcYP_Bn z1qoG1FldQ*C{U=wLNK<{03R6WQJf%%6r- zA;F^~A#7>}=!PbM9v5YN*0}#Ln<_WH8{Km>dR?z}F_Dx+s;GYqb8y+51BPR?8IOTm zgUCa<)(&5HSIImRaYm6WJacInDhxM};L#CIY|95zWfhG7#l_6RrA*0S3&Dg|rLnpe zYKl%kJ-#+0DQdUmd%YGBgx4u1Z%4(?(cH|04o@(Ihr*QcDG-;D3L{eDU|QB_h(dyq z)vPhwptQ*bg;kBPrNRVd_?oO;z{)Y>7Q*l-oJ=&|Fss&1m_o%@(jWHZmd! zxHzm<*KsJiu({Q!LS7pj%-+|Zu7Jb2KS6j@I6QR6)o|0*Gdh=1XfPjD+wOZYXujz^AFquq_kdP2Z9X|NN!ouV+ zDLBQNnf=DbMpckAhse3_H=E6L42RcrZLhDd$J{=r#`Ac)-LBGVwLG5BH8(d`3>h+{ z%Vl9_49T2DtS~EXT<4T(9a@;^(Wy|hH4jE#FsoliuL{Ea+$Dcp2K&ER5AT1G3%OhN zz=L;O12@c_<@KCza`WL-X%%E%cQteu=6aKWOzYf0j6R0w=;%8v7Rx`73}BYnm< zmprlztQtK$_?H~G@VdvK*vs70|9a^YAR#BI6LF>|U_2%?RMlWZ;RoH!nKd;v(~%H= zpoT6tc3_omm>S@?a3oADHvFNuq{s{IPo`~nULr1WNS0_^B5?`F_XZ@30bhsW5`^yq zaM9qR!iC63qpP)AXq(^+2?XTx56}&qF(l(TxPlsESbS`!&xss16!T-TaO|gTAok*L zbDaUXv=`j}TS&Y13OHI^30E%o3vAlDx79K0HWtF(L#JTO1+(P_)@7h@gGxHOiy|C@ zL4@k+>QHRdE0IVMWKn3*p}?fkXxh9+7m~eJ5V1=T6{DZg`O1YXA1!#y!NZ3S?|^RL zj3F6K_8vWAICK?5rf0C>2af(UFzFnM)6T!|PH4n`#jOv%0NV;$=5P4;>#fX+C8Tw~ z$k|j@&RQJ`G=t5OQ7`KYh&=K_WTHj3Y_!NE=xxXZqtBqvMhp1WoH=v4HMaX1L9(IF z>id+Tolq6s5jko&=A`1_z`700bsPwgRhxOoB5-JRaQCCHKy6(Eb00tXW-AOy9R}(i z3{zfy=!l4k;rf!ooW7Y!z7NpQ&@d6bvnOP7xf80pR=p#5vSKpHFfQzN-RBuWGIaEw zi5i~F+`q0ONTUP8jC4k@LmLKeLJ}exm4OwPRlz@A_z1QZI)|Z5&g%MuLy6jxB^)Qh zMi?YOw@i%<`YCMOYT0V_g{A5&BoU-~8v?qCL9Z@SHwygMq-MC)DRve?YCW@L!Q)cl z(03alY0`KIjT@M;7^6~CASq)aeDw7eIDEX6DV~w3$=g*(t?Vx>7Te5_V#S5t$1y!X7b+h|QkOl*1RC2>F zoCdsJ3p?H#*!Gw*B@;{y&G2*HL5NIFgr4B|*6sBFwTPV1Emf?)fq5vJv+i$dDUsiw zkUvkkriJbWE$i#h0}NV{C8RI@JwBn=BxO#5F&Ae;PY|gOX2rpV85vMldKz|p`V|Zm z$eO9860Lx+?svmsJr44AQEPdpH1D-8O)oqUKue-Wi}63SVu3I~P{w2Odqi_!U|^5p zh(YHrCT1?uOE0dTsx9zwImf%#+^9NoADqDQ2*DXZ!)=mLYl zZm~j7a9~}oTst}N1C(?Ejg5_WVxvA!?Byx4x&n7Mk?sZaWIu<7hW2R6*M27%O>K)0 zheXlNkKs5Wkxgf;0RF^Akr(%Hf~rBIRhMHfH39_3C{86#0Rhez1;<2vXb7auy#nGo zF@s5G5RBpnEe$pcL|!%%Y?ZZ;|ISB{eeZ3ZD$(j~I2_J`-iGQL=nklZ>WOUypwa8W zW;RpjGoPNi2;H%XXvH2wfnh-VH@e4W6c-}N-i98c&%e})6)X5vpPamcQ^6b%#9xTO z4a2X}WpYz@`{)tFAYtNomN!xk7SkIr+01aH&e@UET2TY#Z+-##pg_pJYiYaP`+FPY z=6&dj6hQK0R?S-n&7gL!~S^3DvR` z2nY>@h?GR&RcdU&fg-O~GqO_&kfpJaH`kj)RK-NW?%>&2gVcLDJgi&YJUWXIjUEEk zT4=IcK^q+bL#~(&r{7-(KfRO#Qy1UZZx*e%U^iR;@$PxB{HeE~;JuIG+}~W^sdFn2 zAA`JiKVtK@#V?o-fq?;B)uwHN$cYPaw@;D`t=Q9;==BMLxmz-{V*7eZFm`?D1H@-7 zdXN|34@e3_Li%_}IX4pwNeOIx3SS1fi-+r4#>21Qu@`E--^vI+>yBF>AiQs9<|He& z;n`I%J98ww`mej;U#mW0wTodfLtxT1S9+E6tB;+4BO5kB>E1(Z%#yg9u5}F-)U2NKDfc95Yoyou%3JzG2T1sQP>ZD{rEzjK2Cl7E=S{ zKL0WVqLcXf+DBboU|xA^9X$K;XRHc@+{TEcc+iFfJFPlCbSn-Wr7C*}3e>|dub2*- zlScy|7~r}tj{?fc7uJY2Q^P5>N|k+L+bhSx2Y?NDwApN4k3{Q}fmP7W1FGC70x9bo zJrPb>nk5wj%lWYj3n@0+R|22<~AQb z36)=L05z|I30GYTLo>Tq5$_FlvjsM-T1(X#@W1Dl!JO$6TJ0|>uYsSo?}Kl03!ui> z04Iwp!C2P_;o-qBX>2k~7@Go%ufLFy@ZvAqdN)Evm00%r2VgZdkWcg;KDToPPN)#= z>eAA}m;2qiVZu2I8~o?khm8+_9=b&wC^t{MGzTwv?S$ke#yq?py3VV;pTb@auGMb@;V#x;K@f8 zz>U}RY-;71pYHXz-EOR>NdU#B14lTAxur&vBQ=+UPc$I@y(ll|0Q3Wp1TP@L?&xi~ zo``}8ZPq=-Tj8+WUrd<`Bhtx)lkW*h`YKwnCD04#G0BpqFOCNHKk`m ziklq*T=YdJ;&i)RG#8g~VpFrwbodzGeBh{vQa>kh+{?g=k7Mk13i=2ra@(Yj`Kb zvXEpO(IpG$>bbH7^0u9NE)(RM$M(vy+^g-~i6>h#hQRr>Iw*`s|90xG6dJ)Yhw*Gg-1eVb)!)7!58!x-&B&nruS|PSVJ9xuH0sH8#K~izYp93%*hH}E1He#z z3QSS4U=B5ad20cbef*zYIUQ-+;Z|h1y zu_r>cM>6;8E9HKrSVC)zHIL$YAHFBQeH~iwE$!Y}WaiSV@hjYiT%JMiGm~Rs+VBK8 zRaFb$>^cNvFFhZ|TCSafn4t;Pi1Vx3jAp;_Y zCPMVcRL}(WPJ`=hSR8gZT3^A|9YM4^*jR}a!;#d^Y1N>@7>*{JaEFHH;PGi=U`Bid z^c4TtRSKULbzG{bX>Nj`no6()hk^#(MF%Qv%^_hRNONo(UwUUQ>@#Hdgm1OSkm82v0)#@B3@GXxdi=BFVip?(M z;2E}`V zvS9~UbUK)FdE4rDQ$-aNe()KRtOzN?frFz(#a?@Z18GLPX`~lAvhvsocK%NI0xet& z49%Db@sq~;4B;YlL2Mzi87)mvXKjXVgZ&e=&Sx^S=To6J70(A?AjOI=gOoa^~ zw4$|Jsj^uitmGurB&R~~*pWPZ{56OUj)rx}g>C{HS{k}fFDP zo)XO4XLZHpY!C9NSNQ$kPD)DJ){11zg4u+PafaaV=dQn4Oo<3<^{K}yYv9{GN7xvE zY>-a{4zJ$?d%j!;q|7=vo)x!t#gJo;oh<}TB3&)In0248gWb5$@B%b4aMXz5pq4(H z4Vu?WKTKC4lg*0mW24;yCaW3Df(@GOHV`~C8s|Td11;upBFaufLu3>*42g$ujE~4= zs~A2SK0jFlzfA6)+xY(R>P{c4Ycv6Gw|m^KF*ku-A4sVfp{b@e0lEonw9)t^e;*rL zusgxr-z(iM<=Xvtysl)HZGs(%CVvx-eFq0Vd=54>LO_iP zX#Qor$%G`shST5_NwnC&H

YMY7W<-EXgK?DX;adhc^V=o(C5Lz3wXVSHnau~SN* zJ7_>r6gt*mV@p*MM@bkZk=#k+ehyi#fPjED=k*ml5vwDzDXlFnlnWd-Y*-O(b9Wc# zPaPgl1oL>IQ#JJvKdz-<+S=3v8~?MKRV$26h=HA@oqw8k7Oe?~ijvg^row$}GC$pr zCx!jcB5)rCdok2J&Ip@C}-QDM;4vZ96v{ZgP^K$q)$|d`*%$!89ZmbokyD z5D16sx;I+Z$H!}-%G~)$CHQvYNwTU0>G9C5nGLD39vj-_GI^BlqC0_<+uUE%d6f4G z3=Hg3>(x;Xt}ELmSFr#SP-CUSb4$ z;PRP}mK+a#4T|k-c*|C_mSi!_mDOyj+EdTI4E0;{Kx}pjVYNuMB6BnBYixijj6WRx z@bqgBP58q%N)6kFE{`cDj!Ec|MMpryMpTV)5D5=87JH}TDjDTXR`{r>YY#WR9fg#W z+(;Fj&eR;q52E9H8vT;%OiJi`=38pFP~3Dy~l zUY#{fHY=$++X*4cNGC-uh^WFS@|MLkp)lydw zU^3!odp^g3?zjW3ZSkkyNO3YBkB#T1z=W*Su%VL+8j5##^))dDn}q~fi)2x|Td~eA zGSP@!6od7Jd)Qeeu`}wTG8U7p*pJ1<#Sg#m!V4~Up;fEXCuUUCH(P)8*7kke_M$R$ zdw3Wb(-I@Zhlj$2<5JO`41tTskA(Ztf+a|Otp2?|4;n3fHxHIKh|Y%KBpg2dEJdfF zY0m)=@C)k`6PSv^$c99#K~W+AiKgx6ar{nT+)7P_sw_gw+a`;(Xmy*yqd>&_x*#D8 z;sUjuy6&2T6|kYx(Mujl;w5bs?lG~0eKQz+779|dq*TCue&IjIo0s424D`_WX)6@jE?>B)dZx@8m zo(92b^LPv=IFNuf&=@fUI*YZ3Dq;1( zO6U%n!@?o3*0YOg2?>S9?am1}1h>=+ehbvkg}+B;-g*wFcl@sEr`4<*2$I2ojq5vf z6;qV%pF6qSw@K%^jwgX5GBUD9N#@>w9CLYFdpcgS-0wz3MYS34-POt>vX)%Lse~;= zFnW(JBgBMuZfuKh_W90S1~SXH&F6I4%o|DdOX*ltF*tN0Z!u6+$#31 z99%EOIHV$yd*}^nxq`eCiL!T(R>La?DxkZt1_ram9TXQ@>>^a>@0P5XSNujat9Hbk zcY8E8FdYgVYiS4pPjQwUYq>9S>_wFkv?j|X6O7==mFx?65@g!j@4ip*05Kbl#)mz8 zgwv8ye#~xjyn&Z-l^oo7Zs)sQe7FBN_!{UZu_D=2^aR5E-lLpA z6WM4XH8Mu4V`+fiMzi2_&2^^s-8xQc(qUTfabu%hfK~fX!-vPaH;R=K#)P3vc#(-u zB~`{@BcbwtAF}uMj)&wN1$OZ*v|#y2l3#ifG?Z3KY0cQ@DHO+$kPrwCc9On5GIfP$ zJxwgT=e|5i`tn-(PEW+g$Di+!YAR~Z=-?p4Nj$7eeaLn&GeUj>u@ zQHfNe^JB{21I?Igi#UG<1Wg$0I)>CpT69Puc_fiL`1M0SYK3d5V}IP&bo)n zGr>$|E0iIjMoD5wnXv(0*)%vN3$ZhC1fQTr6I6WoC4`lffgyW3@cNb+Q!Mz8CKpnJ zKP)A+qp%_NM3JOeOpeERNBg3XU8jenARPp#TU!t!*BXq!Xsv_|Qz@2mr^~2Dp+JoS z6b+)&RhUD=L8z;Tsy9A_MojnE26ZN=QdTu8~P)om?+#)C&8Zo&LEjnjrdpzKP@)-9qNiEZULAsv|pijjge zJRGYx!y!yc@2hQs?@H>yWNS$rJB;hb>gn+KJ=e6FklHaq>af_))o(~TXZzF)T zxj)hKBoKW8Z$xwdeC7Spf=TBMXpLWM@7f$HMIf3GyuD&K?aE-%+E` zB`1O|ItnyV;lN1`2}f-m*yF_adG&Z@eXM>K*;WTO$EL(IbEWJLPeIAjClE&`h zhB6*w_opC8XlQ7s;xA9=3DMfCobTwhJkXAEpX4SwQ0%xcE-o$?+WYLt%%%9B7yEWV zK_7+&8>R{sM(vPDFwC6NDpvCb5=erPa3Lrb(Ar!4rX*Q#)oHI1KJ`#;HsF&Tt%f+uzUC(+`MPnM1r{FgWtP5eh#@p?w7vV!UbhaBDC zruw}hA{tDw@gN*K2`B#do@=`(kxFn8p=Xe<&>2FxW7g!+@VEQtL;R317m0{qviz=$ z!`NrIk%)v1BABOrow|1qr0NTzxo@M_?j)1%AHRE5eSQ5oXvI2AR;q&H(@|CAvf(U- zT%yIE@J-Fobl?caDtkdqodW{{TZto{Kv9zwe|##PY7(4vijBB7D*}3|=CB5ZvYJI6 z_tE=?s2FI7i36_A1SPM(2M&zCs3ubuA3AGgItSUQ>>9?V#=(orZ-%JwU>A{yT=JrH z4_)6?Y#DZqsy9fYm$!Q(Sx2Pl4WfBF-rKc3E%J9mH}Rp4+(g&43~37uYL(`YsF3i_ zcF69QN=j6dRSQi!2XvhnjjA)C+?1eFGoo3L&=r_4C*i@`3*ChJ0twLuxOM(axP0~` z2+(U1Q2b@uxCN?z-odPuuM$j&u;2i= zB6|YN$Q%LVN5+F5MI(1{L+<-Ui|D0ZQF*))ov}3S9V361Oze)X=fF9NncA;D<*zg#;2w=$#0fun^E8;R1&zLjbCHd?yDu6_8wYTl1lQ zOCEbI%jUjLFn8#*>WVj>T5{j8gvc@2phsduOw#N1Sx7DoHA-cUtg~p3Odai`&#_DK zE{QAcS+$Oc=1uI7<}3Rve#bvS7trd{qOz8(z?|7~@S|PGgp=iR0+CJ~5e{0E%(c;x zz+pV63ebb2*$g7p=vCK(1(ib!%JG6UxR4xo4MH5{>~MM2&X*5iwr&(!j56{=*Sd zmQ3aB{9AatDd0zk;27bg92LFyAeqZ>Du%$uKN+OtB7EX-1TEb6<%3pic)tk@44jXR zZyJ(IuPmSPrZf_ILMkQXflWPCjL1ams9ekaGh~vv1FfSKA11%SIP)FoBHHv0tl9d? z7L3u(6F6}NCvr={k9NV7Nsva}B5?APt3?--qL4x761E0ci%*bys&~BnKYG{L_*)$| z;%v2AJxA$Mxz{Orf~UC5y^P7--BZ4nNg$1D==C!!77H8Q%C1P8xRcerY>HmH-#b|` z6g%F1=9y>SgKnVR$7yut(p2=UU%{8z;K$hs4oukG|7*7g|IJwVOsihe>({T>CnqQW z17ooz*zjF*?#e{#NF7wZcSyrCc&e_DkEMkgywW}Nc5UT7c(Z6qRkFR$L{v32G;}H_ z<_VqhSt2r)OvNJah_$rQ~4OlBUf}eM{TRRBrTk($1 z13v~k&}xYvU~722YR4pVE}pzkS-M5&NHuhi z^_0g_akAXK#*@3Kw4_MvO(=H!5?$hsCm3i4J(jo(X}71SRgO#XO4s3c$p$|L3+k{n zeTvQagA|efGB0mcuXd@}v15lOJUsj&6drEFMmq%?ZHzlHl-5Ssz?H;Ox_q7#OHbEy zhmuT09_nf%&j{m|Xm%ZgpY>@`QPHonva*_>hv-!uIWTi+T!1KE!tvatc>fpTSB?Zf zdK+gg;H)4kDDyNHU4iePNCQ_#9yh7EWUHf~B_$KWoFoV1q5`|vi{ zjto!R+|iypDNkKXmXef5VqW1mu2%%%K26p{XWcU0F7i|GW-sAH zaXj8}-;aRmhYZYjbBD13{fsYjg95alp4{|ekKCT##_{9FsWe}Y1XE+1N|IBrZ7G*V*P!ca zBqGtrbNCq!eC2L=x1Hnq5SNMt~1Z_Iw_NB?0^7SKgZ zT#^VnZYVDbLxJNHLEuBM5spHyJXYjD4+6yE6F&mC`OvTmoE@!BIX)<;F1Q>utSV6u zPhl)xf!m6Kb2M-o*rBnij2$I^{TN&rv{kB|MdGw&0gbliR2A5x*am?MM%~JQVy#-_ zI5iT}fbLeerU)XSYm4OJjJzPSVY^TpvkSaXtpdIoM800I2^A9~63cUQS9Cntv>$%> z;fEi7_;HrOXf&Q*TwLtW$NJ$%Ujf~9jmc#Cxvs9Rdy{SV1NwKOEJ#82@RRH;2N5ebH&-=z^5iJBT0H>?H4Di!AJ?h4 zsNAdJjgAKv3MyzlSv^8@I;e2;X$L^5=1Y1yOIYR?-pW{e327=DtS1&~Ok zK~l}ZB^w**6l{#6aUF||m8Zt3oXAhvpUZt@DP`wMsmn;K&W=PdxxW?-9e}S*c-&@O z-qGvz@8EGgir>(JCEltjKHB;5n(LOy`^x)Zm* zjLWBZ-YE~?HwwSg8@Qez6HLAbf^s@1<--KO^MG41fURl*a|l-5k?Lek=H;pn{-&o$xtD_nBW!fn87 znDCkb`0)4&FFD(tVDfjO?@QmCTwx-b6qkK6Wy+LmxK2)Q)R*vEG9LvtqBv|Y7vs}- z3O1xHT#v+U2IbVTGKu6_FWo2Rb9d>K?w%(ywMR1Lx$aO}H03s>%r6toU73_sK`EvR z#AB|-eb?gmI*8xvOSE94@t9TwlYSqz$lqChut=}-@sQv70>KD=OXed$H7pvRh^k4P-G#`aQnDb8ntFaiY%*8sxWRK7!KH(yXwsu*XrnNRS(# z5^^l%E}_c=b59z}Gede(3YD)rBAEL*%5&XGro2CQ3#PPc?k=D5Gi6fAQy(b_<}Px` zZlX*u-1a!SmQT-|In$>`rHAAwYP5tNdW^4I9-=-V+S(JJ=2+$z~6k}a3JtE3b; zx7*^0T7Mg|>2!UzqgP4Gl8*Fk| zd=P$1=0n)9VM9}8W##WDOqj3^iS{U3wR7dNA%fg!sgWtIg0c}4WQ*WQ@l&ql*Pg7I za=&{*T1I;$bGKe}Z%XT|6fR_t^`dET3G#Pwm+6%RqXl2r;JzD>VBdg`!r#@!H^9ja zbl<*x;@GiczudHG(=Sh)IPoC5KPDxaWEos;wC*vEtlG&^xqBSs$+9SqQ4+)5WN&+iVi9Nw*!}{X=!ObOE7}pUGxEvtGIIIN^Zr9 z6)b^bIVMrWBOa?br0cVFM`A}O@73dL z8SSZxGL+<^?P#$X!93-_lrAE{`8EA0QJ-cB9-ansn_} z)}bR|!|lG>Z1Xffv+^^PmHD3XVRCYu;xANFT`H*Zew6W=9D_*~>_lB%-JOW7fm(NwM<=39JE8{b77K~npgoH2!(Y+v9 zd0nN7Nbwggn|JQqxey;R#RwvnfDamR`0(NEOTPQ=yMp3Ae2Qp(lKBASn2bm!$71-z zR$*h}!^6YXG=mAgC%H|90s$l2R(^;cN}jyMQtm`+ zk66mOL3ioiJqA;{h!|V4ead9H@-y5M&1AuN!lauq@E3dp#9}^Sfz*vk3MJEc` z+1X^#MCa+wi}^|BhbM6If}~+2L&EXs5~;BmktuQE}70L^MCi1{hL9b9WbMQN_o{lklM; zqG1Cii$)707oMjk(xE#=?|BqPF1-Bm%aTzPRTvfB6gbu(spkK;eT3W{-%7AXm|jah*_9R3u1OloWbx{N$2i`1(ZpV;D&BS!#9L#l{~+l1iYUO~M%A6IuNjHnAOq9D5 zOgW5!QixGrL)oiYBAAH3!8gm6Eqe$R#6~0&i&5!R{Qd%d4v!*`h;Ac?1miF^1NzOR z--(X(IpM>fj2>Xfjh6^UYicZcd3hp|hs7M&fJAKQg27-A@afKoMo)EIXeLbuHcA1H zr4}q~*s!4v-KVEkty*>0sZ*!6U;`H2t2>n4Oxzbw`@D5g@l>0r6giaENq$X=qB6yx zj3Xt1!*bxjfq&q4ScU|nUehi&8uxMd{W&@1A%m zH5O_-;)oF=7}2nCI*djmnG8lQY|!LB*@$Gg&5jM!K}5ra#sjeb;SYbvyWoNgeuwVX zqi6x^-GvBG31j!Qw`vjhW0jR3?$W!vCBp}V=-$7LtQVC>)z{Y_dE<>Yesk@$*RGZC zlO8m*4;0e8{CnZKoD|=Ql9VqWr(F94{3P=MP{YBbDhu3^XreT-lYpurTVo@pM#BPr zB#j-P=yrUv6VdGG7Sgb5L^xVAD~EBM9W7ZC=G8ua@WBUvwQJX|53w-|N|(+Z?sbsv zgz`i%Wi^Mpd+1I!BA`a2;XK4&VtIM_riUJSXvvdLKDig~U8F^FgPBZ^F0vRD6eObb zFCZBOjLAg$O(ZFw-9P2Zq~DUQz=z-$K70q9thOmDKaf-$x{sV({ZU$4%3~uVwUJau z74D~s5E4REq&iXzLzA0hBc*NZ9JGY|v(G-8ebrT0-5nVjIkF>_(NiI?yGY@_c(Po| z{2k@S(B*C8BJSS3`)N!rzmB;;GFjvTQ^}MAzlTGz)B=7l2U?2iN%&xaA$kF_wC_{!lg!5;Dn{{@0(lN&6h<}_LwIadJO=$lGPaPsFOf|pk&Tzg z#)wDflLARZ8#ZiM0LE*#q@|_Zi2Fm73Ll}p@+ze(=pJ{u6H7@XrF5^X`ao-3_1$;h zJ#ycD_x*&I7bNS&NF~RdAi2kAwH-)O2U<-Bx~~o-BoWMkzlBH=zAWQYiIwy{e2Qp( zb^-WB6x#@L$rUM)p`j!u3gmJ!qTM@y(TwV+AgA1C$UGwoFc_zM6_173_b?GCG%0V6fZd4 zM|r#Sn#U(Ok3{2WAxlM8jp`f08E3Ox8dZl#iEDWqa~;Wr#281tdiCmy&OiVB2hmDI z%M!cdvt6&11XB{oZTPiTgZ3x~@kvNXV8^0GszcZJ@BjSgKi8pp*dQsWOd+K;-mh%M zDCQzkk+RA}AF5R(7ZC|Y@tHuv5V?uyBC@(gxlkDV622dug;e*)R5cPq6uVgCLRZOw z@fF1`)cEX3Fs3YqhlkVJhQzU91GSD6T8;yuDkB*n{U4P+QP!Z z*N`+#ay7gs>!l=DN0v;Pi=%EVgzD<*ZGZaHpRSrefBr{EFcT@EB-S9o*uBv`60vBZ z`^LqNLWvC*+V4PO*-_kZQ1Y3?5IGJbvB;MRM(|s*K>|5eBgmGGy2Ie&s@{)}k0*=9 zkyVq+u}~;bVFOhuDn)q7g(Pu=Dn`h0vq}+dsb&qlHpdgoT`}5B~|HuFQ=RY)HsT^|&cn?&$ z!pJ3+N;xoH!CXTk7bW09ipy|ev6oCPgdkPPh`vlLCHy2CgpjHpM7bnOsX}4{<)tbJ zxg1G_)`UZMl0+^}BAXnqsik9h*{acNs{BW*HsQ)Eue=^D+XZ;}0QV%aaztX8TymZb zUz^eTyohDoi(FLrO9UmikjO>fm%6jac`#W)B=||@ zN1vi~!MRiNmxeHqtNB|={!+(J9%Ce)EEh@svQ@+5N%H3<$zOIMd34wKJMOq+_}sa3 zFG)>Jy%sG`w7W$U75%|*y9r74?)vrXKSGioR0f zs{28aTSGUJ!!?yK=@%?mkb2&E=Visl#!f;@l#ImCl!2yNo)3AQKH35 zRU?dGQoJT#n>BhO7C0+3DBcofK|_kWSe1s7T(pqoqFk38bGcbA*>Hg`OY&WXpJZn! z+`EKG@fuIDnz9y>szyjG!5E2`R7jqL5l|$sDPF@hk(2tbvFl1!i>ZJ_E~)&9ESDfz zE{Bp_a?AyiS}2o?)Iz$RqA!}rac5Su^e3awP>_qIaI@smoCG8otM#KqHYKhpk&WB! zQqq?a*skO-x^i-bKgC#fBoif%X`uwSjo#Cm63EmmfX<;F0_dKyBr=K`cB(T(>*b)K z0+3wH@{w97)f*~@zGCj;nMN>zzjpBqheR|^X(3PmVVy(Cg#>3pSd?;8r1FVKK8o4c zDUxNQiVIG19Yu5pd_$}Gl z0a41|vW}rN76vJhWYxeq;uBN<(1mnJV`tD}Lt(-$TQ(#RE7Ow8wa{|W+D4WONy#i1 zok!)8aWo)^?(f|Me M07*qoM6N<$f}I8s7ytkO literal 0 HcmV?d00001 From d63c4e90d417b0613ac7ab4916272eeb4639d463 Mon Sep 17 00:00:00 2001 From: falconlee236 Date: Thu, 12 Sep 2024 17:38:40 +0900 Subject: [PATCH 02/12] Add store/constants/errorMessage.ts : create error message constant in store/constants --- src/store/constants/errorMessages.ts | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/store/constants/errorMessages.ts diff --git a/src/store/constants/errorMessages.ts b/src/store/constants/errorMessages.ts new file mode 100644 index 0000000..68a82fe --- /dev/null +++ b/src/store/constants/errorMessages.ts @@ -0,0 +1,5 @@ +export const LOGIN_ERROR_MSG: string = '로그인에 실패했습니다.'; +export const LOGIN_ERROR_CHECK_MSG: string = + '아이디와 비밀번호를 다시 확인해주세요'; +export const GENERATION_ERROR_MSG: string = '프로필을 생성하는 실패했습니다.'; +export const GENERATION_ERROR_CHECK_MSG: string = '이미지를 다시 확인해주세요'; From 01dabf6820e09548a41e5590f13a7c46fa5778de Mon Sep 17 00:00:00 2001 From: falconlee236 Date: Thu, 12 Sep 2024 17:39:05 +0900 Subject: [PATCH 03/12] Add error/page.tsx : create error page --- src/app/error/page.tsx | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/app/error/page.tsx diff --git a/src/app/error/page.tsx b/src/app/error/page.tsx new file mode 100644 index 0000000..6726421 --- /dev/null +++ b/src/app/error/page.tsx @@ -0,0 +1,39 @@ +'use client'; + +import { useAtomValue } from 'jotai'; +import Image from 'next/image'; +import PreviousPage from '@/components/PreviousPage'; +import { + errorCheckMessageAtom, + errorMessageAtom, +} from '@/store/atoms/errorMessageAtom'; +import { GENERATION_ERROR_MSG } from '@/store/constants/errorMessages'; + +export default function ErrorPage() { + const errorMessage = useAtomValue(errorMessageAtom); + const errorCheckMessage = useAtomValue(errorCheckMessageAtom); + + return ( +

+
+ +
+
+ Error + {errorMessage} + + {errorCheckMessage} + + error puang image +
+
+ ); +} From 475dae7460a5c7afcd342bd9b0d625f654733e61 Mon Sep 17 00:00:00 2001 From: falconlee236 Date: Thu, 12 Sep 2024 17:39:40 +0900 Subject: [PATCH 04/12] Add errorMessageAtom.ts : create errorMessageAtom --- src/store/atoms/errorMessageAtom.ts | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/store/atoms/errorMessageAtom.ts diff --git a/src/store/atoms/errorMessageAtom.ts b/src/store/atoms/errorMessageAtom.ts new file mode 100644 index 0000000..865fdd4 --- /dev/null +++ b/src/store/atoms/errorMessageAtom.ts @@ -0,0 +1,4 @@ +import { atom } from 'jotai'; + +export const errorMessageAtom = atom(''); +export const errorCheckMessageAtom = atom(''); From a97dd6d6d3eab3bae89eecfc97b11c473f334712 Mon Sep 17 00:00:00 2001 From: falconlee236 Date: Thu, 12 Sep 2024 17:40:43 +0900 Subject: [PATCH 05/12] Update login/code/page.tsx : add error handling with redirect error page and set message atom --- src/app/login/code/page.tsx | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/app/login/code/page.tsx b/src/app/login/code/page.tsx index 57c9d15..80c3e88 100644 --- a/src/app/login/code/page.tsx +++ b/src/app/login/code/page.tsx @@ -3,11 +3,21 @@ import { useSetAtom } from 'jotai'; import { useRouter, useSearchParams } from 'next/navigation'; import { useEffect } from 'react'; +import { + errorCheckMessageAtom, + errorMessageAtom, +} from '@/store/atoms/errorMessageAtom'; import { actionInsertToken } from '@/store/atoms/tokenActions'; +import { + LOGIN_ERROR_CHECK_MSG, + LOGIN_ERROR_MSG, +} from '@/store/constants/errorMessages'; export default function LoginCodePage() { const router = useRouter(); const searchParams = useSearchParams(); + const setErrorMessage = useSetAtom(errorMessageAtom); + const setErrorCheckMessage = useSetAtom(errorCheckMessageAtom); const setInsertToken = useSetAtom(actionInsertToken); useEffect(() => { @@ -22,8 +32,9 @@ export default function LoginCodePage() { router.push('/concept'); }) .catch(() => { - // TODO - fail page로 이동 - router.push('/login'); + setErrorMessage(LOGIN_ERROR_MSG); + setErrorCheckMessage(LOGIN_ERROR_CHECK_MSG); + router.push('/error'); }); } }, [setInsertToken, searchParams, router]); From 1ac8aa3606b6b596f32c099c72ceddfcd88f281a Mon Sep 17 00:00:00 2001 From: falconlee236 Date: Thu, 12 Sep 2024 17:41:34 +0900 Subject: [PATCH 06/12] Update login/page.tsx : add error handling with redirect error page and set message atom --- src/app/login/page.tsx | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 32c563e..5fc2a06 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -3,10 +3,19 @@ import { useSetAtom } from 'jotai'; import dynamic from 'next/dynamic'; import Image from 'next/image'; +import { useRouter } from 'next/navigation'; import { useEffect } from 'react'; import LoginButton from '@/app/login/_components/LoginButton'; import MyButton from '@/components/MyButton'; +import { + errorCheckMessageAtom, + errorMessageAtom, +} from '@/store/atoms/errorMessageAtom'; import { actionInsertToken } from '@/store/atoms/tokenActions'; +import { + LOGIN_ERROR_CHECK_MSG, + LOGIN_ERROR_MSG, +} from '@/store/constants/errorMessages'; import login_character from '../../../public/login_page_img.png'; /* 기본 글꼴은 cafe24 this is test */ @@ -16,8 +25,13 @@ import login_character from '../../../public/login_page_img.png'; /*
This is Login Page
*/ function LoginView() { + const setErrorMessage = useSetAtom(errorMessageAtom); + const setErrorCheckMessage = useSetAtom(errorCheckMessageAtom); const setInsertToken = useSetAtom(actionInsertToken); + + const router = useRouter(); const storedToken = window.sessionStorage.getItem('accessToken') || ''; + useEffect(() => { if (storedToken !== '') { fetch( @@ -29,17 +43,22 @@ function LoginView() { const reissueResponse = await fetch( `${process.env.NEXT_PUBLIC_CLIENT_ADDRESS}:${process.env.NEXT_PUBLIC_CLIENT_PORT}/api/reissue?code=${storedToken}`, ); - // TODO- ok가 아닌경우, ok이지만 accessToken이 없는 경우 fail page로 이동 필요 if (reissueResponse.ok) { const reissueData = await reissueResponse.json(); setInsertToken(reissueData.accessToken); } else { setInsertToken(''); + setErrorMessage(LOGIN_ERROR_MSG); + setErrorCheckMessage(LOGIN_ERROR_CHECK_MSG); + router.push('/error'); } } }) .catch(() => { setInsertToken(''); + setErrorMessage(LOGIN_ERROR_MSG); + setErrorCheckMessage(LOGIN_ERROR_CHECK_MSG); + router.push('/error'); }); } else { setInsertToken(storedToken); From 6447f5128a52b26140924ba84038912bef40553c Mon Sep 17 00:00:00 2001 From: falconlee236 Date: Thu, 12 Sep 2024 17:42:33 +0900 Subject: [PATCH 07/12] Update login/page.tsx, login/code/page.tsx : add error handling with redirect error page and set message atom --- src/app/login/code/page.tsx | 8 +++++++- src/app/login/page.tsx | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/app/login/code/page.tsx b/src/app/login/code/page.tsx index 80c3e88..1b5f50d 100644 --- a/src/app/login/code/page.tsx +++ b/src/app/login/code/page.tsx @@ -37,7 +37,13 @@ export default function LoginCodePage() { router.push('/error'); }); } - }, [setInsertToken, searchParams, router]); + }, [ + setInsertToken, + searchParams, + router, + setErrorCheckMessage, + setErrorMessage, + ]); return
로그인 처리중..
; } diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 5fc2a06..4477073 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -63,7 +63,13 @@ function LoginView() { } else { setInsertToken(storedToken); } - }, [storedToken, setInsertToken]); + }, [ + router, + storedToken, + setInsertToken, + setErrorMessage, + setErrorCheckMessage, + ]); return (
From 035f69914786b2c99005eac34f2ba1f9a4e9af10 Mon Sep 17 00:00:00 2001 From: falconlee236 Date: Sun, 15 Sep 2024 20:40:37 +0900 Subject: [PATCH 08/12] Update errorMessages.ts : Move constant dir into app root --- src/{store => app}/constants/errorMessages.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{store => app}/constants/errorMessages.ts (100%) diff --git a/src/store/constants/errorMessages.ts b/src/app/constants/errorMessages.ts similarity index 100% rename from src/store/constants/errorMessages.ts rename to src/app/constants/errorMessages.ts From d7bf06c53a08281fbfbde895fdcb201bb48050fa Mon Sep 17 00:00:00 2001 From: falconlee236 Date: Sun, 15 Sep 2024 20:41:19 +0900 Subject: [PATCH 09/12] Update page.tsx : Update constant path because of moving constant dir position --- src/app/error/page.tsx | 2 +- src/app/login/code/page.tsx | 8 ++++---- src/app/login/page.tsx | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/app/error/page.tsx b/src/app/error/page.tsx index 6726421..f4038cb 100644 --- a/src/app/error/page.tsx +++ b/src/app/error/page.tsx @@ -2,12 +2,12 @@ import { useAtomValue } from 'jotai'; import Image from 'next/image'; +import { GENERATION_ERROR_MSG } from '@/app/constants/errorMessages'; import PreviousPage from '@/components/PreviousPage'; import { errorCheckMessageAtom, errorMessageAtom, } from '@/store/atoms/errorMessageAtom'; -import { GENERATION_ERROR_MSG } from '@/store/constants/errorMessages'; export default function ErrorPage() { const errorMessage = useAtomValue(errorMessageAtom); diff --git a/src/app/login/code/page.tsx b/src/app/login/code/page.tsx index 1b5f50d..5c77454 100644 --- a/src/app/login/code/page.tsx +++ b/src/app/login/code/page.tsx @@ -3,15 +3,15 @@ import { useSetAtom } from 'jotai'; import { useRouter, useSearchParams } from 'next/navigation'; import { useEffect } from 'react'; +import { + LOGIN_ERROR_CHECK_MSG, + LOGIN_ERROR_MSG, +} from '@/app/constants/errorMessages'; import { errorCheckMessageAtom, errorMessageAtom, } from '@/store/atoms/errorMessageAtom'; import { actionInsertToken } from '@/store/atoms/tokenActions'; -import { - LOGIN_ERROR_CHECK_MSG, - LOGIN_ERROR_MSG, -} from '@/store/constants/errorMessages'; export default function LoginCodePage() { const router = useRouter(); diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 4477073..9999f0e 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -5,6 +5,10 @@ import dynamic from 'next/dynamic'; import Image from 'next/image'; import { useRouter } from 'next/navigation'; import { useEffect } from 'react'; +import { + LOGIN_ERROR_CHECK_MSG, + LOGIN_ERROR_MSG, +} from '@/app/constants/errorMessages'; import LoginButton from '@/app/login/_components/LoginButton'; import MyButton from '@/components/MyButton'; import { @@ -12,10 +16,6 @@ import { errorMessageAtom, } from '@/store/atoms/errorMessageAtom'; import { actionInsertToken } from '@/store/atoms/tokenActions'; -import { - LOGIN_ERROR_CHECK_MSG, - LOGIN_ERROR_MSG, -} from '@/store/constants/errorMessages'; import login_character from '../../../public/login_page_img.png'; /* 기본 글꼴은 cafe24 this is test */ From 2c5160c964b26d224f2781b4624e4d4d8a070ec3 Mon Sep 17 00:00:00 2001 From: falconlee236 Date: Mon, 16 Sep 2024 22:27:46 +0900 Subject: [PATCH 10/12] Update login/page.tsx : Remove unnecessary comments --- src/app/login/page.tsx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 9999f0e..1cf21ae 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -18,12 +18,6 @@ import { import { actionInsertToken } from '@/store/atoms/tokenActions'; import login_character from '../../../public/login_page_img.png'; -/* 기본 글꼴은 cafe24 this is test */ -/*
이 글꼴은 sfpro
*/ -/*
sfpro 글꼴 weight
*/ -/*
글꼴 색
*/ -/*
This is Login Page
*/ - function LoginView() { const setErrorMessage = useSetAtom(errorMessageAtom); const setErrorCheckMessage = useSetAtom(errorCheckMessageAtom); From c7658d13e827f9c8ff71852a6d3058cfe47c46b1 Mon Sep 17 00:00:00 2001 From: falconlee236 Date: Mon, 16 Sep 2024 22:29:23 +0900 Subject: [PATCH 11/12] Update error/page.tsx : Change previous route to guide --- src/app/error/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/error/page.tsx b/src/app/error/page.tsx index f4038cb..5f497c2 100644 --- a/src/app/error/page.tsx +++ b/src/app/error/page.tsx @@ -17,7 +17,7 @@ export default function ErrorPage() {
From d24241907584b284665f13de72351cec23be0442 Mon Sep 17 00:00:00 2001 From: falconlee236 Date: Tue, 17 Sep 2024 00:47:42 +0900 Subject: [PATCH 12/12] Update error/page.tsx : Add remove message in component unmounted --- src/app/error/page.tsx | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/app/error/page.tsx b/src/app/error/page.tsx index 5f497c2..0d08828 100644 --- a/src/app/error/page.tsx +++ b/src/app/error/page.tsx @@ -1,7 +1,8 @@ 'use client'; -import { useAtomValue } from 'jotai'; +import { useAtom } from 'jotai'; import Image from 'next/image'; +import { useEffect } from 'react'; import { GENERATION_ERROR_MSG } from '@/app/constants/errorMessages'; import PreviousPage from '@/components/PreviousPage'; import { @@ -10,8 +11,17 @@ import { } from '@/store/atoms/errorMessageAtom'; export default function ErrorPage() { - const errorMessage = useAtomValue(errorMessageAtom); - const errorCheckMessage = useAtomValue(errorCheckMessageAtom); + const [errorMessage, setErrorMessage] = useAtom(errorMessageAtom); + const [errorCheckMessage, setErrorCheckMessage] = useAtom( + errorCheckMessageAtom, + ); + + useEffect(() => { + return () => { + setErrorMessage(''); + setErrorCheckMessage(''); + }; + }, [setErrorMessage, setErrorCheckMessage]); return (