package Ġcom . pr 0 gram m . app . parcel Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Parcel Ċ import Ġandroid . os . Parcelable Ċ import Ġcom . pr 0 gram m . app . Logger Ċ import Ġcom . pr 0 gram m . app . Stop watch Ċ import Ġcom . pr 0 gram m . app . listOf Size Ċ import Ġcom . pr 0 gram m . app . time Ċ import Ġok io .* Ċ import Ġok io . ByteString . Companion . encode Utf 8 Ċ import Ġjava . util . zip . De flater Ċ import Ġjava . util . zip . Inflater Ċ import Ġkotlin . contracts . contract ĊĊ Ċ private Ġval Ġlogger Ġ= ĠLogger (" Free zer ") Ċ Ċ /** Ċ Ġ* ĠVery Ġsimple Ġre - implementation Ġof Ġthe ĠParcel able Ġframework . Ċ Ġ*/ Ċ interface ĠFree z able Ġ: ĠParcel able Ġ{ ĊĠĠĠ Ġfun Ġfreeze ( sink : ĠS ink ) ĊĊĠĠĠ Ġoverride Ġfun Ġdescribe Contents (): ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun ĠwriteTo Parcel ( dest : ĠParcel , Ġflags : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Lazy Ġparcel ing Ġof Ġ${ this . java Class . direct Name }" Ġ} ĊĠĠĠĠĠĠĠ Ġdest . write ByteArray ( Free zer . freeze ( this )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠS ink ( private Ġval Ġsink : ĠBuffered Sink ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġwrite ( f : ĠFree z able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf . freeze ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwrite Boolean ( value : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsink . write Byte ( if Ġ( value ) Ġ 1 Ġelse Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwrite Byte ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsink . write Byte ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwrite Short ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwrite Int ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrest Ġ= Ġvalue Ġshl Ġ 1 Ġxor Ġ( value Ġshr Ġ 3 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( rest Ġand Ġ- 0 x 8 0 Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Byte ( rest Ġand Ġ 0 x 7 F Ġor Ġ 0 x 8 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrest Ġ= Ġrest Ġ ush r Ġ 7 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Byte ( rest Ġand Ġ 0 x 7 F ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwrite Long ( value : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrest Ġ= Ġvalue Ġshl Ġ 1 Ġxor Ġ( value Ġshr Ġ 6 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( rest Ġand Ġ- 0 x 8 0 L Ġ!= Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Byte ( rest . toInt () Ġand Ġ 0 x 7 F Ġor Ġ 0 x 8 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrest Ġ= Ġrest Ġ ush r Ġ 7 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Byte ( rest . toInt () Ġand Ġ 0 x 7 F ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwrite Float ( f : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsink . writeInt ( f . to Bits ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwrite String ( s : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġs . encode Utf 8 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( bytes . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bytes . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsink . write ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠSource ( private Ġval Ġsource : ĠBuffered Source ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġ< F Ġ: ĠFree z able > Ġread ( c : ĠUn free z able < F >): ĠF Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġc . un freeze ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġread Boolean (): ĠBoolean Ġ= Ġsource . read Byte () Ġ!= Ġ 0 . to Byte () ĊĊĠĠĠĠĠĠĠ Ġfun Ġread Byte (): ĠByte Ġ= Ġsource . read Byte () ĊĊĠĠĠĠĠĠĠ Ġfun Ġread Short (): ĠShort Ġ= Ġread Int (). to Short () ĊĊĠĠĠĠĠĠĠ Ġfun Ġread Int (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlen Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġread Byte (). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( b Ġand Ġ 0 x 8 0 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Ġ= Ġvalue Ġor Ġ( b Ġshl Ġlen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= Ġraw Ġshl Ġ 3 1 Ġshr Ġ 3 1 Ġxor Ġraw Ġshr Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtemp Ġxor Ġ( raw Ġand Ġ( 1 Ġshl Ġ 3 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġvalue Ġor Ġ( b Ġand Ġ 0 x 7 F Ġshl Ġlen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlen Ġ+= Ġ 7 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( len Ġ<= Ġ 3 5 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Variable Ġlength Ġquantity Ġis Ġtoo Ġlong ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġread Long (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlen Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġread Byte (). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( b Ġand Ġ 0 x 8 0 L Ġ== Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Ġ= Ġvalue Ġor Ġ( b Ġshl Ġlen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= Ġraw Ġshl Ġ 6 3 Ġshr Ġ 6 3 Ġxor Ġraw Ġshr Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtemp Ġxor Ġ( raw Ġand Ġ( 1 L Ġshl Ġ 6 3 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġvalue Ġor Ġ( b Ġand Ġ 0 x 7 F Ġshl Ġlen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlen Ġ+= Ġ 7 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( len Ġ<= Ġ 6 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Variable Ġlength Ġquantity Ġis Ġtoo Ġlong ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġread Float (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFloat . from Bits ( source . readInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġread String (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġread Int () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsource . read Utf 8 ( size . to Long ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠFree zer Ġ{ ĊĠĠĠ Ġfun Ġfreeze ( f : ĠFree z able ): ĠByteArray Ġ= Ġlogger . time (" Free zing Ġobject Ġof Ġtype Ġ${ f . java Class . direct Name }") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġraw Ġ= ĠBuffer () ĊĊĠĠĠĠĠĠĠ Ġ// Ġassume Ġthat Ġwe Ġmight Ġnot Ġneed Ġto Ġcompress Ġand ĊĠĠĠĠĠĠĠ Ġ// Ġstart Ġwith Ġa Ġzero Ġbyte Ġto Ġindicate Ġthat Ġlater . ĊĠĠĠĠĠĠĠ Ġraw . write Byte ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġfreeze Ġit Ġto Ġthe Ġraw Ġbuffer ĊĠĠĠĠĠĠĠ Ġf . freeze ( Free z able . Sink ( raw )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( raw . size Ġ< Ġ 6 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġcompression Ġneeded ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġraw . read ByteArray () ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwatch Ġ= ĠStop watch () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġun compressed Size Ġ= Ġraw . size ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġassumption Ġof Ġnot Ġneeding Ġcompression Ġfailed , Ġskipping Ġzero Ġbyte . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġraw . skip ( 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠBuffer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . write Byte ( 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠDe flater Sink ( buffer , ĠDe flater ( 6 )). use Ġ{ Ġsink Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsink . write ( raw , Ġraw . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Compressed Ġ% d Ġbytes Ġto Ġ% d Ġ(% 1 . 2 f %% ) Ġtook Ġ% s ". format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun compressed Size , Ġbuffer . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . size Ġ* Ġ 1 0 0 . 0 Ġ/ Ġun compressed Size , Ġwatch ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuffer . read ByteArray () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T Ġ: ĠFree z able > Ġun freeze ( data : ĠByteArray , Ġc : ĠUn free z able < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlogger . time (" Un free zing Ġobject Ġof Ġtype Ġ${ c . java Class . enc lo sing Class ?. direct Name }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnot Compressed Ġ= Ġdata [ 0 ] Ġ== Ġ 0 . to Byte () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Source Ġ= Ġbuffer Of ( data , Ġ 1 , Ġdata . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( not Compressed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . un freeze ( Free z able . Source ( raw Source )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIn flater Source ( raw Source , ĠIn flater ()). use Ġ{ Ġsource Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . un freeze ( Free z able . Source ( source . buffer ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ private Ġinline Ġfun Ġbuffer Of ( data : ĠByteArray , Ġoffset : ĠInt Ġ= Ġ 0 , Ġlength : ĠInt Ġ= Ġdata . size ): ĠBuffer Ġ{ ĊĠĠĠ Ġreturn ĠBuffer (). apply Ġ{ Ġwrite ( data , Ġoffset , Ġlength ) Ġ} Ċ } Ċ Ċ interface ĠUn free z able < T Ġ: ĠFree z able > Ġ{ ĊĠĠĠ Ġfun Ġun freeze ( source : ĠFree z able . Source ): ĠT Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠFree z able > ĠUn free z able < T >. parcel able Creator () Ġ= Ġobject Ġ: ĠParcel able . Creator < T > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcreate From Parcel ( source : ĠParcel ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFree zer . un freeze ( source . create ByteArray () !! , Ġthis @ parcel able Creator ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnew Array ( size : ĠInt ): ĠArray < T ?> Ġ= ĠarrayOf Null s ( size ) Ċ } Ċ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ inline Ġfun ĠBundle . put Free z able ( key : ĠString , Ġf : ĠFree z able ) Ġ{ ĊĠĠĠ Ġput Parcelable ( key , Ġf ) Ċ } Ċ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ inline Ġfun Ġ< T Ġ: ĠFree z able > ĠBundle . get Free z able ( key : ĠString , Ġc : ĠUn free z able < T >): ĠT ? Ġ{ ĊĠĠĠ Ġreturn Ġget Parcelable ( key ) Ċ } Ċ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ inline Ġfun Ġ< T Ġ: ĠFree z able > ĠBundle . get Parcelable ( key : ĠString , Ġc : ĠUn free z able < T >): ĠT ? Ġ{ ĊĠĠĠ Ġreturn Ġget Parcelable ( key ) Ċ } Ċ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ inline Ġfun Ġ< T Ġ: ĠFree z able > ĠIntent . get Free z able Extra ( key : ĠString , Ġc : ĠUn free z able < T >): ĠT ? Ġ{ ĊĠĠĠ Ġreturn Ġget Parcelable Extra ( key ) Ċ } Ċ Ċ private Ġinline Ġval ĠClass <* >. direct Name : ĠString ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġname . take Last While Ġ{ Ġit Ġ!= Ġ'.' Ġ}. replace ('$ ', Ġ'.') ĊĠĠĠ Ġ} ĊĊ Ċ fun Ġ< F Ġ: ĠFree z able > ĠFree z able . Sink . write Values ( values : ĠCollection < F >) Ġ{ ĊĠĠĠ Ġwrite Int ( values . size ) ĊĠĠĠ Ġvalues . forEach Ġ{ Ġwrite ( it ) Ġ} Ċ } Ċ Ċ inline Ġfun ĠFree z able . Sink . write Values ( n : ĠInt , Ġfn : Ġ( idx : ĠInt ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġcontract Ġ{ Ġcalls In Place ( fn ) Ġ} ĊĊĠĠĠ Ġwrite Int ( n ) ĊĠĠĠ Ġrepeat ( n , Ġfn ) Ċ } Ċ Ċ fun Ġ< F Ġ: ĠFree z able > ĠFree z able . Source . read Values ( c : ĠUn free z able < F >): ĠList < F > Ġ{ ĊĠĠĠ Ġreturn ĠlistOf Size ( readInt ()) Ġ{ Ġread ( c ) Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< E > ĠFree z able . Source . read Values ( fn : Ġ() Ġ-> ĠE ): ĠList < E > Ġ{ ĊĠĠĠ Ġreturn ĠlistOf Size ( readInt ()) Ġ{ Ġfn () Ġ} Ċ } Ċ