§
    ÎÐj#S  ã                   ó´   — d dl Z ddlmZ dZdZ e j        de j        ¦  «        ZdZdd	„Z	dd„Z
dd„Zdd„Zd„ Zdd„Zdd„Zd„ Zd„ Zdd„Zd„ Zd„ Zd„ Zd„ ZdS )é    Né   )ÚSLASH_BLOCK_REz
#!PROMPT!:z!enhanced!
z$^\s*Speaker\s*\d+\s*\{[^{}\n]*\}\s*:ÚPGÚGc           	      ó,  — | €|S t          | t          ¦  «        r'|                      ¦   «                              ¦   «         } n.t          | t          t
          f¦  «        rt	          | ¦  «        } n|S dddddddddœ                     | | ¦  «        } | dv r| n|S )Nr   ÚWÚFGr   )r   r   é   Ú Ú0Ú1Ú2ÚP>   r   r   r	   r   ÚPW)Ú
isinstanceÚstrÚstripÚupperÚintÚfloatÚget)ÚvalueÚdefaults     úBC:\Users\johnn\OneDrive\Documents\AI\shared\utils\prompt_parser.pyÚnormalize_multi_prompts_moder   
   s¢   € Ø€}ØˆÝ�%�ÑÔð Ø—’‘”×#Ò#Ñ%Ô%ˆˆÝ	�E�C¥˜<Ñ	(Ô	(ð Ý�E‘
”
ˆˆàˆØ˜ ¨$°S¸sÈÐTXÐYÐY×]Ò]Ð^cÐejÑkÔk€EØÐ9Ð9Ð9ˆ5ˆ5¸wÐFó    ÚVideoTc                 óD   — d| › d�dfd| › d�dfg}|r|ddgz  }|dgz  }|S )	NzEach New Line Will Add a new z  Request to the Generation Queuer   z=Each new Paragraph separated by an Empty Line Will Add a new r   )zLEach Line Will be used for a new Sliding Window of the same Video Generationr   )zlEach Paragraph Separated by an Empty line will be used for a new Sliding Window of the same Video Generationr   )z)All the Lines are Part of the Same Promptr	   © )ÚmediumÚinclude_sliding_windowÚchoicess      r   Úget_multi_prompts_gen_choicesr#      sh   € à	Q¨Ð	QÐ	QÐ	QÐSVÐWØ	qÈÐ	qÐ	qÐ	qÐswÐxð€Gð ð 
ØØað Cð
ñ 	
ˆð ÐCÐDÑD€GØ€Nr   Fc                 óf  — |pd}|                       dd¦  «                              dd¦  «        } |                      t          ¦  «        r| t          t          ¦  «        d …         } |rt	          | ||¬¦  «        S d„ |                      d¦  «        D ¦   «         }d                     |¦  «                             ¦   «         } | sg S |s|dk    r| gS d|v rÂg g }}|                      d¦  «        D ]j}|                     ¦   «         s?|r<|                     d                     |¦  «                             ¦   «         ¦  «         g }ŒU|                     |¦  «         Œk|r:|                     d                     |¦  «                             ¦   «         ¦  «         |S d	„ |                      d¦  «        D ¦   «         S )
Nr   ú
ú
ú)Úsingle_promptc                 ó„   — g | ]=}|                      ¦   «                              d ¦  «        °)|                     ¦   «         ‘Œ>S )ú#)r   Ú
startswithÚrstrip)Ú.0Úlines     r   ú
<listcomp>z&split_prompt_units.<locals>.<listcomp>*   s<   € ÐjÐjÐj dÈTÏZÊZÉ\Ì\×MdÒMdÐehÑMiÔMiÐj�D—K’K‘M”MÐjÐjÐjr   r	   r   c                 ó^   — g | ]*}|                      ¦   «         ¯|                      ¦   «         ‘Œ+S r   ©r   )r-   Úone_lines     r   r/   z&split_prompt_units.<locals>.<listcomp><   s1   € ÐYÐYÐY ÈÏÊÑHXÔHXÐYˆH�NŠNÑÔÐYÐYÐYr   )	Úreplacer+   ÚENHANCED_PROMPT_PREFIXÚlenÚsplit_prompt_original_unitsÚsplitÚjoinr   Úappend)Úprompt_textÚmulti_prompts_gen_typer(   Ú	originalsÚprompt_linesÚpromptsÚcurrent_linesÚraw_lines           r   Úsplit_prompt_unitsrA   #   s×  € Ø3Ð9°rÐØ×%Ò% f¨dÑ3Ô3×;Ò;¸DÀ$ÑGÔG€KØ×ÒÕ4Ñ5Ô5ð @Ø!¥#Õ&<Ñ"=Ô"=Ð">Ð">Ô?ˆØð mÝ*¨;Ð8NÐ^kÐlÑlÔlÐlØjÐj¨k×.?Ò.?ÀÑ.EÔ.EÐjÑjÔj€LØ—)’)˜LÑ)Ô)×/Ò/Ñ1Ô1€KØð Øˆ	Øð Ð.°$Ò6Ð6Øˆ}ÐØ
Ð$Ð$Ð$Ø!# R�ˆØ#×)Ò)¨$Ñ/Ô/ð 	+ð 	+ˆHØ—>’>Ñ#Ô#ð Ø ð 'Ø—N’N 4§9¢9¨]Ñ#;Ô#;×#AÒ#AÑ#CÔ#CÑDÔDÐDØ$&�MØØ× Ò  Ñ*Ô*Ð*Ð*Øð 	=Ø�NŠN˜4Ÿ9š9 ]Ñ3Ô3×9Ò9Ñ;Ô;Ñ<Ô<Ð<ØˆØYÐY¨[×->Ò->¸tÑ-DÔ-DÐYÑYÔYÐYr   c           
      óp  ‡‡— t          |d¦  «        dk    rdS t          | pg ¦  «        } d„ | D ¦   «         Št          |t          t          f¦  «        rt	          |¦  «        nt          t          |¦  «        ¦  «        }dŠt          ˆˆfd„| D ¦   «         ¦  «        }|t	          ‰¦  «        k    p|}t	          ‰¦  «        dk     s"t	          | ¦  «        t	          ‰¦  «        k    s|sdS |t	          ‰¦  «        k    rd|› d	�nd}d
t	          | ¦  «        › dt	          ‰¦  «        › d|› dt	          ‰¦  «        › d�	S )Nr	   r   r   c                 ó~   — g | ]:}t          |pd ¦  «                             ¦   «                              d¦  «        ¯8|‘Œ;S )r   z[/©r   Úlstripr+   ©r-   Úprompts     r   r/   z=validate_sliding_window_prompt_boundaries.<locals>.<listcomp>B   sD   € ÐcÐcÐc &µs¸6¸<ÀRÑ7HÔ7H×7OÒ7OÑ7QÔ7Q×7\Ò7\Ð]aÑ7bÔ7bÐc�vÐcÐcÐcr   )zoverall_soundscape:znon_diegetic_music:c              3   óŒ   •K  — | ]>}|‰v p5t          |pd ¦  «                             ¦   «                              ‰¦  «        V — Œ?dS )r   NrD   )r-   rG   Úcommand_windowsÚstructured_fieldss     €€r   ú	<genexpr>z<validate_sliding_window_prompt_boundaries.<locals>.<genexpr>E   sm   øè è € ð  Ið  IÐv|˜F oÐ5Ðq½¸V¸\ÀrÑ9JÔ9J×9QÒ9QÑ9SÔ9S×9^Ò9^Ð_pÑ9qÔ9qð  Ið  Ið  Ið  Ið  Ið  Ir   r
   z and z End ImageszThe prompt is parsed as z sliding windows, but z explicit [/...] window markersz
 indicate aA   intended windows. With 'Each Paragraph Separated by an Empty line will be used for a new Sliding Window of the same Video Generation', every blank line starts a new window. Keep every line and labeled section belonging to one window adjacent with single newlines, and use exactly one blank line between complete windows.)r   Úlistr   Útupler5   r   ÚboolÚall)	r>   r;   Ú	image_endÚend_frame_countÚstructured_extrasÚintended_count_confirmedÚevidencerI   rJ   s	          @@r   Ú)validate_sliding_window_prompt_boundariesrU   >   sµ  øø€ Ý#Ð$:¸DÑAÔAÀTÒIÐIØˆrÝ�7�=˜bÑ!Ô!€GØcÐc¨GÐcÑcÔc€OÝ(2°9½tÅU¸mÑ(LÔ(LÐf•c˜)‘n”n�nÕRUÕVZÐ[dÑVeÔVeÑRfÔRf€OØFÐÝð  Ið  Ið  Ið  Ið  Ið  AHð  Iñ  Iô  Iñ  Iô  IÐØ.µ#°oÑ2FÔ2FÒFÐ[ÐJ[ÐÝ
ˆ?ÑÔ˜aÒÐ¥3 w¡<¤<µ3°Ñ3GÔ3GÒ#GÐ#GÐOgÐ#GØˆrØ7FÍ#ÈoÑJ^ÔJ^Ò7^Ð7^Ð3�Ð3Ð3Ð3Ð3Ðdf€Hð	^¥3 w¡<¤<ð 	^ð 	^ÅsÈ?ÑG[ÔG[ð 	^ð 	^ð  }Eð 	^ð 	^õ  QTð  Udñ  Qeô  Qeð 	^ð 	^ð 	^ðr   c                 ó\  — |                       dd¦  «                              dd¦  «        } |                      t          ¦  «        r| t          t          ¦  «        d …         } |                      ¦   «         } d„ |D ¦   «         }|sdS |dk    r|d         nd|v rd	nd                     |¦  «        S )
Nr%   r&   r'   c                 ó^   — g | ]*}|                      ¦   «         ¯|                      ¦   «         ‘Œ+S r   r1   rF   s     r   r/   z*serialize_prompt_units.<locals>.<listcomp>U   ó-   € ÐFÐFÐF &°v·|²|±~´~ÐFˆv�|Š|‰~Œ~ÐFÐFÐFr   r   r	   r   r   ú

)r3   r+   r4   r5   r   r8   )r:   r>   r;   s      r   Úserialize_prompt_unitsrZ   P   sÀ   € Ø×%Ò% f¨dÑ3Ô3×;Ò;¸DÀ$ÑGÔG€KØ×ÒÕ4Ñ5Ô5ð @Ø!¥#Õ&<Ñ"=Ô"=Ð">Ð">Ô?ˆØ×#Ò#Ñ%Ô%€KØFÐF¨GÐFÑFÔF€GØð ØˆrØ/°4Ò7Ð7ˆ7�1Œ:ˆ:ÈÐOeÐHeÐHe¸f¸fÐko×=uÒ=uÐv}Ñ=~Ô=~Ð~r   c                 ó  ‡‡‡‡‡— ‰pdŠ|                       dd¦  «                              dd¦  «        } |                      t          ¦  «        r| t          t          ¦  «        d …         } d„ }ˆfd„Š|s‰dk    ràg g }}|                      d¦  «        D ]u} ||¦  «        }|�|r|                     |¦  «         Œ'|                     ¦   «                              d¦  «        s'|                     |                     ¦   «         ¦  «         Œvd                     |¦  «                             ¦   «         }|r ‰d                     |¦  «        |¦  «        n|}	|	r|	gng S d	‰v rÁg g d cŠŠŠˆˆˆˆfd
„}
|                      d¦  «        D ]�} ||¦  «        }|�‰s‰r
 |
¦   «          |p‰ŠŒ"|                     ¦   «         s |
¦   «          ŒA|                     ¦   «                              d¦  «        rŒi‰                     |                     ¦   «         ¦  «         Œ‘ |
¦   «          ‰S g d cŠ}|                      d¦  «        D ]°} ||¦  «        }|�|r‰                     |¦  «         |p|}Œ+|                     ¦   «         r'|                     ¦   «                              d¦  «        rŒg‰                     |r ‰||¦  «        n%|                     ¦   «                              ¦   «         ¦  «         d }Œ±|r‰                     |¦  «         ‰S )Nr   r%   r&   r'   c                 ó–   — |                       t          ¦  «        r.| t          t          ¦  «        d …                              ¦   «         nd S ©N)r+   ÚPROMPT_UNIT_PREFIXr5   r   ©r.   s    r   Úsplit_markerz1split_prompt_original_units.<locals>.split_marker`   s@   € Ø9=¿ºÕI[Ñ9\Ô9\Ðfˆt•CÕ*Ñ+Ô+Ð,Ð,Ô-×3Ò3Ñ5Ô5Ð5ÐbfÐfr   c                 ó  •— d                      d„ t          j        |¦  «        D ¦   «         ¦  «        }t          j        d| ¦  «                             ¦   «         } d‰v s‰dk    rdnd}|r|› |› | › �                     ¦   «         n| S )Nú c              3   ó@   K  — | ]}|                      d ¦  «        V — ŒdS )r   N)Úgroup)r-   Úmatchs     r   rK   zNsplit_prompt_original_units.<locals>.original_with_commands.<locals>.<genexpr>d   s,   è è € ÐYÐY¨u˜EŸKšK¨™NœNÐYÐYÐYÐYÐYÐYr   r   r   r	   r&   )r8   r   ÚfinditerÚsubr   )ÚoriginalÚvisibleÚcommandsÚ	separatorr;   s       €r   Úoriginal_with_commandsz;split_prompt_original_units.<locals>.original_with_commandsc   sš   ø€ Ø—8’8ÐYÐY½Ô8OÐPWÑ8XÔ8XÐYÑYÔYÑYÔYˆÝ!Ô% b¨(Ñ3Ô3×9Ò9Ñ;Ô;ˆØÐ#9Ð9Ð9Ð=SÐW[Ò=[Ð=[�D�DÐadˆ	Ø=EÐS�(Ð1˜IÐ1 xÐ1Ð1×7Ò7Ñ9Ô9Ð9È8ÐSr   r	   r*   r   c                  ó®   •— d                      ‰¦  «                             ¦   «         } ‰r ‰‰| ¦  «        n| }|r‰                     |¦  «         g d cŠŠd S )Nr&   )r8   r   r9   )Úvisible_promptrG   r?   Úcurrent_originalrl   r>   s     €€€€r   Úflush_paragraphz4split_prompt_original_units.<locals>.flush_paragraphz   sl   ø€ à!ŸYšY }Ñ5Ô5×;Ò;Ñ=Ô=ˆNØQaÐuÐ+Ð+Ð,<¸nÑMÔMÐMÐguˆFØð 'Ø—’˜vÑ&Ô&Ð&Ø.0°$Ð+ˆMÐ+Ð+Ð+r   )	r3   r+   r4   r5   r7   r9   r   r,   r8   )r:   r;   r(   r`   r<   Úvisible_linesr@   Úmarkerrn   rG   rp   Úpending_originalr?   ro   rl   r>   s    `          @@@@r   r6   r6   Z   sÉ  øøøøø€ Ø3Ð9°rÐØ×%Ò% f¨dÑ3Ô3×;Ò;¸DÀ$ÑGÔG€KØ×ÒÕ4Ñ5Ô5ð @Ø!¥#Õ&<Ñ"=Ô"=Ð">Ð">Ô?ˆðgð gð gðTð Tð Tð Tð Tð ð *Ð.°$Ò6Ð6Ø#% r�=ˆ	Ø#×)Ò)¨$Ñ/Ô/ð 	8ð 	8ˆHØ!�\ (Ñ+Ô+ˆFØÐ!Øð -Ø×$Ò$ VÑ,Ô,Ð,ØØ—>’>Ñ#Ô#×.Ò.¨sÑ3Ô3ð 8Ø×$Ò$ X§_¢_Ñ%6Ô%6Ñ7Ô7Ð7øØŸš =Ñ1Ô1×7Ò7Ñ9Ô9ˆØQZÐnÐ'Ð'¨¯	ª	°)Ñ(<Ô(<¸nÑMÔMÐMÐ`nˆØ!Ð)�ˆxˆx rÐ)à
Ð$Ð$Ð$Ø35°r¸4Ð0ˆ�Ð 0ð	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð $×)Ò)¨$Ñ/Ô/ð 	4ð 	4ˆHØ!�\ (Ñ+Ô+ˆFØÐ!Ø ð &Ð$4ð &Ø#�OÑ%Ô%Ð%Ø#)Ð#=Ð-=Ð ØØ—>’>Ñ#Ô#ð Ø�Ñ!Ô!Ð!ØØ�~Š~ÑÔ×*Ò*¨3Ñ/Ô/ð ØØ× Ò  §¢Ñ!2Ô!2Ñ3Ô3Ð3Ð3ØˆÑÔÐØˆà " DÐ€GÐØ×%Ò% dÑ+Ô+ð 
 ð 
 ˆØ�˜hÑ'Ô'ˆØÐØð 1Ø—’Ð/Ñ0Ô0Ð0Ø%Ð9Ð)9ÐØØ�~Š~ÑÔð 	 8§>¢>Ñ#3Ô#3×#>Ò#>¸sÑ#CÔ#Cð 	ØØ�ŠÐM]Ð|Ð-Ð-Ð.>ÀÑIÔIÐIÐck×crÒcrÑctÔct×czÒczÑc|Ôc|Ñ}Ô}Ð}ØÐÐØð )Ø�ŠÐ'Ñ(Ô(Ð(Ø€Nr   c                 óÄ  — g }d„ | D ¦   «         } |€g }t          | d¬¦  «        D ]¨\  }}|dz
  t          |¦  «        k     r||dz
           nd|› �}t          j        dt	          |pd¦  «        ¦  «        }t          j        ddt	          |pd¦  «        ¦  «                             ¦   «         }|                     t          › d|› d|› �¦  «         Œ©d	 	                    |¦  «        S )
Nc                 ó^   — g | ]*}|                      ¦   «         ¯|                      ¦   «         ‘Œ+S r   r1   rF   s     r   r/   z7serialize_prompt_blocks_with_prefix.<locals>.<listcomp>¤   rX   r   r   )ÚstartzPrompt r   z[\r\n]+rb   r&   rY   )
Ú	enumerater5   r   rg   r   Úrer   r9   r^   r8   )r>   Úoriginal_promptsÚblocksÚidxrG   Úoriginal_prompts         r   Ú#serialize_prompt_blocks_with_prefixr}   ¢   s  € Ø€FØFÐF¨GÐFÑFÔF€GØÐØÐÝ  °Ð2Ñ2Ô2ð Kð K‰ˆˆVØ7:¸Q±wÅÐEUÑAVÔAVÒ7VÐ7VÐ*¨3°©7Ô3Ð3Ð\kÐfiÐ\kÐ\kˆÝ(Ô,¨Rµ°_Ð5JÈÑ1KÔ1KÑLÔLˆÝœ& ¨Sµ#°oÐ6KÈÑ2LÔ2LÑMÔM×SÒSÑUÔUˆØ�ŠÕ+ÐIÐI¨oÐIÐIÀÐIÐIÑJÔJÐJÐJØ�;Š;�vÑÔÐr   c                 ó
  — t          | pd¦  «        } t          |pd¦  «        }|r"t          | |d¬¦  «        t          ||¦  «        fS |                      t          ¦  «        r"t          | |d¬¦  «        t          | |¦  «        fS d S )Nr   T)r<   )r   rA   r+   r^   )r:   Úenhanced_prompt_textr;   s      r   Úparse_prompt_historyr€   ®   sÄ   € Ý�kÐ' RÑ(Ô(€KÝÐ3Ð9°rÑ:Ô:ÐØð YÝ! +Ð/EÐQUÐVÑVÔVÕXjÐkð  BXñ  YYô  YYð  Yð  	YØ×ÒÕ0Ñ1Ô1ð PÝ! +Ð/EÐQUÐVÑVÔVÕXjÐkvð  yOñ  YPô  YPð  Pð  	PØˆ4r   c                 ó>   — t                                | pd¦  «        d uS )Nr   )ÚSPEAKER_OPTIONS_LINE_REÚsearchr_   s    r   Úis_speaker_options_liner„   ·   s   € Ý"×)Ò)¨$¨*°"Ñ5Ô5¸TÐAÐAr   c                 ó`  — t          | pd¦  «                             dd¦  «                             dd¦  «        }|r|                     d¦  «        n&|                     ¦   «                              d¦  «        }i }g }g }d}d}	|	t	          |¦  «        k     �rÓ||	         }
|
                     ¦   «         }|	dz  }	|s|r|                     d¦  «         ŒO|                     d¦  «        r|sŒg|                     d¦  «        �rð|r0t          ||¦  «        \  }}|rd|fS |                     |¦  «         g }i }|dd	…                              ¦   «         }| 	                    d
¦  «        }| 	                    d¦  «        }||k    rd|› d|› d|
› d�}d|fS | 	                    d¦  «        dz  dk    r
d|
› d�}d|fS t          j        d|¦  «        }|D �] }|                     ¦   «         }|sŒt          j        d|¦  «        }|sd
|v sd|v rd|
› d�}d|fc S ŒF|                     d¦  «                             ¦   «         }|sd|
› d�}d|fc S ||                     d¦  «        dz   d	…                              ¦   «         }|                     d¦  «        sd|› d|
› d�}d|fc S t          j        d|¦  «        }|sd|› d|
› d�}d|fc S t          j        d|¦  «        rd|› d|
› d�}d|fc S |||<   �Œ"nf|                     d¦  «        s<t          |¦  «        s-t          j        d|¦  «        }|D ]}||vrd|› d|
› d�}d|fc S Œ|                     |¦  «         |	t	          |¦  «        k     �°Ó|r.t          ||¦  «        \  }}|rd|fS |                     |¦  «         d                     |¦  «        dfS ) a2  
    Process a text template with macro instructions and variable substitution.
    Supports multiple values for variables to generate multiple output versions.
    Each section between macro lines is treated as a separate template.
    
    Args:
        input_text (str): The input template text
        
    Returns:
        tuple: (output_text, error_message)
            - output_text: Processed output with variables substituted, or empty string if error
            - error_message: Error description and problematic line, or empty string if no error
    r   r%   r&   r'   r   r   r*   ú!NÚ{Ú}úUnmatched braces: ú opening '{' and z closing '}' braces
Line: 'ú'ú"r
   zUnclosed double quotes
Line: 'ú\s*:\s*ú\{([^}]+)\}z&Malformed variable declaration
Line: 'zEmpty variable name
Line: 'ú=úMissing '=' after variable '{z
}'
Line: 'ú	"([^"]*)"ú&No quoted values found for variable '{ú"[^,]*"[^,]*"ú,Missing comma between values for variable '{zUnknown variable '{z}' in template
Line: ')r   r3   r7   r   r5   r9   r+   Úprocess_current_templateÚextendÚcountrx   rƒ   rd   ÚfindÚfindallr„   r8   )Ú
input_textÚkeep_commentsÚkeep_empty_linesÚnormalized_inputÚlinesÚcurrent_variablesÚcurrent_template_linesÚall_output_linesÚerror_messageÚline_numberÚ	orig_liner.   Útemplate_outputÚerrÚ
macro_lineÚopen_bracesÚclose_bracesÚvar_sectionsÚsectionÚ	var_matchÚvar_nameÚ
value_partÚ
var_valuesÚvar_referencesÚvar_refs                            r   Úprocess_templater²   º   s,  € õ ˜:Ð+¨Ñ,Ô,×4Ò4°V¸TÑBÔB×JÒJÈ4ÐQUÑVÔVÐØ,<ÐfÐ×"Ò" 4Ñ(Ô(Ð(ÐBR×BXÒBXÑBZÔBZ×B`ÒB`ÐaeÑBfÔBf€EØÐØÐØÐØ€Mð €KØ
�˜E™
œ
Ò
"Ñ
"Ø˜+Ô&ˆ	Ø�ŠÑ Ô ˆØ�qÑˆð ð 	Øð 2Ø&×-Ò-¨bÑ1Ô1Ð1Øà�?Š?˜3ÑÔð 	¨ð 	Øð �?Š?˜3ÑÔñ S	0à%ð ,å'?Ð@VÐXiÑ'jÔ'jÑ$� Øð #Ø˜s˜7�NØ ×'Ò'¨Ñ8Ô8Ð8Ø)+Ð&ð !#Ðð ˜a˜b˜bœŸšÑ)Ô)ˆJð %×*Ò*¨3Ñ/Ô/ˆKØ%×+Ò+¨CÑ0Ô0ˆLØ˜lÒ*Ð*ð !L°[ð  !Lð  !LÐT`ð  !Lð  !Lð  @Ið  !Lð  !Lð  !L�Ø˜=Ð(Ð(ð ×Ò Ñ$Ô$ qÑ(¨AÒ-Ð-Ø NÀ)Ð NÐ NÐ N�Ø˜=Ð(Ð(õ œ8 J°
Ñ;Ô;ˆLà'ð '9ñ '9�Ø!Ÿ-š-™/œ/�Øð Øõ œI n°gÑ>Ô>�	Ø ð Ø˜g�~�~¨°¨¨Ø(^ÐR[Ð(^Ð(^Ð(^˜Ø! =Ð0Ð0Ð0Ð0Øà$Ÿ?š?¨1Ñ-Ô-×3Ò3Ñ5Ô5�Øð -Ø$OÀ9Ð$OÐ$OÐ$O�MØ˜}Ð,Ð,Ð,Ð,ð % W§\¢\°#Ñ%6Ô%6°qÑ%8Ð%9Ð%9Ô:×@Ò@ÑBÔB�
Ø!×,Ò,¨SÑ1Ô1ð -Ø$gÀXÐ$gÐ$gÐ[dÐ$gÐ$gÐ$g�MØ˜}Ð,Ð,Ð,Ð,õ  œZ¨°jÑAÔA�
ð "ð -Ø$pÈhÐ$pÐ$pÐdmÐ$pÐ$pÐ$p�MØ˜}Ð,Ð,Ð,Ð,õ ”9Ð-¨zÑ:Ô:ð -Ø$vÐT\Ð$vÐ$vÐjsÐ$vÐ$vÐ$v�MØ˜}Ð,Ð,Ð,Ð,ð /9Ð! (Ñ+Ñ+ðO'9ðV —?’? 3Ñ'Ô'ð 1Õ0GÈÑ0MÔ0Mð 1å!#¤¨N¸DÑ!AÔ!A�Ø-ð 1ð 1�GØÐ&7Ð7Ð7Ø(l¸wÐ(lÐ(lÐ`iÐ(lÐ(lÐ(l˜Ø! =Ð0Ð0Ð0Ð0ð 8ð
 #×)Ò)¨$Ñ/Ô/Ð/ðE �˜E™
œ
Ò
"Ñ
"ðJ ð 1Ý7Ð8NÐPaÑbÔbÑˆ˜Øð 	Ø�s�7ˆNØ×Ò Ñ0Ô0Ð0à�9Š9Ð%Ñ&Ô&¨Ð*Ð*r   c                 ól  — |r| s| dfS g }t          d„ |                     ¦   «         D ¦   «         ¦  «        }t          |¦  «        D ]l}| D ]g}|}|                     ¦   «         D ]9\  }}|t	          |¦  «        z  }	||	         }
|                     d|› d�|
¦  «        }Œ:|                     |¦  «         ŒhŒm|dfS )a"  
    Process a set of template lines with the current variables.
    
    Args:
        template_lines (list): List of template lines to process
        variables (dict): Dictionary of variable names to lists of values
        
    Returns:
        tuple: (output_lines, error_message)
    r   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r]   )r5   )r-   Úvaluess     r   rK   z+process_current_template.<locals>.<genexpr>O  s(   è è € ÐBÐB V•S˜‘[”[ÐBÐBÐBÐBÐBÐBr   r‡   rˆ   )Úmaxrµ   ÚrangeÚitemsr5   r3   r9   )Útemplate_linesÚ	variablesÚoutput_linesÚ
max_valuesÚiÚtemplateÚoutput_liner­   r¯   Úvalue_indexÚ	var_values              r   r•   r•   >  s   € ð ð "˜Nð "Ø˜rÐ!Ð!à€Lõ ÐBÐB¨y×/?Ò/?Ñ/AÔ/AÐBÑBÔBÑBÔB€Jõ �:ÑÔð -ð -ˆØ&ð 	-ð 	-ˆHØ"ˆKØ(1¯ªÑ(9Ô(9ð Pð PÑ$�˜*à¥# j¡/¤/Ñ1�Ø& {Ô3�	Ø)×1Ò1Ð2C°xÐ2CÐ2CÐ2CÀYÑOÔO��Ø×Ò Ñ,Ô,Ð,Ð,ð	-ð ˜ÐÐr   c                 óÖ  — |                       d¦  «        r| dd…                              ¦   «         } g }|                      d¦  «        }|                      d¦  «        }||k    rg d|› d|› d�fS t          j        d	| ¦  «        }|D ]`}|                     ¦   «         }|sŒt          j        d
|¦  «        }|D ]/}|                     ¦   «         }||vr|                     |¦  «         Œ0Œa|dfS )al  
    Extract all variable names from a macro line.
    
    Args:
        macro_line (str): A macro line (with or without the leading '!')
        
    Returns:
        tuple: (variable_names, error_message)
            - variable_names: List of variable names found in the macro
            - error_message: Error description if any, empty string if no error
    r†   r   Nr‡   rˆ   r‰   rŠ   ú closing '}' bracesr�   rŽ   r   )r+   r   r—   rx   r7   r™   r9   )	r§   Úvariable_namesr¨   r©   rª   r«   Úvar_matchesr­   Únew_vars	            r   Úextract_variable_namesrÇ   _  s'  € ð ×Ò˜SÑ!Ô!ð ,Ø   ”^×)Ò)Ñ+Ô+ˆ
à€Nð ×"Ò" 3Ñ'Ô'€KØ×#Ò# CÑ(Ô(€LØ�lÒ"Ð"ØÐi¨ÐiÐiÀ|ÐiÐiÐiÐiÐiõ ”8˜J¨
Ñ3Ô3€Làð 
/ð 
/ˆØ—-’-‘/”/ˆØð 	Øõ ”j °Ñ9Ô9ˆØ#ð 	/ð 	/ˆHØ—n’nÑ&Ô&ˆGØ˜nÐ,Ð,Ø×%Ò% gÑ.Ô.Ð.øð	/ð
 ˜2ÐÐr   c                 ób  — |                       d¦  «        r| dd…                              ¦   «         } i }|                      d¦  «        }|                      d¦  «        }||k    ri d|› d|› d�fS |                      d	¦  «        d
z  dk    ri dfS t          j        d| ¦  «        }|D �]}|                     ¦   «         }|sŒt          j        d|¦  «        }|sd|v sd|v ri dfc S Œ@|                     d¦  «                             ¦   «         }|si dfc S ||                     d¦  «        dz   d…                              ¦   «         }|                      d¦  «        s
i d|› d�fc S t          j        d|¦  «        }	|	s
i d|› d�fc S t          j        d|¦  «        r
i d|› d�fc S |	||<   �Œ|dfS )a…  
    Extract all variable names and their values from a macro line.
    
    Args:
        macro_line (str): A macro line (with or without the leading '!')
        
    Returns:
        tuple: (variables_dict, error_message)
            - variables_dict: Dictionary mapping variable names to their values
            - error_message: Error description if any, empty string if no error
    r†   r   Nr‡   rˆ   r‰   rŠ   rÃ   rŒ   r
   r   zUnclosed double quotesr�   rŽ   zMalformed variable declarationzEmpty variable namer�   r�   z}'r‘   r’   r“   r”   r   )	r+   r   r—   rx   r7   rƒ   rd   r˜   r™   )
r§   rº   r¨   r©   rª   r«   r¬   r­   r®   r¯   s
             r   Úextract_variable_valuesrÉ   ˆ  sR  € ð ×Ò˜SÑ!Ô!ð ,Ø   ”^×)Ò)Ñ+Ô+ˆ
à€Ið ×"Ò" 3Ñ'Ô'€KØ×#Ò# CÑ(Ô(€LØ�lÒ"Ð"ØÐi¨ÐiÐiÀ|ÐiÐiÐiÐiÐið ×Ò˜ÑÔ˜qÑ  AÒ%Ð%ØÐ+Ð+Ð+õ ”8˜J¨
Ñ3Ô3€Làð  )ñ  )ˆØ—-’-‘/”/ˆØð 	Øõ ”I˜n¨gÑ6Ô6ˆ	Øð 	Ø�gˆ~ˆ~ ¨  ØÐ;Ð;Ð;Ð;Ð;Øà—?’? 1Ñ%Ô%×+Ò+Ñ-Ô-ˆØð 	-ØÐ,Ð,Ð,Ð,Ð,ð ˜WŸ\š\¨#Ñ.Ô.¨qÑ0Ð1Ð1Ô2×8Ò8Ñ:Ô:ˆ
Ø×$Ò$ SÑ)Ô)ð 	FØÐE¸ÐEÐEÐEÐEÐEÐEÐEõ ”Z ¨jÑ9Ô9ˆ
ð ð 	OØÐNÀÐNÐNÐNÐNÐNÐNÐNõ Œ9Ð% zÑ2Ô2ð 	UØÐTÀxÐTÐTÐTÐTÐTÐTÐTà(ˆ	�(ÑÑà�bˆ=Ðr   c                 óæ   — g }|                       ¦   «         D ]C\  }}d„ |D ¦   «         }d                     |¦  «        }d|› d|› �}|                     |¦  «         ŒDdd                     |¦  «        z   S )a  
    Generate a macro line from a dictionary of variable names and their values.
    
    Args:
        variables_dict (dict): Dictionary mapping variable names to lists of values
        
    Returns:
        str: A formatted macro line (including the leading '!')
    c                 ó   — g | ]}d |› d �‘Œ	S )rŒ   r   )r-   r   s     r   r/   z'generate_macro_line.<locals>.<listcomp>Ù  s    € Ð:Ð:Ð:¨%˜˜U˜˜˜Ð:Ð:Ð:r   ú,r‡   z}=z! z : )r¸   r8   r9   )Úvariables_dictÚsectionsr­   rµ   Úquoted_valuesÚ
values_strr«   s          r   Úgenerate_macro_linerÑ   Ë  s�   € ð €Hà*×0Ò0Ñ2Ô2ð !ð !Ñˆ�&à:Ð:°6Ð:Ñ:Ô:ˆà—X’X˜mÑ,Ô,ˆ
à0�xÐ0Ð0 JÐ0Ð0ˆØ�Š˜Ñ Ô Ð Ð ð �%—*’*˜XÑ&Ô&Ñ&Ð&r   )r   )r   T)FFr]   )F)rx   Úframe_schedulerr   r^   r4   ÚcompileÚ
IGNORECASEr‚   ÚDEFAULT_MULTI_PROMPTS_MODEr   r#   rA   rU   rZ   r6   r}   r€   r„   r²   r•   rÇ   rÉ   rÑ   r   r   r   ú<module>rÖ      sf  ðà 	€	€	€	Ø +Ð +Ð +Ð +Ð +Ð +à!Ð Ø'Ð Ø$˜"œ*Ð%LÈbÌmÑ\Ô\Ð Ø!Ð ð
Gð 
Gð 
Gð 
Gðð ð ð ðZð Zð Zð Zð6ð ð ð ð$ð ð ðFð Fð Fð FðP
ð 
ð 
ð 
ðð ð ðBð Bð BðB+ð B+ð B+ð B+ðHð ð ðB'ð 'ð 'ðRAð Að AðF'ð 'ð 'ð 'ð 'r   