ó
    @þÛjñ@  ã            
       ój  • S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKJ	r	J
r
  \R                  R                  \R                  R                  \5      5      r\R                  R!                  S\5        SSKrSS/ SS.r\R(                  " 5       r/ SQrS rS rS rS	 rS
 rSS jr " S S\
5      r\S:X  Ga<  SSKrSSK r \ RB                  " 5         \RD                  RG                  SS5        \RD                  RG                  SS5        SSK$r$\R                  R!                  S\R                  RQ                  \S5      5        SSK)r)\RT                  " \RV                   V s0 s H(  o \RX                  RZ                  R]                  X 5      _M*     sn \/" \R                  RQ                  \SS5      S5      5        S r0\Rb                  " \0SS9R9                  5         \	" S\5      Re                  5         gg! \% a  r&\'" S\&SS9   Sr&C&NûSr&C&ff = f! \% a  r&\'" S\&SS9   Sr&C&NÜSr&C&ff = fs  sn f )ax  server.py -- the page, plus the buttons (Ivy, Oct 23 2026: "There should be a play button that lets me start a new creation
when it's not busy. And there should be co op mode so it can play with me.")

    python3 server.py            # http://localhost:8767/viewer.html   (127.0.0.1 only)

Serves reef/ as before, and:
    GET  /api/status             {busy, run, stage, coop}
    GET  /api/catalog?q=frog     search the whole LDraw catalog
    POST /api/bin_add {part}     put a catalog piece in its bin for good
    POST /api/play               start a solo creation (refused while something is building)
    POST /api/coop               start a creation you play together, taking turns
    POST /api/stop               end the game this server started
    POST /api/ghost {card, p}    legal placements of a card nearest point p (our frame), for the page's ghost
    POST /api/pictionary {name}  Pin gets a secret and builds it; you guess (Ivy, Oct 23 2026)
    POST /api/guess {text}       your guess in pictionary -> {right}
    POST /api/giveup             pictionary: show the answer
    POST /api/act  {type, ...}   your move in co-op: card {card} | place {i} | place_at {card, conn, idx, spin} | repaint {j, colour} | swap {card} | back | pass | done
One game at a time. A game started here runs in this process; a build started from the command line still shows up as busy.
Written by Iris.é    N)ÚThreadingHTTPServerÚSimpleHTTPRequestHandler)ÚthreadÚreefÚguessesÚsecret)<ÚgiraffeÚsnailÚrocketÚ
lighthouseÚduckz	palm treeÚrobotÚsnowmanÚcastleÚcrabÚpenguinzice cream coneÚsailboatÚcarÚairplaneÚhouseÚflowerÚmushroomÚdogÚfishÚwhaleÚdinosaurÚspiderÚbridgeÚtrainÚ
helicopterÚumbrellaÚchairÚlampÚguitarÚcactusÚvolcanoÚladybugÚ	butterflyÚowlÚfrogÚturtleÚelephantÚcamelÚwindmillÚtentÚcampfirezbirthday cakeÚcrownÚswordÚkeyÚteapotÚmugÚtowerÚ	satelliteÚsnakeÚbeeÚpigÚtractorÚbedÚflamingoÚoctopusÚtreeÚbirdÚboatc                 ó$  • SR                  S [        U 5      R                  5        5       5      R                  5        Vs/ s H%  n[	        U5      S:”  a  UR                  S5      OUPM'     nnU Vs/ s H  oS;  d  M
  UPM     sn$ s  snf s  snf )NÚ c              3   óR   #   • U  H  oR                  5       (       a  UOS v •  M     g7f)Ú N)Úisalnum)Ú.0Úcs     Ú,/home/ivy/projects/brick_reef/reef/server.pyÚ	<genexpr>Ú_norm.<locals>.<genexpr>%   s!   é € Ð<oÒ`nÐ[\Ç)Á)Ç+Á+¹QÐSVÔ=VÒ`nùs   ‚%'é   Ús)ÚaÚanÚtheÚitÚisÚitsÚthatsÚthatÚiÚthinkÚmaybeÚsomeÚkindÚof)ÚjoinÚstrÚlowerÚsplitÚlenÚrstrip)rM   ÚxÚws      rI   Ú_normrd   $   s�   € Ø57·W±WÑ<oÔ`cÐdeÓ`f×`lÑ`lÔ`nÓ<oÓ5o×5uÑ5uÔ5wÓxÒ5w°œ#˜a›& 1›*ˆ�‰�#Œ¨!Ò	+Ñ5w€AÐxÙó  J’q�!ð  &Iñ  I�A‘qñ  Jð  Jùò 	yùò Js   Á ,BÁ2	BÁ?Bc                 óÜ  ^ ^^	^
^• [        T 5      [        T5      sm
nU(       a  [        U
4S jU 5       5      (       a  gT
(       d  gU(       a  US   OSn[        T
5      S:X  aS  T
S   U:X  dI  UR                  T
S   5      (       a1  [        T
S   5      S:¼  a  S	[        T
S   5      -  [        U5      :¼  a  g SS
KnSS
KnUR                  " SR                  T
5      SR                  U5      /5      ofUR                  R                  USSS9-  n[        US   US   -  5      S:¼  a  g [        R                  R                  S[        R                  R                  [        R                  R!                  ["        5      S5      5        SS
Km	0 mU	U UU4S jn[&        R(                  " USS9oˆR+                  5         UR                  S5        TR-                  SS
5      $ ! [         a     NÁf = f)z»plain match first (every word of the secret in the guess, plurals and 'a'/'the' ignored); a near miss ('boat' for 'sailboat',
'puppy' for 'dog') goes to Haiku, and only a clear yes countsc              3   ó,   >#   • U  H	  oT;   v •  M     g 7f©N© )rG   rc   Úgs     €rI   rJ   Úright_guess.<locals>.<genexpr>,   s   øé € Ð'¢3˜a˜–6¢3ùs   ƒTFéÿÿÿÿrC   é   r   é   é   NrE   )ÚaxisÚkeepdimsg
×£p=
ç?Ú	favoritesc                  óÒ   >•  TR                  ST ST S3/ S5      u  p[        U 5      R                  5       R                  5       R	                  S5      TS'   g ! [
         a     g f = f)NzPictionary. The answer is "z". Someone guessed "z§". Would a fair Pictionary judge accept that guess as naming the answer (same thing, or a plain synonym; NOT just something similar or related)? Answer only YES or NO.é   ÚYESÚyes)Úaskr]   ÚstripÚupperÚ
startswithÚ	Exception)ÚtÚ_ÚHÚguessÚoutr   s     €€€€rI   rv   Úright_guess.<locals>.ask<   sx   ø€ ð	Ø—5‘5Ð6°v°hÐ>RÐSXÐRYð ZMð Nð PRð  TUóV‰DˆAä˜Q›Ÿ™›×-Ñ-Ó/×:Ñ:¸5ÓAˆC�ŠJøÜÓ™$Ðús   ƒAA Á
A&Á%A&©ÚtargetÚdaemoné   ru   )rd   Úallr`   ÚendswithÚteachÚnumpyÚembr\   ÚlinalgÚnormÚfloatrz   ÚsysÚpathÚinsertÚosÚdirnameÚHEREÚhaikuÚ	threadingÚThreadÚstartÚget)r~   r   ÚsecÚheadr‡   ÚnpÚErv   Úthr}   ri   r   s   ``       @@@rI   Úright_guessr�   (   s�  ü€ ô �5‹\œ5 ›=€F€A€sÞ
ŒsÔ'¡3Ó'×'Ñ'°Þ�UÞˆ3ˆrŠ7˜r€DÜ
ˆ1ƒv�ƒ{˜˜!™ ›¨¯©°q¸±t×)<Ñ)<ÄÀQÀqÁTÃÈaÃÐTUÔX[Ð\]Ð^_Ñ\`ÓXaÑTaÔehÐimÓenÓTnØð
ß!Ø�IŠI�s—x‘x “{ C§H¡H¨S£MÐ2Ó3ˆ¸R¿Y¹Y¿^¹^ÈAÐTUÐ`d¸^Ð=eÑ9e°QÜ��1‘˜˜!™‘Ó Ó%¨dÐ%ä‡H�H‡O�O�A”r—w‘w—|‘|¤B§G¡G§O¡O´DÓ$9¸;ÓGÔHÓJ[Ø
€C÷ð ô 
×	Ò	 ¨TÑ	2€B·H±H´JÀÇÁÈÄ
Ø�7‰7�5˜$ÓÐøô Ó‘dÐús   Â8A/G Ç
G+Ç*G+c                 óÄ   • [         S   [        U SS5      [        [         S   5      US.nX l        U R                  R                  U[         S   S9  U R                  5         g )Nr   Úturnr   r   )r   rŸ   r   Úhow)ÚsolvedÚrequest)ÚGAMEÚgetattrr`   r¡   ÚstateÚupdateÚsave)Úrr    Ústs      rI   Úrevealrª   E   sN   € Ü˜‘N¬G°A°v¸qÓ,AÌcÔRVÐW`ÑRaÓNbÐknÑ	o€BØ„H�1—7‘7—>‘>¨´T¸(±^�>ÑDÀaÇfÁfÅhó    c                  óV  •  [         R                  " [        [        R                  R                  [        SS5      5      5      S   n U [         R                  " [        [        R                  R                  [        SU S5      5      5      4$ ! [        [        [        4 a    S 0 4s $ f = f)NÚrunszlatest.jsonÚrunú
state.json)
ÚjsonÚloadÚopenr�   rŽ   r\   r’   ÚOSErrorÚ
ValueErrorÚKeyError)r®   s    rI   Úlatest_stater¶   I   s{   € ðÜ�iŠiœœRŸW™WŸ\™\¬$°¸ÓFÓGÓHÈÑOˆØ”D—I’Iœd¤2§7¡7§<¡<´°f¸cÀ<Ó#PÓQÓRÐRÐRøÜ”Z¤Ð*ó Ø�RˆxŠðús   ‚B	B ÂB(Â'B(c            	      ó¤  • [         S   (       a6  [         S   R                  5       (       a  [        [         S   SS5      (       d  g[        5       u  pU(       d  g[        R                  " 5       [
        R                  R                  [
        R                  R                  [        SU S5      5      -
  S:  nUR                  S	5      S
;  =(       a    U$ )Nr   r   ÚstopFTr­   r¯   iX  Ústage)ÚdoneÚstopped)r£   Úis_aliver¤   r¶   Útimer�   rŽ   Úgetmtimer\   r’   r—   )r®   r©   Úfreshs      rI   ÚbusyrÀ   P   s‘   € ÜˆH‡~œ$˜x™.×1Ñ1×3Ñ3¼GÄDÈÁLÐRXÐZ_×<`Ñ<`ÐimÜ‹n�G€CÞ�eÜ�IŠI‹Kœ"Ÿ'™'×*Ñ*¬2¯7©7¯<©<¼¸fÀcÈ<Ó+XÓYÑYÐ\_Ñ_€EØ�6‰6�'‹?Ð"5Ñ5×?¸%Ð?r«   c                 óŽ  ^ ^^^^^^• SS K nSS KnSS KnXV[        4 H  otR	                  U5        M     T (       a  SOS[
        R                  " S5      -   m[        R                  " S5      mS m[        5       u  p‰T (       Gd  T(       Ga  U	R                  S5      (       aí  U	R                  S5      =(       d    SR                  5       R                  5       TR                  5       R                  5       :X  a—  U	S   n
U
R                  S	5      (       a|  U
R                  S
5      (       af  U
S	   U
S
   SU
R                  SS5       3U	R                  S5      =(       d    0 /S   R                  S5      =(       d    TU
R                  SS5      SS.mU UUUUUU4S jn[        R                  " USS9oÌ[        S'   UR!                  5         T$ )Nr   Úcoop_Úplay_z%m%d_%H%M%Si@B Ú	restartedr¢   rC   Úfirst_pieceÚfirst_colourzstarting it over: ÚwouldÚhistoryrk   Úmight_beT)ÚpieceÚcolourÚwhyÚidearÇ   Úrestartc            
      óþ  >• TSSp!n US:”  GaZ  [        U =(       a    U R                  S5      5      n[        R                  " TU-   [        R
                  R                  [        STU(       a  SU 3OS-   5      XS:X  d  U(       a  T	OS T
S9nTUl        T=(       d    SR                  5       S S	 =(       d    SUl
        [        R                  " 5       Ul        U[        S
'   T
(       a  [        S   Ul        UR!                  U5      o[#        UR$                  5      -  oS-  nU (       a6  T(       d/  T	(       a  U R                  S5      (       a  ['        USS 5      (       a  O	US:”  a  GMZ  [        S
   WL a
  S [        S
'   g g )Ni † r   rÎ   r­   r|   rC   )Úfirstr¢   r   ÚIvyé   r   r   rl   r¡   )Úboolr—   ÚIÚImaginer�   rŽ   r\   r’   Úcooprw   ÚplayerÚqueueÚQueueÚinboxr£   r   Úplayr`   Únotebookr¤   )rÐ   ÚbudgetÚkÚagainr¨   rÖ   ÚnameÚpendingr×   r¢   r   Úseeds        €€€€€€€rI   ÚcareerÚstart.<locals>.careerf   sF  ø€ Ø" F¨A�qˆØ�qŒjÜ˜×7 5§9¡9¨YÓ#7Ó8ˆEÜ—	’	˜$ ™(¤B§G¡G§L¡L´°v¸tÖRSÈÈ1È#ÁwÐY[Ñ?\Ó$]Ðejð  FGó  AGö  KPÑt{ð  W[Ø!'ñ)ˆAàˆAŒF v§°×&=Ñ&=Ó&?ÀÀÐ&D×&MÈ˜1œ8ÔY^×YdÒYdÓYfÈqÌwÐwxÔhlÐmsÑhtÞ¤4¨	¡?�q”yØ—F‘F˜6“NˆE¬c°!·*±*«oÑ$= FÀA¹v¸qÞžD¦W°U·Y±Y¸y×5IÑ5IÌgÐVWÐYaÐcg×NhÑNhÐjoð �qŽjô �‰<˜1Ò¨Tœd 6šlÐr«   r�   r   )Ú	importlibÚto_glbrÛ   rÔ   Úreloadr½   ÚstrftimeÚrandomÚ	randranger¶   r—   rw   r^   r”   r•   r£   r–   )rÖ   r×   r¢   r   rå   ræ   rÛ   ÚmodÚrun_Úst_Úsorã   r{   rà   rá   râ   s   ````         @@@rI   r–   r–   W   s‚  þ€ ÷ #Ó"ØœaÓ ˆ×"2Ñ"2°3Ö"7Ñ Þ‰G ¬D¯MªM¸-Ó,HÑH€DÔQW×QaÒQaÐbgÓQhÈ$ð €GÜ“�I€Dß—G §¡¨× 4Ñ 4¸#¿'¹'À)Ó:L×:RÐPR×9YÑ9YÓ9[×9aÑ9aÓ9cÐgn×gtÑgtÓgv×g|Ñg|Óg~Ó9~Ø�ÑˆØ�6‰6�-× Ñ  R§V¡V¨N×%;Ñ%;Ø " =Ñ 1¸RÀÑ=OÐZlÐmo×msÑmsÐt{Ð}ó  nAð  mBð  YCØ #§¡¨	Ó 2× :°r°d¸BÑ?×CÑCÀJÓO×ZÐSZÐeg×ekÑekÐlsÐuwÓexð  FJñKˆG÷2ó 2ô 	×Ò ¨tÑ4€A´d¸8±nÈ!Ï'É'Ì)Ð\`ÐU`r«   c                   óJ   ^ • \ rS rSrU 4S jrS rSS jrU 4S jrS rSr	U =r
$ )	r}   éu   c                 ó2   >• [         TU ]  " US[        0UD6  g )NÚ	directory)ÚsuperÚ__init__r’   )rM   rN   rÞ   Ú	__class__s      €rI   rô   Ú
H.__init__v   s   ø€ œe™gÒ.°ÐG¼TÐGÀQÓGr«   c                 ó   • g rg   rh   )rM   rN   s     rI   Úlog_messageÚH.log_messagew   s   € ˜Dr«   c                 ó.  • [         R                  " U5      R                  5       o0R                  U5        U R	                  SS5        U R	                  S[        [        U5      5      5        U R                  5         U R                  R                  U5        g )NúContent-Typezapplication/jsonúContent-Length)
r°   ÚdumpsÚencodeÚsend_responseÚsend_headerr]   r`   Úend_headersÚwfileÚwrite)rM   ÚobjÚcodeÚbs       rI   Ú	send_jsonÚH.send_jsonx   s^   € Ü�JŠJ�s‹O×"Ñ"Ó$ˆ§o¡o°dÔ&;¸Q¿]¹]È>Ð[mÔ=nØ	�‰Ð&¬¬C°«F«Ô4°a·m±m´oÀqÇwÁwÇ}Á}ÐUVÕGWr«   c                 ó  >• U R                   R                  S5      (       Ga^  SSKJnJn  SS KnU" U" U R                   5      R                  5      oDR                  S5      =(       d    S/S   n[        UR                  S5      =(       d    S/S   =(       d    S5      n UR                  5       (       a  UR                  " USU5      nO”SS KoƒR                  " 5        V	V
Vs0 s H  u  pšo¹U
_M
     nn
n	n[        [        UR                  5      5      oÝXfS-     V	s/ s H:  o™UR                  X˜R                   R"                  R                  X™5      5      S	S
.PM<     nn	U R%                  S	US S ['        U5      S:„  S.5      $ U R                   R                  S5      (       Ga!  SSKJnJn  SS KnUR,                  " U" U" U R                   5      R                  5      R                  S5      =(       d    S/S   5      n	U	(       d"  U R/                  S5        U R1                  5         g [3        U	S5      R5                  5       oðR/                  S5        U R7                  SS5        U R7                  S[+        ['        U5      5      5        U R7                  SS5        U R1                  5         U R8                  R;                  U5        g U R                   R                  S5      (       a¾  [=        5       u  nn[>        R@                  " [3        [B        R                   RE                  [F        S5      5      5      R                  S5      =(       d    SnU R%                  [M        5       UUR                  S5      [O        [P        S   =(       a    [P        S   RR                  5      US.5      $ [T        TU ]­  5       $ s  snn
n	f s  sn	f ! [(         a+  nU R%                  S[+        U5      S S / S.5      s S nA$ S nAff = f! [H        [J        4 a    Sn N¾f = f) Nz/api/catalogr   )ÚurlparseÚparse_qsÚqrC   ÚoffsetÚ0é   T)Úpartrà   Úin_biné   )ÚokÚresultsÚmoreFéÈ   )r  rÌ   r  z/api/previewr  é”  Úrbrû   z	image/pngrü   zCache-Controlzmax-age=86400z/api/statusz	self.jsonrà   rQ   r¹   r   )rÀ   r®   r¹   rÖ   rà   ),rŽ   ry   Úurllib.parser
  r  ÚpartbinÚqueryr—   Úintrw   ÚcatalogrÛ   ÚindexÚlistÚreversedÚPALETTEÚCXÚNAMESr  r`   rz   r]   Úpreviewrÿ   r  r²   Úreadr   r  r  r¶   r°   r±   r�   r\   r’   r³   r´   rÀ   rÓ   r£   rÖ   ró   Údo_GET)rM   r
  r  r  Úqsr  ÚoffÚresrÛ   ÚpÚnr|   ÚnamesÚallpÚer  r®   r©   Únmrõ   s                      €rI   r&  ÚH.do_GET{   s~  ø€ Ø�6‰6×Ñ˜^×,Ò,ß7ÛÙ™( 1§6¡6Ó*×0Ñ0Ó1ˆB¿¹¸s»×8KÈÀtÈQÑ7O°1ÔWZÐ\^×\bÑ\bÐckÓ\l×\uÐqtÐpuÐwxÑ[y×[~Ð}~ÓWÐQTðiØ—7‘7—9‘9 G§O¢O°A°r¸3Ó$?™cã¿mºm¼oÕ)Nºo±7°1¸¨Qª$¹o Ò)NÜ¤¨¯©Ó 6Ó7�Dð  Z]ð  dfñ  ^fñ  Ugó  @hò  Ugð  PQÐTY×T]ÑT]Ð^_×ahÑah×anÑan×arÑarÐstÓaxÓTyð  FJô  AKñ  Ug¸ð  @hØ—{‘{¨$¸3¸sÀ¸8ÌSÐQTËXÐXZÉ]Ñ#[Ó\Ð\à�6‰6×Ñ˜^×,Ò,ß7ÛØ—’¡©(°1·6±6Ó*:×*@Ñ*@Ó!A×!EÑ!EÀfÓ!M×!UÐRTÐQUÐWXÑ YÓZˆAÞ�a—o‘o cÔ*¨A¯M©M¬O¸VÜ�Q˜“×"Ñ"Ó$ˆA§o¡o°cÔ&:¸A¿M¹MÈ.ÐZeÔ<fÐhi×huÑhuð  wGô  ILô  MPð  QRó  MSó  ITô  iUØ�M‰M˜/¨?Ô;¸Q¿]¹]¼_ÈaÏgÉgÏmÉmÐ\]ÔN^Ð`fØ�6‰6×Ñ˜]×+Ñ+Ü"“n‰GˆC�Ü—i’i¤¤R§W¡W§\¡\´$¸Ó%DÓ EÓF×JÑJÈ6ÓR×ZÐVZ�à—;‘;¬«°sÀRÇVÁVÈGÃ_Ô^bÔcgÐhnÑco÷  dFÔtxÐyñ  uA÷  uFñ  uFó  _Gð  QSñ   Tó  Uð  UÜ‰w‰~ÓÐùô! *Oùò @høäÓh¨!¯+©+¸UÌ3ÈqË6ÐRVÐSVÈ<ÐdfÑ6gÓ*hÕ#hûÐhûô œZÐ(Ó3¨tª"Ð3úsQ   ÂAN; Ã!N/Ã0*N; ÄAN6Å%N; Ë0AO3 Î/N; Î;
O0Ï O+Ï%O0Ï+O0Ï3PÐPc                 ó  • [        U R                  R                  S5      =(       d    S5      n[        R                  " U R
                  R                  U5      =(       d    S5      n[           U R                  S;   a~  [        5       (       a  U R                  SSS.S5      sS S S 5        $ U R                  S	[        U R                  S
:H  UR                  S5      UR                  S5      S9S.5      sS S S 5        $ U R                  S:X  a“  [        5       (       a  U R                  SSS.S5      sS S S 5        $ [        R                  " [        5      [        S'   / [        S'   U R                  S	[        SUR                  S5      [        S   S9S.5      sS S S 5        $ U R                  S;   Ga¢  [        S   nU(       a  [!        USS5      (       d  U R                  SSS.S5      sS S S 5        $ UR"                  (       a%  U R                  S	S	[        S   S.5      sS S S 5        $ U R                  S:X  a0  [%        US5        U R                  S	[        S   S.5      sS S S 5        $ ['        UR                  SS5      5      R)                  5       S S nU(       d  U R                  SS05      sS S S 5        $ U[!        USS5      S S .n[        S   R+                  U5        [-        [        S   5      UR.                  S'   UR1                  5         XS4S! jn[2        R4                  " US	S"9R                  5         U R                  SS	05      sS S S 5        $ U R                  S#:X  a¸  [        S   nU(       aƒ  S	Ul        UR8                  R;                  S$S%05        [!        US&S 5      nU(       a!  UR=                  5       c  UR?                  5         UR.                  RA                  S'S'S(9  UR1                  5         U R                  S[E        U5      05      sS S S 5        $ U R                  S):X  Ga  SS K#nURH                  " ['        UR                  S*S5      5      UR                  S5      =(       d    S+R)                  5       S S, =(       d    S+SS-9u  pšU	(       ad  [2        R4                  " URJ                  ['        UR                  S*S5      5      R)                  5       RM                  5       4S	S.9R                  5         [        S   nU	(       a  Ub  [!        US/S 5      b  S Ul'        U R                  XšS.5      sS S S 5        $ U R                  S0:X  a¸  [        S   nU(       a0  URP                  (       a  UR.                  R                  S15      S2;   d  U R                  S/ S3.5      sS S S 5        $ U R                  SS	0URS                  US4   US5   [E        UR                  S65      5      UR                  S75      S89E5      sS S S 5        $ U R                  S;:X  av  [        S   nU(       a  URP                  (       d  U R                  SS<S.S5      sS S S 5        $ UR8                  R;                  U5        U R                  SS	05      sS S S 5        $  S S S 5        U R                  SS=S.S>5        g ! [B         a     GNÂf = f! [B         a4  nU R                  S['        U5      S S9 / S:.5      s S nAsS S S 5        $ S nAff = f! , (       d  f       Nv= f)?Nrü   r   s   {})z	/api/playú	/api/coopFzit is busy building right now)r  rÌ   i™  Tr2  rà   r¢   )rÖ   r×   r¢   )r  r®   z/api/pictionaryr   r   )rÖ   r×   r   )z
/api/guessú/api/giveupr   Ú
pictionaryzno pictionary game is running)r  Úrightr   r3  zgave up)r  r   ÚtextrC   éP   r  rŸ   )r6  rŸ   r5  c                 ó  • [        U S   [        S   5      n[        U5      U S'   Uc  SU S'   U S   (       a  UR                  (       d  [	        US5        [        [        S   5      UR                  S'   UR                  5         g )Nr6  r   r5  TÚ	uncheckedÚguessedr   )r�   r£   rÓ   r¡   rª   r  r¥   r§   )ri   r¨   r  s      rI   ÚjudgeÚH.do_POST.<locals>.judge§   se   € Ü$ Q v¡Y´°X±Ó?�BÌdÐSUËhÀÀ7ÁØ‘z°D 1 [¡>Ø˜—z¨!¯(¯(´F¸1¸iÔ4HÜ)-¬d°9©oÓ)>�A—G‘G˜IÑ&ÀÇÁÅr«   r�   z	/api/stopÚtyperº   Ú_procr»   )r¹   Úerrorz/api/bin_addr  rÑ   rÒ   )Údescribe_it)r‚   Úargsrƒ   Ú_deck_wz
/api/ghostr¹   )Ú	your_turnÚyour_options)r  ÚghostsÚcardr*  ÚunderÚnode)rG  rH  r  )r  rÌ   rE  z/api/actzno co-op game is runningÚunknownr  )*r  Úheadersr—   r°   ÚloadsÚrfiler%  ÚLOCKrŽ   rÀ   r  r–   ré   ÚchoiceÚWORDSr£   r¤   r¡   rª   r]   rw   Úappendr  r¥   r§   r”   r•   r¸   rÚ   ÚputÚpollÚkillr¦   rz   rÓ   r  ÚaddÚdescriber^   rB  rÖ   rE  )rM   r+  Úbodyr¨   r6  ri   r;  r*  r  r  Úmsgr.  s               rI   Údo_POSTÚ	H.do_POST”   s  € Ü�—	‘	—‘Ð.Ó/×4°1Ó5ˆ¼d¿jºjÈÏÉÏÉÐVWË×IaÐ\aÓ>b°tÞØ�v‰vÐ3Ó3Ü—6‘6 !§+¡+°UÐCbÑ.cÐehÓ"i÷ ‰Tð —{‘{¨$´uÀ!Ç&Á&ÈKÑBWÐ`d×`hÑ`hÐioÓ`pÐz~÷  {Cñ  {Cð  DMó  {Nñ  8Oñ  $Pó  Q÷ ‰Tð �v‰vÐ*Ó*Ü—6‘6 !§+¡+°UÐCbÑ.cÐehÓ"i÷ ‰Tô "(§¢¬uÓ!5”�X‘È´t¸I±Ø—{‘{¨$´uÀ%ÐPT×PXÑPXÐY_ÓP`ÔimÐnvÑiwÑ7xÑ#yÓz÷ ‰Tð �v‰vÐ6Ô6Ü˜‘L�Þœg a¨°u×=Ñ=ÀqÇ{Á{ÐZ_ð  iHñ  TIð  KNó  HO÷ ‰Tð —8—8 A§K¡K°tÀdÔVZÐ[cÑVdÑ0eÓ$f÷ ‰Tð —6‘6˜]Ó*¬F°1°iÔ,@ÈÏÉÐ\`ÔlpÐqyÑlzÑU{ÓI|÷ ‰Tô ˜4Ÿ8™8 F¨BÓ/Ó0×6Ñ6Ó8¸¸"Ð=�Þ A§K¡K°°u°Ó$>÷ ‰Tð "¬7°1°f¸aÓ+@È4ÑP�ÔRVÐW`ÑRa×RhÑRhÐijÔRkÜ%)¬$¨y©/Ó%:�—‘˜	Ñ"¸A¿F¹F¼HØô Iô
 × Ò ¨°dÑ;×AÑAÔCØ—{‘{ D¨$ <Ó0÷/ ‰Tð0 �v‰v˜Ó$Ü˜‘L�ÞØ!�A”F 1§7¡7§;¡;°¸Ð/?Ô#@Ü  7¨DÓ1�AÞ˜QŸV™V›XÑ-¨q¯v©v¬xØŸ™Ÿ™¨i¸y˜ÑIÈ1Ï6É6Ì8à—{‘{ D¬$¨q«' ?Ó3÷A ‰TðB �v‰v˜Ô'ÛØ!Ÿ+š+¤c¨$¯(©(°6¸2Ó*>Ó&?À$Ç(Á(È6ÓBR×B[ÐV[×AbÑAbÓAdÐehÐfhÐAi×ArÐmrð  AFñ  G‘�Þ”y×'Ò'¨w×/?Ñ/?ÄsÈ4Ï8É8ÐTZÐ\^ÓK_ÓG`×GfÑGfÓGh×GnÑGnÓGpÐFrÐ{ñ  A÷  Gñ  Gô  IÜ˜‘L�Þ˜!™-¬G°A°yÀ$Ó,GÑ,SÐaeÐUVÔU^Ø—{‘{¨"Ñ#9Ó:÷O ‰TðP �v‰v˜Ó%Ü˜‘L�Þ˜aŸfŸf¨¯©¯©°WÓ)=ÐA^Ó)^Ðhi×hsÑhsð  |Að  MOñ  uPó  iQ÷U ‰TðV ŸK™K¨¨tð  )P°q·x±xÀÀVÁÈdÐSVÉiÔ_cÐdh×dlÑdlÐmtÓduÓ_vð  ~B÷  ~Fñ  ~Fð  GMó  ~N°xð  8Oð  )Pó  Q÷W ‰TðZ �v‰v˜Ó#Ü˜‘L�Þ˜aŸfŸf¨a¯k©kÀÐOiÑ:jÐloÓ.p÷_ ‰Tð` —‘—‘˜DÔ!¨!¯+©+°t¸T°lÓ*C÷a ‰TðZ $÷[ ðb 	
�‰˜5¨Ñ3°SÕ9øô% %Ó*¢dÐ*ûô !Ók¨a¯k©kÀÌsÐSTËvÐVZÐWZÈ|ÐgiÑ:jÓ.kÔ'k÷Y ‰TûðX lú÷Y �Tús²   Á,4[;Â*A[;Ã;3[;Ä8A[;ÆA[;Ç/,[;È%6[;É%A[;Ê4B[;ÍA9[;Ï
*Z)Ï4[;ÐD[;Ô<A#[;Ö)AZ:ØA[;Ù-[;Ú)
Z7Ú3[;Ú6Z7Ú7[;Ú:
[8Û [3Û$[8Û%[;Û3[8Û8[;Û;
\	rh   )r  )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rô   rø   r  r&  rX  Ú__static_attributes__Ú__classcell__)rõ   s   @rI   r}   r}   u   s   ø† ÝGÚ ôXõ ÷23:ð 3:r«   r}   Ú__main__ÚHIP_VISIBLE_DEVICESrC   ÚCUDA_VISIBLE_DEVICESz$sentence_transformers import failed:T©ÚflushÚteacherzteacher import failed:Úpartsz
names.jsonrc   c                  ó˜  • [         R                  [        [         R                  5      -    H"  n [         R                  R                  U 5        M$     [        R                  R                  S[        R                  R                  [        S5      5        SS KoR                  " S/5        g ! [         a  n[        SUSS9   S nAg S nAff = f)Nr   re  zwarm upzteacher warmup failed:Trc  )rÛ   r!  r  Ú
BASEPLATESÚGr¿   r�   rŽ   r�   r�   r\   r’   r‡   r‰   rz   Úprint)r+  r‡   r.  s      rI   Úwarmrk  Õ   sr   € Ü—‘¤¤T§_¡_Ó 5Ô5ˆA´t·v±v·|±|ÀA¶Ñ5Ü�X‰X�_‰_˜Q¤§¡§¡¬T°9Ó =Ô>ÃÏiÊiÐYbÐXcÕNdøÜÓMœuÐ%=¸qÈ×MûÐMús   ÁAB* Â*
C	Â4CÃC	r�   )z	127.0.0.1i?"  )rÑ   NN)3Ú__doc__r°   r�   r�   r”   r½   rØ   ré   Úhttp.serverr   r   rŽ   r‘   ÚabspathÚ__file__r’   r�   ÚimaginerÔ   r£   ÚLockrM  rO  rd   r�   rª   r¶   rÀ   r–   r}   rZ  rÛ   r  r  ÚenvironÚ
setdefaultÚsentence_transformersrz   r.  rj  r\   r‡   Údumpr!  r"  r#  r—   r²   rk  r•   Úserve_forever)r+  s   0rI   Ú<module>rw     sÍ  ðñ÷& 5× 4× 4Ó 4ß EØ	‡w�w‡��r—w‘w—‘ xÓ0Ó1€°3·8±8·?±?À1ÀdÔ3KÛ à °¸tÑD€Ø‡~‚~Ó€ò	~€òJò ò:Oòò@ôaô<R:Ð ô R:ðh ˆzÔÛó �G—M’M”OØ‡J�J×ÑÐ/°Ô4°b·j±j×6KÑ6KÐLbÐdfÔ6gÛ	%à	�‰�‰˜˜BŸG™GŸL™L¨¨yÓ9Ô	:»Là‡I‚I°4·<²<Ó@²<¨a�$—'‘'—-‘-×#Ñ# AÓ)Ò)±<Ñ@Á$ÀrÇwÁwÇ|Á|ÐTXÐZaÐcoÓGpÐruÓBvÔwòNð ×Ò˜D¨Ñ.×4Ñ4Ô6ÙÐ+¨QÓ/×=Ñ=Õ?ð# øð ÓW™5Ð!GÈÐRV×WûÐWûàÓI™5Ð!9¸1ÀD×IûÐIüÚ@s6   ÄG: Ä:H Å&/H0Ç:HÈ HÈHÈH-ÈH(È(H-