§
    ~À¶jJ  ã                  ór   — d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
mZ ddlZdd	„Zd
„ Zd„ Zd„ Zd„ Zd„ ZdS )z�Automated Architecture Boundary Enforcement & DDD Conformance Suite.
Enforces Hexagonal Architecture (Ports & Adapters) and Domain-Driven Design boundaries.
é    )ÚannotationsN)ÚPathÚ	directoryr   Úreturnú
list[Path]c                ó@   — d„ |                       d¦  «        D ¦   «         S )Nc                ó$   — g | ]}d |j         v¯|‘ŒS )Ú__pycache__©Úparts©Ú.0Úps     úBC:\Projects\DSCons\tests\test_architecture_boundary_enforcement.pyú
<listcomp>z(get_all_python_files.<locals>.<listcomp>   s$   € ÐOÐOÐO�!°-ÀqÄwÐ2NÐ2NˆAÐ2NÐ2NÐ2Nó    ú*.py)Úrglob)r   s    r   Úget_all_python_filesr      s"   € ØOÐO�y—’ vÑ.Ô.ÐOÑOÔOÐOr   c                 ó(  — t          d¦  «        } t          | ¦  «        }ddg}g }|D ]S}d|                     ¦   «         v rŒ|                     d¬¦  «        }|D ]!}||v r|                     |› d|› d�¦  «         Œ"ŒT| }|s�t          j        d	d
                     |¦  «        z   ¦  «        dz   ddt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndiz  }t          t          j        |¦  «        ¦  «        ‚d}dS )zRVerify no module calls external LLM REST endpoints directly, bypassing AI Gateway.úapp/modulesz-https://openrouter.ai/api/v1/chat/completionsz)https://generativelanguage.googleapis.comz"app/modules/agents/application/llmúutf-8©Úencodingz: Found direct LLM URL 'ú'z#Architectural violations detected:
ú
ú
>assert not %(py0)sÚpy0Ú
violationsN)r   r   Úas_posixÚ	read_textÚappendÚ
@pytest_arÚ_format_assertmsgÚjoinÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)	Úmodules_dirÚpy_filesÚforbidden_patternsr   Ú	file_pathÚcontentÚpatternÚ@py_assert1Ú@py_format2s	            r   Ú)test_zero_direct_llm_api_calls_in_modulesr4      s^  € å�}Ñ%Ô%€KÝ# KÑ0Ô0€Hð 	8Ø3ðÐð
 €JØð Tð Tˆ	à/°9×3EÒ3EÑ3GÔ3GÐGÐGØØ×%Ò%¨wÐ%Ñ7Ô7ˆØ)ð 	Tð 	TˆGØ˜'Ð!Ð!Ø×!Ò! YÐ"RÐ"RÈÐ"RÐ"RÐ"RÑSÔSÐSøð	Tð ˆ>ÐZˆ>ÐZÕZÔZÐBÀTÇYÂYÈzÑEZÔEZÑZÑZÔZÐZÑZÐZÐZÕZÔZÑZÔZÐZÐZÕZÔZˆzÑZÔZÐZÕZÔZˆzÑZÔZÐZÐZÐZÑZÐZÕZÕZÔZÐZÑZÔZÑZÔZÐZÐZÐZÐZÐZr   c                 ó:  — d„ t          d¦  «                             d¦  «        D ¦   «         } g d¢}g }| D ]N}|                     d¬¦  «                             ¦   «         }|D ]!}||v r|                     |› d|› d�¦  «         Œ"ŒO| }|s�t          j        d	d
                     |¦  «        z   ¦  «        dz   ddt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndiz  }t          t          j        |¦  «        ¦  «        ‚d}dS )zRVerify presentation layer contains zero raw DDL (CREATE/ALTER/DROP TABLE) queries.c                ó6   — g | ]}d |j         v ¯d|j         v¯|‘ŒS ©Úpresentationr
   r   r   s     r   r   z;test_zero_raw_ddl_in_presentation_layer.<locals>.<listcomp>)   ó;   € ð ð ð ØØ˜QœWÐ$Ð$¨¸a¼gÐ)EÐ)Eð 	
Ø)EÐ)EÐ)Er   r   r   )zCREATE TABLEzALTER TABLEz
DROP TABLEr   r   z: Found raw DDL keyword 'ú' in presentation layerz%Raw DDL found in presentation layer:
r   r   r   r   N)r   r   r!   Úupperr"   r#   r$   r%   r&   r'   r(   r)   r*   r+   )Úpresentation_filesÚddl_keywordsr   r/   r0   Úkwr2   r3   s           r   Ú'test_zero_raw_ddl_in_presentation_layerr?   '   sf  € ðð Ý˜Ñ&Ô&×,Ò,¨VÑ4Ô4ðñ ô Ðð
 AÐ@Ð@€LØ€Jà'ð fð fˆ	Ø×%Ò%¨wÐ%Ñ7Ô7×=Ò=Ñ?Ô?ˆØð 	fð 	fˆBØ�Wˆ}ˆ}Ø×!Ò! YÐ"dÐ"dÈÐ"dÐ"dÐ"dÑeÔeÐeøð	fð ˆ>Ð\ˆ>Ð\Õ\Ô\ÐDÀtÇyÂyÐQ[ÑG\ÔG\Ñ\Ñ\Ô\Ð\Ñ\Ð\Ð\Õ\Ô\Ñ\Ô\Ð\Ð\Õ\Ô\ˆzÑ\Ô\Ð\Õ\Ô\ˆzÑ\Ô\Ð\Ð\Ð\Ñ\Ð\Õ\Õ\Ô\Ð\Ñ\Ô\Ñ\Ô\Ð\Ð\Ð\Ð\Ð\r   c                 ó  — d„ t          d¦  «                             d¦  «        D ¦   «         } g }ddg}| D ]<}|                     d¬¦  «        }|D ]!}||v r|                     |› d|› d	�¦  «         Œ"Œ=| }|s�t	          j        d
d                     |¦  «        z   ¦  «        dz   ddt          j        ¦   «         v st	          j	        |¦  «        rt	          j
        |¦  «        ndiz  }t          t	          j        |¦  «        ¦  «        ‚d}dS )zZVerify presentation layer contains zero raw SQL executions (cursor.execute / cur.execute).c                ó6   — g | ]}d |j         v ¯d|j         v¯|‘ŒS r7   r   r   s     r   r   z;test_zero_raw_sql_in_presentation_layer.<locals>.<listcomp><   r9   r   r   r   zcursor.execute(zcur.execute(r   r   z: Found raw SQL execution 'r:   zCRaw SQL executions found in presentation layer (Rule 6 violation):
r   r   r   r   N)r   r   r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   )r<   r   Úsql_exec_patternsr/   r0   r1   r2   r3   s           r   Ú'test_zero_raw_sql_in_presentation_layerrC   :   s^  € ðð Ý˜Ñ&Ô&×,Ò,¨VÑ4Ô4ðñ ô Ðð
 €JØ*¨NÐ;Ðà'ð mð mˆ	Ø×%Ò%¨wÐ%Ñ7Ô7ˆØ(ð 	mð 	mˆGØ˜'Ð!Ð!Ø×!Ò! YÐ"kÐ"kÈ7Ð"kÐ"kÐ"kÑlÔlÐløð	mð ˆ>Ðzˆ>ÐzÕzÔzÐbÐei×enÒenÐoyÑezÔezÑzÑzÔzÐzÑzÐzÐzÕzÔzÑzÔzÐzÐzÕzÔzˆzÑzÔzÐzÕzÔzˆzÑzÔzÐzÐzÐzÑzÐzÕzÕzÔzÐzÑzÔzÑzÔzÐzÐzÐzÐzÐzr   c            
     óV  ‡	— t          d¦  «        t          d¦  «        t          d¦  «        t          d¦  «        t          d¦  «        t          d¦  «        t          d¦  «        g} h d£}g }| D �]"}|                     ¦   «         sŒt          |¦  «        D ]ú}t          j        |                     d	¬
¦  «        t          |¦  «        ¬¦  «        }t          j        |¦  «        D ]¬Š	t          ‰	t          j	        ¦  «        r4‰	j
        D ]+}|j        |v r |                     |› d|j        › d�¦  «         Œ,ŒPt          ‰	t          j        ¦  «        rB‰	j        r;t          ˆ	fd„|D ¦   «         ¦  «        r |                     |› d‰	j        › d�¦  «         Œ­Œû�Œ$| }|s�t!          j        dd                     |¦  «        z   ¦  «        dz   ddt'          j        ¦   «         v st!          j        |¦  «        rt!          j        |¦  «        ndiz  }t/          t!          j        |¦  «        ¦  «        ‚d}dS )z`Verify application & domain layers in operations and zalo_crm do not import direct HTTP clients.z"app/modules/operations/applicationzapp/modules/operations/domainz app/modules/zalo_crm/applicationzapp/modules/zalo_crm/domainz app/modules/invoices/applicationzapp/modules/invoices/domainzapp/modules/core/domain>   úurllib.requestÚhttpxÚrequestsr   r   )Úfilenamez: Illegal direct import 'r   c              3  óh   •K  — | ],}‰j         |k    p‰j                              |› d �¦  «        V — Œ-dS )ú.N)ÚmoduleÚ
startswith)r   ÚmodÚnodes     €r   ú	<genexpr>z@test_application_and_domain_network_isolation.<locals>.<genexpr>h   sb   øè è € ð  +Að  +AÐgj¨4¬;¸#Ò+=Ð+bÀÄ×AWÒAWÐ[^ÐXaÐXaÐXaÑAbÔAbð  +Að  +Að  +Að  +Að  +Að  +Ar   z: Illegal from-import 'z;Network isolation violations in domain/application layers:
r   r   r   r   N)r   Úexistsr   ÚastÚparser!   ÚstrÚwalkÚ
isinstanceÚImportÚnamesÚnamer"   Ú
ImportFromrK   Úanyr#   r$   r%   r&   r'   r(   r)   r*   r+   )
Útarget_dirsÚforbidden_modulesr   Úbase_dirr/   ÚtreeÚaliasr2   r3   rN   s
            @r   Ú-test_application_and_domain_network_isolationr`   N   s›  ø€ õ 	Ð1Ñ2Ô2ÝÐ,Ñ-Ô-ÝÐ/Ñ0Ô0ÝÐ*Ñ+Ô+ÝÐ/Ñ0Ô0ÝÐ*Ñ+Ô+ÝÐ&Ñ'Ô'ð€Kð @Ð?Ð?ÐØ€Jàð _ñ _ˆØ�ŠÑ Ô ð 	ØÝ-¨hÑ7Ô7ð 		_ð 		_ˆIÝ”9˜Y×0Ò0¸'Ð0ÑBÔBÍSÐQZÉ^Ì^Ð\Ñ\Ô\ˆDÝœ ™œð _ð _�Ý˜d¥C¤JÑ/Ô/ð _Ø!%¤ð dð d˜Ø œ:Ð):Ð:Ð:Ø&×-Ò-°Ð.bÐ.bÐUZÔU_Ð.bÐ.bÐ.bÑcÔcÐcøðdõ   ¥c¤nÑ5Ô5ð _Ø”{ð _¥sð  +Að  +Að  +Að  +AÐnð  +Añ  +Aô  +Añ  (Aô  (Að _Ø"×)Ò)¨YÐ*]Ð*]ÈtÌ{Ð*]Ð*]Ð*]Ñ^Ô^Ð^øð_ñ		_ð ˆ>Ðrˆ>ÐrÕrÔrÐZÐ]a×]fÒ]fÐgqÑ]rÔ]rÑrÑrÔrÐrÑrÐrÐrÕrÔrÑrÔrÐrÐrÕrÔrˆzÑrÔrÐrÕrÔrˆzÑrÔrÐrÐrÐrÑrÐrÕrÕrÔrÐrÑrÔrÑrÔrÐrÐrÐrÐrÐrr   c                 ój  — ddl m}  ddlm} g }t	          || ¦  «        }|}|sd}t          ||¦  «        }|}|�sûddt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddt          j        ¦   «         v st          j	        | ¦  «        rt          j
        | ¦  «        ndt          j
        |¦  «        d	œz  }|                     |¦  «         |sÇd
dt          j        ¦   «         v st          j	        t
          ¦  «        rt          j
        t
          ¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }|                     |¦  «         t          j        |d¦  «        i z  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}x}x}}ddlm} ddlm} g }t	          ||¦  «        }|}|sd}t          ||¦  «        }|}|�sûddt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        d	œz  }|                     |¦  «         |sÇd
dt          j        ¦   «         v st          j	        t
          ¦  «        rt          j
        t
          ¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }|                     |¦  «         t          j        |d¦  «        i z  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}x}x}}ddlm} ddlm} g }t	          ||¦  «        }|}|sd}t          ||¦  «        }|}|�sûddt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        d	œz  }|                     |¦  «         |sÇd
dt          j        ¦   «         v st          j	        t
          ¦  «        rt          j
        t
          ¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }|                     |¦  «         t          j        |d¦  «        i z  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}x}x}}ddlm} ddlm} g }t	          ||¦  «        }|}|sd}t          ||¦  «        }|}|�sûddt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        d	œz  }|                     |¦  «         |sÇd
dt          j        ¦   «         v st          j	        t
          ¦  «        rt          j
        t
          ¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }|                     |¦  «         t          j        |d¦  «        i z  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}x}x}}ddlm} dd lm} g }t	          ||¦  «        }|}|sd!}t          ||¦  «        }|}|�sûddt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        ndd"t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd"d#t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd#t          j
        |¦  «        d	œz  }|                     |¦  «         |sÇd
dt          j        ¦   «         v st          j	        t
          ¦  «        rt          j
        t
          ¦  «        ndd"t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd"t          j
        |¦  «        t          j
        |¦  «        dœz  }|                     |¦  «         t          j        |d¦  «        i z  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}x}x}}dd$lm } dd%l!m"} g }t	          ||¦  «        }|}|sd&}t          ||¦  «        }|}|�sûddt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        ndd't          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd'd(t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd(t          j
        |¦  «        d	œz  }|                     |¦  «         |sÇd
dt          j        ¦   «         v st          j	        t
          ¦  «        rt          j
        t
          ¦  «        ndd't          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd't          j
        |¦  «        t          j
        |¦  «        dœz  }|                     |¦  «         t          j        |d¦  «        i z  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}x}x}}dd)l#m$} dd*l%m&} g }t	          ||¦  «        }|}|sd+}t          ||¦  «        }|}|�sûddt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        ndd,t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd,d-t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd-t          j
        |¦  «        d	œz  }|                     |¦  «         |sÇd
dt          j        ¦   «         v st          j	        t
          ¦  «        rt          j
        t
          ¦  «        ndd,t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd,t          j
        |¦  «        t          j
        |¦  «        dœz  }|                     |¦  «         t          j        |d¦  «        i z  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}x}x}}dS ).zcVerify all domain ports and infrastructure adapters are defined and adhere to protocol conventions.r   )ÚEmailNotificationPort)ÚBrevoEmailAdapterÚ
send_emailz.%(py6)s
{%(py6)s = %(py2)s(%(py3)s, %(py4)s)
}Ú
issubclassrc   rb   )Úpy2Úpy3Úpy4Úpy6z1%(py13)s
{%(py13)s = %(py8)s(%(py9)s, %(py11)s)
}Úhasattr)Úpy8Úpy9Úpy11Úpy13é   zassert %(py16)sÚpy16N)ÚTelegramPort)ÚTelegramHttpAdapterÚsend_messagerr   rq   )ÚEquipmentRepositoryPort)ÚPostgresEquipmentRepositoryÚrecord_fuel_logru   rt   )ÚZaloGatewayPort)ÚZaloHttpAdapterrx   rw   )ÚZaloCrmRepositoryPort)ÚPostgresZaloCrmRepositoryÚupsert_contactrz   ry   )ÚISxdCrawlerPort)ÚSxdStealthCrawlerAdapterÚcrawl_latest_announcementsr}   r|   )ÚGdtGatewayPort)ÚGdtPortalAdapterÚauthenticate_portalr€   r   )'Ú/app.modules.core.domain.ports.notification_portrb   Ú6app.modules.core.infrastructure.adapters.brevo_adapterrc   re   rj   r&   r'   r#   r(   r)   r"   Ú_format_boolopr*   r+   Ú3app.modules.integrations.domain.ports.telegram_portrq   ÚAapp.modules.integrations.infrastructure.adapters.telegram_adapterrr   Ú=app.modules.operations.domain.ports.equipment_repository_portrt   ÚGapp.modules.operations.infrastructure.repositories.equipment_repositoryru   Ú3app.modules.zalo_crm.domain.ports.zalo_gateway_portrw   Ú>app.modules.zalo_crm.infrastructure.adapters.zalo_http_adapterrx   Ú:app.modules.zalo_crm.domain.ports.zalo_crm_repository_portry   ÚDapp.modules.zalo_crm.infrastructure.repositories.zalo_crm_repositoryrz   Ú3app.modules.inventory.domain.ports.sxd_crawler_portr|   ÚIapp.modules.inventory.infrastructure.adapters.sxd_stealth_crawler_adapterr}   Ú2app.modules.invoices.domain.ports.gdt_gateway_portr   Ú<app.modules.invoices.infrastructure.adapters.gdt.gdt_adapterr€   )rb   rc   r2   Ú@py_assert5Ú@py_assert0Ú@py_assert10Ú@py_assert12Ú@py_format7Ú@py_format14Ú@py_format15Ú@py_format17rq   rr   rt   ru   rw   rx   ry   rz   r|   r}   r   r€   s                          r   Ú!test_ports_and_adapters_contractsr™   n   sg  € ð VÐUÐUÐUÐUÐUØXÐXÐXÐXÐXÐXØkÐk�:Ð'Ð)>Ñ?Ô?ÐkÐ?ÐkÐ?ÐkÐ^jÐkÅ7ÐK\Ð^jÑCkÔCkÐkÐCkÐkÐkÑkÐkÐkÕkÔkÑkÔkÐkÐkÕkÔk�:ÑkÔkÐkÕkÔk�:ÑkÔkÐkÐkÐkÕkÔkÑkÔkÐkÐkÕkÔkÐ'ÑkÔkÐkÕkÔkÐ'ÑkÔkÐkÐkÐkÕkÔkÑkÔkÐkÐkÕkÔkÐ)>ÑkÔkÐkÕkÔkÐ)>ÑkÔkÐkÐkÕkÔkÐ?ÑkÔkÐkÐkÑkÐkÐk×kÒkÐkÑkÔkÐkÐ?ÐkÐkÐkÕkÔkÑkÔkÐkÐkÕkÔkÅ7ÑkÔkÐkÕkÔkÅ7ÑkÔkÐkÐkÐkÕkÔkÑkÔkÐkÐkÕkÔkÐK\ÑkÔkÐkÕkÔkÐK\ÑkÔkÐkÐkÕkÔkÐ^jÑkÔkÕkÔkÐCkÑkÔkÐkÐkÑkÐkÐk×kÒkÐkÑkÔkÐkÕkÔkÐkÐkÑkÔkÐkÑkÐkÐkÐkÐkÐkÑkÐkÕkÕkÔkÐkÑkÔkÑkÔkÐkÐkÐkÐkÐkÐkÐkÐkÐkÐkÐkð QÐPÐPÐPÐPÐPØeÐeÐeÐeÐeÐeØhÐh�:Ð)¨<Ñ8Ô8ÐhÐ8ÐhÐ8ÐhÐYgÐh½GÐDWÐYgÑ<hÔ<hÐhÐ<hÐhÐhÑhÐhÐhÕhÔhÑhÔhÐhÐhÕhÔh�:ÑhÔhÐhÕhÔh�:ÑhÔhÐhÐhÐhÕhÔhÑhÔhÐhÐhÕhÔhÐ)ÑhÔhÐhÕhÔhÐ)ÑhÔhÐhÐhÐhÕhÔhÑhÔhÐhÐhÕhÔh¨<ÑhÔhÐhÕhÔh¨<ÑhÔhÐhÐhÕhÔhÐ8ÑhÔhÐhÐhÑhÐhÐh×hÒhÐhÑhÔhÐhÐ8ÐhÐhÐhÕhÔhÑhÔhÐhÐhÕhÔh½GÑhÔhÐhÕhÔh½GÑhÔhÐhÐhÐhÕhÔhÑhÔhÐhÐhÕhÔhÐDWÑhÔhÐhÕhÔhÐDWÑhÔhÐhÐhÕhÔhÐYgÑhÔhÕhÔhÐ<hÑhÔhÐhÐhÑhÐhÐh×hÒhÐhÑhÔhÐhÕhÔhÐhÐhÑhÔhÐhÑhÐhÐhÐhÐhÐhÑhÐhÕhÕhÔhÐhÑhÔhÑhÔhÐhÐhÐhÐhÐhÐhÐhÐhÐhÐhÐhð fÐeÐeÐeÐeÐeØsÐsÐsÐsÐsÐsð Gð  G�:Ð1Ð3JÑKÔKð  GÐKð  GÐKð  Gð  uFð  GÍwÐWrð  uFñ  PGô  PGð  Gð  PGð  Gð  Gñ  Gð  Gð  Gõ  Gô  Gñ  Gô  Gð  Gð  Gõ  Gô  G�:ñ  Gô  Gð  Gõ  Gô  G�:ñ  Gô  Gð  Gð  Gð  Gõ  Gô  Gñ  Gô  Gð  Gð  Gõ  Gô  GÐ1ñ  Gô  Gð  Gõ  Gô  GÐ1ñ  Gô  Gð  Gð  Gð  Gõ  Gô  Gñ  Gô  Gð  Gð  Gõ  Gô  GÐ3Jñ  Gô  Gð  Gõ  Gô  GÐ3Jñ  Gô  Gð  Gð  Gõ  Gô  GÐKñ  Gô  Gð  Gð  Gñ  Gð  Gð  G÷  Gò  Gð  Gñ  Gô  Gð  GÐKð  Gð  Gð  Gõ  Gô  Gñ  Gô  Gð  Gð  Gõ  Gô  GÍwñ  Gô  Gð  Gõ  Gô  GÍwñ  Gô  Gð  Gð  Gð  Gõ  Gô  Gñ  Gô  Gð  Gð  Gõ  Gô  GÐWrñ  Gô  Gð  Gõ  Gô  GÐWrñ  Gô  Gð  Gð  Gõ  Gô  Gð  uFñ  Gô  Gõ  Gô  Gð  PGñ  Gô  Gð  Gð  Gñ  Gð  Gð  G÷  Gò  Gð  Gñ  Gô  Gð  Gõ  Gô  Gð  Gð  Gñ  Gô  Gð  Gñ  Gð  Gð  Gð  Gð  Gð  Gñ  Gð  Gõ  Gõ  Gô  Gð  Gñ  Gô  Gñ  Gô  Gð  Gð  Gð  Gð  Gð  Gð  Gð  Gð  Gð  Gð  Gð  Gð TÐSÐSÐSÐSÐSØ^Ð^Ð^Ð^Ð^Ð^ØcÐc�:�o Ñ7Ô7ÐcÐ7ÐcÐ7ÐcÐTbÐc½7À?ÐTbÑ;cÔ;cÐcÐ;cÐcÐcÑcÐcÐcÕcÔcÑcÔcÐcÐcÕcÔc�:ÑcÔcÐcÕcÔc�:ÑcÔcÐcÐcÐcÕcÔcÑcÔcÐcÐcÕcÔc�oÑcÔcÐcÕcÔc�oÑcÔcÐcÐcÐcÕcÔcÑcÔcÐcÐcÕcÔc ÑcÔcÐcÕcÔc ÑcÔcÐcÐcÕcÔcÐ7ÑcÔcÐcÐcÑcÐcÐc×cÒcÐcÑcÔcÐcÐ7ÐcÐcÐcÕcÔcÑcÔcÐcÐcÕcÔc½7ÑcÔcÐcÕcÔc½7ÑcÔcÐcÐcÐcÕcÔcÑcÔcÐcÐcÕcÔcÀ?ÑcÔcÐcÕcÔcÀ?ÑcÔcÐcÐcÕcÔcÐTbÑcÔcÕcÔcÐ;cÑcÔcÐcÐcÑcÐcÐc×cÒcÐcÑcÔcÐcÕcÔcÐcÐcÑcÔcÐcÑcÐcÐcÐcÐcÐcÑcÐcÕcÕcÔcÐcÑcÔcÑcÔcÐcÐcÐcÐcÐcÐcÐcÐcÐcÐcÐcà`Ð`Ð`Ð`Ð`Ð`ØnÐnÐnÐnÐnÐnØÐ�:Ð/Ð1FÑGÔGÐÐGÐÐGÐÐn~ÐÍ7ÐSlÐn~ÑKÔKÐÐKÐÐÑÐÐÕÔÑÔÐÐÕÔ�:ÑÔÐÕÔ�:ÑÔÐÐÐÕÔÑÔÐÐÕÔÐ/ÑÔÐÕÔÐ/ÑÔÐÐÐÕÔÑÔÐÐÕÔÐ1FÑÔÐÕÔÐ1FÑÔÐÐÕÔÐGÑÔÐÐÑÐÐ×ÒÐÑÔÐÐGÐÐÐÕÔÑÔÐÐÕÔÍ7ÑÔÐÕÔÍ7ÑÔÐÐÐÕÔÑÔÐÐÕÔÐSlÑÔÐÕÔÐSlÑÔÐÐÕÔÐn~ÑÔÕÔÐKÑÔÐÐÑÐÐ×ÒÐÑÔÐÕÔÐÐÑÔÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐÐÐÐÐð TÐSÐSÐSÐSÐSØrÐrÐrÐrÐrÐrð Dð  D�:Ð.°Ñ@Ô@ð  DÐ@ð  DÐ@ð  Dð  gCð  DÅGÐLdð  gCñ  EDô  EDð  Dð  EDð  Dð  Dñ  Dð  Dð  Dõ  Dô  Dñ  Dô  Dð  Dð  Dõ  Dô  D�:ñ  Dô  Dð  Dõ  Dô  D�:ñ  Dô  Dð  Dð  Dð  Dõ  Dô  Dñ  Dô  Dð  Dð  Dõ  Dô  DÐ.ñ  Dô  Dð  Dõ  Dô  DÐ.ñ  Dô  Dð  Dð  Dð  Dõ  Dô  Dñ  Dô  Dð  Dð  Dõ  Dô  D°ñ  Dô  Dð  Dõ  Dô  D°ñ  Dô  Dð  Dð  Dõ  Dô  DÐ@ñ  Dô  Dð  Dð  Dñ  Dð  Dð  D÷  Dò  Dð  Dñ  Dô  Dð  DÐ@ð  Dð  Dð  Dõ  Dô  Dñ  Dô  Dð  Dð  Dõ  Dô  DÅGñ  Dô  Dð  Dõ  Dô  DÅGñ  Dô  Dð  Dð  Dð  Dõ  Dô  Dñ  Dô  Dð  Dð  Dõ  Dô  DÐLdñ  Dô  Dð  Dõ  Dô  DÐLdñ  Dô  Dð  Dð  Dõ  Dô  Dð  gCñ  Dô  Dõ  Dô  Dð  EDñ  Dô  Dð  Dð  Dñ  Dð  Dð  D÷  Dò  Dð  Dñ  Dô  Dð  Dõ  Dô  Dð  Dð  Dñ  Dô  Dð  Dñ  Dð  Dð  Dð  Dð  Dð  Dñ  Dð  Dõ  Dõ  Dô  Dð  Dñ  Dô  Dñ  Dô  Dð  Dð  Dð  Dð  Dð  Dð  Dð  Dð  Dð  Dð  Dð  Dð RÐQÐQÐQÐQÐQØ]Ð]Ð]Ð]Ð]Ð]ØkÐk�:Ð&¨Ñ7Ô7ÐkÐ7ÐkÐ7ÐkÐUjÐk½7ÐCSÐUjÑ;kÔ;kÐkÐ;kÐkÐkÑkÐkÐkÕkÔkÑkÔkÐkÐkÕkÔk�:ÑkÔkÐkÕkÔk�:ÑkÔkÐkÐkÐkÕkÔkÑkÔkÐkÐkÕkÔkÐ&ÑkÔkÐkÕkÔkÐ&ÑkÔkÐkÐkÐkÕkÔkÑkÔkÐkÐkÕkÔk¨ÑkÔkÐkÕkÔk¨ÑkÔkÐkÐkÕkÔkÐ7ÑkÔkÐkÐkÑkÐkÐk×kÒkÐkÑkÔkÐkÐ7ÐkÐkÐkÕkÔkÑkÔkÐkÐkÕkÔk½7ÑkÔkÐkÕkÔk½7ÑkÔkÐkÐkÐkÕkÔkÑkÔkÐkÐkÕkÔkÐCSÑkÔkÐkÕkÔkÐCSÑkÔkÐkÐkÕkÔkÐUjÑkÔkÕkÔkÐ;kÑkÔkÐkÐkÑkÐkÐk×kÒkÐkÑkÔkÐkÕkÔkÐkÐkÑkÔkÐkÑkÐkÐkÐkÐkÐkÑkÐkÕkÕkÔkÐkÑkÔkÑkÔkÐkÐkÐkÐkÐkÐkÐkÐkÐkÐkÐkÐkÐkr   )r   r   r   r   )Ú__doc__Ú
__future__r   Úbuiltinsr&   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter#   rQ   Úpathlibr   Úpytestr   r4   r?   rC   r`   r™   © r   r   ú<module>r£      sà   ððð ð #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €
€
€
€
Ø Ð Ð Ð Ð Ð Ø €€€ðPð Pð Pð Pð[ð [ð [ð.]ð ]ð ]ð&{ð {ð {ð(sð sð sð@"lð "lð "lð "lð "lr   