package Ġorg . jetbrains . dok ka Ċ Ċ import Ġjava . net . URI ĊĊ Ċ fun ĠURI . relative To ( uri : ĠURI ): ĠURI Ġ{ ĊĠĠĠ Ġ// ĠNormalize Ġpaths Ġto Ġremove Ġ. Ġand Ġ.. Ġsegments ĊĠĠĠ Ġval Ġbase Ġ= Ġuri . normalize () ĊĠĠĠ Ġval Ġchild Ġ= Ġthis . normalize () ĊĊĠĠĠ Ġfun ĠStringBuilder . append RelativePath () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSplit Ġpaths Ġinto Ġsegments ĊĠĠĠĠĠĠĠ Ġvar Ġb Parts Ġ= Ġbase . path . split ('/ '). drop Last While Ġ{ Ġit . isEmpty () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġc Parts Ġ= Ġchild . path . split ('/ '). drop Last While Ġ{ Ġit . isEmpty () Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDis card Ġtrailing Ġsegment Ġof Ġbase Ġpath ĊĠĠĠĠĠĠĠ Ġif Ġ( b Parts . isNotEmpty () Ġ&& Ġ! base . path . endsWith ("/ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb Parts Ġ= Ġb Parts . drop Last ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCompute Ġcommon Ġprefix ĊĠĠĠĠĠĠĠ Ġval Ġcommon Parts Size Ġ= Ġb Parts . zip ( c Parts ). take While Ġ{ Ġ( base Part , Ġchild Part ) Ġ-> Ġbase Part Ġ== Ġchild Part Ġ}. count () ĊĠĠĠĠĠĠĠ Ġb Parts . drop ( common Parts Size ). join To ( this , Ġseparator Ġ= Ġ"") Ġ{ Ġ"../ " Ġ} ĊĠĠĠĠĠĠĠ Ġc Parts . drop ( common Parts Size ). join To ( this , Ġseparator Ġ= Ġ"/") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠURI . create ( build String Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( base . path Ġ!= Ġchild . path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend RelativePath () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġchild . raw Query ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" ?") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġchild . raw Fragment ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("# ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) Ċ }