From bb1cf0bc87ec90c8a9f848195a69e636d51403ce Mon Sep 17 00:00:00 2001 From: Junv Zhao Date: Fri, 14 Apr 2017 17:39:38 +0800 Subject: [PATCH] init --- .DS_Store | Bin 0 -> 6148 bytes .gitignore | 1 + .gradle/2.14.1/taskArtifacts/cache.properties | 1 + .../taskArtifacts/cache.properties.lock | Bin 0 -> 17 bytes .gradle/2.14.1/taskArtifacts/fileHashes.bin | Bin 0 -> 30107 bytes .../2.14.1/taskArtifacts/fileSnapshots.bin | Bin 0 -> 355882 bytes .../fileSnapshotsToTreeSnapshotsIndex.bin | Bin 0 -> 22022 bytes .../2.14.1/taskArtifacts/taskArtifacts.bin | Bin 0 -> 52214 bytes .gradletasknamecache | 97 + .idea/compiler.xml | 9 + .idea/encodings.xml | 6 + .idea/gradle.xml | 19 + .../Gradle__com_google_guava_guava_21_0.xml | 11 + .idea/libraries/Gradle__junit_junit_4_11.xml | 11 + ...Gradle__org_hamcrest_hamcrest_core_1_3.xml | 11 + .idea/misc.xml | 60 + .idea/modules.xml | 10 + .idea/modules/RobotSimulator.iml | 12 + .idea/modules/RobotSimulator_main.iml | 14 + .idea/modules/RobotSimulator_test.iml | 18 + .idea/uiDesigner.xml | 124 ++ .idea/workspace.xml | 1921 +++++++++++++++++ README.md | 22 + RobotSimulator.iml | 50 + RobotSimulator.ipr | 104 + RobotSimulator.iws | 207 ++ build.gradle | 40 + checkstyle-cachefile | 14 + checkstyle_rules.xml | 113 + checkstyle_suppressions.xml | 14 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53324 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 164 ++ gradlew.bat | 90 + settings.gradle | 2 + src/.DS_Store | Bin 0 -> 6148 bytes src/main/.DS_Store | Bin 0 -> 6148 bytes src/main/java/au/com/seek/RobotSimulator.java | 18 + .../com/seek/command/MoveForwardCommand.java | 11 + .../au/com/seek/command/ReportCommand.java | 11 + .../au/com/seek/command/RobotCommand.java | 8 + .../au/com/seek/command/TurnLeftCommand.java | 11 + .../au/com/seek/command/TurnRightCommand.java | 11 + .../java/au/com/seek/domain/Coordinate.java | 28 + .../java/au/com/seek/domain/Direction.java | 100 + src/main/java/au/com/seek/domain/Robot.java | 54 + .../java/au/com/seek/domain/Tabletop.java | 11 + .../java/au/com/seek/executor/Executor.java | 20 + .../java/au/com/seek/parser/InputParser.java | 82 + src/main/resources/input.txt | 6 + src/test/.DS_Store | Bin 0 -> 6148 bytes .../java/au/com/seek/RobotSimulatorTest.java | 32 + .../seek/command/MoveForwardCommandTest.java | 24 + .../com/seek/command/ReportCommandTest.java | 39 + .../com/seek/command/TurnLeftCommandTest.java | 25 + .../seek/command/TurnRightCommandTest.java | 24 + .../au/com/seek/domain/DirectionTest.java | 84 + .../java/au/com/seek/domain/RobotTest.java | 83 + .../java/au/com/seek/domain/TabletopTest.java | 33 + .../au/com/seek/parser/InputParserTest.java | 57 + src/test/resources/double_place_commands.txt | 7 + src/test/resources/empty.txt | 0 src/test/resources/has_invalid_inputs.txt | 6 + src/test/resources/simple_input.txt | 4 + 64 files changed, 3940 insertions(+) create mode 100644 .DS_Store create mode 100644 .gitignore create mode 100644 .gradle/2.14.1/taskArtifacts/cache.properties create mode 100644 .gradle/2.14.1/taskArtifacts/cache.properties.lock create mode 100644 .gradle/2.14.1/taskArtifacts/fileHashes.bin create mode 100644 .gradle/2.14.1/taskArtifacts/fileSnapshots.bin create mode 100644 .gradle/2.14.1/taskArtifacts/fileSnapshotsToTreeSnapshotsIndex.bin create mode 100644 .gradle/2.14.1/taskArtifacts/taskArtifacts.bin create mode 100644 .gradletasknamecache create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/libraries/Gradle__com_google_guava_guava_21_0.xml create mode 100644 .idea/libraries/Gradle__junit_junit_4_11.xml create mode 100644 .idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/modules/RobotSimulator.iml create mode 100644 .idea/modules/RobotSimulator_main.iml create mode 100644 .idea/modules/RobotSimulator_test.iml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/workspace.xml create mode 100644 README.md create mode 100644 RobotSimulator.iml create mode 100644 RobotSimulator.ipr create mode 100644 RobotSimulator.iws create mode 100644 build.gradle create mode 100644 checkstyle-cachefile create mode 100644 checkstyle_rules.xml create mode 100644 checkstyle_suppressions.xml create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/.DS_Store create mode 100644 src/main/.DS_Store create mode 100644 src/main/java/au/com/seek/RobotSimulator.java create mode 100644 src/main/java/au/com/seek/command/MoveForwardCommand.java create mode 100644 src/main/java/au/com/seek/command/ReportCommand.java create mode 100644 src/main/java/au/com/seek/command/RobotCommand.java create mode 100644 src/main/java/au/com/seek/command/TurnLeftCommand.java create mode 100644 src/main/java/au/com/seek/command/TurnRightCommand.java create mode 100644 src/main/java/au/com/seek/domain/Coordinate.java create mode 100644 src/main/java/au/com/seek/domain/Direction.java create mode 100644 src/main/java/au/com/seek/domain/Robot.java create mode 100644 src/main/java/au/com/seek/domain/Tabletop.java create mode 100644 src/main/java/au/com/seek/executor/Executor.java create mode 100644 src/main/java/au/com/seek/parser/InputParser.java create mode 100644 src/main/resources/input.txt create mode 100644 src/test/.DS_Store create mode 100644 src/test/java/au/com/seek/RobotSimulatorTest.java create mode 100644 src/test/java/au/com/seek/command/MoveForwardCommandTest.java create mode 100644 src/test/java/au/com/seek/command/ReportCommandTest.java create mode 100644 src/test/java/au/com/seek/command/TurnLeftCommandTest.java create mode 100644 src/test/java/au/com/seek/command/TurnRightCommandTest.java create mode 100644 src/test/java/au/com/seek/domain/DirectionTest.java create mode 100644 src/test/java/au/com/seek/domain/RobotTest.java create mode 100644 src/test/java/au/com/seek/domain/TabletopTest.java create mode 100644 src/test/java/au/com/seek/parser/InputParserTest.java create mode 100644 src/test/resources/double_place_commands.txt create mode 100644 src/test/resources/empty.txt create mode 100644 src/test/resources/has_invalid_inputs.txt create mode 100644 src/test/resources/simple_input.txt diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..851db16c6cb11b8a77893d99e0176c3f5f1ce0a3 GIT binary patch literal 6148 zcmeHKOK;Oa5T0#PSks^y38_WmUJlSM zAK=XE%Hw~)fqwvhggdjl(~yvIs)SIqBh7rXk6C*@Yj-^Wz`DcG1~37DqY7-ELUV+O zaiMdvL_JMJCf5jqQL!H+Sui(OcW4GQ1OFcbV(%_P07Hl&f$9DGE!a=uqU?0Ov!zCJ z`NT!QD6-^~|%^v$XW%G|H!@-`|bX zFdKEVVHy^4o!fpnz*za9p1D?4mu=f=TN~rHRc&r|+SV0kV?5@3?V^3{M*qpvXVvrZ zi`R-&h9{7eRl-AfgU(cj2VR~gS^5}zMMMJ%$l=k{x%Klf?;pSOUTGPv)z%T2(;N59 z^Pb{hHxA3ePLysZ(Lt2n%5VB*q)0jrF|;`67u=waZw-K-qGzsGmE&A(TaIJTQe^OR zmz+Bf_g=nw`|kaRkDoq&kwGva>5OVm>{s-Nia!XNOwrDwF+e+puPj<(Iv>q|X5iQi zi1Wch73dPy3gyv(MwS4G;x|GH`l6N)F&3dqSS!R46sAHERVbqpgQ;-rw`iVASSwWF zz^M3O^khaA3X@OA^({Fan5$4*&46ZLmVt(9n&ST7{(JpD8>CyB0nNZdF~FKz-c}b= zqPul2IdRuosC`r+VqUFKhM=MASUTb=UPqOJW0r6bUBX%+_Mqq=0ZD^4nt^}Hz%Nb} Bq3Qqt literal 0 HcmV?d00001 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..378eac2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build diff --git a/.gradle/2.14.1/taskArtifacts/cache.properties b/.gradle/2.14.1/taskArtifacts/cache.properties new file mode 100644 index 0000000..3f02190 --- /dev/null +++ b/.gradle/2.14.1/taskArtifacts/cache.properties @@ -0,0 +1 @@ +#Wed Apr 05 09:15:28 CST 2017 diff --git a/.gradle/2.14.1/taskArtifacts/cache.properties.lock b/.gradle/2.14.1/taskArtifacts/cache.properties.lock new file mode 100644 index 0000000000000000000000000000000000000000..673f79ed4c272d880325a4fb390f9861588e8cf7 GIT binary patch literal 17 VcmZQx6w4HBz(0k90SuJ>0{|Xk15^M2 literal 0 HcmV?d00001 diff --git a/.gradle/2.14.1/taskArtifacts/fileHashes.bin b/.gradle/2.14.1/taskArtifacts/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..dca3549701899d6fd8592408da3202a5511bbbde GIT binary patch literal 30107 zcmeHvc|285_`mJi(+wfATq+c)lomuJ`@R#ACHpQ)i#4JW5|yOQQb{T;ge)aXqEcE& zB_Hi1l~jJ`-Z^vbJ@>l5*Z2GP_s;93bG&=r=b3rWGtbPNGu5%4jZK0$g%&nYc)-P> zAGxjs_a;Krd-FZidv6l;-Z6!G@9jjrH`zhGXA7XY-%4|zNOOOH=Kd(neKF1bWt#gs zn)^1I`zJK_Z)onn(A@t- zfTaLS0hR(R1y~CFpHiU19%(K=XtIO`2W&gBBZiG_i6HW8Yy8%m4hOZko`S!MREJ*@ z5)Q=J1*z8W2Don>#1jR6_^;mc`ZmD*1TegEab%I4$XbAJDZudeX+LMoQ#%N7t9uYn zao9N{dt@H@Z9h`Nav;8EV(stM0m1};Z$1X`w0J>7Z0P$nzUU=IzHITpf zAjMw+;srU%%M{%N769DkH->jU7@J*js|MgvA`m~ms1gx@1Uo8s`IZGz(cQKc!Yr6$u}BY0JnII;i=rb4{Gm(0z5(r z;umvstEBZcDgf@l2JwnAqTk8-L9LxceZ)uZK1y>-=e%0dQMv zTwlMcGeM9wM4#`S3GHv(T+Oxg``^dF-l-eIKPeFuT0MpV?xqOwT8G?+vj!}x0Pgb& z;&pZ#ZyY~gjpiTk7Kq|<o>)|mdSKSkFlXw7&9aF<4C-{${Q_*_y>0l))oF+4>i^YZwVJHU-n zA>K94(Q|4t8jUM+ET24VIDg9gRO$<0AApUcM?=0j?K(DaTrY;t={Z($u~~2}`3osh zjI1!c>=iHZxd8bqDpEFK@$gjY^7B0tktP7QcZT-8#XoNMjmMF{z#_%t1%|hMs%v}m z1kDf5TOs}|Ka9sA&1pHXH?M{GbD1g80#(sofZN4kxbr_ti+3A!0B(Yfi|1qOTWYn= zqWu!C3GH9bl**s?hM)Xp87YplA>Nl{ZwF)j`|7D__qIi~XdVmw2<-=6U8`QHf1Uib8Y!0BA^uid^-|v38!-Uih<#Ci zr)fA~%ptM?;Fcet{ZRGi3#6<2{sXva8^r(9RXtx{vdsbDu0hHbf%-MW=FRW_sI>kc?s&IfQy0f_&S z)av^h@Lw~)&DKDCVkXbeTXzmA0o+0b!#lXyAMLPV2e_>&hIe-D3=@1rKKX!@Fl-*5 zygJe4bYD;w;31Eo{lAmtU+R=&(e=+3>^c9cYhJwdH%S2YrrFS*?O&~q@~_qE0N;f5 zJG<%G(L)dN&~=EhFSI8-bu`ytoBJ2o+ekp1_q$Wr!1iD?Z@6nge1`X%#)fdUG+=Ls z&HFQc-hHu8WZP4KyDo+HMCD6dynh;p0B#+I;TKlLeQTNY1Gp_V&l2lXLj(5i9RqmK zY0Uo7V9)xG^CAHratz|L>}O|g@9ag_8-7^6nzgg7B>QHaCu;8n?S+k1H><_V1pwSn zAHz#LwM-|X(dTdRhPa4|-||Prj-tTc0-HBQ{!Jt{Ub9E@Ku{pG7yZ|K=EA$IL16EG z0penMF;knvzS{%b3tP8{Z9L+{6>fC_#ot4Fam5!7b_JV?0d5un@j1zkRvI0BrvV;~ zwQElKVmFBZzLfy?DS`G<{6GI&r(%ibdAIuzpIdtWNx;>qLSS!2g1B^A7U$Q`{&oNl z7J;}z(Cf7Ujh62KZiCH(3P~A)Z<^D20UkJs*-upZxof{)0C0P3zo58G^{=QzAv)ig ze~0$UIak!U1nx8ddxubnFEm$=^mrzSo(?kOfcPRC)09O9lPbX8X%U9Ia25?1oJI41 zFE)>>JT;#eC|#fm?2YQ7y{cVk=cU&_(D80ohT%>lzfJp($N_s-KMWt;RlCcjrXS#& zv2m&v?EG(_H}NRIUF@K}+VNCfZfA*Vfcs$WS~^!wPveqE2EaYXp#3tdRPFhF3(#@l zb{NBd%rze?5;+9yBd~F;p7}f|uQ5Iu;0{>7YY1vy+&UF758%<5J{kdaL1HeKh5_!( z2cNI8FHcKO>!}gI!y_TS%HLABkpCIFKKD$5xc2Zz|0&tr8^C^JJjB=o=o)jJDRT)Ls{~m!DJ`mG09=i?2{aqohYq4?Jl+7n}y=sAt$94G*_h$=;6eI$6MPkUD&hfkd97R>QJ801tQzal=lv=(N-aXdWc#PN>G8RYKQS zShJ=qc4kIou8X0q%q}@#ANc~>JG;j9YxyjC z3~;YXh`U5t1)aEeFc#n*nEo!?KiU}`+K;v?9Mj)5GE~Iiw4V~NcYX(-6V; zHZQOb!rJ9)-J22W_YG~A4fdYIuWK~gc4-kB=XUGibNoZEoBp%QL)+zX8sY)n{BBCW z1wMf12WUb(P{?d~&K@5$?^$8%uHY$2iNx(IV}QM*IkXSIeWb*hIF7FC+@l~K*%N-n z(U7%Ljd2@1aWu;xG<_K_>J`^O97SwECpB!uoPe^z*2yv080Uu z0xShs3a}JlDZo;Ir2tC-mI5pVSPHNdU@5>-fTaLS0hR(R1^zE6(4mgBQW^Onk$;Gs zIUEkN)0fnIX!=WJ-YUdk=QwF*z;^JeBQp;0|OfOw|FbDU#+ z_qrp@j?hzE3Zyfbq?@K_u9xKB%4LhdedQKOgB@1Xjbk;VlD2NHj{ROVep z4&5Wo<9?V1%tiKtE82V1PB#?#aqD$|dyo6uuaDJl?L*EM(z@eIXF{`2BIVY8-py8- zea<0NwC^LCruF)DJTQlCWbiiUQ2xG}jY`fVee1r(tSU#IPV0>eJ)yxEVkuYmF3<6v zYZbKcg~X0lLBx*T<@bypC*V%l1+67RpXcaia;bUx)L&D+A0}U8Ad2uDj2-oRDfR-K z5zKhMMpvlVoVk0Jtt!vihy4!{iwG|{1o-1__hZI8Wa&GUpiq!xJ8Zm7ZuH$F;IDEO z#hz0UJ;6cO=g1JMe|b@MLPwD2srrcK%QyRw6L;(mCRUB;37sPJBp)Mh^q|_ju$=JN zrUI231wsZAlSn;XB|vP-WT7XB=y)We-YTxn-t>fXTh~gjmiGuC@{|*A#V1JNOK2B9kd0t$j!am4hb$l?7x7YK&>=)w!3nk9j$Yov+a=xH*GT z%LS3QDdwED=(#S2VDZY)&@}98uTESxi`X;}jSLue2MZDYOTbIT0Jzcx3yBz0GjXLn z<(lh`Ih~4I^6QXlAOj)fcRn!ZL}Gwa7zU8mfgAJ2G+*_s5S89lQ*O0~!aF1x56lT$ zz?Gqv>UxBtW%p*W#dR+*G7FC9pwRMCP#RA=6I$&2`Dsqi_E&fiGG+B9y^u3GpWqS&`zjPq!q5PwrR(p2m|4t4Yr@4|9K%qTs<%(tqdQcb^UuGEX}} zffv~GG~#(Qp(5yRQnYwj@1J2nX-L;IL*Ng}!jB$}W#|NhmuWll?kc;b&W<$rd}-bQ zp2o#g&AknCejZ!4a-V9k56_2YZc5Um_QI?WXf^SzL&j^r+{%1XEgGBe%WV;@3CR;8avFzYTQ^SBP=B3E+Bdkd~~=>ch8;e)PBUn$bi@6Fpw z3qM65QzH$JL--_)N9{a9j}GTvr6g{LjDqs~p4Z6gf|jPtkJ1%i9p1!(k_vB8oldmj;}>g~)H{!XrDS(jfVC`|i&cdybo!{vu~-qW3Zk1&@bhoHY6W@~GY5 z^J3TXe%*vWg7!W^2M@I&lMZcga-hdt8OG53zw;7AJd69@zDkbil}Ou4M?<_*3PbPx z*p)bxBqSTw5w(tEYM+l3p2vm+Ii)a+p}_?4KY#hGJ}pjFvA&+N6`5OUt4XIOwRIu3 z+=QIo%d%E0+DNh@o-KG9`zF*KLp2NIFKs9Fb1$zA-!WK7$VC1z3C;BGASrEhnqtOK7|c>kC3&vdG=GgYO{PQmcwWRlgVp_*2Q z#yMy3{)VnHQ}fyC`+45}UVg@Yjg`W0Gs$x-&3wXCO_{*w$-7IM??$h6so(M63uKi@ zOPkq+Q+w7` zm;gbnP~AxtHdf2078PH4954I&zu6DyXlt0c`)MBcNn!6=4Y>xd-Ky(aH{f|Q(Sx>( z1NKm~$CZ#Dn_Z3kSGmtwXh2?W(um2v8P^HaYI27-ZrC&Y>7u^7-oY3Ce_rEh*hs*~ z3W+HA`A1hi7r}UB-BLBVL&ddtS{2-2Fy^Dw1@4^_qUEil7x%8TdhmT2nMj>vi4IJv zsS?#8nSEH%{a!_icO>zo1m2$zY#qLu$gFUAevh$3q`PfZjQ8ryex56Mp1=_%?m~m* zzX))D?-jZ`Y<}5U0nM6lu_>T{>pZHM^ZsP^=;x1@%Q$;J3`re)Mrj$;z~Ek7A_U(wL@YhLw-rxaB%-aK1eEope2wI&rOMAy&W_3hv}(e}Czlxj|F z^8@zmh`N+QKk$6H^QJVE**2Lp23y>o?TVZzN49x#De=IXCmmcFrji*d|FtZWTrP7e zRI|g>L)MZ~%R^%Mz?@44N296b zZC@`BU@tHm<$+q#@RH_eE1C}jKGnY~Y=}UkHm#2L0s5{1aq$&9NsqpA+142_x z%huX#kEG~=ZPwV~f)VeJJRw*Rr3M^TYc3j9y~=v{sDiGZp1Af=N07Cn!{hmF<|aF( z<=f`_KJ=lu^ByP#=5x7WJ#o7k5|QILkKTT_bjLkrQj6`p`M=_6Gjt%0K3L=nU9akL zL?_Nk^i>_dHfaQE31tyxnv5pIN80(#&KYk{R*Vj0fA5dyVHLbTni{(a>mOEUT=x?}$)*WcHQB zE`h3f$N(kB3f4NvW9YlI^w7K-hpq>D&Z-APV5bkhl>>?H1qA$OV)95J@3sr*{oK%HWcqq7#SOsg0CjRyZ30ossDBI zh7}jYVsy7EAQ^?Wo`O%9@&4)-m!3Kx{v)PKIaedo%?5OkS?>AME{V;7c`LP6uZy$-cU?lF{v67Bn zV}qzv4}-A)GEdt#a0zfDV1>G4Oc94v`n;o;Z|gfK{9}C3r=2pLP>Eb))7BHw^Umi- zS6(&Wv#;26`p9-J!#Ge;?9D|JGu|JSimJ$KJJyA)@v^V&jK59CTf~gll~&|Ov?PXo z*{CCVFQW{p7g-q0pW3uM5^>h2a~BVejFw&DC{X-X9?eP7#ryFHFz0DQX^gr|{_f1p z{jxGYN;K$E_WCm9pTLp@#U{R2O#F$*T@%=4$gTe+>f;gl>?9RBS|U?_cRq+$&K?|4 zu;==|C~q(MztkYN55|i;GR05|zTc64=$1X^v4rsArPqa^s=UlBRXmS?1j6*Zw+g|0 zq#5&*vp$6zim$%(5zpgMV#cd!e|T}r_FvAscH943(rhP(=MnHP?5V?@mv`GDAGZS6 zy5a17JrCE+1vHq=xZ!ZXuOmprISB^d3$+a0|GY6t5V-0RPo`0OfeTL1X!lXw394SP z*emr?slR&i1b<;%AD+iihqjL1o#z(P*ApOjt)ByXYt<+Bp`jgmoyg-5F$t!_zzH_*Ev8o`#OP`G z;GdSq=^BYDPQoJJ$vo;z#P5Mtl5Pxo{!n!N3!d z9*p`~D}P38*BPZDW$`m~JY*Y9DRew!EYul%SvAIH`^3-WifFWOMXk^6P^bje14TvzP1@fl#ht%_LW#U+F z!O*Qs#x=5qy&39wo-mOaFWtoaL6hUqOyTqt<%Gj|7IeJnb0FfctpCaP@|A}?%6@eQ zFLwTQ3C|Nejq^v1GWB57T;&bd)Ze@uFYEi@fP5#R?ROqzi9jj%a6#Oq=)LPRTGN`j zmaBNbQF%MMA%e0Hkoch#&<#{~#QOaMQu79Te~QKJAB?R+7VWg|1hY^Ya7U#@c;6MR zx~6HYW*^YA)O{;ud#|1Iu?U#6PvU4a>#K>Z)1=_2eM8RaxvjDrp3`-LAindc?rith z%@1B_BV4QD*td1x%u z3S&%X-W3%&)m(QzB&~hdaEQ7B#b4^U9I)r-09VG{<;@3jeo479n=J*57e$Y}TT13> z4H6|#dvb%w1wR&$&YO-$oo6YB3Z~_qief(@Gwb-(M;e+z8-qfSMLW6o(D``*nq#K% z_t&fU?COf9yroUzw_3E(nl4~dh zuP2GPZDGNl{U46|$voR@NGzHDBBHf?EMp8 zGBe)9fr1suTO(UKOTE~o`lYi$1L3+%1nC$`!RvzP`QYX6fg?r7vlky&!)08XI1BL5 z^^Uw7Q{Gg(=d<`Z6MU{$Q}rw^+9T@?nmA(v_d=t;V!eJ4SMSEO)fPxr zAk*OTiXUac592gx;_K2kffoy74Kj*XWPY2wP@YWGcHQoWGS;A1hW7nY`6N1cVnM_C zHKI%7T=cF}cr#KwP5jT3b7tfD>`zr5tCwmMfe^M7Of=uIjy3g_2-o-@J54<6Jy2CwQPV#=LY{_~)+Sc%|_ELN)8N zjdPGZL_7Z2Do`RrJ?|SFc29P7JVCspvhz3pe1ANTcQG^G2~JgCE3RF|FFWg3+*X!H z+C#eo;AmmSJG10K>A|aiw%SH?t~nKVfU=0B?i~0AnelElf2(PUluWgb9X=ANzZS`t zw26YSX<8m~xJ$EQF2}`1<8#la*VX<0r3q*-ta+ZHG&(&=#ATa)@G04^O@8xriN}`) zt=DusWLril3_NSe)1t51)7&u+@yEfGMG1$(o{i|jk6;~{zX&m=qX#XN$)_sI98 z)ix%`s*2n`SW&_RN@VE2_pvixE#F%myGrGe{5T=w9UbojGhRRmBl7$b)&0A(WPw^L&fAMeCDO<|?F6Y+z?`7NjMsIwrAs{K?6Z7RmmBY; zrzrCg_0=3S(x+YW9y$oFgFP2JyFZXBe<&x1N?qBKno?igB;(k(7SL zDWJaK`U$)&d~nM_rzeRhB%Qle`in$*YSAx2ZW>WlN?;&}R`Ik}{{FU*(4m$N)On2pnxIZR8CQX1p*zerPc4B(o z6~*F*sm5&YS|m3JI%Hj@ymz6#_Y^W`#yb=EZDdR=)-{Q9FzT~@A~G-I;&_Q`iY|E}=={h2k{NFxfUtT; zCb2ccGG*b(D~A!?k^aMYoJ`;E-H%xtzEUfovVDU~1J|(!Xd;CDM~Iu&ABkvH`%gbO xMoYxHEv$cj=EeljJQ!!}?I?{g&aP~k5SlrZw1Y7J$n7Gvn3;H8u!Z@O{|CF!Ia&Y! literal 0 HcmV?d00001 diff --git a/.gradle/2.14.1/taskArtifacts/fileSnapshots.bin b/.gradle/2.14.1/taskArtifacts/fileSnapshots.bin new file mode 100644 index 0000000000000000000000000000000000000000..952011c873b430079c1cd7382bc4c5d671167830 GIT binary patch literal 355882 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 a$e3D2?C2mlMk`{p5k2yj#wjxiqW&K*fVXG> literal 0 HcmV?d00001 diff --git a/.gradle/2.14.1/taskArtifacts/fileSnapshotsToTreeSnapshotsIndex.bin b/.gradle/2.14.1/taskArtifacts/fileSnapshotsToTreeSnapshotsIndex.bin new file mode 100644 index 0000000000000000000000000000000000000000..c6e9ada6573c587a50c3b579a74708a1248a269b GIT binary patch literal 22022 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 S%bss(RM!qfj>At4>;D5!I@*;0 literal 0 HcmV?d00001 diff --git a/.gradletasknamecache b/.gradletasknamecache new file mode 100644 index 0000000..6e1c162 --- /dev/null +++ b/.gradletasknamecache @@ -0,0 +1,97 @@ +installApp +startScripts +run +assemble +build +jacocoTestReport +buildDependents +buildNeeded +classes +compileJava +processResources +clean +jar +testClasses +compileTestJava +processTestResources +init +wrapper +assembleDist +distTar +startScripts +distZip +startScripts +installDist +startScripts +javadoc +buildEnvironment +components +dependencies +dependencyInsight +help +model +projects +properties +tasks +cleanIdea +cleanIdeaModule +cleanIdeaProject +idea +ideaModule +ideaProject +ideaWorkspace +check +checkstyleMain +checkstyleTest +test +cleanIdeaWorkspace +Pattern: +Pattern: +Pattern: +installApp +startScripts +run +assemble +build +jacocoTestReport +buildDependents +buildNeeded +classes +compileJava +processResources +clean +jar +testClasses +compileTestJava +processTestResources +init +wrapper +assembleDist +distTar +startScripts +distZip +startScripts +installDist +startScripts +javadoc +buildEnvironment +components +dependencies +dependencyInsight +help +model +projects +properties +tasks +cleanIdea +cleanIdeaModule +cleanIdeaProject +idea +ideaModule +ideaProject +ideaWorkspace +check +checkstyleMain +checkstyleTest +test +cleanIdeaWorkspace diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..0afec5d --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..dc8dcb6 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_guava_guava_21_0.xml b/.idea/libraries/Gradle__com_google_guava_guava_21_0.xml new file mode 100644 index 0000000..32b92b3 --- /dev/null +++ b/.idea/libraries/Gradle__com_google_guava_guava_21_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__junit_junit_4_11.xml b/.idea/libraries/Gradle__junit_junit_4_11.xml new file mode 100644 index 0000000..dc26b34 --- /dev/null +++ b/.idea/libraries/Gradle__junit_junit_4_11.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml new file mode 100644 index 0000000..8262f72 --- /dev/null +++ b/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..a807377 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.7 + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..b7e2d8e --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/RobotSimulator.iml b/.idea/modules/RobotSimulator.iml new file mode 100644 index 0000000..8a25f79 --- /dev/null +++ b/.idea/modules/RobotSimulator.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/RobotSimulator_main.iml b/.idea/modules/RobotSimulator_main.iml new file mode 100644 index 0000000..339ec7b --- /dev/null +++ b/.idea/modules/RobotSimulator_main.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/RobotSimulator_test.iml b/.idea/modules/RobotSimulator_test.iml new file mode 100644 index 0000000..62b9c65 --- /dev/null +++ b/.idea/modules/RobotSimulator_test.iml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..517c0ad --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,1921 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + instanceOf + + + + + + + + + + + + + + + + + + true + DEFINITION_ORDER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + project + + + + + + + + + + + + + + + + project + + + true + + + + DIRECTORY + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1491355005333 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..0d1a6aa --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# RobotSimulator + + +### How to run the program + * Please make sure you have Java 8 SDK installed first. + * If you have `gradle` installed, then just run `gradle build`. Otherwise type `./gradlew build` or `./gradlew.bat + build` in your terminal to + build the project. Then open `build/reports` folder to see checkstyle, unit test, code coverage results. Jacoco + html reports in the folder of `build/jacocoHtml`. + * Type `gradle run` to run the Robot Simulator Application, and you will see some output based on the + `src/main/resources/input.txt` + file. (` + ./gradlew + run` or ` + ./gradlew.bat run`) + +### Features + * Checkstyle for code style + * Gradle for project build + * 100% code coverage (Jacoco) + * All tests passed with Junit. + diff --git a/RobotSimulator.iml b/RobotSimulator.iml new file mode 100644 index 0000000..cbef26a --- /dev/null +++ b/RobotSimulator.iml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/RobotSimulator.ipr b/RobotSimulator.ipr new file mode 100644 index 0000000..2ae6d8e --- /dev/null +++ b/RobotSimulator.ipr @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.6 + + + + + + + + + + + + + diff --git a/RobotSimulator.iws b/RobotSimulator.iws new file mode 100644 index 0000000..d5bc759 --- /dev/null +++ b/RobotSimulator.iws @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + localhost + 5050 + + + + + + + + + + + + + + + diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..11ba60d --- /dev/null +++ b/build.gradle @@ -0,0 +1,40 @@ +group 'au.com.seek' +version '1.0-SNAPSHOT' + +apply plugin: 'java' +apply plugin: 'idea' +apply plugin: 'jacoco' +apply plugin: 'checkstyle' +apply plugin: 'application' + +sourceCompatibility = 1.8 +compileJava.options.encoding = 'UTF-8' + +repositories { + maven { url 'http://182.140.210.215:8081/repository/maven-public/' } + mavenCentral() +} + +dependencies { + compile 'com.google.guava:guava:21.0' + testCompile group: 'junit', name: 'junit', version: '4.11' +} + +jacocoTestReport { + reports { + xml.enabled true + csv.enabled true + html.destination "${buildDir}/jacocoHtml" + } +} + +build { + dependsOn jacocoTestReport +} + +checkstyle { + configFile = new File("${project.projectDir}/checkstyle_rules.xml") + checkstyleMain.exclude "**/src/test" +} + +mainClassName = "au.com.seek.RobotSimulator" \ No newline at end of file diff --git a/checkstyle-cachefile b/checkstyle-cachefile new file mode 100644 index 0000000..0ee45c5 --- /dev/null +++ b/checkstyle-cachefile @@ -0,0 +1,14 @@ +#Thu Apr 06 08:41:33 CST 2017 +/Users/junv/code/RobotSimulator/src/main/java/au/com/seek/command/ReportCommand.java=1491383770000 +/Users/junv/code/RobotSimulator/src/main/java/au/com/seek/command/TurnRightCommand.java=1491383770000 +/Users/junv/code/RobotSimulator/src/main/java/au/com/seek/RobotSimulator.java=1491386986000 +/Users/junv/code/RobotSimulator/src/main/java/au/com/seek/domain/Robot.java=1491385232000 +/Users/junv/code/RobotSimulator/src/main/java/au/com/seek/executor/Executor.java=1491386727000 +/Users/junv/code/RobotSimulator/src/main/java/au/com/seek/command/MoveForwardCommand.java=1491383770000 +/Users/junv/code/RobotSimulator/src/main/java/au/com/seek/command/TurnLeftCommand.java=1491383770000 +/Users/junv/code/RobotSimulator/src/main/java/au/com/seek/domain/Tabletop.java=1491385286000 +/Users/junv/code/RobotSimulator/src/main/java/au/com/seek/domain/Coordinate.java=1491359857000 +/Users/junv/code/RobotSimulator/src/main/java/au/com/seek/domain/Direction.java=1491362416000 +/Users/junv/code/RobotSimulator/src/main/java/au/com/seek/command/RobotCommand.java=1491383770000 +configuration*?=D4253C640606282CC41CCBFE1BA2D21B121751B2 +/Users/junv/code/RobotSimulator/src/main/java/au/com/seek/parser/InputParser.java=1491385972000 diff --git a/checkstyle_rules.xml b/checkstyle_rules.xml new file mode 100644 index 0000000..a4a42ad --- /dev/null +++ b/checkstyle_rules.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/checkstyle_suppressions.xml b/checkstyle_suppressions.xml new file mode 100644 index 0000000..9e23118 --- /dev/null +++ b/checkstyle_suppressions.xml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..3baa851b28c65f87dd36a6748e1a85cf360c1301 GIT binary patch literal 53324 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

*Ou)7mZ_?&1& z&e&!u&@94-=zm+q5;#4GP=A;{4|HYXi{V&`z&dImq$h}6i!*LPRgj31Wa6vg8uP(A ziXg@(h~lJw7b8k32g*?ktFVl@l1r(>CngG~N;fS)7Ly6t$iz3psb~hB+5G)CDrBzu z3r&ES@hok9!TwXX&3vYI6aRv8{=bP2rvHq1{ypB6GIsczS@qS95cXAkZQbK-9`P>iX}%^=l4H7rl4Mkno6jXdd9hD@uKa*(=pRElXU zur<=9(oH%1f$}a)db1}Ao*Cr+vvp0!&fDjE=3rrfWcX3;2qVTdYr~&Dd0|S7>SPU& z0R_t@uWd0hFJ~z(YwrH@9eR*0+ZLp@zdth2cVZ*I#e0V7$;!i4zb&ohDVZTy+nK(l za2=418RI}{Z3YH7rQ=1GS=*41LA2l0;i=gySaTSeZ^N*ULLHrBZOW8xn?~C}?NmKS z=OUykw$&=YCM^krgjuXMEf)E$lX=+<7&krJNDb_R!)0F7F54rKV``Wo{b6S8Ls?sf zKge?Ky1nR$E!Bj&PQUFo!L6gUyL5=4>^>s?GdA&yG}gg3mOM!?MPNePL0;5*10+U# zh@mM}PJ>`Dje+~=9OZ=>*Z7?3(3kUz@U-X{n6ffT&%R?M5T2RT*hXQ+BKq9Y)&C&9 zH$A20(C24(ZkZY%Ra#|xI3}1*+)KtXi}XziQLPE6-mY>K^v~KdH64lWDw3bYFrp(4 zb;>S3Zw`mj8cR*>&dFzLCsgGvVwM07uzKmO_LDc;3KtfR6AK(?m;AN5xB4e8>cbQ_ z(g`XJ;Hng66;g+!;H{Bxc;MRTF9lU=BM6KVC*k?|LHg)~hp6az2dwCMhd(13?@EH| z)cj%`!5|cOR6yuc(zJx=OJeLD(CTP6KRGUyyn)RwCtYE(xjj;zQ^dRusA)-q$KB*i zBte#6O!6nx$k_FMGPZ6u-5HG1q0lMIhqWg7Hw$9V6dVHOfXpX=W@C7TT&i_~jcf;aB3N#Ga=Qr*+|3_# z;Q5U32OzfO&2b;S9O+x0^Y?ROYP@`NWBI^gzMV0iV(4%Ais^@!0YxjqfeyuOqvDU zP|%MUj31FaGd4usP}e1W?7Jh=?pUaooq}m4&&gYwW1SxlEcJfb(uET4x~?+GGAYw3 z{PIlMXz>F!EPIwP@cnK0Pybfp&D5#!_v{Ax8`Tm1Xa6SWX!+mKTWHdU%2(U}QIniiD{EbV7V{_aM<~wl5aB22XHoQND?Ex; zQ+#f&>n(TQZ<-(9-|z5yNQy~Pdln#RPP9Ka%PEwD>BRKIc}2EToQQ-I=8VGQ${;+k z*PsVCSO;0QPT?9Zq_5Kr?0x&O8}$bd>dFQMJa;PmlN30*T1zuWD@~zzxuQGDMnVdf zTJZJf@!gGFj*E(7CAO41TWej*hLPCqa|)EMb1MkdhSlix&pTp`&*>ACa303RmV4l6 z5!CVmwLt+RCVn4k?mm8e$EhQ_Eum4ExouPmWGfV=023`dQP$-3^AMFoR89AxN1o(g zwDx5i2u~I`{PqB|*<2nRL6)I4m2W!)F*zJ;ywU^_9TC zb}(r3g*t}7CRe9ag;stiWM1G`b)cEIy=27LzO+8N0@{#X1>z6bvn{-wL3Ej$qDf$# zA_mjPnUAw*p)^lRE!|K}XaiEI?cm9PHN0HJJ(10l9g^HuNu4EGFZ%AZ1-Jzpp3nt$ zs$%Q~*-#$zo~^rs=Rd&zR7sOpYudBFP!b0L2#Df8tE7^#o0YJutGT_&e;>3d8gGWU ztH^&Cq;#~a?deQ;jik)wP>F#nw@2*d4^nAcQNWUEhZRIHnlUcJQyRM(3p9N?_@4~P@OpXhzQXwl@_ zQKf!~=tSy4cYI5Z7muZ<{_go1?^(Y!g_NL6Q%tL4{<;ijl-}Lo-VW9?xq-@D zE}otSQYO`Lg@@Zlb9BbUNv1L5g{`>gC+w^FHitRB9bgMSsr;i%)`R%4YhtVM$z{Es z)wQ#Wd8C}9!g_JO;V5AB;M(e!)64IMOgr;S>K_)(tJ5OGE8?DRcl137-4RavcK&tf z;PlhYZskOsrMx523}O<$*)F5-Jt~Hn?0%F?5bA+1s5ey`alD;e^#pV2nituO^^?_6vhk$cB1m(X+QAHor1zAb{y2r@Sm|I-Ssne?Mu)cb0@+?%NK0(zOm$$2DLM>IV zZHMk-lNfrgicTNcz4L_kyw3zwiuq}7xpQy|!Lx6fJ_OH$Lo*W+>|8-)+x3jc7(t~p; z(^`FDam-zpNO~|aL5mfj>&Zh!eXitSP23)AnT6v3D?0g|V;uLu3;|0xs5Pn4-B;80 zP~Y~;*0)00>HW_mb|0l#&x>7-)(k%0+s~NFrZ+I?gxtNhIwcn+9IaxNnM(%#kfhZS za5FMOpm4IL@0kd*R`W)cns+Z#OXop`?ZmYCsGi_Bp2Klm-KN!HvnVI2apJN@k3QR6 zISbv76aqptz`ck#Bai&^XCpp-cV}LZ{U|$!zrpDhO4F$WA&?oi<*T||uA$NO*$8Pn z5cutBCA@U4V7+C|L7acQOR}$B6dvK>MNc;R%)T1@L{;tuc`Wmc5TS?{5@BKSo6IZI z2v^k4`~LpJCA95yEU6MhQQg4_L=;TeYoCn#71@qu z3+m0QNE0Oh8>rc0z#_XC1Hhx8cFb@d2jQBeRYeq1QwKflP?F0nj7!bA888#I|Is=6 zd_MAW?z5nDsAPsYs;RQQe)$gS4M+MitB@BcVtvKPS32P>;ERPUyzpyqQkI zUyUA+XJEmw;dMdL!VsUTTK@{9PsEN|`~a6Z<{GNBjBg;*S3-xG<- zo}Fzib`VVX{OgvD{0{CT&(8h<0(|H8E;}19BCj(H z(#36!pH<9}zl*B}g`{u?=bZ<#(#wgmEow;S6OMKH55V#bPW8Lie=EirPZHAf#;oz< z{Ef~Zw)chk8_I_{EbdMW@-1T&H$xAuBg*WIYRz%uJFej=IXgV}HDUmGlFHmo1oaf={j*ZMl$AT83sgsm8fcNixQ z61;T$8dCfn6VZj4XJYgf>CH@{SdC7U%yO@i?z~2IoC&?Uvh*C)nvH+!b3sc>%d&>8 z;T>SqSRxz!2}VX2GfYQO)fV*^)r@##Di-(mA9`p6V>tM0!6XAT~M>P?sfS01{&RmYdAWL7%s zO|!!=-u)H{#T<_w2F{$7E&frFmp1O&5$>BBor9lmQv389#=Dko&(%vkaQ65&h*y=W zmwRApFy_cbiFJIbGF3G)%;|@B%_AGN-_L=(2iK;&RcT4tz?s9R1v{v_&~D}Z6`-2q z`+yy?+35u}a4%R#^;eS6O|ykopqkTbV4M9Y^d01Ujs4AmwAVM4w|2Qqn$Rbp7U!;k z0wDWS55cf6yVnlUqiec71`hG6$**qJTx4X5N+&uY{Ccv?SFW2A+G1&{Y`8fEhvbpO z2MhiKhYZ|P1MNA=NCWJ>s#lx0Zk-(gdVvm|ecSXP_!!#@4o=6;=7I|M#gWqG zEKc?s#|}5q?a~&x(CM_xuE)%9g3D^_78HwWSMbHxcP~2Yb7tEp0%_p~+YG-1FUzt7 zqs)0cMYk0!x=<-PiwOYgmuQrmwK-N?0p4RpLWJJWrta8A!f$D_gx_Ns?pL=Z%^c5AJI(9NO5+c5ShMd>sjF{PcrE6cjaX^3biN#>nV^Oz{kSH`+R zweXec<)kE$L&bYw9;{sNZh%&ebSZ20IFCwYu$33jppX=M0%Qw^)`@!l9&?~*p~e8c z4M!*%V3Jj^dGsy{7eW#Tvt~lo#txIq-)OXB?K;LS1-FZK&`wo*WxYdz5Uqf!&LRD? zwXm-?u@yAFX#U935MhXlw`rU-8$}{w!M&IyL6yQ()0^oYNa3_@ zX|hcX>juvssSHr}yRL{u5DwURUWV#@76=q>b1Ma5awjv&6p*Q0ex{jAU$@qBZ@9xC zHTHNs-mo#{Ly)4!D%iDpk|3_&T3v>hU`b}`!bkKOv;et~bI~y3Q(3gz@KL}e0QTR` zpqi7I(&x_Jq|xr0OyI|le$tn)vQ+VFYIbXGrd)<_t`x&(><9Ra$($o^E`pDH(IB(f zdBw5%bj8G*hg>8782X8(wz#z)Usb88NOnSO(HhsB#c49c6mMBbZN<)O+LqX!inRvCY>Nni>IiqO|((H zI)tjc-FOAP1Eqp<=GI2ae~RTUO2RPi;XV<~m0VvipFEFhHiQNE{j|QPn*jc^r;r*V zHA0OuI**rpk1VL=p6V>xQ{duozMMcbxk3wBv3k;HS%VB1!6jDpA-NY5SjWS?=B$7S&6IPD3~K@N{T4lcFbVYHe&^RyajCSbprb$tYd;{TL+ESKz76 zBlkt~l^sy9K*V3P;Qol6Qd?lF?h`_welF2V5Iw5qG*LKP*_`E|bnf$BJ z%;P2`+X)=mM|gizy*Ie8@ImuUA?4*>e~jVAJb1vf>XZGubK>PLAm#ShQOY%M;w1_N zvHX+h3l8_!+(Ar5y17J*-GD{sm7gvpeVfMINgCOy?S6a0l8LjdsIbksh1{a4e|lkNSWW2Q234g`(|7OI!ZZWp#a&CfP?ZwWdxt*qDN8Px}5-+wBN03>|+Q zx^2pCyn6MLUm7_CVH=rCHJKS9&M1YXc&Mr5nYn>h=OGZ$YgY@CEwN&JmFJl$Qsl!1 z3h?Umk=7lLXhsu5!rTX$eW9Ra?rb)-&}F|culi^3&A zPd<*#sr2BP2YsCl4`gh zS*pRL9Iioq#V2S6$H$>9N9n`67Y$0QD8Dxfc!REEIF^r!Q|WkzmI;c2_g7LCS@|b?rzuWsb$jsoQ2zJvtcq^6& z&P&4l(Kz0{f1>G|^(1M__0ko3%Q{bpmz-|1x`I58wzPjaeuX=3Os*)Amw(9q5vd7A zh37nhr|?6?dVP#H=$w?|7_X@;wUeN_CCPfk?Of|dOkh4nWFM;GdQeoOr@(|Q(0hF{ zbUUy80o$QPRb!@y?DzTkp4q#&Sx{e#74M?vi&SGLK@K5`CxjI7Z@YZVr-rn1?O`BcjqxJiKeVXowe`U zJy-A5k|vQRD~Q#{Ns--B&LkJ>dOYXa)-sW3#Z=^^T$X%1ZJif)oB(&Bgk~|L%q$TdJDVGrtU{Ne zf}_pi&uIc{{lE5NxF=6r!!Kga*v{&T@s?lp zQRS%n=9Reg6@jGA%r*gtEM3B7s)Q-X$^zi$GM$m>wIiAY{+TexUNJ8s+_syF*@@Sb zu~S|OzqWACDVlxn-0`Wr?z1%ogusu3(X43kI5P|gh@O~Y80)y?WW0}!A5t{&OQFN; z5b{KQao*-;hGk+(7qH`v38qU?x^tvCO^de*q}%3d#GbRphMu#eQY`x-^avgUa(e>_ z5>BANrGB}piwnx@g;}V`z9q2%GbY*g2s;X*ubfPp%G4l!9R~LbXKrW^Jc9qGrLBZ0 zFV8FGmmH3ZiEo1ANey-(H>)YcR)ZhMTyv>)Z#O^I6E`eo6fX4R$?BE!6($#wJ>ytg z4Q@GhOVGN~j&7gqJkQoyE6R7z&w9*)}IrAl9 z3ikzctB*NPdT~2c520U^_3s8)6@d)-C6Dl(ai4{5E7hEHUrZ<@5LE>Eki^4c8{)gg zpiH*J;%z2b<2)m8mZn_j>7J0cMlJoifVKm|qON`ZgFNr2hVAJ^Lk$S$k8 zQ4De}LRtst8dtn%)7bu2Yb7Ag?>fMepiPi@E(@!YK=92iyx@}o9ZLeur=6o9az)9P z2Nvim&-HN)+(}$+9)^I}bd38&;;q$@iZFke{{l8{j#}oME2dbh5LO{rv)EK0=wx5* zlW;Lf3t3*eqDx+G=!8iRL4@HzuUEWQsM*}=J>SsYLf==}GL88dNz?Kcw}|p7A=GRE0tAJisXv$>zeTb|q-RR2u_)*Cz% zs+9r62)=RK7VJi&-rp(N5WwRUFeR}K_xi})eH`Va4Su;0@EDxw#mIQcUv?_}=(oyo z{c`7u13sF&GAHUKz{s|B2 zwhv^VEH@tso@Im1ynE8B^CwCTPYtGxO9}B^_rv;9;|N_E3bO?--x^`l-V6V<+h7Z1 zE#;VHmpQQm4#OZQO?0jY>i!eSC7dr$2*J7E0~)<(8}V`%HflRe{xraM#6--W{vd#T zrI~cV7wL4BxYtow?pAV$FPzE?>Nx6r+p zPmyupV%7M=JHh~Bl%Fli02u9SFEwBDoZYJ<)nftiEbOk)EM@gv@{HH6?`sY49Hu?{ z1FAgov}_LdQ5APX{LFh0;E}6mQNlT6|BAAfr{Q&u+;eS>YX_o9IsN}(LE3wX2Tclo~zzO z(*T`q;4oO_vO=(^4Ks0i2n9}>7n6s?|UBQJ0YUv%m#cCybj zYvd)gg495LXp0{CzK}IkB!a{_el1suFBk-*gfz?Pmh1rgELuf}kHxMX@jWu(de3+s zv%X8W_+|3*_2fspgJTx}u?LS++*Ogue6fl^;ao|ciO@N2FdF1g*CrqaehwWpSqK>E zQAU&H43|iDFPBH?5Pz>MXrcjh)Dg3^t9a3|5BzHsLAVItjoV20Rr{GWP|piBm-Ckl zXUrPO?!eh58?+B(!5iP17Bu~A!Am^zE@a7W@CqT7!XF@+A3_daq*neRJeP#R=cH;# zKV~Qjyw_}Yi*^TEdF!XY5vs_CZ>Kk$8U5pTxSoS5`yEg&iV%gDL9w3$2MLLNDcV|% zKNa`(j#hN%D3Pc$uEgc%Rg^<@3hgsq95R)(%{5W@A!Gkw8=Z-xl}TVY{}BFgRC=zX zGXF+B-r6O)_+kDNs8AbOHh%?JcL;^*xwofny1~;9(MUz^kJ;&Bb$HU}<81y-_*ytO z0bj}kjGfhYfy$62YPK=!Qa1G?qcs5L%XWhTMl5-nt*b5Y)$n|Gkys_TY-%EH=tx1w zor0^l;Z-pI@@%+QRriw(j~b8mxn{DrI&a#_c=ndo(8YWe@B8lkv-N zV+z*@Uz$B29s8;NG@h2c%(1QcP_Al{rSf}d7)A>LDM#$domx~zs%lk z5VA!a9o<~r{t}zyjjbJ2-Hct_{wL`}TX$0fiGQFGyb`6~jv34e1TAY=K~)AfpA9;+ z9xKr(m8UqWo>4+9wVV$1ES16f1NVI+t(SulQ0FJV`@#6W^kd$m)-0IwVHwdgBZJp< zW~#^Z>uuJN5xDy&q4}$`rUat}SvRAxh6L@2+16lpG&tRZu`~dZ8GBM|fAGtPZ!aOeq@=58WPc^e( zeG!DO;0^%fJR-*o9K$?qMB6dN(X_H;pF{SYo}u;xzr66;ON4fl{#H54ZK5V2y=#LKm5D|%3fI|!GqIAKP{!$i838M zW6hK0c2};ENz%N;ghA9rd^!zh-0}CZfKYIiz8bwq9vgfX{swDj=Jbdh`>+(2lOons zY;E0$jM}FYK#7+Gc$&Nc9~p7_X>w|ZojNRs90Fr=UV9<7lc&*+QE_WNfZ4ky#i0yP z+Htx*NVeI=zBnecSF$!AttK~(J+5!TZRR6_?p z-5h^tF(cE+eX901e@C(v97I%0?FHEe=B5|V11wV^@e5%A#RJ`HE$L3|XKXY`Frsie z$}_qjjI1z*8>P<~j`&uk_#?>S7{BFg1J&4m;N0&e)SAdEYOhF9VENO7k4;}SXlO|o zfx%O8vrx9V(A5_E*aKK_!vk9I**o@om%%uU!8i#30jjs`04GfEu&3J9Z=fpf!4;OP zY9kN}%c<;K7@Si4rHU&K*o`i_GZiQde+bOmY6$isDh2CgdwbqdelSSL#$aUd*?a!5 z=itC!f8LtUVzNPLg^yaMpVVpGRH^iQwlOItX!4Qi7d!91Aw`y_%OZ__>NJpV)jC^LUC6zv#~ehf z4xowc+av_`MslbG7bih==IYJj8dK>l%aW1w6h1)c<$gC&Y^zZhv0^Wmh6xdD+LSya zBX2R&vs4mkk;bt@<%-vy`+=^W{aHc${w=geA2V{<9JN3}U<$)f<|Cn9vJd2-t3lD|g~$&)(UA5iwwHYf{}iurO;m>i z`9>Vtcn^2S1cz)g66qZZ#z#e^v2AAY$N6rz$d#e`zH6*&Z#TNQ?(FC2D0`Ea*)x1= zR7aOeZ@qiShqF)U-oTgD)55#Sz8^V-wEKNJWPU+6rjMV_8b3W?U|~>;x2cf3g)f~a z_{(_Yjf25FgT}m^GcK4TsCic9j&{jw!UO_q5BYT>@OHFiQnSVGf_6O)w%!o`c_%Nm z(nhxUm-J7H1q4L(pYIv|i{dHnWp3*J-*3E9G`)@R)Up4_H;y}SEQUBFwo+5mk=rj! zi%)K+l1i)Mj4j(OWEQTB->_+~U4^W#6F|XGQPC9Qk)Vl**R%9IC4c4gfZ$tc{rpG*h22t4W{~)6R?FYhK&GG zu;-xNF&ftf?o>zUh8|&KNF(_jsr;tafMw&b>=N=xfGBHt2i&_+jSNSMNs@ zh&b^g+W26c;ZGKb{kFq6C<*$S?nfAZJ;*W%!9=?YY3@Z87|MHVPI961{D zg({pKs~DLRH+iMX^5F)QhfEmzdLMF!myq*e_N*-^fH}0zh1H+*@Z|?&2(=dl>_;8Q z2zi$R)Jrp|_;%ky)ERPp`S1mRQ&d05dQFvjYbD%;F2vkLC*OrV_;~%9{yaz&5JCuf zkNU|Lm`7c{yMT+2eRGY2e~yp0#?Q0W=4<8URBq{ICMR5e%VJ-*lCY$LimyB=S4_b{ zt+ilZypWpO=wUS;U29~X8(2GI6(=e3eWG+a#xZ*m**$&MIE16s@z+33o@bsGonx;1&KmW&*7GR)!VAX!;T+7{%qy*8d zbj00NELN5;COvhlAOpH!Tm0vA3xK%5y|%vqBzuCBQU&_b5BwCpr3LBS)T>_fr--q8 z?se`Lv;T(psHHpwR?o;Vcc&Wg>OFR7n7JJgvKA%sNLdoAm;2|$NL~T%@yme|x7I&E)S?dg= zs<619u$KD5+<|DWn7s~KW{@sXf(i1)hMEHE>|<$q(aZydV8E|(#j{jQ#Gqd(-E?Ym z3!fq?D|MUks9myIjQpMCXh}=7^duQ{ovY?p7}txXAME#1tl;F%b7dK*V#TH52sjB& zVl-A)ffa@c#;XxcFrL&@o0s9$rr6k}%Xv~|<86C(Og5|0s()I* zpH>+j(5t`yq{v`)Q`hEq1nv@V>NWZoh*qT!F;;YH$&c;SnMswuvIh+E=sS6FB{ia` z`qb8=H+OP`Vupmh%%wXmX1b|zImF9hYiRAxE?8Sm(~aTarQMv3I;!)<>_!aiHrZfm z^V4`7n$wKb%MO=#HAJTEmCzvU$)HnX(R>FAs%USi*6Hi$Xx>xu6&<*@OAqIX>l2K| zTgX?wMmc?|b6j?3%}d9mS+TK}95}{CXQ}hi+FhhXoKqDQ@Zx+kbp09IbOQUM%JEH( z%P#K2mT<+vGTt7O`q+5aOVXb?k_>Ox)&Jy(p8EPui2P~DS9ah%gVt}<7J1roQ;hZb z{^sYb+Z-8P&%ii!S}R9_owo37Id#NDtF4Y!5|Xj443w_=QwEp+f#G&;y7_vZ<<`bi z#T5NYI^4*Rw?H{Xg^v|cBEV7e?$voQ@)k5Ih8#cklp&@*w~)q#y+eYt1&{?3L$Bvb zZx3Tz;q^Te)FOYqpCHX&6ZS%$IDXeo!0|+F%7|VHPr6J%Aaeod%a!CIpX4xMTjLL} z`e;3TsyPAH^F7(~bkSjgr7&Da16(pt2c}-40&|DX^ch)6Bb!Xqr&2>hNhOQ! zhJa<<)iH->%i`A&(65}8yJBkMkPU%0o$Y<46-?=qMC22wbn{YdEPn%m_gJ0lbLF|@ z7j-PIx`(oFtF|%(#4B_%>B*I z!D5Z`;i5PK6B#i=;a+h_?n3x`KCLl(lI&$g*X!5n@mi5W@32>(F;1pUtM;s@X|-Xmx#B*<7y^ifpO6+fb^h$p2TVC!(#qn?aR#+{$_w*>lCB`U6$J+Fz#}h z3%`XcSXmI2a-Xg?I~Zz)yal;uO^l0UaLBtI_*7MbvP3V?*O|EStQD9qcy24|xE(G{ zl|WboMU^ADiK9G{KM9Ve!4kxg`qU5GCAoaWTj3c8TFaJD+0GZ_$>W4CFq3YhW8oLv z#6fdLYN!#w&R)0Ti=@2Sjh*2hta-krF#3%@hSn-ndScWu^Fu@7#lsgKX-%}?N!yMq zsKk{kN4qNk!*c3i3R}lr!x#Zx`PifMEWAd=U96p^Cz6F*e3oVX_y}HR7jMP_BnK5b zM;2b&4$l4n3EJMH;g&?7@M>7#;nv(;>JI!FR}W6+&gQBuYYYTO_)T)J@LtA*cwd)2Y=;@d&-n-J zbx%lNuP7A4SX+#@u1Ha(lH>@_NDBjIND7#0r!e@khO%+^y4t8C=spJMAjeXbi+In( zjNo75uori2qrT@5@JZ!Fw~UavH> z`;A-sw$3?G(uoqXY0xb^8;~6D8#)&m&%rO4X1nY|4?3xL?j0b>F6oS2NCx7M=)NBO zq$(z}2EnTjcJUUwQc8Z@KxE&aoCiGh>-57y#p1@dTqSd1m;B@yW7cqc@E+CT3-Yza zHOXohQa1Dy=Mswfv8iNDoGuzBlilkn-mn!cUCQ-Z>*ySIkINsi`Q1C5i#}lHHLO)P zV&WlhJ@yjXb8VT8LR~@0TJqY&-5CU115x)J6jRq*eS^XO4`c5bU0JuTYp0TmZQHhO z+pO5OlZtKIwry5y+nzziseF0YTKk-Lt-a6J_K(rp{4v{TW477*Gwy!(yI+ry(R9j4 z7HxD5Et40rJah~-rNOG$#WIek@b&LSefIr)rdGt*m&qmn1xP`6Vb2alq zz|J53e;39S zi9#;t=6N%9*3JE5=H|k+MJx292Y%|R%j2Wl;|5lq?;cPHv>X{t)v`y2iVa|D@6w^G zRRBn#f+Feot5b3uj8=ZQM{jnk4PV%|;y*p#dV<<1D3aCx0*HCI*G91KO+jrJ6wH6? zRUL-wlD+fp)Y&FXb*pHDzfl6%g5KO7_(FQtMjW~420T@21jCnUgfv3oDJT-RZ-&BC zJ;&k0SCkEhsunR4_L3dl#p&QZ8vTlmEdv}Nw)?5{bE4u88&Tnnj;eU$HK=nMq5?BBC?7AUH%^O@ZQ>e@aKFT-=h7|=kSQ!eKRQEngaMLNOR9)Xg?F!m~)yQ+F0{Ol|lq4V!OHv zYnvM@3wZ}i2SnF)cGl)nf6`@wP7zaWVnvHr+W4{l z`SFv~CG<|VrT8Ko@vaiUfu^84-T6C6pga(fb&$J&F|f4w05UODZBarh%s+uawvtzB zbHIT&p5?ioOM6Cw2FsRtbmZZ=j>R=MT3AdJk=ZvOilpD9{d;$5VhUpmJuy|J;06n( z2gPw4s>wT#$hu=l<7t>)&ZL1fI_G0?l{pO$NUAGW*K7GDol}%6+Q?))V)>=0p5kc( zyrlZE5SJWge3A)L?+CP?JzI*i*Jybdqm5iJA5Yc=$j@Y##zICfa*#?cL!4;!!@QM~ z5y$vS*_Nog4jvXky$M|X&ANdPa4s+TQQ8j`F@ybQBN^?NY)MRX)sA^oW_^+bHnF3o zsH{r&0YUp~5LHPGN#^7*jB3e!jMucj{V3b)+uNigf5{45Nl~Lg@Tf3E+*T%Ywl`~9 z_C;L|*}KUdKKg=oN1?0cDf{b*gf8d}8c@qNuoX*;ep)Qs5m~I5JuaxA3=fDvDeR-%q zReSW$)QOhILRa&NgVYCeni|IZ$(% z8p9Q135wDz4T&oK*ipvJv?`vV>#bd9YtrK*MVnh^*Ps@>sS!m2JG$lH$z&1RA zz?Dri%7@6@MC7#yvRomt$}}ssn29$M8=4=2s#lVNu`oQYTInw0QqNOu6 zf65@lCOs?&DyjUgDlr^NSv+4^WK|$mH8-TCNL?4sv#Es~u`x`Rgu_lWSEy*jffAh? z>eong&Y~D=rJ2L~3z~Svv_yh^LwJGD;fPh*2peUtEZn6ad_^(NMguu@mrb-P_2~eO zYp-iqM9D7hiV%%i{&CbU>>leuhCMo?89&ahJ zIy`- zL^)_7nrEh~BbfGN|GtxZ0u&aH#;Nm$j!Z!YP84-=5?Vgw#lys`DQDNlnJJ&5F_m_) z?(y8wcoAvDT_&|qifBA=%Hn-&82z#bZXT zXCM%t7%@D(!GvWpyRZ=?e&hbmk~?rPhkfglXKN(Q`nSr5P!}_<!6f14zvPq~#lcFzg$QqexFiCn&|fFNIaDqaTCSkAaW;Dj!P9 zAn#@S?wB}+!!}qH78wB^{X(2$Eprg{UC)|~KpkPpr!uF>D2hSCQ z!Dz&Z>4v#3g_s`~Y}Ac-yBiU~@=NO=TMe0Q#i8{AsyPCwZ!xrNZlbyIh_)5Ey<_h< zIi+IJ_6S8@NQLhR@KXvkBsiZAz=pz_@kbd$IJ$j#yKNJs2|0D7&4HmznjI)`gLCKE zZs$^nTA3FwzRNKYm0EKGZ@nK^PQy9}b)f-TQ+l$5t`vmxY=M6#<^@*jC>Wucj}R8C zz?h4Ja-AmNwkS&DsI|pQ_5I;8#V-DZ-arjtVsDHXubF#sV$l@@9T!n)S5)ko0`557Pb-x3#`=QdW#t! zinEM?tbgn>|f=UlRc+)QR@wlyslenHN$$K51So>aY+RhHXDFiftn|}w` z`n>th0^qxpwGS5#sVjqvn=7kQqHgrhX%<(v+RTwvV#ejGBSrOvH8hXVj({E~ugk{n zu2bHVF(1;F+5Y))n@9S(?D3tco2|!MqZzPQ(YcZp;Qx44TE!ut~EL(srd+4N}efpzefw)Q~=ii5duvX?X7SxP>Iw_E+0xrF0*w z2ozFAJ6mPW3CWos7C3Qyxgs|*huN1+6okRWGN0)%8U{bG$F~Nu>7J(Op5`eZ;w>Oa zW%BshV{Iq*mChXzyDX6|ivM$mY;79RJ@4z7R@2upt^XIC>7UW_|Dv8{t6RBYFQIO& zU};A1NaB3^rWpF2fq;5d3I>uyP6(OXUyzYdZhu5pdt{yiHuFhN;|=E<-^0wOw$HlQ(WrPeRMz(}`ZX}9 ze<;XBY#O>y>EK~7y}5eMvbRI6Am2+4avOU7d~qCQaT@;iRA$sECMOt;lzxN8bev?7 zNH4OicS1H80EIT=;uE|Ct?u5XpncR4Lb-t^v`t9iia(J7I&Q@nfDX~pQX}PigPqCH zh-9%=m+S`9dpLJ7Jq+gJ@U?$1elIgB|HP~eT%@^b(0XVxrGM+m+RJM=f^_ZL(4uW@ z@RataZNh1{l*=~+-Nm|J4HvskQM@)x+rBbJcD3q&ZL_8jo_O1_u0LT5h~7m9^3P7+@h{R4`AsfQ3>fs+ zOX%e!u*nvG$1H4NPKw#9jgoVq_y2HyM?Fbz2bmUD%O_|d>Eqfd-Yb2U89jLx8r>N> z@~7!AqQpy-jb>HRXf#HIboBj&V}VlBV~-OssL!y2fQ!BfyYEPCAL0|Z@Ry+=X);4#>t9SUeUEXRCWVK6?~C6C09LiP&!2gwlW+yHay{|Spe zKJKtegjJslh=Qu2kQ6Vta`PZ&2MAK>2Kr2VhHNo-+~)Tf=7-c*pBMKh@~thsGlkPH zJ9bw4clBu~ZiQMe^wgrBkgX7YA^gbw7i$5d0K{9*Y3t|3y zvONt}3%X7d_~B#6F2z&5Ro4;g2nIT4i15CwtS$zA9FI?U-rUA6wG&oKuj$f35+Pn?jotKgt`tSnq5n%&q|cj$>a|h}zTc7O{kMQTqgeH|Z6F)`W&TbTyyZ z99qm1bK-!S;+KX;NGz(Qut`n_@6HU&f3S$wDb4e*a2L`v z=08!L{)Bc+Xz&v8nK_s&G5DhLD;Fon=c!_w4B3+4iw*J(2uKYC2#Dil7&3{B zosogHh{abV#KO?!{{n83m9(X?zvz6^rdvzSl@84<>)K5oVOAIG``XfiNZ$#Yg3<83 zDP$4|UC_jt2 z8);lW#FyJ`eFCp35z7$|e3gp3*r4w7hg-?HaqIiI-Q|WB5*ij2Dt=fm+45dUFr)#o zWu)=^*9>#7J&A(`oe6?5OUp`4YbCg`} zkFO(mMzvWn$$vEF+m2t5WFf4vwE>CpKp^Pz_TiX*ZK(dP7j$>?i@hAtk`!4F=V$M1 zNJfTIZTxk|!d7*kyLZd4EMU%K{}sp;C^x2AhqFV1f5|$zpdfKLXq`{ z_{myPdtld7Uq-^+n|!q!lCK@)ayOh;eU0|{YA7519jOEO-#xwrBPnc52p}M7cpxCc z|9K?*JB2b>J=_n)4Aa-Nv6Gn_h7%1*gCed3*7}+VDxqnSB+hk%rJn{;SHYoydyQsm z(%Q@vQpKjb;FLy)JIM zG+VOr&J@~whtI`BT;;d@TjD}DIr&Xm!3aqWUd!~D%FOF8cqBF~krZU5Sjp(fqbzRt zDBM+{xprfa{<2gltkxQb?b_MTrs~p$k-mcJlT!!%O>LZn*&z=#j!BKedg99z66{!wWl4tR1lr8pXGZ`bI zUIwdG@Q1Z3^tj~3M&^!e#QTKVn`yJOQQ6-(H_d2MRmG(kPq2~`SrbL~E%i+O+mKiV z1C0q(loG2*v|wgf*L@EvRVbDtSQrz=u=FyT^2OGJ`8Ol$)gpu@9JV7gYqnKO$$8h@ zIV_HbbMd#xkW&-3MkQ9OB{?QM9^9P+01j5{`xpcG(rBd9$#-jCTRHy=Zk~a-$@hUI z!U4NqYie2|?3PEtib}_HTFrMgK`o9vi5~2!Zt0%FKk{7oorc_3R@_M^WQZvPj^KWT zTvVHUq-j>;k#UTBtGPv=9Z`^0MY}E)#!LDCdQcn=!5oxbO(VJt9EVR19c3eR@i((#j15dKbo zP>SUnVn%w|4p(ja=hIES&0B5+6L#hR6qDYPBQhX_G;4t&8WNM6&P4GoC;Vg5|&TfDd8t~z1@+uLtv@-8=s z`mQ&KFT#M|hoAlywHuK=(=H}8lFQN+vO-!#ImoL?RueSlh_;UIQraz5|3gHWwfx6O zF6%p}-Pm*Gmvtu#>oU)P;MslAul^i-1(wgI|EWC4aAy)l$e^31a z=Be{~VfJ*~(}pVRA#A0Bz2hUr8O;GLtla?>YApzZL3txqC5>GN9(N0U>GZvJaz}-E z1dJiqe2Dh`93-T6p$nB!x7DIz>$VyZ07_N+g{$_tsw`&jn)Ud>I|bdvNVUIm?PP7X z;$_r}bYRKmnsPcb)y|`M3>5uZ+QfR4x;iukHc6@|$lt2IMTJt$Qb+n>T?;#WxmGiI zR_e8DT&6&iQVWT#%3e`{rOx#Ed3WyIGGw8Y%qJ&f zp&G9kl>VQSlN=ZX~LXJOj6EVjR35ni%I>%$s9R2d+I^+u=ZL`s`qwc>A5R zq1v3i)s{Wr2Dd(Y95j54di>|Vzg@3I`dE*0IJK|L`1(8{6RL#G2r6+Y+g_M7hKE=x(Yzw(sdZh!KCzV25L1aU74< zp!8#$7_O|_18@!}%)5X{326zP;Vg%}h~2(rdpp_{uauoAQlBUDNVS0@Z_--JIkm3t zENb^v05=70@pemVbkFO2We^=VPtvXEE0W-6gCsAXbXfMf(+W(pjQB~xIdb$|$vz?} zb*GXm=Yv=^ElmDTVxsK(ju~Xbq zZsl+wbb707e&vhU1CRyX^qxh=>Rjvzo1ev^%DaE?%Xw65MXRGlYJ(v~q99mz!`$)# zb@M=hePk=q-C&S0Y?C)lP>S{>r8jpNKCe_)_ zG&YCOZjT+mGZ?fT^W7sq5&0<|7Owr7VC@+~`GvxOL(-H-)Rsq>C6^S4Ug3bpq*lo_ zxM79DE3lyzG6aZLJhl>mVQL@u9+fcjG#@KNe^Z(({M|jP6P`H&;V2Zq_e=Gg8s>4O zNm^}+{^K4kpKweZ9IiVgzHyar&Xw#W(RfeBckkUK4H}8Ox|MW^PxrP=l^*iVL06*9 z3D;TtYh+!5P5KUfcL8U|=M>W;6Ki=Eg-XI4z|#=&PYHq?2(f_MAe{IE$YS;!bGXNP zLYw^)K+MUn@*4oo^z3c7j36*A&$cI?3p9Lt^62FOp-4nY#Lr|noZWLA<$ifymxb+N zYXjip?nufSyAWdj>Zo0cPv9n2kutHgZ9cS|s#HCEv@Q-AAzG=(*x4JP4Aj?k!M>%> z|Iif&!LvW`zVrmn*Yy`T{+~#CTDO0)5^4WIinsqF-O${huBKUoz_-82^7E`i-nD{*Af+*Vp659#VL| zuvN-m*eb^V{&hjazk=CD&cb#!HeWP884FvJFZ87A7mxnGBHGC+x?k{l6kZVMNa~g_ zo9dle_@hGS4Zd_C35Yp!p$f$Lp-~ge6&w9j7~w*{ft><+mboGP-B_k=%{YaWrU!$Q zZBDP7cBkX*Eq*`0KVbG@#2}EDr>m?8{W0HgXOf?UJUDSZa6xfJL)?dd>u8#U9p9D0 zXl>othb)C$+$I{-enlWH-5@2|y*JKtv<6h)Aj`&QuKn{D0l`LG1Lw}|7H+zY%Xkt7 zYYo>=o+&Ge#x6VDCqj;jrmJm}znedEZ%)ZXlGQ48NZGdVh+#(CN77wv({(4DCR~6`X~v?TXc>0{46O9}Ci{258Bw}Vlaev3 zD1$FJf3{Fq7&GYk)O-Bs=wY9&AGNPMClE=EsucK%Y&>q{~XO2;`e&8i&L_9vo%_dm2K>Vi#G+6{$$@#H7el z5c8#jyj-RbY(C=qA(x=AtJBJi|LeSA|0F|~4oB0AM*=}3v#_Y!A2JmxoaV&`E6rDG z5&@yp9YjLuseD$+PAp9^HnldOH$gcRH}hz4eJtuGve9oEq7j!{(h?aoh11oFIR$TG zYQ&u{(DAY8VL2#L#OA?D4neEi5VtoAP}IhP9*|WFzQkoJ7$04(k38gBMr#2q z`P-h3$3GNFS*OFE@17subo=7N9e4~O6hc@e=+xS_W!I)Ut!_+qLrVABYKq(fcf*DF zCgE!pD1@ngao)GJltgG6R9v52Rz-svDYUeI;*pFf5ay=UIF;-igG+c8FC?iOeo(wu zKwR`GA$iUT;%#;cx&s{L4Tj;B`x^ZY`n z!pX_P)=b|1ul2B?quJLn31^dk^9XvF(383ejKci=$pYvZ zbn*KqQ z%L_t9Wjs_JQVdIEAziAZLP|?96Q!IIVZft40v9A$V|P0Y35n7e{a?c@r4 z6oA;$V{ShtW0hLs-Fg*P;tsp>>%f zDlSh&s(N78>N0P=;wP@yaFqIvN}r*l5{X?SYdg_S8^X|9$<#|skC~8SE@A%bSs>JG=9Hcd?s`V&5NT77bRx3CR2@8#}P#1=cHNDprLK-D5SoQMfG0dPM z6^(iFaa$ln=E;>o2G5AYx6mlWsZF?o9iXe6YGB&HOCNRKY*gYzp?{O#0M8+5R@lQS7yn&8 zK|^fCA_{c27^vb9+C`*?)g9_k$t+5I64EKza1Fl2x*#QREsb_`w@nnz(F+5LK{jR8V|34V$95+ zR{7-XOK8K(%FqRGVf<8JSpy>fO~Q$~ojQ=Zj}~J+cGcC*x(U65VrS4qJyFdWW^q;! zOc8SqQgg%?WNL%&cj#&ZqVvoTB2gyu;GaWZ`O6ft zHT#+$_6A?@OS+wMtroJf_a$) z#ju>K&oi3y42-b~^q`}@4hBZxd#bc2^S5f5S;p0MGH15K?p^iC^8tENMD z$QnRot7S5SR(1dny0j*v8!gAqqkTJB3dWOmQ*oi)`$!@SY5`4d(3)6!EB-~7>mXz) zBEknfFHw&W@m+WY8e(+&W4lVns!5%KvSIH4nG z^AiX&Dh2P2IOeJ(rrs^C9EjpB{Xwe4U>6fMgo*jws-3D0@XecoQBoR}Hb8UpFlX~^3;FKP?JL+W z%oGyTDwDy6=$2?;ALmIxDR01QzMnjPIl3aE=ZA^|qHAo(_h4yG)9F)X6aHet6>Z}uhJ@LGpxvQVss|y_QN;UzFt1dmm~ss4v0$jiwD5;>PJMXF)B@?< z5gJKz^YUIDgr-#Yw-OjKDZccVWqZav%>v2a#i-wldnQ%-YT9o%UME(|za=RK83_gF z-N&jUUiwb;PKf+6YH1UJ_V|D{JrbDwj;ovf+c{^UbKzP>Q19|1B8Ie*&E*JA?RPn2 z<@{?#F$aZ_E;CFeliAiOrbl<@)$}b&du|=?R+F6pcw+c?7JL!-DGy-`{-c zzbX(vy7}iQI1o_i7xwFaRe_{!zq(KTvkd)Hf&A?yyrp5~j&g+R+iRStNd^)U4D?g2 zG$YQ~3I1E;Y!hKYQHTJxOjOglftw5%JM%{R+V{(0DebE*y;(LjuX>1e&!19ALS2h` zbp^kd3*|i%)7QhFIey;+xVMw*LEUQd zNC^v(jgVw82{oc5@9sSGto3m8bV}qUG2o4a1`shIR-6{m4B$D57%jo(wQ!cgC2rGPm|{ zPv4k^wvja45-nuYdQ`uxV!ciOfvQ98HKxw1ujG?$2XN>4{oqpFrV6ALrboQD190W) zQ^wWfg}9Cq?W|g_HEyMtvs>)(q_&>cj(w#Y=DrM>^P^OHY6CE-SajcdRoA79i?$Q( zbQRPD?$VWyASRV0ebbqZUc-?n-xva9EVRJx&L{ktW>&|R^j-q7O;^+XeE$TR9+$`3 zFCTqKLkfKmwO=u3>=;?c7kB1b9Oh7udFuVJZSnc!-+3pdT4PgkH^^Tqqs ztkvytT`5+>V<}ICS_1@OAX(^amAMjK@x#vqpIg6=PC;_1f2dV2FLAk8ZqDN_HR&uZ zT`#ImsVrdb2z@y49X#Q3RgI1{?CeUi-B5zcA7K8>-YThxCEY5-WOEU6S}d}O#&+PX z*)~|Sv_@Q_MUtcD2;8A+17)XnM-zscHk24h>T4;W+p*$+GfB?nbUw=SQ$ZbSoLV4h z-gzYmp-SuLglvSGHj?Xiau*x8htlhdgz_EjKV8q1Y6Dxc6zeFIJ8kJPexcucLi&@p z8+#eZzb6!P^KqvLVCwvsaTo0u?V_slB^<6viVwSB`@ITM*io^|`W~FR0?Jmjgc*ai zlGuVroIA8+O5_PrE8(u(uTArA^R7Cu^L^1UxndV-8?o&XZ^?xnVd%Y!wlyJrPdw;c^nekSpC zS!rdeUg{=h$gCDmk3V;Hh+Z}Xuh>?25No_g>}h=pj2S!niwW{zZ)smYDF^ZAtzHEP zb(4mSTUN&7G@Iobuk>;an<6iNd9xfL2xW!rNLkn;W{hy|zXwXRBK9!yr2lTVe zE*3DR7(+IUsHXVWkoSC7BeJqHzGT$RI>ac12lFEavuLz45}j+W3tl%=NY1S>p5M>=4Pm39j?<+m0gcMFbQB%E3>?{R40F)_Xn{*Lg2Do&nNz zoec@0sIiSfX6RfmBv*JMlm`AK<_9QJ1%_b7bDTjTW(sV6JI3N)leZ94SiL(I) zw|CM%K+u#wV6&8zcE?gpEHm|K)F5XFPj=GapPb&Z=TiSo)zhP2aj!7!l*2WQj#Bo8 z^#GIN;wjEEf0oLb9HTVra;J>s&)VxHwJCD<$B~pnGr1g-Tr|-<^{Vd3TTui2!C`yV zV*mYOjbAY5f`$L+KNBohWan$b1+0!5(?_#~?3HPHi>Rh8+P4&7T5I)+omr~rbpGM@ zVrWU97nqmew8|68B{ljgG00LtV}lhPPlj(Q6i_1AMf<161>FHiJtma_x z?UO_y2Y$c>1uP6&gIKSms#~Jo54AONg@I6S)ZrG4Y&g?hqboRZ-$n;16_Dc&{)u>_ zMDypGvnz7bFU!$2t)T$rNgvsESTNxO4|I=NFXS_jYIrpMKCsVu4&zyK6HF1ZLYx+& zUbcY*&akPzyq!x$mkq?hR4@(yw(0uzj7hV67h$Otkf)(w0JSd|OgS3}rEDLnZU7Ul zzjy&2Qo6^$cTTFw*|LXG6C4%0@PthG2m2Dk#0S#0l%8r(Lw=|B=cfgC$f(fW-=Uy? zDFhrVwEC$p&9?EiN@xGyuTlPUb&{-VBfp@4;%mDyr^tn2rwjlUfx)&j@h5;m%rZnn zXGkZ!HNu>tIn$bV9m?H<-;4awCt>(}8B3J2!RAyawI}Q~!+XLx)Be=exIl_RVk7A>JKJES?Ab7pIKKFR z)f?lV!}y>M&bwtsgKWK2;ieT~maVc*ZLZ)1-Ut_;`mpMROm5ekt*VXN;#kETufYW> zwa{!)re|E72WeES%IQ{fujiLnvMwkB*;~gg+w{YlEWP7`zQ%P1698yN zi0@4Hn|#{)7!Yq}1L)^r$LrlkWMlb4 zebGH#DrQG$K_OM(o}KG8sZl(Z$Zmj*PiwGTr0+9$3X?x^o6j&yUTa~nZ#CCREZZ&F zvom^(04-y#LAfW3P)w)l05EN&7EHC9RV2ZbjZA86o85P1q-`pSJzSTgDIrGd;Sd^& z8oib;LO1LT#~im&>@WdJ)GqI!yUsF)ZBoAdO?#VbeV!wXuwro`TC5#3m9Fkn00B$c zN4vK+wu;MkLhB}}z5#}9tX+n4i9elSprFN!YQg0ktoo#Q^l0#u5p@7ZGsO*NBQ zgbv?sp}EEH$UEo=uclqgmWQE>o_oA(MR)?e*CUoAzoRo!%w~V@kL|!=2vuxbiK-p%8^g9rlj5uQ#5udVH>@4nJ;MZ-5RRv;|=fptu<31S_)`5(f^4`;!7JCPf@r zBdlN?*A8;~@x&OtVow@e~aCp^;)42K<}v-a)^icg?Y(zRWsNNv&8 zWwdMe#m;x{VF<6WV8)Zp-a%(HH`yGma;(MyzPkARX4y62 zi0ubThmLD#i5<%%-o0_rZwKoU_@&bCbXc6&$M0=lk)hxf9~Jp0G7aO#-!$HF2o=&M zb#YzP9ADA#ju4U&zjc2=cRf@e6~i|v4-`#0zYYnTy^_BQultIt8Lu@+mn4Qy z=Pc!H*}3)d-r@UwzGC~Q-rC@BGmsi_#jwe^=yPwM_Q9A2Ka{vnlG=mZLv9Yy-nvVV zY(Q>?P#Fn|@x@G^mj}eL5Oxz66}Z!kkQ|v_dBUF$&ETh0ni%E`nAsJU5o~CG~ z%(D85cUK-$#n>K}u$XBGjV9@_sFoU9Aw4el;+EUOF3}v9;Apc)4w8EaDP9?xNHS-i zfs^8`Bh+EBE;^=@Wn#GyV>&P?&i?YycI%gr2-#BBoRw-xQ4b!kvdmnR3cE1vX%NU> zm0*YHFxO6=uezp@;@E^(Z-{I!s78aKO=W-BENgBm$_RGYS|r;VvqhRi+*-^|L{d5f zieeORTmluw#!HJwz-)%fpum)uQ%ON%@zUx-?yK&yoGfdhd(2_7^ss0?`|$myqfnzf z+JMQrPjh}bkb`biRhu6xEhO(_-_i#%OB0KRJ6W@)wn(VAm^H2nY$E|5MA1~MxI$!Y zs7Rap*hXwXflD;qr*-bg<180vB`f~6V8x^i%#rR$e$S6ha$U0IeNm3x-0V24Z>lY1 zH>2WQmSa?=f%bG8Pv}`e0cMV$KQVPz2r~RR>4k1C0snti)!)2f)IAF@& z3K*hX{82Wws?auQmC<0_@slP%UVPzmFjabpveNLR`Mx91OMdJ;4p6a6U_IZ2wpXB~ zXN&^MT`w)B`7^K^>M=}Q%$y49dOs)X4GK?RrvL3(K*-HV-q^crm)Ls}ZdoVx!lZ?J zsbB-@(V#a#9#9?tBJ>KA8+nEP!1%*TXh$EPzF8Y;9z%cc#L5lV<%gk4zxuOQKRc1@ zP9&9TsJG)@Op2S1(qz@X>yJqdE-(D_oKDXeUZ@|SNQND57WK0(-S9f5<8>*ySa)7R zoik;K3%ci_#Zcj)D=Uir7)t?pMqJj^5V)$+q*F!x`U@5oytazM%#i{8RsCr}S7&pd z4KbW*s-#3{P&kBePI1+RDFz6Mc}36@%PCczSg!Z?oq;>A6bS()`h{&)g*~zeQ#()h zxmor{AltucoMfTsUR^bPM@W%8;_e77eZ{$nbm&cTgnsb|Z)_?z@e7jNGcWTBHkHIT zQin;lIogBbBH6negJ8sC- z2nj#pDQ48_5{ZPN4T;~qN&nzUKh9LQPkRo75@-0{HZO-mdS{e`TBADUz+bCQnVpwv zsm6I7G{yDps@^KjDUu@TZ8J}m{Gtm;m7I97J0vkD(Mkstf-?~{+5Pea)olrcC(A+i zx5|`vRl`a;mRkPVQ+F3qg3t6>}_oKP9* z*n1ow)7WyzhS*}-oUPq#RuW<-${`7$7@g7x6)f|hM-pUD`094|)PBCkSJ?53JDzLM zyNY7*SPW*W9ga5%^LYEAT=j`ex)=4gk*HQ+k3z^^!MgY1jt7DRDj02HG1P@J^>pZf z&h4RU@}#!}w&Ia8Nfe-N5GZ8p-1us+V=IWcic#fHsBE;>t$^Ebag#J<&jHRVq*K~g zE8O5c^H)^{6g}OJE1n2C*cTV9RE%GV;szA5MD3)W19X?E!A538>bxDGLB@=xkAD3x zl0O62l8k*mf5M}jh<$&4hG=VIqbX_&lc%IJ;2bWPLZ@*uq45KfB zTS_{AHn_MLG$X}_Ir3)_3nUqT3j6czG`3wAKpmlnn;A=bxs8#Y`72=Y#C_sz);|B$ z(Rq{~o}P3zCe_%R^QSF_gSTkckC+40TVGZ4E;2b^ z*6`ZB1`S_bAaCK33x}?F0r;Nup-gw_Q*UXW9$GxR@#mPJE7P@Q*+NHSkL4EU!m;e~ z$nyj)jppC;yG>en@v}^o=&(yQS{Xr!(LcnuOe9$&0_pn3k}OccBU7{}ECTOIeE<$i z73RT^P7aE!P|6+o*^V?ZQHY$XElm-otJiA9bI(<#%18Yp*+7ACamBP5(pvrCQWomg z(zvY=OQQQuh0SngQne7L-PkQ`{V~z!A-1uSr<2Q+S#_+^yg%l}UZ*9(WYR!o-Dd!% z6_F>b7m&BILY}{})TPZ-q|vSH8i$Xv$by6tWg!WDYJ(oRZg7lREN(NET%VmmlH<0h zwxR|frZ3mr$t1W9=}(h^w#dBCf0;%C`AXa0vK4TwjMbMSV9hk~R|^ z*>BOLetxw6p@5Vmt-7#05Dq27eQL>NUsRC_l_61G zr5)q}N-i*rnb{f*2 zP@^jUVZ64|)Gi6Mu_)9p$Wxe7u}=2Ts8c9?{e*VD0^!Fc@N|9j=@(SlCfsaVTWYcV zJ#S%Us7kZ>xY?+~91uhH{4rnw8hXnHsY`y=rlq+XT%Zs1mdR%ipzgARr{D+zLAuub z7RNNsX_M*_m5d)lj|;kEPrqvki$|o4l*^ z&j6et!Mhzevd+p6nWNF;J6GJb!@I%yluzgz;!r1dlLAoR1Jq~8lmp#F`3iSapHV}_ zY6B?0x_kn?e6XsSyo>ddGnVeQKI4jeY(?ppqAV#*RTiorv&M#I*T|=D=SbO&FkHz9 zcJ`e@zln~}jkSGYdDKw5LQ7HJ@hYbd*%-+Qvrt{)ZF3Z}20PrE>s7EaO0IuNv)?#s zIKEECX@h51<1%K69x%9tlZXUlU(DpRfC*pEMA^V%!&<44MsqB@*|%VJd63Tru7WOT zsf074%(lq;GK{@W6{JjLC~Dw)M+aKpSCaDCVYO65p1OS>B7m@l&nSZFqBvbecc!42 zR5@5Z@Q|a~bI)hcqf)e&#)k)}Tax>Uh{vJf!b1k?1Oo_b)=vMt60C%>RsHpWkmQ9g zityK&*($x5Bm|q#n;k=_$8~N%fTzVh^7?C8v0lxGAQE4mpm`y|&q)y{t`H&acWtS2 z4s4k#$1P1c4#l752GiSjtu`Lac$e?f2ls?;^m?c`Sg*V9@sAR@(2{qPt05n2Zu_rW_c+UF*%U6{_q(^z>trx0E zqewNW@KAm^2F#wzSGOk@>k1{;cTH&AnO7!XVac=|wZEX{_yu)^=rSe#Wz~B~M9~<7OU>2j4koGlS6aYms{&vmeF6+X z%R($IpeL4V2BPs=E6K(lEQ}Q=R)bLL(rMHM6S0|e#5azP+>_$Axlnz(sOor<-Sc5L zB}VsfAFp0|SvcNZ#+4QmG%-~KY6dS-$=7RM1a*Uc-F4lwWaQ~0x}{xqiLCE9PrIkT zIXT{-^q8Z{2X$*#mKJIo5{i6BEJOxjcjoo$qApB;)!ZGhsDlA4>bQP4biK5-GBwb% z2i&XyzL6#dc0Wz=PaG!GW2NLe`B4Ktf`JOV^S$iKIqCq#Mse6Akq@WIA;r8F;!a?+ z2!aKHdX!WlfBxm!1LY=a5#yZjChf_78t3YTW4_fXeL2uor3ODbj*IzD*D-6v-S1N|dROD{V_hp*K3 z=J85}_mcNUqxQ&VrEiwV;!$S6BazP{10r#$gI~& z1%-iERyr4I|Jm?Rn_B9+VHyv5wKgA4RcYlDwsI?8_`4+&27E@Zelxhv4_@#Q)*OE6 zP7vyqs~n09MkjpOST8Sh@<&sXE#kvRk9qtuhJ~QP6sl3|@L=-M3!c3TLve>1V$_UU zzfeE00jKj2ntZ({37nE4G8D3B3Y?NGLId^w)`_C<@`(!)letQrB*1tH3NXQl{@$iP zHR1P#x{!{Y0U!#Pfu)^^y@{j2pM8Kry1{R0C}7X(xZ`1Qw6^=5CM90G_T^Y9 zkghsFbn+r)Ox#mqBJfgYt_x_~RBhf&oGE3E8qj}=XSQsPV_pyGxCH0{Z;F>&z^o?5 ze`-2()iXN^$)+pyDW&a{^=F<^;)DE{sBHpg5cdJopS!77yU~q$G{6AH$b2MbWLrE> zi1S1(OS2&RUJaNw5}~j<8#@A1br<^n{-F>TbYwf&a5oeFIf|IkU9L`tF28tv-L0s? z$D9j#{y=-V2s|X|TIAApEeCAM#XFMMW{vkGIfEBVh3wH*@%WZHg-dO+Ofer=Q6P+y zI6$eAnU$+RgUx`fK-m8ibDs5qdsBCYD+z>6~gG;TW7f9A-cj}d}*WN z-xR;49DWAV35vvvvr43L3A&f>DMJ_FK8 z$w2b&bEc>-<%@IPc&HSXDvL-2%a@d%>RJ?gEc2S59$&6#EV@~_ExMX%?6+SfCl5=* zlV5Fa9`U%9x6Ujao}Jb@t$ev@L=k2QliQhqzw^5NBEm~Buv?D(l`io?mf&zJTY>BN z%|u~{+9qzgy@?hV*3ry-mv-_D%auu5Y9H6`zG6q9?ClG|%@{7Uv-dAXcYR+x-(uck zR^KE}hyR305H)S`B5HE3e3BIZbd!1e8uV5gHB^F2t1He!la|D2z$i3a`tpp$cwo}Q zy{?zp9-1L+3pql{p-A`2Cb?$&GgN;l^sOSaAN4x70&lgjT&<-eerA{5mO|E|b23RO{p=0t5@r;5mxV)2q%5;(FNu6aJ)=w+v))Xo^)Pgw z@7bCxO=>XJs&;ytCHG{5RM%oxjFyg@Z7o)W+IVjRRy_;6z(!9&^5Gk5YfN}%v}p)E z#^5?5vv(Gz&~Akm5gPJtEcrJ6CN1I&;TbzX^J$)c8YxThPZ0)#bVoqia#PBmS= zcwVv18-o9Sd&ov^$G?1>YZAfmg?>&Pdo@LbBXnl9-;)EqY** zN-AmRtvRlF&xE;rsFzd`8C~ga+qQYZxZ*6K$WdP|{5m+S9ByZ+}CSkDcl;c39yD&fjRtr|f%!?NZ}hAhxdO+w0;G6HsN=I*w4WLacrw7}SY zs@+WErQ@M`A2^dq!UBU{yB53|&10;Flf5W#%de|OL9#SLLtYKmC%o7bujvUTkL$-r zs|B(u9Yh<5`NC4G46c_`Xx2OpH#cVz*hDy`7qBUR+qz^K#uVd{f}NlgQ`P{Q^)9fV zKTQblfTLgE#?uy)g@idi&^80H#Ajw&=fp52#X_L(Q+h&e_GC1j{X*a*<7R{F$yi_9 zCf9YHI3iNrdr}JzEmG8~l(&89f(y?|UT~0i5A2KAnI5t+AT24xRmRg)8FZjA(kS&i z*E`nMh0689A=gNc1UD#C5iotceij%usIMoL?nD~bwKP>Qx~E8eU}#s37ABL*ZAU(N z5t}WLg$l+$dXfx6vpY0s7g%lkay(YQl3#U;%yalv5iKTfmq1T|71G|ZprBQ_y-2Ej z7gS^vR(H-TOiX)>Ws5O^rpYY&F$?fz0Vk#ixzF0uXs1V^UHJ*~I$>iRmSYGFLs?xd zC4A#?i>?g4idC~YW`&d+KKB-k$$+K=xeJEIaT z6-(;@x*Gc?=KJ?^&bJ#Q+u*C65U_1;+uwY$_#)zGwaX1;OeUq52Nl}$)&P8U03u-T zx!>uI5Re5c{UnoAP`8OoNM-2ATLbYS77iKZ)S-9d;!|r~ITv#u)No*H#R1Yt4hUWY zYi_r^ey12hFFKqszYy~2f9i7YU!$Mo0q5(CGIj4>D~GH%hkzes^CQ?SCkG)$X(#h+ zOJ85Bl^^o;OE!e7_Qq+D4RL5E&+LQq^li^rG6J6JS}aXav>wGFKR=R6`ylsO0ZXGW zLUhEElZnL>+Xsn~Z7=bH#xE-LS?0PC9B;3j$&%ifT;uH8rrMA~LGT9;WSf)y%Ki25 zj%vn*wcQ(Vzx!Jk$mFt?3t(U>WldTbSY9F%j$W(?R!{l8b{}H0Qc;kFx@02MW-UC9 z5`_Q`Q+l_<9_IW$LsSU89z#gTu?ejuUt&V@TE$Rw`jF&ylTY=eIHm`~)*Q(6Y#QpJ zBqnAuC2$mCDHbWJOX0m?PGFnIJ7el~P!%`R5D-HcsVb7?l6srwHw<*9&j@=_(v){nU>kAI#=ee;t zXe;3WueRbSw1(294oSj!#v!#R1csAo!jIy`8u#z|feBS{EK7A-Z!F)Y`PV9DnAMX|Y*OvXrp3+DG1gI;U7VE5% zk6iDS)c9P-=)C-zc8s#o2YJe|P>y1ujW^etD(tP3`G`T9I{4APtg)2kUfAcodt?bH z-eZ}$?Tt!4?xOS$Y?Fldz{tqUMT4IKzEoteF@UHsG^anNe$C;G+OTBVi(Rs8bD8DW zG>)gtCz=?~g|>Q&XLzmL*ebR;u&6H|BBa(VutMQzpPa3VE-;}*sLI%H`q(1Fk~Tha zys@;TIy<9EoD(Lg%#pA`Lb^9uSMfmy=5hFV@hsg?UoZ(%t#x)7x7Ut;raA~6wqCV) zTdO02t`w1=+gPMvGPe6>KyH6uWSz1jG)_;1*j#m}ePV;qa(qC{IC$ zEC`I!M5A>ENzy`2OxftAK#WEbJly9kA{%zSyiDZ%|xn|aQn^kSB$ z-4`O$?RbwiF)CmEis<6qc;z2B8fiAJ0h$a8k*A5D%orQTyNuQNTv8%q>l16VKl7Ag zE`^mxCKyviqZUJ;l(5B#jmy#==4n<;rn*v{Vm6MkrVK8(vTR_U z0c{G3ldA`w0#_8jgR;*+X6QAHMI>x(-XjX06GNCxWHd5MfA`*YXfSHBA0PWtF|<@= zzn(fm$ud;wIgenJ?gQjq)p7aSW7h>{qkrKc;l)P~94EeQ_Dcl;h572OgLi`Y+Fb7v zMQ5)S@aQVL3zG zzMjk_SL142hg=O?-@xZOM2r9gB?8%?;$f-nJ-ogeV?jK6_Q77{<^J^+{YiFpaVwhv z5~U$z>CWtzo9#BiQo0X0Fct3=>A0lEn|PpJRb0BYP&EyR6&^95`84591yPk}0)JBM z2~!2m!7evnJUxClh$}pdxxOtUuDCGX47I|Vk~4)Ie@}f^2pw*SK6;QnFZiN4Xf(#r zG~(mwVK!&b`>|6gON^qiXIL4FYlWk9gJ^L|e8T6IG+$ypM&6Gzs~tckxQ1>o1p@q_ zwx))}jH&DgBvjZLz5MeL@)8mE2Mx}#Bi&zA=LGFQkY;F7XGFdNT8&_dWE)rPcBa#k z#TZ9dmr{ui@me&YaZq5^lA*IlQ4_CJ7FNUIkvhIW2HS70iSPt3x~3E+cmoSA(iGz*$9_(*ulzu>+)FTd%o+QDe9t3ZVX5DxvTt^?A`!Q5;|km=7H!UyFTmWD z5%8QX9o$4=@9=_jA6ICUF95A^%(OV=QozzOM@6!Hax!Z&%dd4NDE;fR8CT?Xvs+GA za2|xW=iC+Dj1rf)PD}{nZlHJTGacTjU-!>BEn*%|buQlOF;!1)%rvuZ3NLSl})wQ8lUE1x?C5Zh>mI~IK-56LY zP!iq6aMl@QV5w-}gCoYy*xgtB?o)bTkDB1Z>`rhL zY>k+X*dAX7AAEJ&t*Lth5Jpb08FIp8gt}zV=3!wCIQkMFf|;(5IBV?VPAFekp={o` ziHMPU0n`aPJ|o|u8!svHPp)TDRCKXsIVWp>nA7DiyBW^oAg#1RX)UUl4C?oSTlpyA zGKlXYgmor!S7(7VOZ^EX<+H}unwr9v#8EK!8DQl^)@NXcuKO*4p{Q+F~%$;;(s5 z`0CixJO9Q*7IRYU@{OZEIfAqt<_nJl`S$XPb&gVB)b|zYb8V6?q1QSS(6etkjz3-= zdf10Z?HLghZeb(6|570i*m$Zbf~N)vM;%f8#0aJC73kQargLK}l^nQB9QTKDZRZ1W|Mi3d z1tMoMU@3lb45%Y9=tRNhdGWPrNEj3o9MO~$!4%1aWrR{$!ixv6XIFOqt3>|1 zf@AK|6lw+aKq0H^?yjl3V@|i4clfj8*NqV?>slAjS0(wjRQCG5aDDZc^OZtgfzQ$9 zpn4-R3zS5rZ%1^`=nB)qD&C&nCS*nOVzs~osF{NCp4h$TzoYcTgN=rpUVN}}rWG00hXCD+5oDl0OEGu|LXpr=v@CKG zf-qjjALHg2Ax2b8As=>gUszjMK^Fs*(YradA|;^65xcb*d%jq`8}&+@c5+;3y$dQu zoNdID9q7K-Q+ z4F8TmC%ETPs@+NTXz=+&I>zG%dE3!Xq>lt&$8{JHgqV&l3#LlntB)W?@cB7jyhK$! z;T5!;WmZ(i>JeOm9*!%b)leRyi;=S&!L7l*0Pw^U zazk6-F~0WgGaAz_{nFrf)#%WKe(Zpm>F>z5@G++q|6IhFFX#%qhP}yd4`|_|-vfCK zyPqZA*ae=|3Ez{`&94!7C*A=Jt5krEaOQtusv;FI1n3F;Q+D>k3cP&BsZ?Y;IvSGc_WYM?Pih~7d!w`Dk z(8(~BuqbcBl!eXa7VXw8`8+3#?s_%q^T*qjrqi#5FHuRux$AwP3M^nLi&^*z#AkW-k)#1z=M9+I zr=qN8v8L`KqN@d_wt-OkYBUK&Gel+4}{SaOo`ys~^ajoY92a*B-`9>oIs zd>UXg;a~Onzq2u|Pz3j4qmVp9fdzkr zJ626FcS>FE*?V^b`tVkmaJ(DhQ+BvhK8@fa=#Aa(3b)+}&+h2(DIcHbv-cbGgk@Rr z&*?Q>iQ%Nlmqd81!e&RZ33l9sM5@PB{b}KOZd3Z?w^E zQYJ$>9eWF`zJ%j8pmg7E>MZAc0SS7nZkDlHlfrAo(OJY@r*y7PcfzJ0#=eB$|C%F$ z;#qP&6=vdGg9~fcJ zT(v+2vYTr7KdGO^9^6CASh?PNYPHmCkM+4x4@(6{>R@u&V#e&mMAE|QY8M(i1L85! zz@jYYWu7j|3f*vJyiw|dlV+?4jXX@6_!OUQOLYL-3-Eg7cFVzM8cyS5b{!Jow0xI} zw+}CP67+$ad&vOv(5^A>`eM+fnQjSu{Madr0?j19aOdM@;ES&fuwQ2|W#W4!v}I+J zXL1K4#!_+ej8k(sO4ZIWZK~aa{W+Z=9ka6ZpcAsLIsHK=8T;Q;4!ueHdo(CJi!Gs7)vP6m3ZExif8z$tiCCNKr}8==qza(qtMN~jO;u+mJ)JHFYhk{O1H+Q}-2Q=&KAvM$M0yhE&>2Z*|ooFb36MysbA^ zpqfj~msgU}P$)Hc_e%bPn7!G24}w&21hh+4f=8Ka>HR`VHgk9oNwUW_e@G%)E9%FE z{QN|5ht51#v0Aj!5_GJ5*Ag`_1v52VTFkpL<)UOzPE=l~I*^5YU3LF3l=X5hy}97shto_CbX#WWtqj_~CP~y$47UICy@F7DmYgX>og_js$642WRVz zGo>l^UG`E54ef7T1uTeB&)^K$i{IM!I9AfL%+r$R_EiSqpNy|l08D`|4NRj!1MnXb-+h1EpCnjnQl(N+f;K9qORVX>LQM%#Fw z>QCA9r=DVs+V{|q__}cU6i{oRUg0nt&zy`&Cg-UG3>#M=hDn}Uwb`~fo_nLRxtV~| zq?>)yDk};ldaAK>dam*cJ(~46jqECZzw8k5FwtF z0AY=6s8}{=bTVYs7E!)!ErY|GW?f5oH9+<-GYxP->_XVnnNF9uR+wu$$jQf;zUzH1 zRDpqJ@<2Led>>Ka=9JlEI97BfBy;6Vxo`iGf)n$E48w5mv4`_h6lAXzPwnX#tt`*7 z%*{@w-&a8p1oFa5?oPt|j?>b2-scTKkihhCvV4;VMlNz(r#fW@HIfV32lS#I?H{T) z)2%vEmyzD1RKeZM=)&F1>aw8WV9q_vngIdV#(~<0w(TMjN8x_3pHxTjVTK-$idlhF z%3?S+Y;lf8zkZ-_xmL&wvu%fiWh2DX3D)^KfutXpSt01h3`@V>NF@#Fvkoqb?jf-H z5i@Mu{sK}@+nle5bfiV#HHZ%s(H;su`zK|y{Zoueqpc5zS#A9BzH^XBC@|ffLES>3 zpN;c%)|9JE~4^_fFIi2%9 z{nUMxlezuT{qflwBpNFHmoMd|iF^eS?iez2wgW>`C1`V_y)%00Xvu9fJWt;@(6nD~ zRpoB9g+f3hyA7M$s0id&4P7OzeD*I?@js-a*(-$Z($yYXhc;~TO!TcDpcN{2jjRaY zX38U#>_pa96JU8gr--Ogdl{HTs zFj_j)Q>G7TBF9awhZGp%`J!SY<4WKL9;D=KgBr7SO~-M-3X7I)O}{io<6$;;9Qf)_ zF!<|$ffSgk;07H_4Pf8JOk3ksLzBxEm!*=kC#hW~_06u#G<*~Z_GVG3Z%nN=r?2n2 za*kBH=X_+M?H5#_#y52ajeUXLDdAE!&crj$;^J)&rQWI6^kP|-HU3PvOM%Mx>ao`) z&_K^EarS*s;%H>xNifX{SgS_C+dvwz$`#H#!ngKfCU3O-pdSa?iaWK;SXw=#CsGH- z{BnE-o=-S=%Ob%N%et9zmL^iY5{-A{&v%B*a}MvHA}Eb8YL}p^Ho6$gmJY3*$kTg8kF>7pfGCzP>@^~{AOe;LL7)P~`X15*(ih*WLM@vl z7GKjs#dn!EeT9PfD0tI}3)6j6_-Dn3_OXu}v6u0*>ktLpv70)!W6`)hBbMmTiVCxU0sFN&JFHmomu8h4yJ5mAl#*f)2MRJ)A{``2TE<4I|InR629+u#A1rl zzDqbXZ`mP!Nprtc(9(9ykv~_{xSQ;+0e{T2m>Ke5)-d$#Za$Xuo1sYfF_R}B{OR`x=pZZ}P(GZJz5{%0U(7jLiOp6dPLfB)-C|C)* z{XXzWB zHkosTS@{z@gpTl-AYMAV zvO(hnF%r^Us!v;Wc6P51aXNTL@$B)^kkd#NV9MaKS78dwKYWR&T5rcJo9EaTfO5l= zbI}DZheqOx8uItTPA+WpWA??7$W9tyrC6GVLXcF|uTdn%1h>I;zCzA$)5#B@XGzUn zl6$q^&d9SHC(oA3$O@IW&{%zlm&?{xmfjnLDzd18rW^9gc(22a;sV^J-SkCC`m6YD zu5~%4+B*!g#&K6D&DAnh|Dog2)N=n5FPP2|#|=O9+i;rddBs$I<2Mc|bb=^!smJpr z24`%zIII<~6_-*Z`;_6WRlCi$Ap3gUK12Lkze3~aI|l%dNO!;+!M~ER6ErZivNaGj zv9+^TaM1l;|9`#x_9$B@pr`;&$yZt1R2z%Ky{(%Q_v6=w6e#9Lgh7f%4zY-5o2!>m zot)O6oi{J?%I3>{>>RD}ODMe3FuKcoe8-nFY3HN|NnY{6Cja%xP$S^beB;Lqx2uQC zQ!9F)T$|UuYQyO{hT5W-cDPtr$mj;NYwAE!4WnlvNwjt)kaKWYOv;=y;1#1b3ccXG zZyAGSBGbYV>o`8+)??irpI*A!2kOuoslQe1dF52BUZgp#pjNG{5V4$QXi;d5n_PgNYI+Fk5ZDNWI()H1(Vm>-Zp87MqfQzd3l)1wBw;l5(!d zV3%ON$;8@ylwm7!S+&MEt~`BU3FH!jRY@sAvgnOQll*|adVWix(+xSi=X4R|KG&D= zdS<*AAzScEU@1EYG77EWmYn#ean!5fHkxdWNw8u*&tMT&C8=GiWx4lv+?YsGYK#rB za$1k{qG1fXs1;IzadA&Nq+uG-(z=3uby|jOf{0v*v3hozq3h1T`Vyf-=X8RdCEl;$ zx9KKbhuhCO8z)6YJRfjAc~1t0!9cF+F@(s+)lsEnGR4xR?eS_RCG$aW(jYe(eSmtM z*m6{ay!Q}g683}Nm*GTwV}sO9ZZK*|V%_BRqTLv_D2_4fYq0gigRZyi#SpECwgC5H zWx8XA?04vfa-JXdwOtAhD?>JYG1=Ux1zWYL)#wsyU3s|Jg%S^6AzZr*Mod>+njR$F ziKBiL0;kqT8!>E{lbsxiS8-dEfq>ls^E=bVJhG0?@DVzAn3H*1|I&5A%)UGY{I!uF zTH34X{8-v^E$0<(?Ly^Rc&B-qjj!k626LOUYhMv=+Ph`ax@m|nvY;oq!@>M=S|dxMK$&6KkzQD8!Vj;JL8q@$@;xx!xYruGtebRUYkVw9o0DK`VdIM|P&E z&7Y>-Lv?_J>+Ss9hzP$6ra`2E;WAT#*Ini-d+Zm2U&oL*AnxREp4DFfV>IXQW3+;c zoxOp@zp*K##|}w$@uLQQoGZ4dt(!5O7Fl8yL=o-|z=%f2ct!tm-!lb&GKLg|d{S^l zQpFdBpd$#G!UVBUpj$1C`TXPKNLpiyS4-Qoj%VhHga{GD=BU|f{v*KVXjvkJUV|^l zKSJp*+(q-(4fTm#MFD2TG0=s!@)&3k%Nn1#kFpn)339FDjP`Y@ ztE%%NCY@nEDN{$WuFSF&*n2p zi!x)+s?uHp7EXazq zg;lGGm#7c2RH!g^9ZQNVDD1clYzOYlm@=d(NzoQih6rxW{9R4)8g`3xcYL=SVdT6w z5I2A~E{l16KTwm241(*lQ}^Ap#Z@oQ2ViTUK2hvNHm14J9MerKN7^Ym7RY3kjEkIE zf5lcCK?d#*V`L?cJp1_C;rC^Cly|&tlFM%hzo2Blu#ihLwBHHvU#fhWUF;eYJeT}P zm{-iz1}T(?ps~y!krsn2wCVufwrlTurrMuf7QLlZFtO<0sp`JpY+ksxr?3SUTcLfL z5hk^MBN&;co%@2*lwB4|jlKn10*ZBl)@TEg#wSg%xr#!7U5y?pj zmXruEYQ9QdC~Q|6GB9o~NAHZYMdmc}c}`ANy(8~-PY8)yR6RfYm-dV-Qzn@ExnYJG zTj$eT8zA|rt+&&Fd{t$*fOLj(nzL2?EE>J?_1Pv44Y>J(VNKj%e`SUouxc4FIkNyG zICZ5o|3aF9@tz^oCEm`g216?2uqbkDNB08ui4UeV9)j*#5T(%TNU_Q$(M)^vKo-N&m_URxpfV)=xV@_Dx9g5 zp1-106&Zh>-HlBN6$gHX<_@$9Vr2g^+2+e`c+`dv$B6_qs#Izx!)9i+o8z^+kyCXu zXZwTuJv?Ec2+~L}%LFpoxNop{l>mL9wNyui_o5~|IgkSSQ%I1`bW=nWFYUTzBR~wXLTFn_?S1G|!S&U|qMF0wcN7yEle) z%AwJ)6XE$(qD=G{(9miT9Cw%;@If0Fh6r>~5;88Nurf^vj0RoORw+egP~uEA3oRaK zR5G2e^Qr1_tAjBuCELVUlP_yETQnzjk6f_WZr2hbaOE_y@I5$}t0)R21*I?yrrTOA zP%u74KZ89q`n;ar6{gm+?uxN36;AI5>!Uu(7>wmH)K48pU7i%ll=>_KAIdW=ZcV7z zTMU_;k?f6nCoDd*J*R=6&hU7Q(Lz(cm04drzY*D6f2oFHywrCK4lQr$fZfH&M7$zc z4Q62-6!sIESwAMSbbTsZC`w2=!a-TA%EpZ-jMe?L$b)oPlr1%?^v*1SI;ia$RXQ; z%;buUB6J{c7aDAU)B1zB8^(f(#ST|pFxM5Rc7g!J0GGJf6-QKea^K9gJ7BpRngh)npS#1f$&1GynsK4y#1B?g*p6`< zHg>&_IMwH2YN`!D=V*q~vpmLqxS=$~*c(4I;&eAs?ok3aK-EXRyFk~HRxtjO`=)0Y zUaxF7XkHMi!5Zj!R@7Qj4_N7YP7J}hLDTjCMsFBl3QCZXi;V-)0i~ST7sRf?owNKD zx|q+rOnVS1S`+uQK8dNrqTpi~hUCB4c>U{BiSXE^f(jVq0Y?*n2mqh&;`@N3?*A;j zzx}h^{xe`y5J2#6NJt=1kzY0J0nhsP3lZp8;M-Rj5k&zy30YCVvHM?>adUFq3IhH? z1@QTnqrb0QpKtGe|DQ}oKvqIjL_zVnjOfn@*8n-AZz%xt)_*R*-1YrJ1o|qF4)|_m zYxE1}(-eT0pr2BF_@3gs`2Igp0R%{YN_g~Z!tYTGeq%QF)i-EnOTVB62{|)eWXr;e()1T(3XC+_;6;OI>K*@!F0R#d3^`8KruF(LiHD?zA2YX|H zlC6o}51HntjJrpwc0~ZDMZkyn7e*IA9{#{6@pl>idS!fy2U_U5tO>}gJRmjQFL-(Y z%kLlX#B6o+%?*?QV)Eiv76#H*R%Q;?e}=~0&|2&PfZPFk>9_6Ozpok}XvjZ80~CDC z9qa(7#6(TZ4FvS`4D9S=bS!m@{*IgQH1ET3+M?g|ux|m@xnJ{62#5>%hrFx&72N`0 zxG*#^asY^71BBuKoOgZK;ni3`mGA(bC5FE<4!GC&d_nvp^wahf2ZVkw|8E)3b75#w z24oxvP&?nA|G%#qpCzP6IsJXr_*elVZ~UPaeu*6S z=i+m$)Ggxx9F%_Oqexy4lgR6zhL_1}vC%dMLhQf6MfrE8=O`+P|S|e9&e8 zi2J=-|J(5MG)&+Ryeq{&;{DR}|1D_X)7p3%g6;>)w`t=Kb^OmG&eO;2_yLcv_gmh6g8lxg$oPA2{8n#I18V$0h1UNU zsQ(aN<7xh%1}^x)1Z(s!n0|Kq0hG@A=P(9Osh;Y_|Dd`t`6sIXq9Xqk{;2@^5BNy4 ze}ezs68|KJ{*>yelIjnt3cG(n^;f0+uj+a#M)`we!tq~_{IfLW(-J+^?)yQ8==x7& zKkqF+#eAw9^#gOq>z^>cH^^VmfBpDrtL`bwQ;DJ#qOwxINtv|AFjT_8anltD`?}k3TKM(~Za}xKVZkJ{t5Q` zfbkEzaZd~I)Jp$@39bG&rl;=@Kh@p;D9}^O@ei84hTmv@g8g2gzi$69_B}Nr{=nyJ v{ulWF-JtlizMfh|eh^K!{r|%7zu8D$N`V31fxg9xVFW__CM4JX?brVS=I{&) literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..8752e40 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Apr 05 09:18:07 CST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..27309d9 --- /dev/null +++ b/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..832fdb6 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..8576562 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ + +rootProject.name = 'RobotSimulator' diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9604c915d7b8d2e3c47081ab1bfbca343bb98a7e GIT binary patch literal 6148 zcmeHKJ5EC}5S)cqM50Ma=__ypD+(vb1^9#lDUc$ee--EAXqo*KiJqR6h6ZM(_1Nnj zTb|3 z&ZCzgHV+Vc;h4w>&5}w?s#S|&NoTxOUN0OIlMaiUc~0GI)uCA2&UlM-SWna_1*E{G z0=Kzbdi{T-&-DM7B(0=?6!=pL*s$KLSA0^{*2&|%);9VR-E)5EZkz{&LzH7;lw&Tu f9N$M$<~5&lzZZ^)L1#SZMEwl7E;1?b+X|cjR1+BX literal 0 HcmV?d00001 diff --git a/src/main/.DS_Store b/src/main/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..55c1fcbeb4ba2bef02771ea2748f3e4b0ea5c07d GIT binary patch literal 6148 zcmeH~J&wXa427SU6iC~oq@0EW>)m< zk%er^j=Knh3!DIf); zz>E~gV|@8Jqi52iNC7D@4+Z@DQ0UH@Y@PAxV2BZb99RzHI%Wy7c!8|R*2xOZa(b|A zwHQOZ9_?hw>uR!f_I6kfAC`AEpJHg%+hK(X&1yhF3P^#80*juHe*W+1ujcQ^n8@Auu4PPqH)~DC=`aY|^Zges(XZZ6Iz{HQ@6+Mjm#TR5vwoX=P`Vj~j6r{kv GD)0dNyb`AX literal 0 HcmV?d00001 diff --git a/src/main/java/au/com/seek/RobotSimulator.java b/src/main/java/au/com/seek/RobotSimulator.java new file mode 100644 index 0000000..dc3ae71 --- /dev/null +++ b/src/main/java/au/com/seek/RobotSimulator.java @@ -0,0 +1,18 @@ +package au.com.seek; + +import au.com.seek.executor.Executor; +import au.com.seek.parser.InputParser; + +import java.io.IOException; + +public class RobotSimulator { + private static final String INPUT_FILE = "input.txt"; + + public static void main(String[] args) throws IOException { + new RobotSimulator().run(new InputParser(INPUT_FILE)); + } + + private void run(InputParser parser) { + new Executor(parser.getRobot()).execute(parser.parseCommands()); + } +} diff --git a/src/main/java/au/com/seek/command/MoveForwardCommand.java b/src/main/java/au/com/seek/command/MoveForwardCommand.java new file mode 100644 index 0000000..257d2ed --- /dev/null +++ b/src/main/java/au/com/seek/command/MoveForwardCommand.java @@ -0,0 +1,11 @@ +package au.com.seek.command; + +import au.com.seek.domain.Robot; + + +public class MoveForwardCommand implements RobotCommand { + @Override + public void execute(Robot robot) { + robot.moveForward(); + } +} diff --git a/src/main/java/au/com/seek/command/ReportCommand.java b/src/main/java/au/com/seek/command/ReportCommand.java new file mode 100644 index 0000000..7af3d35 --- /dev/null +++ b/src/main/java/au/com/seek/command/ReportCommand.java @@ -0,0 +1,11 @@ +package au.com.seek.command; + +import au.com.seek.domain.Robot; + +public class ReportCommand implements RobotCommand { + + @Override + public void execute(Robot robot) { + System.out.println(robot.report()); + } +} diff --git a/src/main/java/au/com/seek/command/RobotCommand.java b/src/main/java/au/com/seek/command/RobotCommand.java new file mode 100644 index 0000000..0d119b6 --- /dev/null +++ b/src/main/java/au/com/seek/command/RobotCommand.java @@ -0,0 +1,8 @@ +package au.com.seek.command; + + +import au.com.seek.domain.Robot; + +public interface RobotCommand { + void execute(Robot robot); +} diff --git a/src/main/java/au/com/seek/command/TurnLeftCommand.java b/src/main/java/au/com/seek/command/TurnLeftCommand.java new file mode 100644 index 0000000..b68971b --- /dev/null +++ b/src/main/java/au/com/seek/command/TurnLeftCommand.java @@ -0,0 +1,11 @@ +package au.com.seek.command; + +import au.com.seek.domain.Robot; + + +public class TurnLeftCommand implements RobotCommand { + @Override + public void execute(Robot robot) { + robot.turnLeft(); + } +} diff --git a/src/main/java/au/com/seek/command/TurnRightCommand.java b/src/main/java/au/com/seek/command/TurnRightCommand.java new file mode 100644 index 0000000..b523b54 --- /dev/null +++ b/src/main/java/au/com/seek/command/TurnRightCommand.java @@ -0,0 +1,11 @@ +package au.com.seek.command; + +import au.com.seek.domain.Robot; + + +public class TurnRightCommand implements RobotCommand { + @Override + public void execute(Robot robot) { + robot.turnRight(); + } +} diff --git a/src/main/java/au/com/seek/domain/Coordinate.java b/src/main/java/au/com/seek/domain/Coordinate.java new file mode 100644 index 0000000..e47b03b --- /dev/null +++ b/src/main/java/au/com/seek/domain/Coordinate.java @@ -0,0 +1,28 @@ +package au.com.seek.domain; + + +public class Coordinate { + private int xAxis; + private int yAxis; + + public Coordinate(int xAxis, int yAxis) { + this.xAxis = xAxis; + this.yAxis = yAxis; + } + + int getXAxis() { + return xAxis; + } + + void setXAxis(int xAxis) { + this.xAxis = xAxis; + } + + int getYAxis() { + return yAxis; + } + + void setYAxis(int yAxis) { + this.yAxis = yAxis; + } +} diff --git a/src/main/java/au/com/seek/domain/Direction.java b/src/main/java/au/com/seek/domain/Direction.java new file mode 100644 index 0000000..62346dc --- /dev/null +++ b/src/main/java/au/com/seek/domain/Direction.java @@ -0,0 +1,100 @@ +package au.com.seek.domain; + + +public enum Direction { + NORTH { + @Override + public Direction turnRight() { + return EAST; + } + + @Override + public Direction turnLeft() { + return WEST; + } + + @Override + public int stepValueOnXAxis() { + return 0; + } + + @Override + public int stepValueOnYAxis() { + return STEP_VALUE; + } + }, + EAST { + @Override + public Direction turnRight() { + return SOUTH; + } + + @Override + public Direction turnLeft() { + return NORTH; + } + + @Override + public int stepValueOnXAxis() { + return STEP_VALUE; + } + + @Override + public int stepValueOnYAxis() { + return 0; + } + }, + SOUTH { + @Override + public Direction turnRight() { + return WEST; + } + + @Override + public Direction turnLeft() { + return EAST; + } + + @Override + public int stepValueOnXAxis() { + return 0; + } + + @Override + public int stepValueOnYAxis() { + return NEGATIVE_STEP_VALUE; + } + }, + WEST { + @Override + public Direction turnRight() { + return NORTH; + } + + @Override + public Direction turnLeft() { + return SOUTH; + } + + @Override + public int stepValueOnXAxis() { + return NEGATIVE_STEP_VALUE; + } + + @Override + public int stepValueOnYAxis() { + return 0; + } + }; + + private static final int NEGATIVE_STEP_VALUE = -1; + private static final int STEP_VALUE = 1; + + public abstract Direction turnRight(); + + public abstract Direction turnLeft(); + + public abstract int stepValueOnXAxis(); + + public abstract int stepValueOnYAxis(); +} diff --git a/src/main/java/au/com/seek/domain/Robot.java b/src/main/java/au/com/seek/domain/Robot.java new file mode 100644 index 0000000..310cb53 --- /dev/null +++ b/src/main/java/au/com/seek/domain/Robot.java @@ -0,0 +1,54 @@ +package au.com.seek.domain; + + +public class Robot { + private Coordinate coordinate; + private Direction direction; + + public Robot(Coordinate coordinate, Direction direction) { + this.coordinate = coordinate; + this.direction = direction; + } + + public String report() { + return String.format("%s,%s,%s", getCoordinate().getXAxis(), + getCoordinate().getYAxis(), getDirection().toString()); + } + + public void turnLeft() { + this.direction = getDirection().turnLeft(); + } + + public void turnRight() { + this.direction = getDirection().turnRight(); + } + + public void moveForward() { + if (isGoingToFallingWhenMove()) { + return; + } + getCoordinate().setXAxis(moveOnXAxis()); + getCoordinate().setYAxis(moveOnYAxis()); + } + + private int moveOnYAxis() { + return getCoordinate().getYAxis() + getDirection().stepValueOnYAxis(); + } + + private int moveOnXAxis() { + return getCoordinate().getXAxis() + getDirection().stepValueOnXAxis(); + } + + private boolean isGoingToFallingWhenMove() { + return Tabletop.isCoordinateOutOfTabletop(new Coordinate(moveOnXAxis(), moveOnYAxis())); + } + + private Coordinate getCoordinate() { + return this.coordinate; + } + + private Direction getDirection() { + return this.direction; + } + +} diff --git a/src/main/java/au/com/seek/domain/Tabletop.java b/src/main/java/au/com/seek/domain/Tabletop.java new file mode 100644 index 0000000..70cee98 --- /dev/null +++ b/src/main/java/au/com/seek/domain/Tabletop.java @@ -0,0 +1,11 @@ +package au.com.seek.domain; + + +public class Tabletop { + public static final int X_AXIS_MAXIMUM = 5; + public static final int Y_AXIS_MAXIMUM = 5; + + public static boolean isCoordinateOutOfTabletop(Coordinate coordinate) { + return (coordinate.getXAxis() > X_AXIS_MAXIMUM) || (coordinate.getYAxis() > Y_AXIS_MAXIMUM); + } +} diff --git a/src/main/java/au/com/seek/executor/Executor.java b/src/main/java/au/com/seek/executor/Executor.java new file mode 100644 index 0000000..cdd3ece --- /dev/null +++ b/src/main/java/au/com/seek/executor/Executor.java @@ -0,0 +1,20 @@ +package au.com.seek.executor; + + +import au.com.seek.command.RobotCommand; +import au.com.seek.domain.Robot; + +import java.util.List; + +public class Executor { + + private final Robot robot; + + public Executor(Robot robot) { + this.robot = robot; + } + + public void execute(List commands) { + commands.forEach(command -> command.execute(robot)); + } +} diff --git a/src/main/java/au/com/seek/parser/InputParser.java b/src/main/java/au/com/seek/parser/InputParser.java new file mode 100644 index 0000000..4728518 --- /dev/null +++ b/src/main/java/au/com/seek/parser/InputParser.java @@ -0,0 +1,82 @@ +package au.com.seek.parser; + + +import au.com.seek.command.*; +import au.com.seek.domain.Coordinate; +import au.com.seek.domain.Direction; +import au.com.seek.domain.Robot; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.List; +import java.util.Map; + +import static java.lang.Integer.valueOf; + +public class InputParser { + private static final int BUFFER_SIZE = 1024; + private static final String PLACE_COMMAND = "PLACE"; + private static final String SEPARATOR = ","; + private static final String LEFT = "LEFT"; + private static final String RIGHT = "RIGHT"; + private static final String MOVE = "MOVE"; + private static final int BLANK_LENGTH = 1; + private static final String REPORT = "REPORT"; + + private static final Map COMMAND_STRING_MAP = + ImmutableMap.of(LEFT, new TurnLeftCommand(), + RIGHT, new TurnRightCommand(), + MOVE, new MoveForwardCommand(), + REPORT, new ReportCommand()); + + private String file; + private List commands = Lists.newArrayList(); + private Robot robot; + + public InputParser(String file) throws IOException { + this.file = file; + parse(); + } + + public List parseCommands() { + return commands; + } + + public Robot getRobot() { + return robot; + } + + private void parse() throws IOException { + InputStream in = getClass().getClassLoader().getResourceAsStream(file); + BufferedReader reader = new BufferedReader(new InputStreamReader(in), BUFFER_SIZE); + String line; + + while ((line = reader.readLine()) != null) { + if (line.startsWith(PLACE_COMMAND)) { + parseRobot(line); + continue; + } + if (robot == null) { + continue; + } + commands.add(getCommand(line)); + } + } + + private RobotCommand getCommand(String line) { + return COMMAND_STRING_MAP.get(line); + } + + private void parseRobot(String line) { + String robotString = line.substring(PLACE_COMMAND.length() + BLANK_LENGTH); + String[] split = robotString.split(SEPARATOR); + robot = new Robot(new Coordinate(valueOf(split[0]), valueOf(split[1])), Direction.valueOf(split[2])); + //reset all the commands + commands = Lists.newArrayList(); + } + +} diff --git a/src/main/resources/input.txt b/src/main/resources/input.txt new file mode 100644 index 0000000..40e0b98 --- /dev/null +++ b/src/main/resources/input.txt @@ -0,0 +1,6 @@ +PLACE 1,2,EAST +MOVE +MOVE +LEFT +MOVE +REPORT \ No newline at end of file diff --git a/src/test/.DS_Store b/src/test/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..55c1fcbeb4ba2bef02771ea2748f3e4b0ea5c07d GIT binary patch literal 6148 zcmeH~J&wXa427SU6iC~oq@0EW>)m< zk%er^j=Knh3!DIf); zz>E~gV|@8Jqi52iNC7D@4+Z@DQ0UH@Y@PAxV2BZb99RzHI%Wy7c!8|R*2xOZa(b|A zwHQOZ9_?hw>uR!f_I6kfAC`AEpJHg%+hK(X&1yhF3P^#80*juHe*W+1ujcQ^n8@Auu4PPqH)~DC=`aY|^Zges(XZZ6Iz{HQ@6+Mjm#TR5vwoX=P`Vj~j6r{kv GD)0dNyb`AX literal 0 HcmV?d00001 diff --git a/src/test/java/au/com/seek/RobotSimulatorTest.java b/src/test/java/au/com/seek/RobotSimulatorTest.java new file mode 100644 index 0000000..66686fa --- /dev/null +++ b/src/test/java/au/com/seek/RobotSimulatorTest.java @@ -0,0 +1,32 @@ +package au.com.seek; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; + + +public class RobotSimulatorTest { + private final ByteArrayOutputStream outputContent = new ByteArrayOutputStream(); + + @Before + public void setUpStreams() { + System.setOut(new PrintStream(outputContent)); + } + + @After + public void cleanUpStreams() { + System.setOut(null); + } + + @Test + public void should_run_commands_and_print_result_when_use_simple_input_file() throws Exception { + RobotSimulator.main(new String[]{}); + assertThat(outputContent.toString(), containsString("3,3,NORTH")); + } +} diff --git a/src/test/java/au/com/seek/command/MoveForwardCommandTest.java b/src/test/java/au/com/seek/command/MoveForwardCommandTest.java new file mode 100644 index 0000000..772e287 --- /dev/null +++ b/src/test/java/au/com/seek/command/MoveForwardCommandTest.java @@ -0,0 +1,24 @@ +package au.com.seek.command; + +import au.com.seek.domain.Robot; +import au.com.seek.domain.Coordinate; +import au.com.seek.domain.Direction; +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; + + +public class MoveForwardCommandTest { + @Test + public void should_update_place_after_execute() throws Exception { + Coordinate coordinate = new Coordinate(0, 0); + Robot robot = new Robot(coordinate, Direction.NORTH); + assertThat(robot.report(), equalTo("0,0,NORTH")); + + MoveForwardCommand command = new MoveForwardCommand(); + command.execute(robot); + assertThat(robot.report(), equalTo("0,1,NORTH")); + } + +} \ No newline at end of file diff --git a/src/test/java/au/com/seek/command/ReportCommandTest.java b/src/test/java/au/com/seek/command/ReportCommandTest.java new file mode 100644 index 0000000..da8647e --- /dev/null +++ b/src/test/java/au/com/seek/command/ReportCommandTest.java @@ -0,0 +1,39 @@ +package au.com.seek.command; + +import au.com.seek.domain.Robot; +import au.com.seek.domain.Coordinate; +import au.com.seek.domain.Direction; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; + + +public class ReportCommandTest { + private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + + @Before + public void setUpStreams() { + System.setOut(new PrintStream(outContent)); + } + + @After + public void cleanUpStreams() { + System.setOut(null); + } + + @Test + public void should_print_location_after_execute() throws Exception { + Coordinate coordinate = new Coordinate(0, 0); + Robot robot = new Robot(coordinate, Direction.NORTH); + ReportCommand command = new ReportCommand(); + command.execute(robot); + assertThat(outContent.toString(), containsString("0,0,NORTH")); + } + +} \ No newline at end of file diff --git a/src/test/java/au/com/seek/command/TurnLeftCommandTest.java b/src/test/java/au/com/seek/command/TurnLeftCommandTest.java new file mode 100644 index 0000000..3fff18e --- /dev/null +++ b/src/test/java/au/com/seek/command/TurnLeftCommandTest.java @@ -0,0 +1,25 @@ +package au.com.seek.command; + +import au.com.seek.domain.Robot; +import au.com.seek.domain.Coordinate; +import au.com.seek.domain.Direction; +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; + + +public class TurnLeftCommandTest { + + @Test + public void should_update_place_after_execute() throws Exception { + Coordinate coordinate = new Coordinate(0, 0); + Robot robot = new Robot(coordinate, Direction.NORTH); + assertThat(robot.report(), equalTo("0,0,NORTH")); + + TurnLeftCommand command = new TurnLeftCommand(); + command.execute(robot); + assertThat(robot.report(), equalTo("0,0,WEST")); + } + +} \ No newline at end of file diff --git a/src/test/java/au/com/seek/command/TurnRightCommandTest.java b/src/test/java/au/com/seek/command/TurnRightCommandTest.java new file mode 100644 index 0000000..b38031b --- /dev/null +++ b/src/test/java/au/com/seek/command/TurnRightCommandTest.java @@ -0,0 +1,24 @@ +package au.com.seek.command; + +import au.com.seek.domain.Robot; +import au.com.seek.domain.Coordinate; +import au.com.seek.domain.Direction; +import org.junit.Test; + +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.Assert.assertThat; + +public class TurnRightCommandTest { + + @Test + public void should_update_place_after_execute() throws Exception { + Coordinate coordinate = new Coordinate(0, 0); + Robot robot = new Robot(coordinate, Direction.NORTH); + assertThat(robot.report(), equalTo("0,0,NORTH")); + + TurnRightCommand command = new TurnRightCommand(); + command.execute(robot); + assertThat(robot.report(), equalTo("0,0,EAST")); + } + +} \ No newline at end of file diff --git a/src/test/java/au/com/seek/domain/DirectionTest.java b/src/test/java/au/com/seek/domain/DirectionTest.java new file mode 100644 index 0000000..02aee35 --- /dev/null +++ b/src/test/java/au/com/seek/domain/DirectionTest.java @@ -0,0 +1,84 @@ +package au.com.seek.domain; + + +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; + +public class DirectionTest { + + @Test + public void should_return_new_direction_when_do_turn_left() throws Exception { + + assertThat(Direction.NORTH.turnLeft(), is(Direction.WEST)); + + assertThat(Direction.WEST.turnLeft(), is(Direction.SOUTH)); + + assertThat(Direction.SOUTH.turnLeft(), is(Direction.EAST)); + + assertThat(Direction.EAST.turnLeft(), is(Direction.NORTH)); + } + + @Test + public void should_return_new_direction_when_do_turn_right() throws Exception { + + assertThat(Direction.NORTH.turnRight(), is(Direction.EAST)); + + assertThat(Direction.EAST.turnRight(), is(Direction.SOUTH)); + + assertThat(Direction.SOUTH.turnRight(), is(Direction.WEST)); + + assertThat(Direction.WEST.turnRight(), is(Direction.NORTH)); + } + + + @Test + public void should_return_step_value_on_x_axis() throws Exception { + + assertThat(Direction.NORTH.stepValueOnXAxis(), is(0)); + + assertThat(Direction.EAST.stepValueOnXAxis(), is(1)); + + assertThat(Direction.SOUTH.stepValueOnXAxis(), is(0)); + + assertThat(Direction.WEST.stepValueOnXAxis(), is(-1)); + } + + @Test + public void should_return_step_value_on_y_axis() throws Exception { + + assertThat(Direction.NORTH.stepValueOnYAxis(), is(1)); + + assertThat(Direction.EAST.stepValueOnYAxis(), is(0)); + + assertThat(Direction.SOUTH.stepValueOnYAxis(), is(-1)); + + assertThat(Direction.WEST.stepValueOnYAxis(), is(0)); + } + + @Test + public void should_return_direction_string_as_enum() throws Exception { + + assertThat(Direction.NORTH.toString(), equalTo("NORTH")); + + assertThat(Direction.WEST.toString(), equalTo("WEST")); + + assertThat(Direction.SOUTH.toString(), equalTo("SOUTH")); + + assertThat(Direction.EAST.toString(), equalTo("EAST")); + } + + @Test + public void should_return_all_the_values_of_direction() throws Exception { + Direction[] directions = {Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST}; + assertThat(Direction.values(), equalTo(directions)); + } + + @Test + public void test_value_of() throws Exception { + Direction east = Direction.valueOf("EAST"); + assertThat(east, is(Direction.EAST)); + } +} diff --git a/src/test/java/au/com/seek/domain/RobotTest.java b/src/test/java/au/com/seek/domain/RobotTest.java new file mode 100644 index 0000000..c1f69a7 --- /dev/null +++ b/src/test/java/au/com/seek/domain/RobotTest.java @@ -0,0 +1,83 @@ +package au.com.seek.domain; + +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; + + +public class RobotTest { + + @Test + public void should_report_robot_location() throws Exception { + Coordinate coordinate = new Coordinate(0, 0); + Robot robot = new Robot(coordinate, Direction.EAST); + + String report = robot.report(); + assertThat(report, equalTo("0,0,EAST")); + } + + @Test + public void should_report_robot_location_when_x_and_y_axis_is_not_zero() throws Exception { + Coordinate coordinate = new Coordinate(3, 5); + Robot robot = new Robot(coordinate, Direction.SOUTH); + + String report = robot.report(); + assertThat(report, equalTo("3,5,SOUTH")); + } + + @Test + public void should_change_direction_when_do_turn_left() throws Exception { + Coordinate coordinate = new Coordinate(3, 3); + Robot robot = new Robot(coordinate, Direction.NORTH); + + robot.turnLeft(); + assertThat(robot.report(), equalTo("3,3,WEST")); + } + + @Test + public void should_change_direction_when_do_turn_right() throws Exception { + Coordinate coordinate = new Coordinate(0, 1); + Robot robot = new Robot(coordinate, Direction.NORTH); + + robot.turnRight(); + assertThat(robot.report(), equalTo("0,1,EAST")); + } + + @Test + public void should_change_coordinates_when_do_move_and_facing_north() throws Exception { + Coordinate coordinate = new Coordinate(0, 1); + Robot robot = new Robot(coordinate, Direction.NORTH); + + robot.moveForward(); + assertThat(robot.report(), equalTo("0,2,NORTH")); + } + + @Test + public void should_change_coordinates_when_do_move_and_facing_east() throws Exception { + Coordinate coordinate = new Coordinate(0, 1); + Robot robot = new Robot(coordinate, Direction.EAST); + + robot.moveForward(); + assertThat(robot.report(), equalTo("1,1,EAST")); + } + + @Test + public void should_remain_same_coordinates_if_robot_is_going_to_falling_in_x_axis() throws Exception { + Coordinate coordinate = new Coordinate(5, 0); + Robot robot = new Robot(coordinate, Direction.EAST); + + robot.moveForward(); + assertThat(robot.report(), equalTo("5,0,EAST")); + } + + @Test + public void should_remain_same_coordinates_if_robot_is_going_to_falling_in_y_axis() throws Exception { + Coordinate coordinate = new Coordinate(0, 5); + Robot robot = new Robot(coordinate, Direction.NORTH); + + robot.moveForward(); + assertThat(robot.report(), equalTo("0,5,NORTH")); + } + +} \ No newline at end of file diff --git a/src/test/java/au/com/seek/domain/TabletopTest.java b/src/test/java/au/com/seek/domain/TabletopTest.java new file mode 100644 index 0000000..1187005 --- /dev/null +++ b/src/test/java/au/com/seek/domain/TabletopTest.java @@ -0,0 +1,33 @@ +package au.com.seek.domain; + + +import org.junit.Test; + +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; + +public class TabletopTest { + @Test + public void just_for_coverage() throws Exception { + Tabletop tabletop = new Tabletop(); + assertThat(tabletop == null, is(false)); + } + + @Test + public void should_return_true_if_coordinate_are_too_large() throws Exception { + Coordinate coordinate = new Coordinate(6, 5); + assertThat(Tabletop.isCoordinateOutOfTabletop(coordinate), is(true)); + } + + @Test + public void should_return_false_if_coordinate_is_on_the_border_tabletop() throws Exception { + Coordinate coordinate = new Coordinate(5, 5); + assertThat(Tabletop.isCoordinateOutOfTabletop(coordinate), is(false)); + } + + @Test + public void should_return_false_if_coordinate_is_within_tabletop() throws Exception { + Coordinate coordinate = new Coordinate(3, 1); + assertThat(Tabletop.isCoordinateOutOfTabletop(coordinate), is(false)); + } +} \ No newline at end of file diff --git a/src/test/java/au/com/seek/parser/InputParserTest.java b/src/test/java/au/com/seek/parser/InputParserTest.java new file mode 100644 index 0000000..2cd1169 --- /dev/null +++ b/src/test/java/au/com/seek/parser/InputParserTest.java @@ -0,0 +1,57 @@ +package au.com.seek.parser; + +import au.com.seek.domain.Robot; +import au.com.seek.command.RobotCommand; +import org.junit.Test; + +import java.util.List; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; + + +public class InputParserTest { + @Test + public void should_return_commands_and_robot() throws Exception { + InputParser parser = new InputParser("simple_input.txt"); + Robot robot = parser.getRobot(); + List commands = parser.parseCommands(); + assertThat(robot.report(), equalTo("0,0,NORTH")); + assertThat(commands.size(),is(3)); + assertThat(commands.get(0).getClass().getSimpleName(), equalTo("MoveForwardCommand")); + assertThat(commands.get(1).getClass().getSimpleName(), equalTo("TurnRightCommand")); + assertThat(commands.get(2).getClass().getSimpleName(), equalTo("ReportCommand")); + } + + @Test + public void should_skip_the_commands_before_place_robot() throws Exception { + InputParser parser = new InputParser("has_invalid_inputs.txt"); + Robot robot = parser.getRobot(); + List commands = parser.parseCommands(); + assertThat(robot.report(), equalTo("2,4,EAST")); + assertThat(commands.size(),is(3)); + assertThat(commands.get(0).getClass().getSimpleName(), equalTo("TurnLeftCommand")); + assertThat(commands.get(1).getClass().getSimpleName(), equalTo("MoveForwardCommand")); + assertThat(commands.get(2).getClass().getSimpleName(), equalTo("ReportCommand")); + } + + @Test + public void should_replace_the_robot_when_there_is_another_place_command() throws Exception { + InputParser parser = new InputParser("double_place_commands.txt"); + Robot robot = parser.getRobot(); + List commands = parser.parseCommands(); + assertThat(robot.report(), equalTo("3,3,EAST")); + assertThat(commands.size(),is(4)); + + assertThat(commands.get(0).getClass().getSimpleName(), equalTo("MoveForwardCommand")); + assertThat(commands.get(1).getClass().getSimpleName(), equalTo("TurnRightCommand")); + assertThat(commands.get(2).getClass().getSimpleName(), equalTo("MoveForwardCommand")); + assertThat(commands.get(3).getClass().getSimpleName(), equalTo("ReportCommand")); + } + +// @Test +// public void should_throw_exception_if_file_is_not_found() throws Exception { +// InputParser parser = new InputParser("empty.txt"); +// } +} \ No newline at end of file diff --git a/src/test/resources/double_place_commands.txt b/src/test/resources/double_place_commands.txt new file mode 100644 index 0000000..3904f94 --- /dev/null +++ b/src/test/resources/double_place_commands.txt @@ -0,0 +1,7 @@ +PLACE 0,0,NORTH +MOVE +PLACE 3,3,EAST +MOVE +RIGHT +MOVE +REPORT \ No newline at end of file diff --git a/src/test/resources/empty.txt b/src/test/resources/empty.txt new file mode 100644 index 0000000..e69de29 diff --git a/src/test/resources/has_invalid_inputs.txt b/src/test/resources/has_invalid_inputs.txt new file mode 100644 index 0000000..cc8b68f --- /dev/null +++ b/src/test/resources/has_invalid_inputs.txt @@ -0,0 +1,6 @@ +RIGHT +MOVE +PLACE 2,4,EAST +LEFT +MOVE +REPORT \ No newline at end of file diff --git a/src/test/resources/simple_input.txt b/src/test/resources/simple_input.txt new file mode 100644 index 0000000..64c9adf --- /dev/null +++ b/src/test/resources/simple_input.txt @@ -0,0 +1,4 @@ +PLACE 0,0,NORTH +MOVE +RIGHT +REPORT \ No newline at end of file