
    qTjZ                        d Z ddlZddlZddlZddlZddlmZ  ee      j                  Z
ej                  j                  d ee
             ddlZddlZddlZddlZddlZddlZddlZej8                  j                  dz  Zedz  Zedz  Ze
dz  ZdZ g d	Z!ej8                  d
z  Z"djG                  g d      Z$djG                  ddg      Z%djG                  g d      Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d Z0e1dk(  rQ ejd                         Z3e3ji                  ddg d       e3jk                         Z6 e,e-e/e0de6jn                             yy)u  s40 — 배경(플레이트)부터 스틸 선정까지 전부 3롤+Gemini VLM (2026-07-13).

사용자 지시(s39 후속): "배경부터 샷 선택까지 전부 다시. 배경과 참조
이미지를 모두 넣고(단일 참조 아님) Gemini 가 VLM 으로 판단하게 하자."

- 모든 생성 단계 = nb2 3롤(A/B/C) → Gemini VLM 단독 판정(0-10, 동점=
  랭킹) → 선정본이 다음 단계의 참조.
- 실외 플레이트 8: master2(한국 생활감 마스터) 참조.
- 실내 플레이트 6: s37 FP+뿌리+직전 '선정본' 체이닝.
- 스틸 23: 참조 = 배경 플레이트(항상) + prev 선정본(v3 배경 동일성
  판정, 배경 전용 샷 제외) + 캐릭터·소품(인물 샷) — 모두 첨부.
- s39 계약 유지: bgonly(배경 전용 샷=플레이트만+NO PEOPLE), 캐릭터
  traits, PROP_ORIENTATION, 자세 정본, carried, EXPRESSION_REALISM.

사용: backend/.venv/bin/python s40_full_multiref.py --only
     <ext_plates|int_plates|stills|html>
    N)Paths40platesstillszs40_full_multiref.htmls40_full_v1)ABCzmaster2.png
)z@You are given an image-generation prompt, the labelled REFERENCEz?image(s) that were attached to it, and ONE photograph generatedz+from them (the current best pick of three).uB   List what is WRONG with it — ONLY violations of the prompt or ofz@its reference instructions: the shot's stated moment and action,z;who/what must or must NOT be in frame, camera, time of day,z<location consistency with the reference, pose/immobility andz=carried-state clauses, object orientation, anatomy, and everyz3exclusion (no text, no invented people or objects).z<Base every finding only on what is visible; ignore taste andz?generic aesthetics. For each issue give: issue_ko (short Koreanz>line) + fix_en (ONE imperative English edit that fixes exactlyz@that while changing nothing else). Empty array if nothing wrong.z>Edit this photograph. Apply ONLY the corrections listed below,z%each in place, changing nothing else:)uB   PRESERVE EVERYTHING ELSE EXACTLY as in the original photograph —zAevery person, pose, face, garment, object, set feature, lighting,z7camera and framing stay identical. No text, captions orzwatermarks anywhere.c                 @   | |   }|j                   |j                   dz  }|j                   |j                   d|d   j                          dz  }dd|z   dg}|j                  dg       D ]C  }	|j	                  dd	|	d
    d       |j	                  t        j                  |	d                E |j	                  ddd       |j	                  t        j                  |             t        j                  d| t        |t        j                  j                  d      }
|
d   }||d<   |s+t        j                  ||       d|d<   t        d| d       y"dj                  t         ddj                  d |D              z   t"        g      }|j                   |j                   dz  }t        j$                  d| |t        j                  j&                  |fgd|       t        j                  ||       d|d<   ||d<   t        d| d t)        |       d!       y")#u   선정본 critique(Gemini) → 결함 있으면 i2i 수정(그 이미지 단독
    참조) → _sel 을 수정본으로 교체(체인 앵커). 원본 후보 파일은 보존._sel.png_selected.pngtextzTHE PROMPT:
typer   refs   REFERENCE — labelpathzPhotograph to examine:	s40_crit_
gemini-promodelissuescritiqueTfix_skipped[s40] u"   : 결함 0 — 선정본 그대로z

zCORRECTIONS:
r   c              3   ,   K   | ]  }d |d      yw)z- fix_enN ).0is     U/Users/manta/Documents/Projects/TheRoad-I1/scratchpad/forest_exp/s40_full_multiref.py	<genexpr>z_critfix.<locals>.<genexpr>a   s      )4,2q"Qx[M"Fs   z_fix.pngs40_fix_16:9aspect_ratioout_pathF
fix_promptu	   : 결함 u"   건 → i2i 수정본이 선정본N)parentnamelowergetappendFpng_data_urlllmCRITIQUE40_SYSWTCRITIQUE_SCHEMAshutilcopyprintjoin
FIX40_HEAD
FIX40_TAILimg_nb2	FIX_LABELlen)rec_mapkeytagpromptstemrecsel_pathorigpartsrcritr   r,   fixeds                 r%   _critfixrN   I   s	    #,C{{		{(33H;;DII;aJ(=(=(?'@EEDo&>?@EWWVR f .qzl;= 	>Q^^AfI./ ! 
LL&*BCD	LL%&559SE"NE$$L:D(^FC
OD(#!Mse=>?[[tyy )4,2)4  4 4	" 

 844			HSE"JCCMM4() 	" 	E8$"M&Lse9S[M1STU    c                 j   dd|z   dg|z   }t        t        |      D ]A  \  }}|j                  dd| dd       |j                  t        j                  |             C dt        j
                  d|  ||t        j                  j                  d      i}t        j                  |      \  }	}
||	|
fS )	Nr   z<THE PROMPT (all three candidates were generated from this):
r   z
Candidate :r   
s40_judge_r   )zipCANDSr1   r2   r3   r4   r6   r7   JUDGE_SCHEMAN9_gemini_select)rD   
sys_promptrE   	ref_parts
cand_pathsrJ   labpjudgetotalsr   s              r%   _judge_geminir_   n   s    ')/01 24=>E eZ(Qf
3%q.ABCQ^^A&' ) 155:cU!3Z!"!1!1G HE((/FH&(""rO   c                     g }t         D ]n  }|j                  |j                   d|j                          dz  }t	        j
                  d|  d|j                          ||d|       |j                  |       p |S )Nr   r   s40_r(   r)   )rT   r-   r.   r/   r2   r?   r1   )rD   rE   r   out_stempathsr[   r\   s          r%   _roll3rd   {   sr    EOOqTBB			DQsyy{m,fd%	3Q	 
 LrO   c                 P   t        ||||      }g }|D ]@  \  }	}
|j                  dd|	 d       |j                  t        j                  |
             B t	        |||||      \  }}}|j
                  |j                   dz  }t        j                  |j
                  |j                   d|j                          dz  |       ||||d   d   |d   d	   |D cg c]  \  }}|t        |      d
 c}}d| |<   t        d| d| d|        t        | ||||       |S c c}}w )uN   3롤 → Gemini 판정 → 선정 복사(_sel). 레코드 저장은 호출부.r   r   r   r   r   r   r   verdictsranking)r   r   )rE   r^   r   rf   rg   r   r   z	: totals=z sel=)rd   r1   r2   r3   r_   r-   r.   r9   r:   r/   strr;   rN   )rB   rC   rD   rX   rE   r   rb   candsrY   rlabrpr]   r^   r   rH   lab_p_s                    r%   _selectrn      sI   3h/EIb&N4&2IJK+,  ,CV,5u>E68HMM?(!;;H
KK]]O1X^^%5$6d;<=EG F,'
3&y1BFG$hdB4R1$G	GCL 
F3%yhZ
89Wc31O	 Hs   D"c                 R    d| j                  |      xs i vrt        | ||||       yy)uG   재개: 선정 완료+critique 미실행이면 critique/fix 만 소급.r   TF)r0   rN   )rB   rC   rD   rE   rF   s        r%   _resumerp      s.    '++c*0b1#sFD1rO   c            
         t         j                         sJ dt                 t        j                         } t        dz  t
         dz  j                         rt        j                  t
              ni }|j                  di       }t        j                  dd       | d   j                         D ]  \  }}t        d| z  }t        d| d	z  j                         r@t        ||d
| |d   |      rt        j                  t
        |       nt        d| d       mt        ||d
| t         j"                  |d   t$        j&                  t         fg|       t        j                  t
        |        y )Nu   마스터 없음: plansz.json
ext_platesTparentsexist_okext_bgbg_r   extbg_bg_prompt_enz[ext_plates]  skip(exists))MASTERexistsL8_plan37HEREPLANr2   	load_plan
setdefaultOUTBmkdiritemsrp   	save_planr;   rn   PC	JUDGE_SYSr6   MASTER_REF_LABEL)p37planrG   rD   inforF   s         r%   stage_ext_platesr      s@   ==?9099?
**,C!%TF%.!@ H H J1;;t 	
//,
+CJJtdJ+]((*	TC5k!SX&&..0sC6#N+T3D$'cU-89SF3%.",,^$$$f-.	6 	
D$ +rO   c            
      T   t        j                         } t        j                  t              }|j                  di       }t        j                  dd       t        j                  t        j                  z  }d }d }t        | d         D ]  \  }}|d   }t        d| z  }	t        d| dz  }
|
j                         r@t        ||d| |d   |	      rt        j                  t        |       nt        d	| d
       nt        j                   |fg}|dkD  rG|j#                  t        j$                  |f       ||k7  r!|j#                  t        j&                  |f       t)        ||d| t*        j,                  |d   ||	       t        j                  t        |       |dk(  r|
}|
} y )N
int_platesTrt   rC   plate_r   intpl_	prompt_enz[int_plates] r{   r   )r~   r   r2   r   r   r   r   r   r6   OUTFP_FILE	enumerater}   rp   r   r;   FP_REF_LABELr1   ROOT_REF_LABELPREV_REF_LABELrn   rV   JUDGE_SYSTEM)r   r   rG   fp	root_path	prev_pathr$   rm   rC   rF   selr   s               r%   stage_int_platesr      so   
**,C;;tD
//,
+CJJtdJ+	
	BII3|,-2isen$vcU(++::<sC6#K$GD$'cU-89^^R()D1uQ--y9:	)KK!1!19 =>Csenboo{OT41KKd#6I	) .rO   c                     |t         j                  k7  rt        d|  dz  S |d   D ]  }| |d   v st        d|d    dz  c S  t        d|        )Nrx   r   r   coversr   rC   u   실내 플레이트 미배정: )r6   	INT_GROUPr   
SystemExit)rD   gkeyr   rm   s       r%   _plate40r      sj    q{{C5))),"X,F2e9+X666   6se<
==rO   c                  	   t        j                         } t        j                         }t        j                  |      }|d   D ci c]  }|d   |
 }}t        j
                  D ci c]  }||   d   D ]  }||  }}}|j                  | d   D ci c]  }|t        j                   c}       t        j                  t         j                        d   }t        j                  t        j                        d   }	t        j                         }
t        j                         }t        j                         }i }|j!                         D ]1  \  \  }}}|j#                  |t%                     j                  |       3 t        j                  t              }|j#                  di       }t&        j)                  dd	       t        j*                  |       D ]  }t&        |z  }t&        | d
z  j-                         rT|j/                  |      r3t1        ||d| ||   d   |      rt        j2                  t        |       nt5        d| d       {||   }t7        |||       }|j-                         s
J d|        |	|   d    }|j/                  |      xs i }|rd n|j/                  d      }|j/                  dd      }d }t        j8                  |fg}|rGt&        | d
z  j-                         r-|}|j;                  t        j<                  t&        | d
z  f       |s|j/                  t?        j@                  |      g       }|s9tC        |j/                  t?        j@                  |      d   t%                           }|D ]l  }||
v r1|
|   \  }} | j-                         s |j;                  d| d| f       8||v s=||   \  }} | j-                         sV|j;                  d| d| f       n t        jD                  ||| |||||      }!tG        ||d| t        jH                  |!||       ||   j                  ||||r|nd|rdn|rdndd       t        j2                  t        |        y c c}w c c}}w c c}w )NgroupsrC   shotsint_tagsprev2bgonlyr   Trt   r   still_rE   z	[stills] r{   u   플레이트 없음: person_visibleprevusage_en r   u   CHARACTER REFERENCE — zN: the exact person appearing in this shot; match face, hair and build exactly.u   PROP REFERENCE — zU: the exact object appearing in this shot; match its look, material and wear exactly.)bg_onlyu   플레이트만 (배경 전용)u   플레이트+prev+엔티티u   플레이트+엔티티)r   	prev_usedr   
prev_usageref_mode)%r~   r   r6   _s35	_movement
EXT_GROUPSupdater   r2   r   r   rV   S
_char_refs
_prop_refs_ve_idsr   r   setOUTSr   _all_tags_story_orderr}   r0   rp   r   r;   r   PLATE_STILL_LABELr1   PREV_STILL_LABELR_keysorted_build_promptrn   r   )"r   plan35mvggmapgkttag2gr   r   charspropsvescene_unionsi_shiidsr   rG   rD   rF   r   plater   pjprev_tagr   r   r   ve_idscidr.   r\   rE   s"                                     r%   stage_stillsr      s   
**,CVVXF	
V	B!'!12!1AAeHaK!1D2\\E\r48G3DaQU3DQ\EE	LL#j/:/Q!Q[[./:;KK )E[[!(+FLLNELLNE	
BK88:
TCr35)005 &;;tD
//(B
'CJJtdJ+'',czcU(##++-wws|SF3%.(+C(:D!BD$'	#m45SzdC(||~>!6ug>>~Sk"233YYs^!r"4vVVJ+
	$$e,-8*H 55==? IKK++8*H 557 8VVAFF3K,FsA FG%<#CjGD!xxz6tf =7 789%; < E\#CjGD!xxz1$ 8: :;<%> ?  !!#tS"d"+ZJSF3%."//6d	CyW(1*r>E:?H;6
 	 	
D$k - 3E:s   Q7'Q<Rc                  R   t        j                         } t        j                         }t	        j
                  t              }|d   D ci c]  }|d   |
 }}t        dz  j                  dd       d fdfd}fd	}fd
}d}|j                  d      xs i j                         D ]n  \  }	}
|d|	 ddj                  |
d          d ||
d|	        d ||
d|	        dt        |
j                  dg              d ||
       d |
d          dz  }p |j                  d      xs i j                         D ]t  \  }}
|d |       ddj                  |
d          d ||
d|        d ||
d|        dt        |
j                  dg              d ||
       d |
d          dz  }v t        j                  D cg c]  }||   d   D ]  }||f  c}}| d   D cg c]  }t        j                  |f c}z   }|j                  di       g dd }}}|D ]Y  \  }}	||k7  r<||j                  |dz          d  ||   d!          d"| d# ||   d$          d}|}j                  |	      }
|
s
|d%|	 d&z  }ed' |
d(          |
j                  d)      rd* |
d)          d+ndz   d,z   }|
j                  d-      rd. |
d-          dnd}|d%|	 d/| ddj                  |
d          d0| d1 t         j"                  t!        j$                  |	         d2          d3 ||
d4|	        d ||
d4|	        dt        |
j                  dg              d ||
       d5 |
d          dz  }\ ||j                  |dz          dj                  fd6|D              }t&        j)                  d7t               d8| d9t        j*                   d:| d;dj                  |       d<       t-        d=t&                y c c}w c c}}w c c}w )>Nr   rC   r   Trt   c                 F    t        j                  t        | xs d            S )Nr   )_htmlescaperh   )r   s    r%   esczstage_html.<locals>.esc4  s    ||CRL))rO   c                 ,   t        |       }t        |      j                  t        t                    rt        |j	                  t                    S |j
                  z  }|j                         st        j                  ||       d|j
                   S )Nzout/s40/refs/)	r   rh   
startswithr   relative_tor.   r}   r9   r:   )path_ssrcdstREFDs      r%   _relzstage_html.<locals>._rel7  sk    6ls8s4y)st,--SXXozz|KKS!sxxj))rO   c                 j   | d   D ci c]  }|d   |
 }}d}t         D ]  }| d   |k(  }|j                  |i       }|d|rdnd d| d|j                          d	| d|j                          d
|rdndz   d| d|j                  dd       d |j                  dd             dz   z  } |S c c}w )Nrf   r   r   r   z<figure class=candz selz
><a href='r   .png' target=_blank><img src='z.png' loading=lazy></a>u$   <div class=selbadge>★ 선정</div>z<figcaption><b>u    — Gemini score?u   점</b><br>
verdict_koz</figcaption></figure>)rT   r0   r/   )rec_itembase_relvvdrowr[   r   r   s          r%   	_cand_rowzstage_html.<locals>._cand_row@  s   %-j%9:%9aj!m%9:C:&#-CsBA$sV$; <$:Qsyy{m 4%Ja		} 5 >A9b	J
 $C5 )EE'3'(quu\2./00FHHIC  
 ;s   B0c                     d| vry| j                  d      rydj                  fd| d   D              }| d   j                         }dt        | d          d| d	| d
| d| d
| d| d    d| d| dS )Nr   r   r   uS   <div class=note>✔ Gemini 결함 검사: 0건 — 선정본 그대로 사용</div>c              3   T   K   | ]  }d  |d          d |d          d ! yw)z<li>issue_kou    <span class=k>→ r!   z</span></li>Nr"   )r#   r$   r   s     r%   r&   z1stage_html.<locals>._fix_block.<locals>.<genexpr>W  sC      H8F1 3q}%& 'AhK !/8Fs   %(r   u"   <div class=note>⚠ Gemini 결함 uP   건 → nb2 i2i 수정본이 최종 선정본(체인 앵커)</div><ul class=iss>z/</ul><div class=row><figure class=cmp><a href='r   r   u=   .png' loading=lazy></a><figcaption>수정 전 (선정 원본 z8)</figcaption></figure><figure class=cmp fixed><a href='z"_fix.png' target=_blank><img src='ub   _fix.png' loading=lazy></a><figcaption><b>수정 후 (i2i, 최종)</b></figcaption></figure></div>)r0   r<   r/   rA   )itr   r   r   r   s       r%   
_fix_blockzstage_html.<locals>._fix_blockQ  s    R66- . H8::H H n""$0R
^1D0E F#H %**21SE :((0z3% 8:  008z :((0z 2+,	-rO   c                 Z    dj                  fd| j                  dg       D              S )Nr   c              3      K   | ]m  }d  |d          d |d          d |d   j                  d      d   j                         dd        d	 t        |d         j                         d
	 o yw)z<figure class=pn><a href='r   z' target=_blank><img src='z' loading=lazy></a><figcaption>r   rQ   r   NF   z<br><span class=k>z</span></figcaption></figure>)splitstripr   r.   )r#   rK   r   r   s     r%   r&   z0stage_html.<locals>._refs_row.<locals>.<genexpr>j  s      I 0H! )ai(9 :((,QvY'8 9qz//4Q7==?DEF T!F)_%9%9!: ; <%	&
 0Hs   A3A6r   )r<   r0   )r   r   r   s    r%   	_refs_rowzstage_html.<locals>._refs_rowi  s2    ww I 08||FB/GI I 	IrO   r   rs   u   <div class=shot><h3>실외 bg_u   <span class=k> — 랭킹 >rg   z</span></h3><div class=row>zout/s40/plates/bg_z</div>u7   <div class=row><div class=refs><div class=note>참조 (u   장)</div><div class=refrow>u?   </div></div></div><details><summary>프롬프트</summary><pre>rE   z</pre></details></div>r   u!   <div class=shot><h3>실내 plate_zout/s40/plates/plate_r   r   r   z
</section>z<section><h2>name_koz <span class=k>(z,)</span></h2><div class=note>LOCATION lock: place_enz<div class=shot><h3>u*   </h3><div class=note>미생성</div></div>z<span class=on>r   r   z (prev=)z</span>r   u$   <div class=note>prev 사용 지시:  z</span></h3>z<div class=note>descz</div><div class=row>zout/s40/stills/uF   </div></div></div><details><summary>프롬프트 전문</summary><pre>c              3      K   | ]8  \  }}|v r/d | d| d| d |   d          d|   d   |   d       d : yw)	z)<figure class=ov><a href='out/s40/stills/z1_sel.png' target=_blank><img src='out/s40/stills/z'_sel.png' loading=lazy></a><figcaption>u    — r   z	 (Gemini r^   u   점)</figcaption></figure>Nr"   )r#   _gkr   r   r   s      r%   r&   zstage_html.<locals>.<genexpr>  s      , FCqF{##$# &$$%3 'cs6!9Z#89:
F1Ih'q	*(=>? @!		" s   >Au  <!DOCTYPE html>
<html lang=ko><head><meta charset=utf-8>
<meta name=viewport content="width=device-width, initial-scale=1">
<title>s40 — 배경부터 스틸까지 전부 3롤+Gemini 선정</title>
<style>
body { margin:0; padding:24px; background:#0f1216; color:#e6e6e6;
       font:14px/1.6 -apple-system,'Apple SD Gothic Neo',sans-serif; }
h1 { font-size:20px; } h2 { font-size:17px; margin:34px 0 8px;
     border-bottom:1px solid #333; padding-bottom:5px; }
h3 { font-size:15px; margin:6px 0; }
.k { color:#8a939e; font-size:13px; font-weight:400; }
.row { display:flex; gap:14px; align-items:flex-start; margin:10px 0;
        flex-wrap:wrap; }
figure { margin:0; } figcaption { color:#c9d2dc; font-size:12px; }
img { width:100%; border-radius:8px; border:1px solid #2a2f36; }
figure.cand { max-width:430px; position:relative; }
figure.cand.sel img { border:4px solid #7ee2a8;
  box-shadow:0 0 14px rgba(126,226,168,.45); }
.selbadge { position:absolute; top:8px; left:8px; background:#1e3a2a;
  color:#7ee2a8; border:1px solid #7ee2a8; border-radius:6px;
  padding:2px 10px; font-size:13px; font-weight:700; }
figure.ov { max-width:300px; } figure.ov img { max-width:300px;
  border:3px solid #7ee2a8; }
figure.ov figcaption { font-size:11.5px; }
figure.cmp { max-width:430px; }
figure.cmp[fixed] img { border:3px solid #9ecbff; }
ul.iss { margin:4px 0 8px 18px; color:#c9d2dc; font-size:13px; }
.note { color:#8a939e; }
.box { background:#161b22; border:1px solid #2a2f36; border-radius:8px;
       padding:12px 16px; margin:12px 0; }
.shot { border-top:1px dashed #2a2f36; padding:12px 0; }
.on { background:#1e3a2a; color:#7ee2a8; border-radius:5px;
      padding:1px 8px; font-size:12px; margin-left:6px; }
.refs { max-width:820px; }
.refrow { display:flex; gap:8px; flex-wrap:wrap; }
figure.pn { max-width:150px; } figure.pn figcaption { font-size:11px;
  max-width:150px; }
details { margin:6px 0; } summary { color:#9ecbff; cursor:pointer; }
pre { background:#161b22; border:1px solid #2a2f36; padding:10px;
      white-space:pre-wrap; font-size:12px; }
</style></head><body>
<h1>s40 — 배경(플레이트)부터 스틸 선정까지 전부 3롤 + Gemini VLM
단독 판정</h1>
<div class=box>사용자 확정 규칙: ①모든 생성 단계=<b>nb2 3롤(A/B/C) →
Gemini VLM 판정 → 선정</b>(선정본이 다음 단계 참조) ②실외 플레이트
8장=마스터 v2 참조 / 실내 플레이트 6장=FP+뿌리+직전 선정본 체이닝
③스틸 23샷 참조=<b>배경 플레이트(항상)+prev 선정본(배경 동일성 v3
판정)+캐릭터·소품(인물 샷) 모두 첨부</b>(단일 참조 아님) ④배경 전용
샷=플레이트만+NO PEOPLE ⑤<b>선정본 결함 수정 패스</b>: Gemini 가
선정본의 프롬프트 위반을 검출 → 결함 있으면 수정 프롬프트 저작 →
nb2 i2i(그 이미지 단독 참조) 수정본이 최종 선정본(체인 앵커),
수정 전/후 비교 표시. 텍스트 안전망(자세 정본·carried·
EXPRESSION_REALISM·PROP_ORIENTATION·캐릭터 traits) 유지.
이전 판: <a href='s39_threeroll_vlm.html'
style='color:#9ecbff'>s39</a> ·
<a href='s38_lightconti_full.html' style='color:#9ecbff'>s38</a></div>
<section><h2>★ 스틸 선정본 모아보기 (u   샷)</h2>
<div class=row>u   </div></section>
<section><h2>플레이트 — 실외 8(마스터 v2) + 실내 6(FP 체이닝)</h2>
<div class=note>마스터=<a href='out/s38/master2.png' target=_blank
style='color:#9ecbff'>master2.png</a> · FP=<a
href='out/s37/z:' target=_blank
style='color:#9ecbff'>floorplan</a></div>
z</section>
z
</body></html>z[html] )r~   r   r6   r   r2   r   r   r   r   r0   r   r<   rA   r   r   r1   r   SHOTr   PAGE
write_textr   r;   )r   r   r   r   r   r   r   r   plates_htmlrD   r   rC   r   r   ordersecsbodycurr   badge
usage_htmloverviewr   r   r   r   s                         @@@@r%   
stage_htmlr  ,  s3   
**,CVVXF;;tD!'!12!1AAeHaK!1D2<DJJtdJ+**"-0I KHH\*0b779R,SE("Y-)@(A B'.@,FGHZ&8$>?@RVVFB'() *!!*2 08%&&<>		? : HH\*0b779R/Cz("Y-)@(A B4SE:;<F" 5cU;<=RVVFB'() *!!*2 08%&&<	>
	? :  !|| )|2hw' !W' | )%(_
5_AKK_
56E XXh#F"d$D	c3;D</0#CT
9(=$>#?&tf -DJz234F<D CZZ_+C5 1= > ?D"3r*~#6"78vvk* c"[/2315024  -b./0835 	 	"3%q("Y-)@(A B<s166!&&+#6v#>?@ A'ocU,CDEZocU$;<=RVVFB'() *!!*2 08%&&<
>	?+ B D<'(ww , , ,H 	OO 81p 25V >z  yyk   AA AD 
GD6
] 3v)
5s   PP5P$__main__z--onlyT)rs   r   r   html)requiredchoices)8__doc__argparser  r   r9   syspathlibr   __file__r-   r   r   insertrh   
forest_libr2   s35_fullrunr   s37_rooftop_rebuildr6   s34_stillrunr   s38_lightconti_fullr~   s39_threeroll_vlmrV   x_plate_chainr   r   r   r   r  r   rT   r|   r<   r5   r=   r>   rN   r_   rd   rn   rp   r   r   r   r   r  __name__ArgumentParserapadd_argument
parse_argsaonlyr"   rO   r%   <module>r)     s  "    
 H~ 3t9         eellU
X~
X~&&	-	
    YYD+ 
 YY  
"VJ
#. ,>>G TRj z	 	 	 	"BOOHtJ  L
A9#3CZ1129 ; rO   