<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_overlapping_ranges(self, provided_partition_key_ranges):
 """Gets the partition key ranges overlapping the provided ranges :param list provided_partition_key_ranges: List of partition key ranges. :return: List of partition key ranges, where each is a dict. :rtype: list """


        if isinstance(provided_partition_key_ranges, routing_range._Range):
            return self.get_overlapping_ranges([provided_partition_key_ranges])

        minToPartitionRange = {}

        sortedLow = [(r.min, not r.isMinInclusive) for r in self._orderedRanges]
        sortedHigh = [(r.max, r.isMaxInclusive) for r in self._orderedRanges]

        for providedRange in provided_partition_key_ranges:
            minIndex = bisect.bisect_right(sortedLow, (providedRange.min, not providedRange.isMinInclusive))
            if minIndex > 0: minIndex = minIndex - 1
                
            maxIndex = bisect.bisect_left(sortedHigh, (providedRange.max, providedRange.isMaxInclusive))
            if maxIndex >= len(sortedHigh):
                maxIndex = maxIndex - 1
            
            for i in xrange(minIndex, maxIndex + 1):
                if routing_range._Range.overlaps(self._orderedRanges[i], providedRange):
                    minToPartitionRange[self._orderedPartitionKeyRanges[i][_PartitionKeyRange.MinInclusive]] = self._orderedPartitionKeyRanges[i]


        overlapping_partition_key_ranges = list(minToPartitionRange.values())

        def getKey(r):
            return r[_PartitionKeyRange.MinInclusive]
        overlapping_partition_key_ranges.sort(key = getKey)
        return overlapping_partition_key_ranges