Files
zhichun-project/CTF/backend/__pycache__/server.cpython-312.pyc

126 lines
16 KiB
Plaintext
Raw Normal View History

<EFBFBD>
<11>PiA1<00><00><><00>ddlZddlmZmZddlZddlZddlmZmZed<04><05>Z ej<00>Z dZ dZ iadaGd<08>d <09>Ze<10>ad
<EFBFBD>Zd <0B>Zd <0C>Zd <0A>Zedk(rej.e<15><00>yy)<0F>N)<02>GameMap<61>run_game_server)<02>List<73>Tupleg<00>?)<01>show_gap_in_msec<65><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD>c <00><><00>eZdZd<01>Zd<02>Zd<03>Zd<04>Zd<05>Zd<06>Zd<07>Z de
d e
d
e
fd <0B>Z d e
d e
de e e
e
fd
e e e
e
fe
ffd<0F>Zy)<11>Mapc<00><00>tj|_tj|_dg|j|jzz|_t |j|jz<00>D<00>cgc]}g<00><02>c}|_d|_ycc}w)Nr)<07>world<6C>width<74>height<68>grid<69>range<67>edge<67> in_safe_zone)<02>self<6C>_s <20>6/Users/liuhaiyan/zhichun-project/CTF/backend/server.py<70>__init__z Map.__init__sk<00><00><1B>k<EFBFBD>k<EFBFBD><04>
<EFBFBD><1B>l<EFBFBD>l<EFBFBD><04> <0B><16>C<EFBFBD>4<EFBFBD>:<3A>:<3A><04> <0B> <0B>3<>4<><04> <09>!&<26>t<EFBFBD>z<EFBFBD>z<EFBFBD>D<EFBFBD>K<EFBFBD>K<EFBFBD>'?<3F>!@<40>A<>!@<40>A<EFBFBD>R<EFBFBD>!@<40>A<><04> <09> <20><04><19><>Bs<00>1 B
c<00>&<00>||jz|zS<00>N)r)r<00>x<>ys r<00>convert_pos_to_indexzMap.convert_pos_to_indexs<00><00><10>4<EFBFBD>:<3A>:<3A>~<7E><01>!<21>!<21>c<00><><00>tj|_tj|_t|j|jz<00>D<00>cgc]}g<00><02>c}|_dg|j|jzz|_tj }|D](}|\}}|j||<07>}d|j
|<<00>*tr;tjt|dz|j<00>|f<02>tk(|_ n0tjt|dz
d<01>|f<02>tk(|_ tjddd<00><05>} tjddd<00><05>}
|j||<02>} |
D]-} | d| d}}|j||<07>}d |j
|<<00>/| D]<5D>} | d| d}}|j||<07>}tr^tj|dz|f<02>r<01>@d|j
|<d
D].\}}||z||z}}d|j
|j||<11><<00>0<00><>tj|dz
|f<02>s<01><>d|j
|<d
D].\}}||z||z}}d|j
|j||<11><<00>0<00><>t|j<00>D<00>]0}t|j<00>D<00>]}|j||<07>}|jr|j
|d vr|| k7r<18>9|j
|d vr|| k7r<01>Pd
D]<5D>\}}||z||z}}d|cxkr|jks<01>&n<00>)d|cxkr|jks<01>?n<00>B|j||<11>}|jr1|j
|d vs<01>r|j|j|<12><00><>|j
|d vs<01><>|j|j|<12><00><><00><01><00><01>3ycc}w) Nrr <00>F<><03>mine<6E>inPrison<6F>hasFlagT<67>posX<73>posY<73>))rr )rr)r r)rr)r )r r)r rrrrr<00>wallsr<00>my_side_is_left<66>
is_on_left<EFBFBD>minr<00>max<61> list_players<72>append)r<00>posx<73>posyrr'<00>wallrr<00>idx<64> enemy_players<72> ally_players<72>my_pos<6F>ally<6C>enemy<6D>dx<64>dy<64>nx<6E>ny<6E>n_idxs r<00>updatez
Map.updates<><00><00><1B>k<EFBFBD>k<EFBFBD><04>
<EFBFBD><1B>l<EFBFBD>l<EFBFBD><04> <0B>!&<26>t<EFBFBD>z<EFBFBD>z<EFBFBD>D<EFBFBD>K<EFBFBD>K<EFBFBD>'?<3F>!@<40>A<>!@<40>A<EFBFBD>R<EFBFBD>!@<40>A<><04> <09><16>C<EFBFBD>4<EFBFBD>:<3A>:<3A><04> <0B> <0B>3<>4<><04> <09><15> <0B> <0B><05><19>D<EFBFBD><17>D<EFBFBD>A<EFBFBD>q<EFBFBD><16>+<2B>+<2B>A<EFBFBD>q<EFBFBD>1<>C<EFBFBD><1E>D<EFBFBD>I<EFBFBD>I<EFBFBD>c<EFBFBD>N<EFBFBD><1A> <1B> %<25> 0<> 0<>#<23>d<EFBFBD>1<EFBFBD>f<EFBFBD>T<EFBFBD>Z<EFBFBD>Z<EFBFBD>2H<32><14>1N<31> O<>Sb<53> b<>D<EFBFBD> <1D> %<25> 0<> 0<>#<23>d<EFBFBD>1<EFBFBD>f<EFBFBD>Q<EFBFBD>-<2D><04>1E<31> F<>/<2F> Y<>D<EFBFBD> <1D><1D>*<2A>*<2A><05><05>t<EFBFBD>*<2A>T<> <0A><1C>)<29>)<29>t<EFBFBD>e<EFBFBD>T<EFBFBD>)<29>R<> <0C><15>*<2A>*<2A>4<EFBFBD><14>6<><06> <20>D<EFBFBD><17><06><<3C><14>f<EFBFBD><1C>q<EFBFBD>A<EFBFBD><16>+<2B>+<2B>A<EFBFBD>q<EFBFBD>1<>C<EFBFBD><1E>D<EFBFBD>I<EFBFBD>I<EFBFBD>c<EFBFBD>N<EFBFBD>!<21>#<23>E<EFBFBD><18><16>=<3D>%<25><06>-<2D>q<EFBFBD>A<EFBFBD><16>+<2B>+<2B>A<EFBFBD>q<EFBFBD>1<>C<EFBFBD><1E><1C>'<27>'<27><11>1<EFBFBD><13>Q<EFBFBD><07>0<>%&<26>D<EFBFBD>I<EFBFBD>I<EFBFBD>c<EFBFBD>N<EFBFBD>"D<><06><02>B<EFBFBD>!"<22>R<EFBFBD><16><11>R<EFBFBD><16>B<EFBFBD><02>FG<46><04> <09> <09>$<24>";<3B>";<3B>B<EFBFBD>r<EFBFBD>"B<>C<>#E<01><19>#<23>#<23>Q<EFBFBD>q<EFBFBD>S<EFBFBD><11>G<EFBFBD>,<2C>%&<26>D<EFBFBD>I<EFBFBD>I<EFBFBD>c<EFBFBD>N<EFBFBD>"D<><06><02>B<EFBFBD>!"<22>R<EFBFBD><16><11>R<EFBFBD><16>B<EFBFBD><02>FG<46><04> <09> <09>$<24>";<3B>";<3B>B<EFBFBD>r<EFBFBD>"B<>C<>#E<01>#<23><17>t<EFBFBD>{<7B>{<7B>#<23>A<EFBFBD><1A>4<EFBFBD>:<3A>:<3A>&<26><01><1A>/<2F>/<2F><01>1<EFBFBD>5<><03><17>$<24>$<24><1C> <09> <09>#<23><0E>$<24>.<2E>C<EFBFBD>6<EFBFBD>M<EFBFBD> <20><1C> <09> <09>#<23><0E>&<26>0<>c<EFBFBD>V<EFBFBD>m<EFBFBD> <20>@<40>F<EFBFBD>B<EFBFBD><02><1E><12>V<EFBFBD>Q<EFBFBD><12>V<EFBFBD><02>B<EFBFBD><18>B<EFBFBD>+<2B><14><1A><1A>+<2B><01>R<EFBFBD>0E<30>$<24>+<2B>+<2B>0E<30> $<24> 9<> 9<>"<22>b<EFBFBD> A<><05><1F>,<2C>,<2C>#<23>y<EFBFBD>y<EFBFBD><15>/<2F>u<EFBFBD><<3C> $<24> <09> <09>#<23><0E> 5<> 5<>e<EFBFBD> <<3C>#<23>y<EFBFBD>y<EFBFBD><15>/<2F>v<EFBFBD>=<3D> $<24> <09> <09>#<23><0E> 5<> 5<>e<EFBFBD> <<3C>A<01>'<27>$<24><>CBs<00> Oc<00><><00>|j||<02>|j||<02>}|j||<04>}|j|jz}t d<01>g|z}dg|z} d||<t j |g<01>}
|
r`|
j<00>} | |k(rnJ|j| D]5} || t d<01>k(s<01>|| dz|| <| | | <|
j| <0C><00>7|
r<01>`||t d<01>k(ryg} |}|<0E>| j|<0E>| |}|<0E><01>| j<00>t| <0A>dkry| d}||jz}||jz}tj||f||f<02>S)N<>infrr <00>r)r<rrr<00>float<61> collections<6E>deque<75>popleftrr-<00>reverse<73>lenr <00> get_direction)r<00>
posx_start<EFBFBD>
posy_start<EFBFBD>posx_end<6E>posy_end<6E>src_idx<64>dst_idx<64>n<>dist<73>prev<65>queue<75>u<>v<>path<74>cur<75>next_idx<64>next_x<5F>next_ys r<00> guideancez Map.guideanceQs{<00><00> <0C> <0B> <0B>J<EFBFBD>z<EFBFBD>*<2A><16>+<2B>+<2B>J<EFBFBD>
<EFBFBD>C<><07><16>+<2B>+<2B>H<EFBFBD><08>A<><07> <10>J<EFBFBD>J<EFBFBD><14><1B><1B> $<24><01><15>e<EFBFBD> <0C>~<7E><01>!<21><04><14>v<EFBFBD><01>z<EFBFBD><04><19><04>W<EFBFBD> <0A><1B>!<21>!<21>7<EFBFBD>)<29>,<2C><05><13><15> <0A> <0A><0F>A<EFBFBD><10>G<EFBFBD>|<7C><15><19>Y<EFBFBD>Y<EFBFBD>q<EFBFBD>\<5C><01><17><01>7<EFBFBD>e<EFBFBD>E<EFBFBD>l<EFBFBD>*<2A>"<22>1<EFBFBD>g<EFBFBD><01>k<EFBFBD>D<EFBFBD><11>G<EFBFBD><1F>D<EFBFBD><11>G<EFBFBD><19>L<EFBFBD>L<EFBFBD><11>O<EFBFBD> "<22> <14> <10><07>=<3D>E<EFBFBD>%<25>L<EFBFBD> (<28><15><11><04><15><03><11>o<EFBFBD> <10>K<EFBFBD>K<EFBFBD><03> <1C><16>s<EFBFBD>)<29>C<EFBFBD><12>o<EFBFBD> <0A> <0C> <0C><0E> <0E>t<EFBFBD>9<EFBFBD>q<EFBFBD>=<3D><15><17><01>7<EFBFBD><08><19>T<EFBFBD>Z<EFBFBD>Z<EFBFBD>(<28><06><19>d<EFBFBD>k<EFBFBD>k<EFBFBD>*<2A><06><14>"<22>"<22>J<EFBFBD>
<EFBFBD>#;<3B>f<EFBFBD>f<EFBFBD>=M<>N<>Nrc<00><><00>|j||<02>|j||<02>}|j||<04>}|j|jz}t d<01>g|z}dg|z} d||<t j |g<01>}
|
r`|
j<00>} | |k(rnJ|j| D]5} || t d<01>k(s<01>|| dz|| <| | | <|
j| <0C><00>7|
r<01>`||t d<01>k(ry||S<00>Nr>rr r)
r<rrrr@rArBrCrr-) rrGrHrIrJrKrLrMrNrOrPrQrRs r<00>lengthz
Map.lengthrs<><00><00> <0C> <0B> <0B>J<EFBFBD>z<EFBFBD>*<2A><16>+<2B>+<2B>J<EFBFBD>
<EFBFBD>C<><07><16>+<2B>+<2B>H<EFBFBD><08>A<><07> <10>J<EFBFBD>J<EFBFBD><14><1B><1B> $<24><01><15>e<EFBFBD> <0C>~<7E><01>!<21><04><14>v<EFBFBD><01>z<EFBFBD><04><19><04>W<EFBFBD> <0A><1B>!<21>!<21>7<EFBFBD>)<29>,<2C><05><13><15> <0A> <0A><0F>A<EFBFBD><10>G<EFBFBD>|<7C><15><19>Y<EFBFBD>Y<EFBFBD>q<EFBFBD>\<5C><01><17><01>7<EFBFBD>e<EFBFBD>E<EFBFBD>l<EFBFBD>*<2A>"<22>1<EFBFBD>g<EFBFBD><01>k<EFBFBD>D<EFBFBD><11>G<EFBFBD><1F>D<EFBFBD><11>G<EFBFBD><19>L<EFBFBD>L<EFBFBD><11>O<EFBFBD> "<22> <14> <10><07>=<3D>E<EFBFBD>%<25>L<EFBFBD> (<28><15><13>G<EFBFBD>}<7D>rc<00><><00>d}td<01>}|D],}|j|||d|d<00>}|dk7s<01>#||ks<01>)|}|}<04>.|SrZ)r@r[<00>rrGrH<00> positions<6E> closest_pos<6F>
min_length<EFBFBD>pos<6F>temps r<00>closestz Map.closest<73>sV<00><00><1A> <0B><1A>5<EFBFBD>\<5C>
<EFBFBD><1C>C<EFBFBD><17>;<3B>;<3B>z<EFBFBD>:<3A>s<EFBFBD>1<EFBFBD>v<EFBFBD>s<EFBFBD>1<EFBFBD>v<EFBFBD>F<>D<EFBFBD><13>r<EFBFBD>z<EFBFBD>d<EFBFBD>Z<EFBFBD>/<2F>!<21>
<EFBFBD>!<21> <0B> <1D>
<1B>rc<00><><00>d}td<01>}|D]^}tr|d|jdzk\r<17>|d|jdzkr<01>5|j|||d|d<00>}|dk7s<01>U||ks<01>[|}|}<04>`||fS)Nr>rrr r)r@r(rr[r]s r<00>closest_in_rangezMap.closest_in_range<67>s<><00><00><1A> <0B><1A>5<EFBFBD>\<5C>
<EFBFBD><1C>C<EFBFBD><1E><16>q<EFBFBD>6<EFBFBD>T<EFBFBD>Z<EFBFBD>Z<EFBFBD>1<EFBFBD>_<EFBFBD>,<2C><1C><16>q<EFBFBD>6<EFBFBD>D<EFBFBD>J<EFBFBD>J<EFBFBD>!<21>O<EFBFBD>+<2B><1C><17>;<3B>;<3B>z<EFBFBD>:<3A>s<EFBFBD>1<EFBFBD>v<EFBFBD>s<EFBFBD>1<EFBFBD>v<EFBFBD>F<>D<EFBFBD><13>r<EFBFBD>z<EFBFBD>d<EFBFBD>Z<EFBFBD>/<2F>!<21>
<EFBFBD>!<21> <0B><1D><1B>:<3A>%<25>%r<00>
enemy_posX<EFBFBD>
enemy_posY<EFBFBD>returnc<00>r<00><01><02>tjsyt<00><01>fd<02>tjD<00><00>}|S)a1
Calculate the Manhattan distance to the nearest wall.
Args:
enemy_posX: X coordinate of the enemy position
enemy_posY: Y coordinate of the enemy position
Returns:
The minimum Manhattan distance to any wall, or 10**9 if no walls exist
iʚ;c3<00>^<00>K<00>|]$\}}t|<01>z
<00>t|<02>z
<00>z<00><01><00>&y<00>wr)<01>abs)<05>.0rrrfrgs <20><>r<00> <genexpr>z%Map.enemy_to_walls.<locals>.<genexpr><3E>s4<00><><00><><00>
<EFBFBD>#<23><04><01>1<EFBFBD> <10><01>J<EFBFBD><0E> <1F>#<23>a<EFBFBD>*<2A>n<EFBFBD>"5<> 5<>#<23>s<00>*-)r r'r*)rrfrg<00> min_distances `` r<00>enemy_to_wallszMap.enemy_to_walls<6C>s2<00><><00><15>{<7B>{<7B><18><1A>
<EFBFBD><1D> <0B> <0B>
<EFBFBD>
<EFBFBD> <0C><1C>r<00>my_posX<73>my_posY<73>enemy_positionsc<00>0<00>d}td<02>}|jdz}|D]m}tr |d|k\r
<EFBFBD>|d|kr<01>|j|d|d<00>}|j |||d|d<00>} | dk(s | |dzdzkDr<01>^|| ks<01>d||ks<01>j|}|}<04>o||r|fSdfS)a|
Choose the best enemy to attack based on proximity and wall distance.
Args:
my_posX: X coordinate of my position
my_posY: Y coordinate of my position
enemy_positions: List of enemy positions as tuples (x, y)
Returns:
Tuple of (chosen_enemy_position, min_length) or (None, -1) if no suitable enemy
Nr>rrr r<00>)r@rr(ror[)
rrprqrr<00> chosen_enemyr`<00>
half_widthrarbr[s
r<00> choose_enemyzMap.choose_enemy<6D>s<><00><00><1C> <0C><1A>5<EFBFBD>\<5C>
<EFBFBD><19>Z<EFBFBD>Z<EFBFBD>1<EFBFBD>_<EFBFBD>
<EFBFBD>"<22>C<EFBFBD><1E><16>q<EFBFBD>6<EFBFBD>Z<EFBFBD>'<27><1C><16>q<EFBFBD>6<EFBFBD>J<EFBFBD>&<26><1C><17>&<26>&<26>s<EFBFBD>1<EFBFBD>v<EFBFBD>s<EFBFBD>1<EFBFBD>v<EFBFBD>6<>D<EFBFBD><19>[<5B>[<5B><17>'<27>3<EFBFBD>q<EFBFBD>6<EFBFBD>3<EFBFBD>q<EFBFBD>6<EFBFBD>B<>F<EFBFBD><15><12>|<7C>v<EFBFBD><04>q<EFBFBD><08>1<EFBFBD> <0C>4<><18><13>f<EFBFBD>}<7D><14>
<EFBFBD>!2<>!<21>
<EFBFBD>"<22> <0C>#<23><1D>L<EFBFBD>j<EFBFBD>A<>A<>b<EFBFBD>A<>ArN)<0F>__name__<5F>
__module__<EFBFBD> __qualname__rrr<rXr[rcre<00>introrrrw<00>rrr r s<><00><00>!<21>"<22>7=<3D>p O<01>B<1D>.<1B>&<26><1C><13><1C>#<23><1C>#<23><1C>$B<01>C<EFBFBD>B<01>#<23>B<01><04>U<EFBFBD>SV<53>X[<5B>S[<5B>_<EFBFBD>H]<5D>B<01>bg<62>hm<68>nq<6E>sv<73>nv<6E>hw<68>y|<7C>h|<7C>b}<7D>Brr c<00>$<00>tj|<00>td<01>iatdtj t tj <00>d<00>rdnd<05><00><02>tj t tj <00>d<00>ay)Nz Start Game!!zGame Started! Side: r<00>Left<66>Right)r <00>init<69>print<6E>player_to_flag_assignr)<00>list<73>my_team_targetr(<00><01>reqs r<00>
start_gamer<EFBFBD><00>sm<00><00> <09>J<EFBFBD>J<EFBFBD>s<EFBFBD>O<EFBFBD> <09>.<2E><19><1E><19> <09> <20>5<EFBFBD>+;<3B>+;<3B>D<EFBFBD><15>AU<41>AU<41><V<>WX<57><Y<>+Z<><16>`g<> h<>
i<EFBFBD>j<><1B>&<26>&<26>t<EFBFBD>E<EFBFBD>,@<40>,@<40>'A<>!<21>'D<>E<>Orc<00> <00>tj|<00>sytjddd<00><03>}tjddd<01><03>}tjddd<02><03>}tjdd<01><04>}tjdd<01><04>}t tj d<01><05><00>}|D<00>chc] }|dr<01> |d<00><02>}}g} g}
g} g} g} |D]}| j |d|d f<02><00>|D]}|
j |d|d f<02><00>|D]}| j |d|d f<02><00>|D]}| j |d|d f<02><00>|D]}| j |d
|d f<02><00>tj<00>D<00><10>cic] \}}||vr||<11><02>c}}a|r<>|D]<5D>}|d|vr<01> |dtvr*t|d| vr| jt|d<00><00>@tj|d|d | <09>}|<12><01>`|d
|d ft|d<| j|d
|d f<02><00><>i}|D<00>]<5D>}|drRtj|d|d |<06>}tj|d|d |
<EFBFBD>\}}|<12><01>\|d k<00>rV|d
|d f}<14>nJ|dtvr<>t|d}tj|d|d |
<EFBFBD>\}}|<12>|d kr |d
|d f}<14>ntj|d|d | <0B>\}}|<12><>|dkr<>|d
|d f}| j|d
|d f<02>n<>tj|d|d |
<EFBFBD>\}}|<12> |d
|d f}n<>tj|d|d | <0B>}|<12>$|d
|d f}| j|d
|d f<02>nEtj|d|d | <0C>}|<12>$|d
|d f}| j|d
|d f<02>n<02><01><>tj|d|d |d
|d <00>||d<<00><01><>|Scc}wcc}}w)NTFr )r!<00> canPickup)r!r#<00>namer$r%rr rt<00><00>)r r<r,<00>
list_flagsr<EFBFBD><00> list_targetsr-r<><00>items<6D>remove<76>myMaprcrerX)r<><00>
my_players<EFBFBD>enemy_players_flagsr2<00> enemy_flags<67>my_flags<67>
my_targets<EFBFBD>p<>active_player_names<65>
flags_list<EFBFBD> regard_list<73> pretend_list<73> protect_list<73> targets_list<73>flags<67>tr<74>ra<00>f<> player_moves<65>dest<73>lentimerbs r<00>plan_next_actionsr<73><00>s<><00><00> <10><<3C><<3C><03> <1C><0E><17>#<23>#<23><14><05>t<EFBFBD>#<23>L<>J<EFBFBD><1F>,<2C>,<2C>%<25>%<25>QU<51>,<2C>V<><17><19>&<26>&<26>E<EFBFBD>E<EFBFBD>5<EFBFBD>&<26>Q<>M<EFBFBD><17>"<22>"<22><05><14>"<22>><3E>K<EFBFBD><14><1F><1F>T<EFBFBD>T<EFBFBD><1F>:<3A>H<EFBFBD><15>e<EFBFBD>(<28>(<28>d<EFBFBD>(<28>3<>4<>J<EFBFBD>.8<EFBFBD>M<>j<EFBFBD><11><01>)<29> <0C>1<EFBFBD>V<EFBFBD>9<EFBFBD>j<EFBFBD><17>M<><13>J<EFBFBD><14>K<EFBFBD><15>L<EFBFBD><15>L<EFBFBD><15>L<EFBFBD><1C><05><12><19><19>5<EFBFBD><16>=<3D><15>v<EFBFBD><1D>7<>8<><1D> <20><01><13><1A><1A>A<EFBFBD>f<EFBFBD>I<EFBFBD>a<EFBFBD><06>i<EFBFBD>0<>1<>!<21> <1A><01><14><1B><1B>Q<EFBFBD>v<EFBFBD>Y<EFBFBD>q<EFBFBD><16>y<EFBFBD>1<>2<><1B><19><05><14><1B><1B>U<EFBFBD>6<EFBFBD>]<5D>5<EFBFBD><16>=<3D>9<>:<3A><1A> <17><01><14><1B><1B>Q<EFBFBD>q<EFBFBD>T<EFBFBD>!<21>A<EFBFBD>$<24>K<EFBFBD>(<28><18>$9<>#><3E>#><3E>#@<40><06>#@<40>i<EFBFBD>d<EFBFBD>C<EFBFBD> <0F>&<26> &<26> <0A>c<EFBFBD> <09>#@<40><06><19><13><1B>A<EFBFBD><10><16>y<EFBFBD> 3<>3<><18><10><16>y<EFBFBD>1<>1<>6K<36>A<EFBFBD>f<EFBFBD>I<EFBFBD>6V<36>Zd<5A>6d<36><1A>!<21>!<21>"7<><01>&<26> <09>"B<>C<><18><15> <0A> <0A>a<EFBFBD><06>i<EFBFBD><01>&<26> <09>*<2A>=<3D>A<EFBFBD><10>}<7D>45<34>a<EFBFBD>D<EFBFBD><11>1<EFBFBD><14>;<3B>%<25>a<EFBFBD><06>i<EFBFBD>0<><1A>!<21>!<21>1<EFBFBD>Q<EFBFBD>4<EFBFBD><01>!<21><04>+<2B>.<2E><1C><16>L<EFBFBD> <17><01> <0C>Y<EFBFBD><<3C><18>=<3D>=<3D><11>6<EFBFBD><19>1<EFBFBD>V<EFBFBD>9<EFBFBD>Z<EFBFBD>@<40>D<EFBFBD><1D>.<2E>.<2E>q<EFBFBD><16>y<EFBFBD><11>6<EFBFBD><19>;<3B>O<>I<EFBFBD>A<EFBFBD>g<EFBFBD><10>}<7D><17><11><19><19>!<21><04>Q<EFBFBD>q<EFBFBD>T<EFBFBD>{<7B><04> <0E>v<EFBFBD>Y<EFBFBD>/<2F> /<2F>(<28><11>6<EFBFBD><19>3<>D<EFBFBD><1D>.<2E>.<2E>q<EFBFBD><16>y<EFBFBD><11>6<EFBFBD><19>;<3B>O<>I<EFBFBD>A<EFBFBD>g<EFBFBD><10>}<7D><17><12><1A><19>!<21><04>Q<EFBFBD>q<EFBFBD>T<EFBFBD>{<7B><04>!<21>2<>2<>1<EFBFBD>V<EFBFBD>9<EFBFBD>Q<EFBFBD>v<EFBFBD>Y<EFBFBD>|<7C>T<> <09><01>'<27><14>=<3D>W<EFBFBD>Q<EFBFBD>Y<EFBFBD><1D>a<EFBFBD>D<EFBFBD><11>1<EFBFBD><14>;<3B>D<EFBFBD> <20>'<27>'<27><11>1<EFBFBD><14>a<EFBFBD><01>d<EFBFBD> <0B>4<><1A>+<2B>+<2B>A<EFBFBD>f<EFBFBD>I<EFBFBD>a<EFBFBD><06>i<EFBFBD> <0B>L<>F<EFBFBD>A<EFBFBD>d<EFBFBD><10>}<7D><19>!<21><04>Q<EFBFBD>q<EFBFBD>T<EFBFBD>{<7B><04><19>M<EFBFBD>M<EFBFBD>!<21>F<EFBFBD>)<29>A<EFBFBD>f<EFBFBD>I<EFBFBD>l<EFBFBD>C<><01><14>=<3D><1D>a<EFBFBD>D<EFBFBD><11>1<EFBFBD><14>;<3B>D<EFBFBD> <20>'<27>'<27><11>1<EFBFBD><14>a<EFBFBD><01>d<EFBFBD> <0B>4<><1C>}<7D>}<7D>Q<EFBFBD>v<EFBFBD>Y<EFBFBD>q<EFBFBD><16>y<EFBFBD><1C>F<>A<EFBFBD><18>}<7D> !<21>!<21><04>Q<EFBFBD>q<EFBFBD>T<EFBFBD>{<7B><04>$<24>+<2B>+<2B>Q<EFBFBD>q<EFBFBD>T<EFBFBD>!<21>A<EFBFBD>$<24>K<EFBFBD>8<> <20>"'<27>/<2F>/<2F>!<21>F<EFBFBD>)<29>A<EFBFBD>f<EFBFBD>I<EFBFBD>d<EFBFBD>1<EFBFBD>g<EFBFBD>d<EFBFBD>ST<53>g<EFBFBD>"V<> <0C>Q<EFBFBD>v<EFBFBD>Y<EFBFBD><1F>A<18>B <18><17><>EN<01><> s<00>0
P<04>;P<04>P
c<00>F<00>td<01>tjd<02><03>y)Nz
Game Over!T)<01>force)r<>r <00>showr<77>s r<00> game_overr<72>)s<00><00> <09>,<2C><17> <09>J<EFBFBD>J<EFBFBD>T<EFBFBD>J<EFBFBD>rc<00><00><>K<00>ddl}t|j<00>dk7rItd|jd<00>d<04><03>td|jd<00>d<06><03>|j d<07>t |jd<00>}td|<01>d <09><03> t |ttt<00><00>d{<00><03><03>y7<00>#t$r)}td
|<02><00><02>|j d<07>Yd}~yd}~wwxYw<01>w) NrrzUsage: python3 z <port>zExample: python3 z 8080r zAI backend running on port z ...zServer Stopped: ) <0B>sysrE<00>argvr<76><00>exitr{rr<>r<>r<><00> Exception)r<><00>port<72>es r<00>mainr<6E>-s<><00><00><><00><0E>
<EFBFBD>3<EFBFBD>8<EFBFBD>8<EFBFBD>}<7D><01><19> <0A><0F><03><08><08><11> <0B>}<7D>G<EFBFBD>4<>5<> <0A>!<21>#<23>(<28>(<28>1<EFBFBD>+<2B><1D>e<EFBFBD>4<>5<> <0B><08><08><11> <0B> <0E>s<EFBFBD>x<EFBFBD>x<EFBFBD><01>{<7B> <1B>D<EFBFBD> <09> '<27><04>v<EFBFBD>T<EFBFBD>
2<EFBFBD>3<><14><1D>d<EFBFBD>J<EFBFBD>0A<30>9<EFBFBD>M<>M<>M<><4D> <14><14> <0A> <20><11><03>$<24>%<25> <0B><08><08><11> <0B> <0B><><14>sB<00>B C*<01>B5<00>-B3<04>.B5<00>2C*<01>3B5<00>5 C'<03>>C"<03>C*<01>"C'<03>'C*<01>__main__)<18>asyncio<69>lib.game_enginerr<00> threadingrA<00>typingrrr <00>Lock<63>lock<63>last_updated_time<6D>update_thresholdr<64>r(r r<>r<>r<>r<>r<>rx<00>runr|rr<00><module>r<>s<><00><01><0E>4<><10><12><1E><0F><13>%<25><05><15>y<EFBFBD>~<7E>~<7E><17><04><16><11><14><10><1A><15><16><0F>BB<01>BB<01>F <0C><05><05>F<01>M<18>^<1B> <14> <0C>z<EFBFBD><19><0F>G<EFBFBD>K<EFBFBD>K<EFBFBD><04><06><17>r