; host UNDEFINED
; port UNDEFINED
; path-abempty UNDEFINED
; query UNDEFINED
; fragment UNDEFINED

host        = IP-literal / IPv4address / reg-name

IP-literal = "[" ( IPv6address / IPvFuture  ) "]"

IPvFuture  = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )

IPv6address =                            6( h16 ":" ) ls32
          /                       "::" 5( h16 ":" ) ls32
          / [               h16 ] "::" 4( h16 ":" ) ls32
          / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
          / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
          / [ *3( h16 ":" ) h16 ] "::"    h16 ":"   ls32
          / [ *4( h16 ":" ) h16 ] "::"              ls32
          / [ *5( h16 ":" ) h16 ] "::"              h16
          / [ *6( h16 ":" ) h16 ] "::"

ls32        = ( h16 ":" h16 ) / IPv4address
          ; least-significant 32 bits of address

h16         = 1*4HEXDIG
          ; 16 bits of address represented in hexadecimal


IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet

dec-octet   = DIGIT                 ; 0-9
          / %x31-39 DIGIT         ; 10-99
          / "1" 2DIGIT            ; 100-199
          / "2" %x30-34 DIGIT     ; 200-249
          / "25" %x30-35          ; 250-255


reg-name    = *( unreserved / pct-encoded / sub-delims )

pct-encoded   = "%" HEXDIG HEXDIG

HEXDIG         =  DIGIT / "A" / "B" / "C" / "D" / "E" / "F"

DIGIT          =  %x30-39
                                ; 0-9

ALPHA          =  %x41-5A / %x61-7A   ; A-Z / a-z

unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
                 / "*" / "+" / "," / ";" / "="

path-abempty  = *( "/" segment )
segment       = *pchar
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"

port        = *DIGIT


query       = *( pchar / "/" / "?" )


fragment    = *( pchar / "/" / "?" )

