§
    ùVÈjW   ã                   óh  — d 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lmZ  e	e¦  «                             ¦   «         j        j        Zedz  dz  Zedz  dz  Zedz  dz  Zedz  d	z  d
z  Zg d¢Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zedk    r(ddlZedgZ ej         e
j         e¦  «        ¦  «         dS dS )u«  
Test Suite: Milestone M2 - Archival & Workspace Hygiene
Project: Tháº­p NgÅ© NiÃªn (The Fifteen Springs) - Ep01 Re-production Campaign

Verifies:
1. Exactly 184 Ep01 legacy video files safely migrated to 04_Assets/archive/ep01_legacy_v1/
2. Exactly 0 files with 'ep01' remaining in 04_Assets/videos/
3. Exactly 0 directories starting with 'ep01' remaining in 04_Assets/keyframes/ and root keyframe purged
4. Legal IP documentation README.md exists in archive and exceeds 1,000 bytes with required legal citations
5. All 14 core character portraits in 04_Assets/characters/ exist, are valid PNG images with correct dimensions
6. Non-Ep01 videos and keyframes are completely unharmed
é    N)ÚPath)ÚImageÚ	04_AssetsÚvideosÚ	keyframesÚ
charactersÚarchiveÚep01_legacy_v1))z301_Main_Protagonists/thuy_kieu_maiden_16yo_720p.png©i   iÐ  )z501_Main_Protagonists/thuy_kieu_maiden_16yo_master.png©i`  i   )z201_Main_Protagonists/thuy_van_maiden_16yo_720p.pngr   )z401_Main_Protagonists/thuy_van_maiden_16yo_master.pngr   )z,01_Main_Protagonists/kim_trong_18yo_720p.pngr   )z.01_Main_Protagonists/kim_trong_18yo_master.pngr   )z102_Vuong_Family_And_Fate/vuong_quan_16yo_720p.pngr   )z302_Vuong_Family_And_Fate/vuong_quan_16yo_master.pngr   )z002_Vuong_Family_And_Fate/vuong_ong_55yo_720p.pngr   )z202_Vuong_Family_And_Fate/vuong_ong_55yo_master.pngr   )z/02_Vuong_Family_And_Fate/vuong_ba_50yo_720p.pngr   )z102_Vuong_Family_And_Fate/vuong_ba_50yo_master.pngr   )z*02_Vuong_Family_And_Fate/dam_tien_720p.pngr   )z,02_Vuong_Family_And_Fate/dam_tien_master.pngr   c            	      ó2
  — t           j        }  | ¦   «         }|s²t          j        dt           › �¦  «        dz   dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        | ¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx} }t           j
        }  | ¦   «         }|s²t          j        dt           › �¦  «        dz   dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        | ¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx} }d„ t          j        t           ¦  «        D ¦   «         }t          |¦  «        }d	}||k    }|�st          j        d
|fd||f¦  «        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t           › dt          |¦  «        › �¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}t          d„ |D ¦   «         ¦  «        }	d}|	|k    } | s°t          j        d| fd|	|f¦  «        dt	          j        ¦   «         v st          j        |	¦  «        rt          j        |	¦  «        ndt          j        |¦  «        dœz  }
t          j        d|	› d�¦  «        dz   d|
iz  }t          t          j	        |¦  «        ¦  «        ‚dx} }|D �]=}t           |z  }|j        }  | ¦   «         }|j        }d}||k    }|�st          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        | ¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d œz  }t          j        d!|› d"|                     ¦   «         j        › d#�¦  «        d$z   d%|iz  }t          t          j	        |¦  «        ¦  «        ‚dx} x}x}x}}�Œ?dS )&zOAssert exactly 184 Ep01 video files exist in 04_Assets/archive/ep01_legacy_v1/.z"Archive directory does not exist: úC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}ÚARCHIVE_DIR©Úpy0Úpy2Úpy4Nz!Archive path is not a directory: zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_dir
}()
}c                 ó`   — g | ]+}|                      ¦   «                              d ¦  «        ¯)|‘Œ,S )z.mp4)ÚlowerÚendswith©Ú.0Úfs     ú.C:\Projects\KieuStory\tests\test_m2_hygiene.pyú
<listcomp>z1test_archive_ep01_video_count.<locals>.<listcomp>0   s4   € ÐXÐXÐX˜Q¸Q¿WºW¹Y¼Y×=OÒ=OÐPVÑ=WÔ=WÐX�qÐXÐXÐXó    é¸   ©ú==©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlenÚarchived_videos©r   Úpy1Úpy3Úpy6z$Expected exactly 184 video files in ú, but found ú
>assert %(py8)sÚpy8c              3   óX   K  — | ]%}t           |z                       ¦   «         j        V — Œ&d S ©N)r   ÚstatÚst_sizer   s     r   ú	<genexpr>z0test_archive_ep01_video_count.<locals>.<genexpr>6   s5   è è € ÐOÐO¸!•k A‘o×+Ò+Ñ-Ô-Ô5ÐOÐOÐOÐOÐOÐOr   i ”5w©ú>©z%(py0)s > %(py3)sÚ
total_size©r   r%   z$Archive total video size too small (z" bytes), data corruption suspectedú
>assert %(py5)sÚpy5é ¡ ©z_%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.stat
}()
}.st_size
} > %(py9)sÚp©r   r   r   r&   Úpy9zVideo file z suspiciously small (z bytes)ú
>assert %(py11)sÚpy11)r   ÚexistsÚ
@pytest_arÚ_format_assertmsgÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚis_dirÚosÚlistdirr!   Ú_call_reprcompareÚsumr,   r-   )Ú@py_assert1Ú@py_assert3Ú@py_format5r"   Ú@py_assert2Ú@py_assert5Ú@py_assert4Ú@py_format7Ú@py_format9r2   Ú@py_format4Ú@py_format6Úvidr8   Ú@py_assert8Ú@py_assert7Ú@py_format10Ú@py_format12s                     r   Útest_archive_ep01_video_countrZ   +   s†  € åÔÐSÐÐÑÔÐSÐÐSÕSÔSÐ!SÅkÐ!SÐ!SÑSÔSÐSÑSÐSÕSÔSÑSÔSÐSÐSÕSÔS�;ÑSÔSÐSÕSÔS�;ÑSÔSÐSÐSÕSÔSÐÑSÔSÕSÔSÐÑSÔSÐSÐSÑSÐSÕSÕSÔSÐSÑSÔSÑSÔSÐSÐSÐSÐSÐSÝÔÐRÐÐÑÔÐRÐÐRÕRÔRÐ!RÅ[Ð!RÐ!RÑRÔRÐRÑRÐRÕRÔRÑRÔRÐRÐRÕRÔR�;ÑRÔRÐRÕRÔR�;ÑRÔRÐRÐRÕRÔRÐÑRÔRÕRÔRÐÑRÔRÐRÐRÑRÐRÕRÕRÔRÐRÑRÔRÑRÔRÐRÐRÐRÐRÐRàXÐX¥"¤*­[Ñ"9Ô"9ÐXÑXÔX€OÝˆÑÔð  3ð Ð 3Ò&ð ð ñ õ ìðð ð ð Ð 3ð ñ ô ð õ ìñô ð ð õ ìõ ñ ô ð õ ìõ ñ ô ð ð ð õ ìñô ð ð õ ìð ñ ô ð õ ìð ñ ô ð ð õ ìð  ñ ô õ ìð $'ñ ô ð ð ñ ð õ ìð 	_­{Ð^Ð^ÍÈOÑH\ÔH\Ð^Ð^ñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð õ
 ÐOÐO¸ÐOÑOÔOÑOÔO€JØ%ð ˆ:˜Ò%ð ð ð õ ìðð ð ð ˆ:˜ð ñ ô ð õ ìñô ð ð õ ìð ñ ô ð õ ìð ñ ô ð ð õ ìð &ñ ô ð ð ñ ð õ ìð 	^¨zÐ]Ð]Ð]ñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð mñ mˆÝ˜#ÑˆØŒvÐlˆvˆv‰xŒxÐlˆxÔÐl 'ÐlÐ 'Ò)ÐlÐlÑlÕlÔlÐlÐlÐlÐlÐ 'ÐlÑlÔlÐlÕlÔlÑlÔlÐlÐlÕlÔlˆqÑlÔlÐlÕlÔlˆqÑlÔlÐlÐlÕlÔlˆvÑlÔlÕlÔlˆxÑlÔlÕlÔlÐÑlÔlÕlÔl 'ÑlÔlÐlÐlÑlÐlÕlÔlÐ+l¸Ð+lÐ+lÐST×SYÒSYÑS[ÔS[ÔScÐ+lÐ+lÐ+lÑlÔlÐlÑlÐlÐlÐlÑlÐlÕlÕlÔlÐlÑlÔlÑlÔlÐlÐlÐlÐlÐlÐlÐlÐlÐlÐlÐlÑlðmð mr   c                  ól  — t           j        }  | ¦   «         }|s²t          j        dt           › �¦  «        dz   dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        | ¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx} }d„ t          j        t           ¦  «        D ¦   «         }t          |¦  «        }d}||k    }|�s"t          j        d|fd	||f¦  «        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t           › dt          |¦  «        › d|› �¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}dS )z7Assert 0 files with 'ep01' remain in 04_Assets/videos/.z!Videos directory does not exist: r   Ú
VIDEOS_DIRr   Nc                 ó>   — g | ]}d |                      ¦   «         v ¯|‘ŒS ©Úep01©r   r   s     r   r   z+test_videos_ep01_purged.<locals>.<listcomp>D   s*   € ÐOÐOÐO˜A¸6ÀQÇWÂWÁYÄYÐ;NÐ;N�aÐ;NÐ;NÐ;Nr   r   r   r    r!   Úep01_remainingr#   z#Expected 0 Ep01 files remaining in r'   ú: r(   r)   )r\   r=   r>   r?   r@   rA   rB   rC   rD   rE   rG   rH   r!   rI   )	rK   rL   rM   ra   rN   rO   rP   rQ   rR   s	            r   Útest_videos_ep01_purgedrc   @   så  € åÔÐPÐÐÑÔÐPÐÐPÕPÔPÐ PÅJÐ PÐ PÑPÔPÐPÑPÐPÕPÔPÑPÔPÐPÐPÕPÔP�:ÑPÔPÐPÕPÔP�:ÑPÔPÐPÐPÕPÔPÐÑPÔPÕPÔPÐÑPÔPÐPÐPÑPÐPÕPÕPÔPÐPÑPÔPÑPÔPÐPÐPÐPÐPÐPàOÐO¥¤­JÑ!7Ô!7ÐOÑOÔO€NÝˆ~ÑÔð  !ð Ð !Ò#ð ð ñ õ ìðð ð ð Ð !ð ñ ô ð õ ìñô ð ð õ ìõ ñ ô ð õ ìõ ñ ô ð ð ð õ ìñô ð ð õ ìð ñ ô ð õ ìð ñ ô ð ð õ ìð ñ ô õ ìð #$ñ ô ð ð ñ ð õ ìð 	n­jÐmÐmÅcÈ.ÑFYÔFYÐmÐmÐ]kÐmÐmñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð r   c            
      óª  — t           j        }  | ¦   «         }|s²t          j        dt           › �¦  «        dz   dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        | ¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx} }d„ t          j        t           ¦  «        D ¦   «         }t          |¦  «        }d}||k    }|�s*t          j        d|fd	||f¦  «        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t           › dt          |¦  «        › d|dd…         › �¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}t           dz  }	|	j        }  | ¦   «         }| }|s¤t          j        d|	› d�¦  «        dz   dt	          j        ¦   «         v st          j        |	¦  «        rt          j        |	¦  «        ndt          j        | ¦  «        t          j        |¦  «        dœz  }
t          t          j	        |
¦  «        ¦  «        ‚dx} x}}d„ t          j        t           ¦  «        D ¦   «         }t          |¦  «        }d}||k    }|�s
t          j        d|fd	||f¦  «        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|› �¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}dS )zbAssert 0 directories starting with 'ep01' remaining in 04_Assets/keyframes/ and root file removed.z$Keyframes directory does not exist: r   ÚKEYFRAMES_DIRr   Nc                 ó˜   — g | ]G}t           |z                       ¦   «         ¯|                     ¦   «                              d ¦  «        ¯E|‘ŒHS r^   ©re   rF   r   Ú
startswith©r   Úds     r   r   z.test_keyframes_ep01_purged.<locals>.<listcomp>N   s]   € ð ð ð ØÝ˜AÑ×%Ò%Ñ'Ô'ðà,-¯GªG©I¬I×,@Ò,@ÀÑ,HÔ,HðØ	ðð ð r   r   r   r    r!   Ú	ep01_dirsr#   z2Expected 0 Ep01 keyframe directories remaining in z, found rb   é   r(   r)   zep01_scene03_start_720p.pngzRoot keyframe file z was not purgedzG
>assert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}Úroot_ep01_filec                 ó>   — g | ]}d |                      ¦   «         v ¯|‘ŒS r^   r`   r   s     r   r   z.test_keyframes_ep01_purged.<locals>.<listcomp>[   s5   € ð ð ð ØØ�Q—W’W‘Y”YÐÐð 	
ØÐÐr   Úep01_files_anyz.Found Ep01 files remaining in keyframes root: )re   r=   r>   r?   r@   rA   rB   rC   rD   rE   rG   rH   r!   rI   )rK   rL   rM   rk   rN   rO   rP   rQ   rR   rm   rT   ro   s               r   Útest_keyframes_ep01_purgedrp   J   sM  € åÔÐYÐÐÑ!Ô!ÐYÐ!ÐYÕYÔYÐ#YÍ-Ð#YÐ#YÑYÔYÐYÑYÐYÕYÔYÑYÔYÐYÐYÕYÔY�=ÑYÔYÐYÕYÔY�=ÑYÔYÐYÐYÕYÔYÐÑYÔYÕYÔYÐ!ÑYÔYÐYÐYÑYÐYÕYÕYÔYÐYÑYÔYÑYÔYÐYÐYÐYÐYÐYðð Ý”:�mÑ,Ô,ðñ ô €Iõ ˆy‰>Œ>ð ˜Qð ˆ>˜QÒð ð ñ õ ìðð ð ð ˆ>˜Qð ñ ô ð õ ìñô ð ð õ ìõ ñ ô ð õ ìõ ñ ô ð ð ð õ ìñô ð ð õ ìð ñ ô ð õ ìð ñ ô ð ð õ ìð ñ ô õ ìð ñ ô ð ð ñ ð õ ìð 	v½]ÐuÐuÕTWÐXaÑTbÔTbÐuÐuÐfoÐprÐqrÐprÔfsÐuÐuñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð õ #Ð%BÑB€NØÔ$ð Ð$Ð$Ñ&Ô&ð Ð&Ð&ð Ð&ð õ ìð 	>˜nÐ=Ð=Ð=ñô ð ñ ð õ ìñô ð ð õ ìð ñ ô ð õ ìð ñ ô ð ð õ ìð %ñ ô õ ìð 'ñ ô ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ðð Ý”:�mÑ,Ô,ðñ ô €Nõ ˆ~ÑÔð  !ð Ð !Ò#ð ð ñ õ ìðð ð ð Ð !ð ñ ô ð õ ìñô ð ð õ ìõ ñ ô ð õ ìõ ñ ô ð ð ð õ ìñô ð ð õ ìð ñ ô ð õ ìð ñ ô ð ð õ ìð ñ ô õ ìð #$ñ ô ð ð ñ ð õ ìð 	J¸ÐIÐIñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð r   c                  óö  — t           dz  } | j        } |¦   «         }|s¨t          j        dt           › �¦  «        dz   dt	          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx}}| j
        } |¦   «         }|s£t          j        d| › �¦  «        dz   dt	          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx}}|                      ¦   «         j        }d	}||k    }|s°t          j        d
|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          j        d|› d�¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}|                      d¬¦  «        }d}	|	|v }|s¬t          j        d|fd|	|f¦  «        t          j        |	¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }t          j        d¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}	}d}	|	|v }|s¬t          j        d|fd|	|f¦  «        t          j        |	¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }t          j        d¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}	}d}	|	|v }|s¬t          j        d|fd|	|f¦  «        t          j        |	¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }t          j        d¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}	}d}	|	|v }|s¬t          j        d|fd|	|f¦  «        t          j        |	¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }t          j        d¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}	}d }	|	|v }|s¬t          j        d|fd|	|f¦  «        t          j        |	¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }t          j        d!¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}	}d"}	|	|v }|s¬t          j        d|fd|	|f¦  «        t          j        |	¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }t          j        d#¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}	}d$}	|	|v }|s¬t          j        d|fd|	|f¦  «        t          j        |	¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }t          j        d%¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}	}g }d&}||v }
|
}	|
sd'}||v }|}	|	�smt          j        d|
fd(||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd)œz  }d*d+|iz  }|                     |¦  «         |
s‹t          j        d|fd,||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd-œz  }d.d/|iz  }|                     |¦  «         t          j        |d0¦  «        i z  }t          j        d1¦  «        d2z   d3|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}	x}x}x}
x}}d4}	|	|v }|s¬t          j        d|fd|	|f¦  «        t          j        |	¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }t          j        d5¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}	}d6}	|	|v }|s¬t          j        d|fd|	|f¦  «        t          j        |	¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }t          j        d7¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}	}dS )8zlAssert README.md exists in archive, is > 1000 bytes, and contains required legal and creative justification.z	README.mdzREADME.md missing in r   Úreadme_pathr   NzREADME.md is not a file: úD
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_file
}()
}iè  r/   r1   Úsizer3   zREADME.md size (z( bytes) is less than required 1000 bytesr4   r5   zutf-8)Úencodingu   Ä�iá»�u 4 khoáº£n 8)Úin)z%(py1)s in %(py3)sÚcontent)r$   r%   z6Missing reference to Article 4(8) of Vietnamese IP Lawu
   Ä�iá»�u 14z4Missing reference to Article 14 of Vietnamese IP Lawu
   Ä�iá»�u 20z4Missing reference to Article 20 of Vietnamese IP Lawu
   Ä�iá»�u 43z4Missing reference to Article 43 of Vietnamese IP Lawu   NGUYá»„N SÄ¨ SÆ Nu%   Missing Author name Nguyá»…n SÄ© SÆ¡nÚ031090010018zMissing Author CCCD numberu   Nguyá»…n Duu    Missing reference to Nguyá»…n DuzHuman-in-the-LoopzHuman Agency)z%(py3)s in %(py5)s)r%   r5   z%(py7)sÚpy7)z%(py10)s in %(py12)s)Úpy10Úpy12z%(py14)sÚpy14é   z7Missing Human-in-the-Loop creative workflow explanationz
>assert %(py17)sÚpy17zZero Permanent Deletionz)Missing Zero Permanent Deletion rationaleÚ184z Missing 184 file inventory count)r   r=   r>   r?   r@   rA   rB   rC   rD   rE   Úis_filer,   r-   rI   Ú	read_textÚappendÚ_format_boolop)rr   rK   rL   rM   rt   rN   rS   rT   rw   Ú@py_assert0rP   Ú@py_assert9Ú@py_assert11Ú@py_format8Ú@py_format13Ú@py_format15Ú@py_format16Ú@py_format18s                     r   Ú'test_archive_readme_legal_documentationrŒ   d   s&  € å Ñ+€KØÔÐFÐÐÑÔÐFÐÐFÕFÔFÐ!F½Ð!FÐ!FÑFÔFÐFÑFÐFÕFÔFÑFÔFÐFÐFÕFÔFˆ;ÑFÔFÐFÕFÔFˆ;ÑFÔFÐFÐFÕFÔFÐÑFÔFÕFÔFÐÑFÔFÐFÐFÑFÐFÕFÕFÔFÐFÑFÔFÑFÔFÐFÐFÐFÐFÐFØÔÐ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à×ÒÑÔÔ%€DØÐYˆ4�$Š;ÐYÐYÐYÕYÔYÐYÐYÐYÐYˆ4�$ÐYÑYÔYÐYÕYÔYÑYÔYÐYÐYÕYÔYˆ4ÑYÔYÐYÕYÔYˆ4ÑYÔYÐYÐYÕYÔY�$ÑYÔYÐYÐYÑYÐYÕYÔYÐY¨4ÐYÐYÐYÑYÔYÐYÑYÐYÐYÐYÑYÐYÕYÕYÔYÐYÑYÔYÑYÔYÐYÐYÐYÐYÐYà×#Ò#¨WÐ#Ñ5Ô5€Gð !ÐeÐ  GÐ+ÐeÐeÐeÕeÔeÐeÐeÐeÐeÐ  GÐeÑeÔeÕeÔeÐ ÑeÔeÐeÕeÔeÑeÔeÐeÐeÕeÔe GÑeÔeÐeÕeÔe GÑeÔeÐeÐeÐeÐeÑeÐeÕeÔeÐ-eÑeÔeÐeÑeÐeÐeÐeÑeÐeÕeÕeÔeÐeÑeÔeÑeÔeÐeÐeÐeÐeÐeØÐZˆ<˜7Ð"ÐZÐZÐZÕZÔZÐZÐZÐZÐZˆ<˜7ÐZÑZÔZÕZÔZˆ<ÑZÔZÐZÕZÔZÑZÔZÐZÐZÕZÔZ˜7ÑZÔZÐZÕZÔZ˜7Ñ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ˆ<˜7Ð"ÐZÐZÐZÕZÔZÐZÐZÐZÐZˆ<˜7ÐZÑZÔZÕZÔZˆ<ÑZÔZÐZÕZÔZÑZÔZÐZÐZÕZÔZ˜7ÑZÔZÐZÕZÔZ˜7Ñ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ˆ<˜7Ð"ÐZÐZÐZÕZÔZÐZÐZÐZÐZˆ<˜7ÐZÑZÔZÕZÔZˆ<ÑZÔZÐZÕZÔZÑZÔZÐZÐZÕZÔZ˜7ÑZÔZÐZÕZÔZ˜7Ñ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ð ÐRÐ 'Ð)ÐRÐRÐRÕRÔRÐRÐRÐRÐRÐ 'ÐRÑRÔRÕRÔRÐÑRÔRÐRÕRÔRÑRÔRÐRÐRÕRÔR 'ÑRÔRÐRÕRÔR 'ÑRÔRÐRÐRÐRÐRÑRÐRÕRÔRÐ+RÑRÔRÐRÑRÐRÐRÐRÑRÐRÕRÕRÔRÐRÑRÔRÑRÔRÐRÐRÐRÐRÐRØÐBˆ>˜WÐ$ÐBÐBÐBÕBÔBÐBÐBÐBÐBˆ>˜WÐBÑBÔBÕBÔBˆ>ÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔB˜WÑBÔBÐBÕBÔB˜WÑBÔBÐBÐBÐBÐBÑBÐBÕBÔBÐ&BÑBÔBÐBÑBÐBÐBÐBÑBÐBÕBÕBÔBÐBÑBÔBÑBÔBÐBÐBÐBÐBÐBØÐ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ÐGÑGÐGÐGÐGÑGÐGÕGÕGÔGÐGÑGÔGÑGÔGÐGÐGÐGÐGÐGðð Ðð Ð 'Ð)ð ð ð ð ð ¨^ð ¨^¸wÐ-Fð ð ð ð ñ õ ìðð ð ð Ð 'ð ñ ô õ ìð ñ ô ð õ ìñô ð ð õ ìð #*ñ ô ð õ ìð #*ñ ô ð ð ð ð ñ ð ð ð ð ð ñ ð ð ïê ðéì è ðð õ ìðð ð ð ¨^¸wð ñ ô õ ìð .<ñ ô ð õ ìñô ð ð õ ìð @Gñ ô ð õ ìð @Gñ ô ð ð ð ð ñ ð ð ð ð ð ñ ð ð ïê ðéì è õìðð ñ ô ð ñ ð õ ìð 	Bñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð ð ð ð ð ð %Ð\Ð$¨Ð/Ð\Ð\Ð\Õ\Ô\Ð\Ð\Ð\Ð\Ð$¨Ð\Ñ\Ô\Õ\Ô\Ð$Ñ\Ô\Ð\Õ\Ô\Ñ\Ô\Ð\Ð\Õ\Ô\¨Ñ\Ô\Ð\Õ\Ô\¨Ñ\Ô\Ð\Ð\Ð\Ð\Ñ\Ð\Õ\Ô\Ð1\Ñ\Ô\Ð\Ñ\Ð\Ð\Ð\Ñ\Ð\Õ\Õ\Ô\Ð\Ñ\Ô\Ñ\Ô\Ð\Ð\Ð\Ð\Ð\ØÐ?ˆ5�GÐÐ?Ð?Ð?Õ?Ô?Ð?Ð?Ð?Ð?ˆ5�GÐ?Ñ?Ô?Õ?Ô?ˆ5Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?�GÑ?Ô?Ð?Õ?Ô?�GÑ?Ô?Ð?Ð?Ð?Ð?Ñ?Ð?Õ?Ô?Ð?Ñ?Ô?Ð?Ñ?Ð?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?r   c            
      óî  — t           j        }  | ¦   «         }|s²t          j        dt           › �¦  «        dz   dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        | ¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx} }t          D �]°\  }}t           |z  }|j        }  | ¦   «         }|s£t          j        d|› �¦  «        dz   dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        | ¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx} }|j        }  | ¦   «         }|s£t          j        d|› �¦  «        d	z   dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        | ¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx} }|j        }  | ¦   «         }|j        }d
}||k    }|sèt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        | ¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	t          j        d|› �¦  «        dz   d|	iz  }
t          t          j	        |
¦  «        ¦  «        ‚dx} x}x}x}}t          j        |¦  «        5 }|j        } d}| |k    }|sÊt          j        d|fd| |f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        | ¦  «        t          j        |¦  «        dœz  }t          j        d|› d|j        › �¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx} x}}|j        } | |k    }|søt          j        d|fd| |f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        | ¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }t          j        d|› d|› d|j        › �¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx} }ddd¦  «         n# 1 swxY w Y   �Œ²t'          d „ t)          j        t           ¦  «        D ¦   «         ¦  «        }d!}||k    } | s¯t          j        d| fd"||f¦  «        d#t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd#t          j        |¦  «        d$œz  }t          j        d%|› �¦  «        d&z   d'|iz  }t          t          j	        |¦  «        ¦  «        ‚dx} }dS )(zaAssert all 14 core Ep01 character portraits exist, are valid PNG images with expected dimensions.z%Characters directory does not exist: r   ÚCHARACTERS_DIRr   NzCharacter portrait missing: Ú	full_pathzCharacter portrait not a file: rs   r6   r/   r7   r9   z'Character portrait suspiciously small: r;   r<   ÚPNGr   )z.%(py2)s
{%(py2)s = %(py0)s.format
} == %(py5)sÚimg)r   r   r5   zExpected PNG format for z, got z
>assert %(py7)sry   )z,%(py2)s
{%(py2)s = %(py0)s.size
} == %(py4)sÚexpected_dimszDimension mismatch for z: expected z
>assert %(py6)sr&   c              3   ó<   K  — | ]\  }}}t          |¦  «        V — Œd S r+   )r!   )r   Ú_Úfiless      r   r.   z4test_character_portraits_unharmed.<locals>.<genexpr>”   s.   è è € ÐQÐQ©+¨!¨Q°�3˜u™:œ:ÐQÐQÐQÐQÐQÐQr   é>   )z%(py0)s == %(py3)sÚtotal_char_filesr3   z3Total character assets altered! Expected 62, found r4   r5   )rŽ   r=   r>   r?   r@   rA   rB   rC   rD   rE   ÚCORE_EP01_CHARACTERSr€   r,   r-   rI   r   ÚopenÚformatrt   rJ   rG   Úwalk)rK   rL   rM   Úrel_pathr’   r�   rO   rV   rW   rX   rY   r‘   rP   rT   r‡   rQ   r—   rN   rS   s                      r   Ú!test_character_portraits_unharmedr�   ‚   së  € åÔ Ð\Ð Ð Ñ"Ô"Ð\Ð"Ð\Õ\Ô\Ð$\ÍNÐ$\Ð$\Ñ\Ô\Ð\Ñ\Ð\Õ\Ô\Ñ\Ô\Ð\Ð\Õ\Ô\�>Ñ\Ô\Ð\Õ\Ô\�>Ñ\Ô\Ð\Ð\Õ\Ô\Ð Ñ\Ô\Õ\Ô\Ð"Ñ\Ô\Ð\Ð\Ñ\Ð\Õ\Õ\Ô\Ð\Ñ\Ô\Ñ\Ô\Ð\Ð\Ð\Ð\Ð\å#7ð ñ Ñˆ�-Ý" XÑ-ˆ	ØÔÐLÐÐÑ!Ô!ÐLÐ!ÐLÕLÔLÐ#LÀ(Ð#LÐ#LÑLÔLÐLÑLÐLÕLÔLÑLÔLÐLÐLÕLÔLˆyÑLÔLÐLÕLÔLˆyÑLÔLÐLÐLÕLÔLÐÑLÔLÕLÔLÐ!ÑLÔLÐLÐLÑLÐLÕLÕLÔLÐLÑLÔLÑLÔLÐLÐLÐLÐLÐLØÔ ÐPÐ Ð Ñ"Ô"ÐPÐ"ÐPÕPÔPÐ$PÀhÐ$PÐ$PÑPÔPÐPÑPÐPÕPÔPÑPÔPÐPÐPÕPÔPˆyÑPÔPÐPÕPÔPˆyÑPÔPÐPÐPÕPÔPÐ ÑPÔPÕPÔPÐ"ÑPÔPÐPÐPÑPÐPÕPÕPÔPÐPÑPÔPÑPÔPÐPÐPÐPÐPÐPØŒ~Ðgˆ~ˆ~ÑÔÐgÐÔ'Ðg¨'ÐgÐ'¨'Ò1ÐgÐgÐgÕgÔgÐgÐgÐgÐgÐ'¨'ÐgÑgÔgÐgÕgÔgÑgÔgÐgÐgÕgÔgˆyÑgÔgÐgÕgÔgˆyÑ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Ð3gÐ]eÐ3gÐ3gÑ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õ ŒZ˜	Ñ"Ô"ð 	 cØ”:Ð_ Ð_�: Ò&Ð_Ð_Ð_Õ_Ô_Ð_Ð_Ð_Ð_�: Ð_Ñ_Ô_Ð_Õ_Ô_Ñ_Ô_Ð_Ð_Õ_Ô_�3Ñ_Ô_Ð_Õ_Ô_�3Ñ_Ô_Ð_Ð_Õ_Ô_�:Ñ_Ô_Õ_Ô_ Ñ_Ô_Ð_Ð_Ñ_Ð_Õ_Ô_Ð(_À8Ð(_Ð(_ÐSVÔS]Ð(_Ð(_Ñ_Ô_Ð_Ñ_Ð_Ð_Ð_Ñ_Ð_Õ_Õ_Ô_Ð_Ñ_Ô_Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ø”8ð �8˜}Ò,ð ð ð õ ìðð ð ð �8˜}ð ñ ô ð õ äñô ð ð õ ìð ñ ô ð õ äð ñ ô ð ð õ äð ñ ô ð õ äñô ð ð õ ìð  -ñ ô ð õ äð  -ñ ô ð ð ð ð ñ ð õ ìð _¨(Ð^Ð^¸}Ð^Ð^ÐTWÔT\Ð^Ð^ñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ùõ ÐQÐQ½¼ÅÑ9PÔ9PÐQÑQÔQÑQÔQÐØ!ÐkÐ˜rÒ!ÐkÐkÐkÕkÔkÐkÐkÐkÐkÐ˜rÐkÑkÔkÐkÕkÔkÑkÔkÐkÐkÕkÔkÐÑkÔkÐkÕkÔkÐÑkÔkÐkÐkÕkÔk˜rÑkÔkÐkÐkÑkÐkÕkÔkÐ#kÐYiÐ#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Ðks   ÎG-U;Õ;U?	ÖU?	c                  ó"  — d„ t          j        t          ¦  «        D ¦   «         } t          | ¦  «        }d}||k    }|�st	          j        d|fd||f¦  «        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t          | ¦  «        › �¦  «        d	z   d
|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}d„ t          j        t          ¦  «        D ¦   «         }t          |¦  «        }d}||k    }|�st	          j        d|fd||f¦  «        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t          |¦  «        › �¦  «        d	z   d
|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}d„ t          j        t          ¦  «        D ¦   «         }t          |¦  «        }d}||k    }|�st	          j        d|fd||f¦  «        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t          |¦  «        › �¦  «        d	z   d
|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}dS )z=Assert non-Ep01 videos and keyframes are completely unharmed.c                 ó>   — g | ]}d |                      ¦   «         v¯|‘ŒS r^   r`   r   s     r   r   z1test_non_ep01_assets_unharmed.<locals>.<listcomp>›   s*   € ÐTÐTÐT˜Q¸FÈ!Ï'Ê'É)Ì)Ð<SÐ<S�qÐ<SÐ<SÐ<Sr   év   r   r    r!   Únon_ep01_videosr#   z5Non-Ep01 videos altered! Expected exactly 118, found r(   r)   Nc                 ó˜   — g | ]G}t           |z                       ¦   «         ¯|                     ¦   «                              d ¦  «        °E|‘ŒHS r^   rg   ri   s     r   r   z1test_non_ep01_assets_unharmed.<locals>.<listcomp>¡   s]   € ð ð ð ØÝ˜AÑ×%Ò%Ñ'Ô'ðà01·²±	´	×0DÒ0DÀVÑ0LÔ0LðØ	ðð ð r   éC   Únon_ep01_kf_dirsz;Non-Ep01 keyframe dirs altered! Expected exactly 67, found c                 óJ   — g | ] }t           |z                       ¦   «         ¯|‘Œ!S © )re   r€   r   s     r   r   z1test_non_ep01_assets_unharmed.<locals>.<listcomp>ª   s/   € ÐaÐaÐa ÅMÐTUÑDU×C^ÒC^ÑC`ÔC`Ða˜1ÐaÐaÐar   é
   Únon_ep01_root_filesz9Non-Ep01 keyframe root files altered! Expected 10, found )rG   rH   r\   r!   r>   rI   r@   rA   rB   rC   r?   rD   rE   re   )r¡   rN   rO   rP   rQ   rR   r¤   r¨   s           r   Útest_non_ep01_assets_unharmedr©   ˜   s+  € ð UÐT¥"¤*­ZÑ"8Ô"8ÐTÑTÔT€OÝˆÑÔð  3ð Ð 3Ò&ð ð ñ õ ìðð ð ð Ð 3ð ñ ô ð õ ìñô ð ð õ ìõ ñ ô ð õ ìõ ñ ô ð ð ð õ ìñô ð ð õ ìð ñ ô ð õ ìð ñ ô ð ð õ ìð  ñ ô õ ìð $'ñ ô ð ð ñ ð õ ìð 	WÅÀOÑ@TÔ@TÐVÐVñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð
ð Ý”:�mÑ,Ô,ðñ ô Ðõ ÐÑ Ô ð  Bð Ð  BÒ&ð ð ñ õ ìðð ð ð Ð  Bð ñ ô ð õ ìñô ð ð õ ìõ ñ ô ð õ ìõ ñ ô ð ð ð õ ìñô ð ð õ ìð  ñ ô ð õ ìð  ñ ô ð ð õ ìð !ñ ô õ ìð %'ñ ô ð ð ñ ð õ ìð 	^ÅcÐJZÑF[ÔF[Ð]Ð]ñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð
 bÐa¥b¤jµÑ&?Ô&?ÐaÑaÔaÐÝÐ"Ñ#Ô#ð  rð Ð# rÒ)ð ð ñ õ ìðð ð ð Ð# rð ñ ô ð õ ìñô ð ð õ ìõ ñ ô ð õ ìõ ñ ô ð ð ð õ ìñô ð ð õ ìð #ñ ô ð õ ìð #ñ ô ð ð õ ìð $ñ ô õ ìð (*ñ ô ð ð ñ ð õ ìð 	_ÅCÐH[ÑD\ÔD\Ð^Ð^ñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð r   Ú__main__z-v)!Ú__doc__Úbuiltinsr@   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter>   rG   Úpathlibr   ÚpytestÚPILr   Ú__file__ÚresolveÚparentÚPROJECT_ROOTr\   re   rŽ   r   r˜   rZ   rc   rp   rŒ   r�   r©   Ú__name__ÚsysÚpytest_argsÚexitÚmainr¦   r   r   ú<module>r¼      sƒ  ððð ð € € € € € € € € € € € € €	€	€	€	Ø Ð Ð Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð àˆt�H‰~Œ~×%Ò%Ñ'Ô'Ô.Ô5€Ø˜KÑ'¨(Ñ2€
Ø˜{Ñ*¨[Ñ8€Ø Ñ+¨lÑ:€Ø˜[Ñ(¨9Ñ4Ð7GÑG€ðð ð Ð ð$mð mð mð*ð ð ðð ð ð4@ð @ð @ð<lð lð lð,ð ð ð0 ˆzÒÐØ€J€J€JØ˜TÐ"€KØ€C„Hˆ[ˆVŒ[˜Ñ%Ô%Ñ&Ô&Ð&Ð&Ð&ð Ðr   