§
     ¿jã3  ã                  óv  — d Z ddlmZ ddlZddlmc 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mZ ddlZddlmc mZ ddlmZ  e
j        d¦  «        Zh d£Zd	d
ddddœZ ej        d¬¦  «        d!d„¦   «         Z ej        d¬¦  «        d"d„¦   «         Zd#d„Z d$d„Z!d#d„Z"d$d„Z#d%d„Z$d%d„Z%d#d„Z&d#d „Z'dS )&a  
Adversarial Stress Test Suite for FreeExile Cross-Platform Map Style Catalogs.
Validates Node.js loading, hex color formats (#RRGGBB), prop placement rules,
isometric elevation numbers, legacy biome alias bidirectional mappings,
prototype collision vulnerabilities, and mutation risks.
é    )ÚannotationsN)ÚPath)ÚAnyÚDict)ÚMapStyleServicez^#[0-9a-fA-F]{6}$>   ÚDEAD_ENDÚ	ANY_FLOORÚ	PATH_SIDEÚ
FLOOR_EDGEÚWALL_ADJACENTÚARENA_PERIMETER)ÚBLEACHED_BONE_CANYONÚSTY_11_HEM_NUI_XUONG_TRANG)ÚSAVAGE_MANGROVE_SWAMPÚSTY_06_BAI_THA_MA_NGAP_MAN)ÚCRIMSON_BLOOD_FORESTÚSTY_02_HUYET_SAT_LAM)ÚOUTCAST_MINE_SHAFTSÚSTY_16_MO_QUANG_LUU_DAY)ÚCORRUPTED_FIEND_RUINSÚSTY_21_PHE_TICH_MA_THAN)é   é   é   é   é   Úmodule)ÚscopeÚreturnr   c                 ól   — t          t          ¦  «                             ¦   «         j        j        j        S )N)r   Ú__file__ÚresolveÚparent© ó    úKC:\Projects\FreeExile\tests\security_fuzzing\test_map_styles_adversarial.pyÚproject_rootr'   )   s#   € å•‰>Œ>×!Ò!Ñ#Ô#Ô*Ô1Ô8Ð8r%   r'   úDict[str, Any]c                óú  — | dz  dz  dz  }|j         } |¦   «         }|s£t          j        d|› �¦  «        dz   dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚dx}}t          j
        d	t          |¦  «        gt          | ¦  «        d
d
dd
¬¦  «        }|j        pd}|                     d¦  «        }|                     d¦  «        }g }d}	|	 }
||
k    }|}|rd}| }||k    }|}|�s~t          j        d|fd||
f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        dœz  }dd|iz  }|                     |¦  «         |r‹t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }t          j        d|j        › d|j        › d�¦  «        d z   d!|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}	x}
x}x}}t'          j        |||dz   …         ¦  «        S )"zIExecute the Node.js adversarial harness and return the structured report.ÚtestsÚsecurity_fuzzingz"harness_map_styles_adversarial.mjszHarness script missing: zD
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_file
}()
}Úharness_path©Úpy0Úpy2Úpy4NÚnodeTúutf-8©ÚcwdÚcapture_outputÚtextÚencodingÚcheckÚ Ú{Ú}r   ©ú!=©z%(py2)s != -%(py5)sÚ	start_idx©r/   Úpy5ú%(py8)sÚpy8©z%(py10)s != -%(py13)sÚend_idx©Úpy10Úpy13ú%(py16)sÚpy16r   z"No JSON object in harness output: z
 (stderr: ú)z
>assert %(py19)sÚpy19)Úis_fileÚ
@pytest_arÚ_format_assertmsgÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚ
subprocessÚrunÚstrÚstdoutÚfindÚrfindÚ_call_reprcompareÚappendÚ_format_boolopÚstderrÚjsonÚloads)r'   r,   Ú@py_assert1Ú@py_assert3Ú@py_format5ÚprocrY   r?   rE   Ú@py_assert4Ú@py_assert6Ú@py_assert0Ú@py_assert12Ú@py_assert14Ú@py_assert11Ú@py_format7Ú@py_format9Ú@py_format15Ú@py_format17Ú@py_format18Ú@py_format20s                        r&   Újs_harness_resultsrr   .   s’  € ð   'Ñ)Ð,>Ñ>ÐAeÑe€LØÔÐLÐÐÑ!Ô!ÐLÐ!ÐLÕLÔLÐ#L¸lÐ#LÐ#LÑLÔLÐLÑLÐLÕLÔLÑLÔLÐLÐLÕLÔLˆ<ÑLÔLÐLÕLÔLˆ<ÑLÔLÐLÐLÕLÔLÐÑLÔLÕLÔLÐ!ÑLÔLÐLÐLÑLÐLÕLÕLÔLÐLÑLÔLÑLÔLÐLÐLÐLÐLÐLåŒ>Ø	•�\Ñ"Ô"Ð#Ý�ÑÔØØØØðñ ô €Dð Œ[Ð˜B€FØ—’˜CÑ Ô €IØ�lŠl˜3ÑÔ€GØxÐx˜Ðx˜˜Ðxˆ9˜Š?ÐxÐxÐxÐxÐx¨1Ðx¨1¨"Ðx˜w¨"š}ÐxÐxÐxÐxÑxÕxÔxÐxÐxÐxÐxˆ9˜ÐxÑxÔxÐxÕxÔxÑxÔxÐxÐxÕxÔxˆ9ÑxÔxÐxÕxÔxˆ9ÑxÔxÐxÐxÕxÔx˜ÑxÔxÐxÐxÑxÐxÐxÐxÐxÐxÑxÐxÐx×xÒxÐxÑxÔxÐxÐxÐxÕxÔxÐxÐxÐxÐx˜w¨"ÐxÑxÔxÐxÕxÔxÑxÔxÐxÐxÕxÔx˜wÑxÔxÐxÕxÔx˜wÑxÔxÐxÐxÕxÔx¨1ÑxÔxÐxÐxÑxÐxÐxÐxÐxÐxÑxÐxÐx×xÒxÐxÑxÔxÐxÕxÔxÐxÐxÑxÔxÐxÑxÐxÕxÔxÐ.xÐSWÔS^Ð.xÐ.xÐjnÔjuÐ.xÐ.xÐ.xÑxÔxÐxÑxÐxÐxÐxÑxÐxÕxÕxÔxÐxÑxÔxÑxÔxÐxÐxÐxÐxÐxÐxÐxÐxÐxÐxÐxÐxÐxÐxÐxÐxÐxÝŒ:�f˜Y¨°1©Ð4Ô5Ñ6Ô6Ð6r%   rr   ÚNonec                ó  — | d         }d}||u }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}| d	         }d
}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}dS )zNVerify that client JS catalog loads cleanly in Node.js and contains 30 styles.ÚloadSuccessT©Úis©z%(py1)s is %(py4)s©Úpy1r0   úassert %(py6)sÚpy6NÚtotalStylesé   ©ú==©z%(py1)s == %(py4)s)rN   r\   rS   rT   rU   )rr   rh   rc   Ú@py_assert2rd   rl   s         r&   Ú(test_adversarial_js_catalog_node_loadingrƒ   C   sZ  € à˜mÔ,Ð4°Ð4Ð,°Ð4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4Ð,°Ð4Ñ4Ô4Õ4Ô4Ð,Ñ4Ô4Õ4Ô4°Ñ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ø˜mÔ,Ð2°Ð2Ð,°Ò2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð,°Ð2Ñ2Ô2Õ2Ô2Ð,Ñ2Ô2Õ2Ô2°Ñ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2r%   c           
     ób  — | d         }g }||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}t          j        ¦   «         D �]à}d|j        j        fd	|j        j	        fd
|j        j
        fd|j        j        fd|j        j        fd|j        j        ffD �]‹\  }}	t          j        }
 |
|	¦  «        }d}||u}|�s(t          j        d|fd||f¦  «        dt#          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |
¦  «        dt#          j        ¦   «         v st          j        |	¦  «        rt          j        |	¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          j        d|j        › d|› d|	› �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}
x}x}}t-          |	¦  «        }d}||k    }|�st          j        d|fd||f¦  «        dt#          j        ¦   «         v st          j        t,          ¦  «        rt          j        t,          ¦  «        nddt#          j        ¦   «         v st          j        |	¦  «        rt          j        |	¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          j        d|	› d|j        › d|› �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}�Œ��Œâd }t/          j        d!d"d#|gt3          |¦  «        d$d$d%d$¬&¦  «        }|j        pd'}|                     d(¦  «        }|                     d)¦  «        }g }
d*}| }||k    }|}|rd*}| }||k    }|}|�sXt          j        d+|fd,||f¦  «        d-t#          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd-t          j        |¦  «        d.œz  }d/d|iz  }|
                     |¦  «         |r‹t          j        d+|fd0||f¦  «        d1t#          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd1t          j        |¦  «        d2œz  }d3d4|iz  }|
                     |¦  «         t          j        |
d5¦  «        i z  }d6d7|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}
x}x}x}x}x}}t?          j         |||d*z   …         ¦  «        }g }t
          j!         "                    ¦   «         D ]X\  }} ||         }!| j        j        |!d8         d         k    r/|                     |d| j        j        |!d8         d         f¦  «         ŒY|�r±t-          |¦  «        }d*}||k    }|sòt          j        d|fd||f¦  «        dt#          j        ¦   «         v st          j        t,          ¦  «        rt          j        t,          ¦  «        ndd9t#          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd9t          j        |¦  «        t          j        |¦  «        dœz  }d:d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d5         d5         }d;}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d5         d<         }d=}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d5         d>         }d?}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}dS dS )@zXStress-test hex colors for all 30 styles: strictly #RRGGBB, no 3-digit hex, valid chars.ÚhexColorViolationsr   r�   ry   r{   r|   NÚfloorÚwallÚpathÚliquidÚambientÚambient_hex)úis not)zO%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.match
}(%(py3)s)
} is not %(py8)sÚ	HEX_REGEXÚval)r.   r/   Úpy3rA   rC   zInvalid hex in ú z: ú
>assert %(py10)srG   é   ©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlen©r.   rz   r�   r|   z	Hex code z length != 7 in ú
>assert %(py8)srC   z‚
    import catalog from './client/webapp/js/data/map_style_catalog.js';
    console.log(JSON.stringify(catalog.MAP_STYLES));
    r1   ú--input-type=moduleú-eTr2   r3   r9   r:   r;   r   r<   r>   r?   r@   rB   rD   rE   rF   rI   rJ   r   úassert %(py19)srL   ÚlightingÚcolor_diffsúassert %(py8)sÚ$STY_30_TAN_TICH_THIEN_CUNG_HOANG_PHEr   z#221e28r   z#221128)#rN   r\   rS   rT   rU   Ú
py_catalogÚlist_stylesÚpaletter†   r‡   rˆ   r‰   rŠ   rš   r‹   r�   ÚmatchrP   rQ   rR   rO   Ústyle_idr”   rV   rW   rX   rY   rZ   r[   r]   r^   r`   ra   ÚMAP_STYLES_BY_IDÚitems)"rr   r'   rh   rc   r‚   rd   rl   ÚsÚfieldrŽ   rb   rf   Ú@py_assert7rg   rm   Ú@py_format11Ú@py_assert5Úscriptre   rY   r?   rE   ri   rj   rk   rn   ro   rp   rq   Ú	js_stylesr›   Ús_idÚpy_sÚjs_ss"                                     r&   Ú4test_adversarial_hex_colors_strict_format_and_parityr¯   I   s6
  € ð Ð2Ô3Ð9°rÐ9Ð3°rÒ9Ð9Ð9Ð9Õ9Ô9Ð9Ð9Ð9Ð9Ð3°rÐ9Ñ9Ô9Õ9Ô9Ð3Ñ9Ô9Õ9Ô9°rÑ9Ô9Ð9Ð9Ñ9Ð9Ð9Ð9Ð9Ð9Ñ9Ð9Õ9Õ9Ô9Ð9Ñ9Ô9Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9õ Ô#Ñ%Ô%ð 
Xñ 
Xˆà�a”i”oÐ&Ø�Q”Y”^Ð$Ø�Q”Y”^Ð$Ø�q”yÔ'Ð(Ø˜œ	Ô)Ð*Ø˜AœJÔ2Ð3ð
ð 		Xñ 		X‰JˆE�3õ ”?Ðb�?�? 3Ñ'Ô'Ðb¨tÐbÐ'¨tÐ3ÐbÐbÑbÕbÔbÐbÐbÐbÐbÐ'¨tÐbÑbÔbÐbÕbÔbÑbÔbÐbÐbÕbÔb•9ÑbÔbÐbÕbÔb•9ÑbÔbÐbÐbÕbÔb�?ÑbÔbÐbÕbÔbÑbÔbÐbÐbÕbÔb 3ÑbÔbÐbÕbÔb 3ÑbÔbÐbÐbÕbÔbÐ'ÑbÔbÕbÔb¨tÑbÔbÐbÐbÑbÐbÕbÔbÐ5bÀqÄzÐ5bÐ5bÐTYÐ5bÐ5bÐ]`Ð5bÐ5bÑbÔbÐbÑbÐbÐbÐbÑbÐbÕbÕbÔbÐbÑbÔbÑbÔbÐbÐbÐbÐbÐbÐbÐbÐbÐbÝ�s‘8”8ÐW˜qÐW�8˜q’=ÐWÐWÑWÕWÔWÐWÐWÐWÐW�8˜qÐWÑWÔWÐWÕWÔWÑWÔWÐWÐWÕWÔW•3ÑWÔWÐWÕWÔW•3ÑWÔWÐWÐWÐWÕWÔWÑWÔWÐWÐWÕWÔW�sÑWÔWÐWÕWÔW�sÑWÔWÐWÐWÕWÔW�8ÑWÔWÕWÔW˜qÑWÔWÐWÐWÑWÐWÕWÔWÐ"W¨cÐ"WÐ"WÀ1Ä:Ð"WÐ"WÐPUÐ"WÐ"WÑWÔWÐWÑWÐWÐWÐWÑWÐWÕWÕWÔWÐWÑWÔWÑWÔWÐWÐWÐWÐWÐWÐWÐWÑWñ		Xð€Fõ Œ>Ø	Ð&¨¨fÐ5Ý�ÑÔØØØØðñ ô €Dð Œ[Ð˜B€FØ—’˜CÑ Ô €IØ�lŠl˜3ÑÔ€GØ,Ð,˜Ð,˜˜Ð,ˆ9˜Š?Ð,Ð,Ð,Ð,Ð,¨1Ð,¨1¨"Ð,˜w¨"š}Ð,Ð,Ð,Ð,Ñ,Õ,Ô,Ð,Ð,Ð,Ð,ˆ9˜Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆ9Ñ,Ô,Ð,Õ,Ô,ˆ9Ñ,Ô,Ð,Ð,Õ,Ô,˜Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,×,Ò,Ð,Ñ,Ô,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,˜w¨"Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,˜wÑ,Ô,Ð,Õ,Ô,˜wÑ,Ô,Ð,Ð,Õ,Ô,¨1Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,×,Ò,Ð,Ñ,Ô,Ð,Õ,Ô,Ð,Ð,Ñ,Ô,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ý”
˜6 )¨g¸©kÐ"9Ô:Ñ;Ô;€Ið €KÝ Ô1×7Ò7Ñ9Ô9ð rð r‰
ˆˆdØ˜ŒˆØŒ=Ô$¨¨ZÔ(8¸Ô(GÒGÐGØ×Ò  m°T´]Ô5NÐPTÐU_ÔP`ÐanÔPoÐpÑqÔqÐqøð ñ .Ý�;ÑÔÐ$ 1Ð$Ð 1Ò$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$Ð 1Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$�sÑ$Ô$Ð$Õ$Ô$�sÑ$Ô$Ð$Ð$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$�;Ñ$Ô$Ð$Õ$Ô$�;Ñ$Ô$Ð$Ð$Õ$Ô$ÐÑ$Ô$Õ$Ô$ 1Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ø˜1Œ~˜aÔ ÐJÐ$JÐJÐ Ð$JÒJÐJÐJÐJÕJÔJÐJÐJÐJÐJÐ Ð$JÐJÑJÔJÕJÔJÐ ÑJÔJÕJÔJÐ$JÑJÔJÐJÐJÑJÐJÐJÐJÐJÐJÑJÐJÕJÕJÔJÐJÑJÔJÑJÔJÐJÐJÐJÐJÐJÐJÐJØ˜1Œ~˜aÔ Ð- IÐ-Ð  IÒ-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð  IÐ-Ñ-Ô-Õ-Ô-Ð Ñ-Ô-Õ-Ô- IÑ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ø˜1Œ~˜aÔ Ð- IÐ-Ð  IÒ-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð  IÐ-Ñ-Ô-Õ-Ô-Ð Ñ-Ô-Õ-Ô- IÑ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ð	.ð .r%   c           
     óÄ  — | d         }g }||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}| d         }g }||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}| d	         }g }||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}t          ¦   «         }t          j        ¦   «         D �]}t          j        |j	        ¦  «        }t          |¦  «        }d
}	||	k    }
|
�s t          j        d|
fd||	f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        dœz  }t          j        d|j	        › dt          |¦  «        › d�¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}
}	|D �]¿}|j        }|t           v }|�s	t          j        d|fd|t           f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddœz  }t          j        d|j        › d|j        › �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}d}|j        }	||	k     }d}|	|k    }|r|sät          j        d||fd||	|f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        t          j        |¦  «        d œz  }t          j        d!|j        › d|j        › �¦  «        d"z   d#|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}	}|j        }||v}|sòt          j        d$|fd%||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d&t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd&dœz  }t          j        d'|j        › �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|                     |j        ¦  «         g }|j        }d(}||k    }	|	}|	r|j        }d(}||k    }|}|�s~t          j        d)|	fd*||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        d+œz  }d,d-|iz  }|                     |¦  «         |	ržt          j        d)|fd.||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        d/œz  }d0d1|iz  }|                     |¦  «         t          j        |d2¦  «        i z  }d3d4|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}	x}x}x}}|j        }d5}
||
v }|sªt          j        d|fd6||
f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |
¦  «        d7œz  }d8d9|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}
�ŒÁ�Œ!t          |¦  «        }d:}	||	k    }
|
sòt          j        d|
fd||	f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndd&t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd&t          j        |¦  «        t          j        |	¦  «        dœz  }d;d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}
}	dS )<zSStress-test prop definitions: valid placement rules, weights in (0, 1], uniqueness.ÚpropPlacementViolationsr   r�   ry   r{   r|   NÚpropWeightViolationsÚduplicatePropsr   r“   r”   Úpropsr•   zStyle z has z props, expected 3r–   rC   ©Úin)z6%(py2)s
{%(py2)s = %(py0)s.placement_rule
} in %(py4)sÚpÚVALID_PLACEMENT_RULESr-   zInvalid rule z in z
>assert %(py6)sg        g      ð?)ú<ú<=)z3%(py1)s < %(py6)s
{%(py6)s = %(py4)s.spawn_weight
}z4%(py6)s
{%(py6)s = %(py4)s.spawn_weight
} <= %(py8)s)rz   r0   r|   rC   zInvalid weight r‘   rG   ©únot in)z3%(py2)s
{%(py2)s = %(py0)s.prop_id
} not in %(py4)sÚpy_prop_idszDuplicate prop_id r   )ú>=)z3%(py4)s
{%(py4)s = %(py2)s.footprint_w
} >= %(py7)s)r/   r0   Úpy7z%(py9)sÚpy9)z7%(py13)s
{%(py13)s = %(py11)s.footprint_h
} >= %(py16)s)Úpy11rH   rJ   z%(py18)sÚpy18r   zassert %(py21)sÚpy21)r   r   )z7%(py2)s
{%(py2)s = %(py0)s.blocks_movement
} in %(py5)s©r.   r/   rA   úassert %(py7)sr¿   éZ   rœ   )rN   r\   rS   rT   rU   Úsetrž   rŸ   Úget_props_for_styler¢   r”   rP   rQ   rR   rO   Úplacement_ruler¸   Úprop_idÚspawn_weightÚaddÚfootprint_wÚfootprint_hr]   r^   Úblocks_movement)rr   rh   rc   r‚   rd   rl   r½   r¥   r´   r©   rf   rm   r·   rb   r§   r¨   rg   ri   Ú@py_assert15rj   Ú@py_format8Ú@py_format10ro   Ú@py_format19rq   Ú@py_format22Ú@py_format6s                              r&   Ú1test_adversarial_prop_placement_rules_and_weightsrÖ      sJ  € àÐ7Ô8Ð>¸BÐ>Ð8¸BÒ>Ð>Ð>Ð>Õ>Ô>Ð>Ð>Ð>Ð>Ð8¸BÐ>Ñ>Ô>Õ>Ô>Ð8Ñ>Ô>Õ>Ô>¸BÑ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Õ>Õ>Ô>Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>ØÐ4Ô5Ð;¸Ð;Ð5¸Ò;Ð;Ð;Ð;Õ;Ô;Ð;Ð;Ð;Ð;Ð5¸Ð;Ñ;Ô;Õ;Ô;Ð5Ñ;Ô;Õ;Ô;¸Ñ;Ô;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;ØÐ.Ô/Ð5°2Ð5Ð/°2Ò5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5Ð/°2Ð5Ñ5Ô5Õ5Ô5Ð/Ñ5Ô5Õ5Ô5°2Ñ5Ô5Ð5Ð5Ñ5Ð5Ð5Ð5Ð5Ð5Ñ5Ð5Õ5Õ5Ô5Ð5Ñ5Ô5Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5õ ‘%”%€KÝÔ#Ñ%Ô%ð 	/ñ 	/ˆÝÔ.¨q¬zÑ:Ô:ˆÝ�5‰zŒzÐX˜QÐXˆz˜QŠÐXÐXÑXÕXÔXÐXÐXÐXÐXˆz˜QÐXÑXÔXÐXÕXÔXÑXÔXÐXÐXÕXÔX�sÑXÔXÐXÕXÔX�sÑXÔXÐXÐXÐXÕXÔXÑXÔXÐXÐXÕXÔX�5ÑXÔXÐXÕXÔX�5ÑXÔXÐXÐXÕXÔXˆzÑXÔXÕXÔX˜QÑXÔXÐXÐXÑXÐXÕXÔXÐ X¨¬Ð XÐ X½#¸e¹*¼*Ð XÐ XÐ XÑXÔXÐXÑXÐXÐXÐXÑXÐXÕXÕXÔXÐXÑXÔXÑXÔXÐXÐXÐXÐXÐXÐXÐXØð 	/ñ 	/ˆAØÔ#ÐoÐ#Õ'<Ð<ÐoÐoÑoÕoÔoÐoÐoÐoÐoÐ#Õ'<ÐoÑoÔoÐoÕoÔoÑoÔoÐoÐoÕoÔo�1ÑoÔoÐoÕoÔo�1ÑoÔoÐoÐoÕoÔoÐ#ÑoÔoÐoÕoÔoÑoÔoÐoÐoÕoÔoÕ'<ÑoÔoÐoÕoÔoÕ'<ÑoÔoÐoÐoÐoÐoÑoÐoÕoÔoÐ>oÈaÔN^Ð>oÐ>oÐdeÔdmÐ>oÐ>oÑoÔoÐoÑoÐoÐoÐoÑoÐoÕoÕoÔoÐoÑoÔoÑoÔoÐoÐoÐoÐoÐoØÐa˜œÐa�3˜Ò.Ða¨3Ða˜¨3Ò.ÐaÐaÐaÐaÐaÕaÔaÐaÐaÐaÐaÐa�3˜¨3ÐaÑaÔaÕaÔa�3ÑaÔaÐaÕaÔaÑaÔaÐaÐaÕaÔa˜ÑaÔaÐaÕaÔa˜ÑaÔaÐaÐaÕaÔa˜ÑaÔaÕaÔa¨3ÑaÔaÐaÐaÑaÐaÕaÔaÐ0aÀ!Ä.Ð0aÐ0aÐVWÔV_Ð0aÐ0aÑaÔaÐaÑaÐaÐaÐaÑaÐaÕaÕaÔaÐaÑaÔaÑaÔaÐaÐaÐaÐaÐaÐaÐaÐaÐaÐaÐaØ”9ÐQ�9 KÐ/ÐQÐQÐQÕQÔQÐQÐQÐQÐQ�9 KÐQÑQÔQÐQÕQÔQÑQÔQÐQÐQÕQÔQ�1ÑQÔQÐQÕQÔQ�1ÑQÔQÐQÐQÕQÔQ�9ÑQÔQÐQÕQÔQÑQÔQÐQÐQÕQÔQ KÑQÔQÐQÕQÔQ KÑQÔQÐQÐQÐQÐQÑQÐQÕQÔQÐ1QÀaÄiÐ1QÐ1QÑQÔQÐQÑQÐQÐQÐQÑQÐQÕQÕQÔQÐQÑQÔQÑQÔQÐQÐQÐQÐQÐQØ�OŠO˜AœIÑ&Ô&Ð&Ø<Ð<�1”=Ð< AÐ<�= AÒ%Ð<Ð<Ð<Ð<Ð<¨!¬-Ð<¸1Ð<¨-¸1Ò*<Ð<Ð<Ð<Ð<Ñ<Õ<Ô<Ð<Ð<Ð<Ð<�= AÐ<Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<�1Ñ<Ô<Ð<Õ<Ô<�1Ñ<Ô<Ð<Ð<Õ<Ô<�=Ñ<Ô<Õ<Ô< AÑ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Ð<×<Ò<Ð<Ñ<Ô<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<¨-¸1Ð<Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<¨!Ñ<Ô<Ð<Õ<Ô<¨!Ñ<Ô<Ð<Ð<Õ<Ô<¨-Ñ<Ô<Õ<Ô<¸1Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Ð<×<Ò<Ð<Ñ<Ô<Ð<Õ<Ô<Ð<Ð<Ñ<Ô<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ØÔ$Ð.¨Ð.Ð$¨Ð.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð$¨Ð.Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.�1Ñ.Ô.Ð.Õ.Ô.�1Ñ.Ô.Ð.Ð.Õ.Ô.Ð$Ñ.Ô.Õ.Ô.¨Ñ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ñ.ñ	/õ ˆ{ÑÔÐ!˜rÐ!Ð˜rÒ!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!Ð˜rÐ!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!�3Ñ!Ô!Ð!Õ!Ô!�3Ñ!Ô!Ð!Ð!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆ{Ñ!Ô!Ð!Õ!Ô!ˆ{Ñ!Ô!Ð!Ð!Õ!Ô!ÐÑ!Ô!Õ!Ô!˜rÑ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ð!r%   c                ój  — | d         }g }||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}d}t          j        d	d
d|gt          |¦  «        dddd¬¦  «        }|j        pd}	|	 	                    d¦  «        }
|	 
                    d¦  «        }g }d}| }|
|k    }|}|rd}| }||k    }|}|�sXt          j        d|fd|
|f¦  «        dt          j        ¦   «         v st          j        |
¦  «        rt          j        |
¦  «        ndt          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         |r‹t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd |iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}}t!          j        |	|
|dz   …         ¦  «        }t%          j        d!¦  «        }d"„ |D ¦   «         }|D �]%}t)          |t*          ¦  «        }|�sd#d$t          j        ¦   «         v st          j        t(          ¦  «        rt          j        t(          ¦  «        nd$d%t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd%d&t          j        ¦   «         v st          j        t*          ¦  «        rt          j        t*          ¦  «        nd&t          j        |¦  «        d'œz  }t          t          j        |¦  «        ¦  «        ‚d}�Œ'|D �]%}t)          |t*          ¦  «        }|�sd#d$t          j        ¦   «         v st          j        t(          ¦  «        rt          j        t(          ¦  «        nd$d%t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd%d&t          j        ¦   «         v st          j        t*          ¦  «        rt          j        t*          ¦  «        nd&t          j        |¦  «        d'œz  }t          t          j        |¦  «        ¦  «        ‚d}�Œ'|d(         }|d(         }||k    }d)}||k    }|r|s�t          j        d*||fd+|||f¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d,œz  }d-d.|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}}|d/         }|d/         }||k    }d0}||k    }|r|s�t          j        d*||fd+|||f¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d,œz  }d-d.|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}}|d1         }|d1         }||k    }d2}||k    }|r|s�t          j        d*||fd+|||f¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d,œz  }d-d.|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}}|d3         }|d3         }||k    }d4}||k    }|r|s�t          j        d*||fd+|||f¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d,œz  }d-d.|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}}dS )5zZStress-test isometric elevation numbers: finite integers, valid fallbacks, document drift.ÚelevationViolationsr   r�   ry   r{   r|   Nzæ
    import catalog from './client/webapp/js/data/map_style_catalog.js';
    const out = [];
    for (let t = 0; t <= 19; t++) {
        out.push(catalog.getTilePalette(1, t).elev);
    }
    console.log(JSON.stringify(out));
    r1   r—   r˜   Tr2   r3   r9   ú[ú]r   r<   r>   r?   r@   rB   rC   rD   rE   rF   rI   rJ   r   r™   rL   r   c                ó   — g | ]	}|j         ‘Œ
S r$   )Úelevation_px)Ú.0Úts     r&   ú
<listcomp>z@test_adversarial_isometric_elevation_numbers.<locals>.<listcomp>³   s   € Ð6Ð6Ð6¨�Q”^Ð6Ð6Ð6r%   z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}Ú
isinstanceÚelevÚint)r.   rz   r/   r0   r   é   )r€   r€   )z%(py1)s == %(py5)sz%(py5)s == %(py7)s)rz   rA   r¿   zassert %(py9)srÀ   r   é   é
   é   é   é   )rN   r\   rS   rT   rU   rV   rW   rX   rY   rZ   r[   rP   rQ   rR   r]   r^   r`   ra   rž   Úget_tiles_for_stylerà   râ   )rr   r'   rh   rc   r‚   rd   rl   rª   re   rY   r?   rE   rb   rf   rg   ri   rj   rk   rm   rn   ro   rp   rq   Újs_elevationsÚpy_tilesÚpy_elevationsrá   rÑ   rÒ   s                                r&   Ú,test_adversarial_isometric_elevation_numbersrí   •   s(	  € ð Ð3Ô4Ð:¸Ð:Ð4¸Ò:Ð:Ð:Ð:Õ:Ô:Ð:Ð:Ð:Ð:Ð4¸Ð:Ñ:Ô:Õ:Ô:Ð4Ñ:Ô:Õ:Ô:¸Ñ:Ô:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:ð€Fõ Œ>Ø	Ð&¨¨fÐ5Ý�ÑÔØØØØðñ ô €Dð Œ[Ð˜B€FØ—’˜CÑ Ô €IØ�lŠl˜3ÑÔ€GØ,Ð,˜Ð,˜˜Ð,ˆ9˜Š?Ð,Ð,Ð,Ð,Ð,¨1Ð,¨1¨"Ð,˜w¨"š}Ð,Ð,Ð,Ð,Ñ,Õ,Ô,Ð,Ð,Ð,Ð,ˆ9˜Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆ9Ñ,Ô,Ð,Õ,Ô,ˆ9Ñ,Ô,Ð,Ð,Õ,Ô,˜Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,×,Ò,Ð,Ñ,Ô,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,˜w¨"Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,˜wÑ,Ô,Ð,Õ,Ô,˜wÑ,Ô,Ð,Ð,Õ,Ô,¨1Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,×,Ò,Ð,Ñ,Ô,Ð,Õ,Ô,Ð,Ð,Ñ,Ô,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ý”J˜v i°'¸A±+Ð&=Ô>Ñ?Ô?€MåÔ-Ð.JÑKÔK€HØ6Ð6¨XÐ6Ñ6Ô6€Mð ð %ñ %ˆÝ˜$¥Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$�zÑ$Ô$Ð$Õ$Ô$�zÑ$Ô$Ð$Ð$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$˜$Ñ$Ô$Ð$Õ$Ô$˜$Ñ$Ô$Ð$Ð$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$¥Ñ$Ô$Ð$Õ$Ô$¥Ñ$Ô$Ð$Ð$Õ$Ô$Ð$Ñ$Ô$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ñ$Øð %ñ %ˆÝ˜$¥Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$�zÑ$Ô$Ð$Õ$Ô$�zÑ$Ô$Ð$Ð$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$˜$Ñ$Ô$Ð$Õ$Ô$˜$Ñ$Ô$Ð$Ð$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$¥Ñ$Ô$Ð$Õ$Ô$¥Ñ$Ô$Ð$Ð$Õ$Ô$Ð$Ñ$Ô$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ñ$ð
 ˜ÔÐ5˜}¨QÔ/Ð5ÐÐ/Ò5Ð5°2Ð5Ð/°2Ò5Ð5Ð5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5Ð5ÐÐ/°2Ð5Ñ5Ô5Õ5Ô5ÐÑ5Ô5Õ5Ô5Ð/Ñ5Ô5Õ5Ô5°2Ñ5Ô5Ð5Ð5Ñ5Ð5Ð5Ð5Ð5Ð5Ñ5Ð5Õ5Õ5Ô5Ð5Ñ5Ô5Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ø˜ÔÐ5˜}¨QÔ/Ð5ÐÐ/Ò5Ð5°2Ð5Ð/°2Ò5Ð5Ð5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5Ð5ÐÐ/°2Ð5Ñ5Ô5Õ5Ô5ÐÑ5Ô5Õ5Ô5Ð/Ñ5Ô5Õ5Ô5°2Ñ5Ô5Ð5Ð5Ñ5Ð5Ð5Ð5Ð5Ð5Ñ5Ð5Õ5Õ5Ô5Ð5Ñ5Ô5Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ø˜ÔÐ7 ¨bÔ 1Ð7ÐÐ 1Ò7Ð7°RÐ7Ð 1°RÒ7Ð7Ð7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7Ð7ÐÐ 1°RÐ7Ñ7Ô7Õ7Ô7ÐÑ7Ô7Õ7Ô7Ð 1Ñ7Ô7Õ7Ô7°RÑ7Ô7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ø˜ÔÐ7 ¨bÔ 1Ð7ÐÐ 1Ò7Ð7°RÐ7Ð 1°RÒ7Ð7Ð7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7Ð7ÐÐ 1°RÐ7Ñ7Ô7Õ7Ô7ÐÑ7Ô7Õ7Ô7Ð 1Ñ7Ô7Õ7Ô7°RÑ7Ô7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7r%   c           
     óð  — t                                ¦   «         D �]¢\  }\  }}t          j        } ||¦  «        }|j        }||k    }|�sCt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        ndt          j
        |¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚d	x}x}x}}t          j        } ||¦  «        }|j        }||k    }|�sCt          j        d|fd
||f¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        ndt          j
        |¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚d	x}x}x}}t          j        |         }
|
|k    }|s—t          j        d|fd|
|f¦  «        t          j
        |
¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}
}�Œ¤t                                ¦   «         D �]�\  }\  }}t          j        |         }
|
|k    }|s—t          j        d|fd|
|f¦  «        t          j
        |
¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}
}t          j        |         }
|
j        }||k    }|sªt          j        d|fd||f¦  «        t          j
        |
¦  «        t          j
        |¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}
x}}�Œ‘t          j        ¦   «         D �]â}|j        t           v�rÐ|j        }d	}||u }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}}|j        }t          j        }||v}|sòt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        ndt          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}}�Œäd}t)          j        ddd |gt-          | ¦  «        d!d!d"d!¬#¦  «        }|j        pd$}|                     d%¦  «        }|                     d&¦  «        }g }d'}| }||k    }|}
|rd'}| }||k    }|}
|
�sXt          j        d(|fd)||f¦  «        d*t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd*t          j
        |¦  «        d+œz  }d,d|iz  }|                     |¦  «         |r‹t          j        d(|fd-||f¦  «        d.t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd.t          j
        |¦  «        d/œz  }d0d1|iz  }|                     |¦  «         t          j        |d2¦  «        i z  }d3d4|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}
x}x}x}x}x}x}}t9          j        |||d'z   …         ¦  «        } | d5         }
d6}|
|u }|slt          j        d|fd7|
|f¦  «        t          j
        |
¦  «        t          j
        |¦  «        d8œz  }!d9d:|!iz  }t          t          j        |¦  «        ¦  «        ‚d	x}
x}}| d;         D ]„}"|"d<         }
d!}|
|u }|slt          j        d|fd7|
|f¦  «        t          j
        |
¦  «        t          j
        |¦  «        d8œz  }!d9d:|!iz  }t          t          j        |¦  «        ¦  «        ‚d	x}
x}}Œ…d	S )=zBTest legacy biome mappings in both forward and reverse directions.r   )zq%(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.get_map_style
}(%(py3)s)
}.style_id
} == %(py9)srž   Úlegacy_nameÚexpected_style)r.   r/   r�   rA   r¿   rÀ   úassert %(py11)srÁ   N)zy%(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.get_map_style_by_code
}(%(py3)s)
}.style_id
} == %(py9)sÚcode)z%(py1)s == %(py3)s©rz   r�   úassert %(py5)srA   )z4%(py3)s
{%(py3)s = %(py1)s.legacy_alias
} == %(py5)s)rz   r�   rA   rÅ   r¿   rv   )z4%(py2)s
{%(py2)s = %(py0)s.legacy_alias
} is %(py5)sr¥   rÄ   r»   )zb%(py2)s
{%(py2)s = %(py0)s.style_id
} not in %(py6)s
{%(py6)s = %(py4)s.STYLE_ID_TO_LEGACY_BIOME
})r.   r/   r0   r|   rœ   rC   an  
    import catalog from './client/webapp/js/data/map_style_catalog.js';
    const legacyMap = catalog.LEGACY_BIOME_MAP;
    const styles = catalog.MAP_STYLES;
    const revMapExported = typeof catalog.STYLE_ID_TO_LEGACY_BIOME !== 'undefined';
    const reverseMatches = [];

    for (const [legacyName, styleId] of Object.entries(legacyMap)) {
        const style = styles[styleId];
        reverseMatches.push({
            legacyName,
            styleId,
            hasReverseProp: style && style.legacy_alias === legacyName
        });
    }

    console.log(JSON.stringify({ revMapExported, reverseMatches }));
    r1   r—   r˜   Tr2   r3   r9   r:   r;   r   r<   r>   r?   r@   rB   rD   rE   rF   rI   rJ   r   r™   rL   ÚrevMapExportedFrx   ry   r{   r|   ÚreverseMatchesÚhasReverseProp)ÚEXPECTED_LEGACYr¤   rž   Úget_map_styler¢   rN   r\   rP   rQ   rR   rS   rT   rU   Úget_map_style_by_codeÚLEGACY_BIOME_TO_STYLE_IDÚSTYLE_ID_TO_LEGACY_BIOMEr£   Úlegacy_aliasrŸ   Ú
biome_coderV   rW   rX   rY   rZ   r[   r]   r^   r`   ra   )#r'   rò   rï   rð   rb   rf   rg   Ú@py_assert8rÒ   Ú@py_format12rh   r‚   Ú@py_format4rÕ   rÑ   r¥   rc   r©   rl   rm   rª   re   rY   r?   rE   ri   rj   rk   rn   ro   rp   rq   Ú	js_reportrd   r¡   s#                                      r&   Ú:test_adversarial_legacy_biome_alias_mappings_bidirectionalr  Ä   s  € õ 0?×/DÒ/DÑ/FÔ/Fð Rñ RÑ+ˆÑ+ˆ{˜NÝÔ'ÐOÐ'Ð'¨Ñ4Ô4ÐOÐ4Ô=ÐOÐ=ÀÒOÐOÐOÑOÕOÔOÐOÐOÐOÐOÐ=ÀÐOÑOÔOÐOÕOÔOÑOÔOÐOÐOÕOÔO�zÑOÔOÐOÕOÔO�zÑOÔOÐOÐOÕOÔOÐ'ÑOÔOÐOÕOÔOÑOÔOÐOÐOÕOÔO¨ÑOÔOÐOÕOÔO¨ÑOÔOÐOÐOÕOÔOÐ4ÑOÔOÕOÔOÐ=ÑOÔOÐOÕOÔOÑOÔOÐOÐOÕOÔOÀÑOÔOÐOÕOÔOÀÑOÔOÐOÐOÐOÐOÑOÐOÐOÐOÐOÐOÑOÐOÕOÕOÔOÐOÑOÔOÑOÔOÐOÐOÐOÐOÐOÐOÐOÐOÐOÝÔ/ÐPÐ/Ð/°Ñ5Ô5ÐPÐ5Ô>ÐPÐ>À.ÒPÐPÐPÑPÕPÔPÐPÐPÐPÐPÐ>À.ÐPÑPÔPÐPÕPÔPÑPÔPÐPÐPÕPÔP�zÑPÔPÐPÕPÔP�zÑPÔPÐPÐPÕPÔPÐ/ÑPÔPÐPÕPÔPÑPÔPÐPÐPÕPÔP°ÑPÔPÐPÕPÔP°ÑPÔPÐPÐPÕPÔPÐ5ÑPÔPÕPÔPÐ>ÑPÔPÐPÕPÔPÑPÔPÐPÐPÕPÔPÀ.ÑPÔPÐPÕPÔPÀ.ÑPÔPÐPÐPÐPÐPÑPÐPÐPÐPÐPÐPÑPÐPÕPÕPÔPÐPÑPÔPÑPÔPÐPÐPÐPÐPÐPÐPÐPÐPÐPÝÔ2°;Ô?ÐQÐ?À>ÒQÐQÐQÐQÕQÔQÐQÐQÐQÐQÐ?À>ÐQÑQÔQÕQÔQÐ?ÑQÔQÐQÕQÔQÑQÔQÐQÐQÕQÔQÀ>ÑQÔQÐQÕQÔQÀ>ÑQÔQÐQÐQÐQÐQÑQÐQÐQÐQÐQÐQÑQÐQÕQÕQÔQÐQÑQÔQÑQÔQÐQÐQÐQÐQÐQÑQõ 0?×/DÒ/DÑ/FÔ/Fð Wñ WÑ+ˆÑ+ˆ{˜NÝÔ2°>ÔBÐQÐBÀkÒQÐQÐQÐQÕQÔQÐQÐQÐQÐQÐBÀkÐQÑQÔQÕQÔQÐBÑQÔQÐQÕQÔQÑQÔQÐQÐQÕQÔQÀkÑQÔQÐQÕQÔQÀkÑQÔQÐQÐQÐQÐQÑQÐQÐQÐQÐQÐQÑQÐQÕQÕQÔQÐQÑQÔQÑQÔQÐQÐQÐQÐQÐQÝÔ*¨>Ô:ÐVÐ:ÔGÐVÐGÈ;ÒVÐVÐVÐVÕVÔVÐVÐVÐVÐVÐGÈ;ÐVÑVÔVÕVÔVÐ:ÑVÔVÕVÔVÐGÑVÔVÐVÕVÔVÑVÔVÐVÐVÕVÔVÈ;ÑVÔVÐVÕVÔVÈ;ÑVÔVÐVÐVÐVÐVÑVÐVÐVÐVÐVÐVÑVÐVÕVÕVÔVÐVÑVÔVÑVÔVÐVÐVÐVÐVÐVÐVÐVÑVõ Ô#Ñ%Ô%ð Iñ IˆØŒ<�Ð.Ñ.Ø”>Ð) TÐ)�> TÐ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)�> TÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)�1Ñ)Ô)Ð)Õ)Ô)�1Ñ)Ô)Ð)Ð)Õ)Ô)�>Ñ)Ô)Õ)Ô) TÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ø”:ÐH¥ZÔ%HÐH�:Ð%HÐHÐHÐHÐHÕHÔHÐHÐHÐHÐH�:Ð%HÐHÑHÔHÐHÕHÔHÑHÔHÐHÐHÕHÔH�1ÑHÔHÐHÕHÔH�1ÑHÔHÐHÐHÕHÔH�:ÑHÔHÐHÕHÔHÑHÔHÐHÐHÕHÔH¥ZÑHÔHÐHÕHÔH¥ZÑHÔHÐHÐHÕHÔHÐ%HÑHÔHÐHÐHÑHÐHÐHÐHÐHÐHÑHÐHÕHÕHÔHÐHÑHÔHÑHÔHÐHÐHÐHÐHÐHÐHÐHùð€Fõ$ Œ>Ø	Ð&¨¨fÐ5Ý�ÑÔØØØØðñ ô €Dð Œ[Ð˜B€FØ—’˜CÑ Ô €IØ�lŠl˜3ÑÔ€GØ,Ð,˜Ð,˜˜Ð,ˆ9˜Š?Ð,Ð,Ð,Ð,Ð,¨1Ð,¨1¨"Ð,˜w¨"š}Ð,Ð,Ð,Ð,Ñ,Õ,Ô,Ð,Ð,Ð,Ð,ˆ9˜Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆ9Ñ,Ô,Ð,Õ,Ô,ˆ9Ñ,Ô,Ð,Ð,Õ,Ô,˜Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,×,Ò,Ð,Ñ,Ô,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,˜w¨"Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,˜wÑ,Ô,Ð,Õ,Ô,˜wÑ,Ô,Ð,Ð,Õ,Ô,¨1Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,×,Ò,Ð,Ñ,Ô,Ð,Õ,Ô,Ð,Ð,Ñ,Ô,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ý”
˜6 )¨g¸©kÐ"9Ô:Ñ;Ô;€Ið Ð%Ô&Ð/¨%Ð/Ð&¨%Ð/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð&¨%Ð/Ñ/Ô/Õ/Ô/Ð&Ñ/Ô/Õ/Ô/¨%Ñ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ØÐ+Ô,ð /ð /ˆØÐ%Ô&Ð.¨$Ð.Ð&¨$Ð.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð&¨$Ð.Ñ.Ô.Õ.Ô.Ð&Ñ.Ô.Õ.Ô.¨$Ñ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ð/ð /r%   c                ó–  — t           j        }d} ||¦  «        }d}||u }|sÚt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}}t           j
        }d	} ||¦  «        }d}||u }|sÚt          j        d|fd
||f¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}}t           j
        }d} ||¦  «        }d}||u }|sÚt          j        d|fd
||f¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}}t           j
        }d}| } ||¦  «        }d}	||	u }|sÚt          j        d|fd||	f¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |	¦  «        dœz  }
dd|
iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}}	t           j
        }d} ||¦  «        }d}||u }|sÚt          j        d|fd
||f¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}}t           j        }d} ||¦  «        }d}||u }|sÚt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}}t           j        }d} ||¦  «        }d}||u }|sÚt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}}d}t          j        ddd|gt          | ¦  «        dddd¬¦  «        }|j        pd}|                     d¦  «        }|                     d¦  «        }g }d}| }||k    }|}|rd}| }||k    }|}|�sXt          j        d|fd||f¦  «        d t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd t          j        |¦  «        d!œz  }d"d#|iz  }|                     |¦  «         |r‹t          j        d|fd$||f¦  «        d%t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd%t          j        |¦  «        d&œz  }d'd(|iz  }|                     |¦  «         t          j        |d	¦  «        i z  }d)d*|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}}t'          j        |||dz   …         ¦  «        }|d+         }d,}||k    }|slt          j        d-|fd.||f¦  «        t          j        |¦  «        t          j        |¦  «        d/œz  }d0d1|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}|d2         }d,}||k    }|slt          j        d-|fd.||f¦  «        t          j        |¦  «        t          j        |¦  «        d/œz  }d0d1|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}|d3         }d,}||k    }|slt          j        d-|fd.||f¦  «        t          j        |¦  «        t          j        |¦  «        d/œz  }d0d1|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}|d4         }d,}||k    }|slt          j        d-|fd.||f¦  «        t          j        |¦  «        t          j        |¦  «        d/œz  }d0d1|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}|d5         }d,}||k    }|slt          j        d-|fd.||f¦  «        t          j        |¦  «        t          j        |¦  «        d/œz  }d0d1|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}|d6         }d,}||k    }|slt          j        d-|fd.||f¦  «        t          j        |¦  «        t          j        |¦  «        d/œz  }d0d1|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}dS )7z<Stress-test out-of-range, malformed, and adversarial inputs.ÚUNKNOWN_STYLE_XYZNrv   )zS%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get_map_style
}(%(py4)s)
} is %(py9)srž   )r.   r/   r0   r|   rÀ   rñ   rÁ   r   )z[%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get_map_style_by_code
}(%(py4)s)
} is %(py9)sé   r   )z]%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.get_map_style_by_code
}(-%(py4)s)
} is %(py10)s)r.   r/   r0   r¿   rG   zassert %(py12)sÚpy12i?B Úbleached_bone_canyonÚsty_11_hem_nui_xuong_tranga)  
    import catalog from './client/webapp/js/data/map_style_catalog.js';
    const tests = {
        nullVal: catalog.getMapStyle(null).style_id,
        undefinedVal: catalog.getMapStyle(undefined).style_id,
        numZero: catalog.getMapStyle(0).style_id,
        num31: catalog.getMapStyle(31).style_id,
        numNeg: catalog.getMapStyle(-1).style_id,
        unknownStr: catalog.getMapStyle('UNKNOWN_XYZ').style_id,
        lowercaseLegacy: catalog.getMapStyle('bleached_bone_canyon').style_id,
    };
    console.log(JSON.stringify(tests));
    r1   r—   r˜   Tr2   r3   r9   r:   r;   r<   r>   r?   r@   rB   rC   rD   rE   rF   rI   rJ   r™   rL   ÚnullValr   r   r�   ry   r{   r|   ÚundefinedValÚnumZeroÚnum31Ú
unknownStrÚlowercaseLegacy)rž   rù   rN   r\   rP   rQ   rR   rS   rT   rU   rú   rV   rW   rX   rY   rZ   r[   r]   r^   r`   ra   )r'   rb   rc   r©   rÿ   r§   rÒ   r   rg   Ú@py_assert9r¨   Ú@py_format13rª   re   rY   r?   rE   rf   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   Újs_resr‚   rd   s                                  r&   Ú0test_adversarial_invalid_and_adversarial_lookupsr  þ   s™  € õ Ô#Ð@Ð$7Ð@Ð#Ð#Ð$7Ñ8Ô8Ð@¸DÐ@Ð8¸DÐ@Ð@Ð@Ð@Õ@Ô@Ð@Ð@Ð@Ð@Ð8¸DÐ@Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@�:Ñ@Ô@Ð@Õ@Ô@�:Ñ@Ô@Ð@Ð@Õ@Ô@Ð#Ñ@Ô@Õ@Ô@Ð$7Ñ@Ô@Õ@Ô@Ð8Ñ@Ô@Õ@Ô@¸DÑ@Ô@Ð@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Õ@Õ@Ô@Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@ÝÔ+Ð6¨AÐ6Ð+Ð+¨AÑ.Ô.Ð6°$Ð6Ð.°$Ð6Ð6Ð6Ð6Õ6Ô6Ð6Ð6Ð6Ð6Ð.°$Ð6Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6�:Ñ6Ô6Ð6Õ6Ô6�:Ñ6Ô6Ð6Ð6Õ6Ô6Ð+Ñ6Ô6Õ6Ô6¨AÑ6Ô6Õ6Ô6Ð.Ñ6Ô6Õ6Ô6°$Ñ6Ô6Ð6Ð6Ñ6Ð6Ð6Ð6Ð6Ð6Ñ6Ð6Õ6Õ6Ô6Ð6Ñ6Ô6Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6ÝÔ+Ð7¨BÐ7Ð+Ð+¨BÑ/Ô/Ð7°4Ð7Ð/°4Ð7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7Ð/°4Ð7Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7�:Ñ7Ô7Ð7Õ7Ô7�:Ñ7Ô7Ð7Ð7Õ7Ô7Ð+Ñ7Ô7Õ7Ô7¨BÑ7Ô7Õ7Ô7Ð/Ñ7Ô7Õ7Ô7°4Ñ7Ô7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7ÝÔ+Ð7¨QÐ7¨Q¨BÐ7Ð+Ð+¨BÑ/Ô/Ð7°4Ð7Ð/°4Ð7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7Ð/°4Ð7Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7�:Ñ7Ô7Ð7Õ7Ô7�:Ñ7Ô7Ð7Ð7Õ7Ô7Ð+Ñ7Ô7Õ7Ô7¨QÑ7Ô7Õ7Ô7Ð/Ñ7Ô7Õ7Ô7°4Ñ7Ô7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7ÝÔ+Ð;¨FÐ;Ð+Ð+¨FÑ3Ô3Ð;°tÐ;Ð3°tÐ;Ð;Ð;Ð;Õ;Ô;Ð;Ð;Ð;Ð;Ð3°tÐ;Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;�:Ñ;Ô;Ð;Õ;Ô;�:Ñ;Ô;Ð;Ð;Õ;Ô;Ð+Ñ;Ô;Õ;Ô;¨FÑ;Ô;Õ;Ô;Ð3Ñ;Ô;Õ;Ô;°tÑ;Ô;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;õ Ô#ÐCÐ$:ÐCÐ#Ð#Ð$:Ñ;Ô;ÐC¸tÐCÐ;¸tÐCÐCÐCÐCÕCÔCÐCÐCÐCÐCÐ;¸tÐCÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔC�:ÑCÔCÐCÕCÔC�:ÑCÔCÐCÐCÕCÔCÐ#ÑCÔCÕCÔCÐ$:ÑCÔCÕCÔCÐ;ÑCÔCÕCÔC¸tÑCÔCÐCÐCÑCÐCÐCÐCÐCÐCÑCÐCÕCÕCÔCÐCÑCÔCÑCÔCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÝÔ#ÐIÐ$@ÐIÐ#Ð#Ð$@ÑAÔAÐIÀTÐIÐAÀTÐIÐIÐIÐIÕIÔIÐIÐIÐIÐIÐAÀTÐIÑIÔIÐIÕIÔIÑIÔIÐIÐIÕIÔI�:ÑIÔIÐIÕIÔI�:ÑIÔIÐIÐIÕIÔIÐ#ÑIÔIÕIÔIÐ$@ÑIÔIÕIÔIÐAÑIÔIÕIÔIÀTÑIÔIÐIÐIÑIÐIÐIÐIÐIÐIÑIÐIÕIÕIÔIÐIÑIÔIÑIÔIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIð€Fõ Œ>Ø	Ð&¨¨fÐ5Ý�ÑÔØØØØðñ ô €Dð Œ[Ð˜B€FØ—’˜CÑ Ô €IØ�lŠl˜3ÑÔ€GØ,Ð,˜Ð,˜˜Ð,ˆ9˜Š?Ð,Ð,Ð,Ð,Ð,¨1Ð,¨1¨"Ð,˜w¨"š}Ð,Ð,Ð,Ð,Ñ,Õ,Ô,Ð,Ð,Ð,Ð,ˆ9˜Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆ9Ñ,Ô,Ð,Õ,Ô,ˆ9Ñ,Ô,Ð,Ð,Õ,Ô,˜Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,×,Ò,Ð,Ñ,Ô,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,˜w¨"Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,˜wÑ,Ô,Ð,Õ,Ô,˜wÑ,Ô,Ð,Ð,Õ,Ô,¨1Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,×,Ò,Ð,Ñ,Ô,Ð,Õ,Ô,Ð,Ð,Ñ,Ô,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ÝŒZ˜˜y¨7°Q©;Ð6Ô7Ñ8Ô8€Fð �)ÔÐ<Ð <Ð<ÐÐ <Ò<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<ÐÐ <Ð<Ñ<Ô<Õ<Ô<ÐÑ<Ô<Õ<Ô<Ð <Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ø�.Ô!ÐAÐ%AÐAÐ!Ð%AÒAÐAÐAÐAÕAÔAÐAÐAÐAÐAÐ!Ð%AÐAÑAÔAÕAÔAÐ!ÑAÔAÕAÔAÐ%AÑAÔAÐAÐAÑAÐAÐAÐAÐAÐAÑAÐAÕAÕAÔAÐAÑAÔAÑAÔAÐAÐAÐAÐAÐAÐAÐAØ�)ÔÐ<Ð <Ð<ÐÐ <Ò<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<ÐÐ <Ð<Ñ<Ô<Õ<Ô<ÐÑ<Ô<Õ<Ô<Ð <Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ø�'Œ?Ð:Ð:Ð:ˆ?Ð:Ò:Ð:Ð:Ð:Õ:Ô:Ð:Ð:Ð:Ð:ˆ?Ð:Ð:Ñ:Ô:Õ:Ô:ˆ?Ñ:Ô:Õ:Ô:Ð:Ñ:Ô:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ø�,ÔÐ?Ð#?Ð?ÐÐ#?Ò?Ð?Ð?Ð?Õ?Ô?Ð?Ð?Ð?Ð?ÐÐ#?Ð?Ñ?Ô?Õ?Ô?ÐÑ?Ô?Õ?Ô?Ð#?Ñ?Ô?Ð?Ð?Ñ?Ð?Ð?Ð?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?ØÐ#Ô$Ð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ÑDÔDÑDÔDÐDÐDÐDÐDÐDÐDÐDÐDÐDr%   c                óÜ  — | d         }t          |¦  «        }d}||k    }|sòt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}}d„ |D ¦   «         }d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚d
x}}d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚d
x}}d
S )zCDocument confirmed Prototype Collision vulnerability in JS catalog.ÚprototypeCollisionBugsr   ©ú>)z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)sr”   Úbugsr•   rœ   rC   Nc                ó   — h | ]
}|d          ’ŒS )Ú	attackKeyr$   )rÝ   Úbs     r&   ú	<setcomp>zEtest_adversarial_prototype_collision_vulnerability.<locals>.<setcomp>5  s   € Ð0Ð0Ð0 a�1�[”>Ð0Ð0Ð0r%   Úconstructorrµ   )z%(py1)s in %(py3)sÚattack_keysró   rô   rA   ÚtoString)	r”   rN   r\   rP   rQ   rR   rS   rT   rU   )rr   r  r‚   r©   rf   rl   rm   r  rh   r  rÕ   s              r&   Ú2test_adversarial_prototype_collision_vulnerabilityr   0  sÆ  € ð Ð6Ô7€DÝˆt‰9Œ9Ð�qÐˆ9�qŠ=ÐÐÐÕÔÐÐÐÐˆ9�qÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÐÕÔÑÔÐÐÕÔˆtÑÔÐÕÔˆtÑÔÐÐÕÔˆ9ÑÔÕÔ�qÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØ0Ð0¨4Ð0Ñ0Ô0€KØÐ'ˆ=˜KÐ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'ˆ=˜KÐ'Ñ'Ô'Õ'Ô'ˆ=Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'˜KÑ'Ô'Ð'Õ'Ô'˜KÑ'Ô'Ð'Ð'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'ØÐ$ˆ:˜Ð$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$ˆ:˜Ð$Ñ$Ô$Õ$Ô$ˆ:Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$˜Ñ$Ô$Ð$Õ$Ô$˜Ñ$Ô$Ð$Ð$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$r%   c                óä  — | d         }d}||k    }|s°t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          j        d|› d�¦  «        d	z   d
|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}d}t          j
        ¦   «         }t          |¦  «        D ]}|dz  dz   }	t          j        |	¦  «         Œt          j
        ¦   «         |z
  }
t          ||
z  ¦  «        }d}||k    }|s°t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          j        d|› d�¦  «        d	z   d
|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS )zOBenchmark lookup throughput: verify > 100,000 ops/second in Python and Node.js.ÚstressTestOpsPerSeci ¡ r  )z%(py0)s > %(py3)sÚjs_ops)r.   r�   zJS throughput too low: z ops/secz
>assert %(py5)srA   Ni † r~   r   Úpy_opszPython throughput too low: )rN   r\   rP   rQ   rR   rS   rO   rT   rU   ÚtimeÚperf_counterÚrangerž   rú   râ   )rr   r#  r‚   rb   r  rÕ   Ú
iterationsÚstartÚir  Údurationr$  s               r&   Ú&test_adversarial_throughput_and_stressr,  :  sE  € ð  Ð 5Ô6€FØÐGˆ6�GÒÐGÐGÐGÕGÔGÐGÐGÐGÐGˆ6�GÐGÑGÔGÐGÕGÔGÑGÔGÐGÐGÕGÔGˆ6ÑGÔGÐGÕGÔGˆ6ÑGÔGÐGÐGÕGÔG�GÑGÔGÐGÐGÑGÐGÕGÔGÐG°vÐGÐGÐGÑGÔGÐGÑGÐGÐGÐGÑGÐGÕGÕGÔGÐGÑGÔGÑGÔGÐGÐGÐGÐGÐGð €JÝÔÑÔ€EÝ�:ÑÔð ,ð ,ˆØ�‰V�q‰LˆÝÔ(¨Ñ+Ô+Ð+Ð+ÝÔ Ñ"Ô" UÑ*€HÝ�˜hÑ&Ñ'Ô'€FØÐKˆ6�GÒÐKÐKÐKÕKÔKÐKÐKÐKÐKˆ6�GÐKÑKÔKÐKÕKÔKÑKÔKÐKÐKÕKÔKˆ6ÑKÔKÐKÕKÔKˆ6ÑKÔKÐKÐKÕKÔK�GÑKÔKÐKÐKÑKÐKÕKÔKÐK¸6ÐKÐKÐKÑKÔKÐKÑKÐKÐKÐKÑKÐKÕKÕKÔKÐKÑKÔKÑKÔKÐKÐKÐKÐKÐKÐKÐKr%   )r   r   )r'   r   r   r(   )rr   r(   r   rs   )rr   r(   r'   r   r   rs   )r'   r   r   rs   )(Ú__doc__Ú
__future__r   ÚbuiltinsrP   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterN   r`   ÚrerV   r%  Úpathlibr   Útypingr   r   ÚpytestÚserver.world.map_style_catalogÚworldÚmap_style_catalogrž   Úserver.world.map_style_servicer   Úcompiler�   r¸   rø   Úfixturer'   rr   rƒ   r¯   rÖ   rí   r  r  r   r,  r$   r%   r&   ú<module>r=     s  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø  € € € € € € € € € € € € €€€€Ø 	€	€	€	Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð à €€€à 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø :Ð :Ð :Ð :Ð :Ð :àˆBŒJÐ+Ñ,Ô,€	ðð ð Ð ð >Ø>Ø7Ø9Ø;ðð €ð €„�hÐÑÔð9ð 9ð 9ñ  Ôð9ð €„�hÐÑÔð7ð 7ð 7ñ  Ôð7ð(3ð 3ð 3ð 3ð3.ð 3.ð 3.ð 3.ðl"ð "ð "ð "ð,,8ð ,8ð ,8ð ,8ð^7/ð 7/ð 7/ð 7/ðt/Eð /Eð /Eð /Eðd%ð %ð %ð %ðLð Lð Lð Lð Lð Lr%   