@ file : Suppress (" Private PropertyName ", Ġ" NAME _ SH ADO WING ", Ġ" PropertyName ") Ċ Ċ package Ġcom . so y wiz . kor io . compression . lz ma Ċ Ċ import Ġcom . so y wiz . kor io . experimental .* Ċ import Ġcom . so y wiz . kor io . stream .* Ċ import Ġcom . so y wiz . kor io . util . checksum .* Ċ import Ġkotlin . math .* Ċ Ċ // ĠPort ed Ġfrom Ġthe Ġpublic Ġdomain ĠJava Ġversion Ġof Ġthe ĠL Z MA ĠSDK Ġ: Ġhttps :// www . 7 - zip . org / download . html Ċ Ċ @ Use Experimental ( K or io Experimental Api :: class ) Ċ object ĠSe ven Zip Ġ{ Ċ ĉ interface ĠI Code Progress Ġ{ Ċĉ ĉ fun Ġset Progress ( in Size : ĠLong , Ġout Size : ĠLong ) Ċ ĉ } ĊĊ ĉ class ĠBit Tree Encoder ( private Ġvar Ġnum Bit Levels : ĠInt ) Ġ{ Ċĉ ĉ private Ġval Ġmodels : ĠShort Array Ġ= ĠShort Array ( 1 Ġshl Ġnum Bit Levels ) ĊĊĉ ĉ fun Ġinit () Ġ{ Ċĉĉ ĉ Range Decoder . init Bit Models ( models ) Ċĉ ĉ } ĊĊĉ ĉ fun Ġencode ( range Encoder : ĠRange Encoder , Ġsymbol : ĠInt ) Ġ{ Ċĉĉ ĉ var Ġm Ġ= Ġ 1 Ċĉĉ ĉ var Ġbit Index Ġ= Ġnum Bit Levels Ċĉĉ ĉ while Ġ( bit Index Ġ!= Ġ 0 ) Ġ{ Ċĉĉĉ ĉ bit Index -- Ċĉĉĉ ĉ val Ġbit Ġ= Ġsymbol . ush r ( bit Index ) Ġand Ġ 1 Ċĉĉĉ ĉ range Encoder . encode ( models , Ġm , Ġbit ) Ċĉĉĉ ĉ m Ġ= Ġm Ġshl Ġ 1 Ġor Ġbit Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ fun Ġreverse Encode ( range Encoder : ĠRange Encoder , Ġsymbol : ĠInt ) Ġ{ Ċĉĉ ĉ var Ġsymbol Ġ= Ġsymbol Ċĉĉ ĉ var Ġm Ġ= Ġ 1 Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġnum Bit Levels ) Ġ{ Ċĉĉĉ ĉ val Ġbit Ġ= Ġsymbol Ġand Ġ 1 Ċĉĉĉ ĉ range Encoder . encode ( models , Ġm , Ġbit ) Ċĉĉĉ ĉ m Ġ= Ġm Ġshl Ġ 1 Ġor Ġbit Ċĉĉĉ ĉ symbol Ġ= Ġsymbol Ġshr Ġ 1 Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ fun Ġget Price ( symbol : ĠInt ): ĠInt Ġ{ Ċĉĉ ĉ var Ġprice Ġ= Ġ 0 Ċĉĉ ĉ var Ġm Ġ= Ġ 1 Ċĉĉ ĉ var Ġbit Index Ġ= Ġnum Bit Levels Ċĉĉ ĉ while Ġ( bit Index Ġ!= Ġ 0 ) Ġ{ Ċĉĉĉ ĉ bit Index -- Ċĉĉĉ ĉ val Ġbit Ġ= Ġsymbol . ush r ( bit Index ) Ġand Ġ 1 Ċĉĉĉ ĉ price Ġ+= ĠRange Encoder . get Price ( Ċĉĉĉĉ ĉ models [ m ]. toInt (), Ċĉĉĉĉ ĉ bit Ċĉĉĉ ĉ ) Ċĉĉĉ ĉ m Ġ= Ġ( m Ġshl Ġ 1 ) Ġ+ Ġbit Ċĉĉ ĉ } Ċĉĉ ĉ return Ġprice Ċĉ ĉ } ĊĊĉ ĉ fun Ġreverse Get Price ( symbol : ĠInt ): ĠInt Ġ{ Ċĉĉ ĉ var Ġsymbol Ġ= Ġsymbol Ċĉĉ ĉ var Ġprice Ġ= Ġ 0 Ċĉĉ ĉ var Ġm Ġ= Ġ 1 Ċĉĉ ĉ for Ġ( i Ġin Ġnum Bit Levels Ġdown To Ġ 1 ) Ġ{ Ċĉĉĉ ĉ val Ġbit Ġ= Ġsymbol Ġand Ġ 1 Ċĉĉĉ ĉ symbol Ġ= Ġsymbol Ġ ush r Ġ 1 Ċĉĉĉ ĉ price Ġ+= ĠRange Encoder . get Price ( Ċĉĉĉĉ ĉ models [ m ]. toInt (), Ċĉĉĉĉ ĉ bit Ċĉĉĉ ĉ ) Ċĉĉĉ ĉ m Ġ= Ġm Ġshl Ġ 1 Ġor Ġbit Ċĉĉ ĉ } Ċĉĉ ĉ return Ġprice Ċĉ ĉ } ĊĊĉ ĉ comp anion Ġobject Ġ{ Ċĉĉ ĉ fun Ġreverse Get Price ( Ċĉĉĉ ĉ Models : ĠShort Array , ĠstartIndex : ĠInt , Ċĉĉĉ ĉ Num Bit Levels : ĠInt , Ġsymbol : ĠInt Ċĉĉ ĉ ): ĠInt Ġ{ Ċĉĉĉ ĉ var Ġsymbol Ġ= Ġsymbol Ċĉĉĉ ĉ var Ġprice Ġ= Ġ 0 Ċĉĉĉ ĉ var Ġm Ġ= Ġ 1 Ċĉĉĉ ĉ for Ġ( i Ġin ĠNum Bit Levels Ġdown To Ġ 1 ) Ġ{ Ċĉĉĉĉ ĉ val Ġbit Ġ= Ġsymbol Ġand Ġ 1 Ċĉĉĉĉ ĉ symbol Ġ= Ġsymbol Ġ ush r Ġ 1 Ċĉĉĉĉ ĉ price Ġ+= ĠRange Encoder . get Price ( Ċĉĉĉĉĉ ĉ Models [ startIndex Ġ+ Ġm ]. toInt (), Ċĉĉĉĉĉ ĉ bit Ċĉĉĉĉ ĉ ) Ċĉĉĉĉ ĉ m Ġ= Ġm Ġshl Ġ 1 Ġor Ġbit Ċĉĉĉ ĉ } Ċĉĉĉ ĉ return Ġprice Ċĉĉ ĉ } ĊĊĉĉ ĉ fun Ġreverse Encode ( Ċĉĉĉ ĉ Models : ĠShort Array , ĠstartIndex : ĠInt , Ċĉĉĉ ĉ range Encoder : ĠRange Encoder , ĠNum Bit Levels : ĠInt , Ġsymbol : ĠInt Ċĉĉ ĉ ) Ġ{ Ċĉĉĉ ĉ var Ġsymbol Ġ= Ġsymbol Ċĉĉĉ ĉ var Ġm Ġ= Ġ 1 Ċĉĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil ĠNum Bit Levels ) Ġ{ Ċĉĉĉĉ ĉ val Ġbit Ġ= Ġsymbol Ġand Ġ 1 Ċĉĉĉĉ ĉ range Encoder . encode ( Models , ĠstartIndex Ġ+ Ġm , Ġbit ) Ċĉĉĉĉ ĉ m Ġ= Ġm Ġshl Ġ 1 Ġor Ġbit Ċĉĉĉĉ ĉ symbol Ġ= Ġsymbol Ġshr Ġ 1 Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ class ĠBit Tree Decoder ( private Ġvar Ġnum Bit Levels : ĠInt ) Ġ{ Ċĉ ĉ private Ġval Ġmodels : ĠShort Array Ġ= ĠShort Array ( 1 Ġshl Ġnum Bit Levels ) ĊĊĉ ĉ fun Ġinit () Ġ{ Ċĉĉ ĉ Range Decoder . init Bit Models ( models ) Ċĉ ĉ } ĊĊĉ ĉ fun Ġdecode ( range Decoder : ĠRange Decoder ): ĠInt Ġ{ Ċĉĉ ĉ var Ġm Ġ= Ġ 1 Ċĉĉ ĉ for Ġ( bit Index Ġin Ġnum Bit Levels Ġdown To Ġ 1 ) Ċĉĉĉ ĉ m Ġ= Ġ( m Ġshl Ġ 1 ) Ġ+ Ġrange Decoder . decode Bit ( models , Ġm ) Ċĉĉ ĉ return Ġm Ġ- Ġ( 1 Ġshl Ġnum Bit Levels ) Ċĉ ĉ } ĊĊĉ ĉ fun Ġreverse Decode ( range Decoder : ĠRange Decoder ): ĠInt Ġ{ Ċĉĉ ĉ var Ġm Ġ= Ġ 1 Ċĉĉ ĉ var Ġsymbol Ġ= Ġ 0 Ċĉĉ ĉ for Ġ( bit Index Ġin Ġ 0 Ġuntil Ġnum Bit Levels ) Ġ{ Ċĉĉĉ ĉ val Ġbit Ġ= Ġrange Decoder . decode Bit ( models , Ġm ) Ċĉĉĉ ĉ m Ġ= Ġm Ġshl Ġ 1 Ċĉĉĉ ĉ m Ġ+= Ġbit Ċĉĉĉ ĉ symbol Ġ= Ġsymbol Ġor Ġ( bit Ġshl Ġbit Index ) Ċĉĉ ĉ } Ċĉĉ ĉ return Ġsymbol Ċĉ ĉ } ĊĊĉ ĉ comp anion Ġobject Ġ{ Ċĉĉ ĉ fun Ġreverse Decode ( Ċĉĉĉ ĉ Models : ĠShort Array , ĠstartIndex : ĠInt , Ċĉĉĉ ĉ range Decoder : ĠRange Decoder , ĠNum Bit Levels : ĠInt Ċĉĉ ĉ ): ĠInt Ġ{ Ċĉĉĉ ĉ var Ġm Ġ= Ġ 1 Ċĉĉĉ ĉ var Ġsymbol Ġ= Ġ 0 Ċĉĉĉ ĉ for Ġ( bit Index Ġin Ġ 0 Ġuntil ĠNum Bit Levels ) Ġ{ Ċĉĉĉĉ ĉ val Ġbit Ġ= Ġrange Decoder . decode Bit ( Models , ĠstartIndex Ġ+ Ġm ) Ċĉĉĉĉ ĉ m Ġ= Ġm Ġshl Ġ 1 Ċĉĉĉĉ ĉ m Ġ+= Ġbit Ċĉĉĉĉ ĉ symbol Ġ= Ġsymbol Ġor Ġ( bit Ġshl Ġbit Index ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ return Ġsymbol Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ class ĠRange Decoder Ġ{ ĊĊĉ ĉ internal Ġvar Ġrange : ĠInt Ġ= Ġ 0 Ċĉ ĉ internal Ġvar Ġcode : ĠInt Ġ= Ġ 0 ĊĊĉ ĉ internal Ġvar Ġstream : ĠSync InputStream ? Ġ= Ġnull ĊĊĉ ĉ fun Ġset Stream ( stream : ĠSync InputStream ) Ġ{ Ċĉĉ ĉ this . stream Ġ= Ġstream Ċĉ ĉ } ĊĊĉ ĉ fun Ġrelease Stream () Ġ{ Ċĉĉ ĉ stream Ġ= Ġnull Ċĉ ĉ } ĊĊĉ ĉ fun Ġinit () Ġ{ Ċĉĉ ĉ code Ġ= Ġ 0 Ċĉĉ ĉ range Ġ= Ġ- 1 Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 .. 4 ) Ċĉĉĉ ĉ code Ġ= Ġcode Ġshl Ġ 8 Ġor Ġstream !!. read () Ċĉ ĉ } ĊĊĉ ĉ fun Ġdecode Direct Bits ( num Total Bits : ĠInt ): ĠInt Ġ{ Ċĉĉ ĉ var Ġresult Ġ= Ġ 0 Ċĉĉ ĉ for Ġ( i Ġin Ġnum Total Bits Ġdown To Ġ 1 ) Ġ{ Ċĉĉĉ ĉ range Ġ= Ġrange Ġ ush r Ġ 1 Ċĉĉĉ ĉ val Ġt Ġ= Ġ( code Ġ- Ġrange ). ush r ( 3 1 ) Ċĉĉĉ ĉ code Ġ-= Ġrange Ġand Ġt Ġ- Ġ 1 Ċĉĉĉ ĉ result Ġ= Ġresult Ġshl Ġ 1 Ġor Ġ 1 Ġ- Ġt ĊĊĉĉĉ ĉ if Ġ( range Ġand Ġk Top Mask Ġ== Ġ 0 ) Ġ{ Ċĉĉĉĉ ĉ code Ġ= Ġcode Ġshl Ġ 8 Ġor Ġstream !!. read () Ċĉĉĉĉ ĉ range Ġ= Ġrange Ġshl Ġ 8 Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ return Ġresult Ċĉ ĉ } ĊĊĉ ĉ fun Ġdecode Bit ( probs : ĠShort Array , Ġindex : ĠInt ): ĠInt Ġ{ Ċĉĉ ĉ val Ġprob Ġ= Ġprobs [ index ]. toInt () Ċĉĉ ĉ val Ġnew Bound Ġ= Ġrange . ush r ( k Num Bit Model Total Bits ) Ġ* Ġprob Ċĉĉ ĉ if Ġ( code Ġxor Ġ- 0 x 8 0 0 0 0 0 0 0 Ġ< Ġnew Bound Ġxor Ġ- 0 x 8 0 0 0 0 0 0 0 ) Ġ{ Ċĉĉĉ ĉ range Ġ= Ġnew Bound Ċĉĉĉ ĉ probs [ index ] Ġ= Ġ( prob Ġ+ Ġ( k Bit Model Total Ġ- Ġprob ). ush r ( Ċĉĉĉĉ ĉ k Num Move Bits Ċĉĉĉ ĉ )). to Short () Ċĉĉĉ ĉ if Ġ( range Ġand Ġk Top Mask Ġ== Ġ 0 ) Ġ{ Ċĉĉĉĉ ĉ code Ġ= Ġcode Ġshl Ġ 8 Ġor Ġstream !!. read () Ċĉĉĉĉ ĉ range Ġ= Ġrange Ġshl Ġ 8 Ċĉĉĉ ĉ } Ċĉĉĉ ĉ return Ġ 0 Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ range Ġ-= Ġnew Bound Ċĉĉĉ ĉ code Ġ-= Ġnew Bound Ċĉĉĉ ĉ probs [ index ] Ġ= Ġ( prob Ġ- Ġprob . ush r ( k Num Move Bits )). to Short () Ċĉĉĉ ĉ if Ġ( range Ġand Ġk Top Mask Ġ== Ġ 0 ) Ġ{ Ċĉĉĉĉ ĉ code Ġ= Ġcode Ġshl Ġ 8 Ġor Ġstream !!. read () Ċĉĉĉĉ ĉ range Ġ= Ġrange Ġshl Ġ 8 Ċĉĉĉ ĉ } Ċĉĉĉ ĉ return Ġ 1 Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ comp anion Ġobject Ġ{ Ċĉĉ ĉ internal Ġconst Ġval Ġk Top Mask Ġ= Ġ(( 1 Ġshl Ġ 2 4 ) Ġ- Ġ 1 ). inv () ĊĊĉĉ ĉ internal Ġconst Ġval Ġk Num Bit Model Total Bits Ġ= Ġ 1 1 Ċĉĉ ĉ internal Ġconst Ġval Ġk Bit Model Total Ġ= Ġ 1 Ġshl Ġk Num Bit Model Total Bits Ċĉĉ ĉ internal Ġconst Ġval Ġk Num Move Bits Ġ= Ġ 5 ĊĊĉĉ ĉ fun Ġinit Bit Models ( probs : ĠShort Array ) Ġ{ Ċĉĉĉ ĉ for Ġ( i Ġin Ġprobs . indices ) Ċĉĉĉĉ ĉ probs [ i ] Ġ= Ġk Bit Model Total . ush r ( 1 ). to Short () Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ class ĠRange Encoder Ġ{ ĊĊĉ ĉ internal Ġvar Ġstream : ĠSync OutputStream ? Ġ= Ġnull ĊĊĉ ĉ private Ġvar Ġlow : ĠLong Ġ= Ġ 0 Ċĉ ĉ internal Ġvar Ġrange : ĠInt Ġ= Ġ 0 Ċĉ ĉ private Ġvar Ġ_ cache Size : ĠInt Ġ= Ġ 0 Ċĉ ĉ private Ġvar Ġ_ cache : ĠInt Ġ= Ġ 0 ĊĊĉ ĉ private Ġvar Ġ_ position : ĠLong Ġ= Ġ 0 ĊĊĉ ĉ fun Ġset Stream ( stream : ĠSync OutputStream ) Ġ{ Ċĉĉ ĉ this . stream Ġ= Ġstream Ċĉ ĉ } ĊĊĉ ĉ fun Ġrelease Stream () Ġ{ Ċĉĉ ĉ stream Ġ= Ġnull Ċĉ ĉ } ĊĊĉ ĉ fun Ġinit () Ġ{ Ċĉĉ ĉ _ position Ġ= Ġ 0 Ċĉĉ ĉ low Ġ= Ġ 0 Ċĉĉ ĉ range Ġ= Ġ- 1 Ċĉĉ ĉ _ cache Size Ġ= Ġ 1 Ċĉĉ ĉ _ cache Ġ= Ġ 0 Ċĉ ĉ } ĊĊĉ ĉ fun Ġflush Data () Ġ{ Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 .. 4 ) Ċĉĉĉ ĉ shift Low () Ċĉ ĉ } ĊĊĉ ĉ fun Ġflush Stream () Ġ{ Ċĉĉ ĉ stream !!. flush () Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġshift Low () Ġ{ Ċĉĉ ĉ val Ġlow Hi Ġ= Ġlow . ush r ( 3 2 ). toInt () Ċĉĉ ĉ if Ġ( low Hi Ġ!= Ġ 0 Ġ|| Ġlow Ġ< Ġ 0 xFF 0 0 0 0 0 0 L ) Ġ{ Ċĉĉĉ ĉ _ position Ġ+= Ġ_ cache Size . to Long () Ċĉĉĉ ĉ var Ġtemp Ġ= Ġ_ cache Ċĉĉĉ ĉ do Ġ{ Ċĉĉĉĉ ĉ stream !!. write 8 ( temp Ġ+ Ġlow Hi ) Ċĉĉĉĉ ĉ temp Ġ= Ġ 0 xFF Ċĉĉĉ ĉ } Ġwhile Ġ(-- _ cache Size Ġ!= Ġ 0 ) Ċĉĉĉ ĉ _ cache Ġ= Ġlow . toInt (). ush r ( 2 4 ) Ċĉĉ ĉ } Ċĉĉ ĉ _ cache Size ++ Ċĉĉ ĉ low Ġ= Ġlow Ġand Ġ 0 x FFFFFF Ġshl Ġ 8 Ċĉ ĉ } ĊĊĉ ĉ fun Ġencode Direct Bits ( v : ĠInt , Ġnum Total Bits : ĠInt ) Ġ{ Ċĉĉ ĉ for Ġ( i Ġin Ġnum Total Bits Ġ- Ġ 1 Ġdown To Ġ 0 ) Ġ{ Ċĉĉĉ ĉ range Ġ= Ġrange Ġ ush r Ġ 1 Ċĉĉĉ ĉ if Ġ( v . ush r ( i ) Ġand Ġ 1 Ġ== Ġ 1 ) Ċĉĉĉĉ ĉ low Ġ+= Ġrange . to Long () Ċĉĉĉ ĉ if Ġ( range Ġand Ġk Top Mask Ġ== Ġ 0 ) Ġ{ Ċĉĉĉĉ ĉ range Ġ= Ġrange Ġshl Ġ 8 Ċĉĉĉĉ ĉ shift Low () Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĊĉ ĉ fun Ġget Processed Size Add (): ĠLong Ġ{ Ċĉĉ ĉ return Ġ_ cache Size . to Long () Ġ+ Ġ_ position Ġ+ Ġ 4 Ċĉ ĉ } ĊĊĉ ĉ fun Ġencode ( probs : ĠShort Array , Ġindex : ĠInt , Ġsymbol : ĠInt ) Ġ{ Ċĉĉ ĉ val Ġprob Ġ= Ġprobs [ index ]. toInt () Ċĉĉ ĉ val Ġnew Bound Ġ= Ġrange . ush r ( k Num Bit Model Total Bits ) Ġ* Ġprob Ċĉĉ ĉ if Ġ( symbol Ġ== Ġ 0 ) Ġ{ Ċĉĉĉ ĉ range Ġ= Ġnew Bound Ċĉĉĉ ĉ probs [ index ] Ġ= Ġ( prob Ġ+ Ġ( k Bit Model Total Ġ- Ġprob ). ush r ( Ċĉĉĉĉ ĉ k Num Move Bits Ċĉĉĉ ĉ )). to Short () Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ low Ġ+= Ġnew Bound Ġand Ġ 0 xFFFFFFFF L . toInt () Ċĉĉĉ ĉ range Ġ-= Ġnew Bound Ċĉĉĉ ĉ probs [ index ] Ġ= Ġ( prob Ġ- Ġprob . ush r ( k Num Move Bits )). to Short () Ċĉĉ ĉ } Ċĉĉ ĉ if Ġ( range Ġand Ġk Top Mask Ġ== Ġ 0 ) Ġ{ Ċĉĉĉ ĉ range Ġ= Ġrange Ġshl Ġ 8 Ċĉĉĉ ĉ shift Low () Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ comp anion Ġobject Ġ{ Ċĉĉ ĉ internal Ġconst Ġval Ġk Top Mask Ġ= Ġ(( 1 Ġshl Ġ 2 4 ) Ġ- Ġ 1 ). inv () ĊĊĉĉ ĉ internal Ġconst Ġval Ġk Num Bit Model Total Bits Ġ= Ġ 1 1 Ċĉĉ ĉ internal Ġconst Ġval Ġk Bit Model Total Ġ= Ġ 1 Ġshl Ġk Num Bit Model Total Bits Ċĉĉ ĉ internal Ġconst Ġval Ġk Num Move Bits Ġ= Ġ 5 Ċĉĉ ĉ private Ġconst Ġval Ġk Num Move Reduc ing Bits Ġ= Ġ 2 Ċĉĉ ĉ const Ġval Ġk Num Bit Price Shift Bits Ġ= Ġ 6 ĊĊĉĉ ĉ fun Ġinit Bit Models ( probs : ĠShort Array ) Ġ{ Ċĉĉĉ ĉ for Ġ( i Ġin Ġprobs . indices ) Ġprobs [ i ] Ġ= Ġk Bit Model Total . ush r ( 1 ). to Short () Ċĉĉ ĉ } ĊĊĉĉ ĉ private Ġval Ġprob Prices Ġ= ĠInt Array ( k Bit Model Total Ġ ush r Ġk Num Move Reduc ing Bits ) ĊĊĉĉ ĉ init Ġ{ Ċĉĉĉ ĉ val Ġk Num Bits Ġ= Ġk Num Bit Model Total Bits Ġ- Ġk Num Move Reduc ing Bits Ċĉĉĉ ĉ for Ġ( i Ġin Ġk Num Bits Ġ- Ġ 1 Ġdown To Ġ 0 ) Ġ{ Ċĉĉĉĉ ĉ val Ġstart Ġ= Ġ 1 Ġshl Ġk Num Bits Ġ- Ġi Ġ- Ġ 1 Ċĉĉĉĉ ĉ val Ġend Ġ= Ġ 1 Ġshl Ġk Num Bits Ġ- Ġi Ċĉĉĉĉ ĉ for Ġ( j Ġin Ġstart Ġuntil Ġend ) Ċĉĉĉĉĉ ĉ prob Prices [ j ] Ġ= Ġ( i Ġshl Ġk Num Bit Price Shift Bits ) Ġ+ Ċĉĉĉĉĉĉĉ ĉ ( end Ġ- Ġj Ġshl Ġk Num Bit Price Shift Bits ). ush r ( k Num Bits Ġ- Ġi Ġ- Ġ 1 ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĊĉĉ ĉ fun Ġget Price ( Prob : ĠInt , Ġsymbol : ĠInt ): ĠInt Ġ= Ġprob Prices [( Prob Ġ- Ġsymbol Ġxor Ġ- symbol Ġand Ġk Bit Model Total Ġ- Ġ 1 ). ush r ( k Num Move Reduc ing Bits )] Ċĉĉ ĉ fun Ġget Price 0 ( Prob : ĠInt ): ĠInt Ġ= Ġprob Prices [ Prob Ġ ush r Ġk Num Move Reduc ing Bits ] Ċĉĉ ĉ fun Ġget Price 1 ( Prob : ĠInt ): ĠInt Ġ= Ġprob Prices [( k Bit Model Total Ġ- ĠProb ). ush r ( k Num Move Reduc ing Bits )] Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ object ĠL z ma Base Ġ{ Ċĉ ĉ const Ġval Ġk Num Rep Dist ances Ġ= Ġ 4 Ċĉ ĉ const Ġval Ġk Num States Ġ= Ġ 1 2 ĊĊĉ ĉ const Ġval Ġk Num Pos Slot Bits Ġ= Ġ 6 Ċĉ ĉ const Ġval Ġk Dic Log Size Min Ġ= Ġ 0 Ċĉ ĉ // Ġpublic Ġstatic Ġfinal Ġint Ġk Dic Log Size Max Ġ= Ġ 2 8 ; Ċĉ ĉ // Ġpublic Ġstatic Ġfinal Ġint Ġk Dist Table Size Max Ġ= Ġk Dic Log Size Max Ġ* Ġ 2 ; ĊĊĉ ĉ const Ġval Ġk Num Len To Pos States Bits Ġ= Ġ 2 Ġ// Ġit 's Ġfor Ġspeed Ġoptimization Ċĉ ĉ const Ġval Ġk Num Len To Pos States Ġ= Ġ 1 Ġshl Ġk Num Len To Pos States Bits ĊĊĉ ĉ const Ġval Ġk Match Min Len Ġ= Ġ 2 ĊĊĉ ĉ const Ġval Ġk Num Align Bits Ġ= Ġ 4 Ċĉ ĉ const Ġval Ġk Align Table Size Ġ= Ġ 1 Ġshl Ġk Num Align Bits Ċĉ ĉ const Ġval Ġk Align Mask Ġ= Ġk Align Table Size Ġ- Ġ 1 ĊĊĉ ĉ const Ġval Ġk Start Pos Model Index Ġ= Ġ 4 Ċĉ ĉ const Ġval Ġk End Pos Model Index Ġ= Ġ 1 4 Ċĉ ĉ // const Ġval Ġk Num Pos Models Ġ= Ġk End Pos Model Index Ġ- Ġk Start Pos Model Index ĊĊĉ ĉ const Ġval Ġk Num Full Dist ances Ġ= Ġ 1 Ġshl Ġk End Pos Model Index Ġ/ Ġ 2 ĊĊĉ ĉ const Ġval Ġk Num Lit Pos States Bits Encoding Max Ġ= Ġ 4 Ċĉ ĉ const Ġval Ġk Num Lit Context Bits Max Ġ= Ġ 8 ĊĊĉ ĉ const Ġval Ġk Num Pos States Bits Max Ġ= Ġ 4 Ċĉ ĉ const Ġval Ġk Num Pos States Max Ġ= Ġ 1 Ġshl Ġk Num Pos States Bits Max Ċĉ ĉ const Ġval Ġk Num Pos States Bits Encoding Max Ġ= Ġ 4 Ċĉ ĉ const Ġval Ġk Num Pos States Encoding Max Ġ= Ġ 1 Ġshl Ġk Num Pos States Bits Encoding Max ĊĊĉ ĉ const Ġval Ġk Num Low Len Bits Ġ= Ġ 3 Ċĉ ĉ const Ġval Ġk Num Mid Len Bits Ġ= Ġ 3 Ċĉ ĉ const Ġval Ġk Num High Len Bits Ġ= Ġ 8 Ċĉ ĉ const Ġval Ġk Num Low Len Symbols Ġ= Ġ 1 Ġshl Ġk Num Low Len Bits Ċĉ ĉ const Ġval Ġk Num Mid Len Symbols Ġ= Ġ 1 Ġshl Ġk Num Mid Len Bits Ċĉ ĉ const Ġval Ġk Num Len Symbols Ġ= Ġk Num Low Len Symbols Ġ+ Ġk Num Mid Len Symbols Ġ+ Ġ( 1 Ġshl Ġk Num High Len Bits ) Ċĉ ĉ const Ġval Ġk Match Max Len Ġ= Ġk Match Min Len Ġ+ Ġk Num Len Symbols Ġ- Ġ 1 ĊĊĉ ĉ fun Ġstate Init (): ĠInt Ġ= Ġ 0 ĊĊĉ ĉ fun Ġstate Update Char ( index : ĠInt ): ĠInt Ġ= Ġwhen Ġ{ Ċĉĉ ĉ index Ġ< Ġ 4 Ġ-> Ġ 0 Ċĉĉ ĉ index Ġ< Ġ 1 0 Ġ-> Ġindex Ġ- Ġ 3 Ċĉĉ ĉ else Ġ-> Ġindex Ġ- Ġ 6 Ċĉ ĉ } ĊĊĉ ĉ fun Ġstate Update Match ( index : ĠInt ): ĠInt Ġ= Ġif Ġ( index Ġ< Ġ 7 ) Ġ 7 Ġelse Ġ 1 0 Ċĉ ĉ fun Ġstate Update Rep ( index : ĠInt ): ĠInt Ġ= Ġif Ġ( index Ġ< Ġ 7 ) Ġ 8 Ġelse Ġ 1 1 Ċĉ ĉ fun Ġstate Update Short Rep ( index : ĠInt ): ĠInt Ġ= Ġif Ġ( index Ġ< Ġ 7 ) Ġ 9 Ġelse Ġ 1 1 Ċĉ ĉ fun Ġstate Is Char State ( index : ĠInt ): ĠBoolean Ġ= Ġindex Ġ< Ġ 7 ĊĊĉ ĉ fun Ġget Len To Pos State ( len : ĠInt ): ĠInt Ġ{ Ċĉĉ ĉ var Ġlen Ġ= Ġlen Ċĉĉ ĉ len Ġ-= Ġk Match Min Len Ċĉĉ ĉ return Ġif Ġ( len Ġ< Ġk Num Len To Pos States ) Ġlen Ġelse Ġk Num Len To Pos States Ġ- Ġ 1 Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ class ĠL z ma Decoder Ġ{ Ċĉ ĉ private Ġvar Ġm _ Out Window Ġ= ĠL z Out Window () Ċĉ ĉ private Ġvar Ġm _ Range Decoder Ġ= ĠRange Decoder () ĊĊĉ ĉ private Ġvar Ġm _ Is Match De coders Ġ= ĠShort Array ( Lz ma Base . k Num States Ġshl ĠL z ma Base . k Num Pos States Bits Max ) Ċĉ ĉ private Ġvar Ġm _ Is Rep De coders Ġ= ĠShort Array ( Lz ma Base . k Num States ) Ċĉ ĉ private Ġvar Ġm _ Is Rep G 0 De coders Ġ= ĠShort Array ( Lz ma Base . k Num States ) Ċĉ ĉ private Ġvar Ġm _ Is Rep G 1 De coders Ġ= ĠShort Array ( Lz ma Base . k Num States ) Ċĉ ĉ private Ġvar Ġm _ Is Rep G 2 De coders Ġ= ĠShort Array ( Lz ma Base . k Num States ) Ċĉ ĉ private Ġvar Ġm _ Is Rep 0 Long De coders Ġ= ĠShort Array ( Lz ma Base . k Num States Ġshl ĠL z ma Base . k Num Pos States Bits Max ) ĊĊĉ ĉ private Ġvar Ġm _ Pos Slot Decoder Ġ= ĠarrayOf Null s < Bit Tree Decoder >( Lz ma Base . k Num Len To Pos States ) Ċĉ ĉ private Ġvar Ġm _ Pos De coders Ġ= ĠShort Array ( Lz ma Base . k Num Full Dist ances Ġ- ĠL z ma Base . k End Pos Model Index ) Ċĉ ĉ private Ġvar Ġm _ Pos Align Decoder Ġ= ĠBit Tree Decoder ( Lz ma Base . k Num Align Bits ) ĊĊĉ ĉ private Ġvar Ġm _ Len Decoder Ġ= ĠLen Decoder () Ċĉ ĉ private Ġvar Ġm _ Rep Len Decoder Ġ= ĠLen Decoder () ĊĊĉ ĉ private Ġvar Ġm _ Literal Decoder Ġ= ĠLiteral Decoder () ĊĊĉ ĉ private Ġvar Ġm _ Dictionary Size Ġ= Ġ- 1 Ċĉ ĉ private Ġvar Ġm _ Dictionary Size Check Ġ= Ġ- 1 ĊĊĉ ĉ private Ġvar Ġm _ Pos State Mask : ĠInt Ġ= Ġ 0 ĊĊĉ ĉ internal Ġinner Ġclass ĠLen Decoder Ġ{ Ċĉĉ ĉ private Ġvar Ġm _ Choice Ġ= ĠShort Array ( 2 ) Ċĉĉ ĉ private Ġvar Ġm _ Low Coder Ġ= ĠarrayOf Null s < Bit Tree Decoder >( Lz ma Base . k Num Pos States Max ) Ċĉĉ ĉ private Ġvar Ġm _ Mid Coder Ġ= ĠarrayOf Null s < Bit Tree Decoder >( Lz ma Base . k Num Pos States Max ) Ċĉĉ ĉ private Ġvar Ġm _ High Coder Ġ= ĠBit Tree Decoder ( Lz ma Base . k Num High Len Bits ) Ċĉĉ ĉ private Ġvar Ġm _ Num Pos States Ġ= Ġ 0 ĊĊĉĉ ĉ fun Ġcreate ( num Pos States : ĠInt ) Ġ{ Ċĉĉĉ ĉ while Ġ( m _ Num Pos States Ġ< Ġnum Pos States ) Ġ{ Ċĉĉĉĉ ĉ m _ Low Coder [ m _ Num Pos States ] Ġ= ĠBit Tree Decoder ( Lz ma Base . k Num Low Len Bits ) Ċĉĉĉĉ ĉ m _ Mid Coder [ m _ Num Pos States ] Ġ= ĠBit Tree Decoder ( Lz ma Base . k Num Mid Len Bits ) Ċĉĉĉĉ ĉ m _ Num Pos States ++ Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĊĉĉ ĉ fun Ġinit () Ġ{ Ċĉĉĉ ĉ Range Decoder . init Bit Models ( m _ Choice ) Ċĉĉĉ ĉ for Ġ( pos State Ġin Ġ 0 Ġuntil Ġm _ Num Pos States ) Ġ{ Ċĉĉĉĉ ĉ m _ Low Coder [ pos State ] !!. init () Ċĉĉĉĉ ĉ m _ Mid Coder [ pos State ] !!. init () Ċĉĉĉ ĉ } Ċĉĉĉ ĉ m _ High Coder . init () Ċĉĉ ĉ } ĊĊĉĉ ĉ fun Ġdecode ( range Decoder : ĠRange Decoder , Ġpos State : ĠInt ): ĠInt Ġ{ Ċĉĉĉ ĉ if Ġ( range Decoder . decode Bit ( m _ Choice , Ġ 0 ) Ġ== Ġ 0 ) Ġreturn Ġm _ Low Coder [ pos State ] !!. decode ( range Decoder ) Ċĉĉĉ ĉ var Ġsymbol Ġ= ĠL z ma Base . k Num Low Len Symbols Ċĉĉĉ ĉ symbol Ġ+= Ġif Ġ( range Decoder . decode Bit ( m _ Choice , Ġ 1 ) Ġ== Ġ 0 ) Ġm _ Mid Coder [ pos State ] !!. decode ( range Decoder ) Ġelse ĠL z ma Base . k Num Mid Len Symbols Ġ+ Ġm _ High Coder . decode ( range Decoder ) Ċĉĉĉ ĉ return Ġsymbol Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ internal Ġinner Ġclass ĠLiteral Decoder Ġ{ Ċĉĉ ĉ private Ġvar Ġm _ Cod ers : ĠArray < Decoder 2 >? Ġ= Ġnull Ċĉĉ ĉ private Ġvar Ġm _ Num Prev Bits : ĠInt Ġ= Ġ 0 Ċĉĉ ĉ private Ġvar Ġm _ Num Pos Bits : ĠInt Ġ= Ġ 0 Ċĉĉ ĉ private Ġvar Ġm _ Pos Mask : ĠInt Ġ= Ġ 0 ĊĊĉĉ ĉ internal Ġinner Ġclass ĠDecoder 2 Ġ{ Ċĉĉĉ ĉ private Ġvar Ġm _ De coders Ġ= ĠShort Array ( 0 x 3 0 0 ) ĊĊĉĉĉ ĉ fun Ġinit () Ġ{ Ċĉĉĉĉ ĉ Range Decoder . init Bit Models ( Ċĉĉĉĉĉ ĉ m _ De coders Ċĉĉĉĉ ĉ ) Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ fun Ġdecode Normal ( range Decoder : ĠRange Decoder ): ĠByte Ġ{ Ċĉĉĉĉ ĉ var Ġsymbol Ġ= Ġ 1 Ċĉĉĉĉ ĉ do Ġ{ Ġsymbol Ġ= Ġsymbol Ġshl Ġ 1 Ġor Ġrange Decoder . decode Bit ( m _ De coders , Ġsymbol ) Ġ} Ġwhile Ġ( symbol Ġ< Ġ 0 x 1 0 0 ) Ċĉĉĉĉ ĉ return Ġsymbol . to Byte () Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ fun Ġdecode With Match Byte ( range Decoder : ĠRange Decoder , Ġmatch Byte : ĠByte ): ĠByte Ġ{ Ċĉĉĉĉ ĉ var Ġmatch Byte Ġ= Ġmatch Byte Ċĉĉĉĉ ĉ var Ġsymbol Ġ= Ġ 1 Ċĉĉĉĉ ĉ do Ġ{ Ċĉĉĉĉĉ ĉ val Ġmatch Bit Ġ= Ġ( match Byte Ġshr Ġ 7 ) Ġand Ġ 1 Ċĉĉĉĉĉ ĉ match Byte Ġ= Ġ(( match Byte Ġshl Ġ 1 ). to Byte ()) Ċĉĉĉĉĉ ĉ val Ġbit Ġ= Ġrange Decoder . decode Bit ( m _ De coders , Ġ( 1 Ġ+ Ġmatch Bit Ġshl Ġ 8 ) Ġ+ Ġsymbol ) Ċĉĉĉĉĉ ĉ symbol Ġ= Ġsymbol Ġshl Ġ 1 Ġor Ġbit Ċĉĉĉĉĉ ĉ if Ġ( match Bit Ġ!= Ġbit ) Ġ{ Ċĉĉĉĉĉĉ ĉ while Ġ( symbol Ġ< Ġ 0 x 1 0 0 ) Ġsymbol Ġ= Ġsymbol Ġshl Ġ 1 Ġor Ġrange Decoder . decode Bit ( m _ De coders , Ġsymbol ) Ċĉĉĉĉĉĉ ĉ break Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ġwhile Ġ( symbol Ġ< Ġ 0 x 1 0 0 ) Ċĉĉĉĉ ĉ return Ġsymbol . to Byte () Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĊĉĉ ĉ fun Ġcreate ( num Pos Bits : ĠInt , Ġnum Prev Bits : ĠInt ) Ġ{ Ċĉĉĉ ĉ if Ġ( m _ Cod ers Ġ!= Ġnull Ġ&& Ġm _ Num Prev Bits Ġ== Ġnum Prev Bits Ġ&& Ġm _ Num Pos Bits Ġ== Ġnum Pos Bits ) Ġreturn Ċĉĉĉ ĉ m _ Num Pos Bits Ġ= Ġnum Pos Bits Ċĉĉĉ ĉ m _ Pos Mask Ġ= Ġ( 1 Ġshl Ġnum Pos Bits ) Ġ- Ġ 1 Ċĉĉĉ ĉ m _ Num Prev Bits Ġ= Ġnum Prev Bits Ċĉĉĉ ĉ val Ġnum States Ġ= Ġ 1 Ġshl Ġm _ Num Prev Bits Ġ+ Ġm _ Num Pos Bits Ċĉĉĉ ĉ m _ Cod ers Ġ= ĠArray ( num States ) Ġ{ ĠDecoder 2 () Ġ} Ċĉĉ ĉ } ĊĊĉĉ ĉ fun Ġinit () Ġ{ Ċĉĉĉ ĉ val Ġnum States Ġ= Ġ 1 Ġshl Ġm _ Num Prev Bits Ġ+ Ġm _ Num Pos Bits Ċĉĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġnum States ) Ċĉĉĉĉ ĉ m _ Cod ers ! ![ i ]. init () Ċĉĉ ĉ } ĊĊĉĉ ĉ fun Ġget Decoder ( pos : ĠInt , Ġprev Byte : ĠByte ): ĠDecoder 2 Ġ= Ġm _ Cod ers ! ![ ( pos Ġand Ġm _ Pos Mask Ġshl Ġm _ Num Prev Bits ) Ġ+ Ġ( prev Byte Ġand Ġ 0 xFF ). ush r ( 8 Ġ- Ġm _ Num Prev Bits )] Ċĉ ĉ } ĊĊĉ ĉ init Ġ{ Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil ĠL z ma Base . k Num Len To Pos States ) Ġm _ Pos Slot Decoder [ i ] Ġ= ĠBit Tree Decoder ( Lz ma Base . k Num Pos Slot Bits ) Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġset Dictionary Size ( dictionary Size : ĠInt ): ĠBoolean Ġ{ Ċĉĉ ĉ if Ġ( dictionary Size Ġ< Ġ 0 ) Ġreturn Ġfalse Ċĉĉ ĉ if Ġ( m _ Dictionary Size Ġ!= Ġdictionary Size ) Ġ{ Ċĉĉĉ ĉ m _ Dictionary Size Ġ= Ġdictionary Size Ċĉĉĉ ĉ m _ Dictionary Size Check Ġ= Ġmax ( m _ Dictionary Size , Ġ 1 ) Ċĉĉĉ ĉ m _ Out Window . create ( max ( m _ Dictionary Size Check , Ġ 1 Ġshl Ġ 1 2 )) Ċĉĉ ĉ } Ċĉĉ ĉ return Ġtrue Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġset Lc Lp Pb ( lc : ĠInt , Ġlp : ĠInt , Ġpb : ĠInt ): ĠBoolean Ġ{ Ċĉĉ ĉ if Ġ( lc Ġ> ĠL z ma Base . k Num Lit Context Bits Max Ġ|| Ġlp Ġ> Ġ 4 Ġ|| Ġpb Ġ> ĠL z ma Base . k Num Pos States Bits Max ) Ġreturn Ġfalse Ċĉĉ ĉ m _ Literal Decoder . create ( lp , Ġlc ) Ċĉĉ ĉ val Ġnum Pos States Ġ= Ġ 1 Ġshl Ġpb Ċĉĉ ĉ m _ Len Decoder . create ( num Pos States ) Ċĉĉ ĉ m _ Rep Len Decoder . create ( num Pos States ) Ċĉĉ ĉ m _ Pos State Mask Ġ= Ġnum Pos States Ġ- Ġ 1 Ċĉĉ ĉ return Ġtrue Ċĉ ĉ } ĊĊĉ ĉ internal Ġfun Ġinit () Ġ{ Ċĉĉ ĉ m _ Out Window . init ( false ) ĊĊĉĉ ĉ Range Decoder . init Bit Models ( m _ Is Match De coders ) Ċĉĉ ĉ Range Decoder . init Bit Models ( m _ Is Rep 0 Long De coders ) Ċĉĉ ĉ Range Decoder . init Bit Models ( m _ Is Rep De coders ) Ċĉĉ ĉ Range Decoder . init Bit Models ( m _ Is Rep G 0 De coders ) Ċĉĉ ĉ Range Decoder . init Bit Models ( m _ Is Rep G 1 De coders ) Ċĉĉ ĉ Range Decoder . init Bit Models ( m _ Is Rep G 2 De coders ) Ċĉĉ ĉ Range Decoder . init Bit Models ( m _ Pos De coders ) ĊĊĉĉ ĉ m _ Literal Decoder . init () Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil ĠL z ma Base . k Num Len To Pos States ) Ġm _ Pos Slot Decoder [ i ] !!. init () Ċĉĉ ĉ m _ Len Decoder . init () Ċĉĉ ĉ m _ Rep Len Decoder . init () Ċĉĉ ĉ m _ Pos Align Decoder . init () Ċĉĉ ĉ m _ Range Decoder . init () Ċĉ ĉ } ĊĊĉ ĉ fun Ġcode ( in Stream : ĠSync InputStream , Ġout Stream : ĠSync OutputStream , Ġout Size : ĠLong ): ĠBoolean Ġ{ Ċĉĉ ĉ m _ Range Decoder . set Stream ( in Stream ) Ċĉĉ ĉ m _ Out Window . set Stream ( out Stream ) Ċĉĉ ĉ init () ĊĊĉĉ ĉ var Ġstate Ġ= ĠL z ma Base . state Init () Ċĉĉ ĉ var Ġrep 0 Ġ= Ġ 0 Ċĉĉ ĉ var Ġrep 1 Ġ= Ġ 0 Ċĉĉ ĉ var Ġrep 2 Ġ= Ġ 0 Ċĉĉ ĉ var Ġrep 3 Ġ= Ġ 0 ĊĊĉĉ ĉ var Ġnow Pos 6 4 : ĠLong Ġ= Ġ 0 Ċĉĉ ĉ var Ġprev Byte : ĠByte Ġ= Ġ 0 Ċĉĉ ĉ while Ġ( out Size Ġ< Ġ 0 Ġ|| Ġnow Pos 6 4 Ġ< Ġout Size ) Ġ{ Ċĉĉĉ ĉ val Ġpos State Ġ= Ġnow Pos 6 4 . toInt () Ġand Ġm _ Pos State Mask Ċĉĉĉ ĉ if Ġ( m _ Range Decoder . decode Bit ( m _ Is Match De coders , Ġ( state Ġshl ĠL z ma Base . k Num Pos States Bits Max ) Ġ+ Ġpos State ) Ġ== Ġ 0 ) Ġ{ Ċĉĉĉĉ ĉ val Ġdecoder 2 Ġ= Ġm _ Literal Decoder . get Decoder ( now Pos 6 4 . toInt (), Ġprev Byte ) Ċĉĉĉĉ ĉ prev Byte Ġ= Ġif Ġ(! Lz ma Base . state Is Char State ( state )) Ċĉĉĉĉĉ ĉ decoder 2 . decode With Match Byte ( m _ Range Decoder , Ġm _ Out Window . getByte ( rep 0 )) Ċĉĉĉĉ ĉ else Ċĉĉĉĉĉ ĉ decoder 2 . decode Normal ( m _ Range Decoder ) Ċĉĉĉĉ ĉ m _ Out Window . put Byte ( prev Byte ) Ċĉĉĉĉ ĉ state Ġ= ĠL z ma Base . state Update Char ( state ) Ċĉĉĉĉ ĉ now Pos 6 4 ++ Ċĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉ ĉ var Ġlen : ĠInt Ċĉĉĉĉ ĉ if Ġ( m _ Range Decoder . decode Bit ( m _ Is Rep De coders , Ġstate ) Ġ== Ġ 1 ) Ġ{ Ċĉĉĉĉĉ ĉ len Ġ= Ġ 0 Ċĉĉĉĉĉ ĉ if Ġ( m _ Range Decoder . decode Bit ( m _ Is Rep G 0 De coders , Ġstate ) Ġ== Ġ 0 ) Ġ{ Ċĉĉĉĉĉĉ ĉ if Ġ( m _ Range Decoder . decode Bit ( Ċĉĉĉĉĉĉĉĉ ĉ m _ Is Rep 0 Long De coders , Ċĉĉĉĉĉĉĉĉ ĉ ( state Ġshl ĠL z ma Base . k Num Pos States Bits Max ) Ġ+ Ġpos State Ċĉĉĉĉĉĉĉ ĉ ) Ġ== Ġ 0 Ċĉĉĉĉĉĉ ĉ ) Ġ{ Ċĉĉĉĉĉĉĉ ĉ state Ġ= ĠL z ma Base . state Update Short Rep ( Ċĉĉĉĉĉĉĉĉ ĉ state Ċĉĉĉĉĉĉĉ ĉ ) Ċĉĉĉĉĉĉĉ ĉ len Ġ= Ġ 1 Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉĉ ĉ val Ġdistance : ĠInt Ċĉĉĉĉĉĉ ĉ if Ġ( m _ Range Decoder . decode Bit ( m _ Is Rep G 1 De coders , Ġstate ) Ġ== Ġ 0 ) Ċĉĉĉĉĉĉĉ ĉ distance Ġ= Ġrep 1 Ċĉĉĉĉĉĉ ĉ else Ġ{ Ċĉĉĉĉĉĉĉ ĉ if Ġ( m _ Range Decoder . decode Bit ( m _ Is Rep G 2 De coders , Ġstate ) Ġ== Ġ 0 ) Ċĉĉĉĉĉĉĉĉ ĉ distance Ġ= Ġrep 2 Ċĉĉĉĉĉĉĉ ĉ else Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ distance Ġ= Ġrep 3 Ċĉĉĉĉĉĉĉĉ ĉ rep 3 Ġ= Ġrep 2 Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉ ĉ rep 2 Ġ= Ġrep 1 Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ rep 1 Ġ= Ġrep 0 Ċĉĉĉĉĉĉ ĉ rep 0 Ġ= Ġdistance Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ if Ġ( len Ġ== Ġ 0 ) Ġ{ Ċĉĉĉĉĉĉ ĉ len Ġ= Ġm _ Rep Len Decoder . decode ( m _ Range Decoder , Ġpos State ) Ġ+ Ċĉĉĉĉĉĉĉĉ ĉ Lz ma Base . k Match Min Len Ċĉĉĉĉĉĉ ĉ state Ġ= ĠL z ma Base . state Update Rep ( state ) Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉ ĉ rep 3 Ġ= Ġrep 2 Ċĉĉĉĉĉ ĉ rep 2 Ġ= Ġrep 1 Ċĉĉĉĉĉ ĉ rep 1 Ġ= Ġrep 0 Ċĉĉĉĉĉ ĉ len Ġ= ĠL z ma Base . k Match Min Len Ġ+ Ġm _ Len Decoder . decode ( m _ Range Decoder , Ġpos State ) Ċĉĉĉĉĉ ĉ state Ġ= ĠL z ma Base . state Update Match ( state ) Ċĉĉĉĉĉ ĉ val Ġpos Slot Ġ= Ġm _ Pos Slot Decoder [ Lz ma Base . get Len To Pos State ( Ċĉĉĉĉĉĉ ĉ len Ċĉĉĉĉĉ ĉ )] !!. decode ( m _ Range Decoder ) Ċĉĉĉĉĉ ĉ if Ġ( pos Slot Ġ>= ĠL z ma Base . k Start Pos Model Index ) Ġ{ Ċĉĉĉĉĉĉ ĉ val Ġnum Direct Bits Ġ= Ġ( pos Slot Ġshr Ġ 1 ) Ġ- Ġ 1 Ċĉĉĉĉĉĉ ĉ rep 0 Ġ= Ġ 2 Ġor Ġ( pos Slot Ġand Ġ 1 ) Ġshl Ġnum Direct Bits Ċĉĉĉĉĉĉ ĉ if Ġ( pos Slot Ġ< ĠL z ma Base . k End Pos Model Index ) Ċĉĉĉĉĉĉĉ ĉ rep 0 Ġ+= ĠBit Tree Decoder . reverse Decode ( Ċĉĉĉĉĉĉĉĉ ĉ m _ Pos De coders , Ċĉĉĉĉĉĉĉĉ ĉ rep 0 Ġ- Ġpos Slot Ġ- Ġ 1 , Ġm _ Range Decoder , Ġnum Direct Bits Ċĉĉĉĉĉĉĉ ĉ ) Ċĉĉĉĉĉĉ ĉ else Ġ{ Ċĉĉĉĉĉĉĉ ĉ rep 0 Ġ+= Ġm _ Range Decoder . decode Direct Bits ( Ċĉĉĉĉĉĉĉĉ ĉ num Direct Bits Ġ- ĠL z ma Base . k Num Align Bits Ċĉĉĉĉĉĉĉ ĉ ) Ġshl ĠL z ma Base . k Num Align Bits Ċĉĉĉĉĉĉĉ ĉ rep 0 Ġ+= Ġm _ Pos Align Decoder . reverse Decode ( m _ Range Decoder ) Ċĉĉĉĉĉĉĉ ĉ if Ġ( rep 0 Ġ< Ġ 0 ) Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ if Ġ( rep 0 Ġ== Ġ- 1 ) Ċĉĉĉĉĉĉĉĉĉ ĉ break Ċĉĉĉĉĉĉĉĉ ĉ return Ġfalse Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ġelse Ċĉĉĉĉĉĉ ĉ rep 0 Ġ= Ġpos Slot Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ if Ġ( rep 0 Ġ>= Ġnow Pos 6 4 Ġ|| Ġrep 0 Ġ>= Ġm _ Dictionary Size Check ) Ġ{ Ċĉĉĉĉĉ ĉ // Ġm _ Out Window . Flush (); Ċĉĉĉĉĉ ĉ return Ġfalse Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ m _ Out Window . copy Block ( rep 0 , Ġlen ) Ċĉĉĉĉ ĉ now Pos 6 4 Ġ+= Ġlen . to Long () Ċĉĉĉĉ ĉ prev Byte Ġ= Ġm _ Out Window . getByte ( 0 ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ m _ Out Window . flush () Ċĉĉ ĉ m _ Out Window . release Stream () Ċĉĉ ĉ m _ Range Decoder . release Stream () Ċĉĉ ĉ return Ġtrue Ċĉ ĉ } ĊĊĉ ĉ fun Ġset Decoder Properties ( properties : ĠByteArray ): ĠBoolean Ġ{ Ċĉĉ ĉ if Ġ( properties . size Ġ< Ġ 5 ) Ġreturn Ġfalse Ċĉĉ ĉ val Ġ` val ` Ġ= Ġproperties [ 0 ] Ġand Ġ 0 xFF Ċĉĉ ĉ val Ġlc Ġ= Ġ` val ` Ġ% Ġ 9 Ċĉĉ ĉ val Ġremainder Ġ= Ġ` val ` Ġ/ Ġ 9 Ċĉĉ ĉ val Ġlp Ġ= Ġremainder Ġ% Ġ 5 Ċĉĉ ĉ val Ġpb Ġ= Ġremainder Ġ/ Ġ 5 Ċĉĉ ĉ var Ġdictionary Size Ġ= Ġ 0 Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 .. 3 ) Ġdictionary Size Ġ+= Ġproperties [ 1 Ġ+ Ġi ]. toInt () Ġand Ġ 0 xFF Ġshl Ġi Ġ* Ġ 8 Ċĉĉ ĉ return Ġif Ġ(! set Lc Lp Pb ( lc , Ġlp , Ġpb )) Ġfalse Ġelse Ġset Dictionary Size ( dictionary Size ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ class ĠL z ma Encoder Ġ{ Ċĉ ĉ private Ġvar Ġ_ state Ġ= ĠL z ma Base . state Init () Ċĉ ĉ private Ġvar Ġ_ previous Byte : ĠByte Ġ= Ġ 0 Ċĉ ĉ private Ġvar Ġ_ rep Dist ances Ġ= ĠInt Array ( Lz ma Base . k Num Rep Dist ances ) Ċĉ ĉ private Ġvar Ġ_ opt imum Ġ= ĠArray ( k Num Opts ) Ġ{ ĠOpt imal () Ġ} ĊĊĉ ĉ private Ġvar Ġ_ match Finder : ĠL z Bin Tree ? Ġ= Ġnull Ċĉ ĉ private Ġvar Ġ_ range Encoder Ġ= ĠRange Encoder () ĊĊĉ ĉ private Ġvar Ġ_ is Match Ġ= ĠShort Array ( Lz ma Base . k Num States Ġshl ĠL z ma Base . k Num Pos States Bits Max ) Ċĉ ĉ private Ġvar Ġ_ is Rep Ġ= ĠShort Array ( Lz ma Base . k Num States ) Ċĉ ĉ private Ġvar Ġ_ is Rep G 0 Ġ= ĠShort Array ( Lz ma Base . k Num States ) Ċĉ ĉ private Ġvar Ġ_ is Rep G 1 Ġ= ĠShort Array ( Lz ma Base . k Num States ) Ċĉ ĉ private Ġvar Ġ_ is Rep G 2 Ġ= ĠShort Array ( Lz ma Base . k Num States ) Ċĉ ĉ private Ġvar Ġ_ is Rep 0 Long Ġ= ĠShort Array ( Lz ma Base . k Num States Ġshl ĠL z ma Base . k Num Pos States Bits Max ) ĊĊĉ ĉ private Ġvar Ġ_ pos Slot Encoder Ġ= ĠArray ( Lz ma Base . k Num Len To Pos States ) Ġ{ ĠBit Tree Encoder ( Lz ma Base . k Num Pos Slot Bits ) Ġ} Ġ// Ġk Num Pos Slot Bits ĊĊĉ ĉ private Ġvar Ġ_ pos En coders Ġ= ĠShort Array ( Lz ma Base . k Num Full Dist ances Ġ- ĠL z ma Base . k End Pos Model Index ) Ċĉ ĉ private Ġvar Ġ_ pos Align Encoder Ġ= ĠBit Tree Encoder ( Lz ma Base . k Num Align Bits ) ĊĊĉ ĉ private Ġvar Ġ_ len Encoder Ġ= ĠLen Price Table Encoder () Ċĉ ĉ private Ġvar Ġ_ rep Match Len Encoder Ġ= ĠLen Price Table Encoder () ĊĊĉ ĉ private Ġvar Ġ_ literal Encoder Ġ= ĠLiteral Encoder () ĊĊĉ ĉ private Ġvar Ġ_ match Dist ances Ġ= ĠInt Array ( Lz ma Base . k Match Max Len Ġ* Ġ 2 Ġ+ Ġ 2 ) ĊĊĉ ĉ private Ġvar Ġ_ num Fast Bytes Ġ= Ġk Num Fast Bytes Default Ċĉ ĉ private Ġvar Ġ_ longest Match Length : ĠInt Ġ= Ġ 0 Ċĉ ĉ private Ġvar Ġ_ num Distance Pairs : ĠInt Ġ= Ġ 0 ĊĊĉ ĉ private Ġvar Ġ_ additional Offset : ĠInt Ġ= Ġ 0 ĊĊĉ ĉ private Ġvar Ġ_ opt imum End Index : ĠInt Ġ= Ġ 0 Ċĉ ĉ private Ġvar Ġ_ opt imum Current Index : ĠInt Ġ= Ġ 0 ĊĊĉ ĉ private Ġvar Ġ_ longest Match Was Found : ĠBoolean Ġ= Ġfalse ĊĊĉ ĉ private Ġvar Ġ_ pos Slot Prices Ġ= ĠInt Array ( 1 Ġshl ĠL z ma Base . k Num Pos Slot Bits Ġ+ ĠL z ma Base . k Num Len To Pos States Bits ) Ċĉ ĉ private Ġvar Ġ_ distances Prices Ġ= ĠInt Array ( Lz ma Base . k Num Full Dist ances Ġshl ĠL z ma Base . k Num Len To Pos States Bits ) Ċĉ ĉ private Ġvar Ġ_ align Prices Ġ= ĠInt Array ( Lz ma Base . k Align Table Size ) Ċĉ ĉ private Ġvar Ġ_ align Price Count : ĠInt Ġ= Ġ 0 ĊĊĉ ĉ private Ġvar Ġ_ dist Table Size Ġ= Ġk Default Dictionary Log Size Ġ* Ġ 2 ĊĊĉ ĉ private Ġvar Ġ_ pos State Bits Ġ= Ġ 2 Ċĉ ĉ private Ġvar Ġ_ pos State Mask Ġ= Ġ 4 Ġ- Ġ 1 Ċĉ ĉ private Ġvar Ġ_ num Literal Pos State Bits Ġ= Ġ 0 Ċĉ ĉ private Ġvar Ġ_ num Literal Context Bits Ġ= Ġ 3 ĊĊĉ ĉ private Ġvar Ġ_ dictionary Size Ġ= Ġ 1 Ġshl Ġk Default Dictionary Log Size Ċĉ ĉ private Ġvar Ġ_ dictionary Size Prev Ġ= Ġ- 1 Ċĉ ĉ private Ġvar Ġ_ num Fast Bytes Prev Ġ= Ġ- 1 ĊĊĉ ĉ private Ġvar Ġnow Pos 6 4 : ĠLong Ġ= Ġ 0 Ċĉ ĉ private Ġvar Ġ_ finished : ĠBoolean Ġ= Ġfalse Ċĉ ĉ private Ġvar Ġ_ in Stream : ĠSync InputStream ? Ġ= Ġnull ĊĊĉ ĉ private Ġvar Ġ_ match Finder Type Ġ= ĠE Match Finder Type BT 4 Ċĉ ĉ private Ġvar Ġ_ write End Mark Ġ= Ġfalse ĊĊĉ ĉ private Ġvar Ġ_ need Release MF Stream Ġ= Ġfalse ĊĊĉ ĉ private Ġvar Ġre ps Ġ= ĠInt Array ( Lz ma Base . k Num Rep Dist ances ) Ċĉ ĉ private Ġvar Ġrep Lens Ġ= ĠInt Array ( Lz ma Base . k Num Rep Dist ances ) Ċĉ ĉ private Ġvar Ġback Res : ĠInt Ġ= Ġ 0 ĊĊĉ ĉ private Ġvar Ġprocessed In Size Ġ= ĠLong Array ( 1 ) Ċĉ ĉ private Ġvar Ġprocessed Out Size Ġ= ĠLong Array ( 1 ) Ċĉ ĉ private Ġvar Ġfinished Ġ= ĠBoolean Array ( 1 ) Ċĉ ĉ private Ġvar Ġproperties Ġ= ĠByteArray ( k Prop Size ) ĊĊĉ ĉ private Ġvar Ġtemp Prices Ġ= ĠInt Array ( Lz ma Base . k Num Full Dist ances ) Ċĉ ĉ private Ġvar Ġ_ match Price Count : ĠInt Ġ= Ġ 0 ĊĊĉ ĉ private Ġfun Ġbase Init () Ġ{ Ċĉĉ ĉ _ state Ġ= ĠL z ma Base . state Init () Ċĉĉ ĉ _ previous Byte Ġ= Ġ 0 Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil ĠL z ma Base . k Num Rep Dist ances ) Ġ_ rep Dist ances [ i ] Ġ= Ġ 0 Ċĉ ĉ } ĊĊĉ ĉ internal Ġinner Ġclass ĠLiteral Encoder Ġ{ Ċĉĉ ĉ private Ġvar Ġm _ Cod ers : ĠArray < Encoder 2 >? Ġ= Ġnull Ċĉĉ ĉ private Ġvar Ġm _ Num Prev Bits : ĠInt Ġ= Ġ 0 Ċĉĉ ĉ private Ġvar Ġm _ Num Pos Bits : ĠInt Ġ= Ġ 0 Ċĉĉ ĉ private Ġvar Ġm _ Pos Mask : ĠInt Ġ= Ġ 0 ĊĊĉĉ ĉ internal Ġinner Ġclass ĠEncoder 2 Ġ{ Ċĉĉĉ ĉ private Ġvar Ġm _ En coders Ġ= ĠShort Array ( 0 x 3 0 0 ) ĊĊĉĉĉ ĉ fun Ġinit () Ġ{ Ċĉĉĉĉ ĉ Range Encoder . init Bit Models ( m _ En coders ) Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ fun Ġencode ( range Encoder : ĠRange Encoder , Ġsymbol : ĠByte ) Ġ{ Ċĉĉĉĉ ĉ var Ġcontext Ġ= Ġ 1 Ċĉĉĉĉ ĉ for Ġ( i Ġin Ġ 7 Ġdown To Ġ 0 ) Ġ{ Ċĉĉĉĉĉ ĉ val Ġbit Ġ= Ġ( symbol Ġshr Ġi ) Ġand Ġ 1 Ċĉĉĉĉĉ ĉ range Encoder . encode ( m _ En coders , Ġcontext , Ġbit ) Ċĉĉĉĉĉ ĉ context Ġ= Ġcontext Ġshl Ġ 1 Ġor Ġbit Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ fun Ġencode Matched ( range Encoder : ĠRange Encoder , Ġmatch Byte : ĠByte , Ġsymbol : ĠByte ) Ġ{ Ċĉĉĉĉ ĉ var Ġcontext Ġ= Ġ 1 Ċĉĉĉĉ ĉ var Ġsame Ġ= Ġtrue Ċĉĉĉĉ ĉ for Ġ( i Ġin Ġ 7 Ġdown To Ġ 0 ) Ġ{ Ċĉĉĉĉĉ ĉ val Ġbit Ġ= Ġsymbol Ġshr Ġi Ġand Ġ 1 Ċĉĉĉĉĉ ĉ var Ġstate Ġ= Ġcontext Ċĉĉĉĉĉ ĉ if Ġ( same ) Ġ{ Ċĉĉĉĉĉĉ ĉ val Ġmatch Bit Ġ= Ġmatch Byte Ġshr Ġi Ġand Ġ 1 Ċĉĉĉĉĉĉ ĉ state Ġ+= Ġ 1 Ġ+ Ġmatch Bit Ġshl Ġ 8 Ċĉĉĉĉĉĉ ĉ same Ġ= Ġmatch Bit Ġ== Ġbit Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ range Encoder . encode ( m _ En coders , Ġstate , Ġbit ) Ċĉĉĉĉĉ ĉ context Ġ= Ġcontext Ġshl Ġ 1 Ġor Ġbit Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ fun Ġget Price ( match Mode : ĠBoolean , Ġmatch Byte : ĠByte , Ġsymbol : ĠByte ): ĠInt Ġ{ Ċĉĉĉĉ ĉ var Ġprice Ġ= Ġ 0 Ċĉĉĉĉ ĉ var Ġcontext Ġ= Ġ 1 Ċĉĉĉĉ ĉ var Ġi Ġ= Ġ 7 Ċĉĉĉĉ ĉ if Ġ( match Mode ) Ġ{ Ċĉĉĉĉĉ ĉ while Ġ( i Ġ>= Ġ 0 ) Ġ{ Ċĉĉĉĉĉĉ ĉ val Ġmatch Bit Ġ= Ġmatch Byte Ġshr Ġi Ġand Ġ 1 Ċĉĉĉĉĉĉ ĉ val Ġbit Ġ= Ġsymbol Ġshr Ġi Ġand Ġ 1 Ċĉĉĉĉĉĉ ĉ price Ġ+= ĠRange Encoder . get Price ( Ċĉĉĉĉĉĉĉ ĉ m _ En coders [( 1 Ġ+ Ġmatch Bit Ġshl Ġ 8 ) Ġ+ Ġcontext ]. toInt (), Ċĉĉĉĉĉĉĉ ĉ bit Ċĉĉĉĉĉĉ ĉ ) Ċĉĉĉĉĉĉ ĉ context Ġ= Ġcontext Ġshl Ġ 1 Ġor Ġbit Ċĉĉĉĉĉĉ ĉ if Ġ( match Bit Ġ!= Ġbit ) Ġ{ Ċĉĉĉĉĉĉĉ ĉ i -- Ċĉĉĉĉĉĉĉ ĉ break Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ i -- Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ while Ġ( i Ġ>= Ġ 0 ) Ġ{ Ċĉĉĉĉĉ ĉ val Ġbit Ġ= Ġsymbol Ġshr Ġi Ġand Ġ 1 Ċĉĉĉĉĉ ĉ price Ġ+= ĠRange Encoder . get Price ( Ċĉĉĉĉĉĉ ĉ m _ En coders [ context ]. toInt (), Ċĉĉĉĉĉĉ ĉ bit Ċĉĉĉĉĉ ĉ ) Ċĉĉĉĉĉ ĉ context Ġ= Ġcontext Ġshl Ġ 1 Ġor Ġbit Ċĉĉĉĉĉ ĉ i -- Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ return Ġprice Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĊĉĉ ĉ fun Ġcreate ( num Pos Bits : ĠInt , Ġnum Prev Bits : ĠInt ) Ġ{ Ċĉĉĉ ĉ if Ġ( m _ Cod ers Ġ!= Ġnull Ġ&& Ġm _ Num Prev Bits Ġ== Ġnum Prev Bits Ġ&& Ġm _ Num Pos Bits Ġ== Ġnum Pos Bits ) Ċĉĉĉĉ ĉ return Ċĉĉĉ ĉ m _ Num Pos Bits Ġ= Ġnum Pos Bits Ċĉĉĉ ĉ m _ Pos Mask Ġ= Ġ( 1 Ġshl Ġnum Pos Bits ) Ġ- Ġ 1 Ċĉĉĉ ĉ m _ Num Prev Bits Ġ= Ġnum Prev Bits Ċĉĉĉ ĉ val Ġnum States Ġ= Ġ 1 Ġshl Ġm _ Num Prev Bits Ġ+ Ġm _ Num Pos Bits Ċĉĉĉ ĉ m _ Cod ers Ġ= ĠArray ( num States ) Ġ{ ĠEncoder 2 () Ġ} Ċĉĉ ĉ } ĊĊĉĉ ĉ fun Ġinit () Ġ{ Ċĉĉĉ ĉ val Ġnum States Ġ= Ġ 1 Ġshl Ġm _ Num Prev Bits Ġ+ Ġm _ Num Pos Bits Ċĉĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġnum States ) Ċĉĉĉĉ ĉ m _ Cod ers ! ![ i ]. init () Ċĉĉ ĉ } ĊĊĉĉ ĉ fun Ġget Sub Coder ( pos : ĠInt , Ġprev Byte : ĠByte ): ĠEncoder 2 Ġ= Ċĉĉĉ ĉ m _ Cod ers ! ![ ( pos Ġand Ġm _ Pos Mask Ġshl Ġm _ Num Prev Bits ) Ġ+ Ġ( prev Byte Ġand Ġ 0 xFF ). ush r ( 8 Ġ- Ġm _ Num Prev Bits )] Ċĉ ĉ } ĊĊĉ ĉ internal Ġopen Ġinner Ġclass ĠLen Encoder Ġ{ Ċĉĉ ĉ private Ġvar Ġ_ choice Ġ= ĠShort Array ( 2 ) Ċĉĉ ĉ private Ġvar Ġ_ low Coder Ġ= ĠArray ( Lz ma Base . k Num Pos States Encoding Max ) Ġ{ ĠBit Tree Encoder ( Lz ma Base . k Num Low Len Bits ) Ġ} Ċĉĉ ĉ private Ġvar Ġ_ mid Coder Ġ= ĠArray ( Lz ma Base . k Num Pos States Encoding Max ) Ġ{ ĠBit Tree Encoder ( Lz ma Base . k Num Mid Len Bits ) Ġ} Ċĉĉ ĉ private Ġvar Ġ_ high Coder Ġ= ĠBit Tree Encoder ( Lz ma Base . k Num High Len Bits ) ĊĊĉĉ ĉ fun Ġinit ( num Pos States : ĠInt ) Ġ{ Ċĉĉĉ ĉ Range Encoder . init Bit Models (_ choice ) ĊĊĉĉĉ ĉ for Ġ( pos State Ġin Ġ 0 Ġuntil Ġnum Pos States ) Ġ{ Ċĉĉĉĉ ĉ _ low Coder [ pos State ]. init () Ċĉĉĉĉ ĉ _ mid Coder [ pos State ]. init () Ċĉĉĉ ĉ } Ċĉĉĉ ĉ _ high Coder . init () Ċĉĉ ĉ } ĊĊĉĉ ĉ open Ġfun Ġencode ( range Encoder : ĠRange Encoder , Ġsymbol : ĠInt , Ġpos State : ĠInt ) Ġ{ Ċĉĉĉ ĉ var Ġsym Ġ= Ġsymbol Ċĉĉĉ ĉ if Ġ( sym Ġ< ĠL z ma Base . k Num Low Len Symbols ) Ġ{ Ċĉĉĉĉ ĉ range Encoder . encode (_ choice , Ġ 0 , Ġ 0 ) Ċĉĉĉĉ ĉ _ low Coder [ pos State ]. encode ( range Encoder , Ġsym ) Ċĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉ ĉ sym Ġ-= ĠL z ma Base . k Num Low Len Symbols Ċĉĉĉĉ ĉ range Encoder . encode (_ choice , Ġ 0 , Ġ 1 ) Ċĉĉĉĉ ĉ if Ġ( sym Ġ< ĠL z ma Base . k Num Mid Len Symbols ) Ġ{ Ċĉĉĉĉĉ ĉ range Encoder . encode (_ choice , Ġ 1 , Ġ 0 ) Ċĉĉĉĉĉ ĉ _ mid Coder [ pos State ]. encode ( range Encoder , Ġsym ) Ċĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉ ĉ range Encoder . encode (_ choice , Ġ 1 , Ġ 1 ) Ċĉĉĉĉĉ ĉ _ high Coder . encode ( range Encoder , Ġsym Ġ- ĠL z ma Base . k Num Mid Len Symbols ) Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĊĉĉ ĉ fun Ġset Prices ( pos State : ĠInt , Ġnum Symbols : ĠInt , Ġprices : ĠInt Array , Ġst : ĠInt ) Ġ{ Ċĉĉĉ ĉ val Ġa 0 Ġ= ĠRange Encoder . get Price 0 (_ choice [ 0 ]. toInt ()) Ċĉĉĉ ĉ val Ġa 1 Ġ= ĠRange Encoder . get Price 1 (_ choice [ 0 ]. toInt ()) Ċĉĉĉ ĉ val Ġb 0 Ġ= Ġa 1 Ġ+ ĠRange Encoder . get Price 0 (_ choice [ 1 ]. toInt ()) Ċĉĉĉ ĉ val Ġb 1 Ġ= Ġa 1 Ġ+ ĠRange Encoder . get Price 1 (_ choice [ 1 ]. toInt ()) Ċĉĉĉ ĉ var Ġi Ġ= Ġ 0 Ċĉĉĉ ĉ while Ġ( i Ġ< ĠL z ma Base . k Num Low Len Symbols ) Ġ{ Ċĉĉĉĉ ĉ if Ġ( i Ġ>= Ġnum Symbols ) Ġreturn Ċĉĉĉĉ ĉ prices [ st Ġ+ Ġi ] Ġ= Ġa 0 Ġ+ Ġ_ low Coder [ pos State ]. get Price ( i ) Ċĉĉĉĉ ĉ i ++ Ċĉĉĉ ĉ } Ċĉĉĉ ĉ while Ġ( i Ġ< ĠL z ma Base . k Num Low Len Symbols Ġ+ ĠL z ma Base . k Num Mid Len Symbols ) Ġ{ Ċĉĉĉĉ ĉ if Ġ( i Ġ>= Ġnum Symbols ) Ġreturn Ċĉĉĉĉ ĉ prices [ st Ġ+ Ġi ] Ġ= Ġb 0 Ġ+ Ġ_ mid Coder [ pos State ]. get Price ( i Ġ- ĠL z ma Base . k Num Low Len Symbols ) Ċĉĉĉĉ ĉ i ++ Ċĉĉĉ ĉ } Ċĉĉĉ ĉ while Ġ( i Ġ< Ġnum Symbols ) Ġ{ Ċĉĉĉĉ ĉ prices [ st Ġ+ Ġi ] Ġ= Ġb 1 Ġ+ Ġ_ high Coder . get Price ( i Ġ- ĠL z ma Base . k Num Low Len Symbols Ġ- ĠL z ma Base . k Num Mid Len Symbols ) Ċĉĉĉĉ ĉ i ++ Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ internal Ġinner Ġclass ĠLen Price Table Encoder Ġ: ĠLen Encoder () Ġ{ Ċĉĉ ĉ private Ġvar Ġ_ prices Ġ= ĠInt Array ( Lz ma Base . k Num Len Symbols Ġshl ĠL z ma Base . k Num Pos States Bits Encoding Max ) Ċĉĉ ĉ private Ġvar Ġ_ table Size : ĠInt Ġ= Ġ 0 Ċĉĉ ĉ private Ġvar Ġ_ counters Ġ= ĠInt Array ( Lz ma Base . k Num Pos States Encoding Max ) ĊĊĉĉ ĉ fun Ġset Table Size ( table Size : ĠInt ) Ġ{ Ċĉĉĉ ĉ _ table Size Ġ= Ġtable Size Ċĉĉ ĉ } ĊĊĉĉ ĉ fun Ġget Price ( symbol : ĠInt , Ġpos State : ĠInt ): ĠInt Ġ= Ġ_ prices [ pos State Ġ* ĠL z ma Base . k Num Len Symbols Ġ+ Ġsymbol ] ĊĊĉĉ ĉ private Ġfun Ġupdate Table ( pos State : ĠInt ) Ġ{ Ċĉĉĉ ĉ set Prices ( pos State , Ġ_ table Size , Ġ_ prices , Ġpos State Ġ* ĠL z ma Base . k Num Len Symbols ) Ċĉĉĉ ĉ _ counters [ pos State ] Ġ= Ġ_ table Size Ċĉĉ ĉ } ĊĊĉĉ ĉ fun Ġupdate Tables ( num Pos States : ĠInt ) Ġ= Ġrun Ġ{ Ġfor Ġ( pos State Ġin Ġ 0 Ġuntil Ġnum Pos States ) Ġupdate Table ( pos State ) Ġ} ĊĊĉĉ ĉ override Ġfun Ġencode ( range Encoder : ĠRange Encoder , Ġsymbol : ĠInt , Ġpos State : ĠInt ) Ġ{ Ċĉĉĉ ĉ super . encode ( range Encoder , Ġsymbol , Ġpos State ) Ċĉĉĉ ĉ if Ġ(-- _ counters [ pos State ] Ġ== Ġ 0 ) Ċĉĉĉĉ ĉ update Table ( pos State ) Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ internal Ġinner Ġclass ĠOpt imal Ġ{ Ċĉĉ ĉ var Ġstate : ĠInt Ġ= Ġ 0 ĊĊĉĉ ĉ var Ġprev 1 Is Char : ĠBoolean Ġ= Ġfalse Ċĉĉ ĉ var Ġprev 2 : ĠBoolean Ġ= Ġfalse ĊĊĉĉ ĉ var Ġpos Prev 2 : ĠInt Ġ= Ġ 0 Ċĉĉ ĉ var Ġback Prev 2 : ĠInt Ġ= Ġ 0 ĊĊĉĉ ĉ var Ġprice : ĠInt Ġ= Ġ 0 Ċĉĉ ĉ var Ġpos Prev : ĠInt Ġ= Ġ 0 Ċĉĉ ĉ var Ġback Prev : ĠInt Ġ= Ġ 0 ĊĊĉĉ ĉ var Ġback s 0 : ĠInt Ġ= Ġ 0 Ċĉĉ ĉ var Ġback s 1 : ĠInt Ġ= Ġ 0 Ċĉĉ ĉ var Ġback s 2 : ĠInt Ġ= Ġ 0 Ċĉĉ ĉ var Ġback s 3 : ĠInt Ġ= Ġ 0 ĊĊĉĉ ĉ fun Ġmake As Char () Ġ{ Ċĉĉĉ ĉ back Prev Ġ= Ġ- 1 Ċĉĉĉ ĉ prev 1 Is Char Ġ= Ġfalse Ċĉĉ ĉ } ĊĊĉĉ ĉ fun Ġmake As Short Rep () Ġ{ Ċĉĉĉ ĉ back Prev Ġ= Ġ 0 Ċĉĉĉ ĉ prev 1 Is Char Ġ= Ġfalse Ċĉĉ ĉ } ĊĊĉĉ ĉ fun Ġis Short Rep (): ĠBoolean Ġ= Ġback Prev Ġ== Ġ 0 Ċĉ ĉ } ĊĊĉ ĉ internal Ġfun Ġcreate () Ġ{ Ċĉĉ ĉ if Ġ(_ match Finder Ġ== Ġnull ) Ġ{ Ċĉĉĉ ĉ val Ġbt Ġ= ĠL z Bin Tree () Ċĉĉĉ ĉ var Ġnum Hash Bytes Ġ= Ġ 4 Ċĉĉĉ ĉ if Ġ(_ match Finder Type Ġ== ĠE Match Finder Type BT 2 ) Ċĉĉĉĉ ĉ num Hash Bytes Ġ= Ġ 2 Ċĉĉĉ ĉ bt . setType ( num Hash Bytes ) Ċĉĉĉ ĉ _ match Finder Ġ= Ġbt Ċĉĉ ĉ } Ċĉĉ ĉ _ literal Encoder . create (_ num Literal Pos State Bits , Ġ_ num Literal Context Bits ) ĊĊĉĉ ĉ if Ġ(_ dictionary Size Ġ== Ġ_ dictionary Size Prev Ġ&& Ġ_ num Fast Bytes Prev Ġ== Ġ_ num Fast Bytes ) Ċĉĉĉ ĉ return Ċĉĉ ĉ _ match Finder !!. create ( Ċĉĉĉ ĉ _ dictionary Size , Ċĉĉĉ ĉ k Num Opts , Ġ_ num Fast Bytes , ĠL z ma Base . k Match Max Len Ġ+ Ġ 1 Ċĉĉ ĉ ) Ċĉĉ ĉ _ dictionary Size Prev Ġ= Ġ_ dictionary Size Ċĉĉ ĉ _ num Fast Bytes Prev Ġ= Ġ_ num Fast Bytes Ċĉ ĉ } ĊĊĉ ĉ // internal Ġfun Ġset Write End Marker Mode ( write End Marker : ĠBoolean ) Ġ{ Ġ_ write End Mark Ġ= Ġwrite End Marker Ġ} ĊĊĉ ĉ internal Ġfun Ġinit () Ġ{ Ċĉĉ ĉ base Init () Ċĉĉ ĉ _ range Encoder . init () ĊĊĉĉ ĉ Range Encoder . init Bit Models (_ is Match ) Ċĉĉ ĉ Range Encoder . init Bit Models (_ is Rep 0 Long ) Ċĉĉ ĉ Range Encoder . init Bit Models (_ is Rep ) Ċĉĉ ĉ Range Encoder . init Bit Models (_ is Rep G 0 ) Ċĉĉ ĉ Range Encoder . init Bit Models (_ is Rep G 1 ) Ċĉĉ ĉ Range Encoder . init Bit Models (_ is Rep G 2 ) Ċĉĉ ĉ Range Encoder . init Bit Models (_ pos En coders ) ĊĊĉĉ ĉ _ literal Encoder . init () Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil ĠL z ma Base . k Num Len To Pos States ) Ġ{ Ċĉĉĉ ĉ _ pos Slot Encoder [ i ]. init () Ċĉĉ ĉ } ĊĊĉĉ ĉ _ len Encoder . init ( 1 Ġshl Ġ_ pos State Bits ) Ċĉĉ ĉ _ rep Match Len Encoder . init ( 1 Ġshl Ġ_ pos State Bits ) ĊĊĉĉ ĉ _ pos Align Encoder . init () ĊĊĉĉ ĉ _ longest Match Was Found Ġ= Ġfalse Ċĉĉ ĉ _ opt imum End Index Ġ= Ġ 0 Ċĉĉ ĉ _ opt imum Current Index Ġ= Ġ 0 Ċĉĉ ĉ _ additional Offset Ġ= Ġ 0 Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġread Match Dist ances (): ĠInt Ġ{ Ċĉĉ ĉ var Ġlen Res Ġ= Ġ 0 Ċĉĉ ĉ _ num Distance Pairs Ġ= Ġ_ match Finder !!. get Matches (_ match Dist ances ) Ċĉĉ ĉ if Ġ(_ num Distance Pairs Ġ> Ġ 0 ) Ġ{ Ċĉĉĉ ĉ len Res Ġ= Ġ_ match Dist ances [_ num Distance Pairs Ġ- Ġ 2 ] Ċĉĉĉ ĉ if Ġ( len Res Ġ== Ġ_ num Fast Bytes ) Ċĉĉĉĉ ĉ len Res Ġ+= Ġ_ match Finder !!. get Match Len ( Ċĉĉĉĉĉ ĉ len Res Ġ- Ġ 1 , Ġ_ match Dist ances [_ num Distance Pairs Ġ- Ġ 1 ], Ċĉĉĉĉĉ ĉ Lz ma Base . k Match Max Len Ġ- Ġlen Res Ċĉĉĉĉ ĉ ) Ċĉĉ ĉ } Ċĉĉ ĉ _ additional Offset ++ Ċĉĉ ĉ return Ġlen Res Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġmove Pos ( num : ĠInt ) Ġ{ Ċĉĉ ĉ if Ġ( num Ġ> Ġ 0 ) Ġ{ Ċĉĉĉ ĉ _ match Finder !!. skip ( num ) Ċĉĉĉ ĉ _ additional Offset Ġ+= Ġnum Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġget Rep Len 1 Price ( state : ĠInt , Ġpos State : ĠInt ): ĠInt Ġ= Ċĉĉ ĉ Range Encoder . get Price 0 (_ is Rep G 0 [ state ]. toInt ()) Ġ+ ĠRange Encoder . get Price 0 ( Ċĉĉĉ ĉ _ is Rep 0 Long [( state Ġshl ĠL z ma Base . k Num Pos States Bits Max ) Ġ+ Ġpos State ]. toInt () Ċĉĉ ĉ ) ĊĊĉ ĉ private Ġfun Ġget Pure Rep Price ( rep Index : ĠInt , Ġstate : ĠInt , Ġpos State : ĠInt ): ĠInt Ġ{ Ċĉĉ ĉ var Ġprice : ĠInt Ċĉĉ ĉ if Ġ( rep Index Ġ== Ġ 0 ) Ġ{ Ċĉĉĉ ĉ price Ġ= ĠRange Encoder . get Price 0 (_ is Rep G 0 [ state ]. toInt ()) Ċĉĉĉ ĉ price Ġ+= ĠRange Encoder . get Price 1 ( Ċĉĉĉĉ ĉ _ is Rep 0 Long [( state Ġshl ĠL z ma Base . k Num Pos States Bits Max ) Ġ+ Ġpos State ]. toInt () Ċĉĉĉ ĉ ) Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ price Ġ= ĠRange Encoder . get Price 1 (_ is Rep G 0 [ state ]. toInt ()) Ċĉĉĉ ĉ if Ġ( rep Index Ġ== Ġ 1 ) Ġ{ Ċĉĉĉĉ ĉ price Ġ+= ĠRange Encoder . get Price 0 (_ is Rep G 1 [ state ]. toInt ()) Ċĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉ ĉ price Ġ+= ĠRange Encoder . get Price 1 (_ is Rep G 1 [ state ]. toInt ()) Ċĉĉĉĉ ĉ price Ġ+= ĠRange Encoder . get Price (_ is Rep G 2 [ state ]. toInt (), Ġrep Index Ġ- Ġ 2 ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ return Ġprice Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġget Rep Price ( rep Index : ĠInt , Ġlen : ĠInt , Ġstate : ĠInt , Ġpos State : ĠInt ): ĠInt Ġ{ Ċĉĉ ĉ val Ġprice Ġ= Ġ_ rep Match Len Encoder . get Price ( len Ġ- ĠL z ma Base . k Match Min Len , Ġpos State ) Ċĉĉ ĉ return Ġprice Ġ+ Ġget Pure Rep Price ( rep Index , Ġstate , Ġpos State ) Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġget Pos Len Price ( pos : ĠInt , Ġlen : ĠInt , Ġpos State : ĠInt ): ĠInt Ġ{ Ċĉĉ ĉ val Ġprice : ĠInt Ċĉĉ ĉ val Ġlen To Pos State Ġ= ĠL z ma Base . get Len To Pos State ( len ) Ċĉĉ ĉ price Ġ= Ġif Ġ( pos Ġ< ĠL z ma Base . k Num Full Dist ances ) Ċĉĉĉ ĉ _ distances Prices [ len To Pos State Ġ* ĠL z ma Base . k Num Full Dist ances Ġ+ Ġpos ] Ċĉĉ ĉ else Ċĉĉĉ ĉ _ pos Slot Prices [( len To Pos State Ġshl ĠL z ma Base . k Num Pos Slot Bits ) Ġ+ Ġget Pos Slot 2 ( pos )] Ġ+ Ġ_ align Prices [ pos Ġand ĠL z ma Base . k Align Mask ] Ċĉĉ ĉ return Ġprice Ġ+ Ġ_ len Encoder . get Price ( len Ġ- ĠL z ma Base . k Match Min Len , Ġpos State ) Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġbackward ( cur : ĠInt ): ĠInt Ġ{ Ċĉĉ ĉ var Ġcc Ġ= Ġcur Ċĉĉ ĉ _ opt imum End Index Ġ= Ġcc Ċĉĉ ĉ var Ġpos Mem Ġ= Ġ_ opt imum [ cc ]. pos Prev Ċĉĉ ĉ var Ġback Mem Ġ= Ġ_ opt imum [ cc ]. back Prev Ċĉĉ ĉ do Ġ{ Ċĉĉĉ ĉ if Ġ(_ opt imum [ cc ]. prev 1 Is Char ) Ġ{ Ċĉĉĉĉ ĉ _ opt imum [ pos Mem ]. make As Char () Ċĉĉĉĉ ĉ _ opt imum [ pos Mem ]. pos Prev Ġ= Ġpos Mem Ġ- Ġ 1 Ċĉĉĉĉ ĉ if Ġ(_ opt imum [ cc ]. prev 2 ) Ġ{ Ċĉĉĉĉĉ ĉ _ opt imum [ pos Mem Ġ- Ġ 1 ]. prev 1 Is Char Ġ= Ġfalse Ċĉĉĉĉĉ ĉ _ opt imum [ pos Mem Ġ- Ġ 1 ]. pos Prev Ġ= Ġ_ opt imum [ cc ]. pos Prev 2 Ċĉĉĉĉĉ ĉ _ opt imum [ pos Mem Ġ- Ġ 1 ]. back Prev Ġ= Ġ_ opt imum [ cc ]. back Prev 2 Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ val Ġpos Prev Ġ= Ġpos Mem Ċĉĉĉ ĉ val Ġback Cur Ġ= Ġback Mem ĊĊĉĉĉ ĉ back Mem Ġ= Ġ_ opt imum [ pos Prev ]. back Prev Ċĉĉĉ ĉ pos Mem Ġ= Ġ_ opt imum [ pos Prev ]. pos Prev ĊĊĉĉĉ ĉ _ opt imum [ pos Prev ]. back Prev Ġ= Ġback Cur Ċĉĉĉ ĉ _ opt imum [ pos Prev ]. pos Prev Ġ= Ġcc Ċĉĉĉ ĉ cc Ġ= Ġpos Prev Ċĉĉ ĉ } Ġwhile Ġ( cc Ġ> Ġ 0 ) Ċĉĉ ĉ back Res Ġ= Ġ_ opt imum [ 0 ]. back Prev Ċĉĉ ĉ _ opt imum Current Index Ġ= Ġ_ opt imum [ 0 ]. pos Prev Ċĉĉ ĉ return Ġ_ opt imum Current Index Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġget Opt imum ( position : ĠInt ): ĠInt Ġ{ Ċĉĉ ĉ var Ġp pos Ġ= Ġposition Ċĉĉ ĉ if Ġ(_ opt imum End Index Ġ!= Ġ_ opt imum Current Index ) Ġ{ Ċĉĉĉ ĉ val Ġlen Res Ġ= Ġ_ opt imum [_ opt imum Current Index ]. pos Prev Ġ- Ġ_ opt imum Current Index Ċĉĉĉ ĉ back Res Ġ= Ġ_ opt imum [_ opt imum Current Index ]. back Prev Ċĉĉĉ ĉ _ opt imum Current Index Ġ= Ġ_ opt imum [_ opt imum Current Index ]. pos Prev Ċĉĉĉ ĉ return Ġlen Res Ċĉĉ ĉ } Ċĉĉ ĉ _ opt imum End Index Ġ= Ġ 0 Ċĉĉ ĉ _ opt imum Current Index Ġ= Ġ_ opt imum End Index ĊĊĉĉ ĉ val Ġlen Main : ĠInt Ċĉĉ ĉ var Ġnum Distance Pairs : ĠInt Ċĉĉ ĉ if Ġ(!_ longest Match Was Found ) Ġ{ Ċĉĉĉ ĉ len Main Ġ= Ġread Match Dist ances () Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ len Main Ġ= Ġ_ longest Match Length Ċĉĉĉ ĉ _ longest Match Was Found Ġ= Ġfalse Ċĉĉ ĉ } Ċĉĉ ĉ num Distance Pairs Ġ= Ġ_ num Distance Pairs ĊĊĉĉ ĉ var Ġnum Available Bytes Ġ= Ġ_ match Finder !!. getNum Available Bytes () Ġ+ Ġ 1 Ċĉĉ ĉ if Ġ( num Available Bytes Ġ< Ġ 2 ) Ġ{ Ċĉĉĉ ĉ back Res Ġ= Ġ- 1 Ċĉĉĉ ĉ return Ġ 1 Ċĉĉ ĉ } Ċĉĉ ĉ if Ġ( num Available Bytes Ġ> ĠL z ma Base . k Match Max Len ) Ġ{ Ċĉĉĉ ĉ @ Suppress (" UNUSED _ VALUE ") Ċĉĉĉ ĉ num Available Bytes Ġ= ĠL z ma Base . k Match Max Len Ċĉĉ ĉ } ĊĊĉĉ ĉ var Ġrep Max Index Ġ= Ġ 0 Ċĉĉ ĉ var Ġi Ġ= Ġ 0 Ċĉĉ ĉ while Ġ( i Ġ< ĠL z ma Base . k Num Rep Dist ances ) Ġ{ Ċĉĉĉ ĉ reps [ i ] Ġ= Ġ_ rep Dist ances [ i ] Ċĉĉĉ ĉ rep Lens [ i ] Ġ= Ġ_ match Finder !!. get Match Len ( Ċĉĉĉĉĉ 0 Ġ- Ġ 1 , Ġre ps [ i ], Ċĉĉĉĉ ĉ Lz ma Base . k Match Max Len Ċĉĉĉ ĉ ) Ċĉĉĉ ĉ if Ġ( rep Lens [ i ] Ġ> Ġrep Lens [ rep Max Index ]) Ċĉĉĉĉ ĉ rep Max Index Ġ= Ġi Ċĉĉĉ ĉ i ++ Ċĉĉ ĉ } Ċĉĉ ĉ if Ġ( rep Lens [ rep Max Index ] Ġ>= Ġ_ num Fast Bytes ) Ġ{ Ċĉĉĉ ĉ back Res Ġ= Ġrep Max Index Ċĉĉĉ ĉ val Ġlen Res Ġ= Ġrep Lens [ rep Max Index ] Ċĉĉĉ ĉ move Pos ( len Res Ġ- Ġ 1 ) Ċĉĉĉ ĉ return Ġlen Res Ċĉĉ ĉ } ĊĊĉĉ ĉ if Ġ( len Main Ġ>= Ġ_ num Fast Bytes ) Ġ{ Ċĉĉĉ ĉ back Res Ġ= Ġ_ match Dist ances [ num Distance Pairs Ġ- Ġ 1 ] Ġ+ Ċĉĉĉĉĉ ĉ Lz ma Base . k Num Rep Dist ances Ċĉĉĉ ĉ move Pos ( len Main Ġ- Ġ 1 ) Ċĉĉĉ ĉ return Ġlen Main Ċĉĉ ĉ } ĊĊĉĉ ĉ var Ġcurrent Byte Ġ= Ġ_ match Finder !!. getIndex Byte ( 0 Ġ- Ġ 1 ) Ċĉĉ ĉ var Ġmatch Byte Ġ= Ġ_ match Finder !!. getIndex Byte ( 0 Ġ- Ġ_ rep Dist ances [ 0 ] Ġ- Ġ 1 Ġ- Ġ 1 ) ĊĊĉĉ ĉ if Ġ( len Main Ġ< Ġ 2 Ġ&& Ġcurrent Byte Ġ!= Ġmatch Byte Ġ&& Ġrep Lens [ rep Max Index ] Ġ< Ġ 2 ) Ġ{ Ċĉĉĉ ĉ back Res Ġ= Ġ- 1 Ċĉĉĉ ĉ return Ġ 1 Ċĉĉ ĉ } ĊĊĉĉ ĉ _ opt imum [ 0 ]. state Ġ= Ġ_ state ĊĊĉĉ ĉ var Ġpos State Ġ= Ġp pos Ġand Ġ_ pos State Mask ĊĊĉĉ ĉ _ opt imum [ 1 ]. price Ġ= ĠRange Encoder . get Price 0 ( Ċĉĉĉ ĉ _ is Match [ (_ state Ġshl ĠL z ma Base . k Num Pos States Bits Max ) Ġ+ Ġpos State ]. toInt () Ċĉĉ ĉ ) Ġ+ Ċĉĉĉĉ ĉ _ literal Encoder . getSub Coder ( pp os , Ġ_ previous Byte ). get Price ( Ċĉĉĉĉĉ ĉ ! Lz ma Base . state Is Char State (_ state ), Ċĉĉĉĉĉ ĉ match Byte , Ċĉĉĉĉĉ ĉ current Byte Ċĉĉĉĉ ĉ ) Ċĉĉ ĉ _ opt imum [ 1 ]. make As Char () ĊĊĉĉ ĉ var Ġmatch Price Ġ= Ċĉĉĉ ĉ Range Encoder . get Price 1 (_ is Match [ (_ state Ġshl ĠL z ma Base . k Num Pos States Bits Max ) Ġ+ Ġpos State ]. toInt ()) Ċĉĉ ĉ var Ġrep Match Price Ġ= Ċĉĉĉ ĉ match Price Ġ+ ĠRange Encoder . get Price 1 ( Ċĉĉĉĉ ĉ _ is Rep [_ state ]. toInt () Ċĉĉĉ ĉ ) ĊĊĉĉ ĉ if Ġ( match Byte Ġ== Ġcurrent Byte ) Ġ{ Ċĉĉĉ ĉ val Ġshort Rep Price Ġ= Ġrep Match Price Ġ+ Ġget Rep Len 1 Price (_ state , Ġpos State ) Ċĉĉĉ ĉ if Ġ( short Rep Price Ġ< Ġ_ opt imum [ 1 ]. price ) Ġ{ Ċĉĉĉĉ ĉ _ opt imum [ 1 ]. price Ġ= Ġshort Rep Price Ċĉĉĉĉ ĉ _ opt imum [ 1 ]. make As Short Rep () Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĊĉĉ ĉ var Ġlen End Ġ= Ġif Ġ( len Main Ġ>= Ġrep Lens [ rep Max Index ]) Ġlen Main Ġelse Ġrep Lens [ rep Max Index ] ĊĊĉĉ ĉ if Ġ( len End Ġ< Ġ 2 ) Ġ{ Ċĉĉĉ ĉ back Res Ġ= Ġ_ opt imum [ 1 ]. back Prev Ċĉĉĉ ĉ return Ġ 1 Ċĉĉ ĉ } ĊĊĉĉ ĉ _ opt imum [ 1 ]. pos Prev Ġ= Ġ 0 ĊĊĉĉ ĉ _ opt imum [ 0 ]. back s 0 Ġ= Ġre ps [ 0 ] Ċĉĉ ĉ _ opt imum [ 0 ]. back s 1 Ġ= Ġre ps [ 1 ] Ċĉĉ ĉ _ opt imum [ 0 ]. back s 2 Ġ= Ġre ps [ 2 ] Ċĉĉ ĉ _ opt imum [ 0 ]. back s 3 Ġ= Ġre ps [ 3 ] ĊĊĉĉ ĉ var Ġlen Ġ= Ġlen End Ċĉĉ ĉ do Ċĉĉĉ ĉ _ opt imum [ len -- ]. price Ġ= Ċĉĉĉĉĉ ĉ k If inity Price Ċĉĉ ĉ while Ġ( len Ġ>= Ġ 2 ) ĊĊĉĉ ĉ i Ġ= Ġ 0 Ċĉĉ ĉ while Ġ( i Ġ< ĠL z ma Base . k Num Rep Dist ances ) Ġ{ Ċĉĉĉ ĉ var Ġrep Len Ġ= Ġrep Lens [ i ] Ċĉĉĉ ĉ if Ġ( rep Len Ġ< Ġ 2 ) Ġ{ Ċĉĉĉĉ ĉ i ++ Ċĉĉĉĉ ĉ continue Ċĉĉĉ ĉ } Ċĉĉĉ ĉ val Ġprice Ġ= Ġrep Match Price Ġ+ Ġget Pure Rep Price ( i , Ġ_ state , Ġpos State ) Ċĉĉĉ ĉ do Ġ{ Ċĉĉĉĉ ĉ val Ġcur And Len Price Ġ= Ġprice Ġ+ Ġ_ rep Match Len Encoder . get Price ( rep Len Ġ- Ġ 2 , Ġpos State ) Ċĉĉĉĉ ĉ val Ġopt imum Ġ= Ġ_ opt imum [ rep Len ] Ċĉĉĉĉ ĉ if Ġ( cur And Len Price Ġ< Ġopt imum . price ) Ġ{ Ċĉĉĉĉĉ ĉ opt imum . price Ġ= Ġcur And Len Price Ċĉĉĉĉĉ ĉ opt imum . pos Prev Ġ= Ġ 0 Ċĉĉĉĉĉ ĉ opt imum . back Prev Ġ= Ġi Ċĉĉĉĉĉ ĉ opt imum . prev 1 Is Char Ġ= Ġfalse Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ġwhile Ġ(-- rep Len Ġ>= Ġ 2 ) Ċĉĉĉ ĉ i ++ Ċĉĉ ĉ } ĊĊĉĉ ĉ var Ġnormal Match Price Ġ= Ċĉĉĉ ĉ match Price Ġ+ ĠRange Encoder . get Price 0 ( Ċĉĉĉĉ ĉ _ is Rep [_ state ]. toInt () Ċĉĉĉ ĉ ) ĊĊĉĉ ĉ len Ġ= Ġif Ġ( rep Lens [ 0 ] Ġ>= Ġ 2 ) Ġrep Lens [ 0 ] Ġ+ Ġ 1 Ġelse Ġ 2 Ċĉĉ ĉ if Ġ( len Ġ<= Ġlen Main ) Ġ{ Ċĉĉĉ ĉ var Ġoff s Ġ= Ġ 0 Ċĉĉĉ ĉ while Ġ( len Ġ> Ġ_ match Dist ances [ offs ]) Ċĉĉĉĉ ĉ offs Ġ+= Ġ 2 Ċĉĉĉ ĉ while Ġ( true ) Ġ{ Ċĉĉĉĉ ĉ val Ġdistance Ġ= Ġ_ match Dist ances [ offs Ġ+ Ġ 1 ] Ċĉĉĉĉ ĉ val Ġcur And Len Price Ġ= Ġnormal Match Price Ġ+ Ġget Pos Len Price ( distance , Ġlen , Ġpos State ) Ċĉĉĉĉ ĉ val Ġopt imum Ġ= Ġ_ opt imum [ len ] Ċĉĉĉĉ ĉ if Ġ( cur And Len Price Ġ< Ġopt imum . price ) Ġ{ Ċĉĉĉĉĉ ĉ opt imum . price Ġ= Ġcur And Len Price Ċĉĉĉĉĉ ĉ opt imum . pos Prev Ġ= Ġ 0 Ċĉĉĉĉĉ ĉ opt imum . back Prev Ġ= Ġdistance Ġ+ Ċĉĉĉĉĉĉĉ ĉ Lz ma Base . k Num Rep Dist ances Ċĉĉĉĉĉ ĉ opt imum . prev 1 Is Char Ġ= Ġfalse Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ if Ġ( len Ġ== Ġ_ match Dist ances [ offs ]) Ġ{ Ċĉĉĉĉĉ ĉ offs Ġ+= Ġ 2 Ċĉĉĉĉĉ ĉ if Ġ( offs Ġ== Ġnum Distance Pairs ) Ċĉĉĉĉĉĉ ĉ break Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ len ++ Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĊĉĉ ĉ var Ġcur Ġ= Ġ 0 ĊĊĉĉ ĉ while Ġ( true ) Ġ{ Ċĉĉĉ ĉ cur ++ Ċĉĉĉ ĉ if Ġ( cur Ġ== Ġlen End ) Ċĉĉĉĉ ĉ return Ġbackward ( cur ) Ċĉĉĉ ĉ var Ġnew Len Ġ= Ġread Match Dist ances () Ċĉĉĉ ĉ num Distance Pairs Ġ= Ġ_ num Distance Pairs Ċĉĉĉ ĉ if Ġ( new Len Ġ>= Ġ_ num Fast Bytes ) Ġ{ ĊĊĉĉĉĉ ĉ _ longest Match Length Ġ= Ġnew Len Ċĉĉĉĉ ĉ _ longest Match Was Found Ġ= Ġtrue Ċĉĉĉĉ ĉ return Ġbackward ( cur ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ pp os ++ Ċĉĉĉ ĉ var Ġpos Prev Ġ= Ġ_ opt imum [ cur ]. pos Prev Ċĉĉĉ ĉ var Ġstate : ĠInt Ċĉĉĉ ĉ if Ġ(_ opt imum [ cur ]. prev 1 Is Char ) Ġ{ Ċĉĉĉĉ ĉ pos Prev -- Ċĉĉĉĉ ĉ if Ġ(_ opt imum [ cur ]. prev 2 ) Ġ{ Ċĉĉĉĉĉ ĉ state Ġ= Ġ_ opt imum [_ opt imum [ cur ]. pos Prev 2 ]. state Ċĉĉĉĉĉ ĉ state Ġ= Ġif Ġ(_ opt imum [ cur ]. back Prev 2 Ġ< ĠL z ma Base . k Num Rep Dist ances ) Ċĉĉĉĉĉĉ ĉ Lz ma Base . state Update Rep ( state ) Ċĉĉĉĉĉ ĉ else Ċĉĉĉĉĉĉ ĉ Lz ma Base . state Update Match ( state ) Ċĉĉĉĉ ĉ } Ġelse Ċĉĉĉĉĉ ĉ state Ġ= Ġ_ opt imum [ pos Prev ]. state Ċĉĉĉĉ ĉ state Ġ= ĠL z ma Base . state Update Char ( state ) Ċĉĉĉ ĉ } Ġelse Ċĉĉĉĉ ĉ state Ġ= Ġ_ opt imum [ pos Prev ]. state Ċĉĉĉ ĉ if Ġ( pos Prev Ġ== Ġcur Ġ- Ġ 1 ) Ġ{ Ċĉĉĉĉ ĉ state Ġ= Ġif Ġ(_ opt imum [ cur ]. is Short Rep ()) Ċĉĉĉĉĉ ĉ Lz ma Base . state Update Short Rep ( state ) Ċĉĉĉĉ ĉ else Ċĉĉĉĉĉ ĉ Lz ma Base . state Update Char ( state ) Ċĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉ ĉ val Ġpos : ĠInt Ċĉĉĉĉ ĉ if Ġ(_ opt imum [ cur ]. prev 1 Is Char Ġ&& Ġ_ opt imum [ cur ]. prev 2 ) Ġ{ Ċĉĉĉĉĉ ĉ pos Prev Ġ= Ġ_ opt imum [ cur ]. pos Prev 2 Ċĉĉĉĉĉ ĉ pos Ġ= Ġ_ opt imum [ cur ]. back Prev 2 Ċĉĉĉĉĉ ĉ state Ġ= ĠL z ma Base . state Update Rep ( state ) Ċĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉ ĉ pos Ġ= Ġ_ opt imum [ cur ]. back Prev Ċĉĉĉĉĉ ĉ state Ġ= Ġif Ġ( pos Ġ< ĠL z ma Base . k Num Rep Dist ances ) Ċĉĉĉĉĉĉ ĉ Lz ma Base . state Update Rep ( state ) Ċĉĉĉĉĉ ĉ else Ċĉĉĉĉĉĉ ĉ Lz ma Base . state Update Match ( state ) Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ val Ġopt Ġ= Ġ_ opt imum [ pos Prev ] Ċĉĉĉĉ ĉ if Ġ( pos Ġ< ĠL z ma Base . k Num Rep Dist ances ) Ġ{ Ċĉĉĉĉĉ ĉ when Ġ( pos ) Ġ{ Ċĉĉĉĉĉĉĉ 0 Ġ-> Ġ{ Ċĉĉĉĉĉĉĉ ĉ reps [ 0 ] Ġ= Ġopt . back s 0 Ċĉĉĉĉĉĉĉ ĉ reps [ 1 ] Ġ= Ġopt . back s 1 Ċĉĉĉĉĉĉĉ ĉ reps [ 2 ] Ġ= Ġopt . back s 2 Ċĉĉĉĉĉĉĉ ĉ reps [ 3 ] Ġ= Ġopt . back s 3 Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉ 1 Ġ-> Ġ{ Ċĉĉĉĉĉĉĉ ĉ reps [ 0 ] Ġ= Ġopt . back s 1 Ċĉĉĉĉĉĉĉ ĉ reps [ 1 ] Ġ= Ġopt . back s 0 Ċĉĉĉĉĉĉĉ ĉ reps [ 2 ] Ġ= Ġopt . back s 2 Ċĉĉĉĉĉĉĉ ĉ reps [ 3 ] Ġ= Ġopt . back s 3 Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉ 2 Ġ-> Ġ{ Ċĉĉĉĉĉĉĉ ĉ reps [ 0 ] Ġ= Ġopt . back s 2 Ċĉĉĉĉĉĉĉ ĉ reps [ 1 ] Ġ= Ġopt . back s 0 Ċĉĉĉĉĉĉĉ ĉ reps [ 2 ] Ġ= Ġopt . back s 1 Ċĉĉĉĉĉĉĉ ĉ reps [ 3 ] Ġ= Ġopt . back s 3 Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ else Ġ-> Ġ{ Ċĉĉĉĉĉĉĉ ĉ reps [ 0 ] Ġ= Ġopt . back s 3 Ċĉĉĉĉĉĉĉ ĉ reps [ 1 ] Ġ= Ġopt . back s 0 Ċĉĉĉĉĉĉĉ ĉ reps [ 2 ] Ġ= Ġopt . back s 1 Ċĉĉĉĉĉĉĉ ĉ reps [ 3 ] Ġ= Ġopt . back s 2 Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉ ĉ reps [ 0 ] Ġ= Ġpos Ġ- ĠL z ma Base . k Num Rep Dist ances Ċĉĉĉĉĉ ĉ reps [ 1 ] Ġ= Ġopt . back s 0 Ċĉĉĉĉĉ ĉ reps [ 2 ] Ġ= Ġopt . back s 1 Ċĉĉĉĉĉ ĉ reps [ 3 ] Ġ= Ġopt . back s 2 Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ _ opt imum [ cur ]. state Ġ= Ġstate Ċĉĉĉ ĉ _ opt imum [ cur ]. back s 0 Ġ= Ġre ps [ 0 ] Ċĉĉĉ ĉ _ opt imum [ cur ]. back s 1 Ġ= Ġre ps [ 1 ] Ċĉĉĉ ĉ _ opt imum [ cur ]. back s 2 Ġ= Ġre ps [ 2 ] Ċĉĉĉ ĉ _ opt imum [ cur ]. back s 3 Ġ= Ġre ps [ 3 ] Ċĉĉĉ ĉ val Ġcur Price Ġ= Ġ_ opt imum [ cur ]. price ĊĊĉĉĉ ĉ current Byte Ġ= Ġ_ match Finder !!. getIndex Byte ( 0 Ġ- Ġ 1 ) Ċĉĉĉ ĉ match Byte Ġ= Ġ_ match Finder !!. getIndex Byte ( 0 Ġ- Ġre ps [ 0 ] Ġ- Ġ 1 Ġ- Ġ 1 ) ĊĊĉĉĉ ĉ pos State Ġ= Ġp pos Ġand Ġ_ pos State Mask ĊĊĉĉĉ ĉ val Ġcur And 1 Price Ġ= Ġcur Price Ġ+ Ċĉĉĉĉĉ ĉ Range Encoder . get Price 0 ( Ċĉĉĉĉĉĉ ĉ _ is Match [( state Ġshl ĠL z ma Base . k Num Pos States Bits Max ) Ġ+ Ġpos State ]. toInt () Ċĉĉĉĉĉ ĉ ) Ġ+ Ċĉĉĉĉĉ ĉ _ literal Encoder . getSub Coder ( Ċĉĉĉĉĉĉ ĉ pp os , Ċĉĉĉĉĉĉ ĉ _ match Finder !!. getIndex Byte ( 0 Ġ- Ġ 2 ) Ċĉĉĉĉĉ ĉ ). get Price (! Lz ma Base . state Is Char State ( state ), Ġmatch Byte , Ġcurrent Byte ) ĊĊĉĉĉ ĉ val Ġnext Opt imum Ġ= Ġ_ opt imum [ cur Ġ+ Ġ 1 ] ĊĊĉĉĉ ĉ var Ġnext Is Char Ġ= Ġfalse Ċĉĉĉ ĉ if Ġ( cur And 1 Price Ġ< Ġnext Opt imum . price ) Ġ{ Ċĉĉĉĉ ĉ next Opt imum . price Ġ= Ġcur And 1 Price Ċĉĉĉĉ ĉ next Opt imum . pos Prev Ġ= Ġcur Ċĉĉĉĉ ĉ next Opt imum . make As Char () Ċĉĉĉĉ ĉ next Is Char Ġ= Ġtrue Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ match Price Ġ= Ġcur Price Ġ+ Ċĉĉĉĉĉ ĉ Range Encoder . get Price 1 ( Ċĉĉĉĉĉĉ ĉ _ is Match [( state Ġshl ĠL z ma Base . k Num Pos States Bits Max ) Ġ+ Ġpos State ]. toInt () Ċĉĉĉĉĉ ĉ ) Ċĉĉĉ ĉ rep Match Price Ġ= Ġmatch Price Ġ+ Ċĉĉĉĉĉ ĉ Range Encoder . get Price 1 ( Ċĉĉĉĉĉĉ ĉ _ is Rep [ state ]. toInt () Ċĉĉĉĉĉ ĉ ) ĊĊĉĉĉ ĉ if Ġ( match Byte Ġ== Ġcurrent Byte Ġ&& Ġ!( next Opt imum . pos Prev Ġ< Ġcur Ġ&& Ġnext Opt imum . back Prev Ġ== Ġ 0 )) Ġ{ Ċĉĉĉĉ ĉ val Ġshort Rep Price Ġ= Ġrep Match Price Ġ+ Ġget Rep Len 1 Price ( state , Ġpos State ) Ċĉĉĉĉ ĉ if Ġ( short Rep Price Ġ<= Ġnext Opt imum . price ) Ġ{ Ċĉĉĉĉĉ ĉ next Opt imum . price Ġ= Ġshort Rep Price Ċĉĉĉĉĉ ĉ next Opt imum . pos Prev Ġ= Ġcur Ċĉĉĉĉĉ ĉ next Opt imum . make As Short Rep () Ċĉĉĉĉĉ ĉ next Is Char Ġ= Ġtrue Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ var Ġnum Available Bytes Full Ġ= Ġ_ match Finder !!. getNum Available Bytes () Ġ+ Ġ 1 Ċĉĉĉ ĉ num Available Bytes Full Ġ= Ġmin ( k Num Opts Ġ- Ġ 1 Ġ- Ġcur , Ġnum Available Bytes Full ) Ċĉĉĉ ĉ num Available Bytes Ġ= Ġnum Available Bytes Full ĊĊĉĉĉ ĉ if Ġ( num Available Bytes Ġ< Ġ 2 ) Ċĉĉĉĉ ĉ continue Ċĉĉĉ ĉ if Ġ( num Available Bytes Ġ> Ġ_ num Fast Bytes ) Ċĉĉĉĉ ĉ num Available Bytes Ġ= Ġ_ num Fast Bytes Ċĉĉĉ ĉ if Ġ(! next Is Char Ġ&& Ġmatch Byte Ġ!= Ġcurrent Byte ) Ġ{ Ċĉĉĉĉ ĉ // Ġtry ĠLiteral Ġ+ Ġrep 0 Ċĉĉĉĉ ĉ val Ġt Ġ= Ġmin ( num Available Bytes Full Ġ- Ġ 1 , Ġ_ num Fast Bytes ) Ċĉĉĉĉ ĉ val Ġlen Test 2 Ġ= Ġ_ match Finder !!. get Match Len ( 0 , Ġre ps [ 0 ], Ġt ) Ċĉĉĉĉ ĉ if Ġ( len Test 2 Ġ>= Ġ 2 ) Ġ{ Ċĉĉĉĉĉ ĉ val Ġstate 2 Ġ= ĠL z ma Base . state Update Char ( state ) ĊĊĉĉĉĉĉ ĉ val Ġpos State Next Ġ= Ġp pos Ġ+ Ġ 1 Ġand Ġ_ pos State Mask Ċĉĉĉĉĉ ĉ val Ġnext Rep Match Price Ġ= Ġcur And 1 Price Ġ+ Ċĉĉĉĉĉĉĉ ĉ Range Encoder . get Price 1 ( Ċĉĉĉĉĉĉĉĉ ĉ _ is Match [( state 2 Ġshl ĠL z ma Base . k Num Pos States Bits Max ) Ġ+ Ġpos State Next ]. toInt () Ċĉĉĉĉĉĉĉ ĉ ) Ġ+ Ċĉĉĉĉĉĉĉ ĉ Range Encoder . get Price 1 ( Ċĉĉĉĉĉĉĉĉ ĉ _ is Rep [ state 2 ]. toInt () Ċĉĉĉĉĉĉĉ ĉ ) Ċĉĉĉĉĉ ĉ run Ġ{ Ċĉĉĉĉĉĉ ĉ val Ġoffset Ġ= Ġcur Ġ+ Ġ 1 Ġ+ Ġlen Test 2 Ċĉĉĉĉĉĉ ĉ while Ġ( len End Ġ< Ġoffset ) Ċĉĉĉĉĉĉĉ ĉ _ opt imum [++ len End ]. price Ġ= Ċĉĉĉĉĉĉĉĉĉ ĉ k If inity Price Ċĉĉĉĉĉĉ ĉ val Ġcur And Len Price Ġ= Ġnext Rep Match Price Ġ+ Ġget Rep Price ( Ċĉĉĉĉĉĉĉĉ 0 , Ġlen Test 2 , Ġstate 2 , Ġpos State Next Ċĉĉĉĉĉĉ ĉ ) Ċĉĉĉĉĉĉ ĉ val Ġopt imum Ġ= Ġ_ opt imum [ offset ] Ċĉĉĉĉĉĉ ĉ if Ġ( cur And Len Price Ġ< Ġopt imum . price ) Ġ{ Ċĉĉĉĉĉĉĉ ĉ opt imum . price Ġ= Ġcur And Len Price Ċĉĉĉĉĉĉĉ ĉ opt imum . pos Prev Ġ= Ġcur Ġ+ Ġ 1 Ċĉĉĉĉĉĉĉ ĉ opt imum . back Prev Ġ= Ġ 0 Ċĉĉĉĉĉĉĉ ĉ opt imum . prev 1 Is Char Ġ= Ġtrue Ċĉĉĉĉĉĉĉ ĉ opt imum . prev 2 Ġ= Ġfalse Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ var Ġstart Len Ġ= Ġ 2 Ġ// Ġspeed Ġoptimization ĊĊĉĉĉ ĉ for Ġ( rep Index Ġin Ġ 0 Ġuntil ĠL z ma Base . k Num Rep Dist ances ) Ġ{ Ċĉĉĉĉ ĉ var Ġlen Test Ġ= Ġ_ match Finder !!. get Match Len ( 0 Ġ- Ġ 1 , Ġre ps [ rep Index ], Ġnum Available Bytes ) Ċĉĉĉĉ ĉ if Ġ( len Test Ġ< Ġ 2 ) Ċĉĉĉĉĉ ĉ continue Ċĉĉĉĉ ĉ val Ġlen Test Temp Ġ= Ġlen Test Ċĉĉĉĉ ĉ do Ġ{ Ċĉĉĉĉĉ ĉ while Ġ( len End Ġ< Ġcur Ġ+ Ġlen Test ) Ċĉĉĉĉĉĉ ĉ _ opt imum [++ len End ]. price Ġ= Ċĉĉĉĉĉĉĉĉ ĉ k If inity Price Ċĉĉĉĉĉ ĉ val Ġcur And Len Price Ġ= Ġrep Match Price Ġ+ Ġget Rep Price ( rep Index , Ġlen Test , Ġstate , Ġpos State ) Ċĉĉĉĉĉ ĉ val Ġopt imum Ġ= Ġ_ opt imum [ cur Ġ+ Ġlen Test ] Ċĉĉĉĉĉ ĉ if Ġ( cur And Len Price Ġ< Ġopt imum . price ) Ġ{ Ċĉĉĉĉĉĉ ĉ opt imum . price Ġ= Ġcur And Len Price Ċĉĉĉĉĉĉ ĉ opt imum . pos Prev Ġ= Ġcur Ċĉĉĉĉĉĉ ĉ opt imum . back Prev Ġ= Ġrep Index Ċĉĉĉĉĉĉ ĉ opt imum . prev 1 Is Char Ġ= Ġfalse Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ġwhile Ġ(-- len Test Ġ>= Ġ 2 ) Ċĉĉĉĉ ĉ len Test Ġ= Ġlen Test Temp ĊĊĉĉĉĉ ĉ if Ġ( rep Index Ġ== Ġ 0 ) Ċĉĉĉĉĉ ĉ start Len Ġ= Ġlen Test Ġ+ Ġ 1 ĊĊĉĉĉĉ ĉ // Ġif Ġ(_ max Mode ) Ċĉĉĉĉ ĉ if Ġ( len Test Ġ< Ġnum Available Bytes Full ) Ġ{ Ċĉĉĉĉĉ ĉ val Ġt Ġ= Ġmin ( num Available Bytes Full Ġ- Ġ 1 Ġ- Ġlen Test , Ġ_ num Fast Bytes ) Ċĉĉĉĉĉ ĉ val Ġlen Test 2 Ġ= Ġ_ match Finder !!. get Match Len ( len Test , Ġre ps [ rep Index ], Ġt ) Ċĉĉĉĉĉ ĉ if Ġ( len Test 2 Ġ>= Ġ 2 ) Ġ{ Ċĉĉĉĉĉĉ ĉ var Ġstate 2 Ġ= Ċĉĉĉĉĉĉĉ ĉ Lz ma Base . state Update Rep ( state ) ĊĊĉĉĉĉĉĉ ĉ var Ġpos State Next Ġ= Ġp pos Ġ+ Ġlen Test Ġand Ġ_ pos State Mask Ċĉĉĉĉĉĉ ĉ val Ġcur And Len Char Price Ġ= Ġrep Match Price Ġ+ Ġget Rep Price ( rep Index , Ġlen Test , Ġstate , Ġpos State ) Ġ+ Ċĉĉĉĉĉĉĉĉ ĉ Range Encoder . get Price 0 ( Ċĉĉĉĉĉĉĉĉĉ ĉ _ is Match [( state 2 Ġshl ĠL z ma Base . k Num Pos States Bits Max ) Ġ+ Ġpos State Next ]. toInt () Ċĉĉĉĉĉĉĉĉ ĉ ) Ġ+ Ċĉĉĉĉĉĉĉĉ ĉ _ literal Encoder . getSub Coder ( Ċĉĉĉĉĉĉĉĉĉ ĉ pp os Ġ+ Ġlen Test , Ċĉĉĉĉĉĉĉĉĉ ĉ _ match Finder !!. getIndex Byte ( len Test Ġ- Ġ 1 Ġ- Ġ 1 ) Ċĉĉĉĉĉĉĉĉ ĉ ). get Price ( Ċĉĉĉĉĉĉĉĉĉ ĉ true , Ċĉĉĉĉĉĉĉĉĉ ĉ _ match Finder !!. getIndex Byte ( len Test Ġ- Ġ 1 Ġ- Ġ( reps [ rep Index ] Ġ+ Ġ 1 )), Ċĉĉĉĉĉĉĉĉĉ ĉ _ match Finder !!. getIndex Byte ( len Test Ġ- Ġ 1 ) Ċĉĉĉĉĉĉĉĉ ĉ ) Ċĉĉĉĉĉĉ ĉ state 2 Ġ= ĠL z ma Base . state Update Char ( state 2 ) Ċĉĉĉĉĉĉ ĉ pos State Next Ġ= Ġp pos Ġ+ Ġlen Test Ġ+ Ġ 1 Ġand Ġ_ pos State Mask Ċĉĉĉĉĉĉ ĉ val Ġnext Match Price Ġ= Ċĉĉĉĉĉĉĉ ĉ cur And Len Char Price Ġ+ ĠRange Encoder . get Price 1 ( Ċĉĉĉĉĉĉĉĉ ĉ _ is Match [( state 2 Ġshl ĠL z ma Base . k Num Pos States Bits Max ) Ġ+ Ġpos State Next ]. toInt () Ċĉĉĉĉĉĉĉ ĉ ) Ċĉĉĉĉĉĉ ĉ val Ġnext Rep Match Price Ġ= Ċĉĉĉĉĉĉĉ ĉ next Match Price Ġ+ ĠRange Encoder . get Price 1 ( Ċĉĉĉĉĉĉĉĉ ĉ _ is Rep [ state 2 ]. toInt () Ċĉĉĉĉĉĉĉ ĉ ) ĊĊĉĉĉĉĉĉ ĉ // Ġfor ( ; Ġlen Test 2 Ġ>= Ġ 2 ; Ġlen Test 2 --) Ċĉĉĉĉĉĉ ĉ run Ġ{ Ċĉĉĉĉĉĉĉ ĉ val Ġoffset Ġ= Ġlen Test Ġ+ Ġ 1 Ġ+ Ġlen Test 2 Ċĉĉĉĉĉĉĉ ĉ while Ġ( len End Ġ< Ġcur Ġ+ Ġoffset ) Ċĉĉĉĉĉĉĉĉ ĉ _ opt imum [++ len End ]. price Ġ= Ċĉĉĉĉĉĉĉĉĉĉ ĉ k If inity Price Ċĉĉĉĉĉĉĉ ĉ val Ġcur And Len Price Ġ= Ġnext Rep Match Price Ġ+ Ġget Rep Price ( 0 , Ġlen Test 2 , Ġstate 2 , Ġpos State Next ) Ċĉĉĉĉĉĉĉ ĉ val Ġopt imum Ġ= Ġ_ opt imum [ cur Ġ+ Ġoffset ] Ċĉĉĉĉĉĉĉ ĉ if Ġ( cur And Len Price Ġ< Ġopt imum . price ) Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ opt imum . price Ġ= Ġcur And Len Price Ċĉĉĉĉĉĉĉĉ ĉ opt imum . pos Prev Ġ= Ġcur Ġ+ Ġlen Test Ġ+ Ġ 1 Ċĉĉĉĉĉĉĉĉ ĉ opt imum . back Prev Ġ= Ġ 0 Ċĉĉĉĉĉĉĉĉ ĉ opt imum . prev 1 Is Char Ġ= Ġtrue Ċĉĉĉĉĉĉĉĉ ĉ opt imum . prev 2 Ġ= Ġtrue Ċĉĉĉĉĉĉĉĉ ĉ opt imum . pos Prev 2 Ġ= Ġcur Ċĉĉĉĉĉĉĉĉ ĉ opt imum . back Prev 2 Ġ= Ġrep Index Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ if Ġ( new Len Ġ> Ġnum Available Bytes ) Ġ{ Ċĉĉĉĉ ĉ new Len Ġ= Ġnum Available Bytes Ċĉĉĉĉ ĉ num Distance Pairs Ġ= Ġ 0 Ċĉĉĉĉ ĉ while Ġ( new Len Ġ> Ġ_ match Dist ances [ num Distance Pairs ]) Ġ{ Ċĉĉĉĉĉ ĉ num Distance Pairs Ġ+= Ġ 2 Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ _ match Dist ances [ num Distance Pairs ] Ġ= Ġnew Len Ċĉĉĉĉ ĉ num Distance Pairs Ġ+= Ġ 2 Ċĉĉĉ ĉ } Ċĉĉĉ ĉ if Ġ( new Len Ġ>= Ġstart Len ) Ġ{ Ċĉĉĉĉ ĉ normal Match Price Ġ= Ġmatch Price Ġ+ Ċĉĉĉĉĉĉ ĉ Range Encoder . get Price 0 ( Ċĉĉĉĉĉĉĉ ĉ _ is Rep [ state ]. toInt () Ċĉĉĉĉĉĉ ĉ ) Ċĉĉĉĉ ĉ while Ġ( len End Ġ< Ġcur Ġ+ Ġnew Len ) Ċĉĉĉĉĉ ĉ _ opt imum [++ len End ]. price Ġ= Ċĉĉĉĉĉĉĉ ĉ k If inity Price ĊĊĉĉĉĉ ĉ var Ġoff s Ġ= Ġ 0 Ċĉĉĉĉ ĉ while Ġ( start Len Ġ> Ġ_ match Dist ances [ offs ]) Ċĉĉĉĉĉ ĉ offs Ġ+= Ġ 2 ĊĊĉĉĉĉ ĉ var Ġlen Test Ġ= Ġstart Len Ċĉĉĉĉ ĉ while Ġ( true ) Ġ{ Ċĉĉĉĉĉ ĉ val Ġcur Back Ġ= Ġ_ match Dist ances [ offs Ġ+ Ġ 1 ] Ċĉĉĉĉĉ ĉ var Ġcur And Len Price Ġ= Ġnormal Match Price Ġ+ Ġget Pos Len Price ( cur Back , Ġlen Test , Ġpos State ) Ċĉĉĉĉĉ ĉ var Ġopt imum Ġ= Ġ_ opt imum [ cur Ġ+ Ġlen Test ] Ċĉĉĉĉĉ ĉ if Ġ( cur And Len Price Ġ< Ġopt imum . price ) Ġ{ Ċĉĉĉĉĉĉ ĉ opt imum . price Ġ= Ġcur And Len Price Ċĉĉĉĉĉĉ ĉ opt imum . pos Prev Ġ= Ġcur Ċĉĉĉĉĉĉ ĉ opt imum . back Prev Ġ= Ġcur Back Ġ+ Ċĉĉĉĉĉĉĉĉ ĉ Lz ma Base . k Num Rep Dist ances Ċĉĉĉĉĉĉ ĉ opt imum . prev 1 Is Char Ġ= Ġfalse Ċĉĉĉĉĉ ĉ } ĊĊĉĉĉĉĉ ĉ if Ġ( len Test Ġ== Ġ_ match Dist ances [ offs ]) Ġ{ Ċĉĉĉĉĉĉ ĉ if Ġ( len Test Ġ< Ġnum Available Bytes Full ) Ġ{ Ċĉĉĉĉĉĉĉ ĉ val Ġt Ġ= Ġmin ( num Available Bytes Full Ġ- Ġ 1 Ġ- Ġlen Test , Ġ_ num Fast Bytes ) Ċĉĉĉĉĉĉĉ ĉ val Ġlen Test 2 Ġ= Ġ_ match Finder !!. get Match Len ( len Test , Ġcur Back , Ġt ) Ċĉĉĉĉĉĉĉ ĉ if Ġ( len Test 2 Ġ>= Ġ 2 ) Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ var Ġstate 2 Ġ= Ċĉĉĉĉĉĉĉĉĉ ĉ Lz ma Base . state Update Match ( Ċĉĉĉĉĉĉĉĉĉĉ ĉ state Ċĉĉĉĉĉĉĉĉĉ ĉ ) ĊĊĉĉĉĉĉĉĉĉ ĉ var Ġpos State Next Ġ= Ġp pos Ġ+ Ġlen Test Ġand Ġ_ pos State Mask Ċĉĉĉĉĉĉĉĉ ĉ val Ġcur And Len Char Price Ġ= Ġcur And Len Price Ġ+ Ċĉĉĉĉĉĉĉĉĉĉ ĉ Range Encoder . get Price 0 ( Ċĉĉĉĉĉĉĉĉĉĉĉ ĉ _ is Match [( state 2 Ġshl ĠL z ma Base . k Num Pos States Bits Max ) Ġ+ Ġpos State Next ]. toInt () Ċĉĉĉĉĉĉĉĉĉĉ ĉ ) Ġ+ Ċĉĉĉĉĉĉĉĉĉĉ ĉ _ literal Encoder . getSub Coder ( Ċĉĉĉĉĉĉĉĉĉĉĉ ĉ pp os Ġ+ Ġlen Test , Ċĉĉĉĉĉĉĉĉĉĉĉ ĉ _ match Finder !!. getIndex Byte ( len Test Ġ- Ġ 1 Ġ- Ġ 1 ) Ċĉĉĉĉĉĉĉĉĉĉ ĉ ). get Price ( Ċĉĉĉĉĉĉĉĉĉĉĉ ĉ true , Ċĉĉĉĉĉĉĉĉĉĉĉ ĉ _ match Finder !!. getIndex Byte ( len Test Ġ- Ġ( cur Back Ġ+ Ġ 1 ) Ġ- Ġ 1 ), Ċĉĉĉĉĉĉĉĉĉĉĉ ĉ _ match Finder !!. getIndex Byte ( len Test Ġ- Ġ 1 ) Ċĉĉĉĉĉĉĉĉĉĉ ĉ ) Ċĉĉĉĉĉĉĉĉ ĉ state 2 Ġ= Ċĉĉĉĉĉĉĉĉĉĉ ĉ Lz ma Base . state Update Char ( Ċĉĉĉĉĉĉĉĉĉĉĉ ĉ state 2 Ċĉĉĉĉĉĉĉĉĉĉ ĉ ) Ċĉĉĉĉĉĉĉĉ ĉ pos State Next Ġ= Ġp pos Ġ+ Ġlen Test Ġ+ Ġ 1 Ġand Ġ_ pos State Mask Ċĉĉĉĉĉĉĉĉ ĉ val Ġnext Match Price Ġ= Ċĉĉĉĉĉĉĉĉĉ ĉ cur And Len Char Price Ġ+ ĠRange Encoder . get Price 1 ( Ċĉĉĉĉĉĉĉĉĉĉ ĉ _ is Match [( state 2 Ġshl ĠL z ma Base . k Num Pos States Bits Max ) Ġ+ Ġpos State Next ]. toInt () Ċĉĉĉĉĉĉĉĉĉ ĉ ) Ċĉĉĉĉĉĉĉĉ ĉ val Ġnext Rep Match Price Ġ= Ċĉĉĉĉĉĉĉĉĉ ĉ next Match Price Ġ+ ĠRange Encoder . get Price 1 ( Ċĉĉĉĉĉĉĉĉĉĉ ĉ _ is Rep [ state 2 ]. toInt () Ċĉĉĉĉĉĉĉĉĉ ĉ ) ĊĊĉĉĉĉĉĉĉĉ ĉ val Ġoffset Ġ= Ġlen Test Ġ+ Ġ 1 Ġ+ Ġlen Test 2 Ċĉĉĉĉĉĉĉĉ ĉ while Ġ( len End Ġ< Ġcur Ġ+ Ġoffset ) Ċĉĉĉĉĉĉĉĉĉ ĉ _ opt imum [++ len End ]. price Ġ= Ċĉĉĉĉĉĉĉĉĉĉĉ ĉ k If inity Price Ċĉĉĉĉĉĉĉĉ ĉ cur And Len Price Ġ= Ġnext Rep Match Price Ġ+ Ġget Rep Price ( 0 , Ġlen Test 2 , Ġstate 2 , Ġpos State Next ) Ċĉĉĉĉĉĉĉĉ ĉ opt imum Ġ= Ġ_ opt imum [ cur Ġ+ Ġoffset ] Ċĉĉĉĉĉĉĉĉ ĉ if Ġ( cur And Len Price Ġ< Ġopt imum . price ) Ġ{ Ċĉĉĉĉĉĉĉĉĉ ĉ opt imum . price Ġ= Ġcur And Len Price Ċĉĉĉĉĉĉĉĉĉ ĉ opt imum . pos Prev Ġ= Ġcur Ġ+ Ġlen Test Ġ+ Ġ 1 Ċĉĉĉĉĉĉĉĉĉ ĉ opt imum . back Prev Ġ= Ġ 0 Ċĉĉĉĉĉĉĉĉĉ ĉ opt imum . prev 1 Is Char Ġ= Ġtrue Ċĉĉĉĉĉĉĉĉĉ ĉ opt imum . prev 2 Ġ= Ġtrue Ċĉĉĉĉĉĉĉĉĉ ĉ opt imum . pos Prev 2 Ġ= Ġcur Ċĉĉĉĉĉĉĉĉĉ ĉ opt imum . back Prev 2 Ġ= Ġcur Back Ġ+ Ċĉĉĉĉĉĉĉĉĉĉĉ ĉ Lz ma Base . k Num Rep Dist ances Ċĉĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ offs Ġ+= Ġ 2 Ċĉĉĉĉĉĉ ĉ if Ġ( offs Ġ== Ġnum Distance Pairs ) Ċĉĉĉĉĉĉĉ ĉ break Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ len Test ++ Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ // internal Ġfun Ġchange Pair ( small Dist : ĠInt , Ġbig Dist : ĠInt ): ĠBoolean Ġ{ Ċĉ ĉ // ĉ val Ġk D if Ġ= Ġ 7 Ċĉ ĉ // ĉ return Ġsmall Dist Ġ< Ġ 1 Ġshl Ġ 3 2 Ġ- Ġk D if Ġ&& Ġbig Dist Ġ>= Ġsmall Dist Ġshl Ġk D if Ċĉ ĉ //} ĊĊĉ ĉ private Ġfun Ġwrite End Marker ( pos State : ĠInt ) Ġ{ Ċĉĉ ĉ if Ġ(!_ write End Mark ) Ġreturn Ċĉĉ ĉ _ range Encoder . encode (_ is Match , Ġ(_ state Ġshl ĠL z ma Base . k Num Pos States Bits Max ) Ġ+ Ġpos State , Ġ 1 ) Ċĉĉ ĉ _ range Encoder . encode (_ is Rep , Ġ_ state , Ġ 0 ) Ċĉĉ ĉ _ state Ġ= ĠL z ma Base . state Update Match (_ state ) Ċĉĉ ĉ val Ġlen Ġ= ĠL z ma Base . k Match Min Len Ċĉĉ ĉ _ len Encoder . encode (_ range Encoder , Ġlen Ġ- ĠL z ma Base . k Match Min Len , Ġpos State ) Ċĉĉ ĉ val Ġpos Slot Ġ= Ġ( 1 Ġshl ĠL z ma Base . k Num Pos Slot Bits ) Ġ- Ġ 1 Ċĉĉ ĉ val Ġlen To Pos State Ġ= ĠL z ma Base . get Len To Pos State ( len ) Ċĉĉ ĉ _ pos Slot Encoder [ len To Pos State ]. encode (_ range Encoder , Ġpos Slot ) Ċĉĉ ĉ val Ġfooter Bits Ġ= Ġ 3 0 Ċĉĉ ĉ val Ġpos Reduc ed Ġ= Ġ( 1 Ġshl Ġfooter Bits ) Ġ- Ġ 1 Ċĉĉ ĉ _ range Encoder . encode Direct Bits ( pos Reduc ed Ġshr ĠL z ma Base . k Num Align Bits , Ġfooter Bits Ġ- ĠL z ma Base . k Num Align Bits ) Ċĉĉ ĉ _ pos Align Encoder . reverse Encode (_ range Encoder , Ġpos Reduc ed Ġand ĠL z ma Base . k Align Mask ) Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġflush ( now Pos : ĠInt ) Ġ{ Ċĉĉ ĉ release MF Stream () Ċĉĉ ĉ write End Marker ( now Pos Ġand Ġ_ pos State Mask ) Ċĉĉ ĉ _ range Encoder . flush Data () Ċĉĉ ĉ _ range Encoder . flush Stream () Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġcode One Block ( in Size : ĠLong Array , Ġout Size : ĠLong Array , Ġfinished : ĠBoolean Array ) Ġ{ Ċĉĉ ĉ in Size [ 0 ] Ġ= Ġ 0 Ċĉĉ ĉ out Size [ 0 ] Ġ= Ġ 0 Ċĉĉ ĉ finished [ 0 ] Ġ= Ġtrue ĊĊĉĉ ĉ if Ġ(_ in Stream Ġ!= Ġnull ) Ġ{ Ċĉĉĉ ĉ _ match Finder !!. set Stream (_ in Stream !! ) Ċĉĉĉ ĉ _ match Finder !!. init () Ċĉĉĉ ĉ _ need Release MF Stream Ġ= Ġtrue Ċĉĉĉ ĉ _ in Stream Ġ= Ġnull Ċĉĉ ĉ } ĊĊĉĉ ĉ if Ġ(_ finished ) Ċĉĉĉ ĉ return Ċĉĉ ĉ _ finished Ġ= Ġtrue ĊĊĊĉĉ ĉ val Ġprogress Pos Value Prev Ġ= Ġnow Pos 6 4 Ċĉĉ ĉ if Ġ( now Pos 6 4 Ġ== Ġ 0 L ) Ġ{ Ċĉĉĉ ĉ if Ġ(_ match Finder !!. getNum Available Bytes () Ġ== Ġ 0 ) Ġ{ Ċĉĉĉĉ ĉ flush ( now Pos 6 4 . toInt ()) Ċĉĉĉĉ ĉ return Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ read Match Dist ances () Ċĉĉĉ ĉ val Ġpos State Ġ= Ġnow Pos 6 4 . toInt () Ġand Ġ_ pos State Mask Ċĉĉĉ ĉ _ range Encoder . encode (_ is Match , Ġ(_ state Ġshl ĠL z ma Base . k Num Pos States Bits Max ) Ġ+ Ġpos State , Ġ 0 ) Ċĉĉĉ ĉ _ state Ġ= ĠL z ma Base . state Update Char (_ state ) Ċĉĉĉ ĉ val Ġcur Byte Ġ= Ġ_ match Finder !!. getIndex Byte ( 0 Ġ- Ġ_ additional Offset ) Ċĉĉĉ ĉ _ literal Encoder . getSub Coder ( now Pos 6 4 . toInt (), Ġ_ previous Byte ). encode (_ range Encoder , Ġcur Byte ) Ċĉĉĉ ĉ _ previous Byte Ġ= Ġcur Byte Ċĉĉĉ ĉ _ additional Offset -- Ċĉĉĉ ĉ now Pos 6 4 ++ Ċĉĉ ĉ } Ċĉĉ ĉ if Ġ(_ match Finder !!. getNum Available Bytes () Ġ== Ġ 0 ) Ġ{ Ċĉĉĉ ĉ flush ( now Pos 6 4 . toInt ()) Ċĉĉĉ ĉ return Ċĉĉ ĉ } Ċĉĉ ĉ while Ġ( true ) Ġ{ ĊĊĉĉĉ ĉ val Ġlen Ġ= Ġget Opt imum ( now Pos 6 4 . toInt ()) Ċĉĉĉ ĉ var Ġpos Ġ= Ġback Res Ċĉĉĉ ĉ val Ġpos State Ġ= Ġnow Pos 6 4 . toInt () Ġand Ġ_ pos State Mask Ċĉĉĉ ĉ val Ġcomplex State Ġ= Ġ(_ state Ġshl ĠL z ma Base . k Num Pos States Bits Max ) Ġ+ Ġpos State Ċĉĉĉ ĉ if Ġ( len Ġ== Ġ 1 Ġ&& Ġpos Ġ== Ġ- 1 ) Ġ{ Ċĉĉĉĉ ĉ _ range Encoder . encode (_ is Match , Ġcomplex State , Ġ 0 ) Ċĉĉĉĉ ĉ val Ġcur Byte Ġ= Ġ_ match Finder !!. getIndex Byte ( 0 Ġ- Ġ_ additional Offset ) Ċĉĉĉĉ ĉ val Ġsub Coder Ġ= Ġ_ literal Encoder . getSub Coder ( now Pos 6 4 . toInt (), Ġ_ previous Byte ) Ċĉĉĉĉ ĉ if Ġ(! Lz ma Base . state Is Char State (_ state )) Ġ{ Ċĉĉĉĉĉ ĉ val Ġmatch Byte Ġ= Ġ_ match Finder !!. getIndex Byte ( 0 Ġ- Ġ_ rep Dist ances [ 0 ] Ġ- Ġ 1 Ġ- Ġ_ additional Offset ) Ċĉĉĉĉĉ ĉ sub Coder . encode Matched (_ range Encoder , Ġmatch Byte , Ġcur Byte ) Ċĉĉĉĉ ĉ } Ġelse Ċĉĉĉĉĉ ĉ sub Coder . encode (_ range Encoder , Ġcur Byte ) Ċĉĉĉĉ ĉ _ previous Byte Ġ= Ġcur Byte Ċĉĉĉĉ ĉ _ state Ġ= ĠL z ma Base . state Update Char (_ state ) Ċĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉ ĉ _ range Encoder . encode (_ is Match , Ġcomplex State , Ġ 1 ) Ċĉĉĉĉ ĉ if Ġ( pos Ġ< ĠL z ma Base . k Num Rep Dist ances ) Ġ{ Ċĉĉĉĉĉ ĉ _ range Encoder . encode (_ is Rep , Ġ_ state , Ġ 1 ) Ċĉĉĉĉĉ ĉ if Ġ( pos Ġ== Ġ 0 ) Ġ{ Ċĉĉĉĉĉĉ ĉ _ range Encoder . encode (_ is Rep G 0 , Ġ_ state , Ġ 0 ) Ċĉĉĉĉĉĉ ĉ if Ġ( len Ġ== Ġ 1 ) Ċĉĉĉĉĉĉĉ ĉ _ range Encoder . encode (_ is Rep 0 Long , Ġcomplex State , Ġ 0 ) Ċĉĉĉĉĉĉ ĉ else Ċĉĉĉĉĉĉĉ ĉ _ range Encoder . encode (_ is Rep 0 Long , Ġcomplex State , Ġ 1 ) Ċĉĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉĉ ĉ _ range Encoder . encode (_ is Rep G 0 , Ġ_ state , Ġ 1 ) Ċĉĉĉĉĉĉ ĉ if Ġ( pos Ġ== Ġ 1 ) Ċĉĉĉĉĉĉĉ ĉ _ range Encoder . encode (_ is Rep G 1 , Ġ_ state , Ġ 0 ) Ċĉĉĉĉĉĉ ĉ else Ġ{ Ċĉĉĉĉĉĉĉ ĉ _ range Encoder . encode (_ is Rep G 1 , Ġ_ state , Ġ 1 ) Ċĉĉĉĉĉĉĉ ĉ _ range Encoder . encode (_ is Rep G 2 , Ġ_ state , Ġpos Ġ- Ġ 2 ) Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ _ state Ġ= Ġif Ġ( len Ġ== Ġ 1 ) Ġ{ Ċĉĉĉĉĉĉ ĉ Lz ma Base . state Update Short Rep (_ state ) Ċĉĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉĉ ĉ _ rep Match Len Encoder . encode (_ range Encoder , Ġlen Ġ- ĠL z ma Base . k Match Min Len , Ġpos State ) Ċĉĉĉĉĉĉ ĉ Lz ma Base . state Update Rep (_ state ) Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ val Ġdistance Ġ= Ġ_ rep Dist ances [ pos ] Ċĉĉĉĉĉ ĉ if Ġ( pos Ġ!= Ġ 0 ) Ġ{ Ċĉĉĉĉĉĉ ĉ for Ġ( i Ġin Ġpos Ġdown To Ġ 1 ) Ċĉĉĉĉĉĉĉ ĉ _ rep Dist ances [ i ] Ġ= Ġ_ rep Dist ances [ i Ġ- Ġ 1 ] Ċĉĉĉĉĉĉ ĉ _ rep Dist ances [ 0 ] Ġ= Ġdistance Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉ ĉ _ range Encoder . encode (_ is Rep , Ġ_ state , Ġ 0 ) Ċĉĉĉĉĉ ĉ _ state Ġ= ĠL z ma Base . state Update Match (_ state ) Ċĉĉĉĉĉ ĉ _ len Encoder . encode (_ range Encoder , Ġlen Ġ- ĠL z ma Base . k Match Min Len , Ġpos State ) Ċĉĉĉĉĉ ĉ pos Ġ-= ĠL z ma Base . k Num Rep Dist ances Ċĉĉĉĉĉ ĉ val Ġpos Slot Ġ= Ċĉĉĉĉĉĉ ĉ get Pos Slot ( pos ) Ċĉĉĉĉĉ ĉ val Ġlen To Pos State Ġ= Ċĉĉĉĉĉĉ ĉ Lz ma Base . get Len To Pos State ( len ) Ċĉĉĉĉĉ ĉ _ pos Slot Encoder [ len To Pos State ]. encode (_ range Encoder , Ġpos Slot ) ĊĊĉĉĉĉĉ ĉ if Ġ( pos Slot Ġ>= ĠL z ma Base . k Start Pos Model Index ) Ġ{ Ċĉĉĉĉĉĉ ĉ val Ġfooter Bits Ġ= Ġ( pos Slot Ġshr Ġ 1 ) Ġ- Ġ 1 Ċĉĉĉĉĉĉ ĉ val Ġbase Val Ġ= Ġ 2 Ġor Ġ( pos Slot Ġand Ġ 1 ) Ġshl Ġfooter Bits Ċĉĉĉĉĉĉ ĉ val Ġpos Reduc ed Ġ= Ġpos Ġ- Ġbase Val ĊĊĉĉĉĉĉĉ ĉ if Ġ( pos Slot Ġ< ĠL z ma Base . k End Pos Model Index ) Ċĉĉĉĉĉĉĉ ĉ Bit Tree Encoder . reverse Encode ( Ċĉĉĉĉĉĉĉĉ ĉ _ pos En coders , Ċĉĉĉĉĉĉĉĉ ĉ base Val Ġ- Ġpos Slot Ġ- Ġ 1 , Ġ_ range Encoder , Ġfooter Bits , Ġpos Reduc ed Ċĉĉĉĉĉĉĉ ĉ ) Ċĉĉĉĉĉĉ ĉ else Ġ{ Ċĉĉĉĉĉĉĉ ĉ _ range Encoder . encode Direct Bits ( Ċĉĉĉĉĉĉĉĉ ĉ pos Reduc ed Ġshr ĠL z ma Base . k Num Align Bits , Ċĉĉĉĉĉĉĉĉ ĉ footer Bits Ġ- ĠL z ma Base . k Num Align Bits Ċĉĉĉĉĉĉĉ ĉ ) Ċĉĉĉĉĉĉĉ ĉ _ pos Align Encoder . reverse Encode (_ range Encoder , Ġpos Reduc ed Ġand ĠL z ma Base . k Align Mask ) Ċĉĉĉĉĉĉĉ ĉ _ align Price Count ++ Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ val Ġdistance Ġ= Ġpos Ċĉĉĉĉĉ ĉ for Ġ( i Ġin ĠL z ma Base . k Num Rep Dist ances Ġ- Ġ 1 Ġdown To Ġ 1 ) Ċĉĉĉĉĉĉ ĉ _ rep Dist ances [ i ] Ġ= Ġ_ rep Dist ances [ i Ġ- Ġ 1 ] Ċĉĉĉĉĉ ĉ _ rep Dist ances [ 0 ] Ġ= Ġdistance Ċĉĉĉĉĉ ĉ _ match Price Count ++ Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ _ previous Byte Ġ= Ġ_ match Finder !!. getIndex Byte ( len Ġ- Ġ 1 Ġ- Ġ_ additional Offset ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ _ additional Offset Ġ-= Ġlen Ċĉĉĉ ĉ now Pos 6 4 Ġ+= Ġlen . to Long () Ċĉĉĉ ĉ if Ġ(_ additional Offset Ġ== Ġ 0 ) Ġ{ Ċĉĉĉĉ ĉ // Ġif Ġ(!_ fast Mode ) Ċĉĉĉĉ ĉ if Ġ(_ match Price Count Ġ>= Ġ 1 Ġshl Ġ 7 ) Ċĉĉĉĉĉ ĉ fill Dist ances Prices () Ċĉĉĉĉ ĉ if Ġ(_ align Price Count Ġ>= ĠL z ma Base . k Align Table Size ) Ċĉĉĉĉĉ ĉ fill Align Prices () Ċĉĉĉĉ ĉ in Size [ 0 ] Ġ= Ġnow Pos 6 4 Ċĉĉĉĉ ĉ out Size [ 0 ] Ġ= Ġ_ range Encoder . get Processed Size Add () Ċĉĉĉĉ ĉ if Ġ(_ match Finder !!. getNum Available Bytes () Ġ== Ġ 0 ) Ġ{ Ċĉĉĉĉĉ ĉ flush ( now Pos 6 4 . toInt ()) Ċĉĉĉĉĉ ĉ return Ċĉĉĉĉ ĉ } ĊĊĉĉĉĉ ĉ if Ġ( now Pos 6 4 Ġ- Ġprogress Pos Value Prev Ġ>= Ġ 1 Ġshl Ġ 1 2 ) Ġ{ Ċĉĉĉĉĉ ĉ _ finished Ġ= Ġfalse Ċĉĉĉĉĉ ĉ finished [ 0 ] Ġ= Ġfalse Ċĉĉĉĉĉ ĉ return Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġrelease MF Stream () Ġ{ Ċĉĉ ĉ if Ġ(_ match Finder Ġ!= Ġnull Ġ&& Ġ_ need Release MF Stream ) Ġ{ Ċĉĉĉ ĉ _ match Finder !!. release Stream () Ċĉĉĉ ĉ _ need Release MF Stream Ġ= Ġfalse Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġset Out Stream ( out Stream : ĠSync OutputStream ) Ġ{ Ċĉĉ ĉ _ range Encoder . set Stream ( out Stream ) Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġrelease Out Stream () Ġ{ Ċĉĉ ĉ _ range Encoder . release Stream () Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġrelease Streams () Ġ{ Ċĉĉ ĉ release MF Stream () Ċĉĉ ĉ release Out Stream () Ċĉ ĉ } ĊĊĉ ĉ @ Suppress (" UNUSED _ PARAMETER ") Ċĉ ĉ private Ġfun Ġset Streams ( in Stream : ĠSync InputStream , Ġout Stream : ĠSync OutputStream , Ġin Size : ĠLong , Ġout Size : ĠLong ) Ġ{ Ċĉĉ ĉ _ in Stream Ġ= Ġin Stream Ċĉĉ ĉ _ finished Ġ= Ġfalse Ċĉĉ ĉ create () Ċĉĉ ĉ set Out Stream ( out Stream ) Ċĉĉ ĉ init () ĊĊĉĉ ĉ // Ġif Ġ(!_ fast Mode ) Ċĉĉ ĉ run Ġ{ Ċĉĉĉ ĉ fill Dist ances Prices () Ċĉĉĉ ĉ fill Align Prices () Ċĉĉ ĉ } ĊĊĉĉ ĉ _ len Encoder . set Table Size (_ num Fast Bytes Ġ+ Ġ 1 Ġ- ĠL z ma Base . k Match Min Len ) Ċĉĉ ĉ _ len Encoder . update Tables ( 1 Ġshl Ġ_ pos State Bits ) Ċĉĉ ĉ _ rep Match Len Encoder . set Table Size (_ num Fast Bytes Ġ+ Ġ 1 Ġ- ĠL z ma Base . k Match Min Len ) Ċĉĉ ĉ _ rep Match Len Encoder . update Tables ( 1 Ġshl Ġ_ pos State Bits ) ĊĊĉĉ ĉ now Pos 6 4 Ġ= Ġ 0 Ċĉ ĉ } ĊĊĉ ĉ fun Ġcode ( in Stream : ĠSync InputStream , Ġout Stream : ĠSync OutputStream , Ġin Size : ĠLong , Ġout Size : ĠLong , Ġprogress : ĠI Code Progress ?) Ġ{ Ċĉĉ ĉ _ need Release MF Stream Ġ= Ġfalse Ċĉĉ ĉ try Ġ{ Ċĉĉĉ ĉ set Streams ( in Stream , Ġout Stream , Ġin Size , Ġout Size ) Ċĉĉĉ ĉ while Ġ( true ) Ġ{ Ċĉĉĉĉ ĉ code One Block ( processed In Size , Ġprocessed Out Size , Ġfinished ) Ċĉĉĉĉ ĉ if Ġ( finished [ 0 ]) Ġreturn Ċĉĉĉĉ ĉ progress ?. set Progress ( processed In Size [ 0 ], Ġprocessed Out Size [ 0 ]) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ġfinally Ġ{ Ċĉĉĉ ĉ release Streams () Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ fun Ġwrite Coder Properties ( out Stream : ĠSync OutputStream ) Ġ{ Ċĉĉ ĉ properties [ 0 ] Ġ= Ġ((_ pos State Bits Ġ* Ġ 5 Ġ+ Ġ_ num Literal Pos State Bits ) Ġ* Ġ 9 Ġ+ Ġ_ num Literal Context Bits ). to Byte () Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 .. 3 ) Ċĉĉĉ ĉ properties [ 1 Ġ+ Ġi ] Ġ= Ġ(_ dictionary Size Ġshr Ġ 8 Ġ* Ġi ). to Byte () Ċĉĉ ĉ out Stream . write ( Ċĉĉĉ ĉ properties , Ġ 0 , Ċĉĉĉ ĉ k Prop Size Ċĉĉ ĉ ) Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġfill Dist ances Prices () Ġ{ Ċĉĉ ĉ for Ġ( i Ġin ĠL z ma Base . k Start Pos Model Index Ġuntil ĠL z ma Base . k Num Full Dist ances ) Ġ{ Ċĉĉĉ ĉ val Ġpos Slot Ġ= Ġget Pos Slot ( i ) Ċĉĉĉ ĉ val Ġfooter Bits Ġ= Ġ( pos Slot Ġshr Ġ 1 ) Ġ- Ġ 1 Ċĉĉĉ ĉ val Ġbase Val Ġ= Ġ 2 Ġor Ġ( pos Slot Ġand Ġ 1 ) Ġshl Ġfooter Bits Ċĉĉĉ ĉ temp Prices [ i ] Ġ= ĠBit Tree Encoder . reverse Get Price (_ pos En coders , Ġbase Val Ġ- Ġpos Slot Ġ- Ġ 1 , Ġfooter Bits , Ġi Ġ- Ġbase Val ) Ċĉĉ ĉ } ĊĊĉĉ ĉ for Ġ( len To Pos State Ġin Ġ 0 Ġuntil ĠL z ma Base . k Num Len To Pos States ) Ġ{ Ċĉĉĉ ĉ val Ġencoder Ġ= Ġ_ pos Slot Encoder [ len To Pos State ] ĊĊĉĉĉ ĉ val Ġst Ġ= Ġlen To Pos State Ġshl ĠL z ma Base . k Num Pos Slot Bits Ċĉĉĉ ĉ var Ġpos Slot Ġ= Ġ 0 Ċĉĉĉ ĉ while Ġ( pos Slot Ġ< Ġ_ dist Table Size ) Ġ{ Ċĉĉĉĉ ĉ _ pos Slot Prices [ st Ġ+ Ġpos Slot ] Ġ= Ġencoder . get Price ( pos Slot ) Ċĉĉĉĉ ĉ pos Slot ++ Ċĉĉĉ ĉ } Ċĉĉĉ ĉ pos Slot Ġ= ĠL z ma Base . k End Pos Model Index Ċĉĉĉ ĉ while Ġ( pos Slot Ġ< Ġ_ dist Table Size ) Ġ{ Ċĉĉĉĉ ĉ _ pos Slot Prices [ st Ġ+ Ġpos Slot ] Ġ+= Ġ( pos Slot Ġshr Ġ 1 ) Ġ- Ġ 1 Ġ- ĠL z ma Base . k Num Align Bits Ġshl ĠRange Encoder . k Num Bit Price Shift Bits Ċĉĉĉĉ ĉ pos Slot ++ Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ val Ġst 2 Ġ= Ġlen To Pos State Ġ* ĠL z ma Base . k Num Full Dist ances Ċĉĉĉ ĉ var Ġi Ġ= Ġ 0 Ċĉĉĉ ĉ while Ġ( i Ġ< ĠL z ma Base . k Start Pos Model Index ) Ġ{ Ċĉĉĉĉ ĉ _ distances Prices [ st 2 Ġ+ Ġi ] Ġ= Ġ_ pos Slot Prices [ st Ġ+ Ġi ] Ċĉĉĉĉ ĉ i ++ Ċĉĉĉ ĉ } Ċĉĉĉ ĉ while Ġ( i Ġ< ĠL z ma Base . k Num Full Dist ances ) Ġ{ Ċĉĉĉĉ ĉ _ distances Prices [ st 2 Ġ+ Ġi ] Ġ= Ġ_ pos Slot Prices [ st Ġ+ Ġget Pos Slot ( Ċĉĉĉĉĉ ĉ i Ċĉĉĉĉ ĉ )] Ġ+ Ġtemp Prices [ i ] Ċĉĉĉĉ ĉ i ++ Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ _ match Price Count Ġ= Ġ 0 Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġfill Align Prices () Ġ{ Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil ĠL z ma Base . k Align Table Size ) Ċĉĉĉ ĉ _ align Prices [ i ] Ġ= Ġ_ pos Align Encoder . reverse Get Price ( i ) Ċĉĉ ĉ _ align Price Count Ġ= Ġ 0 Ċĉ ĉ } ĊĊĊĉ ĉ @ Suppress (" UNUSED _ PARAMETER ") Ċĉ ĉ fun Ġset Algorithm ( algorithm : ĠInt ): ĠBoolean Ġ{ Ċĉĉ ĉ /* ĊĠĠĠĠĠĠĠ Ġ_ fast Mode Ġ= Ġ( algorithm Ġ== Ġ 0 ); ĊĠĠĠĠĠĠĠ Ġ_ max Mode Ġ= Ġ( algorithm Ġ>= Ġ 2 ); ĊĠĠĠĠĠĠĠ Ġ*/ Ċĉĉ ĉ return Ġtrue Ċĉ ĉ } ĊĊĉ ĉ fun Ġset Dictionary Size ( dictionary Size : ĠInt ): ĠBoolean Ġ{ Ċĉĉ ĉ val Ġk Dic Log Size Max Compress Ġ= Ġ 2 9 Ċĉĉ ĉ val Ġcond 1 Ġ= Ġdictionary Size Ġ< Ġ( 1 Ġshl ĠL z ma Base . k Dic Log Size Min ) Ċĉĉ ĉ val Ġcond 2 Ġ= Ġdictionary Size Ġ> Ġ( 1 Ġshl Ġk Dic Log Size Max Compress ) Ċĉĉ ĉ if Ġ( cond 1 Ġ|| Ġcond 2 ) Ċĉĉĉ ĉ return Ġfalse Ċĉĉ ĉ _ dictionary Size Ġ= Ġdictionary Size Ċĉĉ ĉ var Ġdic Log Size Ġ= Ġ 0 Ċĉĉ ĉ while Ġ( dictionary Size Ġ> Ġ 1 Ġshl Ġdic Log Size ) Ġ{ Ċĉĉĉ ĉ dic Log Size ++ Ċĉĉ ĉ } Ċĉĉ ĉ _ dist Table Size Ġ= Ġdic Log Size Ġ* Ġ 2 Ċĉĉ ĉ return Ġtrue Ċĉ ĉ } ĊĊĉ ĉ fun Ġset Num Fast Bytes ( num Fast Bytes : ĠInt ): ĠBoolean Ġ{ Ċĉĉ ĉ if Ġ( num Fast Bytes Ġ< Ġ 5 Ġ|| Ġnum Fast Bytes Ġ> ĠL z ma Base . k Match Max Len ) Ċĉĉĉ ĉ return Ġfalse Ċĉĉ ĉ _ num Fast Bytes Ġ= Ġnum Fast Bytes Ċĉĉ ĉ return Ġtrue Ċĉ ĉ } ĊĊĉ ĉ fun Ġset Match Finder ( match Finder Index : ĠInt ): ĠBoolean Ġ{ Ċĉĉ ĉ if Ġ( match Finder Index Ġ< Ġ 0 Ġ|| Ġmatch Finder Index Ġ> Ġ 2 ) Ċĉĉĉ ĉ return Ġfalse Ċĉĉ ĉ val Ġmatch Finder Index Prev Ġ= Ġ_ match Finder Type Ċĉĉ ĉ _ match Finder Type Ġ= Ġmatch Finder Index Ċĉĉ ĉ if Ġ(_ match Finder Ġ!= Ġnull Ġ&& Ġmatch Finder Index Prev Ġ!= Ġ_ match Finder Type ) Ġ{ Ċĉĉĉ ĉ _ dictionary Size Prev Ġ= Ġ- 1 Ċĉĉĉ ĉ _ match Finder Ġ= Ġnull Ċĉĉ ĉ } Ċĉĉ ĉ return Ġtrue Ċĉ ĉ } ĊĊĉ ĉ fun Ġset Lc Lp Pb ( lc : ĠInt , Ġlp : ĠInt , Ġpb : ĠInt ): ĠBoolean Ġ{ Ċĉĉ ĉ if Ġ( lp Ġ< Ġ 0 Ġ|| Ġlp Ġ> ĠL z ma Base . k Num Lit Pos States Bits Encoding Max Ġ|| Ċĉĉĉ ĉ lc Ġ< Ġ 0 Ġ|| Ġlc Ġ> ĠL z ma Base . k Num Lit Context Bits Max Ġ|| Ċĉĉĉ ĉ pb Ġ< Ġ 0 Ġ|| Ġpb Ġ> ĠL z ma Base . k Num Pos States Bits Encoding Max Ċĉĉ ĉ ) Ċĉĉĉ ĉ return Ġfalse Ċĉĉ ĉ _ num Literal Pos State Bits Ġ= Ġlp Ċĉĉ ĉ _ num Literal Context Bits Ġ= Ġlc Ċĉĉ ĉ _ pos State Bits Ġ= Ġpb Ċĉĉ ĉ _ pos State Mask Ġ= Ġ( 1 Ġshl Ġ_ pos State Bits ) Ġ- Ġ 1 Ċĉĉ ĉ return Ġtrue Ċĉ ĉ } ĊĊĉ ĉ fun Ġset End Marker Mode ( end Marker Mode : ĠBoolean ) Ġ{ Ċĉĉ ĉ _ write End Mark Ġ= Ġend Marker Mode Ċĉ ĉ } ĊĊĉ ĉ comp anion Ġobject Ġ{ Ċĉĉ ĉ const Ġval ĠE Match Finder Type BT 2 Ġ= Ġ 0 Ċĉĉ ĉ const Ġval ĠE Match Finder Type BT 4 Ġ= Ġ 1 ĊĊĉĉ ĉ internal Ġconst Ġval Ġk If inity Price Ġ= Ġ 0 xFFFF FFF ĊĊĉĉ ĉ private Ġvar Ġg _ Fast Pos Ġ= ĠByteArray ( 1 Ġshl Ġ 1 1 ) ĊĊĉĉ ĉ init Ġ{ Ċĉĉĉ ĉ val Ġk Fast Slots Ġ= Ġ 2 2 Ċĉĉĉ ĉ var Ġc Ġ= Ġ 2 Ċĉĉĉ ĉ g _ Fast Pos [ 0 ] Ġ= Ġ 0 Ċĉĉĉ ĉ g _ Fast Pos [ 1 ] Ġ= Ġ 1 Ċĉĉĉ ĉ for Ġ( slot Fast Ġin Ġ 2 Ġuntil Ġk Fast Slots ) Ġ{ Ċĉĉĉĉ ĉ val Ġk Ġ= Ġ 1 Ġshl Ġ( slot Fast Ġshr Ġ 1 ) Ġ- Ġ 1 Ċĉĉĉĉ ĉ var Ġj Ġ= Ġ 0 Ċĉĉĉĉ ĉ while Ġ( j Ġ< Ġk ) Ġ{ Ċĉĉĉĉĉ ĉ g _ Fast Pos [ c ] Ġ= Ġslot Fast . to Byte () Ċĉĉĉĉĉ ĉ j ++ Ċĉĉĉĉĉ ĉ c ++ Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĊĉĉ ĉ internal Ġfun Ġget Pos Slot ( pos : ĠInt ): ĠInt Ġ{ Ċĉĉĉ ĉ if Ġ( pos Ġ< Ġ 1 Ġshl Ġ 1 1 ) Ċĉĉĉĉ ĉ return Ġg _ Fast Pos [ pos ]. toInt () Ċĉĉĉ ĉ return Ġif Ġ( pos Ġ< Ġ 1 Ġshl Ġ 2 1 ) Ġg _ Fast Pos [ pos Ġshr Ġ 1 0 ] Ġ+ Ġ 2 0 Ġelse Ġg _ Fast Pos [ pos Ġshr Ġ 2 0 ] Ġ+ Ġ 4 0 Ċĉĉ ĉ } ĊĊĉĉ ĉ internal Ġfun Ġget Pos Slot 2 ( pos : ĠInt ): ĠInt Ġ{ Ċĉĉĉ ĉ if Ġ( pos Ġ< Ġ 1 Ġshl Ġ 1 7 ) Ċĉĉĉĉ ĉ return Ġg _ Fast Pos [ pos Ġshr Ġ 6 ] Ġ+ Ġ 1 2 Ċĉĉĉ ĉ return Ġif Ġ( pos Ġ< Ġ 1 Ġshl Ġ 2 7 ) Ġg _ Fast Pos [ pos Ġshr Ġ 1 6 ] Ġ+ Ġ 3 2 Ġelse Ġg _ Fast Pos [ pos Ġshr Ġ 2 6 ] Ġ+ Ġ 5 2 Ċĉĉ ĉ } ĊĊĉĉ ĉ internal Ġconst Ġval Ġk Default Dictionary Log Size Ġ= Ġ 2 2 Ċĉĉ ĉ internal Ġconst Ġval Ġk Num Fast Bytes Default Ġ= Ġ 0 x 2 0 ĊĊĉĉ ĉ // const Ġval Ġk Num Len Spec Symbols Ġ= ĠL z ma Base . k Num Low Len Symbols Ġ+ ĠL z ma Base . k Num Mid Len Symbols ĊĊĉĉ ĉ internal Ġconst Ġval Ġk Num Opts Ġ= Ġ 1 Ġshl Ġ 1 2 ĊĊĉĉ ĉ const Ġval Ġk Prop Size Ġ= Ġ 5 Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ class ĠL z Bin Tree Ġ: ĠL z In Window () Ġ{ Ċĉ ĉ private Ġvar Ġ_ cyc lic Buffer Pos : ĠInt Ġ= Ġ 0 Ċĉ ĉ private Ġvar Ġ_ cyc lic BufferSize Ġ= Ġ 0 Ċĉ ĉ private Ġvar Ġ_ match Max Len : ĠInt Ġ= Ġ 0 ĊĊĉ ĉ private Ġlateinit Ġvar Ġ_ son : ĠInt Array Ċĉ ĉ private Ġlateinit Ġvar Ġ_ hash : ĠInt Array ĊĊĉ ĉ private Ġvar Ġ_ cut Value Ġ= Ġ 0 xFF Ċĉ ĉ private Ġvar Ġ_ hash Mask : ĠInt Ġ= Ġ 0 Ċĉ ĉ private Ġvar Ġ_ hash Size Sum Ġ= Ġ 0 ĊĊĉ ĉ private Ġvar ĠHASH _ ARRAY Ġ= Ġtrue ĊĊĉ ĉ private Ġvar Ġk Num Hash Direct Bytes Ġ= Ġ 0 Ċĉ ĉ private Ġvar Ġk Min Match Check Ġ= Ġ 4 Ċĉ ĉ private Ġvar Ġk Fix Hash Size Ġ= Ġk Hash 2 Size Ġ+ Ġk Hash 3 Size ĊĊĉ ĉ fun Ġset Type ( num Hash Bytes : ĠInt ) Ġ{ Ċĉĉ ĉ HASH _ ARRAY Ġ= Ġnum Hash Bytes Ġ> Ġ 2 Ċĉĉ ĉ if Ġ( HASH _ ARRAY ) Ġ{ Ċĉĉĉ ĉ k Num Hash Direct Bytes Ġ= Ġ 0 Ċĉĉĉ ĉ k Min Match Check Ġ= Ġ 4 Ċĉĉĉ ĉ k Fix Hash Size Ġ= Ġk Hash 2 Size Ġ+ Ċĉĉĉĉĉ ĉ k Hash 3 Size Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ k Num Hash Direct Bytes Ġ= Ġ 2 Ċĉĉĉ ĉ k Min Match Check Ġ= Ġ 2 Ġ+ Ġ 1 Ċĉĉĉ ĉ k Fix Hash Size Ġ= Ġ 0 Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĊĉ ĉ override Ġfun Ġinit () Ġ{ Ċĉĉ ĉ super . init () Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġ_ hash Size Sum ) Ċĉĉĉ ĉ _ hash [ i ] Ġ= Ġk Empty Hash Value Ċĉĉ ĉ _ cyc lic Buffer Pos Ġ= Ġ 0 Ċĉĉ ĉ reduce Offsets (- 1 ) Ċĉ ĉ } ĊĊĉ ĉ override Ġfun Ġmove Pos () Ġ{ Ċĉĉ ĉ if Ġ(++ _ cyc lic Buffer Pos Ġ>= Ġ_ cyc lic BufferSize ) Ċĉĉĉ ĉ _ cyc lic Buffer Pos Ġ= Ġ 0 Ċĉĉ ĉ super . move Pos () Ċĉĉ ĉ if Ġ(_ pos Ġ== Ġk Max Val For Normalize ) Ċĉĉĉ ĉ normalize () Ċĉ ĉ } ĊĊĊĉ ĉ fun Ġcreate ( history Size : ĠInt , Ġkeep Add Buffer Before : ĠInt , Ġmatch Max Len : ĠInt , Ġkeep Add Buffer After : ĠInt ): ĠBoolean Ġ{ Ċĉĉ ĉ if Ġ( history Size Ġ> Ġk Max Val For Normalize Ġ- Ġ 2 5 6 ) Ġreturn Ġfalse Ċĉĉ ĉ _ cut Value Ġ= Ġ 1 6 Ġ+ Ġ( match Max Len Ġshr Ġ 1 ) Ċĉĉ ĉ val Ġwindow Reser v Size Ġ= Ġ( history Size Ġ+ Ġkeep Add Buffer Before Ġ+ Ġmatch Max Len Ġ+ Ġkeep Add Buffer After ) Ġ/ Ġ 2 Ġ+ Ġ 2 5 6 Ċĉĉ ĉ super . create ( history Size Ġ+ Ġkeep Add Buffer Before , Ġmatch Max Len Ġ+ Ġkeep Add Buffer After , Ġwindow Reser v Size ) Ċĉĉ ĉ _ match Max Len Ġ= Ġmatch Max Len Ċĉĉ ĉ val Ġcy clic BufferSize Ġ= Ġhistory Size Ġ+ Ġ 1 Ċĉĉ ĉ if Ġ(_ cyc lic BufferSize Ġ!= Ġcy clic BufferSize ) Ġ_ cyc lic BufferSize Ġ= Ġcy clic BufferSize Ċĉĉ ĉ _ son Ġ= ĠInt Array (_ cyc lic BufferSize Ġ* Ġ 2 ) Ċĉĉ ĉ var Ġhs Ġ= Ġk BT 2 Hash Size Ċĉĉ ĉ if Ġ( HASH _ ARRAY ) Ġ{ Ċĉĉĉ ĉ hs Ġ= Ġhistory Size Ġ- Ġ 1 Ċĉĉĉ ĉ hs Ġ= Ġhs Ġor Ġ( hs Ġshr Ġ 1 ) Ċĉĉĉ ĉ hs Ġ= Ġhs Ġor Ġ( hs Ġshr Ġ 2 ) Ċĉĉĉ ĉ hs Ġ= Ġhs Ġor Ġ( hs Ġshr Ġ 4 ) Ċĉĉĉ ĉ hs Ġ= Ġhs Ġor Ġ( hs Ġshr Ġ 8 ) Ċĉĉĉ ĉ hs Ġ= Ġhs Ġshr Ġ 1 Ċĉĉĉ ĉ hs Ġ= Ġhs Ġor Ġ 0 xFFFF Ċĉĉĉ ĉ if Ġ( hs Ġ> Ġ 1 Ġshl Ġ 2 4 ) Ġhs Ġ= Ġhs Ġshr Ġ 1 Ċĉĉĉ ĉ _ hash Mask Ġ= Ġhs Ċĉĉĉ ĉ hs ++ Ċĉĉĉ ĉ hs Ġ+= Ġk Fix Hash Size Ċĉĉ ĉ } Ċĉĉ ĉ if Ġ( hs Ġ!= Ġ_ hash Size Sum ) Ġ{ Ċĉĉĉ ĉ _ hash Size Sum Ġ= Ġhs Ċĉĉĉ ĉ _ hash Ġ= ĠInt Array (_ hash Size Sum ) Ċĉĉ ĉ } Ċĉĉ ĉ return Ġtrue Ċĉ ĉ } ĊĊĉ ĉ fun Ġget Matches ( distances : ĠInt Array ): ĠInt Ġ{ Ċĉĉ ĉ val Ġlen Limit : ĠInt Ċĉĉ ĉ if Ġ(_ pos Ġ+ Ġ_ match Max Len Ġ<= Ġ_ stream Pos ) Ġ{ Ċĉĉĉ ĉ len Limit Ġ= Ġ_ match Max Len Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ len Limit Ġ= Ġ_ stream Pos Ġ- Ġ_ pos Ċĉĉĉ ĉ if Ġ( len Limit Ġ< Ġk Min Match Check ) Ġ{ Ċĉĉĉĉ ĉ move Pos () Ċĉĉĉĉ ĉ return Ġ 0 Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĊĉĉ ĉ var Ġoffset Ġ= Ġ 0 Ċĉĉ ĉ val Ġmatch Min Pos Ġ= Ġif Ġ(_ pos Ġ> Ġ_ cyc lic BufferSize ) Ġ_ pos Ġ- Ġ_ cyc lic BufferSize Ġelse Ġ 0 Ċĉĉ ĉ val Ġcur Ġ= Ġ_ buffer Offset Ġ+ Ġ_ pos Ċĉĉ ĉ var Ġmax Len Ġ= Ċĉĉĉ ĉ k Start Max Len Ġ// Ġto Ġavoid Ġitems Ġfor Ġlen Ġ< Ġhash Size ; Ċĉĉ ĉ val Ġhash Value : ĠInt Ċĉĉ ĉ var Ġhash 2 Value Ġ= Ġ 0 Ċĉĉ ĉ var Ġhash 3 Value Ġ= Ġ 0 ĊĊĉĉ ĉ if Ġ( HASH _ ARRAY ) Ġ{ Ċĉĉĉ ĉ var Ġtemp Ġ= ĠC rc Table [_ buffer Base ! ![ cur ] Ġand Ġ 0 xFF ] Ġxor Ġ(_ buffer Base ! ![ cur Ġ+ Ġ 1 ] Ġand Ġ 0 xFF ) Ċĉĉĉ ĉ hash 2 Value Ġ= Ġtemp Ġand Ġk Hash 2 Size Ġ- Ġ 1 Ċĉĉĉ ĉ temp Ġ= Ġtemp Ġxor Ġ((_ buffer Base ! ![ cur Ġ+ Ġ 2 ] Ġand Ġ 0 xFF ) Ġshl Ġ 8 ) Ċĉĉĉ ĉ hash 3 Value Ġ= Ġtemp Ġand Ġk Hash 3 Size Ġ- Ġ 1 Ċĉĉĉ ĉ hash Value Ġ= Ġtemp Ġxor Ġ( Crc Table [_ buffer Base ! ![ cur Ġ+ Ġ 3 ] Ġand Ġ 0 xFF ] Ġshl Ġ 5 ) Ġand Ġ_ hash Mask Ċĉĉ ĉ } Ġelse Ċĉĉĉ ĉ hash Value Ġ= Ġ_ buffer Base ! ![ cur ] Ġand Ġ 0 xFF Ġxor Ġ((_ buffer Base ! ![ cur Ġ+ Ġ 1 ] Ġand Ġ 0 xFF ) Ġshl Ġ 8 ) ĊĊĉĉ ĉ var Ġcur Match Ġ= Ġ_ hash [ k Fix Hash Size Ġ+ Ġhash Value ] Ċĉĉ ĉ if Ġ( HASH _ ARRAY ) Ġ{ Ċĉĉĉ ĉ var Ġcur Match 2 Ġ= Ġ_ hash [ hash 2 Value ] Ċĉĉĉ ĉ val Ġcur Match 3 Ġ= Ġ_ hash [ k Hash 3 Offset Ġ+ Ġhash 3 Value ] Ċĉĉĉ ĉ _ hash [ hash 2 Value ] Ġ= Ġ_ pos Ċĉĉĉ ĉ _ hash [ k Hash 3 Offset Ġ+ Ġhash 3 Value ] Ġ= Ġ_ pos Ċĉĉĉ ĉ if Ġ( cur Match 2 Ġ> Ġmatch Min Pos ) Ċĉĉĉĉ ĉ if Ġ(_ buffer Base ! ![ _ buffer Offset Ġ+ Ġcur Match 2 ] Ġ== Ġ_ buffer Base ! ![ cur ]) Ġ{ Ċĉĉĉĉĉ ĉ max Len Ġ= Ġ 2 Ċĉĉĉĉĉ ĉ distances [ offset ++] Ġ= Ġmax Len Ċĉĉĉĉĉ ĉ distances [ offset ++] Ġ= Ġ_ pos Ġ- Ġcur Match 2 Ġ- Ġ 1 Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ if Ġ( cur Match 3 Ġ> Ġmatch Min Pos ) Ċĉĉĉĉ ĉ if Ġ(_ buffer Base ! ![ _ buffer Offset Ġ+ Ġcur Match 3 ] Ġ== Ġ_ buffer Base ! ![ cur ]) Ġ{ Ċĉĉĉĉĉ ĉ if Ġ( cur Match 3 Ġ== Ġcur Match 2 ) Ċĉĉĉĉĉĉ ĉ offset Ġ-= Ġ 2 Ċĉĉĉĉĉ ĉ max Len Ġ= Ġ 3 Ċĉĉĉĉĉ ĉ distances [ offset ++] Ġ= Ġmax Len Ċĉĉĉĉĉ ĉ distances [ offset ++] Ġ= Ġ_ pos Ġ- Ġcur Match 3 Ġ- Ġ 1 Ċĉĉĉĉĉ ĉ cur Match 2 Ġ= Ġcur Match 3 Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ if Ġ( offset Ġ!= Ġ 0 Ġ&& Ġcur Match 2 Ġ== Ġcur Match ) Ġ{ Ċĉĉĉĉ ĉ offset Ġ-= Ġ 2 Ċĉĉĉĉ ĉ max Len Ġ= Ġk Start Max Len Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĊĉĉ ĉ _ hash [ k Fix Hash Size Ġ+ Ġhash Value ] Ġ= Ġ_ pos ĊĊĉĉ ĉ var Ġptr 0 Ġ= Ġ(_ cyc lic Buffer Pos Ġshl Ġ 1 ) Ġ+ Ġ 1 Ċĉĉ ĉ var Ġptr 1 Ġ= Ġ_ cyc lic Buffer Pos Ġshl Ġ 1 ĊĊĉĉ ĉ var Ġlen 0 : ĠInt Ċĉĉ ĉ var Ġlen 1 : ĠInt Ċĉĉ ĉ len 1 Ġ= Ġk Num Hash Direct Bytes Ċĉĉ ĉ len 0 Ġ= Ġlen 1 ĊĊĉĉ ĉ if Ġ( k Num Hash Direct Bytes Ġ!= Ġ 0 ) Ġ{ Ċĉĉĉ ĉ if Ġ( cur Match Ġ> Ġmatch Min Pos ) Ġ{ Ċĉĉĉĉ ĉ if Ġ(_ buffer Base ! ![ _ buffer Offset Ġ+ Ġcur Match Ġ+ Ġk Num Hash Direct Bytes ] Ġ!= Ġ_ buffer Base ! ![ cur Ġ+ Ġk Num Hash Direct Bytes ]) Ġ{ Ċĉĉĉĉĉ ĉ max Len Ġ= Ġk Num Hash Direct Bytes Ċĉĉĉĉĉ ĉ distances [ offset ++] Ġ= Ġmax Len Ċĉĉĉĉĉ ĉ distances [ offset ++] Ġ= Ġ_ pos Ġ- Ġcur Match Ġ- Ġ 1 Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĊĉĉ ĉ var Ġcount Ġ= Ġ_ cut Value ĊĊĉĉ ĉ while Ġ( true ) Ġ{ Ċĉĉĉ ĉ if Ġ( cur Match Ġ<= Ġmatch Min Pos Ġ|| Ġcount -- Ġ== Ġ 0 ) Ġ{ Ċĉĉĉĉ ĉ _ son [ ptr 1 ] Ġ= Ġk Empty Hash Value Ċĉĉĉĉ ĉ _ son [ ptr 0 ] Ġ= Ġ_ son [ ptr 1 ] Ċĉĉĉĉ ĉ break Ċĉĉĉ ĉ } Ċĉĉĉ ĉ val Ġdelta Ġ= Ġ_ pos Ġ- Ġcur Match Ċĉĉĉ ĉ val Ġcy clic Pos Ġ= Ġ( if Ġ( delta Ġ<= Ġ_ cyc lic Buffer Pos ) Ċĉĉĉĉ ĉ _ cyc lic Buffer Pos Ġ- Ġdelta Ċĉĉĉ ĉ else Ċĉĉĉĉ ĉ _ cyc lic Buffer Pos Ġ- Ġdelta Ġ+ Ġ_ cyc lic BufferSize ) Ġshl Ġ 1 ĊĊĉĉĉ ĉ val Ġp by 1 Ġ= Ġ_ buffer Offset Ġ+ Ġcur Match Ċĉĉĉ ĉ var Ġlen Ġ= Ġmin ( len 0 , Ġlen 1 ) Ċĉĉĉ ĉ if Ġ(_ buffer Base ! ![ p by 1 Ġ+ Ġlen ] Ġ== Ġ_ buffer Base ! ![ cur Ġ+ Ġlen ]) Ġ{ Ċĉĉĉĉ ĉ while Ġ(++ len Ġ!= Ġlen Limit ) Ċĉĉĉĉĉ ĉ if Ġ(_ buffer Base ! ![ p by 1 Ġ+ Ġlen ] Ġ!= Ġ_ buffer Base ! ![ cur Ġ+ Ġlen ]) Ċĉĉĉĉĉĉ ĉ break Ċĉĉĉĉ ĉ if Ġ( max Len Ġ< Ġlen ) Ġ{ Ċĉĉĉĉĉ ĉ max Len Ġ= Ġlen Ċĉĉĉĉĉ ĉ distances [ offset ++] Ġ= Ġmax Len Ċĉĉĉĉĉ ĉ distances [ offset ++] Ġ= Ġdelta Ġ- Ġ 1 Ċĉĉĉĉĉ ĉ if Ġ( len Ġ== Ġlen Limit ) Ġ{ Ċĉĉĉĉĉĉ ĉ _ son [ ptr 1 ] Ġ= Ġ_ son [ cyc lic Pos ] Ċĉĉĉĉĉĉ ĉ _ son [ ptr 0 ] Ġ= Ġ_ son [ cyc lic Pos Ġ+ Ġ 1 ] Ċĉĉĉĉĉĉ ĉ break Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ if Ġ(_ buffer Base ! ![ p by 1 Ġ+ Ġlen ] Ġand Ġ 0 xFF Ġ< Ġ_ buffer Base ! ![ cur Ġ+ Ġlen ] Ġand Ġ 0 xFF ) Ġ{ Ċĉĉĉĉ ĉ _ son [ ptr 1 ] Ġ= Ġcur Match Ċĉĉĉĉ ĉ ptr 1 Ġ= Ġcy clic Pos Ġ+ Ġ 1 Ċĉĉĉĉ ĉ cur Match Ġ= Ġ_ son [ ptr 1 ] Ċĉĉĉĉ ĉ len 1 Ġ= Ġlen Ċĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉ ĉ _ son [ ptr 0 ] Ġ= Ġcur Match Ċĉĉĉĉ ĉ ptr 0 Ġ= Ġcy clic Pos Ċĉĉĉĉ ĉ cur Match Ġ= Ġ_ son [ ptr 0 ] Ċĉĉĉĉ ĉ len 0 Ġ= Ġlen Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ move Pos () Ċĉĉ ĉ return Ġoffset Ċĉ ĉ } ĊĊĉ ĉ fun Ġskip ( num : ĠInt ) Ġ{ Ċĉĉ ĉ var Ġn num Ġ= Ġnum Ċĉĉ ĉ do Ġ{ Ċĉĉĉ ĉ val Ġlen Limit : ĠInt Ċĉĉĉ ĉ if Ġ(_ pos Ġ+ Ġ_ match Max Len Ġ<= Ġ_ stream Pos ) Ċĉĉĉĉ ĉ len Limit Ġ= Ġ_ match Max Len Ċĉĉĉ ĉ else Ġ{ Ċĉĉĉĉ ĉ len Limit Ġ= Ġ_ stream Pos Ġ- Ġ_ pos Ċĉĉĉĉ ĉ if Ġ( len Limit Ġ< Ġk Min Match Check ) Ġ{ Ċĉĉĉĉĉ ĉ move Pos () Ċĉĉĉĉĉ ĉ continue Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ val Ġmatch Min Pos Ġ= Ġif Ġ(_ pos Ġ> Ġ_ cyc lic BufferSize ) Ġ_ pos Ġ- Ġ_ cyc lic BufferSize Ġelse Ġ 0 Ċĉĉĉ ĉ val Ġcur Ġ= Ġ_ buffer Offset Ġ+ Ġ_ pos ĊĊĉĉĉ ĉ val Ġhash Value : ĠInt ĊĊĉĉĉ ĉ if Ġ( HASH _ ARRAY ) Ġ{ Ċĉĉĉĉ ĉ var Ġtemp Ġ= ĠC rc Table [_ buffer Base ! ![ cur ] Ġand Ġ 0 xFF ] Ġxor Ġ(_ buffer Base ! ![ cur Ġ+ Ġ 1 ] Ġand Ġ 0 xFF ) Ċĉĉĉĉ ĉ val Ġhash 2 Value Ġ= Ġtemp Ġand Ġk Hash 2 Size Ġ- Ġ 1 Ċĉĉĉĉ ĉ _ hash [ hash 2 Value ] Ġ= Ġ_ pos Ċĉĉĉĉ ĉ temp Ġ= Ġtemp Ġxor Ġ((_ buffer Base ! ![ cur Ġ+ Ġ 2 ] Ġand Ġ 0 xFF ) Ġshl Ġ 8 ) Ċĉĉĉĉ ĉ val Ġhash 3 Value Ġ= Ġtemp Ġand Ġk Hash 3 Size Ġ- Ġ 1 Ċĉĉĉĉ ĉ _ hash [ k Hash 3 Offset Ġ+ Ġhash 3 Value ] Ġ= Ġ_ pos Ċĉĉĉĉ ĉ hash Value Ġ= Ġtemp Ġxor Ġ( Crc Table [_ buffer Base ! ![ cur Ġ+ Ġ 3 ] Ġand Ġ 0 xFF ] Ġshl Ġ 5 ) Ġand Ġ_ hash Mask Ċĉĉĉ ĉ } Ġelse Ċĉĉĉĉ ĉ hash Value Ġ= Ġ_ buffer Base ! ![ cur ] Ġand Ġ 0 xFF Ġxor Ġ((_ buffer Base ! ![ cur Ġ+ Ġ 1 ] Ġand Ġ 0 xFF ) Ġshl Ġ 8 ) ĊĊĉĉĉ ĉ var Ġcur Match Ġ= Ġ_ hash [ k Fix Hash Size Ġ+ Ġhash Value ] Ċĉĉĉ ĉ _ hash [ k Fix Hash Size Ġ+ Ġhash Value ] Ġ= Ġ_ pos ĊĊĉĉĉ ĉ var Ġptr 0 Ġ= Ġ(_ cyc lic Buffer Pos Ġshl Ġ 1 ) Ġ+ Ġ 1 Ċĉĉĉ ĉ var Ġptr 1 Ġ= Ġ_ cyc lic Buffer Pos Ġshl Ġ 1 ĊĊĉĉĉ ĉ var Ġlen 0 : ĠInt Ċĉĉĉ ĉ var Ġlen 1 : ĠInt Ċĉĉĉ ĉ len 1 Ġ= Ġk Num Hash Direct Bytes Ċĉĉĉ ĉ len 0 Ġ= Ġlen 1 ĊĊĉĉĉ ĉ var Ġcount Ġ= Ġ_ cut Value Ċĉĉĉ ĉ while Ġ( true ) Ġ{ Ċĉĉĉĉ ĉ if Ġ( cur Match Ġ<= Ġmatch Min Pos Ġ|| Ġcount -- Ġ== Ġ 0 ) Ġ{ Ċĉĉĉĉĉ ĉ _ son [ ptr 1 ] Ġ= Ċĉĉĉĉĉĉĉ ĉ k Empty Hash Value Ċĉĉĉĉĉ ĉ _ son [ ptr 0 ] Ġ= Ġ_ son [ ptr 1 ] Ċĉĉĉĉĉ ĉ break Ċĉĉĉĉ ĉ } ĊĊĉĉĉĉ ĉ val Ġdelta Ġ= Ġ_ pos Ġ- Ġcur Match Ċĉĉĉĉ ĉ val Ġcy clic Pos Ġ= Ġ( if Ġ( delta Ġ<= Ġ_ cyc lic Buffer Pos ) Ċĉĉĉĉĉ ĉ _ cyc lic Buffer Pos Ġ- Ġdelta Ċĉĉĉĉ ĉ else Ċĉĉĉĉĉ ĉ _ cyc lic Buffer Pos Ġ- Ġdelta Ġ+ Ġ_ cyc lic BufferSize ) Ġshl Ġ 1 ĊĊĉĉĉĉ ĉ val Ġp by 1 Ġ= Ġ_ buffer Offset Ġ+ Ġcur Match Ċĉĉĉĉ ĉ var Ġlen Ġ= Ġmin ( len 0 , Ġlen 1 ) Ċĉĉĉĉ ĉ if Ġ(_ buffer Base ! ![ p by 1 Ġ+ Ġlen ] Ġ== Ġ_ buffer Base ! ![ cur Ġ+ Ġlen ]) Ġ{ Ċĉĉĉĉĉ ĉ while Ġ(++ len Ġ!= Ġlen Limit ) Ċĉĉĉĉĉĉ ĉ if Ġ(_ buffer Base ! ![ p by 1 Ġ+ Ġlen ] Ġ!= Ġ_ buffer Base ! ![ cur Ġ+ Ġlen ]) Ċĉĉĉĉĉĉĉ ĉ break Ċĉĉĉĉĉ ĉ if Ġ( len Ġ== Ġlen Limit ) Ġ{ Ċĉĉĉĉĉĉ ĉ _ son [ ptr 1 ] Ġ= Ġ_ son [ cyc lic Pos ] Ċĉĉĉĉĉĉ ĉ _ son [ ptr 0 ] Ġ= Ġ_ son [ cyc lic Pos Ġ+ Ġ 1 ] Ċĉĉĉĉĉĉ ĉ break Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ if Ġ(_ buffer Base ! ![ p by 1 Ġ+ Ġlen ] Ġand Ġ 0 xFF Ġ< Ġ_ buffer Base ! ![ cur Ġ+ Ġlen ] Ġand Ġ 0 xFF ) Ġ{ Ċĉĉĉĉĉ ĉ _ son [ ptr 1 ] Ġ= Ġcur Match Ċĉĉĉĉĉ ĉ ptr 1 Ġ= Ġcy clic Pos Ġ+ Ġ 1 Ċĉĉĉĉĉ ĉ cur Match Ġ= Ġ_ son [ ptr 1 ] Ċĉĉĉĉĉ ĉ len 1 Ġ= Ġlen Ċĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉ ĉ _ son [ ptr 0 ] Ġ= Ġcur Match Ċĉĉĉĉĉ ĉ ptr 0 Ġ= Ġcy clic Pos Ċĉĉĉĉĉ ĉ cur Match Ġ= Ġ_ son [ ptr 0 ] Ċĉĉĉĉĉ ĉ len 0 Ġ= Ġlen Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ move Pos () Ċĉĉ ĉ } Ġwhile Ġ(-- n num Ġ!= Ġ 0 ) Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġnormalize Links ( items : ĠInt Array , Ġnum Items : ĠInt , Ġsub Value : ĠInt ) Ġ{ Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġnum Items ) Ġ{ Ċĉĉĉ ĉ var Ġvalue Ġ= Ġitems [ i ] Ċĉĉĉ ĉ if Ġ( value Ġ<= Ġsub Value ) Ċĉĉĉĉ ĉ value Ġ= Ġk Empty Hash Value Ċĉĉĉ ĉ else Ċĉĉĉĉ ĉ value Ġ-= Ġsub Value Ċĉĉĉ ĉ items [ i ] Ġ= Ġvalue Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġnormalize () Ġ{ Ċĉĉ ĉ val Ġsub Value Ġ= Ġ_ pos Ġ- Ġ_ cyc lic BufferSize Ċĉĉ ĉ normalize Links (_ son , Ġ_ cyc lic BufferSize Ġ* Ġ 2 , Ġsub Value ) Ċĉĉ ĉ normalize Links (_ hash , Ġ_ hash Size Sum , Ġsub Value ) Ċĉĉ ĉ reduce Offsets ( sub Value ) Ċĉ ĉ } ĊĊĉ ĉ // fun Ġset Cut Value ( cut Value : ĠInt ) Ġ= Ġrun Ġ{ Ġ_ cut Value Ġ= Ġcut Value Ġ} ĊĊĉ ĉ comp anion Ġobject Ġ{ Ċĉĉ ĉ internal Ġconst Ġval Ġk Hash 2 Size Ġ= Ġ 1 Ġshl Ġ 1 0 Ċĉĉ ĉ internal Ġconst Ġval Ġk Hash 3 Size Ġ= Ġ 1 Ġshl Ġ 1 6 Ċĉĉ ĉ internal Ġconst Ġval Ġk BT 2 Hash Size Ġ= Ġ 1 Ġshl Ġ 1 6 Ċĉĉ ĉ internal Ġconst Ġval Ġk Start Max Len Ġ= Ġ 1 Ċĉĉ ĉ internal Ġconst Ġval Ġk Hash 3 Offset Ġ= Ġk Hash 2 Size Ċĉĉ ĉ internal Ġconst Ġval Ġk Empty Hash Value Ġ= Ġ 0 Ċĉĉ ĉ internal Ġconst Ġval Ġk Max Val For Normalize Ġ= Ġ( 1 Ġshl Ġ 3 0 ) Ġ- Ġ 1 ĊĊĉĉ ĉ private Ġval ĠC rc Table Ġ= ĠCRC 3 2 . TABLE Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ open Ġclass ĠL z In Window Ġ{ Ċĉ ĉ var Ġ_ buffer Base : ĠByteArray ? Ġ= Ġnull Ġ// Ġpointer Ġto Ġbuffer Ġwith Ġdata Ċĉ ĉ private Ġvar Ġ_ stream : ĠSync InputStream ? Ġ= Ġnull Ċĉ ĉ private Ġvar Ġ_ pos Limit : ĠInt Ġ= Ġ 0 Ġ Ġ// Ġoffset Ġ( from Ġ_ buffer ) Ġof Ġfirst Ġbyte Ġwhen Ġnew Ġblock Ġreading Ġmust Ġbe Ġdone Ċĉ ĉ private Ġvar Ġ_ stream End Was Reached : ĠBoolean Ġ= Ġfalse Ġ// Ġif Ġ( true ) Ġthen Ġ_ stream Pos Ġshows Ġreal Ġend Ġof Ġstream ĊĊĉ ĉ private Ġvar Ġ_ pointer To Last Safe Position : ĠInt Ġ= Ġ 0 ĊĊĉ ĉ var Ġ_ buffer Offset : ĠInt Ġ= Ġ 0 ĊĊĉ ĉ private Ġvar Ġ_ block Size : ĠInt Ġ= Ġ 0 Ġ Ġ// ĠSize Ġof ĠAlloc ated Ġmemory Ġblock Ċĉ ĉ var Ġ_ pos : ĠInt Ġ= Ġ 0 ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġoffset Ġ( from Ġ_ buffer ) Ġof Ġc urent Ġbyte Ċĉ ĉ private Ġvar Ġ_ keep Size Before : ĠInt Ġ= Ġ 0 Ġ Ġ// Ġhow Ġmany ĠBYTE s Ġmust Ġbe Ġkept Ġin Ġbuffer Ġbefore Ġ_ pos Ċĉ ĉ private Ġvar Ġ_ keep Size After : ĠInt Ġ= Ġ 0 ĠĠ Ġ// Ġhow Ġmany ĠBYTE s Ġmust Ġbe Ġkept Ġbuffer Ġafter Ġ_ pos Ċĉ ĉ var Ġ_ stream Pos : ĠInt Ġ= Ġ 0 ĠĠ Ġ// Ġoffset Ġ( from Ġ_ buffer ) Ġof Ġfirst Ġnot Ġread Ġbyte Ġfrom ĠStream ĊĊĉ ĉ private Ġfun Ġmove Block () Ġ{ Ċĉĉ ĉ var Ġoffset Ġ= Ġ_ buffer Offset Ġ+ Ġ_ pos Ġ- Ġ_ keep Size Before Ċĉĉ ĉ // Ġwe Ġneed Ġone Ġadditional Ġbyte , Ġsince ĠMove Pos Ġmoves Ġon Ġ 1 Ġbyte . Ċĉĉ ĉ if Ġ( offset Ġ> Ġ 0 ) Ġoffset -- Ċĉĉ ĉ val Ġnum Bytes Ġ= Ġ_ buffer Offset Ġ+ Ġ_ stream Pos Ġ- Ġoffset Ċĉĉ ĉ // Ġcheck Ġnegative Ġoffset Ġ?? ?? Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġnum Bytes ) Ġ_ buffer Base ! ![ i ] Ġ= Ġ_ buffer Base ! ![ offset Ġ+ Ġi ] Ċĉĉ ĉ _ buffer Offset Ġ-= Ġoffset Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġread Block () Ġ{ Ċĉĉ ĉ if Ġ(_ stream End Was Reached ) Ġreturn Ċĉĉ ĉ while Ġ( true ) Ġ{ Ċĉĉĉ ĉ val Ġsize Ġ= Ġ 0 Ġ- Ġ_ buffer Offset Ġ+ Ġ_ block Size Ġ- Ġ_ stream Pos Ċĉĉĉ ĉ if Ġ( size Ġ== Ġ 0 ) Ċĉĉĉĉ ĉ return Ċĉĉĉ ĉ val Ġnum Read Bytes Ġ= Ġ_ stream !!. read (_ buffer Base !! , Ġ_ buffer Offset Ġ+ Ġ_ stream Pos , Ġsize ) Ċĉĉĉ ĉ if Ġ( num Read Bytes Ġ<= Ġ 0 ) Ġ{ Ċĉĉĉĉ ĉ _ pos Limit Ġ= Ġ_ stream Pos Ċĉĉĉĉ ĉ val Ġpointer To Post ion Ġ= Ġ_ buffer Offset Ġ+ Ġ_ pos Limit Ċĉĉĉĉ ĉ if Ġ( pointer To Post ion Ġ> Ġ_ pointer To Last Safe Position ) Ċĉĉĉĉĉ ĉ _ pos Limit Ġ= Ġ_ pointer To Last Safe Position Ġ- Ġ_ buffer Offset ĊĊĉĉĉĉ ĉ _ stream End Was Reached Ġ= Ġtrue Ċĉĉĉĉ ĉ return Ċĉĉĉ ĉ } Ċĉĉĉ ĉ _ stream Pos Ġ+= Ġnum Read Bytes Ċĉĉĉ ĉ if Ġ(_ stream Pos Ġ>= Ġ_ pos Ġ+ Ġ_ keep Size After ) Ċĉĉĉĉ ĉ _ pos Limit Ġ= Ġ_ stream Pos Ġ- Ġ_ keep Size After Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġfree () Ġ{ Ċĉĉ ĉ _ buffer Base Ġ= Ġnull Ċĉ ĉ } ĊĊĉ ĉ fun Ġcreate ( keep Size Before : ĠInt , Ġkeep Size After : ĠInt , Ġkeep Size Reser v : ĠInt ) Ġ{ Ċĉĉ ĉ _ keep Size Before Ġ= Ġkeep Size Before Ċĉĉ ĉ _ keep Size After Ġ= Ġkeep Size After Ċĉĉ ĉ val ĠblockSize Ġ= Ġkeep Size Before Ġ+ Ġkeep Size After Ġ+ Ġkeep Size Reser v Ċĉĉ ĉ if Ġ(_ buffer Base Ġ== Ġnull Ġ|| Ġ_ block Size Ġ!= ĠblockSize ) Ġ{ Ċĉĉĉ ĉ free () Ċĉĉĉ ĉ _ block Size Ġ= ĠblockSize Ċĉĉĉ ĉ _ buffer Base Ġ= ĠByteArray (_ block Size ) Ċĉĉ ĉ } Ċĉĉ ĉ _ pointer To Last Safe Position Ġ= Ġ_ block Size Ġ- Ġkeep Size After Ċĉ ĉ } ĊĊĉ ĉ fun Ġset Stream ( stream : ĠSync InputStream ) Ġ{ Ċĉĉ ĉ _ stream Ġ= Ġstream Ċĉ ĉ } ĊĊĉ ĉ fun Ġrelease Stream () Ġ{ Ċĉĉ ĉ _ stream Ġ= Ġnull Ċĉ ĉ } ĊĊĉ ĉ open Ġfun Ġinit () Ġ{ Ċĉĉ ĉ _ buffer Offset Ġ= Ġ 0 Ċĉĉ ĉ _ pos Ġ= Ġ 0 Ċĉĉ ĉ _ stream Pos Ġ= Ġ 0 Ċĉĉ ĉ _ stream End Was Reached Ġ= Ġfalse Ċĉĉ ĉ read Block () Ċĉ ĉ } ĊĊĉ ĉ open Ġfun Ġmove Pos () Ġ{ Ċĉĉ ĉ _ pos ++ Ċĉĉ ĉ if Ġ(_ pos Ġ> Ġ_ pos Limit ) Ġ{ Ċĉĉĉ ĉ val Ġpointer To Post ion Ġ= Ġ_ buffer Offset Ġ+ Ġ_ pos Ċĉĉĉ ĉ if Ġ( pointer To Post ion Ġ> Ġ_ pointer To Last Safe Position ) Ġmove Block () Ċĉĉĉ ĉ read Block () Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ fun Ġget Index Byte ( index : ĠInt ): ĠByte Ġ= Ġ_ buffer Base ! ![ _ buffer Offset Ġ+ Ġ_ pos Ġ+ Ġindex ] ĊĊĉ ĉ // Ġindex Ġ+ Ġlimit Ġhave Ġnot Ġto Ġexceed Ġ_ keep Size After ; Ċĉ ĉ fun Ġget Match Len ( index : ĠInt , Ġdistance : ĠInt , Ġlimit : ĠInt ): ĠInt Ġ{ Ċĉĉ ĉ var Ġd dis Ġ= Ġdistance Ċĉĉ ĉ var Ġd lim Ġ= Ġlimit Ċĉĉ ĉ if Ġ(_ stream End Was Reached Ġ&& Ġ_ pos Ġ+ Ġindex Ġ+ Ġd lim Ġ> Ġ_ stream Pos ) Ġd lim Ġ= Ġ_ stream Pos Ġ- Ġ(_ pos Ġ+ Ġindex ) Ċĉĉ ĉ dd is ++ Ċĉĉ ĉ // ĠByte Ġ* p by Ġ= Ġ_ buffer Ġ+ Ġ( size _ t )_ pos Ġ+ Ġindex ; Ċĉĉ ĉ val Ġp by Ġ= Ġ_ buffer Offset Ġ+ Ġ_ pos Ġ+ Ġindex ĊĊĉĉ ĉ var Ġi Ġ= Ġ 0 Ċĉĉ ĉ while Ġ( i Ġ< Ġd lim Ġ&& Ġ_ buffer Base ! ![ p by Ġ+ Ġi ] Ġ== Ġ_ buffer Base ! ![ p by Ġ+ Ġi Ġ- Ġd dis ]) Ġi ++ Ċĉĉ ĉ return Ġi Ċĉ ĉ } ĊĊĉ ĉ fun ĠgetNum Available Bytes (): ĠInt Ġ{ Ċĉĉ ĉ return Ġ_ stream Pos Ġ- Ġ_ pos Ċĉ ĉ } ĊĊĉ ĉ fun Ġreduce Offsets ( sub Value : ĠInt ) Ġ{ Ċĉĉ ĉ _ buffer Offset Ġ+= Ġsub Value Ċĉĉ ĉ _ pos Limit Ġ-= Ġsub Value Ċĉĉ ĉ _ pos Ġ-= Ġsub Value Ċĉĉ ĉ _ stream Pos Ġ-= Ġsub Value Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ class ĠL z Out Window Ġ{ Ċĉ ĉ private Ġvar Ġ_ buffer : ĠByteArray ? Ġ= Ġnull Ċĉ ĉ private Ġvar Ġ_ pos : ĠInt Ġ= Ġ 0 Ċĉ ĉ private Ġvar Ġ_ window Size Ġ= Ġ 0 Ċĉ ĉ private Ġvar Ġ_ stream Pos : ĠInt Ġ= Ġ 0 Ċĉ ĉ private Ġvar Ġ_ stream : ĠSync OutputStream ? Ġ= Ġnull ĊĊĉ ĉ fun Ġcreate ( window Size : ĠInt ) Ġ{ Ċĉĉ ĉ if Ġ(_ buffer Ġ== Ġnull Ġ|| Ġ_ window Size Ġ!= Ġwindow Size ) Ċĉĉĉ ĉ _ buffer Ġ= ĠByteArray ( window Size ) Ċĉĉ ĉ _ window Size Ġ= Ġwindow Size Ċĉĉ ĉ _ pos Ġ= Ġ 0 Ċĉĉ ĉ _ stream Pos Ġ= Ġ 0 Ċĉ ĉ } ĊĊĉ ĉ fun Ġset Stream ( stream : ĠSync OutputStream ) Ġ{ Ċĉĉ ĉ release Stream () Ċĉĉ ĉ _ stream Ġ= Ġstream Ċĉ ĉ } ĊĊĉ ĉ fun Ġrelease Stream () Ġ{ Ċĉĉ ĉ flush () Ċĉĉ ĉ _ stream Ġ= Ġnull Ċĉ ĉ } ĊĊĉ ĉ fun Ġinit ( solid : ĠBoolean ) Ġ{ Ċĉĉ ĉ if Ġ(! solid ) Ġ{ Ċĉĉĉ ĉ _ stream Pos Ġ= Ġ 0 Ċĉĉĉ ĉ _ pos Ġ= Ġ 0 Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ fun Ġflush () Ġ{ Ċĉĉ ĉ val Ġsize Ġ= Ġ_ pos Ġ- Ġ_ stream Pos Ċĉĉ ĉ if Ġ( size Ġ== Ġ 0 ) Ġreturn Ċĉĉ ĉ _ stream !!. write (_ buffer !! , Ġ_ stream Pos , Ġsize ) Ċĉĉ ĉ if Ġ(_ pos Ġ>= Ġ_ window Size ) Ġ_ pos Ġ= Ġ 0 Ċĉĉ ĉ _ stream Pos Ġ= Ġ_ pos Ċĉ ĉ } ĊĊĉ ĉ fun Ġcopy Block ( distance : ĠInt , Ġlen : ĠInt ) Ġ{ Ċĉĉ ĉ var Ġl len Ġ= Ġlen Ċĉĉ ĉ var Ġpos Ġ= Ġ_ pos Ġ- Ġdistance Ġ- Ġ 1 Ċĉĉ ĉ if Ġ( pos Ġ< Ġ 0 ) Ċĉĉĉ ĉ pos Ġ+= Ġ_ window Size Ċĉĉ ĉ while Ġ( llen Ġ!= Ġ 0 ) Ġ{ Ċĉĉĉ ĉ if Ġ( pos Ġ>= Ġ_ window Size ) Ġpos Ġ= Ġ 0 Ċĉĉĉ ĉ _ buffer ! ![ _ pos ++] Ġ= Ġ_ buffer ! ![ pos ++] Ċĉĉĉ ĉ if Ġ(_ pos Ġ>= Ġ_ window Size ) Ġflush () Ċĉĉĉ ĉ llen -- Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ fun Ġput Byte ( b : ĠByte ) Ġ{ Ċĉĉ ĉ _ buffer ! ![ _ pos ++] Ġ= Ġb Ċĉĉ ĉ if Ġ(_ pos Ġ>= Ġ_ window Size ) Ċĉĉĉ ĉ flush () Ċĉ ĉ } ĊĊĉ ĉ fun Ġget Byte ( distance : ĠInt ): ĠByte Ġ{ Ċĉĉ ĉ var Ġpos Ġ= Ġ_ pos Ġ- Ġdistance Ġ- Ġ 1 Ċĉĉ ĉ if Ġ( pos Ġ< Ġ 0 ) Ġpos Ġ+= Ġ_ window Size Ċĉĉ ĉ return Ġ_ buffer ! ![ pos ] Ċĉ ĉ } Ċ ĉ } Ċ } Ċ Ċ private Ġin fix Ġfun ĠByte . and ( mask : ĠInt ): ĠInt Ġ= Ġthis . toInt () Ġand Ġmask Ċ private Ġin fix Ġfun ĠByte . sh l ( that : ĠInt ): ĠInt Ġ= Ġthis . toInt () Ġshl Ġthat Ċ private Ġin fix Ġfun ĠByte . shr ( that : ĠInt ): ĠInt Ġ= Ġthis . toInt () Ġshr Ġthat Ċ