From e57fd3ad5c6d3ae5ed2e5183ec8aec95e1c344c2 Mon Sep 17 00:00:00 2001 From: iqfareez Date: Sun, 5 Dec 2021 13:35:01 +0800 Subject: [PATCH] :bookmark: Pre release 1.0.0-pre.3+3 yea --- .gitignore | 2 + analysis_options.yaml | 1 + android/app/src/main/AndroidManifest.xml | 74 ++-- assets/icons/file-dynamic-clay.png | Bin 0 -> 14245 bytes assets/icons/wifi-dynamic-color.png | Bin 0 -> 30857 bytes assets/logo/app-logo.png | Bin 0 -> 114322 bytes imaalum-json-script.js | 26 ++ lib/body.dart | 88 +++++ lib/browser.dart | 115 ------ lib/main.dart | 10 +- lib/model/basic_subject_model.dart | 18 + lib/util/course_validator_pass.dart | 30 ++ lib/util/extensions.dart | 29 ++ lib/util/launcher_url.dart | 8 + lib/views/course browser/browser.dart | 188 ++++++++++ .../course browser}/browser_view.dart | 136 +++++--- lib/views/course browser/subject_screen.dart | 165 +++++++++ lib/views/scheduler/course_validator.dart | 195 +++++++++++ lib/views/scheduler/input_course.dart | 330 ++++++++++++++++++ lib/views/scheduler/schedule_layout.dart | 133 +++++++ pubspec.lock | 175 +++++++++- pubspec.yaml | 20 +- .../flutter/generated_plugin_registrant.cc | 3 + windows/flutter/generated_plugins.cmake | 1 + 24 files changed, 1529 insertions(+), 218 deletions(-) create mode 100644 assets/icons/file-dynamic-clay.png create mode 100644 assets/icons/wifi-dynamic-color.png create mode 100644 assets/logo/app-logo.png create mode 100644 imaalum-json-script.js create mode 100644 lib/body.dart delete mode 100644 lib/browser.dart create mode 100644 lib/model/basic_subject_model.dart create mode 100644 lib/util/course_validator_pass.dart create mode 100644 lib/util/extensions.dart create mode 100644 lib/util/launcher_url.dart create mode 100644 lib/views/course browser/browser.dart rename lib/{ => views/course browser}/browser_view.dart (63%) create mode 100644 lib/views/course browser/subject_screen.dart create mode 100644 lib/views/scheduler/course_validator.dart create mode 100644 lib/views/scheduler/input_course.dart create mode 100644 lib/views/scheduler/schedule_layout.dart diff --git a/.gitignore b/.gitignore index 5a9a0a9..f3a4886 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,5 @@ app.*.map.json /android/app/profile /android/app/release .firebase/hosting.YnVpbGRcd2Vi.cache +cmd.txt +cubacuba.dart diff --git a/analysis_options.yaml b/analysis_options.yaml index 53a0830..17d150a 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -23,6 +23,7 @@ linter: # producing the lint. rules: avoid_print: false # Uncomment to disable the `avoid_print` rule + prefer_relative_imports: true # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 557bf74..b2a804c 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,44 +1,50 @@ - + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + diff --git a/assets/icons/file-dynamic-clay.png b/assets/icons/file-dynamic-clay.png new file mode 100644 index 0000000000000000000000000000000000000000..7c1e3d2198e750f4dfc7096f87c0686046533c53 GIT binary patch literal 14245 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 FzW{c|uoD0P literal 0 HcmV?d00001 diff --git a/assets/icons/wifi-dynamic-color.png b/assets/icons/wifi-dynamic-color.png new file mode 100644 index 0000000000000000000000000000000000000000..cb755d970bb6156173ff3403ddcea24f2907778e GIT binary patch literal 30857 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ɶvp- zX66+xlB^unEP-*Y(HxMc$TnpI{nyDN@>c_-sNp74rbJwTC57Imk^!d6$h%cMW2bqqPfPRpW3&w|9dbjgAg6SWg*SPa(q3;1)O zPZ&|!n0t=NjLCzI64k&)?|{jt+Mlbsl?~VK+dhwN#Hz+^J^$yf3xk{Y9GX$>e8jbi z{iI~~XSIs9ofO+c&$0=X^_Mi5G?i2onZPvUi1P!;o#Mqc9Q zZr_=g4Q>ka7NYm$Hs17Brr`OZVH`p&&*UOp4n(0xprnN<)FK+PwCdk9h&sKJO#HjM zZE;m9tZ@7(f%7$A?Wgy_YIx7ai!bRR1dH9D_2jbvoPtsJZ^IVfVy@y<`2y#@zD^#e zKM_%FX~3BqP5b%gdCw1gH)JnZtNkw42(cGiVIMqg@PsHHhWf-BTUt=xkD@!aM(p?9 zY>_+MoB~pxXQr>d*wne?D#bBx{FwAF>^owcZmQ@H)wsF_$-Z7}ZU#|g%e``Cag@}W zS?pLdRGvAxnG8!y3>l}i(ViunAm864;gK_}0fp&PJM9l^zu9H(%E($a$Jewk~ zAIJR!g-_qM4Voc3{+TOZ-b0=CFC{JJR$8N664>!3ZT&toO9n<>39y!{252-T5$A|u zFjfjt&F!;{tDwyw;JaxxEKjwNS~E{w0cE&Woqv}O{C_Z}G}2D)z< PR)FkRr7ty-#zFrF%h@xf literal 0 HcmV?d00001 diff --git a/assets/logo/app-logo.png b/assets/logo/app-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..70058c7d139314736891897bd942a3fb4c7ebb91 GIT binary patch literal 114322 zcmd42byQXB*EYQ9hE10=2uinfZ2>`4P)fQxq)XV+A}xYSNr}=S-6bdux@nLGX{7VL zx92>+_j%s&{_&0P`{z4jFpg{QwdcC;dC$1!HRpQy=z$6mJ{>*;K}7dd;aU)c!HoLD z#Ri{DxnkRb|Dm~SsVG7v12@*e1)i&_zB>dFccT8#-f$DsLlCBy-4i_zJ&pU47A{VF zW|l7IR(w8AuHbG6l9uyvHM4NA@?bW%vaxfP;oNCx;bgY6l;PAB)ez8dRkE_RQ}uJR zdhGY$iG`nog@h%ioGiYyk0cP_WaVMT?BnF<>@Mje!}(XPB=|S#V}4F>lbfZrq!wKH z-&??y45zJ!hpQw%zqhwHpSLidi<=FS5>N%#4z0X71wYA;Zau&-|}w1rHB5JM;fYcXsD9`}>I}>L+|))BI+Z z?)-v$0;pv%GfV$-zodetJL>YEhdj1=_V?nSD@VJ(PjWSLbGLfp>uM##sb%Hv;^}5# z^;ZJwNB;^@amB}B~xL@oa#=%1hbPch2oK#Hi4sF0YbgrJC^xP<5( zf&cvA@0b7c{wFS;7PhFZ$O`@Ew*URv-+QI`QQCF1`$s8%FaFiae}3_g%Ko|Wza7i} z^P{q~_|Gx9db&COH33Ttek(^SCo5+U)FBD}dq|cRk{)&*j#mHsh!h+>{^t<^+mm!O zbGDJ;^x?I%vNrQ{^x%}ecTZb``LTtqm8GYn6|;h?>;Gk2|4NeP|8EcZ|F9|7|7O}K z*6M>p{)vMR#woud-o~xJxvXT`_ia;|La>|_kXqj z|4PHaG5@3D|FIY!GuQv-1K>8vzqae*_Qb`-QC7*!*~?6t|Ns2>|GJcaRtH=gI641+ zLIJq=PcX4^1`)&!go?8+yb=gvhVH=?p7^9~&iDo-{cMuk9enpL{@zV?7Bf;Z0ZdiJ zR~%2WKC~clvySUIk60gZx0UF=;8vrKd1|NL#YbfzzrB@>I3!!r8Oi>cj9Gr$bSP18 zl1Dz+Qd5ykwI}19M2p-_@|(hg!s#&jJg2lFk@L7UWWmbHdMt>5k!q@zVa9#pg>*pjU zUKqq;Da6i$hC#DhgZ7?py{l;K{NgA8PJyJ6kBsE9CE{z4L}Tu6Qi(h-ATF6$A62Mh z-bl&&z;tiO_O)5^Js2x3`n?cgSh5LLB98+4J?JKmTjO@Z!^nedjTekqq+vKlA8_R1 z@Z6h{YBi+J5hPIjL-buWD8aM0Bv?6xaMU!iEFAA8JMKG7y&#f}a!dJ6Qz*ISm>m*4 zk4 zU0(7Fq;@N^GHMA^$xDl@_^1j}!S>=u-0m|o!Yt5eN$`3lSh~?!zeWU!WJ(&ph9EBb zi>iG?o{YwPDsr+jm1nxAL99)-@2JC7;GMKER#tpM-}%_`wP-Qf5Hvq;ViUNcc>Y%K=vX6l{F3m# z5B88AvEH2h>-XH$c<0A+j@CDWFPbFI5t=#-a+?+$mHD0){Z6aOdqoQ>IX(iU!vbxW zM#+(p=*q^m7Ce(xfa2WD~Z?Z zi9kcl{`{khq%Zru>Mr2_l)8GxyFa~F)MD_qbA<&8zm%^Zw|3Nj@G2{X$J1! z``uBEb6e2gehgQo^NfUbpAQ?BEpT%qrK^?Z5KC2pQtP8)B!%ibbQW_Kv*37TRkP4| zWqCqq1Q&PlS1CsP2<{8+F`QVtAv{;zcE1L8Vd zQx>EgU)EwrS=8)@33xrU2zbA&MNmn;CdMcWa15n-&&4Y;)Q-t3V$IMuq$uxjsy&%D zYAC_^A?%AWr&H{`nK#|`C59Fut4WB~MJyl<+WZq9^50BHueASV;J=nG27Do(JX1Gl|(;j-Ki4+`{ zSzD2prN&14<`3uG=pBYrqOfVMkJOi@PeNE(D>@)W3hSjXsjmxeo8HWt5X(m_KWTXL zkMV4kZHqC<8-oVp(f!Bi_^pwMSZCe>`h}t4VkPYmGzO!mPef_L(IdqB2W?e!?5U|N ztK(!H$1P5nS((g;a5ZV-$0@^{@nPn% zk4CUk>)P6IR>ADA%GJL6Tb;qt#C;jan4%v8nmnJ~FgkEZPhl9inz*kId(8ztoV$$D zmjAx!5`3H3Cu>IGyI zra=j!K?zFKsOiogD=!t^Bq0k8xn5DUX-^cxl&)+ps%9EUlnw%3y_Q(0j21^V<(xI=5XiJ$zO@u7~f9 zH;VT!QX8r5(Ang9vCIlwbd8LUqxC)ToKCwfJZ`L~*;7e0f*hI|7qb5JY05-BXWH!Y zxW!aQO6%r<0lG@r;C+1QTOW5$%|1jZz!P4eg>qr`RC2Ghg<`}M3*M@(WJD}?4IG^p zGFS`I865P?iHLvLIhmxRw|HXswB3}vE_Uids>Cs}Yk8ZicL&FY2fdvAJNdiM>B$_A zKO41`2iWJbGm;4(Nz<>H!8Dg}V|8!BbJa5R_pIJ_sZW`thCAVWB$g7F%P}ffpcgm^ z=2LCQan0iz&k&!j)A93`;Haa%wRlchs!MQ3=TFGx%x~uGFP(!&J3pS9pfRsuguOqd z-AaZSek&-w6p>@L-kc#tJ;xF+Lzff2B#$h)(6DNn-w124mS}V(u*?iG&ADM7P|41T zlKa4mo}S*KbJK2i{oUI)lVK-%Il9|c%MbYRr-lSJeIl`Ob&LAXwGz*Gf?7g)KL(d5 zcTDA8ynkDMd@4^863I%EVoHj|qTj-Ug)xaSWzyuAaan}(%Q$5fxQLF7aCep*x+Z%C z39bHUJ&z|{g5(rOzX_@EQ8UHgC7MGl_(B!V%Q4qQug*soTQX@~uASY1%>X}BboNR$ zIR3qc%r3f#ro9?Im%o{`xGBFZfg$NHaZ4?$+e^G=5x>&R!Xlc>|41f?ggf%x4%NE< zF_s?%oT3h-!(i3RJ#G4HACLXlYL$%kQbwm*Dm7Hv_`+OP+Iz&^bOwjEPsX=(*Rfa< z8j23@Am6`T5*;6Uv8kmn#wXqFk2e8fx*v zdN(d)c=m^EYsj1(f9CA9)9}Z96`h*Ewo&w?{?y3SuRR^mmfla_9_JYRV=0pMx|jD4 zfE=!u=$eQNv*VDvg@Izv>z=m%@%uBwu9RbWlSo zym#x2&USynh)0^h>jdBig`MSPMQ(HX^|Q0Ov5&mJ#qDnlbg##p^oLvnD{z36RVdDG zc9NJLXWb(1-WcdM|Cx9buJR3v{yxZlg*9>PEBJ>5pcj171etDKIrx$=|JBh{&FtRE z#lxt$2Oa^Qn7v-v4K2@w-2BO5z6#$@j4eNU-Ok`HrrB8?#zb`D3>{1}TW`A%A3TbT zOmf8z?RnUIowKtOu-<=9?()R^%fgtEwLRyN>^_TDccJ&hP1fTB+A5#b%*7kA>bIV4 zTqJ}1W3nVjlTG#NGrtM(fof#rk22i!p6(I1YW5XtldE6pK{xXXjb7K3(WdTL#Be3l zh*Ym7oR3#UthrlDx(o#?t4%HDtDXo(AInARd<}t2Zz@^j zv|sFeNKdcU*JE?F#C=C|J-&{_eM-R`u9W$ZNJTUZ+=RI4%fozchBMO(llT003%5(p ze*7NQ^H*t-i?~Z6nEc6c>5*IeGdmqs@_k>yoHg|qjM$_J4Yfr42`PEYj`z}poqlbR z$VH{+cxeD9oSBoADAK1V_0_#P?Dx?$6E9Mt{I<4+4DS}=VG)m7zbl7(AP^ZT-3DM6 z|9gOfz0?vN?_8Gqo%Gz_g71-25;DPM#r*AcefYsb9l#Yu6mZMNrDSb6|2wjiCxIKw zg4k6KD>h#&j>BK8((cp~h?2$_kMnhmymcWJj>;fG$yW|W3+*9rKK=gCq~!9>%DWQT z;@?Q5FF|U#f5*37y(0w**8Ngl=P)y)a7s6JKBbV2yOXnH7(j{H3Fbt&!(6$jttCbW z{m6(@^Yofw^B&7G#iJ)9KTY+d)p>02rK4^nYOlw{Ll(-RyLF1^!K!Q6w3>-B&tY3& z47Q;aZZ#|HbRw%$l0Q0BfMW7>GObUT@jsO5g>x*^Mh_3zoG@p*wnB;`=;E`NedMr( z{@K9d-&76A^b*Al2A%9(a_ru+?}A^y$mcfyfUUiNk@{kQ!0F4(YoosKlYDvm4|VtS z_GW$Gj|Yw|E$_Ql;0ny0DQ0iv=X~?ux_yuu!eC+Dry4-O>g?PcwDM)D*Y_=Ky-^HS%!0g$<(qa%$`gz*sn>Wc9+F3itc;Z+SD6`3kRxi5lD1)>>t>C z`MO%rpyAx(!TI76ujAJvoC1JA6yqm_iVFNNK-LdrBvSjZ)2MKN*1K));e9xTsv}&L zlpm#!{CuKDw-t*^jgpe*_J`}HE>D%=5AHaq>1ic|26Jcx(!HGK7>+@SNte}4g3fF`l{UwWjJkpCwWnSun|)i1+)m~ExGlBSl}bh$ zCbAuTm-JsF0nukwCH!7V$udgnpj?C5H@T>TY-#>!P^cCG$7-MLh?5rN=l(hVXmm+B zz%`#cyJun1N>2_r7pvA+NYQKyCza`Z#NhgV;PvJyO-SWN?I@+@(%y^^&z~9A=Yxwm zwP>W8dW&Q{_y%z<0Rf{g*cJ&I{5;zyJOTRR5sPDHn0fj{yfZ7uAfh0AzV1trJLSpXw>OAt9UfON)Fm}%t~Xc{i?e+UFM(xoa$hJm;h_G zKo_LQvh!#UgXCgAPS>T_S>Vph&;I(+pZ|D&jJ#D7TKB`QoCCO<9yYNkK!H6bKccnO zWvvApGJP8f)xSTm745w{d3`lOf>N;*IL#4as?tl(`9H!f^Y;BgAftn)l}(FL$F9 zN(mHtuVVdZyoIsutTb*X!#6}~K4fYWI|Tq>Vr}-EB{-QHw_)<8PuE2o^&kDuMv-xX ztX7J0T8X?nj{X~A%~eoyxpv%F0*j$xi;3T3^@pYTRF+>BKL?Mdk?vs}qg;$;)Vor3 zrgXY3J~DE;9q2_R!$5F3FXZueG0MFB+Iq2npkePWDTu!ZcLHzEu4Y*TDoX*_9-sKP zs7jv0`9^S3@gDODlKzqB0OEVNUX9YdtL#5LEm!C@2Zt=;$!1OLBgX+ zT6(wq=eS8G@8F!jpJwCtq(8NImaA_%u*TcqDO{JXH;$Ozg%hnv|s7ol_*)ww}l*9+hoJ@gv!6rtZ^e>%+j44k>g2cGm2&POuXtB%g^+ zt?=UVr3zRN%q0ErIr=Id5WwXGBrtaU6x^n)2MZBT^Asbua$i8J#a$JZM+OQGG z2<8eOIUL~&*yu65eo5(StygU1t^uwpW#xj(Nz#Y1Ddwk$N-I5@p$Das0dfs#T4!mXA(F%0 z;H0EEDrv9jZRW772tmbVl^yC>uba+WqrVw-r%qx0wAWQrogJvOxuzxD z*A~GO%eT;~vv;%kRR2UpUtcJOQ0<2-UA*J zjVJ`wAfC3=(3tZmz+>T4!)t>L$$b~w6`m&uP>@9U1?!bdWHl`90H8QFQC&w~-qAHop*cr&ca zG5|VW*ZWJPn30m65@X<=zHzLVp^|xaE?HkyLvgV{m!giS?Jrqv{K+K%EDcl`TzdP0 zDSBA%E;jfH37Da>^C60&?@s3OUpSW~T0K(VmhUhz$|e0>Qm}eikIPaW#wKSyLCMzQ&kU-klBQ3A zZP5?=Df~4lB5c?`fv@xF4MJNrZhAuUv8^7r(*fxkD$j=?(Ko1b=6qqbds4~3!$m^q z;Qc4zhpXfH=nu25HON6>Q<`t&_`>Il__yyfUOLZclRK4uayUp3D8fb1fmO+J4hEi5 z(e$6+rY9`N8ti-a^c5^$+#JB{lkEnA+4oyL2IGCoFBE zsQoDnig$u7@CiO2G%&8CM`_ZR!A8C(-*V>rj^Y9*AUDCrffDP#QeB!x?BnHRZ0Wt3 z3I%p?`oI^Vjih%S`?#4E=k0W7eR$hEu35lA&&Gp!#71H18T{RT*N^8hv-NC$#WH~d ziY_ub^@oo2Qr_JW=J-r9#rVncTq5nN2J`F$=%-=;8 zt9EdV;y}*RSHDG4{zk5jh!_wTt6LcYkrhSMvRZ^)vcS_u)SX8q}N3Z8jnQJbTe z{c%~GiL?k-4DU97Id{(`eD4GVer3^;A?9m*nUxcv00=?*K3%OFD?a^AC0l>Wpaz^G zmPWqE0hI_@y5?9q``Xim%ePve|kvw_!Svykoo>y9)>tU4zchInJ=XwlrH()V?W1Y7?eWhAz<{o)?vFq6Czl z7Q-$F7cwtEaMAPk#|YeuvFGX8ln*Fce5HwRY+<1>eqK`;&QNGCz#KG;RddaEjw5m> z(B8+QJunA*SW=kE(#yxGs7)awOy@N>U_j-9WF7XSQ%5m76(h*eb*qq9r$HAIRIJ&L zx>-HwMD-io$PwMZgY{}G#J+DzicDF=k*M#EU)lfugx~vzO3XsrnVjIbqxAwuE@EJI zp2IgI^Z@YkZcGixc^{hX$U~upXcKbsW6!hmmz8c_xh&sv4bwViK$wwk=g<=|2ME|0 zS;FDx%G; z2`zvy?IRsM%D_8Nh2&|fx}v)4=t0g=0mjL;-#1ey(7OmTFOZt)7Y03r3;10)ALVUO znmEr_0cLz=@mB(%ol2#RV`mt>zJ464@+sNpiR7GGFX#_;l#7?l7Q~89N{97Ouiu>` zJb2{z43#{*1rYI5OYhzsE7+1KM%E_ov)8nD19p=wk9IO1oG4N@B`nxx#iudd8E8J~ z;sgWf4gY{5G~=k5QrC`Tiem7#M5}+RRL#E#`i5`o8uPYU*#KJmC9Pu_UlMDf4)Rx z;sL>)lb{bgV}$%(?Q~AZG9v@NcfZ!m8+&c%*9&_9iPyXuMl;=FxGiP==7HBa;}u(+ zLYxEOMaR%($Z9_GbdbTk&-}UI@T^F*PznGBR@%6(h?xn>LP>OYGGwdHMDSC%kJs^4 zKzm}_JmUpiDg$9>ic0lG9Bc^p`!X2!b ziy}ZgXnu$gA{$6Hvokf`+S!AVhS6ce=#)W!f;e;qf|{xt0I5}eK9w+PIz-ol4**Lc zvSYG4q-!~W_pX_al9NQvVu1ePkT`9rtNTj>;%}m5cE~?yBlhPYE zKwaps6J0X$c4+k6rwt8$9H@4G?oYT}=8u%W?y;0qW1bbsGRTt}9ynu$%LA1(4mq#W zmK$lt3XgI6OR?Xj1$c+zZ+M8-TiACG%~lPmz{!|loy1UnP9?E z&F3K|PYzFxzFoKkoE7`A?Cu)>co-af{oqutq&fLwjku zpTloLuqKOW&4+p?U3F*r*^2)tFQ6}*_-S~zik z<$k&xhtCZFQUN38BKoc7LE}yads!N9$B1GE)E7||&ne_yW8C+B=F0NvKr+0AI6jg~ zRS*H^0yT`2z&CGZ0mj;j!q=6%f+N@=fbJ=J&PPz$;)&tqJM@Tm2xUceT_v74WuT)J z_4bi6TTXRX$%%K~Q& zou*-+JiOVEM@|YJ%C29tk0N!UdWa@;zai7?`>vU zs3wHIf5{YPfm5v0$g=`GR!2Z4S032tyW^2E-*HCVlCSptbvUK7%||cuKfizNByK-A z0r)X`f%A546`wD>xYn>(!F0RvRn%C@PxcQZ{fr_At5aQT`}~f*UKzRnmK!!s!``iobUDS9H)JSFF@ODuRJpQ^Y+j5ra&hRc$+Rq3_TkBHt@c16oPj9t0OqW(RY zRJs76ULMJn2vi68T2F`=BAaktq$0Tc4+4f~8bON+q!2;^u`Dv#j7g~(s}mplL%X6T zC0_}G1gSL2uqm7uCwk;=m2bQYwCZQy0bEPjG5E<^A#|E`KCF;(D>+xsc1nrQb~SZg|N26Fb40TFwTlEdpYCnt!G7n*M%8)MVWo6c z97c@&!K!r_nqMbao7SA-GNf3@~^Y4;?|3uF{j zsXb2BjHKRbGtM;vG{fX-#gjqdfO!5p+{(JQ`E;jb3PJ2bW#&wAStMYZf2+5qB~~yh z&azum$S{B0CTRE=42Lhtfo1npjK1-iJSzt=c55?KW<%@NLv$t33_VS)U`Tck`~K<( zKxkBg+ImiQJBS!xX24qXi0K(2I+nVuPSe;c#v`O=p@QayiaARVhSCp5!KSq`m50g& zxfChrGT5xy@@5bofFc!`=jkOy^BwvjZ2;LYj@c#sWM{6~m5iW$^T=>UD^r&R@cNAmOM`7RhJ6g6l79T?VN{+3CNW-+F{Mk^h6{t%aXF2=Vj8H)`KCY=F+DFF zH4G40lmHVW){Y(OYI5&Nl zHST3vFxu@qdA}5pFu^8w zf#lcmmV?FyGW-L>_fwAnMJ(>;QHhHbH=V|P87Cc-8}Nc9G?Mj=N_sw*58&WhFgm>* z}D9l7e(Fx$n|Obb)R@aLizwD=aLCv%i=|=2;4`d_FS)2 z^qwtp7L0vlKQ_BgxEFODUPwo%SCxx5tU0o^%1H0fxv}%m_0H@Ms^ZhV@P`{Fmwytp zYFwzY_|h-ccWP;C7^%p(!w}~UXnIRAna?& ztlDyQiphOl^R&F~FffZsw))bp;I~faAK^*uInSH>Rnwbd6g+lr8ynvyHuJPNJ#_~Q zs~L9N$iE%?gPnW*{`G!ec2S;=d2at=I1P^_yQc#pQv^M1_P73X;V^N7zm@}p=O0&! zopA%KWF8_KG+A7+fr20XSoxRIblC}-8`i|odEA`=>)LE8+XsOZDX!NYau-qE;?a*# zV~U@D|Ej;C>ic@5a7!>0%yR(4B&|5=)y*+6z-B3_WUNG5*Zy|izIWoP<4Ej7C0iuS zl}Gsv^dwsA8GbW#KQFGB{ZM~UV0!QIkhddeMHIj{14stlPor)epcMTn|3|Yjuo67X zRhwf&xzpVeazSk`=x8D0(2cMWTxoAEe?m-{U4ma+%ku7JiSFKt+t^~bPpMVZr@$6z> z-nal%b5eRIHawE+L;!&);p=tUAHU+w(m6DV?_Hm2&=JufCHdwj`yCy>fTBCu{71fF#Ob|Cz#=gz{-%}LjhV)?riMaWs>QX0D0%>4lD&WVbW#~OkrJ>Mr1 zR`xXP;GwXWbasKSfhV-nVyMO^R&fX7vIN@r_r2a;*$yYs)gYK5VnWhV1aVnR-Mx3#*GN?OfrBr?$3>yh_cgRFRYc@=g5Ev3s10D%)3>B78m;jUD&f2>Eou%@_Vi8}kIYtARGVj+p|CTWNAbakrJ^XR9tG47DD?r0iF=2g#p5gthP ztn%Jy?$n1}lPR*>Gn=5=uQY4rpaD$}l#u`?z`jqu!9kn0@SmR9UI7yz(|#Es6@c72>dk(NM^gX7)>gL$^;m!nueX*X{M)N}v}cTk>DTYj-!PimhMQD2_X3S zT+@5xUM_cDR(b!3lRS_r#2Vi4*ii9wKemPLW9~{pa+oljtD>jrRUT6WFBmaN6KddR z;)e)eK883sTo|rZhi^TT+b06AkkqH!RFA>%W;|dHK6OM$_0~vl)idIP8KW1B=$en7 z#t+Bdy7xS4H58lV)RhVjy+!+V4#i^V5&aT`x}hQr0lVGzzc@u~p1Y3ybbO);pASZ3 zM=VV&iz`Lepb36?)*@9&ks*SKS+e;^bh4Rcn`h1sbeTU8F;#cfv)vluh@!CXm&l{o zGtR&&zaosn-sOdGAZh&8>V!vBhP8kZ zluAQq((`t6gTe|y;q6~fFPj$A|N3c?{M-KYvdHPgmbJ#;Jh-7;yCb8xdcobR&;@C$ zJ0xU=M>E;>2R%9Su>}-BB~OZ&L+_!Hrg|naa&gm}oej`M5E-=J7nQ%|A8?Z0P}lHW zX}a+AE#=632cvg8tJ?!7DopwJ)XC^}XaV@GkD)7)RxQZd5RakkylLzHx7$!D`Ux@O zhh}UC=Y2(YyD!J_WKkOqVX&7dfJ~1L)8w*%_Js8t_N{RDWTq^(`?Pp6rhaRl0MIn* zph1AD^-_$&6i-yk{Z(p4?tNg5@<3I-M>OT}4`X+$(UWOo56eO$J)xV6-|t6kdD_R} zAl9J_XqOuDHuKTLt3`3~ac4Ib3-}fn2K3+*ziH$z;9#t`sL05drd4Qa5vh-FGtUMZ zZ`E>-mNidYt2|3Z18O@a#uYgNAbGX@U86cWgF3=jsxew|r1TjB!MG4MR0G|?{AB}u zH1pYoJt8JkoKK@lW`2!j%8z&sQMCyvk%=f+iePpcLJet#6_UcY2AOY1}fB|qVzQ+?V>5qm}Z|jPIp%V#m zCI`iCDlN{^d~Ku47ksao_=Oqe;Ow^Z_O{H9(R670vZwRh zC=xW!Kx(*(WTfZWOeqtsdd6+cs*9f-5KT>@p()MDg6!B2o=b+}p0i;GC_uX zI#`a`>I_LimKICB#menRzRB%cN_z&-*m&A8`Mf?q>}4Fq4l5`v^?3816xWd|E|oKe zMk?ZAM3QhFp6uo}_=3sDslnw}6G^Ubgqp|ZX;2>Hw6#@Wu-{%J>KwXk^Nk%cKx-sc z?`XYasLz=9M0Hz3?HCEsko;oQ!=G!x={>e2x*&z;p7H5Kr6}FJ^ZA%-2-h$%zU7I( zG)l)w0tlaX02<;P$;g6A?1n3YtYVc;N6IFFeH}Sff`fe}vz8i-|J1&SWXG|oZ^Ct^ z>*fsFNexwpY^W;qvh3i7FL|;&*-rN!;i~0FC0xxSc}vi{A(dKAbN+C5e%(=x{jHO3ESa=C z6iD?8g4Dg;@&XxOaAE2?*!nOaOxm^Bga%g{`Nzk;LS=m(@}B-i?-ngTYd_W5M#eN@ ze3kxrGfduVWu$m8*0Kx^zv_e*I6(N3Q;I5`Wc-ucP&cyA%mLVeC717B+yOphwya&_ zZ|8-Xr}19(pfJR<)ztwdHQ}>{!JPFaXOX09l6w9O?A++!4X_H+mIHN+-c1!*gg10S zqf5tfX4R+|30JLqyq=b{Kk$CUv&&w+oPGBL;~6~vkQqiIIguV6$;Bmrh)$HQ?0 zx)3z9_j0SmN1>%HX{3Tj2C;*F2kIRuxAYMXrSU8fWxknJm-{724L9L!mB+cg*^d(4 z_scLvcD3|p>Kg0y<~Cp{3s}zm>hQK`G)oH04w=ue`eW1eRw+xs-~k4|x_5h}8J8(z z`gJWhbYZRUS<5>7+j6f;gH}sz3;h`|nu-w~xD0JV8(GSB`pMX>hI(`~+c@zS?txDV zi04Y_j`Q>HN2 z7ABRp#G7%M!m`RTdPQ}IY27bwCi3>U22_^qwZDa;L%C}8Lb_TJv{PPVzrMc7JL%df z81iYxv97$~r4flk;(x>f$6+Q&cJe1duVv7^Y6b7^-0I?3wxO^CT@Tm(2VG9SSonxG zD?_a-`MufJ5Pb=$5qq^UN+nNSUiC+NmVLlWTA>BBRO}EXR72<7F!^CB+Q;afu7$ed zsAEI_2)_^kw}%tA4ktLWRhjcTmmjdr`V`{TJim1Du^pWo_A6)7GUp1=D|vkT5|`je z%3D8`asa!Gq;&_4CzKxR>gD2!|`YKPHMnZTA`I4~o zmniD$6Xu^-4h1D-@k#pgI1+EKJaf6&UtfN|lepuo`}ognvPDr=R+-i1vGD}#Rqu>u zycQUDLO=6s(A0m1$YO#v>6Pg z4*rNctXHQatR{XAk*oWDuD6`IV>3o5Y2fL)bhM9cxz- z;RMAJ1#a%%>jjlgIM?I!1qPfiqs0b?1ty%^g_5<_oDgchHX3<1of19PK{@Y2LHk>M z3>07I;ZTQoTeusoq!1R#HAEx-1auR~ASb-g+JU25&YAwxSU=ZEZAq+$Ez%dOyI?9e z#x?|E4O#~i|Me`yfHzQL$tf3|T&HJI1Ho7s#Kd9u&s5g#E$x%H!%48zGTHGyP_|}5 z7nrSfdVwE_8^j#e#g-p_N)p$8QzYehDIn}^P!6kgKjApB@ccF@o$7!jc)=T6lb8~! zDPH<}_tFN{fxMUg+3?mU)t3=GQ|Dx)SjlIFYq&S*x9{C;sl)V=kp)v9Wk+>9;c>8h z5pHeI*d}={AJh!hjH$duAtT^Ifco!THZMlsNShHjs><2Q5r6i1-X-4peCHt{1K)VF zKIgMMQyJRUF@S`2F?qUv7nc#Sk})a#vL7dZZx%L>zOOG2#vPCu%*c0%zZ0tlt(Tn* zT!Q3MgAXnWI*v2@`(~<1T?ua^0)%*NdIu^an6y4?fN5Y7Y?xFC5jM%x@yV`sh{Apg zs%vGT9Rnt}Xpm)^z5|E?>{Xc{X_mZD82Z;{Vnf+$?=Rv_5zQrWY!&aPdmU{gL_%7` zTZIS`NlbA7Q2T-bgY6eN4WGgs_~R8&;nZf?*&UZVL`EUpnzv7@WDK`_&g@YL);j7t z-ISu|VnD&Mm(fu$)@Nl(_2!yVV4hY0F&_U9baS3t44G$Z1O%VwofSu6G**{#BW2Oa zcSK|Ck_NYj-Bv^oJOc@D#TYs-%OGhh{@nHpa27`4Bw`qZGDik`=)03rgK!}t}NbxOwe6vyFLLW(``^Hku|m5g$KrSI-MJ45;x0fO>MObhWEa_P3bXKsqx}+U7|96HQim(HOZhq{@ga| zq0K}QzjMrU2HVg67(|?2zqC3U;;nNI(KBUg_(M;&xt{8^YoQ}zh&ZcDY+a=BE6eE- zPU5~{w1j$KSjB}a0xK3(+bC6?*P$#*oz?UmZvvkvD6 zr;VKt#4Ji7mDQ{-Uv(|d%G$=e&;$1MhlgAXRq_2&x#+`^ENmcoo3=^i=x=jq-k5s2N|{7SQaBFz0Z zDBS3@5-$dkG_-c0`gUJ}{o^!3u$-JZ)N5R)QRlk`PU!(AZT-N#MTIF@Hd^)S6+4mG zu#M_580qQb&H+TvBqa{?EOkpTJgz6};MhivP0`XSeVMCR75{yn-{lOo>)y1PVe>9a zbdy>`LHL7R8q4~?*y>9;moW!fDRp|17lJP>umU|y?(ax(YNSsc9Y+=TxwD4zGgPNL z;fjeF?7c_BeH+tM>$A=4QS*~Ia38%h_B?5U&V;Q7;F*waei^U7mqpnC1t}4RPnp1n^dq{8+0Ab0<-CH>jh*m`ShQ37A!k za3Xmk6cGC2zs5OExZ_g(?4*E~AiMV7!@+o^(mme_67K@H%p_~vtQSevsA#kDUe{FY z2vW4rHDx4Y7dXH->g>w4uu!<~e??@G=znI(6PmYJ3yZfF&eg%t@JL!avD4hiqn=%( zpL2m1(HKvVq099;hTo}me2_C*lN!_Hjdmw=UcENH%45SULXtF$_Ek~dlqA><(lIuCtYt)%pYxkGqI!g3fo(` zirr;1MGNM`Dc7f;kk|e~10Jh~nvWaKtq3u5VK7C#t2H{JP<=(O z`~k{iALEo;D*bVoQnT*i;S%+IZT5jmp%Y%j1~eXkF#>BDB#*??b82Nm(DL@Cdp z))b|B>1a78F6pTeZll8zL&dYMCkG3lAg#_X5e+D7@Ll?LK5Pi4+=-;B!5HN9Pq7D* zLjN@jz!U7@;qdGeD=i0SBD(QlR_9a8S^qlH;wqO9=jKHBF=o_s&z?Iny3(Y<1WbgD zrmkiv{Z8M}zAvX^$#xtdx(wQ#A8{^FqSL6j?#F+8J{aYfO>bZs>|`TP*dU@ul)5QE z5;z0_{=x=I!$A~HJK1c}k!KW3)*`c_WVpQ@h(moI?|pW(R)CmM*?2~ar^}y=^i&Jp zhv=z)qrXPJGZ7I7Mt}cKOmwJ#QIhaD0a2-+dtrtXw~#MFrOw~Qs(26JkL;R-i;(;> zznpt?-B#*aS9jy4Mckz}Zr&~nrlkjkU&}LtgVPj7Vfb^eWHG#2GTHEwigTZ#UlA}x zw(RTY&Ccd~abMpz`=oDMq!VAZ?~#*sX3}iTrE)kCU5V4S)}Y5TIuABQ!WN&=-w8wtc_GPp<-+dlg0;QS0fhT84=fP ze!-*RS?ky& zhD0B5Tes`kQXjm#kI_L-j-N$C<%fffc_xkYCQ-v_xd=Sx6Z zZ-(p(Ya@G(Jh;obzTq8rsA+4}RP31hhY#l7h8;mf2BV#>-DGp6q07aE=p<&0GQ1bm zNP!ShKW43Okln2u7-E9Z7SnPEu_@)+Iet{A>$fQTpb15c1X~hdSg`zG!Xq z_F}y>;P&mC6HiGz{=(n9RLd1-1AfeEuCz&Q0E6ut93ptTgcSPd9bHx7OYUt~8or%i zFwa}T_R2IUjR^ajniFS{5&Z*mh44lCmlSm1MF=igAyVMSgg$6>4Y?DT7XOQ;Zw!q4 zd%ljHW|K7L#%yfccH_oYV>@YV8;#vqjg2<8?POy-+wbrHyx$jh=MK)CJ7+%r@LxDO zqoPp#gFW*P$0{ERN_Yz}`Kw5Vhx_ z|ApKJ_mfNS!WsdR;<+@8N<-jhm7wNav6x>!rIcQzxDC6&Rha--LR*}ss}mF1w|`kZ zqEJ$pamctz>hP{A`zEM z#EouTwPggA&)ndt-m|-LK@xJULbP?k`{+V{1ClM^lWc^(rK4dusaA;S}9hP9h}q( zVu?n``luoSBT=~atY4y)A869Mv=E>=hI#xysxQymdw5)j$PtycpQx!6dfEzqU4V=) zYoc?S?@+5Hy?X#N$iU~X)*llPqT+%$oN{%08Cd=h1NzNi+4G(D%cjnmy&{q+Wk3so z?(hKApav{Lr?3*4?4E-2_1D=gwt}+41Gsu#=&=$+b)o`yHv8 zUo^)+G(*rp^fG!zjvNL(5!C2{Us-WcETbT=C02KBnWg)seIT~%dS5w*($T=$*%b&7 zoB@M4+9xpA*Xcn6`w}OQaBRdqr(9P=9D~&}DD030LJ=+QC9EsYslzr9Kc4w8e0oOS zY!~3Q>ZLH5IG|VQuP?~|kg-~3L9Y8;e%d5@2O5nE?K!>h>YDJtg0o>@ezh=0c-13( z<}wM{j~Qrz*n?~}_0||ltoFo@DH(!>C{8}%vjjIN48`2K`VIFwd8kU zwuqM#K?4YSB&c$^In$!*x8;Q)9l!UG@x%a+KREw4q6yZ(*)rn_ni7z1gvMX?F>GM5 z-FNPe7J(^^oY3C+=HV&@n$aGx@Oq%;4=u1IDFt8dk-2C$>0#EV0=G18hs+xY$k7-2v4URSkgxK-effS z=AeT+f74~?{?MsqCCix^W;ca#rhETYCu;r>!UM8b0Yb1o_lyWvn}n!jocIha5jp@e zBm#N4unr*D%EQKK(kJU|y1;XuctbFlgfUND`b z`KbPFey&d2yrlHDFZ{8%0RfDK`mj3+M1K`1H2+K`M{mh80(#-%k+EJE1)Vu9pGAp|7EB z2tJ@>h9BG`Dt=GCs0$eRv-#tNpyprjRr zhfN*^?hgDk)5_)}Xd3ZEO)@ahe+!*%M^lDC^crQf&sYN*_Zn4Zk%frnTOO1R$Jt(< zcOaK8t_iCefnu;g&YnEPEv>qc_(q6gju3H)7#ZYV+{lP9#Ab)$3NT7&5wZNVL}KxX zV09SY7sgByzVMps>Q3iB_J5q#+cif^ZvP73$(ulS9hNI&rj^OBx6$h84w%HxLs? zr>7&5sMo746ihw*@qXv!s}9)r>iXd&QJ=r1QH+ZWRX{0<1T0oMnJ_)E>ZsZzIX&Z{ zv`{@v&d|ABJT+ytxL@|p(eKFv*)f)*q)R?NY#&^61Dvf+Fd|k)Kzu=Vc~5?J8{Td+qxfl2Qtl@TxuY3=PP>;!UnLRqtC&dN-N8;yb- zK5!HLr~R4E?7M3-=IT1y?3uMu_dWsW0XGr=CKC_(foOOw4R7@qQG_-^aS`H?N?oaY zd0!s9^2mL7(Zz+IM;qM?wYqR~W#`mDt_dfF!b>rS*n0!tQ~}K(%m4&F&_0iV_3Rcg z*<3EdgA^(71YqbBM$~1Rkkfw1b)56?LA#!K?RZmRHt%I00qgTA1^MPPhZotu6G|!Q z!a2YFB7yHt{m8{8;TRSYse!16IQO}b+KrnkK=;dU}uzS&Qjc%OWwjL;{mRfJC2X}UB(yx7lc z-^{b!9k)P9>_2+meOQqE%eBRpBCRp+qj7;7trg%A-^qD`4?Yv4^`h$4;Llr!-S!U8 z(D*aa5e;cglR7x`PLwHpmRsu8N`WTlZ;uPk(OuJ799gGL5X(tnnZ{cQ z>*Z!-#_2M#k7_N+_6>ilVj1Bsl>T~}k*hKZvG%^b3NxAV=Uj2}0qi{c;V**A7w5K7|Gf@ckhISd<%QNM5H@+B=?<$@Z~B zv|+1Y+Tdt4O(+b}8;MUU?q@0_%Ej-J4&7Wnh7HOW;;pe6`H>P>jb6s`W*XnxUfnA> zbAQ7r<50Q`v1sl<%N71+VT)#=#Q{>{4hgqn&0V<^tVowTiw6lKa*UHUeh*!B-6YRA z8jJB`IRBRRsQv4~Vu?~8f<%G~IA_VuA*}HAlk+N;ld7!G5nOP1@EWA8_>UL_1NeIE z$k8mAk+x&cQM=lq+-o&yJ&8{P*g>myiQWR_N zF}={eiq^tF8?c|t*?k2hDazJwYcLAlha;t}K-h{mpa;ho*$TH4pu1*`t@k<%sF0y| zaaqkS5Sz(HZKR+Htn*fk9TU^2%6c^mg`=!>j%jJspWm;P0RhbtJJ4DZ?e?t{e<)xl zMFLP7JW*AxD%$tIYey0=#laxQGESaFBD6$IaH4u~2mJF~1G9Y%)hkV{rEnjy+-KO8- zO3n`rLAxS#TH2bw_{rb^kQ*@kD5f(80B{IUTB`;Sy8d4Oc-vAtQ}cmtYbk~t=ww~kH~c9US0 zc(|?enU~JqUbhT(?#8ia63Q)Q$U7m6oIl}`g#g-M{AhoJ#P`;A8NFwH*lq{p42IWx z6bDG3LPA#gV9Vfn={kL5B#ZF!4~T`O^c^4kp)ZNfE;h} zUBa=NQR=Gcl{Qb>4ui=!%kl_>WgGI+K--AOJ5ZWL`-Zzp@o#3coXbP;aGFHY%mQk8 zRWt%TUTkNjp0nqVcj_FE*HC#IvQVs%#OZZe!nCVw8OWbdA631a9N-(L;Mj-cIeB%+ z>-QUwk|02lZ6o+i3?P!eC$*Fs`BZ$QEMx{BW=qY?SJ(B4<@|T^7>c}_WGYnD?WT5P ziM={I#hFaH&puA$xhK*6BNGdi>ShbCQX)&hZ4Mz zsx@UDWaVH?Me>+B_Xq&p#^^123=7M_IG5z^Vy?}@+tKXzt0NZ!F;b@r7XAi}^gx$c zDDk3M^@L0e(m%a`VE%qI86Rn{0OF7{*x9HPs1A5qKJ@QFM^MX=$==NS#89)5DEBkz z8{|VDHB=puR%21ZU*PLoAKy51PkGEPM(oIZrpf=hnpKKX%y&>K`6TOypxBbyD8NZg zGe7tohiNlgG_YtQ$!|_GW@u?>MaBIna25-Rmo8UC-K1_XDn0f&KWOy^@oZd7ziF{< zEC7f1e9KgUI@?b!R96b$)kOdE&ao8_j=$H7MQ5p98)+k0hF+Ip4%2xnT&Re+WFmk& zC;^1osC@YTqrqEmmUDx`LaDTjc|tO|z-g?WHd}?=h|i?FzhAEqUQz7nY;)8!`D%>z zMTPlA4~QIoeD{CMlwJ$q1&d%NT!rE?jq<;0YBR|pTv1MCAXm`}edzff=4>i`e>ExD z+}K@6KCx$IpA;qCZ)5)3TSG%^$x7z5XmiV z_!m~*I*H`f!0m=#3TwAl>^X-{>BU|x4OYvG34u~2FcA=?u{i5_K2j6jyH1)#`T1js z;AsKTO+*FAHv1C@QBpN4)t(or(%Y;a*|=lH5f2p@!?svMZSr-1LYGMKyN`ajY^5 z6R(pLz40QXahU6!&4FEan>6w3ut*c#lNcQoW`fyquV-dI>gl(dvmdWeRrot}k5HVsy$^Ac%7K%o`_Bgcqj1i7{(w zjS^VjId^Njyi#gRE1X(ww=>?8KA6eqszD@G9}urfRuX=vZ@N{Uh7wS91)%DyW0r^S z|9;VdEd^&L71T1XYN0cDe>Q3;#YGPobK z`6O4LjP$`t0`6Z3(hhN?e!I-cYCD^ktl@Le#e(~8soqglgMs-?m<9oe0F`FC2&XEL zHF9@Jkz_e6=epDJ2IFUJVs5;ItBJzL3rD>nTkMB1J9I3bWp4DfKIj}lrQ7lk7z;E$ z&aG!uDs4Uy!5E@Ty)xK}CNnzga#EBH+;}AK>2nPQkM2f0iNxFa{Ols`Pk$|r2-Oo?_Rv0q~gX8>&g zmkPColyYX%z=60&5qoWnLU8!4nD#DFR?A4yq;U`#0x2;(~ zdbRG?`JF4{UBCEcMcS>Jdc7y9SB^CJ_m9hnz++=PkH-vyS9zxL+{u&LzJc#25pzmZ zg65xQOYy`{sEm10#ZJ)6pYw z%#%n+QK40G!cH@tNhxvR$gWs6UHpol_7}S@daAC5HN5rA1|ZBK93T|orXUXr2EsC0 z^gKjfJbSW)UG6#HxtU&CC}t2D;B!ac*AQ&s@AC!7@f9WuU?U{eGQ03Gnq9@MY~ol; zC^bre=XuTdH16+~ZW0(1Q38Yz_7zd4i>DMF3rQ#IKhjS6++UL2$@T307j6aLzm&wK zUHq1NnArqx@vG^NjQi>LN?@7Y1mNQ}pP42`NE$BnoPJu>?zFVfbqW4p#E-fB;e>Wa zxFCxb6PUy7kU8tQYc@+`gtyG2fBuHcg8&py$5bUDzaM-U#E24F-TXUGPtX{J@=#%3 zaLp885^x%T9FQSQUJ@$u{vZH&Fh@y8k%#;u26{b#Sb%1N@P~eny~*9H<*Gs|owcNk z#wNvAK!mfAZaw=&l{!}j(RP?{y!Lk0)L>6O(FKkl=(Jw)9kY{=bdlb#R;6 zFE%1{1I-1lZpCodlv(Ob2&3-0+~?ZrX?9HZg{b~w_!7o-Q42N71y zeo-jc1>ODyn{3^|^=caNzXH?sv1SuPnOgIy;^#17t~Lw%_KvLONEb$X|7*-Z?xHlv zp3*Vt(E!7g*#olF)YBrcL zjypY)jJP!McGsZqF=0l5G{Fz)*<%>IaeTix zG9bnrK;axJ{P_;LJcU2L;Ov-X#$W6i#t(l}A^vz%#{Uo>Bge)miD(%~gHkB_L++Xc z&D-|nr}#JoE#fQt`f4s^($Zi^QB8r_t2j8DX5F|&%hiZoVVR#lCIIB3#yvC%5CPKZ zLjBUj0{!1%U_?>IuLveZ5=d$zJg>=CTOYR7+qqO+-gxiBVfB#KkmV=9t7DBd!^O(a zlaVZ3l)srmIkG#F%f?qhy+_=HIgEBM#$faRQ-^SURG zV@&2m&WWCWpTYr9cpk+s?(rAvvK8(G$K9N3rttRGN()g55(r^b;YHbdV1@c{=E+8Y z?TeuMx*G#dHqSK^f>U@psQ2b1=DN3ShnZn(`bP?FB%?@K=O1lp6F|C4WY(6Ae@-ibv(R2lGk(I*m#lKU~QNFIdRk+SB~h8E|WG#r_9h2Zqc zh9Jnmq#Uh2G2QCYvxswzRRpj%H8S)KX%Ie7s34D5ad91Ja z&ReKv;y%z=qSvObL#|t3%+Tnv!|h@_lw{oN!${zm36zu_X?0v-DHSTxc+7Gi{o0M+ z|4w)bDHz;99~SjE^3x;xNtD9pGfdg#Ap~+`EfYj-K0Z(|5@~%U5@~rXUaoV|lHK!v zwzG-zHS#PE3+a-HGPB77=Q4MlmQ66eI@~^9``FtPNkbGXzqw|6D}G*)erQfO+X%?A z9aeDL@s7L_E745;7zadmQ_;jeLei`U=te0I58CB#ci8(TZN$j)rsTn zeq2k*v+!}9-&ild00VVZ%-jg@a(7G&_mC4_VV&+>A?DN- zwuAnx5u#rIeDf!%%*PQ6L*m4%4=TC`GcrePN9c;GOE2}Z1?V#V#P?3ukQXQQwRnz9 z0HZK_rY}(EhY=Ix&6>?VV!yRb+zp#CGRgm+1=u&7Af&0*&1U}uXhmclbz3v#8@*8Y z2NpoKz^fZCr;w8G$X-s-(oDmFiM6fxD*GZrNUsj_l1)s-td`LU=6zP504eZL!pe*yw(Dp`GK+Mw9)E<9mhC zun?Q(IaE)cjk+d#r9Orco>bOe1=ouBiW(3YwQo^9Y<2j;`0?tMIhv8P6;N(NbxD~h29!Br#NJ=qM;eV`{+J`TNP4hw}m#Hw|(WCr}m-|PO_+cfuumU`e z*TN;$|9A}2e9B1w^a^OjesuW-SF)U?Y9-4HsHQ>?3#*axM8EB?xkINj^_Mxvn5Xq) zU?yp$czGZylZ=Qfe2)JP^@T23F5JdS66I@vCHsrf?w`2tlO0>D-W(J#+Rdd2U?9wY ztv2~bUuIg^C5zX*P6BjngjGSMatz)l9b5_}C& zC(3X)2>+NwM6=smfH3ZR`Y^sMww(-2FeEHm5+hT2BGrB=%q@Qo)wU0 z@5le=6mO(}aoXAVt4J&pG!G&XQgqRMOk|*kwV41(k2}igVwdc<=}T~h?sdn6F^~oA zE?Jb&y=C*r-;gXoX>5K#ZkcZtSfg4uB{2y?A)*rmLFgIo_kDh7npF>tD;$u5Cg$=)!gRZ_ai(PDk4dj+KGIykvWAS%&ebwMHhZ%4@#8$bLxiEDsP% zA{DUe2jTCvVItqP)k;2@IBo+}Wq}#fY(;!zrSp*v*GClyKL305fKc%vO@9TazKKQR zfs|7D$S@}M2lXzV9wlF_nVlmN496zl9b-zC{6>Wsbyw9%g++JETBc3L?_nwzTpPc+ z;*4vZZ!?DpDklc~vb?w?LwI-YL-@;$A(bm(*xgufRn zvF=w|w|@5KmMzFb$13ICGyZf%um0`1XdZt~n)-t^9>W%ypX9=mW-wSzf5ls!Xy-k7 z&q9fg#d&uhy@qE|1a3@>ECd^9M%Bq_58aJ4Fk`GWU#LEvu+uYN)F%@MmkJSib}FIn zS}jzVNp^4;o4z*&Yr~Eu0Y(%D5b>gd6aW(9$Mxy0jyL`%dH78`ub7hQiyepQb8{^z zq)n{{=YD{6`OZ>f-k71uK3wfG$>6qjOz(PGJZ4V1V8~~00hsuEqhseZhj-q|_GVJ8 zExRqTnT0P;YiMe(o^8XZX}pBq#i1D-akq=*gCp_Z3U3PEQ5glTL*LFHm<=y$hqGJ`rqxR zj%Ou+kPDlews5IJ&>qPHKEz!;{ffQ%@$hJ3l(o0VSdHhY@$FO>x|az$W>nSZ<=qU%!*jPjRbEw9-HA``DutLQ z%Nez{aa})A$%koF>O!W@D`~88jHtEG&gK&?WG6|AWA3J@G8-$vlL^xd`ngx#NCa!R z1TXYo>=TlTMuaEo6a0AoF3rd<`DHuUi}Px;cW|C)>Z+i%Am8qHb8J9|U*?X<1C^(F zN?sa)>rpH5>pg86+Ir3wUys6UQoOdLQ({NAFj|1Jr4Qf{sY0wpW#=+8LBtPJ96F`< zedq*LiVgoC1Hi+)H``ylrT_; z|16r4cf6bC?{s{UB<2NxMqK5i*!1P@*A?6xR;%^UUf3WLM@|qyoIXS=>h#?$Q=F1w z+(eV4d(vO7t+~-=FG9(I{`ddNiR3Jx!`DP->9_DgDr@q>G1g_7h+F$fuFMehX+U`tP_ z!d^u3MXT*8aoo)I-m0_DT$M(8hS0A3Nag(XHjB}M91U{<#=KXR2kR{*(f?H(_^EGj z=23S8t0K&GjW>)i&O7AGe`ubEIFVFvu$t{mpj*G#8>*V~wnOv2SjGd0Oa)4;chRs0 zB`5XNU8@LGTtQM@1^;Dw6#}=jgtZ69Od$rBGkUw^U!4BzL?mht0Sa!#)5cJ6wgXoOO*VlT&$+*-HGBW_)=O`PGGca7>`p`bwl`}4_`iXDTg`S2SosYytZ1b{ z?&eqCPtP;hIHhj#F%~ujC>`wvF4N>6=+GLmppOEK#Bm}w4aYuQC_HIXhM+}troHmp z^PIzMBVM+zF{OBzD6`rY2*XpvnGopG(q_d=^W-tre9->q*#5gk(;e4~D?vlu#q6wK zQZMQAz&!9e<_%s7ythzDkR9+!IAypHkMamvrD$0Q&Jp7ZrlLM+3X;au2uck>+^Njh zMWCyZI?H)Vo!s{|A(g`+jMiM9`7ARk+$&k zZZd75-8>X`b`J(HezVoD5QVJaSjf^1pqU zP@m)RYlTKdiwdW!a^zuVap>A#L1)!#gF%6IxKJne9OGvLm0}XP{ATzYD^<>>0SVcU z2G>J^yZi#V$FY_qmjNYK&E5h7Cv8={j{Nva%8&X3HgdM zKS_nRt+1T%8EVe*J`SP=x;vZ|>W2lg6ei_v^X)sSLh$?bWFNm-_p^@cO#E0qoP7(}rhsk{4Vcb;JG#mhShs|i$|$L!Xa zU=(s|*-U7`ih%-h{Ej32aL^R-s5^-wm@2k7QevT)uO17u5;n=%f{r2w2P?dahoXv2 zm)IDCFvVCeLu?Su3&&q|scEU&$a_Oi>tdFjk#rK$5SmVs5CMJJY8hD#SOI=F(RDN! z)#p^&;?sn+RyF)eF0T#}KPt5z>m-u%v)^P)Auc3yGkD4@HxkEGMu^tVC8-Ahc5(nw zP|55WLEs5&J%Ey55}7h-XjGBHT!1LhiY#-dc$gD^BFFrDF6*=#xb=xJG1m#B-76NZ zh`ln%M}Y;-nKovIO=K*T48Wt{;y#T_)0Qv`w+cqvd{!Xw*KNA4Xw23(e3zjE&B@j- zqrt%_^6d0R_18-d3N)$1(k>>wnzc=@qm^iPP?mYx45Aq+)$WadB<+-I>DlWOnq8iUL~A?=akZ$KGHo zPR50z=o>kBVxP#M+!pUNn;<9m;ww> z4K5nJT!O}xet8aiqEodX=#j)5mra#PtJa$0`CXQdldUi6pRr5YZku-Md6bX|rM+$; z{A3Akl zM`EXCLD$>fljdn3Pb!~h=e9?;?KOYM=LknedxN>U1n=au-^f4+T6k+GS<4z6(B`vp zj_*qghFx6OmSRaKnJGmMbZ{b*pu8HM+sBi1=8IomDVK`2n`LW#k=jkLkg3NWUYb%D z`H%#)ZmYqCDP93t@gI#EiY?!>>V#@8J>raur#8gww@2Pjf&4t=#e}Volzq1%vSg{0 zmR5aMR;+^=$P>K{gdu<~o0i86aFN82GraKvV-W>~VwMu5>d%t6_d3sdB(&7hWi1pH ziz@Hl_zF5R;L5)&G+e0nxBtz!aWh(3UM*$38R{^8!smxO z<`6pLmpOXk2Z6+c!9__$du!4Zz*E{KrN@p$)`Q*=vwNnFat)58gtR74ybAn7Dm}S= z%a_;*dGlnJT7IkWi)(IX+4Y#Y5D5>j%8IWD#kTz48h)$%&EBeZ_&!9*R?K;EwVG#e z%u&6vM{T%C%&F~_$x-)5m4IoOs{#O(9#?U$B){@@$V{rN)w5Se@omPBrNZ%Ua-A>+UU2+H8}n| z&&5hD&i3W?f~3NIq$J9A!&@Z;(F7Kc3nvlwYXl+06Lp05X-a~?qW)fVb=4z{!WVUV zAE_VA(SIL++r|ii+e>rPS>_8w9P7z7OgZ96ja}47{;rKoi}ne8xdyun4jbs)`o6ej z@g=|ee!+3--!pMFu|uape1zTySdRUNqqjo1Hvi%o?3ip77$blt(mWaQC}5-%v2~}v z8ZG8{7v}JTEdSOk%$_{q8jv~(005-GteF@9R8cFvlLD}T3_O!DU^39-={+H9X6gMZ z;ZEn7z=0wZoPW0W0E%BWz^gCY!jWV1dBdS~a~~gj`bA^+TcZzSrA;c-?Cs4guERds z=`{g+w29#=!V;a8<_W90a}`^v+22vd^eb76F#@o`ehh!bGc<@|Qw<}4R2V^=0{eHm z;07U=cf(+c#f;I9h}AsvRZOP#DMPJCeSiInv3mm^O8-gYI7}p^b^PZGO2lDn2%JJM zA}e+?v40${BTU8fe8ODrb-R)`1D|$FIdMzLtdVupkgzJx8&NfxmQF^P>JumiQA=|SF=Lzkbm3VaF!^385$>7OSD4Se;OH*{)8;56`3qb z8hvKA^JMJ|R~KUR4E7$+r*g&iN~XRk#pO2Vq&!cjYONkCsd(E{gcCmR;>|QN*&3gl z?wb6s%RJlM(-NTY<;eRW%dwDu?bMd^mU?oQKz=)Myed`&MQF^2k63Rq_N?y;6rX^9 zdl{cqbB?W5DJ?O_i5(`qh_5!cPy$r6t$-rAL-n@MuN!H8Zlu0?{9Us5!H41ciM@kO zp;JY2cND2E1lo&Z^!kEofvxUvw%23Ww3>}h$0}CLuL33nFkJe?+mjZ{bA!n*7cmZX zZ68Wjey`eL(H%V;sHhl@0*_C5Yz+Dr&XYW!z<8ipET4qmBL}%!ftV3JY$~LVXuX za7c*=guamvb4Awhs7)^E41X1H;Gbe0;>4}4M-U;cSH;5*CdK)IwZNl7$=vv@XeF)# zNR1Oq2}4F)a-mD|gJ)>ndH6%{RDr=IFFy0<(kc4A=HuihtIuwlmD@%6YsgQNeu7x` zr#rr)i9Gv6XP4M87StdmJ%arz6UK{Ys~@1%;2$1h!jzjWzvQ~F$Jyo5ynSwnRAL4C z)N|%$pMajyt9@@8PN-sFlZEd+eUZE%4Kfjs)(3!95>Po zLg{&6t57IQJhOdRWw7z-BDaV0wl-9v)fwL=o&z?;ivL5?qNu0b-2%nne6=X-{VRT4 z9)IfgaSHLM{Qj`(-sfQVyvw>rl<+cWJcoP-l>8eNR$>O;m7VUm`RmgjGmouNl#X^f z`ecKzhc2gF70Fb&)2GjZNVj5ep8`yh+V+1)U%q^CrlMdqUeW+zOwkV; zh*YQ|?9(7ZNf)C_+xCB+$R3H#s*QFmioR=cm#J^0Kho)%eb98cCMRfyja+Pjo%Hsi zGzbVDpmB23>XS>njNu`+gm}i)`)tJ?{@<&l6$~>Pu9#=cT;P(G80n48q+C95D0kN) zYr{z@^BxcRY@pbwu%u0qeL1x*(1W|CiO=W-GcWlP0&a4UV^tV;{d5nP;);U3 z@7+_NAh4(pQ#I;*Fn$$k9CC4^XSNfd)%E5%qcb_w?lpUEM)a>|dd znJ`=i*xP5j4Bhv_KP6tSg)%lbkJ*hI+3qZo0TGy?O zZZh;Q|7(q4j78}h_ai4EeB=O51`9aeON;;oN=$5LK^2X)V>Y?{nIV0phIjn^VYhnq z#8vRuAClWKxZ2BokVx>Unqi%@s}Q~Ww+>;D6F&wnJVii)nzybR+dsY{Su(#pZ}HOM zcfV1uJu9lI{^wdC)pKby&QxL1`PARI`s|Eq^ZpR0K6K?Y>2Y%*8lp5xb+K4yFRL)x z(D{18tVi&4M@-sg%DGbK(XSAVZrlPg@zfE*2VW1L&|xmWj2)0&C|^DXE|j@EyT=FR zCkKJm-^l8Us@>}bwgZP+$581)>wA18k+*M~7XNa}_xrIQ6r*x;+FWM{j}vIB{MU)Y z=W=8d8P*4>qXZ)eSmdyXhg?jt-`D&!OjWHf>nhQo_R#<;ub`;s1e856TSL}d_jR~; z54+=iN8*zePIL3i!E>|G?JiUMYzo2KQjI`jcX2f6Cv*8kcMgm^9H*v{?*GNlMhIwK ziAw8taaDGA@0!baii*vOhgh^#Zxad&R$x5j9d)A;oeFLyt85p3c%LvgHWW(m(TAtf zL>%v^e$PudS0FlmtVZ^!F@Bv_<22fP`~ed^|8wGUkA@M$cCwv|fSzZ&>`^Z7hB9TI zgdgqPpAMlWi~e}t{Xz7#X6`^ReH@prTv@^O?1&-wUv?l|<&K7`FJ5-21sic!t?2`gd{t&>i^pib-Z# ziqsm+wCWCvHjisBPqf~o#v%f5-t$migWt5S|5$#)cln62WH0)J$PP&YOBG+4&Ax}W zz-)Wcg(DFSW@td@a^RhB&B<+!3zrNIYND_y`uu zW)$YllX1HQ?tjU)kkI?MLTx8imf7felL`Y9X@m3xP-{pUNn;k)QCpQQ49E}&TLeYI< z->FlB#$|`%PESktV3^LhE{+D!0X;b;Y~NTU+RQ^~utY=^eAerg4lR7*YAApk#Iik+ zX*po%F?qVuDi*fgvOfU}c?3_)@RyUlD0};lwn9-kyA-qwZP8;uV5!6L-&oF$24fmB z-2z!$GAYIHN8v98wT+Uzn5^XEiLAUT<7L41)co zf|_mg66Vv{uB%XjSCcS3{wsrMH(g2%rr__KnQW~@NR9YBPA1go;z*f$2!f|~Qo4nR zc-y>v&`;u^fFgP>ip521(4#M&*veW5=T?%myfAV_w38Wol%8oxsZ_u3G#goF*dkJl zNLkhaTT9{}pq2DIdFmFS`yeh_y)bk@EG6X~6@{TM>0rN72TaOm;^jOGhPu{wjBw1u zujz2mKrQHTqM>qP;t@wIE1c41e4l516-A+;op&KK?Y7xk=`-op_Z)AEycdS9F@gr1}glvDaceIPyh*iei^N<#oe|#CP zq{UnTvx~_GbabW>xqi{VCYvK;n9Ee(u`gt<~{r>g>oko}kL9 zx~I_`S3Q>+eHBPj$~(&K(;n&T)gFroi5orm{%K^@Gpz4Iuc^|jL|RfqJgJWA->?F( zNm7InG$`$FxWy)NzkUC4vzgcTm0Bx5uC^5AzxSTWgkF~AkF?VvzAGc4UF}MiQ=ha7 zpQ2Kzy}tSYar{H%%a~sVp6$P~x;psKkWD$UX(lY+4r>3rK0DN~PSCT5J=5sb&Fu6D zstkjTbw{}$K!Y?W%Hy0I6)HUhy&5##O+U0w66>-=yN`vZ#IY6 ze+3Z;M|Z&ymI+Bm-B2IG+gd#PocSY*OLLg&VfC13)#ryJuM9~aJ@E?RkI8B{Y= zq!Hh&9#^K-UR}BjU#MrgogCU&|9JM7C?*}6U~}NjsRJMzm_mKeY%8Z(Y24dj15ZAj zV3^^-PkR45WvnCkyHAvy<_PJm3jj81{Jy_-xfSBZ-@F(^&sIr(DDZxW+ej^V5KEGY zhZ@)|5nq8jbH}%vC^TU5&+SAt2EXSFuP-{LCYhf4f5whLxVHR*t4SD{Coo)k7gv?j zi!Ob(n15+{xDzqJMDV|VXPO@y96<9LgYoh$1mlw9}+yAry5oL}3{-!_PC_ztMF69TTQkUHxHEIUxC5gdT>FqyOd& zqCD?FLuxPlJh~k7nrRbI+jFMw?K11kVIdaAc9IH9&-KiI(WZ9I&>B;$MV)W`)O9 zg0*jom0Io>3+DjWBw9eM!t16(q(b-3cblJ9b8d4+}^<*&96+(HqCNxja{HU00;eXg}X zQB+WC%Hg#X{O={`voq4zzTW-G7ZoX(+n>5tWqO5m<~`tyFc;l+Tkbx9|3zSaMFLf8 zm=&h8eeke6#b8-+g+~qb!bdCm<2j92G2L$G8BD$PkFulE2g@L)eQ9`lA3kl}Za`p+ z5&NL*!`z=e)LZekK51HxvYnEe2Bq=rCT4W?)v$8}F>fV5$+Bo|jf518QmdLg2uxl{ zg8OSp^o?PqQqfU26MV<4Q_GNTv(6Z(1ZY^6PQhsF-v!X`kPoM!^EU8^EOBjhh6MnhZ`dbrKVhS z;Orm;mF<$<#Yc>#Q_mL7(5fP0+$h>ldY?jIvdhH1ykdv@3%pRId7|d@_swD#P`|~j zZ^A*%E?}Osq?z*nCf9eWq7zYlC@0&-CS6QB_29^4zJ` zcWKgc&8{fx%wLBQ>mtVwpHZcADCf00#8UkHlm2SAL@BGd`cDc zzgsr%ztq)C4mVe9*fnum^mc7GNI!tmcukxY;QF=21y=QKLJljfz-#kt`$a(~;Jsae zo<}aCY~ugogoeTqHk3`!Y*pEWsEc}OaDI5^`*w8-f#5}K7UdQMPD?riR6zZ(bV_)2>A^0Xw z;IIW78f3zbR|1QQ5*Uq)e3;?0-NiCQWS&yhgp8-9DL1j7N3?;OCfRP^@yF`Uhhg2+ z(E~kK$O+zJ<9lPrS{Avx;sk7Ik)6~eAYX|rM$*ap-lFZaoE&DS*i&=jmNJ5wQe5rj zGgT?qki@z#Nt8n8ow|1xuma3lKuia3G4FWc?_3?bOJ=NmL;1cHl8|)jRQH*>93Dea zU}y((QIa`Etm9k%41LcHBm*oD$^WD2E2HXanr3m=;10pv-3gH3?(Xgo+}+(Bf;$9v z4-UcICAhoX&GX)Gt@D4MncdS}T~)iM*#9%ytAS{@aIoG!q6q9qgH@+E$SM=>r1EOl zb}N-=BOPl&oS+hcN0~7H4kFWYC9m(99Q~)vfUk^68Si@_ndk+Bs+HPk!Wo@I!sM-^*V4hE?iF(*} zePtm@rK!wAj@EiPw{hxVE_=`J%c7Om(oWYKwR{C(6dKPq9NJMZP~PH#OPX-QKRS-i=r>c} z5M$3EApH}RqR$e=hlp5{z-XbEF z_e}743~-BCyIbzu-;^U`d*i_ee3+iHWgpl}}M;)d{d^rfAxlC4KOwkoyn&qR5y@ELB(G=bU$LnpS{Va%M zGi}<6!z&HR@h7I^^a`*To6eNpxBh-bkIg7}GO5{`tJ~`N%dO^JVoH29 z$B9kfp~-zW@tH@AH`ofBkSt>YC<2>xahBazcYY+AgmoYt`gJ`aSSja21W||4XPMmt zf=1LITT(FX^oJaAryszn#5o)A6H8u-gE%f|aVp6u>o7Hbh7vfXh8gZd`RcKFHxsUw zWqQUDeauNqC-IYPc&e^enjhJxc5ZlUpp_j9O3%Jp%$kKr9e>$rcs_pQ%k@Ag5Nsqc z)FdDd_gAX##@}1xd&Ek8h#Q^cW)XM+Boy^?5?r(XgYo6tQ`kuHA_|s_;<0IevXJC_ zrQDm|7l;?1eMZkX6`T3(@ks`);;^-+7`J}%5_R6vUi-@0pox|tZ81h~f%9B>bEuxA zl#C6%jk{D)kLvDm95fD`pg_T)?K`xtdspCkT(*5m^yI{0++D2zD{xGVDY#wUvd~>$v!Ot?1AejYBkT; z17G#E$~OZKLw9!d5ov^}L{P#)cnm*$q}G>ibij zR|TD2el6Dp>7?0reSFhBe!gnBODDkFnOVD2B2w!9PB4!$i#%7M-eNASC=dWL#D;x+ z3#qDC$~x8|5l%DgDU#k?h_gMHg{)CnhGOs$%c+=-$5HI>`d6E_dnM(7X@t|dKEr

zHoocyfGCv@B^qYBq_p(}z`Y-f(WyKW221n)VX?1Pl3=E)JvCN0pWY3u#qyJqc0CZoP30^)k(TZe#zOm`yGYdnkPxR?wzsjLqFEVku zzp{9JyVkX)R!?ruL)dr4j*q`E7oC4dFj2u9x?UbajBoxHiNcBUiNBt&8ZAI~Pc(hc zb)tlB1%uEGGDivyh!dFYY5(VFcK98DYDwehNh|B2mrF0W4bn>;v|C-@KigiVftf}%zdLD3Eii6^o zr>i=Z_8Lo!nSxM6cA%LIDzOE9D!1=!;YX>V`#dpw$n-HKKkY`*n8X<~5z!gF)XgBU zR~z=f<`bpI7OV?--bCqz9k733E1F^ynt07rL6cmKXOE z8BZgZ=gFV?8wh>14-|+3%jlti4}7^T+eT0m5sKxQ%qv;Lc&XIt#ye4<@!z@1nS~@t z2G*#>FHUTPE5S08gjns#F0CP(N^tx?V;~y4^feZ8FRHsIgq$eBIK+t-cm(*?Aq3F zz*~cE-jbKbu%1&uYwX}#PD&(lbk2~;vXJlcih^<=Dp&ApEuH*K+SrC5Wn2Pq(3Jly zTs6o5+RLvpS(Li@##D!f&5^ucqca5%@^3=p+)Cq*M8Q~-?n%7JWDzt5AA+SX>Nu15 z6F-0!X~J9-%t)bu6V&9~4{7=@)fc5_Vf;g3qnj z(k$&V@T(=&{|A?Bj#0P$tCgaJv6joUc%-9@BHG2%w`95v2`t@}lOWoi?D!A#7l%Il z21Y|P36okX-!C2@_@P~{7D%X{*ed$c)cq?{&NUAilHNp-t&6u0q< zvHIwvgo*OnV+esjO*3TW^6AZUlV8;tX!}EH(7d8t(_64oa$B(T2-yme`;e7^au#YvK7b(XTIl`)4aVf7aU1a=_ z)V!IRyVv`7iKf%)Nk|pT3Ja|Fy1$42R0I^DDWcia{u%;KgWe7c3a4UhX z4(oquJ27>kYZiN1|zIJ%y{rE*vE_wk4(8arto!$To>~j^fW~Nga{tHqd5Vj;J z#nc6^>nNFV_r@=Yj2`s!x2NWoggA97lf%OsnCWTK`=L6$UFWor25L~1Yg;!XAJWqc zx|utqxtAGnitgW8s%gqPE!28y-jDxcho++;%I26k{N;-TEQA!%XiKKs#(tJzTr9NK z5@qLkE~uxF-?6W-7M~QUeC1nFN>S)QwF80F`%UQcXc`OHvn8k5q=bFscHYFq7PdV< zIGLGNSZgG-@9Q#QGi3(};l@3`6L(VD@x%oMagve1`h!pld5B!-i~RVLDKBE@58?LB zt{4Y_V`xYx!N$VX%+>V#BDS6MY?LFVab@QGm@hZh+M+ST({;4-VeN+haDbp`+^QMP zpCh>UIQ|SW%E|`rY0x@Rmi40dx!NxkP$(RVMr0c;zx9+OX2j6%M`l+=#qjKn6bT5n zk&VTE@DARFt7^>j`9l;J_B2W4Ja1AHW$U;;>~26@`NOtGYD7Wk&LPvE#cC;OG?jWitH^Py>CobA#VM>j8d7f*DQVKz{% z{*F={h@d5$VyrT$Pd2SMCloG{*DU0hd9{HzN*CNvF#l^>SXDlO`5_2FYL?>M(I-m+ z6~^@C354RZ<9G%eH%(v!&a|0!O{9!2Pk@S6QPq-<>Ib>>b~if#sFW%c->a9uFaLg> zb>o$-n?JK;6Bd(hs8w#&G%lgX#$hOyS?lRbkz*ynU{L8s8?knY+oeB+2vxo6mUbb#|en#JTU_B@6-B)#)@6)YV?aF1O62GP{wh)@AM*rnOx0#<; zM?4}HB50{dl%}Yyw7YPV4OESsaZ?SMpH;Pe&Eq-0j+gboluxRY^LRiI_Wu zhQVHh8xt~jV5%!AgR4u-#%#zkIKz(ZBT$4E}L~Q=gZu(v1*%Vo0m+_RP|_G z6YDqy>vdG5KMI8X<}Bf+0As%iB^#Uu9IiBoW=fnK>xpq!7uK0#3HAw7pX}kl- z^6;ih5~~y^PrphxOtsP)r~2pSEFnG0r(>q`ekhn4{K{i`c4CF|nFs{Ad+TbD)zi&8(AJH5Pk$z9kxH|RLVwpZTE(@36s;qH zv8Q_0##f}`Z%TO^8rk?)ZZz`}W|5bmu+sML(kM{jL)e6#hUYKkSj2M~`Wwo;Hd+G} zOR6e$^y>A0hbK6F=!WI52c!f_bkd8A8kpCfFFN4*rIBKF_2sepYk{H|jC&0J^z1XcV?pO;wZ^8a!N2CU#B8E^6^1y@4 zFeOKDVpPdHR`lPzpfz3%Y~N4Rsye2GG(_p>0+J&6LZt|cU6qCsg(k>54hAha9u6yA z&HanV3HBcr+3|`)QHoJSh1l!Aehfv;C|u_8RxGz@JPfrdM?mHHEFTU?HN0NVN|?&l z!$4uCF~IQ3xXJO~1`LO%8f!E-nDY_A8JSBHR+!`2#LK4j+!Hf_u4lG^0~y1^QR_qJ zt#bWEKJBn+n7-?zAcxR$E$i?DIFUf5NTv-n(&{NZO3g6M0#?8L@V zebk(XVT-a-9l*!lEO48xE>^tG8o^W= z){2s?sD}*E@>}GD=x7-|JRg>pN!0GTe&>6v9JYw8&$^pno3Kz>i?6Oh&lRyzq-b}P zrfAC5PB%J38L1xPpheo8+TP+f9M805uAA>uO~YMXSsNqJ0@KyPy8K)2_g$B1`I?90 zWJ9^dpsU*Bip*U9-wEiL8uYkL^RbLadEfGZpH5Y!5i3vMWB_kuDK>MRVV~SM;6dpy{=I7cT&f9aF%3l(x_WS$P8|< zxzDj;tyv$coABh@oKu??ep2|toW?nC_>hkIoegrP_TiunmWaXuF zpW@@~#0+Ku{}+TAdGCM;eF6IMcFu*fc)R~El|RR4@UTb)RA)Vd9w%Ch$!4zJRh0Th z18@qMohw)T} zx{9u2&llY~S*e-xP!pFEn4t8}qCTEs&FT|n zsJx8-CY&FB$L%b7@s_riapo?781L zcE(X4%y{?NW(^-+nUz+*qANI|I$k|`#wxs1su9$?IP|^Mgj}2Mqv9`L`P&9|y`hJW zub1a=#Y>WSytufKOw|)8Un%m1}qKvl2yz+t}w5P zFtz%u!7q${l?T$w$F=T%%SusMmKW|wp5wpMxkvh%BI;>vq7bQ66Bz1ppBc%XJqi1C z_W#12Yxck25KQt{hcmv{hpMSU2MS=}?!t0k{iRFwsR=iZ`of)3J{BCqd1Wo}Pc!*~w>6BT|d_K<_l!)8`TD%Co@NdM3O+@P% zz%p>rWtp(n%@Sf4M@qq0@_bJZeWay9NReX;zk)#Bel zcYz?kJS?9ilgxkE9F&cgMZK7uPX+ypH;3D^qsG^f$HN=<)=3kCXp|9^UpJ%dG2Q?h?QtE*vpMyM0shM>jj9#K0zu&r_JW>Y? z+B-}V(~x};iMV&5n4bSrM@AvK#8Cu#*aR6%cg5wRuwPH>*MINy*h{IzMc&95vLmo| zj4f7380A{Om7Y5bJ7~*_4sSYe1-_Ip161XXwuK+fDK%Fb^?hc`8GiK3?@)>^L#5TW z6ILhSrm{^DIyJdwN*GF|a@Gw)lR3ZEN>VJVD(r-V`xZKxLVloI_yzNbBcSBZ)G=KV zDf#)qfK4a&c^_`nO;k^%8Q!OQq&I`GrkmYlr0NlMtd%C&NR<5!VV0?Vq04+b;O=nu z?6V?NTH6A}4o0 zf+%V9zjX`bpIQz+`w{78naF(KudfLF+01=IYf+i-7-Na3UNn5RDJq|^pHE%(gA!ww zVhO)3HeBY)`{;Cm@4jG|bjp+OE@GH<4D9-?<98<>2F5*mW~f=Jd&i+4Hb1wH+MVog z)lo$rdw8;q4z1HW%G9>Pupy8u=0TrK|CpVrfLa-#+~a1082Lqom-jX)jIKB}t!rO; zkPEwPcQdXVtj|?xtSh*`h8p!B{Vs6%ZD?3wI0O+1$!h&G(||R9-q5wuR4`LD2W8xMd+Q7$y`25zRvtw{Nzk7t~z2t>AXp=W6E$=lDA?%;qT|3Xi$6xd+d{-S9m7b;(L$u$Z{aCP(a z@K(%)ObY?%i;X9dS%bTvWzmI2)?jK`R^SK`ue1)w8)Ogua;@S$@2uqV;y}9YkEgdH zjg*b2u!3CD{o;dxGp>(|b4KUE5{8ZiB46FyVM_xmogP}!Kb!#=9QUNrY7j#A-rY#E z`&!HXEqFtkD6(syc5>~OD%W(NmadvPSnUo(vHO68w-^E=T|(bpa;qmafAD_o$Qo%e zT>Pi1Hh{6d8NB?87IgL%Ds1|w11;<;BuR=$v@Eq%F9I*>(ethE5~j0D=50=3c1>S* zCg=Q+YX0x?cTBF;Z^>yX{vkl3oqV*6SWcvM_27Rln3Ag=ujj6)liINxfWmPPa{ObK z`jYk2BxarOXRw^1Kb?cj6nXW~J+j@bCpXJd-f?77XpN9m5OF>E_Opy{{BBKB9Is;j`Gd;D&5#$>{NRa~EafA459l#ySNv zRrysK8G5kpn+%~@#BSdyklr>&3_d0<^E~W~rW? z)ZQmE@P=AESH0hMDhe%sKYr*6;nh!~HwCU?ixd_x-3ii3Gyf`|Y8v4>WnZ~SlW%b2y?KY9l^B1B{6 ze|Ju5eUh5@&R&}Lf`Q04kGYw-PO4IugjaavDGTg5eqnG7P z9&;u!_^DPR(^NmNW`#V>p0**b;Ug6J|I-CYTtP4K5g4qVrA3zZea6UD!ZLC1R13A$ z#lrjLFugM1^}5+WDA>ZK6@N&o4NBOR+m9@m*oTwf&;hmcjwQ3od?Ob4%fLA4-O zK6_QU)&FYIBxq5&Qc$1(PDKnU-8T>f)2A9WoiBk6x^z2IQ%(q8fR4|#i9--ucx+=( z8d0=j1E1qNKTOYbl&vNu{K6H62?9GrV=;bhv!cQ-%p%V>p0P_nPaeo{pANnW3G>S}zn$Ai1x8l-z@K=FzVJi7MZm zNN@RY5f{M9@nK~=UVBlTe{N=2DKywi6QO``0(Yhc#+UwRe5=cIgJ1>!3$azQ>NK zt3#9Jq!|~-RM@wfwDP?g8<@v!a*dR#YU!UQ8bFa(uo&Wa*asnk1wC9PO)}u-7|&8p zM^K~&+Kiqkt2v!ll{&&O)vCg(AcE*vfi(zg!@YAcSY9Cn6yZ`7NSXuv;oX5_D_s_I zMA+dufB&MjcFXs+q5df+DJUtHZyl*@6J?gGDi15t}4 z$pPn4#rWzMYv61)1tO>gFhQterWDn>zD}-u18=HwyM^rD3ASD}j|{J3sSL7~ig7tU zR2olH2i{g4xqz8&w$ZMsO^2;v&>SDdmiE;xt$>+!_U;{G+s@d1OecQV%@tYUUvJmB zANO9?ks66M)|nAG@lo)RdRHebDEy)tG!)Ij^0a>>h0T@ODBkqQ`l~pKaE@8lfk_)H zlYWC^uMwEvaMReAzh)=lR42W|_qr?5W4`5uubXOO%)?%Rwb<1S*O{3twNUpc-j&J` zaR;f4==rQ4zF?WSnYfs^2;i>*Y2rGKZC5MFn$->(QQBNV+Pv)b$!!YF zhL389s4LynSuz=?+R)3INYF3vXH6w0a$23^h!tp?Th{YsfO%D8{Atx13RU;>t`pa0 zThDWOGsPVJUHX(T%Fie$UB;)b45}&8I_u~QB3oV_y;3ahrg(qnpH?X~Rj=q1Ifl$# zVhWeNglA^#0q1N&Y;C{m5JcXR)mbcz=?W~ zqT4SCFvonjeOYB$L|mtItt_#^ZrnzP02~<;Ne-B_i^x8Zgb=lR>_k(nEG-^&Prt>v zo8VL{?=mr#P}it&|A3w_HQT^q4k=^5$CKTeo&y_<=7IZa_WYc!uUCVxz8|a00692H5Ft{C6YaSTv(tIG}Mnx)6jFx zRsnh3zW^!Vhfs?Pgwq)@fKyA&w;=Pt%?n4z3=xmt2RDMw>2&$TrB7Bi2xeE@0Gc+X z>paoHMQk?6rZ>~oX?#F;f2s%4b+Coup z0tvL7uV=_No|_q*6}#fi%~krBnc3s)mFxO0w#doh(&mbR;YVL#%DXuf(<*h;){|=- zrJ|=MkR|s#_~XX<^)BcUTsdim6j7YEF5j}u5mAWs{94aAWF(Fzk!)4)%>jZ%qm4#? zYMH~ftBEs%%13%NfS2fo=LXUgL$9U@wZM955UEHn&A zHui_aSKe+u!Fnel(9>90%9sD1XS2@-!ZI3}QXc^(nxq31V6mbnUDA~OR3?HTO$WS< z0ja`0nMn0^wh^D^3>_Y&tHbg#<0uXX%_hqOMHD`O$qS+1T-}n2t%RPUNfSc?pZ)R= zJYmjvnTsIcfGO%z2lxscxa;t%#LCQ(>oI~q0K(!W)aOpKz$HdJfF4bF>vlSKL@poS}~+At{>>yp=Ts3V5y)2~Z{#m^PUzc!ho ztpEqc+tjMi$D9i}yo%nwAW0nXy&THU2+C<=ZD!Ai=!?wV1rMQOVi?lMjesDIajP1y z{%C0 zj@35OaVc5#SnUr+8s<1l*QsAg|78tXQ+=gTSA8uIO<=^_HTVTw6eVayynkE*Qx=lr z2bZD1Tg23X^jXxuq06IeW9M-S-}AfHMr6L-MtSdD@bR)Me>`S~R8&YB^u?x|!^`Z=ubev0-+R!BduOCpAL9xe|=9vjB% z!3M}zKnR^sMS35o9zfQiS8o2&Sk<6~`r)9jh5~U!oM%5Hb3Wu$?ONg~knFt#%BK6e z+4rln8|EyFb zJ26e^2k2$7j!k98oG^R`BB zC(tH@v6iPu!4ptISoZkEk2S=nahh&FAxPlpw&0p3Wpsg?-$53B9u?c=X4-U~ZTER- z<%8?sIaYcJ-@L*#NU$&EnCnZUjazZ@usZm_086DR68eVHTqhgbd7}4o+0zl!nxFmTo3vZnTe)-2j)wUu06xH`h7h8(hpNqS z#ByMdirWxgx(R=~jcq+>&%NX!h|I&>Q$J~AJ87el%B(;?V7a3Hit?BG zx$a22L&{CE3q4X5V6Q#D+6i*JodeGVg+qVDy)R`Vs9C73rrmnN5MZYCfK8!+%39^v;9fjb&Au{g?&Os! zxTRNiHAafiBLY1a1F}2ie@hGs+|x)KS1)Skp2rpPr1TGvJKdwLm-+B=blX$c{Pwlj z%`{!l!OAET15n(rB3R5v{K#QM=nJFX{11EAenu(>D|}hT=evnu7Ap99>unz0l*FLz z(Xi?;LjPp(cI~IEW*^zE6p!(cTZ4nAXMgcC3f7wu3QsSOg809!3pd_7t&~Th8SZAB&2-u1z z5oHN3=^pMpo5;Rk&i%zK&%o7`v0YIngw)A+xJPDtjqXj@KEKa}jyQvEf-&^ABve=g zCAIdqd;G|DvuHZ&8q^I9jyDp%i$+-uXv_x1<2;E#4E={@qZm%mEr$Y;pEBJ8s9*=b z%c=ZBpi-(}|Lhma=VzeuPMbppkJ-5_=D1Yx@*jSobys3HR(n$cBeX{l7mLH$X$nFO z!X^#?5$rR*tPPt+OK_3M^3veA^PTb_U~XrmRb!7v84H-SojAzpCDNs~$4}!O{2J%Y z2rLspN|+}OyW3q3%fsy; z0dg8DgyP3Hl%Qu3>K{V}Lu3^XhrRV>&~QF?L%j)QLO{ei)r?i~y?8WN@k;TDJXuk- zKck8_Y4;+0g$aTARsxY+Ny zAOV(ZQHtU*{tyeD79YiMC3~qRhPjjCVP+#uQ%Ocl+u5q=t)tR*|K7FRhqvy4;@(t& zPhs;$u3{;LoevaXn0;#q9}sQP0msTa9Ukw#;ALi4L0xsdDjpJCQhw|R@c%_&dOmia zHQr7g36DCXw-}TW=2N7tqn_XkkE@qlOg?s}>yq2Z2izl}Jz?=y9x(zAaJKsvZb3Fd zCkN3PqUd;47swq(Fo-ROh*)GrN zJi%~uX>402ohA}-VMP>( zjHlVN2ny-VP%PEQ;;>Xq+48cr^VOzi`E5eLdpQtM&BOyG)P61av(^m{kmnMj_YRAc@XoRPcgiUS~&_u7{xN)-uf@@7v`1+ ziCAgKkia1~!6A;!Y?7j%suAU$POwm*xR;ady*e*rR%;fkaXKozTWjE5NUxyrIDM9-t%r#IWlkJy6(;n#rP|sR?S;L&OVtn! zj>G^ADv&Ub*abj_L%!?XwjPd%hz&~*Y-M{6%UjwvCX3vBv-)kcOW(GB*0E>mT3gPnF_!&&ug=k!;N~j!)+zS~<>$m-ptTLQ}%IeM0hQZ+C)U2?+w>Gdl zvL@b|b+R`v-TRkbQ1m7!z*b|nZCZ9!XgTc+YBVXgObL1y3~FKVbPo0PbP{QXf*zuq zs2%F&YPsLL*lG=ttL_{8_QfykQ|1yR+J!_7`U8Lrl%F{hJs;&9xt(-%QKvUgwJCVo;yQb+{1n-7VCL#W49t-2h9belfr1pbAm8bJ-=5vu{y)x@wLF0418gt-e+)Yr1#(=wDM zw8GGQBo<}Ry`O+I`gzq96kjDr;3?leF*PO#tq2*My`6j@( z#Rih7{g$!IFxPA5*63uoGhAuTzaEUZC$9;#h6So0xOF$lr z+MTYGP1hBPkynsWk5Du+u$cszeanjnsybd$J{}v9#-uIXr^lXYbJvR7+SnYQAvXF4 zWV6=|ts7yWv>Fv`FrDrsf$J_}jq3L?4?vvEFAnCpRNeLPksKgGpB`VX$5KA->uGa5 zAZ)-~fwx@W^M$AFlzvFwPPh#Y3X!7Iu9=ii%zP)Ka%&?&q%+vthOX_BavClS4q*~{ zmJ)1l$jH@8-p@aLs|N||WwPnm3C)#csheLZTOn$zQPQ-6OIiFc@xJ1kD~6=a^4DV8-)}ASW6F;!Nu^`tnb{`{8DFX=(ya%i?tZK zrBdahv`y^3RBiq&qIEvEL!qJ6;z7co}t6W_!`-St{ZNWbP7mWPPE}`@ZrbNjon+c(PHjcvulJ%vK=u zu)~f0y$g3+8}uS`m5foO?HDVM1&htyTeZWUI)H4T-b~cevko|YCmc3+M$uHHaY_Is zp87tkvtcOo+=&Ic&3?q@X%gPneifV`{IIZ+v`16AKB*b?EnpM;S_rxp;9aaC7SQ!* zg$9qg{-Xm+u_RsJ9w3k)H$bKPu?gtY9wRlE#w*%xEww67=KcYuhy8&mip9>49{;gA zkt7y^kG*_{zY>r0dfGhgcX>aN!4cE5n2kA1z+$++hTGi9Y(x_ee}OP~{I@zsMKSQl zQnqW{O`rqr;rXyh>-G2u{l=S5D)Rrl042*183_Yuyc`03cGi)7MVyC=I?fHe%$Y$gq(O_oOHZM)E(3~UKytLc{efgdhE=JC0Klei9~?H zt?J?ZAUe-zsCFrN@LaVYph4o?KG4T4L{Edmhw&m*+IoPKmPt@aT3q~s`^o=miW}@H zU-TTQA%kZe!M~~|4QtNz5%X%_p5s0V)aAZWr^*hgEcSYG(f5Kxp-`n7J%M`dWIH4U zG}Ji#TVrWyC7#X$Z#kaiE1Zp(>ZDb;_x!{I*a$#K_<(e`4ek4zb<`{G2IhNb?IcZ= zEIFx`UG*YG#dcvfifhR~-mE`WOW8S4KCJ#Fia{*b%=ZoX5uHA!#Y~tn1-6LZO-T1H zix3Z0BrNhR7>X1>>mIZki~;(cXy_4yl{mPax=0U9tk({J|J!}m*XNXQCj^l~Xp-m~ zZgjwPM)oOy*=aZHas-0D5Xv_onhtETbz#2)&yfPTTbeq67$M<(S6xo_W*weI+t)WI zKyCSv#i?M2Q%}z6l5lczq*_ukb_p{W-qv~X^&G%1Irz*t=c82FH5mJlb;AZM61w2p ze(^E>;}?kGfHqZSU{D_Ei}#3S4?)q@Uu?HU!!8gcFght=)-0RtCeifNW!Ax9lCTca znIFHJjV2Y1BIrlD`Q>m4nOtIkmPrJp86F2j33*_gw}BjWXQp>3JJm8Exk2Wn%DuWG zgn*bJk=CZ^3Vu;g)0Og{)nN|T(~yr)aM)bzo89*?1QFie6oipP#xaUd#Dm%(v+?jn z?hlgMn<}&KTge8_;jbwQoW%ktZ%{BqcVvdg(6J)Uc8E7jc*7u=fJ^b)nwxFRty{r; z>2c^}cL7tmCa&EI>Wz-fK!z)?Q*{!{Cg-*hy$iJ|}eb4k%^pF4McN@(j- zE7V&s>&6su{ZVZX*;j6*tYB8Xp)0$uyre^Q0d2v zEjEyRD^VW=1t@3+EwDP(c7wo#B?ZD?6d}V~RJ?Yrd{?<|%$x^6XPr8)=4-#@NC&A~ zr@qZ8m_(diIsREh4+u$z9Z$QmMF2Nuz;y0kW?`#82ka#u)Wd;OPZ)OkQFaPhx66PE z$PRi)Vn^2w=kyU$PYb8Ek-q8HEAx~NSwmMWd{C2J(oILJUDAbthR1@Z(ar(kh#I^t zYVbQ-4;W(YPw6d%$g!D^M`DBuEjRH9%pMfwYBq~ zS>86)6Ug%YNoVB>|LlVBLA0SeAT_!d_#Humx4%mNzD3=_N)x*I`!#^Y4H?no(7~p} z_IZeirK(v#Tir|xV*6J+EBw1qe<)J;%~>o34U+W5NH5UXX*(-T?ir!C1C9CDH}FYd zp6V1g4)95be!Y&0{iy{Sdba?@pies&Ip|>z2-svY7(pI^*n5_hQ^otGtLsh*T{!16 zZN6dOQrx;>x~;5dg$OBAY=X{jPqbRQv(_Yb= z7C_9#U{&G3r@cUK&L?$>mjj073$KIgQI{!rGUSk$@WMsH;QQb=i*)G1-+a6Zk5>_GZ z|3}j|#@F>dU&pqZq-kukF&nFmZQFKZr?HKOH@5i=8r!z*JSV^B^M8?d$-UWg_MTa5 z&6<615@Cy9@CB~txddOGetoA&pHxr`I|XmKdpNuu0d1>Afag32#Z8qkYT`QklU#W@v~h1+}rXw5dkN6ko`Q44hQ_B`L0wN$!$qc~VhsJ#6ny@LV(&H^>!f$vD+ zl8)CEs1iTB)G_Q){PBNva|`KbvIZl5Y*q1|Xu5gMGtjY8*OqVP`DMkibeDFM?|RN6 ze{PaofA&ib;-w3hJn{eb!arVrF3rA8xMvw;p)I!XkOX{ZA))f6l(KRHz->EhT5PmH4&41mY5rU)LI=r{Kh{zR3lX8HmitV^+2;szLv_I%n zR^O9)==pGE$NOOiK79ros`$h(EAB*l{7oW8NJhVvn4NV^;~#*on(sRSFZ2u*wXch8 zdZ6n@nzfpV`B1+7xl2n@*OQg4wOewtb1dIPCbjURH+}-04^Y-hvb3O!ja>#F3we{qKGTycI z+pgLnU^@l^4DORt!~mS4QF@@Gu0B@j^|4Folx380rGC+&u{^&`t-wd`3uEijn*I3Q z(^8AKMpoH6=ct-oRDY40^LNTVQ}5Jg(*LRCbK(YtYN1GO64Hm?xUkKOo}r4aO*+5d z9nKD?m?gOJs~%Qk@t(O=N6;7wIJy7E6ihJomN9V=arEH22#N2$6(*Dc8a^U4pY=vB zX=i*0K@5C$GnUgVVt^@jJ>HjV}++ME-k%2(WZKoc%2(9Zt?pqN@9dAov1Z(RTRNVe#SKx-=a$^e^>#~GGU`; z6WG1E6g)6~oN)3TsL`FFr1rgOz`7|;9`f!6;}l|7$7yescl$WEt2%>)5-P6MTv91=?Yb9?Y+J5^A8O`G1diX08g?^3h5DIQhsCKb2brKU_gP^TzX5+whjUI z{MdTcsc~+aM{_B8Y57kNf=OXtAnd$7awQ_mE1*ceMThHqmmhmffXmdNQlFs?9>jvhSG!)W#w9{X3|T$cz|`|um54V=SF-f} z4q_03)y#{uTH2=7qRe!JG4W1(cc31+j{Hm?f^SAB8z~yXXyRBSNY%E4F@j8eZ;^CA z8+c7Bw$&s`fQw&y9{P}Dzd>i%H3ibXE-X;v<&I1(W0}t4OVF5GsfPc+;b}h*qWZW# z5k3GGXWRZD)uls2P&sNSn*Ut{?7nvvhWmSdV{n$JGm;2LH8b`^m+mXK^plE4W~hw< zm$zWaNt2#T3lVT%PrPCwe-~5Scr6^_F>;EibwAq3SHMJo$18p{#+nnwyV|kL?V4rl z^ytg-8;oAY_DkOT6h0t@Mt{&uF6pdcyW#F!ZA<42jCwlp}`qvupVx$2g{=ttt7AX~ z>;+s)dVQS17nVQfMQSF45;xSXT_54b55Rn^>`%)&aW7##1bwzB+K9ftW2!2Jegn?_ z{H9A$RtkLY`9B#2y?s_bPXc~4HF8{a2Oy0PaQK+YDZXz1Wq&!Zb;&}l5iFB254$xT z=Dh~{^yP2zLjXii~*%Ft6sUkqSWS{8LMkzT20q4BtYLO`!)IE9K2QNxwSqFkAy z^5=i)(6t$fij^`_d7#*^I0lCLcXoDIrd!=XDX1BS?xIphRfR;|=&%D%`=OYNjoNU+ zXfWfCI7(aI6HCAt{VdqAH{1^yu7a}8Eghp+dA8@>iK1oscWp-_R{1<*5aq}+i9tCL z7)n&Nj)6bWuRx-}PX#9kZfPP-(E$gh)NHsPnw@QX=)E#CBtirAN?+7*341k0Xh&)U z?(ey%{1~OQ>a=kHFVEPRR0LaRyy3?a0HXRw+ij{YZu~Jy_ zO(|I(6k60)CwViI48BeOL9X8W%Me@*;srD7wruRCW=OXDW*Rg7_1;0Xe4g?}Rm!?W zR)IsPlt2a&7(KT5TIv2uLDV$3r%u{~fgk;sLOqEY80Na@{9}62f+E~S8hFh<50OVa z>RrMyeoCY2IFWW=?8kI(%^9oY7^?CTpG4U8?Xbsq0K*dM${+4WFtRre*KdIW;#zKD z8gn90>%^nwvYmXXs4_T> zGO>Tt2U#M}_y<2=hqQn?Ay1$Ua^tjGofq#4=oY zJVJM!!@5HE6PQcWP&U#6gZ`=9!<0$PT}`wivAs9hZEE?d#( z_BJdX$d9a-p$3+E)W96UFL)e#YH{D9aCNm(j#K`jbN7Swaq5x5V;H;!nMr(t6^KmY{619ba1`@0g{e4p?jmStIA;pvCXKrT!#KtHlz`O z$FIz#1ni|(X4%3&`m$)F5cQ702x^eeosR87GCjipr}B$YigXQxY^lGNe@dhv;wSR% z)mP|N-^3-JySTHQZlnJ;Q^*R0yvRDkIhRJYuM&7)R2QNy&4115fc@EN?ahPGbDT^o zzUq6$K~|_zRZp8H(bGAR7 z+*y0rI`OeolBTf{h_kfKKf47LtNA><$|h(Lt9r{|HLAJ4wse;S%#^KW|Iej_goE5p z#MS=jR9H};h!rD1TH|5c#?iwN1e$vQTgxE^8w#LGdCqhT98Hkn_jI(zcE*#ggAzu= zj}F0KZoD!0{?L8*@a6GghA{MW%YN(+eDTkEe9ChQQ2=M8dxN8FEa3S8I#aQqz*Ymg z9G~MMv_fjb#Z-5We-V&yts&t>zQBx9Zw?8ihee{$>i5XfJq-WY`M1>G5-KwyJ$=F1Cmj+WUj%E>AyQvEUx_~yll@UD$|GPCuEG=Dv?;9 z9;)}fhk?qP0u_PYW#S^Mpzv-FN#S#YAArWeOzy7-Rwu0+X?g*nGU5XXtZ=gn~^r3jHP*N zgrbRG(nnpU$8IWcxRgiI%9KZ>P0A!IcI$o^EQ|M|Q`1P!Yi?Gb4TCi|gw zgU_lD=+?v{;8(at4=Qth?0oY8`gUOlK;(rNDL;IdcUoT%`=w2Lc$$QzjaV=?K8#7% z1>|iAVVJ@o41sor>9M+o!cPDUoWcb!p+90UhZ;1SrN=veyl2SK5|Txq-}#EJMUzmh zwm4b??(5jD^^75qqH?q%Z=M?ZW|={}C?cl?UBJ`9XzV7hT&u2%jhSY)d@?a36mZ=6L+o{h5zPauxn^aJ}OGqmcyN`a?0Uoz7u3 zFqx~I@4j{XNkzhoGk;IY8$8VH!uXkjtrFK<>yqF_Ehg5 z729u*S+P`0UR648MJD~`$QfSjktt8BZ_PtKKff%-pM6aTjaVVNavxd;a_7mfu8&+cJ)R%DUH=LQZJ0bhzJ1)Uk$A?8SV8RFttl*W33wVrlSYB3P!##iMZ% z7ioS^V_T4RxBwFj-&P9xy$EM;vE9|CJ;cuR`jpP-pSl01vLq zAjh~5p5dTY*6bsHhPa{U8&6M^moyOU= za*|pG4dF+BoWn?%jt#dC^oA&UR{$}%9J;&D=FH|HUZl?uJqiKm({tjkY@R45MTEb< z+9b8sWNWxcq_*&ZDs5#3wQC63H(90Z0^H)04m1dF!b>kPo+CmQ2wmZ}eOe{ZZM8vD zie4wa@r^GXk>L@sDhJl{t9H zF8EY<`o2n3MYCpvFc}rN)701tv?Q}>In@OTs}hkF4`N=Agd@h)O}K)sFoAYae!4OOLg}za<+mux^CI zi;`x&ZbnB~g2;dnF)FCHr+RW2iA1z(48Qzc33pM)Na#zFt&Ix42|O0`ilgDMBdu?l zAYDVz>KidWTFGJqp8OYe>m|Dy*U+AQAIhN{`f;3<5nq)K%9_aNePhJ*12~=r<)ami zBCW4U@(kGc#t6y-jWLBc9lwIsV&eoBusN$Dy8cbMU2~RSGT9Be%x)saXYHP2Xd`kOu41vGZkI0b zu1zi`tA-jrNlL7?cVc8xjw_9cJBewjeZz2^HcMRNw`nv~U~9Sdl7x}@PgFdCFx*Bj zHT=h?5`L4OS(AtYi>2i3Bcpa_tMbc3!9W7;q*OdTFuxp3Q}drmRW{RPP8A)4GBgxW zeC*zrrXNQiH?g^dF`H6`%FS&5Q9>?&5mA7So`cK%o0UWQ8+~8lcsX=f4FwHvB1x-l ziFOcO%!_yNO`X4R4XCZVFGL%e(Z4?nq7F{<2G8ues0zrqI}N!V@dKkgxSv+i46tStv_6qzHS4lag(I4g|Dni<{q}7lU zdV?r@DGnD@!HhPE@flUOkI1909nyguqy#)^Tnpvv->~1We^DZ{iE#(8 zf5XXhE@B<%E9hA=96rcE-Um%BH4p7N8+Zs0ly$5sZt>;QRRuNh%FUl6P3HyocH7>| zdw(#}0;_0T`6HZG;)<^>PK!th`yy}%L%?lQW0}!2QVH|*AvH4!6CXOfM{ezgKIL zZQ0d3*7TM2kk@2GQ+>U#s3Bf;x4bUJ{jOTGD0;$#iJt?EX-M>83k4xwnaKG$?3X{! z4)&jJYz7=VEgu{^(=g(YaK-A)Nh^Nl+Jq!J1n>SYO`3_u-2> z)bVKeXVJnh$BVOn^IW3_BABKsb#VGx6Jx3?WBKshs$=NmJJoc=?mUST#IzlxDdgAE zwmdy12cRywLrvoIz7ddfUuwhcy8Nhry$Y;f)$h+1oEf}B(6WD-vl5oaCZ|SI=nd+@ z@AFzJ#m&l=zG9ToqIJ4qVNh@C+XNAXJUOO#D6}1mge~&Nc0I^@sUqJv^WbGi1Xdqd zMe^%~dbkLuqNiA_x)-I4w*6%v!NTrzvS@=***o61b|K_9sxeIHSye&*epbh9nU;1g z@*pa$(Xyfjoq0e4lB|8C3uJ1<)8_2&(^>F5n$)iRW!A4E%BW%}EqVK37k$ramo%PT z5WZxx(!Q}BjQWGmJz--#Oxi=OqV}*cEZ}}q?mZ;Ojs>BSusYKbZ1{TYmw!w*fA`Po znd??*$=^VA{sL?E%MY=c?nJWM0ro8ns-Eu&P7vZ;AmrKL^}qIsi3dmM3J$vB^1kL#Ajs4n3_`hb`jA~ z6kA{*1XI(~?~bLhWpX*>uez0AD}f^Pp>QfW)jNlCo#=vnvs9|iOQyQY#rtGeo=sCz zO!1c@N}c$p+}Dge;v0BRt(NO2Hcyml2NCp59{P8#CTmSb9UuCSBK4Ui9UNFne&+1& z4ksM8`u6M$U?TPL(m5yFvEm9Y_EoBR9IeaKq>Q{M9($#*8a{ltZ1Fuk2iy4g0Uulx z&i%eJN*Z-~Qgc#X2re(ggHZ}s+bKBUci;7)YMB@kj}b=*+LZ*}0Z!=37bf%nqXl0N z?F;iLDZkk=eAAlR_{7v;RpS*^bj*6!GEW4jEd3_0bm`TcZRFY4%#krD$XbK(Wj@@tgNgf zXRRwXGDv;7g@r*%CGs^cC#uQx8oj{M7rXofTdVYbZB~Zac8~Yr@S#hc3qpmU`w-2GSkAqEV{hsY6rU+_^MX7 zi}6$zBV2Ar^0ii%0)xH~V`Jl7>JjdT{#yEo$jIS|3A3C1fApI5VMQ`2wO$Xl^rL0- z{M;(U9!3g5Zfc^B=f*^CdMAAa=ygG@wi+qlL*V?3|QvAk$%9;!NvW&g5%XTs1 zsV8?#{h=KB%S-{p93JVcbf4*c#5%pgl|=P-F3TmvBoQ2C>0A8}khBRPx-o?qhuQ3S zw$sdKM6p)+Ms`wi5e6){?#$$A&hoVYIJM+8D;;&6*WD1vukDZ~-d~;chh5!xIzoD_ zQZ}_o{-EXI$El#}7Hp3Kb^3Rk5t9_1!9uA7TsBiAe$U(Poh#*K)Ar3HKFp=1rF!$J z-vU0*_A53`=twXcjn;T|rvJ9`Ja5kGvxREPzunr_nOk$R+$_Gk%P=QF6A@bntuvI+)k8 zEBcuuK%InDQhI2)x0*6GCY#P_C;xE1*0PtZMa{slH_Fsy{QmkxuiKug)8?x1>zDod zi-FV%>Gi6Y!Tc%n<5sjU<4LaS^2Pb9y#*Q(sv>@f7U;SbC@%Lu8uY#v0_PD)V8hT} zMGu*b!H_x_O+=dfZyD0-qpIKV@fk(lG}?Q!Plhp6q0DJK6e`%nma61Wxbuo#hQc9eUOv+NupM^SbT|c!5K^R5!iv8a3iRFyjP;w#ikgvUu_Q9Z21_= zwWH#g|8XbPjV8HYIsY__IJ^;-?in0Pb&i<(HMdOV!J~a8wyd|fgObS?%k&JTKofjl z1WvQb_FuilOe&8HtVI0hC_XndK%sq8z_>?u)Ju0XnrRawaCw z@=$pgDe(+ymR32^aWSi@f2cs#thy>qNw(N42j%YwM%6N~SXcxZa=mj_jb?eX8Qp{* zR1Boz|LEheb>@H%oM?8~N#$}N{SktcCl-mbhZUQyt2E$csDb0*;ZdR6k-k)Cc5}aC zH99mMZtyoulD>r-s-UNRR2rez_Hg}z+lJ+F_;1_P!?U3;4uJYo_Rm&jx-C-e`DouaM=VB%eEAidaMEbKaZ7-+WnSZvU8}?`h)```MC#ZXO zdGZmqx}J>yIq>mm!f!n1{gz5RhCqrKEo{I-Iq9gZxZiBhF~%gFlGp9r`0e@bbg3@X z=jC37H$y`>yrWzfBhlHSGJa3+VTop=v)rFN<56Z_8F%`J(H0NC!BJCecFo~}Se{3f z;R{#EFi+m%Oj7cS5RFEslp2{hH(p~EWA(O!7dR0l)ydxu&mYHve;6Bt^-EHMk>%Y};R^Jv! z7%45+qO4P0cvcow+-;VD?90#gUr&O`#1FY&SQI#B%$~RA=dCA zMXbhe+IuI`7acfZDJl4JHPHT?nx4sAnM%!LX8L^-2KMcXv*P2K4_>`RnJ6dyIKSQk z^hrjK!rvk&ki=zdi^2P&e3&G}y$TleAo8sH{R^H&V!n>_&_6}eAF&+-^zLrKQ+(%; z!;S+G>fqX_So01U7SUGVr5n_XRcZwVT?-8-N-Zk&E=ms1Y7fT7)CdAzYzkq{3IeYJ z?puA#GT+H(=oF)X2nQnG2pk^>cs8ENAa(h^WNx<9&B`H`hXQ?5vV@ zq4fBdhayB9D#Iu#E)uKNJUyZ3AxXCPwbXa(#cm+2v&hvg`<(LWMSy`|LvEFUlu6XV zYtCgrTLry4oo9{Glyv0EfF-bDZQojb{~#p2=rx-!Ll>-jrZN)oTwL2$<+C3FCI)9C z#L4h_za56na;f^NuahNoTN13pbjEy%ZL1R(NohhPmZC{kjUCHbV zWkZe$maARKcQ@}ku?Uc8Ol~f9wP!{T>W4D^Xrq$W@^@^$k6)Bon!4WIR;~6lT0#V( z%Ib{tf2_InYrPA4ma|}9Vl@&&7=2ULPwrUtyTK^sGyeksTk~n{=zn8l70#goQ>y6x z+uMfoAiar9ZYT9tXPT8p8!{|}Id$}a+HguXu(vkzsM7+L!V>8h99nQY4IVwQfNjO$ zDl(iLoA2r^bNVabGgUCY3ToyLa`N&hz^OO+#G`I&F1LqMke~&vbGD?8DtHwQ9{SPk z*-|Cz_4c%9GEXajkefaf#5y`id`7q6w8ekm1ljj` zL9rKpS<51g&i(0+>@vHOVIal8ix$t@-dtQ=@==NJ6G&fPluBTe0*^HcsuRiw%eSu5c+Mivkjv0lCyKN=Dlz4q!@tW5_p$QD70lERDRxS6*%Y8edWsLO)?5DG>4cnYw9)!Z!T>82&-iX*I3lS7KPNw; zE-|&#X!Dh+;}!$)3*+u)PhetVqPFr^kwqUW|L=0p1H!{g=1ATy*bO89{rgvBwNNFS z#go)_-Wr+Apar3?G0%O+i&5mv#poz+x%Q3M^>Xm5-6a69hag^5R0i0slCx!0tgV2} zfRGU4fh+jm4_nAK;!<0o0Y~yLt%M5@*Z(j-PJ>*A*M25e?+Kk5!9vHa2wjdnKq8$N z7s+Vq8nRW0`nJrBy_{dj;D?ZzJFF$q(@7FCV=bzMo)s~azGJn{5`fo(<3MIf=3k=^ zxF5ISnSs7m?Ma6p8y`x#K#NLyZEf5%4E*qGgq*O7M4K!w?alGU&DHwK5seeO{09L+ zk}nBbfiA+w?^+#qM<0?%8;}{ zrw_-!k|L8W(g_5-QyZ)nu7PA&XFf%WLL}g=Abip=5Po(zRRD`gDXZTb1h4J;w8w5S zT{yx++i-?>;AR%eO@LBoGKvFKy}o?0$VK20JUu;qIjh>g6UvdNC3`VPIw_heO%h4g z)0Y~7#$UMA)CLZ5x0GQX+^4R}q>Dm17U4T!LhI+nRhKD}u>3}N*I&!Ye5coe!*es3 zFUc0KCN3oY0lx{k$(RebfL$)$%&2~c3ciZyJcv>(y-ZK;Z_qKvmJn(cEjudjA9p+w z8W_e{@sav=^7c}A+iQNAUerZzOuWRn%Q8mhOwkv*Od6dE z2W!|oR&J>*20b+h%Ar7IV0Am!7I@ml%=Ue@D3;F}Y3h2jfkDCrL#s0|iP!Zc3ErkS#0st6xlGJn!p04+>u(0%T#iOhE*OxIbdpO?MZSjwa^whAs)QB0h zrdjCVmw(#y)cTTDU%bq{@c~@7?y z?)OGZTc+IkH4L!uqW`SobQJqxvzfHZZzgZTSCTFkMVN06G}y-~e3-3y{#fF~jc~ag ztiB)Jh)_eUpr(6YdIY)f%Ee^Y%#6+lxff9Z;>{m2309wH=MYpP`Eu1t!(e1g6ZpUG za(jmP*Vm7ieW)HUXH84BCWu3^L_@U|K{TWh`TeY}+z~^-t~;5%#{6hYjE|4UKq27j zj;D}u-%C{bvukx$l{y^U$-NmyseLm}oJ{DVC+TLl zLnN=CR&N@V@c_hs!yya4$zq{6M+yItTf+V!#J<{+ew!^|g8dpox>svBHwQg}0Qv&f zWK^=}Qb|15-{3z>l(|{@;*Ua31?@DZrl?e78ubvGu@|=5teio^|H2&^OtIB(5&1Y=H5oZ{UC)o_FKY zrm?TaVCD_K*_DVLfanl$==F!=DV&d{g8{{a#bg9)Fy@=gCzht+QvEZM7@w}K)E?YZ zOYi99)beuP)^gUkvRH3{8HvMSc)r@={j`^I*s6PzPU;}yqpFGn>`9Z)1M4t={aJBU zROsX+GXE~3lz@WJ2n2mIfnv*MHcs%}cJ;rWK-f`iq>AwdZp=Eg$%g1&><$ibo%1}P zGZd0`PkuBj<-jV~<|Les@oh0VNWKz_uytSvWEKKPK}^|^i)-qOvDIaFlV<@TR_HC% zI-^5s*nRk}d4CA1-+r=+S~X^u^AIz_vd6r1#8{U9stsM}%L1{Y#-iaHU(?WFVx-`B zGDnzWKso|3p+p35+Fq|5iA4`C7HC-T;@CUZ<~DID$zri&=9DrTH@lrgP4Hb)#HynU zlWjC6vq*}IiZEs`i&TDz0%?)kE<}Ded6-HdeOCkGmagX!#iuMl7R%TB&23d!US3`n zJscG0%QB(!>b9-Z@#-rW2#adESZ%;}{U4e4)xa0NtA0#+^=hygcBWL}QEsZCGB#lI z`aaL(OgC7m6(;Vn%5mp_&YHt*So>S5Xd-$8AYt8szw_7%{z6Sn4Q7e+ix4E_$$q#Z zwU-^P3q+9wFhe7+i2O}h?9GBahP_g>5e+>F^?EYS>baI{a2u#4AJf4$SS60$>Zp&D zKeV?nh$SZ>-oy;}XrI#K@so3a8ZSjwq>5JBKTZPY3$}shP7i9FfoMWAcq4&zM{L{X zj%&{kOpmzgdN9Viw*`HVj~PqcF1Khunfs%J0}!_SzxDS+*bvXo%8yqJ?~9B{Z@$uQ zY9i>`t-)|sqb*|KHdIDy)q!!aE=n!7sVVO|?8$RWh`v$E1)8e-XVsrCMiz5o60`} ztPLMX70&??-`v-8cA>IUZerVggC543g*B@TmN7*TCR`5mQ!iKiLLZ-<4RLH~w$815 z*e4XUC8j-N3c#pEh-=s?gI)f+gs*DV-ia7xk2%n=UNx$|lnI<$L5j$)A;o@!+%Cl} zud&+@0LVADuHTzWtMgGWATECjARS&0F$3Y5O#VPQfymrB<}m&b4F(y%f2u%YsoDVY zQ>=2@AKSV;ngMe@o(=zM+Z-^QKsD3mX6NYWIHF;Wab}8b2aNy|SfSMv^RVHU12Cu> zvk5|J8JP)(Jl=~2C0C~OeYmP-S)*4W)DGUiyWguh@nkhr>&SFLawa{K6f8g?ad^Q+ zo#@I*T_!$p%Xl@?O}+SeH&9{ET9lBP2wivrv;0u<{1vonh*h;=vro?Ql#LlDfb9;c zo>-r(gsTQF<%f0Zf74deaBU2gy@HHrz9LKGd1$I9#Cg>p3GcGzs)NpCO%1VMF|SeE zBPn?rie|s|3l%_7%!b(nq`_XJMUDMhsJY(%@Wg~h2NBLPyjnaGW3xifWI1nCPcj+e z4^8h_&AErhMn{eQrE`1=Yg9Sj@$i_Gmy*lV5{q^-#mF`* zjV2?BGz7e^Q2<$-t~HSXO1QMEt1I_FZn2G;%Rg*A-YV7L;9z>K#;B5P&j^>3dGv5m z%R*-`1tPDNfigMFo_}gj&A!b#dF@=(Mm0JyZCT~k&0NX^7lO?_6C(^TU+?GF|EWpy z;uy>NMOWF(9zMrM6)Lz$rC}JRvtD-4bZ*AJYva=(Z@DO!21uszG068^@7kpGZsEL7+Q}6C#fGa7x=>b5_*wuZv zz;T_j!dEsDBk++{lA}e%Ex+QI7PI`=ySCHryMHfoC|T8pHBbj+0*~#@&8cqd9-*-U z&tW7#LYNJDp~PbezbT1t3ugR{I2o^@AI&!z1ui2h5oGuhs4$gvV)$433XIEXAL(QP zWVY2C?0r2<1u!yhK*XrkfVXyQ8Lz~Cc2jL>?Ft3*LoI}BN6c@-@cd@*J;u4dKbb_W z0~39I$d0YK_mOf6zpj_5&AIkM(8R~?Pz z)18bFC9TkIiB~CCy;^mem};`q`(zN5vZ+D|lyYF>@Y-(UXWLa`nRPE2aODyv5ur|* zKwcGiEEe~9IJCAv0rt#NufZzEFCRq z7+o`?g6P9$m$z*-nEj&1`|}8a%s^&X*f&CuDrtziFjSCzQcnE zwTmpBv~g#3Ojd=EXJ{`V&$k@~XfgG7*6M*C>8fjV%BO_y+1A55O6J`;P{>7nmKtaY z$149X259|U9hKx<13%LpUT&sisXbY4>r%G1wqs&4Dszzt+93MFjO~1r>#n@vr&(7 zFe<^kLtY*qH*ik_4T7%J5I?)H^YsqsSzqtHXl$X;r{3cgMOKRQrG-jE`T55OyV~aJyOKs6cL?300~A0ShuATpAB2`w9 z1Xc{IJ#vPJ>uQ(JHS`5D0D*G%v+_*vKM<(t`M6Y|NDRe%8--3&8=_TYSy5KWDOWGw z6&Z^Bh)KlIS@>j{fR1X?^BekeU*+fLFSc->slkc~z3d~rwf@z1X&Lml#h1eeZogM3 zjcRG=&&lI0)UlK~8ASNGp3@Wip(t(f_g?FyEk>R1LpUtd?rw+`ROBk;xx@k0$LtVR zvb3t=xfKtJ5_iz3Ip*0E3vXok=8n4PZw2%Lfr$KsnnZg1-bfl>eSqRnDGDfNQoGNt;egKzh%;ZP-HQc4=s?xbl(x-B28Q8+HZEQS#OTc z)cHsX1g+@r-@{Dht}lvw+b@N7RBazst*bxk#9i}#N!?yd|1;c+SKl6rvF%L-$4>}( ziER1)e_j9&cdycHf1|!kCg(xqYkLnWDnU7X=t3>`i=0!X&Q+7t;38_Nu?Xl%lof<) z{_&jD>h*0};-he=b8wir{^r=fLbhu@l}wA&GQ$j3>~g9G@DexlrVMkK`QFqBQAZ#a zk5o=o@UPl=0~9QaBx-v(6f`E*6zoV+z%$***ftt;Cz9bjrdKbobLkqss>2{l$7$r5 z|07A>3uv`ZCwd{o$CO$Q)O|o6BaozUSml)uJIzQBhgB9}wkJxt%CK)d`>n zSkpxpAu^H8pT=&1;kN1ko5kxkc=3?4!-#DsOhZFs0Q4n38+M%Q?tvUu^NDvd9BUPs zz6g)GDn`L1{K{2dk4=QsuwzXZlqco9RtG6H+)i6(!LO>+iwsg()`yCHOe-Tdq~XmF zC_XgN_Lqo^i7Rj6CDpLvFqTRR(pgM`4ohC)2(|-S1yybz862wh@LP%GaVioF4Xn9jN3od76R*#!jZ$piD1TAyd_qT_+^Vcm-fRq)lmrR)HuL_W(9 zpv-`D96DF7=Cs)j?%eSz@8GglfzOGBbXx2lJTzpZVGl*VyCkv-bNq@W zgUiM8JoU!B$bqA%HcIyvlf;E8$W2YbvS?x-x;&~tr#k5+L7NRb;T;$R$Tmx$89j8V zi=S@!62UvsL0WboqmK(iC7-De$ouU;vurGb6O{xCXzKT#+>r(mV}vu?EVG+VWXmz* zw&yy=<>X9E7s+sYT$2OkEJ9~A9FxlZe#y+^vIo}VZcgp#xE%D~=x85%`IiqoKe>NS zP#c}&LmwS%-Az^ZQw3Slrb3A?Q9Dd_u*nNH!0q+o(oGniw7;rQkSE&$NA7=6!p1BJ zU>4YRAD_W2=xtHVsI^5or661#5MILTwG~@V4Ouz=i?4}(Xzk>ZK(~O&1XBeh2Aa@v z|H3b{%y{l-mx?&fDhng9gvd7%oKG@Urv)4{1-#T#-8YF@J=?)~?ILN_1gC(eT*l{X z2gWh(N0vnOVhn7<@E-I`I$AQ3MGI}DneluV7eQ3c*xTu`&zU^!4@S zwvu(ZG@ooN?Zx(C@8ld9B5QhSDFcaz=;iX3I*C2W{jT-nusn|MR}oSSRsTkCYUU`U zmPDaG8c^eyuiFj%{nrZ;W=$Yxa7$bt5%eurv4@>NV5p zb`Yb2_LquV(ywg@W{~mP&edkTMaCo8>q6AOmE)Hk*U;$vapbaC0Ot$81g6qWfdyGl zAm`Ji*J_0tV+ss*x%bLfxJDt;qO%xwoBEU!33o2X5yJt~gkUQ&YkvI!diR4FqHQ*v zZ+z}?W;s5|DY~BFy}iATes2Gb`vZ9GH~R1(Kjj~3=YM9|9x!4G)HF1uu0kH|kj)#2 zfo&@Ydz0Dt|D2!&{t+e^taVayGLG&k_Bj-=Gnl89GaLPmHCsnPpSSvwLS1bYD2scV zr)S0?M_Oz{7Lfhj_qrF&)Vp;4tgcd4fAd zueKk^`SK&0)xvZnl}fM$%0%^5KDek5$zl3bGGeEM0oveDI_^S(ZR#C z2KtdsbV-0u@;qbLWbS*QA5%oNXPb^ze|=fXIq;mXZ*C?k@gQ!`|6ZnqvI3m|wC=Jq z7(ow`|E}7vbC6*I?}2x-*-RwfN2KILT zTG55|-+eFptj0u|5P}2WA1MC8kWkF;qA!=yd0KH7?^P@v)j1-9`{jJyzZ_oH5+t9b z!RJ#KaBr9ob#*9Z+g4iRnU|B$Ct8;=(&vl@%)>Z-MRfpj%_gHXD_5YdWZf$;NZuT3 zdbXICM2p}Oo7(M^`GRaX^k$$|)+z;uLXZyB z4b=<;-=j9XN5iUK3P!RWySve!@qcPdRmG)M0bJAwhdjqwJ3icq3wTd@XWzg6$)uAB zTrUT-8FC+7)OwQec~pN{!Mq$_I<#tXfs!&uo{9~{<$wdgX$WY1XE&9+tDH+RE2h#S zw13;0$uUVpD;mSt2D5O(87r}Qnyy)VqEb2}7;r!f8qMRIzmy$7s>_xJu>Nl5d1zBM z0m5)?(SUXBvEvs$k6(1WqgD*U?Qt%%tAFU!8-KlJ1={7(LEhJ^fL)Uf`Oub8ins8e z6gHa76)A(rYMve*zJ>EuN+HlcyS{B7zvH)PkTPi3SjQr@4e=r1J;+@{``sQ)SKDs( zsi1YTe6C0xHVFLZs+WsEwY13NepN)~^SDdrX?6B$b3$uB&FXwz$B4-{<<8YC+~}>f zJ)Rv{k4ukL?g@%J;3{orOH8g2v2H3r&@lmwv!7aVt+3fVYnD!^TtuKNvw0FkbbWcF zgtH-=8v7s9)3z@>oN|HUX}{lfRBSs&MuDTHf%gj|ikGk|GD*e~6EsGL@Y#T#VY&;V zMvU;6>SM<@i@c$IDGkm_R0AvfeRq@+QuXz*>!_~m0-yuW)!2`8mj%ra$E)tNLT@u| zTl+v^GxMrfaXMo;N4lHc(73d`oUHUEe0HMo2(F#Se0^S{ykLyAU*T|7IdGr> zo?5Ztj*JTN*<}uQO3TQdDH??VOL<`Z8zcPSiELF;AH_HOcpjntIH0>4_k+p`!~nNh z8$&DDIj6_C=Ulc!ZJi#`U|;Eb+?VucaM+SZ>a38w3L;*Y4^kUiTRuL>4<4%T@q?L{ z;CTlX(m)Q|cO{31pFjc`lkuXE)u4LtYotq1#afi1)Z+tb)>a39yKQF`8;38w%gcN<3>#y+qP}nY-~44W81dw=o>Y* zZ9i9k&*%Rt?{e?%wL5d>%$XUg%c_}-ThWjmgJ)wAq<;x%?{3ZvmSt%gvWzD7{xE*C zqH*yCu^`@I&oArKKeNo-@_*20woR02V=(_H3TD~g*#WYsZ}h>Ur!gmOJh`yoCNNta zOWtEw^y$SiN!MgW^IRjhCbRY*gyZa!PPt@~JdqSFX&9{-3SN!`9`L+NE|otFzJ1ke znHbe*T4zu^KN(+O2DK7 zIe#2idZB|*0pE_O{DwkTIk2V*gDRjt?%#uFaxTY)W39AeP98>hnQuT(oT5rBb#D~N z#Dr4UBrL3vHmQS`-x%iVNypFR)*nvF&w)hln~X|(9wSK0s;7;|8Fx5_l!!@x+Gq$~ z5-S6k~-e&&?*H*MGOkB6lc$a+2)rNVq^g?Lsi~~JQ0-&Bvw-?myPqK$u zahq9GQE~h*aK%ki5rc?AVD`f^e79pGrME3cC2HLe50f9P?=Om;tEK}~trbtfDPFzx z3KF^AVc52(w!cXvZHtlqEmL9(>I!exXwUI-iNk2guwvVo8Ft!>U3)&Q{_InQ!taJd zCY`l!B0W$`*e#3<=FLwneSo_1o3iSOTS_$IH_+X&$$)h{JfPreyUf7wdm2$XsNtkx zDC=XbSYRR$B=>Z#19kP#Z_oO}@T5|Y-K4$i76)rC7H#bE4P-)8w0r^RFm6Nov-hP} zyct#5ZR`#{P<&c|Ja*q^r`}fqWtw-#v^1pC@SyXA8|vOEUrlhp9SBm?;yv;16F;?Q zsu@MaLS1hhdYxit{Sp>M%WI%AEot;nuZ%!>lz*7zqh<}P1R#116OuSI#VfzMgp(vC zL7(1uJrr`3QAgN6AQ>!}>h#G*S-EOifWOcpMblrcQeCzXy&Au4TuK3T>09i4YCOdE zAQeFvK2AW(;yY&0MJI$G@nEpXhBE1i8rK+gu!+}PF4Xa@IpE6-C>a3M6N0ezV!aVBqmh_12 z;MUFfov#_Xgzqjwn%MVN$>4Rm(ojez)lTnl0EN$R;FI5QIvR=?I86L$ldyL$ik@ow zt+hUGe5$b1#oqdr_j?@;=((i%_r6kIJcf_n(@``W{^Nq*PhGgtt3KN$k83ZHzZ!xB z42VF%gp~dVcQzvw+1L_wAZ0JTg0&+lqa)+LFpv|{e(*gvJB-q&du39izHju_D}r)g z)>MSOToo>`9L`MUD&bgOrsM!u`eSpVD1^*3cy>L6Yrⅆ&E5~8=EG>xk3fAllbM22Aer#l3)^ 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%0DSx1kTC0 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 P0A4Bz>hkrn=HdSXCvfMD literal 0 HcmV?d00001 diff --git a/imaalum-json-script.js b/imaalum-json-script.js new file mode 100644 index 0000000..221ce08 --- /dev/null +++ b/imaalum-json-script.js @@ -0,0 +1,26 @@ +var table = document.getElementsByClassName("table table-hover")[0]; +var data = table.getElementsByTagName("tr"); + +var nullIndex = new Array(); +var courseCodes = new Array(); +var sections = new Array(); +var combinedSubjectDatas = new Array(); + +// section +for (let i = 1; i < data.length; i++) { + if (data[i].cells[2].firstChild === null) nullIndex.push(i); + else sections.push(parseInt(data[i].cells[2].innerText)); +} + +// course code +for (let i = 1; i < data.length; i++) { + if (!nullIndex.includes(i)) courseCodes.push(data[i].cells[0].innerText); +} + +// combine code & section +for (i = 0; i < sections.length; i++) { + combinedSubjectDatas.push({ courseCode: courseCodes[i], section: sections[i] }); +} + +var json = JSON.stringify(combinedSubjectDatas); +alert("Copy -----> " + json); diff --git a/lib/body.dart b/lib/body.dart new file mode 100644 index 0000000..5b73968 --- /dev/null +++ b/lib/body.dart @@ -0,0 +1,88 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_iium_schedule/util/launcher_url.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:url_launcher/link.dart'; + +import 'views/course browser/browser.dart'; +import 'views/scheduler/input_course.dart'; + +class MyBody extends StatelessWidget { + const MyBody({ + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + extendBodyBehindAppBar: true, + appBar: AppBar( + shadowColor: Colors.transparent, + backgroundColor: Colors.transparent, + foregroundColor: Colors.transparent, + actions: [ + PopupMenuButton( + tooltip: "Menu", + onSelected: (value) async { + switch (value) { + case "about": + PackageInfo packageInfo = await PackageInfo.fromPlatform(); + + showAboutDialog( + context: context, + applicationVersion: packageInfo.version, + ); + break; + case "github": + LauncherUrl.open("https://github.com/iqfareez/iium_schedule"); + break; + default: + } + }, + icon: const Icon( + Icons.more_vert_outlined, + color: Colors.black87, + ), + itemBuilder: (context) => const [ + PopupMenuItem( + child: Text("GitHub"), + value: "github", + ), + PopupMenuItem( + child: Text("About"), + value: "about", + ), + ], + ), + ], + ), + body: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + MouseRegion( + cursor: SystemMouseCursors.click, + child: CupertinoButton( + child: const Text('Schedule Maker'), + onPressed: () { + Navigator.of(context).push( + CupertinoPageRoute(builder: (_) => const InputCourse())); + }, + ), + ), + const SizedBox(height: 5), + MouseRegion( + cursor: SystemMouseCursors.click, + child: CupertinoButton( + child: const Text('Browser'), + onPressed: () { + Navigator.of(context) + .push(CupertinoPageRoute(builder: (_) => const Browser())); + }, + ), + ), + ], + ), + ); + } +} diff --git a/lib/browser.dart b/lib/browser.dart deleted file mode 100644 index 6759e0c..0000000 --- a/lib/browser.dart +++ /dev/null @@ -1,115 +0,0 @@ -// 🐦 Flutter imports: -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -// 📦 Package imports: -import 'package:albiruni/albiruni.dart'; - -// 🌎 Project imports: -import 'package:flutter_iium_schedule/browser_view.dart'; - -class Browser extends StatefulWidget { - const Browser({Key? key}) : super(key: key); - - @override - _BrowserState createState() => _BrowserState(); -} - -class _BrowserState extends State { - String session = "2020/2021"; - int semester = 1; - String? selectedKulliyah; - List kulliyahs = [ - "AED", - "BRIDG", - "CFL", - "CCAC", - "EDUC", - "ENGIN", - "ECONS", - "KICT", - "IRKHS", - "KLM", - "LAWS" - ]; - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('Course Browser'), - ), - body: Padding( - padding: const EdgeInsets.all(18), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16.0), - child: DropdownButtonFormField( - decoration: const InputDecoration(border: OutlineInputBorder()), - value: selectedKulliyah, - hint: const Text('Select kulliyyah'), - items: kulliyahs - .map((e) => DropdownMenuItem( - child: Text(e), - value: e, - )) - .toList(), - onChanged: (String? value) { - setState(() { - selectedKulliyah = value; - }); - }, - ), - ), - const SizedBox(height: 10), - CupertinoSegmentedControl( - groupValue: session, - children: const { - "2020/2021": Text("2020/2021"), - "2021/2022": Text("2021/2022") - }, - onValueChanged: (String value) { - setState(() { - session = value; - }); - }), - const SizedBox(height: 10), - CupertinoSegmentedControl( - groupValue: semester - 1, - children: List.generate( - 3, - (index) => Text("Sem ${index + 1}"), - ).asMap(), - onValueChanged: (int value) { - setState(() { - semester = value + 1; - }); - print(semester); - }), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 10), - child: CupertinoButton.filled( - child: const Text('Get'), - onPressed: selectedKulliyah == null - ? null - : () { - Albiruni albiruni = Albiruni( - kulliyah: selectedKulliyah!, - semester: semester, - session: session); - Navigator.push( - context, - MaterialPageRoute( - builder: (_) => BrowserView(albiruni: albiruni), - ), - ); - }, - ), - ) - ], - ), - ), - ); - } -} diff --git a/lib/main.dart b/lib/main.dart index e6fd0af..138ec71 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,8 +1,7 @@ -// 🐦 Flutter imports: +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -// 🌎 Project imports: -import 'package:flutter_iium_schedule/browser.dart'; +import 'body.dart'; void main() { runApp(const MyApp()); @@ -15,12 +14,11 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( title: 'IIUM Schedule (Preview)', + debugShowCheckedModeBanner: false, theme: ThemeData( primarySwatch: Colors.purple, ), - home: const Scaffold( - body: Browser(), - ), + home: const MyBody(), ); } } diff --git a/lib/model/basic_subject_model.dart b/lib/model/basic_subject_model.dart new file mode 100644 index 0000000..b45b1e4 --- /dev/null +++ b/lib/model/basic_subject_model.dart @@ -0,0 +1,18 @@ +class BasicSubjectModel { + String? courseCode; + int? section; + + BasicSubjectModel({this.courseCode, this.section}); + + BasicSubjectModel.fromJson(Map json) { + courseCode = json["courseCode"]; + section = json["section"]; + } + + Map toJson() { + final Map data = {}; + data["courseCode"] = courseCode; + data["section"] = section; + return data; + } +} diff --git a/lib/util/course_validator_pass.dart b/lib/util/course_validator_pass.dart new file mode 100644 index 0000000..5da485f --- /dev/null +++ b/lib/util/course_validator_pass.dart @@ -0,0 +1,30 @@ +import 'package:albiruni/albiruni.dart'; + +class CourseValidatorPass { + final int _length; + late List _status; + late List _subjects; + CourseValidatorPass(this._length) : super() { + _status = List.filled(_length, false); + _subjects = List.filled(_length, null); + } + + // set which index is failed + void subjectSuccess(int index, Subject subject) { + _status[index] = true; + _subjects[index] = subject; + } + +// Will return true if everything's fine + bool clearToProceed() { + print(_status); + return !_status.contains(false); + } + +// How many item is failed to obtain data + int countFailedToFetch() { + return _status.where((element) => !element).length; + } + + List fetchedSubjects() => _subjects.map((e) => e!).toList(); +} diff --git a/lib/util/extensions.dart b/lib/util/extensions.dart new file mode 100644 index 0000000..53f7b9e --- /dev/null +++ b/lib/util/extensions.dart @@ -0,0 +1,29 @@ +import 'package:albiruni/albiruni.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'enums.dart'; + +extension TextBeautify on String { + /// Remove dot zero. Ezample: `3.0` become `3` + String removeTrailingDotZero() => replaceAll(RegExp(r"([.]*0)(?!.*\d)"), ""); +} + +extension AlbiruniDayTime on DayTime { + /// Convert int to human readable day name + String englishDay() => describeEnum(Day.values[day - 1]); +} + +extension DayName on int { + /// Convert int to human readable day name + String englishDay() => describeEnum(Day.values[this - 1]); +} + +extension Utility on BuildContext { + void nextInputFocus() { + do { + FocusScope.of(this).nextFocus(); + } while ( + FocusScope.of(this).focusedChild?.context?.widget is! EditableText); + } +} diff --git a/lib/util/launcher_url.dart b/lib/util/launcher_url.dart new file mode 100644 index 0000000..15582ee --- /dev/null +++ b/lib/util/launcher_url.dart @@ -0,0 +1,8 @@ +import 'package:url_launcher/url_launcher.dart'; + +class LauncherUrl { + LauncherUrl._(); + static void open(String url) async { + if (!await launch(url)) throw 'Could not launch $url'; + } +} diff --git a/lib/views/course browser/browser.dart b/lib/views/course browser/browser.dart new file mode 100644 index 0000000..57a9ee2 --- /dev/null +++ b/lib/views/course browser/browser.dart @@ -0,0 +1,188 @@ +// 🐦 Flutter imports: +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +// 📦 Package imports: +import 'package:albiruni/albiruni.dart'; + +// 🌎 Project imports: + +import 'browser_view.dart'; + +class Browser extends StatefulWidget { + const Browser({Key? key}) : super(key: key); + + @override + _BrowserState createState() => _BrowserState(); +} + +class _BrowserState extends State { + final GlobalKey dropdownKey = GlobalKey(); + final TextEditingController _searchController = TextEditingController(); + String _session = "2020/2021"; + int _semester = 1; + String? _selectedKulliyah; + final List _kulliyahs = [ + "AED", + "BRIDG", + "CFL", + "CCAC", + "EDUC", + "ENGIN", + "ECONS", + "KICT", + "IRKHS", + "KLM", + "LAWS" + ]; + + void openItemsList() { + GestureDetector? detector; + void search(BuildContext context) { + context.visitChildElements((element) { + if (detector != null) return; + if (element.widget is GestureDetector) { + detector = element.widget as GestureDetector; + } else { + search(element); + } + }); + } + + search(dropdownKey.currentContext!); + if (detector != null) detector?.onTap!(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => FocusScope.of(context).unfocus(), + child: Scaffold( + appBar: AppBar( + title: const Text('Course Browser'), + ), + body: Center( + child: Container( + constraints: const BoxConstraints(maxWidth: 500), + child: Padding( + padding: const EdgeInsets.all(18), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + // https://github.com/flutter/flutter/issues/53634#issuecomment-889227826 + // After this issue is solved, we can refactor this code + child: MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: openItemsList, + child: DropdownButtonFormField( + key: dropdownKey, + decoration: const InputDecoration( + border: OutlineInputBorder()), + value: _selectedKulliyah, + hint: const Text('Select kulliyyah'), + items: _kulliyahs + .map( + (e) => + DropdownMenuItem(child: Text(e), value: e), + ) + .toList(), + onChanged: (String? value) { + setState(() => _selectedKulliyah = value); + }, + ), + ), + ), + ), + const SizedBox(height: 10), + MouseRegion( + cursor: SystemMouseCursors.click, + child: CupertinoSegmentedControl( + groupValue: _session, + children: const { + "2020/2021": Text("2020/2021"), + "2021/2022": Text("2021/2022") + }, + onValueChanged: (String value) { + setState(() => _session = value); + }), + ), + const SizedBox(height: 10), + MouseRegion( + cursor: SystemMouseCursors.click, + child: CupertinoSegmentedControl( + groupValue: _semester - 1, + children: List.generate( + 3, + (index) => Text("Sem ${index + 1}"), + ).asMap(), + onValueChanged: (int value) { + setState(() => _semester = value + 1); + }), + ), + const SizedBox(height: 10), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 14), + child: CupertinoTextField( + maxLength: 9, + controller: _searchController, + placeholder: "Search subject", + clearButtonMode: OverlayVisibilityMode.editing, + selectionControls: MaterialTextSelectionControls(), + onEditingComplete: () { + FocusScope.of(context).unfocus(); + _searchController.text = + _searchController.text.toAlbiruniFormat(); + }, + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 14, vertical: 10), + child: MouseRegion( + cursor: _selectedKulliyah == null + ? SystemMouseCursors.forbidden + : SystemMouseCursors.click, + child: CupertinoButton.filled( + child: const Text('Get'), + onPressed: _selectedKulliyah == null + ? null + : () { + // Redo the same thing as in onEditingComplete above. Just in case. + FocusScope.of(context).unfocus(); + String? courseCode; + if (_searchController.text.isNotEmpty) { + _searchController.text = courseCode = + _searchController.text.toAlbiruniFormat(); + } else { + courseCode = null; + } + + Albiruni albiruni = Albiruni( + kulliyah: _selectedKulliyah!, + semester: _semester, + session: _session); + Navigator.push( + context, + CupertinoPageRoute( + builder: (_) => BrowserView( + albiruni: albiruni, + courseCode: courseCode), + ), + ); + }, + ), + ), + ) + ], + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/browser_view.dart b/lib/views/course browser/browser_view.dart similarity index 63% rename from lib/browser_view.dart rename to lib/views/course browser/browser_view.dart index 30719b9..4620e51 100644 --- a/lib/browser_view.dart +++ b/lib/views/course browser/browser_view.dart @@ -1,19 +1,21 @@ -// 🐦 Flutter imports: -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; +import 'dart:io'; -// 📦 Package imports: import 'package:albiruni/albiruni.dart'; import 'package:and/and.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; import 'package:recase/recase.dart'; -// 🌎 Project imports: -import 'util/enums.dart'; +import '../../util/extensions.dart'; +import 'subject_screen.dart'; class BrowserView extends StatefulWidget { - const BrowserView({Key? key, required this.albiruni}) : super(key: key); + const BrowserView({Key? key, required this.albiruni, this.courseCode}) + : super(key: key); final Albiruni albiruni; + final String? courseCode; @override _BrowserViewState createState() => _BrowserViewState(); @@ -33,25 +35,22 @@ class _BrowserViewState extends State { onPressed: _page <= 1 ? null : () { - setState(() { - _page--; - }); + setState(() => _page--); }, icon: const Icon(Icons.navigate_before_outlined)), Center(child: Text(_page.toString())), IconButton( onPressed: () { setState(() { - setState(() { - _page++; - }); + setState(() => _page++); }); }, icon: const Icon(Icons.navigate_next_outlined)) ], ), body: FutureBuilder( - future: widget.albiruni.fetch(page: _page, useProxy: kIsWeb), + future: widget.albiruni + .fetch(course: widget.courseCode, page: _page, useProxy: kIsWeb), builder: (BuildContext context, AsyncSnapshot> snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { { @@ -70,20 +69,46 @@ class _BrowserViewState extends State { } if (snapshot.hasError) { - if (snapshot.error is NoSubjectsException) { - return Center( - child: Column(mainAxisSize: MainAxisSize.min, children: [ - Image.asset( - 'assets/icons/explorer-dynamic-colorx.png', - ), - const Text("Oops, you may want to go back.") - ]), - ); - } else { - return Center( - child: Text(snapshot.error.toString()), - ); - } + return Center( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Builder(builder: (_) { + if (snapshot.error is NoSubjectsException) { + return Column(mainAxisSize: MainAxisSize.min, children: [ + Image.asset( + 'assets/icons/explorer-dynamic-colorx.png', + ), + const Text( + "Oops, you may want to go back.", + textAlign: TextAlign.center, + ) + ]); + } else if (snapshot.error is EmptyBodyException) { + return Column(mainAxisSize: MainAxisSize.min, children: [ + Image.asset( + 'assets/icons/file-dynamic-clay.png', + ), + const Text( + "Oops. Subject you're looking for is nowhere to be found. Maybe the course is not offered. Please check for typo just in case.", + textAlign: TextAlign.center, + ) + ]); + } else if (snapshot.error is SocketException) { + return Column(mainAxisSize: MainAxisSize.min, children: [ + Image.asset( + 'assets/icons/wifi-dynamic-color.png', + ), + const Text( + '* Insert apes meme * "Where Internet"', + textAlign: TextAlign.center, + ) + ]); + } else { + return Text(snapshot.error.toString()); + } + }), + ), + ); } return ListView.builder( @@ -110,10 +135,13 @@ class _BrowserViewState extends State { InkWell( splashColor: Colors.purple.shade100, onTap: () { - // TODO: Make another screen for details - ScaffoldMessenger.of(context).removeCurrentSnackBar(); - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Not implemented'))); + Navigator.of(context).push( + CupertinoPageRoute( + builder: (_) => SubjectScreen( + snapshot.data![index], + ), + ), + ); }, child: Column( children: [ @@ -144,10 +172,9 @@ class _BrowserViewState extends State { and( snapshot.data![index].dayTime .map((e) => ReCase( - describeEnum( - (Day.values[e!.day - 1]), - ), + e!.englishDay(), ).titleCase) + .toSet() .toList(), ), ); @@ -161,19 +188,26 @@ class _BrowserViewState extends State { Icons.person_outline_outlined, ), const SizedBox(width: 5), - Builder(builder: (_) { - if (snapshot.data![index].lect.length > 1) { - return Text( - 'Multiple lecturers (${snapshot.data![index].lect.length})', - style: const TextStyle( - fontStyle: FontStyle.italic), - ); - } else { - return Text( + Flexible( + child: Builder(builder: (_) { + if (snapshot.data![index].lect.length > 1) { + return Text( + 'Multiple lecturers (${snapshot.data![index].lect.length})', + style: const TextStyle( + fontStyle: FontStyle.italic, + ), + ); + } else { + return Text( ReCase(snapshot.data![index].lect.first) - .titleCase); - } - }) + .titleCase, + style: const TextStyle( + overflow: TextOverflow.ellipsis, + ), + ); + } + }), + ) ], ), Row( @@ -204,9 +238,11 @@ class _BrowserViewState extends State { ), const SizedBox(width: 5), // https://stackoverflow.com/a/55173692 - Text(snapshot.data![index].chr - .toString() - .replaceAll(RegExp(r"([.]*0)(?!.*\d)"), "")), + Text( + snapshot.data![index].chr + .toString() + .removeTrailingDotZero(), + ), ], ), ], diff --git a/lib/views/course browser/subject_screen.dart b/lib/views/course browser/subject_screen.dart new file mode 100644 index 0000000..eca240d --- /dev/null +++ b/lib/views/course browser/subject_screen.dart @@ -0,0 +1,165 @@ +import 'package:albiruni/albiruni.dart'; +import 'package:flutter/material.dart'; +import 'package:recase/recase.dart'; + +import '../../util/extensions.dart'; + +class SubjectScreen extends StatelessWidget { + const SubjectScreen(this.subject, {Key? key}) : super(key: key); + + final Subject subject; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Subject details'), + // backgroundColor: Colors.transparent, + // foregroundColor: Colors.transparent, + shadowColor: Colors.transparent, + actions: [ + IconButton( + onPressed: () {}, + icon: const Icon(Icons.favorite_outline), + tooltip: "Add this subject to favourite", + ), + IconButton( + onPressed: () {}, + icon: const Icon(Icons.share_outlined), + tooltip: "Share this subject", + ) + ], + ), + body: Center( + child: Container( + constraints: const BoxConstraints(maxWidth: 500), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: SelectableText( + subject.title, + style: const TextStyle( + fontSize: 24, fontWeight: FontWeight.w600), + textAlign: TextAlign.center, + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + TextBubble( + text: subject.code, + icon: Icons.label_outline, + backgroundColor: Theme.of(context).primaryColor, + ), + TextBubble( + text: + 'Chr ${subject.chr.toString().removeTrailingDotZero()}', + icon: Icons.class__outlined, + backgroundColor: Colors.deepPurple, + ), + TextBubble( + text: 'Section ${subject.sect}', + icon: Icons.group_outlined, + backgroundColor: Colors.deepOrange, + ), + ], + ), + const Text( + '\nSession(s)', + style: TextStyle(fontWeight: FontWeight.w600), + ), + DayTimeTable(subject.dayTime), + const Text( + '\nLecturer(s)', + style: TextStyle(fontWeight: FontWeight.w600), + ), + ...List.generate( + subject.lect.length, + (index) => Text( + '${index + 1}. ' + ReCase(subject.lect[index]).titleCase), + ), + const Text( + '\nVenue', + style: TextStyle(fontWeight: FontWeight.w600), + ), + Text(subject.venue ?? '-') + ], + ), + ), + ), + ); + } +} + +class DayTimeTable extends StatelessWidget { + const DayTimeTable( + this.dayTimes, { + Key? key, + }) : super(key: key); + + final List dayTimes; + + @override + Widget build(BuildContext context) { + return DataTable( + dataRowHeight: 32, + showBottomBorder: true, + columns: const ["Day", "Time"] + .map( + (e) => DataColumn( + label: Expanded( + child: Text( + e, + style: const TextStyle(fontWeight: FontWeight.w600), + textAlign: TextAlign.center, + ))), + ) + .toList(), + headingRowHeight: 32, + rows: dayTimes + .map( + (e) => DataRow( + cells: [ + DataCell( + Text(ReCase(e!.englishDay()).titleCase), + ), + DataCell( + Text('${e.startTime} - ${e.endTime}'), + ) + ], + ), + ) + .toList(), + ); + } +} + +class TextBubble extends StatelessWidget { + const TextBubble({ + Key? key, + required this.text, + required this.icon, + required this.backgroundColor, + }) : super(key: key); + + final String text; + final Color backgroundColor; + final IconData icon; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(4.0), + child: Chip( + avatar: Icon(icon, size: 18), + labelStyle: const TextStyle(fontSize: 12, fontWeight: FontWeight.bold), + backgroundColor: backgroundColor.withAlpha(40), + label: Text( + text, + ), + ), + ); + } +} diff --git a/lib/views/scheduler/course_validator.dart b/lib/views/scheduler/course_validator.dart new file mode 100644 index 0000000..a505e54 --- /dev/null +++ b/lib/views/scheduler/course_validator.dart @@ -0,0 +1,195 @@ +import 'package:albiruni/albiruni.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import '../../util/course_validator_pass.dart'; +import '../course%20browser/subject_screen.dart'; +import 'schedule_layout.dart'; +import 'package:recase/recase.dart'; +import '../../model/basic_subject_model.dart'; + +late CourseValidatorPass _validatorPass; + +class CourseValidator extends StatefulWidget { + const CourseValidator({Key? key, required this.subjects}) : super(key: key); + + final List subjects; + + @override + _CourseValidatorState createState() => _CourseValidatorState(); +} + +class _CourseValidatorState extends State { + @override + void initState() { + super.initState(); + _validatorPass = CourseValidatorPass(widget.subjects.length); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Course Validator'), + actions: [ + TextButton( + style: TextButton.styleFrom( + primary: Colors.white, + ), + onPressed: () { + if (!_validatorPass.clearToProceed()) { + showDialog( + context: context, + builder: (_) => AlertDialog( + content: Text( + "${_validatorPass.countFailedToFetch()} subject failed to fetch. Please solve the error first"), + ), + ); + return; + } + + Navigator.of(context).push(CupertinoPageRoute( + builder: (_) => + ScheduleLayout(_validatorPass.fetchedSubjects()))); + }, + child: const Icon(Icons.send_outlined)) + ], + ), + body: Center( + child: Container( + constraints: const BoxConstraints(maxWidth: 500), + child: ListView.builder( + itemCount: widget.subjects.length, + itemBuilder: (_, index) { + return SubjectCard(widget.subjects[index], index); + }), + ), + ), + ); + } +} + +class SubjectCard extends StatefulWidget { + const SubjectCard(this.subject, this.index, {Key? key}) : super(key: key); + + final BasicSubjectModel subject; + final int index; + + @override + _SubjectCardState createState() => _SubjectCardState(); +} + +class _SubjectCardState extends State { + final Albiruni albirui = + Albiruni(kulliyah: 'ENGIN', semester: 1, session: "2021/2022"); + + Future fetchSubjectData(String courseCode, int? section) async { + var fetchedSubjects = + await albirui.fetch(course: courseCode, useProxy: kIsWeb); + return fetchedSubjects.firstWhere((element) => element.sect == section); + } + + @override + Widget build(BuildContext context) { + return Card( + child: FutureBuilder( + future: + fetchSubjectData(widget.subject.courseCode!, widget.subject.section), + builder: (context, AsyncSnapshot snapshot) { + if (snapshot.hasError) { + return ListTile( + leading: MiniSubjectInfo(widget.subject), + title: const Text( + 'Can\'t get subject info', + ), + subtitle: Text(snapshot.error.toString()), + trailing: Icon( + Icons.error_outline, + color: Colors.yellow.shade700, + )); + } + if (snapshot.connectionState == ConnectionState.waiting) { + return ListTile( + leading: MiniSubjectInfo(widget.subject), + title: const Text( + 'Waiting...', + style: TextStyle(fontStyle: FontStyle.italic), + ), + trailing: const SizedBox( + width: 25, + height: 25, + child: CircularProgressIndicator(), + ), + ); + } + + // Check if every subjects is exist of the server + _validatorPass.subjectSuccess(widget.index, snapshot.data!); + + return ListTile( + leading: MiniSubjectInfo(widget.subject), + title: Text(snapshot.data!.title, + style: const TextStyle( + fontWeight: FontWeight.w600, + )), + subtitle: Text( + ReCase(snapshot.data!.lect.join(', ')).titleCase, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + trailing: const Icon( + Icons.check, + color: Colors.green, + ), + onTap: () { + Navigator.push( + context, + CupertinoPageRoute(builder: (_) => SubjectScreen(snapshot.data!)), + ); + }, + ); + }, + )); + } +} + +class MiniSubjectInfo extends StatelessWidget { + const MiniSubjectInfo( + this.subject, { + Key? key, + }) : super(key: key); + + final BasicSubjectModel subject; + + final widgetTextStyle = const TextStyle(fontSize: 12); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(5), + decoration: BoxDecoration( + color: Colors.purple.withOpacity(.1), + borderRadius: BorderRadius.circular(12), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + subject.courseCode!, + style: widgetTextStyle, + ), + if (subject.section != null) + Text( + "Section ${subject.section}", + style: widgetTextStyle, + ) + else + Text( + "No section", + style: widgetTextStyle, + ) + ], + ), + ); + } +} diff --git a/lib/views/scheduler/input_course.dart b/lib/views/scheduler/input_course.dart new file mode 100644 index 0000000..3ce5ad2 --- /dev/null +++ b/lib/views/scheduler/input_course.dart @@ -0,0 +1,330 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:albiruni/albiruni.dart'; +import 'package:flutter_iium_schedule/util/launcher_url.dart'; +import 'package:url_launcher/link.dart'; +import '../../util/extensions.dart'; +import '../../model/basic_subject_model.dart'; +import 'course_validator.dart'; + +class InputCourse extends StatefulWidget { + const InputCourse({Key? key}) : super(key: key); + + @override + _InputCourseState createState() => _InputCourseState(); +} + +class _InputCourseState extends State { + final _courseCodeInputController = TextEditingController(); + final _jsonInputController = TextEditingController(); + final _sectionInputController = TextEditingController(); + + final List _inputCourses = []; + + int? _editingIndex; + int _inputIndex = 0; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Input Course'), + actions: [ + TextButton( + style: TextButton.styleFrom( + primary: Colors.white, + ), + onPressed: _inputCourses.isNotEmpty + ? () { + Navigator.of(context).push( + CupertinoPageRoute( + builder: (_) => + CourseValidator(subjects: _inputCourses), + ), + ); + } + : null, + child: const Icon(Icons.send_outlined)) + ], + ), + body: SizedBox( + width: double.infinity, + child: SingleChildScrollView( + child: Column( + children: [ + DataTable( + columnSpacing: + MediaQuery.of(context).size.width < 410 ? 23 : null, + showBottomBorder: true, + columns: ['No.', 'Course Code', 'Section', 'Action'] + .map((e) => DataColumn( + label: Expanded( + child: Text( + e, + textAlign: TextAlign.center, + ), + ))) + .toList(), + rows: List.generate( + _inputCourses.length, + (index) => DataRow( + cells: [ + DataCell( + Text('${index + 1}.'), + ), + DataCell(Text(_inputCourses[index].courseCode!)), + DataCell(Text( + _inputCourses[index].section != null + ? _inputCourses[index].section.toString() + : '-', + )), + DataCell( + Row( + children: [ + IconButton( + onPressed: () { + setState( + () { + _inputIndex = 0; // move to manual option + _editingIndex = index; + _courseCodeInputController.text = + _inputCourses[index].courseCode!; + _sectionInputController.text = + _inputCourses[index].section != null + ? _inputCourses[index] + .section + .toString() + : ''; + }, + ); + }, + icon: const Icon(Icons.edit_outlined)), + IconButton( + onPressed: () { + setState(() { + _inputCourses.removeAt(index); + }); + ScaffoldMessenger.of(context) + .removeCurrentSnackBar(); + ScaffoldMessenger.of(context) + .showSnackBar(const SnackBar( + content: Text('Deleted successfully'), + behavior: SnackBarBehavior.floating, + backgroundColor: Colors.purple, + )); + }, + icon: const Icon(Icons.delete_outline, + color: Colors.red), + ), + ], + ), + ) + ], + ), + ).toList(), + ), + Container( + constraints: const BoxConstraints(maxWidth: 500), + padding: const EdgeInsets.fromLTRB(24, 12, 12, 12), + child: IndexedStack(index: _inputIndex, children: [ + // Manual TextField + Row( + children: [ + Expanded( + flex: 2, + child: TextField( + controller: _courseCodeInputController, + decoration: InputDecoration( + labelText: 'Course Code', + filled: true, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide.none, + ), + ), + onEditingComplete: () { + context.nextInputFocus(); // focus the json input + context.nextInputFocus(); // focus ke section input + if (_courseCodeInputController.text.isEmpty) return; + _courseCodeInputController.text = + _courseCodeInputController.text + .toAlbiruniFormat(); + }, + textInputAction: TextInputAction.next, + ), + ), + const SizedBox(width: 15), + Expanded( + child: TextField( + controller: _sectionInputController, + decoration: InputDecoration( + labelText: 'Section', + filled: true, + counterText: "", + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide.none, + ), + ), + textInputAction: TextInputAction.done, + keyboardType: TextInputType.number, + // https://stackoverflow.com/a/54343828 + maxLength: 3, + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp(r'[0-9]')), + ], + ), + ), + TextButton( + onPressed: () { + FocusScope.of(context).unfocus(); + var _courseCode = _courseCodeInputController.text; + var _section = + int.tryParse(_sectionInputController.text); + + if (_courseCode.isEmpty) { + ScaffoldMessenger.of(context) + .showSnackBar(const SnackBar( + content: Text('Can\'t add. Course code is empty'), + behavior: SnackBarBehavior.floating, + backgroundColor: Colors.red, + )); + return; + } + + // to make sure the format is + _courseCode = _courseCode.toAlbiruniFormat(); + + // Check if the code already exist in table + bool subjectExist = _inputCourses.every( + (element) => element.courseCode != _courseCode); + + if (!subjectExist && _editingIndex == null) { + ScaffoldMessenger.of(context) + .showSnackBar(const SnackBar( + content: Text('Course already added'), + behavior: SnackBarBehavior.floating, + backgroundColor: Colors.red, + )); + // cancel the operation if it does + return; + } + + var inputedCourse = BasicSubjectModel( + courseCode: _courseCode, section: _section); + setState(() { + if (_editingIndex != null) { + _inputCourses[_editingIndex!] = inputedCourse; + _editingIndex = null; + } else { + _inputCourses.add(inputedCourse); + } + }); + + _courseCodeInputController.clear(); + _sectionInputController.clear(); + }, + child: _editingIndex == null + ? const Text('Add') + : const Text('Done'), + ), + ], + ), + // JSON Textfield + Row( + children: [ + Expanded( + child: TextField( + controller: _jsonInputController, + decoration: InputDecoration( + labelText: 'JSON', + filled: true, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide.none, + ), + ), + maxLines: 5, + ), + ), + TextButton( + onPressed: () { + FocusScope.of(context).unfocus(); + if (_jsonInputController.text.isEmpty) { + ScaffoldMessenger.of(context) + .showSnackBar(const SnackBar( + content: Text('Can\'t add. Data is empty'), + behavior: SnackBarBehavior.floating, + backgroundColor: Colors.red, + )); + return; + } + + List decodedJson; + + try { + decodedJson = jsonDecode(_jsonInputController.text); + } on FormatException catch (e) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(e.toString()), + backgroundColor: Colors.red, + behavior: SnackBarBehavior.floating, + )); + return; + } + + var jsonSubjects = decodedJson + .map((item) => BasicSubjectModel.fromJson(item)); + + setState(() { + _inputCourses.addAll(jsonSubjects); + }); + + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: + Text('Added ${jsonSubjects.length} subjects'), + behavior: SnackBarBehavior.floating, + backgroundColor: Colors.green, + )); + _jsonInputController.clear(); + }, + child: const Text('Add all'), + ), + ], + ), + ]), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text('Input method: '), + MouseRegion( + cursor: SystemMouseCursors.click, + child: CupertinoSlidingSegmentedControl( + groupValue: _inputIndex, + children: const {0: Text('Manual'), 1: Text('JSON')}, + onValueChanged: (res) { + setState(() => _inputIndex = res!); + }), + ), + ], + ), + if (_inputIndex == 1) + Link( + uri: Uri.parse( + "https://telegra.ph/Get-JSON-for-IIUM-Schedule-12-05"), + builder: (context, followLink) => TextButton( + onPressed: followLink, + child: const Text('How can I get the JSON?'), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/views/scheduler/schedule_layout.dart b/lib/views/scheduler/schedule_layout.dart new file mode 100644 index 0000000..9c313d9 --- /dev/null +++ b/lib/views/scheduler/schedule_layout.dart @@ -0,0 +1,133 @@ +import 'package:albiruni/albiruni.dart'; +import 'package:flutter/material.dart'; +import '../../util/extensions.dart'; +import 'package:flutter_timetable_view/flutter_timetable_view.dart'; + +class ScheduleLayout extends StatefulWidget { + const ScheduleLayout(this.subjects, {Key? key}) : super(key: key); + + final List subjects; + + @override + _ScheduleLayoutState createState() => _ScheduleLayoutState(); +} + +class _ScheduleLayoutState extends State { + final List _laneEventsList = []; + final _colorPallete = [ + const Color(0xfff94144), + const Color(0xfff3722c), + const Color(0xfff8961e), + const Color(0xfff9844a), + const Color(0xfff9c74f), + const Color(0xff90be6d), + const Color(0xff43aa8b), + const Color(0xff4d908e), + const Color(0xff577590), + const Color(0xff277da1), + ]; + int startHour = 10; // pukul 10 am + int endHour = 17; // pukul 5 pm + + @override + void initState() { + super.initState(); + + _colorPallete.shuffle(); + // Find if there any subject in each day + for (var i = 1; i <= 7; i++) { + Lane _lane = Lane( + name: i.englishDay().substring(0, 3).toUpperCase(), + textStyle: const TextStyle(color: Colors.black38), + width: 80); + + List _extractedSubjects = []; + + // Seperate subject into their day and rebuild + + for (var subject in widget.subjects) { + var _dayTimes = subject.dayTime.where((element) => element?.day == i); + _extractedSubjects.addAll( + _dayTimes.map((e) => Subject( + code: subject.code, + sect: subject.sect, + title: subject.title, + chr: subject.chr, + venue: subject.venue, + lect: subject.lect, + dayTime: [e], + )), + ); + } + + var _tableEvents = _extractedSubjects.map( + (e) { + var _start = TimeOfDay( + hour: int.parse(e!.dayTime.first!.startTime.split(":").first), + minute: int.parse(e.dayTime.first!.startTime.split(":").last)); + var _end = TimeOfDay( + hour: int.parse(e.dayTime.first!.endTime.split(":").first), + minute: int.parse(e.dayTime.first!.endTime.split(":").last)); + + if (_start.hour < startHour) startHour = _start.hour; + + if (_end.hour > endHour) endHour = _end.hour; + + // choose same and unique colour to each subject + var subjIndex = + widget.subjects.indexWhere((element) => element.code == e.code); + + Color textColor = _colorPallete[subjIndex].computeLuminance() > 0.5 + ? Colors.black + : Colors.white; + + return TableEvent( + textStyle: TextStyle(fontSize: 10, color: textColor), + title: e.title, + backgroundColor: _colorPallete[subjIndex], + start: TableEventTime( + hour: _start.hour, + minute: _start.minute, + ), + end: TableEventTime( + hour: _end.hour, + minute: _end.minute, + ), + onTap: () => print(e.code), + ); + }, + ); + + var _laneEvents = LaneEvents(lane: _lane, events: _tableEvents.toList()); + + _laneEventsList.add(_laneEvents); + } + + // Remove day without classes from last day + for (var i = 6; i > 0; i--) { + if (_laneEventsList[i].events.isEmpty) { + _laneEventsList.removeLast(); + } else { + break; + } + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text("Schedule"), + ), + body: TimetableView( + timetableStyle: TimetableStyle( + timeItemTextColor: Colors.black38, + timeItemWidth: 50, + laneWidth: 80, + startHour: startHour, + endHour: endHour), + laneEventsList: _laneEventsList, + ), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index 0d570be..dcc8668 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -17,6 +17,13 @@ packages: url: "https://github.com/iqfareez/and.git" source: git version: "1.0.0" + ansicolor: + dependency: transitive + description: + name: ansicolor + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" args: dependency: transitive description: @@ -87,6 +94,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.0" + ffi: + dependency: transitive + description: + name: ffi + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" flutter: dependency: "direct main" description: flutter @@ -104,6 +118,20 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_timetable_view: + dependency: "direct main" + description: + path: "." + ref: HEAD + resolved-ref: "804c38d46267d1558867f78ea3a7db6b080c0de2" + url: "https://github.com/yamarkz/flutter_timetable_view.git" + source: git + version: "0.2.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" html: dependency: "direct main" description: @@ -125,13 +153,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.0.0" - import_sorter: - dependency: "direct dev" + injector: + dependency: transitive description: - name: import_sorter + name: injector url: "https://pub.dartlang.org" source: hosted - version: "4.6.0" + version: "2.0.0" intl: dependency: transitive description: @@ -139,6 +167,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.17.0" + js: + dependency: transitive + description: + name: js + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.3" lints: dependency: transitive description: @@ -160,6 +195,62 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.7.0" + msix: + dependency: "direct dev" + description: + name: msix + url: "https://pub.dartlang.org" + source: hosted + version: "2.6.5" + package_config: + dependency: transitive + description: + name: package_config + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + package_info_plus: + dependency: "direct main" + description: + name: package_info_plus + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + package_info_plus_linux: + dependency: transitive + description: + name: package_info_plus_linux + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.3" + package_info_plus_macos: + dependency: transitive + description: + name: package_info_plus_macos + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + package_info_plus_web: + dependency: transitive + description: + name: package_info_plus_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + package_info_plus_windows: + dependency: transitive + description: + name: package_info_plus_windows + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" path: dependency: transitive description: @@ -167,6 +258,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" recase: dependency: "direct main" description: @@ -221,20 +319,69 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.2" - tint: + typed_data: dependency: transitive description: - name: tint + name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" - typed_data: + version: "1.3.0" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.17" + url_launcher_android: dependency: transitive description: - name: typed_data + name: url_launcher_android url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "6.0.13" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.13" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.4" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" vector_math: dependency: transitive description: @@ -242,6 +389,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + win32: + dependency: transitive + description: + name: win32 + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.1" yaml: dependency: transitive description: @@ -251,3 +405,4 @@ packages: version: "3.1.0" sdks: dart: ">=2.14.4 <3.0.0" + flutter: ">=2.5.0" diff --git a/pubspec.yaml b/pubspec.yaml index 6b49a35..f515c01 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.0.0-pre.2+2 +version: 1.0.0-pre.3+3 environment: sdk: ">=2.12.0 <3.0.0" @@ -34,11 +34,15 @@ dependencies: recase: ^4.0.0 and: git: https://github.com/iqfareez/and.git # null-safe + flutter_timetable_view: + git: https://github.com/yamarkz/flutter_timetable_view.git + url_launcher: ^6.0.17 + package_info_plus: ^1.3.0 dev_dependencies: flutter_test: sdk: flutter - import_sorter: ^4.6.0 + msix: ^2.6.5 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec @@ -52,7 +56,7 @@ flutter: # To add assets to your application, add an assets section, like this: assets: - - assets/icons/explorer-dynamic-colorx.png + - assets/icons/ # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware. @@ -79,3 +83,13 @@ flutter: # # For details regarding fonts from package dependencies, # see https://flutter.dev/custom-fonts/#from-packages + +msix_config: + display_name: IIUM Schedule + publisher_display_name: Muhammad Fareez Iqmal + identity_name: fareez.flutter.iiumschedule + msix_version: 0.1.0.0 + logo_path: ".\\assets\\logo\\app-logo.png" + capabilities: "internetClient" + certificate_path: "C:\\Users\\Iqmal\\CERTIFICATE.pfx" + certificate_password: 1234 diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 8b6d468..4f78848 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,6 +6,9 @@ #include "generated_plugin_registrant.h" +#include void RegisterPlugins(flutter::PluginRegistry* registry) { + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 4d10c25..411af46 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + url_launcher_windows ) set(PLUGIN_BUNDLED_LIBRARIES)