
    EgM              
       B   d dl mZ d dlZd dlZd dlmc mZ d dl	m
Z
 d dlmZ d dlmZmZmZmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmc mZ   ej!        ddg          d	             Z" G d
 d          Z# G d de#          Z$ G d de#          Z% G d de#          Z& G d de#          Z'ej(        )                    dg d          d             Z*d Z+ej(        )                    dd ej,        d ej-        d                    g          d             Z.dS )    )partialN)is_unsigned_integer_dtype)IntervalDtype)
CategoricalCategoricalDtypeCategoricalIndexIndexIntervalIntervalIndex
date_rangenotnaperiod_rangetimedelta_range)IntervalArrayfooparamsc                     | j         S Nparam)requests    d/var/www/sysmax/venv/lib/python3.11/site-packages/pandas/tests/indexes/interval/test_constructors.pynamer      s
    =    c                      e Zd ZdZ ej        g dej        f ej        dd          ej        f e	 ej        ddej                            ej        f e	 ej        ddej
                            ej
        f e	 ej        d	d
d          ej                  ej        f edd          df eddd          df edd          dfg          d             Zd Zej                            d e	g dej                  df e	g dej                  df e	g dej                  df e	g dej                  df edd          df edd          dfg          d             Zej                            d e	g dej                   e	g dej
                   e	g dej                   edd           edd          g          d              Zej                            dej        gd!z  ej        gd"z  ej        gd#z  g          d$             Zej                            dg  ej        g d           ej        g d%           ej        g d           ej        g d           ej        g d          g          d&             Zej                            d ed'           ed(           ej         ed(          e           ej         ed(          d)          g          d*             Zej                            d+eeg          d,             Zd- Zd.S )/ConstructorTestsz
    Common tests for all variations of IntervalIndex construction. Input data
    to be supplied in breaks format, then converted by the subclass method
    get_kwargs_from_breaks to the expected format.
    )         \   i  
   int64dtypei            g      ?20180101periodsz<M8[ns]z
US/Easternr,   tzzdatetime64[ns, US/Eastern]z1 dayz<m8[ns]r   c                     |j         S r   r   selfr   s     r   breaks_and_expected_subtypez,ConstructorTests.breaks_and_expected_subtype(   s      }r   c                 n   |\  }}|                      ||          } |d||d|}|j        |k    sJ |j        |k    sJ |j        j        |k    sJ t          j        |j        t          |d d         |                     t          j        |j	        t          |dd          |                     d S )N)closedr   r$       )
get_kwargs_from_breaksr4   r   r%   subtypetmassert_index_equalleftr	   right)	r1   constructorr2   r4   r   breaksexpected_subtyperesult_kwargsresults	            r   test_constructorz!ConstructorTests.test_constructor:   s    #>  33FFCCGFGGGG}&&&&{d""""|#'77777
fk5DT+U+U+UVVV
flE&*DT,U,U,UVVVVVr   zbreaks, subtype)r   r6      r      float64zdatetime64[ns]ztimedelta64[ns]
2017-01-01   c                    |                      |                    |                    } |di |}|                      |          }t          |d          }|t          |          fD ]!} |dd|i|}	t	          j        |	|           "d S )Nr=   r%   r7   )r8   astyper   strr:   r;   )
r1   r>   r?   r9   expected_kwargsexpectedrA   iv_dtyper%   rB   s
             r   test_constructor_dtypez'ConstructorTests.test_constructor_dtypeG   s     55fmmG6L6LMM;111133F;; '22H. 	4 	4E [>>u>>>F!&(3333	4 	4r   r?   c                    t          |j                  }|                     |          }|t          |          fD ]K}t	          j        d           5   |d|dd|}d d d            n# 1 swxY w Y   |j        j        dk    sJ Ld S )Nr<   r%   r4   r7   )r   r%   r8   rK   r:   assert_produces_warningr4   )r1   r>   r?   rN   rA   r%   rB   s          r   test_constructor_pass_closedz-ConstructorTests.test_constructor_pass_closed]   s     !..33F;;H. 	1 	1E+D11 R R$Q5QQ=QQR R R R R R R R R R R R R R R<&&00000	1 	1s   A))A-	0A-	rD   rE   2   c                 .   |                      |          } |dd|i|}t          j        }t          j        |d d         t                    }|j        |k    sJ |j        j        |k    sJ t          j	        t          j        |          |           d S )Nr4   r5   r$   r7   )
r8   nprF   arrayobjectr4   r%   r9   r:   assert_numpy_array_equal)r1   r>   r?   r4   rA   rB   r@   expected_valuess           r   test_constructor_nanz%ConstructorTests.test_constructor_nanr   s     33F;;<<F<m<<:(6#2#;f===}&&&&|#'77777
#BHV$4$4oFFFFFr   uint64c                 N   |                      |          } |dd|i|}t          j        g t                    }t	          |dt          j                  }|j        sJ |j        |k    sJ |j        j	        |k    sJ t          j        t          j        |          |           d S )Nr4   r$   r%   r7   )r8   rV   rW   rX   getattrr#   emptyr4   r%   r9   r:   rY   )r1   r>   r?   r4   rA   rB   rZ   r@   s           r   test_constructor_emptyz'ConstructorTests.test_constructor_empty   s     33F;;<<F<m<<(2V444"67BH==|}&&&&|#'77777
#BHV$4$4oFFFFFr   
0123456789
abcdefghijz<U1c                     d}t          j        t          |          5   |di |                     |           d d d            d S # 1 swxY w Y   d S )NIcategory, object, and string subtypes are not supported for IntervalIndexmatchr7   )pytestraises	TypeErrorr8   )r1   r>   r?   msgs       r   test_constructor_stringz(ConstructorTests.test_constructor_string   s      	 ]9C000 	? 	?K>>$55f==>>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	?s   AAAcat_constructorc                     t          j        dd          }t          j        |          } ||          }|                     |          } |di |}t          j        ||           d S )Nr"   r#   r$   r7   )rV   aranger   from_breaksr8   r:   r;   )r1   r>   rl   r?   rM   
cat_breaksrA   rB   s           r   "test_constructor_categorical_validz3ConstructorTests.test_constructor_categorical_valid   sx     2W--- ,V44$_V,,
33J??--}--
fh/////r   c                 N   |                      t          d                    }d}t          j        t          |          5   |dddi| d d d            n# 1 swxY w Y   d}t          j        t
          |          5   |dddi| d d d            n# 1 swxY w Y   d	}t          j        t
          |          5   |dddi| d d d            n# 1 swxY w Y   t          d
d          }|                      |          }d}t          j        t          |          5   |di | d d d            n# 1 swxY w Y   |                      t          ddd                    }d}t          j        t          |          5   |di | d d d            d S # 1 swxY w Y   d S )Nr"   z8closed must be one of 'right', 'left', 'both', 'neither're   r4   invalidz)dtype must be an IntervalDtype, got int64r%   r#   z(data type ["']invalid["'] not understoodz
2000-01-01r+   z:Period dtypes are not supported, use a PeriodIndex insteadr5   z+left side of interval must be <= right sider7   )r8   rangerg   rh   
ValueErrorri   r   )r1   r>   fillerrj   r,   periods_kwargsdecreasing_kwargss          r   test_generic_errorsz$ConstructorTests.test_generic_errors   s#   ,,U2YY77 I]:S111 	4 	4K33y3F333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 :]9C000 	1 	1K00g0000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 ;]9C000 	3 	3K22i26222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 |R88844W==J]:S111 	* 	*K)).)))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* !77b"b8I8IJJ;]:S111 	- 	-K,,+,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-sZ    AAA?BBB>CCC#	D88D<?D<	FF!FN) __name__
__module____qualname____doc__rg   fixturerV   r#   rn   r	   r\   rF   r   r   r2   rC   markparametrizerO   rS   nanr[   rW   r`   tuplelistrX   rk   r   r   rq   ry   r7   r   r   r   r   !   s         V^!!!28,RYr)))284U929S"BH55566AU929R2955566	BU929RS))<<<bjIZ
B///;
:rlCCC, _Wb1119=
    W W W [U???"(333Y?U???"(3335EFU???"(3335FGU???"*555w?Za000':_Wa000':	

 
	4 	4
 
	4 [E///222E///333E///444J|Q///OGQ///	
	 		1 	1	 		1 [X1rvhlRVHrM'RSS
G 
G TS
G [BHRw'''BHRx(((BHRy)))BHR/000BHR0111	

 
G G
 
G [E,DBHTT,''v666BHTT,''u555		
 ? ? ? [.>N0OPP	0 	0 QP	0- - - - -r   r   c                      e Zd ZdZej        d             ZddZd Zej	        
                    dej        ej        fej        ej        fg          d             Zej	        
                    deeg          d	             Zd
S )TestFromArraysz+Tests specific to IntervalIndex.from_arraysc                     t           j        S r   )r   from_arraysr1   s    r   r>   zTestFromArrays.constructor       ((r   r=   c                 ,    |dd         |dd         dS )z
        converts intervals in breaks format to a dictionary of kwargs to
        specific to the format expected by IntervalIndex.from_arrays
        Nr5   r6   )r<   r=   r7   r1   r?   r4   s      r   r8   z%TestFromArrays.get_kwargs_from_breaks   s"    
 ssfQRRj999r   c                    t          t          d          d          }d}t          j        t          |          5  t          j        |d d         |dd                     d d d            n# 1 swxY w Y   g d}d	d
g}d}t          j        t          |          5  t          j        ||           d d d            d S # 1 swxY w Y   d S )N
01234abcdeTorderedrd   re   r5   r6   )r   r6   rD   rD   r   z(left and right must have the same length)r   r   rg   rh   ri   r   r   ru   )r1   datarj   r<   r=   s        r   test_constructor_errorsz&TestFromArrays.test_constructor_errors   sZ   4--t<<<  	 ]9C000 	; 	;%d3B3iabb:::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; yyA8]:S111 	3 	3%dE222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3s#   &A..A25A2CCCzleft_subtype, right_subtypec                    t          j        d|          }t          j        dd|          }t          j        ||          }t	          |t           j                  }t	          |t           j                  }t           j        }t          j        |j        |           t          j        |j	        |           |j
        j        |k    sJ dS )z:mixed int/float left/right results in float for both sides	   r$   r6   r"   N)rV   rn   r   r   r	   rF   r:   r;   r<   r=   r%   r9   )	r1   left_subtyperight_subtyper<   r=   rB   expected_leftexpected_rightr@   s	            r   test_mixed_float_intz#TestFromArrays.test_mixed_float_int   s    
 y,///	!R}555*477d"*555uBJ777:
fk=999
flN;;;|#'7777777r   interval_clsc                    t          ddd          }t          ddd          }|                    ||          }|                    |                    d          |          }t          j        ||           ||d         z
  }||d         z
  }|                    ||          }|                    |                    d          |          }	t          j        ||	           |                    d          }
|                    d          }|                    |
|          }|                    |
                    d          |          }t          j        ||           d S )	Nz
2016-01-01r   s)r,   unitrG   msr   UTC)r   r   as_unitr:   assert_equaltz_localize)r1   r   r<   r=   rB   rM   left2right2result2	expected2left3right3result3	expected3s                 r   .test_from_arrays_mismatched_datetimelike_resosz=TestFromArrays.test_from_arrays_mismatched_datetimelike_resos  sN    ,<<<<>>>))$66++DLL,>,>FF
))) tAwa**5&99 ,,U]]4-@-@&II	
+++   ''""5))**5&99 ,,U]]4-@-@&II	
+++++r   Nr=   )rz   r{   r|   r}   rg   r~   r>   r8   r   r   r   rV   r#   rF   r   r   r   r   r7   r   r   r   r      s        55^) ) ^): : : :3 3 3" [%2:(>RX@V'W 8 8 8 [^m]-KLL, , ML, , ,r   r   c                   L    e Zd ZdZej        d             Zd	dZd Zd Z	d Z
dS )
TestFromBreaksz+Tests specific to IntervalIndex.from_breaksc                     t           j        S r   )r   ro   r   s    r   r>   zTestFromBreaks.constructor!  r   r   r=   c                 
    d|iS )z
        converts intervals in breaks format to a dictionary of kwargs to
        specific to the format expected by IntervalIndex.from_breaks
        r?   r7   r   s      r   r8   z%TestFromBreaks.get_kwargs_from_breaks%  s    
 &!!r   c                     t          t          d          d          }d}t          j        t          |          5  t          j        |           d d d            d S # 1 swxY w Y   d S )Nr   Tr   rd   re   )r   r   rg   rh   ri   r   ro   )r1   r   rj   s      r   r   z&TestFromBreaks.test_constructor_errors,  s    4--t<<<  	 ]9C000 	, 	,%d+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,s   AA"%A"c                     dg}t          j        |          }t          j        g           }t          j        ||           dS )z3breaks of length one produce an empty IntervalIndexr   N)r   ro   r:   r;   )r1   r?   rB   rM   s       r   test_length_onezTestFromBreaks.test_length_one6  sB    *622 ,R00
fh/////r   c                     t          j        d          }t          j        |          j        }|j        j        |j        j        |j        j        usJ d S d S )NrH   )rV   rn   r   ro   _data_leftbase_right)r1   r?   rB   s      r   test_left_right_dont_share_dataz.TestFromBreaks.test_left_right_dont_share_data=  sS    1*6228| (FL,=V]EW,W,W,W,W((,W,Wr   Nr   )rz   r{   r|   r}   rg   r~   r>   r8   r   r   r   r7   r   r   r   r     s{        55^) ) ^)" " " ", , ,0 0 0X X X X Xr   r   c                   F    e Zd ZdZej        d             ZddZd Zd Z	dS )	TestFromTuplesz+Tests specific to IntervalIndex.from_tuplesc                     t           j        S r   )r   from_tuplesr   s    r   r>   zTestFromTuples.constructorG  r   r   r=   c                    t          |          rt          j        |j         d           t	          |          dk    rd|iS t          t          |dd         |dd                             }t          |t
          t          f          rd|iS t          t          |dd          t                    rd|                    |          iS dt          j        |          iS )z
        converts intervals in breaks format to a dictionary of kwargs to
        specific to the format expected by IntervalIndex.from_tuples
        z- not relevant IntervalIndex.from_tuples testsr   r   Nr5   r6   r%   )r   rg   skipr%   lenr   zip
isinstancer   r^   r   _constructorcomasarray_tuplesafe)r1   r?   r4   tupless       r   r8   z%TestFromTuples.get_kwargs_from_breaksK  s    
 %V,, 	XK6<VVVWWWv;;!F##c&"+vabbz2233ftUm,, 	9F##668HII 	9F//7788-f5566r   c                 J   g d}d}t          j        t          |                    |                    5  t	          j        |           d d d            n# 1 swxY w Y   g d}d}t          j        t          |                    |                    5  t	          j        |           d d d            n# 1 swxY w Y   g d}t          j        t          |                    |                    5  t	          j        |           d d d            d S # 1 swxY w Y   d S )N)r   r6   rD   r   rE   z5IntervalIndex.from_tuples received an invalid item, 2)tre   )r   )rD   r   z>IntervalIndex.from_tuples requires tuples of length 2, got {t})r   )rD   r   rE   )rH      )rg   rh   ri   formatr   r   ru   )r1   r   rj   s      r   r   z&TestFromTuples.test_constructor_errors]  s   $$$E]9CJJJ,@,@AAA 	. 	.%f---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. (''N]:SZZ&Z-A-ABBB 	. 	.%f---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. -,,]:SZZ&Z-A-ABBB 	. 	.%f---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.s5   AAAB88B<?B<6DDDc                     dt           j        t           j        fdg}t          j        |          }t          j        dt           j        dg          }t	          j        ||           d S )Nr   )rD   r   )rV   r   r   r   r:   r;   )r1   na_tupleidx_na_tupleidx_na_elements       r   test_na_tupleszTestFromTuples.test_na_tuplesn  sY    RVRV,f5$0::&2FBFF3KLL
lN;;;;;r   Nr   )
rz   r{   r|   r}   rg   r~   r>   r8   r   r   r7   r   r   r   r   D  sg        55^) ) ^)7 7 7 7$. . ."< < < < <r   r   c                      e Zd ZdZ ej        e eed          gddg          d             Z	ej        d             Z
dd
Zd Zd Zd Zej                            dg dfej        ej        gdf eddd           eddd          gdf eddd           eddd	          gdf ej         ed          d          d	fg          d             Zej                            deej        eeg          d             Zd ZdS )TestClassConstructorsz6Tests specific to the IntervalIndex/Index constructorsintervalr$   r   r	   )r   idsc                     |j         S r   r   r0   s     r   klasszTestClassConstructors.klassy  s     }r   c                     t           S r   )r   r   s    r   r>   z!TestClassConstructors.constructor  s    r   r=   c                    t          |          rt          j        |j         d           t	          |          dk    rd|iS fdt          |dd         |dd                   D             }t          |t                    rd|iS t          t          |dd          t                    rd|
                    |          iS dt          j        |t          	          iS )
z
        converts intervals in breaks format to a dictionary of kwargs to
        specific to the format expected by the IntervalIndex/Index constructors
        z) not relevant for class constructor testsr   r   c                 Z    g | ]'\  }}t          |          rt          ||          n|(S r7   )r   r
   ).0r<   r=   r4   s      r   
<listcomp>z@TestClassConstructors.get_kwargs_from_breaks.<locals>.<listcomp>  sI     
 
 
e .34[[BHT5&)))d
 
 
r   Nr5   r6   r%   r$   )r   rg   r   r%   r   r   r   r   r^   r   r   rV   rW   rX   )r1   r?   r4   ivss     ` r   r8   z,TestClassConstructors.get_kwargs_from_breaks  s    
 %V,, 	TK6<RRRSSSv;;!F##
 
 
 
"6#2#;qrr
;;
 
 

 fd## 	6C= 668HII 	6F//4455F33344r   c                     dS )z
        override the base class implementation since errors are handled
        differently; checks unnecessary since caught at the Interval level
        Nr7   )r1   r>   s     r   ry   z)TestClassConstructors.test_generic_errors  s      r   c                     d S r   r7   r   s    r   rk   z-TestClassConstructors.test_constructor_string  s	     	r   c                    t          ddd          t          ddd          g}d}t          j        t          |	          5   ||           d d d            n# 1 swxY w Y   d
}t          j        t          |	          5   |d           d d d            n# 1 swxY w Y   d}t          j        t          |	          5   |ddg           d d d            d S # 1 swxY w Y   d S )Nr   r6   r=   r4   rD   r   r<   z-intervals must all be closed on the same sidere   zX(IntervalIndex|Index)\(...\) must be called with a collection of some kind, 5 was passedrH   z?type <class 'numpy.int(32|64)'> with value 0 is not an interval)r
   rg   rh   ru   ri   )r1   r   r   rj   s       r   r   z-TestClassConstructors.test_constructor_errors  s   1W---x1V/L/L/LM=]:S111 	 	E#JJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
& 	 ]9C000 	 	E!HHH	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 P]9C000 	 	E1a&MMM	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s6   AA!ABB!BCC!$C!zdata, closedbothneitherr   r   r   rD   rH   r<   c                     t          |t                    r|                                }nd |D             }t          j        ||          } |||          }t	          j        ||           d S )Nc                 L    g | ]!}t          |          r|j        |j        fn|"S r7   )r   r<   r=   )r   ivs     r   r   zGTestClassConstructors.test_override_inferred_closed.<locals>.<listcomp>  s1    NNN2U2YY>rw))BNNNr   r   )r   r   	to_tuplesr   r:   r;   )r1   r>   r   r4   r   rM   rB   s          r   test_override_inferred_closedz3TestClassConstructors.test_override_inferred_closed  s}    $ dM** 	O^^%%FFNNNNNF ,VFCCCT&111
fh/////r   values_constructorc                 .   t          dd          t          dd          t          dd          g} ||          }t          |t                    }t          |          t          u sJ t	          j        |j        t          j        |                     d S )Nr   r6   rD   r   r$   )	r
   r	   rX   typer:   rY   valuesrV   rW   )r1   r   	intervalsr   rB   s        r   test_index_object_dtypez-TestClassConstructors.test_index_object_dtype  s    
 a^^Xa^^Xa^^D	##I..vV,,,F||u$$$$
#FM28F3C3CDDDDDr   c                    t          ddd          t          ddd          t          ddd          t          dd	d
          g}t          |          }t          |t                    }t          j        ||           d S )Nr   r6   r<   r   rD   r=   r   r   rE   r   r$   )r
   r	   rX   r:   r;   )r1   r   rB   rM   s       r   test_index_mixed_closedz-TestClassConstructors.test_index_mixed_closed  s     Q&)))Q'***Q),,,Q&)))	
	 y!!&111
fh/////r   Nr   )rz   r{   r|   r}   rg   r~   r   r   r	   r   r>   r8   ry   rk   r   r   r   rV   r   r
   ro   rt   r   r   rW   r   r   r   r7   r   r   r   r   v  s       @@V^wwuJ???@g&   	  ^  ^5 5 5 5,      ( [Lfbfy)!Qy11188Aq3S3S3ST
 !Qv...Ag0N0N0NO ']&uuQxx???I	
  0 0!  0 [tRX}mL E E E
0 
0 
0 
0 
0r   r   timezone)r   z
US/PacificGMTc                     t          dd|           }d|  d| d}t          j        ddgdd	g||
          }t          j        |d d         |dd          |          }t          j        ||           d S )N2022r   r-   zinterval[datetime64[ns, z], ]z
2022-01-01z
2022-01-02z
2022-01-03r4   r%   r5   r6   r   )r   r   r   r:   r;   )r   inclusive_endpoints_fixturedatesr%   rB   rM   s         r   test_interval_index_subtyper     s     vqX666ERxRR4ORRRE&	|$	|$*	  F (crc
E!""I&A  H &(+++++r   c                  T   t          t          j        d          } d}t          j        t
          |          5  t          g | d           d d d            n# 1 swxY w Y   t          j        t
          |          5  t          g | d           d d d            d S # 1 swxY w Y   d S )Nr<   z*closed keyword does not match dtype.closedre   r   rQ   )r   rV   r#   rg   rh   ru   r   r   )r%   rj   s     r   test_dtype_closed_mismatchr     s)    "(F++E
6C	z	-	-	- 9 9bi88889 9 9 9 9 9 9 9 9 9 9 9 9 9 9 
z	-	-	- 9 9bi88889 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9s#   AAA=BB!$B!r%   Float64zfloat64[pyarrow]pyarrow)marksc                     ddg}t          | d          }t          j        |d|          }|j        |k    sJ t          j        |d                              |          }t          j        ||           d S )N)g        皙?)r   g333333?r<   )r9   r4   r   r   )r   r   r   r%   rJ   r:   r;   )r%   binsinterval_dtyperB   rM   s        r   test_ea_dtyper    s     
#D"5@@@N&tF.QQQF<>))))(f===DD^TTH&(+++++r   )/	functoolsr   numpyrV   rg   pandas.util._test_decoratorsutil_test_decoratorstdpandas.core.dtypes.commonr   pandas.core.dtypes.dtypesr   pandasr   r   r   r	   r
   r   r   r   r   r   pandas._testing_testingr:   pandas.core.arraysr   pandas.core.commoncorecommonr   r~   r   r   r   r   r   r   r   r   r   r   r   
skip_if_nor  r7   r   r   <module>r     s              ) ) ) ) ) ) ) ) ) ? ? ? ? ? ? 3 3 3 3 3 3                              , , , , , ,                   e}%%%  &%r- r- r- r- r- r- r- r-jE, E, E, E, E,% E, E, E,P#X #X #X #X #X% #X #X #XL/< /< /< /< /<% /< /< /<du0 u0 u0 u0 u0, u0 u0 u0p %A%A%ABB, , CB, 
9 
9 
9 /}r}Y7O7OPPPQ , ,	 , , ,r   