package Ġnl . kn aw . h uc . di . rd . tag . tag ml . tokenizer Ċ Ċ import Ġlamb d ada . parse c . parser .* Ċ Ċ object ĠURL Parser Ġ{ ĊĊĠĠĠ Ġprivate Ġfun Ġ< A , ĠB > ĠPair < A , ĠB >. concatenate Le aves (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġleft String Ġ= Ġas String ( first ) ĊĠĠĠĠĠĠĠ Ġval Ġright String Ġ= Ġas String ( second ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ left String $ right String " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< A > Ġas String ( obj : ĠA ): ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( obj ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPair < *, Ġ*> Ġ-> Ġobj . concatenate Le aves () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList < *> ĠĠĠ Ġ-> Ġobj . join ToString ("") Ġ{ Ġas String ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĠĠĠĠĠĠĠĠĠ Ġ-> Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠ Ġ-> Ġobj . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdigit Ġ= Ġchar In ( Char Range (' 0 ', Ġ' 9 ')) ĊĠĠĠ Ġval Ġdigits Ġ= Ġdigit . rep ĊĠĠĠ Ġprivate Ġval Ġport Ġ= Ġdigits ĊĠĠĠ Ġprivate Ġval Ġlow alpha Ġ= Ġchar In ( Char Range (' a ', Ġ' z ')) ĊĠĠĠ Ġprivate Ġval Ġhigh alpha Ġ= Ġchar In ( Char Range (' A ', Ġ' Z ')) ĊĠĠĠ Ġprivate Ġval Ġalpha Ġ= Ġlow alpha Ġor Ġhigh alpha ĊĠĠĠ Ġprivate Ġval Ġal ph adig it Ġ= Ġalpha Ġor Ġdigit ĊĠĠĠ Ġval Ġdomain label Ġ= Ġ( alph adig it Ġthen Ġ( alph adig it Ġor Ġchar ('- ')). opt rep Ġthen Ġal ph adig it ) ĊĠĠĠ Ġprivate Ġval Ġto pl abel Ġ= Ġalpha Ġor Ġ( alpha Ġthen Ġ( alph adig it Ġor Ġchar ('- ')). opt rep Ġthen Ġal ph adig it ) ĊĠĠĠ Ġval Ġhostname Ġ= Ġ( domain label Ġthen Ġchar ('. ')). opt rep Ġthen Ġto pl abel ĊĠĠĠ Ġprivate Ġval Ġhost number Ġ= Ġdigits Ġthen Ġchar ('.') Ġthen Ġdigits Ġthen Ġchar ('.') Ġthen Ġdigits Ġthen Ġchar ('.') Ġthen Ġdigits ĊĠĠĠ Ġprivate Ġval Ġhost Ġ= Ġhostname Ġor Ġhost number ĊĠĠĠ Ġval Ġhost port Ġ= Ġhost Ġthen Ġ( char (': ') Ġthen Ġport ). opt ĊĠĠĠ Ġprivate Ġval Ġhex Ġ= Ġdigit Ġor Ġchar In ( Char Range (' a ', Ġ' f ')) Ġor Ġchar In ( Char Range (' A ', Ġ' F ')) ĊĠĠĠ Ġprivate Ġval Ġescape Ġ= Ġchar ('% ') Ġthen Ġhex Ġthen Ġhex ĊĠĠĠ Ġprivate Ġval Ġsafe Ġ= Ġchar In (""" $- _. + """) ĊĠĠĠ Ġprivate Ġval Ġextra Ġ= Ġchar In (""" ! *' (), """) ĊĠĠĠ Ġprivate Ġval Ġun reserved Ġ= Ġalpha Ġor Ġdigit Ġor Ġsafe Ġor Ġextra ĊĠĠĠ Ġprivate Ġval Ġuchar Ġ= Ġun reserved Ġor Ġescape ĊĠĠĠ Ġprivate Ġval Ġh segment Ġ= Ġ( uchar Ġor Ġchar In (" ;: @ & =" )). opt rep ĊĠĠĠ Ġprivate Ġval Ġsearch Ġ= Ġh segment ĊĠĠĠ Ġprivate Ġval Ġh path Ġ= Ġh segment Ġthen Ġ( char ('/') Ġthen Ġh segment ). opt rep ĊĠĠĠ Ġprivate Ġval Ġhttp url Ġ= Ġ( string (" http ") Ġthen Ġchar (' s '). opt Ġthen Ġstring (" :// ") Ġthen Ġhost port Ġthen Ġ( char ('/') Ġthen Ġh path Ġthen Ġ( char (' ?') Ġthen Ġsearch ). opt ). opt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . concatenate Le aves () Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġf segment Ġ= Ġh segment ĊĠĠĠ Ġprivate Ġval Ġf path Ġ= Ġf segment Ġthen Ġ( char ('/') Ġthen Ġf segment ). opt rep ĊĠĠĠ Ġprivate Ġval Ġfile url Ġ= Ġ( string (" file :// ") Ġthen Ġ( host Ġor Ġstring (" localhost ")). opt Ġthen Ġchar ('/') Ġthen Ġf path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . concatenate Le aves () Ġ} ĊĊĠĠĠ Ġval Ġurl Ġ= Ġhttp url Ġor Ġfile url Ċ }