
    ~:Jj'>                      d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZ  ee      j%                         j&                  d	   Zed
z  Zedz  ZddhZdCdZdDdZdEdFdZdGdZdHdZdIdZdJdZdKdZdLdZ dLdZ!dMdZ"dNdZ#dOdZ$dPdZ%dQdZ&dRdZ'dSdZ(dTdZ)dUd Z*dVd!Z+dWd"Z,dWd#Z-dXd$Z.dYd%Z/dZd&Z0dWd'Z1d[d\d(Z2d]d^d)Z3d_d*Z4	 	 d`	 	 	 	 	 	 	 	 	 	 	 	 	 dad+Z5dbd,Z6dbd-Z7dcddd.Z8ded/Z9dfd0Z:dgd1Z;dhd2Z<dcdid3Z=dcdjd4Z>dkd5Z?dldmd6Z@dnd7ZAdod8ZBdpd9ZCdWd:ZDdqd;ZEdrdsd<ZFdtdud=ZGdvd>ZHdwd?ZIdxd@ZJdydAZKeLdBk(  r eK        yy)zzEValidate, merge, and export reviewed field-map transition candidates.    )annotationsN)Path	urlencode)	write_png)render_thumbnail)	load_maps   dataout	confirmedrejectedc                h    | j                  d      xs | j                  d      }|t        |      S dS )NrecordVaHexrecordVarecord)getstr)r   values     //home/exedev/hwanse/tools/transition_reviews.py
record_keyr      s2    JJ}%?J)?E*3u:88    c           	        |D cg c]c  }t        |j                  d      t              rBt        |j                  d      t              r#t        | |d   z
        t        ||d   z
        z   e }}|rt	        |      S d S c c}w )Nxy)
isinstancer   intabsmin)r   r   active_pointspoint	distancess        r   active_distancer#      s{     #eiinc*z%))C.#/N 	Ac
Nc!eCj.11I 
 '3y>0D0s   A(A>c           	     @    |t        |      nd}|  d| d| d| d| 	S )Nr   @:,z->)r   )sourcer   r   targetr   record_parts         r   
review_keyr+   &   s5    !'!3#f+KXQ{m1QCq2fX66r   c                j   i }| D ]  }|d   }t        |j                  d      xs g       }i }|j                  d      xs g D ]2  }|j                  d      xs i j                         D ]
  \  }}|||<    4 |j                  d      xs g D ]  }	|	j                  d      }
|	j                  d      }t        |
t              rt        |t              sG|j                  d      xs g }|D ]  }||
|||j                  d	      |j                  d
      |j                  d      |j                  d      |j                  d      |j                  |i       j                  d      |j                  |i       j                  d      |t        |
||      d|t        ||
||t        |            <    "  |S )NmaptargetsconditionChoicestargetSceneIdspointsr   r   activePointsr   r   sceneId
sceneIdHex	eventKind)r(   r   r   r)   r   r   r3   r4   r5   targetSceneIdtargetSceneIdHexr2   activeDistance)setr   itemsr   r   r#   r+   r   )transitionsindexrowr(   r.   target_scene_idschoicer)   
scene_infor!   r   r   r    s                r   transition_indexrA   +   s   E Ucggi(.B/gg017R 	6F'-zz2B'C'Ir&P&P&R 6"
+5 (6	6 WWX&," 	E		#A		#Aa%Z3-?GGN39rM! $$ #
 3#&77=#9"wwy1"%'',"7!$!5%5%9%9&"%E%I%I)%T(8(<(<VR(H(L(L\(Z$1&5aM&JLjAvz#GH	: Lr   c           
        t        | t              st        d      i }| j                         D ]  \  }}t        |t              st        d      ||vrt        | d      t        |t              st        | d      |j                  d      }|t        vrt        | dt        t                     ||   }dD ]/  }|j                  |      ||   k7  st        | d| d	||          d
D ]A  }|j                  |      |j                  |      ||   k7  s-t        | d| d	||          |d   |d   |d   |d   |d||<   d|v }d|v }	||	k7  rt        | d      |rH|d   }
|d   }t        |
t              rt        |t              st        | d      |
||   d<   |||   d<   dD ]  }|j                  |      ||   ||   |<   !  t        t        |j                                     S )Nz(transition review data must be an objectz&transition review keys must be stringsz5: review does not match an event transition candidatez : review entry must be an objectstatez: state must be one of )r(   r)   r   r   z: z	 must be )r   r   r(   r   r   r)   r(   r   r   r)   rC   spawnXspawnY-: spawnX and spawnY must be provided togetherz : spawnX/spawnY must be integersr   r   r3   r4   r5   r6   r7   )	r   dict
ValueErrorr:   r   r   STATESsortedr   )r   valid
normalizedkeyr   rC   expectedfieldhas_spawn_xhas_spawn_yspawn_xspawn_ys               r   	normalizerV   M   sa   dD!CDDJjjl %9
U#s#EFFeu$YZ[[%&u$DEFF		'"u$;F6N;KLMM:3 	PEyy8E?2 C55'8E?:M!NOO	P 1 	PE||E".599U3CxPU3V C55'8E?:M!NOO	P x(##x(

3 %'%'+%u$QRSSHoGHoGgs+:gs3K C5(H!IJJ(/JsOH%(/JsOH%{ 	9E||E".)1%
3&	9G%9L z'')*++r   c                    | j                         si S t        t        j                  | j	                  d            |      S )Nutf-8encoding)existsrV   jsonloads	read_text)pathrM   s     r   load_reviewsr`   z   s1    ;;=	TZZ @A5IIr   c                    t        j                  | j                  d            }t        |t              st        d      |S )NrX   rY   z event transitions must be a list)r\   r]   r^   r   listrJ   r_   r   s     r   load_transitionsrd      s6    ::dnngn67DdD!;<<Kr   c                    | j                         si S t        j                  | j                  d            }t	        |t
              st        d      |S )NrX   rY   z!tile class data must be an object)r[   r\   r]   r^   r   rI   rJ   rc   s     r   load_tile_classesrf      sD    ;;=	::dnngn67DdD!<==Kr   c                v   |dk  s|dk  s|| d   k\  s|| d   k\  ry|| d   z  |z   }| d   d   |   }| d   d   |   }|j                  | j                  d      i       }||g|j                  dg       v ry	||g|j                  d
g       v ry||j                  dg       v ry	||j                  dg       v ry|dkD  S )Nr   widthheightFlayersr
   tileset	passPairsT
blockPairspassblockr   )map_infotile_xtile_ytile_classesr<   layer0layer1entrys           r   tile_passablerx      s    zVaZ6Xg->#>&HU]L^B^Xg&&/Eh"5)Fh"5)FX\\)4b9E599["55599\26662&&7B''A:r   c                      d   }||z  }||z  dz
  }|dz   |z  |dz   |z  f|dz   |z  |dz   |z  f|dz   |z  |dz   |z  f|dz   |z  |dz   |z  fg}t         fd|D              S )NtileSize               c              3  @   K   | ]  \  }}t        ||        y wN)rx   ).0r   r   rq   rt   s      r   	<genexpr>z!standable_tile.<locals>.<genexpr>   s      Ntq!}Xq!\:Ns   )all)rq   rr   rs   rt   	tile_sizepixel_xpixel_yr1   s   `  `    r   standable_tiler      s    $Iy Gy 2%G
A+)	#gly%@A
B,9	$w|	&AB
A+)	#gly%@A
B,9	$w|	&AB	F NvNNNr   c                    | D ]:  }|j                  |d         }t        |      xr t        ||d   |d   |      |d<   < y )Nr(   r   r   sourceStandable)r   boolr   )rowsmapsrt   r=   r(   s        r   annotate_source_standabilityr      sQ     
#h-(L Ivs3xS<H 	
r   c                .    t        d | D        | d         S )Nc              3  D   K   | ]  }|j                  d       s|  ywr   Nrp   r   r=   s     r   r   z preferred_row.<locals>.<genexpr>   s     C0A(BC     r   )next)r   s    r   preferred_rowr      s    CCT!WMMr   c                   | j                         D ]  \  }}|d   }|d   }||vrt        | d      ||vrt        | d      ||   }|d   }|d   }|dk  s|dk  s||d   k\  s||d	   k\  rt        | d
      d|v sd|v std|vsd|vrt        | d      ||   }	|d   }
|d   }|
dk  s|dk  s|
|	d   k\  s	||	d	   k\  st        | d       y )Nr(   r)   z$: source map is missing from maps.jsz$: target map is missing from maps.jsr   r   r   rh   ri   z$: source point is outside map boundsrE   rF   rG   z*: spawn point is outside target map bounds)r:   rJ   )reviewsr   rO   reviewr(   r)   infor   r   target_inforT   rU   s               r   validate_mapsr      sA   }} UV!!u$HIJJu$HIJJF|3K3Kq5AEQ$w-/1X3Fu$HIJJvV!3v%)? C5(U!VWWv,KX&GX&G{gkWG8L-LPW[fgo[pPp C5(R!STT'Ur   c                ~    t        |       }|j                  |       t        t        |j                                     S r   )rI   updaterL   r:   )basepatchmergeds      r   merger      s-    $ZF
MM%v||~&''r   c           	        |D cg c]	  }|| vs| }}|j                         D cg c]1  \  }}|| v r(| |   j                  d      |j                  d      k7  r|3 }}}|j                         D cg c]1  \  }}|| v r(| |   j                  d      |j                  d      k(  r|3 }}}t        t              D ci c]  }|d }}t	               }	t	               }
|j                         D ]:  }||d   xx   dz  cc<   |	j                  |d          |
j                  |d          < t        |      t        |      t        |      t        |      |t        |	      t        |
      dS c c}w c c}}w c c}}w c c}w )NrC   r   r
   r(   r)   )patchRecordsaddedRecordschangedRecordsunchangedRecordsstatessourcesr.   )r:   r   rL   rK   r9   valuesaddlen)r   r   rO   addedr   changed	unchangedrC   r   r   r.   s              r   merge_summaryr      sx   !5SS_S5E5 !;;=C$;49==1VZZ5HH 	G  !;;=C$;49==1VZZ5HH 	I 
 %+6N35eQh3F3eGeG,,. &vg1$F8$%F8$%&
 E
E
g,	N'?'? % 6

 4s   	E+E+6E046E6>
E<c                N   | d   }t        d| d    d| d    d| d    d| d	    d
| 
       t        ddj                  d |j                         D              z          t        ddj                  | d         xs dz          t        ddj                  | d         xs dz          y )Nr   zmerge summary: patch records r   z, added r   z
, changed r   z, unchanged r   z, merged total zstates: , c              3  0   K   | ]  \  }}| d |   yw)=N )r   rC   counts      r   r   z&print_merge_summary.<locals>.<genexpr>  s     J<5%ugQug&Js   z	sources: r   -z	targets: r.   )printjoinr:   )summarymerged_countr   s      r   print_merge_summaryr      s    XF		 01 2() *+,- ./01 2$~	' 

))J6<<>J
J	K 
+79#56=#
>?	+79#56=#
>?r   c                4   g d}| j                         D ]  }|d   }|d   }|d   }|d   }|d   }d|v rd|v r|d    d	|d    nd
}|j                  d      xs d
}	|j                  d      }
|j                  d      xs |j                  d      	d|d   dnd
}d| d| d	| d| d	| d}|j                  d| d| d	| d| d| d| d|	 d|
|
nd
 d| d| d        | s|j                  d       |j                  d       dj                  |      S )N)z# Transition Reviews zPGenerated from `data/transition_reviews.json` via `tools/transition_reviews.py`.r   zJ| source | point | target | state | spawn | scene | kind | record | open |z8| --- | --- | --- | --- | --- | --- | ---: | --- | --- |r(   r   r   r)   rC   rE   rF   r'   r   r4   r5   r   r   0x08xz../web/game.html?map=z&startTile=z&focusTile=z&events=1&overview=1|  |  | `` | [open]() |%| - | - | - | - | - | - | - | - | - |r   
)r   r   appendr   )r   linesr   r(   r   r   r)   rC   spawnscenekindr   links                r   markdownr   	  s   E .." 
!3K3K!w 6!h&&8 h &"2!34 	
 

<(/Czz+&M* 
-3ZZ
-C-Ob
#C()UX 	 'vhk!AaSA3aPQsRfgA3as#fXSs5'UG3'tS1fX[cS	
#
* <=	LL99Ur   c                    g }t        | j                               D ]5  \  }}|j                  |      }|j                  i |||r|d   ndd       7 |S )NrC   
unreviewed)rO   rC   )rL   r:   r   r   )rM   r   r   rO   	candidater   s         r   gap_rowsr   -  sf    D / YS! 

(.VG_L
 	 Kr   c                \    dddd}| D ]   }|j                  |d   d      dz   ||d   <   " |S )Nr   )r   r   r   rC   r
   rp   )r   r   r=   s      r   gap_summaryr   9  sF    1A>G A 'CL! <q @GANr   c                    | d   | j                  d      xs | j                  d      xs d| j                  d      xs | j                  d      xs d| j                  d      | j                  d      fS dfS )Nr(   r   r   r   r4   r3   r5   rp   r=   s    r   record_group_keyr   @  s|    H;#''*"5;9!39r # 4 @	  GI	 r   c                T   i }| D ]  }t        |      }|j                  ||d   |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      g t               t               d	      }|d   j	                  |       |d	   j                  |d
          |d   j                  |d   |d   f        g }|j                         D ]0  }t        |d         }t        |d   d       }t        |d	         }t        |d         }	t        d |d   D              }
|j	                  i d|d   d|j                  d      d|j                  d      d|j                  d      d|j                  d      d|j                  d      dt        |d         dt        |      d|
dt        |      d|j                  dd      d|j                  dd      d|j                  dd      d	|d|d|	       3 t        |d       S )Nr(   r   r   r3   r4   r5   )	r(   r   r   r3   r4   r5   r   r.   r1   r   r.   r)   r1   r   r   c                    | d   | d   fS Nr
   r   r   r!   s    r   <lambda>zrecord_groups.<locals>.<lambda>b      E!HeAh;O r   rO   c              3  D   K   | ]  }|j                  d       sd  ywr   r
   Nrp   r   s     r   r   z record_groups.<locals>.<genexpr>e       WCCGGDU<VaWr   rowCount
pointCountstandableCounttargetCountr   r   r   r   firstc           	     j    | d   dk(  | d   | d    | d    | d    | d   | j                  d      xs dfS )	Nr   r   r   r   r   r(   r   r   rp   groups    r   r   zrecord_groups.<locals>.<lambda>|  sY    "#q(- #$$<  :(OIIm$*
 r   r   
setdefaultr   r9   r   r   r   r   rL   r   sumr   )r   groupedr=   rO   r   groupsr   r1   r.   r   standable_counts              r   record_groupsr   I  s   !#G 2s#""h-GGJ/"ww}5779-!ggl3 WW[15%

 	fS!iS]+hSXs3x01%2( F! 
U6]+h-OPy)*eFm,W5=WW%/EIIj1 uyy7 599Y/	
 eii5 UYY{3 Cf. c&k !/ s7| VZZQ7 FJJz15 fjjq9 7 &  !	

4 
 r   c                   i }| D ]  }g t        |      |d   }|j                  ||d   |d   |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d	      g t               d
      }|d   j	                  |       |d   j                  |d   |d   f        g }|j                         D ]=  }t        |d         }t        |d   d       }t        |d         }t        d |d   D              }	|j	                  i d|d   d|d   d|j                  d      d|j                  d      d|j                  d      d|j                  d      d|j                  d      d|j                  d      d	|j                  d	      dt        |d         dt        |      d|	d|j                  dd      d|j                  dd      d|j                  dd      d|d|       @ t        |d       S )Nr)   r(   r   r   r3   r4   r5   r6   r7   )r(   r)   r   r   r3   r4   r5   r6   r7   r   r1   r   r1   r   r   c                    | d   | d   fS r   r   r   s    r   r   ztarget_groups.<locals>.<lambda>  r   r   r   c              3  D   K   | ]  }|j                  d       sd  ywr   rp   r   s     r   r   z target_groups.<locals>.<genexpr>  r   r   r   r   r   r   r   r   r   r   c                j    | d   dk(  | d    | d    | d    | d   | j                  d      xs d| d   fS )	Nr   r   r   r   r(   r   r   r)   rp   r   s    r   r   ztarget_groups.<locals>.<lambda>  sX    "#q(#$$<  :(OIIm$*(O
 r   r   )
r   r   r=   rO   r   r   r   r1   r   r   s
             r   target_groupsr     s   !#G 25 %5s8}5""h-h-GGJ/"ww}5779-!ggl3 WW[1!$!9$'GG,>$?%
  	fS!hSXs3x01'2* F! 
U6]+h-OPeFm,W5=WW%/%/ EIIj1 uyy7	
 599Y/ eii5 UYY{3  ?!; #EII.@$A Cf. c&k !/ VZZQ7 FJJz15 fjjq9  &!" #	

4 
 r   c                   t        |       }g }|rt        |d       }|j                  |       |g}|g}|rm|j                         \  }}|dz
  |f|dz   |f||dz
  f||dz   ffD ]:  }||vr|j                  |       |j	                  |       |j	                  |       < |rm|j	                  t        |d              |rt        |d       S )Nc                    | d   | d   fS r   r   r   s    r   r   z&connected_components.<locals>.<lambda>  s    %(E!H1E r   r   r
   c                    | d   | d   fS r   r   r   s    r   r   z&connected_components.<locals>.<lambda>  s    uQxq>R r   c                6    | d   d   | d   d   t        |       fS Nr   r
   )r   	components    r   r   z&connected_components.<locals>.<lambda>  s&    Yq\!_iPQlSToWZ[dWe4f r   )r9   r   removepopr   rL   )	r1   	remaining
componentsstartstackr   r   r   neighbors	            r   connected_componentsr    s    FIJ
I#EFG	99;DAq!eQZ!a%aQZ!QUL +9,  *X&  *+  	&0RST  *"fggr   c                    | D cg c]  }|d   	 }}| D cg c]  }|d   	 }}t        |      t        |      t        |      t        |      fS c c}w c c}w r   )r   max)r1   r!   xsyss       r   component_boundsr    sW     &	'u%(	'B	' &	'u%(	'B	'r7CGSWc"g-- 
(	's
   AAc                L    | j                  d      }t        |t              r|S dS )Nr8   '  )r   r   r   )r=   r   s     r   row_active_distancer    s%    GG$%Euc*544r   c                   i }| D ]  }g t        |      |d   }|j                  ||d   |d   |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d	      i t               d
      }|d   |d   f}|d   j                  |g       j	                  |       |d   j                  |        g }|j                         D ]&  }t        |d         D ]  }|D cg c]  }|d   |   D ]  }|  }}}t        |      }	t        |      \  }
}}}t        |      }t        d |D              }t        d |D              }t        d |D              }t        |D ch c]  }|j                  d      r
|d   |d   f c}d       }t        d |D        d      }t        |D ch c]+  }|j                  d      rt        |      |k(  r
|d   |d   f- c}d       }|j	                  i d|d   d|d   d|j                  d      d|j                  d      d|j                  d      d|j                  d      d|j                  d      d|j                  d      d	|j                  d	      dt        |      dt        |      d|d|d|	j                  dd      d|	j                  dd      d |	j                  d d      d!|
|||f|dk\  rd n|||||d"        ) t        |d#       S c c}}w c c}w c c}w )$Nr)   r(   r   r   r3   r4   r5   r6   r7   )r(   r)   r   r   r3   r4   r5   r6   r7   rowsByPointr1   r   r   r  r1   c              3  2   K   | ]  }t        |        y wr   )r  r   s     r   r   z#component_groups.<locals>.<genexpr>  s     %Y3&9#&>%Ys   c              3  D   K   | ]  }|j                  d       sd  ywr   rp   r   s     r   r   z#component_groups.<locals>.<genexpr>  s     !\IZA[!!\r   c              3  j   K   | ]+  }|j                  d       r|j                  d      dk(  rd - yw)r   rC   r   r
   Nrp   r   s     r   r   z#component_groups.<locals>.<genexpr>  s5      -77,-#'''2Bl2R -s   13r   c                    | d   | d   fS r   r   r   s    r   r   z"component_groups.<locals>.<lambda>      58U1X"6 r   r   c              3  V   K   | ]!  }|j                  d       st        |       # ywr   )r   r  r   s     r   r   z#component_groups.<locals>.<genexpr>  s"     bcswwO`Ga$S)bs   ))r
  )defaultc                    | d   | d   fS r   r   r   s    r   r   z"component_groups.<locals>.<lambda>   r  r   r   r   r   unreviewedStandableCountr   r   r   r   bounds)r8   r1   reviewPointsactiveReviewPointsr   c           
         | d   dk(  t        |       | d    | d    | d   | j                  d      xs d| d   | d   d	   | d   d   f	S )
Nr   r   r   r(   r   r   r)   r  r
   r  r   r   s    r   r   z"component_groups.<locals>.<lambda>>  sq    &'1,	*'((|$$hMM-(.Bhh"h"

 r   )r   r   r   r9   r   r   r   r  r   r  r   r   r   rL   r  r   )r   r   r=   rO   r   r!   r   r1   component_rowsr   min_xmin_ymax_xmax_yr   min_active_distancer   unreviewed_standable_countreview_pointsnearest_standable_distanceactive_review_pointss                        r   component_groupsr&    s   !#G #5 %5s8}5""h-h-GGJ/"ww}5779-!ggl3 WW[1!$!9$'GG,>$?!%
  S3s8$m''r299#>hE")#, J! ;*5?; :	F/5]e}AUV[A\]#c]c]N] 0F)9&)A&E5%!.1E"%%Y.%Y"Y!!\~!\\O), -)- *&
 #  .ww01 Xs3x(
 7M *-b^b*& $*  .ww01+C04NN Xs3x( 7$  eHoeHo 		* 5 "599]#;	
 uyy3 !%))L"9  ;!7 $UYY%? '		2D(E N 3 !#f+ %o /0J  K!; 

:q 9  !&**\1"=!" ueUE:#$ /ID.PdVp$$1*>"-C:	;x 

 u ^s   !L>
"M(0M	c                    | d | D cg c]  \  }}| d|  }}}t        |       |kD  r!|j                  dt        |       |z
   d       |rdj                  |      S dS c c}}w )Nr'   + morer   r   r   r   r   )r1   limitr   r   showns        r   point_sampler-  L  so    $*6EN3DAqs!A3Z3E3
6{UqVu,-U34$499U-#- 4s   A!c                    | d | }t        |       |kD  r!|j                  dt        |       |z
   d       |rdj                  |      S dS )Nr(  r)  r   r   r*  )r.   r+  r,  s      r   target_sampler/  S  sN    FUOE
7|eqW-.e45$499U-#-r   c                L    | \  }}}}||k(  r||k(  r| d| S | d| d| d| S )Nr'   r   r   )r  r  r  r  r   s        r   bounds_textr1  Z  sK    !'E5%~%5.%!!WAeWAeWAeW--r   c                b    || d| | d| ddd}|r||d<   |r||d<   |  dt        |       S )Nr'   1)r-   	startTile	focusTileeventsoverviewtransitionTargettransitionRecord/game.html?r   )
web_prefixr(   r   r   r)   r   paramss          r   review_linkr=  a  sc     s!A3Zs!A3ZF %+!"%+!"\Yv%6$788r   c                    |d   }|d   dd|d   t        |d         t        |d         |d   t        |j                  d      xs |j                  d      xs d	      d
}|  dt        |       S )Nr   r)   r3  r(   r   r   r   r   r   )r-   r7  	collisionspawnReviewSourcespawnReviewXspawnReviewYspawnReviewTargetspawnReviewRecordr:  )r   r   r   )r;  r   r   r<  s       r   spawn_review_linkrE  w  s    gE""8_E#JE#J&x0 }!=!fzAZ!f^fg	F \Yv%6$788r   c                \   |j                  d      xs( |j                  d      xs |j                  d      xs g }|r|d   n|d   d   |d   d   f}|\  }}|d   d	| d
| |d   d}|j                  d      xs |j                  d      }|rt        |      |d<   |  dt        |       S )Nr  r  r1   r   r   r   r   r(   activeNearestr'   r)   )r-   trialTransitionsr4  r8  r   r   r9  r:  )r   r   r   )r;  r   r1   r   rr   rs   r<  r   s           r   trial_transition_linkrI    s    ]]/0rIMM.4QrU^UbUbckUlrprFF1Ii&8&=y?QRU?V%WENFF"+xq)%h/	F ]]=)FY]]:-FF%([!"\Yv%6$788r   c                \   | d   }g }| d   D ]  }t        ||d   |d   |d   ||j                  d            }|r?|j                  dt        j                  |       dt        j                  |       d	       l|j                  d
| d| d        |rdnd}|r|j                  |      S dS )Nr   r.   r(   r   r   r   z	<a href=""></a>[]() z<br>r   )r=  r   r   htmlescaper   )r   r;  
html_linksr   linksr)   href	separators           r   group_target_linksrW    s    'NEE	" 0:uXc
E#JPVX]XaXaboXpqLL9T[[%6$7r$++f:M9NdSTLL1VHBtfA./0 "vI$)9>>% 2s2r   c                	   t        |       }t        |       }t        |       }t        |       }ddddd|j	                  dd       d|j	                  dd       d	|j	                  d
d       dddt        |       dddt        |       dddt        |       ddddg}|D ]  }|d   }|d   dk(  r|d   d   nd }t        d|d   |d   |d   ||j	                  d            }	|d    d|d    d|d
    d}
|j                  d|d    d|d    d|d     d|d!    dt        |d       d|
 d|j	                  d"      xs d# d|j	                  d$      |j	                  d$      nd# d%|j	                  d      xs d# d&|	 d'        |s|j                  d(       |j                  g d)       |D ]  }|d   }t        d|d   |d   |d   |d*   |j	                  d            }	|d    d|d    d|d
    d}
|j                  d|d    d|d    d|d     d|d!    d+|d*    d,|	 d-|j	                  d.      xs d d|
 d|j	                  d"      xs d# d|j	                  d$      |j	                  d$      nd# d%|j	                  d      xs d# d&|	 d'        |s|j                  d(       |j                  g d/       |D ]  }|d   }t        d|d   |d   |d   |d*   |j	                  d            }	|d    d|d    d|d
    d}
|j                  d|d    d|d    d|d     d|d!    dt        |d0          d+|d*    d,|	 d-|j	                  d.      xs d d|
 d|j	                  d"      xs d# d|j	                  d$      |j	                  d$      nd# d%|j	                  d      xs d# d&|	 d'        |s|j                  d1       |j                  g d2       | D ]  }|d   }|d   }|d   }t        d||||d*   |j	                  d            }	|j                  d| d| d3| d|d*    d|d4    d|j	                  d"      xs d# d|j	                  d$      |j	                  d$      nd# d%|j	                  d      xs d# d&|	 d'        | s|j                  d5       |j                  d       d6j                  |      S )7Nz# Transition Review Gapsr   zOGenerated from `out/event_transitions.json` and `data/transition_reviews.json`.zConfirmed: r   r   z. Rejected: r   z. Unreviewed: r   .zRecord groups: zTarget groups: zConnected components: zW| source | rows | points | standable | targets | state | scene | kind | record | open |A| --- | ---: | ---: | ---: | --- | --- | --- | ---: | --- | --- |r   r   r
   r.   ../webr(   r   r   r   z confirmed, z rejected, z unreviewedr   r   r   r   r   r4   r   r5   r   r   r   r   )r   zV| source | rows | points | standable | target | state | scene | kind | record | open |rZ  r)    | [rN  z) r7   )r   z_| source | rows | points | standable | bounds | target | state | scene | kind | record | open |zG| --- | ---: | ---: | ---: | --- | --- | --- | --- | ---: | --- | --- |r  z)| - | - | - | - | - | - | - | - | - | - |)r   zB| source | point | target | state | scene | kind | record | open |z2| --- | --- | --- | --- | --- | ---: | --- | --- |r'   rC   z!| - | - | - | - | - | - | - | - |r   )r   r   r   r&  r   r   r=  r   rW  extendr1  r   )r   r   r   r.   r   r   r   r   r)   r   rC   r   r=   r(   r   r   s                   r   gap_markdownr^    sZ   $G4 FD!G!$'J"
Y

gkk+q12 3[[Q/0 1{{<34A	7 	
#f+a(

#g,q)

 Z 13
aK!E$  
g(-m(<(Ay!!$t8U8_eCj%*fV[V_V_`mVno[!",uZ/@.A\"#;0 	 	x!U:%6$7s5;N:OsSXYiSjRkkn!%233ugS<AXA_\_@``c).;)?)Kuyy%QTU V		-(/C0D6F	

 <=	LL	
  
g8U8_eCj%*eT\o_d_h_hiv_wx[!",uZ/@.A\"#;0 	 	x!U:%6$7s5;N:OsSXYiSjRk lh 4&5995G+H+NB*OsSXRYY\]b]f]fgs]t]{x{\||).;)?)Kuyy%QTU V		-(/C0D6F	

 <=	LL	
   
	'"(O#J#JhIIm$
 %&l9Z3H2I&'{4 	 	8$%S:)>(?s9\CZB[[^_hiy_z^{{~9X./0Yx5H4ID6QST]TaTabtTuT{y{S||  AF  @G  GJ}}\*1c2#-6]];-G-Sy}}[)Y\] ^m,34KvS	J	

* @A	LL	
  	
XHH8VQ3x=#''-BXYA3as#c(m_CG~Sww|$+,CP[H\Hh0Dnq/r s&-#.k$sD	
	
 89	LL99Ur   c                    i }| D ]&  }|j                  |d   g       j                  |       ( t        |      D ci c]  }|||   
 c}S c c}w )Nr(   )r   r   rL   )r   r   r=   r(   s       r   rows_by_sourcer`    sV    %'G :3x="-44S9:28/BFGFO#BBBs   Ac                   |j                  |       }|sy t        |ddd      \  }t        |      |d   }|d   |z  z  }|d   |z  z  }t        |D 	ch c]  }	|	d   |	d   f c}	d	 
      }
dfd}|
D ]  \  }}t	        ||z  |z        }t	        ||z  |z        }t        |dz   t	        |dz   |z  |z              }t        |dz   t	        |dz   |z  |z              }t        ||      D ]C  }t        ||      D ]2  }|||dz
  hv xs	 |||dz
  hv }|s||z   dz  dk(  s% ||||rdnd       4 E  t        |      D ]  }|d   \  }}}}t	        ||z  |z        }t	        ||z  |z        }t        |dz   t	        |dz   |z  |z              }t        |dz   t	        |dz   |z  |z              }t        ||      D ]  } |||d        |||dz
  d        t        ||      D ]  } |||d        ||dz
  |d         |dz  |  dz  }|j                  j                  dd       t        |t                     |S c c}	w )Ni  i@  layer1UnderSceneTilesetsrz   rh   ri   r   r   c                    | d   | d   fS r   r   r   s    r   r   z'render_source_overlay.<locals>.<lambda>%  s    uUVxY^_`YaNb r   r   c                h    | dk  s|dk  s
| k\  s|k\  ry |z  | z   dz  }t        |      ||dz    y Nr      bytes)r   r   coloroffsetcanvasri   rh   s       r   	set_pixelz(render_source_overlay.<locals>.set_pixel'  sE    q5AEQ%Z1;e)a-1$&+Elv
#r      r
   rf  r      \      ro     G   r  H      ro  transition_review_gaps.pngTparentsexist_okr   r   r   r   ri  ztuple[int, int, int]returnNone)r   r   	bytearrayrL   r   r  ranger&  parentmkdirr   rh  )r(   r   r   out_dirr   rgbr   scale_xscale_yr=   r1   rl  rr   rs   x0y0x1y1r   r   borderr   r  r  r  r   r_   rk  ri   rh   s                              @@@r   render_source_overlayr    s   88FD)$S:TUE63s^FZ ItG}y01GX23GT:cc#hC):@bcF3 ! 	R)#g-.)#g-.afqjI5?@AafqjI5?@Ar2 	RA2r] Rr26l*?aBQ<.?a!eq[A-afN.QR	R	R &d+ 1	%.x%8"ueU"W,-"W,-aeai94w>?@aeai94w>?@r2 	1Aa^,aa0	1 r2 	1Ab!^,b1fa0	11 --6($?DKKdT2dE65=1KG ;s   Ic                    | d   \  }}}}t        | j                  d      xs | j                  d      xs d      j                  dd      }d| d    d	| d
    d	| d	| d	| d	| d	| dS )Nr  r   r   r   r   r   
component_r(   _r)   ry  r   r   replace)r   r  r  r  r   r   s         r   component_preview_namer  K  s    !*8!4E5%}-Vz1JVhW__`dfhiF
Yx()9X+>*?q'5'5'5'	/r   c           
     J   i }|r| j                  dg       }n|dk(  r| d   n| d   }|D ]W  \  }}t        | d   ||| d   t        |             }| d   ||| d   |d}dD ]  }	| j                  |	      | |	   ||	<    |||<   Y t        t	        |j                                     S )	Nr  r   r  r1   r(   r)   rD   rH   )r   r+   r   rI   rL   r:   )
r   rC   nearestr   r1   r   r   rO   r   rQ   s
             r   component_review_patchr  T  s    E3R8.3{.B>*	RZH[ 1hhy!
  ))
 | 	1E}}U#/ )% 0u	1 c
%& u{{}%&&r   c                    | d   \  }}}}t        | j                  d      xs | j                  d      xs d      j                  dd      }|r| dn|}| d    d	| d
    d	| d	| d	| d	| d	| d	| S )Nr  r   r   r   r   r   _nearestr(   r  r)   r  )	r   rC   r  r  r  r  r   r   suffixs	            r   patch_file_stemr  p  s    !*8!4E5%}-Vz1JVhW__`dfhiF#*whFX
q8!4 5Qvha'5'5'5'6(	4r   c                   |dz  }|j                         rt        j                  |       |j                  dd       g }t	        |       D ]7  }dD ].  \  }}|dk(  r|j                  d      s|r|j                  d      s2t        |||      }|sBt        |||       d}||z  j                  t        j                  |d	d
      dz   d       |j                  d| |d   |d   ||rdnd|j                  d      |j                  d      |j                  d      |d   d   |d   d   |d   d
   |d   d   dt        |      |j                  dd      |j                  d      |j                  dd      d       1 : |j                  d  !       |d"z  j                  t        j                  |d	d
      dz   d       g d#}	|D ]  }
|
d   }t        |d$   |d%   |d&   |d'   f      }|	j                  d(|
d    d)|
d    d)|
d*    d)|
j                  d+d,       d)| d)|
d-    d)|
d    d)|
j                  d      |
j                  d      nd, d.t        |
d/         j                    d0|
d/    d1        |S )2Ntransition_review_patchesTrz  ))r   T)r   F)r   Fr   r  r  z.jsonFrm  ensure_asciiindentr   rX   rY   ztransition_review_patches/r(   r)   zactive-nearestr   r   r4   r5   r  r   r
   rf  )minXminYmaxXmaxYr   r8   r  )r_   r(   r)   rC   scoper   r4   r5   r  recordsr   r8   r  c                b    | d   | d   | j                  d      xs d| d   d   | d   d   | d   fS )	Nr(   r)   r   r   r  r  r  rC   rp   r   s    r   r   z,write_review_patch_outputs.<locals>.<lambda>  sG    HH$"HfHfG  r   r   ztransition_review_patches.json)z# Transition Review Patchesr   z_Generated component-level JSON patches for `tools/transition_reviews.py --merge ... --dry-run`.r   zX| source | target | state | scope | bounds | records | standable | active dist | patch |z:| --- | --- | --- | --- | --- | ---: | ---: | ---: | --- |r  r  r  r  r   r   rC   r  r   r  r\  r_   rN  r   )r[   shutilrmtreer  r&  r   r  r  
write_textr\   dumpsr   r   sortr1  r   name)r   r  	patch_dirr<   r   rC   r  r   filenamer   r=   r  bounds_labels                r   write_review_patch_outputsr  z  s   55Ii OOD4O0E%d+ !	^  	NE7#IMM.,Iy}}-AB*9eWEE))UGDEUKH!--

5uQ?$F  .  LL4XJ?#H-#H--4)+(}}];'mmL9&]];7%h/2%h/2%h/2%h/2	 u:"+--0@!"D"+--0@"A,5MM:TVW,X%  	!F 
JJ J  //;;

5uQ7$> < E  
X"F6NF6NF6NTZ[aTb#cdXs3x=/S\N#cgggWZF[E\\_`l_mmp9~c#&6"7!8Y\Y`Y`aqYrY~CGGDT<U  EH  <I IS[!&&'r#f+c;	

 Lr   c           
        |rdnd}|dk(  r,| j                  |      sd}dt        j                  |       dS t        j                  t        j                  t        | ||      d      d	
      }|rd}d}n|rd}d}n|dk(  rdnd}|dk(  rdnd}|rdnd}dt        j                  |       d| d| dt        j                  |       d	S )Nr  r  r   zno standable confirmz<button type="button" disabled>z	</button>F)r  T)quotezadd confirm+spawn JSONzadded confirm+spawn JSONzadd confirm nearest JSONzadded confirm nearest JSONzadd confirm JSONzadd reject JSONzadded confirm JSONzadded reject JSONz data-spawn="1"r   z;<button type="button" class="review-copy" data-done-label="z" data-review-patch="">)r   rQ  rR  r\   r  r  )	r   rC   
with_spawnr  	point_keylabelr   done
spawn_attrs	            r   component_review_buttonr    s    (/$^IIMM)$<&0U1C0DINNKK

#9)UG#TchiquvE()	*+&+{&:"@Q',';#AT&0"bJ
EdkkRVFWEX Y#WAj\4;;u3E2Fi	Qr   c           	     f  !"#$%&'( |j                  |       }|sy t        |ddd      \  ($}|d   '(|d   'z  z  %$|d   'z  z  &|dz  }|j                  dd	       d$%&'(fd}t        |      D ]7  } ||d
         \  }	}
}}t	        d||	z
        #t	        d||
z
        "t               !t        |
|      D ])  }|(z  |	z   dz  }|#dz  z   }!j                  |||        + d!"#fd}|d   D ]  \  }}t        |'z  %z        |	z
  }t        |'z  &z        |
z
  }t	        |dz   t        |dz   'z  %z        |	z
        }t	        |dz   t        |dz   'z  &z        |
z
        }t        ||      D ]C  }t        ||      D ]2  }|||dz
  hv xs	 |||dz
  hv }|s||z   dz  dk(  s% ||||rdnd       4 E  |d
   \  }}}}t        |'z  %z        |	z
  }t        |'z  &z        |
z
  }t	        |dz   t        |dz   'z  %z        |	z
        }t	        |dz   t        |dz   'z  &z        |
z
        } t        ||      D ]  } |||d        ||| dz
  d        t        ||       D ]  } |||d        ||dz
  |d        t        |t        |      z  #"t        !             : y )Ni  i  rb  rz   rh   ri   rx  Trz  r  c                2   | \  }}}}t        |z  z        }t        |z  z        }t        |dz   t        |dz   z  z              }t        |dz   t        |dz   z  z              }d}	t        d||	z
        }
t        d||	z
        }t        ||	z         }t        ||	z         }||
z
  dk  r,d||
z
  z
  dz   dz  }t        d|
|z
        }
t        ||z         }||z
  dk  r,d||z
  z
  dz   dz  }t        d||z
        }t        ||z         }|
|||fS )Nrf  r
   *   r   x   rm  )r   r  r   )r  r  r  r  r   r  r  r  r  margincx0cy0cx1cy1extrari   r  r  r   rh   s                  r   crop_boundsz.render_component_previews.<locals>.crop_bounds  sY   %+"ueU"W,-"W,-aeai94w>?@aeai94w>?@!R&[!!R&[!%f%&"v+&9s?C#I&*q0Eau%CeS5[)C9s?C#I&*q0Eau%CfcEk*CCc!!r   r
   rf  c                h    | dk  s|dk  s
| k\  s|k\  ry |z  | z   dz  }t        |      ||dz    y re  rg  )r   r   ri  rj  cropcrop_height
crop_widths       r   rl  z,render_component_previews.<locals>.set_pixel  sG    1uAjA4D*nq(A-F(-eD&1*%r   r1   rm  r   ru  rr  rn  )r  tuple[int, int, int, int]r~  r  r}  )r   r   r  r&  r  r  r  r]  r   r   r  rh  ))r(   r   r   r  r   r  preview_dirr  r   r  r  r  r  r   r   endrl  rr   rs   r  r  r  r  r   r  r  r  r  r   bx0by0bx1by1r  r  r  ri   r  r  r   rh   s)                                    @@@@@@@@r   render_component_previewsr    sZ   88FD)$S:TUE63Z ItG}y01GX23G44KdT2" "* &d+ 'i	(8)<=S#sC#I&
!S3Y'{sC 	(AY_)E*q.(CKKE#'	(
	5 (1 		VNFFVi''12S8BVi''12S8BR!VS&1*	!9G!CDsJKBR!VS&1*	!9G!CDsJKB2r] Vr2 VA2rAv,.C!BF|2CF!a%1!1!!Q&nUVV		V &/x%8"ueU%)#g-.4%)#g-.4#'3	Y6@ACGH#'3	Y6@ACGHsC 	2Aan-aq.1	2 sC 	2Ac1n-cAgq.1	2 	+ 6y AA:{\abf\ghO'ir   c                    |dz  }|j                  dd       t        | D ch c]  }|d   	 c}      D ]=  }|j                  |      }|st        |ddd      \  }}}	t	        |d| d	z  |||	       ? y c c}w )
Nrx  Trz  r)         rb  target_ry  )r  rL   r   r   r   )
r   r   r  
target_dirr=   r)   r   rh   ri   r  s
             r   render_target_previewsr  #  s    33JTD148C#h-89 Kxx-dC>XYvs*55ufcJK8s   A6c                   g }t        | D ch c]  }|d   	 c}      D ]  }||vr| dt        |ddd       }|j                  dj                  dt	        j
                  |      z   dz   dt	        j
                  |       d	t	        j
                  |       d
dt	        j
                  |       ddg              |sydj                  |      S c c}w )Nr)   r:  r3  )r-   r7  r?  r   z<a class="target-card" href="rK  z*  <img class="target-preview" src="target_.png" alt="z
 preview">z  <span>z</span>rL  z6<p class="muted">No target map previews available.</p>)rL   r   r   r   rQ  rR  )r   r   r;  cardsr=   r)   rU  s          r   target_preview_cardsr  .  s    E48C#h-89 
[6sad3e)f(ghII3dkk$6GG$N@VAT@UU`aealalmsat`uu  At{{6237;			
	
 G99U! 9s   Cc                   g }t        |       j                         D ]`  \  }}t        |      }|j                  |t	        |      |j                  dd      |j                  dd      |j                  dd      d       b t        |d       S )Nr   r   r   r   )r(   r   r   r   r   c                    | d    | d   fS )Nr   r(   r   r   s    r   r   z source_summary.<locals>.<lambda>N  s    S->,>H+N r   r   )r`  r:   r   r   r   r   rL   )r   r   r(   source_rowsr   s        r   source_summaryr  C  s    G-d399; [)$K3

:q1 **\15
 	 'NOOr   c           	        | D ci c]}  }|d   |j                  d      xs |j                  d      xs d|j                  d      xs |j                  d      xs d|j                  d      |j                  d      ndf|d    }}g }|D ]  }|d   |j                  d      xs |j                  d      xs d|j                  d      xs |j                  d      xs d|j                  d      |j                  d      ndf}|j                  d	d
      d
k  rt        |      }|j                  |d      |d<   |j                  |        t        |d       S c c}w )Nr(   r   r   r   r4   r3   r5   r   r  r   c   c           
         t        |       | d   | d    | d    | d   | j                  d      xs d| d   | d   d	   | d   d
   f	S )Nr   r  r   r(   r   r   r)   r  r
   r   r  r   s    r   r   z,priority_review_components.<locals>.<lambda>j  sk    	*m$122|$$hMM-(.Bhh"h"

 r   r   )r   rI   r   rL   )r   r   r   target_countsr   r   rO   items           r   priority_review_componentsr  Q  sv      (OIIm$C		*(=CIIl#Auyy';Ar&+ii&<&HEIIk"b		

 	 M  D 	hMM-(KIMM*,EKMM,'I9==+CIr*3--*D*PIMM+&VX	
 ==3Q71<I+//R8]D 

 -s   BEc                    t        |       }t        |       }t        |       }t        |       }t	        |       }t        ||      }g }|D ]s  }	|	d   }
|	d   dk(  r|	d   d   nd }t        ||
d   |
d   |
d   ||
j                  d	            }d
|	d    d}|j                  dj                  ddt        j                  |       dt        j                  |	d          dd|	d    dd|	d    dd|	d    ddt        |	|d       dd|	d    dd|	d    dd|	d    ddt        j                  |	j                  d      xs d       dd|	j                  d      |	j                  d      nd ddt        j                  |	j                  d	      xs d       ddt        j                  |       d d!g             v g }|D ]~  }d
|d    d}|j                  dj                  ddt        j                  |       dt        j                  |d          dd|d"    dd|d    dd|d    dd|d    dd!g              g }|D ]  }	|	d   }
t        ||
d   |
d   |
d   |	d#   |
j                  d	            }|j                  dj                  dd$t        j                  |	d          d%t        j                  |	d          dd|	d    dd|	d    dd|	d    ddt        j                  |       dt        j                  |	d#          ddt        j                  |	j                  d&      xs d       dd|	d    dd|	d    dd|	d    ddt        j                  |	j                  d      xs d       dd|	j                  d      |	j                  d      nd ddt        j                  |	j                  d	      xs d       ddt        j                  |       d d!g              g }|D ]N  }|d   }
t        ||
d   |
d   |
d   |d#   |
j                  d	            }t        ||      }t        ||      }|j                  dj                  dd$t        j                  |d          d%t        j                  |d          dd|d    dd|d    dd|d    dd|j                  d'd       dd|j                  d(      |j                  d(      nd ddt        j                  t        |d)                ddt        j                  |       dt        j                  |d#          ddt        j                  |j                  d&      xs d       dd|d    dd|d    dd|d    ddt        j                  |j                  d      xs d       dd|j                  d      |j                  d      nd ddt        j                  |j                  d	      xs d       ddt        j                  |       d*t        j                  |       d+t        j                  |       d,d!g             Q g }|d d- D ]  }|d   }
t        ||
d   |
d   |
d   |d#   |
j                  d	            }t        ||      }t        ||      }d
|d    d}|j                  dj                  dd.t        j                  t!        |             d/t        j                  |d          d0t        j                  t        |d)                d1dt        j                  |       dt        j                  |d          dd|d    dd|d    dd|j                  dd       dd|d    dd|j                  d'd       dd|j                  d(      |j                  d(      nd ddt        j                  t        |d)                ddt        j                  |       dt        j                  |d#          ddt        j                  |j                  d&      xs d       dd|d    ddt        j                  |j                  d      xs d       ddt        j                  |j                  d	      xs d       ddt        j                  |       d*t        j                  |       d+t        j                  |       d,d2t#        |dd3       d0t#        |d       d0t#        |dd       d0t#        |d       d	d!g              dj                  g d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdW|j                  dd       dXdW|j                  dd       dYdW|j                  dd       dZdWt%        |       d[dWt%        |       d\dWt%        |       d]dWt%        |       d^dWt%        |       d_d`dadbdcdddedfdgdhdidj|rdj                  |      ndkdldmdndodhdpdjdj                  |      dldmdqdrdhdsdjdj                  |      dldmdtdudhdvdjdj                  |      dldmdwdhdxdjdj                  |      dldmdydz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dddddddddddddddd      S )Nr   r   r
   r.   r   r(   r   r   r   ztransition_review_gaps/.htmlr   <tr>  <td><a href="rK  	</a></td>  <td>r   </td>r   r     <td class="target-links">Tr   r   r   r4   r   r5     <td><code></code></td>">open</a></td></tr>r   r)   z&  <td><a href="transition_review_gaps/z.html">r7   r  r8   r  ">open</a><br><a href="'">trial active-nearest</a><br><a href="">choose spawn</a></td>(   zA  <td><img class="component-preview" src="transition_review_gaps/" alt="rP   preview"></td>  <td class="review-actions">r  <!doctype html><html lang="en"><head>  <meta charset="utf-8">F  <meta name="viewport" content="width=device-width, initial-scale=1">z'  <title>Transition Review Gaps</title>	  <style>d    :root { color-scheme: dark; font-family: system-ui, sans-serif; background: #111; color: #eee; }&    body { margin: 0; padding: 24px; },    h1 { margin: 0 0 8px; font-size: 24px; }M    p { margin: 0 0 16px; color: #bbb; max-width: 980px; line-height: 1.45; }zP    .summary { display: flex; flex-wrap: wrap; gap: 10px; margin: 16px 0 18px; }zc    .metric { border: 1px solid #333; background: #181818; border-radius: 6px; padding: 9px 11px; }z7    .metric strong { display: block; font-size: 18px; }z2    .metric span { color: #aaa; font-size: 12px; }0    h2 { margin: 26px 0 10px; font-size: 18px; }F    table { width: 100%; border-collapse: collapse; font-size: 13px; }zT    th, td { border-bottom: 1px solid #303030; padding: 7px 8px; text-align: left; }z,    th { background: #181818; color: #ddd; }z.    td:nth-child(n+2) { white-space: nowrap; }    .component-preview { image-rendering: pixelated; width: 128px; height: 96px; object-fit: contain; background: #080808; border: 1px solid #333; }>    .review-actions { white-space: normal; min-width: 160px; }    .review-copy { display: block; width: 100%; margin: 0 0 5px; padding: 5px 7px; border: 1px solid #3a3a3a; border-radius: 5px; background: #202020; color: #ddd; cursor: pointer; }/    .review-copy:hover { background: #2a2a2a; }R    .basket-actions { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 8px; }    .basket-actions button { padding: 6px 9px; border: 1px solid #3a3a3a; border-radius: 5px; background: #202020; color: #ddd; cursor: pointer; }      #reviewPatchBox { width: min(100%, 960px); min-height: 160px; margin: 0 0 18px; background: #080808; color: #eee; border: 1px solid #333; border-radius: 6px; padding: 10px; font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 12px; }z0    a { color: #7cc7ff; text-decoration: none; }z+    a:hover { text-decoration: underline; }
  </style></head><body>z!  <h1>Transition Review Gaps</h1>z  <p>Candidate field-map transitions grouped by source map. Open a source page to inspect coordinates and mark reviews in the web runtime.</p>z  <section class="summary">z     <div class="metric"><strong>z%</strong><span>confirmed</span></div>z$</strong><span>rejected</span></div>z&</strong><span>unreviewed</span></div>z)</strong><span>record groups</span></div>z)</strong><span>target groups</span></div>z&</strong><span>components</span></div>z/</strong><span>priority components</span></div>z'</strong><span>source maps</span></div>z  </section>  <div class="basket-actions">L    <button id="copyBasket" type="button" hidden>copy review basket</button>G    <button id="clearBasket" type="button" hidden>clear basket</button>  </div>e  <textarea id="reviewPatchBox" hidden readonly aria-label="transition review JSON patch"></textarea>z  <h2>Priority Queue</h2>z  <p>These connected components still have unreviewed standable source tiles. Components nearest the scene active point are listed first, then records with fewer destination maps.</p>	  <table>a.      <thead><tr><th>preview</th><th>source</th><th>rows</th><th>points</th><th>targets</th><th>standable</th><th>unreviewed standable</th><th>active dist</th><th>bounds</th><th>target</th><th>target scene</th><th>unreviewed</th><th>scene</th><th>record</th><th>open</th><th>review JSON</th></tr></thead>    <tbody>zB<tr><td colspan="16">No unreviewed standable components.</td></tr>    </tbody>
  </table>  <h2>Record Groups</h2>zo  <p>Start here: these rows collapse repeated coordinate and target permutations into source event records.</p>z    <thead><tr><th>source</th><th>rows</th><th>points</th><th>standable</th><th>targets</th><th>confirmed</th><th>rejected</th><th>unreviewed</th><th>scene</th><th>kind</th><th>record</th><th>open</th></tr></thead>  <h2>Target Groups</h2>zY  <p>Use this table when one source event record points at multiple destination maps.</p>z    <thead><tr><th>source</th><th>rows</th><th>points</th><th>standable</th><th>target</th><th>target scene</th><th>confirmed</th><th>rejected</th><th>unreviewed</th><th>scene</th><th>kind</th><th>record</th><th>open</th></tr></thead>  <h2>Connected Components</h2>zc  <p>Use this table to review each contiguous transition area, such as a doorway or edge strip.</p>a*      <thead><tr><th>source</th><th>rows</th><th>points</th><th>standable</th><th>unreviewed standable</th><th>active dist</th><th>bounds</th><th>target</th><th>target scene</th><th>confirmed</th><th>rejected</th><th>unreviewed</th><th>scene</th><th>kind</th><th>record</th><th>open</th></tr></thead>z  <h2>Source Maps</h2>zn    <thead><tr><th>source</th><th>rows</th><th>confirmed</th><th>rejected</th><th>unreviewed</th></tr></thead>
  <script>    (() => {<      const box = document.getElementById('reviewPatchBox');?      const copyBasket = document.getElementById('copyBasket');A      const clearBasket = document.getElementById('clearBasket');      const basket = {};4      const updateBasket = async (copy = false) => {1        const count = Object.keys(basket).length;4        box.value = JSON.stringify(basket, null, 2);!        box.hidden = count === 0;(        copyBasket.hidden = count === 0;)        clearBasket.hidden = count === 0;A        copyBasket.textContent = `copy review basket (${count})`;1        if (count) { box.focus(); box.select(); }g        if (copy && count) { try { await navigator.clipboard.writeText(box.value); } catch (error) {} }      };G      for (const button of document.querySelectorAll('.review-copy')) {)        const label = button.textContent;6        button.addEventListener('click', async () => {G          const patch = JSON.parse(button.dataset.reviewPatch || '{}');-          if (button.dataset.spawn === '1') {<            const text = prompt('target spawn tile as x,y');            if (!text) return;M            const parts = text.split(',').map((part) => Number(part.trim()));r            if (parts.length !== 2 || !parts.every(Number.isInteger)) { alert('spawn tile must be x,y'); return; }n            for (const review of Object.values(patch)) { review.spawnX = parts[0]; review.spawnY = parts[1]; }          }'          Object.assign(basket, patch);#          await updateBasket(true);zC          button.textContent = button.dataset.doneLabel || 'added';B          setTimeout(() => { button.textContent = label; }, 1200);        });      }E      copyBasket.addEventListener('click', () => updateBasket(true));3      clearBasket.addEventListener('click', () => {B        for (const key of Object.keys(basket)) delete basket[key];        updateBasket(false);	      });	    })();  </script></body></html>r   )r   r  r   r   r&  r  r=  r   r   r   rQ  rR  rW  rE  rI  r1  r  r  r   )r   r;  r   r  r   r.   r   priority_componentsgroup_cardsr   r   r)   	open_hrefsource_hrefsource_cardsr=   rU  target_cardscomponent_cardsr   
spawn_href
trial_hrefpriority_cardss                          r   gap_htmlrO  x  s*   $G &K4 FD!G!$'J4VZHK 
g(-m(<(Ay!!$t
E(OU3ZsU[]b]f]fgt]uv	/h/@FII%dkk+&>%?r$++eT\oB^A__hiU:./u5U<017U#345U;12DUJX\2]1^^cdU;/06U:./u5U<017T[[<)@)GCHIOuyy7M7YUYY{3_bcchi"4;;uyy/G/N3#O"PP\]%dkk)&<%=_M	

2 L 
(Xu=II%dkk$&7%84;;s8};U:VV_`S[M/S-.e4S_-U3S./u5
	

 L 
g
E(OU3ZsUZ[cUdfkfofop}f~	II<T[[x=Y<ZZabfbmbmnst|n}b~a  @I  JU:./u5U<017U#345U;%dkk)&<%=RERZO@\?]]fgT[[3E)F)M#NOuUU;/06U:./u5U<017T[[<)@)GCHIOuyy7M7YUYY{3_bcchi"4;;uyy/G/N3#O"PP\]%dkk)&<%=_M	

0 O #
	'"(O#J#JhIIm$
	 'z9=
*:yA
II<T[[S[I\=]<^^efjfqfqr{  }E  sF  gG  fH  HQ  RYz2359Y|45U;Y'789?Y]]+EqIJ%P	N^@_@kY]]+;<qtuuz{T[[Yx5H)IJK5Q%dkk)&<%=RIV^L_@`?aajkT[[7I)J)QcRSSXYY{34E:Yz2359Y|45U;T[[|)D)KLMUS9==;U;aY]];7gjkkpq"4;;y}}]/K/Rs#S"TT`a%dkk)&<%==TUYU`U`akUlTm  nU  VZ  Va  Va  bl  Vm  Un  nE  F%	
#
H N("- $
	'"(O#J#JhIIm$
	 'z9=
*:yA
/	(0C/DEJIIWX\XcXcdz  |E  eF  YG  XH  HO  PT  P[  P[  \e  fn  \o  Pp  Oq  qr  sw  s~  s~  J  KT  U]  K^  _  s`  ra  ap  q%dkk+&>%?r$++iX`NaBbAcclmYz2359Y|45U;Y]]=#>?uEY'789?Y]]+EqIJ%P	N^@_@kY]]+;<qtuuz{T[[Yx5H)IJK5Q%dkk)&<%=RIV^L_@`?aajkT[[7I)J)QcRSSXYY|45U;T[[|)D)KLMUS"4;;y}}]/K/Rs#S"TT`a%dkk)&<%==TUYU`U`akUlTm  nU  VZ  Va  Va  bl  Vm  Un  nE  F34KIWblp4q3rrs  uL  MV  Xc  ud  te  ef  g~  H  JU  W[  g\  f]  ]^  _v  w@  BL  _M  ^N  NS  T%	
$
J 99D	
D	
D	
 D	
 '	D	

 UD	
 6D	
 D	
 sD	
 5D	
 ;D	
 \D	
 _D	
 rD	
 FD	
 AD	
  ?!D	
" U#D	
$ c%D	
& ;'D	
( =)D	
* c+D	
, M-D	
. E/D	
0 >1D	
2 a3D	
4 a5D	
6 R7D	
8 ?9D	
: :;D	
< =D	
> ?D	
@ AD	
B 0CD	
D ]ED	
F *GD	
H /w{{;/J.KKpqID	
J /w{{:q/I.JJnoKD	
L /w{{</K.LLrsMD	
N /s6{m;deOD	
P /s7|n<efQD	
R /s:.??efSD	
T /s3F/G.HHwxUD	
V /s;/?.@@ghWD	
X YD	
Z -[D	
\ []D	
^ V_D	
` aD	
b tcD	
d (eD	
f FgD	
h iD	
j }kD	
l mD	
n *8DIIn%  >BoD	
p qD	
r sD	
t 'uD	
v ~wD	
x yD	
z e{D	
| }D	
~ IIk"D	
@ AD	
B CD	
D 'ED	
F hGD	
H ID	
J yKD	
L MD	
N IIl#OD	
P QD	
R SD	
T .UD	
V rWD	
X YD	
Z y[D	
\ ]D	
^ IIo&_D	
` aD	
b cD	
d %eD	
f gD	
h }iD	
j kD	
l IIl#mD	
n oD	
p qD	
r sD	
t uD	
v KwD	
x NyD	
z P{D	
| '}D	
~ CD	
@ @AD	
B CCD	
D 0ED	
F 7GD	
H 8ID	
J PKD	
L @MD	
N vOD	
P QD	
R VSD	
T 8UD	
V EWD	
X VYD	
Z <[D	
\ K]D	
^ -_D	
` \aD	
b AcD	
d }eD	
f gD	
h 6iD	
j 2kD	
l RmD	
n QoD	
p qD	
r sD	
t TuD	
v BwD	
x QyD	
z +{D	
| }D	
~ D	
@ AD	
B CD	
D ED	
F GD	
F Fr   c           "     Z   t        |      }t        |      }t        |      }t        |      }g }|D ]]  }	|	d   }
|	d   dk(  r|	d   d   nd }t	        ||
d   |
d   |
d   ||
j                  d	            }|j                  d
j                  dd|	d    dd|	d    dd|	d    ddt        j                  t        |	d                ddt        |	|d       dd|	d    dd|	d    dd|	d    ddt        j                  |	j                  d      xs d       dd|	j                  d      |	j                  d      nd ddt        j                  |	j                  d	      xs d       ddt        j                  |       ddg             ` g }|D ]  }	|	d   }
t	        ||
d   |
d   |
d   |	d   |
j                  d	            }|j                  d
j                  dd|	d    dd|	d    dd|	d    ddt        j                  t        |	d                ddt        j                  |       d t        j                  |	d          d!dt        j                  |	j                  d"      xs d       dd|	d    dd|	d    dd|	d    ddt        j                  |	j                  d      xs d       dd|	j                  d      |	j                  d      nd ddt        j                  |	j                  d	      xs d       ddt        j                  |       ddg              g }|D ]  }|d   }
t	        ||
d   |
d   |
d   |d   |
j                  d	            }t        ||      }t        ||      }|j                  d
j                  dd#t        j                  t        |             d$t        j                  |        d%t        j                  t        |d&                d'd|d    dd|d    dd|d    dd|j                  d(d       dd|j                  d)      |j                  d)      nd ddt        j                  t        |d&                ddt        j                  t        |d                ddt        j                  |       d t        j                  |d          d!dt        j                  |j                  d"      xs d       dd|d    dd|d    dd|d    ddt        j                  |j                  d      xs d       dd|j                  d      |j                  d      nd ddt        j                  |j                  d	      xs d       ddt        j                  |       d*t        j                  |       d+t        j                  |       d,d-t!        |dd.       d%t!        |d       d%t!        |dd       d%t!        |d       d	dg              g }|D ]B  }t	        ||d   |d   |d   |d   |j                  d	            }|j                  d
j                  dd|d    d/|d    ddt        j                  |d          dd0t        j                  |d1          d t        j                  |d1          ddt        j                  |j                  d      xs d       dd|j                  d      |j                  d      nd ddt        j                  |j                  d	      xs d       ddt        j                  |       ddg	             E d
j                  g d2d3d4d5d6d7t        j                  |        d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTt        j                  |        dUdV|j                  dd       dW|j                  dd       dX|j                  dd       dYdZd[t        j                  |        d\t        j                  |        d]d^d_t#        |||      d`dadbdcd`dddedfdgdhd
j                  |      didjdkdfdldhd
j                  |      didjdmdfdndhd
j                  |      didjdodfdpdhd
j                  |      didjdqdrdsdtdudvdwdxdydz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dddddddd      S )Nr   r   r
   r.   r   r(   r   r   r   r   r  r  r   r  r   r   r1   r  Tr   r   r   r4   r   r5   r  r  r  r  r  r)   rK  r  r7   z*  <td><img class="component-preview" src="r  rP  r  r  r  r8   r  r  r  r  r  r'   z  <td class="rC   r  r  r  r  r  z	  <title>z Transition Review Gaps</title>r  r   r  r  r  r  r  zi    th, td { border-bottom: 1px solid #303030; padding: 7px 8px; text-align: left; vertical-align: top; }zF    th { position: sticky; top: 0; background: #181818; color: #ddd; }z    .map-preview { image-rendering: pixelated; max-width: min(100%, 480px); height: auto; border: 1px solid #333; background: #080808; }z    .target-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); gap: 12px; margin: 10px 0 18px; max-width: 1120px; }z    .target-card { display: block; border: 1px solid #303030; border-radius: 6px; background: #181818; padding: 8px; color: #ddd; }zX    .target-card span { display: block; margin-top: 6px; font-size: 12px; color: #bbb; }zy    .target-preview { image-rendering: pixelated; width: 100%; height: 110px; object-fit: contain; background: #080808; }r  r  r  r	  r
  r  r  z`    .confirmed { color: #9ef0b8; } .rejected { color: #ffb0b0; } .unreviewed { color: #ffe2a8; }z    .muted { color: #888; }zX    a { color: #7cc7ff; text-decoration: none; } a:hover { text-decoration: underline; }r  r  r  z  <h1>z Transition Review Gaps</h1>z  <p>Confirmed z, rejected z, unreviewed zN. Start with record groups, then inspect individual rows only when needed.</p>z;  <p><a href="../transition_review_gaps.html">index</a></p>z#  <p><img class="map-preview" src="r  z# transition candidate overlay"></p>z  <h2>Target Map Previews</h2>z  <div class="target-grid">r  r  r  r  r  r  r  z    <thead><tr><th>rows</th><th>points</th><th>standable</th><th>sample points</th><th>targets</th><th>confirmed</th><th>rejected</th><th>unreviewed</th><th>scene</th><th>kind</th><th>record</th><th>open</th></tr></thead>r  r  r  r  z    <thead><tr><th>rows</th><th>points</th><th>standable</th><th>sample points</th><th>target</th><th>target scene</th><th>confirmed</th><th>rejected</th><th>unreviewed</th><th>scene</th><th>kind</th><th>record</th><th>open</th></tr></thead>r  aU      <thead><tr><th>preview</th><th>rows</th><th>points</th><th>standable</th><th>unreviewed standable</th><th>active dist</th><th>bounds</th><th>sample points</th><th>target</th><th>target scene</th><th>confirmed</th><th>rejected</th><th>unreviewed</th><th>scene</th><th>kind</th><th>record</th><th>open</th><th>review JSON</th></tr></thead>z  <h2>Rows</h2>z~    <thead><tr><th>point</th><th>target</th><th>state</th><th>scene</th><th>kind</th><th>record</th><th>open</th></tr></thead>r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  zD          button.textContent = button.dataset.doneLabel || 'copied';r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  r   )r   r   r   r&  r=  r   r   r   rQ  rR  r-  rW  rE  rI  r  r1  r  r  )r(   r   r   r;  r   r   r.   r   
group_bodyr   r   r)   r   target_bodycomponent_bodyr   rL  rM  bodyr=   s                       r   source_gap_htmlrU    s   $G4 FD!G!$'JJ 
g(-m(<(Ay!!$t:uXc
E#JPVX]XaXaboXpqIIU:./u5U<017U#345U;T[[eHo)FGHN12DUJX\2]1^^cdU;/06U:./u5U<017T[[<)@)GCHIOuyy7M7YUYY{3_bcchi"4;;uyy/G/N3#O"PP\]%dkk$&7%8H	
	
0 K 
g:uXc
E#JPUV^P_afajajkxayzIIU:./u5U<017U#345U;T[[eHo)FGHN%dkk$&7%84;;uX;W:XXabT[[3E)F)M#NOuUU;/06U:./u5U<017T[[<)@)GCHIOuyy7M7YUYY{3_bcchi"4;;uyy/G/N3#O"PP\]%dkk$&7%8H	

0 N %
	'"(O#J#JhIIm$
 'z9=
*:yA
II@McdmMnAo@ppwx|  yD  yD  EK  yL  xM  MN  OS  OZ  OZ  [f  gp  qy  gz  [{  O|  N}  }L  MYz2359Y|45U;Y'789?Y]]+EqIJ%P	N^@_@kY]]+;<qtuuz{T[[Yx5H)IJK5QT[[i6I)JKLER%dkk$&7%84;;yQYGZ;[:\\efT[[7I)J)QcRSSXYY{34E:Yz2359Y|45U;T[[|)D)KLMUS9==;U;aY]];7gjkkpq"4;;y}}]/K/Rs#S"TT`a%dkk$&7%88OPTP[P[\fPgOh  iP  QU  Q\  Q\  ]g  Qh  Pi  i@  A34KIWblp4q3rrs  uL  MV  Xc  ud  te  ef  g~  H  JU  W[  g\  f]  ]^  _v  w@  BL  _M  ^N  NS  T)	
%
L D 
:s8}c#hC#h-Y\Y`Y`anYopIISXJaCz7T[[X78>#DKKG$=#>bSQX\AZ@[[`aT[[)>)E#FGuMSWW[5I5USWW[1[^__de"4;;sww}/E/L#M"Nl[%dkk$&7%8H
	

" 99v	
v	
v	
 v	
 '	v	

 Uv	
 F+,,KLv	
 v	
 sv	
 5v	
 ;v	
 \v	
 ?v	
 Uv	
 xv	
 Uv	
  W!v	
" c#v	
$ R%v	
& g'v	
( H)v	
* c+v	
, M-v	
. E/v	
0 >1v	
2 a3v	
4 a5v	
6 R7v	
8 o9v	
: *;v	
< g=v	
> ?v	
@ Av	
B Cv	
D T[[())EFEv	
F gkk+q9:+gkkR\^_F`Eaanovozoz  |H  JK  pL  oM  M[  \Gv	
H JIv	
J 2$++f2E1FkRVR]R]^dReQf  gJ  KKv	
L -Mv	
N *Ov	
P !tZ8Qv	
R Sv	
T -Uv	
V [Wv	
X VYv	
Z [v	
\ t]v	
^ '_v	
` av	
b lcv	
d ev	
f IIj!gv	
h iv	
j kv	
l 'mv	
n ov	
p @qv	
r sv	
t IIk"uv	
v wv	
x yv	
z .{v	
| }v	
~ dv	
@ Av	
B IIn%Cv	
D Ev	
F Gv	
H Iv	
J Kv	
L MMv	
N Ov	
P IIdOQv	
R Sv	
T Uv	
V Wv	
X Yv	
Z K[v	
\ N]v	
^ P_v	
` 'av	
b Ccv	
d @ev	
f Cgv	
h 0iv	
j 7kv	
l 8mv	
n Pov	
p @qv	
r vsv	
t uv	
v Vwv	
x 8yv	
z E{v	
| V}v	
~ <v	
@ KAv	
B -Cv	
D \Ev	
F AGv	
H }Iv	
J Kv	
L 6Mv	
N 2Ov	
P SQv	
R QSv	
T Uv	
V Wv	
X TYv	
Z B[v	
\ Q]v	
^ +_v	
` av	
b cv	
d ev	
f gv	
h iv	
j kv	
x xr   c                N   |dz  j                  t        |       d       |dz  }|j                  dd       t        | ||       t	        |       j                         D ]E  \  }}t        ||||       t        ||||       || dz  j                  t        |||      d       G y )Nztransition_review_gaps.htmlrX   rY   rx  Trz  r  )	r  rO  r  r  r`  r:   r  r  rU  )r   r  r   	split_dirr(   r  s         r   write_gap_html_outputsrX    s    ,,88$RY8Z22IOOD4O04w/-d399; pfk4A!&+tWE	xu%	%11/&+W[2\gn1opr   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |d
z  j                  dt        j                  | dd      z   dz   d	       y )NTrz  transition_reviews.jsonFrm  r  r   rX   rY   ztransition_reviews.jsz#window.HWANSE_TRANSITION_REVIEWS = )r'   r&   )r  
separatorsz;
)r  r  r\   r  )r   r  s     r   write_outputsr\    s    MM$M.((44

7q9D@ 5  &&22-
**W5Z
H	I
	 	 3 r   c                    t        | |      }t        ||t        |dz               |dz  j                  t	        j
                  |dd      dz   d       t        |||       t        ||       |S )	Nztile_classes.jsonztransition_review_gaps.jsonFrm  r  r   rX   rY   )r   r   rf   r  r\   r  rX  r  )rM   r   r  r   r   s        r   write_gap_outputsr^    st    E7#D t->wI\?\-]^,,88

4eA6= 9  4$/tW-Kr   c                    t        j                  t              } | j                  dt        t
        dz         | j                  dt        t        dz         | j                  dt        t        dz         | j                  d	t        t               | j                  d
t        d       | j                  ddd       | j                  ddd       | j                         }t        t        |j                              }t        |j                  |      }d }|j                  r8t        |j                  |      }t        ||      }t        t        ||      |      }t!        |j"                        }t%        ||       |j&                  r/|t)        d       y t+        |t-        |             t)        d       y |j                  rZ|j.                  rN|j                  j1                  t3        j4                  |dd      dz   d       t)        d|j                          |t+        |t-        |             t7        ||j8                         t;        |||j8                  |       t)        dt-        |       d|j8                          y )N)descriptionz--srcrZ  )typer  z--transitionszevent_transitions.jsonz--mapszmaps.jsz--outz--mergez8merge browser-exported transition review JSON into --src)ra  helpz--write-src
store_truez"write merged reviews back to --src)actionrb  z	--dry-runz;validate --merge and print its effect without writing filesz#dry-run ok: no merge patch suppliedzdry-run ok: no files writtenFrm  r  r   rX   rY   z%updated source transition reviews -> zwrote z transition reviews -> )argparseArgumentParser__doc__add_argumentr   DATAOUT
parse_argsrA   rd   r;   r`   srcr   r   rV   r	   r   r   dry_runr   r   r   	write_srcr  r\   r  r\  r   r^  )parserargsrM   r   r   r   r   s          r   mainrq    s   $$9F
dD;T4TU
dCBZ<Z[
tS9_E
dC8
	3mn
lAef
L?|}D-d.>.>?@E488U+GGzzTZZ//E'5159TYYD'4 ||?78 	  W601zzdnnDJJwU1MPTT_fg5dhhZ@AGS\2'488$eWdhh5	F3w<. 7z
BCr   __main__)r   rI   r~  r   )r   r   r   r   r    
list[dict]r~  z
int | Noner   )r(   r   r   r   r   r   r)   r   r   zstr | int | Noner~  r   )r;   rs  r~  dict[str, dict])r   objectrM   rt  r~  rt  )r_   r   rM   rt  r~  rt  )r_   r   r~  rs  )r_   r   r~  rI   )
rq   rI   rr   r   rs   r   rt   rI   r~  r   )r   rs  r   rI   rt   rI   r~  r  )r   rs  r~  rI   )r   rt  r   rI   r~  r  )r   rt  r   rt  r~  rt  )r   rt  r   rt  r~  dict[str, object])r   rv  r   r   r~  r  )r   rt  r~  r   )rM   rt  r   rt  r~  rs  )r   rs  r~  zdict[str, int])r=   rI   r~  tuple)r   rs  r~  rs  )r1   zset[tuple[int, int]]r~  zlist[list[tuple[int, int]]])r1   list[tuple[int, int]]r~  r  )r=   rI   r~  r   )   )r1   rx  r+  r   r~  r   )r|   )r.   z	list[str]r+  r   r~  r   )r  r  r~  r   )NN)r;  r   r(   r   r   r   r   r   r)   
str | Noner   rz  r~  r   )r;  r   r   rI   r~  r   )F)r   rI   r;  r   rS  r   r~  r   )r   rs  r~  r   )r   rs  r~  zdict[str, list[dict]])
r(   r   r   rs  r   rI   r  r   r~  zPath | None)r   rI   r~  r   )r   rI   rC   r   r  r   r~  rt  )r   rI   rC   r   r  r   r~  r   )r   rs  r  r   r~  rs  )FF)
r   rI   rC   r   r  r   r  r   r~  r   )
r(   r   r   rs  r   rI   r  r   r~  r  )r   rs  r   rI   r  r   r~  r  )r   rs  r   rI   r;  r   r~  r   )r   rs  r   rs  r~  rs  )r[  )r   rs  r;  r   r~  r   )z	../../web)
r(   r   r   rs  r   rI   r;  r   r~  r   )r   rs  r  r   r   rI   r~  r  )r   rt  r  r   r~  r  )
rM   rt  r   rt  r  r   r   rI   r~  rs  )r~  r  )Mrg  
__future__r   re  rQ  r\   r  pathlibr   urllib.parser   
decode_cnsr   map_thumbnailr   summarize_map_tilesr	   __file__resolver{  ROOTri  rj  rK   r   r#   r+   rA   rV   r`   rd   rf   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r&  r-  r/  r1  r=  rE  rI  rW  r^  r`  r  r  r  r  r  r  r  r  r  r  r  rO  rU  rX  r\  r^  rq  __name__r   r   r   <module>r     s   K "      "   * ) H~''*f}
Ul
z	"9
17
D*,ZJ$
O
NU.(<@$!H	<~=@h(.5
bJ... 999 9 	9
 9 9 	9,99 
3odC,^'8FR,GiTK*P$N[|hVp	"DJ zF r   