package Ġme . mark hc . hang out bot . utilities Ċ Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠTime Formatter Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġto Short Duration String ( ms : ĠLong ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ("% 0 2 d :% 0 2 d :% 0 2 d ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . MILLISECONDS . to Hours ( ms ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . MILLISECONDS . to Minutes ( ms ) Ġ- ĠTimeUnit . HOUR S . to Minutes ( TimeUnit . MILLISECONDS . to Hours ( ms )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . MILLISECONDS . to Seconds ( ms ) Ġ- ĠTimeUnit . MIN UTES . to Seconds ( TimeUnit . MILLISECONDS . to Minutes ( ms ))) ĊĊĠĠĠĠĠĠĠ Ġfun Ġto Long Duration String ( ms : ĠLong ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunits Ġ= Ġde compose ( ms ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġunits . filter Ġ{ Ġit . first Ġ!= Ġ 0 L Ġ}. join ToString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ it . first } Ġ${ it . second }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. if Blank Ġ{ Ġ" 0 Ġseconds " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġde compose ( ms : ĠLong ): ĠList < Pair < Long , ĠString >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdays Ġ= ĠTimeUnit . MILLISECONDS . to Days ( ms ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhours Ġ= ĠTimeUnit . MILLISECONDS . to Hours ( ms ) Ġ- Ġdays Ġ* Ġ 2 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġminutes Ġ= ĠTimeUnit . MILLISECONDS . to Minutes ( ms ) Ġ- Ġhours Ġ* Ġ 6 0 Ġ- Ġdays Ġ* Ġ 1 4 4 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseconds Ġ= ĠTimeUnit . MILLISECONDS . to Seconds ( ms ) Ġ- Ġminutes Ġ* Ġ 6 0 Ġ- Ġhours Ġ* Ġ 3 6 0 0 Ġ- Ġdays Ġ* Ġ 8 6 4 0 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdays Ġto Ġ" day ${ if Ġ( days Ġ!= Ġ 1 L ) Ġ" s " Ġelse Ġ"" }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhours Ġto Ġ" hour ${ if Ġ( hours Ġ!= Ġ 1 L ) Ġ" s " Ġelse Ġ"" }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġminutes Ġto Ġ" minute ${ if Ġ( minutes Ġ!= Ġ 1 L ) Ġ" s " Ġelse Ġ"" }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseconds Ġto Ġ" second ${ if Ġ( seconds Ġ!= Ġ 1 L ) Ġ" s " Ġelse Ġ"" }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }