package Ġutil Ċ Ċ import Ġmain . Inv iter Ċ import Ġutil . Constants . Companion . EXCEPTION _ WRONG _ INPUT _ FORMAT _ DEFAULT _ USED Ċ import Ġutil . Constants . Companion . INFO _ ENTER _ DISTANCE Ċ import Ġutil . Constants . Companion . INFO _ ENTER _ LAT IT UDE Ċ import Ġutil . Constants . Companion . INFO _ ENTER _ LONG IT UDE Ċ import Ġjava . io . File Ċ import Ġjava . lang . Math . to Radians Ċ import Ġkotlin . math .* Ċ Ċ private Ġconst Ġval ĠDIST ANCE _ KM _ DEFAULT Ġ= Ġ 1 0 0 . 0 Ċ private Ġconst Ġval ĠOFF ICE _ LAT IT UDE _ DEFAULT Ġ= Ġ 5 3 . 3 3 9 4 2 8 Ċ private Ġconst Ġval ĠOFF ICE _ LONG IT UDE _ DEFAULT Ġ= Ġ- 6 . 2 5 7 6 6 4 Ċ private Ġconst Ġval ĠFIL ENAME _ OUTPUT Ġ= Ġ" customers _ within _ 1 0 0 _ km . txt " Ċ private Ġconst Ġval ĠE AR TH _ RADIUS _ M Ġ= Ġ 6 3 7 8 1 3 7 Ċ Ċ class ĠUtils Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġread Inputs (): ĠList < Double > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint ("$ INFO _ ENTER _ DISTANCE [$ DISTANCE _ KM _ DEFAULT ] Ġ-> Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Input Ġ= Ġread Double ( DISTANCE _ KM _ DEFAULT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint ("$ INFO _ ENTER _ LAT IT UDE [$ OFF ICE _ LAT IT UDE _ DEFAULT ] Ġ-> Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlat Input Ġ= Ġread Double ( OFF ICE _ LAT IT UDE _ DEFAULT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint ("$ INFO _ ENTER _ LONG IT UDE [$ OFF ICE _ LONG IT UDE _ DEFAULT ] Ġ-> Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlong Input Ġ= Ġread Double ( OFF ICE _ LONG IT UDE _ DEFAULT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( distance Input , Ġlat Input , Ġlong Input ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< T > Ġcreate Output ( input : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy File Ġ= ĠFile ( FILENAME _ OUTPUT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy File . buffered Writer (). use Ġ{ Ġout Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= ĠConstants . INFO _ NO _ CUSTOMER _ INV IT ED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( input ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInv iter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! input . in Range Customers . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( customer Ġin Ġinput . in Range Customers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġ" Customer ĠID : Ġ${ customer . userId } Ġ- ĠCustomer ĠName : Ġ${ customer . name }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . write ("${ result }\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . write ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Great Circle Distance By Ha vers ine ( lat 1 : ĠDouble , Ġlon 1 : ĠDouble , Ġlat 2 : ĠDouble , Ġlon 2 : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlat Rad 1 Ġ= Ġto Radians ( lat 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlat Rad 2 Ġ= Ġto Radians ( lat 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Lat Ġ= Ġto Radians ( lat 2 Ġ- Ġlat 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Long Ġ= Ġto Radians ( lon 2 Ġ- Ġlon 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġsin ( d Lat Ġ/ Ġ 2 ) Ġ* Ġsin ( d Lat Ġ/ Ġ 2 ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcos ( lat Rad 1 ) Ġ* Ġcos ( lat Rad 2 ) Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsin ( d Long Ġ/ Ġ 2 ) Ġ* Ġsin ( d Long Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġ 2 Ġ* Ġatan 2 ( sqrt ( a ), Ġsqrt ( 1 Ġ- Ġa )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( EAR TH _ RADIUS _ M Ġ* Ġc Ġ/ Ġ 1 0 0 0 ). format Double () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġread Double ( defaultValue : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= ĠdefaultValue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġread Line () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġif Ġ(! line . isNull Or Blank ()) Ġline . toDouble () Ġelse ĠdefaultValue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( number FormatException : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println ( EXCEPTION _ WRONG _ INPUT _ FORMAT _ DEFAULT _ USED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }