+
    <Ljj                       R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
Ht ^ RIHt ^ RItR+tRR^uttt]! ]4      P+                  4       P,                  P,                  R,          R,          tR	tR
tRtRtRtRt^tRtRt Rt!Rt"Rt#Rt$RRut%t&Rt'^t(Rt)Rt*Rt+^t,Rt-R,w  t.t/t0t1t2t3R-t4^t5R t6 ! R R4      t7 ! R R 4      t8 ! R! R"4      t9 ! R# R$4      t:R.t;R% t<R& R' lt=R( R) lt>]?R*8X  d   ]P                  ! ]>! 4       4       R# R# )/uT	  Hand-gesture tracker — standalone process, UDP JSON events for the HUD.

Watches the webcam with MediaPipe Hands, tracks BOTH hands independently,
classifies poses (point / pinch / fist / palm), and streams one JSON object
per UDP datagram to 127.0.0.1:47831. Each hand is tagged by the USER's real
hand — "R" or "L" (MediaPipe reports handedness from the mirrored image's
POV, so the user's actual hand is the OPPOSITE; we normalize + debounce it):

  {"t":"hands","armed":true,"hands":[                        ~30Hz stream
     {"hand":"R","x":0.42,"y":0.31,"pose":"point|pinch|mpinch|fist|palm|none"},
     ...0..2 entries, one per hand SEEN this frame... ]}
  {"t":"gesture","name":"ready"}                             once at tracker start
  {"t":"gesture","name":"arm"|"disarm"}
  {"t":"gesture","name":"pinch_start","hand":"R","x":..,"y":..}  STABILIZED coords
  {"t":"gesture","name":"pinch_move|pinch_end","hand":"R","x":..,"y":..}  live coords
  {"t":"gesture","name":"rclick","hand":"R","x":..,"y":..}   thumb+middle, one-shot
  {"t":"gesture","name":"fist_hold","hand":"R","x":..,"y":..}  once per >=0.6s hold

Each hand runs its OWN pinch state machine, its OWN thumb+middle right-click
one-shot, and its OWN fist one-shot, so both hands can gesture at once and
each emits its own stream tagged R/L (the Swift side decides policy: R =
left-click). x/y are screen coords 0..1, origin TOP-LEFT, already mirrored
(webcam is mirrored relative to the user), mapped through a PER-HAND
AUTO-CENTERED window (SPAN_X/SPAN_Y wide, re-centered on the hand when it
appears or when gestures (dis)arm — see _window_lo) and One-Euro smoothed.
The cursor anchor is ALWAYS the index fingertip (even while pinching), so
clicks land exactly where you point. pinch_start/rclick report a STABILIZED
position from ~0.12s before the pinch, so the pinch's fingertip perturbation
doesn't drag the click off-target.

Safety: starts DISARMED. Hold an open palm ~1s to arm; again to disarm
(palm must be dropped between toggles, plus a 1.5s cooldown). While
disarmed nothing is sent except the arm/disarm events. Auto-disarms after
120s without a hand in view.

Standalone by design (stdlib + cv2 + mediapipe + numpy only) so it can run
under .venv-hands if the main venv ever can't hold mediapipe (control.py
prefers that interpreter when present). HANDS_DEBUG=1 shows the annotated
camera feed.
)annotationsN)deque)Pathi  i  modelszhand_landmarker.taskzshttps://storage.googleapis.com/mediapipe-models/hand_landmarker/hand_landmarker/float16/latest/hand_landmarker.taskgffffff?g?gffffff?g?g?      ?g      ?g      ^@333333?g
ףp=
?g{Gz?g{Gz?g\(\?皙?gQ?gffffff?g{Gz?g?c                    WR,          ,
          pV\         8  d   \         pW!,           \        8  d   \        V,
          pV# )zLow edge of the SPAN-wide auto-centered window, SHIFTED (not shrunk) to
keep the whole window inside [WINDOW_MIN, WINDOW_MAX] of the frame.       @)
WINDOW_MIN
WINDOW_MAX)centerspanlos   && voice/hands.py
_window_lor   {   s5     
*	B	J	y:$I    c                  @    ] tR t^tRtRR lt]R 4       tR tR t	Rt
R# )	OneEurou   One-Euro filter (Casiez et al. 2012) — low jitter at rest, low lag
in motion. min_cutoff/beta per the paper's interactive-cursor tuning.c                	Z    WVuV n         V n        V n        R ;V n        ;V n        V n        R # N)
min_cutoffbetad_cutofft_prevx_prevdx_prev)selfr   r   r   s   &&&&r   __init__OneEuro.__init__   s+    4>h1DM3777dkDLr   c                	x    R R\         P                  ,          V ,          ,          pR R W!,          ,           ,          # )r   r
   )mathpi)cutoffdttaus   && r   _alphaOneEuro._alpha   s*    S477]V+,cCHn%%r   c                	J   \        V4      pV P                  f   W!RuV n        V n        V n        V# \	        W P                  ,
          R4      pWP                  ,
          V,          pV P                  V P                  V4      pWT,          RV,
          V P                  ,          ,           pV P                  V P                  \        V4      ,          ,           pV P                  Ws4      pW,          RV,
          V P                  ,          ,           p	W)VuV n        V n        V n        V	# )N        ư>r   )
floatr   r   r   maxr&   r   r   r   abs)
r   xtr$   dxa_ddx_hatr#   ax_hats
   &&&       r   __call__OneEuro.__call__   s    !H;;5632DKdlH[[$'++o#kk$--,S3Y$,,66499s6{#::KK#qDKK//126.T[$,r   c                	0    R ;V n         ;V n        V n        R # r   )r   r   r   r   s   &r   resetOneEuro.reset   s    3777dkDLr   )r   r   r   r   r   r   N)r   gy&1|?r   )__name__
__module____qualname____firstlineno____doc__r   staticmethodr&   r5   r9   __static_attributes__ r   r   r   r      s+    M8 & &8r   r   c                  (    ] tR t^tR tR tR tRtR# )Handc                	j   R V n         R V n        R V n        R^ uV n        V n        RV n        \        \        \        4      V n	        \        \        \        4      V n
        R;V n        V n        R V n        RV n        RR uV n        V n        RV n        RV n        RV n        \)        \*        R7      V n        R# )Fnone      ?TN)maxlen)seenpinching	mpinchingraw_poseraw_nposer   CURSOR_MIN_CUTOFFCURSOR_BETAfxfyr.   ypinch_activempinch_armed
fist_since
fist_firedr   raw_tiplast_seen_tr   CURSOR_HISThistr8   s   &r   r   Hand.__init__   s    	$*A!tz	+[9+[9! +/(-	r   c                	    R V n         R V n        R^ RuV n        V n        V n        V P
                  P                  4        V P                  P                  4        RR uV n        V n	        R# )FrF   N)
rJ   rK   rL   rM   rN   rQ   r9   rR   rV   rW   r8   s   &r   r9   
Hand.reset   sR    
 /5q&,tz49+/(r   c                   a V P                   '       g   V P                  V P                  3# V\        ,
          o\	        V P                   V3R lR7      w  r#pW43# )zSmoothed cursor from ~STABILIZE_LAG_S ago (closest buffered sample),
so a pinch/rclick reports where the hand was AIMING before the pinch
perturbed the fingertip. Falls back to the live cursor.c                6   < \        V ^ ,          S,
          4      # )    )r-   )stargets   &r   <lambda>!Hand.stabilized.<locals>.<lambda>   s    #adVm2Dr   )key)r[   r.   rS   STABILIZE_LAG_Smin)r   now_tbxbyrc   s   &&   @r   
stabilizedHand.stabilized   sF     yyy66466>!&(DE
vr   )r   rW   rV   rQ   rR   r[   rY   rU   rK   rT   rJ   rN   rM   rL   rX   rI   r.   rS   N)r;   r<   r=   r>   r   r9   rm   rA   rB   r   r   rD   rD      s    ."
7r   rD   c                  6    ] tR t^tRtR t]R 4       tR tRt	R# )LabelStickera  Turn MediaPipe's per-frame handedness into a STABLE user-hand id.

MediaPipe classifies handedness from the (mirrored) image's POV, so the
user's real hand is the OPPOSITE of its label ("Left"->user "R"). Raw
labels flip for a frame or two, which would swap the two reticles'
identities; we guard against that by tracking each hand by centroid
position across frames and only committing a new id once a differing
classification persists STICKY_FRAMES frames. Camera-free / testable.c                	    . V n         R # r   tracksr8   s   &r   r   LabelSticker.__init__   s	    r   c                	    V R 8X  d   R# R# )LeftRLrB   )mp_labels   &r   _userLabelSticker._user   s    &(s1c1r   c                	P   V UUu. uF\  w  r#R V P                  V4      R\        VR
,          P                  4       4      \        VR,          P                  4       4      3RVRR/NK^  	  ppp\        4       pV F  pRRr\	        V P
                  4       F@  w  rW9   d   K  \        P                  ! VR,          V
R,          4      pVe	   W8  g   K>  YrKB  	  Vf   Ke  V\        8:  g   Kr  VP                  V4       WR&   K  	  . pV F  pVR,          e   V P
                  VR,          ,          p
VR ,          V
R,          8X  d   R^ uV
R&   V
R&   MfVR ,          V
R,          8X  d@   V
R;;,          ^,          uu&   V
R,          \        8  d   VR ,          R^ uV
R&   V
R&   V
R&   MVR ,          ^uV
R&   V
R&   VR,          V
R&   MRVR ,          RVR,          RRR^ /p
V
R,          VR&   VP                  V
4       K  	  \        V4      ^8X  dl   V^ ,          R,          V^,          R,          8X  dI   V^,          R,          R8X  d   R	MRpW^,          R&   R^ uV^,          R&   V^,          R&   W^,          R&   Wn        V Uu. uF  qfR,          VR,          3NK  	  up# u uppi u upi )rawcptstrackNidcandcand_nrw   rx   )NNNra   )r      )rz   r+   meanset	enumeraters   r!   dist
MATCH_DISTaddSTICKY_FRAMESappendlen)r   r}   mpr   detsuseddbestbiitrdk
new_tracksflips   &&            r   assignLabelSticker.assign   s    <?@;> 

2eCINN4D.E.3CINN4D.E.GWd,;> 	 @ uAT""4;;/9YYqvr#w/<29!" 0 ~$*"4'
  
Az%[[7,U8r$x'/3Q,BvJ8uXF+xLA%L(|}4=>uXtQ:4"V*bl/0x,BvJ8C&3AeHc1S6641MhAdGb! " z?aJqM$$7:a=;N$N$Q--43#D"&qM$=A1:JqM&!:a=#: GDM -12T4!E(#T22Q@P 3s   A"J J#rr   N)
r;   r<   r=   r>   r?   r   r@   rz   r   rA   rB   r   r   rp   rp      s&    M 2 2*3r   rp   c                  H    ] tR tRtRtR tR tRR ltR tR t	R t
R	 tR
tR# )Trackeri  u  Pose classification + gesture state machine, camera-free for tests:
feed step() a list of (label, pts) with label = the USER's real hand as
"R"/"L" and pts = (21,2) normalized array; every outgoing packet goes
through the injected send(dict). Both hands are tracked independently —
each keeps its own filters, its own pinch state machine, and its own fist
one-shot, all tagged by "R"/"L" (feed two hands -> two independent streams).
c                	f    Wn         / V n        R V n        RV n        RV n        RV n        RV n        R# )FNTg    e)sendhandsarmed
palm_sincepalm_rearmedlast_toggle	last_hand)r   r   s   &&r   r   Tracker.__init__  s3    	

 r   c                	   V P                   P                  4        F
  pR Vn        K  	  V F  w  rEV P                   P                  V\	        4       4      pVP
                  f   RMW#P
                  ,
          pVP                  RJ ;'       g    VRJ;'       d
    V\        8  pRVn        W#n        V P                  W5W'4       K  	  V'       d   W n	        V P                   P                  4        F:  pVP                  '       d   K  VP                  R8w  g   K*  VP                  4        K<  	  V P                  V4       V P                  4        R# )FNTrF   )r   valuesrI   
setdefaultrD   rY   r   REAPPEAR_GAP_S_updater   rL   r9   _events_stream)r   detectedri   hlabelr   gapappeareds   &&&     r   stepTracker.step  s   ""$AAF %"JE

%%eTV4A --/$S==5HCxx4' G GCtO -F -F03~0E AFMLL/ #  N""$A666ajjF2	 % 	Sr   c           	     	
   \        \        \        P                  P	                  V\
        ,          V\        ,          ,
          4      4      R 4      pV\        ,          p\         UUu. uFi  w  rx\        P                  P	                  W',          V,
          4      \        P                  P	                  W(,          V,
          4      \        ,          8  NKk  	  p	pp\        P                  P	                  V\        ,          V\        ,          ,
          4      \        V,          8  p
\        V	4      '       * ;'       d    V
'       * p\        \        P                  P	                  V\        ,          V\        ,          ,
          4      4      pVP                  '       d   V\        V,          8  d   RVn        M!V'       g   V\         V,          8  d   RVn        \        \        P                  P	                  V\        ,          V\"        ,          ,
          4      4      pVP$                  '       d   V\        V,          8  d   RVn        M3V'       g,   VP                  '       g   V\         V,          8  d   RVn        \        P                  P	                  V\        ,          V\&        ,          ,
          4      \(        V,          8  pV'       d   RpMrVP                  '       d   RpM]VP$                  '       d   RpMHV	^ ,          '       d   \        V	R,          4      '       g   RpM\+        V	4      '       d   V'       d   RpMR	pWP,                  8X  d   V;P.                  ^,          un        MV^uVn        Vn        VP.                  \0        8  d   Wn        \        V\        ,          ^ ,          4      \        V\        ,          ^,          4      3pR
V^ ,          ,
          pV^,          pVV3Vn        V'       g   VP6                  f
   VV3Vn        \9        \        V\;        VP6                  ^ ,          \<        4      ,
          \<        ,          R4      R
4      p\9        \        V\;        VP6                  ^,          \>        4      ,
          \>        ,          R4      R
4      pVPA                  VV4      VPC                  VV4      uVn"        Vn#        VPH                  PK                  W1PD                  VPF                  34       R# u uppi )r*   FTfistpinchmpinch:r   NNpointpalmrF   r   Nr)   )&r,   r+   nplinalgnorm
MIDDLE_MCPWRISTFINGERSEXTEND_MARGIN	THUMB_TIP	INDEX_MCP	THUMB_OUTany	INDEX_TIPrJ   
PINCH_EXITPINCH_ENTER
MIDDLE_TIPrK   	PINKY_TIPPALM_SPREADallrL   rM   DEBOUNCErN   rX   r   rh   r   SPAN_XSPAN_YrQ   rR   r.   rS   r[   r   )r   r   r   ri   capture_centersizewr/   pext	thumb_out
fist_shapepdistmdistspreadrN   tipmxmysxsys   &&&&&                r   r   Tracker._update6  sC   5J#e*(DEFM JFMOFMda yy~~cfqj)yy~~cfqj)M9:FM 	 OYY^^C	NS^$CD 4'(	S\33)m

 biinnS^c)n%DEF:::zD(("
d(: :AJ biinnS^c*o%EFG;;;zD((#AJJJ5;;M3MAKIY ?@D ! DZZZD[[[DVVCBLLDXX&DD::GGqLG"&AJ77hF
 S^A&'s9~a/@)AB3q6\VH	QXX-BxAHb:ahhqk6::fDcJCPb:ahhqk6::fDcJCP44C=!$$r3-QS	sCCo&yOs   &A/S=c           
     	D   \         ;QJ d4    R  V P                  P                  4        4       F  '       g   K   RM)	  RM%! R  V P                  P                  4        4       4      pV'       g   RV n        RV n        MV P                  f   Wn        V'       dh   V P                  '       dV   V P                  eH   WP                  ,
          \
        8  d-   WP                  ,
          \        8  d   V P                  V4       V P                  '       d;   V P                  e-   WP                  ,
          \        8  d   V P                  V4       V P                  '       gA   V P                  P                  4        F   pRVn        RVn        RRuVn        Vn        K"  	  R# V P                  P!                  4        EFd  w  rCVP"                  ;'       d    VP$                  R8H  pVP                  '       d   V'       d?   V P'                  RV\)        VP*                  ^4      \)        VP,                  ^4      R7       MV P'                  RV\)        VP*                  ^4      \)        VP,                  ^4      R7       RVn        MKV'       dD   RVn        VP/                  V4      w  rgV P'                  RV\)        V^4      \)        V^4      R7       VP"                  ;'       d    VP$                  R	8H  pV'       dW   VP                  '       dE   RVn        VP/                  V4      w  rV P'                  R
V\)        V	^4      \)        V
^4      R7       MV'       g   RVn        VP"                  '       d   VP$                  R8X  d   VP                  f
   Wn        EK  VP                  '       gf   WP                  ,
          \0        8  dH   RVn        V P'                  RV\)        VP*                  ^4      \)        VP,                  ^4      R7       EKO  EKR  EKU  RRuVn        Vn        EKg  	  R# )c              3  f   "   T F'  qP                   ;'       d    VP                  R 8H  x  K)  	  R# 5i)r   N)rI   rN   ).0r   s   & r   	<genexpr>"Tracker._events.<locals>.<genexpr>|  s(     L8K166..aff..8Ks   11TFNr   
pinch_move)handr.   rS   	pinch_endpinch_startr   rclickr   	fist_hold)r   r   r   r   r   PALM_HOLD_Sr   TOGGLE_COOLDOWN_S_toggler   r   AUTO_DISARM_SrT   rU   rV   rW   itemsrI   rN   _gestroundr.   rS   rm   FIST_HOLD_S)r   ri   r   r   r   pinching_nowr   r   
mpinch_nowrxrys   &&         r   r   Tracker._events{  s   sL

8I8I8KLsssL

8I8I8KLL"DO $D__$!OT&&&4??+F//)[8***.??LLJJJ4>>5..(=8LLzzzZZ&&(!&!%-15*al )  

((*HE6677aff&7L~~~JJ|%!&qssA%Q-  A JJ{!&qssA%Q-  A%*AN!%c*

=u"2q\U2q\  ;
 66AFFh$6Jannn!&c*

8%"2q\U2q\  ;!% vvv!&&F*<<'#&L#*<*K#'ALJJ{!&qssA%Q-  A +L
 .25*alI +r   c                	   V P                   '       * V n         Wn        R V n        RV n        V P                  P                  4        F8  pVP                  '       g   K  VP                  f   K'  VP                  Vn        K:  	  T P                  RRRV P                   '       d   RMR/4       \        RV P                   '       d   RMR	 2R
R7       R # )NFr/   gesturenamearmdisarmzhands: r   disarmedTflush)r   r   r   r   r   r   rI   rX   r   r   print)r   ri   r   s   && r   r   Tracker._toggle  s    ^
! ""$Avvv!))/99 %
 			3	6DJJJ5HMN4::::>?tLr   c                	4    V P                  R RRV/VC4       R# )r/   r   r   N)r   )r   r   kws   &&,r   r   Tracker._gest  s    		3	646267r   c                	^   V P                   '       g   R # V P                  P                  4        UUu. uFU  w  rVP                  '       g   K  RVR\	        VP
                  ^4      R\	        VP                  ^4      RVP                  /NKW  	  pppV P                  RRRRRV/4       R # u uppi )	Nr   r.   rS   rN   r/   r   r   T)	r   r   r   rI   r   r.   rS   rN   r   )r   r   r   outs   &   r   r   Tracker._stream  s    zzz  $zz//1=185QVV sE!##qM3acc1 1 	 = 			3$=>=s   B)A B))r   r   r   r   r   r   r   N)F)r;   r<   r=   r>   r?   r   r   r   r   r   r   r   rA   rB   r   r   r   r     s.    .A'J?9BM8?r   r   c                R   VP                   R ,          w  rEV F  w  rgWuV3,          P                  \        4      p\         F8  w  rV P	                  V\        W,          4      \        W,          4      R^4       K:  	  V F!  pV P                  V\        V4      ^RR4       K#  	  K  	  V P                  V^4      pVP                  '       d   RMRpVP                  '       d   RMRpV P                  WRV P                  RV^4       ^<pVP                  P                  4        Fp  w  ppVP                  '       g   K  V P                  W RVP                   RVP                  R RVP                   R 2^
V3V P                  RR^4       V^,          pKr  	  V P#                  R	V4       R
# ):N   NARMEDr   r   z: z  z.2f,gffffff?r   N)ra         )ra   r  ra   )ra   ra   r  )
      )ra   r  r  )shapeastypeintCONNSlinetuplecircler   r   putTextFONT_HERSHEY_SIMPLEXr   r   rI   rN   r.   rS   imshow)cv2framer   trackerhgtwid_labelr   pxr3   br   hdrcolrowr   r   s   &&&&             r   _drawr&    s^   {{2HC#J&&s+DAHHUE"%L%,qI AJJueAh;; 	   HHUAE]]]'
C +KCKKHc&>&>S!L
CMM'')qvvvEWBqvvhbS	133s)DIs77mQ	Pr	 * JJwr   c                   V ^8  d   QhRR/# )r	  returnboolrB   )formats   "r   __annotate__r+    s      t r   c                 h   \         P                  4       '       d   R # \        RR R7        ^ RIp \         P                  P                  R R7       V P                  P                  \        \         4       R #   \         d2   p\         P                  R R7       \        RT 2R R7        Rp?R# Rp?ii ; i)Tz<hands: downloading hand_landmarker model (~8MB, one time)...r   N)exist_ok)
missing_oku(   hands: ERROR — model download failed: F)MODELis_filer   urllib.requestparentmkdirrequesturlretrieve	MODEL_URL	Exceptionunlink)urllibes     r   _ensure_modelr;    s    }}	
HD)""9e4 %8<DIs   AA5 5B1 &B,,B1c                   V ^8  d   QhRR/# )r	  r(  r  rB   )r*  s   "r   r+  r+    s     [ [c [r   c                 |
  aa ^ RI p ^ RIp^ RIHp ^ RIHp \        4       '       g   ^# \        P                  P                  R4      R8H  pRp\        ^4       Ff  pV P                  ^ 4      pVP                  4       '       d    M>VP                  4        V^ 8X  d   \        RRR7       \        P                   ! R	4       Kh  	  Ve   VP                  4       '       g   \        R
RR7       ^# VP#                  V P$                  \&        4       VP#                  V P(                  \*        4       VP#                  V P,                  \.        4       \0        P0                  ! \0        P2                  \0        P4                  4      oV3R lpR.o\6        P6                  ! \6        P8                  V3R l4       \6        P6                  ! \6        P:                  V3R l4       VP<                  P?                  VPA                  VPC                  \E        \F        4      R7      VPH                  PJ                  ^RRR7      4      p\M        V4      p	\O        4       p
\        RRR7       V! RRRR/4       \        PP                  ! 4       pRp S^ ,          '       Ed   VPS                  4       w  rV'       g   \        P                   ! R4       KB  V PU                  WPV                  4      p\Y        \[        \        PP                  ! 4       V,
          R,          4      V^,           4      pTpVP]                  VP_                  VP`                  Pb                  VR7      V4      p. p\e        VPf                  4       F  w  ppRpV\i        VPj                  4      8  d>   VPj                  V,          '       d%   VPj                  V,          ^ ,          Pl                  pTPo                  T\p        Pr                  ! V Uu. uF  pVPt                  VPv                  3NK  	  up4      34       K  	  V
Py                  V4      pV	P{                  V\        PP                  ! 4       4       V'       g   EK  \}        WVV	4       V P                  ^4      ^,          ^8X  g   EK   VP                  4        VP                  4        V'       d   V P                  4        SP                  4        \        RRR7       ^ # u upi   TP                  4        TP                  4        T'       d   T P                  4        SP                  4        \        RRR7       i ; i)ra   N)python)visionHANDS_DEBUG1u`   hands: waiting for camera permission (grant Jarvis in System Settings → Privacy → Camera)...Tr   r   uT   hands: ERROR — cannot open camera 0 (in use, or no Camera permission for this app)c                   <  SP                  \        P                  ! V RR7      P                  4       \        4       R#   \
         d     R# i ; i)r  )
separatorsN)r  :)sendtojsondumpsencodeUDP_ADDROSError)objsocks   &r   r   main.<locals>.send&  s?    	KK

3:>EEG " 		s   :? AAc                 (   < SP                  ^ R4      # ra   F__setitem___arunnings   *r   rd   main.<locals>.<lambda>.  s    g.A.A!U.Kr   c                 (   < SP                  ^ R4      # rO  rP  rR  s   *r   rd   rU  /  s    W-@-@E-Jr   )model_asset_pathr   rG   )base_optionsrunning_mode	num_handsmin_hand_detection_confidencemin_tracking_confidencezhands: tracking startedr/   r   r   readyg?i  )image_formatdataRightzhands: stoppedr  )Br  	mediapipemediapipe.tasksr>  mediapipe.tasks.pythonr?  r;  osenvirongetrangeVideoCaptureisOpenedreleaser   timesleepr   CAP_PROP_FRAME_WIDTHCAM_WCAP_PROP_FRAME_HEIGHTCAM_HCAP_PROP_FPSCAM_FPSsocketAF_INET
SOCK_DGRAMsignalSIGTERMSIGINTHandLandmarkercreate_from_optionsHandLandmarkerOptionsBaseOptionsstrr/  RunningModeVIDEOr   rp   	monotonicreadcvtColorCOLOR_BGR2RGBr,   r  detect_for_videoImageImageFormatSRGBr   hand_landmarksr   
handednesscategory_namer   r   arrayr.   rS   r   r   r&  waitKeyclosedestroyAllWindows)r  r   mp_tasksr?  debugcapattemptr   
landmarkerr  stickert0last_tsokr  rgbtsresr}   r   lmsry   r   r   rT  rL  s                           @@r   mainr    s   2-??JJNN=)S0E C9q!<<>>a< ?FJL

3  {#,,.. )04	6GGC$$e,GGC%%u-GGCg&==):):;D fG
MM&.."KL
MM&--!JK &&::$$!--s5z-J++11*-$' 	% 	)*J dmGnG	
#40 	#y&'	*+		BG,ajj
IB

4 ,,u&7&78CS$..*R/478'A+FBG--bnn&9&9DbJCC#C$6$673"s3>>**s~~a/@/@"~~a03AAH

HbhhC/HCqacc
C/H&IJK	 8 ~~c*HLL4>>#34uc(G4;;q>D(B.!!#

d+ 0I 	!!#

d+s:   ?S$ DS$ $AS$ (!S	AS$ 'S$ S$ S$ $AT;__main__)z	127.0.0.1i׺  )ra            	      ))r     )r  r  )      )      ))ra   r   )r   r	  )r	     )r  r  )ra   r  )r  r  )r     )r  r  )r  r  )r  r  )r     )r  r  )r     )r  r  )r     )r  r  )r     )r  r  )r     )r  r  )ra   r  )Ar?   
__future__r   rF  r!   rd  rv  rs  sysrk  collectionsr   pathlibr   numpyr   rI  rn  rp  rr  __file__resolver2  r/  r6  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rZ   rg   rO   rP   r   r   r   r   r   r   r   r   r   r   r   r   rD   rp   r   r  r&  r;  r  r;   exitrB   r   r   <module>r     st  'R #   	   
    S" ug 	X ''..9<RRC	 
 	  
	t 
J  
  
AR >y)Y
J
0	8 8@& &R;3 ;3|H? H?\	D
, [| zHHTV r   