
    +h3                       d Z ddlmZ ddlZddlZddlmZ ddlmZ ddlm	Z	 ddlm
Z
 dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl	mZ ddl	mZ ddlmZ ddlm Z  ddlm!Z! ddlm"Z" ddlm#Z# ddlmZ$ ddlm%Z% ddlm&Z& dd lm'Z' ddlmZ ddl'mZ( dd!l'm)Z) dd"l*m+Z+ dd#l*m,Z, 	 	 	 	 	 	 dUd%Z-ej\                  j_                  d$d$&       G d' d(e             Z0e&jb                  ej\                  j_                  d)d$&       G d* d+e                    Z2e&jb                  ej\                  j_                  d),       G d- d.e2                    Z3e&jb                  ej\                  j_                  d)d)/      ej\                  j_                  d)d)d)0      ej\                  j_                  d)1       G d2 d3e                                  Z4 G d4 d5e5      Z6 G d6 d7e      Z7e&jb                  ejp                  j_                  d)1       G d8 d9e                    Z9e&jb                  ejp                  j_                  d:;      ejp                  j_                  d;       G d< d=e7                           Z:e&jb                  ejp                  j_                  d);      ejp                  j_                  d>;      ejp                  j_                  d?;      ejp                  j_                  d@;      ejp                  j_                  dA;       G dB dCe7ejv                                                                  Z< G dD dEe5      Z= G dF dGe7      Z>ejp                  j_                  dH;       G dI dJe>             Z?e&jb                  ejp                  j_                  dK;       G dL dMe>                    Z@e&jb                  ejp                  j_                  dN;      ejp                  j_                  d$;       G dO dPe7                           ZAe&jb                  ejp                  j_                  dQ;       G dR dSe>ejv                                      ZBdT ZCy)VzWsqlalchemy.orm.interfaces.LoaderStrategy
   implementations, and related MapperOptions.    )absolute_importN   )
attributes)exc)
interfaces)loading)path_registry)
properties)query)relationships)
unitofwork)util)_DEFER_FOR_STATE)_RAISE_FOR_STATE)_SET_DEFERRED_EXPIRED)_column_descriptions)ORMCompileState)ORMSelectCompileState)QueryContext)LoaderStrategy)StrategizedProperty)_state_session)InstanceState)	_none_set)aliased   )event)inspect)log)sql)visitors)LABEL_STYLE_TABLENAME_PLUS_COL)SelectFc	                    g }
|xr | j                   |r!| j                  r|
j                  t               | j                  | j
                  j                  v r;| j
                  j                  | j                     \  |
j                  fd       |r|
j                  t        j                         |r/| j                  r!| j                  r|
j                  fd       |j                  D ]  }| |j                  j                  | j                        u s+|j                  j                  | j                        rQt!        j"                  |j$                  | j                  f| |||xr* | j                  xs | j&                  t(        j*                  u ||||| xs | j,                   | j.                  d|	}|
D ]  } |||          y )Nc                 H    t        j                  | |j                  fi S N)orm_util_validator_eventskey)descpropfnoptss     L/var/www/html/venv/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py<lambda>z%_register_attribute.<locals>.<lambda>I   s%    x99dhh &*      c                 2    t        j                  |       S r&   )r   backref_listeners)r*   r+   backrefuselists     r.   r/   z%_register_attribute.<locals>.<lambda>W   s    :#?#?'7$ r0   )parent_tokenr4   compare_function	useobjecttrackparenttypecallable	callable_active_history
impl_classsend_modified_eventsdoc)r4   single_parentappendsingle_parent_validatorr)   parent
validatorsr   track_cascade_eventsback_populates_effective_sync_backrefself_and_descendants_propsgetclass_manager_attr_has_implr   register_attribute_implclass_	directionr   	ONETOMANYviewonlyr>   )r+   mapperr7   r6   r9   r:   proxy_propertyr;   r<   kwlisten_hooksmr*   hookr3   r,   r-   r4   s                 @@@@r.   _register_attributerW   2   s    L(DLLGT''34xx4;;)));;))$((3D	
 J;;< %%t33" (( !188<<HH
 
//00:55 "!1#% && >~~)=)==)#-%)2]%G$--6GHH#$ %D* % !T4 !5!r0   )
instrumentdeferredc                   6     e Zd ZdZdZ fdZ	 ddZd Z xZS )UninstrumentedColumnLoaderzRepresent a non-instrumented MapperProperty.

    The polymorphic_on argument of mapper() often results in this,
    if the argument is against the with_polymorphic selectable.

    )columnsc                 d    t         t        |   ||       | j                  j                  | _        y r&   )superr[   __init__parent_propertyr\   selfrB   strategy_key	__class__s      r.   r_   z#UninstrumentedColumnLoader.__init__   s(    ($8N++33r0   c                 l    | j                   D ]%  }|r|j                   |   }|j                  ||       ' y r&   )r\   _append_dedupe_col_collection)	rb   compile_statequery_entitypathloadoptadaptercolumn_collectionkwargscs	            r.   setup_queryz&UninstrumentedColumnLoader.setup_query   s;      	NAOOA&77;LM	Nr0   c	                      y r&    	rb   contextrh   ri   rj   rQ   resultrk   
populatorss	            r.   create_row_processorz/UninstrumentedColumnLoader.create_row_processor   s     	r0   r&   )	__name__
__module____qualname____doc__	__slots__r_   ro   rv   __classcell__rd   s   @r.   r[   r[      s$     I4 Nr0   r[   Tc                   <     e Zd ZdZdZ fdZ	 ddZd Zd Z xZ	S )ColumnLoaderz8Provide loading behavior for a :class:`.ColumnProperty`.)r\   is_compositec                     t         t        |   ||       | j                  j                  | _        t        | j                  d      | _        y )Ncomposite_class)r^   r   r_   r`   r\   hasattrr   ra   s      r.   r_   zColumnLoader.__init__   s=    lD*6<@++33#D$8$8:KLr0   c	                     | j                   D ]<  }
|r&|r|j                  |
      }
|
 y |j                   |
   }
|j                  |
|       > | j                   d   }|r|j                   |   }||| j                  <   y Nr   )r\   adapt_check_presentrf   r`   )rb   rg   rh   ri   rj   rk   rl   memoized_populatorscheck_for_adaptrm   rn   fetchs               r.   ro   zColumnLoader.setup_query   s      		NA"33A6Ay*A77;LM		N QOOE*E49D001r0   c                 v   d| _         | j                  d   j                  }| j                  j                  xs] | j                  d   j
                  xsB |j                  d uxr2 |j                  j                  |j                  d       | j                  u }t        | j                  |d|j                  |       y )NTr   F)r7   r6   r;   )is_class_levelr\   typer`   r;   primary_keyversion_id_col_columntopropertyrI   rW   compare_values)rb   rQ   coltyper;   s       r.   init_class_attributez!ColumnLoader.init_class_attribute   s    ",,q/&&   // ||A** %%T1 (,,001F1FM''( 	 	  $33)	
r0   c	                     | j                   D ]I  }	|r|j                   |	   }	|j                  |	d      }
|
s)|d   j                  | j                  |
f        y  |d   j                  | j                  df       y )NFquickexpireT)r\   _getterr@   r)   )rb   rs   rh   ri   rj   rQ   rt   rk   ru   colgetters              r.   rv   z!ColumnLoader.create_row_processor   sx     << 	:Cooc*^^C/F7#**DHHf+=>	: x ''4(89r0   F)
rw   rx   ry   rz   r{   r_   ro   r   rv   r|   r}   s   @r.   r   r      s(     C)IM :8
,:r0   r   )query_expressionc                   0     e Zd Z fdZd Zd Zd Z xZS )ExpressionColumnLoaderc                     t         t        |   ||       t        j                         j                  d       t        fd| j                  j                  D              | _	        y )Nc              3   B   K   | ]  }|j                           y wr&   )compare).0rn   nulls     r.   	<genexpr>z2ExpressionColumnLoader.__init__.<locals>.<genexpr>  s!      ,
$%		$,
s   )
r^   r   r_   r    r   labelanyr`   r\   _have_default_expression)rb   rB   rc   r   rd   s      @r.   r_   zExpressionColumnLoader.__init__  sS    $d4V\J
 xxz%(+ ,
)-)=)=)E)E,
 )
%r0   c                 2   d }	|rd|j                   v r|j                   d   g}	n"| j                  r| j                  j                  }	|	y |	D ]%  }
|r|j                  |
   }
|j	                  |
|       ' |	d   }|r|j                  |   }||| j                  <   y )N
expressionr   )
local_optsr   r`   r\   rf   )rb   rg   rh   ri   rj   rk   rl   r   rm   r\   rn   r   s               r.   ro   z"ExpressionColumnLoader.setup_query  s     |w'9'99)),78G****22G? 	NAOOA&77;LM	N
 
OOE*E49D001r0   c	                 $   |rd|j                   v r|j                   d   g}	|	D ]I  }
|r|j                  |
   }
|j                  |
d      }|s)|d   j                  | j                  |f        y  |d   j                  | j                  df       y y y )Nr   Fr   r   T)r   r\   r   r@   r)   )rb   rs   rh   ri   rj   rQ   rt   rk   ru   r\   r   r   s               r.   rv   z+ExpressionColumnLoader.create_row_processor4  s     |w'9'99)),78G >!//#.CU3w'..&/AB> 8$++TXXt,<= :7r0   c                     d| _         t        | j                  |d| j                  d   j                  j
                  d       y )NTFr   )r7   r6   accepts_scalar_loader)r   rW   r`   r\   r   r   rb   rQ   s     r.   r   z+ExpressionColumnLoader.init_class_attributeN  s;    "  !\\!_11@@"'	
r0   )rw   rx   ry   r_   ro   rv   r   r|   r}   s   @r.   r   r     s    	
:<>4	
r0   r   )rY   rX   )rY   rX   	raiseload)
do_nothingc                   H     e Zd ZdZdZ fdZd Zd Z	 d	dZd Z	d Z
 xZS )
DeferredColumnLoaderzAProvide loading behavior for a deferred :class:`.ColumnProperty`.)r\   groupr   c                    t         t        |   ||       t        | j                  d      rt        d      | j                  j                  dd      | _        | j                  j                  | _	        | j                  j                  | _
        y )Nr   z8Deferred loading for composite types not implemented yetr   F)r^   r   r_   r   r`   NotImplementedErrorstrategy_optsrI   r   r\   r   ra   s      r.   r_   zDeferredColumnLoader.__init__e  sx    "D26<H4''):;%M  ++//UC++33))//
r0   c	           
      $   |j                   r~|j                  j                  j                  r^| j                  |j                  j                  j                  v r2| j
                  j                  d      j                  ||||||||       y | j                  sZ| j                  r| j
                  j                  }	n| j
                  j                  }	|d   j                  | j                  |	f       y |d   j                  | j                  df       y )N)rY   FrX   Tnewr   F)refresh_stater   _compile_options_only_load_propsr)   r`   _get_strategyrv   r   r   _raise_column_loader_deferred_column_loaderr@   )
rb   rs   rh   ri   rj   rQ   rt   rk   ru   set_deferred_for_local_states
             r.   rv   z)DeferredColumnLoader.create_row_processoro  s    , !!..??GMM::KKK  ..;""	 $$~~((== -
 ((@@ - u$$dhh0L%MNx ''5(9:r0   c                     d| _         t        | j                  |d| j                  d   j                  j
                  | j                  d       y )NTFr   )r7   r6   r:   load_on_unexpire)r   rW   r`   r\   r   r   _load_for_stater   s     r.   r   z)DeferredColumnLoader.init_class_attribute  sD    "  !\\!_11@@**"	
r0   c	           	         |j                   j                  r| j                  j                  s|rFd|j                  v r8t        | j                        j                  | j                  j                        sG|r5| j                  r)|j                  j                  d| j                  z  d      s|rA| j                  |v r3 | j                  j                  d      j                  |||||||fi |	 y | j                  rt         || j                  <   y | j"                  st$        || j                  <   y t&        || j                  <   y )Nundefer_pkszundefer_group_%sFr   )compile_options_render_for_subqueryr`   _renders_in_subqueriesr   setr\   intersectionrB   _should_undefer_in_wildcardr   rI   r)   r   ro   r   r   r   r   r   )
rb   rg   rh   ri   rj   rk   rl   r   only_load_propsrS   s
             r.   ro   z DeferredColumnLoader.setup_query  s     --BB((?? !W%7%77%22KK;;
 JJ&&**&3U  DHH$?D  ..;k!#    8M 4 458H 4 458H 4 45r0   c                    |j                   st        j                  S |t        j                  z  st        j                  S |j
                  j                  }| j                  rg|j                  D cg c]Q  }t        |t              r?t        |j                  t              r%|j                  | j                  k(  r|j                   S }}n| j                   g}|D cg c]  }||j                  v s| }}t        |      }|9t        j                   dt#        j$                  |      d| j                   d      | j&                  r| j)                  ||d       t+        j,                  |t/        j0                  |      j3                  t4              |j                   ||      	 t        j6                  |      t        j8                  S c c}w c c}w )NParent instance zB is not bound to a Session; deferred load operation of attribute '' cannot proceedraise)r   r   )r)   r   
ATTR_EMPTYSQL_OKPASSIVE_NO_RESULTmanagerrQ   r   iterate_properties
isinstancer   strategyr   
unmodifiedr   orm_excDetachedInstanceErrorr'   	state_strr   _invoke_raise_loadr   load_on_identr    selectset_label_styler"   ObjectDeletedErrorATTR_WAS_SET)	rb   statepassivelocalparentptoloadkr   sessions	            r.   r   z$DeferredColumnLoader._load_for_state  s   yy(((***///mm**:: %77a!45qzz+?@GGtzz)	 F  hhZF #<qa5+;+;&;<< '?// %%e,dhh8  >>##E7G< !!

;'772 		 %# 	 ,,U33&&&M =s   0AG	G.Gc                 4    t        j                  d| d      )N'z(' is not available due to raiseload=Truesa_excInvalidRequestErrorrb   r   r   lazys       r.   r   z'DeferredColumnLoader._invoke_raise_load  s    ((=AC
 	
r0   r&   )rw   rx   ry   rz   r{   r_   rv   r   ro   r   r   r|   r}   s   @r.   r   r   Z  s5     L/I02;h

* 3Ij0'd
r0   r   c                   6    e Zd ZdZddZej                  fdZy)LoadDeferredColumnsz7serializable loader object used by DeferredColumnLoaderc                      || _         || _        y r&   )r)   r   )rb   r)   r   s      r.   r_   zLoadDeferredColumns.__init__  s    "r0   c                     | j                   }|j                  j                  }|j                  |   }| j                  rd}nd}|j                  |      }|j                  ||      S )N)rY   Tr   )r   T)r   r   )r)   r   rQ   rH   r   r   r   )rb   r   r   r)   r   r+   rc   r   s           r.   __call__zLoadDeferredColumns.__call__#  sc    hhmm**!!#&>>L FL%%l3''w77r0   Nr   )rw   rx   ry   rz   r_   r   PASSIVE_OFFr   rq   r0   r.   r   r     s    A# '1&<&< 8r0   r   c                   &     e Zd ZdZdZ fdZ xZS )AbstractRelationshipLoaderz0LoaderStratgies which deal with related objects.)rQ   targetr4   entityc                    t         t        |   ||       | j                  j                  | _        | j                  j
                  | _        | j                  j                  | _        | j                  j                  | _        y r&   )r^   r   r_   r`   rQ   r   r   r4   ra   s      r.   r_   z#AbstractRelationshipLoader.__init__9  sa    ($8N**11**11**11++33r0   )rw   rx   ry   rz   r{   r_   r|   r}   s   @r.   r   r   4  s    :7I4 4r0   r   c                       e Zd ZdZy)DoNothingLoaderzRelationship loader that makes no change to the object's state.

    Compared to NoLoader, this loader does not initialize the
    collection/attribute to empty/none; the usual default LazyLoader will
    take effect.

    N)rw   rx   ry   rz   rq   r0   r.   r   r   A  s    r0   r   noload)r   c                        e Zd ZdZdZd Zd Zy)NoLoaderzYProvide loading behavior for a :class:`.RelationshipProperty`
    with "lazy=None".

    rq   c                 l    d| _         t        | j                  |d| j                  j                         y )NT)r7   r9   )r   rW   r`   collection_classr   s     r.   r   zNoLoader.init_class_attributeX  s0    "  -->>		
r0   c	                 P      fd}	|d   j                   j                  |	f       y )Nc                     j                   r"t        j                  | |j                         y d |j                  <   y r&   )r4   r   init_state_collectionr)   )r   dict_rowrb   s      r.   invoke_no_loadz5NoLoader.create_row_processor.<locals>.invoke_no_loadm  s-    ||00txxH"&dhhr0   r   )r@   r)   )
rb   rs   rh   ri   rj   rQ   rt   rk   ru   r  s
   `         r.   rv   zNoLoader.create_row_processorb  s&    	' 	5  $((N!;<r0   N)rw   rx   ry   rz   r{   r   rv   rq   r0   r.   r   r   M  s    
 I
=r0   r   r   r   raise_on_sqlbaked_selectc                        e Zd ZdZdZ fdZd Zd Zd Zd Z	ddZ
d	 Z ej                  d
      d        Zd Z xZS )
LazyLoaderz|Provide loading behavior for a :class:`.RelationshipProperty`
    with "lazy=True", that is loads when first accessed.

    )
_lazywhere_rev_lazywhere_lazyload_reverse_option	_order_byuse_getis_aliased_class_bind_to_col_equated_columns_rev_bind_to_col_rev_equated_columns_simple_lazy_clause_raise_always_raise_on_sqlc                    t         t        |   ||       | j                  d   dk(  | _        | j                  d   dk(  | _        t        | j                        j                  | _        | j                  j                  }|j                         \  | _        | _        | _        |j                  d      \  | _        | _        | _        | j                  j$                  rSt'        j(                  | j                  j$                        D cg c]  }t+        j,                  |ddi       c}| _        nd | _        | j0                  j3                  d| | j                         | j                   xrY | j4                   xrJ | j                  j6                  d   j9                  | j                  dd	| j:                  j<                  
      | _        | j>                  rtA        | j                        D ]U  }|| j:                  j<                  v s| j:                  j<                  |   D ]  }| j                  |   | j                  |<     W | j0                  j3                  d|        y y c c}w )Nr   r   r  T)reverse_direction
_orm_adaptz%s lazy loading clause %sr   Fuse_proxiescompare_keysequivalentsz4%s will use Session.get() to optimize instance loads)!r^   r  r_   r   r  r  r   r   r  r`   _join_conditioncreate_lazy_clauser  r  r  r  r  r  order_byr   to_listsql_util_deep_annotater  loggerinfor4   _get_clauser   rQ   _equivalent_columnsr  list)rb   rB   rc   join_conditionelemr   rn   rd   s          r.   r_   zLazyLoader.__init__  s,   j$(>!//77B!//7>I ' 4 E E--==
 --/		
O! ---E		
!% (( !LL)=)=)F)FG ''|T.BCDN
 "DN4dDOOL %%% LL ''*22 " KK;;	 3  	 <<D112 N$++999![[<<SA N373H3H3M--a0NN
 KKI4 7s   I!c           	      l   d| _         | j                  j                  }| j                  j                  rd}d}nB| j                  j                  t
        j                  us| j                  s|rd}d}n	d}d}ndx}}t        | j                  |d| j                  | j                  j                  ||       y )NTF)r7   r:   r9   r;   _deferred_history)r   r`   _legacy_inactive_history_styler;   rN   r   	MANYTOONEr  rW   r   r  )rb   rQ   r/  r;   r.  s        r.   r   zLazyLoader.init_class_attribute  s    "   ?? 	' ..!N %   ***2F2FF<<-!%$)!!&$(!166N.  **-->>)/	
r0   c                     t        j                  | j                  ddi      }|| j                  c}g d }t	        j
                  |i d|i       fd}t	        j                  |i d|i      }|fS )Nr  Tc                     d| _         y )NF)unique)	bindparams    r.   visit_bindparamzFLazyLoader._memoized_attr__simple_lazy_clause.<locals>.visit_bindparam  s
    $Ir0   r4  c                     | j                   v r,j                  | j                  | j                      d f       y | j                  )j                  | j                  d | j                  f       y y r&   )_identifying_keyr@   r)   callablevalue)r4  bind_to_colparamss    r.   r5  zFLazyLoader._memoized_attr__simple_lazy_clause.<locals>.visit_bindparam  sh    ))[8!#I$>$>? ##+y}}dIOODE ,r0   )r$  r%  r  r  r!   traversecloned_traverse)rb   	lazywhere	criterionr5  r:  r;  s       @@r.   "_memoized_attr__simple_lazy_clausez-LazyLoader._memoized_attr__simple_lazy_clause  s    ++OOlD1
	 #,T->->	;	% 	)R+)GH
	F ,,rK9
	 &  r0   c                    | j                   \  }}|,t        j                  ||D cg c]  \  }}}|
 c}}}      S | j                  j                  }|j                         }	t        j                  |	      }
|t        j                  z  r|t        j                  z  }i }|D ]K  \  }}}|>|r(|t        j                  z  r|j                  ||
||      }n|j                  ||
||      }|||<   M ||fS c c}}}w r&   )r  r$  adapt_criterion_to_nullr`   rB   objr   instance_dictINIT_OKLOAD_AGAINST_COMMITTED#_get_committed_state_attr_by_column_get_state_attr_by_column)rb   r   r   r?  
param_keysr)   identr9  rQ   or  r;  s               r.   _generate_lazy_clausez LazyLoader._generate_lazy_clause  s    $ 8 8	:=33DD$5CCD  %%,,IIK((+Z'''z)))G!+ 	 C w)J)JJ"FFueWE #<<ueWE  F3K	  &  3 Es   C5c                 :    t        j                  d| d|d      )Nr   z ' is not available due to lazy='r   r   s       r.   r   zLazyLoader._invoke_raise_load/  s    ((8<dC
 	
r0   c                 "   |j                   s>| j                  j                  s|j                  r|j                  st
        j                  S |j                    }d }| j                  xr | xs |j                   }|t
        j                  z  s|r|t
        j                  z  s|rt
        j                  S | j                  r;|t
        j                  z  s(|r|t
        j                  z  r| j                  ||d       t!        |      }|s\|t
        j                  z  rt
        j                  S t#        j$                  dt'        j(                  |      d| j                   d      |r| j+                  |||      }t
        j                  |v rt
        j                  S t
        j,                  |v rt
        j,                  S t/        j0                  |      ry | j                   |j2                  v r#|t
        j4                  z  st
        j6                  S |j9                  | j:                  |||      }	|	|	t
        j<                  u ry |	S |t
        j                  z  r|t
        j                  z  st
        j                  S | j?                  ||||||      S )Nr   r   z> is not bound to a Session; lazy load operation of attribute 'r   )r   lazy_loaded_from) r)   r`   load_on_pending_load_pending
session_idr   r   r  _extra_criteriar   NON_PERSISTENT_OKr   r  NO_RAISERELATED_OBJECT_OKr   r   r   r   r'   r   _get_ident_for_use_get	NEVER_SETr   
issupersetdictDEFERRED_HISTORY_LOADr   _identity_lookupr   PASSIVE_CLASS_MISMATCH_emit_lazyload)
rb   r   r   rj   extra_criteriapendingprimary_key_identityr  r   instances
             r.   r   zLazyLoader._load_for_state4  sK   yy((88++##(((ii-#,,OK$Nw7N7N3N*+++G*6667/// j111 Z999 ##E7G< ',,,!333// %%e,dhh8  #'#>#>$  ++/CC!333%%)==!+++##$89 EJJ&*"B"BB!... //$!&	 0 H #z@@@#Oj///!=!==!333"" 
 	
r0   c           	         |j                   j                  }|t        j                  z  r|j                  }n|j
                  }|j                  }| j                  j                  D cg c]  } |||| j                  |   |       c}S c c}w )Nr   )	r   rQ   r   rF  rG  rH  rZ  r   r  )rb   r   r   r   instance_mapperget_attrr  pks           r.   rW  z!LazyLoader._get_ident_for_use_get  s    --..Z666&JJH&@@H

 kk--
 UE4#8#8#<gN
 	
 
s   ' B
zsqlalchemy.orm.strategy_optionsc                     t         j                  j                   j                  j	                         }t        j                  |g|j                  t        t        j                        }t        j                  }	|	d|dz  }	 j                  j                  0|j                   j                    j                  j                        }|j"                   }
|
s|t$        j&                  z  rt        j(                  ddi      |_         j,                  }|j.                  s|rv|j0                  rj|j2                   j                     }t5        |j.                        }|r2|j0                  r&d}|t7        j8                   j                  |      fz  }||_        n#|j                   j<                   j                     }|xj>                  d|iz  c_        |rK j@                  r&|t$        jB                  z  s jE                  ||d       tG        jH                  ||||	      S  jJ                  r jJ                  |_&         fd}|xjN                  | j                  ffz  c_'         jQ                  ||      \  }}d	|	i} j"                  |jR                  v r#|t$        jT                  z  st$        jV                  S |
r3t        jX                  t6        jZ                  |j]                               r4y t        jX                  t6        j^                  |j]                               ry  j@                  r&|t$        jB                  z  s jE                  ||d       |f|_0        |jc                  |||
      }|je                         jg                         ji                         } jj                  r|S tm        |      }|r,|dkD  r"t        jn                  d j                  z         |d   S y )N)_raw_columns_propagate_attrs_label_styler   F)_invoke_all_eagers_lazy_loaded_from	autoflush_current_pathr  )load_optionsc                 z   j                   j                  D ]  }|j                  t        j                  u s |j
                  s-t        |j                  t              rHj                  j                  | j                  j                  |j                           j                  |      j                  |         y r&   )r`   _reverse_propertyrN   r   r0  _use_getr   r   r  Loadfor_existing_pathr   ro  rB   lazyloadprocess_compile_state)compile_contextrevrb   strategy_optionss     r.   _lazyload_reversez4LazyLoader._emit_lazyload.<locals>._lazyload_reverse  s    ++== K MMZ%9%99&s||Z@$));;'77EEJJ hsm$9$9/$JKr0   _sa_orm_load_options)execution_optionsr   zKMultiple rows returned with uselist=False for lazily-loaded attribute '%s' r   )8r   	preloadedorm_strategy_optionsr   __clause_element__r#   _create_raw_selectrj  r"   r   default_compile_optionsr   default_load_optionsr`   	secondaryselect_fromrQ   r)   r   NO_AUTOFLUSHimmutabledict_execution_optionsr  rp  rS  	load_pathtupler'   LoaderCriteriaOption_with_options_path_registryr   r  rU  r   r   load_on_pk_identityr  _order_by_clauses_with_context_optionsrL  rZ  r[  r   has_intersectionr   values
_never_set_where_criteriaexecuter3  scalarsallr4   lenwarn)rb   r   r   ra  r   rj   r_  clauseelementstmtrp  r`  r  effective_pathr-   r{  lazy_clauser;  r}  rt   lrz  s   `                   @r.   r^  zLazyLoader._emit_lazyload  sj     >>>>668(('*;;7,DD	
 $88"'!&
 	

 ))5##T11;;D ii- g
 7 77&*&8&8+u9M&ND#,,'g.E.E"__T-A-ABN++,D72211$++~N  "&D #\\889M9MNN/>!BB!!'J4G4G*G''wG..3,  >>%)^^D"	K 	"" 4 45'
 	
" #88HV #L

 HH

"j>>>***$$X%7%7I""8#6#6Hg
0C0C&C##E7NC +~&,= ! 
 ((*..0<<MFAq5IIJ../ ay r0   c	                    | j                   | j                  r|rw|j                  rkt        j                  |j
                  t        | ||j                  r|j                  |      nd             }	|d   j                  | j                   |	f       y |j                  s|j                  r&fd}
|d   j                  | j                   |
f       y y )Nr   c                 *    | j                  |       y r&   )_reset)r   r  r  r)   s      r.   reset_for_lazy_callablez@LazyLoader.create_row_processor.<locals>.reset_for_lazy_callableT  s     UC(r0   )r)   r   rS  r   "_instance_level_callable_processorrJ   LoadLazyAttribute_generate_extra_criteriar@   populate_existingalways_refresh)rb   rs   rh   ri   rj   rQ   rt   rk   ru   set_lazy_callabler  r)   s              @r.   rv   zLazyLoader.create_row_processor,  s     hh""w73J3J @@$$!.. 44W= ! u$$dhh0A%BC&&&*?*?	) u$$dhh0G%HI +@r0   Nrq   )rw   rx   ry   rz   r{   r_   r   r@  rL  r   r   rW  r   preload_moduler^  rv   r|   r}   s   @r.   r  r  v  sc    
I 8t 
D!B!@

c
J
 T:;A <AF3Jr0   r  c                   :    e Zd ZdZd Zd Zej                  fdZy)r  a  semi-serializable loader object used by LazyLoader

    Historically, this object would be carried along with instances that
    needed to run lazyloaders, so it had to be serializable to support
    cached instances.

    this is no longer a general requirement, and the case where this object
    is used is exactly the case where we can't really serialize easily,
    which is when extra criteria in the loader option is present.

    We can't reliably serialize that as it refers to mapped entities and
    AliasedClass objects that are local to the current process, which would
    need to be matched up on deserialize e.g. the sqlalchemy.ext.serializer
    approach.

    c                 P    || _         |j                  | _        || _        || _        y r&   r)   rc   rj   r_  )rb   r)   initiating_strategyrj   r_  s        r.   r_   zLoadLazyAttribute.__init__t  s&    /<<,r0   c                     | j                   t        j                  d       | j                  | j                  | j
                  ddS )NzvCan't reliably serialize a lazyload() option that contains additional criteria; please use eager loading for this caserq   r  )r_  r   r  r)   rc   rj   )rb   s    r.   __getstate__zLoadLazyAttribute.__getstate__z  sE    *II  88 --|| 	
 	
r0   c                     | j                   }|j                  j                  }|j                  |   }|j                  | j
                     }|j                  ||| j                  | j                        S )N)rj   r_  )	r)   r   rQ   rH   _strategiesrc   r   rj   r_  )rb   r   r   r)   re  r+   r   s          r.   r   zLoadLazyAttribute.__call__  sn    hh--..%%c*##D$5$56''LL..	 ( 
 	
r0   N)	rw   rx   ry   rz   r_   r  r   r   r   rq   r0   r.   r  r  b  s!    "-
 '1&<&< 
r0   r  c                       e Zd ZdZddZd Zy)
PostLoaderz;A relationship loader that emits a second SELECT statement.Nc                    |j                   j                  xs t        j                  j                  |z   }t
        j                  j                  ||| j                        ry|| j                     }|| j                     }|j                  |j                  d      s2|r|j                  dz  |kD  ryy|j                  | j                        ryy)NTloaderr   F)rg   current_pathr'   PathRegistryrootr   PostLoadpath_existsr`   containsr   lengthcontains_mapperrQ   )rb   rs   ri   
join_depthr  path_w_propeffective_path_w_props          r.   _check_recursive_postloadz$PostLoader._check_recursive_postload  s    !!..L(2G2G2L2L ''^T%9%9
 4//0 .t/C/C D##G$6$6A(//!3j@  '66t{{Cr0   c	           
      d    | j                   j                  d      j                  ||||||||      S )N))r   	immediate)r`   r   rv   rr   s	            r.   #_immediateload_create_row_processorz.PostLoader._immediateload_create_row_processor  sC     ##11$


	
	
r0   r&   )rw   rx   ry   rz   r  r  rq   r0   r.   r  r    s    E,
r0   r  r  c                       e Zd ZdZd Zd Zy)ImmediateLoaderrq   c                 X    | j                   j                  d      j                  |       y N)r   r   r`   r   r   r   s     r.   r   z$ImmediateLoader.init_class_attribute  $    **!	


v
&r0   c	                     
 
 fd}	 j                  ||      r"t        j                  t        j                  z  
n!t        j                  t        j                  z  
|d   j                   j                  |	f       y )Nc                 ^    | j                  j                        j                  | |       y r&   )get_implr)   rI   )r   r  r  flagsrb   s      r.   load_immediatez<ImmediateLoader.create_row_processor.<locals>.load_immediate  s"    NN488$((u=r0   delayed)r  r   PASSIVE_NO_FETCH_RELATEDrU  r   r@   r)   )rb   rs   rh   ri   rj   rQ   rt   rk   ru   r  r  s   `         @r.   rv   z$ImmediateLoader.create_row_processor  sd    	> ))'48
 77*:M:MME**Z-@-@@E9$$dhh%?@r0   N)rw   rx   ry   r{   r   rv   rq   r0   r.   r  r    s    I'
Ar0   r  subqueryc                   z     e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
d	 Z G d
 de      Zd Zd Zd Zd Z xZS )SubqueryLoader)r  c                 d    t         t        |   ||       | j                  j                  | _        y r&   )r^   r  r_   r`   r  ra   s      r.   r_   zSubqueryLoader.__init__  s'    nd,V\B..99r0   c                 X    | j                   j                  d      j                  |       y r  r  r   s     r.   r   z#SubqueryLoader.init_class_attribute  r  r0   c                 v   |}|j                   }t        j                  |d         }| j                  j	                  |      r*| j
                  |d   u r| j                  | j
                  }}n||d   }}|rf|j                  |   j                  j                  |   }	t        |      t        |	      z
  }
|
r)|	t        j                  j                  ||
 d        z  }	n|}	|j                  }|D cg c]<  }t        |	j                   d   j                  |j                   |   j"                        > }}||||	fS c c}w )Nr   r   )ri   r'   _class_to_mapperrB   isar`   	_entitiesentity_zeror  r  r	   r  coercelocal_columnsgetattrr   r   r)   )rb   orig_query_entity_index	subq_pathcurrent_compile_stateis_rootgiven_subq_pathsubq_mapperleftmost_mapperleftmost_propnew_subq_path
additionalleftmost_colsrn   leftmost_attrs                 r.   _get_leftmostzSubqueryLoader._get_leftmost  sI    $NN	//	!= KKOOK($$	!4-1[[$:N:N]O-8)A,]O 2;;'k..8M Y#m*<<J!;!;!B!Bzkl+"  ,M%33 #

 	 ""1%,,11!488
 
 }mKK
s   -AD6c           	      p   |j                         j                  d       }t        j                  j	                  t        j                        }|j
                  j                  |j
                         |}|j                  sEd|_         |j                  j                  |gt        ||      D 	ch c]  }	|	d   |	d    c}	  |j                  |D 
cg c]:  }
t        j                  j                  t        j                   j"                  |
      < c}
|j%                               }||_        |j(                  }|du rd|_        nF|Dt-        d |D              D ]/  }t-        |      j/                  |j0                        r(d|_         n |j2                  sd|_        |j*                  du rB|j4                  r6t7        j8                  ||j4                        }|r|j;                  ||z          |j=                  t>              jA                         }tC        jD                  ||d      }|S c c}	w c c}
w )NF)rg   r   Tc              3   4   K   | ]  }|j                     y wr&   )table)r   rn   s     r.   r   z?SubqueryLoader._generate_from_original_query.<locals>.<genexpr>r  s     6Q6s   rq   use_mapper_path)#_clone	correlater   Query__new____dict__update	_from_obj_enable_assertionsr  non_generativer   _adapt_col_listr    	coercionsexpectrolesColumnsClauseRole_get_current_adapterri  distinct_target_key	_distinctr   rY  r   _has_row_limiting_clauser  r$   expand_column_list_from_order_by_set_entitiesr   r"   r  r'   AliasedClass)rb   orig_compile_state
orig_queryr  r  leftmost_relationshiporig_entityqq2entrK  target_colsr  tto_addembed_q
left_aliass                    r.   _generate_from_original_queryz,SubqueryLoader._generate_from_original_query*  s    ))$/ [[  -
1::& {{#(A (AMM((	  4"2D  8}0	 M	0 )88 ' $$SYY%@%@!D 335
 %3GG$&AK ( 6+66 ;'221==A"&AK ))"$A;;$1#6#6 >>Q00F f 45 ##$BCLLN**Wd

 A.s   .H.
?H3c                 n   g }t        |j                               }t        |      D ]W  \  }\  }}|dkD  r+||dz
     d   j                  }|j	                  |      r|n|}	n|}	|j                  |	|j                  f       Y t        |      dk  r|}
nKt        |d   d         }|j                  r|j                  }
n!t        j                  |j                  d      }
| j                  j                  }|D cg c]/  }t        |
| j                   j"                  |   j                        1 }}|||
fS c c}w )Nr   r   r   Tr  )r*  pairs	enumeraterQ   r  r@   r)   r  r   r  r   r'   r  r`   r  r  rB   r   )rb   r  r  to_joinr  irQ   r+   prev_mapper	to_appendparent_aliasr'  
local_colsrn   
local_attrs                  r.   _prep_for_joinszSubqueryLoader._prep_for_joins  s7   Y__&'!*5!1 	2A~1u $AEl1o44+6??6+BK	"	NNItxx01	2& w<! &L72;q>*D$$#{{  (44KK  ))77
  
 L$++"?"?"B"F"FG

 
 
L00	
s   74D2c                 d   t        |      }|dk(  r$t        ||d   d         j                  |      g}n^|dk(  rDt        ||d   d         j                  |      t        ||d   d         j                  |      g}n|dkD  r|dd D cg c]F  }t        |d         j                  st        j                  |d         n|d   j                  |d   fH }}g }	|rb|j                  d      }t        |d   |d         }
|r|
j                  |d   d         }
n|
j                  |      }
|	j                  |
       |rbt        ||d   d         j                  |	d   j                        g|	z   t        ||d   d         j                  |      gz   }|D ]  }
|j                  |
      } |S c c}w )Nr   r   r   r  )r  r  of_typer   r  r'   r  r   popr@   rB   join)rb   r  r  r  r  effective_entityltjitemmiddleinnerattrs              r.   _apply_joinszSubqueryLoader._apply_joins  s    'l!8
GAJqM2::;KLG AX
GAJqM2::<Hgbk!n5==$G 1W $AbM 	 #47+<< ))$q'2aG	F  Ezz!}tAwQ0<<q	!5D<<5DT"  WQZ]3;;E!HOOLM L'"+a.9AA(   	DtA	 Es   AF-c                     |j                   }|r?|j                  r3|t        j                  | j                  |j                  |            fz  }|j                  |      } |j                  | }|S r&   )r  rS  r'   r  r   r  _with_current_pathoptions)	rb   rs   r  r  rewritten_pathr	  r%  rj   new_optionss	            r.   _setup_optionszSubqueryLoader._setup_options  ss    $ !..w..--KK44W= K   0AII{#r0   c                 v      j                   j                  r! fd}|j                  | j                         }|S )Nc                     | xj                   t        t        j                  j                  j
                              z  c_         y r&   eager_order_byr  r   r#  r`   r"  rx  rb   s    r.   _setup_outermost_orderbyzISubqueryLoader._setup_outermost_orderby.<locals>._setup_outermost_orderby  s3    ..%LL!5!5!>!>?3 .r0   )r`   r"  _add_context_option)rb   r  r7  s   `  r.   r7  z'SubqueryLoader._setup_outermost_orderby  s;    ((
 %%($*>*>A r0   c                   ,    e Zd ZdZdZd Zd Zd Zd Zy)SubqueryLoader._SubqCollectionszGiven a :class:`_query.Query` used to emit the "subquery load",
        provide a load interface that executes the query at the
        first moment a value is needed.

        r   r}  rp  r;  subq_datac                     |j                   | _         |j                  | _        |j                  | _        |j                  xs i | _        || _        d | _        y r&   r;  )rb   rs   r<  s      r.   r_   z(SubqueryLoader._SubqCollections.__init__4  sI     #??DL%,%>%>D" ' 4 4D!...BDKDIDJr0   c                 r    | j                   | j                          | j                   j                  ||      S r&   )r=  _loadrI   )rb   r)   defaults      r.   rI   z#SubqueryLoader._SubqCollections.get>  s*    zz!

::>>#w//r0   c                    t        j                  t              | _        | j                  }|j
                  J |j                  | j
                        }| j                  j                  r|j                         }t        |j                  | j                              }t        j                  |d       D ]*  \  }}| j                  |   j                  d |D               , y )Nc                     | dd  S )Nr   rq   xs    r.   r/   z7SubqueryLoader._SubqCollections._load.<locals>.<lambda>Q  s    !AB% r0   c              3   &   K   | ]	  }|d      yw)r   Nrq   r   vvs     r.   r   z8SubqueryLoader._SubqCollections._load.<locals>.<genexpr>R  s     $7rRU$7   )collectionsdefaultdictr*  r=  r<  r   with_sessionrp  _populate_existingr  r;  	itertoolsgroupbyextend)rb   r  rowsr   vs        r.   r@  z%SubqueryLoader._SubqCollections._loadC  s    $006DJ		A99$$$t||,A  33'') -.D!))$@ 81

1$$$7Q$778r0   c                 >    | j                   | j                          y y r&   )r=  r@  )rb   r   r  r  s       r.   r  z&SubqueryLoader._SubqCollections.loaderT  s    zz!

 "r0   N)	rw   rx   ry   rz   r{   r_   rI   r@  r  rq   r0   r.   _SubqCollectionsr:  $  s"    	
			0
	8"	r0   rT  c           	      \   |j                   }|j                  j                  r|j                  j                  ry |j                  j                  |      }d|_        || j                     }|j                  |j                  dd       }	|	|	}
n| j                  }
|j                  j                  j                  dt        j                  j                  t        j                  j                  f      \  }}|t        j                  j                  u }||z   }||z   }|j!                  |j                  d      sj| j"                  rB|j$                  r|j$                  j&                  nd|j&                  z   dz  | j"                  kD  ry |j)                  | j*                        ry |j                  j                  j                  dt,        f|j                        }t/        j0                  |d      }|j2                  r>|j4                  j6                  t9        j:                  d	| d
|d       |j<                  }|j?                  |d      }| jA                  ||||      \  }}}}| jC                  ||||||      }t        jD                  |
      }|j                  jG                  dt,        f|d||fi      |_        |jI                  d      }| jK                  ||      \  }}} |jL                  | }| jO                  |||||
      }| jQ                  ||||||
|      }| jS                  |      }|S )NTpath_with_polymorphic)subquery_pathsNr  r   r   r	  ormzsubqueryloader for "z!" must invoke lambda callable at z in order to produce a new query, decreasing the efficiency of caching for this statement.  Consider using selectinload() for more effective full-lambda cachingF)legacy)*rg   r   _enable_eagerloads_for_refresh_stater  indexloaders_require_bufferingr`   rI   r   r   r   r  r'   r  r  r  r  r  r  r  rQ   r  r   _get_plugin_class_for_plugin_is_lambda_elementrp  rm  r   r  	_resolved_create_entities_collectionr  r  r  union_set_enable_single_critr   add_columnsr+  r1  r7  )rb   rs   rh   ri   r   rj   rk   rg   r  with_poly_entityr%  r  r/  r  r	  compile_state_clsr  r  r  r
  r  r  r  r  r  s                            r.   _setup_query_from_rowprocz(SubqueryLoader._setup_query_from_rowprocX  sN     ----@@,,??"/"9"9"?"?"M,0)D(()  88$$&=t
 '/#{{$+MM$D$D$H$H$""'')>)>)C)CD%
!	> x44999$	'$. }}]55x@ )55 &2299kk"  ( **4;;7 ]]5599>*GMM

 ,HH
 ((##55=		 Z) $--J
 /JJu K 
 #	
	
! 77!

 KK() 3399~.
(9n*E 
 %%e,,0,@,@	-
)\ AMM:&w
L2B
 
 ))!,r0   c	           
         |j                   r| j                  ||||||||      S | j                  ||| j                        ry t	        |j
                  t              sy | j                  j                  | j                     j                  j                  st        j                  d| z        t        |      dk(  r+t        j                   |j"                  | j                        s%y t        j                   |d   | j                        sy | j%                  ||||d   ||      }	|	y |	j&                  J || j(                     }| j(                  j*                  }
|j-                  |j.                  d      }|/| j1                  ||	      }|j3                  |j.                  d|       |r|
D cg c]  }|j4                  |    }
}| j6                  r| j9                  ||||
|       y | j;                  ||||
|       y c c}w )NJ'%s' does not support object population - eager loading cannot be applied.r   r  rJ  )r   r  r  r  r   rg   r   rB   rJ   r)   implsupports_populationr   r   r  r'   _entity_isar  rg  r   r`   r  rI   r   rT  r   r\   r4   _create_collection_loader_create_scalar_loader)rb   rs   rh   ri   rj   rQ   rt   rk   ru   r<  r  rJ  rn   s                r.   rv   z#SubqueryLoader.create_row_processor  s      ;;	 	 ++GT4??KG113HI {{((277KK,,@BFG  t9>''(@(@$++N%%d2h<--H
 <||###D(()))77

 hhw11=A//>KHHW''D6@A'//!,AJA<<**j* &&j* Bs   ,G<c                 6    |j                  |       fd fd}|d   j                   j                  f       |d   j                   j                  |f       |j                  r+|d   j                   j                  j                  f       y y )Nc                      j                    |      d      }| j                  j                        j                  | ||       y r  )rI   r  r)   set_committed_value)r   r  r  
collectionrJ  rb   tuple_getters       r.   load_collection_from_subqzKSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subqM  s<    (c):B?JNN488$88ujr0   c                 8    j                   |vr | ||       y y r&   r)   )r   r  r  rt  rb   s      r.   &load_collection_from_subq_existing_rowzXSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq_existing_rowS  s     xxu$)%< %r0   r   existingeager_tuple_getterr@   r)   invoke_all_eagersr  )	rb   rs   rt   rJ  r  ru   rw  rt  rs  s	   `  `   @@r.   rm  z(SubqueryLoader._create_collection_loaderH  s     ++J7		= 	5  $((,E!FG:%%XX=>	
 $$w&&+2D2D'EF %r0   c                 6    |j                  |       fd fd}|d   j                   j                  f       |d   j                   j                  |f       |j                  r+|d   j                   j                  j                  f       y y )Nc                      j                    |      d      }t        |      dkD  rt        j                  dz         |d   }| j	                  j
                        j                  | ||       y )Nr&   r   LMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' r   )rI   r  r   r  r  r)   rq  )r   r  r  rr  scalarrJ  rb   rs  s        r.   load_scalar_from_subqzCSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subqd  sk    (c):GDJ:"		GIMN
  ]FNN488$88vNr0   c                 8    j                   |vr | ||       y y r&   rv  )r   r  r  r  rb   s      r.   "load_scalar_from_subq_existing_rowzPSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq_existing_rowo  s     xxu$%eUC8 %r0   r   rx  ry  rz  )	rb   rs   rt   rJ  r  ru   r  r  rs  s	   `  `   @@r.   rn  z$SubqueryLoader._create_scalar_loader_  s     ++J7		O	9 	5  $((,A!BC:%%XX9:	
 $$w&&+2D2D'EF %r0   )rw   rx   ry   r{   r_   r   r  r  r   r+  r1  r7  objectrT  rg  rv   rm  rn  r|   r}   s   @r.   r  r    s`      I:'
/LbbH-1^3j"H26 2hWrUnG.Gr0   r  joinedc                   z     e Zd ZdZdZ fdZd Z	 	 	 ddZd Zd Z	d Z
d	 Zd
 Z	 ddZd Zd Zd Zd Z xZS )JoinedLoaderzcProvide loading behavior for a :class:`.RelationshipProperty`
    using joined eager loading.

    )r  _aliased_class_poolc                 r    t         t        |   ||       | j                  j                  | _        g | _        y r&   )r^   r  r_   r`   r  r  ra   s      r.   r_   zJoinedLoader.__init__  s/    lD*6<@..99#% r0   c                 X    | j                   j                  d      j                  |       y r  r  r   s     r.   r   z!JoinedLoader.init_class_attribute  r  r0   c	                 P   |j                   j                  sy| j                  rd|_        || j                     }d}
|r| j                  |||j                        nd}|dur| j                  |||||      \  }}}n|j                  |j                  d      sE| j                  r|j                  dz  | j                  kD  ry|j                  | j                        ry| j                  ||||||||      \  }}}}d|_        |j                  |j                  dd      }|t!        |      j"                  }
nd}
|| j$                     }t'        j(                  || j                  |||||
| j                  |	       |-dt+        |j,                        v rt/        j0                  d      yy)	z@Add a left outer join to the statement that's being constructed.NTFr  r   rV  )with_polymorphicparentmapperchained_from_outerjoinzDetected unaliased columns when generating joined load.  Make sure to use aliased=True or flat=True when using joined loading with with_polymorphic().)r   rZ  r4   multi_row_eager_loadersr`   _init_user_defined_eager_procr   $_setup_query_on_user_defined_adapterr  r  r  r  rQ   _generate_row_adaptereager_adding_joinsrI   r   with_polymorphic_mappersr   r   _setup_entity_queryr   secondary_columnsr   r   )rb   rg   rh   ri   rj   rk   rl   r  r  rm   r  user_defined_adapterclausesadd_to_collectionre  s                  r.   ro   zJoinedLoader.setup_query  s    ,,??\\48M1D(()  ..(@(@  	  u, 99$	!  ==!9!98D??{{Q8))$++6 **!&	!& 04M,88$$&=t
 '&  &&   $DKK ##KK-#9
	
 'DC++5
 -
 ,,E -
'r0   c                    d|j                   vry|j                  j                  }|j                  |j                  dd      }|dur|S |j                   d   }|dd  \  }}|Wt        |t              r|j                  j                  |      }t        j                  ||j                  j                        }n|j                  |j                  d      rH|j                  |j                  d      }	t        j                  |	|j                  j                        }n&|j                   j                  |j                  d       }|j#                  |d|       |S )Neager_from_aliasF user_defined_eager_row_processor)r  rV  )r   ri   rB   rI   r   r   strr   aliasr$  ColumnAdapterrQ   r)  r  r'   
ORMAdapter_polymorphic_adaptersr   )
rb   rj   rg   target_attributesri   rk   r  root_mapperr+   re  s
             r.   r  z*JoinedLoader._init_user_defined_eager_proc  sO   
 W%7%77||"" (($$&H%
 %N ""#56 IT%%))%0,,4;;#B#BG }}((*A $(88!,,.E$  #--$ $ ? ?
 (==AAKK 	.	
 r0   c                     |j                  |      }|r1|r/|j                  |      }|j                  |j                  d|       n!|r|}|j                  |j                  d|       |j                  }|||fS )Nr  )_get_entity_clauseswrapr   r   primary_columns)rb   rs   r   ri   rk   r  r  s          r.   r  z1JoinedLoader._setup_query_on_user_defined_adapter8  s     ,,W5+#7#<#<W#E HH""2$
 #* HH""2$ $33#W.???r0   c                 >   t        | j                        j                  r t        | j                        j                  }nd }d| f}||j                  vrdx|j                  |<   }n!|j                  |   dz   x|j                  |<   }|t        | j                        k\  rqt        j                  | j                  ||j                  d      nd dd      }t        |      j                  j                   | j                  j                  |       | j                  |   S )Njoinedloader_acr   r   T)flat)r  r  r  )r   r   r  
selectabler   r  r  r'   r  rQ   _anonymous_fromclausern   r@   )rb   rs   alt_selectabler)   idxto_adapts         r.   _gen_pooled_aliased_classz&JoinedLoader._gen_pooled_aliased_classR  s   
 4;;00$T[[1<<N!N $'g(((,--Gs#c,3,>,>s,Ca,GGGs#c#d..//,,!- %:::E $H H((**$$++H5'',,r0   c	                 |   |j                  |j                  dd       }	|	r|	}
n| j                  |      }
t        |
      j	                  d| ft
        j                  |
| j                  j                  ddd      }|j                  J |0|j                  j                  d| j                  j                        n| j                  j                  }|sd}|j                  j                  | j                  ||||||||r|j                   ndf	       |j"                  }|j%                  |j                  d|       ||||fS )	NrV  joinedloader_ormadapterTF)r  adapt_requiredallow_label_resolveanonymize_labels	innerjoinrq   eager_row_processor)rI   r   r  r   _memor'   r  rQ   r)  aliased_classr   r`   r  create_eager_joinsr@   _create_eager_joinrS  r  r   )rb   rg   r   ri   rj   rk   rl   r  r  re  r  r  r  r  s                 r.   r  z"JoinedLoader._generate_row_adaptert  sZ     88$$&=t
 'H55mDH(#))&-77 %! * 
 $$000 " "";0D0D0N0NO%%// 	  &*"((//''&+2''
	
 *;;))+@'J!24JJJr0   c
           	          ||j                   }
n|}
|j                  xr |j                  }d }||j                  vrv|st|j                  rht        j                  |j                  |j                        }t        |      dkD  rt        j                  d      |r|j                  |d      }|d   |}}|||j                  }}|j                  j                  |      }|rt        |dd       rwt        |j                        j                  |
j!                   j"                        r|
n j"                        }t        |j$                   j&                   j(                        }nXt        t+        j,                   j"                  |j                  d       j&                   j(                        }n j(                  }|j                  J | xs" | xs |dk(  xs |j.                  j0                  }|	}|j2                  j5                  d j                   fd	      }|r|t7         fd
|D              z  }|rtt+        j8                  ||j                  || xs6 |j.                  j0                  xs |xr t;        |t<        j>                         j"                   j                   |      }n jA                  |||||      }||j                  |<   |j                  |_!        |st        jD                   j(                  jF                        D ]U  }|
jH                  jJ                  jM                  |      s)|r|jN                  |   }|jQ                  ||jR                         W  j(                  jT                  r_|xjV                  t7        |jX                  j[                  t]        j^                   j(                  jT                                    z  c_+        y y )Nr   zCan't identify which query entity in which to joined eager load from.   Please use an exact match when specifying the join path.r   r  Tr  unnestedadditional_entity_criteriarq   c              3   l   K   | ]+  }|j                   r|j                  j                         - y wr&   )propagate_to_loaders_resolve_where_criteriarQ   )r   aerb   s     r.   r   z2JoinedLoader._create_eager_join.<locals>.<genexpr>	  s1      )** **4;;7)s   14isouter
_left_memo_right_memorS  )0rQ   r  _should_nest_selectableeager_joinsfrom_clausesr$  #find_left_clause_that_matches_givenr  r  r   r   
setdefaultr  r   r  _entity_for_mapperr  rB   r   r)   r`   r'   r  r  represents_outer_joinglobal_attributesrI   r  _ORMJoinr   r    Join_splice_nested_inner_joinstop_on_find_columnsprimaryjoinpersist_selectablern   contains_columnr\   rf   r  r"  r5  _target_adaptercopy_and_processr   r#  )rb   rg   rh   ri   rk   r  r  r  r  r_  r   should_nest_selectablequery_entity_keyindexesclausedefault_towraptowrapefmonclauseattach_on_outsideextra_join_criteriar  	eagerjoinr   s   `                       r.   r  zJoinedLoader._create_eager_join  s    &--K&K 11 655 	
    9 99*** BB**L,C,CG 7|a 000  &33GAJ?
 4;1:v. #'' -
 **55n
 w6
 g334GG"t{{3   #3::txx9M9MN"))W%7%7 HH(( ++H$$000 '& >}>J&> ''==	 	 -%2%D%D%H%H)4;;7&
" &5 )4) $   ))%%% M++AAM*Kz&#((/K;; KK 3
I 66fgx1DI 7@!!"23 )33	  --$$00  1133CCCH%ooc2!??]:: ((((E**;;LL!5!5!>!>?- ( )r0   c           	         |du rt        |t        j                        sJ t        |t        j                  j
                        r | j                  ||j                  ||||      S t        |t        j                        sH|d   j                  |      r3t        j                  ||j                  |d||d   j                  |      S y | j                  ||j                  ||||j                        }|:d}| j                  ||j                  ||||j                        }||dusJ d       y d}|rm|j                  s|j                  s|j!                  |      }	nt        j                  |j                  ||j"                  |j                  |j                        }	nBt        j                  ||j                  |j"                  |j                  |j                        }	|j$                  |	_        |	S )	NFr  r  r  z9assertion failed attempting to produce joined eager loadsT)r  r  )r  r  )r   r'   r  r    r  FromGroupingr  elementr  r  rQ   rightr  leftr  r  _splice_into_centerr  r  )
rb   ri   join_objr  r  r_  splicingtarget_joinright_splicer  s
             r.   r  z&JoinedLoader._splice_nested_inner_joinQ	  s    u h(9(9:::#.."="=>11    Hh&7&78Bx||H%(())!' $R$2  44NN  
  L88##K " E)ONO)L ##K,?,?$88E	$--MM%%$,,'22	 !))!! (($00I %0$?$?	!r0   c                 j   |j                   }|r| j                  |||j                        nd}|durE|}|j                  r|r|j	                  |j                        }n8|j                  r,|j                  }n|j                  |j                  d      }|y| j                  j                  ||      r|S y)NFr  )rg   r  r   compound_eager_adapterr  rI   rQ   _result_has_identity_key)	rb   rs   rt   rk   ri   rj   rg   r  	decorators	            r.   _create_eager_adapterz"JoinedLoader._create_eager_adapter	  s    --  ..(:(:  	  u,,I 33	%NN!88	 55)@@	((*?I  ;;//	B r0   c	           
      `   | j                   j                  | j                     j                  j                  st        j                  d| z        | j                  rd|_        || j                     }	| j                  ||||	|      }
|
durs| j                  }t        j                  || j                  |||	| j                     |
      }| j                  s| j                  ||||       y | j!                  ||||       y | j                  j#                  d      j%                  ||||||||       y )Nri  TFr  )rB   rJ   r)   rj  rk  r   r   r4   loaders_require_uniquingr`   r  r   _instance_processorrQ   r   rn  rm  r   rv   )rb   rs   rh   ri   rj   rQ   rt   rk   ru   our_patheager_adapterr)   	_instances                r.   rv   z!JoinedLoader.create_row_processor	  s6    {{((277KK,,@BFG 
 <</3G,,,-22VWh
 %((C33%I <<**7CJO..S)Z   ..%""	r0   c                 
   fd}fd}fd}|d   j                  | j                  |f       |d   j                  | j                  |f       j                  r!|d   j                  | j                  |f       y y )Nc                     t        j                  | |      }t        j                  |d      }|j                   | f<    |      }||j	                  |       y y Nappend_without_eventr   r  r   UniqueAppenderr@   )	r   r  r  rr  result_listinstr  rs   r)   s	         r.   #load_collection_from_joined_new_rowzSJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_new_row

  sg     $99%LJ--2K 0;Gs|,S>D""4(  r0   c                     | fj                   v rj                   | f   }n>t        j                  | |      }t        j                  |d      }|j                   | f<    |      }||j	                  |       y y r  r  )	r   r  r  r   rr  r  r  rs   r)   s	         r.   (load_collection_from_joined_existing_rowzXJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_existing_row
  s    s|w111%00%> (==5#
 #11 6 4?""E3<0S>D""4(  r0   c                      |       y r&   rq   r   r  r  r  s      r.    load_collection_from_joined_execzPJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_exec*
  
    cNr0   r   rx  ry  r@   r)   r|  )rb   rs   r)   r  ru   r  r  r  s    ```    r.   rm  z&JoinedLoader._create_collection_loader	
  s    	)	)&	 	5  XX:;	
 	:%%XX?@	
 $$w&&;< %r0   c                     fd} fd}fd}|d   j                   j                  |f       |d   j                   j                  |f       |j                  r!|d   j                   j                  |f       y y )Nc                      |      |<   y r&   rq   )r   r  r  r  r)   s      r.   load_scalar_from_joined_new_rowzKJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_new_row9
  s     #3E#Jr0   c                 j     |      }|v r!||   urt        j                  dz         y y ||<   y )Nr  )r   r  )r   r  r  rx  r  r)   rb   s       r.   $load_scalar_from_joined_existing_rowzPJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_existing_row>
  sM     !~H e|5:-IIK . &c
r0   c                      |       y r&   rq   r  s      r.   load_scalar_from_joined_execzHJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_execQ
  r  r0   r   rx  ry  r	  )rb   rs   r)   r  ru   r  r  r  s   ` ``    r.   rn  z"JoinedLoader._create_scalar_loader8
  s    	(
	&&	 	5  $((,K!LM:%%XX;<	
 $$w&&78 %r0   )NNFr   )rw   rx   ry   rz   r{   r_   r   ro   r  r  r  r  r  r  r  rv   rm  rn  r|   r}   s   @r.   r  r  {  sp    
 4I&
' $qf3j@4 -D;Kz^B KPXt"H8t-^#r0   r  selectinc                        e Zd ZdZ ej
                  dg d      ZdZ fdZd Z	d Z
d Zd	 Zd
 Zd Zd Zd Z xZS )SelectInLoader)r  	omit_join_parent_alias_query_info_fallback_query_info	queryinfo)load_only_childload_with_joinin_exprpk_colszero_idxchild_lookup_colsi  c                    t         t        |   ||       | j                  j                  | _        | j                  j
                  t        j                  u }| j                  j                  | j                  j                  | _        n~| j                  j                  d      }|r|j                  | _        nO| j                  j                  d   j                  |j                  dd| j                  j                        | _        | j                  rC|r+| j!                         | _        | j%                         | _        y | j)                         | _        y | j%                         | _        y )Nr  r   TFr  )r^   r  r_   r`   r  rN   r   r0  r  r   r  rB   r(  r   r  r)  _init_for_omit_join_m2or  _init_for_joinr  _init_for_omit_join)rb   rB   rc   is_m2o
lazyloaderrd   s        r.   r_   zSelectInLoader.__init__w
  s&   nd,V\B..99%%//:3G3GG))5!11;;DN--;;%J !+!3!3!%!8!8!;!C!C-- $!& $ ? ?	 "D " >>#'#?#?#A ,0,?,?,A)#'#;#;#= #224Dr0   c                     t         j                  j                  j                        j	                   fdt              D                j                  j                  D cg c]  }|v s|    c}x}}t        |      dkD  rt        j                  | }d}n|d   }d} j                  dd|||d       S c c}w )Nc              3      K   | ]6  }j                   j                  j                  |d       D ]  }||   f  8 yw)rq   N)rB   r)  rI   )r   r   equivpk_to_fkrb   s      r.   r   z5SelectInLoader._init_for_omit_join.<locals>.<genexpr>
  sN      
88<<QC
  HQK 
 
s   <?r   Fr   T)rZ  r`   r   local_remote_pairsr  r*  rB   r   r  r    tuple_
query_info)rb   r   r  fk_colsr  r  r(  s   `     @r.   r"  z"SelectInLoader._init_for_omit_join
  s      00CC
 	 
(^
 	
 &*[[%<%<
!xHSM
 	
' w<!jj'*GHajGHueWgxNN
s   (	B>2B>c                 &   | j                   j                  }t        |      dkD  rt        j                  | }d}n|d   }d}| j
                  j                  d      }|D cg c]  }|j                  |    }}| j                  dd||||      S c c}w )Nr   Fr   Tr  )	rQ   r   r  r    r*  r`   r   r  r+  )rb   r  r  r  r$  rg  lookup_colss          r.   r   z&SelectInLoader._init_for_omit_join_m2o
  s    ++))w<!jj'*GHajGH))778MN
AHI2z2226II%'8[
 	
 Js    Bc                 b   t        | j                  j                        | _        t	        | j                        }| j                  j
                  D cg c]  }|j                  |       }}t        |      dkD  rt        j                  | }d}n|d   }d}| j                  dd|||d       S c c}w )Nr   Fr   T)r   rB   rM   r  r   r   _adapt_elementr  r    r*  r+  )rb   pa_inspr   r  r  r  s         r.   r!  zSelectInLoader._init_for_join
  s    $T[[%7%78$,,-37;;3J3J
,/G""3'
 
 w<!jj'*GHajGHudGWhMM
s   B,c                 X    | j                   j                  d      j                  |       y r  r  r   s     r.   r   z#SelectInLoader.init_class_attribute
  r  r0   c	           
      \   |j                   r| j                  ||||||||      S | j                  ||| j                        ry | j                  j
                  | j                     j                  j                  st        j                  d| z        t        |      dk(  r+t        j                  |j                  | j                        s%y t        j                  |d   | j                        sy |j                  j                   xs t        j"                  j$                  |z   }	|| j&                     }
|
j)                  |j*                  dd       }|t-        |      }n| j.                  }t0        j2                  j5                  ||	| j                  | j&                  | j6                  ||       y )Nri  r   r  rV  )r   r  r  r  rB   rJ   r)   rj  rk  r   r   r  r'   rl  r  rg   r  r  r  r`   rI   r   r   r   r   r  callable_for_path_load_for_path)rb   rs   rh   ri   rj   rQ   rt   rk   ru   selectin_pathr  re  r%  s                r.   rv   z#SelectInLoader.create_row_processor
  s      ;;	 	 ++GT4??K{{((277KK,,@BFG  t9>''(@(@$++N%%d2h< !!..L(2G2G2L2L 4//0 '?? 7
 '&'78#{{**KK  	
r0   c                     |r j                   |vry  j                  }|j                  rt        j                  t
              }g }	 j                  |D ]  \  }
j                  t        fd|j                  D              }t        j                  |v r j                  } n2d |vr||   j                  |
f       n|	j                  |
f        |j                  s/|D 
cg c]"  \  }}
|j                   d   ||j                  |
f$ }}}
|j                  }|j                  }|j                   s;|j"                  r/|D cg c]  }|j%                  |       }}|j%                  |      }t'        j(                  dg| }|j+                         }|j+                         }t-        j.                  ||gt0        t2        j4                  d|d      }|j                   s|j7                  |      }na|j7                   j8                        j;                  t=         j8                   j>                  j                         jA                  |            }|jC                  |jE                  tG        jH                  d                  }|jJ                  jL                  }| j>                     }||jN                  u r|jP                  }nP|jP                  }|jN                  jP                  }tS        ||      D cg c]  \  }}|jU                  ||       }}}|r5|jV                  r)|t'        jX                  ||j[                  |            fz  } |j\                  | }|j_                  d|i      }|j`                  r|jc                  d	
      } j>                  jd                  r}|j                   sP j>                  jd                  }|j"                  r|D cg c]  }|j%                  |       }} |jd                  | }n! fd}|jg                  | j>                        }|j                  r ji                  	|||       y  jk                  |||       y c c}
}w c c}w c c}}w c c}w )Nc              3   d   K   | ]'  }j                  |t        j                          ) yw)rd  N)rH  r   PASSIVE_NO_FETCH)r   lkrQ   r   
state_dicts     r.   r   z0SelectInLoader._load_for_path.<locals>.<genexpr>"  s=      &  44" * ; ;	 5 &s   -0r   rg  rX  )compile_state_pluginplugin_subject)ri  rk  r   rj  primary_keysro  T)r  c                     | xj                   t        t        j                  j                  j
                              z  c_         y r&   r4  r6  s    r.   r7  z?SelectInLoader._load_for_path.<locals>._setup_outermost_orderby  s3    #22eT%9%9%B%BC7 2r0   )6r)   r  r  rJ  rK  r*  rB   rZ  r  r  r   r   r  r@   r  r  r  r  r0  r'   Bundler  r#   r  r"   r   r  r  r  r$  r  r`   r"  filterin_r    r4  rg   select_statementr   r  zip'_adapt_cached_option_to_uncached_optionrS  r  r  r.  _update_compile_optionsr  r}  r"  r8  _load_via_child_load_via_parent) rb   rs   ri   states	load_onlyr%  rj   r+  
our_statesnone_states	overwriterelated_identr   r  r  r   
bundle_ent
bundle_sql
entity_sqlr  r	  r  r0  cached_optionsuncached_optionsorig_optuncached_optr5  r,  r7  rQ   r;  s    `           `                 @@r.   r5  zSelectInLoader._load_for_path  se    2%%
%%$006JK[[F$* G y"ZZ
 % & )::& ! //=@!%!:!:J },}-44
I6  &&z9'EF7G< )) )/$E9 1uejj)<J 
 $$$$((  00DK=@$33C8  +99'B__T4G4
224
%88:
%%$j17,DD(-"2	
 (( ./A
 d00166**D,@,@,D,DEMM$A HHW[[~!>?@ **;;
2 d223&$22K'55N&}}:: /2"$4/	 +Hl @@\K  w..--$44W= K AII{#%%&GH$$##d#;A((,,!%!5!5!>!>#44 %3&  )77=&N & AJJ/
 )),d.B.B %%  KQ !!*j!WEe d6&s   ,'Q
Q$>Q)Q/c           	         | j                   }t        |      }|r|d| j                   }|| j                  d  }|j                  j	                  |d|D 	cg c]  }	|j
                  r|	d   n|	 c}	i      j                         D 
ci c]  \  }
}|
|
 }}
}|D ]d  }	|j                  |	d       }||	   D ]H  \  }}}|s| j                  |v r|j                  | j                        j                  |||s|n|g       J f |r|D ]C  \  }}}|s| j                  |v r|j                  | j                        j                  ||d        E y c c}	w c c}}
w )Nr   r>  r;  )r4   sorted
_chunksizer   r  r  r3  rI   r)   r  rq  )rb   rK  rL  r+  r  rs   r4   our_keyschunkr)   r   rR  datarelated_objr   r  rM  s                    r.   rG  zSelectInLoader._load_via_child  s   ,, *%Q1E 12H $OO33&',) # '1&9&9CFsB) 4  &(Aq 1D    #hhsD1/9# +E5)$U): NN488,@@+2	! B (3 	M#E5)U!2 NN488$88tL	M3)s   EEc           
      @   | j                   }|rdnd }|r|d| j                   }|| j                  d  }|D 	
cg c]  \  }}	}
}|j                  r|d   n| }}
}	}}t        j                  t
              }t        j                  |j                  j                  |d|i      j                         d       D ]   \  }}||   j                  d |D               " |D ]  \  }}	}
}|s| j                  |
v r|j                  ||      }|sX|rVt        |      dkD  rt        j                   d| z         |	j#                  | j                        j%                  |	|
|d          |	j#                  | j                        j%                  |	|
|        |ry y c c}}
}	}w )	Nrq   r   r>  rW  c                     | d   S r   rq   rD  s    r.   r/   z1SelectInLoader._load_via_parent.<locals>.<lambda>  s
    !A$ r0   c              3   &   K   | ]	  }|d      yw)r   Nrq   rG  s     r.   r   z2SelectInLoader._load_via_parent.<locals>.<genexpr>  s     1r!u1rI  r   r  )r4   rY  r  rJ  rK  r*  rN  rO  r   r  r3  rP  r)   rI   r  r   r  r  rq  )rb   rK  r+  r  rs   r4   _empty_resultr[  r)   r   r;  rM  r>  r\  r   rR  rr  s                    r.   rH  zSelectInLoader._load_via_parent  s   ,,%4q4??3E#DOO$56J :? 5C
I %--A36L 
 **40D!))''~|< ( &(	 21 Q1q112 6; 1UJ	 TXX%;!XXc=9
::*		.045
 NN488,@@z:a= NN488,@@z:)% s   F
)rw   rx   ry   r{   rJ  
namedtupler+  rY  r_   r"  r   r!  r   rv   r5  rG  rH  r|   r}   s   @r.   r  r  ^
  sc    I (''	

J J5<O,
 N'
B
HFB,M\,r0   r  c                     fdfd}fd}t        j                  | d|ddd       t        j                  | d|ddd       y )Nc           	         ||j                   j                   k(  rh|j                  t        j                  |            }|rB||ur>t	        j
                  dt        j                  |      d| j                  ddd      |S )Nz	Instance z+ is already associated with an instance of z	 via its z0 attribute, and is only allowed a single parent.bbf1)code)	r)   	hasparentr   instance_stater   r   r'   instance_strrM   )r   r9  oldvalue	initiatorrg  r+   s        r.   	_do_checkz*single_parent_validator.<locals>._do_check1  sz    $((!:!++J,E,Ee,LMIXU200  ,,U3U\\4I    r0   c                      | |d |      S r&   rq   )r   r9  rk  rl  s      r.   r@   z'single_parent_validator.<locals>.append>  s    tY77r0   c                      | |||      S r&   rq   )r   r9  rj  rk  rl  s       r.   set_z%single_parent_validator.<locals>.set_A  s    x;;r0   r@   T)rawretvalr;   r   )r   listen)r*   r+   r@   ro  rl  s    `  @r.   rA   rA   0  sE    8< 
LLhDd 
LLudT$Or0   )NNNNFN)Drz   
__future__r   rJ  rN   r   r   r   r   r   r	   r
   r   r   r   r   r'   baser   r   r   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r$  r!   sql.selectabler"   r#   rW   ColumnPropertystrategy_forr[   class_loggerr   r   r   r  r   r   RelationshipPropertyr   r   MemoizedSlotsr  r  r  r  r  r  r  rA   rq   r0   r.   <module>r|     s  2 &             " " ' ) $ * ! & + #           "  ; # P!f ''55'I( ( J(V ''4%'HR:> R: I R:j '''>M
\ M
 ? M
` ''$'G''dd (  ''4'8y
> y
 9 H y
x8& 80
4 
4 ##00D0An  B  ##00h0?##00d0;#=) #= < @ #=L ##00d0;##00h0?##00g0>##00n0E##00n0EcJ+T-?-? cJ F F ? @ < cJL1
 1
h/
+ /
d ##00k0BAj A CAD ##00j0AK
GZ K
G B K
G\ ##00h0?##00e0<]- ] = @ ]@ ##00j0AMZ!3!3 M B M`Pr0   