§
    `Òjaì ã                  ód  — d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	m
Z
 ddlmZ ddlmZ ddlmZmZmZmZmZmZmZmZ 	 ddlZddlmZ d	Zn# e$ r d
ZeZY nw xY wdZe	 G d„ d¦  «        ¦   «         Ze	 G d„ d¦  «        ¦   «         Ze	 G d„ d¦  «        ¦   «         Z G d„ de e¦  «        Z!e	 G d„ d¦  «        ¦   «         Z"e	 G d„ d¦  «        ¦   «         Z#e	 G d„ d¦  «        ¦   «         Z$ G d„ d¦  «        Z% G d„ de&¦  «        Z' G d„ de e¦  «        Z(d“d$„Z)d”d'„Z*d•d*„Z+d–d—d.„Z, e	d	¬/¦  «         G d0„ d1¦  «        ¦   «         Z- e	d	¬/¦  «         G d2„ d3¦  «        ¦   «         Z. G d4„ d5¦  «        Z/ G d6„ d7¦  «        Z0d8d9d:œZ1 e	d	¬/¦  «         G d;„ d<¦  «        ¦   «         Z2 e	d	¬/¦  «         G d=„ d>¦  «        ¦   «         Z3 G d?„ d@¦  «        Z4d˜dB„Z5 G dC„ dDe e¦  «        Z6 e	d	¬/¦  «         G dE„ dF¦  «        ¦   «         Z7 G dG„ dH¦  «        Z8 G dI„ dJe¦  «        Z9 G dK„ dL¦  «        Z: e/¦   «         Z; e/d
¬M¦  «        Z<d™dšdP„Z=d›dQ„Z>d›dR„Z?dœd�dW„Z@džd[„ZAdŸd d]„ZBd¡d^„ZCd¢d`„ZDd£db„ZEe	 G dc„ dd¦  «        ¦   «         ZF G de„ df¦  «        ZGe	 G dg„ dh¦  «        ¦   «         ZH e	d	¬/¦  «         G di„ dj¦  «        ¦   «         ZIe	 G dk„ dl¦  «        ¦   «         ZJ G dm„ dn¦  «        ZKee e f         ZLd¤dp„ZM G dq„ dre¦  «        ZN e	d	¬/¦  «         G ds„ dt¦  «        ¦   «         ZO G du„ dv¦  «        ZPe	 G dw„ dx¦  «        ¦   «         ZQ G dy„ dz¦  «        ZRd¥d¦d€„ZS G d�„ d‚¦  «        ZTdƒZUd„ZVd…ZWd†ZX ed‡dˆ¦  «        gZY eZd‰dŠd‹dŒ¬�¦  «        Z[dŽZ\d¤d�„Z]d�„ Z^d§d‘„Z_e`d’k    r eja         e_¦   «         ¦  «         dS dS )¨uý4  
ç”µè¡¨ã€Œä¸Šxæ¬¡æ•´ç‚¹å†»ç»“æ•°æ�®ã€�æŠ„è¯»ç¨‹åº�ï¼ˆv2ï¼šç±»åž‹åŒ– + æ‹†ç±»ï¼‰
============================================================
æ¼”è¿›è·¯çº¿ï¼šbuddy.pyï¼ˆé‡�å†™ç‰ˆï¼‰â†’ freeze_reader.pyï¼ˆç²¾ç®€ï¼šåˆ è‡ªæµ‹ + ä¸€è½®ä¼˜åŒ–ï¼‰
        â†’ æœ¬æ–‡ä»¶ï¼ˆåœ¨ freeze_reader.py åŸºç¡€ä¸Šå�šç»“æž„é‡�æž„ï¼Œè¡Œä¸ºä¸�å�˜ï¼‰

ã€�v2 å�šäº†ä»€ä¹ˆã€‘
------------------------------------------------------------
1) è§£æž�ç»“æžœç±»åž‹åŒ–ï¼Œå¹²æŽ‰ã€ŒåµŒå¥— dictã€�ã€‚
   æ—§å†™æ³•è°ƒç”¨æ–¹è¦�å†™ rep["645"]["err_code"]ã€�d.get("PayloadHex")ï¼Œ
   é”®å��å†™é”™è¦�ç­‰è¿�è¡Œæ—¶æ‰�ç‚¸ï¼Œä¹Ÿçœ‹ä¸�å‡ºä¸€ä¸ªåº”ç­”åˆ°åº•æœ‰å“ªäº›å­—æ®µã€‚
   çŽ°åœ¨å…¨éƒ¨æ˜¯ frozen dataclassï¼Œä¸¤å±‚å°�é¡¶ä¸”å­—æ®µæœ‰å��å­—ã€�æœ‰ç±»åž‹ï¼š

       DLT645Frame   ä¸€å¸§ 645 åº”ç­”ï¼ˆ.kind / .di / .payload / .freeze / .error_codeï¼‰
       FreezeBlock   16B å†»ç»“å�—ï¼ˆ.freeze_time / .positive / .reverse / .rawï¼‰
       LocalFrame    ä¸€å¸§æœ¬åœ°è§„çº¦ï¼ˆ.task_id / .seq / .inner / .checksum_okï¼‰
       TaskStatusReport  ä¸ŠæŠ¥ä»»åŠ¡çŠ¶æ€�å¸§
       Uplink        ä¸Šè¡Œå¸§çš„åˆ†ç±»ç»“æžœï¼ˆUplinkKind åˆ¤åˆ«å¼� + è¯¥åˆ†æ”¯çš„å­—æ®µï¼‰

   äºŽæ˜¯ frame.freeze.freeze_time å°±æ˜¯æœ€æ·±ä¸€å±‚ï¼Œä¸�å†�æ˜¯
   session._cache[(addr, di)]["645"]["freeze_time"] è¿™ç§�é’»æ³•ã€‚

2) æ‹†ç±»ã€‚v1 çš„ FreezeReadSession æœ‰ 900 è¡Œï¼Œå�Œæ—¶å…¼ä»»å��è®®è§£æž�å™¨ã€�æ—¥å¿—æ–‡ä»¶
   ç®¡ç�†å™¨ã€�CSV å†™å…¥å™¨ã€�ç¼“å­˜ç®¡ç�†å™¨ã€‚v2 æŒ‰è�Œè´£æ‹†å¼€ï¼š

       DLT645Codec / LocalProtocolCodec   å¸§è§£æž�ï¼ˆçº¯è§£æž�ï¼Œä¸�ç¢° IOï¼‰
       UplinkClassifier                   ä¸Šè¡Œå¸§åˆ†ç±»ï¼ˆbytes â†’ Uplinkï¼Œå�«æ—¥å¿—ï¼‰
       FrameSplitter                      å­—èŠ‚æµ�åˆ‡å¸§ï¼ˆå¸¦æ®‹ç•™ç¼“å†²ï¼‰
       UplinkPump                         æ”¶å�‘ + åˆ†ç±» + å›žç¡®è®¤ + äº¤å½’å±ž
       FrameRouter                        åº”ç­”å½’å±ž / å»¶è¿Ÿç¼“å­˜ / è¡¥æŠ„ / æ”¾å¼ƒ
       AckResponder                       ç¡®è®¤å¸§ä¸ŽåŽ»é‡�
       LogSink / CsvWriter                å››ä»½æ–‡æœ¬æ—¥å¿— / ä¸šåŠ¡æ•°æ�®è¡¨
       SessionStats                       ä¼šè¯�è®¡æ•°
       FreezeReadSession                  å�ªå‰©æµ�ç¨‹ç¼–æŽ’ã€�é‡�è¯•ä¸Žæ”¾å¼ƒç­–ç•¥

3) é¡ºæ‰‹ä¿®æŽ‰ä¸€ä¸ªç»§æ‰¿è‡ª v1 çš„æ˜¾ç¤ºç¼ºé™·ï¼šæ—¥å¿—æ³¨è§£é‡Œï¼ŒERR=1 ä¸”æ•°æ�®åŸŸä¸º
   ã€ŒDI(4B) + é”™è¯¯ç �ã€�æ—¶ï¼Œæ—§ä»£ç �æŠŠ DI çš„é¦–å­—èŠ‚å½“æˆ�é”™è¯¯ç �æ‰“å�°
   ï¼ˆå®žæµ‹ï¼š0x02 æ— è¯·æ±‚æ•°æ�® è¢«æ˜¾ç¤ºæˆ� 0x07 è´¹çŽ‡æ•°è¶…ï¼‰ã€‚çŽ°åœ¨æ³¨è§£å¤�ç”¨ç±»åž‹åŒ–
   è§£æž�å™¨ï¼Œä¸�å†�è‡ªå·±åˆ‡ä¸€é��å­—èŠ‚ â€”â€” å�Œä¸€è¯­ä¹‰å�ªæœ‰ä¸€ä»½å®žçŽ°ã€‚

å��è®®è¯­ä¹‰ã€�å½’å±žè§„åˆ™ã€�æ”¾å¼ƒç­–ç•¥ã€�æ—¥å¿—æ–‡æœ¬å…¨éƒ¨ä¸Ž v1 ä¿�æŒ�ä¸€è‡´ï¼šv1 çš„ä¸‰å¥—è‡ªæµ‹
**åŽŸæ ·** è·‘åœ¨ v2 ä¸Šå…¨éƒ¨é€šè¿‡ã€‚ï¼ˆv1 é‚£è½®ç²¾ç®€çš„æ”¹åŠ¨è§�æ–‡æœ«ã€‚ï¼‰

ç»„åŒ…éƒ¨åˆ†ä¾�æ—§åŽŸæ ·ä¿�ç•™ï¼š

    DLT645FrameBuilder     DL/T 645-2007 ç»„åŒ…
    DLT645Codec            DL/T 645-2007 è§£åŒ…ï¼ˆç±»åž‹åŒ–ï¼Œæ›¿ä»£ DLT645Parserï¼‰
    LocalProtocolBuilder   å�—ç½‘é›†ä¸­å™¨æœ¬åœ°é€šä¿¡è§„çº¦ç»„åŒ…
    LocalProtocolCodec     å�—ç½‘é›†ä¸­å™¨æœ¬åœ°é€šä¿¡è§„çº¦è§£åŒ…ï¼ˆç±»åž‹åŒ–ï¼Œæ›¿ä»£ LocalProtocolParserï¼‰
    SerialPort             ä¸²å�£æ”¶å�‘

é‡�å†™çš„æŠ„è¯»æµ�ç¨‹ï¼ˆæ ¸å¿ƒå�˜æ›´ï¼‰
------------------------------------------------------------
1. å¤–å±‚å¾ªçŽ¯ = ã€Œè¡¨ã€�ï¼Œå†…å±‚å¾ªçŽ¯ = ã€Œä¸Š1æ¬¡ â†’ ä¸Š2æ¬¡ â†’ ... ä¸ŠNæ¬¡å†»ç»“æ•°æ�®ã€�ï¼›
2. ç”µè¡¨ä¸€æ—¦å›žå¤�**é”™è¯¯å¸§**ï¼ˆ645 åº”ç­”å¸§ ERR=1ï¼‰ï¼Œç«‹å�³æ”¾å¼ƒè¯¥è¡¨å�Žé�¢æ‰€æœ‰
   ã€Œä¸Šxæ¬¡å†»ç»“æ•°æ�®ã€�çš„æŠ„è¯»ï¼Œç›´æŽ¥åˆ‡æ�¢åˆ°ä¸‹ä¸€å�ªè¡¨ï¼›
3. é”™è¯¯å¸§ä¸�é‡�è¯•ï¼ˆç”µè¡¨å·²ç»�æ˜Žç¡®åº”ç­”ï¼Œé‡�è¯•æ²¡æœ‰æ„�ä¹‰ï¼‰ï¼›
   å�ªæœ‰ è¶…æ—¶ / æ— åº”ç­” / å¸§æ ¡éªŒå¤±è´¥ æ‰�é‡�è¯•ï¼›
   è¿™ä¸¤ç±»é—®é¢˜ï¼ˆæ‹¥å¡ž/å›žæ”¾å¯¼è‡´çš„å�¶å�‘ï¼‰æ”¹ä¸ºã€Œè¿žç»­ N æ¬¡ã€�æ‰�æ”¾å¼ƒæœ¬è¡¨ï¼Œ
   é�¿å…�ä¸€æ¬¡å�¶å�‘è¶…æ—¶æŠŠæ•´å�ªè¡¨ 250 å¤šé¡¹å…¨éƒ¨è¯¯æ�€ï¼ˆå®žæµ‹è¸©è¿‡ï¼‰ï¼›
4. è¢«æ”¾å¼ƒçš„å†»ç»“é¡¹ä»¥ SKIPPED çŠ¶æ€�è®°è´¦ï¼Œæœ€ç»ˆè�½ç›˜ 4 ä»½æ–‡æœ¬æ—¥å¿—ã€‚

ã€�å…³é”®æ¦‚å¿µã€‘TaskID â‰  ä¸Šxæ¬¡ä»»åŠ¡å�—ï¼ˆåŠ¡å¿…åˆ†æ¸…ï¼‰
------------------------------------------------------------
Â· ã€Œä¸Šxæ¬¡ä»»åŠ¡å�—ã€�= å†…å±‚ 645 çš„æ•°æ�®æ ‡è¯† DIï¼ˆ0504FF01..0504FFFEï¼‰ï¼� çœŸæ­£çš„ä¸šåŠ¡èº«ä»½ï¼Œ
  å®ƒæ‰�æ˜¯å½’å±žåº”ç­”çš„å”¯ä¸€ä¾�æ�®ã€‚
Â· å¤–å±‚æœ¬åœ°è§„çº¦çš„ TaskID = æˆ‘ä»¬ä¸‹å�‘æ—¶å¡«çš„ä¸€ä¸ª 16 ä½�**æµ�æ°´å�·**ï¼Œæ¨¡å�—**åŽŸæ ·å›žæ˜¾**ã€‚

  å®žæµ‹ï¼ˆCOM4 / 260498001817ï¼Œå�Œä¸€ä¸ª DI æ�¢ä¸�å�Œ TaskID ä¸‹å�‘ï¼‰ï¼š
        ä¸Š1æ¬¡ é…� TaskID=0x002A(42)   â†’ å›žå¤�å¤–å±‚ TaskID=42
        ä¸Š14æ¬¡ é…� TaskID=0x0001(1)   â†’ å›žå¤�å¤–å±‚ TaskID=1
        ä¸Š9æ¬¡ é…� TaskID=0x0100(256)  â†’ å›žå¤�å¤–å±‚ TaskID=256
        ä¸Š9æ¬¡ é…� TaskID=0x0F00(3840) â†’ å›žå¤�å¤–å±‚ TaskID=3840
    å�¯è§� TaskID ä¸Žã€Œä¸Šxæ¬¡ã€�ç¼–å�·æ¯«æ— å…³ç³»ï¼Œæ¨¡å�—å�ªæ˜¯ç…§æŠ„ã€‚
    ä¹‹å‰�ä¹‹æ‰€ä»¥å®¹æ˜“çœ‹æ··ï¼Œæ˜¯å› ä¸ºæ—§è„šæœ¬çš„æµ�æ°´å�·æ�°å¥½ä»Ž 1 å¼€å§‹ã€�å�ˆæ�°å¥½æŒ‰ ä¸Š1ã€�ä¸Š2â€¦ é¡ºåº�ä¸‹å�‘ï¼Œ
    äºŽæ˜¯æ—¥å¿—é‡Œå‡ºçŽ°ã€ŒTaskID=5 â†” ä¸Š5æ¬¡ã€�è¿™ç§�**å·§å�ˆ**ï¼Œè®©äººè¯¯ä»¥ä¸º TaskID å°±æ˜¯ä»»åŠ¡å�—ç¼–å�·ã€‚
    ä¸€æ—¦ä¸­é€”æ”¹äº†èµ·å§‹ä½�ç½®ï¼ˆå¦‚ --from 9ï¼‰ï¼Œè¿™ä¸ªå·§å�ˆç«‹åˆ»ä¸�æˆ�ç«‹ï¼šä¸Š9æ¬¡ çš„ TaskID å°±æ˜¯ 1ã€‚

ã€�æœ¬æ¬¡ä¿®å¤�ã€‘åº”ç­”å½’å±žå½»åº•ä¸�ç”¨ TaskIDï¼Œå¼‚å¸¸åº”ç­”ä¹ŸæŒ‰ DI å½’å±ž
------------------------------------------------------------
çŽ°è±¡ï¼šè¿�è¡Œä¸­å¤§é‡�å‡ºçŽ°
        [è·³è¿‡ä¸�åŒ¹é…�ä»»åŠ¡] TaskID=1 æœŸæœ›=14
      ï¼ˆå®žæµ‹ä¸€æ¬¡è¿�è¡Œå‡ºçŽ° 76 æ¬¡ï¼‰ï¼Œå¹¶ä¸”æœ¬é¡¹è¦�ç™½ç­‰ä¸€ä¸ªå®Œæ•´è¶…æ—¶æ‰�é� é‡�å�‘æ‹¿åˆ°æ•°æ�®ã€‚

åŽŸå› ï¼šCCO/æ¨¡å�—çš„ä¸Šè¡Œé€šé�“æ˜¯**ç§¯åŽ‹å›žæ”¾**çš„ â€”â€” ä¸‹å�‘ç¬¬ 14 é¡¹æ—¶ï¼Œæ¨¡å�—å…ˆæŠŠé˜Ÿåˆ—é‡Œ
      ç¬¬ 1..9 é¡¹ï¼ˆä¼šè¯�å†…æ›´æ—©ä¸‹å�‘çš„ä»»åŠ¡ï¼‰çš„**æ—§åº”ç­”**æˆ�æ‰¹å��å‡ºæ�¥ï¼ŒçœŸæ­£çš„ç¬¬ 14 é¡¹åº”ç­”
      è¢«æŽ’åœ¨è¿™äº›å›žæ”¾å¸§ä¹‹å�Žã€‚æ—§ä»£ç �æ‹¿å¤–å±‚ TaskID å�šä¸¥æ ¼ç›¸ç­‰åˆ¤æ–­ï¼ŒäºŽæ˜¯ï¼š
        â‘  è¿™æ‰¹æ˜Žæ˜Žå¸¦ç�€çœŸå®žå†»ç»“æ•°æ�®çš„å¸§è¢«æ•´æ‰¹ä¸¢å¼ƒï¼›
        â‘¡ å½“å‰�é¡¹ä¸€ç›´ç­‰ä¸�åˆ°"è‡ªå·±çš„"å¸§ â†’ åˆ¤è¶…æ—¶ â†’ é� ä¸‹ä¸€æ¬¡é‡�å�‘æ‰�æˆ�åŠŸï¼ˆæ¯�æ¬¡ç™½ç­‰ timeout ç§’ï¼‰ã€‚

ä¿®å¤�ï¼š
  Â· å½’å±žæ”¹ç”¨ (è¡¨å�·, DI)ï¼šå�ªè¦�å†…å±‚ 645 çš„ DI å°±æ˜¯å½“å‰�è¦�æŠ„çš„ DIï¼Œå°±æ˜¯ç­”æ¡ˆï¼›
    TaskID ä¸€å¾‹ä¸�å�‚ä¸Žå½’å±žï¼ˆå�ªåœ¨æ—¥å¿—é‡Œä½œä¸ºæµ�æ°´å�·æ˜¾ç¤ºï¼‰ï¼›
  Â· â˜… 645 å¼‚å¸¸åº”ç­”ï¼ˆERR=1ï¼‰ä¹Ÿè§£æž� DIï¼šæ•°æ�®åŸŸ â‰¥4 å­—èŠ‚æ—¶å‰� 4 å­—èŠ‚å°±æ˜¯ DIï¼Œ
    äºŽæ˜¯å¼‚å¸¸å¸§å�Œæ ·æŒ‰ (è¡¨å�·, DI) å½’å±ž â€”â€” ä¹‹å‰�æ‹¿ TaskID å½’å±žå¼‚å¸¸å¸§ï¼Œ
    ä¸€æ—¦å›žæ”¾/å»¶è¿Ÿå°±ä¼šæŠŠæŸ�ä¸€å�—çš„å¼‚å¸¸ç®—åˆ°å�¦ä¸€å�—å¤´ä¸Šï¼›
  Â· â˜… å¼‚å¸¸å¸§è‹¥ç¡®å®žä¸�å¸¦ DIï¼ˆéƒ¨åˆ†è¡¨æ•°æ�®åŸŸå�ªæœ‰ 1 å­—èŠ‚é”™è¯¯ç �ï¼‰ï¼Œå�ªåœ¨ã€Œæ­£åœ¨ç­‰æœ¬é¡¹åº”ç­”ã€�
    çš„çª—å�£å†…æŒ‰ä¸Šä¸‹æ–‡å½’å±žï¼›çª—å�£å¤–ï¼ˆé‡�è¯•å‰�æŽ’ç©ºç¼“å†²æ”¶åˆ°çš„æ®‹ç•™å¸§ï¼‰ä¸€å¾‹ä¸�å½’å±žã€�ä¸�å…¥ç¼“å­˜ï¼Œ
    æ�œç»�è¢«å�Žé�¢åˆ«çš„ä»»åŠ¡å�—è¯¯å�ƒï¼ˆæ—§ç‰ˆç”¨ ("ERR",è¡¨å�·,TaskID or 0) å�šé”®ï¼ŒTaskID=0 æ—¶é”®é€€åŒ–æˆ�
    é€šé…�é”®ï¼Œä¼šè¢«**ä¸‹ä¸€ä¸ª**ä»»åŠ¡å�—è¯¯å¼¹å‡ºæ�¥ï¼Œç›´æŽ¥æŠŠå¥½æ•°æ�®åˆ¤æˆ�é”™è¯¯å¸§å¹¶ä¸­æ­¢æ•´è¡¨ï¼‰ï¼›
  Â· ä¸�å±žäºŽå½“å‰�ä»»åŠ¡çš„å¸§ä¸�å†�ä¸¢å¼ƒ â†’ è¿›ã€Œå»¶è¿Ÿåº”ç­”ç¼“å­˜ã€�ï¼›
    Â· è‹¥å®ƒå±žäºŽæœ¬è¡¨ã€�ä¸”æ˜¯æ­¤å‰�è¶…æ—¶æ²¡å�–åˆ°çš„é¡¹ â†’ ç«‹å�³å›žå¡«ï¼ˆ**è¡¥æŠ„**ï¼‰ï¼Œä¸�ç”¨é‡�å�‘ï¼›
    Â· è‹¥è¯¥ DI æ­¤å‰�å·²æŠ„å›ž â†’ æ ‡ [é‡�å¤�å¸§]ï¼ˆå›žæ”¾é‡�å¤�ï¼‰ï¼Œå�ªè®° raw æ—¥å¿—ï¼›
  Â· æ¯�æ¬¡ä¸‹å�‘å‰�å…ˆæŸ¥ç¼“å­˜ï¼šå‘½ä¸­ç›´æŽ¥ç”¨ï¼ˆ**ä¸�é‡�å�‘**ï¼Œçœ�ä¸€æ¬¡å¾€è¿”ï¼‰ï¼›
  Â· ä¸‹å�‘å‰� drain ä¸²å�£æ®‹ç•™å¸§å…¥ç¼“å­˜ï¼Œé�¿å…�è·¨ä»»åŠ¡ä¸²å¸§ï¼›
  Â· å¸§åˆ‡åˆ†å¸¦æ®‹ç•™ç¼“å†²ï¼ˆåŽŸæ�¥çš„å�Šå¸§ä¼šè¢«ä¸¢å¼ƒï¼‰ï¼›
  Â· è¯†åˆ«åˆ°ã€Œæœ¬è¡¨å›žæ”¾å¸§æŒ¤å� çª—å�£ã€�ä¸”é�™é»˜è¶…è¿‡ replay_grace ç§’ â†’
    æ��å‰�ç»“æ�Ÿæœ¬æ¬¡ç­‰å¾…è¿›å…¥é‡�å�‘ï¼Œä¸�å†�å¹²ç­‰æ•´ä¸ª timeoutï¼›
  Â· 21 å­—èŠ‚çš„ C=0xC0 æ¨¡å�—çŠ¶æ€�å¸§ç­‰å½’ä¸ºã€Œé�žæŠ„è¯»å¸§ã€�ï¼Œä¸�å†�æŠ¥"é�žæ³•å¸§/ä¸ŠæŠ¥å¸§è¿‡çŸ­"ã€‚

ã€�æœ¬æ¬¡ä¿®å¤�2ã€‘æ¨¡å�—ä¸‰ç§�"é�žæ•°æ�®"ä¸Šè¡ŒæŠ¥æ–‡çš„è¯†åˆ«ä¸Žå¤„ç½®ï¼ˆè½½æ³¢è°ƒè¯•è½¯ä»¶é€�å­—æ®µæ ¸å¯¹ï¼‰
------------------------------------------------------------
ä¸‹å�‘ä¸€æ�¡æŠ„è¯»ä»»åŠ¡å�Žï¼Œæ¨¡å�—é™¤äº†å›ž 645 æ•°æ�®å¸§ï¼Œè¿˜å�¯èƒ½å›žä¸‹é�¢è¿™äº›å¸§ï¼›å®ƒä»¬éƒ½ä¸�å�«æ•°æ�®ï¼Œ
ä½†**æ¯�ä¸€æ�¡éƒ½å¿…é¡»æ”¶åˆ°æˆ‘ä»¬çš„ç¡®è®¤å¸§**ï¼Œå�¦åˆ™æ¨¡å�—ä¼šä¸€ç›´é‡�ä¼ ï¼š

â‘  å�—ç�†å›žæ‰§ï¼ˆç¡®è®¤å¸§ï¼‰  C=0x80 / PRM=0 / AFN=00 ç¡®è®¤Â·å�¦è®¤
     680E00800034010001E800009E16
   â†’ å�ªè¡¨ç¤º"ä»»åŠ¡å·²å�—ç�†"ï¼Œæ•°æ�®éš�å�Žå�¦å�‘ã€‚å�ªèƒ½è®° [ç¡®è®¤å¸§] è·³è¿‡ï¼Œ
     ç»�ä¸�èƒ½åˆ¤æˆ�é�žæ³•å¸§/é”™è¯¯å¸§ï¼ˆæ—©æœŸç‰ˆæœ¬ä¼šæŠ¥"ä¸ŠæŠ¥å¸§è¿‡çŸ­"ï¼‰ã€‚

â‘¡ ä¸ŠæŠ¥ä»»åŠ¡çŠ¶æ€�        C=0xC0 / AFN=05 ä¸ŠæŠ¥ä¿¡æ�¯ / DUID=050505E8 ä¸ŠæŠ¥ä»»åŠ¡çŠ¶æ€�
     681500C00505050505E80100171800980426FFB216
     è§£æž�ï¼šTaskID=0001  ä»ŽèŠ‚ç‚¹åœ°å�€=260498001817  ä»»åŠ¡çŠ¶æ€�=FF(å…¶å®ƒ)
   â†’ æ¨¡å�—æ— æ³•æ‰§è¡Œè¯¥æŠ„è¯»ä»»åŠ¡æ—¶ä¸�å›žæ•°æ�®å¸§ï¼Œè€Œå›žè¿™ä¸ªã€‚
     Â· ä»»åŠ¡çŠ¶æ€�=00(æˆ�åŠŸ)ï¼šç»§ç»­ç­‰æ•°æ�®å¸§ï¼›
     Â· ä»»åŠ¡çŠ¶æ€�â‰ 00ï¼ˆå¦‚ FF å…¶å®ƒï¼‰ï¼šæœ¬é¡¹**ä¸�ä¼šæœ‰æ•°æ�®**ï¼Œç«‹å�³ç»“æ�Ÿæœ¬æ¬¡ç­‰å¾…ï¼Œ
       æŒ‰"æ— åº”ç­”"è®°è´¦å¹¶é‡�è¯•ï¼›è¿žç»­ streak_limit æ¬¡ â†’ æŒ‰ç­–ç•¥æ”¾å¼ƒæœ¬è¡¨å‰©ä½™ï¼Œåˆ‡ä¸‹ä¸€å�ªè¡¨ã€‚
       è¿™æ ·å°±ä¸�å¿…å†�ä¸ºæ¯�ä¸€é¡¹ç™½ç­‰ä¸€æ•´ä¸ª timeoutã€‚

â‘¢ ä¸ŠæŠ¥ä»»åŠ¡æ•°æ�®        C=0xE0ï¼ˆå¸¦åœ°å�€åŸŸï¼‰/ AFN=05 / DUID=010505E8
     682F00E0010000074C5808000000000005D0010505E80100146868010000074C586891â€¦
     ï¼ˆSEQ=D0ã€�TaskID=0001ã€�æŠ¥æ–‡é•¿åº¦ 14Hã€�å†…å±‚ 645 åº”ç­”ï¼‰â†’ æ­£å¸¸è§£æž�æ•°æ�®ã€‚

â˜… ç¡®è®¤å¸§ï¼ˆå›žç»™æ¨¡å�—ï¼‰ï¼šC=0x00 ä¸‹è¡Œ / PRM=0 / AFN=00 ç¡®è®¤Â·å�¦è®¤
     68 0E 00 00 00 SEQ 01 00 01 E8 00 00 BA 16      â†� SEQ=0xD0 æ—¶çš„å®žä¾‹
   SEQ å¿…é¡»**ä¸Žè¢«ç¡®è®¤çš„é‚£æ�¡ä¸ŠæŠ¥æŠ¥æ–‡å®Œå…¨ä¸€è‡´**ï¼ˆå�–ä¸ŠæŠ¥å¸§çš„"å¸§åº�åˆ—åŸŸSEQ"ï¼‰ã€‚
   å�Œä¸€ (æº�åœ°å�€, SEQ) åœ¨ ack_dedup ç§’å†…å�ªç¡®è®¤ä¸€æ¬¡ï¼šå›žæ”¾é£Žæš´æ—¶å�Œä¸€å¸§ä¼šè¢«æˆ�æ‰¹å��å‡ºï¼Œ
   é‡�å¤�ç¡®è®¤æ²¡æœ‰æ„�ä¹‰ã€‚å�¯ç”¨ --no-ack å…³é—­ã€�--ack-dedup è°ƒçª—å�£ã€‚

æ—¥å¿—æ–‡ä»¶ï¼ˆå…¨éƒ¨çº¯æ–‡æœ¬ .txtï¼Œç›´æŽ¥å�¯è¯»ï¼›.log/.csv ä¼šè¢«éƒ¨åˆ†å·¥å…·å½“äºŒè¿›åˆ¶ï¼‰
------------------------------------------------------------
    read_freeze.txt        ä¸»æ—¥å¿—ï¼šæµ�ç¨‹ + æ¯�å¸§é€�å­—æ®µè§£æž�ï¼ˆå�«å†…å±‚ 645ã€�å†»ç»“å�—ï¼‰
    raw_frames.txt         åŽŸå§‹æŠ¥æ–‡æµ�æ°´ï¼šä¸€è¡Œä¸€å¸§ï¼ˆTX-LOCAL / RX-LOCAL / RX-645 / GIVE-UPï¼‰
    freeze_blocks.txt      å†»ç»“æ•°æ�®å�—æ˜Žç»†ï¼šä¸€è¡Œä¸€å�—ï¼ˆæ—¶é—´ + æ­£å��å�‘ + åŽŸå§‹å­—èŠ‚ï¼‰
    freeze_data.txt        ä¸šåŠ¡æ•°æ�®è¡¨ï¼ˆé€—å�·åˆ†éš”ï¼ŒExcel/WPS å�¯ç›´æŽ¥æ‰“å¼€ï¼‰

ç”¨æ³•
------------------------------------------------------------
    python freeze_reader_v2.py                                # æŒ‰æ–‡ä»¶å†…é…�ç½®æŠ„è¯»
    python freeze_reader_v2.py --port COM3 --baud 9600          # è¦†ç›–ä¸²å�£å�· / æ³¢ç‰¹çŽ‡
    python freeze_reader_v2.py --meter 260498001817 --meter 260498001820
    python freeze_reader_v2.py --from 1 --to 24                 # å�ªæŠ„ ä¸Š1æ¬¡~ä¸Š24æ¬¡
    python freeze_reader_v2.py --keep-on-timeout                # è¶…æ—¶/å��å¸§æ°¸ä¸�æ”¾å¼ƒæœ¬è¡¨
    python freeze_reader_v2.py --no-ack --dump-console           # ä¸�å›žç¡®è®¤å¸§ + è§£æž�æ‰“å±�

    # å½“åº“ç”¨ï¼ˆç»„å�ˆå¼�è£…é…�ï¼Œæµ‹è¯•å�¯ç”¨å�‡ä¸²å�£æ›¿æŽ‰ Transportï¼‰ï¼š
    logs = LogSink(log_path="read.txt", raw_log_path="raw.txt")
    session = FreezeReadSession(transport=SerialPort("COM4"),
                                logs=logs, csv=CsvWriter("data.txt"))
    session.run([MeterAddress("260498001817", "1# è¡¨")],
                make_freeze_items(1, 24))

freeze_reader.pyï¼ˆv1ï¼‰ç›¸å¯¹ buddy.py çš„æ”¹åŠ¨ï¼ˆv2 ç»§æ‰¿ï¼‰
------------------------------------------------------------
ã€�åˆ é™¤ã€‘
  Â· ç§»é™¤ selftest_replay / selftest_taskid_semantics / selftest_status_and_ack
    ä¸‰å¥—è‡ªæµ‹ï¼Œä»¥å�Š _ScriptedTransportã€�_di_bytesã€�_bcd_bytesã€�_freeze_payloadã€�
    _build_645_respã€�_build_local_reportã€�_build_ackã€�_build_statusã€�--selftestã€‚
  Â· ç§»é™¤ä»Žæœªè¢«èµ‹å€¼çš„æ­»å±žæ€§ _freeze_fpã€�æœªä½¿ç”¨çš„ timedelta å¯¼å…¥ã€�
    ä»¥å�Š recv() é‡Œæ³¨é‡ŠæŽ‰çš„ä¸€è¡Œæ—¥å¿—ã€‚

ã€�ä¿®æŽ‰çš„çœŸé—®é¢˜ã€‘
  Â· CSV è�½ç›˜æ—¶æœºï¼šåŽŸæ�¥åœ¨ã€Œæœ¬è¡¨æ”¶å°¾è¡¥æŠ„ã€�ä¹‹å‰�å°±å†™ï¼Œè¿Ÿåˆ°åº”ç­”å›žå¡«çš„é‚£ä¸€é¡¹
    ä¼šä¸Ž CSV é‡Œè®°çš„ NO_RESP ä¸�ä¸€è‡´ã€‚çŽ°åœ¨ç»Ÿä¸€æŽ¨è¿Ÿåˆ° run() æœ«å°¾ï¼ˆå…¨è¡¨æŠ„å®Œã€�
    æœ€å�Žä¸€è½®è¡¥æŠ„æ”¶å¹²ä¹‹å�Žï¼‰ä¸€æ¬¡æ€§è�½ç›˜ï¼Œæ—¥å¿—ä¸Ž CSV å¿…ç„¶ä¸€è‡´ã€‚
  Â· æ”¾å¼ƒæœ¬è¡¨å�Žï¼Œè¯¥è¡¨è¢«æ”¾å¼ƒçš„ DI è‹¥è¿˜æœ‰åº”ç­”ä¸Šæ�¥ï¼ŒåŽŸæ�¥ä¼šè¿›ã€Œå»¶è¿Ÿåº”ç­”ç¼“å­˜ã€�
    æ°¸è¿œæ²¡äººå�–ï¼ˆçº¯åžƒåœ¾ï¼Œè¿˜ä¼šè®©æ—¥å¿—å‡ºçŽ°åƒ�æ¨¡åƒ�æ ·çš„ [ç¼“å­˜å»¶è¿Ÿåº”ç­”]ï¼‰ã€‚
    çŽ°åœ¨æŒ‰ (è¡¨å�·, DI) è®°å…¥ _abandonedï¼Œç›´æŽ¥è®° [å·²æ”¾å¼ƒ] ä¸¢å¼ƒã€‚
  Â· ä¸²å�£æ‰“å¼€å�Žä¸�æ¸…è¾“å…¥ç¼“å†²ï¼šä¸Šä¸€æ¬¡ä¼šè¯�æ®‹ç•™çš„å­—èŠ‚ä¼šè¢«å½“æˆ�ç¬¬ä¸€å�ªè¡¨çš„åº”ç­”ã€‚
    çŽ°åœ¨ open() é‡Œ reset_input_buffer()ã€‚
  Â· Ctrl-C åŽŸæ�¥ä¼šç›´æŽ¥ä¸¢æŽ‰å½“å‰�è¡¨çš„å…¨éƒ¨ç»“æžœï¼ˆCSV æœªå†™ã€�å‰©ä½™é¡¹æ— è®°å½•ï¼‰ã€‚
    çŽ°åœ¨æŒ‰ SKIPPED è®°è´¦ã€�å�œæ­¢å�Žç»­ç”µè¡¨ã€�ç…§å¸¸è�½ç›˜å¹¶æ‰“å�°æ±‡æ€»ã€‚

ã€�æ•ˆçŽ‡ã€‘
  Â· æ—¥å¿—å�¥æŸ„å¤�ç”¨ï¼šåŽŸæ�¥ freeze_blocks.txt æ¯�å†™ä¸€è¡Œå°± open/close ä¸€æ¬¡æ–‡ä»¶
    ï¼ˆ255 é¡¹ Ã— N å�ªè¡¨ï¼Œçº¯å±žæµªè´¹ï¼‰ï¼ŒçŽ°åœ¨å››ä»½æ—¥å¿—å�„å¤�ç”¨ä¸€ä¸ªå�¥æŸ„ã€‚
  Â· SerialPort.recv ç”¨ in_waiting ä¼˜å…ˆè¯»å·²åœ¨ç¼“å†²åŒºçš„å­—èŠ‚ï¼Œä¸�å†�æ¯�æ¬¡ç™½ç­‰
    ä¸€ä¸ªè¯»åˆ‡ç‰‡ã€‚
  Â· LocalProtocolBuilder æŒ‰è¡¨åœ°å�€ç¼“å­˜ï¼Œä¸�å†�æ¯�é¡¹é‡�å»ºã€‚
  Â· ä¸»æ—¥å¿—æ¯�è¡ŒåŠ æ¯«ç§’æ—¶é—´æˆ³ï¼ˆæŽ§åˆ¶å�°ä¿�æŒ�åŽŸæ ·ä¸�åŠ ï¼‰ï¼Œä¾¿äºŽä¸Ž raw_frames.txt å¯¹é½�ã€‚

ã€�æ˜“ç”¨ã€‘
  Â· --baud å�‚æ•°åŒ–ï¼ˆé»˜è®¤ 115200ï¼Œä¸ŽåŽŸ SerialPort é»˜è®¤å€¼å�Šæœ¬åœ°é€šä¿¡æŽ¥å�£ä¸€è‡´ï¼‰ï¼›
    buddy.py é‡Œ main() å†™æ­» 9600 è€Œæ³¨é‡Šå†™ç�€ã€Œ115200 8E1ã€�ï¼Œä¸‰å¤„äº’ç›¸çŸ›ç›¾ï¼Œ
    çŽ°ç»Ÿä¸€ä¸º 115200 ä¸”å�¯è¦†ç›–ã€‚è‹¥ä½ çš„çŽ°åœºç¡®å®žæ˜¯ 9600ï¼ŒåŠ  --baud 9600 å�³å�¯ã€‚
  Â· --from/--to ä¸Žç”µè¡¨åœ°å�€åœ¨å�¯åŠ¨æ—¶æ ¡éªŒï¼Œå�‚æ•°é”™ç«‹åˆ»æŠ¥é”™é€€å‡ºï¼Œè€Œä¸�æ˜¯æŠ„åˆ°ä¸€å�Šæ‰�ç‚¸ã€‚
  Â· main() è¿”å›žé€€å‡ºç �ï¼š0 æ­£å¸¸ã€�1 ä¸²å�£æ‰“ä¸�å¼€ã€�2 å�‚æ•°é”™è¯¯ã€‚
é    )ÚannotationsN)Ú	dataclassÚfield)Údatetime)ÚEnum)ÚDictÚListÚOptionalÚProtocolÚSequenceÚSetÚTextIOÚTuple)ÚSerialExceptionTFgš™™™™™©?c                  ó4   — e Zd ZU dZded<   dZded<   d
d„Zd	S )ÚMeterAddressuD   ç”µè¡¨åœ°å�€ï¼ˆDL/T 645 ä½¿ç”¨ 6 å­—èŠ‚ BCD åœ°å�€ï¼Œä½Žä½�åœ¨å‰�ï¼‰ÚstrÚaddrÚ ÚdescriptionÚreturnÚbytesc                ó°   — t          | j        ¦  «        dk    rt          d| j        › �¦  «        ‚t                               | j        ¦  «        d d d…         S )Né   u,   ç”µè¡¨åœ°å�€å¿…é¡»ä¸º 12 ä½� BCD å­—ç¬¦ä¸²: éÿÿÿÿ)Úlenr   Ú
ValueErrorr   Úfromhex©Úselfs    úM/home/divint3/.zeroclaw/agents/snow_bunny/workspace/codex/freeze_reader_v2.pyÚto_byteszMeterAddress.to_bytesì   sM   € ÝˆtŒy‰>Œ>˜RÒÐÝÐWÈDÌIÐWÐWÑXÔXÐXÝ�}Š}˜TœYÑ'Ô'¨¨¨"¨Ô-Ð-ó    N©r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r"   © r#   r!   r   r   æ   sJ   € € € € € € àNÐNØ€I€I�IØ€KÐÐÐÑð.ð .ð .ð .ð .ð .r#   r   c                  óP   — e Zd ZU dZded<   dZded<   dZded<   d	Zd
ed<   dd„ZdS )ÚDataItemu   ä¸€ä¸ª 645 æ•°æ�®é¡¹ï¼ˆDIï¼‰r   Údir#   r   Úvaluer   r   FÚboolÚis_writer   c                ó°   — t          | j        ¦  «        dk    rt          d| j        › �¦  «        ‚t                               | j        ¦  «        d d d…         S )Né   u!   æ•°æ�®æ ‡è¯†å¿…é¡»ä¸º 8 ä½� HEX: r   )r   r-   r   r   r   r   s    r!   Údi_byteszDataItem.di_bytesú   sM   € ÝˆtŒw‰<Œ<˜1ÒÐÝÐJÀÄÐJÐJÑKÔKÐKÝ�}Š}˜TœWÑ%Ô% d d¨ dÔ+Ð+r#   Nr$   )	r%   r&   r'   r(   r)   r.   r   r0   r3   r*   r#   r!   r,   r,   ò   sl   € € € € € € à&Ð&Ø€G€G�GØ€EÐÐÐÑØ€KÐÐÐÑØ€HÐÐÐÑð,ð ,ð ,ð ,ð ,ð ,r#   r,   c                  óf   — e Zd ZU dZded<   ded<   dZded<   edd
„¦   «         Zedd„¦   «         ZdS )ÚSendTaskuP  
    ä¸€æ�¡å¾…å�‘é€�çš„ä»»åŠ¡ = ä¸€ä¸ªç”µè¡¨ + ä¸€ä¸ªã€Œä¸Šxæ¬¡å†»ç»“æ•°æ�®å�—ã€�(DI)ã€‚

    seq = æœ¬åœ°ä»»åŠ¡æµ�æ°´å�·ï¼Œå†™è¿›æœ¬åœ°è§„çº¦å¸§çš„ TaskID å­—æ®µï¼Œæ¨¡å�—**åŽŸæ ·å›žæ˜¾**ã€‚
          â˜… å®ƒä¸Ž item.di é‡Œçš„ã€Œä¸Šxæ¬¡ã€�ç¼–å�·æ²¡æœ‰ä»»ä½•å…³ç³»ï¼Œç»�ä¸�èƒ½å½“èº«ä»½ç”¨ï¼š
            å½’å±žå�ªè®¤ (è¡¨å�·, DI)ã€‚
    r   Úmeterr,   Úitemr   ÚintÚseqr   c                ó˜   — | j         j                             ¦   «         }t          |¦  «        dk    rt	          |dd…         d¦  «        ndS )uB   ã€Œä¸Šxæ¬¡ã€�ç¼–å�· â€”â€” æ�¥è‡ª DI çš„ç¬¬ 4 å­—èŠ‚ï¼ˆ0504FFxxï¼‰r2   é   é   r   )r7   r-   Úupperr   r8   )r    r-   s     r!   Ú	freeze_nozSendTask.freeze_no  sD   € ð ŒYŒ\×ÒÑ!Ô!ˆÝ#& r¡7¤7¨a¢< <�s�2�a˜�c”7˜BÑÔÐ°RÐ7r#   r   c                óx   — d| j         d›d| j        j        › d| j        › d| j        j        › d| j        j        › d�S )Nu
   [æµ�æ°´å�·Ú03du	   ] è¡¨å�·=u    ä»»åŠ¡å�—=ä¸Šõ   æ¬¡ DI=ú (ú))r9   r6   r   r>   r7   r-   r   r   s    r!   ÚlabelzSendTask.label  sq   € ð`˜TœXÐFð `ð `°D´J´Oð `ð `Ø $¤ð`ð `Ø7;´y´|ð`ð `ØGKÄyÔG\ð`ð `ð `ð 	ar#   N©r   r8   ©r   r   )	r%   r&   r'   r(   r)   r9   Úpropertyr>   rD   r*   r#   r!   r5   r5      sˆ   € € € € € € ðð ð ÐÐÑØ€N€N�NØ€C€L€L€L�Làð8ð 8ð 8ñ „Xð8ð
 ðað að añ „Xðað að ar#   r5   c                  ó&   — e Zd ZdZdZdZdZdZdZdS )Ú
TaskStatusu   å�•æ�¡ä»»åŠ¡çš„ç»“å±€ÚOKÚ	ERR_FRAMEÚNO_RESPÚ	BAD_FRAMEÚSKIPPEDN)	r%   r&   r'   r(   rJ   ÚMETER_ERRORÚNO_RESPONSErM   rN   r*   r#   r!   rI   rI     s-   € € € € € ØÐØ€BØ€KØ€KØ€IØ€G€G€Gr#   rI   c                  óx  — e Zd ZU dZded<   ded<   ded<   dZded<   ej        Zd	ed
<   dZ	ded<   dZ
ded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   ed&d!„¦   «         Zed'd"„¦   «         Zed'd#„¦   «         Zed'd$„¦   «         Zed(d%„¦   «         ZdS ))Ú
TaskResultu$  
    å�•æ�¡ä»»åŠ¡çš„å®Œæ•´ç»“æžœã€‚

    v1 åœ¨è¿™é‡ŒæŒ‚äº†ä¸¤ä¸ªæ— ç±»åž‹ dictï¼ˆparsed_local / parsed_645ï¼‰ï¼Œè°ƒç”¨æ–¹è¦�
    r.parsed_645["err_code"] è¿™æ ·å¾€ä¸‹é’»ï¼›v2 ç›´æŽ¥æŒ‚ç±»åž‹åŒ–å¯¹è±¡ï¼Œ
    å†»ç»“æ—¶é—´/æ­£å��å�‘ç”µèƒ½åˆ™å�šæˆ�å±žæ€§ï¼Œé�¿å…�å�Œä¸€ä»½æ•°æ�®å­˜ä¸¤é��ã€‚
    r8   r9   r   Ú
meter_addrr-   r   Údi_namerI   Ústatusr#   r   ÚrequestÚresponser   ÚretriesNúOptional[int]Úerr_codeÚerr_textÚnoter.   Ú	inner_645zOptional['LocalFrame']Úlocal_framezOptional['DLT645Frame']Údlt645_frameúOptional['FreezeBlock']ÚfreezeÚpayload_rawr   r/   c                ó(   — | j         t          j        u S ©N©rU   rI   rJ   r   s    r!   ÚsuccesszTaskResult.success=  s   € àŒ{�jœmÐ+Ð+r#   c                ó,   — | j         �| j         j        ndS ©Nr   )ra   Úfreeze_timer   s    r!   ri   zTaskResult.freeze_timeA  s   € à*.¬+Ð*AˆtŒ{Ô&Ð&ÀrÐIr#   c                ó,   — | j         �| j         j        ndS rh   )ra   Úpositiver   s    r!   rk   zTaskResult.positiveE  s   € à'+¤{Ð'>ˆtŒ{Ô#Ð#ÀBÐFr#   c                ó,   — | j         �| j         j        ndS rh   )ra   Úreverser   s    r!   rm   zTaskResult.reverseI  s   € à&*¤kÐ&=ˆtŒ{Ô"Ð"À2ÐEr#   c                ó6   — | j         �| j         j        n| j        S )ud   å†»ç»“å�— 16B åŽŸå§‹å­—èŠ‚ï¼›é�žå†»ç»“é¡¹/çŸ­å�—æ—¶é€€åŒ–ä¸ºæ•°æ�®åŸŸåŽŸå§‹å­—èŠ‚ï¼ˆä¸Ž v1 ä¸€è‡´ï¼‰)ra   Úrawrb   r   s    r!   Úfreeze_blockzTaskResult.freeze_blockM  s   € ð #'¤+Ð"9ˆtŒ{Œˆ¸tÔ?OÐOr#   ©r   r/   rF   r$   )r%   r&   r'   r(   r)   rT   rI   rJ   rU   rV   rW   rX   rZ   r[   r\   r.   r]   r^   r_   ra   rb   rG   rf   ri   rk   rm   rp   r*   r#   r!   rR   rR   "  sÕ  € € € € € € ðð ð €H€H�HØ€O€O�OØ€G€G�GØ€GÐÐÐÑØ#œ€FÐ&Ð&Ð&Ñ&Ø€GÐÐÐÑØ€HÐÐÐÑØ€GÐÐÐÑØ"€HÐ"Ð"Ð"Ñ"Ø€HÐÐÐÑØ€D€N€N€N�NØ€E€O€O€O�OØ€IÐÐÐÑØ*.€KÐ.Ð.Ð.Ñ.Ø,0€LÐ0Ð0Ð0Ñ0Ø&*€FÐ*Ð*Ð*Ñ*Ø€KÐÐÐÑàð,ð ,ð ,ñ „Xð,ð ðJð Jð Jñ „XðJð ðGð Gð Gñ „XðGð ðFð Fð Fñ „XðFð ðPð Pð Pñ „XðPð Pð Pr#   rR   c                  óŒ   — e Zd ZU dZded<    ee¬¦  «        Zded<   dZded	<   d
Z	ded<   e
dd„¦   «         Ze
dd„¦   «         ZdS )ÚMeterReportu   å�•å�ªè¡¨çš„æŠ„è¯»æŠ¥å‘Šr   r6   ©Údefault_factoryzList[TaskResult]ÚresultsFr/   Úabortedr   r   Úabort_reasonr   r8   c                ó>   — t          d„ | j        D ¦   «         ¦  «        S )Nc              3  ó@   K  — | ]}|j         t          j        u ¯d V — ŒdS ©é   Nre   ©Ú.0Úrs     r!   ú	<genexpr>z'MeterReport.ok_count.<locals>.<genexpr>]  s0   è è € ÐHÐH˜¨a¬h½*¼-Ð.GÐ.G�1Ð.GÐ.GÐ.GÐ.GÐHÐHr#   ©Úsumrv   r   s    r!   Úok_countzMeterReport.ok_count[  s!   € åÐHÐH˜dœlÐHÑHÔHÑHÔHÐHr#   c                ó>   — t          d„ | j        D ¦   «         ¦  «        S )Nc              3  ó@   K  — | ]}|j         t          j        u ¯d V — ŒdS r{   )rU   rI   rN   r}   s     r!   r€   z,MeterReport.skipped_count.<locals>.<genexpr>a  s1   è è € ÐMÐM˜¨a¬h½*Ô:LÐ.LÐ.L�1Ð.LÐ.LÐ.LÐ.LÐMÐMr#   r�   r   s    r!   Úskipped_countzMeterReport.skipped_count_  s!   € åÐMÐM˜dœlÐMÑMÔMÑMÔMÐMr#   NrE   )r%   r&   r'   r(   r)   r   Úlistrv   rw   rx   rG   rƒ   r†   r*   r#   r!   rs   rs   S  s°   € € € € € € à"Ð"ØÐÐÑØ % °dÐ ;Ñ ;Ô ;€GÐ;Ð;Ð;Ñ;Ø€GÐÐÐÑØ€LÐÐÐÑàðIð Ið Iñ „XðIð ðNð Nð Nñ „XðNð Nð Nr#   rs   c                  ó`   — e Zd ZU dZdZded<   dZded<   dZded<   dZded	<   ddd„Z	ddd„Z
dS )ÚAbortPolicyu4  
    æ”¾å¼ƒç­–ç•¥ã€‚

    è¯­ä¹‰ï¼šA è¡¨åœ¨è¯»ã€Œä¸Šxæ¬¡å†»ç»“æ•°æ�®ã€�è¿‡ç¨‹ä¸­å‘½ä¸­ä¸‹é�¢ä»»ä¸€æƒ…å†µï¼Œ
          åˆ™ä¸�å†�æŠ„è¯»è¯¥è¡¨å‰©ä½™çš„æ‰€æœ‰å†»ç»“é¡¹ï¼Œç›´æŽ¥åˆ‡åˆ°ä¸‹ä¸€å�ªè¡¨ã€‚

    â˜… ä¿®å¤�è¦�ç‚¹ï¼ˆå®žæµ‹æ•°æ�®æ”¯æ’‘ï¼‰ï¼š
      Â· METER_ERRORï¼ˆç”µè¡¨å›ž ERR=1 é”™è¯¯å¸§ï¼‰æ˜¯**ç”µè¡¨æ˜Žç¡®åº”ç­”**ã€Œæ²¡æœ‰è¿™ä¸ªæ•°æ�®ã€�ï¼Œ
        æ˜¯å�¯é� ä¿¡å�· â†’ ç«‹å�³æ”¾å¼ƒæœ¬è¡¨å‰©ä½™é¡¹ã€‚
      Â· NO_RESPONSE / BAD_FRAME å¾€å¾€æ˜¯é“¾è·¯æ‹¥å¡žã€�æ¨¡å�—å›žæ”¾ç§¯åŽ‹é€ æˆ�çš„**å�¶å�‘**çŽ°è±¡ã€‚
        å®žæµ‹ï¼šç¬¬ 14 é¡¹ç¬¬ä¸€æ¬¡ä¸‹å�‘è¢«å›žæ”¾å¸§æŒ¤å� è€Œè¶…æ—¶ï¼Œä½†ç¬¬ 15~255 é¡¹å…¨éƒ¨èƒ½æ­£å¸¸æŠ„å›žï¼›
        è‹¥æŒ‰"å�•æ¬¡è¶…æ—¶å°±æ”¾å¼ƒæ•´è¡¨"ï¼Œè¿™ä¸€å�ªè¡¨ 240 å¤šé¡¹å°±è¢«è¯¯æ�€äº†ã€‚
        å› æ­¤è¿™ä¸¤ç±»æ”¹ä¸ºã€Œè¿žç»­ streak_limit æ¬¡ã€�æ‰�æ”¾å¼ƒï¼ˆä»»ä½•ä¸€æ¬¡æˆ�åŠŸå�³æ¸…é›¶ï¼‰ã€‚
    Tr/   Úon_error_frameÚon_no_responseÚon_bad_frameé   r8   Ústreak_limitr|   rU   rI   Ústreakr   c                óØ   — |t           j        u r| j        S |t           j        u r| j        od| j        cxk     o|k    nc S |t           j        u r| j        od| j        cxk     o|k    nc S dS )Nr   F)rI   rO   rŠ   rP   r‹   rŽ   rM   rŒ   ©r    rU   r�   s      r!   Úshould_abortzAbortPolicy.should_abort}  s”   € Ø•ZÔ+Ð+Ð+ØÔ&Ð&Ø•ZÔ+Ð+Ð+ØÔ&ÐJ¨1¨tÔ/@Ð+JÐ+JÒ+JÐ+JÀFÒ+JÐ+JÐ+JÐ+JÐJØ•ZÔ)Ð)Ð)ØÔ$ÐH¨¨TÔ->Ð)HÐ)HÒ)HÐ)HÀ&Ò)HÐ)HÐ)HÐ)HÐHØˆur#   r   c                ó    — t           j        dt           j        d|› d�t           j        d|› d�i                     |t          |¦  «        ¦  «        S )Nu   ç”µè¡¨å›žå¤�é”™è¯¯å¸§u   è¿žç»­ u    æ¬¡æ— åº”ç­”ï¼ˆé‡�è¯•è€—å°½ï¼‰u%    æ¬¡åº”ç­”å¸§æ— æ•ˆï¼ˆé‡�è¯•è€—å°½ï¼‰)rI   rO   rP   rM   Úgetr   r‘   s      r!   ÚreasonzAbortPolicy.reason†  sT   € åÔ"Ð$;ÝÔ"Ð$U¨fÐ$UÐ$UÐ$UÝÔ Ð$[¨fÐ$[Ð$[Ð$[ð
÷ Š#ˆf•c˜&‘k”kÑ
"Ô
"ð		#r#   N)r|   )rU   rI   r�   r8   r   r/   )rU   rI   r�   r8   r   r   )r%   r&   r'   r(   rŠ   r)   r‹   rŒ   rŽ   r’   r•   r*   r#   r!   r‰   r‰   h  s˜   € € € € € € ðð ð  €NÐÐÐÑØ€NÐÐÐÑØ€LÐÐÐÑØ€LÐÐÐÑðð ð ð ð ð#ð #ð #ð #ð #ð #ð #r#   r‰   c                  ól   — e Zd ZdZdZdZdZdZddd	„Ze	dd„¦   «         Z
dd„Zdd„Zdd„Zdd„Zdd„ZdS ) ÚDLT645FrameBuilderum   
    DL/T 645-2007 å��è®®ç»„åŒ…ç±»
    å¸§æ ¼å¼�ï¼š
        68H | A0..A5 | 68H | C | L | DATA | CS | 16H
    éh   é   é   é   TÚplus33r/   c                ó   — || _         d S rd   ©rœ   ©r    rœ   s     r!   Ú__init__zDLT645FrameBuilder.__init__ž  ó   € ØˆŒˆˆr#   Údatar   r   r8   c                ó&   — t          | ¦  «        dz  S )Néÿ   )r‚   )r¢   s    r!   Ú	_checksumzDLT645FrameBuilder._checksum¡  s   € å�4‰yŒy˜4ÑÐr#   c                óF   — | j         s|S t          d„ |D ¦   «         ¦  «        S )Nc              3  ó&   K  — | ]}|d z   dz  V — ŒdS ©é3   r¤   Nr*   ©r~   Úbs     r!   r€   z8DLT645FrameBuilder._encode_data_field.<locals>.<genexpr>¨  s+   è è € Ð5Ð5¨1�a˜$‘h $Ñ&Ð5Ð5Ð5Ð5Ð5Ð5r#   )rœ   r   ©r    r¢   s     r!   Ú_encode_data_fieldz%DLT645FrameBuilder._encode_data_field¥  s.   € ØŒ{ð 	ØˆKÝÐ5Ð5°Ð5Ñ5Ô5Ñ5Ô5Ð5r#   r6   r   r7   r,   c                ó:   — |                       ||| j        ¦  «        S rd   )Ú_buildÚ	CTRL_READ©r    r6   r7   s      r!   Ú
build_readzDLT645FrameBuilder.build_readª  s   € Ø�{Š{˜5 $¨¬Ñ7Ô7Ð7r#   c                óf   — |j         st          d¦  «        ‚|                      ||| j        ¦  «        S )Nu   å†™æ“�ä½œå¿…é¡»æ��ä¾› value)r.   r   r¯   Ú
CTRL_WRITEr±   s      r!   Úbuild_writezDLT645FrameBuilder.build_write­  s3   € ØŒzð 	<ÝÐ:Ñ;Ô;Ð;Ø�{Š{˜5 $¨¬Ñ8Ô8Ð8r#   c                óh   — |j         r|                      ||¦  «        n|                      ||¦  «        S rd   )r0   rµ   r²   r±   s      r!   ÚbuildzDLT645FrameBuilder.build²  s4   € Ø04´Ð_ˆt×Ò  tÑ,Ô,Ð,À4Ç?Â?ÐSXÐZ^ÑC_ÔC_Ð_r#   Úctrlc                ó´  — |                      ¦   «         }|                     ¦   «         }||| j        k    r|j        ndz   }|                      |¦  «        }t          |¦  «        }t          | j        g¦  «        |z   t          | j        g¦  «        z   }	t          ||g¦  «        |z   }
|                      |	|
z   ¦  «        }|	|
z   t          || j	        g¦  «        z   S )Nr#   )
r"   r3   r´   r.   r­   r   r   ÚSTARTr¥   ÚEND)r    r6   r7   r¸   Ú
addr_bytesr3   Ú
data_fieldÚdata_encodedÚlengthÚheadÚmidÚcss               r!   r¯   zDLT645FrameBuilder._buildµ  sÉ   € Ø—^’^Ñ%Ô%ˆ
Ø—=’=‘?”?ˆØ¨t°t´Ò/FÐ/F ¤ ÈCÑPˆ
Ø×.Ò.¨zÑ:Ô:ˆÝ�\Ñ"Ô"ˆå�d”j�\Ñ"Ô" ZÑ/µ%¸¼¸Ñ2EÔ2EÑEˆÝ�T˜6�NÑ#Ô# lÑ2ˆØ�^Š^˜D 3™JÑ'Ô'ˆØ�c‰z�E 2 t¤x .Ñ1Ô1Ñ1Ð1r#   N©T©rœ   r/   ©r¢   r   r   r8   )r¢   r   r   r   )r6   r   r7   r,   r   r   )r6   r   r7   r,   r¸   r8   r   r   )r%   r&   r'   r(   rº   r»   r°   r´   r    Ústaticmethodr¥   r­   r²   rµ   r·   r¯   r*   r#   r!   r—   r—   ’  sÕ   € € € € € ðð ð €EØ
€CØ€IØ€Jðð ð ð ð ð ð ð  ð  ñ „\ð ð6ð 6ð 6ð 6ð
8ð 8ð 8ð 8ð9ð 9ð 9ð 9ð
`ð `ð `ð `ð
2ð 
2ð 
2ð 
2ð 
2ð 
2r#   r—   c                  ó   — e Zd ZdZdS )Ú
FrameErrorua   å¸§ç»“æž„é”™è¯¯ï¼ˆèµ·æ­¢ç¬¦/é•¿åº¦/å­—æ®µè¶Šç•Œï¼‰ã€‚ä¸Ž v1 çš„ ValueError å�Œæ—�ï¼Œä¾¿äºŽ exceptN©r%   r&   r'   r(   r*   r#   r!   rÈ   rÈ   Ë  s   € € € € € ØkÐkÐkÐkr#   rÈ   c                  ó&   — e Zd ZdZdZdZdZdZdZdS )Ú	FrameKindud   ä¸€å¸§ 645 åº”ç­”çš„è§£æž�ç»“è®ºï¼ˆv1 ç”¨ kind + abnormal ä¸¤ä¸ªæ�¾æ•£æ ‡è®°è¡¨ç¤ºï¼Œå®¹æ˜“æ¼�åˆ¤ï¼‰Úenergyra   ro   Úerror_responseÚ	malformedN)	r%   r&   r'   r(   ÚENERGYÚFREEZEÚRAWÚERROR_RESPONSEÚ	MALFORMEDr*   r#   r!   rË   rË   Ï  s-   € € € € € ØnÐnØ€FØ€FØ
€CØ%€NØ€I€I€Ir#   rË   r¢   r   r   r   c                ó¨   — d}| D ]L}|dz	  dz  }|dz  }|dk    s|dk    r(|                       ¦   «                              ¦   «         c S ||› |› �z  }ŒM|S )uf   BCD å­—èŠ‚ â†’ å��è¿›åˆ¶å­—ç¬¦ä¸²ï¼›ä»»ä¸€å�Šå­—èŠ‚ >9 åˆ™æ•´ä½“é€€åŒ–ä¸º HEXï¼ˆä¸Ž v1 è¡Œä¸ºä¸€è‡´ï¼‰r   é   é   é	   )Úhexr=   )r¢   Úsr«   ÚhiÚlos        r!   Ú
bcd_to_strrÜ   Ù  sv   € à
€AØð ð ˆØ�1‰f˜‰_ˆØ�‰XˆØ�Š6ˆ6�R˜!’V�VØ—8’8‘:”:×#Ò#Ñ%Ô%Ð%Ð%Ð%Ø	�ˆ[�Bˆ[ˆ[ÑˆˆØ€Hr#   r«   r8   c                óH   — | dz	  dz  }| dz  }|dk    s|dk    rdS |dz  |z   S )u/   å�•å­—èŠ‚ BCD â†’ æ•´æ•°ï¼›é�žæ³• BCD è¿”å›ž -1rÕ   rÖ   r×   r   é
   r*   )r«   rÚ   rÛ   s      r!   Ú
bcd_to_intrß   å  s<   € à
ˆq‰&�D‰€BØ	
ˆT‰€BØ	ˆA‚v€v��a’�ØˆrØ�‰7�R‰<Ðr#   Úval_strÚdecimalsc                ó¢   — |                       ¦   «         s| S |dk    r| S |                      |dz   ¦  «        } | d| …         dz   | | d…         z   S )u9   æ•°å­—ä¸²æŒ‰å°�æ•°ä½�æ�’å°�æ•°ç‚¹ï¼›é�žæ•°å­—åŽŸæ ·è¿”å›žr   r|   Nú.)ÚisdigitÚzfill)rà   rá   s     r!   Úformat_energyræ   î  sb   € à�?Š?ÑÔð ØˆØ�1‚}€}ØˆØ�mŠm˜H q™LÑ)Ô)€GØ�:�X�I�:Ô Ñ$ w°¨y¨z¨zÔ':Ñ:Ð:r#   Úencodedrœ   r/   c                ó<   — |s| S t          d„ | D ¦   «         ¦  «        S )u   æ•°æ�®åŸŸ +33H è§£ç �c              3  ó&   K  — | ]}|d z
  dz  V — ŒdS r¨   r*   rª   s     r!   r€   z"decode_645_data.<locals>.<genexpr>ü  s+   è è € Ð4Ð4 q�!�d‘(˜dÑ"Ð4Ð4Ð4Ð4Ð4Ð4r#   )r   )rç   rœ   s     r!   Údecode_645_datarê   ø  s,   € àð ØˆÝÐ4Ð4¨GÐ4Ñ4Ô4Ñ4Ô4Ð4r#   )Úfrozenc                  óš   — e Zd ZU dZded<   ded<   ded<   ded<   dZded	<   dZded
<   dZded<   dZe	dd„¦   «         Z
edd„¦   «         ZdS )ÚFreezeBlockuî   
    ä¸€æ¬¡æ•´ç‚¹å†»ç»“æ•°æ�®å�—ï¼ˆ16 å­—èŠ‚ï¼Œä½Žå­—èŠ‚åœ¨å‰�å­˜ï¼‰ï¼š
        [0:6]   å†»ç»“æ—¶é—´ï¼Œæœ«å°¾ AA åˆ†éš”
        [6:11]  æ­£å�‘æœ‰åŠŸæ€»ç”µèƒ½ï¼Œæœ«å°¾ AA åˆ†éš”
        [11:16] å��å�‘æœ‰åŠŸæ€»ç”µèƒ½ï¼Œæœ«å°¾ AA åˆ†éš”
    r   ro   Ú
time_bytesÚpositive_bytesÚreverse_bytesr   r   ri   rk   rm   r<   Úpayloadr   r`   c           
     óz  — t          |¦  «        | j        k     rdS |dd…         }|dd…         }|dd…         }|ddd…         }t          |d         ¦  «        t          |d         ¦  «        t          |d	         ¦  «        }}}t          |d
         ¦  «        t          |d         ¦  «        }
}	|› d|d›d|d›d|	d›d|
d›d�
}t          t	          |ddd…         dd…         ¦  «        d¦  «        }t          t	          |ddd…         dd…         ¦  «        d¦  «        } | |d| j        …         ||||||¬¦  «        S )uE   é•¿åº¦ä¸�è¶³ï¼ˆ<16Bï¼‰è¿”å›ž None â€”â€” è°ƒç”¨æ–¹æ�®æ­¤åˆ¤ MALFORMEDNr   r;   é   r<   r   r|   é   é   rÕ   r�   u   å¹´z0>2u   æœˆu   æ—¥u   æ—¶u   åˆ†)ro   rî   rï   rð   ri   rk   rm   )r   ÚMIN_LENrß   ræ   rÜ   )Úclsrñ   rî   rï   rð   ÚtÚyearÚmonthÚdayÚhourÚminuteri   rk   rm   s                 r!   ÚparsezFreezeBlock.parse  so  € õ ˆw‰<Œ<˜#œ+Ò%Ð%Ø�4Ø˜Q˜q˜S”\ˆ
Ø   2 œˆØ  2 œˆà�t�t˜�tÔˆÝ% a¨¤dÑ+Ô+­Z¸¸!¼Ñ-=Ô-=½zÈ!ÈAÌ$Ñ?OÔ?O�SˆeˆÝ! ! A¤$Ñ'Ô'­°A°a´DÑ)9Ô)9ˆfˆØÐXÐX %ÐXÐXÐX°ÐXÐXÐX¸DÐXÐXÐXÈÐXÐXÐXÐXˆõ !¥¨N¸4¸4¸R¸4Ô,@ÀÀÀÔ,DÑ!EÔ!EÀqÑIÔIˆÝ¥
¨=¸¸¸2¸Ô+>¸q¸r¸rÔ+BÑ CÔ CÀQÑGÔGˆØˆs�w˜| ¤˜|Ô,¸Ø"0ÀØ*°XÀwðPñ Pô Pð 	Pr#   c                ó&   — d| j         › d| j        › �S )Nu   æ­£:u    å��:)rk   rm   r   s    r!   ÚdisplayzFreezeBlock.display&  s   € à8�d”mÐ8Ð8¨$¬,Ð8Ð8Ð8r#   N)rñ   r   r   r`   rF   )r%   r&   r'   r(   r)   ri   rk   rm   rö   Úclassmethodrþ   rG   r   r*   r#   r!   rí   rí   ÿ  sÉ   € € € € € € ðð ð €J€J�JØÐÐÑØÐÐÑØÐÐÑØ€KÐÐÐÑØ€HÐÐÐÑØ€GÐÐÐÑà€GàðPð Pð Pñ „[ðPð( ð9ð 9ð 9ñ „Xð9ð 9ð 9r#   rí   c                  ó�  — e Zd ZU dZded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   ded<   dZded<   dZded<   dZded<   dZded<   dZ	ded<   dZ
ded<   dZded<   dZded<   ed&d„¦   «         Zed'd „¦   «         Zed&d!„¦   «         Zed&d"„¦   «         Zed'd#„¦   «         Zed'd$„¦   «         Zed'd%„¦   «         ZdS )(ÚDLT645FrameuN   ä¸€å¸§ DL/T 645-2007 åº”ç­”ï¼ˆå­—æ®µå…¨éƒ¨æœ‰å��å­—ï¼Œä¸�å†�æ˜¯å­—ç¬¦ä¸²é”®ï¼‰r   ro   r¼   r   r   r8   Úcontrolr¿   r¢   ÚchecksumÚchecksum_calcÚendrË   Úkindr   r-   rT   r#   rñ   r.   Ú	value_bcdNzOptional[FreezeBlock]ra   rY   Ú
error_codeÚ
error_textr   c                ó   — | j         dz	  dz  S ©Né   r|   ©r  r   s    r!   Ú	directionzDLT645Frame.directionA  ó   € à” Ñ! QÑ&Ð&r#   r/   c                ó$   — | j         dz	  dz  dk    S )u?   ERR ä½�=1ï¼šç”µè¡¨æ˜Žç¡®å›žå¤�ã€Œæˆ‘è¿™è¾¹æ²¡æœ‰è¿™ä¸ªæ•°æ�®ã€�r;   r|   r  r   s    r!   Úis_error_responsezDLT645Frame.is_error_responseE  s   € ð ” Ñ" aÑ'¨AÒ-Ð-r#   c                ó   — | j         dz	  dz  S ©Nr�   r|   r  r   s    r!   ÚfollowzDLT645Frame.followJ  r  r#   c                ó   — | j         dz  S )Né   r  r   s    r!   ÚfunczDLT645Frame.funcN  ó   € àŒ|˜dÑ"Ð"r#   c                ó"   — | j         | j        k    S rd   ©r  r  r   s    r!   Úchecksum_okzDLT645Frame.checksum_okR  ó   € àŒ} Ô 2Ò2Ð2r#   c                ó*   — t          | j        ¦  «        S rd   )r/   r-   r   s    r!   Úhas_dizDLT645Frame.has_diV  s   € å�D”G‰}Œ}Ðr#   c                ó@   — | j         t          j        t          j        fv S )u´   
        ã€Œè¿™æ�¡åº”ç­”çš„ç»“è®ºæ˜¯å��çš„ã€�â€”â€” ç­‰ä»·äºŽ v1 çš„ abnormal æ ‡è®°ï¼š
        ERR=1 å¼‚å¸¸åº”ç­”ï¼Œæˆ–ï¼ˆæ­£å¸¸åº”ç­”ä½†ç»“æž„å��æŽ‰ã€�å�–ä¸�å‡º DIï¼‰ã€‚
        )r  rË   rÒ   rÓ   r   s    r!   Úis_conclusive_errorzDLT645Frame.is_conclusive_errorZ  s   € ð Œy�YÔ5µyÔ7JÐKÐKÐKr#   rE   rq   )r%   r&   r'   r(   r)   r-   rT   rñ   r.   r	  ra   r
  r  rG   r  r  r  r  r  r   r"  r*   r#   r!   r  r  +  sà  € € € € € € àXÐXØ€J€J�JØÐÐÑØ€I€I�IØ€L€L�LØ€K€K�KØ€K€K�KØ€M€M�MØÐÐÑØ€H€H�HØ€O€O�OØ€B€L€L€L�LØ€GÐÐÐÑØ€GÐÐÐÑØ€E€O€O€O�OØ€IÐÐÐÑØ$(€FÐ(Ð(Ð(Ñ(Ø $€JÐ$Ð$Ð$Ñ$Ø€JÐÐÐÑàð'ð 'ð 'ñ „Xð'ð ð.ð .ð .ñ „Xð.ð ð'ð 'ð 'ñ „Xð'ð ð#ð #ð #ñ „Xð#ð ð3ð 3ð 3ñ „Xð3ð ðð ð ñ „Xðð ðLð Lð Lñ „XðLð Lð Lr#   r  c                  ób   — e Zd ZdZdZdZdddddd	d
œZddddddddœZd#d$d„Zd%d„Z	d&d„Z
d'd!„Zd"S )(ÚDLT645Codecuæ  
    DL/T 645-2007 è§£æž�å™¨ï¼šbytes â†’ DLT645Frameï¼›ç»“æž„é—®é¢˜æŠ› FrameErrorã€‚

    â˜… å¼‚å¸¸åº”ç­”ä¹Ÿè§£æž� DIï¼šæ­£å¸¸åº”ç­”ä¸Žå¼‚å¸¸åº”ç­”çš„æ•°æ�®åŸŸç»“æž„ä¸€æ ·ï¼Œéƒ½æ˜¯ã€ŒDI(4B) + æ•°æ�®ã€�ã€‚
      å�ªè¦�é•¿åº¦å¤Ÿå°±æŠŠ DI å�–å‡ºæ�¥ï¼ˆkind=ERROR_RESPONSE ä¸” di é�žç©ºï¼‰ï¼Œä¾›ä¸Šå±‚æŒ‰
      ã€Œè¡¨å�· + DIã€�å½’å±žï¼›å�ªæœ‰æ•°æ�®åŸŸçŸ­äºŽ 4 å­—èŠ‚æ—¶æ‰�æ²¡æœ‰ DIã€‚æ—©æœŸç‰ˆæœ¬ç›´æŽ¥æŠŠ DI ä¸¢æŽ‰ï¼Œ
      é‚£æ­£æ˜¯ã€Œå¼‚å¸¸å¸§å�ªèƒ½é�  TaskID å½’å±žã€�çš„æ ¹æº�ã€‚
    r˜   r™   u   ç»„å�ˆæœ‰åŠŸæ€»ç”µèƒ½u   å½“å‰�æ­£å�‘æœ‰åŠŸæ€»ç”µèƒ½u   å½“å‰�å��å�‘æœ‰åŠŸæ€»ç”µèƒ½u   å½“å‰�æ­£å�‘æ— åŠŸæ€»ç”µèƒ½u   å½“å‰�å��å�‘æ— åŠŸæ€»ç”µèƒ½u   ä¸Šä¸€æ¬¡æ•´ç‚¹å†»ç»“)Ú00000000Ú00010000Ú00020000Ú00030000Ú00040000Ú0504FF01u   å…¶ä»–é”™è¯¯u   æ— è¯·æ±‚æ•°æ�®u   å¯†ç �é”™/æœªæŽˆæ�ƒu   é€šä¿¡é€ŸçŽ‡ä¸�èƒ½æ›´æ”¹u   å¹´æ—¶åŒºæ•°è¶…u   æ—¥æ—¶æ®µæ•°è¶…u   è´¹çŽ‡æ•°è¶…)r|   rô   rõ   rÕ   r�   r;   r  Trœ   r/   c                ó   — || _         d S rd   rž   rŸ   s     r!   r    zDLT645Codec.__init__„  r¡   r#   Úframer   r   r  c                ó	  — t          |¦  «        dk     rt          d¦  «        ‚|d         | j        k    s|d         | j        k    rt          d¦  «        ‚|d         | j        k    rt          d¦  «        ‚|dd…         }|d	         }|d
         }t	          |dd|z   …         | j        ¦  «        }|d|z            }|d|z            }t          |||d d d…                              ¦   «                              ¦   «         ||||t          |dd|z   …         ¦  «        dz  |¬¦	  «	        }|dz	  dz  dk    ræt          |¦  «        dk    r˜|dd…         d d d…                              ¦   «                              ¦   «         }	t          |¦  «        dk    r|d         nd }
t          d i |¤t          j        |	|                      |	¦  «        |
|                      |
¦  «        dœ¤ŽS |r|d         nd }
t          d i |¤t          j        |
|                      |
¦  «        dœ¤ŽS t          |¦  «        dk     r,t          d i |¤t          j        dt          |¦  «        › d�dœ¤ŽS |dd…         d d d…                              ¦   «                              ¦   «         }	|dd …         }|s/t          d i |¤t          j        |	|                      |	¦  «        dœ¤ŽS |	                     d¦  «        r•t$                               |¦  «        }|€Bt          d i |¤t          j        |	|                      |	¦  «        |dt          |¦  «        › d�dœ¤ŽS t          d i |¤t          j        |	|                      |	¦  «        |||j        dœ¤ŽS |	                     d¦  «        rzt          d i |¤t          j        |	|                      |	¦  «        ||d d d…                              ¦   «                              ¦   «         t1          t3          |¦  «        d¦  «        dœ¤ŽS t          d i |¤t          j        |	|                      |	¦  «        ||d d d…                              ¦   «                              ¦   «         |                     ¦   «                              ¦   «         dœ¤ŽS )!Nr   u   645 å¸§è¿‡çŸ­r   r  u   645 èµ·å§‹å­—èŠ‚é”™è¯¯r   u   645 ç»“æ�Ÿå­—èŠ‚é”™è¯¯r|   r2   r×   rÞ   ró   r¤   )	ro   r¼   r   r  r¿   r¢   r  r  r  r;   rÕ   r�   )r  r-   rT   r
  r  )r  r
  r  u   æ•°æ�®åŸŸè¿‡çŸ­ï¼ˆu    å­—èŠ‚ï¼‰ï¼Œæ— æ³•å�– DI)r  r  )r  r-   rT   Ú0504FFu   å†»ç»“å�—é•¿åº¦ä¸�è¶³ï¼ˆu
    å­—èŠ‚ï¼‰)r  r-   rT   rñ   r  )r  r-   rT   rñ   ra   r.   Ú0000rô   )r  r-   rT   rñ   r	  r.   r*   )r   rÈ   rº   r»   rê   rœ   ÚdictrØ   r=   r‚   r  rË   rÒ   Údescribe_dir  rÓ   rÑ   Ú
startswithrí   rþ   rÐ   r   ÚendswithrÏ   ræ   rÜ   )r    r,  r   r¸   r¿   r¢   r  r  Úbaser-   Úcoderñ   Úblocks                r!   rþ   zDLT645Codec.parseˆ  sO  € Ýˆu‰:Œ:˜Š?ˆ?Ý˜_Ñ-Ô-Ð-Ø�Œ8�t”zÒ!Ð! U¨1¤X°´Ò%;Ð%;ÝÐ5Ñ6Ô6Ð6Ø�Œ9˜œÒ Ð ÝÐ5Ñ6Ô6Ð6à�Q�q�SŒzˆØ�QŒxˆØ�q”ˆÝ˜u R¨¨V© ^Ô4°d´kÑBÔBˆØ˜˜f™Ô%ˆØ�B˜‘KÔ ˆå˜¨$°T¸$¸$¸B¸$´Z·^²^Ñ5EÔ5E×5KÒ5KÑ5MÔ5MØ ¨°dÀXÝ"% e¨A¨b°6©k¨MÔ&:Ñ";Ô";¸dÑ"BÈðMñ Mô Mˆð
 �Q‰Y˜!‰O Ò!Ð!Ý�4‰yŒy˜AŠ~ˆ~Ø˜!˜A˜#”Y˜t˜t ˜t”_×(Ò(Ñ*Ô*×0Ò0Ñ2Ô2�Ý"% d¡)¤)¨q¢. .�t˜A”w�w°d�Ý"ð Vð V Tð Vµ	Ô0HÈRØ+/×+;Ò+;¸BÑ+?Ô+?Ø.2¸t¿ºÈtÑ?TÔ?TðVð Vð Vð Vð Vð #Ð,�4˜”7�7¨ˆDÝð Rð R ð R­IÔ,DØ*.¸4¿?º?È4Ñ;PÔ;PðRð Rð Rð Rð Rõ ˆt‰9Œ9�qŠ=ˆ=Ýð eð e ð e­IÔ,?Ø*c½sÀ4¹y¼yÐ*cÐ*cÐ*cðeð eð eð eð eð �!�A�#ŒY�t�t˜�tŒ_× Ò Ñ"Ô"×(Ò(Ñ*Ô*ˆØ�q�r�r”(ˆØð 	=Ýð =ð = ð =­I¬M¸bØ'+×'7Ò'7¸Ñ';Ô';ð=ð =ð =ð =ð =ð �=Š=˜Ñ"Ô"ð 	BÝ×%Ò% gÑ.Ô.ˆEØˆ}Ý"ð cð c Tð cµ	Ô0CÈØ+/×+;Ò+;¸BÑ+?Ô+?ÈØ.aÍÈWÉÌÐ.aÐ.aÐ.aðcð cð cð cð cõ ð Bð B ð B­IÔ,<ÀØ'+×'7Ò'7¸Ñ';Ô';ÀWØ&+°5´=ðBð Bð Bð Bð Bð �;Š;�vÑÔð 	LÝð Lð L ð L­IÔ,<ÀØ'+×'7Ò'7¸Ñ';Ô';ÀWØ)0°°°2°¬×):Ò):Ñ)<Ô)<×)BÒ)BÑ)DÔ)DÝ%2µ:¸gÑ3FÔ3FÈÑ%JÔ%JðLð Lð Lð Lð Lõ
 ð 8ð 8˜Tð 8­	¬¸"Ø#'×#3Ò#3°BÑ#7Ô#7ÀØ%,¨T¨T¨r¨T¤]×%6Ò%6Ñ%8Ô%8×%>Ò%>Ñ%@Ô%@Ø!(§¢¡¤×!4Ò!4Ñ!6Ô!6ð8ð 8ð 8ð 8ð 	8r#   r-   r   c                óî   — | j                              |¦  «        }|r|S t          |¦  «        dk    rC|                     d¦  «        r.	 dt	          |dd…         d¦  «        › d�S # t
          $ r Y dS w xY wdS )uN   DI â†’ ä¸­æ–‡å��ï¼›å†»ç»“ç±» DI è‡ªåŠ¨ç”Ÿæˆ�ã€Œä¸Šnæ¬¡æ•´ç‚¹å†»ç»“æ•°æ�®å�—ã€�r2   r.  õ   ä¸Šr;   r<   õ   æ¬¡æ•´ç‚¹å†»ç»“æ•°æ�®å�—r   )ÚDI_NAMESr”   r   r2  r8   r   )r    r-   Únames      r!   r1  zDLT645Codec.describe_diÈ  s’   € àŒ}× Ò  Ñ$Ô$ˆØð 	ØˆKÝˆr‰7Œ7�aŠ<ˆ<˜BŸMšM¨(Ñ3Ô3ˆ<ðØG�S  A a C¤¨"Ñ-Ô-ÐGÐGÐGÐGøÝð ð ð Ø�r�rðøøøàˆrs   ÁA$ Á$
A2Á1A2r5  rY   c                óH   — |€dS | j                              |d|d›�¦  «        S )Nr   u   æœªçŸ¥é”™è¯¯ç � 0xÚ02X)Ú	ERR_CODESr”   )r    r5  s     r!   r  zDLT645Codec.error_textÔ  s0   € Øˆ<Ø�2ØŒ~×!Ò! $Ð(G¸TÐ(GÐ(GÐ(GÑHÔHÐHr#   NrÃ   rÄ   )r,  r   r   r  ©r-   r   r   r   )r5  rY   r   r   )r%   r&   r'   r(   rº   r»   r:  r>  r    rþ   r1  r  r*   r#   r!   r$  r$  c  sÉ   € € € € € ðð ð €EØ
€Cð ,Ø1Ø1Ø1Ø1Ø+ðð €Hð ØØ#Ø(ØØØðð €Iðð ð ð ð ð=8ð =8ð =8ð =8ð@
ð 
ð 
ð 
ðIð Ið Ið Ið Ið Ir#   r$  c                  ó®   — e Zd ZdZdZdZdZdZe 	                    d¦  «        Z
dZdZd"d„Zed#d„¦   «         Zed#d„¦   «         Z	 	 	 	 d$d%d„Zd&d„Zd'd „Zd!S )(ÚLocalProtocolBuilderu   
    å�—ç½‘é›†ä¸­å™¨æœ¬åœ°é€šä¿¡è§„çº¦ç»„åŒ…ç±»ï¼ˆä¸‹è¡Œï¼‰

    å¸§ï¼š
        68H | L(2B, å°�ç«¯) | C(1B) | ç”¨æˆ·æ•°æ�®åŒº | CS(1B) | 16H
        L = ç”¨æˆ·æ•°æ�®åŒºé•¿åº¦ + 6
        CS = (C + ç”¨æˆ·æ•°æ�®åŒº) & 0xFF

    ç”¨æˆ·æ•°æ�®åŒºï¼ˆä¸‹è¡Œï¼‰ï¼š
        ASRC(6B) æº�åœ°å�€ï¼ˆCCO åœ°å�€ï¼‰ï¼ŒåŽŸæ ·å†™å…¥
        ADST(6B) ç›®çš„åœ°å�€ï¼ˆSTA/ç”µè¡¨åœ°å�€ï¼‰ï¼Œä½Žå­—èŠ‚åœ¨å‰�
        AFN(1B) + SEQ(1B)
        DUID(4B)
        TaskID(2B, LE)
        PrioResp(1B)
        Timeout(2B, LE)
        InnerLen(1B)
        InnerFrame(NB)
    r˜   r™   é`   rô   Ú010202E8r;   Ú	asrc_addrr   Ú	adst_addrc                ó†   — |                       || j        ¦  «        | _        |                      || j        ¦  «        | _        d S rd   )Ú	_addr_rawÚASRC_LENÚasrcÚ_addr_leÚADST_LENÚadst)r    rD  rE  Úkwargss       r!   r    zLocalProtocolBuilder.__init__ý  s4   € Ø—N’N 9¨d¬mÑ<Ô<ˆŒ	Ø—M’M )¨T¬]Ñ;Ô;ˆŒ	ˆ	ˆ	r#   r   Únbytesr8   r   r   c                ó¸   — |dz  }t          | ¦  «        |k    rt          d| › d|› d�¦  «        ‚t                               |                      |¦  «        ¦  «        S )Nrô   õ   åœ°å�€ õ    è¶…å‡º õ    å­—èŠ‚©r   r   r   r   rå   ©r   rN  Úneeds      r!   rG  zLocalProtocolBuilder._addr_raw  s\   € à˜‰zˆÝˆt‰9Œ9�tÒÐÝÐD tÐDÐD°VÐDÐDÐDÑEÔEÐEÝ�}Š}˜TŸZšZ¨Ñ-Ô-Ñ.Ô.Ð.r#   c                óÊ   — |dz  }t          | ¦  «        |k    rt          d| › d|› d�¦  «        ‚t                               |                      |¦  «        ¦  «        d d d…         S )Nrô   rP  rQ  rR  r   rS  rT  s      r!   rJ  zLocalProtocolBuilder._addr_le  sg   € à˜‰zˆÝˆt‰9Œ9�tÒÐÝÐD tÐDÐD°VÐDÐDÐDÑEÔEÐEÝ�}Š}˜TŸZšZ¨Ñ-Ô-Ñ.Ô.¨t¨t°¨tÔ4Ð4r#   r×   r|   éƒ   rÞ   Úinner_645_framer9   Útask_idÚ	prio_respÚtimeoutc                óV  — | j         | j        z   t          | j        |g¦  «        z   | j        z   |                     dd¦  «        z   t          |g¦  «        z   |                     dd¦  «        z   t          t          |¦  «        g¦  «        z   |z   }|                      || j        ¬¦  «        S )Nrô   Úlittle)r¸   )	rI  rL  r   Ú
AFN_MANAGEÚDUID_ADD_TASKr"   r   Ú_wrapÚCTRL_DOWN_ADD_TASK)r    Útarget_meterrX  r9   rY  rZ  r[  Ú	user_datas           r!   Úbuild_add_taskz#LocalProtocolBuilder.build_add_task  sÆ   € ð ŒIØŒiñå�T”_ cÐ*Ñ+Ô+ñ,ð Ô ñ!ð ×Ò˜q (Ñ+Ô+ñ	,õ
 �Y�KÑ Ô ñ!ð ×Ò˜q (Ñ+Ô+ñ,õ •S˜Ñ)Ô)Ð*Ñ+Ô+ñ,ð ñð 	ð �zŠz˜)¨$Ô*AˆzÑBÔBÐBr#   c                ó    —  | j         ||fi |¤ŽS rd   )rd  )r    rb  rX  rM  s       r!   Úbuild_forward_645z&LocalProtocolBuilder.build_forward_645#  s   € Ø"ˆtÔ" <°ÐKÐKÀFÐKÐKÐKr#   rc  r¸   c                ó  — t          |¦  «        dz   }t          | j        g¦  «        |                     dd¦  «        z   t          |g¦  «        z   |z   }|t	          |¦  «        z   dz  }|t          || j        g¦  «        z   S )Nr;   rô   r]  r¤   )r   r   rº   r"   r‚   r»   )r    rc  r¸   ÚLrÀ   rÂ   s         r!   r`  zLocalProtocolBuilder._wrap&  sv   € Ý�	‰NŒN˜QÑˆÝ�d”j�\Ñ"Ô" Q§Z¢Z°°8Ñ%<Ô%<Ñ<½uÀdÀV¹}¼}ÑLÈyÑXˆØ•S˜‘^”^Ñ# tÑ+ˆØ•e˜R ¤˜NÑ+Ô+Ñ+Ð+r#   N)rD  r   rE  r   )r   r   rN  r8   r   r   )r×   r|   rW  rÞ   )rX  r   r9   r8   rY  r8   rZ  r8   r[  r8   r   r   r$   )rc  r   r¸   r8   r   r   )r%   r&   r'   r(   rº   r»   ra  r^  r   r   r_  rH  rK  r    rÆ   rG  rJ  rd  rf  r`  r*   r#   r!   rA  rA  Þ  sü   € € € € € ðð ð( €EØ
€CàÐØ€JØ—M’M *Ñ-Ô-€Mà€HØ€Hð<ð <ð <ð <ð ð/ð /ð /ñ „\ð/ð ð5ð 5ð 5ñ „\ð5ð #'Ø&,Ø(,Ø&,ðCð Cð Cð Cð Cð(Lð Lð Lð Lð,ð ,ð ,ð ,ð ,ð ,r#   rA  u   æˆ�åŠŸu   å…¶å®ƒ)r   r¤   c                  óž  — e Zd ZU dZded<   ded<   ded<   dZded	<   d
Zded<   d
Zded<   dZded<   dZ	ded<   dZ
ded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   ed'd„¦   «         Zed'd„¦   «         Zed'd „¦   «         Zed'd!„¦   «         Zed(d#„¦   «         Zed(d$„¦   «         Zed)d&„¦   «         ZdS )*Ú
LocalFrameuY  
    ä¸€å¸§å�—ç½‘é›†ä¸­å™¨æœ¬åœ°é€šä¿¡è§„çº¦æŠ¥æ–‡ã€‚

    ä¸‹è¡Œè¯·æ±‚å¸§(DIR=0,PRM=1)ï¼šASRC ADST AFN SEQ DUID TaskID Prio Timeout InnerLen Inner
    ä¸Šè¡Œä¸šåŠ¡å¸§(DIR=1,PRM=1)ï¼šASRC ADST AFN SEQ DUID TaskID           InnerLen Inner
    ç¡®è®¤å¸§    (PRM=0)      ï¼šä»…åŸºæœ¬å­—æ®µï¼ˆlength_ok / checksum_ok ä¸º Noneï¼Œä¸Ž v1 ä¸€è‡´ï¼‰
    r   ro   r8   r¿   r  Fr/   Úis_ackr   r   rI  rL  r#   Ú
asrc_bytesÚ
adst_bytesr   Úafnr9   ÚduidrY  ÚinnerNrY   Úlength_calcr  r  r  r   c                ó   — | j         dz	  dz  S r  r  r   s    r!   r  zLocalFrame.directionV  r  r#   c                ó   — | j         dz	  dz  S )Nr;   r|   r  r   s    r!   ÚprmzLocalFrame.prmZ  r  r#   c                ó   — | j         dz	  dz  S r  r  r   s    r!   ÚaddzLocalFrame.add^  r  r#   c                ó   — | j         dz  S )NrÖ   r  r   s    r!   ÚverzLocalFrame.verb  r  r#   úOptional[bool]c                ó4   — | j         €d n| j        | j         k    S rd   )rq  r¿   r   s    r!   Ú	length_okzLocalFrame.length_okf  s   € àÔ'Ð/ˆtˆt°T´[ÀDÔDTÒ5TÐTr#   c                ó4   — | j         €d n| j         | j        k    S rd   r  r   s    r!   r  zLocalFrame.checksum_okj  s   € à”}Ð,ˆtˆt°$´-À4ÔCUÒ2UÐUr#   úOptional[bytes]c                ó`   — | j         dd…         dk    r| j         dd…         dk    r| j         S dS )u+   å†…å±‚æ˜¯ä¸�æ˜¯ä¸€æ•´å¸§ 645ï¼ˆ68 ... 16ï¼‰Nr|   ó   hr   ó   )rp  r   s    r!   r]   zLocalFrame.inner_645n  s:   € ð Œ:�b�q�bŒ>˜WÒ$Ð$¨¬°B°C°C¬¸GÒ)CÐ)CØ”:ÐØˆtr#   rE   )r   ry  )r   r}  )r%   r&   r'   r(   r)   rk  rI  rL  rl  rm  rn  r9   ro  rY  rp  rq  r  r  r  rG   r  rt  rv  rx  r{  r  r]   r*   r#   r!   rj  rj  ;  sý  € € € € € € ðð ð €J€J�JØ€K€K�KØ€L€L�LØ€FÐÐÐÑØ€D€N€N€N�NØ€D€N€N€N�NØ€JÐÐÐÑØ€JÐÐÐÑØ€C€L€L€L�LØ€C€L€L€L�LØ€DÐÐÐÑØ€GÐÐÐÑØ€EÐÐÐÑØ!%€KÐ%Ð%Ð%Ñ%Ø"€HÐ"Ð"Ð"Ñ"Ø#'€MÐ'Ð'Ð'Ñ'Ø€C€L€L€L�Làð'ð 'ð 'ñ „Xð'ð ð'ð 'ð 'ñ „Xð'ð ð'ð 'ð 'ñ „Xð'ð ð#ð #ð #ñ „Xð#ð ðUð Uð Uñ „XðUð ðVð Vð Vñ „XðVð ðð ð ñ „Xðð ð r#   rj  c                  ó¬   — e Zd ZU dZded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   edd„¦   «         Zedd„¦   «         Zedd„¦   «         ZdS )ÚTaskStatusReportuÛ   
    æ¨¡å�—ã€Œä¸ŠæŠ¥ä»»åŠ¡çŠ¶æ€�ã€�å¸§ï¼ˆC=0xC0ï¼šä¸Šè¡Œèµ°å»Šã€�PRM=1ã€�æ— åœ°å�€åŸŸï¼Œæ€»é•¿ 21 å­—èŠ‚ï¼‰ï¼š
        68 L(2) C AFN(1) SEQ(1) DUID(4) TaskID(2,LE) ä»ŽèŠ‚ç‚¹åœ°å�€(6,BCDå€’åº�) ä»»åŠ¡çŠ¶æ€�(1) CS 16
    r   ro   r8   r9   ro  rY  r   r   Ústatus_coder  r  r   c                óV   — t                                | j        d| j        d›d�¦  «        S )Nu	   æœªçŸ¥(0xr=  rC   )ÚTASK_STATUS_CODESr”   rƒ  r   s    r!   Ústatus_textzTaskStatusReport.status_text…  s-   € å ×$Ò$ TÔ%5Ð7ZÀ4ÔCSÐ7ZÐ7ZÐ7ZÐ7ZÑ[Ô[Ð[r#   r/   c                ó"   — | j         | j        k    S rd   r  r   s    r!   r  zTaskStatusReport.checksum_ok‰  r  r#   c                ó   — | j         dk    S )uI   00=æˆ�åŠŸï¼ˆæ•°æ�®å¸§éš�å�Žå�¦å�‘ï¼‰ï¼›é�ž 00 è¡¨ç¤ºæœ¬é¡¹ä¸�ä¼šæœ‰æ•°æ�®r   )rƒ  r   s    r!   ÚokzTaskStatusReport.ok�  s   € ð Ô 4Ò'Ð'r#   NrF   rq   )	r%   r&   r'   r(   r)   rG   r†  r  r‰  r*   r#   r!   r‚  r‚  v  sÒ   € € € € € € ðð ð €J€J�JØ€H€H�HØ€K€K�KØ€L€L�LØ€I€I�IØÐÐÑØ€M€M�MØÐÐÑàð\ð \ð \ñ „Xð\ð ð3ð 3ð 3ñ „Xð3ð ð(ð (ð (ñ „Xð(ð (ð (r#   r‚  c                  ó2   — e Zd ZdZdZdZdZdZdd
„Zdd„Z	dS )ÚLocalProtocolCodecu^   å�—ç½‘é›†ä¸­å™¨æœ¬åœ°é€šä¿¡è§„çº¦è§£æž�å™¨ï¼šbytes â†’ LocalFrameï¼›ç»“æž„é—®é¢˜æŠ› FrameErrorr˜   r™   r�   s   èr,  r   r   rj  c           
     ó4  — t          |¦  «        dk     rt          d¦  «        ‚|d         | j        k    rt          d|d         d›�¦  «        ‚|d         | j        k    rt          d|d         d›�¦  «        ‚t                               |dd	…         d
¦  «        }|d	         }|dz	  dz  dk    rt          |||d¬¦  «        S t          |¦  «        dk     rt          d¦  «        ‚|dd…         |dd…         }}|d         }|dd|z   …         }|dd|z   …         }t          d*i d|“d|“d|“dd“d|“d|d d d…                              ¦   «                              ¦   «         “d|“d|d d d…                              ¦   «                              ¦   «         “d|d         “d|d         “d |d!d"…         “d#t                               |d"d…         d
¦  «        “d$|“d%t          |¦  «        dz   “d&|d|z            “d'|t          |¦  «        z   d(z  “d)|d|z            “ŽS )+Nr;   õ	   å¸§è¿‡çŸ­r   u   èµ·å§‹å­—èŠ‚é”™è¯¯: r=  r   u   ç»“æ�Ÿå­—èŠ‚é”™è¯¯: r|   rõ   r]  T)ro   r¿   r  rk  é   u   ä¸ŠæŠ¥å¸§è¿‡çŸ­rÕ   rÞ   r<   é   é   ro   r¿   r  rk  Frl  rI  rm  rL  rn  r9   rš   ro  é   r™   rY  rp  rq  r  r  r¤   r  r*   )
r   rÈ   rº   r»   r8   Ú
from_bytesrj  rØ   r=   r‚   )	r    r,  r¿   r¸   rI  rL  Ú	inner_lenrp  rc  s	            r!   rþ   zLocalProtocolCodec.parse›  s¢  € Ýˆu‰:Œ:˜Š>ˆ>Ý˜[Ñ)Ô)Ð)Ø�Œ8�t”zÒ!Ð!ÝÐB°E¸!´HÐBÐBÐBÑCÔCÐCØ�Œ9˜œÒ Ð ÝÐC°E¸"´IÐCÐCÐCÑDÔDÐDå—’  a¨ c¤
¨HÑ5Ô5ˆØ�QŒxˆà�Q‰Y˜!‰O Ò!Ð!Ý %°ÀÈTÐRÑRÔRÐRåˆu‰:Œ:˜Š?ˆ?ÝÐ.Ñ/Ô/Ð/à˜1˜R˜4”[ %¨¨2¨¤,ˆdˆØ˜"”Iˆ	Ø�b˜˜i™Ð'Ô(ˆØ˜!˜B ™NÐ*Ô+ˆ	Ýð 
ð 
ð 
Ø�ð
Ø$˜fð
Ø.2¨dð
Ø;@¸5ð
à�tð
à"& t t¨ t¤*§.¢.Ñ"2Ô"2×"8Ò"8Ñ":Ô":Ð":ð
ð �tð
ð #' t t¨ t¤*§.¢.Ñ"2Ô"2×"8Ò"8Ñ":Ô":Ð":ð
ð �b”	�	ð	
ð  % Rœy˜yð	
ð 05°R¸°U¬|¨|ð	
õ
 —N’N 5¨¨B¨¤<°Ñ:Ô:Ð:ð
ð �%ð
õ ˜I™œ¨Ñ*Ð*ð
ð ˜2 	™>Ô*Ð*ð
ð  ¥# i¡.¤.Ñ0°DÑ8Ð8ð
ð �b˜9‘nÔ%Ð%ð
ð 	
r#   úOptional[TaskStatusReport]c                ó6  — t          |¦  «        dk    s"|d         | j        k    s|d         | j        k    rdS |d         }|dz  dk    s|dz	  dz  rdS |d	         | j        k    s|d
d…         | j        k    rdS t          ||d         |d
d…         t                               |dd…         d¦  «        |dd…         ddd…                              ¦   «          	                    ¦   «         |d         |d         |t          |d	d…         ¦  «        z   dz  ¬¦  «        S )u²   
        è¯†åˆ«å¹¶è§£æž�ã€Œä¸ŠæŠ¥ä»»åŠ¡çŠ¶æ€�ã€�å¸§ï¼›ä¸�æ˜¯è¯¥ç±»å¸§è¿”å›ž Noneã€‚
        ï¼ˆæ€»é•¿ 21 å­—èŠ‚ï¼Œéœ€ PRM=1 ä¸”æ— åœ°å�€åŸŸï¼ŒAFN=05 ä¸” DUID=050505E8ï¼‰
        é   r   r   Nrõ   éÀ   r�   r|   rÕ   r;   rÞ   r   r]  r‘  é   r¤   )ro   r9   ro  rY  r   rƒ  r  r  )r   rº   r»   Ú
AFN_REPORTÚDUID_TASK_STATUSr‚  r8   r’  rØ   r=   r‚   )r    r,  r¸   s      r!   Úparse_task_statusz$LocalProtocolCodec.parse_task_status½  s*  € õ
 ˆu‰:Œ:˜ÒÐ˜u Qœx¨4¬:Ò5Ð5¸¸r¼ÀdÄhÒ9NÐ9NØ�4Ø�QŒxˆØ�4‰K˜DÒ Ð  d¨a¡i°1¡_Ð Ø�4Ø�Œ8�t”Ò&Ð&¨%°°"°¬+¸Ô9NÒ*NÐ*NØ�4ÝØ˜5 œ8¨%°°"°¬+Ý—N’N 5¨¨B¨¤<°Ñ:Ô:Ø�r˜"�u”˜d˜d ˜dÔ#×'Ò'Ñ)Ô)×/Ò/Ñ1Ô1Ø˜bœ	Ø˜2”Y¨tµc¸%ÀÀ"À¼+Ñ6FÔ6FÑ/FÈ$Ñ.Nð
ñ 
ô 
ð 	
r#   N)r,  r   r   rj  )r,  r   r   r”  )
r%   r&   r'   r(   rº   r»   r™  rš  rþ   r›  r*   r#   r!   r‹  r‹  “  sX   € € € € € ØhÐhà€EØ
€CØ€JØ*Ðð 
ð  
ð  
ð  
ðD
ð 
ð 
ð 
ð 
ð 
r#   r‹  r9   c                óN  — t          d| dz  g¦  «        t                                d¦  «        z   dz   }d}t          dg¦  «        t          |¦  «        dz                        dd¦  «        z   t          |g¦  «        z   |z   }|t          |t	          |¦  «        z   dz  d	g¦  «        z   S )
už  
    å¯¹æ¨¡å�—ã€Œä¸Šè¡ŒæŠ¥æ–‡ã€�çš„ç¡®è®¤å¸§ï¼ˆæˆ‘ä»¬å›žç»™æ¨¡å�—ï¼‰ã€‚

    å®žæµ‹æ ·ä¾‹ï¼š68 0E 00 00 00 D0 01 00 01 E8 00 00 BA 16
      C=0x00 ä¸‹è¡ŒæŠ¥æ–‡ / PRM=0 æ�¥è‡ªä»ŽåŠ¨ç«™ / æ— åœ°å�€åŸŸ
      åº”ç”¨æ•°æ�®åŸŸ = AFN(00 ç¡®è®¤Â·å�¦è®¤) + SEQ + DUID(01 00 01 E8 ç¡®è®¤) + ç­‰å¾…æ—¶é—´(00 00)
    è¦�ç‚¹ï¼š**SEQ å¿…é¡»ä¸Žè¢«ç¡®è®¤çš„é‚£æ�¡ä¸Šè¡ŒæŠ¥æ–‡å®Œå…¨ä¸€è‡´**ï¼Œå�¦åˆ™æ¨¡å�—ä¸�è®¤è¿™æ�¡ç¡®è®¤ã€‚
    r   r¤   Ú010001E8s     r˜   r;   rô   r]  r™   )r   r   r   r"   r‚   )r9   Úudr¸   rÀ   s       r!   Úbuild_report_ackrŸ  Ò  s›   € õ 
��c˜D‘jÐ!Ñ	"Ô	"¥U§]¢]°:Ñ%>Ô%>Ñ	>ÀÑ	L€BØ€DÝ�$�‰=Œ=�C ™GœG a™K×1Ò1°!°XÑ>Ô>Ñ>ÅÈÀvÁÄÑNÐQSÑS€DØ•%˜$¥ R¡¤™.¨DÑ0°$Ð7Ñ8Ô8Ñ8Ð8r#   c                  ó"   — e Zd ZdZdZdZdZdZdS )Ú
UplinkKindÚconfirmÚtask_statusr¢   Únon_dataÚillegalN)r%   r&   r'   ÚCONFIRMÚTASK_STATUSÚDATAÚNON_DATAÚILLEGALr*   r#   r!   r¡  r¡  é  s'   € € € € € Ø€GØ€KØ€DØ€HØ€G€G€Gr#   r¡  c                  óÒ   — e Zd ZU dZded<   ded<   dZded<   dZd	ed
<   dZded<   dZded<   dZ	ded<   dZ
ded<   dZded<   edd„¦   «         Zedd„¦   «         Zedd„¦   «         ZdS )ÚUplinku­   
    ä¸€æ�¡ä¸Šè¡ŒæŠ¥æ–‡çš„åˆ†ç±»ç»“æžœã€‚å½’å±žå�ªç”¨åˆ° innerï¼ˆè¡¨å�· + DIï¼‰ï¼Œ
    å†�ä¹Ÿä¸�éœ€è¦� rep["645"]["err_code"] è¿™ç§�æŒ‰å­—ç¬¦ä¸²é”®å¾€ä¸‹é’»çš„å†™æ³•ã€‚
    r¡  r  r   r,  NzOptional[LocalFrame]ÚlocalzOptional[DLT645Frame]rp  r”  rU   r   r   r\   Fr/   Ú
should_ackr   r8   Úack_seqÚack_srcr   c                ó,   — | j         �| j         j        ndS rh   )rp  r   r   s    r!   r   zUplink.addr  s   € à"&¤*Ð"8ˆtŒzŒˆ¸bÐ@r#   c                ó,   — | j         �| j         j        ndS rh   )rp  r-   r   s    r!   r-   z	Uplink.di  s   € à $¤
Ð 6ˆtŒzŒ}ˆ}¸BÐ>r#   c                ó,   — | j         duo| j         j        S )ug   è¿™æ�¡åº”ç­”çš„ç»“è®ºæ˜¯å��çš„ï¼ˆv1 çš„ abnormal è¯­ä¹‰ï¼Œç”¨äºŽç¼“å­˜å‘½ä¸­æ—¶çš„é‡�æ–°ç¡®è®¤åˆ¤æ–­ï¼‰N)rp  r"  r   s    r!   r"  zUplink.is_conclusive_error	  s   € ð Œz Ð%ÐH¨$¬*Ô*HÐHr#   rF   rq   )r%   r&   r'   r(   r)   r­  rp  rU   r\   r®  r¯  r°  rG   r   r-   r"  r*   r#   r!   r¬  r¬  ñ  s  € € € € € € ðð ð ÐÐÑØ€L€L�LØ"&€EÐ&Ð&Ð&Ñ&Ø#'€EÐ'Ð'Ð'Ñ'Ø)-€FÐ-Ð-Ð-Ñ-Ø€D€N€N€N�NØ€JÐÐÐÑØ€GÐÐÐÑØ€GÐÐÐÑàðAð Að Añ „XðAð ð?ð ?ð ?ñ „Xð?ð ðIð Ið Iñ „XðIð Ið Ir#   r¬  c                  ó(   — e Zd ZdZ	 	 ddd	„Zdd„ZdS )ÚUplinkClassifieruª   
    ä¸Šè¡Œå¸§åˆ†ç±»å™¨ï¼šbytes â†’ Uplinkã€‚åˆ†ç±»çš„å�Œæ—¶å†™æ—¥å¿—ä¸ŽåŽŸå§‹æŠ¥æ–‡æµ�æ°´
    ï¼ˆè¿™äº›æ—¥å¿—æœ¬èº«å°±æ˜¯æŽ’éšœä¾�æ�®ï¼ŒæŒ‰ v1 çš„åŽŸæ–‡ä¿�ç•™ï¼‰ã€‚
    NÚlogsÚLogSinkr­  úOptional[LocalProtocolCodec]Údlt645úOptional[DLT645Codec]c                óh   — || _         |pt          ¦   «         | _        |pt          ¦   «         | _        d S rd   )r¶  r‹  r­  r$  r¹  )r    r¶  r­  r¹  s       r!   r    zUplinkClassifier.__init__  s2   € ð ˆŒ	ØÐ2Õ0Ñ2Ô2ˆŒ
ØÐ-¥¡¤ˆŒˆˆr#   r,  r   r   r¬  c           	     ó0
  — t          |¦  «        dk     r8| j                             d|d¦  «         t          t          j        |d¬¦  «        S |d         dz	  dz  dk    rèt          |¦  «        dk    r|d         nd }dd	i                     ||�d
|d›�nd¦  «        }| j                             d|                     ¦   «          	                    ¦   «         › d|› d�¦  «         | j                             d|d|› d�¦  «         | j         
                    dt          |d¬¦  «        ¦  «         t          t          j        ||¬¦  «        S | j                             |¦  «        }|�¼|j        sŒ| j                             d|                     ¦   «          	                    ¦   «         › �¦  «         | j                             d|d|j        d›d|j        d›�¦  «         t          t          j        ||d¬¦  «        S t          t          j        ||d|j        |j        ¬¦  «        S 	 | j                             |¦  «        }�n6# t,          $ �r(}t          |¦  «        dk     rˆ| j                             d|                     ¦   «          	                    ¦   «         › d|› d �¦  «         | j                             d!|d"|› �¦  «         t          t          j        |d"|› �¬¦  «        cY d }~S | j                             d#|                     ¦   «          	                    ¦   «         › d|› d �¦  «         | j                             d|d$|› �¦  «         t          t          j        |d$|› �¬¦  «        cY d }~S d }~ww xY w|j        du}|s| j                             d%¦  «         t1          ||j        |j        ¬&¦  «        }|j        r|j        €y| j                             d|                     ¦   «          	                    ¦   «         › d'�¦  «         | j                             d!|d(¦  «         t          d.t          j        ||d)d*œ|¤ŽS 	 | j                             |j        ¦  «        }	n£# t,          $ r–}| j                             d+|j                             ¦   «          	                    ¦   «         › d|› d �¦  «         | j                             d|j        d,|› �¦  «         t          d.t          j        ||d,|› �d*œ|¤ŽcY d }~S d }~ww xY wt          d.t          j        |||	d-œ|¤ŽS )/NrÕ   úRX-BADr�  )r  r,  r\   rõ   r;   r|   r   u   AFN=00 ç¡®è®¤/å�¦è®¤zAFN=r=  r   u       [ç¡®è®¤å¸§] u   ï¼ˆu'   ï¼Œä»»åŠ¡å·²å�—ç�†ï¼Œç­‰å¾…æ•°æ�®å¸§ï¼‰zRX-ACKu   ç¡®è®¤å¸§(PRM=0 u
   )ï¼Œè·³è¿‡u   Â· ç¡®è®¤å¸§F©Ú
with_inneru       [ä»»åŠ¡çŠ¶æ€�å¸§CSé”™] u   ä»»åŠ¡çŠ¶æ€�å¸§ CS=u    åº”ä¸º u   ä»»åŠ¡çŠ¶æ€�å¸§ CS é”™)r  r,  rU   r\   T)r  r,  rU   r®  r¯  r°  rŽ  u       [é�žæŠ„è¯»å¸§] rB   rC   zRX-MISCu   é�žæŠ„è¯»å¸§: u       [è·³è¿‡é�žæ³•å¸§] u   é�žæ³•å¸§: uG       [ä¸�ä¸ŠæŠ¥ç¡®è®¤] æœ¬åœ°è§„çº¦ CS æ ¡éªŒå¤±è´¥ï¼Œç­‰å¾…æ¨¡å�—é‡�ä¼ )r®  r¯  r°  u   ï¼ˆæ—  645 å†…å±‚ï¼‰u   æ—  645 å†…å±‚ï¼Œé�žæŠ„è¯»å¸§u   æ—  645 å†…å±‚)r  r,  r­  r\   u       [è·³è¿‡é�žæ³•645å¸§] u   645 é�žæ³•å¸§: )r  r,  r­  rp  r*   )r   r¶  ro   r¬  r¡  rª  r”   ÚflowrØ   r=   r6  Úannotate_local_framer¦  r­  r›  r  r  r  r§  r9   r   rþ   Ú	Exceptionr©  r0  rI  rp  r]   r¹  r¨  )
r    r,  rn  Úafn_txtrU   r­  Úer®  Úackrp  s
             r!   ÚclassifyzUplinkClassifier.classify  s²  € Ýˆu‰:Œ:˜Š>ˆ>ØŒI�MŠM˜( E¨;Ñ7Ô7Ð7Ý�zÔ1¸À[ÐQÑQÔQÐQð �1ŒX˜‰]˜aÑ AÒ%Ð%Ý! %™jœj¨1šn˜n�%˜”(�(°$ˆCØÐ3Ð4×8Ò8Ø¨¨Ð%˜CÐ%Ð%Ð%Ð%¸bñBô BˆGàŒI�NŠNð R¨e¯iªi©k¬k×.?Ò.?Ñ.AÔ.Að Rð RØ!(ðRð Rð Rñ Sô Sð SàŒI�MŠM˜( EÐ+Q¸gÐ+QÐ+QÐ+QÑRÔRÐRØŒI�OŠO˜NÕ,@ÀÐSXÐ,YÑ,YÔ,YÑZÔZÐZÝ�zÔ1¸ÀWÐMÑMÔMÐMð ”×-Ò-¨eÑ4Ô4ˆØÐØÔ%ð =Ø”	—’ÐR¸U¿YºY¹[¼[×=NÒ=NÑ=PÔ=PÐRÐRÑSÔSÐSØ”	—’˜h¨ð 0TÀVÄ_Ð/[ð 0Tð 0TØ9?Ô9MÐ/Sð0Tð 0Tñ Uô Uð Uå¥:Ô#5¸UÈ6Ø#;ð=ñ =ô =ð =å�zÔ5¸UÈ6Ø%)°6´:ÀvÄ{ðTñ Tô Tð Tð
	XØ”J×$Ò$ UÑ+Ô+ˆE‰EøÝð 	Xñ 	Xð 	Xå�5‰zŒz˜BŠˆØ”	—’ÐP°U·Y²Y±[´[×5FÒ5FÑ5HÔ5HÐPÐPÈAÐPÐPÐPÑQÔQÐQØ”	—’˜i¨Ð0DÀÐ0DÐ0DÑEÔEÐEÝ¥:Ô#6¸eÐJ^Ð[\ÐJ^ÐJ^Ð_Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ð_ØŒI�NŠNÐO°E·I²I±K´K×4EÒ4EÑ4GÔ4GÐOÐOÈ1ÐOÐOÐOÑPÔPÐPØŒI�MŠM˜( EÐ+<¸Ð+<Ð+<Ñ=Ô=Ð=Ý�zÔ1¸ÐEVÐSTÐEVÐEVÐWÑWÔWÐWÐWÐWÐWÐWÐWøøøøð	Xøøøð Ô&¨eÐ3ˆ
Øð 	fØŒI�NŠNÐdÑeÔeÐeÝ˜j°%´)ÀUÄZÐPÑPÔPˆàŒ{ð 	8˜eœoÐ5ØŒI�NŠNÐZ°·²±´×1BÒ1BÑ1DÔ1DÐZÐZÐZÑ[Ô[Ð[ØŒI�MŠM˜) UÐ,KÑLÔLÐLÝð 8�zÔ2¸%ÀuØ/ð8ð 8Ø36ð8ð 8ð 8ð	=Ø”K×%Ò% e¤kÑ2Ô2ˆEˆEøÝð 	=ð 	=ð 	=ØŒI�NŠNÐX°u´{·²Ñ7HÔ7H×7NÒ7NÑ7PÔ7PÐXÐXÐTUÐXÐXÐXÑYÔYÐYØŒI�MŠM˜( E¤KÐ1FÀ1Ð1FÐ1FÑGÔGÐGÝð =�zÔ1¸ÀeØ4°Ð4Ð4ð=ð =Ø8;ð=ð =ð =ð =ð =ð =ð =ð =øøøøð	=øøøõ ÐY�:œ?°%¸uÈEÐYÐYÐUXÐYÐYÐYsK   ÈH; È;M.ÉBM)ËM.Ë!BM)Í#M.Í)M.Ð:Q Ñ
S:Ñ$BS5Ó/S:Ó5S:)NN)r¶  r·  r­  r¸  r¹  rº  )r,  r   r   r¬  )r%   r&   r'   r(   r    rÆ  r*   r#   r!   rµ  rµ    sY   € € € € € ðð ð 8<Ø15ð.ð .ð .ð .ð .ð>Zð >Zð >Zð >Zð >Zð >Zr#   rµ  c                  ó   — e Zd ZdZdS )ÚSerialPortErroru   ä¸²å�£æ“�ä½œå¼‚å¸¸NrÉ   r*   r#   r!   rÈ  rÈ  a  s   € € € € € ØÐØ€Dr#   rÈ  c                  óš   — e Zd ZdZ	 	 	 	 	 	 	 d3d4d„Zd5d„Zd5d„Zd6d„Zd„ Zd„ Z	d7d„Z
	 	 	 d8d9d&„Z	 	 	 	 	 d:d;d,„Zd5d-„Zd<d=d/„Zd0„ Zd>d2„Zd S )?Ú
SerialPortue   
    ä¸²å�£é€šä¿¡å°�è£…ã€‚
    é»˜è®¤å�‚æ•°ï¼š115200 / 8 æ•°æ�®ä½� / å�¶æ ¡éªŒ (E) / 1 å�œæ­¢ä½�
    é Â r2   ÚEr|   ç      ð?TÚportr   Úbaudrater8   ÚbytesizeÚparityÚstopbitsr[  ÚfloatÚwrite_timeoutÚverboser/   c	                ó  — t           st          d¦  «        ‚|| _        || _        || _        |                     ¦   «         | _        || _        || _        || _	        || _
        d | _        t          j        ¦   «         | _        d S )Nu4   æœªå®‰è£… pyserialï¼Œè¯·æ‰§è¡Œ: pip install pyserial)ÚSERIAL_AVAILABLErÈ  rÎ  rÏ  rÐ  r=   rÑ  rÒ  r[  rÔ  rÕ  Ú_serÚ	threadingÚRLockÚ_lock)	r    rÎ  rÏ  rÐ  rÑ  rÒ  r[  rÔ  rÕ  s	            r!   r    zSerialPort.__init__l  sw   € õ  ð 	ZÝ!Ð"XÑYÔYÐYàˆŒ	Ø ˆŒØ ˆŒØ—l’l‘n”nˆŒØ ˆŒØˆŒØ*ˆÔØˆŒà-1ˆŒ	Ý”_Ñ&Ô&ˆŒ
ˆ
ˆ
r#   r   ÚNonec                ó`  — | j         5  | j        r| j        j        r	 d d d ¦  «         d S 	 t          j        | j        | j        | j        |                      ¦   «         | j	        | j
        | j        ¬¦  «        | _        | j                             ¦   «          | j                             ¦   «          |                      d| j        › d| j        › d| j        › | j        › | j	        › �¦  «         n,# t           $ r}t#          d| j        › d|› �¦  «        ‚d }~ww xY w	 d d d ¦  «         d S # 1 swxY w Y   d S )N)rÎ  rÏ  rÐ  rÑ  rÒ  r[  rÔ  u   [ä¸²å�£] å·²æ‰“å¼€ z @ú,u   æ‰“å¼€ä¸²å�£å¤±è´¥ ú: )rÛ  rØ  Úis_openÚserialÚSerialrÎ  rÏ  rÐ  Ú_parity_constrÒ  r[  rÔ  Úreset_input_bufferÚreset_output_bufferÚ_logrÑ  r   rÈ  )r    rÄ  s     r!   ÚopenzSerialPort.open…  sø  € ØŒZð 	Nð 	NØŒyð ˜TœYÔ.ð Øð	Nð 	Nð 	Nñ 	Nô 	Nð 	Nð 	Nð 	NðNÝ"œMØœØ!œ]Ø!œ]Ø×-Ò-Ñ/Ô/Ø!œ]Ø œLØ"&Ô"4ðñ ô �”	ð ”	×,Ò,Ñ.Ô.Ð.Ø”	×-Ò-Ñ/Ô/Ð/Ø—	’	ð Z°´	ð Zð ZØ"œmðZð ZØ.2¬mðZØ=A¼[ðZØJNÌ-ðZð Zñ [ô [ð [ð [øå"ð Nð Nð NÝ%Ð&L¸D¼IÐ&LÐ&LÈÐ&LÐ&LÑMÔMÐMøøøøðNøøøð[ð!	Nð 	Nð 	Nñ 	Nô 	Nð 	Nð 	Nð 	Nð 	Nð 	Nð 	Nð 	Nøøøð 	Nð 	Nð 	Nð 	Nð 	Nð 	Ns5   ˆD#«B=C)Ã(D#Ã)
DÃ3DÄDÄD#Ä#D'Ä*D'c                óØ   — | j         5  | j        rB| j        j        r6| j                             ¦   «          |                      d| j        › �¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nu   [ä¸²å�£] å·²å…³é—­ )rÛ  rØ  rà  Úcloseræ  rÎ  r   s    r!   ré  zSerialPort.close›  s³   € ØŒZð 	=ð 	=ØŒyð =˜TœYÔ.ð =Ø”	—’Ñ!Ô!Ð!Ø—	’	Ð;°´	Ð;Ð;Ñ<Ô<Ð<ð	=ð 	=ð 	=ñ 	=ô 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=øøøð 	=ð 	=ð 	=ð 	=ð 	=ð 	=s   ˆA
AÁA#Á&A#c                ó,   — | j         d uo| j         j        S rd   )rØ  rà  r   s    r!   rà  zSerialPort.is_open¡  s   € ØŒy Ð$Ð:¨¬Ô):Ð:r#   c                ó.   — |                       ¦   «          | S rd   )rç  r   s    r!   Ú	__enter__zSerialPort.__enter__¤  s   € Ø�	Š	‰ŒˆØˆr#   c                ó.   — |                       ¦   «          d S rd   )ré  )r    Úexc_typeÚexc_valÚexc_tbs       r!   Ú__exit__zSerialPort.__exit__¨  s   € Ø�
Š
‰Œˆˆˆr#   r¢   r   c                ó¶  — |                       ¦   «         st          d¦  «        ‚| j        5  	 | j                             |¦  «        }| j                             ¦   «          |                      d|                     ¦   «                              ¦   «         › �¦  «         |cd d d ¦  «         S # t          $ r}t          d|› �¦  «        ‚d }~ww xY w# 1 swxY w Y   d S )Nõ   ä¸²å�£æœªæ‰“å¼€u   [ä¸²å�£][TX] u   å�‘é€�å¤±è´¥: )
rà  rÈ  rÛ  rØ  ÚwriteÚflushræ  rØ   r=   r   )r    r¢   ÚnrÄ  s       r!   ÚsendzSerialPort.send¬  s!  € Ø�|Š|‰~Œ~ð 	5Ý!Ð"3Ñ4Ô4Ð4ØŒZð 	<ð 	<ð<Ø”I—O’O DÑ)Ô)�Ø”	—’Ñ!Ô!Ð!Ø—	’	Ð>¨$¯(ª(©*¬*×*:Ò*:Ñ*<Ô*<Ð>Ð>Ñ?Ô?Ð?Øð	<ð 	<ð 	<ð 	<ñ 	<ô 	<ð 	<ð 	<øõ #ð <ð <ð <Ý%Ð&:°qÐ&:Ð&:Ñ;Ô;Ð;øøøøð<øøøð	<ð 	<ð 	<ð 	<øøøð 	<ð 	<ð 	<ð 	<ð 	<ð 	<s/   «C­A0B*Â*
CÂ4CÃCÃCÃCÃCr   NÚexpected_lenÚend_flagr}  Úmax_waitúOptional[float]c                óò  — |                       ¦   «         st          d¦  «        ‚t          j        ¦   «         |�|n| j        z   }t	          ¦   «         }| j        5  | j        j        }	 t          | j        _        t          j        ¦   «         |k     r¦| j        j        }|r| j         	                    |¦  «        n| j         	                    d¦  «        }|s|r|s|sn[Œc| 
                    |¦  «         |r|                     |¦  «        rn-|rt          |¦  «        |k    rnt          j        ¦   «         |k     °¦|| j        _        n# || j        _        w xY w	 ddd¦  «         n# 1 swxY w Y   t          |¦  «        S )u8  
        å�–ä¸€æ¬¡å·²åˆ°è¾¾çš„å­—èŠ‚ï¼ˆå�¯èƒ½å�«å¤šå¸§ç²˜åŒ…ï¼Œäº¤ç»™ä¸Šå±‚æŒ‰ L å­—æ®µåˆ‡åˆ†ï¼‰ã€‚

        ä¼˜å…ˆè¯»ã€Œå·²ç»�åœ¨é©±åŠ¨ç¼“å†²åŒºé‡Œçš„å­—èŠ‚ã€�ï¼ˆin_waitingï¼‰â€”â€”æœ‰æ•°æ�®ç«‹åˆ»è¿”å›žï¼Œ
        ä¸�å¿…ç™½ç­‰ä¸€ä¸ªè¯»åˆ‡ç‰‡ï¼›æ²¡æ•°æ�®æ‰�å�šä¸€æ¬¡æœ€å¤š _READ_SLICE ç§’çš„é˜»å¡žè¯»ã€‚
        ró  Nr|   )rà  rÈ  Útimer[  Ú	bytearrayrÛ  rØ  Ú_READ_SLICEÚ
in_waitingÚreadÚextendr3  r   r   )	r    rø  rù  rú  ÚdeadlineÚbufÚold_timeoutÚpendingÚchunks	            r!   ÚrecvzSerialPort.recv¸  s¼  € ð �|Š|‰~Œ~ð 	5Ý!Ð"3Ñ4Ô4Ð4å”9‘;”;¨hÐ.B ( (ÈÌÑUˆÝ‰kŒkˆàŒZð 	0ð 	0Øœ)Ô+ˆKð0Ý$/�”	Ô!Ý”i‘k”k HÒ,Ð,Ø"œiÔ2�GØ7>ÐU˜DœIŸNšN¨7Ñ3Ô3Ð3ÀDÄIÇNÂNÐSTÑDUÔDU�EØ ð !Øð " |ð "¸Hð "Ø!Ø Ø—J’J˜uÑ%Ô%Ð%Øð  C§L¢L°Ñ$:Ô$:ð ØØ#ð ­¨C©¬°LÒ(@Ð(@Øõ ”i‘k”k HÒ,Ð,ð %0�”	Ô!Ð!ø K�”	Ô!Ð/Ð/Ð/Ð/Ð!ð#	0ð 	0ð 	0ñ 	0ô 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0øøøð 	0ð 	0ð 	0ð 	0õ& �S‰zŒzÐs+   ÁEÁ&CEÄ4EÅEÅEÅE#Å&E#r€  ç333333Ã?rV   rX   Úretry_intervalc                ót  — t          |dz   ¦  «        D ]¤}|dk    r-|                      d|› d�¦  «         t          j        |¦  «         |                      |¦  «         |                      |||¬¦  «        }|r@|                      d|                     ¦   «                              ¦   «         › �¦  «         |c S Œ¥d S )Nr|   r   u   [ä¸²å�£] ç¬¬ u    æ¬¡é‡�è¯•...)rø  rù  rú  u   [ä¸²å�£][RX] )Úrangeræ  rý  Úsleepr÷  r  rØ   r=   )	r    rV   rø  rù  rú  rX   r
  ÚattemptÚresps	            r!   ÚqueryzSerialPort.queryÝ  sÖ   € õ ˜W q™[Ñ)Ô)ð 
	ð 
	ˆGØ˜Š{ˆ{Ø—	’	Ð@¨'Ð@Ð@Ð@ÑAÔAÐAÝ”
˜>Ñ*Ô*Ð*Ø�IŠI�gÑÔÐØ—9’9¨,Ø&.Ø&.ð ñ 0ô 0ˆDð ð Ø—	’	Ð>¨$¯(ª(©*¬*×*:Ò*:Ñ*<Ô*<Ð>Ð>Ñ?Ô?Ð?Ø���ðð ˆtr#   c                óÈ   — |                       ¦   «         sd S | j        5  	 | j                             ¦   «          n# t          $ r Y nw xY wd d d ¦  «         d S # 1 swxY w Y   d S rd   )rà  rÛ  rØ  rä  rÂ  r   s    r!   Úclear_inputzSerialPort.clear_inputñ  s¿   € Ø�|Š|‰~Œ~ð 	ØˆFØŒZð 	ð 	ðØ”	×,Ò,Ñ.Ô.Ð.Ð.øÝð ð ð Ø�ðøøøð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s1   žA :¹Aº
AÁAÁAÁAÁAÁAç¸…ëQ¸ž?c                ó  — |                       ¦   «         sdS | j        5  	 | j        j        }|dk    r	 ddd¦  «         dS | j                             |¦  «        cddd¦  «         S # t
          $ r Y ddd¦  «         dS w xY w# 1 swxY w Y   dS )uy  
        æŠŠä¸²å�£è¾“å…¥ç¼“å†²åŒºé‡Œ**å·²ç»�åˆ°è¾¾**çš„å­—èŠ‚å…¨éƒ¨å�–èµ°å¹¶è¿”å›žï¼ˆé�žé˜»å¡žï¼Œä¸�ç­‰å¾…æ–°æ•°æ�®ï¼‰ã€‚

        ç”¨é€”ï¼šæ¯�æ¬¡ä¸‹å�‘ä»»åŠ¡å‰�å…ˆæŽ’ç©ºä¸Šä¸€æ¬¡äº¤äº’æ®‹ç•™çš„å¸§ â€”â€” å®ƒä»¬ä¼šè¢«å½“ä½œ"å½’å±žæœªçŸ¥"å¤„ç�†
        ï¼ˆæ­£å¸¸åº”ç­”è¿›ç¼“å­˜/è¡¥æŠ„ï¼›ä¸�å¸¦ DI çš„å¼‚å¸¸åº”ç­”ç›´æŽ¥ä¸¢å¼ƒï¼‰ï¼Œè€Œä¸�æ˜¯è¢«ä¸‹ä¸€ä¸ªä»»åŠ¡å�—è¯¯å�ƒã€‚
        r#   r   N)rà  rÛ  rØ  r   r  rÂ  )r    rú  rö  s      r!   ÚdrainzSerialPort.drainú  s#  € ð �|Š|‰~Œ~ð 	Ø�3ØŒZð 	ð 	ðØ”IÔ(�Ø˜’6�6Øð		ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð
 ”y—~’~ aÑ(Ô(ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	øõ ð ð ð Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ðøøøð	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s4   žB A&Á A&Á&
A?Á0BÁ>A?Á?BÂBÂ	Bc                óÐ   — t           j        t           j        t           j        t           j        t           j        dœ}| j        |vrt          d| j        › �¦  «        ‚|| j                 S )N)ÚNrÌ  ÚOÚMÚSu   ä¸�æ”¯æŒ�çš„æ ¡éªŒæ–¹å¼�: )rá  ÚPARITY_NONEÚPARITY_EVENÚ
PARITY_ODDÚPARITY_MARKÚPARITY_SPACErÑ  rÈ  )r    Úmappings     r!   rã  zSerialPort._parity_const  sa   € åÔ#ÝÔ#ÝÔ"ÝÔ#ÝÔ$ð
ð 
ˆð Œ;˜gÐ%Ð%Ý!Ð"L¸t¼{Ð"LÐ"LÑMÔMÐMØ�t”{Ô#Ð#r#   Úmsgc                ó6   — | j         rt          |¦  «         d S d S rd   )rÕ  Úprint©r    r!  s     r!   ræ  zSerialPort._log  s%   € ØŒ<ð 	Ý�#‰JŒJˆJˆJˆJð	ð 	r#   )rË  r2   rÌ  r|   rÍ  rÍ  T)rÎ  r   rÏ  r8   rÐ  r8   rÑ  r   rÒ  r8   r[  rÓ  rÔ  rÓ  rÕ  r/   ©r   rÜ  rq   rÅ   ©r   NN©rø  r8   rù  r}  rú  rû  r   r   )r   r€  Nr   r	  )rV   r   rø  r8   rù  r}  rú  rû  rX   r8   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  r  rã  ræ  r*   r#   r!   rÊ  rÊ  f  s_  € € € € € ðð ð "(Ø!"Ø"Ø!"Ø"%Ø(+Ø!%ð'ð 'ð 'ð 'ð 'ð2Nð Nð Nð Nð,=ð =ð =ð =ð;ð ;ð ;ð ;ðð ð ðð ð ð
<ð 
<ð 
<ð 
<ð "#Ø)-Ø)-ð#ð #ð #ð #ð #ðN #$Ø*1Ø*.ØØ&*ðð ð ð ð ð(ð ð ð ðð ð ð ð ð&
$ð 
$ð 
$ðð ð ð ð ð r#   rÊ  rž   ú Úsepc                ó@   — |                      d„ | D ¦   «         ¦  «        S )u"   å­—èŠ‚ â†’ ç©ºæ ¼åˆ†éš”çš„ HEX ä¸²c              3  ó   K  — | ]}|d ›V — Œ	dS )r=  Nr*   rª   s     r!   r€   zfmt_hex.<locals>.<genexpr>(  s&   è è € Ð-Ð- 1�q�J�JÐ-Ð-Ð-Ð-Ð-Ð-r#   )Újoin)r¢   r+  s     r!   Úfmt_hexr/  &  s#   € à�8Š8Ð-Ð-¨Ð-Ñ-Ô-Ñ-Ô-Ð-r#   c                 ó^   — t          j        ¦   «                              d¦  «        dd…         S )u-   æ¯«ç§’çº§æ—¶é—´æˆ³ï¼Œç”¨äºŽåŽŸå§‹æŠ¥æ–‡æ—¥å¿—z%Y-%m-%d %H:%M:%S.%fNéýÿÿÿ©r   ÚnowÚstrftimer*   r#   r!   Úfmt_tsr5  +  s&   € åŒ<‰>Œ>×"Ò"Ð#9Ñ:Ô:¸3¸B¸3Ô?Ð?r#   c                 ó^   — t          j        ¦   «                              d¦  «        dd…         S )u[   æ—¶:åˆ†:ç§’.æ¯«ç§’ï¼Œç”¨äºŽä¸»æ—¥å¿—é€�è¡Œå‰�ç¼€ï¼ˆä¾¿äºŽå’Œ raw_frames.txt å¯¹é½�æ—¶é—´ï¼‰z%H:%M:%S.%fNr1  r2  r*   r#   r!   Ú	fmt_clockr7  0  s%   € åŒ<‰>Œ>×"Ò" =Ñ1Ô1°#°2°#Ô6Ð6r#   ú    r,  Úindentú	List[str]c                óF	  — g }t          | ¦  «        dk     r|› dt          | ¦  «        › d�gS | dd…         }| d         }| d         }| dd|z   …         }| d|z            }t          | d	d|z   …         ¦  «        d
z  }	|rt          d„ |D ¦   «         ¦  «        n|}
|dz	  dz  rdnd}|dz  }dddœ                     |d¦  «        }|                     |› d|› dt          | ¦  «        › �¦  «         |                     |› d| d	         d›�¦  «         |                     |› dt          |¦  «        › d|ddd…                              ¦   «                              ¦   «         › �¦  «         |                     |› d| d         d›�¦  «         |                     |› d|d›d|dz	  dz  › d|dz	  dz  › d|d z	  dz  › d!|d›d"|› d#�¦  «         |                     |› d$|d›d%|› d&�¦  «         |                     |› d't          |¦  «        › �¦  «         |                     |› d(t          |
¦  «        › �¦  «         |rt          nt          }	 | 
                    | ¦  «        }n# t          $ r d}Y nw xY w|�¯|j        r¨|j        rV|j        �d)|j        d›d"|j        › �nd*}|j        rd%|j        › d#�nd+}|                     |› d,|j        › |› d-|› �¦  «         �nv|j        �*|                     |› d.|j        d›d"|j        › �¦  «         �nE|                     |› d/�¦  «         �n+|�Ú|j        rÓ|                     |› d0|j        › �|j        rd%|j        › d#�nd+z   ¦  «         |j        rt|                     |› d1t          |j        ¦  «        › d2t          |j        ¦  «        › d&�¦  «         |                     t)          |j        |j        |d3z   ¦  «        ¦  «         ns|j        d	k    r|                     |› d4�¦  «         nO|                     |› d5t          |
¦  «        › �¦  «         |�&|j        r|                     |› d6|j        › �¦  «         |                     |› d7|d›d8|	d›d9||	k    rd:nd;› �¦  «         |                     |› d<| d         d›d=t          | ¦  «        › d>�¦  «         |S )?u<   æŠŠä¸€å¸§ 645 æŠ¥æ–‡ï¼ˆä¸Šè¡Œ/ä¸‹è¡Œï¼‰æ‹†æˆ�é€�å­—æ®µè¯´æ˜Žr   u   <645 å¸§è¿‡çŸ­: ú>r|   r  r2   r×   rÞ   r   r¤   c              3  ó&   K  — | ]}|d z
  dz  V — ŒdS r¨   r*   rª   s     r!   r€   z%annotate_645_frame.<locals>.<genexpr>A  s+   è è € Ð5Ð5 q�!�d‘(˜dÑ"Ð5Ð5Ð5Ð5Ð5Ð5r#   u   ä¸Šè¡Œ(è¡¨â†’CCO)u   ä¸‹è¡Œ(CCOâ†’è¡¨)r  u	   è¯»æ•°æ�®u	   å†™æ•°æ�®)rš   r›   ú?u   â”Œ 645 æŠ¥æ–‡ [z]: u   â”‚ èµ·å§‹ç¬¦ 68   : r=  u   â”‚ è¡¨åœ°å�€ A0-A5: õ    â†’ Nr   u   â”‚ æŽ§åˆ¶ç � C    : ú (DIR=z ERR=r;   z FOLLOW=r�   z FUNC=0xr*  rC   u   â”‚ æ•°æ�®é•¿åº¦ L  : rB   u    å­—èŠ‚)u   â”‚ æ•°æ�®åŸŸ +33  : u   â”‚ æ•°æ�®åŸŸ -33  : u   é”™è¯¯ç � 0xu   æ— é”™è¯¯ç �r   u   â”‚ â˜… å¼‚å¸¸åº”ç­”  : DI=ú  u$   â”‚ â˜… å¼‚å¸¸åº”ç­”  : é”™è¯¯ç � 0xu$   â”‚ â˜… å¼‚å¸¸åº”ç­”  : æ— é”™è¯¯ç �u   â”‚ æ•°æ�®æ ‡è¯† DI : u   â”‚ æ•°æ�®å�—åŽŸå§‹  : z  (u   â”‚   u9   â”‚ æ•°æ�®å�—      : æ— ï¼ˆä¸‹è¡Œè¯»è¯·æ±‚ï¼Œä»…å¸¦ DIï¼‰u   â”‚ æ•°æ�®åŸŸ      : u   â”‚ è¯´æ˜Ž        : u   â”‚ æ ¡éªŒ CS     : õ	    (è®¡ç®— ú) rJ   õ   â˜…MISMATCHâ˜…u   â”” ç»“æ�Ÿç¬¦ 16   : õ      å¸§æ€»é•¿ rR  )r   r/  r‚   r   r”   ÚappendrØ   r=   Ú
_645_CODECÚ_645_CODEC_NO_PLUS33rþ   rÂ  r  r-   r
  r  rT   r   rñ   r  Ú_annotate_645_payloadr  )r,  rœ   r9  Úoutr   r¸   r¿   Údata_encrÂ   Úcs_calcr¢   r  r  Ú	func_nameÚcodecÚparsedÚcode_txtr;  s                     r!   Úannotate_645_framerQ  5  s,  € à€CÝ
ˆ5�z„z�B‚€ØÐ<Ð<­7°5©>¬>Ð<Ð<Ð<Ð=Ð=à��1�Œ:€DØ�Œ8€DØ�1ŒX€FØ�R˜˜V™�^Ô$€HØ	ˆr�F‰{Ô	€BÝ�%˜˜"˜v™+˜Ô&Ñ'Ô'¨$Ñ.€GØ9?ÐM�5Ð5Ð5¨HÐ5Ñ5Ô5Ñ5Ô5Ð5ÀX€Dà(,°©	°Q¡ÐOÐ#Ð#Ð<O€IØ�$‰;€DØ"¨+Ð6Ð6×:Ò:¸4ÀÑEÔE€Ià‡J‚J�&ÐHÐH¨)ÐHÐH½À¹¼ÐHÐHÑIÔIÐIØ‡J‚J�&Ð=Ð=¨u°Q¬xÐ=Ð=Ð=Ñ>Ô>Ð>Ø‡J‚J�&Ð]Ð]­w°t©}¬}Ð]Ð]À4ÈÈÈ"ÈÄ:Ç>Â>ÑCSÔCS×CYÒCYÑC[ÔC[Ð]Ð]Ñ^Ô^Ð^Ø‡J‚J�&Ð=Ð=¨u°Q¬xÐ=Ð=Ð=Ñ>Ô>Ð>Ø‡J‚J�&ð `ð `¨tÐQð `ð `ÀÈÁ	ÈQ¹ð `ð `Ø˜q‘y A‘oð`ð `Ø04¸±	¸Q©ð`ð `ØHLÐ_ð`ð `ØS\ð`ð `ð `ñ aô að aà‡J‚J�&ÐNÐN°ÐNÐNÐN¸fÐNÐNÐNÑOÔOÐOØ‡J‚J�&ÐBÐB­w°xÑ/@Ô/@ÐBÐBÑCÔCÐCØ‡J‚J�&Ð>Ð>­w°t©}¬}Ð>Ð>Ñ?Ô?Ð?ð !Ð:�JˆJÕ&:€EðØ—’˜UÑ#Ô#ˆˆøÝð ð ð Øˆˆˆðøøøð Ð˜fÔ6ÐØŒ9ð 		Hà!Ô,Ð8ð S vÔ'8ÐRÐRÐR¸vÔ?PÐRÐRÐRØ>Lð à-3¬^ÐCÐ)˜œÐ)Ð)Ð)Ð)ÀˆDØ�JŠJ˜&ÐZÐZ¸V¼YÐZÈÐZÐZÐPXÐZÐZÑ[Ô[Ð[Ñ[ØÔÐ*Ø�JŠJ˜&ð .ð .ÀfÔFWÐ^ð .ð .Ø Ô+ð.ð .ñ /ô /ð /ñ /ð �JŠJ˜&ÐFÐFÐFÑGÔGÐGÑGØ	Ð	 ¤Ð	Ø�
Š
�fÐ?Ð?°F´IÐ?Ð?Ø06´ÐFÐ,˜6œ>Ð,Ð,Ð,Ð,ÀBñHñ 	Iô 	Ið 	IàŒ>ð 	]Ø�JŠJ˜&ð 9ð 9½ÀÄÑ9PÔ9Pð 9ð 9Ý˜vœ~Ñ.Ô.ð9ð 9ð 9ñ :ô :ð :à�JŠJÕ,¨V¬Y¸¼ÈÐQYÑHYÑZÔZÑ[Ô[Ð[Ð[ØÔ Ò"Ð"Ø�JŠJ˜&Ð[Ð[Ð[Ñ\Ô\Ð\øà�
Š
�fÐBÐBµ7¸4±=´=ÐBÐBÑCÔCÐCØÐ &Ô"3ÐØ�JŠJ˜&ÐIÐI°fÔ6GÐIÐIÑJÔJÐJà‡J‚J�&Ð{Ð{¨bÐ{Ð{Ð{¸wÐ{Ð{Ð{ÐVXÐ\cÒVcÐVcÈdÈdÐiyÐ{Ð{Ñ|Ô|Ð|Ø‡J‚J�&Ð^Ð^¨u°R¬yÐ^Ð^Ð^Í3ÈuÉ:Ì:Ð^Ð^Ð^Ñ_Ô_Ð_Ø€Js   ÉI ÉI&É%I&r-   rñ   Úindc                óÎ  — g }|s|S |                       d¦  «        �rDt          |¦  «        dk     r*|                     |› dt          |¦  «        › d�¦  «         |S t                               |¦  «        }|€*|                     |› dt          |¦  «        › d�¦  «         |S |                     |› d�¦  «         |                     |› dt          |dd	…         ¦  «        › d
|j        › �¦  «         |                     |› dt          |d	d…         ¦  «        › d|j        › d�¦  «         |                     |› dt          |dd…         ¦  «        › d|j        › d�¦  «         |S |  	                    d¦  «        rH|                     |› dt          |¦  «        › dt          t          |¦  «        d¦  «        › d�¦  «         |S |                     |› dt          |¦  «        › �¦  «         |S )u4   æŒ‰ DI æ‹†è§£æ•°æ�®å�—ï¼ˆå†»ç»“å�—é€�å­—æ®µå±•å¼€ï¼‰r.  r<   u   â˜… å†»ç»“å�—é•¿åº¦ä¸�è¶³ï¼šu    å­—èŠ‚ï¼ˆåº”ä¸º 16ï¼‰NuM   å†»ç»“å�— 16B å¸ƒå±€ = æ—¶é—´[0:6] + æ­£å�‘æœ‰åŠŸ[6:11] + å��å�‘æœ‰åŠŸ[11:16]u     æ—¶é—´  6B : r   r;   u      â†’ u     æ­£å�‘  5B : ró   r?  ú kWhu     å��å�‘  5B : r/  u   ç”µèƒ½å€¼    : rô   u   åŽŸå§‹å€¼    : )r2  r   rF  rí   rþ   r/  ri   rk   rm   r3  ræ   rÜ   )r-   rñ   rR  Úlinesr6  s        r!   rI  rI  y  s,  € à€EØð Øˆà	‡}‚}�XÑÔñ Ýˆw‰<Œ<˜"ÒÐØ�LŠL˜CÐaÐa½SÀ¹\¼\ÐaÐaÐaÑbÔbÐbØˆLÝ×!Ò! 'Ñ*Ô*ˆØˆ=Ø�LŠL˜CÐaÐa½SÀ¹\¼\ÐaÐaÐaÑbÔbÐbØˆLØ�Š˜ÐjÐjÐjÑkÔkÐkØ�Š˜Ð]Ð]­G°G¸A¸a¸C´LÑ,AÔ,AÐ]Ð]È%ÔJ[Ð]Ð]Ñ^Ô^Ð^Ø�Š˜Ð]Ð]­G°G¸A¸b¸D´MÑ,BÔ,BÐ]Ð]ÈÌÐ]Ð]Ð]Ñ^Ô^Ð^Ø�Š˜Ð]Ð]­G°G¸B¸r¸E´NÑ,CÔ,CÐ]Ð]È%Ì-Ð]Ð]Ð]Ñ^Ô^Ð^Øˆà	‡{‚{�6ÑÔð Ø�Š˜ð Dð D­G°GÑ,<Ô,<ð Dð DÝ%¥j°Ñ&9Ô&9¸1Ñ=Ô=ðDð Dð Dñ 	Eô 	Eð 	Eàˆà	‡L‚L�CÐ:Ð:­°Ñ(8Ô(8Ð:Ð:Ñ;Ô;Ð;Ø€Lr#   r¿  c                óì
  — g }t          | ¦  «        dk     r|› dt          | ¦  «        › d�gS t                               | dd…         d¦  «        }| d         }|dz	  dz  |dz	  dz  |dz	  dz  |d	z  f\  }}}}	|d
k    rdn	|d
k    rdnd}
|                     |› d|
› dt          | ¦  «        › �¦  «         |                     |› d| d
         d›�¦  «         |                     |› dt          | dd…         ¦  «        › d|› dt          | ¦  «        › d|t          | ¦  «        k    rdnd› �	¦  «         |                     |› d|d›d|› d|› d|› d|	› d�¦  «         |d
k    r�|                     |› dt          | dd …         ¦  «        › �¦  «         |                     |› d!| d          d›d"t          | d#d …         ¦  «        d$z  d›d�¦  «         |                     |› d%| d&         d›�¦  «         |S t          | ¦  «        d'k     r*|                     |› d(t          | ¦  «        › d)�¦  «         |S |d
k    }| dd*…         | d*d+…         }}| d+         | d,         | d-d.…         }}}t                               | d.d/…         d¦  «        }|rd| d/         t                               | d0d1…         d¦  «        }}| d1         }| d2d2|z   …         }| d2|z            }| d3|z            }| dd2|z   …         }n8| d/         }| d0d0|z   …         }| d0|z            }| d'|z            }| dd0|z   …         }|t          |¦  «        z   d$z  }|                     |› d4t          |¦  «        › d5|d#d#d&…                              ¦   «                              ¦   «         › �¦  «         |                     |› d6t          |¦  «        › d5|d#d#d&…                              ¦   «                              ¦   «         › �¦  «         |                     |› d7|d›d8|d›�¦  «         |                     |› d9|                     ¦   «                              ¦   «         › �¦  «         |                     |› d:|d;›d<|› d=�¦  «         |r|                     |› d>|d›d?|› �¦  «         |                     |› d@|› �¦  «         |                     |› d!|d›d"|d›dA||k    rdnd› �¦  «         |                     |› d%|d›dBt          | ¦  «        › dC�¦  «         |r…|d#d…         dDk    rN|d&d#…         dEk    r@|                     |› dF�¦  «         |                     t          ||dGz   ¬H¦  «        ¦  «         n)|r'|                     |› dIt          |¦  «        › �¦  «         |S )Ju@  
    æŠŠä¸€å¸§å�—ç½‘é›†ä¸­å™¨æœ¬åœ°è§„çº¦æŠ¥æ–‡æ‹†æˆ�é€�å­—æ®µè¯´æ˜Žï¼š
        ä¸‹è¡Œè¯·æ±‚å¸§(DIR=0,PRM=1)ï¼šASRC ADST AFN SEQ DUID TaskID Prio Timeout InnerLen Inner
        ä¸Šè¡Œä¸šåŠ¡å¸§(DIR=1,PRM=1)ï¼šASRC ADST AFN SEQ DUID TaskID           InnerLen Inner
        ç¡®è®¤å¸§    (PRM=0)      ï¼šä»…åŸºæœ¬å­—æ®µ
    r;   u   <æœ¬åœ°è§„çº¦å¸§è¿‡çŸ­: r<  r|   rõ   r]  r  r�   rÖ   r   u	   ç¡®è®¤å¸§u   ä¸‹è¡Œè¯·æ±‚å¸§u   ä¸Šè¡Œä¸šåŠ¡å¸§u   â”Œ æœ¬åœ°è§„çº¦Â·rß  u   â”‚ èµ·å§‹ç¬¦ 68 : r=  u   â”‚ é•¿åº¦ L    : u    (å°�ç«¯) â†’ u
      å¸§é•¿ r*  rJ   rD  u   â”‚ æŽ§åˆ¶ç � C  : r@  z PRM=z ADD=z VER=rC   u   â”‚ ç”¨æˆ·æ•°æ�®  : rÕ   éþÿÿÿu   â”‚ æ ¡éªŒ CS   : rB  Nr¤   u   â”” ç»“æ�Ÿç¬¦ 16 : r   rŽ  u   â”” <å¸§è¿‡çŸ­: u    å­—èŠ‚>rÞ   r<   rš   r‘  r™   r�  r�  é   é   é   u   â”‚ ASRC æº�   : r?  u   â”‚ ADST ç›®   : u   â”‚ AFN / SEQ : z / u   â”‚ DUID      : u   â”‚ TaskID    : 0xÚ04XrB   uF   ) â€”â€” æµ�æ°´å�·ï¼Œæ¨¡å�—åŽŸæ ·å›žæ˜¾ï¼Œä¸Žã€Œä¸Šxæ¬¡ã€�ç¼–å�·æ— å…³u   â”‚ ä¼˜å…ˆçº§/è¶…æ—¶: PrioResp=z	 Timeout=u   â”‚ å†…å±‚é•¿åº¦  : rC  rE  rR  r  r€  u>     â–¼ å†…å±‚ 645 æŠ¥æ–‡ï¼ˆæŸ¥è¡¨å½’å±žèº«ä»½å�–è¿™é‡Œçš„ DIï¼‰rA  )r9  u     â–¼ å†…å±‚é�ž 645 æ•°æ�®: )
r   r/  r8   r’  rF  r‚   rØ   r=   r  rQ  )r,  r9  r¿  rJ  rh  r¸   ÚDIRÚPRMÚADDÚVERr  ÚdownrI  rL  rn  r9   ro  rY  Úprior[  r“  rp  rÂ   r  rc  rL  s                             r!   rÁ  rÁ  –  s­  € ð €CÝ
ˆ5�z„z�A‚~€~ØÐDÐDµ7¸5±>´>ÐDÐDÐDÐEÐEå�Š�u˜Q˜q˜S”z 8Ñ,Ô,€AØ�Œ8€DØ !™) q™¨4°1©9¸©/¸DÀA¹IÈ¹?ÈDÐSWÉKÐWÑ€Cˆˆc�3Ø š(˜(ˆ;ˆ;¸cÀQºh¸hÐ):Ð):ÐL]€Dà‡J‚J�&ÐDÐD¨DÐDÐDµG¸E±N´NÐDÐDÑEÔEÐEØ‡J‚J�&Ð;Ð;¨U°1¬XÐ;Ð;Ð;Ñ<Ô<Ð<Ø‡J‚J�&ð Vð V­G°E¸!¸A¸#´JÑ,?Ô,?ð Vð VÈqð Vð VÝ˜U™œðVð VØ./µ3°u±:´:ªo¨o d dÐCSðVð Vñ Wô Wð Wà‡J‚J�&ÐaÐa¨TÐaÐaÐa¸SÐaÐaÀsÐaÐaÐQTÐaÐaÐ[^ÐaÐaÐaÑbÔbÐbð ˆa‚x€xØ�
Š
�fÐHÐHµ'¸%ÀÀ"À¼+Ñ2FÔ2FÐHÐHÑIÔIÐIØ�
Š
�fÐeÐe°°b´	ÐeÐeÐeÍÈEÐRUÐSUÐRUÌJÉÌÐZ^ÑH^ÐeÐeÐeÐeÑfÔfÐfØ�
Š
�fÐ@Ð@°°r´Ð@Ð@Ð@ÑAÔAÐAØˆ
å
ˆ5�z„z�B‚€Ø�
Š
�fÐBÐB­c°%©j¬jÐBÐBÐBÑCÔCÐCØˆ
à�1ŠH€DØ�q˜�t”˜e B r Eœlˆ$€DØ˜2”Y  b¤	¨5°°B°¬<ˆdˆ€CÝ�nŠn˜U 2 b 5œ\¨8Ñ4Ô4€Gàð ,Ø˜bœ	¥3§>¢>°%¸¸2¸´,ÀÑ#IÔ#IˆgˆØ˜"”Iˆ	Ø�b˜˜i™Ð'Ô(ˆØ�2˜	‘>Ô"ˆØ�B˜‘NÔ#ˆØ˜!˜B ™NÐ*Ô+ˆ	ˆ	à˜"”Iˆ	Ø�b˜˜i™Ð'Ô(ˆØ�2˜	‘>Ô"ˆØ�B˜‘NÔ#ˆØ˜!˜B ™NÐ*Ô+ˆ	à•c˜)‘n”nÑ$¨Ñ,€Gà‡J‚J�&ÐYÐY­7°4©=¬=ÐYÐY¸tÀDÀDÀbÀD¼z¿~º~Ñ?OÔ?O×?UÒ?UÑ?WÔ?WÐYÐYÑZÔZÐZØ‡J‚J�&ÐYÐY­7°4©=¬=ÐYÐY¸tÀDÀDÀbÀD¼z¿~º~Ñ?OÔ?O×?UÒ?UÑ?WÔ?WÐYÐYÑZÔZÐZØ‡J‚J�&Ð?Ð?¨#Ð?Ð?Ð?°cÐ?Ð?Ð?Ñ@Ô@Ð@Ø‡J‚J�&Ð>Ð>¨$¯(ª(©*¬*×*:Ò*:Ñ*<Ô*<Ð>Ð>Ñ?Ô?Ð?Ø‡J‚J�&ð /ð /¨GÐnð /ð /¸7ð /ð /ð /ñ 0ô 0ð 0àð [Ø�
Š
�fÐYÐY¸TÐYÐYÐYÐPWÐYÐYÑZÔZÐZØ‡J‚J�&Ð9Ð9¨iÐ9Ð9Ñ:Ô:Ð:Ø‡J‚J�&ÐyÐy¨BÐyÐyÐy¸WÐyÐyÐyÐTVÐZaÒTaÐTaÈDÈDÐgwÐyÐyÑzÔzÐzØ‡J‚J�&ÐVÐV¨SÐVÐVÐVÅ3ÀuÁ:Ä:ÐVÐVÐVÑWÔWÐWàð PØ��!�Œ9˜ÒÐ E¨"¨#¨#¤J°'Ò$9Ð$9Ø�JŠJ˜&Ð`Ð`Ð`ÑaÔaÐaØ�JŠJÕ)¨%¸À¹ÐFÑFÔFÑGÔGÐGÐGØð 	PØ�JŠJ˜&ÐNÐN½gÀe¹n¼nÐNÐNÑOÔOÐOØ€Jr#   c                óp   — 	 t          t          | dd…         d¦  «        ¦  «        S # t          $ r Y dS w xY w)u4   0504FFxx â†’ ç¬¬å‡ æ¬¡ï¼ˆå­—ç¬¦ä¸²ï¼Œä»…æ—¥å¿—ç”¨ï¼‰r;   r2   r<   r>  )r   r8   rÂ  )r-   s    r!   Ú_di_xrc  á  sI   € ðÝ•3�r˜!˜A˜#”w Ñ#Ô#Ñ$Ô$Ð$øÝð ð ð Øˆsˆsðøøøs   ‚$' §
5´5Úouterc                óð   — 	 | d         }| dd|z   …         }|dd…         }t          d„ |D ¦   «         ¦  «        ddd…                              ¦   «                              ¦   «         S # t          $ r Y dS w xY w)	uG   ä»Žä¸‹è¡Œæœ¬åœ°è§„çº¦å¸§é‡Œçª¥æŽ¢å†…å±‚ 645 çš„ DIï¼ˆä»…ç”¨äºŽæ—¥å¿—ï¼‰rX  rY  rÞ   é   c              3  ó&   K  — | ]}|d z
  dz  V — ŒdS r¨   r*   rª   s     r!   r€   z_peek_di.<locals>.<genexpr>ï  s+   è è € Ð7Ð7¨1�a˜$‘h $Ñ&Ð7Ð7Ð7Ð7Ð7Ð7r#   Nr   r>  ©r   rØ   r=   rÂ  )rd  r“  rp  Údi_encs       r!   Ú_peek_dirj  é  s’   € ðØ˜"”Iˆ	Ø�b˜˜i™Ð'Ô(ˆØ�r˜"�u”ˆÝÐ7Ð7°Ð7Ñ7Ô7Ñ7Ô7¸¸¸"¸Ô=×AÒAÑCÔC×IÒIÑKÔKÐKøÝð ð ð Øˆsˆsðøøøs   ‚A$A' Á'
A5Á4A5r]   c                ó,  — 	 | d         dz  r| d         dz
  dz  }d|d›d�S | d	         }t          d
„ | dd|z   …         D ¦   «         ¦  «        }|dd…         ddd…                              ¦   «                              ¦   «         S # t          $ r Y dS w xY w)uI   ä»Žä¸Šè¡Œ 645 å¸§é‡Œçª¥æŽ¢ DIï¼ˆé”™è¯¯å¸§ä¼šè¿”å›ž ?ï¼Œä»…ç”¨äºŽæ—¥å¿—ï¼‰r2   é@   rÞ   r©   r¤   u   <å¼‚å¸¸åº”ç­” 0xr=  r<  r×   c              3  ó&   K  — | ]}|d z
  dz  V — ŒdS r¨   r*   rª   s     r!   r€   z_peek_di_up.<locals>.<genexpr>û  s+   è è € ÐJÐJ¨1�a˜$‘h $Ñ&ÐJÐJÐJÐJÐJÐJr#   r   rÕ   Nr   r>  rh  )r]   r5  r¿   r¢   s       r!   Ú_peek_di_uprn  ô  sÃ   € ðØ�QŒ<˜$Ñð 	2Ø˜b”M DÑ(¨DÑ0ˆDØ1 dÐ1Ð1Ð1Ð1Ð1Ø˜1”ˆÝÐJÐJ°	¸"¸RÀ&¹[¸.Ô0IÐJÑJÔJÑJÔJˆØ�A�a�CŒy˜˜˜2˜Œ×"Ò"Ñ$Ô$×*Ò*Ñ,Ô,Ð,øÝð ð ð Øˆsˆsðøøøs   ‚B ¢A"B Â
BÂBc                  ó  — e Zd ZU dZdZded<   dZded<   dZded<   dZded	<   d
Z	ded<   d
Z
ded<   dZded<    eed
¬¦  «        Zded<    eej        d
¬¦  «        Zded<   d+d„Zd,d„Zd-d.d„Zd/d!„Zd-d0d&„Zd-d1d)„Zd2d*„ZdS )3r·  u«  
    å››ä»½æ–‡æœ¬æ—¥å¿—çš„å‡ºå�£ï¼ˆæŒ‰è·¯å¾„å¤�ç”¨å�¥æŸ„ï¼Œä¸�å†�æ¯�è¡Œ open/closeï¼‰ã€‚

        flow()   ä¸»æ—¥å¿—ï¼šæµ�ç¨‹ + é€�å­—æ®µæŠ¥æ–‡è§£æž�ï¼ˆæ–‡ä»¶é‡Œé€�è¡Œå¸¦æ¯«ç§’æ—¶é—´æˆ³ï¼ŒæŽ§åˆ¶å�°ä¸�åŠ å‰�ç¼€ï¼‰
        block()  é€�å­—æ®µæŠ¥æ–‡è§£æž�å�—ï¼ˆå�—å¤´è‡ªå¸¦å®Œæ•´æ—¶é—´æˆ³ï¼‰
        raw()    åŽŸå§‹æŠ¥æ–‡æµ�æ°´ï¼šä¸€è¡Œä¸€å¸§ï¼Œä¾¿äºŽå’ŒæŠ“åŒ…å·¥å…·æ¯”å¯¹
        freeze() å†»ç»“æ•°æ�®å�—æ˜Žç»†ï¼šä¸€è¡Œä¸€å�—
    NúOptional[str]Úlog_pathÚraw_log_pathÚfreeze_log_pathTr/   Údump_framesFÚdump_consoleÚraw_consolerÕ  )ru   ÚreprzDict[str, TextIO]Ú_handleszthreading.RLockrÛ  Úpathr   r   r   c                óv   — | j                              |¦  «        }|€t          |dd¬¦  «        }|| j         |<   |S )NÚazutf-8)Úencoding)rx  r”   rç  )r    ry  Úfps      r!   Ú_handlezLogSink._handle  sA   € ØŒ]×Ò˜tÑ$Ô$ˆØˆ:Ý�d˜C¨'Ð2Ñ2Ô2ˆBØ"$ˆDŒM˜$ÑØˆ	r#   ÚlinerÜ  c                óÐ   — |sd S | j         5  |                      |¦  «        }|                     |dz   ¦  «         |                     ¦   «          d d d ¦  «         d S # 1 swxY w Y   d S )Nú
)rÛ  r~  rô  rõ  )r    ry  r  r}  s       r!   Ú_appendzLogSink._append%  s¯   € Øð 	ØˆFØŒZð 	ð 	Ø—’˜dÑ#Ô#ˆBØ�HŠH�T˜D‘[Ñ!Ô!Ð!Ø�HŠH‰JŒJˆJð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ŒAAÁAÁ"Ar   r!  c                ó¦   — | j         rt          |¦  «         | j        r3|                      | j        |rdt	          ¦   «         › d|› �nd¦  «         dS dS )u   ä¸»æ—¥å¿—ï¼ˆäººå�¯è¯»æµ�ç¨‹ï¼‰ú[ú] r   N)rÕ  r#  rq  r‚  r7  r$  s     r!   rÀ  zLogSink.flow-  si   € àŒ<ð 	Ý�#‰JŒJˆJØŒ=ð 	QØ�LŠL˜œÀCÐ(OÐ(@­I©K¬KÐ(@Ð(@¸3Ð(@Ð(@Ð(@ÈRÑPÔPÐPÐPÐPð	Qð 	Qr#   ÚtitlerU  úSequence[str]c                ó   — | j         sdS t          ¦   «         › d|› �gt          |¦  «        z   }| j        r.|                      | j        d                     |¦  «        ¦  «         | j        r$t          d                     |¦  «        ¦  «         dS dS )u   é€�å­—æ®µæŠ¥æ–‡è§£æž�å�—Nú | r�  )rt  r5  r‡   rq  r‚  r.  ru  r#  )r    r†  rU  r6  s       r!   r6  zLogSink.block4  s˜   € àÔð 	ØˆFÝ‘H”HÐ(Ð( Ð(Ð(Ð)­D°©K¬KÑ7ˆØŒ=ð 	:Ø�LŠL˜œ¨¯	ª	°%Ñ(8Ô(8Ñ9Ô9Ð9ØÔð 	$Ý�$—)’)˜EÑ"Ô"Ñ#Ô#Ð#Ð#Ð#ð	$ð 	$r#   Útagr,  r   r\   c                óì   — t          ¦   «         › d|d›dt          |¦  «        d›d|d›dt          |¦  «        › �	}| j        r|                      | j        |¦  «         | j        rt          |¦  «         dS dS )u!   åŽŸå§‹æŠ¥æ–‡æµ�æ°´ï¼šä¸€è¡Œä¸€å¸§r‰  z<10z | len=z<3z<44N)r5  r   r/  rr  r‚  rv  r#  )r    rŠ  r,  r\   r  s        r!   ro   zLogSink.raw>  s¢   € å‘8”8ð 1ð 1 ÐBð 1ð 1µ°E±
´
ÐBð 1ð 1ØÐ0ð1ð 1Ý '¨¡¤ð1ð 1ˆàÔð 	2Ø�LŠL˜Ô*¨DÑ1Ô1Ð1ØÔð 	Ý�$‰KŒKˆKˆKˆKð	ð 	r#   r   rR   c                ó  — | j         sdS |j        }d}t          |¦  «        dk    rKdt          |dd…         ¦  «        › dt          |dd…         ¦  «        › d	t          |dd…         ¦  «        › d
�}|j        dd…         }|j        j        |rd|› d�ndz   }t          ¦   «         › d|j        › d|rt          |d¦  «        nd› d|j        › d|› d|j
        pd› d|j        pd› d|j        pd› d|pd› �}|                      | j         |¦  «         dS )uß   
        å†»ç»“æ•°æ�®å�—æ˜Žç»†ï¼šä¸€è¡Œä¸€å�—ï¼ˆæ—¶é—´ + æ­£å��å�‘ + åŽŸå§‹å­—èŠ‚ï¼‰ã€‚
        tag é�žç©ºæ—¶åœ¨çŠ¶æ€�å�Žè¿½åŠ æ ‡è®°ï¼Œä¾‹å¦‚ã€Œè¡¥æŠ„ã€�â€”â€”è¡¨ç¤ºè¯¥è¡Œæ˜¯è¿Ÿåˆ°åº”ç­”å›žå¡«å�Žçš„æœ€ç»ˆç»“æžœã€‚
        Nr   r<   u   æ—¶é—´[r   r;   u   ] æ­£[ró   u   ] å��[ú]r2   ú(rC   u    | è¡¨=u    | ä¸Šr>  u	   æ¬¡ | DI=u
    | çŠ¶æ€�=r‰  ú-u
    | æ­£å�‘=u   kWh | å��å�‘=zkWh | )rs  rp   r   r/  r-   rU   r.   r5  rS   r8   ri   rk   rm   r‚  )r    r   rŠ  ÚblkÚsegÚxrU   r  s           r!   ra   zLogSink.freezeG  s˜  € ð
 Ô#ð 	ØˆFØŒnˆØˆÝˆs‰8Œ8�rŠ>ˆ>ð1�W S¨¨1¨¤XÑ.Ô.ð 1ð 1µg¸cÀ!ÀBÀ$¼iÑ6HÔ6Hð 1ð 1Ý! # b¨ e¤*Ñ-Ô-ð1ð 1ð 1ˆCàŒD��1�ŒIˆØ””°Ð#< : s : : : :¸"Ñ=ˆÝ‘8”8ð _ð _ A¤Lð _ð _ÀaÐ8P½¸A¸r¹
¼
¸
ÈSð _ð _Ø”dð_ð _Ø&,ð_ð _Ø12´Ð1EÀ#ð_ð _àœ*Ð+¨ð_ð _à:;¼)Ð:JÀsð_ð _àRUÐR\ÐY\ð_ð _ˆð 	�Š�TÔ)¨4Ñ0Ô0Ð0Ð0Ð0r#   c                óú   — | j         5  | j                             ¦   «         D ]'}	 |                     ¦   «          Œ# t          $ r Y Œ$w xY w| j                             ¦   «          d d d ¦  «         d S # 1 swxY w Y   d S rd   )rÛ  rx  Úvaluesré  rÂ  Úclear)r    r}  s     r!   ré  zLogSink.closeZ  sÓ   € ØŒZð 	"ð 	"Ø”m×*Ò*Ñ,Ô,ð ð �ðØ—H’H‘J”J�J�JøÝ ð ð ð Ø�DðøøøàŒM×ÒÑ!Ô!Ð!ð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"s1   ˆA0¥:¹A0º
AÁA0ÁAÁA0Á0A4Á7A4)ry  r   r   r   )ry  rp  r  r   r   rÜ  ©r   )r!  r   r   rÜ  )r†  r   rU  r‡  r   rÜ  )rŠ  r   r,  r   r\   r   r   rÜ  )r   rR   rŠ  r   r   rÜ  r%  )r%   r&   r'   r(   rq  r)   rr  rs  rt  ru  rv  rÕ  r   r0  rx  rÙ  rÚ  rÛ  r~  r‚  rÀ  r6  ro   ra   ré  r*   r#   r!   r·  r·  	  s{  € € € € € € ðð ð #€HÐ"Ð"Ð"Ñ"Ø"&€LÐ&Ð&Ð&Ñ&Ø%)€OÐ)Ð)Ð)Ñ)Ø€KÐÐÐÑØ€LÐÐÐÑØ€KÐÐÐÑØ€GÐÐÐÑà"' %¸À5Ð"IÑ"IÔ"I€HÐIÐIÐIÑIØ"˜U°9´?ÈÐOÑOÔO€EÐOÐOÐOÑOðð ð ð ðð ð ð ðQð Qð Qð Qð Qð$ð $ð $ð $ðð ð ð ð ð1ð 1ð 1ð 1ð 1ð&"ð "ð "ð "ð "ð "r#   r·  c                  ó,   — e Zd ZdZg d¢Zddd„Zdd„ZdS )Ú	CsvWriteru*  
    ä¸šåŠ¡æ•°æ�®è¡¨ï¼ˆé€—å�·åˆ†éš”ï¼‰ã€‚é¦–æ¬¡åˆ›å»ºæ—¶å†™è¡¨å¤´ï¼›utf-8-sig ä¾¿äºŽ Excel/WPS ç›´æŽ¥æ‰“å¼€ã€‚

    æ³¨æ„�ï¼š**å�ªåœ¨ä¼šè¯�æ”¶å°¾æ—¶å†™**ï¼ˆrun() é‡Œï¼Œç­‰æœ€å�Žä¸€è½®è¡¥æŠ„å›žå¡«å®Œï¼‰ï¼Œ
    è¿™æ ·ã€Œæ—¥å¿—å†™ç�€è¡¥æŠ„æˆ�åŠŸã€�CSV é‡Œè¿˜æ˜¯ NO_RESPã€�çš„çŸ›ç›¾ä¸�ä¼šå‡ºçŽ°ã€‚
    )u   è¡¨å�·u   è¡¨å��u   åº�å�·ÚDIu	   æ•°æ�®é¡¹u   çŠ¶æ€�u   å†»ç»“æ—¶é—´u   æ­£å�‘æœ‰åŠŸ(kWh)u   å��å�‘æœ‰åŠŸ(kWh)u   æ•°å€¼u   é‡�è¯•u	   é”™è¯¯ç �u   é”™è¯¯ä¿¡æ�¯u   645åº”ç­”æŠ¥æ–‡u   å†»ç»“å�—åŽŸå§‹æ•°æ�®(16B)Nry  rp  c                ó   — || _         d S rd   )ry  )r    ry  s     r!   r    zCsvWriter.__init__q  s   € ØˆŒ	ˆ	ˆ	r#   Úreportrs   r   rÜ  c                ó²  — | j         sd S t          j                              | j         ¦  «         }t          | j         ddd¬¦  «        5 }t	          j        |¦  «        }|r|                     | j        ¦  «         |j        D ]¾}|                     |j	        |j
        j        |j        |j        |j        |j        j        |j        |j        |j        |j        t(          j        u r|j        nd|j        |j        �d|j        d›�nd|j        p|j        t5          |j        ¦  «        t5          |j        ¦  «        g¦  «         Œ¿	 d d d ¦  «         d S # 1 swxY w Y   d S )Nr{  r   z	utf-8-sig)Únewliner|  Ú0xr=  )ry  ÚosÚexistsrç  ÚcsvÚwriterÚwriterowÚHEADERrv   rS   r6   r   r9   r-   rT   rU   r.   ri   rk   rm   rI   rJ   rX   rZ   r[   r\   r/  r]   rp   )r    r›  Únew_fileÚfÚwr   s         r!   rô  zCsvWriter.writet  s‹  € ØŒyð 	ØˆFÝ”w—~’~ d¤iÑ0Ô0Ð0ˆÝ�$”)˜S¨"°{ÐCÑCÔCð 	ÀqÝ”
˜1‘”ˆAØð (Ø—
’
˜4œ;Ñ'Ô'Ð'Ø”^ð 	ð 	�Ø—
’
Ø”L &¤,Ô":¸A¼EÀ1Ä4ÈÌØ”H”N A¤M°1´:¸q¼yØ œx­:¬=Ð8Ð8�A”G�G¸bØ”IØ-.¬ZÐ-CÐ)˜œÐ)Ð)Ð)Ð)ÈØ”JÐ( !¤&Ý˜AœKÑ(Ô(­'°!´.Ñ*AÔ*Aðñ ô ð ð ð	ð		ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ÁC7EÅEÅErd   )ry  rp  )r›  rs   r   rÜ  )r%   r&   r'   r(   r¤  r    rô  r*   r#   r!   r˜  r˜  d  s\   € € € € € ðð ð?ð ?ð ?€Fð
ð ð ð ð ðð ð ð ð ð r#   r˜  c                  óZ   — e Zd ZU dZdZded<   dZded<   dZded<   dZded<   dZ	d	ed
<   dS )ÚSessionStatsuJ   ä¼šè¯�çº§è®¡æ•°ï¼ˆv1 æ˜¯æ•£è�½åœ¨ä¼šè¯�ç±»é‡Œçš„ 5 ä¸ª int/å¸ƒå°”å±žæ€§ï¼‰r   r8   Ú	late_fillÚ
dup_framesÚ
cache_hitsÚ
ack_framesFr/   ÚinterruptedN)
r%   r&   r'   r(   rª  r)   r«  r¬  r­  r®  r*   r#   r!   r©  r©  ˆ  sm   € € € € € € àTÐTØ€IÐÐÐÑØ€JÐÐÐÑØ€JÐÐÐÑØ€JÐÐÐÑØ€KÐÐÐÑÐÐr#   r©  c                  ó:   — e Zd ZU dZded<   dZded<   dZded	<   dS )
ÚSplitResultu`   ä¸€æ¬¡åˆ†å¸§çš„ç»“æžœï¼›overflow é�žç©ºè¡¨ç¤ºæ®‹ç•™ç¼“å†²å¼‚å¸¸å¢žé•¿è¢«æˆªæ–­ï¼ˆä¾›è®°æ—¥å¿—ï¼‰zList[bytes]ÚframesNr}  Úoverflowr   r8   Úoverflow_len)r%   r&   r'   r(   r)   r²  r³  r*   r#   r!   r°  r°  ’  sF   € € € € € € àjÐjØÐÐÑØ $€HÐ$Ð$Ð$Ñ$Ø€LÐÐÐÑÐÐr#   r°  c                  óL   — e Zd ZU dZ ee¬¦  «        Zded<   dZded<   dd„Z	dS )ÚFrameSplitteruÖ   
    æŠŠä¸²å�£å­—èŠ‚æµ�åˆ‡æˆ�æœ¬åœ°è§„çº¦å¸§ï¼ˆ68H | L(2) | ... | 16Hï¼ŒL = æ•´å¸§é•¿åº¦ï¼‰ã€‚

    å°¾éƒ¨ä¸�å®Œæ•´çš„å¸§ç•™åœ¨ç¼“å†²é‡Œç­‰ä¸‹ä¸€æ‰¹å­—èŠ‚ï¼ˆv1 æ—©æœŸç‰ˆæœ¬ç›´æŽ¥ä¸¢å¼ƒï¼Œä¼šä¸¢å¸§/é”™å¸§ï¼‰ã€‚
    rt   rþ  Úresiduei   r8   ÚMAX_RESIDUEr  r   r   r°  c                ó”  — |r| j                              |¦  «         | j         }g }dt          |¦  «        }}||k     r“||         dk    r|dz  }Œ|dz   |k    rnwt                               ||dz   |dz   …         d¦  «        }|dk     r|dz  }ŒW||z   |k    rn8|                     t          ||||z   …         ¦  «        ¦  «         ||z  }||k     °“|d |…= t          |¦  «        | j        k    rMt          |d d…         ¦  «        }t          |¦  «        }|d t          |¦  «        dz
  …= t          |||¬	¦  «        S t          |¬
¦  «        S )Nr   r˜   r|   rõ   r]  r;   rl  i   )r±  r²  r³  )r±  )	r¶  r  r   r8   r’  rF  r   r·  r°  )	r    r  r  r±  Úirö  r¿   r²  r³  s	            r!   ÚfeedzFrameSplitter.feed¤  sl  € Øð 	'ØŒL×Ò Ñ&Ô&Ð&ØŒlˆØ ˆØ•#�c‘(”(ˆ1ˆØ�!ŠeˆeØ�1Œv˜Š~ˆ~Ø�Q‘�ØØ�1‰u�qŠyˆyØÝ—^’^ C¨¨A©¨a°!©e¨Ô$4°hÑ?Ô?ˆFØ˜ŠzˆzØ�Q‘�ØØ�6‰z˜AŠ~ˆ~ØØ�MŠM�%  A a¨&¡j LÔ 1Ñ2Ô2Ñ3Ô3Ð3Ø�‰KˆAð �!Šeˆeð ���ˆGÝˆs‰8Œ8�dÔ&Ò&Ð&Ý˜S  " œX‘”ˆHÝ˜s™8œ8ˆLØ�O•S˜‘X”X ‘^�OÐ$Ý f°xÈlÐ[Ñ[Ô[Ð[Ý &Ð)Ñ)Ô)Ð)r#   N)r  r   r   r°  )
r%   r&   r'   r(   r   rþ  r¶  r)   r·  rº  r*   r#   r!   rµ  rµ  š  se   € € € € € € ðð ð
 ˜¨yÐ9Ñ9Ô9€GÐ9Ð9Ð9Ñ9Ø€KÐÐÐÑð*ð *ð *ð *ð *ð *r#   rµ  c                  ó(   — e Zd ZdZ	 ddd„Zddd„ZdS )ÚAckResponderuT  
    å¯¹æ¨¡å�—çš„ä¸ŠæŠ¥æŠ¥æ–‡å›žç¡®è®¤å¸§ï¼šSEQ å¿…é¡»ä¸Žè¯¥ä¸ŠæŠ¥æŠ¥æ–‡å®Œå…¨ä¸€è‡´ï¼Œå�¦åˆ™æ¨¡å�—ä¼šä¸€ç›´é‡�ä¼ ã€‚

    åŽ»é‡�ï¼šå�Œä¸€ (æº�åœ°å�€, SEQ) åœ¨ dedup_window ç§’å†…å�ªç¡®è®¤ä¸€æ¬¡ â€”â€” å›žæ”¾é£Žæš´æ—¶å�Œä¸€å¸§
    ä¼šè¢«æˆ�æ‰¹å��å‡ºï¼Œé‡�å¤�ç¡®è®¤æ²¡æœ‰æ„�ä¹‰ï¼Œå�ªä¼šå� ç”¨æ€»çº¿æ—¶é—´ï¼ˆé»˜è®¤ 0 = æ¯�æ¬¡éƒ½å›žï¼‰ã€‚
    Tç        Ú	transportúOptional[Transport]Ústatsr©  r¶  r·  Úenabledr/   Údedup_windowrÓ  c                óZ   — || _         || _        || _        || _        || _        i | _        d S rd   )r¾  rÀ  r¶  rÁ  rÂ  Ú_sent)r    r¾  rÀ  r¶  rÁ  rÂ  s         r!   r    zAckResponder.__init__É  s3   € ð #ˆŒØˆŒ
ØˆŒ	ØˆŒØ(ˆÔØ35ˆŒ
ˆ
ˆ
r#   r   r9   r8   Úsrc_addrr   r   rÜ  c           	     ó0  — | j         r| j        €d S t          j        ¦   «         }|rt          |¦  «        nd|dz  f}| j                             |¦  «        }|�:||z
  | j        k     r,| j                             ddd|d›d| j        d›d	�¦  «         d S || j        |<   t          |¦  «        }	 | j         
                    |¦  «         nU# t          $ rH}| j                             d
|› d�¦  «         | j                             d|d|› �¦  «         Y d }~d S d }~ww xY w| j        xj        dz  c_        | j                             d|d›d|                     ¦   «                              ¦   «         › �¦  «         | j                             d|d|d›�¦  «         d S )Nr   r¤   z
TX-ACK-DUPr#   zSEQ=0xr=  u    å·²åœ¨ Úgu#   s å†…ç¡®è®¤è¿‡ï¼Œè·³è¿‡é‡�å¤�ç¡®è®¤u       Â· ç¡®è®¤å¸§å�‘é€�å¤±è´¥ï¼ˆu   ï¼‰ï¼Œç»§ç»­ç­‰å¾…æ•°æ�®å¸§z
TX-ACK-ERRu   ç¡®è®¤å¸§å�‘é€�å¤±è´¥: r|   u       â†’ å›žç¡®è®¤å¸§ï¼ˆSEQ=0xu    ä¸Žä¸ŠæŠ¥æŠ¥æ–‡ä¸€è‡´ï¼‰: zTX-ACKu   ç¡®è®¤æ¨¡å�—ä¸ŠæŠ¥æŠ¥æ–‡ SEQ=0x)rÁ  r¾  rý  Ú	norm_addrrÄ  r”   rÂ  r¶  ro   rŸ  r÷  rÂ  rÀ  rÀ  r­  rØ   r=   )r    r9   rÅ  r3  ÚkeyÚprevrÅ  rÄ  s           r!   rÅ  zAckResponder.ackÓ  sÖ  € ØŒ|ð 	˜tœ~Ð5ØˆFÝŒi‰kŒkˆØ&.Ð6�y˜Ñ"Ô"Ð"°B¸¸d¹
ÐCˆØŒz�~Š~˜cÑ"Ô"ˆØÐ  d¡
¨TÔ->Ò >Ð >ØŒI�MŠM˜,¨Øl 3ÐlÐlÐl°DÔ4EÐlÐlÐlÐlñnô nð nàˆFØˆŒ
�3‰Ý˜sÑ#Ô#ˆð	ØŒN×Ò Ñ$Ô$Ð$Ð$øÝð 	ð 	ð 	ØŒI�NŠNÐ[¸QÐ[Ð[Ð[Ñ\Ô\Ð\ØŒI�MŠM˜,¨Ð-JÀqÐ-JÐ-JÑKÔKÐKØˆFˆFˆFˆFˆFøøøøð	øøøð 	Œ
ÐÔ Ñ"ÐÔØŒ	�ŠÐn°sÐnÐnÐnÐ[^×[bÒ[bÑ[dÔ[d×[jÒ[jÑ[lÔ[lÐnÐnÑoÔoÐoØŒ	�Š�h Ð%PÀsÐ%PÐ%PÐ%PÑQÔQÐQÐQÐQs   Â,C Ã
DÃ=DÄDN)Tr½  )
r¾  r¿  rÀ  r©  r¶  r·  rÁ  r/   rÂ  rÓ  r–  )r9   r8   rÅ  r   r   rÜ  )r%   r&   r'   r(   r    rÅ  r*   r#   r!   r¼  r¼  Á  s]   € € € € € ðð ð >Að6ð 6ð 6ð 6ð 6ðRð Rð Rð Rð Rð Rð Rr#   r¼  r   c                óx   — | pd                      ¦   «                              ¦   «                              d¦  «        S )uk   è¡¨å�·è§„èŒƒåŒ–ï¼šåŽ»ç©ºç™½ã€�è½¬å¤§å†™ã€�å·¦è¡¥é›¶åˆ° 12 ä½�ï¼ˆv1 æ˜¯ FreezeReadSession çš„é�™æ€�æ–¹æ³•ï¼‰r   r   )Ústripr=   rå   ©r   s    r!   rÈ  rÈ  ñ  s2   € àˆJ�B×ÒÑÔ×%Ò%Ñ'Ô'×-Ò-¨bÑ1Ô1Ð1r#   c                  óB   — e Zd ZdZdd„Z	 	 ddd„Zddd„Zdd„Zdd„ZdS )Ú	Transportuá   
    ä¸²å�£/å�‡ä¸²å�£çš„ç»Ÿä¸€æŽ¥å�£ã€‚v1 å®Œå…¨é� é¸­å­�ç±»åž‹ï¼Œæ³¨å…¥å�‡ä¸²å�£æ—¶çœ‹ä¸�å‡ºåˆ°åº•è¦�ç”¨å“ªå‡ ä¸ªæ–¹æ³•ï¼Œ
    è¿™é‡ŒæŠŠå®ƒå†™æˆ�ä¸€ä¸ªæ˜¾å¼�å��è®®ï¼ˆSerialPort ä¸Žæµ‹è¯•ç”¨å�‡ä¸²å�£éƒ½å¤©ç„¶æ»¡è¶³ï¼‰ã€‚
    r¢   r   r   r8   c                ó   — d S rd   r*   r¬   s     r!   r÷  zTransport.sendü  ó   € € € r#   r   Nrø  rù  r}  rú  rû  c                ó   — d S rd   r*   )r    rø  rù  rú  s       r!   r  zTransport.recvþ  s   € Ø9<¸r#   r½  rÓ  c                ó   — d S rd   r*   )r    rú  s     r!   r  zTransport.drain  rÑ  r#   r/   c                ó   — d S rd   r*   r   s    r!   rà  zTransport.is_open  rÑ  r#   rÜ  c                ó   — d S rd   r*   r   s    r!   ré  zTransport.close  rÑ  r#   rÅ   r&  r'  )r½  r)  rq   r%  )	r%   r&   r'   r(   r÷  r  r  rà  ré  r*   r#   r!   rÏ  rÏ  ö  sp   € € € € € ðð ð
 ,Ð+Ð+Ð+àFJØ)-ð=ð =ð =ð =ð =ð 9Ð8Ð8Ð8Ð8à"Ð"Ð"Ð"à Ð Ð Ð Ð Ð r#   rÏ  c                  ó>   — e Zd ZU dZdZded<   dZded<   dZded<   dS )	ÚRouteOutcomeuK   ä¸€æ¬¡å½’å±žè·¯ç”±çš„ç»“è®ºï¼ˆv1 æ˜¯è£¸çš„ (frame, same_meter) äºŒå…ƒç»„ï¼‰Nr}  r,  Fr/   Ú
same_meterÚstatus_failed)r%   r&   r'   r(   r,  r)   rØ  rÙ  r*   r#   r!   r×  r×    sK   € € € € € € àUÐUØ!€EÐ!Ð!Ð!Ñ!Ø€JÐÐÐÑØ€MÐÐÐÑÐÐr#   r×  c                  ób   — e Zd ZdZd d„Zed!d„¦   «         Zd"d„Zd#d„Zd$d„Z	d%d„Z
d&d„Zd&d„ZdS )'ÚFrameRouteruÎ  
    â˜… æ ¸å¿ƒï¼šä¸Šè¡Œå¸§å½’å±žã€‚èº«ä»½å�ªæœ‰ä¸€ä¸ª â€”â€” (è¡¨å�·, DI) =ã€Œä¸Šxæ¬¡ä»»åŠ¡å�—ã€�ã€‚

    è§„åˆ™ï¼ˆTaskID å®Œå…¨ä¸�å�‚ä¸Žå½’å±žï¼‰ï¼š
      Â· æ­£å¸¸åº”ç­” / å¸¦ DI çš„å¼‚å¸¸åº”ç­”ï¼šå½’å±žé”® = (è¡¨å�·, DI)ã€‚
        å�ªè¦�å†…å±‚ DI å°±æ˜¯å½“å‰�åœ¨æŠ„çš„ DIï¼Œå°±æ˜¯ç­”æ¡ˆ â€”â€” æ¨¡å�—å›žæ”¾/å»¶è¿Ÿä¼šè®©å¤–å±‚ TaskID æ»žå�Žï¼Œ
        æ‹¿å®ƒåˆ¤æ–­ä¼šè¯¯æ�€çœŸå®žæ•°æ�®ã€‚
      Â· ä¸�æ˜¯å½“å‰�ä»»åŠ¡å�—çš„å¸§ â†’ è¿›ç¼“å­˜ï¼Œè€Œä¸�æ˜¯ä¸¢å¼ƒï¼š
          - å±žäºŽæœ¬è¡¨ã€�ä¸”æ˜¯æ­¤å‰�è¶…æ—¶æ²¡å�–åˆ°çš„é¡¹ â†’ ç«‹å�³å›žå¡«ï¼ˆè¡¥æŠ„ï¼‰ï¼›
          - è¯¥ DI æ­¤å‰�å·²æŠ„å›ž â†’ è®° [é‡�å¤�å¸§]ï¼ˆå›žæ”¾é‡�å¤�ï¼‰ã€‚
      Â· ä¸�å¸¦ DI çš„å¼‚å¸¸åº”ç­”ï¼ˆæ•°æ�®åŸŸå�ªæœ‰é”™è¯¯ç �ï¼‰ï¼šå�ªåœ¨ã€Œæ­£åœ¨ç­‰å½“å‰�é¡¹ã€�æ—¶æŒ‰ä¸Šä¸‹æ–‡å½’å±žï¼›
        çª—å�£å¤–æ”¶åˆ°çš„ä¸€å¾‹ä¸�å½’å±žã€�ä¸�å…¥ç¼“å­˜ï¼ˆå�¦åˆ™ä¼šè¢«å�Žç»­åˆ«çš„ä»»åŠ¡å�—è¯¯å�ƒï¼‰ã€‚
      Â· å·²æ”¾å¼ƒä»»åŠ¡å�—çš„åº”ç­”ï¼šç›´æŽ¥ä¸¢å¼ƒï¼Œä¸�å…¥ç¼“å­˜ï¼ˆå�¦åˆ™ç¼“å­˜æ�¡ç›®æ°¸è¿œæ²¡äººå�–ï¼‰ã€‚
    r¶  r·  rÀ  r©  c                ó€   — || _         || _        i | _        i | _        i | _        t          ¦   «         | _        d | _        d S rd   )r¶  rÀ  ÚcacheÚgotÚ	wait_fillÚsetÚ	abandonedÚstatus_fail)r    r¶  rÀ  s      r!   r    zFrameRouter.__init__   s>   € ØˆŒ	ØˆŒ
Ø,.ˆŒ
Ø.0ˆŒØ46ˆŒÝ'*¡u¤uˆŒØ7;ˆÔÐÐr#   Útaskr5   r   ÚTaskKeyc                óp   — t          | j        j        ¦  «        | j        j                             ¦   «         fS rd   )rÈ  r6   r   r7   r-   r=   )rã  s    r!   Útask_keyzFrameRouter.task_key*  s)   € å˜$œ*œ/Ñ*Ô*¨D¬I¬L×,>Ò,>Ñ,@Ô,@ÐAÐAr#   Úuplinkr¬  úOptional[SendTask]r×  c                óð  — |j         t          j        t          j        t          j        fv rt          ¦   «         S t          |d uo5|j        o.t          |j        ¦  «        t          |j	        j        ¦  «        k    ¦  «        }|j         t          j
        u �r®|j        €J ‚|j        }d|j        › d|j        d›d�}|j        rd| j                             d|j        d›d|j        › d|› d	�¦  «         | j                             d
|j        d|› d�¦  «         t          |¬¦  «        S |�»|j        |j        dz  k    r¨|j        t          |j	        j        ¦  «        k    r†|| _        | j                             d|j        d›d|j        › d|› dt-          |j        j        ¦  «        › d�	¦  «         | j                             d
|j        d|› d�¦  «         t          dd¬¦  «        S | j                             d|j        d›d|j        › d|› d�¦  «         | j                             d
|j        d|› d�¦  «         t          ¦   «         S |j        €J ‚|j        }t          |j        ¦  «        }||j                             ¦   «         f}|j        �|j        j        nd}	|j        r||| j        v rs| j                             dt-          |j        ¦  «        › d|j        › d|› d�¦  «         | j                             d|j        d|j        › d�¦  «         t          ¦   «         S |j        �rd|j        |j        }}
|
�d|
d›d�nd› |› �                      ¦   «         }|j        �rdt-          |j        ¦  «        › d|j        › d�}|�[||j        f|  !                    |¦  «        k    r;| j                             d |› d!|› d"|	d›d#�¦  «         t          |j        d¬$¦  «        S d%||j        f}|| j"        v rj| j#        xj$        d&z  c_$        | j                             d'|› d(|› d)�¦  «         | j                             d*|j        d+|› �¦  «         t          |¬¦  «        S || j"        |<   |�|  !                    |¦  «        d&         nd,}| j                             d-|› d|› d.|› d/�¦  «         | j                             d0|j        d1|› d|› d2�¦  «         t          |¬¦  «        S |�[| j                             d |› d3t-          |j        j        ¦  «        › d4|j        j        › d5�¦  «         t          |j        |¬$¦  «        S | j                             d6|› d7�¦  «         | j                             d8|j        d9|› d:�¦  «         t          ¦   «         S |�n||  !                    |¦  «        k    rU| j                             d;t-          |j        ¦  «        › d|j        › d<|› d"|	d›d=�	¦  «         t          |j        d¬$¦  «        S || j%        v r‡| j#        xj$        d&z  c_$        | j                             d>t-          |j        ¦  «        › d|j        › d?�¦  «         | j                             d*|j        d@|j        › dA�¦  «         t          |¬¦  «        S || j"        v r‡| j#        xj$        d&z  c_$        | j                             d>t-          |j        ¦  «        › d|j        › dB�¦  «         | j                             d*|j        d@|j        › dC�¦  «         t          |¬¦  «        S | j&         '                    |¦  «        }|�&|  (                    ||¦  «         t          |¬¦  «        S || j"        |<   |�|  !                    |¦  «        d&         nd,}| j                             dD|j        › dEt-          |j        ¦  «        › dF|› dG�¦  «         | j                             d0|j        dH|j        › dI|› d5�¦  «         t          |¬¦  «        S )JNu   ä»»åŠ¡çŠ¶æ€�=ú(0xr=  rC   u       [ä»»åŠ¡çŠ¶æ€�] TaskID=0xr[  u    è¡¨=r*  u$   ï¼ˆæ‰§è¡Œæˆ�åŠŸï¼Œç­‰å¾…æ•°æ�®å¸§ï¼‰z	RX-STATUSu   ä»»åŠ¡çŠ¶æ€� u   ï¼ˆç­‰å¾…æ•°æ�®å¸§ï¼‰)rØ  éÿÿ  u    â†’ å½“å‰�ä»»åŠ¡å�— ä¸Šu+   æ¬¡ ä¸�ä¼šè¿”å›žæ•°æ�®ï¼Œæ��å‰�ç»“æ�Ÿç­‰å¾…u0   ï¼ˆå½“å‰�ä»»åŠ¡å�—å¤±è´¥ï¼Œæ��å‰�ç»“æ�Ÿç­‰å¾…ï¼‰T)rØ  rÙ  u!   ï¼ˆé�žå½“å‰�ä»»åŠ¡å�—ï¼Œå¿½ç•¥ï¼‰r   u       [å·²æ”¾å¼ƒ] ä»»åŠ¡å�— ä¸Šõ   æ¬¡(DI=u   ) å±žäºŽå·²æ”¾å¼ƒçš„ u'   ï¼Œåº”ç­”ç›´æŽ¥ä¸¢å¼ƒï¼ˆä¸�å…¥ç¼“å­˜ï¼‰zRX-SKIPu   å·²æ”¾å¼ƒä»»åŠ¡å�—çš„åº”ç­” DI=u	   ï¼Œä¸¢å¼ƒrž  r   r8  u       [å‘½ä¸­] 645 å¼‚å¸¸åº”ç­” u    â†’ ä»»åŠ¡å�— u   ï¼ˆå¤–å±‚TaskID=0xu"    ä»…ä¸ºå›žæ˜¾ï¼Œä¸�å�‚ä¸Žå½’å±žï¼‰)r,  rØ  ÚERRr|   u!       [é‡�å¤�å¸§] 645 å¼‚å¸¸åº”ç­” u    ä»»åŠ¡å�— u    å·²åœ¨ç¼“å­˜ï¼Œå¿½ç•¥zRX-DUPu   é‡�å¤�å¼‚å¸¸åº”ç­” r�  u)       [ç¼“å­˜å»¶è¿Ÿå¼‚å¸¸åº”ç­”] ä»»åŠ¡å�— u$    â†’ å…¥ç¼“å­˜ï¼ˆå½“å‰�ä»»åŠ¡å�— DI=u   ï¼‰ï¼Œè½®åˆ°è¯¥é¡¹æ—¶å†�å�–ç”¨zRX-CACHEu   å»¶è¿Ÿå¼‚å¸¸åº”ç­” u
    å…¥ç¼“å­˜u:   ï¼ˆå¸§å†…æ—  DIï¼ŒæŒ‰ä¸Šä¸‹æ–‡å½’å±žåˆ°å½“å‰�ä»»åŠ¡å�— ä¸ŠrA   õ   ï¼‰u       [ä¸¢å¼ƒ] 645 å¼‚å¸¸åº”ç­” uj   ï¼šå¸§å†…æ—  DIï¼Œä¸”å½“å‰�æ²¡æœ‰åœ¨ç­‰çš„ä»»åŠ¡å�— â€”â€”ä¸�ä½œå½’å±žï¼Œé�¿å…�è¢«å�Žé�¢çš„ä»»åŠ¡å�—è¯¯å�ƒzRX-DROPu   æ— DIå¼‚å¸¸åº”ç­” u!   ï¼Œæ— ä¸Šä¸‹æ–‡å�¯å½’å±žï¼Œä¸¢å¼ƒu       [å‘½ä¸­] ä»»åŠ¡å�— ä¸Šu   ) è¡¨=u    ä»…ä¸ºæµ�æ°´å�·å›žæ˜¾ï¼‰u       [é‡�å¤�å¸§] ä»»åŠ¡å�— ä¸Šu   ) æ­¤å‰�å·²æŠ„å›žï¼Œå¿½ç•¥u   é‡�å¤�å¸§ DI=u   ï¼ˆå·²æŠ„å›žï¼Œå¿½ç•¥ï¼‰u   ) å·²åœ¨ç¼“å­˜ä¸­ï¼Œå¿½ç•¥u   ï¼ˆå·²åœ¨ç¼“å­˜ï¼Œå¿½ç•¥ï¼‰u       [ç¼“å­˜å»¶è¿Ÿåº”ç­”] DI=õ   (ä¸Šu   æ¬¡) ä¸Žå½“å‰�ä»»åŠ¡(DI=u*   )ä¸�ç¬¦ â†’ å…¥ç¼“å­˜ï¼Œç»§ç»­ç­‰å½“å‰�é¡¹u   å»¶è¿Ÿåº”ç­” DI=u    å…¥ç¼“å­˜ï¼ˆå½“å‰�ä»»åŠ¡ DI=))r  r¡  r¦  r©  rª  r×  r/   r   rÈ  r6   r§  rU   r†  rƒ  r‰  r¶  rÀ  rY  ro   r,  r9   râ  rc  r7   r-   rp  r=   r­  rá  r"  r
  r  rÌ  ræ  rÝ  rÀ  r«  rÞ  rß  r”   Ú	fill_late)r    rç  rã  rØ  rU   Údescrp  r   rÉ  Útidr5  Útextr6  Úerr_keyÚcurÚtargets                   r!   ÚroutezFrameRouter.route.  sÞ	  € ØŒ;�:Ô-­zÔ/BÅJÔDVÐWÐWÐWÝ‘>”>Ð!å˜$ dÐ*ð S¨v¬{ð SÝ'¨¬Ñ4Ô4½	À$Ä*Ä/Ñ8RÔ8RÒRñTô Tˆ
ð Œ;�*Ô0Ð0Ñ0Ø”=Ð,Ð,Ð,Ø”]ˆFØS 6Ô#5ÐSÐS¸&Ô:LÐSÐSÐSÐSˆDØŒyð ;à”	—’ð  M¸f¼nÐeð  Mð  MÐW]ÔWbð  Mð  MØ"&ð Mð  Mð  Mñ Nô Nð Nà”	—’˜k¨6¬<Ð9dÈÐ9dÐ9dÐ9dÑeÔeÐeÝ#¨zÐ:Ñ:Ô:Ð:ØÐ  V¤^¸¼À6Ñ8IÒ%JÐ%JØœ¥y°´´Ñ'AÔ'AÒAÐAà#)�Ô Ø”	—’ð  5¸f¼nÐeð  5ð  5ÐW]ÔWbð  5ð  5Ø"&ð 5ð  5Ý@EÀdÄiÄlÑ@SÔ@Sð 5ð  5ð  5ñ 6ô 6ð 6ð ”	—’˜k¨6¬<Ød¨dÐdÐdÐdñfô fð få#¨tÀ4ÐHÑHÔHÐHØŒI�NŠNð F¸&¼.Ðað Fð FÐSYÔS^ð Fð FØ"ðFð Fð Fñ Gô Gð GàŒI�MŠM˜+ v¤|Ð5lÀTÐ5lÐ5lÐ5lÑmÔmÐmÝ‘>”>Ð!ð Œ|Ð'Ð'Ð'Ø”ˆÝ˜œÑ%Ô%ˆØ�U”X—^’^Ñ%Ô%Ð&ˆØ&,¤lÐ&>ˆfŒlÔ"Ð"ÀAˆð Œ8ð 	"˜˜tœ~Ð-Ð-ØŒI�NŠNð L½5ÀÄ¹?¼?ð Lð LÐSXÔS[ð Lð LØ"ðLð Lð Lñ Mô Mð MàŒI�MŠM˜) V¤\Ð3hÐUZÔU]Ð3hÐ3hÐ3hÑiÔiÐiÝ‘>”>Ð!ð Ô$ñ !	"ØÔ)¨5Ô+;�$ˆDØ*.Ð*:Ð&˜4Ð&Ð&Ð&Ð&Ð&ÀÐJÀDÐJÐJ×PÒPÑRÔRˆDð Œxñ ;ØA�e E¤H™oœoÐAÐA°e´hÐAÐAÐA�ØÐ#¨¨u¬xÐ(8¸D¿MºMÈ$Ñ<OÔ<OÒ(OÐ(OØ”I—N’Nð $dÀDð $dð $dÐY^ð $dð $dØ8;Ð#cð$dð $dð $dñ eô eð eå'¨f¬lÀtÐLÑLÔLÐLØ  $¨¬Ð1�Ø˜dœjÐ(Ð(Ø”JÐ)Ô)¨QÑ.Ð)Ô)Ø”I—N’NÐ#uÀtÐ#uÐ#uÐX]Ð#uÐ#uÐ#uÑvÔvÐvØ”I—M’M (¨F¬LÐ:WÐPUÐ:WÐ:WÑXÔXÐXÝ'°:Ð>Ñ>Ô>Ð>Ø&,�”
˜7Ñ#Ø04Ð0@�d—m’m DÑ)Ô)¨!Ô,Ð,Àc�Ø”	—’ð  \È5ð  \ð  \ÐSWð  \ð  \Ø8;ð \ð  \ð  \ñ ]ô ]ð ]à”	—’˜j¨&¬,ØL°EÐLÐL¸DÐLÐLÐLñNô Nð Nå#¨zÐ:Ñ:Ô:Ð:ð ÐØ”	—’ð  TÀð  Tð  TÝ&+¨D¬I¬LÑ&9Ô&9ð Tð  TØBFÄ)Ä,ð Tð  Tð  Tñ Uô Uð Uå#¨&¬,À:ÐNÑNÔNÐNØŒI�NŠNð O¸Dð Oð Oð Oñ Pô Pð PàŒI�MŠM˜) V¤\Ð3oÈÐ3oÐ3oÐ3oÑpÔpÐpÝ‘>”>Ð!ð Ð  t§}¢}°TÑ':Ô':Ò :Ð :ØŒI�NŠNð S½¸e¼h¹¼ð Sð SÐPUÔPXð Sð SÐ`dð Sð SØ03ÐRðSð Sð Sñ Tô Tð Tå f¤l¸tÐDÑDÔDÐDà�$”(ˆ?ˆ?ØŒJÐ!Ô! QÑ&Ð!Ô!ØŒI�NŠNÐw½5ÀÄ¹?¼?ÐwÐwÐSXÔS[ÐwÐwÐwÑxÔxÐxØŒI�MŠM˜( F¤LÐ2dÀ%Ä(Ð2dÐ2dÐ2dÑeÔeÐeÝ¨:Ð6Ñ6Ô6Ð6à�$”*ÐÐØŒJÐ!Ô! QÑ&Ð!Ô!ØŒI�NŠNÐw½5ÀÄ¹?¼?ÐwÐwÐSXÔS[ÐwÐwÐwÑxÔxÐxØŒI�MŠM˜( F¤LÐ2gÀ%Ä(Ð2gÐ2gÐ2gÑhÔhÐhÝ¨:Ð6Ñ6Ô6Ð6ð ”×#Ò# CÑ(Ô(ˆØÐØ�NŠN˜6 6Ñ*Ô*Ð*Ý¨:Ð6Ñ6Ô6Ð6à ˆŒ
�3‰Ø(,Ð(8ˆd�mŠm˜DÑ!Ô! !Ô$Ð$¸cˆØŒ	�Šð N°e´hð Nð NÅEÈ%Ì(ÁOÄOð Nð NØ!ðNð Nð Nñ 	Oô 	Oð 	OàŒ	�Š�j &¤,ØX¨¬ÐXÐXÐPSÐXÐXÐXñ	Zô 	Zð 	Zå zÐ2Ñ2Ô2Ð2r#   úOptional[Uplink]c                ó°   — |                       |¦  «        \  }}| j                             ||fd¦  «        }|�|S | j                             d||fd¦  «        S )u
  
        å�–å±žäºŽè¯¥ã€Œä»»åŠ¡å�—(è¡¨å�·+DI)ã€�çš„å»¶è¿Ÿåº”ç­”ï¼ˆæœ‰åˆ™ç”¨ï¼Œæ²¡æœ‰åˆ™ Noneï¼‰ã€‚

        â˜… å�ªç”¨ (è¡¨å�·, DI) å�šé”®ã€‚v1 æ—©æœŸè¿˜æœ‰ä¸€ä¸ª ("ERR", è¡¨å�·, TaskID) çš„é”® + ä¸€ä¸ª
          ("ERR", è¡¨å�·, 0) çš„é€šé…�å…œåº• â€”â€” é‚£æ­£æ˜¯ã€Œæ‹¿ TaskID å½“ä»»åŠ¡å�—èº«ä»½ã€�çš„æ®‹ç•™ï¼š
          å¼‚å¸¸å¸§çš„ TaskID æ�¥è‡ªåˆ«çš„ä¼šè¯�/åˆ«çš„é¡¹ï¼Œæ°¸è¿œåŒ¹é…�ä¸�ä¸Šï¼Œå�´å�ˆä¼šè¢«é€šé…�é”®å¼¹å‡ºæ�¥
          å–‚ç»™**ä¸‹ä¸€ä¸ª**ä»»åŠ¡å�—ï¼ŒæŠŠæ­£å¸¸æ•°æ�®åˆ¤æˆ�é”™è¯¯å¸§å¹¶ä¸­æ­¢æ•´è¡¨ã€‚
        Nrí  )ræ  rÝ  Úpop)r    rã  r   r-   Úcacheds        r!   Útake_cachedzFrameRouter.take_cached¡  sZ   € ð —=’= Ñ&Ô&‰ˆˆbØ”—’  r 
¨DÑ1Ô1ˆØÐØˆMØŒz�~Š~˜u d¨BÐ/°Ñ6Ô6Ð6r#   ÚresultrR   rÜ  c                óè   — t          |j        ¦  «        |j                             ¦   «         f}|j        t
          j        u r'|| j        |<   | j         	                    |d¦  «         dS || j        |<   dS )uZ   æˆ�åŠŸçš„ç™»è®°ã€Œå·²æŠ„å›žã€�ï¼ˆç”¨äºŽå›žæ”¾åˆ¤é‡�ï¼‰ï¼›å¤±è´¥çš„ç™»è®°ã€Œç­‰å¾…è¡¥æŠ„ã€�N)
rÈ  rS   r-   r=   rU   rI   rJ   rÞ  rß  rú  )r    rý  rÉ  s      r!   ÚrememberzFrameRouter.remember±  sm   € å˜Ô*Ñ+Ô+¨V¬Y¯_ª_Ñ->Ô->Ð?ˆØŒ=�JœMÐ)Ð)Ø"ˆDŒH�S‰MØŒN×Ò˜s DÑ)Ô)Ð)Ð)Ð)à"(ˆDŒN˜3ÑÐÐr#   rS   r   ÚitemsúSequence[DataItem]c                ó
  — t          |¦  «        }|D ]p}||j                             ¦   «         f}| j                             |¦  «         | j                             |d¦  «         | j                             d|z   d¦  «         ŒqdS )u]   æœ¬è¡¨æ”¾å¼ƒè¿™äº›ä»»åŠ¡å�—ï¼šå�Žç»­å›žæ”¾åº”ç­”ç›´æŽ¥ä¸¢å¼ƒï¼Œå¹¶æ¸…æŽ‰å·²è¿›ç¼“å­˜çš„æ�¡ç›®N)rí  )rÈ  r-   r=   rá  rv  rÝ  rú  )r    rS   r   r   r7   rÉ  s         r!   ÚabandonzFrameRouter.abandonº  s…   € å˜Ñ$Ô$ˆØð 	1ð 	1ˆDØ˜œŸš™œÐ)ˆCØŒN×Ò˜sÑ#Ô#Ð#ØŒJ�NŠN˜3 Ñ%Ô%Ð%ØŒJ�NŠN˜8 c™>¨4Ñ0Ô0Ð0Ð0ð		1ð 	1r#   r   c                óî   — |j         }|€J ‚t          j        |_        |j        |_        |j        |_        ||_        |j	        |_
        |j        |_        |j        |_        d|_        d|_        d|_        dS )uG   ç”¨ä¸€æ�¡åº”ç­”å¡«å…… TaskResultï¼ˆæ­£å¸¸åº”ç­”è·¯å¾„ / è¡¥æŠ„å›žå¡«ï¼‰Nr   u$   è¡¥æŠ„ï¼šåº”ç­”è¿Ÿåˆ°åˆ°è¾¾å�Žå›žå¡«)rp  rI   rJ   rU   r,  rW   r­  r^   r_   ro   r]   ra   r.   rZ   r[   r\   )r    r   rç  rp  s       r!   Úapply_replyzFrameRouter.apply_replyÄ  sk   € à”ˆØÐ Ð Ð Ý”=ˆŒØ”\ˆŒ
ØœˆŒØˆŒØ”iˆŒØ”<ˆŒØ”+ˆŒØˆŒ
ØˆŒ
Ø7ˆŒˆˆr#   c           	     ó†  — |j         j        }|                      ||¦  «         | j        xj        dz  c_        t          |j        ¦  «        |j                             ¦   «         f}| j	         
                    |d¦  «         || j        |<   | j                             dt          |j        ¦  «        › d|j        › d|› d�¦  «         | j                             d|j        › d|j        › d	|j        › d
�¦  «         | j                             d|j        d|j        › d|› d�¦  «         | j                             |d¬¦  «         dS )u[   â˜… è¡¥æŠ„ï¼šæŠŠè¿Ÿåˆ°åˆ°è¾¾çš„åº”ç­”å›žå¡«åˆ°æ­¤å‰�åˆ¤å¤±è´¥çš„æ�¡ç›®ä¸Šï¼ˆä¸�ç”¨é‡�å�‘ï¼‰r|   Nu       â†© è¡¥æŠ„æˆ�åŠŸï¼šä¸Šrì  u0   ) çš„åº”ç­”è¿Ÿåˆ°åˆ°è¾¾ï¼Œå·²å›žå¡«ï¼ˆåŽŸçŠ¶æ€� u   ï¼Œæ— éœ€é‡�å�‘ï¼‰u         å†»ç»“æ—¶é—´: u
     æ­£å�‘: u    kWh  å��å�‘: rT  zRX-FILLu   è¡¥æŠ„å‘½ä¸­ DI=u   ï¼ˆåŽŸçŠ¶æ€� rî  u   è¡¥æŠ„)rŠ  )rU   r.   r  rÀ  rª  rÈ  rS   r-   r=   rß  rú  rÞ  r¶  rÀ  rc  ri   rk   rm   ro   r,  ra   )r    r   rç  ÚoldrÉ  s        r!   rð  zFrameRouter.fill_lateÓ  ss  € àŒhŒnˆØ×Ò˜˜FÑ#Ô#Ð#ØŒ
ÐÔ Ñ!ÐÔÝ˜œÑ&Ô&¨¬¯
ª
©¬Ð5ˆØŒ×Ò˜3 Ñ%Ô%Ð%ØˆŒ�‰ØŒ	�Šð HµE¸!¼$±K´Kð Hð HÈÌð Hð HØ03ðHð Hð Hñ 	Iô 	Ið 	IàŒ	�Šð 2¨a¬mð 2ð 2ÀqÄzð 2ð 2Ø"#¤)ð2ð 2ð 2ñ 	3ô 	3ð 	3àŒ	�Š�i ¤Ð/]À!Ä$Ð/]Ð/]ÐUXÐ/]Ð/]Ð/]Ñ^Ô^Ð^ØŒ	×Ò˜ ÐÑ)Ô)Ð)Ð)Ð)r#   N)r¶  r·  rÀ  r©  )rã  r5   r   rä  )rç  r¬  rã  rè  r   r×  )rã  r5   r   rø  )rý  rR   r   rÜ  )rS   r   r   r  r   rÜ  )r   rR   rç  r¬  r   rÜ  )r%   r&   r'   r(   r    rÆ   ræ  r÷  rü  rÿ  r  r  rð  r*   r#   r!   rÛ  rÛ    sÓ   € € € € € ðð ð<ð <ð <ð <ð ðBð Bð Bñ „\ðBðq3ð q3ð q3ð q3ðf7ð 7ð 7ð 7ð )ð )ð )ð )ð1ð 1ð 1ð 1ð8ð 8ð 8ð 8ð*ð *ð *ð *ð *ð *r#   rÛ  c                  ó>   — e Zd ZU dZdZded<   dZded<   dZded<   dS )	Ú
PumpResultuq   ä¸€æ¬¡æ”¶å¸§çš„ç»“æžœï¼šå‘½ä¸­å½“å‰�ä»»åŠ¡çš„å¸§ / æœ¬è¡¨æœ‰æ²¡æœ‰å¸§ï¼ˆåˆ¤æ–­å›žæ”¾æŒ¤å� ï¼‰/ ä»»åŠ¡çŠ¶æ€�å¤±è´¥Nr}  ÚhitFr/   Úsaw_same_meterrÙ  )r%   r&   r'   r(   r
  r)   r  rÙ  r*   r#   r!   r	  r	  ç  sK   € € € € € € à{Ð{Ø€CÐÐÐÑØ €NÐ Ð Ð Ñ Ø€MÐÐÐÑÐÐr#   r	  c                  óF   — e Zd ZdZ	 d$d%d„Zd&d„Zd'd„Z	 	 d(d)d „Zd*d+d#„ZdS ),Ú
UplinkPumpu  
    ä¸²å�£ â†” å¸§æµ�ï¼šæ”¶å­—èŠ‚ â†’ åˆ†å¸§ â†’ åˆ†ç±» â†’ å›žç¡®è®¤å¸§ â†’ äº¤ç»™ FrameRouter å½’å±žã€‚

    ï¼ˆv1 è¿™äº›é€»è¾‘æ•£åœ¨ FreezeReadSession çš„ _feed / _drain_to_cache / _exchange é‡Œï¼Œ
    å¹¶ä¸”ç›´æŽ¥è¯»å†™ self._rx_resid / self._acked ç­‰ä¼šè¯�å†…éƒ¨çŠ¶æ€�ã€‚ï¼‰
    Nr¾  r¿  Ú
classifierrµ  ÚrouterrÛ  Úacksr¼  r¶  r·  ÚsplitterúOptional[FrameSplitter]c                óv   — || _         || _        || _        || _        || _        |pt          ¦   «         | _        d S rd   )r¾  r  r  r  r¶  rµ  r  )r    r¾  r  r  r  r¶  r  s          r!   r    zUplinkPump.__init__÷  s;   € ð #ˆŒØ$ˆŒØˆŒØˆŒ	ØˆŒ	Ø Ð3¥M¡O¤OˆŒˆˆr#   r,  r   rã  rè  r   r×  c                óÄ   — | j                              |¦  «        }|j        r%| j                             |j        |j        ¦  «         | j                             ||¦  «        S rd   )	r  rÆ  r®  r  rÅ  r¯  r°  r  r÷  )r    r,  rã  rç  s       r!   ÚhandlezUplinkPump.handle  sT   € Ø”×)Ò)¨%Ñ0Ô0ˆØÔð 	:ØŒI�MŠM˜&œ.¨&¬.Ñ9Ô9Ð9ØŒ{× Ò  ¨Ñ.Ô.Ð.r#   r  r	  c                óf  — t          ¦   «         }| j                             |¦  «        }|j        �*| j                             d|j        d|j        › d�¦  «         |j        D ]O}|                      ||¦  «        }|j	        �|j
        €|j	        |_
        n|j        rd|_        |j        rd|_        ŒP|S )uQ   å¤„ç�†ä¸€æ‰¹åˆšæ”¶åˆ°çš„å­—èŠ‚ï¼ˆå�¯èƒ½å�«å¤šå¸§ç²˜åŒ…ï¼‰ï¼Œè¿”å›žæœ¬æ‰¹çš„ç»“è®ºNr½  u   æ®‹ç•™ç¼“å†²å¼‚å¸¸å¢žé•¿(u   B)ï¼Œå·²æˆªæ–­T)r	  r  rº  r²  r¶  ro   r³  r±  r  r,  r
  rØ  r  rÙ  )r    r  rã  rý  Úsplitr,  Úoutcomes          r!   rº  zUplinkPump.feed  sÄ   € å‘”ˆØ”×"Ò" 5Ñ)Ô)ˆØŒ>Ð%ØŒI�MŠM˜( E¤NØX°eÔ6HÐXÐXÐXñZô Zð Zà”\ð 		,ð 		,ˆEØ—k’k %¨Ñ.Ô.ˆGØŒ}Ð(Ø”:Ð%Ø!(¤�F”JøØÔ#ð -à(,�Ô%ØÔ$ð ,Ø'+�Ô$øØˆr#   r   ç      à?rD   r   rú  rÓ  c           	     ó  — | j         €t          d¦  «        ‚| j                              d|¬¦  «        }|st          ¦   «         S | j                             d||› dt          |¦  «        › d�¦  «         |                      ||¦  «        S )u4   æ”¶ä¸€æ¬¡ä¸²å�£ï¼ˆæœ€å¤šç­‰ max_wait ç§’ï¼‰å¹¶å¤„ç�†Nõ   æœªæ³¨å…¥ transportr€  )rù  rú  zRX-RAWu    ä¸²å�£æ”¶åˆ° rR  )r¾  ÚRuntimeErrorr  r	  r¶  ro   r   rº  )r    rã  rD   rú  r  s        r!   ÚpumpzUplinkPump.pump  sŠ   € ð Œ>Ð!ÝÐ4Ñ5Ô5Ð5Ø”×#Ò#¨W¸xÐ#ÑHÔHˆØð 	 Ý‘<”<ÐØŒ	�Š�h ¨%Ð'RÐ'R½sÀ5¹z¼zÐ'RÐ'RÐ'RÑSÔSÐSØ�yŠy˜ Ñ%Ô%Ð%r#   r  rÜ  c                óæ   — | j         €dS t          | j         dd¦  «        }|€dS 	  ||¦  «        }n&# t          $ r  |¦   «         }Y nt          $ r Y dS w xY w|r|                      |d¦  «         dS dS )uJ  
        æŠŠä¸²å�£è¾“å…¥ç¼“å†²åŒºé‡Œ**å·²ç»�åˆ°è¾¾**çš„å­—èŠ‚å…¨éƒ¨å�–èµ°ï¼ŒæŒ‰ã€Œå½’å±žæœªçŸ¥ã€�ï¼ˆtask=Noneï¼‰å¤„ç�†ã€‚

        ç”¨é€”ï¼šæ¯�æ¬¡ä¸‹å�‘ä»»åŠ¡å‰�å…ˆæŽ’ç©ºä¸Šä¸€æ¬¡äº¤äº’æ®‹ç•™çš„å¸§ â€”â€” æ­£å¸¸åº”ç­”è¿›ç¼“å­˜/è¡¥æŠ„ï¼›
        ä¸�å¸¦ DI çš„å¼‚å¸¸åº”ç­”ç›´æŽ¥ä¸¢å¼ƒã€‚é�¿å…�è¢«ä¸‹ä¸€ä¸ªä»»åŠ¡å�—è¯¯å�ƒã€‚
        Nr  )r¾  ÚgetattrÚ	TypeErrorrÂ  rº  )r    rú  r  r  s       r!   r  zUplinkPump.drain&  s±   € ð Œ>Ð!ØˆFÝ˜œ¨°Ñ6Ô6ˆØˆ=ØˆFð	Ø�E˜(‘O”OˆEˆEøÝð 	ð 	ð 	Ø�E‘G”GˆEˆEˆEÝð 	ð 	ð 	ØˆFˆFð	øøøàð 	#Ø�IŠI�e˜TÑ"Ô"Ð"Ð"Ð"ð	#ð 	#s   ¥1 ±AÁ	AÁArd   )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   r  )rã  rè  rD   r   rú  rÓ  r   r	  r(  )rú  rÓ  r   rÜ  )	r%   r&   r'   r(   r    r  rº  r  r  r*   r#   r!   r  r  ï  sž   € € € € € ðð ð 6:ð4ð 4ð 4ð 4ð 4ð/ð /ð /ð /ðð ð ð ð& ;=Ø"ð	&ð 	&ð 	&ð 	&ð 	&ð#ð #ð #ð #ð #ð #ð #r#   r  r|   r¤   Ústartr  úList[DataItem]c                ó<   — d„ t          | |dz   ¦  «        D ¦   «         S )uM   ä¸Š1æ¬¡ .. ä¸ŠNæ¬¡æ•´ç‚¹å†»ç»“æ•°æ�®ï¼ˆ0504FF01 .. 0504FFxxï¼ŒæŒ‰é¡ºåº�æŠ„ï¼‰c                ó@   — g | ]}t          d |d›�d|› d�¬¦  «        ‘ŒS )r.  r=  r8  r9  )r-   r   )r,   )r~   r¹  s     r!   ú
<listcomp>z%make_freeze_items.<locals>.<listcomp>>  sM   € ð ,ð ,ð ,Øõ Ð( Ð(Ð(Ð(Ð6W¸AÐ6WÐ6WÐ6WÐXÑXÔXð ,ð ,ð ,r#   r|   )r  )r!  r  s     r!   Úmake_freeze_itemsr&  <  s1   € ð,ð ,Ý˜5 #¨¡'Ñ*Ô*ð,ñ ,ô ,ð ,r#   c                  ó¦   — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dMdNd$„ZdOd+„ZdPd.„ZdQd2„Z	 dRdSd:„ZdTd=„Z	dUd>„Z
dVd?„Z	 dWdXdD„ZdYdF„Z	 dWdZdH„Zd[dK„Zd\dL„ZdS )]ÚFreezeReadSessionuÊ  
    ã€Œä¸Šxæ¬¡æ•´ç‚¹å†»ç»“æ•°æ�®ã€�æŠ„è¯»ä¼šè¯�ã€‚

        for meter in meters:                # å¤–å±‚ï¼šè¡¨
            for item in freeze_items:       # å†…å±‚ï¼šä¸Š1æ¬¡ â†’ ä¸ŠNæ¬¡
                read(item)
                è‹¥å‘½ä¸­ AbortPolicy â†’ æ”¾å¼ƒè¯¥è¡¨å‰©ä½™å…¨éƒ¨å†»ç»“é¡¹ï¼Œbreak åˆ°ä¸‹ä¸€å�ªè¡¨

    è�Œè´£åˆ’åˆ†ï¼ˆv1 æ˜¯ä¸€ä¸ª 900 è¡Œã€�ä»€ä¹ˆéƒ½å¹²çš„ç±»ï¼‰ï¼š
        å¸§è§£æž�    â†’ DLT645Codec / LocalProtocolCodec
        å¸§åˆ†ç±»    â†’ UplinkClassifier
        æ”¶å�‘/åˆ†å¸§ â†’ UplinkPump + FrameSplitter
        å½’å±žç¼“å­˜  â†’ FrameRouter
        è�½ç›˜      â†’ LogSinkï¼ˆå››ä»½æ–‡æœ¬æ—¥å¿—ï¼‰+ CsvWriter
        æœ¬ç±»      â†’ æµ�ç¨‹ç¼–æŽ’ã€�é‡�è¯•ä¸Žæ”¾å¼ƒç­–ç•¥ã€�è®°è´¦
    Ú000000000000Nç      $@rô   ç333333Ó?Fr|   r¤   rÍ  Tr½  rD  r   r¾  r¿  r¶  úOptional[LogSink]r¡  úOptional[CsvWriter]ÚpolicyúOptional[AbortPolicy]r[  rÓ  Úmax_retriesr8   r
  Úretry_on_error_framer/   Úfreeze_startÚ
freeze_endÚreplay_graceÚack_reportsÚ	ack_deduprÕ  c                óò  — || _         || _        |pt          ¦   «         | _        || _        || _        || _        |	| _        || _        || _	        || _
        |
| _        || _        || _        |pt          |¬¦  «        | _        |pt!          d ¦  «        | _        t%          ¦   «         | _        t)          | j        | j        ¬¦  «        | _        t-          || j        | j        ||¬¦  «        | _        t1          |t3          | j        ¦  «        | j        | j        | j        ¬¦  «        | _        t7          d¬¦  «        | _        t;          ¦   «         | _        t?          ¦   «         | _         d| _!        d| _"        i | _#        d S )	N)rÕ  )r¶  rÀ  )rÀ  r¶  rÁ  rÂ  )r¾  r  r  r  r¶  Trž   r×   r   )$rD  r¾  r‰   r.  r[  r0  r
  r1  r4  r5  r6  r2  r3  rÕ  r·  r¶  r˜  r¡  r©  rÀ  rÛ  r  r¼  r  r  rµ  r  r—   Úbuilderr$  r¹  r‹  Úlocal_codecÚ_seqÚ_task_noÚ	_builders)r    rD  r¾  r¶  r¡  r.  r[  r0  r
  r1  r2  r3  r4  r5  r6  rÕ  s                   r!   r    zFreezeReadSession.__init__X  sa  € ð  #ˆŒØ"ˆŒØÐ-¥¡¤ˆŒØˆŒØ&ˆÔØ,ˆÔØ$8ˆÔ!Ø(ˆÔØ&ˆÔØ"ˆŒØ(ˆÔØ$ˆŒØˆŒð Ð4�G¨GÐ4Ñ4Ô4ˆŒ	ØÐ)�) D™/œ/ˆŒÝ!‘^”^ˆŒ
Ý! t¤y¸¼
ÐCÑCÔCˆŒÝ  °$´*À4Ä9Ø)4À9ðNñ Nô NˆŒ	å¨Ý*:¸4¼9Ñ*EÔ*EØ&*¤k¸¼	ÈÌ	ðSñ Sô SˆŒ	õ *°Ð6Ñ6Ô6ˆŒÝ!‘m”mˆŒÝ-Ñ/Ô/ˆÔð ˆŒ	ØˆŒØ:<ˆŒˆˆr#   ÚmetersúSequence[MeterAddress]r   r  r   rÜ  c                ó   — t          | j        dd ¦  «        }| j        }| j                             d¦  «         | j                             dt          ¦   «         › �¦  «         | j                             d|rd|z   nt          | j        ¦  «        j        › �¦  «         | j                             d| j        › �¦  «         | j                             dt          |¦  «        › dd	„ |D ¦   «         › �¦  «         | j                             d
| j
        › d| j        › dt          |¦  «        › d�¦  «         | j                             d| j        › d| j        › d| j        › d| j        › d�	¦  «         | j                             d| j        › �¦  «         | j                             d|j        › d|j        › d|j        › d|j        › d|j        › d�¦  «         | j                             d¦  «         | j                             d¦  «         | j                             d| j        rdnd› d| j        dk    r
d | j        z  nd!› d"�¦  «         | j                             d#|j        › d$�¦  «         | j                             d%| j        j        › d&| j        j        › d'| j        j        › d(| j        j        › �¦  «         | j                             d¦  «         d S ))NrÎ  zN==============================================================================u   ä¼šè¯�å¼€å§‹ u     é€šä¿¡æ–¹å¼�   : u   ä¸²å�£ u     CCO åœ°å�€   : u     ç”µè¡¨æ•°é‡�   : rA  c                ó   — g | ]	}|j         ‘Œ
S r*   rÍ  )r~   Úms     r!   r%  z0FreezeReadSession.log_banner.<locals>.<listcomp>‘  s   € Ð<TÐ<TÐ<TÈ¸Q¼VÐ<TÐ<TÐ<Tr#   u     å†»ç»“é¡¹     : ä¸Šu	   æ¬¡ ~ ä¸Šu
   æ¬¡ï¼Œå…± õ    é¡¹u     è¶…æ—¶/é‡�è¯•  : timeout=zs, max_retries=z, retry_interval=zs, replay_grace=rÙ   u     é”™è¯¯å¸§é‡�è¯• : u     æ”¾å¼ƒç­–ç•¥   : é”™è¯¯å¸§=u   (ç«‹å�³) æ— åº”ç­”=u   (è¿žç»­u   æ¬¡) å��å¸§=u   æ¬¡)u†     åº”ç­”å½’å±ž   : å�ªæŒ‰ã€Œè¡¨å�· + DI(ä¸Šxæ¬¡ä»»åŠ¡å�—)ã€�åˆ¤å®šï¼›å¤–å±‚ TaskID æ˜¯æ¨¡å�—åŽŸæ ·å›žæ˜¾çš„æµ�æ°´å�·ï¼Œä¸�å�‚ä¸Žå½’å±žuŽ                  ï¼ˆè¿Ÿåˆ°åº”ç­”å…¥ç¼“å­˜â†’è¡¥æŠ„ï¼›é‡�å¤�å›žæ”¾å¸§å¿½ç•¥ï¼›ä¸�å¸¦ DI çš„å¼‚å¸¸å¸§å�ªè®¤å½“å‰�ç­‰å¾…çª—å�£ï¼Œçª—å�£å¤–ä¸¢å¼ƒï¼‰u     ä¸ŠæŠ¥ç¡®è®¤   : u   å�¯ç”¨u   å…³é—­u=   ï¼ˆæ¨¡å�—æ¯�æ�¡ä¸ŠæŠ¥éƒ½å›žç¡®è®¤å¸§ï¼ŒSEQ ä¸Žä¸ŠæŠ¥å¸§ä¸€è‡´r   u   ï¼›å�Œ SEQ %gs å†…åŽ»é‡�u   ï¼Œä¸�åŽ»é‡�rî  u     ä»»åŠ¡çŠ¶æ€�å¸§ : AFN=05/DUID=E805050 ä¸ŠæŠ¥ä»»åŠ¡çŠ¶æ€� â†’ é�ž 0 çŠ¶æ€�ç«‹å�³åˆ¤æœ¬é¡¹å¤±è´¥ï¼ˆä¸�ç™½ç­‰è¶…æ—¶ï¼‰ï¼Œè¿žç»­ u    æ¬¡æŒ‰ç­–ç•¥æ”¾å¼ƒæœ¬è¡¨u     æ—¥å¿—æ–‡ä»¶   : ä¸»æ—¥å¿—=u     åŽŸå§‹æŠ¥æ–‡=u     å†»ç»“å�—=z  CSV=)r  r¾  r.  r¶  rÀ  r5  Útyper%   rD  r   r2  r3  r[  r0  r
  r4  r1  rŠ   r‹   rŽ   rŒ   r5  r6  rq  rr  rs  r¡  ry  )r    r=  r   rÎ  Úps        r!   Ú
log_bannerzFreezeReadSession.log_bannerŠ  s´  € Ý�t”~ v¨tÑ4Ô4ˆØŒKˆØŒ	�Š�xÑ Ô Ð ØŒ	�ŠÐ1¥v¡x¤xÐ1Ð1Ñ2Ô2Ð2ØŒ	�ŠÐjÀÐ-h¨Y¸Ñ-=Ð-=Í4ÐPTÔP^ÑK_ÔK_ÔKhÐjÐjÑkÔkÐkØŒ	�ŠÐ;¨4¬>Ð;Ð;Ñ<Ô<Ð<ØŒ	�ŠÐV­S°©[¬[ÐVÐVÐ<TÐ<TÈVÐ<TÑ<TÔ<TÐVÐVÑWÔWÐWØŒ	�Šð /¨tÔ/@ð /ð /È4Ì?ð /ð /Ý! %™jœjð/ð /ð /ñ 	0ô 	0ð 	0àŒ	�Šð c°T´\ð cð cÐRVÔRbð cð cØ)-Ô)<ðcð cØNRÔN_ðcð cð cñ 	dô 	dð 	dàŒ	�ŠÐI¨dÔ.GÐIÐIÑJÔJÐJØŒ	�Šð M°qÔ7Gð Mð MØ$%Ô$4ðMð MØ=>¼^ðMð Mà!"¤ðMð Mà89¼ðMð Mð Mñ 	Nô 	Nð 	Nð 	Œ	�Šð Dñ 	Eô 	Eð 	EàŒ	�Šð Gñ 	Hô 	Hð 	HàŒ	�Šð u¸Ô9IÐ-W¨X¨XÈxð uð uàIMÌÐZ[ÒI[ÐI[Ð4°t´~ÑEÐEÐaoðuð uð uñ 	vô 	vð 	vð 	Œ	�Šð cØ9:¼ðcð cð cñ 	dô 	dð 	dàŒ	�Šð U°t´yÔ7Ið Uð UÐZ^ÔZcÔZpð Uð UØ$(¤IÔ$=ðUð UØEIÄXÄ]ðUð Uñ 	Vô 	Vð 	VàŒ	�Š�xÑ Ô Ð Ð Ð r#   r   rA  c                ó~   — | j                              |¦  «        }|€ t          | j        |¬¦  «        }|| j         |<   |S )uN   æŒ‰è¡¨åœ°å�€ç¼“å­˜ç»„åŒ…å™¨ï¼ˆåœ°å�€å­—èŠ‚å�ªç®—ä¸€æ¬¡ï¼Œä¸�å†�æ¯�é¡¹é‡�å»ºï¼‰N)rD  rE  )r<  r”   rA  rD  )r    r   r«   s      r!   Ú_local_builderz FreezeReadSession._local_builder¨  sA   € àŒN×Ò˜tÑ$Ô$ˆØˆ9Ý$¨t¬~ÈÐNÑNÔNˆAØ#$ˆDŒN˜4Ñ Øˆr#   rã  r5   úDict[str, bytes]c                óì   — | j                              |j        |j        ¦  «        }|                      |j        j        ¦  «                             |j        || j        dz  |j        dz  ¬¦  «        }||dœS )Nr¤   rë  )rb  rX  r9   rY  )Ú645r­  )	r8  r·   r6   r7   rG  r   rd  r:  r9   )r    rã  rp  rd  s       r!   Úbuild_frameszFreezeReadSession.build_frames°  sv   € Ø”×"Ò" 4¤:¨t¬yÑ9Ô9ˆØ×#Ò# D¤J¤OÑ4Ô4×CÒCØœØ!Ø”	˜DÑ Ø”H˜vÑ%ð	 Dñ 
ô 
ˆð  uÐ-Ð-Ð-r#   r   r   rd  r   rD   r  r}  c                óØ  — | j         €t          d¦  «        ‚| j                             |¦  «        }|�D|j        r=| j                             d¦  «         | j                             d|j        d¦  «         d}|� | j	        xj
        dz  c_
        |j        duo|j        j        }|rdnd}| j                             d	t          |j        j        ¦  «        › d
|j        j        › d|› d�¦  «         | j                             d|j        |› d�¦  «         |j        S | j                             d||› d|dz   › d|j        dz  d›d�¦  «         | j                             d|› d�t%          |d¬¦  «        ¦  «         | j                             d|dd|d         z   …         |› dt'          |¦  «        › �¦  «         | j                              |¦  «         d| j        _        t-          j        ¦   «         |z   }	d}
d}	 t-          j        ¦   «         }||	k    r.| j                             d|d›d|j        j        › d �¦  «         dS |rJ| j        d!k    r?| j        |k    r4|
�2||
z
  | j        k    r$| j                             d"||
z
  d#›d$�¦  «         dS | j                             ||t5          d%|	|z
  ¦  «        ¬&¦  «        }|j        �…|j        }| j                             d'||› d(|j        j        › d�¦  «         | j                             d)|d*d*|d+         z   …         |› d,t9          |d*d*|d+         z   …         ¦  «        › �¦  «         |S |j        rd}t-          j        ¦   «         }
|j        rdS �Œt)-uV  
        è¿”å›žï¼šå±žäºŽã€Œæœ¬è¡¨ + æœ¬ DIã€�çš„ä¸ŠæŠ¥å¸§ï¼›è¶…æ—¶è¿”å›ž Noneã€‚

        Â· ä¸‹å�‘å‰�å…ˆæŸ¥ç¼“å­˜ â†’ å‘½ä¸­ç›´æŽ¥ç”¨ï¼ˆä¸�é‡�å�‘ï¼‰
        Â· ç­‰å¾…ä¸­æ”¶åˆ°çš„å…¶å®ƒ DI å¸§ â†’ å…¥ç¼“å­˜/è¡¥æŠ„ï¼Œä¸�ä¸¢å¼ƒ
        Â· è‹¥æœ¬è¡¨å›žæ”¾å¸§æŒ¤å� çª—å�£ä¸”é�™é»˜è¶…è¿‡ replay_grace â†’ æ��å‰�è¿”å›žï¼Œäº¤ç»™å¤–å±‚é‡�å�‘
        Nr  uŠ       Â· ç¼“å­˜é‡Œæœ‰ä¸€æ�¡è¯¥ä»»åŠ¡å�—çš„ 645 å¼‚å¸¸åº”ç­”ï¼Œä½†ä»�é‡�æ–°ä¸‹å�‘ä¸€æ¬¡ç¡®è®¤ï¼ˆé�¿å…�ç”¨é™ˆæ—§çš„å¼‚å¸¸ç»“è®ºä¸­æ­¢æ•´è¡¨ï¼‰zRX-CACHE-ERRu)   ç¼“å­˜å¼‚å¸¸åº”ç­” â†’ é‡�æ–°ä¸‹å�‘ç¡®è®¤r|   u   645 å¼‚å¸¸åº”ç­”ï¼ˆERR=1ï¼‰u   åº”ç­”u0       âœ” å‘½ä¸­å»¶è¿Ÿåº”ç­”ç¼“å­˜ï¼šä»»åŠ¡å�— ä¸Šrì  u   ) çš„u!   æ­¤å‰�å·²åˆ°è¾¾ï¼Œæœ¬æ¬¡ä¸�é‡�å�‘zRX-CACHE-HITu    å‘½ä¸­ç¼“å­˜ï¼Œæœªé‡�å�‘zTX-LOCALu    ç¬¬u   æ¬¡å�‘é€�ï¼ˆTaskID æµ�æ°´å�·=0xrë  r[  rî  u   >>> ä¸‹è¡ŒæŠ¥æ–‡ï¼ˆTr¾  zTX-645rY  rX  u    å†…å±‚645è¯·æ±‚ DI=Fu       Â· ç­‰å¾…è¶…æ—¶(rÇ  u   s)ï¼Œæœªæ”¶åˆ° DI=u    çš„ä¸ŠæŠ¥å¸§r   u/       Â· æœ¬è¡¨å›žæ”¾å¸§æŒ¤å� çª—å�£ä¸”å·²é�™é»˜ z.1fu.   sï¼Œæ��å‰�ç»“æ�Ÿæœ¬æ¬¡ç­‰å¾…ï¼ˆè¿›å…¥é‡�å�‘ï¼‰r  )rD   rú  zRX-LOCALu    å‘½ä¸­ä¸ŠæŠ¥å¸§ï¼ˆæœ¬è¡¨+DI=zRX-645r�  r�  u    å†…å±‚645åº”ç­” DI=)r¾  r  r  rü  r"  r¶  rÀ  ro   r,  rÀ  r¬  rp  r  rc  r7   r-   r9   r6  rÁ  rj  r÷  râ  rý  r4  r0  r  Úminr
  rn  r  rÙ  )r    rã  rd  r[  rD   r  rû  Úis_errr  r  Úlast_frame_atÚ
saw_replayr3  r  r
  s                  r!   Ú	_exchangezFreezeReadSession._exchange»  s!  € ð Œ>Ð!ÝÐ4Ñ5Ô5Ð5ð ”×(Ò(¨Ñ.Ô.ˆØÐ &Ô"<Ðð ŒI�NŠNð Nñ Oô Oð OàŒI�MŠM˜.¨&¬,Ð8cÑdÔdÐdØˆFØÐØŒJÐ!Ô! QÑ&Ð!Ô!Ø”\¨Ð-ÐP°&´,Ô2PˆFØ4:ÐHÐ0Ð0ÀˆDØŒI�NŠNð ]ÍeÐTXÔT]ÔT`ÑNaÔNað ]ð ]Ø"&¤)¤,ð]ð ]Ø59ð]ð ]ð ]ñ ^ô ^ð ^àŒI�MŠM˜.¨&¬,¸5Ð8[Ð8[Ð8[Ñ\Ô\Ð\Ø”<Ðð 	Œ	�Š�j %ØÐjÐj G¨a¡KÐjÐjÐPTÔPXÐ[aÑPaÐjÐjÐjÐjñ	lô 	lð 	làŒ	�ŠÐ8¨eÐ8Ð8Ð8Õ:NÈuÐaeÐ:fÑ:fÔ:fÑgÔgÐgØŒ	�Š�h  b¨¨e°B¬i©Ð&7Ô 8ØÐEÐEµH¸U±O´OÐEÐEñ	Gô 	Gð 	GàŒ×Ò˜EÑ"Ô"Ð"à"&ˆŒÔÝ”9‘;”; Ñ(ˆØ)-ˆØˆ
ð	Ý”)‘+”+ˆCØ�hŠˆØ”	—’Ðn°gÐnÐnÐnÐSWÔS\ÔS_ÐnÐnÐnÑoÔoÐoØ�tð ð ˜tÔ0°1Ò4Ð4¸Ô9IÈGÒ9SÐ9SØ%Ð1Ø˜mÑ+¨tÔ/@Ò@Ð@Ø”	—’ð  MÐQTÐWdÑQdÐnð  Mð  Mð  Mñ Nô Nð Nà�tà”i—n’n T°ÅÀSÈ(ÐUXÉ.ÑAYÔAY�nÑZÔZˆGØŒ{Ð&Ø”k�Ø”	—’˜j¨#°%Ð/gÐ/gÐVZÔV_ÔVbÐ/gÐ/gÐ/gÑhÔhÐhØ”	—’˜h¨¨B¨r°C¸´G©|¨OÔ(<Ø!&Ð_Ð_½KÈÈBÈrÐTWÐXZÔT[É|ÈOÔH\Ñ<]Ô<]Ð_Ð_ñaô að aà�
ØÔ%ð ,Ø!�
Ý $¤	¡¤�àÔ$ð Ø�tñ5	r#   ro   rR   c                ó\  — t          |j        |j        j        |j        j        |j        j        ||¬¦  «        }	 | j                             |¦  «        }n4# t          $ r'}t          j        |_        d|› �|_        |cY d }~S d }~ww xY w||_        |j        du r+t          j        |_        d|j        › d|j        › d�|_        |S |j        du r-t          j        |_        d|j        d›d|j        d›d�|_        |S |j        st          j        |_        d	|_        |S |j        |_        | j                             d
|j        j        › d|j        j        › d�t3          |d¬¦  «        ¦  «         	 | j                             |j        ¦  «        }n4# t          $ r'}t          j        |_        d|› �|_        |cY d }~S d }~ww xY w||_        |j        |_        |j        |_        |j        s-t          j        |_        d|j        d›d|j        d›d�|_        |S |j        r-t          j         |_        |j!        |_"        |j#        pd|_        |S |j$        tJ          j&        u r!t          j        |_        |j#        pd|_        |S t          j'        |_        |j(        |_(        |j)        s|j)        |_)        |S )N)r9   rS   r-   rT   rW   rX   u   æœ¬åœ°è§„çº¦è§£æž�å¤±è´¥: Fu   æœ¬åœ°è§„çº¦ L æ ¡éªŒå¤±è´¥(L=u	   , åº”ä¸º rC   u    æœ¬åœ°è§„çº¦ CS æ ¡éªŒå¤±è´¥(CS=r=  u    ä¸ŠæŠ¥å¸§ä¸�å�« 645 å†…å±‚æ•°æ�®u"   <<< ä¸Šè¡ŒæŠ¥æ–‡é€�å­—æ®µè§£æž�ï¼ˆr*  rî  Tr¾  u   645 è§£æž�å¤±è´¥: u   645 CS æ ¡éªŒå¤±è´¥(CS=u   645 å¼‚å¸¸åº”ç­”u   645 åº”ç­”æ•°æ�®å¼‚å¸¸)*rR   r9   r6   r   r7   r-   r   r9  rþ   rÂ  rI   rM   rU   r[   r^   r{  r¿   rq  r  r  r  rp  r]   r¶  r6  rÁ  r¹  r_   ra   rñ   rb   r  rO   r
  rZ   r  r  rË   rÓ   rJ   r.   rT   )r    rã  ro   r  r   r­  rÄ  rp  s           r!   Úparse_replyzFreezeReadSession.parse_reply	  sù  € Ý˜4œ8°´
´Øœ)œ,°´	Ô0EØ #¨Wð6ñ 6ô 6ˆð	ØÔ$×*Ò*¨3Ñ/Ô/ˆEˆEøÝð 	ð 	ð 	Ý!Ô+ˆAŒHØ9°aÐ9Ð9ˆAŒJØˆHˆHˆHˆHˆHˆHøøøøð	øøøð ˆŒàŒ?˜eÐ#Ð#Ý!Ô+ˆAŒHØe¸%¼,ÐeÐeÐQVÔQbÐeÐeÐeˆAŒJØˆHØÔ Ð%Ð%Ý!Ô+ˆAŒHð?¸U¼^ÐSð ?ð ?Ø$)Ô$7Ð>ð?ð ?ð ?ˆAŒJàˆHØŒ{ð 	Ý!Ô+ˆAŒHØ;ˆAŒJØˆHà”kˆŒØŒ	�ŠÐi¸T¼Z¼_ÐiÐiÈtÌyÔOdÐiÐiÐiÝ,¨S¸TÐBÑBÔBñ	Dô 	Dð 	Dð	Ø”K×%Ò% e¤kÑ2Ô2ˆEˆEøÝð 	ð 	ð 	Ý!Ô+ˆAŒHØ1¨aÐ1Ð1ˆAŒJØˆHˆHˆHˆHˆHˆHøøøøð	øøøð ˆŒØ”<ˆŒØœˆŒàÔ ð 	Ý!Ô+ˆAŒHð?°E´NÐJð ?ð ?Ø$)Ô$7Ð>ð?ð ?ð ?ˆAŒJàˆHð Ô"ð 	Ý!Ô-ˆAŒHØÔ)ˆAŒJØÔ)Ð?Ð-?ˆAŒJØˆHàŒ:�Ô,Ð,Ð,Ý!Ô+ˆAŒHØÔ)ÐEÐ-EˆAŒJØˆHå”=ˆŒØ”+ˆŒØŒyð 	&ØœˆAŒIØˆs;   ºA Á
BÁBÁ;BÂBÅ-F Æ
F>ÆF9Æ3F>Æ9F>c           
     óÔ   — | j         j        }|�d|j        › d|j        d›d�}nd}t	          |j        |j        j        |j        j	        |j        j
        t          j        |||¬¦  «        S )u]   ä¸¤ç§�ã€Œæ²¡æœ‰æ•°æ�®ã€�çš„è®°è´¦ï¼šæ¨¡å�—æ˜Žç¡®æŠ¥äº†ä»»åŠ¡çŠ¶æ€�å¤±è´¥ / çº¯è¶…æ—¶æ— åº”ç­”Nu   æ¨¡å�—ä¸ŠæŠ¥ä»»åŠ¡çŠ¶æ€� rê  r=  u   )ï¼Œæ—  645 æ•°æ�®åº”ç­”u   è¶…æ—¶/æœªæ”¶åˆ°æœ¬é¡¹ä¸ŠæŠ¥å¸§)r9   rS   r-   rT   rU   rV   rX   r[   )r  râ  r†  rƒ  rR   r9   r6   r   r7   r-   r   rI   rP   )r    rã  rd  r  Úfailedr[   s         r!   Ú_no_responsezFreezeReadSession._no_responseD	  s‹   € à”Ô(ˆØÐðO°FÔ4Fð Oð OØ$Ô0ÐNðOð Oð OˆHˆHð 9ˆHÝ˜dœh°4´:´?Ø!œYœ\°4´9Ô3HÝ!+Ô!7ÀØ")°Hð>ñ >ô >ð 	>r#   c                ó6  — |                       |¦  «        d         }d|j        j        › d|j        j        › d|j        j        › d�}| j                             ¦   «          d }t          | j	        dz   ¦  «        D ]è}|dk    rXt          j        | j        ¦  «         | j                             d|› d	| j	        › d
�¦  «         | j                             ¦   «          |                      ||| j        ||¬¦  «        }|€|                      |||¦  «        }Œ™|                      |||¦  «        }||_        |j        t*          j        u r n|j        t*          j        u r	| j        s nŒé|€J ‚| j                             |¦  «         | j                             |¦  «         |S )Nr­  õ   è¡¨=r*  rŽ  rC   r|   r   u       [é‡�è¯• ú/r�  )r[  rD   r  )rK  r6   r   r7   r   r-   r  r  r  r0  rý  r  r
  r¶  rÀ  rQ  r[  rV  rS  rV   rU   rI   rJ   rO   r1  r  rÿ  ra   )r    rã  rd  rD   Úlastr  ro   s          r!   Úread_onezFreezeReadSession.read_oneS	  s©  € Ø×!Ò! $Ñ'Ô'¨Ô0ˆØP�t”z”ÐPÐP¨¬Ô)>ÐPÐPÀÄÄÐPÐPÐPˆð 	Œ	�ŠÑÔÐà%)ˆÝ˜TÔ-°Ñ1Ñ2Ô2ð 	ð 	ˆGØ˜Š{ˆ{Ý”
˜4Ô.Ñ/Ô/Ð/Ø”	—’ÐK¨gÐKÐK¸Ô8HÐKÐKÐKÑLÔLÐLØ”	—’Ñ!Ô!Ð!à—.’.  u°d´lØ',°gð !ñ ?ô ?ˆCàˆ{Ø×(Ò(¨¨u°gÑ>Ô>�Øà×#Ò# D¨#¨wÑ7Ô7ˆDØ ˆDŒLØŒ{�jœmÐ+Ð+Ø�àŒ{�jÔ4Ð4Ð4¸TÔ=VÐ4Ø�øàÐÐÐØŒ×Ò˜TÑ"Ô"Ð"ØŒ	×Ò˜ÑÔÐØˆr#   r6   r   úOptional[Sequence[DataItem]]rs   c                óD
  — |�t          |¦  «        nt          | j        | j        ¦  «        }t	          |¬¦  «        }| j                             d|j        pd› d|j        › dt          |¦  «        › d�¦  «         | j                             dt          |                     ¦   «         ¦  «        › �¦  «         d	}	 t          |¦  «        D �]É\  }}| j        d
z   dz  | _        | j        d
z   dz  | _        | j        d	k    rd
| _        t          ||| j        ¬¦  «        }| j                             d|j        › d�¦  «         |                      |¦  «        }|j                             |¦  «         |                      |¦  «         |j        t,          j        u rd	n|d
z   }| j                             |j        |¦  «        sŒõ||d
z   d…         }	| j                             |j        |¦  «        }
|j        rd|j        › d�nd}| j                             dt          |	¦  «        › d|
› |› d�¦  «         |	rÎ| j                             d|	d	         j        › dt;          |	d	         j        ¦  «        › d|	d         j        › dt;          |	d         j        ¦  «        › dt          |	¦  «        › d�¦  «         | j                             ddd|j        › d|	d	         j        › d|	d         j        › d t          |	¦  «        › d�	¦  «         |	D ]P}|j                             t?          |j         |j        |j        |j        t,          j!        |
› d!�¬"¦  «        ¦  «         ŒQ| j"         #                    |j        |	¦  «         d#|_$        |
› |› d$|d
z   › d%|j        › d�|_%         ný# tL          $ rð d#| j'        _(        t          |j        ¦  «        }||d…         }	|	D ]P}|j                             t?          | j        dz  |j        |j        |j        t,          j!        d&¬"¦  «        ¦  «         ŒQ| j"         #                    |j        |	¦  «         d#|_$        d'|› d(t          |¦  «        › d�|_%        | j                             d)t          |¦  «        |z
  › d*�¦  «         Y nw xY w| j)         *                    d+¬,¦  «         | j                             d-|j        › d.|j+        › |j$        rd/tY          |j-        ¦  «        z   dz   nd› d0| j'        j.        › d1| j'        j/        › d2| j'        j0        › d3�¦  «         |S )4u  
        æŠ„ä¸€å�ªè¡¨çš„å…¨éƒ¨å†»ç»“é¡¹ï¼Œè¿”å›žè¯¥è¡¨æŠ¥å‘Šã€‚

        æ³¨æ„�ï¼šCSV ç”± run() åœ¨å…¨éƒ¨è¡¨æŠ„å®Œã€�æœ€å�Žä¸€è½®è¡¥æŠ„æ”¶å¹²ä¹‹å�Žç»Ÿä¸€è�½ç›˜
        ï¼ˆè¿™æ ·è¡¥æŠ„å›žå¡«çš„ç»“æžœæ‰�ä¼šä½“çŽ°åœ¨ CSV é‡Œï¼‰ï¼›ç›´æŽ¥è°ƒç”¨æœ¬æ–¹æ³•ä¸�å†™ CSVã€‚
        N)r6   u   
===== å¼€å§‹æŠ„è¯» [r   r*  u   ] å…± u    é¡¹å†»ç»“æ•°æ�® =====u(         è¡¨åœ°å�€ ADST(ä½Žå­—èŠ‚åœ¨å‰�) = r   r|   r¤   rë  )r6   r7   r9   z--- z ---rŽ  rC   u       âœ˜ æ”¾å¼ƒæœ¬è¡¨å‰©ä½™ u.    é¡¹ã€Œä¸Šxæ¬¡å†»ç»“æ•°æ�®ã€� â€”â€” åŽŸå› ï¼šu   ï¼Œåˆ‡æ�¢åˆ°ä¸‹ä¸€å�ªè¡¨u         æ”¾å¼ƒåŒºé—´ï¼šDI rï  z) ~ DI r   u   )ï¼Œå…± rB  zGIVE-UPr#   rX  u    æ”¾å¼ƒ DI ú~u    å…± u   ï¼Œæ”¾å¼ƒæŠ„è¯»)r9   rS   r-   rT   rU   r\   Tu    @ ä¸Šrì  u   æ‰‹åŠ¨ä¸­æ–­ï¼ˆCtrl-Cï¼‰u$   æ‰‹åŠ¨ä¸­æ–­ï¼ˆCtrl-Cï¼‰@ å·²å¤„ç�† rY  u%       â�¹ æ”¶åˆ° Ctrl-Cï¼šæœ¬è¡¨å‰©ä½™ u:    é¡¹ä»¥ SKIPPED è®°è´¦ï¼Œå�œæ­¢å�Žç»­ç”µè¡¨å¹¶æ”¶å°¾è�½ç›˜r+  ©rú  u   ===== æŠ„è¯»ç»“æ�Ÿ [u   ]ï¼šæˆ�åŠŸ u   ï¼Œå·²æ”¾å¼ƒå‰©ä½™ u    | è¡¥æŠ„å›žå¡« u    é¡¹ | å‘½ä¸­ç¼“å­˜ u    æ¬¡ | å¿½ç•¥å›žæ”¾é‡�å¤�å¸§ u
    å¸§ =====)1r‡   r&  r2  r3  rs   r¶  rÀ  r   r   r   r/  r"   Ú	enumerater:  r;  r5   rD   r[  rv   rF  Ú
log_resultrU   rI   rJ   r.  r’   r•   r[   r-   rc  ro   rR   r9   rN   r  r  rw   rx   ÚKeyboardInterruptrÀ  r®  r  r  rƒ   r   r†   rª  r¬  r«  )r    r6   r   r›  r�   Úidxr7   rã  r   Úrestr•   ÚdetailÚitÚdones                 r!   Ú
read_meterzFreezeReadSession.read_meterv	  sU  € ð  %Ð0•�U‘”�Õ6GØÔ˜tœñ70ô 70ˆå 5Ð)Ñ)Ô)ˆàŒ	�Šð A°Ô0AÐ0GÀRð Að AÈ%Ì*ð Að AÝ! %™jœjðAð Að Añ 	Bô 	Bð 	BàŒ	�ŠÐ]Å'È%Ï.Ê.ÑJZÔJZÑB[ÔB[Ð]Ð]Ñ^Ô^Ð^àˆð9	AÝ& uÑ-Ô-ð 'ñ '‘	��TØ!œY¨™]¨dÑ2�”	Ø!%¤°Ñ!2°fÑ <�”Ø”= AÒ%Ð%Ø$%�D”MÝ e°$¸D¼MÐJÑJÔJ�à”	—’Ð6 d¤jÐ6Ð6Ð6Ñ7Ô7Ð7Ø—M’M $Ñ'Ô'�Ø”×%Ò% aÑ(Ô(Ð(Ø—’ Ñ"Ô"Ð"ð  œh­*¬-Ð7Ð7˜˜¸VÀa¹Z�ð ”{×/Ò/°´¸&ÑAÔAð Øà˜S 1™W˜X˜X”�Øœ×+Ò+¨A¬H°fÑ=Ô=�Ø./¬jÐ@Ð*˜QœZÐ*Ð*Ð*Ð*¸b�Ø”	—’ð  \½SÀ¹Y¼Yð  \ð  \Ø39ð \Ø;Að \ð  \ð  \ñ ]ô ]ð ]àð :Ø”I—N’Nð $h¸dÀ1¼g¼jð $hð $hÍeÐTXÐYZÔT[ÔT^ÑN_ÔN_ð $hð $hØ+/°¬8¬;ð$hð $hÝ<AÀ$ÀrÄ(Ä+Ñ<NÔ<Nð$hð $hÝX[Ð\`ÑXaÔXað$hð $hð $hñ iô ið ià”I—M’M )¨Sð#9¨¬ð #9ð #9ÀÀQÄÄ
ð #9ð #9ÈTÐRTÌXÌ[ð #9ð #9Ý),¨T©¬ð#9ð #9ð #9ñ:ô :ð :ð ð :ð :�BØ”N×)Ò)­*Ø œH°´ÀÄØ "¤µzÔ7IØ &Ð7Ð7Ð7ð+9ñ +9ô +9ñ :ô :ð :ð :ð
 ”×#Ò# E¤J°Ñ5Ô5Ð5Ø!%�”Ø)/Ð&Y°Ð&YÐ&Y¸sÀQ¹wÐ&YÐ&YÈtÌwÐ&YÐ&YÐ&Y�Ô#Øøøå ð 	Að 	Að 	Að &*ˆDŒJÔ"Ý�v”~Ñ&Ô&ˆDØ˜˜˜”<ˆDØð 6ð 6�Ø”×%Ò%¥jØœ¨Ñ.¸5¼:È"Ì%ØœNµ:Ô3EØ3ð'5ñ '5ô '5ñ 6ô 6ð 6ð 6ð ŒK×Ò ¤
¨DÑ1Ô1Ð1Ø!ˆFŒNØ"`ÈÐ"`Ð"`ÕPSÐTYÑPZÔPZÐ"`Ð"`Ð"`ˆFÔØŒI�NŠNð @Å3ÀuÁ:Ä:ÐPTÑCTð @ð @ð @ñ Aô Að Að Að Að	Aøøøð$ 	Œ	�Š ˆÑ%Ô%Ð%ØŒ	�Šð U¨e¬jð Uð UÀVÄ_ð UØX^ÔXfÐnÐ/µ#°fÔ6JÑ2KÔ2KÑKÈfÑTÐTÐlnðUð Uà*.¬*Ô*>ðUð Uð +/¬*Ô*?ðUð Uð 48´:Ô3Hð	Uð Uð Uñ 	Vô 	Vð 	Vð
 ˆs   Â8KN ÎC7RÒRr   c                óô  — |j         }|j        t          j        u �rÔ| j                             d|j        › d�¦  «         | j                             d|j        › �¦  «         | j                             d|j        › d|j	        › d�¦  «         |�rt          |¦  «        dk    rõ| j                             d|j        › �¦  «         | j                             d	|j        › d
�¦  «         | j                             d|j        › d
�¦  «         | j                             dt          |¦  «        › �¦  «         | j                             dt          |dd…         ¦  «        › dt          |dd…         ¦  «        › dt          |dd…         ¦  «        › �¦  «         n"| j                             d|j        › �¦  «         |j        r/| j                             dt          |j        ¦  «        › �¦  «         nî| j                             d|j        j        › d|j        › d�¦  «         |j        �,| j                             d|j        d›d|j        › �¦  «         n)|j        r"| j                             d|j        › �¦  «         |r*| j                             dt          |¦  «        › �¦  «         |j        r/| j                             dt          |j        ¦  «        › �¦  «         | j                             d¦  «         d S )Nu       âœ” æˆ�åŠŸ (é‡�è¯• u    æ¬¡)u       è¡¨å�·: z
    DI:   rB   rC   r<   u       å†»ç»“æ—¶é—´: u       æ­£å�‘æ€»ç”µèƒ½: rT  u       å��å�‘æ€»ç”µèƒ½: u       å†»ç»“å�—åŽŸå§‹ 16B : u         æ—¶é—´[0:6]=r   r;   u     æ­£å�‘[6:11]=ró   u     å��å�‘[11:16]=u       æ•°æ�®: u       645 åº”ç­”æŠ¥æ–‡: u       âœ˜ u	    (é‡�è¯• u       é”™è¯¯ç �: 0xr=  r*  u       é”™è¯¯: r   )rp   rU   rI   rJ   r¶  rÀ  rX   rS   r-   rT   r   ri   rk   rm   r/  r.   r]   rZ   r[   )r    r   r�  s      r!   ra  zFreezeReadSession.log_resultË	  sþ  € ØŒnˆàŒ8•z”}Ð$Ñ$ØŒI�NŠNÐE°Q´YÐEÐEÐEÑFÔFÐFØŒI�NŠNÐ8¨!¬,Ð8Ð8Ñ9Ô9Ð9ØŒI�NŠNÐ<¨¬Ð<Ð<°´	Ð<Ð<Ð<Ñ=Ô=Ð=Øñ 	9•s˜3‘x”x 2’~�~Ø”	—’ÐC°A´MÐCÐCÑDÔDÐDØ”	—’ÐG°q´zÐGÐGÐGÑHÔHÐHØ”	—’ÐF°q´yÐFÐFÐFÑGÔGÐGØ”	—’ÐJ½GÀC¹L¼LÐJÐJÑKÔKÐKØ”	—’ð  FµG¸CÀÀ!À¼HÑ4EÔ4Eð  Fð  FÝ/6°s¸1¸R¸4´yÑ/AÔ/Að Fð  Få07¸¸B¸r¸E¼
Ñ0CÔ0Cð Fð  Fñ Gô Gð Gð Gð ”	—’Ð7¨a¬gÐ7Ð7Ñ8Ô8Ð8ØŒ{ð PØ”	—’ÐN½ÀÄÑ8LÔ8LÐNÐNÑOÔOÐOøàŒI�NŠNÐO a¤h¤nÐOÐO¸q¼yÐOÐOÐOÑPÔPÐPØŒzÐ%Ø”	—’ÐP°1´:ÐPÐPÐPÀAÄJÐPÐPÑQÔQÐQÐQØ”ð <Ø”	—’Ð:¨a¬jÐ:Ð:Ñ;Ô;Ð;Øð LØ”	—’ÐJ½GÀC¹L¼LÐJÐJÑKÔKÐKØŒ{ð PØ”	—’ÐN½ÀÄÑ8LÔ8LÐNÐNÑOÔOÐOØŒ	�Š�rÑÔÐÐÐr#   úList[MeterReport]c                ó¸  — |�t          |¦  «        nt          | j        | j        ¦  «        }|                      ||¦  «         g }	 t          |d¦  «        D ]õ\  }}| j                             d|› dt          |¦  «        › d|j	        pd› d|j
        › d�	¦  «         	 |                     |                      ||¦  «        ¦  «         n]# t          $ rP}| j                             d	|› d
�¦  «         |                     t          |dd|› �¬¦  «        ¦  «         Y d}~nd}~ww xY w| j        j        r| j                             d¦  «          nŒö| j                             d¬¦  «         |D ]}| j                             |¦  «         Œn?# | j                             d¬¦  «         |D ]}| j                             |¦  «         Œw xY w|                      |¦  «         |S )uÚ   
        æŒ‰é¡ºåº�æŠ„å¤šå�ªè¡¨ï¼›å�•è¡¨å¼‚å¸¸/æ”¾å¼ƒéƒ½ä¸�å½±å“�å�Žç»­ç”µè¡¨ã€‚
        å››ä»½æ—¥å¿—åœ¨æŠ„è¯»è¿‡ç¨‹ä¸­é€�è¡Œ flushï¼›CSV åœ¨æœ¬æ–¹æ³•æœ«å°¾ç»Ÿä¸€è�½ç›˜ï¼ˆå�«è¡¥æŠ„å›žå¡«å�Žçš„æœ€ç»ˆç»“æžœï¼‰ã€‚
        Nr|   z
>>>>>>>>>> [rY  r…  r   r*  z <<<<<<<<<<u*       !! è¯¥è¡¨æŠ„è¯»è¿‡ç¨‹ä¸­å‡ºçŽ°å¼‚å¸¸: u   ï¼Œè·³è¿‡å¹¶ç»§ç»­ä¸‹ä¸€å�ªè¡¨Tu   å¼‚å¸¸: )r6   rw   rx   u2       â�¹ å·²æ‰‹åŠ¨ä¸­æ–­ï¼šä¸�å†�æŠ„è¯»å�Žç»­ç”µè¡¨r+  r_  )r‡   r&  r2  r3  rE  r`  r¶  rÀ  r   r   r   rF  rh  rÂ  rs   rÀ  r®  r  r  r¡  rô  Úprint_summary)r    r=  r   Úreportsr¹  r6   rÄ  r›  s           r!   ÚrunzFreezeReadSession.runë	  so  € ð  %Ð0•�U‘”�Õ6GØÔ˜tœñ70ô 70ˆà�Š˜ Ñ&Ô&Ð&à%'ˆð	'Ý% f¨aÑ0Ô0ð ð ‘��5Ø”	—’ð  T°ð  Tð  TµC¸±K´Kð  Tð  TØ"'Ô"3Ð"9°rð Tð  TØ<A¼Jð Tð  Tð  Tñ Uô Uð UðMØ—N’N 4§?¢?°5¸%Ñ#@Ô#@ÑAÔAÐAÐAøÝ ð Mð Mð Mà”I—N’NÐ#qÐPQÐ#qÐ#qÐ#qÑrÔrÐrØ—N’N¥;°UÀDØ<JÀq¸N¸Nð$Lñ $Lô $Lñ Mô Mð Mð Mð Mð Mð Mð MøøøøðMøøøð
 ”:Ô)ð Ø”I—N’NÐ#WÑXÔXÐXØ�Eðð ŒI�OŠO SˆOÑ)Ô)Ð)Ø!ð 'ð '�Ø”—’˜vÑ&Ô&Ð&Ð&ð'øð ŒI�OŠO SˆOÑ)Ô)Ð)Ø!ð 'ð '�Ø”—’˜vÑ&Ô&Ð&Ð&ð'øøøà×Ò˜7Ñ#Ô#Ð#Øˆs8   ÁAF Â)CÃF Ã
DÃADÄF ÄDÄ,F Æ<Grm  úSequence[MeterReport]c           	     ó  — | j                              d¦  «         | j                              d¦  «         dx}}t          |d¦  «        D �]\  }}t          d„ |j        D ¦   «         ¦  «        }t          d„ |j        D ¦   «         ¦  «        }t          d„ |j        D ¦   «         ¦  «        }|j        }	||j        z  }||	z  }d|› d	|j        j        › d
|j        j	        › d|j        › �}
|r|
d|› �z  }
|r|
d|› �z  }
|r|
d|› �z  }
|	r|
d|	› �z  }
| j                              |
¦  «         |j
        r"| j                              d|j        › �¦  «         �Œ
| j                              d¦  «         | j                              d|› d|› d�¦  «         | j        j        r| j                              d¦  «         | j                              d| j        j        › d| j        j        › d| j        j        › d�¦  «         | j                              d| j        j        › d| j        dk    r
d| j        z  nd› d�¦  «         | j                              d¦  «         | j                              d | j         j        › �¦  «         | j                              d!| j         j        › �¦  «         | j                              d"| j         j        › �¦  «         | j                              d#| j        j        › �¦  «         | j                              d$¦  «         d S )%NzG
======================================================================u:   ================ å…¨éƒ¨æŠ„è¯»ç»“æžœæ±‡æ€» ================r   r|   c              3  ó@   K  — | ]}|j         t          j        u ¯d V — ŒdS r{   )rU   rI   rO   r}   s     r!   r€   z2FreezeReadSession.print_summary.<locals>.<genexpr>
  ó1   è è € ÐSÐS˜A°´½JÔ<RÐ0RÐ0R�aÐ0RÐ0RÐ0RÐ0RÐSÐSr#   c              3  ó@   K  — | ]}|j         t          j        u ¯d V — ŒdS r{   )rU   rI   rM   r}   s     r!   r€   z2FreezeReadSession.print_summary.<locals>.<genexpr>
  s1   è è € ÐQÐQ˜A°´½JÔ<PÐ0PÐ0P�aÐ0PÐ0PÐ0PÐ0PÐQÐQr#   c              3  ó@   K  — | ]}|j         t          j        u ¯d V — ŒdS r{   )rU   rI   rP   r}   s     r!   r€   z2FreezeReadSession.print_summary.<locals>.<genexpr>
  rr  r#   rA  z. r*  u
   ï¼šæˆ�åŠŸ u   ï¼Œé”™è¯¯å¸§ u
   ï¼Œå��å¸§ u   ï¼Œæ— åº”ç­” u
   ï¼Œæ”¾å¼ƒ u/          â””â”€ å·²æ”¾å¼ƒæœ¬è¡¨å‰©ä½™å†»ç»“é¡¹ï¼šz4  --------------------------------------------------u     å�ˆè®¡ï¼šæˆ�åŠŸ u    é¡¹ï¼Œå› æ”¾å¼ƒæœªæŠ„è¯» rB  uZ     âš  æœ¬æ¬¡è¿�è¡Œè¢«æ‰‹åŠ¨ä¸­æ–­ï¼ˆCtrl-Cï¼‰ï¼šå·²æŠ„å›žçš„æ•°æ�®ä¸ŽæœªæŠ„é¡¹å�‡å·²è�½ç›˜u     åº”ç­”å½’å±žï¼šè¡¥æŠ„å›žå¡« u     é¡¹ï¼Œå‘½ä¸­å»¶è¿Ÿåº”ç­”ç¼“å­˜ u    æ¬¡ï¼Œå¿½ç•¥å›žæ”¾é‡�å¤�å¸§ u    å¸§u.     ç¡®è®¤å¸§    ï¼šå·²å¯¹æ¨¡å�—ä¸ŠæŠ¥å›žç¡®è®¤ u    æ�¡ï¼ˆSEQ ä¸Žä¸ŠæŠ¥å¸§ä¸€è‡´u   ï¼Œå�Œ SEQ åŽ»é‡� %gsu   ï¼Œæ¯�æ¬¡éƒ½å›žrî  u     æ—¥å¿—è�½ç›˜ï¼šu$       ä¸»æ—¥å¿—(å�«é€�å­—æ®µæŠ¥æ–‡) : u!       åŽŸå§‹æŠ¥æ–‡æµ�æ°´(TX/RX)  : u"       å†»ç»“æ•°æ�®å�—æ˜Žç»†       : u$       ä¸šåŠ¡æ•°æ�®è¡¨(é€—å�·åˆ†éš”) : zG======================================================================
)r¶  rÀ  r`  r‚   rv   r†   rƒ   r6   r   r   rw   rx   rÀ  r®  rª  r¬  r«  r­  r6  rq  rr  rs  r¡  ry  )r    rm  Útotal_okÚ
total_skipr¹  ÚrepÚerrÚbadÚnorÚskipr  s              r!   rl  zFreezeReadSession.print_summary
  sŠ  € ØŒ	�Š�Ñ'Ô'Ð'ØŒ	�ŠÐSÑTÔTÐTØ !Ð!ˆ�:Ý ¨Ñ+Ô+ð 	eñ 	e‰FˆAˆsÝÐSÐS ¤ÐSÑSÔSÑSÔSˆCÝÐQÐQ ¤ÐQÑQÔQÑQÔQˆCÝÐSÐS ¤ÐSÑSÔSÑSÔSˆCØÔ$ˆDØ˜œÑ$ˆHØ˜$ÑˆJà]˜Ð]Ð]˜SœYœ^Ð]Ð]¨c¬iÔ.CÐ]Ð]ÈsÌ|Ð]Ð]ˆDØð .ØÐ-¨Ð-Ð-Ñ-�Øð +ØÐ* SÐ*Ð*Ñ*�Øð .ØÐ-¨Ð-Ð-Ñ-�Øð ,ØÐ+ TÐ+Ð+Ñ+�ØŒI�NŠN˜4Ñ Ô Ð ØŒ{ð eØ”	—’ÐcÐQTÔQaÐcÐcÑdÔdÐdùØŒ	�ŠÐMÑNÔNÐNØŒ	�ŠÐ`¨HÐ`Ð`ÐPZÐ`Ð`Ð`ÑaÔaÐaØŒ:Ô!ð 	yØŒI�NŠNÐwÑxÔxÐxØŒ	�Šð L¸¼
Ô8Lð Lð LØ37´:Ô3HðLð Là04´
Ô0EðLð Lð Lñ 	Mô 	Mð 	Mð 	Œ	�Šð uÈÌ
ÔH]ð uð uàFJÄnÐWXÒFXÐFXÐ1°D´NÑBÐBÐ^oðuð uð uñ 	vô 	vð 	vð 	Œ	�ŠÐ*Ñ+Ô+Ð+ØŒ	�ŠÐR¸d¼iÔ>PÐRÐRÑSÔSÐSØŒ	�ŠÐS¸4¼9Ô;QÐSÐSÑTÔTÐTØŒ	�ŠÐW¸D¼IÔ<UÐWÐWÑXÔXÐXØŒ	�ŠÐM¸d¼h¼mÐMÐMÑNÔNÐNØŒ	�Š�Ñ'Ô'Ð'Ð'Ð'r#   c                ó8   — | j                              ¦   «          dS )u-   å…³é—­æ—¥å¿—å�¥æŸ„ï¼ˆå†…å®¹å·²é€�è¡Œ flushï¼‰N)r¶  ré  r   s    r!   ré  zFreezeReadSession.close7
  s   € àŒ	�ŠÑÔÐÐÐr#   )r)  NNNNr*  rô   r+  Fr|   r¤   rÍ  Tr½  T)rD  r   r¾  r¿  r¶  r,  r¡  r-  r.  r/  r[  rÓ  r0  r8   r
  rÓ  r1  r/   r2  r8   r3  r8   r4  rÓ  r5  r/   r6  rÓ  rÕ  r/   )r=  r>  r   r  r   rÜ  )r   r   r   rA  )rã  r5   r   rH  )r   r   )rã  r5   rd  r   r[  rÓ  rD   r   r  r8   r   r}  )rã  r5   ro   r   r  r8   r   rR   )rã  r5   rd  r   r  r8   r   rR   )rã  r5   r   rR   rd   )r6   r   r   r\  r   rs   )r   rR   r   rÜ  )r=  r>  r   r\  r   rj  )rm  ro  r   rÜ  r%  )r%   r&   r'   r(   r    rE  rG  rK  rQ  rS  rV  r[  rh  ra  rn  rl  ré  r*   r#   r!   r(  r(  F  s†  € € € € € ðð ð$ #1Ø26Ø+/Ø,0Ø15Ø"&Ø$%Ø),Ø.3Ø%&Ø#&Ø'*Ø%)Ø$'Ø!%ð/=ð /=ð /=ð /=ð /=ðd!ð !ð !ð !ð<ð ð ð ð.ð .ð .ð .ð 34ðEð Eð Eð Eð EðP?ð ?ð ?ð ?ðB>ð >ð >ð >ð ð  ð  ð  ðH :>ðSð Sð Sð Sð Sðjð ð ð ðB 37ð!ð !ð !ð !ð !ðF'(ð '(ð '(ð '(ðRð ð ð ð ð r#   r(  ÚCOM4rË  rÌ  r)  Ú260498001817u   1# è¡¨zread_freeze.txtzraw_frames.txtzfreeze_blocks.txtzfreeze_data.txt)rq  rr  rs  Úcsv_pathÚ*681500C00503050505E80300171800980426FFB216c                óÒ   — | pd                      ¦   «                              ¦   «         }t          |¦  «        dk    st          d„ |D ¦   «         ¦  «        rt	          d| ›�¦  «        ‚|S )uZ   ç”µè¡¨åœ°å�€å¿…é¡»æ˜¯ 12 ä½�å��å…­è¿›åˆ¶ BCDï¼ˆå¦‚ 260498001817ï¼‰ï¼Œé”™äº†ç«‹åˆ»æŠ¥å‡ºæ�¥r   r   c              3  ó   K  — | ]}|d vV — Œ	dS )Ú0123456789abcdefNr*   )r~   Úcs     r!   r€   z'_validate_meter_addr.<locals>.<genexpr>X
  s(   è è € ÐBÐB¸1˜1Ð$6Ð6ÐBÐBÐBÐBÐBÐBr#   uI   ç”µè¡¨åœ°å�€å¿…é¡»æ˜¯ 12 ä½�å��å…­è¿›åˆ¶ï¼ˆå¦‚ 260498001817ï¼‰ï¼Œå®žé™…: )rÌ  Úlowerr   Úanyr   )r   r{  s     r!   Ú_validate_meter_addrr‡  U
  sj   € à	ˆ�×ÒÑÔ×"Ò"Ñ$Ô$€AÝ
ˆ1�v„v�‚|€|•sÐBÐBÀÐBÑBÔBÑBÔB€|ÝÐmÐeiÐmÐmÑnÔnÐnØ€Hr#   c                 ó”  — dd l } |                      d| j        ¬¦  «        }|                     dt          d¬¦  «         |                     dt
          t          d¬	¦  «         |                     d
dd d¬¦  «         |                     ddt
          dd¬¦  «         |                     ddt
          dd¬¦  «         |                     dt          dd¬	¦  «         |                     dt
          dd¬	¦  «         |                     dt          dd¬	¦  «         |                     d t
          d!d"¬	¦  «         |                     d#d$d%¬&¦  «         |                     d'd$d(¬&¦  «         |                     d)d$d*¬&¦  «         |                     d+t          d,d-¬	¦  «         |                     d.d$d/t          › �¬&¦  «         | 	                    ¦   «         S )0Nr   up   ç”µè¡¨ã€Œä¸Šxæ¬¡æ•´ç‚¹å†»ç»“æ•°æ�®ã€�æŠ„è¯»ï¼šç”µè¡¨å›žé”™è¯¯å¸§å�³æ”¾å¼ƒè¯¥è¡¨å�Žç»­å†»ç»“é¡¹ï¼Œåˆ‡ä¸‹ä¸€å�ªè¡¨)r   Úformatter_classz--portu#   ä¸²å�£å��ï¼Œå¦‚ COM4 / /dev/ttyUSB0)ÚdefaultÚhelpz--bauduR   æ³¢ç‰¹çŽ‡ï¼ˆæœ¬åœ°é€šä¿¡æŽ¥å�£é€šå¸¸ 115200ï¼›çŽ°åœºè‹¥ä¸º 9600 è¯·æ˜¾å¼�æŒ‡å®šï¼‰)rC  rŠ  r‹  z--meterrF  uP   ç”µè¡¨åœ°å�€(12ä½�HEXï¼Œå¦‚ 260498001817)ï¼Œå�¯é‡�å¤�ä¼ å…¥å¤šå�ªè¡¨æŒ‰é¡ºåº�æŠ„)ÚactionrŠ  r‹  z--fromÚx_fromr|   u   ä»Ž ä¸Šxæ¬¡ å¼€å§‹)ÚdestrC  rŠ  r‹  z--toÚx_tor¤   u   åˆ° ä¸Šyæ¬¡ ç»“æ�Ÿz	--timeoutg      @uA   å�•æ�¡ç­‰å¾…åº”ç­”è¶…æ—¶(ç§’)ï¼ˆå®žæµ‹åº”ç­” 0.13~0.35s åˆ°è¾¾ï¼‰z	--retriesrô   u   è¶…æ—¶/å��å¸§é‡�è¯•æ¬¡æ•°z--replay-gracerÍ  uP   è¢«æœ¬è¡¨å›žæ”¾å¸§æŒ¤å� çª—å�£å�Žï¼Œé�™é»˜è¯¥ç§’æ•°å�³æ��å‰�é‡�å�‘ï¼ˆ0=å…³é—­ï¼‰z--abort-streakr�   uE   è¿žç»­ N æ¬¡æ— åº”ç­”/å��å¸§æ‰�æ”¾å¼ƒæœ¬è¡¨å‰©ä½™ï¼ˆ0=æ°¸ä¸�æ”¾å¼ƒï¼‰z--keep-on-timeoutÚ
store_trueuJ   å…¼å®¹æ—§å�‚æ•°ï¼šç­‰ä»·äºŽ --abort-streak 0ï¼ˆæ— åº”ç­”ä¸�æ”¾å¼ƒæœ¬è¡¨ï¼‰)rŒ  r‹  z--dump-consoleuK   æŠŠé€�å­—æ®µæŠ¥æ–‡è§£æž�ä¹Ÿæ‰“å�°åˆ°æŽ§åˆ¶å�°ï¼ˆé»˜è®¤å�ªå†™æ—¥å¿—æ–‡ä»¶ï¼‰z--no-acku^   ä¸�å¯¹æ¨¡å�—çš„ä¸ŠæŠ¥æŠ¥æ–‡å›žç¡®è®¤å¸§ï¼ˆé»˜è®¤æ¯�æ�¡ä¸ŠæŠ¥éƒ½å›žï¼ŒSEQ ä¸Žä¸ŠæŠ¥å¸§ä¸€è‡´ï¼‰z--ack-dedupr½  uK   å�Œä¸€ (æº�åœ°å�€,SEQ) åŽ»é‡�çª—å�£ç§’æ•°ï¼›0 = æ¯�æ¬¡ä¸ŠæŠ¥éƒ½å›žç¡®è®¤å¸§z--probeu%   æŠ„è¯»å‰�å…ˆå�‘ä¸€æ�¡å›ºå®šæŽ¢æµ‹å¸§ )
ÚargparseÚArgumentParserÚArgumentDefaultsHelpFormatterÚadd_argumentÚDEFAULT_PORTr8   ÚDEFAULT_BAUDRATErÓ  ÚPROBE_FRAMEÚ
parse_args)r‘  rD  s     r!   r˜  r˜  ]
  s<  € Ø€O€O€OØ×Òð GØ Ô>ð 	 ñ 	@ô 	@€Að ‡N‚N�8¥\Ð8]€NÑ^Ô^Ð^Ø‡N‚N�8¥#Õ/?Ølð ñ nô nð nà‡N‚N�9 X°tØjð ñ lô lð là‡N‚N�8 (µ¸aÐFZ€NÑ[Ô[Ð[Ø‡N‚N�6 ­S¸#ÐDX€NÑYÔYÐYØ‡N‚N�;¥U°CØ[ð ñ ]ô ]ð ]à‡N‚N�;¥S°!Ð:U€NÑVÔVÐVØ‡N‚NÐ#­%¸Øjð ñ lô lð là‡N‚NÐ#­#°qØ_ð ñ aô að aà‡N‚NÐ&¨|Ødð ñ fô fð fà‡N‚NÐ#¨LØeð ñ gô gð gà‡N‚N�: lØxð ñ zô zð zà‡N‚N�=¥u°cØeð ñ gô gð gà‡N‚N�9 \ØMÅÐMÐMð ñ Oô Oð Oà�<Š<‰>Œ>Ðr#   c                 óœ  — t          ¦   «         } d| j        cxk    r| j        cxk    rdk    s#n t          d| j        › d| j        › �¦  «         dS | j        rK	 d„ t          | j        d¦  «        D ¦   «         }n># t          $ r}t          d|› �¦  «         Y d }~dS d }~ww xY wt          t          ¦  «        }t          ddd| j
        rd	n| j        ¬
¦  «        }t          | j        | j        t          | j        dz   d¬¦  «        }	 |                     ¦   «          n9# t$          $ r,}t          d|› �¦  «         t          d¦  «         Y d }~dS d }~ww xY wt'          t(          d         t(          d         t(          d         d| j        dd¬¦  «        }t-          t(          d         ¦  «        }t/          t0          ||||| j        | j        dd| j        | j        | j        | j         | j        d¬¦  «        }	 | j        r2|                     t>                                tB          ¦  «        ¦  «         | "                    |tG          | j        | j        ¦  «        ¦  «         n# tH          $ r t          d¦  «         Y nw xY w| %                    ¦   «          | %                    ¦   «          n-# | %                    ¦   «          | %                    ¦   «          w xY wd	S )Nr|   r¤   uG   [é”™è¯¯] --from/--to éœ€æ»¡è¶³ 1 <= from <= to <= 255ï¼Œå®žé™…: --from z --to rô   c                óT   — g | ]%\  }}t          t          |¦  «        |› d �¦  «        ‘Œ&S )u   # è¡¨)r   r‡  )r~   r¹  r{  s      r!   r%  zmain.<locals>.<listcomp>‡
  sE   € ð <ð <ð <Ù˜!˜Qõ #Õ#7¸Ñ#:Ô#:¸q¸K¸K¸KÑHÔHð <ð <ð <r#   u	   [é”™è¯¯] Tr   )rŠ   r‹   rŒ   rŽ   rÍ  )rÎ  rÏ  rÑ  r[  rÕ  u   [é”™è¯¯] ä¸²å�£æ‰“å¼€å¤±è´¥ï¼šuc          è¯·æ£€æŸ¥ä¸²å�£å�· / æ³¢ç‰¹çŽ‡ï¼›è‹¥æ��ç¤ºæœªå®‰è£… pyserialï¼Œæ‰§è¡Œï¼špip install pyserialrq  rr  rs  F)rq  rr  rs  rt  ru  rv  rÕ  r  r+  )rD  r¾  r¶  r¡  r.  r[  r0  r
  r1  r2  r3  r4  r5  r6  rÕ  u^   
[ä¸­æ–­] å·²æ‰‹åŠ¨ç»ˆæ­¢ï¼šæœªæŠ„é¡¹æŒ‰ SKIPPED è®°è´¦ï¼Œç»“æžœå·²å†™å…¥æ—¥å¿—ä¸Žæ•°æ�®è¡¨ã€‚)&r˜  r�  r�  r#  r6   r`  r   r‡   ÚDEFAULT_METERSr‰   Úkeep_on_timeoutÚabort_streakrÊ  rÎ  ÚbaudÚDEFAULT_PARITYr[  rç  rÈ  r·  Ú	LOG_FILESru  r˜  r(  ÚCCO_ADDRrX   r4  Úno_ackr6  Úprober÷  r   r   r—  rn  r&  rb  ré  )Úargsr=  rÄ  r.  r¾  r¶  Ú
csv_writerÚsessions           r!   Úmainr§  }
  sF  € Ý‰<Œ<€Dð �”Ð0Ð0Ò0Ð0 ¤	Ð0Ð0Ò0Ð0¨SÒ0Ð0Ð0Ð0Ýð ?Ø $¤ð?ð ?Ø37´9ð?ð ?ñ 	@ô 	@ð 	@àˆqØ„zð &ð	ð<ð <Ý"+¨D¬J¸Ñ":Ô":ð<ñ <ô <ˆFˆFøåð 	ð 	ð 	Ý�/˜a�/�/Ñ"Ô"Ð"Ø�1�1�1�1�1øøøøð	øøøõ •nÑ%Ô%ˆõ ØØØØ"Ô2ÐI˜˜¸Ô8Ið	ñ ô €Fõ  ¤	Ø$(¤IÝ"0Ø#'¤<°#Ñ#5Ø#'ð	)ñ )ô )€Ið
Ø�ŠÑÔÐÐøÝð ð ð ÝÐ2¨qÐ2Ð2Ñ3Ô3Ð3ÝÐsÑtÔtÐtØˆqˆqˆqˆqˆqøøøøðøøøõ �I jÔ1Ý )¨.Ô 9Ý#,Ð->Ô#?Ø#Ø $Ô 1Ø$Øð!ñ !ô !€Dõ �9 ZÔ0Ñ1Ô1€JåÝØØØØØ”Ø”LØØ"Ø”[Ø”9ØÔ&Øœ�OØ”.Øðñ ô €Gð$ØŒ:ð 	7Ø�NŠN�5Ÿ=š=­Ñ5Ô5Ñ6Ô6Ð6Ø�Š�FÕ-¨d¬k¸4¼9ÑEÔEÑFÔFÐFÐFøÝð qð qð qÝÐoÑpÔpÐpÐpÐpðqøøøð 	�Š‰ŒˆØ�ŠÑÔÐÐøð 	�Š‰ŒˆØ�ŠÑÔÐÐøøøØˆ1s[   ÁA8 Á8
BÂBÂBÄD Ä
EÄ"!E	Å	EÇ/A'I ÉJ ÉI3É0J É2I3É3J Ê*K	Ú__main__)r¢   r   r   r   )r«   r8   r   r8   )rà   r   rá   r8   r   r   rÃ   )rç   r   rœ   r/   r   r   )r9   r8   r   r   )r*  )r¢   r   r+  r   r   r   rF   )Tr8  )r,  r   rœ   r/   r9  r   r   r:  )r-   r   rñ   r   rR  r   r   r:  )r8  T)r,  r   r9  r   r¿  r/   r   r:  r?  )rd  r   r   r   )r]   r   r   r   )r   r   r   r   )r|   r¤   )r!  r8   r  r8   r   r"  rE   )br(   Ú
__future__r   r¡  rŸ  Úsysrý  rÙ  Údataclassesr   r   r   Úenumr   Útypingr   r	   r
   r   r   r   r   r   rá  r   r×  ÚImportErrorrÂ  rÿ  r   r,   r5   r   rI   rR   rs   r‰   r—   r   rÈ   rË   rÜ   rß   ræ   rê   rí   r  r$  rA  r…  rj  r‚  r‹  rŸ  r¡  r¬  rµ  rÈ  rÊ  rG  rH  r/  r5  r7  rQ  rI  rÁ  rc  rj  rn  r·  r˜  r©  r°  rµ  r¼  rä  rÈ  rÏ  r×  rÛ  r	  r  r&  r(  r•  r–  rŸ  r¡  r›  r0  r   r—  r‡  r˜  r§  r%   Úexitr*   r#   r!   ú<module>r°     sÂ
  ððEð EðN #Ð "Ð "Ð "Ð "Ð "à 
€
€
€
Ø 	€	€	€	Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ Oð Ø€M€M€MØ&Ð&Ð&Ð&Ð&Ð&ØÐÐøØð  ð  ð  ØÐØ€O€O€Oð øøøð €ð ð.ð .ð .ð .ð .ñ .ô .ñ „ð.ð ð
,ð 
,ð 
,ð 
,ð 
,ñ 
,ô 
,ñ „ð
,ð ðað að að að añ aô añ „ðað0ð ð ð ð ��dñ ô ð ð ð-Pð -Pð -Pð -Pð -Pñ -Pô -Pñ „ð-Pð` ðNð Nð Nð Nð Nñ Nô Nñ „ðNð( ð"#ð "#ð "#ð "#ð "#ñ "#ô "#ñ „ð"#ðR-2ð -2ð -2ð -2ð -2ñ -2ô -2ð -2ðrlð lð lð lð l�ñ lô lð lðð ð ð ð ��Tñ ô ð ð	ð 	ð 	ð 	ðð ð ð ð;ð ;ð ;ð ;ð5ð 5ð 5ð 5ð 5ð €�$ÐÑÔð(9ð (9ð (9ð (9ð (9ñ (9ô (9ñ Ôð(9ðV €�$ÐÑÔð4Lð 4Lð 4Lð 4Lð 4Lñ 4Lô 4Lñ Ôð4LðntIð tIð tIð tIð tIñ tIô tIð tIðvL,ð L,ð L,ð L,ð L,ñ L,ô L,ð L,ðt $¨8Ð4Ð4Ð ð €�$ÐÑÔð7ð 7ð 7ð 7ð 7ñ 7ô 7ñ Ôð7ðt €�$ÐÑÔð(ð (ð (ð (ð (ñ (ô (ñ Ôð(ð8<
ð <
ð <
ð <
ð <
ñ <
ô <
ð <
ð~9ð 9ð 9ð 9ð.ð ð ð ð ��dñ ô ð ð €�$ÐÑÔðIð Ið Ið Ið Iñ Iô Iñ ÔðIð:KZð KZð KZð KZð KZñ KZô KZð KZðd	ð 	ð 	ð 	ð 	�iñ 	ô 	ð 	ð
uð uð uð uð uñ uô uð uðx ˆ[‰]Œ]€
Ø"�{¨%Ð0Ñ0Ô0Ð ð.ð .ð .ð .ð .ð
@ð @ð @ð @ð
7ð 7ð 7ð 7ð
Að Að Að Að AðHð ð ð ð:Hð Hð Hð Hð HðVð ð ð ðð ð ð ð
ð 
ð 
ð 
ð* ðW"ð W"ð W"ð W"ð W"ñ W"ô W"ñ „ðW"ðt!ð !ð !ð !ð !ñ !ô !ð !ðH ðð ð ð ð ñ ô ñ „ðð €�$ÐÑÔðð ð ð ð ñ ô ñ Ôðð ð#*ð #*ð #*ð #*ð #*ñ #*ô #*ñ „ð#*ðL&Rð &Rð &Rð &Rð &Rñ &Rô &Rð &RðZ ��S�Œ/€ð2ð 2ð 2ð 2ð
!ð !ð !ð !ð !�ñ !ô !ð !ð$ €�$ÐÑÔð ð  ð  ð  ð  ñ  ô  ñ Ôð ðP*ð P*ð P*ð P*ð P*ñ P*ô P*ð P*ðn ð ð  ð  ð  ð  ñ  ô  ñ „ð ðJ#ð J#ð J#ð J#ð J#ñ J#ô J#ð J#ðZ,ð ,ð ,ð ,ð ,ðsð sð sð sð sñ sô sð sðr €ØÐ Ø€Ø!€à€L� Ñ*Ô*ð€ð ˆDØ'Ø&Ø)Ø'ð	ñ ô €	ð ;€ðð ð ð ðð ð ð@Kð Kð Kð Kð\ ˆzÒÐØ€C„HˆTˆT‰VŒVÑÔÐÐÐð Ðs   ÁA Á	AÁA