code: def ParseURIFromKeyValues(self, data, separator, uri_key):
      
      precondition.AssertType(data, Text)
      precondition.AssertType(separator, Text)
  
      kv_entries = KeyValueParser(kv_sep=separator).ParseEntries(data)
      spaced_entries = FieldParser().ParseEntries(data)
  
      uris = []
      check_uri_on_next_line = False
      for kv_entry, sp_entry in zip(kv_entries, spaced_entries):
        for k, v in iteritems(kv_entry):
          # This line could be a URL if a) from  key:value, value is empty OR
          # b) if separator is : and first character of v starts with /.
          if (check_uri_on_next_line and
              (not v or (separator == ":" and v[0].startswith("/")))):
            uris.append(sp_entry[0])
          else:
            check_uri_on_next_line = False
            if k.lower().startswith(uri_key) and v:
              check_uri_on_next_line = True
              uris.append(v[0])  # v is a list
  
      return uris
docs: Parse key/value formatted source listing and return potential URLs.
  
      The fundamental shape of this format is as follows:
      key: value   # here : = separator
      key : value
      URI: [URL]   # here URI = uri_key
        [URL]      # this is where it becomes trickey because [URL]
        [URL]      # can contain 'separator' specially if separator is :
      key: value
  
      The key uri_key is of interest to us and since the next line
      in the config could contain another [URL], we need to keep track of context
      when we hit uri_key  to be able to check if the next line(s)
      have more [URL].
  
      Args:
        data: unprocessed lines from a file
        separator: how the key/value pairs are seperated
        uri_key: starting name of the key containing URI.
  
      Returns:
        A list of potential URLs found in data