package Ġat . w avy walk . simp ler . orm . model Utils Ċ Ċ import Ġorg . apache . commons . file upload . File Item Ċ import Ġorg . apache . commons . file upload . disk . Disk File Item Ċ import Ġjava . io .* Ċ import Ġjava . nio . file . Files Ċ Ċ abstract Ġclass ĠFile Property Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġoperation Type Ġ= ĠOperation Types . DO _ NOTH ING ĊĠĠĠ Ġprivate Ġvar Ġtarget FileName : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġfile Item Being Processed : ĠFile Item ? Ġ= Ġnull ĊĊĠĠĠ Ġabstract Ġval Ġmodel Id : ĠLong ? ĊĠĠĠ Ġabstract Ġvar Ġmax Allowed Size : ĠLong ĊĊĠĠĠ Ġabstract Ġval Ġbase Upload Path : ĠString ĊĠĠĠ Ġabstract Ġval Ġmodel Name : ĠString ĊĠĠĠ Ġabstract Ġval ĠpropertyName : ĠString ĊĊĠĠĠ Ġabstract Ġval ĠfileName On Model : ĠString ? ĊĊĠĠĠ Ġabstract Ġfun Ġvalidate File ( file : ĠFile ): ĠBoolean ĊĠĠĠ Ġabstract Ġfun Ġon File Assigned ( file : ĠFile , Ġtarget FileName : ĠString ?) ĊĠĠĠ Ġabstract Ġfun Ġpreprocess File ( file : ĠFile ) ĊĠĠĠ Ġabstract Ġfun Ġon File Delete () ĊĊĠĠĠ Ġvar Ġtransaction Dir For Processed Files : ĠFile ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġtransaction Original File : ĠFile ? Ġ= Ġnull ĊĊĠĠĠ Ġenum Ġclass ĠOperation Types Ġ{ ĊĠĠĠĠĠĠĠ ĠASS IGN , ĊĠĠĠĠĠĠĠ ĠDELETE , ĊĠĠĠĠĠĠĠ ĠDO _ NOTH ING ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetFile It self ( namespace : ĠString Ġ= Ġ" original "): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( fileName On Model Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfile To Return Ġ= ĠFile ( prepare Repository Path () Ġ+ Ġ"/ ${ namespace }/ " Ġ+ ĠfileName On Model ) ĊĠĠĠĠĠĠĠ Ġif Ġ( file To Return . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile To Return ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġassign ( file Item : ĠFile Item ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file Item Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠfileSize Ġ= Ġfile Item . size ĊĠĠĠĠĠĠĠ Ġif Ġ( file Size Ġ> Ġmax Allowed Size ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoperation Type Ġ= ĠOperation Types . ASSIGN ĊĊĠĠĠĠĠĠĠ Ġtarget FileName Ġ= Ġfile Item . name ĊĠĠĠĠĠĠĠ Ġfile Item Being Processed Ġ= Ġfile Item ĊĊĠĠĠĠĠĠĠ Ġcreate Transaction Original File ( file Item ) ĊĊĠĠĠĠĠĠĠ Ġon File Assigned ( transaction Original File !! , Ġtarget FileName ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! validate File ( transaction Original File !! )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear Transactional Files () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Type Ġ= ĠOperation Types . DO _ NOTH ING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcreate Transaction Dir For Processed Files () ĊĊĠĠĠĠĠĠĠ Ġtransaction Original File !!. name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġassign ( file : ĠFile ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠfileSize Ġ= Ġfile . length () ĊĠĠĠĠĠĠĠ Ġif Ġ( file Size Ġ> Ġmax Allowed Size ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoperation Type Ġ= ĠOperation Types . ASSIGN ĊĊĠĠĠĠĠĠĠ Ġtarget FileName Ġ= Ġfile . name ĊĊĠĠĠĠĠĠĠ Ġcreate Transaction Original File ( file ) ĊĊĠĠĠĠĠĠĠ Ġon File Assigned ( transaction Original File !! , Ġtarget FileName ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! validate File ( transaction Original File !! )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear Transactional Files () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Type Ġ= ĠOperation Types . DO _ NOTH ING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcreate Transaction Dir For Processed Files () ĊĊĠĠĠĠĠĠĠ Ġtransaction Original File !!. name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete () Ġ{ ĊĠĠĠĠĠĠĠ Ġoperation Type Ġ= ĠOperation Types . DELETE ĊĠĠĠĠĠĠĠ Ġon File Delete () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġfinalize Operation () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( operation Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation Types . ASSIGN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinalize Assign Operation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation Types . DELETE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinalize Delete Operation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation Types . DO _ NOTH ING Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfinalize Assign Operation () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( model Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear Transactional Files () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpreprocess File ( transaction Original File !! ) ĊĠĠĠĠĠĠĠ Ġdelete P ere vious Files If Exist () ĊĠĠĠĠĠĠĠ Ġcreate Target Dir Where Files Will Be Stored () ĊĠĠĠĠĠĠĠ Ġmove Transactional Processed Files To Target Dir () ĊĠĠĠĠĠĠĠ Ġmove Original Transaction File To Target Dir () ĊĠĠĠĠĠĠĠ Ġclear Transactional Files () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfinalize Delete Operation (){ ĊĠĠĠĠĠĠĠ Ġdelete P ere vious Files If Exist () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġcreate Transaction Original File ( file Item : ĠFile Item ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file Item . isIn Memory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp File Ġ= ĠFiles . create TempFile ("${ System . currentTimeMillis ()} -", Ġ". tmp "). to File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Item . write ( temp File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Original File Ġ= Ġtemp File ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( error : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Original File ?. delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Item . delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdisk File Item Ġ= Ġfile Item Ġas ĠDisk File Item ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Original File Ġ= Ġdisk File Item . store Location ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Transaction Original File ( file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemp File Ġ= ĠFiles . create TempFile ("${ System . currentTimeMillis ()} -", Ġ". tmp "). to File () ĊĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= ĠFileInputStream ( file ) ĊĠĠĠĠĠĠĠ Ġval ĠoutputStream Ġ= ĠFileOutputStream ( temp File ) ĊĠĠĠĠĠĠĠ Ġcopy InputStream To OutputStream ( inputStream , ĠoutputStream ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Transaction Dir For Processed Files () Ġ{ ĊĠĠĠĠĠĠĠ Ġtransaction Dir For Processed Files Ġ= ĠFiles . create Temp Directory ("${ System . currentTimeMillis ()} - "). to File () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Empty File Where Pre processed File Will Be Stored ( namespace : ĠString ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġtransaction Original File !!. name ĊĠĠĠĠĠĠĠ Ġval Ġfile To Return Ġ= ĠFile ( transaction Dir For Processed Files , Ġ"/ $ namespace /${ fileName }") ĊĠĠĠĠĠĠĠ Ġif Ġ(! file To Return . parent File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile To Return . parent File . mkdir s () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! file To Return . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile To Return . createNew File () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfile To Return ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Target Dir Where Files Will Be Stored (){ ĊĠĠĠĠĠĠĠ ĠFile ( prepare Repository Path ()) ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Transactional Files () Ġ{ ĊĠĠĠĠĠĠĠ Ġtransaction Original File ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtransaction Dir For Processed Files ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . delete Re cursively () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfile Item Being Processed ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete P ere vious Files If Exist (){ ĊĠĠĠĠĠĠĠ Ġval Ġfolder Ġ= ĠFile ( prepare Repository Path ()) ĊĠĠĠĠĠĠĠ Ġfolder . list Files ()?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . delete Re cursively () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepare Repository Path (): ĠString { ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ prepare BasePath () }/${ prepare Id Path () }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepare BasePath (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ base Upload Path /$ model Name /$ propertyName " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepare Id Path (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġ"$ model Id ". length ĊĠĠĠĠĠĠĠ Ġval Ġfirst Missing Chars Size Ġ= Ġ 9 Ġ- Ġlength ĊĊĠĠĠĠĠĠĠ Ġval Ġfirst Chars Ġ= ĠChar Array ( first Missing Chars Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' 0 ' ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstring Without Del ime ters Ġ= Ġ"${ String ( first Chars )} ${ model Id }" ĊĊĠĠĠĠĠĠĠ Ġval Ġfinal String Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 Ġuntil Ġ 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal String . append ( string Without Del ime ters [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( index Ġ+ Ġ 1 ) Ġ% Ġ 3 Ġ== Ġ 0 Ġ&& Ġ( index Ġ+ Ġ 1 Ġ!= Ġ 9 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal String . append ('/') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfinal String . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmove Original Transaction File To Target Dir () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtarget File Ġ= ĠFile ("${ prepare Repository Path () }/ original /${ target FileName }") ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġtarget File . parent File ĊĠĠĠĠĠĠĠ Ġif Ġ(! parent . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . mkdir s () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! target File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// target File . createNew File () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln (" moving ") ĊĠĠĠĠĠĠĠ Ġprintln ( transaction Original File !!. absolute Path ) ĊĠĠĠĠĠĠĠ Ġtransaction Original File !!. rename To ( target File ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmove Transactional Processed Files To Target Dir (){ ĊĠĠĠĠĠĠĠ Ġval Ġtarget File Ġ= ĠFile ( prepare Repository Path ()). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. toString () ĊĠĠĠĠĠĠĠ Ġtransaction Dir For Processed Files !!. list Files ()?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove File ( target File , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmove File ( depth : ĠString , Ġfile : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . list Files (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove File ( depth Ġ+ Ġ"/ ${ file . name }", Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( file . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( depth ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile To MoveTo Ġ= ĠFile ( depth Ġ+ Ġ"/ ${ file . name } "). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . createNew File () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . rename To ( file To MoveTo ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcopy InputStream To OutputStream (` in `: ĠInputStream , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout : ĠOutputStream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( 1 0 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġn : ĠInt ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn Ġ= Ġ` in `. read ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( n Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . write ( buffer , Ġ 0 , Ġn ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn Ġ= Ġ` in `. read ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` in `. close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ