<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _push_frontier(self, early_frontier: Dict[ops.Qid, int], late_frontier: Dict[ops.Qid, int], update_qubits: Iterable[ops.Qid] = None ) -> Tuple[int, int]: """Inserts moments to separate two frontiers. After insertion n_new moments, the following holds: for q in late_frontier: early_frontier[q] <= late_frontier[q] + n_new for q in update_qubits: early_frontier[q] the identifies the same moment as before (but whose index may have changed if this moment is after those inserted). Args: early_frontier: The earlier frontier. For qubits not in the later frontier, this is updated to account for the newly inserted moments. late_frontier: The later frontier. This is not modified. update_qubits: The qubits for which to update early_frontier to account for the newly inserted moments. Returns: (index at which new moments were inserted, how many new moments were inserted) if new moments were indeed inserted. (0, 0) otherwise. """

        if update_qubits is None:
            update_qubits = set(early_frontier).difference(late_frontier)
        n_new_moments = (max(early_frontier.get(q, 0) - late_frontier[q]
                             for q in late_frontier)
                         if late_frontier else 0)
        if n_new_moments > 0:
            insert_index = min(late_frontier.values())
            self._moments[insert_index:insert_index] = (
                [ops.Moment()] * n_new_moments)
            for q in update_qubits:
                if early_frontier.get(q, 0) > insert_index:
                    early_frontier[q] += n_new_moments
            return insert_index, n_new_moments
        return (0, 0)