import Ġcom . be ust . kl ax on . JsonObject Ċ import Ġio . prometheus . client . Counter Ċ import Ġio . prometheus . client . Summary Ċ import Ġkotlinx . coroutines .* Ċ import Ġorg . apache . hadoop . hbase . util . Bytes Ċ import Ġorg . apache . kafka . clients . consumer . Consumer Record Ċ import Ġorg . apache . kafka . clients . consumer . Consumer Records Ċ import Ġorg . apache . kafka . clients . consumer . Kafka Consumer Ċ import Ġorg . apache . kafka . clients . consumer . Offset And Metadata Ċ import Ġorg . apache . kafka . common . Topic Partition Ċ import Ġuk . gov . d wp . data works . logging . Data works Logger Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġkotlin . time . Experimental Time Ċ Ċ @ Experimental Time Ċ class ĠList Processor ( validator : ĠValidator , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġconverter : ĠConverter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdl q Timer : ĠSummary , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdl q Retries : ĠCounter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdl q Failures : ĠCounter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġbatch Timer : ĠSummary , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġbatch Failures : ĠCounter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġrecord Suc cesses : ĠCounter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġrecord Failures : ĠCounter ): ĊĠĠĠ ĠBase Processor ( validator , Ġconverter , Ġdl q Timer , Ġdl q Retries , Ġdl q Failures ) Ġ{ ĊĊĠĠĠ Ġfun Ġprocess Records ( hbase : ĠH base Client , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsumer : ĠKafka Consumer < ByteArray , ĠByteArray >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata Client : ĠMetadata Store Client , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs 3 Service : ĠCor por ate Storage Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanifest Service : ĠManifest Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparser : ĠMessage Parser , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecords : ĠConsumer Records < ByteArray , ĠByteArray >) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuccessful Payload s Ġ= Ġmutable ListOf < H base Payload >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecords . partitions (). forEach Ġ{ Ġpartition Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimer Ġ= Ġbatch Timer . labels ( partition . topic (), Ġ"${ partition . partition ()} "). start Timer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpartition Records Ġ= Ġrecords . records ( partition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpayload s Ġ= Ġpayload s ( partition Records , Ġparser ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Utils . qualified TableName ( partition . topic ()) ?. let Ġ{ Ġtable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs 3 Ok Ġ= Ġasync Ġ{ Ġput In S 3 ( s 3 Service , Ġtable , Ġpayload s ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh base Ok Ġ= Ġasync Ġ{ Ġput In H base ( hbase , Ġtable , Ġpayload s ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmetadata Store Ok Ġ= Ġasync Ġ{ Ġput In Metadata Store ( metadata Client , Ġpayload s ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s 3 Ok . await () Ġ&& Ġh base Ok . await () Ġ&& Ġmetadata Store Ok . await ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Position Ġ= Ġlast Position ( partition Records ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Batch Ġsucceeded , Ġcommit ting Ġoffset ", Ġ" topic " Ġto Ġpartition . topic (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" partition " Ġto Ġ"${ partition . partition () }", Ġ" offset " Ġto Ġ"$ last Position ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsumer . commit Sync ( map Of ( partition Ġto ĠOffset And Metadata ( last Position Ġ+ Ġ 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Successful Put s ( table , Ġpayload s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccessful Payload s . addAll ( payload s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . observe Duration () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecord Suc cesses . labels ( partition . topic (), Ġ"${ partition . partition () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inc ( payload s . size . toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Commit ted Offset ( consumer , Ġpartition )?. let Ġ{ Ġconsumer . seek ( partition , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Batch Ġfailed , Ġnot Ġcommit ting Ġoffset , Ġreset ting Ġposition Ġto Ġlast Ġcommit ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" topic " Ġto Ġpartition . topic (), Ġ" partition " Ġto Ġ"${ partition . partition () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbatch Failures . labels ( partition . topic (), Ġ"${ partition . partition ()} "). inc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecord Failures . labels ( partition . topic (), Ġ"${ partition . partition () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inc ( payload s . size . toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Failed Put s ( table , Ġpayload s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Manifest ( manifest Service , Ġsuccessful Payload s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġput In Metadata Store ( metadata Client : ĠMetadata Store Client , Ġpayload s : ĠList < H base Payload >) Ġ= ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata Client . record Batch ( payload s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Failed Ġto Ġput Ġbatch Ġinto Ġmetadata store ", Ġe , Ġ" error " Ġto Ġ( e . message Ġ?: Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġput In S 3 ( s 3 Service : ĠCor por ate Storage Service , Ġtable : ĠString , Ġpayload s : ĠList < H base Payload >) Ġ= ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs 3 Service . put Batch ( table , Ġpayload s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Failed Ġto Ġput Ġbatch Ġinto Ġs 3 ", Ġe , Ġ" error " Ġto Ġ( e . message Ġ?: Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġput In H base ( hbase : ĠH base Client , Ġtable : ĠString , Ġpayload s : ĠList < H base Payload >) Ġ= ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġh base . put List ( table , Ġpayload s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Failed Ġto Ġput Ġbatch Ġinto Ġh base ", Ġe , Ġ" error " Ġto Ġ( e . message Ġ?: Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġlog Failed Put s ( table : ĠString , Ġpayload s : ĠList < H base Payload >) Ġ= ĊĠĠĠĠĠĠĠ Ġpayload s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Failed Ġto Ġput Ġrecord ", Ġ" table " Ġto Ġtable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" key " Ġto Ġtext Utils . print able Key ( it . key ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" version " Ġto Ġ"${ it . version }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" version _ created _ from " Ġto Ġit . version Created From , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" version _ raw " Ġto Ġit . version Raw ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġput Manifest ( manifest Service : ĠManifest Service , Ġpayload s : ĠList < H base Payload >) Ġ= ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Config . Manifest . write Manifest s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanifest Service . put Manifest File ( payload s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Failed Ġto Ġput Ġmanifest Ġfile Ġin Ġto Ġs 3 ", Ġe , Ġ" error " Ġto Ġ( e . message Ġ?: Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġlog Successful Put s ( table : ĠString , Ġpayload s : ĠList < H base Payload >) Ġ{ ĊĠĠĠĠĠĠĠ Ġpayload s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Put Ġrecord ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" table " Ġto Ġtable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" key " Ġto Ġtext Utils . print able Key ( it . key ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" version " Ġto Ġ"${ it . version }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" version _ created _ from " Ġto Ġit . version Created From , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" version _ raw " Ġto Ġit . version Raw , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" size " Ġto Ġ"${ it . record . serialized Value Size () }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" time _ since _ last _ modified " Ġto Ġ"${ ( it . put Time Ġ- Ġit . time On Queue ) Ġ/ Ġ 1 0 0 0 }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlast Commit ted Offset ( consumer : ĠKafka Consumer < ByteArray , ĠByteArray >, Ġpartition : ĠTopic Partition ): ĠLong ? Ġ= ĊĠĠĠĠĠĠĠ Ġconsumer . committed ( set Of ( partition )) ?. get ( partition )?. offset () ĊĊĠĠĠ Ġprivate Ġfun Ġlast Position ( partition Records : ĠMutable List < Consumer Record < ByteArray , ĠByteArray >>) Ġ= ĊĠĠĠĠĠĠĠ Ġpartition Records [ partition Records . size Ġ- Ġ 1 ]. offset () ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġpayload s ( records : ĠList < Consumer Record < ByteArray , ĠByteArray >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparser : ĠMessage Parser ): ĠList < H base Payload > Ġ= ĊĠĠĠĠĠĠĠ Ġrecords . map NotNull Ġ{ Ġrecord Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecord As Json ( record )?. let Ġ{ Ġjson Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( un formatted Id , Ġformatted Key ) Ġ= Ġparser . generate Key From Record Body ( json ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqualified Id Ġ= Ġun formatted Id Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( formatted Key . isNotEmpty ()) Ġh base Payload ( json , Ġqualified Id , Ġformatted Key , Ġrecord ) Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġh base Payload ( json : ĠJsonObject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun formatted Id : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformatted Key : ĠByteArray , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecord : ĠConsumer Record < ByteArray , ĠByteArray >): ĠH base Payload Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( timestamp , Ġsource ) Ġ= Ġconverter . getLast Modified Timestamp ( json ) ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġjson [" message "] Ġas ĠJsonObject ĊĠĠĠĠĠĠĠ Ġmessage [" timestamp _ created _ from "] Ġ= Ġsource ĊĠĠĠĠĠĠĠ Ġval Ġput Time Ġ= ĠDate () ĊĠĠĠĠĠĠĠ Ġjson [" put _ time "] Ġ= ĠSimpleDateFormat (" yyyy - MM - dd ĠHH : mm : ss . SS S "). format ( put Time ) ĊĊĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġconverter . getTimestamp As Long ( timestamp ) ĊĠĠĠĠĠĠĠ Ġval Ġtime On Queue Ġ= Ġjson . string (" timestamp ") ?. let Ġ{ Ġconverter . getTimestamp As Long ( it ) Ġ} Ġ?: Ġversion ĊĊĠĠĠĠĠĠĠ Ġreturn ĠH base Payload ( formatted Key , ĠBytes . to Bytes ( json . toJson String ()), Ġun formatted Id , Ġversion , Ġsource , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp , Ġrecord , Ġput Time . time , Ġtime On Queue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtext Utils Ġ= ĠText Utils () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠData works Logger . getLogger ( List Processor :: class ) ĊĠĠĠ Ġ} Ċ } Ċ