def merge_dicts(d1: dict, d2: dict) -> dict:
    """Merge nested dictionaries in depth.

    :param d1: First dictionary to merge
    :param d2: Second dictionary to merge, takes precedence over the first
    :return: A dictionary merged from d1 and d2
    """
    d3 = {}
    d1keys = set(d1)
    d2keys = set(d2)

    for k in d1keys - d2keys:
        d3[k] = d1[k]

    for k in d2keys - d1keys:
        d3[k] = d2[k]

    for k in d1keys & d2keys:
        v1 = d1[k]
        v2 = d2[k]
        if isinstance(v1, dict) and isinstance(v2, dict):
            d3[k] = merge_dicts(v1, v2)
        else:
            d3[k] = v2

    return d3