
    lj                       d Z ddlmZ ddlmZ ddlmZ ddlZddlZddl	Z	ddl
mZmZ ddlmZ dZd	d
ddZdZ G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z ed           G d d                      Z ed           G d  d!                      Z ed           G d" d#                      Z ed           G d$ d%                      Z ed           G d& d'                      Zd(Zd)Zd*Z dZd/Z!d[d2Z"d\d4Z#d]d7Z$d^d9Z%d_d;Z&d`d=Z'dad?Z(dd@dbdDZ) ed           G dE dF                      Z* ed           G dG dH                      Z+ ed           G dI dJ                      Z,d^dKZ-dcdLZ.dddNZ/dedOZ0dfdgdSZ1dhdUZ2didjdYZ3dS )ka  Strategic Spine V2 models for TrueTraceShorts.

Side-effect-free editorial spine: typed candidate artifacts, hard gates,
calibrated 100-point scoring, deterministic ReviewPackageV2, and small demo
fixtures. No rendering, platform APIs, Telegram sends, or file writes live here.
    )annotations)	dataclass)StrEnumN)AnyMapping)ValidationResultyoutube_shortstiktokinstagram_reelslinkedin_manualr
   r   r   )youtube	instagramr   )ai_output_autopsyworkflow_teardowndigital_red_flagsdecision_designc                  .    e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
AudienceNeedboredomurgencyfear
competenceclaritystatussafety	curiosityN)__name__
__module____qualname__BOREDOMURGENCYFEAR
COMPETENCECLARITYSTATUSSAFETY	CURIOSITY     V/home/agent/jarvis_runtime/autoshortsbot/AutoShortsBot/autoshorts/strategy/spine_v2.pyr   r      s6        GGDJGFFIIIr*   r   c                  B    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdS )ViewerEmotionconfusedannoyedoverwhelmed	skepticalcuriousembarrassedanxiousrelievedsmarter
in_controlwarned	motivatedequippedN)r   r   r    CONFUSEDANNOYEDOVERWHELMED	SKEPTICALCURIOUSEMBARRASSEDANXIOUSRELIEVEDSMARTER
IN_CONTROLWARNED	MOTIVATEDEQUIPPEDr)   r*   r+   r-   r-   #   sO        HGKIGKGHGJFIHHHr*   r-   c                      e Zd ZdZdZdZdS )SaturationRisklowmediumhighNr   r   r    LOWMEDIUMHIGHr)   r*   r+   rI   rI   3           
CFDDDr*   rI   c                  *    e Zd ZdZdZdZdZdZdZdZ	dS )	HumanTexturenonereal_example	mini_casetested_promptscreen_recordingpersonal_observationsource_based_claimN)
r   r   r    NONEREAL_EXAMPLE	MINI_CASETESTED_PROMPTSCREEN_RECORDINGPERSONAL_OBSERVATIONSOURCE_BASED_CLAIMr)   r*   r+   rS   rS   9   s6        D!LI#M)1-r*   rS   c                      e Zd ZdZdZdZdS )	ClaimRiskrJ   rK   rL   NrM   r)   r*   r+   rc   rc   C   rQ   r*   rc   c                      e Zd ZdZdZdZdS )AIDisclosureDecisionyesnounclearN)r   r   r    YESNOUNCLEARr)   r*   r+   re   re   I   s        
C	BGGGr*   re   c                      e Zd ZdZdZdS )RenderBackendCandidatepython_motionremotion_spike_candidateN)r   r   r    PYTHON_MOTIONREMOTION_SPIKE_CANDIDATEr)   r*   r+   rm   rm   O   s        #M9r*   rm   T)frozenc                  D    e Zd ZU ded<   ded<   ddZedd
            ZdS )ExperimentHypothesisstr	statementexpected_winning_metricreturndict[str, str]c                     | j         | j        dS Nrv   rw   r|   selfs    r+   to_dictzExperimentHypothesis.to_dictY   s    !^Hdeeer*   dataMapping[str, Any]'ExperimentHypothesis'c                h     | t          |d                   t          |d                             S )Nrv   rw   r|   )ru   )clsr   s     r+   	from_dictzExperimentHypothesis.from_dict\   s3    sSk!233SQUVoQpMqMqrrrrr*   Nrx   ry   )r   r   rx   r   )r   r   r    __annotations__r   classmethodr   r)   r*   r+   rt   rt   T   si         NNN    f f f f s s s [s s sr*   rt   c                      e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   d	ed
<   d	ed<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   dS )ContentBriefV2ru   brief_id	series_idtopicr   audience_needjob_to_be_doneviewer_identityr-   emotion_beforeemotion_afteraudience_problempayoffsearch_intent_phraserI   saturation_riskrS   human_texturerc   
claim_riskre   ai_disclosure_requiredrt   experiment_hypothesistuple[str, ...]	platformsinttarget_duration_secondsNr   r   r    r   r)   r*   r+   r   r   a   s         MMMNNNJJJ!!!!    KKK####0000////      r*   r   c                  B    e Zd ZU ded<   ded<   ded<   ded<   ded<   dS )	SeriesDefinitionru   r   namepromiser   allowed_topic_clustersdefault_hook_patternNr   r)   r*   r+   r   r   w   sE         NNNIIILLL++++r*   r   c                  B    e Zd ZU ded<   edd            Zdd	ZddZdS )SeriesRegistryztuple[SeriesDefinition, ...]seriesrx   'SeriesRegistry'c                    | t          ddddd          t          dddd	d
          t          ddddd          t          ddddd          t          ddddd          t          ddddd          t          dd d!d"d#          f$          S )%Nr   zAI Output Autopsyz,Bad AI output -> hidden failure -> one rule.)aiworkflowdecisionz0This AI answer sounds right. That's the problem.r   zDigital Red Flagsz4Normal-looking digital moment -> one warning signal.)scamsecuritydigital_safetyz+This looks safe. The trap is in line three.r   zDecision Designz1Turn vague tool questions into decision evidence.)r   worklifer   z:Don't ask what to do. Ask what would change your decision.r   zWorkflow Teardownz9Broken workflow -> missing boundary/owner/exception path.)r   
automationr   z9Your workflow didn't fail. You forgot the exception path.attention_trapszAttention TrapszAEveryday digital behavior -> attention mechanism -> control rule.)	attentionproductivitydigital_habits7You didn't lose focus. The app moved your next thought.search_smarterzSearch Smarterz0Platform search mistake -> better intent phrase.)search	algorithmliteracyz4TikTok search is not Google. Stop typing like it is.worklife_systemszWorklife Systemsz'Worklife friction -> small system rule.)meetingsemailcalendartodosz4Your to-do list is not a plan. It's a guilt archive.)r   )r   )r   s    r+   defaultzSeriesRegistry.default   s6   s !46IKy  |Z  \N  O  O !46I  LB  Dj  lY  Z  Z !24EGz  }[  ]Y  Z  Z !46I  LG  Io  ql  m  m !24E  HK  M|  ~w  x  x !13CEw  z]  _U  V  V !35GIr  u_  aW  X  X

 

 

 
	
r*   r   ru   r   c                R    | j         D ]}|j        |k    r|c S t          |          N)r   r   KeyError)r~   r   r   s      r+   getzSeriesRegistry.get   s=    k 	 	F9,, -y!!!r*   r   c                    t                    s0t          fd| j        D                       rt          d          S t          dd f          S )Nc              3  .   K   | ]}|j         k    V  d S r   )r   ).0r   r   s     r+   	<genexpr>z4SeriesRegistry.validate_series_id.<locals>.<genexpr>   s+      +d+dfF,<	,I+d+d+d+d+d+dr*   T)is_validFzunknown series_id: r   errors)	_is_blankanyr   r   )r~   r   s    `r+   validate_series_idz!SeriesRegistry.validate_series_id   sk    ## 	3+d+d+d+dX\Xc+d+d+d(d(d 	3#T22228Yi8Y8Y7[\\\\r*   N)rx   r   )r   ru   rx   r   )r   ru   rx   r   )r   r   r    r   r   r   r   r   r)   r*   r+   r   r      sn         ((((
 
 
 [
" " " "] ] ] ] ] ]r*   r   c                     e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   d
ed<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   d ed!<   d"ed#<   d$ed%<   d&ed'<   ded(<   d)ed*<   ded+<   ded,<   d-Zded.<   d-Zded/<   d-Zded0<   d-Zded1<   d-Zded2<   d-Z	ded3<   e
j        Zd4ed5<   d6Zd7ed8<   d6S )9VideoCandidateV2ru   candidate_idversiontitler   r   r   r   duration_secondsr   r   r   r   r-   r   r   hookfirst_framevisible_fail	mechanismfixbefore_aftertakeawaysave_reasonshare_reasonfollow_reasonr   rI   r   rS   r   rc   r   tuple[Any, ...]claimsre   r   rt   r   rw   ry   platform_fitrisksvisual_structure anti_exampleplausible_nonsense_exampleconcrete_scenehuman_texture_notelinkedin_titlelinkedin_captionzRenderBackendCandidate | strrender_backend_candidateN
str | None
media_hash)r   r   r    r   r   r   r   r   r   r   rm   rp   r   r   r)   r*   r+   r   r      s        LLLJJJNNN!!!!    IIINNNHHHMMM####0000////        L&(((((N     N=S=aaaaa!J!!!!!!r*   r   )z\btop\s*5\s+ai\s+tools\bz\bmake\s+money\s+with\s+ai\bz2\bthis\s+ai\s+tool\s+will\s+change\s+your\s+life\bz0\bnobody\s+(talks|is\s+talking)\s+about\s+this\bz'\bunlock\s+your\s+(full\s+)?potential\bz\byou\s+won'?t\s+believe\bz\bbest\s+ai\s+tools\b)zpure slideshowztext cards onlyzonly text cardszgeneric ai backgroundzb-roll plus captions)zsplit-screenzvs.z vs stampstampedwarningzred flagtrapuselessbrokenbreaksfailsconflictpulledvaluer   rx   boolc                0    | pd                                  S )Nr   )stripr   s    r+   r   r      s    ""$$$$r*   objectru   c                X    t          | t                    r| j        nt          |           S r   )
isinstancer   r   ru   r   s    r+   _enum_valuer     s#    $UG44D5;;#e**Dr*   platformc                8    t                               | |           S r   )LEGACY_PLATFORM_MAPr   )r  s    r+   _platform_idr     s    ""8X666r*   claimr   c                >    t          t          | d|                     S )Ntext)ru   getattr)r  s    r+   _claim_textr
     s    wufe,,---r*   	candidatec                    d                     | j        | j        | j        | j        | j        | j        | j        | j        | j	        | j
        | j        | j        f                                          S )N )joinr   r   r   r   r   r   r   r   r   r   r   r   casefold)r  s    r+   _combined_textr     s    88Y_ini6KYMcene{  ~G  ~b  dm  d|  ~G  ~Q  S\  S`  bk  bx  zC  zL  NW  Nh  i  j  j  s  s  u  u  ur*   r   c                    | pd                                 t                    rdS t          fdt          D                       odvS )Nr   Fc              3      K   | ]}|v V  	d S r   r)   )r   termr  s     r+   r   z4_has_visible_first_frame_conflict.<locals>.<genexpr>   s'      CCtt|CCCCCCr*   zplain title card)r  r   r   FIRST_FRAME_CONFLICT_TERMS)r   r  s    @r+   !_has_visible_first_frame_conflictr     s\    2''))D uCCCC(BCCCCCfHZbfHffr*   r  c                D     t           fdt          D                       S )Nc              3  B   K   | ]}t          j        |          V  d S r   )rer   r   patternr  s     r+   r   z'_has_generic_ai_slop.<locals>.<genexpr>   s/      PPGry$''PPPPPPr*   )r   GENERIC_AI_SLOP_PATTERNS)r  s   `r+   _has_generic_ai_slopr     s'    PPPP7OPPPPPPr*   r   c                x    | pd                                 t          fdt          D                       odvS )Nr   c              3      K   | ]}|v V  	d S r   r)   r  s     r+   r   z*_is_slideshow_structure.<locals>.<genexpr>   s'      AA7w$AAAAAAr*   
motion-led)r  r   SLIDESHOW_PATTERNS)r   r  s    @r+   _is_slideshow_structurer!     sH    ",,..DAAAA.@AAAAA^lZ^F^^r*   )registryr"  SeriesRegistry | Noner   c               H
   |pt                                           }g }i d| j        d| j        d| j        d| j        d| j        d| j        d| j        d| j	        d	| j
        d
| j        d| j        d| j        d| j        d| j        d| j        d| j        d| j        | j        | j        d}|                                D ],\  }}t-          |          r|                    | d           -| j        t0          v r=t-          | j                  r)t-          | j                  r|                    d           | j        dk    r=t-          | j                  r)t-          | j                  r|                    d           | j        t:          j        k    r)t-          | j                  r|                    d           | j         s|                    d           | j         D ]\}tC          |          }|tD          vr|                    d|            || j#        vr!|| j#        vr|                    d|            ]dtI          d | j         D                       v rRt-          | j%                  r|                    d           t-          | j&                  r|                    d           d| j'        cxk    rd k    sn |                    d!           |(                    | j                  }|j)        s|*                    |j+                   tY          | j	                  s|                    d"           | j        t:          j        k    r|                    d#           | j-        t\          j/        k    r|                    d$           | j0        tb          j2        k    r| j3        s|                    d%           | j3        s|                    d&           ti          |           }	tk          |	          r|                    d'           tm          | j                  r|                    d(           to          d) | j
        | j	        | j        | j        | j        | j        | j        | j        | j        f	D                       }
|
ptY          | j	                   }
|
p|j)         }
|
p| j-        t\          j/        k    }
|
p| j0         }
|
r|                    d*           tq          | tI          tr          :                    |                    +          S ),Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rw   r    is requiredz(anti_example is required for this seriesr   z.concrete_scene is required for attention_trapszhuman_texture_note is requiredz!at least one platform is requiredzunsupported platform: zplatform_fit missing for r   c              3  4   K   | ]}t          |          V  d S r   )r  )r   ps     r+   r   z(validate_candidate_v2.<locals>.<genexpr>(  s(      !O!Oa,q//!O!O!O!O!O!Or*   z0linkedin_caption is required for linkedin_manualz.linkedin_title is required for linkedin_manual
      z+duration_seconds must be between 10 and 180z(visible first-frame conflict is requiredz1videos without concrete human texture are blockedz9AI disclosure decision cannot be unclear before renderingz*high claim risk requires documented claimsz,at least one claim or claim note is requiredz#generic AI-slop hook/title detectedz-pure slideshow/text-card structure is blockedc              3  4   K   | ]}t          |          V  d S r   )r   )r   r   s     r+   r   z(validate_candidate_v2.<locals>.<genexpr>F  s>         	%     r*   z5candidate is not renderable until all hard gates passr   );r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rw   r   itemsr   appendANTI_EXAMPLE_REQUIRED_SERIESr   r   r   r   rS   r[   r   r   r  SUPPORTED_PLATFORMS_V2r   tupler   r   r   r   r   extendr   r  r   re   rk   r   rc   rP   r   r  r  r!  r   r   dictfromkeys)r  r"  r   required_fields
field_namer   r  platform_idseries_validationr  hard_gate_faileds              r+   validate_candidate_v2r8     s   3>1133HF	.9$ 	 	Y(	
 	)2 	94 		 	y, 		. 	Y( 	y} 		. 	I& 	y, 		.  	0!" 		 >#$ $-#D%6'  O* -2244 7 7
EU 	7MMZ555666:::yI_?`?`:enox  pT  fU  fU:@AAA///Ii>V4W4W/\efof|\}\}/FGGG,"333	)B^8_8_36777 ;9:::' E E"8,,444MM=8==>>>i444I_9_9_MMCkCCDDDE!O!O9;N!O!O!OOOOOY/00 	NMMLMMMY-.. 	LMMJKKK+2222s2222CDDD 33I4GHH% 0'.///,Y-BCC B@AAA,"333IJJJ'+?+GGGQRRRy~--i6F-BCCC FDEEE)$$DD!! =;<<<y9:: GEFFF  ,i.CYEXZcZgiri  BK  BT  V_  Vk  mv  mC  EN  E\  ]     (g/PQZQf/g/g+g'I/@/I+I'k9+KOcOk+k'Cy/C+C OMNNNZdmmF>S>S8T8TUUUUr*   c                  6    e Zd ZU ded<   ded<   ded<   d
dZd	S )ScoreComponentr   points
max_pointsru   	rationalerx   dict[str, int | str]c                ,    | j         | j        | j        dS )Nr;  r<  r=  r@  r}   s    r+   r   zScoreComponent.to_dictZ  s    +T_SWSabbbr*   N)rx   r>  )r   r   r    r   r   r)   r*   r+   r:  r:  T  sK         KKKOOONNNc c c c c cr*   r:  c                      e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   dZded<   edd            Zedd            Zedd            Z	ddZ
dS ) StrategyScoreV2r   problem_urgencyfirst_frame_clarityhook_curiositymechanism_valuepractical_payoffretention_pathshare_save_potentialtrust_human_texture
series_fitsaturation_defensezdict[str, ScoreComponent]	breakdownr)   r   reject_reasonsrx   c                b    t          d | j                                        D                       S )Nc              3  $   K   | ]}|j         V  d S r   )r;  )r   	components     r+   r   z(StrategyScoreV2.total.<locals>.<genexpr>o  s%      MM	9#MMMMMMr*   )sumrM  valuesr}   s    r+   totalzStrategyScoreV2.totalm  s-    MMT^5J5J5L5LMMMMMMr*   r   c                (    | j         dk    o| j         S )NK   )rT  rN  r}   s    r+   render_allowedzStrategyScoreV2.render_allowedq  s    zR;(;$;;r*   r  r   'StrategyScoreV2'c                   t          |          }t          |          }g }|j        r	|j        rdnd}t	          |j                  rdnd}d|j                                        v sd|j        v sd|v rdnd}t          |          rt          |d          }|j
        r|j        s|j        s|j        rd	n
|j
        rd
nd}|j        r	|j        rdnd}	t!          |j        o|j        o|j                  }
|j        rd|j                                        v r|
rd
n
|j        rdnd}|
rdnd}t,          j        d
t,          j        dt,          j        d
t,          j        d
t,          j        dt,          j        dt,          j        di}||j                 }t?          |j                   rt          |d          }tB          "                                #                    |j$                  j%        rdnd}tL          j'        dtL          j(        dtL          j)        di|j*                 }|dk     r|+                    d           |j%        s|,                    |j-                   t          |          r|+                    d           t]          |dd          t]          |dd          t]          |dd          t]          |dd          t]          |	dd          t]          |dd          t]          |dd          t]          |d
d          t]          |dd          t]          |dd          d
} | |||||	||||||t_          t`          1                    |                              S ) N   r   r(  because?r               r     	            z+share/save/follow potential below thresholdzgeneric AI-slop detected   z6Visible everyday fail with recognizable audience need.   z6First frame shows a conflict without relying on audio.z7Hook opens a mechanism loop; generic hooks lose points.z1Mechanism is tied to anti-example/concrete scene.z Fix and takeaway are actionable.z"Before/after plus motion-led path.z-Save, share, and follow reasons are explicit.z)Concrete human texture, not just an enum.zKnown TrueTrace series.z Saturation risk penalty applied.)
rC  rD  rE  rF  rG  rH  rI  r   rK  rL  )2r8  r  r   r   r  r   r   r  r  minr   r   r   r   r   r   r   r   r   r   r   r   rS   r\   r]   r^   r_   r`   ra   r[   r   r   r   r   r   r   r   r   rI   rN   rO   rP   r   r,  r0  r   r:  r/  r1  r2  )r   r  
validationr  rN  problemr   r   r   r   has_conversion	retention
share_savetexture_maptexturerK  
saturationrM  s                     r+   from_candidatezStrategyScoreV2.from_candidateu  s*   *955
i(($&!.Q93JQ""PQ=i>STT[bbZ[9>#:#:#<#<<<y~@U@UY_cgYgYgrrno%% 	 tQ<<D#-  t93I  tYMe  tir  jN  tBB  Zc  Zm  Ut  UV  UV  st	 }B);Bi3j	8NjS\Sjkk"/  eLID^DgDgDiDi4i4in|4iAA  HQ  H^  Ce  CD  CD  de	(/QQa
#0!\5KQP\Pjlmo{  pM  OP  R^  Rs  uv  xD  xW  YZ  \h  \m  op  qi56Y122 	&'1ooG(0022EEiFYZZcjQQij
$(!^-BA~GZ\]^_h_xy
>>!!"OPPP" 	5!!*"3444%% 	>!!"<===  .gr;stt#1+rC{#|#|,T27pqq-i=pqq .vr;] ^ ^,Y<`aa$2:rCr$s$s+GQ8cdd(Q8QRR"0Q@b"c"c
 
	 s7Ky&)ZY`blnx  {D  FK  LP  LY  LY  Zh  Li  Li  Fj  Fj  k  k  	kr*   dict[str, Any]c                    | j         | j        t          | j                  d | j                                        D             dS )Nc                >    i | ]\  }}||                                 S r)   )r   r   keyr   s      r+   
<dictcomp>z+StrategyScoreV2.to_dict.<locals>.<dictcomp>  sk      GF  GF  GF  ak  ad  fk  HK  MR  MZ  MZ  M\  M\  GF  GF  GFr*   )rT  rW  rN  rM  )rT  rW  listrN  rM  r+  r}   s    r+   r   zStrategyScoreV2.to_dict  sz    t7J^bcgcv^w^w  GF  GF  os  o}  oC  oC  oE  oE  GF  GF  GF  G  G  	Gr*   N)rx   r   )rx   r   )r  r   rx   rX  rx   rr  )r   r   r    r   rN  propertyrT  rW  r   rq  r   r)   r*   r+   rB  rB  ^  s)        OOO((((&(N((((N N N XN < < < X< )k )k )k [)kVG G G G G Gr*   rB  c                     e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   d
ed<   d
ed<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded <   d!ed"<   ded#<   ded$<   d%ed&<   d'Zded(<   d'Zded)<   d'Zded*<   d'Zded+<   d'Zded,<   d-Z	ded.<   d8d1Z
d9d2Zed:d6            Zd7S );ReviewPackageV2ru   r   r   script_hashr   r   r   r   r   r-   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rc   r   re   ai_disclosurery   r   r   r   rt   r   rw   approval_commandrB  scorer   r   r   r   r   r   rn   r   rx   rr  c                ,   i d| j         d| j        d| j        d| j        d| j        dt          | j                  dt          | j                  dt          | j                  d	| j	        d
| j
        d| j        d| j        d| j        d| j        d| j        d| j        d| j        i d| j        d| j        d| j        dd | j        D             dt          | j                  dt          | j                  dt1          | j                  d| j        d| j        dt9          | j                  d| j                                        d| j         d| j!        d | j"        d!| j#                                        d"| j$        S )#Nr   r   r}  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   c                ,    g | ]}t          |          S r)   r
  r   r  s     r+   
<listcomp>z+ReviewPackageV2.to_dict.<locals>.<listcomp>  s     CCCe{5))CCCr*   r   r~  r   r   r   r   r   rw   r   r   r  r  )%r   r   r}  r   r   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r~  r1  r   r   r   rx  r   r   r   rw   r   r   r  r  r}   s    r+   r   zReviewPackageV2.to_dict  sY   "
D-"
t|"
 4+"
 $/	"

 dk"
 [);<<"
 k$*=>>"
 [);<<"
 DI"
 4+"
 D-"
 D-"
 d1"
 "
 48"
  D-!"
" #"
 "
$ 4+%"
& D-'"
( T/)"
* CCt{CCC+"
, +do66-"
. [);<</"
0 D!2331"
2 d13"
4  55"
6 T$*%%7"
8 $T%?%G%G%I%I9"
: &t'C;"
< !$"9="
> '(E?"
@ TZ''))A"
B  5C"
 "
 "	
r*   c                T    t          j        |                                 dd          S )NF),:)ensure_ascii
separators)jsondumpsr   r}   s    r+   to_jsonzReviewPackageV2.to_json  s!    z$,,..uTTTTr*   r   r   'ReviewPackageV2'c                :   |d         }|d         }d |                                 D             }t          |d         j        |d         j        |d         j        |d         j        |d         j        |d	         j        |d
         j        |d         j        |d         j        |d         j        |t          |                    dd                              } | di dt          |d                   dt          |d                   dt          |d                   d|                    d          dt          |d                   dt          |d                   dt          |d                   dt          |d                   dt          |d                   dt          |d                   dt          |d                   dt          |d                   dt          |d                   dt          |d                   dt          |d                   d t          |d                    d!t          |d!                   d"t          |d"                   d#t          |                    d#d                    d$t          |d$                   d%t          |d%                   d&t          |d&                   d't          |                    d'd                    d(t                              |d(                   d)t          |d)                   d*t          |d*                   d|d+t          |                    d+d,                    d-t          |                    d-d,                    d.t          |                    d.d,                    d/t          |                    d/d,                    d0t          |                    d0d,                    d1t          |                    d1d2                    S )3Nr  rM  c                    i | ]P\  }}|t          t          |d                    t          |d                   t          |d                             QS r@  )r:  r   ru   ru  s      r+   rw  z-ReviewPackageV2.from_dict.<locals>.<dictcomp>  sp      P  P  P  wAvy  |AS.U8_)=)=s5CV?W?WY\]bcn]oYpYpqq  P  P  Pr*   rC  rD  rE  rF  rG  rH  rI  r   rK  rL  rN  r)   )rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  r   r   r}  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r~  r   r   r   rw   r  r   r   r   r   r   r   r   rn   )r+  rB  r;  r/  r   ru   r   r-   rc   re   r1  rt   r   )r   r   
score_databdrM  r  s         r+   r   zReviewPackageV2.from_dict  s   ']
$ P  P  EG  EM  EM  EO  EO  P  P  P	%&78? )*? @ G$%56=%&78?&'9:A$%56=!*+A!B!I )/ : A .5()=>E 0@"!E!EFF
 
 
 s 
 
 
T.1222
<?Y<P<P<P
^abfgtbu^v^v^v
 DH  DL  DL  MY  DZ  DZ  DZ
 cf  gk  lt  gu  cv  cv  cv
 FR  SW  Xg  Sh  Fi  Fi  Fi
 zG  HL  M]  H^  z_  z_  z_
 o|  }A  BQ  }R  oS  oS  oS
 Z]  ^b  ci  ^j  Zk  Zk  Zk
 y|  }A  BO  }P  yQ  yQ  yQ
 `c  dh  iw  dx  `y  `y  `y
 EH  IM  NY  IZ  E[  E[  E[
 ad  ei  jo  ep  aq  aq  aq
 @C  DH  IW  DX  @Y  @Y  @Y
 dg  hl  mw  hx  dy  dy  dy
 G	J	  K	O	  P	]	  K	^	  G	_	  G	_	  G	_	
 n	q	  r	v	  w	E
  r	F
  n	G
  n	G
  n	G

 W
Z
  [
_
  `
o
  [
p
  W
q
  W
q
  W
q

 z

  @D  @H  @H  IQ  SU  @V  @V  z
W  z
W  z
W
 dm  nr  s  n@  dA  dA  dA
 Qe  fj  kz  f{  Q|  Q|  Q|
 KO  PT  Uc  Pd  Ke  Ke  Ke
 mr  sw  s{  s{  |C  EG  sH  sH  mI  mI  mI
 au  a  a  @D  E\  @]  a^  a^  a^
 x{  |@  AZ  |[  x\  x\  x\
 or  sw  xJ  sK  oL  oL  oL
 TY  TY
 hk  lp  lt  lt  uC  EG  lH  lH  hI  hI  hI
 Z]  ^b  ^f  ^f  gw  y{  ^|  ^|  Z}  Z}  Z}
 RU  VZ  V^  V^  _s  uw  Vx  Vx  Ry  Ry  Ry
 JM  NR  NV  NV  Wg  ik  Nl  Nl  Jm  Jm  Jm
 @C  DH  DL  DL  M_  ac  Dd  Dd  @e  @e  @e
 @C  DH  DL  DL  Mg  ix  Dy  Dy  @z  @z  @z
 	
r*   Nry  )rx   ru   )r   r   rx   r  )r   r   r    r   r   r   r   r   r   r   r   r  r   r   r)   r*   r+   r|  r|    s        LLLKKK!!!!    IIINNNHHHMMM''''    ////    LN     N$33333#
 #
 #
 #
JU U U U 
 
 
 [
 
 
r*   r|  c                V   d                     | j        | j        | j        | j        | j        | j        | j        | j        | j	        | j
        | j        | j        | j        | j        f          }t          j        |                    d                                                    d d         S )N
zutf-8   )r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   hashlibsha256encode	hexdigest)r  payloads     r+   _script_hashr  	  s    ii).):OQZQgiri  BK  Bf  hq  h@  BK  BU  W`  Wd  fo  f|  ~G  ~P  R[  Rg  ir  i  AJ  AX  Y  Z  ZG>'..1122<<>>ssCCr*   c           	     4   t          |           }d| j         d| j         d| }t          d%i d| j        d| j        d|d| j        dt
                                                              | j                  j	        d| j
        d	| j        d
| j        d| j        d| j        d| j        d| j        d| j        d| j        d| j        d| j        d| j        d| j        dt/          d | j        D                       d| j        d| j        d| j        d| j        d| j        d| j        d|dt>                               |           d| j!        p| j"        d | j#        d!| j$        d"| j%        d#| j&        d$tO          | j(                  S )&NzAPPROVE r  r   r   r}  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   c              3  4   K   | ]}t          |          V  d S r   r  r  s     r+   r   z*build_review_package_v2.<locals>.<genexpr>$  s*      FFE[''FFFFFFr*   r   r~  r   r   r   rw   r  r  r   r   r   r   r   r   r)   ))r  r   r   r|  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r/  r   r   r   r   r   r   rw   rB  rq  r   r   r   r   r   r   r  r   )r  r}  commands      r+   build_review_package_v2r    s   y))KS/SS)2CSSkSSG " " "++"!!"  K" ''	"
 %%''++I,?@@EE"  --" !//"  --" ^^" ))" ++" %%" MM" ++" ##"  ))!"" ++#"$  --%"& FFY5EFFFFFF'"( '')"*  66+", ++-". oo/"0 (==1"2 !* A A3"4 !5"6 ,,Y7777"8 +Sy/S9": !//;"< %77="> !//?"@ #33A"B "-Y-O!P!P!PC" "r*   packagec                   g }i d| j         d| j        d| j        d| j        d| j        d| j        d| j        d| j        d	| j        d
| j	        d| j
        d| j        d| j        d| j        d| j        d| j                                        D ],\  }}t#          |          r|                    | d           -| j        s|                    d           | j        t*          j        k    r|                    d           | j        | j        vr|                    d           t/          | t1          |                    S )Nr   r   r}  r   r   r   r   r   r   r   r   r   r   r   rw   r  r%  zclaims are requiredzAI disclosure cannot be unclearz)approval command must include script hashr   )r   r   r}  r   r   r   r   r   r   r   r   r   r   r   rw   r  r+  r   r,  r   r~  re   rk   r   r/  )r  r   r4  r   s       r+   validate_review_package_v2r  6  sn   F R	ng.B  R	Iw  R	`mov  pC  R	  EM  OV  O]  R	  _e  gn  gs  R	  uB  DK  DW  R	  Yg  ip  i}  R	  J  LS  L]  R	  _d  fm  fq  R	  sA  CJ  CW  R	  Yc  el  eu  R	  wD  FM  FY  R	  [i  kr  k  R	  AP  RY  Rg  R	  iB  DK  Dc  R	  ew  y@	  yQ	  R	  X	  X	  Z	  Z	 7 7
EU 	7MMZ555666> -+,,, 4 <<<7888'":::ABBBZfFFFFr*   c                   | j         r$d                    d | j         D                       nd}| j        rd                    | j                  nd}d                    d | j                                        D                       }| j        pd}d                    d | j        j                                        D                       }d                    g d| j         d| j         d	| j	         d
| j
         d| d| j         dt          | j                   dt          | j                   dt          | j                   dd| j         d| j         d| j         d| j        pd d| j        pd d| j         d| j         d| j         d| j         dd| j         d| j         d| j         d| dt          | j                   dt          | j                   d | d!| j        pd d"| j        pd d#| d$| j         j!         d%| j"         d&| j        j#         d'd(|dd)| j$         d*d+| j         d,d-| j         d.          S )/Nz; c              3  4   K   | ]}t          |          V  d S r   r  r  s     r+   r   z+render_review_package_v2.<locals>.<genexpr>E  s*      FFe{5))FFFFFFr*   -c              3  *   K   | ]\  }}| d | V  dS ): Nr)   )r   r  fits      r+   r   z+render_review_package_v2.<locals>.<genexpr>G  s4      ddmh11C11ddddddr*   r  c           	   3  V   K   | ]$\  }}d | d|j          d|j         d|j         V  %dS )z- r  /u    — Nr@  )r   r   rQ  s      r+   r   z+render_review_package_v2.<locals>.<genexpr>I  sl        c  co~osu~jtjjy'7jj):NjjU^Uhjj  c  c  c  c  c  cr*   z## ReviewPackageV2: zCandidate ID: z	Version: zScript Hash: zMedia Hash: zSeries: zAudience Need: zViewer Emotion Before: zViewer Emotion After: r   zHook: zFirst Frame: zVisible Fail: zAnti Example: zConcrete Scene: zMechanism: zFix: zBefore/After: z
Takeaway: zSave Reason: zShare Reason: zFollow Reason: zClaims: zClaim Risk: zAI Disclosure: zPlatform Fit: zLinkedIn Title: zLinkedIn Caption: zRisks: zExperiment Hypothesis: zExpected Winning Metric: z	ScoreV2: z/100zScore Breakdown:zApproval Command: ``zReject Command: `REJECT z
 <reason>`zRevise Command: `REVISE z <field> <requested change>`)%r   r  r   r   r+  r   r  rM  r   r   r}  r   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r~  r   r   r   rv   rw   rT  r  )r  r   r   r   r   rM  s         r+   render_review_package_v2r  D  s   JQ.aTYYFFw~FFFFFF^aF(/>DIIgm$$$3E99ddwG[GaGaGcGcdddddL#*sJ		  c  c  CJ  CP  CZ  C`  C`  Cb  Cb  c  c  c  c  cI99 o5w355o/-//o1NW_1N1NoPu`g`sPuPuo xS  GQ  xS  xSo Up  `g  `n  Up  Upo rh  DO  PW  Pe  Df  Df  rh  rho ji  DO  PW  Pf  Dg  Dg  ji  jio kh  DO  PW  Pe  Df  Df  kh  kho jlo 	 o "G1D!F!Fo IpY`YmHoHoo r`  CJ  CW  C^  [^  r`  r`o bT  u|  uK  uR  OR  bT  bTo Vw  dk  du  Vw  Vwo yN  AH  AL  yN  yNo Pw  ah  au  Pw  Pwo yX  FM  FV  yX  yXo Z\o 	.+--	o 0W@T/V/V	o YBjqj  YB  YB	o DW  OU  DW  DW	o YI  hs  t{  tF  hG  hG  YI  YI	o KA  ]h  ip  i~  ]  ]  KA  KA	o Cb  T`  Cb  Cb	o dV  w~  wM  wT  QT  dV  dV	o XN  mt  mE  mL  IL  XN  XN	o Pa  Z_  Pa  Pa	o cf  }D  }Z  }d  cf  cf	o he  DK  Dc  he  he	o gL	  sz  s@	  sF	  gL	  gL	  gL		o N	`		o b	k		o m	o		o q	b
  G
N
  G
_
  q	b
  q	b
  q	b
	o d
_  
F  
S  d
_  d
_  d
_	o an  |C  |P  an  an  an	o p p pr*   saves_per_viewrv   metricc                $    t          | |          S r{   )rt   )rv   r  s     r+   _hypothesisr  Q  s    )VTTTTr*   ry   c                     dddddS )NstrongrK   z5manual B2B caption; check silent-autoplay readabilityr	   r)   r)   r*   r+   _base_platform_fitr  U  s"    &(x  md  e  e  er*   limit
int | Nonetuple[VideoCandidateV2, ...]c                z   t          ddddt          j        t          j        t
          j        dt                      t          j	        
  
        }t          di |i ddd	d
dddt          j        dddt          j        dt          j        ddddddddddddddd d!d"d#d$d%d&d'd(d)d*t           j        d+d,d-d.d/t%          d0          d1d2d3d4d5d6d7d8t          di |i dd9d	d:dd;dt          j        dd<dt          j        dt          j        dd=dd>dd?dd@ddAddBddCd dDd"dEd$dFd&dGd(dHd*t           j        d+dId-dJd/t%          dK          d1dLd3dMd5dNd7dOt          di |i ddPd	dQddRdt          j        ddSdt          j        dt          j        ddTddUddVddWddXddYddZd d[d"d\d$d]d&d^d(d_d*t           j        d+d`d-dad/t%          db          d1dcd3ddd5ded7dft          di |i ddgd	dhddidt          j        ddjdt          j        dt          j        ddkddlddmddnddoddpddqd drd"dsd$dtd&dud(dvd*t           j        d+dwd-dxd/t%          dy          d1dzd3d{d5d|d7d}t          di |i dd~d	ddddt          j        dddt          j        dt          j        ddddddddddddddd dd"dd$dd&dd(dd*t           j        d+dd-dd/t%          d          d1dd3dd5dd7df}| 
|d |          n|S )Nzv2.0.0r	   &   office_workerr  )
r   r   r   r   r   r   r   rw   r   r   r   z&ai-output-autopsy-decision-summary-38sr   z&Your AI summary has no decision targetr   r   r   r   z`When I summarize a meeting, I want decision evidence, so I can act without rereading everything.r   r   r   z=Your AI summary is useless because it has no decision target.r   zJSplit-screen: 47-minute transcript vs. useless AI summary stamped USELESS.r   zCThe summary says 'great discussion' but misses the launch decision.r   zQA useless AI summary saying great discussion with no owner, blocker, or decision.r   z@Without a decision target, AI compresses every sentence equally.r   zEAsk for blockers, owners, risks, and next steps tied to the decision.r   zFBefore: generic summary. After: decision evidence with owner and risk.r   z3Don't ask for a summary. Ask for decision evidence.r   z/Copyable sentence for the next meeting summary.r   z1Colleagues recognize the useless-summary problem.r   z4Follow for small systems that make AI output useful.r   zbetter meeting summary promptr   r   z-messy meeting transcript with launch decisionr   )zMDecision-targeted summaries preserve relevance better than generic summaries.r   z6Tests whether decision-target AI examples drive saves.r   )zmedium AI-tip saturationr   zGmotion-led compression funnel with transcript cards and decision targetr   z*A better way to brief AI meeting summariesr   zMost meeting summaries fail because they protect no decision. Name the decision first, then ask for blockers, owners, risks and next steps.z"digital-red-flags-fake-invoice-35szThis fake invoice looks normalr   zUWhen I receive an invoice, I want to spot pressure cues, so I do not pay a fake bill.z3This invoice looks safe. The trap is in line three.zKSplit-screen: normal invoice vs. red flag line with urgent payment warning.zDThe recipient trusts the logo but ignores the changed payment route.zNA seemingly normal fake invoice where the payment route changed under urgency.zJScam messages borrow familiar context and add urgency before verification.z>Check sender domain, urgency, and payment route before acting.zABefore: logo trust. After: domain, urgency, and bank route check.z)Urgency is not proof. It is the red flag.z.Viewer can reuse the three-check invoice rule.z-Anyone handling invoices can use the warning.z2Follow for digital red flags before they cost you.zhow to spot fake invoicez'fake invoice with changed payment route)z@Urgency and payment-route changes are common scam warning signs.z6Tests whether red-flag safety content produces shares.)zavoid naming real brandsz@motion-led red flag scan with timer line and before/after checksz(A quick invoice red-flag check for teamsz}A fake invoice does not need to be perfect. It only needs to rush you. Check domain, urgency and payment route before acting.z$workflow-teardown-exception-path-40sz)Your automation only knows the happy pathr   zXWhen I automate a task, I want exceptions handled, so the workflow survives real inputs.z;Your automation didn't fail. You forgot the exception path.zFWorkflow line breaks at an unexpected email, with a red warning route.zGThe automation works on perfect inputs but stalls on one missing field.zOA client email missing the required address makes the automation stop silently.zEHappy-path automation assumes clean inputs and has no recovery route.zSAdd an exception path: detect missing fields, ask for clarification, then continue.zFBefore: broken workflow. After: missing-field route and recovery step.z@If there is no exception path, it is not automation. It is hope.z/Builder can apply the exception-path checklist.z6Every automation builder has seen happy-path failures.zBFollow for workflow teardowns before you automate the wrong thing.z!automation exception path examplez.automation input missing required client email)zLAutomation reliability depends on handling exceptions, not only happy paths.z:Tests whether workflow teardown examples attract builders.)z avoid exposing private workflowsz>motion-led broken workflow line with exception route appearingz$The automation check most teams skipzuIf your workflow only handles the happy path, it is not reliable automation. Add an exception path before scaling it.z#decision-design-hidden-decision-38sz Your question hides the decisionr   zTWhen I ask a tool for advice, I want decision criteria, so I can choose confidently.z3Your question is bad because it hides the decision.zDSplit-screen: vague question vs. highlighted missing decision route.zGThe tool gives advice but cannot know what decision is being protected.zWA vague 'what should I do?' prompt produces confident advice with no decision criteria.zBA vague question asks for an opinion instead of decision evidence.z=Name the decision, criteria, and what would change your mind.zPBefore: 'What should I do?' After: decision criteria and disconfirming evidence.z=Don't ask for an opinion. Ask what would change the decision.z0Viewer can reuse the decision-criteria template.z1Teams often ask vague questions before decisions.z6Follow for decision systems that reduce digital noise.z$how to make better decisions with AIz.vague decision request from a planning meeting)zJDecision criteria make advice more actionable than vague opinion requests.z9Tests whether decision design content converts followers.)z%abstract topic needs concrete examplez3motion-led decision route with one path lighting upzStop asking tools for opinionszPBefore asking for advice, define the decision and what evidence would change it.z attention-traps-next-thought-35sz$Your phone chooses the next questionr   zUWhen I open my phone, I want to keep my intent, so I do not lose the next 20 minutes.r   z]Cursor thought bubble pulled from work note toward app tiles with red attention trap warning.zMThe viewer opens the phone for one task and follows the feed's next question.r   z3phone opened for one task, feed redirects attentionzKFeeds win by offering the next question before you restate your own intent.zBBefore opening the app, say the one action and the exit condition.zDBefore: open app, follow feed. After: intent card, one action, exit.z5Set the next question before the app sets it for you.z*Viewer can reuse the one-action exit rule.z*The lost-focus moment is widely relatable.z4Follow for attention systems that give control back.z'how to stop getting distracted by phone)z9Clear intent before app use can reduce aimless switching.z6Tests whether attention-trap framing generates shares.)z!avoid medical or addiction claimsz>motion-led attention capture with thought bubble and app tilesz)A simple attention rule for app switchingzlBefore opening an app, name the one action and exit condition. Otherwise the feed chooses the next question.r)   )r1  rI   rO   rc   rN   re   rj   r  rm   rp   r   r   r%   r-   r;   rD   rS   r]   r  r'   rA   rE   r\   r$   r<   rG   r^   r=   r`   )r  common
candidatess      r+   build_demo_candidates_v2r  Y  s   (.p  DF  Xg  yG  yN  [d  [h  AU  AX  rB  Qc  Qe  Qe  @V  @d  e  e  eF  	T  	T6  	T  	T  	T0X0X  	T  aI  aI  	T  Uh  Uh  	T  xD  xL  xL  	T  ]  ]  	T  P]  Pf  Pf  	T  vC  vN  vN  	T  UT  UT  	T  bn  bn  	T  }B
  }B
  	T  Q
d  Q
d  	T  pr  pr  	T  x  x  	T  NV  NV  	T  aV  aV  	T  dU  dU  	T  dW  dW  	T  g]  g]  	T  tS  tS  	T  co  cy  cy  	T  N}  N}  	T  FX  FX  	T  p{  |t  pu  pu  pu  	T  }Z  }Z  	T  mv  mv  	T  Gs  Gs  	T  FS  FS  	T  	T  	m  	m6  	m  	m  	m0T0T  	m\|\|  	m  I\  I\  	m  lx  l  l  	m  Pg  Pg  	m  xE  xM  xM  	m  ]j  ]q  ]q  	m  xm  xm  	m  {H  {H  	m  W]	  W]	  	m  l	|
  l	|
  	m  HT  HT  	m  ZZ  ZZ  	m  il  il  	m  wb  wb  	m  p`  p`  	m  o^  o^  	m  nb  nb  	m  yS  yS  	m  co  c|  c|  	m  Qz  Qz  	m  CH  CH  	m  `k  ld  `e  `e  `e  	m  mJ  mJ  	m  ]_  ]_  	m  pZ  pZ  	m  ml  ml  	m  	m  	k  	k6  	k  	k  	k0V0V  	k  _J  _J  	k  Vi  Vi  	k  yE  yP  yP  	k  a{  a{  	k  LY  La  La  	k  q~  qG  qG  	k  NK  NK  	k  Ya  Ya  	k  py	  py	  	k  H
Y  H
Y  	k  el  el  	k  rG  rG  	k  V^  V^  	k  ik  ik  	k  yj  yj  	k  yq  yq  	k  AE  AE  	k  \  \  	k  O[  Oi  Oi  	k  ~n  ~n  	k  wH  wH  	k  `k  lh  `i  `i  `i  	k  qV  qV  	k  ii  ii  	k  z`  z`  	k  sj  sj  	k  	k  	B  	B6  	B  	B  	B0U0U  	B]]  	B  L]  L]  	B  my  mA  mA  	B  Rh  Rh  	B  yF  yO  yO  	B  _l  _w  _w  	B  ~s  ~s  	B  AG  AG  	B  V_	  V_	  	B  n	G  n	G  	B  SW  SW  	B  ]\  ]\  	B  k}  k}  	B  HG  HG  	B  UG  UG  	B  VI  VI  	B  YQ  YQ  	B  hN  hN  	B  ^j  ^t  ^t  	B  Iy  Iy  	B  BQ  BQ  	B  it  up  iq  iq  iq  	B  yc  yc  	B  vk  vk  	B  |\  |\  	B  oA  oA  	B  	B  	`  	`6  	`  	`  	`0R0R  	`  [A  [A  	`  M^  M^  	`  nz  nB  nB  	`  Sj  Sj  	`  {H  {T  {T  	`  dq  d|  d|  	`  C|  C|  	`  Ji  Ji  	`  xG
  xG
  	`  X
M  X
M  	`  Yf  Yf  	`  lp  lp  	`  E  E  	`  PG  PG  	`  UA  UA  	`  P|  P|  	`  LB  LB  	`  YB  YB  	`  R^  Rs  Rs  	`  H}  H}  	`  FD  FD  	`  \g  h`  \a  \a  \a  	`  iO  iO  	`  bb  bb  	`  s^  s^  	`  q_  q_  	`  	`J "'!2:fuf
Br*   )r   r   rx   r   )r   r   rx   ru   )r  ru   rx   ru   )r  r   rx   ru   )r  r   rx   ru   )r   ru   rx   r   )r  ru   rx   r   )r   ru   rx   r   )r  r   r"  r#  rx   r   )r  r   rx   r|  )r  r|  rx   r   )r  r|  rx   ru   )r  )rv   ru   r  ru   rx   rt   r   r   )r  r  rx   r  )4__doc__
__future__r   dataclassesr   enumr   r  r  r  typingr   r   autoshorts.ideas.candidater   r.  r  r-  r   r-   rI   rS   rc   re   rm   rt   r   r   r   r   r  r   r  r   r  r  r
  r  r  r  r!  r8  r:  rB  r|  r  r  r  r  r  r  r  r)   r*   r+   <module>r     s    # " " " " " ! ! ! ! ! !         				         7 7 7 7 7 7[ "2AR^fgg q     7       G        W   . . . . .7 . . .           7   : : : : :W : : :
 $	s 	s 	s 	s 	s 	s 	s 	s $! ! ! ! ! ! ! !* $        $] ] ] ] ] ] ] ]: $(" (" (" (" (" (" (" ("V    n % % % %E E E E7 7 7 7. . . .u u u ug g g gQ Q Q Q_ _ _ _
 ]a VV VV VV VV VV VVr $c c c c c c c c $CG CG CG CG CG CG CG CGL $`
 `
 `
 `
 `
 `
 `
 `
FD D D D
% % % %PG G G G
p 
p 
p 
pU U U U Ue e e e	C 	C 	C 	C 	C 	C 	Cr*   