
    ǄgEz                     "   d Z ddlmZmZ ddlZddlZddlmZmZ ddl	m
Z
mZmZ ddlmZmZ ddlmZ  ej                   e      Zd Zd	 Z ed
d      Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%de&fdZ'dddZ(y) z&
Implement transformation on Numba IR
    )
namedtupledefaultdictN)compute_cfg_from_blocksfind_top_level_loops)errorsirir_utils)compute_use_defsr   )	PYVERSIONc                 \     fd}d }fd}t         j                  d       g }t               D ]w  }t         j                  d|        ||      s" ||      s+ ||      s4 j	                         |j
                  vsQ|j                  |       t         j                  d|       y |S )zE
    Returns a list of loops that are candidate for loop lifting
    c                    t               }| j                  D ]A  }t        d j                  |      D              }|st        j	                  d        y||z  }C t        |      dk(  }t        j	                  d||       |S )z)all exits must point to the same locationc              3   &   K   | ]	  \  }}|  y wN ).0x_s      ]/home/mcse/projects/flask_80/flask-venv/lib/python3.12/site-packages/numba/core/transforms.py	<genexpr>zL_extract_loop_lifting_candidates.<locals>.same_exit_point.<locals>.<genexpr>   s     8da8s   zreturn-statement in loop.F   zsame_exit_point=%s (%s))setexits
successors_loggerdebuglen)loopoutedgesksuccsokcfgs        r   same_exit_pointz9_extract_loop_lifting_candidates.<locals>.same_exit_point   s{    5 	A8cnnQ&788E 9:H	 ]a/X>	    c                 b    t        | j                        dk(  }t        j                  d|       |S )zthere is one entryr   zone_entry=%s)r   entriesr   r   )r   r!   s     r   	one_entryz3_extract_loop_lifting_candidates.<locals>.one_entry(   s(    !#nb)	r$   c                    t        | j                        t        | j                        z  t        | j                        z  }t	        j
                  |      D ]j  }|j                  D ]Y  }t        |t        j                        st        |j                  t        j                        sCt        j                  d         y l t        j                  d       y)z!cannot have yield inside the loopz	has yieldFzno yieldT)r   bodyr&   r   map__getitem__
isinstancer   AssignvalueYieldr   r   )r   insidersblkinstblockss       r   cannot_yieldz6_extract_loop_lifting_candidates.<locals>.cannot_yield.   s    tyy>C$55DJJGv))84 	%C %dBII.!$**bhh7k2$	%	% 	j!r$   zfinding looplift candidatesztop-level loop: %szadd candidate: %s)r   infor   r   entry_pointr&   append)r"   r3   r#   r'   r4   
candidatesr   s   ``     r    _extract_loop_lifting_candidatesr9      s    
 
 LL./ J$S) 5*D1D!io,t:LOOT\\1d#MM-t45 r$   c                 z   ||   }||   }i }|D ]
  }| |   ||<    t               }	t               }
t        |      }|j                  j                         D ]  }|	|z  }		 |j                  j                         D ]  }|
|z  }
	 |	|
z  }t        t        |      |z        }t        t        |      |z  |
z        }||fS )z7Find input and output variables to a block region.
    )r   r
   usemapvaluesdefmapsorted)r3   livemapcallfromreturntobody_block_idsinputsoutputs
loopblocksr   	used_varsdef_varsdefsvsused_or_defineds                 r   find_region_inout_varsrK   H   s     XFhG
 J "q	
1" IuHJ'Dkk  " R	kk  " B(*O CK/12FS\O3h>?G7?r$   loop_lift_infoz%loop,inputs,outputs,callfrom,returntoc                    t        | |      }g }|D ]  }|j                  \  }t        t        |j                              }t        |j                        dkD  r| j                  |      \  \  }}	n|}t        |j                        t        |j                        z  t        |j                        z  }
t        |||||
      \  }}t        |||||      }|j                  |        |S )z8
    Returns information on looplifting candidates.
    r   )r3   r?   r@   rA   rB   )r   rC   rD   r@   rA   )r9   r&   nextiterr   r   r   r   r)   rK   _loop_lift_infor7   )r"   r3   r?   loops	loopinfosr   r@   an_exitrA   r   local_block_idsrC   rD   llis                 r   _loop_lift_get_candidate_infosrV   h   s     -S&9EI \\
tDJJ'(tzz?Q!nnW5O]h Hdii.3t||+<<s4::N0*
 4'/(D-0 r$   c                     |j                   }|j                  }t        j                  ||      }t	        j
                  || |||       |S )zR
    Transform calling block from top-level function to call the lifted loop.
    scopeloc)newblockcallee
label_nextrC   rD   )rY   rZ   r   Blockr	   fill_block_with_call)
liftedloopblockrC   rD   rA   rY   rZ   r1   s           r   _loop_lift_modify_call_blockrb      sJ     KKE
))C
((C
(C!! Jr$   c                 |   || j                      }|j                  }|j                  }t        |      dz
  }t	        j
                  t        j                  ||      | j                  | j                         ||<   t	        j                  t        j                  ||      | j                        || j                  <   y)z?
    Inplace transform loop blocks for use as lifted loop.
    r   rX   )ra   rC   r]   )ra   rD   N)r@   rY   rZ   minr	   fill_callee_prologuer   r^   rC   fill_callee_epiloguerD   rA   )loopinfor3   entry_blockrY   rZ   firstblks         r   _loop_lift_prepare_loop_funcrj      s     **+KE
//C 6{QH44hhU,$$F8
 !) = =hhU,  !F8r$   c                 D   ddl m} |j                  }t        |j                        t        |j
                        z  }	t        |j                        dkD  r|	|j                  z  }	t        fd|	D              }
t        ||
       | j                  |
t        |j                        t        |j                        d      } ||||||      }t        ||j                     |j                  |j                  |j                         }|	D ]  }|=  ||j                  <   |S )zu
    Modify the block inplace to call to the lifted-loop.
    Returns a dictionary of blocks of the lifted-loop.
    r   )
LiftedLoopr   c              3   H   K   | ]  }||   j                         f  y wr   )copy)r   r   r3   s     r   r   z+_loop_lift_modify_blocks.<locals>.<genexpr>   s!     Cq&)..*+Cs   "T)r3   	arg_names	arg_countforce_non_generator)numba.core.dispatcherrl   r   r   r)   r&   r   r   dictrj   derivetuplerC   rb   r@   rD   rA   )func_irrg   r3   	typingctx	targetctxflagslocalsrl   r   loopblockkeysrE   	lifted_irr`   	callblockr   s     `            r   _loop_lift_modify_blocksr~      s    1 ==D		NS%66M
4::#C]CCJ :6 j).x)?),X__)=37  9I I%y%AJ -Z@Q@Q9R-5__h>N>N-5->->@I  1I !*F8r$   c                 2   t        |j                        dk  ryt        |j                        }| j                         }t               }t        |      }|r5|j	                         }|j                  |       |||   |hz
  z  }||z
  }|r5t        |      dkD  S )zReturns True if there is more than one exit in the loop.

    NOTE: "common exits" refers to the situation where a loop exit has another
    loop exit as its successor. In that case, we do not need to alter it.
    r   F)r   r   r   post_dominatorspopadd)r"   lpinfor   pdom	processedremainnodes          r   _has_multiple_loop_exitsr      s     6<<AE D IZF
zz|ddtf$$"	  u:>r$   c                    ddl m} t        | j                        }|j	                         j                         D ](  }t        ||      st        | |j                        \  } }* | j                           ||       j                          | S )z(Canonicalize loops for looplifting.
    r   )PostProcessor)numba.core.postprocr   r   r3   rQ   r<   r   _fix_multi_exit_blocksr   _reset_analysis_variablesrun)rv   r   r"   	loop_info_common_keys        r   _pre_looplift_transformr      sy     2
!'..
1CYY['') 	#C3#9$ G[ %%'' Nr$   c           
         t        |       } | j                  j                         }t        |      }t	        ||| j
                  j                        }g }|r.t        j                  dt        |      | j                                |D ]$  }	t        | |	|||||      }
|j                  |
       & | j                  |      }||fS )z
    Loop lifting transformation.

    Given a interpreter `func_ir` returns a 2 tuple of
    `(toplevel_interp, [loop0_interp, loop1_interp, ....])`
    z+loop lifting this IR with %d candidates:
%sr3   )r   r3   rn   r   rV   variable_lifetimer?   r   r   r   dump_to_stringr~   r7   rt   )rv   rw   rx   ry   rz   r3   r"   rR   rQ   rg   liftedmains               r   loop_liftingr      s     &g.G^^  "F
!&
)C.sF/6/H/H/P/PRIED)ng&<&<&>	@ )'8V*3YvOV >>>(D;r$   c                      t                j                         fd fdfd}d fd} |       D ]
  } ||        S )z5
    Rewrite loops that have multiple backedges.
    c                  <    t         j                               dz   S )Nr   )maxkeys)	newblockss   r   new_block_idz6canonicalize_cfg_single_backedge.<locals>.new_block_id"  s    9>>#$q((r$   c                     d}| j                   D ]<  }|   }|j                  j                         }| j                  |v s1|dz  }|dkD  s< y y)Nr   r   TF)r)   
terminatorget_targetsheader)r   countr   r1   edgesr3   s        r   has_multiple_backedgesz@canonicalize_cfg_single_backedge.<locals>.has_multiple_backedges%  sZ     	 A)CNN..0E{{e#
19	  r$   c               3   n   K   j                         j                         D ]  }  |       s|   y wr   )rQ   r<   )lpr"   r   s    r   #yield_loops_with_multiple_backedgeszMcanonicalize_cfg_single_backedge.<locals>.yield_loops_with_multiple_backedges2  s2     ))+$$& 	B%b)	s   *55c                    fd}t        | t        j                        rMt        j                  | j                   || j                         || j
                        | j                        S t        | t        j                        r1t        j                   || j                        | j                        S | j                         rJ | S )Nc                     | k(  rS | S r   r   )targetdstsrcs    r   replacezIcanonicalize_cfg_single_backedge.<locals>.replace_target.<locals>.replace8  s    !S=C5f5r$   )condtruebrfalsebrrZ   r   rZ   )
r,   r   Branchr   r   r   rZ   Jumpr   r   )termr   r   r   s    `` r   replace_targetz8canonicalize_cfg_single_backedge.<locals>.replace_target7  s    	6 dBII&99$))$+DKK$8%,T\\%:!%+ + bgg&77'$++"6DHHEE'')))Kr$   c                    | j                   }        }| j                  D ]Z  }	|   }||j                  j                         v s%|j	                         } 
|j                  ||      |j                  d<   |	|<   \ 	|   }t        j                  |j                  |j                        }|j                  t        j                  ||j                               |	|<   y)zC
        Add new tail block that gathers all the backedges
        rX   r   N)r   r)   r   r   rn   r   r^   rY   rZ   r7   r   )r   r   tailkeyblkkeyr1   newblkentryblktailblkr   r   r   s           r   rewrite_single_backedgezAcanonicalize_cfg_single_backedge.<locals>.rewrite_single_backedgeF  s     .ii 	+FF#C3355"018#:B$*	&!	+ V$((X\\Brwwf'++>?$	'r$   )r   rn   )	r3   r   r   r   r"   r   r   r   r   s	   `   @@@@@r    canonicalize_cfg_single_backedger     sW     "&
)CI)
%* 45 &%& r$   c                     t        |       S )zc
    Rewrite the given blocks to canonicalize the CFG.
    Returns a new dictionary of blocks.
    )r   r   s    r   canonicalize_cfgr   a  s    
 ,F33r$   c           
      6   ddl m} dfd	}t        |       \  }} |s| g fS |j                  |       j	                          | j
                  sJ | j
                  }| j                  j                         }	|j                  }
g }|D ]p  \  }}g }t        |
||      D ]  }|j                  |        t        |	|          t        | |	|      \  }}|j                  | |	|||||      }|j                  |       r |s| }||fS | j                  |	      }||fS )zWith-lifting transformation

    Rewrite the IR to extract all withs.
    Only the top-level withs are extracted.
    Returns the (the_new_ir, the_lifted_with_ir)
    r   )postprocc                     ddl m}m} j                         }|rd|_        d|_        d|_        d|_        |}n|} || 
	|fi |S )Nr   )
LiftedWithObjModeLiftedWithFT)rr   r   r   rn   enable_loopliftenable_pyobjectforce_pyobjectno_cpython_wrapper)rv   
objectmodekwargsr   r   myflagsclsry   rz   rx   rw   s          r   dispatcher_factoryz(with_lifting.<locals>.dispatcher_factoryr  sV    G**,&+G#&*G#%)G").G&#CC7Iy'6LVLLr$   )F)
numba.corer   find_setupwithsr   r   r   r3   rn   r"   _cfg_nodes_in_regionr7   _legalize_with_head_get_with_contextmanagermutate_with_bodyrt   )rv   rw   rx   ry   rz   r   r   withsvltr3   r"   sub_irs	blk_startblk_endbody_blocksr   cmkindextrasubnew_irs    ````               r   with_liftingr   i  sA    $M M" %W-NE7{7#'')$$$$

#
#C^^  "F
''C G % G(iA 	%Dt$	%F9-.0&)L%%gvy'&13E&+- 	s  7? '7?r$   c                 j   	 d fd	 	fd}   j                   D ]i  }t        |t        j                        s|j                  } ||      \  }}t        |d      s$t        j                  d   j                        ||fc S  t        j                  d   j                        )z7Get the global object used for the context manager
    zIllegal use of context-manager.c                 &    j                  |       S )z#Get the definition given a variable)get_definition)varrv   s    r   get_var_dfnz-_get_with_contextmanager.<locals>.get_var_dfn  s    %%c**r$   c                 B   j                  |       }t        |t        j                        re|j                  dk(  rV|j
                  D cg c]
  } |       }}|j                  D ci c]  \  }}| |       }}}||d}|j                  } nd}t        j                  t        j                  |       }|t        j                  u r$t        j                  d
   j                        |!t        j                  	|j                        ||fS c c}w c c}}w )zReturn the context-manager object and extra info.

        The extra contains the arguments if the context-manager is used
        as a call.
        call)argsr   Nz*Undefined variable used as context managerrZ   )r   r,   r   Expropr   kwsfuncr	   guardfind_outer_value	UNDEFINEDr   CompilerErrorrZ   )var_refdfnr   r   r   vr   r   ctxobj_illegal_cm_msgr   r3   rv   r   s            r   get_ctxmgr_objz0_get_with_contextmanager.<locals>.get_ctxmgr_obj  s     $$W-c277#&(8,/HH5qKN5D5149A1k!n$9C9!S1EhhGE 9 97GL R\\!&&<9%)) 
 >&&CGGDDu}' 69s   
D*Dr   z"Unsupported context manager in user   zmalformed with-context usage)	r)   r,   r   	EnterWithcontextmanagerhasattrr   r   rZ   )
rv   r3   r   r   stmtr   r   r   r   r   s
   ```     @@r   r   r     s     8O+ > y!&& 	!dBLL)))G*73MFE6#56**8y)--  5= 	! 

&9!!
 
r$   c                    t        t              }| j                  D ]  }|t        |      xx   dz  cc<    |j	                  t
        j                        dk7  r!t        j                  d| j                        |j	                  t
        j                  d      dk7  r!t        j                  d| j                        |j	                  t
        j                  d       |r!t        j                  d| j                        y)zaGiven *blk*, the head block of the with-context, check that it doesn't
    do anything else.
    r   z0with's head-block must have exactly 1 ENTER_WITHr   r   z*with's head-block must have exactly 1 JUMPNz'illegal statements in with's head-block)r   intr)   typer   r   r   r   r   rZ   r   Del)r1   countersr   s      r   r   r     s     3H "d!"||BLL!Q&""> 	 ||BGGQ1$""8 	
 LL""5 	 r$   c                    t               }|g}|rr|j                         }t        | j                  |            }|rCt	        | \  }}t        |D 	cg c]  }	|	|vr|	|k7  r|	 c}	      }
|j                  |
       ||
z  }|rr|S c c}	w )z;Find the set of CFG nodes that are in the given region
    )r   r   listr   zipextend)r"   region_begin
region_endregion_nodesstacktossucclistr    r   r   nodess              r   r   r     s     5LNE
iiks+,H~HE1% ,$|3
*  , -E LLE!L  ,s   Bc                    d }| j                   } ||      }t        |||       } |j                         D cg c]  \  }}|t        |      d   f }}}|D ]E  \  }}||   j                  j                         }t        |      dk7  s2t        j                  d       |D ]^  \  }}||   }	t        j                  | j                   |	j                  j                         d      j                        sSt        | |       ` |D cg c]1  \  }}|| j                   |   j                  j                         d   f3 }}}t        |      }|| fS c c}}w c c}}w )zQFind all top-level with.

    Returns a list of ranges for the with-regions.
    c                 t   t        |       }t               t               }}| j                         D ]c  \  }}|j                  D ]O  }t	        j
                  |      r|j                  |       t	        j                  |      s?|j                  |       Q e t        t              }|j                  |d      D ]  }g g }
}	|	j                  |       |	s|	j                         }|
j                  |       | |   j                  D ]  }t	        j                  |      rt        j                  d      t	        j                  |      r+||v r'||   j                  |       |j                  |        nCt	        j                   |      s|j#                         D ]  }||
vs|	j                  |         |	r |S )NT)reversezBunsupported control flow due to raise statements inside with block)r   r   itemsr)   r	   is_setup_withr   is_pop_blockr   	topo_sortr7   r   is_raiser   r   removeis_terminatorr   )r3   r"   
sus_setupssus_popslabelra   r   setup_with_to_pop_blocks_mapsetup_blockto_visitseents               r   find_rangesz$find_setupwiths.<locals>.find_ranges  s   %f-"uceH
 #LLN 	(LE5

 ())$/NN5)((.LL'	(	( (33'7$==T=B 	3KdHOOK( E""5M.. 3D((."("6"6!?#" "
  ,,T2u7H4[AEEeL .  --d3!%!1!1!3 3A } ( 23'3 		3@ ,+r$   r   r   zlunsupported control flow: with-context contains branches (i.e. break/return/raise) that can leave the block )r3   consolidate_multi_exit_withsr  r  r   r   r   r   r   r	   	is_return_rewrite_return_eliminate_nested_withs)
rv   r  r3   with_ranges_dictspwith_ranges_tupler   targetstarget_blocks
             r   r   r     s   
0,d ^^F #6* ++;VWMG ,1135!Q T!WQZ 5 5 $ A)&&224w<1&&F  $ (Aaygnn''335a8::D*FGQ'	( (9:#a W^^A.99EEGJK : : 00ABg%%55(:s   E6Ec                 h   | j                   |   }|j                  j                         d   }| j                   |   }t        j                  | j                         }|dz   }|j
                  }t        j                  d|      }t        j                  ||      }	g g }}
g |j                  t        j                        }t        |      dk(  sJ t        g |j                  t        j                              dk(  sJ t        |j                  d   t        j                        sJ |d   }|j                  j                  |      }|
j!                  |j                  d|        |
j#                  t        j                  ||j
                               |j!                  |j                  |d        |j#                  t        j                  ||j
                               | j                   |   j                  }|	j                  j!                  |       |j                  j%                          |j                  j!                  |       |j                  j%                          |j                  j!                  |
       |	| j                   |<   t        j&                  | j                         | _        | S )u:  Rewrite a return block inside a with statement.

    Arguments
    ---------

    func_ir: Function IR
      the CFG to transform
    target_block_label: int
      the block index/label of the block containing the POP_BLOCK statement


    This implements a CFG transformation to insert a block between two other
    blocks.

    The input situation is:

    ┌───────────────┐
    │   top         │
    │   POP_BLOCK   │
    │   bottom      │
    └───────┬───────┘
            │
    ┌───────▼───────┐
    │               │
    │    RETURN     │
    │               │
    └───────────────┘

    If such a pattern is detected in IR, it means there is a `return` statement
    within a `with` context. The basic idea is to rewrite the CFG as follows:

    ┌───────────────┐
    │   top         │
    │   POP_BLOCK   │
    │               │
    └───────┬───────┘
            │
    ┌───────▼───────┐
    │               │
    │     bottom    │
    │               │
    └───────┬───────┘
            │
    ┌───────▼───────┐
    │               │
    │    RETURN     │
    │               │
    └───────────────┘

    We split the block that contains the `POP_BLOCK` statement into two blocks.
    Everything from the beginning of the block up to and including the
    `POP_BLOCK` statement is considered the 'top' and everything below is
    considered 'bottom'. Finally the jump statements are re-wired to make sure
    the CFG remains valid.

    r   r   Nr   r   )r3   r   r   r	   find_max_labelrZ   r   Scoper^   
find_instsPopBlockr   r   r,   r)   indexr  r7   clearbuild_definitions_definitions)rv   target_block_labelr(  target_block_successor_labeltarget_block_successor	max_label	new_labelnew_block_locnew_block_scope	new_blocktop_bodybottom_body
pop_blocks	pb_markerpb_isreturn_bodys                   r   r!  r!  j  s6   t >>"45L#/#:#:#F#F#H#K $^^,HI ''7IAI*..Mhht7Om<I kH8<**2;;78Jz?a2((123q888l''+RWW5551I##I.EOOL%%fu-.OOBGG8,:J:JKL|((r23rwwy,*:*:;< ..!=>CCKNN+&%%'&&{3X& !*GNN9#55gnnEGNr$   c                 r    g }d }t        |       D ]#  \  }} ||||      r|j                  ||f       % |S )Nc                 2    |D ]  \  }}| |kD  s||k  s y y)NTFr   )startendknown_rangesabs        r   within_known_rangez3_eliminate_nested_withs.<locals>.within_known_range  s,      	DAq qyS1W	 r$   )r>   r7   )with_rangesrD  rG  r$  es        r   r"  r"    sL    L {# (1!!Q5A'( r$   r   c                     | D ];  }| |   }t        |      dkD  st        ||t        j                        \  }}|h| |<   = |S )zGModify the FunctionIR to merge the exit blocks of with constructs.
    r   split_condition)r   r   r	   r  )r   r3   rv   r   rI   commons         r   r  r    sV       8r7Q;4X-B-BOGV xE!H  Nr$   rK  c                ,   | j                   }t        | j                   j                               }|j                  }t	        | j                         dz   }t        j                  |j                  t
        j                        }|}|dz  }|||<   t        j                  |j                  t
        j                        }	|}
|dz  }|	||
<   g }t        |      D ]  \  }}||   }|(t        |j                        D ]  \  }} ||      s n nd}|j                  d }|j                  |d }|j                  |       ||_	        |j                  }|j                  j                  t        j                  t        j                  ||      |j                  d|      |             |j                  rJ |j                  j                  t        j                   |t
        j                                |!|j                  j                  |d   d          |j                  rJ |j                  j                  t        j                   |
             g }|D ]  }|j                  |       |dz  } |	}t
        j                  }t        |      D ]J  \  }}|j#                  d|      }|j#                  d	|      }|j                  j                  t        j                  t        j                  ||      ||             |j                  j                  t        j                  t
        j$                  j'                  t(        j*                  |j-                  d      ||
      ||             |d   j/                         \  }|j                  j                  t        j0                  ||||   |             t        j                  ||      }||||   <   M |j                  j                  t        j                   |             | |fS )a   Modify the FunctionIR to create a single common exit node given the
    original exit nodes.

    Parameters
    ----------
    func_ir :
        The FunctionIR. Mutated inplace.
    exit_nodes :
        The original exit nodes. A sequence of block keys.
    split_condition : callable or None
        If not None, it is a callable with the signature
        `split_condition(statement)` that determines if the `statement` is the
        splitting point (e.g. `POP_BLOCK`) in an exit node.
        If it's None, the exit node is not split.
    r   r   Nr   z$cp)r.   r   rZ   r   z	$cp_checkz$cp_rhs)fnlhsrhsrZ   rX   )r3   rd   r<   rY   r   r   r^   unknown_loc	enumerater)   r7   rZ   r-   Constget_or_defineis_terminatedr   redefiner   binopoperatoreqgetr   r   )rv   
exit_nodesrL  r3   any_blkrY   r5  common_blockcommon_label
post_block
post_label
remainingsir   r1   ptr   beforeafterrZ   remain_blocksr   switch_block
match_expr	match_rhsjump_targets                             r   r   r     s   h ^^F'..'')*GMMEGNN#a'I88GMMr~~>LLNI'F<'--R^^<JJNI#F: J*% C1Qi &%chh/ D"4(
 B#2%  ggIIBHHQC0"00C0@	
 $$$$"..AB5C8 "  Aq!12))))RWWZS9: M Y'Q	 L
..Cz* 0	6^^KS^9
NN9#N6	 	  IIhhqc* 	
 	  IIggmm{{		%(8i $  "		
 r
..0  IIj+}Q/?SI	
 xxe5#/}Q ?0D RWW[c:;L  r$   ))__doc__collectionsr   r   loggingrY  numba.core.analysisr   r   r   r   r   r	   r
   numba.core.utilsr   	getLogger__name__r   r9   rK   rP   rV   rb   rj   r~   r   r   r   r   r   r   r   r   r   r   r!  r"  rs   r  r   r   r$   r   <module>rs     s   
 0   M + + I & '

H
%2j8 -DFB$*$N.$6CL48v6
r6([&|hV"
 
 DH V!r$   