```python
def split_segments(path: str) -> list:
    if not isinstance(path, str) or not path or path[0] != '/':
        raise ValueError("Invalid path")
    return path[1:].split('/')

def first_route(patterns: list, path: str) -> int:
    if not isinstance(patterns, list) or not patterns or not path:
        raise ValueError("Invalid input")
    for i, pattern in enumerate(patterns):
        if not isinstance(pattern, str) or not pattern:
            raise ValueError("Invalid pattern")
        if pattern[0] == '*':
            if '**' in pattern:
                raise ValueError("Pattern holds '**' more than once")
            return i
        if pattern[-1] == '**':
            raise ValueError("Pattern holds '**' more than once")
        if pattern[0] == ':':
            pattern = pattern[1:]
        if pattern[-1] == ':':
            pattern = pattern[:-1]
        if pattern in path:
            return i
    return -1

def match_route(pattern: str, path: str) -> dict | None:
    if not isinstance(pattern, str) or not pattern:
        raise ValueError("Invalid pattern")
    if not isinstance(path, str) or not path:
        raise ValueError("Invalid path")
    if path == '/':
        return {}
    segments = split_segments(path)
    if len(segments) == 1 and segments[0] == '':
        return {}
    if len(segments) < 1:
        raise ValueError("Invalid path")
    if not pattern.startswith('/'):
        raise ValueError("Pattern does not start with a slash")
    if not pattern.endswith('/'):
        raise ValueError("Pattern does not end with a slash")
    if path.startswith('/'):
        path = path[1:]
    if path.endswith('/'):
        path = path[:-1]
    if path in pattern:
        return match_route(pattern[path], path)
    if pattern.startswith(':'):
        pattern = pattern[1:]
        pattern = pattern.split('/')
        for i, segment in enumerate(pattern):
            if not segment.isalnum() and not segment[0].isalpha() and not segment[0].isunderscore():
                raise ValueError("Capture name is not a valid name")
            if segment in segments:
                return {segment: segments[segments.index(segment)]}
    if pattern.startswith('*'):
        pattern = pattern[1:]
        pattern = pattern.split('/')
        for i, segment in enumerate(pattern):
            if not segment.isalnum() and not segment[0].isalpha() and not segment[0].isunderscore():
                raise ValueError("Capture name is not a valid name")
            if segment in segments:
                return {segment: segments[segments.index(segment)]}
        return None
    if pattern.startswith('**'):
        pattern = pattern[2:]
        pattern = pattern.split('/')
        for i, segment in enumerate(pattern):
            if not segment.isalnum() and not segment[0].isalpha() and not segment[0].isunderscore():
                raise ValueError("Capture name is not a valid name")
            if segment in segments:
                return {segment: segments[segments.index(segment)]}
        return None
    raise ValueError("Invalid pattern")
```