+
    Ŝi*                      a  0 t $ ^ RIHt ^ RIt^ RIHtHt ^ RIt^ RIHtH	t	H
t
HtHt ^ RIt^ RIHt ^ RIHtHtHtHt ^ RIHt ^ RIHtHtHtHtHtHtHtH t H!t!H"t"H#t# ^ R	I$H%t& ^ R
I'H(t( ^ RI)H*t* ^ RI+H,t,H-t- ^ RI.H/t/H0t0H1t1H2t2H3t3H4t4H5t5H6t6 ^ RI7H8t8H9t9 ^ RI:H;t;H<t<H=t=H>t> ^ RI?H@t@HAtAHBtB ^ RICHDtDHEtEHFtF ^ RIGHHtH ^ RIIHJtJ ^ RIKHLtL ^ RIMHNtN ^ RIOHPu HQtR ^ RISHTtUHVtVHWtW ^ RIXHYtYHZtZ ^ RI[H\t\H]t] ]'       d   ^ RI^H_t_H`t`Hata ^ RIbHctc ]"]P                  ,          teR]fR&   ]]g,          thR]fR&   / tiR]fR&   R R!R"R#R$R%/tjR&]iR'&   ]*! R(4       ! R) R!]]J4      4       tkR* R+ ltlR# ),    )annotationsN)lelt)TYPE_CHECKINGLiteralSelf	TypeAliasoverload)lib)VALID_CLOSEDIntervalIntervalMixinintervals_to_interval_bounds)NA)	ArrayLikeAxisIntDtypeIntervalClosedTypeNpDtypePositionalIndexerScalarIndexerSequenceIndexerSortKindTimeArrayLikenpt)function)IntCastingNaNError)
set_module)LossySetitemErrormaybe_upcast_numeric_to_64bit)is_float_dtypeis_integer_dtypeis_list_likeis_object_dtype	is_scalaris_string_dtypeneeds_i8_conversionpandas_dtype)CategoricalDtypeIntervalDtype)ABCDataFrameABCDatetimeIndexABCIntervalIndexABCPeriodIndex)is_valid_na_for_dtypeisnanotna)isintakeunique)ArrowExtensionArray)ExtensionArray)DatetimeArray)TimedeltaArray)arrayensure_wrapped_if_datetimelikeextract_array)check_array_indexergetitem_returns_view)invalid_comparisonunpack_zerodim_and_defer)CallableIteratorSequenceIndexr	   IntervalSideIntervalOrNAzdict[str, str]_interval_shared_docsklassIntervalArrayqualnamezarrays.IntervalArrayname a  
%(summary)s

Parameters
----------
data : array-like (1-dimensional)
    Array-like (ndarray, :class:`DateTimeArray`, :class:`TimeDeltaArray`) containing
    Interval objects from which to build the %(klass)s.
closed : {'left', 'right', 'both', 'neither'}, default 'right'
    Whether the intervals are closed on the left-side, right-side, both or
    neither.
dtype : dtype or None, default None
    If None, dtype will be inferred.
copy : bool, default False
    Copy the input data.
%(name)sverify_integrity : bool, default True
    Verify that the %(klass)s is valid.

Attributes
----------
left
right
closed
mid
length
is_empty
is_non_overlapping_monotonic
%(extra_attributes)s
Methods
-------
from_arrays
from_tuples
from_breaks
contains
overlaps
set_closed
to_tuples
%(extra_methods)s
See Also
--------
Index : The base pandas Index type.
Interval : A bounded slice-like interval; the elements of an %(klass)s.
interval_range : Function to create a fixed frequency IntervalIndex.
cut : Bin values into discrete Intervals.
qcut : Bin values into equal-sized Intervals based on rank or sample quantiles.

Notes
-----
See the `user guide
<https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html#intervalindex>`__
for more.

%(examples)sclasszpandas.arraysc                    a  ] tR t^t$ RtRt]P                  ;tt	]
R R l4       tR]R&   R]R&   R]R	&   RR R llt]R R l4       t]RR R ll4       t]RR
RR/R R ll4       t]R R l4       t]P(                  ! R4      ]R&   ]RR R ll4       t]P(                  ! R4      ]R&   ]RR R ll4       t]P(                  ! R 4      ]R!&   ]RR" R# ll4       t]R$ R% l4       tR& R' lt]
R( R) l4       t]
R* R+ l4       t]
R, R- l4       tR. R/ ltR0 R1 lt] R2 R3 l4       t!] R4 R5 l4       t!R6 R7 lt!R8 R9 lt"R: t#]$! R;4      R< 4       t%]$! R=4      R> 4       t&]$! R?4      R@ 4       t']$! RA4      RB 4       t(]$! RC4      RD 4       t)]$! RE4      RF 4       t*RGRRHRIRJRK/RL V 3RM lllt+RNR
ROR/RP RQ llt,RNR
ROR/RR RS llt-RRT RU llt.RRV V 3RW lllt/RX RY lt0]RZ R[ l4       t1R\ R] lt2R^ R_ lt3RR` Ra llt4RbRRcR
RNR
/Rd Re llt5Rf t6Rg t7Rh t8RRi Rj llt9]
Rk Rl l4       t:]
Rm Rn l4       t;]
Ro Rp l4       t<]
Rq Rr l4       t=]P(                  ! Rs4      ]Rt&   Ru t>]
Rv Rw l4       t?]P(                  ! Rx4      ]Ry&   Rz R{ lt@R|]R}&   ]
R~ R l4       tARR R lltBRR ltC]P(                  ! R4      ]R&   RR R lltDR R ltER R ltFR R ltGRR R lltH]P(                  ! R4      ]R&   R tIR R ltJ]
R R l4       tKR R ltLR R ltMRtNV ;tO# )rI   a  
Pandas array for interval data that are closed on the same side.

Parameters
----------
data : array-like (1-dimensional)
    Array-like (ndarray, :class:`DateTimeArray`, :class:`TimeDeltaArray`) containing
    Interval objects from which to build the IntervalArray.
closed : {'left', 'right', 'both', 'neither'}, default 'right'
    Whether the intervals are closed on the left-side, right-side, both or
    neither.
dtype : dtype or None, default None
    If None, dtype will be inferred.
copy : bool, default False
    Copy the input data.
verify_integrity : bool, default True
    Verify that the IntervalArray is valid.

Attributes
----------
left
right
closed
mid
length
is_empty
is_non_overlapping_monotonic

Methods
-------
from_arrays
from_tuples
from_breaks
contains
overlaps
set_closed
to_tuples

See Also
--------
Index : The base pandas Index type.
Interval : A bounded slice-like interval; the elements of an IntervalArray.
interval_range : Function to create a fixed frequency IntervalIndex.
cut : Bin values into discrete Intervals.
qcut : Bin values into equal-sized Intervals based on rank or sample quantiles.

Notes
-----
See the `user guide
<https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html#intervalindex>`__
for more.

Examples
--------
A new ``IntervalArray`` can be constructed directly from an array-like of
``Interval`` objects:
>>> pd.arrays.IntervalArray([pd.Interval(0, 1), pd.Interval(1, 5)])
<IntervalArray>
[(0, 1], (1, 5]]
Length: 2, dtype: interval[int64, right]

It may also be constructed using one of the constructor
methods: :meth:`IntervalArray.from_arrays`,
:meth:`IntervalArray.from_breaks`, and :meth:`IntervalArray.from_tuples`.
Tc                   V ^8  d   QhRR/# )   returnz
Literal[1] )formats   "d/Users/mibo/.openclaw/workspace/.venv-ak/lib/python3.14/site-packages/pandas/core/arrays/interval.py__annotate__IntervalArray.__annotate__   s      j     c                	    ^# )   rR   selfs   &rT   ndimIntervalArray.ndim   s    rW   rE   _left_rightr*   _dtypeNFc          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
rP   closedIntervalClosedType | NonedtypeDtype | Nonecopyboolverify_integrityrQ   r   rR   )rS   s   "rT   rU   rV   
  s>     1
 1
 *1
 	1

 1
 1
 
1
rW   c                	   \        VR R7      p\        W4      '       dG   VP                  pVP                  pT;'       g    VP                  p\        VP                  VR7      pM\        V4      '       d   V P                   RV R2p\        V4      h\        V4      p\        WRJ R7      w  rgp	VP                  \        8X  d-   \        P                  ! V4      p\        P                  ! V4      pT;'       g    T	pV P                  VVVVVR7      w  rgpV'       d   V P!                  WgVR7       V P#                  VVVR7      # )	Textract_numpyrb   z5(...) must be called with a collection of some kind, z was passedN)validate_closedrb   rf   rd   rd   )r;   
isinstancer^   r_   rb   r*   rd   r%   __name__	TypeError _maybe_convert_platform_intervalr   objectr   maybe_convert_objects_ensure_simple_new_inputs	_validate_simple_new)
clsdatarb   rd   rf   rh   leftrightmsginfer_closeds
   &&&&&&    rT   __new__IntervalArray.__new__
  s>    T6d  !%D"&++E**t{{F!$**V<E ||n %%%)F+7   n$ 4D9D(Dn)%D zzV#00611%8++|F!$!>!> "? "D MM$UM3  
 	
rW   c               (    V ^8  d   QhRRRRRRRR/# )rP   r{   rE   r|   rd   r*   rQ   r   rR   )rS   s   "rT   rU   rV   >  s2        	
 
rW   c                	V    \         P                  ! V 4      pWn        W$n        W4n        V# N)r   r   r^   r_   r`   )ry   r{   r|   rd   results   &&&& rT   rx   IntervalArray._simple_new=  s(     &&s+rW   c               (    V ^8  d   QhRRRRRRRR/# )	rP   rb   rc   rf   rg   rd   re   rQ   z0tuple[IntervalSide, IntervalSide, IntervalDtype]rR   )rS   s   "rT   rU   rV   L  s:     j" j" *	j"
 j" j" 
:j"rW   c                (	   ^ RI Hp V! WR7      p\        V4      pV! W$R7      p\        V4      pVf#   \        V\        4      '       d   VP
                  pT;'       g    RpVe   \        V4      p\        V\        4      '       dF   VP                  e7   VP                  VP                  4      pVP                  VP                  4      pMRV 2p\        V4      hVP
                  f   \	        VP                  V4      pMW5P
                  8w  d   \        R4      h\        VP                  4      '       d8   \        VP                  4      '       d   VP                  VP                  4      pMQ\        VP                  4      '       d7   \        VP                  4      '       d   VP                  VP                  4      p\        V4      \        V4      8w  d;   R\        V4      P                   R\        V4      P                   R2p\        V4      h\        VP                  \         4      '       g   \#        VP                  4      '       d   R	p\        V4      h\        V\$        4      '       d   R
p\        V4      h\        V\&        4      '       dV   \)        VP*                  4      \)        VP*                  4      8w  d)   RVP*                   RVP*                   R2p\        V4      h\-        VP                  4      '       dS   VP.                  VP.                  8w  d8   VP0                  P3                  VP0                  4      w  rV! V4      pV! V	4      p\5        V4      p\7        VRR7      p\5        V4      p\7        VRR7      p\        V\8        4      '       g   \        V\8        4      '       d   Ma\;        VRV4      p
\;        V
RV
4      P<                  p
\;        VRV4      p\;        VRV4      P<                  pV
e   WJ d   VP?                  4       p\	        VP                  VR7      pVP                  pVP                  pVP@                  R9   d?   VP@                  R9   d.   VP@                  VP@                  8w  d   \        RV RV R24      hWV3# )z;Ensure correctness of input parameters for cls._simple_new.)ensure_indexrf   r|   z$dtype must be an IntervalDtype, got z*closed keyword does not match dtype.closedzmust not have differing left [z] and right [z] typeszIcategory, object, and string subtypes are not supported for IntervalArrayz:Period dtypes are not supported, use a PeriodIndex insteadz2left and right must have the same time zone, got 'z' and ''Trj   _ndarray_datarl   iuz9Left and right arrays must have matching signedness. Got z and .)!pandas.core.indexes.baser   r    rp   r*   rb   r(   subtypeastyperr   
ValueErrorr!   rd   r"   typerq   r)   r&   r.   r,   strtzr'   unitr   _ensure_matching_resosr:   r;   r5   getattrbaserf   kind)ry   r{   r|   rb   rf   rd   r   r}   left_arr	right_arrlbaserbase
left_dtyperight_dtypes   &&&&&&        rT   rv   'IntervalArray._ensure_simple_new_inputsK  s    	:D,,T2U.-e4>j>>\\F""7 'E%//==,;;u}}5D!LL7E<UGDn$||#%emmV<<<' !MNN $**%%*:5;;*G*GLL,EEKK((-=djj-I-I;;u{{+D:e$0d1D1D0E Fu+../w8  S/!djj"233tzz7R7R$  C. dN++NCS/!d,--#dgg,#ehh-2OGG9GEHH:Q0  S/! ,,ejj1H"&**"C"CEKK"PH)D +E .d3T6.u5e48d/00J&5
 5
 D*d3EE7E277EE:u5EE7E277E U^

djj8 ZZ
kkOOt#  D(;#3#33!l%}A7  E!!rW   rd   rf   c               $    V ^8  d   QhRRRRRR/# )rP   rd   re   rf   rg   rQ   r   rR   )rS   s   "rT   rU   rV     s*     4 4 	4
 4 
4rW   c               	    V ! WVR 7      # ))rd   rf   rR   )ry   scalarsrd   rf   s   &&$$rT   _from_sequenceIntervalArray._from_sequence  s     7d33rW   c               $    V ^8  d   QhRRRRRR/# )rP   values
np.ndarrayoriginalrI   rQ   r   rR   )rS   s   "rT   rU   rV     s&     @ @j @M @d @rW   c                	:    V P                  WP                  R 7      # ro   )r   rd   )ry   r   r   s   &&&rT   _from_factorizedIntervalArray._from_factorized  s    !!&!??rW   ac  
        Construct an %(klass)s from an array of splits.

        Parameters
        ----------
        breaks : array-like (1-dimensional)
            Left and right bounds for each interval.
        closed : {'left', 'right', 'both', 'neither'}, default 'right'
            Whether the intervals are closed on the left-side, right-side, both
            or neither.        %(name)s
        copy : bool, default False
            Copy the data.
        dtype : dtype or None, default None
            If None, dtype will be inferred.

        Returns
        -------
        %(klass)s

        See Also
        --------
        interval_range : Function to create a fixed frequency IntervalIndex.
        %(klass)s.from_arrays : Construct from a left and right array.
        %(klass)s.from_tuples : Construct from a sequence of tuples.

        %(examples)s        from_breaksc               (    V ^8  d   QhRRRRRRRR/# 	rP   rb   rc   rf   rg   rd   re   rQ   r   rR   )rS   s   "rT   rU   rV     s:     *X *X **X 	*X
 *X 
*XrW   c                V    \        V4      pV P                  VRR VR,          W#VR7      # )aA  
Construct an IntervalArray from an array of splits.

Parameters
----------
breaks : array-like (1-dimensional)
    Left and right bounds for each interval.
closed : {'left', 'right', 'both', 'neither'}, default 'right'
    Whether the intervals are closed on the left-side, right-side, both
    or neither.
copy : bool, default False
    Copy the data.
dtype : dtype or None, default None
    If None, dtype will be inferred.

Returns
-------
IntervalArray

See Also
--------
interval_range : Function to create a fixed frequency IntervalIndex.
IntervalArray.from_arrays : Construct from a left and right array.
IntervalArray.from_tuples : Construct from a sequence of tuples.

Examples
--------
>>> pd.arrays.IntervalArray.from_breaks([0, 1, 2, 3])
<IntervalArray>
[(0, 1], (1, 2], (2, 3]]
Length: 3, dtype: interval[int64, right]
NrY   NNrf   rd   )rs   from_arrays)ry   breaksrb   rf   rd   s   &&&&&rT   r   IntervalArray.from_breaks  s1    R 2&9vcr{F2JQVWWrW   aC  
        Construct from two arrays defining the left and right bounds.

        Parameters
        ----------
        left : array-like (1-dimensional)
            Left bounds for each interval.
        right : array-like (1-dimensional)
            Right bounds for each interval.
        closed : {'left', 'right', 'both', 'neither'}, default 'right'
            Whether the intervals are closed on the left-side, right-side, both
            or neither.        %(name)s
        copy : bool, default False
            Copy the data.
        dtype : dtype, optional
            If None, dtype will be inferred.

        Returns
        -------
        %(klass)s

        Raises
        ------
        ValueError
            When a value is missing in only one of `left` or `right`.
            When a value in `left` is greater than the corresponding value
            in `right`.

        See Also
        --------
        interval_range : Function to create a fixed frequency IntervalIndex.
        %(klass)s.from_breaks : Construct an %(klass)s from an array of
            splits.
        %(klass)s.from_tuples : Construct an %(klass)s from an
            array-like of tuples.

        Notes
        -----
        Each element of `left` must be less than or equal to the `right`
        element at the same position. If an element is missing, it must be
        missing in both `left` and `right`. A TypeError is raised when
        using an unsupported type for `left` or `right`. At the moment,
        'category', 'object', and 'string' subtypes are not supported.

        %(examples)s        r   c               (    V ^8  d   QhRRRRRRRR/# r   rR   )rS   s   "rT   rU   rV   E  s:     G9 G9 *	G9
 G9 G9 
G9rW   c                    \        V4      p\        V4      pV P                  VVVVVR7      w  rpV P                  WVR7       V P                  WVR7      # )a  
Construct from two arrays defining the left and right bounds.

Parameters
----------
left : array-like (1-dimensional)
    Left bounds for each interval.
right : array-like (1-dimensional)
    Right bounds for each interval.
closed : {'left', 'right', 'both', 'neither'}, default 'right'
    Whether the intervals are closed on the left-side, right-side, both
    or neither.
copy : bool, default False
    Copy the data.
dtype : dtype, optional
    If None, dtype will be inferred.

Returns
-------
IntervalArray

Raises
------
ValueError
    When a value is missing in only one of `left` or `right`.
    When a value in `left` is greater than the corresponding value
    in `right`.

See Also
--------
interval_range : Function to create a fixed frequency IntervalIndex.
IntervalArray.from_breaks : Construct an IntervalArray from an array of
    splits.
IntervalArray.from_tuples : Construct an IntervalArray from an
    array-like of tuples.

Notes
-----
Each element of `left` must be less than or equal to the `right`
element at the same position. If an element is missing, it must be
missing in both `left` and `right`. A TypeError is raised when
using an unsupported type for `left` or `right`. At the moment,
'category', 'object', and 'string' subtypes are not supported.

Examples
--------
>>> pd.arrays.IntervalArray.from_arrays([0, 1, 2], [1, 2, 3])
<IntervalArray>
[(0, 1], (1, 2], (2, 3]]
Length: 3, dtype: interval[int64, right]
rn   ro   )rs   rv   rw   rx   )ry   r{   r|   rb   rf   rd   s   &&&&&&rT   r   IntervalArray.from_arraysD  sg    x 0507 :: ; 
U 	d/t%88rW   a  
        Construct an %(klass)s from an array-like of tuples.

        Parameters
        ----------
        data : array-like (1-dimensional)
            Array of tuples.
        closed : {'left', 'right', 'both', 'neither'}, default 'right'
            Whether the intervals are closed on the left-side, right-side, both
            or neither.        %(name)s
        copy : bool, default False
            By-default copy the data, this is compat only and ignored.
        dtype : dtype or None, default None
            If None, dtype will be inferred.

        Returns
        -------
        %(klass)s

        See Also
        --------
        interval_range : Function to create a fixed frequency IntervalIndex.
        %(klass)s.from_arrays : Construct an %(klass)s from a left and
                                    right array.
        %(klass)s.from_breaks : Construct an %(klass)s from an array of
                                    splits.

        %(examples)s        from_tuplesc               (    V ^8  d   QhRRRRRRRR/# r   rR   )rS   s   "rT   rU   rV     s@     @M @M *@M 	@M
 @M 
@MrW   c                   \        V4      '       d   . . reMT;rVV Fo  p\        V\        4      '       g$   \        V4      '       d   \        P
                  ;rMV P                  p
 Vw  rVP                  V4       VP                  V	4       Kq  	  V P                  WVVRVR7      #   \         d   pT
 RT 2p\        T4      ThRp?i\         d   pT
 RT 2p\        T4      ThRp?ii ; i)a  
Construct an IntervalArray from an array-like of tuples.

Parameters
----------
data : array-like (1-dimensional)
    Array of tuples.
closed : {'left', 'right', 'both', 'neither'}, default 'right'
    Whether the intervals are closed on the left-side, right-side, both
    or neither.
copy : bool, default False
    By-default copy the data, this is compat only and ignored.
dtype : dtype or None, default None
    If None, dtype will be inferred.

Returns
-------
IntervalArray

See Also
--------
interval_range : Function to create a fixed frequency IntervalIndex.
IntervalArray.from_arrays : Construct an IntervalArray from a left and
                            right array.
IntervalArray.from_breaks : Construct an IntervalArray from an array of
                            splits.

Examples
--------
>>> pd.arrays.IntervalArray.from_tuples([(0, 1), (1, 2)])
<IntervalArray>
[(0, 1], (1, 2]]
Length: 2, dtype: interval[int64, right]
z..from_tuples requires tuples of length 2, got Nz'.from_tuples received an invalid item, Fr   )lenrp   tupler0   npnanrq   r   rr   appendr   )ry   rz   rb   rf   rd   r{   r|   dlhsrhsrK   errr}   s   &&&&&        rT   r   IntervalArray.from_tuples  s    T t99b%  DAa''DGGFF"c||2 HC KKLL " tFeLL " 3!F"PQRPSTC$S/s2  2!F"I!MC#C.c12s*   $B##C'.CC'C'C""C'c                    V ^8  d   QhRRRR/# )rP   rd   r*   rQ   NonerR   )rS   s   "rT   rU   rV     s     " "= "T "rW   c                x   \        V\        4      '       g   RV 2p\        V4      h\        V4      \        V4      8w  d   Rp\        V4      h\	        V4      p\	        V4      pWV8H  P                  4       '       g   Rp\        V4      hW,          W%,          8*  P                  4       '       g   Rp\        V4      hR# )z
Verify that the IntervalArray is valid.

Checks that

* dtype is correct
* left and right match lengths
* left and right have the same missing values
* left is always below right
zinvalid dtype: z(left and right must have the same lengthzMmissing values must be missing in the same location both left and right sidesz+left side of interval must be <= right sideN)rp   r*   r   r   r1   all)ry   r{   r|   rd   r}   	left_mask
right_masks   &&&&   rT   rw   IntervalArray._validate  s     %//#E7+CS/!t9E
"<CS/!$K	5\
',,..5  S/!5#3388::?CS/! ;rW   c                   V ^8  d   QhRR/# rP   rQ   r   rR   )rS   s   "rT   rU   rV     s     : :D :rW   c                    \        VP                  V P                  R7      pV P                  WVR7      w  rpV P	                  WVR7      # )z
Return a new IntervalArray with the replacement attributes

Parameters
----------
left : Index
    Values to be used for the left-side of the intervals.
right : Index
    Values to be used for the right-side of the intervals.
rl   ro   )r*   rd   rb   rv   rx   r[   r{   r|   rd   s   &&& rT   _shallow_copyIntervalArray._shallow_copy  sH     djj=!;;Du;UU599rW   c                   V ^8  d   QhRR/# )rP   rQ   r*   rR   )rS   s   "rT   rU   rV   $  s      } rW   c                	    V P                   # r   )r`   rZ   s   &rT   rd   IntervalArray.dtype#  s    {{rW   c                   V ^8  d   QhRR/# rP   rQ   intrR   )rS   s   "rT   rU   rV   (  s     4 4 4rW   c                	d    V P                   P                  V P                  P                  ,           # r   )r{   nbytesr|   rZ   s   &rT   r   IntervalArray.nbytes'  s!    yy$**"3"333rW   c                   V ^8  d   QhRR/# r   rR   )rS   s   "rT   rU   rV   ,  s      c rW   c                	.    V P                   P                  # r   )r{   sizerZ   s   &rT   r   IntervalArray.size+  s     yy~~rW   c                   V ^8  d   QhRR/# )rP   rQ   rA   rR   )rS   s   "rT   rU   rV   3  s     & &( &rW   c                	@    \        \        P                  ! V 4      4      # r   )iterr   asarrayrZ   s   &rT   __iter__IntervalArray.__iter__3  s    BJJt$%%rW   c                   V ^8  d   QhRR/# r   rR   )rS   s   "rT   rU   rV   6  s       rW   c                	,    \        V P                  4      # r   )r   r^   rZ   s   &rT   __len__IntervalArray.__len__6  s    4::rW   c                    V ^8  d   QhRRRR/# )rP   keyr   rQ   rF   rR   )rS   s   "rT   rU   rV   :  s    BB}BBrW   c                	    R # r   rR   r[   r   s   &&rT   __getitem__IntervalArray.__getitem__9  s    ?BrW   c                    V ^8  d   QhRRRR/# )rP   r   r   rQ   r   rR   )rS   s   "rT   rU   rV   =  s    <<<4<rW   c                	    R # r   rR   r   s   &&rT   r   r   <  s    9<rW   c                    V ^8  d   QhRRRR/# )rP   r   r   rQ   zSelf | IntervalOrNArR   )rS   s   "rT   rU   rV   ?  s      0 5H rW   c                	   \        W4      pV P                  V,          pV P                  V,          p\        V\        P
                  \        34      '       gE   \        V4      '       d   \        V4      '       d   V P                  # \        W#V P                  4      # \        P                  ! V4      ^8  d   \        R4      hV P                  W#V P                  R7      p\!        W4      '       d   V P"                  Vn        V# )rY   z&multi-dimensional indexing not allowedro   )r<   r^   r_   rp   r   ndarrayr6   r%   r0   _fill_valuer   rb   r\   r   rx   rd   r=   	_readonly)r[   r   r{   r|   r   s   &&   rT   r   r   ?  s    !$,zz#C $^ <==4::'''D55774=1EFF
 !!$TZZ!@**#~~FrW   c                   V ^8  d   QhRR/# )rP   rQ   r   rR   )rS   s   "rT   rU   rV   U  s     ' ' 'rW   c                	    V P                   '       d   \        R 4      hV P                  V4      w  r4\        W4      pW0P                  V&   W@P
                  V&   R# )zCannot modify read-only arrayN)r   r   _validate_setitem_valuer<   r^   r_   )r[   r   value
value_leftvalue_rights   &&&  rT   __setitem__IntervalArray.__setitem__U  sK    >>><=="&">">u"E
!$,$

3&CrW   c                	   \        V4      '       d1   \        V 4      \        V4      8w  d   \        R 4      h\        V4      pM\	        V\
        4      '       gq   V\        J d[   ^ RIHp \        P                  ! V P                  \        R7      p\        P                  ! V P                  \        R7      pV! WE4      # \        WV4      # \	        V\
        4      '       d   \        R4      pM\	        VP                   \"        4      '       g   VP                   pMVP$                  P                   p\	        V\&        4      '       dx   V P(                  VP$                  P(                  8w  d   \        WV4      # VP$                  P*                  P-                  VP.                  RVP$                  P0                  R7      p\	        V\&        4      '       Ed   V P(                  VP(                  8w  d   \        WV4      # \	        V\
        4      '       g   \3        V 4      ! V4      pV\4        P6                  J d8   V P8                  VP:                  8H  V P<                  VP>                  8H  ,          # V\4        P@                  J d8   V P8                  VP:                  8g  V P<                  VP>                  8g  ,          # V\4        PB                  J dV   V P8                  VP:                  8  V P8                  VP:                  8H  V P<                  VP>                  8  ,          ,          # V\4        PD                  J d   W8H  W8  ,          # V\4        PF                  J dV   V P8                  VP:                  8  V P8                  VP:                  8H  V P<                  VP>                  8  ,          ,          # W8H  W8  ,          # \I        V4      '       g   \        WV4      # \        PJ                  ! \        V 4      \        R7      p\M        V4       F  w  r V! W,          V	4      Wx&   K  	  V#   \N         d-    T	\        J d!   TPQ                  \R        4      p\        Yx&    KR  h i ; i)zLengths must match to compare)BooleanArrayro   intervalT
allow_fill
fill_value)*r#   r   r   pd_arrayrp   r   r   pandas.core.arraysr  r   emptyshaperg   onesr>   r(   rd   r)   
categoriesr*   rb   _valuesr3   codes	_na_valuer   operatoreqr^   r{   r_   r|   negtger   r$   zeros	enumeraterr   r   rt   )
r[   otheropr  arrmaskother_dtyper   iobjs
   &&&       rT   _cmp_methodIntervalArray._cmp_method_  s2   4yCJ& !@AAUOEE8,,{;hhtzz6wwtzz6#C..%d266 eX&&&z2KEKK)9::++K  **00K +}55;;%"2"2"9"99-d2>>((0055KKDU=M=M=W=W 6 
 k=11{{ell*)$r::x00T
5)X[[ 

ejj0T[[EKK5OPPx{{"

ejj0T[[EKK5OPPx{{"

UZZ/ZZ5::-$++2KL  x{{"$,77x{{"

UZZ/ZZ5::-$++2KL 
 $,77 {++%d266 #d)40&FA	tw,	 '   "9 $]]62F "FIs   P2QQ__eq__c                	B    V P                  V\        P                  4      # r   )r  r  r  r[   r  s   &&rT   r!  IntervalArray.__eq__      x{{33rW   __ne__c                	B    V P                  V\        P                  4      # r   )r  r  r  r#  s   &&rT   r&  IntervalArray.__ne__  r%  rW   __gt__c                	B    V P                  V\        P                  4      # r   )r  r  r  r#  s   &&rT   r)  IntervalArray.__gt__  r%  rW   __ge__c                	B    V P                  V\        P                  4      # r   )r  r  r  r#  s   &&rT   r,  IntervalArray.__ge__  r%  rW   __lt__c                	B    V P                  V\        P                  4      # r   )r  r  r   r#  s   &&rT   r/  IntervalArray.__lt__  r%  rW   __le__c                	B    V P                  V\        P                  4      # r   )r  r  r   r#  s   &&rT   r2  IntervalArray.__le__  r%  rW   	ascendingr   	quicksortna_positionlastc               (    V ^8  d   QhRRRRRRRR/# )	rP   r5  rg   r   r   r7  r   rQ   r   rR   )rS   s   "rT   rU   rV     s4     
 
 
 	

 
 

rW   c          	     	   < \         P                  ! VRV4      pV'       d;   VR 8X  d4   VR8X  d-   \        P                  ! V P                  V P
                  34      # \        SV `  ! RRVRVRV/VB # )r6  r8  r5  r   r7  rR   )nvvalidate_argsort_with_ascendingr   lexsortr|   r{   superargsort)r[   r5  r   r7  kwargs	__class__s   &$$$,rT   r?  IntervalArray.argsort  s{     66y"fM	,1F ::tzz499566 w 

&*
8C
GM
 	
rW   axisskipnac               $    V ^8  d   QhRRRRRR/# rP   rC  AxisInt | NonerD  rg   rQ   rF   rR   )rS   s   "rT   rU   rV     !      > $ , rW   c               	F   \         P                  ! WP                  4       \        V 4      '       g   V P                  # V P                  4       pVP                  4       '       d   V'       g   V P                  # W( ,          pMT pVP                  4       ^ ,          pWE,          # )r   r;  validate_minmax_axisr\   r   r  r0   anyr?  r[   rC  rD  r  r  indexers   &$$   rT   minIntervalArray.min  sp    
ii04yy>>!yy{88::~~%u+CC++-"|rW   c               $    V ^8  d   QhRRRRRR/# rF  rR   )rS   s   "rT   rU   rV     rH  rW   c               	F   \         P                  ! WP                  4       \        V 4      '       g   V P                  # V P                  4       pVP                  4       '       d   V'       g   V P                  # W( ,          pMT pVP                  4       R,          pWE,          # )rY   r   rJ  rM  s   &$$   rT   maxIntervalArray.max  sp    
ii04yy>>!yy{88::~~%u+CC++-#|rW   c               $    V ^8  d   QhRRRRRR/# )rP   limitz
int | Nonerf   rg   rQ   r   rR   )rS   s   "rT   rU   rV     s!     !/ !/: !/D !/D !/rW   c                    VRJ d   \         hVe   \        R4      hV P                  V4      w  rEV P                  P	                  VR7      pV P
                  P	                  VR7      pV P                  Wg4      # )af  
Fill NA/NaN values using the specified method.

Parameters
----------
value : scalar, dict, Series
    If a scalar value is passed it is used to fill all missing values.
    Alternatively, a Series or dict can be used to fill in different
    values for each index. The value should not be a list. The
    value(s) passed should be either Interval objects or NA/NaN.
limit : int, default None
    (Not implemented yet for IntervalArray)
    The maximum number of entries where NA values will be filled.
copy : bool, default True
    Whether to make a copy of the data before filling. If False, then
    the original should be modified and no new memory should be allocated.
    For ExtensionArray subclasses that cannot do this, it is at the
    author's discretion whether to ignore "copy=False" or to raise.

Returns
-------
filled : IntervalArray with NA/NaN filled
Fzlimit must be None)r   )NotImplementedErrorr   _validate_scalarr{   fillnar|   r   )r[   r   rV  rf   r   r   r{   r|   s   &&&&    rT   rZ  IntervalArray.fillna  su    0 5=%%122"&"7"7">
yyj1

!!!4!!$..rW   c                   V ^8  d   QhRR/# )rP   rf   rg   rR   )rS   s   "rT   rU   rV     s     ;. ;.$ ;.rW   c                j  < ^ RI Hp Ve   \        V4      p\        V\        4      '       d   WP
                  8X  d   V'       d   V P                  4       # T # \        V P
                  P                  4      '       d:   \        VP                  4      '       d   RV P
                   RV R2p\        V4      h V! V P                  RR7      P                  VP                  4      pV! V P                  RR7      P                  VP                  4      pT P!                  YV4      #  \"        SV `1  WR7      #   \         d    h \        \        3 d%   pRT P
                   RT R2p\        T4      ThRp?ii ; i  \        \        3 d-   pR\%        T 4      P&                   R	T 2p\        T4      ThRp?ii ; i)
a  
Cast to an ExtensionArray or NumPy array with dtype 'dtype'.

Parameters
----------
dtype : str or dtype
    Typecode or data-type to which the array is cast.

copy : bool, default True
    Whether to copy the data, even if not necessary. If False,
    a copy is made only if the old dtype does not match the
    new dtype.

Returns
-------
array : ExtensionArray or ndarray
    ExtensionArray or NumPy ndarray with 'dtype' for its dtype.
rC   NzCannot convert z to z; subtypes are incompatibleFr   zCannot cast z
 to dtype )pandasrD   r(   rp   r*   rd   rf   r!   r   r'   rr   r^   r   r_   r   r   r   r>  r   rq   )	r[   rd   rf   rD   r}   new_left	new_rightr   rA  s	   &&&     rT   r   IntervalArray.astype  s   & 	! 'Ee]++

"&*tyy{44djj00116I7 7
 &djj\eW<WX   n$. !%8??N!$++E:AA%--P	 %%h::.w~e~77 & z* . &djj\eW<WX   n#-. z* .$T$Z%8%8$9E7Kn#-.s7   6AD2 "E5 2E2E2E--E25F2'F--F2c                   V ^8  d   QhRR/# rP   rQ   rg   rR   )rS   s   "rT   rU   rV   \  s     
 
t 
rW   c                	0   \        V 4      \        V4      8w  d   R # \        V P                  VP                  8H  ;'       dS    V P                  P	                  VP                  4      ;'       d&    V P
                  P	                  VP
                  4      4      # F)r   rg   rb   r{   equalsr|   r#  s   &&rT   rf  IntervalArray.equals\  sr    :e$KK5<<' / /		  ,/ /

!!%++.
 	
rW   c                    V ^8  d   QhRRRR/# )rP   	to_concatzSequence[IntervalArray]rQ   r   rR   )rS   s   "rT   rU   rV   g  s     9 9*A 9d 9rW   c                   V Uu0 uF  q"P                   kK  	  pp\        V4      ^8w  d   \        R4      hVP                  4       p\        P
                  ! V Uu. uF  q"P                  NK  	  up4      p\        P
                  ! V Uu. uF  q"P                  NK  	  up4      pV P                  WVVR7      w  rVpV P                  WVVR7      # u upi u upi u upi )z
Concatenate multiple IntervalArray

Parameters
----------
to_concat : sequence of IntervalArray

Returns
-------
IntervalArray
z.Intervals must all be closed on the same side.rl   ro   )
rb   r   r   popr   concatenater{   r|   rv   rx   )ry   ri  r  
closed_setrb   r{   r|   rd   s   &&      rT   _concat_same_typeIntervalArray._concat_same_typef  s     7@@i(ooi
@z?aMNN!^^9,U9x]]9,UV nnY-WYnnY-WX ::4v:VUt%88 A
 -V-Ws   CC	Cc                   V ^8  d   QhRR/# r   rR   )rS   s   "rT   rU   rV     s     : :d :rW   c                    V P                   P                  4       pV P                  P                  4       pV P                  pV P	                  WVR7      # )z<
Return a copy of the array.

Returns
-------
IntervalArray
ro   )r^   rf   r_   rd   rx   r   s   &   rT   rf   IntervalArray.copy  sE     zz   "

599rW   c                   V ^8  d   QhRR/# )rP   rQ   r   rR   )rS   s   "rT   rU   rV     s        j  rW   c                	,    \        V P                  4      # r   )r0   r^   rZ   s   &rT   r0   IntervalArray.isna  s    DJJrW   c               $    V ^8  d   QhRRRRRR/# )rP   periodsr   r  rt   rQ   rI   rR   )rS   s   "rT   rU   rV     s!     . .S .& .M .rW   c                	*   \        V 4      '       d   V^ 8X  d   V P                  4       # V P                  V4       \        \	        V4      \        V 4      4      p\        V4      '       dV   ^ RIHp V! V P                  RR7      P                  p\        P                  V.V^,           ,          V P                  R7      pM%V P                  V.V,          V P                  R7      pV^ 8  d
   TpV RV)  pMV \	        V4      R pTpV P                  Wg.4      # )r   rC   Fr   rl   ro   N)r   rf   rY  rO  absr0   r^  rD   r^   r  rI   r   rb   r   rd   rn  )r[   rw  r  	empty_lenrD   r
  abs   &&&     rT   shiftIntervalArray.shift  s    4yyGqL99;j) Gc$i0	
$tzz6@@J!--	A.t{{ . E ''y(@

'SEQ;AYwhAS\^$AA%%qf--rW   r  r  c                    V ^8  d   QhRRRR/# )rP   r  rg   rQ   r   rR   )rS   s   "rT   rU   rV     s$     C9 C9 	C9 
C9rW   c                   \         P                  ! RV4       T;rgV'       d   V P                  V4      w  rg\        V P                  WVR7      p\        V P
                  WVR7      p	V P                  W4      # )aU  
Take elements from the IntervalArray.

Parameters
----------
indices : sequence of integers
    Indices to be taken.

allow_fill : bool, default False
    How to handle negative values in `indices`.

    * False: negative values in `indices` indicate positional indices
      from the right (the default). This is similar to
      :func:`numpy.take`.

    * True: negative values in `indices` indicate
      missing values. These values are set to `fill_value`. Any other
      other negative values raise a ``ValueError``.

fill_value : Interval or NA, optional
    Fill value to use for NA-indices when `allow_fill` is True.
    This may be ``None``, in which case the default NA value for
    the type, ``self.dtype.na_value``, is used.

    For many ExtensionArrays, there will be two representations of
    `fill_value`: a user-facing "boxed" scalar, and a low-level
    physical NA value. `fill_value` should be the user-facing version,
    and the implementation should handle translating that to the
    physical version for processing the take if necessary.

axis : any, default None
    Present for compat with IntervalIndex; does nothing.

Returns
-------
IntervalArray

Raises
------
IndexError
    When the indices are out of bounds for the array.
ValueError
    When `indices` contains negative values other than ``-1``
    and `allow_fill` is True.
r  rR   )r;  validate_takerY  r3   r^   r_   r   )
r[   indicesr  r  rC  r@  	fill_left
fill_right	left_take
right_takes
   &&$$$,    rT   r3   IntervalArray.take  sr    l 	V$!++	$($9$9*$E!IJJ9
	 KKJ

 !!)88rW   c                	p    \        V4      pV P                  VR R7       VP                  VP                  rC T P                  P                  T4       Y43#   \         d!   pR\        T4       R2p\	        T4      ThRp?ii ; i  \        \        3 d!   pR\        T4       R2p\	        T4      ThRp?ii ; i)r   rK   z('value' should be an interval type, got z	 instead.Nz2'value' should be a compatible interval type, got )rI   _check_closed_matchesr{   r|   rr   r   _validate_fill_valuer   )r[   r   r9   r   r   r   r}   s   &&     rT   _validate_listlike IntervalArray._validate_listlike  s    	*!%(E&&u7&;&+jj%++	*II**:6 &&  	*<T%[MSCC.c)	* "9- 	*E{m9.  C.c)	*s.   5A B B!A<<BB5B00B5c                	   \        V\        4      '       d.   V P                  VR R7       VP                  VP                  r2W#3# \        WP                  P                  4      '       d   V P                  P                  ;r#W#3# \        R4      h)r   r  z=can only insert Interval objects and NA into an IntervalArray)	rp   r   r  r{   r|   r/   rd   r  rr   )r[   r   r{   r|   s   &&  rT   rY  IntervalArray._validate_scalar  s~    eX&&&&u7&;**ekk% { #5))//::99...D
 { O rW   c                	   \        WP                  P                  4      '       dL   V P                  P                  p\	        V P                  P
                  4      '       d   \        R 4      hYr2W#3# \        V\        4      '       dd   V P                  VRR7       VP                  VP                  r2V P                  P                  V4       V P                  P                  V4       W#3# V P                  V4      # )z4Cannot set float NaN to integer-backed IntervalArrayr   r  )r/   r{   rd   r  r"   r   rr   rp   r   r  r|   r  r  )r[   r   r   r   s   &&  rT   r   %IntervalArray._validate_setitem_value  s     		88II''E

 2 233   VWW&+ && x((&&u7&;&+jj%++II**:6II**;7
 && **511rW   c                    V ^8  d   QhRRRR/# )rP   boxedrg   rQ   zCallable[[object], str]rR   )rS   s   "rT   rU   rV   0  s       1H rW   c                	    \         # r   )r   )r[   r  s   &&rT   
_formatterIntervalArray._formatter0  s	     
rW   c                   V ^8  d   QhRR/# rP   rQ   rD   rR   )rS   s   "rT   rU   rV   9  s     !- !-e !-rW   c                6    ^ RI Hp V! V P                  RR7      # )a   
Return the left endpoints of each Interval in the IntervalArray as an Index.

This property provides access to the left endpoints of the intervals
contained within the IntervalArray. This can be useful for analyses where
the starting point of each interval is of interest, such as in histogram
creation, data aggregation, or any scenario requiring the identification
of the beginning of defined ranges. This property returns a ``pandas.Index``
object containing the midpoint for each interval.

See Also
--------
arrays.IntervalArray.right : Return the right endpoints of each Interval in
    the IntervalArray as an Index.
arrays.IntervalArray.mid : Return the midpoint of each Interval in the
    IntervalArray as an Index.
arrays.IntervalArray.contains : Check elementwise if the Intervals contain
    the value.

Examples
--------

>>> interv_arr = pd.arrays.IntervalArray([pd.Interval(0, 1), pd.Interval(2, 5)])
>>> interv_arr
<IntervalArray>
[(0, 1], (2, 5]]
Length: 2, dtype: interval[int64, right]
>>> interv_arr.left
Index([0, 2], dtype='int64')
rC   Fr   )r^  rD   r^   r[   rD   s   & rT   r{   IntervalArray.left8  s    @ 	!TZZe,,rW   c                   V ^8  d   QhRR/# r  rR   )rS   s   "rT   rU   rV   ]  s      .  .u  .rW   c                6    ^ RI Hp V! V P                  RR7      # )a  
Return the right endpoints of each Interval in the IntervalArray as an Index.

This property extracts the right endpoints from each interval contained within
the IntervalArray. This can be helpful in use cases where you need to work
with or compare only the upper bounds of intervals, such as when performing
range-based filtering, determining interval overlaps, or visualizing the end
boundaries of data segments.

See Also
--------
arrays.IntervalArray.left : Return the left endpoints of each Interval in
    the IntervalArray as an Index.
arrays.IntervalArray.mid : Return the midpoint of each Interval in the
    IntervalArray as an Index.
arrays.IntervalArray.contains : Check elementwise if the Intervals contain
    the value.

Examples
--------

>>> interv_arr = pd.arrays.IntervalArray([pd.Interval(0, 1), pd.Interval(2, 5)])
>>> interv_arr
<IntervalArray>
[(0, 1], (2, 5]]
Length: 2, dtype: interval[int64, right]
>>> interv_arr.right
Index([1, 5], dtype='int64')
rC   Fr   )r^  rD   r_   r  s   & rT   r|   IntervalArray.right\  s    > 	!T[[u--rW   c                   V ^8  d   QhRR/# r  rR   )rS   s   "rT   rU   rV     s     & & &rW   c                <    V P                   V P                  ,
          # )a  
Return an Index with entries denoting the length of each Interval.

The length of an interval is calculated as the difference between
its `right` and `left` bounds. This property is particularly useful
when working with intervals where the size of the interval is an important
attribute, such as in time-series analysis or spatial data analysis.

See Also
--------
arrays.IntervalArray.left : Return the left endpoints of each Interval in
    the IntervalArray as an Index.
arrays.IntervalArray.right : Return the right endpoints of each Interval in
    the IntervalArray as an Index.
arrays.IntervalArray.mid : Return the midpoint of each Interval in the
    IntervalArray as an Index.

Examples
--------

>>> interv_arr = pd.arrays.IntervalArray([pd.Interval(0, 1), pd.Interval(1, 5)])
>>> interv_arr
<IntervalArray>
[(0, 1], (1, 5]]
Length: 2, dtype: interval[int64, right]
>>> interv_arr.length
Index([1, 4], dtype='int64')
)r|   r{   rZ   s   &rT   lengthIntervalArray.length  s    < zzDII%%rW   c                   V ^8  d   QhRR/# r  rR   )rS   s   "rT   rU   rV     s     1 1U 1rW   c                     RV P                   V P                  ,           ,          #   \         d(    T P                   RT P                  ,          ,           u # i ; i)a  
Return the midpoint of each Interval in the IntervalArray as an Index.

The midpoint of an interval is calculated as the average of its
``left`` and ``right`` bounds. This property returns a ``pandas.Index`` object
containing the midpoint for each interval.

See Also
--------
Interval.left : Return left bound for the interval.
Interval.right : Return right bound for the interval.
Interval.length : Return the length of each interval.

Examples
--------

>>> interv_arr = pd.arrays.IntervalArray([pd.Interval(0, 1), pd.Interval(1, 5)])
>>> interv_arr
<IntervalArray>
[(0, 1], (1, 5]]
Length: 2, dtype: interval[int64, right]
>>> interv_arr.mid
Index([0.5, 3.0], dtype='float64')
g      ?)r{   r|   rr   r  rZ   s   &rT   midIntervalArray.mid  sF    4	1$))djj011 	199sT[[000	1s   #& /AAaH  
        Check elementwise if an Interval overlaps the values in the %(klass)s.

        Two intervals overlap if they share a common point, including closed
        endpoints. Intervals that only have an open endpoint in common do not
        overlap.

        Parameters
        ----------
        other : Interval
            Interval to check against for an overlap.

        Returns
        -------
        ndarray
            Boolean array positionally indicating where an overlap occurs.

        See Also
        --------
        Interval.overlaps : Check whether two Interval objects overlap.

        Examples
        --------
        %(examples)s
        >>> intervals.overlaps(pd.Interval(0.5, 1.5))
        array([ True,  True, False])

        Intervals that share closed endpoints overlap:

        >>> intervals.overlaps(pd.Interval(1, 3, closed='left'))
        array([ True,  True, True])

        Intervals that only have an open endpoint in common do not overlap:

        >>> intervals.overlaps(pd.Interval(1, 2, closed='right'))
        array([False,  True, False])
        overlapsc                   \        V\        \        34      '       d   \        h\        V\        4      '       g$   R\        V4      P                   2p\        V4      hV P                  '       d   VP                  '       d   \        M\        pVP                  '       d   V P                  '       d   \        M\        pV! V P                  VP                  4      V! VP                  V P                  4      ,          # )a+  
Check elementwise if an Interval overlaps the values in the IntervalArray.

Two intervals overlap if they share a common point, including closed
endpoints. Intervals that only have an open endpoint in common do not
overlap.

Parameters
----------
other : IntervalArray
    Interval to check against for an overlap.

Returns
-------
ndarray
    Boolean array positionally indicating where an overlap occurs.

See Also
--------
Interval.overlaps : Check whether two Interval objects overlap.

Examples
--------
>>> data = [(0, 1), (1, 3), (2, 4)]
>>> intervals = pd.arrays.IntervalArray.from_tuples(data)
>>> intervals
<IntervalArray>
[(0, 1], (1, 3], (2, 4]]
Length: 3, dtype: interval[int64, right]

>>> intervals.overlaps(pd.Interval(0.5, 1.5))
array([ True,  True, False])

Intervals that share closed endpoints overlap:

>>> intervals.overlaps(pd.Interval(1, 3, closed="left"))
array([ True,  True, True])

Intervals that only have an open endpoint in common do not overlap:

>>> intervals.overlaps(pd.Interval(1, 2, closed="right"))
array([False,  True, False])
z#`other` must be Interval-like, got )rp   rI   r-   rX  r   r   rq   rr   closed_leftclosed_rightr   r   r{   r|   )r[   r  r}   op1op2s   &&   rT   r  IntervalArray.overlaps  s    X em-=>??%%%**7U8L8L7MNCC.  %%%%*<*<*<b2&&&4+<+<+<b2
 499ekk*STZZ-HHHrW   c                   V ^8  d   QhRR/# )rP   rQ   r   rR   )rS   s   "rT   rU   rV   %  s     !! !!* !!rW   c                .    V P                   P                  # )a  
String describing the inclusive side the intervals.

Either ``left``, ``right``, ``both`` or ``neither``.

See Also
--------
IntervalArray.closed : Returns inclusive side of the IntervalArray.
Interval.closed : Returns inclusive side of the Interval.
IntervalIndex.closed : Returns inclusive side of the IntervalIndex.

Examples
--------

For arrays:

>>> interv_arr = pd.arrays.IntervalArray([pd.Interval(0, 1), pd.Interval(1, 5)])
>>> interv_arr
<IntervalArray>
[(0, 1], (1, 5]]
Length: 2, dtype: interval[int64, right]
>>> interv_arr.closed
'right'

For Interval Index:

>>> interv_idx = pd.interval_range(start=0, end=2)
>>> interv_idx
IntervalIndex([(0, 1], (1, 2]], dtype='interval[int64, right]')
>>> interv_idx.closed
'right'
)rd   rb   rZ   s   &rT   rb   IntervalArray.closed$  s    D zz   rW   aZ  
        Return an identical %(klass)s closed on the specified side.

        Parameters
        ----------
        closed : {'left', 'right', 'both', 'neither'}
            Whether the intervals are closed on the left-side, right-side, both
            or neither.

        Returns
        -------
        %(klass)s

        %(examples)s        
set_closedc                    V ^8  d   QhRRRR/# )rP   rb   r   rQ   r   rR   )rS   s   "rT   rU   rV   Z  s     &: &:!3 &: &:rW   c                    V\         9  d   RV 2p\        V4      hV P                  V P                  rC\	        VP
                  VR7      pV P                  W4VR7      # )a  
Return an identical IntervalArray closed on the specified side.

Parameters
----------
closed : {'left', 'right', 'both', 'neither'}
    Whether the intervals are closed on the left-side, right-side, both
    or neither.

Returns
-------
IntervalArray
    A new IntervalArray with the specified side closures.

See Also
--------
IntervalArray.closed : Returns inclusive side of the Interval.
arrays.IntervalArray.closed : Returns inclusive side of the IntervalArray.

Examples
--------
>>> index = pd.arrays.IntervalArray.from_breaks(range(4))
>>> index
<IntervalArray>
[(0, 1], (1, 2], (2, 3]]
Length: 3, dtype: interval[int64, right]
>>> index.set_closed("both")
<IntervalArray>
[[0, 1], [1, 2], [2, 3]]
Length: 3, dtype: interval[int64, both]
zinvalid option for 'closed': rl   ro   )r   r   r^   r_   r*   rd   rx   )r[   rb   r}   r{   r|   rd   s   &&    rT   r  IntervalArray.set_closedZ  sX    @ %1&:CS/!jj$++edjj8599rW   ak  
        Return a boolean whether the %(klass)s is non-overlapping and monotonic.

        Non-overlapping means (no Intervals share points), and monotonic means
        either monotonic increasing or monotonic decreasing.

        Examples
        --------
        For arrays:

        >>> interv_arr = pd.arrays.IntervalArray([pd.Interval(0, 1), pd.Interval(1, 5)])
        >>> interv_arr
        <IntervalArray>
        [(0, 1], (1, 5]]
        Length: 2, dtype: interval[int64, right]
        >>> interv_arr.is_non_overlapping_monotonic
        True

        >>> interv_arr = pd.arrays.IntervalArray([pd.Interval(0, 1),
        ...                                       pd.Interval(-1, 0.1)])
        >>> interv_arr
        <IntervalArray>
        [(0.0, 1.0], (-1.0, 0.1]]
        Length: 2, dtype: interval[float64, right]
        >>> interv_arr.is_non_overlapping_monotonic
        False

        For Interval Index:

        >>> interv_idx = pd.interval_range(start=0, end=2)
        >>> interv_idx
        IntervalIndex([(0, 1], (1, 2]], dtype='interval[int64, right]')
        >>> interv_idx.is_non_overlapping_monotonic
        True

        >>> interv_idx = pd.interval_range(start=0, end=2, closed='both')
        >>> interv_idx
        IntervalIndex([[0, 1], [1, 2]], dtype='interval[int64, both]')
        >>> interv_idx.is_non_overlapping_monotonic
        False
        is_non_overlapping_monotonicc                   V ^8  d   QhRR/# rc  rR   )rS   s   "rT   rU   rV     s     A
 A
d A
rW   c                   V P                   R8X  dt   \        V P                  RR V P                  R,          8  P	                  4       ;'       g2    V P                  RR V P                  R,          8  P	                  4       4      # \        V P                  RR V P                  R,          8*  P	                  4       ;'       g2    V P                  RR V P                  R,          8  P	                  4       4      # )a  
Return a boolean whether the IntervalArray/IntervalIndex        is non-overlapping and monotonic.

Non-overlapping means (no Intervals share points), and monotonic means
either monotonic increasing or monotonic decreasing.

See Also
--------
overlaps : Check if two IntervalIndex objects overlap.

Examples
--------
For arrays:

>>> interv_arr = pd.arrays.IntervalArray([pd.Interval(0, 1), pd.Interval(1, 5)])
>>> interv_arr
<IntervalArray>
[(0, 1], (1, 5]]
Length: 2, dtype: interval[int64, right]
>>> interv_arr.is_non_overlapping_monotonic
True

>>> interv_arr = pd.arrays.IntervalArray(
...     [pd.Interval(0, 1), pd.Interval(-1, 0.1)]
... )
>>> interv_arr
<IntervalArray>
[(0.0, 1.0], (-1.0, 0.1]]
Length: 2, dtype: interval[float64, right]
>>> interv_arr.is_non_overlapping_monotonic
False

For Interval Index:

>>> interv_idx = pd.interval_range(start=0, end=2)
>>> interv_idx
IntervalIndex([(0, 1], (1, 2]], dtype='interval[int64, right]')
>>> interv_idx.is_non_overlapping_monotonic
True

>>> interv_idx = pd.interval_range(start=0, end=2, closed="both")
>>> interv_idx
IntervalIndex([[0, 1], [1, 2]], dtype='interval[int64, both]')
>>> interv_idx.is_non_overlapping_monotonic
False
bothNr   r   )rb   rg   r_   r^   r   rZ   s   &rT   r  *IntervalArray.is_non_overlapping_monotonic  s    n ;;& Sb!DJJrN2779 = =JJsOdkk"o5::<  [["B/446 : :

3B4;;r?2779
 	
rW   c               $    V ^8  d   QhRRRRRR/# )rP   rd   zNpDtype | Nonerf   zbool | NonerQ   r   rR   )rS   s   "rT   rU   rV     s$      #2=	rW   c                p   VRJ d   \        R4      hV P                  pV P                  pV P                  4       pV P                  p\
        P                  ! \        V4      \        R7      p\        V4       F<  w  rWX,          '       d   \
        P                  Wx&   K'  \        WV,          V4      Wx&   K>  	  V# )z\
Return the IntervalArray's data as a numpy array of Interval
objects (with dtype='object')
Fz:Unable to avoid copy while creating an array as requested.ro   )r   r^   r_   r0   rb   r   r
  r   rt   r  r   r   )
r[   rd   rf   r{   r|   r  rb   r   r  
left_values
   &&&       rT   	__array__IntervalArray.__array__  s     5=L  zzyy{#d)62&t_MAwwFF	$Zq6B		 -
 rW   c                n   ^ RI p^ RIHp  VP                  V P                  P
                  4      pT! Y@P                  4      pTP                  P                  TP                  T P                  TRR7      TP                  T P                  TRR7      .RR.R	7      pT P                  4       pTP                  4       '       d{   TP                  T( 4      P                  4       ^,          p	TP                  P!                  TP"                  \%        T4      T	.TP'                  ^ 4      TP'                  ^4      .R
7      pTe   TP)                  TP*                  4      '       d   T# \-        Y4      '       dc   TP)                  T4      '       gK   \        RT P                  P
                   RTP
                   RT P                   RTP                   R2	4      hM\        RT R24      hTP.                  P1                  Yg4      #   \         d*   p\        RT P                  P
                   R24      ThRp?ii ; i)z&
Convert myself into a pyarrow Array.
N)ArrowIntervalTypez"Conversion to arrow with subtype 'z' is not supportedT)r   from_pandasr{   r|   )names)childrenzINot supported to convert IntervalArray to type with different 'subtype' (z vs z) and 'closed' (z) attributesz+Not supported to convert IntervalArray to 'z' type)pyarrow(pandas.core.arrays.arrow.extension_typesr  from_numpy_dtyperd   r   rr   rb   StructArrayr   r9   r^   r_   r0   rL  buffersfrom_buffersr   r   fieldrf  storage_typerp   r6   from_storage)
r[   r   r  r  r   r   interval_typestorage_arrayr  null_bitmaps
   &&        rT   __arrow_array__IntervalArray.__arrow_array__  s    	N	..tzz/A/ABG *';;?++77djjwDIdkkTJ 7# 8 
 yy{88::!--.668;K#//<<""M"'--a0-2E2Ea2HI	 = M {{=5566$$D44{{=11#004

0B0B/C4~ V))-T$++lT  2  A$vN  %%22=PPQ  	4TZZ5G5G4H I# # 	s   %H   H4$H//H4am  
        Return an %(return_type)s of tuples of the form (left, right).

        Parameters
        ----------
        na_tuple : bool, default True
            If ``True``, return ``NA`` as a tuple ``(nan, nan)``. If ``False``,
            just return ``NA`` as ``nan``.

        Returns
        -------
        tuples: %(return_type)s
        %(examples)s        	to_tuplesc                    V ^8  d   QhRRRR/# )rP   na_tuplerg   rQ   r   rR   )rS   s   "rT   rU   rV   Q  s     2 2$ 2* 2rW   c                    \         P                  ! \        V P                  V P                  RR7      4      pV'       g6   \
        P                  ! V P                  4       ( V\
        P                  4      pV# )a  
Return an ndarray (if self is IntervalArray) or Index         (if self is IntervalIndex) of tuples of the form (left, right).

Parameters
----------
na_tuple : bool, default True
    If ``True``, return ``NA`` as a tuple ``(nan, nan)``. If ``False``,
    just return ``NA`` as ``nan``.

Returns
-------
ndarray or Index
    An ndarray of tuples representing the intervals
        if `self` is an IntervalArray.
    An Index of tuples representing the intervals
        if `self` is an IntervalIndex.

See Also
--------
IntervalArray.to_list : Convert IntervalArray to a list of tuples.
IntervalArray.to_numpy : Convert IntervalArray to a numpy array.
IntervalArray.unique : Find unique intervals in an IntervalArray.

Examples
--------
For :class:`pandas.IntervalArray`:

>>> idx = pd.arrays.IntervalArray.from_tuples([(0, 1), (1, 2)])
>>> idx
<IntervalArray>
[(0, 1], (1, 2]]
Length: 2, dtype: interval[int64, right]
>>> idx.to_tuples()
array([(np.int64(0), np.int64(1)), (np.int64(1), np.int64(2))],
      dtype=object)

For :class:`pandas.IntervalIndex`:

>>> idx = pd.interval_range(start=0, end=2)
>>> idx
IntervalIndex([(0, 1], (1, 2]], dtype='interval[int64, right]')
>>> idx.to_tuples()
Index([(0, 1), (1, 2)], dtype='object')
T)strict)	comasarray_tuplesafezipr^   r_   r   wherer0   r   )r[   r  tupless   && rT   r  IntervalArray.to_tuplesQ  sL    \ &&s4::t{{4'PQXXtyy{lFBFF;FrW   c                    V ^8  d   QhRRRR/# )rP   r  npt.NDArray[np.bool_]rQ   r   rR   )rS   s   "rT   rU   rV     s     
4 
42 
4d 
4rW   c                	$   V P                  V4      w  r4\        V P                  \        P                  4      '       dq   \        P
                  ! V P                  W4       \        V P                  \        P                  4      '       g   Q h\        P
                  ! V P                  W4       R # V P                  P                  W4       \        V P                  \        P                  4      '       d   Q hV P                  P                  W4       R # r   )r   rp   r^   r   r   putmaskr_   _putmask)r[   r  r   r   r   s   &&&  rT   r  IntervalArray._putmask  s    "&">">u"E
djj"**--JJtzz44dkk2::6666JJt{{D6JJ1!$++rzz::::KK  3rW   c               $    V ^8  d   QhRRRRRR/# )rP   locr   itemr   rQ   r   rR   )rS   s   "rT   rU   rV     s!     7 7# 7X 7$ 7rW   c                    V P                  V4      w  r4V P                  P                  W4      pV P                  P                  W4      pV P	                  WV4      # )a  
Return a new IntervalArray inserting new item at location. Follows
Python numpy.insert semantics for negative values.  Only Interval
objects and NA can be inserted into an IntervalIndex

Parameters
----------
loc : int
item : Interval

Returns
-------
IntervalArray
)rY  r{   insertr|   r   )r[   r  r  left_insertright_insertr_  r`  s   &&&    rT   r  IntervalArray.insert  sP     %)$9$9$$?!99##C5JJ%%c8	!!(66rW   c                   V ^8  d   QhRR/# r   rR   )rS   s   "rT   rU   rV     s     B BT BrW   c                	   \        V P                  \        P                  4      '       dp   \        P                  ! V P                  V4      p\        V P
                  \        P                  4      '       g   Q h\        P                  ! V P
                  V4      pMbV P                  P	                  V4      p\        V P
                  \        P                  4      '       d   Q hV P
                  P	                  V4      pV P                  W#R 7      # )r{   r|   )rp   r^   r   r   deleter_   r   )r[   r  r_  r`  s   &&  rT   r  IntervalArray.delete  s     djj"**--yyS1Hdkk2::6666		$++s3Izz((-H!$++rzz::::**3/I!!x!AArW   c               $    V ^8  d   QhRRRRRR/# )rP   repeatszint | Sequence[int]rC  rG  rQ   r   rR   )rS   s   "rT   rU   rV     s-     1H 1H$1H 1H 
	1HrW   c                    \         P                  ! RRV/4       V P                  P                  V4      pV P                  P                  V4      pV P                  W4R7      # )a3  
Repeat elements of an IntervalArray.

Returns a new IntervalArray where each element of the current IntervalArray
is repeated consecutively a given number of times.

Parameters
----------
repeats : int or array of ints
    The number of repetitions for each element. This should be a
    non-negative integer. Repeating 0 times will return an empty
    IntervalArray.
axis : None
    Must be ``None``. Has no effect but is accepted for compatibility
    with numpy.

Returns
-------
IntervalArray
    Newly created IntervalArray with repeated elements.

See Also
--------
Series.repeat : Equivalent function for Series.
Index.repeat : Equivalent function for Index.
numpy.repeat : Similar method for :class:`numpy.ndarray`.
ExtensionArray.take : Take arbitrary positions.

Examples
--------
>>> cat = pd.Categorical(["a", "b", "c"])
>>> cat
['a', 'b', 'c']
Categories (3, str): ['a', 'b', 'c']
>>> cat.repeat(2)
['a', 'a', 'b', 'b', 'c', 'c']
Categories (3, str): ['a', 'b', 'c']
>>> cat.repeat([1, 2, 3])
['a', 'b', 'b', 'c', 'c', 'c']
Categories (3, str): ['a', 'b', 'c']
rC  r  rR   )r;  validate_repeatr{   repeatr|   r   )r[   r  rC  left_repeatright_repeats   &&&  rT   r  IntervalArray.repeat  sU    \ 	2~.ii&&w/zz((1!!{!GGrW   a  
        Check elementwise if the Intervals contain the value.

        Return a boolean mask whether the value is contained in the Intervals
        of the %(klass)s.

        Parameters
        ----------
        other : scalar
            The value to check whether it is contained in the Intervals.

        Returns
        -------
        boolean array

        See Also
        --------
        Interval.contains : Check whether Interval object contains value.
        %(klass)s.overlaps : Check if an Interval overlaps the values in the
            %(klass)s.

        Examples
        --------
        %(examples)s
        >>> intervals.contains(0.5)
        array([ True, False, False])
    containsc                   \        V\        4      '       d   \        R4      hV P                  '       d   V P                  V8  MV P                  V8*  V P
                  '       d   WP                  8  ,          # WP                  8*  ,          # )a
  
Check elementwise if the Intervals contain the value.

Return a boolean mask whether the value is contained in the Intervals
of the IntervalArray.

Parameters
----------
other : scalar
    The value to check whether it is contained in the Intervals.

Returns
-------
boolean array
    A boolean mask whether the value is contained in the Intervals.

See Also
--------
Interval.contains : Check whether Interval object contains value.
IntervalArray.overlaps : Check if an Interval overlaps the values in the
    IntervalArray.

Examples
--------
>>> intervals = pd.arrays.IntervalArray.from_tuples([(0, 1), (1, 3), (2, 4)])
>>> intervals
<IntervalArray>
[(0, 1], (1, 3], (2, 4]]
Length: 3, dtype: interval[int64, right]

>>> intervals.contains(0.5)
array([ True, False, False])
z*contains not implemented for two intervals)rp   r   rX  	open_leftr^   
open_rightr_   r#  s   &&rT   r  IntervalArray.contains  sm    D eX&&%&RSS&*nnn

U"$**:M#'???EKK
 	
8=8L
 	
rW   c                    V ^8  d   QhRRRR/# )rP   r   r   rQ   r  rR   )rS   s   "rT   rU   rV   0  s     @ @9 @)> @rW   c                	   \        V\        4      '       Ed   V P                  VP                  8w  d'   \        P                  ! V P
                  \        R 7      # V P                  VP                  8X  d=   V P                  pVP                  p\        P                  ! W#4      P                  4       # \        V P                  P                  4      \        VP                  P                  4      ,          '       d'   \        P                  ! V P
                  \        R 7      # \        V P                  \        4      VP                  \        4      4      # r   )rp   rI   rb   r   r  r  rg   rd   	_combinedr2   ravelr'   r{   r   rt   )r[   r   r{   r|   s   &&  rT   r2   IntervalArray.isin0  s    fm,,{{fmm+xx

$77zzV\\)~~((wwt+1133$TYY__58K!!9   xx

$77DKK'v)>??rW   c                   V ^8  d   QhRR/# )rP   rQ   rE   rR   )rS   s   "rT   rU   rV   D  s      < rW   c                	   V P                   P                  P                  R^4      pV P                  P                  P                  R^4      p\	        VP
                  4      '       d/   VP                  W.^R7      pVP                  R4      R,          pV# \        P                  ! VP                  4       RR7      pVP                  4       Vn        V# )rY   )rC  
complex128ro   r   NNNr   )r{   r  reshaper|   r'   rd   rn  viewr   r   r   imag)r[   r{   r|   combs   &   rT   r  IntervalArray._combinedC  s     yy  ((Q/

""**2q1 tzz** ))A * D 99\*40D  ::djjl,?DDIrW   c                    V ^8  d   QhRRRR/# )rP   combinedr   rQ   rI   rR   )rS   s   "rT   rU   rV   W  s     B Bz Bm BrW   c                   V P                   P                  p\        V4      '       d   VP                  R4      P	                  R^4      p\        V P                   \        \        34      '       g   Q h\        V P                   4      P                  VR,          VR7      p\        V P                  \        \        34      '       g   Q h\        V P                  4      P                  VR,          VR7      pM\        V\        P                  4      '       g   Q h\        P                  ! V4      P                  V4      P                  4       p\        P                  ! V4      P                  V4      P                  4       pV P!                  WER7      # )zI
Create a new IntervalArray with our dtype from a 1D complex128 ndarray.
i8ro   r  r   r  )r  rY   )r^   rd   r'   r  r  rp   r7   r8   r   r   r_   r   realr   r   r	  r   )r[   r  rd   ncr_  r`  s   &&    rT   _from_combinedIntervalArray._from_combinedW  s2   
 

  u%%t$,,R3Bdjj=.*IJJJJDH

EnRXUn3  dkkM>+JKKKKEIFnRXUn3  eRXX....wwx(//6<<>H)007==?I!!x!AArW   c                   V ^8  d   QhRR/# )rP   rQ   rI   rR   )rS   s   "rT   rU   rV   m  s     < < <rW   c                	    \        V P                  4      pV P                  \        P                  ! V4      R,          4      # )r  )r  N)r4   r  r  r   r   )r[   r  s   & rT   r4   IntervalArray.uniquem  s.    DNN#""2::b>'#:;;rW   rR   )NNFT)NFN)r|   FN)NT)T)rY   Nre  )NNr   )Prq   
__module____qualname____firstlineno____doc__can_hold_nar   r   r  r   propertyr\   __annotations__r   classmethodrx   rv   r   r   textwrapdedentrG   r   r   r   rw   r   rd   r   r   r   r   r
   r   r   r  r?   r!  r&  r)  r,  r/  r2  r?  rO  rS  rZ  r   rf  rn  rf   r0   r}  r3   r  rY  r   r  r{   r|   r  r  r  rb   r  r  r  r  r  r  r  r  r  r  r2   r  r  r4   __static_attributes____classcell__)rA  s   @rT   rI   rI      s   @D K ff$I  
1
f   j" j"X 4 #	4
 4 4 @ @ ,4??	,-(> *X *XX ,4??.	0,-(d G9 G9R ,4??	,-(B @M @MD " "::&   4 4  & B B< <,'M^ h'4 (4 h'4 (4 h'4 (4 h'4 (4 h'4 (4 h'4 (4
 
 %	

 "
 
(D  "D  "!/F;. ;.z
 9 90: .<C9 !	C9
 C9 C9J','4 !- !-F  .  .D & &> 1 1> )1$	&)*%P9Iz !! !!F +3//	+,'$&:P(=89T A
 A
L22Qh *2	*+&"2l
47,B1Hf )1	)*%<'
R@&  &B,< <rW   c                   V ^8  d   QhRR/# )rP   rQ   r   rR   )rS   s   "rT   rU   rU   r  s     $ $	 $rW   c                   \        V \        \        34      '       d7   \        V 4      ^ 8X  d'   \        P
                  ! . \        P                  R7      # \        V 4      '       d   \        V \        4      '       d   V # \        \        V RR4      \        4      '       d   \        P                  ! V 4      p MB\        V R4      '       g$   \        V \        \        \        34      '       g   V # \        V RR7      p \        V R4      '       gp   \        P                  ! V 4      p V P                  P                   R9   d?   V P                  \        P                  8w  d    V P#                  \        P                  4      p V # )a~  
Try to do platform conversion, with special casing for IntervalArray.
Wrapper around maybe_convert_platform that alters the default return
dtype in certain cases to be compatible with IntervalArray.  For example,
empty lists return with integer dtype instead of object dtype, which is
prohibited for IntervalArray.

Parameters
----------
values : array-like

Returns
-------
array
ro   rd   NTrj   r   )rp   listr   r   r   r9   int64r#   r+   r   r)   r   hasattrranger;   rd   r   r   )r   s   &rT   rs   rs   r  s      &4-((S[A-= xx"((++&!!Z%E%E	GFGT24D	E	EF#VW%%j$uAU.V.VvT:67##F#<<$)A]]288,FMrW   )m__conditional_annotations__
__future__r   r  r   r   r  typingr   r   r   r	   r
   numpyr   pandas._libsr   pandas._libs.intervalr   r   r   r   pandas._libs.missingr   pandas._typingr   r   r   r   r   r   r   r   r   r   r   pandas.compat.numpyr   r;  pandas.errorsr   pandas.util._decoratorsr   pandas.core.dtypes.castr   r    pandas.core.dtypes.commonr!   r"   r#   r$   r%   r&   r'   r(   pandas.core.dtypes.dtypesr)   r*   pandas.core.dtypes.genericr+   r,   r-   r.   pandas.core.dtypes.missingr/   r0   r1   pandas.core.algorithmsr2   r3   r4   r	  r5   pandas.core.arrays.baser6   pandas.core.arrays.datetimesr7   pandas.core.arrays.timedeltasr8   pandas.core.commoncorecommonr  pandas.core.constructionr9   r  r:   r;   pandas.core.indexersr<   r=   pandas.core.opsr>   r?   collections.abcr@   rA   rB   r^  rD   r   rE   r  floatrF   rG   _shared_docs_kwargsrI   rs   )r)  s   @rT   <module>rF     sR   " "       $    / , .	 	 	   
 3 7 8     

  
 ("**4i 4"U*i *(* ~ * _&
B 8" g v Ow<M> w< w<t=$rW   