gdZddlmZddlZddlZddlmZddlmZddlmZddlmZddlm Z dd lm Z dd lm Z dd lm Z dd lm Z dd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z dd lm!Z!dd!lm"Z"dd"lm#Z#dd#l"m$Z$dd$l"m%Z%dd%l"m&Z&dd&l"m'Z'dd'l(m)Z)dd(l*m+Z+dd)l*m,Z,dd*l*m-Z-dd+l.m/Z/dd,l.m0Z0dd-l1m2Z2dd.l3m4Z4dd/l3m5Z5dd0l3m6Z6dd1l3m7Z7dd2l3m8Z8ejrrdd3l*m:Z:dd4l*m;Z;dd5lm?Z?dd7l>m@Z@ed8e9ZAed:ed;<ZBed=ed;>ZCed?e9ZDed@e9ZEedAe9ZFddddddBdBe2je2je2je2je2je2je2jdC dydDZHGdEdFe%ZIGdGdHe5eBZJGdIdJe5ZKGdKdLeKe5eCZLGdMdNeKe5eCZMGdOdPe5ZNGdQdReNe5eCZOGdSdTeNe5eCZPGdUdVe5eAZQGdWdXe5ZRGdYdZe5ZSGd[d\e5ZTGd]d^e5eAZUGd_d`e&je'eAe,eUeAZWedadb9ZXGdcdde)eAZYGdedfeYeAZZGdgdheYeAZ[GdidjeYeAZ\GdkdleQeAZ]edmdn9Z^ Gdodpe e^Z_Gdqdre_eAZ`Gdsdte`eAeeAZaGdudve_eFeeEeFfZbGdwdxe`eAeeAZcy)zzContain the ``AssociationProxy`` class. The ``AssociationProxy`` is a Python property object which provides transparent proxied access to the endpoint of an association object. See the example ``examples/association/proxied_association.py``. ) annotationsN) AbstractSet)Any)Callable)cast) Collection)Dict)Generic ItemsView)Iterable)Iterator)KeysView)List)Mapping)MutableMapping)MutableSequence) MutableSet)NoReturn)Optional)overload)Set)Tuple)Type)TypeVar)Union ValuesView) ColumnElement)exc)inspect)orm)util) collections)InspectionAttrExtensionType) interfaces) ORMDescriptor)SQLORMOperations)_AttributeOptions)_DCAttributeOptions)_DEFAULT_ATTRIBUTE_OPTIONS) operators)or_)_NoArg)Literal)Protocol)Self) SupportsIndex)SupportsKeysAndGetItem)MapperProperty)PropComparator)Mapper)_ColumnExpressionArgument) _InfoType_T)bound_T_coT)r; covariant_T_con)r; contravariant_S_KT_VTF)creatorgetset_factory proxy_factoryproxy_bulk_setinfocascade_scalar_deletescreate_on_none_assignmentinitreprdefaultdefault_factorycomparekw_onlyhashcJt|||||||||t| | | | | || S)aReturn a Python property implementing a view of a target attribute which references an attribute on members of the target. The returned value is an instance of :class:`.AssociationProxy`. Implements a Python property representing a relationship as a collection of simpler values, or a scalar value. The proxied property will mimic the collection type of the target (list, dict or set), or, in the case of a one to one relationship, a simple scalar value. :param target_collection: Name of the attribute that is the immediate target. This attribute is typically mapped by :func:`~sqlalchemy.orm.relationship` to link to a target collection, but can also be a many-to-one or non-scalar relationship. :param attr: Attribute on the associated instance or instances that are available on instances of the target object. :param creator: optional. Defines custom behavior when new items are added to the proxied collection. By default, adding new items to the collection will trigger a construction of an instance of the target object, passing the given item as a positional argument to the target constructor. For cases where this isn't sufficient, :paramref:`.association_proxy.creator` can supply a callable that will construct the object in the appropriate way, given the item that was passed. For list- and set- oriented collections, a single argument is passed to the callable. For dictionary oriented collections, two arguments are passed, corresponding to the key and value. The :paramref:`.association_proxy.creator` callable is also invoked for scalar (i.e. many-to-one, one-to-one) relationships. If the current value of the target relationship attribute is ``None``, the callable is used to construct a new object. If an object value already exists, the given attribute value is populated onto that object. .. seealso:: :ref:`associationproxy_creator` :param cascade_scalar_deletes: when True, indicates that setting the proxied value to ``None``, or deleting it via ``del``, should also remove the source object. Only applies to scalar attributes. Normally, removing the proxied target will not remove the proxy source, as this object may have other state that is still to be kept. .. versionadded:: 1.3 .. seealso:: :ref:`cascade_scalar_deletes` - complete usage example :param create_on_none_assignment: when True, indicates that setting the proxied value to ``None`` should **create** the source object if it does not exist, using the creator. Only applies to scalar attributes. This is mutually exclusive vs. the :paramref:`.assocation_proxy.cascade_scalar_deletes`. .. versionadded:: 2.0.18 :param init: Specific to :ref:`orm_declarative_native_dataclasses`, specifies if the mapped attribute should be part of the ``__init__()`` method as generated by the dataclass process. .. versionadded:: 2.0.0b4 :param repr: Specific to :ref:`orm_declarative_native_dataclasses`, specifies if the attribute established by this :class:`.AssociationProxy` should be part of the ``__repr__()`` method as generated by the dataclass process. .. versionadded:: 2.0.0b4 :param default_factory: Specific to :ref:`orm_declarative_native_dataclasses`, specifies a default-value generation function that will take place as part of the ``__init__()`` method as generated by the dataclass process. .. versionadded:: 2.0.0b4 :param compare: Specific to :ref:`orm_declarative_native_dataclasses`, indicates if this field should be included in comparison operations when generating the ``__eq__()`` and ``__ne__()`` methods for the mapped class. .. versionadded:: 2.0.0b4 :param kw_only: Specific to :ref:`orm_declarative_native_dataclasses`, indicates if this field should be marked as keyword-only when generating the ``__init__()`` method as generated by the dataclass process. .. versionadded:: 2.0.0b4 :param hash: Specific to :ref:`orm_declarative_native_dataclasses`, controls if this field is included when generating the ``__hash__()`` method for the mapped class. .. versionadded:: 2.0.36 :param info: optional, will be assigned to :attr:`.AssociationProxy.info` if present. The following additional parameters involve injection of custom behaviors within the :class:`.AssociationProxy` object and are for advanced use only: :param getset_factory: Optional. Proxied attribute access is automatically handled by routines that get and set values based on the `attr` argument for this proxy. If you would like to customize this behavior, you may supply a `getset_factory` callable that produces a tuple of `getter` and `setter` functions. The factory is called with two arguments, the abstract type of the underlying collection and this proxy instance. :param proxy_factory: Optional. The type of collection to emulate is determined by sniffing the target collection. If your collection type can't be determined by duck typing or you'd like to use a different collection implementation, you may supply a factory function to produce those collections. Only applicable to non-scalar relationships. :param proxy_bulk_set: Optional, use with proxy_factory. rCrDrErFrGrHrIattribute_options)AssociationProxyr*)target_collectionattrrCrDrErFrGrHrIrJrKrLrMrNrOrPs P/opt/hc_python/lib64/python3.12/site-packages/sqlalchemy/ext/associationproxy.pyassociation_proxyrXTsDr  %#% 5";+ $'7D   ceZdZdZy)AssociationProxyExtensionTypeASSOCIATION_PROXYN)__name__ __module__ __qualname__r\rYrWr[r[s +rYr[ceZdZddZy)_GetterProtocolcyNr`)selfinstances rW__call__z_GetterProtocol.__call__ srYN)rfrreturnr<r]r^r_rgr`rYrWrbrbs3rYrbc eZdZy)_SetterProtocolNr]r^r_r`rYrWrkrk rYrkceZdZddZy)_PlainSetterProtocolcyrdr`)rerfvalues rWrgz_PlainSetterProtocol.__call__scrYN)rfrrqr>rhNonerir`rYrWrorosArYroceZdZddZy)_DictSetterProtocolcyrdr`)rerfkeyrqs rWrgz_DictSetterProtocol.__call__srYN)rfrrvrrqr>rhrrrir`rYrWrtrtsKrYrtc eZdZy)_CreatorProtocolNrlr`rYrWrxrxrmrYrxceZdZddZy)_PlainCreatorProtocolcyrdr`rerqs rWrgz_PlainCreatorProtocol.__call__scrYN)rqr>rhrrir`rYrWrzrzs1rYrzceZdZddZy)_KeyCreatorProtocolcyrdr`rervrqs rWrgz_KeyCreatorProtocol.__call__!s#rYN)rvrrqzOptional[_T_con]rhrrir`rYrWr~r~ sErYr~ceZdZ ddZy)_LazyCollectionProtocolcyrdr`res rWrgz _LazyCollectionProtocol.__call__%s rYNrhzCUnion[MutableSet[_T], MutableMapping[Any, _T], MutableSequence[_T]]rir`rYrWrr$s   rYrc eZdZ ddZy)_GetSetFactoryProtocolcyrdr`)recollection_classassoc_instances rWrgz_GetSetFactoryProtocol.__call__-s8;rYN)rOptional[Type[Any]]rAssociationProxyInstance[Any]rh,Tuple[_GetterProtocol[Any], _SetterProtocol]rir`rYrWrr,s#;-;6; 6 ;rYrc(eZdZ ddZy)_ProxyFactoryProtocolcyrdr`)relazy_collectionrC value_attrparents rWrgz_ProxyFactoryProtocol.__call__5s rYN) rz_LazyCollectionProtocol[Any]rCrxrstrrrrhrrir`rYrWrr4s75"  .  rYrc eZdZ ddZy)_ProxyBulkSetProtocolcyrdr`)reproxy collections rWrgz_ProxyBulkSetProtocol.__call__?srYN)r_AssociationCollection[Any]r Iterable[Any]rhrrrir`rYrWrr>s0>K rYrceZdZUdZded<ded<ded<ded<ded <ded <d ed <d ed<ded<ej ddZ d ddZ ddZ y)_AssociationProxyProtocolzpdescribes the interface of :class:`.AssociationProxy` without including descriptor methods in the interface.Optional[_CreatorProtocol]rCrrvrUrboolrHrI Optional[_GetSetFactoryProtocol]rDOptional[_ProxyFactoryProtocol]rEOptional[_ProxyBulkSetProtocol]rFcyrdr`rs rWrGz_AssociationProxyProtocol.infoRs!$rYNcyrdr`reclass_objs rW for_classz#_AssociationProxyProtocol.for_classUs'*rYcyrdr`)rers rW_default_getsetz)_AssociationProxyProtocol._default_getsetYs7:rYrhr9rdr Type[Any]rzOptional[object]rhAssociationProxyInstance[_T]rrrhr) r]r^r___doc____annotations__r$ro_memoized_propertyrGrrr`rYrWrrDs>(' HO  ##442233 $$:>++&6+ %+; #; 5;rYrc *eZdZdZdZej Zddddddddd ddZe ddZ e ddZ e dd Z dd Z dd Z dd Z d dd Z ddZddZ ddZddZy)rTzDA descriptor that presents a read/write view of an object attribute.TNFrRch||_||_||_||_||_||_|r| rt jd||_| |_ dt|jd|dt||_ |r||_| r| tk7rd|_| |_yd|_t|_y)a(Construct a new :class:`.AssociationProxy`. The :class:`.AssociationProxy` object is typically constructed using the :func:`.association_proxy` constructor function. See the description of :func:`.association_proxy` for a description of all parameters. z[The cascade_scalar_deletes and create_on_none_assignment parameters are mutually exclusive._TFN)rUrrCrDrErFr! ArgumentErrorrHrItyper]idrvrGr,_has_dataclass_arguments_attribute_options) rerUrVrCrDrErFrGrHrIrSs rW__init__zAssociationProxy.__init__is."3 ,*, !&?##5 '=#)B& J    tH  DI !%??,0D )&7D #,1D )&@D #rYcyrdr`rerfowners rW__get__zAssociationProxy.__get__rYcyrdr`rs rWrzAssociationProxy.__get__s(+rYcyrdr`rs rWrzAssociationProxy.__get__s;>rYc`||S|j||}|r|j|S|J|Srd) _as_instanceget)rerfrinsts rWrzAssociationProxy.__get__sC =K  1 88H% % rYc^t|}|j||j||yrd)rrset)rerfvaluesrs rW__set__zAssociationProxy.__set__s(h &(+//&ArYc\t|}|j||j|yrd)rrdelete)rerfrs rW __delete__zAssociationProxy.__delete__s&h &(+228.getter(0(<78$ F$ FrYc t||yrdrrfkrqrVs rW dict_setterz5AssociationProxy._default_getset..dict_setter$.rYc t||yrdrovrVs rW plain_setterz6AssociationProxy._default_getset..plain_setter$4#rY)rfrrh Optional[Any])rfrrrrqrrhrr)rrrrrhrrroperator attrgetterdictrerrrrrrVs @@rWrz AssociationProxy._default_getsetsR%%d+ G t # /;& & $<' 'rYc<d|jd|jdS)NzAssociationProxy(z, ))rUrrs rW__repr__zAssociationProxy.__repr__)s  " " OO  rY)rUrrVrrCrrDrrErrFrrGOptional[_InfoType]rHrrIrrSzOptional[_AttributeOptions])rf Literal[None]rrrhr2)rfrrrrhr)rfobjectrrrhr:)rfrrrrhz=Union[AssociationProxyInstance[_T], _T, AssociationProxy[_T]])rfrrr:rhrr)rfrrhrrrdr)rrrrrhr)rrrhrrrhr)r]r^r_r is_attributer[r\extension_typerrrrrrrrrrr`rYrWrTrT^s OL2DDN/3;?9=:>$(',*/9=6A6A6A , 6A 9 6A76A86A"6A!%6A$(6A76Ap%.; +%+.1+ %++>>  '*  F B= :>#.#.&6#. %#.J # %6 4( #( 5(. rYrT_SelfrceZdZUdZded<ded< d*dZded< e d+d Ze d,d Zd-d Z e d.d Z d/d Z e d0dZ ej d1dZe d2dZe d3dZe d4dZejd5dZejd5dZe d5dZded<ded<d6dZ d7dZej2d8dZed9dZed:dZ d;dZdd"Z d?d#Z d@d$Z! dA dBd&Z" dA dBd'Z# dA dBd(Z$dCd)Z%y%)DraA per-class object that serves class- and object-specific results. This is used by :class:`.AssociationProxy` when it is invoked in terms of a specific class or instance of a class, i.e. when it is used as a regular Python descriptor. When referring to the :class:`.AssociationProxy` as a normal Python descriptor, the :class:`.AssociationProxyInstance` is the object that actually serves the information. Under normal circumstances, its presence is transparent:: >>> User.keywords.scalar False In the special case that the :class:`.AssociationProxy` object is being accessed directly, in order to get an explicit handle to the :class:`.AssociationProxyInstance`, use the :meth:`.AssociationProxy.for_class` method:: proxy_state = inspect(User).all_orm_descriptors["keywords"].for_class(User) # view if proxy object is scalar or not >>> proxy_state.scalar False .. versionadded:: 1.3 rr_AssociationProxyProtocol[_T]rr target_classc||_|j|_||_|j|_d|_||_||_yrd)rrv owning_classrUrrr)rerrrrs rWrz!AssociationProxyInstance.__init__WsC ::(!'!9!9 $($rYc <|j}|j}tdtj|j |}t |tjs tdd|jj} td|j||}|j|||||S#t$rt||||cYSt$rE} t!j"d|j$d|jd|j$d| | d} ~ wwxYw)Nzorm.RelationshipProperty[_T]zEassociation proxy to a non-relationship intermediary is not supportedrzRAssociation proxy received an unexpected error when trying to retreive attribute ".z" from class "z": )rUrrr# class_mapper get_property isinstanceRelationshipPropertyNotImplementedErrorrr_cls_unwrap_target_assoc_proxy_construct_for_assocAttributeError!AmbiguousAssociationProxyInstance Exceptionr!InvalidRequestErrorr]) clsrrparent_instancerUrpropr target_assocerrs rWrz"AssociationProxyInstance.for_proxyosD#44&&  *   \ * 7 78I J  $ 8 89%0  {{))  .22<LL&++flL*  5 lJ  )) ))*!F,=,=+>?&//0C5:    sB55DDADDc|t||||St||}t|dst||||S|j}|rt||||St ||||S)N_is_internal_proxy)ObjectAssociationProxyInstancegetattrhasattrr_impl_uses_objectsColumnAssociationProxyInstance)rrrrrrrV is_objects rWrz-AssociationProxyInstance._construct_for_assocs  #1 lJ |Z0t124 lJ ++ 1 lJ 2 lJ rYcrtj|jj|jSrd)r#rrr rUrs rW _get_propertyz&AssociationProxyInstance._get_propertys/ 1 12??  " "  rYcVt|j|jjSrd)rrrU comparatorrs rW _comparatorz$AssociationProxyInstance._comparators%   t55 * rYctd)NzqThe association proxy can't be used as a plain column expression; it only works inside of a comparison expressionr rs rW__clause_element__z+AssociationProxyInstance.__clause_element__s! J  rYcdt||}t|trJt|tr|Syrd)rr rTr)rrrrVs rWr z7AssociationProxyInstance._cls_unwrap_target_assoc_proxys4|Z0d$4555 d4 5KrYcN|j|j|jSrd)r rrrs rW_unwrap_target_assoc_proxyz3AssociationProxyInstance._unwrap_target_assoc_proxys&22   t  rYcVtdt|j|jS)zThe 'remote' class attribute referenced by this :class:`.AssociationProxyInstance`. .. seealso:: :attr:`.AssociationProxyInstance.attr` :attr:`.AssociationProxyInstance.local_attr` SQLORMOperations[_T])rrrrrs rW remote_attrz$AssociationProxyInstance.remote_attrs' "GD,=,=t$O  rYcVtdt|j|jS)zThe 'local' class attribute referenced by this :class:`.AssociationProxyInstance`. .. seealso:: :attr:`.AssociationProxyInstance.attr` :attr:`.AssociationProxyInstance.remote_attr` SQLORMOperations[Any])rrrrUrs rW local_attrz#AssociationProxyInstance.local_attrs* # D%%t'='= >  rYc2|j|jfS)aReturn a tuple of ``(local_attr, remote_attr)``. This attribute was originally intended to facilitate using the :meth:`_query.Query.join` method to join across the two relationships at once, however this makes use of a deprecated calling style. To use :meth:`_sql.select.join` or :meth:`_orm.Query.join` with an association proxy, the current method is to make use of the :attr:`.AssociationProxyInstance.local_attr` and :attr:`.AssociationProxyInstance.remote_attr` attributes separately:: stmt = ( select(Parent) .join(Parent.proxied.local_attr) .join(Parent.proxied.remote_attr) ) A future release may seek to provide a more succinct join pattern for association proxy attributes. .. seealso:: :attr:`.AssociationProxyInstance.local_attr` :attr:`.AssociationProxyInstance.remote_attr` )r0r-rs rWrVzAssociationProxyInstance.attrs:!1!122rYc`|jj }|r|j|S)zsReturn ``True`` if this :class:`.AssociationProxyInstance` proxies a scalar relationship on the local side.)r!uselist_initialize_scalar_accessors)rescalars rWr5zAssociationProxyInstance.scalars/ '')111   - - / rYc~|jjj|jj Srd)r!rr rr3rs rW_value_is_scalarz)AssociationProxyInstance._value_is_scalar(s1""$ VLL1 W  rYctrdr&rs rW_target_is_objectz*AssociationProxyInstance._target_is_object0s !##rYz_GetterProtocol[_T] _scalar_get_PlainSetterProtocol[_T] _scalar_setc|jjr |jjd|\}}n|jjd\}}|td|c|_|_y)Nr;)rrDrrr:r<)rerset_s rWr4z5AssociationProxyInstance._initialize_scalar_accessors7s] ;; % % 224>IC 33D9IC-0$ &3 *$*rYc|jtjdfd }|tur dfd }||fSdfd }||fS)Nc||SdSrdr`rs rWrz8AssociationProxyInstance._default_getset..getterFrrYc t||yrdrrs rWrz=AssociationProxyInstance._default_getset..dict_setterKrrYc t||yrdrrs rWrz>AssociationProxyInstance._default_getset..plain_setterQrrY)rfrrhz Optional[_T])rfrrrrqr:rhrr)rrrr:rhrrrrs @@rWrz(AssociationProxyInstance._default_getset@sR%%d+ G t # /;& & $<' 'rYc.|jjSrd)rrGrs rWrGzAssociationProxyInstance.infoVs{{rYcyrdr`rers rWrzAssociationProxyInstance.getZs7:rYcyrdr`rEs rWrzAssociationProxyInstance.get]s#&rYc||S|jr't||j}|j|S t dt||j \}}}t ||k(rt ||k(r|jJ|S|jt||j\|_}t||j t |t ||f|S#t$rYfwxYw)NzTuple[int, int, _T]) r5rrUr:rrvrrr_new_lazy_collectionr)rertarget creator_idself_idrs rWrzAssociationProxyInstance.get`s ;K ;;S$"8"89F##F+ + !.2)73+A.* GU c7j(RX-@00<<< L+/99 d&<&<=, (D !5 CBsGRXu#= >L"  s$C$$ C0/C0c2|jrtd|jjr|jjn |j}t ||j }|7||jjsyt||j ||y|j|||/|jjrt||j dyyy|j|}|jJ||ur|j||yy)N_PlainCreatorProtocol[_T])r5rrrCrrrUrIrr<rHrr _bulk_replace)rerrrCrJrs rWrzAssociationProxyInstance.sets ;;+{{**KK''** GS$"8"89F~N KKAAT33WV_E  0>dkk&H&HC!7!7>'I>HHSME((4 44F"##D&1#rYc|j|j|d|jr.t||j}|t ||j t ||jyrd)rrr5rrUdelattrrrerrJs rWrzAssociationProxyInstance.deletes[    $   S$ ' ;;S$"8"89F!0T++,rYc `|jj|jjntd|j}t j |}|t jd||jjr*||jj|||j|fS|jjr |jj||\}}n|jj|\}}|tur|ttt|||||fS|tur|ttt!|||||fS|t"ur|ttt%|||||fSt j&d|j(d|j*d)NrxzDlazy collection factory did not return a valid collection type, got z=could not guess which interface to use for collection_class "z " backing "z6"; specify a proxy_factory and proxy_bulk_set manually)rrCrrr$duck_type_collectionr!rrErrDrlistr:_AssociationListr_AssociationDictr_AssociationSetrrrU)rerrCrrsetters rWrHzAssociationProxyInstance._news {{"". KK  ($*;*;<   44_5FG  #))..>-?A  ;; $ $  ))#Wdoot  ;; % %![[778H$ONFF![[889IJNFF t # $'&&$  % $'&&$  $ #'&&$ ##(($*@*@B rYc|jjr|jj||y|jturt d|j |y|jt urt d|j|y|jturt d|j|ytjd)Nz_AssociationList[Any]z_AssociationDict[Any, Any]z_AssociationSet[Any]zEno proxy_bulk_set supplied for custom collection_class implementation) rrFrrUrextendrupdaterr!r)rerrs rW_setzAssociationProxyInstance._sets ;; % % KK & &uf 5  " "d * (% 0 7 7 ?  " "d * -u 5 < ##2 rYc|jjxr|jjxstt|j}|jj r*|jj |j |\}}n(|jj|j \}}||_||_||_ yrd) rrCrrxrrDrrrrY)rerrCrrYs rW_inflatez!AssociationProxyInstance._inflates KK   $ ## 9$d&7&78  ;; % %![[77%%tNFF"[[889N9NONFF   rYNc |jdd}|j}|/|jdd|i|}|jj|S|jr>t |j |j}|jj|fi|}n2|rtjd|r|tjd|}|jj|S)Nis_has criterionzJCan't apply keyword arguments to column-targeted association proxy; use ==zINon-empty has() not allowed for column-targeted association proxy; use ==r`) popr*_criterion_existsr$r9rrrr#r!r)rerbkwargsrarinnerrV value_exprs rWrdz*AssociationProxyInstance._criterion_exists s Hd+66  #2L22#'-E##55e< <  ! !4,,doo>D:::9OOJ''0I1''@ #J11*==rYc |j9|jr-|jr |jrt j d|j d|dd|S)aProduce a proxied 'any' expression using EXISTS. This expression will be a composed product using the :meth:`.Relationship.Comparator.any` and/or :meth:`.Relationship.Comparator.has` operators of the underlying proxied attributes. z9'any()' not implemented for scalar attributes. Use has().Frbrar`r*r5r9r7r!rrdrerbres rWanyzAssociationProxyInstance.any+sg  * * 2 KK++t/D/D))K &t%%  17  rYc |j9|jr|jr!|jst j d|j d|dd|S)aProduce a proxied 'has' expression using EXISTS. This expression will be a composed product using the :meth:`.Relationship.Comparator.any` and/or :meth:`.Relationship.Comparator.has` operators of the underlying proxied attributes. z3'has()' not implemented for collections. Use any().Trir`rjrks rWhaszAssociationProxyInstance.hasCsg  * * 2 &&t/D/D))E &t%%  06  rYcN|jjd|jdS)N(r) __class__r]rrs rWrz!AssociationProxyInstance.__repr__[s>>22DKK@@rY)rrrrrrrr)rzAssociationProxy[_T]rrrrrhr) r&Optional[AssociationProxyInstance[_T]]rrrrrrrrrhr)rhzMapperProperty[Any])rhzPropComparator[Any]rhr)rrrrrhrr)rhrr)rhr,)rhr/)rhz2Tuple[SQLORMOperations[Any], SQLORMOperations[_T]]rhrrhrrrr)rerrrrhr)rrrhr:)rrrhz1Union[Optional[_T], AssociationProxyInstance[_T]])rrrr:rhrr)rrrhrr)rz_LazyCollectionProtocol[_T]rhzTuple[Type[Any], _T])rrrrrhrr)rrrhrrrd)rb)Optional[_ColumnExpressionArgument[bool]]rerrhColumnElement[bool]r)&r]r^r_rrr classmethodrrr!propertyr$r'r r$memoized_propertyr*r-r0rVr5r7r9r4rro_non_memoized_propertyrGrrrrrHr]r_rdrlrnrr`rYrWrr6s:*) )) %- %  % %  %,$, , , & ,,\<.      &8   ,/ /  /        33<    $$%$)) ( #( 5(, "" # :: && :>28-@:@ @D0:G "(@D><>>  >F@D <     4@D <     0ArYrceZdZdZdZd dZd fd ZddZddZ d ddZ d ddZ e jdd Z dd Z dd ZxZS)rzcan :class:`.AssociationProxyInstance` where we cannot determine the type of target object. Fc td|jjd|jd|jd|j d )NzAssociation proxy rz refers to an attribute 'z'' that is not directly mapped on class ze; therefore this operation cannot proceed since we don't know what type of object is referred towards)rrr]rUrrrs rW _ambiguousz,AmbiguousAssociationProxyInstance._ambiguousfs> !!**&&!!   rYc*||St||Srd)superr)rerrqs rWrz%AmbiguousAssociationProxyInstance.getts ;K7;s# #rYc$|jyrdr~rEs rW__eq__z(AmbiguousAssociationProxyInstance.__eq__z  rYc$|jyrdrrEs rW__ne__z(AmbiguousAssociationProxyInstance.__ne__}rrYc $|jyrdrrks rWrlz%AmbiguousAssociationProxyInstance.any rYc $|jyrdrrks rWrnz%AmbiguousAssociationProxyInstance.hasrrYciSrdr`rs rW _lookup_cachez/AmbiguousAssociationProxyInstance._lookup_caches  rYc6|lt||j}|T t|}|j}|j}||j vr|j || |j |S|S#t$rY|SwxYw#tj$rY|SwxYwrd) rrUr"rrr_populate_cacherr!r)rer actual_objrrinstance_classs rWrz?AmbiguousAssociationProxyInstance._non_canonical_get_for_objects  & $2H2HIJ% ":.D"[[F%+]]N%T-?-??,,^VD#11.AA  $ 00 s# B A11 A>=A>BBctj|jj|j}|j |j rj|} |j||j}|jtd||j|j||j|j|<yy#t$rYywxYw)Nr)r#rrr rUisarr rrrrrr)rerrrrrs rWrz1AmbiguousAssociationProxyInstance._populate_caches 1 12??  " "  ::dkk ")L #BB $//  6:5N5N7FKK%% OO 6"">2 # "  sB?? C  C rs)rrrhr)rrrhrrd)rbrvrerrhr)rhz-Dict[Type[Any], AssociationProxyInstance[_T]])rrrhr)rrrz Mapper[Any]rhrr)r]r^r_rrr~rrrrlrnr$rzrrr __classcell__)rqs@rWrr_sM  $  @D<  @D<    " %2!+6 rYrc<eZdZUdZdZded<dZd dZd dZd dZ y) rzEan :class:`.AssociationProxyInstance` that has an object as a target.Trr9c 6|j}|?|jj|js|j |S||k(S|j r`|jrT|j sH|jjt|j|jj |S|j r-|jr!|j rtjd|jjdi|j|iS)aIProduce a proxied 'contains' expression using EXISTS. This expression will be a composed product using the :meth:`.Relationship.Comparator.any`, :meth:`.Relationship.Comparator.has`, and/or :meth:`.Relationship.Comparator.contains` operators of the underlying proxied attributes. z'=>  D(  (4##''A4??C*@A ArYcz|jjt|j|j|k7Srd)r$rnrrrrEs rWrz%ObjectAssociationProxyInstance.__ne__s6## D%%t 73 >  rYN)rrrrrhrw)rrrhrw) r]r^r_rr9rrrrrr`rYrWrrs&O"t"M D B rYrcDeZdZUdZdZded<dZd dZ d dZy) rzVan :class:`.AssociationProxyInstance` that has a database column as a target. Frr9Tc|j|jjtj|}|t ||j dk(S|Srd)rdr-operater-eqr.r$)rerexprs rWrz%ColumnAssociationProxyInstance.__eq__ sP%%    $ $Y\\5 9  =tT--56 6KrYc`|j|jj|g|i|Srd)rdr-r)reoprres rWrz&ColumnAssociationProxyInstance.operates7%% $D   $ $R :% :6 :  rYN)rrrhrw)rzoperators.OperatorTyperrrerrhzColumnElement[Any]) r]r^r_rr9rrrrr`rYrWrrsC$t#M ( 25 AD  rYrc0eZdZddZ ddZddZd dZy) rIc ||_||_yrdrrJrRs rWrz_lazy_collection.__init__s  rYcBt|j|jSrd)rrrJrs rWrgz_lazy_collection.__call__!st{{DKK00rYc4|j|jdS)N)rrJrrs rW __getstate__z_lazy_collection.__getstate__&s{{dkk::rYc,|d|_|d|_y)NrrJrrestates rW __setstate__z_lazy_collection.__setstate__)sEl Ho rYN)rrrJrrrhrrrrhrr)r]r^r_rrgrrr`rYrWrIrIs1 L1 ;&rYrI_ITrceZdZUded< ded< ded<ded< d ed < dd Zej rd ed <n edZddZ ddZ ddZ ddZ ddZ y)_AssociationCollection_GetterProtocol[_IT]rrxrCAssociationProxyInstance[_IT]rrkrY_LazyCollectionProtocol[_IT]rcJ||_||_||_||_||_y)zConstructs an _AssociationCollection. This will always be a subclass of either _AssociationList, _AssociationSet, or _AssociationDict. N)rrCrrYr)rerrCrrYrs rWrz_AssociationCollection.__init__Os( /    rYzCollection[_IT]colc"|jSrd)rrs rWz_AssociationCollection.fs D$8$8$:rYc,t|jSrdlenrrs rW__len__z_AssociationCollection.__len__h488}rYc,t|jSrd)rrrs rW__bool__z_AssociationCollection.__bool__ksDHH~rYc4|j|jdS)Nrrrrs rWrz#_AssociationCollection.__getstate__ns++$:N:NOOrYcb|d|_|d|_|jj|y)Nrr)rrr_rs rWrz#_AssociationCollection.__setstate__qs-Ho $%67 T"rYctrdr&rs rWclearz_AssociationCollection.clearvs !##rYN) rrrCrxrrrYrkrrrhintrtrrru)r]r^r_rrtyping TYPE_CHECKINGryrrrrrrr`rYrWrr8s  F  *) 21F5"%    . ( :;P# $rYrcFeZdZUded<ded<d dZd dZ d dZy) _AssociationSingleItemr;rYrNrCc$|j|SrdrCr|s rW_createz_AssociationSingleItem._create~s||E""rYc$|j|Srdrreobject_s rW_getz_AssociationSingleItem._get{{7##rYcH|j|j||yrd)rr])re assoc_proxyrs rWrOz$_AssociationSingleItem._bulk_replaces v&rYN)rqr:rhr)rrrhr:)rrrz Iterable[_IT]rhrr)r]r^r_rrrrOr`rYrWrrzs5 $$ &&#$'8'BO' 'rYrceZdZUdZded<d+dZed,dZed-dZ d.dZed/dZed0d Z d1d Zed2d Z ed3d Z d4d Z d5dZ d6dZ d7dZ d8dZ d9dZd/dZd:d,dZd7dZd;dZd;dZddZd>dZd>dZd>dZd?dZd?d Zd@d!Zd@d"ZdAd#ZdBd$Z e!jDr dC dDd%Z#nd8d&Z#dEd'Z$dFd(Z%d;d)Z&e!jDsne'e(jSD]M\Z*Z+e,e+se+je*k(se+jr,e-e'e*s6e.e'e*je+_O[*[+y*y*)GrVz(Generic, converting, list-to-list proxy.MutableSequence[_T]rc(|j||yrdrY)rerrqs rWr]z_AssociationList._sets GU#rYcyrdr`reindexs rW __getitem__z_AssociationList.__getitem__-0rYcyrdr`rs rWrz_AssociationList.__getitem__s@CrYct|ts|j|j|S|j|Dcgc]}|j|c}Scc}wrd)r slicerr)rermembers rWrz_AssociationList.__getitem__sN%'99TXXe_- -48HHUODO&DIIf%OD DDsAcyrdr`rerrqs rW __setitem__z_AssociationList.__setitem__s:=rYcyrdr`rs rWrz_AssociationList.__setitem__sFIrYct|ts*|j|j|t d|y|j t |}n4|j dkrt ||j z}n |j }|jxsd}|jxsd}tt|jxsd||}t|}|dk(r+|D]}||=|}|D]} |j|| |dz }yt |t |k7r#tdt |dt |t||D]$\}} |j|j|| &y)Nr:rz#attempt to assign sequence of size z to extended slice of size )r rr]rrstoprstepstartrUrangeinsert ValueErrorzip) rerrqrrrrng sized_valueiitems rWrz_AssociationList.__setitem__sC%' IIdhhuotD%'8 9zz!4ya4y5::-zz::?DKK$1EuU[[-AtT:;Cu+KqyAU 'DKK4(FA({#s3x/${+SX7 #3GAtIIdhhqk40 /rYcyrdr`rs rW __delitem__z_AssociationList.__delitem__s/2rYcyrdr`rs rWrz_AssociationList.__delitem__s14rYc|j|=yrdrrs rWrz_AssociationList.__delitem__s HHUOrYcR|jD]}|j||k(syyNTFrr)rerqrs rW __contains__z_AssociationList.__contains__s)hhFyy E)rYc#TK|jD]}|j|yw)zIterate over proxied values. For the actual domain objects, iterate over .col instead or just use the underlying collection directly from its property on the parent. Nrrers rW__iter__z_AssociationList.__iter__s(hhF))F# #&(c`|j}|j|}|j|yrd)rrappend)rerqrrs rWrz_AssociationList.appends%hh||E" 4rYc.d}|D] }||k(s |dz }|SNrrr`)rerqcountrs rWrz_AssociationList.counts(AEz  rYc4|D]}|j|yrd)r)rerrs rWr[z_AssociationList.extendsA KKNrYcB|j|g|j||yrd)rrrs rWrz_AssociationList.inserts!%e!4 5urYcV|j|jj|Srd)rrrcrs rWrcz_AssociationList.pops{{488<<.//rYcft|D]\}}||k(s |j|=ytd)Nzvalue not in list) enumeraterr)rerqrvals rWremovez_AssociationList.removes7oFAse|HHQK&,--rYct)z#Not supported, use reversed(mylist)r&rs rWreversez_AssociationList.reverse "##rYct)z!Not supported, use sorted(mylist)r&rs rWsortz_AssociationList.sort rrYcH|jdt|j=y)Nr)rrrs rWrz_AssociationList.clears HHQTXX& 'rYct||k(SrdrUrers rWrz_AssociationList.__eq__DzU""rYct||k7Srdrrs rWrz_AssociationList.__ne__rrYct||kSrdrrs rW__lt__z_AssociationList.__lt__DzE!!rYct||kSrdrrs rW__le__z_AssociationList.__le__rrYct||kDSrdrrs rW__gt__z_AssociationList.__gt__rrYct||k\Srdrrs rW__ge__z_AssociationList.__ge__ rrYc` t|}t||zS#t$r tcYSwxYwrdrU TypeErrorNotImplementedrs rW__add__z_AssociationList.__add__#s8 "KEDzE!! "! ! " --c` t|}|t|zS#t$r tcYSwxYwrdr!rs rW__radd__z_AssociationList.__radd__*s8 "KEtDz!! "! ! "r%cJt|tstSt||zSrdr rr#rUrens rW__mul__z_AssociationList.__mul__1s !S!! !DzA~rYcJt|tstS|t|zSrdr)r*s rW__rmul__z_AssociationList.__rmul__6s !S!! !4:~rYc(|j||Srd)r[)reiterables rW__iadd__z_AssociationList.__iadd__;s H rYct|ts t|dk(r|j|S|dkDr |j t ||dz z|Sr)r rr rr[rUr*s rW__imul__z_AssociationList.__imul__?sU !S!%' ' 6 JJL U KKT a!e, - rYcyrdr`)rerqrrs rWrz_AssociationList.indexNsrYc>t|}|j|g|Srd)rUr)rerqarglss rWrz_AssociationList.indexTs!dB288E(C( (rYct|Srdrrs rWcopyz_AssociationList.copyXs DzrYc*tt|Srd)rKrUrs rWrz_AssociationList.__repr__[DJrYcDtdt|jzNz%s objects are unhashabler"rr]rs rW__hash__z_AssociationList.__hash__^3d4j6I6IIJJrYN)rrrqr:rhrr)rrrhr:)rrrhr)rUnion[int, slice]rhzUnion[_T, MutableSequence[_T]])rrrqr:rhrr)rrrq Iterable[_T]rhrr)rrArqzUnion[_T, Iterable[_T]]rhrr)rrrhrr)rrrhrr)rzUnion[slice, int]rhrr)rqrrhrrhz Iterator[_T])rqr:rhrr)rqrrhr)rrBrhrr)rsrurrrhr)rList[_T]rhr)rrFrhrF)r+r3rhrF)r0rBrhr2)r+r3rhr2)..)rqrrrrrrhr)rhrFr)/r]r^r_rrr]rrrrrrrrr[rrcr r rrrrrrrrr$r'r,r.r1r3rrrr9rr?rUlocalsitems func_namefunccallablerrr`rYrWrVrVs2 $00 CCE&E 'E== II"1&"1/F"1 "1H22 44  60.$ $ (##"#"#""   =@  %( 69     ) K   #FHNN$45OItMMY. D),&tY7??  6 t rYrVceZdZUdZded<ded<ded<d'dZd(d Zd)d Zd*d Zd+d Z d,d Z d-dZ d.dZ d/dZ d0dZd0dZd1dZed2dZed3dZ d4 d5dZd4d6dZd7dZd8dZd9dZed:dZe d; d3dZdd Ze d?d!Zed@d"ZdAd#Z dBd$ZdCd%ZdDd&Zej<snee j+D]M\Z!Z"e#e"se"je!k(se"jr,e$e%e!s6e&e%e!je"_O[!["yy)ErWz(Generic, converting, dict-to-dict proxy.z_DictSetterProtocol[_VT]rYz_KeyCreatorProtocol[_VT]rCz"MutableMapping[_KT, Optional[_VT]]rc&|j||Srdrrs rWrz_AssociationDict._createts||C''rYc$|j|Srdrrs rWrz_AssociationDict._getwrrYc(|j|||Srdr)rerrvrqs rWr]z_AssociationDict._setzs{{7C//rYc>|j|j|Srd)rrrervs rWrz_AssociationDict.__getitem__}syy#''rYc||jvr!|j|j|||y|j|||j|<yrd)rr]rrs rWrz_AssociationDict.__setitem__s= $((? IIdhhsmS% 0 LLe4DHHSMrYc|j|=yrdrrQs rWrz_AssociationDict.__delitem__s HHSMrYc||jvSrdrrQs rWrz_AssociationDict.__contains__sdhhrYcHt|jjSrd)iterrkeysrs rWrz_AssociationDict.__iter__sDHHMMO$$rYc8|jjyrdrrrs rWrz_AssociationDict.clear rYct||k(Srdrrs rWrz_AssociationDict.__eq__rrYct||k7Srdr\rs rWrz_AssociationDict.__ne__rrYc*tt|Srd)rKrrs rWrz_AssociationDict.__repr__r;rYcyrdr`re_AssociationDict__keys rWrz_AssociationDict.gets03rYcyrdr`rerarLs rWrz_AssociationDict.getsJMrYNc0 ||S#t$r|cYSwxYwrd)rrervrLs rWrz_AssociationDict.gets% 9  N s  cj||jvr!|j|||j|<|S||Srd)rrres rW setdefaultz_AssociationDict.setdefaults7 dhh  LLg6DHHSMN9 rYc6|jjSrd)rrWrs rWrWz_AssociationDict.keyssxx}}rYct|Srdr rs rWrHz_AssociationDict.itemss rYct|Srdrrs rWrz_AssociationDict.valuess $rYcyrdr`r`s rWrcz_AssociationDict.pops&)rYcyrdr`rcs rWrcz_AssociationDict.popsrYcd|jj|g|i|}|j|Srd)rrcr)rerar6rrs rWrcz_AssociationDict.pops/e0c0R0yy  rYch|jj}|d|j|dfSr)rpopitemr)rers rWroz_AssociationDict.popitems0xx!Q47+,,rYc yrdr`re_AssociationDict__mres rWr\z_AssociationDict.updaterrYc yrdr`rqs rWr\z_AssociationDict.updaterrYc yrdr`)reres rWr\z_AssociationDict.updaterrYcfi}|j|i||jD] \}}|||< yrd)r\rH)rearuprvrqs rWr\z_AssociationDict.updates7 1((*JCDI%rYct|}|j|xsd}t|xsdj|}|j|}|jxsdD]\}}||vr|||<||vs|||<|D]}||=yr)r intersection differencerH) rerrexisting constants additionsremovalsrvrs rWrOz_AssociationDict._bulk_replaces t9))&,B7  "%00; &&y1!<<>/R/KCi"S  !"S 0 CS rYc4t|jSrd)rrHrs rWr9z_AssociationDict.copysDJJL!!rYcDtdt|jzr=r>rs rWr?z_AssociationDict.__hash__r@rY)rvrArq Optional[_VT]rhr)rrrhrB)rrrvrArqrBrhrr)rvrArhrB)rvrArqrBrhrr)rvrArhrr)rvrrhr)rhz Iterator[_KT]rurEr)rarArhr)rarArLUnion[_VT, _T]rhrrd)rvrArLzOptional[Union[_VT, _T]]rhzUnion[_VT, _T, None])rvrArLrrhrB)rhz KeysView[_KT])rhzItemsView[_KT, _VT])rhzValuesView[_VT])rarArhrB).)rarAr6rrrrhr)rhzTuple[_KT, _VT])rrz SupportsKeysAndGetItem[_KT, _VT]rerBrhrr)rrzIterable[tuple[_KT, _VT]]rerBrhrr)rerBrhrr)rvrrrrhrr)rrrzMapping[_KT, _VT]rhrr)rhzDict[_KT, _VT]rs)'r]r^r_rrrrr]rrrrrrrrrrrrgrWrHrrcror\rOr9r?rrrUrGrIrJrKrrrr`rYrWrWrWms2 $$ %% ++($0(5 %## 33 MM=A!9   )) 47#1 !-3?B ,8; 002"  &"K   #FHNN$45OItMMY. D),&tY7??  6 t rYrWcHeZdZUdZded<d+dZd,dZd-dZd.dZd/dZ d/d Z d/d Z d0d Z d1d Z d2d Z d3dZd4dZd5dZd6dZd7dZd8dZd9dZd:dZd7dZd8dZd9dZd:dZd;dZddZd>dZ d?d Z!d@d!Z"dAd"Z#dAd#Z$dBd$Z%dBd%Z&dBd&Z'dBd'Z(dCd(Z)dDd)Z*e+jXsne-e.j_D]M\Z0Z1e2e1se1je0k(se1jr,e3e4e0s6e5e4e0je1_O[0[1y*y*)ErXz&Generic, converting, set-to-set proxy.MutableSet[_T]rc,t|jSrdrrs rWrz_AssociationSet.__len__ rrYc|jryyrrrs rWrz_AssociationSet.__bool__s 88rYcR|jD]}|j||k(syyrr)re_AssociationSet__ors rWrz_AssociationSet.__contains__s)hhFyy C'rYc#TK|jD]}|j|yw)zIterate over proxied values. For the actual domain objects, iterate over .col instead or just use the underlying collection directly from its property on the parent. Nrrs rWrz_AssociationSet.__iter__s(hhF))F# #rcb||vr+|jj|j|yyrd)raddr)re_AssociationSet__elements rWrz_AssociationSet.add&s( D HHLLi0 1 !rYc|jD]3}|j||k(s|jj|yyrd)rrdiscardrerrs rWrz_AssociationSet.discard,s6hhFyy I-  (rYc|jD]3}|j||k(s|jj|yt|rd)rrrrrs rWr z_AssociationSet.remove2sChhFyy I-  (y!!rYc|js td|jj}|j|S)Nzpop from an empty set)rrrcrrs rWrcz_AssociationSet.pop9s3xx23 3yy  rYcB|D]}|D]}|j|yrd)r)resr0rqs rWr\z_AssociationSet.update?s!H!"rYc:t|}|j|xsd}t|xsdj|}|j|}|j}|j}|xsdD]} | |vr || | |vs|| |D] } ||  yr)rryrzrr ) rerrr{r|r}r~appenderremoverrs rWrOz_AssociationSet._bulk_replaceDst9))&,B7  "%00; &&y188++llF" 9$ # F FOrYcvtj||s t|D]}|j||Srd)r%_set_binops_check_strictr r)rerrqs rW__ior__z_AssociationSet.__ior__Vs733D%@%' 'E HHUO rYc*tt|Srd)rrVrs rWr]z_AssociationSet._set_s4:rYc2t|j|Srd)runionrers rWrz_AssociationSet.unionbss4y""rYc$|j|Srd)rre_AssociationSet__ss rW__or__z_AssociationSet.__or__eszz#rYc2t|j|Srd)rrzrs rWrzz_AssociationSet.differencehs#s4y##Q''rYc$|j|Srd)rzrs rW__sub__z_AssociationSet.__sub__ksq!!rYcB|D]}|D]}|j|yrd)r)rerrrqs rWdifference_updatez!_AssociationSet.difference_updatens"E U#rYcvtj||s t|D]}|j||Srd)r%rr r)rerrqs rW__isub__z_AssociationSet.__isub__ss633D!<%' 'E LL  rYc2t|j|Srd)rryrs rWryz_AssociationSet.intersectionzs%s4y%%q))rYc$|j|Srd)ryrs rW__and__z_AssociationSet.__and__}s  ##rYc|D]X}|j|t|}}||z ||z }}|D]}|j||D]}|j|Zyrd)ryrr r)rerrwanthaver rrqs rWintersection_updatez#_AssociationSet.intersection_updates`E**513t9$D+td{CF E" rYctj||s t|j|}t |}||z ||z }}|D]}|j ||D]}|j ||Srd)r%rr ryrr r)rerrrr rrqs rW__iand__z_AssociationSet.__iand__su33D!<%' '  #D Tk4$;E KK E HHUO rYc6t|j|Srd)rsymmetric_differencers rWrz$_AssociationSet.symmetric_differences4y--c22rYc$|j|Srd)rrs rW__xor__z_AssociationSet.__xor__s((++rYc|j|t|}}||z ||z }}|D]}|j||D]}|j|yrd)rrr r)rerrrr rrqs rWsymmetric_difference_updatez+_AssociationSet.symmetric_difference_updatesV..u5s4ydTk4$;E KK E HHUOrYchtj||s t|j||Srd)r%rr rrs rW__ixor__z_AssociationSet.__ixor__s.33D%@%' ' ((/ rYc6t|j|Srd)rissubsetrs rWrz_AssociationSet.issubsets4y!!#&&rYc6t|j|Srd)r issupersetrs rWrz_AssociationSet.issupersets4y##C((rYc8|jjyrdrYrs rWrz_AssociationSet.clearrZrYct|Srdrrs rWr9z_AssociationSet.copys 4yrYct||k(Srdrrs rWrz_AssociationSet.__eq__4yE!!rYct||k7Srdrrs rWrz_AssociationSet.__ne__rrYct||kSrdrrs rWrz_AssociationSet.__lt__4y5  rYct||kSrdrrs rWrz_AssociationSet.__le__rrYct||kDSrdrrs rWrz_AssociationSet.__gt__rrYct||k\Srdrrs rWrz_AssociationSet.__ge__rrYc*tt|Srd)rKrrs rWrz_AssociationSet.__repr__sCIrYcDtdt|jzr=r>rs rWr?z_AssociationSet.__hash__r@rYNrrt)rrrhrrC)rr:rhrr)rhr:)rrBrhrr)rrrrBrhrr)rAbstractSet[_S]rhMutableSet[Union[_T, _S]])rhzSet[_T])rz Iterable[_S]rhr)rrrhr)rrrhr)rAbstractSet[Any]rhr)rrrhrr)rrrhr2)rrBrhr)rrrhr)rrrhrr)rrrhrru)rhzAbstractSet[_T]rE)rrrhrrrs)6r]r^r_rrrrrrrrr rcr\rOrr]rrrzrrrryrrrrrrrrrrr9rrrrrrrr?rrrUrGrHrIrJrKrrrr`rYrWrXrXsE0   2  "!  $$ "#("$ *$   3,')""!"!"K   #FHNN$45OItMMY. C+&sI6>>  6 t rYrX)"rUrrVrrCrrDrrErrFrrGrrHrrIrrJUnion[_NoArg, bool]rKrrLrrMzUnion[_NoArg, Callable[[], _T]]rNrrOrrPzUnion[_NoArg, bool, None]rhzAssociationProxy[Any])dr __future__rrrrrrrrr r r r rrrrrrrrrrrrrrrrr r!r"r#r$r%r&r'r(orm.baser)orm.interfacesr*r+r,sqlr-r.sql.baser/ util.typingr0r1r2r3r4rr5r6 orm.mapperr7 sql._typingr8r9r:r<r>r@rArBNO_ARGrXr[rbrkrortrxrzr~rrrrrInspectionAttrInforTrrrrrrIrrrrVrWrXr`rYrWrs# !"-'.07!"'0 //#7' Tsd3 D 9 T e3 e3+/7;596: $#(&+ & & #]]7=}}#)==#)==&,mm#ff f( f 5 f 3 f4f f!f $f f ff5f!f !!f" $#f$%fR$?4huo4 %h$B?HV,<BL/8F+;L &x%2,hv.>2F*HV,<F hrl ;X;HH ; ;4O !!"b! O j >?fA/3fARe(@(DeP8 %=b%A8 v %=b%A 4&.r2&$e5!?$WS\?$D'3B7'"_-b1?23F_DW-c2N384LWtV,R0*R.VrY