/* Ċ Ġ* Ġ( c ) ĠCopyright Ġ 2 0 2 1 Ġby ĠE inar ĠSa uk as . ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ċ Ġ* Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ġmet : Ċ Ġ* ĠĠĠĠ Ġ* ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ċ Ġ* ĠĠĠĠĠĠ Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ Ġ* ĠĠĠĠ Ġ* ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ġcopyright Ċ Ġ* ĠĠĠĠĠĠ Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ġin Ġthe Ċ Ġ* ĠĠĠĠĠĠ Ġdocumentation Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ġdistribution . Ċ Ġ* ĠĠĠĠ Ġ* ĠThe Ġname Ġof Ġits Ġauthor Ġmay Ġnot Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ċ Ġ* ĠĠĠĠĠĠ Ġderived Ġfrom Ġthis Ġsoftware Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ Ġ* Ċ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ġ" AS ĠIS " ĠAND Ċ Ġ* ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE ĠIMPLIED Ċ Ġ* ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠARE Ċ Ġ* ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL Ġ< COPY RIGHT ĠHOLDER > ĠBE ĠLIABLE ĠFOR ĠANY Ċ Ġ* ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , ĠSPECIAL , ĠEXEMPLARY , ĠOR ĠCONSEQUENTIAL ĠDAMAGES Ċ Ġ* Ġ( INCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; Ċ Ġ* ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND Ċ Ġ* ĠON ĠANY ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ċ Ġ* Ġ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE ĠOF ĠTHIS Ċ Ġ* ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ Ċ package Ġzx 5 Ċ Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . nio . file . Standard Open Option .* Ċ import Ġkotlin . system . exit Process Ċ Ċ const Ġval ĠMAX _ OFFSET _ ZX 5 Ġ= Ġ 6 5 2 8 0 Ċ const Ġval ĠMAX _ OFFSET _ ZX 7 Ġ= Ġ 2 1 7 6 Ċ const Ġval ĠDEFAULT _ THREADS Ġ= Ġ 1 6 Ċ Ċ private Ġfun ĠparseInt ( s : ĠString ) Ġ= Ġtry Ġ{ Ġs . toInt () Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ Ġ- 1 Ġ} Ċ Ċ fun Ġzx 5 ( input : ĠByteArray , Ġskip : ĠInt , Ġbackwards Mode : ĠBoolean , Ġclassic Mode : ĠBoolean , Ġquick Mode : ĠBoolean , Ġthreads : ĠInt , Ġverbose : ĠBoolean ) Ġ= ĊĠĠĠ ĠCompress or (). compress ( ĊĠĠĠĠĠĠĠ ĠOptim izer (). optimize ( input , Ġskip , Ġif Ġ( quick Mode ) ĠMAX _ OFFSET _ ZX 7 Ġelse ĠMAX _ OFFSET _ ZX 5 , Ġthreads , Ġverbose ), ĊĠĠĠĠĠĠĠ Ġinput , Ġskip , Ġbackwards Mode , Ġ! classic Mode Ġ&& Ġ! back wards Mode ) Ċ Ċ fun Ġd zx 5 ( input : ĠByteArray , Ġbackwards Mode : ĠBoolean , Ġclassic Mode : ĠBoolean ) Ġ= ĊĠĠĠ ĠDe compressor (). de compress ( input , Ġbackwards Mode , Ġ! classic Mode Ġ&& Ġ! back wards Mode ) Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĊĠĠĠ Ġprintln (" ZX 5 Ġv 2 . 0 : ĠExperimental Ġdata Ġcompress or Ġby ĠE inar ĠSa uk as ") ĊĊĠĠĠ Ġ// Ġprocess Ġoptional Ġparameters ĊĠĠĠ Ġvar Ġthreads Ġ= ĠDEFAULT _ THREADS ĊĠĠĠ Ġvar Ġforced Mode Ġ= Ġfalse ĊĠĠĠ Ġvar Ġclassic Mode Ġ= Ġfalse ĊĠĠĠ Ġvar Ġbackwards Mode Ġ= Ġfalse ĊĠĠĠ Ġvar Ġquick Mode Ġ= Ġfalse ĊĠĠĠ Ġvar Ġde compress Ġ= Ġfalse ĊĠĠĠ Ġvar Ġskip Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠ Ġwhile Ġ( i Ġ< Ġargs . size Ġ&& Ġ( args [ i ]. startsWith ("- ") Ġ|| Ġargs [ i ]. startsWith ("+ "))) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( args [ i ]. startsWith ("- p ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthreads Ġ= ĠparseInt ( args [ i ]. substring ( 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( threads Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" Error : ĠInvalid Ġparameter Ġ" Ġ+ Ġargs [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġwhen Ġ( args [ i ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- f " Ġ-> Ġforced Mode Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- c " Ġ-> Ġclassic Mode Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- b " Ġ-> Ġbackwards Mode Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- q " Ġ-> Ġquick Mode Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- d " Ġ-> Ġde compress Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip Ġ= ĠparseInt ( args [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( skip Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" Error : ĠInvalid Ġparameter Ġ" Ġ+ Ġargs [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( de compress Ġ&& Ġskip Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSystem . err . println (" Error : ĠDe compress ing Ġwith Ġ"+ ( if Ġ( back wards Mode ) Ġ" suffix " Ġelse Ġ" prefix ") +" Ġnot Ġsupported ") ĊĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġdetermine Ġoutput Ġfilename ĊĠĠĠ Ġval Ġoutput Name Ġ= Ġwhen Ġ( args . size ) Ġ{ ĊĠĠĠĠĠĠĠ Ġi Ġ+ Ġ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! de compress ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs [ i ] Ġ+ Ġ". zx 5 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( args [ i ]. length Ġ> Ġ 4 Ġ&& Ġargs [ i ]. endsWith (". zx 5 ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs [ i ]. remove Suffix (". zx 5 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" Error : ĠCannot Ġinfer Ġoutput Ġfilename ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġi Ġ+ Ġ 2 Ġ-> Ġargs [ i Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (""" Usage : Ġjava Ġ- jar Ġzx 5 . jar Ġ[- p N ] Ġ[- f ] Ġ[- c ] Ġ[- b ] Ġ[- q ] Ġ[- d ] Ġinput Ġ[ output . zx 5 ] ĊĠ Ġ- p ĠĠĠĠĠ ĠParallel Ġprocessing Ġwith ĠN Ġthreads ĊĠ Ġ- f ĠĠĠĠĠ ĠForce Ġoverwrite Ġof Ġoutput Ġfile ĊĠ Ġ- c ĠĠĠĠĠ ĠClass ic Ġfile Ġformat Ġ( v 1 .* ) ĊĠ Ġ- b ĠĠĠĠĠ ĠCompress Ġbackwards ĊĠ Ġ- q ĠĠĠĠĠ ĠQuick Ġnon - optimal Ġcompression ĊĠ Ġ- d ĠĠĠĠĠ ĠDe compress """) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġread Ġinput Ġfile ĊĠĠĠ Ġval Ġinput Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ ĠFiles . read All Bytes ( Paths . get ( args [ i ])) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSystem . err . println (" Error : ĠCannot Ġread Ġinput Ġfile Ġ" Ġ+ Ġargs [ i ]) ĊĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġdetermine Ġinput Ġsize ĊĠĠĠ Ġif Ġ( input . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ ĠSystem . err . println (" Error : ĠEmpty Ġinput Ġfile Ġ" Ġ+ Ġargs [ i ]) ĊĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġvalidate Ġskip Ġagainst Ġinput Ġsize ĊĠĠĠ Ġif Ġ( skip Ġ>= Ġinput . size ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSystem . err . println (" Error : ĠSk ipping Ġentire Ġinput Ġfile Ġ" Ġ+ Ġargs [ i ]) ĊĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġcheck Ġoutput Ġfile ĊĠĠĠ Ġif Ġ(! forced Mode Ġ&& ĠFiles . exists ( Paths . get ( output Name ))) Ġ{ ĊĠĠĠĠĠĠĠ ĠSystem . err . println (" Error : ĠAlready Ġexisting Ġoutput Ġfile Ġ$ output Name ") ĊĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġcondition ally Ġreverse Ġinput Ġfile ĊĠĠĠ Ġif Ġ( back wards Mode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinput . reverse () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġgenerate Ġoutput Ġfile ĊĠĠĠ Ġval Ġ( output , Ġdelta ) Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ(! de compress ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzx 5 ( input , Ġskip , Ġbackwards Mode , Ġclassic Mode , Ġquick Mode , Ġthreads , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( dz x 5 ( input , Ġbackwards Mode , Ġclassic Mode ), Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠArray Index OutOfBoundsException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" Error : ĠInvalid Ġinput Ġfile Ġ" Ġ+ Ġargs [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġcondition ally Ġreverse Ġoutput Ġfile ĊĠĠĠ Ġif Ġ( back wards Mode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoutput . reverse () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġwrite Ġoutput Ġfile ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ ĠFiles . write ( Paths . get ( output Name ), Ġoutput , ĠCREATE , Ġif Ġ( forced Mode ) ĠTR UNC ATE _ EXIST ING Ġelse ĠCREATE _ NEW ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSystem . err . println (" Error : ĠCannot Ġwrite Ġoutput Ġfile Ġ$ output Name ") ĊĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġdone ! ĊĠĠĠ Ġif Ġ(! de compress ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" File Ġ" Ġ+ Ġ( if Ġ( skip Ġ!= Ġ 0 ) Ġ" part ially Ġ" Ġelse Ġ"") Ġ+ Ġ" compressed Ġ" Ġ+ Ġ( if Ġ( back wards Mode ) Ġ" back wards Ġ" Ġelse Ġ"") Ġ+ Ġ" from Ġ" Ġ+ Ġ( input . size Ġ- Ġskip ) Ġ+ Ġ" Ġto Ġ" Ġ+ Ġoutput . size Ġ+ Ġ" Ġbytes ! Ġ( delta Ġ" Ġ+ Ġdelta Ġ+ Ġ") ") ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" File Ġde compressed Ġ" Ġ+ Ġ( if Ġ( back wards Mode ) Ġ" back wards Ġ" Ġelse Ġ"") Ġ+ Ġ" from Ġ" Ġ+ Ġ( input . size Ġ- Ġskip ) Ġ+ Ġ" Ġto Ġ" Ġ+ Ġoutput . size Ġ+ Ġ" Ġbytes !") ĊĠĠĠ Ġ} Ċ } Ċ