
    q9i                       % S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKJrJr  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKJrJr   S SKJr  S SKJr  S SKJr  S SKJ r J!r!  S SK"J#r#J$r$J%r%J&r&J'r'J(r(  S SK)r)S SK*r+S S	K,J-r-  \R\                  R_                  S
S5         \0" \Rb                  S5      (       a  \Rb                  Re                  SS9  \0" \Rf                  S5      (       a  \Rf                  Re                  SS9  \" \55      Rm                  5       Rn                  r8Sq9Sq:Sq;0 r<\$\=\+R|                  R~                  4   \@S'   SrASrBSrCSrDSrESrFSrGSrH/ SQrISrJSrKSrLSrM\R                  " SS5        \b
   \" S5      rOO\rOSS\&\   S \=4S! jjrPS \4S" jrQ\Q" 5       rRS# rSS$ rTS% rUS&\=S \4S' jrVS(\=S \+R|                  R~                  4S) jrWS(\=S*\=S+\XS,\$\=\=4   S-\=S \=4S. jrYS/rZS0r[S1r\S2r]S3r^\" \55      R                  S45      R                  S55      ra\aR                  5       (       a?  \R\                  R                  S6S75      \R                  -   \=" \a5      -   \R\                  S6'   SS8 jre\e" 5         \" \55      R                  S95      rf\" \55      R                  S:5      rgS;rhS<riSrjS=rkS>rlS?rmS@rnSAroSrp\R                  " SBSC5      SC:H  rr\s" S\t" \R                  " SDSE5      5      5      ru\s" SF\v" \R                  " SGSH5      5      5      rw\" \55      R                  SI5      rxSJry\" \55      R                  SK5      rz\zSL-  r{SM\=SN\#S \=4SO jr|\ " SP SQ5      5       r}\ " SR SS5      5       r~\ " ST SU5      5       r\ " SV SW5      5       r\ " SX SY5      5       r\ " SZ S[5      5       rSS\\=S]\tS \=4S^ jjrS_\tS`\Sa\=S \=4Sb jr SSc\Sd\Se\vS \4Sf jjrSg\#Sh\#S \#4Si jrSg\&\=   S \=4Sj jrSk\ GR                  S \%\   4Sl jrSm\'\}   Sn\vSo\vSp\tSq\'\   S \%\   4Sr jrSs\'\=   S \ GR                  4St jrSk\ GR                  S \&\   4Su jr  SSm\'\}   Sv\tSw\tS \%\$\=\#4      4Sx jjrSy\'\$\=\#4      Sn\vSo\vSz\tS \=4
S{ jrSSS|.S}\S~\=S\&\=   S\&\$\=\#4      S \=4
S jjrSS.S}\S~\=S\=S \=4S jjrS\=S \&\#   4S jrSS.S}\S~\=S\&\=   S \&\#   4S jjrS\S \%\}   4S jrS\\=S \=4S jrSm\'\}   S S4S jrSSS.Sm\'\}   Sv\tSw\tS \%\%\$\=\#4         4S jjrSy\'\$\=\#4      S \=4S jrSm\'\}   S\'\$\=\#4      S \t4S jrSm\'\}   S}\&\   S \t4S jrS\vS\vS\vS\vS \v4
S jrSm\'\}   S\vS\vS \(\v\%\}   4   4S jrSm\'\}   Sn\vSo\vSz\tS}\S \%\   4S jrSS`\S\tS \=4S jjrGS S`\S\tS \=4S jjrS`\S\S \&\=   4S jrS`\S\S \&\$\=\=4      4S jrGSS\=S\=S\tS \%\=   4S jjrS\=S\=S`\S\'\=   S\tS\'\=   S \=4S jrS`\S}\S \&\=   4S jrGSS\=S\vS \&\=   4S jjrS\\=S \=4S jrS\=S`\S \4S jrS\=S \=4S jrS\=S\=S \=4S jrS\=S \=4S jrGSS\\=S\tS\tS \=4S jjrS\=S \=4S jr1 SkrGSS\=S\tS \%\=   4S jjrS`\S \=4S jrS\'\   S\&\   S S4S jrSm\'\}   Sn\vSo\vSz\tS \%\   4
S jrS\vS \=4S jrS\vS \=4S jrS\\=S \=4S jrS\\=S\tS \=4S jr\G4S`\S\tS \%\$\=\#4      4S jjrS\\=S \%\=   4S jr GSSSSS.S`\S\S\tS\S\&\   S\=S \4S jjjrS`\S\S S4S jrS \4S jrSg\vS\vS\vS \v4S jr " S S5      rS\S\'\   S S4S jrS\'\=   S S4S jrS\S \=4S jr  GSS\S\&\~   S\=S\&\=   S\&\   S \=4S jjr GSS`\S\S\=S\tS \(\\\\&\   4   4
S jjr SS\S`\S\S\=S\=S\S\=S\&\   S \4S jjrSk\ GR                  S \4S jrS\$\=\=4   S\%\(\=\=\=\X4      S \(\=\X4   4S jr  GSS\=S\&\   S\$\=\#4   S\tS\&\$\=\#4      S S4S jjrSk\ GR                  S S4S jrSs\'\=   S \&\   4S jr\S:X  a  \" \GR                  SS 5        gg! \ a    Sr GNf = f! \4 a     GNVf = f! \4 a    \rO GNf = f(	      N)ThreadPoolExecutorTimeoutError)datetimeUTC)ZoneInfo)	dataclass)Path)BaseHTTPRequestHandlerThreadingHTTPServer)AnyDictListOptionalSequenceTuple)urlsplitPYTHONIOENCODINGutf-8reconfigureencoding_HTTP_CONNECTIONSz	video.mp4cortessmallg      6@g      C@      x   )u   🔥u   ⚡u   🚀u   🎯u   😲'AIzaSyCxZfjzfQtWtUMuffzP0xK2it6z7zujQp4z1https://n8n.gudanbolizante.site/webhook/tvthathi1z.https://n8n.gudanbolizante.site/webhook/cortes)z*.mp4z*.movz*.m4vz*.mkvz*.aviz*.mxfz	video/mxfz.mxfzAmerica/Sao_Paulodtreturnc                     U =(       d    [         R                  " [        5      n UR                  [        5      R                  5       $ ! [         a    UR                  5       s $ f = f)zQ
Retorna timestamp ISO em horario de Sao Paulo sem depender do fuso do servidor.
)r   nowr   
astimezoneSAO_PAULO_TZ	isoformat	Exception)r   bases     main.pyisoformat_sao_paulor)   M   sP     "c"D |,6688  ~~ s   "A A%$A%c                  t   [         R                  " S5      =(       d    [         R                  " S5      n U (       a  [        U 5      R                  5       $ [        S-  [        S5      /nU H5  n[        U5      R                  5       nUR                  5       (       d  M3  Us  $    [        S-  R                  5       $ )N	INBOX_DIR	INPUT_DIRinz/home/user157/in)osgetenvr	   
expanduserROOT_DIRexists)	env_value
candidates	candidateexpandeds       r(   _resolve_inbox_dirr7   X   s    		+&@"))K*@II))++T/4(:#;<J		?--/??O   tO''))    c                      [         b  [         $  [        R                  " S5      q [         $ ! [         a  n [	        S5      U eS n A ff = f)NwhisperzMBiblioteca 'whisper' nao encontrada. Instale 'openai-whisper' para continuar.)r:   	importlibimport_moduleImportErrorRuntimeError)excs    r(   ensure_whisper_moduler@   g   sN    )))4
 N	  [
	s   + 
AAAc                      [         b  [         $  [        R                  " S5      q [         $ ! [         a
    S q  [         $ f = f)Ncv2)rB   r;   r<   r=    r8   r(   ensure_cv2_modulerD   t   sC    

%%e, J  J   + ??c                      [         b  [         $  [        R                  " S5      q [         $ ! [         a
    S q  [         $ f = f)N	mediapipe)mpr;   r<   r=   rC   r8   r(   ensure_mediapipe_modulerI      sC    	~	$$[1 I  IrE   rawc                    U (       d  [        S5      e[        U 5      R                  5       nU/nUR                  5       (       dI  UR	                  [
        U -  R                  5       5        [        (       a  UR	                  [        U -  5        U H  nUR                  5       (       d  M  Us  $    SR                  S U 5       5      n[        SU 35      e)Nz$Nenhum arquivo de entrada informado., c              3   8   #    U  H  n[        U5      v   M     g 7fN)str).0paths     r(   	<genexpr>%resolve_input_file.<locals>.<genexpr>   s     =#d))s   z,Video nao encontrado. Caminhos verificados: )	FileNotFoundErrorr	   r0   is_absoluteappendr1   r+   r2   join)rJ   r5   search_pathsrQ   	attempteds        r(   resolve_input_filerZ      s     FGGS	$$&I ){L  ""X^779:9	C0;;==K  		===I
J9+V
WWr8   hostc                     [         R                  U 5      nUb  U$ [        R                  R	                  U SS9nU[         U '   U$ )N<   timeout)r   gethttpclientHTTPSConnection)r[   conns     r(   _get_https_connectionre      sF      &D;;&&tR&8D"dKr8   rQ   dataheaderslabelc                    [        U 5      n UR                  SXUS9  UR                  5       nUR                  5       R	                  SSS9nUR                  S:  a  [        U S	UR                   SU 35      eU$ ! [
         aZ  n UR                  5         [        R                  U S 5        O! [        R                  U S 5        f = f[        SU SU 35      UeS nAff = f)
NPOST)bodyrg   r   replaceerrorszFalha ao conectar no :   z retornou erro HTTP )re   requestgetresponsereaddecoder&   closer   popr>   status)	r[   rQ   rf   rg   rh   rd   responserk   r?   s	            r(   _perform_https_postry      s     !&D	LVTg>##%}}%%gi%@ #eW$88ID6RSSK  L	.JJL!!$-!!$-25'C5ABKLs)   ?A; ;
CB-C-CCCaa  Voce e um editor experiente em cortes virais para TikTok e Instagram.
Analise os segmentos abaixo e selecione ate {top_k} trechos com maior potencial de viralizar.
Cada trecho precisa ter entre {min_dur:.1f}s e {max_dur:.1f}s. Priorize momentos emotivos, opinioes fortes, historias curiosas, humor ou revelacoes. Evite longos periodos de silencio.
Responda exclusivamente em JSON com a estrutura:
{{"highlights":[{{"start":12.3,"end":34.5,"reason":"motivo do corte"}},...]}}
Use segundos absolutos do video. Se nao houver um bom trecho, retorne uma lista vazia.
SEGMENTOS (indice|inicio|fim|fala):
{segments}
a  Voce e um revisor profissional de portugues falado no Brasil. Algumas falas transcritas pelo modelo de ASR ficaram com erros ortograficos ou de reconhecimento de fala.
Ajuste apenas as palavras incorretas mantendo girias, tom e sentido original. Nao invente conteudo novo e nao traduza.
Retorne apenas JSON com a estrutura {{"segments":[{{"index":0,"text":"fala corrigida"}},...]}}.
Seguem as falas no formato indice|inicio|fim|texto:
{segments}
aF  Voce e um jornalista brasileiro preparando uma descricao de cunho jornalistico para redes sociais. A partir da transcricao do corte, escreva um texto com estrutura de lead: apresente o fato principal na primeira frase, traga detalhes essenciais nas frases seguintes e feche com contexto adicional ou proximos passos.
Use entre 4 e 5 frases, mantenha tom informativo, objetivo e respeitoso, evitando opinioes pessoais.
Inclua ate 4 hashtags em portugues do Brasil que reflitam o conteudo noticioso.
Transcricao:
{transcript}
---
Retorne apenas a descricao final, sem texto adicional.a~  Voce e uma especialista em titulos. Use o texto abaixo (captions.txt) e escreva UM titulo curto e natural que resuma o fato principal.
Regras simples:
- Ate 45 caracteres.
- Sem emojis, hashtags, aspas ou ponto final.
- Frase coerente e direta em portugues, sem inventar nada alem do texto base.
TEXTO BASE (caption):
{transcript}
Retorne apenas JSON valido: {"title":"TEXTO AQUI"}
aK  Voce e um redator senior de portal de noticias brasileiro.
Com base na transcricao do corte, elabore uma materia completa, objetiva e aprofundada.
Produza um titulo informativo e impactante e um texto com pelo menos 8 paragrafos curtos.
Comece com um lead que resuma o fato principal, desenvolva com detalhes, contexto, repercussao e proximos passos.
Mantenha rigor jornalistico, citando dados concretos quando possivel e evitando opinioes pessoais.
Retorne apenas JSON valido no formato {{"title":"TITULO","article":"TEXTO EM MULTIPLOS PARAGRAFOS"}}.
Transcricao integral:
{transcript}
z1ffmpeg-2025-10-05-git-6231fa7fb7-essentials_buildbinPATH c                     [         R                  S:X  a  g / n [        R                  5       (       aq  S Hk  n[        U-  nUR                  5       (       a  U R	                  U5        UR                  S5      nUR                  5       (       d  MZ  U R	                  U5        Mm     S H6  n[        U5      nUR                  5       (       d  M%  U R	                  U5        M8     U  Hg  n UR                  5       R                  n[         R                  " XE[        R                  -  [        R                  -  [        R                  -  5        Mi     g ! [         a     My  f = f)Nnt)ffmpegffprobez.exe)r.   name
FFMPEG_DIRr2   rV   with_suffixr	   statst_modechmodS_IXUSRS_IXGRPS_IXOTHOSError)r4   r   r'   exerQ   current_modes         r(   ensure_ffmpeg_permissionsr      s   	ww$J)D$D{{}}!!$'""6*Czz||!!#& * &Dz;;==d# & 	99;..LHHT$,,6ETU   		s   $A#E
EEzlogo.pngz	logo2.png      r]   #   U   i     CUTS_FAST_MODE1AI_RETRY_ATTEMPTS3      ?AI_RETRY_DELAYz2.5z	fundo.jpgz	1080:1920fontszAnton-Regular.ttftemplatekwargsc                   ^^  U R                   " S	0 TD6$ ! [         a    [        R                  " S5      n0 mS[        R                  [
           S[
        4UU4S jjnUR                  X05      nUR                  SS5      R                  SS5      nTR                  5        H#  u  nu  pgUR                  USU-   U-   S-   5      nM%     UR                   " S	0 TD6s $ f = f)
Nz\{(\w+)(:[^}]*)?\}matchr    c                    > U R                  S5      nU R                  S5      =(       d    SnUT;   a  SUR                  5        S3nX4TU'   U$ U R                  S5      $ )Nr      r|   __FMT_PLACEHOLDER___r   )groupupper)r   keyspectokenr   placeholderss       r(   repl"safe_format_template.<locals>.repl,  s\    ++a.C;;q>'RDf},SYY[M<'*kU#;;q>!r8   {z{{}z}}rC   )	formatKeyErrorrecompileMatchrO   subrl   items)	r   r   patternr   tempr   r   r   r   s	    `      @r(   safe_format_templater   %  s    %((( %**2335	" 	"# 	" 	" {{4*||C&..sD9"."4"4"6E;C<<sSy4'7#'=>D #7{{$V$$#%s    CCCc                   x    \ rS rSr% \\S'   \\S'   \\S'   \\S'   \\S'   \S\4S j5       r\S\	4S	 j5       r
S
rg)Segmenti<  startendtextavg_logprobno_speech_probr    c                 H    [        SU R                  U R                  -
  5      $ )NMbP?)maxr   r   selfs    r(   durationSegment.durationD  s    4DJJ.//r8   c                 \    [        S[        U R                  R                  5       5      5      $ Nr   )r   lenr   splitr   s    r(   
word_countSegment.word_countH  s    1c$))//+,--r8   rC   N)__name__
__module____qualname____firstlineno__float__annotations__rO   propertyr   intr   __static_attributes__rC   r8   r(   r   r   <  sQ    L	J
I0% 0 0 .C . .r8   r   c                   h    \ rS rSr% \\S'   \\S'   \\S'   \\S'   Sr\\S'   Sr\\S	'   Sr	\\S
'   Sr
g)
CropWindowiM  xywidthheight        
confidencer   
detectionssamplesrC   N)r   r   r   r   r   r   r   r   r   r   r   rC   r8   r(   r   r   M  s4    
F
FJKJJGSr8   r   c                       \ rS rSr% \\S'   \\S'   \\S'   \\   \S'   Sr\	\S'   Sr
\	\S'   S	r\	\S
'   Sr\\   \S'   \S\4S j5       rSS\S\	4S jjrSrg)HighlightCandidateiX  r   r   scoresegmentsr|   reasontitleunknownoriginNcropr    c                 4    U R                   U R                  -
  $ rN   )r   r   r   s    r(   r   HighlightCandidate.durationc  s    xx$**$$r8   limitc                 ~    SR                  S U R                   5       5      n[        U5      U:  a  US US-
   S-   $ U$ )N c              3   ^   #    U  H#  oR                   (       d  M  UR                   v   M%     g 7frN   r   rP   segs     r(   rR   -HighlightCandidate.preview.<locals>.<genexpr>h  s     FMSXXM   --   ...)rW   r   r   )r   r   r   s      r(   previewHighlightCandidate.previewg  s@    xxFDMMFF.1$i%.?[uqy!E)ITIr8   rC   )   )r   r   r   r   r   r   r   r   r   rO   r   r   r   r   r   r   r   r   r   r   rC   r8   r(   r   r   X  s|    L	JL7mFCE3OFC!%D(:
%%% % %JS J3 J Jr8   r   c                       \ rS rSr% \\S'   \\S'   \\S'   \\S'   \\S'   \\S'   \\S'   \\S	'   \\S
'   \\S'   \\	   \S'   \\	   \S'   \	\S'   \	\S'   \	\S'   \\	   \S'   \\	   \S'   Sr
\\S'   Srg)GeneratedCutil  index	base_namer   r   r   r   r   r   r   r   
zoom_video	fit_videoass_fillass_fitsrtcaptionportal_articler|   portal_titlerC   N)r   r   r   r   r   r   rO   r   r   r	   r  r   rC   r8   r(   r   r   l  su    JNL	JOLKJKL~NM	Id^TN"L#r8   r   c                   X    \ rS rSr% \\S'   \\S'   \\S'   \\S'   \\S'   \\	   \S'   Sr
g	)
PipelineSummaryi  
input_path
output_dirrun_tag
started_atfinished_at
highlightsrC   N)r   r   r   r   r	   r   rO   r   r   r   r   rC   r8   r(   r  r    s*    L\""r8   r  c                   >    \ rS rSr% \\S'   \\S'   \\S'   \\S'   Srg)AIConfigi  providermodelapi_keytemperaturerC   N)r   r   r   r   rO   r   r   r   rC   r8   r(   r  r    s    MJLr8   r  r   
max_lengthc                 Z   [         R                  " SU 5      nUR                  SS5      R                  S5      n[        R
                  " SSU5      R                  S5      R                  5       n[        R
                  " SSU5      nU(       d  gUSU R                  S5      nU=(       d    U$ )	zFTransforma texto livre em um fragmento amigavel para nomes de arquivo.NFKDasciiignorez[^a-zA-Z0-9]+-z-{2,}r|   N)	unicodedata	normalizeencodert   r   r   striplowerrstrip)r   r  
normalized
ascii_textcleanedtrimmeds         r(   slugify_for_filenamer     s    &&vt4J""7H5<<WEJff%sJ7==cBHHJGffXsG,Gkz"))#.Ggr8   r   	highlightr  c                    UR                   =(       d    UR                  5       n[        U5      nU(       dL  [        [	        UR
                  S-  5      5      n[        [	        UR                  S-  5      5      nUS SUS S3nSU SU S SU 3$ )zHGera um nome base estavel e organizado para todos os artefatos do corte.  06dzms-mscorte__02d)r   r   r   r   roundr   r   )r   r!  r  slug_sourceslugstart_msend_mss          r(   build_output_stemr.    s    //8Y%6%6%8K,DuY__t345U9==4/013s6#,b1G9AeC[$00r8   ab	tolerancec                     [        U R                  UR                  -
  5      U:  =(       a%    [        U R                  UR                  -
  5      U:  $ rN   )absr   r   )r/  r0  r1  s      r(   highlights_are_similarr4    s<     qww !I-P#aeeaeem2Dy2PPr8   value	referencec                 \   [        U[        5      (       aA  [        U [        5      (       a!  U R                  5       R	                  5       S;   $ [        U 5      $ [        U[
        5      (       a   [        U[        5      (       d  [        U 5      $ [        U[        5      (       a  [        U 5      $ U $ )N>   r   onsimyestrue)
isinstanceboolrO   r  r  r   r   )r5  r6  s     r(   coerce_typer>    s    )T""eS!!;;=&&(,MMME{)S!!*Y*E*E5z)U##U|Lr8   c                     U c/  [         R                  " S5      nUb  UR                  5       $ [        $ U R                  5       $ )NCORTES_NOTIFY_WEBHOOK)r.   r/   r  DEFAULT_NOTIFY_WEBHOOK)r5  envs     r(   resolve_notify_webhookrC    s9    }ii/0?99;%%;;=r8   argsc                   ^^ U R                   (       a  U R                   [        :X  a  [        R                  " 5       O,[        U R                   5      R	                  5       R
                  n[        U R                  5      R	                  5       n/ n[         Vs/ s H<  nUR                  S5      (       a  USS  R                  5       OUR                  5       PM>     nn[        5       n/ nUR                  5       (       a  UR                  U5        [        m TR                  5       (       a+  [        U4S jU 5       5      (       d  UR                  T5        U H  n [!        UR#                  5       5      n	U	 H  n
U
R%                  5       (       d  M  U
R&                  R                  5       m[        U4S jU 5       5      (       d  MP  TR                  S5      (       a  Mh  U
R	                  5       nX;   a  M  X+R(                  ;   d  X:X  a  M  UR                  U5        UR+                  U5        M     M     UR-                  5         U$ s  snf ! [         a     GNf = f! [         a     GM  f = f)Nz*.r   c              3   F   >#    U  H  nTR                  U5      v   M     g 7frN   )samefile)rP   r
inbox_roots     r(   rR   (discover_batch_inputs.<locals>.<genexpr>  s     *Q5a:+>+>q+A+A5   !c              3   F   >#    U  H  nTR                  U5      v   M     g 7frN   )endswith)rP   suffix
name_lowers     r(   rR   rJ    s     Jvz**622rK  r&  )inputDEFAULT_INPUTr	   cwdresolveparentr  SUPPORTED_BATCH_PATTERNS
startswithr  setr2   rV   r+   anyr   listiterdiris_filer   parentsaddsort)rD  search_rootr  r4   r   suffixesseenrootsrootentriesrQ   resolvedrI  rO  s               @@r(   discover_batch_inputsrf    s   $(JJ$**2M$((*SWX\XbXbScSkSkSmStStKdoo&..0JJ 0/G  '11$77W]]_L/   eDE[!Js*Q5*Q'Q'QLL$ 	4<<>*G D<<>>*JJJJJ$$X..||~H---1Gh'HHX  ( OOG  
  		s,   AIA I I
II
I,+I,r   min_durmax_durrequiredexistingc                    US::  d  U (       d  / $ U S   R                   nU S   R                  n[        SXe-
  5      n[        U[        X[        [	        U5      U-   S5      -  5      5      n[        US-  US-  S5      n	/ n
UnX-   US-   ::  a"  U
R                  U5        X-  nX-   US-   ::  a  M"  U
(       d  U/n
/ nU
 Hg  n[        XmU-   5      nX-
  U:  a  M  [        XU5      u  nnU[        S5      :X  d  U(       d  MB  UR                  [        UUU[        U5      SS	95        Mi     UR                  S
 SS9  [        US-  U5      nUS U $ )Nr   r   r   r          @-inffallbackr   r   r   r   r   c                     U R                   $ rN   r   cs    r(   <lambda>.generate_fallback_highlights.<locals>.<lambda>      !''r8   Tr   reverser   )r   r   r   minr   rV   score_windowr   r   rY  r^  )r   rg  rh  ri  rj  total_start	total_endtotal_durationtarget_durationstepstartscurrentr4   r   r   r   selectedr   s                     r(   generate_fallback_highlightsr    sn    1}H	1+##K  Iy67N'3wS]U]E]_`Aa0a#bcO$gmS9DFG

y4/
/g 
y4/
/ +-J)_45; &x<xE&M!h!	
 " OO)4O81h'Efur8   argvc                 V   [         R                  " S5      =(       d    [         R                  " S5      =(       d    Sn[         R                  " S5      =(       d    [         R                  " S5      n U(       a  [        U5      OSn[        R
                  " SS9nUR                  S	[        S
S9  UR                  S[        SS9  UR                  S[        SS9  UR                  S[        [        SS9  UR                  S[        [        SS9  UR                  S[        [        SS9  UR                  S/ SQSSS9  UR                  SSSS9  UR                  SS S!S"9  UR                  S#S$/ S%QS&S'9  UR                  S(S S)S9  UR                  S*[        S+S,S9  UR                  S-S S.S9  UR                  S/S S0S9  UR                  S1[        S2S3S9  UR                  S4S S5S"9  UR                  S6US7S9  UR                  S8[        US9S9  UR                  U 5      $ ! [         a    Sn GNf = f):NCORTES_HOSTHOSTz0.0.0.0CORTES_PORTPORTi="  zDGera automaticamente o melhor corte vertical com legendas dinamicas.)descriptionz--inputzArquivo de video de entrada.)defaulthelpz--output-dirz"Pasta onde os cortes serao salvos.z--modelzModelo Whisper a ser utilizado.z--min-durationz$Duracao minima do corte em segundos.)typer  r  z--max-durationz$Duracao maxima do corte em segundos.z--topz)Quantidade de melhores cortes a exportar.z	--variant)zoomfitbothr  z9Formato do corte vertical a exportar (zoom, fit ou both).)choicesr  r  z--langptzIdioma dominante do video.z--batch-all
store_truez@Processa todos os arquivos de video encontrados automaticamente.)actionr  z--ai-providergemini)autononeopenair  z>Provedor de IA para escolher o melhor trecho (padrao: gemini).)r  r  r  z
--ai-modelzFModelo do provedor de IA (opcional, usa um padrao para cada provedor).z--ai-temperature皙?z\Temperatura da IA ao selecionar o corte (valores baixos focam em respostas deterministicas).--gemini-keyzYChave de API do Gemini (sobrescreve variaveis de ambiente GEMINI_API_KEY/GOOGLE_API_KEY).z--notify-webhookz|URL para receber os resultados do processamento via POST. Use string vazia para desabilitar (padrao envia para webhook N8N).z--notify-timeout-   zGTimeout (em segundos) para a requisicao HTTP de notificacao do webhook.z--serve-webhookzIInicia um servidor HTTP que permite disparar cortes via requisicoes POST.z--serve-hostzeHost/interface para o servidor de webhook (padrao: 0.0.0.0 ou variavel de ambiente CORTES_HOST/HOST).z--serve-portzIPorta do servidor de webhook (padrao: 8765 ou variavel CORTES_PORT/PORT).)r.   r/   r   
ValueErrorargparseArgumentParseradd_argumentrQ  DEFAULT_OUTPUT_DIRDEFAULT_MODELr   DEFAULT_MIN_DURDEFAULT_MAX_DURDEFAULT_TOP_K
parse_args)r  env_hostenv_port_rawenv_portparsers        r(   r  r    s   yy'I299V+<I	H99]+@ryy/@L(43|$$ $$ZF 	=?]^
0BImn
	=?`a
3	   3	   c=Grs
'H	   $5QR
l  BD  E
4M	   U  
 k	   h  
 Q	   V	   X  
 t  
 X	   T""c  s   1H H('H(c                    U R                   =(       d@    [        R                  " S5      =(       d#    [        R                  " S5      =(       d    [        nU R                  R                  5       nUS:X  a*  U(       a  SnO [        R                  " S5      (       a  SnOSnUS:X  a  [        S5      eUS:X  aR  [        R                  " S5      nU(       d  [        S	5      eU R                  =(       d    S
n[        SXCU R                  S9$ US:X  a  UnU(       d  [        S5      eU R                   (       a  SnO;[        R                  " S5      (       d  [        R                  " S5      (       a  SnOSn[        SU S35        U[        R                  S'   U R                  =(       d    Sn[        SXCU R                  S9$ [        R                  R                  SU S35        g )NGEMINI_API_KEYGOOGLE_API_KEYr  r  OPENAI_API_KEYr  r  z_Nenhum provedor de IA configurado. Defina GEMINI_API_KEY (ou GOOGLE_API_KEY) antes de executar.z,[IA] Variavel OPENAI_API_KEY nao encontrada.zgpt-4o-mini)r  r  r  r  ze[IA] Chave do Gemini nao encontrada. Defina --gemini-key ou a variavel GEMINI_API_KEY/GOOGLE_API_KEY.r  zvariavel de ambiente existentezDEFAULT_GEMINI_KEY embutidaz%[IA] Usando chave Gemini a partir de .zgemini-2.5-flashz[IA] Provedor desconhecido: 
)
gemini_keyr.   r/   DEFAULT_GEMINI_KEYai_providerr  r>   ai_modelr  ai_temperatureprintenvironsysstderrwrite)rD  provided_gemini_keyr  r  r  sources         r(   resolve_ai_configr  x  s    	99%&	99%&	 	  %%'H6HYY'((HH6m
 	
 8)),-MNN.UYUhUhii8%w  ??#FYY'((BII6F,G,G5F2F5fXQ?@'.

#$3!3UYUhUhiiJJ3H:R@Ar8   	max_charsmax_segmentsc                 4   / nSn[        U 5       GH  u  pVSR                  UR                  R                  5       R	                  5       5      nU(       d  MF  [        U5      S:  a  US S S-   nU[        UR                  S5      [        UR                  S5      [        UR                  S5      US.n[        R                  " USS	9n	U(       a  U[        U	5      -   U:  a    U$ UR                  U5        U[        U	5      -  n[        U5      U:  d  GM    U$    U$ )
Nr   r         r   r   )r   r   r   r   r   Fensure_ascii)	enumeraterW   r   r  r   r   r)  r   r   r   jsondumpsrV   )
r   r  r  preparedtotal_charsidxr   r   entryencodeds
             r(   prepare_segments_for_air    s    
 &(HKh'xx(..01t9s?:%D399a(!$cllA.
 **U7c'l2Y>
 O	 	s7|#x=L(O) (( Or8   rd  top_kc                 P   U  Vs/ s H  nUS    SUS    SUS    SUS    3PM     nnSR                  U5      n[        R                  " S5      =(       d    [        n [	        UUUUUS9$ s  snf ! [
         a*  n[        S	U S
35        [	        [        UUUUS9s S nA$ S nAff = f)Nr   |r   r   r   r  PROMPT_HIGHLIGHT_SELECTION)r  rg  rh  r   z7[PROMPT] Falha ao formatar PROMPT_HIGHLIGHT_SELECTION (); usando padrao.)rW   r.   r/   "DEFAULT_PROMPT_HIGHLIGHT_SELECTIONr   r&   r  )	rd  rg  rh  r  itemlinessegments_blobr   r?   s	            r(   build_ai_promptr    s     D =/4=/4;-qfG 
  IIe$Myy56\:\H
#"
 	
  
GuL]^_#."
 	

s#   #A,A1 1
B%;B B% B%system_promptresponse_formatconfigpromptr  r  c                &   U=(       d    SnUc  SS0nU R                   [        S[        SU R                  5      5      USUS.SUS./S	.n[        R
                  " U5      R                  S
5      nSU R                   3SS.n[        SSXVS5      n[        R                  " U5      nUR                  S5      =(       d    / n	U	(       d  [        S5      eU	S   R                  S5      =(       d    0 n
U
R                  S5      nU(       d  [        S5      eU$ )NzUVoce e um assistente que retorna apenas JSON valido. Nao adicione texto fora do JSON.r  json_objectr   rm  system)rolecontentuser)r  r  r  messagesr   zBearer application/json)AuthorizationContent-Typezapi.openai.comz/v1/chat/completionsOpenAIr  z%OpenAI retornou resposta sem choices.r   messager  zOpenAI retornou resposta vazia.)r  r   rz  r  r  r  r  r  ry   loadsr`   r>   )r  r  r  r  payloadrf   rg   rk   parsedr  r  r  s               r(   call_openai_chatr    s    " _  !=13C);); <=*-8/
	G ::g%%g.D"6>>"23*G /1GX`aDZZFjj#)rGBCCajnnY'-2Gkk)$G<==Nr8   r  response_mime_typer  c                   SU R                    SU R                   3nSSU0/0/[        S[        SU R                  5      5      US.S.n[
        R                  " U5      R                  S	5      n[        U5      nUR                  =(       d    S
nUR                  (       a  U SUR                   3n[        UR                  =(       d    SUUSS0S5      n[
        R                  " U5      n	U	R                  S5      =(       d    / n
U
(       d  [        S5      eU
S   nUR                  S5      =(       d    0 nUR                  S5      =(       d    / nU(       d  [        S5      eUS   R                  S5      nU(       d  [        S5      eU$ )Nz8https://generativelanguage.googleapis.com/v1beta/models/z:generateContent?key=partsr   r   rm  )r  responseMimeType)contentsgenerationConfigr   /?z!generativelanguage.googleapis.comr  r  Geminir4   z(Gemini retornou resposta sem candidatos.r   r  zGemini retornou resposta vazia.zGemini nao retornou texto.)r  r  r   rz  r  r  r  r  r   rQ   queryry   hostnamer  r`   r>   )r  r  r  urlr  rf   
parsed_urlrQ   rk   r  r4   firstr  r  r   s                  r(   call_gemini_generater    sx    C6<<. Q	! 
  0123sCV-?-?$@A 2
G ::g%%g.D#J??!cDq))*+BB	+,D ZZFL)/RJEFFqMEii	"(bGKK &BE<==8<<D788Kr8   raw_textc                 R   U (       d  g U R                  5       n  [        R                  " U 5      $ ! [        R                   a     Of = f[        R
                  " SU [        R                  5      nU(       aB  UR                  S5      n [        R                  " U5      $ ! [        R                   a     Of = f[        R
                  " SU [        R                  5      nU(       aB  UR                  S5      n [        R                  " U5      $ ! [        R                   a     g f = fg )Nz\{.*\}r   z\[.*\])r  r  r  JSONDecodeErrorr   searchDOTALLr   )r  	obj_matchsnippetarray_matchs       r(   extract_json_payloadr  ;  s    ~~Hzz(##  		)Xryy9I//!$	::g&&## 		 ))Ix;K##A&	::g&&## 		s3   0 AA	B B65B68D D%$D%r  c                    U R                   S:X  a  [        U UUSS0S9nOU R                   S:X  a  [        XSS9nOg [        U5      $ )Nr  r  r  r  r  r  r  )r  r  r  r  )r  r  r  rJ   s       r(   request_ai_jsonr  V  sT     ("'#]3	
 
H	$"6FXY$$r8   resultc                    / nU R                  S/ 5       H  nUR                  [        [        UR                  SS5      5      [        UR                  SS5      5      [	        UR                  SS5      5      R                  5       [        UR                  SS5      5      [        UR                  S	S
5      5      S95        M     U$ )Nr   r   r   r   r   r|   r         r         ?r   r   r   r   r   )r`   rV   r   r   rO   r  )r	  r   r   s      r(   load_segmentsr  j  s     Hzz*b)CGGGS12#''%-.,-335!#''-">?$SWW-=s%CD	
 * Or8   c                    U R                  SS5      R                  SS5      n U R                  SS5      R                  SS5      n U R                  SS5      R                  S	S5      n [        R                  " S
SU R                  5       5      n U $ )Nu   –r  u   —u   “"u   ”u   ‘'u   ’\s+r   )rl   r   r   r  r   s    r(   normalize_segment_textr  y  sv    <<#&..x=D<<#&..x=D<<#&..x=D66&#tzz|,DKr8   c                 J    U  H  n[        UR                  5      Ul        M     g rN   )r  r   )r   r   s     r(   normalize_segments_in_placer    s    )#((3 r8   i'     )r  r  c                   / n/ nSn[        U 5       H  u  pg[        UR                  5      nU(       d  M#  U[        UR                  S5      [        UR
                  S5      US.n	[        [        R                  " U	SS95      n
U(       a,  XZ-   U:  d  [        U5      U:  a  UR                  U5        / nSnUR                  U	5        XZ-  nM     U(       a  UR                  U5        U$ )Nr   r   )r   r   r   r   Fr  )
r  r  r   r)  r   r   r   r  r  rV   )r   r  r  batchesr  r  r  r   r   r  encoded_lens              r(   iter_transcript_batchesr    s     +-G$&GKh'%chh/399a(!$	
 $**U?@%	1S\\5QNN7#GKu"% (& wNr8   c                 B   U  Vs/ s H  nUS    SUS    SUS    SUS    3PM     nnSR                  U5      n[        R                  " S5      =(       d    [        n [	        XCS9$ s  snf ! [
         a'  n[        S	U S
35        [	        [        US9s S nA$ S nAff = f)Nr   r  r   r   r   r  PROMPT_TRANSCRIPT_CLEANUP)r   z6[PROMPT] Falha ao formatar PROMPT_TRANSCRIPT_CLEANUP (r  )rW   r.   r/   !DEFAULT_PROMPT_TRANSCRIPT_CLEANUPr   r&   r  )rd  r  r  r  r   r?   s         r(   build_transcript_cleanup_promptr    s     D =/4=/4;-qfG 
  IIe$Myy45Z9ZH_#HEE  _FseK\]^#$EP]^^_s#   #A(A- -
B7BBBr   c                    SnU H  n[        U[        5      (       d  M   [        UR                  S5      5      nUS:  d  U[        U 5      :  a  ML  UR                  S5      n[        U[        5      (       d  Mt  [        U5      nU(       d  M  X`U   R                  :w  d  M  X`U   l	        US-  nM     U$ ! [        [
        4 a     M  f = f)Nr   r   r   r   )
r<  dictr   r`   	TypeErrorr  r   rO   r  r   )r   r   appliedr  r  r  	correcteds          r(   apply_segment_correctionsr$    s     G$%%	dhhw'(C 7cS]*88F#(C((*84	***!*SMqLG# $ N :& 		s   B55C	C	c           	         U (       d  g[        U 5        U(       a  UR                  S;  a  gSn[        U 5      n[        SS9 nU H  n[	        U5      n UR                  [        UUSS9nUR                  SS9nU(       d  M=  S n
[        U[        5      (       a)  UR                  S5      n[        U[         5      (       a  Un
O[        U[         5      (       a  Un
U
(       d  M  U[#        X
5      -  nM     S S S 5        U$ ! [         a#    [        R                  R                  S	5         M  [         a/  n	[        R                  R                  S
U	 S35         S n	A	  Mi  S n	A	ff = f! , (       d  f       U$ = f)Nr   >   r  r  r   )max_workersz8Retorne apenas JSON valido com as correcoes solicitadas.r  r]   r^   zC[IA] Revisao de transcricao excedeu 60s; prosseguindo sem ajustes.
z$[IA] Falha ao corrigir transcricao: r  r   )r  r  r  r   r  submitr  r	  r   r  r  r  r>   r<  r   r`   rY  r$  )r   r  total_appliedr  executorbatchr  futurer  r?   r   maybes               r(   correct_segments_with_air-    sW    )V__,@@M%h/G		*hE4U;F!#"\	 )  !---3 8<E'4((J/eT**!EGT**6xGGM7  
+: %   

  !gh 

  #GuB!OP 
+	*: sC   E%%C>9A;E%>)E"'E%*	E"3#EE%E""E%%
E4a_starta_endb_startb_endc                 D    [        S[        X5      [        X5      -
  5      $ )Nr   )r   rz  )r.  r/  r0  r1  s       r(   overlap_amountr3    s    sC%G(==>>r8   	win_startwin_endc                 B   [        SX!-
  5      nSnSnSnSn/ nUn	U  H  n
[        U
R                  U
R                  X5      nUS::  a  M,  [        S[        U
R                  U5      U	-
  5      nX|-  nXK-  nXR                  -  nXZR
                  U-  -  nXjR                  U-  -  n[        U
R                  U5      n	UR                  U
5        M     U(       d  [        S5      / 4$ XC-  nXc-  nU(       a  XT-  OSnXs-  nUS-  US-  -   [        SU5      S	-  -   US
-  -
  nUU4$ )Nr   r   r   rn  r        ?333333?g      g?g?)
r   r3  r   r   r   r   r   rz  rV   r   )r   r4  r5  win_durationspeech_timeweighted_confweighted_words	idle_timeselected_segmentscursorr   overlapgap
proportionspeech_ratioword_densityavg_confsilence_penaltyr   s                      r(   r{  r{    sY   tW01LKMNI')F CGGYHa< #s399i069:	||+
722..:55SWWg&  % " V}b  -L!0L.9}*tH.O 	s

	
dH

$	% C
	  
 ###r8   c                 6   [        U 5      nU(       d  / $ [        XQX#S9n UR                  S:X  a  [        XF5      nOUR                  S:X  a  [	        XF5      nO/ $ [        U5      n	/ n
[        U	[        5      (       ah  U	R                  S5      n[        U[        5      (       a  Un
OV[        U[        5      (       a  U/n
O=Uc"  SS	1[        U	R                  5       5      ::  a  U	/n
O[        U	[        5      (       a  U	n
U
(       d  / $ U S
   R                   nU S   R"                  n/ nU
 GH  n[        U[        5      (       d  M   [%        UR                  S5      5      n[%        UR                  S	5      5      n[+        UU5      n[-        UU5      nUU::  a  Mp  UU-
  nUU:  a  [-        UUU-   5      nUU-
  nUU:  a)  [-        UUU-   5      nUU-
  nUU:  a  [+        UUU-
  5      n[/        U UU5      u  nnU[%        S5      :X  d  U(       d  M  [1        UR                  SS5      =(       d    S5      R3                  5       n[1        UR                  SS5      =(       d    S5      R3                  5       nUR5                  [7        UUU[        U5      UUSS95        [9        U5      [+        SU5      :  d  GM    U$    U$ ! [
         a<  n[        R                  R                  SUR                   SU S35        / s S nA$ S nAff = f! [&        [(        4 a     GM  f = f)N)rg  rh  r  r  r  z[IA] Falha ao consultar ro   r  r	  r   r   r   rl  rn  r   r|   r   ai)r   r   r   r   r   r   r   r   )r  r  r  r  r  r>   r  r  r  r  r<  r   r`   rY  rW  keysr   r   r   r!  r  r   rz  r{  rO   r  rV   r   r   )r   rg  rh  r  r  r  r  rJ   r?   r  r   	raw_itemsfirst_startlast_endr	  r  r   r   r   r   r  r   r   s                          r(   select_highlights_with_airM  (  s    'x0H	XUF	??h&"62C__(&v6CI
 #3'G"$E'4  KK-	i&&E	4((KEGU#3s7<<>7J#JIE	GT	"	"	1+##K|H+-J$%%	$((7+,E(C K'(C %<;gh0C;gh0CU{H'!Kw7&x<xE&M!TXXh+1r288:DHHWb)/R0668h
	
 z?c!Um+Y X I  

3FOO3DBse2NO	< :& 		s:   J: J: J: 4L:
L 1K;5L ;L LLr   c                    SR                  S U R                   5       5      R                  5       n[        R                  " SSU5      n[        U5      U::  a  U$ US US-
   nSU;   a  UR                  SS5      S   OUnUS-   $ )Nr   c              3   ^   #    U  H#  oR                   (       d  M  UR                   v   M%     g 7frN   r   r   s     r(   rR   +summarise_highlight_text.<locals>.<genexpr>  s     G(:hhHCHH(:r   r  r   r   r   r   )rW   r   r  r   r   r   rsplitr!  r   r   r  s       r(   summarise_highlight_textrS    s    88G	(:(:GGMMOD66&#t$D
4yE;UQYG+.'>gnnS!$Q'wGU?r8   c                     SR                  S U R                   5       5      n[        R                  " SSU5      R	                  5       n[        U5      U:  a$  US U nSU;   a  UR                  SS5      S   OUnUnU$ )Nr   c              3   z   #    U  H1  oR                   (       d  M  UR                   R                  5       v   M3     g 7frN   )r   r  r   s     r(   rR   +get_highlight_transcript.<locals>.<genexpr>  s'     O0Bhh$CHHNN$$0Bs   ;!;r  r   r   )rW   r   r   r   r  r   rQ  rR  s       r(   get_highlight_transcriptrW    su    88O	0B0BOOD66&#t$**,D
4y5v,/2g~'..a(+7Kr8   	ai_configc           
         U(       a  UR                   S:w  a  g [        U SS9nU(       d  g [        R                  " S5      =(       d    [        n [        X2S9nS nS n[        S[        S-   5       H  n [        XS	S
9n  O   U(       a  Uc  [        S5        g UR                  5       n	U	=(       d    S $ ! [         a'  n[        SU S35        [        [        US9n S nANS nAff = f! [         aP  nUn[        SU S[         SU 35        U[        :  a   S nA  M  [        R                  " [        5         S nAM  S nAff = f)Nr  i  r   PROMPT_SOCIAL_CAPTION
transcriptz2[PROMPT] Falha ao formatar PROMPT_SOCIAL_CAPTION (r  r   z
text/plainr  z[IA][legenda] tentativa r  	 falhou: z/[IA][legenda] desistindo apos repetidas falhas.)r  rW  r.   r/   DEFAULT_PROMPT_SOCIAL_CAPTIONr   r&   r  ranger   r  timesleepr   r  )
r!  rX  r]  r   r  r?   rx   
last_errorattemptr   s
             r(   generate_social_captionre    s6   	**h6))4@Jyy01R5RH\%hF
 #H&*J-12	'+IR^_H 3 h&?@nnG?d+  \B3%GXYZ%&CPZ[\  	'J,WIQ7H6ISVRWXY++JJ~&&	's6   	B2 3
C&2
C#<CC#&
E 0$D;D;;E c           
         U(       a  UR                   S:w  a  g [        U SS9nU(       d  g [        R                  " S5      =(       d    [        n [        X2S9nS nS n[        S[        S-   5       H  n [        X5      n  O   U(       a  Uc  [        S5        g [        U[        5      (       d  [        S5        g [!        UR#                  SS5      =(       d    S5      R%                  5       n	[!        UR#                  SS5      =(       d    S5      R%                  5       n
U
(       d  [        S5        g U	(       d  U R&                  =(       d
    [)        U SS9n	XS.$ ! [         a(  n[        SU S35        [        [        US9n S nAGN-S nAff = f! [         aT  nUn[        S	U S
[         SU 35        U[        :  a
  S n S nA  GMC  [        R                  " [        5         S nAGMw  S nAff = f)Nr  ip  rZ  PROMPT_PORTAL_ARTICLEr\  z2[PROMPT] Falha ao formatar PROMPT_PORTAL_ARTICLE (r  r   z[IA][portal] tentativa r  r^  z.[IA][portal] desistindo apos repetidas falhas.z.[IA][portal] resposta invalida: JSON esperado.r   r|   articlez*[IA][portal] conteudo ausente na resposta.P   )r   rh  )r  rW  r.   r/   DEFAULT_PROMPT_PORTAL_ARTICLEr   r&   r  r`  r   r  ra  rb  r   r<  r   rO   r`   r  r   rS  )r!  rX  r]  r   r  r?   r  rc  rd  r   rh  s              r(   generate_portal_articlerk    s    	**h6))4@Jyy01R5RH\%hF
 )-G&*J-12		'%i8G 3 go>?gt$$>?GR(.B/557E'++i,2399;G:;P#;IR#P//A  \B3%GXYZ%&CPZ[\  	'J+G9A6G5H	RUQVWX++JJ~&&	's6   	E 3F
F
"FF

G+&G&G&&G+r]  r   	max_wordsc                    / nU R                  5       nUR                  5       nU(       a#  UR                  SR                  US U 5      5        [        R                  " SU5      n[        S U 5       S5      nU(       a  UR                  U5        U=(       d    SR                  5       R                  5       nU(       aB  UR                  5       n[        U5      S:  a#  UR                  SR                  US U 5      5        / n	U HJ  n
[        R                  " SSU
5      R                  5       n
U
(       d  M2  X;  d  M9  U	R                  U
5        ML     U	$ )Nr   z[.!?]c              3   n   #    U  H+  oR                  5       (       d  M  UR                  5       v   M-     g 7frN   )r  )rP   ss     r(   rR   (derive_banned_phrases.<locals>.<genexpr>  s      Jn	917799ns   55r|   r   r  )	r   r   rV   rW   r   nextr  r   r   )r]  r   rl  bannedclean_transcriptwordssentence_matchfirst_sentencereason_wordsunique_bannedr  s              r(   derive_banned_phrasesry    s   F!'')""$Echhu[y123XXh(89NJnJBONn%l!!#))+F||~|q MM#((<)#<=>Mvvfc4(..04D-  &  r8   banned_phrasesrd  previous_titlesc                    U=(       d    SnSR                  U R                  5       S S 5      R                  5       n/ nU(       a  UR                  SU S35        U(       a*  UR                  SSR                  S U 5       5      -   5        S	R                  U5      nS
n	U(       a  SSR                  S U 5       5      -   S	-   n	US:X  a  SOSn
[        R
                  " S5      =(       d    SnU(       a  U S	3OS
n [        UU
UUR                  UU	U S9$ ! [         a6  n[        SU S35        [        [        U
UUR                  UU	U S9s S nA$ S nAff = f)Nz(sem resumo adicional)r      zPrimeiras palavras proibidas: "r  zExpressoes proibidas: z; c              3   .   #    U  H  nS U S 3v   M     g7fr  NrC   )rP   phrases     r(   rR   %build_title_prompt.<locals>.<genexpr>  s     0\^61VHA^s   r  r|   zJTitulos descartados anteriormente (produza algo completamente diferente):
c              3   >   #    U  H  o(       d  M  S U S 3v   M     g7fr  rC   )rP   r   s     r(   rR   r    s     K/U!E7!/s   
r   zPRIMEIRA ENTREGA.
z$REFACA DO ZERO! Traga outro gancho.
PROMPT_TITLE_GENERATIONa  Voce e uma especialista em titulos. Use o texto abaixo (captions.txt) e escreva UM titulo curto e natural que resuma o fato principal.
Regras simples:
- Ate 45 caracteres.
- Sem emojis, hashtags, aspas ou ponto final.
- Frase coerente e direta em portugues, sem inventar nada alem do texto base.
TEXTO BASE (caption):
{transcript}
Retorne apenas JSON valido: {{"title":"TEXTO AQUI"}}
)attempt_sectionr   r   banned_sectionprevious_sectionr]  z4[PROMPT] Falha ao formatar PROMPT_TITLE_GENERATION (r  )rW   r   r   rV   r.   r/   r   r   r&   r  DEFAULT_PROMPT_TITLE)r]  r   r!  rz  rd  r{  first_wordsbanned_section_partsr  r  r  r   formatted_bannedr?   s                 r(   build_title_promptr    s~    //F((:++-bq1288:K&(##&Ek]RS$TU##$tyy0\^0\'\\	
 YY34NYiiK/KKL 	 07!|+AhOyy23 		E  1?.),B
#+''+-!
 	
  

DSEIZ[\# +''+-!
 	


s   ;D 
E+E	EEc           	      V   [        U 5      nU(       d  g [        X R                  5      n/ n[        (       a  SOSn[	        U5       GH  n[        UU R                  U UUU5      n [        X5      n Ub  [        R                  " USS9OSn
[!        S	US-    SU
 35        S n[#        U[$        5      (       a8  S
U;   a2  [        UR'                  S
5      =(       d    S5      R)                  5       nO[#        U[        5      (       a  UR)                  5       nOm[#        U[*        5      (       aX  U(       aQ  US   n[#        U[$        5      (       a7  S
U;   a1  [        UR'                  S
5      =(       d    S5      R)                  5       nU(       d  UR-                  S5        GMV  [/        U5      n[1        U5      nU(       a  [3        X5      (       aX  U(       d  SOSn[!        S	US-    SU SU< 35        UR-                  U=(       d    S5        U(       a  UR-                  U5        GM  [!        SUS-    SU< 35        Us  $    [!        S5        g ! [         a;  n	[        R                  R                  SUR                   SU	 S35         S n	A	  g S n	A	ff = f! [         a    [        U5      n
 GNf = f)Nr   r   z[IA] Falha ao gerar titulo com ro   r  Fr  nullz[IA][titulo] tentativa r   r|   r   z(resposta vazia)invalidoparecido_demaisz rejeitada (): z
(invalido)z#[IA][titulo] aprovado na tentativa z>[IA][titulo] nenhuma tentativa valida, fallback sera aplicado.)rW  ry  r   	FAST_MODEr`  r  r  r>   r  r  r  r  r  r  r!  rO   r  r<  r   r`   r  rY  rV   sanitise_title_textforce_uppercase_titletitle_is_too_similar)r!  r  r]  rz  r{  max_attemptsrd  r  r  r?   payload_previewr5   r  r   s                 r(   generate_title_with_air  A  sc   ))4J*:7G7GHN!#O!	1qL&#
	%f5G
	+IPI\djjuEbhO 	'!}B6GHI#'	gt$$G);GKK06B7==?I%%I&&7AJE%&&7e+;		' 2 8b9??A	""#56'	2	))4	0FF'0Z6GF)'A+l6(#-! ""9#<=%%i03GaK=9-PQe 'h 

JKU  	JJ>v>OrRUQVVXYZ	  	+!'lO	+s*   $I0J
J0JJJ('J(caption_textr_   c           	      t   [         R                  " S[        5      nU(       d  gSUR                  5       ;   a  UOUSU;   a  SOS-   nU R	                  5       (       d  [        SSS	9  g[        R                  " U [        S
.SS9R                  S5      n[        R                  R                  X4SS0SS9nS[        S[        4S jnS[        S[        [           4S jnSnSn	Sn
[        SU S3SS	9  Sn [        R                  R                  XQS9 n[!        USS5      nUR#                  5       nUR%                  SSS9n	[        SU	SS   3SS	9  U" U	5      n [        R&                  " U5      n
U(       a  [        S!U 3SS	9  SSS5        U" W5      =(       d    U" U	5      n[1        U
[2        5      (       Ga+  S$U
;   a3  [        U
R5                  S$5      =(       d    S5      R	                  5       nGOS%U
;   a3  [        U
R5                  S%5      =(       d    S5      R	                  5       nGOS&U
;   aV  [1        U
S&   [2        5      (       a>  U
S&   nS$U;   a1  [        UR5                  S$5      =(       d    S5      R	                  5       nGO(U
(       aU  U
R7                  5        HA  n[1        U[        5      (       d  M  UR	                  5       (       d  M1  UR	                  5       n  O   O[1        U
[8        5      (       a  U
(       a  U
S'   n[1        U[2        5      (       aJ  [        UR5                  S$5      =(       d    UR5                  S%5      =(       d    S5      R	                  5       nOK[1        U[        5      (       a  UR	                  5       nO%[1        U
[        5      (       a  U
R	                  5       nU(       a)  [1        U[        5      (       a  S(UR;                  5       ;   d  S(U	R;                  5       ;   a  SnU(       a>  [1        U[        5      (       a  S(UR;                  5       ;   d  [1        U
[2        5      (       d=  U(       a  UnO3U	=(       d    SnU" U5      nU" U5      =(       d    U" U5      nU(       a  UnU(       d  [        S)U	SS*  3SS	9  gUR=                  S+5      (       a  UR?                  S+5      (       d,  UR=                  S,5      (       a)  UR?                  S,5      (       a  US-S. R	                  5       nURA                  S/S+5      RA                  S,S5      n[C        U5      n[E        U5      nUR=                  S05      (       a_  UR?                  S15      (       aI   [        R&                  " U5      n
S2 H+  nUU
;   d  M  [E        [C        [        U
U   5      5      5      n  O    [        S3U 35        U=(       d    S$ ! [(         a    UR	                  5       n
 GNmf = f! , (       d  f       GNd= f! [(         a-  n[*        R,                  R/                  S"U S#35         SnAgSnAff = f! [(         a     Nf = f)4zFEnvia o caption para o webhook externo e tenta obter um titulo pronto.TITLE_WEBHOOK_URLNzwait=r  z
&wait=truez
?wait=truez/[Webhook] Caption vazio; titulo nao solicitado.Tflush)r   r  Fr  r   r  r  rj   )rf   rg   methodr   r    c                    U R                  5       nUR                  S5      (       aZ  UR                  S5      nUR                  SS5      n[	        U5      S:X  a  US   nUR                  SS5      S   R                  5       nU$ )Nz````r  r   r   r   )r  rV  lstripr   r   rQ  )r   txtr  s      r(   _strip_code_fence5request_title_from_webhook.<locals>._strip_code_fence  sp    jjl>>%  **S/CIIdA&E5zQAh**UA&q)//1C
r8   r  c                     U (       d  g SS/nU Ha  n[         R                  " X [         R                  [         R                  -  5      nU(       d  MB  UR	                  S5      R                  5       s  $    g )Nz!"title"\s*:\s*"((?:\\.|[^"\\])*)"z!'title'\s*:\s*'((?:\\.|[^'\\])*)'r   )r   r   
IGNORECASEr  r   r  )r  patternspatr   s       r(   _extract_title_from_text<request_title_from_webhook.<locals>._extract_title_from_text  sa     10
 CIIc		(ABEu{{1~++--  r8   r8   r|   z [Webhook] Enviando caption para z (aguardando resposta unica)r^   rw   r  rm   z[Webhook] Resposta bruta: rp   z[Webhook] Status z![Webhook] Falha ao obter titulo: r  r   Titulorf   r   WORKFLOWz4[Webhook] Nenhum titulo encontrado. Resposta bruta: i  r  r  r   rl  z\"r   r   )r   TITLETitlez[Webhook] Titulo retornado: )#r.   r/   DEFAULT_TITLE_WEBHOOKr  r  r  r  r  r  r  urllibrq   RequestrO   r   urlopengetattrrs   rt   r  r&   r  r  r  r<  r   r`   valuesrY  r   rV  rM  rl   r  r  )r  r_   base_urlr  r  reqr  r  rk   raw_decodedrf   r   resprw   r  r?   regex_titlenestedvalr  fallback_textcleaned_text	extractedr   s                           r(   request_title_from_webhookr    s=   yy,.CDH(.."22((VY]eVelkw:xC?tLjj ,@A fWo  ..
 
 ^M_<`io
 
pC	 	 	c hsm  DKD	,SE1M
NVZ[E^^##C#9TT8T2F99;D++gh+?K.{4C/@.AB$O'4G'zz'* )&2$? :  +73\7OP[7\K$d?)/R0668E*0b1779Et^
4< > >&\F& FJJw/526<<>{{}c3''CIIKKIIKE % 
D$		DQeT""		'*Geii.AGRHNNPEs##KKME	D#		

*UC((Z5;;=-Hj\g\m\m\oNoz%--*2MWabfhlWmWmE'-2M,];L0>iBZ[hBiI!D[QURUEVDWX`de%.."5"55;K;KC;P;PUZUcUcdgUhUha!!#MM%%--c26E&E!%(E!4!4	::e$D2$;12Ec$s)n2UVE 3 
(
01=DG  '}}' :9  

<SEDEx  		sy   3W0 AWV=-WW0 X* ?!X* !X* =WWWW
W-(W0 -W0 0
X':#X""X'*
X76X7c                    [         R                  " SU =(       d    S5      n SR                  S U  5       5      n U R                  5       n [        R
                  " SSU 5      n [        R
                  " SSU 5      R                  5       $ )Nr  r|   c              3   `   #    U  H$  n[         R                  " U5      (       a  M   Uv   M&     g 7frN   )r  	combiningrP   chs     r(   rR   -normalise_text_for_compare.<locals>.<genexpr>  s     F"K,A,A",E22s   .	.z[^a-z0-9\s]+r   r  )r  r  rW   r  r   r   r  r   s    r(   normalise_text_for_comparer    se      4D77FFFD::<D66/3-D66&#t$**,,r8   r   c           	      f   [        U 5      nU(       d  gUR                  5       n[        U5      S::  a  g[        [        USS95      nU(       a  X$;   d  UR	                  U5      (       a  gUR                  5       nSn[        X55       H  u  pxXx:X  a  US-  nM    O   U[        S[        U5      [        U5      5      :  a  g[        U5      [        U5      -  n	U	(       a/  [        U	5      [        S[        [        U5      5      5      -  S:  a  g[        UR                  5      n
U
(       ay  X*;   d  U
R	                  U5      (       a  gU
R                  5       n[        U5      [        U5      -  nU(       a/  [        U5      [        S[        [        U5      5      5      -  S:  a  g[        U5      S	::  a  gg
)NTr   ri  rZ  r   r   r   g333333?
   F)
r  r   r   rS  rV  ziprz  rW  r   r   )r   r!  
title_normtitle_wordssnippet_normsnippet_wordscommon_prefixtwswr@  reason_normrw  overlap_reasons                r(   r  r    sy   +E2J""$K
;1-.FyXZ.[\L%)@)@)L)L$**,+5FBx"	 6
 C3{#3S5GHHk"S%77s7|c!S[1A-B&CCsJ,Y-=-=>K$(>(>z(J(J"((*[)C,==c.1C3s;?O;P4QQUXX
:"r8   c                    U =(       d    SR                  SS5      n [        R                  " SSU 5      R                  5       n U R                  S5      n U (       d  gU (       a  U S   S;   a  U S S n U R                  5       n U (       d  g[	        U 5      [
        :  a(  U S [
         nSU;   a  UR                  SS5      S	   OUnUn U (       a1  U S	   R                  5       (       d  U S	   R                  5       U SS  -   n U $ )
Nr|   r  r   r  z "'rl  z.!?r   r   )	rl   r   r   r  r   MAX_TITLE_LENrQ  isupperr   )r   r  s     r(   r  r  -  s    [b!!$,EFF63&,,.EKKEre#cr
 KKME
5zM!'/2g~'..a(+7U1X%%''a 59,Lr8   source_textfallback_titlec                 ^   U =(       d    SR                  5       nUR                  5       nU(       d  U$  [        SSS9  [        U5      nU(       a+  [	        [        U5      5      nU(       a  [        SU 35        U$ [        S5        U$ ! [         a  n[        SU 35        S n S nAN^S nAff = f)Nr|   z   [Titulo] Chamando webhook...Tr  z"   [Webhook] Falha na requisicao: z   Titulo webhook: z6   [Webhook] Nenhum titulo retornado; usando fallback.)r  r  r  r&   r  r  )r  r  r  ro  webhook_titler?   neats          r(   build_title_from_webhookr  G  s     b'')G##%H/t<27; $%8%GH'v./K	
BCO  23%89s   B 
B,B''B,c                 B   U (       d  gSR                  S U  5       5      nUR                  5       nSnUnU(       aE  US   R                  5       (       d-  X#S   -  nUSS  nU(       a  US   R                  5       (       d  M-  X#R                  5       -   R                  5       $ )Nr|   c              3      #    U  HM  oR                  5       (       d2  UR                  5       (       d  UR                  5       (       d  US ;   d  MI  Uv   MO     g7f)z!?.,:-_'"()N)isasciiisalnumisspacer  s     r(   rR   (force_uppercase_title.<locals>.<genexpr>_  s7     q5RJJLLBJJLLBJJLL\^bp\pbb5s   AA	Ar   r   )rW   r  r  r   )r   r  prefixrests       r(   r  r  [  s    ggq5qqGmmoGFD
tAw((q'ABx tAw(( ZZ\!((**r8   	min_wordsc                     U (       d  gU R                  5       n[        U5      U:  a  US U n[        U5      U:  a  SR                  U5      $ SR                  U5      $ )Nr|   r   )r   r   rW   )r   rl  r  rt  s       r(   compress_titler  i  sS    JJLE
5zIjy!
5zIxx88E?r8   c                   ^^^ U (       d  gU R                  5       m1 Skm1 SkmS[        S[        SS 4U4S jjn[        U4S jT 5       5      n[        U4S	 jT 5       5      nU(       d	  U" S
S5        U(       d+  [	        U4S j[        T5       5       S
5      nU" US-   S5        SR                  T5      n[        [        U5      5      n[        UR                  5       5      S:  a"  SR                  UR                  5       S S 5      n[        U5      [        :  a&  US [         nSU;   a  UR                  SS5      S
   OUnU$ )Nr|   >   EFOIESTASERA   ESTÁ   SERÁ>   DADEDOEMPORAPOS   APÓSr  r   r    c           	      l   > [        S[        U S-   [        T5      5      5      nTR                  X!5        g r   )r   rz  r   insert)r  r   posrt  s      r(   insert_after/ensure_aux_and_connective.<locals>.insert_after{  s*    !Sq#e*-.S r8   c              3   ,   >#    U  H	  oT;   v   M     g 7frN   rC   )rP   wauxiliariess     r(   rR   ,ensure_aux_and_connective.<locals>.<genexpr>  s     2Eq{"E   c              3   ,   >#    U  H	  oT;   v   M     g 7frN   rC   )rP   r  connectivess     r(   rR   r    s     3U#Ur  r   r  c              3   <   >#    U  H  u  pUT;   d  M  Uv   M     g 7frN   rC   )rP   ir  r  s      r(   rR   r    s     K&6da!{:J&6s   	r   r  r      )r   r   rO   rX  rq  r  rW   r  r  r   r  rQ  )	r   r  has_auxhas_connaux_idxfixedr  r  rt  s	         @@@r(   ensure_aux_and_connectiver  t  s   KKME@KBK!# !c !d ! 2E22G3U33HQKi&6KQOWq[$'HHUOE!"5e"<=E
5;;=Bs+,
5zM!n}%+.%<S!$Q'ULr8   >#   Ar  OAOASr  r  r  r  NANOOSOUSEUMAOSCOMDASDOSERAr  MASNASNOSr  PRAQUESERSOBUMAPARAPRAAPRAOPRAASPRAOSc                    [         R                  " S[        R                  " SU R	                  5       5      5      n0 nU Hb  nSR                  S [        R                  " SU5       5       5      n[        U5      S::  d
  U[        ;   a  MK  UR                  US5      S-   X5'   Md     [        UR                  5       S S	9nUS U  VVs/ s H  u  pGUPM	     snn$ s  snnf )
Nu;   [A-Z0-9ÃÃ‰ÃÃ“ÃšÃƒÃ•Ã‚ÃŠÃ”Ã‡]+r  r|   c              3   R   #    U  H  oR                  5       (       d  M  Uv   M     g 7frN   )r  r  s     r(   rR   3extract_keywords_from_transcript.<locals>.<genexpr>  s     ['Jjjl""'Js   '	'r   r   r   c                     U S   * U S   4$ )Nr   r   rC   )r  s    r(   ru  2extract_keywords_from_transcript.<locals>.<lambda>  s    47(DG9Lr8   r   )r   findallr  r  r   rW   r   	STOPWORDSr`   sortedr   )r]  r   rt  freqwordr  sorted_wordsr'  s           r(    extract_keywords_from_transcriptr0    s    JJUWbWlWlmsu  vF  vF  vH  XI  JED''[{'<'<VT'J[[w<19 4!,q0	 
 $**,,LML ,Ve 45 4WTD 4555s   Cc           
         [        U SS9n[        U5      n[        [        [	        U R
                  S-  5      5      [        [        5      -     n[        U5      S:  a  US    SUS    SUS	    3nO[        U5      S	:X  a  US    S
US    3nO[        U5      S:X  a	  US    S3nOrU R                  =(       d    Sn[        R                  " SSU5      R                  5       R                  5       nUS [        S[        [        U5      [        S-
  5      5       nU SU 3n[        U5      n[!        U5      n[        U5      [        :  a&  US [         nSU;   a  UR#                  SS5      S   OUn[        U5      S:  a  [!        U S35      nU$ )NiX  rZ  r  r   r   r   r   z VS r   z SOB PRESSAO z	 EM XEQUEzVERDADE ESCONDIDAr     r   z SEGREDO REVELADO)rW  r0  TITLE_PREFIXESr   r)  r   r   r   r   r   r  r   r   rz  r  r  r  rQ  )r!  r]  keywordsr  	hook_corer'   hooks          r(   fallback_title_from_highlightr7    s   ))3?J/
;HCioo&: ;<s>?RRSF
8}{m1Xa[Mhqk]C		X!	{m=!>		X!	{m9-	6#6vvfc4(..0668E3r3s4y-!2C#DEF	XQyk"Dt$D &D
4y= N]#),t{{3"1%$
4y2~$x/@%ABKr8   r	  c           	         [        U SS9 VVs/ s H  u  p#UR                  (       a  M  X#4PM     nnnU(       d  g U H  u  pSS nU(       a  [        X15      nU(       d  [        U5      n[	        SU< 35        [        [        U5      5      Ul        [	        S[        UR                  5       S[        UR                  5       SUR                  < 35        M     g s  snnf )Nr   r   z[IA][titulo] usando fallback: z[IA][titulo] final para corte r  ro   )
r  r   r  r7  r  r  r  fmt_tsr   r   )r	  rX  r  r!  pendingr'  r   s          r(   assign_titles_to_highlightsr<    s    /81/M5/M^SU^UdUd/M  5 *9@E1)<E25)<=/0CE0JK	,VIOO-D,EQvimmG\F]]_!#	
  5s
   CCc                 \   / nU (       d  U$ [        [        U 5      5       H  nX   R                  n[        U[        U 5      5       H_  nX   R                  nX-
  n	X:  a  M  X:  a    MJ  [	        XU5      u  pU
[        S5      :X  a  MC  UR                  [        UUU
USS95        Ma     M     U(       dZ  U S   R                  nU S   R                  n[	        XU5      u  pUR                  [        UUU
U=(       d    [        U 5      SS95        UR                  S SS9  US [        S	U5       $ )
Nrn  	heuristicrp  r   rl  c                     U R                   $ rN   rr  rs  s    r(   ru  !find_highlights.<locals>.<lambda>!  rw  r8   Trx  r   )r`  r   r   r   r{  r   rV   r   rY  r^  r   )r   rg  rh  r  r4   	start_idxr4  end_idxr5  r   r   r  r|  r}  s                 r(   find_highlightsrC    s5   +-J3x=)	'--	YH6G'++G*H!!*8HOEf%"#%& 7 *, qk''RL$$	&xiH!!3T(^"	
 OO)4O8oAu&&r8   secondsc                     [        [        U [        U 5      -
  S-  5      5      n[        U 5      S-  n[        U 5      S-  S-  n[        U 5      S-  nUS SUS SUS SUS 3$ )Nr#  r]   i  02:,03r   r)  )rD  r%  ro  mhs        r(   r:  r:  %  ss    	UGc'l*d23	4BGrA	W	r!AGAV1QrF!Ab62b'**r8   c                     [        [        U S-  5      5      nUS-  nUS-  nUS-  nUS-  nUS-  nUS-  nUS SUS SUS SUS 3$ )Nd   r]   drG  r(  r  rJ  )rD  total_cscstotal_sro  total_mrK  rL  s           r(   fmt_ass_timerT  -  sp    53'(H	CB#oG"AmG"A2AU!Ac7!Ac7!Bs8,,r8   c                 f    U R                  SS5      R                  SS5      R                  SS5      $ )N\\\r   z\{r   z\})rl   r   s    r(   
escape_assrX  8  s-    <<f%--c59AA#uMMr8   line_spacingc                     US::  d  SU ;  a  U $ U R                  S5      nU(       d  U $ US   /nUSS  H  nUR                  SU SU 35        M     UR                  S5        SR                  U5      $ )	zDInject ASS baseline offsets so multi-line titles gain extra spacing.r   z\Nr   Nz\N{\pbo-r   z{\pbo0}r|   )r   rV   rW   )r   rY  r  spacedsegments        r(   apply_ass_line_spacingr]  <  sz    qE-JJuEq
F9L>G9=> 
MM*776?r8   max_words_per_screenc           
         / nUS::  a  [         n[        SU R                  5      nU R                   GH  n[        UR                  U R                  5      n[        UR                  U R                  5      nXe::  a  MK  UR                  R                  SS5      R                  5        Vs/ s H  ow(       d  M  UR                  5       PM     nnU(       d  M  [        SXe-
  5      n	U	[        U5      -  n
[        S[        U5      U5       H  nXX-    nXZU-  -   nXZU[        U5      -   -  -   n[        Xn5      nXR                  -
  nXR                  -
  nUU::  a  U[        SU
[        U5      -  5      -   n[        SU5      n[        UU5      nUU-
  S:  a  [        X?S-   5      n[        SUU-
  5      n[        X?U-   5      n[        SU[        U5      -  5      nUR                  UUUUS	.5        M     GM     U$ s  snf )
Nr   g?r  r   r  g
ףp=
?r   皙?)r   r   rt  per_word)DEFAULT_MAX_WORDS_ON_SCREENr   r   r   r   rz  r   r   rl   r   r   r   r`  rV   )r!  r^  chunkshighlight_durationr   	seg_startseg_endr  rt  absolute_durationra  r  blockblock_start_absblock_end_abs	rel_startrel_endchunk_durationper_word_chunks                      r(   build_subtitle_chunksro  J  s    $&Fq :S)"4"45!!		9??3	cggy}}-$'HH$4$4T3$?$E$E$GM$Gq1$GMW%89$s5z1CJ(<=C :;E'S.8O%C#e*4D(EEM7M'//9I#oo5G)##c$3u:0E&FFC+I,g6G"T)0c/B w':;N,..HIG ~E
'BCNMM&"" .	+ > "V MK Ns   (
G76G7c                 N   SR                  U R                  5       5      nU(       d  / $ UR                  5       n/ n/ nU Hp  nU(       a  SR                  XE/-   5      OUn[        U5      [        :  a,  U(       a%  UR	                  SR                  U5      5        U/nM_  UR	                  U5        Mr     U(       a   UR	                  SR                  U5      5        [        U5      [
        :  a8  US [
        S-
   nUR	                  SR                  U[
        S-
  S  5      5        UnU$ )Nr   r   )rW   r   r   FIT_TITLE_MAX_CHARS_PER_LINErV   FIT_TITLE_MAX_LINES)r   cleanrt  r  r  r.  r5   keeps           r(   split_fit_title_linesru    s    HHTZZ\"E	KKMEEG29CHHWv-.t	y>88WLL'*+fGNN4   SXXg&'
5z''.*Q./CHHU#6#:#<=>?Lr8   Fr  )exclude_titletitle_only_pathvariant_modeass_pathtitle_margin_vrv  rw  rx  c                2   UR                  5       S:H  nU(       a  SOSnU(       a  SOSnSn	U	n
SnU(       a  [        U	S-  5      n
O%[        U	S-  5      n
[        [        U
S	-  5      5      nU(       a  SnS
nS
nOSnSnSnSnSnSU SU SU
 SU SU SU SU SU S3n/ n[        U 5      nU H  n[	        SUS   U-   5      n[        U R                  U-   [	        US-   US   U-   5      5      nUU::  a  US-   nUS   nUS   nS[        U5       S[        U5       S [        S!R                  U5      5       3nUR                  U5        M     U R                  R                  5       n/ nS"nU(       Ga  UR                  S#S$5      R                  S$5       Vs/ s H  nUR                  5       PM     nnU Vs/ s H  nU(       d  M  UPM     nnU(       d  UR                  5       /n[        U5      nU(       a  / n [!        U5      S%:X  a  [#        US   5      n O/U H)  n[#        U5      =(       d    U/n!U R%                  U!5        M+     U  Vs/ s H  nU(       d  M  UPM     sn=(       d    UnUn"[&        n#[)        U5       HP  u  n$n%[        U%5      n&U"U$U#-  -   n'UR                  S&[        U R                  5       S'U
 S([*         SU' S)U& 3
5        MR     OV[        S*R                  U5      5      n(US:  a  [-        U(U5      n(UR                  S&[        U R                  5       S+U( 35        [/        U5      n[        U5      n)U(       a  U(       d  UU)SS& U(       d*  S&[        U R                  5       S,3n*UR                  U*5        UR1                  US$R                  U)5      -   S$-   S-S.9  U(       a.  U(       a'  UR1                  US$R                  U5      -   S$-   S-S.9  U$ U(       a$  UR3                  5       (       a  UR5                  S/S09  U$ s  snf s  snf s  snf )1Nr        r   Z   r   r7  r8  g{Gz?z
&H00000000r}  z
&H00151515z
&H64000000z
&H00FFFFFFr`  a  [Script Info]
ScriptType: v4.00+
PlayResX: 1080
PlayResY: 1920
ScaledBorderAndShadow: yes
YCbCr Matrix: TV.709

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Anton,zP,&H00FFFFFF,&H00777777,&H00151515,&H64000000,-1,0,0,0,100,100,0,0,1,6,3,2,60,60,z,1
Style: Title,Anton,rH  z,&H00FFFFFF,z,-1,0,0,0,100,100,0,0,1,z,3,8,80,80,z],1

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
r   r   r  r         ?ra  rt  zDialogue: 0,z3,Default,,0,0,0,,{\blur0.8\bord6\shad3\fad(120,80)}r   Fr  r   zDialogue: 0,0:00:00.00,z,,Title,,0,0,0,,{\bord0\shad0\fad(120,120)\fsz\pos(z)}z \N z2,Title,,0,0,0,,{\blur0.8\bord6\shad3\fad(120,120)}z@,Default,,0,0,0,,{\blur2\bord7\fad(120,120)}(sem fala detectada)r   r   T
missing_ok)r  r   r)  ro  r   rz  r   rT  rX  rW   rV   r   r  rl   r   rY  r   ru  extendFIT_TITLE_LINE_GAPr  FIT_TITLE_POS_Xr]  r=  
write_textr2   unlink)+r!  ry  rz  rv  rw  rx  is_fitsubtitle_font_sizesubtitle_margin_vbase_title_font_sizetitle_font_sizetitle_line_spacingtitle_outlinetitle_outline_colourtitle_back_colourtitle_primary
start_leadheaderr  rc  chunkr   r   ra  rt  line
title_texttitle_lines	has_titler   base_segmentsr   
auto_linesr6   base_yrA  r  r\  escaped_segmenty_posescaped_titleoutput_linesfallback_lines+                                              r(   write_ass_subtitlesr    s    !U*F &C%3*O2S89 2S89 '=!>?+(+( MJ
	  !33  4D  EV  DW W-.alK_J``absat  uM  N[  M\  \g  hv  gw w\	\ $ E"9-FCw*45)$$z13us{E%LS]D]3^_%<$,C$g <./qc1B0C D77A#((5/7R6SU 	 	T  &&(JKI0:0B0B40N0T0TUY0Z[0Z0Z[(5=='--/0M&$&J8}!28A;?
#C4S9BcUH%%h/ $ *4<t<HH#F$C )( 3W",W"5s*""-l9;M;M.N-O P99H8IP_O``abgahhkl{k|~ !4 'w||H'=>M!A% 6}FX Y),y7I7I*J)K L<<I?L %	;L'Qq%l93E3E&F%G HA A 	 	]#<!884?'R9""6DIIk,B#BT#IT["\  
_3355$/i \= =s   P
6PP
PPsrt_pathc                 d   / nSnU R                   R                  5       nU(       aM  [        SU R                  S-
  5      nUR	                  U S[        S5       S[        U5       SU S35        US-  n[        U 5      nU Hv  nUS   n[        U R                  [        US-   US	   5      5      n	S
R                  US   5      n
UR	                  U S[        U5       S[        U	5       SU
 S35        US-  nMx     U(       d  UR	                  S5        UR                  SR                  U5      SS9  g )Nr   r   r`  r  r   z --> r   r  r   r   rt  z51
00:00:00,000 --> 00:00:03,000
(sem fala detectada)
r   r   )
r   r  r   r   rV   r:  ro  rz  rW   r  )r!  r  cuesr  r  end_timerc  r  r   r   r   s              r(   write_srt_subtitlesr    s#   D
C&&(JsI..56se2fSk]%x0@/AJ<rRSq"9-Fg)$$c%#+uU|&DExxg'se2fUm_E&+bbIJq  NO		$':r8   c                  @    [        5       S L=(       a    [        5       S L$ rN   )rI   rD   rC   r8   r(   _mp_face_module_availabler  .  s    "$D0T5F5HPT5TTr8   	min_value	max_valuec                 "    X:  a  U$ X:  a  U$ U $ rN   rC   )r5  r  r  s      r(   _clampr  2  s    Lr8   c            	       d    \ rS rSrS\SS4S jrSS jrSS jrSS jrS	\	S
\	S\
S\\   4S jrSrg)FaceCropAnalyzeri:  
video_pathr    Nc           	         [        5       nUc  [        S5      e[        U5      U l        X l        UR                  U R                  5      U l        U R                  R                  5       (       d  [        S5      e[        U R                  R                  UR                  5      =(       d    S5      U l        [        U R                  R                  UR                  5      =(       d    S5      U l        [        U R                  R                  UR                  5      =(       d    S5      U l        U R                  S::  d  U R                  S::  a  U R#                  5         [        S5      eSU l        U R$                  [        U R                  5      -  U l        [)        S[        [+        U R                  U R&                  -  5      5      5      U l        SU l        S	U l        U R,                  U R.                  :  U l        [)        SU R,                  U R.                  -
  5      U l        [        U R                  R                  UR6                  5      =(       d    S5      U l        g )
NzOpenCV nao esta instalado.z:Nao foi possivel abrir o video para analise com MediaPipe.r   g      >@z7Dimensoes do video sao invalidas para analise de rosto.g      @r   i8  i  )rD   r>   rO   r  _cv2VideoCapturecapisOpenedr   r`   CAP_PROP_FRAME_WIDTHr   CAP_PROP_FRAME_HEIGHTr   r   CAP_PROP_FPSfpsru   scale_target_heightscale_factorr   r)  scaled_width
crop_widthcrop_heightsupports_cropmax_xCAP_PROP_FRAME_COUNTframe_count)r   r  
cv2_modules      r(   __init__FaceCropAnalyzer.__init__;  s   &(
;<<j/	**4??;xx  ""[\\j&E&EFK!L
$((,,z'G'GHMANj&=&=>F$G::?dkkQ.JJLXYY#)  44uT[[7II3uTZZ$:K:K-K'L#MN!..$//AD--?@
txx||J,K,KLQPQRr8   c                     [        U S5      (       a0  U R                  b"  U R                  R                  5         S U l        g g g )Nr  )hasattrr  releaser   s    r(   ru   FaceCropAnalyzer.closeU  s7    4DHH$8HHDH %9r8   c                     U $ rN   rC   r   s    r(   	__enter__FaceCropAnalyzer.__enter__Z  s    r8   c                 $    U R                  5         g rN   )ru   )r   exc_typer?   tbs       r(   __exit__FaceCropAnalyzer.__exit__]  s    

r8   r   r   detectorc           
      ,   U R                   (       d  g X:  a  US-   n[        S[        XR                  -  5      5      n[        US-   [        X R                  -  5      5      nU R                  S:  a  [        XPR                  S-
  5      n[        S[        [        U R                  S-  5      5      5      n/ nSnUn	X::  Ga  U R                  R                  U R                  R                  U	5        U R                  R                  5       u  pU
(       a  Uc  GOJUS-  nU R                  R                  XR                  R                  5      nUR                  U5      nU(       a  UR                  (       a  [        UR                  S S9nUR                   R"                  n[%        UR&                  SS5      n[%        UR(                  SS5      n[%        UR*                  SS5      nUS::  d  US::  a  X-  n	GM>  [%        UU-   SS5      n[%        UUS	-  -   SS5      nUR-                  UU R.                  -  UU R.                  -  UU R.                  -  45        X-  n	X::  a  GM  U(       d  g [1        U6 u  nnn[        U5      n[        U5      nUU-
  nS
U R2                  -  nUS-  n[        UU5      n[        SUU-
  5      n[        [5        U R.                  5      UU-   5      nUU-
  U R2                  :  a	  UU-   S	-  n O[6        R8                  " U5      n [        [        U U R2                  S	-  -
  5      5      n![        S[        U R:                  U!5      5      n![=        U5      n"U"[        SU5      -  n#[?        U!SU R2                  U R@                  U#U"US9$ )Nr  r   r   g      @c                 F    U R                   (       a  U R                   S   $ S$ )Nr   r   rr  )dets    r(   ru  1FaceCropAnalyzer.compute_window.<locals>.<lambda>}  s    CIICIIaL$F3$Fr8   r)  r   r  rm  g{Gz?r  r   r   r   r   r   r   r   )!r  r   r   r  r  rz  r)  r  rW  r  CAP_PROP_POS_FRAMESrs   cvtColorCOLOR_BGR2RGBprocessr   location_datarelative_bounding_boxr  xminr   r   rV   r  r  r  r   
statisticsmedianr  r   r   r  )$r   r   r   r  start_frame	end_framesample_strider   total_samples	frame_idxokframe	rgb_frameresultsbestbboxleftr   r   rightcenterleftsrightscentersmin_left	max_rightspanbase_marginadaptive_marginmarginpadded_leftpadded_right	center_pxcrop_xdetections_countr   s$                                       r(   compute_windowFaceCropAnalyzer.compute_window`  s;   !!<#+C!S!123aS88^)<=	aI'7'7!';<IAs5C#89:79
	$HHLL66	BIBQM		**5))2I2IJI&&y1G7--&&F ))??diic2tzz34S#6A:1.Ite|S#6us{ 2C=!!D---ut7H7H/H&SWSdSdJde &I7 $: !$j!1vwu:K	8#T__,+[/2#x&015!2!23Y5GH+%8$|3s:I"))'2IU9t'<<=>QDJJ/0z?%A}(==
//##!'!
 	
r8   )r  r  r  r  r  r  r   r  r  r  r  r  r  r   r    N)r    r  )r   r   r   r   r	   r  ru   r  r  r   r   r   r   r  r   rC   r8   r(   r  r  :  sS    S4 SD S4
N
E N
 N
 N
R\I] N
r8   r  r  c                 2   U(       d  g [        5       (       d  [        S5        g  [        5       n[        U 5       nUR                  (       d  [        S5         S S S 5        g UR
                  R                  R                  SSS9 n[        S5        [        USS9 H  u  pVUR                  UR                  UR                  U5      nU(       a?  Xvl        [        SU S	UR                  S
 SUR                   SUR                   S3	5        Mr  [        SU S35        M     S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f! [          a  n[        SU 35         S nAg S nAf["         a  n[        SU S35         S nAg S nAff = f)Nzy   [!] MediaPipe/OpenCV nao encontrados. Instale 'mediapipe' e 'opencv-python' para habilitar o enquadramento automatico.zL   [!] Video ja e suficientemente estreito. Mantendo enquadramento original.r   r   )model_selectionmin_detection_confidencezK   -> Detectando cabecas com MediaPipe para centralizar o corte vertical...r9  z      Corte #z: rosto localizado (conf=z.2fz, amostras=r  z).zD: nenhum rosto consistente encontrado; usando enquadramento central.z#   [!] Face tracking desabilitado: z*   [!] Erro inesperado ao usar MediaPipe (z!); continuando sem face tracking.)r  r  rI   r  r  	solutionsface_detectionFaceDetectionr  r  r   r   r   r   r   r   r>   r&   )	r  r	  	mp_moduleanalyzerr  r  r!  r   r?   s	            r(   apply_face_trackingr    s   $&&9	
 	c+-	j)X))de *)
 $$33AA !C B cd&/
!&DNC#229??IMMS[\D)-+C50I$//Z]I^ _((,'8$,,rK
 +C50tu 'E	 *)
  *)*  ;3C59:: c:3%?`abbcse   E EE !$EBD1 E(E 1
D?	;E
EE E 
FE00F=FFcmdc                 0   [         R                  " U [         R                  [         R                  SS9nUR                  S:w  aS  [        R
                  R                  S5        [        R
                  R                  UR
                  5        [        S5      eg )NT)stdoutr  r   r   zFFmpeg erro:
zFFmpeg falhou)
subprocessrunPIPE
returncoder  r  r  r>   )r  procs     r(   
run_ffmpegr    sd    >>#joojooTXYD!

)*

%?++ r8   sub_pathc                     U R                  5       R                  5       nUR                  SS5      R                  SS5      R                  SS5      $ )NrV  rW  rG  z\:r  z\')rS  as_posixrl   )r  re  s     r(   escape_ffmpeg_sub_pathr    sF    !**,HD&)11#u=EEc5QQr8   r   modebg_input_labeltitle_sub_pathc           
      &   [        U 5      nUS;  a  [        SU 35      e/ nUS:X  ap  UR                  S5        U(       aF  UR                  SUR                   SUR                   SUR
                   SUR                   35        O#UR                  S5        OUR                  S5        S	S
R                  U5       S3/nSnSn	[        R                  5       (       a  S[        [        5       S3n	UR                  SU SU SU	 S35        SnS n
US:X  a   [        R                  5       (       a  [        n
O[        R                  5       (       a  [        n
U
S LnU(       a  UR                  SU S35        SnOUR                  SU S35        SnUS:w  a  UR                  SU S35        SnUS:X  a  UR                  SU S35        SnUR                  SU S35        SnUb  UR                  SU S[         S35        OV[        R                  5       (       a,  [        [        5      nUR                  SU S [         S35        OUR                  S!5        UR                  S"U S#35        S$nU(       a(  [        U5      nUR                  SU SU SU	 S%35        S&nU(       aL  U
(       aE  [        U
5      nUR                  SU S'[         S(35        UR                  SU S)[         S*35        S+nUR                  SU S,35        S-R                  U5      $ ).N>   r  fillz!Modo de exportacao desconhecido: r  zscale=-2:1920zcrop=rG  zcrop=1080:1920z4scale=1080:1920:force_original_aspect_ratio=decreasez[0:v]rH  z[video_base]
video_baser|   z:fontsdir='r  [z]subtitles='z[video_sub]	video_subr  z]format=rgba[video_rgba]
video_rgbaz]format=yuv420p[video_yuv]	video_yuvz ]setpts=PTS-STARTPTS[video_zero]
video_zeroz2]format=rgba,colorchannelmixer=aa=1[video_rgba_bg]video_rgba_bgz]scale=z,,format=rgba,colorchannelmixer=aa=1[bg_rgba]zmovie='z',scale=zLcolor=color=black:size=1080x1920,format=rgba,colorchannelmixer=aa=1[bg_rgba]z
[bg_rgba][zL]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2:shortest=1[video_with_bg]video_with_bgz[video_with_title]video_with_titlez',scale=-1:z,format=rgba[logo]z$][logo]overlay=(main_w-overlay_w)/2:z":eval=init:format=auto[video_logo]
video_logoz]format=yuv420p,setsar=1[outv];)r  r  rV   r   r   r   r   rW   	FONTS_DIRr2   LOGO_FIT_IMAGE_PATHLOGO_IMAGE_PATHBACKGROUND_TARGET_SIZEBACKGROUND_IMAGE_PATHLOGO_TARGET_HEIGHTLOGO_TOP_MARGIN)r  r   r  r  r  subtitle_sourcevideo_filtersfilter_graph_partscurrent_labelfonts_option	logo_path
needs_logo	bg_sourcetitle_sourcelogo_sources                  r(   build_filter_chainr6    s]    -X6O?"<TFCDD!Mv~_-  5Adkk]!DFF81TVVH!UV  !12ST',SXXm-D,E\%R$S ML$%;I%F$GqI
M?,&7qkR  M !%Iu},3355'					!	!#	$&J!!Am_4L"MN$!!Am_4N"OP##!!Am_4N"OP#u}!!>?	
 %!!PQ	
 (%%%N#7+A*BBno #))++./DEI%%)H-C,DDpq %%&tu!!'st	
 (-n=!!l<.,GYZ	
 +i,Y7!!k]+.@-AAST	
 	!!B?BSSuv	
 %-0NOP88&''r8   r  r   fit_title_marginc           	      r   UR                  SSS9  X S3-  nX S3-  nX S3-  nSnUn[        R                  5       (       a  U[        -  nU[        -  n[	        XUSS9  X S	3-  n	[
        [        -   [        -   n
U
[        -  n
[	        U UU
SU	S
S9nU(       d  U	R                  SS9  S n	[        X5        XEXi4$ )NT)r\  exist_okz.assz_fit.assz.srtr   r  )rz  rx  z_fit_title.assr  )rz  rv  rw  rx  r  )mkdirr'  r2   LOGO_TITLE_MARGIN_EXTRAr  r+  r*  TITLE_BELOW_LOGO_GAPFIT_TITLE_ADDITIONAL_OFFSETr  r  )r!  r  r   r7  ass_fill_pathass_fit_pathr  fill_margin
fit_marginfit_title_pathtitle_overlay_marginhas_title_fits               r(   prepare_highlight_subtitlesrE  H	  s     TD1;d!33M+X 66Lk..HK!J..--
	[abK~">>N*-??BVV77'+&M .	,@@r8   varianttitle_ass_pathc           
         U SU 3nX( S3-  n	US:X  a  [        USS 5      OS n
S nUS:X  a-  [        R                  5       (       a  SSS[        [        5      /nO/ nU(       a  S	n[	        UU
UUUS
9n[
        R                  R                  S5      nU(       a  [        SU SU 35        SSSUR                  S SUR                  S S[        U 5      /nU(       a  UR                  U5        SnUR                  / SPUPSPSPSPSPSPSPSPSPSPSPSPSPS PS!PS"PS#PS$PS%PS&P[        U5      PS'P[        U5      PS(PS)PS*PS+PS,PS-PS.PS/PS0PS1PS2PS3P[        U	5      P5        U(       a  [        S4S5R                  U5      5        [        S6U	R                   S7UR                  S8 S9U S:35        [        U5        U(       a(  UR                  5       (       a   UR!                  5         U	$ U	$ ! ["         a     U	$ f = f);Nr'  z_tiktok.mp4r  r   r  z-loopr   z-iz1:v)r  r  DEBUG_FILTER_GRAPHz[DEBUG] filter graph (r  r   z-yz-ss.3fz-toH   z-filter_complexz-mapz[outv]z0:a?z-c:vlibx264z-presetslowz
-profile:vhighz-levelz4.1z-b:v10Mz-maxrate12Mz-bufsize20Mz-gz-keyint_minz-pix_fmtyuv420pz	-movflagsz
+faststartz-c:aaacz-b:a192kz-ar44100z-ac2z[DEBUG] ffmpeg cmd:r   z-> Gerando  (.1fzs, modo=z)...)r  r)  r2   rO   r6  r.   r  r`   r  r   r   r  rW   r   r   r  r  r   )r  r!  r  r   rF  ry  r  rG  variant_base
final_pathcrop_to_usebg_labelbackground_argsfilter_graphdebug_filtersr  gop_sizes                    r(   export_highlight_variantra  l	  s3     ['+Lk::J6:fn')VT2$K"Hu}.5577"Cs3H/IJ%%L JJNN#78M&tfC~>???3
==
J	C 

?#HJJ &&& 	& 		&
 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&  	!&" 	#&$ 	%&& 	'&( 	)&* 	+&, 	H-&. 	/&0 	H1&2 	3&4 	5&6 	7&8 	9&: 	;&< 	=&> 	?&@ 	A&B 	C&D 	E&F 	G&H 	I&J 	JK& &N #SXXc]3	K
(9+=+=c*B(7)SW
XYsO.//11	!!# :  		s   G+ +
G98G9c                 B   [         R                  " [        5      n[        [	        U R
                  =(       d    S5      R                  5       5      n[        S5        [        5       nUR                  U R                  5      nUR                  [	        U5      SU R                  S9n[        U5      nU(       d  [        S5      e[        U5        [!        U 5      n[#        U SS5      =(       d    SR%                  5       nUS;  a  SnUS	;   n	US
;   n
U	(       d  U
(       d  ['        S5      e/ nU	(       a  UR)                  S5        U
(       a  UR)                  S5        [        SSR+                  U5       35        [,        (       a  [        S5        OJ[        S5        [/        Xg5      nUS:  a  [        SU S35        OU(       a  [        S5        O[        S5        [        S5        [1        SU R2                  5      n/ nU(       a  [        S5        [5        X`R6                  U R8                  X5      nU(       aC  [;        USS9 H4  u  nnUR<                  (       d  M  [        SU SUR<                   35        M6     O[        S5        O[        S5        [        S5        [1        US -  US -   5      n[?        X`R6                  U R8                  U5      nU(       d  [        S!5        / n SS"[@        [B           S#[B        S$[D        S%[F        4S& jjnU(       a-  [I        US' S(S)9 H  nU" UU5        [K        U5      U:  d  M    O   [K        U5      U:  a4  U(       a-  [I        US* S(S)9 H  nU" UU5        [K        U5      U:  d  M    O   [I        UU-   S+ S(S)9nU H  n[K        U5      U:  a    OU" UU5        M     [K        U5      U:  aQ  U[K        U5      -
  n[M        UU R6                  U R8                  UUS,9nU H  n[K        U5      U:  a    OU" UUS-S.9  M     [K        U5      U:  a)  U(       a"  U H  n[K        U5      U:  a    OU" UUS/S.9  M     U(       d  [        S05      e[O        UU5        [        S15        [Q        UU5        [S        U RT                  5      n[W        URX                  5      n[         R                  " [Z        5      R]                  S25      nU(       a  U S3U 3OUn/ n/ n[        S45        [;        USS9 GH  u  nn[        S5U S[_        UR`                  5       S6[_        URb                  5       S7URd                  S8 S9URf                  S: 3
5        URh                  S;:X  a  S<OURh                  S=:X  a  S>OURh                  n[        S?U 35        URj                  (       a  [        S@URj                   35        UR<                  (       a  [        SAUR<                   35        URm                  5       n [        SBU  35        [o        UUU5      n!S n"S n#Sn$S n%URj                  (       a  URj                  R                  5       OSn&U(       a  URp                  SC:X  a  [s        UU5      n'U'(       a  U'SD   n$UU! SE3-  n#U$ SFU'SG   R                  5        SH3n(U#Ru                  U(SISJ9  [        SKU#Rv                   35        UR)                  U#5        [y        UU5      n)U)(       a6  U)n%UU! SL3-  n"U"Ru                  U)SH-   SISJ9  [        SMU"Rv                   35        O#[        SN5        O[        SO5        O[        SP5        U%=(       d    U n*U&=(       d$    [{        [}        U*=(       d    SS [~         5      5      n+[        U*U+5      Ul5        URj                  =(       d    SR                  5       n,U,(       aD  SDU,0n-UU! SQ3-  n. U.Ru                  [        R                  " U-SRSS9SH-   SISJ9  UR)                  U.5        [        UUU!5      u  n0n1n2n3S n4S n5U	(       a   [        UUUU!SU0SUSV9n4UR)                  U45        U
(       a!  [        UUUU!SU1SU3SW9n5UR)                  U55        UR)                  [        S0 SXU_SYU!_SZUR`                  _S[URb                  _S\URd                  _S]URf                  _S^URh                  _SDURj                  _S_UR<                  _S`U _SaU4_SbU5_ScU0_SdU1_SeU2_SfU"_SgU#_ShU$_65        0 SYU!_SiU_SXU_Sj[	        UR                  5       5      _SkURv                  _Sl[	        UR                  5       5      _SZUR`                  _S[URb                  _S\URd                  _S]URf                  _S^URh                  _S_UR<                  _S`U _SDURj                  _SmUR                   V6s/ s H=  n6U6R`                  U6Rb                  U6R                  U6R                  U6R                  Sn.PM?     sn6_SoUR                  (       a  UR                  R                  UR                  R                  UR                  R                  UR                  R                  UR                  R                  UR                  R                  UR                  R                  Sp.OS _SqU4S LU5S LSr._Ss[        5       0En7UU! St3-  n8 U8Ru                  [        R                  " U7SRSuSv9SH-   SISJ9  UR)                  U85        GM     USxU Sy3-  n9 U9Ru                  URv                  SH-   SISJ9  UR)                  U95        URv                  [        5       S{.n:[        R                  " S|S5      R                  5       n;U;(       a  U;U:S}'   USxU S~3-  n< U<Ru                  [        R                  " U:SRSuSv9SISJ9  UR)                  U<5        [        S5        U H  n=[        SU= 35        M     [        S5        [         R                  " [        5      n>[        UUUUU>US9$ ! [         a  n/[        STU/ 35         S n/A/GN1S n/A/ff = fs  sn6f ! [         a  n/[        SwU/ 35         S n/A/GMV  S n/A/ff = f! [         a  n/[        SzU/ 35         S n/A/GNLS n/A/ff = f! [         a  n/[        SU/ 35         S n/A/NS n/A/ff = f)Nr|   z&1/5 Transcrevendo audio com Whisper...
transcribe)tasklanguagez$Nenhum trecho de fala foi detectado.rF  r  >   r  r  r  >   r  r  >   r  r  z4Nenhum formato de corte selecionado para exportacao.r  r  z"   -> Format(o/s) selecionado(s): rL   z92/5 Revisando ortografia com IA... (pulado - modo rapido)z"2/5 Revisando ortografia com IA...r   z   -> z trechos ajustados.z0   -> Nenhuma correcao adicional foi necessaria.z5   -> IA indisponivel; mantendo transcricao original.z!3/5 Selecionando cortes virais...r   z8   -> Consultando IA para sugerir os melhores trechos...r9  z
      IA #ro   z0      [!] Nenhum corte valido retornado pela IA.z/   -> IA desabilitada; usando heuristica local.z<   -> Avaliando heuristica local para cortes alternativos...   z2      [!] Heuristica nao encontrou cortes validos.targetr5   r1  r    c                 Z    U  H  n[        X1US9(       d  M    g   U R                  U5        g)Nr1  FT)r4  rV   )rg  r5   r1  rj  s       r(   append_unique#run_pipeline.<locals>.append_unique
  s/     H%hYOO  	i r8   c                     U R                   $ rN   rr  rs  s    r(   ru  run_pipeline.<locals>.<lambda>
  s    QWWr8   Trx  c                     U R                   $ rN   rr  rs  s    r(   ru  rm  
  s    AGGr8   c                     U R                   $ rN   rr  rs  s    r(   ru  rm  "
  s    qwwr8   )rg  rh  ri  rj  gffffff?ri  r  z-Nao foi possivel encontrar cortes candidatos.z'4/5 Ajustando enquadramento vertical...z%Y%m%d_%H%M%Sr'  z65/5 Criando cortes verticais com legendas dinamicas...z
   Corte #z ate rW  rX  z	s) score=rJ  rH  IAr>  
Heuristicaz   Origem: z   Titulo: z   Motivo: z   Preview: r  r   z_portal.txtz

rh  r  r   r   z    Materia para portal salva em z_caption.txtz   Legenda social salva em z=   [!] Nao foi possivel gerar legenda social para este corte.z>   [!] Nao foi possivel gerar materia para portal neste corte.zE   [!] Legenda social e materia para portal requerem provider GEMINI.z
_title.txtFr  z0   [!] Nao foi possivel salvar titulo em texto: r  )r   rF  ry  r  )r   rF  ry  r  rG  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  
input_namer  r   r  r   r  generated_formats)r  r  
updated_atz
_data.jsonr   )r  indentz2   [!] Nao foi possivel salvar metadata do corte: r&  z_source.txtz0   [!] Nao foi possivel registrar arquivo raiz: )
input_filegenerated_atCORTE_REQUEST_USERgenerated_byz
_meta.jsonz-   [!] Nao foi possivel registrar metadados: zFinalizado!z   [OK] zGOs arquivos .ass e .srt correspondentes foram salvos junto com o corte.)r  r  r  r  r  r	  r   rC   )Xr   r"   r   rZ   rO   rP  r  r  r@   
load_modelr  rc  langr  r>   r  r  r  r  r  rV   rW   r  r-  r   toprM  min_durationmax_durationr  r   rC  r   r   r   r=  r,  r   r  r<  r  r	   r  r   stemr$   strftimer:  r   r   r   r   r   r   r   r.  r  rk  r  r   re  r  r  r  r  r  r  r   rE  ra  r   rS  r   r   r   r   r   r   r   r   r   r   r   r   r)   r.   r/   r  )?rD  r  r  whisper_moduler  r	  r   rX  variant_optiongenerate_zoomgenerate_fitselected_formatsr#  desired_variationsai_highlightsr  r!  heuristic_limitheuristic_highlightsselected_highlightsrj  r5   combined_poolneededfallback_candidatesr  
input_slugtimestamp_tagr  generated_fileshighlight_resultsorigin_labelpreview_textr   caption_pathportal_article_pathportal_article_titler  original_titlearticle_infoarticle_textr   r4  r  
title_note
title_json
title_pathr?   r>  r?  r  ass_fit_title_path	zoom_pathfit_pathr   highlight_metadatametadata_pathsource_markermeta_payloadrequest_usermeta_markerrQ   r  s?                                                                  r(   run_pipeliner  	  s(   c"J#C

(8b$9$?$?$ABJ	
23*,N%%djj1Ec*oL499UFV$HABB)!$'IdIv6@&GGIN44"&66M!_4L\OPP'&	.tyy9I/J.K
LMyIJ23,XA	q=F9+%89:DEIJ	
-.Q).0MHI1''):):<N
  )-q A9###JqcI,<,<+=>? !B DE?@	
HI,q02Dq2HIO*85F5FHYHY[jkBC46 ]`'(5GTY	 3DdSI-y9&'+== T
 "449M 4:KUYZI-y9&'+== [
 =+??EV`deM"	"#'99)95 #
 "44#c*=&>>:%%%%(
 -I&'+==-yDI -
 "449M-I&'+==-yCH .
 JKK 3Y?	
34
$78doo&J%joo6JLL.77HM1;q-G"$O,.	
BC!"5Q?92fY__56eF9==<Q;R S""3'y0EG	
  )//47tYM]M]alMl\r{  sC  sCL>*+??K	012K	 0 0123 ((*\N+,%aG<	'+.2!&*4=OO..0++x729iHL'3G'<$&0i[3L&L#"6!7tL<S<Y<Y<[;\\^_#..|g.N89L9Q9Q8RST&&':;1)YG#*L#-9+\0J#JL ++GdNW+M78I8I7JKLYZVW YZ#3|' 
+@!3^m DE,
 3<P	oo+224
!:.J#:&>>JP%%djj%&PSW&Wbi%j&&z2 E`z9E
A|X/A %)	#'0#&I ""9-/#%1	H ""8,   #  oo MM	
 #++  oo !''  oo !'' % % # ' %   %!"  3#$ 2%	
,)
)
w)
 Q)
 #j0023	)

 *//)
 #j0023)
 Y__)
 9==)
 	**)
 Y__)
 i&&)
 i&&)
 |)
 Y__)
  %--	 .C !YY77HH#&??&)&8&8 .	)
2  ~~ ^^%%^^%%"--#..//'nn77'nn77$>>11 G)
H  !-t+"I)
P -/Q)
T #	{*%==	N$$

-E!LtS  %  ""=1 @F 6'+!>>MH  4!7' J}-
 !oo+-L 99126<<>L'3^$y
;;KEtzz,USTU`gh{+ 
-   	
ST,,s#K$ G  PHNOOPH	D  	NFseLMM	N  H@FGGH  E=cUCDDEsg   :7p"Ap*
38p/:.q :5q< 
p'p""p'/
q9qq
q9 q44q9<
rrrfieldsfilesc                 B   S[         R                  " 5       R                   3n[        R                  " 5       nU R                  5        H  u  pEUc  M
  UR                  SU S3R                  S5      5        UR                  SU S3R                  S5      5        UR                  UR                  S5      5        UR                  S5        M     U H  u  pgpUR                  SU S3R                  S5      5        UR                  SU SU S	3R                  S5      5        UR                  S
U S3R                  S5      5        UR                  U	5        UR                  S5        M     UR                  SU S3R                  S5      5        X#R                  5       4$ )Nz----CortesBoundaryz--z
r   z&Content-Disposition: form-data; name="z"

s   
z"; filename="z"
zContent-Type: z

z--
)	uuiduuid4hexioBytesIOr   r  r  getvalue)
r  r  boundarybufferr   r5  
field_namefilenamecontent_typerf   s
             r(   encode_multipart_formdatar    sm    $DJJL$4$4#56HZZ\F||~=r(4(//89=dV9MTTU\]^U\\'*+W & 5:0
lr(4(//894ZLhZW\]ddelm	
 	~l^8<CCGLMTW 5: LL2hZv&--g67__&&&r8   webhook_urlsummaryjob_inforequest_payloadc                    U (       d  g Uc  UR                  SS5      UR                  S5      UR                  S5      UR                  S5      UR                  S5      [        5       S.nUb  XES'   [        R                  " US	S
9R	                  S5      n[
        R                  R                  U USSS.S9n[
        R                  R                  XsS9  g UR                  SS5      UR                  S5      UR                  S5      UR                  [        UR                  5      [        UR                  5      [        UR                  5      [        UR                  5      [        UR                   5      S.	nUb  XHS'   UR#                  5        V	V
s0 s H  u  pU	S;  d  M  X_M     nn	n
U(       a  XS'   / n/ n/ n/ nUR                    GH  nUR%                  0 SUR&                  _SUR(                  _SUR*                  _SUR,                  _SUR.                  _SUR0                  _SUR2                  _SUR4                  _SUR6                  _SUR8                  _SUR:                  (       a  UR:                  R<                  OS _SUR>                  (       a  UR>                  R<                  OS _S UR@                  R<                  _S!URB                  R<                  _S"URD                  R<                  _S#URF                  (       a  URF                  R<                  OS _S$URH                  (       a  URH                  R<                  OS _S%URJ                  0E5        / nUR:                  (       a+  UR%                  S&UR&                  S' 3UR:                  45        UR>                  (       a+  UR%                  S(UR&                  S' 3UR>                  45        URM                  S)UR&                  S' 3UR@                  4S*UR&                  S' 3URB                  4S+UR&                  S' 3URD                  4/5        URF                  (       a+  UR%                  S,UR&                  S' 3URF                  45        URH                  (       a+  UR%                  S-UR&                  S' 3URH                  45        U H  u  nnURO                  5       (       d  UR%                  U[        U5      S..5        M:  URQ                  5       n[R        RT                  " UR<                  5      S/   =(       d    S0nUR%                  UUR<                  UU45        UR%                  UUR<                  [        U5      [        U5      S1.5        M     GM     XS2'   U(       a  XS3'   U(       a  XS4'   S5[        R                  " US	S
90n[W        UU5      u  nnS6U 3SS.n[
        R                  R                  U UUS9n[
        R                  R                  XsS9  g s  sn
n	f )7Nrw   failedjob_iderror	tracebacktrigger_source)rw   r  r  r  r  r  trigger_payloadFr  r   r  )r  Accept)rf   rg   r^   	completed)	rw   r  r  r  rP  r  r  r  highlight_count>   r  rw   r  r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  zoom_video_r(  
fit_video_	ass_fill_ass_fit_srt_caption_portal_)fieldrQ   r   zapplication/octet-stream)r  r  sizerQ   r	  attachmentsmissing_filesmetadatazmultipart/form-data; boundary=),r`   r)   r  r  r  r  rq   r  r  r  rO   r  r  r  r  r   r	  r   rV   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r2   
read_bytes	mimetypes
guess_typer  )r  r  r  r_   r  r  rf   r  r  kvextra_job_infohighlight_entriesr  attachments_infor  cutattachment_mapr  rQ   r  r  r  rk   rg   s                            r(   send_results_to_webhookr  +  s    ll8X6ll8,\\'*!k2&ll+;<.0#
 &)8%&zz'6==gFnn$$%7CUV % 

 	s4 ,,x5,,x(",,'78??W''(',,-)'*<*<=*7+>+>?w112
 H "&5"#'/~~'7k'7tq1Dj;jdad'7Nk-.057K-/*,M!!  S]]  sww	
 CLL  #**  #** 3;; S^^cnn11 3==S]]//d CLL-- 3;;++ sww||  s{{3;;++!" !S=O=O#"4"4"9"9UY#$  0 0%	
. 24>>!![3#@#.."QR==!!Z		##?"OPSYYsO,cll;CIIc?+S[[9		#'1	
 ;;!!Xcii_#=s{{"KL!!WSYYsO#<c>P>P"QR .J;;==$$z3t9%MN??$D$//		:1=[A[L
DII|TJK##$$))SYX[\`Xab !/S "h /\"2$1!$**XEBCF.v{CNHd8
C$G ..
 
 4
 
IC
NN30U ls   X!Xc                   ^ ^^ [        / 5      m[        T R                  5      nUT l        [        S[	        T R
                  5      5      T l        1 Skm " U UU4S jS[        5      nT R                  T R                  4n[        X25      n[        ST R                   ST R                   S35         UR                  5         UR                  5         g ! [         a    [        S5         N(f = f! UR                  5         f = f)	Nr   >   
serve_host
serve_portserve_webhookc                      > \ rS rSr Yr Y rSSSS.rS\S\SS	4S
 jr	SS jr
S\S\\\4   SS	4S jrSS jrSU U4S jjrSrg	).run_webhook_server.<locals>.CutsWebhookHandleri  *zPOST, OPTIONSr  )zAccess-Control-Allow-OriginzAccess-Control-Allow-MethodszAccess-Control-Allow-Headersr   rD  r    Nc                     g rN   rC   )r   r   rD  s      r(   log_message:run_webhook_server.<locals>.CutsWebhookHandler.log_message  s    r8   c                 l    U R                   R                  5        H  u  pU R                  X5        M     g rN   )cors_headersr   send_header)r   r   r5  s      r(   _set_cors_headers@run_webhook_server.<locals>.CutsWebhookHandler._set_cors_headers  s+    "//557
  , 8r8   rw   r  c                 P   [         R                  " USS9R                  S5      nU R                  U5        U R	                  5         U R                  SS5        U R                  S[        [        U5      5      5        U R                  5         U R                  R                  U5        g )NFr  r   r  zapplication/json; charset=utf-8Content-Length)r  r  r  send_responser  r  rO   r   end_headerswfiler  )r   rw   r  rk   s       r(   _respond_json<run_webhook_server.<locals>.CutsWebhookHandler._respond_json  s    ::gE:AA'JDv&""$^-NO-s3t9~>JJT"r8   c                 f    U R                  S5        U R                  5         U R                  5         g )N   )r  r  r  r   s    r(   
do_OPTIONS9run_webhook_server.<locals>.CutsWebhookHandler.do_OPTIONS  s(    s#""$r8   c           
        >^^^ U R                   R                  SS5      S   nUS;  a  U R                  SSS05        g [        U R                  R                  SS	5      =(       d    S5      nU(       a  U R                  R                  U5      OS
n0 nU(       aL   [        R                  " UR                  S5      =(       d    S5      n[        U[        5      (       a  UnOSU0n [        UR                  S5      =(       d    [        R                   " 5       5      m[#        U R$                  5       Vs0 s H-  of[&        R(                  " [+        U R$                  U5      5      _M/     nn[#        U R,                  5      R/                  5        H,  u  pUT;   a  M  X;   d  M  [&        R(                  " U	5      Xx'   M.     [0        R2                  " S0 UD6m0 n
UR/                  5        HR  u  pUR5                  SS5      n[7        TU5      (       a&  [+        TU5      n [9        X5      n[=        TX5        MN  XU'   MT     STl        [A        [+        TSS 5      5      Tl!        [        TRB                  [        5      (       a  TRB                  (       d  STl!        [E        S[        [+        TSTRF                  5      5      5      Tl#        [        U5      mU
(       a  U
TS'   S UUU4S jjn[H        RJ                  " UST 3SS9RM                  5         U R                  STSS.5        g ! [        R                   a    U R                  SSS05         g f = fs  snf ! [:         a    Un GN>f = f)!Nr  r   r   )r  /cortesz/triggeri  r  zEndpoint desconhecidor  0r8   r   z{}rf   rp   zJSON invalidor  r  r'  Fnotify_webhookr|   notify_timeoutunknown_fieldsc            	        > TSSS.n  [        T5      nSU S'   TR                  (       a?   [        TR                  UU TR                  TS9  [	        STR                   ST S	35        g g ! [
         a  n[	        S
T SU 35         S nAg S nAff = f! [
         a  nSU S'   [        U5      R                   SU 3U S'   [        R                  " 5       U S'   [        TSS5      (       aK   [        TR                  S U TR                  TS9  O(! [
         a  n[	        ST SU 35         S nAOS nAff = f[	        ST SU 35         S nAg S nAff = f)Nrunningwebhookr  rw   r  r  rw   r_   r  #[webhook] Resultados enviados para z (job )z,[webhook] Falha ao enviar resultados do job ro   r  r  r  r  r|   z)[webhook] Falha ao notificar erro do job z[webhook] Job r^  )r  r  r  r  r  r&   r  r   r  
format_excr  )job_contextr  r?   
notify_excjob_argsr  r  s       r(   
job_runnerJrun_webhook_server.<locals>.CutsWebhookHandler.do_POST.<locals>.job_runner  s   $'&//
 C*84G,7K)..b3 ( 7 7 ' +(0(?(?0? ""EhF]F]E^^dekdllm n /  ) b!$PQWPXXZ[^Z_"`aab  C,4K).23i.@.@-AC5+IK(/8/C/C/EK,x)92>>	f3 ( 7 7 $ +(0(?(?0?  ) f!$MfXUWXbWc"deefN6()C5ABBCse   !B =A* *
B4B
B 
BB 
EAE	)!D
E	
D0D+&E	+D00E		Ezcortes-job-T)rg  r   daemon   queued)r  rw   rC   r  )'rQ   r   r  r   rg   r`   rfilers   r  r  rt   r<  r   r  rO   r  r  varsdefault_argscopydeepcopyr  server_argsr   r  	Namespacerl   r  r>  r&   setattrr  rC  r  r   r  	threadingThreadr   )r   rQ   lengthraw_bodyr  r  r  	base_dictr   r5  overrides_unknownraw_key	raw_valueattrr6  coercedr  r  r  r  rD  copy_excludes                    @@@r(   do_POST6run_webhook_server.<locals>.CutsWebhookHandler.do_POST  s   99??3*1-D77""32I(JK))*:C@EAFF28tzzv.cH&(G!ZZ(@(HDIF!&$//"(#)6"2
 X.>$**,?FRVW[WhWhRijRiQDMM'$2C2CQ*GHHRiIj"4#3#34::<
,&#%)]]5%9IN	 =  ))6I6H02&-mmo"sC08T** '$ 7I,"-i"C Hd41:g. '6 &+H"&<WXO_ae=f&gH#(11377@W@W*,'&)!SCSUYUhUh1i-j&kH#"7mO 4E 01&C &CP J{6(5KTXY__asv$JK_ ++ &&sWo,FG k % ,"+,s1   AL  !L  34MM (M
MM#"M#rC   r  )r   r   r   r   r  r  r  rO   r   r  r  r   r   r  r  r  r   )rD  base_defaultsr  s   r(   CutsWebhookHandlerr    sq    $+.,;,:
	c 	# 	$ 		-	# 	#d38n 	# 	#	
_	L _	Lr8   r"  z#[webhook] Servidor ativo em http://rG  r  z!
[webhook] Encerrando servidor...)r  rC  r  r   r   r  r
   r  r  r   r  serve_foreverKeyboardInterruptserver_close)rD  resolved_notifyr"  addresshttpdr!  r  s   `    @@r(   run_webhook_serverr)    s    rNM,T-@-@AO)DaT%8%8!9:D@L}L }L3 }L~ 0G<E	//@$//ARRY
Z[ 	  4234 	s$   1C C*'C- )C**C- -C?c                    [        U 5      n[        UR                  5      nX!l        [        S[	        UR
                  5      5      Ul        UR                  (       a  [        U5        g S[        [           S[        R                  S[        SS 4S jnUR                  (       a  [        U5      nU(       d  [        S5        g S nU Hs  n[        R                  " S0 [!        U5      D6nSUl        [        U5      Ul        [        S	UR$                   S
35        ['        U5      nU" XWSUR(                   35        Mu     U$ ['        U5      nU" XS5        U$ )Nr   r  run_argsr  r    c                     U (       a  UR                   (       d  g USSS.n [        UR                   U UUR                  S S9  [        SUR                    35        g ! [         a  n[        SU 35         S nAg S nAff = f)Nr  clir  r   r  z&[webhook] Falha ao enviar resultados: )r  r  r  r  r&   )r  r+  r  r  r?   s        r(   notify_summarymain.<locals>.notify_summary?  s    h55$uU
	B#'' // $ 78O8O7PQR 	B:3%@AA	Bs   9A 
A=%A88A=z2Nenhum arquivo de video encontrado para processar.Fz
=== Processando z ===zcli-r-  rC   )r  rC  r  r   r   r  r  r)  r   r  r  r  rO   	batch_allrf  r  r  rP  r   r  r  )	r  rD  r&  r.  videosfinal_summaryr  
local_argsr  s	            r(   mainr4  5  s7   dD,T-@-@AO)aT%8%8!9:D4 B 9 BXEWEW Bad Bim B  ~~&t,FG37 J!++9d4j9J#(J ":J&z&7t<=(4M=Z__<M6NO ! 4 G7%(Nr8   __main__rN   r  )0   rz  )i.     )i  )i  )   )g      ^@)r2  rf  )r   )rN  )NN)r   )r   N)r  r  r  r  r.   r   r  ra  r  r  r  concurrent.futuresr   r   r  urllib.errorr  urllib.requestr  r  r  r   r   r   zoneinfor   r=   dataclassesr   pathlibr	   http.serverr
   r   typingr   r   r   r   r   r   r;   http.clientra   urllib.parser   r  
setdefaultr  r
  r   r  r&   __file__rS  rT  r1   r:   rB   rH   r   rO   rb   rc   r   rQ  r  r  r  r  r  rb  r  r3  r  r  rA  rU  add_typer$   r)   r7   r+   r@   rD   rI   rZ   re   bytesry   r  r  r_  r  rj  	with_namejoinpathr   r2   r`   pathsepr   r'  r&  r*  r+  r;  r<  r=  r  r  rq  rr  r/   r  r   r   r   r   r   r)  r(  r%  ANTON_FONT_PATHr   r   r   r   r   r  r  r   r.  r=  r4  r>  rC  r  rf  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r$  r-  r3  r{  rM  rS  rW  re  rk  ry  r  r  r  r  r  r  r  r  r  r  r+  r0  r7  r<  rC  r:  rT  rX  r]  ro  ru  r  r  r  r  r  r  r  r  r6  rE  ra  r  r  r  r)  r4  r   r  rC   r8   r(   <module>rK     sx     	  	 	   
   ?        "! "  C = =   ! 

  (' 2	szz=))

0szz=))

0
 >!!#**

	<> 4T[[8889 >   S> K I Q  
  ; ' 34 L HX.  #  	*D 	*  	
XC XD X  (C(C 

  #s(^	
  	. # "= ?   (^%%&YZccdij
3bjj@3z?RBJJv0  x.**:68n..{;       !  II&,3	3ryy)<cBCD S%		*:E BCDX00= $ N$$W-	11%3 %# %# %. . . .     J J J&   * # # #   	s 	 	S 	1S 1-? 1# 1RU 1 FIQQ0Q=BQ	Q	s 	s 	s 	(3- C ' 2 2 'tDz 'V,w,, , 	,
 )*, 

,^V#Xc] V#x'9'9 V#r/H.. /8H3E /h w  
$sCx.	<
d38n%

 
 	

 	
F $(04$$$ C=	$
 d38n-$ 	$V 1	*** 	*
 	*Z3 8C= > $(	%%% C=	%
 c]%($ 4=   4(7*; 4 4 	w  	
 
$tCH~
B_Xd38n-E _# _w(0c3h(@2(w()1();((V?E ?% ?% ? ?RW ?($8G, ($ ($ ($SXY^`del`mYmSn ($VWwWW W 	W
 W 

Wt(: 3 QT (: 3 RU  '9  h  S[\_S`  F.0!.0.0 d38n.0bc 3 3 tTWy .=
=
=
 "=
 SM	=

 =
 c]=
 	=
@=&8 =( =xX[} =@xS x5 xXVY] xv-S -S -& &0B &t &Rs s 4# s s (+ + +  c # S S :$	N	6 	6S 	6c 	6-? C <
H5G,H 
U]^fUg 
lp 
,*'hw/ *'% *'% *'X[ *'`dew`x *'Z+E +c +-% -C -NS NS N C C   !<4!44 
$sCx.4n S	 4 }
  &*}!}} }
 } d^} } 
}@;#5 ; ;$ ;,U4 U% E e  t
 t
n%cD %ch?Q6R %cW[ %cP,HSM ,d ,RT Rc R %)%)_(_(
:
_( _( SM	_(
 TN_( 	_(L  	!A!!A!A !A 	!A
 4tXd^+,!AX &*]]!] ] 	]
 ] ] ] TN] 
]@Dx)) Do DN
'cN'#'c3U.B(C#D'
3:'8 04u1u1o&u1 38nu1 	u1
 d38n-u1 
u1pOX// OD Od+x} +/!: +\ z!" Yb  H   		@  s7   a 0A"a a, aaa)(a),a87a8