
    ,Jj0                    x   d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	  ee
      j                         j                  d   Zedz  ZdZd	Zd
Zh dZdh diZh dZddhZh dZh dZdhZh dZd$dZd%dZd&dZd'd(dZd)dZd*dZd*dZ d+dZ!d*dZ"d,dZ#efd-dZ$d.d Z%edfd/d!Z&d0d"Z'e(d#k(  r e'        yy)1z2Build a compact route-guide browser smoke summary.    )annotationsN)Path)Any   outzroute_guide_browser_smoke.jsonz route_guide_browser_summary.jsonz route_guide_browser_summary.html>
   sourcehandled	sourceMap	targetMap
playerTileinputSourcerouteActionmovementQueued#routeBlockerExternalProofInputCount*browserRouteAssistWaypointNudgeImplementedr   >   soundaction
nextTarget>   soundKeyr   soundPlayedxy>   distanceTextlineRendereddirectionLabelstepBlockerTextstepBlockReasonsrouteBlockerGoalChecklistUrl routeBlockerMissingEvidenceCountr   &routeBlockerExternalProofHandoffStatus'routeBlockerStrictHotspotCandidateCount*browserRouteAssistWaypointGuideImplemented/routeBlockerStrictHotspotRejectedCandidateCount0browserRouteAssistWaypointNudgePromptImplemented0routeBlockerStrictHotspotRejectionClassification>   tilerenderedr
   r   !originalRoutePromotionImplemented%browserRouteAssistWaypointImplementedr   >   footscenemapName	routeGoal
readyStaterouteAutoSaverouteWaypointquickObjectivetrialTransitionsrouteControlSoundfieldMovementSoundrouteControlActionrouteWaypointGuiderouteWaypointNudgequickObjectiveSoundrouteWaypointActionc                p    | j                         r%t        j                  | j                  d            S i S )Nutf-8encoding)existsjsonloads	read_text)paths    :/home/exedev/hwanse/tools/summarize_route_guide_browser.py	load_jsonrD   W   s)    ;?;;=4::dnngn67PbP    c                b    t        t        j                  | dd      j                  d            S )NF,:ensure_ascii
separatorsr;   )lenr?   dumpsencodepayloads    rC   compact_json_sizerR   [   s&    tzz'*MTTU\]^^rE   c           
        | j                         s|j                         sy t        |      }|sy t        |j                  d      xs( |j                  d      xs |j                  d      xs d      }|j	                  dd||dddd	       |S )
NlastRecordedSourceSizeBytesremovedRawSizeBytessourceSizeBytesr   zraw-removed-summary-retainedFzwRun tools/verify_route_guide_browser.py locally to regenerate the ignored raw smoke when debugging browser regressions.a  Compact route-guide browser smoke contract. It keeps only the route guide, waypoint action, nudge, follow, and sound marker fields consumed by completion audits. The checked-in raw smoke was removed; the verifier can regenerate it locally as an ignored output.)statusrV   rT   rU   rawFilePresentrawRegenerationboundary)r>   rD   intgetupdate)rB   summary_pathsummaryrecorded_sizes       rC   fallback_removed_summaryra   _   s    {{}L//1%G12 	;;,-	;;()	 	M NN4 +8#0#  YB	
  NrE   c                    t        | t              si S |xs i }i }t        |      D ]8  }|| vr| |   }||v r#t        |t              rt        |||         ||<   4|||<   : |S N)
isinstancedictsortedpick_nested)datafieldsnestedr   fieldvalues         rC   pickrm   ~   sz    dD!	\rFC UF?z%6$UF5M:CJCJ JrE   c                F   t        |t              rGt        | |      }d|v r5t        | j                  d      t              rt        | d   t
              |d<   |S i }|j                         D ]4  \  }}|| vr| |   }t        |t              rt        ||      ||<   0|||<   6 |S )Nr   )rd   setrm   r\   re   SOUND_FIELDSitemsrg   )rh   specr   keysub_specrl   s         rC   rg   rg      s    $4d?z$((7*;TBW|<CL
C Xd?S	eT""5(3CHCH JrE   c                    t        | t        t              }t        |j	                  d      t
              r>t        |d   j	                  d      t
              rt        |d   d   t              |d   d<   |S )Nr   r   )rm   ROUTE_ACTION_FIELDSROUTE_ACTION_NESTEDrd   r\   re   rp   rh   r   s     rC   route_actionry      se    
t(*=
>C#''-($/Js=?Q?U?UV]?^`d4e&*3}+=g+F&UM7#JrE   c                   t        | t              si S t        | t              }t        | j	                  d      t              rt        | d         |d<   t        | j	                  d      t              rTt        | d   t              |d<   t        | d   j	                  d      t              rt        | d   d   t              |d   d<   t        | j	                  d      t              rt        | d   t              |d<   t        | j	                  d      t              rt        | d         |d<   t        | j	                  d      t              rt        | d   t              |d<   t        | j	                  d      t              rt        | d   t              |d<   t        | j	                  d      t              rt        | d   t              |d<   t        | j	                  d	      t              rt        | d	   t              |d	<   t        | j	                  d
      t              rt        | d
         |d
<   t        | j	                  d      t              rt        | d   t              |d<   |S )Nr9   r0   r&   r6   r7   r*   r4   r1   r8   r5   r3   )rd   re   rm   RUNTIME_FIELDSr\   ry   WAYPOINT_FIELDSFOOT_FIELDSGUIDE_FIELDSrp   QUICK_FIELDSrx   s     rC   runtimer      s   dD!	
t^
$C$((0148%1$7L2M%N!"$((?+T2#D$9?KOd?+//7>+/_0Ef0M{+[C ($((/0$7$(.B)C\$R !$((/0$7$06J1K$L !$((6"D)4<5F$((/0$7$(.B)C\$R !$((+,d3 $T*:%;\ J$((0148%)$/D*E|%T!"$((/0$7$06J1K$L !$((./6#'-@(A<#P JrE   c                    t        | t              r| xs i j                  |      ni }t        |t              r|t        |t        ddhz        iS i S )Ntext1browserRouteAssistWaypointActionPromptImplemented)rd   re   r\   rm   r~   )rh   rs   rl   s      rC   promptr      sM    %/d%;TZRS!E%T%9l0m!mnooIrE   c                L   t        | t              si S t        | j                  d      t              r| j                  d      ni }| j                  d      | j                  d      t        |j                  d      t              t        |j                  d      t
              ddS )Narrivalarrived	stepCountr*   r6   )r*   r6   )r   r   r   )rd   re   r\   rm   r}   r~   )rh   r   s     rC   followr      s    dD!	%/0CT%Jdhhy!PRG88I&XXk*V,k:"&w{{3G'H,"W
 rE   c           	     .   i d| j                  d      d| j                  d      ddt         dt        | j                  d      ddh      dt        | j                  d            d	t	        | j                  d	      d
      dt        | j                  d            dt        | j                  d            dt        | j                  d            dt        | j                  d            dt	        | j                  d      d      dt        | j                  d            dt        | j                  d            dt        | j                  d            dt        | j                  d            dt        | j                  d            dt        | j                  d            t        | j                  d            t        | j                  d            t        | j                  d            t        | j                  d            dS )NrW   url
sourceFileout/guiderouteGoalLinkssavedatScanLinksr   waypointPromptr   waypointEnterRuntimewaypointMobileActionRuntimewaypointRuntimewaypointGuidewaypointNudgePromptactionPromptwaypointClickNudgeRuntimewaypointNudgeRuntimewaypointToolbarNudgeRuntimewaypointMobileNudgeRuntimewaypointFollowwaypointFollowNextRuntimewaypointToolbarFollow waypointToolbarFollowNextRuntimewaypointMobileFollowwaypointMobileFollowNextRuntime)r   r   r   r   )r\   SOURCE_FILErm   r   r   r   rP   s    rC   build_route_guider      s   '++h'w{{5! 	[M* 	gkk'*-=?Q,RS	
 	77;;y12 	&-=!>I 	4J(K L 	&ww{{;X/Y'Z 	77;;/@#AB 	_!=> 	vgkk2G&H.Y 	$WW[[9T-U%V 	4J(K L 	&ww{{;X/Y'Z 	%ggkk:V.W&X  	&-=!>?!" 	$WW[[9T-U%V#$ "(4K(L!M,3GKK@b4c,d &w{{3I'J K+27;;?`3a+b+ rE   c           	        | dz  }|t         z  }t        ||t        z        }||S t        |      }t	        |      }ddddt          d|j                         r|j                         j                  ndt        |      |dS )	Nr   z"hwanse-route-guide-browser-summaryz&tools/summarize_route_guide_browser.pyreadyr   a  Compact route-guide browser smoke contract. It keeps only the route guide, waypoint action, nudge, follow, and sound marker fields consumed by completion audits. The raw route_guide_browser_smoke.json is verifier output and should not be committed after regeneration.r   )kindr   rW   r   rZ   rV   compactSizeBytes
routeGuide)	r   ra   SUMMARY_FILErD   r   r>   statst_sizerR   )rootout_dirsource_pathfallbackrQ   route_guides         rC   build_summaryr      s    UlGK'K'W|5KLH$G#G,K4:[M*E
 :E9K9K9M;++-55ST-k:! rE   c                :   | d   }t        | d         dd}| j                  d      r|dt        | d         ddz  }g }|j                         D ]\  \  }}|j                  dt	        j
                  |       d	t	        j
                  t        j                  |d
d            d d  d       ^ dt	        j
                  | d          dt	        j
                  | d          dt	        j
                  |       dt        | d         dddj                  |       dS )Nr   rV   rH   z
 bytes rawrT   z (removed; last recorded z bytes)z<tr><td><code>z</code></td><td>FrG   rJ   i  z
</td></tr>a!  <!doctype html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <title>Route Guide Browser Summary</title>
  <style>
    body { margin: 24px; color: #202124; font-family: system-ui, sans-serif; line-height: 1.5; }
    table { width: 100%; border-collapse: collapse; margin: 14px 0 28px; }
    th, td { border: 1px solid #d7dce2; padding: 6px 8px; text-align: left; vertical-align: top; }
    th { background: #f4f6f8; }
    code { background: #f4f6f8; padding: 1px 4px; }
  </style>
</head>
<body>
  <h1>Route Guide Browser Summary</h1>
  <p>rZ   z</p>
  <p><code>r   z	</code>: z, r   zj bytes compact.</p>
  <table>
    <thead><tr><th>field</th><th>compact value</th></tr></thead>
    <tbody> z$</tbody>
  </table>
</body>
</html>
)	r[   r\   rq   appendhtmlescaper?   rN   join)r_   routeraw_linerowsrs   rl   s         rC   	html_pager     sJ   L!Eg/01!4J?H{{01/G<Y4Z0[\]/^^effDkkm 

US)* +;;tzz%ePZ[\]b^bcd e	

 kk'*%&' (KK-./yX9N8OrRUV]^pVqRrstQu v GGDM? ' rE   c                   |j                  dd       |t        z  j                  t        j                  | dd      d       |:|j
                  j                  dd       |j                  t        |       d       y y )NT)parentsexist_okFrG   rJ   r;   r<   )mkdirr   
write_textr?   rN   parentr   )r_   r   html_outs      rC   write_outputsr   3  sy    MM$M.|''

7:F (  dT:Ig.A rE   c                 l   t        j                         } | j                  dt        t               | j                  dt        d       | j                         }|j                  j                         }|j                  r|j                  j                         nd }t        t        |      |dz  |       y )Nz--root)typedefaultz
--html-outzGOptional local HTML review output. The committed contract is JSON-only.)r   helpr   )r   )argparseArgumentParseradd_argumentr   ROOT
parse_argsr   resolver   r   r   )parserargsr   r   s       rC   mainr   >  s    $$&F
tT:
V  
 D99D*.--t}}$$&TH-%te|hGrE   __main__)rB   r   returndict[str, Any])rQ   r   r   r[   )rB   r   r^   r   r   dict[str, Any] | Nonerc   )rh   r   ri   zset[str]rj   r   r   r   )rh   r   rr   zset[str] | dict[str, Any]r   r   )rh   r   r   r   )rh   r   rs   strr   r   )rQ   r   r   r   )r   r   r   r   )r_   r   r   r   )r_   r   r   r   r   zPath | Noner   None)r   r   ))__doc__
__future__r   r   r   r?   pathlibr   typingr   __file__r   r   r   OUTr   r   SUMMARY_HTMLrv   rw   rp   r}   r~   r|   r   r{   rD   rR   ra   rm   rg   ry   r   r   r   r   r   r   r   r   __name__ rE   rC   <module>r      s   8 "      H~''*
Ul.11     :Cj  z(Q_> $:4  $ 2$N <?X\ BH zF rE   