§
    �*Êjþn  ã                   óT  — d Z ddlZddl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
mZmZmZ ddlZddlZddlZ ee¦  «                             ¦   «         j        j        Zedz  Z ee¦  «        ej        vr$ej                             d ee¦  «        ¦  «         ddlmZmZmZmZmZ ddl m!Z!m"Z"m#Z#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z)m*Z* dd	l+m,Z,m-Z-m.Z.  ej/        d
¬¦  «        d„ ¦   «         Z0 G d„ d¦  «        Z1 G d„ d¦  «        Z2 G d„ d¦  «        Z3 G d„ d¦  «        Z4 G d„ d¦  «        Z5dS )uk  
=============================================================================
THáº¬P NGÅ¨ NIÃŠN (THE FIFTEEN SPRINGS) - FLOWKIT AUTONOMOUS PIPELINE TEST SUITE
=============================================================================
Authoritative Test Suite for FlowKit-inspired Autonomous Upgrades:
1. Zero-Waste Contact Sheet Tiling Engine:
   - Exact divisor math (cols_eff * rows_eff == n_frames)
   - Zero empty black cells (prevents Vision LLM hallucinating black screen defects)
   - High-contrast timestamp badges [T=X.Xs | #Frame N]
   - JPEG byte stream encoding
2. Strict 3-Tier Error Catalog (14 Known AI Video Errors) & Hard Caps:
   - 5 Critical Errors: character_drift, breed_swap, role_reversal, brand_logo_text, character_count_drift
   - 5 High Errors: camera_drift, object_morph, reverse_motion, human_hands_limbs, scale_break
   - 4 Minor Errors: lighting_jitter, micro_blur, background_warp, color_shift
   - Critical hard cap: character_consistency <= 0.30, overall_score <= 0.59, approved=False, RETAKE_SHOT
   - High hard cap: overall_score <= 0.74, approved=False, RETAKE_SHOT
   - Deterministic model validator overriding LLM benevolence
3. Diagnostic Prompt Healing (Self-Correction Loop):
   - Targeted anti-drift / locked-camera / anatomy injection
   - Critical > High > Minor priority injection
   - Preservation of Audio Guard (No-BGM) and Closed Lips Guard
   - Strict cycle bounding (MAX_HEALING_CYCLES = 2)
4. Cinematic 3-Beat Shot Formula & Camera Separation:
   - Beat 1 (0-3s), Beat 2 (3-6s), Beat 3 (6-10s)
   - Dedicated camera movement line
5. Post-Production Smart Trim & Audio Continuity:
   - Dynamic head trim (-ss 1.0) on static first frames
   - Narrator fitting to speech duration + buffer
   - Smart stitching: xfade for CONTINUOUS_TAKE vs hard cut for CINEMATIC_CUT
=============================================================================
é    N)ÚPath)ÚListÚDictÚAnyÚTupleÚ05_Production_Pipeline)Úcompute_zero_waste_gridÚnormalize_frame_countÚZeroWasteContactSheetÚ!generate_zero_waste_contact_sheetÚextract_contact_sheet_bytes)ÚMAX_HEALING_CYCLESÚERROR_THERAPY_CATALOGÚDiagnosticPromptHealerÚCinematicShotPacer)ÚFLOWKIT_ERROR_TIERSÚFLOWKIT_ERROR_CATALOGÚVideoCriticVerdictÚShotEvaluationÚSceneEvaluation)ÚAudioContinuityEngineÚ
get_ffmpegÚget_ffprobeÚsession)Úscopec              #   ó&  K  — |                       d¦  «        }t          ¦   «         }|dz  }|dddddddddd	d
ddddddddt          |¦  «        g}t          j        |dd¬¦  «         |dz  }g |‘d‘d‘d‘d‘d‘d‘d‘d‘d‘d‘d‘d‘d‘d‘d‘d‘d‘d‘d‘d	‘d
‘d‘d‘d‘d‘d‘d‘d‘d‘t          |¦  «        ‘}t          j        |dd¬¦  «         |dz  }|dddddddddddt          |¦  «        g}t          j        |dd¬¦  «         |||||d œV — d!S )"u@   Táº¡o thÆ° má»¥c sandbox dÃ¹ng cho kiá»ƒm thá»­ video vÃ  audio.Úflowkit_test_sandboxzmoving_clip.mp4ú-yú-fÚlavfiú-iz)testsrc=duration=2.5:size=640x360:rate=24z1sine=frequency=440:duration=2.5:sample_rate=48000ú-c:vÚlibx264z-pix_fmtÚyuv420pú-c:aÚaacz-b:aÚ128kz-arÚ48000T©Úcapture_outputÚcheckzstatic_head_clip.mp4z.color=c=navy:duration=1.2:size=640x360:rate=24z)testsrc=duration=2.0:size=640x360:rate=24z1sine=frequency=440:duration=3.0:sample_rate=48000z-filter_complexz#[0:v][1:v]concat=n=2:v=1:a=0[v_out]z-mapz[v_out]z2:aznarration_sample.m4az1sine=frequency=330:duration=2.0:sample_rate=48000)ÚdirÚmoving_videoÚstatic_head_videoÚnarration_audioÚffmpegN)Úmktempr   ÚstrÚ
subprocessÚrun)	Útmp_path_factoryÚtemp_dirr0   r-   Ú
cmd_movingr.   Ú
cmd_staticr/   Ú	cmd_audios	            ú?C:\Projects\KieuStory\tests\test_flowkit_autonomous_pipeline.pyÚflowkit_sandboxr;   Q   sx  è è € ð  ×&Ò&Ð'=Ñ>Ô>€HÝ‰\Œ\€Fð Ð/Ñ/€Là�Øˆg�tÐHØˆg�tÐPØ�	˜: yØ��v˜v u¨gÝˆLÑÔð€Jõ „N�:¨d¸$Ð?Ñ?Ô?Ð?ð !Ð#9Ñ9Ðð
Øð
Øð
àð
àð
àð
àMð
ð 	ð
ð ð
ð ð
ð Ið
ð 	ð	
ð ð	
ð ð	
ð Qð	
ð
 	ð
ð
 Að
ð 	ð
ð ð
ð "ð
ð $)ð
ð 	ð
ð ð
ð &ð
ð (1ð
ð 	ð
ð ð
ð ð
ð  &ð
ð (-ð
ð /6ð
õ 	ÐÑÔð
€Jõ „N�:¨d¸$Ð?Ñ?Ô?Ð?ð Ð!7Ñ7€Oà�Øˆg�tÐPØ��v˜v u¨gÝˆOÑÔð	€Iõ „N�9¨T¸Ð>Ñ>Ô>Ð>ð Ø$Ø.Ø*Øðð ð ð ð ð ð ó    c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚTestZeroWasteContactSheetTilinguW   Kiá»ƒm chá»©ng toÃ¡n há»�c Æ°á»›c sá»‘ chÃ­nh xÃ¡c vÃ  triá»‡t tiÃªu 100% Ã´ Ä‘en rÃ¡c.c           
      ó®   — g d¢}|D ]M}t          |¦  «        \  }}||z  |k    sJ d|› d|› d|› d|› �¦   «         ‚||k    sJ d|› d|› d|› d	�¦   «         ‚ŒNd
S )u=   cols_eff * rows_eff Báº®T BUá»˜C báº±ng chÃ­nh xÃ¡c n_frames.)
é   é   é   é   é   é   é	   é
   é   é   u   Lá»—i vá»›i n=z: Úxz != u/   Cols pháº£i >= Rows cho mÃ n hÃ¬nh ngang 16:9: z < z (n=ú)N)r	   )ÚselfÚgolden_countsÚnÚcolsÚrowss        r:   Útest_exact_divisor_grid_mathz<TestZeroWasteContactSheetTiling.test_exact_divisor_grid_math�   s­   € à9Ð9Ð9ˆØð 	kð 	kˆAÝ0°Ñ3Ô3‰JˆD�$Ø˜$‘; !Ò#Ð#Ð#Ð%O°aÐ%OÐ%O¸4Ð%OÐ%OÀ$Ð%OÐ%OÈAÐ%OÐ%OÑ#Ô#Ð#Ø˜4’<�<�<Ð!jÐSWÐ!jÐ!jÐ\`Ð!jÐ!jÐfgÐ!jÐ!jÐ!j‘<”<�<�<ð	kð 	kr<   c                 ót  — t          d¦  «        dk    sJ ‚t          d¦  «        dk    sJ ‚t          d¦  «        dk    sJ ‚t          d¦  «        dk    sJ ‚t          d¦  «        dv sJ ‚t          d¦  «        dk    sJ ‚t          d¦  «        d	v sJ ‚t          d
¦  «        d
k    sJ ‚t          d¦  «        dv sJ ‚dS )uV   Chuáº©n hÃ³a cÃ¡c sá»‘ nguyÃªn tá»‘/sá»‘ xáº¥u vá»� cÃ¡c sá»‘ chia vÃ ng gáº§n nháº¥t.r@   rA   rB   rC   é   )rC   rD   rD   é   )rD   rE   rE   é   )rG   rH   N)r
   )rL   s    r:   Útest_normalize_frame_countz:TestZeroWasteContactSheetTiling.test_normalize_frame_count•   sé   € å$ QÑ'Ô'¨1Ò,Ð,Ð,Ð,Ý$ QÑ'Ô'¨1Ò,Ð,Ð,Ð,Ý$ QÑ'Ô'¨1Ò,Ð,Ð,Ð,Ý$ QÑ'Ô'¨1Ò,Ð,Ð,Ð,Ý$ QÑ'Ô'¨6Ð1Ð1Ð1Ð1Ý$ QÑ'Ô'¨1Ò,Ð,Ð,Ð,Ý$ QÑ'Ô'¨6Ð1Ð1Ð1Ð1Ý$ QÑ'Ô'¨1Ò,Ð,Ð,Ð,Ý$ RÑ(Ô(¨HÐ4Ð4Ð4Ð4Ð4Ð4r<   c                 óJ  — |d         }|d         dz  }t          |d|d¬¦  «        \  }}|€J ‚|�|                     ¦   «         sJ ‚|                     ¦   «         j        dk    sJ ‚|j        \  }}}t          d¦  «        \  }	}
|	d	k    r|
d
k    sJ ‚|d|	z  |	z  k    sJ ‚|d|
z  |
z  k    sJ ‚||	z  }||
z  }t          |
¦  «        D ]]}t          |	¦  «        D ]K}|||z  |dz   |z  …||z  |dz   |z  …f         }t          j        |¦  «        dk    sJ d|› d|› d�¦   «         ‚ŒLŒ^dS )uf   Táº¡o contact sheet thá»±c táº¿ tá»« video vÃ  Ä‘áº£m báº£o kÃ­ch thÆ°á»›c chÃ­nh xÃ¡c tuyá»‡t Ä‘á»‘i.r-   r,   ztest_sheet_6frames.jpgrD   )é€  é8  )Ú
video_pathÚ
num_framesÚoutput_pathÚtarget_sizeNéˆ  rB   rA   rX   rY   r@   g      @u   Ã” (z, u)   ) bá»‹ rá»—ng Ä‘en (unfilled black cell)!)	r   ÚexistsÚstatÚst_sizeÚshaper	   ÚrangeÚnpÚmean)rL   r;   rZ   Ú
sheet_pathÚ	sheet_imgÚout_pathÚhÚwÚcrO   rP   Úcell_wÚcell_hÚrÚcolÚcells                   r:   Ú9test_create_contact_sheet_dimensions_and_zero_black_cellszYTestZeroWasteContactSheetTiling.test_create_contact_sheet_dimensions_and_zero_black_cells¡   s±  € à$ ^Ô4ˆ
Ø$ UÔ+Ð.FÑFˆ
å?Ø!ØØ"Ø$ð	
ñ 
ô 
Ñˆ	�8ð Ð$Ð$Ð$ØÐ#¨¯ªÑ(9Ô(9Ð#Ð#Ð9Ø�}Š}‰ŒÔ&¨Ò-Ð-Ð-Ð-ð ”/‰ˆˆ1ˆaÝ,¨QÑ/Ô/‰
ˆˆdØ�qŠyˆy˜T QšY˜Y˜YÐ&Ø�T˜T‘\ TÑ)Ò)Ð)Ð)Ð)Ø�T˜T‘\ TÑ)Ò)Ð)Ð)Ð)ð �d‘ˆØ�d‘ˆÝ�t‘”ð 	gð 	gˆAÝ˜T‘{”{ð gð g�Ø   V¡¨Q°©U°fÑ,<Ð!<¸cÀF¹lÈCÐRSÉGÐW]ÑK]Ð>]Ð!]Ô^�å”w˜t‘}”} sÒ*Ð*Ð*Ð,f°1Ð,fÐ,f¸Ð,fÐ,fÐ,fÑ*Ô*Ð*Ð*ðgð	gð 	gr<   c                 ó˜   — |d         }t          |d¬¦  «        }|€J ‚t          |¦  «        dk    sJ ‚|                     d¦  «        sJ ‚dS )uG   TrÃ­ch xuáº¥t JPEG byte stream trá»±c tiáº¿p cho Multimodal Vision LLM.r-   rD   )r[   Nr^   s   ÿØÿ)r   ÚlenÚ
startswith)rL   r;   rZ   Ú	raw_bytess       r:   Ú test_extract_contact_sheet_bytesz@TestZeroWasteContactSheetTiling.test_extract_contact_sheet_bytesÁ   sa   € à$ ^Ô4ˆ
Ý/°
ÀqÐIÑIÔIˆ	ØÐ$Ð$Ð$Ý�9‰~Œ~ Ò$Ð$Ð$Ð$à×#Ò# OÑ4Ô4Ð4Ð4Ð4Ð4Ð4r<   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rQ   rV   rq   rv   © r<   r:   r>   r>   Š   s]   € € € € € ØaÐaðkð kð kð
5ð 
5ð 
5ðgð gð gð@5ð 5ð 5ð 5ð 5r<   r>   c                   ó0   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ ZdS )Ú(TestFlowKitStrictErrorCatalogAndHardCapsuJ   Kiá»ƒm chá»©ng danh má»¥c 14 lá»—i vÃ  cÆ¡ cháº¿ Hard Caps tuyá»‡t Ä‘á»‘i.c                 ó$  — t          t          ¦  «        dk    sJ ‚t          t          ¦  «        dk    sJ ‚d„ t          j        ¦   «         D ¦   «         }d„ t          j        ¦   «         D ¦   «         }d„ t          j        ¦   «         D ¦   «         }t          |¦  «        dk    sJ ‚t	          |¦  «        h d£k    sJ ‚t          |¦  «        dk    sJ ‚t	          |¦  «        h d£k    sJ ‚t          |¦  «        dk    sJ ‚t	          |¦  «        h d	£k    sJ ‚d
S )uV   XÃ¡c nháº­n Ä‘á»§ 14 lá»—i theo 3 táº§ng nghiÃªm ngáº·t (5 Critical, 5 High, 4 Minor).é   c                 ó$   — g | ]\  }}|d k    ¯|‘ŒS )Úcriticalr{   ©Ú.0ÚkÚvs      r:   ú
<listcomp>z\TestFlowKitStrictErrorCatalogAndHardCaps.test_catalog_14_errors_complete.<locals>.<listcomp>×   s!   € ÐXÐXÐX¡  AÈÈZÊÈ˜1ÈÈÈr<   c                 ó$   — g | ]\  }}|d k    ¯|‘ŒS )Úhighr{   r‚   s      r:   r†   z\TestFlowKitStrictErrorCatalogAndHardCaps.test_catalog_14_errors_complete.<locals>.<listcomp>Ø   s!   € ÐPÐPÐP™T˜Q ÀAÈÂKÀK�qÀKÀKÀKr<   c                 ó$   — g | ]\  }}|d k    ¯|‘ŒS )Úminorr{   r‚   s      r:   r†   z\TestFlowKitStrictErrorCatalogAndHardCaps.test_catalog_14_errors_complete.<locals>.<listcomp>Ù   s!   € ÐRÐRÐR™d˜a ÀQÈ'Â\À\˜À\À\À\r<   rS   >   Ú
breed_swapÚrole_reversalÚbrand_logo_textÚcharacter_driftÚcharacter_count_drift>   Úscale_breakÚcamera_driftÚobject_morphÚreverse_motionÚhuman_hands_limbsrC   >   Ú
micro_blurÚcolor_shiftÚbackground_warpÚlighting_jitterN)rs   r   r   ÚitemsÚset)rL   Úcritical_errorsÚhigh_errorsÚminor_errorss       r:   Útest_catalog_14_errors_completezHTestFlowKitStrictErrorCatalogAndHardCaps.test_catalog_14_errors_completeÒ   sp  € åÕ&Ñ'Ô'¨2Ò-Ð-Ð-Ð-ÝÕ(Ñ)Ô)¨RÒ/Ð/Ð/Ð/àXÐXÕ)<Ô)BÑ)DÔ)DÐXÑXÔXˆØPÐPÕ%8Ô%>Ñ%@Ô%@ÐPÑPÔPˆØRÐRÕ&9Ô&?Ñ&AÔ&AÐRÑRÔRˆå�?Ñ#Ô# qÒ(Ð(Ð(Ð(Ý�?Ñ#Ô#ð (
ð (
ð (
ò 
ð 
ð 
ð 
õ
 �;ÑÔ 1Ò$Ð$Ð$Ð$Ý�;ÑÔð $
ð $
ð $
ò 
ð 
ð 
ð 
õ
 �<Ñ Ô  AÒ%Ð%Ð%Ð%Ý�<Ñ Ô ð %
ð %
ð %
ò 
ð 
ð 
ð 
ð 
ð 
r<   c                 ó  — t          ddddgt          ddd¬¦  «        ¬¦  «        }|j        j        dk    sJ ‚|j        d	k    sJ ‚|j        d
u sJ ‚|j        dk    sJ ‚|j        j        d
u sJ ‚|j        j        d	k    sJ ‚dS )ue   Critical Error Báº®T BUá»˜C Ã©p character_consistency <= 0.30, overall_score <= 0.59, approved=False.g\�Âõ(\ï?TÚAPPROVErŽ   gffffffî?)Úcharacter_consistencyÚscoreÚcharacter_match©Úoverall_scoreÚapprovedÚsuggested_actionÚdetected_errorsÚ	shot_evalç333333Ó?çáz®Gáâ?FÚRETAKE_SHOTN)	r   r   r©   r¡   r¥   r¦   r§   r£   r¢   )rL   Úverdicts     r:   Ú$test_critical_error_forces_hard_capszMTestFlowKitStrictErrorCatalogAndHardCaps.test_critical_error_forces_hard_capsì   sË   € õ %ØØØ&Ø.Ð/Ý$Ø&*ØØ $ðñ ô ð

ñ 

ô 

ˆð Ô Ô6¸$Ò>Ð>Ð>Ð>ØÔ$¨Ò,Ð,Ð,Ð,ØÔ 5Ð(Ð(Ð(Ð(ØÔ'¨=Ò8Ð8Ð8Ð8ØÔ Ô0°EÐ9Ð9Ð9Ð9ØÔ Ô&¨$Ò.Ð.Ð.Ð.Ð.Ð.r<   c           
      óü   — g d¢}|D ]t}t          dd|gt          dd¬¦  «        ¬¦  «        }|j        dk    sJ d|› d�¦   «         ‚|j        d	u sJ d|› d
�¦   «         ‚|j        dk    sJ ‚|j        j        dk    sJ ‚ŒudS )uT   Táº¥t cáº£ 5 lá»—i Critical Ä‘á»�u kÃ­ch hoáº¡t cÃ¹ng má»™t cÆ¡ cháº¿ cháº·n cá»©ng.)rŽ   r‹   rŒ   r�   r�   gÍÌÌÌÌÌì?T)r¡   r¢   ©r¥   r¦   r¨   r©   r«   õ   Lá»—i u"    khÃ´ng háº¡ overall_score <= 0.59Fu     khÃ´ng tá»« chá»‘i phÃª duyá»‡tr¬   rª   N)r   r   r¥   r¦   r§   r©   r¡   )rL   Úcritical_listÚcrit_errr…   s       r:   Ú,test_all_5_critical_errors_trigger_hard_capszUTestFlowKitStrictErrorCatalogAndHardCaps.test_all_5_critical_errors_trigger_hard_caps  sÚ   € ð
ð 
ð 
ˆð &ð 
	=ð 
	=ˆHÝ"Ø"ØØ!) 
Ý(¸tÈ4ÐPÑPÔPð	ñ ô ˆAð ”? dÒ*Ð*Ð*Ð,a°XÐ,aÐ,aÐ,aÑ*Ô*Ð*Ø”: Ð&Ð&Ð&Ð([°Ð([Ð([Ð([Ñ&Ô&Ð&ØÔ%¨Ò6Ð6Ð6Ð6Ø”;Ô4¸Ò<Ð<Ð<Ð<Ð<ð
	=ð 
	=r<   c           	      óÖ   — g d¢}|D ]a}t          dd|gt          d¬¦  «        ¬¦  «        }|j        dk    sJ d|› d�¦   «         ‚|j        d	u sJ d|› d
�¦   «         ‚|j        dk    sJ ‚ŒbdS )u`   High Error Báº®T BUá»˜C Ã©p overall_score <= 0.74, approved=False, suggested_action=RETAKE_SHOT.)r‘   r’   r“   r”   r�   gq=
×£pí?T©r¢   r°   g®Gáz®ç?r±   u"    khÃ´ng háº¡ overall_score <= 0.74Fu    khÃ´ng há»§y phÃª duyá»‡tr¬   N©r   r   r¥   r¦   r§   )rL   Ú	high_listÚhigh_errr…   s       r:   Ú test_high_error_forces_hard_capszITestFlowKitStrictErrorCatalogAndHardCaps.test_high_error_forces_hard_caps  sÂ   € ð
ð 
ð 
ˆ	ð "ð 		7ð 		7ˆHÝ"Ø"ØØ!) 
Ý(¨tÐ4Ñ4Ô4ð	ñ ô ˆAð ”? dÒ*Ð*Ð*Ð,a°XÐ,aÐ,aÐ,aÑ*Ô*Ð*Ø”: Ð&Ð&Ð&Ð(U°Ð(UÐ(UÐ(UÑ&Ô&Ð&ØÔ%¨Ò6Ð6Ð6Ð6Ð6ð		7ð 		7r<   c           	      ó˜   — t          dddddgt          d¬¦  «        ¬¦  «        }|j        dk    sJ ‚|j        du sJ ‚|j        dk    sJ ‚dS )	uP   Minor Errors khÃ´ng cháº·n cá»©ng, cho phÃ©p duyá»‡t náº¿u overall_score >= 0.8.g333333ë?Tr    r˜   r•   r¶   r¤   Nr·   )rL   r…   s     r:   Ú0test_minor_errors_allow_approval_if_score_passeszYTestFlowKitStrictErrorCatalogAndHardCaps.test_minor_errors_allow_approval_if_score_passes&  sw   € åØØØ&Ø.°Ð=Ý$¨4Ð0Ñ0Ô0ð
ñ 
ô 
ˆð Œ $Ò&Ð&Ð&Ð&ØŒz˜TÐ!Ð!Ð!Ð!ØÔ! YÒ.Ð.Ð.Ð.Ð.Ð.r<   N)	rw   rx   ry   rz   rž   r®   r´   rº   r¼   r{   r<   r:   r}   r}   Ï   se   € € € € € ØTÐTð
ð 
ð 
ð4/ð /ð /ð.=ð =ð =ð$7ð 7ð 7ð"/ð /ð /ð /ð /r<   r}   c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚTestDiagnosticPromptHealinguR   Kiá»ƒm chá»©ng phÃ¡c Ä‘á»“ Ä‘iá»�u trá»‹ prompt tá»± hÃ nh (Self-Correction Loop).c                 óà   — t          t          ¦  «        dk    sJ ‚t          D ]K}|t          v sJ d|› �¦   «         ‚dt          |         v sJ ‚dt          |         v sJ ‚dt          |         v sJ ‚ŒLdS )uQ   Báº£n Ä‘á»“ Ä‘iá»�u trá»‹ ERROR_THERAPY_CATALOG pháº£i há»— trá»£ Ä‘á»§ 14 lá»—i.r   u(   Thiáº¿u liá»‡u phÃ¡p Ä‘iá»�u trá»‹ cho: ÚtherapyÚ
vi_therapyÚtierN)rs   r   r   )rL   Úerr_keys     r:   Ú)test_therapy_catalog_covers_all_14_errorszETestDiagnosticPromptHealing.test_therapy_catalog_covers_all_14_errors;  s¡   € åÕ(Ñ)Ô)¨RÒ/Ð/Ð/Ð/Ý*ð 	<ð 	<ˆGØÕ3Ð3Ð3Ð3Ð5iÐ`gÐ5iÐ5iÑ3Ô3Ð3ØÕ 5°gÔ >Ð>Ð>Ð>Ð>ØÕ#8¸Ô#AÐAÐAÐAÐAØÕ2°7Ô;Ð;Ð;Ð;Ð;Ð;ð		<ð 	<r<   c                 óð   — d}t          j        |ddgdd¬¦  «        \  }}t          |¦  «        dk    sJ ‚d|v sJ ‚d	|v sJ ‚d
|v sJ ‚d|v sJ ‚d|v sJ ‚|                     d¦  «        sJ ‚d|v sJ ‚d|v sJ ‚dS )ug   BÆ¡m chá»‰ thá»‹ khÃ¡ng lá»—i vÃ  báº£o toÃ n nguyÃªn váº¹n Audio Guard & Closed Lips Guard á»Ÿ cuá»‘i.uã   ThÃºy Kiá»�u ngáº¯m trÄƒng bÃªn há»“ sen. [KHÃ“A KHáº¨U HÃŒNH Báº®T BUá»˜C: MÃ´i khÃ©p kÃ­n, khÃ´ng máº¥p mÃ¡y thoáº¡i] Quy táº¯c Ã¢m thanh: Tuyá»‡t Ä‘á»‘i khÃ´ng nháº¡c ná»�n BGM, chá»‰ giá»¯ tiáº¿ng foley tiáº¿ng giÃ³ thá»•i.rŽ   r‘   õ   ThÃºy Kiá»�ur@   )Úoriginal_promptr¨   Úcharacter_nameÚcyclerA   zcharacter_drift (critical)zcamera_drift (high)zHEALING-CRITICALúHEALING-HIGHu.   chá»‰ giá»¯ tiáº¿ng foley tiáº¿ng giÃ³ thá»•i.õ   Quy táº¯c Ã¢m thanh:u    [KHÃ“A KHáº¨U HÃŒNH Báº®T BUá»˜CN)r   Úheal_promptrs   Úendswith©rL   Ú
raw_promptÚhealedÚapplieds       r:   Ú7test_heal_prompt_injects_therapies_and_preserves_guardszSTestDiagnosticPromptHealing.test_heal_prompt_injects_therapies_and_preserves_guardsD  sî   € ð{ð 	õ 1Ô<Ø&Ø.°Ð?Ø)Øð	
ñ 
ô 
‰ˆ�õ �7‰|Œ|˜qÒ Ð Ð Ð Ø+¨wÐ6Ð6Ð6Ð6Ø$¨Ð/Ð/Ð/Ð/ð " VÐ+Ð+Ð+Ð+Ø Ð'Ð'Ð'Ð'Ø Ð'Ð'Ð'Ð'ð �ŠÐOÑPÔPÐPÐPÐPØ%¨Ð/Ð/Ð/Ð/Ø1°VÐ;Ð;Ð;Ð;Ð;Ð;r<   c                 ó,  — d}t          j        |dgd¬¦  «        \  }}t          |¦  «        dk    sJ ‚d|v sJ ‚t          j        |dgd¬¦  «        \  }}t          |¦  «        dk    sJ ‚t          j        |dgd¬¦  «        \  }}|g k    sJ ‚||k    sJ ‚dS )	u_   VÃ²ng láº·p tá»± sá»­a Báº®T BUá»˜C dá»«ng sau tá»‘i Ä‘a 2 chu trÃ¬nh (MAX_HEALING_CYCLES = 2).u.   Kim Trá»�ng dá»«ng ngá»±a trÆ°á»›c ngÃµ Ä‘Ã o.r’   r@   )rÉ   rÊ   rA   rB   N)r   rÌ   rs   )rL   rÏ   Úh1Úa1Úh2Úa2Úh3Úa3s           r:   Útest_heal_prompt_cycle_boundingz;TestDiagnosticPromptHealing.test_heal_prompt_cycle_boundinga  sÅ   € àEˆ
õ (Ô3°JÀÐ@PÐXYÐZÑZÔZ‰ˆˆBÝ�2‰wŒw˜!Š|ˆ|ˆ|ˆ|Ø Ð#Ð#Ð#Ð#õ (Ô3°JÀÐ@PÐXYÐZÑZÔZ‰ˆˆBÝ�2‰wŒw˜!Š|ˆ|ˆ|ˆ|õ (Ô3°JÀÐ@PÐXYÐZÑZÔZ‰ˆˆBØ�RŠxˆxˆxˆxØ�ZÒÐÐÐÐÐr<   c                 óò   — d}t          j        |g d¢dd¬¦  «        \  }}|d                              d¦  «        sJ ‚|d                              d¦  «        sJ ‚|d	                              d
¦  «        sJ ‚dS )uW   Chá»‰ thá»‹ Critical luÃ´n Ä‘Æ°á»£c Æ°u tiÃªn bÆ¡m trÆ°á»›c chá»‰ thá»‹ High vÃ  Minor.u&   VÆ°Æ¡ng Quan Ä‘á»©ng nhÃ¬n chá»‹ gÃ¡i.)r˜   r‹   r‘   u   VÆ°Æ¡ng Quanr@   )r¨   rÈ   rÉ   r   r‹   r‘   rA   r˜   N)r   rÌ   rt   rÎ   s       r:   Ú(test_heal_prompt_critical_first_priorityzDTestDiagnosticPromptHealing.test_heal_prompt_critical_first_prioritys  s—   € à=ˆ
Ý0Ô<ØØMÐMÐMØ)Øð	
ñ 
ô 
‰ˆ�ð �qŒz×$Ò$ \Ñ2Ô2Ð2Ð2Ð2Ø�qŒz×$Ò$ ^Ñ4Ô4Ð4Ð4Ð4Ø�qŒz×$Ò$Ð%6Ñ7Ô7Ð7Ð7Ð7Ð7Ð7r<   N)rw   rx   ry   rz   rÄ   rÒ   rÚ   rÜ   r{   r<   r:   r¾   r¾   8  sV   € € € € € Ø\Ð\ð<ð <ð <ð<ð <ð <ð: ð  ð  ð$8ð 8ð 8ð 8ð 8r<   r¾   c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚTestCinematic3BeatShotPaceruX   Kiá»ƒm chá»©ng cáº¥u trÃºc nhá»‹p Ä‘iá»‡u 3 há»“i Ä‘iá»‡n áº£nh vÃ  tÃ¡ch biá»‡t camera.c                 óf   — d}t          j        |d¬¦  «        }d|v sJ ‚d|v sJ ‚d|v sJ ‚d|v sJ ‚dS )	uT   Tá»± Ä‘á»™ng phÃ¢n rÃ£ vÄƒn xuÃ´i thÃ nh 3 Beat vÃ  cÃ¢u lá»‡nh Camera Ä‘á»™c láº­p.uº   NÃ ng Kiá»�u tá»±a cá»­a sá»• nhÃ¬n cÃ nh Ä‘Ã o phai. GiÃ³ xuÃ¢n thoáº£ng qua lay Ä‘á»™ng tÃ  Ã¡o xanh ngá»�c. Má»™t giá»�t nÆ°á»›c máº¯t kháº½ lÄƒn trÃªn mÃ¡, láº¯ng láº¡i tráº§m ngÃ¢m.zSlow push-in 50mm anamorphic)rÏ   Úcamera_motionu    [Beat 1 (0-3s) - Thiáº¿t láº­p]:u,   [Beat 2 (3-6s) - Ká»‹ch tÃ­nh & Cáº£m xÃºc]:u1   [Beat 3 (6-10s) - Láº¯ng Ä‘á»�ng & Ná»‘i tiáº¿p]:u7   [Chuyá»ƒn Ä‘á»™ng Camera]: Slow push-in 50mm anamorphicN©r   Úformat_3beat_prompt)rL   ÚpromptÚpaceds      r:   Ú%test_format_3beat_prompt_auto_parsingzATestCinematic3BeatShotPacer.test_format_3beat_prompt_auto_parsingˆ  sx   € ðZð 	õ
 #Ô6ØØ8ð
ñ 
ô 
ˆð
 2°UÐ:Ð:Ð:Ð:Ø=ÀÐFÐFÐFÐFØBÀeÐKÐKÐKÐKØHÈEÐQÐQÐQÐQÐQÐQr<   c                 óh   — t          j        ddddd¬¦  «        }d|v sJ ‚d|v sJ ‚d|v sJ ‚d|v sJ ‚dS )	u@   Sá»­ dá»¥ng 3 beat tÆ°á»�ng minh do Ä‘áº¡o diá»…n chá»‰ Ä‘á»‹nh.u   Shot tá»•ngzStatic lock-offu   Kiá»�u bÆ°á»›c vÃ o phÃ²ngu'   Kiá»�u cháº¡m tay vÃ o cÃ¢y Ä‘Ã n Ä‘Ã¡yu&   Kiá»�u khÃ©p máº¯t nhá»› ngÆ°á»�i xÆ°a)rÏ   rà   Úbeat_1_descÚbeat_2_descÚbeat_3_descu*   [Chuyá»ƒn Ä‘á»™ng Camera]: Static lock-offNrá   )rL   rä   s     r:   Ú'test_format_3beat_prompt_explicit_beatszCTestCinematic3BeatShotPacer.test_format_3beat_prompt_explicit_beats™  st   € å"Ô6Ø$Ø+Ø4ØAØ@ð
ñ 
ô 
ˆð ,¨uÐ4Ð4Ð4Ð4Ø8¸EÐAÐAÐAÐAØ7¸5Ð@Ð@Ð@Ð@Ø;¸uÐDÐDÐDÐDÐDÐDr<   N)rw   rx   ry   rz   rå   rê   r{   r<   r:   rÞ   rÞ   …  s@   € € € € € ØbÐbðRð Rð Rð"Eð Eð Eð Eð Er<   rÞ   c                   óH   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ ZdS )ÚTestSmartTrimAndPostProductionuG   Kiá»ƒm chá»©ng Dynamic Head Trim, Narrator Fitting vÃ  Smart Stitching.c                 ó  — t          ¦   «         }|d         }|d         dz  }|                     t          |¦  «        t          |¦  «        dd¬¦  «        }t          |¦  «                             ¦   «         sJ ‚|t          |¦  «        k    sJ ‚|                     t          |¦  «        ¦  «        }|                     |¦  «        }|d         |d         k     sJ ‚t          |d         |d         z
  dz
  ¦  «        dk     sJ ‚d	S )
uG   PhÃ¡t hiá»‡n 1 giÃ¢y Ä‘áº§u tÄ©nh vÃ  tá»± Ä‘á»™ng cáº¯t tá»‰a -ss 1.0.r.   r,   ztrimmed_static_head.mp4ç      ð?T©rZ   r\   Útrim_durÚdetect_staticÚdurationg      Ð?N)r   Úsmart_trim_shot_headr2   r   r_   Úinspect_shot_audioÚabs)rL   r;   ÚengineÚstatic_videoÚtrimmed_outÚoutÚrep_origÚrep_trims           r:   Ú#test_smart_trim_detects_static_headzBTestSmartTrimAndPostProduction.test_smart_trim_detects_static_head¯  s  € å&Ñ(Ô(ˆØ&Ð':Ô;ˆØ% eÔ,Ð/HÑHˆà×)Ò)Ý˜<Ñ(Ô(Ý˜KÑ(Ô(ØØð	 *ñ 
ô 
ˆõ �C‰yŒy×ÒÑ!Ô!Ð!Ð!Ð!Ø•c˜+Ñ&Ô&Ò&Ð&Ð&Ð&ð ×,Ò,­S°Ñ->Ô->Ñ?Ô?ˆØ×,Ò,¨SÑ1Ô1ˆØ˜
Ô# h¨zÔ&:Ò:Ð:Ð:Ð:Ý�8˜JÔ'¨(°:Ô*>Ñ>ÀÑDÑEÔEÈÒLÐLÐLÐLÐLÐLr<   c                 ó  — t          ¦   «         }|d         }|d         dz  }|                     t          |¦  «        t          |¦  «        dd¬¦  «        }|t          |¦  «        k    sJ ‚|                     ¦   «         rJ ‚dS )uD   Video cÃ³ chuyá»ƒn Ä‘á»™ng ngay tá»« Ä‘áº§u thÃ¬ khÃ´ng cáº¯t tá»‰a.r-   r,   zskip_moving_head.mp4rî   Trï   N)r   ró   r2   r_   )rL   r;   rö   r-   rø   rù   s         r:   Ú"test_smart_trim_skips_dynamic_headzATestSmartTrimAndPostProduction.test_smart_trim_skips_dynamic_headÅ  s–   € å&Ñ(Ô(ˆØ& ~Ô6ˆØ% eÔ,Ð/EÑEˆà×)Ò)Ý˜<Ñ(Ô(Ý˜KÑ(Ô(ØØð	 *ñ 
ô 
ˆð •c˜,Ñ'Ô'Ò'Ð'Ð'Ð'Ø×%Ò%Ñ'Ô'Ð'Ð'Ð'Ð'Ð'r<   c                 ó4  — t          ¦   «         }|d         }|d         }|d         dz  }|                     t          |¦  «        t          |¦  «        t          |¦  «        d¬¦  «        }|du sJ ‚|                     ¦   «         sJ ‚|                     t          |¦  «        ¦  «        }|d         du sJ ‚t          |d	         d
z
  ¦  «        dk     sJ ‚|                     t          |¦  «        ¦  «        }dt          |d         ¦  «        cxk    rdk    sn J ‚dS )uZ   Khá»›p thá»�i lÆ°á»£ng video vá»›i giá»�ng Ä‘á»�c + 0.3s buffer vÃ  chuáº©n hÃ³a EBU R128.r-   r/   r,   zfitted_narration.mp4rª   )rZ   Únarration_audio_pathr\   Ú
buffer_secTÚ	has_audiorò   gffffff@gš™™™™™É?g     €0ÀÚinput_ig      'ÀN)r   Úfit_footage_to_narrationr2   r_   rô   rõ   Úmeasure_loudnessÚfloat)	rL   r;   rö   r-   r/   Ú
fitted_outÚokÚrepÚmeass	            r:   Útest_fit_footage_to_narrationz<TestSmartTrimAndPostProduction.test_fit_footage_to_narrationÖ  s6  € å&Ñ(Ô(ˆØ& ~Ô6ˆØ)Ð*;Ô<ˆØ$ UÔ+Ð.DÑDˆ
à×,Ò,Ý˜<Ñ(Ô(Ý!$ _Ñ!5Ô!5Ý˜J™œØð	 -ñ 
ô 
ˆð �TˆzˆzˆzˆzØ× Ò Ñ"Ô"Ð"Ð"Ð"Ø×'Ò'­¨J©¬Ñ8Ô8ˆØ�;Ô 4Ð'Ð'Ð'Ð'å�3�z”? SÑ(Ñ)Ô)¨DÒ0Ð0Ð0Ð0à×&Ò&¥s¨:¡¤Ñ7Ô7ˆØ�˜d 9œoÑ.Ô.Ð7Ð7Ò7Ð7°%Ò7Ð7Ð7Ð7Ð7Ð7Ð7Ð7r<   c                 óˆ  — t          ¦   «         }|d         }|d         }t          |¦  «        ddœt          |¦  «        ddœg}|d         dz  }|                     |t          |¦  «        d¬¦  «        }|d	u sJ ‚|                     ¦   «         sJ ‚|                     t          |¦  «        ¦  «        }|d
         d	u sJ ‚|                     d¦  «        p|j        }	t          j        |	ddddddt          |¦  «        gd	d	d	¬¦  «        }
t          j
        |
j        ¦  «        }t          d„ |d         D ¦   «         d         ¦  «        }t          d„ |d         D ¦   «         d         ¦  «        }t          ||z
  ¦  «        dk     s'J d|d›d|d›dt          ||z
  ¦  «        d›d�¦   «         ‚t          |¦  «        ddœt          |¦  «        ddœg}|d         dz  }|                     |t          |¦  «        ¦  «        }|d	u sJ ‚|                     ¦   «         sJ ‚|                     t          |¦  «        ¦  «        }|d
         d	u sJ ‚dS )uR   GhÃ©p ná»‘i thÃ´ng minh: xfade cho CONTINUOUS_TAKE vÃ  hard cut cho CINEMATIC_CUT.r-   ÚCINEMATIC_CUT©rZ   Ú	take_typeÚCONTINUOUS_TAKEr,   zstitch_continuous.mp4ç      à?©Ú	xfade_durTr  Úffprobeú-vÚerrorú-show_entriesú*stream=codec_type,duration:format=durationú-ofÚjson©r*   Útextr+   c                 ó6   — g | ]}|d          dk    ¯|d         ‘ŒS ©Ú
codec_typeÚvideorò   r{   ©rƒ   Úss     r:   r†   zhTestSmartTrimAndPostProduction.test_stitch_flowkit_smart_continuous_vs_cinematic_cut.<locals>.<listcomp>  ó+   € Ð^Ð^Ð^¨À1À\Ä?ÐV]ÒC]ÐC]�q˜”}ÐC]ÐC]ÐC]r<   Ústreamsr   c                 ó6   — g | ]}|d          dk    ¯|d         ‘ŒS ©r  Úaudiorò   r{   r!  s     r:   r†   zhTestSmartTrimAndPostProduction.test_stitch_flowkit_smart_continuous_vs_cinematic_cut.<locals>.<listcomp>  r#  r<   çš™™™™™©?u   Lá»‡ch Ä‘á»“ng bá»™ A/V: Video=ú.3fú	s, Audio=z	s (delta=zs)zstitch_cut.mp4N)r   r2   Ústitch_flowkit_smartr_   rô   Úgetr  r3   r4   r  ÚloadsÚstdoutr  rõ   )rL   r;   rö   Úv1Úv2Úentries_continuousÚout_contÚok_contÚrep_contÚffprobe_exeÚ	probe_resÚp_dataÚv_durÚa_durÚentries_cutÚout_cutÚok_cutÚrep_cuts                     r:   Ú5test_stitch_flowkit_smart_continuous_vs_cinematic_cutzTTestSmartTrimAndPostProduction.test_stitch_flowkit_smart_continuous_vs_cinematic_cutî  sÛ  € å&Ñ(Ô(ˆØ˜^Ô,ˆØ˜^Ô,ˆõ ˜r™7œ7°ÐAÐAÝ˜r™7œ7Ð1BÐCÐCð
Ðð # 5Ô)Ð,CÑCˆØ×-Ò-Ð.@Å#ÀhÁ-Ä-Ð[^Ð-Ñ_Ô_ˆØ˜$ˆˆˆˆØ�ŠÑ Ô Ð Ð Ð Ø×,Ò,­S°©]¬]Ñ;Ô;ˆØ˜Ô$¨Ð,Ð,Ð,Ð,ð &×)Ò)¨)Ñ4Ô4ÐF¸¼ˆÝ”NØ˜$ ¨Ð:fÐhmÐouÕwzð  |Dñ  xEô  xEð  FØ d°$ð
ñ 
ô 
ˆ	õ ”˜IÔ,Ñ-Ô-ˆÝÐ^Ð^¨f°YÔ.?Ð^Ñ^Ô^Ð_`ÔaÑbÔbˆÝÐ^Ð^¨f°YÔ.?Ð^Ñ^Ô^Ð_`ÔaÑbÔbˆÝ�5˜5‘=Ñ!Ô! DÒ(Ð(Ð(ð  +MÈEð  +Mð  +Mð  +MÐ`eð  +Mð  +Mð  +MÕtwÐx}ð  Dñ  yDñ  uEô  uEð  +Mð  +Mð  +Mð  +MÑ(Ô(Ð(õ ˜r™7œ7°ÐAÐAÝ˜r™7œ7°ÐAÐAð
ˆð " %Ô(Ð+;Ñ;ˆØ×,Ò,¨[½#¸g¹,¼,ÑGÔGˆØ˜ˆ~ˆ~ˆ~ˆ~Ø�~Š~ÑÔÐÐÐØ×+Ò+­C°©L¬LÑ9Ô9ˆØ�{Ô# tÐ+Ð+Ð+Ð+Ð+Ð+r<   c                 óÞ  — t          ¦   «         }|d         }|d         dz  }t          |¦  «        ddœt          |¦  «        ddœt          |¦  «        ddœg}|                     |t          |¦  «        d¬¦  «        }|d	u sJ ‚|                     ¦   «         sJ ‚|                     d
¦  «        p|j        }t          j        |ddddddt          |¦  «        gd	d	d	¬¦  «        }t          j	        |j
        ¦  «        }	t          d„ |	d         D ¦   «         d         ¦  «        }
t          d„ |	d         D ¦   «         d         ¦  «        }t          |
|z
  ¦  «        dk     sJ d|
d›d|d›d�¦   «         ‚dS )uk   Kiá»ƒm chá»©ng ghÃ©p ná»‘i Ä‘a shot (3+ shots) vá»›i tá»• há»£p xen káº½ CONTINUOUS_TAKE vÃ  CINEMATIC_CUT.r-   r,   zstitch_3shot_mixed.mp4r  r  r  r  r  Tr  r  r  r  r  r  r  r  c                 ó6   — g | ]}|d          dk    ¯|d         ‘ŒS r  r{   r!  s     r:   r†   zaTestSmartTrimAndPostProduction.test_stitch_flowkit_smart_3shot_mixed_chaining.<locals>.<listcomp>,  r#  r<   r$  r   c                 ó6   — g | ]}|d          dk    ¯|d         ‘ŒS r&  r{   r!  s     r:   r†   zaTestSmartTrimAndPostProduction.test_stitch_flowkit_smart_3shot_mixed_chaining.<locals>.<listcomp>-  r#  r<   r(  u"   Lá»‡ch Ä‘á»“ng bá»™ 3-shot: Video=r)  r*  r"  N)r   r2   r+  r_   r,  r  r3   r4   r  r-  r.  r  rõ   )rL   r;   rö   r…   Ú	out_mixedÚentriesr  r5  r6  r7  r8  r9  s               r:   Ú.test_stitch_flowkit_smart_3shot_mixed_chainingzMTestSmartTrimAndPostProduction.test_stitch_flowkit_smart_3shot_mixed_chaining  sº  € å&Ñ(Ô(ˆØ˜NÔ+ˆØ# EÔ*Ð-EÑEˆ	õ ˜q™6œ6°Ð@Ð@Ý˜q™6œ6Ð0AÐBÐBÝ˜q™6œ6°Ð@Ð@ð
ˆð
 ×(Ò(¨µ#°i±.´.ÈCÐ(ÑPÔPˆØ�TˆzˆzˆzˆzØ×ÒÑ!Ô!Ð!Ð!Ð!à%×)Ò)¨)Ñ4Ô4ÐF¸¼ˆÝ”NØ˜$ ¨Ð:fÐhmÐouÕwzð  |Eñ  xFô  xFð  GØ d°$ð
ñ 
ô 
ˆ	õ ”˜IÔ,Ñ-Ô-ˆÝÐ^Ð^¨f°YÔ.?Ð^Ñ^Ô^Ð_`ÔaÑbÔbˆÝÐ^Ð^¨f°YÔ.?Ð^Ñ^Ô^Ð_`ÔaÑbÔbˆÝ�5˜5‘=Ñ!Ô! DÒ(Ð(Ð(Ð*oÈuÐ*oÐ*oÐ*oÐchÐ*oÐ*oÐ*oÐ*oÑ(Ô(Ð(Ð(Ð(r<   c                 ó$  — t          ¦   «         }|d         }|dz  }|j        dddddddddd	d
ddt          |¦  «        g}t          j        |dd¬¦  «         |                     t          |¦  «        dd¬¦  «        }|t          |¦  «        k    sJ ‚dS )u]   Video quÃ¡ ngáº¯n (<= 1.5s) Ä‘Æ°á»£c báº£o vá»‡ an toÃ n, khÃ´ng bá»‹ cáº¯t trá»¥i (-ss 1.0).r,   zultra_short_clip.mp4r   r   r    r!   z)testsrc=duration=1.2:size=640x360:rate=24z1sine=frequency=440:duration=1.2:sample_rate=48000r"   r#   r%   r&   Tr)   Frî   )rñ   rð   N)r   r0   r2   r3   r4   ró   )rL   r;   rö   r6   Úshort_videoÚcmdrù   s          r:   Ú$test_smart_trim_short_clip_safeguardzCTestSmartTrimAndPostProduction.test_smart_trim_short_clip_safeguard0  s´   € å&Ñ(Ô(ˆØ" 5Ô)ˆØÐ!7Ñ7ˆð ŒM˜4Ø�'˜4Ð!LØ�'˜4Ð!TØ�I˜v u­c°+Ñ.>Ô.>ð	
ˆõ 	Œ�s¨4°tÐ<Ñ<Ô<Ð<à×)Ò)­#¨kÑ*:Ô*:È%ÐZ]Ð)Ñ^Ô^ˆà•c˜+Ñ&Ô&Ò&Ð&Ð&Ð&Ð&Ð&r<   c                 óh  — d}t          j        |ddgd¦  «        \  }}t          |¦  «        dk    sJ ‚|                     d¦  «        sJ ‚d|v sJ ‚|                     d¦  «        |                     d¦  «        k     sJ ‚d	|v sJ ‚|                     d	¦  «        |                     d¦  «        k     sJ ‚d
S )um   Prompt Healer xá»­ lÃ½ chuáº©n xÃ¡c xuá»‘ng dÃ²ng, Closed Lips variant vÃ  báº£o lÆ°u Audio Guard á»Ÿ cuá»‘i.u‡   NÃ ng Kiá»�u nhÃ¬n xa xÄƒm.
[KHÃ“A KHáº¨U HÃŒNH: Ä�Ã´i mÃ´i khÃ©p cháº·t]
Quy táº¯c Ã¢m thanh: Tuyá»‡t Ä‘á»‘i KHÃ”NG sinh nháº¡c ná»�n.rŽ   r‘   rÆ   rA   u=   Quy táº¯c Ã¢m thanh: Tuyá»‡t Ä‘á»‘i KHÃ”NG sinh nháº¡c ná»�n.u   [KHÃ“A KHáº¨U HÃŒNHrË   z[HEALING-CRITICAL:N)r   rÌ   rs   rÍ   Úindex)rL   ÚprÐ   Ú	therapiess       r:   Ú2test_heal_prompt_newline_guard_and_canonical_orderzQTestSmartTrimAndPostProduction.test_heal_prompt_newline_guard_and_canonical_orderC  sÙ   € ð XˆÝ2Ô>¸qÐCTÐVdÐBeÐguÑvÔvÑˆ�	Ý�9‰~Œ~ Ò"Ð"Ð"Ð"à�ŠÐ^Ñ_Ô_Ð_Ð_Ð_à$¨Ð.Ð.Ð.Ð.Ø�|Š|Ð1Ñ2Ô2°V·\²\ÐBXÑ5YÔ5YÒYÐYÐYÐYà# vÐ-Ð-Ð-Ð-Ø�|Š|Ð0Ñ1Ô1°F·L²LÐAVÑ4WÔ4WÒWÐWÐWÐWÐWÐWr<   c                 óŠ   — |d         }|d         dz  }t          |d|¬¦  «        \  }}|€J ‚|                     ¦   «         sJ ‚dS )u_   Contact sheet vá»›i preserve_aspect_ratio=True duy trÃ¬ tá»‰ lá»‡ pixel 16:9 khÃ´ng mÃ©o hÃ¬nh.r-   r,   zar_preserved_sheet.jpgrD   )r[   r\   N)r   r_   )rL   r;   rZ   Ú	out_sheetrg   rK  s         r:   Ú(test_contact_sheet_preserve_aspect_ratiozGTestSmartTrimAndPostProduction.test_contact_sheet_preserve_aspect_ratioQ  s[   € à$ ^Ô4ˆ
Ø# EÔ*Ð-EÑEˆ	Ý8¸ÐPQÐ_hÐiÑiÔi‰ˆ	�1ØÐ$Ð$Ð$Ø�xŠx‰zŒzÐÐˆzÐÐr<   c                 ó�   — ddl }ddl} |j        |j        ddgddddd¬¦  «        }|j        €J ‚d	|j        v sJ ‚d
|j        v sJ ‚dS )ub   CLI cá»§a production_orchestrator há»— trá»£ Ä‘áº§y Ä‘á»§ --mode flowkit_smart vÃ  --pacing-3beat.r   Nz105_Production_Pipeline/production_orchestrator.pyz--helpTzutf-8Úreplace)r*   r  ÚencodingÚerrorsr+   Úflowkit_smartz--pacing-3beat)r3   Úsysr4   Ú
executabler.  )rL   r3   rV  Úress       r:   Ú(test_orchestrator_cli_flowkit_smart_modezGTestSmartTrimAndPostProduction.test_orchestrator_cli_flowkit_smart_modeY  s…   € àÐÐÐØˆ
ˆ
ˆ
ØˆjŒnØŒ^ÐPÐRZÐ[Ø d°WÀYÐVZð
ñ 
ô 
ˆð ŒzÐ%Ð%Ð%Ø #¤*Ð,Ð,Ð,Ð,Ø 3¤:Ð-Ð-Ð-Ð-Ð-Ð-r<   N)rw   rx   ry   rz   rü   rþ   r  r>  rD  rH  rM  rP  rY  r{   r<   r:   rì   rì   ¬  s«   € € € € € ØQÐQðMð Mð Mð,(ð (ð (ð"8ð 8ð 8ð0',ð ',ð ',ðRpð pð pð2'ð 'ð 'ð&Xð Xð Xðð ð ð
.ð 
.ð 
.ð 
.ð 
.r<   rì   )6rz   ÚosrV  r  ÚshutilÚtempfiler3   Úpathlibr   Útypingr   r   r   r   ÚpytestÚnumpyrd   Úcv2Ú__file__ÚresolveÚparentÚPROJECT_ROOTÚPIPELINE_DIRr2   ÚpathÚinsertÚcontact_sheet_enginer	   r
   r   r   r   Úprompt_healerr   r   r   r   Úantigravity_critic_gater   r   r   r   r   Úaudio_continuity_enginer   r   r   Úfixturer;   r>   r}   r¾   rÞ   rì   r{   r<   r:   ú<module>rn     s  ððð ð@ 
€	€	€	Ø 
€
€
€
Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ø €€€Ø Ð Ð Ð Ø 
€
€
€
àˆt�H‰~Œ~×%Ò%Ñ'Ô'Ô.Ô5€ØÐ6Ñ6€Ø€3€|ÑÔ˜CœHÐ$Ð$Ø„H‡O‚O�A�s�s˜<Ñ(Ô(Ñ)Ô)Ð)ðð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð €„�iÐ Ñ Ô ð1ð 1ñ !Ô ð1ðp>5ð >5ð >5ð >5ð >5ñ >5ô >5ð >5ðJb/ð b/ð b/ð b/ð b/ñ b/ô b/ð b/ðRF8ð F8ð F8ð F8ð F8ñ F8ô F8ð F8ðZ Eð  Eð  Eð  Eð  Eñ  Eô  Eð  EðNw.ð w.ð w.ð w.ð w.ñ w.ô w.ð w.ð w.ð w.r<   