
    oi~                    :   d dl Z d dlZd dlZd dlZd dlmZmZ d dlZd dlm	Z	 d dl
mZ d dlmZ d dlZd dlZd dlZd dlmZmZmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZ d dl d dlm Z  d dl!Z!d dl"Z"d dlZ#d dl$Z$d dl%m&Z& d dl'Z'd dl(Z(d dl)Z)d dl*Z*d dl+m,Z, d dl-m.Z. d dl/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6Z6d dl7Z7d dl8Z8d dl9Z9d dlm Z  d dl:m;Z; d dl<m=Z= d dl>m?Z? d dl@mAZA d dlBmCZC d dlBmDZD d dlBmCZC d dlBmDZD e2e1e3eE      e1eE   e1e   f   ZFdZG G d d      ZH G d d      ZI G d d      ZJ G d d       ZKd! ZLd" ZMdd$ZNd% ZOdd&ZPdd'ZQd( ZRd) ZSd* ZTd+ ZUd#d,d-ZVd. ZWdd/ZXd0 ZYdd1ZZ	 	 	 	 	 dd4e[d5e[d6e[d7e\d8e]d9e]d:e[fd;Z^dd<e[fd=Z_dd<e[d>e0e[   d?e0e[   d:e[fd@Z`d<e[d:e[fdAZadB ZbdC ZcdD ZddE ZedF Zf G dG dH      ZgddIZhdJ ZidK ZjdL ZkdM ZldN ZmddOZndP ZodQe[d:e[fdRZpdQe[d:e[fdSZqdTeFd:e[fdUZrddQe[d<e[dTe1eF   dVe[fdWZsdX ZtdddYZudZ Zvd[ Zwd\ Zxd] Zy G d^ d_      Zzd` Z{	 	 	 ddaZ|e5db        Z}dcdddedfdgdhdidjdkdldmdndoZ~ e7j                  dp      Z e7j                  dq      Zdr Zi dsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddœddǓddɓdd˓dd͓ddϓddѓddӓddՓddדi ddٓddۓddݓddߓddddddddddddddddddddddddddi ddddddd ddddddddd	d
dddddddddddddddddi ddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=i d>d?d@dAdBdAdCdDdEdFdGdHdIdHdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]i d^d_d`d_dadbdcdddedfdgdhdidjdkdldmdndodpdqdpdrdsdtdudvdwdxdydzd{d|d}i d~dddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddddddddddddi dddÐdēdŐdƓdǐdȓdɐdʓdːd̓d͐dΓdϐdГdѐdғdӐdԓdՐd֓dאdؓdِdړdېdܓdݐdޓdߐdddi dddddddddddddddddddddddddddddddd ddi ddddddd	d
ddddddddddddddddddddddd d!d"d#i d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEi dFdEdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfi dgdfdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddddddddddÓdĐdÓi dŐdÓdƐdǓdȐdɓdʐd˓d̐d͓dΐdϓdАdϓdѐdғdӐdԓdՐd֓dאdؓdِdړdېdܓdݐdޓdߐdddddi ddddddddddddddddddddddddddddddddd di ddddddddd	d
ddddddddddddddddddddddddi d dd!dd"d#d$d%d&d%d'd(d)d*d+d,d-d.d/d.d0d1d2d3d4d3d5d6d7d6d8d9d:d;i d<d=d>d=d?d@dAdBdCdDdEdFdGdFdHdIdJdIdKdLdMdLdNdOdPdQdRdSdTdUdVdWdXdYi dZd[d\d]d^d_d`dadbdcdddcdedfdgd2dhd2didjdkdldmdndodpdqdrdsdtdudvdwdvi dxdydzdyd{d|d}d|d~dddddddddddddddddddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddddddddÓdĐdÓdŐdƓi dǐdȓdɐdȓdʐdȓdːdȓd̐d͓dΐdϓdАdѓdҐdѓdӐdԓdՐdԓd֐dԓdאdؓdِdړdېdܓdݐdܓdސdܓdߐdܓi ddddddddddddddddddddddddddddddddddi dddddddddddd dd dd ddddddd	dd
dddddddddi ddddddddddddddddddddddd d!d"d!d#d!d$d%d&d%d'd(i d)d(d*d(d+d,d-d,d.d,d/d,d0d1d2d1d3d4d5d6d7d8d9d8d:d8d;d8d<d8d=d8d>d8i d?d@dAd@dBd@dCdDdEdDdFdGdHdGdIdGdJdGdKdGdLdMdNdMdOdMdPdMdQdRdSdTdUdTi dVdTdWdTdXdTdYdTdZd[d\d[d]d[d^d_d`d_dad_dbd_dcd_ddd_dedfdgdfdhdfdidji dkdjdldjdmdjdndodpdodqdodrdodsdtdudtdvdwdxdwdydwdzdwd{dwd|dwd}dwd~dwi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddddddddddddi dddddddddddddddddÐddĐddŐddƐdǓdȐdǓdɐdǓdʐdǓdːdǓd̐dǓi d͐dǓdΐdǓdϐdǓdАdǓdѐdǓdҐdӓdԐdӓdՐdӓd֐dӓdאdӓdؐdӓdِdӓdڐdӓdېdӓdܐdӓdݐdӓdސdӓdӐdӐdߐdߐdߐdߐdߐdߐdߐdߐdߐdߐdߐdߐdZi ddtdddddddddddddddddddddddddddddddd i ddddddddd	d
dddddddddddddddddddddd d!d"i d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDi dEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd3dZd[d\d]d^d_d`dadbdadcdai dddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddi ddddddddddddddddddddddddddddddddddi dddddddddddddddddddddddddddddddddÐdēi dŐdƓdǐddȐdɓdʐd˓d̐d͓dΐdϓdАdѓdҐdӓdԐdՓd֐dדdؐdٓdڐdۓdܐdݓdސdߓddddddi dddddddddddddddddddddddddddddd ddddi dd
ddddd	d
dddddddddddddd#ddddddddddd d!i d"d#d$d%d&d'd(d)d*d+d,d9d-d.d/d0d1dJd2d3d4d5d6d7d8dPd9dRd:d;d<d;d=d>i d?d>d@dTdAdBdCdDdEdFdGdFdHdIdJdKdLdMdNdMdOdPdQdRdSdTdUdVdWdkdXdYdZdqi d[d\d]dsd^d_d`d_dadbdcdudddedfdgdhdidjdkdldkdmdndoddpddqdrdsdtdudi dvdwdxddyddzdd{d|d}d~ddddddddddddddddddddddi ddddddddddddddddddddddddddddddddÓddi dd˓dddd͓ddddddddғddddؓdddddddddddddddÐdi dĐddŐddƐdǓdȐdɓdʐd˓d̐d͓dΐdϓdАdѓdҐddӐdԓdՐd֓dאd֓dؐdٓdڐdۓdܐddݐddސdߓi dddddddddddddddddddd
ddddddddddddddi dddddddddd,dd,d ddddd3dd9dddd=d	dDd
dddddddi dddddddddddddddddddd2d d2d!d"d#d"d$d"d%d&d'dld(dli d)d*d+d*d,drd-drd.d/d0dvd1d2d3dd4dd5dd6dd7dd8dd9dd:dd;d<d=di d>dd?dd@dAdBdAdCdDdEddFddGdHdIddJddKdLdMdLdNdOdPdOdQdRdSdRdTdRi dUdÓdVdWdXdYdZdYd[dYd\dƓd]d^d_d͓d`d͓dadϓdbdѓdcdѓdddѓdedؓdfdܓdgdܓdhdܓi diddjddkddldmdndmdodmdpdmdqdrdsdrdtdduddvddwddxddyddzdd{di d|dd}dd~dddddddddddddddddddddddddddddi dddddddddddddddddd!dddd%dd%dd%dd(dd(dd(dd,i dd1dd1dd1dd1dd4dd6dd6dd6dd8dd8dd@ddDddDddGddGddMddMi ddTddTdd[dd[dd[dd[dd[dd[dd_dd_dd_dd_ddfddjddoddoddoi dÐdtdĐdtdŐdtdƐdtdǐdwdȐdwdɐdwdʐdwdːdwd̐dd͐ddΐddϐddАddѐddҐddӐdi dԐddՐdd֐ddאddؐddِddڐddېddܐddݐddސddߐdddddddddddi ddddddddddddddddddddddddddddddddǓddǓi ddǓddǓddǓddǓddǓddǓddǓddǓddǓddӓd dӓddӓddӓddӓddӓddӓddӓi ddӓddߓd	dߓd
dߓddߓddߓddߓddddddddddddddddddddi dddddd3dd3dd3dd3dd3d d3d!d3d"d3d#d3d$d3d%d&d'd&d(d&d)d&d*d&i d+d&d,d&d-d&d.d&d/d&d0d&d1d&d2d&d3d&d4d&d5d&d6d&d7d8d9d8d:d8d;d8d<d8i d=d8d>d8d?d8d@d8dAd8dBd8dCd8dDd8dEd8dFd8dGd8dHd8dId8dJd8dKd8dLd8dMd8i dNd8dOd8dPd8dQdRdSdRdTdRdUdRdVdRdWdRdXdRdYdRdZdRd[dRd\dRd]dRd^dRd_dRi d`dRdadRdbdRdcdRdddRdedRdfdRdgdRdhdRdidRdjdRdkdRdldRdmdRdndRdodRdpdRi dqdRdrdRdsdRdtdRdudRdvd dwd dxd dyd dzd d{d d|d d}d d~d dd dd dd d d d d d d d d d d d d d dZd ZdZdZ e eee            Z e eee            Zd Zd ZddZddZddZdde[de[dedefdZddZde[d:e\fdZde[d:e	fdZddZddefdZdde[fdZddZy(      Nurlparseparse_qs)relativedelta)TracebackType)LockNotOwnedError)datetimedate	timedeltatimezone)Linker)g)Path)timeitProfilerDataCtxprofiler_data_log)*)AES)is_dataclass)OrderedDict)deepcopy)ListOptionalTupleType)contextmanager)SHA256)RSA)get_random_bytes)
PKCS1_v1_5)pad)unpadz******c                   $    e Zd ZdZddZd Zd Zy)disable_aclt   Отключение проверки прав доступа в ORM для системных частей кодаNc                     d | _         y N)save_acl_flagselfs    ./cmf/util/cmfutil.py__init__zdisable_acl.__init__8   s
    !    c                 T    dt         v rt         j                  | _        dt         _        y )Ndisable_permissionsT)r   r/   r(   r)   s    r+   	__enter__zdisable_acl.__enter__;   s      A%!"!6!6D $r-   c                 .    | j                   t        _        y r'   )r(   r   r/   r*   excvaluetbs       r+   __exit__zdisable_acl.__exit__@   s     $ 2 2r-   returnN__name__
__module____qualname____doc__r,   r0   r6    r-   r+   r$   r$   6   s    ~"%
3r-   r$   c                   $    e Zd ZdZddZd Zd Zy)
run_systemr%   Nc                      d | _         d | _        y r'   )current_usercurrent_acl_admin_moder)   s    r+   r,   zrun_system.__init__G   s     &*#r-   c                     t         j                  | _        t        j                  j	                  t         j
                         t         j                  | _        dt         _        y )NT)r   rB   cmfappset_current_personsystem_useracl_admin_moderC   r)   s    r+   r0   zrun_system.__enter__K   s:    NN""1==1&'&6&6#r-   c                     t         j                  j                  | j                         | j                  t
        _        y r'   )rE   rF   rG   rB   rC   r   rI   r2   s       r+   r6   zrun_system.__exit__S   s(    ""4#4#4566r-   r7   r9   r>   r-   r+   r@   r@   D   s    ~+ 7r-   r@   c                   $    e Zd ZdZddZd Zd Zy)disable_notifyu4   Отключение всех уведомленийNc                     d | _         y r'   )save_notify_flagr)   s    r+   r,   zdisable_notify.__init__Z   s
     $r-   c                 T    dt         v rt         j                  | _        dt         _        y )NrL   T)r   rL   rN   r)   s    r+   r0   zdisable_notify.__enter__]   s     q $%$4$4D!r-   c                 .    | j                   t        _        y r'   )rN   r   rL   r2   s       r+   r6   zdisable_notify.__exit__b   s    00r-   r7   r9   r>   r-   r+   rL   rL   X   s    >% 
1r-   rL   c                   R    e Zd Z ed      Z	 ddZd Zd Zed        Z	ed        Z
y)	enable_import_modez/tmp/eva_app_import.lockNc                      d | _         d | _        y r'   )save_import_flagsave_cache_flagr)   s    r+   r,   zenable_import_mode.__init__i   s     $#r-   c                     dd l }|j                  j                  dd      | _        dt        v rt        j
                  | _        dt        _        d|j                  d<   | j                          y )Nr   NO_CACHE import_modeT1)osenvirongetrU   r   rY   rT   import_heartbeat)r*   r[   s     r+   r0   zenable_import_mode.__enter__m   sQ    !zz~~j"=A$%MMD!!$

:r-   c                     dd l }| j                  t        _        | j                  |j
                  d<   | j                  j                         r| j                  j                          y y )Nr   rW   )	r[   rT   r   rY   rU   r\   	LOCK_PATHexistsunlink)r*   r3   r4   r5   r[   s        r+   r6   zenable_import_mode.__exit__v   sK    --!%!5!5

:>>  "NN!!# #r-   c                     t        | j                  d      5 }|j                  t        j                  t
        j                        j                  d             d d d        y # 1 sw Y   y xY w)Nzw+tzz%Y-%m-%d %H:%M:%S %Z%z)openr`   writer	   nowr   utcstrftime)clsfs     r+   r^   z#enable_import_mode.import_heartbeat   sP    #--& 	V!GGHLLHLL1::;STU	V 	V 	Vs   AA##A,c                 v   dd l }t        j                  j                  | j                        syt        | j                  d      5 }|j                  j                  |j                               }d d d        t        j                  t        j                        z
  j                         dk  S # 1 sw Y   AxY w)Nr   Frrd     )dateutil.parserr[   pathra   r`   rf   parserparsereadr	   rh   r   ri   total_seconds)rk   dateutilrl   	lock_times       r+   import_is_runningz$enable_import_mode.import_is_running   s    ww~~cmm,#--% 	8 --affh7I	8 -	9HHJWTT	8 	8s   *B//B8r7   )r:   r;   r<   r   r`   r,   r0   r6   classmethodr^   rx   r>   r-   r+   rR   rR   f   sK    /0I#$ $ V V U Ur-   rR   c                    t        t        d      sy d|  }|t        j                  v ry t        j                         }t        j
                  j                  j                  |d      }|j                  dd       t        j                         |z
  }|dkD  rt        j                  d|d	d
|        |dkD  r&t        j                  j                  d|d	d
|        |dkD  rHt        j                         t        ddd      kD  r&t        j                  j                  d|d	d
|        |t        j                  |<   t        j                         t        j                  |<   y )Nacquired_locksCmfCacheObjLock:   timeoutT)blockingblocking_timeout333333?cache_obj_lock_get long time: 0.3sec    ,DEV: cache_obj_lock_get long time CRITICAL:      #DEV: cache_obj_lock_get long time: )hasattrr   r{   timeAPPREDIS_DBredislockacquiredebugrE   include	cmf_alertr
   todayacquired_lock_timigns)obj_idlock_keyst_timer   acquire_times        r+   cache_obj_lock_get_redisr      s9   1&'!&*H1###iikG
 <<""8R"8DLL$L499;(Ld	0c0B$xjQRa L\Z]L^^bckblmna::<$tQ++KK!!$GUXGYY]^f]g"hi!%AX(,		AH%r-   c                     t        t        d      sy t        j                         } t        j                  j	                         D ]  }	 |j                           t        j                         | z
  }|dkD  r8t        j                  d|ddt        j                  j                                 i t        _        y # t        j                  j                  $ r"}t        j                  d|        Y d }~d }~ww xY w)Nr{   z*cache_obj_lock_release_all release error: 皙?z%cache_obj_lock_release_all too slow: r   zsec. Locks:)r   r   r   r{   valuesreleaser   
exceptions	LockErrorr   keys)r   r   eunlock_times       r+    cache_obj_lock_release_all_redisr      s    1&'iikG  '') F	FLLNF
 ))+'KS	7C7HTUTdTdTiTiTkSlmnA )) 	FGG@DEE	Fs   B::C9C44C9Fc                    dd l }t        t        d      sy d|  }|r|t        j                  v ry |t        j                  v ry  |j                          }d}d}d}d}|rd}t        j
                  d| d	|        ||k  ru|d
z  }t        j                  j                  j                  j                         j                  |d|i      }	t        |	      d   d   }
|
rn |j                  |       ||k  rut        j
                  d| d	|        
s&t        j                  j!                  d||z   d        |j                          |z
  }|dkD  rt        j
                  d|dd|        |dkD  r&t        j                  j!                  d|dd|        |d
kD  rHt#        j$                         t#        dd
d      kD  r&t        j                  j!                  d|dd|        |r9 |j                          t        j&                  |dz   <   dt        j                  |<   y  |j                          t        j&                  |dz   <   dt        j                  |<   y )Nr   r{   r|   r      zKSELECT pg_try_advisory_xact_lock(('x' || md5(:lock_key))::bit(64)::bigint);zRSELECT pg_try_advisory_xact_lock_shared(('x' || md5(:lock_key))::bit(64)::bigint);zRun pg_try_advisory_xact_lock(z	) shared=r   r   zDone pg_try_advisory_xact_lock(ua   DEV: CRITICAL cache_obj_lock_get не смог взять блокировку в течение u   секr   r   r   r   r   r   r   r}   r   __shT__ex)r   r   r   acquired_locks_shr{   r   models	CmfPersondp_ddSessionexecutelistsleeprE   r   r   r
   r   r   )r   rt   r   r   r   
sleep_time
wait_itersiterlock_sqllock_reslock_resultr   s               r+   cache_obj_lock_get_pgr      sn   1&'!&*Hq***q'''diikGJJD ]HgGG,XJivFG

	##&&**224<<XH
  8nQ'*

: 
 GG-hZyGH  !B  CM  NX  CX  BY  Y_  `  	a499;(Ld	0c0B$xjQRa L\Z]L^^bckblmna::<$tQ++KK!!$GUXGYY]^f]g"hi3<499;0(,H%3<499;0%)"r-   c                 r    i t         _        i t         _        | st        j                  j                  d       y )Nu   DEV: ручной вызов cache_obj_lock_release_all не снимает блокировки! Блокировки будут сняты в конце транзакции)r   r{   r   rE   r   r   near_commit_or_rollbacks    r+   cache_obj_lock_release_all_pgr      s1    AA"  P  	Q
r-   c                 B    t        t        d      sy t        | |      }|S )Nr{   )rt   )r   r   r   )r   rt   ress      r+   cache_obj_lock_getr      s#    1&'  T
2CJr-   c                    t        t        d      sy t        |       }t        j                  j	                         D ]?  \  }}t        j
                         |z
  }|dkD  s#t        j                  d| d|dd       A i t        _        |S )Nr{   r   r   z(cache_obj_lock_release_all lock >100ms:  r   sec)r   r   r   r   itemsr   r   )r   r   	lock_namelock_strw   s        r+   cache_obj_lock_release_allr   
  s    1&'
'@W
XC55;;= _	7IIK')	s?GG>yk9UX/Y\]^_ !AJr-   c                     t        t        d      rt        j                  rt        j                         } t        j                  D ](  }t	        j
                  j                  j                  |  * t        j                         | z
  }|dkD  rEt        t        j                        }t        j                  d| d|        t        d| d|        g t        _        y y y )Ndelayed_redis_eventsr   zPROF emit_delayed_events > 0.1 z, len(g.delayed_redis_events)=)r   r   r   r   r   r   r   publishlenr   print)r   eventpublish_timecounts       r+   emit_delayed_eventsr     s    q()a.D.D))+++ 	/ELL&&.	/yy{W,#../EGG5l^Cabgahij3L>A_`e_fgh!# /E)r-   c                 &    t        t              |    S r'   )varsr   )
class_names    r+   get_model_by_namer   )  s    <
##r-   c                 <    t        |       }t        t              |   S r'   )get_class_name_by_idr   r   idr   s     r+   get_model_by_idr   -  s    %b)J<
##r-   c                 $   t        | t        j                  j                        r| j                  } t        | t        j
                  j                        r| j                  S | j                  d      ryt        |       j                  d      d   }|S )N)zobj//zUsers/CmfRFile:r   )
isinstancerE   fieldsCmfTyper4   r   	BaseModelr   
startswithstrsplit)r   r   s     r+   r   r   2  sr    &#**,,-&#**../    01V""3'*Jr-   )simplec                    t        | t        j                  j                        r| j                   }n|  }t        |      }|r|j                  n|j                  } ||d|i|S )Nr   )r   rE   r   	CmfEntityr   r   sgetr]   )r   r   argskwargstuuidmodelr]   s          r+   get_obj_by_idr   ?  sX    "cjj**+55'$E"E%**EIIC$)%)&))r-   c                 
   t        |t              rt        t              |   }n|}t        | t        j
                  j                        r/t        | t        j
                  j                        st        |       } t        | t              rg| j                  |j                   d      r| S |j                  | ddg      }|r|j                  S |j                  | ddg      }|r|j                  S yt        | j                        S )u  
    Находим id объекта. Функция для использования в API и bzPython ручек, которые используют клиенты.
    Реализуем максимально универсальную логику, чтобы клиент мог получить объект по:
    - id
    - code
    - name
    - передать сам объект
    - передать field модели со ссылкой наобъект
    Если передается id - функция отрабатывает максимально быстро, т.к. используется в кешах
    Если передается code или name - будут доп.запросы в БД.
    Сначала ищем по code и только если не находим - по name
    В class_name можно передать имя модели или саму модель
    r   z--r   )coder   )namer   N)r   r   r   r   rE   r   r   
CmfRelBaser   r   r   r   )objr   r   
loaded_objs       r+   get_obj_id_by_anyr   I  s     *c"VZ( #szz))*:c3::CXCX3Y#h#s>>U--.a01JZZS$Z>
== ZZS$Z>
== svv;r-   c              #      K   ddl m} ddlm} t	        |j
                  j                               D ]6  }t        ||      }t        ||      r|j                  r(| r	 | |      s3| 8 yw)u`   Последовательность моделей, с возможно фильтрацией.r   r   )BaseModelMetaN)
cmf.includer   cmf.models.base_modelr   sorted__dict__r   getattrr   abstract)model_filterr   r   
model_namer   s        r+   iter_modelsr   o  s[     "3V__1134 

+%/5>>|E2Ks   A"A,%A,c                     ddl m} ddlm} |j	                         D ]  }|j
                  | k(  s|j                  c S  y )Nr   r   )r   )r   r   r   r   iter_subclassesui_namer   )r  r   r   r   s       r+   get_class_name_by_ui_namer  |  s=    "/**, $==G####$ r-   c                 4   |st        dd       t        |      t        k(  rt        |      } |j                  |ddd| gi|}|sR| Pd| v rL| j                  d      d   }|j                         r(t        |      d	kD  r |j                  |ddd
d| gi|}|S )Nu|   TODO: сделать автоматическое обнаружение моделей и объекта как в bzPythonTabortfilterr   =-   LIKEz%-)r   typer   r   r]   r   isdigitr   )r   r   r   r   r   code_numbers         r+   get_obj_by_coder    s      Q  Z^  	_E{c!%(
%))T
@63"5
@
@C4#tjjob) S%5%9%))TY66R};M*NYRXYCJr-         filenamereplacereplace_patternreplace_spaces	max_charshash_lengthr8   c           	      0   ddl }ddlm} ddlm} ddt
        dt        dt        d	t
        fd
}	|j                  j                  |       \  }
}|
}t        j                  d|      s| }
d} |d|
      }
t        j                  |||
      }
|
|k7  }|rt        j                  d||
      }
t        |      }|rd|z   nd}||z
  |z
  } |	|
|      }t        |      t        |
      k  rd}||z
  d|z   z
  } |	|
|      }|}
|r || |      }|
 d| | }|S |
 | }|S )u  
    Удаляет недопустимые символы из имени файла,
    сокращает имя до максимальной длины
    и добавляет хеш уникальности при необходимости

    Args:
        filename (str): имя файла.
        replace (str, optional): символ замены небезопасных символов. Defaults to "_".
        replace_pattern (str, optional): шаблон для замены символов. Defaults to "[/ #%]".
        replace_spaces (str, optional): замена пробела. Defaults to False.
        max_chars (int, optional): максимальное количество символов в имени файла. Defaults to 127.
        hash_length (int, optional): количество символов хеша. Defaults to 4.

    Returns:
        safe_name (str): безопасное имя файла
    r   N)	normalizer   )short_str_enctextr  	max_bytesr8   c                     | d| }t        |j                  d            |kD  r?t        |      dkD  r1|dd }t        |j                  d            |kD  rt        |      dkD  r1|S )uh    Обрезает строку до max_chars символов, но не более max_bytes в UTF-8 Nutf-8r   r  )r   encode)r  r  r  	truncateds       r+   truncate_to_fitz&safe_filename.<locals>.truncate_to_fit  sg    )$	)""7+,y8S^a=O!#2I )""7+,y8S^a=Or-   z\.[a-zA-Z0-9]{1,10}$rX   NFCz\sTr
  )   )r[   unicodedatar  cmf_hashlibr  r   intrq   splitextre	fullmatchsubr   )r  r  r  r  r  r  r[   r  r  r#  r   extoriginal_name
needs_hash	ext_chars
hash_charsavailable_charstruncated_name	name_hash	safe_names                       r+   safe_filenamer6    sX   0 %*c c c C    *ID#M <</5UD!D66/7D1D &JvveWd+ CI&0!k/aJ)+j8O %T?;N
>SY&
#i/1{?C(?D !(K8	fAi[.	  fSEN	r-   r  c           
         t        j                  | dd      } dj                  fd| D              j                        }|D cg c]  }|s|	 }}j                  |      }|r`t	        |      |kD  rRt	        |      dkD  r<j                  |d   dj                  |dd  D cg c]  }|d   	 c}      g      d | S |d   d | S |S c c}w c c}w )NruT)language_codereversedrX   c              3   l   K   | ]+  }|j                         s|d k(  r|j                         n - yw)r
  N)isalnumlower).0cseps     r+   	<genexpr>z!translit_strip.<locals>.<genexpr>  s*     Qq!))+cQWWYsBQs   14r   r   )transliteratetranslitjoinr   r   )r  r@  lengthwordswr   s    `    r+   translit_striprH    s    !!$dTJDGGQDQRXXY\]E#1Q#E#
((5/C#c(6/u:>88U1XrwweABi/H!/H'IJKGVTTQx  J $
 0Is   C
C
%Ctags_extendprotocols_extendc                    |r&d|v r"| j                  dd      j                  dd      } t        j                  }g d|d<   dg|d	<   g d
|d<   g d
|d<   t        j                  }|j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d	       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |r|j                  |       t        j                  }|r|j                  |       t        j                  | t        j                  ||d      S )Ndivz<div>z<p>z</div>z</p>)srcwidthheightimgr	   r   )controlsrM  r   audiovideopbrinsdelfigure
figcaptionT)r  tags
attributes	protocolsstrip)r  bleachALLOWED_ATTRIBUTESALLOWED_TAGSappendextendALLOWED_PROTOCOLSclean)r  rI  rJ  r[  rZ  r\  s         r+   
html_cleanre    s.   u+||GU+33HfE **J2Ju$Jv5Jw5JwDKKKKKKKKKKKKKKKKKKKKK ((I)*<<T(;(;
^gosttr-   c                 F    dd}t        |g      }|j                  |       S )Nc                 \    | j                  d      s| S t        | d         }d| d<   d| d<   | S )N)Nhref_blank)Ntargetexternal)Nclass)r]   r   )attrsnewrT  s      r+   
set_targetzlinkify.<locals>.set_target  s<    yy(LU>*+"*!+or-   )	callbacksF)r   linkify)r  ro  linkers      r+   rr  rr    s$     zl+F>>$r-   c                      i  fd}|S )Nc                      t        j                  | t        |j                               f      }|vr | i ||<   |   S r'   )pickledumpsr   r   )r   r   hashfuncmemorys      r+   memozmemoized.<locals>.memo   sF    ||T6&,,.#9:;v00F4Ld|r-   r>   )ry  r{  rz  s   ` @r+   memoizedr|    s    F
 Kr-   c                    t         j                  j                  }d|  }|j                  dd      }|j	                         s"t
        j                  j                  dd       y|j                  |      s1|j                          t        j                  d	       t        | d
      S t        j                  |j                  |            }t        j                  j                   |d   k7  r2|j                          t
        j                  j                  dd       yt#        j$                  t&        j(                        |d<   |j+                  |t        j,                  |             |j                          y)N	obj_lock-obj_lock.lock
   r~   (DEV: FATAL lock(): if not lock.acquire()Tr  FuR   DEV: FATAL Попытка lock_ping() на отсутствующую записьi  	locked_byuJ   DEV: FATAL Попытка lock_ping() на чужую блокировку	ping_time)r   r   r   r   r   rE   r   r   ra   r   r   r   rv  loadsr]   current_personr   r	   rh   r   ri   setrw  )keyr   redis_db_key_lock	lock_infos         r+   	lock_pingr  (  s   ||!!HseDMMMBM7E==?HPTU??4 	deC!!X\\$/0Ii44jrvw%\\(,,7IkLLv||I./	MMOr-   c                     | st        d      t        j                  j                  }d|  }|j	                  |      r(t        j                  |j                  |            }|r|S y)uh   
    Из редиса заберём структуру, где есть данные
    :return:
    uL   Блокировка объектов без key не реализованаr~  N)
ValueErrorr   r   r   ra   rv  r  r]   )r  r  r  r  s       r+   r  r  A  s]    
 gii||!!HseDtLLd!34	r-   c                 N   	 t         j                  j                  }d|  }|j                  dd      }t        j
                  j                  j                  t        j                  t        j                        t        j                  t        j                        |d}|j                         s"t        j                  j                  dd       y	|j!                  |      rt#        j$                  |j'                  |            }t        j                  t        j                        |d
   z
  j)                         |k  rt        j
                  j                  |d   k7  r`|j+                          t,        j.                  j'                  |d         }t        j                  j                  d|j0                          y	t        j                  j                  d       |j+                          y|j3                  |t#        j4                  |             |j+                          y)uT   
    Захват объекта на редактирование
    :return:
    r~  r  r  r~   )r  
lock_startr  lock_timoutr  Tr  Fr  r  )r   u[   Редактирование временно невозможно.
Редактирует u`   DEV: WARNING lock() попытка захватить свою блокировку дважды)r   r   r   r   r   r  r   r4   r	   rh   r   ri   r   rE   r   r   ra   rv  r  r]   ru   r   r   r   r   r  rw  )r  lock_timeoutr  r  r   r  persons          r+   r   r   R  s   
||!!HseD===2=6D%%((..ll8<<0\\(,,/#	I <<>HPTUtLLd!34	LL&;)??NNPS__""i&<<))--;1G-H%%  )E  FL  FQ  FQ  ER  'S  T%%  'I  JLLv||I./LLNr-   c                    t         j                  j                  }d|  }|j                  dd      }|j	                         s"t
        j                  j                  dd       y|j                  |      s0t
        j                  j                  d	       |j                          yt        j                  |j                  |            }t        j                  t        j                         |d
   z
  j#                         |d   k  rSt$        j&                  j(                  |d   k7  r|j                          y|j+                  |       |j                          y|j+                  |       |j                          y)u2   
    Снятие захвата
    :return:
    r~  r  r  r~   z*DEV: FATAL unlock(): if not lock.acquire()Tr  Fus   DEV: WARNING unlock() попытка разблокировать несуществующую блокировкуr  r  r  )r   r   r   r   r   rE   r   r   ra   r   rv  r  r]   r	   rh   r   ri   ru   r   r  r   delete)r  r   r  r  r   r  s         r+   unlockr  y  s#   
 ||!!HseD===2=6D<<>JRVW??4   T  	UX\\$/0IX\\"Y{%;;JJLyYfOgg)K"88LLN OOD!LLNr-   c                   &    e Zd ZdZdddZd Zd Zy)CmfLockuJ   Глобальная блокировка аппа на основе redisNc                 V    ddl m} |j                  j                  |||      | _        y )Nr   )r   )r   r   )r   r   r   r   
redis_lock)r*   r  r   r   r   s        r+   r,   zCmfLock.__init__  s#    ("..--c7Ue-fr-   c                 |    | j                   j                         s"t        d| j                   j                         y )NzCannot lock )r  r   CmfGetLockErrorr   r)   s    r+   r0   zCmfLock.__enter__  s4    &&(!L1E1E0F"GHH )r-   c                     	 | j                   j                          y # t        $ r0 t        j	                  dd| j                   j
                          Y y w xY w)Nz%szUnlock CmfLock error: key = )r  r   r   loggingwarningr   r2   s       r+   r6   zCmfLock.__exit__  sL    	YOO##%  	Y OOD$@AUAU@V"WX		Ys    6AA)ro   Nr7   r9   r>   r-   r+   r  r    s    Tg
IYr-   r  c                    t         j                  sy| s|syt        t        dd       }dt        _        dt        _        t        j                  d   }t        j                  d= |rt               j                         n	t               }t        |d<   t        j                  j                  |d<   ||d<   |rt        n	t               |d<   t         |d<   t"        |d	<   t$        |d
<   t&        |d<   t(        |d<   t        j                  j*                  |d<   |r|j-                  |       	 |rt/        |      }|j1                  d      r|dd  }|j1                  d      r|dd  }t3        d|z   d      5 }	|	j5                         } d d d        t7        | |d      }
t9        |
|        |d   |      }n3| r#t;        j<                  | d      }d}|j>                  D ]/  }tA        |t:        jB                        s|jD                  dk(  s.d}1 |s|j>                  jG                  t;        jH                  t;        jJ                  ddd      dd             t;        jB                  d|j>                  t;        jL                  g t;        jN                  ddd      gg d g d g       ddg       }|g|_        t7        |dd      }
t9        |
|        |d   |      }nt+        dd       |t        _        dt        _        dt        j                  v rd"t        j                  v rtt        j                  d   j[                         D ]O  \  }}|t        j                  d"   v rt        j                  d"   |xx   |z  cc<   :|t        j                  d"   |<   Q n$t        j                  d   t        j                  d"<   |t        j                  d<   S # 1 sw Y   JxY w# tP        $ r}|t        _        dt        _        tA        |t        jR                  jT                        r|dd l+} |jX                         }t        j                  j+                  d| d | d!| d       Y d }~~d }~ww xY w)#NTdisable_raise_lazyloadselect_countr   cmfutilr*   r	   r
   r   r   requestsr*  r   z/opt/eva-app/   r   r   rn   execrun)modeFr   )r4   lineno
col_offset)r  r  )posonlyargsr   defaultsvararg
kwonlyargskwargkw_defaults)r   bodyr   r  r  decorator_listz<string>uC   Попытка вызова несуществующего bzPythonr  uT   Произошла ошибка при выполнении bzPython объекта z: 
bzpython_select_count).configBZPYTHON_ENABLEDr   r   r  relaxed_bz_python_modeprofiler_dataglobalscopy_build_safe_bzpython_globalsr   rE   r   r  r	   _build_safe_datetimer
   r   r   r  r*  r   updater   r   rf   rt   compiler  astrs   r  r   FunctionDefr   ra  ReturnConstant	argumentsarg	Exception
base_errorCmfAbortError	traceback
format_excr   )r   r   code_src_objeval_file_patheval_unsafer   prev_disable_raise_lazyloadsaved_select_countlrl   
code_blockresultcode_asthave_fnstfnr   r  tracekvs                        r+   exec_bzpythonr    s    """)!-Et"L#A#A8	''	-I-KAAhK;;&&AiLAfI +H1E1GAjMAfIAkNAjMAjMAdG[[**AkN	8
 0N((9!/!4((-!/!3o6<  vvx  ~v>JQQuXc]FyyF3HGmm #b#//2rww%7G"G#  $$JJS\\QST%U&'A7
 __%hmm*---B.1ggfQST.U-V13DR.2+'
 -.!BP "$ :v>JQQuXc]F [cgh  ;A$A("aoo57==? D1(?@@OO$;<Q?1D?BCAOO$;<Q?	D 89~7VAOO34&8AOON#MA   L  
#> #( a556G$	$$&bcobpprstruuwx}w~ 	 	
 	

s@   $AO ,O=A3O 1O CO O
O 	Q!A;QQ!c                      d } t         j                  j                  d      rFt         j                  j                  d      d   }|j                  d      d   j	                         } | S t         j
                  } | S )NzX-Forwarded-Forr   ,)requestheadersgetlistr   r]  remote_addr)ext_ipipss     r+   get_client_ipr  #  sh    F01oo%%&78;3"((* M $$Mr-   c                       fd}|S )Nc                  d    t         j                  j                  dj                   dd       y )Nu   Вызов функции "up   " запрещен, требуется разрешить расширенные возможности BzPythonTr  )rE   r   r   r:   )r   r   rl   s     r+   wrapperz_restrict_func.<locals>.wrapper.  s4    )!**  6f  g 	 	
r-   r>   )rl   r  s   ` r+   _restrict_funcr  -  s    

 Nr-   c                     t        | t              st        | g|i |S | j                  d      rd| vrt        | g|i |S t        j
                  j                  dd       y )Nz/tmpz..u   Неверный путь к файлу или несуществующий файл, требуется разрешить расширенные возможности BzPythonTr  )r   r   rf   r   rE   r   r   )rl   r   r   s      r+   _safe_bzpython_openr  6  sj    aA'''' 	||FAA''''KK }  r-   c                      i } t         j                         }t        t              |d<   t        t              |d<   t
        |d<   dt        fd}||d<   || d<   | S )Nevalr  rf   r   c                     | j                  d      d   }|t        j                  vr%t        j                  j                  d| dd       t        | g|i |S )N.r   u   Пакет "u)   " нельзя импортироватьTr  )r   r  BZPYTHON_ALLOWED_LIBSrE   r   r   
__import__)r   r   r   name_to_checks       r+   _bzpython_importz6_build_safe_bzpython_globals.<locals>._bzpython_importL  sY    

3* < <<KK!!L?h"iqu!v$0000r-   r  __builtins__)r  r  r  r  r  r  r   )bzpython_globalsbuiltinsr  s      r+   r  r  D  sg      "H%d+HV%d+HV*HV1s 1 .H\'/^$r-   c                  <    t         d    G fddt              } | S )Nr  c                   "     e Zd Z fdZ xZS )*_build_safe_datetime.<locals>.SafeDatetimec                 4    t         d<   t        |   |i |S )Nr  )r  superrj   )r*   r   r   	__class___original_imports      r+   rj   z3_build_safe_datetime.<locals>.SafeDatetime.strftimeb  s"    )9L&7#T4V44r-   )r:   r;   r<   rj   __classcell__)r  r  s   @r+   SafeDatetimer  a  s    	5 	5r-   r  )r  r	   )r  r  s    @r+   r  r  \  s"    #L15x 5
 r-   c                 H   t        |       }|j                  j                  d      }|r|d   dvry t        |j                        j                  ddg      d   }|r|sy |d   }|sy d|v r|j                  dd	      \  }}nd
|v r|j                  d
d	      \  }}ny |dv rt        j                  }n:|dv rt        j                  }n%|dv rt        j                  }nt        j                  }i }	|r||	d<   d
|v rt        dd|j                   d| i|	S t        dd| i|	S )Nr   r   )sharedocsrx  rX   r   r  r   )maxsplitr
  )docDOCCmfDocument)flFLIN_WORK	CmfFolder)CmfListEPIsharelink_hashr   r   r>   )r   rq   r   r   queryr]   rsplitr   r  r  r  r   r   r  )
url_strcheck_sharelinkurl
path_parts
hash_paramobj_keyobj_typeobj_code	obj_model
get_kwargss
             r+   get_url_path_objr  i  sK   
7
C $JA.??#))$(("6q9JznG g~$]]3];(	$^^C!^<( 00&&		9	9$$		'	'NN	 &&	J'1
#$
hS9#7#7"8( DS
SS ;7);
;;r-   c                      t         j                  j                  d      \  } }}t        j                  |      }t        j                  |      }t        j                  |t
        j                  |      S )Nr   )r  EVA_INSTANCE_KEYr   binascii	unhexlifyr   rn  MODE_CBC)_iv_hexkey_hexr  ivs        r+   
get_cipherr!    sV    0066s;Avw


W
%C			F	#B773b))r-   messagec                    t               }| dt        j                  t        |       t        j                  z  z
  z  z   }|j	                  |j                               }t        j                  |      j                  d      S )Nr   r   )	r!  r   
block_sizer   encryptr!  base64	b64encodedecode)r"  cipherpadded_messageencrypted_messages       r+   cryptr,    sc    \Fscnns7|cnn7T&TUUN~'<'<'>?-.55g>>r-   c                     t               }|j                  t        j                  |             j	                         j                         S r'   )r!  decryptr&  	b64decoder(  r]  )r"  r)  s     r+   r.  r.    s5    \F>>&**734;;=CCEEr-   exc_infoc                     | \  }}}|rt        j                  |      ng }dj                  d |d d D              }| d| }t        j                  |j                               j                         d d }|S )Nr  c              3   l   K   | ],  }|j                    d |j                   d |j                    . yw)r   N)r  r   r  )r>  rl   s     r+   rA  z make_exc_hash.<locals>.<genexpr>  s5       ::,axq
+s   24r      )r  
extract_tbrD  hashlibsha1r!  	hexdigest)r0  exc_typer  exc_tbstack
stack_text
stack_hashs          r+   make_exc_hashr=    s    "Ha,2I  (E  r J
 <r(,Jj//12<<>sCJr-   r   c           	      x   d }d}|rTt        |      }t        j                  j                  j	                  | |       }|rt        j                  d| d       y t        j                  j                         }|j                  j                         D ]^  }	|r.t        j                  j                  ||	|xs d| |xs | d      }
3t        j                  j                  |	|xs d| |xs | d      }
` |rEt        j                  j                  j                  | | 
j                  j                   d	       y y )
Nzadmin_alert__notify_agg:zNotify z was sent earlier. Skippingu   Ошибкаr   )r   r  r   msgr  priority)r  r   r?  r  r@  iQ )ex)r=  r   r   r   r]   r   r   r   CmfPersonGroupadmin_group
rg_members
all_nested	CmfNotifyplace_notifyr  r   r4   )r"  r   r  r0  r   rx  redis_prefix_key	notify_id	admin_grpr  notifys              r+   admin_alertrL    s8   D1X&LL&&**.>-?v+FG	GGgi[(CDE%%113I&&113 %%22+^_W 3 F %%22+^_W 3 F  "2!3D6:FIIOOP\] r-   c                  8   t        j                         } t        j                  rud }t        j                  }d|v r|j	                  d      \  }}d| d| d| _        |r9|j	                  d      \  }}t         j                  j                  ||      | _        | S )N@zhttp://)httphttpsr   )r  r   r  EGRESS_PROXYr   proxiesauthHTTPProxyAuth)requests_session
auth_proxyproxy_settingsusernamepasswords        r+   rU  rU    s    '')
,,. )7)=)=c)B&Jn-.~./$
  !+!1!1#!6Hh$,MM$?$?($S!r-   c                     ddl m} t        | |      r| j                  } t        | t              r| D ]  }t        ||        yt        | d|       y)u   
    Маркируем объект проверенный бизнес логикой политикой по умолчанию.
    Сейчас маркировка проверяется только в api(eva-app)
    r   )r   )policy_acl_policyN)cmf.fields.base_fieldsr   r   r4   r   acl_set_policysetattr)r4   r[  r   r   s       r+   r^  r^    sK    
 /%!% 	/C3v.	/ 	}f-r-   c                     ddl m} t        | dd      }t        | |j                  j
                        r|j                          |j                  S |j                          |j                  S )Nr   baseT)no_metano_acl)	cmf.data_providersrb  CmfResultSplitterr   SimpleMapperSimpleModelsplit_simpler   r  )r   rb  splitters      r+   
dumps_dictrk    sW    ' d4@H#t((445 ?? 	??r-   c                     ddl m} t        |       }t        | |j                  j
                        rt        |      S t        j                  |      S )Nr   ra  )	re  rb  rk  r   rg  rh  	cmf_dumpsujsonrw  )r   rb  res_dicts      r+   
dumps_jsonrp    s>    '#H#t((445""{{8$$r-   c                    t        | t        j                        rt        |       S t        | t        j
                        rt        |       S t        | t        j                  j                        r| j                  j                         D ci c]D  \  }}t        |t        j                  j                        r|j                  dur||j                  F }}}| j                  j                         D ]@  \  }}t        |t        j                        s!|j                  s.|j!                         ||<   B | j"                  |d<   |S t%        | | j&                        c c}}w )N.r   )r   	ipaddressIPv4Addressr   decimalDecimalrE   r   r   r   r   r   r   _valuefieldsCmfTypevirtualvirtual_getterr   	TypeErrorr  )r   attrfieldr  s       r+   cmf_dumps_defaultr}  '  s   #y,,-3x	C	)3x	C--	.  #||113Re%!3!34S9P %,,R R
 <<--/ 	6KD%%!2!23$335t	6  #~~|
C
''Rs   A	Ec                     	 t        j                  | t        t         j                        S # t        $ r"}t        j                  d| d|         |d }~ww xY w)N)defaultoptionzorjson.dumps error e=z, obj=)orjsonrw  r}  OPT_NON_STR_KEYSrz  r   r   )r   r   s     r+   rm  rm  :  sP    ||C):6CZCZ[[ 	's&67s   ), 	AAAc                       e Zd ZddZd Zd ZddZddZddZd Z	edd	e
j                  j                  fd
       Zd Zd Zd Zd Zd Zd Zd Zd Zy)rf  Nc                     || _         i | _        t               | _        d | _        d | _        d | _        d| _        t               | _        d| _	        || _
        i | _        || _        y Nr   )_objmetar  meta_fields_keepr  startendnumber_of_objectsm2m_id_cachedepthrc  3_CmfResultSplitter__project_perm_add_comments_cacherd  )r*   r   rc  rd  s       r+   r,   zCmfResultSplitter.__init__C  s^    		 #
!"E
13.r-   c                       fd}|S )Nc                     | xj                   dz  c_         | j                   dk\  ry  | g|i |}| xj                   dz  c_         | j                   dk\  sJ |S )Nr   r  r   r  )r*   r   r   retr  s       r+   wrapz,CmfResultSplitter._check_depth.<locals>.wrapR  sU    JJ!OJzzRT+D+F+CJJ!OJ::?"?Jr-   r>   )r  r  s   ` r+   _check_depthzCmfResultSplitter._check_depthQ  s    	 r-   c                     |j                   | j                  vr-t        |j                        | j                  |j                   <   y y r'   )r   r  r   ui_meta)r*   os     r+   _add_class_to_metaz$CmfResultSplitter._add_class_to_meta\  s2    <<tyy(&.qyy&9DIIall# )r-   c                 ,   |j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }	t        t        |      }
i }d}d}d}|
j                  st	        |      D ]
  }|d	v r||=  d
|d<   |S t        j
                  j                  |||d||||	|	      xs
 t               }t        |
t        j                  j                        r|
j                  r|r|j                  d      d   }t        t        |d      }|j                  j                  |
j                        }|j                  d      }|j                  d      }|r|j                  sIt        j
                  j                  ||||
j                  |||d|	      }t        |      t        |      z  }|dk(  r=|j                  d      r,t        j                  j!                  ||      sd}t               }|dk(  r=|j                  d      r,t        j"                  j!                  ||      sd}t               }|j                  dd      r+t        |      }d|v r|j%                  d       t'        |      }d|vrd|v rdnd
}t	        |j)                               }t*        j,                  j/                  d      st*        j,                  j/                  d      r#d|
j                  v rd|vr|j1                  d       |D ]U  }|t*        j2                  v r||= |d	v r|
j                  j                  |      }|rO|j                  rI|j                  s	||= d
||<   ^t        |t        j                  j4                        r	t6        ||<   d}t        j
                  j                  ||||||||	d|
      xs
 t               }|dk(  r|r
t               }|dk(  r|r
t               }|dk(  r#|r |j9                  d      r|| j:                  v r0| j:                  |   sd|v rt        |      }|j%                  d       nt=        |      }t=        |d dgd!      }|j>                  j@                  xs |jB                  j@                  }|s0d|v rt        |      }|j%                  d       d| j:                  |<   nU|jE                  d"|d#      du r0d|v rt        |      }|j%                  d       d| j:                  |<   nd| j:                  |<   |d$k(  r!|d%k(  rt        |      }|jG                  d       d|vrd|v rdnd
}|r|||<   |d
k(  sM||v sS||= X |r||d&<   |r||d<   |S )'u;  
        Чтобы код не дблировать для модели, простой модели и дикта, можно проверять итоговый json
        Правда в таком случае, мы обходим все данные, даже если они не доступны.
        perm_effective_acl_idcmf_owner_idr   	parent_idr   perm_parent_id%perm_security_level_allowed_ids_cacheNr   deny_acl_objF)	initial_acl_keyobject_modelobject_owner_idraise_error	object_idobject_parent_idobject_dictperm_security_level_allowed_idschecked_policyr   r   perm_inherit_acl_idperm_parent_owner_id)	r  r  r  object_fieldr  r  r  r  r  
CmfCommentprivateTCmfAttachmentcmf_deletedrg   rt   readonlyz.getz.ui_getcomments)
r  r  r  r  r  r  r  r  r  r  zCmfProject:
project_id)r   include_deletedzPPP-COM-ADD)r   r  r   
CmfProject_acl_fields)$r]   r   r   	api_allowr   CmfAccessListcheck_accessr  
issubclassrE   r   acl_parent_field	partitionr   rd  r  check_visibilityr  removetupler   r   
api_methodendswithra  api_hack_fieldsCmfPassword_PASSWORD_MASKr   r  r   r  r4   r  check_project_role_accessadd)r*   obj_dict
acl_policyr  obj_owner_idr   obj_parent_idr   r  r  r   
acl_fieldsacl_objcomment_denyattachment_deny
field_nameaccess_levelsparent_class_nameparent_modelparent_fieldr  r  parent_access_levels_tmpobj_keysr|  	acl_fieldfield_access_levelsproject_obj_project_id_s                                  r+   _acl_obj_dictzCmfResultSplitter._acl_obj_dict`  s   
 #,,'>?||N3d# [1\\,/
!&6708=d0e-
+
 "8n )
!55Z() $*HZ O,,99+*Vb- Bg%	 : ' 0 +.%	 	 eSZZ112u7M7MR` . 8 8 =a @"6+<dCL'..2253I3IJL"*,,/D"E#+<<0F#G |':':'-';';'H'H$7!2DX!&!7!76\i (eJ	 (I (X$
 !$M 2S9M5N N %(,,y*A$$55flK# # (X\\)-D''88N"& #<<u-}%D$G$!$KM-'$*m$;jG(LL!!&)Q\\-B-B9-M%,,.:X3MOOJ'" J	)JQ...Z(11LL$$Z0E<< ,-3Jz*eSZZ%;%;<+9HZ(I"("6"6"C"C /'jR^ h0Uch) #D #+ #4
 /2e   \)l&)e#_,&)e# Z'Mm>V>VWd>e !D$J$JJAA-PU\`sUs.12E.F++227;  -];H({8SeijD"&//"7"7"O4>>;O;OK#"&99256I2J//66w?NS>>{K#==mQUch=imrr&*==69:M6N 3 3 : :7 CRWDBB;ORVDBB;OV#
l(B&)*=&>##''/11*04G*GJV	)2
:&F"zX'=Z(UJ	)n &0H]##*HZ r-   c                    | xj                   dz  c_         | j                  s| j                  |       d|j                  i}|j	                  d      D ]2  }|j
                  s| j                  ||dz         ||j                  <   4 | j                  s-|j                  dk7  r| j                  |t        |dd             }|S )	Nr   r   T)
is_definedr  public_readr\  r  )r  rc  r  r   r   r  _process_cmf_typerd  acl_typer  r   )r*   r  r  r  r  s        r+   _process_cmf_modelz$CmfResultSplitter._process_cmf_model  s    !#||##A&-T* 	NA<<#'#9#9!519#9#MF1<< 	N
 {{qzz]:''71mUY;Z'[Fr-   c                    | xj                   dz  c_         | j                  s+t        t        |j                        }| j                  |       i }|j                  j                         D ]L  \  }}| j                  s'| j                  j                  |j                  |f       | j                  |      ||<   N | j                  s| j                  |t        |dd             }|S )Nr   r\  r  )r  rc  r   r   r   r  r   r   r  r  _processrd  r  )r*   r   r  r   r  r{  r4   s          r+   _process_simple_modelz'CmfResultSplitter._process_simple_model  s    !#||FCNN3E##E*<<--/ 	0KD%<<%%))3>>4*@A==/F4L	0 {{''73W[;\']Fr-   c                 "      fd |      S )Nc                    t        | t              r| D cg c]
  } |       c}S t        | t              r| j                  d      }| j	                         D ci c]  \  }}| |       }}}t        |t
              rd|v rƉ	xj                  dz  c_        t        j                  j                  j                  |      }	j                  s?	j                  |       | D ])  }	j                  j                  |j                  |f       + |j                  |d<   	j                   s"	j#                  || j                  d            }|S | S c c}w c c}}w )Nr   r   r   r   r\  r  )r   r   dictr]   r   r   r  rE   r   CmfTUUIDget_cls_by_tuuid_strrc  r  r  r  r   rd  r  )
r   elr   r  r  datar   r  proccess_jsonr*   s
           r+   r  z?CmfResultSplitter._process_json_as_model.<locals>.proccess_json)  s+   #t$478bb)88#t$8;		D1=++DDfc*sf}**a/*JJ//DDVLE<<//6*- VJ 1155u7G7G6TUV).)9)9D&;;#11$377=CY1ZJ 9 Es   EEr>   )r*   r  r  s   ` @r+   _process_json_as_modelz(CmfResultSplitter._process_json_as_model(  s    	$ Qr-   r  c                 b   | xj                   dz  c_         | j                  s;| j                  j                  |j                  j
                  |j
                  f       t        |t        j                  j                        r| j                  |j                        S t        |t        j                  j                        r| j                  |j                        S t        |t        j                  j                        r| j                  |j                        S t        |t        j                  j                         rt#        |      | j$                  v ry | j$                  j                  t#        |             |j&                  ry | j                  |j                  |dz         }| j$                  j)                  t#        |             |S t        |t        j                  j*                        rt#        |      | j$                  v rg S | j$                  j                  t#        |             g }|j                  D ]$  }| j                  |      }|j-                  |       & | j$                  j)                  t#        |             |S |j.                  }|du r|j0                  S |j.                  S )Nr   r  .)r  rc  r  r  instancer   r   rE   r   CmfObjectJsonr  r4   CmfObjectList_process_list	CmfObjectr  CmfRelationBaser   r  is_nullr  r   ra  jsonr  )r*   r  r  r   r  irT  s          r+   r  z#CmfResultSplitter._process_cmf_type=  s   !#||!!%%qzz'<'<all&KL a112..qww77 a112%%agg.. a--.**17733 a334!u)))!!"Q%(yy))!''q)AC$$RU+J a../!u)))	!!"Q%(FWW !++A.a ! $$RU+M ff#:99vvr-   c                 v    | xj                   dz  c_         |D cg c]  }| j                  |       }}|S c c}w Nr   )r  r  )r*   r  r   r  s       r+   r  zCmfResultSplitter._process_listn  s9    !#,-.q$--".. /s   6c                 p   | xj                   dz  c_         t               }|j                         D ]  \  }}| j                  |      ||<   | j                  r'|dk(  s-|s0t        |t              sAt        t        |j                  d      d   d       }|sg| j                  |       |j                         D ])  }| j                  j                  |j                  |f       +  |j                  d      r?|j                  d      r.| j                   s"| j#                  ||j                  d            }|S )Nr   r   r   r   r   r\  r  )r  r   r   r  rc  r   r   r   r   r   r  r   r  r  r   r]   rd  r  )r*   r  r  r  r  mr  s          r+   _process_dictzCmfResultSplitter._process_dicts  s    !#GGI 	NDAqa(F1I<<AI!
1c8JFAGGCLOT:++A.&'ffh N
--111<<2LMN	N ::d

< 8''6::m;T'UFr-   c                 v   | xj                   dz  c_         t        |t              r| j                  |      S t        |t        j
                  j                        r| j                  |      S t        |t        j                  j                        r| j                  |      S t        |      r| j                  |      S t        |t              r| j                  |      S t        |t        j                   t"        j$                  f      rt'        |      S t        |t(        t*        f      r|j-                         S |S r  )r  r   r   r  rE   r   r   r  r   r   r  r   r  r  r  rr  rs  rt  ru  r   r	   r
   	isoformat)r*   r   s     r+   r  zCmfResultSplitter._process  s    !#c4 %%c**c3::--.))#..c3:://0**3//--c22c4 %%c**cI117??CDs8OcHd+,==?"
r-   c                     | j                   j                         D ]/  \  }}t        |d         D ]  }||f| j                  vs|d   |=  1 y )Nr   )r  r   r   r  )r*   r   class_valuer  s       r+   _process_metazCmfResultSplitter._process_meta  sZ    '+yy'8 	:#J";x#89 :

+43H3HH#H-j9:	:r-   c                      d fd	  j                           j                  j                         D ]/  \  }}t        |d         D ]  }||f j                  vs|d   |=  1 y )Nc                    
xj                   dz  c_         t        |       rt        t        | j                        }
j                  |       | j                  j                         D ]8  \  }}
j                  j                  |j                  |f        	||dz          : y t        | t        j                  j                        rt        t        | j                        }
j                  |       | j                  j                         D ]b  \  }}t        |t              s|j                  dus&
j                  j                  |j                  |f        	|j                  |dz          d y t        | t              r| D ]  } 	||dz           y t        | t               rd }| j#                  d      }|rFt        |t$              r6t        t        |j'                  d      d   d       x}r
j                  |       | j                         D ]:  \  }}|r'
j                  j                  |j                  |f        	||dz          < y y )Nr   .r   r   r   )r  r   r   r   r   r  r   r   r  r  r   rE   r   r   rv  r   r  r]   r   r  )r   r  r   sub_attr	sub_value	sub_fieldr,  r   sub_keyprocess_jsonr*   s            r+   r
  z<CmfResultSplitter._process_simple_meta.<locals>.process_json  s   ""a'"C 7''.+.<<+=+=+? 5'Hi))--u/?/?.JK E!G45 C!5!567''.+.<<+=+=+? @'Hi!)W5):J:JRU:U--1153C3CX2NO$Y%5%5uQw?@ C& /C eAg./C&j5 '0@0@0Ea0H$ OOuO//6*-))+ 5&GY--1153C3CW2MN E!G45 'r-   r   r   )r  r  r   r   r  )r*   r   r  r  r
  s   `   @r+   _process_simple_metaz&CmfResultSplitter._process_simple_meta  sn    	5< 	TYY'+yy'8 	:#J";x#89 :

+43H3HH#H-j9:	:r-   c                 ~    | j                   r| j                  sy t        | j                  | j                   z
  dz        S )N  )r  r  r(  r)   s    r+   mszCmfResultSplitter.ms  s/    zzDHHtzz)T122r-   c                     t        j                          | _        | j                  | j                        | _        | j
                  s| j                          t        j                          | _        y r'   )r   r  r  r  r  r  r  r  r)   s    r+   r   zCmfResultSplitter.split  sC    YY[
mmDII.yy 99;r-   c                     t        j                          | _        | j                  | j                        | _        | j
                  s| j                          t        j                          | _        y r'   )r   r  r  r  r  rc  r  r  r)   s    r+   ri  zCmfResultSplitter.split_simple  sE    YY[
 mmDII.||%%'99;r-   )NFr'   r  )r:   r;   r<   r,   r  r  r  r  r  r  rE   r   r   r  r  r  r  r  r  r  r   ri  r>   r-   r+   rf  rf  A  sv    	:iV * .3::#5#5 . .`
 &:$:L3	r-   rf  c                 x    dd l }	 |j                  |       }|j                         S # |j                  $ r Y yw xY w)Nr   F)psutilProcess
is_runningNoSuchProcess)pidr  processs      r+   check_process_runningr    s?    ..%!!## s    ' 99c                 :   ddl m}m}	 t        j                  j
                  }
|
st        j                  dd       y|
D ]  }	  |t        |            }|j                  dk7  rt        j                  d| d	d
        y|j                  }|j                  r|j                  nd}|j                  r|j                  j                  d      nd}|st        j                  d| dd
        y|j                  r |	|j                        ni }|j                  ddg      d   }||j                         dk(  }|j                  ddg      d   }|r|}|j                  ddg      d   }||j                         dk(  }t        j                  d| d| d| d| d       ddt        |       dt        |      dt        |      d|d g
}|rH|j!                  d!       |r"|j!                  d"       |j!                  |       |r|j!                  d#       |r"|j!                  d$       |j!                  |       |r,|j!                  d%       |j!                  t        |             n+|j!                  d&       |j!                  t        |             t        j                  d'd(j#                  |       d       t%        j&                  |dd)dd*      }d+|j(                  v r"t        j                  d,| d| d| d       d-| d| d| d.|xs | d/| d0|d1|j(                   }t        j                  |d
       |rt+        ||       y t        j                  d7|  d8d       y# t$        j,                  $ r8}d2| d/| }t        j                  |d3       |rt+        ||      Y d}~ yd}~wt$        j.                  $ rR}d4| d/| d5|j0                   d6|j(                   }t        j                  |d3       |rt+        ||      Y d}~ yd}~ww xY w)9u#  
    Проверка файла на ICAP сервере(ах) с использованием c-icap-client.
    
    Поддержка множественных ICAP серверов с настраиваемыми параметрами через URL.
    
    Формат URL: icap://host[:port]/service[?tls=true&tls_method=TLSv1_2&tls_no_verify=true]
    
    TLS параметры могут быть указаны в URL (query параметры) или как параметры функции.
    Приоритет: параметры из URL > параметры функции (fallback).
    
    Примеры использования:
        # TLS через URL
        icap_check(file_path, icap_url="icap://host/service?tls=true&tls_method=TLSv1_2")
        
        # TLS через параметры функции (старый способ, для обратной совместимости)
        icap_check(file_path, tls=True, tls_method='TLSv1_2')
        
        # Комбинированный (URL имеет приоритет)
        icap_check(file_path, icap_url="icap://host/service?tls=true", tls=False)  # tls=true из URL
    
    Query параметры URL:
        - tls: true - включить TLS
        - tls_method: строка - метод TLS (например, TLSv1_2, TLSv1_3)
        - tls_no_verify: true - отключить проверку сертификата
    
    !!! import icapclient - похоже ломает gevent
        Либа читает файл только с диска (


    Используем cli клиент:
    /usr/bin/c-icap-client [-V ] [-VV ]
     [-i icap_servername] [-p port] [-s service] [-tls ] [-tls-method tls_method] [-tls-no-verify ]
     [-f filename] [-o filename] [-method method] [-req url] [-resp url]
     [-d level] [-noreshdr ] [-nopreview ] [-no204 ] [-206 ]
     [-x xheader] [-hx xheader] [-rhx xheader] [-w preview] [-v ]

    -V                      : Print version and exits
    -VV                     : Print version and build informations and exits
    -i icap_servername              : The icap server name
    -p port         : The server port
    -s service              : The service name
    -tls                    : Use TLS
    -tls-method tls_method          : Use TLS method
    -tls-no-verify                  : Disable server certificate verify
    -f filename             : Send this file to the icap server.
    Default is to send an options request
    -o filename             : Save output to this file.
    Default is to send to stdout
    -method method          : Use 'method' as method of the request modification
    -req url                : Send a request modification instead of response modification
    -resp url               : Send a responce modification request with request url the 'url'
    -d level                : debug level info to stdout
    -noreshdr                       : Do not send reshdr headers
    -nopreview                      : Do not send preview data
    -no204                  : Do not allow204 outside preview
    -206                    : Support allow206
    -x xheader              : Include xheader in icap request headers
    -hx xheader             : Include xheader in http request headers
    -rhx xheader            : Include xheader in http response headers
    -w preview              : Sets the maximum preview data size
    -v                      : Print response headers

    Valid:
    root@crm:/opt/eva-app# c-icap-client -f uwsgi.ini -req / -i 10.50.17.68 -s avscan -method POST -v >/dev/null
    ICAP server:10.50.17.68, ip:192.168.0.33, port:1344

    No modification needed (Allow 204 response)

    ICAP HEADERS:
            ICAP/1.0 204 Unmodified
            Server: C-ICAP/0.5.6
            Connection: keep-alive
            ISTag: CI0001-B5sZ3i1I3+P4H3at/XZ4mQAA

    REQMOD HEADERS:
            POST / HTTP/1.0
            Last-Modified: Tue Apr  9 10:46:16 2024
            Content-Length: 1426
            Content-Length: 1426
            User-Agent: C-ICAP-Client/x.xx

    Virus:
    root@crm:/opt/eva-app# c-icap-client -f xf-mccs6.exe -req / -i 10.50.17.68 -s avscan -method POST -v >/dev/null
    ICAP server:10.50.17.68, ip:192.168.0.33, port:1344


    ICAP HEADERS:
            ICAP/1.0 200 OK
            Server: C-ICAP/0.5.6
            Connection: keep-alive
            ISTag: CI0001-B5sZ3i1I3+P4H3at/XZ4mQAA
            X-Infection-Found: Type=0; Resolution=2; Threat=Win.Tool.Genkryptik-9939783-0;
            X-Violations-Found: 1
            -
            Win.Tool.Genkryptik-9939783-0
            0
            0
            Encapsulated: res-hdr=0, res-body=108

    RESPMOD HEADERS:
            HTTP/1.0 403 Forbidden
            Server: C-ICAP
            Connection: close
            Content-Type: text/html
            Content-Language: en

    r   r   z8icap_check(): no ICAP servers configured, check disabledDEBUG)levelTicapz$icap_check(): invalid scheme in URL z, expected "icap://"WARNINGFi@  r   avscanzicap_check(): invalid URL z, missing hosttlsNtrue
tls_methodtls_no_verifyz&icap_check(): checking file on server r   z
, service=z, tls=INFOz/usr/bin/c-icap-clientz-fz-iz-pz-sz-vz-tlsz-tls-methodz-tls-no-verifyz-methodz-reqz-respz!icap_check(): executing command: r      )capture_outputr   checkr  zNo modification neededz#icap_check(): file passed check on zicap_check(): failed on server z, url=z, file_path=z	, method=z
, result:
z icap_check(): timeout on server ERRORzicap_check(): error on server z, returncode=z	, stderr=zicap_check(): file z passed all checks)urllib.parser   r   r   global_settingsicap_serverr   r   schemehostnameportrq   lstripr  r]   r=  ra  rD  
subprocessr  stderrCmfIcapCheckErrorTimeoutExpiredCalledProcessError
returncode)	file_pathresp_urlreq_urlmethodr   r"  r#  r  r   r   icap_serversicap_urlparsedhostr.  servicequery_paramsurl_tlsurl_tls_methodurl_tls_no_verifyr   procr"  r   s                           r+   
icap_checkrD    s!   ` 0 $$00L 	JRYZ ! ]\	c(m,F}}&>xjH\]eno ??D"(++6;;4D 28fkk((-(G4XJnMU^_ 6<\\8FLL1rL #&&utf5a8G"mmo/)--lTFCAFN+
 , 0 04& I! L , 1 7 7 9V CGG<TF!D6T[S\\bcfbghpvw )$Ic$iQUWZ[_W`bfhoquwD F#KK.KK
+ KK 01I&F#F#CL)G$CM* GG77GHPWX >>#Rt$HD (4;;6=dV1TF!G9U]cd <D64&'RXY`YldlXmmzpyo{  |F  E  ~G G!!%/y1+GT::_]@ GG!),>?vN! (( 	8
-YLQGGGG7+'33,, 	6xj9,m\]\h\h[iirsts{s{r|}GGGG7+'33	s:   ;M,A,M,/HM,A
M,,P?-N22PAPPc               #      K   t        t        dd      } 	 dt        _        d  | t        _        y # | t        _        w xY ww)Nr  FT)r   r   r  )r  s    r+   allow_lazyloadrF    s7     ")!-Eu"M?#' #> #> s   A 0 A =A u   Январьu   Февральu   Мартu   Апрельu   Майu   Июньu   Июльu   Августu   Сентябрьu   Октябрьu   Ноябрьu   Декабрь)r      r  r  r            	   r     r3  en_USru_RUc                     | d   t         j                  v r#t        j                  | j	                               S t
        j                  | j	                               S r  )stringascii_lettersdictionary_enr'  
capitalizedictionary_ru)words    r+   dictionary_checkrV    sD    Aw&&&&""4??#455""4??#455r-   u   стi'  u   тоi$  u   ноi#  u   наiH   u   поib  u   енiC  u   ниi  u   коi  u   раi}  u   овi  u   неi+  u   роi  u   прi  u   алis  u   гоiC  u   реi  u   осi  u   лиi  u   каip  u   воi  u   ерi  u   таi  u   отi  u   ваi  u   орi  u   олia  u   етi  u   теi  u   омiy  u   анiC  u   елi  u   одi  u   тьi  u   лаi  u   онi  u   леi  u   лоi  u   есi  u   атi  u   риi[  u   льu   деi?  u   огi  u   веi  u   ныi  u   тиi  u   заi  u   итi:  u   скi  u   даi  u   акiO  u   ойi>  u   инi  u   меi  u   емi  u   илi  u   чеiZ  u   обi  u   асi  u   доi  u   моi  u   киi9  u   трi
  u   сяi
  u   едi
  u   соin
  u   миim
  u   ннiU
  u   сеiJ
  u   амi/
  u   исi$
  u   авi
  u   жеi	  u   азi	  u   маi	  u   имi	  u   твi[	  u   арi?	  u   виi0	  u   иеi  u   руi  u   боiD  u   слi/  u   изi$  u   выi  u   диi  u   быi  u   ияi  u   икi  u   егi  u   пеi  u   ивiM  u   чтi?  u   всi8  u   ейi2  u   сьi  u   окi  u   ьнiu  u   оеiR  u   нуiM  u   сиiC  u   ихi8  u   этi6  u   хоi4  u   адu   чаi   u   ожi  u   аяi  u   спu   ляi  u   евi  u   ичi  u   муi  u   чиi  u   шеi  u   тсi  u   днi  u   куi  u   удi  u   ыхiw  u   саu   екih  u   беif  u   очiY  u   ийiL  u   паi<  u   циi2  u   крi#  u   знi  u   опu   аеi  u   дуi  u   ииi  u   щеi  u   туi  u   ыеi  u   ыйi  u   ирi  u   тыi  u   озi  u   внi  u   ылi  u   рыi  u   ятi  u   утi  u   тнiy  u   жиig  u   нтie  u   усiV  u   ссiP  u   шиiL  u   идiA  u   ымi6  u   няi0  u   гаi.  u   свi  u   езi  u   луi  u   ктi  u   мыi  u   мнi  u   ееi  u   ужi  u   уюi  u   влi  u   улi  u   грi  u   пиi  u   ажi  u   брu   абi  u   учiv  u   дрij  u   цеic  u   аюi^  u   ечi[  u   снiZ  u   ачiU  u   гиiR  u   чнiJ  u   суiH  u   глiF  u   люiC  u   жнi=  u   ахi9  u   ебi%  u   буi!  u   рнi  u   урi  u   ьсi  u   ывi  u   щиi  u   ньi  u   звu   плi  u   апu   жаi  u   гдi  u   ряi  u   нсi  u   ькi  u   угi  u   блi  u   оиi  u   лсi  u   ждi  u   ашi  u   баi  u   биi  u   умi  u   ицu   епi  u   ртi  u   здi  u   ютi  u   зоi  u   ежi  u   врi  u   длi  u   укi  u   упiw  u   клin  u   шаic  u   ешi^  u   ошi]  u   пуiZ  u   смiN  u   агiI  u   двiF  u   вуiE  u   кеi8  u   ткi0  u   ацi)  u   йсi  u   ояi  u   айi  u   зиi  u   иоi  u   дыu   убi  u   нкi
  u   ысi  u   ытi  u   игi  u   ехi  u   ющi  u   ещi  u   хаi  u   ндi  u   дсi  u   рмi  u   ялi  u   геi  u   янi  u   гуi  u   июu   лыi  u   ушi  u   рсi  u   фиi  u   тяi  u   цаi  u   зыi  u   вшi  u   охi  u   ишi  u   змi  u   фоi  u   ьшi  u   иаi  u   нцi}  u   ксix  u   ямis  u   шкiq  u   увip  u   рьio  u   зуu   ргim  u   ибil  u   рвif  u   ядid  u   срic  u   зеi\  u   чуi[  u   шлiX  u   феu   мяiT  u   явiO  u   унiN  u   шьu   лнu   ьюiL  u   ркiD  u   ьеi?  u   чкi>  u   дьi9  u   ущu   щаi8  u   ышi6  u   ооu   еоi3  u   ухi2  u   бяi0  u   вкi.  u   сыi*  u   ясu   втu   йнi'  u   зрi$  u   ецi"  u   юдi   u   язi  u   бнu   лкi  u   бщi  u   узi  u   ржi  u   вяi
  u   мпi  u   кнi  u   ллi  u   дяi  u   уеu   квi  u   сч   u   шнr%  u   взu   юб   u   оц   u   иж   u   ип   u   яеu   ьяu   пы   u   ащ   u   дк   u   рд   u   лжu   оф   u   аи   u   хи   u   ящ   u   ях   u   хнu   ощ   u   зл   u   фаu   ырu   эк   u   вд   u   шо   u   бс   u   ын   u   зя   u   шуu   зг   u   тл   u   ьмu   впu   хр   u   мл   u   ьтu   йт   u   жу   u   гн   u   еа   u   пяu   ык   u   рш   u   нгu   бъ   u   еяu   мм   u   ою   u   яю   u   ьзu   ыб   u   цы   u   ъе   u   кц   u   схu   сд   u   ыпu   аф   u   чьu   як   u   ау   u   юч   u   ищ   u   дп   u   рх   u   нч   u   мс   u   уа   u   фр   u   вь   u   цоu   дц   u   ычu   йчu   еф~   u   тд{   u   збz   u   хуy   u   зкv   u   лгu   u   хвs   u   пнu   ифq   u   вмu   нюp   u   джu   нфo   u   оэm   u   йдl   u   яжu   ппu   ыдk   u   еиu   штj   u   жкu   юсi   u   еюg   u   мкf   u   цуe   u   ячu   юрc   u   рбa   u   элu   дм`   u   йкu   сшu   рю_   u   сюu   дт^   u   рп\   u   щу[   u   хлu   тчu   ярZ   u   ъяu   ррY   u   чшu   ьбW   u   ыгV   u   бкU   u   йшu   птu   мьR   u   рчQ   u   тмu   гкu   зьu   пкu   рлN   u   еуu   ьцM   u   нщu   ягJ   u   ьгI   u   кжu   псu   бхu   уйG   u   сбF   u   цкD   u   фуu   мбC   u   ьиu   пьu   лчB   u   яяA   u   сц@   u   оуu   тпu   цвu   яц?   u   ттu   эн>   u   лтu   ыз=   u   щн:   u   хе9   u   тюu   ябu   дд8   u   зжu   сфu   нрu   яй7   u   нвu   дш6   u   ввu   йо3   u   рцu   юнu   флu   аоu   жо2   u   хсu   рфu   дч1   u   ьч0   u   чо/   u   эрu   ффu   вч.   u   юз-   u   лд,   u   сёu   эфu   ьдu   бю+   u   бв*   u   жбu   уяu   тцu   нз(   u   фтu   вгu   хмu   чл'   u   юмu   дхu   йм%   u   дгu   тб$   u   йцu   эмu   эп#   u   щьu   вхu   ётu   юк"   u   япu   жч!   u   оа    u   ыж   u   бмu   рзu   мрu   эсu   юлu   ёнu   йлr%  u   ккu   юцu   вц   u   ыяu   съ   u   щёu   чрu   дзu   хтu   кз   u   дъu   швu   иуu   бь   u   ём   u   дбu   юшu   чёu   жьu   мвu   юж   u   мчu   мцu   мг   u   уцu   жсu   лбu   лпu   уиu   юю   u   нжu   гчu   сг   u   ьвu   еёu   зсu   пц   u   лёu   яиu   ёлu   яш   u   уфu   гс   u   аэu   фсu   дюu   лмu   югu   рщu   вщu   ёр   u   эдu   лз   u   гмu   гвu   дёu   мфu   зъu   шпr}   u   мэu   эвu   пчu   кмu   ьф   u   бжu   тхu   ншu   эйu   кпu   уэr  u   гтu   нбu   ьоu   бдu   шмu   кгu   зчu   шёr3  u   юхu   сжu   ббu   нёu   кшu   ззu   тщu   фыu   зцu   ггrL  u   лхu   йеu   ааu   тёu   ьщu   ыиu   тфu   нхu   тгr  u   рэu   лвu   бшu   рёu   вёu   ьпrK  u   лрu   зтu   ххu   йзu   эзu   чвu   шрu   ыщu   оёu   вбrJ  u   нпu   кдu   сэu   йбu   жлu   тъu   жмu   бзu   уоu   жрu   сзrI  u   жгu   тзu   жёu   жжu   фьu   йфu   пшu   зюu   иэu   эхu   тэrH  )u   лшu   бэu   йрu   хгu   бтu   хшu   гбu   мтu   йгu   фнu   нэu   тшu   фгu   аёthhei!  iniF  eri  aniL  r*  iW  esi  oni  r  i	  nti  eni[  atedi  ndil  toif  oriD  eaiw  tiiR  ari$  tei  ngi  ali  iti  asi  isix  hai  eti
  sei
  ouic
  ofi2
  lei%
  sai
  vei	  roi	  rai	  rii:	  hii.	  nei 	  mei	  dei	  coi  tai  eci  sii  lli:  soi  nai  lii  lai  r  i  maiJ  dii=  ici+  rti*  nsi  rsi  ioi  omi	  chi  oti  cai  cehoi  bei  ttiw  foiQ  tsssnoiO  eei-  emi  aci  ili  dai  nii  uri  wai  shi  eiiZ  amiU  triH  dtiC  usi>  loi5  pei3  uni  nci  wiuti  adi  ewi  owi  gei  epi  ailyi  oli  fti  r[   i  eoefim  prwedoia  moiS  r   iN  iei-  mii  pai  fii  poi  cti  whi  iri  ayi  gai  sci  kei  evi  spi  imopi~  dsi{  ldil  ulif  ooie  suiY  iaiW  ghiL  pliG  ebi@  igi/  vii"  r   i  woi
  yoi	  rdtwi  bai  agi  ryi  abi  lsi  swi  apfei  tui  cii  fai  htfri  avi  eggoboi  bui  tyi  mpi  oci  odi  ehi  ysi  eyrmovit  gtyaik  ckih  gii_  rni\  griU  rciT  bliQ  ltiG  yti>  oayei,  obi  dbffi  sfi  rri  dukiuci  ifafi  drclrA  i  smi  pii  sbcri  tli  oii  r8  upi  byi  tci  nni  aksli  nfuei  dwaui  ppugi  rlrgi  rU  i  cui  uai  dhrki  yiluumiw  biit  nynwih  quogsnmbi`  vai_  dfiY  ddiV  r  gsawnhpuiJ  hriH  sdr5   iF  ptnmiE  dciC  guiB  tmiA  munummnli<  eui:  wnnbi4  rpdmi/  sri,  udi+  uirfi&  okywi!  tfipi  rwrbohksi  r   fui  yci  tpi  mti  dlnkcci  ubrhnpju   r     dn   ka   ph   hu   jolf   yb   rvoe   ib   ikypgl   lpym   lbhsdg   gnek   nr   ps   tdlcsk   yfyh   voahdylm   synvyd   fssgyr   yl   wsmyoy   knizxp   lwtn   kor   aa   ja   zefc   gwtg   xt   fhlrjeyngg}   gfeqhy|   kthcbsx   hwhncshmt   njhhr   wtgclhejfmdvlvwrgph   fpgbgmhld   lkcyb   mcygxiX   hbfwgyT   hpmwP   pmzaO   lgiwxafbL   svK   gdixajklH   hfhdaesqdjfyazlnaofdkwmfmhsj<   uftvxcyu;   bbwwojaxmrwlxekhoxuozifgih4   tkiiiutjmnwykykfr  uypwdkrjukkrkuwmkmmd)   mlezkbwc&   wdhgbtzokcpfyvpcpywbykcpyjkppbcdjiuwuhwfyywpbcaqcbiqcmmgdqbjre   kdpdfjcfnzcwfvvyfkozzzijljnquvxopghkkgvshvbmhjcngvcgwugjxhgktqcqrqbhxsuzwkxuuxbdbwwgmvmjpnxmoqbvxwkkbpzurzxfmkzhbnzyhqwjiydzvrzsxycvxbxrujyqvdpkvujrzlszyzlqkjbfnxqaqikvzwwvr   uuvtvpxdgqxlvcczlzztwzsxzbvlpvfqpjzmvwcjzcbgr  jsxgrxhzxxvmxnqwjpvnzdzrfzxvzpvhvbrG  zfgztxvfdxqbbkzgvgjczkznuqjmvvjdmqjhqsjtjbfxpqmzyxr   qtwqjjjwlxgxjnzvmxjkkqxkjfqmqhjljgvkvjkzqcxjpzqlqojvqfqdbzhxzjpxqpqeqrzqjybqxqcxkxwxqyqvqnvxbx)jzvzqgqqzxxzqkvqqjqxjxjqqzc                     t        j                  dd|       | k7  ryt        | | dd        D cg c]  \  }}|j                  ||z   d       }}}t	        |      dk(  ryt        |      t	        |      z  dz   S c c}}w )N
[\[\];',.]rX   gHz>r   r   )r*  r,  zipr]   r   sum)r  statabstatss        r+   bigram_text_rankr    sw    ff\2t$,(+D$qr((;=1TXXac!_=5=	%jAou:U$Y./ >s   A9u   йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮz@qwertyuiop[]asdfghjkl;'zxcvbnm,.QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,.c                    t         k(  r%| d   t        j                  v r| j                         S t        k(  r%| d   t        j                  vr| j                         S dj                  fd| D              }|j                         S )Nr   rX   c              3   B   K   | ]  }j                  ||        y wr'   )r]   )r>  xdict_s     r+   rA  z'ninja_translate_text.<locals>.<genexpr>  s     0a%))Aq/0s   )rus2engrP  	printabler=  eng2rusrD  )r  r  r  s    ` r+   ninja_translate_textr    sm    DGv'7'77zz|DG6+;+;;zz|
''040
0C99;r-   c                     | d   t         j                  v rt        | t              }nt        | t              }t        j                  dd|      |k(  r|S | S )Nr   r  rX   )rP  r  r  r  r  r*  r,  )rU  r  s     r+   ninja_reversr    sK    Aw&""""41"41	vvlB$+
r-   c                    t        |       dk  r| S t        | t              }t        | t              }t	        |t
              }t	        |t              }|r%t        |  d| dd||z  z
   d| dd||z  z
   	       t        |      rt        |      s|S t        |      rt        |      s|S d||z  z
  dkD  r|S d||z  z
  dkD  r|S | S )NrG  z
 rank_ru: r   r   z rank_eng: g?)	r   r  r  r  r  bigram_stat_rubigram_stat_engr   rV  )rU  r   	trans_eng	trans_rusrank_rurank_engs         r+   
ninja_oncer  )  s    
4y1}$T73I$T73Iy8G	?;Hj	1Xg-=+=*>k(STUVW^_gWgUgThij	"+;I+F	"+;I+F	(7
C
GH
c	!r-   c                 B    d| v r| S t        | |      }|| k7  r|  d| S | S )NrN  |)r  )rU  r   
ninja_words      r+   	ninja_addr  >  s8    
d{D%(JTq%%r-   c           	      |    dj                  | j                  d      D cg c]  }t        ||       c}      S c c}w )Nr   )rD  r   r  )r  r   rG  s      r+   ninjar  G  s.    88$**S/BQYq%(BCCBs   9subjectcontentbccc                     d }ddl m}  ||       }  ||      } ||      } |t        j                  j                  | ||||g       y)u=  Метод для отправки почты из bzpython

    Args:
        to (list|str): Куда
        subject (str): Тема
        content (str): Содержание
        cc (list, optional): Копия. Defaults to None.
        bcc (list, optional): Скрытая копия. Defaults to None.
    c                 t    t        | t              r| D cg c]  }t        |       c}S t        |       S c c}w r'   )r   r   r   )r4   r   s     r+   convert_valuez!send_email.<locals>.convert_valueT  s0    eT"(-.CH..5z /s   5r   )schedule_deferred_job)r   N)r   r  r   CmfPluginMailBoxsend_email_job)r  r  r  r  r  r  r  s          r+   
send_emailr  J  sN    
 2	r	B	r	B

C&11@@GU\^`beGfgr-   c                 N    t        j                  d| dt        |             dk7  S )u  Определяет, является ли value идентификатором объекта:
        * определённого класса, если указан class_name
        * любого Cmf-класса, если class_name не указан
    ^z:[0-9a-z-]*$N)r*  matchr   )r4   r   s     r+   is_tuuidr  `  s'    
 88qL13u:>$FFr-   r  c                 B   dd l }|j                  j                  |       }t        j                  j                  d      }|j                  s|j                  j                  d      ry|j                  dvry|j                  }||k(  xs |xr |j                  d|       S )Nr   r  r   T>   rO  rP  F)urllibrs   r   r  AUTH_SESSION_COOKIE_DOMAINr/  netlocrq   r   r,  r-  r  )r  r  r<  parent_domainr-  s        r+   is_safe_next_urlr  g  s    \\""3'F55<<SAM==V[[33C8}}--H}$])\h6G6G!M?H[6\]r-   	delta_strc                    | xs dj                         }|s
t               S t        j                  d|      }|st	        d|       t               }|D ]  \  }}t        |      }|dk(  r|t        |      z  }&|dk(  r|t        |      z  };|dk(  r|t        |	      z  }P|d
k(  r|t        |      z  }e|dk(  r|t        |      z  }z|dk(  r|t        |      z  }|dk(  s|t        |      z  } |S )NrX   z([+-]?\d+)(y|M|[wdhms])u0   Неверный формат смещения: y)yearsM)monthsrG  )weeksd)daysh)hoursr  )minutess)seconds)r]  r   r*  findallr  r(  )r  r  r  rd  nur  s          r+   str_to_timedeltar  u  s   	b!A


-q1AKI=YZZ	B 61F8R=q11R#Xr]!44r#Xr]33r#Xr]22r#Xr]33r#Xr]155r#Xr]155r6 Ir-   c                 V     t        j                          g  fd}|S )Nc                  >   t        j                          } rt        d	 d      j                  d       t        | 
z
  dz        }|kD  }|r)d	 d| d}r	|d d	z  }t	        j
                  |       t        j                  rrd
dlm	}  |	||       y y y )Nzprof_point(u   ) вызван дважды!Tr  zPROF z got r  z ()r   )
write_prof)
r   r  ra  r(  r   r   r  METRICS_PROF_COLLECTmetricsr  )end_timeduration_ms	triggeredr?  r  describtionduration_limit_msexecuted_tagmake_metricsr   r   track_ok_counts        r+   r  zmake_prof_point.<locals>.end  s    99;k$/KLMMD!8g-56"33	$u[M4CK=**GGCL&&<+t[)^D ,8&r-   )r   )r   r  r  r  r  r  r  r   s   ````` @@r+   make_prof_pointr    s&    iikGLE E" Jr-   jwtc                 x   |rt         j                  nt         j                  } |t        j	                  | d         j                               j                         j                  d      } |t        j	                  | d         j                               j                         j                  d      }| d| S )uX   Создает JWT строку с urlsafe base64 для передачи через URLheaderr	  payloadr  )r&  urlsafe_b64encoder'  r  rw  r!  r(  rstrip)r  urlsafeencoderr  r  s        r+   
jwt_to_strr    s    *1f&&v7G7GGTZZH.5578??AHHMFdjjY0779:AACJJ3OGXQwi  r-   c                 l   t        j                  t        j                        }t	        j                         }|j                  | j                                |j                  |      }|rt        j                  nt        j                  } ||      j                         j                  d      }|  d| S )uS   Подписывает JWT с urlsafe base64 для передачи через URLr	  r  )r    rn  r   rsa_private_keyr   r  r!  signr&  r  r'  r(  r  )r  r  signerdigestr
  r  s         r+   rsa_sign_pack_jwtr    s    ^^C//0FZZ\F
MM#**,;;vD*1f&&v7G7GG4=!((-DU!D6?r-   c                    | j                  d      \  }}}|ddt        |      dz  z
  z  z  }|ddt        |      dz  z
  z  z  }|ddt        |      dz  z
  z  z  }t        j                         }| j                  d      d    d| j                  d      d    }|j	                  |j                                |rt        j                  nt        j                  } ||      }	t        j                  t        j                        }
|
j                  ||	      }|sy ||      j                         } ||      j                         }t        j                  |      }t        j                  |      }|r]d|v rYt!        t#        j"                               t!        |d         kD  r-t%        j&                  dt#        j"                         |d          y||d	S )
ug   Проверяет и декодирует JWT с urlsafe base64 для передачи через URLr  r	  r  r   r   Nexpu9   Время жизни токена закончилось)r  r  )r   r   r   rn  r  r!  r&  urlsafe_b64decoder/  r    r   rsa_public_keyverifyr(  r  r  r(  r   r   r   )rjwt	check_expr  
header_b64payload_b64signature_b64r  jwt_unsigneddecoder	signatureverifierverifiedr  r  s                 r+   rsa_verify_unpack_jwtr    s   -1ZZ_*J] #S_q0011J3!c+.2233KSAM 2Q 6677MZZ\Fjjoa()4::c?1+=*>?L
MM,%%'(*1f&&v7G7GG&I~~c001Hvy1HZ '')Fk"))+GZZFjj!GUg%#diik*:S=P*P	KTYY[ZabgZhi11r-   rq  r'   )r  z[/\0#%]Fr  r  )r  N)NN)NNF)NNNN)rg   )r4   zlist|CmfModel|SimpleModel)r   NNNNNF)zCmf[a-zA-Z]*)rX   TT)FF)r5  rv  r0  r  r)  r   r   r  dateutil.relativedeltar   typesr   redis.exceptionsr   rE   r^  rB  r	   r
   r   r   r   flaskr   pathlibr   cmf.cmf_profiler   r   r   r   Crypto.Cipherr   r  r&  r   r   dataclassesr   rt  rr  r  rn  collectionsr   r  r   typingr   r   r   r   
contextlibr   r  enchantrP  r*  Crypto.Hashr   Crypto.PublicKeyr   Crypto.Randomr   Crypto.Signaturer    Crypto.Util.Paddingr!   r"   BaseExceptionExcInfoTyper  r$   r@   rL   rR   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   boolr(  r6  rH  re  rr  r|  r  r  r   r  r  r  r  r  r  r  r  r  r!  r,  r.  r=  rL  rU  r^  rk  rp  r}  rm  rf  r  rD  rF  	RU_MONTHSDictrR  rT  rV  r  r  r  rus_keyeng_keyr  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r>   r-   r+   <module>r6     s{       + 
 0  . 
   8 8    F F       $ ( ( #  . . %    	     * ' # % # %T- !]] 3 37 7(1 1'U 'U^467*r $$$

 %* *#L
  % KKK K 	K
 K K 	K\ uS utCy u4PS9 u`c uB
 # 
 # 
 2"$N FY Y*pd0
3<j*?3 ?3 ?FS FS F
K C  ^ ^ ^h{F[ ^jm ^>$.H%(&X Xv 7;15\v ? ? 	  W%W%6 Mu6%  Mut  MuF4  Mut  MuF4  MuPVW[  Mu\bcg  Muhnos  Mutz{  Mu  AG  HL  Mu  MS  TX  Mu  Y_  `d  Mu  ek  lp  Mu  qw  x|  Mu  }C  DH  Mu  IO  PT  Mu  U[  \`  Mu  ag  hl  Mu  ms  tx  Mu  y  @D  Mu  EK  LP  Mu  QW  X\  Mu  ]c  dh  Mu  io  pt  Mu  u{  |@  Mu  AG  HL  Mu  MS  TX  Mu  Y_  `d  Mu  ek  lp  Mu  qw  x|  Mu  }C  DH  Mu  IO  PT  Mu  U[  \`  Mu  ag  hl  Mu  ms  tx  Mu  y  @D  Mu  EK  LP  Mu  QW  X\  Mu  ]c  dh  Mu  io  pt  Mu  u{  |@  Mu  AG  HL  Mu  MS  TX  Mu  Y_  `d  Mu  ek  lp  Mu  qw  x|  Mu  }C	  D	H	  Mu  I	O	  P	T	  Mu  U	[	  \	`	  Mu  a	g	  h	l	  Mu  m	s	  t	x	  Mu  y		  @
D
  Mu  E
K
  L
P
  Mu  Q
W
  X
\
  Mu  ]
c
  d
h
  Mu  i
o
  p
t
  Mu  u
{
  |
@  Mu  AG  HL  Mu  MS  TX  Mu  Y_  `d  Mu  ek  lp  Mu  qw  x|  Mu  }C  DH  Mu  IO  PT  Mu  U[  \`  Mu  ag  hl  Mu  ms  tx  Mu  y  @D  Mu  EK  LP  Mu  QW  X\  Mu  ]c  dh  Mu  io  pt  Mu  u{  |@  Mu  AG  HL  Mu  MS  TX  Mu  Y_  `d  Mu  ek  lp  Mu  qw  x|  Mu  }C  DH  Mu  IO  PT  Mu  U[  \`  Mu  ag  hl  Mu  ms  tx  Mu  y  @D  Mu  EK  LP  Mu  QW  X\  Mu  ]c  dh  Mu  io  pt  Mu  u{  |@  Mu  AG  HL  Mu  MS  TX  Mu  Y_  `d  Mu  ek  lp  Mu  qw  x|  Mu  }C  DH  Mu  IO  PT  Mu  U[  \`  Mu  ag  hl  Mu  ms  tx  Mu  y  @D  Mu  EK  LP  Mu  QW  X\  Mu  ]c  dh  Mu  io  pt  Mu  u{  |@  Mu  AG  HL  Mu  MS  TX  Mu  Y_  `d  Mu  ek  lp  Mu  qw  x|  Mu  }C  DH  Mu  IO  PT  Mu  U[  \`  Mu  ag  hl  Mu  ms  tx  Mu  y  @D  Mu  EK  LP  Mu  QW  X\  Mu  ]c  dh  Mu  io  pt  Mu  u{  |@  Mu  AG  HL  Mu  MS  TX  Mu  Y_  `d  Mu  ek  lp  Mu  qw  x|  Mu  }C  DH  Mu  IO  PT  Mu  U[  \`  Mu  ag  hl  Mu  ms  tx  Mu  y  @D  Mu  EK  LP  Mu  QW  X\  Mu  ]c  dh  Mu  io  pt  Mu  u{  |@  Mu  AG  HL  Mu  MS  TX  Mu  Y_  `d  Mu  ek  lp  Mu  qw  x|  Mu  }C  DH  Mu  IO  PT  Mu  U[  \`  Mu  ag  hl  Mu  ms  tx  Mu  y  @D  Mu  EK  LP  Mu  QW  X\  Mu  ]c  dh  Mu  io  pt  Mu  u{  |@  Mu  AG  HL  Mu  MS  TX  Mu  Y_  `d  Mu  ek  lp  Mu  qw  x|  Mu  }C  DH  Mu  IO  PT  Mu  U[  \_  Mu  `f  gj  Mu  kq  ru  Mu  v|  }@  Mu  AG  HK  Mu  LR  SV  Mu  W]  ^a  Mu  bh  il  Mu  ms  tw  Mu  x~  B   Mu  C I   J M   Mu  N T   U X   Mu  Y _   ` c   Mu  d j   k n   Mu  o u   v y   Mu  z @!  A!D!  Mu  E!K!  L!O!  Mu  P!V!  W!Z!  Mu  [!a!  b!e!  Mu  f!l!  m!p!  Mu  q!w!  x!{!  Mu  |!B"  C"F"  Mu  G"M"  N"Q"  Mu  R"X"  Y"\"  Mu  ]"c"  d"g"  Mu  h"n"  o"r"  Mu  s"y"  z"}"  Mu  ~"D#  E#H#  Mu  I#O#  P#S#  Mu  T#Z#  [#^#  Mu  _#e#  f#i#  Mu  j#p#  q#t#  Mu  u#{#  |##  Mu  @$F$  G$J$  Mu  K$Q$  R$U$  Mu  V$\$  ]$`$  Mu  a$g$  h$k$  Mu  l$r$  s$v$  Mu  w$}$  ~$A%  Mu  B%H%  I%L%  Mu  M%S%  T%W%  Mu  X%^%  _%b%  Mu  c%i%  j%m%  Mu  n%t%  u%x%  Mu  y%%  @&C&  Mu  D&J&  K&N&  Mu  O&U&  V&Y&  Mu  Z&`&  a&d&  Mu  e&k&  l&o&  Mu  p&v&  w&z&  Mu  {&A'  B'E'  Mu  F'L'  M'P'  Mu  Q'W'  X'['  Mu  \'b'  c'f'  Mu  g'm'  n'q'  Mu  r'x'  y'|'  Mu  }'C(  D(G(  Mu  H(N(  O(R(  Mu  S(Y(  Z(](  Mu  ^(d(  e(h(  Mu  i(o(  p(s(  Mu  t(z(  {(~(  Mu  (E)  F)I)  Mu  J)P)  Q)T)  Mu  U)[)  \)_)  Mu  `)f)  g)j)  Mu  k)q)  r)u)  Mu  v)|)  })@*  Mu  A*G*  H*K*  Mu  L*R*  S*V*  Mu  W*]*  ^*a*  Mu  b*h*  i*l*  Mu  m*s*  t*w*  Mu  x*~*  *B+  Mu  C+I+  J+M+  Mu  N+T+  U+X+  Mu  Y+_+  `+c+  Mu  d+j+  k+n+  Mu  o+u+  v+y+  Mu  z+@,  A,D,  Mu  E,K,  L,O,  Mu  P,V,  W,Z,  Mu  [,a,  b,e,  Mu  f,l,  m,p,  Mu  q,w,  x,{,  Mu  |,B-  C-F-  Mu  G-M-  N-Q-  Mu  R-X-  Y-\-  Mu  ]-c-  d-g-  Mu  h-n-  o-r-  Mu  s-y-  z-}-  Mu  ~-D.  E.H.  Mu  I.O.  P.S.  Mu  T.Z.  [.^.  Mu  _.e.  f.i.  Mu  j.p.  q.t.  Mu  u.{.  |..  Mu  @/F/  G/J/  Mu  K/Q/  R/U/  Mu  V/\/  ]/`/  Mu  a/g/  h/k/  Mu  l/r/  s/v/  Mu  w/}/  ~/A0  Mu  B0H0  I0L0  Mu  M0S0  T0W0  Mu  X0^0  _0b0  Mu  c0i0  j0m0  Mu  n0t0  u0x0  Mu  y00  @1C1  Mu  D1J1  K1N1  Mu  O1U1  V1Y1  Mu  Z1`1  a1d1  Mu  e1k1  l1o1  Mu  p1v1  w1z1  Mu  {1A2  B2E2  Mu  F2L2  M2P2  Mu  Q2W2  X2[2  Mu  \2b2  c2f2  Mu  g2m2  n2q2  Mu  r2x2  y2|2  Mu  }2C3  D3G3  Mu  H3N3  O3R3  Mu  S3Y3  Z3]3  Mu  ^3d3  e3h3  Mu  i3o3  p3s3  Mu  t3z3  {3~3  Mu  3E4  F4I4  Mu  J4P4  Q4T4  Mu  U4[4  \4_4  Mu  `4f4  g4j4  Mu  k4q4  r4u4  Mu  v4|4  }4@5  Mu  A5G5  H5K5  Mu  L5R5  S5V5  Mu  W5]5  ^5a5  Mu  b5h5  i5l5  Mu  m5s5  t5w5  Mu  x5~5  5B6  Mu  C6I6  J6M6  Mu  N6T6  U6X6  Mu  Y6_6  `6c6  Mu  d6j6  k6n6  Mu  o6u6  v6y6  Mu  z6@7  A7D7  Mu  E7K7  L7O7  Mu  P7V7  W7Z7  Mu  [7a7  b7e7  Mu  f7l7  m7p7  Mu  q7w7  x7{7  Mu  |7B8  C8F8  Mu  G8M8  N8Q8  Mu  R8X8  Y8\8  Mu  ]8c8  d8g8  Mu  h8n8  o8r8  Mu  s8y8  z8}8  Mu  ~8D9  E9H9  Mu  I9O9  P9S9  Mu  T9Z9  [9^9  Mu  _9e9  f9i9  Mu  j9p9  q9t9  Mu  u9{9  |99  Mu  @:F:  G:J:  Mu  K:Q:  R:U:  Mu  V:\:  ]:`:  Mu  a:g:  h:k:  Mu  l:r:  s:v:  Mu  w:}:  ~:A;  Mu  B;H;  I;L;  Mu  M;S;  T;W;  Mu  X;^;  _;b;  Mu  c;i;  j;m;  Mu  n;t;  u;x;  Mu  y;;  @<C<  Mu  D<J<  K<N<  Mu  O<U<  V<Y<  Mu  Z<`<  a<d<  Mu  e<k<  l<o<  Mu  p<v<  w<z<  Mu  {<A=  B=E=  Mu  F=L=  M=P=  Mu  Q=W=  X=[=  Mu  \=b=  c=f=  Mu  g=m=  n=q=  Mu  r=x=  y=|=  Mu  }=C>  D>G>  Mu  H>N>  O>R>  Mu  S>Y>  Z>]>  Mu  ^>d>  e>h>  Mu  i>o>  p>s>  Mu  t>z>  {>~>  Mu  >E?  F?I?  Mu  J?P?  Q?T?  Mu  U?[?  \?_?  Mu  `?f?  g?j?  Mu  k?q?  r?u?  Mu  v?|?  }?@@  Mu  A@G@  H@K@  Mu  L@R@  S@V@  Mu  W@]@  ^@a@  Mu  b@h@  i@l@  Mu  m@s@  t@w@  Mu  x@~@  @BA  Mu  CAIA  JAMA  Mu  NATA  UAXA  Mu  YA_A  `AcA  Mu  dAjA  kAnA  Mu  oAuA  vAyA  Mu  zA@B  ABDB  Mu  EBKB  LBOB  Mu  PBVB  WBZB  Mu  [BaB  bBeB  Mu  fBlB  mBpB  Mu  qBwB  xB{B  Mu  |BBC  CCFC  Mu  GCMC  NCQC  Mu  RCXC  YC\C  Mu  ]CcC  dCgC  Mu  hCnC  oCrC  Mu  sCyC  zC}C  Mu  ~CDD  EDHD  Mu  IDOD  PDSD  Mu  TDZD  [D^D  Mu  _DeD  fDiD  Mu  jDpD  qDtD  Mu  uD{D  |DD  Mu  @EFE  GEJE  Mu  KEQE  REUE  Mu  VE\E  ]E`E  Mu  aEgE  hEkE  Mu  lErE  sEvE  Mu  wE}E  ~EAF  Mu  BFHF  IFLF  Mu  MFSF  TFWF  Mu  XF^F  _FbF  Mu  cFiF  jFmF  Mu  nFtF  uFxF  Mu  yFF  @GCG  Mu  DGJG  KGNG  Mu  OGUG  VGYG  Mu  ZG`G  aGdG  Mu  eGkG  lGoG  Mu  pGvG  wGzG  Mu  {GAH  BHEH  Mu  FHLH  MHPH  Mu  QHWH  XH[H  Mu  \HbH  cHfH  Mu  gHmH  nHqH  Mu  rHxH  yH|H  Mu  }HCI  DIGI  Mu  HINI  OIRI  Mu  SIYI  ZI]I  Mu  ^IdI  eIhI  Mu  iIoI  pIsI  Mu  tIzI  {I~I  Mu  IEJ  FJIJ  Mu  JJPJ  QJTJ  Mu  UJ[J  \J_J  Mu  `JfJ  gJjJ  Mu  kJqJ  rJuJ  Mu  vJ|J  }J@K  Mu  AKGK  HKKK  Mu  LKRK  SKVK  Mu  WK]K  ^KaK  Mu  bKhK  iKlK  Mu  mKsK  tKwK  Mu  xK~K  KBL  Mu  CLIL  JLLL  Mu  MLSL  TLVL  Mu  WL]L  ^L`L  Mu  aLgL  hLjL  Mu  kLqL  rLtL  Mu  uL{L  |L~L  Mu  LEM  FMHM  Mu  IMOM  PMRM  Mu  SMYM  ZM\M  Mu  ]McM  dMfM  Mu  gMmM  nMpM  Mu  qMwM  xMzM  Mu  {MAN  BNDN  Mu  ENKN  LNNN  Mu  ONUN  VNXN  Mu  YN_N  `NbN  Mu  cNiN  jNlN  Mu  mNsN  tNvN  Mu  wN}N  ~N@O  Mu  AOGO  HOJO  Mu  KOQO  ROTO  Mu  UO[O  \O^O  Mu  _OeO  fOhO  Mu  iOoO  pOrO  Mu  sOyO  zO|O  Mu  }OCP  DPFP  Mu  GPMP  NPPP  Mu  QPWP  XPZP  Mu  [PaP  bPdP  Mu  ePkP  lPnP  Mu  oPuP  vPxP  Mu  yPP  @QBQ  Mu  CQIQ  JQLQ  Mu  MQSQ  TQVQ  Mu  WQ]Q  ^Q`Q  Mu  aQgQ  hQjQ  Mu  kQqQ  rQtQ  Mu  uQ{Q  |Q~Q  Mu  QER  FRHR  Mu  IROR  PRRR  Mu  SRYR  ZR\R  Mu  ]RcR  dRfR  Mu  gRmR  nRpR  Mu  qRwR  xRzR  Mu  {RAS  BSDS  Mu  ESKS  LSNS  Mu  OSUS  VSXS  Mu  YS_S  `SbS  Mu  cSiS  jSlS  Mu  mSsS  tSvS  Mu  wS}S  ~S@T  Mu  ATGT  HTJT  Mu  KTQT  RTTT  Mu  UT[T  \T^T  Mu  _TeT  fThT  Mu  iToT  pTrT  Mu  sTyT  zT|T  Mu  }TCU  DUFU  Mu  GUMU  NUPU  Mu  QUWU  XUZU  Mu  [UaU  bUdU  Mu  eUkU  lUnU  Mu  oUuU  vUxU  Mu  yUU  @VBV  Mu  CVIV  JVLV  Mu  MVSV  TVVV  Mu  WV]V  ^V`V  Mu  aVgV  hVjV  Mu  kVqV  rVtV  Mu  uV{V  |V~V  Mu  VEW  FWHW  Mu  IWOW  PWRW  Mu  SWYW  ZW\W  Mu  ]WcW  dWfW  Mu  gWmW  nWpW  Mu  qWwW  xWzW  Mu  {WAX  BXDX  Mu  EXKX  LXNX  Mu  OXUX  VXXX  Mu  YX_X  `XbX  Mu  cXiX  jXlX  Mu  mXsX  tXvX  Mu  wX}X  ~X@Y  Mu  AYGY  HYJY  Mu  KYQY  RYTY  Mu  UY[Y  \Y^Y  Mu  _YeY  fYhY  Mu  iYoY  pYrY  Mu  sYyY  zY|Y  Mu  }YCZ  DZFZ  Mu  GZMZ  NZPZ  Mu  QZWZ  XZZZ  Mu  [ZaZ  bZdZ  Mu  eZkZ  lZnZ  Mu  oZuZ  vZxZ  Mu  yZZ  @[B[  Mu  C[I[  J[L[  Mu  M[S[  T[V[  Mu  W[][  ^[`[  Mu  a[g[  h[j[  Mu  k[q[  r[t[  Mu  u[{[  |[~[  Mu  [E\  F\H\  Mu  I\O\  P\R\  Mu  S\Y\  Z\\\  Mu  ]\c\  d\f\  Mu  g\m\  n\p\  Mu  q\w\  x\z\  Mu  {\A]  B]D]  Mu  E]K]  L]N]  Mu  O]U]  V]X]  Mu  Y]_]  `]b]  Mu  c]i]  j]l]  Mu  m]s]  t]v]  Mu  w]}]  ~]@^  Mu  A^G^  H^J^  Mu  K^Q^  R^T^  Mu  U^[^  \^^^  Mu  _^e^  f^h^  Mu  i^o^  p^r^  Mu  s^y^  z^|^  Mu  }^C_  D_F_  Mu  G_M_  N_P_  Mu  Q_W_  X_Z_  Mu  [_a_  b_d_  Mu  e_k_  l_n_  Mu  o_u_  v_x_  Mu  y__  @`B`  Mu  C`I`  J`L`  Mu  M`S`  T`V`  Mu  W`]`  ^```  Mu  a`g`  h`j`  Mu  k`q`  r`t`  Mu  u`{`  |`~`  Mu  `Ea  FaHa  Mu  IaOa  PaRa  Mu  SaYa  Za\a  Mu  ]aca  dafa  Mu  gama  napa  Mu  qawa  xaza  Mu  {aAb  BbDb  Mu  EbKb  LbNb  Mu  ObUb  VbXb  Mu  Yb_b  `bbb  Mu  cbib  jblb  Mu  mbsb  tbvb  Mu  wb}b  ~b@c  Mu  AcGc  HcJc  Mu  KcQc  RcTc  Mu  Uc[c  \c^c  Mu  _cec  fchc  Mu  icoc  pcrc  Mu  scyc  zc|c  Mu  }cCd  DdFd  Mu  GdMd  NdPd  Mu  QdWd  XdZd  Mu  [dad  bddd  Mu  edkd  ldnd  Mu  odud  vdxd  Mu  ydd  @eBe  Mu  CeIe  JeLe  Mu  MeSe  TeVe  Mu  We]e  ^e`e  Mu  aege  heje  Mu  keqe  rete  Mu  ue{e  |e~e  Mu  eEf  FfHf  Mu  IfOf  PfRf  Mu  SfYf  Zf\f  Mu  ]fcf  dfff  Mu  gfmf  nfpf  Mu  qfwf  xfzf  Mu  {fAg  BgDg  Mu  EgKg  LgNg  Mu  OgUg  VgXg  Mu  Yg_g  `gbg  Mu  cgig  jglg  Mu  mgsg  tgvg  Mu  wg}g  ~g@h  Mu  AhGh  HhJh  Mu  KhQh  RhTh  Mu  Uh[h  \h^h  Mu  _heh  fhhh  Mu  ihoh  phrh  Mu  shyh  zh|h  Mu  }hCi  DiFi  Mu  GiMi  NiPi  Mu  QiWi  XiZi  Mu  [iai  bidi  Mu  eiki  lini  Mu  oiui  vixi  Mu  yii  @jBj  Mu  CjIj  JjLj  Mu  MjSj  TjVj  Mu  Wj]j  ^j`j  Mu  ajgj  hjjj  Mu  kjqj  rjtj  Mu  uj{j  |j~j  Mu  jEk  FkHk  Mu  IkOk  PkRk  Mu  SkYk  Zk\k  Mu  ]kck  dkfk  Mu  gkmk  nkpk  Mu  qkwk  xkzk  Mu  {kAl  BlDl  Mu  ElKl  LlNl  Mu  OlUl  VlXl  Mu  Yl_l  `lbl  Mu  clil  jlll  Mu  mlsl  tlvl  Mu  wl}l  ~l@m  Mu  AmGm  HmJm  Mu  KmQm  RmTm  Mu  Um[m  \m^m  Mu  _mem  fmhm  Mu  imom  pmrm  Mu  smym  zm|m  Mu  }mCn  DnFn  Mu  GnMn  NnPn  Mu  QnWn  XnZn  Mu  [nan  bndn  Mu  enkn  lnmn  Mu  nntn  unvn  Mu  wn}n  ~nn  Mu  @oFo  GoHo  Mu  IoOo  PoQo  Mu  RoXo  YoZo  Mu  [oao  boco  Mu  dojo  kolo  Mu  moso  touo  Mu  vo|o  }o~o  Mu  oEp  FpGp  Mu  HpNp  OpPp  Mu  QpWp  XpYp  Mu  Zp`p  apbp  Mu  cpip  jpkp  Mu  lprp  sptp  Mu  up{p  |p}p  Mu  ~pDq  EqFq  Mu  GqMq  NqOq  Mu  PqVq  WqXq  Mu  Yq_q  `qaq  Mu  bqhq  iqjq  Mu  kqqq  rqsq  Mu  tqzq  {q|q  Mu  }qCr  DrEr  Mu  FrLr  MrNr  Mu  OrUr  VrWr  Mu  Xr^r  _r`r  Mu  argr  hrir  Mu  jrpr  qrrr  Mu  sryr  zr{r  Mu  |rBs  CsDs  Mu  EsKs  LsMs  Mu  UsVs  ^s_s  gshs  psqs  yszs  BtCt  KtLt  TtUt  ]t^t  ftgt  otpt  xtyt  AuBu  JuKu  Mu uYD  uYtD  uYd  uY4  uYT$  uYtD  uYQUVZ  uY[_`d  uYeijn  uYostx  uYy}  C  uY  DH  IM  uY  NR  SW  uY  X\  ]a  uY  bf  gk  uY  lp  qu  uY  vz  {  uY  @D  EI  uY  JN  OS  uY  TX  Y]  uY  ^b  cg  uY  hl  mq  uY  rv  w{  uY  |@  AE  uY  FJ  KO  uY  PT  UY  uY  Z^  _c  uY  dh  im  uY  nr  sw  uY  x|  }A  uY  BF  GK  uY  LP  QU  uY  VZ  [_  uY  `d  ei  uY  jn  os  uY  tx  y}  uY  ~B  CG  uY  HL  MQ  uY  RV  W[  uY  \`  ae  uY  fj  ko  uY  pt  uy  uY  z~  C  uY  DH  IM  uY  NR  SW  uY  X\  ]a  uY  bf  gk  uY  lp  qu  uY  vz  {  uY  @D  EI  uY  JN  OS  uY  TX  Y]  uY  ^b  cg  uY  hl  mq  uY  rv  w{  uY  |@	  A	E	  uY  F	J	  K	O	  uY  P	T	  U	Y	  uY  Z	^	  _	c	  uY  d	h	  i	m	  uY  n	r	  s	w	  uY  x	|	  }	A
  uY  B
F
  G
K
  uY  L
P
  Q
U
  uY  V
Z
  [
_
  uY  `
d
  e
i
  uY  j
n
  o
s
  uY  t
x
  y
}
  uY  ~
B  CG  uY  HL  MQ  uY  RV  W[  uY  \`  ae  uY  fj  ko  uY  pt  uy  uY  z~  C  uY  DH  IM  uY  NR  SW  uY  X\  ]a  uY  bf  gk  uY  lp  qu  uY  vz  {  uY  @D  EI  uY  JN  OS  uY  TX  Y]  uY  ^b  cg  uY  hl  mq  uY  rv  w{  uY  |@  AE  uY  FJ  KO  uY  PT  UY  uY  Z^  _c  uY  dh  im  uY  nr  sw  uY  x|  }A  uY  BF  GK  uY  LP  QU  uY  VZ  [_  uY  `d  ei  uY  jn  os  uY  tx  y}  uY  ~B  CG  uY  HL  MQ  uY  RV  W[  uY  \`  ae  uY  fj  ko  uY  pt  uy  uY  z~  C  uY  DH  IM  uY  NR  SW  uY  X\  ]a  uY  bf  gk  uY  lp  qu  uY  vz  {  uY  @D  EH  uY  IM  NQ  uY  RV  WZ  uY  [_  `c  uY  dh  il  uY  mq  ru  uY  vz  {~  uY  C  DG  uY  HL  MP  uY  QU  VY  uY  Z^  _b  uY  cg  hk  uY  lp  qt  uY  uy  z}  uY  ~B  CF  uY  GK  LO  uY  PT  UX  uY  Y]  ^a  uY  bf  gj  uY  ko  ps  uY  tx  y|  uY  }A  BE  uY  FJ  KN  uY  OS  TW  uY  X\  ]`  uY  ae  fi  uY  jn  or  uY  sw  x{  uY  |@  AD  uY  EI  JM  uY  NR  SV  uY  W[  \_  uY  `d  eh  uY  im  nq  uY  rv  wz  uY  {  @C  uY  DH  IL  uY  MQ  RU  uY  VZ  [^  uY  _c  dg  uY  hl  mp  uY  qu  vy  uY  z~  B  uY  CG  HK  uY  LP  QT  uY  UY  Z]  uY  ^b  cf  uY  gk  lo  uY  pt  ux  uY  y}  ~A  uY  BF  GJ  uY  KO  PS  uY  TX  Y\  uY  ]a  be  uY  fj  kn  uY  os  tw  uY  x|  }@  uY  AE  FI  uY  JN  OR  uY  SW  X[  uY  \`  ad  uY  ei  jm  uY  nr  sv  uY  w{  |  uY  @D  EH  uY  IM  NQ  uY  RV  WZ  uY  [_  `c  uY  dh  il  uY  mq  ru  uY  vz  {~  uY  C  DG  uY  HL  MP  uY  QU  VY  uY  Z^  _b  uY  cg  hk  uY  lp  qt  uY  uy  z}  uY  ~B  CF  uY  GK  LO  uY  PT  UX  uY  Y]  ^a  uY  bf  gj  uY  ko  ps  uY  tx  y|  uY  }A  BE  uY  FJ  KN  uY  OS  TW  uY  X\  ]`  uY  ae  fi  uY  jn  or  uY  sw  x{  uY  |@  AD  uY  EI  JM  uY  NR  SV  uY  W[  \_  uY  `d  eh  uY  im  nq  uY  rv  wz  uY  {  @ C   uY  D H   I L   uY  M Q   R U   uY  V Z   [ ^   uY  _ c   d g   uY  h l   m p   uY  q u   v y   uY  z ~    B!  uY  C!G!  H!K!  uY  L!P!  Q!T!  uY  U!Y!  Z!]!  uY  ^!b!  c!f!  uY  g!k!  l!o!  uY  p!t!  u!x!  uY  y!}!  ~!A"  uY  B"F"  G"J"  uY  K"O"  P"S"  uY  T"X"  Y"\"  uY  ]"a"  b"e"  uY  f"j"  k"n"  uY  o"s"  t"w"  uY  x"|"  }"@#  uY  A#E#  F#I#  uY  J#N#  O#R#  uY  S#W#  X#[#  uY  \#`#  a#d#  uY  e#i#  j#m#  uY  n#r#  s#v#  uY  w#{#  |##  uY  @$D$  E$H$  uY  I$M$  N$Q$  uY  R$V$  W$Z$  uY  [$_$  `$c$  uY  d$h$  i$l$  uY  m$q$  r$u$  uY  v$z$  {$~$  uY  $C%  D%G%  uY  H%L%  M%P%  uY  Q%U%  V%Y%  uY  Z%^%  _%b%  uY  c%g%  h%k%  uY  l%p%  q%t%  uY  u%y%  z%}%  uY  ~%B&  C&F&  uY  G&K&  L&O&  uY  P&T&  U&X&  uY  Y&]&  ^&a&  uY  b&f&  g&j&  uY  k&o&  p&s&  uY  t&x&  y&|&  uY  }&A'  B'E'  uY  F'J'  K'N'  uY  O'S'  T'W'  uY  X'\'  ]'`'  uY  a'e'  f'i'  uY  j'n'  o'r'  uY  s'w'  x'{'  uY  |'@(  A(D(  uY  E(I(  J(M(  uY  N(R(  S(V(  uY  W([(  \(_(  uY  `(d(  e(h(  uY  i(m(  n(q(  uY  r(v(  w(z(  uY  {((  @)C)  uY  D)H)  I)L)  uY  M)Q)  R)U)  uY  V)Z)  [)^)  uY  _)c)  d)g)  uY  h)l)  m)p)  uY  q)u)  v)y)  uY  z)~)  )B*  uY  C*G*  H*K*  uY  L*P*  Q*T*  uY  U*Y*  Z*]*  uY  ^*b*  c*f*  uY  g*k*  l*o*  uY  p*t*  u*x*  uY  y*}*  ~*A+  uY  B+F+  G+J+  uY  K+O+  P+S+  uY  T+X+  Y+\+  uY  ]+a+  b+e+  uY  f+j+  k+n+  uY  o+s+  t+w+  uY  x+|+  }+@,  uY  A,E,  F,I,  uY  J,N,  O,R,  uY  S,W,  X,[,  uY  \,`,  a,d,  uY  e,i,  j,m,  uY  n,r,  s,v,  uY  w,{,  |,,  uY  @-D-  E-H-  uY  I-M-  N-Q-  uY  R-V-  W-Z-  uY  [-_-  `-c-  uY  d-h-  i-l-  uY  m-q-  r-u-  uY  v-z-  {-~-  uY  -C.  D.G.  uY  H.L.  M.P.  uY  Q.U.  V.Y.  uY  Z.^.  _.b.  uY  c.g.  h.k.  uY  l.p.  q.t.  uY  u.y.  z.}.  uY  ~.B/  C/F/  uY  G/K/  L/O/  uY  P/T/  U/X/  uY  Y/]/  ^/a/  uY  b/f/  g/j/  uY  k/o/  p/s/  uY  t/x/  y/|/  uY  }/A0  B0E0  uY  F0J0  K0N0  uY  O0S0  T0W0  uY  X0\0  ]0`0  uY  a0e0  f0i0  uY  j0n0  o0r0  uY  s0w0  x0{0  uY  |0@1  A1D1  uY  E1I1  J1M1  uY  N1R1  S1V1  uY  W1[1  \1_1  uY  `1d1  e1h1  uY  i1m1  n1q1  uY  r1v1  w1z1  uY  {11  @2C2  uY  D2H2  I2L2  uY  M2Q2  R2U2  uY  V2Z2  [2^2  uY  _2c2  d2g2  uY  h2l2  m2p2  uY  q2u2  v2y2  uY  z2~2  2B3  uY  C3G3  H3K3  uY  L3P3  Q3T3  uY  U3Y3  Z3]3  uY  ^3b3  c3f3  uY  g3k3  l3o3  uY  p3t3  u3x3  uY  y3}3  ~3A4  uY  B4F4  G4J4  uY  K4O4  P4S4  uY  T4X4  Y4\4  uY  ]4a4  b4e4  uY  f4j4  k4n4  uY  o4s4  t4w4  uY  x4|4  }44  uY  @5D5  E5G5  uY  H5L5  M5O5  uY  P5T5  U5W5  uY  X5\5  ]5_5  uY  `5d5  e5g5  uY  h5l5  m5o5  uY  p5t5  u5w5  uY  x5|5  }55  uY  @6D6  E6G6  uY  H6L6  M6O6  uY  P6T6  U6W6  uY  X6\6  ]6_6  uY  `6d6  e6g6  uY  h6l6  m6o6  uY  p6t6  u6w6  uY  x6|6  }66  uY  @7D7  E7G7  uY  H7L7  M7O7  uY  P7T7  U7W7  uY  X7\7  ]7_7  uY  `7d7  e7g7  uY  h7l7  m7o7  uY  p7t7  u7w7  uY  x7|7  }77  uY  @8D8  E8G8  uY  H8L8  M8O8  uY  P8T8  U8W8  uY  X8\8  ]8_8  uY  `8d8  e8g8  uY  h8l8  m8o8  uY  p8t8  u8w8  uY  x8|8  }88  uY  @9D9  E9G9  uY  H9L9  M9O9  uY  P9T9  U9W9  uY  X9\9  ]9_9  uY  `9d9  e9g9  uY  h9l9  m9o9  uY  p9t9  u9w9  uY  x9|9  }99  uY  @:D:  E:G:  uY  H:L:  M:O:  uY  P:T:  U:W:  uY  X:\:  ]:_:  uY  `:d:  e:g:  uY  h:l:  m:o:  uY  p:t:  u:w:  uY  x:|:  }::  uY  @;D;  E;G;  uY  H;L;  M;O;  uY  P;T;  U;W;  uY  X;\;  ];_;  uY  `;d;  e;g;  uY  h;l;  m;o;  uY  p;t;  u;w;  uY  x;|;  };;  uY  @<D<  E<G<  uY  H<L<  M<O<  uY  P<T<  U<W<  uY  X<\<  ]<_<  uY  `<d<  e<g<  uY  h<l<  m<o<  uY  p<t<  u<w<  uY  x<|<  }<<  uY  @=D=  E=G=  uY  H=L=  M=O=  uY  P=T=  U=W=  uY  X=\=  ]=_=  uY  `=d=  e=g=  uY  h=l=  m=o=  uY  p=t=  u=w=  uY  x=|=  }==  uY  @>D>  E>G>  uY  H>L>  M>O>  uY  P>T>  U>W>  uY  X>\>  ]>_>  uY  `>d>  e>g>  uY  h>l>  m>o>  uY  p>t>  u>w>  uY  x>|>  }>>  uY  @?D?  E?G?  uY  H?L?  M?O?  uY  P?T?  U?W?  uY  X?\?  ]?_?  uY  `?d?  e?g?  uY  h?l?  m?o?  uY  p?t?  u?w?  uY  x?|?  }??  uY  @@D@  E@G@  uY  H@L@  M@O@  uY  P@T@  U@W@  uY  X@\@  ]@_@  uY  `@d@  e@g@  uY  h@l@  m@o@  uY  p@t@  u@w@  uY  x@|@  }@@  uY  @ADA  EAGA  uY  HALA  MAOA  uY  PATA  UAWA  uY  XA\A  ]A_A  uY  `AdA  eAgA  uY  hAlA  mAoA  uY  pAtA  uAwA  uY  xA|A  }AA  uY  @BDB  EBGB  uY  HBLB  MBOB  uY  PBTB  UBWB  uY  XB\B  ]B_B  uY  `BdB  eBgB  uY  hBlB  mBoB  uY  pBtB  uBwB  uY  xB|B  }BB  uY  @CDC  ECGC  uY  HCLC  MCOC  uY  PCTC  UCWC  uY  XC\C  ]C_C  uY  `CdC  eCgC  uY  hClC  mCoC  uY  pCtC  uCwC  uY  xC|C  }CC  uY  @DDD  EDGD  uY  HDLD  MDOD  uY  PDTD  UDWD  uY  XD\D  ]D_D  uY  `DdD  eDgD  uY  hDlD  mDoD  uY  pDtD  uDwD  uY  xD|D  }DD  uY  @EDE  EEGE  uY  HELE  MEOE  uY  PETE  UEWE  uY  XE\E  ]E_E  uY  `EdE  eEgE  uY  hElE  mEoE  uY  pEtE  uEwE  uY  xE|E  }EE  uY  @FDF  EFGF  uY  HFLF  MFOF  uY  PFTF  UFWF  uY  XF\F  ]F_F  uY  `FdF  eFgF  uY  hFlF  mFoF  uY  pFtF  uFwF  uY  xF|F  }FF  uY  @GDG  EGGG  uY  HGLG  MGOG  uY  PGTG  UGWG  uY  XG\G  ]G_G  uY  `GdG  eGgG  uY  hGlG  mGoG  uY  pGtG  uGwG  uY  xG|G  }GG  uY  @HDH  EHGH  uY  HHLH  MHOH  uY  PHTH  UHWH  uY  XH\H  ]H_H  uY  `HdH  eHgH  uY  hHlH  mHoH  uY  pHtH  uHvH  uY  wH{H  |H}H  uY  ~HBI  CIDI  uY  EIII  JIKI  uY  LIPI  QIRI  uY  SIWI  XIYI  uY  ZI^I  _I`I  uY  aIeI  fIgI  uY  hIlI  mInI  uY  oIsI  tIuI  uY  vIzI  {I|I  uY  }IAJ  BJCJ  uY  DJHJ  IJJJ  uY  KJOJ  PJQJ  uY  RJVJ  WJXJ  uY  YJ]J  ^J_J  uY  `JdJ  eJfJ  uY  gJkJ  lJmJ  uY  nJrJ  sJtJ  uY  uJyJ  zJ{J  uY  |J@K  AKBK  uY  CKGK  HKIK  uY  JKNK  OKPK  uY  QKUK  VKWK  uY  XK\K  ]K^K  uY  _KcK  dKeK  uY  fKjK  kKlK  uY  mKqK  rKsK  uY  tKxK  yKzK  uY  {KK  @LAL  uY  BLFL  GLHL  uY  ILML  NLOL  uY  PLTL  ULVL  uY  WL[L  \L]L  uY  ^LbL  cLdL  uY  eLiL  jLkL  uY  lLpL  qLrL  uY  sLwL  xLyL  uY  zL~L  L@M  uY  AMEM  FMGM  uY  HMLM  MMNM  uY  OMSM  TMUM  uY  VMZM  [M\M  uY  ]MaM  bMcM  uY  dMhM  iMjM  uY  kMoM  pMqM  uY  rMvM  wMxM  uY  yM}M  ~MM  uY  @NDN  ENFN  uY  GNKN  LNMN  uY  NNRN  SNTN  uY  UNYN  ZN[N  uY  \N`N  aNbN  uY  cNgN  hNiN  uY  jNnN  oNpN  uY  qNuN  vNwN  uY  xN|N  }N~N  uY  NCO  DOEO  uY  FOJO  KOLO  uY  MOQO  ROSO  uY  TOXO  YOZO  uY  [O_O  `OaO  uY  bOfO  gOhO  uY  iOmO  nOoO  uY  pOtO  uOvO  uY  wO{O  |O}O  uY  ~OBP  CPDP  uY  EPIP  JPKP  uY  LPPP  QPRP  uY  SPWP  XPYP  uY  ZP^P  _P`P  uY  aPeP  fPgP  uY  hPlP  mPnP  uY  oPsP  tPuP  uY  vPzP  {P|P  uY  }PAQ  BQCQ  uY  DQHQ  IQJQ  uY  KQOQ  PQQQ  uY  RQVQ  WQXQ  uY  YQ]Q  ^Q_Q  uY  `QdQ  eQfQ  uY  gQkQ  lQmQ  uY  nQrQ  sQtQ  uY  uQyQ  zQ{Q  uY  |Q@R  ARBR  uY  CRGR  HRIR  uY  JRNR  ORPR  uY  QRUR  VRWR  uY  XR\R  ]R^R  uY  _RcR  dReR  uY  fRjR  kRlR  uY  mRqR  rRsR  uY  tRxR  yRzR  uY  {RR  @SAS  uY  BSFS  GSHS  uY  ISMS  NSOS  uY  PSTS  USVS  uY  WS[S  \S]S  uY  ^SbS  cSdS  uY  eSiS  jSkS  uY  lSpS  qSrS  uY  sSwS  xSyS  uY  zS~S  S@T  uY  ATET  FTGT  uY  HTLT  MTNT  uY  OTST  TTUT  uY  VTZT  [T\T  uY  ]TaT  bTcT  uY  dThT  iTjT  uY  kToT  pTqT  uY  rTvT  wTxT  uY  yT}T  ~TT  uY  @UDU  EUFU  uY  GUKU  LUMU  uY  NURU  SUTU  uY  UUYU  ZU[U  uY  \U`U  aUbU  uY  cUgU  hUiU  uY  jUnU  oUpU  uY  qUuU  vUwU  uY  xU|U  }U~U  uY  UCV  DVEV  uY  FVJV  KVLV  uY  MVQV  RVSV  uY  TVXV  YVZV  uY  [V_V  `VaV  uY  bVfV  gVhV  uY  iVmV  nVoV  uY  pVtV  uVvV  uY  wV{V  |V}V  uY  ~VBW  CWDW  uY  EWIW  JWKW  uY  LWPW  QWRW  uY  SWWW  XWYW  uY  ZW^W  _W`W  uY  aWeW  fWgW  uY  hWlW  mWnW  uY  oWsW  tWuW  uY  vWzW  {W|W  uY  }WAX  BXCX  uY  DXHX  IXJX  uY  KXOX  PXQX  uY  RXVX  WXXX  uY  ^X_X  eXfX  lXmX  sXtX  zX{X  AYBY  HYIY  OYPY  VYWY  ]Y^Y  dYeY  kYlY  rYsY  uY0 M
L
s7G$
%
s7G$
%	*Dh3 h h ht h,G^# ^$ ^  (2!D !3 2r-   