def METHOD_NAME(cls, op):
    if has_unknown_shape(*op.inputs):
        yield
    inputs = yield from unify_chunks(
        *[(input, list(range(input.ndim))[::-1]) for input in op.inputs]
    )
    output = op.outputs[0]
    chunk_shapes = [
        t.chunk_shape if hasattr(t, "chunk_shape") else t for t in inputs
    ]
    out_chunk_shape = broadcast_shape(*chunk_shapes)
    out_chunks = []
    nsplits = [[np.nan] * shape for shape in out_chunk_shape]
    get_index = lambda idx, t: tuple(
        0 if t.nsplits[i] == (1,) else ix for i, ix in enumerate(idx)
    )
    for out_idx in itertools.product(*(map(range, out_chunk_shape))):
        in_chunks = [
            t.cix[get_index(out_idx[-t.ndim :], t)] if t.ndim != 0 else t.chunks[0]
            for t in inputs
        ]
        out_chunk = (
            op.copy()
            .reset_key()
            .new_chunk(
                in_chunks,
                shape=in_chunks[1].shape,
                order=output.order,
                index=out_idx,
            )
        )
        out_chunks.append(out_chunk)
        for i, idx, s in zip(itertools.count(0), out_idx, out_chunk.shape):
            nsplits[i][idx] = s
    new_op = op.copy()
    return new_op.new_tensors(
        op.inputs,
        output.shape,
        order=output.order,
        chunks=out_chunks,
        nsplits=nsplits,
    )