From a09bb85468022c8eeb32e2c3127e04c961803322 Mon Sep 17 00:00:00 2001 From: Tadashi Date: Tue, 12 Apr 2022 15:41:44 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E9=98=B6=E6=AE=B5=E6=80=A7=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=20=E3=80=90=E6=8F=90=E4=BA=A4=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E3=80=91=EF=BC=9A=E9=98=B6=E6=AE=B5=E6=80=A7=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=20=E3=80=90=E9=97=AE=E9=A2=98=E6=8F=8F=E8=BF=B0=E3=80=91?= =?UTF-8?q?=EF=BC=9A=E4=BB=A3=E7=A0=81=E6=95=B4=E7=90=86=20=E3=80=90?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=86=85=E5=AE=B9=E3=80=91=EF=BC=9A=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=95=B4=E7=90=86=20=E3=80=90=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BA=BA=E3=80=91=EF=BC=9Atadashi=20=E3=80=90=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8=E4=BA=BA=E3=80=91=EF=BC=9Atadashi=20=E3=80=90?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E6=84=8F=E8=A7=81=E3=80=91=EF=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executionHistory/executionHistory.bin | Bin 0 -> 177476 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .gradle/6.7.1/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/6.7.1/fileHashes/fileHashes.bin | Bin 0 -> 20797 bytes .gradle/6.7.1/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../6.7.1/fileHashes/resourceHashesCache.bin | Bin 0 -> 19245 bytes .gradle/6.7.1/gc.properties | 0 .gradle/6.7.1/javaCompile/classAnalysis.bin | Bin 0 -> 54906 bytes .gradle/6.7.1/javaCompile/jarAnalysis.bin | Bin 0 -> 23701 bytes .gradle/6.7.1/javaCompile/javaCompile.lock | Bin 0 -> 17 bytes .gradle/6.7.1/javaCompile/taskHistory.bin | Bin 0 -> 51284 bytes .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 + .gradle/buildOutputCleanup/outputFiles.bin | Bin 0 -> 18947 bytes .gradle/checksums/checksums.lock | Bin 0 -> 17 bytes .gradle/checksums/md5-checksums.bin | Bin 0 -> 34047 bytes .gradle/checksums/sha1-checksums.bin | Bin 0 -> 135611 bytes .gradle/configuration-cache/gc.properties | 0 .gradle/vcs-1/gc.properties | 0 .idea/.gitignore | 6 + .idea/compiler.xml | 16 + .idea/encodings.xml | 6 + .idea/gradle.xml | 17 + .idea/jarRepositories.xml | 25 + .idea/misc.xml | 24 + .idea/vcs.xml | 6 + README.en.md | 36 -- README.md | 69 +- build.gradle | 62 ++ build/resources/main/application.yml | 16 + build/resources/main/bootstrap.yml | 0 build/resources/main/logback.xml | 191 ++++++ build/tmp/bootJar/MANIFEST.MF | 7 + .../compileJava/source-classes-mapping.txt | 36 ++ .../source-classes-mapping.txt | 2 + gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 185 ++++++ gradlew.bat | 89 +++ settings.gradle | 2 + .../java/com/jjsk/FilesystemApplication.java | 12 + .../com/jjsk/api/FileUploadControllerApi.java | 51 ++ .../com/jjsk/common/domain/ApiResult.java | 93 +++ .../com/jjsk/common/domain/BaseConstants.java | 18 + .../java/com/jjsk/common/domain/PageBo.java | 28 + .../java/com/jjsk/common/domain/PageVo.java | 53 ++ .../com/jjsk/common/domain/ResultMsg.java | 37 ++ src/main/java/com/jjsk/config/MongoConf.java | 28 + .../java/com/jjsk/config/ServerConfig.java | 28 + .../java/com/jjsk/config/Swagger2Config.java | 34 + .../jjsk/controller/FileUploadController.java | 91 +++ .../java/com/jjsk/entity/bo/UploadPartBo.java | 44 ++ .../java/com/jjsk/entity/vo/CheckPartVo.java | 28 + .../java/com/jjsk/entity/vo/FileUploadVo.java | 42 ++ .../com/jjsk/exception/BusinessException.java | 47 ++ .../exception/GlobalExceptionHandler.java | 122 ++++ .../com/jjsk/service/FileUploadService.java | 334 ++++++++++ src/main/resources/application.yml | 16 + src/main/resources/bootstrap.yml | 0 src/main/resources/logback.xml | 191 ++++++ .../com/jjsk/FilesystemApplicationTests.java | 98 +++ ...345\212\241Api\346\226\207\346\241\243.md" | 611 ++++++++++++++++++ 61 files changed, 2735 insertions(+), 73 deletions(-) create mode 100644 .gradle/6.7.1/executionHistory/executionHistory.bin create mode 100644 .gradle/6.7.1/executionHistory/executionHistory.lock create mode 100644 .gradle/6.7.1/fileChanges/last-build.bin create mode 100644 .gradle/6.7.1/fileHashes/fileHashes.bin create mode 100644 .gradle/6.7.1/fileHashes/fileHashes.lock create mode 100644 .gradle/6.7.1/fileHashes/resourceHashesCache.bin create mode 100644 .gradle/6.7.1/gc.properties create mode 100644 .gradle/6.7.1/javaCompile/classAnalysis.bin create mode 100644 .gradle/6.7.1/javaCompile/jarAnalysis.bin create mode 100644 .gradle/6.7.1/javaCompile/javaCompile.lock create mode 100644 .gradle/6.7.1/javaCompile/taskHistory.bin create mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .gradle/buildOutputCleanup/outputFiles.bin create mode 100644 .gradle/checksums/checksums.lock create mode 100644 .gradle/checksums/md5-checksums.bin create mode 100644 .gradle/checksums/sha1-checksums.bin create mode 100644 .gradle/configuration-cache/gc.properties create mode 100644 .gradle/vcs-1/gc.properties create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml delete mode 100644 README.en.md create mode 100644 build.gradle create mode 100644 build/resources/main/application.yml create mode 100644 build/resources/main/bootstrap.yml create mode 100644 build/resources/main/logback.xml create mode 100644 build/tmp/bootJar/MANIFEST.MF create mode 100644 build/tmp/compileJava/source-classes-mapping.txt create mode 100644 build/tmp/compileTestJava/source-classes-mapping.txt 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/main/java/com/jjsk/FilesystemApplication.java create mode 100644 src/main/java/com/jjsk/api/FileUploadControllerApi.java create mode 100644 src/main/java/com/jjsk/common/domain/ApiResult.java create mode 100644 src/main/java/com/jjsk/common/domain/BaseConstants.java create mode 100644 src/main/java/com/jjsk/common/domain/PageBo.java create mode 100644 src/main/java/com/jjsk/common/domain/PageVo.java create mode 100644 src/main/java/com/jjsk/common/domain/ResultMsg.java create mode 100644 src/main/java/com/jjsk/config/MongoConf.java create mode 100644 src/main/java/com/jjsk/config/ServerConfig.java create mode 100644 src/main/java/com/jjsk/config/Swagger2Config.java create mode 100644 src/main/java/com/jjsk/controller/FileUploadController.java create mode 100644 src/main/java/com/jjsk/entity/bo/UploadPartBo.java create mode 100644 src/main/java/com/jjsk/entity/vo/CheckPartVo.java create mode 100644 src/main/java/com/jjsk/entity/vo/FileUploadVo.java create mode 100644 src/main/java/com/jjsk/exception/BusinessException.java create mode 100644 src/main/java/com/jjsk/exception/GlobalExceptionHandler.java create mode 100644 src/main/java/com/jjsk/service/FileUploadService.java create mode 100644 src/main/resources/application.yml create mode 100644 src/main/resources/bootstrap.yml create mode 100644 src/main/resources/logback.xml create mode 100644 src/test/java/com/jjsk/FilesystemApplicationTests.java create mode 100644 "\346\226\207\344\273\266\346\234\215\345\212\241Api\346\226\207\346\241\243.md" diff --git a/.gradle/6.7.1/executionHistory/executionHistory.bin b/.gradle/6.7.1/executionHistory/executionHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..7b9063f0a8f35784e5946ba9e074f35c723e6b3b GIT binary patch literal 177476 zcmeFa37|}M`#64Q#+IdyC@NY+TFlJZ7g5;>k+npe<#Vok-FxSnnajP=M)fAUvTr36 zsb0!b3S}uFvc8eDA(cY1l=6GdnR8}4Gx7bOnd@Hv`@UiBx%2s)=XpNMvp-MEjEvgY zdEk^fy2`B?U;i~?m8D5F3b1AewHUF1_lH?vM)D33!dCB4ia00KKE^jWS?IQA_be)V;&u-GHw8U zeC+mWoVUI+<7MLcYaPmW>%g)VQ2kgGdY;$%d6i^ zQL?lTVopaC6csTjcJRrf_9W24m#1cB7Wk1LJ21cQ$Q}2c-}i0LIfJR$!xpCm>{=sp zeM&)&=+6okRnJ%vMTo4tAo2r9p6o%no|Z@z3vz-T!{6dDGekzXH)I*Y;n&gXskI%?H3mPNhJN_T_iokHJ^dRaW_CmIu)E9P(J z&kR&`xJJ42MQt4bkH8r7I|`BtG9BR|`j5sds%I?xSAbe-LyhlR*8k<07Z~62=+k#V zgHTS!c=HP=PxdLWM_kW!@7CJQPYORT45GXMEPBf&MY$9gpo|guIbu-t`E#phER8}%+lA(DU`rW$ z)7Y2V5$$XYv!FF5JS-13gX=jB2L7dhufQ)OZI8i0ld^JP|GS+%lqF`}>wnJUV;mqYvfvaqhQ)fwuZ0VA~&QCp#BzL$C3#J4ejRqyT)u zOOT|@$q2E6#860~MULeO8K)E)AzH=}$+3(gGO;58WFZ7_u;bkWH>_;(>VqHLHm~lK zJMVJtv;nXQU6wEWI`~L>cp$Ps3W5M6Ml3_oEY3;{%ke;H#Igd-lRQfbyht%})JRxH z7#V`|__koRzIA&HeXH=-!R3C=9OnEo1#rSWgd#5t{X_sw1sUNqqG*!FRhFYAnIl;q zS9yu2DT$yNj^ZhTCB!hS`cO9v4FNlpTlLr7*)10IKe>9)%12+D>HNYTupTidOA;l~ ztBQeOcEFeCB|Id+Nr^0CRF8F0DGWYSy)tmqG-i z61+$&B0w()l7QnlPpXtGlZ+%01QG>;Cy8X!!A^;qE`;B^=MSyv&~oUU)nl%G`2C8b zYdH7VSOg8fe7`Rn$-x|7uH+lwHU1$y1n(hmFH172jN=UKYFbfM4p(5;uyBP?tb(hg z%nK4uizID~gN4w?g+N_it>~?0HNVWMd+NwV_ z%228z6S#;gipUYNLgEU=sT9NU9H}5Y21|3UM3_~(rN(cE-n?pO#`ljs*6ogM-JD<9 z*mg;Hm`@BCtP63HEXV{!2(n5@EG;6A(6*TXSAj%HyozuF(WGR6uL1*v!O!rOB{vMY82h$CW^*mQvDs(gsZw^Yv;Er|HiuR&p8jJ z9*@9aF*6hSNdp1cH?Z&Fu4NhRno_mDI0;Sz%hQN}{R5vFIefacB`{}*hWu~GT?Jp| z4C`2UaIfR;K3DH@{**Sz-33_&>;%XRj4C0LBxqg*uE(k(FXB962u8$lnv)fp67c9v zZ@><7L_=?35hv0IeMmMkFdz|Zcf`}Uz|*oSi;}7^I3grkB4iTe4w9f4NhHXq?PFpP znkO0y`O(>*Uw8b<&nKSQop}%W?Cs8DX~06)>NU=tJ4iOS5K>5z0-0G+6_$Z3lP5s% z1V$kcD#1#MA_;^d@iEH~Jxw$Y5B%Bk{ue);urOcU-hblj1N>>(N8y(n2!N=plCY0> zoPh-(Ie|xT>&rZ_YgJN3g<)ugAr&!t6~c2wLyrwVaILqdyh$y0^`}8@{y)y|(y#)c z2IPtc*J%LzOUAvK3{aYVsY-{ ztyX>A^Th+{;8cNp^Uz8n+=)EUmzEe&AW57BVU-qXQWRAht{;lRLB1yWXpr+`PHXFB zJ%0E(w=(_s_n&^!rcDjm`E}~44Aw1VZf}{QSkSB(j*~$vR0IjAEORu?^Rhs)0?AMe z!OB7uz}o0&3cq$@Pq*P!t4d$ByS3A(JD#ZJOvn8a-jQlfL7@RVQe|0^Rp6{71?)*= zNL*4tKadHAmEZvnngPS|C<^wF^sb$7ZJuZ>ZmfOH?rZN{`{#q-H=eU~gWTV_H{G(D zp`M#;7tADaQX5h!Q3lzJ5aG^;^GXr~hj>XwJS+@{OBBO{?x2|LH&*>Hm^sXvNPe^M zgpX`u+doUv?1(|+2}=>)@G}!dpWn-ZstYnyN2dO20WaX7*}2h3PvC6Q&}ej<4i zsRW~G6(FX9lt(6-$sIjYNWmCfk9zyzGw+M9@Jxl6-~|);CvGt4Z=03aS|LGxSUu}yEQA1HV||n7#ITd z<&&*WG|HIJukv|ctKi*Vzn5~QG-QG{_PsmwlN(H=y44wW8Q6ouS}Chalt_SDr{WB- z1(IcXP6G1^D=NIm2rQ0dMPWGemW`hcc30GFA^Zx@-2eLB*@xOSs?hr3s?VOR=UiuV zcf~8+3Gvf!wHRo;0;sDzC=NIUS1+#8U|kSoh9GDHG$BSpG6HQ@MW)Tm#7)29VrB~A zwQ*#Ajioa`e1h~3$arf3c3aBv(&T@0)pT7TT4|-iOD1SMMIt~P*KnX!QDy{@;}`~% zSNMw~Mc9@gt|XdDzYW4uh44C(Hz8xg@FuI-1}hJCzv|Iews}rS3iq1Q92hPU=%m^S zAaSp@-$2!d?S;z>Qg|8|x}p#a7!ybt?f^kxC@?<(j|@!%n!7e!KR~2mD68AwQ~v!g zhIjtwgIgcIxteQI`d7lR`sr76n0#J_qbVAACdWz=E%FRbQHTNapDN-M!N{T@P!x#m zRLn{kQzcpn=kyzU2B-D;s^-A^Kj_D79P0c$#V1EI44c428;RYz!7awX~^Y3J1YJMgpjO1Sf&WOM+#S#c7I5I^RWco>bor$uNv#t^^o5B?3{D2v#^*fUA#! ztD8W$An+20gCSSJHB~nuaxruYogoWH-C0~Km*dL>e`97Geu~0M1jm7rB2gsI!(Bmw z!bos{l&HuODI!S`L8M5CpE2b{t)Cq&K<@7u=nHt@b&@D+)<*qbx6U-PWZnKtc{#Y@ zD4FJH748R|Cg9#6d5*?uP%J495JGVFI7*BkuA70W(CUnOd+_m-(-zHAuJ7Tz1M9ob z`HKzFAj)H55K6;<&ei~+v)w_TJCLKokKmutTr`R*(IkQ^84)4{R$p1=NPrAYG%Vkm`#4aI?d6tQ50xV!kb z3~m0FbB9f0hsde_?FJ7r>1^ow)C_Nun{t+D3rj#bqlTn#Ip(k*Ds*r4Udcg z^SR1Heo{X853}gj@n5%GyRNo#dvTrEpf493|8WOa2Br?TEskgf5roPCi4_i4A&P-f zY2YLjcn1_DB$oC=GhWnr{oU?j=&D#a^ufG845JBf_$ZHuh$8{P)+Pm31}hMQs{%<8 zJQ$l*z!H#Q!Dj&SS?nb4m`Or=>Yi(c&vZR%j5o?JzSfqE zrJZ0?G&KHoEB-8SFN11Kfcwi!(uxfBP0&t2o@aoU$sEDsAY2jP1fV4qY|lIm!dUER zP>8kBA(HzB5BT4hfw#N98vlHczka%NxN}>&&xcqL^vPx@Ox*Dx5%?%rL{h+;Ifa6g z4=zAP2LC0&3Lx9Fa6K_x*ccR2hGQm7bUG@u@3*0j=gBGWF6#0QwQ{jU0~J%CoI@rNSR>4eQRtkU1W=yBD7ZG zzJ0g8(W&dQ51-r9`HhJmJ?XR?QxFop!6WYnjULXYA&QH6dA?vMW=Ugju+bD6=R}aA zz@0>c)d(lSWdOE097$kSR5dRrPI9UMx`=fOjm4R}?Rbk0kI5ejpVXD zlVt^r4<^)6bHr#-GxKJ?`uFL!^{ZA=TKw|H^fk^uY|uQx?l*TWoarDc48~oops|Wz z)&k=wY<^8IXMmT3;>3XzPAYI3RE_}GtZ7+y8?z+3Tvy+?FXNWL&XK)lj^EsTWyc-q z;trxOKMo0A5I73llHf$8Ab5rZ@k104*ndFalL)Z)f^!n0Kf?ZFm?04Y-A+C7^E#>R z+xPHU4R#N%c$@R*^sGd%Fb;n33G*y2i6DpKu-#!B@hnSdkqQX-1&tICPZ@y=>v+M! zMBoQ*+4)iH-ZPapiw3S}KS;UPc|1MfYu?2`90okNe&M#1NeEsNWe_$b8i9^VGBVAO zgrwjc+_8KVW6N1sOcaEO4x0mJly^c;t|Wr(gHuwB@Z^ z?|Qn@ymQXK(z6(-Fdw|#T6kaFiXcg#B$8wEBZ;Q46ZW>ZJ`BP;RQuvLHz+0 z8dgdmz$+*Vl*sc+m^TD_tH?*EKazz^0M6Dx*95CBL@IKdMl zIA_5g4=Y2E5N8Jq2Sy&)c_gXe39!=ViNS02)2Ex=`Doo4eOgr-Gos(yYivoqiSYs< zq97--QlTFsQOs^FfK`j&(U(j+C=#gPoC012RpMnZeSn1#ZbAYC09sZEaPZ2K5JoQX zbTK$)KR2T7uayp0Zn$IZ&utfydR01_Cex;Pafk+!?F31YB#de8m$c3pktpd+8=^}ql1HP70<=Zq-SkS^^( zx!~aO8j7|4gXT62_~Zd7=oP@}0k#qbm?ML0;upB4;qb5^!hnWIC^Q3(I}+3_j+Z%! zO)`x;G)?G0wSV@7uYY^wtp|SnZqRQnMv=GJ=AjovM_(fY6B1(JAjS%WF}R??+9R+a z77K7!ld8Z&kPl9%I4ROnEGGJe7mWn<>e9zPzx~dNjVlV%)^UN^wgs^ZB7t(u#h_$@ z09l5oWC7skKrU7kkcr_=Lx2n;<9w1? z;BxUv>(A^^7m zcL)tpy(HYxASd(SC5^W^=$k0o@Q`)yE5c3wM%B;ZpHH9Fe?bf9CYv1JG?l>V%`*)o zf@U5kaZ)8n2Is(@0A@oR^lz16;YdT=9*C1*1ZBM1pcuOd)9&hS|C=>ZQaU#6HfT+S zG0rnKz`KasGa^EUnF56DaKOl6F95?P1QnPY5=2~3V0%D#JQzwKsuhfEVWto@N6a01 zPowkK4D$uI%=Rt0Q?7ZmkuAG&9twJ-q9EkYC`yr6`{WLNgfL*-LwgYmx+$Y@l!8cz zHG#+mP?o@M0AyDv1|ke07>UJIE@~*qwc60o4OvuvW*~rl^3YdJnFdWNd@#v*zy{&L zM39*k>|Y>xbZ-OXh2{4TdFw+TX^6@Pza0kwc$#k?BEOKL3Wx%arNBWf8<_GLiUdZi zX?H@@NOx#t2;?@Ee*DkE2A^kl+jU)w-jzSuZu>rr^MsokcD9@oCxio_U>{?_)CUp- z1gwF>TT(#omKZRPgB6fdwUA#itk}T}iKOpxL!X~B2t6w{KX<@;c;)TOY=x{{#Aes; z6GQX?+pwhNt4JbP#Tiu~5I9O8>=z_g5l${I(V!E-^YAX$Z<1&smF!cy2WmC@Z1$2* zx^}L~&b3YcY{?hU{Z+chP5;Sl_<-PIp+PtfMYce6tO9|*VD@IfC`lnf03ln|-B=p^ zRi0vHh-`tIT$|9G0pJ-^&PPWtqtPi;l7CG)mvSGZ<}qrAX= zD3D;lAqtr_iU5%<2#nug?S{Y*2!&@LRE&eH8#&@?(_+E&u_1UTE)Ra-|L^BdoLg9> zVv7%F)wC5OsIeV`{~I)p@v~{3AXsep&kItRb_#h;)ub_vRgz%Tz~R(N5FJ4hAlop& zeI&y}2P3sx5dI56U872ekJq)S_DIu}OFk;xR-=Nmw54QW6^0)jxaQowwd?+K!0U`r^wf5er+2AGmJm ztey+*9rEhpiUs9+mee#Xj6wg)#;2dHzkfpTpqzPZ+hv}Fg^iw-dFQ#BIa7~~e4^jT zTIc?`Oj5A0r)$4;u6x@JAM9*8rZN89_3cY^0v7hcmJRoPc>2M*${lkzY~4knQj>m# zRp0FxxAxO=;uY3(bH^{X;1ljzH)2ZejB9UrFdbO(c#ag{Mewz?GN1~j%w*i17AvAx)nCI z=RD`;hS-+6)q1m|-l?>(S&Xmj~D=gTdT!m-fXuyqHT5H$dH^2Ed)#_%#6r|!xvBGwqsrPxca`l>Qnb5so z^H=}gnd&5pgxDFj*{F1{)FxPAht%(uAAf9Bmvt<6=47{dZBmVu=0-Lx=Gy0&njn#+ zp46sSVe4132Z&u2zsnA6?K^DwnJ#vDOk99qC?qj;$yJy?&y`tkc#jXSl{fC2^z!Ci zXA0uq*D_{KUdL>)d-&t-V{PJoDYtY2pTHN}Iwe9i2O| z+|HvPbmqv-)qeePPH9S-!Vc8@u->ezs;^x9%>G6ZUqr)eSFKx+E*i6sXPtJAWr!IM=eOCSRQngZ_Dup@k>hpbz@edDK7W`-8 z-(z0wV#hL*ID+(}R0tYepBUJx05eNveqg$-|60@&y}OQ-}XW9_~yH|-&j5s3_p?y6=wL6N9jn8!a9ww@(RAUcZL6S7}D~} zP7`jjqjn@WBBUWT3M+cG+@k&M9&dHmJ9D5FQB|@eB}QQ@7rx7EdHC0z)tc_Tb?dpY ze5p-~!v4DN)cQKV3?A^oO;=3*`L37muwxxgZ&DPtq{$ykPCjuL&C*Lgyz=uM_m=dO zDD3c;zvZ<$`;gk&amIb)t?Vs!Z@}VBh{8^u>eu`Fef_?lSF^FF->@q_v=dHt5ki6C za@RA#?WRLv^Xl~(J#}1B^*yty?Wz1#t3U0MzIcCZ_dCM>cV(4_EA(oA&*C$7 zBFmC_$x@aIg`v$2YJc2yY`s;}_6pzb-ptwY>1j-+7!skd!!5TAe7Z`Tk0zbmw|2zl zZ>|n^JBw)Go&7!;ihlU~T9Y?NNzHO_VavnG-h7Gzohxqx5x=0g87kj4gy4(GO1PN%h!ayXuWzjvj2T5ooC zV1UCh0_N5~ewmgRcp-Jr;TUbcMEmhn+Fs;s4a?F!KgTC3&>%AC_vPdue>3P@sjZ9) z>#SDW=zZ{~D(fem`R&bGUD`VqMuYXQgTG1-%rAM)3ldDt6 z+Z_5Y!hV8VBQF>*_tM0zKg_-E>fKA6zn|QWFPIUvmo7B;x8k60XE75s_Zh$r+>2HD z&wI1i4{G|I|Cf>5hdEwNLfoiP#Rg>$6Uuqp+YP;XQJ035T2%kD$`x0f`&TH9QN^-X zLmRbYAk!dc>)r*QwtDH|&zhimKQ!IicV*JO8aps;cZk*sH}($Ep8TAyZKh4`?Wi?} zgF~SjG`XVbJp;$TTs2E<*Ykr;KOg^EOXJ?ze)CSkKfbw z^F8JJPF=F{tYc0*fR;hW(hFnA`AWt>S?jhkcVa zI1Lu+aJ&=^hVk^zbidY{h@Bhz?cQe|`m6ewJAd0<>BlxVZktfc@m2x|lTVPQvk2X7 zp z*t)Mc=2_vgj!Q3j1|=fTAYYnJw?Y0vK5vWuNFJb3C(PlNW`S&@Ly>R?JgC6EXn*W8|VO_nm35_4#rKiauzvD(HASaz-y^hBO@$^^UDk2PgTk{pq2yruApZ$l(|tCY$l-WLjSs zbxt)&1wb%}v#`^c?;anyqx;6m<@a{1_0k89*W&?8GSrb$%Lmr$y2^h{Zurys#^p~+ zH&4BGjBBC-yUT@nSHEI^>{IL>a&Ia(ynW zUW<$gzl@)ZeL@n|Cd~fdZpWnu>QMTQmcB)`y{g;Sis?m1iwB>u0k3%9_jj>k7iH)( zHt-Eo-W~f;hncNb)p_BO`#R@Oa$H(~(tdnGn>Vo$(jZCU_&)c4H15^`W1b$%G+4k4 zPXC#{AW(L#0vEjMVj(armIgfrE!ewr@qshj7Qg+!dKIQk{mO9(p}7RF2K~(-M5C{> zw_G{12lm=sM|(D(TyEN>AcP4`F(1>2(bb^EufNS-^Y)A(jry-T`ApU~l@}HFy%7gc zG4P^1-5^{{FS4tEU&Mje@QJcG8|&I8od7ZR zX@dsG73tvL&3nIpSA+4@sCmEt=(u#i*fnZg>^|rkYXCP0QR7Xtdc)0F(>4e9ez9Qr ziAj!23C>T&up`2z`C@$8`gE%?a#(RmsLhz%O{g_oI8J|l2s?`kci$}bc9aaj(thEF zjKmH{F}>(Wy0>xIRpD?H-@DEg8&F>zTE_R@{9+jtUWTPx8st+Q(R=% zd@#lLuFunbPbKu$)Q@ubG}nxjU~xAVedXr5(w~jkZI8^Y{Pl)u*}WVk48pWC%Y+0o zsne<7frGnyOxUxm&RX~J8Mbo05+)d#k6hvXANF@gP1w}^tY&4uk^E)e*x!kx+TxBYr44J zbiSA{iqZy6-?y>ATW)E~e0*DtyYuMUv!*+K|IBfzK}we!8r!@nW90sun>M+w!S}Ux z{xvb{H8Zmz6XhYl7(_}ap`lYjFux!e_P0CiMkR#oGU1naLx~gtZ-Nw;Xm9+bdF>^6 zE7ob(>fH}fFIIoH61A9VHGcFgb7}e`5ww8#75OnGr^dP>p|{1vL=@kvitSAnYCAGA z=6*?KWK^6Af5vNnrqg-;ENNg-mgJXn3Ppc_%3(6|3v#J}xf!AVks0r4IbzVc4g#Y* zIbvRB0R+r@vIpgQf?{Amz+**JxpJw?x`V^EgEBaYMD3%HZxrsdMyfbNXPN05P0QjY5Css?H*{+p?k|# z(eKs1s=s1J)GOd&5c#w6GF$WqQlp^jx$fOsyZPv^WaY^@1qy1Fn;$HKnUCI*GO^m=pg(t@Ws2|Yuj_kO|$Vqe~tZQgJVq07g81i7pAP)$j(!!QJ~N6*=_$g z^Vp76fo;o>qy2S`QP6izf`;1KuN|phSM0T6CwC66c4YPS>z5TC8TIWIj>3^x+nR1MJd4V3RR00~e5L)lAcuDB%lOElF{-$71s?5wGx>IiRZ9gB-3;u<(;R+vzvz!* z)d%L+9l7Ja^ZUN-IcG36d)Q(}DkhER+0=M2C;E$8_;T~%GzK8pwbGI}78?g>udMu5 zaYIJ5Y}L9$vu>?gjsuf}#w%N*K|!A{C*T;JBNpVz{kzKkto&fc80|u8p`|xJ08Q^* zvmqMBqb2e}8`T8i)01<>yet)j1uY^Fpp50vq$?TB%{M5$;pyp$pPO= zNDg?OVsenWJg5tKv3TmgxG*_LkA)o5qsbaaj7c%S3zK4mNs5WFzc+{w16c}45DP_k zKST-Au(6ZuhS)DzkpKUQKp$CS(sBnxsH^=hvc?@-b!(>G0FgD;e{Wf1{i*G39t%Z+ zHP&8p!8O*t^e<~1f7T<)Q`9*hVIm$;-XiBavYk?Kwxi!4MmeIHB|X#8U$LP3++$h! zEbXlLf^LJ;N^0~;yLSK-Rc~v!r@JSp?qHY#EdlOt0CNn*fnRWRF~=xIsvj7zTVk7E z3&Rc{v{r?oq7Cs;(P^i9?Av22AsDb*f{-J0zu@Rg5F`t^ss`YeXyNE&>u91!2N_=i zh|NG+7iJ0T{WplsVa2?+yXa*-v}y?knJw|R$@X^K$V(K?30hcuVCl1|ATb5fzY?G&n2mXCWat=G|xseTtlg ze;HTe;(uJ2B}VD}1nUtI;ClFy2Rs$m2}u~d7iI~hSP&+=5mpk# z)MA1#io>ID5ze;s+y7nI1>9}vw$>+b5JWrN?Dk*^HInib8XaF%U!hyGw!6Xp>j%T1 z(W{-Id6r@sM6#61i?S@@1T6_1Qbh)rDVh)zhDW^0CYi-ed9;4G*`nWtZCtP|v+=2u zr-w9ry4~^}Z5_`2Nu%l7=$?A7EJFMBfH&0XAmApws&*FLq=)coCU>LeE9_iQnW0u^ z=wG+y-=_e4!Ap>&%*hC`g2Yfrp`r0SPsli>&80m3XZ@M2Y#o>Fv{R7Vgj0stg2)R)KM_DvK}I-@ zD4L{kmE~wj=17*uRbJw0N+M{6qj-v72{8<-KGY3EL%??68_xXh!Gmwz++@ss4ZQ;w zIlr(+RF4Seb5Rn#su&1n2f%hhcu0Vg5?REkEJ-P{411K5DTR_%RiRY{@i@s6Dn+s! z!Gy;Fh%hb$IF9qAO357b zSAX@mx^Ftab|tHddvQlGk>4&MK$gDJ5kz?;(gMyYDoraSC6SaU!kJKMo*_92=Q%}S zfe?gp!Fdy5yz<2JLw5c1MEy6~4g3Co|DC$oxgp&cD~3xiZaF26lwi3;m7!EcCU6l~ z6p1slT{ zd}6@h2Z)noK_)0dkX1rrX%TS*Et0eV=S!j_UPU;8Xi_r3*SHD{j%EWjo*Q`MmFN3b zom;r@`0BuoL!EZ|OC*6;-(}#}3>r|wUBw`tq7}GMSrHKmMG_>iFp*RkL?D@lI~OUk zNpubB@D$Oo&j`+%x~%hq&O_~7zid4$Jm9p`;Ufv`5)$*=MvD)h-=sT_%Ph^p-6g@T zMoOeaQ5?X}@^H%mb_n4TN8z*@MfbRgqVW)WEveY^{iljvyRl)-UDs{wA3g zz{uP+mH_q*?0dMtScYSfs%n365}XE>rx5}B2R<`$_;hPaV9pQ?`N0X5 zJ8u3{yv{lHs?1YqISt{r8yJ8Tt&(sWc$|T4L~;U;fOpBfO3JFFiVDNf3PUPlLJXpz zpK$Lz4{-B)zPmVo*T*w`%56?NO(2q;2GAgKMFVn*loh;v=Pp|>6X4 z7)?5A)bGOpqbT&N_=@|*-V3szKkkr7xN$%?{o=KT~u z8|<#A*+Teb{P}%{d$#YBYkt=7ogQuXc${|HYbJ`&Oo*S+mnjMwufV7>4~hd$!KH<( zG^p%?%n$@kfF{I9NJcUaa;#}cGI7)Ih6H$>9{%>+wrA(x(D{$0AKrGi_f*R9(&T@0 z)htRY6<#tyyNx9R#BmJ=S`}qR5IK%vKzW6~I8uad3F1nksr1_*JXL7D&N|?yhW(xXl`u?H`V}1}pO@iiiUw}O zv64iKJcCmdV!)=Ria13uvM2}?1!6lDvl7NsiB=--Y@;V1KD=E0Yh9D6e;pWjyYq9K z_wq&CNOUV!jMc^q23LVXpkz=y$nF#lELBDVsC)z`fyhgOxsb(aiZhXmu_Xy$%0YNPT=to9_$dl25gZ3fibRn- z4|fF#3M0V*QlcVDq=+O%1d$>ke#VrE*6*dCzWLyd!v3RP`rY07;bkvRuq8hyYx$-z z%`90rs#0DKZa7M&Ia-DL0jCMLH%OkNaT*j$iUWiYoIQ>b&AcJE&U3S5-L^`FR;SJP zjh>k>JLBu+LkC~m;igtQoWIx*4Wirt2BAFgFP*IcKxeyyK6fBTg&)CXpm_}xRia4* zS27|*3QVc8%8>+*R0NtNXz~&#N)*TQI{ZLD!iM6&K8jc{!tuadq6Y)5 zwZS1^-+BGq?Te0#x#6Lq-dFFMRqt=-4x7XdkyHQM=r*rIiZtbw)|Q@@0X9PB6onEv zxNgDzj(Aof;Q9qryy1~CU|uuwfye*zaMY za{g|2F?7{j^+RsRV4r`0d4Cv26DHd3?-g+*AlTZZz{+3+VsKR;DS`)MvkF)OGAuOE z1o

5_ilbp*_`P(_1T?*Z1x8dW#;9;&qPiciL@~8OIo-An?Y#-V4ekF7h}Bj86e} zrxFx+qHu;LNKWM778O}WpapQ~8PYZoA`t>d-a0zwbib>y<-c}ow)^Af&e@W&v=a>O z$4s9hfumCY*RA*=g;(>S65vzvlC&a&eG{}3kmniTWim(bI0#n+I00x$1=}-ElX%={ zP>8kBA(CG?cyRBJN8Hf#`hhd6EF9LOw$n~K`9xB@g;R?KL0>4YufUJujt7arN5LYJ z0^ZCi6r6nUt1&V-1qoIF*`9^#iQ&R#l#ntUGhw3B(ee6j1NyekYTo1MqSfCPENW-V zwtg`<#$g2u1a@7L7BwaY{0-PO90;%yfk6m7n_#sdWr78tsIj?p5i5c8v9r&Mfj3(g zRa#nc;IRL`ziz$LuA@FAdV4fY$TJAery+_*Dl!B#_68eGp>a+GDGJ<4G}v2k5?lsg z)xwbk202x89pWUX3ZRQvr_flOx!W4mcw*kPIa6A%&KUc0>$AUp=={OPJ*8QUl3-xy zA|c=rhu|7gSeju)Lc4A`h6Wh}r$iP0z_~`Us3H(8OyCVwBns|Bbv??HJ?{!sSlez} zvuAfscYbRFZv9+~`OsjrKn_CB3G)--frDunO<2(Ucv=Dk4Lv#Ts zwWiAn0HIRF7|ju7mJ`ktx0>ytkgHtf{L z`^WA{?VW$vBzO`|pcM*5g~2#(0BW`fwm7hb!im+42@D7zpzU#>I*62Zba_`#9Qv$!OJ z@QlM5g>A&METP3LAYgJdQb49=1TL(Y1`88`e_gNdp8D?TH}~)O_{IO!`SQ<~oyXGy zzUC4Q#9_dLzZ$N1nS?MVQ3eS~q7f+8BqP%dNk|IL0b}5!xS2LbA|yIq!B1INxmK&Y ze)&kKQl-JCwisBpH~_-1L{H@CLAjmyM}`DWc^EGPn+6=I2v=Bb*N`em<6vUL!EZ_N zV0u?^U>3uzdPJDcu%9Zd;ZyB#rB2HztXc9sL;%yj$08V36vz$ z5TzyYnr#<>;S*w9aD;;)jbL~XGANd%!=h?rqD0Hm@Sz&toH%=Z+X_nyuR7*_?QGN58C7mb#wtauE;dhr8rnQ)D%RKgf#wp+jBbbR5Lm~)PBqf~S z2@!nW;O2n6Ly!;?2wMwmXK*%1Qo$2orOy+C*KM!&diCKx&#YMV(w9Y?cg-SO%0yzk zKsGDLiL6xUM|ZxcX{zAHap%Fmy40#InRb*VuxxM&IBQgim%*Y0hFiF+2@p|eS%D46 z%90R9F7b3RINoq_Q)Td@ zfsdS_cm#?~k6VU9-l9>%M6ApEI}FzKM;9 z*^r6CgL1)d<~8gU`VU&XMZhNyKtZnnz9cX~F~GhVToVw%R}P1V1tAL*Z$hCN@Q0G1 z#d5sNNopHS1|}qg7DDJ6h>O5N zz=$TWplt}iO-NPXA$AHURGbuPDHap`N{&Y2uQ^qYH}Utq@db9x>+f`0(bu-9ctIpk zj=30=Ob{S#@suoqj3pBgupp=)w2*LPGoYHPJh-40u;Ik4Dawgig(r8Hg0~kOIQ;r_%qCiYG#16|^ z^os!82E0r(L?DxJM}s8KgY!Awl%sE=XnW3rq2!)nx13lvwXo9dg=@F|b;>}!(myI z_MdH71MlKIV*|X4xIH66ZkQ=R3=s#69QFb*Y(h|hxgkNs1qHSTgz|&^34(>eb{S?0 zQFFxHp4d<&L5y$_!iP`aBf$NJT*;6(~xPSNr4+eIzuwf%YO6v}Z=) zCS!0Q0URZi6+sl~AB2{Ra<=ZBIw&V*0G$)$w$kcywn?F&oPfgnw1RX07PYvD#25h|)5(E&kRoy$N z(O=~$R)&BfxXHB%%_-oT2~QE)KZ}=+Yp|gZ`LDTu-G{vnTz#9ZaJpnpOzjHS%$t-K z*bfB~4EUKL3rGTJeXQ=nm#rJZ_$ZYdTcp3V%nWO zer@+lpN+TLa=L14$Kd}4jbq%GS|JlyZ1~R$QkZrMc}~@&F^yG{V0OXb)JhO^LJ}a` zFu;8z!|@3twObJW3qjq)wfyEA_C5aEr0VN7F5DN-#JQR^M|}3z^u?D|1{}5&KXBdBSv?orJLJ{H6${Guyv+08 zu+g(J?>tvCXX>$$PxKpE>)bz=N%kA|bnUm!b#J@jgPl#sG{&F1zI}<#eZxN3vf;iD zPd`{!xnu5zt-B~xYBJxj>bo7|)_%P4sn@?NL{kTeFOH*ClUkBpr>^-Qx(HMjSw zEuCy!O0wRtRqJlsz1%;(M&7Aj+ed63^LHuAdBd7+?)b$Pe8OGpMoh__aqSHcmcooT z?6WExpBp*q;PZ-$WGWmW3rbzS8#b!Vvn#t?{lzuQ>b<^QI`hStbgV)+Pb@vzZrHJR zn?HJ;By_~@IlW;@kM;G_aSFmX7$Sd)a^0|v6*s*wG~+Da=fU}o7djmZmV!(-Od5<1 ze>UaE1~qPf=q7PgOHUejYwGgcu(3VoIX5@Nw$!cGn;rE|rL`qI%MGh}`=TCaJpA(Z zlMmhUN3UHQFXJ3HtY~U1pq8E%+o>G|=WXA+Z+{M7Q@KToYX zQ!?}0uwaLB6`p;g0XJ%CtzCQH{N~$KYjFv)zltln4cmF9-sjcI)oZe4Lic{nU;TUM zWs%#49a6tre*CdjUDmPOnUme-wMjKrnyc9iV%0uFQdcN^Sqo;3;(^1cG~0o6&|X`~8kd-}vx$b=M8tI4=0lfXgzU4Xd^D#~W^*zVmQrVN276M`sk+ zk&%-*f>NB#hE3Tux5=YFoZ52an$DY6)Ov7ismf);`V~zbe&;Rk^?C2la*wyJP<@OY zi@Bb0k+w`WtkOwl*2rn|SG26Q_TKi#)-5cFd2HBEI zHmv86UQhnI;U4D|V?Q2T``#ys(wM`B?Wx#3e_zIyB~_n)Ze`<*jT)4$3^r`-H#0Jp zHpRNkuDW6)I#v5KJF-;r$R{(7$ael3wrj)ijgK9BrPIh?hD@##?1(PA>@{rtq)O+{ zbn(<2aHS)2;@VHf*|Cr7H)(8Ur``w6l-YF|Bv#%?P3{`jV*l)8$FM0C+x2dXpPsN- zwd+<-lJ^xAs-=ZDq%3m{>)m?T;oELn-TIBsa@rkv?a=F`B5w^l)uqyt>&HBtS^dQ6 zcDdDdRxSBiYuJ0@n#||U&$+!hHLCOWqueug9a(Y8T=WJ>ZO$6DGkaC{Hya=HefLkp z-yh3+@3qpIv4&l7&*mo<-dX3~n`-UdI^~(~o=y`3OH;lYR_W;6iRE@4{h%{PZm#z0 zk8?^>widI`i>5t zG`_TDsbMocTR%D1g`c|QmG)Wn&r8)xSdJQ23tw}z^8fOF==;li3pX~J)3wxRsA0~# z`h4GF{KG?*1^=1&_n23^*fDk`4qX11oV#@8r(sKvPi^LJ+GY2*uV1(4M3ebL?I;V0 zvAV?BY1m6W29LgW&5is0O&s~X*UhhC#~Gg(Lp{bkow;e)@)~5{eUCPpE7n@l|77m^ z(RT0N3uZy3F*6O@w*8aU4OZ-ZX+cHy_3Lvg*0IacFNlo3KB>%0!v;3IaoeV4g{Pi7 z*m-jKW4=tg0^tQwNNH9Y_N{od=gQIDZ~Gv4eDht~Z!Dh*fh3ZE78Xb%kJ6EohIJZW zKfBcjnZ0W>h6hQa&2Ca^bto zmWO}cS*_{bTeqGY%a_`0H0-bYPOY!=%isYY+;qj{pYMA44m$?-^yZ>rOPc(#!z(}Eac@b_M8gh$`CDGAvk$4Q9cSD(-pbx$_XaH9JT&a&seZk$-`DT^c{Lk* z`VG6{Lp#xJ7aO@0nF?Pvx&#{b`r<#hZhM-I9B{-x2=5E2}(Q zp;!BR7N4;b=$6d!n6eBs3~g>u`{S-->#dr$SNL}KX3mbARAVy5kbj09Zn%*t>J_fiv3{zx}^@6{b!7%JFXv<;`K20AjP3y$fsfb@rAkXZFBe zyX$Dr=99}!`&Wp~Va2?+;~Lq!uwQ?hzvk^3LmKs8b@G|4Zz?ZJy0_y-7Q>ySHENH& zle8zN(tjsuukm)&0!`sKspf|4Gd$>ihnkyp?#dzWE`DX<3CGJ(w^gDcXNw6^t>rE9 zYoKOjn!p}cq=SDq@BRK=4aQfa=KcPovL*wcCq(x7Hq9O+R11rh*1+s!Z ze-@M;kaK(mid*Xp>(*KqL)~SmAS*`+)hmfEO%Rrx;6tAADsLhY!(4Eo)^OoC{rMs6 zEGpc6v)J45b^>7kWrnn$=TOu5=<^(UawOd=XmqQWd=AHpVVZ;=7FSDm$>$A8hn=BR zrpc~cSRHBGrt$42(3598FlFtLIlUd0mhK4$78lV5B_i4&UvhU@iZ;EmJkZX*MSmm@ z&}i1fS3l}=bM4q5zq$KYZmui+*@)ft$lS_bZZ)p=+ zZ<`#SB<6&nZ!6|0!0b&V8s5HTO3}f${~XS|J8ycP+Q9MO$VR@XDbjwSXqz@r1P$kM zo8{-{WI=-v*c2xCUrgJ!f7aloH;9?jPk)P=^@_Ss{$2C* zX08Yw{=}%QQk0wH!m8GtiNE$`&0GDC?0NgM?RVC5jEnoqw<%eeI54#6U}#z(=6iG? z{uub;-S4&SIpn6<_@KYWezL(aCguyNF;d2X0Hw?%sL||!ZjCOi&+gf6|2Xs5j#Yte z%aEh}b&gR{zjmg{ynAV?kj2`r$u@Swr;E8Nnafg^%<+oh1cPSW+O~0K@!?;@m0|r3zNWN z9ekM=P;*%-s5#zAM4RY*dMlAGld5YjOW8HYYth6|(4e5tmlLoOz>a43#lXv4milat zDIv5hU$qn1l>`rc=YSv;G_ZjS7g||UP+}Kq>_X=ag(3-36`?M$0m>I#&=+Q++s9`5^D9I9< zjlc@BjNM6q1jDFMIh-VDUgc!yoG0=k&Lb#IEaEr~)%~H{3LbsdB6CDQby>>8Ic8f> za~EVqM%am!z5sF|S;#<;L~z)kTL-ktq-7PVp+l*096_;ViI7QS7LM_^lD-?1Z2tJCt&Nlq(vDLBDK9D>cus1P47Vphp#S zw^T*w^@Ky;79853Fp>;C+@cSoK0X4X%TmtHF+FN`#(g^ta!Tq--MK8a?xN)scuxdt zJB0y~EQ}sFs>@8!4IH{Ha591}7cz9afbP7oFfs?NM|rJ0y+A?_OoEk#sAbVcN5FGg zs^B@MMiwRZyO(i&JeQ?Fo?~%{46#aJRQ7^Jc`N-T^<0*kdX9Phvn1rt6QRwDfxFM| zX0;YTe5eDfCbpN%%6l$L={*Q_(5esRYS?H=?Rsa1R2vX3X+1udr68YUfw7N6aJkLO zfS?&_N>`Uw9a=T(+DcnRJGqOA3T7lEgc0-}^=hvGU3#^)=Qzc&(7IadnF*a_34$h| zoeU!(89@(X6+zGB5Z^Np(eEY;5-v;aKF7R^8JBA0HNDORSl98uDycUp*RG9pRrqsR zO8hzI8^}k)pc@6kFlb9}mr2DHk4SYTK$oQypktaT>WAK?ALmd{Y9J_Zb>j?8ketYgND^5F8tjTp)C^W= zU6yK$rgdIxrfmJb9cedtO#m>I5n3TV+qD{9mST;LX@>UTR{U8IUJvFQ?N!?SVy84q zBBjkD;)n%7Uno%P1Q%2rR<~WA`Fo%hU(g?+YM_f=Bkh` zOIb+3F9d@-QlLz8RvWvzR8)<0S;|I&>D0i=&`QGymHdK|E=xs8xOK#Qh+`~}gCG>Z zl@l@e*>%3h*$blffZ0BPU~z^}1xiK)0S)7M-~kjtaU7%YB%?x*4aC^U3Jd;*1p6pd zuu?lHU=NF{HVKZDe;rXet5LcvJiO70 zU1_Rk>9Q2Gbj&b#Ua-)Ln%&x1Nu)C^NFxv@pYaf`171CughutE%=032B8Q+5=m1YM zBq1p{C$khE#o@I%tPq2HC9d41>CbfQZ?%rF!^baKIZT(O9;V|JD==E!EB!)cv>VE9 z)wU#yi3;-}k|_X56LBkwB!QA-T7h-sA;1SA7T3ZQaRkl8S%Tp~aHF7^J7r4Tk%_E} zxjaXMzJ$TPZshVz9w`w0LCXhb#-2On;L{bF^r0 zf`WJPuTEFJPM4)%r{mQmZ;wLVj^>yc^-EmT(`BjZ=~!rzAq1K`U(`$zuww2!_*Yjr zjE!I?3Mw%*bWf-Ger;DsS$PVmkJ{Gr5X>uEL3YKY3nHwqa4JiP zx-2zB9W!Il)Y(mhEOsUM3u2hk3ZpJdiBZS&80=6^)RLz{0E|TI6jS+8m!^QrmzCRKF$XOX;-ILBN(&peRKk(*pmbHJ(t?tD(9q zPV*FJLS}G(Hw`(4Jf$IG_ZCm00cOiNajGB1ATZCfG{lHPkSH!ec$K7pwkI(>MG2Z7 z!E>Y{a;EABGbGaa;>)Cl?JxX$DeNRFNb&MP?{LmLemyix~b3Nw)EYSsfF@Z;1L{Y0G4{ zB(j(6G<8ds`p%M=j*i7=quXKQaJlN4^6AMt$Kun@OJ07tCA~b=k>D0zx>>tHi-U;q z>3UP2N{+>6l3(WO;g;<1%Oum=lIU%RHz!FbN?iiCC4bwFcAErRJ(NA=Y1&wPmbM)O zL=wp3(x8phx>TlNWARzor6j@Hl3#5{ZAe0W)9;_^3~EaPwH;gX1z-;`ZDZr4FhSaq zA6@ElpDn4+=~#tu;%$2Jnk{L~={N;p9E@F*qLgJz#VXaYnKwAvq1aHFZhH zmYicdajZ!wteaC(lv-@bEWV8Mhb`&Dr9T}8e_Ye|Sr^{OSaTE$tcQk&#z z$#K0blUFUdt9E4MWPX+uC!<<&QA<_AsU_dkj>TN(pJ_`fwd9nR#MDts=ICXZBWg(z zEsaT^mYh$!9_u7g2AV4)CjL1!DV>&#PCK$x@+hg4G+ zyMJ>}R?lm`8u!Q*UF{}uBw2_^wqBetm&$BGOR`{T%LBBe0hX{lKTDclsZZ&%Wc1lF zc7e&TWaR5v()H{p3yHD1#Ho0eOguZz_{13MJ_<8BTQdo#I=#-4U1#_1y$K`Sx~G z!z`I$c1d5n31F7|FFS#5$sCU|PJ#PHzqezv2imo6)wP?aV`~>SciJ0`n_V-#&C2~}y$en@sqGjQ z_3QM$Ji)s~zuX^6R%&gT9S2i_cutlS@X9&90>!PutZuEvG8FXCf|ZPnx|}I()A};;2=sR=@MIhz#}jdkF<=l_cceclSN_+;jeC|EvcazG%^Zm#B~) zTu6^Wd8+3oD1RS!bK8&%ey2`QTZ80!2XBe!D3DZXT(Of9+hJFmAV-5B-AZDGO6_ausW%G_1j#k_{$J;ljy! zb5wg{dABVNkIUQc);8~E`L@HuayR`PYlgNSGx!<8jAaF)q#VYLG1>MVi0~H^Ca@2ZrwU6P zbGPOvW{0zM3}_T|tlPr;eh;IAYwj}kUq--mvGjHj#366bnc%oBu%*oTWhiUl>gqPb z_A3LcV@V_HHYHj|nlyStWO=tVhpKR+(DoY`Qr59)9hck`4YnrBQ>|osG7fYkn#7es z{jDWfIyc5hla|uzVEl_F$i(VzO{5`=HRb)qR4#~U`*5gJ-hpc`k7ea(A7e1EQKrtZ zkzB!g+S27I*(`gOVpz7h<`9inmz-)QBS5jjP5TP;yycb&W4Jbijn*5rCcQxmao_W7 z1QIGnt7G7E=mYpYS8+>lcv>GRiHI-`fhh4>hgkQp*q97@osKp5!76A@1_+7^osR!p zeb0g4d(^u30Iz#ZuNqa9zDMvzK0uPE8Sw-Cw!aS(#vY0gdjM>^~@RsJ+B#d#H6g z)8F>L-Syykx5PRXK3HN~vO*r)mVq5)46`+J)xd}Q&cv5VYrWj-WR{|9$pXiAu9Poa zKQ=g#MH0jXdE&$uTY*Ex+b(7-op|c7Zp5&u9$Bpg-#d(p{F3}rNG0uImYOY+maVW; z{ujql#KNtmRNv6ybvsT%U=6lzXczX|-rJcwhuvB?ZOnqqmR^Ewx$E(XS-E^JoM&@70LwUn?r?mQt3OT*)35KpJh|kZ zuisu~+@t&izvR;&j_C`|tgvPX3=qcx*}9}u*|dM^gl`BKI(}l})?aVE$vZ>xP3Uq- zj2%w1=A)COU5rs11)S&(wohzDAO0?&x?j@fMprWEE{FO|c1#fy0xubX;tG_^7ibM1x*DTb4Jo9W#RG}&5ask9593<{i36F zT8je2)(0(y)E>3{_SAZhYHttgHe2w}VMc!--8)zB3Y@}COS29mo)Zh;6I;0(Zkr(9 z&n87J8+&hZ3StChHtBgNqw2%1cj zQkk40RG{urNNI>&Lof<8@a}B^M|0=m7(97I;;|`#UB28h=h2e*fnP@r5EgCB6@IXku2Wz~xFQ zKn9g6H8eD!)y-c+&u8H zjeRaZSl75e4xzU5={r6*vIW3AoQL%iA^&9uv;SV29oS2$^x;>(O2!G`HayFXD?{D1BvzlIsrinj|bH za4!-1SI|7>vTl6P@Y@#!tp-#$C*))LQ9uv43h$NAT;*fU`jOIGL>1=)zC?%~xa4@X zr{#{%$vz*}2AkMKSnLpABJ|ZO|IV|I%vu|*IUPP{^$>$g#*vEvSt5iIu2q(J(?>NW zDjYGXR=ySTv1=)4961@0B|=|TxiH{Vw^FH*qdM%q+I#jjp$m2@=RvYWC}2zItp|~% z<)i*Ma=2s1inNfA>u>?BY&I=(5++N8Rz17WGofr*>T+O%Zb?l?R}s2meX);f*P!b} zsCLy#=PNf$f7ShumP=0@qQixsG43m$J)!smzeH$Qef+0B*}srKL^bHSd-$ov!lH@% z5~1&(cX-yqZPwt@@AMr^t*&l&`dKz#ELLGbzeH$wcIVZtBJKpXa1ZEHcH;B;LOy;^ zoIy!0OJA@m;Y_h?Cl<>)i_!i2Kr^RezeFe_F}h;fqFtjg!w|O(YfxjS*NZzs*lJ}y zPJn(YOwU+w+jdTrgkW%R$dpkyuAo>NDE+j8AR)M{f+Sh^M}?7US_$zG^UKP7nzLtR z(N^7$n&oyVq4geRqaC+I{6-dkiY=XNlJV|7NGUps$NnF!Si7nl6yR6_9Eoelcb^%Bi>{lKy649&U#dv80L zRR$3YQ)>4%Ef{dwduZpKgB2O^g{SD?21YJL2WY?voR#AQ4sl*JxD^x+E-C)G`s8kt7XwUoCpHBCYe)jp-Ab@w)yn3ji+TmWj|{ zwbA6iGFh_5C&X|pzTF04Q6!g%(4^8M|73Q4qgdZy=2idn1675eA-gP}`C1(5Wg^t3 zQoBPN!4xXsEaMaey|$<~%o0i7T=TntX;b6r8LtzoZvNmtZWS|W zdnq9w2t$5HtUPkbhbrm{Vw(uLcNu)Brg+T!&Fe#c#xpi86u#wgEcv85=5u{Us5DXy zNRDcang9cSTBU)Q^E9Q#!N!7QX^c@R2n~b?&fACiNRx5PM|FRieOc^rwPdwwYyFYNbl5Qpy<>P0A^?f|Su9?`xoYAW(A-n#h(Zmj}!v$is4mY>8hfb!OWy z8Pkk?Yi+O4Z@7>z(=8$=VN=P02~q~(Wn(l87U_KT>wEIVOhXQ zpc=3g1#fUE6r7Ptr6i8OpBO?|a)3%eLyOStR^OIwEj_xnW#>%KS%3Bp67oe5SqdEs zzA)epV12IjoevuYDi#)iN?h5&t_Xub-z3WrQZ=E#Gz3H8tV)BEu&}9AN)`|etW>7T zHxI`uY|;y!#6Mp$^0h4ZUq!;KO+vn4u}Fy74c;^o>rZHN=m&etLoi=ZH{i5PEz>Y+ zj8IZ)rBWp$)uddhq?B@uBDsj7G7MMIGCcoGxDdNG)kEDE6TaUyV`zr2ZumEgn?1hC zOH;y4V9w3QV2Y4ff7;0r++e3D6-9uN7psB>R}ui_S1=rVOQD3=prATY<1`EObmqOp zTxsp2d*kKfdDK#(~2@IDrxQxa%6opA_sbD5ron0RqvXlI;4DxP=;sc&E?{S9rNg?-m zu-oa|N z$NG-B9TPtDLOAcj8i&Lgp*_LJ4VDbhXjn#pS@R^7C~2_d)3BIEK`;<~LCp{(tD$AI zhE^&twMK)}8XRLZuwK|x0(wnh8>;%HHQf4_)5xfQ9%WrC88|S&=jj-6mMMX&RxM70dN%nZ=qB~no1^9XL zx>bY=!=ix~1!-yAOTT6VYb_km!83Wv;Gg#L(rx8mFEi@|PP`;Ngu7w3yv<>c_;A<> z^YX>v2bD?y4$9RGsPiaHL#b)7p@s-gu-VJt1SY2$83duEDdHp9aZ8yU@)I#>N~bK( zyQTkkCjCLD)EBFH8BOJ1NAt#Kt08Ai;B3UG2#veYxowX<w?i-{ktj=7JVi5V3kd|BFv<4u}*wDcer98ejT z@IGsNv=UAQjf&9Zw1}Xnnx5iPTT@m{Ua+u=Q?{HOuBd&>$@$0?s8JExw*Jkd#8%}_ zmgs$ZE_SoZGG5z0r+mr(3dOE6;zTVKXcsZKX8=J_Nh>G~LlBr8!qLeoSh_Hl#R*!i zk!wK1VYVx>-olu(;1nH@g+*A@w*7&qV`x$Sjr4fR;_x-?g+&QBDng3D3O#>YoJcW2 zzCC02x+e=y@VFV^FrAUwC@sUrTI`LCk>GO=vMVl8fp!ywS2z{m3JjKduuGCMEP=5a z&}OJfIDCR*Amxw>)_AM9Jz|=0-^MMSrtYnFHR6l*wH`WU6q5iSiv{=**uL0hDf>rO z!HHAIDU=xCa#dg$#^Oqr2Fn-?28D$~4^1fKz{*uBr5Hua3djZ2NOlF?V*e`3Vkdcq zn2`4QvXRp&@jj+~Kv8blfQ?q2GYbI+2o(l8MVw*?4FdrcK@|W|!x<98C`Lho862n@ zf%@yH^0nsSsB_+0q4VKtepPz~Crj!5a}K5o@ADWf+(i6P6*xSTMQ09oemFEb2nbS4 zsgNl!My&y3J&g=h&p6Hr4Gf&$85qK3)r(^_!&{gi4At8YND_#gJU4pfD27n~WS} zH@M88m6!rzk+KZ9gj)uZy)CS{IM&0sd$jtLdgk;wH#$dRO&Vtk|KK^4V7P?EkOoFe zMsZ{>+iUAw=Csx@Wf_RTK~cDpQDR`q2HioMkUw)Lhhp2WEiQYA z{lpzNX1RNhX?!yBRZn3$k7Ao!$Lt;wUSfI49i7H8%N~55`jst_cAsMZNuQFhAEyFeMWo72K=FZB}{HE|DTGYq$ z^@S=aqIMy>VtC8r1*mOZguND_67iFl#@*a^9oAaLMB$)HkFpcJTF&Z13N%%%G0!JHqS6-|?scEdMGB5Vgupt2jKpr8{=e*>eCzW7oS|)=STQUs+_YZLLluDJj zjFBth6{!N@5KbJVRIYSLX)dYNk7HV3=lb7XKbDqKz!fS&!KHw6nO!iE zUvANE!1;m60}b`7XT82qR!EX*$8Ltfb^4S}2?a`<-cV$XqSB%xFo zB?J3EjRMzz2180p83t?>AjGK@PO%!;yVNR-VWsbxc-!)VBdkMS+>sBBtGeM$uTF<{ zp7l*`DVsQ2l{8q!v zicv56o}QAK{BJR0J|W-Cpi{@Bvzi~6GCy)*{xL1eMoYFU)z&L=*hU&~}nN=&*v znGs8vEx0Vq>dAJgj6_HX-oapr>X2y$*vedb}o*!2fz{qZuuxy4T@n6gPHGx zK`jqjc+OIgWE2Xpxq}-thvm|;ZTf&^g~O_u;c;|oyxTwO0o_*$rgpny;^Q`5z+uMd zWY!a+hOu{loqw-U#U@|ZA(Q;YF4&ixM|wijd#?~?{tq3i<<(!A^s{Gr5$8N1?NU9CvVYGy8;Fu`?W~s)oJ?=!&`O-jc0zYFH@7|= zu{-2|QkDI@=ZcQbuGN1+c0vdDD6h%RdEAUJo)|QKYj#Lc<~pI&in}YmoN}+BBs6I4 z%>F@oz8hjLD|u&Aosc0)6jnbWbXR3M#kGtaqv$XM-B%-RcAF`dxM@tQl8YgG!| z^mM?>B_;nFS!l`&^Nsv_$`pwUh)&4py{G2xtyyPFG}R@Z`EgtqXZKnjrIQtkQj*Y(oCS_g(^%rLzj@>$ZHP?fXyYSc|RdpDRk=DYUM!Wce>l7j9Foy>AV z^Up1BJ@D3xWA`fsAKg}^`}AT(azcaSzDsCUZ~K7luS$#xa4(OHdWn5;u>gr%nM zA6B*P7+G;7IH3z3y`nF<9otlP@}wOtGg>q%Ui>DMetn@^nlB1jQg&Mg`=aWvd}JwZ z-sbOm06HhmWk7<-85$JwU`nf0s)1G@rB&dZO#-F@?o{Lyu#Uj97L(@oI>>Q2K<5r6 zWQ=(7L$}0-Bj?pL1+gwan46IUA3_?rjNODv&1)%mS!u3Y=>Z)M+-i8S!e>WrLI>x1 zzRL~~dk-lm2%D3Bct$bjHlZ{Tb7180riZ7tRV}L+7Vs~hi4*RzO`no!jJjhAPHXJ$3S zPNa?eF1;h)lYr|uO{m_{ek*@WIr?mG4RVY3)*oi^EvoA%O-N5REj9g>IP2uANgk$s zcV&DRh+HNxHj5RPF`7`PMW++zycrNwJE6vkQSXFg@gy{%Qf)FvuWeSdZJjC?Pt2ci zbDWFBeHZbWkmsZ2b4r|jv@=+RWqM`ZTgrEtE@&9Jg3g4ldGD&f_>1y8QYV~Gj6LbD zD}HPy6jwF$r_lKxD@7fry=;;GFsV3`nb5mC%c~EXUHR)jN8Q#xN|-y-MQf7zO6NVO zl9RYhXp#8D;Wr`b?>7C=MceQl<;8dXcO8`pr3N%0hRSyg+$euu;py1f4fx39{{fQ; z^$!?-w{e|40qcI%1>RqEXLYe4GNBhCo?{Ls_X#Wi>}6o2*V(dsO#*Y>H07|2>_J4F z#A8BdBX;-tvE^<3&A0#iYedxcReVmOwliE#aqXwLoR6%I$hcS`Q4oL}1+*tP^@3jq zj)7A$M4=(UOJ9Sl)oPkUlY-4`4tw|gT)^`Oaxt4^J~)5n%-vqs+h}`Nx;&#_sUF3i z#e{^-2mH}~W}lH;OmFA>o4hQ9&#hAaK6=~*vMDY)hgoF%09;uO5YQEL1{_^Tq5#SV z1_sSiK;8lq8T|7VfU^VtF$JjTfON}BSt+1=rO?+F_ED~U94JL7?df-Z2H%kLH&$1> z@T~R9cs`n{{A=|ebC}S#p~I$C-dp>Mp|v2o|ACbi`4~0jUqkaY=h)WHrZAzc6|q5= z2DVsER@oH(Jo4Z)zQV^xc|R^>FrkyD5ASKT?c%ppW`m6$U?A8FT+QlfZ4DD(2NQ~CxC%J3%m=4QORVmj5fCFZcq)1?(jhx2(kaD}kdrH2-;NL!nz)tSFI}(2lj6703Ey zo%Qm)*xFT1!T|$@6*X*4+e(CB9$+A9a@l9tqWAqj}bqTpW&OWis<2JF&EB&!z z`cYrLN3ah8i=s&b8R=x^5;ArS{p*;Y>eX^AE2iY+5Tf`Hmr$p={?hB$yf4Wcd2Ro5 zM6=O+L;`N*u(Z7mDwLZsWR0@mT;38I&7|I&e53TQN2U&q(u_)z@RtEYdkYEr!Lba7xUAv&qYhEZNwUB28reU{quZl$6?T0*y9Bm|BviKEgqC5boMcGuiwzpC4Ya!)O+qVe&Q*<*bS#MmQdQR zpiRwVHeI_PF*d!)n!j7}aku5pIz@!AgwDQ--mz=k*jpuk{x$7V?*|Ed)!DC_ZY(EEhbztxGstft{hRzfT45197djJWa_7JFSNeYwLczN5Zyxk{*B zEqtFOPkbeK6mr3rYfOhe;q4*$22>oifr)Qd8f9g6j`Pc8an>`;0FEb zR%yK?B>cJfubzBdAPcgPb{bI$v6+pk?(Z?Z{_X`Ai5urLRebEZ%?29LB>0qyb^0&} zT^7du1ZtJ}U#pG*z>~nvQYcs@LjWFEAtiy!N)s4Fn32jAG712{5Woruo4`q?a#C_S zQTX4iyT0pxZ0NW$9rw+BekpxQ=Jg6igrae|HF z94&mXL2p5h1w$luw-nnKIFALR$v{T8=WO4(DD7^uZNIYsj?AAWgChf_V|!STMWa8{$g1fb7MM9)Z9`8DHetuT+dy$4F>y zMgbp;>odz}H;+sgW`50e<+cueS3hBIfhQ*u#9uXrYeU#*y%9n_8nn=|v`!zx_-J6d z_&^{|0+qpgGzs6^mpXiCFDmu)Zw%FD+;Vj9phTJ`J&qY0Ad78r-CJ+?fqYCXwd0JcG J=C)z>{{f2xKnwr? literal 0 HcmV?d00001 diff --git a/.gradle/6.7.1/executionHistory/executionHistory.lock b/.gradle/6.7.1/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..5c032fcd650c42b999f28d06eaa7268921037933 GIT binary patch literal 17 UcmZSnb-nJ}^b5W}86ZFq086(92LJ#7 literal 0 HcmV?d00001 diff --git a/.gradle/6.7.1/fileChanges/last-build.bin b/.gradle/6.7.1/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/.gradle/6.7.1/fileHashes/fileHashes.bin b/.gradle/6.7.1/fileHashes/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..7c44bc9bc367e0b4c7698d2604d39129d793c16d GIT binary patch literal 20797 zcmeI3Ygkid0Dw1`A@_k0B4C1&f{=)Anuvf%Yz!D07Y(#Vp^3Qy`x#_^EfC_~=);*dF34FN1@B8Rbxo}gf!u2c;<*Ei1JVy#EMG(z$fO2Z8PLPhY`P&+|{)!dCwd<4^Z%`?l5m1 z$4!uX(GYKpi8y|~b)Z7dg@`wwE?KA5vS}UU-ZqF|cNFFpM%s@+?&pqp`_r@A)P*N~ zA!o-Ue#3F-MDxhqD#%&O5bqfg{NCl?IA1=#4{^x=Kb1Fe^PSi56GFC zhzFRC1!&FRc|<-wSix7-jrJIi)yVm`hzFL(+|S4qFN2&>gn00x4dt_$?0b;=JXY}9 zGOkghdK2VqCgM9pkz1lodyYcBQ5*43^jfm?D}^19``to(H`nN9Y=`M9$i1==k0@Dx zS-)tz{5)swMtq;I|4?oJAub&6vk>tE{G`Z2nuG^AqZ@Jbn?#~;;B$D73*Z8{04{(F z-~zY+E`ST*0=NJ!fD7OPxBxDI3*Z8{04{(F-~zY+E`ST*0=NJ!fD7OPxBxDI3*Z8{ z04{(F-~zY+E`ST*0{=yU72ri}z>lTuhpOqkE`nE}vy;ONs%Jlb0=|(EAtcxlPMR*`W9l4OY41R(oDI<9he3_p__&z_*f>=Ex-) zXTmqf4HZ}p2i>eGy|V3oIWXcX?=_`?kzi8`2RoHj>1J)GQ=D`YQ|$*QxttPkM*}%w zQP+FaDS@OeyJJDcU{$64q;2_^`S_Ac>jLQ(CuDOZMN#{qL1`lz-cpSO!-vN6ehCh= zu+6psBgl#7`M04!BCjMGE{8Uc8>H9{i)Igb&Tr?NOc}Wk=R!q`Pc+^MiTc$eeap4A zVO9gqZSU6sW7_dh|B7f7buvFUEZekrw!6WYwx;HUvO&op8h#mV1BIrBqAIoLBb^SV zp#Sta$g;aNR9cM+h5o`Zo zny0&>==qR}A^Y~diZQ1=?BbOLRA zyXI3#x3ZyWMl{$T^bLvv`Q5eVU-&!pri8%700 zo zX2<2a{QMq~@*EodM5EP`L2G<-juUs~+~dc{&#x&P?=}#PRSn`Z?HP+jq0YS9)kWE| zYjD~XrM-)2EMC%@6*pKhc92$6bd0;*TG_CeM>MvI@)@JjeO-b*?X_WKmg$sHpxF;b zf^Eq~uv59BMkBs+I>!i#e&K; zLEb`~W5!igKLCFrWZS=9mBN_P{>`cs#!Ra!%sI8j&G?vS-Q8EqN=Md$Pc!h&s|V$G z^N~P1)mEQmegEP`T393h@lX18As5u4@tcQiJ>=&`GaQe&1jDG;zCInziJhy3b|+M9gy^AIOY|DeFJL_r}l;?3hVa?ikWZ@)XMy{Y*l{)>H?l{ literal 0 HcmV?d00001 diff --git a/.gradle/6.7.1/fileHashes/fileHashes.lock b/.gradle/6.7.1/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..ac81952a4aef66ac26c155e7aebfff25dfb19f9e GIT binary patch literal 17 UcmZRc)i!nQ?$aOcGC)8907btBDF6Tf literal 0 HcmV?d00001 diff --git a/.gradle/6.7.1/fileHashes/resourceHashesCache.bin b/.gradle/6.7.1/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000000000000000000000000000000000000..0604770fdfc7e3ca71ab3b23563fad21b8ec6fe4 GIT binary patch literal 19245 zcmeI(X-JcC0LSsEX=qt?*_5UZGK_R;WkGF}rn0GEQg)~Xrejv3N!HTLBqvy!k#;dn zY9{4Dmx@PHYR8yKrIk*bozsqakfl=AY~y+UNj`6T5%C*rd-(3hvpt`;)9&--qr>(mUh}=IoG_6;fTam-JU5k(HJF@o2hRlm68&e!u&> z!+NREY`RUo35pLKsxE)f_}PimEmr5|48~2shC$%TH!_aV$!Wtwr9`3T`!=z z@G|MP#~+$-2D%%lE~+MdL924fsJ@g#?=whWT2PS|VeZpk6a_rJv-oZjoy2c zE}m=IA1G{JOrQVs?>@hD*sRgch3;ddOPW7_Dr~C@qk9PHF{x@nYsaHr`utI($FFwW z*T+!~(0g~%6U)OwJ1ZORQayk}I(cWYOu5u&c!dB2AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_0D*r^V42|u*%_X*j8B`J z9l}Qy_IK`eZs2^-EpvKhhz@@)%;xg7L;Xo2XLWM7z=n5@xp2IYe$sw0@ng&gm)DjZ zUc_9)a!c|Qnmsr2&C;4|L!Wsv7gcw5l-1wWNAv{UZ)asW&SoyyqQ1tbDbuR>m#m)* zcmoOdTig^xtt(9=>c z)s`JUEN@w5&0K`3gO|&S1+L|KP90lfkni*Cr7kyv8PJC2uyn|uV zx470>Sy*2s8G;_SGhG)=W%zQs1?A~W}s<;Cv!*M(<3B#HKW IB>b(#FQB6J0RR91 literal 0 HcmV?d00001 diff --git a/.gradle/6.7.1/gc.properties b/.gradle/6.7.1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/6.7.1/javaCompile/classAnalysis.bin b/.gradle/6.7.1/javaCompile/classAnalysis.bin new file mode 100644 index 0000000000000000000000000000000000000000..6cc4119b590011fd0262f4680a1cede8e8962009 GIT binary patch literal 54906 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 literal 0 HcmV?d00001 diff --git a/.gradle/6.7.1/javaCompile/jarAnalysis.bin b/.gradle/6.7.1/javaCompile/jarAnalysis.bin new file mode 100644 index 0000000000000000000000000000000000000000..b626c74a2209eeb8522442442acdd3cf3b747b91 GIT binary patch literal 23701 zcmeI4YitzP702(6v5k!%;|B!-v_LSV!I>stCm{)Kyna)R9c&yFLe<&b>-E^Pd#5wA zekh8RmP(cS3U(E6OdzDiF(xDqV2F~akhW?nHKB4UWFneJ(}=1_v}qnv+mNa~_s;Ch z*vuHWANrxXmb^Qjy?5?8zjMz2+`CBBAhcNgm;Hm>pM~xvzv2Wq0ZxDu-~>1UPJk2O z1ULasfD_;ZH~~(86W|0m0ZxDu-~>2<{}%$=!I50cnZ@M-y(sKO=+->A5UPK0^TU7r zpzJN{36taWqrn9IRQ?96W|0m0ZxDu-~>1UPJk2O z1ULasfD_;ZH~~(86W|0m0ZxDu-~>1UPJk2O1ULasfD_;ZH~~(86W|0m0ZxDu-~>1U zPJk2O1ULas;D1SA11z=@ewWZ+ar9fCobS!QeD;Q4p6uDv@K=Bx&kIRk2>B zDdMVXGFm@X@QmQE~9h!J_$Cd-NXO?|; z=e;f3-b2m|oHP})Uy2aPTB$|W%`g#{MJ8VxXdJBA_r%trUtIq2g9n`n)0b$G%?Dj;{Oj{o#G{h9{ii_Vas)$D4Mt+I6j+gj0$d!@9U<;l=1nQ?*y#|Lx29 zcabX>g50uvYBJ*DUp{#HmGLJYD(^h=$+wl?=N>!iF54HynyCPbdX+?EwKn~CgPe>3 zMse*;=Z5+(jeokka$;nEvZHL+nHnX@4ka!%kz||z_YQH_Zu6Ft8xAX<6+AR?{HdcK zT?221b7EUt;)uL-U4Nv*}$-ZVaiF<5c>vpZT{Jw8@qq_%||QC z#wvTCbS$El4l#U&~f|tW2lq%danwd|H0{UfFlQ)w<#-(H>une% z&*HPMt`IlXU%L3l*b5)+EkPmIzgbEg2|>y4)HKStCJ$#6F`74f)uPP*rc6;*kZDd` zqU^aBBAOpuc_`-^7iW|j%5`x1yCs74eu_<+$ zrY1GO3l&hfVS5T=v(a*2gM5RUGCgc^1T?R(s5ldSe$>w+=y5tGX1|76Qvuax?tfv< ztJP!gY9b9mHd^tb-&%ggIt|9&CQx6C;3cn^KB*9`+#d`RhK10o({o*_1_M&;L4$6b znCsjYVtCy|tAFY@GeU?d$tjaqWt`FhDyzaUeBjwhfZ+=ShzsO>HYyvvUJ@7@Y*`>K ztWMVWuI!*~!e%FlRq63m0yJVPF(EURm_wQ3MQeQv!+C^9AE3dQ&{*wl3=Ipq$yLGW z`tLL&TGF8`^hIA40Wv1;14^z4!2;08Q|Y=8=9i$G$Ncbma)_LdX2>XJS<5=2=HETy&XGZEI* zR9pcWsUenRhf0t%aW30fGGkQ!Hl)*rc!aVt82067{Cr_zXvv>f`a%m3`pS_YcImSOw93Y02Vto0^_8pO zJ`Tu8N{6zhwpIDs=Hc8N>4LD->N?RGa#!PA)4+7*QKHXNPxmfAG`8mgr>*lV4EhD~qjKb=WsqFV9RH;jjc2g1X zsQG62yN>7y*%U(X#m^Ss-RHDSi4thauxW+u+kNzvxzyy_s)FWK>k3$;$ZYD???n1d zx{IaB)_jn9DQj}H6GL&*(~%*8IyN?MHxUr0c{X*mQVMw6B}ql z1d5gs>7pPuw>EEO>u!5K=$TGP?1J)UX)8PH%}|FrkexG9ny)ct`OSC9@j7DJ)&{Z!OG-&;S4c literal 0 HcmV?d00001 diff --git a/.gradle/6.7.1/javaCompile/javaCompile.lock b/.gradle/6.7.1/javaCompile/javaCompile.lock new file mode 100644 index 0000000000000000000000000000000000000000..2270c0be673f890462d6aa89097cc32578928d51 GIT binary patch literal 17 UcmZSnYv?)AI^fJT1_-zY05sMG4*&oF literal 0 HcmV?d00001 diff --git a/.gradle/6.7.1/javaCompile/taskHistory.bin b/.gradle/6.7.1/javaCompile/taskHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..d208fd2790866977e78df53f83d21ef6fcdf6a25 GIT binary patch literal 51284 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 literal 0 HcmV?d00001 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..43affa329824c43690e10298a0c33cdc80e6a36a GIT binary patch literal 17 UcmZQpdUWQ?$7TB#GeCek07mKs=Kufz literal 0 HcmV?d00001 diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..816310b --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Tue Apr 12 15:01:34 CST 2022 +gradle.version=6.7.1 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000000000000000000000000000000000000..488bdc2f8ac6264d50ec40444e591c2c1ecf266e GIT binary patch literal 18947 zcmeI%Pe_w-7{Kvgg9uAAh&io1)Ip3al!CxgidIZmvk+H@1Ve1ex=7H9T40%0tV@6J z@KV%}!ova&RhT3GF>Mt4lMh%`TZgqdk>K#alfGu1N3Fp4qeV_A2*VpY-vW z-j(Sq>AX1oRmRj*X@6f)9mw2wuDX5*z$!s)(d?Gs6FeR;*lQJH_C{qs{R zKhLVXEAy82f(<(gp51CnOW&$}S@ii}x+DBr_Nmpr?ospbx2E1UnNMinRO#_Q`Fh$T z^KZ0o$!U4e>3-QK^AYWS*Y>I0$zn_97ibRzHn%lC?w*vsUwg1O77m04UdcW~+7BJA zyT3QGyIcA>?X7oGG4J_@^JSkkGkq*MbZ_+9BAI`u{lv+NykiaFxXd5cu6JWxEzUEp z2q1s}0tg_000IagfB*srAb=jZ;Qb|G*S`;mckR?iFNs6qA zs3>cMM3!gHJ#)_Q`JUT9@H{W`dVS~i`gFbLnz?4?nmPCJr9q(xanGVc`CsAx-;eV@ z%|~E90`n1=kHCBc<|8m4f%yo`M_@hz^AVVjz7d&b?aMde{F9%nRy=LU28d zWfNa-tjl+#>*4x2rUdTrdZRX|yS>8oaHaRneg_4YL){_**DqdI8uiq^fW~_=lF%n@ zq`6CcJ)r%md$@jyqIvDrjyf5r+eZ_6?%vk4w1X%PC(UsEGV@-^BE#DE(Ehj*p&Qc$ zyRIHO40ZQxLXVOz%h>hY4(gU?2)&9vD^Bmv5Y%@y;d+$n_gX{cPm7@Lvz*YYH9miL zNjHPK)nZ(~!usOz^RBEJsGn-V^=SK&i!8fzjzj&#IHA8Td}OBN76^5d23)_o%l?z7 z!A}>cd*~4Q?p0c@rCl6Q_a*ut6XSXzZ`EZqUuLnm{k3CnJ&JNvd!W5O53a`xKKm;6 zc#RtJt48QaitOoYpP)E+Y7+YJ4}X8bu-nkyc?+&5Xl2HpeQlZmb<>T6p2bv^prNJ* z^y70$)J_Vn->}%WU0yj*8S0ijgx<@kc_;ecN2q&o;CdpX|H{%MS3RM= zw~Nrzn`~YsbD{Vf5bY<~yJSBY-C_^zk5A+F$;;0UAN;Xn66((GgzgsnNH6I}1k_#a z2>q4EzVM_=*P*Vr8`o159-hj3r{D(lfbF<`>uwSIqqTDGQ1|pD^eKl;WL#}d{mw?a26c{JWZ#DC zscAn)**$zvnsZUX^?M?*3|uaaAlG5V-iFZMJ@G%bN>vW(y2ZGDzq>iG_l5>D)K9;| z^|a9<)6A|0F{ryQ#r5>1%-w-9Z>d=ov|mQ(Mlq_{CV{A*Cy4$2Ks4M`D~HPhwxh3( z+dr6EUbt*PNCoN#d2#)rd-;bKLktI@u0yo{u!y_#?BK#Os2dXFeKf*26}tHv6V%-- z@OCnGhp%87Q`iXgfTOtn^Y9}=AIQIF##}lL?N1SL&OT#TJG*WpIxmh@ z;`Z5B{T14TZ8kuAZ^Cc(Q-(J0*(dT)*QUqqbL8K(XQ}d_edk5ww_H1|zfHZ?XufP! zar@^dj`L6V)1i5>%q8^L<)Zta);)pk@4H0kAFS4#xGC}p>IZ}gy;<_&k?SF-|E}wB zJ#SIwnHV98D75z?_Di1Cqi&1FH0%lhioZW$f3$EwcC!5p)c5oe`ln+$XD#p6K;4sA zhxxUe$5Pw;auj-632r91bM( zit;6nM$F>S-m?|gOK$hYZQ1$+>#XDZuqNEPq$MAC^aX#!P|G z_dHeI<`k+7?G15xw!GRtn|?#PKWb+g{tp#J%KXnC>x@9%XoApd1RRy~c*~)FbRn)+ z@{gH5Hjz67bw^`duiDhmZ#7V|7V0{3gno!liM9Jn1=QU}2t8cm27SRd52%|F>%S^) z|Fubzz)Gm=3F7wEbgL&P$2G>F?xjZPHhpjT7hTGSdI+)as>>QK>PdWD3H5zM{;3{} zy_6^|vKQ(HiTJ-uisvz}U5E0?{vUYz?@HoWZNe14LVMHqg#Iml)%y*7>!E&_=;!+^ zwk+Pt^8HYEH^A-RzxU;HYz1Fqnm&i4jlTbgXiR<-DmD3i_!dF0jw;QfE zD0p0uEGyiw%`+f%Zn_xZa#gN7uBd0o^Mc^KiYTSWK+{LzE1(_sAgh zm;S|t-jnFO4i+Qyfk(aurN2;q(|(KVtq%kewbUI-U^{`egx=PiZ{HGz;uCO}&^tq2 zjiMLuL;L+id|C%Ne4l&zKZCm8Q{4XZW`BoL!_8>kL){78H}|e^=g=u=@2`dHZE7{k z)FbpCKz%RK|2FOFpZP+A4#=LLu#ZVQS|=6Y1a-Gdgx({}{YPh{9_ltk|J#PLOH*QQ zq5IFVSls@LqO@s1kpViVj=snB4u{A+j_#2to;Jk2rL(oK?C;T<>!?3%xcxVom-*%F z_PF4Qsa zg7&&*gg*KvO{8A~-LDKj;(FKeQ=_9-Y#5+@5V3x`o~CLi(Zz{F-Huof-Olzi`J-{w zP&ahK+xc;^YMG#Azbw>^2M9gyUZuvzUbHVx5ci^<5DkmKtA(}D{=f;`zNas7qU&tQ z8mK!H{p@qu`R4BVYLuVN$8h`p?tGuc!ing9c&H242NX~LHotYH0k-2v2w@W7ohiw09`R^%2>B3M_wqL6Y)OeKI+sm2aQ%-&yZz%n znI_ndg$bcQ81p#ywSOzrJvwoHT)y1#G<^+vo^p^S^coQbSB|eDezF+X|2<~GZD9K@MEoiFC!22= zJVE#TR%EXokLwFP?lKzNSUW>|!*_&UQ+{c` zZH5HY_bR5_d$DaV&Ad;$gher$wK>1pIGN?Jo{#& zj%`4B)nYl`4*PBy2^~>Ebl-L$@)En7>Elbc+#_K7MlrZO$IAMSK*1>^sJkTKI?whQ zmMh{7D9-vVgnps4)=nxG?Q2(}9iGpT&SOl~hhaOXiFSBjiYC9`Qf2~mLq@zE-k+DJ zFYUXP2z9?bxX!op{gD~rGIX9E{zB-6W)2HOd(b*GCh|64z=`e;*28Gu8HW@012zrk z7)RM)`@55Ho!{H(Zu*n8r(B6fZcOktG9;uYr0;rq6#@i7(r%-Qe)@cZJJ0dR$^RR~>yPkXr>el?Yy|B^x zpD#i#=R!S{$j`!d7n^qNWr~El50N*7FMN`87Yjz~{MbLd9TDbJn*twCWI}u2TtYWr zF|qIb2b4EX6Z5iI`HGT7R4p^KKjwhjFAi?+bP%ycc{s=z*G1a}kM|Uog+qHMZ(J9X zwxeV{|AIF@7cq$XZ$okaj6e%M>i7JS5)=6U)yPf@@lXiuFH-&{o4OjQw-X>P7wOv0QVCMywG#5O%txK ztl4@zu4`m5wBJv}d1Wi7Z)XYQGhGZfzJm5vL4@AB-nCDB2*ttM z3fI*+XH2;-{6Y6;_aB5V7-?*(T#VMUT|BO96iOaGQF0ya)8H;#*PQBp{V~}F#nbyW zu4{$p*uIee+70{TK&;PQkq4d1u9*y=alOLrb!mrmtUud=EaEzw>RV)YLS^@_ypVWOe6H&P7?R7W}>(q2`6;jv~*tHbMK&iAkiPg z;cqzw?t9R_aAw2p_i-lK*h_7%gZ2k>2>pSX>f|HiTTnl`k!wRbH$N*eK==GmqCaNo(cz(-p)Anep19|j zHw6W+`#XW|$-8Uub}SDnG6rR(FM{?)>j>Sg^mcT1BzoQt`GV_K%j0{bIHl0~G+jvO z*<6z`=R47R78l}tu@AQxeQ?U{J8a)q0=Kshui6o56+eyoN$l%GiESk|c6&cSJ%Gq> zhX#K0mUW&%@v$Y=j}s&JyB97ScR_ngBfNd5BswXDcq4R&s2Sc1g=7Ry+^pc3t!RY_N`mdJxzNW*Iie1u3NH7rWxAX z5^;9bKf$IO|C$f#PU^V*5ib9F?@X($P(LJw>+Wi)dxE*;^`O2#8`nM3bMKE&{z7pM zCi0}$YUNdvoknO~>Db`*UYnih)AO3p`mrS9e{3VG$qtrhmtgw`I&u4B7N!r&d+gEk zQE&*MU;Lr;D)4z4v=89Ib#Fe|!e6h4QT}vlA@tK#CcJbrC=ct(;=2C<-;!{3R%_T! zh#;YV;VoS5RhbXp_9>v}Xgea#$Jh9mi*5X&2-`7p!0k^a?3FsX-S`RA zy*zOp|D;gF(3t@(=Ii+g%tv580`n1=kHCBc<|8m4f%yo`M_@hz^AVVjz!{tWIKE?DOl&eBe1*2BqIc}#TWE=tvb3eChyTTBxgDwO<<>Vtge~+TkA3S- z^1&VTKJWg9!1e5Zjkahkt^wcwQhj7WLU@FhcwwBiD6pR4&*SceH%kKIClG;t!){40 zEg?CiZ5VcMs?B|4>4(xrC-5CP=HniEm%!CVOK_ctyuUVIF6ZT@l=JAVyDf+)fP{J< zEzz&E^5f4-Vn$w9ELVA|1&1O6y=&M#NlOGPDSw<@{@Fet*3Y*qFdn>(qK^C*^dX6T zn@{SMze@duHdC4Ux8f&%B&Hb^L*hOJDBRfl1rj0ay+Ypbl07?TN$jPcKdyi`qnMBT zD zCHHSaf?uAN2;6iza%%stuz)qXAGE6&c#sdYc3HuUl6{oz;?r!n{#*OQ?<%@w8x#j2 zkqX~}(G7m3C1T5eb}=y!KP_?jvL**w;@pnKC!~O8C0ZLrP#i9zBK!O+Y-gLJ^k(3 z)IG?To(=aooiO%EBK(f#B=8+Ro)o${{P)IRDjvW`P(i9jDdvGf(NX{viMZ3dO0(3@ zK5#mw>!GLfU$CCAag3r~vCOe+muC2cJiei-w22|}{Au^w*vP?3Ob?*CpfH8g`q;Ii zllxYlZcaMed!_}y%E25{iC9Q5zNIC4wQL*nT%WGbRyfmeLd*!fCj-QeN3D=plub)i zh4B5%7kg5ze>Fd|$GJa~N~kxYHx;@mw8VC?^-RL4Srr!wKW=)tr2w>z`FIR+3RV`c z0~IM&ZfZtvS!0WSZ|NKP=q(zs5fT~esQ_iyNm}B;b1{{QdruZ5o%|Zrcz;0;B%Xvq zLJE8DLh@ntrZzo{uj#O&w_xbr#B>Wp+<*id_NJIb1nYEu$f>&YXfWh!lX+0Z3?e{I z!OG$}a>=hVT^UI(dAjd>a#Kv|J?RjEqAMB=Fp`fYj+MiPls4byg9XPgF7vnoiKk$F zVMWLZR3suX{;b-*yO}jW8ob%Wd}LxX2g=f~pd$GQ5X#qISZ`(f)k^rB zoy{G*SLk<8gkI7Tx=P)#bt945XPJE`QYLiKoM)k2B89zOB>9N4yLLc?V{F{c(eS2= zYN`zyIm(GbbBx2?!Qq8#e44fTVZ$Y@jX!V#y)hM<;~Z3Y-SI4wag@?s|H8_sH`g2b zc!u=`6oC;?k$UyHQs}DH1%v#MlIpCIBNlHUkt0F{C{mHM1oL5~zRa7HF4KE*4t5=? zU>#x6&2ff=;%8c7`%eFfbq4E?XcuhWy5~HvH6lzQ5rFMpQm^!_T5R^zCfn#5Tp5%( zP?LZNEEj^Z0-V-lLZu~+k6Lg{lvfV_p3RoL8<#=$nTVVQ{i5$#o1e(7Z_ z%5g=+3>BcT9-<`%_8dL7|7fKMSJ?R@j7nduA(6WT5?kk(j|X|~IlNJx8b$nOQl9NG zzKGz41Xm-ikGIb2j+%=tXe+4jRuO`4SIUFY7< zB8>)tI((Vdz(BaPDCvf4+$dP&i)E5`Bk4wbwlzQdDN! z6#usU6h00^NN{q}5^3z0%R?LkJ{(vsn0eTM8LV!q4+lu_&atD`@JC#^r`mi$MO#px ztt=d@RVsnbK{jlkkj7#CYMtC=2RqFOM!_uk%l-Js<4~_aZXpvTQY-YEOC> z2~II=9C;vSSYeL`6=@va!OZXXG+*I=94w#ivwU0(68Tb8fWodxOC%j-uy$P0>+$ZL z#FT~WSL7oHt;CCKX$i3h^^*SA7px3Ca3e{nBl!>Xk<$r%C|1!DIU|WL+M2`4o-toYPCMor6 zl%WlY7vRjr%8^!3k>=y@wz$x=Y{{^O4w-S0&uhRfkIt8Gst}#dTnA{08m1wczzrVb ztCJ~}Be$Ye0TC>4t{26M1)QX0AK#2z4Q@uMoer>cHm}GnNPxX6d;u&$VHyS%saHl< z{g+O^%h%rXVVHiMx_UbF@qIBBps+rnCA4n48}B=ydg$TZ_Ey2Hf8fN&R$>9RlR#lF z0~N`KL|gU!Z3k+8{9MN=kaD7Mno6j*bW;J!T;CcriRG-^JlWcCoo?gj#YVm$qX8f4 zpClnM*Asob`Cp|KUgpxv(>`3asa*wb_Ef?a5_3Im$6k~&=xv<2>p1FczMWBB5fR5B zG1s%R?c}J_LVxzXVFF8BOaeMUY^XlKs>jM)Pr|K-l!p7ZSJofw@#d$0d>Whr7|{xR zVP&o-VJ+E-lFncQRu!3z$sW9CuOfm45_3HXE6%KVn)z)dog{m9(&q9m@T^Sr0aiU$ zB>Nw;o8WeY<&rLL=!2=8mdMy{S!+0TQ!V_a z2upua$_7CA_5a;{5)yOmkDx~B@qm=e-}4sl9XVj2(u)X?F}FA~9F;LCd9JpGiQVf^z{<*hq`53sJ`h{HD+k0!BSRuje4+--IT4INh=a%xawNKbuO`5fr z7Ttpc|8__$dqzuq9N$!`_4V=5Z!3y-w90gVuQ#z+jpL_U4K3mR`3p~BSoT2H1&KT@ zA&)@lV~Ha4VFsSW$g#@5@nfpv{LOu4OA^W?KEDA^b=b(+>>h!z5sO=BGW_xVr0lhv(sd5jb&oKjf0Y^bTn-9*2B=6x zN54jRwOC!zjG6J>-4fBSAYocd1t>hZv;@hhXF2 zuYv@_9H*M%g}*EE%Wm+c7>U|%O%SHW3J^(AZXXy~S4GDF_?+E3`jYduWMz#-gGkTkrat zcb7hIY4;d`M9C@41BJo{ay{9{VyiIGf;{^hdsUX6o8oz$ihO*e0u;8Vv_xf0E~BMU zWm#)N)t%Eu{=<+c1M3Sb(Q|wUuxGVW`0EbEWIhju!C!GdOc8Mv5-f9MhVBn$p|b0PbjD78P#Eb!MT!-J(RVR9Gqo2%T%(d50`eCi(T%bXI}a_fuK(+` z*n?}U7wrD#?K%~n0((_q4J<)fxF1v`9}((B!sjb^my}HvD%hrBzpIbUM}-v?pfDBE z5@&c#?EGF=sa57~%n$TU1{T{B z4zdW{HxTKR&f}S&bUbmN!ZIAzD>QQI|2at-#}0vsHi=KlyDyw<(@uXWu$M}xx5vU> z@xP(%m4{aGxu>NtF3{Bni4bRX6?ww zbx14$`-L3c>3+lLsT-~J`&<7Orz$N1Ck*DJ9T7qcX$krb4{DwqS}MB!5_7u9heU7_ zqxQ-J^=guq_?5=1cCm6QHp6-6F>%HSuv@7<9zcR~j&V3?=x0}5s@gMVBsS~!BPN;D zE3lTyD&(>fVOO*LVxkmz87 z#FB1WLf$c`Xw+P1`FP=k{%v{eR)P8G;DZFGJT0N*cvttgRhpdOvV}1j4#^RSKsizH zIW2Lf=Y7+y@y=Vp9>NAH6Ge82067IK8rZy$)|E))ko!fZOS(}?zmJ{GnFTut>s4na z6`<_nrX`jb9o!tJkUP7oWYY+%(v)*l~X7SR?Km;WWD>EtL9mCqTyxdk$iJMQAAvYKD_I|C#hGP#?C+6k=!<6n4|nI z=;b(Qo9e>@65Lo$ArY$u_QVdR3snw%yt%Mq$w>$kl95%FGANFcO0P7QYKNtckk`E`IjFYt-L)$cbS*?!R)~pAF zFJF3YGGGMJeujidG3J3n*?$XE zBp+Ps-}HzyEa-7wQnIz7#O}x zbB+vWIwH&eDPDI)zWKJ8GrOC-&^XYJVjiXSv1wuBnc{~1e>Mq}7;cF7`~(TX4(Nj& zM1tI_$!#@iX5Xuh)f)V}vcvBNIE}IS5Yj-z8(Jcw&CBq~*QikGtbmJtL7mth#E6HG z;8{RRWEj8D*~wz9sT3|KtGCB!59$@zCs>j70~IM&;{U9gmpDyasw?1;ksMF8M1(LE zpag*@d@>PH5MSq)cxIb;*yXaq(+kZZA%J}FV7(*xV84IjiV}av!)=zu1&Pb57ej)2 zKLp0i*i4cLYi;QztYfE3b7gb?i3fA~A|Gfz9Ot+*L{2BD#z!DUm+n^%#YNG9?GW|j)E`i^LKD!$> zCj$c9kgHc?_H#dZeHz~B(_I|=%f@_-(3D3C*hv`irWq2V8^9;YM`gOqwV9c&KTEYf zj}Ln6!)6d8iXg#$j+R(({@?;5*q ztrl!0!XUF@J}PFZ0EPJhEs?r?y7@+}nb7#l)S{I`lZO8#xKe3}vv-Yu8buvEYcyT| z>c)#CEW=^rD2F~o`e=!3Eg`wg66s>fuIpomUdr%6qH+x+n10g|Y22zzNApv~(&HBd zL?)H2L?d#&aK!#?q_jhfgqKh~>CKw^anyP1(iFt( z?V=4Izz(7k*gSx;<}s*9#O-FkvFG2H1w>0J{Blx=1SbuZNT33gfjQ=*&8*+Wb6~oO zY3$1gOX4bU51|rAAR!0V0NKas@t#57gj%A;x$_D#hno3~30fprrs7OSP{n?DJ@BY#56%X}W*-nZh0-Ya= zb7_gcd5Vse%x+iLw*mcd_xlVK++<-R@vW@N?1<7dNbH_$)M_wc@t?wMCz@?jXV) z5{s&6i4WZ))2?Ir$5`(wJbv!*w-gb+klo?Z?w^!1(v_AA%L#1>RzAibvifjD$wtW?dKsj-)8*-B) z$KjbTkE+a6f=zVZ+Vda+yNQ9qJI9?t>L>3|(oLJiz8|@gW3GV~XlyM>X0X9B#CP|1D|pChjF?v|d#RT$@Y|1q8TR3QA&q0^h^U z@%#~CcEfdiy3bnGHt>1W{q6gx#JS0fkYK@{R!J-Ic&n@ zd#tcFf{H|JlZe~8XtbwG=}AMT08CZo_XR*5N`_GF!UjaolT&uR{<4?$R6N+d{#zoqiGDI zue6#U*riyn79by7yJ(4@O0|`v%g)BW)1=F}wVlHT5)98U4-`riKd4APA3F==;Ci%F%o@Ym&eNnzv=j8hh8h=6Vz;0xVO(Een z$7$f(KcKTI)to1aZ|lC#VjN$P4>m~5w17{N4`2QRmFpUgjC@-Ct8&*b2?t12&p?9r z7%kB_b}v^{&tuym_Zi!K;~8*Xfavac*8vFyV_Je?f7;9@Uawa@(*7ZIgDm}2LjC79 zNX+$}%(BLNfzLjyU+gP!EZ|Gk7L++mO_`|MrS!j$4Lk_WPEcWxi|LBd$9)-@E-35i-yR7CW+! zywL29U)CG>=sCZX#wKfPAOg!%pz!Sn6=@uuoRUXY^55l?YHOO*pBMaqXHBzXAtPW&qN_2(CmcO7o%k~yzHZ1Sb%TWOe19l#gh{!AM zKe&4ir_kR$z#F#Zw=5vQuB~B&1S7WJNd&KV-}CLNt0?cvm6kg%nT?_n>iyb?D4-?s zQZ9rj7q95zkdsPE%@V1@A^ zs7S`u-5@LPelQa$wlW%+9?x-1GnPvRs_MbW_=%WtH zY@lqNV+PkmygK4!xa0kL*PtDy^nXNAudo#e%Bm(%k$f-*x1CRU*QT7&af$K$FHY2} zS}Q6*VKJd4+8WI6xMzLftU1+vazyJNSgY6!)}j5evze9{d>(r)%cs~egz2rbv#%f% z>J_%iL1DcLDpIf1-TdQo5_3|8-nB1~6lTJ1OV}#$paK+@Ip*VIS*8_-MuM^RDcvZ6 zD+=Jepb}_44DD%sG-x(&zce;wH@o((X1mwaEF?ZgLLY04Xo=Cmv3)A9{v0yP^9yQv zZGQ(5*zE$8of)7ajl(0qvUP|~i8(4i((%(;D>ROe*l7j|&u37Ph<(ZiFLy{Qs2z9X zX^egp0iueH<6|Bbps--4G>I7X3ZoROJ}?tD@;h;V^A#>c@DiDj0w#Ff_DeS?P|9(~YZadQ!CHpuDN$eT(bvG6A?A!?&hn~?ih zw|7_O1MV5qK|lnH-u#1ovjU3DJy4N)H6%T~;<)W-l0^9BH`yoUu+wzV!PuU4lF_08U(7f{|AdNC2;@% literal 0 HcmV?d00001 diff --git a/.gradle/checksums/sha1-checksums.bin b/.gradle/checksums/sha1-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..cdedf7a12c3b0455de2c6b8fa5b5c2336ec78c5d GIT binary patch literal 135611 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 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..4987eca --- /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..ab29f70 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..e4f0e1e --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..7c11155 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.en.md b/README.en.md deleted file mode 100644 index 01ee3a1..0000000 --- a/README.en.md +++ /dev/null @@ -1,36 +0,0 @@ -# cloud-file-server - -#### Description -Java 基于 MongoDB GridFS 实现文件服务器 - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md index 25497e7..1c8b358 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,32 @@ -# cloud-file-server - -#### 介绍 -Java 基于 MongoDB GridFS 实现文件服务器 - -#### 软件架构 -软件架构说明 - - -#### 安装教程 - -1. xxxx -2. xxxx -3. xxxx - -#### 使用说明 - -1. xxxx -2. xxxx -3. xxxx - -#### 参与贡献 - -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request - - -#### 特技 - -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +# 文件服务 + +## 技术栈 + +- SpringBoot +- SpringCloud +- MongoDB +- JDK8 +- SpringData MongoDB + +## 功能描述 +- 单文件上传 +- 批量上传 +- 文件预览 仅支持,浏览器预览支持的文件格式 +- 文件下载 +- 文件删除 +- 文件重命名 +- 批量删除 +- 获取文件内容 +- 分片上传 +- 断点续传上传 +- 断点续传下载 + +## MongoDB GridFS 简介 +- GridFS是用于存储和检索超过16 MB BSON文档大小限制的文件 +- GridFS 会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中。 + +## 何时使用GridFS +- 如果文件系统限制了目录中文件的数量,则可以使用GridFS来存储所需数量的文件。 +- 当您要访问大文件部分的信息而不必将整个文件加载到内存中时,可以使用GridFS来调用文件的某些部分,而无需将整个文件读入内存。 +- 当您想要使文件和元数据自动同步并在多个系统和设施中部署时,可以使用GridFS。使用地理上分散的副本集时,MongoDB可以自动将文件及其元数据分发到许多 mongod实例和设施。 +- 如果文件都小于16 MB的限制,请考虑将每个文件存储在单个文档中,而不要使用GridFS。您可以使用BinData数据类型存储二进制数据。 diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..cb0bcdc --- /dev/null +++ b/build.gradle @@ -0,0 +1,62 @@ +buildscript { + ext { + springBootVersion = '2.2.2.RELEASE' + springGradleVersion = '1.0.10.RELEASE' + swaggerVersion = '3.0.0' + springCloudVersion = 'Hoxton.RELEASE' + springCloudAlibabaVersion = '2.2.0.RELEASE' + } + + repositories { + mavenCentral() + } + + dependencies { + classpath "org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion" + classpath "io.spring.gradle:dependency-management-plugin:$springGradleVersion" + } +} + +apply plugin: 'java' +apply plugin: 'idea' +apply plugin: 'org.springframework.boot' +apply plugin: 'io.spring.dependency-management' + + +group = 'com.jjsk' +version = '0.0.1' +sourceCompatibility = '1.8' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' + implementation 'org.springframework.boot:spring-boot-devtools' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + compile "io.springfox:springfox-boot-starter:$swaggerVersion" + compile 'org.apache.commons:commons-lang3' + compile 'commons-io:commons-io:2.8.0' + compile 'commons-codec:commons-codec:1.9' + compile 'com.alibaba:fastjson:1.2.9' + compile 'org.springframework.boot:spring-boot-starter-web' + testCompile 'org.springframework.boot:spring-boot-starter-test' +} + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:$springCloudVersion" + mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:$springCloudAlibabaVersion" + } + } + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} + +test { +// include '**/Test*.class' + exclude '**/FilesystemApplicationTests.class' +} \ No newline at end of file diff --git a/build/resources/main/application.yml b/build/resources/main/application.yml new file mode 100644 index 0000000..f285887 --- /dev/null +++ b/build/resources/main/application.yml @@ -0,0 +1,16 @@ +server: + port: 30301 +spring: + data: + mongodb: + uri: mongodb://192.168.11.118:31017/ + database: jjsk_mp_fileserver + servlet: + # limit upload file size + multipart: + max-file-size: 16GB + max-request-size: 1024GB +base: + fs: + base-preview-url: http://192.168.11.118:30071/file/no_token + download-file-path: /opt \ No newline at end of file diff --git a/build/resources/main/bootstrap.yml b/build/resources/main/bootstrap.yml new file mode 100644 index 0000000..e69de29 diff --git a/build/resources/main/logback.xml b/build/resources/main/logback.xml new file mode 100644 index 0000000..f363755 --- /dev/null +++ b/build/resources/main/logback.xml @@ -0,0 +1,191 @@ + + + + + + + logback + + + + + + + + + + + + + + + + + debug + + + ${CONSOLE_LOG_PATTERN} + + UTF-8 + + + + + + + + ${log.path}/debug.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + + ${log.path}/debug-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + debug + ACCEPT + DENY + + + + + + + ${log.path}/info.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + + ${log.path}/info-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + info + ACCEPT + DENY + + + + + + + ${log.path}/warn.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + ${log.path}/warn-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + warn + ACCEPT + DENY + + + + + + + ${log.path}/error.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + ${log.path}/error-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + ERROR + ACCEPT + DENY + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build/tmp/bootJar/MANIFEST.MF b/build/tmp/bootJar/MANIFEST.MF new file mode 100644 index 0000000..61eddc3 --- /dev/null +++ b/build/tmp/bootJar/MANIFEST.MF @@ -0,0 +1,7 @@ +Manifest-Version: 1.0 +Start-Class: com.jjsk.FilesystemApplication +Spring-Boot-Classes: BOOT-INF/classes/ +Spring-Boot-Lib: BOOT-INF/lib/ +Spring-Boot-Version: 2.2.2.RELEASE +Main-Class: org.springframework.boot.loader.JarLauncher + diff --git a/build/tmp/compileJava/source-classes-mapping.txt b/build/tmp/compileJava/source-classes-mapping.txt new file mode 100644 index 0000000..3048663 --- /dev/null +++ b/build/tmp/compileJava/source-classes-mapping.txt @@ -0,0 +1,36 @@ +com/jjsk/entity/bo/UploadPartBo.java + com.jjsk.entity.bo.UploadPartBo +com/jjsk/config/Swagger2Config.java + com.jjsk.config.Swagger2Config +com/jjsk/exception/GlobalExceptionHandler.java + com.jjsk.exception.GlobalExceptionHandler +com/jjsk/exception/BusinessException.java + com.jjsk.exception.BusinessException +com/jjsk/common/domain/ResultMsg.java + com.jjsk.common.domain.ResultMsg +com/jjsk/common/domain/PageVo.java + com.jjsk.common.domain.PageVo +com/jjsk/common/domain/BaseConstants.java + com.jjsk.common.domain.BaseConstants +com/jjsk/controller/FileUploadController.java + com.jjsk.controller.FileUploadController +com/jjsk/service/FileUploadService.java + com.jjsk.service.FileUploadService +com/jjsk/config/MongoConf.java + com.jjsk.config.MongoConf +com/jjsk/entity/vo/CheckPartVo.java + com.jjsk.entity.vo.CheckPartVo + com.jjsk.entity.vo.CheckPartVo$CheckPartVoBuilder +com/jjsk/entity/vo/FileUploadVo.java + com.jjsk.entity.vo.FileUploadVo + com.jjsk.entity.vo.FileUploadVo$FileUploadVoBuilder +com/jjsk/config/ServerConfig.java + com.jjsk.config.ServerConfig +com/jjsk/common/domain/ApiResult.java + com.jjsk.common.domain.ApiResult +com/jjsk/common/domain/PageBo.java + com.jjsk.common.domain.PageBo +com/jjsk/api/FileUploadControllerApi.java + com.jjsk.api.FileUploadControllerApi +com/jjsk/FilesystemApplication.java + com.jjsk.FilesystemApplication diff --git a/build/tmp/compileTestJava/source-classes-mapping.txt b/build/tmp/compileTestJava/source-classes-mapping.txt new file mode 100644 index 0000000..146a8b3 --- /dev/null +++ b/build/tmp/compileTestJava/source-classes-mapping.txt @@ -0,0 +1,2 @@ +com/jjsk/FilesystemApplicationTests.java + com.jjsk.FilesystemApplicationTests diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..4d9ca16 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## 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='"-Xmx64m" "-Xms64m"' + +# 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 or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; 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=`expr $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 + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@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 Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@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="-Xmx64m" "-Xms64m" + +@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 execute + +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 execute + +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 + +: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 %* + +: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..34cf56e --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'cloud-file-server' + diff --git a/src/main/java/com/jjsk/FilesystemApplication.java b/src/main/java/com/jjsk/FilesystemApplication.java new file mode 100644 index 0000000..5783903 --- /dev/null +++ b/src/main/java/com/jjsk/FilesystemApplication.java @@ -0,0 +1,12 @@ +package com.jjsk; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class FilesystemApplication { + + public static void main(String[] args) { + SpringApplication.run(FilesystemApplication.class, args); + } +} diff --git a/src/main/java/com/jjsk/api/FileUploadControllerApi.java b/src/main/java/com/jjsk/api/FileUploadControllerApi.java new file mode 100644 index 0000000..bec91f8 --- /dev/null +++ b/src/main/java/com/jjsk/api/FileUploadControllerApi.java @@ -0,0 +1,51 @@ +package com.jjsk.api; + +import com.jjsk.common.domain.ApiResult; +import com.jjsk.entity.bo.UploadPartBo; +import com.jjsk.entity.vo.CheckPartVo; +import com.jjsk.entity.vo.FileUploadVo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * @author Tadashi + * @descroption + * @date 2021/1/22 10:44 + */ +@Api(tags = "GridFS存储服务接口") +public interface FileUploadControllerApi { + + @ApiOperation("上传文件") + public ApiResult upload(MultipartFile file); + + @ApiOperation("批量上传文件") + public ApiResult batchUpload(MultipartFile[] file); + + @ApiOperation("文件预览") + public void preview(String id, boolean inline, HttpServletResponse response); + + @ApiOperation("文件删除") + public ApiResult delete(String id); + + @ApiOperation("批量删除") + public ApiResult batchDelete(List ids); + + @ApiOperation("获取文件二进制内容") + public ApiResult getFileById(String id); + + @ApiOperation("获取文件信息") + public ApiResult getFileInfoById(String id); + + @ApiOperation("重命名文件") + public ApiResult rename(String id, String name); + + @ApiOperation("分片上传") + public ApiResult uploadPart(UploadPartBo file); + + @ApiOperation("检查分片断点") + public ApiResult checkFileMd5(String md5, String name, Integer chunkTotal); +} diff --git a/src/main/java/com/jjsk/common/domain/ApiResult.java b/src/main/java/com/jjsk/common/domain/ApiResult.java new file mode 100644 index 0000000..355375c --- /dev/null +++ b/src/main/java/com/jjsk/common/domain/ApiResult.java @@ -0,0 +1,93 @@ +package com.jjsk.common.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 业务响应实体 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@ApiModel("业务响应") +public class ApiResult implements Serializable { + + @ApiModelProperty("返回编码") + private int code; + + @ApiModelProperty("是否成功") + private boolean success; + + @ApiModelProperty("返回消息") + private String msg; + + @ApiModelProperty("返回结果") + private T result; + + @ApiModelProperty("当前时间戳") + private Long timestamp = System.currentTimeMillis(); + + public boolean isSuccess() { + return code == ResultMsg.SUCCESS.getCode(); + } + + public ApiResult(T result) { + this.code = ResultMsg.SUCCESS.getCode(); + this.msg = ResultMsg.SUCCESS.getMsg(); + this.result = result; + } + + public ApiResult(ResultMsg resultMsg) { + this.code = resultMsg.getCode(); + this.msg = resultMsg.getMsg(); + } + + public static ApiResult of(ResultMsg resultMsg) { + return new ApiResult<>(resultMsg); + } + + public static ApiResult of(ResultMsg resultMsg, T data) { + ApiResult r = new ApiResult<>(resultMsg); + r.setResult(data); + return r; + } + + public static ApiResult ok() { + return new ApiResult<>(ResultMsg.SUCCESS); + } + + public static ApiResult ok(T result) { + return new ApiResult<>(result); + } + + public static ApiResult error() { + return new ApiResult<>(ResultMsg.ERROR); + } + + public static ApiResult error(String message) { + ApiResult r = new ApiResult<>(ResultMsg.ERROR); + r.setMsg(message); + return r; + } + + public static ApiResult fail() { + return new ApiResult<>(ResultMsg.FAIL); + } + + public static ApiResult fail(String msg) { + ApiResult r = new ApiResult<>(ResultMsg.FAIL); + r.setMsg(msg); + return r; + } + + public static ApiResult fail(T result) { + ApiResult r = new ApiResult<>(ResultMsg.FAIL); + r.setResult(result); + return r; + } +} diff --git a/src/main/java/com/jjsk/common/domain/BaseConstants.java b/src/main/java/com/jjsk/common/domain/BaseConstants.java new file mode 100644 index 0000000..d05ad82 --- /dev/null +++ b/src/main/java/com/jjsk/common/domain/BaseConstants.java @@ -0,0 +1,18 @@ +package com.jjsk.common.domain; + +/** + * 基础常量 + */ +public interface BaseConstants { + + /** + * 小文件最大大小 + */ + Integer DEFAULT_CHUNK_SIZE_BYTES = 255 * 1024; + + /** + * 文件元数据 + */ + String FILE_METADATA_CONTENT_TYPE = "_contentType"; + String FILE_METADATA_SUFFIX = "_suffix"; +} diff --git a/src/main/java/com/jjsk/common/domain/PageBo.java b/src/main/java/com/jjsk/common/domain/PageBo.java new file mode 100644 index 0000000..9efc773 --- /dev/null +++ b/src/main/java/com/jjsk/common/domain/PageBo.java @@ -0,0 +1,28 @@ +package com.jjsk.common.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.HashMap; + +/** + * 分页入参 + */ +@Data +@ApiModel("分页入参") +public class PageBo { + /** + * 当前页 + */ + @ApiModelProperty(value = "当前页", required = true, example = "1") + protected Long current = 1L; + /** + * 每页显示条数,默认 10 + */ + @ApiModelProperty(value = "页码大小", required = true, example = "10") + protected Long size = 10L; + + @ApiModelProperty("排序 key:字段名,value:DESC/ASC ") + protected HashMap sorter; +} \ No newline at end of file diff --git a/src/main/java/com/jjsk/common/domain/PageVo.java b/src/main/java/com/jjsk/common/domain/PageVo.java new file mode 100644 index 0000000..b8ed81d --- /dev/null +++ b/src/main/java/com/jjsk/common/domain/PageVo.java @@ -0,0 +1,53 @@ +package com.jjsk.common.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * 分页响应实体 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@ApiModel("分页响应") +public class PageVo implements Serializable { + + @ApiModelProperty("当前页") + private Long current; + + @ApiModelProperty("页码大小") + private Long size; + + @ApiModelProperty("总页数") + private Long totalPage; + + @ApiModelProperty("总数") + private Long total; + + @ApiModelProperty("结果集合") + private List list; + + public PageVo(Long current, Long size, Long total, List list) { + this.current = current; + this.size = size; + this.total = total; + this.list = list; + } + + public PageVo(Long current, Long size, Long total) { + this.current = current; + this.size = size; + this.total = total; + } + + public Long getTotalPage() { + return total % size == 0 ? total / size : total / size + 1; + } + +} diff --git a/src/main/java/com/jjsk/common/domain/ResultMsg.java b/src/main/java/com/jjsk/common/domain/ResultMsg.java new file mode 100644 index 0000000..d844d55 --- /dev/null +++ b/src/main/java/com/jjsk/common/domain/ResultMsg.java @@ -0,0 +1,37 @@ +package com.jjsk.common.domain; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 状态码 + *

+ * 状态码规则: + * 1xxx: 公共状态码 + */ +@Getter +@AllArgsConstructor +public enum ResultMsg { + + /** + * 公共状态码 + */ + SUCCESS(200, "操作成功"), + FAIL(402, "请求失败"), + ILLEGAL_REQUEST(400, "非法请求"), + NOT_AUTHORIZATION(401, "未授权"), + ILLEGAL_PARAM(403, "参数异常"), + FALL_BACK(405, "断路返回"), + SERVER_ERROR(500, "服务器异常"), + ERROR(-1, "系统开小差了"), + + ARGUMENT_NOT_INVALID(1001, "参数无效"), + DATA_NOT_FOUND(1002, "没有找到记录"), + PARAM_IS_ILLEGAL(1003, "包含非法字符"), + VALIDATOR_ERROR(1004, "数据校验异常"), + REPEAT_OPERATION(1005, "亲,您已操作过,请勿重复操作"), + ; + + private final Integer code; + private final String msg; +} diff --git a/src/main/java/com/jjsk/config/MongoConf.java b/src/main/java/com/jjsk/config/MongoConf.java new file mode 100644 index 0000000..5cfad58 --- /dev/null +++ b/src/main/java/com/jjsk/config/MongoConf.java @@ -0,0 +1,28 @@ +package com.jjsk.config; + +import com.mongodb.MongoClient; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.gridfs.GridFSBucket; +import com.mongodb.client.gridfs.GridFSBuckets; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * mongo 配置 + */ +@Configuration +public class MongoConf { + + @Value("${spring.data.mongodb.database}") + String db; + + @Bean + public GridFSBucket getGridFSBucket(MongoClient mongoClient){ + MongoDatabase database = mongoClient.getDatabase(db); + GridFSBucket bucket = GridFSBuckets.create(database); + return bucket; + } + + +} diff --git a/src/main/java/com/jjsk/config/ServerConfig.java b/src/main/java/com/jjsk/config/ServerConfig.java new file mode 100644 index 0000000..6e9c9f1 --- /dev/null +++ b/src/main/java/com/jjsk/config/ServerConfig.java @@ -0,0 +1,28 @@ +package com.jjsk.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +/** + * @author Tadashi + * @descroption + * @date 2021/1/27 12:27 + */ +@Component +public class ServerConfig { + @Value("${server.port}") + private int serverPort; + + public String getUrl() { + InetAddress address = null; + try { + address = InetAddress.getLocalHost(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + return "http://" + address.getHostAddress() + ":" + this.serverPort; + } +} diff --git a/src/main/java/com/jjsk/config/Swagger2Config.java b/src/main/java/com/jjsk/config/Swagger2Config.java new file mode 100644 index 0000000..7419abb --- /dev/null +++ b/src/main/java/com/jjsk/config/Swagger2Config.java @@ -0,0 +1,34 @@ +package com.jjsk.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; + +/** + * Swagger2API文档的配置 + */ +@Configuration +public class Swagger2Config { + @Bean + public Docket createRestApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .select() + .apis(RequestHandlerSelectors.basePackage("com.jjsk")) + .paths(PathSelectors.any()) + .build(); + } + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("FileSystem Api") + .description("FileSystem Api SpringCloud") + .version("1.0") + .build(); + } +} diff --git a/src/main/java/com/jjsk/controller/FileUploadController.java b/src/main/java/com/jjsk/controller/FileUploadController.java new file mode 100644 index 0000000..ff7a61d --- /dev/null +++ b/src/main/java/com/jjsk/controller/FileUploadController.java @@ -0,0 +1,91 @@ +package com.jjsk.controller; + +import com.jjsk.api.FileUploadControllerApi; +import com.jjsk.common.domain.ApiResult; +import com.jjsk.entity.bo.UploadPartBo; +import com.jjsk.entity.vo.CheckPartVo; +import com.jjsk.entity.vo.FileUploadVo; +import com.jjsk.service.FileUploadService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * @author Tadashi + * @descroption + * @date 2021/1/22 10:47 + */ +@Slf4j +@RestController +@RequestMapping("file") +@RequiredArgsConstructor +public class FileUploadController implements FileUploadControllerApi { + + private final FileUploadService service; + + @Override + @PostMapping("upload") + public ApiResult upload(@RequestParam MultipartFile file) { + return ApiResult.ok(service.upload(file)); + } + + @Override + @PostMapping("batch/upload") + public ApiResult batchUpload(@RequestParam MultipartFile[] file) { + return ApiResult.ok(service.batchUpload(file)); + } + + @Override + @GetMapping("preview/{id}.*") + public void preview(@PathVariable String id, @RequestParam(required = false,defaultValue = "false") boolean inline, HttpServletResponse response) { + service.preview(id, inline, response); + } + + @Override + @DeleteMapping("delete/{id}") + public ApiResult delete(@PathVariable String id) { + return service.delete(id); + } + + @Override + @DeleteMapping("batchDelete") + public ApiResult batchDelete(@RequestParam List ids) { + return service.batchDelete(ids); + } + + @Override + @GetMapping("get/{id}") + public ApiResult getFileById(@PathVariable String id) { + return service.getFileById(id); + } + + @Override + @GetMapping("getFileInfo/{id}") + public ApiResult getFileInfoById(@PathVariable String id) { + return service.getFileInfo(id); + } + + @Override + @PutMapping("rename/{id}/{name}") + public ApiResult rename(@PathVariable String id, @PathVariable String name) { + return service.rename(id, name); + } + + @Override + @PostMapping("uploadPart") + public ApiResult uploadPart(UploadPartBo file) { + FileUploadVo vo = service.uploadPart(file); + log.info(" uploadPart {}", vo); + return ApiResult.ok(vo); + } + + @Override + @GetMapping("checkFileMd5/{md5}/{name}/{chunkTotal}") + public ApiResult checkFileMd5(@PathVariable String md5, @PathVariable String name, @PathVariable Integer chunkTotal) { + return service.checkFileMd5(md5, name, chunkTotal); + } +} diff --git a/src/main/java/com/jjsk/entity/bo/UploadPartBo.java b/src/main/java/com/jjsk/entity/bo/UploadPartBo.java new file mode 100644 index 0000000..0a79f3b --- /dev/null +++ b/src/main/java/com/jjsk/entity/bo/UploadPartBo.java @@ -0,0 +1,44 @@ +package com.jjsk.entity.bo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + + +@Data +@ApiModel("File-Vo") +public class UploadPartBo { + + @ApiModelProperty("文件Id,第一片上传后会返回,后续片段必须带上") + private String fileId; + + @ApiModelProperty("文件名称,第一片上传必须带上") + private String name; + + @ApiModelProperty("文件大小,第一片上传必须带上") + private Long size; + + @ApiModelProperty(value = "分片块大小", required = true) + private Integer chunkSize; + + @ApiModelProperty(value = "分片块索引, 从零开始", required = true) + private Integer chunkIndex; + + @ApiModelProperty("文件MD5") + private String md5; + + @ApiModelProperty(value = "文件", required = true) + private MultipartFile file; + + @Override + public String toString() { + return "UploadPartBo{" + + "fileId='" + fileId + '\'' + + ", name='" + name + '\'' + + ", size=" + size + + ", chunkSize=" + chunkSize + + ", chunkIndex=" + chunkIndex + + '}'; + } +} diff --git a/src/main/java/com/jjsk/entity/vo/CheckPartVo.java b/src/main/java/com/jjsk/entity/vo/CheckPartVo.java new file mode 100644 index 0000000..37e376b --- /dev/null +++ b/src/main/java/com/jjsk/entity/vo/CheckPartVo.java @@ -0,0 +1,28 @@ +package com.jjsk.entity.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +/** + * @author chonghui.tian + * @descroption + * @date 2021/5/20 17:48 + */ +@Data +@Builder +@ApiModel("Check-Vo") +public class CheckPartVo{ + @ApiModelProperty("分块索引") + private Integer chunkIndex; + + @ApiModelProperty("文件Id") + private String fileId; + + @ApiModelProperty("状态: 0=从断点开始传, 1=秒传, 2=从新上传") + private Integer status; + + @ApiModelProperty("元数据信息") + private FileUploadVo fileInfo; +} diff --git a/src/main/java/com/jjsk/entity/vo/FileUploadVo.java b/src/main/java/com/jjsk/entity/vo/FileUploadVo.java new file mode 100644 index 0000000..6376073 --- /dev/null +++ b/src/main/java/com/jjsk/entity/vo/FileUploadVo.java @@ -0,0 +1,42 @@ +package com.jjsk.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * file - vo + */ +@Data +@Builder +@ApiModel("File-Vo") +public class FileUploadVo { + + @ApiModelProperty("文件Id") + private String fileId; + + @ApiModelProperty("文件名称") + private String name; + + @ApiModelProperty("文件大小") + private Long size; + + @ApiModelProperty("文件类型") + private String contentType; + + @ApiModelProperty("文件后缀") + private String suffix; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime gmtCreated; + + @ApiModelProperty("预览地址") + private String previewUrl; + + +} diff --git a/src/main/java/com/jjsk/exception/BusinessException.java b/src/main/java/com/jjsk/exception/BusinessException.java new file mode 100644 index 0000000..04ad1ce --- /dev/null +++ b/src/main/java/com/jjsk/exception/BusinessException.java @@ -0,0 +1,47 @@ +package com.jjsk.exception; + +import com.jjsk.common.domain.ResultMsg; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * 业务异常 + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class BusinessException extends RuntimeException { + + private ResultMsg resultMsg; + + public BusinessException(String msg) { + super(msg); + } + + public BusinessException(ResultMsg result) { + super(result.getMsg()); + this.resultMsg = result; + } + + public BusinessException(String message, Exception e) { + super(message, e); + } + + public BusinessException(ResultMsg result, String message) { + super(message); + this.resultMsg = result; + } + + public static BusinessException of(ResultMsg msg) { + return new BusinessException(msg); + } + + public static BusinessException of(String message) { + return new BusinessException(ResultMsg.FAIL, message); + } + + public static BusinessException of(String message, Exception e) { + return new BusinessException(message, e); + } +} diff --git a/src/main/java/com/jjsk/exception/GlobalExceptionHandler.java b/src/main/java/com/jjsk/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..90d84f5 --- /dev/null +++ b/src/main/java/com/jjsk/exception/GlobalExceptionHandler.java @@ -0,0 +1,122 @@ +package com.jjsk.exception; + +import com.jjsk.common.domain.ApiResult; +import com.jjsk.common.domain.ResultMsg; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import javax.servlet.http.HttpServletRequest; +import java.io.UnsupportedEncodingException; +import java.net.ConnectException; +import java.net.SocketTimeoutException; +import java.net.URLDecoder; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +/** + * 全局异常拦截 + */ +@Slf4j +@Component +@RestControllerAdvice +public class GlobalExceptionHandler { + + /** + * 处理业务异常 + * + * @param ex {@link BusinessException} + * @return ApiResult + */ + @ExceptionHandler(BusinessException.class) + public ApiResult handleException(BusinessException ex) { + ApiResult restVo = ApiResult.fail(); + if (ex.getResultMsg() != null) { + restVo.setCode(ex.getResultMsg().getCode()); + } + restVo.setMsg(ex.getMessage()); + log.error("业务异常 [code => {}, msg => {}]", restVo.getCode(), restVo.getMsg(), ex); + return restVo; + } + + /** + * nacos连接异常 + * + * @param ex + * @return + */ + @ExceptionHandler({ConnectException.class, SocketTimeoutException.class}) + public ApiResult handleException(ConnectException ex) { + ApiResult restVo = ApiResult.fail(); + if (ex.getMessage() != null) { + restVo.setCode(ResultMsg.SERVER_ERROR.getCode()); + } + restVo.setMsg("nacos服务连接异常, 正在尝试重连"); + return restVo; + } + + /** + * 请求方式不支持异常 + * + * @param ex + * @return + */ + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public ApiResult handleException(HttpRequestMethodNotSupportedException ex) { + ApiResult restVo = ApiResult.fail(); + if (ex.getMessage() != null) { + restVo.setCode(ResultMsg.FAIL.getCode()); + } + restVo.setMsg("不支持" + ex.getMethod() + "请求"); + return restVo; + } + + /** + * 参数校验异常处理 + * + * @param ex {@link MethodArgumentNotValidException} + * @return ApiResult + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public ApiResult> handleException(MethodArgumentNotValidException ex) { + log.error("Argument Not Valid Exception"); + BindingResult bindingResult = ex.getBindingResult(); + Map data = new HashMap<>(8); + bindingResult.getAllErrors().forEach(it -> { + FieldError fieldError = (FieldError) it; + log.error("objectName: {}, field: {}, message: {}", fieldError.getObjectName(), fieldError.getField(), fieldError.getDefaultMessage()); + data.put(fieldError.getField(), fieldError.getDefaultMessage()); + }); + return ApiResult.of(ResultMsg.ARGUMENT_NOT_INVALID, data); + } + + /** + * 处理系统异常 + * + * @param ex {@link Exception} + * @param request 请求 + * @return ApiResult + */ + @ExceptionHandler(Exception.class) + public ApiResult handleException(Exception ex, HttpServletRequest request) throws UnsupportedEncodingException { + StringBuilder message = new StringBuilder(); + message.append("\n######################### Error #########################\n"); + message.append("RequestURI: ").append(request.getRequestURI()).append("\n"); + message.append("Method: ").append(request.getMethod()).append("\n"); + message.append("Headers: \n"); + Iterator headerIterator = CollectionUtils.toIterator(request.getHeaderNames()); + while (headerIterator.hasNext()) { + String name = headerIterator.next(); + message.append("\t").append(name).append(": ").append(URLDecoder.decode(request.getHeader(name), "UTF-8")).append("\n"); + } + log.info(message.toString(), ex); + return ApiResult.error(); + } +} diff --git a/src/main/java/com/jjsk/service/FileUploadService.java b/src/main/java/com/jjsk/service/FileUploadService.java new file mode 100644 index 0000000..24e470e --- /dev/null +++ b/src/main/java/com/jjsk/service/FileUploadService.java @@ -0,0 +1,334 @@ +package com.jjsk.service; + +import com.alibaba.fastjson.JSON; +import com.jjsk.common.domain.ApiResult; +import com.jjsk.common.domain.BaseConstants; +import com.jjsk.common.domain.ResultMsg; +import com.jjsk.entity.bo.UploadPartBo; +import com.jjsk.entity.vo.CheckPartVo; +import com.jjsk.entity.vo.FileUploadVo; +import com.jjsk.exception.BusinessException; +import com.mongodb.MongoClient; +import com.mongodb.MongoClientSettings; +import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.gridfs.GridFSBucket; +import com.mongodb.client.gridfs.GridFSDownloadStream; +import com.mongodb.client.gridfs.model.GridFSFile; +import com.mongodb.client.model.Filters; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.io.IOUtils; +import org.bson.BsonObjectId; +import org.bson.BsonValue; +import org.bson.Document; +import org.bson.types.Binary; +import org.bson.types.ObjectId; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.gridfs.GridFsResource; +import org.springframework.data.mongodb.gridfs.GridFsTemplate; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.bson.codecs.configuration.CodecRegistries.fromRegistries; + +/** + * @author Tadashi + * @descroption + * @date 2021/1/22 10:49 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class FileUploadService { + + private final GridFsTemplate gridFsTemplate; + private final MongoClient mongoClient; + private final GridFSBucket gridFSBucket; + @Value("${base.fs.base-preview-url}") + private String previewUrl; + + @Value("${base.fs.download-file-path}") + private String downloadTempPath;// = "D:/work"; + + @Value("${spring.data.mongodb.database}") + String database; + + public FileUploadVo upload(MultipartFile file) { + try { + String fileName = Optional.ofNullable(file.getOriginalFilename()).orElse(file.getName()); + GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("md5").is(DigestUtils.md5Hex(file.getInputStream())).and("filename").is(fileName))); + if (Objects.nonNull(gridFSFile)) { + return FileUploadVo.builder() + .fileId(gridFSFile.getObjectId().toHexString()) + .name(fileName) + .size(gridFSFile.getLength()) + .contentType(gridFSFile.getMetadata().getString(BaseConstants.FILE_METADATA_CONTENT_TYPE)) + .suffix(gridFSFile.getMetadata().getString(BaseConstants.FILE_METADATA_SUFFIX)) + .gmtCreated(LocalDateTime.ofInstant(gridFSFile.getUploadDate().toInstant(), ZoneId.systemDefault())) + .previewUrl(previewUrl + "/file/preview/" + gridFSFile.getObjectId().toHexString() + gridFSFile.getMetadata().getString(BaseConstants.FILE_METADATA_SUFFIX)) + .build(); + } else { + Document metadata = new Document() + .append(BaseConstants.FILE_METADATA_CONTENT_TYPE, file.getContentType()) + .append(BaseConstants.FILE_METADATA_SUFFIX, fileName.substring(fileName.lastIndexOf("."))); + log.info("name: {}, size: {}", fileName, file.getSize()); + ObjectId objectId = gridFsTemplate.store(file.getInputStream(), fileName, metadata); + log.info("upload success {}, objectId: {}", fileName, objectId.toHexString()); + return FileUploadVo.builder() + .fileId(objectId.toHexString()) + .name(fileName) + .size(file.getSize()) + .contentType(metadata.getString(BaseConstants.FILE_METADATA_CONTENT_TYPE)) + .suffix(metadata.getString(BaseConstants.FILE_METADATA_SUFFIX)) + .gmtCreated(LocalDateTime.now()) + .previewUrl(previewUrl + "/file/preview/" + objectId.toHexString() + metadata.getString(BaseConstants.FILE_METADATA_SUFFIX)) + .build(); + } + } catch (Exception e) { + log.info("upload file exception <<<=== ", e); + throw new BusinessException("File upload failed!Error: " + e.getMessage()); + } + } + + public List batchUpload(MultipartFile[] file) { + return Stream.of(file).map(this::upload).collect(Collectors.toList()); + } + + public void preview(String id, boolean inline, HttpServletResponse response) { + try (OutputStream out = response.getOutputStream()) { + GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(id))); + if (null != gridFSFile) { + Document document = Optional.ofNullable(gridFSFile.getMetadata()).orElse(new Document()); + response.setCharacterEncoding("UTF-8"); + if (inline) { + response.addHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;fileName=" + URLEncoder.encode(gridFSFile.getFilename(), String.valueOf(StandardCharsets.UTF_8))); + } else { + response.addHeader(HttpHeaders.CONTENT_DISPOSITION, "inline;fileName=" + URLEncoder.encode(gridFSFile.getFilename(), String.valueOf(StandardCharsets.UTF_8))); + + } + response.addHeader(HttpHeaders.CONTENT_TYPE, Optional.ofNullable(document.getString(BaseConstants.FILE_METADATA_CONTENT_TYPE)).orElse("image/jpeg")); + response.addHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(gridFSFile.getLength())); + gridFSBucket.downloadToStream(gridFSFile.getObjectId(), out); + } else { + out.write(JSON.toJSONString(ApiResult.error("file does not exist!")).getBytes(StandardCharsets.UTF_8)); + } + } catch (Exception e) { + log.error("file preview exception <<<=== ", e); + throw new BusinessException("File preview failed!Error: " + e.getMessage()); + } + } + + public ApiResult delete(String id) { + try { + gridFsTemplate.delete(new Query().addCriteria(Criteria.where("_id").is(id))); + return ApiResult.ok(); + } catch (Exception e) { + log.debug("删除文件失败: fileId = {}", id); + throw BusinessException.of(ResultMsg.DATA_NOT_FOUND); + } + } + + public ApiResult batchDelete(List ids) { + return ApiResult.ok(ids.stream().map(this::delete).collect(Collectors.toList())); + } + + public ApiResult getFileById(String id) { + GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(id))); + if (null == gridFSFile) { + return ApiResult.ok(ResultMsg.DATA_NOT_FOUND.getMsg()); + } + GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getObjectId()); + + GridFsResource gridFsResource = new GridFsResource(gridFSFile, gridFSDownloadStream); + + try { + byte[] bytes = IOUtils.toByteArray(gridFsResource.getInputStream()); + return ApiResult.ok(new String(bytes, "ISO-8859-1")); + } catch (IOException e) { + log.error("file fetch exception <<<=== ", e); + throw new BusinessException("File fetch failed!Error: " + e.getMessage()); + } + } + + public ApiResult getFileInfo(String id) { + GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(id))); + if (null == gridFSFile) { + return ApiResult.ok(ResultMsg.DATA_NOT_FOUND.getMsg()); + } + return ApiResult.ok(FileUploadVo.builder() + .fileId(gridFSFile.getObjectId().toHexString()) + .name(gridFSFile.getFilename()) + .size(Long.valueOf(gridFSFile.getChunkSize())) + .contentType(gridFSFile.getMetadata().getString(BaseConstants.FILE_METADATA_CONTENT_TYPE)) + .suffix(gridFSFile.getMetadata().getString(BaseConstants.FILE_METADATA_SUFFIX)) + .gmtCreated(LocalDateTime.ofInstant(gridFSFile.getUploadDate().toInstant(), ZoneId.systemDefault())) + .previewUrl(previewUrl + "/file/preview/" + gridFSFile.getObjectId().toHexString() + gridFSFile.getMetadata().getString(BaseConstants.FILE_METADATA_SUFFIX)) + .build()); + } + + public ApiResult rename(String id, String name) { + GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(id))); + if (null == gridFSFile) { + return ApiResult.ok(ResultMsg.DATA_NOT_FOUND.getMsg()); + } + gridFSBucket.rename(new ObjectId(id), name); + return ApiResult.ok(FileUploadVo.builder() + .fileId(gridFSFile.getObjectId().toHexString()) + .name(name) + .size(Long.valueOf(gridFSFile.getChunkSize())) + .contentType(gridFSFile.getMetadata().getString(BaseConstants.FILE_METADATA_CONTENT_TYPE)) + .suffix(gridFSFile.getMetadata().getString(BaseConstants.FILE_METADATA_SUFFIX)) + .gmtCreated(LocalDateTime.ofInstant(gridFSFile.getUploadDate().toInstant(), ZoneId.systemDefault())) + .previewUrl(previewUrl + "/file/preview/" + gridFSFile.getObjectId().toHexString() + gridFSFile.getMetadata().getString(BaseConstants.FILE_METADATA_SUFFIX)) + .build()); + } + + public FileUploadVo uploadPart(UploadPartBo part) { + log.info("uploadPart ===>>> part: {}, chunkSize: {}, ContentType: {}", part, part.getFile().getSize(), part.getFile().getContentType()); + try { + MultipartFile file = part.getFile(); + if (StringUtils.hasText(part.getFileId())) { + // TODO 块验证 + ObjectId objectId = new ObjectId(part.getFileId()); + writeChunk(new BsonObjectId(objectId), part.getChunkIndex(), file.getBytes()); + log.info("第 {} 片上传完毕, 文件Id: {}", part.getChunkIndex(), objectId); + return FileUploadVo.builder().fileId(objectId.toHexString()).build(); + } else { + ObjectId objectId = new ObjectId(); + BsonValue fileId = new BsonObjectId(objectId); + Document metadata = new Document() + .append(BaseConstants.FILE_METADATA_CONTENT_TYPE, file.getContentType()) + .append(BaseConstants.FILE_METADATA_SUFFIX, file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."))); + log.info(" --metadata-- {}", metadata); + + String fileName = part.getName(); + MongoCollection filesCollection = getFilesCollection(mongoClient.getDatabase(database), gridFSBucket.getBucketName()); + GridFSFile gridFSFile = new GridFSFile(fileId, fileName, part.getSize(), part.getChunkSize(), new Date(), part.getMd5(), metadata); + filesCollection.insertOne(gridFSFile); + writeChunk(fileId, part.getChunkIndex(), file.getBytes()); + return FileUploadVo.builder() + .fileId(objectId.toHexString()) + .name(fileName) + .size(part.getSize()) + .contentType(metadata.getString(BaseConstants.FILE_METADATA_CONTENT_TYPE)) + .suffix(metadata.getString(BaseConstants.FILE_METADATA_SUFFIX)) + .gmtCreated(LocalDateTime.now()) + .previewUrl(previewUrl + "/file/preview/" + objectId.toHexString() + metadata.getString(BaseConstants.FILE_METADATA_SUFFIX)) + .build(); + } + } catch (IOException e) { + log.error("fragment upload exception <<<=== part: {}, msg: {}", part, e.getMessage()); + throw new BusinessException("Fragment upload failed!Error: " + e.getMessage()); + } + } + + public ApiResult checkFileMd5(String md5, String name, Integer chunkTotal) { + GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("md5").is(md5).and("filename").is(name))); + CheckPartVo build = CheckPartVo.builder().chunkIndex(0).status(2).build(); + if (Objects.nonNull(gridFSFile)) { + MongoCollection chunksCollection = getChunksCollection(mongoClient.getDatabase(database), gridFSBucket.getBucketName()); + FindIterable findIterable = chunksCollection + .find(Filters.eq("files_id", gridFSFile.getId())) + .sort(Filters.eq("n", -1)) + .limit(1); + int chunkIndex = findIterable.first().getInteger("n", 0); + // 当前片数 < 总片数 说明没有上传完成 + // 等于 至直接返回文件Id + if (chunkIndex < chunkTotal) { + build.setFileId(gridFSFile.getObjectId().toHexString()); + build.setChunkIndex(chunkIndex); + build.setStatus(0); + } else { + build.setStatus(1); + build.setFileInfo(FileUploadVo.builder() + .fileId(gridFSFile.getObjectId().toHexString()) + .name(name) + .size(gridFSFile.getLength()) + .contentType(gridFSFile.getMetadata().getString(BaseConstants.FILE_METADATA_CONTENT_TYPE)) + .suffix(gridFSFile.getMetadata().getString(BaseConstants.FILE_METADATA_SUFFIX)) + .gmtCreated(LocalDateTime.ofInstant(gridFSFile.getUploadDate().toInstant(), ZoneId.systemDefault())) + .previewUrl(previewUrl + "/file/preview/" + gridFSFile.getObjectId().toHexString() + gridFSFile.getMetadata().getString(BaseConstants.FILE_METADATA_SUFFIX)) + .build()); + } + } + return ApiResult.ok(build); + } + + + private void writeChunk(BsonValue fileId, Integer chunkIndex, byte[] bytes) { + log.info("writeChunk ===>>> fileId: {} , chunkIndex: {} , length: {} ", fileId, chunkIndex, bytes.length); + MongoCollection chunksCollection = getChunksCollection(mongoClient.getDatabase(database), gridFSBucket.getBucketName()); + chunksCollection.insertOne(new Document("files_id", fileId).append("n", chunkIndex).append("data", new Binary(bytes))); + } + + private static MongoCollection getFilesCollection(final MongoDatabase database, final String bucketName) { + return database.getCollection(bucketName + ".files", GridFSFile.class).withCodecRegistry( + fromRegistries(database.getCodecRegistry(), MongoClientSettings.getDefaultCodecRegistry()) + ); + } + + private static MongoCollection getChunksCollection(final MongoDatabase database, final String bucketName) { + return database.getCollection(bucketName + ".chunks").withCodecRegistry(MongoClientSettings.getDefaultCodecRegistry()); + } + + + private byte[] getBytes(InputStream inputStream) throws Exception{ + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] b = new byte[1024]; + int i = 0; + while (-1!=(i=inputStream.read(b))){ + bos.write(b,0,i); + } + return bos.toByteArray(); + } + + /** + * 文件下载 + * + * @param response + * @param zipFileName + */ + private void downFile(HttpServletResponse response, String zipFileName, Long totalBytes) { + try { + String path = downloadTempPath + zipFileName; + File file = new File(path); + if (file.exists()) { + try (InputStream ins = new FileInputStream(path); + BufferedInputStream bins = new BufferedInputStream(ins); + OutputStream outs = response.getOutputStream(); + BufferedOutputStream bouts = new BufferedOutputStream(outs)) { + response.setContentType("application/x-download"); + response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(zipFileName, "UTF-8")); + int bytesRead = 0; + byte[] buffer = new byte[totalBytes.intValue()]; + while ((bytesRead = bins.read(buffer, 0, totalBytes.intValue())) != -1) { + bouts.write(buffer, 0, bytesRead); + } + bouts.flush(); + } + } + } catch (Exception e) { + log.error("文件下载出错", e); + } + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..f285887 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,16 @@ +server: + port: 30301 +spring: + data: + mongodb: + uri: mongodb://192.168.11.118:31017/ + database: jjsk_mp_fileserver + servlet: + # limit upload file size + multipart: + max-file-size: 16GB + max-request-size: 1024GB +base: + fs: + base-preview-url: http://192.168.11.118:30071/file/no_token + download-file-path: /opt \ No newline at end of file diff --git a/src/main/resources/bootstrap.yml b/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 0000000..f363755 --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,191 @@ + + + + + + + logback + + + + + + + + + + + + + + + + + debug + + + ${CONSOLE_LOG_PATTERN} + + UTF-8 + + + + + + + + ${log.path}/debug.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + + ${log.path}/debug-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + debug + ACCEPT + DENY + + + + + + + ${log.path}/info.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + + ${log.path}/info-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + info + ACCEPT + DENY + + + + + + + ${log.path}/warn.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + ${log.path}/warn-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + warn + ACCEPT + DENY + + + + + + + ${log.path}/error.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + ${log.path}/error-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + ERROR + ACCEPT + DENY + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/java/com/jjsk/FilesystemApplicationTests.java b/src/test/java/com/jjsk/FilesystemApplicationTests.java new file mode 100644 index 0000000..b420233 --- /dev/null +++ b/src/test/java/com/jjsk/FilesystemApplicationTests.java @@ -0,0 +1,98 @@ +package com.jjsk; + +import com.mongodb.MongoClient; +import com.mongodb.MongoClientSettings; +import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.gridfs.GridFSBucket; +import com.mongodb.client.gridfs.GridFSBuckets; +import com.mongodb.client.gridfs.GridFSFindIterable; +import com.mongodb.client.gridfs.model.GridFSFile; +import com.mongodb.client.model.Filters; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.bson.Document; +import org.bson.types.ObjectId; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.gridfs.GridFsTemplate; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; + +import static org.bson.codecs.configuration.CodecRegistries.fromRegistries; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class FilesystemApplicationTests { + + Log log = LogFactory.getLog(FilesystemApplicationTests.class); + + @Value("${spring.data.mongodb.database}") + String database; + + @Resource + private MongoClient mongoClient; + + @Resource + private GridFSBucket gridFsBucket; + + @Resource + GridFsTemplate gridFsTemplate; + + @Test + public void findOne() throws Exception { + // 获取文件ID + String objectId = "60a2595236147e43e622330c"; + // 创建一个容器,传入一个`MongoDatabase`类实例db + GridFSBucket bucket = GridFSBuckets.create(mongoClient.getDatabase(database)); + // 获取内容 + GridFSFindIterable gridFSFindIterable = bucket.find(Filters.eq("_id", new ObjectId(objectId))); + GridFSFile gridFSFile = gridFSFindIterable.first(); + System.out.println("fileInfo: " + gridFSFile); + + } + + public int checkFileMd5(String md5){ + GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("md5").is(md5)).with(Sort.by(Sort.Order.desc("uploadDate")))); + System.out.println(gridFSFile); + MongoCollection chunksCollection = getChunksCollection(mongoClient.getDatabase(database), gridFsBucket.getBucketName()); + FindIterable findIterable = chunksCollection + .find(Filters.eq("files_id", gridFSFile.getId())) + .sort(Filters.eq("n", -1)) + .limit(1); + int chunkIndex = findIterable.first().getInteger("n", 0); + int multiply = chunkIndex * 255; + return Integer.valueOf(Math.abs(multiply / 10485760)); + } + + + @Test + public void test01() { + MongoCollection filesCollection = getFilesCollection(mongoClient.getDatabase(database), gridFsBucket.getBucketName()); + GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is("607e7193f7469561976fdeda"))); + MongoCollection chunksCollection = getChunksCollection(mongoClient.getDatabase(database), gridFsBucket.getBucketName()); + FindIterable findIterable = chunksCollection.find(new Document().append("files_id", gridFSFile.getObjectId())); + MongoCursor cursor1 = findIterable.iterator(); + while (cursor1.hasNext()){ + System.out.println(cursor1.next()); + } + } + + private static MongoCollection getFilesCollection(final MongoDatabase database, final String bucketName) { + return database.getCollection(bucketName + ".files", GridFSFile.class).withCodecRegistry( + fromRegistries(database.getCodecRegistry(), MongoClientSettings.getDefaultCodecRegistry()) + ); + } + + private static MongoCollection getChunksCollection(final MongoDatabase database, final String bucketName) { + return database.getCollection(bucketName + ".chunks").withCodecRegistry(MongoClientSettings.getDefaultCodecRegistry()); + } +} diff --git "a/\346\226\207\344\273\266\346\234\215\345\212\241Api\346\226\207\346\241\243.md" "b/\346\226\207\344\273\266\346\234\215\345\212\241Api\346\226\207\346\241\243.md" new file mode 100644 index 0000000..0c99372 --- /dev/null +++ "b/\346\226\207\344\273\266\346\234\215\345\212\241Api\346\226\207\346\241\243.md" @@ -0,0 +1,611 @@ +# 文件服务Api文档 + +## 概览 + +FileServer Api + + + +FileServer Api SpringCloud + +版本信息 + +*版本* : 1.0 + +通用说明: + +①接口通用前缀: + +> 开发环境: http://IP:端口/网关前缀 +> 测试环境 http://IP:端口/网关前缀 + +② 接口通用返回: + +```json +{ + "code": 200, // 正确码为0000 错误码为0001 + "msg": "操作成功", // 如发生错误此处会显示相关错误信息 + "result": {},// 所有需要的结果集都会放在该对象中 + "success": true,// 是否成功 + "timestamp": 0// 返回当前时间 +} +``` + + + +## 获取文件信息 + +- **请求URL** + +> ``` +> file/getFileInfo/{id} +> ``` + +- **请求方式** + +> **GET** + +- **请求参数** + +| 请求参数 | 必选 | 参数类型 | 说明 | +| :------- | :--- | -------- | ------ | +| **id** | 是 | String | 文件ID | + +- **返回示例** + +```json +// 正确示例 +{ + "code": 200, + "success": true, + "msg": "操作成功", + "result": { + "fileId": "606c0dd30ad8e3293c28e376", + "name": "企业微信截图_e3745bc4-7c76-45f7-9d7f-a5cb82e9a347.png", + "size": 261120, + "contentType": "image/png", + "suffix": ".png", + "gmtCreated": "2021-04-06T15:29:23.61", + "previewUrl": "http://192.168.11.118:30071/file/no_token/file/preview/606c0dd30ad8e3293c28e376.png" + }, + "timestamp": 1625536627434 +} +// 未找到记录 +{ + "code": 200, + "success": true, + "msg": "操作成功", + "result": "没有找到记录", + "timestamp": 1618905924435 +} +// 错误示例 +{ + "code": -1, + "success": false, + "msg": "系统开小差了", + "result": null, + "timestamp": 1618906394567 +} +``` + +------ + +## 获取文件二进制数据 + +- **请求URL** + +> ``` +> file/get/{id} +> ``` + +- **请求方式** + +> **GET** + +- **请求参数** + +| 请求参数 | 必选 | 参数类型 | 说明 | +| :------- | :--- | -------- | ------ | +| **id** | 是 | String | 文件ID | + +- **返回示例** + +```json +// 正确示例 +{ + "code": 200, + "msg": "操作成功", + "result": { + // 返回文件内容: Byte数组 ps: 后端程序员使用'ISO-8859-1'编码进行解析 + // Java代码示例: byte[] bytes = result.getResult().toString().getBytes("ISO-8859-1"); + }, + "success": true, + "timestamp": 0 +} +// 未找到记录 +{ + "code": 200, + "success": true, + "msg": "操作成功", + "result": "没有找到记录", + "timestamp": 1618905924435 +} +// 错误示例 +{ + "code": -1, + "success": false, + "msg": "系统开小差了", + "result": null, + "timestamp": 1618906394567 +} +``` + +------ + +## 单文件上传 + +- **请求URL** + +> ``` +> file/upload +> ``` + +- **请求方式** + +> **POST** + +- **请求参数** + +| 请求参数 | 必选 | 参数类型 | +| :------- | :--- | ------------------- | +| **file** | 是 | multipart/form-data | + +- **返回示例** + +```json +// 正确示例 +{ + "code": 200, + "success": true, + "msg": "操作成功", + "result": { + "fileId": "607e78b2f7469561976fdf1f", //文件ID + "name": "Blade部署手册.pdf", //文件名称 + "size": 17522289, //文件大小 + "contentType": "application/pdf", //文件类型 + "suffix": ".pdf", //文件后缀 + "gmtCreated": "2021-04-20T14:46:10.76",//文件上传时间 + "previewUrl": "http://192.168.11.118:30071/file/no_token/file/preview/607e78b2f7469561976fdf1f.pdf" + //预览地址 + }, + "timestamp": 1618901170760 +} +// 错误示例 +{ + "code": -1, + "success": false, + "msg": "系统开小差了", + "result": null, + "timestamp": 1618906394567 +} +``` + +------ + +## 批量上传文件 + +- **请求URL** + +> ``` +> file/batch/upload +> ``` + +- **请求方式** + +> **POST** + +- **请求参数** + +| 请求参数 | 必选 | 参数类型 | +| :------- | :--- | ------------------- | +| **file** | 是 | multipart/form-data | + +- **返回示例** + +```json +// 正确示例 +{ + "code": 200, + "success": true, + "msg": "操作成功", + "result": [ + { + "fileId": "607e78b2f7469561976fdf1f", + "name": "Blade部署手册.pdf", + "size": 17522289, + "contentType": "application/pdf", + "suffix": ".pdf", + "gmtCreated": "2021-04-20T14:46:10.76", + "previewUrl": "http://192.168.11.118:30071/file/no_token/file/preview/607e78b2f7469561976fdf1f.pdf" + }, + { + "fileId": "607e78b2f7469561976fdf1f", + "name": "Blade部署手册.pdf", + "size": 17522289, + "contentType": "application/pdf", + "suffix": ".pdf", + "gmtCreated": "2021-04-20T14:46:10.76", + "previewUrl": "http://192.168.11.118:30071/file/no_token/file/preview/607e78b2f7469561976fdf1f.pdf" + } + ], + "timestamp": 1618901170760 +} +// 错误示例 +{ + "code": -1, + "success": false, + "msg": "系统开小差了", + "result": null, + "timestamp": 1618906394567 +} +``` + +------ + +## 文件重命名 + +- **请求URL** + +> ``` +> file/rename/{id}/{name} +> ``` + +- **请求方式** + +> **PUT** + +- **请求参数** + +| 请求参数 | 必选 | 参数类型 | 说明 | +| :------- | :--- | -------- | ------------ | +| **id** | 是 | String | 文件ID | +| **name** | 是 | String | 修改的文件名 | + +- **返回示例** + +```json +// 正确示例 +{ + "code": 200, + "success": true, + "msg": "操作成功", + "result": { + "fileId": "606c0dd30ad8e3293c28e376", + "name": "企业微信截图_e3745bc4-7c76-45f7-9d7f-a5cb82e9a347.png", + "size": 261120, + "contentType": "image/png", + "suffix": ".png", + "gmtCreated": "2021-04-06T15:29:23.61", + "previewUrl": "http://192.168.11.118:30071/file/no_token/file/preview/606c0dd30ad8e3293c28e376.png" + }, + "timestamp": 1625536627434 +} +// 未找到记录 +{ + "code": 200, + "success": true, + "msg": "操作成功", + "result": "没有找到记录", + "timestamp": 1618905924435 +} +// 错误示例 +{ + "code": -1, + "success": false, + "msg": "系统开小差了", + "result": null, + "timestamp": 1618906394567 +} +``` + +------ + +## 删除文件 + +- **请求URL** + +> ``` +> file/delete/{id} +> ``` + +- **请求方式** + +> **DELETE** + +- **请求参数** + +| 请求参数 | 必选 | 参数类型 | 说明 | +| :------- | :--- | -------- | ------ | +| **id** | 是 | String | 文件ID | + +- **返回示例** + +```json +// 正确示例 +{ + "code": 200, + "success": true, + "msg": "操作成功", + "result": null, + "timestamp": 1619081394608 +} +// 没找到记录 +{ + "code": 402, + "success": false, + "msg": "没有找到记录", + "result": null, + "timestamp": 1619081603366 +} +// 错误示例 +{ + "code": -1, + "success": false, + "msg": "系统开小差了", + "result": null, + "timestamp": 1618906394567 +} + +``` + +------ + +## 批量删除文件 + +- **请求URL** + +> ``` +> file/batchDelete +> ``` + +- **请求方式** + +> **DELETE** + +- **请求参数** + +| 请求参数 | 必选 | 参数类型 | 说明 | +| :------- | :--- | -------- | ------ | +| **ids** | 是 | String[] | 文件ID | + +- **返回示例** + +```json +// 正确示例 +{ + "code": 200, + "success": true, + "msg": "操作成功", + "result": [ + { + "code": 200, + "success": true, + "msg": "操作成功", + "result": null, + "timestamp": 1621319196454 + }, + { + "code": 200, + "success": true, + "msg": "操作成功", + "result": null, + "timestamp": 1621319196458 + } + ], + "timestamp": 1621319196458 +} +// 没找到记录 +{ + "code": 402, + "success": false, + "msg": "没有找到记录", + "result": null, + "timestamp": 1619081603366 +} +// 错误示例 +{ + "code": -1, + "success": false, + "msg": "系统开小差了", + "result": null, + "timestamp": 1618906394567 +} + +``` + +------ + +## 分片上传 + +- **请求URL** + +> ``` +> file/uploadPart +> +> ``` + +- **请求方式** + +> **POST** + +- **请求参数** + +| 请求参数 | 必选 | 参数类型 | 说明 | +| :------------- | :--- | ------------------- | ------------------------------------------ | +| **chunkIndex** | 是 | Integer | 分片块索引, 从零开始 | +| **chunkSize** | 是 | Integer | 分片块大小 单位: Bytes | +| **file** | 是 | multipart/form-data | 文件 | +| **md5** | 是 | String | 文件md5 | +| fileId | 否 | String | 文件Id,第一片上传后会返回,后续片段必须带上 | +| name | 否 | String | 文件名称,第一片上传必须带上 | +| size | 否 | Integer | 文件大小,第一片上传必须带上 单位: Bytes | + +- **返回示例** + +```json +// 正确示例 +{ + "code": 200, + "success": true, + "msg": "操作成功", + "result": { + "fileId": "60814509edf08973852c2ee4", + "name": "哈哈哈.pdf", + "size": 123123, + "contentType": "application/pdf", + "suffix": ".pdf", + "gmtCreated": null, + "previewUrl": "http://192.168.11.118:30071/file/no_token/file/preview/60814509edf08973852c2ee4.pdf" + }, + "timestamp": 1619084553272 +} +// 错误示例 +{ + "code": -1, + "success": false, + "msg": "系统开小差了", + "result": null, + "timestamp": 1618906394567 +} + +``` + +------ + +## 检查分片断点 + +- **请求URL** + +> ``` +> file/checkFileMd5/{md5}/{name}/{chunkTotal} +> +> ``` + +- **请求方式** + +> **GET** + +- **请求参数** + +| 请求参数 | 必选 | 参数类型 | 说明 | +| :------------- | :--- | -------- | --------- | +| **chunkTotal** | 是 | Integer | 分片总数 | +| md5 | 是 | String | 文件md5值 | +| name | 是 | String | 文件名称 | + +- **返回示例** + +```json +// 秒传 +{ + "code": 200, + "success": true, + "msg": "操作成功", + "result": { + "chunkIndex": 0, + "status": 1, + "fileInfo" : { + "fileId": "607e78b2f7469561976fdf1f", + "name": "Blade部署手册.pdf", + "size": 17522289, + "contentType": "application/pdf", + "suffix": ".pdf", + "gmtCreated": "2021-04-20T14:46:10.76", + "previewUrl": "http://192.168.11.118:30071/file/no_token/file/preview/607e78b2f7469561976fdf1f.pdf" + } + }, + "timestamp": 1621505490410 +} +// 从断点开始传 +{ + "code": 200, + "success": true, + "msg": "操作成功", + "result": { + "chunkIndex": 67, + "fileId": "606295fc1620152f08bb6438", + "status": 0 + }, + "timestamp": 1621505738527 +} +// 从新上传 +{ + "code": 200, + "success": true, + "msg": "操作成功", + "result": { + "chunkIndex": 0, + "fileId": null, + "status": 2 + }, + "timestamp": 1621505669103 +} +// 错误示例 +{ + "code": -1, + "success": false, + "msg": "系统开小差了", + "result": null, + "timestamp": 1618906394567 +} + +``` + +------ + +## 预览下载 + +简要描述 + +- file/preview/文件ID.*?inline=true //需要下载时添加inline参数 + +- **请求URL** + +> ``` +> file/preview/{id}.* +> +> ``` + +- **请求方式** + +> **GET** + +- **请求参数** + +| 请求参数 | 必选 | 参数类型 | 说明 | +| :------- | :--- | -------- | ------------------------------------------ | +| **id** | 是 | String | 分片块索引, 从零开始 | +| inline | 否 | Boolean | 是否下载, 可不传默认为预览
true为下载 | + +- **返回示例** + +```json +// 文件不存在 +{ + "code": -1, + "msg": "file does not exist!", + "success": false, + "timestamp": 1619083595233 +} +// 错误示例 +{ + "code": -1, + "success": false, + "msg": "系统开小差了", + "result": null, + "timestamp": 1618906394567 +} + +``` + +------ \ No newline at end of file -- Gitee From 8430ef95d5fab72aaf7a7ae5b2722d719606ae47 Mon Sep 17 00:00:00 2001 From: Tadashi Date: Tue, 12 Apr 2022 15:42:28 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E9=98=B6=E6=AE=B5=E6=80=A7=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=20=E3=80=90=E6=8F=90=E4=BA=A4=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E3=80=91=EF=BC=9A=E9=98=B6=E6=AE=B5=E6=80=A7=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=20=E3=80=90=E9=97=AE=E9=A2=98=E6=8F=8F=E8=BF=B0=E3=80=91?= =?UTF-8?q?=EF=BC=9A=E4=BB=A3=E7=A0=81=E6=95=B4=E7=90=86=20=E3=80=90?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=86=85=E5=AE=B9=E3=80=91=EF=BC=9A=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=95=B4=E7=90=86=20=E3=80=90=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BA=BA=E3=80=91=EF=BC=9Atadashi=20=E3=80=90=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8=E4=BA=BA=E3=80=91=EF=BC=9Atadashi=20=E3=80=90?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E6=84=8F=E8=A7=81=E3=80=91=EF=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 53 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index a1c2a23..a99f681 100644 --- a/.gitignore +++ b/.gitignore @@ -1,23 +1,38 @@ -# Compiled class file -*.class +HELP.md +.gradle +build/ +logs/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ -# Log file -*.log +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ -# BlueJ files -*.ctxt +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ -# Mobile Tools for Java (J2ME) -.mtj.tmp/ +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ -# Package Files # -*.jar -*.war -*.nar -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* +### VS Code ### +.vscode/ -- Gitee From 8aa6ad0fb034bc273e111ac31b059f53ad61df16 Mon Sep 17 00:00:00 2001 From: Tadashi Date: Tue, 12 Apr 2022 15:49:56 +0800 Subject: [PATCH 3/4] 111 --- .gitignore | 1 + .../executionHistory/executionHistory.bin | Bin 177476 -> 0 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 0 bytes .gradle/6.7.1/fileChanges/last-build.bin | Bin 1 -> 0 bytes .gradle/6.7.1/fileHashes/fileHashes.bin | Bin 20797 -> 0 bytes .gradle/6.7.1/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .../6.7.1/fileHashes/resourceHashesCache.bin | Bin 19245 -> 0 bytes .gradle/6.7.1/gc.properties | 0 .gradle/6.7.1/javaCompile/classAnalysis.bin | Bin 54906 -> 0 bytes .gradle/6.7.1/javaCompile/jarAnalysis.bin | Bin 23701 -> 0 bytes .gradle/6.7.1/javaCompile/javaCompile.lock | Bin 17 -> 0 bytes .gradle/6.7.1/javaCompile/taskHistory.bin | Bin 51284 -> 0 bytes .../buildOutputCleanup.lock | Bin 17 -> 0 bytes .gradle/buildOutputCleanup/cache.properties | 2 -- .gradle/buildOutputCleanup/outputFiles.bin | Bin 18947 -> 0 bytes .gradle/checksums/checksums.lock | Bin 17 -> 0 bytes .gradle/checksums/md5-checksums.bin | Bin 34047 -> 0 bytes .gradle/checksums/sha1-checksums.bin | Bin 135611 -> 0 bytes .gradle/configuration-cache/gc.properties | 0 .gradle/vcs-1/gc.properties | 0 .idea/.gitignore | 6 ----- .idea/compiler.xml | 16 ----------- .idea/encodings.xml | 6 ----- .idea/gradle.xml | 17 ------------ .idea/jarRepositories.xml | 25 ------------------ .idea/misc.xml | 24 ----------------- .idea/vcs.xml | 6 ----- 27 files changed, 1 insertion(+), 102 deletions(-) delete mode 100644 .gradle/6.7.1/executionHistory/executionHistory.bin delete mode 100644 .gradle/6.7.1/executionHistory/executionHistory.lock delete mode 100644 .gradle/6.7.1/fileChanges/last-build.bin delete mode 100644 .gradle/6.7.1/fileHashes/fileHashes.bin delete mode 100644 .gradle/6.7.1/fileHashes/fileHashes.lock delete mode 100644 .gradle/6.7.1/fileHashes/resourceHashesCache.bin delete mode 100644 .gradle/6.7.1/gc.properties delete mode 100644 .gradle/6.7.1/javaCompile/classAnalysis.bin delete mode 100644 .gradle/6.7.1/javaCompile/jarAnalysis.bin delete mode 100644 .gradle/6.7.1/javaCompile/javaCompile.lock delete mode 100644 .gradle/6.7.1/javaCompile/taskHistory.bin delete mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock delete mode 100644 .gradle/buildOutputCleanup/cache.properties delete mode 100644 .gradle/buildOutputCleanup/outputFiles.bin delete mode 100644 .gradle/checksums/checksums.lock delete mode 100644 .gradle/checksums/md5-checksums.bin delete mode 100644 .gradle/checksums/sha1-checksums.bin delete mode 100644 .gradle/configuration-cache/gc.properties delete mode 100644 .gradle/vcs-1/gc.properties delete mode 100644 .idea/.gitignore delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/encodings.xml delete mode 100644 .idea/gradle.xml delete mode 100644 .idea/jarRepositories.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/vcs.xml diff --git a/.gitignore b/.gitignore index a99f681..52617b4 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,4 @@ out/ ### VS Code ### .vscode/ +.idea/ \ No newline at end of file diff --git a/.gradle/6.7.1/executionHistory/executionHistory.bin b/.gradle/6.7.1/executionHistory/executionHistory.bin deleted file mode 100644 index 7b9063f0a8f35784e5946ba9e074f35c723e6b3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177476 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 J=C)z>{{f2xKnwr? diff --git a/.gradle/6.7.1/executionHistory/executionHistory.lock b/.gradle/6.7.1/executionHistory/executionHistory.lock deleted file mode 100644 index 5c032fcd650c42b999f28d06eaa7268921037933..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZSnb-nJ}^b5W}86ZFq086(92LJ#7 diff --git a/.gradle/6.7.1/fileChanges/last-build.bin b/.gradle/6.7.1/fileChanges/last-build.bin deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/.gradle/6.7.1/fileHashes/fileHashes.bin b/.gradle/6.7.1/fileHashes/fileHashes.bin deleted file mode 100644 index 7c44bc9bc367e0b4c7698d2604d39129d793c16d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20797 zcmeI3Ygkid0Dw1`A@_k0B4C1&f{=)Anuvf%Yz!D07Y(#Vp^3Qy`x#_^EfC_~=);*dF34FN1@B8Rbxo}gf!u2c;<*Ei1JVy#EMG(z$fO2Z8PLPhY`P&+|{)!dCwd<4^Z%`?l5m1 z$4!uX(GYKpi8y|~b)Z7dg@`wwE?KA5vS}UU-ZqF|cNFFpM%s@+?&pqp`_r@A)P*N~ zA!o-Ue#3F-MDxhqD#%&O5bqfg{NCl?IA1=#4{^x=Kb1Fe^PSi56GFC zhzFRC1!&FRc|<-wSix7-jrJIi)yVm`hzFL(+|S4qFN2&>gn00x4dt_$?0b;=JXY}9 zGOkghdK2VqCgM9pkz1lodyYcBQ5*43^jfm?D}^19``to(H`nN9Y=`M9$i1==k0@Dx zS-)tz{5)swMtq;I|4?oJAub&6vk>tE{G`Z2nuG^AqZ@Jbn?#~;;B$D73*Z8{04{(F z-~zY+E`ST*0=NJ!fD7OPxBxDI3*Z8{04{(F-~zY+E`ST*0=NJ!fD7OPxBxDI3*Z8{ z04{(F-~zY+E`ST*0{=yU72ri}z>lTuhpOqkE`nE}vy;ONs%Jlb0=|(EAtcxlPMR*`W9l4OY41R(oDI<9he3_p__&z_*f>=Ex-) zXTmqf4HZ}p2i>eGy|V3oIWXcX?=_`?kzi8`2RoHj>1J)GQ=D`YQ|$*QxttPkM*}%w zQP+FaDS@OeyJJDcU{$64q;2_^`S_Ac>jLQ(CuDOZMN#{qL1`lz-cpSO!-vN6ehCh= zu+6psBgl#7`M04!BCjMGE{8Uc8>H9{i)Igb&Tr?NOc}Wk=R!q`Pc+^MiTc$eeap4A zVO9gqZSU6sW7_dh|B7f7buvFUEZekrw!6WYwx;HUvO&op8h#mV1BIrBqAIoLBb^SV zp#Sta$g;aNR9cM+h5o`Zo zny0&>==qR}A^Y~diZQ1=?BbOLRA zyXI3#x3ZyWMl{$T^bLvv`Q5eVU-&!pri8%700 zo zX2<2a{QMq~@*EodM5EP`L2G<-juUs~+~dc{&#x&P?=}#PRSn`Z?HP+jq0YS9)kWE| zYjD~XrM-)2EMC%@6*pKhc92$6bd0;*TG_CeM>MvI@)@JjeO-b*?X_WKmg$sHpxF;b zf^Eq~uv59BMkBs+I>!i#e&K; zLEb`~W5!igKLCFrWZS=9mBN_P{>`cs#!Ra!%sI8j&G?vS-Q8EqN=Md$Pc!h&s|V$G z^N~P1)mEQmegEP`T393h@lX18As5u4@tcQiJ>=&`GaQe&1jDG;zCInziJhy3b|+M9gy^AIOY|DeFJL_r}l;?3hVa?ikWZ@)XMy{Y*l{)>H?l{ diff --git a/.gradle/6.7.1/fileHashes/fileHashes.lock b/.gradle/6.7.1/fileHashes/fileHashes.lock deleted file mode 100644 index ac81952a4aef66ac26c155e7aebfff25dfb19f9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZRc)i!nQ?$aOcGC)8907btBDF6Tf diff --git a/.gradle/6.7.1/fileHashes/resourceHashesCache.bin b/.gradle/6.7.1/fileHashes/resourceHashesCache.bin deleted file mode 100644 index 0604770fdfc7e3ca71ab3b23563fad21b8ec6fe4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19245 zcmeI(X-JcC0LSsEX=qt?*_5UZGK_R;WkGF}rn0GEQg)~Xrejv3N!HTLBqvy!k#;dn zY9{4Dmx@PHYR8yKrIk*bozsqakfl=AY~y+UNj`6T5%C*rd-(3hvpt`;)9&--qr>(mUh}=IoG_6;fTam-JU5k(HJF@o2hRlm68&e!u&> z!+NREY`RUo35pLKsxE)f_}PimEmr5|48~2shC$%TH!_aV$!Wtwr9`3T`!=z z@G|MP#~+$-2D%%lE~+MdL924fsJ@g#?=whWT2PS|VeZpk6a_rJv-oZjoy2c zE}m=IA1G{JOrQVs?>@hD*sRgch3;ddOPW7_Dr~C@qk9PHF{x@nYsaHr`utI($FFwW z*T+!~(0g~%6U)OwJ1ZORQayk}I(cWYOu5u&c!dB2AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_0D*r^V42|u*%_X*j8B`J z9l}Qy_IK`eZs2^-EpvKhhz@@)%;xg7L;Xo2XLWM7z=n5@xp2IYe$sw0@ng&gm)DjZ zUc_9)a!c|Qnmsr2&C;4|L!Wsv7gcw5l-1wWNAv{UZ)asW&SoyyqQ1tbDbuR>m#m)* zcmoOdTig^xtt(9=>c z)s`JUEN@w5&0K`3gO|&S1+L|KP90lfkni*Cr7kyv8PJC2uyn|uV zx470>Sy*2s8G;_SGhG)=W%zQs1?A~W}s<;Cv!*M(<3B#HKW IB>b(#FQB6J0RR91 diff --git a/.gradle/6.7.1/gc.properties b/.gradle/6.7.1/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/.gradle/6.7.1/javaCompile/classAnalysis.bin b/.gradle/6.7.1/javaCompile/classAnalysis.bin deleted file mode 100644 index 6cc4119b590011fd0262f4680a1cede8e8962009..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54906 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 diff --git a/.gradle/6.7.1/javaCompile/jarAnalysis.bin b/.gradle/6.7.1/javaCompile/jarAnalysis.bin deleted file mode 100644 index b626c74a2209eeb8522442442acdd3cf3b747b91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23701 zcmeI4YitzP702(6v5k!%;|B!-v_LSV!I>stCm{)Kyna)R9c&yFLe<&b>-E^Pd#5wA zekh8RmP(cS3U(E6OdzDiF(xDqV2F~akhW?nHKB4UWFneJ(}=1_v}qnv+mNa~_s;Ch z*vuHWANrxXmb^Qjy?5?8zjMz2+`CBBAhcNgm;Hm>pM~xvzv2Wq0ZxDu-~>1UPJk2O z1ULasfD_;ZH~~(86W|0m0ZxDu-~>2<{}%$=!I50cnZ@M-y(sKO=+->A5UPK0^TU7r zpzJN{36taWqrn9IRQ?96W|0m0ZxDu-~>1UPJk2O z1ULasfD_;ZH~~(86W|0m0ZxDu-~>1UPJk2O1ULasfD_;ZH~~(86W|0m0ZxDu-~>1U zPJk2O1ULas;D1SA11z=@ewWZ+ar9fCobS!QeD;Q4p6uDv@K=Bx&kIRk2>B zDdMVXGFm@X@QmQE~9h!J_$Cd-NXO?|; z=e;f3-b2m|oHP})Uy2aPTB$|W%`g#{MJ8VxXdJBA_r%trUtIq2g9n`n)0b$G%?Dj;{Oj{o#G{h9{ii_Vas)$D4Mt+I6j+gj0$d!@9U<;l=1nQ?*y#|Lx29 zcabX>g50uvYBJ*DUp{#HmGLJYD(^h=$+wl?=N>!iF54HynyCPbdX+?EwKn~CgPe>3 zMse*;=Z5+(jeokka$;nEvZHL+nHnX@4ka!%kz||z_YQH_Zu6Ft8xAX<6+AR?{HdcK zT?221b7EUt;)uL-U4Nv*}$-ZVaiF<5c>vpZT{Jw8@qq_%||QC z#wvTCbS$El4l#U&~f|tW2lq%danwd|H0{UfFlQ)w<#-(H>une% z&*HPMt`IlXU%L3l*b5)+EkPmIzgbEg2|>y4)HKStCJ$#6F`74f)uPP*rc6;*kZDd` zqU^aBBAOpuc_`-^7iW|j%5`x1yCs74eu_<+$ zrY1GO3l&hfVS5T=v(a*2gM5RUGCgc^1T?R(s5ldSe$>w+=y5tGX1|76Qvuax?tfv< ztJP!gY9b9mHd^tb-&%ggIt|9&CQx6C;3cn^KB*9`+#d`RhK10o({o*_1_M&;L4$6b znCsjYVtCy|tAFY@GeU?d$tjaqWt`FhDyzaUeBjwhfZ+=ShzsO>HYyvvUJ@7@Y*`>K ztWMVWuI!*~!e%FlRq63m0yJVPF(EURm_wQ3MQeQv!+C^9AE3dQ&{*wl3=Ipq$yLGW z`tLL&TGF8`^hIA40Wv1;14^z4!2;08Q|Y=8=9i$G$Ncbma)_LdX2>XJS<5=2=HETy&XGZEI* zR9pcWsUenRhf0t%aW30fGGkQ!Hl)*rc!aVt82067{Cr_zXvv>f`a%m3`pS_YcImSOw93Y02Vto0^_8pO zJ`Tu8N{6zhwpIDs=Hc8N>4LD->N?RGa#!PA)4+7*QKHXNPxmfAG`8mgr>*lV4EhD~qjKb=WsqFV9RH;jjc2g1X zsQG62yN>7y*%U(X#m^Ss-RHDSi4thauxW+u+kNzvxzyy_s)FWK>k3$;$ZYD???n1d zx{IaB)_jn9DQj}H6GL&*(~%*8IyN?MHxUr0c{X*mQVMw6B}ql z1d5gs>7pPuw>EEO>u!5K=$TGP?1J)UX)8PH%}|FrkexG9ny)ct`OSC9@j7DJ)&{Z!OG-&;S4c diff --git a/.gradle/6.7.1/javaCompile/javaCompile.lock b/.gradle/6.7.1/javaCompile/javaCompile.lock deleted file mode 100644 index 2270c0be673f890462d6aa89097cc32578928d51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZSnYv?)AI^fJT1_-zY05sMG4*&oF diff --git a/.gradle/6.7.1/javaCompile/taskHistory.bin b/.gradle/6.7.1/javaCompile/taskHistory.bin deleted file mode 100644 index d208fd2790866977e78df53f83d21ef6fcdf6a25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51284 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 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100644 index 43affa329824c43690e10298a0c33cdc80e6a36a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZQpdUWQ?$7TB#GeCek07mKs=Kufz diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index 816310b..0000000 --- a/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Tue Apr 12 15:01:34 CST 2022 -gradle.version=6.7.1 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin deleted file mode 100644 index 488bdc2f8ac6264d50ec40444e591c2c1ecf266e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18947 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 diff --git a/.gradle/checksums/sha1-checksums.bin b/.gradle/checksums/sha1-checksums.bin deleted file mode 100644 index cdedf7a12c3b0455de2c6b8fa5b5c2336ec78c5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135611 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 - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index 4987eca..0000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index ab29f70..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml deleted file mode 100644 index e4f0e1e..0000000 --- a/.idea/jarRepositories.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 7c11155..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file -- Gitee From 36d1c643d2e5452edfbe9ac3f271503643609580 Mon Sep 17 00:00:00 2001 From: Tadashi Date: Tue, 12 Apr 2022 15:51:59 +0800 Subject: [PATCH 4/4] 111 --- build/resources/main/application.yml | 16 -- build/resources/main/bootstrap.yml | 0 build/resources/main/logback.xml | 191 ------------------ build/tmp/bootJar/MANIFEST.MF | 7 - .../compileJava/source-classes-mapping.txt | 36 ---- .../source-classes-mapping.txt | 2 - 6 files changed, 252 deletions(-) delete mode 100644 build/resources/main/application.yml delete mode 100644 build/resources/main/bootstrap.yml delete mode 100644 build/resources/main/logback.xml delete mode 100644 build/tmp/bootJar/MANIFEST.MF delete mode 100644 build/tmp/compileJava/source-classes-mapping.txt delete mode 100644 build/tmp/compileTestJava/source-classes-mapping.txt diff --git a/build/resources/main/application.yml b/build/resources/main/application.yml deleted file mode 100644 index f285887..0000000 --- a/build/resources/main/application.yml +++ /dev/null @@ -1,16 +0,0 @@ -server: - port: 30301 -spring: - data: - mongodb: - uri: mongodb://192.168.11.118:31017/ - database: jjsk_mp_fileserver - servlet: - # limit upload file size - multipart: - max-file-size: 16GB - max-request-size: 1024GB -base: - fs: - base-preview-url: http://192.168.11.118:30071/file/no_token - download-file-path: /opt \ No newline at end of file diff --git a/build/resources/main/bootstrap.yml b/build/resources/main/bootstrap.yml deleted file mode 100644 index e69de29..0000000 diff --git a/build/resources/main/logback.xml b/build/resources/main/logback.xml deleted file mode 100644 index f363755..0000000 --- a/build/resources/main/logback.xml +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - logback - - - - - - - - - - - - - - - - - debug - - - ${CONSOLE_LOG_PATTERN} - - UTF-8 - - - - - - - - ${log.path}/debug.log - - - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n - UTF-8 - - - - - ${log.path}/debug-%d{yyyy-MM-dd}.%i.log - - 100MB - - - 15 - - - - debug - ACCEPT - DENY - - - - - - - ${log.path}/info.log - - - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n - UTF-8 - - - - - ${log.path}/info-%d{yyyy-MM-dd}.%i.log - - 100MB - - - 15 - - - - info - ACCEPT - DENY - - - - - - - ${log.path}/warn.log - - - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n - UTF-8 - - - - ${log.path}/warn-%d{yyyy-MM-dd}.%i.log - - 100MB - - - 15 - - - - warn - ACCEPT - DENY - - - - - - - ${log.path}/error.log - - - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n - UTF-8 - - - - ${log.path}/error-%d{yyyy-MM-dd}.%i.log - - 100MB - - - 15 - - - - ERROR - ACCEPT - DENY - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/build/tmp/bootJar/MANIFEST.MF b/build/tmp/bootJar/MANIFEST.MF deleted file mode 100644 index 61eddc3..0000000 --- a/build/tmp/bootJar/MANIFEST.MF +++ /dev/null @@ -1,7 +0,0 @@ -Manifest-Version: 1.0 -Start-Class: com.jjsk.FilesystemApplication -Spring-Boot-Classes: BOOT-INF/classes/ -Spring-Boot-Lib: BOOT-INF/lib/ -Spring-Boot-Version: 2.2.2.RELEASE -Main-Class: org.springframework.boot.loader.JarLauncher - diff --git a/build/tmp/compileJava/source-classes-mapping.txt b/build/tmp/compileJava/source-classes-mapping.txt deleted file mode 100644 index 3048663..0000000 --- a/build/tmp/compileJava/source-classes-mapping.txt +++ /dev/null @@ -1,36 +0,0 @@ -com/jjsk/entity/bo/UploadPartBo.java - com.jjsk.entity.bo.UploadPartBo -com/jjsk/config/Swagger2Config.java - com.jjsk.config.Swagger2Config -com/jjsk/exception/GlobalExceptionHandler.java - com.jjsk.exception.GlobalExceptionHandler -com/jjsk/exception/BusinessException.java - com.jjsk.exception.BusinessException -com/jjsk/common/domain/ResultMsg.java - com.jjsk.common.domain.ResultMsg -com/jjsk/common/domain/PageVo.java - com.jjsk.common.domain.PageVo -com/jjsk/common/domain/BaseConstants.java - com.jjsk.common.domain.BaseConstants -com/jjsk/controller/FileUploadController.java - com.jjsk.controller.FileUploadController -com/jjsk/service/FileUploadService.java - com.jjsk.service.FileUploadService -com/jjsk/config/MongoConf.java - com.jjsk.config.MongoConf -com/jjsk/entity/vo/CheckPartVo.java - com.jjsk.entity.vo.CheckPartVo - com.jjsk.entity.vo.CheckPartVo$CheckPartVoBuilder -com/jjsk/entity/vo/FileUploadVo.java - com.jjsk.entity.vo.FileUploadVo - com.jjsk.entity.vo.FileUploadVo$FileUploadVoBuilder -com/jjsk/config/ServerConfig.java - com.jjsk.config.ServerConfig -com/jjsk/common/domain/ApiResult.java - com.jjsk.common.domain.ApiResult -com/jjsk/common/domain/PageBo.java - com.jjsk.common.domain.PageBo -com/jjsk/api/FileUploadControllerApi.java - com.jjsk.api.FileUploadControllerApi -com/jjsk/FilesystemApplication.java - com.jjsk.FilesystemApplication diff --git a/build/tmp/compileTestJava/source-classes-mapping.txt b/build/tmp/compileTestJava/source-classes-mapping.txt deleted file mode 100644 index 146a8b3..0000000 --- a/build/tmp/compileTestJava/source-classes-mapping.txt +++ /dev/null @@ -1,2 +0,0 @@ -com/jjsk/FilesystemApplicationTests.java - com.jjsk.FilesystemApplicationTests -- Gitee